1#include "Game/MapObj/AirBubble.hpp"
3AirBubble::AirBubble(
const char *pName) :
LiveActor(pName) {
12 MR::initDefaultPos(
this, rIter);
13 MR::useStageSwitchWriteDead(
this, rIter);
14 initModelManagerWithAnm(
"AirBubble",
nullptr,
false);
15 MR::connectToSceneItem(
this);
17 MR::addHitSensorMapObj(
this,
"body", 8, 130.0f *
mScale.x, TVec3f(0.0f, 0.0f, 0.0f));
18 initEffectKeeper(0,
nullptr,
false);
20 initNerve(&NrvAirBubble::AirBubbleNrvWait::sInstance);
23 MR::setClippingFar100m(
this);
24 MR::startBck(
this,
"Move",
nullptr);
28void AirBubble::initAfterPlacement() {
30 MR::moveCoordAndTransToNearestRailPos(
this);
36void AirBubble::appear() {
40void AirBubble::kill() {
41 if (MR::isValidSwitchDead(
this)) {
42 MR::onSwitchDead(
this);
48void AirBubble::control() {
52void AirBubble::appearMove(
const TVec3f &a1, s32 a2) {
57 setNerve(&NrvAirBubble::AirBubbleNrvMove::sInstance);
58 MR::invalidateClipping(
this);
59 _C4 = a2 > 0 ? a2 : 360;
62void AirBubble::exeBreak() {
63 if (MR::isFirstStep(
this)) {
64 MR::startSound(
this,
"SE_OJ_AIR_BUBBLE_BREAK", -1, -1);
65 MR::emitEffect(
this,
"RecoveryBubbleBreak");
66 MR::incPlayerOxygen(8);
67 MR::tryRumblePadMiddle(
this, 0);
73 if (MR::isSensorPlayer(a2)) {
74 if (isNerve(&NrvAirBubble::AirBubbleNrvKillWait::sInstance)) {
75 MR::incPlayerOxygen(8);
80 setNerve(&NrvAirBubble::AirBubbleNrvBreak::sInstance);
92 if (MR::isMsgItemShow(msg)) {
93 return MR::receiveItemShowMsg(msg, a2, a3);
96 if (MR::isMsgItemHide(msg)) {
97 return MR::receiveItemHideMsg(msg, a2, a3);
100 if (MR::isMsgItemStartMove(msg)) {
104 else if (MR::isMsgItemEndMove(msg)) {
109 else if (MR::isMsgSpinStormRange(msg) && canSpinGet()) {
110 TVec3f stack_8(a2->mPosition);
113 if (PSVECMag(stack_8.toCVec()) < 250.0f) {
114 setNerve(&NrvAirBubble::AirBubbleNrvBreak::sInstance);
122bool AirBubble::canSpinGet()
const {
123 if (isNerve(&NrvAirBubble::AirBubbleNrvWait::sInstance) || isNerve(&NrvAirBubble::AirBubbleNrvMove::sInstance)) {
130AirBubble::~AirBubble() {
134namespace NrvAirBubble {
135 INIT_NERVE(AirBubbleNrvWait);
136 INIT_NERVE(AirBubbleNrvMove);
137 INIT_NERVE(AirBubbleNrvBreak);
138 INIT_NERVE(AirBubbleNrvKillWait);
140 void AirBubbleNrvKillWait::execute(
Spine *pSpine)
const {
143 if (MR::isGreaterStep(bubble, 90)) {
148 void AirBubbleNrvBreak::execute(
Spine *pSpine)
const {
153 void AirBubbleNrvMove::execute(
Spine *pSpine)
const {
158 void AirBubbleNrvWait::execute(
Spine *pSpine)
const {
virtual void init(const JMapInfoIter &)
Intializes the NameObj and can set various settings and construct necessary classes.
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mPosition
3D vector of the actor's position.
TVec3f mScale
3D vector of the actor's scale.