mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-03-18 09:02:04 +00:00
Rudimentary Record Attack support
This commit is contained in:
parent
74552f9ee5
commit
e84c618da8
10 changed files with 226 additions and 262 deletions
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
187
src/g_game.c
187
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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
186
src/m_menu.c
186
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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue