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() == dCsSeqMng_c::CUTSCENE_CMD_87) {
111 static const ProcFunc Proc_tbl[PROC_COUNT] = {
112 &dWmEnemy_c::mode_exec,
113 &dWmEnemy_c::mode_DemoContinue,
114 &dWmEnemy_c::mode_bgmDance,
115 &dWmEnemy_c::mode_lose,
116 &dWmEnemy_c::mode_waitWalk
117 };
118 (this->*Proc_tbl[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 == dCsSeqMng_c::CUTSCENE_CMD_NONE) {
325 return false;
326 }
327 if (b) {
328 switch (id) {
329 case dCsSeqMng_c::CUTSCENE_CMD_4:
330 if (mEnWalk) {
331 initWalk();
332 }
333 break;
334 case dCsSeqMng_c::CUTSCENE_CMD_86:
335 if (actor == this) {
336 initDemoAnger();
337 }
338 break;
339 case dCsSeqMng_c::CUTSCENE_CMD_89:
340 if (isMainCast()) {
341 initDemoLose();
342 }
343 break;
344 case dCsSeqMng_c::CUTSCENE_CMD_91:
345 mRotateTimer = 5;
346 break;
347 }
348 }
349 switch (id) {
350 case dCsSeqMng_c::CUTSCENE_CMD_4:
351 if (mEnWalk) {
352 isEnd = true;
353 if (doWalk()) {
354 isEnd = false;
355 }
356 } else {
357 mIsCutEnd = true;
358 }
359 break;
360 case dCsSeqMng_c::CUTSCENE_CMD_86:
361 if (actor == this) {
362 isEnd = !procDemoAnger();
363 } else {
364 isEnd = false;
365 }
366 break;
367 case dCsSeqMng_c::CUTSCENE_CMD_89:
368 if (isMainCast()) {
369 isEnd = !procDemoLose();
370 } else {
371 isEnd = false;
372 }
373 break;
374 case dCsSeqMng_c::CUTSCENE_CMD_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
465bool dWmEnemy_c::isMainCast() {
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 cutsceneCommands[] = {
533 dCsSeqMng_c::CUTSCENE_CMD_NONE,
534 dCsSeqMng_c::CUTSCENE_CMD_56,
535 dCsSeqMng_c::CUTSCENE_CMD_136,
536 dCsSeqMng_c::CUTSCENE_CMD_86,
537 dCsSeqMng_c::CUTSCENE_CMD_87
538 };
539 return isCutsceneCommandPlaying(cutsceneCommands, ARRAY_SIZE(cutsceneCommands));
540}
541
542bool dWmEnemy_c::IsPlayerComingCore() {
543 int point = daWmPlayer_c::ms_instance->m_234;
544 if (point >= 0 && mPath.isPointIn(point) && !isThroughPoint(point)) {
545 if (isDead()) {
546 return true;
547 }
548 if (GetIndex() != point) {
549 return true;
550 }
551 }
552 return false;
553}
554
555bool dWmEnemy_c::IsNeedChasePlayer() {
556 bool res = false;
557 if (!mHitPlayer && !isDead() && IsPlayerComing()) {
558 res = true;
559 }
560 return res;
561}
562
563bool dWmEnemy_c::IsRandomWalk() {
564 int count = dGameCom::rndInt(100);
565 int randomNumber = 0;
566 while (count >= 0) {
567 randomNumber = dGameCom::rndInt(100);
568 count--;
569 }
570 bool randomWalk = false;
571 if (mCurrProc == PROC_TYPE_WAIT_WALK && randomNumber <= GetChangeDirRate()) {
572 randomWalk = true;
573 }
574 return randomWalk;
575}
576
577bool dWmEnemy_c::IsHitToWaitPlayer() {
578 bool res = false;
579 if (!mHitPlayer) {
580 bool b1 = false;
581 bool b2 = false;
582 int nextPointIdx = daWmPlayer_c::ms_instance->m_22c;
583 if (mPath.GetNextPointIdx() == nextPointIdx && !daWmPlayer_c::ms_instance->m_18c) {
584 b2 = true;
585 }
586 if (b2) {
587 if (mPos.distTo(daWmPlayer_c::ms_instance->mPos) < GetTerritory()) {
588 b1 = true;
589 }
590 }
591 if (b1) {
592 res = true;
593 }
594 }
595 return res;
596}
597
598bool dWmEnemy_c::IsHitToMovePlayer() {
599 bool res = false;
600 if (!mHitPlayer) {
601 bool b1 = false;
602 bool b2 = false;
603 int nextPointIdx = daWmPlayer_c::ms_instance->m_230;
604 if (mPath.GetNextPointIdx() == nextPointIdx && daWmPlayer_c::ms_instance->m_18c) {
605 b2 = true;
606 }
607 if (b2) {
608 if (mPos.distTo(daWmPlayer_c::ms_instance->mPos) < GetTerritory() * 2.0f) {
609 b1 = true;
610 }
611 }
612 if (b1) {
613 res = true;
614 }
615 }
616 return res;
617}
618
619bool dWmEnemy_c::CheckIsHitToPlayer() {
620 bool hitWait = IsHitToWaitPlayer();
621 bool hitMove = IsHitToMovePlayer();
622 if (hitWait || hitMove) {
623 mHitPlayer = true;
624 if (daWmPlayer_c::isPlayerStarMode()) {
625 daWmPlayer_c::ms_instance->setEnemyDieByStar(this);
626 deleteSound();
627 return true;
628 }
629 }
630 if (hitWait) {
631 daWmPlayer_c::ms_instance->m_2fc = true;
632 dCsSeqMng_c::ms_instance->FUN_801017c0(dCsSeqMng_c::SMC_DEMO_START_BATTLE, this, 0, 0x80);
633 deleteSound();
634 return true;
635 } else {
636 if (hitMove) {
637 dCsSeqMng_c::ms_instance->FUN_801017c0(dCsSeqMng_c::SMC_DEMO_START_BATTLE, this, 0, 0x80);
638 deleteSound();
639 return true;
640 } else {
641 return false;
642 }
643 }
644 return false;
645}
646
647bool dWmEnemy_c::isAllEnemyMoveEnd(void) {
648 dWmEnemy_c *en;
649 bool res = true;
650 for (int i = 0; i < ARRAY_SIZE(dWmEnemy::sc_EnemyProfName); i++) {
651 en = (dWmEnemy_c *) fManager_c::searchBaseByProfName(dWmEnemy::sc_EnemyProfName[i], nullptr);
652 if (en != nullptr) {
653 while (en != nullptr) {
654 res &= en->isWaitWalkEnd();
655 en = (dWmEnemy_c *) fManager_c::searchBaseByProfName(dWmEnemy::sc_EnemyProfName[i], en);
656 }
657 break;
658 }
659 }
660 return res;
661}
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)
dWmDemoActor_c()
Constructs a new actor.
bool isCutsceneCommandPlaying(const int *cmdList, int cmdCount)
virtual void setCutEndSpecific(int cutsceneCommandId, bool param2)
int playEffect(int, const mVec3_c *, const mAng3_c *, const mVec3_c *)
virtual int execute()
do method for the execute operation.
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:45
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:109
mAng x
The rotation on the X axis.
Definition m_angle.hpp:108
A three-dimensional floating point vector.
Definition m_vec.hpp:107
static mVec3_c Ey
The unit vector for the Y axis.
Definition m_vec.hpp:217
static mVec3_c Zero
The null vector.
Definition m_vec.hpp:215
u16 ProfileName
The name of a profile. Value is a fProfile::PROFILE_NAME_e.
Definition f_profile.hpp:32
s16 addCalcAngle(s16 *value, s16 target, s16 smoothing, s16 maxStep, s16 minStep)
Smoothly moves value towards target using proportional scaling.
Definition s_lib.cpp:76
s16 mAngle
The rotation.
Definition m_angle.hpp:54