From 10e9cd7480a4e3a40e9097322c4533dce617ffbd Mon Sep 17 00:00:00 2001 From: SteelT Date: Wed, 10 Jan 2024 21:27:37 -0500 Subject: [PATCH] Hardcode waterfall particles spawner --- src/deh_tables.c | 5 +++++ src/info.c | 32 +++++++++++++++++++++++++++ src/info.h | 8 +++++++ src/k_objects.h | 3 +++ src/objects/CMakeLists.txt | 1 + src/objects/waterfall-particle.c | 38 ++++++++++++++++++++++++++++++++ src/p_mobj.c | 5 +++++ 7 files changed, 92 insertions(+) create mode 100644 src/objects/waterfall-particle.c diff --git a/src/deh_tables.c b/src/deh_tables.c index 718cf2d55..9d1e8c638 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -4945,6 +4945,9 @@ const char *const STATE_LIST[] = { // array length left dynamic for sanity testi // MT_TRICKBALLOON_YELLOW_POINT "S_TRICKBALLOON_YELLOW_POINT1", + + // MT_WATERFALLPARTICLESPAWNER + "S_WATERFALLPARTICLE", }; // RegEx to generate this from info.h: ^\tMT_([^,]+), --> \t"MT_\1", @@ -6227,6 +6230,8 @@ const char *const MOBJTYPE_LIST[] = { // array length left dynamic for sanity t "MT_TRICKBALLOON_RED_POINT", "MT_TRICKBALLOON_YELLOW", "MT_TRICKBALLOON_YELLOW_POINT", + + "MT_WATERFALLPARTICLESPAWNER", }; const char *const MOBJFLAG_LIST[] = { diff --git a/src/info.c b/src/info.c index ed67a1076..66459f3ca 100644 --- a/src/info.c +++ b/src/info.c @@ -1034,6 +1034,9 @@ char sprnames[NUMSPRITES + 1][5] = "TKBR", "TKBY", + // Waterfall particles + "WTRP", + // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later "VIEW", }; @@ -5842,6 +5845,9 @@ state_t states[NUMSTATES] = // MT_TRICKBALLOON_YELLOW_POINT {SPR_NULL, 0, 1, {NULL}, 0, 0, S_TRICKBALLOON_YELLOW_POINT1}, // S_TRICKBALLOON_YELLOW_POINT1 + + // MT_WATERFALLPARTICLESPAWNER + {SPR_WTRP, FF_ANIMATE, 32, {NULL}, 31, 1, S_NULL}, }; mobjinfo_t mobjinfo[NUMMOBJTYPES] = @@ -33521,6 +33527,32 @@ mobjinfo_t mobjinfo[NUMMOBJTYPES] = MF_NOGRAVITY, // flags S_NULL // raisestate }, + { // MT_WATERFALLPARTICLESPAWNER + 3422, // doomednum + S_INVISIBLE, // spawnstate + 1, // 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 + 1*FRACUNIT, // radius + 1*FRACUNIT, // height + 0, // dispoffset + 0, // mass + 0, // damage + sfx_None, // activesound + MF_NOGRAVITY, // flags + S_NULL // raisestate + }, }; diff --git a/src/info.h b/src/info.h index e1d66e8b7..c36ccf111 100644 --- a/src/info.h +++ b/src/info.h @@ -1588,6 +1588,9 @@ typedef enum sprite SPR_TKBR, SPR_TKBY, + // Waterfall particles + SPR_WTRP, + // First person view sprites; this is a sprite so that it can be replaced by a specialized MD2 draw later SPR_VIEW, @@ -6267,6 +6270,9 @@ typedef enum state // MT_TRICKBALLOON_YELLOW_POINT S_TRICKBALLOON_YELLOW_POINT1, + // MT_WATERFALLPARTICLESPAWNER + S_WATERFALLPARTICLE, + S_FIRSTFREESLOT, S_LASTFREESLOT = S_FIRSTFREESLOT + NUMSTATEFREESLOTS - 1, NUMSTATES @@ -7571,6 +7577,8 @@ typedef enum mobj_type MT_TRICKBALLOON_YELLOW, MT_TRICKBALLOON_YELLOW_POINT, + MT_WATERFALLPARTICLESPAWNER, + MT_FIRSTFREESLOT, MT_LASTFREESLOT = MT_FIRSTFREESLOT + NUMMOBJFREESLOTS - 1, NUMMOBJTYPES diff --git a/src/k_objects.h b/src/k_objects.h index bab9e5d06..db04e0b8c 100644 --- a/src/k_objects.h +++ b/src/k_objects.h @@ -366,6 +366,9 @@ void Obj_PlayerBulbThink(player_t *player); void Obj_CloudTouched(mobj_t *special, mobj_t *toucher); void Obj_BulbTouched(mobj_t *special, mobj_t *toucher); +/* Waterfall Particles Spawner */ +void Obj_WaterfallParticleThink(mobj_t *mo); + #ifdef __cplusplus } // extern "C" #endif diff --git a/src/objects/CMakeLists.txt b/src/objects/CMakeLists.txt index 04c4bc6b9..b32ae5cec 100644 --- a/src/objects/CMakeLists.txt +++ b/src/objects/CMakeLists.txt @@ -51,6 +51,7 @@ target_sources(SRB2SDL2 PRIVATE emz-faucet.cpp trick-balloon.c cloud.c + waterfall-particle.c ) add_subdirectory(versus) diff --git a/src/objects/waterfall-particle.c b/src/objects/waterfall-particle.c new file mode 100644 index 000000000..7928c2c9a --- /dev/null +++ b/src/objects/waterfall-particle.c @@ -0,0 +1,38 @@ +// DR. ROBOTNIK'S RING RACERS +//----------------------------------------------------------------------------- +// Copyright (C) 2024 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 waterfall-particle.c +/// \brief Waterfall particle spawner. + +#include "../p_local.h" +#include "../m_random.h" +#include "../k_objects.h" + +void Obj_WaterfallParticleThink(mobj_t *mo) +{ + const INT32 radius = 320; + const INT32 momz = (mo->spawnpoint->angle) ? mo->spawnpoint->angle : 8; + + INT32 x = P_RandomRange(PR_DECORATION, -radius, radius)*mapobjectscale; + INT32 y = P_RandomRange(PR_DECORATION, -radius, radius)*mapobjectscale; + + mobj_t *particle = P_SpawnMobj(mo->x + x , mo->y + y , mo->z, MT_THOK); + + P_SetMobjState(particle, S_WATERFALLPARTICLE); + particle->momx = P_RandomRange(PR_DECORATION, -5, 5)*mapobjectscale; + particle->momy = P_RandomRange(PR_DECORATION, -5, 5)*mapobjectscale; + particle->momz = P_RandomRange(PR_DECORATION, momz/2, momz)*mapobjectscale*P_MobjFlip(mo); + + P_InstaScale(particle, 3 * particle->scale); + + if (mo->eflags & MFE_VERTICALFLIP) + { + particle->eflags |= MFE_VERTICALFLIP; + particle->flags2 |= MF2_OBJECTFLIP; + } +} diff --git a/src/p_mobj.c b/src/p_mobj.c index 17e115b17..ec21da173 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -10330,6 +10330,11 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->z = (mobj->extravalue1 - (16 * mobj->scale)) + sine; break; } + case MT_WATERFALLPARTICLESPAWNER: + { + Obj_WaterfallParticleThink(mobj); + break; + } default: // check mobj against possible water content, before movement code