// ***************************************************************************** // dm_private.h // ------------ // Deathmatch stuff that's for the private use of dm.cpp and dm_????.cpp. // ***************************************************************************** // Player icon enumerations. enum { TC_BLACK, TC_BRIGHT_GREEN, TC_BRIGHT_YELLOW, TC_BRIGHT_RED, }; const float REALISTIC_MOVESCALE = 0.5625; extern int countPlayers(void); extern qboolean IsFemale(edict_t *ent); extern void setPlayernameColor(edict_t &ent,edict_t &other,byte color); // 12/28/99 kef -- declared in CWeaponInfo.h, class Pickup replaces itemSpawnInfo_t. and there was much rejoicing. class Pickup; /* ============ player_dmInfo_c ============ */ class player_dmInfo_c:public player_dmInfo_ic { public: }; /* ============ player_dmassassinInfo_c ============ */ class player_dmassassinInfo_c:public player_dmInfo_c { private: edict_t const *assassinTarget; edict_t const *deferedAssassinTarget; public: player_dmassassinInfo_c(){assassinTarget=deferedAssassinTarget=NULL;} edict_t const *getTarget(void){return((assassinTarget)?(assassinTarget):NULL);} void setTarget(edict_t const *Targ){assassinTarget = deferedAssassinTarget = Targ;} edict_t const *getDeferedTarget(void){return((deferedAssassinTarget)?(deferedAssassinTarget):NULL);} void setDeferedTarget(edict_t const *deferedTarg){deferedAssassinTarget = deferedTarg;} }; /* ============ player_dmarsenalInfo_c ============ */ class player_dmarsenalInfo_c:public player_dmInfo_c { private: char inventory[1024]; public: player_dmarsenalInfo_c(){memset(inventory,0,sizeof(inventory));} char *invString(void){return(inventory);} }; /* ============ player_dmrealInfo_c ============ */ class player_dmrealInfo_c:public player_dmInfo_c { private: protected: int fatigue; qboolean i_am_fatigued; public: player_dmrealInfo_c(){fatigue=0;i_am_fatigued=false;} int getFatigueVal(void){return (fatigue);} void setFatigueVal(int newFatigue){fatigue=newFatigue;} qboolean getFatigued(void){return (i_am_fatigued);} void setFatigued(qboolean fatigued){i_am_fatigued=fatigued;} }; /* ============ gamerules_c ============ */ class gamerules_c { protected: FILE *filePtr; virtual void clientSetDroppedItemThink(edict_t *ent); virtual void clientSetDroppedWeaponThink(edict_t *ent); public: virtual int isDM(void){return(1);} virtual void preLevelInit(void){} virtual void levelInit(void){} virtual char *getGameName(void){return("");} virtual int checkItemSpawn(edict_t *ent,Pickup **pickup){return(0);} virtual int checkItemAfterSpawn(edict_t *ent,Pickup *pickup){return(0);} virtual void checkEvents(void){}; virtual void respawnUntouchedItem(edict_t *ent) {} virtual void setRespawn(edict_t *ent, float delay); virtual int getMaxEncumbrance(void){return 0;} virtual void AssignTeam(edict_t *ent, char *userinfo){}; virtual void ClearFlagCount(void){}; virtual void FlagCaptured(team_t team){}; virtual bool CaptureLimitHit(int limit){return false;}; virtual void openLogFile(void); virtual void closeLogFile(void); virtual int dmRule_NO_HEALTH(void){return(0);} virtual int dmRule_NO_ITEMS(void){return(0);} virtual int dmRule_WEAPONS_STAY(void){return(0);} virtual int dmRule_NO_FALLING(void){return(0);} virtual int dmRule_REALISTIC_DAMAGE(void){return(0);} virtual int dmRule_SAME_LEVEL(void){return(0);} virtual int dmRule_NOWEAPRELOAD(void){return(0);} virtual int dmRule_TEAMPLAY(void){return(0);}; virtual int dmRule_NO_FRIENDLY_FIRE(void){return(0);} virtual int dmRule_FORCE_RESPAWN(void){return(0);} virtual int dmRule_NO_ARMOR(void){return(0);} virtual int dmRule_INFINITE_AMMO(void){return(0);} virtual int dmRule_SPINNINGPICKUPS(void){return(0);} virtual int dmRule_FORCEJOIN(void){return(0);} virtual int dmRule_ARMOR_PROTECT(void){return(0);} virtual int dmRule_BULLET_WPNS_ONLY(void){return(0);} virtual int arePlayerNamesOn(void){return(0);} virtual int arePlayerTeamsOn(void){return(0);} virtual int allowAutoWeaponSwitch(void){return(1);} virtual void initPlayerDMInfo(edict_t &ent){}; virtual void registerPlayerIcons(void){}; virtual float clientCalculateWaver(edict_t &ent, int atkID); virtual void clientConnect(edict_t &ent); virtual void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer){}; virtual void clientDieWeaponHandler(edict_t *ent); virtual void clientPreDisconnect(edict_t &ent){}; virtual void clientDisconnect(edict_t &ent){closeLogFile();}; virtual void clientDropItem(edict_t *ent,int type,int ammoCount); virtual void clientDropWeapon(edict_t *ent,int type, int clipSize); virtual float clientGetMovescale(edict_t *ent); virtual void clientEndFrame(edict_t *ent){}; virtual void clientHandlePredn(edict_t &ent); virtual void clientHelpMessage(edict_t *ent){}; virtual void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker); virtual void clientRespawn(edict_t &ent){}; virtual void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); virtual void clientStealthAndFatigueMeter(edict_t *ent){}; virtual bool IsUnprotectedGoreZone(gz_code zone); virtual bool IsLimbZone(gz_code zone); virtual void HitByAttacker(edict_t *body, edict_t *attacker){}; virtual bool IsShootableWeapon(char *weaponname); }; /* ============ dmnone_c ============ */ class dmnone_c:public gamerules_c { public: int isDM(void){return 0;} void levelInit(void){gi.SP_Register("singleplr");} char *getGameName(void){return("single player");} int checkItemSpawn(edict_t *ent,Pickup **pickup){return(-1);} int getMaxEncumbrance(void); void openLogFile(void){}; void closeLogFile(void){}; void clientConnect(edict_t &ent){}; void clientDropItem(edict_t *ent,int type,int ammoCount); void clientDropWeapon(edict_t *ent,int type, int clipSize); float clientGetMovescale(edict_t *ent); void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker){}; void clientRespawn(edict_t &ent); void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file){}; void clientStealthAndFatigueMeter(edict_t *ent); float clientCalculateWaver(edict_t &ent, int atkID); }; /* ============ dmstandard_c ============ */ class dmstandard_c:public gamerules_c { public: void levelInit(void); char *getGameName(void); int checkItemSpawn(edict_t *ent,Pickup **pickup); int dmRule_NO_HEALTH(void); int dmRule_NO_ITEMS(void); int dmRule_WEAPONS_STAY(void); int dmRule_NO_FALLING(void); int dmRule_REALISTIC_DAMAGE(void); int dmRule_SAME_LEVEL(void); int dmRule_NOWEAPRELOAD(void); int dmRule_TEAMPLAY(void); int dmRule_NO_FRIENDLY_FIRE(void); int dmRule_FORCE_RESPAWN(void); int dmRule_NO_ARMOR(void); int dmRule_INFINITE_AMMO(void); int dmRule_SPINNINGPICKUPS(void); int dmRule_BULLET_WPNS_ONLY(void); int arePlayerTeamsOn(void){return(dmRule_TEAMPLAY()?-1:0);} void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); void clientRespawn(edict_t &ent); float clientCalculateWaver(edict_t &ent, int atkID); }; /* ============ dmassassin_c ============ */ class dmassassin_c:public gamerules_c { const edict_t *getRandomPlayer(edict_t &ent); void clientConnectAux(edict_t &ent); void clientDisconnectAux(edict_t &ent); public: void levelInit(void); char *getGameName(void){return("assassin DM");} int checkItemSpawn(edict_t *ent,Pickup **pickup); int dmRule_NO_HEALTH(void); int dmRule_NO_ITEMS(void); int dmRule_WEAPONS_STAY(void); int dmRule_NO_FALLING(void); int dmRule_REALISTIC_DAMAGE(void); int dmRule_SAME_LEVEL(void); int dmRule_NOWEAPRELOAD(void); int dmRule_FORCE_RESPAWN(void); int dmRule_NO_ARMOR(void); int dmRule_INFINITE_AMMO(void); int dmRule_SPINNINGPICKUPS(void); int dmRule_BULLET_WPNS_ONLY(void); int arePlayerNamesOn(void){return 1;} void initPlayerDMInfo(edict_t &ent); void registerPlayerIcons(void); void clientConnect(edict_t &ent); void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); void clientDisconnect(edict_t &ent); void clientEndFrame(edict_t *ent); void clientHelpMessage(edict_t *ent); void clientRespawn(edict_t &ent); void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); }; /* ============ dmarsenal_c ============ */ class dmarsenal_c:public gamerules_c { #define ARSENAL_MAXWEAPONS 6 int weaponForSlot[ARSENAL_MAXWEAPONS]; int firstToOneHit; int resetGame; void setWeapons(void); void giveClientWeapons(edict_t &ent,qboolean newInv); public: void levelInit(void); char *getGameName(void){return("arsenal DM");} int checkItemSpawn(edict_t *ent,Pickup **pickup); void checkEvents(void); int dmRule_NO_HEALTH(void); int dmRule_NO_ITEMS(void); int dmRule_NO_FALLING(void); int dmRule_REALISTIC_DAMAGE(void); int dmRule_SAME_LEVEL(void); int dmRule_NOWEAPRELOAD(void) { return(1); } int dmRule_FORCE_RESPAWN(void); int dmRule_NO_ARMOR(void); int dmRule_INFINITE_AMMO(void) { return(1); } void initPlayerDMInfo(edict_t &ent); void clientConnect(edict_t &ent); void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); void clientDieWeaponHandler(edict_t *ent); void clientDropItem(edict_t *ent,int type,int ammoCount){}; void clientDropWeapon(edict_t *ent,int type, int clipSize){}; void clientHelpMessage(edict_t *ent); void clientRespawn(edict_t &ent); void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); }; /* ============ dmreal_c ============ */ class dmreal_c:public gamerules_c { const edict_t *getRandomPlayer(edict_t &ent); private: float m_maxUntouchedTime; float m_itemRetryTime; multimap m_spawnPoints; protected: void clientSetDroppedWeaponThink(edict_t *ent); public: virtual ~dmreal_c(); void preLevelInit(void); void levelInit(void); char *getGameName(void){return("real DM");} int checkItemSpawn(edict_t *ent,Pickup **pickup); int checkItemAfterSpawn(edict_t *ent,Pickup *pickup); void respawnUntouchedItem(edict_t *ent); void setRespawn(edict_t *ent, float delay); int getMaxEncumbrance(void){return dmRule_REALISTIC_DAMAGE()?4:3;} int dmRule_REALISTIC_DAMAGE(void){return 1;} int dmRule_SAME_LEVEL(void); int dmRule_TEAMPLAY(void); int dmRule_FORCE_RESPAWN(void); int dmRule_SPINNINGPICKUPS(void); int dmRule_BULLET_WPNS_ONLY(void); int allowAutoWeaponSwitch(void){return(0);} void initPlayerDMInfo(edict_t &ent); float clientCalculateWaver(edict_t &ent, int atkID); void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); float clientGetMovescale(edict_t *ent); void clientRespawn(edict_t &ent); void clientStealthAndFatigueMeter(edict_t *ent); void clientPreDisconnect(edict_t &ent); void clientDisconnect(edict_t &ent); int arePlayerTeamsOn(void){return(dmRule_TEAMPLAY()?-1:0);} }; /* ============ dmctf_c ============ */ class dmctf_c:public gamerules_c { private: edict_t *FindFlagEdict(int team); int num_blue_skins; int num_red_skins; team_t CompareSkin(char *skinname, char* teamname); int NumOfSkins(char *teamname); void FindSkin(char *teamname, int skinnum); char NewSkin[100]; int blue_collected; int red_collected; public: char *getGameName(void){return("CTF DM");} int checkItemSpawn(edict_t *ent,Pickup **pickup); void levelInit(void); void AssignTeam(edict_t *ent, char *userinfo); void FlagCaptured(team_t team); void ClearFlagCount(void); bool CaptureLimitHit(int limit); int dmRule_NO_HEALTH(void); int dmRule_NO_ITEMS(void); int dmRule_WEAPONS_STAY(void); int dmRule_NO_FALLING(void); int dmRule_REALISTIC_DAMAGE(void); int dmRule_SAME_LEVEL(void); int dmRule_NOWEAPRELOAD(void); int dmRule_TEAMPLAY(void){return (1);}; int dmRule_NO_FRIENDLY_FIRE(void); int dmRule_FORCE_RESPAWN(void); int dmRule_NO_ARMOR(void); int dmRule_INFINITE_AMMO(void); int dmRule_SPINNINGPICKUPS(void); int dmRule_BULLET_WPNS_ONLY(void); int dmRule_FORCEJOIN(void); int arePlayerTeamsOn(void){return(1);} void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer); void clientRespawn(edict_t &ent); void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file); void clientDropItem(edict_t *ent,int type,int ammoCount); void clientDisconnect(edict_t &ent); void HitByAttacker(edict_t *body, edict_t *attacker); }; /* ============ gamemode_c ============ */ class gamemode_c:public gamemode_ic { private: int gametype; gamerules_c *rules; public: void setDMMode(int newtype); int isDM(void){return rules->isDM();} void preLevelInit(void){rules->preLevelInit();} void levelInit(void){rules->levelInit();} char *getGameName(void){return(rules->getGameName());} int checkItemSpawn(edict_t *ent,Pickup **pickup){return(rules->checkItemSpawn(ent,pickup));} int checkItemAfterSpawn(edict_t *ent,Pickup *pickup){return(rules->checkItemAfterSpawn(ent,pickup));} void checkEvents(void){rules->checkEvents();} void respawnUntouchedItem(edict_t *ent) {rules->respawnUntouchedItem(ent);} void setRespawn(edict_t *ent, float delay) {rules->setRespawn(ent, delay);} int getMaxEncumbrance(void){return (rules->getMaxEncumbrance());} void AssignTeam(edict_t *ent, char* userinfo){rules->AssignTeam(ent, userinfo);} void ClearFlagCount(void){rules->ClearFlagCount();}; void FlagCaptured(team_t team){rules->FlagCaptured(team);}; bool CaptureLimitHit(int limit){return(rules->CaptureLimitHit(limit));}; int dmRule_NO_HEALTH(void){return (rules->dmRule_NO_HEALTH());} int dmRule_NO_ITEMS(void){return (rules->dmRule_NO_ITEMS());} int dmRule_WEAPONS_STAY(void){return (rules->dmRule_WEAPONS_STAY());} int dmRule_NO_FALLING(void){return (rules->dmRule_NO_FALLING());} int dmRule_REALISTIC_DAMAGE(void){return (rules->dmRule_REALISTIC_DAMAGE());} int dmRule_SAME_LEVEL(void){return (rules->dmRule_SAME_LEVEL());} int dmRule_NOWEAPRELOAD(void){return (rules->dmRule_NOWEAPRELOAD());} int dmRule_TEAMPLAY(void){return (rules->dmRule_TEAMPLAY());} int dmRule_NO_FRIENDLY_FIRE(void){return (rules->dmRule_NO_FRIENDLY_FIRE());} int dmRule_FORCE_RESPAWN(void){return (rules->dmRule_FORCE_RESPAWN());} int dmRule_NO_ARMOR(void){return (rules->dmRule_NO_ARMOR());} int dmRule_INFINITE_AMMO(void){return (rules->dmRule_INFINITE_AMMO());} int dmRule_SPINNINGPICKUPS(void){return (rules->dmRule_SPINNINGPICKUPS());} int dmRule_FORCEJOIN(void){return (rules->dmRule_FORCEJOIN());} int dmRule_ARMOR_PROTECT(void){return (rules->dmRule_ARMOR_PROTECT());} int dmRule_BULLET_WPNS_ONLY(void){return (rules->dmRule_BULLET_WPNS_ONLY());} int arePlayerNamesOn(void){return (rules->arePlayerNamesOn());} int arePlayerTeamsOn(void){return (rules->arePlayerTeamsOn());} int allowAutoWeaponSwitch(void){return (rules->allowAutoWeaponSwitch());} float clientCalculateWaver(edict_t &ent, int atkID) { return rules->clientCalculateWaver(ent, atkID);} void clientConnect(edict_t &ent){rules->initPlayerDMInfo(ent);rules->clientConnect(ent);} void clientDie(edict_t &ent, edict_t &inflictor, edict_t &killer){rules->clientDie(ent, inflictor, killer);} void clientDieWeaponHandler(edict_t *ent){rules->clientDieWeaponHandler(ent);} void clientPreDisconnect(edict_t &ent){rules->clientPreDisconnect(ent);} void clientDisconnect(edict_t &ent){rules->clientDisconnect(ent);} void clientDropItem(edict_t *ent,int type,int ammoCount){rules->clientDropItem(ent,type,ammoCount);} void clientDropWeapon(edict_t *ent,int type, int clipSize){rules->clientDropWeapon(ent,type, clipSize);} void clientEndFrame(edict_t *ent){rules->clientEndFrame(ent);} float clientGetMovescale(edict_t *ent) { return rules->clientGetMovescale(ent);} void clientHandlePredn(edict_t &ent){rules->clientHandlePredn(ent);} void clientHelpMessage(edict_t *ent){rules->clientHelpMessage(ent);} void clientObituary(edict_t *self, edict_t *inflictor, edict_t *attacker){rules->clientObituary(self,inflictor,attacker);} void clientRespawn(edict_t &ent){rules->clientRespawn(ent);} void clientScoreboardMessage(edict_t *ent, edict_t *killer, qboolean log_file){rules->clientScoreboardMessage(ent,killer,log_file);} void clientStealthAndFatigueMeter(edict_t *ent){rules->clientStealthAndFatigueMeter(ent);} bool IsUnprotectedGoreZone(gz_code zone) { return rules->IsUnprotectedGoreZone(zone); } bool IsLimbZone(gz_code zone) { return rules->IsLimbZone(zone); } void HitByAttacker(edict_t *body, edict_t *attacker){rules->HitByAttacker(body, attacker);} bool IsShootableWeapon(char *weaponname){return rules->IsShootableWeapon(weaponname);} };