jedi-outcast/code/game/wp_saber.h

281 lines
5.2 KiB
C

#ifndef __WP_SABER_H
#define __WP_SABER_H
#define ARMOR_EFFECT_TIME 500
#define JSF_AMBUSH 16 //ambusher Jedi
//saberEventFlags
#define SEF_HITENEMY 0x1 //Hit the enemy
#define SEF_HITOBJECT 0x2 //Hit some other object
#define SEF_HITWALL 0x4 //Hit a wall
#define SEF_PARRIED 0x8 //Parried a saber swipe
#define SEF_DEFLECTED 0x10 //Deflected a missile or saberInFlight
#define SEF_BLOCKED 0x20 //Was blocked by a parry
#define SEF_EVENTS (SEF_HITENEMY|SEF_HITOBJECT|SEF_HITWALL|SEF_PARRIED|SEF_DEFLECTED|SEF_BLOCKED)
#define SEF_LOCKED 0x40 //Sabers locked with someone else
#define SEF_INWATER 0x80 //Saber is in water
#define SEF_LOCK_WON 0x100 //Won a saberLock
//saberEntityState
#define SES_LEAVING 1
#define SES_HOVERING 2
#define SES_RETURNING 3
#define SABER_EXTRAPOLATE_DIST 16.0f
#define SABER_MAX_DIST 400.0f
#define SABER_MAX_DIST_SQUARED (SABER_MAX_DIST*SABER_MAX_DIST)
#define FORCE_POWER_MAX 100
#define SABER_REFLECT_MISSILE_CONE 0.2f
#define SABER_LOCK_TIME 10000
#define SABER_LOCK_DELAYED_TIME 9500
typedef enum
{
LOCK_VICTORY = 0,//one side won
LOCK_STALEMATE,//neither side won
LOCK_DRAW//both people fall back
} saberLockResult_t;
#define MAX_FORCE_HEAL 25
#define FORCE_HEAL_INTERVAL 200//FIXME: maybe level 1 is slower or level 2 is faster?
#define FORCE_GRIP_DIST 512.0f//FIXME: vary by power level?
#define FORCE_GRIP_DIST_SQUARED (FORCE_GRIP_DIST*FORCE_GRIP_DIST)
extern float forceJumpStrength[];
extern float forceJumpHeight[];
extern float forcePushPullRadius[];
extern void ForceSpeed( gentity_t *self, int duration = 0 );
extern float forceSpeedValue[];
extern float forceSpeedRangeMod[];
extern float forceSpeedFOVMod[];
#define FORCE_SPEED_DURATION 10000.0f
typedef enum
{
FORCE_LEVEL_0,
FORCE_LEVEL_1,
FORCE_LEVEL_2,
FORCE_LEVEL_3,
NUM_FORCE_POWER_LEVELS
};
#define FORCE_LEVEL_4 (FORCE_LEVEL_3+1)
#define FORCE_LEVEL_5 (FORCE_LEVEL_4+1)
typedef enum
{
FJ_FORWARD,
FJ_BACKWARD,
FJ_RIGHT,
FJ_LEFT,
FJ_UP
};
#define FORCE_JUMP_CHARGE_TIME 1000.0f //Force jump reaches maximum power in one second
extern void WP_InitForcePowers( gentity_t *ent );
extern int WP_GetVelocityForForceJump( gentity_t *self, vec3_t jumpVel, usercmd_t *ucmd );
typedef enum
{
EVASION_NONE = 0,
EVASION_PARRY,
EVASION_DUCK_PARRY,
EVASION_JUMP_PARRY,
EVASION_DODGE,
EVASION_JUMP,
EVASION_DUCK,
EVASION_FJUMP,
EVASION_CARTWHEEL,
EVASION_OTHER,
NUM_EVASION_TYPES
} evasionType_t;
// Okay, here lies the much-dreaded Pat-created FSM movement chart... Heretic II strikes again!
// Why am I inflicting this on you? Well, it's better than hardcoded states.
// Ideally this will be replaced with an external file or more sophisticated move-picker
// once the game gets out of prototype stage.
typedef enum {
// Invalid, or saber not armed
LS_NONE = 0,
// General movements with saber
LS_READY,
LS_DRAW,
LS_PUTAWAY,
// Attacks
LS_A_TL2BR,//4
LS_A_L2R,
LS_A_BL2TR,
LS_A_BR2TL,
LS_A_R2L,
LS_A_TR2BL,
LS_A_T2B,
LS_A_BACKSTAB,
LS_A_BACK,
LS_A_BACK_CR,
LS_A_LUNGE,
LS_A_JUMP_T__B_,
LS_A_FLIP_STAB,
LS_A_FLIP_SLASH,
//starts
LS_S_TL2BR,//26
LS_S_L2R,
LS_S_BL2TR,//# Start of attack chaining to SLASH LR2UL
LS_S_BR2TL,//# Start of attack chaining to SLASH LR2UL
LS_S_R2L,
LS_S_TR2BL,
LS_S_T2B,
//returns
LS_R_TL2BR,//33
LS_R_L2R,
LS_R_BL2TR,
LS_R_BR2TL,
LS_R_R2L,
LS_R_TR2BL,
LS_R_T2B,
//transitions
LS_T1_BR__R,//40
LS_T1_BR_TR,
LS_T1_BR_T_,
LS_T1_BR_TL,
LS_T1_BR__L,
LS_T1_BR_BL,
LS_T1__R_BR,//46
LS_T1__R_TR,
LS_T1__R_T_,
LS_T1__R_TL,
LS_T1__R__L,
LS_T1__R_BL,
LS_T1_TR_BR,//52
LS_T1_TR__R,
LS_T1_TR_T_,
LS_T1_TR_TL,
LS_T1_TR__L,
LS_T1_TR_BL,
LS_T1_T__BR,//58
LS_T1_T___R,
LS_T1_T__TR,
LS_T1_T__TL,
LS_T1_T___L,
LS_T1_T__BL,
LS_T1_TL_BR,//64
LS_T1_TL__R,
LS_T1_TL_TR,
LS_T1_TL_T_,
LS_T1_TL__L,
LS_T1_TL_BL,
LS_T1__L_BR,//70
LS_T1__L__R,
LS_T1__L_TR,
LS_T1__L_T_,
LS_T1__L_TL,
LS_T1__L_BL,
LS_T1_BL_BR,//76
LS_T1_BL__R,
LS_T1_BL_TR,
LS_T1_BL_T_,
LS_T1_BL_TL,
LS_T1_BL__L,
//Bounces
LS_B1_BR,
LS_B1__R,
LS_B1_TR,
LS_B1_T_,
LS_B1_TL,
LS_B1__L,
LS_B1_BL,
//Deflected attacks
LS_D1_BR,
LS_D1__R,
LS_D1_TR,
LS_D1_T_,
LS_D1_TL,
LS_D1__L,
LS_D1_BL,
LS_D1_B_,
//Reflected attacks
LS_V1_BR,
LS_V1__R,
LS_V1_TR,
LS_V1_T_,
LS_V1_TL,
LS_V1__L,
LS_V1_BL,
LS_V1_B_,
// Broken parries
LS_H1_T_,//
LS_H1_TR,
LS_H1_TL,
LS_H1_BR,
LS_H1_B_,
LS_H1_BL,
// Knockaways
LS_K1_T_,//
LS_K1_TR,
LS_K1_TL,
LS_K1_BR,
LS_K1_BL,
// Parries
LS_PARRY_UP,//
LS_PARRY_UR,
LS_PARRY_UL,
LS_PARRY_LR,
LS_PARRY_LL,
// Projectile Reflections
LS_REFLECT_UP,//
LS_REFLECT_UR,
LS_REFLECT_UL,
LS_REFLECT_LR,
LS_REFLECT_LL,
LS_MOVE_MAX//
} saberMoveName_t;
typedef enum {
Q_BR,
Q_R,
Q_TR,
Q_T,
Q_TL,
Q_L,
Q_BL,
Q_B,
Q_NUM_QUADS
} saberQuadrant_t;
typedef struct
{
char *name;
int animToUse;
int startQuad;
int endQuad;
unsigned animSetFlags;
int blendTime;
int blocking;
saberMoveName_t chain_idle; // What move to call if the attack button is not pressed at the end of this anim
saberMoveName_t chain_attack; // What move to call if the attack button (and nothing else) is pressed
qboolean trailLength;
} saberMoveData_t;
extern saberMoveData_t saberMoveData[LS_MOVE_MAX];
#endif // __WP_SABER_H