Merge branch 'fruits-clipper' into 'next'

NiGHTS text improvements

Closes #1121

See merge request STJr/SRB2!2165
This commit is contained in:
sphere 2024-03-13 13:03:33 +00:00
commit 1b060d2b34
5 changed files with 64 additions and 34 deletions

View file

@ -373,6 +373,16 @@ typedef enum
AI_SPINFOLLOW AI_SPINFOLLOW
} aistatetype_t; } aistatetype_t;
// NiGHTS text
typedef enum
{
NTV_NONE = 0,
NTV_GETSPHERES,
NTV_GETMORESPHERES,
NTV_BONUSTIMESTART,
NTV_BONUSTIMEEND,
} nightstextvar_t;
// ======================================================================== // ========================================================================
// PLAYER STRUCTURE // PLAYER STRUCTURE
@ -572,7 +582,8 @@ typedef struct player_s
// Statistical purposes. // Statistical purposes.
tic_t marebegunat; // Leveltime when mare begun tic_t marebegunat; // Leveltime when mare begun
tic_t startedtime; // Time which you started this mare with. 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 lapbegunat; // Leveltime when lap begun
tic_t lapstartedtime; // Time which you started this lap with. tic_t lapstartedtime; // Time which you started this lap with.
INT16 finishedspheres; // The spheres you had left upon finishing the mare INT16 finishedspheres; // The spheres you had left upon finishing the mare
@ -587,7 +598,7 @@ typedef struct player_s
UINT8 totalmarebonuslap; // total mare bonus lap UINT8 totalmarebonuslap; // total mare bonus lap
INT32 maxlink; // maximum link obtained INT32 maxlink; // maximum link obtained
UINT8 texttimer; // nights_texttime should not be local 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; INT16 lastsidehit, lastlinehit;

View file

