mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2026-04-28 04:51:42 +00:00
WIP: time attack, kinda works but crashes when you finish lol
This commit is contained in:
parent
2a4c4f86fc
commit
a8d847227d
4 changed files with 234 additions and 14 deletions
15
src/k_menu.h
15
src/k_menu.h
|
|
@ -205,6 +205,15 @@ extern menu_t PLAY_LevelSelectDef;
|
||||||
extern menuitem_t PLAY_TimeAttack[];
|
extern menuitem_t PLAY_TimeAttack[];
|
||||||
extern menu_t PLAY_TimeAttackDef;
|
extern menu_t PLAY_TimeAttackDef;
|
||||||
|
|
||||||
|
extern menuitem_t PLAY_TAReplay[];
|
||||||
|
extern menu_t PLAY_TAReplayDef;
|
||||||
|
|
||||||
|
extern menuitem_t PLAY_TAReplayGuest[];
|
||||||
|
extern menu_t PLAY_TAReplayGuestDef;
|
||||||
|
|
||||||
|
extern menuitem_t PLAY_TAGhosts[];
|
||||||
|
extern menu_t PLAY_TAGhostsDef;
|
||||||
|
|
||||||
extern menuitem_t PLAY_MP_OptSelect[];
|
extern menuitem_t PLAY_MP_OptSelect[];
|
||||||
extern menu_t PLAY_MP_OptSelectDef;
|
extern menu_t PLAY_MP_OptSelectDef;
|
||||||
|
|
||||||
|
|
@ -677,6 +686,12 @@ extern struct mpmenu_s {
|
||||||
|
|
||||||
} mpmenu;
|
} mpmenu;
|
||||||
|
|
||||||
|
// Time Attack
|
||||||
|
void M_StartTimeAttack(INT32 choice);
|
||||||
|
void M_ReplayTimeAttack(INT32 choice);
|
||||||
|
void M_HandleStaffReplay(INT32 choice);
|
||||||
|
void M_SetGuestReplay(INT32 choice);
|
||||||
|
|
||||||
// MP selection
|
// MP selection
|
||||||
void M_MPOptSelect(INT32 choice);
|
void M_MPOptSelect(INT32 choice);
|
||||||
void M_MPOptSelectInit(INT32 choice);
|
void M_MPOptSelectInit(INT32 choice);
|
||||||
|
|
|
||||||
|
|
@ -204,10 +204,11 @@ menu_t PLAY_LevelSelectDef = {
|
||||||
|
|
||||||
menuitem_t PLAY_TimeAttack[] =
|
menuitem_t PLAY_TimeAttack[] =
|
||||||
{
|
{
|
||||||
{IT_STRING, "Replay...", NULL, NULL, {NULL}, 0, 0},
|
{IT_STRING | IT_SUBMENU, "Replay...", NULL, NULL, {.submenu = &PLAY_TAReplayDef}, 0, 0},
|
||||||
{IT_STRING, "Ghosts...", NULL, NULL, {NULL}, 0, 0},
|
{IT_STRING | IT_SUBMENU, "Guest...", NULL, NULL, {.submenu = &PLAY_TAReplayGuestDef}, 0, 0},
|
||||||
{IT_SPACE, NULL, NULL, NULL, {NULL}, 0, 0},
|
{IT_STRING | IT_SUBMENU, "Ghosts...", NULL, NULL, {.submenu = &PLAY_TAGhostsDef}, 0, 0},
|
||||||
{IT_STRING, "Start", NULL, NULL, {NULL}, 0, 0},
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Start", NULL, NULL, {.routine = M_StartTimeAttack}, 0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
menu_t PLAY_TimeAttackDef = {
|
menu_t PLAY_TimeAttackDef = {
|
||||||
|
|
@ -225,6 +226,93 @@ menu_t PLAY_TimeAttackDef = {
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
menuitem_t PLAY_TAReplay[] =
|
||||||
|
{
|
||||||
|
{IT_STRING | IT_CALL, "Replay Best Time", NULL, NULL, {.routine = M_ReplayTimeAttack}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Replay Best Lap", NULL, NULL, {.routine = M_ReplayTimeAttack}, 0, 0},
|
||||||
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Replay Last", NULL, NULL, {.routine = M_ReplayTimeAttack}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Replay Guest", NULL, NULL, {.routine = M_ReplayTimeAttack}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Replay Staff", NULL, NULL, {.routine = M_HandleStaffReplay}, 0, 0},
|
||||||
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
|
||||||
|
{IT_STRING | IT_SUBMENU, "Back", NULL, NULL, {.submenu = &PLAY_TimeAttackDef}, 0, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_t PLAY_TAReplayDef = {
|
||||||
|
sizeof(PLAY_TAReplay) / sizeof(menuitem_t),
|
||||||
|
&PLAY_TimeAttackDef,
|
||||||
|
0,
|
||||||
|
PLAY_TAReplay,
|
||||||
|
0, 0,
|
||||||
|
0, 0,
|
||||||
|
2, 5,
|
||||||
|
M_DrawTimeAttack,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
menuitem_t PLAY_TAReplayGuest[] =
|
||||||
|
{
|
||||||
|
{IT_HEADERTEXT|IT_HEADER, "Save as guest...", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
|
||||||
|
{IT_STRING | IT_CALL, "Best Time", NULL, NULL, {.routine = M_SetGuestReplay}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Best Lap", NULL, NULL, {.routine = M_SetGuestReplay}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Last Run", NULL, NULL, {.routine = M_SetGuestReplay}, 0, 0},
|
||||||
|
|
||||||
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
{IT_STRING | IT_CALL, "Delete Guest", NULL, NULL, {.routine = M_SetGuestReplay}, 0, 0},
|
||||||
|
|
||||||
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
{IT_STRING | IT_SUBMENU, "Back", NULL, NULL, {.submenu = &PLAY_TimeAttackDef}, 0, 0},
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_t PLAY_TAReplayGuestDef = {
|
||||||
|
sizeof(PLAY_TAReplayGuest) / sizeof(menuitem_t),
|
||||||
|
&PLAY_TimeAttackDef,
|
||||||
|
0,
|
||||||
|
PLAY_TAReplayGuest,
|
||||||
|
0, 0,
|
||||||
|
0, 0,
|
||||||
|
2, 5,
|
||||||
|
M_DrawTimeAttack,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
menuitem_t PLAY_TAGhosts[] =
|
||||||
|
{
|
||||||
|
{IT_STRING | IT_CVAR, "Best Time", NULL, NULL, {.cvar = &cv_ghost_besttime}, 0, 0},
|
||||||
|
{IT_STRING | IT_CVAR, "Best Lap", NULL, NULL, {.cvar = &cv_ghost_bestlap}, 0, 0},
|
||||||
|
{IT_STRING | IT_CVAR, "Last", NULL, NULL, {.cvar = &cv_ghost_last}, 0, 0},
|
||||||
|
{IT_DISABLED, "Guest", NULL, NULL, {.cvar = &cv_ghost_guest}, 0, 0},
|
||||||
|
{IT_DISABLED, "Staff", NULL, NULL, {.cvar = &cv_ghost_staff}, 0, 0},
|
||||||
|
|
||||||
|
{IT_HEADERTEXT|IT_HEADER, "", NULL, NULL, {NULL}, 0, 0},
|
||||||
|
{IT_STRING | IT_SUBMENU, "Back", NULL, NULL, {.submenu = &PLAY_TimeAttackDef}, 0, 0},
|
||||||
|
};
|
||||||
|
|
||||||
|
menu_t PLAY_TAGhostsDef = {
|
||||||
|
sizeof(PLAY_TAGhosts) / sizeof(menuitem_t),
|
||||||
|
&PLAY_TimeAttackDef,
|
||||||
|
0,
|
||||||
|
PLAY_TAGhosts,
|
||||||
|
0, 0,
|
||||||
|
0, 0,
|
||||||
|
2, 5,
|
||||||
|
M_DrawTimeAttack,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
// BATTLE
|
// BATTLE
|
||||||
|
|
||||||
menuitem_t PLAY_BattleGamemodesMenu[] =
|
menuitem_t PLAY_BattleGamemodesMenu[] =
|
||||||
|
|
|
||||||
|
|
@ -2000,38 +2000,70 @@ void M_DrawTimeAttack(void)
|
||||||
INT16 t = (48*menutransition.tics);
|
INT16 t = (48*menutransition.tics);
|
||||||
INT16 leftedge = 149+t+16;
|
INT16 leftedge = 149+t+16;
|
||||||
INT16 rightedge = 149+t+155;
|
INT16 rightedge = 149+t+155;
|
||||||
INT16 opty = 152;
|
INT16 opty = 140;
|
||||||
|
INT32 w;
|
||||||
lumpnum_t lumpnum;
|
lumpnum_t lumpnum;
|
||||||
UINT8 i;
|
UINT8 i;
|
||||||
|
consvar_t *cv;
|
||||||
|
|
||||||
M_DrawLevelSelectBlock(0, 2, map, true, false);
|
M_DrawLevelSelectBlock(0, 2, map, true, false);
|
||||||
|
|
||||||
//V_DrawFill(24-t, 82, 100, 100, 36); // size test
|
//V_DrawFill(24-t, 82, 100, 100, 36); // size test
|
||||||
|
|
||||||
lumpnum = W_CheckNumForName(va("%sR", G_BuildMapName(map+1)));
|
|
||||||
if (lumpnum != LUMPERROR)
|
|
||||||
V_DrawScaledPatch(24-t, 82, 0, W_CachePatchNum(lumpnum, PU_CACHE));
|
|
||||||
|
|
||||||
V_DrawScaledPatch(149+t, 70, 0, W_CachePatchName("BESTTIME", PU_CACHE));
|
V_DrawScaledPatch(149+t, 70, 0, W_CachePatchName("BESTTIME", PU_CACHE));
|
||||||
|
|
||||||
V_DrawRightAlignedString(rightedge-12, 82, highlightflags, "BEST LAP:");
|
if (currentMenu == &PLAY_TimeAttackDef)
|
||||||
K_drawKartTimestamp(0, 162+t, 88, 0, 2);
|
{
|
||||||
|
lumpnum = W_CheckNumForName(va("%sR", G_BuildMapName(map+1)));
|
||||||
|
if (lumpnum != LUMPERROR)
|
||||||
|
V_DrawScaledPatch(24-t, 82, 0, W_CachePatchNum(lumpnum, PU_CACHE));
|
||||||
|
|
||||||
V_DrawRightAlignedString(rightedge-12, 112, highlightflags, "BEST TIME:");
|
V_DrawRightAlignedString(rightedge-12, 82, highlightflags, "BEST LAP:");
|
||||||
K_drawKartTimestamp(0, 162+t, 118, map, 1);
|
K_drawKartTimestamp(0, 162+t, 88, 0, 2);
|
||||||
|
|
||||||
|
V_DrawRightAlignedString(rightedge-12, 112, highlightflags, "BEST TIME:");
|
||||||
|
K_drawKartTimestamp(0, 162+t, 118, map, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
opty = 80;
|
||||||
|
|
||||||
for (i = 0; i < currentMenu->numitems; i++)
|
for (i = 0; i < currentMenu->numitems; i++)
|
||||||
{
|
{
|
||||||
UINT32 f = (i == itemOn) ? recommendedflags : highlightflags;
|
UINT32 f = (i == itemOn) ? highlightflags : 0;
|
||||||
|
|
||||||
switch (currentMenu->menuitems[i].status & IT_DISPLAY)
|
switch (currentMenu->menuitems[i].status & IT_DISPLAY)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
case IT_HEADERTEXT:
|
||||||
|
|
||||||
|
V_DrawString(leftedge, opty, highlightflags, currentMenu->menuitems[i].text);
|
||||||
|
opty += 10;
|
||||||
|
break;
|
||||||
|
|
||||||
case IT_STRING:
|
case IT_STRING:
|
||||||
|
|
||||||
if (i >= currentMenu->numitems-1)
|
if (i >= currentMenu->numitems-1)
|
||||||
V_DrawRightAlignedString(rightedge, opty, f, currentMenu->menuitems[i].text);
|
V_DrawRightAlignedString(rightedge, opty, f, currentMenu->menuitems[i].text);
|
||||||
else
|
else
|
||||||
V_DrawString(leftedge, opty, f, currentMenu->menuitems[i].text);
|
V_DrawString(leftedge, opty, f, currentMenu->menuitems[i].text);
|
||||||
opty += 10;
|
opty += 10;
|
||||||
|
|
||||||
|
// Cvar specific handling
|
||||||
|
|
||||||
|
if (currentMenu->menuitems[i].status & IT_CVAR)
|
||||||
|
{
|
||||||
|
cv = currentMenu->menuitems[i].itemaction.cvar;
|
||||||
|
|
||||||
|
w = V_StringWidth(cv->string, 0);
|
||||||
|
V_DrawString(leftedge, opty, f, cv->string);
|
||||||
|
if (i == itemOn)
|
||||||
|
{
|
||||||
|
V_DrawCharacter(leftedge - 10 - (skullAnimCounter/5), opty, '\x1C' | f, false); // left arrow
|
||||||
|
V_DrawCharacter(leftedge + w + 2+ (skullAnimCounter/5), opty, '\x1D' | f, false); // right arrow
|
||||||
|
}
|
||||||
|
opty += 10;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case IT_SPACE:
|
case IT_SPACE:
|
||||||
opty += 4;
|
opty += 4;
|
||||||
|
|
|
||||||
|
|
@ -3454,6 +3454,9 @@ void M_CupSelectHandler(INT32 choice)
|
||||||
|
|
||||||
if (cupgrid.grandprix == true)
|
if (cupgrid.grandprix == true)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
UINT8 ssplayers = cv_splitplayers.value-1;
|
||||||
|
|
||||||
S_StartSound(NULL, sfx_s3k63);
|
S_StartSound(NULL, sfx_s3k63);
|
||||||
|
|
||||||
// Early fadeout to let the sound finish playing
|
// Early fadeout to let the sound finish playing
|
||||||
|
|
@ -3464,6 +3467,15 @@ void M_CupSelectHandler(INT32 choice)
|
||||||
|
|
||||||
memset(&grandprixinfo, 0, sizeof(struct grandprixinfo));
|
memset(&grandprixinfo, 0, sizeof(struct grandprixinfo));
|
||||||
|
|
||||||
|
if (cv_maxplayers.value < ssplayers+1)
|
||||||
|
CV_SetValue(&cv_maxplayers, ssplayers+1);
|
||||||
|
|
||||||
|
if (splitscreen != ssplayers)
|
||||||
|
{
|
||||||
|
splitscreen = ssplayers;
|
||||||
|
SplitScreen_OnChange();
|
||||||
|
}
|
||||||
|
|
||||||
// read our dummy cvars
|
// read our dummy cvars
|
||||||
|
|
||||||
grandprixinfo.gamespeed = min(KARTSPEED_HARD, cv_dummygpdifficulty.value);
|
grandprixinfo.gamespeed = min(KARTSPEED_HARD, cv_dummygpdifficulty.value);
|
||||||
|
|
@ -3677,6 +3689,79 @@ void M_LevelSelectTick(void)
|
||||||
levellist.y += dist/2;
|
levellist.y += dist/2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// time attack stuff...
|
||||||
|
void M_HandleStaffReplay(INT32 choice)
|
||||||
|
{
|
||||||
|
// @TODO:
|
||||||
|
(void) choice;
|
||||||
|
}
|
||||||
|
|
||||||
|
void M_ReplayTimeAttack(INT32 choice)
|
||||||
|
{
|
||||||
|
// @TODO:
|
||||||
|
(void) choice;
|
||||||
|
}
|
||||||
|
|
||||||
|
void M_SetGuestReplay(INT32 choice)
|
||||||
|
{
|
||||||
|
// @TODO:
|
||||||
|
(void) choice;
|
||||||
|
}
|
||||||
|
|
||||||
|
void M_StartTimeAttack(INT32 choice)
|
||||||
|
{
|
||||||
|
char *gpath;
|
||||||
|
const size_t glen = strlen("media")+1+strlen("replay")+1+strlen(timeattackfolder)+1+strlen("MAPXX")+1;
|
||||||
|
char nameofdemo[256];
|
||||||
|
(void)choice;
|
||||||
|
emeralds = 0;
|
||||||
|
|
||||||
|
modeattacking = ATTACKING_TIME;
|
||||||
|
|
||||||
|
// Still need to reset devmode
|
||||||
|
cv_debug = 0;
|
||||||
|
|
||||||
|
if (demo.playback)
|
||||||
|
G_StopDemo();
|
||||||
|
if (metalrecording)
|
||||||
|
G_StopMetalDemo();
|
||||||
|
|
||||||
|
splitscreen = 0;
|
||||||
|
SplitScreen_OnChange();
|
||||||
|
|
||||||
|
S_StartSound(NULL, sfx_s3k63);
|
||||||
|
|
||||||
|
paused = false;
|
||||||
|
|
||||||
|
// Early fadeout to let the sound finish playing
|
||||||
|
F_WipeStartScreen();
|
||||||
|
V_DrawFill(0, 0, BASEVIDWIDTH, BASEVIDHEIGHT, 31);
|
||||||
|
F_WipeEndScreen();
|
||||||
|
F_RunWipe(wipedefs[wipe_level_toblack], false, "FADEMAP0", false, false);
|
||||||
|
|
||||||
|
SV_StartSinglePlayerServer();
|
||||||
|
|
||||||
|
gpath = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"%s",
|
||||||
|
srb2home, timeattackfolder);
|
||||||
|
M_MkdirEach(gpath, M_PathParts(gpath) - 3, 0755);
|
||||||
|
|
||||||
|
if ((gpath = malloc(glen)) == NULL)
|
||||||
|
I_Error("Out of memory for replay filepath\n");
|
||||||
|
|
||||||
|
sprintf(gpath,"media"PATHSEP"replay"PATHSEP"%s"PATHSEP"%s", timeattackfolder, G_BuildMapName(levellist.choosemap+1));
|
||||||
|
snprintf(nameofdemo, sizeof nameofdemo, "%s-%s-last", gpath, cv_skin[0].string);
|
||||||
|
|
||||||
|
if (!cv_autorecord.value)
|
||||||
|
remove(va("%s"PATHSEP"%s.lmp", srb2home, nameofdemo));
|
||||||
|
else
|
||||||
|
G_RecordDemo(nameofdemo);
|
||||||
|
|
||||||
|
M_ClearMenus(true);
|
||||||
|
D_MapChange(levellist.choosemap+1, levellist.newgametype, (cv_dummygpencore.value == 1), 1, 1, false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct mpmenu_s mpmenu;
|
struct mpmenu_s mpmenu;
|
||||||
|
|
||||||
// MULTIPLAYER OPTION SELECT
|
// MULTIPLAYER OPTION SELECT
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue