From 68e0a6296636541acf61adf9937be306f1ec23b6 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Mon, 31 Mar 2025 01:55:33 +0200 Subject: [PATCH 01/13] The slipdash --- src/d_netcmd.c | 2 ++ src/d_netcmd.h | 2 +- src/d_player.h | 2 ++ src/k_kart.c | 79 ++++++++++++++++++++++++++++++++++++++++++++- src/lua_playerlib.c | 16 +++++++++ src/p_saveg.c | 4 +++ 6 files changed, 103 insertions(+), 2 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a3aa6782d..57f0719a7 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -490,6 +490,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_YesNo, NULL); + static CV_PossibleValue_t kartdebugitem_cons_t[] = { #define FOREACH( name, n ) { n, #name } 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 f17621d82..5fb29aca0 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -577,6 +577,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/k_kart.c b/src/k_kart.c index 79237decc..6fdf354cc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -310,6 +310,8 @@ void K_RegisterKartStuff(void) CV_RegisterVar(&cv_kartbumpspring); + CV_RegisterVar(&cv_kartslipdash); + CV_RegisterVar(&cv_kartdriftsounds); CV_RegisterVar(&cv_kartdriftefx); @@ -9075,7 +9077,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 +9120,79 @@ 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 (!cv_kartslipdash.value || player->spinouttimer) + { + 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/50, 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)); + + 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; + strat->momx = P_ReturnThrustX(NULL, player->mo->angle, -8*mapobjectscale); + strat->momy = P_ReturnThrustY(NULL, player->mo->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) + { + mobj_t *spark = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, 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; + } +} + INT32 K_GetDriftAngleOffset(player_t *player) { INT32 a = 0; @@ -10348,6 +10423,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! diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 515c84032..943bdb07c 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -220,6 +220,8 @@ enum player_e player_aizdriftstrat, player_aizdrifttilt, player_aizdriftturn, + player_slipdashcharge, + player_slipdashdir, player_offroad, player_pogospring, player_brakestop, @@ -394,6 +396,8 @@ static const char *const player_opt[] = { "aizdriftstrat", "aizdrifttilt", "aizdriftturn", + "slipdashcharge", + "slipdashdir", "offroad", "pogospring", "brakestop", @@ -682,6 +686,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; @@ -1279,6 +1289,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_saveg.c b/src/p_saveg.c index d05c02553..b7a6f91e4 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); From 9a8c89b1d8b63bd1d7ad41b5a5c8f07d43e6a271 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 30 Mar 2025 20:04:56 -0400 Subject: [PATCH 02/13] Various HUD additions Wide lap sticker, hud element offsets, GetHudColor Helper, Circle Input display option --- src/d_main.cpp | 2 +- src/k_hud.c | 300 ++++++++++++++++++++++++++++++++------------ src/k_hud.h | 3 + src/k_kart.c | 6 +- src/lua_playerlib.c | 16 +++ 5 files changed, 245 insertions(+), 82 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 0fc9f36f1..3a3dde1ac 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/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..5324c6b07 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); diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 515c84032..43be382df 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, @@ -384,6 +386,8 @@ static const char *const player_opt[] = { "wipeoutslow", "justbumped", "itemflags", + "outrun", + "outruntime", "drift", "driftcharge", "driftboost", @@ -652,6 +656,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; @@ -1249,6 +1259,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; From bf1eae6e8b480a768a3ac3d764964c5f22110650 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 30 Mar 2025 22:25:14 -0400 Subject: [PATCH 03/13] Small slipdash tweaks the rate for charging the slipdash has been increased and it now applies speedboost (no accel!) of the exact same speed as its thrust for speed value smoothing. Squishedtimer also removes slipdashcharge. --- src/k_kart.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 82ae2a2fb..edb9e82cc 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9123,7 +9123,7 @@ static void K_KartDrift(player_t *player, boolean onground) static void K_KartSlipdash(player_t *player, boolean onground) { boolean snaked = player->slipdashdir && player->aizdriftstrat && player->slipdashdir != player->aizdriftstrat; - if (!cv_kartslipdash.value || player->spinouttimer) + if (!cv_kartslipdash.value || P_PlayerInPain(player)) { player->slipdashcharge = 0; player->slipdashdir = 0; @@ -9137,7 +9137,7 @@ static void K_KartSlipdash(player_t *player, boolean onground) { 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/50, FRACUNIT); + player->slipdashcharge = min(player->slipdashcharge + turn/45, FRACUNIT); if (!(leveltime % 5)) S_StartSoundAtVolume(player->mo, sfx_cdfm17, 133 + turn/555); @@ -9154,6 +9154,7 @@ static void K_KartSlipdash(player_t *player, boolean onground) 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, 0, false, false); for (i = -1; i <= 1; i += 2) { From aaadef0c7626edeb63bb4e1f762c66380a7022c0 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 31 Mar 2025 11:17:07 -0400 Subject: [PATCH 04/13] Make the speedboost half the thrust --- src/k_kart.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index edb9e82cc..e8c5dac52 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9154,7 +9154,7 @@ static void K_KartSlipdash(player_t *player, boolean onground) 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, 0, false, false); + K_DoBoost(player, (2*player->slipdashcharge/3)/2, 0, false, false); for (i = -1; i <= 1; i += 2) { From e92803dd25107b93cc5e596ea7970fa5f8788b6b Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Mon, 31 Mar 2025 18:06:06 +0200 Subject: [PATCH 05/13] Handling boost, tweaked visuals --- src/k_kart.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e8c5dac52..93cb1aa9e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8817,6 +8817,9 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning + if (cv_kartslipdash.value && 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)); @@ -9166,8 +9169,7 @@ static void K_KartSlipdash(player_t *player, boolean onground) strat->angle = player->mo->angle + ANGLE_67h*i; P_SetScale(strat, FixedMul(player->slipdashcharge + FRACUNIT/4, mapobjectscale)); strat->destscale = strat->scale; - strat->momx = P_ReturnThrustX(NULL, player->mo->angle, -8*mapobjectscale); - strat->momy = P_ReturnThrustY(NULL, player->mo->angle, -8*mapobjectscale); + P_InstaThrust(strat, strat->angle, -8*mapobjectscale); } if (driftbonus) @@ -9183,14 +9185,17 @@ static void K_KartSlipdash(player_t *player, boolean onground) else player->slipdashdir = 0; - if (player->slipdashcharge) + if (player->slipdashcharge && leveltime & 1) { - mobj_t *spark = P_SpawnMobjFromMobj(player->mo, 0, 0, 0, MT_DRIFTSPARK); + 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; } } From b58a98e268d0867615978184bb4073f88a8bfa68 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 31 Mar 2025 12:43:17 -0400 Subject: [PATCH 06/13] Fix accel being overwritten --- src/k_kart.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/k_kart.c b/src/k_kart.c index 5324c6b07..2a49499ad 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3520,9 +3520,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); } From 52d8520eeacc10cb48b946a6a40982e1fdb70c03 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 31 Mar 2025 13:19:34 -0400 Subject: [PATCH 07/13] Fix ccache compile error --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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() From 2e2b90f843be4970e8d9a00b90381941e80a5faa Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 31 Mar 2025 14:04:06 -0400 Subject: [PATCH 08/13] Finalize Cvar and push check to lua --- src/d_netcmd.c | 38 ++++++++++++++++++++++++++++++++++++-- src/k_kart.c | 11 +++++++++++ src/k_kart.h | 1 + src/lua_baselib.c | 8 ++++++++ src/p_mobj.h | 1 + src/p_setup.c | 15 +++++++++------ 6 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 57f0719a7..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,7 +491,7 @@ 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_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[] = { @@ -7115,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/k_kart.c b/src/k_kart.c index 93cb1aa9e..6be744a88 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10726,6 +10726,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/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_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; From 48f3cea3af883a5dcc23afbcd4325a00ca38399d Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Mon, 31 Mar 2025 22:29:45 +0200 Subject: [PATCH 09/13] Make slipdash actually activate next round lol --- src/k_kart.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index e3bb0fa7f..144defa91 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8818,7 +8818,7 @@ INT16 K_GetKartTurnValue(player_t *player, INT16 turnvalue) turnvalue = FixedMul(turnvalue, adjustangle); // Weight has a small effect on turning - if (cv_kartslipdash.value && K_Sliptiding(player)) // slight handling boost based on weight + 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) @@ -9127,7 +9127,7 @@ static void K_KartDrift(player_t *player, boolean onground) static void K_KartSlipdash(player_t *player, boolean onground) { boolean snaked = player->slipdashdir && player->aizdriftstrat && player->slipdashdir != player->aizdriftstrat; - if (!cv_kartslipdash.value || P_PlayerInPain(player)) + if (!K_SlipdashActive() || P_PlayerInPain(player)) { player->slipdashcharge = 0; player->slipdashdir = 0; From ca9ef29e2a992b2f5a8a42bce2a4be3e248d8fd1 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 31 Mar 2025 18:50:26 -0400 Subject: [PATCH 10/13] Netsync slipdash active --- src/p_saveg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index b7a6f91e4..350d9b23d 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -5093,6 +5093,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++) { @@ -5264,6 +5265,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++) { From b049abe0a747f9b91dab9257a8d82a562fcf9ea9 Mon Sep 17 00:00:00 2001 From: James R Date: Tue, 14 Nov 2023 20:00:19 -0800 Subject: [PATCH 11/13] ArchiveSectors: send diff5 --- src/p_saveg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/p_saveg.c b/src/p_saveg.c index 350d9b23d..35d75090f 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -1339,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) From d767f383a480a88741f5ef789310ee48cc649254 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Mon, 31 Mar 2025 23:51:38 -0400 Subject: [PATCH 12/13] Fix accel sticking after previous accel fix --- src/k_kart.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 144defa91..e4dfbcfdd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -3494,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 From 62dac53cddc92d4223db5f5625f27e1ad5fc4cfc Mon Sep 17 00:00:00 2001 From: NepDisk Date: Tue, 1 Apr 2025 11:10:37 -0400 Subject: [PATCH 13/13] Prevent replays from asserting on start --- src/g_demo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_demo.c b/src/g_demo.c index 52cfdf978..cd3044446 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)