From aa44b140e20d69fb3050399cd5105e40900e8771 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 2 May 2025 12:02:56 -0400 Subject: [PATCH] WIP: Bail --- src/d_player.h | 2 ++ src/k_hitlag.c | 3 +++ src/k_kart.c | 66 ++++++++++++++++++++++++++++++++++++++++++++- src/k_kart.h | 4 +++ src/lua_playerlib.c | 4 +++ src/p_enemy.c | 2 +- src/p_inter.c | 2 +- src/p_local.h | 1 + src/p_saveg.cpp | 4 +++ 9 files changed, 85 insertions(+), 3 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 16339b32a..8e63357f5 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1081,6 +1081,8 @@ struct player_t UINT16 progressivethrust; // When getting beat up in GTR_BUMPERS, speed up the longer you've been out of control. UINT8 ringvisualwarning; // Check with > 1, not >= 1! Set when put in debt, counts down and holds at 1 when still in debt. + UINT32 baildrop; + boolean analoginput; // Has an input been recorded that requires analog usage? For input display. boolean markedfordeath; diff --git a/src/k_hitlag.c b/src/k_hitlag.c index 9110f1845..ca891eb04 100644 --- a/src/k_hitlag.c +++ b/src/k_hitlag.c @@ -34,6 +34,9 @@ void K_AddHitLag(mobj_t *mo, INT32 tics, boolean fromDamage) return; } + if (mo->player && mo->player->overshield) + tics = min(tics, 3); + mo->hitlag += tics; mo->hitlag = min(mo->hitlag, MAXHITLAGTICS); diff --git a/src/k_kart.c b/src/k_kart.c index 5ac1ba0ad..6d260e732 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9998,6 +9998,16 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->cangrabitems && player->cangrabitems <= EARLY_ITEM_FLICKER) player->cangrabitems++; + if (player->baildrop) + { + if ((player->baildrop % BAIL_DROPFREQUENCY) == 0) + { + P_FlingBurst(player, K_MomentumAngle(player->mo), MT_FLINGRING, 60*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); + S_StartSound(player->mo, sfx_gshad); + } + player->baildrop--; + } + if (!player->invincibilitytimer) player->invincibilityextensions = 0; @@ -10147,7 +10157,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->nextringaward >= ringrate) { - if (player->instaWhipCharge) + if (player->instaWhipCharge || player->baildrop) { // Store award rings to do diabolical horseshit with later. player->nextringaward = ringrate; @@ -13887,6 +13897,60 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } + if ((player->cmd.buttons & BT_VOTE) && !(player->oldcmd.buttons & BT_VOTE) + && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) + { + UINT32 totalrings = player->rings + player->superring + player->pickuprings; + totalrings = max(totalrings, 0); + UINT32 bailboost = FixedInt(FixedMul(totalrings*FRACUNIT, BAIL_BOOST)); + UINT32 baildrop = FixedInt(FixedMul(totalrings*FRACUNIT, BAIL_DROP)); + + if (player->itemRoulette.active) + { + player->itemRoulette.active = false; + } + + K_PopPlayerShield(player); + + if (player->itemamount) + { + K_DropPaperItem(player, player->itemtype, player->itemamount); + player->itemtype = player->itemamount = 0; + } + + + player->rings = min(player->rings, 0); + player->superring = 0; + player->pickuprings = 0; + player->ringboxaward = 0; + player->ringboxdelay = 0; + + player->superringdisplay = 0; + player->superringalert = 0; + player->superringpeak = 0; + + player->counterdash += TICRATE/8; + + player->ringboost += bailboost * (3+K_GetKartRingPower(player, true)); + player->baildrop = baildrop * BAIL_DROPFREQUENCY + 1; + + K_AddHitLag(player->mo, TICRATE/4, false); + mobj_t *broly = Obj_SpawnBrolyKi(player->mo, player->mo->hitlag); + broly->extravalue2 = 16*mapobjectscale; + + INT32 fls = K_GetEffectiveFollowerSkin(player); + if (player->follower && fls >= 0 && fls < numfollowers) + { + const follower_t *fl = &followers[fls]; + S_StartSound(NULL, fl->hornsound); + } + + if (player->amps > 0) + K_DefensiveOverdrive(player); + + S_StartSound(player->mo, sfx_gshdd); + } + if (player && player->mo && K_PlayerCanUseItem(player)) { // First, the really specific, finicky items that function without the item being directly in your item slot. diff --git a/src/k_kart.h b/src/k_kart.h index 9d9f3fdf8..2d07490ac 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -44,6 +44,10 @@ Make sure this matches the actual number of states #define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define PUNISHWINDOW (7*TICRATE/10) +#define BAIL_DROP (FRACUNIT/2) +#define BAIL_BOOST (FRACUNIT/4) +#define BAIL_DROPFREQUENCY (3) + #define MAXCOMBOTHRUST (mapobjectscale*20) #define MAXCOMBOFLOAT (mapobjectscale*10) #define MINCOMBOTHRUST (mapobjectscale*2) diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 1a7d199c0..214eaae8b 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -284,6 +284,8 @@ static int player_get(lua_State *L) lua_pushboolean(L, plr->progressivethrust); else if (fastcmp(field,"ringvisualwarning")) lua_pushboolean(L, plr->ringvisualwarning); + else if (fastcmp(field,"baildrop")) + lua_pushboolean(L, plr->baildrop); else if (fastcmp(field,"dotrickfx")) lua_pushboolean(L, plr->dotrickfx); else if (fastcmp(field,"stingfx")) @@ -910,6 +912,8 @@ static int player_set(lua_State *L) plr->progressivethrust = luaL_checkboolean(L, 3); else if (fastcmp(field,"ringvisualwarning")) plr->ringvisualwarning = luaL_checkboolean(L, 3); + else if (fastcmp(field,"baildrop")) + plr->baildrop = luaL_checkinteger(L, 3); else if (fastcmp(field,"analoginput")) plr->analoginput = luaL_checkboolean(L, 3); else if (fastcmp(field,"transfer")) diff --git a/src/p_enemy.c b/src/p_enemy.c index 3006b7369..00f341128 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3503,7 +3503,7 @@ void A_AttractChase(mobj_t *actor) if (actor->extravalue1 && actor->type != MT_EMERALD) // SRB2Kart { - if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player) + if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player || actor->target->player->baildrop) { P_RemoveMobj(actor); return; diff --git a/src/p_inter.c b/src/p_inter.c index 04a05ce4c..fce601eae 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -3612,7 +3612,7 @@ boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 da #define RING_LAYER_SIDE_SIZE (3) #define RING_LAYER_SIZE (RING_LAYER_SIDE_SIZE * 2) -static void P_FlingBurst +void P_FlingBurst ( player_t *player, angle_t fa, mobjtype_t objType, diff --git a/src/p_local.h b/src/p_local.h index af4f722bf..6524dd69c 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -549,6 +549,7 @@ void P_RampConstant(const BasicFF_t *FFInfo, INT32 Start, INT32 End); void P_SpecialStageDamage(player_t *player, mobj_t *inflictor, mobj_t *source); boolean P_DamageMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, INT32 damage, UINT8 damagetype); void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damagetype); +void P_FlingBurst(player_t *player, angle_t fa, mobjtype_t objType, tic_t objFuse, fixed_t objScale, INT32 i); void P_PlayerRingBurst(player_t *player, INT32 num_rings); /// \todo better fit in p_user.c void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck); diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 98e544cd4..c038c1ba4 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -667,6 +667,8 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT16(save->p, players[i].progressivethrust); WRITEUINT8(save->p, players[i].ringvisualwarning); + WRITEUINT32(save->p, players[i].baildrop); + WRITEUINT8(save->p, players[i].analoginput); WRITEUINT8(save->p, players[i].markedfordeath); @@ -1322,6 +1324,8 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].progressivethrust = READUINT16(save->p); players[i].ringvisualwarning = READUINT8(save->p); + players[i].baildrop = READUINT32(save->p); + players[i].analoginput = READUINT8(save->p); players[i].markedfordeath = READUINT8(save->p);