1#include "Amiibo/HelpAmiiboFallCoin.h"
2
3#include <math/seadVector.h>
4
5#include "Library/LiveActor/ActorFlagFunction.h"
6#include "Library/LiveActor/ActorInitUtil.h"
7#include "Library/LiveActor/ActorMovementFunction.h"
8#include "Library/LiveActor/ActorPoseUtil.h"
9#include "Library/Nerve/NerveSetupUtil.h"
10#include "Library/Nerve/NerveUtil.h"
11#include "Library/Nfp/NfpFunction.h"
12#include "Library/Se/SeFunction.h"
13
14#include "Amiibo/HelpAmiiboDirector.h"
15#include "Item/Coin.h"
16
17namespace {
18NERVE_IMPL(HelpAmiiboFallCoin, Wait)
19NERVE_IMPL(HelpAmiiboFallCoin, Fall)
20
21NERVES_MAKE_NOSTRUCT(HelpAmiiboFallCoin, Wait, Fall)
22} // namespace
23
24HelpAmiiboFallCoin::HelpAmiiboFallCoin(HelpAmiiboDirector* director, al::LiveActor* actor)
25 : HelpAmiiboExecutor(director, actor, "コレクトコインお助け") {}
26
27void HelpAmiiboFallCoin::initAfterPlacement(const al::ActorInitInfo& initInfo) {
28 HelpAmiiboExecutor::initAfterPlacement(initInfo);
29 mNerveKeeper = new al::NerveKeeper(this, &Wait, 0);
30
31 mCoinBuffer.allocBuffer(ptrNumMax: 3, heap: nullptr);
32 for (s32 i = 0; i < 3; i++) {
33 Coin* coin = new Coin("コイン[amiibo]", false);
34 al::initCreateActorNoPlacementInfo(actor: coin, initInfo);
35 coin->makeActorDead();
36 mCoinBuffer.pushBack(ptr: coin);
37 }
38}
39
40bool HelpAmiiboFallCoin::isTriggerTouch(const al::NfpInfo& nfpInfo) const {
41 return al::isCharacterIdBaseKinopio(nfpInfo);
42}
43
44bool HelpAmiiboFallCoin::isEnableUse() {
45 return true;
46}
47
48void HelpAmiiboFallCoin::activate() {
49 HelpAmiiboExecutor::activate();
50 al::setNerve(user: this, nerve: &Fall);
51 al::startSe(getDirector(), "AmiiboPeach");
52}
53
54bool HelpAmiiboFallCoin::execute() {
55 getNerveKeeper()->update();
56 for (s32 i = 0; i < 3; i++)
57 if (!al::isDead(actor: mCoinBuffer[i]))
58 return false;
59 return true;
60}
61
62void HelpAmiiboFallCoin::exeWait() {}
63
64void HelpAmiiboFallCoin::exeFall() {
65 if (al::isFirstStep(user: this)) {
66 for (s32 i = 0; i < 3; i++) {
67 Coin* coin = mCoinBuffer[i];
68 sead::Vector3f trans = al::getTrans(actor: getActor());
69 al::resetPosition(actor: coin, trans);
70 coin->appearPopUp();
71 }
72 }
73
74 al::setNerve(user: this, nerve: &Wait);
75}
76