1#include "Game/MapObj/FireBar.hpp"
2#include "Game/Util.hpp"
3#include "JSystem/JMath/JMath.hpp"
5FireBarBall::~FireBarBall() {
13FireBarBall::FireBarBall(
LiveActor *pParent) :
ModelObj(
"ファイアバー玉",
"FireBarBall", 0, 0xB, -2, -2, false) {
14 mFireBarParent = pParent;
18 f32 shadowDropDist = 100.0f;
19 MR::getJMapInfoArg6NoInit(rIter, &shadowDropDist);
21 if (0.0f != shadowDropDist) {
22 MR::initShadowVolumeCylinder(
this, 55.0f);
23 MR::setShadowDropLength(
this, 0, shadowDropDist);
24 s32 shadowDropRotate = -1;
25 MR::getJMapInfoArg4NoInit(rIter, &shadowDropRotate);
27 if (shadowDropRotate == 0) {
29 MR::calcUpVec(&upVec, mFireBarParent);
31 MR::setShadowDropDirection(
this, 0, upVec);
35 MR::getJMapInfoArg2NoInit(rIter, &cutShadows);
37 if (cutShadows == 0) {
38 MR::setShadowVolumeEndDropOffset(
this, 0, 20.0f);
39 MR::onShadowVolumeCutDropLength(
this, 0);
40 MR::onCalcShadow(
this, 0);
44 MR::setClippingTypeSphereContainsModelBoundingBox(
this, 100.0f);
48void FireBarBall::initAfterPlacement() {
49 MR::calcGravity(
this);
52void FireBarBall::control() {
56void FireBarBall::startClipped() {
57 MR::deleteEffect(
this,
"FireBarBall");
58 LiveActor::startClipped();
61void FireBarBall::endClipped() {
62 LiveActor::endClipped();
65void FireBarBall::controlEmitEffect() {
66 if (MR::isNearPlayerAnyTime(
this, 5000.0f)) {
67 MR::emitEffect(
this,
"FireBarBall");
70 MR::deleteEffect(
this,
"FireBarBall");
74FireBar::FireBar(
const char *pName) :
LiveActor(pName) {
80 mFireBarSpeed = -1.0f;
82 mStickDistance = 140.0f;
86 MR::initDefaultPos(
this, rIter);
87 initModelManagerWithAnm(
"FireBarCore", 0,
false);
88 MR::connectToSceneMapObj(
this);
90 MR::addBodyMessageSensorMapObj(
this);
91 MR::addHitSensorCallbackEnemyAttack(
this,
"fire", 8, 30.0f);
92 MR::initCollisionParts(
this,
"FireBarCore",
getSensor(
"body"), 0);
93 initEffectKeeper(0, 0,
false);
95 MR::calcGravity(
this);
97 f32 shadowDropDist = 100.0f;
98 MR::getJMapInfoArg6NoInit(rIter, &shadowDropDist);
99 MR::getJMapInfoArg3NoInit(rIter, &shadowDropDist);
100 shadowDropDist -= 55.0f;
102 if (shadowDropDist > 0.0f) {
105 TVec3f drop_direction;
107 shadow_box.x = 100.0f;
108 shadow_box.y = 100.0f;
109 shadow_box.z = 100.0f;
110 MR::initShadowVolumeBox(
this, shadow_box);
111 MR::calcUpVec(&up_vec,
this);
112 JMAVECScaleAdd((
const Vec*)&up_vec, (
const Vec*)&
mPosition, (Vec*)&scaled_vec, 50.0f);
113 MR::setShadowDropPosition(
this, 0, scaled_vec);
114 MR::setShadowVolumeStartDropOffset(
this, 0, 100.0f);
115 MR::setShadowDropLength(
this, 0, shadowDropDist);
117 s32 rotateShadow = -1;
118 MR::getJMapInfoArg4NoInit(rIter, &rotateShadow);
119 if (rotateShadow == 0) {
120 MR::calcUpVec(&drop_direction,
this);
121 drop_direction.negate();
122 MR::setShadowDropDirection(
this, 0, drop_direction);
126 s32 numFireBalls = 5;
127 f32 fireBallSpeed = -1.0f;
128 MR::getJMapInfoArg0NoInit(rIter, &numFireBalls);
129 MR::getJMapInfoArg1NoInit(rIter, &fireBallSpeed);
130 MR::getJMapInfoArg5NoInit(rIter, &mStickDistance);
131 MR::getJMapInfoArg7NoInit(rIter, &mStickCount);
133 mFireBarSpeed = 0.1f * fireBallSpeed;
134 mFireBallCount = mStickCount * numFireBalls;
135 MR::calcFrontVec(&_94,
this);
136 initFireBarBall(rIter);
137 MR::setGroupClipping(
this, rIter, 0x20);
138 MR::setClippingTypeSphere(
this, (mFireBallCount + 1) * 100.0f);
139 MR::useStageSwitchSleep(
this, rIter);
140 initNerve(&NrvFireBar::FireBarNrvWait::sInstance);
144void FireBar::exeWait() {
146 MR::calcUpVec(&up_vec,
this);
147 MR::rotateVecDegree(&up_vec, _94, mFireBarSpeed);
148 MR::startLevelSound(
this,
"SE_OJ_LV_FIRE_BAR_CENTER", -1, -1, -1);
152void FireBar::makeActorAppeared() {
153 for (s32 i = 0; i < mFireBallCount; i++) {
154 mFireBalls[i]->makeActorAppeared();
157 LiveActor::makeActorAppeared();
160void FireBar::makeActorDead() {
161 for (s32 i = 0; i < mFireBallCount; i++) {
162 mFireBalls[i]->makeActorDead();
165 LiveActor::makeActorDead();
169 if (MR::isSensorPlayerOrRide(a2) && MR::isSensorEnemyAttack(a1)) {
170 MR::sendMsgEnemyAttackFire(a2, a1);
178void FireBar::initFireBarBall(
const JMapInfoIter &rIter) {
180 s32 totalNum = mFireBallCount;
181 totalNum /= mStickCount;
182 f32 startVal = 25.0f;
184 for (s32 i = 0; i < mFireBallCount; i++) {
186 mFireBalls[i]->
init(rIter);
187 MR::startBtk(mFireBalls[i],
"FireBarBall");
188 s32 div = i / totalNum;
191 startVal = !(i - div) ? 0.0f : startVal + 25.0f;
192 s32 btkFrame = MR::getBtkFrameMax(mFireBalls[i]);
194 startVal = (derp - (derp / (btkFrame * btkFrame)));
195 MR::setBtkFrame(mFireBalls[i], startVal);
202void FireBar::fixFireBarBall() {
204 scaled.scale(100.0f, _94);
211 s32 totalNum = mFireBallCount;
212 totalNum /= mStickCount;
213 for (s32 i = 0; i < mFireBallCount; i++) {
214 s32 div = i / totalNum;
218 MR::calcUpVec(&up_vec,
this);
219 MR::rotateVecDegree(&scaled, up_vec, 360.0f / mStickCount);
221 MR::normalize(scaled, &norm);
222 JMAVECScaleAdd((
const Vec*)&norm, (
const Vec*)&
mPosition, (Vec*)&final_pos, mStickDistance);
223 JMAVECScaleAdd((
const Vec*)&up_vec, (
const Vec*)&final_pos, (Vec*)&final_pos, 50.0f);
226 JMathInlineVEC::PSVECAdd((
const Vec*)&final_pos, (
const Vec*)&scaled, (Vec*)&final_pos);
233namespace NrvFireBar {
234 FireBarNrvWait FireBarNrvWait::sInstance;
236 void FireBarNrvWait::execute(
Spine *pSpine)
const {
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.
The basis of a drawable actor that can contain states (see: Nerve)
TVec3f mPosition
3D vector of the actor's position.
HitSensor * getSensor(const char *pSensorName) const
Gets a sensor.