From e20218a9d6722758510b4b97d69ee37bc7cf29ed Mon Sep 17 00:00:00 2001 From: AJ Martinez Date: Sun, 12 Nov 2023 03:38:17 -0700 Subject: [PATCH] Trick Charge VFX WIP --- src/deh_tables.c | 4 ++++ src/info.c | 31 +++++++++++++++++++++++++++++++ src/info.h | 6 ++++++ src/k_kart.c | 15 +++++++++++++++ src/k_objects.h | 2 ++ src/objects/CMakeLists.txt | 1 + src/objects/charge.c | 34 ++++++++++++++++++++++++++++++++++ src/p_mobj.c | 5 +++++ 8 files changed, 98 insertions(+) create mode 100644 src/objects/charge.c diff --git a/src/deh_tables.c b/src/deh_tables.c index c0d35b1b5..4b11f9421 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -3325,6 +3325,8 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi "S_BLOCKRING", "S_BLOCKBODY", + "S_CHARGEAURA", + "S_SERVANTHAND", "S_HORNCODE", @@ -5555,6 +5557,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_BLOCKRING", "MT_BLOCKBODY", + "MT_CHARGEAURA", + "MT_SERVANTHAND", "MT_HORNCODE", diff --git a/src/info.c b/src/info.c index 8e3b38bb9..4e93c7473 100644 --- a/src/info.c +++ b/src/info.c @@ -567,6 +567,8 @@ char sprnames[NUMSPRITES + 1][5] = "GRNG", // Guard ring "GBDY", // Guard body + "TRC1", // Charge aura + "DHND", // Servant Hand "HORN", // Horncode @@ -4138,6 +4140,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_TRC1, FF_FULLBRIGHT|FF_ANIMATE|0, -1, {NULL}, 4, 2, S_NULL}, // S_CHARGEAURA + {SPR_DHND, 0, -1, {NULL}, 0, 0, S_NULL}, // S_SERVANTHAND {SPR_HORN, 0, -1, {NULL}, 0, 0, S_NULL}, // S_HORNCODE @@ -23241,6 +23245,33 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = S_NULL // raisestate }, + { // MT_CHARGEAURA + -1, // doomednum + S_CHARGEAURA, // 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 + 0, // display offset + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY|MF_NOCLIPHEIGHT, // flags + S_NULL // raisestate + }, + { // MT_SERVANTHAND -1, // doomednum S_SERVANTHAND, // spawnstate diff --git a/src/info.h b/src/info.h index f27c34e85..54cb2ed75 100644 --- a/src/info.h +++ b/src/info.h @@ -1124,6 +1124,8 @@ typedef enum sprite SPR_GRNG, // Guard ring SPR_GBDY, // Guard body + SPR_TRC1, // Charge aura + SPR_DHND, // Servant Hand SPR_HORN, // Horncode @@ -4549,6 +4551,8 @@ typedef enum state S_BLOCKRING, S_BLOCKBODY, + S_CHARGEAURA, + S_SERVANTHAND, S_HORNCODE, @@ -6817,6 +6821,8 @@ typedef enum mobj_type MT_BLOCKRING, MT_BLOCKBODY, + MT_CHARGEAURA, + MT_SERVANTHAND, MT_HORNCODE, diff --git a/src/k_kart.c b/src/k_kart.c index 904ed2b56..da2dbb070 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -8532,8 +8532,23 @@ void K_KartPlayerThink(player_t *player, ticcmd_t *cmd) if (player->dotrickfx && !player->mo->hitlag) { + int i; S_StartSound(player->mo, sfx_trick1); + + if (!player->trickcharge) + { + for(i = 0;i < 5;i++) + { + mobj_t *aura = P_SpawnMobjFromMobj(player->mo, 0, 0, player->mo->height/2, MT_CHARGEAURA); + aura->angle = player->mo->angle + i*ANG15; + aura->target = player->mo; + if (i != 0) + aura->renderflags |= RF_TRANS50; + } + } + player->trickcharge = 8*TICRATE; + player->dotrickfx = false; } diff --git a/src/k_objects.h b/src/k_objects.h index c88bf3320..baae5e050 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -126,6 +126,8 @@ void Obj_BlockRingThink(mobj_t *ring); void Obj_BlockBodyThink(mobj_t *body); void Obj_GuardBreakThink(mobj_t *fx); +void Obj_ChargeAuraThink(mobj_t *aura); + /* Ring Shooter */ boolean Obj_RingShooterThinker(mobj_t *mo); boolean Obj_PlayerRingShooterFreeze(player_t *const player); diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index 1e035d52d..8abbd34ee 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -39,6 +39,7 @@ target_sources(SRB2SDL2 PRIVATE wpzothers.c shadow.cpp ball-switch.cpp + charge.c ) add_subdirectory(versus) diff --git a/src/objects/charge.c b/src/objects/charge.c new file mode 100644 index 000000000..6566b69c3 --- /dev/null +++ b/src/objects/charge.c @@ -0,0 +1,34 @@ +#include "../doomdef.h" +#include "../info.h" +#include "../k_objects.h" +#include "../p_local.h" +#include "../k_kart.h" +#include "../k_powerup.h" + +void Obj_ChargeAuraThink (mobj_t *aura) +{ + if (P_MobjWasRemoved(aura->target) || !aura->target->player || !aura->target->player->trickcharge) + { + 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; + + fixed_t baseScale = 12*mo->scale/10; + P_SetScale(aura, baseScale); + + // Twirl + aura->angle = aura->angle - ANG1*(player->trickcharge/TICRATE + 4); + // Visuals + aura->renderflags |= RF_PAPERSPRITE|RF_ADD; + + } +} \ No newline at end of file diff --git a/src/p_mobj.c b/src/p_mobj.c index 565647cb7..732231631 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8781,6 +8781,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) Obj_BlockBodyThink(mobj); break; } + case MT_CHARGEAURA: + { + Obj_ChargeAuraThink(mobj); + break; + } case MT_GUARDBREAK: { Obj_GuardBreakThink(mobj);