g_game and g_input now compile

This commit is contained in:
Sally Coolatta 2020-08-13 00:05:44 -04:00
parent 9a21b3a46b
commit 6ef0af4ba5
24 changed files with 209 additions and 890 deletions

View file

@ -436,24 +436,6 @@ typedef enum
//}
#define WEP_AUTO 1
#define WEP_BOUNCE 2
#define WEP_SCATTER 3
#define WEP_GRENADE 4
#define WEP_EXPLODE 5
#define WEP_RAIL 6
#define NUM_WEAPONS 7
typedef enum
{
RW_AUTO = 1,
RW_BOUNCE = 2,
RW_SCATTER = 4,
RW_GRENADE = 8,
RW_EXPLODE = 16,
RW_RAIL = 32
} ringweapons_t;
// player_t struct for all respawn variables
typedef struct respawnvars_s
{

View file

@ -11469,15 +11469,6 @@ struct {
{"CR_NONE",CR_NONE},
{"CR_ZOOMTUBE",CR_ZOOMTUBE},
// Ring weapons (ringweapons_t)
// Useful for A_GiveWeapon
{"RW_AUTO",RW_AUTO},
{"RW_BOUNCE",RW_BOUNCE},
{"RW_SCATTER",RW_SCATTER},
{"RW_GRENADE",RW_GRENADE},
{"RW_EXPLODE",RW_EXPLODE},
{"RW_RAIL",RW_RAIL},
// Character flags (skinflags_t)
{"SF_HIRES",SF_HIRES},
{"SF_MACHINE",SF_MACHINE},
@ -11580,15 +11571,6 @@ struct {
{"PA_ABILITY2",PA_ABILITY2},
{"PA_RIDE",PA_RIDE},
// Current weapon
{"WEP_AUTO",WEP_AUTO},
{"WEP_BOUNCE",WEP_BOUNCE},
{"WEP_SCATTER",WEP_SCATTER},
{"WEP_GRENADE",WEP_GRENADE},
{"WEP_EXPLODE",WEP_EXPLODE},
{"WEP_RAIL",WEP_RAIL},
{"NUM_WEAPONS",NUM_WEAPONS},
// Value for infinite lives
{"INFLIVES",INFLIVES},

View file

@ -98,8 +98,8 @@ extern boolean savemoddata; // This mod saves time/emblem data.
extern boolean imcontinuing; // Temporary flag while continuing
extern boolean metalrecording;
#define ATTACKING_NONE 0
#define ATTACKING_RECORD 1
#define ATTACKING_NONE 0
#define ATTACKING_TIME 1
#define ATTACKING_CAPSULES 2
extern UINT8 modeattacking;
@ -684,7 +684,6 @@ extern SINT8 votes[MAXPLAYERS];
extern SINT8 pickedvote;
extern UINT32 timesBeaten; // # of times the game has been beaten.
extern UINT32 timesBeatenWithEmeralds;
// ===========================
// Internal parameters, fixed.

View file

@ -1101,9 +1101,6 @@ void F_GameEvaluationTicker(void)
{
++timesBeaten;
if (ALL7EMERALDS(emeralds))
++timesBeatenWithEmeralds;
if (M_UpdateUnlockablesAndExtraEmblems())
S_StartSound(NULL, sfx_s3k68);

View file

@ -1952,7 +1952,7 @@ void G_BeginRecording(void)
{
case ATTACKING_NONE: // 0
break;
case ATTACKING_RECORD: // 1
case ATTACKING_TIME: // 1
demotime_p = demo_p;
WRITEUINT32(demo_p,UINT32_MAX); // time
WRITEUINT32(demo_p,UINT32_MAX); // lap
@ -2824,7 +2824,7 @@ void G_DoPlayDemo(char *defdemoname)
{
case ATTACKING_NONE: // 0
break;
case ATTACKING_RECORD: // 1
case ATTACKING_TIME: // 1
hu_demotime = READUINT32(demo_p);
hu_demolap = READUINT32(demo_p);
break;
@ -3157,7 +3157,7 @@ void G_AddGhost(char *defdemoname)
{
case ATTACKING_NONE: // 0
break;
case ATTACKING_RECORD: // 1
case ATTACKING_TIME: // 1
p += 8; // demo time, lap
break;
case ATTACKING_CAPSULES: // 2
@ -3370,7 +3370,7 @@ void G_UpdateStaffGhostName(lumpnum_t l)
{
case ATTACKING_NONE: // 0
break;
case ATTACKING_RECORD: // 1
case ATTACKING_TIME: // 1
p += 8; // demo time, lap
break;
case ATTACKING_CAPSULES: // 2

View file

@ -45,7 +45,6 @@
#include "y_inter.h"
#include "v_video.h"
#include "lua_hook.h"
#include "lua_libs.h" // gL (Lua state)
#include "k_bot.h"
#include "m_cond.h" // condition sets
#include "lua_hud.h"
@ -87,8 +86,8 @@ UINT32 mapmusresume;
INT16 gamemap = 1;
UINT32 maptol;
UINT8 globalweather = 0;
INT32 curWeather = PRECIP_NONE;
UINT8 globalweather = PRECIP_NONE;
UINT8 curWeather = PRECIP_NONE;
precipprops_t precipprops[MAXPRECIP] =
{
@ -153,17 +152,13 @@ INT16 bootmap; //bootmap for loading a map on startup
INT16 tutorialmap = 0; // map to load for tutorial
boolean tutorialmode = false; // are we in a tutorial right now?
INT32 tutorialgcs = gcs_custom; // which control scheme is loaded?
INT32 tutorialusemouse = 0; // store cv_usemouse user value
INT32 tutorialfreelook = 0; // store cv_alwaysfreelook user value
INT32 tutorialmousemove = 0; // store cv_mousemove user value
INT32 tutorialanalog = 0; // store cv_analog[0] user value
boolean looptitle = true;
UINT16 skincolor_redteam = SKINCOLOR_RED;
UINT16 skincolor_blueteam = SKINCOLOR_BLUE;
UINT16 skincolor_redring = SKINCOLOR_RASPBERRY;
UINT16 skincolor_bluering = SKINCOLOR_CORNFLOWER;
UINT16 skincolor_bluering = SKINCOLOR_PERIWINKLE;
tic_t countdowntimer = 0;
boolean countdowntimeup = false;
@ -329,8 +324,6 @@ static INT16 randmapbuffer[NUMMAPS+1]; // Buffer for maps RandMap is allowed to
// Grading
UINT32 timesBeaten;
UINT32 timesBeatenWithEmeralds;
//UINT32 timesBeatenUltimate;
typedef struct joystickvector2_s
{
@ -365,8 +358,6 @@ static CV_PossibleValue_t joyaxis_cons_t[] = {{0, "None"},
"More Axis Sets"
#endif
static CV_PossibleValue_t deadzone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
// don't mind me putting these here, I was lazy to figure out where else I could put those without blowing up the compiler.
// chat timer thingy
@ -458,6 +449,7 @@ consvar_t cv_driftaxis[MAXSPLITSCREENPLAYERS] = {
{"joyaxis4_drift", "Z-Rudder", CV_SAVE, joyaxis_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
};
static CV_PossibleValue_t zerotoone_cons_t[] = {{0, "MIN"}, {FRACUNIT, "MAX"}, {0, NULL}};
consvar_t cv_deadzone[MAXSPLITSCREENPLAYERS] = {
{"joy_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
{"joy2_deadzone", "0.125", CV_FLOAT|CV_SAVE, zerotoone_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL},
@ -531,11 +523,10 @@ tic_t G_GetBestLap(INT16 map)
// G_UpdateRecordReplays
//
// Update replay files/data, etc. for Record Attack
// See G_SetNightsRecords for NiGHTS Attack.
//
static void G_UpdateRecordReplays(void)
{
const size_t glen = strlen(srb2home)+1+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
const size_t glen = strlen(srb2home)+1+strlen("media")+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
char *gpath;
char lastdemo[256], bestdemo[256];
UINT8 earnedEmblems;
@ -544,36 +535,49 @@ static void G_UpdateRecordReplays(void)
if (!mainrecords[gamemap-1])
G_AllocMainRecordData(gamemap-1);
if (players[consoleplayer].score > mainrecords[gamemap-1]->score)
mainrecords[gamemap-1]->score = players[consoleplayer].score;
if (players[consoleplayer].pflags & PF_GAMETYPEOVER)
{
players[consoleplayer].realtime = UINT32_MAX;
}
if ((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time))
if (((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time))
&& (players[consoleplayer].realtime < UINT32_MAX)) // DNF
{
mainrecords[gamemap-1]->time = players[consoleplayer].realtime;
}
if ((UINT16)(players[consoleplayer].rings) > mainrecords[gamemap-1]->rings)
mainrecords[gamemap-1]->rings = (UINT16)(players[consoleplayer].rings);
if (modeattacking == ATTACKING_TIME)
{
if ((mainrecords[gamemap-1]->lap == 0) || (bestlap < mainrecords[gamemap-1]->lap))
mainrecords[gamemap-1]->lap = bestlap;
}
else
{
mainrecords[gamemap-1]->lap = 0;
}
// Save demo!
bestdemo[255] = '\0';
lastdemo[255] = '\0';
G_SetDemoTime(players[consoleplayer].realtime, players[consoleplayer].score, (UINT16)(players[consoleplayer].rings));
G_SetDemoTime(players[consoleplayer].realtime, bestlap);
G_CheckDemoStatus();
I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755);
I_mkdir(va("%s"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder), 0755);
gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s",
srb2home, timeattackfolder);
M_MkdirEach(gpath, M_PathParts(gpath) - 3, 0755);
if ((gpath = malloc(glen)) == NULL)
I_Error("Out of memory for replay filepath\n");
sprintf(gpath,"%s"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(gamemap));
snprintf(lastdemo, 255, "%s-%s-last.lmp", gpath, skins[cv_chooseskin.value-1].name);
sprintf(gpath,"%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(gamemap));
snprintf(lastdemo, 255, "%s-%s-last.lmp", gpath, cv_chooseskin.string);
if (FIL_FileExists(lastdemo))
{
UINT8 *buf;
size_t len = FIL_ReadFile(lastdemo, &buf);
snprintf(bestdemo, 255, "%s-%s-time-best.lmp", gpath, skins[cv_chooseskin.value-1].name);
snprintf(bestdemo, 255, "%s-%s-time-best.lmp", gpath, cv_chooseskin.string);
if (!FIL_FileExists(bestdemo) || G_CmpDemoTime(bestdemo, lastdemo) & 1)
{ // Better time, save this demo.
if (FIL_FileExists(bestdemo))
@ -582,22 +586,16 @@ static void G_UpdateRecordReplays(void)
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW RECORD TIME!"), M_GetText("Saved replay as"), bestdemo);
}
snprintf(bestdemo, 255, "%s-%s-score-best.lmp", gpath, skins[cv_chooseskin.value-1].name);
if (!FIL_FileExists(bestdemo) || (G_CmpDemoTime(bestdemo, lastdemo) & (1<<1)))
{ // Better score, save this demo.
if (FIL_FileExists(bestdemo))
remove(bestdemo);
FIL_WriteFile(bestdemo, buf, len);
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW HIGH SCORE!"), M_GetText("Saved replay as"), bestdemo);
}
snprintf(bestdemo, 255, "%s-%s-rings-best.lmp", gpath, skins[cv_chooseskin.value-1].name);
if (!FIL_FileExists(bestdemo) || (G_CmpDemoTime(bestdemo, lastdemo) & (1<<2)))
{ // Better rings, save this demo.
if (FIL_FileExists(bestdemo))
remove(bestdemo);
FIL_WriteFile(bestdemo, buf, len);
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW MOST RINGS!"), M_GetText("Saved replay as"), bestdemo);
if (modeattacking == ATTACKING_TIME)
{
snprintf(bestdemo, 255, "%s-%s-lap-best.lmp", gpath, cv_chooseskin.string);
if (!FIL_FileExists(bestdemo) || G_CmpDemoTime(bestdemo, lastdemo) & (1<<1))
{ // Better lap time, save this demo.
if (FIL_FileExists(bestdemo))
remove(bestdemo);
FIL_WriteFile(bestdemo, buf, len);
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW RECORD LAP!"), M_GetText("Saved replay as"), bestdemo);
}
}
//CONS_Printf("%s '%s'\n", M_GetText("Saved replay as"), lastdemo);
@ -608,10 +606,13 @@ static void G_UpdateRecordReplays(void)
// Check emblems when level data is updated
if ((earnedEmblems = M_CheckLevelEmblems()))
CONS_Printf(M_GetText("\x82" "Earned %hu emblem%s for Record Attack records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
CONS_Printf(M_GetText("\x82" "Earned %hu medal%s for Record Attack records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
// Update timeattack menu's replay availability.
Nextmap_OnChange();
if (M_UpdateUnlockablesAndExtraEmblems())
S_StartSound(NULL, sfx_ncitem);
// SRB2Kart - save here so you NEVER lose your earned times/medals.
G_SaveGameData();
}
// for consistency among messages: this modifies the game and removes savemoddata.
@ -852,9 +853,8 @@ static void G_HandleAxisDeadZone(UINT8 splitnum, joystickvector2_t *joystickvect
INT32 localaiming[MAXSPLITSCREENPLAYERS];
angle_t localangle[MAXSPLITSCREENPLAYERS];
static fixed_t forwardmove[2] = {25<<FRACBITS>>16, 50<<FRACBITS>>16};
static fixed_t sidemove[2] = {2<<FRACBITS>>16, 4<<FRACBITS>>16};
static fixed_t angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
static INT32 forwardmove = 50<<FRACBITS>>16;
static INT32 angleturn[3] = {KART_FULLTURN/2, KART_FULLTURN, KART_FULLTURN/4}; // + slow turn
INT16 ticcmd_oldangleturn[MAXSPLITSCREENPLAYERS];
@ -864,7 +864,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
const INT32 speed = 1;
const INT32 lookaxis = cv_lookaxis[forplayer].value;
const boolean mouseaiming = player->spectator;
const boolean invertmouse = cv_invertmouse.value;
const boolean analogjoystickmove = cv_usejoystick[forplayer].value && !Joystick[forplayer].bGamepadStyle;
const boolean gamepadjoystickmove = cv_usejoystick[forplayer].value && Joystick[forplayer].bGamepadStyle;
@ -874,19 +873,20 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
static boolean keyboard_look[MAXSPLITSCREENPLAYERS]; // true if lookup/down using keyboard
static boolean resetdown[MAXSPLITSCREENPLAYERS]; // don't cam reset every frame
INT32 tspeed, forward, axis, i;
INT32 tspeed, forward, axis;
joystickvector2_t joystickvector;
boolean turnleft, turnright;
player_t *player = &player = &players[g_localplayers[forplayer]];
player_t *player = &players[g_localplayers[forplayer]];
camera_t *thiscam = &camera[forplayer];
angle_t *lang = &localangle[forplayer];
angle_t *laim = &localaiming[forplayer];
INT32 *th = turnheld[forplayer];
INT32 *kbl = keyboard_look[forplayer];
INT32 *rd = resetdown[forplayer];
INT32 *laim = &localaiming[forplayer];
INT32 *th = &turnheld[forplayer];
INT32 *kbl = &keyboard_look[forplayer];
INT32 *rd = &resetdown[forplayer];
const boolean mouseaiming = player->spectator;
if (demo.playback) return;
@ -914,7 +914,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (paused || P_AutoPause() || (gamestate == GS_LEVEL && player->playerstate == PST_REBORN) || hu_resynching)
{
cmd->angleturn = ticcmd_oldangleturn[forplayer];
cmd->aiming = G_ClipAimingPitch(&laim);
cmd->aiming = G_ClipAimingPitch(laim);
return;
}
@ -939,7 +939,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
joystickvector.xaxis = -joystickvector.xaxis;
}
if (gamepadjoystickmove && axis != 0)
if (gamepadjoystickmove && joystickvector.xaxis != 0)
{
turnright = turnright || (joystickvector.xaxis > 0);
turnleft = turnleft || (joystickvector.xaxis < 0);
@ -1078,7 +1078,6 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
(player->mo && (player->mo->eflags & MFE_VERTICALFLIP)
&& (!thiscam->chase)) //because chasecam's not inverted
? -1 : 1; // set to -1 or 1 to multiply
INT32 configlookaxis = ssplayer == 1 ? cv_lookaxis.value : cv_lookaxis2.value;
// mouse look stuff (mouse look is not the same as mouse aim)
if (mouseaiming && player->spectator)
@ -1118,7 +1117,7 @@ void G_BuildTiccmd(ticcmd_t *cmd, INT32 realtics, UINT8 ssplayer)
if (!cv_allowmlook.value)
*laim = 0;
cmd->aiming = G_ClipAimingPitch(&laim);
cmd->aiming = G_ClipAimingPitch(laim);
}
mousex = mousey = mlooky = 0;
@ -1199,10 +1198,11 @@ ticcmd_t *G_MoveTiccmd(ticcmd_t* dest, const ticcmd_t* src, const size_t n)
for (i = 0; i < n; i++)
{
dest[i].forwardmove = src[i].forwardmove;
dest[i].sidemove = src[i].sidemove;
dest[i].angleturn = SHORT(src[i].angleturn);
dest[i].aiming = (INT16)SHORT(src[i].aiming);
dest[i].buttons = (UINT16)SHORT(src[i].buttons);
dest[i].driftturn = SHORT(src[i].driftturn);
dest[i].latency = src[i].latency;
}
return dest;
}
@ -1216,7 +1216,6 @@ void G_DoLoadLevel(boolean resetplayer)
// Make sure objectplace is OFF when you first start the level!
OP_ResetObjectplace();
demosynced = true;
levelstarttic = gametic; // for time calculation
@ -1260,8 +1259,6 @@ void G_DoLoadLevel(boolean resetplayer)
return;
}
P_FindEmerald();
gameaction = ga_nothing;
#ifdef PARANOIA
Z_CheckHeap(-2);
@ -1317,10 +1314,10 @@ void G_StartTitleCard(void)
void G_PreLevelTitleCard(void)
{
#ifndef NOWIPE
tic_t starttime = I_GetTime();
tic_t endtime = starttime + (PRELEVELTIME*NEWTICRATERATIO);
tic_t nowtime = starttime;
tic_t lasttime = starttime;
tic_t strtime = I_GetTime();
tic_t endtime = strtime + (PRELEVELTIME*NEWTICRATERATIO);
tic_t nowtime = strtime;
tic_t lasttime = strtime;
while (nowtime < endtime)
{
// draw loop
@ -1342,28 +1339,11 @@ void G_PreLevelTitleCard(void)
#endif
}
static boolean titlecardforreload = false;
//
// Returns true if the current level has a title card.
//
boolean G_IsTitleCardAvailable(void)
{
// The current level header explicitly disabled the title card.
UINT16 titleflag = LF_NOTITLECARDFIRST;
if (modeattacking != ATTACKING_NONE)
titleflag = LF_NOTITLECARDRECORDATTACK;
else if (titlecardforreload)
titleflag = LF_NOTITLECARDRESPAWN;
if (mapheaderinfo[gamemap-1]->levelflags & titleflag)
return false;
// The current gametype doesn't have a title card.
if (gametyperules & GTR_NOTITLECARD)
return false;
// The current level has no name.
if (!mapheaderinfo[gamemap-1]->lvlttl[0])
return false;
@ -1382,6 +1362,8 @@ static INT32 camtoggledelay[MAXSPLITSCREENPLAYERS];
//
boolean G_Responder(event_t *ev)
{
UINT8 i;
// any other key pops up menu if in demos
if (gameaction == ga_nothing && !demo.quitafterplaying &&
((demo.playback && !modeattacking && !demo.title && !multiplayer) || gamestate == GS_TITLESCREEN))
@ -1630,7 +1612,7 @@ boolean G_CouldView(INT32 playernum)
// SRB2Kart: Only go through players who are actually playing
if (player->exiting)
return false;
if (( player->pflags & PF_TIMEOVER ))
if (( player->pflags & PF_GAMETYPEOVER ))
return false;
// I don't know if we want this actually, but I'll humor the suggestion anyway
@ -2049,7 +2031,6 @@ static inline void G_PlayerFinishLevel(INT32 player)
memset(p->powers, 0, sizeof (p->powers));
memset(p->kartstuff, 0, sizeof (p->kartstuff)); // SRB2kart
p->ringweapons = 0;
p->mo->drawflags &= ~(MFD_TRANSMASK|MFD_BRIGHTMASK); // cancel invisibility
P_FlashPal(p, 0, 0); // Resets
@ -2137,7 +2118,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
INT32 bumper;
INT32 comebackpoints;
INT32 wanted;
INT32 rings;
boolean songcredit = false;
score = players[player].score;
@ -2159,9 +2139,6 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
playerangleturn = players[player].angleturn;
oldrelangleturn = players[player].oldrelangleturn;
if (!betweenmaps)
pflags |= (players[player].pflags & PF_FINISHED);
// As long as we're not in multiplayer, carry over cheatcodes from map to map
if (!(netgame || multiplayer))
pflags |= (players[player].pflags & (PF_GODMODE|PF_NOCLIP|PF_INVIS));
@ -2327,12 +2304,17 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
// Check to make sure their color didn't change somehow...
if (G_GametypeHasTeams())
{
UINT8 i;
if (p->ctfteam == 1 && p->skincolor != skincolor_redteam)
{
for (i = 0; i <= splitscreen; i++)
{
if (p == &players[g_localplayers[i]])
{
CV_SetValue(&cv_playercolor[i], skincolor_redteam);
break;
}
}
}
else if (p->ctfteam == 2 && p->skincolor != skincolor_blueteam)
@ -2340,7 +2322,10 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps)
for (i = 0; i <= splitscreen; i++)
{
if (p == &players[g_localplayers[i]])
{
CV_SetValue(&cv_playercolor[i], skincolor_blueteam);
break;
}
}
}
}
@ -2436,7 +2421,7 @@ void G_SpawnPlayer(INT32 playernum)
void G_MovePlayerToSpawnOrStarpost(INT32 playernum)
{
if (players[playernum].starposttime)
if (players[playernum].starpostnum)
P_MovePlayerToStarpost(playernum);
else
P_MovePlayerToSpawn(playernum, G_FindMapStart(playernum));
@ -2449,7 +2434,7 @@ mapthing_t *G_FindTeamStart(INT32 playernum)
if (!numredctfstarts && !numbluectfstarts) //why even bother, eh?
{
if ((gametyperules & GTR_TEAMSTARTS) && doprints))
if ((gametyperules & GTR_TEAMSTARTS) && doprints)
CONS_Alert(CONS_WARNING, M_GetText("No CTF starts in this map!\n"));
return NULL;
}
@ -2515,7 +2500,7 @@ mapthing_t *G_FindBattleStart(INT32 playernum)
return NULL;
}
if (doprints)
if ((gametyperules & GTR_BATTLESTARTS) && doprints)
CONS_Alert(CONS_WARNING, M_GetText("No Deathmatch starts in this map!\n"));
return NULL;
}
@ -2658,7 +2643,7 @@ mapthing_t *G_FindMapStart(INT32 playernum)
// In platform gametypes, spawn in Co-op starts first
// Overriden by GTR_BATTLESTARTS.
if (gametyperules & GTR_BATTLESTARTS)
spawnpoint = G_FindMatchStartOrFallback(playernum);
spawnpoint = G_FindBattleStartOrFallback(playernum);
else
spawnpoint = G_FindRaceStartOrFallback(playernum);
}
@ -2731,8 +2716,6 @@ void G_ChangePlayerReferences(mobj_t *oldmo, mobj_t *newmo)
void G_DoReborn(INT32 playernum)
{
player_t *player = &players[playernum];
boolean resetlevel = false;
INT32 i;
// Make sure objectplace is OFF when you first start the level!
OP_ResetObjectplace();
@ -2757,43 +2740,9 @@ void G_DoReborn(INT32 playernum)
void G_AddPlayer(INT32 playernum)
{
INT32 countplayers = 0, notexiting = 0;
player_t *p = &players[playernum];
// Go through the current players and make sure you have the latest starpost set
if (G_PlatformGametype() && (netgame || multiplayer))
{
INT32 i;
for (i = 0; i < MAXPLAYERS; i++)
{
if (!playeringame[i])
continue;
if (players[i].bot) // ignore dumb, stupid tails
continue;
countplayers++;
if (!players[i].exiting)
notexiting++;
p->starpostscale = players[i].starpostscale;
p->starposttime = players[i].starposttime;
p->starpostx = players[i].starpostx;
p->starposty = players[i].starposty;
p->starpostz = players[i].starpostz;
p->starpostangle = players[i].starpostangle;
p->starpostnum = players[i].starpostnum;
}
}
p->playerstate = PST_REBORN;
demo_extradata[playernum] |= DXD_PLAYSTATE|DXD_COLOR|DXD_NAME|DXD_SKIN|DXD_FOLLOWER; // Set everything
if ((countplayers && !notexiting) || G_IsSpecialStage(gamemap))
P_DoPlayerExit(p);
}
void G_ExitLevel(void)
@ -3104,7 +3053,7 @@ boolean G_IsSpecialStage(INT32 mapnum)
#if 1
(void)mapnum;
#else
if (modeattacking == ATTACKING_RECORD)
if (modeattacking == ATTACKING_TIME)
return false;
if (mapnum >= sstage_start && mapnum <= sstage_end)
return true;
@ -3241,11 +3190,11 @@ INT16 G_SometimesGetDifferentGametype(void)
//
UINT8 G_GetGametypeColor(INT16 gt)
{
if (modeattacking // == ATTACKING_RECORD
if (modeattacking // == ATTACKING_TIME
|| gamestate == GS_TIMEATTACK)
return orangemap[0];
if (gt == GT_MATCH)
if (gt == GT_BATTLE)
return redmap[0];
if (gt == GT_RACE)
@ -3255,23 +3204,19 @@ UINT8 G_GetGametypeColor(INT16 gt)
}
/** Get the typeoflevel flag needed to indicate support of a gametype.
* In single-player, this always returns TOL_SP.
* \param gametype The gametype for which support is desired.
* \return The typeoflevel flag to check for that gametype.
* \author Graue <graue@oceanbase.org>
*/
UINT32 G_TOLFlag(INT32 pgametype)
{
if (!multiplayer)
return TOL_SP;
return gametypetol[pgametype];
}
static INT32 TOLMaps(INT16 tolflags)
static UINT32 TOLMaps(UINT32 tolflags)
{
INT32 num = 0;
INT16 i;
UINT32 num = 0;
UINT32 i;
// Find all the maps that are ok and and put them in an array.
for (i = 0; i < NUMMAPS; i++)
@ -3447,27 +3392,14 @@ static void G_UpdateVisited(void)
// Update visitation flags
mapvisited[gamemap-1] |= MV_BEATEN;
// eh, what the hell
if (ultimatemode)
mapvisited[gamemap-1] |= MV_ULTIMATE;
// may seem incorrect but IS possible in what the main game uses as mp special stages, and nummaprings will be -1 in NiGHTS
if (nummaprings > 0 && players[consoleplayer].rings >= nummaprings)
if (encoremode == true)
{
mapvisited[gamemap-1] |= MV_PERFECT;
if (modeattacking)
mapvisited[gamemap-1] |= MV_PERFECTRA;
}
if (!spec)
{
// not available to special stages because they can only really be done in one order in an unmodified game, so impossible for first six and trivial for seventh
if (ALL7EMERALDS(emeralds))
mapvisited[gamemap-1] |= MV_ALLEMERALDS;
mapvisited[gamemap-1] |= MV_ENCORE;
}
if (modeattacking == ATTACKING_RECORD)
if (modeattacking)
G_UpdateRecordReplays();
else if (modeattacking == ATTACKING_NIGHTS)
G_SetNightsRecords();
if ((earnedEmblems = M_CompletionEmblems()))
CONS_Printf(M_GetText("\x82" "Earned %hu emblem%s for level completion.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
@ -3476,7 +3408,8 @@ static void G_UpdateVisited(void)
static boolean CanSaveLevel(INT32 mapnum)
{
// SRB2Kart:
// SRB2Kart: No save files yet
(void)mapnum;
return false;
}
@ -3512,6 +3445,7 @@ static void G_HandleSaveLevel(void)
static void G_DoCompleted(void)
{
INT32 i, j = 0;
boolean spec = G_IsSpecialStage(gamemap);
SINT8 powertype = K_UsingPowerLevels();
if (modeattacking && pausedelay)
@ -3528,7 +3462,7 @@ static void G_DoCompleted(void)
if (playeringame[i])
{
// SRB2Kart: exitlevel shouldn't get you the points
if (!players[i].exiting && !(players[i].pflags & PF_TIMEOVER))
if (!players[i].exiting && !(players[i].pflags & PF_GAMETYPEOVER))
{
if (players[i].bot)
{
@ -3536,7 +3470,7 @@ static void G_DoCompleted(void)
}
else
{
players[i].pflags |= PF_TIMEOVER;
players[i].pflags |= PF_GAMETYPEOVER;
if (P_IsLocalPlayer(&players[i]))
{
@ -3566,8 +3500,11 @@ static void G_DoCompleted(void)
if (nextmapoverride != 0)
{
nextmap = (INT16)(nextmapoverride-1);
}
else if (marathonmode && mapheaderinfo[gamemap-1]->marathonnext)
{
nextmap = (INT16)(mapheaderinfo[gamemap-1]->marathonnext-1);
}
else if (grandprixinfo.gp == true)
{
if (grandprixinfo.roundnum == 0 || grandprixinfo.cup == NULL) // Single session
@ -3596,7 +3533,7 @@ static void G_DoCompleted(void)
}
// Remember last map for when you come out of the special stage.
if (!G_IsSpecialStage(gamemap))
if (!spec)
lastmap = nextmap;
// If nextmap is actually going to get used, make sure it points to
@ -3738,7 +3675,7 @@ void G_AfterIntermission(void)
return;
}
if ((gametyperules & GTR_CUTSCENES) && mapheaderinfo[gamemap-1]->cutscenenum && !modeattacking && skipstats <= 1 && (gamecomplete || !(marathonmode & MA_NOCUTSCENES))) // Start a custom cutscene.
if ((gametyperules & GTR_CAMPAIGN) && mapheaderinfo[gamemap-1]->cutscenenum && !modeattacking && skipstats <= 1 && (gamecomplete || !(marathonmode & MA_NOCUTSCENES))) // Start a custom cutscene.
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->cutscenenum-1, false, false);
else
{
@ -3884,7 +3821,7 @@ void G_EndGame(void)
G_SaveDemo();
// Only do evaluation and credits in coop games.
if (gametyperules & GTR_CUTSCENES)
if (gametyperules & GTR_CAMPAIGN)
{
if (nextmap == 1103-1) // end game with ending
{
@ -4035,7 +3972,6 @@ void G_LoadGameData(void)
}
timesBeaten = READUINT32(save_p);
timesBeatenWithEmeralds = READUINT32(save_p);
// Main records
for (i = 0; i < NUMMAPS; ++i)
@ -4076,7 +4012,7 @@ void G_LoadGameData(void)
// G_SaveGameData
// Saves the main data file, which stores information such as emblems found, etc.
void G_SaveGameData(boolean force)
void G_SaveGameData(void)
{
size_t length;
INT32 i, j;
@ -4092,6 +4028,16 @@ void G_SaveGameData(boolean force)
return;
}
#if 0
// SRB2Kart: Let players unlock stuff with addons.
if (modifiedgame && !savemoddata)
{
free(savebuffer);
save_p = savebuffer = NULL;
return;
}
#endif
// Version test
WRITEUINT32(save_p, 0xFCAFE211);
@ -4142,7 +4088,6 @@ void G_SaveGameData(boolean force)
}
WRITEUINT32(save_p, timesBeaten);
WRITEUINT32(save_p, timesBeatenWithEmeralds);
// Main records
for (i = 0; i < NUMMAPS; i++)
@ -4460,7 +4405,7 @@ void G_DeferedInitNew(boolean pencoremode, const char *mapname, INT32 pickedchar
}
SetPlayerSkinByNum(consoleplayer, pickedchar);
CV_StealthSet(&cv_skin, skins[pickedchar].name);
CV_StealthSet(&cv_skin[0], skins[pickedchar].name);
if (color != SKINCOLOR_NONE)
{
@ -4560,7 +4505,7 @@ void G_InitNew(UINT8 pencoremode, const char *mapname, boolean resetplayer, bool
automapactive = false;
imcontinuing = false;
if ((gametyperules & GTR_CUTSCENES) && !skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking && !(marathonmode & MA_NOCUTSCENES)) // Start a custom cutscene.
if ((gametyperules & GTR_CAMPAIGN) && !skipprecutscene && mapheaderinfo[gamemap-1]->precutscenenum && !modeattacking && !(marathonmode & MA_NOCUTSCENES)) // Start a custom cutscene.
F_StartCustomCutscene(mapheaderinfo[gamemap-1]->precutscenenum-1, true, resetplayer);
else
{

View file

@ -151,9 +151,10 @@ void G_FreeMapSearch(mapsearchfreq_t *freq, INT32 freqc);
INT32 G_FindMapByNameOrCode(const char *query, char **foundmapnamep);
// XMOD spawning
mapthing_t *G_FindCTFStart(INT32 playernum);
mapthing_t *G_FindMatchStart(INT32 playernum);
mapthing_t *G_FindTeamStart(INT32 playernum);
mapthing_t *G_FindBattleStart(INT32 playernum);
mapthing_t *G_FindRaceStart(INT32 playernum);
mapthing_t *G_FindMapStart(INT32 playernum);
void G_MovePlayerToSpawnOrStarpost(INT32 playernum);
void G_SpawnPlayer(INT32 playernum);
@ -255,7 +256,7 @@ FUNCMATH INT32 G_TicsToMilliseconds(tic_t tics);
// Don't split up TOL handling
UINT32 G_TOLFlag(INT32 pgametype);
INT16 G_RandMap(INT16 tolflags, INT16 pprevmap, boolean ignorebuffer, UINT8 maphell, boolean callagainsoon, INT16 *extbuffer);
INT16 G_RandMap(UINT32 tolflags, INT16 pprevmap, boolean ignorebuffer, UINT8 maphell, boolean callagainsoon, INT16 *extbuffer);
void G_AddMapToBuffer(INT16 map);
#endif

View file

@ -843,7 +843,7 @@ INT32 G_KeyStringtoNum(const char *keystr)
void G_DefineDefaultControls(void)
{
INT32 i, j;
INT32 i;
// Keyboard controls
gamecontroldefault[0][gcs_kart][gc_aimforward ][0] = KEY_UPARROW;
@ -874,17 +874,17 @@ void G_DefineDefaultControls(void)
for (i = gcs_custom+1; i < num_gamecontrolschemes; i++) // skip gcs_custom
{
// Gamepad controls -- same for all schemes
gamecontroldefault[0][j][gc_accelerate ][1] = KEY_JOY1+0; // A
gamecontroldefault[0][j][gc_lookback ][1] = KEY_JOY1+2; // X
gamecontroldefault[0][j][gc_brake ][1] = KEY_JOY1+1; // B
gamecontroldefault[0][j][gc_fire ][1] = KEY_JOY1+4; // LB
gamecontroldefault[0][j][gc_drift ][1] = KEY_JOY1+5; // RB
gamecontroldefault[0][i][gc_accelerate ][1] = KEY_JOY1+0; // A
gamecontroldefault[0][i][gc_lookback ][1] = KEY_JOY1+2; // X
gamecontroldefault[0][i][gc_brake ][1] = KEY_JOY1+1; // B
gamecontroldefault[0][i][gc_fire ][1] = KEY_JOY1+4; // LB
gamecontroldefault[0][i][gc_drift ][1] = KEY_JOY1+5; // RB
gamecontroldefault[0][j][gc_viewpoint ][1] = KEY_JOY1+3; // Y
gamecontroldefault[0][j][gc_pause ][1] = KEY_JOY1+6; // Back
gamecontroldefault[0][j][gc_systemmenu ][0] = KEY_JOY1+7; // Start
gamecontroldefault[0][j][gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down
gamecontroldefault[0][j][gc_scores ][1] = KEY_HAT1+0; // D-Pad Up
gamecontroldefault[0][i][gc_viewpoint ][1] = KEY_JOY1+3; // Y
gamecontroldefault[0][i][gc_pause ][1] = KEY_JOY1+6; // Back
gamecontroldefault[0][i][gc_systemmenu ][0] = KEY_JOY1+7; // Start
gamecontroldefault[0][i][gc_talkkey ][1] = KEY_HAT1+1; // D-Pad Down
gamecontroldefault[0][i][gc_scores ][1] = KEY_HAT1+0; // D-Pad Up
gamecontroldefault[1][i][gc_accelerate ][0] = KEY_2JOY1+0; // A
gamecontroldefault[1][i][gc_lookback ][0] = KEY_2JOY1+2; // X
@ -945,17 +945,17 @@ void G_CopyControls(INT32 (*setupcontrols)[2], INT32 (*fromcontrols)[2], const I
}
}
void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2])
void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb)[2], INT32 (*fromcontrolsc)[2], INT32 (*fromcontrolsd)[2])
{
INT32 i;
for (i = 1; i < num_gamecontrols; i++)
{
fprintf(f, "setcontrol \"%s\" \"%s\"", gamecontrolname[i],
G_KeynumToString(fromcontrols[0][i][0]));
G_KeynumToString(fromcontrolsa[i][0]));
if (fromcontrols[0][i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrols[0][i][1]));
if (fromcontrolsa[i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsa[i][1]));
else
fprintf(f, "\n");
}
@ -963,10 +963,10 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2])
for (i = 1; i < num_gamecontrols; i++)
{
fprintf(f, "setcontrol2 \"%s\" \"%s\"", gamecontrolname[i],
G_KeynumToString(fromcontrols[1][i][0]));
G_KeynumToString(fromcontrolsb[i][0]));
if (fromcontrols[1][i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrols[1][i][1]));
if (fromcontrolsb[i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsb[i][1]));
else
fprintf(f, "\n");
}
@ -974,10 +974,10 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2])
for (i = 1; i < num_gamecontrols; i++)
{
fprintf(f, "setcontrol3 \"%s\" \"%s\"", gamecontrolname[i],
G_KeynumToString(fromcontrols[2][i][0]));
G_KeynumToString(fromcontrolsc[i][0]));
if (fromcontrols[2][i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrols[2][i][1]));
if (fromcontrolsc[i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsc[i][1]));
else
fprintf(f, "\n");
}
@ -985,10 +985,10 @@ void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2])
for (i = 1; i < num_gamecontrols; i++)
{
fprintf(f, "setcontrol4 \"%s\" \"%s\"", gamecontrolname[i],
G_KeynumToString(fromcontrols[3][i][0]));
G_KeynumToString(fromcontrolsd[i][0]));
if (fromcontrols[3][i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrols[3][i][1]));
if (fromcontrolsd[i][1])
fprintf(f, " \"%s\"\n", G_KeynumToString(fromcontrolsd[i][1]));
else
fprintf(f, "\n");
}

View file

@ -124,7 +124,7 @@ extern UINT8 gamekeydown[NUMINPUTS];
// two key codes (or virtual key) per game control
extern INT32 gamecontrol[MAXSPLITSCREENPLAYERS][num_gamecontrols][2];
extern INT32 gamecontroldefault[MAXSPLITSCREENPLAYERS][num_gamecontrolschemes][num_gamecontrols][2]; // default control storage, use 0 (gcs_custom) for memory retention
#define PlayerInputDown(p, gc) (gamekeydown[p-1][gamecontrol[gc][0]] || gamekeydown[p-1][gamecontrol[gc][1]])
#define PlayerInputDown(p, gc) (gamekeydown[gamecontrol[p-1][gc][0]] || gamekeydown[gamecontrol[p-1][gc][1]])
#define num_gcl_accelerate 1
#define num_gcl_brake 1
@ -162,7 +162,7 @@ void Command_Setcontrol4_f(void);
void G_DefineDefaultControls(void);
INT32 G_GetControlScheme(INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen);
void G_CopyControls(INT32 (*setupcontrols)[2], INT32 (*fromcontrols)[2], const INT32 *gclist, INT32 gclen);
void G_SaveKeySetting(FILE *f, INT32 (*fromcontrols)[2], INT32 (*fromcontrolsbis)[2]);
void G_SaveKeySetting(FILE *f, INT32 (*fromcontrolsa)[2], INT32 (*fromcontrolsb)[2], INT32 (*fromcontrolsc)[2], INT32 (*fromcontrolsd)[2]);
INT32 G_CheckDoubleUsage(INT32 keynum, boolean modify);
#endif

View file

@ -53,6 +53,6 @@ typedef struct JoyType_s JoyType_t;
for palyer[sic] 1-4's joystick/gamepad
*/
extern JoyType_t Joystick, Joystick2, Joystick3, Joystick4;
extern JoyType_t Joystick[MAXSPLITSCREENPLAYERS];
#endif // __I_JOY_H__

View file

@ -255,7 +255,7 @@ void K_CheckBumpers(void)
{
for (i = 0; i < MAXPLAYERS; i++)
{
players[i].pflags |= PF_TIMEOVER;
players[i].pflags |= PF_GAMETYPEOVER;
P_DoPlayerExit(&players[i]);
}
}

View file

@ -279,9 +279,6 @@ boolean cht_Responder(event_t *ev)
#define REQUIRE_SINGLEPLAYER if (netgame || multiplayer)\
{ CONS_Printf(M_GetText("This only works in single player.\n")); return; }
#define REQUIRE_NOULTIMATE if (ultimatemode)\
{ CONS_Printf(M_GetText("You're too good to be cheating!\n")); return; }
// command that can be typed at the console!
void Command_CheatNoClip_f(void)
{
@ -289,7 +286,6 @@ void Command_CheatNoClip_f(void)
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
plyr = &players[consoleplayer];
@ -313,7 +309,6 @@ void Command_CheatGod_f(void)
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
plyr = &players[consoleplayer];
plyr->pflags ^= PF_GODMODE;
@ -328,7 +323,6 @@ void Command_CheatNoTarget_f(void)
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
plyr = &players[consoleplayer];
plyr->pflags ^= PF_INVIS;
@ -844,7 +838,6 @@ void Command_Savecheckpoint_f(void)
/*void Command_Getallemeralds_f(void)
{
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
REQUIRE_PANDORA;
emeralds = ((EMERALD7)*2)-1;
@ -855,7 +848,6 @@ void Command_Savecheckpoint_f(void)
void Command_Resetemeralds_f(void)
{
REQUIRE_SINGLEPLAYER;
REQUIRE_PANDORA;
emeralds = 0;
@ -867,7 +859,6 @@ void Command_Devmode_f(void)
#ifndef _DEBUG
REQUIRE_SINGLEPLAYER;
#endif
REQUIRE_NOULTIMATE;
if (COM_Argc() > 1)
{
@ -888,30 +879,20 @@ void Command_Devmode_f(void)
G_SetGameModified(multiplayer, true);
}
/*void Command_Setrings_f(void)
void Command_Setrings_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
REQUIRE_PANDORA;
if (COM_Argc() > 1)
{
if (!(maptol & TOL_NIGHTS))
{
// P_GivePlayerRings does value clamping
players[consoleplayer].rings = 0;
P_GivePlayerRings(&players[consoleplayer], atoi(COM_Argv(1)));
players[consoleplayer].totalring -= atoi(COM_Argv(1)); //undo totalring addition done in P_GivePlayerRings
}
else
{
players[consoleplayer].spheres = 0;
P_GivePlayerSpheres(&players[consoleplayer], atoi(COM_Argv(1)));
// no totalsphere addition to revert
}
// P_GivePlayerRings does value clamping
players[consoleplayer].rings = 0;
P_GivePlayerRings(&players[consoleplayer], atoi(COM_Argv(1)));
players[consoleplayer].totalring -= atoi(COM_Argv(1)); //undo totalring addition done in P_GivePlayerRings
G_SetGameModified(multiplayer);
G_SetGameModified(multiplayer, true);
}
}
@ -919,14 +900,15 @@ void Command_Setlives_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
REQUIRE_PANDORA;
if (COM_Argc() > 1)
{
SINT8 lives = atoi(COM_Argv(1));
if (lives == -1)
{
players[consoleplayer].lives = INFLIVES; // infinity!
}
else
{
// P_GivePlayerLives does value clamping
@ -934,37 +916,10 @@ void Command_Setlives_f(void)
P_GivePlayerLives(&players[consoleplayer], atoi(COM_Argv(1)));
}
G_SetGameModified(multiplayer);
G_SetGameModified(multiplayer, true);
}
}
void Command_Setcontinues_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
REQUIRE_PANDORA;
if (!continuesInSession)
{
CONS_Printf(M_GetText("This session does not use continues.\n"));
return;
}
if (COM_Argc() > 1)
{
INT32 numcontinues = atoi(COM_Argv(1));
if (numcontinues > 99)
numcontinues = 99;
else if (numcontinues < 0)
numcontinues = 0;
players[consoleplayer].continues = numcontinues;
G_SetGameModified(multiplayer);
}
}*/
//
// OBJECTPLACE (and related variables)
//
@ -1441,7 +1396,6 @@ void Command_ObjectPlace_f(void)
{
REQUIRE_INLEVEL;
REQUIRE_SINGLEPLAYER;
REQUIRE_NOULTIMATE;
G_SetGameModified(multiplayer, true);

View file

@ -91,7 +91,7 @@ void M_ClearSecrets(void)
for (i = 0; i < MAXCONDITIONSETS; ++i)
conditionSets[i].achieved = false;
timesBeaten = timesBeatenWithEmeralds = 0;
timesBeaten = 0;
// Re-unlock any always unlocked things
M_SilentUpdateUnlockablesAndEmblems();
@ -112,8 +112,6 @@ UINT8 M_CheckCondition(condition_t *cn)
return (vspowerlevel[cn->extrainfo1] >= (unsigned)cn->requirement);
case UC_GAMECLEAR: // Requires game beaten >= x times
return (timesBeaten >= (unsigned)cn->requirement);
case UC_ALLEMERALDS: // Requires game beaten with all 7 emeralds >= x times
return (timesBeatenWithEmeralds >= (unsigned)cn->requirement);
case UC_OVERALLTIME: // Requires overall time <= x
return (M_GotLowEnoughTime(cn->requirement));
case UC_MAPVISITED: // Requires map x to be visited

View file

@ -1715,7 +1715,7 @@ inline static void M_GetGametypeColor(void)
warningflags = V_REDMAP;
recommendedflags = V_GREENMAP;
if (modeattacking // == ATTACKING_RECORD
if (modeattacking // == ATTACKING_TIME
|| gamestate == GS_TIMEATTACK)
{
highlightflags = V_ORANGEMAP;
@ -1732,7 +1732,7 @@ inline static void M_GetGametypeColor(void)
else
gt = gametype;
if (gt == GT_MATCH)
if (gt == GT_BATTLE)
{
highlightflags = V_REDMAP;
warningflags = V_ORANGEMAP;
@ -7426,8 +7426,7 @@ static void M_Statistics(INT32 choice)
if (!mapheaderinfo[i] || mapheaderinfo[i]->lvlttl[0] == '\0')
continue;
if (!(mapheaderinfo[i]->typeoflevel & TOL_RACE) // TOL_SP
|| (mapheaderinfo[i]->menuflags & (LF2_HIDEINSTATS|LF2_HIDEINMENU)))
if (mapheaderinfo[i]->menuflags & (LF2_HIDEINSTATS|LF2_HIDEINMENU))
continue;
if (M_MapLocked(i+1)) // !mapvisited[i]
@ -8137,7 +8136,7 @@ static void M_ChooseTimeAttack(INT32 choice)
(void)choice;
emeralds = 0;
M_ClearMenus(true);
modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_RECORD);
modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_TIME);
gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s",
srb2home, timeattackfolder);
@ -8188,7 +8187,7 @@ static void M_HandleStaffReplay(INT32 choice)
if (l == LUMPERROR)
break;
M_ClearMenus(true);
modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_RECORD);
modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_TIME);
demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed
G_DoPlayDemo(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value));
break;
@ -8209,7 +8208,7 @@ static void M_ReplayTimeAttack(INT32 choice)
{
const char *which;
M_ClearMenus(true);
modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_RECORD); // set modeattacking before G_DoPlayDemo so the map loader knows
modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_TIME); // set modeattacking before G_DoPlayDemo so the map loader knows
demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed
if (currentMenu == &SP_ReplayDef)

View file

@ -647,9 +647,9 @@ void M_SaveConfig(const char *filename)
if (!dedicated)
{
if (tutorialmode && tutorialgcs)
G_SaveKeySetting(f, gamecontroldefault[0][gcs_custom], gamecontrol[1]); // using gcs_custom as temp storage
G_SaveKeySetting(f, gamecontroldefault[0][gcs_custom]); // using gcs_custom as temp storage
else
G_SaveKeySetting(f, gamecontrol[0], gamecontrol[1]);
G_SaveKeySetting(f, gamecontrol);
}
fclose(f);

View file

@ -797,132 +797,6 @@ boolean P_LookForPlayers(mobj_t *actor, boolean allaround, boolean tracer, fixed
//return false;
}
#ifdef WEIGHTEDRECYCLER
// Compares players to see who currently has the "best" items, etc.
static int P_RecycleCompare(const void *p1, const void *p2)
{
player_t *player1 = &players[*(const UINT8 *)p1];
player_t *player2 = &players[*(const UINT8 *)p2];
// Non-shooting gametypes
if (!(gametyperules & GTR_CIRCUIT))
{
// Invincibility.
if (player1->powers[pw_invulnerability] > player2->powers[pw_invulnerability]) return -1;
else if (player2->powers[pw_invulnerability] > player1->powers[pw_invulnerability]) return 1;
// One has a shield, the other doesn't.
if (player1->powers[pw_shield] && !player2->powers[pw_shield]) return -1;
else if (player2->powers[pw_shield] && !player1->powers[pw_shield]) return 1;
// Sneakers.
if (player1->powers[pw_sneakers] > player2->powers[pw_sneakers]) return -1;
else if (player2->powers[pw_sneakers] > player1->powers[pw_sneakers]) return 1;
}
else // Match, Team Match, CTF, Tag, Etc.
{
UINT8 player1_em = M_CountBits((UINT32)player1->powers[pw_emeralds], 7);
UINT8 player2_em = M_CountBits((UINT32)player2->powers[pw_emeralds], 7);
UINT8 player1_rw = M_CountBits((UINT32)player1->ringweapons, NUM_WEAPONS-1);
UINT8 player2_rw = M_CountBits((UINT32)player2->ringweapons, NUM_WEAPONS-1);
UINT16 player1_am = player1->powers[pw_infinityring] // max 800
+ player1->powers[pw_automaticring] // max 300
+ (player1->powers[pw_bouncering] * 3) // max 100
+ (player1->powers[pw_explosionring] * 6) // max 50
+ (player1->powers[pw_scatterring] * 3) // max 100
+ (player1->powers[pw_grenadering] * 6) // max 50
+ (player1->powers[pw_railring] * 6); // max 50
UINT16 player2_am = player2->powers[pw_infinityring] // max 800
+ player2->powers[pw_automaticring] // max 300
+ (player2->powers[pw_bouncering] * 3) // max 100
+ (player2->powers[pw_explosionring] * 6) // max 50
+ (player2->powers[pw_scatterring] * 3) // max 100
+ (player2->powers[pw_grenadering] * 6) // max 50
+ (player2->powers[pw_railring] * 6); // max 50
// Super trumps everything.
if (player1->powers[pw_super] && !player2->powers[pw_super]) return -1;
else if (player2->powers[pw_super] && !player1->powers[pw_super]) return 1;
// Emerald count if neither player is Super.
if (player1_em > player2_em) return -1;
else if (player1_em < player2_em) return 1;
// One has a shield, the other doesn't.
// (the likelihood of a shielded player being worse off than one without one is low.)
if (player1->powers[pw_shield] && !player2->powers[pw_shield]) return -1;
else if (player2->powers[pw_shield] && !player1->powers[pw_shield]) return 1;
// Ring weapons count
if (player1_rw > player2_rw) return -1;
else if (player1_rw < player2_rw) return 1;
// Ring ammo if they have the same number of weapons
if (player1_am > player2_am) return -1;
else if (player1_am < player2_am) return 1;
}
// Identical for our purposes
return 0;
}
#endif
// Handles random monitor weights via console.
static mobjtype_t P_DoRandomBoxChances(void)
{
mobjtype_t spawnchance[256];
INT32 numchoices = 0, i = 0;
if (!(netgame || multiplayer))
{
switch (P_RandomKey(10))
{
case 0:
return MT_RING_ICON;
case 1:
return MT_SNEAKERS_ICON;
case 2:
return MT_INVULN_ICON;
case 3:
return MT_WHIRLWIND_ICON;
case 4:
return MT_ELEMENTAL_ICON;
case 5:
return MT_ATTRACT_ICON;
case 6:
return MT_FORCE_ICON;
case 7:
return MT_ARMAGEDDON_ICON;
case 8:
return MT_1UP_ICON;
case 9:
return MT_EGGMAN_ICON;
}
return MT_NULL;
}
#define QUESTIONBOXCHANCES(type, cvar) \
for (i = cvar.value; i; --i) spawnchance[numchoices++] = type
QUESTIONBOXCHANCES(MT_RING_ICON, cv_superring);
QUESTIONBOXCHANCES(MT_SNEAKERS_ICON, cv_supersneakers);
QUESTIONBOXCHANCES(MT_INVULN_ICON, cv_invincibility);
QUESTIONBOXCHANCES(MT_WHIRLWIND_ICON, cv_jumpshield);
QUESTIONBOXCHANCES(MT_ELEMENTAL_ICON, cv_watershield);
QUESTIONBOXCHANCES(MT_ATTRACT_ICON, cv_ringshield);
QUESTIONBOXCHANCES(MT_FORCE_ICON, cv_forceshield);
QUESTIONBOXCHANCES(MT_ARMAGEDDON_ICON, cv_bombshield);
QUESTIONBOXCHANCES(MT_1UP_ICON, cv_1up);
QUESTIONBOXCHANCES(MT_EGGMAN_ICON, cv_eggmanbox);
QUESTIONBOXCHANCES(MT_MIXUP_ICON, cv_teleporters);
QUESTIONBOXCHANCES(MT_RECYCLER_ICON, cv_recycler);
#undef QUESTIONBOXCHANCES
if (numchoices == 0) return MT_NULL;
return spawnchance[P_RandomKey(numchoices)];
}
//
// ACTION ROUTINES
//
@ -4174,40 +4048,6 @@ void A_CustomPower(mobj_t *actor)
P_SpawnShieldOrb(player);
}
// Function: A_GiveWeapon
//
// Description: Gives the player the specified weapon panels.
//
// var1 = Weapon index #
// var2 = unused
//
void A_GiveWeapon(mobj_t *actor)
{
player_t *player;
INT32 locvar1 = var1;
if (LUA_CallAction("A_GiveWeapon", actor))
return;
if (!actor->target || !actor->target->player)
{
CONS_Debug(DBG_GAMELOGIC, "Powerup has no target.\n");
return;
}
if (locvar1 >= 1<<(NUM_WEAPONS-1))
{
CONS_Debug(DBG_GAMELOGIC, "Weapon #%d out of range!\n", locvar1);
return;
}
player = actor->target->player;
player->ringweapons |= locvar1;
if (actor->info->seesound)
S_StartSound(player->mo, actor->info->seesound);
}
// Function: A_RingBox
//
// Description: Awards the player 10 rings.
@ -6862,147 +6702,6 @@ void A_MixUp(mobj_t *actor)
S_StartSound(NULL, sfx_mixup);
}
// Function: A_RecyclePowers
//
// Description: Take all player's powers, and swap 'em.
//
// var1 = unused
// var2 = unused
//
void A_RecyclePowers(mobj_t *actor)
{
INT32 i, j, k, numplayers = 0;
#ifdef WEIGHTEDRECYCLER
UINT8 beneficiary = 255;
#endif
UINT8 playerslist[MAXPLAYERS];
UINT8 postscramble[MAXPLAYERS];
UINT16 powers[MAXPLAYERS][NUMPOWERS];
INT32 weapons[MAXPLAYERS];
INT32 weaponheld[MAXPLAYERS];
if (LUA_CallAction("A_RecyclePowers", actor))
return;
if (!multiplayer)
{
S_StartSound(actor, sfx_lose);
return;
}
numplayers = 0;
// Count the number of players in the game
for (i = 0, j = 0; i < MAXPLAYERS; i++)
{
if (playeringame[i] && players[i].mo && players[i].mo->health > 0 && players[i].playerstate == PST_LIVE
&& !players[i].exiting && !((netgame || multiplayer) && players[i].spectator))
{
#ifndef WEIGHTEDRECYCLER
if (players[i].powers[pw_super])
continue; // Ignore super players
#endif
numplayers++;
postscramble[j] = playerslist[j] = (UINT8)i;
#ifdef WEIGHTEDRECYCLER
// The guy who started the recycle gets the best result
if (actor && actor->target && actor->target->player && &players[i] == actor->target->player)
beneficiary = (UINT8)i;
#endif
// Save powers
for (k = 0; k < NUMPOWERS; k++)
powers[i][k] = players[i].powers[k];
//1.1: ring weapons too
weapons[i] = players[i].ringweapons;
weaponheld[i] = players[i].currentweapon;
j++;
}
}
if (numplayers <= 1)
{
S_StartSound(actor, sfx_lose);
return; //nobody to touch!
}
//shuffle the post scramble list, whee!
// hardcoded 0-1 to 1-0 for two players
if (numplayers == 2)
{
postscramble[0] = playerslist[1];
postscramble[1] = playerslist[0];
}
else
for (j = 0; j < numplayers; j++)
{
UINT8 tempint;
i = j + ((P_RandomByte() + leveltime) % (numplayers - j));
tempint = postscramble[j];
postscramble[j] = postscramble[i];
postscramble[i] = tempint;
}
#ifdef WEIGHTEDRECYCLER
//the joys of qsort...
if (beneficiary != 255) {
qsort(playerslist, numplayers, sizeof(UINT8), P_RecycleCompare);
// now, make sure the benificiary is in the best slot
// swap out whatever poor sap was going to get the best items
for (i = 0; i < numplayers; i++)
{
if (postscramble[i] == beneficiary)
{
postscramble[i] = postscramble[0];
postscramble[0] = beneficiary;
break;
}
}
}
#endif
// now assign!
for (i = 0; i < numplayers; i++)
{
UINT8 send_pl = playerslist[i];
UINT8 recv_pl = postscramble[i];
// debugF
CONS_Debug(DBG_GAMELOGIC, "sending player %hu's items to %hu\n", (UINT16)send_pl, (UINT16)recv_pl);
for (j = 0; j < NUMPOWERS; j++)
{
if (j == pw_flashing || j == pw_underwater || j == pw_spacetime || j == pw_carry
|| j == pw_tailsfly || j == pw_extralife || j == pw_nocontrol || j == pw_super
|| j == pw_pushing || j == pw_justsprung || j == pw_noautobrake || j == pw_justlaunched
|| j == pw_ignorelatch)
continue;
players[recv_pl].powers[j] = powers[send_pl][j];
}
//1.1: weapon rings too
players[recv_pl].ringweapons = weapons[send_pl];
players[recv_pl].currentweapon = weaponheld[send_pl];
if (((players[recv_pl].powers[pw_shield] & SH_NOSTACK) == SH_PINK) && (players[recv_pl].revitem == MT_LHRT || players[recv_pl].spinitem == MT_LHRT || players[recv_pl].thokitem == MT_LHRT)) // Healers can't keep their buff.
players[recv_pl].powers[pw_shield] &= SH_STACK;
P_SpawnShieldOrb(&players[recv_pl]);
if (P_IsLocalPlayer(&players[recv_pl]))
P_RestoreMusic(&players[recv_pl]);
P_FlashPal(&players[recv_pl], PAL_RECYCLE, 10);
}
S_StartSound(NULL, sfx_gravch); //heh, the sound effect I used is already in
}
// Function: A_Boss1Chase
//
// Description: Like A_Chase, but for Boss 1.

View file

@ -715,22 +715,7 @@ void P_TouchStarPost(mobj_t *post, player_t *player, boolean snaptopost)
if (player->starpostnum >= post->health)
return; // Already hit this post
// Save the player's time and position.
player->starposttime = leveltime;
player->starpostx = checkbase->x>>FRACBITS;
player->starposty = checkbase->y>>FRACBITS;
player->starpostz = post->z>>FRACBITS;
player->starpostangle = post->angle;
player->starpostscale = player->mo->destscale;
if (post->flags2 & MF2_OBJECTFLIP)
{
player->starpostscale *= -1;
player->starpostz += post->height>>FRACBITS;
}
player->starpostnum = post->health;
//S_StartSound(toucher, post->info->painsound);
P_ClearStarPost(post->health);
}
// Easily make it so that overtime works offline
@ -927,7 +912,7 @@ boolean P_CheckRacers(void)
numplayersingame++;
if (players[i].exiting || (players[i].pflags & PF_TIMEOVER))
if (players[i].exiting || (players[i].pflags & PF_GAMETYPEOVER))
{
numexiting++;
}
@ -987,7 +972,7 @@ boolean P_CheckRacers(void)
continue;
}
if (players[i].exiting || (players[i].pflags & PF_TIMEOVER))
if (players[i].exiting || (players[i].pflags & PF_GAMETYPEOVER))
{
// You're done, you're free to go.
continue;
@ -1367,7 +1352,7 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget
target->fuse = TICRATE*3; // timer before mobj disappears from view (even if not an actual player)
target->momx = target->momy = target->momz = 0;
if (target->player && target->player->pflags & PF_TIMEOVER)
if (target->player && target->player->pflags & PF_GAMETYPEOVER)
break;
if (damagetype == DMG_DROWNED) // drowned

View file

@ -2329,7 +2329,7 @@ boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam)
#ifndef NOCLIPCAM
if ((thiscam == &camera[i] && (players[displayplayers[i]].pflags & PF_NOCLIP)) || (leveltime < introtime)) // Noclipping player camera noclips too!!
#else
if (thiscam == &camera[i] && !(players[displayplayers[i]].pflags & PF_TIMEOVER)) // Time Over should not clip through walls
if (thiscam == &camera[i] && !(players[displayplayers[i]].pflags & PF_GAMETYPEOVER)) // Time Over should not clip through walls
#endif
{
floatok = true;

View file

@ -3340,7 +3340,7 @@ boolean P_CameraThinker(player_t *player, camera_t *thiscam, boolean resetcalled
dummy.z = thiscam->z;
dummy.height = thiscam->height;
if ((player->pflags & PF_TIMEOVER) && (gametyperules & GTR_CIRCUIT))
if ((player->pflags & PF_GAMETYPEOVER) && (gametyperules & GTR_CIRCUIT))
{
player->karthud[khud_timeovercam] = (2*TICRATE)+1;
}
@ -11495,7 +11495,7 @@ void P_SceneryThinker(mobj_t *mobj)
if (!playeringame[mobj->threshold] || players[mobj->threshold].spectator) // focused on a valid player?
return;
if (!(players[mobj->threshold].exiting) && !(players[mobj->threshold].pflags & PF_TIMEOVER)) // not finished yet?
if (!(players[mobj->threshold].exiting) && !(players[mobj->threshold].pflags & PF_GAMETYPEOVER)) // not finished yet?
return;
if (K_IsPlayerLosing(&players[mobj->threshold]))
@ -12928,9 +12928,6 @@ void P_AfterPlayerSpawn(INT32 playernum)
if (CheckForReverseGravity)
P_CheckGravity(mobj, false);
if (p->pflags & PF_FINISHED)
P_GiveFinishFlags(p);
}
// spawn it at a playerspawn mapthing

View file

@ -762,8 +762,6 @@ void P_ScanThings(INT16 mapnum, INT16 wadnum, INT16 lumpnum)
UINT32 flags;
tol = mapheaderinfo[mapnum-1]->typeoflevel;
if (!(tol & TOL_SP))
return;
flags = mapheaderinfo[mapnum-1]->levelflags;
n = W_LumpLengthPwad(wadnum, lumpnum) / (5 * sizeof (INT16));
@ -3375,7 +3373,7 @@ static void P_InitLevelSettings(void)
players[i].deadtimer = players[i].numboxes = players[i].laps = 0;
players[i].health = 1;
players[i].aiming = 0;
players[i].pflags &= ~PF_TIMEOVER;
players[i].pflags &= ~PF_GAMETYPEOVER;
}
racecountdown = exitcountdown = exitfadestarted = 0;
@ -3537,23 +3535,18 @@ static void P_ForceCharacter(const char *forcecharskin)
if (netgame)
{
char skincmd[33];
if (splitscreen)
for (i = 0; i <= splitscreen; i++)
{
sprintf(skincmd, "skin2 %s\n", forcecharskin);
CV_Set(&cv_skin[1], forcecharskin);
if (splitscreen > 1)
{
sprintf(skincmd, "skin3 %s\n", forcecharskin);
CV_Set(&cv_skin[2], forcecharskin);
if (splitscreen > 2)
{
sprintf(skincmd, "skin4 %s\n", forcecharskin);
CV_Set(&cv_skin[3], forcecharskin);
}
}
const char *num = "";
if (i > 0)
num = va("%d", i+1);
sprintf(skincmd, "skin%s %s\n", num, forcecharskin);
CV_Set(&cv_skin[i], forcecharskin);
}
sprintf(skincmd, "skin %s\n", forcecharskin);
COM_BufAddText(skincmd);
}
else
@ -3902,8 +3895,6 @@ static void P_InitPlayers(void)
else // gametype is race
{
G_SpawnPlayer(i);
if (players[i].starposttime)
P_ClearStarPost(players[i].starpostnum);
}
}
}

View file

@ -2228,7 +2228,7 @@ static void K_HandleLapDecrement(player_t *player)
void P_CrossSpecialLine(line_t *line, INT32 side, mobj_t *thing)
{
// only used for the players currently
if (!(thing && thing->player && !thing->player->spectator && !(thing->player->pflags & PF_TIMEOVER)))
if (!(thing && thing->player && !thing->player->spectator && !(thing->player->pflags & PF_GAMETYPEOVER)))
return;
{
player_t *player = thing->player;

View file

@ -92,7 +92,6 @@ void P_MixUp(mobj_t *thing, fixed_t x, fixed_t y, fixed_t z, angle_t angle,
// Reset map starposts for the player's new info.
P_ResetStarposts();
P_ClearStarPost(starpostnum);
P_ResetPlayer(thing->player);
P_SetPlayerMobjState(thing, S_KART_STILL1); // SRB2kart - was S_PLAY_STND

View file

@ -703,19 +703,19 @@ boolean P_EndingMusic(player_t *player)
// Check for if this is valid or not
if (r_splitscreen)
{
if (!((players[displayplayers[0]].exiting || (players[displayplayers[0]].pflags & PF_TIMEOVER))
|| (players[displayplayers[1]].exiting || (players[displayplayers[1]].pflags & PF_TIMEOVER))
|| ((r_splitscreen < 2) && (players[displayplayers[2]].exiting || (players[displayplayers[2]].pflags & PF_TIMEOVER)))
|| ((r_splitscreen < 3) && (players[displayplayers[3]].exiting || (players[displayplayers[3]].pflags & PF_TIMEOVER)))))
if (!((players[displayplayers[0]].exiting || (players[displayplayers[0]].pflags & PF_GAMETYPEOVER))
|| (players[displayplayers[1]].exiting || (players[displayplayers[1]].pflags & PF_GAMETYPEOVER))
|| ((r_splitscreen < 2) && (players[displayplayers[2]].exiting || (players[displayplayers[2]].pflags & PF_GAMETYPEOVER)))
|| ((r_splitscreen < 3) && (players[displayplayers[3]].exiting || (players[displayplayers[3]].pflags & PF_GAMETYPEOVER)))))
return false;
bestlocalplayer = &players[displayplayers[0]];
bestlocalpos = ((players[displayplayers[0]].pflags & PF_TIMEOVER) ? MAXPLAYERS+1 : players[displayplayers[0]].kartstuff[k_position]);
bestlocalpos = ((players[displayplayers[0]].pflags & PF_GAMETYPEOVER) ? MAXPLAYERS+1 : players[displayplayers[0]].kartstuff[k_position]);
#define setbests(p) \
if (((players[p].pflags & PF_TIMEOVER) ? MAXPLAYERS+1 : players[p].kartstuff[k_position]) < bestlocalpos) \
if (((players[p].pflags & PF_GAMETYPEOVER) ? MAXPLAYERS+1 : players[p].kartstuff[k_position]) < bestlocalpos) \
{ \
bestlocalplayer = &players[p]; \
bestlocalpos = ((players[p].pflags & PF_TIMEOVER) ? MAXPLAYERS+1 : players[p].kartstuff[k_position]); \
bestlocalpos = ((players[p].pflags & PF_GAMETYPEOVER) ? MAXPLAYERS+1 : players[p].kartstuff[k_position]); \
}
setbests(displayplayers[1]);
if (r_splitscreen > 1)
@ -726,11 +726,11 @@ boolean P_EndingMusic(player_t *player)
}
else
{
if (!(player->exiting || (player->pflags & PF_TIMEOVER)))
if (!(player->exiting || (player->pflags & PF_GAMETYPEOVER)))
return false;
bestlocalplayer = player;
bestlocalpos = ((player->pflags & PF_TIMEOVER) ? MAXPLAYERS+1 : player->kartstuff[k_position]);
bestlocalpos = ((player->pflags & PF_GAMETYPEOVER) ? MAXPLAYERS+1 : player->kartstuff[k_position]);
}
if ((gametyperules & GTR_CIRCUIT) && bestlocalpos == MAXPLAYERS+1)
@ -1816,110 +1816,6 @@ static void P_CheckQuicksand(player_t *player)
}
}
//
// P_CheckSneakerAndLivesTimer
//
// Restores music from sneaker and life fanfares
//
/* // SRB2kart - Can't drown.
static void P_CheckSneakerAndLivesTimer(player_t *player)
{
if (player->powers[pw_extralife] == 1) // Extra Life!
P_RestoreMusic(player);
//if (player->powers[pw_sneakers] == 1) // SRB2kart
// P_RestoreMusic(player);
}
*/
//
// P_CheckUnderwaterAndSpaceTimer
//
// Restores music from underwater and space warnings, and handles number generation
//
/* // SRB2kart - Can't drown.
static void P_CheckUnderwaterAndSpaceTimer(player_t *player)
{
tic_t timeleft = (player->powers[pw_spacetime]) ? player->powers[pw_spacetime] : player->powers[pw_underwater];
if (player->exiting || (player->pflags & PF_FINISHED))
player->powers[pw_underwater] = player->powers[pw_spacetime] = 0;
timeleft--; // The original code was all n*TICRATE + 1, so let's remove 1 tic for simplicity
if ((timeleft == 11*TICRATE) // 5
|| (timeleft == 9*TICRATE) // 4
|| (timeleft == 7*TICRATE) // 3
|| (timeleft == 5*TICRATE) // 2
|| (timeleft == 3*TICRATE) // 1
|| (timeleft == 1*TICRATE) // 0
) {
fixed_t height = (player->mo->eflags & MFE_VERTICALFLIP)
? player->mo->z - FixedMul(8*FRACUNIT + mobjinfo[MT_DROWNNUMBERS].height, FixedMul(player->mo->scale, player->shieldscale))
: player->mo->z + player->mo->height + FixedMul(8*FRACUNIT, FixedMul(player->mo->scale, player->shieldscale));
mobj_t *numbermobj = P_SpawnMobj(player->mo->x, player->mo->y, height, MT_DROWNNUMBERS);
timeleft /= (2*TICRATE); // To be strictly accurate it'd need to be ((timeleft/TICRATE) - 1)/2, but integer division rounds down for us
if (player->charflags & SF_MACHINE)
{
S_StartSound(player->mo, sfx_buzz1);
timeleft += 6;
}
else
S_StartSound(player->mo, sfx_dwnind);
if (timeleft) // Don't waste time setting the state if the time is 0.
P_SetMobjState(numbermobj, numbermobj->info->spawnstate+timeleft);
P_SetTarget(&numbermobj->target, player->mo);
numbermobj->threshold = 40;
numbermobj->destscale = player->mo->scale;
P_SetScale(numbermobj, player->mo->scale);
}
// Underwater timer runs out
else if (timeleft == 1)
{
if ((netgame || multiplayer) && P_IsLocalPlayer(player))
S_ChangeMusic(mapmusname, mapmusflags, true);
if (player->powers[pw_spacetime] == 1)
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_SPACEDROWN);
else
P_DamageMobj(player->mo, NULL, NULL, 1, DMG_DROWNED);
}
if (!(player->mo->eflags & MFE_UNDERWATER) && player->powers[pw_underwater])
{
if (player->powers[pw_underwater] <= 12*TICRATE + 1)
{
player->powers[pw_underwater] = 0;
P_RestoreMusic(player);
}
else
player->powers[pw_underwater] = 0;
}
if (player->powers[pw_spacetime] > 1 && !P_InSpaceSector(player->mo))
player->powers[pw_spacetime] = 0;
// Underwater audio cues
if (P_IsLocalPlayer(player))
{
if ((player->powers[pw_underwater] == 25*TICRATE + 1)
|| (player->powers[pw_underwater] == 20*TICRATE + 1)
|| (player->powers[pw_underwater] == 15*TICRATE + 1))
S_StartSound(NULL, sfx_wtrdng);
if (player->powers[pw_underwater] == 11*TICRATE + 1
&& player == &players[consoleplayer])
{
P_PlayJingle(player, JT_DROWN);
}
}
}*/
//
// P_CheckInvincibilityTimer
//
@ -2804,7 +2700,7 @@ static void P_DeathThink(player_t *player)
if (player->bot) // don't allow bots to do any of the below, B_CheckRespawn does all they need for respawning already
goto notrealplayer;
if ((player->pflags & PF_TIMEOVER) && (gametyperules & GTR_CIRCUIT))
if ((player->pflags & PF_GAMETYPEOVER) && (gametyperules & GTR_CIRCUIT))
{
player->karthud[khud_timeovercam]++;
@ -2819,13 +2715,13 @@ static void P_DeathThink(player_t *player)
K_KartPlayerHUDUpdate(player);
if (player->lives > 0 && !(player->pflags & PF_TIMEOVER) && player->deadtimer > TICRATE)
if (player->lives > 0 && !(player->pflags & PF_GAMETYPEOVER) && player->deadtimer > TICRATE)
{
player->playerstate = PST_REBORN;
}
// Keep time rolling
if (!(exitcountdown && !racecountdown) && !(player->exiting || mapreset) && !(player->pflags & PF_TIMEOVER))
if (!(exitcountdown && !racecountdown) && !(player->exiting || mapreset) && !(player->pflags & PF_GAMETYPEOVER))
{
if (leveltime >= starttime)
{
@ -3258,7 +3154,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall
|| (leveltime < introtime)); // Kart intro cam
#endif
if ((player->pflags & PF_TIMEOVER) && (gametyperules & GTR_CIRCUIT)) // 1 for momentum keep, 2 for turnaround
if ((player->pflags & PF_GAMETYPEOVER) && (gametyperules & GTR_CIRCUIT)) // 1 for momentum keep, 2 for turnaround
timeover = (player->karthud[khud_timeovercam] > 2*TICRATE ? 2 : 1);
else
timeover = 0;
@ -4053,7 +3949,7 @@ static void P_CalcPostImg(player_t *player)
void P_DoTimeOver(player_t *player)
{
if (player->pflags & PF_TIMEOVER)
if (player->pflags & PF_GAMETYPEOVER)
{
// NO! Don't do this!
return;
@ -4069,7 +3965,7 @@ void P_DoTimeOver(player_t *player)
CON_LogMessage(va(M_GetText("%s ran out of time.\n"), player_names[player-players]));
}
player->pflags |= PF_TIMEOVER;
player->pflags |= PF_GAMETYPEOVER;
if (G_GametypeUsesLives())
{
@ -4353,7 +4249,7 @@ static void P_HandleFollower(player_t *player)
// Make the follower invisible if we no contest'd rather than removing it. No one will notice the diff seriously.
// Also make the follower invisible if we choose not to have it displayed because it isn't ours. (also quick hacky check for f12)
if (player->pflags & PF_TIMEOVER || (!cv_showfollowers.value && (!P_IsDisplayPlayer(player) || displayplayers[0] != consoleplayer) ))
if (player->pflags & PF_GAMETYPEOVER || (!cv_showfollowers.value && (!P_IsDisplayPlayer(player) || displayplayers[0] != consoleplayer) ))
player->follower->drawflags |= MFD_DONTDRAW;
if (player->speed && (player->follower->momx || player->follower->momy))
@ -4562,7 +4458,7 @@ void P_PlayerThink(player_t *player)
{
if (playeringame[i] && !players[i].spectator)
{
if (!players[i].exiting && !(players[i].pflags & PF_TIMEOVER) && players[i].lives > 0)
if (!players[i].exiting && !(players[i].pflags & PF_GAMETYPEOVER) && players[i].lives > 0)
break;
}
}
@ -4583,7 +4479,7 @@ void P_PlayerThink(player_t *player)
// If you've hit the countdown and you haven't made
// it to the exit, you're a goner!
if (racecountdown == 1 && !player->spectator && !player->exiting && !(player->pflags & PF_TIMEOVER) && player->lives > 0)
if (racecountdown == 1 && !player->spectator && !player->exiting && !(player->pflags & PF_GAMETYPEOVER) && player->lives > 0)
{
P_DoTimeOver(player);
@ -4767,12 +4663,8 @@ void P_PlayerThink(player_t *player)
else if (player->onconveyor == 3)
player->cmomy = player->cmomx = 0;
//P_DoSuperStuff(player);
//P_CheckSneakerAndLivesTimer(player);
P_DoBubbleBreath(player); // Spawn Sonic's bubbles
//P_CheckUnderwaterAndSpaceTimer(player); // Display the countdown drown numbers!
P_CheckInvincibilityTimer(player); // Spawn Invincibility Sparkles
P_DoPlayerHeadSigns(player); // Spawn Tag/CTF signs over player's head
#if 1
// "Blur" a bit when you have speed shoes and are going fast enough
@ -4852,7 +4744,7 @@ void P_PlayerThink(player_t *player)
player->kartstuff[k_hyudorotimer] // SRB2kart - fixes Hyudoro not flashing when it should.
|| player->kartstuff[k_growshrinktimer] > 0 // Grow doesn't flash either.
|| (player->respawn.state != RESPAWNST_NONE) // Respawn timer (for drop dash effect)
|| (player->pflags & PF_TIMEOVER) // NO CONTEST explosion
|| (player->pflags & PF_GAMETYPEOVER) // NO CONTEST explosion
|| ((gametyperules & GTR_BUMPERS) && player->kartstuff[k_bumper] <= 0 && player->kartstuff[k_comebacktimer])
|| leveltime < starttime)) // Level intro
{

View file

@ -172,7 +172,7 @@ static void Y_UnloadVoteData(void);
//
static void Y_CompareTime(INT32 i)
{
UINT32 val = ((players[i].pflags & PF_TIMEOVER || players[i].realtime == UINT32_MAX)
UINT32 val = ((players[i].pflags & PF_GAMETYPEOVER || players[i].realtime == UINT32_MAX)
? (UINT32_MAX-1) : players[i].realtime);
if (!(val < data.match.val[data.match.numplayers]))
@ -184,11 +184,11 @@ static void Y_CompareTime(INT32 i)
static void Y_CompareScore(INT32 i)
{
UINT32 val = ((players[i].pflags & PF_TIMEOVER)
UINT32 val = ((players[i].pflags & PF_GAMETYPEOVER)
? (UINT32_MAX-1) : players[i].marescore);
if (!(data.match.val[data.match.numplayers] == UINT32_MAX
|| (!(players[i].pflags & PF_TIMEOVER) && val > data.match.val[data.match.numplayers])))
|| (!(players[i].pflags & PF_GAMETYPEOVER) && val > data.match.val[data.match.numplayers])))
return;
data.match.val[data.match.numplayers] = val;
@ -317,7 +317,7 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32))
if ((powertype == PWRLV_DISABLED)
&& (!rankingsmode)
&& !(players[i].pflags & PF_TIMEOVER)
&& !(players[i].pflags & PF_GAMETYPEOVER)
&& (data.match.pos[data.match.numplayers] < (numplayersingame + numgriefers)))
{
// Online rank is handled further below in this file.
@ -916,107 +916,6 @@ void Y_Ticker(void)
}
}
//
// Y_UpdateRecordReplays
//
// Update replay files/data, etc. for Record Attack
// See G_SetNightsRecords for NiGHTS Attack.
//
static void Y_UpdateRecordReplays(void)
{
const size_t glen = strlen(srb2home)+1+strlen("media")+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
char *gpath;
char lastdemo[256], bestdemo[256];
UINT8 earnedEmblems;
// Record new best time
if (!mainrecords[gamemap-1])
G_AllocMainRecordData(gamemap-1);
if (players[consoleplayer].pflags & PF_TIMEOVER)
{
players[consoleplayer].realtime = UINT32_MAX;
}
if (((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time))
&& (players[consoleplayer].realtime < UINT32_MAX)) // DNF
{
mainrecords[gamemap-1]->time = players[consoleplayer].realtime;
}
if (modeattacking == ATTACKING_RECORD)
{
if ((mainrecords[gamemap-1]->lap == 0) || (bestlap < mainrecords[gamemap-1]->lap))
mainrecords[gamemap-1]->lap = bestlap;
}
else
{
mainrecords[gamemap-1]->lap = 0;
}
// Save demo!
bestdemo[255] = '\0';
lastdemo[255] = '\0';
G_SetDemoTime(players[consoleplayer].realtime, bestlap);
G_CheckDemoStatus();
gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s",
srb2home, timeattackfolder);
M_MkdirEach(gpath, M_PathParts(gpath) - 3, 0755);
if ((gpath = malloc(glen)) == NULL)
I_Error("Out of memory for replay filepath\n");
sprintf(gpath,"%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", srb2home, timeattackfolder, G_BuildMapName(gamemap));
snprintf(lastdemo, 255, "%s-%s-last.lmp", gpath, cv_chooseskin.string);
if (FIL_FileExists(lastdemo))
{
UINT8 *buf;
size_t len = FIL_ReadFile(lastdemo, &buf);
snprintf(bestdemo, 255, "%s-%s-time-best.lmp", gpath, cv_chooseskin.string);
if (!FIL_FileExists(bestdemo) || G_CmpDemoTime(bestdemo, lastdemo) & 1)
{ // Better time, save this demo.
if (FIL_FileExists(bestdemo))
remove(bestdemo);
FIL_WriteFile(bestdemo, buf, len);
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW RECORD TIME!"), M_GetText("Saved replay as"), bestdemo);
}
if (modeattacking == ATTACKING_RECORD)
{
snprintf(bestdemo, 255, "%s-%s-lap-best.lmp", gpath, cv_chooseskin.string);
if (!FIL_FileExists(bestdemo) || G_CmpDemoTime(bestdemo, lastdemo) & (1<<1))
{ // Better lap time, save this demo.
if (FIL_FileExists(bestdemo))
remove(bestdemo);
FIL_WriteFile(bestdemo, buf, len);
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW RECORD LAP!"), M_GetText("Saved replay as"), bestdemo);
}
}
//CONS_Printf("%s '%s'\n", M_GetText("Saved replay as"), lastdemo);
Z_Free(buf);
}
free(gpath);
// Check emblems when level data is updated
if ((earnedEmblems = M_CheckLevelEmblems()))
CONS_Printf(M_GetText("\x82" "Earned %hu medal%s for Record Attack records.\n"), (UINT16)earnedEmblems, earnedEmblems > 1 ? "s" : "");
if (M_UpdateUnlockablesAndExtraEmblems())
S_StartSound(NULL, sfx_ncitem);
// SRB2Kart - save here so you NEVER lose your earned times/medals.
G_SaveGameData();
// Update timeattack menu's replay availability.
CV_AddValue(&cv_nextmap, 1);
CV_AddValue(&cv_nextmap, -1);
}
static void K_UpdatePowerLevels(void)
{
INT32 i, j;
@ -1618,7 +1517,7 @@ void Y_VoteDrawer(void)
hilicol = cons_menuhighlight.value;
else if (gametype == GT_RACE)
hilicol = V_SKYMAP;
else //if (gametype == GT_MATCH)
else //if (gametype == GT_BATTLE)
hilicol = V_REDMAP;
V_DrawCenteredString(BASEVIDWIDTH/2, 188, hilicol,
va("Vote ends in %d", tickdown));