1#include <game/bases/d_a_player.hpp>
2#include <game/bases/d_a_en_door.hpp>
3#include <game/bases/d_a_fireball_player.hpp>
4#include <game/bases/d_a_player_ice.hpp>
5#include <game/bases/d_a_iceball.hpp>
6#include <game/bases/d_a_player_manager.hpp>
7#include <game/bases/d_a_player_demo_manager.hpp>
8#include <game/bases/d_player_effect_manager.hpp>
9#include <game/bases/d_bg.hpp>
10#include <game/bases/d_bg_parameter.hpp>
11#include <game/bases/d_enemy_manager.hpp>
12#include <game/bases/d_game_com.hpp>
13#include <game/bases/d_info.hpp>
14#include <game/bases/d_next.hpp>
15#include <game/bases/d_mask_manager.hpp>
16#include <game/bases/d_mario_mdl.hpp>
17#include <game/bases/d_water_entry_manager.hpp>
18#include <game/bases/d_s_stage.hpp>
19#include <game/bases/d_save_mng.hpp>
20#include <game/bases/d_yoshi_mdl.hpp>
21#include <game/mLib/m_fader.hpp>
22#include <game/sLib/s_GlobalData.hpp>
25const float dAcPy_c::msc_JUMP_SPEED = daPlBase_c::sc_JumpSpeed;
27inline float getSomeData(
int idx) {
28 return dAcPy_c::data_802f5a0c[idx];
31inline float getData(
int idx) {
32 return dAcPy_c::data_802f5a48[idx];
35bool dAcPy_c::setHipAttackOnEnemy(
mVec3_c *hitPos) {
38 mPressAttachPos = *hitPos;
42 mPressAttachPos = *hitPos;
48void dAcPy_c::setHipAttackEffect() {
50 setSeaLandSmokeEffect();
52 if (mPowerup == POWERUP_MINI_MUSHROOM) {
58 daPlBase_c::setHipAttackEffect();
62bool dAcPy_c::setHipAttackAction() {
66 mKey.checkHipAttack() &&
67 !isDemoType(DEMO_ENDING_DANCE)
82void dAcPy_c::setHipAttack_AttackStart() {
83 daPlBase_c::setHipAttack_AttackStart();
87void dAcPy_c::initializeState_HipAttack() {
88 daPlBase_c::initializeState_HipAttack();
94void dAcPy_c::finalizeState_HipAttack() {
95 daPlBase_c::finalizeState_HipAttack();
99void dAcPy_c::executeState_HipAttack() {
103 daPlBase_c::executeState_HipAttack();
106void dAcPy_c::setSpinHipAttackEffect() {
107 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf1,
"Wm_mr_spindown", 0, &
mPos,
nullptr,
nullptr);
108 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf2,
"Wm_mr_spindownline", 0, &
mPos,
nullptr,
nullptr);
111void dAcPy_c::initializeState_SpinHipAttack() {
113 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_JUMP2);
123 if (changeParam == 0) {
126 float v = data_802f5a0c[13];
138void dAcPy_c::executeState_SpinHipAttack() {
139 offStatus(STATUS_SPIN_HIP_ATTACK_LANDING);
146 if (mPowerup != POWERUP_PROPELLER_SHROOM && getCarryPropelActor() ==
nullptr) {
151 case SPIN_HIP_ATTACK_ACTION_0:
163 if (isNowBgCross(BGC_62)) {
168 if (isNowBgCross(
BGC_FOOT) && !isOldBgCross(BGC_62)) {
169 startQuakeShock(dQuake_c::TYPE_7);
171 if (isNowBgCross(BGC_CLIFF)) {
182 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_JUMP_END);
187 onStatus(STATUS_SPIN_HIP_ATTACK_LANDED);
188 onStatus(STATUS_SPIN_HIP_ATTACK_LANDING);
199 m_2e8.chase(0, 0x1000);
201 m_2e8.chase(0x2000, 0x400);
204 setSpinHipAttackEffect();
205 setPropelSpinSmokeEffect();
207 case SPIN_HIP_ATTACK_ACTION_1:
208 m_2e8.chase(0, 0x200);
210 if (checkJumpTrigger()) {
221 mPos.x = mPressAttachPos.x;
222 mPos.y = mPressAttachPos.y;
226void dAcPy_c::finalizeState_SpinHipAttack() {
230 offStatus(STATUS_SPIN_HIP_ATTACK_LANDED);
231 offStatus(STATUS_SPIN_HIP_ATTACK_LANDING);
241void dAcPy_c::initializeState_Fall() {
242 daPlBase_c::initializeState_Fall();
267void dAcPy_c::finalizeState_Fall() {
268 daPlBase_c::finalizeState_Fall();
281void dAcPy_c::executeState_Fall() {
282 daPlBase_c::executeState_Fall();
287 if (!setKaniActionInitHangHand()) {
289 if (setDelayHelpJump()) {
295void dAcPy_c::initializeState_Jump() {
296 daPlBase_c::initializeState_Jump();
308 setStartJumpEffect(0);
309 _jumpSet(stateArg<jmpInf_c *>());
310 if (mJumpCounter != 2) {
315void dAcPy_c::finalizeState_Jump() {
316 daPlBase_c::finalizeState_Jump();
338void dAcPy_c::executeState_Jump() {
339 daPlBase_c::executeState_Jump();
352 if (!setKaniActionInitHangHand()) {
357void dAcPy_c::calcJumpCount() {
360 if (mJumpCounter > 2) {
366float dAcPy_c::getJumpSpeed() {
368 float absSpeed = std::fabs(
mSpeedF);
369 if (absSpeed < daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues1[0]) {
370 baseSpeed = daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues2[0];
371 }
else if (absSpeed < daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues1[1]) {
372 baseSpeed = daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues2[1];
373 }
else if (absSpeed < daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues1[2]) {
374 baseSpeed = daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues2[2];
376 baseSpeed = daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues2[3];
378 if (std::fabs(
mSpeedF) >= getSpeedData()->mHighSpeed) {
379 baseSpeed = daPlayerData_c::smc_POWER_CHANGE_DATA.mJumpSpeedValues2[3];
382 if (isNowBgCross(
BgCross1_e(BGC_IN_SINK_SAND | BGC_ON_SINK_SAND))) {
383 if (isNowBgCross(BGC_IN_SINK_SAND)) {
384 jumpSpeed = sc_JumpSpeedNuma2;
386 jumpSpeed = sc_JumpSpeedNuma1;
387 if (
mPos.y < mSinkSandHeight - 4.0f) {
392 jumpSpeed = sc_JumpSpeed + baseSpeed;
394 if (isMameAction()) {
395 jumpSpeed *= 0.8125f;
400void dAcPy_c::setJumpSpeed() {
401 float jumpSpeed = getJumpSpeed();
402 if (mJumpCounter == 2) {
412 mPyMdlMng.setAnm(PLAYER_ANIM_GET_DOWN, 0.0f, 0.0f);
414 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_ST);
416 mPyMdlMng.setAnm(PLAYER_ANIM_W_JUMP1, 0.0f, 0.0f);
418 mPyMdlMng.setAnm(PLAYER_ANIM_STAR_ROLL_DUPLICATE);
420 mPyMdlMng.setAnm(PLAYER_ANIM_S_JUMP);
423 switch (mJumpCounter) {
425 anmNum = PLAYER_ANIM_JUMP;
429 anmNum = PLAYER_ANIM_2JMP_C_1;
433 anmNum = PLAYER_ANIM_ROLL_JUMP;
437 if (mJumpCounter == 1) {
438 mPyMdlMng.mpMdl->fn_800d5e00(1);
440 mPyMdlMng.mpMdl->fn_800d5e00(0);
444 mPyMdlMng.setAnm(anmNum, 0.0f, 0.0f);
446 mPyMdlMng.setAnm(anmNum);
451bool dAcPy_c::jump_common() {
452 if (checkCarryThrow()) {
455 if (setHipAttackAction()) {
458 if (isNowBgCross(BGC_WALL_TOUCH_L_2) | isNowBgCross(BGC_WALL_TOUCH_R_2)) {
464 typedef void (dAcPy_c::*JumpActionProc)();
465 static JumpActionProc l_JumpActionProc[] = {
467 &dAcPy_c::jumpExecAir
477 if (mPyMdlMng.isAnmStop()) {
478 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP2, 3.0f, 0.0f);
481 }
else if (
mSpeed.y < 0.0f) {
483 mPyMdlMng.setAnm(PLAYER_ANIM_W_JUMP2, 10.0f, 0.0f);
485 mPyMdlMng.setAnm(PLAYER_ANIM_S_JUMP2);
486 }
else if (mJumpCounter != 2) {
488 static const int l_AnmIDs[] = { PLAYER_ANIM_JUMP2, PLAYER_ANIM_2JMP_C_2, PLAYER_ANIM_2JUMP2 };
489 mPyMdlMng.setAnm(l_AnmIDs[mJumpCounter]);
496void dAcPy_c::jumpExecAir() {
499 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP2, 10.0f, 0.0f);
501 if (mJumpCounter == 2) {
505 float f = mPyMdlMng.getLastFrame();
506 mPyMdlMng.setAnm(PLAYER_ANIM_ROLL_JUMP, 0.0f, f);
516 float f = std::fabs(
mSpeed.y * 0.15f);
528 !checkJumpTrigger() &&
537 mPowerup != POWERUP_MINI_MUSHROOM &&
540 isNowBgCross(BGC_GROUNDED_MOVE_UP)
548 setLandJumpEffect(0);
554 mPyMdlMng.setAnm(PLAYER_ANIM_2JUMPED_DUPLICATE, 10.0f, 0.0f);
556 if (mJumpCounter == 0) {
557 mPyMdlMng.setAnm(PLAYER_ANIM_JUMPED);
559 mPyMdlMng.setAnm(PLAYER_ANIM_2JUMPED);
568 int v = getFollowMameKuribo() - 1;
576 static const float speedMultiplier[] = { 0.84f, 0.81f, 0.78f, 0.75f, 0.72f };
577 mSpeed.y *= speedMultiplier[v];
585void dAcPy_c::_jumpSet(jmpInf_c *jumpInf) {
594 if (isOnSinkSand()) {
598 if (jumpInf !=
nullptr) {
599 jumpMode = jumpInf->mJumpMode;
613 if (getCarryPlayer() !=
nullptr &&
isStatus(STATUS_47)) {
616 if (jumpInf !=
nullptr) {
617 if (jumpInf->mSpeed) {
618 mSpeed.y = jumpInf->mSpeed;
626 if (jumpInf !=
nullptr) {
627 blendMode = jumpInf->mBlendMode;
642void dAcPy_c::initializeState_Land() {
645 mPyMdlMng.setAnm(PLAYER_ANIM_2JUMPED, 2.0f, 0.0f, 0.0f);
657void dAcPy_c::finalizeState_Land() {
668void dAcPy_c::executeState_Land() {
673 if (checkWalkNextAction()) {
676 if (isNowBgCross(
BgCross1_e(BGC_WALL_TOUCH_L_2 | BGC_WALL_TOUCH_R_2))) {
679 if (isIceSlipAnmPlay()) {
684 if (!
mSpeedF && !mPyMdlMng.isAnmStop()) {
690 if ((mKey.buttonWalk(
nullptr) && mPyMdlMng.mpMdl->mAnm.getFrame() >= 10.0f) || mPyMdlMng.isAnmStop()) {
705 mBc.getWallAttr(dir) != 7 &&
723bool dAcPy_c::checkWallJump() {
729 mKey.buttonWalk(&dir) &&
737 if (mKey.triggerJump()) {
745void dAcPy_c::initializeState_WallSlide() {
746 mPyMdlMng.setAnm(PLAYER_ANIM_WSLD, 0.0f, 0.0f);
751 mBc.mPlayerFlags |= 2;
759void dAcPy_c::finalizeState_WallSlide() {
763 mBc.mPlayerFlags &= ~2;
770 if (getTallType(-1) > 2) {
773 u8 idx = (
mDirection ^ 1) + getTallType(-1) * 2;
778 mPyMdlMng.mpMdl->getJointPos(&jnt, 14);
780 jnt.x =
mPos.x + mWallBcData.mOffset / 4096.0f;
782 jnt.x =
mPos.x - mWallBcData.mOffset / 4096.0f;
785 static const char *sc_wallSlidEffectID[] = {
786 "Wm_mr_wallslip_ss_r",
787 "Wm_mr_wallslip_ss_l",
788 "Wm_mr_wallslip_s_r",
789 "Wm_mr_wallslip_s_l",
793 dEf::createPlayerEffect(
mPlayerNo, &
mSmokeEffect, sc_wallSlidEffectID[idx], 0, &jnt,
nullptr,
nullptr);
796void dAcPy_c::executeState_WallSlide() {
801 if (mKey.triggerJump()) {
805 if (setHipAttackAction()) {
809 if (mKey.buttonWalk(&dir) && dir !=
mDirection) {
821 if (isMameAction()) {
830void dAcPy_c::initializeState_WallJump() {
840 if (getTallType(-1) <= 2) {
842 u8 idx = dir + getTallType(-1) * 2;
844 float thing = mWallBcData.mOffset / 4096.0f;
845 mVec3_c pos(
mPos.x - thing * sc_DirSpeed[dir],
mPos.y,
mPos.z);
846 mVec3_c pos2(pos.x - sc_DirSpeed[
mDirection] * 8.0f, pos.y, pos.z);
847 if (!dBc_c::checkWall(&
mPos, &pos2,
nullptr,
mLayer, mAmiLayer,
nullptr)) {
850 if (dBc_c::checkTenjou(&pos2, &f,
mLayer, mAmiLayer) && f <
mPos.y + getModelHeight()) {
855 static const char *sc_wallKickEffectID[] = {
856 "Wm_mr_wallkick_ss_r",
857 "Wm_mr_wallkick_ss_l",
858 "Wm_mr_wallkick_s_r",
859 "Wm_mr_wallkick_s_l",
863 dEf::createPlayerEffect(
mPlayerNo, sc_wallKickEffectID[idx], 0, &pos,
nullptr,
nullptr);
870void dAcPy_c::finalizeState_WallJump() {
874void dAcPy_c::executeState_WallJump() {
879 if (isMameAction()) {
889void dAcPy_c::setSpinHoldReq(
float targetX) {
894bool dAcPy_c::setSpinSpeed(
float speedF,
float speedY) {
895 if (isState(StateID_SpinJump)) {
906 dQuake_c::getInstance()->shockMotor(
getPlrNo(), dQuake_c::TYPE_7, 0,
false);
912void dAcPy_c::setSpinJumpEffect(
int i) {
916 dAcPy_c *carryPlayer = getCarryPlayer();
917 if (carryPlayer !=
nullptr) {
918 carryPlayer->setSpinJumpEffectSub(i);
921 setSpinJumpEffectSub(i);
925void dAcPy_c::setSpinJumpEffectSub(
int i) {
926 if (dScStage_c::m_isStaffCredit) {
930 mPyMdlMng.mpMdl->getJointPos(&jnt1, 11);
931 mPyMdlMng.mpMdl->getJointPos(&jnt2, 14);
932 mVec3_c pos(
mPos.x, 4.0f + (jnt1.y + jnt2.y) / 2,
mPos.z);
934 static const float scSpinJumpEffectScale[3] = { 0.6f, 0.8f, 1.0f };
935 static const float scSpinJumpEffectScale_K[3] = { 0.6f, 0.7f, 0.8f };
936 if (PLAYER_YELLOW_TOAD <= mPlayerType && mPlayerType <= PLAYER_BLUE_TOAD) {
937 s = scSpinJumpEffectScale_K[getTallType(-1)];
939 s = scSpinJumpEffectScale[getTallType(-1)];
941 mVec3_c scale(s, s, s);
944 static const char *sc_spinEffectID[] = {
946 "Wm_mr_normalspin_pm"
949 if (mPowerup == POWERUP_PENGUIN_SUIT) {
952 dEf::createPlayerEffect(
mPlayerNo, &mFollowEf2, sc_spinEffectID[idx], 0, &pos,
nullptr, &scale);
955 }
else if (m_1288 != 0) {
956 if (!mFollowEf2.follow(&pos,
nullptr, &scale)) {
962void dAcPy_c::endSpinJumpEffect() {
969void dAcPy_c::setMissSpinJumpEffect(
int i) {
970 dAcPy_c *carryPlayer = getCarryPlayer();
971 if (carryPlayer !=
nullptr) {
972 carryPlayer->setMissSpinJumpEffect(i);
975 if (i == 0 && !m_128c) {
979 mPyMdlMng.mpMdl->getJointPos(&jnt, 1);
980 float s = mPyMdlMng.getSomeScale2();
981 mVec3_c scale(s, s, s);
983 dEf::createPlayerEffect(
mPlayerNo, &mFollowEf3,
"Wm_mr_halfspin", 0, &jnt,
nullptr, &scale);
985 }
else if (m_128c != 0) {
986 if (!mFollowEf3.follow(&jnt,
nullptr, &scale)) {
992void dAcPy_c::initializeState_SpinJump() {
1005 setSpinJumpEffect(1);
1007 if (substate <= SPIN_JUMP_ACTION_1) {
1011 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_ST, 0.0f, 0.0f);
1015 if (substate == SPIN_JUMP_ACTION_0) {
1016 jumpInf.mSpeed = sc_JumpSpeed - 0.4f;
1019 isNowBgCross(
BgCross1_e(BGC_IN_SINK_SAND | BGC_ON_SINK_SAND)) &&
1020 (isNowBgCross(BGC_IN_SINK_SAND) ||
mPos.y < mSinkSandHeight - 4.0f)
1022 jumpInf.mSpeed = sc_JumpSpeed - 0.7f;
1026 setStartJumpEffect(1);
1027 dAcPy_c *carryPlayer = getCarryPlayer();
1028 if (carryPlayer !=
nullptr) {
1029 carryPlayer->initRideSpinMove();
1033void dAcPy_c::executeState_SpinJump() {
1052 mKey.onStatus(dAcPyKey_c::STATUS_5);
1053 if (mKey.triggerShakeJump() &&
mSpinTimer < 10) {
1062 if (!checkJumpTrigger()) {
1064 mKey.buttonWalk(
nullptr) &&
1065 (mKey.triggerRight() || mKey.triggerLeft())
1070 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_END);
1085 setLandJumpEffect(1);
1086 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_END, 0.0f, 0.0f);
1092void dAcPy_c::finalizeState_SpinJump() {
1109 mKey.offStatus(dAcPyKey_c::STATUS_5);
1111 dAcPy_c *carryPlayer = getCarryPlayer();
1112 if (carryPlayer !=
nullptr) {
1113 carryPlayer->endRideSpinMove();
1117bool dAcPy_c::isMissSpinEnableAnm() {
1118 if (mPyMdlMng.getAnm() == PLAYER_ANIM_STAR_ROLL_DUPLICATE) {
1121 if (mPyMdlMng.getAnm() == PLAYER_ANIM_ROLL_JUMP && !mPyMdlMng.isAnmStop()) {
1127s16 dAcPy_c::getMissSpinAngle() {
1128 if (isMissSpinEnableAnm()) {
1134void dAcPy_c::setMissSpin() {
1137 if (isMissSpinEnableAnm()) {
1138 setMissSpinJumpEffect(1);
1142void dAcPy_c::resetMissSpin() {
1146void dAcPy_c::updateMissSpin() {
1150 s16 prevAngle = m_105c;
1152 if (prevAngle < 0 && m_105c >= 0) {
1159void dAcPy_c::initializeState_RideOffJump() {
1179void dAcPy_c::finalizeState_RideOffJump() {
1198void dAcPy_c::executeState_RideOffJump() {
1210void dAcPy_c::initializeState_SitJump() {
1222 if (!stateArg<bool>()) {
1225 mPyMdlMng.setAnm(PLAYER_ANIM_S_JUMP2);
1230void dAcPy_c::finalizeState_SitJump() {
1250void dAcPy_c::executeState_SitJump() {
1256 if (dScStage_c::m_instance->mCurrWorld == WORLD_5 && dScStage_c::m_instance->mCurrCourse == STAGE_GHOST_HOUSE) {
1257 if (isNowBgCross(BGC_BLOCK_HIT) && isOldBgCross(BGC_SEMISOLID)) {
1258 if (mLastPosDelta.x < 0.0f) {
1269 if (!mKey.buttonCrouch() && !checkStandUpRoof()) {
1276void dAcPy_c::initializeState_KaniJump() {
1291void dAcPy_c::finalizeState_KaniJump() {
1306void dAcPy_c::executeState_KaniJump() {
1309 setKaniMoveSpeed(
true);
1312 if (
mPos.y < m_d8c - 4.0f) {
1317void dAcPy_c::initializeState_CannonJump() {
1326 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_5, 0,
false);
1328 mPyMdlMng.setAnm(PLAYER_ANIM_SHOOT);
1339void dAcPy_c::finalizeState_CannonJump() {
1340 float data = getSpeedData()->mHighSpeed;
1358void dAcPy_c::executeState_CannonJump() {
1363 case CANNON_JUMP_ACTION_0: {
1371 if (std::fabs(
mSpeedF) >= 1.0f) {
1377 mVec3_c tmp(m_12a8.x -
mPos.x, m_12a8.y -
mPos.y, 0.0f);
1378 if (PSVECMag(tmp) >= 8.0f) {
1386 if (isNowBgCross(
BGC_HEAD) || isNowBgCross(
BgCross1_e(BGC_WALL_TOUCH_L_2 | BGC_WALL_TOUCH_R_2))) {
1394 mPyMdlMng.setAnm(PLAYER_ANIM_SHOOT_SLIP);
1402 case CANNON_JUMP_ACTION_1:
1411 setCrouchSmokeEffect();
1412 if (!(std::fabs(
mSpeedF) < 1.0f && checkJumpTrigger()) && std::fabs(
mSpeedF) <= 0.1f) {
1413 mPyMdlMng.setAnm(PLAYER_ANIM_SHOOT_SLIP_END);
1419 mPyMdlMng.setAnm(PLAYER_ANIM_SHOOT);
1422 case CANNON_JUMP_ACTION_2:
1424 if (checkJumpTrigger()) {
1431 if (mPyMdlMng.isAnmStop()) {
1438void dAcPy_c::initializeState_BlockJump() {
1450 if (isItemKinopio()) {
1455void dAcPy_c::finalizeState_BlockJump() {
1461void dAcPy_c::executeState_BlockJump() {
1482void dAcPy_c::setSlipAction() {
1483 mMoveSakaAngle =
mBc.getSakaAngleBySpeed(
mSpeedF);
1484 if (mPowerup == POWERUP_PENGUIN_SUIT) {
1485 if (isState(StateID_HipAttack)) {
1494void dAcPy_c::setSlipSE() {
1498 if (isNowBgCross(
BGC_WATER_TOUCH) && mPowerup == POWERUP_MINI_MUSHROOM) {
1501 daPlBase_c::setSlipSE();
1505void dAcPy_c::setSlipEffect() {
1506 daPlBase_c::setSlipSmokeEffect();
1510void dAcPy_c::slipActionMove(
int mode) {
1514 daPlBase_c::slipActionMove(mode);
1517void dAcPy_c::initializeState_Slip() {
1518 daPlBase_c::initializeState_Slip();
1519 releaseCarryActor();
1524void dAcPy_c::finalizeState_Slip() {
1525 daPlBase_c::finalizeState_Slip();
1529void dAcPy_c::executeState_Slip() {
1530 daPlBase_c::executeState_Slip();
1533void dAcPy_c::initializeState_RollSlip() {
1536 mPyMdlMng.setAnm(PLAYER_ANIM_STAR_ROLL_DUPLICATE);
1542 setInvalidKeyTimer_LR(10, 1);
1543 releaseCarryActor();
1554void dAcPy_c::finalizeState_RollSlip() {
1565 if (std::fabs(
mSpeedF) > 1.0f) {
1570void dAcPy_c::executeState_RollSlip() {
1583 case ROLL_SLIP_ACTION_0:
1589 mPyMdlMng.mpMdl->setRate(m_94);
1594 mPyMdlMng.mpMdl->setFrame(0.0f);
1595 }
else if (isNowBgCross(
BgCross1_e(BGC_WALL_TOUCH_L_2 | BGC_WALL_TOUCH_R_2))) {
1600 mPyMdlMng.mpMdl->setFrame(0.0f);
1604 mPyMdlMng.mpMdl->setRate(0.5f);
1607 if (!mKey.buttonCrouch()) {
1608 setSlipAction_ToEnd();
1610 setSlipAction_ToStoop();
1620 float s = std::fabs(
mSpeedF) * 0.5f;
1630 mPyMdlMng.mpMdl->setRate(s);
1631 if (std::fabs(
mSpeedF) < 1.1f) {
1632 if (!mKey.buttonCrouch()) {
1633 setSlipAction_ToEnd();
1635 setSlipAction_ToStoop();
1640 case ROLL_SLIP_ACTION_1:
1642 if (mPyMdlMng.isAnmStop()) {
1646 case ROLL_SLIP_ACTION_2:
1649 if (mPyMdlMng.isAnmStop()) {
1656void dAcPy_c::initializeState_PenguinSlide() {
1659 if (isNowBgCross(
BGC_FOOT) && !isSlipSaka()) {
1660 float f = std::fabs(
mSpeedF) / getSpeedData()->mHighSpeed + 0.2f;
1671 if (m_54c < -4.0f) {
1676 if (
mPos.y >= mWaterHeight - 4.0f) {
1680 releaseCarryActor();
1688 mPyMdlMng.setAnm(PLAYER_ANIM_P_SLIP);
1694void dAcPy_c::finalizeState_PenguinSlide() {
1707bool dAcPy_c::checkPenguinSlideJump() {
1708 if (isNowBgCross(
BGC_FOOT) && mKey.triggerJump()) {
1710 if (mKey.buttonDown() || (mKey.buttonWalk(&dir) && dir ==
mDirection)) {
1711 mPyMdlMng.setAnm(PLAYER_ANIM_P_SLIP_JUMP);
1715 float tmp = std::fabs(
mSpeedF) - 1.5f;
1716 mSpeed.y = data_802f5a48[2] + tmp * data_802f5a48[3];
1717 if (
mSpeed.y > data_802f5a48[1]) {
1718 mSpeed.y = data_802f5a48[1];
1720 if (
mSpeed.y < data_802f5a48[2]) {
1721 mSpeed.y = data_802f5a48[2];
1731void dAcPy_c::executeState_PenguinSlide() {
1741 mSpeed.y = sc_MaxFallSpeed_Foot;
1746 if (isNowBgCross(
BGC_FOOT) && m_540 != 0) {
1756 case PENGUIN_SLIDE_ACTION_0:
1757 if (checkPenguinSlideJump()) {
1761 case PENGUIN_SLIDE_ACTION_1:
1762 if (setCrouchJump()) {
1766 case PENGUIN_SLIDE_ACTION_2:
1767 if (checkJumpTrigger()) {
1773 if (mPowerup != POWERUP_PENGUIN_SUIT) {
1780 int ang = turnAngle();
1782 case PENGUIN_SLIDE_ACTION_0:
1783 if (mPlayerType == PLAYER_LUIGI) {
1794 if (!(mKey.buttonDown() || (mKey.buttonWalk(&dir) && dir ==
mDirection))) {
1802 setPenguinSlideEffect();
1803 if (mPyMdlMng.getAnm() != PLAYER_ANIM_P_SLIP) {
1804 mPyMdlMng.setAnm(PLAYER_ANIM_P_SLIP);
1808 setPenguinSlideLandEffect();
1811 if (
mSpeed.y < 0.0f && mPyMdlMng.getAnm() != PLAYER_ANIM_P_SLIP_JUMP2) {
1812 mPyMdlMng.setAnm(PLAYER_ANIM_P_SLIP_JUMP2);
1815 daPlBase_c::slipActionMove(ang);
1817 if (mGroundType == GROUND_TYPE_WATER) {
1824 case PENGUIN_SLIDE_ACTION_1:
1826 if (mPyMdlMng.isAnmStop()) {
1831 case PENGUIN_SLIDE_ACTION_2:
1832 if (mPyMdlMng.isAnmStop()) {
1842 m_544 = data_802f5a48[0];
1845 if (getPowerChangeType(
true) != POWER_CHANGE_NORMAL) {
1850 if (getPowerChangeType(
true) != POWER_CHANGE_NORMAL) {
1871void dAcPy_c::setPenguinSlideEffect() {
1875 mAng3_c ang(0, 0, 0);
1880 if (mGroundType == GROUND_TYPE_WATER) {
1881 efPos.set(
mPos.x, mWaterHeight,
mPos.z);
1882 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf4,
"Wm_mr_waterswim", 0, &efPos,
nullptr,
nullptr);
1883 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf5,
"Wm_en_cmnwater02", 0, &efPos, &ang,
nullptr);
1885 mpMdlMng->mpMdl->getJointPos(&efPos, 1);
1886 static const char *sc_penguinSlidEffectID[] = {
1887 "Wm_mr_penguinsmoke",
1888 "Wm_mr_penguinsnow",
1889 "Wm_mr_pdesertsmoke",
1891 "Wm_mr_penguinsmoke",
1893 "Wm_mr_penguinsmoke",
1894 "Wm_mr_pdesertsmoke",
1895 "Wm_mr_penguinsmoke",
1896 "Wm_mr_pbeachsmoke",
1897 "Wm_mr_penguinsmoke",
1898 "Wm_mr_penguinsmoke",
1899 "Wm_mr_penguinsmoke"
1901 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf4, sc_penguinSlidEffectID[mGroundType], 0, &efPos,
nullptr,
nullptr);
1902 switch (mGroundType) {
1903 case GROUND_TYPE_SNOW:
1904 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf5,
"Wm_mr_p_snowslip", 0, &efPos, &ang,
nullptr);
1906 case GROUND_TYPE_ICE:
1907 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf5,
"Wm_mr_p_iceslip", 0, &efPos, &ang,
nullptr);
1915void dAcPy_c::setPenguinSlideLandEffect() {
1916 setLandSmokeEffect(0);
1917 if (mGroundType == GROUND_TYPE_WATER) {
1922bool dAcPy_c::isWaitFrameCountMax() {
1923 return mWaitFrameCount >= 80;
1926bool dAcPy_c::checkWalkNextAction() {
1927 if (checkCarryThrow()) {
1933 if (checkJumpTrigger()) {
1938 if (setDelayHelpJump()) {
1946 if (isState(StateID_Walk) && mKey.buttonWalk(
nullptr) &&
mDirection != mPrevDirection) {
1953 if (checkCrouch()) {
1960void dAcPy_c::setWalkActionAnm(AnmBlend_e blendMode) {
1961 float speed = std::fabs(
mSpeedF);
1963 if (mPowerup == POWERUP_MINI_MUSHROOM) {
1964 if (speed <= getSpeedData()->mLowSpeed) {
1965 float tmp = speed * 2.0f * 1.45f;
1966 f = (tmp < 2.0f) ? 2.0f : tmp;
1968 float tmp = speed * 1.5f * 1.45f;
1969 f = (tmp < 0.5f) ? 0.5f : tmp;
1972 if (speed <= getSpeedData()->mLowSpeed) {
1973 float tmp = speed * 2.0f;
1974 f = (tmp < 2.0f) ? 2.0f : tmp;
1976 float tmp = speed * 1.5f;
1977 f = (tmp < 0.5f) ? 0.5f : tmp;
1981 if (mPowerup == POWERUP_MINI_MUSHROOM) {
1982 if (speed <= getSpeedData()->mLowSpeed) {
1989 isNowBgCross(BGC_ON_BELT_L) &&
mSpeedF > 0.0f ||
1990 isNowBgCross(BGC_ON_BELT_R) &&
mSpeedF < 0.0f
1992 float tmp = speed * 2.5f;
1993 f = (tmp < 2.0f) ? 2.0f : ((tmp > g) ? g : tmp);
2002 if (mPowerup != POWERUP_PENGUIN_SUIT && isNowBgCross(BGC_ON_ICE) && speed < getSpeedData()->mMediumSpeed) {
2003 float tmp = h * 8.0f;
2004 h = (tmp > g) ? g : tmp;
2006 if (isNowBgCross(
BgCross1_e(BGC_ON_SINK_SAND | BGC_IN_SINK_SAND))) {
2007 if (isNowBgCross(BGC_IN_SINK_SAND)) {
2013 setNormalWalkAnm(blendMode, h);
2017 if (dScStage_c::m_isStaffCredit &&
isStatus(STATUS_ENDING_DANCE_AUTO)) {
2018 mPyMdlMng.setAnm(PLAYER_ANIM_ENDING_WAIT);
2022 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT_DUPLICATE2);
2026 static const float scSakaCheckOffset[] = { 2.0f, 0.0f, -2.0f, 4.0f, 0.0f, -4.0f };
2027 s16 ang = mStillSakaAngle;
2030 for (
int i = 0; i < 3; i++) {
2034 if (dBc_c::checkGroundAngle(&p, &f, &tmpAng,
mLayer, mAmiLayer, -1,
nullptr, 0) && std::fabs(f -
mPos.y) < 8.0f) {
2042 static const int scSlopeWaitAnm[] = { PLAYER_ANIM_SLOPE_WAIT_L, PLAYER_ANIM_SLOPE_WAIT_R };
2043 static const int scLongWaitAnm[] = { PLAYER_ANIM_WAIT_L, PLAYER_ANIM_WAIT_R };
2044 if (ang != 0 || m_80 != 0) {
2046 float f = ang * mAng::AngleToDegreeCoefficient + 70.0f;
2054 mPyMdlMng.setAnm(scSlopeWaitAnm[
mDirection], f);
2056 mPyMdlMng.setAnm(scSlopeWaitAnm[
mDirection], 0.0f, f);
2058 mPyMdlMng.mpMdl->m_17c |= 0x40;
2064 mPyMdlMng.setAnm(scLongWaitAnm[
mDirection], 0.0f, 0.0f);
2069bool dAcPy_c::isIceSlipAnmPlay() {
2070 if (isNowBgCross(BGC_ON_ICE) && !mKey.
buttonWalk(
nullptr) && mPowerup != POWERUP_PENGUIN_SUIT) {
2076void dAcPy_c::setNormalWalkAnm(AnmBlend_e blendMode,
float speedRate) {
2077 if (isIceSlipAnmPlay()) {
2078 switch (mWalkAnmState) {
2080 if (isNowBgCross(
BGC_LIFT) && std::fabs(
mBc.mIceSpeed) > 1.0f || std::fabs(
mSpeedF) > 0.82f) {
2082 mPyMdlMng.setAnm(PLAYER_ANIM_ICE_SLIP_B);
2084 mPyMdlMng.setAnm(PLAYER_ANIM_ICE_SLIP_F);
2093 if (mPyMdlMng.isAnmStop()) {
2109 anmID = (mPyMdlMng.mpMdl->m_17c & 0x4) ? PLAYER_ANIM_CARRY_P_WALK : PLAYER_ANIM_CARRY_WALK;
2113 isNowBgCross(BGC_ON_BELT_L) &&
mSpeedF > 0.0f ||
2114 isNowBgCross(BGC_ON_BELT_R) &&
mSpeedF < 0.0f
2116 anmID = PLAYER_ANIM_RUN;
2118 float speed = std::fabs(
mSpeedF);
2119 if (speed <= getSpeedData()->mLowSpeed) {
2120 anmID = PLAYER_ANIM_RUN;
2121 }
else if (speed < getSpeedData()->mHighSpeed) {
2122 anmID = PLAYER_ANIM_B_DASH;
2124 anmID = PLAYER_ANIM_B_DASH2;
2128 if (!mPyMdlMng.isAnm(anmID)) {
2129 float blendDuration = 0.0f;
2131 blendDuration = dPyMdlMng_c::getHIO(anmID).mBlendDuration;
2133 mPyMdlMng.setAnm(anmID, speedRate, blendDuration, 0.0f);
2135 mPyMdlMng.mpMdl->setRate(speedRate);
2140void dAcPy_c::walkActionInit_Wait(AnmBlend_e blendMode) {
2143 mWaterWalkTimer = 8;
2147void dAcPy_c::walkAction_Wait() {
2148 if (!isWaitFrameCountMax()) {
2157 mAngle.y.chase(0, 0x400);
2172void dAcPy_c::walkActionInit_Move(AnmBlend_e blendMode) {
2174 setWalkActionAnm(blendMode);
2177void dAcPy_c::walkAction_Move() {
2179 mWaitFrameCount = 0;
2181 setRunOnWaterEffect();
2182 daPlBase_c::walkAction_Move();
2191void dAcPy_c::initializeState_Walk() {
2192 AnmBlend_e blendMode = stateArg<AnmBlend_e>();
2199 walkActionInit_Move(blendMode);
2201 walkActionInit_Wait(blendMode);
2203 if (isItemKinopio()) {
2204 setControlDemoKinopioWalk();
2218void dAcPy_c::executeState_Walk() {
2219 daPlBase_c::executeState_Walk();
2220 mAccelY = getGravityData()[0];
2232 if (isOnSinkSand()) {
2235 if (!checkWalkNextAction()) {
2244 if (!(mPyMdlMng.getFlags() & 0x1000) && mPyMdlMng.getFlags2() & 0x40) {
2245 mPyMdlMng.mpMdl->m_17c &= ~0x40;
2246 mPyMdlMng.mpMdl->releaseBodyAnm(0.0f);
2251void dAcPy_c::finalizeState_Walk() {
2252 daPlBase_c::finalizeState_Walk();
2253 mWaitFrameCount = 0;
2264 if (mPyMdlMng.getFlags2() & 0x40) {
2265 mPyMdlMng.mpMdl->m_17c &= ~0x40;
2266 mPyMdlMng.mpMdl->releaseBodyAnm(0.0f);
2270void dAcPy_c::setRunOnWaterEffect() {
2272 static const char *sc_waterRunEffectID[] = {
2273 "Wm_mr_waterrun_l_ss",
2274 "Wm_mr_waterrun_r_ss"
2280void dAcPy_c::initializeState_Turn() {
2284 if (getPowerChangeType(
false) == POWER_CHANGE_ICE) {
2285 mPyMdlMng.setAnm(PLAYER_ANIM_ICE_TURN, 0.0f, 0.0f);
2287 mPyMdlMng.setAnm(PLAYER_ANIM_TURN, 0.0f, 0.0f);
2289 mAngle.y = getMukiAngle((
mSpeedF < 0.0f) ? DIR_LR_L : DIR_LR_R);
2292 mAccelY = getGravityData()[0];
2298void dAcPy_c::finalizeState_Turn() {
2301 fadeOutTurnEffect();
2304void dAcPy_c::turnPowerSet() {
2313 sTurnPowerData data;
2319 if (
mBc.getSakaUpDown(dir) == 1) {
2328 mAccelF = getAccelF() * scTurnPowerUpRate;
2337void dAcPy_c::setTurnSmokeEffect() {
2339 mPyMdlMng.mpMdl->getJointPos(&efPos, 7);
2340 setBrakeSmokeEffect(efPos);
2341 daPlBase_c::setTurnSmokeEffect();
2344void dAcPy_c::executeState_Turn() {
2346 if (!checkWalkNextAction()) {
2349 setTurnSmokeEffect();
2354 if (!mKey.buttonWalk(
nullptr)) {
2362 setTurnSmokeEffect();
2366 fadeOutTurnEffect();
2368 if (getPowerChangeType(
false) == POWER_CHANGE_ICE) {
2369 mPyMdlMng.setAnm(PLAYER_ANIM_ICE_TURNED, 0.0f, 0.0f);
2371 mPyMdlMng.setAnm(PLAYER_ANIM_TURNED, 0.0f, 0.0f);
2376 float maxSpeed = 0.0f;
2378 if (mKey.buttonWalk(&dir)) {
2379 if (mKey.buttonDush()) {
2380 maxSpeed = sc_DirSpeed[dir] * getSpeedData()->mHighSpeed;
2382 maxSpeed = sc_DirSpeed[dir] * getSpeedData()->mLowSpeed;
2386 if (
mDirection != mPrevDirection || mPyMdlMng.isAnmStop()) {
2393bool dAcPy_c::checkCrouch() {
2403 if (mKey.buttonCrouch()) {
2415void dAcPy_c::setCrouchSmokeEffect() {
2421 mPyMdlMng.mpMdl->getJointPos(&efPos, 1);
2422 setBrakeSmokeEffect(efPos);
2427void dAcPy_c::initializeState_Crouch() {
2435 switch (stateArg<CrouchArg_e>()) {
2438 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP_START);
2440 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP_START, dPyMdlBase_c::scWaterCrouchAnmSpeed, 3.0f, 0.0f);
2444 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP, 3.0f, 0.0f);
2447 mPyMdlMng.setAnm(PLAYER_ANIM_S_JUMPED);
2458void dAcPy_c::finalizeState_Crouch() {
2470void dAcPy_c::CrouchActionGround() {
2471 if (isOnSinkSand() && setCancelCrouch()) {
2474 if (!setCrouchJump() && !checkCrouchSlip()) {
2479 setCrouchSmokeEffect();
2480 if (mKey.buttonCrouch() || !setCancelCrouch()) {
2487void dAcPy_c::CrouchActionWater() {
2488 if (mKey.triggerJump()) {
2493 if (!checkStandUpRoofOnLift()) {
2495 setWaterGroundJump();
2502 if (!mKey.buttonCrouch() && setCancelCrouch()) {
2509void dAcPy_c::executeState_Crouch() {
2516 simpleMoveSpeedSet();
2521 m_2e8.chase(0, 0x200);
2523 typedef void (dAcPy_c::*ActionProc)();
2524 static ActionProc l_CrouchActionProc[] = {
2525 &dAcPy_c::CrouchActionGround,
2526 &dAcPy_c::CrouchActionWater
2528 (this->*l_CrouchActionProc[
mSubstate])();
2529 int anmID = mPyMdlMng.getAnm();
2530 if (anmID == PLAYER_ANIM_STOOP_START || anmID == PLAYER_ANIM_S_JUMPED) {
2531 if (mPyMdlMng.isAnmStop()) {
2532 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP);
2537bool dAcPy_c::setCancelCrouch() {
2539 return daPlBase_c::setCancelCrouch();
2542dAcPy_c *dAcPy_c::getCarryPlayer() {
2545 return (dAcPy_c *) actor;
2550dActor_c *dAcPy_c::getCarryPropelBlock() {
2552 if (actor !=
nullptr && actor->
mProfName == fProfile::AC_PROP_BLOCK) {
2558dActor_c *dAcPy_c::getCarryPropelActor() {
2560 if (actor !=
nullptr) {
2562 dAcPy_c *player = (dAcPy_c *) actor;
2563 if (player->mPowerup == POWERUP_PROPELLER_SHROOM) {
2566 }
else if (actor->
mProfName == fProfile::AC_PROP_BLOCK) {
2573dActor_c *dAcPy_c::getCarryHardBlock() {
2575 if (actor !=
nullptr && (
2576 actor->
mProfName == fProfile::AC_LIGHT_BLOCK ||
2577 actor->
mProfName == fProfile::AC_PROP_BLOCK
2584bool dAcPy_c::isLiftUp() {
2585 if (isCarry() && m_1308 == 0) {
2591bool dAcPy_c::isCarryMamePlayer() {
2592 dAcPy_c *player = getCarryPlayer();
2593 if (player !=
nullptr && player->mPowerup == POWERUP_MINI_MUSHROOM) {
2599bool dAcPy_c::isLiftUpExceptMame() {
2600 if (isLiftUp() && !isCarryMamePlayer()) {
2606float dAcPy_c::getLiftUpOffset() {
2610mVec3_c dAcPy_c::getCarryPos() {
2612 mPyMdlMng.mpMdl->getJointPos(&jnt1, 11);
2613 mPyMdlMng.mpMdl->getJointPos(&jnt2, 14);
2615 mVec3_c res = (jnt1 + jnt2) / 2.0f;
2616 res.x = dScStage_c::getLoopPosX(res.x);
2617 if (mPyMdlMng.getFlags2() & 4) {
2618 res.y =
mPos.y + getLiftUpOffset();
2622 jnt2.x = dScStage_c::getLoopPosX(jnt2.x);
2627mVec3_c dAcPy_c::getLiftUpPos() {
2629 getModel()->getJointMtx(&mtx, 11);
2630 mtx.concat(mMtx_c::createTrans(5.0f, 0.0f, 0.0f));
2634 getModel()->getJointMtx(&mtx, 14);
2635 mtx.concat(mMtx_c::createTrans(5.0f, 0.0f, 0.0f));
2639 mVec3_c res = (tmp + tmp2) / 2.0f;
2640 res.x = dScStage_c::getLoopPosX(res.x);
2641 if (mPyMdlMng.getFlags2() & 4) {
2642 res.y =
mPos.y + getLiftUpOffset();
2643 if (res.y <
mPos.y + 2.0f) {
2644 res.y =
mPos.y + 2.0f;
2650void dAcPy_c::clearSpinLiftUpReserve() {
2655void dAcPy_c::checkSpinLiftUpReserve(
dCc_c *cc) {
2656 daPlBase_c *actor = (daPlBase_c *) cc->
getOwner();
2671void dAcPy_c::setSpinLiftUpReserve() {
2684 mPyMdlMng.mpMdl->m_17c |= 4;
2686 dAcPy_c *player = (dAcPy_c *) actor;
2687 mPyMdlMng.mpMdl->mpSpinLiftParentMdl = player->getModel();
2690 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_7, 0,
false);
2693 clearSpinLiftUpReserve();
2697void dAcPy_c::checkSpinLiftUpRoofHeight() {
2699 float _unused = mWallBcData.mOffset;
2702 if (dBc_c::checkTenjou(&pos, &height,
mLayer, 1) && f > height) {
2709 if (actor ==
nullptr || isCarry() || !mKey.buttonCarry()) {
2718 mPyMdlMng.mpMdl->m_17c |= 2;
2719 mPyMdlMng.mpMdl->setBodyAnm(PLAYER_ANIM_RCARRY_WAIT, 1.0f, 0.0f, 0.0f);
2726bool dAcPy_c::cancelCarry(
dActor_c *carriedActor) {
2728 if (actor == carriedActor || carriedActor ==
nullptr) {
2729 mPyMdlMng.mpMdl->m_17c &= ~0x6;
2730 mPyMdlMng.mpMdl->releaseBodyAnm(0.0f);
2731 mPyMdlMng.mpMdl->mpSpinLiftParentMdl =
nullptr;
2738void dAcPy_c::releaseCarryActor() {
2743 if (actor !=
nullptr) {
2745 dAcPy_c *player = (dAcPy_c *) actor;
2746 player->setCarryOffFall(
this);
2756void dAcPy_c::setCarryOffFall(
const dAcPy_c *carrier) {
2762 *(
const dAcPy_c **) &carrier =
nullptr;
2768bool dAcPy_c::checkEnableThrow() {
2773 if (actor ==
nullptr) {
2774 cancelCarry(
nullptr);
2777 return !mKey.buttonCarry();
2780bool dAcPy_c::checkCarryThrow() {
2781 if (checkEnableThrow()) {
2782 if (isState(StateID_Propel)) {
2793void dAcPy_c::initializeThrowCommonBase() {
2796 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_THROW);
2800 mPyMdlMng.setAnm(PLAYER_ANIM_CARRY_P_THROW, 0.0f, 0.0f);
2802 mPyMdlMng.setAnm(PLAYER_ANIM_CARRY_THROW, 0.0f, 0.0f);
2809void dAcPy_c::initializeThrowCommon() {
2810 initializeThrowCommonBase();
2815void dAcPy_c::finalizeThrowCommonBase() {
2819void dAcPy_c::finalizeThrowCommon() {
2820 finalizeThrowCommonBase();
2822 releaseCarryActor();
2830void dAcPy_c::setThrowActor() {
2835 if (actor !=
nullptr) {
2837 dAcPy_c *player = (dAcPy_c *) actor;
2841 float speed = getDirSpeed();
2843 if (getDirSpeed() *
mSpeedF >= 0.0f) {
2850 player->setNoHitPlayer(
this, 10);
2852 mVec3_c pos = player->
mPos;
2854 float spd = speed + sc_DirSpeed[
mDirection] * 5.0f;
2857 }
else if (spd > 8.0f) {
2861 mVec3_c p(
mPos.x, pos.y, pos.z);
2864 float thing = sc_DirSpeed[
mDirection] * std::fabs(getWallBgPointData()->mOffset / 4096.0f);
2865 mVec3_c playerPos(pos.x + thing, pos.y, pos.z);
2867 if (dBc_c::checkWall(&p, &playerPos, &hitX,
mLayer, 1,
nullptr)) {
2869 if (mPowerup == POWERUP_NONE) {
2870 mVec3_c revPos(hitX, pos.y + 16.0f, pos.z);
2872 if (dBc_c::checkGround(&revPos, &hitY,
mLayer, 1, -1)) {
2873 if (hitY <=
mPos.y + 16.0f) {
2874 pos.y =
mPos.y + 16.0f;
2881 pos.x = hitX - thing;
2884 p.set(pos.x, pos.y + 1.0f, pos.z);
2885 if (dBc_c::checkTenjou(&p, &hitX,
mLayer, 1)) {
2886 float offsX = std::fabs(getHeadBgPointData()->mOffset / 4096.0f);
2888 if (pos.y > hitX - offsX) {
2889 pos.y = hitX - offsX;
2904void dAcPy_c::executeThrowCommon() {
2911 case THROW_ACTION_0:
2912 if (mPyMdlMng.mpMdl->mCurrAnmID == PLAYER_ANIM_SWIM_THROW) {
2913 if (mPyMdlMng.mpMdl->mAnm.checkFrame(12.0f)) {
2918 if (isNowBgCross(
BGC_FOOT) && mKey.triggerJump()) {
2923 if (mPyMdlMng.mpMdl->mAnm.checkFrame(5.0f)) {
2930 case THROW_ACTION_1:
2931 if (isNowBgCross(
BGC_FOOT) && checkJumpTrigger()) {
2934 if (mPyMdlMng.mpMdl->mAnm.getFrame() >= 20.0f) {
2944 if (mPyMdlMng.isAnmStop()) {
2948 case THROW_ACTION_2:
2949 if (mPyMdlMng.isAnmStop()) {
2956void dAcPy_c::initializeState_Throw() {
2957 initializeThrowCommon();
2960void dAcPy_c::finalizeState_Throw() {
2961 finalizeThrowCommon();
2964void dAcPy_c::executeState_Throw() {
2966 setWaterMoveSpeed();
2970 simpleMoveSpeedSet();
2973 executeThrowCommon();
2976void dAcPy_c::initializeState_PropelThrow() {
2977 initializeThrowCommon();
2980void dAcPy_c::finalizeState_PropelThrow() {
2981 finalizeThrowCommon();
2984void dAcPy_c::executeState_PropelThrow() {
2985 if (!isNowBgCross(
BGC_FOOT) && mKey.buttonJump()) {
2989 mAccelY = getGravityData()[0];
2992 mAccelF = getSpeedData()->mPowerChangeNormal.mSlowAccel;
2994 executeThrowCommon();
3017 mRideActorID = carryingActor->
mUniqueID;
3022 dQuake_c::getInstance()->shockMotor(
getPlrNo(), dQuake_c::TYPE_7, 0,
false);
3025void dAcPy_c::initializeState_LiftUp() {
3030 dAcPy_c *carryPlayer = getCarryPlayer();
3031 setVirusStar(carryPlayer);
3032 if (carryPlayer !=
nullptr) {
3038 mPyMdlMng.setAnm(PLAYER_ANIM_CARRY_P_START, 0.0f, 0.0f);
3045void dAcPy_c::finalizeState_LiftUp() {
3052void dAcPy_c::executeState_LiftUp() {
3054 float f = m_130c / 30.0f;
3072 simpleMoveSpeedSet();
3074 if (checkCarryThrow()) {
3076 if (mKey.buttonWalk(&dir)) {
3081 }
else if (checkJumpTrigger()) {
3082 sBcPointData d1 = mWallBcData;
3083 sBcPointData d2 = mHeadBcData;
3092 if (mPyMdlMng.isAnmStop()) {
3102 *fOut *= data_802f5a48[15];
3103 if (*fOut * f1 >= 0.0f && std::fabs(f2) > data_802f5a48[17]) {
3108 if (*fOut * f1 < 0.0f) {
3109 if (f2 * f1 > 0.0f) {
3110 if (std::fabs(f2) > 0.5f) {
3114 *fOut *= data_802f5a48[16];
3116 float lim = data_802f5a48[11] - 0.01f;
3117 if (std::fabs(*fOut) > lim) {
3127void dAcPy_c::setUzuSpeedY(
float f) {
3128 if (std::fabs(
mSpeed.y) < 2.0f) {
3141 if (f * mUzuSwimSpeed.y < 0.0f) {
3148void dAcPy_c::setUzuSpeedF(
float f) {
3149 if (std::fabs(
mSpeedF) < 2.0f) {
3151 if (f * mUzuSwimSpeed.x < 0.0f) {
3158bool dAcPy_c::setUzuSwimAction() {
3166bool dAcPy_c::setSwimAction() {
3183void dAcPy_c::setWaterInEffect() {
3184 dScStage_c *stage = dScStage_c::m_instance;
3185 bool bigSplash =
false;
3189 mAng3_c efAng(0, 0, -mAirWaterHitAngle);
3190 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_wfloatsplash", 0, &mAirWaterHitPos, &efAng,
nullptr);
3194 stage->mCurrWorld == WORLD_4 &&
3195 stage->mCurrCourse == STAGE_CASTLE &&
3196 stage->mCurrFile == 1
3200 mVec3_c efPos(
mPos.x, mWaterHeight,
mPos.z);
3201 if (bigSplash || mWaterDepth == 3) {
3204 if (mPowerup == POWERUP_MINI_MUSHROOM) {
3210 if (mPowerup == POWERUP_NONE) {
3215 dBg_c::m_bg_p->setWaterInWave(efPos.x, efPos.y, 1);
3218 if (mPowerup == POWERUP_MINI_MUSHROOM) {
3220 }
else if (mPowerup == POWERUP_NONE) {
3224 if (mPowerup == POWERUP_MINI_MUSHROOM) {
3225 startSound(SE_PLY_SPLASH_SHALLOW_MAME,
false);
3229 dBg_c::m_bg_p->setWaterInWave(efPos.x, efPos.y, 0);
3233void dAcPy_c::setWaterOutEffect() {
3236 mAng3_c efAng(0, 0, -mAirWaterHitAngle);
3237 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_wfloatsplash", 0, &mAirWaterHitPos, &efAng,
nullptr);
3240 mVec3_c efPos(
mPos.x, mPrevWaterHeight,
mPos.z);
3242 if (mWaterDepth == 3) {
3245 if (mPowerup == POWERUP_MINI_MUSHROOM) {
3249 if (mPowerup == POWERUP_NONE) {
3254 dBg_c::m_bg_p->setWaterInWave(efPos.x, efPos.y, 3);
3258 if (mPowerup == POWERUP_MINI_MUSHROOM) {
3260 }
else if (mPowerup == POWERUP_NONE) {
3264 startSound(SE_PLY_SPLASH_SHALLOW_OUT,
false);
3265 dBg_c::m_bg_p->setWaterInWave(efPos.x, efPos.y, 2);
3269void dAcPy_c::setPaddleSwimEffect() {
3271 mPyMdlMng.mpMdl->getJointPos(&efPos, 11);
3272 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf9,
"Wm_mr_swimpaddle", 0, &efPos,
nullptr,
nullptr);
3273 mPyMdlMng.mpMdl->getJointPos(&efPos, 14);
3274 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf10,
"Wm_mr_swimpaddle", 0, &efPos,
nullptr,
nullptr);
3277void dAcPy_c::resetPaddleSwimEffect() {
3282void dAcPy_c::setWaterSurfaceSwimEffect() {
3283 if (getWaterCheckPosY() < mWaterHeight - 4.0f) {
3286 mVec3_c efPos(
mPos.x, mWaterHeight,
mPos.z);
3287 mAng3_c efAng(0, 0, 0);
3291 static const float sc_waterFaceEffectScale[] = { 0.65f, 0.8f, 1.0f };
3292 float s = sc_waterFaceEffectScale[getTallType(-1)];
3293 mVec3_c scale(s, s, s);
3294 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf11,
"Wm_mr_waterswim", 0, &efPos,
nullptr, &scale);
3295 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf12,
"Wm_en_cmnwater02", 0, &efPos, &efAng, &scale);
3298void dAcPy_c::setFlutterKickEffect() {
3300 mPyMdlMng.mpMdl->getJointPos(&efPos, 4);
3301 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf9,
"Wm_mr_flutterkick", 0, &efPos,
nullptr,
nullptr);
3302 mPyMdlMng.mpMdl->getJointPos(&efPos, 7);
3303 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf10,
"Wm_mr_flutterkick", 0, &efPos,
nullptr,
nullptr);
3306void dAcPy_c::initializeState_Swim() {
3312 SwimArg_e param = stateArg<SwimArg_e>();
3322 if (m_b98 != 0 &&
mSpeed.y < -0.5f) {
3327 setInitSwimAction_FireBall();
3329 dAcPy_c *carryPlayer = getCarryPlayer();
3330 if (carryPlayer !=
nullptr) {
3333 if (dBc_c::checkTenjou(&pos, &height,
mLayer, mAmiLayer)) {
3335 releaseCarryActor();
3343 if (mPowerup == POWERUP_PENGUIN_SUIT) {
3345 setSwimAction_Penguin(blendMode);
3347 setSwimAction_Swim(blendMode);
3349 }
else if (isNowBgCross(
BGC_FOOT)) {
3350 setSwimAction_Walk(blendMode);
3352 setSwimAction_Swim(blendMode);
3358 if (isItemKinopio()) {
3359 setControlDemoKinopioSwim();
3363bool dAcPy_c::setWaterSurfaceJump() {
3364 if (mKey.triggerJump()) {
3366 if (mKey.buttonUp()) {
3374 if (!isNowBgCross(
BGC_WATER_TOUCH) && (!isCarry() || mPowerup != POWERUP_MINI_MUSHROOM)) {
3375 if (
mSubstate == SWIM_ACTION_3 && m_b89 == 0) {
3382 if (
mSubstate == SWIM_ACTION_3 && m_b89 == 0) {
3386 if (isMameAction()) {
3402void dAcPy_c::setSwimAction_Swim(AnmBlend_e blendMode) {
3408 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_WAIT);
3410 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_WAIT, 0.0f, 0.0f);
3415void dAcPy_c::SwimAction_Swim() {
3416 if (mPowerup == POWERUP_PENGUIN_SUIT && !isCarry()) {
3420 setWaterMoveSpeed();
3422 if (checkEnableThrow()) {
3427 if (setWaterSurfaceJump()) {
3430 if (isNowBgCross(
BGC_FOOT) && mPowerup != POWERUP_PENGUIN_SUIT) {
3434 setWaterSurfaceSwimEffect();
3436 if (mKey.triggerJump()) {
3443 if (isNowBgCross(BGC_NON_BREAK_BLOCK_HIT)) {
3449 if (mKey.triggerJump()) {
3451 mPyMdlMng.setAnm(PLAYER_ANIM_PADDLE_1);
3453 }
else if (mKey.buttonJump()) {
3455 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM);
3459 setPaddleSwimEffect();
3460 if (mKey.triggerJump() && mPyMdlMng.mpMdl->mAnm.getFrame() > 9.0f) {
3461 mPyMdlMng.mpMdl->setFrame(0.0f);
3462 resetPaddleSwimEffect();
3465 if (mPyMdlMng.isAnmStop()) {
3466 if (mKey.buttonJump()) {
3468 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM);
3471 mPyMdlMng.setAnm(PLAYER_ANIM_PADDLE_2);
3476 mPyMdlMng.mpMdl->setRate(1.0f);
3477 if (mPyMdlMng.mpMdl->mAnm.checkFrame(1.0f) || mPyMdlMng.mpMdl->mAnm.checkFrame(9.0f)) {
3480 setFlutterKickEffect();
3481 if (!mKey.buttonJump()) {
3483 mPyMdlMng.setAnm(PLAYER_ANIM_PADDLE_2);
3487 if (mPyMdlMng.isAnmStop()) {
3489 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_WAIT);
3495 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_WAIT);
3501void dAcPy_c::setSeaLandSmokeEffect() {
3502 static const char *sc_hipAttackEffectID[] = {
3503 "Wm_mr_sealandsmk_ss",
3504 "Wm_mr_sealandsmk_s",
3507 dEf::createPlayerEffect_change(
mPlayerNo, sc_hipAttackEffectID[getTallType(-1)], 0, &
mPos,
nullptr,
nullptr);
3510void dAcPy_c::setSwimActionWalkAnm() {
3512 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_STANDING);
3517 f = std::fabs(
mSpeedF) - sc_WaterWalkSpeed + 1.0f;
3520 }
else if (f > 2.0f) {
3524 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_WALK, f, 10.0f, 0.0f);
3527void dAcPy_c::setSwimAction_Walk(AnmBlend_e blendMode) {
3529 setSeaLandSmokeEffect();
3534 setSwimActionWalkAnm();
3536 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_STANDING);
3540void dAcPy_c::setWaterGroundJump() {
3541 mSpeed.y = sc_WaterJumpSpeed;
3547void dAcPy_c::SwimAction_Walk() {
3548 if (mPowerup == POWERUP_PENGUIN_SUIT) {
3552 setWaterMoveSpeed();
3554 if (mKey.triggerJump()) {
3555 if (!setWaterSurfaceJump()) {
3556 setWaterGroundJump();
3562 if (!checkCrouch()) {
3563 setSwimActionWalkAnm();
3569s16 dAcPy_c::getPenguinSwinAngleX() {
3570 float f = std::fabs(mUzuSwimSpeed.x);
3574 float cos = mUzuSwimSpeed.y;
3575 if (mKey.buttonUp()) {
3580 if (mKey.buttonDown()) {
3586 return -(
cM::atan2s(f, mUzuSwimSpeed.y) - 0x4000);
3589void dAcPy_c::setSwimAction_Penguin(AnmBlend_e blendMode) {
3592 if (m_b80 != 0 || getOldState() == StateID_HipAttack) {
3595 mPyMdlMng.setAnm(PLAYER_ANIM_P_SWIM);
3597 mPyMdlMng.setAnm(PLAYER_ANIM_P_SWIM, 0.0f, 0.0f);
3610 mPyMdlMng.setAnm(PLAYER_ANIM_P_SWIM);
3612 mPyMdlMng.setAnm(PLAYER_ANIM_P_SWIM, 0.0f, 0.0f);
3616void dAcPy_c::setPenWaterMoveSpeed(
int i) {
3617 if (m_b98 != 0 && mKey.triggerDown()) {
3620 bool noUpDown =
false;
3621 if (mKey.buttonUp() || m_b98 == 0 && mKey.buttonDown()) {
3625 if (mKey.buttonWalk(
nullptr)) {
3634 if (mKey.buttonDown()) {
3639 mAngle.x.chase(getPenguinSwinAngleX(), 0x300);
3640 float f3 = getData(9);
3658 float d = getData(5);
3659 if (std::fabs(
mSpeed.y) >= d) {
3663 float target = mAng(ang).sin() * f2;
3664 mUzuSwimSpeed.y = target;
3665 float offs =
mPos.y + getModelHeight() / 2.0f;
3666 if (mWaterHeight <= offs) {
3669 f3 = std::fabs(-24.0f / 256.0f);
3671 f3 = std::fabs(-7.0f / 256.0f);
3674 if (
mSpeed.y < -getData(6)) {
3675 f3 = std::fabs(-24.0f / 256.0f);
3694 if (std::fabs(
mSpeedF) < 0.3f) {
3696 }
else if (noUpDown) {
3702 float d = getData(7);
3703 if (std::fabs(
mSpeedF) >= d) {
3708 mUzuSwimSpeed.x = mAng(ang).cos() * f2 * sc_DirSpeed[
mDirection];
3710 if (dWaterEntryMng_c::m_instance->m_8c0) {
3713 float f5 = mUzuSwimSpeed.x + f4 * 0.3f;
3714 float f10 = f3 + f4 * 0.005f;
3715 if (mUzuSwimSpeed.x * f4 < 0.0f) {
3717 f5 = mUzuSwimSpeed.x + f4 * 0.1f;
3718 f10 = f3 + f4 * 0.0001f;
3720 f5 = mUzuSwimSpeed.x + f4 * 0.13f;
3721 if (std::fabs(
mSpeedF) < 1.0f) {
3724 f10 = f3 + f4 * 0.003f;
3733 if (b || noUpDown || i != 0) {
3740bool dAcPy_c::setPenguinPaddleSwim() {
3741 if (mKey.triggerJump()) {
3743 mPyMdlMng.setAnm(PLAYER_ANIM_P_PADDLE_1);
3751void dAcPy_c::SwimAction_Penguin() {
3752 if (mPowerup != POWERUP_PENGUIN_SUIT || isCarry()) {
3756 if (setWaterSurfaceJump()) {
3759 setWaterSurfaceSwimEffect();
3766 mPyMdlMng.setAnm(PLAYER_ANIM_P_SWIM);
3770 if (mPyMdlMng.mpMdl->mAnm.checkFrame(1.0f) || mPyMdlMng.mpMdl->mAnm.checkFrame(9.0f)) {
3773 float rate = mPyMdlMng.mpMdl->mAnm.getRate();
3774 if (m_b8c == 1.0f) {
3775 setFlutterKickEffect();
3780 mPyMdlMng.mpMdl->setRate(rate);
3781 if (setPenguinPaddleSwim()) {
3787 setPaddleSwimEffect();
3788 if (mPyMdlMng.mpMdl->mAnm.getFrame() < 9.0f) {
3791 if (mPyMdlMng.isAnmStop()) {
3793 mPyMdlMng.setAnm(PLAYER_ANIM_P_PADDLE_2);
3797 if (setPenguinPaddleSwim()) {
3800 if (mPyMdlMng.isAnmStop()) {
3803 mPyMdlMng.setAnm(PLAYER_ANIM_P_SWIM);
3808 setPenWaterMoveSpeed(moveMode);
3811void dAcPy_c::setInitSwimAction_FireBall() {
3815 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_FIRE_AT, dPyMdlBase_c::scFireShootFrame);
3820void dAcPy_c::setSwimAction_FireBall() {
3824 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_FIRE_AT2);
3826 mPyMdlMng.setAnm(PLAYER_ANIM_SWIM_FIRE_AT);
3828 mPyMdlMng.mpMdl->setFrame(0.0f);
3833void dAcPy_c::SwimAction_FireBall() {
3834 if (setWaterSurfaceJump()) {
3837 if (mPowerup != POWERUP_PENGUIN_SUIT) {
3838 setWaterMoveSpeed();
3841 setPenWaterMoveSpeed(0);
3845 if (mPyMdlMng.mpMdl->mAnm.checkFrame(dPyMdlBase_c::scFireShootFrame)) {
3851 if (checkSetFireBall()) {
3852 setSwimAction_FireBall();
3853 }
else if (mPyMdlMng.isAnmStop()) {
3854 if (mPowerup == POWERUP_PENGUIN_SUIT) {
3856 }
else if (isNowBgCross(
BGC_FOOT)) {
3866void dAcPy_c::setWaterMoveSpeed() {
3867 float targetY = -1.5f;
3868 float accelY = getGravityData()[0];
3870 float posY =
mPos.y + getModelHeight() / 2.0f;
3871 if (std::fabs(mWaterHeight - posY) < 0.2f && std::fabs(
mSpeed.y) < 0.1f) {
3875 }
else if (mWaterHeight > posY) {
3877 accelY = -0.04296875f;
3880 accelY = -0.04296875f;
3889 }
else if (!mKey.buttonJump()) {
3895 if (speedY < 0.0f) {
3896 if (speedY < targetY) {
3899 accelY = -0.02734375f;
3902 accelY = -0.04296875f;
3910 if (mPowerup == POWERUP_PENGUIN_SUIT) {
3912 maxSpeedF = 0.84375f;
3914 maxSpeedF = 1.6875f;
3916 }
else if (isNowBgCross(
BGC_FOOT)) {
3917 maxSpeedF = sc_WaterWalkSpeed;
3919 maxSpeedF = sc_WaterSwimSpeed;
3920 if (m_b84 != 0 && std::fabs(
mSpeedF) > std::fabs(sc_WaterSwimSpeed)) {
3924 float targetF = 0.0f;
3925 if (mKey.buttonWalk(
nullptr)) {
3926 targetF = maxSpeedF * sc_DirSpeed[
mDirection];
3928 targetF += dWaterEntryMng_c::m_instance->get_8c0() * 0.3f;
3930 float absSpeedF = std::fabs(
mSpeedF);
3932 if (mPowerup == POWERUP_PENGUIN_SUIT) {
3934 if (speedF * targetF < 0.0f) {
3936 }
else if (absSpeedF > std::fabs(targetF)) {
3941 }
else if (isState(StateID_Crouch)) {
3948 if (speedF * targetF < 0.0f) {
3950 }
else if (absSpeedF > std::fabs(targetF)) {
3959 }
else if (absSpeedF > std::fabs(targetF)) {
3965 }
else if (isState(StateID_Crouch)) {
3971 if (mKey.buttonWalk(
nullptr)) {
3976void dAcPy_c::executeState_Swim() {
3988 if (
mSpeed.y >= -0.25f) {
3995 if (
mSubstate != SWIM_ACTION_3 && checkSetFireBall()) {
3996 setSwimAction_FireBall();
3999 typedef void (dAcPy_c::*SwimActionProc)();
4000 static SwimActionProc l_SwimActionProc[] = {
4001 &dAcPy_c::SwimAction_Swim,
4002 &dAcPy_c::SwimAction_Walk,
4003 &dAcPy_c::SwimAction_Penguin,
4004 &dAcPy_c::SwimAction_FireBall,
4007 calcPenguinSwimGroundRev();
4011void dAcPy_c::calcPenguinSwimGroundRev() {
4022 rotMtx.concat(mMtx_c::createTrans(0.0f, 8.0f, 0.0f));
4024 rotMtx.concat(mMtx_c::createTrans(0.0f, 8.0f, 0.0f));
4026 rotMtx.concat(mMtx_c::createTrans(0.0f, 0.0f, 20.0f));
4029 const sBcPointData *bgPointData = getWallBgPointData();
4030 if (bgPointData !=
nullptr) {
4032 bgOffs[0] = bgPointData->mInfMargin / 4096.0f;
4033 bgOffs[1] = bgPointData->mSupMargin / 4096.0f;
4035 mVec3_c wallPos2(resVec.x,
mPos.y + bgOffs[0], resVec.z);
4036 for (
int i = 0; i < 2; i++) {
4038 wallPos2.set(resVec.x,
mPos.y + bgOffs[i], resVec.z);
4040 if (dBc_c::checkWall(&wallPos1, &wallPos2, &wallX,
mLayer, 1,
nullptr)) {
4041 f1 = wallX - resVec.x;
4042 if (
mPos.x < resVec.x) {
4043 resVec.x = wallX - 1.0f;
4045 resVec.x = wallX + 1.0f;
4050 mVec3_c groundPos(resVec.x,
mPos.y + 4.0f, resVec.z);
4052 if (dBc_c::checkGround(&groundPos, &groundHeight,
mLayer, 1, -1) && groundHeight > resVec.y) {
4053 f2 = groundHeight - resVec.y;
4059void dAcPy_c::finalizeState_Swim() {
4069 if (dBc_c::checkGround(&
mPos, &groundHeight,
mLayer, 1, -1)) {
4070 if (
mPos.y <= groundHeight) {
4071 mPos.y = groundHeight;
4082 setWaterOutEffect();
4086void dAcPy_c::setIvyHangEffect() {
4088 mPyMdlMng.mpMdl->getJointMtx(&jntMtx, 11);
4091 mPyMdlMng.mpMdl->getJointMtx(&jntMtx, 14);
4094 mVec3_c efPos = (v1 + v2) / 2.0f;
4096 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf6,
"Wm_mr_ivy", 0, &efPos,
nullptr,
nullptr);
4099bool dAcPy_c::setVineAction() {
4105 if (
mBc.mFenceType == 1) {
4116float dAcPy_c::getHangBcOffsetY() {
4117 static const float scHangOffsetY[] = {
4118 16.0f, 27.0f, 27.0f, 12.0f, 27.0f, 27.0f, 27.0f
4120 static const float scKinopioHangOffsetY[] = {
4121 13.0f, 21.0f, 21.0f, 9.0f, 21.0f, 21.0f, 21.0f
4124 if (!(mPlayerType != PLAYER_MARIO && mPlayerType != PLAYER_LUIGI)) {
4125 return scHangOffsetY[mPowerup];
4127 return scKinopioHangOffsetY[mPowerup];
4131bool dAcPy_c::setKaniHangToVineAction() {
4132 if (mKey.buttonDown()) {
4133 float y =
mPos.y - 1.0f;
4134 float x2 =
mPos.x + (mVineBcData.mOffset / 4096.0f);
4135 float x1 =
mPos.x - (mVineBcData.mOffset / 4096.0f + 1.0f);
4137 dBc_c::getUnitType(x1, y,
mLayer) & 0x400 ||
4138 dBc_c::getUnitType(x2, y,
mLayer) & 0x400
4140 mPos.y -= getHangBcOffsetY();
4149bool dAcPy_c::setVineToKaniHangAction() {
4150 if (mKey.buttonUp()) {
4151 sBcPointData r = mVineBcData;
4152 r.mInfMargin = getHangBcOffsetY() * 4096.0f;
4153 if (!(
mBc.checkVineCollision(&r) & 3)) {
4154 float y =
mPos.y + getHangBcOffsetY();
4156 short groundY = (((short) y) & 0xfff0) - 16;
4157 u32 unitKind = dBc_c::getUnitKind(x, groundY + 1.0f,
mLayer);
4158 if ((unitKind >> 16 & 0xff) == 8) {
4159 mPos.y += getHangBcOffsetY();
4169void dAcPy_c::initializeState_Vine() {
4179 if (mAmiLayer == 1) {
4186 mBc.mPlayerFlags |= 1;
4187 switch (changeParam) {
4191 switch (
mBc.mFenceType) {
4195 mPyMdlMng.setAnm(PLAYER_ANIM_PEA_PLANT_ST);
4199 mPyMdlMng.setAnm(PLAYER_ANIM_PEA_PLANT_WAIT);
4205 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
4210 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
4216 mPyMdlMng.setAnm(PLAYER_ANIM_PEA_PLANT_WAIT);
4221 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT, 0.0f, 0.0f);
4227void dAcPy_c::calcVineSpeed() {
4229 switch (
mBc.mFenceType) {
4232 if (mKey.buttonDush()) {
4239 if (mKey.buttonDush()) {
4247 if (mKey.buttonUp()) {
4251 }
else if (mKey.buttonDown()) {
4256 switch (
mBc.mFenceType) {
4258 if (mKey.buttonDush()) {
4263 if (mKey.buttonUp() || mKey.buttonDown()) {
4268 if (mKey.buttonDush()) {
4275 if (mKey.buttonDush()) {
4282 if (mKey.buttonLeft()) {
4283 if (!isNowBgCross(BGC_WALL_TOUCH_L_2)) {
4286 }
else if (mKey.buttonRight()) {
4287 if (!isNowBgCross(BGC_WALL_TOUCH_R_2)) {
4293bool dAcPy_c::checkVineEnd() {
4296 if (isNowBgCross(BGC_CLIFF)) {
4307void dAcPy_c::setVineWalkSE() {
4308 if (mPyMdlMng.mpMdl->mAnm.checkFrame(10.0f) || mPyMdlMng.mpMdl->mAnm.checkFrame(30.0f)) {
4309 switch (
mBc.mFenceType) {
4317 startSound(SE_PLY_FOOTNOTE_ROCK_CLIMB,
false);
4323void dAcPy_c::VineActionIvy() {
4327 if (checkVineEnd()) {
4332 if (mPyMdlMng.isAnmStop()) {
4338 if (mKey.buttonDush()) {
4346 mPyMdlMng.setAnm(PLAYER_ANIM_PEA_PLANT, blend, 0.0f, 0.0f);
4347 if (
mBc.mFenceType == 0 && m_7c4 == 0) {
4352 mPyMdlMng.setAnm(PLAYER_ANIM_PEA_PLANT_WAIT, 0.0f);
4358void dAcPy_c::VineActionNet() {
4359 if (checkVineEnd()) {
4362 switch (
mBc.mFenceType) {
4369 case POWERUP_MINI_MUSHROOM:
4379 if (mKey.triggerAttack()) {
4382 mPyMdlMng.setAnm(PLAYER_ANIM_NET_ATTACK);
4390 if (setVineToKaniHangAction()) {
4397 if (
mBc.mpFenceCollision !=
nullptr) {
4398 short s = abs(
mBc.mpFenceCollision->m_c2);
4402 float tmp = s * 0.5f;
4403 f = tmp / 128.0f + 1.0f;
4405 if (!mKey.buttonUp()) {
4410 if (mKey.buttonDush()) {
4419 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WALK1, rate, 0.0f, 0.0f);
4425 if (mKey.buttonDush()) {
4431 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WALK2, rate, 0.0f, 0.0f);
4434 }
else if (f > 1.0f) {
4435 if (mKey.buttonLeft() || mKey.buttonRight()) {
4436 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WALK2, 0.6f * f, 0.0f, 0.0f);
4438 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WALK1, 0.6f * f, 0.0f, 0.0f);
4441 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
4445void dAcPy_c::VineActionAttack() {
4446 if (checkVineEnd()) {
4449 u16 frame = mPyMdlMng.mpMdl->mAnm.getFrame();
4450 if (mPyMdlMng.mpMdl->mAnm.checkFrame(3.0f)) {
4453 mPyMdlMng.mpMdl->getJointMtx(&jntMtx, 14);
4454 jntMtx.concat(mMtx_c::createTrans(3.0f, 0.0f, 0.0f));
4457 dEf::createPlayerEffect_change(
mPlayerNo,
"Wm_mr_wirehit", 0, &efPos,
nullptr,
nullptr);
4461 if (frame >= 12.0f && mKey.buttonCross() || mPyMdlMng.isAnmStop()) {
4465 if (mKey.triggerAttack()) {
4469 mPyMdlMng.mpMdl->setFrame(0.0f);
4473 if (frame < 24.0f) {
4479void dAcPy_c::VineActionRoll() {
4483 if (mPyMdlMng.isAnmStop()) {
4485 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
4490 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
4496void dAcPy_c::executeState_Vine() {
4502 typedef void (dAcPy_c::*VineActionProc_t)();
4503 static VineActionProc_t l_VineActionProc[] = {
4504 &dAcPy_c::VineActionIvy,
4505 &dAcPy_c::VineActionNet,
4506 &dAcPy_c::VineActionAttack,
4507 &dAcPy_c::VineActionRoll
4512bool dAcPy_c::checkNetPunch() {
4514 isState(StateID_Vine) &&
4516 mPyMdlMng.mpMdl->mAnm.getFrame() >= 10.0f
4525bool dAcPy_c::setAmiRollAction(
mVec3_c *pos) {
4526 if (isState(StateID_Vine)) {
4530 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
4535 mAmiXDiff =
mPos.x - mAmiRollPos.x;
4542bool dAcPy_c::isAmiRollAction() {
4543 if (isState(StateID_Vine) &&
mSubstate == VINE_ACTION_ROLL) {
4549void dAcPy_c::setAmiRollPos(
short ang,
float f) {
4550 float cos = mAng(ang).cos();
4551 float sin = mAng(ang).sin();
4553 mAmiRollPos.x + cos * mAmiXDiff + sin * mAmiRelated,
4555 mAmiRollPos.z + cos * mAmiRelated - sin * mAmiXDiff
4557 setAmiRollPos(ang, f, v);
4560void dAcPy_c::setAmiRollPos(
short ang,
float f,
mVec3_c &v) {
4561 if (isAmiRollAction()) {
4562 mAngle.y = mAmiAng + ang;
4568void dAcPy_c::endAmiRollAction(
short ang) {
4569 if (isAmiRollAction()) {
4570 mAng newAng = m_7c0 + ang;
4573 if (m_7c0 == 0x8000) {
4578 mAmiRelated2 = 1.0f;
4583void dAcPy_c::finalizeState_Vine() {
4584 mAccelY = getGravityData()[0];
4589 mBc.mPlayerFlags &= ~1;
4592void dAcPy_c::setCarryPlayerHang(
float height) {
4593 mPos.y = height - mHeadBcData.mOffset / 4096.0f;
4594 onNowBgCross(BGC_HANG_ROPE);
4598bool dAcPy_c::setHangAction() {
4599 if (isNowBgCross(BGC_HANG_ROPE)) {
4600 dAcPy_c *carryPlayer = getCarryPlayer();
4601 if (carryPlayer !=
nullptr && carryPlayer->
isStatus(STATUS_9C) && !carryPlayer->isCarry()) {
4602 float hangHeight =
mPos.y + mHeadBcData.mOffset / 4096.0f;
4603 releaseCarryActor();
4604 carryPlayer->setCarryPlayerHang(hangHeight);
4615void dAcPy_c::initializeState_Hang() {
4623 if (mPlayerType == PLAYER_YELLOW_TOAD || mPlayerType == PLAYER_BLUE_TOAD) {
4624 static const float scHangOffsetY[POWERUP_COUNT] = { 4.5f, 10.0f, 10.0f, 1.0f, 10.0f, 9.0f, 10.0f };
4625 m_1598 = scHangOffsetY[mPowerup];
4627 mPyMdlMng.setAnm(PLAYER_ANIM_MONKEY_START);
4628 setZPositionDirect(400.0f);
4632void dAcPy_c::HangActionStart() {
4635 if (mPyMdlMng.isAnmStop()) {
4636 setHangActionWait();
4637 }
else if (mKey.buttonRight() || mKey.buttonLeft()) {
4638 setHangActionMove();
4642void dAcPy_c::setHangActionWait() {
4644 static const int scHangWaitAnm[] = { PLAYER_ANIM_MONKEY_WAIT_R, PLAYER_ANIM_MONKEY_WAIT_L };
4645 mPyMdlMng.setAnm(scHangWaitAnm[m_8f0]);
4648void dAcPy_c::HangActionWait() {
4650 if (mKey.buttonRight() || mKey.buttonLeft()) {
4651 setHangActionMove();
4655void dAcPy_c::setHangActionMove() {
4657 static const int scHangMoveAnm[] = { PLAYER_ANIM_MONKEY_R_TO_L, PLAYER_ANIM_MONKEY_L_TO_R };
4658 mPyMdlMng.setAnm(scHangMoveAnm[m_8f0]);
4663void dAcPy_c::HangActionMove() {
4664 if (mKey.buttonDush()) {
4666 mPyMdlMng.mpMdl->setRate(1.5f);
4669 mPyMdlMng.mpMdl->setRate(1.0f);
4671 if (mPyMdlMng.isAnmStop()) {
4672 if (mKey.buttonRight() || mKey.buttonLeft()) {
4673 setHangActionMove();
4675 setHangActionWait();
4680void dAcPy_c::executeState_Hang() {
4681 if (!isNowBgCross(BGC_HANG_ROPE) || mKey.buttonDown()) {
4686 typedef void (dAcPy_c::*HangActionProc_t)();
4687 static HangActionProc_t l_HangActionProc[] = {
4688 &dAcPy_c::HangActionStart,
4689 &dAcPy_c::HangActionWait,
4690 &dAcPy_c::HangActionMove,
4696void dAcPy_c::finalizeState_Hang() {
4703void dAcPy_c::setPoleTurnAngle() {
4704 short target = getBesideMukiAngle(
mDirection ^ 1);
4705 mAngle.y.chase(target, 0x2000);
4708bool dAcPy_c::setPoleAction() {
4713 if (
mSpeed.y <= 3.0f && mKey.buttonUp() && isNowBgCross(BGC_CAN_CLIMB)) {
4721void dAcPy_c::initializeState_Pole() {
4732 m_8f4.x = (int) (
mPos.x / 16.0f) * 16.0f + 8.0f;
4733 setZPositionDirect(400.0f);
4734 if (isNowBgCross(BGC_CAN_CLIMB)) {
4744 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_START);
4751void dAcPy_c::PoleActionStart() {
4752 if (mKey.triggerJump()) {
4755 if (mPyMdlMng.mpMdl->mAnm.getFrame() >= 5.0f &&
mSubstateValue != 0) {
4757 if (mKey.buttonWalk(&dir)) {
4762 }
else if (mPyMdlMng.isAnmStop()) {
4763 setPoleActionWait();
4769void dAcPy_c::setPoleActionWait() {
4771 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_WAIT);
4774void dAcPy_c::PoleActionWait() {
4775 if (!isNowBgCross(BGC_CAN_CLIMB)) {
4781 if (mKey.buttonDown()) {
4782 setPoleActionDown();
4783 }
else if (mKey.buttonUp()) {
4789void dAcPy_c::setPoleActionUp() {
4791 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_CLIMB);
4794void dAcPy_c::PoleActionUp() {
4796 if (mPyMdlMng.mpMdl->mAnm.checkFrame(0.0f)) {
4800 if (!isNowBgCross(BGC_CAN_CLIMB)) {
4803 if (mKey.buttonDown()) {
4804 setPoleActionDown();
4805 }
else if (!mKey.buttonUp()) {
4806 setPoleActionWait();
4807 }
else if (mKey.buttonDush()) {
4808 mPyMdlMng.mpMdl->setRate(1.875f);
4811 mPyMdlMng.mpMdl->setRate(1.5f);
4816void dAcPy_c::setPoleActionDown() {
4818 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_POSE);
4821void dAcPy_c::PoleActionDown() {
4822 if (!isNowBgCross(BGC_CAN_CLIMB)) {
4829 if (mKey.buttonUp()) {
4831 }
else if (!mKey.buttonDown()) {
4832 setPoleActionWait();
4834 if (mKey.buttonDush()) {
4837 mPyMdlMng.mpMdl->setRate(rate);
4840 mPyMdlMng.mpMdl->setRate(1.0f);
4846void dAcPy_c::setPoleJump() {
4851 float baseSpeed = getSpeedData()->mLowSpeed;
4852 mSpeedF = baseSpeed * sc_DirSpeed[dir];
4855bool dAcPy_c::setPoleShakeJump() {
4857 float baseSpeed = getSpeedData()->mLowSpeed;
4858 if (setRideOffPlayerJump(sc_JumpSpeed, baseSpeed * sc_DirSpeed[dir])) {
4866void dAcPy_c::executeState_Pole() {
4870 }
else if (isNowBgCross(
BgCross1_e(BGC_SIDE_LIMIT_L | BGC_SIDE_LIMIT_R))) {
4874 if (!setPoleShakeJump()) {
4875 if (
mSubstate != 0 && mKey.triggerJump()) {
4880 if (isNowBgCross(BGC_CAN_CLIMB)) {
4883 typedef void (dAcPy_c::*PoleActionProc_t)();
4884 static PoleActionProc_t l_PoleActionProc[] = {
4885 &dAcPy_c::PoleActionStart,
4886 &dAcPy_c::PoleActionWait,
4887 &dAcPy_c::PoleActionUp,
4888 &dAcPy_c::PoleActionDown,
4891 float yDelta = mCcRevTotalOffsY;
4897void dAcPy_c::finalizeState_Pole() {
4904bool dAcPy_c::setKaniActionInitHangHand() {
4911 !isOldBgCross(
BgCross2_e(BGC_CLIFF_ABOVE_1 | BGC_CLIFF_ABOVE_2)) &&
4912 isNowBgCross(
BgCross2_e(BGC_CLIFF_ABOVE_1 | BGC_CLIFF_ABOVE_2))
4921bool dAcPy_c::setKaniHangAction() {
4922 if (isNowBgCross(BGC_CLIFF) &&
mSpeed.y <= 0.0f) {
4935void dAcPy_c::setKaniWalkEffect() {
4938 mPyMdlMng.mpMdl->getJointPos(&efPos, 4);
4939 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf7,
"Wm_mr_movecliff", 0, &efPos,
nullptr,
nullptr);
4940 mPyMdlMng.mpMdl->getJointPos(&efPos, 7);
4941 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf7,
"Wm_mr_movecliff", 0, &efPos,
nullptr,
nullptr);
4945void dAcPy_c::setKaniHangEffect() {
4948 mPyMdlMng.mpMdl->getJointPos(&efPos, 11);
4949 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf7,
"Wm_mr_movecliff", 0, &efPos,
nullptr,
nullptr);
4950 mPyMdlMng.mpMdl->getJointPos(&efPos, 14);
4951 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf7,
"Wm_mr_movecliff", 0, &efPos,
nullptr,
nullptr);
4955void dAcPy_c::setKaniCliffCatchEffect() {
4956 static const char *scCliffCatchEffectID[] = {
4960 static const float sc_cliffCatchScale[] = { 0.5f, 0.8f, 1.0f };
4961 u8 tallType = getTallType(-1);
4962 float scale = sc_cliffCatchScale[tallType];
4963 mVec3_c efSize(scale, scale, scale);
4965 mPyMdlMng.mpMdl->getJointPos(&efPos, 11);
4967 dEf::createPlayerEffect(
mPlayerNo, scCliffCatchEffectID[m_b70], 0, &efPos,
nullptr, &efSize);
4968 mPyMdlMng.mpMdl->getJointPos(&efPos, 14);
4970 dEf::createPlayerEffect(
mPlayerNo, scCliffCatchEffectID[m_b70], 0, &efPos,
nullptr, &efSize);
4973void dAcPy_c::initializeState_Kani() {
4998void dAcPy_c::finalizeState_Kani() {
5008void dAcPy_c::setKaniMoveSpeed(
bool b) {
5011 if (mKey.buttonWalk(&dir)) {
5014 if (mKey.buttonDush()) {
5020 if (mKey.buttonDush()) {
5026 scale = f * sc_DirSpeed[dir];
5037void dAcPy_c::setKaniHangStartEffect() {}
5039void dAcPy_c::setKaniAction_Walk() {
5041 setKaniMoveSpeed(
true);
5054void dAcPy_c::setKaniAction_Hang() {
5055 releaseCarryActor();
5058 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_START);
5064void dAcPy_c::setKaniAction_JumpHang() {
5065 releaseCarryActor();
5068 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP_HANG);
5069 setKaniCliffCatchEffect();
5074void dAcPy_c::setKaniAction_HangFall() {
5075 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_WAIT);
5079void dAcPy_c::setKaniAction_HangUp() {
5080 releaseCarryActor();
5082 setKaniHangStartEffect();
5083 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_UP);
5088void dAcPy_c::setKaniAction_HangHand() {
5089 if (isNowBgCross(BGC_CLIFF_ABOVE_2)) {
5092 releaseCarryActor();
5095 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP_HANG, 0.0f, 0.0f);
5096 setKaniCliffCatchEffect();
5100void dAcPy_c::setKaniAction_HangUpVine() {
5101 releaseCarryActor();
5103 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_WAIT, 0.5f, 0.0f, 0.0f);
5107void dAcPy_c::KaniAction_Walk() {
5110 if (!isNowBgCross(BGC_CLIFF)) {
5114 if (mKey.triggerDown()) {
5115 setKaniAction_Hang();
5116 }
else if (mKey.triggerJump()) {
5119 setKaniMoveSpeed(
true);
5121 if (mPyMdlMng.getAnm() != PLAYER_ANIM_WALL_WAIT) {
5122 mPyMdlMng.setAnm(PLAYER_ANIM_WALL_WAIT);
5125 setKaniWalkEffect();
5126 float absSpeed = std::fabs(
mSpeedF) - 0.5f;
5127 if (absSpeed < 0.0f) {
5130 if (absSpeed > 1.0f) {
5133 float rate = absSpeed * 2.0f + 1.0f;
5134 static const int sc_WallWalkAnm[] = { PLAYER_ANIM_WALL_WALK_L, PLAYER_ANIM_WALL_WALK_R };
5135 if (!mPyMdlMng.isAnm(sc_WallWalkAnm[
mDirection])) {
5136 mPyMdlMng.setAnm(sc_WallWalkAnm[
mDirection], rate, 10.0f, 0.0f);
5138 mPyMdlMng.mpMdl->setRate(rate);
5139 if (mPyMdlMng.mpMdl->mAnm.checkFrame(1.0f)) {
5146void dAcPy_c::KaniAction_HangInit() {
5148 if (mPyMdlMng.isAnmStop()) {
5149 setKaniHangStartEffect();
5151 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_WAIT, 0.0f, 0.0f);
5156void dAcPy_c::KaniAction_JumpHangInit() {
5158 mPyMdlMng.mpMdl->mAnm.checkFrame(3.0f);
5159 if (mPyMdlMng.mpMdl->mAnm.getFrame() > 9.0f) {
5164bool dAcPy_c::checkCliffHangFootGround() {
5166 if (dBc_c::checkGround(&
mPos, &height,
mLayer, 1, -1)) {
5167 float currHeight =
mPos.y - getHangBcOffsetY();
5168 if (height > currHeight && (u8) (dBc_c::getUnitKind(
mPos.x, height,
mLayer) >> 16) != 8) {
5169 mPos.y = currHeight;
5178bool dAcPy_c::checkCliffHangWater() {
5180 float currHeight =
mPos.y - getHangBcOffsetY();
5181 u8 waterType = dBc_c::checkWater(
mPos.x, currHeight,
mLayer, &waterHeight);
5182 if (waterType == dBc_c::WATER_CHECK_WATER) {
5183 if (getWaterCheckPosY() - getHangBcOffsetY() <= waterHeight) {
5185 mPos.y = currHeight;
5194void dAcPy_c::KaniAction_Hang() {
5196 if (!checkCliffHangFootGround() && !checkCliffHangWater() && !setKaniHangToVineAction()) {
5198 setKaniAction_HangFall();
5199 }
else if (m_b74 == 1 && m_b70 == 0 && m_b7c == 1) {
5200 setKaniAction_JumpHang();
5202 setKaniMoveSpeed(
false);
5205 if (mPyMdlMng.isAnm(PLAYER_ANIM_JUMP_HANG)) {
5206 if (mPyMdlMng.isAnmStop()) {
5207 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_WAIT);
5209 }
else if (!mPyMdlMng.isAnm(PLAYER_ANIM_HANG_WAIT)) {
5210 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_WAIT);
5213 setKaniHangEffect();
5214 float rate = std::fabs(
mSpeedF);
5221 static const int sc_WallHangAnm[] = { PLAYER_ANIM_HANG_WALK_R, PLAYER_ANIM_HANG_WALK_L };
5222 if (!mPyMdlMng.isAnm(sc_WallHangAnm[
mDirection])) {
5223 mPyMdlMng.setAnm(sc_WallHangAnm[
mDirection], rate, 10.0f, 0.0f);
5225 mPyMdlMng.mpMdl->setRate(rate);
5226 if (mPyMdlMng.mpMdl->mAnm.checkFrame(1.0f)) {
5235 mKey.buttonWalk(&dir) && checkBGCrossWall(dir)
5238 setKaniAction_HangUp();
5244void dAcPy_c::KaniAction_HangFall() {
5246 if (!checkCliffHangFootGround() && !checkCliffHangWater()) {
5248 setKaniAction_JumpHang();
5250 setKaniMoveSpeed(
false);
5256void dAcPy_c::KaniAction_HangUp() {
5258 if (mPyMdlMng.isAnmStop()) {
5259 mPyMdlMng.setAnm(PLAYER_ANIM_WALL_WAIT, 0.0f, 0.0f);
5260 setKaniAction_Walk();
5264void dAcPy_c::KaniAction_HangUpVine() {
5265 setKaniAction_HangUp();
5268void dAcPy_c::executeState_Kani() {
5269 if (checkEnableThrow()) {
5270 releaseCarryActor();
5278 if (m_b78 >
mPos.y) {
5287 mAccelY = getGravityData()[0];
5291 setZPosition(3200.0f);
5293 typedef void (dAcPy_c::*KaniActionProc_t)();
5294 static KaniActionProc_t l_KaniActionProc[] = {
5295 &dAcPy_c::KaniAction_Walk,
5296 &dAcPy_c::KaniAction_HangInit,
5297 &dAcPy_c::KaniAction_JumpHangInit,
5298 &dAcPy_c::KaniAction_Hang,
5299 &dAcPy_c::KaniAction_HangFall,
5300 &dAcPy_c::KaniAction_HangUp,
5301 &dAcPy_c::KaniAction_HangUpVine,
5307void dAcPy_c::setCatchRopeSE() {
5320void dAcPy_c::setClimbRopeSE() {
5332void dAcPy_c::setSlideRopeSE() {
5344void dAcPy_c::setRopeHasigoSE() {
5345 if (mPyMdlMng.mpMdl->mAnm.checkFrame(10.0f) || mPyMdlMng.mpMdl->mAnm.checkFrame(30.0f)) {
5346 startSound(SE_PLY_FOOTNOTE_HASHIGO_NAWA,
false);
5350void dAcPy_c::releasePoleCheck() {
5355bool dAcPy_c::setTarzanRopeAction() {
5362 if (
isStatus(STATUS_9C) && mPc.check(0)) {
5363 if (mPc.mpCtr->m_20 == 3) {
5374 if (
isStatus(STATUS_A3) && mKey.buttonDown() && mPc.check(0)) {
5375 if (mPc.mpCtr->m_20 == 3) {
5384void dAcPy_c::initializeState_TarzanRope() {
5395 setZPositionDirect(400.0f);
5399 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_START);
5400 if (mPc.mpCtr->m_20 == 2) {
5411 setTarzanRopeActionHasigoMove();
5418 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_START);
5425void dAcPy_c::finalizeState_TarzanRope() {
5437bool dAcPy_c::setTarzanRopeJump() {
5438 if (!mKey.triggerShakeJump() && !mKey.triggerJump()) {
5441 float jumpSpeed = sc_JumpSpeed;
5445 if (mKey.buttonLeft()) {
5447 }
else if (mKey.buttonRight()) {
5454 }
else if (h > -0.5f) {
5457 }
else if (h > 0.0f) {
5461 }
else if (h < 0.5f) {
5465 h = sc_DirSpeed[
mDirection] * getSpeedData()->mLowSpeed;
5467 jumpSpeed = mPc.getPos().y;
5469 if (setRideOffPlayerJump(jumpSpeed, h)) {
5474 mNoGravityTimer = 10;
5477 if (mKey.triggerJump()) {
5482 mNoGravityTimer = 10;
5493bool dAcPy_c::updateRopeAngle() {
5495 m_904 = mPc.getAngle();
5497 if (mPc.mpCtr !=
nullptr) {
5498 if (mPc.mpCtr->m_20 == 1 || mPc.mpCtr->m_20 == 2) {
5506void dAcPy_c::setRopeSwingAnm(
float a,
float b) {
5507 mPyMdlMng.mpMdl->mCurrAnmID = PLAYER_ANIM_WALK;
5508 mPyMdlMng.setAnm(PLAYER_ANIM_ROPE_SWING, a, 10.0f, b);
5511bool dAcPy_c::checkStartSwingUp() {
5512 int baseAngle = m_900;
5513 int absAngle = abs(baseAngle);
5514 if (absAngle > 128 && absAngle < abs(m_902)) {
5515 if (sc_DirSpeed[
mDirection] * baseAngle >= 0.0f) {
5516 m_90c = ROPE_SWING_1;
5517 setRopeSwingAnm(1.0f, 1.0f);
5524bool dAcPy_c::checkStartSwingDown() {
5525 int baseAngle = m_900;
5526 int absAngle = abs(baseAngle);
5527 if (absAngle > 128 && absAngle < abs(m_902)) {
5528 if (sc_DirSpeed[
mDirection] * baseAngle <= 0.0f) {
5530 bool ok = mKey.buttonWalk(&dir) && dir !=
mDirection;
5532 setRopeSwingAnm(1.0f, 64.0f);
5533 m_90c = ROPE_SWING_7;
5536 m_90c = ROPE_SWING_0;
5542void dAcPy_c::updateRopeSwingAnm() {
5543 if (updateRopeAngle()) {
5546 checkStartSwingUp();
5549 if (mPyMdlMng.mpMdl->mAnm.checkFrame(32.0f)) {
5550 mPyMdlMng.mpMdl->setRate(0.0f);
5551 m_90c = ROPE_SWING_2;
5555 if (m_900 * m_902 <= 0) {
5556 setRopeSwingAnm(1.0f, 32.0f);
5557 m_90c = ROPE_SWING_3;
5561 if (mPyMdlMng.mpMdl->mAnm.checkFrame(64.0f)) {
5562 mPyMdlMng.mpMdl->setRate(0.0f);
5563 m_90c = ROPE_SWING_4;
5567 checkStartSwingDown();
5570 if (mPyMdlMng.mpMdl->mAnm.checkFrame(96.0f)) {
5571 mPyMdlMng.mpMdl->setRate(0.0f);
5572 m_90c = ROPE_SWING_8;
5576 if (m_900 * m_902 <= 0) {
5577 setRopeSwingAnm(1.0f, 96.0f);
5578 m_90c = ROPE_SWING_10;
5582 if (mPyMdlMng.isAnmStop()) {
5583 m_90c = ROPE_SWING_0;
5585 checkStartSwingUp();
5588 if (mPyMdlMng.mpMdl->mAnm.checkFrame(86.0f)) {
5589 mPyMdlMng.mpMdl->setRate(0.0f);
5590 m_90c = ROPE_SWING_6;
5594 if (m_900 * m_902 <= 0) {
5595 setRopeSwingAnm(-0.5f, 86.0f);
5596 m_90c = ROPE_SWING_9;
5600 if (mPyMdlMng.mpMdl->mAnm.checkFrame(64.0f)) {
5601 m_90c = ROPE_SWING_0;
5603 checkStartSwingUp();
5607 m_90c = ROPE_SWING_0;
5609 if (m_90c == ROPE_SWING_0) {
5610 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_WAIT, 10.0f, 0.0f);
5614void dAcPy_c::TarzanRopeActionStart() {
5615 if (mPyMdlMng.isAnmStop()) {
5616 setTarzanRopeActionWait();
5620void dAcPy_c::setTarzanRopeActionWait() {
5626 m_90c = ROPE_SWING_0;
5630void dAcPy_c::TarzanRopeActionWait() {
5632 updateRopeSwingAnm();
5633 if (!(mPc.m_2a & 4) && mKey.buttonDown()) {
5634 setTarzanRopeActionDown();
5635 }
else if (!(mPc.m_2a & 2) && mKey.buttonUp()) {
5636 setTarzanRopeActionUp();
5640void dAcPy_c::setTarzanRopeActionUp() {
5642 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_CLIMB);
5645void dAcPy_c::TarzanRopeActionUp() {
5650 if (mPyMdlMng.mpMdl->mAnm.checkFrame(1.0f)) {
5653 if (mKey.buttonDush()) {
5654 mPyMdlMng.mpMdl->setRate(1.875f);
5657 mPyMdlMng.mpMdl->setRate(1.5f);
5660 if (!(mPc.m_2a & 4) && mKey.buttonDown()) {
5661 setTarzanRopeActionDown();
5662 }
else if (!mKey.buttonUp()) {
5663 setTarzanRopeActionWait();
5667void dAcPy_c::setTarzanRopeActionDown() {
5669 mPyMdlMng.setAnm(PLAYER_ANIM_TREE_POSE);
5672void dAcPy_c::TarzanRopeActionDown() {
5679 if (!(mPc.m_2a & 2) && mKey.buttonUp()) {
5680 setTarzanRopeActionUp();
5681 }
else if (!mKey.buttonDown()) {
5682 setTarzanRopeActionWait();
5686void dAcPy_c::setTarzanRopeActionHasigoMove() {
5690void dAcPy_c::TarzanRopeActionHasigoMove() {
5691 if (mKey.buttonUp() && (mPc.m_2a & 2)) {
5692 setTarzanRopeActionHasigoHangUp();
5695 float f1 = mKey.buttonDush() ? 1.5f : 1.0f;
5696 float f2 = mKey.buttonDush() ? 1.875f : 1.5f;
5697 if (mKey.buttonUp() && !(mPc.m_2a & 2)) {
5699 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WALK1, f2, 0.0f, 0.0f);
5701 }
else if (mKey.buttonDown() && !(mPc.m_2a & 4)) {
5703 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WALK1, -f2, 0.0f, 0.0f);
5707 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT);
5711void dAcPy_c::TarzanRopeActionHasigoHangDown() {
5712 if (!mPyMdlMng.isAnmStop()) {
5715 mPyMdlMng.setAnm(PLAYER_ANIM_NET_WAIT, 0.0f, 0.0f);
5716 mPos.y -= getHangBcOffsetY();
5719 setTarzanRopeActionHasigoMove();
5720 if (!mPc.check(1)) {
5722 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP2, 0.0f, 0.0f);
5727void dAcPy_c::setTarzanRopeActionHasigoHangUp() {
5729 pos.y += getHangBcOffsetY() + 8.0f;
5731 if (dBc_c::checkGround(&pos, &h,
mLayer, 1, -1)) {
5739 mPyMdlMng.setAnmOnlyRate(PLAYER_ANIM_HANG_WAIT, 0.0f, 0.0f);
5745void dAcPy_c::TarzanRopeActionHasigoHangUp() {
5748 mPyMdlMng.setAnm(PLAYER_ANIM_HANG_UP);
5752 if (mPyMdlMng.isAnmStop()) {
5753 mPyMdlMng.setAnmOnlyRate(PLAYER_ANIM_WALL_WAIT, 0.0f, 0.0f);
5764void dAcPy_c::executeState_TarzanRope() {
5765 typedef void (dAcPy_c::*TarzanRopeActionProc_t)();
5766 static TarzanRopeActionProc_t l_TarzanRopeActionProc[] = {
5767 &dAcPy_c::TarzanRopeActionStart,
5768 &dAcPy_c::TarzanRopeActionWait,
5769 &dAcPy_c::TarzanRopeActionUp,
5770 &dAcPy_c::TarzanRopeActionDown,
5771 &dAcPy_c::TarzanRopeActionHasigoMove,
5772 &dAcPy_c::TarzanRopeActionHasigoHangDown,
5773 &dAcPy_c::TarzanRopeActionHasigoHangUp
5775 if (!
isStatus(STATUS_TARZAN_ROPE)) {
5776 (this->*l_TarzanRopeActionProc[
mSubstate])();
5777 }
else if (isNowBgCross(
BgCross1_e(BGC_SIDE_LIMIT_L | BGC_SIDE_LIMIT_R)) || mPc.mpCtr ==
nullptr) {
5780 s16 ang = mPc.getAngle();
5781 if (m_914 == 0 || m_914 == 1) {
5783 ang = -mPc.getAngle();
5787 if (mPowerup == POWERUP_NONE) {
5790 m_1594 = f * mAng(ang).cos() * mAng(
mAngle.y).sin();
5791 m_1598 = f * mAng(ang).sin();
5795 if (!setTarzanRopeJump()) {
5796 (this->*l_TarzanRopeActionProc[
mSubstate])();
5797 mPc.move(getCcRevOffsY() + m_918);
5805void dAcPy_c::startQuakeAction(QuakeMode_e mode) {
5806 setQuakeActionLocal(0, mode);
5810void dAcPy_c::setQuakeAction(
int i, QuakeMode_e mode) {
5811 setQuakeActionLocal(i, mode);
5815void dAcPy_c::setQuakeActionLocal(
int i, QuakeMode_e mode) {
5816 if (!isDemo() && isNowBgCross(
BGC_FOOT) && !isState(StateID_Quake)) {
5822void dAcPy_c::endQuakeAction() {
5823 if (isState(StateID_Quake)) {
5828void dAcPy_c::initializeState_Quake() {
5834 mPyMdlMng.setAnm(PLAYER_ANIM_E_SHOCK);
5838 startQuakeShock(dQuake_c::TYPE_6);
5843void dAcPy_c::finalizeState_Quake() {
5849void dAcPy_c::executeState_Quake() {
5855 startQuakeShock(dQuake_c::TYPE_8);
5857 setQuakeNumbEffect();
5863void dAcPy_c::setQuakeNumbEffect() {
5865 static const float sc_QuakeNumbScale[] = { 0.6f, 0.8f, 1.0f };
5866 u8 tallType = getTallType(-1);
5867 float scale = sc_QuakeNumbScale[tallType];
5868 mVec3_c size(scale, scale, scale);
5869 static const char *sc_QuakeEffectID[] = {
5876void dAcPy_c::initializeState_ElecShock() {
5887void dAcPy_c::finalizeState_ElecShock() {
5892void dAcPy_c::executeState_ElecShock() {
5893 if (!executeElecShock()) {
5895 mPyMdlMng.setAnm(PLAYER_ANIM_E_SHOCK);
5896 setDamage2(
nullptr, DAMAGE_BG);
5900void dAcPy_c::initElecShock() {
5903 mPyMdlMng.setAnm(PLAYER_ANIM_E_SHOCK);
5907bool dAcPy_c::executeElecShock() {
5912void dAcPy_c::setElecEffect() {
5914 mPyMdlMng.mpMdl->getJointPos(&efPos, 1);
5915 float s = mPyMdlMng.getSomeScale();
5916 mVec3_c efScale(s, s, s);
5918 if (mPowerup == POWERUP_MINI_MUSHROOM || mPowerup == POWERUP_NONE) {
5921 static const char *sc_elecEffectID[] = {
5922 "Wm_mr_electricshock",
5923 "Wm_mr_electricshock_s"
5925 dEf::createPlayerEffect(
mPlayerNo, &
mSmokeEffect, sc_elecEffectID[shockType], 0, &efPos,
nullptr, &efScale);
5928bool dAcPy_c::setFlyDamageAction(
int action,
dActor_c *actor) {
5929 if (isState(StateID_FlyDamage)) {
5932 bool changeParam =
false;
5933 if (actor !=
nullptr) {
5938 switch ((u32) actor->
mKind) {
5941 if (actor->
mProfName == fProfile::EN_SLIP_PENGUIN2) {
5943 if (actor->
mSpeed.x < 0.0f) {
5961 u32 finalChangeParam = 0;
5963 finalChangeParam = 2;
5964 }
else if (action == 3 || action == 4) {
5965 finalChangeParam = 4;
5966 }
else if (action == 5) {
5967 finalChangeParam = 0;
5968 }
else if (action == 6) {
5969 finalChangeParam = 0;
5972 finalChangeParam = (finalChangeParam + changeParam) & 0xFF;
5973 if (isAction6 == 1) {
5974 finalChangeParam |= 0x100;
5976 changeState(StateID_FlyDamage, (
void *) finalChangeParam);
5980void dAcPy_c::initializeState_FlyDamage() {
5981 static const u8 sc_DamageAnmID[] = {
5982 PLAYER_ANIM_DAM_F, PLAYER_ANIM_DAM_B,
5983 PLAYER_ANIM_DOW_F, PLAYER_ANIM_DOW_B,
5984 PLAYER_ANIM_DOW_F, PLAYER_ANIM_DOW_B,
5989 mPyMdlMng.setAnm(sc_DamageAnmID[m_103c], 0.0f, 0.0f);
5992 if (m_103c == 0 || m_103c == 1) {
5998 if (m_103c == 0 || m_103c == 1) {
5999 float speed1 = sc_DirSpeed[(m_103c ^ 1) & 1];
6000 float speed2 = getDirSpeed();
6007 float speed = sc_DirSpeed[
mDirection] * sc_DirSpeed[(m_103c ^ 1) & 1];
6009 if (mPowerup == POWERUP_MINI_MUSHROOM) {
6010 mPyMdlMng.setAnm(PLAYER_ANIM_STAR_ROLL_DUPLICATE);
6040 mAccelY = getGravityData()[0];
6045void dAcPy_c::finalizeState_FlyDamage() {
6054void dAcPy_c::executeState_FlyDamage() {
6057 if (
mSubstate == 5 && mKey.buttonWalk(&dir) &&
mSpeedF * sc_DirSpeed[dir] < 0.0f) {
6066 static const u8 sc_damageStopFrame[] = { 0, 0, 9, 10, 9, 10, 9 };
6070 if (mPowerup != POWERUP_MINI_MUSHROOM) {
6082 if (mPyMdlMng.mpMdl->mAnm.getFrame() >= sc_damageStopFrame[m_103c]) {
6083 mPyMdlMng.mpMdl->setRate(0.0f);
6097 if (checkJumpTrigger()) {
6101 if (std::fabs(
mSpeedF) < 0.5f) {
6102 mPyMdlMng.mpMdl->setRate(1.0f);
6110 }
else if (!checkJumpTrigger() && mPyMdlMng.isAnmStop()) {
6116 if (mPyMdlMng.mpMdl->mAnm.getFrame() > 17.0f) {
6117 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP2, 10.0f, 0.0f);
6120 }
else if (mPyMdlMng.mpMdl->mAnm.getFrame() > 17.0f) {
6121 if (checkJumpTrigger()) {
6124 if (mKey.buttonWalk(
nullptr)) {
6129 if (mPyMdlMng.isAnmStop()) {
6136void dAcPy_c::setBreakBalloonJump(u8 playerNo,
short angle) {
6140 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
6143 mCcRevDisabledTimer = 30;
6146 float cos = mAng(angle).cos();
6147 float sin = mAng(angle).sin();
6148 setSwimSpeed(cos * 2.0f, sin * 2.0f);
6150 float sin = mAng(angle).sin() * 4.0f;
6151 float cos = mAng(angle).cos() * sc_JumpSpeed;
6155 setJump(cos, sin,
true, 1, 0);
6159void dAcPy_c::setDrawBalloonInPlayer(
mVec3_c &pos) {
6164 static const float scBalloonOffsetY[] = {
6165 0.0f, -4.0f, -4.0f, 4.0f, -6.0f, -2.0f, -4.0f
6167 pos.y += scBalloonOffsetY[mPowerup];
6171bool dAcPy_c::isNotBalloonCourse() {
6172 return daPyMng_c::mRest[daPyMng_c::mPlayerType[
mPlayerNo]] <= 0;
6175void dAcPy_c::initializeState_Balloon() {
6176 clearJumpActionInfo(1);
6177 releaseCarryActor();
6180 mPyMdlMng.setAnm(PLAYER_ANIM_BALLOON_WAIT);
6197 if (isNotBalloonCourse()) {
6207 if (daPyMng_c::mNum == 0) {
6209 mAllBalloonFadeTimer = 210;
6210 daPyMng_c::mAllBalloon =
true;
6212 if (mPlayerType == PLAYER_MARIO && mPyMdlMng.mpMdl->m_151 == 0) {
6213 ((dMarioMdl_c *) mPyMdlMng.mpMdl)->fn_800cab00(0);
6215 if (mPowerup != POWERUP_NONE && mPowerup != POWERUP_MINI_MUSHROOM) {
6216 mAmiRelated2 = 0.9f;
6219 setZPosition(8000.0f);
6223void dAcPy_c::finalizeState_Balloon() {
6234 mCc.mCcData.mStatus &= ~CC_STATUS_NO_PASS_INFO;
6236 mAmiRelated2 = 1.0f;
6238 mDamageInvulnTimer = 127;
6240 daPyMng_c::mPauseEnableInfo |= 1 <<
mPlayerNo;
6243void dAcPy_c::executeState_Balloon() {
6245 SndSceneMgr::sInstance->moveMissFin();
6248 if (mAllBalloonFadeTimer != 0) {
6249 mAllBalloonFadeTimer--;
6250 if (mAllBalloonFadeTimer == 0) {
6251 checkAllBalloonFade();
6266 if (!isNotBalloonCourse()) {
6272 dEnemyMng_c::m_instance->createRevivalBallon(
mPos, 0,
mPlayerNo);
6284 dEnemyMng_c::m_instance->createRevivalBallon(
mPos, 2,
mPlayerNo);
6295 mPlayerOrchestra.update();
6296 daPyMng_c::mPauseEnableInfo &= ~(1 <<
mPlayerNo);
6297 if (isNotBalloonCourse()) {
6303 daPyMng_c::mPauseEnableInfo |= 1 <<
mPlayerNo;
6307void dAcPy_c::setBalloonHelpVoice() {
6314bool dAcPy_c::setBalloonInNextgoto() {
6315 if (daPyMng_c::isEntryNum1() ||
isStatus(STATUS_53)) {
6323bool dAcPy_c::setBalloonInDamage() {
6324 if (daPyMng_c::mNum == 0 || daPyMng_c::isEntryNum1() ||
isStatus(STATUS_53)) {
6329 if (!isState(StateID_Balloon)) {
6335bool dAcPy_c::setBalloonButtonA() {
6336 if (!mKey.triggerA()) {
6345 if (daPyMng_c::isEntryNum1()) {
6357 isNotBalloonCourse() ||
6362 if (dEnemyMng_c::m_instance->m_15c == 1 || dEnemyMng_c::m_instance->m_15c == 2) {
6365 if (dScStage_c::m_miniGame) {
6368 int level = dScStage_c::m_instance->mCurrCourse;
6369 if (level == STAGE_TITLE || level == STAGE_PEACH_CASTLE || level == STAGE_STAFFROLL) {
6372 if (getFollowMameKuribo()) {
6373 startSound(SE_EMY_MAMEKURIBO_CLINGING_NOW,
false);
6377 if (!isState(StateID_Balloon)) {
6383bool dAcPy_c::checkAllBalloonFade() {
6386 dScStage_c::setNextScene(3, 0, dScStage_c::EXIT_1, dFader_c::FADER_BOWSER);
6392bool dAcPy_c::setBalloonInDispOutByYoshi(
int i) {
6393 return setBalloonInDispOutBase(i, 1);
6396bool dAcPy_c::setBalloonInDispOut(
int i) {
6397 return setBalloonInDispOutBase(i, 0);
6400bool dAcPy_c::setBalloonInDispOutBase(
int i,
int j) {
6401 if (!isDispOutCheckOn()) {
6404 if (i == 2 || i == 0) {
6405 if (isDemoAll() && !
isStatus(STATUS_5A)) {
6412 if (isItemKinopio() && !dBg_c::m_bg_p->mAutoscrolls[0].mActive) {
6416 if (getCarryPlayer() !=
nullptr) {
6417 getCarryPlayer()->setBalloonInDispOut(i);
6425 setPressBgDamage(11, 0);
6427 if (i == 2 || i == 0) {
6429 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
6434void dAcPy_c::setShakeIce(
float f) {
6440mVec3_c dAcPy_c::getIceDrawPos() {
6443 mPos.y + m_1598 + m_159c,
6450 setRideOffPlayerJump(sc_JumpSpeed, 0.0f);
6453void dAcPy_c::initializeState_IceDamage() {
6468 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
6469 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP, 0.0f, 0.0f, 0.0f);
6470 mPyMdlMng.mpMdl->setFrame(0.0f);
6473void dAcPy_c::finalizeState_IceDamage() {
6481 mDamageInvulnTimer = 127;
6484void dAcPy_c::executeState_IceDamage() {
6486 if (ice ==
nullptr) {
6489 }
else if (isNowBgCross(
BgCross1_e(BGC_SIDE_LIMIT_L | BGC_SIDE_LIMIT_R))) {
6490 ice->setRevivalBreakIce();
6494bool dAcPy_c::setRideOffPlayerJump(
float a,
float b) {
6495 if (mKey.triggerShakeJump()) {
6498 if (dBc_c::checkTenjou(&pos, &height,
mLayer, 1)) {
6499 float tmp = getStandHeadBgPointY() + 1.0f;
6500 if (
mPos.y > height - tmp) {
6501 mPos.y = height - tmp;
6512bool dAcPy_c::setRideOffYoshiJump(
daPlBase_c *yoshi) {
6513 if (!((daYoshi_c *) yoshi)->checkRideOffAble()) {
6517 if (mKey.triggerShakeJump()) {
6521 if (!yoshi->isNowBgCross(
BGC_FOOT)) {
6527 if (std::fabs(yoshi->
mSpeedF) < 1.5f) {
6535 mSpeed.y = sc_JumpSpeed - 0.2f;
6552void dAcPy_c::setRideOnYoshi(
daYoshi_c *yoshi) {
6553 if (mRideActorID != 0) {
6561void dAcPy_c::initializeState_RideYoshi() {
6562 daPyMng_c::startYoshiBGM();
6573void dAcPy_c::finalizeState_RideYoshi() {
6576 if (yoshi !=
nullptr) {
6577 if (mIsBeingDeleted == 1) {
6580 yoshi->setRideOffPlayer();
6581 mTreadCount = yoshi->mTreadCount;
6592 daPyMng_c::stopYoshiBGM();
6597void dAcPy_c::executeState_RideYoshi() {
6599 daYoshi_c *yoshi = getRideYoshi();
6600 if (yoshi ==
nullptr) {
6614void dAcPy_c::initializeState_Cloud() {
6615 daPlBase_c::initializeState_Cloud();
6619void dAcPy_c::finalizeState_Cloud() {
6620 daPlBase_c::finalizeState_Cloud();
6623 releaseCarryActor();
6624 }
else if (
mSubstate == 4 && mIsBeingDeleted == 0) {
6629float dAcPy_c::getCloudOffsetY() {
6630 return dPyMdlMng_c::m_hio.
getValue(mPlayerType, 2, mPowerup);
6633void dAcPy_c::setCloudStateMove() {
6634 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT);
6638bool dAcPy_c::checkCloudStateCrouch() {
6639 if (!mKey.buttonCrouch()) {
6646 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP_START);
6651void dAcPy_c::setCloudStateFireCreate() {
6652 mPyMdlMng.setAnm(PLAYER_ANIM_FIRE_AT);
6653 mPyMdlMng.mpMdl->setFrame(0.0f);
6659void dAcPy_c::executeState_Cloud() {
6660 if (updateCloudMove()) {
6667 if (mPyMdlMng.isAnmStop()) {
6668 finalizeThrowCommonBase();
6669 setCloudStateMove();
6673 if (!setRideOffPlayerJump(sc_JumpSpeed - 0.2f, 0.0f)) {
6674 if (checkSetFireBall()) {
6675 setCloudStateFireCreate();
6676 }
else if (checkEnableThrow()) {
6677 initializeThrowCommonBase();
6679 }
else if (checkCloudStateCrouch()) {
6685 if (mPyMdlMng.isAnmStop()) {
6686 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP);
6688 if (!mKey.buttonCrouch()) {
6689 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT, 10.0f, 0.0f);
6696 if (checkSetFireBall()) {
6697 setCloudStateFireCreate();
6700 setCloudStateMove();
6704 if (mPyMdlMng.mpMdl->mAnm.checkFrame(4.0f)) {
6710 if (mPyMdlMng.mpMdl->mAnm.checkFrame(5.0f)) {
6718bool dAcPy_c::checkCarryActor(
dAcPy_c *player) {
6725bool dAcPy_c::setDropCarryPlayer() {
6726 dAcPy_c *ridePlayer = getRidePlayer();
6727 if (ridePlayer ==
nullptr) {
6731 if (ridePlayer->
isStatus(STATUS_46)) {
6732 if (ridePlayer->isNowBgCross(
BGC_HEAD)) {
6737 mVec3_c pos(ridePlayer->
mPos.x, ridePlayer->
mPos.y + 4.0f, ridePlayer->
mPos.z);
6739 if (!dBc_c::checkWall(&pos, &pos2,
nullptr,
mLayer, mAmiLayer,
nullptr)) {
6741 if (dBc_c::checkTenjou(&pos2, &height,
mLayer, mAmiLayer)) {
6743 if (
mPos.y + p->mHead.mOffset / 4096.0f + 2.0f > height) {
6751 if (!ridePlayer->
isStatus(STATUS_46)) {
6752 if (ridePlayer->isNowBgCross(BGC_12) && !ridePlayer->isNowBgCross(BGC_13)) {
6754 if (ridePlayer->isNowBgCross(BGC_WALL_TOUCH_R_2)) {
6765 if (ridePlayer->isNowBgCross(BGC_SLOPE_AND_HEAD)) {
6766 setJump(0.0f, 0.0f,
true, 0, 0);
6774void dAcPy_c::initializeState_CarryPlayer() {
6784 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT);
6787 if (isItemKinopio()) {
6788 if (daPyMng_c::mKinopioCarryCount < 2) {
6789 daPyMng_c::mKinopioCarryCount++;
6791 if (daPyMng_c::mKinopioCarryCount >= 2) {
6797void dAcPy_c::finalizeState_CarryPlayer() {
6799 dAcPy_c *ridePlayer = getRidePlayer();
6800 if (ridePlayer !=
nullptr) {
6801 ridePlayer->cancelCarry(
this);
6814 mPyMdlMng.mpMdl->m_17c &= ~BIT_FLAG(7);
6815 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP2, 0.0f, 0.0f);
6821void dAcPy_c::executeState_CarryPlayer() {
6822 dAcPy_c *ridePlayer = getRidePlayer();
6827 setZPositionDirect(ridePlayer->
mPos.z);
6828 if (setDropCarryPlayer()) {
6832 mAmiLayer = ridePlayer->mAmiLayer;
6834 if (!ridePlayer->
isStatus(STATUS_46)) {
6835 if (setRideOffPlayerJump(sc_JumpSpeed - 0.2f, 0.0f)) {
6842 if (mPyMdlMng.isAnmStop()) {
6843 setCarryPlayerMode_Move(0.0f);
6847 if (checkSetFireBall()) {
6848 setCarryPlayerMode_Fire();
6849 }
else if (ridePlayer->
isStatus(STATUS_47)) {
6850 setCarryPlayerMode_Crouch();
6854 if (!mPyMdlMng.mpMdl->mAnm.checkFrame(dPyMdlBase_c::scFireShootFrame)) {
6861 if (mPyMdlMng.isAnmStop()) {
6862 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP);
6864 if (ridePlayer->
isStatus(STATUS_47)) {
6867 setCarryPlayerMode_Move(10.0f);
6873void dAcPy_c::setCarryPlayerMode_Move(
float f) {
6874 mPyMdlMng.mpMdl->m_17c &= ~BIT_FLAG(7);
6875 mPyMdlMng.setAnmOnlyRate(PLAYER_ANIM_WAIT, f, 0.0f);
6877 dAcPy_c *ridePlayer = getRidePlayer();
6878 if (ridePlayer !=
nullptr) {
6879 ridePlayer->mpMdlMng->mpMdl->copyLinkAnm(f);
6883void dAcPy_c::setCarryPlayerMode_Fire() {
6884 mPyMdlMng.mpMdl->m_17c |= BIT_FLAG(7);
6885 mPyMdlMng.setAnmOnlyRate(PLAYER_ANIM_FIRE_AT2, 0.0f, 0.0f);
6886 mPyMdlMng.mpMdl->setFrame(0.0f);
6892void dAcPy_c::setCarryPlayerMode_Crouch() {
6893 mPyMdlMng.mpMdl->m_17c |= BIT_FLAG(7);
6894 mPyMdlMng.setAnm(PLAYER_ANIM_STOOP_START, 3.0f, 0.0f, 0.0f);
6899void dAcPy_c::initRideSpinMove() {
6905void dAcPy_c::endRideSpinMove() {
6909dAcPy_c *dAcPy_c::getRidePlayer() {
6916void dAcPy_c::setYoshiBackPos() {
6917 daYoshi_c *yoshi = getRideYoshi();
6918 if (yoshi ==
nullptr) {
6924 yoshi->getModel()->getJointMtx(&mtx, 8);
6925 mtx.concat(mMtx_c::createTrans(0.0f, -5.0f, 0.0f));
6929 mPos.y = pos.y - 8.0f;
6933void dAcPy_c::setPlayerHandPos() {
6934 dAcPy_c *ridePlayer = getRidePlayer();
6935 if (ridePlayer ==
nullptr) {
6939 mVec3_c liftPos = ridePlayer->getLiftUpPos();
6944 int newAng = ridePlayer->
mAngle.
y.
mAngle + ridePlayer->getMissSpinAngle();
6959 if (isState(StateID_PlayerEat)) {
6962 yoshi->setVirusStar(
this);
6968 if (isState(StateID_PlayerEat)) {
6969 setNoHitPlayer(yoshi, 10);
6970 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
6975 float f = getDirSpeed();
6977 mSpeedF = 0.5f * yoshi->getSpeedF() + f;
6981 float f = getDirSpeed();
6983 mSpeedF = 0.5f * yoshi->getSpeedF() + f;
6987 yoshi->getMouthMtx(&mtx);
6988 mtx.concat(mMtx_c::createTrans(10.0f, 0.0f, 0.0f));
6989 mPos.x = mtx.transX();
6990 mPos.y = mtx.transY();
6991 float f = yoshi->
mPos.y + 4.0f;
6996 float offs = sc_DirSpeed[
mDirection] * std::fabs(getWallBgPointData()->mOffset / 4096.0f);
6999 if (dBc_c::checkWall(&posCopy, &posCopy2, &height,
mLayer, 1,
nullptr)) {
7001 mPos.x = height - offs;
7003 float offs2 = getHeadBgPointData()->mOffset / 4096.0f;
7005 if (dBc_c::checkTenjou(&posCopy, &height,
mLayer, 1)) {
7006 if (
mPos.y > height - offs2) {
7007 mPos.y = height - offs2;
7017void dAcPy_c::setPlayerEatPos(
dActor_c *eatingActor) {
7020 if (yoshi !=
nullptr && yoshi->getTongueTipMtx(&mtx)) {
7021 mPos.x = mtx.transX();
7022 mPos.y = mtx.transY();
7029 if (eatingActor !=
nullptr &&
isStatus(STATUS_C8)) {
7032 mPos.y = eatingActor->
mPos.y + m_129c.y;
7034 setPlayerEatPos(eatingActor);
7039void dAcPy_c::initializeState_PlayerEat() {
7040 releaseCarryActor();
7049 if (eatingActor ==
nullptr) {
7050 setPlayerEatPos(eatingActor);
7053 mPyMdlMng.setAnm(PLAYER_ANIM_STAR_ROLL_DUPLICATE);
7060void dAcPy_c::finalizeState_PlayerEat() {
7075void dAcPy_c::executeState_PlayerEat() {
7077 if (yoshi ==
nullptr) {
7084 if (mKey.triggerShakeJump() && yoshi->
fn_8014f030(
this)) {
7089void dAcPy_c::setPlayerEatReact() {
7094 (mDamageInvulnTimer | mPowerupChangeInvulnTimer) != 0 ||
7106bool dAcPy_c::setRideJrCrown(
const dActor_c *actor) {
7107 if (mRideActorID == 0) {
7115bool dAcPy_c::isRideJrCrownOwn(
const dActor_c *actor) {
7122void dAcPy_c::setRideJrCrownMtx(
const mMtx_c *mtx) {
7124 mRideJrClownMtx = *mtx;
7128void dAcPy_c::setJrCrownPos() {
7130 mRideJrClownMtx.multVecZero(
mPos);
7134void dAcPy_c::setRideJrCrownAnm(
int i) {
7136 mPyMdlMng.setAnm(i);
7140void dAcPy_c::initializeState_JrCrown() {
7141 releaseCarryActor();
7149 mPyMdlMng.setAnm(PLAYER_ANIM_RIDE_WAIT);
7150 mRc.mFlags |= BIT_FLAG(2);
7153void dAcPy_c::finalizeState_JrCrown() {
7160 mRc.mFlags &= ~BIT_FLAG(2);
7163void dAcPy_c::executeState_JrCrown() {
7169 if (!executeElecShock()) {
7170 setDamage2(
nullptr, DAMAGE_BG);
7176 mPyMdlMng.setAnm(PLAYER_ANIM_RIDE_WAIT);
7181void dAcPy_c::setJrCrownElecDamage() {
7187bool dAcPy_c::checkSetFireBall() {
7188 if (mKey.triggerFire()) {
7192 if (mPowerup == POWERUP_FIRE_FLOWER) {
7193 if (daFireBall_Player_c::CheckFireBallLimit(
mPlayerNo, 0)) {
7196 }
else if (mPowerup == POWERUP_PENGUIN_SUIT || mPowerup == POWERUP_ICE_FLOWER) {
7205bool dAcPy_c::setFireBallAction() {
7206 if (
isStatus(STATUS_9E) && checkSetFireBall()) {
7213bool dAcPy_c::checkFireJump() {
7214 if (isNowBgCross(
BGC_FOOT) && mKey.triggerJump()) {
7216 mSpeed.y = sc_WaterJumpSpeed;
7227void dAcPy_c::createFireBall(
int i) {
7232 mPyMdlMng.mpMdl->getJointMtx(&mtx, 11);
7233 mtx.concat(mMtx_c::createTrans(-1.0f, 4.0f, 4.0f));
7235 mPyMdlMng.mpMdl->getJointMtx(&mtx, 0);
7237 mVec3_c diff = pos - pos2;
7238 float dist = diff.xzLen();
7239 float dirSpeed = sc_DirSpeed[m_12f4];
7241 dScStage_c::getLoopPosX(pos2.x + dirSpeed * dist),
7245 if (mPowerup == POWERUP_FIRE_FLOWER) {
7248 u32 param = (i << 16) | (mAmiLayer << 12) | (
mLayer << 8) | (m_12f4 << 4) |
mPlayerNo;
7250 }
else if (mPowerup == POWERUP_PENGUIN_SUIT || mPowerup == POWERUP_ICE_FLOWER) {
7253 u32 param = (i << 16) | (mAmiLayer << 12) | (
mLayer << 8) | (m_12f4 << 4) |
mPlayerNo;
7258void dAcPy_c::initializeState_Fire() {
7260 mPyMdlMng.setAnm(PLAYER_ANIM_FIRE_AT);
7268void dAcPy_c::finalizeState_Fire() {
7279void dAcPy_c::executeState_Fire() {
7282 simpleMoveSpeedSet();
7300 if (mPyMdlMng.mpMdl->mAnm.checkFrame(dPyMdlBase_c::scFireShootFrame)) {
7307 if (checkSetFireBall()) {
7308 m_12f4 = getDirection();
7311 mPyMdlMng.setAnm(PLAYER_ANIM_FIRE_AT);
7312 mPyMdlMng.mpMdl->setFrame(0.0f);
7313 }
else if (isNowBgCross(
BGC_FOOT)) {
7315 !checkJumpTrigger() &&
7317 mPyMdlMng.mpMdl->mAnm.getFrame() >= 10.0f &&
mSpeedF ||
7318 mPyMdlMng.isAnmStop()
7325 mPyMdlMng.mpMdl->mAnm.getFrame() >= 10.0f ||
7326 (mPyMdlMng.isAnmStop() &&
mSpeed.y <= 0.0f)
7335void dAcPy_c::setSpinFireBall() {
7337 dAcPy_c *carryPlayer = getCarryPlayer();
7338 if (carryPlayer !=
nullptr) {
7339 carryPlayer->m_12f4 = m_12f4;
7340 carryPlayer->setSpinFireBall();
7342 }
else if (mPowerup == POWERUP_FIRE_FLOWER) {
7343 if (daFireBall_Player_c::CheckFireBallLimit(
mPlayerNo, 1)) {
7346 }
else if (mPowerup == POWERUP_PENGUIN_SUIT || mPowerup == POWERUP_ICE_FLOWER) {
7353bool dAcPy_c::setPropelAction() {
7359 if (!getCarryPropelBlock() && dScStage_c::m_miniGame == 0) {
7372void dAcPy_c::resetPropelFlyTime() {
7378void dAcPy_c::clearPropelFlyUpTime() {
7384void dAcPy_c::calcPropelMoveSpeedF() {
7386 u8 wasWalk = mKey.buttonWalk(&dir);
7397 f = data_802f5a0c[8];
7399 f = data_802f5a0c[9];
7403 f = data_802f5a0c[10];
7419void dAcPy_c::setPropelActionFlyInit() {
7423 mPropelRollSpeed = 12000;
7427 mPyMdlMng.setAnm(PLAYER_ANIM_PL_SPIN_JUMP);
7432void dAcPy_c::setPropelActionBigFly() {
7433 setPropelActionFlyInit();
7437 setStartPropelJumpEffect();
7438 startPatternRumble(
"****--****--**----**----**----**----**----**----**");
7441void dAcPy_c::setPropelActionFly() {
7442 setPropelActionFlyInit();
7445 startPatternRumble(
"***---***---*----**-----*----**-----*-----**-----*");
7448void dAcPy_c::PropelActionFly() {
7450 setPropelSpinSmokeEffect();
7451 if (mPropelRollSpeed < 3000) {
7452 mPropelRollSpeed = 3000;
7455 mSpeed.y = data_802f5a0c[4];
7469 setPropelActionFall();
7478void dAcPy_c::setPropelActionFall() {
7480 mPyMdlMng.setAnm(PLAYER_ANIM_PL_SPIN_JUMP, 30.0f, 0.0f);
7483 mPropelRollSpeed = 3000;
7488void dAcPy_c::PropelActionFall() {
7502 mPyMdlMng.setAnm(PLAYER_ANIM_JUMPED);
7505 if (mPropelRollSpeed < 2000) {
7510 calcPropelFallSpinEffect();
7511 if (mPropelRollSpeed < 1000) {
7512 mPropelRollSpeed = 1000;
7513 if (mPyMdlMng.getAnm() != PLAYER_ANIM_SPIN_JUMP3) {
7514 mPyMdlMng.setAnm(PLAYER_ANIM_SPIN_JUMP3);
7518 mPyMdlMng.mpMdl->mCurrAnmID == PLAYER_ANIM_SPIN_JUMP3 &&
7520 mPyMdlMng.mpMdl->mAnm.checkFrame(8.0f) ||
7521 mPyMdlMng.mpMdl->mAnm.checkFrame(19.0f)
7526 if (mKey.triggerShakeJump()) {
7527 mPropelRollSpeed = 5000;
7529 mPyMdlMng.setAnm(PLAYER_ANIM_PL_SPIN_JUMP);
7530 setPropelFallSpinEffect();
7535void dAcPy_c::initializeState_Propel() {
7539 setPropelActionFly();
7542 setPropelActionFall();
7545 setPropelActionBigFly();
7560 if (getCarryPropelActor() !=
nullptr) {
7566void dAcPy_c::finalizeState_Propel() {
7567 endPropelFlyPartsMove();
7568 stopPropelFallSpinEffect();
7569 mPropelRollSpeed = 0;
7587void dAcPy_c::executeState_Propel() {
7590 if (mPowerup != POWERUP_PROPELLER_SHROOM) {
7594 }
else if (getCarryPropelActor() ==
nullptr) {
7598 if (mPropelRollSpeed != 0) {
7599 mAngle.y += mPropelRollSpeed;
7600 if (!mIsPropelFall) {
7601 mPropelRollSpeed -= 200;
7603 mPropelRollSpeed -= 80;
7606 if (mPropelRollSpeed <= 0) {
7607 mPropelRollSpeed = 0;
7611 typedef void (dAcPy_c::*PropelActionProc)();
7612 static PropelActionProc l_PropelActionProc[] = {
7613 &dAcPy_c::PropelActionFly,
7614 &dAcPy_c::PropelActionFly,
7615 &dAcPy_c::PropelActionFall
7617 (this->*l_PropelActionProc[
mSubstate])();
7618 calcPropelMoveSpeedF();
7620 if (!checkCarryThrow() && setHipAttackAction()) {
7625void dAcPy_c::updatePropelParts() {
7628 updatePropelFlyPartsMove();
7629 }
else if (isLiftUp()) {
7638 mPyMdlMng.mpMdl->getHeadPropelJointMtx(&mtx);
7641 mPyMdlMng.mpMdl->setPropelRollSpeed(
mpPropelParts->mRollSpeed);
7643 mPyMdlMng.mpMdl->setPropelRollSpeed(0);
7644 mPyMdlMng.mpMdl->setPropelRollAngle(0);
7649void dAcPy_c::updatePropelFlyPartsMove() {
7659 if (mPropelRollSpeed < 3000) {
7665 dActor_c *propelActor = getCarryPropelActor();
7666 if (propelActor ==
nullptr) {
7674void dAcPy_c::endPropelFlyPartsMove() {
7675 dActor_c *propelActor = getCarryPropelActor();
7676 if (propelActor !=
nullptr) {
7677 propelActor->
mpPropelParts->finalizePropelFly(mPropelRollSpeed);
7682void dAcPy_c::setPropelSpinSmokeEffect() {
7683 mVec3_c efPos =
mPos;
7685 if (dMaskMng::isCaveMask() &&
mLayer == 0 && mAmiLayer == 1) {
7689 if (dBc_c::checkGround(&efPos, &height,
mLayer, 1, -1) &&
mPos.y < height + 64.0f) {
7691 dEf::createPlayerEffect(
mPlayerNo, &mLevelEf3,
"Wm_mr_spinsmoke", 0, &efPos,
nullptr,
nullptr);
7695void dAcPy_c::setStartPropelJumpEffect() {
7697 mVec3_c efPos =
mPos;
7698 if (dMaskMng::isCaveMask() &&
mLayer == 0 && mAmiLayer == 1) {
7701 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_spindepart", 0, &efPos,
nullptr,
nullptr);
7705void dAcPy_c::setPropelFallSpinEffect() {
7712bool dAcPy_c::calcPropelFallSpinEffect() {
7721 dAcPy_c *carryPlayer = getCarryPlayer();
7723 if (carryPlayer !=
nullptr) {
7724 carryPlayer->getModel()->getJointPos(&efPos, 1);
7726 mPyMdlMng.mpMdl->getJointPos(&efPos, 1);
7729 dEf::createPlayerEffect(
mPlayerNo, &mFollowEf,
"Wm_mr_spinjump_re", 0, &efPos,
nullptr,
nullptr);
7730 if (carryPlayer !=
nullptr) {
7737 if (m_538 == 3 && carryPlayer ==
nullptr) {
7738 stopPropelFallSpinEffect();
7741 if (mFollowEf.follow(&efPos,
nullptr,
nullptr)) {
7758void dAcPy_c::stopPropelFallSpinEffect() {
7764void dAcPy_c::initDemo_DownPose() {
7765 if (mPyMdlMng.mpMdl->mFlags & 4) {
7766 mPos.y = getAnkleCenterPos().y;
7768 mPyMdlMng.setAnm(PLAYER_ANIM_DEAD_POSE);
7772 setZPosition(5000.0f);
7774 mSpeed.set(0.0f, 0.0f, 0.0f);
7779void dAcPy_c::initDemo_DownFall() {
7781 case DEMO_DOWN_ARG_HIT:
7784 case DEMO_DOWN_ARG_TIME_UP:
7785 if (daPyMng_c::mTimeUpPlayerNum >= 2) {
7791 case DEMO_DOWN_ARG_POISON:
7792 case DEMO_DOWN_ARG_POISON_FOG:
7796 mPyMdlMng.setAnm(PLAYER_ANIM_DEAD);
7804void dAcPy_c::exeDemo_DownFall() {
7807 }
else if (
mSpeed.y > 0.5f) {
7809 }
else if (
mSpeed.y > -0.5f) {
7818void dAcPy_c::checkRest() {
7819 if (isItemKinopio()) {
7824 setBalloonInDamage();
7831 bool allDown =
true;
7832 for (
int i = 0; i < PLAYER_COUNT; i++) {
7833 if (daPyMng_c::mPlayerEntry[i] && daPyMng_c::mRest[daPyMng_c::mPlayerType[i]] != 0) {
7839 dScStage_c::setNextScene(3, 0, dScStage_c::EXIT_1, dFader_c::FADER_BOWSER);
7841 dScStage_c::setNextScene(9, 0, dScStage_c::EXIT_1, dFader_c::FADER_BOWSER);
7845void dAcPy_c::initPlayerDownCommon() {
7847 if (daPyMng_c::decNum(
mPlayerNo) && daPyMng_c::mNum == 0) {
7851 releaseCarryActor();
7856 mDamageInvulnTimer = 0;
7859 if (!isItemKinopio()) {
7868void dAcPy_c::stopOtherDownDemo() {
7869 if (isItemKinopio()) {
7876 daPyDemoMng_c::mspInstance->m_84 =
mPlayerNo;
7880 for (
int i = 0; i < PLAYER_COUNT; i++) {
7881 player = daPyMng_c::getPlayer(i);
7882 if (player !=
nullptr && !player->
isStatus(STATUS_53) && !player->isItemKinopio()) {
7885 daYoshi_c *yoshi = daPyMng_c::getYoshi(i);
7886 if (yoshi !=
nullptr) {
7893void dAcPy_c::playOtherDownDemo() {
7894 if (!isItemKinopio() && daPyDemoMng_c::mspInstance->m_84 == -1 && !m_7c) {
7899bool dAcPy_c::setTimeOverDemo() {
7912void dAcPy_c::initializeState_DemoDown() {
7913 initPlayerDownCommon();
7914 initDemo_DownPose();
7917 case DEMO_DOWN_ARG_HIT:
7918 case DEMO_DOWN_ARG_POISON_FOG:
7919 stopOtherDownDemo();
7921 case DEMO_DOWN_ARG_POISON: {
7927 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_poisonwave",
nullptr, &efPos,
nullptr,
nullptr);
7929 dBg_c::m_bg_p->setWaterInWave(
mPos.x, mWaterHeight, 20);
7930 stopOtherDownDemo();
7933 case DEMO_DOWN_ARG_TIME_UP:
7934 daPyMng_c::mTimeUpPlayerNum++;
7935 stopOtherDownDemo();
7938 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
7941void dAcPy_c::finalizeState_DemoDown() {
7945void dAcPy_c::executeState_DemoDown() {
7951 initDemo_DownFall();
7952 if (dBg_c::m_bg_p->m_90009 == 3) {
7956 playOtherDownDemo();
7966 dBgParameter_c *bgParam = dBgParameter_c::ms_Instance_p;
7967 dBg_c *bg = dBg_c::m_bg_p;
7968 float t = getVisTop();
7969 u8 val = bg->m_90009;
7970 float f = bgParam->yStart() - bgParam->ySize() - 24.0f;
7972 f = bgParam->yStart() - bgParam->ySize() - 8.0f;
7982 if (getVisBottom() > bgParam->yStart() + 64.0f) {
7995 checkSideViewLemit();
7998void dAcPy_c::setFallDownDemo() {
7999 if (isDispOutCheckOn()) {
8003 mExtraPushForceX = 0.0f;
8009void dAcPy_c::initializeState_DemoFallDown() {
8010 initPlayerDownCommon();
8011 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP2, 1.0f, 0.0f, 0.0f);
8015 mExtraPushForceX = 0.0f;
8018 setZPosition(5000.0f);
8019 float f = dBgParameter_c::ms_Instance_p->getLoopScrollDispPosX(
mPos.x);
8020 float f1 = f - 96.0f;
8021 float f2 = f + dBgParameter_c::ms_Instance_p->xSize() + 96.0f;
8025 stopOtherDownDemo();
8030void dAcPy_c::finalizeState_DemoFallDown() {
8034void dAcPy_c::executeState_DemoFallDown() {
8041 playOtherDownDemo();
8054 checkSideViewLemit();
8057void dAcPy_c::initializeState_DemoFireDown() {
8058 dScStage_c *stage = dScStage_c::m_instance;
8059 initPlayerDownCommon();
8060 if (mBgDamageType == 7) {
8066 if (stage !=
nullptr) {
8068 stage->mCurrWorld == WORLD_8 && stage->mCurrCourse == STAGE_3 ||
8069 stage->mCurrWorld == WORLD_8 && stage->mCurrCourse == STAGE_CASTLE && stage->mCurrFile == 3
8071 dEf::createPlayerEffect(
mPlayerNo,
"Wm_en_cmnmagmawave", 0, &efPos,
nullptr,
nullptr);
8073 dEf::createPlayerEffect(
mPlayerNo,
"Wm_mr_magmawave", 0, &efPos,
nullptr,
nullptr);
8076 dBg_c::m_bg_p->setWaterInWave(
mPos.x, mWaterHeight, 13);
8078 initDemo_DownPose();
8079 setZPosition(3000.0f);
8082 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
8083 stopOtherDownDemo();
8086void dAcPy_c::finalizeState_DemoFireDown() {}
8088void dAcPy_c::executeState_DemoFireDown() {
8096 setZPosition(5000.0f);
8097 mPyMdlMng.setAnm(PLAYER_ANIM_FIREJMP);
8105 playOtherDownDemo();
8111 dBgParameter_c *bgParam = dBgParameter_c::ms_Instance_p;
8112 float edgePos = getVisTop();
8113 float bgBottom = bgParam->yStart() - bgParam->ySize() - 24.0f;
8114 if (edgePos < bgBottom) {
8128 mVec3_c efScale(1.0f, 1.0f, 1.0f);
8129 if (mPowerup == POWERUP_MINI_MUSHROOM) {
8130 efScale.set(0.6f, 0.6f, 0.6f);
8134 checkSideViewLemit();
8137void dAcPy_c::setPlayerEatDie() {
8142 if (!isStar() && (mPowerup == POWERUP_NONE || mPowerup == POWERUP_MINI_MUSHROOM)) {
8148void dAcPy_c::initializeState_DemoEatDie() {
8151 initPlayerDownCommon();
8156 mSpeed.set(0.0f, 0.0f, 0.0f);
8161void dAcPy_c::finalizeState_DemoEatDie() {
8166void dAcPy_c::executeState_DemoEatDie() {
8172 }
else if (!isStar()) {
8173 if (mPowerup == POWERUP_MUSHROOM) {
8179 mDamageInvulnTimer = 127;
8199void dAcPy_c::releaseEatDie() {
8200 if (!isItemKinopio() && m_7c) {
8203 changeNormalAction();
8204 checkDisplayOutDead();
8207bool dAcPy_c::setEatDieHide() {
8208 if (isDemoState(StateID_DemoEatDie)) {
8209 mPyMdlMng.mpMdl->offStarEffect();
8217bool dAcPy_c::setEatDieFadeOut() {
8218 if (isDemoState(StateID_DemoEatDie)) {
8227bool dAcPy_c::setEatDieSpitOut() {
8228 if (isDemoState(StateID_DemoEatDie)) {
8235void dAcPy_c::setEatDieScreamVoice() {
8236 if (isDemoState(StateID_DemoEatDie)) {
8243bool dAcPy_c::searchDoorActor() {
8248 door->
mProfName == fProfile::EN_OBAKEDOOR ||
8249 door->
mProfName == fProfile::EN_TORIDEDOOR ||
8250 door->
mProfName == fProfile::EN_CASTLEDOOR
8252 if (std::fabs(door->
mPos.x -
mPos.x) < 16.0f && std::fabs(door->
mPos.y -
mPos.y) < 16.0f) {
8262void dAcPy_c::initializeState_DemoInDoor() {
8266 mPyMdlMng.setAnm(PLAYER_ANIM_DOOR_WALK);
8269 setZPosition(2800.0f);
8271 setZPosition(-2000.0f);
8273 mDamageInvulnTimer = 35;
8275 if (daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo) != 0) {
8282void dAcPy_c::finalizeState_DemoInDoor() {
8283 mDamageInvulnTimer = 0;
8284 mPowerupChangeInvulnTimer = 0;
8289void dAcPy_c::setDemoInDoor_Walk() {
8295void dAcPy_c::executeState_DemoInDoor() {
8296 daEnDoor_c *door =
nullptr;
8300 if (door ==
nullptr) {
8304 changeNormalAction();
8312 if (door->m_5cc == 0) {
8319 if (door->m_5d0 != 0) {
8320 setDemoInDoor_Walk();
8324 if (daPyDemoMng_c::mspInstance->checkDemoNo(
mPlayerNo)) {
8325 setDemoInDoor_Walk();
8332 if (daPyDemoMng_c::mspInstance->getNextDemoNo() == -1) {
8336 if (tmpDoor !=
nullptr && (tmpDoor->m_5cc == 1 || tmpDoor->m_5cc == 2)) {
8348 if (door->isClosed()) {
8356 if (!addCalcAngleY(ang, 10)) {
8357 daPyDemoMng_c::mspInstance->turnNextDemoNo();
8359 changeNormalAction();
8364void dAcPy_c::initializeState_DemoInJump() {
8367 mPyMdlMng.setAnm(PLAYER_ANIM_JUMP, 0.0f, 0.0f);
8370 mSpeedF = sc_DirSpeed[jumpDir] * 0.5f;
8372 if (mPowerup == POWERUP_MINI_MUSHROOM) {
8378 setButtonJumpGravity();
8382void dAcPy_c::finalizeState_DemoInJump() {}
8384void dAcPy_c::executeState_DemoInJump() {
8394 daPyDemoMng_c::mspInstance->turnNextDemoNo();
8397 int world = dScStage_c::m_instance->mCurrWorld;
8398 if (world == WORLD_4 || world == WORLD_6 || world == WORLD_8) {
8399 if (dScStage_c::m_instance->mCurrCourse == STAGE_DOOMSHIP) {
8406 setButtonJumpGravity();
8410 changeNormalAction();
8417void dAcPy_c::initializeState_DemoInVine() {
8418 mPyMdlMng.setAnm(PLAYER_ANIM_PEA_PLANT, 0.0f, 0.0f);
8423 dEnemyMng_c::m_instance->demo_ivy_create(&
mPos);
8426void dAcPy_c::finalizeState_DemoInVine() {}
8428void dAcPy_c::executeState_DemoInVine() {
8438 daPyDemoMng_c::mspInstance->turnNextDemoNo();
8449 changeNormalAction();
8456bool dAcPy_c::isDoorDemoEnable() {
8457 if (!isEnableDokanInStatus()) {
8460 if (mKey.buttonDoor()) {
8468bool dAcPy_c::setDoorDemo(
dActor_c *door) {
8469 if (isDoorDemoEnable()) {
8470 mVec3_c doorEnterPos(
8476 if (
dNext_c::m_instance->searchNextNum(dScStage_c::m_instance->mCurrFile, doorEnterPos.x, doorEnterPos.y + 1.0f, &nextGoto)) {
8481 if (daPyDemoMng_c::mspInstance->m_5c != 0) {
8490 profName == fProfile::EN_TORIDEDOOR ||
8491 profName == fProfile::EN_CASTLEDOOR
8504void dAcPy_c::initializeState_DemoOutDoor() {
8505 dAcPy_c *carryPlayer = getCarryPlayer();
8506 if (carryPlayer !=
nullptr) {
8507 releaseCarryActor();
8512 mSpeed.set(0.0f, 0.0f, 0.0f);
8513 float z = daPyDemoMng_c::mspInstance->get_88() * 64.0f;
8514 daPyDemoMng_c::mspInstance->inc_88();
8516 setZPosition(2800.0f + z);
8518 setZPosition(-2000.0f + z);
8520 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT);
8522 if (daPyMng_c::mNum == 1) {
8528 if (door !=
nullptr && door->m_5cc == 0) {
8534void dAcPy_c::finalizeState_DemoOutDoor() {
8538void dAcPy_c::exeDemoOutDoor_OpenDoor() {
8539 addCalcAngleY(0x8000, 2);
8542 if (door !=
nullptr && door->m_5d0 != 0) {
8543 static const float scDoorEnterWidth[] = { 8.0f, 10.0f };
8544 if (std::fabs(
mPos.x -
mWarpPos.x) > scDoorEnterWidth[mDoorSize]) {
8545 initDemoOutDoor_MoveCenter();
8547 initDemoOutDoor_MoveInter();
8553void dAcPy_c::initDemoOutDoor_MoveCenter() {
8562 float animSpeed = (speed * 2.0f < 2.0f) ? 2.0f : speed * 2.0f;
8563 mPyMdlMng.setAnm(PLAYER_ANIM_RUN, animSpeed, 0.0f, 0.0f);
8566void dAcPy_c::exeDemoOutDoor_MoveCenter() {
8568 initDemoOutDoor_MoveInter();
8572 addCalcAngleY(getMukiAngle(DIR_LR_R), 2);
8574 addCalcAngleY(getMukiAngle(DIR_LR_L), 2);
8579void dAcPy_c::initDemoOutDoor_MoveInter() {
8582 mPyMdlMng.setAnm(PLAYER_ANIM_DOOR_WALK);
8586void dAcPy_c::exeDemoOutDoor_MoveInter() {
8587 addCalcAngleY(0x8000, 2);
8590 if (mDoorSize == 0) {
8596 bool hasNonEnteredPlayer =
false;
8598 for (
int i = 0; i < PLAYER_COUNT; i++) {
8599 dAcPy_c *player = daPyMng_c::getCtrlPlayer(i);
8600 if (player ==
nullptr || player ==
this) {
8603 if (daPyMng_c::mActPlayerInfo & (1 << (u8) i)) {
8604 if (!player->
isStatus(STATUS_64)) {
8605 hasNonEnteredPlayer =
true;
8613 if (!hasNonEnteredPlayer && count == 0) {
8616 if (door !=
nullptr) {
8617 if ((door->m_5cc == 1 || door->m_5cc == 2)) {
8631void dAcPy_c::exeDemoOutDoor_WaitClose() {
8632 addCalcAngleY(0x8000, 2);
8638 if (door !=
nullptr && door->isClosed()) {
8645void dAcPy_c::exeDemoOutDoor_WaitEnter() {
8652void dAcPy_c::executeState_DemoOutDoor() {
8653 typedef void (dAcPy_c::*DemoOutDoorProc)();
8654 static DemoOutDoorProc sDemoOutDoorProc[] = {
8655 &dAcPy_c::exeDemoOutDoor_OpenDoor,
8656 &dAcPy_c::exeDemoOutDoor_MoveCenter,
8657 &dAcPy_c::exeDemoOutDoor_MoveInter,
8658 &dAcPy_c::exeDemoOutDoor_WaitClose,
8659 &dAcPy_c::exeDemoOutDoor_WaitEnter,
8667 if (isEnableDokanInStatus()) {
8677void dAcPy_c::endDemoDokanCannon(
mVec3_c &pos) {
8683bool dAcPy_c::isDokanCannonIn() {
8690void dAcPy_c::initializeState_DemoDokanCannon() {
8692 mpMdlMng->setAnm(PLAYER_ANIM_WAIT, 0.0f, 5.0f, scDokanWaitAnmFixFrame);
8696void dAcPy_c::finalizeState_DemoDokanCannon() {
8701void dAcPy_c::executeState_DemoDokanCannon() {
8705 if (std::fabs(
mPos.x -
mWarpPos.x) <= scDokanInWidthX) {
8719 checkDisplayOutDead();
8724int dAcPy_c::setDemoGoal(
mVec3_c &landPos,
float goalCastleX, u8 goalType) {
8725 daYoshi_c *yoshi = getRideYoshi();
8726 if (yoshi !=
nullptr) {
8727 return yoshi->setDemoGoal(landPos, goalCastleX, goalType);
8729 return daPlBase_c::setDemoGoal(landPos, goalCastleX, goalType);
8733void dAcPy_c::setOffYoshiInGoal(
daPlBase_c *yoshi) {
8737 mGoalTouchOrder = yoshi->mGoalTouchOrder;
8741bool dAcPy_c::setHideNotGoalPlayer() {
8745 return daPlBase_c::setHideNotGoalPlayer();
8748void dAcPy_c::initDemoGoalBase() {
8752 if (carryActor !=
nullptr) {
8755 releaseCarryActor();
8756 daPlBase_c::initDemoGoalBase();
8758 setDemoGoalMode(3, 6);
8759 mPyMdlMng.setAnm(PLAYER_ANIM_GET_DOWN, 0.0f, 0.0f);
8760 mSpeed.y = sc_JumpSpeed - 0.2f;
8762 mDemoState = CONTROL_DEMO_KINOPIO_SWIM;
8764 mAngle.y = getMukiAngle(DIR_LR_L);
8768void dAcPy_c::executeDemoGoal_Run() {
8769 switch (mDemoState) {
8771 if (mGoalTouchOrder >= 3 && dGameCom::rnd() < 0.5f) {
8778 for (
int i = 0; i < PLAYER_COUNT; i++) {
8779 daYoshi_c *yoshi = daPyMng_c::getYoshi(i);
8788 daPyDemoMng_c::mspInstance->mFlags |= 0x20;
8789 if (mGoalTouchOrder == 0) {
8790 daPyDemoMng_c::mspInstance->setDemoMode(daPyDemoMng_c::MODE_2, 0);
8793 mSpeed.set(0.0f, 0.0f, 0.0f);
8797 if (mPowerup == POWERUP_MINI_MUSHROOM) {
8799 }
else if (mDemoState == 2) {
8803 mPyMdlMng.setAnm(PLAYER_ANIM_RUN, f, 5.0f, 0.0f);
8811 if (dBc_c::checkGround(&
mPos, &height, 0, 1, -1)) {
8812 if (
mPos.y < height + 1.0f) {
8813 mPos.y = height + 1.0f;
8819 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT);
8828 setNormalJumpGravity();
8830 if (
mSpeed.y < sc_MaxFallSpeed) {
8831 mSpeed.y = sc_MaxFallSpeed;
8837 mPyMdlMng.setAnm(PLAYER_ANIM_JUMPED);
8843 if (mPyMdlMng.isAnmStop()) {
8844 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT);
8852bool dAcPy_c::updateDemoKimePose(ClearType_e clearType) {
8853 switch (mKimePoseMode) {
8854 case KIME_POSE_NONE:
8855 mPyMdlMng.setAnm(PLAYER_ANIM_WAIT);
8856 if (mPowerup == POWERUP_PROPELLER_SHROOM) {
8857 mKimePoseMode = KIME_POSE_PROPELLER;
8858 mPyMdlMng.setAnm(PLAYER_ANIM_PL_GOAL_PUTON_CAP);
8859 }
else if (mPowerup == POWERUP_PENGUIN_SUIT) {
8860 mKimePoseMode = KIME_POSE_PENGUIN;
8861 mPyMdlMng.setAnm(PLAYER_ANIM_P_GOAL_PUTON_CAP);
8864 mPyMdlMng.mpMdl->m_151 == mPyMdlMng.mpMdl->get151CheckVal() ||
8865 mPyMdlMng.mpMdl->m_151 == 3 ||
8866 mPyMdlMng.mpMdl->m_151 == 4
8868 mKimePoseMode = KIME_POSE_NO_HAT;
8870 mKimePoseMode = KIME_POSE_WITH_HAT;
8872 mPyMdlMng.setAnm(PLAYER_ANIM_GOAL_PUTON_CAP);
8874 startKimePoseVoice(clearType);
8876 case KIME_POSE_WITH_HAT: {
8877 dMarioMdl_c *mdl = (dMarioMdl_c *) mPyMdlMng.mpMdl;
8878 if (mPyMdlMng.mpMdl->mAnm.checkFrame(41.0f)) {
8879 mdl->fn_800cab00(1);
8882 if (mPyMdlMng.mpMdl->mAnm.checkFrame(107.0f)) {
8883 mdl->fn_800cab00(0);
8886 if (mPyMdlMng.isAnmStop()) {
8892 case KIME_POSE_PROPELLER:
8893 if (mPyMdlMng.mpMdl->mAnm.checkFrame(5.0f)) {
8897 if (mPyMdlMng.mpMdl->mAnm.checkFrame(12.0f)) {
8901 if (mPyMdlMng.isAnmStop()) {
8906 case KIME_POSE_PENGUIN:
8907 case KIME_POSE_NO_HAT:
8908 if (mPyMdlMng.isAnmStop()) {
8917void dAcPy_c::initializeDemoControl() {
8918 releaseCarryActor();
8920 clearPropelFlyUpTime();
8924bool dAcPy_c::setDemoCannonWarp(
int delay,
short angX,
short angY) {
8927 mAngle.x = angX + 0x2000;
8928 mAngle.y = angY + 0x6000;
8935void dAcPy_c::initializeState_DemoCannonWarp() {
8936 mPyMdlMng.setAnm(PLAYER_ANIM_SHOOT);
8942void dAcPy_c::finalizeState_DemoCannonWarp() {}
8944void dAcPy_c::executeState_DemoCannonWarp() {
8954 mAmiRelated2 = 1.0f;
8955 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_5, 0,
false);
8973 if (
mSpeed.y < sc_MaxFallSpeed) {
8974 mSpeed.y = sc_MaxFallSpeed;
8978 mPyMdlMng.mpMdl->getJointPos(&efPos, 1);
8979 static const float sc_slipEffectScale[] = { 0.5f, 0.8f, 1.0f };
8980 float s = mAmiRelated2 * sc_slipEffectScale[getTallType(-1)];
8981 mVec3_c efScale(s, s, s);
8994 dEf::createPlayerEffect(
mPlayerNo,
"Wm_ob_warpcannonkira", 0, &
mPos,
nullptr,
nullptr);
8995 dAudio::g_pSndObjMap->startSound(SE_OBJ_WARP_CANNON_SHINE,
mPos, 0);
9001 dScStage_c::setNextScene(3, 0, dScStage_c::EXIT_0, dFader_c::FADER_CIRCLE_TARGET);
9002 if (daPyDemoMng_c::mspInstance->
mPlayerNo < 0) {
9003 daPyDemoMng_c::mspInstance->mPlayerNo =
mPlayerNo;
9010bool dAcPy_c::isEnableDokanInStatus() {
9011 if (!daPlBase_c::isEnableDokanInStatus()) {
9015 if (isCarry() && getCarryPlayer() ==
nullptr) {
9019 if (getRidePlayer() !=
nullptr) {
9030bool dAcPy_c::setDokanIn(DokanDir_e dir) {
9035 dAcPy_c *carryPlayer = getCarryPlayer();
9036 if (carryPlayer !=
nullptr) {
9040 if (mKey.buttonDown() &&
mBc.checkDokanDown(&
mWarpPos, &nextGotoNum)) {
9041 if (setDemoOutDokanAction(nextGotoNum, dir)) {
9049 if (carryPlayer->setDemoOutDokanAction(nextGotoNum, dir)) {
9060 return daPlBase_c::setDokanIn(dir);
9063void dAcPy_c::initDemoOutDokan() {
9064 daPlBase_c::initDemoOutDokan();
9066 if (getCarryPlayer() !=
nullptr) {
9067 releaseCarryActor();
9070 dAcPy_c *ridePlayer = getRidePlayer();
9071 if (ridePlayer !=
nullptr) {
9072 ridePlayer->cancelCarry(
this);
9076void dAcPy_c::initialDoor() {
9080void dAcPy_c::initialJumpRight() {
9084void dAcPy_c::initialJumpLeft() {
9088void dAcPy_c::initialVine() {
9092void dAcPy_c::initialSwim() {
9100void dAcPy_c::initialBlockJump() {
9106void dAcPy_c::initialBlockJumpBelow() {
9112void dAcPy_c::setCreateAction(
int action) {
9114 if (daPyMng_c::isCreateBalloon(
mPlayerNo) && setBalloonInNextgoto()) {
9117 if (daPyMng_c::mCreateItem[daPyMng_c::mPlayerType[
mPlayerNo]] & 2) {
9118 daYoshi_c *yoshi = daPyMng_c::createYoshi(
mPos, daPyMng_c::getYoshiColor(
mPlayerNo),
this);
9119 if (yoshi !=
nullptr) {
9120 yoshi->mFruitCount = daPyMng_c::getYoshiFruit(
mPlayerNo);
9123 daPlBase_c::setCreateAction(action);
9127void dAcPy_c::initChangeInit() {
9136bool dAcPy_c::executeChangeInit() {
9137 if (mPowerup == mPowerupCopy2) {
9144 if (mPowerup == POWERUP_MINI_MUSHROOM) {
9145 float jumpSpeed = getJumpSpeed();
9146 if (
mSpeed.y > jumpSpeed) {
9149 releaseCarryActor();
9151 return isPlayerGameStop();
9155 int res = 6 - mChangeTimer / 6;
9160 static const float ratios[] = {
9161 0.4f, 0.2f, 0.6f, 0.4f, 0.8f, 0.6f, 1.0f
9165 float startScaleY, endScaleY;
9166 float startScaleX, endScaleX;
9170 static const Keyframe data[] = {
9212 if (mChangeTimer != 0) {
9214 float ratioA = 1.0f - ratios[res];
9215 float ratioB = ratios[res];
9216 Keyframe curr = data[m_67];
9217 float x = curr.startScaleX * ratioA + curr.endScaleX * ratioB;
9218 float y = curr.startScaleY * ratioA + curr.endScaleY * ratioB;
9222 m_159c = curr.unk * ratioA;
9226 mScale.set(1.0f, 1.0f, 1.0f);
9232void dAcPy_c::initChangeNormal() {
9234 int prevTallType = getTallType(mPowerupCopy);
9235 int currTallType = getTallType(-1);
9237 static const float offsets[3] = { 21.0f, 11.0f, 0.0f };
9238 mPos.y += offsets[currTallType] - offsets[prevTallType];
9240 static const int tallTypeChange[3][3] = {
9245 m_67 = tallTypeChange[prevTallType][currTallType];
9250 if (mPowerup == POWERUP_PROPELLER_SHROOM) {
9252 }
else if (mPowerup == POWERUP_PENGUIN_SUIT) {
9264 if (mPowerup == POWERUP_PROPELLER_SHROOM) {
9266 }
else if (mPowerup == POWERUP_PENGUIN_SUIT) {
9268 }
else if (mPowerup == POWERUP_FIRE_FLOWER || mPowerup == POWERUP_ICE_FLOWER) {
9277bool dAcPy_c::executeChangeNormal() {
9280 if (mChangeTimer != 0) {
9281 if ((frame & 1) != 0) {
9282 powerup = mPowerupCopy;
9284 if (powerup == POWERUP_NONE || powerup == POWERUP_MINI_MUSHROOM) {
9287 mPowerup == POWERUP_NONE && mPowerupCopy == POWERUP_MINI_MUSHROOM ||
9288 mPowerup == POWERUP_MINI_MUSHROOM && mPowerupCopy == POWERUP_NONE
9290 powerup = POWERUP_NONE;
9292 powerup = POWERUP_MUSHROOM;
9297 mPowerupChangeInvulnTimer = 8;
9299 mPyMdlMng.mpMdl->setPlayerMode(powerup);
9301 case POWERUP_FIRE_FLOWER:
9302 mPyMdlMng.mpMdl->setColorType(1);
9304 case POWERUP_ICE_FLOWER:
9305 mPyMdlMng.mpMdl->setColorType(2);
9308 mPyMdlMng.mpMdl->setColorType(0);
9311 return isPlayerGameStop();
9314void dAcPy_c::setChange(
int mode) {
9316 typedef void (dAcPy_c::*ChangeInitProc)();
9317 static ChangeInitProc l_changeInitProc[] = {
9318 &dAcPy_c::initChangeInit,
9319 &dAcPy_c::initChangeNormal
9321 (this->*l_changeInitProc[mChangeType])();
9326bool dAcPy_c::updateChange() {
9327 typedef bool (dAcPy_c::*ChangeActionProc)();
9328 static ChangeActionProc l_changeActionProc[] = {
9329 &dAcPy_c::executeChangeInit,
9330 &dAcPy_c::executeChangeNormal
9332 if (mChangeType >= 2) {
9336 if (mChangeTimer != 0) {
9339 if ((this->*l_changeActionProc[mChangeType])()) {
9350 mPowerupCopy2 = powerup;
9354void dAcPy_c::initializeState_DemoStartWait() {
9355 daPlBase_c::initializeState_DemoStartWait();
9358void dAcPy_c::executeState_DemoStartWait() {
9366 daPlBase_c::executeState_DemoStartWait();
9369void dAcPy_c::finalizeState_DemoStartWait() {
9370 daPlBase_c::finalizeState_DemoStartWait();
9385 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_7, 0,
false);
9389const int l_tall_type_offsets[] = { 0x8000, 0xF800, 0x1F800 };
9421const sCcDatNew l_cc_data_normal_swim = {
9431const sCcDatNew l_cc_data_normal_waterwalk = {
9436const sCcDatNew l_cc_data_super_waterwalk = {
9441const sCcDatNew l_cc_data_penguin_slid = {
9446enum CcSizeDataIndex_e {
9448 CC_SIZE_DATA_NORMAL,
9450 CC_SIZE_DATA_PROPEL,
9451 CC_SIZE_DATA_NORMAL_SIT,
9452 CC_SIZE_DATA_SUPER_SIT,
9453 CC_SIZE_DATA_NORMAL_SWIM,
9454 CC_SIZE_DATA_SUPER_SWIM,
9455 CC_SIZE_DATA_NORMAL_WATERWALK,
9456 CC_SIZE_DATA_SUPER_WATERWALK,
9457 CC_SIZE_DATA_PENGUIN_SLID
9465 &l_cc_data_normal_sit,
9466 &l_cc_data_super_sit,
9467 &l_cc_data_normal_swim,
9468 &l_cc_data_super_swim,
9469 &l_cc_data_normal_waterwalk,
9470 &l_cc_data_super_waterwalk,
9471 &l_cc_data_penguin_slid
9474const CcSizeDataIndex_e l_mode_cc_size_data[] = {
9475 CC_SIZE_DATA_NORMAL, CC_SIZE_DATA_SUPER, CC_SIZE_DATA_SUPER, CC_SIZE_DATA_MAME, CC_SIZE_DATA_PROPEL, CC_SIZE_DATA_SUPER, CC_SIZE_DATA_SUPER
9485 (u8) ~BIT_FLAG(CC_KIND_YOSHI),
9486 (u32) ~(BIT_FLAG(CC_ATTACK_NONE) | BIT_FLAG(CC_ATTACK_YOSHI_MOUTH) | BIT_FLAG(CC_ATTACK_SAND_PILLAR)),
9496 CC_KIND_PLAYER_ATTACK,
9498 (u8) ~(BIT_FLAG(CC_KIND_YOSHI) | BIT_FLAG(CC_KIND_ITEM) | BIT_FLAG(CC_KIND_TAMA)),
9501 dAcPy_c::atCcCallBack
9504bool dAcPy_c::ccCheckAttack(
dCc_c *self,
dCc_c *other) {
9505 dAcPy_c *selfPlayer = (dAcPy_c *) self->
getOwner();
9513 dAcPy_c *otherPlayer = (dAcPy_c *) otherActor;
9517 if (selfPlayer->checkRideActor(otherPlayer)) {
9525 dAcPy_c *otherPlayer = (dAcPy_c *) otherActor;
9526 if (!otherPlayer->checkCarryActor(selfPlayer)) {
9527 selfPlayer->checkCarryActor(otherPlayer);
9534 if (selfPlayer->isNoDamage()) {
9538 dAcPy_c *otherPlayer = (dAcPy_c *) otherActor;
9541 case CC_ATTACK_HIP_ATTACK:
9542 case CC_ATTACK_SPIN_FALL: {
9543 DamageType_e damageType = DAMAGE_HIP_ATTACK;
9544 if (selfPlayer->isClimbing()) {
9545 damageType = DAMAGE_CLIMB;
9547 if (selfPlayer->setDamage(otherActor, damageType)) {
9549 otherPlayer->setVsPlHipAttackEffect();
9552 selfPlayer->setHipAttackDamagePlayer(otherPlayer);
9556 case CC_ATTACK_WIRE_NET:
9557 selfPlayer->setDamage(other->
getOwner(), DAMAGE_CLIMB);
9559 case CC_ATTACK_FIREBALL:
9560 case CC_ATTACK_ICEBALL:
9565 case CC_ATTACK_YOSHI_BULLET:
9566 case CC_ATTACK_YOSHI_FIRE:
9567 case CC_ATTACK_ICE_2:
9569 if (selfPlayer->
isStatus(STATUS_51)) {
9574 if (!selfPlayer->setDamage(other->
getOwner(), DAMAGE_6)) {
9586bool dAcPy_c::ccCheckStamp(
dCc_c *self,
dCc_c *other) {
9587 dAcPy_c *selfPlayer = (dAcPy_c *) self->
getOwner();
9588 daPlBase_c *otherActor = (daPlBase_c *) other->
getOwner();
9591 selfPlayer->
mSpeed.y <= 0.0f &&
9593 !selfPlayer->isDemoType(DEMO_PLAYER) &&
9597 daYoshi_c *yoshi = (daYoshi_c *) otherActor;
9600 (!selfPlayer->isNowBgCross(
BGC_FOOT) || selfPlayer->isOnSinkSand()) &&
9606 if (selfPlayer->isEnableStampPlayerJump(self, other)) {
9608 selfPlayer->setStampPlayerJump(
true, self->
mCollOffsetY[CC_KIND_PLAYER]);
9609 otherActor->setStampReduction();
9612 if (selfPlayer->setPlayerJumpDai(otherActor)) {
9620bool dAcPy_c::ccCheckSideHit(
dCc_c *self,
dCc_c *other) {
9621 dAcPy_c *selfPlayer = (dAcPy_c *) self->
getOwner();
9622 daPlBase_c *otherActor = (daPlBase_c *) other->
getOwner();
9624 if (otherActor->isDemo()) {
9625 selfPlayer->setCcPlayerRev(self, other, 1.0f, CC_KIND_PLAYER);
9629 static const float sCcRevRate[3][3] = {
9630 { 0.5f, 1.0f, 1.0f },
9631 { 0.0f, 0.5f, 0.5f },
9632 { 0.0f, 0.5f, 0.5f },
9634 u8 selfTallType = selfPlayer->getTallType(-1);
9635 u8 otherTallType = otherActor->getTallType(-1);
9636 selfPlayer->setCcPlayerRev(self, other, sCcRevRate[selfTallType][otherTallType], CC_KIND_PLAYER);
9641void dAcPy_c::ccCallBack(
dCc_c *self,
dCc_c *other) {
9643 dAcPy_c *selfPlayer;
9645 selfPlayer = (dAcPy_c *) self->
getOwner();
9649 daPlBase_c *otherPlayer = (daPlBase_c *) otherActor;
9655 if (ccCheckAttack(self, other)) {
9660 daPlBase_c *otherPlayer = (daPlBase_c *) otherActor;
9661 if (selfPlayer->checkRideActor(otherPlayer)) {
9664 if (ccCheckStamp(self, other)) {
9667 if (ccCheckSideHit(self, other)) {
9673 daYoshi_c *yoshi = (daYoshi_c *) otherActor;
9674 if (selfPlayer->checkRideActor(yoshi)) {
9677 if (ccCheckStamp(self, other)) {
9680 if (yoshi->m_94 == 0) {
9684 static const float sCcRevRate[] = { 1.0f, 0.8f, 0.6f };
9685 selfPlayer->setCcPlayerRev(self, other, sCcRevRate[selfPlayer->getTallType(-1)], CC_KIND_YOSHI);
9689void dAcPy_c::setCcDataDirect() {
9690 const sCcDatNew *ccData = l_cc_size_data[l_mode_cc_size_data[mPowerup]];
9692 m_0c.y = ccData->
mOffset.y + m_1598 + m_159c;
9693 mCc.mCcData.mBase.mOffset.set(m_0c.x, m_0c.y);
9694 mCc.mCcData.mBase.mSize.set(ccData->mSize.x, ccData->mSize.y);
9697void dAcPy_c::setCcAtNetPunch() {
9698 float s = mPyMdlMng.getSomeScale();
9699 mAttCc1.mCcData.mAttack = CC_ATTACK_WIRE_NET;
9700 mAttCc1.mCcData.mBase.mOffset.set(s * 8.0f, s * 16.0f);
9701 mAttCc1.mCcData.mBase.mSize.set(s * 12.0f, s * 12.0f);
9704void dAcPy_c::setCcAtSpin() {
9705 float y = (getModelHeight() + 4.0f) / 2.0f;
9706 mAttCc1.mCcData.mBase.mOffset.set(
mCc.mCcData.mBase.mOffset.x, y);
9707 float x =
mCc.mCcData.mBase.mSize.x;
9708 mAttCc1.mCcData.mBase.mSize.set(x * 3.5f, y);
9709 mAttCc1.mCcData.mVsKind |= BIT_FLAG(CC_KIND_PLAYER_ATTACK);
9710 mAttCc1.mCcData.mAttack = CC_ATTACK_SPIN;
9711 mAttCc1.mCcData.mVsDamage = BIT_FLAG(CC_ATTACK_SPIN);
9712 mCc.mCcData.mVsDamage &= ~BIT_FLAG(CC_ATTACK_SPIN);
9715void dAcPy_c::setCcAtSpinFall() {
9716 mAttCc1.mCcData.mBase.mOffset.set(0.0f, 10.0f);
9717 mAttCc1.mCcData.mBase.mSize.set(12.0f, 10.0f);
9718 mAttCc1.mCcData.mAttack = CC_ATTACK_SPIN_FALL;
9719 setCcAtBody(CC_ATTACK_SPIN_FALL);
9724 if (mPowerup == POWERUP_MINI_MUSHROOM) {
9726 }
else if (mPowerup == POWERUP_NONE) {
9729 if (bounds ==
nullptr) {
9732 float h = (getModelHeight() + 4.0f) / 2.0f;
9733 bounds->mOffset.x = 0.0f;
9734 bounds->mSize.x = f;
9735 bounds->mOffset.y = h;
9736 bounds->mSize.y = h;
9739void dAcPy_c::setCcAtSpinLiftUp() {
9747 checkSpinLiftUpRoofHeight();
9750void dAcPy_c::setCcData() {
9751 int sizeIndex = l_mode_cc_size_data[mPowerup];
9752 if (mPyMdlMng.getFlags() & 1) {
9753 switch (getPowerup()) {
9754 case POWERUP_MINI_MUSHROOM:
9757 sizeIndex = CC_SIZE_DATA_NORMAL_SIT;
9760 sizeIndex = CC_SIZE_DATA_SUPER_SIT;
9763 }
else if (mPyMdlMng.getFlags() & 0x10) {
9764 switch (getPowerup()) {
9765 case POWERUP_MINI_MUSHROOM:
9768 sizeIndex = CC_SIZE_DATA_NORMAL_SWIM;
9771 sizeIndex = CC_SIZE_DATA_SUPER_SWIM;
9775 sizeIndex = CC_SIZE_DATA_PENGUIN_SLID;
9777 switch (getPowerup()) {
9778 case POWERUP_MINI_MUSHROOM:
9781 sizeIndex = CC_SIZE_DATA_NORMAL_WATERWALK;
9784 sizeIndex = CC_SIZE_DATA_SUPER_WATERWALK;
9793 mPyMdlMng.mpMdl->getJointMtx(&mtx, 1);
9794 mtx.concat(mMtx_c::createTrans(2.0f, 0.0f, 0.0f));
9796 mCc.mCcData.mBase.mSize.set(6.0f, 6.0f);
9797 mCc.mCcData.mBase.mOffset.set(pos.x -
mPos.x, pos.y -
mPos.y);
9798 mPyMdlMng.mpMdl->getJointMtx(&mtx, mPyMdlMng.mpMdl->getFaceJointIdx());
9799 mtx.concat(mMtx_c::createTrans(0.0f, -4.0f, 0.0f));
9801 mCc1.mCcData.mBase.mSize.set(6.0f, 6.0f);
9802 mCc1.mCcData.mBase.mOffset.set(pos.x -
mPos.x, pos.y -
mPos.y);
9806 const sCcDatNew *ccData = l_cc_size_data[sizeIndex];
9811 float sx = ccData->mSize.x;
9812 float sy = ccData->mSize.y;
9813 m_0c.set(x, ccData->
mOffset.y + m_1598 + m_159c);
9814 mCc.mCcData.mBase.mSize.set(sx, sy);
9815 mCc.mCcData.mBase.mOffset.setX(m_0c.x);
9816 if (mPyMdlMng.mpMdl->mFlags & 4) {
9819 mVec3_c anklePos = getAnkleCenterPos();
9820 float tmp = anklePos.y - 2.0f;
9824 mPyMdlMng.mpMdl->getJointMtx(&mtx, mPyMdlMng.mpMdl->getFaceJointIdx());
9825 mtx.concat(mMtx_c::createTrans(0.0f, -4.0f, 0.0f));
9827 float tmp1 = (pos.y + tmp) / 2.0f;
9828 mCc.mCcData.mBase.mOffset.y = tmp1 -
mPos.y;
9829 float tmp2 = (pos.y - tmp) / 2.0f;
9830 mCc.mCcData.mBase.mSize.y = std::fabs(tmp2);
9832 mCc.mCcData.mBase.mOffset.y = m_0c.y;
9834 dAcPy_c *ridePlayer = getRidePlayer();
9835 if (ridePlayer !=
nullptr && ridePlayer->mPowerup == POWERUP_NONE) {
9836 if (sizeIndex == 2) {
9837 mCc.mCcData.mBase.mOffset.y = 16.0f;
9838 mCc.mCcData.mBase.mSize.y = 8.0f;
9839 mCc.mCcData.mBase.mSize.x = 4.0f;
9840 }
else if (sizeIndex == 1) {
9841 mCc.mCcData.mBase.mOffset.y = 9.0f;
9842 mCc.mCcData.mBase.mSize.y = 5.0f;
9843 mCc.mCcData.mBase.mSize.x = 4.0f;
9847 mCc.mCcData.mVsKind &= ~(BIT_FLAG(CC_KIND_YOSHI) | BIT_FLAG(CC_KIND_PLAYER) | BIT_FLAG(CC_KIND_PLAYER_ATTACK));
9849 mCc.mCcData.mVsKind |= (BIT_FLAG(CC_KIND_YOSHI) | BIT_FLAG(CC_KIND_PLAYER) | BIT_FLAG(CC_KIND_PLAYER_ATTACK));
9853void dAcPy_c::atCcCallBack(
dCc_c *self,
dCc_c *other) {
9855 dAcPy_c *selfPlayer;
9857 selfPlayer = (dAcPy_c *) self->
getOwner();
9861 selfPlayer->checkSpinLiftUpReserve(other);
9865 if (selfPlayer->isNoDamage()) {
9870 dAcPy_c *otherPlayer = (dAcPy_c *) otherActor;
9884 selfPlayer->setDamage(otherActor, DAMAGE_CLIMB);
9889 { 0xC8001, -0x1800, 0x1000, 0x0 },
9890 { 0x5C0001, -0x1000, 0x0, 0x7A00 },
9891 { 0xC0001, 0x3000, 0x4000, 0x5000 },
9892 { 0xC0001, 0x4000, 0x1000, 0x0 }
9895 { 0xC8001, -0x1800, 0x1000, 0x0 },
9896 { 0x5C0001, -0x1000, 0x0, 0x7A00 },
9897 { 0xC0001, 0x2800, 0x3800, 0x5000 },
9898 { 0xC0001, 0x4000, 0x1000, 0x0 }
9901 { 0xC8001, -0x2000, 0x1000, 0x0 },
9902 { 0x5C0001, -0x1000, 0x0, 0x1000 },
9903 { 0xC0001, -0x4000, -0x4000, 0x3000 },
9904 { 0xC0001, 0x4000, 0x1000, 0x0 }
9907 { 0xC8001, -0x1800, 0x1000, 0x0 },
9908 { 0x5C0001, -0x1000, 0x0, 0x7800 },
9909 { 0xC0001, 0x3000, 0x4000, 0x5000 },
9910 { 0xC0001, 0x4000, 0x1000, 0x0 }
9913 { 0xC8001, -0x1800, 0x1000, 0x0 },
9914 { 0x5C0001, -0x1000, 0x0, 0x7800 },
9915 { 0xC0001, 0x2800, 0x3800, 0x5000 },
9916 { 0xC0001, 0x4000, 0x1000, 0x0 }
9922 { 0xC8001, -0x5000, 0x4000, 0x0 },
9923 { 0x5C0001, -0x2000, 0x1000, 0x10000 },
9924 { 0xC0001, 0x4000, 0xB000, 0x8000 },
9925 { 0xC0001, 0x8000, 0x1000, 0x2000 }
9928 { 0xC8001, -0x5000, 0x4000, 0x0 },
9929 { 0x5C0001, -0x2000, 0x1000, 0xC000 },
9930 { 0xC0001, 0x4000, 0x8800, 0x8000 },
9931 { 0xC0001, 0x8000, 0x1000, 0x2000 }
9934 { 0xC8001, -0x5000, 0x4000, 0x0 },
9935 { 0x5C0001, -0x2000, 0x1000, 0x1000 },
9936 { 0xC0001, -0x4000, -0xE000, 0x8000 },
9937 { 0xC0001, 0x8000, 0x1000, 0x2000 }
9940 { 0xC8001, -0x5000, 0x4000, 0x0 },
9941 { 0x5C0001, -0x2000, 0x1000, 0x10000 },
9942 { 0xC0001, 0x4000, 0xA000, 0x8000 },
9943 { 0xC0001, 0x8000, 0x1000, 0x2000 }
9946 { 0xC8001, -0x5000, 0x4000, 0x0 },
9947 { 0x5C0001, -0x2000, 0x1000, 0xC000 },
9948 { 0xC0001, 0x4000, 0xA000, 0x8000 },
9949 { 0xC0001, 0x8000, 0x1000, 0x2000 }
9955 { 0xC8001, -0x5000, 0x4000, 0x0 },
9956 { 0x9C0001, -0x2000, 0x1000, 0x1B000 },
9957 { 0xC0001, 0x4000, 0x13000, 0x8000 },
9958 { 0xC0001, 0x10000, 0x1000, 0x2000 }
9961 { 0xC8001, -0x5000, 0x4000, 0x0 },
9962 { 0x9C0001, -0x2000, 0x1000, 0x10000 },
9963 { 0xC0001, 0x4000, 0xB000, 0x8000 },
9964 { 0xC0001, 0xC000, 0x1000, 0x2000 }
9967 { 0xC8001, -0x5000, 0x4000, 0x0 },
9968 { 0x9C0001, -0x2000, 0x1000, 0x1000 },
9969 { 0xC0001, -0x4000, -0x18000, 0x8000 },
9970 { 0xC0001, 0x10000, 0x1000, 0x2000 }
9973 { 0xC8001, -0x5000, 0x4000, 0x0 },
9974 { 0x9C0001, -0x2000, 0x1000, 0x1B000 },
9975 { 0xC0001, 0x4000, 0x13000, 0x8000 },
9976 { 0xC0001, 0x10000, 0x1000, 0x2000 }
9979 { 0xC8001, -0x5000, 0x4000, 0x0 },
9980 { 0x9C0001, -0x2000, 0x1000, 0x12000 },
9981 { 0xC0001, 0x4000, 0x10000, 0x8000 },
9982 { 0xC0001, 0x10000, 0x1000, 0x2000 }
9987 { 0xC8101, -0xA000, 0x9000, 0x0 },
9988 { 0x9C0101, -0x7000, 0x6000, 0x12000 },
9989 { 0x129C0101, 0x4000, 0xD000, 0x10000 },
9990 { 0x0, 0x0, 0x0, 0x0 }
9994 { 0xC8001, -0x5000, 0x4000, 0x4000 },
9995 { 0x9C0001, -0x2000, 0x1000, 0x1B000 },
9996 { 0xC0001, 0x8000, 0x17000, 0x8000 },
9997 { 0x0, 0x0, 0x0, 0x0 }
10001 scBgPointData_Normal,
10002 scBgPointData_Super,
10003 scBgPointData_Super,
10004 scBgPointData_Mame,
10005 scBgPointData_Super,
10006 scBgPointData_Super,
10007 scBgPointData_Super,
10011 return &scBgPointData[powerup][index];
10014float dAcPy_c::getStandHeadBgPointY() {
10020 return &scBgPointData_PenguinSlide;
10023 return &scBgPointData_PenguinSwim;
10025 u32 flags = mPyMdlMng.mpMdl->mFlags;
10026 int bgDataIndex = 0;
10027 if (flags & BIT_FLAG(0)) {
10028 if (mPowerup != POWERUP_MINI_MUSHROOM) {
10031 }
else if (flags & BIT_FLAG(2)) {
10033 }
else if (flags & BIT_FLAG(4)) {
10035 }
else if (mPyMdlMng.mpMdl->mCurrAnmID == PLAYER_ANIM_STAR_ROLL_DUPLICATE) {
10041void dAcPy_c::setBcData(
int setInstant) {
10043 if (isItemKinopio()) {
10046 const sBcPlayerPointData *data = getBgPointData();
10047 sBcPointData footData = data->mFoot;
10048 sBcPointData headData = data->mHead;
10049 sBcPointData wallData = data->mWall;
10050 sBcPointData vineData = data->mVine;
10052 footData.mFlags |= 0x200000;
10055 footData.mFlags |= 0x10900100;
10056 wallData.mFlags |= 0x10900100;
10057 headData.mFlags |= 0x10900100;
10060 footData.mFlags |= 0x80000000;
10062 footData.mFlags |= 0x2000;
10063 wallData.mSupMargin = headData.mOffset - 0x2000;
10065 footData.mFlags |= 0xd00000;
10066 }
else if (isState(StateID_HipAttack)) {
10067 switch (mPyMdlMng.mpMdl->mCurrAnmID) {
10068 case PLAYER_ANIM_HIPAT:
10070 footData.mFlags |= 0x500000;
10072 footData.mFlags |= 0x800000;
10076 case PLAYER_ANIM_HIPED:
10078 footData.mFlags |= 0x900000;
10084 headData.mFlags |= 0x4000000;
10086 float y =
mPos.y + getStandHeadBgPointY() - 1.0f;
10089 if (dBc_c::checkTenjou(&pos, &height,
mLayer, mAmiLayer)) {
10090 if (height < y && !dBc_c::checkBg(pos.x, height + 4.0f,
mLayer, mAmiLayer, 0x10)) {
10091 footData.mFlags |= 0x800000;
10097 headData.mFlags |= 0x4000000;
10100 footData.mFlags |= 0x10000;
10103 footData.mFlags |= 8;
10106 footData.mFlags |= 0x80000000;
10107 wallData.mFlags |= 0x80000000;
10108 headData.mFlags |= 0x80000000;
10111 footData.mFlags |= 0x100;
10112 wallData.mFlags |= 0x100;
10113 headData.mFlags |= 0x100;
10115 if (mPowerup == POWERUP_PENGUIN_SUIT) {
10116 footData.mFlags |= 0x10;
10118 if (
isStatus(STATUS_EXTRA_PUSH_FORCE)) {
10119 footData.mFlags |= 0x20;
10122 wallData.mFlags |= 0x2000000;
10123 headData.mFlags |= 0x2000000;
10126 headData.mFlags |= 0x4000000;
10131 float angY =
mAngle.y.sin() * 19456.0f;
10135 angY -= x.
sin() *
mAngle.y.sin() * 81920.0f;
10137 headData.mInfMargin += angY;
10138 headData.mSupMargin += angY;
10140 if (setInstant == 1) {
10141 mFootBcData = footData;
10142 mHeadBcData = headData;
10143 mWallBcData = wallData;
10144 mVineBcData = vineData;
10146 sLib::chase(&mFootBcData.mInfMargin, footData.mInfMargin, 0x1000);
10147 sLib::chase(&mFootBcData.mSupMargin, footData.mSupMargin, 0x1000);
10148 sLib::chase(&mFootBcData.mOffset, footData.mOffset, 0x1000);
10150 sLib::chase(&mHeadBcData.mInfMargin, headData.mInfMargin, 0x1000);
10151 sLib::chase(&mHeadBcData.mSupMargin, headData.mSupMargin, 0x1000);
10153 sLib::chase(&mWallBcData.mInfMargin, wallData.mInfMargin, 0x1000);
10154 sLib::chase(&mWallBcData.mSupMargin, wallData.mSupMargin, 0x1000);
10155 sLib::chase(&mWallBcData.mOffset, wallData.mOffset, 0x1000);
10157 sLib::chase(&mVineBcData.mInfMargin, vineData.mInfMargin, 0x1000);
10158 sLib::chase(&mVineBcData.mSupMargin, vineData.mSupMargin, 0x1000);
10159 sLib::chase(&mVineBcData.mOffset, vineData.mOffset, 0x1000);
10161 if (mHeadBcData.mOffset < headData.mOffset) {
10162 mVec3_c pos(
mPos.x,
mPos.y + mHeadBcData.mOffset / 4096.0f + 1.0f,
mPos.z);
10164 if (dBc_c::checkTenjou(&pos, &height,
mLayer, mAmiLayer)) {
10165 if (height <
mPos.y + headData.mOffset / 4096.0f) {
10166 float tmp = height -
mPos.y;
10170 headData.mOffset = (int) (tmp * 4096.0f);
10174 sLib::chase(&mHeadBcData.mOffset, headData.mOffset, 0x1000);
10175 mFootBcData.mFlags = footData.mFlags;
10176 mHeadBcData.mFlags = headData.mFlags;
10177 mWallBcData.mFlags = wallData.mFlags;
10178 mVineBcData.mFlags = vineData.mFlags;
10180 mBc.set(
this, mFootBcData, mHeadBcData, mWallBcData);
10181 mBc.mAmiLine = getCcLineKind();
10182 mRc.mLineKind = getCcLineKind();
10186 mRc.mFlags |= BIT_FLAG(1);
10188 mRc.mFlags &= ~BIT_FLAG(1);
10193 dAcPy_c *carryPlayer = getCarryPlayer();
10194 if (carryPlayer ==
nullptr) {
10205 if (data1.mOffset < data->mWall.mOffset) {
10206 data1.mOffset = data->mWall.mOffset;
10209 int headOffset = data->mHead.mOffset + l_tall_type_offsets[getTallType(-1)];
10210 int wallLMargin = data->mWall.mSupMargin + l_tall_type_offsets[getTallType(-1)];
10213 int thing = (
int) (carryPlayer->
mPos.y * 4096.0f) - (
int) (
mPos.y * 4096.0f);
10214 int tmp = data->mHead.mOffset + thing;
10215 if (headOffset > tmp) {
10218 if (headOffset < data2.mOffset) {
10219 headOffset = data2.mOffset;
10221 int tmp2 = data->mWall.mSupMargin + thing;
10222 if (wallLMargin > tmp2) {
10223 wallLMargin = tmp2;
10225 if (wallLMargin < data1.mSupMargin) {
10226 wallLMargin = data1.mSupMargin;
10230 data2.mFlags = data->mHead.mFlags;
10231 data2.mInfMargin = data->mHead.mInfMargin;
10232 data2.mSupMargin = data->mHead.mSupMargin;
10233 data2.mOffset = headOffset;
10234 data1.mSupMargin = wallLMargin;
10235 if (!isMameAction()) {
10236 data2.mFlags = 0x9c0001;
10241 dAcPy_c *carryPlayer = getCarryPlayer();
10242 if (carryPlayer ==
nullptr) {
10248 float val =
mPos.y + data2.mOffset / 4096.0f + tmp / 4096.0f;
10249 float someOffset = data1.mOffset / 4096.0f - 1.0f;
10250 pos.x =
mPos.x + someOffset;
10252 if (dBc_c::checkTenjou(&pos, &height,
mLayer, 1)) {
10253 if (height > pos.y && height <= val) {
10258 pos.x =
mPos.x - (someOffset + 1.0f);
10259 if (dBc_c::checkTenjou(&pos, &height,
mLayer, 1)) {
10260 if (height > pos.y && height <= val) {
10269 dAcPy_c *ridePlayer = getRidePlayer();
10270 if (ridePlayer !=
nullptr && !ridePlayer->isMameAction()) {
10271 data2.mFlags = 0x9c0001;
10273 mBc.mRidePlrNo = -1;
10275 dAcPy_c *carryPlayer = getCarryPlayer();
10276 if (carryPlayer !=
nullptr) {
10290 if (getCarryHardBlock()) {
10292 if (data1.mOffset < data->mWall.mOffset) {
10293 data1.mOffset = data->mWall.mOffset;
10295 data2.mInfMargin = data->mHead.mInfMargin;
10296 data2.mSupMargin = data->mHead.mSupMargin;
10297 data2.mOffset += 0xc000;
10298 data2.mFlags = 0x9c0001;
10299 data1.mSupMargin += 0xc000;
10303void dAcPy_c::initCcData() {
10307void dAcPy_c::initBcData() {
10314void dAcPy_c::maxFallSpeedSet() {
10315 if (isMameAction()) {
10322void dAcPy_c::set1UpKinokoEffect() {
10323 setFollowEffect(1);
10326void dAcPy_c::setFlagGetEffect() {
10328 setFollowEffect(2);
10331void dAcPy_c::setFollowEffect(
int followType) {
10332 mFollowType = followType;
10333 if (mFollowType == 0) {
10336 int efSizeType = 0;
10337 if (mPowerup == POWERUP_NONE) {
10339 }
else if (mPowerup == POWERUP_MINI_MUSHROOM) {
10343 mPyMdlMng.mpMdl->getJointPos(&efPos, 0);
10344 float s = mPyMdlMng.getSomeScale();
10345 mVec3_c efScale(s, s, s);
10346 if (mFollowType == 1) {
10347 static const char *sc_oneUpEffectID[] = {
10352 dEf::createPlayerEffect_change(
mPlayerNo, &mFollowEf4, sc_oneUpEffectID[efSizeType], 0, &efPos,
nullptr, &efScale);
10353 }
else if (mFollowType == 2) {
10354 static const char *sc_flagGetEffectID[] = {
10355 "Wm_mr_flaggetkira",
10356 "Wm_mr_flaggetkira_s",
10357 "Wm_mr_flaggetkira_ss"
10359 dEf::createPlayerEffect(
mPlayerNo, &mFollowEf4, sc_flagGetEffectID[efSizeType], 0, &efPos,
nullptr, &efScale);
10363void dAcPy_c::updateFollowEffect() {
10364 if (mFollowType == 0) {
10369 mPyMdlMng.mpMdl->getJointPos(&efPos, 0);
10370 float s = mPyMdlMng.getSomeScale();
10371 mVec3_c efScale(s, s, s);
10372 if (!mFollowEf4.follow(&efPos,
nullptr, &efScale)) {
10377void dAcPy_c::calcTimerProc() {
10382 daPlBase_c::calcTimerProc();
10383 calcInvalidKeyTimer();
10402 mKey.clearShakeJump();
10406void dAcPy_c::executeMain() {
10409 updateItemGetEffect();
10410 managePropelFukidashi();
10411 if (updateChange()) {
10414 calcReductionScale();
10419 updatePropelParts();
10421 updateFollowEffect();
10423 daYoshi_c *yoshi = getRideYoshi();
10424 if (yoshi !=
nullptr) {
10425 if (yoshi->isDemo()) {
10429 if (executeDemoState()) {
10441 if (!
isStatus(STATUS_96) && !
isStatus(STATUS_97) && mKey.buttonWalk(&dir)) {
10446 calcPlayerSpeedXY();
10457 if (mKey.mActionTriggered) {
10462void dAcPy_c::checkBgCrossSub() {
10463 if (
mBc.checkPoleCollision(&mVineBcData)) {
10464 onNowBgCross(BGC_CAN_CLIMB);
10466 u32 resFlags =
mBc.checkVineCollision(&mVineBcData);
10467 if (resFlags & 0x0F) {
10469 if (resFlags & 0b1100) {
10472 if (resFlags & 0b0011) {
10476 if (resFlags & 0x30) {
10477 onNowBgCross(BGC_VINE_TOUCH_2);
10479 if (isAmiRollAction()) {
10484 sBcPointData vineData = mVineBcData;
10485 int v = mWallBcData.mOffset * 0.7f;
10486 if (vineData.mOffset < v) {
10487 vineData.mOffset = v;
10489 u32 resFlags2 =
mBc.checkVineCollision(&vineData);
10490 if (resFlags2 & 1 || resFlags2 & 2) {
10493 if (resFlags2 & 4 || resFlags2 & 8) {
10496 if (resFlags2 & 1 || resFlags2 & 4) {
10499 if (resFlags2 & 2 || resFlags2 & 8) {
10504void dAcPy_c::postBgCross() {
10505 if (!isMameAction()) {
10513 if (
mSpeed.y < 0.0f && m_15b6 == 0) {
10514 mPos.y = mWaterHeight;
10518 onNowBgCross(BGC_ON_ICE);
10523 mBc.mpCtrHead =
nullptr;
10529 if (isNowBgCross(BGC_ON_SINK_SAND)) {
10531 mPos.y = mSinkSandHeight;
10533 offNowBgCross(BGC_ON_SINK_SAND);
10534 offNowBgCross(BGC_IN_SINK_SAND);
10535 offNowBgCross(BGC_INSIDE_SINK_SAND);
10539 daPlBase_c::postBgCross();
10541 if (!isNowBgCross(BGC_61)) {
10544 isNowBgCross(BGC_WALL_TOUCH_L_2) &&
mSpeedF < 0.0f ||
10545 isNowBgCross(BGC_WALL_TOUCH_R_2) &&
mSpeedF > 0.0f
10549 mFinalAirPushForceX = 0;
10554 isNowBgCross(BGC_ON_ICE) &&
10556 mBc.mpCtrWall !=
nullptr
10558 float f =
mBc.mpCtrWall->mpActor->mPos.x -
mBc.mpCtrWall->mpActor->mLastPos.x;
10595 if (!isNowBgCross(BGC_62)) {
10610 setEnemyStageClearDemo();
10611 clearJumpActionInfo(1);
10612 resetPropelFlyTime();
10618void dAcPy_c::clearJumpActionInfo(
int) {
10623 bool checkRes =
false;
10624 if (
mBc.mpCtrHead !=
nullptr &&
mBc.mpCtrHead->mpActor !=
nullptr) {
10625 if (
mBc.mpCtrHead->mpActor->mProfName == fProfile::EN_GOALPOLE) {
10628 if (
mBc.mpCtrHead->mpActor->mActorProperties & 0x10 ||
mBc.mpCtrHead->mpActor->mActorProperties & 0x20) {
10635 if (mScrollMode == 4 || mScrollMode == 2) {
10641float dAcPy_c::getSandSinkRate() {
10645bool dAcPy_c::setPressBgDamage(
int a,
int b) {
10646 dAcPy_c *carryPlayer = getCarryPlayer();
10647 if (carryPlayer !=
nullptr) {
10649 cancelCarry(getCarryPlayer());
10652 if (mPowerup == POWERUP_MINI_MUSHROOM || carryPlayer->mPowerup == POWERUP_MINI_MUSHROOM) {
10653 carryPlayer->setPressBgDamage(a, b);
10655 mVec3_c pos = carryPlayer->
mPos;
10657 if (dBc_c::checkTenjou(&pos, &height,
mLayer, mAmiLayer)) {
10659 pos.y = height - data->mHead.mOffset / 4096.0f - 2.0f;
10660 carryPlayer->
mPos = pos;
10662 cancelCarry(carryPlayer);
10666 return daPlBase_c::setPressBgDamage(a, b);
10684 0.12f, 0.12f, 0.094f, 0.25f,
10686 0.12f, 0.12f, 0.094f, 0.25f
10690 0.028f, 0.028f, 0.032f, 0.25f,
10692 0.038f, 0.038f, 0.042f, 0.25f
10696 0.07f, 0.07f, 0.07f, 0.25f,
10698 0.07f, 0.07f, 0.07f, 0.25f
10756 { 0.7f, 1.5f, 2.8f },
10757 { 0.0f, 0.18f, 0.24f, 0.3f }
10760const float dAcPy_c::data_802f5a0c[] = {
10761 0.0f, 0.08f, 0.07f, 0.11f, -1.5f, -1.25f,
10762 -1.0f, -0.1f, 1.5f, 1.5f, 2.5f, 2.5f,
10763 1.0f, -6.0f, 3.214242E-39
10766const float dAcPy_c::data_802f5a48[] = {
10767 25.0f, 3.627f, 3.0f, 0.6f, 2.3509887E-38,
10768 1.2f, 2.0f, 1.5f, 2.4f, 0.02f, 0.01f,
10769 0.05f, 0.2f, 0.03f, 0.03f, 0.8f, 0.7f,
10770 0.8f, 0.14f, 4.0f, 0.07f, 40.0f
10832 1.5f, 4.5f, 0.5f, 4.0f, 1.4f, 1.0f,
10839 0.5f, 3.2f, 3.0f, 1.2f,
10840 0.5f, 0.625f, 0.5f, 0.625f,
10841 0.8f, 1.0f, 1.3f, 2.0f
10846dAcPy_c::dAcPy_c() : mPyMdlMng(
daPyMng_c::getCourseInPlayerModelType(ACTOR_PARAM(PlayerNo))) {
10849 mpMdlMng = &mPyMdlMng;
10850 mPyMdlMng.mpMdl->mpOwner =
this;
10852 mPlayerType = daPyMng_c::getPlayerType(
mPlayerNo);
10853 mPowerup = daPyMng_c::mPlayerMode[daPyMng_c::getPlayerType(
mPlayerNo)];
10854 mIsRescueKinopio = 0;
10855 if (daPyMng_c::mCreateItem[daPyMng_c::getPlayerType(
mPlayerNo)] & 8) {
10856 mIsRescueKinopio = 1;
10857 dInfo_c::m_instance->m_6c =
true;
10858 mPlayerType = PLAYER_BLUE_TOAD;
10859 mPowerup = daPyMng_c::mKinopioMode;
10860 daPyMng_c::mPlayerEntry[
mPlayerNo] = 0;
10861 daPyMng_c::mCreateItem[daPyMng_c::getPlayerType(
mPlayerNo)] &= ~CREATE_ITEM_RESCUE_TOAD;
10867dAcPy_c::~dAcPy_c() {
10868 daPyMng_c::setPlayer(
mPlayerNo,
nullptr);
10875 setSceneChangeInfo();
10880void dAcPy_c::setSceneChangeInfo() {
10881 if (isItemKinopio()) {
10882 if (dScStage_c::getExitMode() == dScStage_c::EXIT_3) {
10885 ctrlPlayer !=
nullptr &&
10888 !
isStatus(STATUS_ITEM_KINOPIO_DISPLAY_OUT)
10897 u32 createItem = CREATE_ITEM_NONE;
10899 switch (dScStage_c::getExitMode()) {
10900 case dScStage_c::EXIT_3: {
10901 if (!
isStatus(STATUS_55) || isNotBalloonCourse()) {
10905 powerup = POWERUP_NONE;
10909 daYoshi_c *yoshi = getRideYoshi();
10910 if (yoshi !=
nullptr) {
10912 int fruitCount = yoshi->getFruitCount();
10913 u8 yoshiColor = yoshi->getModel()->getColor();
10914 daPyMng_c::setCarryOverYoshiInfo(
mPlayerNo, yoshiColor, fruitCount);
10919 case dScStage_c::EXIT_2:
10920 powerup = daPyMng_c::mPlayerMode[daPyMng_c::getPlayerType(
mPlayerNo)];
10921 createItem = daPyMng_c::mCreateItem[daPyMng_c::getPlayerType(
mPlayerNo)];
10923 case dScStage_c::EXIT_1:
10924 powerup = POWERUP_NONE;
10930 daPyMng_c::mPlayerEntry[
mPlayerNo] = 1;
10931 daPyMng_c::mPlayerMode[daPyMng_c::getPlayerType(
mPlayerNo)] = powerup;
10932 daPyMng_c::mCreateItem[daPyMng_c::getPlayerType(
mPlayerNo)] = createItem;
10933 daPyMng_c::m_star_time[
mPlayerNo] = mStarTimer;
10934 daPyMng_c::m_star_count[
mPlayerNo] = mStarCount;
10938 mPyMdlMng.create(
mPlayerNo, mPowerup, dPyMdlMng_c::SCENE_TYPE_0);
10939 mPowerupCopy2 = mPowerup;
10940 mPowerupCopy = mPowerup;
10946 mAccelY = getGravityData()[0];
10947 mScale.set(1.0f, 1.0f, 1.0f);
10948 mAmiRelated2 = 1.0f;
10953 if (isItemKinopio()) {
10959 mPropelParts.create(
this);
10962 setCreateAction(ACTOR_PARAM(CreateAction));
10965 if (dScStage_c::m_miniGame == 0 && dScStage_c::m_instance->mCurrCourse != STAGE_PEACH_CASTLE) {
10967 setStar(STAR_SET_2, 660);
10969 if (daPyMng_c::m_star_time[
mPlayerNo] != 0) {
10970 setStar(STAR_SET_2, daPyMng_c::m_star_time[
mPlayerNo]);
10972 mStarCount = daPyMng_c::m_star_count[
mPlayerNo];
10975 if (!isItemKinopio() && dScStage_c::m_gameMode == dInfo_c::GAME_MODE_NORMAL) {
10976 mSndObj.m_58 = dAudio::getRemotePlayer(
mPlayerNo);
10979 switch (mPlayerType) {
10980 case PLAYER_MARIO: x = 0;
break;
10981 case PLAYER_LUIGI: x = 1;
break;
10982 case PLAYER_YELLOW_TOAD: x = 2;
break;
10983 case PLAYER_BLUE_TOAD: x = 3;
break;
10996 if (yoshi !=
nullptr) {
11007 dAcPy_c *ridePlayer = getRidePlayer();
11008 if (ridePlayer !=
nullptr) {
11009 pos.x = ridePlayer->
mPos.x;
11011 if (mScrollMode != 3) {
11013 bool notDone =
false;
11030 if (mScrollMode == 5) {
11039void dAcPy_c::selectAction() {
11041 if (std::fabs(
mSpeedF) >= 1.0f) {
11053 if (isDemo() ||
isStatus(STATUS_53)) {
11056 if (setBalloonButtonA()) {
11061 setQuakeAction(60, QUAKE_MODE_0);
11069 }
else if (setVineAction()) {
11071 }
else if (setHangAction()) {
11073 }
else if (setPoleAction()) {
11075 }
else if (setKaniHangAction()) {
11077 }
else if (checkWallJump()) {
11079 }
else if (setSpinActionReq()) {
11081 }
else if (setSwimAction()) {
11083 }
else if (setFireBallAction()) {
11085 }
else if (setTarzanRopeAction()) {
11090void dAcPy_c::executeLastPlayer() {
11094 clearHipAttackDamagePlayer();
11099 setPlayerJumoDaiPos();
11106 setPlayerEatReact();
11113void dAcPy_c::executeLastAll() {
11117 setSpinLiftUpReserve();
11121 setPlayerHandPos();
11123 ang.
y += getMissSpinAngle();
11131 calcHeadAttentionAngle();
11133 setSpinJumpEffect(0);
11134 setMissSpinJumpEffect(0);
11138void dAcPy_c::calcModel() {
11139 mPyMdlMng.mpMdl->setDark(m_74);
11141 if (isNowBgCross(BGC_36)) {
11142 mPyMdlMng.mpMdl->m_17c |= 0x400;
11144 mPyMdlMng.mpMdl->m_17c &= ~0x400;
11147 daYoshi_c *yoshi = getRideYoshi();
11149 if (yoshi !=
nullptr) {
11151 yoshi->getModel()->getJointMtx(&mtx, 1);
11153 mtx.concat(mMtx_c::createTrans(
11154 dPyMdlMng_c::m_hio.getValue(mPlayerType, 0, mPowerup),
11155 dPyMdlMng_c::m_hio.getValue(mPlayerType, 1, mPowerup),
11159 mtx.
ZrotM(-0x58E3);
11162 mtx.concat(mMtx_c::createTrans(0.0f, 0.0f, 15.0f));
11163 mtx.concat(mMtx_c::createScale(daPlBase_c::getReductionModelScale()));
11164 mtx.concat(mMtx_c::createTrans(0.0f, 0.0f, -15.0f));
11165 mtx.concat(mMtx_c::createScale(getModelScaleBase()));
11167 mPyMdlMng.calc(mtx);
11172 mPyMdlMng.calc(mRideJrClownMtx);
11178 mPos.y + m_1598 + m_159c,
11184 mAngle.y.mAngle + getMissSpinAngle(),
11188 mPyMdlMng.calc(pos, rot, getModelScale());
11191mVec3_c dAcPy_c::getModelScaleBase() {
11192 float scale = mAmiRelated2;
11201mVec3_c dAcPy_c::getModelScale() {
11203 getModelScaleBase().x * getReductionModelScale().x,
11204 getModelScaleBase().y * getReductionModelScale().y,
11205 getModelScaleBase().z * getReductionModelScale().z
11224 if (mPowerupCopy2 == powerup) {
11228 mPowerupCopy2 = powerup;
11229 return mPowerup != powerup;
11232void dAcPy_c::setStar(StarSet_e starSet,
int timer) {
11233 setStarBase(starSet, timer);
11234 if (starSet == STAR_SET_0) {
11235 setVirusStar(getRidePlayer());
11236 setVirusStar(getCarryPlayer());
11240void dAcPy_c::setStarBase(StarSet_e starSet,
int timer) {
11241 if (starSet == STAR_SET_0) {
11245 mStarTimer = timer;
11247 daPyMng_c::startStarBGM();
11249 mPyMdlMng.mpMdl->onStarAnm();
11253void dAcPy_c::endStar() {
11254 if (mStarTimer != 0) {
11256 mPyMdlMng.mpMdl->offStarAnm();
11257 mPyMdlMng.mpMdl->offStarEffect();
11258 daPyMng_c::stopStarBGM();
11262void dAcPy_c::calcStarTimer() {
11263 mPyMdlMng.mpMdl->offStarEffect();
11264 if (mStarTimer != 0) {
11265 mPyMdlMng.mpMdl->mScale = mVec3_c(mAmiRelated2, mAmiRelated2, mAmiRelated2);
11267 mPyMdlMng.mpMdl->onStarEffect();
11269 if (mStarTimer < 10) {
11270 mPyMdlMng.mpMdl->offStarAnm();
11272 if (mStarTimer == 120) {
11277 if (mStarTimer < 60) {
11278 daPyMng_c::stopStarBGM();
11285void dAcPy_c::setVirusStar(
daPlBase_c *otherPlayer) {
11286 if (otherPlayer ==
nullptr) {
11290 int selfTimer = mStarTimer;
11291 int otherTimer = otherPlayer->mStarTimer;
11293 if (selfTimer == otherTimer) {
11297 if (selfTimer > otherTimer) {
11298 otherPlayer->setStar(STAR_SET_1, selfTimer);
11300 setStar(STAR_SET_1, otherTimer);
11304void dAcPy_c::setWaterWalkFlag() {
11312 static const dAudio::SoundEffectID_t sc_JumpSoundSuper[] = { SE_PLY_JUMP_S, SE_PLY_2NDJUMP_S, SE_PLY_3RDJUMP_S };
11313 static const dAudio::SoundEffectID_t sc_JumpSoundMame[] = { SE_PLY_JUMP_SS, SE_PLY_2NDJUMP_SS, SE_PLY_3RDJUMP_SS };
11314 if (jumpType == 2 && !mKey.buttonJump()) {
11317 switch (jumpType) {
11319 switch (mPowerup) {
11321 startSound(sc_JumpSoundSuper[mJumpCounter],
true);
11323 case POWERUP_MINI_MUSHROOM:
11324 startSound(sc_JumpSoundMame[mJumpCounter],
true);
11327 startSound(sc_JumpSoundNormal[mJumpCounter],
true);
11332 switch (mPowerup) {
11336 case POWERUP_MINI_MUSHROOM:
11346bool dAcPy_c::isNoDamage() {
11348 (mDamageInvulnTimer | mPowerupChangeInvulnTimer) != 0 ||
11350 isDemoType(DEMO_PLAYER) ||
11359bool dAcPy_c::setDamage(
dActor_c *actor, daPlBase_c::DamageType_e damageType) {
11360 if (mPowerup != mPowerupCopy2 || isChange()) {
11364 if (isNoDamage()) {
11368 if (setDamage2(actor, damageType)) {
11369 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
11376bool dAcPy_c::setForcedDamage(
dActor_c *actor, daPlBase_c::DamageType_e damageType) {
11377 if (isDemo() || mPowerup != mPowerupCopy2 || isChange()) {
11381 if (setDamage2(actor, damageType)) {
11382 dQuake_c::m_instance->shockMotor(
mPlayerNo, dQuake_c::TYPE_4, 0,
false);
11389bool dAcPy_c::setDamage2(
dActor_c *actor, daPlBase_c::DamageType_e damageType) {
11393 releaseCarryActor();
11395 if (setFlyDamageAction(3, actor)) {
11401 switch (damageType) {
11405 case DAMAGE_ELEC_SHOCK:
11407 setJrCrownElecDamage();
11412 case DAMAGE_POISON:
11415 case DAMAGE_SQUISH:
11418 case DAMAGE_POISON_FOG:
11421 case DAMAGE_EAT_DIE:
11426 case DAMAGE_HIP_ATTACK:
11430 return setFlyDamageAction(damageType, actor);
11432 setReductionScale();
11438 if (mPowerup == POWERUP_NONE || mPowerup == POWERUP_MINI_MUSHROOM) {
11439 if (damageType == DAMAGE_8) {
11445 if (mPowerup == POWERUP_MUSHROOM) {
11450 if (damageType == DAMAGE_2) {
11451 mDamageInvulnTimer = 127;
11452 return setFlyDamageAction(damageType, actor);
11454 if (damageType == DAMAGE_FREEZE) {
11457 mDamageInvulnTimer = 127;
11465u8 dAcPy_c::getTallType(s8 powerup) {
11466 const u8 l_tall_type[] = {
11467 1, 2, 2, 0, 2, 2, 2
11470 if (powerup == -1) {
11471 powerup = mPowerup;
11473 return l_tall_type[powerup];
11476void dAcPy_c::setCenterOffset() {
11477 float l_powerup_offsets[] = {
11478 16.0f, 31.0f, 31.0f, 6.0f, 34.0f, 31.0f, 31.0f
11481 mModelHeight = l_powerup_offsets[mPowerup];
11483 mVec3_c offset(0.0f, 0.0f, 0.0f);
11484 if (mPyMdlMng.mpMdl->mFlags & 1) {
11485 offset.y = mModelHeight / 4.0f;
11486 }
else if (mPyMdlMng.mpMdl->mFlags & 4) {
11487 offset.y = -(mModelHeight / 2.0f);
11489 offset.y = mModelHeight / 2.0f;
11493 float target = 16.0f;
11494 if (mPowerup == POWERUP_MINI_MUSHROOM) {
11500void dAcPy_c::setPlayerData() {
11501 static const mVec2_POD_c l_player_cull_data[] = {
11505 setVisibleArea(l_player_cull_data[0], l_player_cull_data[1]);
11508void dAcPy_c::setSpeedData() {
11509 static const int scSpeedHioData[] = { 1, 1, 1, 0, 1, 1, 1 };
11510 u8 index = scSpeedHioData[mPowerup];
11511 mSpeedDataNormal = &m_speed_hio[index].mDataNormal;
11512 mSpeedDataStar = &m_speed_hio[index].mDataStar;
11515void dAcPy_c::setModeGravity() {
11517 if (mPowerup == POWERUP_MINI_MUSHROOM) {
11520 mGravityData = daPlayerData_c::smc_POWER_CHANGE_DATA.mGravityData[index];
11523const float *dAcPy_c::getGravityData() {
11524 if (isMameAction()) {
11525 return daPlayerData_c::smc_POWER_CHANGE_DATA.mGravityData[1];
11527 return daPlayerData_c::smc_POWER_CHANGE_DATA.mGravityData[0];
11532 mPowerupCopy = mPowerup;
11533 mPowerup = powerup;
11534 mPyMdlMng.mpMdl->setPlayerMode(mPowerup);
11538 mAccelF = getSpeedData()->mPowerChangeNormal.mSlowAccel;
11541 switch (mPowerup) {
11542 case POWERUP_PROPELLER_SHROOM:
11543 if (!isItemKinopio()) {
11549 resetPropelFlyTime();
11551 case POWERUP_PENGUIN_SUIT:
11557 mBc.mPlayerFlags &= ~BIT_FLAG(3);
11558 if (mPowerup == POWERUP_MINI_MUSHROOM) {
11559 mBc.mPlayerFlags |= BIT_FLAG(3);
11565 if (mPowerup != POWERUP_MINI_MUSHROOM && isClimbing()) {
11568 return _setJump(jumpSpeed, speedF, allowSteer, keyMode, jumpMode);
11578 if (setSwimSpeed(jumpSpeed * 0.5f, speedF * 0.5f)) {
11581 clearJumpActionInfo(0);
11587 if (jumpSpeed <= 0.0f) {
11599 bool isSpinJump =
false;
11600 bool isSitJump =
false;
11606 if (jumpSpeed == 0.0f) {
11616 if (jumpMode == 1) {
11620 }
else if (isSitJump) {
11632 if (keyMode == 1) {
11634 }
else if (keyMode == 2) {
11646 if (getSpinActionMode() == 0 || isOnSinkSand()) {
11662bool dAcPy_c::setCannonJump(
float speedY,
float speedF,
int jumpType) {
11671 changeState(StateID_CannonJump, (
void *) jumpType);
11675bool dAcPy_c::setSwimSpeed(
float speedY,
float speedF) {
11677 setUzuSwimAction();
11686bool dAcPy_c::isEnablePropelJump() {
11691 if (isDemo() ||
isStatus(STATUS_AUTO_BOUNCE)) {
11695 return getSpinActionMode() == 1;
11698int dAcPy_c::getSpinActionMode() {
11699 s8 tmp = getPowerup();
11700 if (getCarryPropelActor() !=
nullptr) {
11701 tmp = POWERUP_PROPELLER_SHROOM;
11703 dAcPy_c *carryPlayer = getCarryPlayer();
11704 if (carryPlayer !=
nullptr) {
11705 tmp = carryPlayer->getPowerup();
11707 if (tmp == POWERUP_PROPELLER_SHROOM && isLiftUp()) {
11708 tmp = POWERUP_MUSHROOM;
11712 return tmp == POWERUP_PROPELLER_SHROOM ? 1 : 0;
11715bool dAcPy_c::setSpinActionReq() {
11716 mKey.offStatus(dAcPyKey_c::STATUS_2);
11717 if (mPowerup == POWERUP_PROPELLER_SHROOM) {
11718 mKey.onStatus(dAcPyKey_c::STATUS_2);
11723 !mKey.triggerShakeJump() ||
11731 setCcAtSpinLiftUp();
11732 clearSpinLiftUpReserve();
11738bool dAcPy_c::setSpinAction() {
11750 if (checkStandUpRoof()) {
11760 if (getSpinActionMode() == 0) {
11766 if (setPropelAction()) {
11775void dAcPy_c::setScrollMode(s8 mode) {
11776 if (!isItemKinopio()) {
11777 mScrollMode = mode;
11783void dAcPy_c::setInvalidKeyTimer(
int p1,
int p2) {
11789void dAcPy_c::setInvalidKeyTimer_LR(
int p1,
int p2) {
11795void dAcPy_c::calcInvalidKeyTimer() {
11796 for (
int i = 0; i < 2; i++) {
11797 if (m_1318[i] != 0) {
11798 if (m_1310[i] == 2) {
11802 }
else if (m_1310[i] == 1) {
11808 if (m_1318[i] == 0) {
11819void dAcPy_c::startQuakeShock(dQuake_c::TYPE_SHOCK_e type) {
11820 daPlBase_c::startQuakeShock(type);
11821 dAcPy_c *carryPlayer = getCarryPlayer();
11822 if (carryPlayer !=
nullptr) {
11823 carryPlayer->startQuakeShock(type);
11827void dAcPy_c::startPatternRumble(
const char *pattern) {
11828 daPlBase_c::startPatternRumble(pattern);
11829 dAcPy_c *carryPlayer = getCarryPlayer();
11830 if (carryPlayer !=
nullptr) {
11831 carryPlayer->startPatternRumble(pattern);
11835void dAcPy_c::setItemGetEffect() {
11840void dAcPy_c::setChukanPowerUpEffect() {
11845void dAcPy_c::endPowerUpEffect() {
11847 mItemGetEffect1.fade();
11849 mItemGetEffect2.fade();
11855void dAcPy_c::updateItemGetEffect() {
11860 mVec3_c efScale(1.0f, 1.0f, 1.0f);
11861 if (mPowerup == POWERUP_MINI_MUSHROOM) {
11862 efScale.set(0.7f, 0.7f, 0.7f);
11864 mItemGetEffect1.createEffect(
"Wm_mr_itemget01", 0, &efPos,
nullptr, &efScale);
11870 mItemGetEffect1.setColor(255, 255, 255, alpha, EGG::Effect::RECURSIVE_3);
11871 mItemGetEffect1.copyExEffectParam();
11872 mItemGetEffect2.createEffect(
"Wm_mr_itemget02", 0, &efPos,
nullptr, &efScale);
11881 dScStage_c::m_instance->mCurrWorld == WORLD_1 &
11882 dScStage_c::m_instance->mCurrCourse == STAGE_1 &&
11883 !dSaveMng_c::m_instance->getSaveGame(-1)->isCourseDataFlag(0, 0, 0x10)
11890bool dAcPy_c::searchKinopioNearPlayer(
float *dist) {
11892 float closest = 1600.0f;
11893 for (
int i = 0; i < PLAYER_COUNT; i++) {
11894 if (!(daPyMng_c::mActPlayerInfo & (1 << (u8) i))) {
11897 player = daPyMng_c::getPlayer(i);
11898 if (player ==
nullptr) {
11901 if (player ==
this || !player->isDrawingCarryFukidashi()) {
11908 if (closest > diff.length()) {
11909 closest = diff.length();
11912 if (closest >= 1600.0f) {
11915 if (dist !=
nullptr) {
11921void dAcPy_c::managePropelFukidashi() {
11928 if (isItemKinopio()) {
11933 if (dist < 48.0f) {
11936 }
else if (dist < 80.0f) {
11940 if (check ==
true) {
11948 if (check ==
true) {
11964 if (isDrawingFukidashi() && isEnablePropelJump() && getCarryPropelBlock() ==
nullptr) {
11972 if (check ==
true) {
11978 }
else if (!check) {
11986bool dAcPy_c::isDrawingFukidashi() {
11995 dScStage_c::m_miniGame != 0
11999 int level = dScStage_c::m_instance->mCurrCourse;
12000 return level != STAGE_TITLE &&
12001 level != STAGE_PEACH_CASTLE &&
12002 level != STAGE_STAFFROLL;
12005bool dAcPy_c::isDrawingCarryFukidashi() {
12007 !isDrawingFukidashi() ||
int buttonUp() const
Returns whether the up button is pressed down.
bool buttonWalk(int *direction) const
Returns whether left / right is pressed down. Sets the direction to 0 for right and 1 for left.
@ STATUS_SHAKE_COOLDOWN
Is in cooldown for shake events.
@ STATUS_FORCE_NO_JUMP
Force a jump input to be ignored.
@ STATUS_DISABLE_LR
Disable left and right directional buttons.
@ STATUS_FORCE_JUMP
Force the jump button to be pressed down.
@ STATUS_NO_INPUT
Disable all inputs.
The player class for Mario, Luigi and the Toads.
bool initDemoDokanCannon(mVec3_c &pos, int cannonMode)
static sFStateID_c< dAcPy_c > StateID_CarryPlayer
Being carried by another player.
static sFStateID_c< dAcPy_c > StateID_RollSlip
Flying through the air after being thrown by another player.
virtual bool setJump(float jumpSpeed, float speedF, bool allowSteer, int keyMode, int jumpMode)
Starts a jump action with the given parameters.
short mNoInteractTimer
Disables interaction with other players and enemies while the timer is non-zero.
virtual bool setEatSpitOut(dActor_c *eatingActor)
Callback for when the actor is about to be spat out.
virtual void setEatTongue(dActor_c *eatingActor)
Callback for when the actor is targeted by Yoshi's tongue.
void reviseBcDataCarryPlayer(sBcPointData &data1, sBcPointData &data2)
int mTarzanRopeCooldown
Timer to disable swinging on a vine while active.
int checkWallSlideEnable(int)
int mPowerUpType
0: Touching an item, 1: Touching the midway point.
void fn_80145fd0(int jumpType)
Jump voice, some enum as param.
const sBcPlayerPointData * getBgPointData_Powerup(PLAYER_POWERUP_e, int)
virtual void setWaitActionAnm(AnmBlend_e)
static sFStateID_c< dAcPy_c > StateID_LiftUp
Lifting up another player.
u32 mSpinFireBallCooldown
Timer to control how often fireballs the player automatically shoots while spinning.
bool fn_80143220(sBcPointData &data1, sBcPointData &data2)
virtual int doDelete()
do method for the delete operation.
u32 mStartSpinCooldown
Timer to disable spin jumps and propeller spins while active.
u8 mJumpComboTimer
Timer for allowing a slight delay between jumps to still count as a combo.
virtual bool isSpinLiftUpEnable()
Returns whether the actor can be carried.
virtual void setPowerup(PLAYER_POWERUP_e, int)
void fn_80127740(int jumpType, AnmBlend_e blendMode)
Jump animation set, some enum as first param.
int mPoleGrabCooldown
Timer to disable grabbing a pole while active.
u8 mWallSlideCooldown
Timer to disable wall sliding while active.
virtual int preExecute()
pre method for the execute operation.
void fn_80143060(sBcPointData &data1, sBcPointData &data2, bool)
int mSpinTimer
Timer for the duration of a spin jump.
int mSpinCooldown
Timer to disable another spin action while active.
bool fn_80145c00(PLAYER_POWERUP_e)
void getCcBounds(sRangeDataF *bounds)
static sFStateID_c< dAcPy_c > StateID_BlockJump
Rescue Toad jumping out of his block.
virtual void eatMove(dActor_c *eatingActor)
Updates the actor's position during eating actions.
bool spinLiftUp(dActor_c *, bool)
virtual int draw()
do method for the draw operation.
virtual void setEatTongueOff(dActor_c *eatingActor)
Callback for when the eating action is canceled.
void fn_801282d0(AnmBlend_e blendMode)
void setFireBallDamage(u8 type)
int mFastRunFrames
How many frames the player has been running at over 1 unit/frame.
void setWallSlideEffect()
virtual int create()
do method for the create operation.
virtual bool _setJump(float jumpSpeed, float speedF, bool allowSteer, int keyMode, int jumpMode)
Starts a jump action unconditionally. See setJump().
int change_reverse_scale_set()
float mSpinHoldReqTarget
The target X position to move to while doing a spin in place.
virtual void setSpinLiftUpActor(dActor_c *carryingActor)
Callback for when the actor is picked up by another actor.
virtual void setEatMouth(dActor_c *eatingActor)
Callback for when the actor is being eaten.
bool fn_80146e40(float, float, bool)
void fn_801416c0(PLAYER_POWERUP_e)
void reviseBcDataCarryHardBlock(sBcPointData &data1, sBcPointData &data2)
short mBalloonHelpVoiceCooldown
Timer to only allow the help voice to play every 2 seconds.
void calcUzuSwimSpeed(float, float, float *)
int mPowerUpEffectTimer
Timer controlling the powerup effect duration and opacity.
virtual void postExecute(MAIN_STATE_e status)
post method for the execute operation.
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.
static dActor_c * construct(ProfileName profName, unsigned long param, const mVec3_c *position, const mAng3_c *rotation, u8 layer)
Creates a stage actor without a parent.
virtual void setCarryFall(dActor_c *carryingActor, int collisionDelay)
Callback for when the actor is dropped by the carrying actor.
@ CARRY_RELEASE
The actor is being released from carry.
@ CARRY_THROW
The actor is being actively thrown by the player.
fBaseID_e mEatenByID
The unique identifier of the eating actor.
virtual s8 & getPlrNo()
Gets the player number associated with the actor. See mPlayerNo.
virtual void setSpinLiftUpActor(dActor_c *carryingActor)
Callback for when the actor is picked up by another actor.
dBc_c mBc
The actor-to-tile collision sensor.
virtual bool isSpinLiftUpEnable()
Returns whether the actor can be carried.
u32 mCarryingFlags
The actor's carry actions. See CARRY_ACTION_e.
u8 mKind
The actor's kind. Value is a STAGE_ACTOR_KIND_e.
u8 mEatState
The actor's eat state. Value is a EAT_STATE_e.
u8 mDirection
The actor's facing direction.
dCc_c mCc
The actor-to-actor collision sensor.
@ EAT_TYPE_EAT
The actor can be eaten and then spat out.
@ EAT_TYPE_NONE
The actor cannot be eaten.
u8 mThrowDirection
The actor's direction when thrown or dropped after carrying.
void setKind(u8 kind)
Sets the actor's kind. See STAGE_ACTOR_KIND_e.
u8 mEatBehavior
The actor's eat behaviour. Value is a EAT_BEHAVIOR_e.
s8 mPlayerNo
The player associated with the actor, -1 if not associated to any player.
dPropelParts_c * mpPropelParts
The actor's propeller effect manager.
@ EAT_STATE_NONE
The actor is not being eaten.
dActor_c()
Constructs a new actor.
dRc_c mRc
The actor's ride surface manager.
@ STAGE_ACTOR_ENEMY
An enemy actor.
@ STAGE_ACTOR_YOSHI
The Yoshi actor.
@ STAGE_ACTOR_PLAYER
The player actor.
u8 mLayer
The actor's layer.
bool mVisible
Whether the actor should be visible or not. Defaults to true .
void calcSpeedXY()
Updates the actor's speed (2D actors). See here for details.
mVec3_c mScale
The actor's scale (defaults to 1).
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.
mVec3_c mSpeedMax
The actor's maximum speed.
mVec3_c mCenterOffs
The offset from the position to the center of the actor (defaults to 0).
void calcFallSpeed()
Updates the actor's falling speed. See here for details.
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).
u32 mActorProperties
The actor's properties. See fProfile::fActorProfile_c::mActorProperties.
float mAccelY
The actor's vertical acceleration.
float mMaxSpeedF
The actor's maximum horizontal speed.
Collider ("Collision Check") class - handles collisions between actors.
float getUnderPos()
Gets the Y position of the bottom of the collider.
float getCenterPosY()
Gets the Y position of the center of the collider.
float mCollOffsetY[CC_KIND_COUNT]
The Y offset for a collision.
float getCenterPosX()
Gets the X position of the center of the collider.
dActor_c * getOwner() const
Gets the owner actor of this collider.
sCcDatNewF mCcData
The collision data of this collider.
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.
static dNext_c * m_instance
The singleton instance of this class.
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.
void fn_800d2de0(float, int, mVec3_c &, u8)
float getValue(dPyModelData_s model, u8 powerup)
static bool CheckIceballLimit(int playerNo, int limitMode)
Checks if a new iceball can be created for a player based on the limit mode.
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.
void onStatus(int id)
Enables the status with the given ID. See Status_e.
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].
void startSound(ulong soundID, bool)
int mSquishNoMoveTimer
Timer for how long to freeze the squished player in position.
KaniArg_e
Arguments for transitioning to the cliff state.
@ KANI_ARG_HANG_UP_VINE
Climbing onto the cliff from a vine.
@ KANI_ARG_WALK_FORCE
Standing on the cliff, disallow immediately hanging from it by holding down.
@ KANI_ARG_HANG
Landing high enough on the cliff to stand on it, but hang down from it instead.
@ KANI_ARG_HANG_HAND
Catching the cliff from below, hang from it.
@ KANI_ARG_JUMP_HANG
Falling onto the cliff, immediately hang from it.
@ KANI_ARG_WALK
Standing on the cliff and walking.
void holdSound(ulong soundID, bool)
@ 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_R
Touching a background object on the right.
@ BGC_FOOT
Colliding with the foot sensor.
@ BGC_ON_WATER_MOVE
On water by being mini or sliding with the penguin suit.
@ 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.
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 startJump(AnmBlend_e blendMode, int jumpType)
mEf::levelEffect_c mSlipSmokeEffect
Smoke when sliding down a slope or into a cannon.
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.
virtual void startPlayerVoice(int, int)
fBaseID_e mRelatedActorID
Actor that is eating the player, or the door actor.
virtual int doDelete()
do method for the delete operation.
static sFStateVirtualID_c< daPlBase_c > StateID_Swim
Swimming. Argument: See SwimArg_e.
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.
void calcSpeedOnIceLift()
int mAirWalkTimer
Timer to wait before changing to the falling state after walking off a ledge.
float mKaniHeight
The height of the last cliff the player interacted with.
int mDemoStateArg
To be used as an argument to the new demo state.
mEf::levelEffect_c mSmokeEffect
static sFStateVirtualID_c< daPlBase_c > StateID_DemoNone
Default demo state, checking for pipe entry. Argument: Whether to not force execution start (bool).
void getTurnPower(sTurnPowerData &)
int mTimer_ce8
[Related to balloon break jump]
const daPlBase_c * mpNoHitPlayer
The player that cannot collide with this player.
@ STATUS_KANI_HANG
The player is hanging from a cliff.
@ STATUS_THROW
The player is throwing something.
@ 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_CAN_WATER_SLIDE
The player can slide on water because of the penguin suit.
@ 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_PENGUIN_SLIDE_JUMP
The player is doing a penguin slide jump.
@ STATUS_KANI_WALK
The player is doing a crab walk on a cliff.
@ STATUS_HANG
The player is hanging from a ceiling rope.
@ 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_KANI_HANG_ANIMATION
The player is animating into the hanging pose on a cliff.
@ STATUS_INITIAL_SLIDE
The player is in an initial slide action. [Used in 6-6 to slide all the way down automatically].
@ STATUS_PROPEL
The player is flying with the propeller suit.
@ STATUS_QUAKE_SMALL
A small quake that makes the player do a hop was triggered.
@ STATUS_ALL_DOWN_FADE
All players have died and the screen is transitioning.
@ 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_CANNON_JUMP
The player is flying out of a pipe cannon.
@ 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_PENGUIN_SLIDE
The player is sliding with the penguin suit.
@ STATUS_PENGUIN_RECOIL
The player is bouncing back after hitting an enemy that cannot be killed by a penguin slide.
@ STATUS_CREATED
The player was created.
@ STATUS_JUMP
The player is jumping.
@ STATUS_FOLLOW_MAME_KURIBO
Mini Goombas are attached to the player.
@ STATUS_YOSHI_DISMOUNT_JUMP
The player is doing a jump to dismount Yoshi.
@ STATUS_SPIN_HIP_ATTACK_FALL
The player is falling while doing a down spin.
@ STATUS_SIT_JUMP
The player is doing a sitting jump.
@ STATUS_8E
[Cannon shot related]
@ STATUS_PROPEL_SLOW_FALL
The player will fall slowly while spinning down with the propeller suit.
@ STATUS_CAN_SPIN
The player can shake the controller to do a spin jump or a propeller spin.
@ STATUS_STAR_JUMP
The player is jumping while in star mode.
@ 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_FIREBALL_PREPARE_SHOOT
The player is about to shoot a fireball.
@ STATUS_CAN_WATER_WALK
The player can walk on water because of the mini mushroom.
@ STATUS_CAN_PENGUIN_SLIDE
If the player can start sliding as a penguin.
@ 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_KANI_JUMP
The player is doing a crab jump on a cliff.
@ 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_STUNNED
Stunned by electric shock or ice.
@ STATUS_CAN_LAND
The player can land on Yoshi or another player.
@ 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_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_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_ON_WATER_MOVE
The player is on water by being mini or sliding with the penguin suit.
@ STATUS_PROPEL_UP
The player is flying upwards with the propeller suit.
@ STATUS_JUMP_COUNT_INCREASED
The jump combo counter was incremented this frame.
@ STATUS_NO_ANIM
Don't play any animations.
@ STATUS_39
[Swim related]
void * mStateArg
To be used as an argument to the new state.
static sFStateVirtualID_c< daPlBase_c > StateID_Slip
Sliding down a slope. Argument: None.
int mSubstateValue
States can use this field for various purposes - as a timer, boolean flag, etc.
SwimArg_e
Arguments for transitioning to the swim state.
@ SWIM_ARG_FIREBALL
Player was about to shoot a fireball, shoot it while in water.
@ SWIM_ARG_ENTERING
Just entered the water.
@ SWIM_ARG_INITIAL
Already in water at the start of the swim action.
@ SWIM_ARG_CLIFF_HANG
Falling from a cliff into water.
virtual void postExecute(fBase_c::MAIN_STATE_e status)
post method for the execute operation.
static sFStateVirtualID_c< daPlBase_c > StateID_None
Default state, does nothing. Argument: None.
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.
@ CROUCH_ARG_FROM_WALK
Crouching while already on the ground.
@ CROUCH_ARG_FROM_SIT_JUMP
Landing from a crouch jump.
@ CROUCH_ARG_FROM_OTHER
Crouching after a slide or a ground pound.
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_VINE_TOUCH_FULL
Fully touching a vine / mesh net / rock wall.
@ BGC_VINE_TOUCH_U
Touching a vine / mesh net / rock wall on the top.
@ BGC_LIFT
[Figure out a better name for this].
@ BGC_VINE_TOUCH_L
Touching a vine / mesh net / rock wall on the left.
@ BGC_VINE_TOUCH_D
Touching a vine / mesh net / rock wall on the bottom.
@ BGC_VINE_TOUCH
Touching a vine / mesh net / rock wall on any side.
static bool fn_8005f570(PLAYER_POWERUP_e, int)
bool fn_8014eb70(dAcPy_c *player, int)
bool fn_8014f030(dAcPy_c *player)
MAIN_STATE_e
The possible operation results.
@ SUCCESS
The operation was completed successfully.
void deleteRequest()
Requests deletion of the base.
@ ACTOR
The base is an actor.
ProfileName mProfName
The base's profile name.
@ SUCCEEDED
The step was completed successfully.
fBaseID_e mUniqueID
The base's unique identifier.
static fBase_c * searchBaseByGroupType(unsigned char groupType, const fBase_c *parent)
Searches for a base with a given group type, optionally under a given parent.
static fBase_c * searchBaseByID(fBaseID_e id)
Searches for a base with the given ID.
mAng y
The rotation on the Y axis.
mAng x
The rotation on the X axis.
@ 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.
void XrotM(mAng angle)
Rotates the matrix on the X axis by the given angle.
void YrotM(mAng angle)
Rotates the matrix on the Y axis by the given angle.
A three-dimensional floating point vector.
static const T::GlobalData_t mData
PLAYER_POWERUP_e
The identifiers for each powerup.
@ CREATE_ITEM_BUBBLE
Spawns the player inside a bubble.
@ CREATE_ITEM_YOSHI
Spawns a Yoshi along with the player.
@ CREATE_ITEM_STAR_POWER
Gives the player Star Power.
@ BASE_ID_NULL
Represents the null base.
#define ACTOR_PROFILE(profName, className, properties)
Creates an actor profile, using the profile number as the execute and draw order value.
s16 atan2s(float sin, float cos)
Converts a sine and a cosine to an angle in units.
void showFukidashi(int playerId, int fukidashiAction)
Displays the given action prompt to the given player.
void hideFukidashiTemporarily(int playerId, int fukidashiAction, int param3)
Temporarily hides the given action prompt for the given player.
void hideFukidashiForSession(int playerId, int fukidashiAction)
Hides the given action prompt for the given player for the rest of the current session.
void FUN_800b37b0(int playerId, int fukidashiAction)
T calcTimer(T *value)
Decrements a timer value.
float addCalc(float *value, float target, float smoothing, float maxStep, float minStep)
Smoothly moves value towards target using proportional scaling.
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_DEFINE(class, name)
Defines a state.
#define STATE_VIRTUAL_DEFINE(class, name)
Defines a virtual state.
A one-dimensional short angle vector.
float sin() const
Computes the sine of the angle.
A structure that contains information about a collider.
u8 mKind
The type of this collider. See CC_KIND_e.
u8 mAttack
The attack type of this collider. See CC_ATTACK_e.
sCcDatNew mBase
Base collider data.
mVec2_POD_c mOffset
The offset of the collider.