2013-04-19 02:52:48 +00:00
// Copyright (C) 1999-2000 Id Software, Inc.
//
// bg_public.h -- definitions shared by both the server game and client game modules
// because games can change separately from the main system version, we need a
// second version that must match between game and cgame
# ifndef __BG_PUBLIC_H__
# define __BG_PUBLIC_H__
# include "bg_weapons.h"
# include "anims.h"
# include "bg_vehicles.h"
//these two defs are shared now because we do clientside ent parsing
# define MAX_SPAWN_VARS 64
# define MAX_SPAWN_VARS_CHARS 4096
# define GAME_VERSION "basejka-1"
# define STEPSIZE 18
# define DEFAULT_GRAVITY 800
# define GIB_HEALTH -40
# define ARMOR_PROTECTION 0.50 // Shields only stop 50% of armor-piercing dmg
# define ARMOR_REDUCTION_FACTOR 0.50 // Certain damage doesn't take off armor as efficiently
# define JUMP_VELOCITY 225 //270
# define MAX_ITEMS 256
# define RANK_TIED_FLAG 0x4000
# define ITEM_RADIUS 15 // item sizes are needed for client side pickup detection
# define SCORE_NOT_PRESENT -9999 // for the CS_SCORES[12] when only one player is present
# define VOTE_TIME 30000 // 30 seconds before vote times out
# define DEFAULT_MINS_2 -24
# define DEFAULT_MAXS_2 40
# define CROUCH_MAXS_2 16
# define STANDARD_VIEWHEIGHT_OFFSET -4
# define MINS_Z -24
# define DEFAULT_VIEWHEIGHT (DEFAULT_MAXS_2+STANDARD_VIEWHEIGHT_OFFSET) //26
# define CROUCH_VIEWHEIGHT (CROUCH_MAXS_2+STANDARD_VIEWHEIGHT_OFFSET) //12
# define DEAD_VIEWHEIGHT -16
# define MAX_CLIENT_SCORE_SEND 20
//
// config strings are a general means of communicating variable length strings
// from the server to all connected clients.
//
// CS_SERVERINFO and CS_SYSTEMINFO are defined in q_shared.h
# define CS_MUSIC 2
# define CS_MESSAGE 3 // from the map worldspawn's message field
# define CS_MOTD 4 // g_motd string for server message of the day
# define CS_WARMUP 5 // server time when the match will be restarted
# define CS_SCORES1 6
# define CS_SCORES2 7
# define CS_VOTE_TIME 8
# define CS_VOTE_STRING 9
# define CS_VOTE_YES 10
# define CS_VOTE_NO 11
# define CS_TEAMVOTE_TIME 12
# define CS_TEAMVOTE_STRING 14
# define CS_TEAMVOTE_YES 16
# define CS_TEAMVOTE_NO 18
# define CS_GAME_VERSION 20
# define CS_LEVEL_START_TIME 21 // so the timer only shows the current level
# define CS_INTERMISSION 22 // when 1, fraglimit/timelimit has been hit and intermission will start in a second or two
# define CS_FLAGSTATUS 23 // string indicating flag status in CTF
# define CS_SHADERSTATE 24
# define CS_BOTINFO 25
# define CS_ITEMS 27 // string of 0's and 1's that tell which items are present
# define CS_CLIENT_JEDIMASTER 28 // current jedi master
# define CS_CLIENT_DUELWINNER 29 // current duel round winner - needed for printing at top of scoreboard
# define CS_CLIENT_DUELISTS 30 // client numbers for both current duelists. Needed for a number of client-side things.
# define CS_CLIENT_DUELHEALTHS 31 // nmckenzie: DUEL_HEALTH. Hopefully adding this cs is safe and good?
# define CS_GLOBAL_AMBIENT_SET 32
# define CS_AMBIENT_SET 37
# define CS_SIEGE_STATE (CS_AMBIENT_SET+MAX_AMBIENT_SETS)
# define CS_SIEGE_OBJECTIVES (CS_SIEGE_STATE+1)
# define CS_SIEGE_TIMEOVERRIDE (CS_SIEGE_OBJECTIVES+1)
# define CS_SIEGE_WINTEAM (CS_SIEGE_TIMEOVERRIDE+1)
# define CS_SIEGE_ICONS (CS_SIEGE_WINTEAM+1)
# define CS_MODELS (CS_SIEGE_ICONS+1)
# define CS_SKYBOXORG (CS_MODELS+MAX_MODELS) //rww - skybox info
# define CS_SOUNDS (CS_SKYBOXORG+1)
# define CS_ICONS (CS_SOUNDS+MAX_SOUNDS)
# define CS_PLAYERS (CS_ICONS+MAX_ICONS)
/*
Ghoul2 Insert Start
*/
# define CS_G2BONES (CS_PLAYERS+MAX_CLIENTS)
//rww - used to be CS_CHARSKINS, but I have eliminated the need for that.
/*
Ghoul2 Insert End
*/
# define CS_LOCATIONS (CS_G2BONES+MAX_G2BONES)
# define CS_PARTICLES (CS_LOCATIONS+MAX_LOCATIONS)
# define CS_EFFECTS (CS_PARTICLES+MAX_LOCATIONS)
# define CS_LIGHT_STYLES (CS_EFFECTS + MAX_FX)
//rwwRMG - added:
# define CS_TERRAINS (CS_LIGHT_STYLES + (MAX_LIGHT_STYLES*3))
# define CS_BSP_MODELS (CS_TERRAINS + MAX_TERRAINS)
# define CS_MAX (CS_BSP_MODELS + MAX_SUB_BSP)
# if (CS_MAX) > MAX_CONFIGSTRINGS
# error overflow: (CS_MAX) > MAX_CONFIGSTRINGS
# endif
typedef enum {
G2_MODELPART_HEAD = 10 ,
G2_MODELPART_WAIST ,
G2_MODELPART_LARM ,
G2_MODELPART_RARM ,
G2_MODELPART_RHAND ,
G2_MODELPART_LLEG ,
G2_MODELPART_RLEG
} g2ModelParts_t ;
# define G2_MODEL_PART 50
# define BG_NUM_TOGGLEABLE_SURFACES 31
# define MAX_CUSTOM_SIEGE_SOUNDS 30
# include "../namespace_begin.h"
extern const char * bg_customSiegeSoundNames [ MAX_CUSTOM_SIEGE_SOUNDS ] ;
extern const char * bgToggleableSurfaces [ BG_NUM_TOGGLEABLE_SURFACES ] ;
extern const int bgToggleableSurfaceDebris [ BG_NUM_TOGGLEABLE_SURFACES ] ;
# include "../namespace_end.h"
typedef enum {
HANDEXTEND_NONE = 0 ,
HANDEXTEND_FORCEPUSH ,
HANDEXTEND_FORCEPULL ,
HANDEXTEND_FORCE_HOLD ,
HANDEXTEND_SABERPULL ,
HANDEXTEND_CHOKE , //use handextend priorities to choke someone being gripped
HANDEXTEND_WEAPONREADY ,
HANDEXTEND_DODGE ,
HANDEXTEND_KNOCKDOWN ,
HANDEXTEND_DUELCHALLENGE ,
HANDEXTEND_TAUNT ,
HANDEXTEND_PRETHROW ,
HANDEXTEND_POSTTHROW ,
HANDEXTEND_PRETHROWN ,
HANDEXTEND_POSTTHROWN ,
HANDEXTEND_DRAGGING ,
HANDEXTEND_JEDITAUNT ,
} forceHandAnims_t ;
typedef enum
{
BROKENLIMB_NONE = 0 ,
BROKENLIMB_LARM ,
BROKENLIMB_RARM ,
NUM_BROKENLIMBS
} brokenLimb_t ;
//for supplier class items
# define TOSS_DEBOUNCE_TIME 5000
typedef enum {
GT_FFA , // free for all
GT_HOLOCRON , // holocron ffa
GT_JEDIMASTER , // jedi master
GT_DUEL , // one on one tournament
GT_POWERDUEL ,
GT_SINGLE_PLAYER , // single player ffa
//-- team games go after this --
GT_TEAM , // team deathmatch
GT_SIEGE , // siege
GT_CTF , // capture the flag
GT_CTY ,
GT_MAX_GAME_TYPE
} ;
typedef int gametype_t ;
typedef enum { GENDER_MALE , GENDER_FEMALE , GENDER_NEUTER } gender_t ;
extern vec3_t WP_MuzzlePoint [ WP_NUM_WEAPONS ] ;
# include "../namespace_begin.h"
extern int forcePowerSorted [ NUM_FORCE_POWERS ] ;
# include "../namespace_end.h"
typedef enum
{
SABERLOCK_TOP ,
SABERLOCK_SIDE ,
SABERLOCK_LOCK ,
SABERLOCK_BREAK ,
SABERLOCK_SUPERBREAK ,
SABERLOCK_WIN ,
SABERLOCK_LOSE
} ;
typedef enum
{
DIR_RIGHT ,
DIR_LEFT ,
DIR_FRONT ,
DIR_BACK
} ;
/*
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
PMOVE MODULE
The pmove code takes a player_state_t and a usercmd_t and generates a new player_state_t
and some other output data . Used for local prediction on the client game and true
movement on the server game .
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
# pragma pack(push, 1)
typedef struct animation_s {
unsigned short firstFrame ;
unsigned short numFrames ;
short frameLerp ; // msec between frames
//initialLerp is abs(frameLerp)
signed char loopFrames ; // 0 to numFrames
} animation_t ;
# pragma pack(pop)
# include "../namespace_begin.h"
extern qboolean BGPAFtextLoaded ;
extern animation_t bgHumanoidAnimations [ MAX_TOTALANIMATIONS ] ;
# include "../namespace_end.h"
# define MAX_ANIM_FILES 64
# define MAX_ANIM_EVENTS 300
typedef enum
{
FOOTSTEP_R ,
FOOTSTEP_L ,
FOOTSTEP_HEAVY_R ,
FOOTSTEP_HEAVY_L ,
NUM_FOOTSTEP_TYPES
} footstepType_t ;
extern stringID_table_t animEventTypeTable [ MAX_ANIM_EVENTS + 1 ] ;
extern stringID_table_t footstepTypeTable [ NUM_FOOTSTEP_TYPES + 1 ] ;
//size of Anim eventData array...
# define MAX_RANDOM_ANIM_SOUNDS 4
# define AED_ARRAY_SIZE (MAX_RANDOM_ANIM_SOUNDS+3)
//indices for AEV_SOUND data
# define AED_SOUNDINDEX_START 0
# define AED_SOUNDINDEX_END (MAX_RANDOM_ANIM_SOUNDS-1)
# define AED_SOUND_NUMRANDOMSNDS (MAX_RANDOM_ANIM_SOUNDS)
# define AED_SOUND_PROBABILITY (MAX_RANDOM_ANIM_SOUNDS+1)
//indices for AEV_SOUNDCHAN data
# define AED_SOUNDCHANNEL (MAX_RANDOM_ANIM_SOUNDS+2)
//indices for AEV_FOOTSTEP data
# define AED_FOOTSTEP_TYPE 0
# define AED_FOOTSTEP_PROBABILITY 1
//indices for AEV_EFFECT data
# define AED_EFFECTINDEX 0
# define AED_BOLTINDEX 1
# define AED_EFFECT_PROBABILITY 2
# define AED_MODELINDEX 3
//indices for AEV_FIRE data
# define AED_FIRE_ALT 0
# define AED_FIRE_PROBABILITY 1
//indices for AEV_MOVE data
# define AED_MOVE_FWD 0
# define AED_MOVE_RT 1
# define AED_MOVE_UP 2
//indices for AEV_SABER_SWING data
# define AED_SABER_SWING_SABERNUM 0
# define AED_SABER_SWING_TYPE 1
# define AED_SABER_SWING_PROBABILITY 2
//indices for AEV_SABER_SPIN data
# define AED_SABER_SPIN_SABERNUM 0
# define AED_SABER_SPIN_TYPE 1 //0 = saberspinoff, 1 = saberspin, 2-4 = saberspin1-saberspin3
# define AED_SABER_SPIN_PROBABILITY 2
typedef enum
{ //NOTENOTE: Be sure to update animEventTypeTable and ParseAnimationEvtBlock(...) if you change this enum list!
AEV_NONE ,
AEV_SOUND , //# animID AEV_SOUND framenum soundpath randomlow randomhi chancetoplay
AEV_FOOTSTEP , //# animID AEV_FOOTSTEP framenum footstepType chancetoplay
AEV_EFFECT , //# animID AEV_EFFECT framenum effectpath boltName chancetoplay
AEV_FIRE , //# animID AEV_FIRE framenum altfire chancetofire
AEV_MOVE , //# animID AEV_MOVE framenum forwardpush rightpush uppush
AEV_SOUNDCHAN , //# animID AEV_SOUNDCHAN framenum CHANNEL soundpath randomlow randomhi chancetoplay
AEV_SABER_SWING , //# animID AEV_SABER_SWING framenum CHANNEL randomlow randomhi chancetoplay
AEV_SABER_SPIN , //# animID AEV_SABER_SPIN framenum CHANNEL chancetoplay
AEV_NUM_AEV
} animEventType_t ;
typedef struct animevent_s
{
animEventType_t eventType ;
unsigned short keyFrame ; //Frame to play event on
signed short eventData [ AED_ARRAY_SIZE ] ; //Unique IDs, can be soundIndex of sound file to play OR effect index or footstep type, etc.
char * stringData ; //we allow storage of one string, temporarily (in case we have to look up an index later, then make sure to set stringData to NULL so we only do the look-up once)
} animevent_t ;
typedef struct
{
char filename [ MAX_QPATH ] ;
animation_t * anims ;
// animsounds_t torsoAnimSnds[MAX_ANIM_SOUNDS];
// animsounds_t legsAnimSnds[MAX_ANIM_SOUNDS];
// qboolean soundsCached;
} bgLoadedAnim_t ;
typedef struct
{
char filename [ MAX_QPATH ] ;
animevent_t torsoAnimEvents [ MAX_ANIM_EVENTS ] ;
animevent_t legsAnimEvents [ MAX_ANIM_EVENTS ] ;
qboolean eventsParsed ;
} bgLoadedEvents_t ;
# include "../namespace_begin.h"
extern bgLoadedAnim_t bgAllAnims [ MAX_ANIM_FILES ] ;
//In SP this is shared in with the anim stuff, and humanoid anim sets can be loaded
//multiple times just for the sake of sounds being different. We probably wouldn't
//care normally but since we're working in VMs we have to do everything possible to
//cut memory cost.
//On the bright side this also means we're cutting a rather large size out of
//required game-side memory.
# ifndef QAGAME
extern bgLoadedEvents_t bgAllEvents [ MAX_ANIM_FILES ] ;
extern int bgNumAnimEvents ;
# endif
# include "../namespace_end.h"
typedef enum {
PM_NORMAL , // can accelerate and turn
PM_JETPACK , // special jetpack movement
PM_FLOAT , // float with no gravity in general direction of velocity (intended for gripping)
PM_NOCLIP , // noclip movement
PM_SPECTATOR , // still run into walls
PM_DEAD , // no acceleration or turning, but free falling
PM_FREEZE , // stuck in place with no control
PM_INTERMISSION , // no movement or status bar
PM_SPINTERMISSION // no movement or status bar
} pmtype_t ;
typedef enum {
WEAPON_READY ,
WEAPON_RAISING ,
WEAPON_DROPPING ,
WEAPON_FIRING ,
WEAPON_CHARGING ,
WEAPON_CHARGING_ALT ,
WEAPON_IDLE , //lowered // NOTENOTE Added with saber
} weaponstate_t ;
typedef enum {
FORCE_MASTERY_UNINITIATED ,
FORCE_MASTERY_INITIATE ,
FORCE_MASTERY_PADAWAN ,
FORCE_MASTERY_JEDI ,
FORCE_MASTERY_JEDI_GUARDIAN ,
FORCE_MASTERY_JEDI_ADEPT ,
FORCE_MASTERY_JEDI_KNIGHT ,
FORCE_MASTERY_JEDI_MASTER ,
NUM_FORCE_MASTERY_LEVELS
} ;
# include "../namespace_begin.h"
extern char * forceMasteryLevels [ NUM_FORCE_MASTERY_LEVELS ] ;
extern int forceMasteryPoints [ NUM_FORCE_MASTERY_LEVELS ] ;
extern int bgForcePowerCost [ NUM_FORCE_POWERS ] [ NUM_FORCE_POWER_LEVELS ] ;
# include "../namespace_end.h"
// pmove->pm_flags
# define PMF_DUCKED 1
# define PMF_JUMP_HELD 2
# define PMF_ROLLING 4
# define PMF_BACKWARDS_JUMP 8 // go into backwards land
# define PMF_BACKWARDS_RUN 16 // coast down to backwards run
# define PMF_TIME_LAND 32 // pm_time is time before rejump
# define PMF_TIME_KNOCKBACK 64 // pm_time is an air-accelerate only time
# define PMF_FIX_MINS 128 // mins have been brought up, keep tracing down to fix them
# define PMF_TIME_WATERJUMP 256 // pm_time is waterjump
# define PMF_RESPAWNED 512 // clear after attack and jump buttons come up
# define PMF_USE_ITEM_HELD 1024
# define PMF_UPDATE_ANIM 2048 // The server updated the animation, the pmove should set the ghoul2 anim to match.
# define PMF_FOLLOW 4096 // spectate following another player
# define PMF_SCOREBOARD 8192 // spectate as a scoreboard
# define PMF_STUCK_TO_WALL 16384 // grabbing a wall
# define PMF_ALL_TIMES (PMF_TIME_WATERJUMP|PMF_TIME_LAND|PMF_TIME_KNOCKBACK)
# define MAXTOUCH 32
typedef struct bgEntity_s
{
entityState_t s ;
playerState_t * playerState ;
Vehicle_t * m_pVehicle ; //vehicle data
void * ghoul2 ; //g2 instance
int localAnimIndex ; //index locally (game/cgame) to anim data for this skel
vec3_t modelScale ; //needed for g2 collision
//Data type(s) must directly correspond to the head of the gentity and centity structures
} bgEntity_t ;
typedef struct {
// state (in / out)
playerState_t * ps ;
//rww - shared ghoul2 stuff (not actually the same data, but hey)
void * ghoul2 ;
int g2Bolts_LFoot ;
int g2Bolts_RFoot ;
vec3_t modelScale ;
//hacky bool so we know if we're dealing with a nonhumanoid (which is probably a rockettrooper)
qboolean nonHumanoid ;
// command (in)
usercmd_t cmd ;
int tracemask ; // collide against these types of surfaces
int debugLevel ; // if set, diagnostic output will be printed
qboolean noFootsteps ; // if the game is setup for no footsteps by the server
qboolean gauntletHit ; // true if a gauntlet attack would actually hit something
int framecount ;
// results (out)
int numtouch ;
int touchents [ MAXTOUCH ] ;
int useEvent ;
vec3_t mins , maxs ; // bounding box size
int watertype ;
int waterlevel ;
int gametype ;
int debugMelee ;
int stepSlideFix ;
int noSpecMove ;
animation_t * animations ;
float xyspeed ;
// for fixed msec Pmove
int pmove_fixed ;
int pmove_msec ;
// callbacks to test the world
// these will be different functions during game and cgame
void ( * trace ) ( trace_t * results , const vec3_t start , const vec3_t mins , const vec3_t maxs , const vec3_t end , int passEntityNum , int contentMask ) ;
int ( * pointcontents ) ( const vec3_t point , int passEntityNum ) ;
int checkDuelLoss ;
//rww - bg entitystate access method
bgEntity_t * baseEnt ; //base address of the entity array (g_entities or cg_entities)
int entSize ; //size of the struct (gentity_t or centity_t) so things can be dynamic
} pmove_t ;
# include "../namespace_begin.h"
extern pmove_t * pm ;
# define SETANIM_TORSO 1
# define SETANIM_LEGS 2
# define SETANIM_BOTH SETANIM_TORSO|SETANIM_LEGS //3
# define SETANIM_FLAG_NORMAL 0 //Only set if timer is 0
# define SETANIM_FLAG_OVERRIDE 1 //Override previous
# define SETANIM_FLAG_HOLD 2 //Set the new timer
# define SETANIM_FLAG_RESTART 4 //Allow restarting the anim if playing the same one (weapon fires)
# define SETANIM_FLAG_HOLDLESS 8 //Set the new timer
// if a full pmove isn't done on the client, you can just update the angles
void PM_UpdateViewAngles ( playerState_t * ps , const usercmd_t * cmd ) ;
void Pmove ( pmove_t * pmove ) ;
# include "../namespace_end.h"
//===================================================================================
// player_state->stats[] indexes
// NOTE: may not have more than 16
typedef enum {
STAT_HEALTH ,
STAT_HOLDABLE_ITEM ,
STAT_HOLDABLE_ITEMS ,
STAT_PERSISTANT_POWERUP ,
//MAKE SURE STAT_WEAPONS REMAINS 4!!!!
//There is a hardcoded reference in msg.cpp to send it in 32 bits -rww
STAT_WEAPONS = 4 , // 16 bit fields
STAT_ARMOR ,
STAT_DEAD_YAW , // look this direction when dead (FIXME: get rid of?)
STAT_CLIENTS_READY , // bit mask of clients wishing to exit the intermission (FIXME: configstring?)
STAT_MAX_HEALTH // health / armor limit, changable by handicap
} statIndex_t ;
// player_state->persistant[] indexes
// these fields are the only part of player_state that isn't
// cleared on respawn
// NOTE: may not have more than 16
typedef enum {
PERS_SCORE , // !!! MUST NOT CHANGE, SERVER AND GAME BOTH REFERENCE !!!
PERS_HITS , // total points damage inflicted so damage beeps can sound on change
PERS_RANK , // player rank or team rank
PERS_TEAM , // player team
PERS_SPAWN_COUNT , // incremented every respawn
PERS_PLAYEREVENTS , // 16 bits that can be flipped for events
PERS_ATTACKER , // clientnum of last damage inflicter
PERS_ATTACKEE_ARMOR , // health/armor of last person we attacked
PERS_KILLED , // count of the number of times you died
// player awards tracking
PERS_IMPRESSIVE_COUNT , // two railgun hits in a row
PERS_EXCELLENT_COUNT , // two successive kills in a short amount of time
PERS_DEFEND_COUNT , // defend awards
PERS_ASSIST_COUNT , // assist awards
PERS_GAUNTLET_FRAG_COUNT , // kills with the guantlet
PERS_CAPTURES // captures
} persEnum_t ;
// entityState_t->eFlags
# define EF_G2ANIMATING (1<<0) //perform g2 bone anims based on torsoAnim and legsAnim, works for ET_GENERAL -rww
# define EF_DEAD (1<<1) // don't draw a foe marker over players with EF_DEAD
//#define EF_BOUNCE_SHRAPNEL (1<<2) // special shrapnel flag
//do not use eflags for server-only things, it wastes bandwidth -rww
# define EF_RADAROBJECT (1<<2) // display on team radar
# define EF_TELEPORT_BIT (1<<3) // toggled every time the origin abruptly changes
# define EF_SHADER_ANIM (1<<4) // Animating shader (by s.frame)
# define EF_PLAYER_EVENT (1<<5)
//#define EF_BOUNCE (1<<5) // for missiles
//#define EF_BOUNCE_HALF (1<<6) // for missiles
//these aren't even referenced in bg or client code and do not need to be eFlags, so I
//am using these flags for rag stuff -rww
# define EF_RAG (1<<6) //ragdoll him even if he's alive
# define EF_PERMANENT (1<<7) // rww - I am claiming this. (for permanent entities)
# define EF_NODRAW (1<<8) // may have an event, but no model (unspawned items)
# define EF_FIRING (1<<9) // for lightning gun
# define EF_ALT_FIRING (1<<10) // for alt-fires, mostly for lightning guns though
# define EF_JETPACK_ACTIVE (1<<11) //jetpack is activated
# define EF_NOT_USED_1 (1<<12) // not used
# define EF_TALK (1<<13) // draw a talk balloon
# define EF_CONNECTION (1<<14) // draw a connection trouble sprite
# define EF_NOT_USED_6 (1<<15) // not used
# define EF_NOT_USED_2 (1<<16) // not used
# define EF_NOT_USED_3 (1<<17) // not used
# define EF_NOT_USED_4 (1<<18) // not used
# define EF_BODYPUSH (1<<19) //rww - claiming this for fullbody push effect
# define EF_DOUBLE_AMMO (1<<20) // Hacky way to get around ammo max
# define EF_SEEKERDRONE (1<<21) // show seeker drone floating around head
# define EF_MISSILE_STICK (1<<22) // missiles that stick to the wall.
# define EF_ITEMPLACEHOLDER (1<<23) // item effect
# define EF_SOUNDTRACKER (1<<24) // sound position needs to be updated in relation to another entity
# define EF_DROPPEDWEAPON (1<<25) // it's a dropped weapon
# define EF_DISINTEGRATION (1<<26) // being disintegrated by the disruptor
# define EF_INVULNERABLE (1<<27) // just spawned in or whatever, so is protected
# define EF_CLIENTSMOOTH (1<<28) // standard lerporigin smooth override on client
# define EF_JETPACK (1<<29) //rww - wearing a jetpack
# define EF_JETPACK_FLAMING (1<<30) //rww - jetpack fire effect
# define EF_NOT_USED_5 (1<<31) // not used
//These new EF2_??? flags were added for NPCs, they really should not be used often.
//NOTE: we only allow 10 of these!
# define EF2_HELD_BY_MONSTER (1<<0) // Being held by something, like a Rancor or a Wampa
# define EF2_USE_ALT_ANIM (1<<1) // For certain special runs/stands for creatures like the Rancor and Wampa whose runs/stands are conditional
# define EF2_ALERTED (1<<2) // For certain special anims, for Rancor: means you've had an enemy, so use the more alert stand
# define EF2_GENERIC_NPC_FLAG (1<<3) // So far, used for Rancor...
# define EF2_FLYING (1<<4) // Flying FIXME: only used on NPCs doesn't *really* have to be passed over, does it?
# define EF2_HYPERSPACE (1<<5) // Used to both start the hyperspace effect on the predicted client and to let the vehicle know it can now jump into hyperspace (after turning to face the proper angle)
# define EF2_BRACKET_ENTITY (1<<6) // Draw as bracketed
# define EF2_SHIP_DEATH (1<<7) // "died in ship" mode
# define EF2_NOT_USED_1 (1<<8) // not used
typedef enum {
EFFECT_NONE = 0 ,
EFFECT_SMOKE ,
EFFECT_EXPLOSION ,
EFFECT_EXPLOSION_PAS ,
EFFECT_SPARK_EXPLOSION ,
EFFECT_EXPLOSION_TRIPMINE ,
EFFECT_EXPLOSION_DETPACK ,
EFFECT_EXPLOSION_FLECHETTE ,
EFFECT_STUNHIT ,
EFFECT_EXPLOSION_DEMP2ALT ,
EFFECT_EXPLOSION_TURRET ,
EFFECT_SPARKS ,
EFFECT_WATER_SPLASH ,
EFFECT_ACID_SPLASH ,
EFFECT_LAVA_SPLASH ,
EFFECT_LANDING_MUD ,
EFFECT_LANDING_SAND ,
EFFECT_LANDING_DIRT ,
EFFECT_LANDING_SNOW ,
EFFECT_LANDING_GRAVEL ,
EFFECT_MAX
} effectTypes_t ;
// NOTE: may not have more than 16
typedef enum {
PW_NONE ,
PW_QUAD ,
PW_BATTLESUIT ,
PW_PULL ,
//PW_INVIS, //rww - removed
//PW_REGEN, //rww - removed
//PW_FLIGHT, //rww - removed
PW_REDFLAG ,
PW_BLUEFLAG ,
PW_NEUTRALFLAG ,
PW_SHIELDHIT ,
//PW_SCOUT, //rww - removed
//PW_GUARD, //rww - removed
//PW_DOUBLER, //rww - removed
//PW_AMMOREGEN, //rww - removed
PW_SPEEDBURST ,
PW_DISINT_4 ,
PW_SPEED ,
PW_CLOAKED ,
PW_FORCE_ENLIGHTENED_LIGHT ,
PW_FORCE_ENLIGHTENED_DARK ,
PW_FORCE_BOON ,
PW_YSALAMIRI ,
PW_NUM_POWERUPS
} ;
typedef int powerup_t ;
typedef enum {
HI_NONE ,
HI_SEEKER ,
HI_SHIELD ,
HI_MEDPAC ,
HI_MEDPAC_BIG ,
HI_BINOCULARS ,
HI_SENTRY_GUN ,
HI_JETPACK ,
HI_HEALTHDISP ,
HI_AMMODISP ,
HI_EWEB ,
HI_CLOAK ,
HI_NUM_HOLDABLE
} ;
typedef int holdable_t ;
typedef enum {
CTFMESSAGE_FRAGGED_FLAG_CARRIER ,
CTFMESSAGE_FLAG_RETURNED ,
CTFMESSAGE_PLAYER_RETURNED_FLAG ,
CTFMESSAGE_PLAYER_CAPTURED_FLAG ,
CTFMESSAGE_PLAYER_GOT_FLAG
} ctfMsg_t ;
// reward sounds (stored in ps->persistant[PERS_PLAYEREVENTS])
# define PLAYEREVENT_DENIEDREWARD 0x0001
# define PLAYEREVENT_GAUNTLETREWARD 0x0002
// entityState_t->event values
// entity events are for effects that take place reletive
// to an existing entities origin. Very network efficient.
// two bits at the top of the entityState->event field
// will be incremented with each change in the event so
// that an identical event started twice in a row can
// be distinguished. And off the value with ~EV_EVENT_BITS
// to retrieve the actual event number
# define EV_EVENT_BIT1 0x00000100
# define EV_EVENT_BIT2 0x00000200
# define EV_EVENT_BITS (EV_EVENT_BIT1|EV_EVENT_BIT2)
# define EVENT_VALID_MSEC 300
typedef enum
{
PDSOUND_NONE ,
PDSOUND_PROTECTHIT ,
PDSOUND_PROTECT ,
PDSOUND_ABSORBHIT ,
PDSOUND_ABSORB ,
PDSOUND_FORCEJUMP ,
PDSOUND_FORCEGRIP
} pdSounds_t ;
typedef enum {
EV_NONE ,
EV_CLIENTJOIN ,
EV_FOOTSTEP ,
EV_FOOTSTEP_METAL ,
EV_FOOTSPLASH ,
EV_FOOTWADE ,
EV_SWIM ,
EV_STEP_4 ,
EV_STEP_8 ,
EV_STEP_12 ,
EV_STEP_16 ,
EV_FALL ,
EV_JUMP_PAD , // boing sound at origin, jump sound on player
EV_GHOUL2_MARK , //create a projectile impact mark on something with a client-side g2 instance.
EV_GLOBAL_DUEL ,
EV_PRIVATE_DUEL ,
EV_JUMP ,
EV_ROLL ,
EV_WATER_TOUCH , // foot touches
EV_WATER_LEAVE , // foot leaves
EV_WATER_UNDER , // head touches
EV_WATER_CLEAR , // head leaves
EV_ITEM_PICKUP , // normal item pickups are predictable
EV_GLOBAL_ITEM_PICKUP , // powerup / team sounds are broadcast to everyone
EV_VEH_FIRE ,
EV_NOAMMO ,
EV_CHANGE_WEAPON ,
EV_FIRE_WEAPON ,
EV_ALT_FIRE ,
EV_SABER_ATTACK ,
EV_SABER_HIT ,
EV_SABER_BLOCK ,
EV_SABER_CLASHFLARE ,
EV_SABER_UNHOLSTER ,
EV_BECOME_JEDIMASTER ,
EV_DISRUPTOR_MAIN_SHOT ,
EV_DISRUPTOR_SNIPER_SHOT ,
EV_DISRUPTOR_SNIPER_MISS ,
EV_DISRUPTOR_HIT ,
EV_DISRUPTOR_ZOOMSOUND ,
EV_PREDEFSOUND ,
EV_TEAM_POWER ,
EV_SCREENSHAKE ,
EV_LOCALTIMER ,
EV_USE , // +Use key
EV_USE_ITEM0 ,
EV_USE_ITEM1 ,
EV_USE_ITEM2 ,
EV_USE_ITEM3 ,
EV_USE_ITEM4 ,
EV_USE_ITEM5 ,
EV_USE_ITEM6 ,
EV_USE_ITEM7 ,
EV_USE_ITEM8 ,
EV_USE_ITEM9 ,
EV_USE_ITEM10 ,
EV_USE_ITEM11 ,
EV_USE_ITEM12 ,
EV_USE_ITEM13 ,
EV_USE_ITEM14 ,
EV_USE_ITEM15 ,
EV_ITEMUSEFAIL ,
EV_ITEM_RESPAWN ,
EV_ITEM_POP ,
EV_PLAYER_TELEPORT_IN ,
EV_PLAYER_TELEPORT_OUT ,
EV_GRENADE_BOUNCE , // eventParm will be the soundindex
EV_MISSILE_STICK , // eventParm will be the soundindex
EV_PLAY_EFFECT ,
EV_PLAY_EFFECT_ID ,
EV_PLAY_PORTAL_EFFECT_ID ,
EV_PLAYDOORSOUND ,
EV_PLAYDOORLOOPSOUND ,
EV_BMODEL_SOUND ,
EV_MUTE_SOUND ,
EV_VOICECMD_SOUND ,
EV_GENERAL_SOUND ,
EV_GLOBAL_SOUND , // no attenuation
EV_GLOBAL_TEAM_SOUND ,
EV_ENTITY_SOUND ,
EV_PLAY_ROFF ,
EV_GLASS_SHATTER ,
EV_DEBRIS ,
EV_MISC_MODEL_EXP ,
EV_CONC_ALT_IMPACT ,
EV_MISSILE_HIT ,
EV_MISSILE_MISS ,
EV_MISSILE_MISS_METAL ,
EV_BULLET , // otherEntity is the shooter
EV_PAIN ,
EV_DEATH1 ,
EV_DEATH2 ,
EV_DEATH3 ,
EV_OBITUARY ,
EV_POWERUP_QUAD ,
EV_POWERUP_BATTLESUIT ,
//EV_POWERUP_REGEN,
EV_FORCE_DRAINED ,
EV_GIB_PLAYER , // gib a previously living player
EV_SCOREPLUM , // score plum
EV_CTFMESSAGE ,
EV_BODYFADE ,
EV_SIEGE_ROUNDOVER ,
EV_SIEGE_OBJECTIVECOMPLETE ,
EV_DESTROY_GHOUL2_INSTANCE ,
EV_DESTROY_WEAPON_MODEL ,
EV_GIVE_NEW_RANK ,
EV_SET_FREE_SABER ,
EV_SET_FORCE_DISABLE ,
EV_WEAPON_CHARGE ,
EV_WEAPON_CHARGE_ALT ,
EV_SHIELD_HIT ,
EV_DEBUG_LINE ,
EV_TESTLINE ,
EV_STOPLOOPINGSOUND ,
EV_STARTLOOPINGSOUND ,
EV_TAUNT ,
//rww - Begin NPC sound events
EV_ANGER1 , //Say when acquire an enemy when didn't have one before
EV_ANGER2 ,
EV_ANGER3 ,
EV_VICTORY1 , //Say when killed an enemy
EV_VICTORY2 ,
EV_VICTORY3 ,
EV_CONFUSE1 , //Say when confused
EV_CONFUSE2 ,
EV_CONFUSE3 ,
EV_PUSHED1 , //Say when pushed
EV_PUSHED2 ,
EV_PUSHED3 ,
EV_CHOKE1 , //Say when choking
EV_CHOKE2 ,
EV_CHOKE3 ,
EV_FFWARN , //ffire founds
EV_FFTURN ,
//extra sounds for ST
EV_CHASE1 ,
EV_CHASE2 ,
EV_CHASE3 ,
EV_COVER1 ,
EV_COVER2 ,
EV_COVER3 ,
EV_COVER4 ,
EV_COVER5 ,
EV_DETECTED1 ,
EV_DETECTED2 ,
EV_DETECTED3 ,
EV_DETECTED4 ,
EV_DETECTED5 ,
EV_LOST1 ,
EV_OUTFLANK1 ,
EV_OUTFLANK2 ,
EV_ESCAPING1 ,
EV_ESCAPING2 ,
EV_ESCAPING3 ,
EV_GIVEUP1 ,
EV_GIVEUP2 ,
EV_GIVEUP3 ,
EV_GIVEUP4 ,
EV_LOOK1 ,
EV_LOOK2 ,
EV_SIGHT1 ,
EV_SIGHT2 ,
EV_SIGHT3 ,
EV_SOUND1 ,
EV_SOUND2 ,
EV_SOUND3 ,
EV_SUSPICIOUS1 ,
EV_SUSPICIOUS2 ,
EV_SUSPICIOUS3 ,
EV_SUSPICIOUS4 ,
EV_SUSPICIOUS5 ,
//extra sounds for Jedi
EV_COMBAT1 ,
EV_COMBAT2 ,
EV_COMBAT3 ,
EV_JDETECTED1 ,
EV_JDETECTED2 ,
EV_JDETECTED3 ,
EV_TAUNT1 ,
EV_TAUNT2 ,
EV_TAUNT3 ,
EV_JCHASE1 ,
EV_JCHASE2 ,
EV_JCHASE3 ,
EV_JLOST1 ,
EV_JLOST2 ,
EV_JLOST3 ,
EV_DEFLECT1 ,
EV_DEFLECT2 ,
EV_DEFLECT3 ,
EV_GLOAT1 ,
EV_GLOAT2 ,
EV_GLOAT3 ,
EV_PUSHFAIL ,
EV_SIEGESPEC ,
} entity_event_t ; // There is a maximum of 256 events (8 bits transmission, 2 high bits for uniqueness)
typedef enum {
GTS_RED_CAPTURE ,
GTS_BLUE_CAPTURE ,
GTS_RED_RETURN ,
GTS_BLUE_RETURN ,
GTS_RED_TAKEN ,
GTS_BLUE_TAKEN ,
GTS_REDTEAM_SCORED ,
GTS_BLUETEAM_SCORED ,
GTS_REDTEAM_TOOK_LEAD ,
GTS_BLUETEAM_TOOK_LEAD ,
GTS_TEAMS_ARE_TIED
} global_team_sound_t ;
typedef enum {
TEAM_FREE ,
TEAM_RED ,
TEAM_BLUE ,
TEAM_SPECTATOR ,
TEAM_NUM_TEAMS
} ;
typedef int team_t ;
typedef enum {
DUELTEAM_FREE ,
DUELTEAM_LONE ,
DUELTEAM_DOUBLE ,
DUELTEAM_SINGLE , // for regular duel matches (not power duel)
} duelTeam_t ;
// Time between location updates
# define TEAM_LOCATION_UPDATE_TIME 1000
// How many players on the overlay
# define TEAM_MAXOVERLAY 32
//team task
typedef enum {
TEAMTASK_NONE ,
TEAMTASK_OFFENSE ,
TEAMTASK_DEFENSE ,
TEAMTASK_PATROL ,
TEAMTASK_FOLLOW ,
TEAMTASK_RETRIEVE ,
TEAMTASK_ESCORT ,
TEAMTASK_CAMP
} teamtask_t ;
// means of death
typedef enum {
MOD_UNKNOWN ,
MOD_STUN_BATON ,
MOD_MELEE ,
MOD_SABER ,
MOD_BRYAR_PISTOL ,
MOD_BRYAR_PISTOL_ALT ,
MOD_BLASTER ,
MOD_TURBLAST ,
MOD_DISRUPTOR ,
MOD_DISRUPTOR_SPLASH ,
MOD_DISRUPTOR_SNIPER ,
MOD_BOWCASTER ,
MOD_REPEATER ,
MOD_REPEATER_ALT ,
MOD_REPEATER_ALT_SPLASH ,
MOD_DEMP2 ,
MOD_DEMP2_ALT ,
MOD_FLECHETTE ,
MOD_FLECHETTE_ALT_SPLASH ,
MOD_ROCKET ,
MOD_ROCKET_SPLASH ,
MOD_ROCKET_HOMING ,
MOD_ROCKET_HOMING_SPLASH ,
MOD_THERMAL ,
MOD_THERMAL_SPLASH ,
MOD_TRIP_MINE_SPLASH ,
MOD_TIMED_MINE_SPLASH ,
MOD_DET_PACK_SPLASH ,
MOD_VEHICLE ,
MOD_CONC ,
MOD_CONC_ALT ,
MOD_FORCE_DARK ,
MOD_SENTRY ,
MOD_WATER ,
MOD_SLIME ,
MOD_LAVA ,
MOD_CRUSH ,
MOD_TELEFRAG ,
MOD_FALLING ,
MOD_COLLISION ,
MOD_VEH_EXPLOSION ,
MOD_SUICIDE ,
MOD_TARGET_LASER ,
MOD_TRIGGER_HURT ,
MOD_TEAM_CHANGE ,
//AURELIO: when/if you put this back in, remember to make a case for it in all the other places where
//mod's are checked. Also, it probably isn't the most elegant solution for what you want - just add
//a frag back to the player after you call the player_die (and keep a local of his pre-death score to
//make sure he actually lost points, there may be cases where you don't lose points on changing teams
//or suiciding, and so you would actually be giving him a point) -Rich
// I put it back in for now, if it becomes a problem we'll work around it later (it shouldn't though)...
MOD_MAX
} meansOfDeath_t ;
//---------------------------------------------------------
// gitem_t->type
typedef enum {
IT_BAD ,
IT_WEAPON , // EFX: rotate + upscale + minlight
IT_AMMO , // EFX: rotate
IT_ARMOR , // EFX: rotate + minlight
IT_HEALTH , // EFX: static external sphere + rotating internal
IT_POWERUP , // instant on, timer based
// EFX: rotate + external ring that rotates
IT_HOLDABLE , // single use, holdable item
// EFX: rotate + bob
IT_PERSISTANT_POWERUP ,
IT_TEAM
} ;
typedef int itemType_t ;
# define MAX_ITEM_MODELS 4
typedef struct gitem_s {
char * classname ; // spawning name
char * pickup_sound ;
char * world_model [ MAX_ITEM_MODELS ] ;
char * view_model ;
char * icon ;
// char *pickup_name; // for printing on pickup
int quantity ; // for ammo how much, or duration of powerup
itemType_t giType ; // IT_* flags
int giTag ;
char * precaches ; // string of all models and images this item will use
char * sounds ; // string of all sounds this item will use
char * description ;
} gitem_t ;
// included in both the game dll and the client
# include "../namespace_begin.h"
extern gitem_t bg_itemlist [ ] ;
extern int bg_numItems ;
float vectoyaw ( const vec3_t vec ) ;
gitem_t * BG_FindItem ( const char * classname ) ;
gitem_t * BG_FindItemForWeapon ( weapon_t weapon ) ;
gitem_t * BG_FindItemForPowerup ( powerup_t pw ) ;
gitem_t * BG_FindItemForHoldable ( holdable_t pw ) ;
# define ITEM_INDEX(x) ((x)-bg_itemlist)
qboolean BG_CanItemBeGrabbed ( int gametype , const entityState_t * ent , const playerState_t * ps ) ;
# include "../namespace_end.h"
# define SABER_BLOCK_DUR 150 // number of milliseconds a block animation should take.
// g_dmflags->integer flags
# define DF_NO_FALLING 8
# define DF_FIXED_FOV 16
# define DF_NO_FOOTSTEPS 32
//rwwRMG - added in CONTENTS_TERRAIN
// content masks
# define MASK_ALL (-1)
# define MASK_SOLID (CONTENTS_SOLID|CONTENTS_TERRAIN)
# define MASK_PLAYERSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_BODY|CONTENTS_TERRAIN)
# define MASK_NPCSOLID (CONTENTS_SOLID|CONTENTS_MONSTERCLIP|CONTENTS_BODY|CONTENTS_TERRAIN)
# define MASK_DEADSOLID (CONTENTS_SOLID|CONTENTS_PLAYERCLIP|CONTENTS_TERRAIN)
# define MASK_WATER (CONTENTS_WATER|CONTENTS_LAVA|CONTENTS_SLIME)
# define MASK_OPAQUE (CONTENTS_SOLID|CONTENTS_SLIME|CONTENTS_LAVA|CONTENTS_TERRAIN)
# define MASK_SHOT (CONTENTS_SOLID|CONTENTS_BODY|CONTENTS_CORPSE|CONTENTS_TERRAIN)
// ET_FX States (stored in modelindex2)
# define FX_STATE_OFF 0
# define FX_STATE_ONE_SHOT 1
# define FX_STATE_ONE_SHOT_LIMIT 10
# define FX_STATE_CONTINUOUS 20
//
// entityState_t->eType
//
typedef enum {
ET_GENERAL ,
ET_PLAYER ,
ET_ITEM ,
ET_MISSILE ,
ET_SPECIAL , // rww - force fields
ET_HOLOCRON , // rww - holocron icon displays
ET_MOVER ,
ET_BEAM ,
ET_PORTAL ,
ET_SPEAKER ,
ET_PUSH_TRIGGER ,
ET_TELEPORT_TRIGGER ,
ET_INVISIBLE ,
ET_NPC , // ghoul2 player-like entity
ET_TEAM ,
ET_BODY ,
ET_TERRAIN ,
ET_FX ,
ET_EVENTS // any of the EV_* events can be added freestanding
// by setting eType to ET_EVENTS + eventNum
// this avoids having to set eFlags and eventNum
} entityType_t ;
//
// fields are needed for spawning from the entity string
//
//I moved these from g_spawn.c because the entity parsing stuff is semi-shared now -rww
# undef _GAME_SIDE
# ifdef QAGAME
# define _GAME_SIDE
# elif defined CGAME
# define _GAME_SIDE
# endif
# ifdef _GAME_SIDE
typedef enum {
F_INT ,
F_FLOAT ,
F_LSTRING , // string on disk, pointer in memory, TAG_LEVEL
F_GSTRING , // string on disk, pointer in memory, TAG_GAME
F_VECTOR ,
F_ANGLEHACK ,
F_ENTITY , // index on disk, pointer in memory
F_ITEM , // index on disk, pointer in memory
F_CLIENT , // index on disk, pointer in memory
F_PARM1 , // Special case for parms
F_PARM2 , // Special case for parms
F_PARM3 , // Special case for parms
F_PARM4 , // Special case for parms
F_PARM5 , // Special case for parms
F_PARM6 , // Special case for parms
F_PARM7 , // Special case for parms
F_PARM8 , // Special case for parms
F_PARM9 , // Special case for parms
F_PARM10 , // Special case for parms
F_PARM11 , // Special case for parms
F_PARM12 , // Special case for parms
F_PARM13 , // Special case for parms
F_PARM14 , // Special case for parms
F_PARM15 , // Special case for parms
F_PARM16 , // Special case for parms
F_IGNORE
} fieldtype_t ;
typedef struct
{
char * name ;
int ofs ;
fieldtype_t type ;
int flags ;
} BG_field_t ;
# endif
// 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.
// rww - Moved all this to bg_public so that we can access the saberMoveData stuff on the cgame
// which is currently used for determining if a saber trail should be rendered in a given frame
# ifdef LS_NONE
# undef LS_NONE
# endif
typedef enum {
//totally invalid
LS_INVALID = - 1 ,
// 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_ROLL_STAB ,
LS_A_LUNGE ,
LS_A_JUMP_T__B_ ,
LS_A_FLIP_STAB ,
LS_A_FLIP_SLASH ,
LS_JUMPATTACK_DUAL ,
LS_JUMPATTACK_ARIAL_LEFT ,
LS_JUMPATTACK_ARIAL_RIGHT ,
LS_JUMPATTACK_CART_LEFT ,
LS_JUMPATTACK_CART_RIGHT ,
LS_JUMPATTACK_STAFF_LEFT ,
LS_JUMPATTACK_STAFF_RIGHT ,
LS_BUTTERFLY_LEFT ,
LS_BUTTERFLY_RIGHT ,
LS_A_BACKFLIP_ATK ,
LS_SPINATTACK_DUAL ,
LS_SPINATTACK ,
LS_LEAP_ATTACK ,
LS_SWOOP_ATTACK_RIGHT ,
LS_SWOOP_ATTACK_LEFT ,
LS_TAUNTAUN_ATTACK_RIGHT ,
LS_TAUNTAUN_ATTACK_LEFT ,
LS_KICK_F ,
LS_KICK_B ,
LS_KICK_R ,
LS_KICK_L ,
LS_KICK_S ,
LS_KICK_BF ,
LS_KICK_RL ,
LS_KICK_F_AIR ,
LS_KICK_B_AIR ,
LS_KICK_R_AIR ,
LS_KICK_L_AIR ,
LS_STABDOWN ,
LS_STABDOWN_STAFF ,
LS_STABDOWN_DUAL ,
LS_DUAL_SPIN_PROTECT ,
LS_STAFF_SOULCAL ,
LS_A1_SPECIAL ,
LS_A2_SPECIAL ,
LS_A3_SPECIAL ,
LS_UPSIDE_DOWN_ATTACK ,
LS_PULL_ATTACK_STAB ,
LS_PULL_ATTACK_SWING ,
LS_SPINATTACK_ALORA ,
LS_DUAL_FB ,
LS_DUAL_LR ,
LS_HILT_BASH ,
//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 //
} ;
typedef int 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 ;
# include "../namespace_begin.h"
extern saberMoveData_t saberMoveData [ LS_MOVE_MAX ] ;
bgEntity_t * PM_BGEntForNum ( int num ) ;
qboolean BG_KnockDownable ( playerState_t * ps ) ;
qboolean BG_LegalizedForcePowers ( char * powerOut , int maxRank , qboolean freeSaber , int teamForce , int gametype , int fpDisabled ) ;
# include "../namespace_end.h"
# ifdef __LCC__ //can't inline it then, it is declared over in bg_misc in this case
void BG_GiveMeVectorFromMatrix ( mdxaBone_t * boltMatrix , int flags , vec3_t vec ) ;
# else
// given a boltmatrix, return in vec a normalised vector for the axis requested in flags
static ID_INLINE void BG_GiveMeVectorFromMatrix ( mdxaBone_t * boltMatrix , int flags , vec3_t vec )
{
switch ( flags )
{
case ORIGIN :
vec [ 0 ] = boltMatrix - > matrix [ 0 ] [ 3 ] ;
vec [ 1 ] = boltMatrix - > matrix [ 1 ] [ 3 ] ;
vec [ 2 ] = boltMatrix - > matrix [ 2 ] [ 3 ] ;
break ;
case POSITIVE_Y :
vec [ 0 ] = boltMatrix - > matrix [ 0 ] [ 1 ] ;
vec [ 1 ] = boltMatrix - > matrix [ 1 ] [ 1 ] ;
vec [ 2 ] = boltMatrix - > matrix [ 2 ] [ 1 ] ;
break ;
case POSITIVE_X :
vec [ 0 ] = boltMatrix - > matrix [ 0 ] [ 0 ] ;
vec [ 1 ] = boltMatrix - > matrix [ 1 ] [ 0 ] ;
vec [ 2 ] = boltMatrix - > matrix [ 2 ] [ 0 ] ;
break ;
case POSITIVE_Z :
vec [ 0 ] = boltMatrix - > matrix [ 0 ] [ 2 ] ;
vec [ 1 ] = boltMatrix - > matrix [ 1 ] [ 2 ] ;
vec [ 2 ] = boltMatrix - > matrix [ 2 ] [ 2 ] ;
break ;
case NEGATIVE_Y :
vec [ 0 ] = - boltMatrix - > matrix [ 0 ] [ 1 ] ;
vec [ 1 ] = - boltMatrix - > matrix [ 1 ] [ 1 ] ;
vec [ 2 ] = - boltMatrix - > matrix [ 2 ] [ 1 ] ;
break ;
case NEGATIVE_X :
vec [ 0 ] = - boltMatrix - > matrix [ 0 ] [ 0 ] ;
vec [ 1 ] = - boltMatrix - > matrix [ 1 ] [ 0 ] ;
vec [ 2 ] = - boltMatrix - > matrix [ 2 ] [ 0 ] ;
break ;
case NEGATIVE_Z :
vec [ 0 ] = - boltMatrix - > matrix [ 0 ] [ 2 ] ;
vec [ 1 ] = - boltMatrix - > matrix [ 1 ] [ 2 ] ;
vec [ 2 ] = - boltMatrix - > matrix [ 2 ] [ 2 ] ;
break ;
}
}
# endif
# include "../namespace_begin.h"
void BG_IK_MoveArm ( void * ghoul2 , int lHandBolt , int time , entityState_t * ent , int basePose , vec3_t desiredPos , qboolean * ikInProgress ,
vec3_t origin , vec3_t angles , vec3_t scale , int blendTime , qboolean forceHalt ) ;
void BG_G2PlayerAngles ( void * ghoul2 , int motionBolt , entityState_t * cent , int time , vec3_t cent_lerpOrigin ,
vec3_t cent_lerpAngles , vec3_t legs [ 3 ] , vec3_t legsAngles , qboolean * tYawing ,
qboolean * tPitching , qboolean * lYawing , float * tYawAngle , float * tPitchAngle ,
float * lYawAngle , int frametime , vec3_t turAngles , vec3_t modelScale , int ciLegs ,
int ciTorso , int * corrTime , vec3_t lookAngles , vec3_t lastHeadAngles , int lookTime ,
entityState_t * emplaced , int * crazySmoothFactor ) ;
void BG_G2ATSTAngles ( void * ghoul2 , int time , vec3_t cent_lerpAngles ) ;
//BG anim utility functions:
int BG_AnimLength ( int index , animNumber_t anim ) ;
qboolean BG_InSpecialJump ( int anim ) ;
qboolean BG_InSaberStandAnim ( int anim ) ;
qboolean BG_InReboundJump ( int anim ) ;
qboolean BG_InReboundHold ( int anim ) ;
qboolean BG_InReboundRelease ( int anim ) ;
qboolean BG_InBackFlip ( int anim ) ;
qboolean BG_DirectFlippingAnim ( int anim ) ;
qboolean BG_SaberInAttack ( int move ) ;
qboolean BG_SaberInSpecial ( int move ) ;
qboolean BG_KickMove ( int move ) ;
qboolean BG_SaberInIdle ( int move ) ;
qboolean BG_FlippingAnim ( int anim ) ;
qboolean BG_SpinningSaberAnim ( int anim ) ;
qboolean BG_SaberInSpecialAttack ( int anim ) ;
qboolean BG_SaberInKata ( int saberMove ) ;
qboolean BG_InKataAnim ( int anim ) ;
qboolean BG_KickingAnim ( int anim ) ;
int BG_InGrappleMove ( int anim ) ;
int BG_BrokenParryForAttack ( int move ) ;
int BG_BrokenParryForParry ( int move ) ;
int BG_KnockawayForParry ( int move ) ;
qboolean BG_InRoll ( playerState_t * ps , int anim ) ;
qboolean BG_InDeathAnim ( int anim ) ;
qboolean BG_InSaberLockOld ( int anim ) ;
qboolean BG_InSaberLock ( int anim ) ;
void BG_SaberStartTransAnim ( int clientNum , int saberAnimLevel , int weapon , int anim , float * animSpeed , int broken ) ;
void BG_ForcePowerDrain ( playerState_t * ps , forcePowers_t forcePower , int overrideAmt ) ;
void BG_EvaluateTrajectory ( const trajectory_t * tr , int atTime , vec3_t result ) ;
void BG_EvaluateTrajectoryDelta ( const trajectory_t * tr , int atTime , vec3_t result ) ;
void BG_AddPredictableEventToPlayerstate ( int newEvent , int eventParm , playerState_t * ps ) ;
void BG_TouchJumpPad ( playerState_t * ps , entityState_t * jumppad ) ;
void BG_PlayerStateToEntityState ( playerState_t * ps , entityState_t * s , qboolean snap ) ;
void BG_PlayerStateToEntityStateExtraPolate ( playerState_t * ps , entityState_t * s , int time , qboolean snap ) ;
qboolean BG_PlayerTouchesItem ( playerState_t * ps , entityState_t * item , int atTime ) ;
void BG_InitAnimsets ( void ) ;
void BG_ClearAnimsets ( void ) ;
int BG_ParseAnimationFile ( const char * filename , animation_t * animSet , qboolean isHumanoid ) ;
# ifndef QAGAME
int BG_ParseAnimationEvtFile ( const char * as_filename , int animFileIndex , int eventFileIndex ) ;
# endif
qboolean BG_HasAnimation ( int animIndex , int animation ) ;
int BG_PickAnim ( int animIndex , int minAnim , int maxAnim ) ;
int BG_GetItemIndexByTag ( int tag , int type ) ;
qboolean BG_IsItemSelectable ( playerState_t * ps , int item ) ;
qboolean BG_HasYsalamiri ( int gametype , playerState_t * ps ) ;
qboolean BG_CanUseFPNow ( int gametype , playerState_t * ps , int time , forcePowers_t power ) ;
void * BG_Alloc ( int size ) ;
void * BG_AllocUnaligned ( int size ) ;
void * BG_TempAlloc ( int size ) ;
void BG_TempFree ( int size ) ;
char * BG_StringAlloc ( const char * source ) ;
qboolean BG_OutOfMemory ( void ) ;
void BG_BLADE_ActivateTrail ( bladeInfo_t * blade , float duration ) ;
void BG_BLADE_DeactivateTrail ( bladeInfo_t * blade , float duration ) ;
void BG_SI_Activate ( saberInfo_t * saber ) ;
void BG_SI_Deactivate ( saberInfo_t * saber ) ;
void BG_SI_BladeActivate ( saberInfo_t * saber , int iBlade , qboolean bActive ) ;
qboolean BG_SI_Active ( saberInfo_t * saber ) ;
void BG_SI_SetLength ( saberInfo_t * saber , float length ) ;
void BG_SI_SetDesiredLength ( saberInfo_t * saber , float len , int bladeNum ) ;
void BG_SI_SetLengthGradual ( saberInfo_t * saber , int time ) ;
float BG_SI_Length ( saberInfo_t * saber ) ;
float BG_SI_LengthMax ( saberInfo_t * saber ) ;
void BG_SI_ActivateTrail ( saberInfo_t * saber , float duration ) ;
void BG_SI_DeactivateTrail ( saberInfo_t * saber , float duration ) ;
extern void BG_AttachToRancor ( void * ghoul2 , float rancYaw , vec3_t rancOrigin , int time , qhandle_t * modelList , vec3_t modelScale , qboolean inMouth , vec3_t out_origin , vec3_t out_angles , vec3_t out_axis [ 3 ] ) ;
extern int WeaponReadyAnim [ WP_NUM_WEAPONS ] ;
extern int WeaponAttackAnim [ WP_NUM_WEAPONS ] ;
extern int forcePowerDarkLight [ NUM_FORCE_POWERS ] ;
# include "../namespace_end.h"
# define ARENAS_PER_TIER 4
# define MAX_ARENAS 1024
# define MAX_ARENAS_TEXT 8192
# define MAX_BOTS 1024
# define MAX_BOTS_TEXT 8192
# define HYPERSPACE_TIME 4000 //For hyperspace triggers
# define HYPERSPACE_TELEPORT_FRAC 0.75f
# define HYPERSPACE_SPEED 10000.0f //was 30000
# define HYPERSPACE_TURN_RATE 45.0f
# endif //__BG_PUBLIC_H__