1#include "Item/CoinCollect2D.h"
2
3#include "Library/Collision/PartsConnector.h"
4#include "Library/Controller/PadRumbleFunction.h"
5#include "Library/LiveActor/ActorActionFunction.h"
6#include "Library/LiveActor/ActorClippingFunction.h"
7#include "Library/LiveActor/ActorFlagFunction.h"
8#include "Library/LiveActor/ActorInitFunction.h"
9#include "Library/LiveActor/ActorInitUtil.h"
10#include "Library/LiveActor/ActorSensorUtil.h"
11#include "Library/Nerve/NerveSetupUtil.h"
12#include "Library/Nerve/NerveUtil.h"
13#include "Library/Placement/PlacementFunction.h"
14#include "Library/Scene/SceneObjUtil.h"
15
16#include "Item/CoinCollectEmpty2D.h"
17#include "Item/CoinCollectHintState.h"
18#include "Item/CoinCollectHolder.h"
19#include "Item/CoinCollectWatcher.h"
20#include "MapObj/CapMessageShowInfo.h"
21#include "System/GameDataFunction.h"
22#include "Util/ActorDimensionKeeper.h"
23#include "Util/ActorDimensionUtil.h"
24#include "Util/ItemUtil.h"
25#include "Util/SensorMsgFunction.h"
26
27namespace {
28NERVE_IMPL(CoinCollect2D, Wait);
29NERVE_IMPL(CoinCollect2D, WaitHint);
30NERVE_IMPL(CoinCollect2D, Got);
31
32NERVES_MAKE_STRUCT(CoinCollect2D, Wait, WaitHint, Got);
33} // namespace
34
35CoinCollect2D::CoinCollect2D(const char* name) : al::LiveActor(name) {}
36
37void CoinCollect2D::init(const al::ActorInitInfo& initInfo) {
38 al::initActorSceneInfo(actor: this, info: initInfo);
39 rs::createCoinCollectWatcher(objHolder: this);
40 rs::createCoinCollectHolder(objHolder: this);
41 CoinCollectHolder* holder = al::getSceneObj<CoinCollectHolder>(user: this);
42 holder->registerCoinCollect2D(this);
43
44 if (!GameDataFunction::isGotCoinCollect(accessor: this, coinCollect: initInfo)) {
45 al::initActorWithArchiveName(actor: this, initInfo, archiveName: rs::getStageCoinCollect2DArchiveName(actor: this),
46 suffix: nullptr);
47 makeActorAlive();
48 CoinCollectWatcher* watcher = al::getSceneObj<CoinCollectWatcher>(user: this);
49 watcher->registerCoin(isCountUpCoin: false);
50 al::initNerve(actor: this, nerve: &NrvCoinCollect2D.Wait, maxStates: 1);
51
52 mHintState = new CoinCollectHintState(this);
53 al::initNerveState(user: this, state: mHintState, nerve: &NrvCoinCollect2D.WaitHint, hostName: "ヒント");
54
55 al::tryAddDisplayOffset(actor: this, initInfo);
56 mMtxConnector = al::tryCreateMtxConnector(actor: this, info: initInfo);
57 mDimensionKeeper = rs::createDimensionKeeper(actor: this);
58 rs::updateDimensionKeeper(keeper: mDimensionKeeper);
59 rs::snap2DParallelizeFront(this, this, 500.0f);
60 al::startAction(actor: this, actionName: "Wait");
61 mPlacementId = al::createPlacementId(initInfo);
62
63 } else {
64 makeActorDead();
65 const char* archiveName = rs::getStageCoinCollect2DEmptyArchiveName(actor: this);
66 CoinCollectWatcher* watcher = al::getSceneObj<CoinCollectWatcher>(user: this);
67 watcher->registerCoin(isCountUpCoin: true);
68
69 CoinCollectEmpty2D* coinCollectEmpty2d =
70 new CoinCollectEmpty2D("コレクトコイン空2D", archiveName);
71 al::initCreateActorWithPlacementInfo(actor: coinCollectEmpty2d, initInfo);
72 }
73}
74
75void CoinCollect2D::initAfterPlacement() {
76 if (mMtxConnector != nullptr)
77 al::attachMtxConnectorToCollision(mtxConnector: mMtxConnector, actor: this, false);
78}
79
80bool CoinCollect2D::receiveMsg(const al::SensorMsg* message, al::HitSensor* other,
81 al::HitSensor* self) {
82 if (rs::isMsgItemGet2D(message) && (al::isNerve(user: this, nerve: &NrvCoinCollect2D.Wait) ||
83 al::isNerve(user: this, nerve: &NrvCoinCollect2D.WaitHint))) {
84 al::invalidateClipping(actor: this);
85 al::setNerve(user: this, nerve: &NrvCoinCollect2D.Got);
86 return true;
87 }
88
89 if (al::isMsgPlayerDisregard(msg: message))
90 return true;
91
92 return false;
93}
94
95void CoinCollect2D::endClipped() {
96 rs::syncCoin2DAnimFrame(actor: this, name: "Wait");
97 al::LiveActor::endClipped();
98}
99
100void CoinCollect2D::appearHintEffect() {
101 al::invalidateClipping(actor: this);
102 al::setNerve(user: this, nerve: &NrvCoinCollect2D.WaitHint);
103 al::startHitReaction(actor: this, name: "発光");
104}
105
106void CoinCollect2D::deleteHintEffect() {
107 mHintState->deleteHintEffect();
108}
109
110void CoinCollect2D::reappearHintEffect() {
111 mHintState->appearHintEffect();
112}
113
114bool CoinCollect2D::isEnableHint() const {
115 if (al::isDead(actor: this))
116 return true;
117
118 return al::isNerve(user: this, nerve: &NrvCoinCollect2D.Wait);
119}
120
121void CoinCollect2D::exeWait() {
122 if (al::isFirstStep(user: this))
123 al::validateClipping(actor: this);
124
125 if (mMtxConnector != nullptr)
126 al::connectPoseQT(actor: this, mtxConnector: mMtxConnector);
127}
128
129void CoinCollect2D::exeWaitHint() {
130 if (mMtxConnector != nullptr)
131 al::connectPoseQT(actor: this, mtxConnector: mMtxConnector);
132
133 if (al::updateNerveState(user: this))
134 al::setNerve(user: this, nerve: &NrvCoinCollect2D.Wait);
135}
136
137void CoinCollect2D::exeGot() {
138 if (al::isFirstStep(user: this)) {
139 al::startAction(actor: this, actionName: "Got");
140 CoinCollectWatcher* watcher = al::getSceneObj<CoinCollectWatcher>(user: this);
141 watcher->countup(actor: this);
142
143 GameDataFunction::addCoinCollect(writer: this, coinCollect: mPlacementId);
144 rs::tryShowCapMsgCollectCoinGetFirst(this);
145 alPadRumbleFunction::startPadRumble(actor: this, name: "コッ(弱)", near: 1000.0f, far: 3000.0f);
146 }
147
148 if (al::isActionEnd(actor: this))
149 kill();
150}
151