From c66e7d24018e4a6b43cb169076f2f8c1fe593f12 Mon Sep 17 00:00:00 2001 From: guymakinggames <66076221+guymakinggames@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:33:42 +0100 Subject: [PATCH] Boss/Koopa: Implement `KoopaFireBeamGround` (#983) --- data/file_list.yml | 22 +++++----- src/Boss/Koopa/KoopaFireBeamGround.cpp | 56 ++++++++++++++++++++++++++ src/Boss/Koopa/KoopaFireBeamGround.h | 21 ++++++++++ 3 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 src/Boss/Koopa/KoopaFireBeamGround.cpp create mode 100644 src/Boss/Koopa/KoopaFireBeamGround.h diff --git a/data/file_list.yml b/data/file_list.yml index 37976e56..5c618b21 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -16599,48 +16599,48 @@ Boss/Koopa/KoopaFireBeamGround.o: - offset: 0x092324 size: 120 label: _ZN19KoopaFireBeamGroundC2EPKc - status: NotDecompiled + status: Matching - offset: 0x09239c size: 132 label: _ZN19KoopaFireBeamGroundC1EPKc - status: NotDecompiled + status: Matching - offset: 0x092420 size: 112 label: _ZN19KoopaFireBeamGround4initERKN2al13ActorInitInfoE - status: NotDecompiled + status: Matching - offset: 0x092490 size: 44 label: _ZN19KoopaFireBeamGround10appearSignEv - status: NotDecompiled + status: Matching - offset: 0x0924bc size: 44 label: _ZN19KoopaFireBeamGround6appearEv - status: NotDecompiled + status: Matching - offset: 0x0924e8 size: 100 label: _ZN19KoopaFireBeamGround12attackSensorEPN2al9HitSensorES2_ - status: NotDecompiled + status: Matching - offset: 0x09254c size: 8 label: _ZN19KoopaFireBeamGround10receiveMsgEPKN2al9SensorMsgEPNS0_9HitSensorES5_ - status: NotDecompiled + status: Matching - offset: 0x092554 size: 60 label: _ZN19KoopaFireBeamGround13exeAppearSignEv - status: NotDecompiled + status: Matching - offset: 0x092590 size: 60 label: _ZN19KoopaFireBeamGround7exeWaitEv - status: NotDecompiled + status: Matching - offset: 0x0925cc size: 64 label: _ZNK12_GLOBAL__N_132KoopaFireBeamGroundNrvAppearSign7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching guess: true - offset: 0x09260c size: 64 label: _ZNK12_GLOBAL__N_126KoopaFireBeamGroundNrvWait7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching guess: true Boss/Koopa/KoopaFlag.o: '.text': diff --git a/src/Boss/Koopa/KoopaFireBeamGround.cpp b/src/Boss/Koopa/KoopaFireBeamGround.cpp new file mode 100644 index 00000000..171eec18 --- /dev/null +++ b/src/Boss/Koopa/KoopaFireBeamGround.cpp @@ -0,0 +1,56 @@ +#include "Boss/Koopa/KoopaFireBeamGround.h" + +#include "Library/LiveActor/ActorActionFunction.h" +#include "Library/LiveActor/ActorInitUtil.h" +#include "Library/LiveActor/ActorSensorUtil.h" +#include "Library/Nerve/NerveSetupUtil.h" +#include "Library/Nerve/NerveUtil.h" + +#include "Util/PlayerUtil.h" + +namespace { +NERVE_IMPL(KoopaFireBeamGround, AppearSign) +NERVE_IMPL(KoopaFireBeamGround, Wait) + +NERVES_MAKE_NOSTRUCT(KoopaFireBeamGround, AppearSign, Wait) +} // namespace + +KoopaFireBeamGround::KoopaFireBeamGround(const char* name) : al::LiveActor(name) {} + +void KoopaFireBeamGround::init(const al::ActorInitInfo& info) { + al::initActorWithArchiveName(this, info, "KoopaFireBeamGround", nullptr); + al::initNerve(this, &AppearSign, 0); + makeActorDead(); +} + +void KoopaFireBeamGround::appearSign() { + al::LiveActor::appear(); + al::setNerve(this, &AppearSign); +} + +void KoopaFireBeamGround::appear() { + al::LiveActor::appear(); + al::setNerve(this, &Wait); +} + +void KoopaFireBeamGround::attackSensor(al::HitSensor* self, al::HitSensor* other) { + if (!al::isNerve(this, &AppearSign) && rs::isPlayerOnGround(this)) + al::sendMsgEnemyAttackFire(other, self, nullptr); +} + +bool KoopaFireBeamGround::receiveMsg(const al::SensorMsg* message, al::HitSensor* other, + al::HitSensor* self) { + if (al::isMsgPlayerDisregard(message)) + return true; + return false; +} + +void KoopaFireBeamGround::exeAppearSign() { + if (al::isFirstStep(this)) + al::startAction(this, "AppearSign"); +} + +void KoopaFireBeamGround::exeWait() { + if (al::isFirstStep(this)) + al::startAction(this, "Wait"); +} diff --git a/src/Boss/Koopa/KoopaFireBeamGround.h b/src/Boss/Koopa/KoopaFireBeamGround.h new file mode 100644 index 00000000..fc06a0cd --- /dev/null +++ b/src/Boss/Koopa/KoopaFireBeamGround.h @@ -0,0 +1,21 @@ +#pragma once + +#include "Library/LiveActor/LiveActor.h" + +class KoopaFireBeamGround : public al::LiveActor { +public: + KoopaFireBeamGround(const char* name); + + void init(const al::ActorInitInfo& info) override; + void appear() override; + void attackSensor(al::HitSensor* self, al::HitSensor* other) override; + bool receiveMsg(const al::SensorMsg* message, al::HitSensor* other, + al::HitSensor* self) override; + + void appearSign(); + + void exeAppearSign(); + void exeWait(); +}; + +static_assert(sizeof(KoopaFireBeamGround) == 0x108);