Merge branch 'pos-hud-tweaks' into 'master'

Position number uses additive/subtractive

See merge request KartKrew/Kart!361
This commit is contained in:
Sal 2021-02-05 17:53:11 -05:00
commit 053ecf203f
3 changed files with 45 additions and 13 deletions

View file

@ -2031,6 +2031,13 @@ static void readlevelheader(MYFILE *f, INT32 num)
else else
mapheaderinfo[num-1]->levelflags &= ~LF_SECTIONRACE; mapheaderinfo[num-1]->levelflags &= ~LF_SECTIONRACE;
} }
else if (fastcmp(word, "SUBTRACTNUM"))
{
if (i || word2[0] == 'T' || word2[0] == 'Y')
mapheaderinfo[num-1]->levelflags |= LF_SUBTRACTNUM;
else
mapheaderinfo[num-1]->levelflags &= ~LF_SUBTRACTNUM;
}
// Individual triggers for menu flags // Individual triggers for menu flags
else if (fastcmp(word, "HIDDEN")) else if (fastcmp(word, "HIDDEN"))
@ -11282,6 +11289,7 @@ struct {
{"LF_SCRIPTISFILE",LF_SCRIPTISFILE}, {"LF_SCRIPTISFILE",LF_SCRIPTISFILE},
{"LF_NOZONE",LF_NOZONE}, {"LF_NOZONE",LF_NOZONE},
{"LF_SECTIONRACE",LF_SECTIONRACE}, {"LF_SECTIONRACE",LF_SECTIONRACE},
{"LF_SUBTRACTNUM",LF_SUBTRACTNUM},
// And map flags // And map flags
{"LF2_HIDEINMENU",LF2_HIDEINMENU}, {"LF2_HIDEINMENU",LF2_HIDEINMENU},
{"LF2_HIDEINSTATS",LF2_HIDEINSTATS}, {"LF2_HIDEINSTATS",LF2_HIDEINSTATS},

View file

@ -408,6 +408,7 @@ typedef struct
#define LF_SCRIPTISFILE (1<<0) ///< True if the script is a file, not a lump. #define LF_SCRIPTISFILE (1<<0) ///< True if the script is a file, not a lump.
#define LF_NOZONE (1<<1) ///< Don't include "ZONE" on level title #define LF_NOZONE (1<<1) ///< Don't include "ZONE" on level title
#define LF_SECTIONRACE (1<<2) ///< Section race level #define LF_SECTIONRACE (1<<2) ///< Section race level
#define LF_SUBTRACTNUM (1<<3) ///< Use subtractive position number (for bright levels)
#define LF2_HIDEINMENU (1<<0) ///< Hide in the multiplayer menu #define LF2_HIDEINMENU (1<<0) ///< Hide in the multiplayer menu
#define LF2_HIDEINSTATS (1<<1) ///< Hide in the statistics screen #define LF2_HIDEINSTATS (1<<1) ///< Hide in the statistics screen

View file

@ -1415,17 +1415,26 @@ static void K_DrawKartPositionNum(INT32 num)
fixed_t scale = FRACUNIT; fixed_t scale = FRACUNIT;
patch_t *localpatch = kp_positionnum[0][0]; patch_t *localpatch = kp_positionnum[0][0];
INT32 fx = 0, fy = 0, fflags = 0; INT32 fx = 0, fy = 0, fflags = 0;
INT32 addOrSub = V_ADDTRANS;
boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun. boolean flipdraw = false; // flip the order we draw it in for MORE splitscreen bs. fun.
boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen. boolean flipvdraw = false; // used only for 2p splitscreen so overtaking doesn't make 1P's position fly off the screen.
boolean overtake = false; boolean overtake = false;
if ((mapheaderinfo[gamemap - 1]->levelflags & LF_SUBTRACTNUM) == LF_SUBTRACTNUM)
{
addOrSub = V_SUBTRANS;
}
if (stplyr->kartstuff[k_positiondelay] || stplyr->exiting) if (stplyr->kartstuff[k_positiondelay] || stplyr->exiting)
{ {
scale *= 2; scale *= 2;
overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw. overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw.
} }
if (r_splitscreen) if (r_splitscreen)
{
scale /= 2; scale /= 2;
}
W = FixedMul(W<<FRACBITS, scale)>>FRACBITS; W = FixedMul(W<<FRACBITS, scale)>>FRACBITS;
@ -1472,38 +1481,46 @@ static void K_DrawKartPositionNum(INT32 num)
} }
// Special case for 0 // Special case for 0
if (!num) if (num <= 0)
{ {
V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, scale, V_HUDTRANSHALF|V_SLIDEIN|fflags, kp_positionnum[0][0], NULL); V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, scale, addOrSub|V_SLIDEIN|fflags, kp_positionnum[0][0], NULL);
return; return;
} }
I_Assert(num >= 0); // This function does not draw negative numbers
// Draw the number // Draw the number
while (num) while (num)
{ {
if (win) // 1st place winner? You get rainbows!! if (win) // 1st place winner? You get rainbows!!
{
localpatch = kp_winnernum[(leveltime % (NUMWINFRAMES*3)) / 3]; localpatch = kp_winnernum[(leveltime % (NUMWINFRAMES*3)) / 3];
}
else if (stplyr->laps >= cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won else if (stplyr->laps >= cv_numlaps.value || stplyr->exiting) // Check for the final lap, or won
{ {
// Alternate frame every three frames boolean useRedNums = K_IsPlayerLosing(stplyr);
switch (leveltime % 9)
if (addOrSub == V_SUBTRANS)
{ {
case 1: case 2: case 3: // Subtracting RED will look BLUE, and vice versa.
if (K_IsPlayerLosing(stplyr)) useRedNums = !useRedNums;
}
// Alternate frame every three frames
switch ((leveltime % 9) / 3)
{
case 0:
if (useRedNums == true)
localpatch = kp_positionnum[num % 10][4]; localpatch = kp_positionnum[num % 10][4];
else else
localpatch = kp_positionnum[num % 10][1]; localpatch = kp_positionnum[num % 10][1];
break; break;
case 4: case 5: case 6: case 1:
if (K_IsPlayerLosing(stplyr)) if (useRedNums == true)
localpatch = kp_positionnum[num % 10][5]; localpatch = kp_positionnum[num % 10][5];
else else
localpatch = kp_positionnum[num % 10][2]; localpatch = kp_positionnum[num % 10][2];
break; break;
case 7: case 8: case 9: case 2:
if (K_IsPlayerLosing(stplyr)) if (useRedNums == true)
localpatch = kp_positionnum[num % 10][6]; localpatch = kp_positionnum[num % 10][6];
else else
localpatch = kp_positionnum[num % 10][3]; localpatch = kp_positionnum[num % 10][3];
@ -1514,9 +1531,15 @@ static void K_DrawKartPositionNum(INT32 num)
} }
} }
else else
{
localpatch = kp_positionnum[num % 10][0]; localpatch = kp_positionnum[num % 10][0];
}
V_DrawFixedPatch((fx<<FRACBITS) + ((overtake && flipdraw) ? (SHORT(localpatch->width)*scale/2) : 0), (fy<<FRACBITS) + ((overtake && flipvdraw) ? (SHORT(localpatch->height)*scale/2) : 0), scale, V_HUDTRANSHALF|V_SLIDEIN|fflags, localpatch, NULL); V_DrawFixedPatch(
(fx<<FRACBITS) + ((overtake && flipdraw) ? (SHORT(localpatch->width)*scale/2) : 0),
(fy<<FRACBITS) + ((overtake && flipvdraw) ? (SHORT(localpatch->height)*scale/2) : 0),
scale, addOrSub|V_SLIDEIN|fflags, localpatch, NULL
);
// ^ if we overtake as p1 or p3 in splitscren, we shift it so that it doesn't go off screen. // ^ if we overtake as p1 or p3 in splitscren, we shift it so that it doesn't go off screen.
// ^ if we overtake as p1 in 2p splits, shift vertically so that this doesn't happen either. // ^ if we overtake as p1 in 2p splits, shift vertically so that this doesn't happen either.