Rudimentary Record Attack support

This commit is contained in:
TehRealSalt 2019-09-24 07:17:05 -04:00
parent 74552f9ee5
commit e84c618da8
10 changed files with 226 additions and 262 deletions

View file

@ -3683,7 +3683,11 @@ void SV_StartSinglePlayerServer(void)
server = true; server = true;
netgame = false; netgame = false;
multiplayer = 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! // no more tic the game with this settings!
SV_StopServer(); SV_StopServer();

View file

@ -2473,10 +2473,10 @@ static void readunlockable(MYFILE *f, INT32 num)
unlockables[num].type = SECRET_PANDORA; unlockables[num].type = SECRET_PANDORA;
else if (fastcmp(word2, "CREDITS")) else if (fastcmp(word2, "CREDITS"))
unlockables[num].type = SECRET_CREDITS; unlockables[num].type = SECRET_CREDITS;
else if (fastcmp(word2, "RECORDATTACK")) else if (fastcmp(word2, "TIMEATTACK"))
unlockables[num].type = SECRET_RECORDATTACK; unlockables[num].type = SECRET_TIMEATTACK;
else if (fastcmp(word2, "NIGHTSMODE")) else if (fastcmp(word2, "BREAKTHECAPSULES"))
unlockables[num].type = SECRET_NIGHTSMODE; unlockables[num].type = SECRET_BREAKTHECAPSULES;
else if (fastcmp(word2, "HEADER")) else if (fastcmp(word2, "HEADER"))
unlockables[num].type = SECRET_HEADER; unlockables[num].type = SECRET_HEADER;
else if (fastcmp(word2, "LEVELSELECT")) else if (fastcmp(word2, "LEVELSELECT"))

View file

@ -64,7 +64,7 @@ extern boolean metalrecording;
#define ATTACKING_NONE 0 #define ATTACKING_NONE 0
#define ATTACKING_RECORD 1 #define ATTACKING_RECORD 1
//#define ATTACKING_NIGHTS 2 #define ATTACKING_CAPSULES 2
extern UINT8 modeattacking; extern UINT8 modeattacking;
// menu demo things // menu demo things

View file

