Merge branch 'blankart-dev' into freecamspectate

This commit is contained in:
NepDisk 2025-04-01 13:21:58 -04:00
commit 408a64ab4b
15 changed files with 431 additions and 98 deletions

View file

@ -122,7 +122,7 @@ else()
CPMAddPackage(
NAME Ccache.cmake
GITHUB_REPOSITORY TheLartians/Ccache.cmake
VERSION 1.2
VERSION 1.2.5
)
endif()

View file

@ -81,7 +81,7 @@
#include <tracy/tracy/Tracy.hpp>
// Put hashes here to get them out of header hell.
#define ASSET_HASH_MAIN_PK3 "b50efab7ead2a6d9cbf16cbb2de9cc1c"
#define ASSET_HASH_MAIN_PK3 "f76e374630a96b59009ebdbc9e2a0364"
#define ASSET_HASH_SRB2_SRB "c1b9577687f8a795104aef4600720ea7"
#define ASSET_HASH_GFX_KART "06f86ee16136eb8a7043b15001797034"
#define ASSET_HASH_TEXTURES_KART "abb53d56aba47c3a8cb0f764da1c8b80"

View file

@ -153,6 +153,7 @@ static void KartEliminateLast_OnChange(void);
static void KartRings_OnChange(void);
static void KartStacking_OnChange(void);
static void KartChaining_OnChange(void);
static void KartSlipdash_OnChange(void);
static void KartItemBreaker_OnChange(void);
static void Schedule_OnChange(void);
@ -478,7 +479,7 @@ consvar_t cv_kartstacking_ring_accelboost = CVAR_INIT ("vanillaboost_ring_accelb
consvar_t cv_kartchaining = CVAR_INIT ("kartchaining", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartChaining_OnChange);
consvar_t cv_kartchainingoffroad = CVAR_INIT ("kartchaining_chainoffroad", "No", CV_NETVAR, CV_YesNo, NULL);
consvar_t cv_kartitembreaker = CVAR_INIT ("kartitembreaker", "No", CV_NETVAR|CV_CHEAT|CV_CALL|CV_NOINIT, CV_YesNo, KartItemBreaker_OnChange);
consvar_t cv_kartitembreaker = CVAR_INIT ("kartitembreaker", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartItemBreaker_OnChange);
consvar_t cv_kartwalltransfer = CVAR_INIT ("BG_forcewalltransfer", "Off", CV_NETVAR|CV_CHEAT, CV_OnOff, NULL);
@ -490,6 +491,8 @@ consvar_t cv_kartbumpspark = CVAR_INIT ("kartbumpspark", "No", CV_NETVAR, CV_Yes
consvar_t cv_kartbumpspring = CVAR_INIT ("kartbumpspring", "No", CV_NETVAR, CV_YesNo, NULL);
consvar_t cv_kartslipdash = CVAR_INIT ("kartslipdash", "No", CV_NETVAR|CV_CALL|CV_NOINIT, CV_YesNo, KartSlipdash_OnChange);
static CV_PossibleValue_t kartdebugitem_cons_t[] =
{
#define FOREACH( name, n ) { n, #name }
@ -7113,6 +7116,39 @@ static void KartChaining_OnChange(void)
}
}
static void KartSlipdash_OnChange(void)
{
if (K_CanChangeRules() == false)
{
return;
}
if (!slipdashactive && cv_kartslipdash.value)
{
if (leveltime < starttime)
{
slipdashactive = true;
CONS_Printf(M_GetText("Slipdashing has been turned \"On\".\n"));
}
else
{
CONS_Printf(M_GetText("Slipdashing will be turned \"On\" Next Round.\n"));
}
}
else if (slipdashactive && !cv_kartslipdash.value)
{
if (leveltime < starttime)
{
slipdashactive = false;
CONS_Printf(M_GetText("Slipdashing has been turned \"Off\".\n"));
}
else
{
CONS_Printf(M_GetText("Slipdashing will be turned \"Off\" next round.\n"));
}
}
}
static void KartItemBreaker_OnChange(void)
{
if (K_CanChangeRules() == false)

View file

@ -157,8 +157,8 @@ extern consvar_t cv_kartitembreaker;
extern consvar_t cv_kartwalltransfer;
extern consvar_t cv_kartpurpledrift;
extern consvar_t cv_kartbumpspark;
extern consvar_t cv_kartbumpspring;
extern consvar_t cv_kartslipdash;
extern consvar_t cv_votetime;

View file

@ -575,6 +575,8 @@ struct player_t
SINT8 aizdriftstrat; // (-1 to 1) - Let go of your drift while boosting? Helper for the SICK STRATZ (sliptiding!) you have just unlocked
INT32 aizdrifttilt;
INT32 aizdriftturn;
fixed_t slipdashcharge; // charge up a dash with a sliptide!
SINT8 slipdashdir; // no snaking allowed :^)
fixed_t offroad; // In Super Mario Kart, going offroad has lee-way of about 1 second before you start losing speed
UINT8 pogospring; // Pogo spring bounce effect

View file

@ -3256,7 +3256,7 @@ void G_DoPlayDemo(char *defdemoname)
if (!playeringame[displayplayers[0]] || players[displayplayers[0]].spectator)
displayplayers[0] = consoleplayer = serverplayer = p;
playeringame[p] = true;
G_AddPlayer(p, p);
players[p].spectator = spectator;
if (flags & DEMO_KICKSTART)

View file

@ -44,6 +44,34 @@
#define NUMPOSFRAMES 7 // White, three blues, three reds
#define NUMWINFRAMES 6 // Red, yellow, green, cyan, blue, purple
// Hud offset cvars
#define IMPL_HUD_OFFSET_X(name)\
consvar_t cv_##name##_xoffset = CVAR_INIT ("hud_" #name "_xoffset", "0", CV_SAVE, CV_Signed, NULL);
#define IMPL_HUD_OFFSET_Y(name)\
consvar_t cv_##name##_yoffset = CVAR_INIT ("hud_" #name "_yoffset", "0", CV_SAVE, CV_Signed, NULL);
#define IMPL_HUD_OFFSET(name)\
IMPL_HUD_OFFSET_X(name)\
IMPL_HUD_OFFSET_Y(name)
IMPL_HUD_OFFSET(item); // Item box
IMPL_HUD_OFFSET(time); // Time
IMPL_HUD_OFFSET(laps); // Number of laps
IMPL_HUD_OFFSET(rings); // Number of laps
IMPL_HUD_OFFSET(dnft); // Countdown (did not finish timer)
IMPL_HUD_OFFSET(speed); // Speedometer
IMPL_HUD_OFFSET(posi); // Position in race
IMPL_HUD_OFFSET(face); // Mini rankings
IMPL_HUD_OFFSET(stcd); // Starting countdown
IMPL_HUD_OFFSET_Y(chek); // Check gfx
IMPL_HUD_OFFSET(mini); // Minimap
IMPL_HUD_OFFSET(want); // Wanted
//IMPL_HUD_OFFSET(stat); // Stats
#undef IMPL_HUD_OFFSET
#undef IMPL_HUD_OFFSET_X
#undef IMPL_HUD_OFFSET_Y
static CV_PossibleValue_t speedo_cons_t[]= {
{0, "Default"},
@ -52,7 +80,7 @@ static CV_PossibleValue_t speedo_cons_t[]= {
{0, NULL}};
consvar_t cv_newspeedometer = CVAR_INIT ("newspeedometer", "Default", CV_SAVE, speedo_cons_t, NULL);
static CV_PossibleValue_t inputdisplay_cons_t[] = {{0, "Off"}, {1, "Wheel"}, {2, "Stick"}, {0, NULL}};
static CV_PossibleValue_t inputdisplay_cons_t[] = {{0, "Off"}, {1, "Wheel"}, {2, "Stick"}, {3, "SRB2"}, {0, NULL}};
consvar_t cv_showinput = CVAR_INIT ("showinput", "Off", CV_SAVE, inputdisplay_cons_t, NULL);
@ -62,6 +90,8 @@ static patch_t *kp_nodraw;
static patch_t *kp_timesticker;
static patch_t *kp_timestickerwide;
static patch_t *kp_lapsticker;
static patch_t *kp_lapstickerbig;
static patch_t *kp_lapstickerbig2;
static patch_t *kp_lapstickerwide;
static patch_t *kp_lapstickernarrow;
static patch_t *kp_splitlapflag;
@ -156,6 +186,46 @@ static patch_t *kp_yougotem;
static patch_t *kp_bossbar[8];
static patch_t *kp_bossret[4];
static patch_t *joybacking;
static patch_t *joyknob;
static patch_t *joyshadow;
void K_RegisterKartHUDStuff(void)
{
#define REG_HUD_OFFSET_X(name)\
CV_RegisterVar(&cv_##name##_xoffset);
#define REG_HUD_OFFSET_Y(name)\
CV_RegisterVar(&cv_##name##_yoffset);
#define REG_HUD_OFFSET(name)\
REG_HUD_OFFSET_X(name)\
REG_HUD_OFFSET_Y(name)
REG_HUD_OFFSET(item); // Item box
REG_HUD_OFFSET(time); // Time
REG_HUD_OFFSET(laps); // Number of laps
REG_HUD_OFFSET(rings); // Number of laps
REG_HUD_OFFSET(dnft); // Countdown (did not finish timer)
REG_HUD_OFFSET(speed); // Speedometer
REG_HUD_OFFSET(posi); // Position in race
REG_HUD_OFFSET(face); // Mini rankings
REG_HUD_OFFSET(stcd); // Starting countdown
REG_HUD_OFFSET_Y(chek); // Check gfx
REG_HUD_OFFSET(mini); // Minimap
REG_HUD_OFFSET(want); // Wanted
//REG_HUD_OFFSET(stat); // Stats
#undef REG_HUD_OFFSET
#undef REG_HUD_OFFSET_X
#undef REG_HUD_OFFSET_Y
CV_RegisterVar(&cv_newspeedometer);
CV_RegisterVar(&cv_showinput);
}
void K_LoadKartHUDGraphics(void)
{
INT32 i, j;
@ -168,6 +238,8 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_timesticker, "K_STTIME");
HU_UpdatePatch(&kp_timestickerwide, "K_STTIMW");
HU_UpdatePatch(&kp_lapsticker, "K_STLAPS");
HU_UpdatePatch(&kp_lapstickerbig, "K_STLAPB");
HU_UpdatePatch(&kp_lapstickerbig2, "K_STLA2B");
HU_UpdatePatch(&kp_lapstickerwide, "K_STLAPW");
HU_UpdatePatch(&kp_lapstickernarrow, "K_STLAPN");
HU_UpdatePatch(&kp_splitlapflag, "K_SPTLAP");
@ -188,6 +260,7 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_startcountdown[7], "K_CNT1B");
HU_UpdatePatch(&kp_startcountdown[8], "K_CNTGOB");
HU_UpdatePatch(&kp_startcountdown[9], "K_DUEL2");
// Splitscreen
HU_UpdatePatch(&kp_startcountdown[10], "K_SMC3A");
HU_UpdatePatch(&kp_startcountdown[11], "K_SMC2A");
@ -400,6 +473,11 @@ void K_LoadKartHUDGraphics(void)
HU_UpdatePatch(&kp_fpview[1], "VIEWB0D0");
HU_UpdatePatch(&kp_fpview[2], "VIEWC0E0");
// Input UI Stick
HU_UpdatePatch(&joybacking, "JOYBCK");
HU_UpdatePatch(&joyknob, "JOYKNB");
HU_UpdatePatch(&joyshadow, "JOYSHD");
// Input UI Wheel
sprintf(buffer, "K_WHEELx");
for (i = 0; i < 5; i++)
@ -580,6 +658,8 @@ static patch_t *K_GetCachedItemPatch(INT32 item, UINT8 offset)
INT32 ITEM_X, ITEM_Y; // Item Window
INT32 TIME_X, TIME_Y; // Time Sticker
INT32 LAPS_X, LAPS_Y; // Lap Sticker
INT32 RING_X, RING_Y; // Player Rings
INT32 SPDM_X, SPDM_Y; // Speedometer
INT32 POSI_X, POSI_Y; // Position Number
INT32 FACE_X, FACE_Y; // Top-four Faces
INT32 STCD_X, STCD_Y; // Starting countdown
@ -590,8 +670,24 @@ INT32 WANT_X, WANT_Y; // Battle WANTED poster
// This is for the P2 and P4 side of splitscreen. Then we'll flip P1's and P2's to the bottom with V_SPLITSCREEN.
INT32 ITEM2_X, ITEM2_Y;
INT32 LAPS2_X, LAPS2_Y;
INT32 RING2_X, RING2_Y;
INT32 POSI2_X, POSI2_Y;
UINT8 K_GetHudColor(void)
{
//if (cv_colorizedhud.value && cv_colorizedhudcolor.value) return cv_colorizedhudcolor.value;
return ((stplyr && gamestate == GS_LEVEL) ? stplyr->skincolor : cv_playercolor[0].value);
}
static boolean K_BigLapSticker(void)
{
//if (K_UseColorHud())
//return ((cv_numlaps.value > 9) && (!stplyr->exiting));
//else
return ((cv_numlaps.value > 9) && (!stplyr->exiting));
}
// This version of the function was prototyped in Lua by Nev3r ... a HUGE thank you goes out to them!
void K_ObjectTracking(trackingResult_t *result, vector3_t *point, boolean reverse)
{
@ -755,31 +851,37 @@ static void K_initKartHUD(void)
// Single Screen (defaults)
// Item Window
ITEM_X = 5; // 5
ITEM_Y = 5; // 5
ITEM_X = 5 + cv_item_xoffset.value; // 5
ITEM_Y = 5 + cv_item_yoffset.value; // 5
// Level Timer
TIME_X = BASEVIDWIDTH - 148; // 172
TIME_Y = 9; // 9
TIME_X = BASEVIDWIDTH - 148 + cv_time_xoffset.value; // 172
TIME_Y = 9 + cv_time_yoffset.value; // 9
// Level Laps
LAPS_X = 9; // 9
LAPS_Y = BASEVIDHEIGHT - 29; // 171
LAPS_X = 9 + cv_laps_xoffset.value; // 9
LAPS_Y = BASEVIDHEIGHT - 29 + cv_laps_yoffset.value; // 171
// Player Rings
RING_X = 9 + cv_rings_xoffset.value; // 9
RING_Y = BASEVIDHEIGHT - 29 + cv_rings_yoffset.value; // 171
// Speedometer
SPDM_X = 9 + cv_speed_xoffset.value; // 9
SPDM_Y = BASEVIDHEIGHT - 29 + cv_speed_yoffset.value; // 171
// Position Number
POSI_X = BASEVIDWIDTH - 9; // 268
POSI_Y = BASEVIDHEIGHT - 9; // 138
POSI_X = BASEVIDWIDTH - 9 + cv_posi_xoffset.value; // 268
POSI_Y = BASEVIDHEIGHT - 9 + cv_posi_yoffset.value; // 138
// Top-Four Faces
FACE_X = 9; // 9
FACE_Y = 92; // 92
FACE_X = 9 + cv_face_xoffset.value; // 9
FACE_Y = 92 + cv_face_yoffset.value; // 92
// Starting countdown
STCD_X = BASEVIDWIDTH/2; // 9
STCD_Y = BASEVIDHEIGHT/2; // 92
STCD_X = BASEVIDWIDTH/2 + cv_stcd_xoffset.value; // 9
STCD_Y = BASEVIDHEIGHT/2 + cv_stcd_yoffset.value; // 92
// CHECK graphic
CHEK_Y = BASEVIDHEIGHT; // 200
CHEK_Y = BASEVIDHEIGHT + cv_chek_yoffset.value; // 200
// Minimap
MINI_X = BASEVIDWIDTH - 50; // 270
MINI_Y = (BASEVIDHEIGHT/2)-16; // 84
MINI_X = BASEVIDWIDTH - 50 + cv_mini_xoffset.value; // 270
MINI_Y = (BASEVIDHEIGHT/2)-16 + cv_mini_yoffset.value; // 84
// Battle WANTED poster
WANT_X = BASEVIDWIDTH - 55; // 270
WANT_Y = BASEVIDHEIGHT- 71; // 176
WANT_X = BASEVIDWIDTH - 55 + cv_want_xoffset.value; // 270
WANT_Y = BASEVIDHEIGHT- 71 + cv_want_yoffset.value; // 176
if (r_splitscreen) // Splitscreen
{
@ -788,6 +890,10 @@ static void K_initKartHUD(void)
LAPS_Y = (BASEVIDHEIGHT/2)-24;
RING_Y = (BASEVIDHEIGHT/2)-24;
SPDM_Y = (BASEVIDHEIGHT/2)-24;
POSI_Y = (BASEVIDHEIGHT/2)- 2;
STCD_Y = BASEVIDHEIGHT/4;
@ -803,6 +909,9 @@ static void K_initKartHUD(void)
LAPS_X = 3;
LAPS_Y = (BASEVIDHEIGHT/2)-12;
RING_X = 3;
RING_Y = (BASEVIDHEIGHT/2)-12;
POSI_X = 24;
POSI_Y = (BASEVIDHEIGHT/2)-26;
@ -813,6 +922,9 @@ static void K_initKartHUD(void)
LAPS2_X = (BASEVIDWIDTH/2)-43;
LAPS2_Y = (BASEVIDHEIGHT/2)-12;
RING2_X = (BASEVIDWIDTH/2)-43;
RING2_Y = (BASEVIDHEIGHT/2)-12;
POSI2_X = (BASEVIDWIDTH/2)-4;
POSI2_Y = (BASEVIDHEIGHT/2)-26;
@ -860,8 +972,8 @@ static void K_drawKartItem(void)
{
const INT32 item = K_GetRollingRouletteItem(stplyr);
if (stplyr->skincolor)
localcolor = stplyr->skincolor;
if (K_GetHudColor())
localcolor = K_GetHudColor();
switch (item)
{
@ -1898,7 +2010,7 @@ static void K_drawKartLaps(void)
// Lives
if (LUA_HudEnabled(hud_lives) && uselives)
{
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(fr+21, fy-13, V_HUDTRANS|splitflags, faceprefix[stplyr->skin][FACE_MINIMAP], colormap);
if (stplyr->lives >= 0)
V_DrawScaledPatch(fr+34, fy-10, V_HUDTRANS|splitflags, fontv[PINGNUM_FONT].font[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow
@ -1906,8 +2018,10 @@ static void K_drawKartLaps(void)
}
else
{
// Laps
V_DrawScaledPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_lapsticker);
if (K_BigLapSticker())
V_DrawScaledPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, ((stplyr->laps > 9) ? kp_lapstickerbig2 : kp_lapstickerbig));
else
V_DrawScaledPatch(LAPS_X, LAPS_Y, V_HUDTRANS|splitflags, kp_lapsticker);
if (stplyr->exiting)
V_DrawKartString(LAPS_X+33, LAPS_Y+3, V_HUDTRANS|V_SLIDEIN|splitflags, "FIN");
@ -1917,7 +2031,7 @@ static void K_drawKartLaps(void)
// Lives
if (uselives)
{
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, stplyr->skincolor, GTC_CACHE);
UINT8 *colormap = R_GetTranslationColormap(stplyr->skin, K_GetHudColor(), GTC_CACHE);
V_DrawMappedPatch(LAPS_X+59, LAPS_Y-16, V_HUDTRANS|splitflags, faceprefix[stplyr->skin][FACE_RANK], colormap);
if (stplyr->lives >= 0)
V_DrawScaledPatch(LAPS_X+77, LAPS_Y-11, V_HUDTRANS|splitflags, kp_facenum[(stplyr->lives % 10)]); // make sure this doesn't overflow OR underflow
@ -2021,26 +2135,29 @@ static void K_drawKartSpeedometer(void)
if (convSpeed > 999 || convSpeed < 0)
convSpeed = 999;
if (gametype == GT_BATTLE)
battleoffset = -4;
if (K_RingsActive() == true)
ringoffset = -16;
if (cv_speed_xoffset.value == 0 && cv_speed_yoffset.value == 0)
{
if (gametype == GT_BATTLE)
battleoffset = -4;
if (K_RingsActive() == true)
ringoffset = -16;
}
if (cv_newspeedometer.value == 0)
{
switch (cv_kartspeedometer.value) {
case 1:
V_DrawKartString(LAPS_X, LAPS_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%3d km/h", convSpeed));
V_DrawKartString(SPDM_X, SPDM_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%3d km/h", convSpeed));
break;
case 2:
V_DrawKartString(LAPS_X, LAPS_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%3d mph", convSpeed));
V_DrawKartString(SPDM_X, SPDM_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%3d mph", convSpeed));
break;
case 3:
V_DrawKartString(LAPS_X, LAPS_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%3d fu/t", convSpeed));
V_DrawKartString(SPDM_X, SPDM_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%3d fu/t", convSpeed));
break;
case 4:
V_DrawKartString(LAPS_X, LAPS_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%4d %%", convSpeed));
V_DrawKartString(SPDM_X, SPDM_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, va("%4d %%", convSpeed));
break;
default:
break;
@ -2052,11 +2169,11 @@ static void K_drawKartSpeedometer(void)
numbers[1] = ((convSpeed / 10) % 10);
numbers[2] = (convSpeed % 10);
V_DrawScaledPatch(LAPS_X, LAPS_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometersticker);
V_DrawScaledPatch(LAPS_X+7, LAPS_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[0]]);
V_DrawScaledPatch(LAPS_X+13, LAPS_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[1]]);
V_DrawScaledPatch(LAPS_X+19, LAPS_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[2]]);
V_DrawScaledPatch(LAPS_X+29, LAPS_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometerlabel[labeln]);
V_DrawScaledPatch(SPDM_X, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometersticker);
V_DrawScaledPatch(SPDM_X+7, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[0]]);
V_DrawScaledPatch(SPDM_X+13, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[1]]);
V_DrawScaledPatch(SPDM_X+19, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_facenum[numbers[2]]);
V_DrawScaledPatch(SPDM_X+29, SPDM_Y-9 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_speedometerlabel[labeln]);
}
// Readded later need to draw smaller graphics.
/*else if (cv_newspeedometer.value == 2)
@ -2082,7 +2199,7 @@ static void K_drawKartSpeedometer(void)
else if (((fuspeed < 57 && fuspeed > 54) || (fuspeed < 60 && fuspeed > 56) || (fuspeed > 59)) && !(leveltime & 4))
spdpatch = 23;
V_DrawScaledPatch(LAPS_X, LAPS_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_kartzspeedo[spdpatch]);
V_DrawScaledPatch(SPDM_X, SPDM_Y-18 + battleoffset + ringoffset, V_HUDTRANS|splitflags, kp_kartzspeedo[spdpatch]);
}*/
K_drawKartAccessibilityIcons(56);
@ -2115,21 +2232,21 @@ static void K_drawRingMeter(void)
// pain and suffering defined below
if (r_splitscreen < 2) // don't change shit for THIS splitscreen.
{
fx = LAPS_X;
fy = LAPS_Y;
fx = RING_X;
fy = RING_Y;
}
else
{
if (stplyr == &players[displayplayers[0]] || stplyr == &players[displayplayers[2]]) // If we are P1 or P3...
{
fx = LAPS_X;
fy = LAPS_Y;
fx = RING_X;
fy = RING_Y;
splitflags = V_SNAPTOLEFT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
else // else, that means we're P2 or P4.
{
fx = LAPS2_X;
fy = LAPS2_Y;
fx = RING2_X;
fy = RING2_Y;
splitflags = V_SNAPTORIGHT|V_SNAPTOBOTTOM|V_SPLITSCREEN;
}
}
@ -2155,11 +2272,11 @@ static void K_drawRingMeter(void)
if (itembreaker)
ringoffsety -= 2;
V_DrawScaledPatch(LAPS_X, LAPS_Y-14 + ringoffsety, V_HUDTRANS|splitflags, kp_ringsticker[(stplyr->pflags & PF_RINGLOCK) ? 1 : 0]);
V_DrawScaledPatch(RING_X, RING_Y-14 + ringoffsety, V_HUDTRANS|splitflags, kp_ringsticker[(stplyr->pflags & PF_RINGLOCK) ? 1 : 0]);
if (stplyr->rings < 0) // Draw the minus for ring debt
{
V_DrawMappedPatch(LAPS_X-5, LAPS_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_ringdebtminus, ringmap);
V_DrawMappedPatch(RING_X-5, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_ringdebtminus, ringmap);
}
if (stplyr->rings < 0)
@ -2169,14 +2286,14 @@ static void K_drawRingMeter(void)
}
if (rn[1] == 1 && ringcount == 11)
V_DrawMappedPatch(LAPS_X+2, LAPS_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
V_DrawMappedPatch(RING_X+2, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
else
V_DrawMappedPatch(LAPS_X+2, LAPS_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
V_DrawMappedPatch(RING_X+2, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[0]], ringmap);
if (rn[1] == 1 && ringcount == 11)
V_DrawMappedPatch(LAPS_X+7, LAPS_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
V_DrawMappedPatch(RING_X+7, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
else
V_DrawMappedPatch(LAPS_X+8, LAPS_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
V_DrawMappedPatch(RING_X+8, RING_Y-11 + ringoffsety, V_HUDTRANS|splitflags, kp_facenum[rn[1]], ringmap);
// Draw the fillbars
if (stplyr->rings)
@ -2198,10 +2315,10 @@ static void K_drawRingMeter(void)
for (i = 0; i != ringcount; i++)
{
V_DrawFill(LAPS_X+17+(2*i), LAPS_Y-10 + ringoffsety, 1, 1, barcolors[0]|splitflags);
V_DrawFill(LAPS_X+17+(2*i), LAPS_Y-9 + ringoffsety, 1, 4, barcolors[1]|splitflags);
V_DrawFill(LAPS_X+17+(2*i), LAPS_Y-8 + ringoffsety, 1, 1, barcolors[2]|splitflags);
V_DrawFill(LAPS_X+17+(2*i), LAPS_Y-7 + ringoffsety, 1, 1, barcolors[3]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-10 + ringoffsety, 1, 1, barcolors[0]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-9 + ringoffsety, 1, 4, barcolors[1]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-8 + ringoffsety, 1, 1, barcolors[2]|splitflags);
V_DrawFill(RING_X+17+(2*i), RING_Y-7 + ringoffsety, 1, 1, barcolors[3]|splitflags);
}
}
}
@ -2210,7 +2327,7 @@ static void K_drawRingMeter(void)
static void K_drawKartBumpersOrKarma(void)
{
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, GTC_CACHE);
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
INT32 splitflags = V_SNAPTOBOTTOM|V_SNAPTOLEFT|V_SPLITSCREEN;
if (r_splitscreen > 1)
@ -3834,9 +3951,12 @@ static void K_drawInput(void)
static INT32 pn = 0;
INT32 target = 0, splitflags = (V_SNAPTOBOTTOM|V_SNAPTORIGHT|V_SLIDEIN);
INT32 x = (BASEVIDWIDTH - 32)*FRACUNIT, y = (BASEVIDHEIGHT - 24)*FRACUNIT;
UINT8 *shadowcolormap = NULL;
INT32 offs, col;
const INT32 accent1 = splitflags | skincolors[stplyr->skincolor].ramp[5];
const INT32 accent2 = splitflags | skincolors[stplyr->skincolor].ramp[9];
const UINT8 hudcolor = K_GetHudColor();
const INT32 accent1 = splitflags | skincolors[hudcolor].ramp[5];
const INT32 accent2 = splitflags | skincolors[hudcolor].ramp[9];
const UINT8 *hudcolormap = R_GetTranslationColormap(0, hudcolor, GTC_CACHE);
#define BUTTW 8
#define BUTTH 11
@ -3868,38 +3988,62 @@ static void K_drawInput(void)
y -= FRACUNIT;
if (cv_showinput.value == 2)
if (cv_showinput.value > 1)
{
INT32 joyx, joyxoffs, joyy, joyyoffs;
joyxoffs = -8, joyyoffs = -24;
joyx = x>>FRACBITS, joyy = y>>FRACBITS;
// O backing
V_DrawFill(joyx+joyxoffs, joyy+joyyoffs-1, 16, 16, splitflags|accent2);
V_DrawFill(joyx+joyxoffs, joyy+joyyoffs+15, 16, 1, splitflags|splitflags|31);
if (cv_showinput.value == 2)
{
shadowcolormap = R_GetTranslationColormap(0, SKINCOLOR_BLACK, GTC_CACHE);
V_DrawFixedPatch((joyx+joyxoffs)<<FRACBITS, (joyy+joyyoffs-1)<<FRACBITS, FRACUNIT, splitflags, joybacking, hudcolormap);
}
else
{
V_DrawFill(joyx+joyxoffs, joyy+joyyoffs-1, 16, 16, splitflags|accent2);
V_DrawFill(joyx+joyxoffs, joyy+joyyoffs+15, 16, 1, splitflags|31);
}
if (stplyr->cmd.turning || stplyr->cmd.throwdir)
{
INT16 turning = encoremode ? -stplyr->cmd.turning : stplyr->cmd.turning;
// joystick hole
V_DrawFill(joyx+joyxoffs+5, joyy+joyyoffs+4, 6, 6, splitflags|accent1);
// joystick top and back
V_DrawFill(joyx+joyxoffs+3-turning/80,
joyy+joyyoffs+2-stplyr->cmd.throwdir/80,
10, 10, splitflags|31);
V_DrawFill(joyx+joyxoffs+3-turning/64,
joyy+joyyoffs+1-stplyr->cmd.throwdir/64,
10, 10, splitflags|accent1);
if (cv_showinput.value == 2)
{
V_DrawFixedPatch((joyx+joyxoffs+3-turning/80)<<FRACBITS, (joyy+joyyoffs+2-stplyr->cmd.throwdir/80)<<FRACBITS, FRACUNIT, splitflags, joyknob, shadowcolormap);
V_DrawFixedPatch((joyx+joyxoffs+3-turning/64)<<FRACBITS, (joyy+joyyoffs+1-stplyr->cmd.throwdir/64)<<FRACBITS, FRACUNIT, splitflags, joyknob, hudcolormap);
}
else
{
// joystick hole
V_DrawFill(joyx+joyxoffs+5, joyy+joyyoffs+4, 6, 6, splitflags|accent1);
// joystick top and back
V_DrawFill(joyx+joyxoffs+3-turning/80,
joyy+joyyoffs+2-stplyr->cmd.throwdir/80,
10, 10, splitflags|31);
V_DrawFill(joyx+joyxoffs+3-turning/64,
joyy+joyyoffs+1-stplyr->cmd.throwdir/64,
10, 10, splitflags|accent1);
}
}
else
{
V_DrawFill(joyx+joyxoffs+3, joyy+joyyoffs+11, 10, 1, splitflags|accent2);
V_DrawFill(joyx+joyxoffs+3,
joyy+joyyoffs+1,
10, 10,splitflags|accent1);
if (cv_showinput.value == 2)
{
V_DrawFixedPatch((joyx+joyxoffs+3)<<FRACBITS, (joyy+joyyoffs+8)<<FRACBITS, FRACUNIT, splitflags, joyshadow, shadowcolormap);
V_DrawFixedPatch((joyx+joyxoffs+3)<<FRACBITS, (joyy+joyyoffs+1)<<FRACBITS, FRACUNIT, splitflags, joyknob, hudcolormap);
}
else
{
V_DrawFill(joyx+joyxoffs+3, joyy+joyyoffs+11, 10, 1, splitflags|accent2);
V_DrawFill(joyx+joyxoffs+3,
joyy+joyyoffs+1,
10, 10,splitflags|accent1);
}
}
}
else
else if (cv_showinput.value == 1)
{
if (!stplyr->cmd.turning) // no turn
target = 0;
@ -3932,12 +4076,12 @@ static void K_drawInput(void)
if (target > 4)
target = 4;
if (!stplyr->skincolor)
if (!K_GetHudColor())
V_DrawFixedPatch(x, y, FRACUNIT, splitflags, kp_inputwheel[target], NULL);
else
{
UINT8 *colormap;
colormap = R_GetTranslationColormap(0, stplyr->skincolor, GTC_CACHE);
colormap = R_GetTranslationColormap(0, K_GetHudColor(), GTC_CACHE);
V_DrawFixedPatch(x, y, FRACUNIT, splitflags, kp_inputwheel[target], colormap);
}
}
@ -3973,7 +4117,7 @@ static void K_drawLapStartAnim(void)
const tic_t leveltimeOld = leveltime - 1;
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, stplyr->skincolor, GTC_CACHE);
UINT8 *colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE);
fixed_t interpx, interpy, newval, oldval;

View file

@ -34,9 +34,12 @@ struct trackingResult_t
boolean onScreen;
};
void K_RegisterKartHUDStuff(void);
void K_ObjectTracking(trackingResult_t *result, vector3_t *point, boolean reverse);
const char *K_GetItemPatch(UINT8 item, boolean tiny);
UINT8 K_GetHudColor(void);
void K_LoadKartHUDGraphics(void);
void K_drawKartHUD(void);
void K_drawKartFreePlay(void);

View file

@ -254,6 +254,9 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartdebugcolorize);
CV_RegisterVar(&cv_kartdebugdirector);
// HUD cvars
K_RegisterKartHUDStuff();
CV_RegisterVar(&cv_stagetitle);
CV_RegisterVar(&cv_lessflicker);
@ -299,9 +302,6 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartitembreaker);
CV_RegisterVar(&cv_newspeedometer);
CV_RegisterVar(&cv_showinput);
CV_RegisterVar(&cv_kartwalltransfer);
CV_RegisterVar(&cv_kartpurpledrift);
@ -310,6 +310,8 @@ void K_RegisterKartStuff(void)
CV_RegisterVar(&cv_kartbumpspring);
CV_RegisterVar(&cv_kartslipdash);
CV_RegisterVar(&cv_kartdriftsounds);
CV_RegisterVar(&cv_kartdriftefx);
@ -3492,22 +3494,22 @@ static void K_GetKartBoostPower(player_t *player)
if (player->offroad && K_ApplyOffroad(player))
{
player->speedboost = max(finalspeedboost, player->speedboost)/2;
player->accelboost = max(finalaccelboost, player->accelboost)/2;
player->accelboost = finalaccelboost/2;
}
else if (finalspeedboost >= prevspeedboost)
{
player->speedboost = max(player->speedboost, finalspeedboost);
player->accelboost = max(finalaccelboost, player->accelboost);
player->accelboost = finalaccelboost;
}
else if ((player->aizdriftstrat && abs((player->drift) < 5)) || (K_GetKartButtons(player) & BT_BRAKE))
{
player->speedboost = max(prevspeedboost - SPEEDBOOSTDROPOFF_BRAKE, min(player->speedboost, MAXVANILLABOOST));
player->accelboost = max(finalaccelboost, player->accelboost);
player->accelboost = finalaccelboost;
}
else
{
player->speedboost = prevspeedboost - SPEEDBOOSTDROPOFF;
player->accelboost = max(finalaccelboost, player->accelboost);
player->accelboost = finalaccelboost;
}
}
else
@ -3520,9 +3522,10 @@ static void K_GetKartBoostPower(player_t *player)
{
player->speedboost += (finalspeedboost - player->speedboost) / (TICRATE/2);
}
player->accelboost = finalaccelboost;
}
player->accelboost = finalaccelboost;
player->numboosts = finalgrade;
K_ClearBoost(player);
}
@ -8815,6 +8818,9 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue)
turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning
if (K_SlipdashActive() && K_Sliptiding(player)) // slight handling boost based on weight
turnvalue = FixedMul(turnvalue, FRACUNIT + (10 - player->kartweight)*FRACUNIT/48);
if (player->invincibilitytimer || player->sneakertimer || player->growshrinktimer > 0)
turnvalue = FixedMul(turnvalue, FixedDiv(5*FRACUNIT, 4*FRACUNIT));
@ -9075,7 +9081,7 @@ static void K_KartDrift(player_t *player, boolean onground)
else
player->aizdriftstrat = ((player->drift > 0) ? 1 : -1);
}
else if (player->aizdriftstrat && !player->drift)
else if (K_Sliptiding(player))
{
K_SpawnAIZDust(player);
@ -9118,6 +9124,82 @@ static void K_KartDrift(player_t *player, boolean onground)
player->pflags &= ~PF_BRAKEDRIFT;
}
static void K_KartSlipdash(player_t *player, boolean onground)
{
boolean snaked = player->slipdashdir && player->aizdriftstrat && player->slipdashdir != player->aizdriftstrat;
if (!K_SlipdashActive() || P_PlayerInPain(player))
{
player->slipdashcharge = 0;
player->slipdashdir = 0;
}
else if ((K_Sliptiding(player) || player->aizdriftturn) && !snaked)
{
if (!player->slipdashdir) // anti-snaking
player->slipdashdir = player->aizdriftstrat;
if (onground && !player->drift)
{
fixed_t turn = max(0, player->cmd.turning * player->aizdriftstrat);
turn = FINETANGENT((turn*(ANGLE_45/KART_FULLTURN) + ANGLE_90) >> ANGLETOFINESHIFT);
player->slipdashcharge = min(player->slipdashcharge + turn/45, FRACUNIT);
if (!(leveltime % 5))
S_StartSoundAtVolume(player->mo, sfx_cdfm17, 133 + turn/555);
}
}
else if (player->slipdashcharge && onground)
{
INT32 i;
boolean driftbonus = player->driftcharge && !snaked;
if (snaked)
player->slipdashcharge /= 4;
S_StopSoundByID(player->mo, sfx_cdfm17);
S_StartSoundAtVolume(player->mo, player->slipdashcharge > FRACUNIT/3 ? sfx_cdfm62 : sfx_s23c, driftbonus ? 200 : 255);
P_Thrust(player->mo, player->mo->angle, FixedMul(K_GetKartSpeed(player, false, false), 2*player->slipdashcharge/3));
K_DoBoost(player, (2*player->slipdashcharge/3)/2, 0, false, false);
for (i = -1; i <= 1; i += 2)
{
mobj_t *strat = P_SpawnMobjFromMobj(player->mo,
P_ReturnThrustX(NULL, player->mo->angle + ANGLE_67h*i, -20*player->mo->scale),
P_ReturnThrustY(NULL, player->mo->angle + ANGLE_67h*i, -20*player->mo->scale),
0, MT_AIZDRIFTSTRAT
);
strat->angle = player->mo->angle + ANGLE_67h*i;
P_SetScale(strat, FixedMul(player->slipdashcharge + FRACUNIT/4, mapobjectscale));
strat->destscale = strat->scale;
P_InstaThrust(strat, strat->angle, -8*mapobjectscale);
}
if (driftbonus)
{
INT32 dsv = K_GetKartDriftSparkValue(player);
player->driftcharge = min(player->driftcharge + FixedMul(player->slipdashcharge, dsv), dsv-1);
S_StartSound(player->mo, sfx_s3k45);
}
player->slipdashcharge = 0;
player->slipdashdir = 0;
}
else
player->slipdashdir = 0;
if (player->slipdashcharge && leveltime & 1)
{
mobj_t *spark = P_SpawnMobjFromMobj(player->mo, 0, 0, -4*mapobjectscale, MT_DRIFTSPARK);
spark->color = SKINCOLOR_GREEN;
spark->angle = player->mo->angle + player->aizdriftstrat*ANGLE_45;
P_SetScale(spark, FixedMul(player->slipdashcharge + 2*FRACUNIT/3, mapobjectscale));
spark->destscale = 0;
spark->scalespeed = mapobjectscale/4;
P_InstaThrust(spark, player->mo->angle, player->speed/2);
spark->momz = player->mo->z - player->mo->old_z;
spark->z += spark->momz;
}
}
INT32 K_GetDriftAngleOffset(player_t *player)
{
INT32 a = 0;
@ -10348,6 +10430,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
K_KartDrift(player, onground);
K_KartSlipdash(player, onground);
// Quick Turning
// You can't turn your kart when you're not moving.
// So now it's time to burn some rubber!
@ -10643,6 +10727,17 @@ boolean K_ChainingActive(void)
return false;
}
boolean K_SlipdashActive(void)
{
if (slipdashactive)
{
// Slipdash is enabled!
return true;
}
return false;
}
boolean K_UsingLegacyCheckpoints(void)
{
if (numbosswaypoints > 0)

View file

@ -229,6 +229,7 @@ boolean K_SafeRespawnPosition(mobj_t * mo);
boolean K_RingsActive(void);
boolean K_StackingActive(void);
boolean K_ChainingActive(void);
boolean K_SlipdashActive(void);
boolean K_BoostChain(player_t *player, INT32 timer, boolean chainsound);
INT32 K_ChainOrDeincrementTime(player_t *player, INT32 timer, INT32 deincrement, boolean chainsound);
boolean K_UsingLegacyCheckpoints(void);

View file

@ -3999,6 +3999,13 @@ static int lib_kChainingActive(lua_State *L)
return 1;
}
// Checks if Chaining is active.
static int lib_kSlipdashActive(lua_State *L)
{
lua_pushboolean(L, K_SlipdashActive());
return 1;
}
// Checks if current map is using legacy boss3 bassed checkpoints. Useful for map compat.
static int lib_kUsingLegacyCheckpoints(lua_State *L)
{
@ -4360,6 +4367,7 @@ static luaL_Reg lib[] = {
{"K_RingsActive",lib_kRingsActive},
{"K_StackingActive",lib_kStackingActive},
{"K_ChainingActive",lib_kChainingActive},
{"K_SlipdashActive",lib_kSlipdashActive},
{"K_UsingLegacyCheckpoints",lib_kUsingLegacyCheckpoints},
{"K_DoBoost",lib_kDoBoost},
{"K_ClearBoost",lib_kClearBoost},

View file

@ -210,6 +210,8 @@ enum player_e
player_wipeoutslow,
player_justbumped,
player_itemflags,
player_outrun,
player_outruntime,
player_drift,
player_driftcharge,
player_driftboost,
@ -220,6 +222,8 @@ enum player_e
player_aizdriftstrat,
player_aizdrifttilt,
player_aizdriftturn,
player_slipdashcharge,
player_slipdashdir,
player_offroad,
player_pogospring,
player_brakestop,
@ -384,6 +388,8 @@ static const char *const player_opt[] = {
"wipeoutslow",
"justbumped",
"itemflags",
"outrun",
"outruntime",
"drift",
"driftcharge",
"driftboost",
@ -394,6 +400,8 @@ static const char *const player_opt[] = {
"aizdriftstrat",
"aizdrifttilt",
"aizdriftturn",
"slipdashcharge",
"slipdashdir",
"offroad",
"pogospring",
"brakestop",
@ -652,6 +660,12 @@ static int player_get(lua_State *L)
case player_itemflags:
lua_pushinteger(L, plr->itemflags);
break;
case player_outrun:
lua_pushinteger(L, plr->outrun);
break;
case player_outruntime:
lua_pushinteger(L, plr->outruntime);
break;
case player_drift:
lua_pushinteger(L, plr->drift);
break;
@ -682,6 +696,12 @@ static int player_get(lua_State *L)
case player_aizdriftturn:
lua_pushinteger(L, plr->aizdriftturn);
break;
case player_slipdashcharge:
lua_pushfixed(L, plr->slipdashcharge);
break;
case player_slipdashdir:
lua_pushinteger(L, plr->slipdashdir);
break;
case player_offroad:
lua_pushinteger(L, plr->offroad);
break;
@ -1249,6 +1269,12 @@ static int player_set(lua_State *L)
case player_itemflags:
plr->itemflags = luaL_checkinteger(L, 3);
break;
case player_outrun:
plr->outrun = luaL_checkinteger(L, 3);
break;
case player_outruntime:
plr->outruntime = luaL_checkinteger(L, 3);
break;
case player_drift:
plr->drift = luaL_checkinteger(L, 3);
break;
@ -1279,6 +1305,12 @@ static int player_set(lua_State *L)
case player_aizdriftturn:
plr->aizdriftturn = luaL_checkinteger(L, 3);
break;
case player_slipdashcharge:
plr->slipdashcharge = luaL_checkfixed(L, 3);
break;
case player_slipdashdir:
plr->slipdashdir = luaL_checkinteger(L, 3);
break;
case player_offroad:
plr->offroad = luaL_checkinteger(L, 3);
break;

View file

@ -580,6 +580,7 @@ extern INT32 numbosswaypoints;
extern boolean ringsactive;
extern boolean stackingactive;
extern boolean chainingactive;
extern boolean slipdashactive;
extern UINT16 bossdisabled;
extern boolean stoppedclock;

View file

@ -259,6 +259,8 @@ static void P_NetArchivePlayers(savebuffer_t *save)
WRITESINT8(save->p, players[i].aizdriftstrat);
WRITEINT32(save->p, players[i].aizdrifttilt);
WRITEINT32(save->p, players[i].aizdriftturn);
WRITEFIXED(save->p, players[i].slipdashcharge);
WRITESINT8(save->p, players[i].slipdashdir);
WRITEFIXED(save->p, players[i].offroad);
WRITEFIXED(save->p, players[i].tiregrease);
@ -573,6 +575,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save)
players[i].aizdriftstrat = READSINT8(save->p);
players[i].aizdrifttilt = READINT32(save->p);
players[i].aizdriftturn = READINT32(save->p);
players[i].slipdashcharge = READFIXED(save->p);
players[i].slipdashdir = READSINT8(save->p);
players[i].offroad = READFIXED(save->p);
players[i].tiregrease = READFIXED(save->p);
@ -1335,6 +1339,8 @@ static void ArchiveSectors(savebuffer_t *save)
WRITEUINT8(save->p, diff3);
if (diff3 & SD_DIFF4)
WRITEUINT8(save->p, diff4);
if (diff4 & SD_DIFF5)
WRITEUINT8(save->p, diff5);
if (diff & SD_FLOORHT)
WRITEFIXED(save->p, ss->floorheight);
if (diff & SD_CEILHT)
@ -5089,6 +5095,7 @@ static void P_NetArchiveMisc(savebuffer_t *save, boolean resending)
WRITEUINT8(save->p, ringsactive);
WRITEUINT8(save->p, stackingactive);
WRITEUINT8(save->p, chainingactive);
WRITEUINT8(save->p, slipdashactive);
for (i = 0; i < 4; i++)
{
@ -5260,6 +5267,7 @@ FUNCINLINE static ATTRINLINE boolean P_NetUnArchiveMisc(savebuffer_t *save, bool
ringsactive = READUINT8(save->p);
stackingactive = READUINT8(save->p);
chainingactive = READUINT8(save->p);
slipdashactive = READUINT8(save->p);
for (i = 0; i < 4; i++)
{

View file

@ -145,6 +145,7 @@ INT32 numbosswaypoints;
boolean ringsactive = false;
boolean stackingactive = false;
boolean chainingactive = false;
boolean slipdashactive = false;
UINT16 bossdisabled;
boolean stoppedclock;
boolean levelloading;
@ -7879,21 +7880,23 @@ static void P_InitLevelSettings(boolean reloadinggamestate)
nummapboxes = numgotboxes = 0;
numtargets = 0;
itembreaker = false;
ringsactive = false;
stackingactive = false;
chainingactive = false;
slipdashactive = false;
if (cv_kartrings.value)
ringsactive = true;
else
ringsactive = false;
if (cv_kartstacking.value)
stackingactive = true;
else
stackingactive = false;
if (cv_kartchaining.value)
chainingactive = true;
else
chainingactive = false;
if (cv_kartslipdash.value)
slipdashactive = true;
// emerald hunt
hunt1 = hunt2 = hunt3 = NULL;