1#include <game/bases/d_a_player_base.hpp>
2#include <game/bases/d_a_player_demo_manager.hpp>
3#include <game/bases/d_a_player_manager.hpp>
4#include <game/bases/d_bg.hpp>
5#include <game/bases/d_bg_parameter.hpp>
6#include <game/bases/d_cd.hpp>
7#include <game/bases/d_game_com.hpp>
8#include <game/bases/d_game_key.hpp>
9#include <game/bases/d_info.hpp>
10#include <game/bases/d_next.hpp>
11#include <game/bases/d_s_stage.hpp>
12#include <game/bases/d_stage_timer.hpp>
13#include <game/bases/d_score_manager.hpp>
14#include <game/bases/d_attention.hpp>
15#include <game/bases/d_mask_manager.hpp>
16#include <game/bases/d_multi_manager.hpp>
17#include <game/bases/d_quake.hpp>
18#include <game/bases/d_rail.hpp>
19#include <game/bases/d_remocon_manager.hpp>
20#include <game/mLib/m_fader.hpp>
22#include <game/sLib/s_lib.hpp>
25const float daPlBase_c::sc_DirSpeed[] = { 1.0f, -1.0f };
26const float daPlBase_c::sc_JumpSpeed = 3.628f;
27const float daPlBase_c::sc_JumpSpeedNuma1 = 3.5f;
28const float daPlBase_c::sc_JumpSpeedNuma2 = 2.3f;
29const float daPlBase_c::sc_WaterWalkSpeed = 0.5625f;
30const float daPlBase_c::sc_WaterSwimSpeed = 1.125f;
31const float daPlBase_c::sc_WaterJumpSpeed = 1.25f;
32const float daPlBase_c::sc_WaterMaxFallSpeed = -3.0f;
33const float daPlBase_c::sc_MaxFallSpeed = -4.0f;
34const float daPlBase_c::sc_MaxFallSpeed_Foot = -2.0f;
35const float daPlBase_c::sc_MaxFallDownSpeed = -8.5f;
36const float daPlBase_c::scTurnPowerUpRate = 3.0f;
39 const float l_sakaMaxSpeedRatio[][3] = {
41 { 1.25f, 0.6875f, 1.0f },
42 { 1.25f, 0.6875f, 1.0f },
43 { 1.44f, 0.5f, 1.0f },
44 { 1.62f, 0.3f, 1.0f },
46 const float l_sakaStopAccele[][3] = {
47 { 0.035f, 0.035f, 0.035f },
48 { 0.0315f, 0.046f, 0.035f },
49 { 0.028f, 0.06f, 0.035f },
50 { 0.021f, 0.123f, 0.035f },
51 { 0.014f, 0.175f, 0.035f },
53 const float l_sakaMoveAccele[][3] = {
54 { 0.1f, 0.03f, 0.03f },
55 { 0.04f, 0.03f, 0.03f },
56 { 0.05f, 0.045f, 0.03f },
57 { 0.07f, 0.12f, 0.03f },
58 { 0.17f, 0.17, 0.03f },
60 const float l_sakaSlipOffSpeed[][3] = {
63 { 0.2f, -0.2f, 0.0f },
64 { 0.4f, -0.4f, 0.0f },
65 { 0.4f, -0.4f, 0.0f },
69daPlBase_c::daPlBase_c() :
71 mDemoStateMgr(*this, sStateID::
null),
72 mStateMgr(*this, sStateID::
null)
74 mAreaNo = dScStage_c::m_instance->mCurrAreaNo;
75 mLayer = dScStage_c::m_instance->mCurrLayer;
77 mBc.mOwningPlrNo = mPlayerNo;
78 changeDemoState(StateID_DemoNone,
false);
79 changeState(StateID_None);
81 mViewLimitPadding = 16.0f;
82 mEatBehavior = EAT_TYPE_NONE;
85daPlBase_c::~daPlBase_c() {
92 if (dScStage_c::m_gameMode == dInfo_c::GAME_MODE_TITLE) {
133 mSndObj.calculate(dAudio::cvtSndObjctPos(
getCenterPos()));
140 mLiftRelatedPos =
mPos;
166 clearFollowMameKuribo();
174 mIsBeingDeleted =
true;
229void daPlBase_c::executeState() {
236short daPlBase_c::getMukiAngle(u8 direction) {
237 static const short scMukiAngle[] = { 0x3000, -0x3000 };
238 return scMukiAngle[direction];
241int daPlBase_c::turnAngle() {
245int daPlBase_c::addCalcAngleY(
short p1,
short p2) {
249short daPlBase_c::getBesideMukiAngle(u8 direction) {
250 static const short scMukiAngle[] = { 0x4000, -0x4000 };
251 return scMukiAngle[direction];
254void daPlBase_c::turnBesideAngle() {
258bool daPlBase_c::checkRideActor(
daPlBase_c *other) {
265void daPlBase_c::initializeState_None() {}
266void daPlBase_c::finalizeState_None() {}
267void daPlBase_c::executeState_None() {}
269void daPlBase_c::setWaitActionAnm(AnmBlend_e blendMode) {}
270void daPlBase_c::setWalkActionAnm(AnmBlend_e blendMode) {}
272void daPlBase_c::walkActionInit_Wait(AnmBlend_e blendMode) {}
273void daPlBase_c::walkAction_Wait() {}
275void daPlBase_c::walkActionInit_Move(AnmBlend_e blendMode) {}
276void daPlBase_c::walkAction_Move() {
279 if (isNowBgCross(BGC_11) || mTimer_f4 != 0 || mWindSpeed) {
280 if (mKey.buttonWalk(
nullptr)) {
288 if (mPowerup == POWERUP_MINI_MUSHROOM &&
mBc.getSakaUpDown(
mDirection) == 1) {
295 if (isNowBgCross(BGC_SLOPE_AND_HEAD) || !mKey.buttonWalk(
nullptr)) {
300 }
else if (isNowBgCross(
BGC_LIFT)) {
303 setWalkActionAnm(blendMode);
307void daPlBase_c::initializeState_Walk() {}
309void daPlBase_c::finalizeState_Walk() {
313void daPlBase_c::executeState_Walk() {
321 static const float csSpeedMult[] = { 0.5f, 0.8f };
323 static const float csSpeedMultNoMove[] = { 0.3f, 1.0f };
325 mPowerup != POWERUP_PENGUIN_SUIT &&
327 isNowBgCross(BGC_ON_ICE) &&
328 std::fabs(
mBc.mIceSpeed) > 1.0f
331 if (
mBc.mIceSpeed < 0.0f) {
334 if (mKey.buttonWalk(
nullptr)) {
337 mSpeedF *= csSpeedMultNoMove[idx];
340 float newSpeedF = std::fabs(
mSpeedF);
341 if (newSpeedF < 0.3f) {
343 }
else if (newSpeedF > 1.5f) {
355void daPlBase_c::calcAccOnIceLift() {
358 isNowBgCross(BGC_ON_ICE) &&
360 std::fabs(
mBc.mIceSpeed) > 1.0f
366void daPlBase_c::initializeState_Jump() {
374void daPlBase_c::finalizeState_Jump() {
377 mSndObj.stopPlyJumpSound();
390void daPlBase_c::executeState_Jump() {
395 if (!mKey.buttonJump() || isNowBgCross(
BGC_HEAD)) {
396 mSndObj.stopPlyJumpSound();
406bool daPlBase_c::setCrouchJump() {
407 if (mKey.triggerJump()) {
414void daPlBase_c::initializeState_SitJump() {}
415void daPlBase_c::finalizeState_SitJump() {}
416void daPlBase_c::executeState_SitJump() {}
418void daPlBase_c::setFallAction() {
425void daPlBase_c::initializeState_Fall() {
430 if (!stateArg<bool>()) {
431 mpMdlMng->setAnm(PLAYER_ANIM_JUMP2, 10.0f, 0.0f);
437 m_113c = std::fabs(m_1138 / 10.0f);
441void daPlBase_c::finalizeState_Fall() {
447void daPlBase_c::executeState_Fall() {
453void daPlBase_c::initializeState_Land() {}
454void daPlBase_c::finalizeState_Land() {}
455void daPlBase_c::executeState_Land() {}
457bool daPlBase_c::checkCrouch() {
461bool daPlBase_c::setCancelCrouch() {
462 if (checkStandUpRoofOnLift()) {
465 if (mpMdlMng->getAnm() != PLAYER_ANIM_STOOP_START) {
466 mpMdlMng->setAnm(PLAYER_ANIM_STOOP_START);
467 mpMdlMng->mpMdl->setFrame(mpMdlMng->getLastFrame());
470 mpMdlMng->mpMdl->setRate(-1.0f);
472 mpMdlMng->mpMdl->setRate(-dPyMdlBase_c::scWaterCrouchAnmSpeed);
479bool daPlBase_c::checkStandUpRoofOnLift() {
483 return checkStandUpRoof();
486bool daPlBase_c::checkStandUpRoof() {
487 const sBcPointData *headBgP = getHeadBgPointData();
488 if (headBgP ==
nullptr) {
491 float standHeadBgY = getStandHeadBgPointY();
492 float tmpCalc =
mPos.y + standHeadBgY - 1.0f;
494 mPos.x + headBgP->mInfMargin / 4096.0f,
499 if (dBc_c::checkTenjou(&p, &res,
mLayer, mAmiLayer) && res < tmpCalc) {
502 p.x =
mPos.x + headBgP->mSupMargin / 4096.0f;
503 if (dBc_c::checkTenjou(&p, &res,
mLayer, mAmiLayer) && res < tmpCalc) {
509void daPlBase_c::initializeState_Crouch() {}
510void daPlBase_c::finalizeState_Crouch() {}
511void daPlBase_c::executeState_Crouch() {}
513void daPlBase_c::initializeState_Slip() {
515 mpMdlMng->setAnm(PLAYER_ANIM_SLIP);
522void daPlBase_c::finalizeState_Slip() {
527void daPlBase_c::executeState_Slip() {
538 int angle = turnAngle();
539 if (isNowBgCross(BGC_AUTOSLIP)) {
541 }
else if (checkJumpTrigger()) {
543 }
else if (angle && mAutoSlipTimer == 0 && checkSlipEndKey()) {
548 case SLIP_ACTION_NONE:
549 if (!isNowBgCross(
BGC_FOOT) && (mKey.triggerJump() || mKey.triggerCross())) {
552 slipActionMove(angle);
555 case SLIP_ACTION_STOOP:
557 if (mpMdlMng->mpMdl->mAnm.isStop()) {
561 case SLIP_ACTION_END:
562 if (mpMdlMng->mpMdl->mAnm.isStop()) {
570void daPlBase_c::setSlipAction_ToStoop() {
571 if (checkStandUpRoofOnLift()) {
579 mpMdlMng->setAnm(PLAYER_ANIM_SLIP_TO_STOOP);
582void daPlBase_c::setSlipAction_ToEnd() {
583 if (checkStandUpRoofOnLift()) {
593 mpMdlMng->setAnm(PLAYER_ANIM_SLIPED);
596void daPlBase_c::setSlipActionEnd() {
598 if (!mKey.buttonCrouch()) {
599 setSlipAction_ToEnd();
603void daPlBase_c::setSlipActionViewLimitEnd() {
605 if (!mKey.buttonCrouch()) {
606 setSlipAction_ToEnd();
607 }
else if (dScStage_c::m_instance->mCurrWorld == WORLD_1 && dScStage_c::m_instance->mCurrCourse == STAGE_6 && dScStage_c::m_instance->mCurrFile == 1) {
609 setSlipAction_ToEnd();
614void daPlBase_c::slipActionMove(
int param) {
617 if (mPowerup != POWERUP_PENGUIN_SUIT) {
620 setCcAtPenguinSlip();
623 if (isOldBgCross(
BGC_FOOT) && mPrevMoveSakaAngle > 0 && mStillSakaAngle * mPrevStillSakaAngle <= 0) {
626 float cos = mAng(mPrevMoveSakaAngle).cos();
629 mSpeed.y = std::fabs(baseSpeed) * mAng(mPrevMoveSakaAngle).sin();
632 if (
mSpeedF <= 0.0f && isNowBgCross(BGC_SIDE_LIMIT_L)) {
633 setSlipActionViewLimitEnd();
634 }
else if (checkSakaReverse()) {
636 }
else if (isNowBgCross(BGC_SLOPE)) {
644 if (std::fabs(
mSpeedF) < 1.0f &&
645 ((
mCc.getXOffset(0) < 0.0f &&
mSpeedF >= 0.0f) ||
646 (
mCc.getXOffset(0) > 0.0f &&
mSpeedF <= 0.0f)))
657 if (mSlipEndTimer == 0 && std::fabs(
mSpeedF) < 1.1f) {
658 if (!mKey.buttonCrouch()) {
659 setSlipAction_ToEnd();
661 setSlipAction_ToStoop();
675void daPlBase_c::changeActionSlipEnd(AnmBlend_e param) {
695bool daPlBase_c::checkTurn() {
696 if (!isCarry() && !
isStatus(STATUS_74) && std::fabs(
mSpeedF) >= 2.5f) {
697 if (isNowBgCross(BGC_ON_ICE)) {
713void daPlBase_c::setTurnEnd() {
718void daPlBase_c::initializeState_Turn() {}
719void daPlBase_c::finalizeState_Turn() {}
720void daPlBase_c::executeState_Turn() {}
722bool daPlBase_c::setHipAttackOnEnemy(
mVec3_c *) {
726void daPlBase_c::setVsPlHipAttackEffect() {
727 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_misshit", 0, &
mPos,
nullptr,
nullptr);
730void daPlBase_c::setHipAttackEffect() {
734 if (!isOnSinkSand()) {
735 setLandSmokeEffect(getTallType(-1));
737 if (mGroundType == GROUND_TYPE_WATER) {
740 if (mPowerup == POWERUP_MINI_MUSHROOM) {
746 !(GROUND_TYPE_DEFAULT <= mGroundType && mGroundType <= GROUND_TYPE_CLOUD) &&
747 !(GROUND_TYPE_MANTA <= mGroundType && mGroundType <= GROUND_TYPE_CARPET)
749 switch (mGroundType) {
750 case GROUND_TYPE_FUNSUI:
751 case GROUND_TYPE_LEAF:
755 case GROUND_TYPE_WOOD:
762void daPlBase_c::setHipAttackDropEffect() {
763 static const float sc_dropEffectScale[] = { 0.7f, 0.8f, 1.0f };
765 mpMdlMng->mpMdl->getJointPos(&pos, 1);
766 float scale = sc_dropEffectScale[getTallType(-1)];
767 mVec3_c scaleVec(scale, scale, scale);
771void daPlBase_c::setHipBlockBreak() {
772 if (mPowerup == POWERUP_MINI_MUSHROOM || mPowerup == POWERUP_NONE) {
779void daPlBase_c::setHipAttack_Ready() {
781 mpMdlMng->setAnm(PLAYER_ANIM_HIPSR);
785void daPlBase_c::setHipAttack_KinopioStart() {
786 setHipAttack_AttackStart();
789 if (isItemKinopio()) {
794void daPlBase_c::setHipAttack_AttackStart() {
796 mpMdlMng->setAnm(PLAYER_ANIM_HIPAT);
801void daPlBase_c::setHipAttack_AttackFall() {
817void daPlBase_c::setHipAttack_StandNormal() {
820 mpMdlMng->setAnm(PLAYER_ANIM_HIPED);
829void daPlBase_c::setHipAttack_StandNormalEnd() {
831 mpMdlMng->setAnm(PLAYER_ANIM_SLIPED);
835void daPlBase_c::setHipAttack_ToStoop() {
837 mpMdlMng->setAnm(PLAYER_ANIM_HIP_TO_STOOP);
841void daPlBase_c::HipAction_Ready() {
842 if (mpMdlMng->mpMdl->mAnm.isStop()) {
843 setHipAttack_AttackStart();
847void daPlBase_c::HipAction_AttackStart() {
849 setHipAttack_AttackFall();
853void daPlBase_c::HipAction_AttackFall() {
854 setHipAttackDropEffect();
867 if (mKey.buttonWalk(&dir)) {
870 if (mKey.buttonDown() &&
mSpeed.y < 0.0f) {
877 if (!mKey.buttonDown()) {
880 setHipAttackEffect();
882 if (mPowerup == POWERUP_MINI_MUSHROOM) {
885 daPyMng_c::setHipAttackQuake(quakeType,
mPlayerNo);
888 if (isNowBgCross(BGC_CLIFF)) {
890 }
else if (isSlipSaka()) {
892 if (
mBc.getSakaType() >= 2) {
895 mSpeedF = getSlipMaxSpeedF() * 0.5f;
909void daPlBase_c::HipAction_Ground() {
910 if (!mKey.buttonDown() && !isNowBgCross(
BGC_FOOT)) {
913 setHipAttack_StandNormal();
917void daPlBase_c::HipAction_StandNormal() {
918 if (mpMdlMng->getAnm() != PLAYER_ANIM_HIPED) {
919 mpMdlMng->setAnm(PLAYER_ANIM_HIPED);
922 if (mpMdlMng->isAnmStop()) {
923 if (!mKey.buttonDown()) {
925 setHipAttack_StandNormalEnd();
929 if (isNowBgCross(BGC_COIN_BLOCK_HIT)) {
932 if (dScStage_c::m_isStaffCredit && isNowBgCross(
BGC_FOOT) && !isNowBgCross(
BGC_LIFT)) {
938 setHipAttack_ToStoop();
941 }
else if (isSlipSaka()) {
948 if (mKey.buttonCrouch()) {
949 setHipAttack_AttackFall();
954void daPlBase_c::HipAction_StandNormalEnd() {
955 if (!checkCrouch()) {
956 if (mpMdlMng->mpMdl->mAnm.isStop()) {
964void daPlBase_c::HipAction_ToStoop() {
965 if (mpMdlMng->mpMdl->mAnm.isStop()) {
972void daPlBase_c::initializeState_HipAttack() {
977 switch (stateArg<HipAttackArg_e>()) {
979 setHipAttack_Ready();
982 setHipAttack_KinopioStart();
990void daPlBase_c::finalizeState_HipAttack() {
1006void daPlBase_c::executeState_HipAttack() {
1007 static ProcFunc l_HipActionProc[] = {
1008 &daPlBase_c::HipAction_Ready,
1009 &daPlBase_c::HipAction_AttackStart,
1010 &daPlBase_c::HipAction_AttackFall,
1011 &daPlBase_c::HipAction_Ground,
1012 &daPlBase_c::HipAction_StandNormal,
1013 &daPlBase_c::HipAction_StandNormalEnd,
1014 &daPlBase_c::HipAction_ToStoop
1024 if (
mSubstate < HIP_ACTION_STAND_NORMAL || !checkJumpTrigger()) {
1028 mPos.x = mPressAttachPos.x;
1029 mPos.y = mPressAttachPos.y;
1034void daPlBase_c::initializeState_Swim() {}
1035void daPlBase_c::finalizeState_Swim() {}
1036void daPlBase_c::executeState_Swim() {}
1038bool daPlBase_c::setJumpDaiRide() {
1046void daPlBase_c::initializeState_JumpDai() {
1053 if (mpMdlMng->getAnm() == PLAYER_ANIM_STOOP) {
1056 mpMdlMng->setAnm(PLAYER_ANIM_JUMPED);
1060void daPlBase_c::finalizeState_JumpDai() {
1066void daPlBase_c::executeState_JumpDai() {
1073 if (mpMdlMng->mpMdl->mAnm.isStop()) {
1084bool daPlBase_c::setPlayerJumpDai(
daPlBase_c *other) {
1085 if (mRideActorID == 0) {
1086 float topPos = other->getHeadTopPosP()->y - 4.0f;
1087 mVec3_c pos = mVec3_c(
1093 if (
mBc.checkRoofPlayer(&pos, &f) && f < topPos + getModelHeight()) {
1103void daPlBase_c::setPlayerJumoDaiPos() {
1105 if (rideActor ==
nullptr) {
1110 rideActor->getHeadTopPosP()->y - 4.0f,
1115void daPlBase_c::initializeState_PlayerJumpDai() {
1119 if (rideActor !=
nullptr) {
1120 rideActor->initStampReduction();
1121 setNoHitPlayer(rideActor, 5);
1127 if (mpMdlMng->getAnm() != PLAYER_ANIM_STOOP) {
1128 mpMdlMng->setAnm(PLAYER_ANIM_JUMPED);
1130 if (mKey.triggerJumpBuf(5)) {
1138void daPlBase_c::finalizeState_PlayerJumpDai() {
1144void daPlBase_c::executeState_PlayerJumpDai() {
1146 if (rideActor ==
nullptr) {
1148 }
else if (isNowBgCross(
BGC_HEAD)) {
1152 setNoHitPlayer(rideActor, 5);
1154 if (mpMdlMng->mpMdl->mCurrAnmID == PLAYER_ANIM_JUMPED && mpMdlMng->mpMdl->mAnm.isStop()) {
1160 if (mKey.triggerJump()) {
1163 }
else if (isMameAction()) {
1166 }
else if (mKey.buttonJump()) {
1176 float jumpSpeed = daPlBase_c::sc_JumpSpeed + 0.8f;
1177 if (isMameAction()) {
1178 jumpSpeed = daPlBase_c::sc_JumpSpeed + 0.2f;
1180 setJump(jumpSpeed, 0.0f,
true, 1, 2);
1190bool daPlBase_c::setFunsui() {
1200bool daPlBase_c::updateFunsuiPos(
float x,
float y) {
1209bool daPlBase_c::releaseFunsui(
float f) {
1219void daPlBase_c::releaseFunsuiAction() {
1223void daPlBase_c::initializeState_Funsui() {
1229 mpMdlMng->setAnm(PLAYER_ANIM_BLOW_UP);
1232 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_7, 0,
false);
1237void daPlBase_c::finalizeState_Funsui() {
1242void daPlBase_c::executeState_Funsui() {
1247 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_8, 0,
false);
1255 releaseFunsuiAction();
1260 if (mKey.buttonWalk(&dir)) {
1265 if (std::fabs(
mSpeedF) > 0.35f) {
1272void daPlBase_c::initializeState_Kani() {}
1273void daPlBase_c::finalizeState_Kani() {}
1274void daPlBase_c::executeState_Kani() {}
1276bool daPlBase_c::setCloudOn(
dActor_c *cloudActor) {
1280 if (cloudActor->
mPos.y + getCloudOffsetY() >=
mPos.y &&
mSpeed.y < 0.0f && mRideActorID == 0) {
1288void daPlBase_c::cancelCloudOn() {
1292float daPlBase_c::getCloudOffsetY() {
1296mVec3_c daPlBase_c::getCloudPos() {
1299 mPos.y - getCloudOffsetY(),
1304void daPlBase_c::initializeState_Cloud() {
1311 mpMdlMng->setAnm(PLAYER_ANIM_JUMPED);
1315void daPlBase_c::finalizeState_Cloud() {
1323bool daPlBase_c::updateCloudMove() {
1325 if (rideActor ==
nullptr) {
1329 if (mKey.triggerJump()) {
1335 mPos.y += getCloudOffsetY();
1344void daPlBase_c::executeState_Cloud() {}
1346void daPlBase_c::initializeState_AnimePlay() {
1347 mDemoAnime = stateArg<AnimePlayArg_e>();
1348 if (mDemoAnime != DEMO_ANIME_NORMAL) {
1353void daPlBase_c::finalizeState_AnimePlay() {
1358void daPlBase_c::executeState_AnimePlay() {
1359 static const ProcFunc scDemoAnmFunc[] = {
1360 &daPlBase_c::DemoAnmNormal,
1361 &daPlBase_c::DemoAnmBossSetUp,
1362 &daPlBase_c::DemoAnmBossGlad,
1363 &daPlBase_c::DemoAnmBossAttention,
1364 &daPlBase_c::DemoAnmBossKeyGet,
1365 &daPlBase_c::DemoAnmBossGlad
1373 (this->*scDemoAnmFunc[mDemoAnime])();
1377void daPlBase_c::DemoAnmNormal() {
1379 addCalcAngleY(0, 10);
1383 if (mpMdlMng->mpMdl->mAnm.isStop()) {
1384 setControlDemoWait();
1388void daPlBase_c::DemoAnmBossSetUp() {
1390 mpMdlMng->setAnm(PLAYER_ANIM_WAIT_L3);
1396void daPlBase_c::DemoAnmBossGlad() {
1397 addCalcAngleY(0, 10);
1410 ClearType_e clearType = CLEAR_TYPE_BOSS;
1411 if (mDemoAnime == DEMO_ANIME_BOSS_GLAD_2) {
1412 clearType = CLEAR_TYPE_FINAL_BOSS;
1414 if (!updateDemoKimePose(clearType)) {
1417 mpMdlMng->setAnm(PLAYER_ANIM_WAIT, 5.0f, 0.0f);
1427void daPlBase_c::DemoAnmBossAttention() {
1428 daPlBase_c *boss = (daPlBase_c *) dAttention_c::mspInstance->search(mpMdlMng->mpMdl->mHatPosMaybe);
1429 if (boss !=
nullptr) {
1439 case HIP_ACTION_READY:
1441 mpMdlMng->setAnm(PLAYER_ANIM_WAIT_L_DUPLICATE);
1443 mpMdlMng->setAnm(PLAYER_ANIM_WAIT_R_DUPLICATE);
1447 case HIP_ACTION_ATTACK_START:
1456void daPlBase_c::DemoAnmBossKeyGet() {
1457 addCalcAngleY(0, 10);
1465 mpMdlMng->setAnm(PLAYER_ANIM_BOSS_KEY_GET);
1466 startKimePoseVoice(CLEAR_TYPE_BOSS);
1476void daPlBase_c::initializeState_WaitJump() {
1477 startQuakeShock(dQuake_c::TYPE_5);
1482 mpMdlMng->setAnm(PLAYER_ANIM_WAIT);
1486void daPlBase_c::finalizeState_WaitJump() {
1491void daPlBase_c::executeState_WaitJump() {
1501bool daPlBase_c::checkSakaReverse() {
1502 if (std::fabs(
mSpeedF) < 0.5f &&
mBc.mPlayerFlags & 4) {
1508bool daPlBase_c::isSaka() {
1509 if (isNowBgCross(BGC_SLOPE) ? 1 : 0) {
1515bool daPlBase_c::isSlipSaka() {
1516 if (isSaka() &&
mBc.getFootAttr() != 10) {
1522void daPlBase_c::setSlipAction() {
1527bool daPlBase_c::checkSlip() {
1529 (
mSpeedF > 0.0f || !isNowBgCross(BGC_SIDE_LIMIT_L)) &&
1530 isNowBgCross(BGC_AUTOSLIP)
1538bool daPlBase_c::checkCrouchSlip() {
1543 (
mSpeedF > 0.0f || !isNowBgCross(BGC_SIDE_LIMIT_L)) &&
1544 (isNowBgCross(BGC_AUTOSLIP) || isSlipSaka())
1552bool daPlBase_c::checkSlipEndKey() {
1554 if (!mKey.buttonDown()) {
1555 if (
mBc.getSakaType() == 0) {
1556 if (mKey.buttonCross()) {
1559 }
else if (
mBc.getSakaType() != 4) {
1561 mKey.buttonLeft() &&
mBc.getSakaDir() == 0 ||
1562 mKey.buttonRight() &&
mBc.getSakaDir() == 1
1568 if (mKey.buttonUp()) {
1575float daPlBase_c::getSlipMaxSpeedF() {
1577 return sc_DirSpeed[
mBc.getSakaDir()] * 4.0f;
1582float daPlBase_c::getSakaMaxSpeedRatio(u8 direction) {
1583 return l_sakaMaxSpeedRatio[
mBc.getSakaType()][
mBc.getSakaUpDown(direction)];
1586float daPlBase_c::getSakaStopAccele(u8 direction) {
1587 return l_sakaStopAccele[
mBc.getSakaType()][
mBc.getSakaUpDown(direction)];
1590float daPlBase_c::getSakaMoveAccele(u8 direction) {
1591 return l_sakaMoveAccele[
mBc.getSakaType()][
mBc.getSakaUpDown(direction)];
1594float daPlBase_c::getIceSakaSlipOffSpeed() {
1595 return l_sakaSlipOffSpeed[
mBc.getSakaType()][
mBc.getSakaDir()];
1598bool daPlBase_c::setSandMoveSpeed() {
1599 if (isOnSinkSand()) {
1601 if (mKey.buttonWalk(&dir)) {
1622void daPlBase_c::moveSpeedSet() {
1623 if (!setSandMoveSpeed() && !
isStatus(STATUS_96)) {
1625 if (mKey.buttonWalk(&dir)) {
1627 float absSpeed = std::fabs(
mSpeedF);
1628 float speed1 = sc_DirSpeed[dir] * getSpeedData()->mLowSpeed;
1629 float speed2 = sc_DirSpeed[dir] * getSpeedData()->mHighSpeed;
1630 float tmp = sc_DirSpeed[dir] * absSpeed;
1631 if (absSpeed >= std::fabs(speed2) || mKey.buttonDush()) {
1633 }
else if (absSpeed > std::fabs(speed1)) {
1640 if (mKey.buttonDush()) {
1641 speed = sc_DirSpeed[dir] * getSpeedData()->mHighSpeed;
1643 speed = sc_DirSpeed[dir] * getSpeedData()->mLowSpeed;
1645 mMaxSpeedF = speed * getSakaMaxSpeedRatio(dir);
1649 if (checkSakaReverse()) {
1651 }
else if (getPowerChangeType(
false) == POWER_CHANGE_ICE) {
1657 mSpeedF = -getSpeedData()->mHighSpeed;
1659 mSpeedF = getSpeedData()->mHighSpeed;
1665void daPlBase_c::simpleMoveSpeedSet() {
1666 if (!setSandMoveSpeed()) {
1668 if (mKey.buttonWalk(&dir)) {
1669 if (mKey.buttonDush()) {
1670 mMaxSpeedF = sc_DirSpeed[dir] * getSpeedData()->mHighSpeed;
1672 mMaxSpeedF = sc_DirSpeed[dir] * getSpeedData()->mLowSpeed;
1680void daPlBase_c::grandPowerSet() {
1681 if (isOnSinkSand()) {
1682 mAccelF = getSpeedData()->mPowerChangeNormal.mVerySlowAccel;
1692 static const float sc_data[] = { 1.1f, 0.9f, 1.0f };
1698 mAccelF = getSakaMoveAccele(dir);
1700 if (mKey.buttonWalk(&dir2)) {
1704 if (!mKey.buttonWalk(&dir)) {
1705 mAccelF = getSakaStopAccele(dir);
1710 mAccelF = getSpeedData()->mPowerChangeNormal.mTurnAccel;
1717 icePowerChange(mode);
1732void daPlBase_c::normalPowerSet() {
1733 if (std::fabs(
mSpeedF) > getSpeedData()->mHighSpeed) {
1738 sPowerChangeSpeedData data;
1740 if (!mKey.buttonWalk(
nullptr)) {
1742 mAccelF = data.mTurnNoInputAccel;
1743 }
else if (std::fabs(
mSpeedF) < getSpeedData()->mLowSpeed) {
1748 if (powerChangeType == POWER_CHANGE_ICE && std::fabs(
mSpeedF) < 0.5f) {
1765 float absSpeed = std::fabs(
mSpeedF);
1767 if (absSpeed < 0.5f) {
1768 mAccelF = data.mVerySlowAccel;
1769 }
else if (absSpeed < getSpeedData()->mLowSpeed) {
1770 if (mKey.buttonDush()) {
1775 }
else if (absSpeed < getSpeedData()->mMediumSpeed) {
1776 if (absMaxSpeed < getSpeedData()->mMediumSpeed) {
1782 if (absMaxSpeed < getSpeedData()->mMediumSpeed) {
1792 return POWER_CHANGE_NORMAL;
1794 if (isNowBgCross(BGC_ON_ICE)) {
1795 return POWER_CHANGE_ICE;
1797 if (isNowBgCross(BGC_ON_ICE_LOW_SLIP)) {
1798 return POWER_CHANGE_LOW_SLIP;
1800 if (isNowBgCross(BGC_ON_SNOW) ? 1 : 0) {
1801 return POWER_CHANGE_LOW_SLIP;
1803 return POWER_CHANGE_NORMAL;
1807 switch (getPowerChangeType(
false)) {
1808 case POWER_CHANGE_NORMAL:
1809 data = getSpeedData()->mPowerChangeNormal;
1811 case POWER_CHANGE_ICE:
1812 data = getSpeedData()->mPowerChangeIce;
1814 case POWER_CHANGE_LOW_SLIP:
1815 data = getSpeedData()->mPowerChangeLowSlip;
1822 int idx = isStar() ? 1 : 0;
1823 switch (getPowerChangeType(
false)) {
1824 case POWER_CHANGE_NORMAL:
1825 bb = data.mTurnPowerNormal[idx];
1827 case POWER_CHANGE_ICE:
1828 bb = data.mTurnPowerIce[idx];
1830 case POWER_CHANGE_LOW_SLIP:
1831 bb = data.mTurnPowerLowSlip[idx];
1836void daPlBase_c::icePowerChange(
int mode) {
1838 if (powerChangeType == POWER_CHANGE_ICE || (powerChangeType == POWER_CHANGE_LOW_SLIP && mode == 1)) {
1842 }
else if (mode == 0) {
1845 }
else if (std::fabs(
mSpeedF) < 0.5f) {
1849 }
else if (!isSaka() && std::fabs(
mSpeedF) < 0.5f) {
1857void daPlBase_c::airPowerSet() {
1858 const sPowerChangeData *data = &daPlayerData_c::smc_POWER_CHANGE_DATA;
1859 u8 idx = isStar() ? 1 : 0;
1860 const sAirTurnPowerData &airPowerData = data->mAirPower[idx];
1862 if (mKey.buttonWalk(&dir)) {
1863 if (
mSpeedF * sc_DirSpeed[dir] < 0.0f) {
1864 mAccelF = airPowerData.mTurnAround;
1866 }
else if (std::fabs(
mSpeedF) < 0.5f) {
1867 mAccelF = airPowerData.mStand;
1871 float absSpeed = std::fabs(
mSpeedF);
1873 if (absSpeed < getSpeedData()->mLowSpeed) {
1874 if (mKey.buttonDush()) {
1875 mAccelF = airPowerData.mSlowDash;
1877 mAccelF = airPowerData.mSlowNoDash;
1879 }
else if (absSpeed < getSpeedData()->mMediumSpeed) {
1880 mAccelF = airPowerData.mMedium;
1885 mAccelF = airPowerData.mNoButton;
1889void daPlBase_c::powerSet() {
1897void daPlBase_c::maxFallSpeedSet() {
1901void daPlBase_c::gravitySet() {
1912void daPlBase_c::setJumpGravity() {
1913 if (mNoGravityTimer != 0) {
1915 }
else if (mKey.buttonJump()) {
1916 setButtonJumpGravity();
1918 setNormalJumpGravity();
1922void daPlBase_c::setButtonJumpGravity() {
1923 mAccelY = *(getGravityData() + 17);
1924 for (
int i = 0; i < 5; i++) {
1925 if (
mSpeed.y > *(getGravityData() + i + 1)) {
1926 mAccelY = *(getGravityData() + i + 12);
1932void daPlBase_c::setNormalJumpGravity() {
1936 mAccelY = *(getGravityData() + 11);
1937 for (
int i = 0; i < 5; i++) {
1938 if (
mSpeed.y > *(getGravityData() + i + 1)) {
1939 mAccelY = *(getGravityData() + i + 6);
1945float fn_8004c700(
float v) {
1954 v = (v - 0.1f) / 0.9f;
1962 v = (v - 0.1f) / (tmp - 0.1f);
1964 if (isNeg ==
true) {
1976void daPlBase_c::calcWindSpeed() {
1978 if (windActor ==
nullptr) {
1982 if (
isStatus(STATUS_A0) && !isOnSinkSand()) {
1983 float windSpeed = fn_8004c700(windActor->m_00);
1984 float halfWindSpeed = windSpeed * 0.5f;
1985 windSpeed = std::fabs(windSpeed) * 3.0f;
1987 mWindSpeed > 0.0f && isNowBgCross(BGC_WALL_TOUCH_R_2) ||
1988 mWindSpeed < 0.0f && isNowBgCross(BGC_WALL_TOUCH_L_2)
2000 windSpeed = 0.45f * windSpeed;
2002 windSpeed = 0.55f * windSpeed;
2004 mWindGroundTimer = 3;
2005 mWindSpeed += halfWindSpeed;
2010 if (mWindGroundTimer != 0) {
2012 }
else if (
mSpeedF * mWindSpeed < 0.0f) {
2015 mWindSpeed += halfWindSpeed;
2018 if (mWindSpeed > windSpeed) {
2019 mWindSpeed = windSpeed;
2020 }
else if (mWindSpeed < -windSpeed) {
2021 mWindSpeed = -windSpeed;
2029void daPlBase_c::setLandSE() {
2030 if (mPowerup == POWERUP_PENGUIN_SUIT) {
2031 startFootSoundPlayer(SE_PLY_LAND_PNGN);
2034 static const dAudio::SoundEffectID_t scLandSeID[] = {
2042 SE_PLY_LAND_BLOWSAND,
2049 startFootSoundPlayer(scLandSeID[mGroundType]);
2052void daPlBase_c::setSlipSE() {
2053 if (mGroundType == GROUND_TYPE_WATER) {
2057 static const dAudio::SoundEffectID_t scSlipSeID[] = {
2072 holdSound(scSlipSeID[mGroundType],
false);
2075void daPlBase_c::setLandSmokeEffect(
int param1) {
2076 static const char *sc_landSmokeEffectID[][3] = {
2077 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2078 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2079 {
"Wm_mr_sndlandsmk_ss",
"Wm_mr_sndlandsmk_s",
"Wm_mr_sndlandsmk" },
2080 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2081 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2082 {
"Wm_mr_watersplash",
"Wm_mr_watersplash",
"Wm_mr_watersplash" },
2083 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2084 {
"Wm_mr_sndlandsmk_ss",
"Wm_mr_sndlandsmk_s",
"Wm_mr_sndlandsmk" },
2085 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2086 {
"Wm_mr_beachlandsmk_ss",
"Wm_mr_beachlandsmk_s",
"Wm_mr_beachlandsmk" },
2087 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2088 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" },
2089 {
"Wm_mr_landsmoke_ss",
"Wm_mr_landsmoke_s",
"Wm_mr_landsmoke" }
2091 if (mGroundType == GROUND_TYPE_FUNSUI) {
2092 setSandFunsuiLandEffect();
2093 }
else if (mGroundType == GROUND_TYPE_WATER) {
2096 if (powerup == POWERUP_MINI_MUSHROOM) {
2098 }
else if (powerup == POWERUP_NONE) {
2101 mVec3_c size(sz, sz, sz);
2102 dEf::createPlayerEffect(
mPlayerNo, sc_landSmokeEffectID[mGroundType][param1], 0, &
mPos,
nullptr, &size);
2104 dEf::createPlayerEffect_change(
mPlayerNo, sc_landSmokeEffectID[mGroundType][param1], 0, &
mPos,
nullptr,
nullptr);
2108void daPlBase_c::setLandSmokeEffectLight() {
2110 if (dMaskMng::isCaveMask() &&
mLayer == 0) {
2111 if (mAmiLayer == 1) {
2115 float sz = dPyMdlMng_c::m_hio.m_08[mpMdlMng->mpMdl->m_152];
2116 mVec3_c size(sz, sz, sz);
2117 if (isNowBgCross(BGC_ON_SAND)) {
2118 if (mGroundType == GROUND_TYPE_FUNSUI) {
2119 setSandFunsuiLandEffect();
2120 }
else if (!isOnSinkSand()) {
2121 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_cmnsndlandsmk", 0, &pos,
nullptr, &size);
2124 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_cmnlandsmoke", 0, &pos,
nullptr, &size);
2128bool daPlBase_c::setSandFunsuiLandEffect() {
2129 if (mGroundType == GROUND_TYPE_FUNSUI) {
2130 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_spsmoke", 0, &
mPos,
nullptr,
nullptr);
2136void daPlBase_c::setStartJumpEffect(
int param1) {
2138 if (isOnSinkSand()) {
2139 setSandJumpEffect();
2141 }
else if (!setSandFunsuiLandEffect() && param1 == 1) {
2142 setLandSmokeEffectLight();
2147void daPlBase_c::setLandJumpEffect(
int param1) {
2149 if (!setSandFunsuiLandEffect() && param1 == 1) {
2150 setLandSmokeEffectLight();
2155 static const float sc_runFootScale[] = { 0.5f, 0.8f, 1.0f };
2156 float sz = sc_runFootScale[getTallType(-1)];
2157 mVec3_c size(sz, sz, sz);
2160 mPos.y + sz * 10.0f,
2163 dEf::createPlayerEffect(
mPlayerNo, effect,
"Wm_mr_foot_water", 0, &pos,
nullptr, &size);
2166void daPlBase_c::setSlipSmokeEffect() {
2167 static const char *sc_slipSmokeEffectID[][2] = {
2168 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2169 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2170 {
"Wm_mr_sndslipsmk_ss",
"Wm_mr_sndslipsmk" },
2171 {
"Wm_mr_iceslipsmk_ss",
"Wm_mr_iceslipsmk" },
2172 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2173 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2174 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2175 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2176 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2177 {
"Wm_mr_beachslipsmk_ss",
"Wm_mr_beachslipsmk" },
2178 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2179 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" },
2180 {
"Wm_mr_slipsmoke_ss",
"Wm_mr_slipsmoke" }
2183 if (mGroundType == GROUND_TYPE_WATER) {
2188 mpMdlMng->mpMdl->getJointPos(&pos, 1);
2190 if (mPowerup != POWERUP_MINI_MUSHROOM) {
2193 dEf::createPlayerEffect_change(
mPlayerNo, &
mSlipSmokeEffect, sc_slipSmokeEffectID[mGroundType][idx], 0, &pos,
nullptr,
nullptr);
2196void daPlBase_c::setBrakeSmokeEffect(
mVec3_c &offset) {
2197 static const char *sc_brakeSmokeEffectID[][2] = {
2198 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2199 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2200 {
"Wm_mr_sndbrakesmk_ss",
"Wm_mr_sndbrakesmk" },
2201 {
"Wm_mr_icebrakesmk_ss",
"Wm_mr_icebrakesmk" },
2202 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2203 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2204 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2205 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2206 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2207 {
"Wm_mr_beachbrakesmk_ss",
"Wm_mr_beachbrakesmk" },
2208 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2209 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" },
2210 {
"Wm_mr_brakesmoke_ss",
"Wm_mr_brakesmoke" }
2213 if (mGroundType == GROUND_TYPE_WATER) {
2218 if (mPowerup != POWERUP_MINI_MUSHROOM) {
2221 dEf::createPlayerEffect_change(
mPlayerNo, &
mBrakeSmokeEffect, sc_brakeSmokeEffectID[mGroundType][idx], 0, &offset,
nullptr,
nullptr);
2224void daPlBase_c::setTurnSmokeEffect() {
2226 static const dAudio::SoundEffectID_t scTurnSeID[] = {
2243 static const char *sc_turnSmokeEffectID[][2] = {
2244 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" },
2245 {
"Wm_mr_turn_snow_r",
"Wm_mr_turn_snow_l" },
2246 {
"Wm_mr_turn_sand_r",
"Wm_mr_turn_sand_l" },
2247 {
"Wm_mr_turn_ice_r",
"Wm_mr_turn_ice_l" },
2248 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" },
2249 {
"Wm_mr_turn_water_r",
"Wm_mr_turn_water_l" },
2250 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" },
2251 {
"Wm_mr_turn_sand_r",
"Wm_mr_turn_sand_l" },
2252 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" },
2253 {
"Wm_mr_turn_beach_r",
"Wm_mr_turn_beach_l" },
2254 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" },
2255 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" },
2256 {
"Wm_mr_turn_usual_r",
"Wm_mr_turn_usual_l" }
2258 static const float sc_turnSmokeScale[] = { 0.5f, 0.8f, 1.0f };
2260 mpMdlMng->mpMdl->getJointPos(&pos, 1);
2261 if (mGroundType == GROUND_TYPE_WATER) {
2262 if (
mPos.y < mWaterHeight - 4.0f) {
2263 fadeOutTurnEffect();
2266 pos.y = mWaterHeight;
2268 float sz = sc_turnSmokeScale[getTallType(-1)];
2269 mVec3_c size(sz, sz, sz);
2270 if (mTurnEffectFade == 1 && mTurnGroundType == mGroundType) {
2274 mTurnGroundType = mGroundType;
2275 mTurnEffectFade = 1;
2279void daPlBase_c::fadeOutTurnEffect() {
2280 if (mTurnEffectFade != 1) {
2284 mTurnEffectFade = 0;
2287void daPlBase_c::setRunFootEffect() {
2288 static const char *sc_runFootEffectID[] = {
2303 if (!isOnSinkSand() &&
isStatus(STATUS_62)) {
2305 GROUND_TYPE_SNOW <= mGroundType && mGroundType <= GROUND_TYPE_ICE ||
2306 mGroundType == GROUND_TYPE_WATER ||
2307 mGroundType == GROUND_TYPE_FUNSUI ||
2308 mGroundType == GROUND_TYPE_BEACH
2311 mpMdlMng->mpMdl->getJointPos(&pos, 1);
2312 static const float sc_runFootScale[] = { 0.5f, 0.8f, 1.0f };
2313 float sz = sc_runFootScale[getTallType(-1)];
2314 mVec3_c size(sz, sz, sz);
2315 dEf::createPlayerEffect(
mPlayerNo, &
mRunEffect, sc_runFootEffectID[mGroundType], 0, &pos,
nullptr, &size);
2320void daPlBase_c::setSandEffect() {
2326 mpMdlMng->mpMdl->getJointPos(&pos, 8);
2329 if (isNowBgCross(BGC_IN_SINK_SAND)) {
2333 if (isOnSinkSand() && !wasOnSinkSand()) {
2334 if (
mPos.y > mSinkSandHeight - 8.0f && mPrevSpeedY < 0.0f) {
2336 if ((mPrevSpeedY < -4.0f || mAirTopHeight > mSinkSandHeight + 58.0f) && mPowerup != POWERUP_MINI_MUSHROOM) {
2338 idx = (mPowerup == POWERUP_NONE) ? 1 : 0;
2345 static const char *scSandDiveEffectID[] = {
2350 dEf::createPlayerEffect(
mPlayerNo, scSandDiveEffectID[idx], 0, &pos,
nullptr,
nullptr);
2355bool daPlBase_c::setSandJumpEffect() {
2356 if (isOnSinkSand() &&
mPos.y + getModelHeight() + 16.0f > mSinkSandHeight) {
2358 pos.y = mSinkSandHeight;
2359 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_sanddive_s", 0, &pos,
nullptr,
nullptr);
2365void daPlBase_c::setSoundPlyMode() {
2366 static const int scPlayerSound[] = {
2369 mSndObj.m_04 = scPlayerSound[mPowerup];
2372void daPlBase_c::setFootSound() {
2374 (isDemo() || isNowBgCross(
BGC_FOOT)) &&
2375 dScStage_c::m_gameMode != dInfo_c::GAME_MODE_TITLE &&
2376 mpMdlMng->mpMdl->isFootStepTiming()
2378 if (mPowerup == POWERUP_PENGUIN_SUIT) {
2379 startFootSoundPlayer(SE_PLY_FOOTNOTE_PNGN);
2382 static const dAudio::SoundEffectID_t scFootSeID[] = {
2383 SE_PLY_FOOTNOTE_ROCK,
2384 SE_PLY_FOOTNOTE_SNOW,
2385 SE_PLY_FOOTNOTE_SAND,
2386 SE_PLY_FOOTNOTE_ROCK,
2387 SE_PLY_FOOTNOTE_DIRT,
2388 SE_PLY_FOOTNOTE_WATER,
2389 SE_PLY_FOOTNOTE_CLOUD,
2390 SE_PLY_FOOTNOTE_BLOWSAND,
2391 SE_PLY_FOOTNOTE_MANTA,
2392 SE_PLY_FOOTNOTE_SAND,
2393 SE_PLY_FOOTNOTE_CARPET,
2394 SE_PLY_FOOTNOTE_LEAF,
2395 SE_PLY_FOOTNOTE_WOOD
2397 startFootSoundPlayer(scFootSeID[mGroundType]);
2421void daPlBase_c::initialDokanUnder() {
2424void daPlBase_c::initialDokanUper() {
2427void daPlBase_c::initialDokanRight() {
2430void daPlBase_c::initialDokanLeft() {
2434void daPlBase_c::initialDokanUnderM() {
2437void daPlBase_c::initialDokanUperM() {
2440void daPlBase_c::initialDokanRightM() {
2443void daPlBase_c::initialDokanLeftM() {
2447void daPlBase_c::initialDokanDepth() {
2451void daPlBase_c::initialDoor() {}
2452void daPlBase_c::initialJumpRight() {}
2453void daPlBase_c::initialJumpLeft() {}
2454void daPlBase_c::initialVine() {}
2456void daPlBase_c::initialFall() {
2463void daPlBase_c::initialHipAttack() {
2468void daPlBase_c::initialSlip() {
2474void daPlBase_c::initialSwim() {}
2476void daPlBase_c::initialTorideBoss() {
2481void daPlBase_c::initialBlockJump() {}
2482void daPlBase_c::initialBlockJumpBelow() {}
2484void daPlBase_c::initialNormal() {
2491void daPlBase_c::setCreateAction(
int action) {
2492 static ProcFunc l_createActionProc[] = {
2493 &daPlBase_c::initialNormal,
2494 &daPlBase_c::initialNormal,
2495 &daPlBase_c::initialDoor,
2496 &daPlBase_c::initialDokanUnder,
2497 &daPlBase_c::initialDokanUper,
2498 &daPlBase_c::initialDokanRight,
2499 &daPlBase_c::initialDokanLeft,
2500 &daPlBase_c::initialFall,
2501 &daPlBase_c::initialHipAttack,
2502 &daPlBase_c::initialSlip,
2503 &daPlBase_c::initialSwim,
2504 &daPlBase_c::initialNormal,
2505 &daPlBase_c::initialNormal,
2506 &daPlBase_c::initialNormal,
2507 &daPlBase_c::initialDoor,
2508 &daPlBase_c::initialDoor,
2509 &daPlBase_c::initialDokanUnderM,
2510 &daPlBase_c::initialDokanUperM,
2511 &daPlBase_c::initialDokanRightM,
2512 &daPlBase_c::initialDokanLeftM,
2513 &daPlBase_c::initialJumpRight,
2514 &daPlBase_c::initialVine,
2515 &daPlBase_c::initialDokanDepth,
2516 &daPlBase_c::initialTorideBoss,
2517 &daPlBase_c::initialJumpLeft,
2518 &daPlBase_c::initialBlockJump,
2519 &daPlBase_c::initialBlockJumpBelow,
2520 &daPlBase_c::initialNormal
2522 (this->*l_createActionProc[action])();
2525bool daPlBase_c::isDemoType(DemoType_e type) {
2543 if (!isItemKinopio() && (
isStatus(STATUS_72) ||
isStatus(STATUS_71)) && mDemoState >= CONTROL_DEMO_WAIT && mDemoState <= CONTROL_DEMO_4) {
2548 if (isItemKinopio() && (
isStatus(STATUS_72) ||
isStatus(STATUS_71)) && mDemoState >= CONTROL_DEMO_WAIT && mDemoState <= CONTROL_DEMO_KINOPIO_SINK_SAND) {
2552 case DEMO_ENDING_DANCE:
2553 if ((
isStatus(STATUS_72) ||
isStatus(STATUS_71)) && mDemoState == CONTROL_DEMO_ENDING_DANCE) {
2563bool daPlBase_c::isDemo() {
2564 if (isDemoType(DEMO_1) || isDemoType(DEMO_2) || isDemoType(DEMO_3)) {
2570bool daPlBase_c::isControlDemoAll() {
2571 if (isDemoType(DEMO_PLAYER) || isDemoType(DEMO_KINOPIO) || isDemoType(DEMO_ENDING_DANCE)) {
2577bool daPlBase_c::isDemoAll() {
2578 if (isDemo() || isControlDemoAll()) {
2584bool daPlBase_c::isDemoMode()
const {
2588void daPlBase_c::onDemo() {
2592 daPlBase_c *pl = daPyMng_c::getPlayer(
mPlayerNo);
2593 if (pl !=
nullptr && !pl->isItemKinopio()) {
2594 daPyMng_c::mPauseEnableInfo &= ~(1 <<
mPlayerNo);
2595 daPyMng_c::mStopTimerInfo |= (1 <<
mPlayerNo);
2600void daPlBase_c::offDemo() {
2604 daPlBase_c *pl = daPyMng_c::getPlayer(
mPlayerNo);
2605 if (pl !=
nullptr && !pl->isItemKinopio()) {
2606 daPyMng_c::mPauseEnableInfo |= (1 <<
mPlayerNo);
2607 daPyMng_c::mStopTimerInfo &= ~(1 <<
mPlayerNo);
2612void daPlBase_c::changeNextScene(
int param1) {
2614 daPyMng_c::mPauseDisable =
true;
2615 daPyDemoMng_c::mspInstance->setCourseOutList(
mPlayerNo);
2616 if (
mPlayerNo == daPyDemoMng_c::mspInstance->m_70) {
2618 daPyDemoMng_c::mspInstance->mPlayerNo =
mPlayerNo;
2621 daPlBase_c *pl = daPyMng_c::getPlayer(
mPlayerNo);
2622 if (pl !=
nullptr) {
2625 daPlBase_c *yoshi = daPyMng_c::getYoshi(
mPlayerNo);
2626 if (yoshi !=
nullptr) {
2632bool daPlBase_c::isPlayerGameStop() {
2636void daPlBase_c::stopOther() {
2637 if (!isPlayerGameStop()) {
2642 daPlBase_c *pl = daPyMng_c::getPlayer(
mPlayerNo);
2643 if (pl !=
nullptr) {
2646 daPlBase_c *yoshi = daPyMng_c::getYoshi(
mPlayerNo);
2647 if (yoshi !=
nullptr) {
2655void daPlBase_c::playOther() {
2658 daPlBase_c *pl = daPyMng_c::getPlayer(
mPlayerNo);
2659 if (pl !=
nullptr) {
2662 daPlBase_c *yoshi = daPyMng_c::getYoshi(
mPlayerNo);
2663 if (yoshi !=
nullptr) {
2671void daPlBase_c::changeNormalAction() {
2678bool daPlBase_c::checkTimeOut() {
2679 if (dStageTimer_c::m_instance->convertToIGT() == 0) {
2680 if (setTimeOverDemo()) {
2698bool daPlBase_c::executeDemoState() {
2709 if (!isDemoMode()) {
2718void daPlBase_c::initializeState_DemoNone() {
2720 daPyDemoMng_c::mspInstance->clearDemoNo(
mPlayerNo);
2728void daPlBase_c::finalizeState_DemoNone() {}
2730void daPlBase_c::executeState_DemoNone() {
2736 daPyDemoMng_c::mspInstance->setPlrNo(-1);
2739 if (checkTimeOut()) {
2743 if (mKey.buttonRight()) {
2751 if (mKey.buttonLeft()) {
2764 if (setDokanIn(DOKAN_D)) {
2767 if (setDokanIn(DOKAN_U)) {
2771 if (setDokanIn(DOKAN_R)) {
2776 if (setDokanIn(DOKAN_L)) {
2780 if (mKey.buttonDown()) {
2786void daPlBase_c::initializeState_DemoStartWait() {}
2788void daPlBase_c::executeState_DemoStartWait() {
2789 if (dScStage_c::m_gameMode == dInfo_c::GAME_MODE_TITLE) {
2799void daPlBase_c::finalizeState_DemoStartWait() {}
2801void daPlBase_c::initializeState_DemoWait() {
2802 if (daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
2810void daPlBase_c::finalizeState_DemoWait() {}
2812void daPlBase_c::executeState_DemoWait() {
2815 case DEMO_WAIT_DELAY:
2816 if (daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
2821 case DEMO_WAIT_TRANSITION:
2823 daPyDemoMng_c::mspInstance->turnNextDemoNo();
2825 case DEMO_WAIT_ARG_TO_NONE:
2830 case DEMO_WAIT_ARG_TO_CONTROL:
2840const float daPlBase_c::scDokanInSpeedX = 1.0f;
2841const float daPlBase_c::scDokanInWidthX = 0.0f;
2842const float daPlBase_c::scDokanInMoveSpeed = 0.75f;
2843const float daPlBase_c::scDokanWaitAnmFixFrame = 85.0f;
2846 const float scDokanOutTurnSpeed[] = { 2048.0f };
2851 static const float l_maxOffsets[] = { 12.0f, 15.0f, 13.0f, 13.0f };
2854 max = l_maxOffsets[mPlayerType];
2856 float pos = getCenterY() -
mPos.y;
2860 return param1 + 16.0f - pos;
2863void daPlBase_c::initDemoInDokan() {
2867 setZPosition(-1800.0f);
2869 mDamageInvulnTimer = 0;
2871 mDamageInvulnTimer = 35;
2872 if (daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
2879void daPlBase_c::endDemoInDokan() {
2880 mDamageInvulnTimer = 0;
2881 mPowerupChangeInvulnTimer = 0;
2887void daPlBase_c::executeDemoInDokan(u8 dir) {
2897 if (!daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
2908 mpMdlMng->setAnm(PLAYER_ANIM_SWIM_PIPE);
2914 startSound(SE_PLY_WATER_DOKAN_IN_OUT,
false);
2921 daPyDemoMng_c::mspInstance->turnNextDemoNo();
2932 if (!demo_dokan_move_x(0.75f, 0.0f)) {
2935 if (!demo_dokan_move_y(0.75f, 0.0f)) {
2939 daPyDemoMng_c::mspInstance->turnNextDemoNo();
2944 if (!mKey.buttonWalk(
nullptr)) {
2949 changeNormalAction();
2959 static const float tmps[] = { 34.0f, 36.0f, 38.0f, 38.0f };
2961 static const float tmps_big[] = { 40.0f, 42.0f, 44.0f, 44.0f };
2962 mpMdlMng->setAnm(PLAYER_ANIM_WAIT);
2980 daPlBase_c *pl = ((
daYoshi_c *)
this)->getPlayerRideOn();
2981 if (pl !=
nullptr) {
2982 int t = pl->mPlayerType;
2983 switch (pl->mPowerup) {
2987 case POWERUP_MINI_MUSHROOM:
3000 case POWERUP_MINI_MUSHROOM:
3003 case POWERUP_PROPELLER_SHROOM:
3004 tmp = getModelHeight() + 8.0f;
3007 tmp = getModelHeight();
3020void daPlBase_c::initDemoInDokanLR(u8 dir) {
3021 static const float l_dokanOffset[] = { 32.0f, 32.0f, 20.0f };
3022 mpMdlMng->setAnm(PLAYER_ANIM_LOW_WALK);
3024 if (dir == DOKAN_R) {
3039 if (dir == DOKAN_R) {
3049void daPlBase_c::finalizeState_DemoInDokanU() { endDemoInDokan(); }
3050void daPlBase_c::executeState_DemoInDokanU() { executeDemoInDokan(DOKAN_U); }
3053void daPlBase_c::finalizeState_DemoInDokanD() { endDemoInDokan(); }
3054void daPlBase_c::executeState_DemoInDokanD() { executeDemoInDokan(DOKAN_D); }
3056void daPlBase_c::initializeState_DemoInDokanL() { initDemoInDokanLR(DOKAN_L); }
3057void daPlBase_c::finalizeState_DemoInDokanL() { endDemoInDokan(); }
3058void daPlBase_c::executeState_DemoInDokanL() { executeDemoInDokan(DOKAN_L); }
3060void daPlBase_c::initializeState_DemoInDokanR() { initDemoInDokanLR(DOKAN_R); }
3061void daPlBase_c::finalizeState_DemoInDokanR() { endDemoInDokan(); }
3062void daPlBase_c::executeState_DemoInDokanR() { executeDemoInDokan(DOKAN_R); }
3064BOOL daPlBase_c::demo_dokan_move_x(
float moveStep,
float epsilon) {
3069BOOL daPlBase_c::demo_dokan_move_y(
float moveStep,
float offset) {
3073bool daPlBase_c::isEnableDokanInStatus() {
3088bool daPlBase_c::setDokanIn(DokanDir_e dir) {
3093 int entranceNextGotoID;
3096 if (mKey.buttonDown()) {
3097 res =
mBc.checkDokanDown(&
mWarpPos, &entranceNextGotoID);
3101 if (mKey.buttonUp()) {
3102 res =
mBc.checkDokanUp(&
mWarpPos, &entranceNextGotoID);
3124 if (res == 1 && setDemoOutDokanAction(entranceNextGotoID, dir)) {
3130bool daPlBase_c::setDemoOutDokanAction(
int entranceNextGotoID, DokanDir_e dir) {
3132 dCdFile_c *cdFile = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile);
3135 mDokanMode = DEMO_DOKAN_NORMAL;
3136 if (nextGoto->
mFlags & NEXT_GOTO_FLAG_RAIL) {
3137 mDokanMode = DEMO_DOKAN_RAIL;
3138 }
else if (nextGoto->
mFlags & NEXT_GOTO_FLAG_WATER_TANK) {
3139 mDokanMode = DEMO_DOKAN_WATER_TANK;
3142 static sStateIDIf_c *l_dokanInAction[] = {
3149 switch (mDokanMode) {
3150 case DEMO_DOKAN_NORMAL:
3154 if (daPyDemoMng_c::mspInstance->m_5c) {
3158 if (nextGoto->
mType == NEXT_GOTO_TYPE_WATER_TANK) {
3164 case DEMO_DOKAN_RAIL:
3168 case DEMO_DOKAN_WATER_TANK:
3169 if (nextGoto->
mType == NEXT_GOTO_TYPE_WATER_TANK) {
3179void daPlBase_c::initDemoOutDokan() {
3182 mSpeed.set(0.0f, 0.0f, 0.0f);
3184 setZPosition(-1800.0f);
3186 startSound(SE_PLY_WATER_DOKAN_IN_OUT,
false);
3192void daPlBase_c::endDemoOutDokan() {
3197void daPlBase_c::initDemoOutDokanUD(u8 dir) {
3200 mpMdlMng->setAnm(PLAYER_ANIM_WAIT, 0.0f, 5.0f, 85.0f);
3201 if (mDokanMode == DEMO_DOKAN_RAIL) {
3202 if (dir == DOKAN_U) {
3203 mDokanOffsetY = 0.0f;
3205 mDokanOffsetY = -34.0f;
3207 }
else if (dir == DOKAN_U) {
3208 mDokanOffsetY = 2.0f;
3210 mDokanOffsetY = -16.0f;
3212 mDokanOffsetY = -10.0f;
3214 mDokanShiftXEpsilon = 0.0f;
3215 if (mDokanMode == DEMO_DOKAN_NORMAL && daPyMng_c::mNum == 1) {
3221void daPlBase_c::executeDemoOutDokanUD() {
3230 if (
mAngle.y.chase(0, scDokanOutTurnSpeed[0])) {
3238 if (demo_dokan_move_x(1.0f, mDokanShiftXEpsilon) && cond == 1) {
3245 if (demo_dokan_move_y(0.75f, mDokanOffsetY)) {
3247 switch (mDokanMode) {
3248 case DEMO_DOKAN_RAIL:
3251 case DEMO_DOKAN_WATER_TANK:
3254 if (mDokanDir == DOKAN_U) {
3277void daPlBase_c::initDemoOutDokanLR(u8 dir) {
3280 mpMdlMng->setAnm(PLAYER_ANIM_SWIM_PIPE);
3282 mpMdlMng->setAnm(PLAYER_ANIM_LOW_WALK_START);
3285 if (mDokanMode == DEMO_DOKAN_NORMAL && daPyMng_c::mNum == 1) {
3289 if (dir == DOKAN_R) {
3298void daPlBase_c::executeDemoOutDokanLR() {
3303 if (mpMdlMng->mpMdl->mAnm.isStop()) {
3304 mpMdlMng->setAnm(PLAYER_ANIM_LOW_WALK);
3308 bool yTargetReached =
false;
3309 if (!addCalcAngleY(getMukiAngle(
mDirection), 10)) {
3310 float offset = 0.0f;
3314 if (demo_dokan_move_y(0.75f, offset)) {
3315 yTargetReached =
true;
3318 if (yTargetReached && demo_dokan_move_x(0.75f, 0.0f)) {
3320 switch (mDokanMode) {
3321 case DEMO_DOKAN_RAIL:
3324 case DEMO_DOKAN_WATER_TANK:
3358void daPlBase_c::initializeState_DemoOutDokanU() { initDemoOutDokanUD(DOKAN_U); }
3359void daPlBase_c::finalizeState_DemoOutDokanU() { endDemoOutDokan(); }
3360void daPlBase_c::executeState_DemoOutDokanU() { executeDemoOutDokanUD(); }
3362void daPlBase_c::initializeState_DemoOutDokanD() { initDemoOutDokanUD(DOKAN_D); }
3363void daPlBase_c::finalizeState_DemoOutDokanD() { endDemoOutDokan(); }
3364void daPlBase_c::executeState_DemoOutDokanD() { executeDemoOutDokanUD(); }
3366void daPlBase_c::initializeState_DemoOutDokanL() { initDemoOutDokanLR(DOKAN_L); }
3367void daPlBase_c::finalizeState_DemoOutDokanL() { endDemoOutDokan(); }
3368void daPlBase_c::executeState_DemoOutDokanL() { executeDemoOutDokanLR(); }
3370void daPlBase_c::initializeState_DemoOutDokanR() { initDemoOutDokanLR(DOKAN_R); }
3371void daPlBase_c::finalizeState_DemoOutDokanR() { endDemoOutDokan(); }
3372void daPlBase_c::executeState_DemoOutDokanR() { executeDemoOutDokanLR(); }
3374void daPlBase_c::initializeState_DemoOutDokanRoll() {
3375 initDemoOutDokanUD(DOKAN_ROLL);
3376 mDokanMode = DEMO_DOKAN_NORMAL;
3379 mBc.setRideOnObjBg(mpDokanBgCtr,
mPos);
3380 mpDokanBgCtr->addDokanMoveDiff(&
mWarpPos);
3383void daPlBase_c::finalizeState_DemoOutDokanRoll() {}
3385void daPlBase_c::executeState_DemoOutDokanRoll() {
3386 mBc.setRideOnObjBg(mpDokanBgCtr,
mPos);
3387 mpDokanBgCtr->addDokanMoveDiff(&
mWarpPos);
3393 if (
mAngle.y.chase(0, scDokanOutTurnSpeed[0])) {
3402 mVec3_c diff1 = warpPos -
mPos;
3403 copy.set(diff1.x, diff1.y, diff1.z);
3405 mPos += 1.0f * copy;
3407 if ((
mPos - warpPos).isSmallerThan1()) {
3416 mAng v = *mpDokanBgCtr->mRotation;
3421 float tmp = mDokanOffsetY + -32.0f;
3425 m1.
ZrotM(*mpDokanBgCtr->mRotation);
3439void daPlBase_c::initializeState_DemoInWaterTank() {
3442 mpMdlMng->setAnm(PLAYER_ANIM_LOW_WALK);
3445 mDamageInvulnTimer = 0;
3447 setZPosition(3000.0f);
3449 mDamageInvulnTimer = 35;
3450 if (daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
3457void daPlBase_c::finalizeState_DemoInWaterTank() {}
3459void daPlBase_c::executeState_DemoInWaterTank() {
3467 if (!daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
3476 mpMdlMng->setAnm(PLAYER_ANIM_SWIM_PIPE);
3478 startSound(SE_PLY_WATER_DOKAN_IN_OUT,
false);
3485 changeNormalAction();
3491void daPlBase_c::initializeState_DemoOutWaterTank() {
3492 mpMdlMng->setAnm(PLAYER_ANIM_WAIT);
3495 mSpeed.set(0.0f, 0.0f, 0.0f);
3500void daPlBase_c::finalizeState_DemoOutWaterTank() {}
3502void daPlBase_c::executeState_DemoOutWaterTank() {
3511 mpMdlMng->setAnm(PLAYER_ANIM_LOW_WALK_START);
3518 if (mpMdlMng->mpMdl->mAnm.isStop()) {
3519 mpMdlMng->setAnm(PLAYER_ANIM_LOW_WALK);
3523 if (mDokanMode == DEMO_DOKAN_WATER_TANK) {
3524 setZPosition(-1800.0f);
3571 setZPosition(-1800.0f);
3577void daPlBase_c::initializeState_DemoRailDokan() {
3579 sNextGotoData *nextGoto = dCd_c::m_instance->
3580 getFileP(dScStage_c::m_instance->mCurrFile)->
3586 sRailNodeData *node = &dCd_c::m_instance->
3587 getFileP(dScStage_c::m_instance->mCurrFile)->
3588 mpRailNodes[rail->mNodeIdx + mRailDokanRailIndex];
3590 if (nextGoto->
mFlags & NEXT_GOTO_FLAG_RAIL_REVERSE) {
3591 mRailDokanRailIndex = rail->mCount - 2;
3593 mRailDokanRailIndex = 1;
3596 mVec2_c delta(node->mX -
mPos.x, -node->mY -
mPos.y);
3598 float size = delta.length();
3599 mRailDokanNextNodeTimer = size / 2.0f;
3603void daPlBase_c::finalizeState_DemoRailDokan() {
3607void daPlBase_c::setExitRailDokan() {
3608 dCdFile_c *cdFile = dCd_c::m_instance->getFileP(dScStage_c::m_instance->mCurrFile);
3617 mLayer = nextGoto->mLayer;
3619 switch (nextGoto->
mType) {
3620 case NEXT_GOTO_TYPE_PIPE_U:
3624 case NEXT_GOTO_TYPE_PIPE_D:
3627 case NEXT_GOTO_TYPE_PIPE_L:
3630 case NEXT_GOTO_TYPE_PIPE_R:
3636void daPlBase_c::executeState_DemoRailDokan() {
3637 if (--mRailDokanNextNodeTimer < 0) {
3638 sNextGotoData *ngt = dCd_c::m_instance->
3639 getFileP(dScStage_c::m_instance->mCurrFile)->
3643 sRailNodeData *currNode = &dCd_c::m_instance->
3644 getFileP(dScStage_c::m_instance->mCurrFile)->
3645 mpRailNodes[rail->mNodeIdx + mRailDokanRailIndex];
3646 mPos.x = currNode->mX;
3647 mPos.y = -currNode->mY;
3651 mRailDokanRailIndex--;
3652 if (mRailDokanRailIndex < 0) {
3656 mRailDokanRailIndex++;
3657 if (mRailDokanRailIndex >= rail->mCount) {
3667 sRailNodeData *nextNode = &dCd_c::m_instance->
3668 getFileP(dScStage_c::m_instance->mCurrFile)->
3669 mpRailNodes[rail->mNodeIdx + mRailDokanRailIndex];
3671 mVec2_c distToNext(nextNode->mX -
mPos.x, -nextNode->mY -
mPos.y);
3673 float distLen = distToNext.length();
3674 mRailDokanNextNodeTimer = distLen / 2.0f;
3675 mDokanMoveSpeed.set(distToNext.x / distLen * 2.0f, distToNext.y / distLen * 2.0f);
3682void daPlBase_c::setObjDokanIn(
dBg_ctr_c *bgCtr,
mVec3_c &pos,
int nextGotoID) {
3683 mpDokanBgCtr = bgCtr;
3685 mRollDokanAngle = *bgCtr->mRotation;
3686 setDemoOutDokanAction(nextGotoID, DOKAN_ROLL);
3689bool daPlBase_c::isDispOutCheckOn() {
3702void daPlBase_c::initializeState_DemoDown() {}
3703void daPlBase_c::finalizeState_DemoDown() {}
3704void daPlBase_c::executeState_DemoDown() {}
3706int daPlBase_c::setDemoGoal(
mVec3_c &landPos,
float goalCastleX, u8 goalType) {
3707 if (daPyDemoMng_c::mspInstance->mFlags & 4) {
3722 daPyDemoMng_c::mspInstance->setDemoMode(daPyDemoMng_c::MODE_1, 0);
3723 daPyDemoMng_c::mspInstance->mGoalType = goalType;
3724 daPyDemoMng_c::mspInstance->mPlayerNo =
mPlayerNo;
3726 mVec3_c fireworkPos(goalCastleX - 112.0f, landPos.y, 5500.0f);
3728 if (dBc_c::checkGround(&fireworkPos, &height,
mLayer, 1, -1)) {
3729 fireworkPos.y = height + 112.0f;
3731 daPyDemoMng_c::mspInstance->mFireworkPos = fireworkPos;
3734 if (!daPyMng_c::isItemKinopio(
mPlayerNo)) {
3740 daPyDemoMng_c::mspInstance->m_42 = 1;
3744 int totalPlayers = daPyMng_c::getNumInGame() + daPyMng_c::getItemKinopioNum();
3746 daPyDemoMng_c::mspInstance->stopBgmGoalDemo();
3752bool daPlBase_c::setHideNotGoalPlayer() {
3763void daPlBase_c::stopGoalOther() {
3764 if (!isPlayerGameStop()) {
3768 for (
int i = 0; i < PLAYER_COUNT; i++) {
3769 daPlBase_c *ctrlPl = daPyMng_c::getCtrlPlayer(i);
3774 daPlBase_c *pl = daPyMng_c::getPlayer(i);
3775 if (pl !=
nullptr) {
3778 daPlBase_c *yoshi = daPyMng_c::getYoshi(i);
3779 if (yoshi !=
nullptr) {
3785void daPlBase_c::playGoalOther() {
3787 for (
int i = 0; i < PLAYER_COUNT; i++) {
3788 daPlBase_c *ctrlPl = daPyMng_c::getCtrlPlayer(i);
3793 daPlBase_c *pl = daPyMng_c::getPlayer(i);
3794 if (pl !=
nullptr) {
3797 daPlBase_c *yoshi = daPyMng_c::getYoshi(i);
3798 if (yoshi !=
nullptr) {
3804void daPlBase_c::initDemoGoalBase() {
3810 clearJumpActionInfo(0);
3812 setDemoGoalMode(0, 0);
3813 mpMdlMng->setAnm(PLAYER_ANIM_RTREE_START);
3815 setZPositionDirect(3000.0f);
3823void daPlBase_c::finalizeDemoGoalBase() {
3835void daPlBase_c::initializeState_DemoGoal() { initDemoGoalBase(); }
3836void daPlBase_c::finalizeState_DemoGoal() { finalizeDemoGoalBase(); }
3838float daPlBase_c::getDemoGoalLandPos() {
3839 float pos =
mWarpPos.z + daPyDemoMng_c::mspInstance->m_1c * 16.0f;
3840 if (daPyDemoMng_c::mspInstance->m_1c > 1) {
3841 pos -= mGoalTouchOrder * 32.0f;
3846void daPlBase_c::setDemoGoal_MultiJump() {
3849 getDemoGoalLandPos(),
3853 dBc_c::checkGround(&pos, &pos.y,
mLayer, 1, -1);
3856 mpMdlMng->setAnm(PLAYER_ANIM_GOAL_JUMP);
3857 if (daPyDemoMng_c::mspInstance->m_1c > 1) {
3858 initGoalJump(pos, daPlBase_c::sc_JumpSpeed + 1.5f);
3860 initGoalJump(pos, daPlBase_c::sc_JumpSpeed + 1.3f);
3864void daPlBase_c::executeDemoGoal_Pole() {
3867 if (!addCalcAngleY(-0x4000, 10) && mpMdlMng->mpMdl->mAnm.isStop()) {
3869 mpMdlMng->setAnm(PLAYER_ANIM_RTREE_WAIT);
3875 int polePlayer = daPyDemoMng_c::mspInstance->getPoleBelowPlayer(
mPlayerNo);
3876 if (polePlayer != -1) {
3877 daPlBase_c *ctrlPl = daPyMng_c::getCtrlPlayer(polePlayer);
3878 if (ctrlPl !=
nullptr) {
3879 float l = 0.7f * ctrlPl->getModelHeight() + ctrlPl->
mPos.y;
3887 daPyDemoMng_c::mspInstance->mFlags |= 1;
3893 if (
mPos.y < mGoalPoleEndY) {
3894 mPos.y = mGoalPoleEndY;
3898 mpMdlMng->setAnm(PLAYER_ANIM_RTREE_POSE);
3904 setDemoGoal_MultiJump();
3908 if (calcGoalJump()) {
3910 mpMdlMng->setAnm(PLAYER_ANIM_GOAL_JUMP_ED);
3915 if (mpMdlMng->mpMdl->mAnm.isStop()) {
3916 mpMdlMng->setAnm(PLAYER_ANIM_STAMP);
3928 if (daPyDemoMng_c::mspInstance->mFlags & 8 && !addCalcAngleY(0, 10)) {
3935 setDemoGoalMode(GOAL_DEMO_ACTION_WAIT, 0);
3941void daPlBase_c::executeDemoGoal_Wait() {
3945 setDemoGoalMode(GOAL_DEMO_ACTION_KIME_POSE, 0);
3948 setDemoGoalMode(GOAL_DEMO_ACTION_RUN, 0);
3952void daPlBase_c::executeDemoGoal_KimePose() {
3953 if (mKimePoseMode != KIME_POSE_NONE && mpMdlMng->mpMdl->mAnm.checkFrame(107.0f)) {
3954 daPlBase_c *pl = daPyMng_c::getPlayer(
mPlayerNo);
3955 if (pl !=
nullptr) {
3956 if (pl->isItemKinopio()) {
3957 if (mKimePoseMode == KIME_POSE_PENGUIN || mKimePoseMode == KIME_POSE_NO_HAT) {
3958 if (pl->mPowerup == POWERUP_NONE) {
3967 SndAudioMgr::sInstance->startSystemSe(SE_OBJ_GOAL_GET_COIN_BONUS, 1);
3969 static const int scGoalCoin[] = {20, 15, 10, 5 };
3975 if (updateDemoKimePose(CLEAR_TYPE_GOAL)) {
3976 setDemoGoalMode(GOAL_DEMO_ACTION_WAIT, 0);
3980void daPlBase_c::executeDemoGoal_Run() {}
3982void daPlBase_c::setDemoGoalMode(
int mode,
int param) {
3987void daPlBase_c::executeState_DemoGoal() {
3989 case GOAL_DEMO_ACTION_POLE:
3990 executeDemoGoal_Pole();
3992 case GOAL_DEMO_ACTION_WAIT:
3993 executeDemoGoal_Wait();
3995 case GOAL_DEMO_ACTION_KIME_POSE:
3996 executeDemoGoal_KimePose();
3998 case GOAL_DEMO_ACTION_RUN:
3999 executeDemoGoal_Run();
4005void daPlBase_c::initGoalJump(
mVec3_c &pos,
float ySpeed) {
4008 float yPos =
mPos.y;
4016 if (
mSpeed.y < 0.0f && yPos <= pos.y) {
4021 mGoalJumpTarget = pos;
4022 mGoalJumpFrameCount = count;
4026bool daPlBase_c::calcGoalJump() {
4027 if (mGoalJumpFrameCount != 0) {
4028 sLib::chase(&
mPos.x, mGoalJumpTarget.x, (mGoalJumpTarget.x -
mPos.x) / mGoalJumpFrameCount);
4029 mGoalJumpFrameCount--;
4038 mPos = mGoalJumpTarget;
4044void daPlBase_c::initDemoKimePose() {
4046 mKimePoseMode = KIME_POSE_NONE;
4049bool daPlBase_c::updateDemoKimePose(ClearType_e clearType) {
4053void daPlBase_c::startKimePoseVoice(ClearType_e clearType) {
4055 if (clearType == CLEAR_TYPE_GOAL) {
4056 playerCount = daPyDemoMng_c::mspInstance->m_1c;
4058 playerCount = daPyDemoMng_c::mspInstance->getControlDemoPlayerNum();
4060 if (dInfo_c::m_startGameInfo.mGameMode == dInfo_c::GAME_MODE_SUPER_GUIDE) {
4061 if (playerCount >= 2) {
4066 }
else if (clearType == CLEAR_TYPE_FINAL_BOSS) {
4068 }
else if (playerCount >= 2) {
4070 }
else if (clearType == CLEAR_TYPE_GOAL) {
4071 if (daPyDemoMng_c::mspInstance->mGoalType == 0) {
4081bool daPlBase_c::startControlDemo() {
4082 if (isDemoType(DEMO_PLAYER)) {
4084 }
else if (isDemoType(DEMO_ENDING_DANCE)) {
4093void daPlBase_c::endControlDemo(
int p) {
4095 changeNormalAction();
4099void daPlBase_c::setControlDemoDir(u8 dir) {
4108void daPlBase_c::setControlDemoWait() {
4110 mDemoState = CONTROL_DEMO_WAIT;
4115bool daPlBase_c::isControlDemoWait() {
4117 if (mDemoState == CONTROL_DEMO_WAIT) {
4124void daPlBase_c::setControlDemoWalk(
const float &f1,
const float &f2) {
4126 mControlDemoTargetPos.x = f1;
4127 mDemoState = CONTROL_DEMO_WALK;
4128 mControlDemoSpeedF = std::fabs(f2);
4129 if (mControlDemoSpeedF > getSpeedData()->mHighSpeed) {
4130 mControlDemoSpeedF = getSpeedData()->mHighSpeed;
4135bool daPlBase_c::isControlDemoWalk() {
4137 if (mDemoState == CONTROL_DEMO_WALK) {
4144void daPlBase_c::setControlDemoAnm(
int anmNo) {
4146 mDemoState = CONTROL_DEMO_REGULAR_ANIM;
4148 mpMdlMng->setAnm(anmNo);
4151bool daPlBase_c::isControlDemoAnm(
int anmNo) {
4152 if (
isStatus(STATUS_72) && mDemoState == CONTROL_DEMO_REGULAR_ANIM && anmNo == mpMdlMng->mpMdl->mCurrAnmID) {
4160 mDemoState = CONTROL_DEMO_CUTSCENE_ANIM;
4165void daPlBase_c::setControlDemoKinopioWalk() {
4166 if (isDemoState(
StateID_DemoNone) || (isDemoType(DEMO_KINOPIO) && mDemoState != CONTROL_DEMO_KINOPIO_WALK)) {
4171void daPlBase_c::setControlDemoKinopioSwim() {
4172 if (isDemoState(
StateID_DemoNone) || (isDemoType(DEMO_KINOPIO) && mDemoState != CONTROL_DEMO_KINOPIO_SWIM)) {
4177void daPlBase_c::setControlDemoEndingDance() {
4178 if (!isControlDemoAll()) {
4183bool daPlBase_c::isBossDemoLand() {
4195 mPos.x + f * sc_DirSpeed[dir],
4205 if (
mBc.checkGround(&tmp, &y,
mLayer, mAmiLayer, -1) && std::fabs(y -
mPos.y) < a) {
4207 tmp.y =
mPos.y - 4.0f;
4209 if (dBc_c::checkWater(tmp.x, tmp.y,
mLayer, &y2) &&
4210 mLastPosDelta.y >= 0.0f &&
4222bool daPlBase_c::isHitWallKinopioWalk(
int dir) {
4223 static const BgCross1_e scViewHitFlag[] = { BGC_SIDE_LIMIT_R, BGC_SIDE_LIMIT_L };
4224 if (checkBGCrossWall(dir) || isNowBgCross(scViewHitFlag[dir])) {
4230bool daPlBase_c::checkKinopioWaitBG(
int dir) {
4231 if (isHitWallKinopioWalk(dir)) {
4237void daPlBase_c::initializeState_DemoControl() {
4245 initializeDemoControl();
4247 switch (mDemoState) {
4248 case CONTROL_DEMO_4:
4252 case CONTROL_DEMO_KINOPIO_WALK:
4253 mControlDemoTargetPos.x =
mPos.x;
4254 mControlDemoSpeedF = 0.9f;
4256 mItemKinopioTurnTimer = 150;
4258 mItemKinopioDirection ^= 1;
4261 case CONTROL_DEMO_KINOPIO_SWIM:
4263 mItemKinopioDirection = 0;
4265 mItemKinopioDirection = 1;
4273void daPlBase_c::finalizeState_DemoControl() {
4279 if (mDemoState == CONTROL_DEMO_4) {
4284void daPlBase_c::executeState_DemoControl() {
4295 case CONTROL_DEMO_WALK: {
4306 if (std::fabs(
mPos.x - mControlDemoTargetPos.x) < mControlDemoSpeedF) {
4307 mDemoState = CONTROL_DEMO_WAIT;
4309 mPos.x = mControlDemoTargetPos.x;
4312 if (
mPos.x < mControlDemoTargetPos.x) {
4313 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_RIGHT);
4317 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_LEFT);
4318 mSpeedF = -mControlDemoSpeedF;
4321 case CONTROL_DEMO_4: {
4327 case CONTROL_DEMO_KINOPIO_WALK: {
4332 mDemoState = CONTROL_DEMO_WAIT;
4336 if (isOnSinkSand() || (checkKinopioWaitBG(0) && checkKinopioWaitBG(1))) {
4337 mDemoState = CONTROL_DEMO_KINOPIO_SINK_SAND;
4338 mControlDemoSpeedF = 0.0f;
4342 int prevDirection = (int) (
short) mItemKinopioDirection;
4344 if (isHitWallKinopioWalk(mItemKinopioDirection) || mItemKinopioTurnTimer == 0) {
4345 mItemKinopioDirection ^= 1;
4346 mControlDemoTargetPos.x =
mPos.x + sc_DirSpeed[mItemKinopioDirection] * 24.0f;
4348 mItemKinopioDirection ^= 1;
4349 mControlDemoTargetPos.x =
mPos.x + sc_DirSpeed[mItemKinopioDirection] * 24.0f;
4351 float tmp = mControlDemoTargetPos.x + sc_DirSpeed[mItemKinopioDirection] * 24.0f;
4353 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_RIGHT);
4355 mItemKinopioDirection = 0;
4357 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_LEFT);
4358 mItemKinopioDirection = 1;
4359 mSpeedF = -mControlDemoSpeedF;
4361 if (prevDirection != mItemKinopioDirection) {
4362 mItemKinopioTurnTimer = 180;
4366 case CONTROL_DEMO_KINOPIO_SWIM: {
4368 mDemoState = CONTROL_DEMO_WAIT;
4372 if (isNowBgCross(
BGC_FOOT) && isHitWallKinopioWalk(mItemKinopioDirection)) {
4373 mItemKinopioDirection ^= 1;
4375 if (mItemKinopioDirection == 0) {
4376 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_RIGHT);
4379 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_LEFT);
4384 case CONTROL_DEMO_KINOPIO_SINK_SAND: {
4389 mDemoState = CONTROL_DEMO_WAIT;
4394 if (!checkKinopioWaitBG(0) || !checkKinopioWaitBG(1)) {
4395 setControlDemoKinopioWalk();
4425void daPlBase_c::initializeState_DemoNextGotoBlock() {
4429 initializeDemoControl();
4432void daPlBase_c::finalizeState_DemoNextGotoBlock() {
4438void daPlBase_c::executeState_DemoNextGotoBlock() {
4442 dFader_c::fader_type_e f = dFader_c::FADER_DRIP_DOWN;
4444 int nextGotoID = param & 0xff;
4445 if (((param >> 8) & 0xff) == 3) {
4446 f = dFader_c::FADER_CIRCLE_TARGET;
4458void daPlBase_c::updateEndingDance() {
4460 if (!dScStage_c::m_isStaffCredit || isDemoType(DEMO_PLAYER)) {
4464 if (dGameKey_c::m_instance->checkButtonsDown(
mPlayerNo) || dGameKey_c::m_instance->checkShaking(
mPlayerNo)) {
4467 if (!isDemoType(DEMO_ENDING_DANCE)) {
4468 if (isActive == 1) {
4469 mEndingDanceInactivityTimer = 0;
4471 mEndingDanceInactivityTimer++;
4472 if (mEndingDanceInactivityTimer >= 180) {
4473 setControlDemoEndingDance();
4474 mEndingDanceInactivityTimer = 0;
4477 }
else if (isActive == 1) {
4480 for (
int i = 0; i < ARRAY_SIZE(mEndingDanceKeyTimers); i++) {
4481 mEndingDanceKeyTimers[i] = 0;
4484 onStatus(STATUS_ENDING_DANCE_AUTO);
4485 if (dAudio::isBgmAccentSign(2)) {
4487 }
else if (dAudio::isBgmAccentSign(4)) {
4489 }
else if (dAudio::isBgmAccentSign(8)) {
4490 mKey.onDemoButton(dAcPyKey_c::BUTTON_DOWN);
4491 mEndingDanceKeyTimers[2] = 6;
4492 }
else if (dAudio::isBgmAccentSign(16)) {
4493 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_TWO);
4494 mKey.onDemoButton(dAcPyKey_c::BUTTON_TWO);
4495 mEndingDanceKeyTimers[3] = 5;
4496 }
else if (dAudio::isBgmAccentSign(32)) {
4497 mKey.onDemoTrigger(dAcPyKey_c::BUTTON_TWO);
4498 mKey.onDemoButton(dAcPyKey_c::BUTTON_TWO);
4499 mEndingDanceKeyTimers[4] = 30;
4500 }
else if (dAudio::isBgmAccentSign(64)) {
4502 }
else if (dAudio::isBgmAccentSign(128)) {
4503 if (dBgParameter_c::ms_Instance_p->m_48 >
mPos.x) {
4510 for (
int i = 0; i < 5; i++) {
4511 if (mEndingDanceKeyTimers[i] != 0 && --mEndingDanceKeyTimers[i] == 0) {
4514 mKey.offDemoButton(dAcPyKey_c::BUTTON_DOWN);
4518 mKey.offDemoButton(dAcPyKey_c::BUTTON_TWO);
4526bool daPlBase_c::setEnemyStageClearDemo() {
4530 mBc.mpCtrHead !=
nullptr &&
4531 mBc.mpCtrHead->mpActor !=
nullptr &&
4532 mBc.mpCtrHead->mpActor->mProfName == fProfile::EN_CHIKUWA_BLOCK
4536 if (!isDemoType(DEMO_PLAYER)) {
4546int daPlBase_c::getCcLineKind() {
4554 mCc.set(
this, dat1);
4555 mCc1.set(
this, dat1);
4556 mAttCc1.set(
this, dat2);
4557 mAttCc2.set(
this, dat2);
4558 mAttCc3.set(
this, dat2);
4561void daPlBase_c::releaseCcData() {
4563 BIT_FLAG(CC_KIND_PLAYER) |
4564 BIT_FLAG(CC_KIND_PLAYER_ATTACK) |
4565 BIT_FLAG(CC_KIND_YOSHI) |
4566 BIT_FLAG(CC_KIND_ENEMY) |
4567 BIT_FLAG(CC_KIND_BALLOON) |
4568 BIT_FLAG(CC_KIND_ITEM) |
4569 BIT_FLAG(CC_KIND_TAMA) |
4570 BIT_FLAG(CC_KIND_KILLER) |
4571 BIT_FLAG(CC_KIND_GOAL_POLE);
4574 BIT_FLAG(CC_KIND_PLAYER) |
4575 BIT_FLAG(CC_KIND_YOSHI) |
4576 BIT_FLAG(CC_KIND_ENEMY) |
4577 BIT_FLAG(CC_KIND_BALLOON) |
4578 BIT_FLAG(CC_KIND_ITEM) |
4579 BIT_FLAG(CC_KIND_KILLER);
4582 ~BIT_FLAG(CC_ATTACK_NONE) &
4583 ~BIT_FLAG(CC_ATTACK_YOSHI_MOUTH) &
4584 ~BIT_FLAG(CC_ATTACK_SAND_PILLAR);
4587 mCc.mCcData.mVsKind = mVsKind;
4588 mCc.mCcData.mAttack = 0;
4589 mCc.mCcData.mVsDamage = vsDamage;
4592 mCc1.mCcData.mVsKind = mVsKind;
4593 mCc1.mCcData.mAttack = 0;
4594 mCc1.mCcData.mVsDamage = vsDamage;
4597 mAttCc1.mCcData.mVsKind = mVsKindAttack;
4598 mAttCc1.mCcData.mAttack = 0;
4599 mAttCc1.mCcData.mVsDamage = 0;
4602 mAttCc2.mCcData.mVsKind = mVsKindAttack;
4603 mAttCc2.mCcData.mAttack = 0;
4604 mAttCc2.mCcData.mVsDamage = 0;
4607 mAttCc3.mCcData.mVsKind = mVsKindAttack;
4608 mAttCc3.mCcData.mAttack = 0;
4609 mAttCc3.mCcData.mVsDamage = 0;
4612void daPlBase_c::clearCcData() {
4620void daPlBase_c::setCcAtBody(
int attackCategory) {
4621 mAttCc2.mCcData.mBase.mOffset.set(
mCc.mCcData.mBase.mOffset);
4622 mAttCc2.mCcData.mBase.mSize.set(
mCc.mCcData.mBase.mSize);
4623 mAttCc2.mCcData.mAttack = attackCategory;
4624 mAttCc2.mCcData.mVsKind =
4625 BIT_FLAG(CC_KIND_PLAYER) |
4626 BIT_FLAG(CC_KIND_PLAYER_ATTACK) |
4627 BIT_FLAG(CC_KIND_YOSHI);
4629 mAttCc1.mCcData.mBase.mOffset.set(
mCc.mCcData.mBase.mOffset);
4630 mAttCc1.mCcData.mBase.mSize.set(
mCc.mCcData.mBase.mSize);
4631 mAttCc1.mCcData.mAttack = attackCategory;
4632 mAttCc1.mCcData.mVsKind =
mCc.mCcData.mVsKind & ~(
4633 BIT_FLAG(CC_KIND_PLAYER) |
4634 BIT_FLAG(CC_KIND_PLAYER_ATTACK) |
4635 BIT_FLAG(CC_KIND_YOSHI)
4639void daPlBase_c::setCcAtSlip() {
4640 setCcAtBody(CC_ATTACK_SLIP);
4643void daPlBase_c::setCcAtPenguinSlip() {
4645 setCcAtBody(CC_ATTACK_PENGUIN_SLIDE);
4646 mAttCc2.mCcData.mVsDamage = BIT_FLAG(CC_ATTACK_PENGUIN_SLIDE);
4647 mAttCc1.mCcData.mVsDamage = BIT_FLAG(CC_ATTACK_PENGUIN_SLIDE);
4651void daPlBase_c::setCcAtHipAttack() {
4652 setCcAtBody(CC_ATTACK_HIP_ATTACK);
4653 mAttCc2.mCcData.mVsDamage = 0;
4654 mAttCc1.mCcData.mVsDamage = 0;
4657void daPlBase_c::setCcAtStar() {
4658 mCc.mCcData.mAttack = CC_ATTACK_STAR;
4659 if ((mAttCc2.mCcData.mVsKind & (
4660 BIT_FLAG(CC_KIND_PLAYER) |
4661 BIT_FLAG(CC_KIND_PLAYER_ATTACK) |
4662 BIT_FLAG(CC_KIND_YOSHI)
4664 mCc1.mCcData.mAttack = CC_ATTACK_STAR;
4666 if (mAttCc1.mCcData.mAttack != CC_ATTACK_NONE &&
4667 mAttCc1.mCcData.mAttack != CC_ATTACK_YOSHI_EAT
4669 mAttCc3.mCcData.mBase.mOffset.set(mAttCc1.mCcData.mBase.mOffset);
4670 mAttCc3.mCcData.mBase.mSize.set(mAttCc1.mCcData.mBase.mSize);
4671 mAttCc3.mCcData.mAttack = CC_ATTACK_STAR;
4676void daPlBase_c::setCcAtCannon() {
4677 setCcAtBody(CC_ATTACK_CANNON);
4680void daPlBase_c::entryCollision() {
4682 int lineKind = getCcLineKind();
4683 mCc.mAmiLine = lineKind;
4684 if (mAttCc1.mCcData.mAttack == CC_ATTACK_WIRE_NET) {
4687 mAttCc1.mAmiLine = lineKind;
4688 mAttCc3.mAmiLine = lineKind;
4693 mCc.mCcData.mStatus |= CC_STATUS_NO_REVISION;
4695 mCc.mCcData.mStatus &= ~CC_STATUS_NO_REVISION;
4703 if (mAttCc1.mCcData.mAttack != CC_ATTACK_NONE) {
4706 if (mAttCc2.mCcData.mAttack != CC_ATTACK_NONE) {
4709 if (mAttCc3.mCcData.mAttack != CC_ATTACK_NONE) {
4715bool daPlBase_c::isActionRevisionY() {
4722void daPlBase_c::setCcPlayerRev(
dCc_c *cc1,
dCc_c *cc2,
float revRate,
int ccKind) {
4723 daPlBase_c *other = (daPlBase_c *) cc2->
mpOwner;
4724 float colliderSpeedF = other->
mSpeedF;
4725 float offsX = cc1->mCollOffsetX[ccKind];
4726 float offsY = cc1->mCollOffsetY[ccKind];
4727 if (isActionRevisionY()) {
4728 if (other->isActionRevisionY()) {
4729 if (mCcHasInitialRevY) {
4730 mCcRevTotalOffsY = offsY + mCcRevTotalOffsY;
4732 mCcHasInitialRevY =
true;
4733 mCcRevTotalOffsY = offsY * revRate;
4736 }
else if (!(std::fabs(offsY) < 1.0f || other->isActionRevisionY())) {
4738 float prevOffsX = getCcRevOffsX() * getCcRevRate();
4739 float currOffsX = offsX * revRate;
4740 if (std::fabs(prevOffsX) < std::fabs(currOffsX)) {
4741 mCcRevSpeedF = colliderSpeedF;
4744 mCcRevTotalOffsX = prevOffsX + currOffsX;
4747 mCcRevSpeedF = colliderSpeedF;
4748 mCcRevTotalOffsX = offsX;
4754void daPlBase_c::clearCcPlayerRev() {
4756 mCcRevSpeedF = 0.0f;
4757 mCcRevTotalOffsX = 0.0f;
4758 mCcRevTotalOffsY = 0.0f;
4760 mCcHasInitialRevY =
false;
4763bool daPlBase_c::calcCcPlayerRev(
float *outShiftX) {
4769 if (isDemoType(DEMO_PLAYER) && isNowBgCross(
BGC_FOOT)) {
4772 float prevOffsX = mCcRevTotalOffsX;
4773 mCcRevTotalOffsX = 0.0f;
4775 float shiftX = prevOffsX * rate;
4777 if (shiftX > 3.0f) {
4779 }
else if (shiftX < -3.0f) {
4782 if (
mSpeedF * prevOffsX <= 0.0f) {
4783 *outShiftX = shiftX;
4784 if (isDemoType(DEMO_PLAYER) ||
isStatus(STATUS_5F)) {
4787 float revSpeedF = mCcRevSpeedF;
4790 speedF * revSpeedF <= 0.0f &&
4791 std::fabs(
mSpeedF) + std::fabs(mCcRevSpeedF) > 2.5f
4793 mSpeedF = mCcRevSpeedF * 0.4f;
4797 std::fabs(
mSpeedF) > std::fabs(mCcRevSpeedF) &&
4809bool daPlBase_c::isEnableStampPlayerJump(
dCc_c *cc1,
dCc_c *cc2) {
4810 daPlBase_c *other = (daPlBase_c *) cc2->
mpOwner;
4823 if (isDemoType(DEMO_PLAYER) || other->isDemoType(DEMO_PLAYER)) {
4826 float topPos = cc2->getTopPos() - 16.0f;
4827 if (topPos < cc2->getCenterPosY()) {
4828 topPos = cc2->getCenterPosY();
4830 if (cc1->getUnderPos() > topPos) {
4836void daPlBase_c::setStampReduction() {
4841 setReductionScale();
4847void daPlBase_c::setStampPlayerJump(
bool b,
float yOffset) {
4849 float jumpSpeed = daPlBase_c::sc_JumpSpeed;
4850 if (isMameAction()) {
4851 jumpSpeed = daPlBase_c::sc_JumpSpeed - 0.35f;
4854 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_7, 0,
false);
4855 if (mKey.buttonJump()) {
4856 jumpSpeed = daPlBase_c::sc_JumpSpeed + 0.5f;
4868void daPlBase_c::setReductionScale() {
4869 setReductionBoyon();
4870 initStampReduction();
4873void daPlBase_c::initStampReduction() {
4879 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_7, 0,
false);
4882void daPlBase_c::calcJumpDaiReductionScale(
int i1,
int i2) {
4890void daPlBase_c::setReductionBoyon() {
4895void daPlBase_c::calcReductionScale() {
4902 case SQUISH_SET_REDUCTION:
4903 setReductionBoyon();
4905 case SQUISH_ANIMATION:
4908 static const float scStampScaleDt[] = { 0.0f, 0.2f, 0.0f, 0.4f };
4909 static const float scStampAcceleDt[] = { 0.02f, 0.025f, 0.04f, 0.06f };
4921mVec3_c daPlBase_c::getReductionModelScale() {
4929void daPlBase_c::setNoHitPlayer(
const daPlBase_c *player,
int duration) {
4934void daPlBase_c::updateNoHitPlayer() {
4943daPlBase_c *daPlBase_c::getHipAttackDamagePlayer() {
4947void daPlBase_c::setHipAttackDamagePlayer(
daPlBase_c *player) {
4952void daPlBase_c::clearHipAttackDamagePlayer() {
4957void daPlBase_c::setNoHitObjBg(
dActor_c *obj,
int duration) {
4958 mBc.mpNoHitActor = obj;
4959 mNoHitObjTimer = duration;
4962void daPlBase_c::calcNoHitObjBgTimer() {
4963 if (mNoHitObjTimer == 0) {
4966 if (--mNoHitObjTimer == 0) {
4967 mBc.mpNoHitActor =
nullptr;
4971void daPlBase_c::setOldBGCross() {
4972 mOldBgCross1 = mNowBgCross1;
4973 mOldBgCross2 = mNowBgCross2;
4974 for (
int i = 9; i > 0; i--) {
4975 mBgFootHistory[i] = mBgFootHistory[i - 1];
4977 mBgFootHistory[0] = isNowBgCross(
BGC_FOOT) ? 1 : 0;
4980void daPlBase_c::clearBgCheckInfo() {
4983 mPrevStandOnUnitType = mStandOnUnitType;
4984 mStandOnUnitType = 0;
4986 mExtraPushForceX = 0.0f;
4987 mGroundType = GROUND_TYPE_DEFAULT;
4993void daPlBase_c::bgCheck(
int i) {
5004 checkSideViewLemit();
5017void daPlBase_c::checkBgCross() {
5018 if (mPowerup == POWERUP_MINI_MUSHROOM && (isOldBgCross(BGC_WALL_TOUCH_L_2) | isOldBgCross(BGC_WALL_TOUCH_R_2)) == 0) {
5023 const sBcPointData *wallData = getWallBgPointData();
5024 int wallSize = wallData->mInfMargin + wallData->mSupMargin;
5025 float offset = ((float) wallSize / 4096.0f) / 2.0f;
5032 mPos.x + dir * 3.0f,
5037 if (
mBc.checkWallPlayer(&p1, &p2, &outX) && outX != p1.x) {
5038 mPos.x = outX - dir * 3.0f;
5043 u32 bgFlags =
mBc.checkBgPlr(
this);
5049 mPrevMoveSakaAngle = mMoveSakaAngle;
5050 mPrevStillSakaAngle = mStillSakaAngle;
5051 mStillSakaAngle = 0;
5053 mStandOnUnitType =
mBc.mLastUnitType;
5055 if ((bgFlags & 0x3c000000) != 0) {
5057 if (bgFlags & 0x4000000) {
5058 onNowBgCross(BGC_PRESS_HEAD_HIT);
5060 if (bgFlags & 0x40000000) {
5061 onNowBgCross(BGC_63);
5063 if (bgFlags & 0x80000000) {
5064 onNowBgCross(BGC_NON_BREAK_BLOCK_HIT);
5066 if (
mBc.getHeadAttr() == 6) {
5067 onNowBgCross(BGC_HANG_ROPE);
5069 if (bgFlags & 0x20000000) {
5070 onNowBgCross(BGC_BLOCK_HIT);
5073 onNowBgCross(BGC_58);
5076 onNowBgCross(BGC_57);
5079 if (
mBc.mpCtrFoot !=
nullptr &&
5080 mBc.mpCtrFoot->mpActor !=
nullptr &&
5082 mBc.mpCtrFoot->mpActor->mProfName != fProfile::EN_HATENA_BLOCK_LINE &&
5083 mBc.mpCtrFoot->mpActor->mProfName != fProfile::EN_RENGA_BLOCK_LINE
5086 onNowBgCross(BGC_LINE_BLOCK_HIT);
5091 if (bgFlags & 0x1fe000) {
5092 mMoveSakaAngle =
mBc.getSakaAngleBySpeed(
mSpeedF);
5093 mStillSakaAngle =
mBc.getSakaAngle(0);
5094 if (bgFlags & 0x4000) {
5095 onNowBgCross(BGC_SLOPE);
5097 if (bgFlags & 0x400000) {
5098 onNowBgCross(BGC_62);
5100 if (bgFlags & 0x800000) {
5101 onNowBgCross(BGC_COIN_BLOCK_HIT);
5103 if (bgFlags & 0x1000000) {
5104 onNowBgCross(BGC_36);
5106 if (mMoveSakaAngle > 0 && isNowBgCross(
BGC_HEAD)) {
5107 onNowBgCross(BGC_SLOPE_AND_HEAD);
5110 u16 footAttr =
mBc.getFootAttr();
5113 onNowBgCross(BGC_ON_SINK_SAND);
5116 onNowBgCross(BGC_AUTOSLIP);
5119 onNowBgCross(BGC_ON_BELT_R);
5122 onNowBgCross(BGC_ON_BELT_L);
5127 if (bgFlags & 0x200000) {
5128 onNowBgCross(BGC_SEMISOLID);
5130 if (bgFlags & 0x18000) {
5134 onNowBgCross(BGC_GROUNDED_MOVE_UP);
5138 mGroundType = GROUND_TYPE_SNOW;
5139 onNowBgCross(BGC_ON_SNOW);
5143 onNowBgCross(BGC_ON_SAND);
5145 mGroundType = GROUND_TYPE_FUNSUI;
5147 mGroundType = GROUND_TYPE_SAND;
5151 onNowBgCross(BGC_ON_SAND);
5152 mGroundType = GROUND_TYPE_BEACH;
5155 mGroundType = GROUND_TYPE_DIRT;
5158 mGroundType = GROUND_TYPE_ICE;
5159 if (bgFlags & 0x2000000) {
5160 onNowBgCross(BGC_ON_ICE_LOW_SLIP);
5162 onNowBgCross(BGC_ON_ICE);
5173 if (dBc_c::checkGround(&tmp, &groundHeight,
mLayer, mAmiLayer, 8)) {
5174 if (std::fabs(groundHeight -
mPos.y) < 2.0f) {
5175 onNowBgCross(BGC_CLIFF);
5179 onNowBgCross(BGC_CLIFF);
5183 mGroundType = GROUND_TYPE_CLOUD;
5186 mGroundType = GROUND_TYPE_CARPET;
5190 if (bgFlags & 0x40000) {
5191 mGroundType = GROUND_TYPE_MANTA;
5193 if (bgFlags & 0x80000) {
5194 mGroundType = GROUND_TYPE_LEAF;
5196 if (bgFlags & 0x100000) {
5197 mGroundType = GROUND_TYPE_WOOD;
5203 mPos.y = mRideNutHeight;
5207 float s = getModelHeight() +
mPos.y;
5208 mVec3_c checkPos(
mPos.x, s + 8.0f,
mPos.z);
5211 if (dBc_c::checkGround(&checkPos, &groundHeight, &groundType,
mLayer, mAmiLayer, 8)) {
5212 if (checkPos.y >= groundHeight && s <= groundHeight) {
5213 if (groundType == 2) {
5214 onNowBgCross(BGC_CLIFF_ABOVE_2);
5216 onNowBgCross(BGC_CLIFF_ABOVE_1);
5229 if (bgFlags & 0x1fe000) {
5233 if (dBc_c::checkGroundHalf(&
mPos, &groundY3,
mLayer, mAmiLayer) && (
mPos.y - 16.0f < groundY3)) {
5238 if (bgFlags & 0x100) {
5239 onNowBgCross(BGC_61);
5242 onNowBgCross(BGC_WALL_TOUCH_L_2);
5245 onNowBgCross(BGC_WALL_TOUCH_R_2);
5248 if ((isNowBgCross(BGC_WALL_TOUCH_L_2) | isNowBgCross(BGC_WALL_TOUCH_R_2)) != 0) {
5250 mAdjacentSlopeAngle =
mBc.mAdjacentSlopeAngle;
5252 if (isNowBgCross(BGC_WALL_TOUCH_L_2)) {
5255 }
else if (sx > 0.0f) {
5256 if (isNowBgCross(BGC_WALL_TOUCH_R_2)) {
5260 static const int flags[] = { 0x1, 0x2 };
5267 if (bgFlags & 0xc0) {
5268 dBg_ctr_c *ctrWall =
mBc.mpCtrWall;
5270 if (ctrWall->m_d0 & 0x800000) {
5271 onNowBgCross(BGC_11);
5273 if (ctrWall->m_c8 == 0 && *ctrWall->mRotation != 0) {
5274 onNowBgCross(BGC_11);
5277 if (bgFlags & 0x80) {
5279 if (isCarryObjBgCarried(1)) {
5283 if (bgFlags & 0x40) {
5285 if (isCarryObjBgCarried(0)) {
5291 if (bgFlags & 0x2a) {
5292 onNowBgCross(BGC_WALL_TOUCH_L);
5294 if (bgFlags & 0x15) {
5295 onNowBgCross(BGC_WALL_TOUCH_R);
5297 if (bgFlags & 0x800) {
5298 onNowBgCross(BGC_12);
5300 if (bgFlags & 0x1000) {
5301 onNowBgCross(BGC_13);
5304 if (isNowBgCross(BGC_ON_SINK_SAND)) {
5317 if (isNowBgCross(
BGC_HEAD) && isNowBgCross(BGC_PRESS_HEAD_HIT) && !isNowBgCross(BGC_63)) {
5318 setBgPressReq(
nullptr, BG_PRESS_HEAD);
5321 setBgPressReq(
nullptr, BG_PRESS_FOOT);
5324 setBgPressReq(
nullptr, BG_PRESS_L);
5327 setBgPressReq(
nullptr, BG_PRESS_R);
5331bool daPlBase_c::isCarryObjBgCarried(u8 side) {
5332 dBg_ctr_c *ctrWall =
mBc.mpCtrWalls[side];
5333 if (ctrWall !=
nullptr) {
5334 mVec2_c diff = ctrWall->m_a0 - ctrWall->m_ac;
5335 set_m_d80(side, diff.x);
5336 if (ctrWall->m_d0 & 0x800) {
5337 dActor_c* carriedActor = ctrWall->mpActor;
5338 if (carriedActor !=
nullptr && carriedActor->
checkCarried(
nullptr)) {
5347void daPlBase_c::postBgCross() {
5352 !isNowBgCross(BGC_57) &&
5353 !isNowBgCross(BGC_63) &&
5354 !isNowBgCross(BGC_HANG_ROPE)
5357 if (mPowerup == POWERUP_MINI_MUSHROOM) {
5360 if (isNowBgCross(BGC_NON_BREAK_BLOCK_HIT)) {
5361 startSound(SE_PLY_HIT_BLOCK_BOUND, m,
false);
5362 }
else if (isNowBgCross(BGC_BLOCK_HIT)) {
5363 if (isNowBgCross(BGC_58)) {
5366 startSound(SE_PLY_HIT_GENERAL_OBJ, m,
false);
5375 mNoGravityTimer = 0;
5380 if (isNowBgCross(BGC_ON_BELT_L) | isNowBgCross(BGC_ON_BELT_R)) {
5385 }
else if (isNowBgCross(BGC_ON_SINK_SAND)) {
5397 mGroundType = GROUND_TYPE_WATER;
5417 if (std::fabs(
add) > 0.01f && std::fabs(
add) < 1.0f) {
5430float daPlBase_c::getWaterCheckPosY() {
5431 static const float scWaterOffsetY[] = { 4.0f, 8.0f, 16.0f };
5432 return mPos.y + scWaterOffsetY[getTallType(-1)];
5435void daPlBase_c::checkWater() {
5437 mPrevWaterHeight = mWaterHeight;
5438 mWaterHeight = dBg_c::m_bg_p->m_8fe00;
5439 u8 waterCheck = dBc_c::checkWater(
mPos.x,
mPos.y,
mLayer, &mWaterHeight);
5440 if (waterCheck != dBc_c::WATER_CHECK_NONE &&
mPos.y <= mWaterHeight) {
5442 if (waterCheck == dBc_c::WATER_CHECK_WATER_BUBBLE) {
5446 if (waterCheck == dBc_c::WATER_CHECK_NONE || waterCheck == dBc_c::WATER_CHECK_WATER_BUBBLE) {
5447 waterCheck = dBc_c::checkWater(
mPos.x, getWaterCheckPosY(),
mLayer, &mWaterHeight);
5448 if (waterCheck != dBc_c::WATER_CHECK_WATER_BUBBLE) {
5454 switch (waterCheck) {
5455 case dBc_c::WATER_CHECK_WATER_BUBBLE: {
5458 dBc_c::getAirWaterHitPos(&pos);
5459 mAirWaterHitPos.set(pos.x, pos.y,
mPos.z);
5461 dBc_c::getAirWaterHitAngle(&s);
5462 mAirWaterHitAngle = s;
5465 case dBc_c::WATER_CHECK_WATER: {
5466 if (getWaterCheckPosY() <= mWaterHeight) {
5469 const sBcPointData *p = getHeadBgPointData();
5470 float f = p->mOffset;
5471 if (
mPos.y + f / 4096.0f <= mWaterHeight) {
5474 mWaterDepth = dBc_c::checkWaterDepth(
mPos.x, mWaterHeight,
mLayer, mAmiLayer,
nullptr);
5477 case dBc_c::WATER_CHECK_YOGAN:
5478 case dBc_c::WATER_CHECK_POISON:
5486void daPlBase_c::checkDamageBg() {
5494 if (!isDemoAll() || isDemoType(DEMO_KINOPIO)) {
5495 mIsBgDamage =
mBc.m_e0;
5496 mBgDamageType =
mBc.m_e1;
5498 case dBc_c::WATER_CHECK_YOGAN:
5502 case dBc_c::WATER_CHECK_POISON:
5510bool daPlBase_c::setBgDamage() {
5512 mIsBgDamage =
false;
5513 DamageType_e damageType = DAMAGE_BG;
5514 switch (mBgDamageType) {
5516 damageType = DAMAGE_YOGAN;
5519 damageType = DAMAGE_POISON;
5522 damageType = DAMAGE_SQUISH;
5525 if (damageType == DAMAGE_BG && isNoDamage()) {
5528 return setDamage2(
nullptr, damageType);
5533bool daPlBase_c::checkSinkSand() {
5536 if (dBc_c::checkGround(&pos, &mSinkSandHeight,
mLayer, mAmiLayer, 3)) {
5537 if (mSinkSandHeight >
mPos.y) {
5538 onNowBgCross(BGC_ON_SINK_SAND);
5541 onNowBgCross(BGC_IN_SINK_SAND);
5543 if (mSinkSandHeight >
mPos.y + getModelHeight()) {
5544 onNowBgCross(BGC_INSIDE_SINK_SAND);
5552bool daPlBase_c::checkBGCrossWall(u8 direction) {
5553 static const BgCross1_e flags[] = { BGC_WALL_TOUCH_R_2, BGC_WALL_TOUCH_L_2 };
5554 return isNowBgCross(flags[direction]);
5557void daPlBase_c::checkSideViewLemit() {
5558 if (!daPyDemoMng_c::mspInstance->m_94 && isDemoType(DEMO_PLAYER)) {
5564 if (dScStage_c::m_loopType == 0) {
5565 float tmpL = dBg_c::m_bg_p->getLeftLimit() + mViewLimitPadding;
5566 if (
mPos.x <= tmpL) {
5567 calcSideLimitMultL(tmpL);
5569 float tmpR = dBg_c::m_bg_p->getRightLimit() - mViewLimitPadding;
5570 if (
mPos.x >= tmpR) {
5571 calcSideLimitMultR(tmpR);
5574 checkDispSideLemit();
5577bool daPlBase_c::revSideLimitCommon(
float limitX) {
5578 if (
mPos.x != limitX) {
5580 if (
mPos.x <= limitX) {
5584 u16 ang =
mBc.getSakaMoveAngle(dir);
5586 mPos.y += (limitX -
mPos.x) * (mAng(ang).sin() / mAng(ang).cos());
5595bool daPlBase_c::calcSideLimitMultL(
float limitX) {
5596 onNowBgCross(BGC_SIDE_LIMIT_L);
5597 revSideLimitCommon(limitX);
5609bool daPlBase_c::calcSideLimitMultR(
float limitX) {
5610 onNowBgCross(BGC_SIDE_LIMIT_R);
5611 revSideLimitCommon(limitX);
5623bool daPlBase_c::checkDispSideLemit() {
5627 if (dScStage_c::m_loopType == 1) {
5630 float dispX = dBgParameter_c::ms_Instance_p->getLoopScrollDispPosX(
mPos.x);
5631 float leftLimit = dispX + mViewLimitPadding;
5632 float rightLimit = dispX + dBgParameter_c::ms_Instance_p->xSize() - mViewLimitPadding + 1.0f;
5635 if (
mPos.x < leftLimit) {
5637 calcSideLimitMultL(leftLimit);
5645 if (
mPos.x > leftLimit) {
5648 float diff =
mPos.x - leftLimit;
5661 if (
mPos.x > rightLimit) {
5663 calcSideLimitMultR(rightLimit);
5671 if (
mPos.x < rightLimit) {
5674 float diff =
mPos.x - rightLimit;
5688 if (dBg_c::m_bg_p->mAutoscrolls[0].mActive) {
5691 float dispX = dBgParameter_c::ms_Instance_p->getLoopScrollDispPosX(
mPos.x);
5692 float leftLimit = dispX + mViewLimitPadding;
5693 float rightLimit = dispX + dBgParameter_c::ms_Instance_p->xSize() - mViewLimitPadding + 1.0f;
5694 if (
mPos.x < leftLimit) {
5698 if (
mPos.x > rightLimit) {
5704void daPlBase_c::underOverCheck() {
5705 float tmp = dBgParameter_c::ms_Instance_p->yStart() - dBgParameter_c::ms_Instance_p->ySize();
5706 float bgTop = tmp - 24.0f;
5707 float selfTop =
mPos.y + getVisOffsetY() + getVisSizeY();
5709 if (isItemKinopio()) {
5712 if (!dBg_c::m_bg_p->mAutoscrolls[0].mActive) {
5713 if (dBg_c::m_bg_p->m_90009 == 1 || dBg_c::m_bg_p->m_90009 == 3 || daPyMng_c::mNum > 1) {
5718 if (selfTop < bgTop && selfTop < dBg_c::m_bg_p->m_8fe00) {
5721 }
else if (selfTop < bgTop) {
5726void daPlBase_c::checkDispOver() {
5729 offStatus(STATUS_ITEM_KINOPIO_DISPLAY_OUT);
5734 float adj = dBgParameter_c::ms_Instance_p->yStart() + 96.0f;
5735 if (dScStage_c::m_instance->mCurrWorld == WORLD_1 &&
5736 dScStage_c::m_instance->mCurrCourse == STAGE_CASTLE &&
5737 dScStage_c::m_instance->mCurrFile == 0
5739 adj = dBgParameter_c::ms_Instance_p->yStart() + 192.0f;
5749 checkDisplayOutDead();
5752void daPlBase_c::checkDisplayOutDead() {
5753 float offset = 20.0f;
5754 if (daPyMng_c::mNum > 1 || dBg_c::m_bg_p->m_90009 == 1 || dBg_c::m_bg_p->m_90009 == 3) {
5758 float bgBottom = dBgParameter_c::ms_Instance_p->yStart() - dBgParameter_c::ms_Instance_p->ySize();
5759 float bgSide1 = bgBottom - 16.0f;
5760 float bgSide2 = bgBottom - offset;
5761 float edgePos =
mPos.y + getVisOffsetY() + getVisSizeY();
5762 if (edgePos < bgSide1) {
5765 if (isItemKinopio()) {
5766 onStatus(STATUS_ITEM_KINOPIO_DISPLAY_OUT);
5769 if (edgePos < bgSide2) {
5770 setBalloonInDispOut(3);
5773 float bgTop = dBgParameter_c::ms_Instance_p->yStart();
5774 bgSide1 = bgTop + 16.0f;
5775 edgePos =
mPos.y + getVisOffsetY() - getVisSizeY();
5776 if (edgePos > bgSide1) {
5780 if (isItemKinopio() && edgePos > dBgParameter_c::ms_Instance_p->yStart() + 128.0f) {
5781 onStatus(STATUS_ITEM_KINOPIO_DISPLAY_OUT);
5789 if (dBg_c::m_bg_p->mAutoscrolls[0].mActive && dBg_c::m_bg_p->m_9008e != 4) {
5790 offset = -(mWallBcData.mOffset / 4096.0f - 1.0f + getVisSizeX());
5791 }
else if (daPyMng_c::mNum > 1) {
5796 float bgLeft = dBgParameter_c::ms_Instance_p->getLoopScrollDispPosX(
mPos.x);
5797 bgSide1 = bgLeft - 16.0f;
5798 bgSide2 = bgLeft - offset;
5799 edgePos =
mPos.x + getVisOffsetX() + getVisSizeX();
5800 if (edgePos < bgSide1) {
5803 if (isItemKinopio()) {
5804 onStatus(STATUS_ITEM_KINOPIO_DISPLAY_OUT);
5807 if (edgePos < bgSide2) {
5808 setBalloonInDispOut(2);
5811 bgSide1 = bgLeft + dBgParameter_c::ms_Instance_p->xSize() + 16.0f;
5812 bgSide2 = bgLeft + dBgParameter_c::ms_Instance_p->xSize() + offset;
5813 edgePos =
mPos.x + getVisOffsetX() - getVisSizeX();
5814 if (edgePos > bgSide1) {
5817 if (isItemKinopio()) {
5818 onStatus(STATUS_ITEM_KINOPIO_DISPLAY_OUT);
5821 if (edgePos > bgSide2) {
5822 setBalloonInDispOut(0);
5826void daPlBase_c::setBgPressReq(
dActor_c *actor, BgPress_e i) {
5827 mBgPressActive |= (1 << i);
5828 if (actor !=
nullptr) {
5835bool daPlBase_c::isBgPress(
dActor_c *actor) {
5836 u32 param = mBgPressFlags;
5840 for (
int i = 1; i < BG_PRESS_COUNT; i++) {
5841 if (param & (1 << i) &&
mBgPressIDs[i] == actor->getID()) {
5848bool daPlBase_c::setPressBgDamage(
int i1,
int i2) {
5849 if (i1 == DAMAGE_SQUISH) {
5850 if (setDamage2(
nullptr, DAMAGE_SQUISH)) {
5851 mBc.clearBgcSaveAll();
5855 if (setDamage2(
nullptr, DAMAGE_DEFAULT)) {
5856 mBc.clearBgcSaveAll();
5857 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
5864bool daPlBase_c::isEnablePressUD() {
5865 dBg_ctr_c *ctrHead =
mBc.mpCtrHead;
5866 dBg_ctr_c *ctrFoot =
mBc.mpCtrFoot;
5867 if (ctrHead !=
nullptr && ctrFoot !=
nullptr) {
5868 if (ctrHead == ctrFoot || ctrHead->m_e0 == ctrFoot->m_e0) {
5875bool daPlBase_c::isEnablePressLR() {
5876 dBg_ctr_c *ctrL =
mBc.mpCtrWalls[1];
5877 dBg_ctr_c *ctrR =
mBc.mpCtrWalls[0];
5878 if (ctrL !=
nullptr && ctrR !=
nullptr) {
5879 if (ctrL == ctrR || ctrL->m_e0 == ctrR->m_e0) {
5886bool daPlBase_c::checkPressBg() {
5888 (isNowBgCross(BGC_SIDE_LIMIT_L) && isNowBgCross(BGC_WALL_TOUCH_R_2)) ||
5889 (isNowBgCross(BGC_SIDE_LIMIT_R) && isNowBgCross(BGC_WALL_TOUCH_L_2))
5893 if (dScStage_c::m_instance->mCurrWorld == WORLD_6 &&
5894 dScStage_c::m_instance->mCurrCourse == STAGE_CASTLE &&
5895 dScStage_c::m_instance->mCurrFile == 1 &&
5898 if (setPressBgDamage(DAMAGE_SQUISH, 1)) {
5899 mBgPressFlags |= 0x8;
5903 if (mBgPressActive & 0x20a && mBgPressActive & 0x414 && isEnablePressUD()) {
5904 if (mBgPressActive & 0x18 && setPressBgDamage(DAMAGE_SQUISH, 1)) {
5905 if (mBgPressActive & 0x8) {
5906 mBgPressFlags |= 0x8;
5908 if (mBgPressActive & 0x10) {
5909 mBgPressFlags |= 0x10;
5913 if (mBgPressActive & 6 && setPressBgDamage(DAMAGE_BG, 1)) {
5914 if (mBgPressActive & 2) {
5915 mBgPressFlags |= 0x2;
5917 if (mBgPressActive & 4) {
5918 mBgPressFlags |= 0x4;
5926 if (mBgPressActive & 0x1140 && mBgPressActive & 0x8a0 && isEnablePressLR()) {
5927 if (mBgPressActive & 0x60 && setPressBgDamage(DAMAGE_SQUISH, 0)) {
5928 if (mBgPressActive & 0x20) {
5929 mBgPressFlags |= 0x20;
5931 if (mBgPressActive & 0x40) {
5932 mBgPressFlags |= 0x40;
5936 if (mBgPressActive & 0x180 && setPressBgDamage(DAMAGE_BG, 0)) {
5937 if (mBgPressActive & 0x80) {
5938 mBgPressFlags |= 0x80;
5940 if (mBgPressActive & 0x100) {
5941 mBgPressFlags |= 0x100;
5953bool daPlBase_c::isRideCheckEnable() {
5959 if (rideActor !=
nullptr && rideActor->
mSpeed.y > 0.0f) {
5968 mExtraPushForceX = f;
5971bool daPlBase_c::checkInsideCrossBg(
float f) {
5973 if (wallBg ==
nullptr) {
5976 const sBcPointData *footBg = getFootBgPointData();
5977 if (footBg ==
nullptr) {
5981 footBg->mInfMargin / 4096.0f + f,
5982 footBg->mSupMargin / 4096.0f - f
5985 wallBg->mInfMargin / 4096.0f,
5986 wallBg->mSupMargin / 4096.0f
5988 for (
int i = 0; i < 2; i++) {
5989 mVec3_c modPos = mVec3_c(
5996 modPos.x + offs2[0],
6000 if (
mBc.checkWallPlayer(&modPos, ©,
nullptr)) {
6004 modPos.x + offs2[1],
6008 if (
mBc.checkWallPlayer(&modPos, ©,
nullptr)) {
6019bool daPlBase_c::isMameAction() {
6020 if (mPowerup == POWERUP_MINI_MUSHROOM && !isLiftUpExceptMame()) {
6027 mStatusFlags[
id / 32] = (1 << (
id % 32));
6031 mStatusFlags[
id / 32] |= (1 << (
id % 32));
6035 mStatusFlags[
id / 32] &= ~(1 << (
id % 32));
6039 return mStatusFlags[
id / 32] & (1 << (
id % 32));
6042u8 daPlBase_c::getTallType(s8) {
6046void daPlBase_c::calcTimerProc() {
6048 if (mDamageInvulnTimer < 60) {
6049 if (mDamageInvulnTimer & 4) {
6052 }
else if (mDamageInvulnTimer & 8) {
6069 updateNoHitPlayer();
6070 calcNoHitObjBgTimer();
6074 return mpMdlMng->mpMdl;
6077void daPlBase_c::calcPlayerSpeedXY() {
6078 static const float ratios[] = { 0.6f, 0.55f, 0.5f, 0.45f, 0.4f };
6079 float extraXAccel = 0.0f;
6080 float ccRevShiftX = 0.0f;
6081 bool x = calcCcPlayerRev(&ccRevShiftX);
6087 int v = getFollowMameKuribo() - 1;
6106 if (std::fabs(
mSpeedF) > std::fabs(b)) {
6118 if (std::fabs(b) > 5.0f) {
6123 float f =
mSpeedF + mWindSpeed;
6132 if (f * ccRevShiftX >= 0.0f) {
6133 mVec3_c wallvec1(
mPos.x + f + ccRevShiftX,
mPos.y + getModelHeight() / 2.0f,
mPos.z);
6134 mVec3_c wallvec2(wallvec1.x + f + ccRevShiftX, wallvec1.y, wallvec1.z);
6138 if (dBc_c::checkWall(&wallvec1, &wallvec2, &g,
mLayer, mAmiLayer,
nullptr)) {
6143 extraXAccel += ccRevShiftX;
6145 if (mFinalAirPushForceX != 0.0f) {
6147 extraXAccel += mFinalAirPushForceX;
6149 if (mFinalAirPushForceX *
mSpeedF < 0.0f) {
6150 mSpeedF += mFinalAirPushForceX;
6152 mFinalAirPushForceX = 0.0f;
6156 if (m_1138 != 0.0f) {
6158 extraXAccel += m_1138;
6171 if (isNowBgCross(BGC_ON_SINK_SAND) | isNowBgCross(BGC_IN_SINK_SAND)) {
6192 posMoveAnglePlayer(speed);
6195void daPlBase_c::posMoveAnglePenguin(
mVec3_c a,
unsigned short b) {
6196 mVec3_c _40(0.0f, a.y, 0.0f);
6198 if (isNowBgCross(
BGC_HEAD) && (_40.y > 0.0f)) {
6202 _40.x = sc_DirSpeed[
mDirection] * std::fabs(a.y * angle.
sin());
6205 _40.y = a.y * std::fabs(angle.
cos());
6208 if (isNowBgCross(
BGC_FOOT) && (a.y < 0.0f)) {
6212 _40.x = sc_DirSpeed[
mDirection] * std::fabs(a.y * angle.
sin());
6215 _40.y = a.y * std::fabs(angle.
cos());
6218 float x_mag = std::fabs(a.x);
6221 _40.x + x_mag * mAng(b).cos(),
6222 _40.y + x_mag * mAng(b).sin(),
6229void daPlBase_c::posMoveAnglePlayer(
mVec3_c a) {
6231 ((a.x > 0.0f && isNowBgCross(BGC_WALL_TOUCH_R_2)) || (a.x < 0.0f && isNowBgCross(BGC_WALL_TOUCH_L_2))) &&
6232 (std::fabs(a.x) > 2.5f)
6246 u16 x =
mBc.getSakaMoveAngle(dir);
6248 x =
mBc.getHeadSakaMoveAngle(dir);
6252 posMoveAnglePenguin(a, x);
6258 x2 = mAdjacentSlopeAngle;
6261 float x_mag = std::fabs(a.x);
6265 x_mag * mAng(x).cos() - y * mAng(x2).sin(),
6266 x_mag * mAng(x).sin() + y * std::fabs(mAng(x2).cos()),
6273const sSpeedData *daPlBase_c::getSpeedData() {
6275 return mSpeedDataStar;
6277 return mSpeedDataNormal;
6281void daPlBase_c::setZPosition() {
6286 if ((mAmiLayer == 1) && (
mLayer == 0)) {
6287 mPos.z = 3000.0f - (float) (mPlayerLayer * 32);
6289 mPos.z = -1800.0f - (float) (mPlayerLayer * 32);
6293void daPlBase_c::setZPosition(
float a) {
6295 mPos.z = a - (float) (mPlayerLayer * 32);
6298void daPlBase_c::setZPositionDirect(
float a) {
6303void daPlBase_c::offZPosSetNone() {
6307float daPlBase_c::setJumpAddSpeedF(
float a) {
6320 mFinalAirPushForceX = a;
6324float daPlBase_c::setAddLiftSpeedF() {
6325 float t = mExtraPushForceX;
6327 if (
isStatus(STATUS_EXTRA_PUSH_FORCE)) {
6328 t = mExtraPushForceX * 0.4f;
6334bool daPlBase_c::setDelayHelpJump() {
6335 if (mKey.triggerJump() && std::fabs(
mSpeedF) > 1.3f) {
6338 if (mBgFootHistory[0]) {
6340 }
else if (mBgFootHistory[1]) {
6356 if (isNowBgCross(
BGC_HEAD) && !isNowBgCross(BGC_LINE_BLOCK_HIT)) {
6360 if ((mpMdlMng->mpMdl->mFlags & 1) && checkStandUpRoofOnLift()) {
6361 return setCrouchJump();
6364 if (mKey.triggerJump()) {
6373bool daPlBase_c::checkJumpTrigger() {
6374 if (isNowBgCross(
BGC_FOOT) && !isNowBgCross(BGC_CLIFF)) {
6382bool daPlBase_c::isNoDamage() {
6386bool daPlBase_c::setDamage(
dActor_c *, daPlBase_c::DamageType_e) {
6390bool daPlBase_c::setForcedDamage(
dActor_c *, daPlBase_c::DamageType_e) {
6394bool daPlBase_c::setDamage2(
dActor_c *, daPlBase_c::DamageType_e) {
6406bool daPlBase_c::setWaitJump(
float jumpSpeed) {
6417bool daPlBase_c::setSwimSpeed(
float a,
float b) {
6421void daPlBase_c::onFollowMameKuribo() {
6423 mNewFollowMameKuribo++;
6426void daPlBase_c::clearFollowMameKuribo() {
6428 mFollowMameKuribo = mNewFollowMameKuribo;
6429 mNewFollowMameKuribo = 0;
6432u32 daPlBase_c::getFollowMameKuribo() {
6433 return mFollowMameKuribo;
6436bool daPlBase_c::isMaskDraw() {
6443void daPlBase_c::setRideNat(
float nutHeight) {
6445 mRideNutHeight = nutHeight;
6448void daPlBase_c::updateRideNat() {
6450 if (!
isStatus(STATUS_RIDE_NUT_2) &&
mPos.y <= mRideNutHeight) {
6459 if (suppressionMode == 1 &&
isStatus(STATUS_ENDING_DANCE_AUTO)) {
6472 mSndObj.startSound(soundID, 0);
6478 mSndObj.startSound(soundID, s, 0);
6484 mSndObj.holdSound(soundID, 0);
6490 mSndObj.holdSound(soundID, s, 0);
6496 mSndObj.fn_8019AAB0(a, 0);
6502 mSndObj.fn_8019ABB0(a, 0);
6506void daPlBase_c::startFootSoundPlayer(
unsigned long a) {
6508 mSndObj.startFootSound(a, std::fabs(
mSpeedF), 0);
6512void daPlBase_c::setItemCompleteVoice() {
6516void daPlBase_c::setStar(daPlBase_c::StarSet_e,
int) {}
6518void daPlBase_c::clearTreadCount() {
6522s8 daPlBase_c::calcTreadCount(
int max) {
6523 if (mTreadCount < max) {
6530void daPlBase_c::clearStarCount() {
6534s8 daPlBase_c::calcStarCount(
int max) {
6535 if (isStar() && mStarCount < max) {
6542void daPlBase_c::clearComboCount() {
6546s8 daPlBase_c::calcComboCount(
int max) {
6547 if (mPlComboCount < max) {
6550 return mPlComboCount;
6553void daPlBase_c::startQuakeShock(dQuake_c::TYPE_SHOCK_e arg) {
6554 dQuake_c::m_instance->shockMotor(
mPlayerNo, arg, 0,
false);
6557void daPlBase_c::startPatternRumble(
const char *pattern) {
6558 if (dRemoconMng_c::m_instance->mRemocons[
mPlayerNo]->mIsRumbleEnabled) {
6559 mPad::g_core[dRemoconMng_c::m_instance->mRemocons[
mPlayerNo]->mControllerID]->startPatternRumble(pattern, 0,
false);
6563mVec3_c daPlBase_c::getAnkleCenterPos() {
6567 mpMdlMng->mpMdl->getJointPos(&joint4Pos, 4);
6568 mpMdlMng->mpMdl->getJointPos(&joint7Pos, 7);
6570 return (joint4Pos + joint7Pos) / 2.0f;
6573void daPlBase_c::calcHeadAttentionAngle() {
6580 mpMdlMng->getAng().y,
6581 mpMdlMng->getAng().z
6585 if ((mpMdlMng->mpMdl->mFlags & 0x80) || (mpMdlMng->mpMdl->mFlags & 0x100)) {
6589 daPlBase_c *pdVar10 =
nullptr;
6591 if (mpMdlMng->mpMdl->mFlags & 0x100) {
6593 pdVar10 = (daPlBase_c *) dAttention_c::mspInstance->searchPlayer(
this, mpMdlMng->getHatPos());
6596 pdVar10 = (daPlBase_c *) dAttention_c::mspInstance->search(mpMdlMng->getHatPos());
6599 if (pdVar10 !=
nullptr) {
6600 mVec3_c hatPos = mpMdlMng->getHatPos();
6601 mVec3_c _60 = mVec3_c(
6625 short iVar2 = (temp -
mAngle.y.mAngle);
6628 mpMdlMng->mpMdl->m_204 = 2;
6630 int r29 = mpMdlMng->mpMdl->mFlags & 0x100;
6631 s16 r30_tmp = 0x5000;
6636 int r3 = abs(iVar2);
6651 float tmpf = std::fabs(mAng(r3 / 2.0f).cos());
6655 }
else if (abs(iVar2) < 0x4000) {
6656 mpMdlMng->mpMdl->m_204 = 1;
6669 mpMdlMng->setAng(angle);
6671 if (!cond && angle.z == 0 && abs(angle.y.
mAngle -
mAngle.y.mAngle) < 0x100) {
6672 mpMdlMng->mpMdl->m_204 = 0;
6681 mpMdlMng->setAng(angle);
6682 mpMdlMng->mpMdl->m_204 = 0;
void add(cOwnerSetNd_c *nd, void *owner)
Adds a node to the set.
void onStatus(u16 status)
Enables a status flag. status is a STATUS_e.
bool buttonWalk(int *direction) const
Returns whether left / right is pressed down. Sets the direction to 0 for right and 1 for left.
@ STATUS_FORCE_NO_JUMP
Force a jump input to be ignored.
@ STATUS_FORCE_RIGHT
Override the input to always only be the right button.
@ STATUS_DISABLE_LR
Disable left and right directional buttons.
@ STATUS_FORCE_JUMP
Force the jump button to be pressed down.
@ STATUS_DEMO
Do not use inputs from the remote.
@ STATUS_NO_INPUT
Disable all inputs.
The minimum required implementation for a stage actor.
static u8 mExecStopReq
The actors for which the execute operation is requested to be disabled.
u8 mExecStopMask
The mask required to disable the execute operation for the actor.
virtual s8 & getPlrNo()
Gets the player number associated with the actor. See mPlayerNo.
dBc_c mBc
The actor-to-tile collision sensor.
virtual mVec2_c getLookatPos() const
Gets the position players look to when focused on the actor.
u8 mKind
The actor's kind. Value is a STAGE_ACTOR_KIND_e.
u8 mDirection
The actor's facing direction.
dCc_c mCc
The actor-to-actor collision sensor.
virtual void postExecute(fBase_c::MAIN_STATE_e status)
post method for the execute operation.
virtual int preExecute()
pre method for the execute operation.
s8 mPlayerNo
The player associated with the actor, -1 if not associated to any player.
bool checkCarried(int *playerNum)
Returns whether the actor is being carried by a player.
dActor_c()
Constructs a new actor.
dRc_c mRc
The actor's ride surface manager.
@ STAGE_ACTOR_YOSHI
The Yoshi actor.
u8 mLayer
The actor's layer.
bool mVisible
Whether the actor should be visible or not. Defaults to true .
virtual int preDraw()
pre method for the draw operation.
float mAccelF
The actor's horizontal acceleration.
mVec3_c mSpeed
The actor's speed.
mVec3_c mLastPos
The actor's position in the previous frame.
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.
mVec3_c getCenterPos() const
Gets the actor's centered position.
mAng3_c mAngle
The actor's rotation (for 2D actors).
float mAccelY
The actor's vertical acceleration.
float mMaxSpeedF
The actor's maximum horizontal speed.
Collider ("Collision Check") class - handles collisions between actors.
dActor_c * mpOwner
The actor this collider belongs to.
static unsigned int mGameFlag
See GAME_FLAG_e.
@ GAME_FLAG_MULTIPLAYER_MODE
Whether the game is in a multiplayer mode.
@ GAME_FLAG_IS_COIN_BATTLE
Whether the game is in Coin Battle mode.
void setBattleCoin(int plrNo, int value)
Rewards a battle coin to a player.
void setClapSE()
Plays the clap sound effect.
static dMultiMng_c * mspInstance
The instance of this class.
static dNext_c * m_instance
The singleton instance of this class.
bool mStartSceneChange
Whether a scene change should be performed next time execute() is called.
void setChangeSceneNextDat(u8 fileIdx, u8 nextGoto, dFader_c::fader_type_e faderType)
Updates the saved entrance data for the next scene change if not already set.
static sRailInfoData * getRailInfoP(u8 id)
Gets the rail data for the specified ID.
void fn_800e25a0(ulong, int, int)
The base class for the player and Yoshi.
virtual void changeState(const sStateIDIf_c &stateID, void *arg)
Transitions to a new state with the given state ID and argument.
int mDokanEnterNextGotoID
Value is a ControlDemoState_e.
bool suppressSound(int suppressionMode)
void onStatus(int id)
Enables the status with the given ID. See Status_e.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoInWaterTank
Entering an area via a water tank pipe.
virtual void setPowerup(PLAYER_POWERUP_e, int)
void offStatus(int id)
Disables the status with the given ID. See Status_e.
int mTimer_a8
[Seems unused - set to 0 when leaving a rolling hill].
float mSquishScale
The current scale of the player during the squish animation.
void startSound(ulong soundID, bool)
int mSquishNoMoveTimer
Timer for how long to freeze the squished player in position.
@ KANI_ARG_JUMP_HANG
Falling onto the cliff, immediately hang from it.
virtual void holdPlayerVoice(int, int)
void holdSound(ulong soundID, bool)
void setExtraPushForce(float f)
static sFStateVirtualID_c< daPlBase_c > StateID_DemoOutWaterTank
Leaving an area via a water tank pipe.
void setDemoOutNextGotoBlock(int nextGotoID, int delay, int fadeType)
@ BGC_WATER_SUBMERGED
Fully submerged in water.
@ BGC_WATER_SHALLOW
At least slightly inside of water (hip height or higher).
@ BGC_HEAD
Colliding with the head sensor.
@ BGC_OBJBG_TOUCH_CARRIED_L
The touching background object on the left is being carried by a player.
@ BGC_OBJBG_TOUCH_R
Touching a background object on the right.
@ BGC_FOOT
Colliding with the foot sensor.
@ BGC_WALL
Colliding with the wall sensor.
@ BGC_OBJBG_TOUCH_CARRIED_R
The touching background object on the right is being carried by a player.
@ BGC_WATER_BUBBLE
Inside a floating water bubble.
@ BGC_OBJBG_TOUCH_L
Touching a background object on the left.
@ BGC_WATER_TOUCH
At least touching water.
sFStateMgr_c< daPlBase_c, sStateMethodUsr_FI_c > mStateMgr
The state manager for regular player states.
float mCcRevRate
Multiplier for position revision for colliders. 1.0f moves to the target immediately.
int mGoalDemoIndex
Indicates where the player is in the order of players which have touched the goal pole,...
mVec3_c mBgPushForce
Belts, quicksand etc.
virtual int create()
do method for the create operation.
bool mIsDemoMode
Whether the player is currently in a demo (cutscene) state.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoOutDokanRoll
Leaving an area via a rolling hill pipe. Argument: None.
int mSquishKeyframeIdx
The current target index for the squishing animation keyframes.
float mDispLimitAdjR
The distance by which the player is too far right.
mEf::levelEffect_c mBrakeSmokeEffect
Smoke when turning around after running.
bool startJump(AnmBlend_e blendMode, int jumpType)
static sFStateVirtualID_c< daPlBase_c > StateID_HipAttack
Ground pounding. Argument: See HipAttackArg_e.
mEf::levelEffect_c mRunEffect
E.g. sand particles / snowflakes when running.
mEf::levelEffect_c mSlipSmokeEffect
Smoke when sliding down a slope or into a cannon.
void getPowerChangeSpeedData(sPowerChangeSpeedData &data)
static sFStateVirtualID_c< daPlBase_c > StateID_Fall
Falling. Argument: Should play animation (bool).
static sFStateVirtualID_c< daPlBase_c > StateID_DemoInDokanU
Entering an area via a pipe above the player. Argument: Pipe type (DokanType_e).
static sFStateVirtualID_c< daPlBase_c > StateID_Kani
Moving on a cliff. Argument: See KaniArg_e.
@ HIP_ATTACK_ARG_PLAYER
A regular player is doing a ground pound.
@ HIP_ATTACK_ARG_ITEM_KINOPIO
The rescue Toad is doing a ground pound out of the item block.
virtual void startPlayerVoice(int, int)
void initDemoInDokanUD(u8)
static sFStateVirtualID_c< daPlBase_c > StateID_JumpDai
Jumping on a spring. Argument: None.
u8 mWaterType
Value is a dBc_c::WATER_TYPE_e.
static sFStateVirtualID_c< daPlBase_c > StateID_Jump
Jumping. Argument: Jump information (jmpInf_c *).
mEf::levelEffect_c mQuicksandSinkEffect
Sand particles when the player is submerged in quicksand.
mVec3_c mJumpDaiOffset
The difference vector between this player and the player being jumped on.
virtual bool _setJump(float jumpSpeed, float speedF, bool allowSteer, int keyMode, int jumpMode)
Starts a jump action unconditionally. See setJump().
@ GOAL_DEMO_POLE_JUMP
Jumping off the pole.
@ GOAL_DEMO_POLE_TURN
Turning toward the screen.
@ GOAL_DEMO_POLE_SWING
Swinging around the pole to the other side.
@ GOAL_DEMO_POLE_WAIT_END
Waiting sc_DemoPoleWaitEnd frames before transitioning to the course clear dance.
@ GOAL_DEMO_POLE_WAIT_JUMP
Waiting at the bottom of the pole to jump off.
@ GOAL_DEMO_POLE_SLIDE
Sliding down the pole.
@ GOAL_DEMO_WAIT_BELOW_PLAYER
Waiting for the player below to slide far enough down the pole to not be in the way of this player.
@ GOAL_DEMO_POLE_WAIT_TURN
Waiting sc_DemoPoleWaitTurn frames to turn toward the screen.
@ GOAL_DEMO_POLE_LAND
Playing the landing animation after landing.
virtual int doDelete()
do method for the delete operation.
int mNoHitTimer
Timer for how long the no-hit status lasts.
static sFStateVirtualID_c< daPlBase_c > StateID_Swim
Swimming. Argument: See SwimArg_e.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoStartWait
Course in default state. Argument: None.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoGoal
Goal pole cutscene. Argument: Is Yoshi (bool).
static sFStateVirtualID_c< daPlBase_c > StateID_DemoControl
Cutscene controlling the player. Argument: See ControlDemoSubstate_e.
virtual int preExecute()
pre method for the execute operation.
sFStateMgr_c< daPlBase_c, sStateMethodUsr_FI_c > mDemoStateMgr
The state manager for demo (cutscene) states.
void calcSpeedOnIceLift()
int mAirWalkTimer
Timer to wait before changing to the falling state after walking off a ledge.
SquishState_e mSquishState
The player's current squish state for being jumped on by another player.
mEf::levelEffect_c mQuicksandSplashEffect
Sand splash effect when landing on quicksand.
float mKaniHeight
The height of the last cliff the player interacted with.
AnimePlayArg_e
Arguments for transitioning to the animation state.
dEf::followEffect_c mTurnSmokeEffect
The wind effect when turning around after running.
static sFStateVirtualID_c< daPlBase_c > StateID_AnimePlay
Playing a cutscene animation. Argument: See AnimePlayArg_e.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoInDokanD
Entering an area via a pipe below the player. Argument: Pipe type (DokanType_e).
static sFStateVirtualID_c< daPlBase_c > StateID_DemoInDokanL
Entering an area via a pipe to the left of the player. Argument: Pipe type (DokanType_e).
static const int sc_DemoPoleWaitEnd
Number of frames to wait before doing the course clear pose in the goal pole animation.
DemoWaitArg_e
Arguments for transitioning to the demo wait state.
@ JUMP_DAI_HIGH_JUMP
The jump button was pressed to do a higher jump.
@ JUMP_DAI_MOVE_DOWN
Moving down on the player or spring.
static const int sc_DemoWaitDuration
Number of frames to wait before transitioning from StateID_DemoWait.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoNextGotoBlock
Transition to a new area. Argument: Lower 8 bits: next goto ID, upper 8 bits: fader type (dFader_c::f...
static sFStateVirtualID_c< daPlBase_c > StateID_PlayerJumpDai
Jumping on a player. Argument: None.
float mAirTopHeight
The highest Y position since being on the ground last. Not reset when landing on the ground.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoOutDokanU
Leaving an area via a pipe above the player. Argument: None.
int mDemoStateArg
To be used as an argument to the new demo state.
static const int sc_DokanEnterThreshold
static sFStateVirtualID_c< daPlBase_c > StateID_DemoOutDokanR
Leaving an area via a pipe to the right of the player. Argument: None.
bool isHitGroundKinopioWalk(int, float, int)
mEf::levelEffect_c mSmokeEffect
static sFStateVirtualID_c< daPlBase_c > StateID_DemoInDokanR
Entering an area via a pipe to the right of the player. Argument: Pipe type (DokanType_e).
mEf::levelEffect_c mHitAttackDropEffect
The wind effect when doing a ground pound.
fBaseID_e mBgPressIDs[13]
Index into this array with BgPress_e.
float mDispLimitAdjL
The distance by which the player is too far left.
mVec2_c mDokanMoveSpeed
Direction to move the player while entering a rolling hill pipe or a rail pipe.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoNone
Default demo state, checking for pipe entry. Argument: Whether to not force execution start (bool).
virtual int draw()
do method for the draw operation.
void getTurnPower(sTurnPowerData &)
virtual bool setJump(float jumpSpeed, float speedF, bool allowSteer, int keyMode, int jumpMode)
Starts a jump action with the given parameters.
int mTimer_ce8
[Related to balloon break jump]
const daPlBase_c * mpNoHitPlayer
The player that cannot collide with this player.
float getWaterDokanCenterOffset(float)
float mTopHeight
Stores the highest Y position reached, resets when landing on the ground again.
@ STATUS_SPIN
The player is spinning, either from a spin jump, a propeller spin (upwards or downwards) or screw spi...
@ STATUS_POLE
The player is climbing a pole.
@ STATUS_TWIRL
The player is twirling in midair.
@ STATUS_INVULNERABLILITY_BLINK
Skip drawing the player this frame to create a blinking effect.
@ STATUS_PENGUIN_SWIM
The player is swimming with the penguin suit.
@ STATUS_DISPLAY_OUT_NO_DAMAGE
The player is outside of the screen bounds and should not be able to be attacked.
@ STATUS_17
[Dokan related]
@ STATUS_WAIT_JUMP
The player is doing a small hop after being affected by a small quake.
@ STATUS_SINK_SAND_JUMP
The player is jumping while in sinking sand.
@ STATUS_SLOPE_HEAD_PUSH_R
The player cannot move further right on a slope because of a ceiling.
@ STATUS_IS_SPIN_HOLD_REQ
If the player spins, stay in place. [Used for the twisting screws].
@ STATUS_GOAL_POLE_TOUCHED
The player has touched the goal pole.
@ STATUS_VINE
The player is clinging to a vine / mesh net / rock wall.
@ STATUS_8D
[Cannon shot related]
@ STATUS_ENEMY_STAGE_CLEAR
The player has cleared an enemy ambush.
@ STATUS_INITIAL_SLIDE
The player is in an initial slide action. [Used in 6-6 to slide all the way down automatically].
@ STATUS_SPRING_JUMP
The player is doing a jump on a springboard.
@ STATUS_QUAKE_SMALL
A small quake that makes the player do a hop was triggered.
@ STATUS_PRESS_ATTACH
The player is is attached to a enemy while ground pounding or doing a down spin. [Used for the big go...
@ STATUS_DISPLAY_OUT_DEAD
The player is outside of the screen bounds and should die as a result.
@ STATUS_GOAL_POLE_CAN_SLIDE
The player can start sliding down the goal pole.
@ STATUS_PLAYER_JUMP
The player is doing a jump on another player.
@ STATUS_INVISIBLE
The player is invisible.
@ STATUS_ABOUT_TO_BE_DELETED
[Yoshi only?]
@ STATUS_QUAKE
The player was stunned by an earthquake.
@ STATUS_HIP_ATTACK
The player is in the ground pound action and is not yet about to stand back up.
@ STATUS_HIP_ATTACK_LAND
The player has landed after ground pounding. Only active on one frame.
@ STATUS_PENGUIN_SLIDE
The player is sliding with the penguin suit.
@ STATUS_WAS_TWIRL
The player was twirling in midair the previous frame.
@ STATUS_GOAL_POLE_TURN
The player is turning toward the screen after jumping off the goal pole.
@ STATUS_JUMP
The player is jumping.
@ STATUS_STOP_EXECUTE
Stop executing this player indefinitely.
@ STATUS_FOLLOW_MAME_KURIBO
Mini Goombas are attached to the player.
@ STATUS_SPIN_HIP_ATTACK_FALL
The player is falling while doing a down spin.
@ STATUS_CAN_SPIN
The player can shake the controller to do a spin jump or a propeller spin.
@ STATUS_GOAL_POLE_READY_FOR_JUMP_OFF
The player is ready to jump off the goal pole.
@ STATUS_BIG_JUMP
The player is doing a jump on a spring or another player.
@ STATUS_HIP_ATTACK_DAMAGE_PLAYER
The player was ground pounded by another player.
@ STATUS_JUMP_DAI_COOLDOWN
The player recently failed to perform a big jump because of a ceiling.
@ STATUS_RIDE_YOSHI
The player is riding Yoshi.
@ STATUS_HIP_ATTACK_STAND_UP
The player is standing up after ground pounding. Only active on one frame.
@ STATUS_CAN_WATER_WALK
The player can walk on water because of the mini mushroom.
@ STATUS_OUT_OF_PLAY
The player is in a bubble or has died.
@ STATUS_QUAKE_BIG
A big quake that stuns the player was triggered.
@ STATUS_HIP_ATTACK_FALL
The player is falling while ground pounding.
@ STATUS_CAN_EXECUTE
The player can execute this frame or not.
@ STATUS_IS_PENGUIN
The player is in the penguin suit.
@ STATUS_SLOPE_HEAD_PUSH_L
The player cannot move further left on a slope because of a ceiling.
@ STATUS_DISABLE_STATE_CHANGE
Disallow state changes.
@ STATUS_WIND_AIRBORNE
The player is airborne while in a wind zone.
@ STATUS_STUNNED
Stunned by electric shock or ice.
@ STATUS_WALL_SLIDE
The player is sliding down a wall.
@ STATUS_DEMO_NEXT_GOTO_BLOCK
The player is transitioning after touching a next goto area.
@ STATUS_GOAL_POLE_WAIT_BELOW_PLAYER
The player is waiting for the player below to slide down the goal pole.
@ STATUS_SWIM_AGAINST_JET_H
The player is swimming against a horizontal water jet stream.
@ STATUS_PROPEL_NO_ROLL
Don't rotate the player because of the propeller suit.
@ STATUS_GOAL_POLE_FINISHED_SLIDE_DOWN
The player has reached the bottom of the goal pole after sliding down.
@ STATUS_SWIM
The player is swimming.
@ STATUS_SLIP_ACTIVE
The player is sliding.
@ STATUS_GOAL_POLE_NOT_GOAL_NO_MOVE
The player did not reach the goal pole in time and mustn't move anymore.
@ STATUS_SWIM_AGAINST_JET_V
The player is swimming against a vertical water jet stream.
@ STATUS_JUMP_COUNT_INCREASED
The jump combo counter was incremented this frame.
@ STATUS_NO_ANIM
Don't play any animations.
@ STATUS_A5
[Jump moving up?]
static sFStateVirtualID_c< daPlBase_c > StateID_DemoOutDokanD
Leaving an area via a pipe below the player. Argument: None.
virtual int preDraw()
pre method for the draw operation.
void * mStateArg
To be used as an argument to the new state.
static sFStateVirtualID_c< daPlBase_c > StateID_Turn
Turning around after running fast. Argument: None.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoWait
Waiting before transitioning to StateID_DemoNone or StateID_DemoControl. Argument: See DemoWaitArg_e.
static sFStateVirtualID_c< daPlBase_c > StateID_Slip
Sliding down a slope. Argument: None.
int wasStaffCreditGroundHipAttack
Whether the floor was ground pounded during the staff credits. [Used to allow for the coin block grou...
void setControlDemoCutscene(AnimePlayArg_e animID)
virtual int execute()
do method for the execute operation.
static const int sc_DemoPoleWaitTurn
Number of frames to wait before turning towards the screen in the goal pole animation.
int mSubstateValue
States can use this field for various purposes - as a timer, boolean flag, etc.
static sFStateVirtualID_c< daPlBase_c > StateID_Crouch
Crouching on the ground. Argument: See CrouchArg_e.
virtual void postExecute(fBase_c::MAIN_STATE_e status)
post method for the execute operation.
static sFStateVirtualID_c< daPlBase_c > StateID_SitJump
Crouch jump. Argument: Should initiate jump (bool).
u8 mIsDispLimitR
Whether the player is too far to the right and should be pushed to the left.
static sFStateVirtualID_c< daPlBase_c > StateID_WaitJump
Doing a hop caused by a small quake. Argument: None.
static sFStateVirtualID_c< daPlBase_c > StateID_Cloud
Riding a cloud. Argument: None.
static sFStateVirtualID_c< daPlBase_c > StateID_Funsui
Being blown upwards by a fountain. Argument: None.
static sFStateVirtualID_c< daPlBase_c > StateID_None
Default state, does nothing. Argument: None.
u8 mIsDispLimitL
Whether the player is too far to the left and should be pushed to the right.
static sFStateVirtualID_c< daPlBase_c > StateID_Walk
Player on the ground. Argument: Blending mode (AnmBlend_e).
void changeDemoState(const sStateIDIf_c &stateID, int arg)
Transitions to a new state with the given state ID and argument.
int mSquishCooldownTimer
Cooldown for another player to squish this player.
@ CROUCH_ARG_FROM_OTHER
Crouching after a slide or a ground pound.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoOutDokanL
Leaving an area via a pipe to the left of the player. Argument: None.
static sFStateVirtualID_c< daPlBase_c > StateID_DemoRailDokan
Transitioning between two rail pipes without leaving the area. Argument: None.
AnmBlend_e
Blending modes for animations.
@ BLEND_DEFAULT
Use the default blend duration specified in the animation HIO.
@ BLEND_NONE
Do not blend between animations.
@ BGC_37
Cannot wall kick or ground pound while this is set.
@ BGC_VINE_TOUCH_R
Touching a vine / mesh net / rock wall on the right.
@ BGC_LIFT
[Figure out a better name for this].
@ BGC_VINE_TOUCH_L
Touching a vine / mesh net / rock wall on the left.
MAIN_STATE_e
The possible operation results.
@ SUCCESS
The operation was completed successfully.
@ NOT_READY
The step could not completed at this time.
@ SUCCEEDED
The step was completed successfully.
fBaseID_e mUniqueID
The base's unique identifier.
static fBase_c * searchBaseByID(fBaseID_e id)
Searches for a base with the given ID.
static fBase_c * searchBaseByProfName(ProfileName profID, const fBase_c *parent)
Searches for a base with a given profile name, optionally under a given parent.
@ HIDDEN
The screen is completely unblocked.
static mFaderBase_c * mFader
The fader currently in use.
void multVecZero(nw4r::math::VEC3 &out) const
Extracts the translation vector from the matrix.
void ZrotM(mAng angle)
Rotates the matrix on the Z axis by the given angle.
A three-dimensional floating point vector.
float normalize()
Normalizes the vector.
The interface for state IDs.
PLAYER_POWERUP_e
The identifiers for each powerup.
fBaseID_e
A unique identifier for each base.
@ BASE_ID_NULL
Represents the null base.
sStateID_c null
A null state instance.
s16 atan2s(float sin, float cos)
Converts a sine and a cosine to an angle in units.
void hideFukidashiForSession(int playerId, int fukidashiAction)
Hides the given action prompt for the given player for the rest of the current session.
T calcTimer(T *value)
Decrements a timer value.
s16 addCalcAngle(s16 *value, s16 target, s16 smoothing, s16 maxStep, s16 minStep)
Smoothly moves value towards target using proportional scaling.
BOOL chase(s16 *value, s16 target, s16 step)
Moves value towards target by a fixed step amount.
#define STATE_VIRTUAL_DEFINE(class, name)
Defines a virtual state.
float cos() const
Computes the cosine of the angle.
float sin() const
Computes the sine of the angle.
A structure that contains information about a collider.
u8 mType
See NextGotoType_e.
u16 mFlags
See NextGotoFlags_e.