| 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 | |
| 27 | namespace { |
| 28 | NERVE_IMPL(CoinCollect2D, Wait); |
| 29 | NERVE_IMPL(CoinCollect2D, WaitHint); |
| 30 | NERVE_IMPL(CoinCollect2D, Got); |
| 31 | |
| 32 | NERVES_MAKE_STRUCT(CoinCollect2D, Wait, WaitHint, Got); |
| 33 | } // namespace |
| 34 | |
| 35 | CoinCollect2D::CoinCollect2D(const char* name) : al::LiveActor(name) {} |
| 36 | |
| 37 | void 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 | |
| 75 | void CoinCollect2D::initAfterPlacement() { |
| 76 | if (mMtxConnector != nullptr) |
| 77 | al::attachMtxConnectorToCollision(mtxConnector: mMtxConnector, actor: this, false); |
| 78 | } |
| 79 | |
| 80 | bool 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 | |
| 95 | void CoinCollect2D::endClipped() { |
| 96 | rs::syncCoin2DAnimFrame(actor: this, name: "Wait" ); |
| 97 | al::LiveActor::endClipped(); |
| 98 | } |
| 99 | |
| 100 | void CoinCollect2D::appearHintEffect() { |
| 101 | al::invalidateClipping(actor: this); |
| 102 | al::setNerve(user: this, nerve: &NrvCoinCollect2D.WaitHint); |
| 103 | al::startHitReaction(actor: this, name: "発光" ); |
| 104 | } |
| 105 | |
| 106 | void CoinCollect2D::deleteHintEffect() { |
| 107 | mHintState->deleteHintEffect(); |
| 108 | } |
| 109 | |
| 110 | void CoinCollect2D::reappearHintEffect() { |
| 111 | mHintState->appearHintEffect(); |
| 112 | } |
| 113 | |
| 114 | bool CoinCollect2D::isEnableHint() const { |
| 115 | if (al::isDead(actor: this)) |
| 116 | return true; |
| 117 | |
| 118 | return al::isNerve(user: this, nerve: &NrvCoinCollect2D.Wait); |
| 119 | } |
| 120 | |
| 121 | void 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 | |
| 129 | void 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 | |
| 137 | void 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 | |