From 6cc9de5efde03faa1995f09068c5c1f767c41e0f Mon Sep 17 00:00:00 2001 From: Ashnal Date: Fri, 9 May 2025 21:07:45 -0400 Subject: [PATCH] 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);