NSMBW-Decomp
A decompilation of New Super Mario Bros. Wii
Loading...
Searching...
No Matches
d_wm_enemy.cpp
1#include <game/bases/d_wm_enemy.hpp>
2#include <game/bases/d_wm_lib.hpp>
3#include <game/bases/d_wm_se_manager.hpp>
4#include <game/bases/d_wm_effect_manager.hpp>
5#include <game/bases/d_a_wm_map.hpp>
6#include <game/bases/d_a_wm_player.hpp>
7#include <game/bases/d_s_world_map_static.hpp>
8#include <game/bases/d_cs_seq_manager.hpp>
9#include <game/bases/d_game_com.hpp>
10#include <game/bases/d_info.hpp>
11
12const char *dWmEnemy_c::smc_PathPointA[WORLD_USED_COUNT] = {
13 "Fa00", "Fa01", "Fa02", "Fa03", "Fa04",
14 "Fa05", "Fa06", "Fa07", "Fa08"
15};
16const char *dWmEnemy_c::smc_PathPointB[WORLD_USED_COUNT] = {
17 "Fb00", "Fb01", "Fb02", "Fb03", "Fb04",
18 "Fb05", "Fb06", "Fb07", "Fb08"
19};
20const char *dWmEnemy_c::smc_PathPointC[WORLD_USED_COUNT] = {
21 "Fc00", "Fc01", "Fc02", "Fc03", "Fc04",
22 "Fc05", "Fc06", "Fc07", "Fc08"
23};
24
25namespace dWmEnemy {
26
27const ProfileName sc_EnemyProfName[] = {
28 fProfile::WM_KURIBO,
29 fProfile::WM_BROS,
30 fProfile::WM_PUKU,
31 fProfile::WM_PAKKUN,
32 fProfile::WM_JUGEM
33};
34
35bool isEnemyWalk() {
36 int courseType = dWmLib::GetCourseTypeFromCourseNo(dInfo_c::m_instance->m_54);
37 if (dScWMap_c::m_WorldNo == dScWMap_c::m_PrevWorldNo &&
38 dScWMap_c::m_SceneNo == dScWMap_c::m_PrevSceneNo &&
39 dWmLib::GetCurrentPlayResultStatus() != 0 &&
40 dWmLib::GetCurrentPlayResultStatus() != 9 &&
41 courseType != dWmLib::COURSE_TYPE_KINOKO_START &&
42 courseType != dWmLib::COURSE_TYPE_PEACH_CASTLE &&
43 courseType != dWmLib::COURSE_TYPE_INVALID &&
44 courseType != dWmLib::COURSE_TYPE_KINOKO &&
45 courseType != dWmLib::COURSE_TYPE_CANNON
46 ) {
47 return true;
48 }
49 return false;
50}
51
52} // namespace dWmEnemy
53
54dWmEnemy_c::~dWmEnemy_c() {
55 if (mpBgmSync != nullptr) {
56 delete mpBgmSync;
57 }
58}
59
60void dWmEnemy_c::initializeBase(const char **names, int count, bool cyclic) {
61 daWmMap_c *wmMap = daWmMap_c::m_instance;
62 dInfo_c::enemy_s enData;
63 dInfo_c::m_instance->GetMapEnemyInfo(dScWMap_c::m_WorldNo, ACTOR_PARAM(enemyNo), enData);
64 dWmConnect_c *connect = &wmMap->mWmConnect[wmMap->currIdx];
65 if (count < 0) {
66 count = wmMap->GetNodeCount(ACTOR_PARAM(enemyNo));
67 }
68 mPath.init(names, count, connect, cyclic, enData.mWalkDirection);
69 mPath.SetStartPoint(getStartPoint());
70 dWmConnect_c::Point_s *point = connect->GetPointFromIndex(mPath.mpCurrentPoint->mPointIndex);
71 mPos = point->pos + getPointOffset(mPath.mpCurrentPoint->mIndex);
72 bool enWalk = false;
73 if (dWmEnemy::isEnemyWalk() && dWmLib::getEnemyRevivalCount(dScWMap_c::m_WorldNo, ACTOR_PARAM(enemyNo)) == 0) {
74 enWalk = true;
75 }
76 mEnWalk = enWalk;
77 initShapeAngle();
78 dWmBgmSync_c *bgmSync = new dWmBgmSync_c();
79 mpBgmSync = bgmSync;
80 bgmSync->mAngle = &mpUnkData->mAngle2;
81 bgmSync->m_04 = bgmSync->mAngle->x.mAngle - 1;
82 bgmSync->m_08 = bgmSync->mAngle->y.mAngle;
83 mSeID = -1;
84 mEfID = -1;
85 mNotAnger = true;
86 float scale = mpUnkData->m_04;
87 mScale.x = scale;
88 mScale.y = scale;
89 mScale.z = scale;
90 mArrivedAtTarget = true;
91 mHitPlayer = false;
92}
93
94int dWmEnemy_c::getStartPoint() {
95 return ACTOR_PARAM(startPoint);
96}
97
98mVec3_c dWmEnemy_c::getPointOffset(int index) {
99 return mVec3_c::Zero;
100}
101
103 if (mpBgmSync != nullptr) {
104 mpBgmSync->execute();
105 if (mpBgmSync->m_0c) {
106 updateBgmAnimRate();
107 }
108 }
109 setCutEndSpecific(dCsSeqMng_c::ms_instance->GetCutName(), dCsSeqMng_c::ms_instance->m_164);
110 if (IsExecEnable() || dCsSeqMng_c::ms_instance->GetCutName() == 0x57) {
111 static const ProcFunc ProcTbl[PROC_COUNT] = {
112 mode_exec,
113 mode_DemoContinue,
114 mode_bgmDance,
115 mode_lose,
116 mode_waitWalk
117 };
118 (this->*ProcTbl[mCurrProc])();
119 }
120 calculateEffect();
121 calc();
122 return SUCCEEDED;
123}
124
125void dWmEnemy_c::updateBgmAnimRate() {}
126
127void dWmEnemy_c::calculateEffect() {}
128
129void dWmEnemy_c::calc() {}
130
131void dWmEnemy_c::init_exec() {
132 mCurrProc = PROC_TYPE_EXEC;
133}
134
135void dWmEnemy_c::mode_exec() {
136 if (IsExecEnable() && mNotAnger && mpBgmSync->m_0d) {
137 init_bgmDance();
138 } else {
139 if (IsNeedChasePlayer()) {
140 init_waitWalk();
141 }
142 }
143}
144
145void dWmEnemy_c::init_lose() {
146 initDemoStarLose();
147 mCurrProc = PROC_TYPE_LOSE;
148}
149
150void dWmEnemy_c::initDemoStarLose() {
151 initDemoLose();
152}
153
154void dWmEnemy_c::mode_lose() {
155 if (procDemoStarLose()) {
156 mVisible = false;
157 }
158}
159
160bool dWmEnemy_c::procDemoStarLose() {
161 return procDemoLose();
162}
163
164void dWmEnemy_c::init_bgmDance() {
165 mCurrProc = PROC_TYPE_BGM_DANCE;
166 mBgmDanceRelated = 1;
167 initDemoBgmDance();
168}
169
170void dWmEnemy_c::initDemoBgmDance() {}
171
172void dWmEnemy_c::mode_bgmDance() {
173 if (procDemoBgmDance()) {
174 init_exec();
175 }
176}
177
178bool dWmEnemy_c::procDemoBgmDance() {
179 return true;
180}
181
182void dWmEnemy_c::init_DemoContinue() {
183 mCurrProc = PROC_TYPE_DEMO_CONTINUE;
184 mDemoContinueRelated = 2;
185 mWalkWaitTimer = 10;
186}
187
188void dWmEnemy_c::mode_DemoContinue() {
189 procDemoAnger();
190}
191
192void dWmEnemy_c::init_waitWalk() {
193 mCurrProc = PROC_TYPE_WAIT_WALK;
194 mWalkWaitTimer = GetWalkWaitFrame() + 1;
195}
196
197void dWmEnemy_c::mode_waitWalk() {
198 if (!mHitPlayer) {
199 if (mWalkWaitTimer > 0) {
200 if (mWalkWaitTimer == 1) {
201 mPath.mAdvancePoint = IsRandomMove();
202 PATH_DIRECTION_e dir;
203 bool randomWalk = IsRandomWalk();
204 if (randomWalk) {
205 mPath.mDir2 = mPath.mDir1;
206 }
207 if (randomWalk) {
208 dir = mPath.mDir1 == PATH_DIR_NORMAL ? PATH_DIR_REVERSE : PATH_DIR_NORMAL;
209 } else {
210 dir = mPath.mDir1;
211 }
212 mPath.mDir1 = dir;
213 initWalk();
214 }
215 mWalkWaitTimer--;
216 } else {
217 if (doWalk() && mCurrProc == PROC_TYPE_WAIT_WALK) {
218 if (!mHitPlayer) {
219 PostWaitWalk();
220 mPath.mAdvancePoint = true;
221 mPath.mDir1 = mPath.mDir2;
222 }
223 if (!daWmPlayer_c::checkWalkPlayers()) {
224 init_exec();
225 }
226 }
227 }
228 }
229}
230
231void dWmEnemy_c::initWalk(float f) {
232 mNextPoint = getNextPointInfo();
233 mPrevPoint = mPos;
234 mSpeedF = f;
235 mAccelY = -5.0f;
236 mMaxFallSpeed = -10.0f;
237 mArrivedAtTarget = false;
238 mDemoAngle.y = (getNextPointInfo() - mPos).xzAng();
239 if (isNextThroughPoint()) {
240 mNextPointType = POINT_TYPE_THROUGH;
241 } else {
242 mNextPointType = POINT_TYPE_STOP;
243 }
244}
245
246bool dWmEnemy_c::doWalk() {
247 if (!mArrivedAtTarget) {
248 if (mDemoAngle.y != mAngle3D.y) {
249 sLib::addCalcAngle(&mAngle3D.y.mAngle, mDemoAngle.y, 10, 0x2000, 0x400);
251 } else {
252 if (mSeID < 0) {
253 dWmSeManager_c *seManager = dWmSeManager_c::m_pInstance;
254 mSeID = seManager->playSound(getEnemyWalkSeID(), 0, mPos, ACTOR_PARAM(enemyNo) + 1, 1);
255 }
256 setWalkAnm(getWalkAnmRate());
257 calcSpeed();
258 posMove();
259 adjustHeightBase(mPrevPoint, mNextPoint, -1);
260 bool hitToPlayer = false;
261 if (CheckIsHitToPlayer()) {
262 hitToPlayer = true;
263 }
264 if (!mArrivedAtTarget && checkArriveTargetXYZ(mPrevPoint, mNextPoint)) {
265 bool tmp = false;
266 if (mNextPointType == POINT_TYPE_THROUGH) {
267 tmp = true;
268 }
269 mPos = mNextPoint;
270 mSpeedF = 0.0f;
271 mArrivedAtTarget = true;
272 updatePathInfo(!tmp);
273 }
274 if (hitToPlayer) {
275 return true;
276 }
277 }
278 }
279 if (mArrivedAtTarget) {
280 setWalkAnm(1.0f);
281 if (mNextPointType == POINT_TYPE_STOP) {
282 deleteSound();
283 mDemoAngle.y = getWaitAngle();
284 sLib::addCalcAngle(&mAngle3D.y.mAngle, mDemoAngle.y, 10, 0x2000, 0x400);
285 } else {
286 mAngle3D.y = mDemoAngle.y;
287 }
289 if (mDemoAngle.y == mAngle3D.y) {
290 if (mNextPointType == POINT_TYPE_THROUGH) {
291 initWalk();
292 return false;
293 }
294 return true;
295 }
296 }
297 return false;
298}
299
300mVec3_c dWmEnemy_c::getNextPointInfo() {
301 daWmMap_c *wmMap = daWmMap_c::m_instance;
302 dWmConnect_c *connect = &wmMap->mWmConnect[wmMap->currIdx];
303 dWmConnect_c::Point_s *point = connect->GetPointFromIndex(mPath.GetNextPointIdx());
304 int idx = mPath.GetNextPointInfo(false)->mIndex;
305 return point->pos + getPointOffset(idx);
306}
307
308mVec3_c dWmEnemy_c::getCurrentPointInfo() {
309 daWmMap_c *wmMap = daWmMap_c::m_instance;
310 dWmConnect_c *connect = &wmMap->mWmConnect[wmMap->currIdx];
311 dWmConnect_c::Point_s *point = connect->GetPointFromIndex(mPath.mpCurrentPoint->mPointIndex);
312 return point->pos + getPointOffset(mPath.mpCurrentPoint->mIndex);
313}
314
315void dWmEnemy_c::initShapeAngle() {
316 short angle = getWaitAngle();
317 mAngle.y = angle;
318 mAngle3D.y = angle;
319}
320
321bool dWmEnemy_c::csCommand(int id, bool b) {
322 dWmDemoActor_c *actor = dCsSeqMng_c::ms_instance->m_1ac;
323 bool isEnd = false;
324 if (id == -1) {
325 return false;
326 }
327 if (b) {
328 switch (id) {
329 case 4:
330 if (mEnWalk) {
331 initWalk();
332 }
333 break;
334 case 86:
335 if (actor == this) {
336 initDemoAnger();
337 }
338 break;
339 case 89:
340 if (FUN_800f88d0()) {
341 initDemoLose();
342 }
343 break;
344 case 91:
345 mRotateTimer = 5;
346 break;
347 }
348 }
349 switch (id) {
350 case 4:
351 if (mEnWalk) {
352 isEnd = true;
353 if (doWalk()) {
354 isEnd = false;
355 }
356 } else {
357 mIsCutEnd = true;
358 }
359 break;
360 case 86:
361 if (actor == this) {
362 isEnd = !procDemoAnger();
363 } else {
364 isEnd = false;
365 }
366 break;
367 case 89:
368 if (FUN_800f88d0()) {
369 isEnd = !procDemoLose();
370 } else {
371 isEnd = false;
372 }
373 break;
374 case 91:
375 if (mHitPlayer && dScWMap_c::m_WorldNo != WORLD_4) {
376 isEnd = true;
377 if (mRotateTimer > 0) {
378 doWalk();
379 mRotateTimer--;
380 }
381 if (mArrivedAtTarget || mRotateTimer == 0) {
382 if (!mArrivedAtTarget) {
383 updatePathInfo(true);
384 }
385 setWalkAnm(1.0f);
386 deleteSound();
387 PostWaitWalk();
388 isEnd = false;
389 mPath.mAdvancePoint = true;
390 mPath.mDir1 = mPath.mDir2;
391 mRotateTimer--;
392 }
393 }
394 break;
395 }
396 return isEnd;
397}
398
399void dWmEnemy_c::initDemoAnger() {
400 mVec3_c playerPos = daWmPlayer_c::ms_instance->mPos;
401 mDemoAngle.y = (playerPos - mPos).xzAng();
402 mNotAnger = false;
403 mRotateTimer = 10;
404}
405
406bool dWmEnemy_c::procDemoAnger() {
407 bool res = false;
408 if (mCurrProc != PROC_TYPE_BGM_DANCE) {
409 if (mRotateTimer > 0) {
410 mRotateTimer--;
411 } else {
412 sLib::addCalcAngle(&mAngle3D.y.mAngle, mDemoAngle.y, 100, 0x4000, 0x800);
414 if (mDemoAngle.y == mAngle3D.y) {
415 res = true;
416 }
417 }
418 }
419 return res;
420}
421
422void dWmEnemy_c::initDemoLose() {}
423
424void dWmEnemy_c::demoJump(const mVec3_c &pos, JumpData_s &jumpData, float scale) {
425 _initDemoJumpBase(pos, 0,
426 jumpData.mFrames, jumpData.mJumpSpeed,
427 jumpData.mStartScale * scale, jumpData.mEndScale * scale,
429 );
430}
431
432bool dWmEnemy_c::procDemoLose() {
433 return true;
434}
435
436void dWmEnemy_c::procDemoLoseEnd() {
437 mVisible = false;
438 dInfo_c::enemy_s enData;
439 dInfo_c::m_instance->GetMapEnemyInfo(dScWMap_c::m_WorldNo, ACTOR_PARAM(enemyNo), enData);
440 enData.mPathIndex = -1;
441}
442
443bool dWmEnemy_c::procDemoLoseBase(short angle) {
444 bool res = false;
445 rotDirectionX(angle, false);
446 if (_procDemoJumpBase()) {
447 dWmEffectManager_c::m_pInstance->playEffect(dWmEffectManager_c::WM_EFFECT_ENEMY_DEATH, &mPos, nullptr, nullptr);
448 dWmSeManager_c::m_pInstance->playSound(dWmSeManager_c::WM_SE_EMY_CS_ENEMY_BYE, mPos, 1);
449 mPos.y -= 10000.0f;
450 res = true;
451 procDemoLoseEnd();
452 }
453 return res;
454}
455
456bool dWmEnemy_c::isNextThroughPoint() {
457 return isThroughPoint(mPath.GetNextPointIdx());
458}
459
460bool dWmEnemy_c::isThroughPoint(int idx) {
461 daWmMap_c *wmMap = daWmMap_c::m_instance;
462 return wmMap->mCsvData[wmMap->currIdx].GetPointName(idx)[0] == 'K';
463}
464
466 return dInfo_c::m_instance->m_9c == ACTOR_PARAM(enemyNo);
467}
468
469bool dWmEnemy_c::isDead() {
470 return dWmLib::getEnemyRevivalCount(dScWMap_c::m_WorldNo, ACTOR_PARAM(enemyNo)) != 0;
471}
472
473void dWmEnemy_c::ModelCalc(m3d::mdl_c *mdl, float yOffset, float shadowYOffset, float shadowScale) {
474 mdl->play();
475 mVec3_c selfPos = mPos;
476 mAng3_c ang = mAngle;
477 selfPos.y += yOffset;
478 mMatrix.trans(selfPos).ZXYrotM(ang);
479 mMatrix.concat(mMtx_c::createTrans(mVec3_c(0.0f, -yOffset, 0.0f)));
480 mdl->setLocalMtx(&mMatrix);
481 mdl->setScale(mScale);
482 mdl->calc(false);
483 CalcShadow(shadowYOffset, shadowScale);
484}
485
486void dWmEnemy_c::updatePathInfo(bool b) {
487 dInfo_c *info = dInfo_c::m_instance;
488 mPath.UpdatePoint();
489 mDemoAngle.y = (getNextPointInfo() - mPos).xzAng();
490 if (b) {
491 int wNo = dScWMap_c::m_WorldNo;
492 int sNo = dScWMap_c::m_SceneNo;
493 int param = ACTOR_PARAM(enemyNo);
494 int v = vfc4(mPath.GetPathPointNo(mPath.mpCurrentPoint->mpName));
495 info->SetMapEnemyInfo(wNo, param, sNo, v);
496 info->FUN_800bbc40(wNo, param, mPath.mDir1);
497 }
498}
499
500void dWmEnemy_c::deleteSound() {
501 if (mSeID < 0) {
502 return;
503 }
504 dWmSeManager_c::m_pInstance->endSound(mSeID);
505 mSeID = -1;
506}
507
508void dWmEnemy_c::deleteEffect() {
509 if (mEfID < 0) {
510 return;
511 }
512 dWmEffectManager_c::m_pInstance->endEffect(mEfID);
513 mEfID = -1;
514}
515
516int dWmEnemy_c::getEnemyWalkSeID() {
517 switch (dScWMap_c::m_WorldNo) {
518 case WORLD_1:
519 return dWmSeManager_c::WM_SE_EMY_CS_MOVE_W1_KURIBO;
520 case WORLD_3:
521 return dWmSeManager_c::WM_SE_EMY_CS_MOVE_W3_ICEBROS;
522 case WORLD_5:
523 return dWmSeManager_c::WM_SE_EMY_CS_MOVE_W5_PAKKUN;
524 case WORLD_7:
525 return dWmSeManager_c::WM_SE_EMY_CS_MOVE_W7_JUGEM;
526 default:
527 return dWmSeManager_c::WM_SE_INVALID;
528 }
529}
530
531bool dWmEnemy_c::IsExecEnable() {
532 static const int cutsceneIDs[] = {
533 -1, 56, 136, 86, 87
534 };
535 return isCutscenePlaying(cutsceneIDs, ARRAY_SIZE(cutsceneIDs));
536}
537
538bool dWmEnemy_c::IsPlayerComingCore() {
539 int point = daWmPlayer_c::ms_instance->m_234;
540 if (point >= 0 && mPath.isPointIn(point) && !isThroughPoint(point)) {
541 if (isDead()) {
542 return true;
543 }
544 if (GetIndex() != point) {
545 return true;
546 }
547 }
548 return false;
549}
550
551bool dWmEnemy_c::IsNeedChasePlayer() {
552 bool res = false;
553 if (!mHitPlayer && !isDead() && IsPlayerComing()) {
554 res = true;
555 }
556 return res;
557}
558
559bool dWmEnemy_c::IsRandomWalk() {
560 int count = dGameCom::rndInt(100);
561 int randomNumber = 0;
562 while (count >= 0) {
563 randomNumber = dGameCom::rndInt(100);
564 count--;
565 }
566 bool randomWalk = false;
567 if (mCurrProc == PROC_TYPE_WAIT_WALK && randomNumber <= GetChangeDirRate()) {
568 randomWalk = true;
569 }
570 return randomWalk;
571}
572
573bool dWmEnemy_c::IsHitToWaitPlayer() {
574 bool res = false;
575 if (!mHitPlayer) {
576 bool b1 = false;
577 bool b2 = false;
578 int nextPointIdx = daWmPlayer_c::ms_instance->m_22c;
579 if (mPath.GetNextPointIdx() == nextPointIdx && !daWmPlayer_c::ms_instance->m_18c) {
580 b2 = true;
581 }
582 if (b2) {
583 if (mPos.distTo(daWmPlayer_c::ms_instance->mPos) < GetTerritory()) {
584 b1 = true;
585 }
586 }
587 if (b1) {
588 res = true;
589 }
590 }
591 return res;
592}
593
594bool dWmEnemy_c::IsHitToMovePlayer() {
595 bool res = false;
596 if (!mHitPlayer) {
597 bool b1 = false;
598 bool b2 = false;
599 int nextPointIdx = daWmPlayer_c::ms_instance->m_230;
600 if (mPath.GetNextPointIdx() == nextPointIdx && daWmPlayer_c::ms_instance->m_18c) {
601 b2 = true;
602 }
603 if (b2) {
604 if (mPos.distTo(daWmPlayer_c::ms_instance->mPos) < GetTerritory() * 2.0f) {
605 b1 = true;
606 }
607 }
608 if (b1) {
609 res = true;
610 }
611 }
612 return res;
613}
614
615bool dWmEnemy_c::CheckIsHitToPlayer() {
616 bool hitWait = IsHitToWaitPlayer();
617 bool hitMove = IsHitToMovePlayer();
618 if (hitWait || hitMove) {
619 mHitPlayer = true;
620 if (daWmPlayer_c::isPlayerStarMode()) {
621 daWmPlayer_c::ms_instance->setEnemyDieByStar(this);
622 deleteSound();
623 return true;
624 }
625 }
626 if (hitWait) {
627 daWmPlayer_c::ms_instance->m_2fc = true;
628 dCsSeqMng_c::ms_instance->FUN_801017c0(0x29, this, 0, 0x80);
629 deleteSound();
630 return true;
631 } else {
632 if (hitMove) {
633 dCsSeqMng_c::ms_instance->FUN_801017c0(0x29, this, 0, 0x80);
634 deleteSound();
635 return true;
636 } else {
637 return false;
638 }
639 }
640 return false;
641}
642
643bool dWmEnemy_c::isAllEnemyMoveEnd(void) {
644 dWmEnemy_c *en;
645 bool res = true;
646 for (int i = 0; i < ARRAY_SIZE(dWmEnemy::sc_EnemyProfName); i++) {
647 en = (dWmEnemy_c *) fManager_c::searchBaseByProfName(dWmEnemy::sc_EnemyProfName[i], nullptr);
648 if (en != nullptr) {
649 while (en != nullptr) {
650 res &= en->isWaitWalkEnd();
651 en = (dWmEnemy_c *) fManager_c::searchBaseByProfName(dWmEnemy::sc_EnemyProfName[i], en);
652 }
653 break;
654 }
655 }
656 return res;
657}
bool mVisible
Whether the actor should be visible or not. Defaults to true .
mAng3_c mAngle3D
The actor's rotation (for 3D actors).
mMtx_c mMatrix
The actor's partial transformation matrix. See makeMtx for details.
mVec3_c mScale
The actor's scale (defaults to 1).
mVec3_c mPos
The actor's position.
float mSpeedF
The actor's horizontal speed.
void posMove()
Moves the actor by its speed.
float mMaxFallSpeed
The actor's maximum fall speed.
void calcSpeed()
Updates the actor's speed (3D actors). See here for details.
mAng3_c mAngle
The actor's rotation (for 2D actors).
float mAccelY
The actor's vertical acceleration.
void FUN_801017c0(int, dWmEnemy_c *, int, int)
bool isCutscenePlaying(const int *csList, int csCount)
virtual void setCutEndSpecific(int cutsceneId, bool param2)
int playEffect(int, const mVec3_c *, const mAng3_c *, const mVec3_c *)
virtual int execute()
do method for the execute operation.
bool FUN_800f88d0()
virtual int vfc4(int pointNo)
POINT_TYPE_e mNextPointType
0 = stop point, 1 = through point
bool csCommand(int id, bool b)
void demoJump(const mVec3_c &pos, JumpData_s &jumpData, float scale)
int playSound(int id, int, const mVec3_c &pos, int, int)
int GetNodeCount(int)
@ SUCCEEDED
The step was completed successfully.
Definition f_base.hpp:43
static fBase_c * searchBaseByProfName(ProfileName profID, const fBase_c *parent)
Searches for a base with a given profile name, optionally under a given parent.
Definition f_manager.cpp:26
mAng y
The rotation on the Y axis.
Definition m_angle.hpp:113
mAng x
The rotation on the X axis.
Definition m_angle.hpp:112
A three-dimensional floating point vector.
Definition m_vec.hpp:101
static mVec3_c Ey
The unit vector for the Y axis.
Definition m_vec.hpp:211
static mVec3_c Zero
The null vector.
Definition m_vec.hpp:209
u16 ProfileName
The name of a profile. Value is a fProfile::PROFILE_NAME_e.
Definition f_profile.hpp:32
s16 mAngle
The rotation.
Definition m_angle.hpp:55