diff --git a/CMakeLists.txt b/CMakeLists.txt index 9dd9ab7c6..d046e7bf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -122,7 +122,7 @@ else() CPMAddPackage( NAME Ccache.cmake GITHUB_REPOSITORY TheLartians/Ccache.cmake - VERSION 1.2 + VERSION 1.2.5 ) endif() diff --git a/src/d_main.cpp b/src/d_main.cpp index 7cd38ae6c..3ada228ff 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -81,7 +81,7 @@ #include // 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" diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a3aa6782d..c1d60fa5b 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -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) diff --git a/src/d_netcmd.h b/src/d_netcmd.h index 6ddf593c8..c1e7dd2d2 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -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; diff --git a/src/d_player.h b/src/d_player.h index 9c337042b..02c1f32b9 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -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 diff --git a/src/g_demo.c b/src/g_demo.c index be7d391ea..3f8ab63c6 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -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) diff --git a/src/k_hud.c b/src/k_hud.c index 4ee787f05..3602bab6c 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -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)<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)<cmd.throwdir/80)<cmd.throwdir/64)<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)<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; diff --git a/src/k_hud.h b/src/k_hud.h index 287bfce4d..debb31789 100644 --- a/src/k_hud.h +++ b/src/k_hud.h @@ -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); diff --git a/src/k_kart.c b/src/k_kart.c index 79237decc..e4dfbcfdd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -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) diff --git a/src/k_kart.h b/src/k_kart.h index 45a1e6d8a..913e11f9d 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -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); diff --git a/src/lua_baselib.c b/src/lua_baselib.c index eb69ae4df..c620190b7 100644 --- a/src/lua_baselib.c +++ b/src/lua_baselib.c @@ -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}, diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 515c84032..59f9b3fb0 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -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; diff --git a/src/p_mobj.h b/src/p_mobj.h index dc7c1e75d..32edf7dde 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -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; diff --git a/src/p_saveg.c b/src/p_saveg.c index d05c02553..35d75090f 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -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++) { diff --git a/src/p_setup.c b/src/p_setup.c index e38bdef63..9f3c0d0ea 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -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;