BulletTypes.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import { Node, Vec3 } from 'cc';
  2. // 统一的武器与子弹配置类型,便于跨项目复用
  3. export interface WeaponStats {
  4. damage: number;
  5. fireRate: number; // 每秒发射次数或类似概念
  6. range: number; // 最大射程(像素)
  7. bulletSpeed: number; // 逻辑速度(像素/秒)
  8. }
  9. export interface VisualBulletConfig {
  10. bulletImages?: string; // 贴图资源路径
  11. hitEffect?: string | boolean; // 命中特效资源路径或开关
  12. trailEffect?: boolean | string; // 拖尾效果开关或资源路径
  13. explosionEffect?: string; // 爆炸特效资源路径
  14. burnEffect?: string; // 地面燃烧特效资源路径
  15. }
  16. export type BulletCountType = 'single' | 'spread' | 'burst';
  17. export interface BulletCountConfig {
  18. type: BulletCountType;
  19. amount: number; // 单发数量或每次 burst 的数量
  20. spreadAngle?: number; // 扇形扩散角度(度)
  21. burstCount?: number; // 连发次数
  22. burstDelay?: number; // 连发间隔(秒)
  23. }
  24. export type BulletTrajectoryType = 'straight' | 'arc' | 'guided';
  25. export interface BulletTrajectoryConfig {
  26. type: BulletTrajectoryType;
  27. speed: number; // 初始速度(像素/秒),若与 stats.bulletSpeed 混用,以调用方为准
  28. arcHeight?: number; // 弧线高度(可选,具体实现可按需使用)
  29. homingStrength?: number; // 追踪强度(0~1 建议范围)
  30. homingDelay?: number; // 追踪延迟(秒)
  31. rotateSpeed?: number; // 渐近旋转速度(0~1,越大转向越快)
  32. }
  33. export type HitEffectType = 'normal_damage' | 'pierce_damage' | 'ricochet_damage' | 'explosion' | 'ground_burn';
  34. export interface HitEffectConfig {
  35. type: HitEffectType;
  36. priority: number; // 效果叠加优先级(数值越小越先应用)
  37. damage?: number; // 基础伤害
  38. pierceCount?: number; // 穿透次数
  39. ricochetCount?: number; // 弹射次数
  40. ricochetAngle?: number; // 弹射角度(度)
  41. radius?: number; // 爆炸半径
  42. delay?: number; // 延迟(秒)
  43. duration?: number; // 地面燃烧持续时间(秒)
  44. tickInterval?: number; // 地面燃烧伤害间隔(秒)
  45. }
  46. export type LifecycleType = 'hit_destroy' | 'range_limit' | 'ricochet_counter' | 'ground_impact' | 'return_trip';
  47. export interface BulletLifecycleConfig {
  48. type: LifecycleType;
  49. maxLifetime?: number; // 最大存活时间(秒)
  50. penetration?: number; // 最大穿透计数
  51. ricochetCount?: number; // 最大弹射计数
  52. returnToOrigin?: boolean; // 是否回到发射源
  53. returnDelay?: number; // 返回延迟(秒)
  54. maxRange?: number; // 最大射程(像素)
  55. }
  56. export interface BulletConfig {
  57. count: BulletCountConfig;
  58. trajectory: BulletTrajectoryConfig;
  59. hitEffects: HitEffectConfig[];
  60. lifecycle: BulletLifecycleConfig;
  61. visual?: VisualBulletConfig;
  62. shouldRotate?: boolean; // 是否启用持续自旋转或外观朝向
  63. }
  64. export interface UpgradeConfig { maxLevel: number; levels: Record<string, { cost?: number; damage?: number }>; }
  65. export interface InGameCostConfig { baseCost: number; shapeCosts: Record<string, number>; }
  66. export interface WeaponConfig {
  67. id: string;
  68. name: string;
  69. type: string;
  70. weight?: number;
  71. unlockLevel?: number;
  72. rarityDamageMultipliers?: number[];
  73. stats: WeaponStats;
  74. bulletConfig: BulletConfig;
  75. visualConfig?: Record<string, any>;
  76. upgradeConfig?: UpgradeConfig;
  77. inGameCostConfig?: InGameCostConfig;
  78. }
  79. export interface BulletInitData {
  80. weaponId: string;
  81. firePosition: Vec3;
  82. direction?: Vec3;
  83. autoTarget?: boolean;
  84. weaponConfig?: WeaponConfig;
  85. sourceBlock?: Node | null; // 可选:用于回旋镖返回
  86. }
  87. export interface SpawnInfo {
  88. position: Vec3; // 发射位置(局部或世界,由调用者约定)
  89. direction: Vec3; // 归一化方向
  90. delayMs: number; // 延迟(毫秒)
  91. }
  92. export interface HitResult {
  93. didHit: boolean;
  94. damageApplied?: number;
  95. ricochet?: boolean;
  96. ricochetAngle?: number;
  97. pierced?: boolean;
  98. remainingPierce?: number;
  99. explosion?: boolean;
  100. explosionRadius?: number;
  101. spawnBurn?: boolean;
  102. burn?: { damagePerTick: number; duration: number; tickInterval: number } | null;
  103. }