Implementing animations

non-painstate animation isn't correct yet
This commit is contained in:
Ashnal 2025-05-09 21:07:45 -04:00
parent 3146110d08
commit 6cc9de5efd
9 changed files with 127 additions and 3 deletions

View file

@ -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",

View file

@ -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

View file

@ -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,

View file

@ -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)

View file

@ -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)

View file

@ -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);

View file

@ -66,6 +66,7 @@ target_sources(SRB2SDL2 PRIVATE
flame-shield.cpp
stone-shoe.cpp
exp.c
bail.c
)
add_subdirectory(versus)

53
src/objects/bail.c Normal file
View file

@ -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);
}
}

View file

@ -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);