From aa44b140e20d69fb3050399cd5105e40900e8771 Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 2 May 2025 12:02:56 -0400 Subject: [PATCH 01/30] 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); From 92e4bb5909b6ca0f1d50db02de586fe6387808bb Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Fri, 2 May 2025 13:02:40 -0400 Subject: [PATCH 02/30] Bail refinement --- src/k_kart.c | 48 ++++++++++++++++++++++++++++++++++++++++++++---- src/k_kart.h | 2 +- src/p_inter.c | 11 +++++++++++ 3 files changed, 56 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 6d260e732..b8346431a 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -7772,6 +7772,30 @@ void K_PopPlayerShield(player_t *player) K_UnsetItemOut(player); } +static void K_DeleteHnextList(player_t *player) +{ + mobj_t *work = player->mo, *nextwork; + + if (work == NULL || P_MobjWasRemoved(work)) + { + return; + } + + nextwork = work->hnext; + + while ((work = nextwork) && !(work == NULL || P_MobjWasRemoved(work))) + { + nextwork = work->hnext; + + if (!work->health) + continue; // taking care of itself + + K_SpawnLandMineExplosion(work, player->skincolor, player->mo->hitlag); + + P_RemoveMobj(work); + } +} + void K_DropHnextList(player_t *player) { mobj_t *work = player->mo, *nextwork, *dropwork; @@ -10002,7 +10026,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) { if ((player->baildrop % BAIL_DROPFREQUENCY) == 0) { - P_FlingBurst(player, K_MomentumAngle(player->mo), MT_FLINGRING, 60*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); + P_FlingBurst(player, K_MomentumAngle(player->mo), MT_FLINGRING, 10*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); S_StartSound(player->mo, sfx_gshad); } player->baildrop--; @@ -13900,10 +13924,20 @@ 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)) { + CONS_Printf("rl %d it %d ia %d ri %d sr %d pr %d\n", player->itemRoulette.active, player->itemtype, player->itemamount, player->rings > 0, player->superring > 0, player->pickuprings > 0); + + + UINT32 debtrings = 20; + if (player->rings < 0) + { + debtrings -= player->rings; + player->rings = 0; + } + 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)); + UINT32 baildrop = debtrings + FixedInt(FixedMul((totalrings)*FRACUNIT, BAIL_DROP)); if (player->itemRoulette.active) { @@ -13911,15 +13945,21 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } K_PopPlayerShield(player); + K_DeleteHnextList(player); + K_DropItems(player); + player->itemamount = 0; + player->itemtype = 0; + + /* if (player->itemamount) { K_DropPaperItem(player, player->itemtype, player->itemamount); player->itemtype = player->itemamount = 0; } + */ - - player->rings = min(player->rings, 0); + player->rings = -20; player->superring = 0; player->pickuprings = 0; player->ringboxaward = 0; diff --git a/src/k_kart.h b/src/k_kart.h index 2d07490ac..9750f38c5 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -45,7 +45,7 @@ Make sure this matches the actual number of states #define PUNISHWINDOW (7*TICRATE/10) #define BAIL_DROP (FRACUNIT/2) -#define BAIL_BOOST (FRACUNIT/4) +#define BAIL_BOOST (FRACUNIT/3) #define BAIL_DROPFREQUENCY (3) #define MAXCOMBOTHRUST (mapobjectscale*20) diff --git a/src/p_inter.c b/src/p_inter.c index fce601eae..d71b587e8 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -723,6 +723,17 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (special->extravalue1) return; + // No picking up rings while SPB is targetting you + if (player->pflags & PF_RINGLOCK) + return; + + // Prepping instawhip? Don't ruin it by collecting rings + if (player->instaWhipCharge) + return; + + if (player->baildrop) + return; + // Don't immediately pick up spilled rings if (special->threshold > 0 || P_PlayerInPain(player) || player->spindash) // player->spindash: Otherwise, players can pick up rings that are thrown out of them from invinc spindash penalty return; From b8a693be32ad9a930401bc1b5d5702338d97b9cf Mon Sep 17 00:00:00 2001 From: Ashnal Date: Fri, 9 May 2025 15:48:39 -0400 Subject: [PATCH 03/30] WIP: Can bail during painstates Not balanced/tuned yet --- src/k_kart.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index b8346431a..08e5fd49e 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13978,6 +13978,16 @@ void K_MoveKartPlayer(player_t *player, boolean onground) mobj_t *broly = Obj_SpawnBrolyKi(player->mo, player->mo->hitlag); broly->extravalue2 = 16*mapobjectscale; + if (P_PlayerInPain(player)) + { + player->spinouttimer = 0; + player->spinouttype = 0; + player->tumbleBounces = 0; + player->pflags &= ~PF_TUMBLELASTBOUNCE; + player->mo->rollangle = 0; + P_ResetPitchRoll(player->mo); + } + INT32 fls = K_GetEffectiveFollowerSkin(player); if (player->follower && fls >= 0 && fls < numfollowers) { From 3146110d08154953e59175dd8502398160b7cbdf Mon Sep 17 00:00:00 2001 From: Ashnal Date: Fri, 9 May 2025 17:13:01 -0400 Subject: [PATCH 04/30] bailcharge player var --- src/d_player.h | 1 + src/lua_playerlib.c | 4 ++++ src/p_enemy.c | 2 +- src/p_inter.c | 2 +- src/p_saveg.cpp | 2 ++ 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index 8e63357f5..fddbd9c51 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1081,6 +1081,7 @@ 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 bailcharge; UINT32 baildrop; boolean analoginput; // Has an input been recorded that requires analog usage? For input display. diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index 214eaae8b..faea1a8ee 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,"bailcharge")) + lua_pushboolean(L, plr->bailcharge); else if (fastcmp(field,"baildrop")) lua_pushboolean(L, plr->baildrop); else if (fastcmp(field,"dotrickfx")) @@ -912,6 +914,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,"bailcharge")) + plr->bailcharge = luaL_checkinteger(L, 3); else if (fastcmp(field,"baildrop")) plr->baildrop = luaL_checkinteger(L, 3); else if (fastcmp(field,"analoginput")) diff --git a/src/p_enemy.c b/src/p_enemy.c index 00f341128..cc7d298a4 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 || actor->target->player->baildrop) + if (!actor->target || P_MobjWasRemoved(actor->target) || !actor->target->player || actor->target->player->baildrop || actor->target->player->bailcharge) { P_RemoveMobj(actor); return; diff --git a/src/p_inter.c b/src/p_inter.c index d71b587e8..dea9cd3e2 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -731,7 +731,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) if (player->instaWhipCharge) return; - if (player->baildrop) + if (player->baildrop || player->bailcharge) return; // Don't immediately pick up spilled rings diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index c038c1ba4..878572929 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -667,6 +667,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT16(save->p, players[i].progressivethrust); WRITEUINT8(save->p, players[i].ringvisualwarning); + WRITEUINT32(save->p, players[i].bailcharge); WRITEUINT32(save->p, players[i].baildrop); WRITEUINT8(save->p, players[i].analoginput); @@ -1324,6 +1325,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].progressivethrust = READUINT16(save->p); players[i].ringvisualwarning = READUINT8(save->p); + players[i].bailcharge = READUINT32(save->p); players[i].baildrop = READUINT32(save->p); players[i].analoginput = READUINT8(save->p); From 6cc9de5efde03faa1995f09068c5c1f767c41e0f Mon Sep 17 00:00:00 2001 From: Ashnal Date: Fri, 9 May 2025 21:07:45 -0400 Subject: [PATCH 05/30] Implementing animations non-painstate animation isn't correct yet --- src/deh_tables.c | 5 ++++ src/info.c | 33 ++++++++++++++++++++++++ src/info.h | 8 ++++++ src/k_kart.c | 20 +++++++++++--- src/k_kart.h | 2 ++ src/k_objects.h | 3 +++ src/objects/CMakeLists.txt | 1 + src/objects/bail.c | 53 ++++++++++++++++++++++++++++++++++++++ src/p_mobj.c | 5 ++++ 9 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/objects/bail.c diff --git a/src/deh_tables.c b/src/deh_tables.c index cd479a80c..3d5f1ac8e 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1574,6 +1574,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKRING", "S_BLOCKBODY", + "S_BAILCHARGE", + "S_TECHCHARGE", + "S_AMPRING", "S_AMPBODY", "S_AMPAURA", @@ -3564,6 +3567,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKRING", "MT_BLOCKBODY", + "MT_BAILCHARGE", + "MT_AMPRING", "MT_AMPBODY", "MT_AMPAURA", diff --git a/src/info.c b/src/info.c index 690b5e5c7..7c79fdeae 100644 --- a/src/info.c +++ b/src/info.c @@ -334,6 +334,9 @@ char sprnames[NUMSPRITES + 1][5] = "GRNG", // Guard ring "GBDY", // Guard body + "BAIL", // Bail charge + "TECH", // Bail tech charge + "TRC1", // Charge aura "TRC2", // Charge fall "TRC3", // Charge flicker/sparks @@ -2160,6 +2163,9 @@ state_t states[NUMSTATES] = {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY + {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 8, 1, S_NULL}, // S_BAILCHARGE + {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_TECHCHARGE + {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING {SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY {SPR_AMPD, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPAURA @@ -13745,6 +13751,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BAILCHARGE + -1, // doomednum + S_BAILCHARGE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_AMPRING -1, // doomednum S_AMPRING, // spawnstate diff --git a/src/info.h b/src/info.h index f704e4426..6da6a81a3 100644 --- a/src/info.h +++ b/src/info.h @@ -875,6 +875,9 @@ typedef enum sprite SPR_GRNG, // Guard ring SPR_GBDY, // Guard body + SPR_BAIL, // Bail charge + SPR_TECH, // Bail tech charge + SPR_TRC1, // Charge aura SPR_TRC2, // Charge fall SPR_TRC3, // Charge flicker/sparks @@ -2629,6 +2632,9 @@ typedef enum state S_BLOCKRING, S_BLOCKBODY, + S_BAILCHARGE, + S_TECHCHARGE, + S_AMPRING, S_AMPBODY, S_AMPAURA, @@ -4646,6 +4652,8 @@ typedef enum mobj_type MT_BLOCKRING, MT_BLOCKBODY, + MT_BAILCHARGE, + MT_AMPRING, MT_AMPBODY, MT_AMPAURA, diff --git a/src/k_kart.c b/src/k_kart.c index 08e5fd49e..618d731cd 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10181,7 +10181,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->nextringaward >= ringrate) { - if (player->instaWhipCharge || player->baildrop) + if (player->instaWhipCharge || player->baildrop || player->bailcharge) { // Store award rings to do diabolical horseshit with later. player->nextringaward = ringrate; @@ -13921,11 +13921,25 @@ 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)) + if ((player->cmd.buttons & BT_VOTE) && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) + { + player->bailcharge++; + if (player->bailcharge == 1) + { + mobj_t * bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); + P_SetTarget(&bail->target, player->mo); + } + } + else + { + player->bailcharge = 0; + } + + if ((!P_PlayerInPain(player) && player->bailcharge >= BAIL_MAXCHARGE) || player->bailcharge >= BAIL_PAINMAXCHARGE) { CONS_Printf("rl %d it %d ia %d ri %d sr %d pr %d\n", player->itemRoulette.active, player->itemtype, player->itemamount, player->rings > 0, player->superring > 0, player->pickuprings > 0); + player->bailcharge = 0; UINT32 debtrings = 20; if (player->rings < 0) diff --git a/src/k_kart.h b/src/k_kart.h index 9750f38c5..be85d7ff1 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -44,6 +44,8 @@ Make sure this matches the actual number of states #define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define PUNISHWINDOW (7*TICRATE/10) +#define BAIL_MAXCHARGE (9) // tics to bail when not in painstate +#define BAIL_PAINMAXCHARGE (42) // tics to bail when in painstate #define BAIL_DROP (FRACUNIT/2) #define BAIL_BOOST (FRACUNIT/3) #define BAIL_DROPFREQUENCY (3) diff --git a/src/k_objects.h b/src/k_objects.h index f5c36da12..c7cfb2e3d 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -153,6 +153,9 @@ void Obj_ChargeFallThink(mobj_t *charge); void Obj_ChargeReleaseThink(mobj_t *release); void Obj_ChargeExtraThink(mobj_t *extra); +/* Bail VFX */ +void Obj_BailChargeThink(mobj_t *aura); + /* Ring Shooter */ boolean Obj_RingShooterThinker(mobj_t *mo); boolean Obj_PlayerRingShooterFreeze(const player_t *player); diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index 8d339d8f4..7a9cb347e 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -66,6 +66,7 @@ target_sources(SRB2SDL2 PRIVATE flame-shield.cpp stone-shoe.cpp exp.c + bail.c ) add_subdirectory(versus) diff --git a/src/objects/bail.c b/src/objects/bail.c new file mode 100644 index 000000000..4846af5c4 --- /dev/null +++ b/src/objects/bail.c @@ -0,0 +1,53 @@ +// DR. ROBOTNIK'S RING RACERS +//----------------------------------------------------------------------------- +// Copyright (C) 2025 by AJ "Tyron" Martinez. +// Copyright (C) 2025 by Kart Krew +// +// This program is free software distributed under the +// terms of the GNU General Public License, version 2. +// See the 'LICENSE' file for more details. +//----------------------------------------------------------------------------- +/// \file bail.c +/// \brief Charge VFX code. + +#include "../doomdef.h" +#include "../info.h" +#include "../k_objects.h" +#include "../info.h" +#include "../k_kart.h" +#include "../p_local.h" + +void Obj_BailChargeThink (mobj_t *aura) +{ + if (P_MobjWasRemoved(aura->target) + || aura->target->health == 0 + || aura->target->destscale <= 1 // sealed star fall out + || !aura->target->player + || !aura->target->player->bailcharge) + { + P_RemoveMobj(aura); + } + else + { + mobj_t *mo = aura->target; + player_t *player = mo->player; + + if (P_PlayerInPain(player) && aura->state != &states[S_TECHCHARGE]) + { + P_SetMobjState(aura, S_TECHCHARGE); + player->bailcharge = 1; + } + + // Follow player + aura->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); + aura->flags |= MF_NOCLIPTHING; + // aura->color = mo->color; + + // aura->renderflags &= ~RF_DONTDRAW; + + fixed_t baseScale = 12*mo->scale/10; + + P_SetScale(aura, baseScale); + } +} diff --git a/src/p_mobj.c b/src/p_mobj.c index da3e08bc6..784e9ca0a 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8923,6 +8923,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_BlockBodyThink(mobj); break; } + case MT_BAILCHARGE: + { + Obj_BailChargeThink(mobj); + break; + } case MT_AMPRING: { Obj_AmpRingThink(mobj); From d297577d8b90502af178bdb354ae20e6bce8b02a Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Mon, 12 May 2025 19:07:55 -0400 Subject: [PATCH 06/30] WIP: Move Bail activation FX to correct spot, buff boost, remove broly --- src/deh_tables.c | 4 ++-- src/info.c | 6 +++--- src/info.h | 4 ++-- src/k_kart.c | 10 +++++----- src/k_kart.h | 2 +- src/k_objects.h | 2 +- src/objects/bail.c | 4 ++-- src/p_mobj.c | 4 ++-- 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 3d5f1ac8e..ea7767c0f 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1574,7 +1574,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKRING", "S_BLOCKBODY", - "S_BAILCHARGE", + "S_BAIL", "S_TECHCHARGE", "S_AMPRING", @@ -3567,7 +3567,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKRING", "MT_BLOCKBODY", - "MT_BAILCHARGE", + "MT_BAIL", "MT_AMPRING", "MT_AMPBODY", diff --git a/src/info.c b/src/info.c index 7c79fdeae..1a5de2115 100644 --- a/src/info.c +++ b/src/info.c @@ -2163,7 +2163,7 @@ state_t states[NUMSTATES] = {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY - {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 8, 1, S_NULL}, // S_BAILCHARGE + {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 8, 1, S_NULL}, // S_BAIL {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_TECHCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING @@ -13751,9 +13751,9 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, - { // MT_BAILCHARGE + { // MT_BAIL -1, // doomednum - S_BAILCHARGE, // spawnstate + S_BAIL, // spawnstate 1000, // spawnhealth S_NULL, // seestate sfx_None, // seesound diff --git a/src/info.h b/src/info.h index 6da6a81a3..e127e4361 100644 --- a/src/info.h +++ b/src/info.h @@ -2632,7 +2632,7 @@ typedef enum state S_BLOCKRING, S_BLOCKBODY, - S_BAILCHARGE, + S_BAIL, S_TECHCHARGE, S_AMPRING, @@ -4652,7 +4652,7 @@ typedef enum mobj_type MT_BLOCKRING, MT_BLOCKBODY, - MT_BAILCHARGE, + MT_BAIL, MT_AMPRING, MT_AMPBODY, diff --git a/src/k_kart.c b/src/k_kart.c index 618d731cd..7bea99b9b 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13926,8 +13926,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->bailcharge++; if (player->bailcharge == 1) { - mobj_t * bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); - P_SetTarget(&bail->target, player->mo); + // Hi Ashnal } } else @@ -13935,12 +13934,15 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->bailcharge = 0; } - if ((!P_PlayerInPain(player) && player->bailcharge >= BAIL_MAXCHARGE) || player->bailcharge >= BAIL_PAINMAXCHARGE) + if ((!P_PlayerInPain(player) && player->bailcharge >= BAIL_MAXCHARGE) || player->bailcharge) { CONS_Printf("rl %d it %d ia %d ri %d sr %d pr %d\n", player->itemRoulette.active, player->itemtype, player->itemamount, player->rings > 0, player->superring > 0, player->pickuprings > 0); player->bailcharge = 0; + mobj_t * bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL); + P_SetTarget(&bail->target, player->mo); + UINT32 debtrings = 20; if (player->rings < 0) { @@ -13989,8 +13991,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) 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; if (P_PlayerInPain(player)) { diff --git a/src/k_kart.h b/src/k_kart.h index be85d7ff1..f7227e1df 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -47,7 +47,7 @@ Make sure this matches the actual number of states #define BAIL_MAXCHARGE (9) // tics to bail when not in painstate #define BAIL_PAINMAXCHARGE (42) // tics to bail when in painstate #define BAIL_DROP (FRACUNIT/2) -#define BAIL_BOOST (FRACUNIT/3) +#define BAIL_BOOST (FRACUNIT) #define BAIL_DROPFREQUENCY (3) #define MAXCOMBOTHRUST (mapobjectscale*20) diff --git a/src/k_objects.h b/src/k_objects.h index c7cfb2e3d..e6a0bcc77 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -154,7 +154,7 @@ void Obj_ChargeReleaseThink(mobj_t *release); void Obj_ChargeExtraThink(mobj_t *extra); /* Bail VFX */ -void Obj_BailChargeThink(mobj_t *aura); +void Obj_BailThink(mobj_t *aura); /* Ring Shooter */ boolean Obj_RingShooterThinker(mobj_t *mo); diff --git a/src/objects/bail.c b/src/objects/bail.c index 4846af5c4..52221b28c 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -17,13 +17,13 @@ #include "../k_kart.h" #include "../p_local.h" -void Obj_BailChargeThink (mobj_t *aura) +void Obj_BailThink (mobj_t *aura) { if (P_MobjWasRemoved(aura->target) || aura->target->health == 0 || aura->target->destscale <= 1 // sealed star fall out || !aura->target->player - || !aura->target->player->bailcharge) + || !aura->target->hitlag) { P_RemoveMobj(aura); } diff --git a/src/p_mobj.c b/src/p_mobj.c index 784e9ca0a..b8fb5ad8f 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8923,9 +8923,9 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_BlockBodyThink(mobj); break; } - case MT_BAILCHARGE: + case MT_BAIL: { - Obj_BailChargeThink(mobj); + Obj_BailThink(mobj); break; } case MT_AMPRING: From a57273a2aab516395404e0b741b3c09673b4b95e Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 12 May 2025 20:14:52 -0400 Subject: [PATCH 07/30] WIP: refactor bailcharge into own MT and fix effects still needs gameplay tuning --- src/deh_tables.c | 3 ++- src/info.c | 29 ++++++++++++++++++++++++++++- src/info.h | 3 ++- src/k_kart.c | 9 +++++---- src/k_kart.h | 3 +-- src/k_objects.h | 1 + src/objects/bail.c | 35 +++++++++++++++++++++++++++++------ src/p_mobj.c | 5 +++++ 8 files changed, 73 insertions(+), 15 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index ea7767c0f..5b6f8a0bb 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1575,7 +1575,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKBODY", "S_BAIL", - "S_TECHCHARGE", + "S_BAILCHARGE", "S_AMPRING", "S_AMPBODY", @@ -3568,6 +3568,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKBODY", "MT_BAIL", + "MT_BAILCHARGE", "MT_AMPRING", "MT_AMPBODY", diff --git a/src/info.c b/src/info.c index 1a5de2115..b24df4e71 100644 --- a/src/info.c +++ b/src/info.c @@ -2164,7 +2164,7 @@ state_t states[NUMSTATES] = {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 8, 1, S_NULL}, // S_BAIL - {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_TECHCHARGE + {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING {SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY @@ -13778,6 +13778,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_BAILCHARGE + -1, // doomednum + S_BAILCHARGE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_AMPRING -1, // doomednum S_AMPRING, // spawnstate diff --git a/src/info.h b/src/info.h index e127e4361..ac19008fd 100644 --- a/src/info.h +++ b/src/info.h @@ -2633,7 +2633,7 @@ typedef enum state S_BLOCKBODY, S_BAIL, - S_TECHCHARGE, + S_BAILCHARGE, S_AMPRING, S_AMPBODY, @@ -4653,6 +4653,7 @@ typedef enum mobj_type MT_BLOCKBODY, MT_BAIL, + MT_BAILCHARGE, MT_AMPRING, MT_AMPBODY, diff --git a/src/k_kart.c b/src/k_kart.c index 7bea99b9b..3723e4437 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13924,9 +13924,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((player->cmd.buttons & BT_VOTE) && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) { player->bailcharge++; - if (player->bailcharge == 1) + if (P_PlayerInPain(player) && player->bailcharge == 1) { - // Hi Ashnal + mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); + P_SetTarget(&bail->target, player->mo); } } else @@ -13934,13 +13935,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->bailcharge = 0; } - if ((!P_PlayerInPain(player) && player->bailcharge >= BAIL_MAXCHARGE) || player->bailcharge) + if ((!P_PlayerInPain(player) && player->bailcharge) || player->bailcharge >= BAIL_MAXCHARGE) { CONS_Printf("rl %d it %d ia %d ri %d sr %d pr %d\n", player->itemRoulette.active, player->itemtype, player->itemamount, player->rings > 0, player->superring > 0, player->pickuprings > 0); player->bailcharge = 0; - mobj_t * bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL); + mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL); P_SetTarget(&bail->target, player->mo); UINT32 debtrings = 20; diff --git a/src/k_kart.h b/src/k_kart.h index f7227e1df..b7ac61aff 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -44,8 +44,7 @@ Make sure this matches the actual number of states #define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define PUNISHWINDOW (7*TICRATE/10) -#define BAIL_MAXCHARGE (9) // tics to bail when not in painstate -#define BAIL_PAINMAXCHARGE (42) // tics to bail when in painstate +#define BAIL_MAXCHARGE (42) // tics to bail when not in painstate #define BAIL_DROP (FRACUNIT/2) #define BAIL_BOOST (FRACUNIT) #define BAIL_DROPFREQUENCY (3) diff --git a/src/k_objects.h b/src/k_objects.h index e6a0bcc77..378632190 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -155,6 +155,7 @@ void Obj_ChargeExtraThink(mobj_t *extra); /* Bail VFX */ void Obj_BailThink(mobj_t *aura); +void Obj_BailChargeThink(mobj_t *aura); /* Ring Shooter */ boolean Obj_RingShooterThinker(mobj_t *mo); diff --git a/src/objects/bail.c b/src/objects/bail.c index 52221b28c..3cf4f95a5 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -32,12 +32,6 @@ void Obj_BailThink (mobj_t *aura) mobj_t *mo = aura->target; player_t *player = mo->player; - if (P_PlayerInPain(player) && aura->state != &states[S_TECHCHARGE]) - { - P_SetMobjState(aura, S_TECHCHARGE); - player->bailcharge = 1; - } - // Follow player aura->flags &= ~(MF_NOCLIPTHING); P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); @@ -51,3 +45,32 @@ void Obj_BailThink (mobj_t *aura) P_SetScale(aura, baseScale); } } + +void Obj_BailChargeThink (mobj_t *aura) +{ + if (P_MobjWasRemoved(aura->target) + || aura->target->health == 0 + || aura->target->destscale <= 1 // sealed star fall out + || !aura->target->player + || !aura->target->player->bailcharge) + { + P_RemoveMobj(aura); + } + else + { + mobj_t *mo = aura->target; + player_t *player = mo->player; + + // Follow player + aura->flags &= ~(MF_NOCLIPTHING); + P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); + aura->flags |= MF_NOCLIPTHING; + // aura->color = mo->color; + + // aura->renderflags &= ~RF_DONTDRAW; + + fixed_t baseScale = 12*mo->scale/10; + + P_SetScale(aura, baseScale); + } +} \ No newline at end of file diff --git a/src/p_mobj.c b/src/p_mobj.c index b8fb5ad8f..d7ed31389 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8928,6 +8928,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_BailThink(mobj); break; } + case MT_BAILCHARGE: + { + Obj_BailChargeThink(mobj); + break; + } case MT_AMPRING: { Obj_AmpRingThink(mobj); From a1ed935aef8c13ce3f41509be32aebf0a9725cbb Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 12 May 2025 21:34:21 -0400 Subject: [PATCH 08/30] WIP: Longer charge for airbourne or tumble Still need animation speed polish --- src/k_kart.c | 5 +++-- src/k_kart.h | 2 +- src/objects/bail.c | 7 +++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 3723e4437..8842cf1b6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13923,8 +13923,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((player->cmd.buttons & BT_VOTE) && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) { - player->bailcharge++; - if (P_PlayerInPain(player) && player->bailcharge == 1) + boolean onground = P_IsObjectOnGround(player->mo); + onground && player->tumbleBounces == 0 ? player->bailcharge += 2 : player->bailcharge++; // charge twice as fast on the ground + if (P_PlayerInPain(player) && player->bailcharge == 1 || onground && P_PlayerInPain(player) && player->bailcharge == 2) // this is brittle .. { mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); P_SetTarget(&bail->target, player->mo); diff --git a/src/k_kart.h b/src/k_kart.h index b7ac61aff..5d55668ce 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -44,7 +44,7 @@ Make sure this matches the actual number of states #define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define PUNISHWINDOW (7*TICRATE/10) -#define BAIL_MAXCHARGE (42) // tics to bail when not in painstate +#define BAIL_MAXCHARGE (84) // tics to bail when in painstate nad in air, on ground is half #define BAIL_DROP (FRACUNIT/2) #define BAIL_BOOST (FRACUNIT) #define BAIL_DROPFREQUENCY (3) diff --git a/src/objects/bail.c b/src/objects/bail.c index 3cf4f95a5..885574b06 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -67,6 +67,13 @@ void Obj_BailChargeThink (mobj_t *aura) aura->flags |= MF_NOCLIPTHING; // aura->color = mo->color; + aura->extravalue1 = max(0, aura->extravalue1-1); + if (aura->extravalue1 == 0 && (!P_IsObjectOnGround(player->mo) || player->tumbleBounces != 0)) + { + aura->anim_duration = 2; // hack the shit out of FF_ANIMATE hell yeah + aura->extravalue1 = 2; + } + // aura->renderflags &= ~RF_DONTDRAW; fixed_t baseScale = 12*mo->scale/10; From 341a018accf2a89fdde0dcf611e5b795abfbd946 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Wed, 28 May 2025 17:03:16 -0400 Subject: [PATCH 09/30] Warning fixes --- src/k_kart.c | 4 ++-- src/objects/bail.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 8842cf1b6..78aeabf17 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13923,9 +13923,9 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((player->cmd.buttons & BT_VOTE) && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) { - boolean onground = P_IsObjectOnGround(player->mo); + boolean grounded = P_IsObjectOnGround(player->mo); onground && player->tumbleBounces == 0 ? player->bailcharge += 2 : player->bailcharge++; // charge twice as fast on the ground - if (P_PlayerInPain(player) && player->bailcharge == 1 || onground && P_PlayerInPain(player) && player->bailcharge == 2) // this is brittle .. + if ((P_PlayerInPain(player) && player->bailcharge == 1) || (grounded && P_PlayerInPain(player) && player->bailcharge == 2)) // this is brittle .. { mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); P_SetTarget(&bail->target, player->mo); diff --git a/src/objects/bail.c b/src/objects/bail.c index 885574b06..2ebd1a359 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -30,7 +30,7 @@ void Obj_BailThink (mobj_t *aura) else { mobj_t *mo = aura->target; - player_t *player = mo->player; + ATTRUNUSED player_t *player = mo->player; // Follow player aura->flags &= ~(MF_NOCLIPTHING); From d0225afacb189d2679c67692f5b119610fd8c7d5 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sun, 1 Jun 2025 16:50:24 -0400 Subject: [PATCH 10/30] Charge animation imprevement just sync the frame to the charge amount --- src/k_kart.h | 2 +- src/objects/bail.c | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/k_kart.h b/src/k_kart.h index 5d55668ce..1193dd60e 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -44,7 +44,7 @@ Make sure this matches the actual number of states #define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define PUNISHWINDOW (7*TICRATE/10) -#define BAIL_MAXCHARGE (84) // tics to bail when in painstate nad in air, on ground is half +#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/2) #define BAIL_BOOST (FRACUNIT) #define BAIL_DROPFREQUENCY (3) diff --git a/src/objects/bail.c b/src/objects/bail.c index 2ebd1a359..f68d7ef5f 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -67,14 +67,8 @@ void Obj_BailChargeThink (mobj_t *aura) aura->flags |= MF_NOCLIPTHING; // aura->color = mo->color; - aura->extravalue1 = max(0, aura->extravalue1-1); - if (aura->extravalue1 == 0 && (!P_IsObjectOnGround(player->mo) || player->tumbleBounces != 0)) - { - aura->anim_duration = 2; // hack the shit out of FF_ANIMATE hell yeah - aura->extravalue1 = 2; - } - - // aura->renderflags &= ~RF_DONTDRAW; + aura->anim_duration = 999; // This prevents FF_ANIMATE from working, we're gonna animate manually ourselves here + aura->frame = ((player->bailcharge-1)/2); // By syncing the frame with the charge timer here fixed_t baseScale = 12*mo->scale/10; From e9770bcf8770536d5630c62aa123857a5b7c2fd5 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sun, 1 Jun 2025 18:01:42 -0400 Subject: [PATCH 11/30] Bail charge add ghost mobj and scale bump --- src/objects/bail.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/objects/bail.c b/src/objects/bail.c index f68d7ef5f..197f7cb6c 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -70,8 +70,12 @@ void Obj_BailChargeThink (mobj_t *aura) aura->anim_duration = 999; // This prevents FF_ANIMATE from working, we're gonna animate manually ourselves here aura->frame = ((player->bailcharge-1)/2); // By syncing the frame with the charge timer here - fixed_t baseScale = 12*mo->scale/10; + fixed_t baseScale = 13*mo->scale/10; P_SetScale(aura, baseScale); + + mobj_t *ghost = P_SpawnGhostMobj(aura); + ghost->renderflags = (ghost->renderflags & ~RF_TRANSMASK)|RF_ADD; + ghost->fuse = 3; } } \ No newline at end of file From 8711e287e4b84e77e1e968c4e465d47fe20bf135 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sun, 1 Jun 2025 21:44:20 -0400 Subject: [PATCH 12/30] Bail post hitlag VFX --- src/deh_tables.c | 1 + src/info.c | 4 +++- src/info.h | 2 ++ src/objects/bail.c | 7 +------ 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 5b6f8a0bb..5fc9b90aa 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1575,6 +1575,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKBODY", "S_BAIL", + "S_BAIB", "S_BAILCHARGE", "S_AMPRING", diff --git a/src/info.c b/src/info.c index b24df4e71..ed3849587 100644 --- a/src/info.c +++ b/src/info.c @@ -335,6 +335,7 @@ char sprnames[NUMSPRITES + 1][5] = "GBDY", // Guard body "BAIL", // Bail charge + "BAIB", // Bail after effect "TECH", // Bail tech charge "TRC1", // Charge aura @@ -2163,7 +2164,8 @@ state_t states[NUMSTATES] = {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY - {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 8, 1, S_NULL}, // S_BAIL + {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 8, {NULL}, 8, 1, S_BAIB}, // S_BAIL + {SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING diff --git a/src/info.h b/src/info.h index ac19008fd..05f3ef121 100644 --- a/src/info.h +++ b/src/info.h @@ -876,6 +876,7 @@ typedef enum sprite SPR_GBDY, // Guard body SPR_BAIL, // Bail charge + SPR_BAIB, // Bail after effect SPR_TECH, // Bail tech charge SPR_TRC1, // Charge aura @@ -2633,6 +2634,7 @@ typedef enum state S_BLOCKBODY, S_BAIL, + S_BAIB, S_BAILCHARGE, S_AMPRING, diff --git a/src/objects/bail.c b/src/objects/bail.c index 197f7cb6c..cd8e2c686 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -23,22 +23,17 @@ void Obj_BailThink (mobj_t *aura) || aura->target->health == 0 || aura->target->destscale <= 1 // sealed star fall out || !aura->target->player - || !aura->target->hitlag) + || P_PlayerInPain(aura->target->player)) // if you got hit when starting to bail, cancel the VFX { P_RemoveMobj(aura); } else { mobj_t *mo = aura->target; - ATTRUNUSED player_t *player = mo->player; - // Follow player aura->flags &= ~(MF_NOCLIPTHING); P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); aura->flags |= MF_NOCLIPTHING; - // aura->color = mo->color; - - // aura->renderflags &= ~RF_DONTDRAW; fixed_t baseScale = 12*mo->scale/10; From 9c0432eb1b3dd5b4e5097a9ea2438622643077e1 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 2 Jun 2025 19:28:20 -0400 Subject: [PATCH 13/30] Bail Sparkle --- src/deh_tables.c | 2 ++ src/info.c | 33 +++++++++++++++++++++++++++++++-- src/info.h | 3 +++ src/k_kart.c | 29 +++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+), 2 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 5fc9b90aa..7f3ac6310 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1576,6 +1576,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BAIL", "S_BAIB", + "S_BAIC", "S_BAILCHARGE", "S_AMPRING", @@ -3570,6 +3571,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BAIL", "MT_BAILCHARGE", + "MT_BAILSPARKLE", "MT_AMPRING", "MT_AMPBODY", diff --git a/src/info.c b/src/info.c index ed3849587..d3bad37b5 100644 --- a/src/info.c +++ b/src/info.c @@ -336,6 +336,7 @@ char sprnames[NUMSPRITES + 1][5] = "BAIL", // Bail charge "BAIB", // Bail after effect + "BAIC", // Bail sparkle "TECH", // Bail tech charge "TRC1", // Charge aura @@ -2166,6 +2167,7 @@ state_t states[NUMSTATES] = {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 8, {NULL}, 8, 1, S_BAIB}, // S_BAIL {SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB + {SPR_BAIC, FF_FULLBRIGHT|FF_ANIMATE|0, 11, {NULL}, 10, 1, S_NULL}, // S_BAIC {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING @@ -13776,7 +13778,7 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags S_NULL // raisestate }, @@ -13803,7 +13805,34 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = 100, // mass 0, // damage sfx_None, // activesound - MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP, // flags + S_NULL // raisestate + }, + + { // MT_BAILSPARKLE + -1, // doomednum + S_BAIC, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 67*FRACUNIT, // radius + 67*FRACUNIT, // height + 1, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT|MF_NOCLIPTHING|MF_DONTENCOREMAP|MF_SCENERY, // flags S_NULL // raisestate }, diff --git a/src/info.h b/src/info.h index 05f3ef121..3a3354263 100644 --- a/src/info.h +++ b/src/info.h @@ -877,6 +877,7 @@ typedef enum sprite SPR_BAIL, // Bail charge SPR_BAIB, // Bail after effect + SPR_BAIC, // Bail sparkle SPR_TECH, // Bail tech charge SPR_TRC1, // Charge aura @@ -2635,6 +2636,7 @@ typedef enum state S_BAIL, S_BAIB, + S_BAIC, S_BAILCHARGE, S_AMPRING, @@ -4656,6 +4658,7 @@ typedef enum mobj_type MT_BAIL, MT_BAILCHARGE, + MT_BAILSPARKLE, MT_AMPRING, MT_AMPBODY, diff --git a/src/k_kart.c b/src/k_kart.c index 78aeabf17..b94e74757 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10001,6 +10001,35 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Extra tripwire leniency for the end of invincibility if (player->invincibilitytimer <= 0) { player->tripwireLeniency = max( player->tripwireLeniency, TICRATE ); + } + + if (player->baildrop) + { + mobj_t *pmo = player->mo; + // particle spawn + #define BAILSPARKLE_MAXBAIL 61 // amount of bail rings needed for max sparkle spawn frequency + UINT32 baildropinversefreq = BAILSPARKLE_MAXBAIL - min(player->baildrop, BAILSPARKLE_MAXBAIL-6); + UINT32 baildropmodulo = baildropinversefreq *5/3 /10; + if ((leveltime % (1+baildropmodulo)) == 0) + { + mobj_t *sparkle = P_SpawnMobj(pmo->x + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale), + pmo->y + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale), + pmo->z + (pmo->height/2) + (P_RandomRange(PR_DECORATION, -40,40) * pmo->scale), + MT_BAILSPARKLE); + + sparkle->scale = pmo->scale; + sparkle->angle = pmo->angle; + sparkle->momx = 3*pmo->momx/4; + sparkle->momy = 3*pmo->momy/4; + sparkle->momz = 3*P_GetMobjZMovement(pmo)/4; + K_MatchGenericExtraFlags(sparkle, pmo); + sparkle->renderflags = (pmo->renderflags & ~RF_TRANSMASK);//|RF_TRANS20|RF_ADD; + } + + if ((player->baildrop % BAIL_DROPFREQUENCY) == 0) + { + P_FlingBurst(player, K_MomentumAngle(pmo), MT_FLINGRING, 10*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); + S_StartSound(pmo, sfx_gshad); } } From 4e6fa59b487976e92ade2d58e64fd68cfd6f1758 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Mon, 2 Jun 2025 19:57:31 -0400 Subject: [PATCH 14/30] Bail stun etc --- src/k_kart.c | 13 +++++++++---- src/k_kart.h | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index b94e74757..cb62aa853 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9813,9 +9813,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // UINT16 oldringboost = player->ringboost; - if (player->superring == 0 || player->stunned) + if (!player->baildrop && (player->superring == 0 || player->stunned)) player->ringboost -= max((player->ringboost / roller), 1); - else if (K_LegacyRingboost(player)) + else if (K_LegacyRingboost(player) || player->baildrop) player->ringboost--; else player->ringboost -= min(K_GetFullKartRingPower(player, false) - 1, max(player->ringboost / 2 / roller, 1)); @@ -10005,6 +10005,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->baildrop) { + if (player->stunned & 0x8000) + player->stunned = 0x8000 | BAILSTUN; + else + player->stunned = BAILSTUN; + mobj_t *pmo = player->mo; // particle spawn #define BAILSPARKLE_MAXBAIL 61 // amount of bail rings needed for max sparkle spawn frequency @@ -13981,10 +13986,10 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->rings = 0; } - UINT32 totalrings = player->rings + player->superring + player->pickuprings; + UINT32 totalrings = player->rings + player->superring + player->pickuprings + debtrings; totalrings = max(totalrings, 0); UINT32 bailboost = FixedInt(FixedMul(totalrings*FRACUNIT, BAIL_BOOST)); - UINT32 baildrop = debtrings + FixedInt(FixedMul((totalrings)*FRACUNIT, BAIL_DROP)); + UINT32 baildrop = FixedInt(FixedMul((totalrings)*FRACUNIT, BAIL_DROP)); if (player->itemRoulette.active) { diff --git a/src/k_kart.h b/src/k_kart.h index 1193dd60e..b2e3a02a6 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -45,9 +45,10 @@ Make sure this matches the actual number of states #define PUNISHWINDOW (7*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/2) +#define BAIL_DROP (FRACUNIT) #define BAIL_BOOST (FRACUNIT) #define BAIL_DROPFREQUENCY (3) +#define BAILSTUN (TICRATE*10) #define MAXCOMBOTHRUST (mapobjectscale*20) #define MAXCOMBOFLOAT (mapobjectscale*10) From f5aa2a701b08858753d408026b060d4ad7de9a79 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sat, 7 Jun 2025 17:32:42 -0400 Subject: [PATCH 15/30] Bail button Transforms BT_RESPAWN into BT_BAIL User bindings should migrate along with this Respawn is now EBRAKE+BAIL Respawn blocks LOOKBACK Time Attack quick respawn is now VOTE --- src/d_clisrv.c | 2 +- src/d_ticcmd.h | 3 ++- src/deh_tables.c | 3 ++- src/g_build_ticcmd.cpp | 5 +---- src/g_input.h | 2 +- src/hud/input-display.cpp | 2 +- src/hud/spectator.cpp | 2 +- src/k_bot.cpp | 2 +- src/k_follower.c | 2 +- src/k_hud.cpp | 4 ++-- src/k_kart.c | 16 ++++++++++++---- src/k_menufunc.c | 2 +- src/menus/options-profiles-edit-controls.c | 4 ++-- src/objects/ring-shooter.c | 4 ++-- src/p_user.c | 4 ++-- 15 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index fac79bcab..f5a486f1d 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5397,7 +5397,7 @@ static void FuzzTiccmd(ticcmd_t* target) { target->buttons |= BT_ACCELERATE; target->buttons &= ~BT_LOOKBACK; - target->buttons &= ~BT_RESPAWN; + target->buttons &= ~BT_BAIL; target->buttons &= ~BT_BRAKE; } } diff --git a/src/d_ticcmd.h b/src/d_ticcmd.h index f0c5f4f28..2ac3bb07a 100644 --- a/src/d_ticcmd.h +++ b/src/d_ticcmd.h @@ -32,12 +32,13 @@ typedef enum BT_BRAKE = 1<<3, // Brake BT_ATTACK = 1<<4, // Use Item BT_LOOKBACK = 1<<5, // Look Backward - BT_RESPAWN = 1<<6, // Respawn + BT_BAIL = 1<<6, // Bail BT_VOTE = 1<<7, // Vote BT_SPINDASH = 1<<8, // Spindash BT_EBRAKEMASK = (BT_ACCELERATE|BT_BRAKE), BT_SPINDASHMASK = (BT_ACCELERATE|BT_BRAKE|BT_DRIFT), + BT_RESPAWNMASK = (BT_EBRAKEMASK|BT_BAIL), // free: 1<<9 to 1<<12 diff --git a/src/deh_tables.c b/src/deh_tables.c index 7f3ac6310..9e037f4f2 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -5057,11 +5057,12 @@ struct int_const_s const INT_CONST[] = { {"BT_BRAKE",BT_BRAKE}, {"BT_ATTACK",BT_ATTACK}, {"BT_LOOKBACK",BT_LOOKBACK}, - {"BT_RESPAWN",BT_RESPAWN}, + {"BT_BAIL",BT_BAIL}, {"BT_VOTE",BT_VOTE}, {"BT_SPINDASH",BT_SPINDASH}, // Real button now, but triggers the macro same as always. {"BT_EBRAKEMASK",BT_EBRAKEMASK}, // Macro button {"BT_SPINDASHMASK",BT_SPINDASHMASK}, // Macro button + {"BT_RESPAWNMASK",BT_RESPAWNMASK}, // Macro button {"BT_LUAA",BT_LUAA}, // Lua customizable {"BT_LUAB",BT_LUAB}, // Lua customizable {"BT_LUAC",BT_LUAC}, // Lua customizable diff --git a/src/g_build_ticcmd.cpp b/src/g_build_ticcmd.cpp index f32c1f509..cfd962e28 100644 --- a/src/g_build_ticcmd.cpp +++ b/src/g_build_ticcmd.cpp @@ -404,10 +404,7 @@ class TiccmdBuilder map(gc_item, BT_ATTACK); // fire map(gc_lookback, BT_LOOKBACK); // rear view - if (!modeattacking) - { - map(gc_respawn, BT_RESPAWN | (freecam() ? 0 : BT_EBRAKEMASK)); // respawn - } + map(gc_bail, BT_BAIL); // bail map(gc_vote, BT_VOTE); // mp general function button // lua buttons a thru c diff --git a/src/g_input.h b/src/g_input.h index d2f2d535c..7991923e8 100644 --- a/src/g_input.h +++ b/src/g_input.h @@ -123,7 +123,7 @@ typedef enum gc_lookback = gc_b, gc_spindash = gc_c, gc_brake = gc_x, - gc_respawn = gc_y, + gc_bail = gc_y, gc_vote = gc_z, gc_item = gc_l, gc_drift = gc_r, diff --git a/src/hud/input-display.cpp b/src/hud/input-display.cpp index c3dab0a53..14678c87a 100644 --- a/src/hud/input-display.cpp +++ b/src/hud/input-display.cpp @@ -113,7 +113,7 @@ void K_DrawInputDisplay(float x, float y, INT32 flags, char mode, UINT8 pid, boo box.patch(but('B', gc_b, BT_LOOKBACK)); box.patch(but('C', gc_c, BT_SPINDASH)); box.patch(but('X', gc_x, BT_BRAKE)); - box.patch(but('Y', gc_y, BT_RESPAWN)); + box.patch(but('Y', gc_y, BT_BAIL)); box.patch(but('Z', gc_z, BT_VOTE)); box.patch(but('L', gc_l, BT_ATTACK)); box.patch(but('R', gc_r, BT_DRIFT)); diff --git a/src/hud/spectator.cpp b/src/hud/spectator.cpp index f0606378a..512f64d6a 100644 --- a/src/hud/spectator.cpp +++ b/src/hud/spectator.cpp @@ -198,7 +198,7 @@ void K_drawSpectatorHUD(boolean director) } else { - bool press = D_LocalTiccmd(viewnum)->buttons & BT_RESPAWN; + bool press = D_LocalTiccmd(viewnum)->buttons & BT_BAIL; const char* label = (press && I_GetTime() % 16 < 8) ? "> <" : ">< "; list.insert({{label, press ? "" : ""}, {"Exit", ""}}); diff --git a/src/k_bot.cpp b/src/k_bot.cpp index 3caab89e7..1d827138a 100644 --- a/src/k_bot.cpp +++ b/src/k_bot.cpp @@ -1803,7 +1803,7 @@ static void K_BuildBotTiccmdNormal(player_t *player, ticcmd_t *cmd) if (K_TryRingShooter(player, botController) == true && player->botvars.respawnconfirm >= BOTRESPAWNCONFIRM) { // We want to respawn. Simply hold Y and stop here! - cmd->buttons |= (BT_RESPAWN | BT_EBRAKEMASK); + cmd->buttons |= BT_RESPAWNMASK; return; } diff --git a/src/k_follower.c b/src/k_follower.c index aee769b95..b4ed0bf84 100644 --- a/src/k_follower.c +++ b/src/k_follower.c @@ -546,7 +546,7 @@ void K_HandleFollower(player_t *player) } // Sal: Turn the follower around when looking backwards. - if ( player->cmd.buttons & BT_LOOKBACK ) + if (K_GetKartButtons(player) & BT_LOOKBACK) { destAngle += ANGLE_180; } diff --git a/src/k_hud.cpp b/src/k_hud.cpp index 986b28eaa..a5e25edbf 100644 --- a/src/k_hud.cpp +++ b/src/k_hud.cpp @@ -4876,7 +4876,7 @@ static void K_drawKartPlayerCheck(void) return; } - if (stplyr->cmd.buttons & BT_LOOKBACK) + if (K_GetKartButtons(stplyr) & BT_LOOKBACK) { return; } @@ -7521,7 +7521,7 @@ void K_drawKartHUD(void) if (ta) { using srb2::Draw; - Draw::TextElement text = Draw::TextElement().parse(" Restart"); + Draw::TextElement text = Draw::TextElement().parse(" Restart"); Draw(BASEVIDWIDTH - 19, 2) .flags(flags | V_YELLOWMAP) .align(Draw::Align::kRight) diff --git a/src/k_kart.c b/src/k_kart.c index cb62aa853..85d74c0cb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -4069,8 +4069,16 @@ boolean K_KartKickstart(const player_t *player) UINT16 K_GetKartButtons(const player_t *player) { - return (player->cmd.buttons | - (K_KartKickstart(player) ? BT_ACCELERATE : 0)); + UINT16 buttons = player->cmd.buttons; + if ((buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK) + { + buttons &= ~BT_LOOKBACK; + } + if (K_KartKickstart(player)) + { + buttons = buttons | BT_ACCELERATE; + } + return buttons; } SINT8 K_GetForwardMove(const player_t *player) @@ -10129,7 +10137,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) K_RemoveGrowShrink(player); } - if (player->respawn.state != RESPAWNST_MOVE && (player->cmd.buttons & BT_RESPAWN) == BT_RESPAWN) + if (player->respawn.state != RESPAWNST_MOVE && (player->cmd.buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK) { player->finalfailsafe++; // Decremented by ringshooter to "freeze" this timer // Part-way through the auto-respawn timer, you can tap Ring Shooter to respawn early @@ -13955,7 +13963,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } - if ((player->cmd.buttons & BT_VOTE) && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) + if ((player->cmd.buttons & BT_BAIL) && (player->cmd.buttons & BT_RESPAWNMASK) != BT_RESPAWNMASK && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active)) { boolean grounded = P_IsObjectOnGround(player->mo); onground && player->tumbleBounces == 0 ? player->bailcharge += 2 : player->bailcharge++; // charge twice as fast on the ground diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 3631441b0..4438781cc 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -466,7 +466,7 @@ boolean M_Responder(event_t *ev) if (Playing() && !demo.playback) { // Quick Retry (Y in modeattacking) - if (modeattacking && G_PlayerInputDown(0, gc_respawn, splitscreen + 1) == true) + if (modeattacking && G_PlayerInputDown(0, gc_bail, splitscreen + 1) == true) { M_TryAgain(0); return true; diff --git a/src/menus/options-profiles-edit-controls.c b/src/menus/options-profiles-edit-controls.c index 628035f3a..1fc1b914e 100644 --- a/src/menus/options-profiles-edit-controls.c +++ b/src/menus/options-profiles-edit-controls.c @@ -39,10 +39,10 @@ menuitem_t OPTIONS_ProfileControls[] = { {IT_CONTROL, "Brake / Go back", "Brake / Go back", "TLB_X", {.routine = M_ProfileSetControl}, gc_x, 0}, - {IT_CONTROL, "Respawn", "Respawn", + {IT_CONTROL, "Ring Bail", "Ring Bail / Burst", "TLB_Y", {.routine = M_ProfileSetControl}, gc_y, 0}, - {IT_CONTROL, "Action", "Multiplayer quick-chat / quick-vote", + {IT_CONTROL, "Action", "Quick-vote / Quick-chat / Time Attack Quick Restart", "TLB_Z", {.routine = M_ProfileSetControl}, gc_z, 0}, {IT_CONTROL, "Use Item", "Use item", diff --git a/src/objects/ring-shooter.c b/src/objects/ring-shooter.c index 83613d3c5..2f731a7cd 100644 --- a/src/objects/ring-shooter.c +++ b/src/objects/ring-shooter.c @@ -668,7 +668,7 @@ boolean Obj_PlayerRingShooterFreeze(const player_t *player) const mobj_t *base = player->ringShooter; if (AllowRingShooter(player) == true - && (player->cmd.buttons & BT_RESPAWN) == BT_RESPAWN + && (player->cmd.buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK && P_MobjWasRemoved(base) == false) { return (rs_base_canceled(base) == 0); @@ -682,7 +682,7 @@ void Obj_RingShooterInput(player_t *player) mobj_t *const base = player->ringShooter; if (AllowRingShooter(player) == true - && (player->cmd.buttons & BT_RESPAWN) == BT_RESPAWN) + && (player->cmd.buttons & BT_RESPAWNMASK) == BT_RESPAWNMASK) { // "Freeze" final-failsafe timer if we're eligible to ringshooter, but don't reset it. if (player->finalfailsafe) diff --git a/src/p_user.c b/src/p_user.c index 74a4be388..feebebc48 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -3067,7 +3067,7 @@ void P_DemoCameraMovement(camera_t *cam, UINT8 num) } // if you hold Y, you will lock on to displayplayer. (The last player you were ""f12-ing"") - if (cam->freecam && cmd->buttons & BT_RESPAWN) + if (cam->freecam && cmd->buttons & BT_BAIL) { lastp = &players[displayplayers[0]]; // Fun fact, I was trying displayplayers[0]->mo as if it was Lua like an absolute idiot. cam->angle = R_PointToAngle2(cam->x, cam->y, lastp->mo->x, lastp->mo->y); @@ -3369,7 +3369,7 @@ boolean P_MoveChaseCamera(player_t *player, camera_t *thiscam, boolean resetcall if (P_CameraThinker(player, thiscam, resetcalled)) return true; - lookback = ( player->cmd.buttons & BT_LOOKBACK ); + lookback = K_GetKartButtons(player) & BT_LOOKBACK; camspeed = cv_cam_speed[num].value; camstill = cv_cam_still[num].value || player->seasaw; // RR: seasaws lock the camera so that it isn't disorienting. From 590227a13509751e3e8bd9c802c96afe36c48c48 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sat, 7 Jun 2025 17:37:14 -0400 Subject: [PATCH 16/30] Fix bailcharge fullbright --- src/info.c | 2 +- src/k_kart.c | 1 + src/objects/bail.c | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/info.c b/src/info.c index d3bad37b5..a8133ddb3 100644 --- a/src/info.c +++ b/src/info.c @@ -2168,7 +2168,7 @@ state_t states[NUMSTATES] = {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 8, {NULL}, 8, 1, S_BAIB}, // S_BAIL {SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB {SPR_BAIC, FF_FULLBRIGHT|FF_ANIMATE|0, 11, {NULL}, 10, 1, S_NULL}, // S_BAIC - {SPR_TECH, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE + {SPR_TECH, 0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING {SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY diff --git a/src/k_kart.c b/src/k_kart.c index 85d74c0cb..d133b71db 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13971,6 +13971,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) { mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); P_SetTarget(&bail->target, player->mo); + bail->renderflags |= RF_FULLBRIGHT; // set fullbright here, were gonna animate frames in the thinker and it saves us from setting FF_FULLBRIGHT every frame } } else diff --git a/src/objects/bail.c b/src/objects/bail.c index cd8e2c686..c1c3a0d93 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -62,7 +62,6 @@ void Obj_BailChargeThink (mobj_t *aura) aura->flags |= MF_NOCLIPTHING; // aura->color = mo->color; - aura->anim_duration = 999; // This prevents FF_ANIMATE from working, we're gonna animate manually ourselves here aura->frame = ((player->bailcharge-1)/2); // By syncing the frame with the charge timer here fixed_t baseScale = 13*mo->scale/10; From f7c9f5dfafc9a1ae0c832b6b1447a5e7d1d5b76e Mon Sep 17 00:00:00 2001 From: Ashnal Date: Sat, 7 Jun 2025 18:03:56 -0400 Subject: [PATCH 17/30] Rebase whoopsies fixups --- src/k_kart.c | 1 + src/k_menufunc.c | 4 ++-- src/p_setup.cpp | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index d133b71db..60bc2a5b0 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10009,6 +10009,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) // Extra tripwire leniency for the end of invincibility if (player->invincibilitytimer <= 0) { player->tripwireLeniency = max( player->tripwireLeniency, TICRATE ); + } } if (player->baildrop) diff --git a/src/k_menufunc.c b/src/k_menufunc.c index 4438781cc..64da0fecd 100644 --- a/src/k_menufunc.c +++ b/src/k_menufunc.c @@ -465,8 +465,8 @@ boolean M_Responder(event_t *ev) // Special mid-game input behaviours if (Playing() && !demo.playback) { - // Quick Retry (Y in modeattacking) - if (modeattacking && G_PlayerInputDown(0, gc_bail, splitscreen + 1) == true) + // Quick Retry (Z in modeattacking) + if (modeattacking && G_PlayerInputDown(0, gc_vote, splitscreen + 1) == true) { M_TryAgain(0); return true; diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 9a781ac12..b6bdc8c65 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -8698,7 +8698,7 @@ boolean P_LoadLevel(boolean fromnetsave, boolean reloadinggamestate) if (G_IsModeAttackRetrying() && !demo.playback) { nowtime = lastwipetic; - while (G_PlayerInputDown(0, gc_respawn, splitscreen + 1) == true) + while (G_PlayerInputDown(0, gc_vote, splitscreen + 1) == true) { while (!((nowtime = I_GetTime()) - lastwipetic)) { From 254cb891c93c4e7da15868b3d9d2fe4ee24e1b0c Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sat, 7 Jun 2025 20:21:37 -0400 Subject: [PATCH 18/30] Weaker bail boost, fix double flingring baildrop --- src/k_kart.c | 18 +++++------------- src/k_kart.h | 6 +++--- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 60bc2a5b0..32065eaf6 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10045,6 +10045,10 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) P_FlingBurst(player, K_MomentumAngle(pmo), MT_FLINGRING, 10*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); S_StartSound(pmo, sfx_gshad); } + + player->baildrop--; + if (player->baildrop == 0) + player->ringboost /= 3; } // The precise ordering of start-of-level made me want to cut my head off, @@ -10065,16 +10069,6 @@ 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, 10*TICRATE, FRACUNIT, player->baildrop/BAIL_DROPFREQUENCY); - S_StartSound(player->mo, sfx_gshad); - } - player->baildrop--; - } - if (!player->invincibilitytimer) player->invincibilityextensions = 0; @@ -13982,8 +13976,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((!P_PlayerInPain(player) && player->bailcharge) || player->bailcharge >= BAIL_MAXCHARGE) { - CONS_Printf("rl %d it %d ia %d ri %d sr %d pr %d\n", player->itemRoulette.active, player->itemtype, player->itemamount, player->rings > 0, player->superring > 0, player->pickuprings > 0); - player->bailcharge = 0; mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL); @@ -13996,7 +13988,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->rings = 0; } - UINT32 totalrings = player->rings + player->superring + player->pickuprings + debtrings; + 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)); diff --git a/src/k_kart.h b/src/k_kart.h index b2e3a02a6..914280fe5 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -45,9 +45,9 @@ Make sure this matches the actual number of states #define PUNISHWINDOW (7*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) -#define BAIL_BOOST (FRACUNIT) -#define BAIL_DROPFREQUENCY (3) +#define BAIL_DROP (FRACUNIT/2) +#define BAIL_BOOST (40*FRACUNIT/100) +#define BAIL_DROPFREQUENCY (1) #define BAILSTUN (TICRATE*10) #define MAXCOMBOTHRUST (mapobjectscale*20) From 1ef0cd03c665804c617b957a5a857bc282fcf610 Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Sat, 7 Jun 2025 21:51:07 -0400 Subject: [PATCH 19/30] Small buff More bail time, more ringboost retention, more drops --- src/k_kart.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_kart.h b/src/k_kart.h index 914280fe5..89f7fd13f 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -45,9 +45,9 @@ Make sure this matches the actual number of states #define PUNISHWINDOW (7*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/2) -#define BAIL_BOOST (40*FRACUNIT/100) -#define BAIL_DROPFREQUENCY (1) +#define BAIL_DROP (2*FRACUNIT/3) +#define BAIL_BOOST (80*FRACUNIT/100) +#define BAIL_DROPFREQUENCY (2) #define BAILSTUN (TICRATE*10) #define MAXCOMBOTHRUST (mapobjectscale*20) From a9a5e68c8a9f72f5058084ac14d7763b087db84d Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Sat, 7 Jun 2025 22:18:29 -0400 Subject: [PATCH 20/30] Keep even more speed 80%->90% --- src/k_kart.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/k_kart.h b/src/k_kart.h index 89f7fd13f..e5f209b05 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -46,7 +46,7 @@ Make sure this matches the actual number of states #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 (2*FRACUNIT/3) -#define BAIL_BOOST (80*FRACUNIT/100) +#define BAIL_BOOST (90*FRACUNIT/100) #define BAIL_DROPFREQUENCY (2) #define BAILSTUN (TICRATE*10) From dc3c3a056ad66f252ed1617720bda9818460ca09 Mon Sep 17 00:00:00 2001 From: Antonio Martinez Date: Sun, 8 Jun 2025 08:50:08 -0400 Subject: [PATCH 21/30] Use balanced ringboost rolloff in baildrop instead of legacy ringboost rolloff --- src/k_kart.c | 4 +++- src/k_kart.h | 5 +++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 32065eaf6..2a33a5da8 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -9823,7 +9823,7 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (!player->baildrop && (player->superring == 0 || player->stunned)) player->ringboost -= max((player->ringboost / roller), 1); - else if (K_LegacyRingboost(player) || player->baildrop) + else if (K_LegacyRingboost(player)) player->ringboost--; else player->ringboost -= min(K_GetFullKartRingPower(player, false) - 1, max(player->ringboost / 2 / roller, 1)); @@ -13989,6 +13989,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) } UINT32 totalrings = player->rings + player->superring + player->pickuprings; + if (BAIL_CREDIT_DEBTRINGS) + totalrings += debtrings; totalrings = max(totalrings, 0); UINT32 bailboost = FixedInt(FixedMul(totalrings*FRACUNIT, BAIL_BOOST)); UINT32 baildrop = FixedInt(FixedMul((totalrings)*FRACUNIT, BAIL_DROP)); diff --git a/src/k_kart.h b/src/k_kart.h index e5f209b05..4b580f115 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -45,8 +45,9 @@ Make sure this matches the actual number of states #define PUNISHWINDOW (7*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 (2*FRACUNIT/3) -#define BAIL_BOOST (90*FRACUNIT/100) +#define BAIL_DROP (FRACUNIT) +#define BAIL_BOOST (FRACUNIT) +#define BAIL_CREDIT_DEBTRINGS (true) #define BAIL_DROPFREQUENCY (2) #define BAILSTUN (TICRATE*10) From fffe84fd18f8c06fa1efe1cbbc278a4e153b3303 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 23 Jun 2025 18:02:10 -0400 Subject: [PATCH 22/30] Experimental 2 tics accidental bail guard prevents accidently bailing when trying to mash the respawn macro --- 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 2a33a5da8..53c89cf74 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13974,7 +13974,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->bailcharge = 0; } - if ((!P_PlayerInPain(player) && player->bailcharge) || player->bailcharge >= BAIL_MAXCHARGE) + if ((!P_PlayerInPain(player) && player->bailcharge >= 5) || player->bailcharge >= BAIL_MAXCHARGE) { player->bailcharge = 0; From 3cd254d9476d9faac84c8c0d0832f9a7e6730122 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 23 Jun 2025 19:34:19 -0400 Subject: [PATCH 23/30] Sound effects source from the bail vfx object, so they should cancel if the effect ends early also audible to other players --- src/k_kart.c | 2 ++ src/objects/bail.c | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/src/k_kart.c b/src/k_kart.c index 53c89cf74..73d669606 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13965,6 +13965,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((P_PlayerInPain(player) && player->bailcharge == 1) || (grounded && P_PlayerInPain(player) && player->bailcharge == 2)) // this is brittle .. { mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); + S_StartSound(bail, sfx_gshb9); P_SetTarget(&bail->target, player->mo); bail->renderflags |= RF_FULLBRIGHT; // set fullbright here, were gonna animate frames in the thinker and it saves us from setting FF_FULLBRIGHT every frame } @@ -13979,6 +13980,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->bailcharge = 0; mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL); + S_StartSound(bail, sfx_kc33); P_SetTarget(&bail->target, player->mo); UINT32 debtrings = 20; diff --git a/src/objects/bail.c b/src/objects/bail.c index c1c3a0d93..47f839ea5 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -16,6 +16,7 @@ #include "../info.h" #include "../k_kart.h" #include "../p_local.h" +#include "../s_sound.h" void Obj_BailThink (mobj_t *aura) { @@ -56,6 +57,12 @@ void Obj_BailChargeThink (mobj_t *aura) mobj_t *mo = aura->target; player_t *player = mo->player; + // play sound + if (aura->target->player->bailcharge == 34 || aura->target->player->bailcharge == 34) + { + S_StartSound(aura, sfx_kc4e); + } + // Follow player aura->flags &= ~(MF_NOCLIPTHING); P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); From ff9644c278e2b3365886a3d6018e7feec1585552 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 23 Jun 2025 23:41:46 -0400 Subject: [PATCH 24/30] Sound effects again --- src/deh_tables.c | 4 +++- src/info.c | 11 ++++++++--- src/info.h | 4 +++- src/k_kart.c | 6 +++--- src/objects/bail.c | 6 ------ 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/deh_tables.c b/src/deh_tables.c index 9e037f4f2..a880a1766 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -1575,7 +1575,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKBODY", "S_BAIL", - "S_BAIB", + "S_BAIB1", + "S_BAIB2", + "S_BAIB3", "S_BAIC", "S_BAILCHARGE", diff --git a/src/info.c b/src/info.c index a8133ddb3..93f6bddae 100644 --- a/src/info.c +++ b/src/info.c @@ -2165,10 +2165,15 @@ state_t states[NUMSTATES] = {SPR_GRNG, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_BLOCKRING {SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY - {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 8, {NULL}, 8, 1, S_BAIB}, // S_BAIL - {SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB + // why can we not use actions on spawn? I'd love to fix it but I imagine all sorts of crazy pain if I change something fundamental like that + {SPR_BAIL, FF_FULLBRIGHT|FF_ANIMATE|0, 9, {NULL}, 8, 1, S_BAIB1}, // S_BAIL + {SPR_BAIB, 0, 0, {A_PlaySound}, sfx_gshb2, 2, S_BAIB2}, // S_BAIB1 + {SPR_BAIB, 0, 0, {A_PlaySound}, sfx_gshbd, 2, S_BAIB3}, // S_BAIB2 + {SPR_BAIB, FF_FULLBRIGHT|FF_ANIMATE|0, 10, {NULL}, 9, 1, S_NULL}, // S_BAIB3 + {SPR_BAIC, FF_FULLBRIGHT|FF_ANIMATE|0, 11, {NULL}, 10, 1, S_NULL}, // S_BAIC - {SPR_TECH, 0, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE + + {SPR_TECH, 1, -1, {NULL}, 41, 1, S_NULL}, // S_BAILCHARGE {SPR_AMPB, FF_FULLBRIGHT|FF_PAPERSPRITE|0, -1, {NULL}, 0, 0, S_NULL}, // S_AMPRING {SPR_AMPC, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_AMPBODY diff --git a/src/info.h b/src/info.h index 3a3354263..996b721e2 100644 --- a/src/info.h +++ b/src/info.h @@ -2635,7 +2635,9 @@ typedef enum state S_BLOCKBODY, S_BAIL, - S_BAIB, + S_BAIB1, + S_BAIB2, + S_BAIB3, S_BAIC, S_BAILCHARGE, diff --git a/src/k_kart.c b/src/k_kart.c index 73d669606..09c7fae63 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -13965,7 +13965,8 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if ((P_PlayerInPain(player) && player->bailcharge == 1) || (grounded && P_PlayerInPain(player) && player->bailcharge == 2)) // this is brittle .. { mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAILCHARGE); - S_StartSound(bail, sfx_gshb9); + S_StartSound(bail, sfx_gshb9); // I tried to use info.c, but you can't play sounds on mobjspawn via A_PlaySound + S_StartSound(bail, sfx_kc4e); P_SetTarget(&bail->target, player->mo); bail->renderflags |= RF_FULLBRIGHT; // set fullbright here, were gonna animate frames in the thinker and it saves us from setting FF_FULLBRIGHT every frame } @@ -13980,7 +13981,6 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->bailcharge = 0; mobj_t *bail = P_SpawnMobj(player->mo->x, player->mo->y, player->mo->z + player->mo->height/2, MT_BAIL); - S_StartSound(bail, sfx_kc33); P_SetTarget(&bail->target, player->mo); UINT32 debtrings = 20; @@ -14054,7 +14054,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) if (player->amps > 0) K_DefensiveOverdrive(player); - S_StartSound(player->mo, sfx_gshdd); + S_StartSound(player->mo, sfx_kc33); } if (player && player->mo && K_PlayerCanUseItem(player)) diff --git a/src/objects/bail.c b/src/objects/bail.c index 47f839ea5..2b5b7d622 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -57,12 +57,6 @@ void Obj_BailChargeThink (mobj_t *aura) mobj_t *mo = aura->target; player_t *player = mo->player; - // play sound - if (aura->target->player->bailcharge == 34 || aura->target->player->bailcharge == 34) - { - S_StartSound(aura, sfx_kc4e); - } - // Follow player aura->flags &= ~(MF_NOCLIPTHING); P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); From b131b443538b577fa06f4319d3e6d409c67be28b Mon Sep 17 00:00:00 2001 From: Ashnal Date: Tue, 24 Jun 2025 22:45:11 -0400 Subject: [PATCH 25/30] bailquake --- src/d_player.h | 1 + src/k_kart.c | 4 ++++ src/lua_playerlib.c | 8 ++++++-- src/p_saveg.cpp | 2 ++ src/p_spec.c | 9 ++++++++- 5 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index fddbd9c51..b35a60835 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1083,6 +1083,7 @@ struct player_t UINT32 bailcharge; UINT32 baildrop; + UINT8 bailquake; boolean analoginput; // Has an input been recorded that requires analog usage? For input display. diff --git a/src/k_kart.c b/src/k_kart.c index 09c7fae63..89a9e8c2c 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10051,6 +10051,9 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->ringboost /= 3; } + if (player->bailquake) + player->bailquake--; + // The precise ordering of start-of-level made me want to cut my head off, // so let's try this instead. Whatever! if (leveltime <= starttime || player->gradingpointnum == 0) @@ -14033,6 +14036,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->baildrop = baildrop * BAIL_DROPFREQUENCY + 1; K_AddHitLag(player->mo, TICRATE/4, false); + player->bailquake = player->mo->hitlag + TICRATE; // the quake effect that uses this will ignore it during hitlag and trigger after, so it needs to be longer than the hitlag if (P_PlayerInPain(player)) { diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index faea1a8ee..ffbd731e6 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -285,9 +285,11 @@ static int player_get(lua_State *L) else if (fastcmp(field,"ringvisualwarning")) lua_pushboolean(L, plr->ringvisualwarning); else if (fastcmp(field,"bailcharge")) - lua_pushboolean(L, plr->bailcharge); + lua_pushinteger(L, plr->bailcharge); else if (fastcmp(field,"baildrop")) - lua_pushboolean(L, plr->baildrop); + lua_pushinteger(L, plr->baildrop); + else if (fastcmp(field,"bailquake")) + lua_pushinteger(L, plr->bailquake); else if (fastcmp(field,"dotrickfx")) lua_pushboolean(L, plr->dotrickfx); else if (fastcmp(field,"stingfx")) @@ -918,6 +920,8 @@ static int player_set(lua_State *L) plr->bailcharge = luaL_checkinteger(L, 3); else if (fastcmp(field,"baildrop")) plr->baildrop = luaL_checkinteger(L, 3); + else if (fastcmp(field,"bailquake")) + plr->bailquake = 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_saveg.cpp b/src/p_saveg.cpp index 878572929..869a4730b 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -669,6 +669,7 @@ static void P_NetArchivePlayers(savebuffer_t *save) WRITEUINT32(save->p, players[i].bailcharge); WRITEUINT32(save->p, players[i].baildrop); + WRITEUINT8(save->p, players[i].bailquake); WRITEUINT8(save->p, players[i].analoginput); @@ -1327,6 +1328,7 @@ static void P_NetUnArchivePlayers(savebuffer_t *save) players[i].bailcharge = READUINT32(save->p); players[i].baildrop = READUINT32(save->p); + players[i].bailquake = READUINT8(save->p); players[i].analoginput = READUINT8(save->p); diff --git a/src/p_spec.c b/src/p_spec.c index ca923d809..e543456af 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -9635,7 +9635,7 @@ void P_DoQuakeOffset(UINT8 view, mappoint_t *viewPos, mappoint_t *offset) quake = quake->next; } - // Add level-based effects. + // Add level-based effects, and local bailquake if (P_MobjWasRemoved(viewer->mo) == false && viewer->speed > viewer->mo->scale && P_IsObjectOnGround(viewer->mo) == true) @@ -9653,6 +9653,13 @@ void P_DoQuakeOffset(UINT8 view, mappoint_t *viewPos, mappoint_t *offset) ir = FixedMul((viewer->stairjank * FRACUNIT * 5) / 17, mapobjectscale); addZ += ir; } + + // add bail effect + if (viewer->bailquake > 0 && !viewer->mo->hitlag) // only start after hitlag ends + { + ir = FixedMul((viewer->bailquake * FRACUNIT * 5) / 17, mapobjectscale); + addZ += ir; + } } fixed_t maxShake = FixedMul(cv_cam_height[view].value, mapobjectscale) * 3 / 4; From 71a11753155eccfa4df2c2c859aa4e7612ef63f8 Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Wed, 25 Jun 2025 18:07:52 -0400 Subject: [PATCH 26/30] Bail quake is multiversal Everyone should feel that shit --- src/k_kart.c | 15 ++++++++++++++- src/p_spec.c | 7 +------ 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/k_kart.c b/src/k_kart.c index 89a9e8c2c..1ae47cc90 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10054,6 +10054,14 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->bailquake) player->bailquake--; + // bail camera shake + if (player->bailquake > 0 && !player->mo->hitlag) // only start after hitlag ends + { + P_StartQuakeFromMobj(1, 50 * player->mo->scale, 2048 * player->mo->scale, player->mo); + } + + + // The precise ordering of start-of-level made me want to cut my head off, // so let's try this instead. Whatever! if (leveltime <= starttime || player->gradingpointnum == 0) @@ -14036,7 +14044,12 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->baildrop = baildrop * BAIL_DROPFREQUENCY + 1; K_AddHitLag(player->mo, TICRATE/4, false); - player->bailquake = player->mo->hitlag + TICRATE; // the quake effect that uses this will ignore it during hitlag and trigger after, so it needs to be longer than the hitlag + player->bailquake = player->mo->hitlag; // the quake effect that uses this will ignore it during hitlag and trigger after, so it needs to be longer than the hitlag + + //if (player->mo->hitlag > 0) // bail blink; make the player invisible during the swish, like classic games. + //{ + //player->mo->renderflags |= RF_DONTDRAW; + //} if (P_PlayerInPain(player)) { diff --git a/src/p_spec.c b/src/p_spec.c index e543456af..4f7606aaa 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -9654,12 +9654,7 @@ void P_DoQuakeOffset(UINT8 view, mappoint_t *viewPos, mappoint_t *offset) addZ += ir; } - // add bail effect - if (viewer->bailquake > 0 && !viewer->mo->hitlag) // only start after hitlag ends - { - ir = FixedMul((viewer->bailquake * FRACUNIT * 5) / 17, mapobjectscale); - addZ += ir; - } + } fixed_t maxShake = FixedMul(cv_cam_height[view].value, mapobjectscale) * 3 / 4; From 1086c1e7990ed4ff3b4c918c68e9ae5f401f31f9 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Wed, 25 Jun 2025 19:07:10 -0400 Subject: [PATCH 27/30] Bailquake Cleanup --- src/d_player.h | 2 +- src/k_kart.c | 20 +++++--------------- src/lua_playerlib.c | 4 ++-- src/p_spec.c | 4 +--- 4 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/d_player.h b/src/d_player.h index b35a60835..2fd34d7f6 100644 --- a/src/d_player.h +++ b/src/d_player.h @@ -1083,7 +1083,7 @@ struct player_t UINT32 bailcharge; UINT32 baildrop; - UINT8 bailquake; + boolean bailquake; boolean analoginput; // Has an input been recorded that requires analog usage? For input display. diff --git a/src/k_kart.c b/src/k_kart.c index 1ae47cc90..b13d383ee 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10051,16 +10051,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->ringboost /= 3; } - if (player->bailquake) - player->bailquake--; - - // bail camera shake - if (player->bailquake > 0 && !player->mo->hitlag) // only start after hitlag ends + if (player->bailquake) // quake as soon as we leave hitlag { - P_StartQuakeFromMobj(1, 50 * player->mo->scale, 2048 * player->mo->scale, player->mo); - } - - + P_StartQuakeFromMobj(7, 50 * player->mo->scale, 2048 * player->mo->scale, player->mo); + player->bailquake = false; + } // The precise ordering of start-of-level made me want to cut my head off, // so let's try this instead. Whatever! @@ -14044,12 +14039,7 @@ void K_MoveKartPlayer(player_t *player, boolean onground) player->baildrop = baildrop * BAIL_DROPFREQUENCY + 1; K_AddHitLag(player->mo, TICRATE/4, false); - player->bailquake = player->mo->hitlag; // the quake effect that uses this will ignore it during hitlag and trigger after, so it needs to be longer than the hitlag - - //if (player->mo->hitlag > 0) // bail blink; make the player invisible during the swish, like classic games. - //{ - //player->mo->renderflags |= RF_DONTDRAW; - //} + player->bailquake = true; // set for a one time quake effect as soon as hitlag ends if (P_PlayerInPain(player)) { diff --git a/src/lua_playerlib.c b/src/lua_playerlib.c index ffbd731e6..0b0e541bd 100644 --- a/src/lua_playerlib.c +++ b/src/lua_playerlib.c @@ -289,7 +289,7 @@ static int player_get(lua_State *L) else if (fastcmp(field,"baildrop")) lua_pushinteger(L, plr->baildrop); else if (fastcmp(field,"bailquake")) - lua_pushinteger(L, plr->bailquake); + lua_pushboolean(L, plr->bailquake); else if (fastcmp(field,"dotrickfx")) lua_pushboolean(L, plr->dotrickfx); else if (fastcmp(field,"stingfx")) @@ -921,7 +921,7 @@ static int player_set(lua_State *L) else if (fastcmp(field,"baildrop")) plr->baildrop = luaL_checkinteger(L, 3); else if (fastcmp(field,"bailquake")) - plr->bailquake = luaL_checkinteger(L, 3); + plr->bailquake = luaL_checkboolean(L, 3); else if (fastcmp(field,"analoginput")) plr->analoginput = luaL_checkboolean(L, 3); else if (fastcmp(field,"transfer")) diff --git a/src/p_spec.c b/src/p_spec.c index 4f7606aaa..36e6531b7 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -9635,7 +9635,7 @@ void P_DoQuakeOffset(UINT8 view, mappoint_t *viewPos, mappoint_t *offset) quake = quake->next; } - // Add level-based effects, and local bailquake + // Add level-based effects if (P_MobjWasRemoved(viewer->mo) == false && viewer->speed > viewer->mo->scale && P_IsObjectOnGround(viewer->mo) == true) @@ -9653,8 +9653,6 @@ void P_DoQuakeOffset(UINT8 view, mappoint_t *viewPos, mappoint_t *offset) ir = FixedMul((viewer->stairjank * FRACUNIT * 5) / 17, mapobjectscale); addZ += ir; } - - } fixed_t maxShake = FixedMul(cv_cam_height[view].value, mapobjectscale) * 3 / 4; From e5c981d4ba6dbd2975717bfc674a795bce21f934 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Wed, 25 Jun 2025 19:15:57 -0400 Subject: [PATCH 28/30] Bail invisibility --- src/objects/bail.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/objects/bail.c b/src/objects/bail.c index 2b5b7d622..4d3d6824d 100644 --- a/src/objects/bail.c +++ b/src/objects/bail.c @@ -39,6 +39,10 @@ void Obj_BailThink (mobj_t *aura) fixed_t baseScale = 12*mo->scale/10; P_SetScale(aura, baseScale); + + // make target player invisible during the effect, like the retro games + if (aura->state == &states[S_BAIL]) + mo->renderflags |= RF_DONTDRAW; } } From e4c36130e50ecdc53d10a577046bcd5b3e47eec1 Mon Sep 17 00:00:00 2001 From: Ashnal Date: Wed, 25 Jun 2025 19:47:58 -0400 Subject: [PATCH 29/30] oops, make sure to only quake after hitlag --- 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 b13d383ee..5c26285fb 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -10051,11 +10051,11 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) player->ringboost /= 3; } - if (player->bailquake) // quake as soon as we leave hitlag + if (player->bailquake && !player->mo->hitlag) // quake as soon as we leave hitlag { P_StartQuakeFromMobj(7, 50 * player->mo->scale, 2048 * player->mo->scale, player->mo); player->bailquake = false; - } + } // The precise ordering of start-of-level made me want to cut my head off, // so let's try this instead. Whatever! From 862dd784d187a61ac08abea758810cbfe5947259 Mon Sep 17 00:00:00 2001 From: VelocitOni Date: Wed, 25 Jun 2025 20:02:51 -0400 Subject: [PATCH 30/30] Further reaching sfx All sounds reach further. Charging up noises are 4x away, ring swish and Gunstar explosions are 8x away (gloat dist) --- src/sounds.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sounds.c b/src/sounds.c index a14aa31b5..bb8c55633 100644 --- a/src/sounds.c +++ b/src/sounds.c @@ -778,7 +778,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"kc30", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc31", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc32", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, - {"kc33", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, + {"kc33", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away {"kc34", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc35", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc36", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, @@ -805,7 +805,7 @@ sfxinfo_t S_sfx[NUMSFX] = {"kc4b", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc4c", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Pop-shot"}, {"kc4d", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, "Power up"}, - {"kc4e", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, + {"kc4e", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away {"kc4f", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc50", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"kc51", false, 64, 64, -1, NULL, 0, -1, -1, LUMPERROR, ""}, @@ -1432,18 +1432,18 @@ sfxinfo_t S_sfx[NUMSFX] = {"gshaf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb0", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb1", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, - {"gshb2", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, + {"gshb2", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away {"gshb3", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb4", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb5", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb6", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb7", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshb8", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, - {"gshb9", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, + {"gshb9", false, 64, 8, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x4away {"gshba", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshbb", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshbc", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, - {"gshbd", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, + {"gshbd", false, 64, 16, -1, NULL, 0, -1, -1, LUMPERROR, ""}, //x8away {"gshbe", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshbf", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""}, {"gshc0a", false, 64, 0, -1, NULL, 0, -1, -1, LUMPERROR, ""},