@ -2866,9 +2866,13 @@ void G_SpawnPlayer(INT32 playernum, boolean starpost)
return; return;
} }
// -- Record Attack --
if (modeattacking)
spawnpoint = playerstarts[0];
// -- CTF -- // -- CTF --
// Order: CTF->DM->Coop // 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 if (!(spawnpoint = G_FindCTFStart(playernum)) // find a CTF start
&& !(spawnpoint = G_FindMatchStart(playernum))) // find a DM start && !(spawnpoint = G_FindMatchStart(playernum))) // find a DM start
@ -4745,8 +4749,8 @@ char *G_BuildMapTitle(INT32 mapnum)
#define DEMOHEADER "\xF0" "KartReplay" "\x0F" #define DEMOHEADER "\xF0" "KartReplay" "\x0F"
#define DF_GHOST 0x01 // This demo contains ghost data too! #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_TIMEATTACK 0x02 // This demo is from Time Attack and contains its final completion time & best lap!
#define DF_NIGHTSATTACK 0x04 // This demo is from NiGHTS attack and contains its time left, score, and mares! #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_ATTACKMASK 0x06 // This demo is from ??? attack and contains ???
#define DF_ATTACKSHIFT 1 #define DF_ATTACKSHIFT 1
#define DF_ENCORE 0x40 #define DF_ENCORE 0x40
@ -4790,7 +4794,6 @@ static ticcmd_t oldcmd[MAXPLAYERS];
// Not used for Metal Sonic // Not used for Metal Sonic
#define GZT_SPRITE 0x10 // Animation frame #define GZT_SPRITE 0x10 // Animation frame
#define GZT_EXTRA 0x20 #define GZT_EXTRA 0x20
#define GZT_NIGHTS 0x40 // NiGHTS Mode stuff!
// GZT_EXTRA flags // GZT_EXTRA flags
#define EZT_THOK 0x01 // Spawned a thok object #define EZT_THOK 0x01 // Spawned a thok object
@ -5294,13 +5297,6 @@ void G_WriteGhostTic(mobj_t *ghost, INT32 playernum)
if (!(demoflags & DF_GHOST)) if (!(demoflags & DF_GHOST))
return; // No ghost data to write. 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 ziptic_p = demo_p++; // the ziptic, written at the end of this function
#define MAXMOM (0x7FFF<<8) #define MAXMOM (0x7FFF<<8)
@ -5517,12 +5513,6 @@ void G_ConsGhostTic(INT32 playernum)
demo_p++; demo_p++;
if (ziptic & GZT_SPRITE) if (ziptic & GZT_SPRITE)
demo_p++; 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) if (ziptic & GZT_EXTRA)
{ // But wait, there's more! { // But wait, there's more!
@ -6373,20 +6363,19 @@ void G_BeginRecording(void)
switch ((demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) switch ((demoflags & DF_ATTACKMASK)>>DF_ATTACKSHIFT)
{ {
case ATTACKING_NONE: // 0 case ATTACKING_NONE: // 0
break; break;
case ATTACKING_RECORD: // 1 case ATTACKING_RECORD: // 1
demotime_p = demo_p; demotime_p = demo_p;
WRITEUINT32(demo_p,UINT32_MAX); // time WRITEUINT32(demo_p,UINT32_MAX); // time
WRITEUINT32(demo_p,UINT32_MAX); // lap WRITEUINT32(demo_p,UINT32_MAX); // lap
break; break;
/*case ATTACKING_NIGHTS: // 2 case ATTACKING_CAPSULES: // 2
demotime_p = demo_p; demotime_p = demo_p;
WRITEUINT32(demo_p,UINT32_MAX); // time WRITEUINT32(demo_p,UINT32_MAX); // time
WRITEUINT32(demo_p,0); // score break;
break;*/ default: // 3
default: // 3 break;
break;
} }
WRITEUINT32(demo_p,P_GetInitSeed()); WRITEUINT32(demo_p,P_GetInitSeed());
@ -6524,18 +6513,18 @@ void G_SetDemoTime(UINT32 ptime, UINT32 plap)
{ {
if (!demo.recording || !demotime_p) if (!demo.recording || !demotime_p)
return; return;
if (demoflags & DF_RECORDATTACK) if (demoflags & DF_TIMEATTACK)
{ {
WRITEUINT32(demotime_p, ptime); WRITEUINT32(demotime_p, ptime);
WRITEUINT32(demotime_p, plap); WRITEUINT32(demotime_p, plap);
demotime_p = NULL; demotime_p = NULL;
} }
/*else if (demoflags & DF_NIGHTSATTACK) else if (demoflags & DF_BREAKTHECAPSULES)
{ {
WRITEUINT32(demotime_p, ptime); WRITEUINT32(demotime_p, ptime);
WRITEUINT32(demotime_p, pscore); (void)plap;
demotime_p = NULL; demotime_p = NULL;
}*/ }
} }
static void G_LoadDemoExtraFiles(UINT8 **pp) static void G_LoadDemoExtraFiles(UINT8 **pp)
@ -6711,6 +6700,7 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname)
UINT8 c; UINT8 c;
UINT16 s ATTRUNUSED; UINT16 s ATTRUNUSED;
UINT8 aflags = 0; UINT8 aflags = 0;
boolean uselaps = false;
// load the new file // load the new file
FIL_DefaultExtension(newname, ".lmp"); FIL_DefaultExtension(newname, ".lmp");
@ -6737,20 +6727,17 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname)
p++; // gametype p++; // gametype
G_SkipDemoExtraFiles(&p); G_SkipDemoExtraFiles(&p);
aflags = flags & (DF_RECORDATTACK|DF_NIGHTSATTACK); aflags = flags & (DF_TIMEATTACK|DF_BREAKTHECAPSULES);
I_Assert(aflags); I_Assert(aflags);
if (flags & DF_RECORDATTACK)
{ if (flags & DF_TIMEATTACK)
newtime = READUINT32(p); uselaps = true; // get around uninitalized error
newtime = READUINT32(p);
if (uselaps)
newlap = READUINT32(p); newlap = READUINT32(p);
} else
/*else if (flags & DF_NIGHTSATTACK) newlap = UINT32_MAX;
{
newtime = READUINT32(p);
newscore = READUINT32(p);
}*/
else // appease compiler
return 0;
Z_Free(buffer); Z_Free(buffer);
@ -6809,28 +6796,32 @@ UINT8 G_CmpDemoTime(char *oldname, char *newname)
Z_Free(buffer); Z_Free(buffer);
return UINT8_MAX; return UINT8_MAX;
} }
if (flags & DF_RECORDATTACK)
{ oldtime = READUINT32(p);
oldtime = READUINT32(p); if (uselaps)
oldlap = READUINT32(p); oldlap = READUINT32(p);
} else
/*else if (flags & DF_NIGHTSATTACK) oldlap = 0;
{
oldtime = READUINT32(p);
oldscore = READUINT32(p);
}*/
else // appease compiler
return UINT8_MAX;
Z_Free(buffer); Z_Free(buffer);
c = 0; c = 0;
if (newtime < oldtime
|| (newtime == oldtime && (newlap < oldlap))) if (uselaps)
c |= 1; // Better time {
if (newlap < oldlap if (newtime < oldtime
|| (newlap == oldlap && newtime < oldtime)) || (newtime == oldtime && (newlap < oldlap)))
c |= 1<<1; // Better lap time 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; return c;
} }
@ -7246,19 +7237,18 @@ void G_DoPlayDemo(char *defdemoname)
switch (modeattacking) switch (modeattacking)
{ {
case ATTACKING_NONE: // 0 case ATTACKING_NONE: // 0
break; break;
case ATTACKING_RECORD: // 1 case ATTACKING_RECORD: // 1
hu_demotime = READUINT32(demo_p); hu_demotime = READUINT32(demo_p);
hu_demolap = READUINT32(demo_p); hu_demolap = READUINT32(demo_p);
break; break;
/*case ATTACKING_NIGHTS: // 2 case ATTACKING_CAPSULES: // 2
hu_demotime = READUINT32(demo_p); hu_demotime = READUINT32(demo_p);
hu_demoscore = READUINT32(demo_p); break;
break;*/ default: // 3
default: // 3 modeattacking = ATTACKING_NONE;
modeattacking = ATTACKING_NONE; break;
break;
} }
// Random seed // Random seed
@ -7651,18 +7641,19 @@ void G_AddGhost(char *defdemoname)
if (ghostversion != 0x0001) if (ghostversion != 0x0001)
#endif #endif
G_SkipDemoExtraFiles(&p); // Don't wanna modify the file list for ghosts. G_SkipDemoExtraFiles(&p); // Don't wanna modify the file list for ghosts.
switch ((flags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) switch ((flags & DF_ATTACKMASK)>>DF_ATTACKSHIFT)
{ {
case ATTACKING_NONE: // 0 case ATTACKING_NONE: // 0
break; break;
case ATTACKING_RECORD: // 1 case ATTACKING_RECORD: // 1
p += 8; // demo time, lap p += 8; // demo time, lap
break; break;
/*case ATTACKING_NIGHTS: // 2 case ATTACKING_CAPSULES: // 2
p += 8; // demo time left, score p += 4; // demo time
break;*/ break;
default: // 3 default: // 3
break; break;
} }
p += 4; // random seed p += 4; // random seed
@ -7901,16 +7892,16 @@ void G_UpdateStaffGhostName(lumpnum_t l)
switch ((flags & DF_ATTACKMASK)>>DF_ATTACKSHIFT) switch ((flags & DF_ATTACKMASK)>>DF_ATTACKSHIFT)
{ {
case ATTACKING_NONE: // 0 case ATTACKING_NONE: // 0
break; break;
case ATTACKING_RECORD: // 1 case ATTACKING_RECORD: // 1
p += 8; // demo time, lap p += 8; // demo time, lap
break; break;
/*case ATTACKING_NIGHTS: // 2 case ATTACKING_CAPSULES: // 2
p += 8; // demo time left, score p += 4; // demo time
break;*/ break;
default: // 3 default: // 3
break; break;
} }
p += 4; // random seed p += 4; // random seed
@ -8256,7 +8247,7 @@ void G_SaveDemo(void)
free(demobuffer); free(demobuffer);
demo.recording = false; demo.recording = false;
if (modeattacking != ATTACKING_RECORD) if (!modeattacking)
{ {
if (demo.savemode == DSM_SAVED) if (demo.savemode == DSM_SAVED)
CONS_Printf(M_GetText("Demo %s recorded\n"), demoname); CONS_Printf(M_GetText("Demo %s recorded\n"), demoname);

View file

@ -171,7 +171,8 @@ unlockable_t unlockables[MAXUNLOCKABLES] =
/* 05 */ {"Encore Mode", "", 4, 5, SECRET_ENCORE, 0, false, false, 0}, /* 05 */ {"Encore Mode", "", 4, 5, SECRET_ENCORE, 0, false, false, 0},
/* 06 */ {"Hell Attack", "", 6, 6, SECRET_HELLATTACK, 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 // Default number of emblems and extra emblems

View file

@ -117,8 +117,8 @@ typedef struct
#define SECRET_ITEMFINDER -5 // Enables Item Finder/Emblem Radar #define SECRET_ITEMFINDER -5 // Enables Item Finder/Emblem Radar
#define SECRET_EMBLEMHINTS -4 // Enables Emblem Hints #define SECRET_EMBLEMHINTS -4 // Enables Emblem Hints
#define SECRET_PANDORA -3 // Enables Pandora's Box #define SECRET_PANDORA -3 // Enables Pandora's Box
#define SECRET_RECORDATTACK -2 // Enables Record Attack on the main menu #define SECRET_TIMEATTACK -2 // Enables Time Attack on the main menu
#define SECRET_NIGHTSMODE -1 // Enables NiGHTS Mode 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_HEADER 0 // Does nothing on its own, just serves as a header for the menu
#define SECRET_LEVELSELECT 1 // Selectable level select #define SECRET_LEVELSELECT 1 // Selectable level select
#define SECRET_WARP 2 // Selectable warp #define SECRET_WARP 2 // Selectable warp

View file

@ -133,8 +133,8 @@ typedef enum
{ {
LLM_CREATESERVER, LLM_CREATESERVER,
LLM_LEVELSELECT, LLM_LEVELSELECT,
LLM_RECORDATTACK, LLM_TIMEATTACK,
LLM_NIGHTSATTACK LLM_BREAKTHECAPSULES
} levellist_mode_t; } levellist_mode_t;
levellist_mode_t levellistmode = LLM_CREATESERVER; levellist_mode_t levellistmode = LLM_CREATESERVER;
@ -200,9 +200,7 @@ static char *M_GetConditionString(condition_t cond);
menu_t SR_MainDef, SR_UnlockChecklistDef; menu_t SR_MainDef, SR_UnlockChecklistDef;
// Misc. Main Menu // Misc. Main Menu
#if 0 // Bring this back when we have actual single-player
static void M_SinglePlayerMenu(INT32 choice); static void M_SinglePlayerMenu(INT32 choice);
#endif
static void M_Options(INT32 choice); static void M_Options(INT32 choice);
static void M_Manual(INT32 choice); static void M_Manual(INT32 choice);
static void M_SelectableClearMenus(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_LoadGame(INT32 choice);
static void M_TimeAttack(INT32 choice); static void M_TimeAttack(INT32 choice);
static boolean M_QuitTimeAttackMenu(void); 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_Statistics(INT32 choice);
static void M_HandleStaffReplay(INT32 choice); static void M_HandleStaffReplay(INT32 choice);
static void M_ReplayTimeAttack(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[] = static menuitem_t MainMenu[] =
{ {
{IT_SUBMENU|IT_STRING, NULL, "Extras", &SR_MainDef, 76}, {IT_SUBMENU|IT_STRING, NULL, "Extras", &SR_MainDef, 76},
//{IT_CALL |IT_STRING, NULL, "1 Player", M_SinglePlayerMenu, 84}, {IT_CALL |IT_STRING, NULL, "1 Player", M_SinglePlayerMenu, 84},
{IT_CALL |IT_STRING, NULL, "Time Attack", M_TimeAttack, 84},
{IT_SUBMENU|IT_STRING, NULL, "Multiplayer", &MP_MainDef, 92}, {IT_SUBMENU|IT_STRING, NULL, "Multiplayer", &MP_MainDef, 92},
{IT_CALL |IT_STRING, NULL, "Options", M_Options, 100}, {IT_CALL |IT_STRING, NULL, "Options", M_Options, 100},
{IT_CALL |IT_STRING, NULL, "Addons", M_Addons, 108}, {IT_CALL |IT_STRING, NULL, "Addons", M_Addons, 108},
@ -790,18 +787,16 @@ static menuitem_t SR_EmblemHintMenu[] =
// Single Player Main // Single Player Main
static menuitem_t SP_MainMenu[] = static menuitem_t SP_MainMenu[] =
{ {
//{IT_CALL | IT_STRING, NULL, "Start Game", M_LoadGame, 92}, //{IT_CALL | IT_STRING, NULL, "Grand Prix", M_LoadGame, 92},
{IT_SECRET, NULL, "Record Attack", M_TimeAttack, 100}, {IT_SECRET, NULL, "Time Attack", M_TimeAttack, 100},
//{IT_SECRET, NULL, "NiGHTS Mode", M_NightsAttack, 108}, {IT_SECRET, NULL, "Break the Capsules", M_BreakTheCapsules, 108},
{IT_CALL | IT_STRING | IT_CALL_NOTMODIFIED, NULL, "Statistics", M_Statistics, 108},
}; };
enum enum
{ {
//sploadgame, //spgrandprix,
sprecordattack, sptimeattack,
//spnightsmode, spbreakthecapsules
spstatistics
}; };
// Single Player Load Game // Single Player Load Game
@ -1860,52 +1855,6 @@ static menu_t SP_GhostDef =
NULL 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 = /*menu_t SP_PlayerDef =
{ {
"M_PICKP", "M_PICKP",
@ -2144,7 +2093,7 @@ static void Nextmap_OnChange(void)
CV_StealthSetValue(&cv_dummystaff, 0); CV_StealthSetValue(&cv_dummystaff, 0);
active = false; active = 0;
SP_TimeAttackMenu[taguest].status = IT_DISABLED; SP_TimeAttackMenu[taguest].status = IT_DISABLED;
SP_TimeAttackMenu[tareplay].status = IT_DISABLED; SP_TimeAttackMenu[tareplay].status = IT_DISABLED;
//SP_TimeAttackMenu[taghost].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; SP_GuestReplayMenu[0].status = IT_WHITESTRING|IT_CALL;
active |= 3; active |= 3;
} }
if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) {
SP_ReplayMenu[1].status = IT_WHITESTRING|IT_CALL; if (levellistmode != LLM_BREAKTHECAPSULES) {
SP_GuestReplayMenu[1].status = IT_WHITESTRING|IT_CALL; if (FIL_FileExists(va("%s-%s-lap-best.lmp", gpath, cv_chooseskin.string))) {
active |= 3; 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))) { if (FIL_FileExists(va("%s-%s-last.lmp", gpath, cv_chooseskin.string))) {
SP_ReplayMenu[2].status = IT_WHITESTRING|IT_CALL; SP_ReplayMenu[2].status = IT_WHITESTRING|IT_CALL;
SP_GuestReplayMenu[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 false; // not unlocked
return true;*/ return true;*/
case LLM_RECORDATTACK: case LLM_TIMEATTACK:
case LLM_BREAKTHECAPSULES:
/*if (!(mapheaderinfo[mapnum]->menuflags & LF2_RECORDATTACK)) /*if (!(mapheaderinfo[mapnum]->menuflags & LF2_RECORDATTACK))
return false;*/ 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; return false;
if (M_MapLocked(mapnum+1)) if (M_MapLocked(mapnum+1))
@ -4255,20 +4210,6 @@ boolean M_CanShowLevelInList(INT32 mapnum, INT32 gt)
return false;*/ return false;*/
return true; 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: default:
return false; return false;
} }
@ -6594,18 +6535,16 @@ static void M_Credits(INT32 choice)
// SINGLE PLAYER MENU // SINGLE PLAYER MENU
// ================== // ==================
#if 0 // Bring this back when we have actual single-player
static void M_SinglePlayerMenu(INT32 choice) static void M_SinglePlayerMenu(INT32 choice)
{ {
(void)choice; (void)choice;
SP_MainMenu[sprecordattack].status = SP_MainMenu[sptimeattack].status =
(M_SecretUnlocked(SECRET_RECORDATTACK)) ? IT_CALL|IT_STRING : IT_SECRET; (M_SecretUnlocked(SECRET_TIMEATTACK)) ? IT_CALL|IT_STRING : IT_SECRET;
/*SP_MainMenu[spnightsmode].status = SP_MainMenu[spbreakthecapsules].status =
(M_SecretUnlocked(SECRET_NIGHTSMODE)) ? IT_CALL|IT_STRING : IT_SECRET;*/ (M_SecretUnlocked(SECRET_BREAKTHECAPSULES)) ? IT_CALL|IT_STRING : IT_SECRET;
M_SetupNextMenu(&SP_MainDef); M_SetupNextMenu(&SP_MainDef);
} }
#endif
/*static void M_LoadGameLevelSelect(INT32 choice) /*static void M_LoadGameLevelSelect(INT32 choice)
{ {
@ -7586,8 +7525,11 @@ void M_DrawTimeAttackMenu(void)
V_DrawFill((BASEVIDWIDTH - dupadjust)>>1, 78, dupadjust, 36, 159); V_DrawFill((BASEVIDWIDTH - dupadjust)>>1, 78, dupadjust, 36, 159);
V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:"); if (levellistmode != LLM_BREAKTHECAPSULES)
K_drawKartTimestamp(lap, 19, 86, 0, 2); {
V_DrawRightAlignedString(149, 80, highlightflags, "BEST LAP:");
K_drawKartTimestamp(lap, 19, 86, 0, 2);
}
V_DrawRightAlignedString(292, 80, highlightflags, "BEST TIME:"); V_DrawRightAlignedString(292, 80, highlightflags, "BEST TIME:");
K_drawKartTimestamp(time, 162, 86, cv_nextmap.value, 1); 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)); 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) 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; return;
} }
@ -7814,13 +7788,13 @@ static boolean M_QuitTimeAttackMenu(void)
}*/ }*/
// Going to Nights Attack menu... // Going to Nights Attack menu...
/*static void M_NightsAttack(INT32 choice) /*static void M_BreakTheCapsules(INT32 choice)
{ {
(void)choice; (void)choice;
memset(skins_cons_t, 0, sizeof (skins_cons_t)); 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) if (M_CountLevelsToShowInList() == 0)
{ {
@ -7848,7 +7822,7 @@ static boolean M_QuitTimeAttackMenu(void)
(void)choice; (void)choice;
emeralds = 0; emeralds = 0;
M_ClearMenus(true); M_ClearMenus(true);
modeattacking = ATTACKING_NIGHTS; modeattacking = ATTACKING_CAPSULES;
I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755); I_mkdir(va("%s"PATHSEP"replay", srb2home), 0755);
I_mkdir(va("%s"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder), 0755); I_mkdir(va("%s"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder), 0755);
@ -7872,7 +7846,7 @@ static void M_ChooseTimeAttack(INT32 choice)
(void)choice; (void)choice;
emeralds = 0; emeralds = 0;
M_ClearMenus(true); 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", srb2home), 0755);
I_mkdir(va("%s"PATHSEP"replay"PATHSEP"%s", srb2home, timeattackfolder), 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) if (l == LUMPERROR)
break; break;
M_ClearMenus(true); 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 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)); G_DoPlayDemo(va("%sS%02u",G_BuildMapName(cv_nextmap.value),cv_dummystaff.value));
break; break;
@ -7943,7 +7917,7 @@ static void M_ReplayTimeAttack(INT32 choice)
{ {
const char *which; const char *which;
M_ClearMenus(true); 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 demo.loadfiles = false; demo.ignorefiles = true; // Just assume that record attack replays have the files needed
if (currentMenu == &SP_ReplayDef) if (currentMenu == &SP_ReplayDef)
@ -8090,10 +8064,8 @@ static void M_ModeAttackRetry(INT32 choice)
{ {
(void)choice; (void)choice;
G_CheckDemoStatus(); // Cancel recording G_CheckDemoStatus(); // Cancel recording
if (modeattacking == ATTACKING_RECORD) if (modeattacking)
M_ChooseTimeAttack(0); M_ChooseTimeAttack(0);
/*else if (modeattacking == ATTACKING_NIGHTS)
M_ChooseNightsAttack(0);*/
} }
static void M_ModeAttackEndGame(INT32 choice) static void M_ModeAttackEndGame(INT32 choice)
@ -8105,16 +8077,10 @@ static void M_ModeAttackEndGame(INT32 choice)
Command_ExitGame_f(); Command_ExitGame_f();
M_StartControlPanel(); M_StartControlPanel();
switch(modeattacking)
{ if (modeattacking)
default:
case ATTACKING_RECORD:
currentMenu = &SP_TimeAttackDef; currentMenu = &SP_TimeAttackDef;
break;
/*case ATTACKING_NIGHTS:
currentMenu = &SP_NightsAttackDef;
break;*/
}
itemOn = currentMenu->lastOn; itemOn = currentMenu->lastOn;
G_SetGamestate(GS_TIMEATTACK); G_SetGamestate(GS_TIMEATTACK);
modeattacking = ATTACKING_NONE; modeattacking = ATTACKING_NONE;

View file

@ -2630,15 +2630,18 @@ static void P_LoadRecordGhosts(void)
} }
// Best Lap ghost // 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) for (i = 0; i < numskins; ++i)
continue; {
if (cv_ghost_bestlap.value == 1 && players[consoleplayer].skin != i)
continue;
if (FIL_FileExists(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)); 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(); P_LoadRecordGhosts();
/*else if (modeattacking == ATTACKING_NIGHTS && !demo.playback)
P_LoadNightsGhosts();*/
if (G_RaceGametype() && server) if (G_RaceGametype() && server)
CV_StealthSetValue(&cv_numlaps, CV_StealthSetValue(&cv_numlaps,

View file

@ -1272,7 +1272,7 @@ static void ST_drawNiGHTSHUD(void) // SRB2kart - unused.
#endif #endif
) )
{ {
if (modeattacking == ATTACKING_NIGHTS) if (modeattacking == ATTACKING_CAPSULES)
{ {
INT32 maretime = max(stplyr->realtime - stplyr->marebegunat, 0); INT32 maretime = max(stplyr->realtime - stplyr->marebegunat, 0);
fixed_t cornerx = vid.width, cornery = vid.height-SCZ(20); fixed_t cornerx = vid.width, cornery = vid.height-SCZ(20);

View file

@ -720,8 +720,13 @@ static void Y_UpdateRecordReplays(void)
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))
mainrecords[gamemap-1]->time = players[consoleplayer].realtime; mainrecords[gamemap-1]->time = players[consoleplayer].realtime;
if ((mainrecords[gamemap-1]->lap == 0) || (bestlap < mainrecords[gamemap-1]->lap)) if (modeattacking != ATTACKING_CAPSULES)
mainrecords[gamemap-1]->lap = bestlap; {
if ((mainrecords[gamemap-1]->lap == 0) || (bestlap < mainrecords[gamemap-1]->lap))
mainrecords[gamemap-1]->lap = bestlap;
}
else
mainrecords[gamemap-1]->lap = 0;
// Save demo! // Save demo!
bestdemo[255] = '\0'; 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); 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 (modeattacking != ATTACKING_CAPSULES)
if (!FIL_FileExists(bestdemo) || G_CmpDemoTime(bestdemo, lastdemo) & (1<<1)) {
{ // Better lap time, save this demo. snprintf(bestdemo, 255, "%s-%s-lap-best.lmp", gpath, cv_chooseskin.string);
if (FIL_FileExists(bestdemo)) if (!FIL_FileExists(bestdemo) || G_CmpDemoTime(bestdemo, lastdemo) & (1<<1))
remove(bestdemo); { // Better lap time, save this demo.
FIL_WriteFile(bestdemo, buf, len); if (FIL_FileExists(bestdemo))
CONS_Printf("\x83%s\x80 %s '%s'\n", M_GetText("NEW RECORD LAP!"), M_GetText("Saved replay as"), 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); //CONS_Printf("%s '%s'\n", M_GetText("Saved replay as"), lastdemo);
@ -800,12 +808,20 @@ void Y_StartIntermission(void)
{ {
timer = 0; timer = 0;
/* // srb2kart: time attack tally is UGLY rn if (!majormods && !multiplayer && !demo.playback) // move this once we have a proper time attack screen
if (modeattacking) {
intertype = int_timeattack; // Update visitation flags
else mapvisited[gamemap-1] |= MV_BEATEN;
*/ if (ALL7EMERALDS(emeralds))
intertype = int_race; 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 else
{ {
@ -820,13 +836,13 @@ void Y_StartIntermission(void)
if (!timer) if (!timer)
timer = 1; 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. // We couldn't display the intermission even if we wanted to.
// But we still need to give the players their score bonuses, dummy. // But we still need to give the players their score bonuses, dummy.
//if (dedicated) return; //if (dedicated) return;
@ -847,21 +863,6 @@ void Y_StartIntermission(void)
} }
case int_race: // (time-only race) 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 // Calculate who won
Y_CalculateMatchData(0, Y_CompareRace); Y_CalculateMatchData(0, Y_CompareRace);
break; break;