Line meter fill animation for grade at the end of the race rounds in GP

TODO:
- Interpolation
- Sounds
This commit is contained in:
toaster 2023-05-08 23:58:24 +01:00
parent 6aea8859fe
commit 9fca550ab6

View file

@ -82,6 +82,8 @@ typedef struct
boolean gotthrough; // show "got through" boolean gotthrough; // show "got through"
boolean showrank; // show rank-restricted queue entry at the end, if it exists boolean showrank; // show rank-restricted queue entry at the end, if it exists
boolean encore; // encore mode boolean encore; // encore mode
tic_t linemeter; // For GP only
} y_data; } y_data;
static y_data data; static y_data data;
@ -234,16 +236,25 @@ static void Y_CalculateMatchData(UINT8 rankingsmode, void (*comparison)(INT32))
&& roundqueue.entries[roundqueue.size - 1].rankrestricted == true && roundqueue.entries[roundqueue.size - 1].rankrestricted == true
) )
{ {
if (roundqueue.position == roundqueue.size-1)
{
// On A rank pace? Then you get a chance for S rank!
gp_rank_e rankforline = K_CalculateGPGrade(&grandprixinfo.rank);
data.showrank = (rankforline >= GRADE_A);
data.linemeter =
(min(rankforline, GRADE_A)
* (2 * TICRATE)
) / GRADE_A;
}
if (gamedata->everseenspecial == true if (gamedata->everseenspecial == true
|| roundqueue.position == roundqueue.size) || roundqueue.position == roundqueue.size)
{ {
// Additional cases in which it should always be shown.
data.showrank = true; data.showrank = true;
} }
else if (roundqueue.position == roundqueue.size-1)
{
// On A rank pace? Then you get a chance for S rank!
data.showrank = (K_CalculateGPGrade(&grandprixinfo.rank) >= GRADE_A);
}
} }
} }
@ -434,7 +445,7 @@ void Y_IntermissionDrawer(void)
if (sorttic != -1 && intertic > sorttic) if (sorttic != -1 && intertic > sorttic)
{ {
INT32 count = (intertic - sorttic); const INT32 count = (intertic - sorttic);
if (count < 8) if (count < 8)
xoffset = -((count * vid.width) / (8 * vid.dupx)); xoffset = -((count * vid.width) / (8 * vid.dupx));
@ -842,6 +853,24 @@ skiptallydrawer:
playerx = x2; playerx = x2;
playery = y; playery = y;
} }
else if (roundqueue.position == roundqueue.size-1
&& timer <= 2*TICRATE)
{
const fixed_t percent = FixedDiv(
min(
data.linemeter,
((2*TICRATE) - (timer - 1))
) * FRACUNIT,
(2*TICRATE) * FRACUNIT
);
playerx = x +
FixedMul(
(x2 - x) * FRACUNIT,
percent
) / FRACUNIT;
playery = y;
}
// Special background bump // Special background bump
V_DrawMappedPatch(x2 - 13, 167, 0, queuebg_prize, greymap); V_DrawMappedPatch(x2 - 13, 167, 0, queuebg_prize, greymap);
@ -860,8 +889,8 @@ skiptallydrawer:
V_DrawMappedPatch( V_DrawMappedPatch(
xiter - 1, 179, xiter - 1, 179,
0, 0,
line_flat[roundqueue.position == roundqueue.size ? BPP_DONE : BPP_AHEAD], line_flat[(xiter < playerx) ? BPP_DONE : BPP_AHEAD],
roundqueue.position == roundqueue.size ? colormap : NULL (xiter < playerx) ? colormap : NULL
); );
xiter += 2; xiter += 2;
@ -906,7 +935,7 @@ skiptallydrawer:
); );
} }
if (roundqueue.position == i+1) if (roundqueue.position == i+1 && playery == 0)
{ {
playerx = x; playerx = x;
playery = y; playery = y;