@ -190,6 +190,7 @@ enum player_e
player_marelap, player_marelap,
player_marebonuslap, player_marebonuslap,
player_marebegunat, player_marebegunat,
player_lastmaretime,
player_startedtime, player_startedtime,
player_finishedtime, player_finishedtime,
player_lapbegunat, player_lapbegunat,
@ -337,6 +338,7 @@ static const char *const player_opt[] = {
"marelap", "marelap",
"marebonuslap", "marebonuslap",
"marebegunat", "marebegunat",
"lastmaretime",
"startedtime", "startedtime",
"finishedtime", "finishedtime",
"lapbegunat", "lapbegunat",
@ -725,6 +727,9 @@ static int player_get(lua_State *L)
case player_marebegunat: case player_marebegunat:
lua_pushinteger(L, plr->marebegunat); lua_pushinteger(L, plr->marebegunat);
break; break;
case player_lastmaretime:
lua_pushinteger(L, plr->lastmaretime);
break;
case player_startedtime: case player_startedtime:
lua_pushinteger(L, plr->startedtime); lua_pushinteger(L, plr->startedtime);
break; break;
@ -1219,6 +1224,9 @@ static int player_set(lua_State *L)
case player_marebegunat: case player_marebegunat:
plr->marebegunat = (tic_t)luaL_checkinteger(L, 3); plr->marebegunat = (tic_t)luaL_checkinteger(L, 3);
break; break;
case player_lastmaretime:
plr->lastmaretime = (tic_t)luaL_checkinteger(L, 3);
break;
case player_startedtime: case player_startedtime:
plr->startedtime = (tic_t)luaL_checkinteger(L, 3); plr->startedtime = (tic_t)luaL_checkinteger(L, 3);
break; break;

View file

@ -261,6 +261,7 @@ static void P_NetArchivePlayers(void)
WRITEUINT8(save_p, players[i].marelap); WRITEUINT8(save_p, players[i].marelap);
WRITEUINT8(save_p, players[i].marebonuslap); WRITEUINT8(save_p, players[i].marebonuslap);
WRITEUINT32(save_p, players[i].marebegunat); WRITEUINT32(save_p, players[i].marebegunat);
WRITEUINT32(save_p, players[i].lastmaretime);
WRITEUINT32(save_p, players[i].startedtime); WRITEUINT32(save_p, players[i].startedtime);
WRITEUINT32(save_p, players[i].finishedtime); WRITEUINT32(save_p, players[i].finishedtime);
WRITEUINT32(save_p, players[i].lapbegunat); WRITEUINT32(save_p, players[i].lapbegunat);
@ -492,6 +493,7 @@ static void P_NetUnArchivePlayers(void)
players[i].marelap = READUINT8(save_p); players[i].marelap = READUINT8(save_p);
players[i].marebonuslap = READUINT8(save_p); players[i].marebonuslap = READUINT8(save_p);
players[i].marebegunat = READUINT32(save_p); players[i].marebegunat = READUINT32(save_p);
players[i].lastmaretime = READUINT32(save_p);
players[i].startedtime = READUINT32(save_p); players[i].startedtime = READUINT32(save_p);
players[i].finishedtime = READUINT32(save_p); players[i].finishedtime = READUINT32(save_p);
players[i].lapbegunat = READUINT32(save_p); players[i].lapbegunat = READUINT32(save_p);

View file

@ -872,7 +872,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
continue; continue;
players[i].texttimer = (3 * TICRATE) - 10; 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].lastmare = players[i].mare;
players[i].lastmarelap = players[i].marelap; players[i].lastmarelap = players[i].marelap;
players[i].lastmarebonuslap = players[i].marebonuslap; players[i].lastmarebonuslap = players[i].marebonuslap;
@ -890,7 +890,8 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
} }
// Add score to leaderboards now // Add score to leaderboards now
G_AddTempNightsRecords(player, players[i].marescore, leveltime - player->marebegunat, players[i].mare + 1); player->lastmaretime = leveltime - player->marebegunat;
G_AddTempNightsRecords(player, players[i].marescore, player->lastmaretime, players[i].mare + 1);
// transfer scores anyway // transfer scores anyway
players[i].totalmarescore += players[i].marescore; players[i].totalmarescore += players[i].marescore;
@ -911,12 +912,13 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
player->lastmarelap = oldmarelap; player->lastmarelap = oldmarelap;
player->lastmarebonuslap = oldmarebonuslap; player->lastmarebonuslap = oldmarebonuslap;
player->texttimer = 4*TICRATE; player->texttimer = 4*TICRATE;
player->textvar = 4; // Score and grades player->textvar = NTV_BONUSTIMEEND; // Score and grades
player->finishedspheres = (INT16)(player->spheres); player->finishedspheres = (INT16)(player->spheres);
player->finishedrings = (INT16)(player->rings); player->finishedrings = (INT16)(player->rings);
// Add score to temp leaderboards // Add score to temp leaderboards
G_AddTempNightsRecords(player, player->marescore, leveltime - player->marebegunat, (UINT8)(oldmare + 1)); player->lastmaretime = leveltime - player->marebegunat;
G_AddTempNightsRecords(player, player->marescore, player->lastmaretime, (UINT8)(oldmare + 1));
// Starting a new mare, transfer scores // Starting a new mare, transfer scores
player->totalmarescore += player->marescore; player->totalmarescore += player->marescore;
@ -929,7 +931,7 @@ void P_NightserizePlayer(player_t *player, INT32 nighttime)
} }
else 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; player->texttimer = 40;
// Don't show before title card // Don't show before title card
@ -7010,7 +7012,7 @@ static void P_DoNiGHTSCapsule(player_t *player)
{ {
players[i].bonustime = true; players[i].bonustime = true;
players[i].texttimer = 4*TICRATE; players[i].texttimer = 4*TICRATE;
players[i].textvar = 1; // Time Bonus players[i].textvar = NTV_BONUSTIMESTART; // Time Bonus
players[i].finishedtime = players[i].nightstime; players[i].finishedtime = players[i].nightstime;
if (!G_IsSpecialStage(gamemap)) if (!G_IsSpecialStage(gamemap))
P_AddPlayerScore(&players[i], (players[i].finishedtime/TICRATE) * 100); P_AddPlayerScore(&players[i], (players[i].finishedtime/TICRATE) * 100);
@ -7094,12 +7096,12 @@ static void P_DoNiGHTSCapsule(player_t *player)
{ {
S_StartScreamSound(player->mo, sfx_lose); S_StartScreamSound(player->mo, sfx_lose);
player->texttimer = 4*TICRATE; player->texttimer = 4*TICRATE;
player->textvar = 3; // Get more rings! player->textvar = NTV_GETMORESPHERES; // Get more spheres/chips!
player->capsule->reactiontime = 0; player->capsule->reactiontime = 0;
player->capsule->extravalue1 = player->capsule->cvmem =\ player->capsule->extravalue1 = player->capsule->cvmem =\
player->capsule->cusval = player->capsule->movecount =\ player->capsule->cusval = player->capsule->movecount =\
player->capsule->lastlook = player->capsule->extravalue2 = -1; 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
} }
} }
} }
@ -12453,13 +12455,13 @@ void P_PlayerThink(player_t *player)
if (player->texttimer) if (player->texttimer)
{ {
--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->texttimer = 4*TICRATE;
player->textvar = 2; // GET n RINGS! player->textvar = NTV_GETSPHERES; // GET n SPHERES/CHIPS!
if (!P_MobjWasRemoved(player->capsule) && player->capsule->health != player->capsule->spawnpoint->angle) if (!P_MobjWasRemoved(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!
} }
} }

