mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 09:11:48 +00:00
More gametype rules yay!!
This commit is contained in:
parent
7bfdc2caa0
commit
ea5e0d28ed
11 changed files with 74 additions and 49 deletions
|
@ -2512,7 +2512,7 @@ static void CL_RemovePlayer(INT32 playernum, INT32 reason)
|
|||
|
||||
if (G_TagGametype()) //Check if you still have a game. Location flexible. =P
|
||||
P_CheckSurvivors();
|
||||
else if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
else if (gametyperules & GTR_RACE)
|
||||
P_CheckRacers();
|
||||
}
|
||||
|
||||
|
|
|
@ -1125,7 +1125,7 @@ UINT8 CanChangeSkin(INT32 playernum)
|
|||
return true;
|
||||
|
||||
// Can change skin during initial countdown.
|
||||
if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE)
|
||||
if ((gametyperules & GTR_RACE) && leveltime < 4*TICRATE)
|
||||
return true;
|
||||
|
||||
if (G_TagGametype())
|
||||
|
@ -2413,7 +2413,7 @@ static void Command_Teamchange_f(void)
|
|||
}
|
||||
|
||||
//additional check for hide and seek. Don't allow change of status after hidetime ends.
|
||||
if (gametype == GT_HIDEANDSEEK && leveltime >= (hidetime * TICRATE))
|
||||
if ((gametyperules & GTR_HIDETIMEFROZEN) && leveltime >= (hidetime * TICRATE))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Hiding time expired; no Hide and Seek status changes allowed!\n"));
|
||||
return;
|
||||
|
@ -2510,7 +2510,7 @@ static void Command_Teamchange2_f(void)
|
|||
}
|
||||
|
||||
//additional check for hide and seek. Don't allow change of status after hidetime ends.
|
||||
if (gametype == GT_HIDEANDSEEK && leveltime >= (hidetime * TICRATE))
|
||||
if ((gametyperules & GTR_HIDETIMEFROZEN) && leveltime >= (hidetime * TICRATE))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Hiding time expired; no Hide and Seek status changes allowed!\n"));
|
||||
return;
|
||||
|
@ -2639,7 +2639,7 @@ static void Command_ServerTeamChange_f(void)
|
|||
}
|
||||
|
||||
//additional check for hide and seek. Don't allow change of status after hidetime ends.
|
||||
if (gametype == GT_HIDEANDSEEK && leveltime >= (hidetime * TICRATE))
|
||||
if ((gametyperules & GTR_HIDETIMEFROZEN) && leveltime >= (hidetime * TICRATE))
|
||||
{
|
||||
CONS_Alert(CONS_NOTICE, M_GetText("Hiding time expired; no Hide and Seek status changes allowed!\n"));
|
||||
return;
|
||||
|
@ -2728,6 +2728,10 @@ static void Got_Teamchange(UINT8 **cp, INT32 playernum)
|
|||
return;
|
||||
}
|
||||
|
||||
//no status changes after hidetime
|
||||
if ((gametyperules & GTR_HIDETIMEFROZEN) && (leveltime >= (hidetime * TICRATE)))
|
||||
error = true;
|
||||
|
||||
//Make sure that the right team number is sent. Keep in mind that normal clients cannot change to certain teams in certain gametypes.
|
||||
switch (gametype)
|
||||
{
|
||||
|
|
|
@ -411,12 +411,26 @@ enum GameType
|
|||
// Game type rules
|
||||
enum GameTypeRules
|
||||
{
|
||||
GTR_PLATFORM = 1, // Co-op, Competition, Race
|
||||
GTR_TAG = 1<<1, // Tag, Hide and Seek
|
||||
GTR_RINGSLINGER = 1<<2, // Not Co-op, not Competition, and not Race (overriden by cv_ringslinger)
|
||||
GTR_SPECTATORS = 1<<3, // Not Co-op, not Competition, and not Race
|
||||
GTR_TEAMS = 1<<4, // Team Match, CTF
|
||||
GTR_LIVES = 1<<5, // A lot of special cases in G_GametypeUsesLives actually, but just Co-op and Competition
|
||||
GTR_PLATFORM = 1, // Co-op, Competition, and Race
|
||||
GTR_TAG = 1<<1, // Tag and Hide and Seek
|
||||
GTR_RINGSLINGER = 1<<2, // Not Co-op, not Competition, and not Race (overriden by cv_ringslinger)
|
||||
GTR_SPECTATORS = 1<<3, // Not Co-op, not Competition, and not Race
|
||||
GTR_TEAMS = 1<<4, // Team Match, CTF
|
||||
GTR_LIVES = 1<<5, // A lot of special cases in G_GametypeUsesLives actually, but just Co-op and Competition
|
||||
GTR_RACE = 1<<6, // Race and Competition
|
||||
|
||||
// Lactozilla
|
||||
// Awesome! Those are new game type rules
|
||||
// provided by yours truly to allow for more
|
||||
// flexibility! Those will replace some
|
||||
// straight-up gametype checks scattered
|
||||
// around the source code!
|
||||
GTR_CHASECAM = 1<<7, // Prefer chasecam at map load
|
||||
GTR_TIMELIMIT = 1<<8, // Ringslinger time limit
|
||||
GTR_HIDETIME = 1<<9, // Tag and Hide and Seek
|
||||
GTR_HIDETIMEFROZEN = 1<<10, // Hide and Seek, but not Tag
|
||||
GTR_BLINDFOLDED = 1<<11, // Blindfolded view for Tag and Hide and Seek
|
||||
GTR_EMERALDS = 1<<12, // Ringslinger emeralds
|
||||
};
|
||||
|
||||
// String names for gametypes
|
||||
|
|
28
src/g_game.c
28
src/g_game.c
|
@ -1002,7 +1002,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics)
|
|||
// why build a ticcmd if we're paused?
|
||||
// Or, for that matter, if we're being reborn.
|
||||
// ...OR if we're blindfolded. No looking into the floor.
|
||||
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK)
|
||||
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && (player->playerstate == PST_REBORN || ((gametyperules & GTR_TAG)
|
||||
&& (leveltime < hidetime * TICRATE) && (player->pflags & PF_TAGIT)))))
|
||||
{
|
||||
cmd->angleturn = (INT16)(localangle >> 16);
|
||||
|
@ -3061,17 +3061,25 @@ const char *Gametype_Names[NUMGAMETYPES] =
|
|||
// Game type rules
|
||||
INT16 gametypedefaultrules[NUMGAMETYPES] =
|
||||
{
|
||||
GTR_PLATFORM|GTR_LIVES, // GT_COOP
|
||||
GTR_PLATFORM|GTR_LIVES, // GT_COMPETITION
|
||||
GTR_PLATFORM, // GT_RACE
|
||||
// Co-op
|
||||
GTR_PLATFORM|GTR_LIVES|GTR_CHASECAM,
|
||||
// Competition
|
||||
GTR_PLATFORM|GTR_LIVES|GTR_RACE|GTR_CHASECAM,
|
||||
// Race
|
||||
GTR_PLATFORM|GTR_RACE|GTR_CHASECAM,
|
||||
|
||||
GTR_RINGSLINGER|GTR_SPECTATORS, // GT_MATCH
|
||||
GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS, // GT_TEAMMATCH
|
||||
// Match
|
||||
GTR_RINGSLINGER|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_EMERALDS,
|
||||
// Team Match
|
||||
GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS|GTR_TIMELIMIT,
|
||||
|
||||
GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS, // GT_TAG
|
||||
GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS, // GT_HIDEANDSEEK
|
||||
// Tag
|
||||
GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_HIDETIME|GTR_BLINDFOLDED,
|
||||
// Hide and Seek
|
||||
GTR_RINGSLINGER|GTR_TAG|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_HIDETIME|GTR_BLINDFOLDED,
|
||||
|
||||
GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS // GT_CTF
|
||||
// CTF
|
||||
GTR_RINGSLINGER|GTR_TEAMS|GTR_SPECTATORS|GTR_TIMELIMIT|GTR_EMERALDS,
|
||||
};
|
||||
|
||||
//
|
||||
|
@ -3384,7 +3392,7 @@ static void G_DoCompleted(void)
|
|||
I_Error("Followed map %d to invalid map %d\n", prevmap + 1, nextmap + 1);
|
||||
|
||||
// wrap around in race
|
||||
if (nextmap >= 1100-1 && nextmap <= 1102-1 && (gametype == GT_RACE || gametype == GT_COMPETITION))
|
||||
if (nextmap >= 1100-1 && nextmap <= 1102-1 && (gametyperules & GTR_RACE))
|
||||
nextmap = (INT16)(spstage_start-1);
|
||||
|
||||
if ((gottoken = (gametype == GT_COOP && token)))
|
||||
|
|
|
@ -2978,7 +2978,7 @@ static inline void P_NiGHTSDamage(mobj_t *target, mobj_t *source)
|
|||
player->flyangle += 180; // Shuffle's BETTERNIGHTSMOVEMENT?
|
||||
player->flyangle %= 360;
|
||||
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
player->drillmeter -= 5*20;
|
||||
else
|
||||
{
|
||||
|
|
|
@ -615,7 +615,7 @@ static void P_DoTailsCarry(player_t *sonic, player_t *tails)
|
|||
// Why block opposing teams from tailsflying each other?
|
||||
// Sneaking into the hands of a flying tails player in Race might be a viable strategy, who knows.
|
||||
/*
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION
|
||||
if ((gametyperules & GTR_RACE)
|
||||
|| (netgame && (tails->spectator || sonic->spectator))
|
||||
|| (G_TagGametype() && (!(tails->pflags & PF_TAGIT) != !(sonic->pflags & PF_TAGIT)))
|
||||
|| (gametype == GT_MATCH)
|
||||
|
|
|
@ -11702,7 +11702,7 @@ You should think about modifying the deathmatch starts to take full advantage of
|
|||
if (!cv_powerstones.value)
|
||||
return;
|
||||
|
||||
if (!(gametype == GT_MATCH || gametype == GT_CTF))
|
||||
if (!(gametyperules & GTR_EMERALDS))
|
||||
return;
|
||||
|
||||
runemeraldmanager = true;
|
||||
|
@ -11722,7 +11722,7 @@ You should think about modifying the deathmatch starts to take full advantage of
|
|||
// Yeah, this is a dirty hack.
|
||||
if ((mobjinfo[i].flags & (MF_MONITOR|MF_GRENADEBOUNCE)) == MF_MONITOR)
|
||||
{
|
||||
if (gametype == GT_COMPETITION || gametype == GT_RACE)
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
// Set powerup boxes to user settings for competition.
|
||||
if (cv_competitionboxes.value == 1) // Mystery
|
||||
|
|
|
@ -2683,8 +2683,7 @@ boolean P_SetupLevel(boolean skipprecip)
|
|||
|
||||
// chasecam on in chaos, race, coop
|
||||
// chasecam off in match, tag, capture the flag
|
||||
chase = (gametype == GT_RACE || gametype == GT_COMPETITION || gametype == GT_COOP)
|
||||
|| (maptol & TOL_2D);
|
||||
chase = (gametyperules & GTR_CHASECAM) || (maptol & TOL_2D);
|
||||
|
||||
if (!dedicated)
|
||||
{
|
||||
|
|
|
@ -7224,7 +7224,7 @@ void P_SpawnSpecials(INT32 fromnetsave)
|
|||
break;
|
||||
|
||||
case 308: // Race-only linedef executor. Triggers once.
|
||||
if (gametype != GT_RACE && gametype != GT_COMPETITION)
|
||||
if (!(gametyperules & GTR_RACE))
|
||||
lines[i].special = 0;
|
||||
break;
|
||||
|
||||
|
|
24
src/p_user.c
24
src/p_user.c
|
@ -387,7 +387,7 @@ UINT8 P_FindLowestMare(void)
|
|||
mobj_t *mo2;
|
||||
UINT8 mare = UINT8_MAX;
|
||||
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
return 0;
|
||||
|
||||
// scan the thinkers
|
||||
|
@ -793,7 +793,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
|
|||
P_RestoreMusic(player);
|
||||
}
|
||||
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
if (player->drillmeter < 48*20)
|
||||
player->drillmeter = 48*20;
|
||||
|
@ -2181,7 +2181,7 @@ void P_DoPlayerExit(player_t *player)
|
|||
|
||||
if (cv_allowexitlevel.value == 0 && !G_PlatformGametype())
|
||||
return;
|
||||
else if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow
|
||||
else if (gametyperules & GTR_RACE) // If in Race Mode, allow
|
||||
{
|
||||
if (!countdown) // a 60-second wait ala Sonic 2.
|
||||
countdown = (cv_countdowntime.value - 1)*TICRATE + 1; // Use cv_countdowntime
|
||||
|
@ -4670,7 +4670,7 @@ static void P_DoSpinAbility(player_t *player, ticcmd_t *cmd)
|
|||
if (player->powers[pw_carry] == CR_BRAKGOOP)
|
||||
player->dashspeed = 0;
|
||||
|
||||
if (!((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE))
|
||||
if (!((gametyperules & GTR_RACE) && leveltime < 4*TICRATE))
|
||||
{
|
||||
if (player->dashspeed)
|
||||
{
|
||||
|
@ -7137,7 +7137,7 @@ static void P_NiGHTSMovement(player_t *player)
|
|||
&& !player->exiting)
|
||||
player->nightstime--;
|
||||
}
|
||||
else if (gametype != GT_RACE && gametype != GT_COMPETITION
|
||||
else if (!(gametyperules & GTR_RACE)
|
||||
&& !(player->mo->state >= &states[S_PLAY_NIGHTS_TRANS1]
|
||||
&& player->mo->state <= &states[S_PLAY_NIGHTS_TRANS6])
|
||||
&& !(player->capsule && player->capsule->reactiontime)
|
||||
|
@ -7293,7 +7293,7 @@ static void P_NiGHTSMovement(player_t *player)
|
|||
{
|
||||
player->mo->momx = player->mo->momy = 0;
|
||||
|
||||
if (gametype != GT_RACE && gametype != GT_COMPETITION)
|
||||
if (!(gametyperules & GTR_RACE))
|
||||
P_SetObjectMomZ(player->mo, FRACUNIT/2, (P_MobjFlip(player->mo)*player->mo->momz >= 0));
|
||||
else
|
||||
player->mo->momz = 0;
|
||||
|
@ -9535,12 +9535,12 @@ static void P_DeathThink(player_t *player)
|
|||
player->playerstate = PST_REBORN;
|
||||
}
|
||||
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION || (gametype == GT_COOP && (multiplayer || netgame)))
|
||||
if ((gametyperules & GTR_RACE) || (gametype == GT_COOP && (multiplayer || netgame)))
|
||||
{
|
||||
// Keep time rolling in race mode
|
||||
if (!(countdown2 && !countdown) && !player->exiting && !(player->pflags & PF_GAMETYPEOVER) && !stoppedclock)
|
||||
{
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
if (leveltime >= 4*TICRATE)
|
||||
player->realtime = leveltime - 4*TICRATE;
|
||||
|
@ -11372,7 +11372,7 @@ void P_PlayerThink(player_t *player)
|
|||
I_Error("player %s is in PST_REBORN\n", sizeu1(playeri));
|
||||
#endif
|
||||
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
INT32 i;
|
||||
|
||||
|
@ -11435,7 +11435,7 @@ void P_PlayerThink(player_t *player)
|
|||
player->exiting > 0 && player->exiting <= 1*TICRATE &&
|
||||
(!multiplayer || gametype == GT_COOP ? !mapheaderinfo[gamemap-1]->musinterfadeout : true) &&
|
||||
// don't fade if we're fading during intermission. follows Y_StartIntermission intertype = int_coop
|
||||
(gametype == GT_RACE || gametype == GT_COMPETITION ? countdown2 == 0 : true) && // don't fade on timeout
|
||||
((gametyperules & GTR_RACE) ? countdown2 == 0 : true) && // don't fade on timeout
|
||||
player->lives > 0 && // don't fade on game over (competition)
|
||||
P_IsLocalPlayer(player))
|
||||
{
|
||||
|
@ -11550,7 +11550,7 @@ void P_PlayerThink(player_t *player)
|
|||
player->lives = cv_startinglives.value;
|
||||
}
|
||||
|
||||
if ((gametype == GT_RACE || gametype == GT_COMPETITION) && leveltime < 4*TICRATE)
|
||||
if ((gametyperules & GTR_RACE) && leveltime < 4*TICRATE)
|
||||
{
|
||||
cmd->buttons &= BT_USE; // Remove all buttons except BT_USE
|
||||
cmd->forwardmove = 0;
|
||||
|
@ -11560,7 +11560,7 @@ void P_PlayerThink(player_t *player)
|
|||
// Synchronizes the "real" amount of time spent in the level.
|
||||
if (!player->exiting && !stoppedclock)
|
||||
{
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
if (leveltime >= 4*TICRATE)
|
||||
player->realtime = leveltime - 4*TICRATE;
|
||||
|
|
|
@ -694,7 +694,7 @@ static void ST_drawTime(void)
|
|||
else
|
||||
{
|
||||
// Counting down the hidetime?
|
||||
if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && (stplyr->realtime <= (hidetime*TICRATE)))
|
||||
if ((gametyperules & GTR_HIDETIME) && (stplyr->realtime <= (hidetime*TICRATE)))
|
||||
{
|
||||
tics = (hidetime*TICRATE - stplyr->realtime);
|
||||
if (tics < 3*TICRATE)
|
||||
|
@ -705,11 +705,11 @@ static void ST_drawTime(void)
|
|||
else
|
||||
{
|
||||
// Hidetime finish!
|
||||
if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && (stplyr->realtime < ((hidetime+1)*TICRATE)))
|
||||
if ((gametyperules & GTR_HIDETIME) && (stplyr->realtime < ((hidetime+1)*TICRATE)))
|
||||
ST_drawRaceNum(hidetime*TICRATE - stplyr->realtime);
|
||||
|
||||
// Time limit?
|
||||
if (gametype != GT_COOP && gametype != GT_RACE && gametype != GT_COMPETITION && cv_timelimit.value && timelimitintics > 0)
|
||||
if ((gametyperules & GTR_TIMELIMIT) && cv_timelimit.value && timelimitintics > 0)
|
||||
{
|
||||
if (timelimitintics > stplyr->realtime)
|
||||
{
|
||||
|
@ -723,7 +723,7 @@ static void ST_drawTime(void)
|
|||
downwards = true;
|
||||
}
|
||||
// Post-hidetime normal.
|
||||
else if (gametype == GT_TAG || gametype == GT_HIDEANDSEEK)
|
||||
else if (gametyperules & GTR_TAG)
|
||||
tics = stplyr->realtime - hidetime*TICRATE;
|
||||
// "Shadow! What are you doing? Hurry and get back here
|
||||
// right now before the island blows up with you on it!"
|
||||
|
@ -912,7 +912,7 @@ static void ST_drawLivesArea(void)
|
|||
else if (stplyr->spectator)
|
||||
v_colmap = V_GRAYMAP;
|
||||
// Tag
|
||||
else if (gametype == GT_TAG || gametype == GT_HIDEANDSEEK)
|
||||
else if (gametyperules & GTR_TAG)
|
||||
{
|
||||
if (stplyr->pflags & PF_TAGIT)
|
||||
{
|
||||
|
@ -1762,7 +1762,7 @@ static void ST_drawNiGHTSHUD(void)
|
|||
ST_drawNiGHTSLink();
|
||||
}
|
||||
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
{
|
||||
ST_drawScore();
|
||||
ST_drawTime();
|
||||
|
@ -2273,7 +2273,7 @@ static void ST_drawTextHUD(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && (!stplyr->spectator))
|
||||
else if ((gametyperules & GTR_TAG) && (!stplyr->spectator))
|
||||
{
|
||||
if (leveltime < hidetime * TICRATE)
|
||||
{
|
||||
|
@ -2648,7 +2648,7 @@ static void ST_overlayDrawer(void)
|
|||
ST_drawMatchHUD();
|
||||
|
||||
// Race HUD Stuff
|
||||
if (gametype == GT_RACE || gametype == GT_COMPETITION)
|
||||
if (gametyperules & GTR_RACE)
|
||||
ST_drawRaceHUD();
|
||||
|
||||
// Emerald Hunt Indicators
|
||||
|
@ -2753,7 +2753,7 @@ void ST_Drawer(void)
|
|||
if (rendermode != render_none) ST_doPaletteStuff();
|
||||
|
||||
// Blindfold!
|
||||
if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK)
|
||||
if ((gametyperules & GTR_BLINDFOLDED)
|
||||
&& (leveltime < hidetime * TICRATE))
|
||||
{
|
||||
if (players[displayplayer].pflags & PF_TAGIT)
|
||||
|
|
Loading…
Reference in a new issue