From a57273a2aab516395404e0b741b3c09673b4b95e Mon Sep 17 00:00:00 2001 From: Ashnal Date: Mon, 12 May 2025 20:14:52 -0400 Subject: [PATCH] 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);