BulletTypes.ts 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. gravity?: number; // 重力加速度(像素/秒²,向下为正)
  29. arcHeight?: number; // 弧线高度(可选,具体实现可按需使用)
  30. homingStrength?: number; // 追踪强度(0~1 建议范围)
  31. homingDelay?: number; // 追踪延迟(秒)
  32. rotateSpeed?: number; // 旋转速度(用于回旋镖等)
  33. }
  34. export type HitEffectType = 'normal_damage' | 'pierce_damage' | 'ricochet_damage' | 'explosion' | 'ground_burn';
  35. export interface HitEffectConfig {
  36. type: HitEffectType;
  37. priority: number; // 效果叠加优先级(数值越小越先应用)
  38. damage?: number; // 基础伤害
  39. pierceCount?: number; // 穿透次数
  40. ricochetCount?: number; // 弹射次数
  41. ricochetAngle?: number; // 弹射角度(度)
  42. radius?: number; // 爆炸半径
  43. delay?: number; // 延迟(秒)
  44. duration?: number; // 地面燃烧持续时间(秒)
  45. tickInterval?: number; // 地面燃烧伤害间隔(秒)
  46. }
  47. export type LifecycleType = 'hit_destroy' | 'range_limit' | 'ricochet_counter' | 'ground_impact' | 'return_trip';
  48. export interface BulletLifecycleConfig {
  49. type: LifecycleType;
  50. maxLifetime?: number; // 最大存活时间(秒)
  51. penetration?: number; // 最大穿透计数
  52. ricochetCount?: number; // 最大弹射计数
  53. returnToOrigin?: boolean; // 是否回到发射源
  54. returnDelay?: number; // 返回延迟(秒)
  55. maxRange?: number; // 最大射程(像素)
  56. }
  57. export interface BulletConfig {
  58. count: BulletCountConfig;
  59. trajectory: BulletTrajectoryConfig;
  60. hitEffects: HitEffectConfig[];
  61. lifecycle: BulletLifecycleConfig;
  62. visual?: VisualBulletConfig;
  63. shouldRotate?: boolean; // 是否启用持续自旋转或外观朝向
  64. }
  65. export interface UpgradeConfig { maxLevel: number; levels: Record<string, { cost?: number; damage?: number }>; }
  66. export interface InGameCostConfig { baseCost: number; shapeCosts: Record<string, number>; }
  67. export interface WeaponConfig {
  68. id: string;
  69. name: string;
  70. type: string;
  71. weight?: number;
  72. unlockLevel?: number;
  73. rarityDamageMultipliers?: number[];
  74. stats: WeaponStats;
  75. bulletConfig: BulletConfig;
  76. visualConfig?: Record<string, any>;
  77. upgradeConfig?: UpgradeConfig;
  78. inGameCostConfig?: InGameCostConfig;
  79. }
  80. export interface BulletInitData {
  81. weaponId: string;
  82. firePosition: Vec3;
  83. direction?: Vec3;
  84. autoTarget?: boolean;
  85. weaponConfig?: WeaponConfig;
  86. sourceBlock?: Node | null; // 可选:用于回旋镖返回
  87. }
  88. export interface SpawnInfo {
  89. position: Vec3; // 发射位置(局部或世界,由调用者约定)
  90. direction: Vec3; // 归一化方向
  91. delayMs: number; // 延迟(毫秒)
  92. }
  93. export interface HitResult {
  94. didHit: boolean;
  95. damageApplied?: number;
  96. ricochet?: boolean;
  97. ricochetAngle?: number;
  98. pierced?: boolean;
  99. remainingPierce?: number;
  100. explosion?: boolean;
  101. explosionRadius?: number;
  102. spawnBurn?: boolean;
  103. burn?: { damagePerTick: number; duration: number; tickInterval: number } | null;
  104. }