diff --git a/src/d_netcmd.c b/src/d_netcmd.c index 7549a30bf..2ba909895 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -540,8 +540,8 @@ consvar_t cv_kartstacking_bubble_accelboost = CVAR_INIT ("vanillaboost_bubble_ac consvar_t cv_kartstacking_bubble_handleboost = CVAR_INIT ("vanillaboost_bubble_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_bubble_stackable = CVAR_INIT ("vanillaboost_bubble_stackable", "Off", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); -consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.14", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); -consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "6.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_speedval = CVAR_INIT ("vanillaboost_flame_speedval", "0.20", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); +consvar_t cv_kartstacking_flame_accelboost = CVAR_INIT ("vanillaboost_flame_accelboost", "8.0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_handleboost = CVAR_INIT ("vanillaboost_flame_handleboost", "0", CV_NETVAR|CV_CHEAT|CV_FLOAT|CV_GUARD, CV_Unsigned, NULL); consvar_t cv_kartstacking_flame_stackable = CVAR_INIT ("vanillaboost_flame_stackable", "On", CV_NETVAR|CV_GUARD, CV_OnOff, NULL); @@ -713,7 +713,7 @@ consvar_t cv_kartflame_offroadburn = CVAR_INIT ("kartflame_offroadburn", "On", C consvar_t cv_kartaltshrink_arrowbullet = CVAR_INIT ("kart_altshrink_arrowbullet", "On", CV_NETVAR, CV_OnOff, NULL); static CV_PossibleValue_t altshrink_arrowbullet_threshold_cons_t[] = {{0, "MIN"}, {2 * FRACUNIT, "MAX"}, {0, NULL}}; -consvar_t cv_kartaltshrink_arrowbulletthres = CVAR_INIT ("kart_altshrink_arrowbullet_threshold", "1.66", CV_NETVAR|CV_FLOAT, altshrink_arrowbullet_threshold_cons_t, NULL); +consvar_t cv_kartaltshrink_arrowbulletthres = CVAR_INIT ("kart_altshrink_arrowbullet_threshold", "1.45", CV_NETVAR|CV_FLOAT, altshrink_arrowbullet_threshold_cons_t, NULL); static CV_PossibleValue_t kartairsquish_cons_t[] = {{1, "Squish"}, {2, "Flip-over"}, {0, "None"}, {0, NULL}}; consvar_t cv_kartairsquish = CVAR_INIT ("kartairsquish", "None", CV_NETVAR, kartairsquish_cons_t, NULL); @@ -825,6 +825,9 @@ static CV_PossibleValue_t rlplrtrans_cons_t[] = {{0, "MIN"}, {10, "MAX"}, {0, NU // Default is 7 (70% visible; V_30TRANS) consvar_t cv_rouletteplayertrans = CVAR_INIT ("rouletteonplayertrans", "7", CV_SAVE, rlplrtrans_cons_t, NULL); +// Item box visibility; a separate cvar +consvar_t cv_rouletteplayerboxtrans = CVAR_INIT ("rouletteonplayerboxtrans", "10", CV_SAVE, rlplrtrans_cons_t, NULL); + consvar_t cv_showviewpointtext = CVAR_INIT ("showviewpointtext", "On", CV_SAVE, CV_OnOff, NULL); // Intermission time Tails 04-19-2002 @@ -1143,6 +1146,7 @@ void D_RegisterServerCommands(void) CV_RegisterVar(&cv_spinoutroll); CV_RegisterVar(&cv_rouletteonplayer); CV_RegisterVar(&cv_rouletteplayertrans); + CV_RegisterVar(&cv_rouletteplayerboxtrans); CV_RegisterVar(&cv_showlapemblem); CV_RegisterVar(&cv_lapemblemmode); CV_RegisterVar(&cv_racesplits); diff --git a/src/d_netcmd.h b/src/d_netcmd.h index a55ce1258..b75b71cbc 100644 --- a/src/d_netcmd.h +++ b/src/d_netcmd.h @@ -300,7 +300,7 @@ extern consvar_t cv_lapemblemmode; extern consvar_t cv_racesplits; extern consvar_t cv_showviewpointtext; extern consvar_t cv_rouletteonplayer; -extern consvar_t cv_rouletteplayertrans; +extern consvar_t cv_rouletteplayertrans, cv_rouletteplayerboxtrans; extern consvar_t cv_skipmapcheck; diff --git a/src/deh_soc.c b/src/deh_soc.c index 52f360772..ae2e7467b 100644 --- a/src/deh_soc.c +++ b/src/deh_soc.c @@ -3288,6 +3288,10 @@ void readmaincfg(MYFILE *f) { bubbletime = get_number(word2); } + else if (fastcmp(word, "FLAMETIME")) + { + flametime = get_number(word2); + } else if (fastcmp(word, "COMEBACKTIME")) { comebacktime = get_number(word2); diff --git a/src/doomstat.h b/src/doomstat.h index 2f3dde5ae..37540d3af 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -618,6 +618,7 @@ extern INT32 sneakertime; extern INT32 waterpaneltime; extern INT32 itemtime; extern INT32 bubbletime; +extern INT32 flametime;; extern INT32 comebacktime; extern INT32 bumptime; extern INT32 greasetics; diff --git a/src/g_game.c b/src/g_game.c index fc809bad0..9a6b3c6af 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -264,6 +264,7 @@ INT32 greasetics = 3*TICRATE; INT32 wipeoutslowtime = 20; INT32 wantedreduce = 5*TICRATE; INT32 wantedfrequency = 10*TICRATE; +INT32 flametime = (((8*TICRATE)*3) + (2*TICRATE)); UINT8 use1upSound = 0; UINT8 maxXtraLife = 2; // Max extra lives from rings diff --git a/src/k_hud.c b/src/k_hud.c index e62e44b9a..68410c90c 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -1590,6 +1590,7 @@ static void K_drawKartItem(void) INT32 hudtrans = V_GetHudTrans(); INT32 transflag = (fade) ? V_HUDTRANSHALF : V_HUDTRANS; + INT32 boxtransflag = V_HUDTRANS; INT32 transmul = FRACUNIT - (hudtrans * FRACUNIT / 10); if (hudtrans > 9) @@ -1600,6 +1601,7 @@ static void K_drawKartItem(void) // Let the player pick and choose their visibility level. INT32 roulettetrans = cv_rouletteplayertrans.value; + INT32 boxtrans = cv_rouletteplayerboxtrans.value; // RadioRacers if (shouldDrawOnPlayer) @@ -1625,7 +1627,10 @@ static void K_drawKartItem(void) } if (stplyr->exiting) + { roulettetrans = -1; + boxtrans = -1; + } if (roulettetrans > -1) { @@ -1635,6 +1640,15 @@ static void K_drawKartItem(void) { transflag = (fade) ? V_HUDTRANSHALF : V_HUDTRANS; } + + if (boxtrans > -1) + { + boxtransflag = max(0, min(9, 10 - FixedMul(boxtrans, transmul))) << V_ALPHASHIFT; + } + else + { + boxtransflag = V_HUDTRANS; + } } @@ -1644,6 +1658,7 @@ static void K_drawKartItem(void) flipamount = info.flipamount; INT32 localpatchflags = (transflag|fflags); + INT32 boxpatchflags = (boxtransflag|fflags); if (localcolor != SKINCOLOR_NONE) { @@ -1657,7 +1672,7 @@ static void K_drawKartItem(void) if (K_UseColorHud()) colormap = R_GetTranslationColormap(TC_DEFAULT, K_GetHudColor(), GTC_CACHE); - V_DrawFixedPatch(fx << FRACBITS, fy << FRACBITS, info.hudScale, V_HUDTRANS|fflags, localbg, colormap); + V_DrawFixedPatch(fx << FRACBITS, fy << FRACBITS, info.hudScale, boxpatchflags, localbg, colormap); // Then, the numbers: if (stplyr->itemamount >= K_GetItemNumberDisplayMin(stplyr->itemtype, tiny) && !stplyr->itemroulette) diff --git a/src/k_items.c b/src/k_items.c index d97e72026..16f0b368c 100644 --- a/src/k_items.c +++ b/src/k_items.c @@ -2547,7 +2547,7 @@ void K_PlayerItemThink(player_t *player, boolean onground) if (ATTACK_IS_DOWN && !HOLDING_ITEM && NO_HYUDORO && K_GetShieldFromPlayer(player) != KSHIELD_FLAME) { player->itemamount--; - player->flametimer = (itemtime*3); + player->flametimer = flametime; player->flamedash = 0; mobj_t *shield = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z, MT_FLAMESHIELD); P_SetScale(shield, (shield->destscale = (5*shield->destscale)>>2)); diff --git a/src/k_kart.c b/src/k_kart.c index 3b66e80a6..a31063e81 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -529,7 +529,6 @@ fixed_t K_GetKartGameSpeedScalar(SINT8 value) static fixed_t K_PlayerWeight(mobj_t* mobj, mobj_t* against) { fixed_t weight = 5 * FRACUNIT; - fixed_t bubbleMultiplier = FRACUNIT; if (!mobj->player) return weight; @@ -579,11 +578,6 @@ static fixed_t K_PlayerWeight(mobj_t* mobj, mobj_t* against) weight = FixedMul(weight, FRACUNIT / 16); } - if (bubbleMultiplier) - { - weight = FixedMul(weight, bubbleMultiplier); - } - if (mobj->player->speed > spd) weight += (mobj->player->speed - spd) / 8; @@ -6923,8 +6917,9 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) const INT32 heavydropassistmin = TICRATE/2; const INT32 heavydropassistmax = 3*TICRATE/2; - const INT32 airbrakedelay_heavy = TICRATE/8; + // in fusion, extend heavy airdrop's delay slightly so light airdrop isn't totally useless const INT32 airbrakedelay_light = TICRATE/3; + const INT32 airbrakedelay_heavy = airdropactive == AIRDROP_FUSION ? 3*airbrakedelay_light/5 : TICRATE/8; if (P_IsObjectOnGround(player->mo)) { @@ -6935,12 +6930,19 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) player->airdropbuffer--; } - if ((cmd->buttons & BT_BRAKE)) + UINT16 buttons = cmd->buttons; + + // kickstart needs a little special treatment in fusion... + // heavy airdrop should be the two-button input, not light airdrop + if (airdropactive == AIRDROP_FUSION && player->pflags & PF_KICKSTARTACCEL) + buttons ^= BT_ACCELERATE; + + if (buttons & BT_BRAKE) { // don't buffer heavy airdrops on the ground to prevent silly mistakes // but do allow buffering in the air (still) to compensate for the added delay if ((!P_IsObjectOnGround(player->mo) && !(player->airdropflags & PAF_AIRDROPINPUT)) - || (airdropactive != AIRDROP_HEAVY && !(airdropactive == AIRDROP_FUSION && !(cmd->buttons & BT_ACCELERATE)))) + || (airdropactive != AIRDROP_HEAVY && !(airdropactive == AIRDROP_FUSION && !(buttons & BT_ACCELERATE)))) { player->airdropflags |= PAF_WANTSAIRDROP; player->airdropbuffer = 2; @@ -6973,7 +6975,7 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) { if ((player->airdropflags & PAF_AIRDROP_HEAVY)) { - P_PlayerRingBurst(player, CLAMP(player->rings, 0, 3)); + P_PlayerRingBurst(player, CLAMP(player->rings, 0, 2)); if (player->airdroptime > 1) { @@ -7003,12 +7005,13 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) if (player->airdropflags & PAF_WANTSAIRDROP) { - if (((airdropactive == AIRDROP_LIGHT) || (airdropactive == AIRDROP_FUSION && (cmd->buttons & BT_ACCELERATE))) && player->airdroppredelay >= airbrakedelay_light) + if (airdropactive == AIRDROP_LIGHT || (airdropactive == AIRDROP_FUSION && buttons & BT_ACCELERATE)) { - player->airdropflags |= PAF_AIRDROP_LIGHT; + if (player->airdroppredelay >= airbrakedelay_light) + player->airdropflags |= PAF_AIRDROP_LIGHT; } - else if ((airdropactive == AIRDROP_HEAVY || airdropactive == AIRDROP_FUSION) && player->airdroppredelay >= (airdropactive == AIRDROP_FUSION ? airbrakedelay_light : airbrakedelay_heavy) && - !(player->airdropflags & (PAF_AIRDROP_HEAVY)) && !(player->mo->eflags & MFE_GOOWATER)) // in fusion, fires if brake is held but not accel, and has the same delay as light airdrop (this makes it feel really really stiff but we're sacking feel for balance with light drop here 🥲) + else if ((airdropactive == AIRDROP_HEAVY || airdropactive == AIRDROP_FUSION) && player->airdroppredelay >= airbrakedelay_heavy + && !(player->airdropflags & PAF_AIRDROP_HEAVY) && !(player->mo->eflags & MFE_GOOWATER)) { player->airdropflags |= PAF_AIRDROP_HEAVY; player->airdroptime = 0; @@ -7017,9 +7020,11 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) S_StartSound(player->mo, sfx_s3k77); S_StartSound(player->mo, sfx_s3k51); - player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100); - player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100); - player->mo->momz -= 10*P_MobjFlip(player->mo)*mapobjectscale; + player->mo->momx = FixedMul(player->mo->momx, 17*FRACUNIT/20); + player->mo->momy = FixedMul(player->mo->momy, 17*FRACUNIT/20); + + // extra strong on ramp jumps! + player->mo->momz -= P_MobjFlip(player->mo) * max(10*mapobjectscale, player->mo->momz/3); } } else @@ -7035,18 +7040,8 @@ static void K_AirDrop(player_t *player, ticcmd_t *cmd) // hi-power is considerably shorter in fusion const boolean high = player->airdroptime <= ((airdropactive == AIRDROP_FUSION) ? heavydrophipowertime_fusion : heavydrophipowertime); - if (airdropactive == AIRDROP_FUSION) - { - player->mo->momx = FixedMul(player->mo->momx, (high ? 98 : 99)*FRACUNIT/100); - player->mo->momy = FixedMul(player->mo->momy, (high ? 98 : 99)*FRACUNIT/100); - } - else if (!player->airdroptime) - { - // cut momentum once on start, it should feel particularily snappy when only being able to use heavy - player->mo->momx = FixedMul(player->mo->momx, 90*FRACUNIT/100); - player->mo->momy = FixedMul(player->mo->momy, 90*FRACUNIT/100); - } - + player->mo->momx = FixedMul(player->mo->momx, FRACUNIT - FRACUNIT/300); + player->mo->momy = FixedMul(player->mo->momy, FRACUNIT - FRACUNIT/300); player->mo->momz -= FixedMul((high ? 4 : 2)*gravity, mapobjectscale)*P_MobjFlip(player->mo); K_SpawnFallLines(player, high); diff --git a/src/lua_script.c b/src/lua_script.c index 18a193148..750f32980 100644 --- a/src/lua_script.c +++ b/src/lua_script.c @@ -488,6 +488,9 @@ int LUA_PushGlobals(lua_State *L, const char *word) } else if (fastcmp(word, "bubbletime")) { lua_pushinteger(L, bubbletime); return 1; + } else if (fastcmp(word, "flametime")) { + lua_pushinteger(L, flametime); + return 1; } else if (fastcmp(word, "comebacktime")) { lua_pushinteger(L, comebacktime); return 1; @@ -598,6 +601,8 @@ int LUA_WriteGlobals(lua_State *L, const char *word) waterpaneltime = (INT32)luaL_checkinteger(L, 2); else if (fastcmp(word, "bubbletime")) bubbletime = (INT32)luaL_checkinteger(L, 2); + else if (fastcmp(word, "flametime")) + flametime = (INT32)luaL_checkinteger(L, 2); else if (fastcmp(word, "comebacktime")) comebacktime = (INT32)luaL_checkinteger(L, 2); else if (fastcmp(word, "greasetics"))