View file

@ -1755,22 +1755,23 @@ static void ST_drawNightsRecords(void)
switch (stplyr->textvar) 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, 52, V_GREENMAP|aflag, M_GetText("GET TO THE GOAL!"));
V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, M_GetText("SCORE MULTIPLIER START!")); V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, M_GetText("SCORE MULTIPLIER START!"));
if (stplyr->finishedtime) if (stplyr->finishedtime)
{ {
V_DrawString(BASEVIDWIDTH/2 - 48, 140, aflag, "TIME:"); tic_t maretime = stplyr->startedtime - stplyr->finishedtime;
V_DrawString(BASEVIDWIDTH/2 - 48, 148, aflag, "BONUS:"); V_DrawString(BASEVIDWIDTH/2 - 48, 140, V_YELLOWMAP|aflag, "TIME:");
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, V_ORANGEMAP|aflag, va("%d", (stplyr->startedtime - stplyr->finishedtime)/TICRATE)); V_DrawString(BASEVIDWIDTH/2 - 48, 148, V_YELLOWMAP|aflag, "BONUS:");
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, V_ORANGEMAP|aflag, va("%d", (stplyr->finishedtime/TICRATE) * 100)); V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, aflag, va("%i:%02i.%02i", G_TicsToMinutes(maretime,true), G_TicsToSeconds(maretime), G_TicsToCentiseconds(maretime)));
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, aflag, va("%d", (stplyr->finishedtime/TICRATE) * 100));
} }
break; break;
} }
case 2: // Get n Spheres case NTV_GETSPHERES: // Get n Spheres
case 3: // Get n more Spheres case NTV_GETMORESPHERES: // Get n more Spheres
{ {
if (!stplyr->capsule) if (!stplyr->capsule)
return; return;
@ -1778,31 +1779,37 @@ static void ST_drawNightsRecords(void)
// Yes, this string is an abomination. // Yes, this string is an abomination.
V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag, V_DrawCenteredString(BASEVIDWIDTH/2, 60, aflag,
va(M_GetText("\x80GET\x82 %d\x80 %s%s%s!"), stplyr->capsule->health, 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", (G_IsSpecialStage(gamemap)) ? "SPHERE" : "CHIP",
(stplyr->capsule->health > 1) ? "S" : "")); (stplyr->capsule->health > 1) ? "S" : ""));
break; 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 - 48, 132, V_YELLOWMAP|aflag, "TIME:");
V_DrawString(BASEVIDWIDTH/2 - 56, 148, aflag, "BONUS:"); V_DrawString(BASEVIDWIDTH/2 - 48, 140, V_YELLOWMAP|aflag, (G_IsSpecialStage(gamemap)) ? "SPHERES:" : "CHIPS:");
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 56, 140, V_ORANGEMAP|aflag, va("%d", stplyr->finishedspheres)); V_DrawString(BASEVIDWIDTH/2 - 48, 148, V_YELLOWMAP|aflag, "BONUS:");
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 56, 148, V_ORANGEMAP|aflag, va("%d", stplyr->finishedspheres * 50)); V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 132, aflag, va("%i:%02i.%02i", G_TicsToMinutes(stplyr->lastmaretime,true), G_TicsToSeconds(stplyr->lastmaretime), G_TicsToCentiseconds(stplyr->lastmaretime)));
ST_DrawNightsOverlayNum((BASEVIDWIDTH/2 + 56)<<FRACBITS, 160<<FRACBITS, FRACUNIT, aflag, stplyr->lastmarescore, nightsnum, SKINCOLOR_AZURE); V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 140, aflag, va("%d", stplyr->finishedspheres));
V_DrawRightAlignedString(BASEVIDWIDTH/2 + 48, 148, 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 new record, say so!
if (!(netgame || multiplayer) && G_GetBestNightsScore(gamemap, stplyr->lastmare + 1, clientGamedata) <= stplyr->lastmarescore) if (!(netgame || multiplayer) && G_GetBestNightsScore(gamemap, stplyr->lastmare + 1, clientGamedata) <= stplyr->lastmarescore)
{ {
if (stplyr->texttimer & 16) if (stplyr->texttimer & 16)
V_DrawCenteredString(BASEVIDWIDTH/2, 184, V_YELLOWMAP|aflag, "* NEW RECORD *"); V_DrawCenteredString(BASEVIDWIDTH/2, 184, aflag, "\x85* \x82NEW RECORD \x85*\x80");
} }
if (P_HasGrades(gamemap, stplyr->lastmare + 1)) if (P_HasGrades(gamemap, stplyr->lastmare + 1))
{ {
UINT8 grade = P_GetGrade(stplyr->lastmarescore, gamemap, stplyr->lastmare); UINT8 grade = P_GetGrade(stplyr->lastmarescore, gamemap, stplyr->lastmare);
if (modeattacking || grade >= GRADE_A) if (modeattacking || !G_IsSpecialStage(gamemap) || grade >= GRADE_A)
V_DrawTranslucentPatch(BASEVIDWIDTH/2 + 60, 160, aflag, ngradeletters[grade]); V_DrawTranslucentPatch(BASEVIDWIDTH/2 + 60, 128, aflag, ngradeletters[grade]);
} }
break; break;
} }
@ -1912,7 +1919,7 @@ static void ST_drawNiGHTSHUD(void)
// Link drawing // Link drawing
if (!oldspecialstage if (!oldspecialstage
// Don't display when the score is showing (it popping up for a split second when exiting a map is intentional) // 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) && LUA_HudEnabled(hud_nightslink)
&& ((cv_debug & DBG_NIGHTSBASIC) || stplyr->linkcount > 1)) // When debugging, show "0 Link". && ((cv_debug & DBG_NIGHTSBASIC) || stplyr->linkcount > 1)) // When debugging, show "0 Link".
{ {
@ -1959,7 +1966,7 @@ static void ST_drawNiGHTSHUD(void)
INT32 amount; INT32 amount;
const INT32 length = 88; const INT32 length = 88;
origamount = stplyr->capsule->spawnpoint->angle; origamount = stplyr->capsule->spawnpoint->args[1];
I_Assert(origamount > 0); // should not happen now I_Assert(origamount > 0); // should not happen now
ST_DrawTopLeftOverlayPatch(72, 8, nbracket); ST_DrawTopLeftOverlayPatch(72, 8, nbracket);