WIP: refactor bailcharge into own MT and fix effects

still needs gameplay tuning
This commit is contained in:
Ashnal 2025-05-12 20:14:52 -04:00
parent d297577d8b
commit a57273a2aa
8 changed files with 73 additions and 15 deletions

View file

@ -1575,7 +1575,7 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi
"S_BLOCKBODY", "S_BLOCKBODY",
"S_BAIL", "S_BAIL",
"S_TECHCHARGE", "S_BAILCHARGE",
"S_AMPRING", "S_AMPRING",
"S_AMPBODY", "S_AMPBODY",
@ -3568,6 +3568,7 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t
"MT_BLOCKBODY", "MT_BLOCKBODY",
"MT_BAIL", "MT_BAIL",
"MT_BAILCHARGE",
"MT_AMPRING", "MT_AMPRING",
"MT_AMPBODY", "MT_AMPBODY",

View file

@ -2164,7 +2164,7 @@ state_t states[NUMSTATES] =
{SPR_GBDY, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_BLOCKBODY {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, -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_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_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 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 { // MT_AMPRING
-1, // doomednum -1, // doomednum
S_AMPRING, // spawnstate S_AMPRING, // spawnstate

View file

@ -2633,7 +2633,7 @@ typedef enum state
S_BLOCKBODY, S_BLOCKBODY,
S_BAIL, S_BAIL,
S_TECHCHARGE, S_BAILCHARGE,
S_AMPRING, S_AMPRING,
S_AMPBODY, S_AMPBODY,
@ -4653,6 +4653,7 @@ typedef enum mobj_type
MT_BLOCKBODY, MT_BLOCKBODY,
MT_BAIL, MT_BAIL,
MT_BAILCHARGE,
MT_AMPRING, MT_AMPRING,
MT_AMPBODY, MT_AMPBODY,

View file

@ -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)) if ((player->cmd.buttons & BT_VOTE) && ((player->itemtype && player->itemamount) || (player->rings > 0) || player->superring > 0 || player->pickuprings > 0 || player->itemRoulette.active))
{ {
player->bailcharge++; 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 else
@ -13934,13 +13935,13 @@ void K_MoveKartPlayer(player_t *player, boolean onground)
player->bailcharge = 0; 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); 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; 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); P_SetTarget(&bail->target, player->mo);
UINT32 debtrings = 20; UINT32 debtrings = 20;

View file

@ -44,8 +44,7 @@ Make sure this matches the actual number of states
#define INSTAWHIP_TETHERBLOCK (TICRATE*4) #define INSTAWHIP_TETHERBLOCK (TICRATE*4)
#define PUNISHWINDOW (7*TICRATE/10) #define PUNISHWINDOW (7*TICRATE/10)
#define BAIL_MAXCHARGE (9) // tics to bail when not in painstate #define BAIL_MAXCHARGE (42) // tics to bail when not in painstate
#define BAIL_PAINMAXCHARGE (42) // tics to bail when in painstate
#define BAIL_DROP (FRACUNIT/2) #define BAIL_DROP (FRACUNIT/2)
#define BAIL_BOOST (FRACUNIT) #define BAIL_BOOST (FRACUNIT)
#define BAIL_DROPFREQUENCY (3) #define BAIL_DROPFREQUENCY (3)

View file

@ -155,6 +155,7 @@ void Obj_ChargeExtraThink(mobj_t *extra);
/* Bail VFX */ /* Bail VFX */
void Obj_BailThink(mobj_t *aura); void Obj_BailThink(mobj_t *aura);
void Obj_BailChargeThink(mobj_t *aura);
/* Ring Shooter */ /* Ring Shooter */
boolean Obj_RingShooterThinker(mobj_t *mo); boolean Obj_RingShooterThinker(mobj_t *mo);

View file

@ -32,12 +32,6 @@ void Obj_BailThink (mobj_t *aura)
mobj_t *mo = aura->target; mobj_t *mo = aura->target;
player_t *player = mo->player; player_t *player = mo->player;
if (P_PlayerInPain(player) && aura->state != &states[S_TECHCHARGE])
{
P_SetMobjState(aura, S_TECHCHARGE);
player->bailcharge = 1;
}
// Follow player // Follow player
aura->flags &= ~(MF_NOCLIPTHING); aura->flags &= ~(MF_NOCLIPTHING);
P_MoveOrigin(aura, mo->x, mo->y, mo->z + mo->height/2); 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); 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);
}
}

View file

@ -8928,6 +8928,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj)
Obj_BailThink(mobj); Obj_BailThink(mobj);
break; break;
} }
case MT_BAILCHARGE:
{
Obj_BailChargeThink(mobj);
break;
}
case MT_AMPRING: case MT_AMPRING:
{ {
Obj_AmpRingThink(mobj); Obj_AmpRingThink(mobj);