sof-sdk/Source/Game/gamecpp/ai_body.h
2000-06-15 00:00:00 +00:00

556 lines
No EOL
24 KiB
C++

enum
{
BODY,
BODY_HUMAN,
BODY_DOG,
BODY_MESO,
BODY_ECTO,
BODY_HUSKY,
BODY_ROTT,
BODY_ORGANIC,
BODY_FEMALE,
BODY_HELI,
BODY_TANK,
BODY_SNOWCAT,
BODY_COW,
BODY_DEKKER
};
typedef enum
{
HOLDCODE_NO,
HOLDCODE_INAIR,
HOLDCODE_GIBBED,
} hold_code;
typedef enum
{
ACTSUB_ATTITUDE,
ACTSUB_FEAR,
ACTSUB_NORMAL,
} actionsub_code;
typedef enum
{
ARMOR_NONE,
ARMOR_CHEST,
ARMOR_CHESTLIMBS,
ARMOR_FULL,
ARMOR_SOMEWHAT_TOUGH,//eric wants weaker flamethrower guys
ARMOR_TOUGH
} armor_code;
enum deathvoice_code
{
DEATHVOICE_DEFAULT,
DEATHVOICE_SKINHEAD,
DEATHVOICE_ARAB,
DEATHVOICE_RUSSIAN,
DEATHVOICE_ASIAN,
DEATHVOICE_FEMALE,
DEATHVOICE_RAIDER,
DEATHVOICE_PLAYER//special deathvoice that overrides directory-chooser and specifies its directory explicitly
};
class body_c
{
protected:
mmove_t *currentmove;
edict_t *owner;
qboolean currentMoveFinished;
hold_code holdCode;
int frame_flags;
float emotion_expire;
emotion_index emotion;
qboolean emotionScripted;
float rLastFireTime;
float lLastFireTime;
float InitialKilledTime;//the time the guy is first killed
float LastKilledTime;//the most recent time he was killed
float lastStartTime;//last time i started an animation at...
int LastDFlags;
bool ForceNextAnim;
bool TrainDeath; // horrible awful hack put in by me... somebody come up with something cool, please! dk
virtual qboolean PlayAnimation(edict_t &monster, mmove_t *newanim, bool forceRestart);
virtual attacks_e GetWeaponAtBolt(edict_t &monster, char *boltname){return ATK_NOTHING;}
float FireInterval(attacks_e weaponType, int curAmmo);
public:
virtual void VoiceSound(char *base, edict_t &monster, int num, float vol = 1.0){}
virtual void VoiceWakeSound(edict_t &monster, float vol = .6){}
GhoulID GetSequence(edict_t &monster, mmove_t *newanim);
//this getsequencefor... is different from the others in that it actually creates an action--the others just return what move they prefer
//also, the parameters passed in are very subject to change; the other getsequencefor...'s are pretty much set.
virtual mmove_t *GetSequenceForDeath(edict_t &monster, edict_t *inflictor, edict_t *attacker, int damage, vec3_t point, int dflags, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForPain(edict_t &monster, vec3_t point, float kick, int damage, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForMovement(edict_t &monster, vec3_t dest, vec3_t face, vec3_t org, vec3_t ang, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForStand(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForJump(edict_t &monster, vec3_t dest, vec3_t face, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForAttack(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForDodge(edict_t &monster, vec3_t dest, vec3_t face, edict_t *target, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int leftSide = 0, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetSequenceForReload(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual mmove_t *GetPostShootSequence(edict_t &monster, vec3_t dest=vec3_origin, vec3_t face=vec3_origin, actionsub_code seqtype=ACTSUB_NORMAL, bbox_preset goal_bbox=BBOX_PRESET_NUMBER, mmove_t *ideal_move=NULL, int reject_actionflags=0){return NULL;}
virtual bool IsInStationaryDeathAnim() { return false; }
virtual void UseMonster(edict_t &monster, edict_t *user){}
virtual void TouchMonster(edict_t &monster, edict_t *user){}
virtual void RightStep(edict_t &monster){}
virtual void LeftStep(edict_t &monster){}
virtual void Drip(edict_t &monster){}
virtual qboolean IsAvailableSequence(edict_t &monster, mmove_t *newanim);
virtual qboolean MatchAnimation(edict_t &monster, mmove_t *newanim);
virtual qboolean SetAnimation(edict_t &monster, mmove_t *newanim);
virtual qboolean ForceAnimation(edict_t &monster, mmove_t *newanim);
virtual void HoldAnimation(edict_t &monster, hold_code whyHold, float holdTime);
virtual void ResumeAnimation(edict_t &monster);
qboolean ApplySkin(edict_t &monster, ggOinstC *myInstance, char *matName, char *skinName);
void SetMove(mmove_t *newmove){currentmove = newmove;}
virtual void FinishMove(edict_t &monster);
virtual void SetFlags(edict_t & monster, int newflags){frame_flags|=newflags;}
virtual qboolean IsAnimationFinished();
//this is Very similar to IsAnimationFinished, but ignores whether anim is looping or not--because of low-frame anim silliness, you normally want to use IsAnimationFinished.
virtual qboolean HasAnimationHitEOS();
virtual qboolean IsAnimationHeld(hold_code queryCode);
virtual qboolean IsAnimationReversed();
virtual void NextMovement(edict_t &monster, vec3_t curDist, float scale);
virtual void NextTurn(float scale, edict_t &monster, float default_turn, turninfo_s &turninfo);
virtual int NextFlags(edict_t &monster);
mmove_t *GetMove(void){return currentmove;}
virtual void SetRootBolt(edict_t &monster){}
virtual void SetArmor(edict_t &monster, armor_code newarmor){}
virtual armor_code GetArmorCode() { return ARMOR_NONE; }
virtual float GetArmorPercentRemaining() { return 0; }
virtual void StripArmor(){}
virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb){return damage;}
weapons_t GetWeaponType(ggBinstC *weapon);
attacks_e GetWeaponAttackType(ggBinstC *weapon);
//set my specific and general directories
virtual void SetVoiceDirectories(edict_t &monster, const char *base, int possible_varieties, deathvoice_code death, char *deathdir=NULL){}
//forceFireRate will not fire the gun if it's been fired more recently than design doc says that kind of gun should fire.
virtual void FirePrimaryWeapon(edict_t &monster, bool lethal = false, int NullTarget = 0, qboolean forceFireRate = false) { FireRightHandWeapon(monster, lethal, NullTarget, forceFireRate); }
virtual void FireRightHandWeapon(edict_t &monster, bool isLethal = false, int NullTarget = 0, qboolean forceFireRate = false);
virtual qboolean RightHandWeaponReady(edict_t &monster);
virtual void ThrowProjectile(edict_t &monster){}
virtual attacks_e GetRightHandWeapon(edict_t &monster){return ATK_NOTHING;}
virtual attacks_e GetLeftHandWeapon(edict_t &monster){return ATK_NOTHING;}
virtual void SetRightHandWeapon(edict_t &monster, attacks_e newRightWeap){}
virtual void SetLeftHandWeapon(edict_t &monster, attacks_e newLeftWeap){}
virtual attacks_e GetBestWeapon(edict_t &monster){return ATK_NOTHING;}
void Emote(edict_t &monster, emotion_index new_emotion, float emotion_duration, qboolean scripted_emoting=false);
emotion_index GetMood(edict_t &monster);
virtual void UpdateFace(edict_t &monster);
virtual void SetFace(edict_t &monster, char *face){}
virtual ggBinstC *AddBoltedItem(edict_t &monster, GhoulID mybolt, ggObjC *gun, char *itemSeq, GhoulID itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0);
virtual ggBinstC *AddBoltedItem(edict_t &monster, GhoulID myBolt, char *itemClass, char *itemSeq, GhoulID itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0);
virtual ggBinstC *AddBoltedItem(edict_t &monster, GhoulID myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0);
virtual ggBinstC *AddBoltedItem(edict_t &monster, char *myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0);
virtual qboolean AddRandomBoltedItem(float percent_chance, edict_t &monster, char *myBolt, char *itemClass, char *itemSeq, char *itemBolt, ggOinstC *myInstance, char *itemSkinName=NULL, float scale = 1.0);
virtual int DropBoltOn(edict_t &monster, ggBinstC *boltedptr, Vect3 &pos, Vect3 &Direction, int damage, edict_t *attacker = NULL){return damage;}
virtual void FreeKnives(edict_t &monster){}
virtual void SetVocalCordsWorking(bool bCords) {}
body_c();
virtual ~body_c(){}
virtual void MakeRetreatNoise(edict_t &monster){}
virtual float GetLastKilledTime(){return LastKilledTime;};
virtual float GetInitialKilledTime(){return InitialKilledTime;};
virtual void SetLastKilledTime(float time){LastKilledTime = time;};
virtual void SetInitialKilledTime(float time){InitialKilledTime = time;};
virtual int GetLastDFlags(){return LastDFlags;};
virtual void SetLastDFlags(int flags){LastDFlags = flags;};
virtual bool GetTrainDeath(){return TrainDeath;};
virtual void SetTrainDeath(bool condition){TrainDeath = condition;};
virtual int TestDamage(void){return 0;}
virtual int GetClassCode(void){return BODY;}//this should be different for everybody in this class family
virtual int IsMovementImpeded(void){return 0;}
static body_c *NewClassForCode(int code);
void SetOwner(edict_t *own) { owner = own; }
body_c(body_c *orig);
virtual void Evaluate(body_c *orig);
virtual void Write(void) { assert(0); }
virtual void Read(void) { assert(0); }
};
// skins for bloodying the cockpit after the gunner or pilot gets sniped
#define HC_SKIN_GUNNER 1
#define HC_SKIN_PILOT 2
#define HC_SKIN_BOTH 3
class body_heli : public body_c
{
private:
edict_t *m_heli;
gg_binst_c_ptr m_gunBarrelInst;
gg_binst_c_ptr m_gunBarrelNULLInst;
gg_binst_c_ptr m_gunnerHeadInst;
gg_binst_c_ptr m_pilotHeadInst;
gg_binst_c_ptr m_cockpitInst;
gg_binst_c_ptr m_mainRotorInst;
gg_binst_c_ptr m_tailRotorInst;
gg_obj_c_ptr m_fuselageObj;
gg_obj_c_ptr m_gunBarrelObj;
gg_obj_c_ptr m_mainRotorObj;
gg_obj_c_ptr m_tailRotorObj;
GhoulID m_gunBolt;
GhoulID m_gunNULLBolt;
GhoulID m_gunnerHeadBolt;
GhoulID m_pilotHeadBolt;
gg_binst_c_ptr m_mainRotorBoltInst;
gg_binst_c_ptr m_tailRotorBoltInst;
vec3_t m_vGunBoltOffset;
vec3_t m_vGunnerBoltOffset;
vec3_t m_vPilotBoltOffset;
int m_nCanopyHealth; // for use with sniper rifle shots
qboolean m_bPilotDead;
qboolean m_bGunnerDead;
bool m_bFiring; // used by Cobra2_ToggleGun
bool m_bCanBeSniped;
public:
// kef -- gotta make a lot of the heli's member variables public for now cuz
//it'd take about 57 man-months to change Ste's movement code to access them
//through public functions
vec3_t m_v3HeliDesiredPos_Start;
vec3_t m_v3HeliDesiredPos_Stop;
vec3_t m_v3HeliDesiredPos_Halfway;
vec3_t m_v3HeliPadRestPos;
vec3_t m_v3HeliFireAtCoords;
vec3_t m_v3HeliDesiredPos_Smart;
vec3_t m_v3HeliHeadStop;
vec3_t m_v3HeliTraceMins;
vec3_t m_v3HeliTraceMaxs;
vec3_t m_v3HeliDeathDest;
float m_fHeliTurnStartYaw;
float m_fHeliMoveSpeed;
float m_fHeliFireAtTimer;
float m_fHeliFirePitch;
float m_fHeliHoverTimer;
int m_iHeliHealth;
float m_fRotorSoundTimer;
vec3_t m_v3HeliFireAtCoords_Original;//
float m_fHeliAITimer;//
int m_iHeliAITable;//
int m_iHeliAIIndex;//
float m_fLastDamageTime;
float m_fHeliRocketFireDebounceTime;
int m_iHeliRocketsLeft; // 0..HELI_MAX_ROCKETS
int m_nRandGunWait;
qboolean m_bGunFiring;
qboolean m_bLOS;
qboolean m_bRotorEOS;
qboolean m_bFuselageEOS;
// variables passed into script actions
edict_t *m_target;
vec3_t m_vPos;
float m_fArg;
int m_flags;
// vars for heli's internal keep-itself-busy-when-not-scripted AI...
//
int m_iLastEntFoundIndex;
float m_fLastGetEntTime;
edict_t *m_AITarget;
float m_fNewTargetTimer;
float m_fSideStrafeDist; //
int m_iSideStrafeDir; // 0,1,2,3 clockwise from North
int m_iWhichRandVolume; // for AI type 3 logic
float m_fAIAggressiveness; // this needs to actually be set somewhere in the spawner, should be in range 0..10
body_heli() {}
body_heli(edict_t* self);
int GetFlags() { return m_flags; }
virtual void SetFlags(edict_t & monster, int newflags) { m_flags = newflags; }
edict_t *GetHeliEdict() { return m_heli; }
void SetHeliEdict(edict_t *monster);
void SetBarrelInst(ggBinstC* inst) { m_gunBarrelInst = inst; }
void SetBarrelNULLInst(ggBinstC* inst) { m_gunBarrelNULLInst = inst; }
void SetGunnerInst(ggBinstC* inst) { m_gunnerHeadInst = inst; }
void SetPilotInst(ggBinstC* inst) { m_pilotHeadInst = inst; }
void SetCockpitInst(ggBinstC* inst) { m_cockpitInst = inst; }
void SetMainRotorInst(ggBinstC* inst) { m_mainRotorInst = inst; }
void SetTailRotorInst(ggBinstC* inst) { m_tailRotorInst = inst; }
void SetFuselageObj(ggObjC* obj) { m_fuselageObj = obj; }
void SetBarrelObj(ggObjC* obj) { m_gunBarrelObj = obj; }
void SetMainRotorObj(ggObjC* obj) { m_mainRotorObj = obj; }
void SetTailRotorObj(ggObjC* obj) { m_tailRotorObj = obj; }
void SetBarrelBolt(GhoulID bolt) { m_gunBolt = bolt; }
void SetBarrelNULLBolt(GhoulID bolt) { m_gunNULLBolt = bolt; }
void SetGunnerBolt(GhoulID bolt) { m_gunnerHeadBolt = bolt; }
void SetPilotBolt(GhoulID bolt) { m_pilotHeadBolt = bolt; }
void SetMainRotorBoltInst(ggBinstC* inst) { m_mainRotorBoltInst = inst; }
void SetTailRotorBoltInst(ggBinstC* inst) { m_tailRotorBoltInst = inst; }
void SetGunBoltOffset(vec3_t vOffset) { VectorCopy(vOffset, m_vGunBoltOffset); }
void SetGunBoltOffset(float x, float y, float z) { VectorSet(m_vGunBoltOffset, x, y, z); }
void SetGunnerBoltOffset(vec3_t vOffset) { VectorCopy(vOffset, m_vGunnerBoltOffset); }
void SetGunnerBoltOffset(float x, float y, float z) { VectorSet(m_vGunnerBoltOffset, x, y, z); }
void SetPilotBoltOffset(vec3_t vOffset) { VectorCopy(vOffset, m_vPilotBoltOffset); }
void SetPilotBoltOffset(float x, float y, float z) { VectorSet(m_vPilotBoltOffset, x, y, z); }
IGhoulInst* GetHeliInst() { if (m_heli) return m_heli->ghoulInst; return NULL; }
IGhoulInst* GetBarrelInst() { if (m_gunBarrelInst) return m_gunBarrelInst->GetInstPtr(); return NULL;}
IGhoulInst* GetBarrelNULLInst() { if (m_gunBarrelNULLInst) return m_gunBarrelNULLInst->GetInstPtr(); return NULL;}
IGhoulInst* GetGunnerInst() { if (m_gunnerHeadInst) return m_gunnerHeadInst->GetInstPtr(); return NULL;}
IGhoulInst* GetPilotInst() { if (m_pilotHeadInst) return m_pilotHeadInst->GetInstPtr(); return NULL; }
IGhoulInst* GetCockpitInst() { if (m_cockpitInst) return m_cockpitInst->GetInstPtr(); return NULL;}
IGhoulInst* GetMainRotorInst() { if (m_mainRotorInst) return m_mainRotorInst->GetInstPtr(); return NULL;}
IGhoulInst* GetTailRotorInst() { if (m_tailRotorInst) return m_tailRotorInst->GetInstPtr(); return NULL;}
ggObjC* GetFuselageObj() { return m_fuselageObj; }
ggObjC* GetBarrelObj() { return m_gunBarrelObj; }
ggObjC* GetMainRotorObj() { return m_mainRotorObj; }
ggObjC* GetTailRotorObj() { return m_tailRotorObj; }
GhoulID GetBarrelBolt() { return m_gunBolt; }
GhoulID GetBarrelNULLBolt() { return m_gunNULLBolt; }
GhoulID GetGunnerBolt() { return m_gunnerHeadBolt; }
GhoulID GetPilotBolt() { return m_pilotHeadBolt; }
ggBinstC* GetMainRotorBoltInst() { return m_mainRotorBoltInst; }
ggBinstC* GetTailRotorBoltInst() { return m_tailRotorBoltInst; }
void GetGunBoltOffset(vec3_t vOut) { VectorCopy(m_vGunBoltOffset, vOut); }
void GetGunnerBoltOffset(vec3_t vOut) { VectorCopy(m_vGunnerBoltOffset, vOut); }
void GetPilotBoltOffset(vec3_t vOut) { VectorCopy(m_vPilotBoltOffset, vOut); }
qboolean SetRotorEOS(qboolean b) { qboolean bOld = m_bRotorEOS; m_bRotorEOS = b; return bOld; }
qboolean GetRotorEOS() { return m_bRotorEOS; }
qboolean SetFuselageEOS(qboolean b) { qboolean bOld = m_bFuselageEOS; m_bFuselageEOS = b; return bOld; }
qboolean GetFuselageEOS() { return m_bFuselageEOS; }
void SetPosStart(vec3_t vPos) { VectorCopy(vPos, m_v3HeliDesiredPos_Start); }
void SetPosStop(vec3_t vPos) { VectorCopy(vPos, m_v3HeliDesiredPos_Stop); }
void SetPosHalfway(vec3_t vPos) { VectorCopy(vPos, m_v3HeliDesiredPos_Halfway); }
void GetPosStart(vec3_t vPos) { VectorCopy(m_v3HeliDesiredPos_Start, vPos); }
void GetPosStop(vec3_t vPos) { VectorCopy(m_v3HeliDesiredPos_Stop, vPos); }
void GetPosHalfway(vec3_t vPos) { VectorCopy(m_v3HeliDesiredPos_Halfway, vPos); }
void SetStartYaw(float fYaw) { m_fHeliTurnStartYaw = fYaw; }
float GetStartYaw() { return m_fHeliTurnStartYaw; }
virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb);
virtual void UpdateSmoke(edict_t* self, float fHealthPercentage);
void ResetScriptParams() {m_target = NULL; VectorSet(m_vPos,0,0,0); m_fArg = 0;}
qboolean IsPilotDead() { return m_bPilotDead; }
qboolean IsGunnerDead() { return m_bGunnerDead; }
void ChangeCockpitSkin(int nSkin);
void SetFiring(bool bFiring);
bool IsFiring() { return m_bFiring; }
void SetSnipeability(bool bSnipeable) { m_bCanBeSniped = bSnipeable; }
bool IsSnipeable() { return m_bCanBeSniped; }
virtual int GetClassCode(void){return BODY_HELI;}//this should be different for everybody in this class family
static body_heli *NewClassForCode(int code);
body_heli(body_heli *orig);
virtual void Evaluate(body_heli *orig);
virtual void Write();
virtual void Read();
};
class body_tank : public body_c
{
public:
// variables passed into script actions
edict_t *m_target;
vec3_t m_vPos;
float m_fArg;
protected:
edict_t *m_tank; // the tank body is the root object (hopefully)
gg_binst_c_ptr m_turretInst; // the turret
gg_binst_c_ptr m_cannonInst; // the barrel of the main gun
gg_binst_c_ptr m_machGunInst; // the machine gun on the turret
gg_binst_c_ptr m_machGunNullInst; // between machine gun and the turret
gg_obj_c_ptr m_tankObj;
gg_obj_c_ptr m_turretObj;
GhoulID m_turretBolt;
GhoulID m_cannonBolt;
GhoulID m_machGunBolt;
GhoulID m_machGunNullBolt;
gg_binst_c_ptr m_turretBoltInst;
bool m_bDeactivated;
bool m_bTreads;
bool m_bTreadFire;
float m_fLastDamageTime;
float m_fMaxYawSpeed;
float m_fMaxFwdSpeed;
float m_fTurretSpeed;
float m_fCannonSpeed;
float m_fMachGunSpeed;
float m_fShellFlightDist;
int m_nMachGunHealth;
vec3_t m_vGroundZero;
public:
body_tank() {}
body_tank(edict_t* self);
void SetTankEdict(edict_t *monster);
void SetTurretInst(ggBinstC* inst) { m_turretInst = inst; }
void SetCannonInst(ggBinstC* inst) { m_cannonInst = inst; }
void SetMachGunInst(ggBinstC* inst) { m_machGunInst = inst; }
void SetMachGunNullInst(ggBinstC* inst) { m_machGunNullInst = inst; }
void SetTankObj(ggObjC* obj) { m_tankObj = obj; }
void SetTurretObj(ggObjC* obj) { m_turretObj = obj; }
void SetTurretBolt(GhoulID bolt) { m_turretBolt = bolt; }
void SetCannonBolt(GhoulID bolt) { m_cannonBolt = bolt; }
void SetMachGunBolt(GhoulID bolt) { m_machGunBolt = bolt; }
void SetMachGunNullBolt(GhoulID bolt) { m_machGunNullBolt = bolt; }
void SetTurretBoltInst(ggBinstC* inst) { m_turretBoltInst = inst; }
edict_t* GetTankEdict() { return m_tank; }
IGhoulInst* GetTankInst() { if (m_tank) return m_tank->ghoulInst; return NULL; }
IGhoulInst* GetTurretInst() { if (m_turretInst) return m_turretInst->GetInstPtr(); return NULL;}
IGhoulInst* GetCannonInst() { if (m_cannonInst) return m_cannonInst->GetInstPtr(); return NULL;}
IGhoulInst* GetMachGunInst() { if (m_machGunInst) return m_machGunInst->GetInstPtr(); return NULL;}
IGhoulInst* GetMachGunNullInst() { if (m_machGunNullInst) return m_machGunNullInst->GetInstPtr(); return NULL;}
ggObjC* GetTankObj() { return m_tankObj; }
ggObjC* GetTurretObj() { return m_turretObj; }
GhoulID GetTurretBolt() { return m_turretBolt; }
GhoulID GetCannonBolt() { return m_cannonBolt; }
GhoulID GetMachGunBolt() { return m_machGunBolt; }
GhoulID GetMachGunNullBolt() { return m_machGunNullBolt; }
ggBinstC* GetTurretBoltInst() { return m_turretBoltInst;}
virtual void SetTreads(bool bOn);
bool GetTreads() { return m_bTreads; }
void SetTreadFire(bool bOn) { m_bTreadFire = bOn; }
bool GetTreadFire() { return m_bTreadFire; }
virtual void Deactivate(bool bDeactivate) { m_bDeactivated = bDeactivate; }
bool IsDeactivated() { return m_bDeactivated; }
virtual int ShowDamage (edict_t &monster, edict_t *inflictor, edict_t *attacker, vec3_t dir, vec3_t point, vec3_t origin, int damage, int knockback, int dflags, int mod, float penetrate, float absorb);
virtual void UpdateSmoke(edict_t* self, float fHealthPercentage);
void ResetScriptParams() {m_target = NULL; VectorSet(m_vPos,0,0,0); m_fArg = 0;}
float GetMaxYawSpeed() { return m_fMaxYawSpeed; } // degrees
float GetMaxFwdSpeed() { return m_fMaxFwdSpeed; } // tank speed
float GetTurretSpeed() { return m_fTurretSpeed; } // yaw, in radians
float GetCannonSpeed() { return m_fCannonSpeed; } // pitch, in radians
float GetMachGunSpeed() { return m_fMachGunSpeed; } // pitch and yaw, in radians
float GetCurProjectileDist() { return m_fShellFlightDist; }
void SetCurProjectileDist(float fDist) { m_fShellFlightDist = fDist; }
void GetGroundZero(vec3_t vPos) { VectorCopy(m_vGroundZero, vPos); }
void SetGroundZero(vec3_t vPos) { VectorCopy(vPos, m_vGroundZero); }
bool IsMachGunFunctioning() { return (m_nMachGunHealth > 0); }
virtual int GetClassCode(void){return BODY_TANK;}//this should be different for everybody in this class family
static body_tank *NewClassForCode(int code);
body_tank(body_tank *orig);
virtual void Evaluate(body_tank *orig);
virtual void Write();
virtual void Read();
};
class body_snowcat : public body_tank
{
private:
gg_binst_c_ptr m_machGun2Inst; // the machine gun on the turret
gg_binst_c_ptr m_leftHeadLightInst; // left headlight beam
gg_binst_c_ptr m_rightHeadLightInst; // right headlight beam
GhoulID m_machGun2Bolt;
GhoulID m_leftHeadLightBolt;
GhoulID m_rightHeadLightBolt;
public:
body_snowcat() {}
body_snowcat(edict_t* self);
virtual void SetTreads(bool bOn);
void SetMachGun2Inst(ggBinstC* inst) { m_machGun2Inst = inst; }
void SetMachGun2Bolt(GhoulID bolt) { m_machGun2Bolt = bolt; }
void SetLeftHeadLightInst(ggBinstC* inst) { m_leftHeadLightInst = inst; }
void SetLeftHeadLightBolt(GhoulID bolt) { m_leftHeadLightBolt = bolt; }
void SetRightHeadLightInst(ggBinstC* inst) { m_rightHeadLightInst = inst; }
void SetRightHeadLightBolt(GhoulID bolt) { m_rightHeadLightBolt = bolt; }
IGhoulInst* GetMachGun2Inst() { if (m_machGun2Inst) return m_machGun2Inst->GetInstPtr(); return NULL;}
IGhoulInst* GetLeftHeadLightInst() { if (m_leftHeadLightInst) return m_leftHeadLightInst->GetInstPtr(); return NULL;}
IGhoulInst* GetRightHeadLightInst() { if (m_rightHeadLightInst) return m_rightHeadLightInst->GetInstPtr(); return NULL;}
GhoulID GetMachGun2Bolt() { return m_machGun2Bolt; }
GhoulID GetLeftHeadLightBolt() { return m_leftHeadLightBolt; }
GhoulID GetRightHeadLightBolt() { return m_rightHeadLightBolt; }
virtual void UpdateSmoke(edict_t* self, float fHealthPercentage);
virtual void Deactivate(bool bDeactivate);
virtual int GetClassCode(void){return BODY_SNOWCAT;}//this should be different for everybody in this class family
static body_snowcat *NewClassForCode(int code);
body_snowcat(body_snowcat *orig);
virtual void Evaluate(body_snowcat *orig);
virtual void Write();
virtual void Read();
};
// end