From e84c618da8ffeaa84332db0c02f7d2b50bd8c013 Mon Sep 17 00:00:00 2001 From: TehRealSalt Date: Tue, 24 Sep 2019 07:17:05 -0400 Subject: [PATCH] Rudimentary Record Attack support --- src/d_clisrv.c | 6 +- src/dehacked.c | 8 +-- src/doomstat.h | 2 +- src/g_game.c | 187 +++++++++++++++++++++++-------------------------- src/m_cond.c | 3 +- src/m_cond.h | 4 +- src/m_menu.c | 186 ++++++++++++++++++++---------------------------- src/p_setup.c | 19 ++--- src/st_stuff.c | 2 +- src/y_inter.c | 71 ++++++++++--------- 10 files changed, 226 insertions(+), 262 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 33a1dfe61..a88f06f13 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -3683,7 +3683,11 @@ void SV_StartSinglePlayerServer(void) server = true; netgame = false; multiplayer = false; - gametype = GT_RACE; //srb2kart + + if (modeattacking == ATTACKING_CAPSULES) + gametype = GT_MATCH; //srb2kart + else + gametype = GT_RACE; //srb2kart // no more tic the game with this settings! SV_StopServer(); diff --git a/src/dehacked.c b/src/dehacked.c index edfade76b..ed1700b18 100644 --- a/src/dehacked.c +++ b/src/dehacked.c @@ -2473,10 +2473,10 @@ static void readunlockable(MYFILE *f, INT32 num) unlockables[num].type = SECRET_PANDORA; else if (fastcmp(word2, "CREDITS")) unlockables[num].type = SECRET_CREDITS; - else if (fastcmp(word2, "RECORDATTACK")) - unlockables[num].type = SECRET_RECORDATTACK; - else if (fastcmp(word2, "NIGHTSMODE")) - unlockables[num].type = SECRET_NIGHTSMODE; + else if (fastcmp(word2, "TIMEATTACK")) + unlockables[num].type = SECRET_TIMEATTACK; + else if (fastcmp(word2, "BREAKTHECAPSULES")) + unlockables[num].type = SECRET_BREAKTHECAPSULES; else if (fastcmp(word2, "HEADER")) unlockables[num].type = SECRET_HEADER; else if (fastcmp(word2, "LEVELSELECT")) diff --git a/src/doomstat.h b/src/doomstat.h index 716b3fe85..4ba7cc665 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -64,7 +64,7 @@ extern boolean metalrecording; #define ATTACKING_NONE 0 #define ATTACKING_RECORD 1 -//#define ATTACKING_NIGHTS 2 +#define ATTACKING_CAPSULES 2 extern UINT8 modeattacking; // menu demo things diff --git a/src/g_game.c b/src/g_game.c index 50aa7b904..ba9382c37 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2866,9 +2866,13 @@ void G_SpawnPlayer(INT32 playernum, boolean starpost) return; } + // -- Record Attack -- + if (modeattacking) + spawnpoint = playerstarts[0]; + // -- CTF -- // Order: CTF->DM->Coop - if (gametype == GT_CTF && players[playernum].ctfteam) + else if (gametype == GT_CTF && players[playernum].ctfteam) { if (!(spawnpoint = G_FindCTFStart(playernum)) // find a CTF start && !(spawnpoint = G_FindMatchStart(playernum))) // find a DM start @@ -4745,8 +4749,8 @@ char *G_BuildMapTitle(INT32 mapnum) #define DEMOHEADER "\xF0" "KartReplay" "\x0F" #define DF_GHOST 0x01 // This demo contains ghost data too! -#define DF_RECORDATTACK 0x02 // This demo is from record attack and contains its final completion time! -#define DF_NIGHTSATTACK 0x04 // This demo is from NiGHTS attack and contains its time left, score, and mares! +#define DF_TIMEATTACK 0x02 // This demo is from Time Attack and contains its final completion time & best lap! +#define DF_BREAKTHECAPSULES 0x04 // This demo is from Break the Capsules and contains its final completion time! #define DF_ATTACKMASK 0x06 // This demo is from ??? attack and contains ??? #define DF_ATTACKSHIFT 1 #define DF_ENCORE 0x40 @@ -4790,7 +4794,6 @@ static ticcmd_t oldcmd[MAXPLAYERS]; // Not used for Metal Sonic #define GZT_SPRITE 0x10 // Animation frame #define GZT_EXTRA 0x20 -#define GZT_NIGHTS 0x40 // NiGHTS Mode stuff! // GZT_EXTRA flags #define EZT_THOK 0x01 // Spawned a thok object @@ -5294,13 +5297,6 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum) if (!(demoflags & DF_GHOST)) return; // No ghost data to write. - if (ghost->player && ghost->player->pflags & PF_NIGHTSMODE && ghost->tracer) - { - // We're talking about the NiGHTS thing, not the normal platforming thing! - ziptic |= GZT_NIGHTS; - ghost = ghost->tracer; - } - ziptic_p = demo_p++; // the ziptic, written at the end of this function #define MAXMOM (0x7FFF<<8) @@ -5517,12 +5513,6 @@ void G_ConsGhostTic(INT32 playernum) demo_p++; if (ziptic & GZT_SPRITE) demo_p++; - if(ziptic & GZT_NIGHTS) { - if (!testmo || !testmo->player || !(testmo->player->pflags & PF_NIGHTSMODE) || !testmo->tracer) - nightsfail = true; - else - testmo = testmo->tracer; - } if (ziptic & GZT_EXTRA) { // But wait, there's more! @@ -6373,20 +6363,19 @@ void G_BeginRecording(void) switch ((demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) { - case ATTACKING_NONE: // 0 - break; - case ATTACKING_RECORD: // 1 - demotime_p = demo_p; - WRITEUINT32(demo_p,UINT32_MAX); // time - WRITEUINT32(demo_p,UINT32_MAX); // lap - break; - /*case ATTACKING_NIGHTS: // 2 - demotime_p = demo_p; - WRITEUINT32(demo_p,UINT32_MAX); // time - WRITEUINT32(demo_p,0); // score - break;*/ - default: // 3 - break; + case ATTACKING_NONE: // 0 + break; + case ATTACKING_RECORD: // 1 + demotime_p = demo_p; + WRITEUINT32(demo_p,UINT32_MAX); // time + WRITEUINT32(demo_p,UINT32_MAX); // lap + break; + case ATTACKING_CAPSULES: // 2 + demotime_p = demo_p; + WRITEUINT32(demo_p,UINT32_MAX); // time + break; + default: // 3 + break; } WRITEUINT32(demo_p,P_GetInitSeed()); @@ -6524,18 +6513,18 @@ void G_SetDemoTime(UINT32 ptime, UINT32 plap) { if (!demo.recording || !demotime_p) return; - if (demoflags & DF_RECORDATTACK) + if (demoflags & DF_TIMEATTACK) { WRITEUINT32(demotime_p, ptime); WRITEUINT32(demotime_p, plap); demotime_p = NULL; } - /*else if (demoflags & DF_NIGHTSATTACK) + else if (demoflags & DF_BREAKTHECAPSULES) { WRITEUINT32(demotime_p, ptime); - WRITEUINT32(demotime_p, pscore); + (void)plap; demotime_p = NULL; - }*/ + } } static void G_LoadDemoExtraFiles(UINT8 **pp) @@ -6711,6 +6700,7 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname) UINT8 c; UINT16 s ATTRUNUSED; UINT8 aflags = 0; + boolean uselaps = false; // load the new file FIL_DefaultExtension(newname, ".lmp"); @@ -6737,20 +6727,17 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname) p++; // gametype G_SkipDemoExtraFiles(&p); - aflags = flags & (DF_RECORDATTACK|DF_NIGHTSATTACK); + aflags = flags & (DF_TIMEATTACK|DF_BREAKTHECAPSULES); I_Assert(aflags); - if (flags & DF_RECORDATTACK) - { - newtime = READUINT32(p); + + if (flags & DF_TIMEATTACK) + uselaps = true; // get around uninitalized error + + newtime = READUINT32(p); + if (uselaps) newlap = READUINT32(p); - } - /*else if (flags & DF_NIGHTSATTACK) - { - newtime = READUINT32(p); - newscore = READUINT32(p); - }*/ - else // appease compiler - return 0; + else + newlap = UINT32_MAX; Z_Free(buffer); @@ -6809,28 +6796,32 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname) Z_Free(buffer); return UINT8_MAX; } - if (flags & DF_RECORDATTACK) - { - oldtime = READUINT32(p); + + oldtime = READUINT32(p); + if (uselaps) oldlap = READUINT32(p); - } - /*else if (flags & DF_NIGHTSATTACK) - { - oldtime = READUINT32(p); - oldscore = READUINT32(p); - }*/ - else // appease compiler - return UINT8_MAX; + else + oldlap = 0; Z_Free(buffer); c = 0; - if (newtime < oldtime - || (newtime == oldtime && (newlap < oldlap))) - c |= 1; // Better time - if (newlap < oldlap - || (newlap == oldlap && newtime < oldtime)) - c |= 1<<1; // Better lap time + + if (uselaps) + { + if (newtime < oldtime + || (newtime == oldtime && (newlap < oldlap))) + c |= 1; // Better time + if (newlap < oldlap + || (newlap == oldlap && newtime < oldtime)) + c |= 1<<1; // Better lap time + } + else + { + if (newtime < oldtime) + c |= 1; // Better time + } + return c; } @@ -7246,19 +7237,18 @@ void G_DoPlayDemo(char *defdemoname) switch (modeattacking) { - case ATTACKING_NONE: // 0 - break; - case ATTACKING_RECORD: // 1 - hu_demotime = READUINT32(demo_p); - hu_demolap = READUINT32(demo_p); - break; - /*case ATTACKING_NIGHTS: // 2 - hu_demotime = READUINT32(demo_p); - hu_demoscore = READUINT32(demo_p); - break;*/ - default: // 3 - modeattacking = ATTACKING_NONE; - break; + case ATTACKING_NONE: // 0 + break; + case ATTACKING_RECORD: // 1 + hu_demotime = READUINT32(demo_p); + hu_demolap = READUINT32(demo_p); + break; + case ATTACKING_CAPSULES: // 2 + hu_demotime = READUINT32(demo_p); + break; + default: // 3 + modeattacking = ATTACKING_NONE; + break; } // Random seed @@ -7651,18 +7641,19 @@ void G_AddGhost(char *defdemoname) if (ghostversion != 0x0001) #endif G_SkipDemoExtraFiles(&p); // Don't wanna modify the file list for ghosts. + switch ((flags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) { - case ATTACKING_NONE: // 0 - break; - case ATTACKING_RECORD: // 1 - p += 8; // demo time, lap - break; - /*case ATTACKING_NIGHTS: // 2 - p += 8; // demo time left, score - break;*/ - default: // 3 - break; + case ATTACKING_NONE: // 0 + break; + case ATTACKING_RECORD: // 1 + p += 8; // demo time, lap + break; + case ATTACKING_CAPSULES: // 2 + p += 4; // demo time + break; + default: // 3 + break; } p += 4; // random seed @@ -7901,16 +7892,16 @@ void G_UpdateStaffGhostName(lumpnum_t l) switch ((flags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) { - case ATTACKING_NONE: // 0 - break; - case ATTACKING_RECORD: // 1 - p += 8; // demo time, lap - break; - /*case ATTACKING_NIGHTS: // 2 - p += 8; // demo time left, score - break;*/ - default: // 3 - break; + case ATTACKING_NONE: // 0 + break; + case ATTACKING_RECORD: // 1 + p += 8; // demo time, lap + break; + case ATTACKING_CAPSULES: // 2 + p += 4; // demo time + break; + default: // 3 + break; } p += 4; // random seed @@ -8256,7 +8247,7 @@ void G_SaveDemo(void) free(demobuffer); demo.recording = false; - if (modeattacking != ATTACKING_RECORD) + if (!modeattacking) { if (demo.savemode == DSM_SAVED) CONS_Printf(M_GetText("Demo %s recorded\n"), demoname); diff --git a/src/m_cond.c b/src/m_cond.c index b777e7d22..2195b42e4 100644 --- a/src/m_cond.c +++ b/src/m_cond.c @@ -171,7 +171,8 @@ unlockable_t unlockables[MAXUNLOCKABLES] = /* 05 */ {"Encore Mode", "", 4, 5, SECRET_ENCORE, 0, false, false, 0}, /* 06 */ {"Hell Attack", "", 6, 6, SECRET_HELLATTACK, 0, false, false, 0}, - /* 07 */ {"Record Attack", "", -1, -1, SECRET_RECORDATTACK, 0, true, true, 0}, + /* 07 */ {"Time Attack", "", -1, -1, SECRET_TIMEATTACK, 0, true, true, 0}, + /* 08 */ {"Break the Capsules", "", -1, -1, SECRET_BREAKTHECAPSULES, 0, true, true, 0}, }; // Default number of emblems and extra emblems diff --git a/src/m_cond.h b/src/m_cond.h index 07e4480d1..37edcada9 100644 --- a/src/m_cond.h +++ b/src/m_cond.h @@ -117,8 +117,8 @@ typedef struct #define SECRET_ITEMFINDER -5 // Enables Item Finder/Emblem Radar #define SECRET_EMBLEMHINTS -4 // Enables Emblem Hints #define SECRET_PANDORA -3 // Enables Pandora's Box -#define SECRET_RECORDATTACK -2 // Enables Record Attack on the main menu -#define SECRET_NIGHTSMODE -1 // Enables NiGHTS Mode on the main menu +#define SECRET_TIMEATTACK -2 // Enables Time Attack on the main menu +#define SECRET_BREAKTHECAPSULES -1 // Enables Break the Capsules on the main menu #define SECRET_HEADER 0 // Does nothing on its own, just serves as a header for the menu #define SECRET_LEVELSELECT 1 // Selectable level select #define SECRET_WARP 2 // Selectable warp diff --git a/src/m_menu.c b/src/m_menu.c index 166b115d6..ed7afd81d 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -133,8 +133,8 @@ typedef enum { LLM_CREATESERVER, LLM_LEVELSELECT, - LLM_RECORDATTACK, - LLM_NIGHTSATTACK + LLM_TIMEATTACK, + LLM_BREAKTHECAPSULES } levellist_mode_t; levellist_mode_t levellistmode = LLM_CREATESERVER; @@ -200,9 +200,7 @@ static char *M_GetConditionString(condition_t cond); menu_t SR_MainDef, SR_UnlockChecklistDef; // Misc. Main Menu -#if 0 // Bring this back when we have actual single-player static void M_SinglePlayerMenu(INT32 choice); -#endif static void M_Options(INT32 choice); static void M_Manual(INT32 choice); static void M_SelectableClearMenus(INT32 choice); @@ -225,7 +223,7 @@ menu_t MISC_ScrambleTeamDef, MISC_ChangeTeamDef, MISC_ChangeSpectateDef; //static void M_LoadGame(INT32 choice); static void M_TimeAttack(INT32 choice); static boolean M_QuitTimeAttackMenu(void); -//static void M_NightsAttack(INT32 choice); +static void M_BreakTheCapsules(INT32 choice); static void M_Statistics(INT32 choice); static void M_HandleStaffReplay(INT32 choice); static void M_ReplayTimeAttack(INT32 choice); @@ -473,8 +471,7 @@ static consvar_t cv_dummystaff = {"dummystaff", "0", CV_HIDEN|CV_CALL, dummystaf static menuitem_t MainMenu[] = { {IT_SUBMENU|IT_STRING, NULL, "Extras", &SR_MainDef, 76}, - //{IT_CALL |IT_STRING, NULL, "1 Player", M_SinglePlayerMenu, 84}, - {IT_CALL |IT_STRING, NULL, "Time Attack", M_TimeAttack, 84}, + {IT_CALL |IT_STRING, NULL, "1 Player", M_SinglePlayerMenu, 84}, {IT_SUBMENU|IT_STRING, NULL, "Multiplayer", &MP_MainDef, 92}, {IT_CALL |IT_STRING, NULL, "Options", M_Options, 100}, {IT_CALL |IT_STRING, NULL, "Addons", M_Addons, 108}, @@ -790,18 +787,16 @@ static menuitem_t SR_EmblemHintMenu[] = // Single Player Main static menuitem_t SP_MainMenu[] = { - //{IT_CALL | IT_STRING, NULL, "Start Game", M_LoadGame, 92}, - {IT_SECRET, NULL, "Record Attack", M_TimeAttack, 100}, - //{IT_SECRET, NULL, "NiGHTS Mode", M_NightsAttack, 108}, - {IT_CALL | IT_STRING | IT_CALL_NOTMODIFIED, NULL, "Statistics", M_Statistics, 108}, + //{IT_CALL | IT_STRING, NULL, "Grand Prix", M_LoadGame, 92}, + {IT_SECRET, NULL, "Time Attack", M_TimeAttack, 100}, + {IT_SECRET, NULL, "Break the Capsules", M_BreakTheCapsules, 108}, }; enum { - //sploadgame, - sprecordattack, - //spnightsmode, - spstatistics + //spgrandprix, + sptimeattack, + spbreakthecapsules }; // Single Player Load Game @@ -1860,52 +1855,6 @@ static menu_t SP_GhostDef = NULL }; -/*static menu_t SP_NightsAttackDef = -{ - "M_NIGHTS", - sizeof (SP_NightsAttackMenu)/sizeof (menuitem_t), - &MainDef, // Doesn't matter. - SP_NightsAttackMenu, - M_DrawNightsAttackMenu, - 32, 40, - 0, - NULL -}; -static menu_t SP_NightsReplayDef = -{ - "M_NIGHTS", - sizeof(SP_NightsReplayMenu)/sizeof(menuitem_t), - &SP_NightsAttackDef, - SP_NightsReplayMenu, - M_DrawNightsAttackMenu, - 32, 120, - 0, - NULL -}; -static menu_t SP_NightsGuestReplayDef = -{ - "M_NIGHTS", - sizeof(SP_NightsGuestReplayMenu)/sizeof(menuitem_t), - &SP_NightsAttackDef, - SP_NightsGuestReplayMenu, - M_DrawNightsAttackMenu, - 32, 120, - 0, - NULL -}; -static menu_t SP_NightsGhostDef = -{ - "M_NIGHTS", - sizeof(SP_NightsGhostMenu)/sizeof(menuitem_t), - &SP_NightsAttackDef, - SP_NightsGhostMenu, - M_DrawNightsAttackMenu, - 32, 120, - 0, - NULL -};*/ - - /*menu_t SP_PlayerDef = { "M_PICKP", @@ -2144,7 +2093,7 @@ static void Nextmap_OnChange(void) CV_StealthSetValue(&cv_dummystaff, 0); - active = false; + active = 0; SP_TimeAttackMenu[taguest].status = IT_DISABLED; SP_TimeAttackMenu[tareplay].status = IT_DISABLED; //SP_TimeAttackMenu[taghost].status = IT_DISABLED; @@ -2165,11 +2114,15 @@ static void Nextmap_OnChange(void) SP_GuestReplayMenu[0].status = IT_WHITESTRING|IT_CALL; active |= 3; } - if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) { - SP_ReplayMenu[1].status = IT_WHITESTRING|IT_CALL; - SP_GuestReplayMenu[1].status = IT_WHITESTRING|IT_CALL; - active |= 3; + + if (levellistmode != LLM_BREAKTHECAPSULES) { + if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) { + SP_ReplayMenu[1].status = IT_WHITESTRING|IT_CALL; + SP_GuestReplayMenu[1].status = IT_WHITESTRING|IT_CALL; + active |= 3; + } } + if (FIL_FileExists(va("%s-%s-last.lmp", gpath, cv_chooseskin.string))) { SP_ReplayMenu[2].status = IT_WHITESTRING|IT_CALL; SP_GuestReplayMenu[2].status = IT_WHITESTRING|IT_CALL; @@ -4232,11 +4185,13 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt) return false; // not unlocked return true;*/ - case LLM_RECORDATTACK: + case LLM_TIMEATTACK: + case LLM_BREAKTHECAPSULES: /*if (!(mapheaderinfo[mapnum]->menuflags & LF2_RECORDATTACK)) return false;*/ - if (!(mapheaderinfo[mapnum]->typeoflevel & TOL_RACE)) + if ((levellistmode == LLM_TIMEATTACK && !(mapheaderinfo[mapnum]->typeoflevel & TOL_RACE)) + || (levellistmode == LLM_BREAKTHECAPSULES && !(mapheaderinfo[mapnum]->typeoflevel & TOL_MATCH))) return false; if (M_MapLocked(mapnum+1)) @@ -4255,20 +4210,6 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt) return false;*/ return true; - /*case LLM_NIGHTSATTACK: - if (!(mapheaderinfo[mapnum]->menuflags & LF2_NIGHTSATTACK)) - return false; - - if (M_MapLocked(mapnum+1)) - return false; // not unlocked - - if (mapheaderinfo[mapnum]->menuflags & LF2_NOVISITNEEDED) - return true; - - if (!mapvisited[mapnum]) - return false; - - return true;*/ default: return false; } @@ -6594,18 +6535,16 @@ static void M_Credits(INT32 choice) // SINGLE PLAYER MENU // ================== -#if 0 // Bring this back when we have actual single-player static void M_SinglePlayerMenu(INT32 choice) { (void)choice; - SP_MainMenu[sprecordattack].status = - (M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING : IT_SECRET; - /*SP_MainMenu[spnightsmode].status = - (M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;*/ + SP_MainMenu[sptimeattack].status = + (M_SecretUnlocked(SECRET_TIMEATTACK)) ? IT_CALL|IT_STRING : IT_SECRET; + SP_MainMenu[spbreakthecapsules].status = + (M_SecretUnlocked(SECRET_BREAKTHECAPSULES)) ? IT_CALL|IT_STRING : IT_SECRET; M_SetupNextMenu(&SP_MainDef); } -#endif /*static void M_LoadGameLevelSelect(INT32 choice) { @@ -7586,8 +7525,11 @@ void M_DrawTimeAttackMenu(void) V_DrawFill((BASEVIDWIDTH - dupadjust)>>1, 78, dupadjust, 36, 159); - V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:"); - K_drawKartTimestamp(lap, 19, 86, 0, 2); + if (levellistmode != LLM_BREAKTHECAPSULES) + { + V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:"); + K_drawKartTimestamp(lap, 19, 86, 0, 2); + } V_DrawRightAlignedString(292, 80, highlightflags, "BEST TIME:"); K_drawKartTimestamp(time, 162, 86, cv_nextmap.value, 1); @@ -7676,11 +7618,43 @@ static void M_TimeAttack(INT32 choice) memset(skins_cons_t, 0, sizeof (skins_cons_t)); - levellistmode = LLM_RECORDATTACK; // Don't be dependent on cv_newgametype + levellistmode = LLM_TIMEATTACK; // Don't be dependent on cv_newgametype if (M_CountLevelsToShowInList() == 0) { - M_StartMessage(M_GetText("No record-attackable levels found.\n"),NULL,MM_NOTHING); + M_StartMessage(M_GetText("No levels found for Time Attack.\n"),NULL,MM_NOTHING); + return; + } + + M_PatchSkinNameTable(); + + M_PrepareLevelSelect(); + M_SetupNextMenu(&SP_TimeAttackDef); + + G_SetGamestate(GS_TIMEATTACK); + + if (cv_nextmap.value) + Nextmap_OnChange(); + else + CV_AddValue(&cv_nextmap, 1); + + itemOn = tastart; // "Start" is selected. + + S_ChangeMusicInternal("racent", true); +} + +// Same as above, but sets a different levellistmode. Should probably be merged... +static void M_BreakTheCapsules(INT32 choice) +{ + (void)choice; + + memset(skins_cons_t, 0, sizeof (skins_cons_t)); + + levellistmode = LLM_BREAKTHECAPSULES; // Don't be dependent on cv_newgametype + + if (M_CountLevelsToShowInList() == 0) + { + M_StartMessage(M_GetText("No levels found for Break the Capsules.\n"),NULL,MM_NOTHING); return; } @@ -7814,13 +7788,13 @@ static boolean M_QuitTimeAttackMenu(void) }*/ // Going to Nights Attack menu... -/*static void M_NightsAttack(INT32 choice) +/*static void M_BreakTheCapsules(INT32 choice) { (void)choice; memset(skins_cons_t, 0, sizeof (skins_cons_t)); - levellistmode = LLM_NIGHTSATTACK; // Don't be dependent on cv_newgametype + levellistmode = LLM_BREAKTHECAPSULES; // Don't be dependent on cv_newgametype if (M_CountLevelsToShowInList() == 0) { @@ -7848,7 +7822,7 @@ static boolean M_QuitTimeAttackMenu(void) (void)choice; emeralds = 0; M_ClearMenus(true); - modeattacking = ATTACKING_NIGHTS; + modeattacking = ATTACKING_CAPSULES; I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755); I_mkdir(va("%s"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder), 0755); @@ -7872,7 +7846,7 @@ static void M_ChooseTimeAttack(INT32 choice) (void)choice; emeralds = 0; M_ClearMenus(true); - modeattacking = ATTACKING_RECORD; + modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_RECORD); I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755); I_mkdir(va("%s"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder), 0755); @@ -7922,7 +7896,7 @@ static void M_HandleStaffReplay(INT32 choice) if (l == LUMPERROR) break; M_ClearMenus(true); - modeattacking = ATTACKING_RECORD; + modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_RECORD); 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; @@ -7943,7 +7917,7 @@ static void M_ReplayTimeAttack(INT32 choice) { const char *which; M_ClearMenus(true); - modeattacking = ATTACKING_RECORD; // set modeattacking before G_DoPlayDemo so the map loader knows + modeattacking = (levellistmode == LLM_BREAKTHECAPSULES ? ATTACKING_CAPSULES : ATTACKING_RECORD); // 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) @@ -8090,10 +8064,8 @@ static void M_ModeAttackRetry(INT32 choice) { (void)choice; G_CheckDemoStatus(); // Cancel recording - if (modeattacking == ATTACKING_RECORD) + if (modeattacking) M_ChooseTimeAttack(0); - /*else if (modeattacking == ATTACKING_NIGHTS) - M_ChooseNightsAttack(0);*/ } static void M_ModeAttackEndGame(INT32 choice) @@ -8105,16 +8077,10 @@ static void M_ModeAttackEndGame(INT32 choice) Command_ExitGame_f(); M_StartControlPanel(); - switch(modeattacking) - { - default: - case ATTACKING_RECORD: + + if (modeattacking) currentMenu = &SP_TimeAttackDef; - break; - /*case ATTACKING_NIGHTS: - currentMenu = &SP_NightsAttackDef; - break;*/ - } + itemOn = currentMenu->lastOn; G_SetGamestate(GS_TIMEATTACK); modeattacking = ATTACKING_NONE; diff --git a/src/p_setup.c b/src/p_setup.c index 81bbcdd68..9c65ab9bb 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -2630,15 +2630,18 @@ static void P_LoadRecordGhosts(void) } // Best Lap ghost - if (cv_ghost_bestlap.value) + if (modeattacking != ATTACKING_CAPSULES) { - for (i = 0; i < numskins; ++i) + if (cv_ghost_bestlap.value) { - if (cv_ghost_bestlap.value == 1 && players[consoleplayer].skin != i) - continue; + for (i = 0; i < numskins; ++i) + { + if (cv_ghost_bestlap.value == 1 && players[consoleplayer].skin != i) + continue; - if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, skins[i].name))) - G_AddGhost(va("%s-%s-lap-best.lmp", gpath, skins[i].name)); + if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, skins[i].name))) + G_AddGhost(va("%s-%s-lap-best.lmp", gpath, skins[i].name)); + } } } @@ -3145,10 +3148,8 @@ boolean P_SetupLevel(boolean skipprecip) } } - if (modeattacking == ATTACKING_RECORD && !demo.playback) + if (modeattacking && !demo.playback) P_LoadRecordGhosts(); - /*else if (modeattacking == ATTACKING_NIGHTS && !demo.playback) - P_LoadNightsGhosts();*/ if (G_RaceGametype() && server) CV_StealthSetValue(&cv_numlaps, diff --git a/src/st_stuff.c b/src/st_stuff.c index e59846aed..fb7bd2aa5 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1272,7 +1272,7 @@ static void ST_drawNiGHTSHUD(void) // SRB2kart - unused. #endif ) { - if (modeattacking == ATTACKING_NIGHTS) + if (modeattacking == ATTACKING_CAPSULES) { INT32 maretime = max(stplyr->realtime - stplyr->marebegunat, 0); fixed_t cornerx = vid.width, cornery = vid.height-SCZ(20); diff --git a/src/y_inter.c b/src/y_inter.c index 855aae6a2..aac984316 100644 --- a/src/y_inter.c +++ b/src/y_inter.c @@ -720,8 +720,13 @@ static void Y_UpdateRecordReplays(void) if ((mainrecords[gamemap-1]->time == 0) || (players[consoleplayer].realtime < mainrecords[gamemap-1]->time)) mainrecords[gamemap-1]->time = players[consoleplayer].realtime; - if ((mainrecords[gamemap-1]->lap == 0) || (bestlap < mainrecords[gamemap-1]->lap)) - mainrecords[gamemap-1]->lap = bestlap; + if (modeattacking != ATTACKING_CAPSULES) + { + 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'; @@ -752,13 +757,16 @@ static void Y_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-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); + if (modeattacking != ATTACKING_CAPSULES) + { + 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); @@ -800,12 +808,20 @@ void Y_StartIntermission(void) { timer = 0; - /* // srb2kart: time attack tally is UGLY rn - if (modeattacking) - intertype = int_timeattack; - else - */ - intertype = int_race; + if (!majormods && !multiplayer && !demo.playback) // move this once we have a proper time attack screen + { + // Update visitation flags + mapvisited[gamemap-1] |= MV_BEATEN; + if (ALL7EMERALDS(emeralds)) + mapvisited[gamemap-1] |= MV_ALLEMERALDS; + /*if (ultimatemode) + mapvisited[gamemap-1] |= MV_ULTIMATE; + if (data.coop.gotperfbonus) + mapvisited[gamemap-1] |= MV_PERFECT;*/ + + if (modeattacking) + Y_UpdateRecordReplays(); + } } else { @@ -820,13 +836,13 @@ void Y_StartIntermission(void) if (!timer) timer = 1; } - - if (gametype == GT_MATCH) - intertype = int_match; - else //if (gametype == GT_RACE) - intertype = int_race; } + if (gametype == GT_MATCH) + intertype = int_match; + else //if (gametype == GT_RACE) + intertype = int_race; + // We couldn't display the intermission even if we wanted to. // But we still need to give the players their score bonuses, dummy. //if (dedicated) return; @@ -847,21 +863,6 @@ void Y_StartIntermission(void) } case int_race: // (time-only race) { - if (!majormods && !multiplayer && !demo.playback) // remove this once we have a proper time attack screen - { - // Update visitation flags - mapvisited[gamemap-1] |= MV_BEATEN; - if (ALL7EMERALDS(emeralds)) - mapvisited[gamemap-1] |= MV_ALLEMERALDS; - /*if (ultimatemode) - mapvisited[gamemap-1] |= MV_ULTIMATE; - if (data.coop.gotperfbonus) - mapvisited[gamemap-1] |= MV_PERFECT;*/ - - if (modeattacking == ATTACKING_RECORD) - Y_UpdateRecordReplays(); - } - // Calculate who won Y_CalculateMatchData(0, Y_CompareRace); break;