diff --git a/data/file_list.yml b/data/file_list.yml index 0e7a7041..aea9a83f 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -50617,27 +50617,27 @@ Item/ShineFukankunWatchObj.o: - offset: 0x1d5f04 size: 124 label: _ZN21ShineFukankunWatchObjC2EPKc - status: NotDecompiled + status: Matching - offset: 0x1d5f80 size: 136 label: _ZN21ShineFukankunWatchObjC1EPKc - status: NotDecompiled + status: Matching - offset: 0x1d6008 size: 188 label: _ZN21ShineFukankunWatchObj4initERKN2al13ActorInitInfoE - status: NotDecompiled + status: Matching - offset: 0x1d60c4 size: 20 label: _ZN21ShineFukankunWatchObj18initAfterPlacementEv - status: NotDecompiled + status: Matching - offset: 0x1d60d8 size: 140 label: _ZN21ShineFukankunWatchObj7exeWaitEv - status: NotDecompiled + status: Matching - offset: 0x1d6164 size: 144 label: _ZNK12_GLOBAL__N_128ShineFukankunWatchObjNrvWait7executeEPN2al11NerveKeeperE - status: NotDecompiled + status: Matching guess: true Item/ShineInfo.o: '.text': @@ -135376,7 +135376,7 @@ Scene/ProjectActorFactory.o: - offset: 0x4bbb5c size: 52 label: _ZN2al19createActorFunctionI21ShineFukankunWatchObjEEPNS_9LiveActorEPKc - status: NotDecompiled + status: Matching lazy: true - offset: 0x4bbb90 size: 52 diff --git a/src/Item/ShineFukankunWatchObj.cpp b/src/Item/ShineFukankunWatchObj.cpp new file mode 100644 index 00000000..bbe4bd08 --- /dev/null +++ b/src/Item/ShineFukankunWatchObj.cpp @@ -0,0 +1,55 @@ +#include "Item/ShineFukankunWatchObj.h" + +#include +#include + +#include "Library/LiveActor/ActorClippingFunction.h" +#include "Library/LiveActor/ActorInitFunction.h" +#include "Library/LiveActor/ActorInitUtil.h" +#include "Library/LiveActor/ActorPoseUtil.h" +#include "Library/Nerve/NerveSetupUtil.h" + +#include "Item/Shine.h" +#include "MapObj/FukankunZoomTargetFunction.h" +#include "Util/ItemUtil.h" + +namespace { +NERVE_IMPL(ShineFukankunWatchObj, Wait); + +NERVES_MAKE_NOSTRUCT(ShineFukankunWatchObj, Wait); +} // namespace + +ShineFukankunWatchObj::ShineFukankunWatchObj(const char* name) : al::LiveActor(name) {} + +void ShineFukankunWatchObj::init(const al::ActorInitInfo& info) { + al::initActorSceneInfo(this, info); + al::initActorPoseTQSV(this); + al::initActorSRT(this, info); + al::initExecutorWatchObj(this, info); + al::initActorClipping(this, info); + al::setClippingInfo(this, 500.0f, nullptr); + al::initNerve(this, &Wait, 0); + FukankunZoomTargetFunction::declareUseFukankunZoomTargetActor(this); + + mShine = rs::initShineByPlacementInfo(info); + mShine->initAppearDemoFromHost(info, al::getTrans(this)); + + makeActorAlive(); +} + +void ShineFukankunWatchObj::initAfterPlacement() { + return FukankunZoomTargetFunction::registerFukankunZoomTargetActor( + this, 0, sead::Vector3f::zero, nullptr); +} + +void ShineFukankunWatchObj::exeWait() { + if (FukankunZoomTargetFunction::getWatchCount(this) >= 121) { + const sead::Matrix34f* linkedShineMtx = nullptr; + if (FukankunZoomTargetFunction::tryGetActiveFukankunLinkedShineMtx(&linkedShineMtx, this)) { + sead::Vector3f linkedShinePos; + linkedShineMtx->getTranslation(linkedShinePos); + mShine->appearWarp(al::getTrans(this), linkedShinePos); + kill(); + } + } +} diff --git a/src/Item/ShineFukankunWatchObj.h b/src/Item/ShineFukankunWatchObj.h new file mode 100644 index 00000000..f21f9a22 --- /dev/null +++ b/src/Item/ShineFukankunWatchObj.h @@ -0,0 +1,20 @@ +#pragma once + +#include "Library/LiveActor/LiveActor.h" + +class Shine; + +class ShineFukankunWatchObj : public al::LiveActor { +public: + ShineFukankunWatchObj(const char* name); + + void init(const al::ActorInitInfo& info) override; + void initAfterPlacement() override; + + void exeWait(); + +private: + Shine* mShine = nullptr; +}; + +static_assert(sizeof(ShineFukankunWatchObj) == 0x110); diff --git a/src/Scene/ProjectActorFactory.cpp b/src/Scene/ProjectActorFactory.cpp index 1bf74abc..a200f044 100644 --- a/src/Scene/ProjectActorFactory.cpp +++ b/src/Scene/ProjectActorFactory.cpp @@ -66,6 +66,7 @@ #include "Item/LifeMaxUpItem2D.h" #include "Item/LifeUpItem.h" #include "Item/LifeUpItem2D.h" +#include "Item/ShineFukankunWatchObj.h" #include "MapObj/AllDeadWatcherWithShine.h" #include "MapObj/AnagramAlphabet.h" #include "MapObj/BlockEmpty2D.h" @@ -537,7 +538,7 @@ const al::NameToCreator sProjectActorFactoryEntries[] {"ShineWithAppearCamera", nullptr}, {"ShineChipWatcher", nullptr}, {"ShineDot", nullptr}, - {"ShineFukankunWatchObj", nullptr}, + {"ShineFukankunWatchObj", al::createActorFunction}, {"ShineTowerRocket", al::createActorFunction}, {"ShopBgmPlayer", nullptr}, {"ShopMark", nullptr},