1#include "Game/MapObj/PressureBase.hpp"
9 MR::connectToSceneMapObjMovement(
this);
11 MR::addBodyMessageSensorMapObj(
this);
12 MR::invalidateClipping(
this);
13 initNerve(&NrvPressureMessenger::PressureMessengerNrvSync::sInstance);
17void PressureMessenger::exeSync() {
18 if (MR::isStep(
this, _90)) {
19 mSharedGroup->sendMsgToGroupMember(0x68,
getSensor(
"body"),
"body");
20 setNerve(&NrvPressureMessenger::PressureMessengerNrvSync::sInstance);
24PressureBase::PressureBase(
const char *pName) :
LiveActor(pName) {
25 mJointController =
nullptr;
30 mNozzleRotation = 0.0f;
41 MR::initDefaultPos(
this, rIter);
43 MR::getObjectName(&objName, rIter);
44 initModelManagerWithAnm(objName,
nullptr,
false);
45 MR::calcFrontVec(&mFront,
this);
46 MR::connectToSceneNoShadowedMapObjStrongLight(
this);
48 MR::addHitSensorMapObj(
this,
"body", 8, 70.0f, TVec3f(0.0f, 30.0f, 0.0f));
49 MR::addHitSensorAtJointMapObjSimple(
this,
"cannon",
"Cannon1", 8, 70.0f, TVec3f(40.0f, 0.0f, 0.0f));
50 initEffectKeeper(0,
nullptr,
false);
52 MR::initShadowVolumeSphere(
this, 75.0f);
53 MR::invalidateShadow(
this,
nullptr);
54 mJointController = MR::createJointDelegatorWithNullChildFunc<PressureBase>(
this, &PressureBase::calcJointCannonV,
"Cannon1");
55 MR::initJointTransform(
this);
56 MR::getJMapInfoArg0NoInit(rIter, &mNozzleRotation);
57 MR::getJMapInfoArg1NoInit(rIter, &mWaitTime);
58 s16 frame = MR::getBckFrameMax(
this,
"ShotStart");
59 _B0 = (mWaitTime < frame);
62 MR::getJMapInfoArg2NoInit(rIter, &mBallSpeed);
63 MR::getJMapInfoArg3NoInit(rIter, &mShotType);
64 MR::calcGravity(
this);
65 MR::setGroupClipping(
this, rIter, 32);
66 mGroup = MR::joinToGroupArray(
this, rIter,
"プレッシャー軍団", 0x20);
68 if (mGroup !=
nullptr) {
78 MR::tryRegisterDemoCast(
this, rIter);
79 MR::useStageSwitchSleep(
this, rIter);
81 if (MR::useStageSwitchReadA(
this, rIter)) {
82 void (
PressureBase::*relaxFunc)(
void) = &PressureBase::startRelax;
83 void (
PressureBase::*waitFunc)(
void) = &PressureBase::startWait;
84 MR::listenStageSwitchOnOffA(
this, MR::Functor(
this, relaxFunc), MR::Functor(
this, waitFunc));
85 initNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance);
88 initNerve(&NrvPressureBase::PressureBaseNrvFirstWait::sInstance);
91 if (MR::useStageSwitchReadAppear(
this, rIter)) {
92 MR::syncStageSwitchAppear(
this);
102void PressureBase::initAfterPlacement() {
103 if (mMessenger !=
nullptr) {
106 for (u16 i = 0; i < MR::getGroupFromArray(
this)->mObjectCount; ++i) {
109 if (actor->mWaitTime > waitTime) {
110 waitTime = actor->mWaitTime;
114 mMessenger->_90 = waitTime + 60;
121 mJointController->registerCallBack();
124void PressureBase::control() {
125 if (mWaitTime == 3) {
126 MR::turnDirectionToTargetDegree(
this, &mFront, *MR::getPlayerPos(), 5.0f);
130void PressureBase::exeBound() {
131 if (MR::isFirstStep(
this)) {
132 if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance)) {
133 MR::startBck(
this,
"SwitchOff",
nullptr);
136 MR::startBck(
this,
"SwitchOn",
nullptr);
140 f32 rate = MR::calcNerveRate(
this, 0x14);
141 f32 scale = MR::getScaleWithReactionValueZeroToOne(rate, 1.0f, -2.0f);
142 scale *= (-45.0f - mNozzleRotation);
144 if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance)) {
145 _9C = mNozzleRotation + scale;
148 _9C = -45.0f - scale;
151 if (MR::isStep(
this, 0x14)) {
152 if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance)) {
153 setNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance);
156 setNerve(&NrvPressureBase::PressureBaseNrvWait::sInstance);
161void PressureBase::exeWait() {
162 if (mWaitTime == MR::getBckFrameMax(
this,
"ShotStart") + getNerveStep()) {
163 setNerve(&NrvPressureBase::PressureBaseNrvPrepareToShot::sInstance);
165 else if (MR::isStep(
this, mWaitTime)) {
166 setNerve(&NrvPressureBase::PressureBaseNrvShot::sInstance);
170void PressureBase::exePrepareToShot() {
171 if (MR::isFirstStep(
this)) {
172 MR::startBck(
this,
"ShotStart",
nullptr);
175 if (MR::isBckStopped(
this)) {
176 setNerve(&NrvPressureBase::PressureBaseNrvShot::sInstance);
180void PressureBase::exeShot() {
181 if (MR::isFirstStep(
this)) {
183 MR::startBck(
this,
"ShortShot",
nullptr);
186 MR::startBck(
this,
"Shot",
nullptr);
191 if (MR::isStep(
this, 0x36)) {
192 shotBullet(mBallSpeed);
196 if (MR::isStep(
this, 0x10)) {
197 shotBullet(mBallSpeed);
201 if (MR::isBckStopped(
this)) {
202 if (mGroup !=
nullptr) {
203 setNerve(&NrvPressureBase::PressureBaseNrvSyncWait::sInstance);
206 setNerve(&NrvPressureBase::PressureBaseNrvWait::sInstance);
212 if (MR::isSensorPlayer(a2) || MR::isSensorEnemy(a2)) {
213 MR::sendMsgPush(a2, a1);
218 return MR::isMsgStarPieceReflect(msg);
224 if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance) || isNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance)) {
232 setNerve(&NrvPressureBase::PressureBaseNrvWait::sInstance);
239void PressureBase::startWait() {
240 if (isNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance)) {
241 setNerve(&NrvPressureBase::PressureBaseNrvWaitStart::sInstance);
245void PressureBase::startRelax() {
246 bool dontStartRelax =
false;
248 if (isNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance) || isNerve(&NrvPressureBase::PressureBaseNrvRelax::sInstance)) {
249 dontStartRelax =
true;
252 if (!dontStartRelax) {
253 MR::startSound(
this,
"SE_OJ_W_PRESS_HEAD_OFF", -1, -1);
254 setNerve(&NrvPressureBase::PressureBaseNrvRelaxStart::sInstance);
262bool PressureBase::shotBullet(f32) {
268bool PressureBase::isShotTypeOnGravity()
const {
269 return mShotType == 0;
272bool PressureBase::isShotTypeFollow()
const {
273 return mShotType == 2;
276namespace NrvPressureMessenger {
277 INIT_NERVE(PressureMessengerNrvSync);
280namespace NrvPressureBase {
281 INIT_NERVE(PressureBaseNrvRelaxStart);
282 INIT_NERVE(PressureBaseNrvWaitStart);
283 INIT_NERVE(PressureBaseNrvRelax);
284 INIT_NERVE(PressureBaseNrvSyncWait);
285 INIT_NERVE(PressureBaseNrvFirstWait);
286 INIT_NERVE(PressureBaseNrvWait);
287 INIT_NERVE(PressureBaseNrvPrepareToShot);
288 INIT_NERVE(PressureBaseNrvShot);
290 void PressureBaseNrvShot::execute(
Spine *pSpine)
const {
295 void PressureBaseNrvPrepareToShot::execute(
Spine *pSpine)
const {
297 pressure->exePrepareToShot();
300 void PressureBaseNrvWait::execute(
Spine *pSpine)
const {
305 void PressureBaseNrvFirstWait::execute(
Spine *pSpine)
const {
308 if (MR::isStep(pressure, pressure->mWaitTime)) {
309 pressure->setNerve(&NrvPressureBase::PressureBaseNrvPrepareToShot::sInstance);
313 void PressureBaseNrvSyncWait::execute(
Spine *pSpine)
const {
317 void PressureBaseNrvRelax::execute(
Spine *pSpine)
const {
320 if (MR::isFirstStep(pressure)) {
321 pressure->_9C = -45.0f;
325 void PressureBaseNrvWaitStart::execute(
Spine *pSpine)
const {
327 pressure->exeBound();
330 void PressureBaseNrvRelaxStart::execute(
Spine *pSpine)
const {
332 pressure->exeBound();
336namespace NrvPressureMessenger {
337 void PressureMessengerNrvSync::execute(
Spine *pSpine)
const {
343PressureMessenger::~PressureMessenger() {
The basis of a drawable actor that can contain states (see: Nerve)
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
HitSensor * getSensor(const char *pSensorName) const
Gets a sensor.
void initWithoutIter()
Initializes a NameObj without a JMapInfoIter instance.
virtual void calcAndSetBaseMtx()
Calculates and sets the base matrix of the actor.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.