From a5a2d079bbdfefc250bef366c1a72662b8c15da6 Mon Sep 17 00:00:00 2001 From: SushiInYourFace Date: Mon, 26 Jan 2026 17:12:03 -0500 Subject: [PATCH 1/5] begin work on KoopaDemoPowerUp --- include/Game/Boss/KoopaDemoPowerUp.hpp | 18 ++++++++ include/Game/Boss/KoopaFunction.hpp | 14 ++++++- src/Game/Boss/KoopaDemoPowerUp.cpp | 58 ++++++++++++++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 include/Game/Boss/KoopaDemoPowerUp.hpp create mode 100644 src/Game/Boss/KoopaDemoPowerUp.cpp diff --git a/include/Game/Boss/KoopaDemoPowerUp.hpp b/include/Game/Boss/KoopaDemoPowerUp.hpp new file mode 100644 index 000000000..4fa35d203 --- /dev/null +++ b/include/Game/Boss/KoopaDemoPowerUp.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "Game/Boss/Koopa.hpp" + +class KoopaDemoPowerUp : public NerveExecutor { +public: + KoopaDemoPowerUp(Koopa*); + + virtual void init(); + virtual void appear(); + virtual void kill(); + + void exeWaitDemo(); + void exeDemo(); + + /* 0x8 */ bool _8; + /* 0C */ Koopa* mParent; +}; diff --git a/include/Game/Boss/KoopaFunction.hpp b/include/Game/Boss/KoopaFunction.hpp index a7b36de76..e4b5a5a12 100644 --- a/include/Game/Boss/KoopaFunction.hpp +++ b/include/Game/Boss/KoopaFunction.hpp @@ -1,7 +1,19 @@ #pragma once +#include "Game/Boss/Koopa.hpp" #include "Game/Map/KoopaBattleMapStair.hpp" namespace KoopaFunction { s32 registerBattleMapStair(KoopaBattleMapStair*); -}; + void startRecoverKoopaArmor(Koopa*); + void startRecoverKoopaTailThorn(Koopa*); + void endFaceCtrl(Koopa*, s32); + void initKoopaCamera(Koopa*, const char*); + void endKoopaCamera(Koopa*, const char*, bool, s32); + void setKoopaPos(Koopa*, const char*); + void startKoopaTargetCamera(Koopa*, const char*); + bool isKoopaVs1(const Koopa*); + bool isKoopaVs2(const Koopa*); + bool isKoopaLv3(const Koopa*); + LiveActor* getKoopaPowerUpSwitch(Koopa*); +}; // namespace KoopaFunction diff --git a/src/Game/Boss/KoopaDemoPowerUp.cpp b/src/Game/Boss/KoopaDemoPowerUp.cpp new file mode 100644 index 000000000..70226e5a4 --- /dev/null +++ b/src/Game/Boss/KoopaDemoPowerUp.cpp @@ -0,0 +1,58 @@ +#include "Game/Boss/KoopaDemoPowerUp.hpp" +#include "Game/Boss/KoopaFunction.hpp" + +namespace NrvKoopaDemoPowerUp { + NEW_NERVE(KoopaDemoPowerUpNrvWaitDemo, KoopaDemoPowerUp, WaitDemo); + NEW_NERVE(KoopaDemoPowerUpNrvDemo, KoopaDemoPowerUp, Demo); +} + +KoopaDemoPowerUp::KoopaDemoPowerUp(Koopa* pKoopa) : NerveExecutor("Demo[パワーアップ]"), mParent(pKoopa) {} + +void KoopaDemoPowerUp::init() { + KoopaFunction::initKoopaCamera(mParent, "パワーアップデモ"); + KoopaFunction::initKoopaCamera(mParent, "最終パワーアップデモ"); + MR::createCenterScreenBlur(); + initNerve(&NrvKoopaDemoPowerUp::KoopaDemoPowerUpNrvWaitDemo::sInstance); +} + +void KoopaDemoPowerUp::appear() { + _8 = false; + setNerve(&NrvKoopaDemoPowerUp::KoopaDemoPowerUpNrvWaitDemo::sInstance); +} + +void KoopaDemoPowerUp::kill() { + _8 = true; + KoopaFunction::endKoopaCamera(mParent, "パワーアップデモ", false, -1); + KoopaFunction::endKoopaCamera(mParent, "最終パワーアップデモ", false, -1); +} + +void KoopaDemoPowerUp::exeWaitDemo() { + bool v1 = MR::tryStartDemoMarioPuppetable(mParent, "パワーアップデモ"); + if (!v1) { + return; + } + if(KoopaFunction::isKoopaVs1(mParent) || KoopaFunction::isKoopaVs2(mParent)) { + KoopaFunction::setKoopaPos(mParent, "パワーアップデモ(クッパ)"); + MR::setPlayerPosAndWait("パワーアップデモ(マリオ)"); + if(KoopaFunction::isKoopaLv3(mParent)) { + MR::startAction(mParent, "DemoKoopaPowerUpFinal"); + KoopaFunction::startKoopaTargetCamera(mParent, "最終パワーアップデモ"); + MR::onSwitchB(KoopaFunction::getKoopaPowerUpSwitch(mParent)); + } else { + MR::startAction(mParent, "DemoKoopaPowerUp"); + KoopaFunction::startKoopaTargetCamera(mParent, "パワーアップデモ"); + MR::onSwitchA(KoopaFunction::getKoopaPowerUpSwitch(mParent)); + } + } else { + KoopaFunction::setKoopaPos(mParent, "パワーアップデモLv3(クッパ)"); + MR::setPlayerPosAndWait("パワーアップデモLv3(マリオ)"); + MR::startAction(mParent, "DemoKoopaPowerUpFinal"); + KoopaFunction::startKoopaTargetCamera(mParent, "最終パワーアップデモ"); + MR::onSwitchA(KoopaFunction::getKoopaPowerUpSwitch(mParent)); + } + MR::startBckPlayer("BattleWait", static_cast(nullptr)); + KoopaFunction::startRecoverKoopaArmor(mParent); + KoopaFunction::startRecoverKoopaTailThorn(mParent); + KoopaFunction::endFaceCtrl(mParent, -1); + setNerve(&NrvKoopaDemoPowerUp::KoopaDemoPowerUpNrvDemo::sInstance); +} From 6be3db42dbf5a0aed70b5d1251e436a5a3c2ff4e Mon Sep 17 00:00:00 2001 From: SushiInYourFace Date: Mon, 26 Jan 2026 18:34:38 -0500 Subject: [PATCH 2/5] KoopaDemoPowerUp to 99% --- include/Game/Boss/KoopaFunction.hpp | 1 + src/Game/Boss/KoopaDemoPowerUp.cpp | 33 ++++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/include/Game/Boss/KoopaFunction.hpp b/include/Game/Boss/KoopaFunction.hpp index e4b5a5a12..9b0379462 100644 --- a/include/Game/Boss/KoopaFunction.hpp +++ b/include/Game/Boss/KoopaFunction.hpp @@ -15,5 +15,6 @@ namespace KoopaFunction { bool isKoopaVs1(const Koopa*); bool isKoopaVs2(const Koopa*); bool isKoopaLv3(const Koopa*); + bool isKoopaVs3(const Koopa*); LiveActor* getKoopaPowerUpSwitch(Koopa*); }; // namespace KoopaFunction diff --git a/src/Game/Boss/KoopaDemoPowerUp.cpp b/src/Game/Boss/KoopaDemoPowerUp.cpp index 70226e5a4..4e3274f5e 100644 --- a/src/Game/Boss/KoopaDemoPowerUp.cpp +++ b/src/Game/Boss/KoopaDemoPowerUp.cpp @@ -1,10 +1,9 @@ #include "Game/Boss/KoopaDemoPowerUp.hpp" #include "Game/Boss/KoopaFunction.hpp" - namespace NrvKoopaDemoPowerUp { NEW_NERVE(KoopaDemoPowerUpNrvWaitDemo, KoopaDemoPowerUp, WaitDemo); NEW_NERVE(KoopaDemoPowerUpNrvDemo, KoopaDemoPowerUp, Demo); -} +} // namespace NrvKoopaDemoPowerUp KoopaDemoPowerUp::KoopaDemoPowerUp(Koopa* pKoopa) : NerveExecutor("Demo[パワーアップ]"), mParent(pKoopa) {} @@ -31,10 +30,10 @@ void KoopaDemoPowerUp::exeWaitDemo() { if (!v1) { return; } - if(KoopaFunction::isKoopaVs1(mParent) || KoopaFunction::isKoopaVs2(mParent)) { + if (KoopaFunction::isKoopaVs1(mParent) || KoopaFunction::isKoopaVs2(mParent)) { KoopaFunction::setKoopaPos(mParent, "パワーアップデモ(クッパ)"); MR::setPlayerPosAndWait("パワーアップデモ(マリオ)"); - if(KoopaFunction::isKoopaLv3(mParent)) { + if (KoopaFunction::isKoopaLv3(mParent)) { MR::startAction(mParent, "DemoKoopaPowerUpFinal"); KoopaFunction::startKoopaTargetCamera(mParent, "最終パワーアップデモ"); MR::onSwitchB(KoopaFunction::getKoopaPowerUpSwitch(mParent)); @@ -50,9 +49,33 @@ void KoopaDemoPowerUp::exeWaitDemo() { KoopaFunction::startKoopaTargetCamera(mParent, "最終パワーアップデモ"); MR::onSwitchA(KoopaFunction::getKoopaPowerUpSwitch(mParent)); } - MR::startBckPlayer("BattleWait", static_cast(nullptr)); + MR::startBckPlayer("BattleWait", static_cast< const char* >(nullptr)); KoopaFunction::startRecoverKoopaArmor(mParent); KoopaFunction::startRecoverKoopaTailThorn(mParent); KoopaFunction::endFaceCtrl(mParent, -1); setNerve(&NrvKoopaDemoPowerUp::KoopaDemoPowerUpNrvDemo::sInstance); } + +void KoopaDemoPowerUp::exeDemo() { + if (KoopaFunction::isKoopaLv3(mParent)) { + if (MR::isStep(this, 2)) { + MR::startCenterScreenBlur(140, 15.0f, 80, 5, 30); + } + } else { + if (MR::isStep(this, 65)) { + MR::startCenterScreenBlur(135, 15.0f, 80, 5, 30); + } + } + if (MR::isActionEnd(mParent)) { + if (KoopaFunction::isKoopaVs3(mParent) || KoopaFunction::isKoopaLv3(mParent)) { + KoopaFunction::endKoopaCamera(mParent, "最終パワーアップデモ", false, -1); + } else { + KoopaFunction::endKoopaCamera(mParent, "パワーアップデモ", false, -1); + } + MR::endDemo(mParent, "パワーアップデモ"); + } + TVec3f v1 = mParent->mGravity.negateInline(); + MR::appearStarPieceToDirection(mParent, mParent->mPosition, v1, 10, 50.0f, 60.0f, false); + MR::startSound(mParent, "SE_OJ_STAR_PIECE_BURST", -1, -1); + kill(); +} From 946499b1e7039e4637f9132fea2add6db9d73e09 Mon Sep 17 00:00:00 2001 From: SushiInYourFace Date: Mon, 26 Jan 2026 19:01:25 -0500 Subject: [PATCH 3/5] get as far into KoopaSequencer as I can before adding KoopaDemoJumpToPlanet --- include/Game/Boss/KoopaSequencer.hpp | 21 +++++++++++++++++++++ src/Game/Boss/KoopaSequencer.cpp | 15 +++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 include/Game/Boss/KoopaSequencer.hpp create mode 100644 src/Game/Boss/KoopaSequencer.cpp diff --git a/include/Game/Boss/KoopaSequencer.hpp b/include/Game/Boss/KoopaSequencer.hpp new file mode 100644 index 000000000..5c2f4b89b --- /dev/null +++ b/include/Game/Boss/KoopaSequencer.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "Game/Boss/Koopa.hpp" +#include "Game/Boss/KoopaDemoPowerUp.hpp" +#include "Game/System/NerveExecutor.hpp" +#include "Game/Util/JMapInfo.hpp" + +class KoopaSequencer : public NerveExecutor { +public: + KoopaSequencer(const char*, s32); + + virtual void init(Koopa*, const JMapInfoIter&); + + Koopa* mParent; + KoopaDemoPowerUp* mDemoPowerUp; + s32 _10; + s32 _14; + s32 _18; + s32 _1C; + bool _20; +}; diff --git a/src/Game/Boss/KoopaSequencer.cpp b/src/Game/Boss/KoopaSequencer.cpp new file mode 100644 index 000000000..5ea328f9d --- /dev/null +++ b/src/Game/Boss/KoopaSequencer.cpp @@ -0,0 +1,15 @@ +#include "Game/Boss/KoopaSequencer.hpp" +#include "Game/Boss/Koopa.hpp" +#include "Game/Boss/KoopaDemoPowerUp.hpp" +#include "Game/System/NerveExecutor.hpp" +#include "Game/Util/JMapInfo.hpp" +#include "revolution/types.h" + +KoopaSequencer::KoopaSequencer(const char* pName, s32 pNum) + : NerveExecutor(pName), mParent(nullptr), mDemoPowerUp(nullptr), _10(0), _14(0), _18(1), _1C(pNum), _20(false) {} + +void KoopaSequencer::init(Koopa* pParent, const JMapInfoIter& pIter) { + mParent = pParent; + mDemoPowerUp = new KoopaDemoPowerUp(mParent); + mParent->init(pIter); +} From f9d33d253a4961b2959dd6ea047eaf63050d96ce Mon Sep 17 00:00:00 2001 From: SushiInYourFace Date: Tue, 27 Jan 2026 16:03:40 -0500 Subject: [PATCH 4/5] as much progress on jumpToPlanet before needing PlanetShadow --- include/Game/Boss/KoopaDemoJumpToPlanet.hpp | 18 ++++++++ include/Game/Boss/KoopaFunction.hpp | 3 ++ src/Game/Boss/KoopaDemoJumpToPlanet.cpp | 49 +++++++++++++++++++++ 3 files changed, 70 insertions(+) create mode 100644 include/Game/Boss/KoopaDemoJumpToPlanet.hpp create mode 100644 src/Game/Boss/KoopaDemoJumpToPlanet.cpp diff --git a/include/Game/Boss/KoopaDemoJumpToPlanet.hpp b/include/Game/Boss/KoopaDemoJumpToPlanet.hpp new file mode 100644 index 000000000..08d176812 --- /dev/null +++ b/include/Game/Boss/KoopaDemoJumpToPlanet.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "Game/Boss/Koopa.hpp" + +class KoopaDemoJumpToPlanet : public NerveExecutor { +public: + KoopaDemoJumpToPlanet(Koopa*); + + virtual void init(); + virtual void kill(); + + void startReady(); + void exeStart(); + void exeFall(); + + /* 0x8 */ bool _8; + /* 0C */ Koopa* mParent; +}; diff --git a/include/Game/Boss/KoopaFunction.hpp b/include/Game/Boss/KoopaFunction.hpp index 9b0379462..b022d26d2 100644 --- a/include/Game/Boss/KoopaFunction.hpp +++ b/include/Game/Boss/KoopaFunction.hpp @@ -11,10 +11,13 @@ namespace KoopaFunction { void initKoopaCamera(Koopa*, const char*); void endKoopaCamera(Koopa*, const char*, bool, s32); void setKoopaPos(Koopa*, const char*); + void startKoopaCamera(Koopa*, const char*); void startKoopaTargetCamera(Koopa*, const char*); + void startFaceCtrl(Koopa*); bool isKoopaVs1(const Koopa*); bool isKoopaVs2(const Koopa*); bool isKoopaLv3(const Koopa*); bool isKoopaVs3(const Koopa*); + void* getKoopaPlanetShadow(Koopa*); LiveActor* getKoopaPowerUpSwitch(Koopa*); }; // namespace KoopaFunction diff --git a/src/Game/Boss/KoopaDemoJumpToPlanet.cpp b/src/Game/Boss/KoopaDemoJumpToPlanet.cpp new file mode 100644 index 000000000..65babf84d --- /dev/null +++ b/src/Game/Boss/KoopaDemoJumpToPlanet.cpp @@ -0,0 +1,49 @@ +#include "Game/Boss/KoopaDemoJumpToPlanet.hpp" +#include "Game/Boss/Koopa.hpp" +#include "Game/Boss/KoopaFunction.hpp" +#include "Game/LiveActor/Nerve.hpp" +#include "Game/Util/ActorSwitchUtil.hpp" +#include "Game/Util/LiveActorUtil.hpp" +#include "Game/Util/NerveUtil.hpp" +#include "Game/Util/PlayerUtil.hpp" + +namespace NrvKoopaDemoJumpToPlanet { + NEW_NERVE(KoopaDemoJumpToPlanetNrvStart, KoopaDemoJumpToPlanet, Start); + NEW_NERVE(KoopaDemoJumpToPlanetNrvFall, KoopaDemoJumpToPlanet, Fall); +} + +KoopaDemoJumpToPlanet::KoopaDemoJumpToPlanet(Koopa* pKoopa) : NerveExecutor("Demo[惑星までジャンプ]"), mParent(pKoopa) {} + +void KoopaDemoJumpToPlanet::init() { + KoopaFunction::initKoopaCamera(mParent, "ウェイト(惑星までジャンプ)"); + KoopaFunction::initKoopaCamera(mParent, "落下(惑星までジャンプ)"); + KoopaFunction::initKoopaCamera(mParent, "ワープ後(惑星までジャンプ)"); + initNerve(&NrvKoopaDemoJumpToPlanet::KoopaDemoJumpToPlanetNrvStart::sInstance); +} + +void KoopaDemoJumpToPlanet::kill() { + _8 = true; + KoopaFunction::endKoopaCamera(mParent, "ウェイト(惑星までジャンプ)", false, -1); + KoopaFunction::endKoopaCamera(mParent, "落下(惑星までジャンプ)", false, -1); + KoopaFunction::endKoopaCamera(mParent, "ワープ後(惑星までジャンプ)", false, -1); +} + +void KoopaDemoJumpToPlanet::startReady() { + MR::onSwitchB(mParent); +} + +void KoopaDemoJumpToPlanet::exeStart() { + if(MR::isFirstStep(this)) { + return; + } + KoopaFunction::setKoopaPos(mParent, "戦闘開始(クッパ)"); + MR::setPlayerPosAndWait("戦闘開始(マリオ)"); + KoopaFunction::startKoopaCamera(mParent, "落下(惑星までジャンプ)"); + MR::startAction(mParent, "JumpSoon"); + KoopaFunction::startFaceCtrl(mParent); + setNerve(&NrvKoopaDemoJumpToPlanet::KoopaDemoJumpToPlanetNrvFall::sInstance); +} + +void KoopaDemoJumpToPlanet::exeFall() { + +} From c572824ed8b846f472f64fbd6428f9f6becb469f Mon Sep 17 00:00:00 2001 From: SushiInYourFace Date: Tue, 27 Jan 2026 18:04:16 -0500 Subject: [PATCH 5/5] match KoopaPlanetShadow 97% --- include/Game/Boss/Koopa.hpp | 1 - include/Game/Boss/KoopaFunction.hpp | 2 ++ include/Game/Boss/KoopaPlanetShadow.hpp | 17 +++++++++++ src/Game/Boss/KoopaPlanetShadow.cpp | 39 +++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 1 deletion(-) create mode 100644 include/Game/Boss/KoopaPlanetShadow.hpp create mode 100644 src/Game/Boss/KoopaPlanetShadow.cpp diff --git a/include/Game/Boss/Koopa.hpp b/include/Game/Boss/Koopa.hpp index 25aba020d..191202c35 100644 --- a/include/Game/Boss/Koopa.hpp +++ b/include/Game/Boss/Koopa.hpp @@ -22,7 +22,6 @@ class Koopa : public LiveActor { virtual bool receiveMsgEnemyAttack(u32 msg, HitSensor* pSender, HitSensor* pReceiver); virtual bool receiveOtherMsg(u32 msg, HitSensor* pSender, HitSensor* pReceiver); -private: /* 0x8C */ TVec3f _8C; /* 0x98 */ KoopaSequencer* mSequencer; /* 0x9C */ KoopaSensorCtrl* mSensorCtrl; diff --git a/include/Game/Boss/KoopaFunction.hpp b/include/Game/Boss/KoopaFunction.hpp index b022d26d2..206a3d476 100644 --- a/include/Game/Boss/KoopaFunction.hpp +++ b/include/Game/Boss/KoopaFunction.hpp @@ -2,6 +2,7 @@ #include "Game/Boss/Koopa.hpp" #include "Game/Map/KoopaBattleMapStair.hpp" +#include "JSystem/JGeometry/TVec.hpp" namespace KoopaFunction { s32 registerBattleMapStair(KoopaBattleMapStair*); @@ -20,4 +21,5 @@ namespace KoopaFunction { bool isKoopaVs3(const Koopa*); void* getKoopaPlanetShadow(Koopa*); LiveActor* getKoopaPowerUpSwitch(Koopa*); + TVec3f* getPlanetCenterPos(const Koopa*); }; // namespace KoopaFunction diff --git a/include/Game/Boss/KoopaPlanetShadow.hpp b/include/Game/Boss/KoopaPlanetShadow.hpp new file mode 100644 index 000000000..83df02bd8 --- /dev/null +++ b/include/Game/Boss/KoopaPlanetShadow.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include "Game/Boss/Koopa.hpp" +#include "Game/LiveActor/LiveActor.hpp" +#include "Game/Util/JMapInfo.hpp" +#include "revolution/mtx.h" +class KoopaPlanetShadow : public LiveActor { +public: + KoopaPlanetShadow(const Koopa*); + + virtual void init(const JMapInfoIter&); + virtual void calcAndSetBaseMtx(); + + + /* 0x8c */ const Koopa* mParent; + /* 0x90 */ MtxPtr mParentJointMtx; +}; diff --git a/src/Game/Boss/KoopaPlanetShadow.cpp b/src/Game/Boss/KoopaPlanetShadow.cpp new file mode 100644 index 000000000..b73259f3c --- /dev/null +++ b/src/Game/Boss/KoopaPlanetShadow.cpp @@ -0,0 +1,39 @@ +#include "Game/Boss/KoopaPlanetShadow.hpp" +#include "Game/Boss/KoopaFunction.hpp" +#include "Game/LiveActor/LiveActor.hpp" +#include "Game/Util/JMapInfo.hpp" +#include "Game/Util/JointUtil.hpp" +#include "Game/Util/LiveActorUtil.hpp" +#include "Game/Util/MathUtil.hpp" +#include "Game/Util/MtxUtil.hpp" +#include "Game/Util/ObjUtil.hpp" +#include "JSystem/JGeometry/TMatrix.hpp" +#include "JSystem/JGeometry/TVec.hpp" + +#include + +KoopaPlanetShadow::KoopaPlanetShadow(const Koopa* pKoopa) : LiveActor("惑星用の影"), mParent(pKoopa), mParentJointMtx(nullptr){}; + +void KoopaPlanetShadow::init(const JMapInfoIter& pIter) { + initModelManagerWithAnm("KoopaPlanetShadow", nullptr, false); + MR::connectToSceneEnemyDecoration(this); + MR::invalidateClipping(this); + mParentJointMtx = MR::getJointMtx(mParent, "Hip1"); + makeActorDead(); +} + +void KoopaPlanetShadow::calcAndSetBaseMtx() { + TVec3f v1(mParentJointMtx[0][3], mParentJointMtx[1][3], mParentJointMtx[2][3]); + TVec3f* centerPos = KoopaFunction::getPlanetCenterPos(mParent); + TVec3f v2(v1 - *centerPos); + + if (MR::isNearZero(v2, 0.001f)) { + return; + } + + MR::normalize(&v2); + TPos3f v3; + v3.identity(); + MR::makeMtxUpFrontPos(&v3, v2, mParent->_8C, *centerPos); + MR::setBaseTRMtx(this, v3); +}