wp_saber.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. #ifndef __WP_SABER_H
  2. #define __WP_SABER_H
  3. #define ARMOR_EFFECT_TIME 500
  4. #define JSF_AMBUSH 16 //ambusher Jedi
  5. //saberEventFlags
  6. #define SEF_HITENEMY 0x1 //Hit the enemy
  7. #define SEF_HITOBJECT 0x2 //Hit some other object
  8. #define SEF_HITWALL 0x4 //Hit a wall
  9. #define SEF_PARRIED 0x8 //Parried a saber swipe
  10. #define SEF_DEFLECTED 0x10 //Deflected a missile or saberInFlight
  11. #define SEF_BLOCKED 0x20 //Was blocked by a parry
  12. #define SEF_EVENTS (SEF_HITENEMY|SEF_HITOBJECT|SEF_HITWALL|SEF_PARRIED|SEF_DEFLECTED|SEF_BLOCKED)
  13. #define SEF_LOCKED 0x40 //Sabers locked with someone else
  14. #define SEF_INWATER 0x80 //Saber is in water
  15. #define SEF_LOCK_WON 0x100 //Won a saberLock
  16. //saberEntityState
  17. #define SES_LEAVING 1
  18. #define SES_HOVERING 2
  19. #define SES_RETURNING 3
  20. #define SABER_EXTRAPOLATE_DIST 16.0f
  21. #define SABER_MAX_DIST 400.0f
  22. #define SABER_MAX_DIST_SQUARED (SABER_MAX_DIST*SABER_MAX_DIST)
  23. #define FORCE_POWER_MAX 100
  24. #define SABER_REFLECT_MISSILE_CONE 0.2f
  25. #define SABER_RADIUS_STANDARD 3.0f
  26. #define SABER_LOCK_TIME 10000
  27. #define SABER_LOCK_DELAYED_TIME 9500
  28. typedef enum
  29. {
  30. LOCK_VICTORY = 0,//one side won
  31. LOCK_STALEMATE,//neither side won
  32. LOCK_DRAW//both people fall back
  33. } saberLockResult_t;
  34. typedef enum
  35. {
  36. LOCK_FIRST = 0,
  37. LOCK_TOP = LOCK_FIRST,
  38. LOCK_DIAG_TR,
  39. LOCK_DIAG_TL,
  40. LOCK_DIAG_BR,
  41. LOCK_DIAG_BL,
  42. LOCK_R,
  43. LOCK_L,
  44. LOCK_RANDOM,
  45. LOCK_KYLE_GRAB1,
  46. LOCK_KYLE_GRAB2,
  47. LOCK_KYLE_GRAB3,
  48. LOCK_FORCE_DRAIN
  49. } sabersLockMode_t;
  50. typedef enum
  51. {
  52. SABERLOCK_TOP,
  53. SABERLOCK_SIDE,
  54. SABERLOCK_LOCK,
  55. SABERLOCK_BREAK,
  56. SABERLOCK_SUPERBREAK,
  57. SABERLOCK_WIN,
  58. SABERLOCK_LOSE
  59. };
  60. typedef enum
  61. {
  62. DIR_RIGHT,
  63. DIR_LEFT,
  64. DIR_FRONT,
  65. DIR_BACK
  66. };
  67. #define FORCE_LIGHTSIDE 1
  68. #define FORCE_DARKSIDE 2
  69. #define MAX_FORCE_HEAL_HARD 25
  70. #define MAX_FORCE_HEAL_MEDIUM 50
  71. #define MAX_FORCE_HEAL_EASY 75
  72. #define FORCE_HEAL_INTERVAL 200//FIXME: maybe level 1 is slower or level 2 is faster?
  73. #define FORCE_GRIP_3_MIN_DIST 128.0f
  74. #define FORCE_GRIP_3_MAX_DIST 256.0f
  75. #define FORCE_GRIP_DIST 512.0f//FIXME: vary by power level?
  76. #define FORCE_GRIP_DIST_SQUARED (FORCE_GRIP_DIST*FORCE_GRIP_DIST)
  77. #define FORCE_DRAIN_DIST 64.0f//FIXME: vary by power level?
  78. #define FORCE_DRAIN_DIST_SQUARED (FORCE_DRAIN_DIST*FORCE_DRAIN_DIST)
  79. #define MAX_DRAIN_DISTANCE 512
  80. #define MIN_SABERBLADE_DRAW_LENGTH 0.5f
  81. #define STAFF_KICK_RANGE 16
  82. #define JUMP_OFF_WALL_SPEED 200.0f
  83. #define FORCE_LONG_LEAP_SPEED 475.0f//300
  84. //#define DUAL_SPIN_PROTECT_POWER 50 //power required to do the dual spin attack
  85. //#define SINGLE_SPECIAL_POWER 20 //power required to do the single saber special attacks
  86. #define SABER_ALT_ATTACK_POWER 50//75?
  87. #define SABER_ALT_ATTACK_POWER_LR 10//30?
  88. #define SABER_ALT_ATTACK_POWER_FB 25//30/50?
  89. #define FORCE_LONGJUMP_POWER 20
  90. #define WALL_RUN_UP_BACKFLIP_SPEED -150.0f//was -300.0f
  91. #define MAX_WALL_RUN_Z_NORMAL 0.4f//was 0.0f
  92. #define PLAYER_KNOCKDOWN_HOLD_EXTRA_TIME 4000 //player stays down after a knockdown for 4 whole seconds before automatically doing one of the slow get-ups
  93. #define MAX_WALL_GRAB_SLOPE 0.2f
  94. //"Matrix" effect flags
  95. #define MEF_NO_TIMESCALE 0x000001 //no timescale
  96. #define MEF_NO_VERTBOB 0x000002 //no vert bob
  97. #define MEF_NO_SPIN 0x000004 //no spin
  98. #define MEF_NO_RANGEVAR 0x000008 //no camera range variation
  99. #define MEF_HIT_GROUND_STOP 0x000010 //stop effect when subject hits the ground
  100. #define MEF_REVERSE_SPIN 0x000020 //spin counter-clockwise instead of clockwise
  101. #define MEF_MULTI_SPIN 0x000040 //spin once every second, until the effect stops
  102. #define MEF_LOOK_AT_ENEMY 0x000200
  103. extern float forceJumpStrength[];
  104. extern float forceJumpHeight[];
  105. extern float forceJumpHeightMax[];
  106. extern float forcePushPullRadius[];
  107. extern void ForceSpeed( gentity_t *self, int duration = 0 );
  108. extern float forceSpeedValue[];
  109. extern float forceSpeedRangeMod[];
  110. extern float forceSpeedFOVMod[];
  111. #define FORCE_SPEED_DURATION 10000.0f
  112. #define FORCE_RAGE_DURATION 10000.0f
  113. #define MASK_FORCE_PUSH (MASK_OPAQUE|CONTENTS_SOLID)
  114. typedef enum
  115. {
  116. FORCE_LEVEL_0,
  117. FORCE_LEVEL_1,
  118. FORCE_LEVEL_2,
  119. FORCE_LEVEL_3,
  120. NUM_FORCE_POWER_LEVELS
  121. };
  122. #define FORCE_LEVEL_4 (FORCE_LEVEL_3+1)
  123. #define FORCE_LEVEL_5 (FORCE_LEVEL_4+1)
  124. typedef enum
  125. {
  126. FJ_FORWARD,
  127. FJ_BACKWARD,
  128. FJ_RIGHT,
  129. FJ_LEFT,
  130. FJ_UP
  131. };
  132. #define FORCE_JUMP_CHARGE_TIME 1000.0f //Force jump reaches maximum power in one second
  133. #define FORCE_POWERS_ROSH_FROM_TWINS ((1<<FP_SPEED)|(1<<FP_GRIP)|(1<<FP_RAGE)|(1<<FP_SABERTHROW))
  134. extern void WP_InitForcePowers( gentity_t *ent );
  135. extern int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd );
  136. extern int WP_SaberInitBladeData( gentity_t *ent );
  137. extern void G_CreateG2AttachedWeaponModel( gentity_t *ent, const char *weaponModel, int boltNum, int weaponNum );
  138. extern void WP_SaberAddG2SaberModels( gentity_t *ent, int specificSaberNum = -1 );
  139. extern qboolean WP_SaberParseParms( const char *SaberName, saberInfo_t *saber, qboolean setColors = qtrue );
  140. extern qboolean WP_BreakSaber( gentity_t *ent, const char *surfName, saberType_t saberType = SABER_NONE );
  141. extern void ForceThrow( gentity_t *self, qboolean pull, qboolean fake = qfalse );
  142. extern qboolean G_GetHitLocFromSurfName( gentity_t *ent, const char *surfName, int *hitLoc, vec3_t point, vec3_t dir, vec3_t bladeDir, int mod, saberType_t saberType = SABER_NONE );
  143. extern qboolean G_CheckEnemyPresence( gentity_t *ent, int dir, float radius, float tolerance = 0.75f );
  144. extern void WP_SaberFreeStrings( saberInfo_t &saber );
  145. extern qboolean G_EnoughPowerForSpecialMove( int forcePower, int cost, qboolean kataMove = qfalse );
  146. extern void G_DrainPowerForSpecialMove( gentity_t *self, forcePowers_t fp, int cost, qboolean kataMove = qfalse );
  147. extern int G_CostForSpecialMove( int cost, qboolean kataMove = qfalse );
  148. typedef enum
  149. {
  150. EVASION_NONE = 0,
  151. EVASION_PARRY,
  152. EVASION_DUCK_PARRY,
  153. EVASION_JUMP_PARRY,
  154. EVASION_DODGE,
  155. EVASION_JUMP,
  156. EVASION_DUCK,
  157. EVASION_FJUMP,
  158. EVASION_CARTWHEEL,
  159. EVASION_OTHER,
  160. NUM_EVASION_TYPES
  161. } evasionType_t;
  162. typedef enum
  163. {
  164. SWING_FAST,
  165. SWING_MEDIUM,
  166. SWING_STRONG
  167. } swingType_t;
  168. // Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again!
  169. // Why am I inflicting this on you? Well, it's better than hardcoded states.
  170. // Ideally this will be replaced with an external file or more sophisticated move-picker
  171. // once the game gets out of prototype stage. <- HAHA!
  172. #ifdef LS_NONE
  173. #undef LS_NONE
  174. #endif
  175. typedef enum {
  176. // Invalid, or saber not armed
  177. LS_INVALID = -1,
  178. LS_NONE = 0,
  179. // General movements with saber
  180. LS_READY,
  181. LS_DRAW,
  182. LS_PUTAWAY,
  183. // Attacks
  184. LS_A_TL2BR,//4
  185. LS_A_L2R,
  186. LS_A_BL2TR,
  187. LS_A_BR2TL,
  188. LS_A_R2L,
  189. LS_A_TR2BL,
  190. LS_A_T2B,
  191. LS_A_BACKSTAB,
  192. LS_A_BACK,
  193. LS_A_BACK_CR,
  194. LS_ROLL_STAB,
  195. LS_A_LUNGE,
  196. LS_A_JUMP_T__B_,
  197. LS_A_FLIP_STAB,
  198. LS_A_FLIP_SLASH,
  199. LS_JUMPATTACK_DUAL,
  200. LS_JUMPATTACK_ARIAL_LEFT,
  201. LS_JUMPATTACK_ARIAL_RIGHT,
  202. LS_JUMPATTACK_CART_LEFT,
  203. LS_JUMPATTACK_CART_RIGHT,
  204. LS_JUMPATTACK_STAFF_LEFT,
  205. LS_JUMPATTACK_STAFF_RIGHT,
  206. LS_BUTTERFLY_LEFT,
  207. LS_BUTTERFLY_RIGHT,
  208. LS_A_BACKFLIP_ATK,
  209. LS_SPINATTACK_DUAL,
  210. LS_SPINATTACK,
  211. LS_LEAP_ATTACK,
  212. LS_SWOOP_ATTACK_RIGHT,
  213. LS_SWOOP_ATTACK_LEFT,
  214. LS_TAUNTAUN_ATTACK_RIGHT,
  215. LS_TAUNTAUN_ATTACK_LEFT,
  216. LS_KICK_F,
  217. LS_KICK_B,
  218. LS_KICK_R,
  219. LS_KICK_L,
  220. LS_KICK_S,
  221. LS_KICK_BF,
  222. LS_KICK_RL,
  223. LS_KICK_F_AIR,
  224. LS_KICK_B_AIR,
  225. LS_KICK_R_AIR,
  226. LS_KICK_L_AIR,
  227. LS_STABDOWN,
  228. LS_STABDOWN_STAFF,
  229. LS_STABDOWN_DUAL,
  230. LS_DUAL_SPIN_PROTECT,
  231. LS_STAFF_SOULCAL,
  232. LS_A1_SPECIAL,
  233. LS_A2_SPECIAL,
  234. LS_A3_SPECIAL,
  235. LS_UPSIDE_DOWN_ATTACK,
  236. LS_PULL_ATTACK_STAB,
  237. LS_PULL_ATTACK_SWING,
  238. LS_SPINATTACK_ALORA,
  239. LS_DUAL_FB,
  240. LS_DUAL_LR,
  241. LS_HILT_BASH,
  242. //starts
  243. LS_S_TL2BR,//26
  244. LS_S_L2R,
  245. LS_S_BL2TR,//# Start of attack chaining to SLASH LR2UL
  246. LS_S_BR2TL,//# Start of attack chaining to SLASH LR2UL
  247. LS_S_R2L,
  248. LS_S_TR2BL,
  249. LS_S_T2B,
  250. //returns
  251. LS_R_TL2BR,//33
  252. LS_R_L2R,
  253. LS_R_BL2TR,
  254. LS_R_BR2TL,
  255. LS_R_R2L,
  256. LS_R_TR2BL,
  257. LS_R_T2B,
  258. //transitions
  259. LS_T1_BR__R,//40
  260. LS_T1_BR_TR,
  261. LS_T1_BR_T_,
  262. LS_T1_BR_TL,
  263. LS_T1_BR__L,
  264. LS_T1_BR_BL,
  265. LS_T1__R_BR,//46
  266. LS_T1__R_TR,
  267. LS_T1__R_T_,
  268. LS_T1__R_TL,
  269. LS_T1__R__L,
  270. LS_T1__R_BL,
  271. LS_T1_TR_BR,//52
  272. LS_T1_TR__R,
  273. LS_T1_TR_T_,
  274. LS_T1_TR_TL,
  275. LS_T1_TR__L,
  276. LS_T1_TR_BL,
  277. LS_T1_T__BR,//58
  278. LS_T1_T___R,
  279. LS_T1_T__TR,
  280. LS_T1_T__TL,
  281. LS_T1_T___L,
  282. LS_T1_T__BL,
  283. LS_T1_TL_BR,//64
  284. LS_T1_TL__R,
  285. LS_T1_TL_TR,
  286. LS_T1_TL_T_,
  287. LS_T1_TL__L,
  288. LS_T1_TL_BL,
  289. LS_T1__L_BR,//70
  290. LS_T1__L__R,
  291. LS_T1__L_TR,
  292. LS_T1__L_T_,
  293. LS_T1__L_TL,
  294. LS_T1__L_BL,
  295. LS_T1_BL_BR,//76
  296. LS_T1_BL__R,
  297. LS_T1_BL_TR,
  298. LS_T1_BL_T_,
  299. LS_T1_BL_TL,
  300. LS_T1_BL__L,
  301. //Bounces
  302. LS_B1_BR,
  303. LS_B1__R,
  304. LS_B1_TR,
  305. LS_B1_T_,
  306. LS_B1_TL,
  307. LS_B1__L,
  308. LS_B1_BL,
  309. //Deflected attacks
  310. LS_D1_BR,
  311. LS_D1__R,
  312. LS_D1_TR,
  313. LS_D1_T_,
  314. LS_D1_TL,
  315. LS_D1__L,
  316. LS_D1_BL,
  317. LS_D1_B_,
  318. //Reflected attacks
  319. LS_V1_BR,
  320. LS_V1__R,
  321. LS_V1_TR,
  322. LS_V1_T_,
  323. LS_V1_TL,
  324. LS_V1__L,
  325. LS_V1_BL,
  326. LS_V1_B_,
  327. // Broken parries
  328. LS_H1_T_,//
  329. LS_H1_TR,
  330. LS_H1_TL,
  331. LS_H1_BR,
  332. LS_H1_B_,
  333. LS_H1_BL,
  334. // Knockaways
  335. LS_K1_T_,//
  336. LS_K1_TR,
  337. LS_K1_TL,
  338. LS_K1_BR,
  339. LS_K1_BL,
  340. // Parries
  341. LS_PARRY_UP,//
  342. LS_PARRY_UR,
  343. LS_PARRY_UL,
  344. LS_PARRY_LR,
  345. LS_PARRY_LL,
  346. // Projectile Reflections
  347. LS_REFLECT_UP,//
  348. LS_REFLECT_UR,
  349. LS_REFLECT_UL,
  350. LS_REFLECT_LR,
  351. LS_REFLECT_LL,
  352. LS_MOVE_MAX//
  353. } saberMoveName_t;
  354. void PM_SetSaberMove(saberMoveName_t newMove);
  355. typedef enum {
  356. Q_BR,
  357. Q_R,
  358. Q_TR,
  359. Q_T,
  360. Q_TL,
  361. Q_L,
  362. Q_BL,
  363. Q_B,
  364. Q_NUM_QUADS
  365. } saberQuadrant_t;
  366. typedef struct
  367. {
  368. char *name;
  369. int animToUse;
  370. int startQuad;
  371. int endQuad;
  372. unsigned animSetFlags;
  373. int blendTime;
  374. int blocking;
  375. saberMoveName_t chain_idle; // What move to call if the attack button is not pressed at the end of this anim
  376. saberMoveName_t chain_attack; // What move to call if the attack button (and nothing else) is pressed
  377. qboolean trailLength;
  378. } saberMoveData_t;
  379. extern saberMoveData_t saberMoveData[LS_MOVE_MAX];
  380. #endif // __WP_SABER_H