Gamemodes:
- Madness now fully reimplemented - Standard and Stealth hunting now finished - New gamemode Invasion, where scientists work together to kill off all players (WIP) Major thanks to @eukara for his help, time, and patienece
This commit is contained in:
parent
9c5339e262
commit
4aca5e6540
3 changed files with 76 additions and 44 deletions
|
@ -63,6 +63,7 @@ class SHTeamRules:HLGameRules
|
||||||
|
|
||||||
class SHRules:HLGameRules
|
class SHRules:HLGameRules
|
||||||
{
|
{
|
||||||
|
void(void) SHRules;
|
||||||
virtual void(void) RegisterSciDeath;
|
virtual void(void) RegisterSciDeath;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -124,5 +125,17 @@ typedef enum
|
||||||
SHMODE_INVASION
|
SHMODE_INVASION
|
||||||
} shmode_e;
|
} shmode_e;
|
||||||
|
|
||||||
|
/* give our gamemode cvar a default */
|
||||||
var shmode_e autocvar_sh_realistic = SHMODE_SLAUGHTER;
|
var shmode_e autocvar_sh_realistic = SHMODE_SLAUGHTER;
|
||||||
var shmode_e g_chosen_mode;
|
var shmode_e g_chosen_mode;
|
||||||
|
|
||||||
|
/* limit the amount of scientists that can spawn by default */
|
||||||
|
var int autocvar_sh_scimax = 5;
|
||||||
|
|
||||||
|
var int autocvar_sh_scialert = FALSE;
|
||||||
|
|
||||||
|
/* default speed for scientists */
|
||||||
|
var int autocvar_sh_scispeed = 40;
|
||||||
|
|
||||||
|
/* an override for sh_scimax */
|
||||||
|
var int autocvarsh_scimax_override = 0;
|
|
@ -81,6 +81,7 @@ HLGameRules::PlayerDeath(NSClientPlayer pl)
|
||||||
pl.gflags &= ~GF_FLASHLIGHT;
|
pl.gflags &= ~GF_FLASHLIGHT;
|
||||||
pl.gflags &= ~GF_EGONBEAM;
|
pl.gflags &= ~GF_EGONBEAM;
|
||||||
pl.gflags &= ~GF_MADNESS;
|
pl.gflags &= ~GF_MADNESS;
|
||||||
|
pl.poisonTimer.StopTimer();
|
||||||
|
|
||||||
sh_pl.sh_insaneactive = 0.0f;
|
sh_pl.sh_insaneactive = 0.0f;
|
||||||
|
|
||||||
|
@ -372,6 +373,24 @@ HLGameRules::InitPostEnts(void)
|
||||||
void
|
void
|
||||||
HLGameRules::HLGameRules(void)
|
HLGameRules::HLGameRules(void)
|
||||||
{
|
{
|
||||||
|
/* HACK we'll set this here for now to ensure we don't
|
||||||
|
* have a race condition */
|
||||||
|
forceinfokey(world, "sci_count", "0");
|
||||||
|
|
||||||
|
/* if the previous map set this value but the current doesn't
|
||||||
|
* then set the default */
|
||||||
|
cvar_set("sh_scispeed","40");
|
||||||
|
|
||||||
|
/* just re-read this to prevent funny beahviour */
|
||||||
|
readcmd(sprintf("exec maps/%s.cfg\n", mapname));
|
||||||
|
|
||||||
|
/* always broadcast how many max scientists the server has set
|
||||||
|
* but allow an override for server admins */
|
||||||
|
if (cvar("sh_scimax_override") > 0) {
|
||||||
|
forceinfokey(world, "sv_scimax", cvar_string("sh_scimax_override"));
|
||||||
|
} else {
|
||||||
|
forceinfokey(world, "sv_scimax", cvar_string("sh_scimax"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TEAMPLAY ONLY LOGIC */
|
/* TEAMPLAY ONLY LOGIC */
|
||||||
|
@ -393,6 +412,8 @@ SHTeamRules::PlayerSpawn(NSClientPlayer cl)
|
||||||
if (cl.team != 0)
|
if (cl.team != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* auto-balance
|
||||||
|
* TODO make this a command instead */
|
||||||
for (entity e = world; (e = find( e, ::classname, "player"));) {
|
for (entity e = world; (e = find( e, ::classname, "player"));) {
|
||||||
if (e == cl)
|
if (e == cl)
|
||||||
continue;
|
continue;
|
||||||
|
@ -422,18 +443,6 @@ SHTeamRules::ScientistKill(NSClientPlayer cl, entity sci)
|
||||||
AddTeam1Kill();
|
AddTeam1Kill();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
SHTeamRules::ScientistKillFear(NSClientPlayer cl, entity sci)
|
|
||||||
{
|
|
||||||
super::ScientistKill(cl, sci);
|
|
||||||
|
|
||||||
if (cl.team == 2)
|
|
||||||
RemoveTeam2Kill();
|
|
||||||
else if (cl.team == 1)
|
|
||||||
AddTeam1Kill();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
SHTeamRules::AddTeam1Kill(void)
|
SHTeamRules::AddTeam1Kill(void)
|
||||||
{
|
{
|
||||||
|
@ -448,46 +457,31 @@ SHTeamRules::AddTeam2Kill(void)
|
||||||
forceinfokey(world, "teamkills_2", sprintf("%i", m_iKillsTeam2));
|
forceinfokey(world, "teamkills_2", sprintf("%i", m_iKillsTeam2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* teamplay scientist death tracking */
|
||||||
void
|
void
|
||||||
SHTeamRules::RemoveTeam1Kill(void)
|
SHTeamRules::RegisterSciDeath(void)
|
||||||
{
|
|
||||||
m_iKillsTeam1--;
|
|
||||||
forceinfokey(world, "teamkills_1", sprintf("%i", m_iKillsTeam1));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SHTeamRules::RemoveTeam2Kill(void)
|
|
||||||
{
|
|
||||||
m_iKillsTeam2--;
|
|
||||||
forceinfokey(world, "teamkills_2", sprintf("%i", m_iKillsTeam2));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SHTeamRules::RegisterSciDeathHuntTeam(void)
|
|
||||||
{
|
{
|
||||||
super::RegisterSciDeath();
|
super::RegisterSciDeath();
|
||||||
|
|
||||||
|
/* if no scientists are left then stop */
|
||||||
if (m_iScientistsAlive > 0)
|
if (m_iScientistsAlive > 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
switch (g_chosen_mode) {
|
/* award the kill to the appropiate team */
|
||||||
case SHMODE_STANDARD:
|
if (m_iKillsTeam1 > m_iKillsTeam2) {
|
||||||
if (m_iKillsTeam1 > m_iKillsTeam2) {
|
m_iScoreTeam1++;
|
||||||
m_iScoreTeam1++;
|
env_message_broadcast("Red team has won!");
|
||||||
env_message_broadcast("Red team has won!");
|
} else if (m_iKillsTeam1 > m_iKillsTeam2) {
|
||||||
} else if (m_iKillsTeam1 > m_iKillsTeam2) {
|
m_iScoreTeam2++;
|
||||||
m_iScoreTeam2++;
|
env_message_broadcast("Blue team has won!");
|
||||||
env_message_broadcast("Blue team has won!");
|
} else {
|
||||||
} else {
|
env_message_broadcast("Both teams are tied!");
|
||||||
env_message_broadcast("Both teams are tied!");
|
|
||||||
}
|
|
||||||
|
|
||||||
forceinfokey(world, "teamscore_1", sprintf("%i", m_iScoreTeam1));
|
|
||||||
forceinfokey(world, "teamscore_2", sprintf("%i", m_iScoreTeam2));
|
|
||||||
think = RestartRound;
|
|
||||||
nextthink = time + 5.0f;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
forceinfokey(world, "teamscore_1", sprintf("%i", m_iScoreTeam1));
|
||||||
|
forceinfokey(world, "teamscore_2", sprintf("%i", m_iScoreTeam2));
|
||||||
|
think = RestartRound;
|
||||||
|
nextthink = time + 5.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -519,3 +513,25 @@ SHTeamRules::SHTeamRules(void)
|
||||||
m_iKillsTeam1 = 0;
|
m_iKillsTeam1 = 0;
|
||||||
m_iKillsTeam2 = 0;
|
m_iKillsTeam2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* invasion scientist death tracking */
|
||||||
|
void
|
||||||
|
SHRules::RegisterSciDeath(void)
|
||||||
|
{
|
||||||
|
super::RegisterSciDeath();
|
||||||
|
|
||||||
|
/* if no scientists are left then we win */
|
||||||
|
if (m_iScientistsAlive > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
env_message_broadcast("You have survived!\nCan you do it again?");
|
||||||
|
|
||||||
|
think = RestartRound;
|
||||||
|
nextthink = time + 5.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
SHRules::SHRules(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -35,6 +35,9 @@ Game_InitRules(void)
|
||||||
case SHMODE_MADNESS:
|
case SHMODE_MADNESS:
|
||||||
g_grMode = spawn(SHGameMadness);
|
g_grMode = spawn(SHGameMadness);
|
||||||
break;
|
break;
|
||||||
|
case SHMODE_INVASION:
|
||||||
|
g_grMode = spawn(SHGameInvasion);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
g_grMode = spawn(HLGameRules);
|
g_grMode = spawn(HLGameRules);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue