* Level Platter system added to Record/NiGHTS Attack modes.
* Made quality-of-life improvement for starting the player off on the "right" map more reliable.
This commit is contained in:
parent
3574b598d6
commit
a23da9ae43
|
@ -1532,6 +1532,8 @@ void D_MapChange(INT32 mapnum, INT32 newgametype, boolean pultmode, boolean rese
|
||||||
// The supplied data are assumed to be good.
|
// The supplied data are assumed to be good.
|
||||||
I_Assert(delay >= 0 && delay <= 2);
|
I_Assert(delay >= 0 && delay <= 2);
|
||||||
|
|
||||||
|
CV_SetValue(&cv_nextmap, mapnum);
|
||||||
|
|
||||||
CONS_Debug(DBG_GAMELOGIC, "Map change: mapnum=%d gametype=%d ultmode=%d resetplayers=%d delay=%d skipprecutscene=%d\n",
|
CONS_Debug(DBG_GAMELOGIC, "Map change: mapnum=%d gametype=%d ultmode=%d resetplayers=%d delay=%d skipprecutscene=%d\n",
|
||||||
mapnum, newgametype, pultmode, resetplayers, delay, skipprecutscene);
|
mapnum, newgametype, pultmode, resetplayers, delay, skipprecutscene);
|
||||||
|
|
||||||
|
|
218
src/m_menu.c
218
src/m_menu.c
|
@ -238,7 +238,9 @@ menu_t MISC_ScrambleTeamDef, MISC_ChangeTeamDef;
|
||||||
|
|
||||||
// Single Player
|
// Single Player
|
||||||
static void M_LoadGame(INT32 choice);
|
static void M_LoadGame(INT32 choice);
|
||||||
|
static void M_TimeAttackLevelSelect(INT32 choice);
|
||||||
static void M_TimeAttack(INT32 choice);
|
static void M_TimeAttack(INT32 choice);
|
||||||
|
static void M_NightsAttackLevelSelect(INT32 choice);
|
||||||
static void M_NightsAttack(INT32 choice);
|
static void M_NightsAttack(INT32 choice);
|
||||||
static void M_Statistics(INT32 choice);
|
static void M_Statistics(INT32 choice);
|
||||||
static void M_ReplayTimeAttack(INT32 choice);
|
static void M_ReplayTimeAttack(INT32 choice);
|
||||||
|
@ -354,6 +356,7 @@ static void M_HandleFogColor(INT32 choice);
|
||||||
static void M_HandleVideoMode(INT32 choice);
|
static void M_HandleVideoMode(INT32 choice);
|
||||||
|
|
||||||
// Consvar onchange functions
|
// Consvar onchange functions
|
||||||
|
static boolean M_SetNextMapOnPlatter(void);
|
||||||
static void Nextmap_OnChange(void);
|
static void Nextmap_OnChange(void);
|
||||||
static void Newgametype_OnChange(void);
|
static void Newgametype_OnChange(void);
|
||||||
static void Dummymares_OnChange(void);
|
static void Dummymares_OnChange(void);
|
||||||
|
@ -666,10 +669,10 @@ 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, "Start Game", M_LoadGame, 92},
|
||||||
{IT_SECRET, NULL, "Record Attack", M_TimeAttack, 100},
|
{IT_SECRET, NULL, "Record Attack", M_TimeAttackLevelSelect, 100},
|
||||||
{IT_SECRET, NULL, "NiGHTS Mode", M_NightsAttack, 108},
|
{IT_SECRET, NULL, "NiGHTS Mode", M_NightsAttackLevelSelect, 108},
|
||||||
{IT_CALL | IT_STRING | IT_CALL_NOTMODIFIED, NULL, "Statistics", M_Statistics, 116},
|
{IT_CALL | IT_STRING | IT_CALL_NOTMODIFIED, NULL, "Statistics", M_Statistics, 116},
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
|
@ -692,6 +695,12 @@ static menuitem_t SP_LevelSelectMenu[] =
|
||||||
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, '\0'}, // dummy menuitem for the control func
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, '\0'}, // dummy menuitem for the control func
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Single Player Time Attack Level Select
|
||||||
|
static menuitem_t SP_TimeAttackLevelSelectMenu[] =
|
||||||
|
{
|
||||||
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, '\0'}, // dummy menuitem for the control func
|
||||||
|
};
|
||||||
|
|
||||||
// Single Player Time Attack
|
// Single Player Time Attack
|
||||||
static menuitem_t SP_TimeAttackMenu[] =
|
static menuitem_t SP_TimeAttackMenu[] =
|
||||||
{
|
{
|
||||||
|
@ -784,6 +793,12 @@ static menuitem_t SP_NightsGhostMenu[] =
|
||||||
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_NightsAttackDef, 50}
|
{IT_WHITESTRING|IT_SUBMENU, NULL, "Back", &SP_NightsAttackDef, 50}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Single Player Nights Attack Level Select
|
||||||
|
static menuitem_t SP_NightsAttackLevelSelectMenu[] =
|
||||||
|
{
|
||||||
|
{IT_KEYHANDLER | IT_NOTHING, NULL, "", M_HandleLevelPlatter, '\0'}, // dummy menuitem for the control func
|
||||||
|
};
|
||||||
|
|
||||||
// Single Player Nights Attack
|
// Single Player Nights Attack
|
||||||
static menuitem_t SP_NightsAttackMenu[] =
|
static menuitem_t SP_NightsAttackMenu[] =
|
||||||
{
|
{
|
||||||
|
@ -1478,7 +1493,7 @@ menu_t SP_LevelSelectDef =
|
||||||
{
|
{
|
||||||
NULL,
|
NULL,
|
||||||
sizeof (SP_LevelSelectMenu)/sizeof (menuitem_t),
|
sizeof (SP_LevelSelectMenu)/sizeof (menuitem_t),
|
||||||
&SP_LoadDef,
|
&MainDef, // Doesn't matter.
|
||||||
SP_LevelSelectMenu,
|
SP_LevelSelectMenu,
|
||||||
M_DrawLevelPlatterMenu,
|
M_DrawLevelPlatterMenu,
|
||||||
0, 0,
|
0, 0,
|
||||||
|
@ -1509,6 +1524,17 @@ menu_t SP_LevelStatsDef =
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
menu_t SP_TimeAttackLevelSelectDef =
|
||||||
|
{
|
||||||
|
"M_ATTACK",
|
||||||
|
sizeof (SP_TimeAttackLevelSelectMenu)/sizeof (menuitem_t),
|
||||||
|
&MainDef, // Doesn't matter.
|
||||||
|
SP_TimeAttackLevelSelectMenu,
|
||||||
|
M_DrawLevelPlatterMenu,
|
||||||
|
0, 0,
|
||||||
|
0,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
static menu_t SP_TimeAttackDef =
|
static menu_t SP_TimeAttackDef =
|
||||||
{
|
{
|
||||||
"M_ATTACK",
|
"M_ATTACK",
|
||||||
|
@ -1518,7 +1544,7 @@ static menu_t SP_TimeAttackDef =
|
||||||
M_DrawTimeAttackMenu,
|
M_DrawTimeAttackMenu,
|
||||||
32, 40,
|
32, 40,
|
||||||
0,
|
0,
|
||||||
NULL
|
M_SetNextMapOnPlatter
|
||||||
};
|
};
|
||||||
static menu_t SP_ReplayDef =
|
static menu_t SP_ReplayDef =
|
||||||
{
|
{
|
||||||
|
@ -1554,6 +1580,17 @@ static menu_t SP_GhostDef =
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
menu_t SP_NightsAttackLevelSelectDef =
|
||||||
|
{
|
||||||
|
"M_NIGHTS", // HAMALAYAN
|
||||||
|
sizeof (SP_NightsAttackLevelSelectMenu)/sizeof (menuitem_t),
|
||||||
|
&MainDef, // Doesn't matter.
|
||||||
|
SP_NightsAttackLevelSelectMenu,
|
||||||
|
M_DrawLevelPlatterMenu,
|
||||||
|
0, 0,
|
||||||
|
0,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
static menu_t SP_NightsAttackDef =
|
static menu_t SP_NightsAttackDef =
|
||||||
{
|
{
|
||||||
"M_NIGHTS",
|
"M_NIGHTS",
|
||||||
|
@ -1563,7 +1600,7 @@ static menu_t SP_NightsAttackDef =
|
||||||
M_DrawNightsAttackMenu,
|
M_DrawNightsAttackMenu,
|
||||||
32, 40,
|
32, 40,
|
||||||
0,
|
0,
|
||||||
NULL
|
M_SetNextMapOnPlatter
|
||||||
};
|
};
|
||||||
static menu_t SP_NightsReplayDef =
|
static menu_t SP_NightsReplayDef =
|
||||||
{
|
{
|
||||||
|
@ -1775,6 +1812,7 @@ static void Nextmap_OnChange(void)
|
||||||
|
|
||||||
if (currentMenu == &SP_NightsAttackDef)
|
if (currentMenu == &SP_NightsAttackDef)
|
||||||
{
|
{
|
||||||
|
M_SetNextMapOnPlatter();
|
||||||
CV_StealthSetValue(&cv_dummymares, 0);
|
CV_StealthSetValue(&cv_dummymares, 0);
|
||||||
// Hide the record changing CVAR if only one mare is available.
|
// Hide the record changing CVAR if only one mare is available.
|
||||||
if (!nightsrecords[cv_nextmap.value-1] || nightsrecords[cv_nextmap.value-1]->nummares < 2)
|
if (!nightsrecords[cv_nextmap.value-1] || nightsrecords[cv_nextmap.value-1]->nummares < 2)
|
||||||
|
@ -2414,7 +2452,7 @@ boolean M_Responder(event_t *ev)
|
||||||
multiplayer = false;
|
multiplayer = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (currentMenu == &SP_TimeAttackDef || currentMenu == &SP_NightsAttackDef)
|
if ((currentMenu->prevMenu == &MainDef) && (currentMenu == &SP_TimeAttackDef || currentMenu == &SP_NightsAttackDef))
|
||||||
{
|
{
|
||||||
// D_StartTitle does its own wipe, since GS_TIMEATTACK is now a complete gamestate.
|
// D_StartTitle does its own wipe, since GS_TIMEATTACK is now a complete gamestate.
|
||||||
menuactive = false;
|
menuactive = false;
|
||||||
|
@ -3604,6 +3642,27 @@ static INT32 M_CountRowsToShowOnPlatter(INT32 gt)
|
||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static boolean M_SetNextMapOnPlatter(void)
|
||||||
|
{
|
||||||
|
INT32 row, col = 0;
|
||||||
|
while (col < 3)
|
||||||
|
{
|
||||||
|
row = 0;
|
||||||
|
while (row < levelselect.numrows)
|
||||||
|
{
|
||||||
|
if (levelselect.rows[row].maplist[col] == cv_nextmap.value)
|
||||||
|
{
|
||||||
|
lsrow = row;
|
||||||
|
lscol = col;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
row++;
|
||||||
|
}
|
||||||
|
col++;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// M_PrepareLevelPlatter
|
// M_PrepareLevelPlatter
|
||||||
//
|
//
|
||||||
|
@ -3613,7 +3672,7 @@ static INT32 M_CountRowsToShowOnPlatter(INT32 gt)
|
||||||
static boolean M_PrepareLevelPlatter(INT32 gt)
|
static boolean M_PrepareLevelPlatter(INT32 gt)
|
||||||
{
|
{
|
||||||
INT32 numrows = M_CountRowsToShowOnPlatter(gt);
|
INT32 numrows = M_CountRowsToShowOnPlatter(gt);
|
||||||
INT32 mapnum, desiredmap, col = 0, row = 0;
|
INT32 mapnum, col = 0, row = 0;
|
||||||
|
|
||||||
if (!numrows)
|
if (!numrows)
|
||||||
return false;
|
return false;
|
||||||
|
@ -3630,8 +3689,6 @@ static boolean M_PrepareLevelPlatter(INT32 gt)
|
||||||
// done here so lsrow and lscol can be set if cv_nextmap is on the platter
|
// done here so lsrow and lscol can be set if cv_nextmap is on the platter
|
||||||
lsrow = lscol = lstic = lshli = lsoffs[0] = lsoffs[1] = 0;
|
lsrow = lscol = lstic = lshli = lsoffs[0] = lsoffs[1] = 0;
|
||||||
|
|
||||||
desiredmap = ((Playing()) ? gamemap: cv_nextmap.value);
|
|
||||||
|
|
||||||
for (mapnum = 0; mapnum < NUMMAPS; mapnum++)
|
for (mapnum = 0; mapnum < NUMMAPS; mapnum++)
|
||||||
{
|
{
|
||||||
if (M_CanShowLevelOnPlatter(mapnum, gt))
|
if (M_CanShowLevelOnPlatter(mapnum, gt))
|
||||||
|
@ -3655,7 +3712,7 @@ static boolean M_PrepareLevelPlatter(INT32 gt)
|
||||||
levelselect.rows[row].maplist[col] = mapnum+1; // putting the map on the platter
|
levelselect.rows[row].maplist[col] = mapnum+1; // putting the map on the platter
|
||||||
levelselect.rows[row].mapavailable[col] = M_LevelAvailableOnPlatter(mapnum);
|
levelselect.rows[row].mapavailable[col] = M_LevelAvailableOnPlatter(mapnum);
|
||||||
|
|
||||||
if (desiredmap == mapnum+1) // A little quality of life improvement.
|
if (cv_nextmap.value == mapnum+1) // A little quality of life improvement.
|
||||||
{
|
{
|
||||||
lsrow = row;
|
lsrow = row;
|
||||||
lscol = col;
|
lscol = col;
|
||||||
|
@ -3810,10 +3867,17 @@ static void M_HandleLevelPlatter(INT32 choice)
|
||||||
case KEY_ENTER:
|
case KEY_ENTER:
|
||||||
selectvalnextmapnobrace(lscol)
|
selectvalnextmapnobrace(lscol)
|
||||||
|
|
||||||
M_LevelSelectWarp(0);
|
|
||||||
|
|
||||||
lsoffs[0] = lsoffs[1] = 0;
|
lsoffs[0] = lsoffs[1] = 0;
|
||||||
S_StartSound(NULL,sfx_menu1);
|
S_StartSound(NULL,sfx_menu1);
|
||||||
|
if (gamestate == GS_TIMEATTACK)
|
||||||
|
{
|
||||||
|
if (currentMenu == &SP_TimeAttackLevelSelectDef)
|
||||||
|
M_TimeAttack(-1);
|
||||||
|
else
|
||||||
|
M_NightsAttack(-1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
M_LevelSelectWarp(0);
|
||||||
}
|
}
|
||||||
else if (!lsoffs[0]) // prevent sound spam
|
else if (!lsoffs[0]) // prevent sound spam
|
||||||
{
|
{
|
||||||
|
@ -3833,7 +3897,16 @@ static void M_HandleLevelPlatter(INT32 choice)
|
||||||
if (exitmenu)
|
if (exitmenu)
|
||||||
{
|
{
|
||||||
if (currentMenu->prevMenu)
|
if (currentMenu->prevMenu)
|
||||||
M_SetupNextMenu (currentMenu->prevMenu);
|
{
|
||||||
|
if (gamestate == GS_TIMEATTACK)
|
||||||
|
{
|
||||||
|
// D_StartTitle does its own wipe, since GS_TIMEATTACK is now a complete gamestate.
|
||||||
|
menuactive = false;
|
||||||
|
D_StartTitle();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
M_SetupNextMenu (currentMenu->prevMenu);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
M_ClearMenus(true);
|
M_ClearMenus(true);
|
||||||
}
|
}
|
||||||
|
@ -3917,6 +3990,9 @@ static void M_DrawLevelPlatterMenu(void)
|
||||||
if (++lstic == 32)
|
if (++lstic == 32)
|
||||||
lstic = 0;
|
lstic = 0;
|
||||||
|
|
||||||
|
if (gamestate == GS_TIMEATTACK)
|
||||||
|
V_DrawPatchFill(W_CachePatchName("SRB2BACK", PU_CACHE));
|
||||||
|
|
||||||
// finds row at top of the screen
|
// finds row at top of the screen
|
||||||
while (y > 0)
|
while (y > 0)
|
||||||
{
|
{
|
||||||
|
@ -3948,6 +4024,8 @@ static void M_DrawLevelPlatterMenu(void)
|
||||||
lsoffs[1] = 2*lsoffs[1]/3;
|
lsoffs[1] = 2*lsoffs[1]/3;
|
||||||
else
|
else
|
||||||
lsoffs[1] = 0;
|
lsoffs[1] = 0;
|
||||||
|
|
||||||
|
M_DrawMenuTitle();
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef basey
|
#undef basey
|
||||||
|
@ -5825,33 +5903,63 @@ void M_DrawTimeAttackMenu(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Going to Time Attack menu...
|
static void M_TimeAttackLevelSelect(INT32 choice)
|
||||||
static void M_TimeAttack(INT32 choice)
|
|
||||||
{
|
{
|
||||||
(void)choice;
|
(void)choice;
|
||||||
|
levellistmode = LLM_RECORDATTACK;
|
||||||
|
|
||||||
memset(skins_cons_t, 0, sizeof (skins_cons_t));
|
if (!M_PrepareLevelPlatter(-1))
|
||||||
|
|
||||||
levellistmode = LLM_RECORDATTACK; // 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 record-attackable levels found.\n"),NULL,MM_NOTHING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memset(skins_cons_t, 0, sizeof (skins_cons_t));
|
||||||
M_PatchSkinNameTable();
|
M_PatchSkinNameTable();
|
||||||
|
|
||||||
M_PrepareLevelSelect();
|
M_SetupNextMenu(&SP_TimeAttackLevelSelectDef);
|
||||||
M_SetupNextMenu(&SP_TimeAttackDef);
|
|
||||||
Nextmap_OnChange();
|
|
||||||
|
|
||||||
itemOn = tastart; // "Start" is selected.
|
|
||||||
|
|
||||||
G_SetGamestate(GS_TIMEATTACK);
|
G_SetGamestate(GS_TIMEATTACK);
|
||||||
S_ChangeMusicInternal("_inter", true);
|
S_ChangeMusicInternal("_inter", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Going to Time Attack menu...
|
||||||
|
static void M_TimeAttack(INT32 choice)
|
||||||
|
{
|
||||||
|
const boolean direct = (choice != -1); // Are we coming from SP_TimeAtttackLevelSelect?
|
||||||
|
|
||||||
|
if (direct)
|
||||||
|
{
|
||||||
|
SP_TimeAttackDef.prevMenu = &MainDef;
|
||||||
|
levellistmode = LLM_RECORDATTACK; // Don't be dependent on cv_newgametype
|
||||||
|
|
||||||
|
if (M_CountLevelsToShowInList() == 0)
|
||||||
|
{
|
||||||
|
M_StartMessage(M_GetText("No record-attackable levels found.\n"),NULL,MM_NOTHING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(skins_cons_t, 0, sizeof (skins_cons_t));
|
||||||
|
M_PatchSkinNameTable();
|
||||||
|
|
||||||
|
M_PrepareLevelSelect();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SP_TimeAttackDef.prevMenu = currentMenu;
|
||||||
|
|
||||||
|
M_SetupNextMenu(&SP_TimeAttackDef);
|
||||||
|
|
||||||
|
if (direct)
|
||||||
|
{
|
||||||
|
Nextmap_OnChange();
|
||||||
|
|
||||||
|
G_SetGamestate(GS_TIMEATTACK);
|
||||||
|
S_ChangeMusicInternal("_inter", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
itemOn = tastart; // "Start" is selected.
|
||||||
|
}
|
||||||
|
|
||||||
// Drawing function for Nights Attack
|
// Drawing function for Nights Attack
|
||||||
void M_DrawNightsAttackMenu(void)
|
void M_DrawNightsAttackMenu(void)
|
||||||
{
|
{
|
||||||
|
@ -5957,34 +6065,64 @@ void M_DrawNightsAttackMenu(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Going to Nights Attack menu...
|
static void M_NightsAttackLevelSelect(INT32 choice)
|
||||||
static void M_NightsAttack(INT32 choice)
|
|
||||||
{
|
{
|
||||||
(void)choice;
|
(void)choice;
|
||||||
|
levellistmode = LLM_NIGHTSATTACK;
|
||||||
|
|
||||||
memset(skins_cons_t, 0, sizeof (skins_cons_t));
|
if (!M_PrepareLevelPlatter(-1))
|
||||||
|
|
||||||
levellistmode = LLM_NIGHTSATTACK; // Don't be dependent on cv_newgametype
|
|
||||||
|
|
||||||
if (M_CountLevelsToShowInList() == 0)
|
|
||||||
{
|
{
|
||||||
M_StartMessage(M_GetText("No NiGHTS-attackable levels found.\n"),NULL,MM_NOTHING);
|
M_StartMessage(M_GetText("No NiGHTS-attackable levels found.\n"),NULL,MM_NOTHING);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is really just to make sure Sonic is the played character, just in case
|
memset(skins_cons_t, 0, sizeof (skins_cons_t));
|
||||||
M_PatchSkinNameTable();
|
M_PatchSkinNameTable();
|
||||||
|
|
||||||
M_PrepareLevelSelect();
|
M_SetupNextMenu(&SP_NightsAttackLevelSelectDef);
|
||||||
M_SetupNextMenu(&SP_NightsAttackDef);
|
|
||||||
Nextmap_OnChange();
|
|
||||||
|
|
||||||
itemOn = nastart; // "Start" is selected.
|
|
||||||
|
|
||||||
G_SetGamestate(GS_TIMEATTACK);
|
G_SetGamestate(GS_TIMEATTACK);
|
||||||
S_ChangeMusicInternal("_inter", true);
|
S_ChangeMusicInternal("_inter", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Going to Nights Attack menu...
|
||||||
|
static void M_NightsAttack(INT32 choice)
|
||||||
|
{
|
||||||
|
const boolean direct = (choice != -1); // Are we coming from SP_TimeAtttackLevelSelect?
|
||||||
|
|
||||||
|
if (direct)
|
||||||
|
{
|
||||||
|
SP_NightsAttackDef.prevMenu = &MainDef;
|
||||||
|
levellistmode = LLM_NIGHTSATTACK; // Don't be dependent on cv_newgametype
|
||||||
|
|
||||||
|
if (M_CountLevelsToShowInList() == 0)
|
||||||
|
{
|
||||||
|
M_StartMessage(M_GetText("No NiGHTS-attackable levels found.\n"),NULL,MM_NOTHING);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is really just to make sure Sonic is the played character, just in case
|
||||||
|
memset(skins_cons_t, 0, sizeof (skins_cons_t));
|
||||||
|
M_PatchSkinNameTable();
|
||||||
|
|
||||||
|
M_PrepareLevelSelect();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
SP_NightsAttackDef.prevMenu = currentMenu;
|
||||||
|
|
||||||
|
M_SetupNextMenu(&SP_NightsAttackDef);
|
||||||
|
|
||||||
|
if (direct)
|
||||||
|
{
|
||||||
|
Nextmap_OnChange();
|
||||||
|
|
||||||
|
G_SetGamestate(GS_TIMEATTACK);
|
||||||
|
S_ChangeMusicInternal("_inter", true);
|
||||||
|
}
|
||||||
|
|
||||||
|
itemOn = nastart; // "Start" is selected.
|
||||||
|
}
|
||||||
|
|
||||||
// Player has selected the "START" from the nights attack screen
|
// Player has selected the "START" from the nights attack screen
|
||||||
static void M_ChooseNightsAttack(INT32 choice)
|
static void M_ChooseNightsAttack(INT32 choice)
|
||||||
{
|
{
|
||||||
|
|
|
@ -909,7 +909,7 @@ static inline boolean I_SkipFrame(void)
|
||||||
case GS_LEVEL:
|
case GS_LEVEL:
|
||||||
if (!paused)
|
if (!paused)
|
||||||
return false;
|
return false;
|
||||||
case GS_TIMEATTACK:
|
//case GS_TIMEATTACK: -- sorry optimisation but now we have a cool level platter and that being laggardly looks terrible
|
||||||
case GS_WAITINGPLAYERS:
|
case GS_WAITINGPLAYERS:
|
||||||
return skip; // Skip odd frames
|
return skip; // Skip odd frames
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -1311,7 +1311,7 @@ static inline boolean I_SkipFrame(void)
|
||||||
case GS_LEVEL:
|
case GS_LEVEL:
|
||||||
if (!paused)
|
if (!paused)
|
||||||
return false;
|
return false;
|
||||||
case GS_TIMEATTACK:
|
//case GS_TIMEATTACK: -- sorry optimisation but now we have a cool level platter and that being laggardly looks terrible
|
||||||
case GS_WAITINGPLAYERS:
|
case GS_WAITINGPLAYERS:
|
||||||
return skip; // Skip odd frames
|
return skip; // Skip odd frames
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -322,7 +322,7 @@ static inline boolean I_SkipFrame(void)
|
||||||
case GS_LEVEL:
|
case GS_LEVEL:
|
||||||
if (!paused)
|
if (!paused)
|
||||||
return false;
|
return false;
|
||||||
case GS_TIMEATTACK:
|
//case GS_TIMEATTACK: -- sorry optimisation but now we have a cool level platter and that being laggardly looks terrible
|
||||||
#ifndef CLIENT_LOADINGSCREEN
|
#ifndef CLIENT_LOADINGSCREEN
|
||||||
case GS_WAITINGPLAYERS:
|
case GS_WAITINGPLAYERS:
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue