From a368d6e18f1af1888c95b366d353ac27aa385af5 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 17 Sep 2025 17:27:48 -0400 Subject: [PATCH 1/6] RC3 fast balance --- src/g_game.c | 2 +- src/k_kart.c | 12 +++++++++++- src/k_kart.h | 4 ++-- src/k_roulette.c | 6 +++--- src/objects/orbinaut.c | 7 +------ src/p_enemy.c | 4 ++-- src/p_inter.c | 39 ++++++++++++++++++++++++++------------- src/p_mobj.c | 2 +- src/p_spec.c | 5 +++++ 9 files changed, 52 insertions(+), 29 deletions(-) diff --git a/src/g_game.c b/src/g_game.c index 88f64d126..5604e1bc6 100644 --- a/src/g_game.c +++ b/src/g_game.c @@ -2454,7 +2454,7 @@ void G_PlayerReborn(INT32 player, boolean betweenmaps) } else { - rings = 20; // POSITION is fucking serious now + rings = 10; // Never mind, people love serious POSITION } saveroundconditions = false; diff --git a/src/k_kart.c b/src/k_kart.c index fd627bcf0..4a396ac2c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10747,6 +10747,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) UINT32 bailboost = FixedInt(FixedMul(totalrings*FRACUNIT, BAIL_BOOST)); UINT32 baildrop = FixedInt(FixedMul((totalrings)*FRACUNIT, BAIL_DROP)); + // CONS_Printf("R=%d SR=%d PR=%d DR=%d TR=%d\n", player->rings, player->superring, player->pickuprings, debtrings, totalrings); + player->rings = -20; player->superring = 0; player->pickuprings = 0; @@ -10760,6 +10762,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Below: The stun the player gets from bailing is reduced as a pity if you did it out of Burst. Longer charge, shorter stun. player->stunned = BAILSTUN - player->bailcharge*5/4; // note: bailcharge goes up by 2 every tic, not 1, so this is actually - charge duration *2 player->bailcharge = 0; + player->defenseLockout = 2*PUNISHWINDOW; player->ringboost += bailboost * (3+K_GetKartRingPower(player, true)); player->baildrop += baildrop * BAIL_DROPFREQUENCY + 1; @@ -11647,6 +11650,13 @@ void K_KartResetPlayerColor(player_t *player) } } + if (player->baildrop && (leveltime%4 == 0)) + { + player->mo->colorized = true; + player->mo->color = SKINCOLOR_BLACK; + goto finalise; + } + if (player->eggmanTransferDelay) { player->mo->colorized = true; @@ -14841,7 +14851,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) S_StartSound(player->mo, sfx_s3k7b); player->bailcharge = 0; } - else if ((player->itemtype && player->itemamount) || player->rings > 0 || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active) + else if ((player->itemtype && player->itemamount) || (player->rings + player->superring + player->pickuprings > 0) || player->itemRoulette.active) { // Set up bail charge, provided we have something to bail with (any rings or item resource). // boolean grounded = P_IsObjectOnGround(player->mo); diff --git a/src/k_kart.h b/src/k_kart.h index c54d3f9f3..d9ca6c6c3 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -42,12 +42,12 @@ Make sure this matches the actual number of states #define INSTAWHIP_HOLD_DELAY (TICRATE*2) // MUST be longer or equal to INSTAWHIP_CHARGETIME. #define INSTAWHIP_TETHERBLOCK (TICRATE*4) -#define PUNISHWINDOW (7*TICRATE/10) +#define PUNISHWINDOW (10*TICRATE/10) #define BAIL_MAXCHARGE (84) // tics to bail when in painstate nad in air, on ground is half, if you touch this, also update Obj_BailChargeThink synced animation logic #define BAIL_DROP (FRACUNIT) // How many rings it has to drop before stun starts #define BAIL_BOOST (6*FRACUNIT/5) // How fast bail itself is -#define BAIL_CREDIT_DEBTRINGS (true) +#define BAIL_CREDIT_DEBTRINGS (true) #define BAIL_DROPFREQUENCY (2) // How quickly the rings spill out #define BAILSTUN (TICRATE*6) // The fixed length of stun after baildrop is over diff --git a/src/k_roulette.c b/src/k_roulette.c index e3db1838a..73e05f3ba 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -91,7 +91,7 @@ static UINT32 K_DynamicItemOddsRace[NUMKARTRESULTS-1][2] = {1, 3}, // landmine {25, 3}, // ballhog {58, 6}, // selfpropelledbomb - {55, 7}, // grow + {60, 7}, // grow {70, 8}, // shrink {1, 1}, // lightningshield {25, 4}, // bubbleshield @@ -1540,7 +1540,7 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo // A lot of items suck if no players are nearby to interact with them. // Should we bias towards items that get us back to the action? // This will set the "loneliness" percentage to be used later. - UINT32 lonelinessThreshold = 3*DISTVAR; // How far away can we be before items are considered useless? + UINT32 lonelinessThreshold = 4*DISTVAR; // How far away can we be before items are considered useless? UINT32 toFront = lonelinessThreshold; // Distance to the player trying to kill us. UINT32 toBack = lonelinessThreshold; // Distance to the player we are trying to kill. fixed_t loneliness = 0; @@ -1662,7 +1662,7 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo // Conversely, if we're lonely, try not to reselect an item that wouldn't be useful to us // without any players to use it on. if (!K_IsItemSpeed(bestitem)) - deltapenalty = Easing_Linear(loneliness, deltapenalty, 5*deltapenalty); + deltapenalty = Easing_Linear(loneliness, deltapenalty, 3*deltapenalty); // Draw complex odds debugger. This one breaks down all the calcs in order. if (cv_kartdebugdistribution.value > 1) diff --git a/src/objects/orbinaut.c b/src/objects/orbinaut.c index 9767f49f1..32f11603a 100644 --- a/src/objects/orbinaut.c +++ b/src/objects/orbinaut.c @@ -218,12 +218,7 @@ boolean Obj_OrbinautJawzCollide(mobj_t *t1, mobj_t *t2) if ((t1->type == MT_ORBINAUT_SHIELD || t1->type == MT_JAWZ_SHIELD) && !t2->player->invincibilitytimer && !K_IsBigger(t2, t1)) // UGH. Stumble ignores invinc. Fix this damage type someday. { - // Same hack as Instawhip! - // If you do this a third time, please make it a part of the damage system. - // ^ remove all of P_DamageMobj and start over - P_PlayRinglossSound(t2); - P_PlayerRingBurst(t2->player, 5); - P_DamageMobj(t2, t1, t1->target, 1, DMG_WOMBO | DMG_WHUMBLE); + P_DamageMobj(t2, t1, t1->target, 1, DMG_WOMBO | DMG_STUMBLE); } else { diff --git a/src/p_enemy.c b/src/p_enemy.c index 761931ec6..8c6aed7c1 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3515,9 +3515,9 @@ void A_AttractChase(mobj_t *actor) // 2. ALL conditions that deleted flingrings off you didn't decrement pickuprings, desyncing your ring count boolean stale = (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player); - boolean blocked = (actor->target->player->baildrop || actor->target->player->bailcharge); + boolean blocked = (actor->target->player->baildrop); if (G_CompatLevel(0x0010)) - blocked |= (actor->target->player->defenseLockout > PUNISHWINDOW); + blocked |= !!(actor->target->player->bailcharge || actor->target->player->defenseLockout > PUNISHWINDOW); if (stale || blocked) { diff --git a/src/p_inter.c b/src/p_inter.c index 0055fd139..1efc263bd 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3102,6 +3102,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da boolean clash = false; sfxenum_t sfx = sfx_None; + CONS_Printf("unforced case\n"); + if (!(gametyperules & GTR_BUMPERS)) { if (damagetype & DMG_STEAL) @@ -3130,6 +3132,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else if (player->overshield && (type != DMG_EXPLODE || inflictor->type != MT_SPBEXPLOSION || !inflictor->movefactor)) { + CONS_Printf("overshield case\n"); clash = true; } else if (player->hyudorotimer > 0) @@ -3151,6 +3154,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da clash = false; } + CONS_Printf("invinc=%d clash=%d ad=%d type=%d whumb=%d\n", invincible, clash, player->pflags2 & PF2_ALWAYSDAMAGED, type, DMG_WHUMBLE); + // TODO: doing this from P_DamageMobj limits punting to objects that damage the player. // And it may be kind of yucky. // But this is easier than accounting for every condition in PIT_CheckThing! @@ -3159,8 +3164,11 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; } - if (invincible && type != DMG_STUMBLE && type != DMG_WHUMBLE) + CONS_Printf("xd\n"); + + if (invincible && type != DMG_WHUMBLE) { + CONS_Printf("invinc case\n"); const INT32 oldHitlag = target->hitlag; const INT32 oldHitlagInflictor = inflictor ? inflictor->hitlag : 0; @@ -3195,6 +3203,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (clash) { + CONS_Printf("clash case\n"); player->spheres = max(player->spheres - 5, 0); if (inflictor) @@ -3214,7 +3223,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da K_DoInstashield(player); return false; } - { // Check if we should allow wombo combos (hard hits by default, inverted by the presence of DMG_WOMBO). boolean allowcombo = ((hardhit || (type == DMG_STUMBLE || type == DMG_WHUMBLE)) == !(damagetype & DMG_WOMBO)); @@ -3289,6 +3297,14 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (type == DMG_STING || type == DMG_STUMBLE) { damage = 0; + + if (source && source != player->mo && source->player) + { + if (!P_PlayerInPain(player) && (player->defenseLockout || player->instaWhipCharge)) + { + K_SpawnAmps(source->player, 20, target); + } + } } else { @@ -3461,6 +3477,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da && inflictor->type != MT_BANANA) // Are there other designed trap items that can be deployed and dropped? If you add one, list it here! { type = DMG_STUMBLE; + downgraded = true; player->ringburst += 5; // IT'S THE DAMAGE STUMBLE HACK AGAIN AAAAAAAAHHHHHHHHHHH K_PopPlayerShield(player); } @@ -3499,7 +3516,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da case DMG_STUMBLE: case DMG_WHUMBLE: K_StumblePlayer(player); - ringburst = 0; + ringburst = 5; break; case DMG_TUMBLE: K_TumblePlayer(player, inflictor, source, softenTumble); @@ -3526,22 +3543,18 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da ringburst = 0; } + player->ringburst += ringburst; + + K_PopPlayerShield(player); + if ((type != DMG_STUMBLE && type != DMG_WHUMBLE) || (type == DMG_STUMBLE && downgraded)) { if (type != DMG_STING) player->flashing = K_GetKartFlashing(player); - - player->ringburst += ringburst; - - K_PopPlayerShield(player); player->instashield = 15; + } - K_PlayPainSound(target, source); - } - else if (inflictor && inflictor->type == MT_INSTAWHIP) - { - K_PopPlayerShield(player); - } + K_PlayPainSound(target, source); if (gametyperules & GTR_BUMPERS) player->spheres = min(player->spheres + 10, 40); diff --git a/src/p_mobj.c b/src/p_mobj.c index c945a281b..493bf2a89 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8399,7 +8399,7 @@ static boolean P_MobjRegularThink(mobj_t *mobj) P_MoveOrigin(mobj, mobj->target->x + FixedMul(34 * mapobjectscale, FINECOSINE((mobj->angle + mobj->movedir) >> ANGLETOFINESHIFT)), mobj->target->y + FixedMul(34 * mapobjectscale, FINESINE((mobj->angle + mobj->movedir) >> ANGLETOFINESHIFT)), - mobj->z + (32 * mapobjectscale)); + mobj->target->z + (32 * mapobjectscale)); K_MatchGenericExtraFlags(mobj, mobj->target); diff --git a/src/p_spec.c b/src/p_spec.c index 2212a5b6d..5c0484705 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -5422,7 +5422,12 @@ static void P_EvaluateDamageType(player_t *player, sector_t *sector, boolean isT break; case SD_STUMBLE: if (isTouching) + { + player->pflags2 |= PF2_ALWAYSDAMAGED; P_DamageMobj(player->mo, NULL, NULL, 1, DMG_STUMBLE); + player->pflags2 &= ~PF2_ALWAYSDAMAGED; + } + break; default: break; From 830a25b24d43b0269f31246ceee3538ccedb9eb0 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 17 Sep 2025 17:35:01 -0400 Subject: [PATCH 2/6] Remove debug print --- src/p_inter.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 1efc263bd..75eb9df58 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3102,8 +3102,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da boolean clash = false; sfxenum_t sfx = sfx_None; - CONS_Printf("unforced case\n"); - if (!(gametyperules & GTR_BUMPERS)) { if (damagetype & DMG_STEAL) @@ -3164,11 +3162,8 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da return false; } - CONS_Printf("xd\n"); - if (invincible && type != DMG_WHUMBLE) { - CONS_Printf("invinc case\n"); const INT32 oldHitlag = target->hitlag; const INT32 oldHitlagInflictor = inflictor ? inflictor->hitlag : 0; From 3941e088ad037760b09bdb12e3b3515b13384e01 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 17 Sep 2025 18:19:53 -0400 Subject: [PATCH 3/6] Remove more debug print --- src/p_inter.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/p_inter.c b/src/p_inter.c index 75eb9df58..24148fabb 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3130,7 +3130,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da else if (player->overshield && (type != DMG_EXPLODE || inflictor->type != MT_SPBEXPLOSION || !inflictor->movefactor)) { - CONS_Printf("overshield case\n"); clash = true; } else if (player->hyudorotimer > 0) @@ -3152,8 +3151,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da clash = false; } - CONS_Printf("invinc=%d clash=%d ad=%d type=%d whumb=%d\n", invincible, clash, player->pflags2 & PF2_ALWAYSDAMAGED, type, DMG_WHUMBLE); - // TODO: doing this from P_DamageMobj limits punting to objects that damage the player. // And it may be kind of yucky. // But this is easier than accounting for every condition in PIT_CheckThing! From 45d5993bea4ddcc67f41c7d4a227609cb1250891 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 17 Sep 2025 18:28:06 -0400 Subject: [PATCH 4/6] Maybe I should write a post-commit hook that removes my debug print --- src/p_inter.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/p_inter.c b/src/p_inter.c index 24148fabb..f7fe838df 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3195,7 +3195,6 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da if (clash) { - CONS_Printf("clash case\n"); player->spheres = max(player->spheres - 5, 0); if (inflictor) From a0b6b93714380f9aecfece21ae70772035066c64 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 17 Sep 2025 19:08:59 -0400 Subject: [PATCH 5/6] Don't zero pickuprings when bailing, extra safe bail ringlock --- 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 4a396ac2c..5eaf27138 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10726,6 +10726,8 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) S_StartSound(pmo, sfx_gshad); } + player->rings = -20; + player->baildrop--; if (player->baildrop == 0) player->ringboost /= 3; @@ -10751,7 +10753,6 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->rings = -20; player->superring = 0; - player->pickuprings = 0; player->ringboxaward = 0; player->ringboxdelay = 0; player->superringdisplay = 0; From 96582f628fe606e1e48cf3d35b1fc3cc54d8a6b1 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 17 Sep 2025 19:50:20 -0400 Subject: [PATCH 6/6] Item distance tweaking, small First Blood nerf --- src/k_roulette.c | 2 +- src/p_spec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/k_roulette.c b/src/k_roulette.c index 73e05f3ba..c0f5c7dcb 100644 --- a/src/k_roulette.c +++ b/src/k_roulette.c @@ -1426,7 +1426,7 @@ void K_FillItemRouletteData(player_t *player, itemroulette_t *const roulette, bo // 5: Skim any items that are much weaker than the reel's average out of the roulette // 6: Cram it all in - fixed_t largegamescaler = roulette->playing * 10 + 100; // Spread out item odds in large games for a less insane experience. + fixed_t largegamescaler = roulette->playing * 14 + 100; // Spread out item odds in large games for a less insane experience. UINT32 targetpower = 100 * roulette->dist / largegamescaler; // fill roulette with items around this value! UINT32 powers[NUMKARTRESULTS]; // how strong is each item? think of this as a "target distance" for this item to spawn at diff --git a/src/p_spec.c b/src/p_spec.c index 5c0484705..430c7f373 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -2075,7 +2075,7 @@ static void K_HandleLapIncrement(player_t *player) K_SpawnDriftBoostExplosion(player, 4); K_SpawnDriftElectricSparks(player, SKINCOLOR_SILVER, false); if (!G_TimeAttackStart()) - K_SpawnAmps(player, (K_InRaceDuel()) ? 20 : 35, player->mo); + K_SpawnAmps(player, (K_InRaceDuel()) ? 20 : 20, player->mo); if (g_teamplay) {