From 7e362b1ee8cf83dbc7471472231527eddff6e952 Mon Sep 17 00:00:00 2001 From: toaster Date: Mon, 30 Oct 2023 00:13:03 +0000 Subject: [PATCH] MT_BLENDEYE_PUYO, MT_SPIKEDTARGET: Hardcode simple thinkers/init/death behaviour --- src/objects/versus/CMakeLists.txt | 1 + src/objects/versus/blendeye.c | 67 +++++++++++++++++++++++++++++++ src/p_inter.c | 10 +++++ src/p_mobj.c | 26 ++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 src/objects/versus/blendeye.c diff --git a/src/objects/versus/CMakeLists.txt b/src/objects/versus/CMakeLists.txt index 4addf9bfc..ade3ee75f 100644 --- a/src/objects/versus/CMakeLists.txt +++ b/src/objects/versus/CMakeLists.txt @@ -1,3 +1,4 @@ target_sources(SRB2SDL2 PRIVATE arena.c + blendeye.c ) diff --git a/src/objects/versus/blendeye.c b/src/objects/versus/blendeye.c new file mode 100644 index 000000000..f5ea72aae --- /dev/null +++ b/src/objects/versus/blendeye.c @@ -0,0 +1,67 @@ +// DR. ROBOTNIK'S RING RACERS +//----------------------------------------------------------------------------- +// Copyright (C) 2018-2023 by Vivian "toastergrl" Grannell +// Copyright (C) 2018-2023 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 k_boss.h +/// \brief Blend Eye boss encounter + +#include "../../p_local.h" +#include "../../m_random.h" +#include "../../k_boss.h" +#include "../../s_sound.h" +#include "../../r_main.h" // R_PointToAngle2, R_PointToDist2 + +boolean VS_PuyoTouched(mobj_t *special, mobj_t *toucher) +{ + if (!special->health || !toucher->health) + return false; // too dead + + if (special->state-states < S_BLENDEYE_PUYO) + return false; // too small + + P_DamageMobj(toucher, special, special->tracer, 1, DMG_NORMAL); + + special->momx = 0; + special->momy = 0; + special->momz = 0; + + return true; +} + +void VS_PuyoDeath(mobj_t *mobj) +{ + mobjtype_t dusttype = (encoremode ? MT_BLENDEYE_PUYO_DUST : MT_BLENDEYE_PUYO_DUST_COFFEE); + UINT8 i; + fixed_t momx, momy; + mobj_t *dustmo; + + mobj->renderflags &= ~RF_DONTDRAW; + mobj->rollangle = 0; + + mobj->angle = FixedAngle(P_RandomKey(PR_DECORATION, 360)*FRACUNIT); + for (i = 0; i <= 2; i++) + { + momx = P_ReturnThrustX(mobj, mobj->angle, 3*mobj->scale); + momy = P_ReturnThrustY(mobj, mobj->angle, 3*mobj->scale); + + dustmo = P_SpawnMobjFromMobj(mobj, 0, 0, 0, dusttype); + dustmo->momx = mobj->momx + momx; + dustmo->momy = mobj->momy + momy; + dustmo->momz = mobj->momz + 4*mobj->scale; + dustmo->movedir = dustmo->sprite = mobj->movedir; + + dustmo = P_SpawnMobjFromMobj(mobj, 0, 0, 0, dusttype); + dustmo->momx = mobj->momx - momx; + dustmo->momy = mobj->momy - momy; + dustmo->momz = mobj->momz - 4*mobj->scale; + dustmo->movedir = dustmo->sprite = mobj->movedir; + + mobj->angle += ANGLE_135; + } + S_StartSound(NULL, ((mobj->tracer && mobj->tracer->type != MT_SPIKEDTARGET) ? sfx_mbs4c : sfx_mbs45)); +} diff --git a/src/p_inter.c b/src/p_inter.c index 41bd59149..45b38e215 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -951,6 +951,13 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; } + case MT_BLENDEYE_PUYO: + { + if (!VS_PuyoTouched(special, toucher)) + return; + break; + } + default: // SOC or script pickup P_SetTarget(&special->target, toucher); break; @@ -2168,6 +2175,9 @@ void P_KillMobj(mobj_t *target, mobj_t *inflictor, mobj_t *source, UINT8 damaget case MT_BATTLEUFO: Obj_BattleUFODeath(target); break; + case MT_BLENDEYE_PUYO: + VS_PuyoDeath(target); + break; default: break; } diff --git a/src/p_mobj.c b/src/p_mobj.c index 5f7263b46..66db0d954 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -6795,6 +6795,17 @@ static void P_MobjSceneryThink(mobj_t *mobj) break; } + case MT_SPIKEDTARGET: + { + if (P_MobjWasRemoved(mobj->target) || (mobj->target->health <= 0) || (mobj->target->z == mobj->target->floorz)) + { + P_RemoveMobj(mobj); + return; + } + + mobj->angle += ANG2; + break; + } case MT_VWREF: case MT_VWREB: { @@ -11440,6 +11451,21 @@ mobj_t *P_SpawnMobj(fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) case MT_BALLSWITCH_BALL: Obj_BallSwitchInit(mobj); break; + case MT_BLENDEYE_PUYO: + mobj->sprite = mobj->movedir = P_RandomRange(PR_DECORATION, SPR_PUYA, SPR_PUYE); + if (encoremode == false) + { + mobj->color = SKINCOLOR_LEATHER; + mobj->colorized = true; + } + break; + case MT_BLENDEYE_PUYO_DUST_COFFEE: + mobj->color = SKINCOLOR_LEATHER; + mobj->colorized = true; + // FALLTHRU + case MT_BLENDEYE_PUYO_DUST: + mobj->sprite = mobj->movedir = P_RandomRange(PR_DECORATION, SPR_PUYA, SPR_PUYE); + break; default: break; }