From 9f2a6cde8a2469391bd47dd5462ad17fdf33ebcf Mon Sep 17 00:00:00 2001 From: spherallic <spherallic@gmail.com> Date: Thu, 28 Sep 2023 22:22:29 +0200 Subject: [PATCH] NiGHTS text changes: - Add lastmaretime to players, used to show time at mare/end results - Replace textvar numbers with an enum (NTV_) --- src/d_player.h | 15 +++++++++++++-- src/lua_playerlib.c | 8 ++++++++ src/p_saveg.c | 2 ++ src/p_user.c | 24 +++++++++++++----------- src/st_stuff.c | 35 +++++++++++++++++++++-------------- 5 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 7ad5b9f81..1b04e9909 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -369,6 +369,16 @@ typedef enum AI_SPINFOLLOW } aistatetype_t; +// NiGHTS text +typedef enum +{ + NTV_NONE = 0, + NTV_GETSPHERES, + NTV_GETMORESPHERES, + NTV_BONUSTIMESTART, + NTV_BONUSTIMEEND, +} nightstextvar_t; + // ======================================================================== // PLAYER STRUCTURE @@ -568,7 +578,8 @@ typedef struct player_s // Statistical purposes. tic_t marebegunat; // Leveltime when mare begun tic_t startedtime; // Time which you started this mare with. - tic_t finishedtime; // Time it took you to finish the mare (used for display) + tic_t finishedtime; // The time it took to destroy the capsule on this mare (used for bonus time display) + tic_t lastmaretime; // The time it took to complete the last mare (used for rank display) tic_t lapbegunat; // Leveltime when lap begun tic_t lapstartedtime; // Time which you started this lap with. INT16 finishedspheres; // The spheres you had left upon finishing the mare @@ -583,7 +594,7 @@ typedef struct player_s UINT8 totalmarebonuslap; // total mare bonus lap INT32 maxlink; // maximum link obtained UINT8 texttimer; // nights_texttime should not be local - UINT8 textvar; // which line of NiGHTS text to show -- let's not use cheap hacks + UINT8 textvar; // which line of NiGHTS text to show -- see nightstextvar_t INT16 lastsidehit, lastlinehit; diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 827e5a405..d4b6e29e7 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -190,6 +190,7 @@ enum player_e player_marelap, player_marebonuslap, player_marebegunat, + player_lastmaretime, player_startedtime, player_finishedtime, player_lapbegunat, @@ -338,6 +339,7 @@ static const char *const player_opt[] = { "marelap", "marebonuslap", "marebegunat", + "lastmaretime", "startedtime", "finishedtime", "lapbegunat", @@ -727,6 +729,9 @@ static int player_get(lua_State *L) case player_marebegunat: lua_pushinteger(L, plr->marebegunat); break; + case player_lastmaretime: + lua_pushinteger(L, plr->lastmaretime); + break; case player_startedtime: lua_pushinteger(L, plr->startedtime); break; @@ -1220,6 +1225,9 @@ static int player_set(lua_State *L) case player_marebegunat: plr->marebegunat = (tic_t)luaL_checkinteger(L, 3); break; + case player_lastmaretime: + plr->lastmaretime = (tic_t)luaL_checkinteger(L, 3); + break; case player_startedtime: plr->startedtime = (tic_t)luaL_checkinteger(L, 3); break; diff --git a/src/p_saveg.c b/src/p_saveg.c index faecd1377..8ebdaa7fa 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -261,6 +261,7 @@ static void P_NetArchivePlayers(void) WRITEUINT8(save_p, players[i].marelap); WRITEUINT8(save_p, players[i].marebonuslap); WRITEUINT32(save_p, players[i].marebegunat); + WRITEUINT32(save_p, players[i].lastmaretime); WRITEUINT32(save_p, players[i].startedtime); WRITEUINT32(save_p, players[i].finishedtime); WRITEUINT32(save_p, players[i].lapbegunat); @@ -491,6 +492,7 @@ static void P_NetUnArchivePlayers(void) players[i].marelap = READUINT8(save_p); players[i].marebonuslap = READUINT8(save_p); players[i].marebegunat = READUINT32(save_p); + players[i].lastmaretime = READUINT32(save_p); players[i].startedtime = READUINT32(save_p); players[i].finishedtime = READUINT32(save_p); players[i].lapbegunat = READUINT32(save_p); diff --git a/src/p_user.c b/src/p_user.c index 57f998d55..ac53b00d2 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -866,7 +866,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) continue; players[i].texttimer = (3 * TICRATE) - 10; - players[i].textvar = 4; // Score and grades + players[i].textvar = NTV_BONUSTIMEEND; // Score and grades players[i].lastmare = players[i].mare; players[i].lastmarelap = players[i].marelap; players[i].lastmarebonuslap = players[i].marebonuslap; @@ -884,7 +884,8 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) } // Add score to leaderboards now - G_AddTempNightsRecords(player, players[i].marescore, leveltime - player->marebegunat, players[i].mare + 1); + player->lastmaretime = leveltime - max(0, player->marebegunat); + G_AddTempNightsRecords(player, players[i].marescore, player->lastmaretime, players[i].mare + 1); // transfer scores anyway players[i].totalmarescore += players[i].marescore; @@ -905,12 +906,13 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) player->lastmarelap = oldmarelap; player->lastmarebonuslap = oldmarebonuslap; player->texttimer = 4*TICRATE; - player->textvar = 4; // Score and grades + player->textvar = NTV_BONUSTIMEEND; // Score and grades player->finishedspheres = (INT16)(player->spheres); player->finishedrings = (INT16)(player->rings); // Add score to temp leaderboards - G_AddTempNightsRecords(player, player->marescore, leveltime - player->marebegunat, (UINT8)(oldmare + 1)); + player->lastmaretime = leveltime - max(0, player->marebegunat); + G_AddTempNightsRecords(player, player->marescore, player->lastmaretime, (UINT8)(oldmare + 1)); // Starting a new mare, transfer scores player->totalmarescore += player->marescore; @@ -923,7 +925,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime) } else { - player->textvar = 5; // Nothing, just tells it to go to the GET n RINGS/SPHERES text in a bit + player->textvar = NTV_NONE; // Nothing, just tells it to go to the GET n RINGS/SPHERES text in a bit player->texttimer = 40; // Don't show before title card @@ -6955,7 +6957,7 @@ static void P_DoNiGHTSCapsule(player_t *player) { players[i].bonustime = true; players[i].texttimer = 4*TICRATE; - players[i].textvar = 1; // Time Bonus + players[i].textvar = NTV_BONUSTIMESTART; // Time Bonus players[i].finishedtime = players[i].nightstime; if (!G_IsSpecialStage(gamemap)) P_AddPlayerScore(&players[i], (players[i].finishedtime/TICRATE) * 100); @@ -7033,12 +7035,12 @@ static void P_DoNiGHTSCapsule(player_t *player) { S_StartScreamSound(player->mo, sfx_lose); player->texttimer = 4*TICRATE; - player->textvar = 3; // Get more rings! + player->textvar = NTV_GETMORESPHERES; // Get more spheres/chips! player->capsule->reactiontime = 0; player->capsule->extravalue1 = player->capsule->cvmem =\ player->capsule->cusval = player->capsule->movecount =\ player->capsule->lastlook = player->capsule->extravalue2 = -1; - P_RunNightsCapsuleTouchExecutors(player->mo, false, false); // run capsule exit executors, and we lacked rings + P_RunNightsCapsuleTouchExecutors(player->mo, false, false); // run capsule exit executors, and we lacked spheres/chips } } } @@ -12323,13 +12325,13 @@ void P_PlayerThink(player_t *player) if (player->texttimer) { --player->texttimer; - if (!player->texttimer && !player->exiting && player->textvar >= 4) + if (!player->texttimer && !player->exiting && (player->textvar == NTV_NONE || player->textvar == NTV_BONUSTIMEEND)) { player->texttimer = 4*TICRATE; - player->textvar = 2; // GET n RINGS! + player->textvar = NTV_GETSPHERES; // GET n SPHERES/CHIPS! if (player->capsule && player->capsule->health != player->capsule->spawnpoint->args[1]) - player->textvar++; // GET n MORE RINGS! + player->textvar = NTV_GETMORESPHERES; // GET n MORE SPHERES/CHIPS! } } diff --git a/src/st_stuff.c b/src/st_stuff.c index b2e98fcf9..469b91ea6 100644 --- a/src/st_stuff.c +++ b/src/st_stuff.c @@ -1726,22 +1726,23 @@ static void ST_drawNightsRecords(void) switch (stplyr->textvar) { - case 1: // A "Bonus Time Start" by any other name... + case NTV_BONUSTIMESTART: // A "Bonus Time Start" by any other name... { V_DrawCenteredString(BASEVIDWIDTH/2, 52, V_GREENMAP|aflag, M_GetText("GET TO THE GOAL!")); V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, M_GetText("SCORE MULTIPLIER START!")); if (stplyr->finishedtime) { + tic_t maretime = stplyr->startedtime - stplyr->finishedtime; V_DrawString(BASEVIDWIDTH/2 - 48, 140, aflag, "TIME:"); V_DrawString(BASEVIDWIDTH/2 - 48, 148, aflag, "BONUS:"); - V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, V_ORANGEMAP|aflag, va("%d", (stplyr->startedtime - stplyr->finishedtime)/TICRATE)); + V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, aflag, va("\x87%i:%02i\x80.%02i", G_TicsToMinutes(maretime,true), G_TicsToSeconds(maretime), G_TicsToCentiseconds(maretime))); V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, V_ORANGEMAP|aflag, va("%d", (stplyr->finishedtime/TICRATE) * 100)); } break; } - case 2: // Get n Spheres - case 3: // Get n more Spheres + case NTV_GETSPHERES: // Get n Spheres + case NTV_GETMORESPHERES: // Get n more Spheres { if (!stplyr->capsule) return; @@ -1749,18 +1750,24 @@ static void ST_drawNightsRecords(void) // Yes, this string is an abomination. V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, va(M_GetText("\x80GET\x82 %d\x80 %s%s%s!"), stplyr->capsule->health, - (stplyr->textvar == 3) ? M_GetText("MORE ") : "", + (stplyr->textvar == NTV_GETMORESPHERES) ? M_GetText("MORE ") : "", (G_IsSpecialStage(gamemap)) ? "SPHERE" : "CHIP", (stplyr->capsule->health > 1) ? "S" : "")); break; } - case 4: // End Bonus + case NTV_BONUSTIMEEND: // End Bonus { - V_DrawString(BASEVIDWIDTH/2 - 56, 140, aflag, (G_IsSpecialStage(gamemap)) ? "SPHERES:" : "CHIPS:"); - V_DrawString(BASEVIDWIDTH/2 - 56, 148, aflag, "BONUS:"); - V_DrawRightAlignedString(BASEVIDWIDTH/2 + 56, 140, V_ORANGEMAP|aflag, va("%d", stplyr->finishedspheres)); - V_DrawRightAlignedString(BASEVIDWIDTH/2 + 56, 148, V_ORANGEMAP|aflag, va("%d", stplyr->finishedspheres * 50)); - ST_DrawNightsOverlayNum((BASEVIDWIDTH/2 + 56)<<FRACBITS, 160<<FRACBITS, FRACUNIT, aflag, stplyr->lastmarescore, nightsnum, SKINCOLOR_AZURE); + V_DrawString(BASEVIDWIDTH/2 - 48, 132, aflag, "TIME:"); + V_DrawString(BASEVIDWIDTH/2 - 48, 140, aflag, (G_IsSpecialStage(gamemap)) ? "SPHERES:" : "CHIPS:"); + V_DrawString(BASEVIDWIDTH/2 - 48, 148, aflag, "BONUS:"); + V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 132, V_ORANGEMAP|aflag, va("%i:%02i.%02i", G_TicsToMinutes(stplyr->lastmaretime,true), G_TicsToSeconds(stplyr->lastmaretime), G_TicsToCentiseconds(stplyr->lastmaretime))); + V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, V_ORANGEMAP|aflag, va("%d", stplyr->finishedspheres)); + V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, V_ORANGEMAP|aflag, va("%d", stplyr->finishedspheres * 50)); + ST_DrawNightsOverlayNum((BASEVIDWIDTH/2 + 48)<<FRACBITS, 160<<FRACBITS, FRACUNIT, aflag, stplyr->lastmarescore, nightsnum, SKINCOLOR_AZURE); + + // If this is a multi-mare map, display the mare number. + if (stplyr->lastmare || P_FindLowestMare() < UINT8_MAX) + V_DrawLevelActNum(BASEVIDWIDTH/2 - 80, 128 + 3, aflag, stplyr->lastmare + 1); // If new record, say so! if (!(netgame || multiplayer) && G_GetBestNightsScore(gamemap, stplyr->lastmare + 1, clientGamedata) <= stplyr->lastmarescore) @@ -1772,8 +1779,8 @@ static void ST_drawNightsRecords(void) if (P_HasGrades(gamemap, stplyr->lastmare + 1)) { UINT8 grade = P_GetGrade(stplyr->lastmarescore, gamemap, stplyr->lastmare); - if (modeattacking || grade >= GRADE_A) - V_DrawTranslucentPatch(BASEVIDWIDTH/2 + 60, 160, aflag, ngradeletters[grade]); + if (modeattacking || !G_IsSpecialStage(gamemap) || grade >= GRADE_A) + V_DrawTranslucentPatch(BASEVIDWIDTH/2 + 60, 128, aflag, ngradeletters[grade]); } break; } @@ -1878,7 +1885,7 @@ static void ST_drawNiGHTSHUD(void) // Link drawing if (!oldspecialstage // Don't display when the score is showing (it popping up for a split second when exiting a map is intentional) - && !(stplyr->texttimer && stplyr->textvar == 4) + && !(stplyr->texttimer && stplyr->textvar == NTV_BONUSTIMEEND) && LUA_HudEnabled(hud_nightslink) && ((cv_debug & DBG_NIGHTSBASIC) || stplyr->linkcount > 1)) // When debugging, show "0 Link". {