mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-10-30 08:01:28 +00:00
Chengi's new position numbers
This commit is contained in:
parent
e8a6aa7540
commit
0233c26386
5 changed files with 179 additions and 126 deletions
|
|
@ -412,7 +412,7 @@ typedef struct player_s
|
|||
// Basic gameplay things
|
||||
UINT8 position; // Used for Kart positions, mostly for deterministic stuff
|
||||
UINT8 oldposition; // Used for taunting when you pass someone
|
||||
UINT8 positiondelay; // Used for position number, so it can grow when passing/being passed
|
||||
UINT8 positiondelay; // Used for position number, so it can grow when passing
|
||||
UINT32 distancetofinish;
|
||||
waypoint_t *nextwaypoint;
|
||||
respawnvars_t respawn; // Respawn info
|
||||
|
|
|
|||
|
|
@ -398,6 +398,19 @@ typedef enum
|
|||
SKINCOLOR_CHAOSEMERALD7,
|
||||
|
||||
SKINCOLOR_INVINCFLASH,
|
||||
SKINCOLOR_POSNUM,
|
||||
SKINCOLOR_POSNUM_WIN1,
|
||||
SKINCOLOR_POSNUM_WIN2,
|
||||
SKINCOLOR_POSNUM_WIN3,
|
||||
SKINCOLOR_POSNUM_LOSE1,
|
||||
SKINCOLOR_POSNUM_LOSE2,
|
||||
SKINCOLOR_POSNUM_LOSE3,
|
||||
SKINCOLOR_POSNUM_BEST1,
|
||||
SKINCOLOR_POSNUM_BEST2,
|
||||
SKINCOLOR_POSNUM_BEST3,
|
||||
SKINCOLOR_POSNUM_BEST4,
|
||||
SKINCOLOR_POSNUM_BEST5,
|
||||
SKINCOLOR_POSNUM_BEST6,
|
||||
|
||||
SKINCOLOR_FIRSTFREESLOT,
|
||||
SKINCOLOR_LASTFREESLOT = SKINCOLOR_FIRSTFREESLOT + NUMCOLORFREESLOTS - 1,
|
||||
|
|
|
|||
16
src/info.c
16
src/info.c
|
|
@ -29126,7 +29126,21 @@ skincolor_t skincolors[MAXSKINCOLORS] = {
|
|||
{"Chaos Emerald 6", { 0, 208, 50, 32, 34, 37, 40, 44, 0, 0, 0, 0, 0, 0, 0, 0}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_CHAOSEMERALD6
|
||||
{"Chaos Emerald 7", { 0, 120, 121, 140, 133, 135, 149, 156, 0, 0, 0, 0, 0, 0, 0, 0}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_CHAOSEMERALD7
|
||||
|
||||
{"Invinc Flash", { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, SKINCOLOR_NONE, 0, 0, false} // SKINCOLOR_INVINCFLASH
|
||||
{"Invinc Flash", { 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_INVINCFLASH
|
||||
|
||||
{"Position", { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM
|
||||
{"Position Win 1", {152, 152, 153, 154, 155, 156, 157, 157, 158, 158, 159, 159, 253, 253, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_WIN1
|
||||
{"Position Win 2", {135, 135, 135, 136, 136, 136, 137, 137, 137, 138, 138, 139, 139, 254, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_WIN2
|
||||
{"Position Win 3", {255, 255, 122, 123, 141, 141, 142, 142, 143, 143, 138, 138, 139, 139, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_WIN3
|
||||
{"Position Lose 1", { 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 71, 46, 47, 47, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_LOSE1
|
||||
{"Position Lose 2", { 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 44, 45, 71, 46, 47, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_LOSE2
|
||||
{"Position Lose 3", { 73, 74, 75, 76, 76, 77, 77, 78, 78, 79, 79, 236, 237, 238, 239, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_LOSE3
|
||||
{"Position Best 1", { 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 71, 46, 47, 47, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST1
|
||||
{"Position Best 2", { 73, 74, 75, 76, 76, 77, 77, 78, 78, 79, 79, 236, 237, 238, 239, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST2
|
||||
{"Position Best 3", {112, 112, 113, 114, 115, 115, 116, 116, 117, 117, 118, 118, 119, 110, 111, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST3
|
||||
{"Position Best 4", {255, 255, 122, 123, 141, 141, 142, 142, 143, 143, 138, 138, 139, 139, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST4
|
||||
{"Position Best 5", {152, 152, 153, 154, 155, 156, 157, 157, 158, 158, 159, 159, 253, 253, 254, 30}, SKINCOLOR_NONE, 0, 0, false}, // SKINCOLOR_POSNUM_BEST5
|
||||
{"Position Best 6", {181, 181, 182, 182, 183, 183, 184, 184, 185, 185, 186, 186, 187, 187, 29, 30}, SKINCOLOR_NONE, 0, 0, false} // SKINCOLOR_POSNUM_BEST6
|
||||
};
|
||||
|
||||
/** Patches the mobjinfo, state, and skincolor tables.
|
||||
|
|
|
|||
270
src/k_hud.c
270
src/k_hud.c
|
|
@ -37,10 +37,6 @@
|
|||
#include "r_fps.h"
|
||||
#include "m_random.h"
|
||||
|
||||
#define NUMPOSNUMS 10
|
||||
#define NUMPOSFRAMES 7 // White, three blues, three reds
|
||||
#define NUMWINFRAMES 6 // Red, yellow, green, cyan, blue, purple
|
||||
|
||||
//{ Patch Definitions
|
||||
static patch_t *kp_nodraw;
|
||||
|
||||
|
|
@ -70,8 +66,7 @@ static patch_t *kp_startcountdown[20];
|
|||
static patch_t *kp_racefault[6];
|
||||
static patch_t *kp_racefinish[6];
|
||||
|
||||
static patch_t *kp_positionnum[NUMPOSNUMS][NUMPOSFRAMES];
|
||||
static patch_t *kp_winnernum[NUMPOSFRAMES];
|
||||
static patch_t *kp_positionnum[10][2][2]; // number, overlay or underlay, splitscreen
|
||||
|
||||
static patch_t *kp_facenum[MAXPLAYERS+1];
|
||||
static patch_t *kp_facehighlight[8];
|
||||
|
|
@ -179,7 +174,7 @@ static patch_t *kp_trickcool[2];
|
|||
|
||||
void K_LoadKartHUDGraphics(void)
|
||||
{
|
||||
INT32 i, j;
|
||||
INT32 i, j, k;
|
||||
char buffer[9];
|
||||
|
||||
// Null Stuff
|
||||
|
|
@ -280,23 +275,29 @@ void K_LoadKartHUDGraphics(void)
|
|||
HU_UpdatePatch(&kp_racefinish[5], "K_2PFINB");
|
||||
|
||||
// Position numbers
|
||||
sprintf(buffer, "K_POSNxx");
|
||||
for (i = 0; i < NUMPOSNUMS; i++)
|
||||
sprintf(buffer, "KRNKxyz");
|
||||
for (i = 0; i < 10; i++)
|
||||
{
|
||||
buffer[6] = '0'+i;
|
||||
for (j = 0; j < NUMPOSFRAMES; j++)
|
||||
{
|
||||
//sprintf(buffer, "K_POSN%d%d", i, j);
|
||||
buffer[7] = '0'+j;
|
||||
HU_UpdatePatch(&kp_positionnum[i][j], "%s", buffer);
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(buffer, "K_POSNWx");
|
||||
for (i = 0; i < NUMWINFRAMES; i++)
|
||||
{
|
||||
buffer[7] = '0'+i;
|
||||
HU_UpdatePatch(&kp_winnernum[i], "%s", buffer);
|
||||
for (j = 0; j < 2; j++)
|
||||
{
|
||||
buffer[5] = 'A'+j;
|
||||
|
||||
for (k = 0; k < 2; k++)
|
||||
{
|
||||
if (k > 0)
|
||||
{
|
||||
buffer[4] = 'S';
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer[4] = 'B';
|
||||
}
|
||||
|
||||
HU_UpdatePatch(&kp_positionnum[i][j][k], "%s", buffer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(buffer, "OPPRNKxx");
|
||||
|
|
@ -1545,146 +1546,169 @@ bademblem:
|
|||
}
|
||||
}
|
||||
|
||||
static void K_DrawKartPositionNum(INT32 num)
|
||||
static fixed_t K_DrawKartPositionNumPatch(UINT8 num, UINT8 *color, fixed_t x, fixed_t y, fixed_t scale, INT32 flags)
|
||||
{
|
||||
// POSI_X = BASEVIDWIDTH - 51; // 269
|
||||
// POSI_Y = BASEVIDHEIGHT- 64; // 136
|
||||
UINT8 splitIndex = (r_splitscreen > 0) ? 1 : 0;
|
||||
fixed_t w = FRACUNIT;
|
||||
fixed_t h = FRACUNIT;
|
||||
INT32 overlayFlags[2];
|
||||
INT32 i;
|
||||
|
||||
boolean win = (stplyr->exiting && num == 1);
|
||||
//INT32 X = POSI_X;
|
||||
INT32 W = SHORT(kp_positionnum[0][0]->width);
|
||||
fixed_t scale = FRACUNIT;
|
||||
patch_t *localpatch = kp_positionnum[0][0];
|
||||
INT32 fx = 0, fy = 0, fflags = 0;
|
||||
INT32 addOrSub = V_ADD;
|
||||
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 overtake = false;
|
||||
if (num >= 10)
|
||||
{
|
||||
return x; // invalid input
|
||||
}
|
||||
|
||||
if ((mapheaderinfo[gamemap - 1]->levelflags & LF_SUBTRACTNUM) == LF_SUBTRACTNUM)
|
||||
{
|
||||
addOrSub = V_SUBTRACT;
|
||||
overlayFlags[0] = V_SUBTRACT;
|
||||
overlayFlags[1] = V_ADD;
|
||||
}
|
||||
else
|
||||
{
|
||||
overlayFlags[0] = V_ADD;
|
||||
overlayFlags[1] = V_SUBTRACT;
|
||||
}
|
||||
|
||||
w = kp_positionnum[num][0][splitIndex]->width * scale;
|
||||
h = kp_positionnum[num][0][splitIndex]->height * scale;
|
||||
|
||||
if (flags & V_SNAPTORIGHT)
|
||||
{
|
||||
x -= w;
|
||||
}
|
||||
|
||||
if (flags & V_SNAPTOBOTTOM)
|
||||
{
|
||||
y -= h;
|
||||
}
|
||||
|
||||
for (i = 1; i >= 0; i--)
|
||||
{
|
||||
V_DrawFixedPatch(
|
||||
x, y, scale,
|
||||
flags | overlayFlags[i],
|
||||
kp_positionnum[num][i][splitIndex],
|
||||
color
|
||||
);
|
||||
}
|
||||
|
||||
return (x - w);
|
||||
}
|
||||
|
||||
static void K_DrawKartPositionNum(INT32 num)
|
||||
{
|
||||
const tic_t counter = (leveltime / 3); // Alternate colors every three frames
|
||||
fixed_t scale = FRACUNIT;
|
||||
fixed_t fx = 0, fy = 0;
|
||||
INT32 fflags = 0;
|
||||
UINT8 *color = NULL;
|
||||
|
||||
if (stplyr->positiondelay || stplyr->exiting)
|
||||
{
|
||||
scale *= 2;
|
||||
overtake = true; // this is used for splitscreen stuff in conjunction with flipdraw.
|
||||
}
|
||||
|
||||
if (r_splitscreen)
|
||||
{
|
||||
scale /= 2;
|
||||
}
|
||||
|
||||
W = FixedMul(W<<FRACBITS, scale)>>FRACBITS;
|
||||
|
||||
// pain and suffering defined below
|
||||
if (!r_splitscreen)
|
||||
{
|
||||
fx = POSI_X;
|
||||
fy = BASEVIDHEIGHT - 8;
|
||||
fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN;
|
||||
fx = BASEVIDWIDTH << FRACBITS;
|
||||
fy = BASEVIDHEIGHT << FRACBITS;
|
||||
fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
else if (r_splitscreen == 1) // for this splitscreen, we'll use case by case because it's a bit different.
|
||||
{
|
||||
fx = POSI_X;
|
||||
if (stplyr == &players[displayplayers[0]]) // for player 1: display this at the top right, above the minimap.
|
||||
fx = BASEVIDWIDTH << FRACBITS;
|
||||
|
||||
if (stplyr == &players[displayplayers[0]])
|
||||
{
|
||||
fy = 30;
|
||||
fflags = V_SNAPTOTOP|V_SNAPTORIGHT|V_SPLITSCREEN;
|
||||
if (overtake)
|
||||
flipvdraw = true; // make sure overtaking doesn't explode us
|
||||
// for player 1: display this at the top right, above the minimap.
|
||||
fy = 0;
|
||||
fflags = V_SNAPTOTOP|V_SNAPTORIGHT;
|
||||
}
|
||||
else // if we're not p1, that means we're p2. display this at the bottom right, below the minimap.
|
||||
else
|
||||
{
|
||||
fy = (BASEVIDHEIGHT/2) - 8;
|
||||
fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SPLITSCREEN;
|
||||
// if we're not p1, that means we're p2. display this at the bottom right, below the minimap.
|
||||
fy = BASEVIDHEIGHT << FRACBITS;
|
||||
fflags = V_SNAPTOBOTTOM|V_SNAPTORIGHT;
|
||||
}
|
||||
|
||||
fy >>= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
fy = BASEVIDHEIGHT << FRACBITS;
|
||||
|
||||
if (stplyr == &players[displayplayers[0]]
|
||||
|| stplyr == &players[displayplayers[2]])
|
||||
{
|
||||
// If we are P1 or P3...
|
||||
fx = 0;
|
||||
fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM;
|
||||
}
|
||||
else
|
||||
{
|
||||
// else, that means we're P2 or P4.
|
||||
fx = BASEVIDWIDTH << FRACBITS;
|
||||
fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM;
|
||||
}
|
||||
|
||||
fx >>= 1;
|
||||
fy >>= 1;
|
||||
}
|
||||
|
||||
if (stplyr->exiting && num == 1)
|
||||
{
|
||||
// 1st place winner? You get rainbows!!
|
||||
color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM_BEST1 + (counter % 6), GTC_CACHE);
|
||||
}
|
||||
else if (stplyr->laps >= numlaps || stplyr->exiting)
|
||||
{
|
||||
// On the final lap, or already won.
|
||||
boolean useRedNums = K_IsPlayerLosing(stplyr);
|
||||
|
||||
if ((mapheaderinfo[gamemap - 1]->levelflags & LF_SUBTRACTNUM) == LF_SUBTRACTNUM)
|
||||
{
|
||||
// Subtracting RED will look BLUE, and vice versa.
|
||||
useRedNums = !useRedNums;
|
||||
}
|
||||
|
||||
if (useRedNums == true)
|
||||
{
|
||||
color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM_LOSE1 + (counter % 3), GTC_CACHE);
|
||||
}
|
||||
else
|
||||
{
|
||||
color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM_WIN1 + (counter % 3), GTC_CACHE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
|
||||
{
|
||||
fx = POSI_X;
|
||||
fy = POSI_Y;
|
||||
fflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
|
||||
flipdraw = true;
|
||||
if (num && num >= 10)
|
||||
fx += W; // this seems dumb, but we need to do this in order for positions above 10 going off screen.
|
||||
}
|
||||
else // else, that means we're P2 or P4.
|
||||
{
|
||||
fx = POSI2_X;
|
||||
fy = POSI2_Y;
|
||||
fflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
|
||||
}
|
||||
color = R_GetTranslationColormap(TC_DEFAULT, SKINCOLOR_POSNUM, GTC_CACHE);
|
||||
}
|
||||
|
||||
// Special case for 0
|
||||
if (num <= 0)
|
||||
{
|
||||
V_DrawFixedPatch(fx<<FRACBITS, fy<<FRACBITS, scale, addOrSub|V_SLIDEIN|fflags, kp_positionnum[0][0], NULL);
|
||||
K_DrawKartPositionNumPatch(
|
||||
0, color,
|
||||
fx, fy, scale, V_SLIDEIN|V_SPLITSCREEN|fflags
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Draw the number
|
||||
while (num)
|
||||
{
|
||||
if (win) // 1st place winner? You get rainbows!!
|
||||
{
|
||||
localpatch = kp_winnernum[(leveltime % (NUMWINFRAMES*3)) / 3];
|
||||
}
|
||||
else if (stplyr->laps >= numlaps || stplyr->exiting) // Check for the final lap, or won
|
||||
{
|
||||
boolean useRedNums = K_IsPlayerLosing(stplyr);
|
||||
/*
|
||||
|
||||
*/
|
||||
|
||||
if (addOrSub == V_SUBTRACT)
|
||||
{
|
||||
// Subtracting RED will look BLUE, and vice versa.
|
||||
useRedNums = !useRedNums;
|
||||
}
|
||||
|
||||
// Alternate frame every three frames
|
||||
switch ((leveltime % 9) / 3)
|
||||
{
|
||||
case 0:
|
||||
if (useRedNums == true)
|
||||
localpatch = kp_positionnum[num % 10][4];
|
||||
else
|
||||
localpatch = kp_positionnum[num % 10][1];
|
||||
break;
|
||||
case 1:
|
||||
if (useRedNums == true)
|
||||
localpatch = kp_positionnum[num % 10][5];
|
||||
else
|
||||
localpatch = kp_positionnum[num % 10][2];
|
||||
break;
|
||||
case 2:
|
||||
if (useRedNums == true)
|
||||
localpatch = kp_positionnum[num % 10][6];
|
||||
else
|
||||
localpatch = kp_positionnum[num % 10][3];
|
||||
break;
|
||||
default:
|
||||
localpatch = kp_positionnum[num % 10][0];
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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, addOrSub|V_SLIDEIN|fflags, localpatch, NULL
|
||||
fx = K_DrawKartPositionNumPatch(
|
||||
(num % 10), color,
|
||||
fx, fy, scale, V_SLIDEIN|V_SPLITSCREEN|fflags
|
||||
);
|
||||
// ^ 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.
|
||||
|
||||
fx -= W;
|
||||
num /= 10;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9865,8 +9865,10 @@ void K_KartUpdatePosition(player_t *player)
|
|||
if (leveltime < starttime || oldposition == 0)
|
||||
oldposition = position;
|
||||
|
||||
if (oldposition != position) // Changed places?
|
||||
if (position < oldposition) // Changed places?
|
||||
{
|
||||
player->positiondelay = 10; // Position number growth
|
||||
}
|
||||
|
||||
/* except in FREE PLAY */
|
||||
if (player->curshield == KSHIELD_TOP &&
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue