Mammoth commit!

* Make TIME part of HUD count down in a bunch of circumstances where it was otherwise some other seperate thing.
* Make race countdown happen in a bunch of appropriate circumstances.
* Refactor race countdown.
* Remove a lot of useless stuff from H&S/Tag UI.
* Make co-op/competition/race end-of-act countdown use the race countdown and bigger HUD font.
* Remove useless PLAYING/SPECTATE text from lives element.
* Merge lap counter into lives element.
* Move some other text around.
This commit is contained in:
toasterbabe 2018-03-21 18:18:45 +00:00
parent 05bf3674d3
commit 24c017564e
6 changed files with 152 additions and 126 deletions

View File

@ -1591,20 +1591,8 @@ static void HU_DrawRankings(void)
{
if (cv_timelimit.value && timelimitintics > 0)
{
INT32 timeval = (timelimitintics+1-leveltime)/TICRATE;
if (leveltime <= timelimitintics)
{
V_DrawCenteredString(64, 8, 0, "TIME LEFT");
V_DrawCenteredString(64, 16, 0, va("%u", timeval));
}
// overtime
if ((leveltime > (timelimitintics + TICRATE/2)) && cv_overtime.value)
{
V_DrawCenteredString(64, 8, 0, "TIME LEFT");
V_DrawCenteredString(64, 16, 0, "OVERTIME");
}
V_DrawCenteredString(64, 8, 0, "TIME");
V_DrawCenteredString(64, 16, 0, va("%i:%02i", G_TicsToMinutes(stplyr->realtime, true), G_TicsToSeconds(stplyr->realtime)));
}
if (cv_pointlimit.value > 0)

View File

@ -5682,7 +5682,7 @@ static void M_DrawChecklist(void)
beat = va("Get %d points in %s", cond[condnum].requirement, level);
break;
case UC_MAPTIME:
beat = va("Beat %s in %d:%d.%d", level,
beat = va("Beat %s in %d:%02d.%02d", level,
G_TicsToMinutes(cond[condnum].requirement, true),
G_TicsToSeconds(cond[condnum].requirement),
G_TicsToCentiseconds(cond[condnum].requirement));
@ -5707,7 +5707,7 @@ static void M_DrawChecklist(void)
beat = va("Get %d points over all maps", cond[condnum].requirement);
break;
case UC_OVERALLTIME:
beat = va("Get a total time of less than %d:%d.%d",
beat = va("Get a total time of less than %d:%02d.%02d",
G_TicsToMinutes(cond[condnum].requirement, true),
G_TicsToSeconds(cond[condnum].requirement),
G_TicsToCentiseconds(cond[condnum].requirement));
@ -5755,12 +5755,12 @@ static void M_DrawChecklist(void)
break;
case UC_NIGHTSTIME:
if (cond[condnum].extrainfo2)
beat = va("Beat %s, mare %d in %d:%d.%d", level, cond[condnum].extrainfo2,
beat = va("Beat %s, mare %d in %d:%02d.%02d", level, cond[condnum].extrainfo2,
G_TicsToMinutes(cond[condnum].requirement, true),
G_TicsToSeconds(cond[condnum].requirement),
G_TicsToCentiseconds(cond[condnum].requirement));
else
beat = va("Beat %s in %d:%d.%d",
beat = va("Beat %s in %d:%02d.%02d",
level,
G_TicsToMinutes(cond[condnum].requirement, true),
G_TicsToSeconds(cond[condnum].requirement),

View File

@ -1725,7 +1725,7 @@ void P_DoPlayerExit(player_t *player)
else if (gametype == GT_RACE || gametype == GT_COMPETITION) // If in Race Mode, allow
{
if (!countdown) // a 60-second wait ala Sonic 2.
countdown = cv_countdowntime.value*TICRATE + 1; // Use cv_countdowntime
countdown = (cv_countdowntime.value - 1)*TICRATE + 1; // Use cv_countdowntime
player->exiting = 3*TICRATE;
@ -9538,7 +9538,7 @@ void P_PlayerThink(player_t *player)
if (i == MAXPLAYERS && player->exiting == 3*TICRATE) // finished
player->exiting = (14*TICRATE)/5 + 1;
// If 10 seconds are left on the timer,
// If 11 seconds are left on the timer,
// begin the drown music for countdown!
if (countdown == 11*TICRATE - 1)
{

View File

@ -455,9 +455,8 @@ void SCR_ClosedCaptions(void)
if (music && !gamestopped && (closedcaptions[i].t < flashingtics) && (closedcaptions[i].t & 1))
continue;
flags = V_NOSCALESTART|V_ALLOWLOWERCASE;
y = vid.height-((i + 2)*10*vid.dupy);
dot = ' ';
flags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_ALLOWLOWERCASE;
y = BASEVIDHEIGHT-((i + 2)*10);
if (closedcaptions[i].b)
y -= (closedcaptions[i].b--)*vid.dupy;
@ -469,8 +468,10 @@ void SCR_ClosedCaptions(void)
dot = '\x19';
else if (closedcaptions[i].c && closedcaptions[i].c->origin)
dot = '\x1E';
else
dot = ' ';
V_DrawRightAlignedString(vid.width-(20*vid.dupx), y,
flags, va("%c [%s]", dot, (closedcaptions[i].s->caption[0] ? closedcaptions[i].s->caption : closedcaptions[i].s->name)));
V_DrawRightAlignedString(BASEVIDWIDTH - 20, y, flags,
va("%c [%s]", dot, (closedcaptions[i].s->caption[0] ? closedcaptions[i].s->caption : closedcaptions[i].s->name)));
}
}

View File

@ -151,8 +151,6 @@ hudinfo_t hudinfo[NUMHUDITEMS] =
{ 152, 168, 0}, // HUD_HUNTPICS
{ 152, 24, V_SNAPTORIGHT}, // HUD_GRAVBOOTSICO
{ 240, 160, V_SNAPTOBOTTOM|V_SNAPTORIGHT}, // HUD_LAP
};
//
@ -541,15 +539,46 @@ static void ST_drawScore(void)
ST_DrawNumFromHud(HUD_SCORENUM, op_displayflags, V_HUDTRANS);
}
else
ST_DrawNumFromHud(HUD_SCORENUM, stplyr->score,V_HUDTRANS);
ST_DrawNumFromHud(HUD_SCORENUM, stplyr->score, V_HUDTRANS);
}
static void ST_drawRaceNum(INT32 time)
{
INT32 height, bounce;
patch_t *racenum;
time += TICRATE;
height = ((3*BASEVIDHEIGHT)>>2) - 8;
bounce = TICRATE - (1 + (time % TICRATE));
switch (time/TICRATE)
{
case 3:
racenum = race3;
break;
case 2:
racenum = race2;
break;
case 1:
racenum = race1;
break;
default:
racenum = racego;
break;
}
if (bounce < 3)
{
height -= (2 - bounce);
if (!(P_AutoPause() || paused) && !bounce)
S_StartSound(0, ((racenum == racego) ? sfx_s3kad : sfx_s3ka7));
}
V_DrawScaledPatch(((BASEVIDWIDTH - SHORT(racenum->width))/2), height, V_PERPLAYER, racenum);
}
static void ST_drawTime(void)
{
INT32 seconds, minutes, tictrn, tics;
// TIME:
ST_DrawPatchFromHud(HUD_TIME, ((mapheaderinfo[gamemap-1]->countdown && countdowntimer < 11*TICRATE && leveltime/5 & 1) ? sboredtime : sbotime), V_HUDTRANS);
boolean downwards = false;
if (objectplacing)
{
@ -560,12 +589,61 @@ static void ST_drawTime(void)
}
else
{
tics = (mapheaderinfo[gamemap-1]->countdown ? countdowntimer : stplyr->realtime);
seconds = G_TicsToSeconds(tics);
// Counting down the hidetime?
if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && (leveltime <= (hidetime*TICRATE)))
{
tics = (hidetime*TICRATE - leveltime);
if (tics < 3*TICRATE)
ST_drawRaceNum(tics);
downwards = true;
}
else
{
// Hidetime finish!
if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && (leveltime < ((hidetime+1)*TICRATE)))
ST_drawRaceNum(hidetime*TICRATE - leveltime);
// Time limit?
if (gametype != GT_RACE && gametype != GT_COMPETITION && gametype != GT_COOP && cv_timelimit.value && timelimitintics > 0)
{
if (timelimitintics >= leveltime)
{
tics = (timelimitintics - leveltime);
if (tics < 3*TICRATE)
ST_drawRaceNum(tics);
}
else // Overtime!
tics = 0;
downwards = true;
}
// Post-hidetime normal.
else if (gametype == GT_TAG || gametype == GT_HIDEANDSEEK)
tics = stplyr->realtime - hidetime*TICRATE;
// "Shadow! What are you doing? Hurry and get back here
// right now before the island blows up with you on it!"
// "Blows up??" *awkward silence* "I've got to get outta
// here and find Amy and Tails right away!"
else if (mapheaderinfo[gamemap-1]->countdown)
{
tics = countdowntimer;
downwards = true;
}
// Normal.
else
tics = stplyr->realtime;
}
minutes = G_TicsToMinutes(tics, true);
seconds = G_TicsToSeconds(tics);
tictrn = G_TicsToCentiseconds(tics);
}
// TIME:
ST_DrawPatchFromHud(HUD_TIME, ((downwards && (tics < 30*TICRATE) && (leveltime/5 & 1)) ? sboredtime : sbotime), V_HUDTRANS);
if (!tics && downwards && (leveltime/5 & 1)) // overtime!
return;
if (cv_timetic.value == 1) // Tics only -- how simple is this?
ST_DrawNumFromHud(HUD_SECONDS, tics, V_HUDTRANS);
else
@ -709,7 +787,7 @@ static void ST_drawLivesArea(void)
// Spectator
else if (stplyr->spectator)
{
V_DrawRightAlignedThinString(hudinfo[HUD_LIVES].x+58, hudinfo[HUD_LIVES].y+8, V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER, "SPECTATE");
//V_DrawRightAlignedThinString(hudinfo[HUD_LIVES].x+58, hudinfo[HUD_LIVES].y+8, V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER, "SPECTATOR");
v_colmap = V_GRAYMAP;
}
// Tag
@ -747,10 +825,19 @@ static void ST_drawLivesArea(void)
else
v_colmap = V_GRAYMAP;
}
else
else if (circuitmap)
{
V_DrawRightAlignedThinString(hudinfo[HUD_LIVES].x+58, hudinfo[HUD_LIVES].y+8, V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER, "PLAYING");
if (stplyr->exiting)
V_DrawRightAlignedThinString(hudinfo[HUD_LIVES].x+58, hudinfo[HUD_LIVES].y+8, V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER, "FINISHED");
//V_DrawString(hudinfo[HUD_LAP].x, hudinfo[HUD_LAP].y, hudinfo[HUD_LAP].f|V_YELLOWMAP, "FINISHED!");
else
{
V_DrawRightAlignedString(hudinfo[HUD_LIVES].x+58, hudinfo[HUD_LIVES].y+8, V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER, va("%u/%d", stplyr->laps+1, cv_numlaps.value));
//V_DrawString(hudinfo[HUD_LAP].x, hudinfo[HUD_LAP].y, hudinfo[HUD_LAP].f, va("Lap: %u/%d", stplyr->laps+1, cv_numlaps.value));
}
}
/*else
V_DrawRightAlignedThinString(hudinfo[HUD_LIVES].x+58, hudinfo[HUD_LIVES].y+8, V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER, "PLAYING");*/
// name
v_colmap |= (V_HUDTRANS|hudinfo[HUD_LIVES].f|V_PERPLAYER);
@ -1647,92 +1734,34 @@ static void ST_drawMatchHUD(void)
static inline void ST_drawRaceHUD(void)
{
if (leveltime >= TICRATE && leveltime < 5*TICRATE)
{
INT32 height = ((3*BASEVIDHEIGHT)>>2) - 8;
INT32 bounce = (leveltime % TICRATE);
patch_t *racenum;
switch (leveltime/TICRATE)
{
case 1:
racenum = race3;
break;
case 2:
racenum = race2;
break;
case 3:
racenum = race1;
break;
default:
racenum = racego;
break;
}
if (bounce < 3)
{
height -= (2 - bounce);
if (!(P_AutoPause() || paused) && !bounce)
S_StartSound(0, ((racenum == racego) ? sfx_s3kad : sfx_s3ka7));
}
V_DrawScaledPatch(((BASEVIDWIDTH - SHORT(racenum->width))/2), height, V_PERPLAYER, racenum);
}
if (circuitmap)
{
if (stplyr->exiting)
V_DrawString(hudinfo[HUD_LAP].x, hudinfo[HUD_LAP].y, hudinfo[HUD_LAP].f|V_YELLOWMAP, "FINISHED!");
else
V_DrawString(hudinfo[HUD_LAP].x, hudinfo[HUD_LAP].y, hudinfo[HUD_LAP].f, va("Lap: %u/%d", stplyr->laps+1, cv_numlaps.value));
}
if (leveltime > TICRATE && leveltime <= 5*TICRATE)
ST_drawRaceNum(4*TICRATE - leveltime);
}
static void ST_drawTagHUD(void)
{
char pstime[33] = "";
char pstext[33] = "";
// Figure out what we're going to print.
if (leveltime < hidetime * TICRATE) //during the hide time, the seeker and hiders have different messages on their HUD.
{
if (hidetime)
sprintf(pstime, "%d", (hidetime - leveltime/TICRATE)); //hide time is in seconds, not tics.
if (stplyr->pflags & PF_TAGIT && !stplyr->spectator)
sprintf(pstext, "%s", M_GetText("WAITING FOR PLAYERS TO HIDE..."));
else
{
if (!stplyr->spectator) //spectators get a generic HUD message rather than a gametype specific one.
{
if (gametype == GT_HIDEANDSEEK) //hide and seek.
sprintf(pstext, "%s", M_GetText("HIDE BEFORE TIME RUNS OUT!"));
else //default
sprintf(pstext, "%s", M_GetText("FLEE BEFORE YOU ARE HUNTED!"));
}
else
sprintf(pstext, "%s", M_GetText("HIDE TIME REMAINING:"));
}
}
else
{
if (cv_timelimit.value && timelimitintics >= leveltime)
sprintf(pstime, "%d", (timelimitintics-leveltime)/TICRATE);
if (stplyr->pflags & PF_TAGIT)
sprintf(pstext, "%s", M_GetText("YOU'RE IT!"));
else
{
if (cv_timelimit.value)
sprintf(pstext, "%s", M_GetText("TIME REMAINING:"));
else //Since having no hud message in tag is not characteristic:
sprintf(pstext, "%s", M_GetText("NO TIME LIMIT"));
}
sprintf(pstext, "%s", M_GetText("Waiting for players to hide..."));
else if (gametype == GT_HIDEANDSEEK) //hide and seek.
sprintf(pstext, "%s", M_GetText("Hide before time runs out!"));
else //default
sprintf(pstext, "%s", M_GetText("Flee before you are hunted!"));
}
else if (gametype == GT_HIDEANDSEEK && !(stplyr->pflags & PF_TAGIT))
{
sprintf(pstext, "%s", M_GetText("You cannot move while hiding."));
if (!splitscreen)
V_DrawCenteredString(BASEVIDWIDTH/2, 132, 0, M_GetText("Press F12 to watch another player."));
}
// Print the stuff.
if (pstext[0])
V_DrawCenteredString(BASEVIDWIDTH/2, 168, V_PERPLAYER|V_SNAPTOBOTTOM, pstext);
if (pstime[0])
V_DrawCenteredString(BASEVIDWIDTH/2, 184, V_PERPLAYER|V_SNAPTOBOTTOM, pstime);
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER, pstext);
}
static void ST_drawCTFHUD(void)
@ -2010,8 +2039,24 @@ static void ST_overlayDrawer(void)
if (!hu_showscores) // hide the following if TAB is held
{
// Countdown timer for Race Mode
if (countdown)
V_DrawCenteredString(BASEVIDWIDTH/2, 176, V_PERPLAYER, va("%d", countdown/TICRATE));
if (countdown > 1)
{
tic_t time = countdown/TICRATE + 1;
if (time < 4)
ST_drawRaceNum(countdown);
else
{
tic_t num = time;
INT32 sz = SHORT(tallnum[0]->width)/2, width = 0;
do
{
width += sz;
num /= 10;
} while (num);
V_DrawTallNum((BASEVIDWIDTH/2) + width, ((3*BASEVIDHEIGHT)>>2) - 7, V_PERPLAYER, time);
//V_DrawCenteredString(BASEVIDWIDTH/2, 176, V_PERPLAYER, va("%d", countdown/TICRATE + 1));
}
}
// If you are in overtime, put a big honkin' flashin' message on the screen.
if (G_RingSlingerGametype() && cv_overtime.value
@ -2032,7 +2077,7 @@ static void ST_overlayDrawer(void)
if (gametype == GT_RACE || gametype == GT_COMPETITION)
ST_drawRaceHUD();
// Tag HUD Stuff
else if (gametype == GT_TAG || gametype == GT_HIDEANDSEEK)
else if ((gametype == GT_TAG || gametype == GT_HIDEANDSEEK) && (!stplyr->spectator))
ST_drawTagHUD();
// CTF HUD Stuff
else if (gametype == GT_CTF)
@ -2118,20 +2163,13 @@ static void ST_overlayDrawer(void)
}
else if (!splitscreen && gametype != GT_COOP && (stplyr->exiting || (G_GametypeUsesLives() && stplyr->lives <= 0 && countdown != 1)))
V_DrawCenteredString(BASEVIDWIDTH/2, 132, 0, M_GetText("Press F12 to watch another player."));
else if (gametype == GT_HIDEANDSEEK &&
(!stplyr->spectator && !(stplyr->pflags & PF_TAGIT)) && (leveltime > hidetime * TICRATE))
{
V_DrawCenteredString(BASEVIDWIDTH/2, 116, V_PERPLAYER, M_GetText("You cannot move while hiding."));
if (!splitscreen)
V_DrawCenteredString(BASEVIDWIDTH/2, 132, 0, M_GetText("Press F12 to watch another player."));
}
else if (!G_PlatformGametype() && stplyr->playerstate == PST_DEAD && stplyr->lives) //Death overrides spectator text.
{
INT32 respawntime = cv_respawntime.value - stplyr->deadtimer/TICRATE;
if (respawntime > 0 && !stplyr->spectator)
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_PERPLAYER|V_HUDTRANSHALF, va(M_GetText("Respawn in: %d second%s."), respawntime, respawntime == 1 ? "" : "s"));
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER|V_HUDTRANSHALF, va(M_GetText("Respawn in %d..."), respawntime));
else
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Jump to respawn."));
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Jump to respawn."));
}
else if (stplyr->spectator && (gametype != GT_COOP || stplyr->playerstate == PST_LIVE)
#ifdef HAVE_BLUA
@ -2141,9 +2179,9 @@ static void ST_overlayDrawer(void)
{
V_DrawCenteredString(BASEVIDWIDTH/2, 60, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("You are a spectator."));
if (G_GametypeHasTeams())
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Fire to be assigned to a team."));
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Fire to be assigned to a team."));
else if (G_IsSpecialStage(gamemap) && useNightsSS)
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("You cannot play until the stage has ended."));
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("You cannot play until the stage has ended."));
else if (gametype == GT_COOP && stplyr->lives <= 0)
{
if (cv_cooplives.value == 2
@ -2163,13 +2201,13 @@ static void ST_overlayDrawer(void)
}
if (i != MAXPLAYERS)
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("You'll steal a life on respawn."));
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("You'll steal a life on respawn."));
}
}
else if (gametype != GT_COOP)
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Fire to enter the game."));
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Fire to enter the game."));
if (!splitscreen)
V_DrawCenteredString(BASEVIDWIDTH/2, 164, V_HUDTRANSHALF, M_GetText("Press F12 to watch another player."));
V_DrawCenteredString(BASEVIDWIDTH/2, 132, V_HUDTRANSHALF, M_GetText("Press F12 to watch another player."));
V_DrawCenteredString(BASEVIDWIDTH/2, 148, V_PERPLAYER|V_HUDTRANSHALF, M_GetText("Press Jump to float and Spin to sink."));
}
}

View File

@ -102,7 +102,6 @@ typedef enum
HUD_TIMEUP,
HUD_HUNTPICS,
HUD_GRAVBOOTSICO,
HUD_LAP,
NUMHUDITEMS
} hudnum_t;