diff --git a/include/d/a/d_a_alink.h b/include/d/a/d_a_alink.h index 1ca2dabef2e..7f2405565ca 100644 --- a/include/d/a/d_a_alink.h +++ b/include/d/a/d_a_alink.h @@ -2212,13 +2212,13 @@ public: /* 800F9ABC */ int procCrawlAutoMove(); /* 800F9D7C */ int procCrawlEndInit(int, s16, s16); /* 800F9F30 */ int procCrawlEnd(); - /* 800F9FDC */ void getHangMoveAnmSpeed(); - /* 800F9FFC */ void getHangDirectionFromAngle(); + /* 800F9FDC */ f32 getHangMoveAnmSpeed(); + /* 800F9FFC */ int getHangDirectionFromAngle(); /* 800FA070 */ BOOL hangMoveBgCheck(s16, cXyz*); - /* 800FA338 */ void changeHangMoveProc(int); - /* 800FA5C8 */ void checkHangFootWall(); + /* 800FA338 */ BOOL changeHangMoveProc(int); + /* 800FA5C8 */ bool checkHangFootWall(); /* 800FA6E4 */ void setHangGroundY(); - /* 800FA78C */ void changeHangEndProc(); + /* 800FA78C */ int changeHangEndProc(); /* 800FA85C */ void checkHangStartSideWall(s16); /* 800FAA7C */ int procHangStartInit(); /* 800FAE14 */ int procHangStart(); @@ -2243,14 +2243,14 @@ public: /* 800FC748 */ void setBossBodyHangPos(); /* 800FC77C */ int procBossBodyHangInit(fopAc_ac_c*); /* 800FC870 */ int procBossBodyHang(); - /* 800FCF58 */ void getLadderUnitCount() const; - /* 800FCF84 */ void setLadderInit(); + /* 800FCF58 */ int getLadderUnitCount() const; + /* 800FCF84 */ int setLadderInit(); /* 800FD048 */ void setLadderPosInit(); /* 800FD1F0 */ void setLadderPos(int); - /* 800FD288 */ void getLadderMoveAnmSpeed(); + /* 800FD288 */ f32 getLadderMoveAnmSpeed(); /* 800FD2AC */ void changeLadderMoveProc(int); - /* 800FD4A8 */ void setMoveBGLadderCorrect(); - /* 800FD5E4 */ void checkLadderFall(); + /* 800FD4A8 */ int setMoveBGLadderCorrect(); + /* 800FD5E4 */ int checkLadderFall(); /* 800FD648 */ int procLadderUpStartInit(); /* 800FD7B0 */ int procLadderUpStart(); /* 800FD824 */ int procLadderUpEndInit(int); @@ -2261,17 +2261,17 @@ public: /* 800FDCCC */ int procLadderDownEnd(); /* 800FDD90 */ int procLadderMoveInit(int, int, cXyz*); /* 800FDF50 */ int procLadderMove(); - /* 800FE010 */ void getClimbMoveUpDownAnmSpeed(); - /* 800FE034 */ void getClimbMoveSideAnmSpeed(); - /* 800FE058 */ void checkClimbCode(cBgS_PolyInfo&); + /* 800FE010 */ f32 getClimbMoveUpDownAnmSpeed(); + /* 800FE034 */ f32 getClimbMoveSideAnmSpeed(); + /* 800FE058 */ BOOL checkClimbCode(cBgS_PolyInfo&); /* 800FE114 */ void setClimbInit(); /* 800FE174 */ void setClimbShapeOffset(); - /* 800FE3C4 */ void getClimbDirectionFromAngle(); + /* 800FE3C4 */ int getClimbDirectionFromAngle(); /* 800FE438 */ void changeClimbMoveProc(int); /* 800FE5A0 */ void checkClimbMoveUpDownProc(int); /* 800FE6E8 */ void checkClimbMoveSideProc(int); /* 800FE868 */ void setMoveBGClimbCorrect(); - /* 800FEB90 */ void checkBgCorrectClimbMove(cXyz*, cXyz*); + /* 800FEB90 */ int checkBgCorrectClimbMove(cXyz*, cXyz*); /* 800FEC70 */ void checkClimbRoof(f32); /* 800FED50 */ void checkClimbGround(cXyz*, f32); /* 800FEEC0 */ void checkBgClimbMove(int); @@ -2288,11 +2288,11 @@ public: /* 80100258 */ int procClimbWait(); /* 801003E4 */ int procClimbToRoofInit(); /* 80100464 */ int procClimbToRoof(); - /* 801005CC */ void getRoofHangFMoveAnmSpeed() const; - /* 801005F0 */ void getRoofHangSMoveAnmSpeed() const; + /* 801005CC */ f32 getRoofHangFMoveAnmSpeed() const; + /* 801005F0 */ f32 getRoofHangSMoveAnmSpeed() const; /* 80100614 */ void setRoofHangHandOnSE(cBgS_PolyInfo*); - /* 80100668 */ void checkRoofHangMovePos(); - /* 80100770 */ void commonRoofHangProc(); + /* 80100668 */ int checkRoofHangMovePos(); + /* 80100770 */ int commonRoofHangProc(); /* 801008EC */ void checkNextActionRoofHang(); /* 80100A10 */ int procRoofHangStartInit(cBgS_PolyInfo const&, cXyz const&, int); /* 80100AE4 */ int procRoofHangStart(); diff --git a/include/d/a/d_a_player.h b/include/d/a/d_a_player.h index 6ebfbd85265..b0c0d563087 100644 --- a/include/d/a/d_a_player.h +++ b/include/d/a/d_a_player.h @@ -270,6 +270,7 @@ public: FLG2_UNK_20000 = 0x20000, FLG2_SCN_CHG_START = 0x8000, FLG2_UNK_4000 = 0x4000, + FLG2_UNK_2000 = 0x2000, FLG2_UNK_1000 = 0x1000, FLG2_UNK_200 = 0x200, FLG2_UNK_80 = 0x80, @@ -289,6 +290,7 @@ public: FLG3_UNK_4000000 = 0x4000000, FLG3_UNK_2000000 = 0x2000000, FLG3_UNK_1000000 = 0x1000000, + FLG3_UNK_400000 = 0x400000, FLG3_UNK_100000 = 0x100000, FLG3_UNK_80000 = 0x80000, FLG3_COPY_ROD_THROW_AFTER = 0x40000, diff --git a/include/d/bg/d_bg_s.h b/include/d/bg/d_bg_s.h index 93680c27b9e..0335ebe8d71 100644 --- a/include/d/bg/d_bg_s.h +++ b/include/d/bg/d_bg_s.h @@ -111,5 +111,6 @@ bool dBgS_CheckBGroundPoly(cBgS_PolyInfo const&); bool dBgS_CheckBWallPoly(cBgS_PolyInfo const&); void dBgS_MoveBGProc_Typical(dBgW* param_0, void* param_1, cBgS_PolyInfo const& param_2, bool param_3, cXyz* param_4, csXyz* param_5, csXyz* param_6); +f32 dBgS_GetNY(cBgS_PolyInfo const& poly); #endif /* D_BG_D_BG_S_H */ diff --git a/src/d/a/d_a_alink_hang.inc b/src/d/a/d_a_alink_hang.inc index 72ce24aeeb5..986853edb21 100644 --- a/src/d/a/d_a_alink_hang.inc +++ b/src/d/a/d_a_alink_hang.inc @@ -1,23 +1,29 @@ +#include "d/a/d_a_alink.h" + /* 800F9FDC-800F9FFC 0F491C 0020+00 2/2 0/0 0/0 .text getHangMoveAnmSpeed__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getHangMoveAnmSpeed() { - nofralloc -#include "asm/d/a/d_a_alink/getHangMoveAnmSpeed__9daAlink_cFv.s" +f32 daAlink_c::getHangMoveAnmSpeed() { + return getAnmSpeedStickRate(daAlinkHIO_wallMove_c0::m.mMinAnmSpeed, + daAlinkHIO_wallMove_c0::m.mMaxAnmSpeed); } -#pragma pop /* 800F9FFC-800FA070 0F493C 0074+00 3/3 0/0 0/0 .text getHangDirectionFromAngle__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getHangDirectionFromAngle() { - nofralloc -#include "asm/d/a/d_a_alink/getHangDirectionFromAngle__9daAlink_cFv.s" +int daAlink_c::getHangDirectionFromAngle() { + s16 angle = field_0x2fe2 - shape_angle.y; + if (abs(angle) > 0x78E4) { + return DIR_BACKWARD; + } + + if (angle >= 0x071C) { + return DIR_LEFT; + } + + if (angle <= -0x071C) { + return DIR_RIGHT; + } + + return DIR_FORWARD; } -#pragma pop /* 800FA070-800FA338 0F49B0 02C8+00 2/2 0/0 0/0 .text hangMoveBgCheck__9daAlink_cFsP4cXyz */ @@ -34,7 +40,7 @@ asm BOOL daAlink_c::hangMoveBgCheck(s16 param_0, cXyz* param_1) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::changeHangMoveProc(int param_0) { +asm BOOL daAlink_c::changeHangMoveProc(int param_0) { nofralloc #include "asm/d/a/d_a_alink/changeHangMoveProc__9daAlink_cFi.s" } @@ -44,13 +50,26 @@ asm void daAlink_c::changeHangMoveProc(int param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkHangFootWall() { +asm bool daAlink_c::checkHangFootWall() { nofralloc #include "asm/d/a/d_a_alink/checkHangFootWall__9daAlink_cFv.s" } #pragma pop /* 800FA6E4-800FA78C 0F5024 00A8+00 10/10 0/0 0/0 .text setHangGroundY__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +void daAlink_c::setHangGroundY() { + cXyz pos; + mDoMtx_multVecZero(mpLinkModel->i_getAnmMtx(0), &pos); + + pos.x -= cM_ssin(shape_angle.y) * 15.0f; + pos.z -= cM_scos(shape_angle.y) * 15.0f; + + mLinkGndChk.SetPos(&pos); + field_0x33d8 = dComIfG_Bgsp().GroundCross(&mLinkGndChk); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -59,16 +78,28 @@ asm void daAlink_c::setHangGroundY() { #include "asm/d/a/d_a_alink/setHangGroundY__9daAlink_cFv.s" } #pragma pop +#endif /* 800FA78C-800FA85C 0F50CC 00D0+00 5/5 0/0 0/0 .text changeHangEndProc__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::changeHangEndProc() { - nofralloc -#include "asm/d/a/d_a_alink/changeHangEndProc__9daAlink_cFv.s" +int daAlink_c::changeHangEndProc() { + setHangGroundY(); + + if (current.pos.y < field_0x33d8 + daAlinkHIO_wallHang_c0::m.field_0x18 - lit_6040 && + (mProcID != PROC_HANG_FALL_START || !(mUnderFrameCtrl->getFrame() < lit_6109)) && + field_0x33d8 < current.pos.y - lit_7808) + { + return procLandInit(FLOAT_LABEL(lit_6108)); + } + + setDoStatus(0x33); + + if (doTrigger()) { + speed.y = FLOAT_LABEL(lit_6108); + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + return 0; } -#pragma pop /* 800FA85C-800FAA7C 0F519C 0220+00 3/3 0/0 0/0 .text checkHangStartSideWall__9daAlink_cFs */ #pragma push @@ -81,6 +112,62 @@ asm void daAlink_c::checkHangStartSideWall(s16 param_0) { #pragma pop /* 800FAA7C-800FAE14 0F53BC 0398+00 3/3 0/0 0/0 .text procHangStartInit__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangStartInit() { + cXyz sp2C = field_0x34ec - current.pos; + + if (sp2C.absXZ() > field_0x18B0[0].GetWallR() + 20.0f) { + return 0; + } + + cXyz sp38; + sp38.set(field_0x34ec.x - cM_ssin(field_0x306e) * 1.5f, field_0x34ec.y + 10.0f, + field_0x34ec.z - cM_scos(field_0x306e) * 1.5f); + mLinkGndChk.SetPos(&sp38); + + sp38.y = dComIfG_Bgsp().GroundCross(&mLinkGndChk); + + if (fabsf(sp38.y - field_0x34ec.y) > l_autoUpHeight) { + return 0; + } + + BOOL hang_ready = mProcID == PROC_HANG_READY; + commonProcInit(PROC_HANG_START); + current.pos = sp38; + i_offNoResetFlg2(FLG2_UNK_2000); + + if (checkHangFootWall()) { + if (!hang_ready && cM_rnd() < 0.7f) { + setSingleAnimeParam(ANM_CLIMB_HANG_MISS, &daAlinkHIO_ladder_c0::m.field_0x14); + field_0x3478 = daAlinkHIO_ladder_c0::m.field_0x14.mCheckFrame; + voiceStart(Z2SE_AL_V_FOOT_MISS); + } else { + setSingleAnimeParam(ANM_CLIMB_HANG, &daAlinkHIO_ladder_c0::m.field_0x0); + field_0x3478 = daAlinkHIO_ladder_c0::m.field_0x0.mCheckFrame; + voiceStart(Z2SE_AL_V_JUMP_HANG); + } + + field_0x2f92 = 0xFE; + field_0x2f93 = 0xFE; + } else { + setSingleAnimeParam(ANM_HANG_READY, &daAlinkHIO_wallCatch_c0::m.mGrabAAnm); + field_0x3478 = daAlinkHIO_wallCatch_c0::m.mGrabAAnm.mCheckFrame; + voiceStart(Z2SE_AL_V_JUMP_HANG); + } + + setBowHangAnime(); + shape_angle.y = field_0x306e - 0x8000; + current.angle.y = shape_angle.y; + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + mNormalSpeed = tmp_0; + speed.y = tmp_0; + dComIfGp_setPlayerStatus0(0, 0x100); + setHangGroundY(); + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -89,16 +176,26 @@ asm int daAlink_c::procHangStartInit() { #include "asm/d/a/d_a_alink/procHangStartInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FAE14-800FAECC 0F5754 00B8+00 1/0 0/0 0/0 .text procHangStart__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangStart() { - nofralloc -#include "asm/d/a/d_a_alink/procHangStart__9daAlink_cFv.s" +int daAlink_c::procHangStart() { + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (changeHangEndProc()) { + return 1; + } + + if (checkAnmEnd(frame_ctrl)) { + procHangWaitInit(); + } else if (frame_ctrl->getFrame() > field_0x3478 && checkInputOnR() && + getDirectionFromShapeAngle() == DIR_FORWARD) + { + procHangClimbInit(daAlinkHIO_wallCatch_c0::m.mClimbAnm.mStartFrame); + } + + return 1; } -#pragma pop /* 800FAECC-800FB1A4 0F580C 02D8+00 1/1 0/0 0/0 .text procHangFallStartInit__9daAlink_cFP8cM3dGPla */ @@ -112,26 +209,77 @@ asm int daAlink_c::procHangFallStartInit(cM3dGPla* param_0) { #pragma pop /* 800FB1A4-800FB2A0 0F5AE4 00FC+00 1/0 0/0 0/0 .text procHangFallStart__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangFallStart() { - nofralloc -#include "asm/d/a/d_a_alink/procHangFallStart__9daAlink_cFv.s" +int daAlink_c::procHangFallStart() { + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + BOOL bvar; + if (checkAnmEnd(frame_ctrl) || + frame_ctrl->getFrame() > daAlinkHIO_wallFall_c0::m.mOneHandGrabAnm.mCheckFrame) + { + bvar = true; + } else { + bvar = false; + } + + if (changeHangEndProc()) { + return 1; + } + + if (frame_ctrl->checkPass(lit_7808)) { + f32 tmp_0 = FLOAT_LABEL(lit_6108); + dComIfGp_getVibration().StartShock(1, 1, cXyz(tmp_0, lit_6040, tmp_0)); + } + + if (bvar) { + int hang_dir = getHangDirectionFromAngle(); + if (checkInputOnR() && hang_dir != DIR_BACKWARD) { + procHangUpInit(hang_dir); + } + } + + return 1; } -#pragma pop /* 800FB2A0-800FB328 0F5BE0 0088+00 1/1 0/0 0/0 .text procHangUpInit__9daAlink_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangUpInit(int param_0) { - nofralloc -#include "asm/d/a/d_a_alink/procHangUpInit__9daAlink_cFi.s" +int daAlink_c::procHangUpInit(int param_0) { + commonProcInit(PROC_HANG_UP); + setSingleAnimeParam(ANM_HANG_ONE_HAND_MOVE, &daAlinkHIO_wallFall_c0::m.mTwoHandGrabAnm); + dComIfGp_setPlayerStatus0(0, 0x100); + setBowHangAnime(); + field_0x3198 = param_0; + mNormalSpeed = FLOAT_LABEL(lit_6108); + setHangGroundY(); + + return 1; } -#pragma pop /* 800FB328-800FB43C 0F5C68 0114+00 1/0 0/0 0/0 .text procHangUp__9daAlink_cFv */ +// matches with literals +#ifdef NONMATCHING +int daAlink_c::procHangUp() { + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (changeHangEndProc()) { + if (mProcID == PROC_FALL) { + current.pos.x -= cM_ssin(shape_angle.y) * 8.0f; + current.pos.z -= cM_scos(shape_angle.y) * 8.0f; + } + return 1; + } else if (checkAnmEnd(frame_ctrl) || + frame_ctrl->getFrame() > daAlinkHIO_wallFall_c0::m.mTwoHandGrabAnm.mCheckFrame) + { + if (field_0x3198 == 0) { + procHangClimbInit(daAlinkHIO_wallCatch_c0::m.mClimbAnm.mStartFrame); + } else if (changeHangMoveProc(field_0x3198)) { + procHangMoveInit(field_0x3198); + } else { + procHangWaitInit(); + } + } + + return 1; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off @@ -140,6 +288,7 @@ asm int daAlink_c::procHangUp() { #include "asm/d/a/d_a_alink/procHangUp__9daAlink_cFv.s" } #pragma pop +#endif /* 800FB43C-800FB544 0F5D7C 0108+00 3/3 0/0 0/0 .text procHangWaitInit__9daAlink_cFv */ #pragma push @@ -213,45 +362,89 @@ asm int daAlink_c::procHangWallCatchInit() { #pragma pop /* 800FC0D8-800FC178 0F6A18 00A0+00 1/0 0/0 0/0 .text procHangWallCatch__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangWallCatch() { - nofralloc -#include "asm/d/a/d_a_alink/procHangWallCatch__9daAlink_cFv.s" +int daAlink_c::procHangWallCatch() { + setHangGroundY(); + + if (field_0x33d8 > field_0x3834.y - lit_6895) { + return procLandInit(FLOAT_LABEL(lit_6108)); + } + + if (checkAnmEnd(mUnderFrameCtrl) && + !procHangClimbInit(daAlinkHIO_wallCatch_c0::m.mClimbStartFrame)) + { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + return 1; } -#pragma pop /* 800FC178-800FC240 0F6AB8 00C8+00 4/4 0/0 0/0 .text procHangReadyInit__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangReadyInit() { - nofralloc -#include "asm/d/a/d_a_alink/procHangReadyInit__9daAlink_cFv.s" +int daAlink_c::procHangReadyInit() { + if (field_0x2f91 == 3 && mEquipItem != NO_ITEM) { + return procPreActionUnequipInit(0x5C, NULL); + } else if (mProcID == PROC_PREACTION_UNEQUIP) { + setFrontWallType(); + + if (field_0x2f91 != 3) { + return checkWaitAction(); + } + } + + commonProcInit(PROC_HANG_READY); + setSingleAnimeParam(ANM_CLIMB_JUMP, &daAlinkHIO_wallCatch_c0::m.mJumpAnm); + field_0x300c = field_0x306e + 0x8000; + field_0x3198 = field_0x2f91; + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + mNormalSpeed = tmp_0; + speed.y = tmp_0; + return 1; } -#pragma pop /* 800FC240-800FC2F4 0F6B80 00B4+00 1/0 0/0 0/0 .text procHangReady__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangReady() { - nofralloc -#include "asm/d/a/d_a_alink/procHangReady__9daAlink_cFv.s" +int daAlink_c::procHangReady() { + cLib_addCalcAngleS(&shape_angle.y, field_0x300c, 2, 0x1000, 0x400); + current.angle.y = shape_angle.y; + + if (checkAnmEnd(mUnderFrameCtrl)) { + shape_angle.y = field_0x300c; + current.angle.y = shape_angle.y; + + int hang_init; + if (field_0x3198 == 3) { + hang_init = procClimbUpStartInit(1); + } else if (field_0x3198 == 9) { + hang_init = procHangStartInit(); + } else { + hang_init = procHangWallCatchInit(); + } + + if (!hang_init) { + procWaitInit(); + } + } + + return 1; } -#pragma pop /* 800FC2F4-800FC390 0F6C34 009C+00 2/2 0/0 0/0 .text procHangLeverDownInit__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procHangLeverDownInit() { - nofralloc -#include "asm/d/a/d_a_alink/procHangLeverDownInit__9daAlink_cFv.s" +int daAlink_c::procHangLeverDownInit() { + if (mEquipItem != NO_ITEM) { + return procPreActionUnequipInit(0x5D, field_0x27f4); + } + + commonProcInit(PROC_HANG_LEVER_DOWN); + field_0x280c.setData(field_0x27f4); + setSingleAnimeParam(ANM_CLIMB_JUMP, &daAlinkHIO_wallCatch_c0::m.mJumpAnm); + field_0x300c = field_0x27f4->shape_angle.y + 0x8000; + field_0x3198 = 145; + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + speed.y = tmp_0; + mNormalSpeed = tmp_0; + return 1; } -#pragma pop /* 800FC390-800FC568 0F6CD0 01D8+00 1/0 0/0 0/0 .text procHangLeverDown__9daAlink_cFv */ #pragma push @@ -265,14 +458,11 @@ asm int daAlink_c::procHangLeverDown() { /* 800FC568-800FC5A4 0F6EA8 003C+00 1/0 0/0 0/0 .text changeDragonActor__9daAlink_cFP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::changeDragonActor(fopAc_ac_c* param_0) { - nofralloc -#include "asm/d/a/d_a_alink/changeDragonActor__9daAlink_cFP10fopAc_ac_c.s" +void daAlink_c::changeDragonActor(fopAc_ac_c* param_0) { + if (field_0x280c.getActor() != NULL && fopAcM_GetName(field_0x280c.getActor()) == PROC_B_DR) { + field_0x280c.setData(param_0); + } } -#pragma pop /* 800FC5A4-800FC6B4 0F6EE4 0110+00 1/1 0/0 0/0 .text setDragonHangPos__9daAlink_cFv */ #pragma push @@ -295,25 +485,49 @@ asm void daAlink_c::setOctaIealHangPos() { #pragma pop /* 800FC748-800FC77C 0F7088 0034+00 2/2 0/0 0/0 .text setBossBodyHangPos__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::setBossBodyHangPos() { - nofralloc -#include "asm/d/a/d_a_alink/setBossBodyHangPos__9daAlink_cFv.s" +void daAlink_c::setBossBodyHangPos() { + if (field_0x32cc != 0) { + setDragonHangPos(); + } else { + setOctaIealHangPos(); + } } -#pragma pop /* 800FC77C-800FC870 0F70BC 00F4+00 1/1 0/0 0/0 .text * procBossBodyHangInit__9daAlink_cFP10fopAc_ac_c */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procBossBodyHangInit(fopAc_ac_c* param_0) { - nofralloc -#include "asm/d/a/d_a_alink/procBossBodyHangInit__9daAlink_cFP10fopAc_ac_c.s" +int daAlink_c::procBossBodyHangInit(fopAc_ac_c* param_0) { + commonProcInit(PROC_BOSS_BODY_HANG); + + if (fopAcM_GetName(param_0) == PROC_B_DR) { + field_0x32cc = 1; + setSingleAnimeBase(ANM_DRAGON_HANG); + setJumpMode(); + } else { + field_0x32cc = 0; + setSingleAnimeBase(ANM_MORPHEEL_HANG_MISS); + } + + field_0x3198 = 0x169; + deleteEquipItem(TRUE, FALSE); + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + mNormalSpeed = tmp_0; + setSpecialGravity(tmp_0, mMaxFallSpeed, 0); + speed.y = FLOAT_LABEL(lit_6108); + + field_0x300c = 0; + field_0x300e = 0; + field_0x3010 = 0; + field_0x3008 = 0; + field_0x3012 = 0; + field_0x3080 = 0; + + field_0x280c.setData(param_0); + setBossBodyHangPos(); + + i_onEndResetFlg1(ERFLG1_GANON_FINISH); + return 1; } -#pragma pop /* 800FC870-800FCF58 0F71B0 06E8+00 1/0 0/0 0/0 .text procBossBodyHang__9daAlink_cFv */ #pragma push @@ -327,24 +541,41 @@ asm int daAlink_c::procBossBodyHang() { /* 800FCF58-800FCF84 0F7898 002C+00 2/2 0/0 0/0 .text getLadderUnitCount__9daAlink_cCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getLadderUnitCount() const { - nofralloc -#include "asm/d/a/d_a_alink/getLadderUnitCount__9daAlink_cCFv.s" +int daAlink_c::getLadderUnitCount() const { + return (current.pos.y - field_0x34ec.y) * lit_24600; } -#pragma pop /* 800FCF84-800FD048 0F78C4 00C4+00 1/1 0/0 0/0 .text setLadderInit__9daAlink_cFv */ +// loop issue +#ifdef NONMATCHING +int daAlink_c::setLadderInit() { + i_onNoResetFlg3(FLG3_UNK_400000); + + if (i_checkModeFlg(0x40000)) { + setLadderPos(getLadderUnitCount() - 2); + + while (mWaterY - current.pos.y > daAlinkHIO_swim_c0::m.mInitHeight) { + current.pos.y += lit_24618; + } + + procLadderMoveInit(1, 0, ¤t.pos); + field_0x33b0 = l_ladderAnmBaseTransY; + field_0x2060->initOldFrameMorf(lit_7808, 0, 35); + return 1; + } + + return procLadderUpStartInit(); +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::setLadderInit() { +asm int daAlink_c::setLadderInit() { nofralloc #include "asm/d/a/d_a_alink/setLadderInit__9daAlink_cFv.s" } #pragma pop +#endif /* 800FD048-800FD1F0 0F7988 01A8+00 1/1 0/0 0/0 .text setLadderPosInit__9daAlink_cFv */ #pragma push @@ -368,14 +599,10 @@ asm void daAlink_c::setLadderPos(int param_0) { /* 800FD288-800FD2AC 0F7BC8 0024+00 2/2 0/0 0/0 .text getLadderMoveAnmSpeed__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getLadderMoveAnmSpeed() { - nofralloc -#include "asm/d/a/d_a_alink/getLadderMoveAnmSpeed__9daAlink_cFv.s" +f32 daAlink_c::getLadderMoveAnmSpeed() { + return getAnmSpeedStickRate(daAlinkHIO_ladder_c0::m.field_0x48, + daAlinkHIO_ladder_c0::m.field_0x4C); } -#pragma pop /* 800FD2AC-800FD4A8 0F7BEC 01FC+00 3/3 0/0 0/0 .text changeLadderMoveProc__9daAlink_cFi */ @@ -392,21 +619,23 @@ asm void daAlink_c::changeLadderMoveProc(int param_0) { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::setMoveBGLadderCorrect() { +asm int daAlink_c::setMoveBGLadderCorrect() { nofralloc #include "asm/d/a/d_a_alink/setMoveBGLadderCorrect__9daAlink_cFv.s" } #pragma pop /* 800FD5E4-800FD648 0F7F24 0064+00 8/8 0/0 0/0 .text checkLadderFall__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::checkLadderFall() { - nofralloc -#include "asm/d/a/d_a_alink/checkLadderFall__9daAlink_cFv.s" +int daAlink_c::checkLadderFall() { + setDoStatus(0x33); + + if (doTrigger()) { + field_0x2f99 = 0; + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + return 0; } -#pragma pop /* 800FD648-800FD7B0 0F7F88 0168+00 2/2 0/0 0/0 .text procLadderUpStartInit__9daAlink_cFv */ @@ -420,35 +649,70 @@ asm int daAlink_c::procLadderUpStartInit() { #pragma pop /* 800FD7B0-800FD824 0F80F0 0074+00 1/0 0/0 0/0 .text procLadderUpStart__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderUpStart() { - nofralloc -#include "asm/d/a/d_a_alink/procLadderUpStart__9daAlink_cFv.s" +int daAlink_c::procLadderUpStart() { + if (setMoveBGLadderCorrect()) { + return 1; + } + + field_0x2f99 = 6; + + if (checkAnmEnd(mUnderFrameCtrl) && !checkLadderFall()) { + changeLadderMoveProc(1); + } + + return 1; } -#pragma pop /* 800FD824-800FD8E8 0F8164 00C4+00 2/2 0/0 0/0 .text procLadderUpEndInit__9daAlink_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderUpEndInit(int param_0) { - nofralloc -#include "asm/d/a/d_a_alink/procLadderUpEndInit__9daAlink_cFi.s" +int daAlink_c::procLadderUpEndInit(int param_0) { + commonProcInit(PROC_LADDER_UP_END); + + daAlink_ANM anm_id = param_0 != 0 ? ANM_LADDER_UP_END_LEFT : ANM_LADDER_UP_END_RIGHT; + setSingleAnimeBaseSpeed(anm_id, daAlinkHIO_ladder_c0::m.field_0x30, + daAlinkHIO_ladder_c0::m.field_0x34); + field_0x2f99 = 14; + setSpecialGravity(FLOAT_LABEL(lit_6108), mMaxFallSpeed, 0); + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + speed.y = tmp_0; + mNormalSpeed = tmp_0; + speedF = tmp_0; + + field_0x30a0 = -0x0800; + field_0x33f4 = lit_6041; + field_0x300c = 1; + field_0x3010 = 1; + dComIfGp_setPlayerStatus0(0, 0x2000000); + return 1; } -#pragma pop /* 800FD8E8-800FD9CC 0F8228 00E4+00 1/0 0/0 0/0 .text procLadderUpEnd__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderUpEnd() { - nofralloc -#include "asm/d/a/d_a_alink/procLadderUpEnd__9daAlink_cFv.s" +int daAlink_c::procLadderUpEnd() { + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (setMoveBGLadderCorrect()) { + return 1; + } + + if (checkAnmEnd(frame_ctrl)) { + checkNextAction(0); + } else if (!(frame_ctrl->getFrame() > daAlinkHIO_ladder_c0::m.field_0x58) || + !checkNextAction(1)) + { + if (frame_ctrl->getFrame() >= lit_15341) { + field_0x300c = 0; + field_0x3010 = 0; + } else if (frame_ctrl->getFrame() >= lit_17382) { + field_0x30a0 = 0; + field_0x33f4 = FLOAT_LABEL(lit_6108); + } + + field_0x2f99 = 6; + } + + return 1; } -#pragma pop /* 800FD9CC-800FDB74 0F830C 01A8+00 2/2 0/0 0/0 .text procLadderDownStartInit__9daAlink_cFv */ #pragma push @@ -462,35 +726,68 @@ asm int daAlink_c::procLadderDownStartInit() { /* 800FDB74-800FDC18 0F84B4 00A4+00 1/0 0/0 0/0 .text procLadderDownStart__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderDownStart() { - nofralloc -#include "asm/d/a/d_a_alink/procLadderDownStart__9daAlink_cFv.s" +int daAlink_c::procLadderDownStart() { + if (setMoveBGLadderCorrect()) { + return 1; + } + + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + field_0x2f99 = 6; + + if (checkAnmEnd(frame_ctrl)) { + if (!checkLadderFall()) { + changeLadderMoveProc(0); + } + } else if (frame_ctrl->getFrame() >= lit_10286) { + field_0x300c = 1; + field_0x3010 = 1; + } + + return 1; } -#pragma pop /* 800FDC18-800FDCCC 0F8558 00B4+00 1/1 0/0 0/0 .text procLadderDownEndInit__9daAlink_cFi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderDownEndInit(int param_0) { - nofralloc -#include "asm/d/a/d_a_alink/procLadderDownEndInit__9daAlink_cFi.s" +int daAlink_c::procLadderDownEndInit(int param_0) { + commonProcInit(PROC_LADDER_DOWN_END); + + daAlink_ANM anm_id = param_0 != 0 ? ANM_LADDER_DOWN_END_LEFT : ANM_LADDER_DOWN_END_RIGHT; + setSingleAnimeBaseSpeed(anm_id, daAlinkHIO_ladder_c0::m.field_0x40, + daAlinkHIO_ladder_c0::m.field_0x44); + field_0x2f99 = 14; + setSpecialGravity(FLOAT_LABEL(lit_6108), mMaxFallSpeed, 0); + + field_0x30a0 = 0x2800; + field_0x33f4 = lit_6040; + field_0x300c = 0; + field_0x3010 = 0; + dComIfGp_setPlayerStatus0(0, 0x2000000); + return 1; } -#pragma pop /* 800FDCCC-800FDD90 0F860C 00C4+00 1/0 0/0 0/0 .text procLadderDownEnd__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderDownEnd() { - nofralloc -#include "asm/d/a/d_a_alink/procLadderDownEnd__9daAlink_cFv.s" +int daAlink_c::procLadderDownEnd() { + if (setMoveBGLadderCorrect()) { + return 1; + } + + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (checkAnmEnd(frame_ctrl)) { + checkNextAction(0); + } else if (!(frame_ctrl->getFrame() > daAlinkHIO_ladder_c0::m.field_0x54) || + !checkNextAction(1)) + { + if (frame_ctrl->getFrame() >= lit_17382) { + field_0x30a0 = 0; + field_0x33f4 = FLOAT_LABEL(lit_6108); + } + + field_0x2f99 = 6; + } + + return 1; } -#pragma pop /* 800FDD90-800FDF50 0F86D0 01C0+00 3/3 0/0 0/0 .text procLadderMoveInit__9daAlink_cFiiP4cXyz */ #pragma push @@ -503,55 +800,64 @@ asm int daAlink_c::procLadderMoveInit(int param_0, int param_1, cXyz* param_2) { #pragma pop /* 800FDF50-800FE010 0F8890 00C0+00 1/0 0/0 0/0 .text procLadderMove__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procLadderMove() { - nofralloc -#include "asm/d/a/d_a_alink/procLadderMove__9daAlink_cFv.s" +int daAlink_c::procLadderMove() { + if (setMoveBGLadderCorrect()) { + return 1; + } + + field_0x2f99 = 6; + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (!checkLadderFall()) { + if (checkAnmEnd(frame_ctrl)) { + changeLadderMoveProc(field_0x3198); + } else if (frame_ctrl->getRate() != FLOAT_LABEL(lit_6108)) { + f32 anm_speed = getLadderMoveAnmSpeed(); + if (frame_ctrl->getRate() < FLOAT_LABEL(lit_6108)) { + anm_speed *= lit_6041; + } + + setWaterInAnmRate(frame_ctrl, anm_speed); + } + } + + return 1; } -#pragma pop /* 800FE010-800FE034 0F8950 0024+00 3/3 0/0 0/0 .text getClimbMoveUpDownAnmSpeed__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getClimbMoveUpDownAnmSpeed() { - nofralloc -#include "asm/d/a/d_a_alink/getClimbMoveUpDownAnmSpeed__9daAlink_cFv.s" +f32 daAlink_c::getClimbMoveUpDownAnmSpeed() { + return getAnmSpeedStickRate(daAlinkHIO_ladder_c0::m.field_0x64, + daAlinkHIO_ladder_c0::m.field_0x68); } -#pragma pop /* 800FE034-800FE058 0F8974 0024+00 4/4 0/0 0/0 .text getClimbMoveSideAnmSpeed__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getClimbMoveSideAnmSpeed() { - nofralloc -#include "asm/d/a/d_a_alink/getClimbMoveSideAnmSpeed__9daAlink_cFv.s" +f32 daAlink_c::getClimbMoveSideAnmSpeed() { + return getAnmSpeedStickRate(daAlinkHIO_ladder_c0::m.field_0x5C, + daAlinkHIO_ladder_c0::m.field_0x60); } -#pragma pop /* 800FE058-800FE114 0F8998 00BC+00 9/9 0/0 0/0 .text checkClimbCode__9daAlink_cFR13cBgS_PolyInfo */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::checkClimbCode(cBgS_PolyInfo& param_0) { - nofralloc -#include "asm/d/a/d_a_alink/checkClimbCode__9daAlink_cFR13cBgS_PolyInfo.s" +BOOL daAlink_c::checkClimbCode(cBgS_PolyInfo& i_poly) { + dBgW_Base* bgw_p = dComIfG_Bgsp().GetBgWBasePointer(i_poly); + + return ((dComIfG_Bgsp().GetWallCode(i_poly) == 1 && fabsf(dBgS_GetNY(i_poly)) <= lit_6021) && + bgw_p != NULL) && + bgw_p->ChkPushPullOk(); } -#pragma pop /* 800FE114-800FE174 0F8A54 0060+00 1/1 0/0 0/0 .text setClimbInit__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::setClimbInit() { - nofralloc -#include "asm/d/a/d_a_alink/setClimbInit__9daAlink_cFv.s" +void daAlink_c::setClimbInit() { + i_onNoResetFlg3(FLG3_UNK_400000); + + if (i_checkModeFlg(0x40000)) { + shape_angle.y = field_0x306e + 0x8000; + current.pos.y -= lit_23595; + setClimbStartNotGround(); + } else { + procHangReadyInit(); + } } -#pragma pop /* 800FE174-800FE3C4 0F8AB4 0250+00 8/8 0/0 0/0 .text setClimbShapeOffset__9daAlink_cFv */ @@ -565,14 +871,22 @@ asm void daAlink_c::setClimbShapeOffset() { #pragma pop /* 800FE3C4-800FE438 0F8D04 0074+00 1/1 0/0 0/0 .text getClimbDirectionFromAngle__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getClimbDirectionFromAngle() { - nofralloc -#include "asm/d/a/d_a_alink/getClimbDirectionFromAngle__9daAlink_cFv.s" +int daAlink_c::getClimbDirectionFromAngle() { + s16 angle = field_0x2fe2 - shape_angle.y; + if (abs(angle) > 0x7000) { + return DIR_BACKWARD; + } + + if (angle >= 0x1000) { + return DIR_LEFT; + } + + if (angle <= -0x1000) { + return DIR_RIGHT; + } + + return DIR_FORWARD; } -#pragma pop /* 800FE438-800FE5A0 0F8D78 0168+00 3/3 0/0 0/0 .text changeClimbMoveProc__9daAlink_cFi */ @@ -618,14 +932,33 @@ asm void daAlink_c::setMoveBGClimbCorrect() { /* 800FEB90-800FEC70 0F94D0 00E0+00 1/1 0/0 0/0 .text * checkBgCorrectClimbMove__9daAlink_cFP4cXyzP4cXyz */ +// matches with cM3dGPla vtable in the correct spot +#ifdef NONMATCHING +int daAlink_c::checkBgCorrectClimbMove(cXyz* i_startPos, cXyz* i_endPos) { + if (commonLineCheck(i_startPos, i_endPos)) { + cM3dGPla tri_plane; + dComIfG_Bgsp().GetTriPla(mLinkLinChk, &tri_plane); + + if (cLib_distanceAngleS(tri_plane.mNormal.atan2sX_Z(), shape_angle.y) < 0x549F || + (i_checkModeFlg(0x10000) && !checkClimbCode(mLinkLinChk))) + { + current.pos += mLinkLinChk.i_GetCross() - *i_endPos; + return 1; + } + } + + return 0; +} +#else #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkBgCorrectClimbMove(cXyz* param_0, cXyz* param_1) { +asm int daAlink_c::checkBgCorrectClimbMove(cXyz* param_0, cXyz* param_1) { nofralloc #include "asm/d/a/d_a_alink/checkBgCorrectClimbMove__9daAlink_cFP4cXyzP4cXyz.s" } #pragma pop +#endif /* 800FEC70-800FED50 0F95B0 00E0+00 2/2 0/0 0/0 .text checkClimbRoof__9daAlink_cFf */ #pragma push @@ -772,14 +1105,19 @@ asm int daAlink_c::procClimbWait() { /* 801003E4-80100464 0FAD24 0080+00 2/2 0/0 0/0 .text procClimbToRoofInit__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procClimbToRoofInit() { - nofralloc -#include "asm/d/a/d_a_alink/procClimbToRoofInit__9daAlink_cFv.s" +int daAlink_c::procClimbToRoofInit() { + commonProcInit(PROC_CLIMB_TO_ROOF); + setSingleAnimeBase(ANM_ROOF_UP); + setSpecialGravity(FLOAT_LABEL(lit_6108), mMaxFallSpeed, 0); + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + speed.y = tmp_0; + mNormalSpeed = tmp_0; + speedF = tmp_0; + field_0x2f99 = 10; + dComIfGp_setPlayerStatus0(0, 8); + return 1; } -#pragma pop /* 80100464-801005CC 0FADA4 0168+00 1/0 0/0 0/0 .text procClimbToRoof__9daAlink_cFv */ #pragma push @@ -792,42 +1130,33 @@ asm int daAlink_c::procClimbToRoof() { #pragma pop /* 801005CC-801005F0 0FAF0C 0024+00 2/2 0/0 0/0 .text getRoofHangFMoveAnmSpeed__9daAlink_cCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getRoofHangFMoveAnmSpeed() const { - nofralloc -#include "asm/d/a/d_a_alink/getRoofHangFMoveAnmSpeed__9daAlink_cCFv.s" +f32 daAlink_c::getRoofHangFMoveAnmSpeed() const { + return getAnmSpeedStickRate(daAlinkHIO_roofHang_c0::m.field_0x24, + daAlinkHIO_roofHang_c0::m.field_0x28); } -#pragma pop /* 801005F0-80100614 0FAF30 0024+00 2/2 0/0 0/0 .text getRoofHangSMoveAnmSpeed__9daAlink_cCFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::getRoofHangSMoveAnmSpeed() const { - nofralloc -#include "asm/d/a/d_a_alink/getRoofHangSMoveAnmSpeed__9daAlink_cCFv.s" +f32 daAlink_c::getRoofHangSMoveAnmSpeed() const { + return getAnmSpeedStickRate(daAlinkHIO_roofHang_c0::m.field_0x38, + daAlinkHIO_roofHang_c0::m.field_0x3C); } -#pragma pop /* 80100614-80100668 0FAF54 0054+00 3/3 0/0 0/0 .text * setRoofHangHandOnSE__9daAlink_cFP13cBgS_PolyInfo */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm void daAlink_c::setRoofHangHandOnSE(cBgS_PolyInfo* param_0) { - nofralloc -#include "asm/d/a/d_a_alink/setRoofHangHandOnSE__9daAlink_cFP13cBgS_PolyInfo.s" +void daAlink_c::setRoofHangHandOnSE(cBgS_PolyInfo* unused) { + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (!frame_ctrl->checkPass(field_0x3478)) { + frame_ctrl->checkPass(field_0x347c); + } } -#pragma pop /* 80100668-80100770 0FAFA8 0108+00 3/3 0/0 0/0 .text checkRoofHangMovePos__9daAlink_cFv */ #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::checkRoofHangMovePos() { +asm int daAlink_c::checkRoofHangMovePos() { nofralloc #include "asm/d/a/d_a_alink/checkRoofHangMovePos__9daAlink_cFv.s" } @@ -837,7 +1166,7 @@ asm void daAlink_c::checkRoofHangMovePos() { #pragma push #pragma optimization_level 0 #pragma optimizewithasm off -asm void daAlink_c::commonRoofHangProc() { +asm int daAlink_c::commonRoofHangProc() { nofralloc #include "asm/d/a/d_a_alink/commonRoofHangProc__9daAlink_cFv.s" } @@ -855,25 +1184,50 @@ asm void daAlink_c::checkNextActionRoofHang() { /* 80100A10-80100AE4 0FB350 00D4+00 2/2 0/0 0/0 .text * procRoofHangStartInit__9daAlink_cFRC13cBgS_PolyInfoRC4cXyzi */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofHangStartInit(cBgS_PolyInfo const& param_0, cXyz const& param_1, - int param_2) { - nofralloc -#include "asm/d/a/d_a_alink/procRoofHangStartInit__9daAlink_cFRC13cBgS_PolyInfoRC4cXyzi.s" +int daAlink_c::procRoofHangStartInit(cBgS_PolyInfo const& param_0, cXyz const& param_1, + int param_2) { + commonProcInit(PROC_ROOF_HANG_START); + setSingleAnimeParam(ANM_ROOF_HANG, &daAlinkHIO_roofHang_c0::m.field_0x0); + mPolyInfo2.SetPolyInfo(param_0); + + current.pos = param_1; + current.pos.y -= lit_25916; + field_0x2f98 = 4; + + deleteEquipItem(TRUE, FALSE); + setSpecialGravity(FLOAT_LABEL(lit_6108), mMaxFallSpeed, 0); + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + mNormalSpeed = tmp_0; + speed.y = tmp_0; + field_0x2f99 = 0x50; + field_0x3008 = param_2; + return 1; } -#pragma pop /* 80100AE4-80100BB4 0FB424 00D0+00 1/0 0/0 0/0 .text procRoofHangStart__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofHangStart() { - nofralloc -#include "asm/d/a/d_a_alink/procRoofHangStart__9daAlink_cFv.s" +int daAlink_c::procRoofHangStart() { + if (commonRoofHangProc()) { + return 1; + } + + if (field_0x33a8 < lit_13700) { + field_0x3008 = 0; + } + + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + if (field_0x3008 == 0 && + (checkAnmEnd(frame_ctrl) || + (checkInputOnR() && + frame_ctrl->getFrame() > daAlinkHIO_roofHang_c0::m.field_0x0.mCheckFrame))) + { + checkNextActionRoofHang(); + } else if (checkAnmEnd(frame_ctrl)) { + procRoofHangWaitInit(1); + } + + return 1; } -#pragma pop /* 80100BB4-80100D38 0FB4F4 0184+00 4/4 0/0 0/0 .text procRoofHangWaitInit__9daAlink_cFi */ @@ -887,14 +1241,21 @@ asm int daAlink_c::procRoofHangWaitInit(int param_0) { #pragma pop /* 80100D38-80100DA4 0FB678 006C+00 1/0 0/0 0/0 .text procRoofHangWait__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofHangWait() { - nofralloc -#include "asm/d/a/d_a_alink/procRoofHangWait__9daAlink_cFv.s" +int daAlink_c::procRoofHangWait() { + if (commonRoofHangProc()) { + return 1; + } + + if (field_0x33a8 < lit_13700) { + field_0x3008 = 0; + } + + if (field_0x3008 == 0) { + checkNextActionRoofHang(); + } + + return 1; } -#pragma pop /* 80100DA4-80100EEC 0FB6E4 0148+00 1/1 0/0 0/0 .text procRoofHangFrontMoveInit__9daAlink_cFv */ #pragma push @@ -918,25 +1279,56 @@ asm int daAlink_c::procRoofHangFrontMove() { #pragma pop /* 8010121C-80101308 0FBB5C 00EC+00 1/1 0/0 0/0 .text procRoofHangSideMoveInit__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofHangSideMoveInit() { - nofralloc -#include "asm/d/a/d_a_alink/procRoofHangSideMoveInit__9daAlink_cFv.s" +int daAlink_c::procRoofHangSideMoveInit() { + commonProcInit(PROC_ROOF_HANG_SIDE_MOVE); + + daAlink_ANM anm_id; + if (field_0x2f98 == 2) { + anm_id = ANM_ROOF_HANG_LEFT; + current.angle.y = shape_angle.y + 0x4000; + } else { + anm_id = ANM_ROOF_HANG_RIGHT; + current.angle.y = shape_angle.y + -0x4000; + } + + setSingleAnimeBaseSpeed(anm_id, getRoofHangSMoveAnmSpeed(), + daAlinkHIO_roofHang_c0::m.field_0x40); + setSpecialGravity(FLOAT_LABEL(lit_6108), mMaxFallSpeed, 0); + + f32 tmp_0 = FLOAT_LABEL(lit_6108); + mNormalSpeed = tmp_0; + speed.y = tmp_0; + field_0x3478 = lit_14954; + field_0x347c = lit_8784; + + field_0x3588 = l_waitBaseAnime; + dComIfGp_setPlayerStatus1(0, 0x100000); + return 1; } -#pragma pop /* 80101308-801013B8 0FBC48 00B0+00 1/0 0/0 0/0 .text procRoofHangSideMove__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofHangSideMove() { - nofralloc -#include "asm/d/a/d_a_alink/procRoofHangSideMove__9daAlink_cFv.s" +int daAlink_c::procRoofHangSideMove() { + if (commonRoofHangProc()) { + return 1; + } + + field_0x2f99 = 5; + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + + if (checkAnmEnd(frame_ctrl)) { + checkNextActionRoofHang(); + } else { + setWaterInAnmRate(frame_ctrl, getRoofHangSMoveAnmSpeed()); + setRoofHangHandOnSE(&mPolyInfo2); + + if (!checkRoofHangMovePos()) { + return procRoofHangWaitInit(0); + } + } + + return 1; } -#pragma pop /* 801013B8-80101534 0FBCF8 017C+00 1/1 0/0 0/0 .text procRoofHangTurnInit__9daAlink_cFv */ @@ -950,14 +1342,32 @@ asm int daAlink_c::procRoofHangTurnInit() { #pragma pop /* 80101534-8010163C 0FBE74 0108+00 1/0 0/0 0/0 .text procRoofHangTurn__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofHangTurn() { - nofralloc -#include "asm/d/a/d_a_alink/procRoofHangTurn__9daAlink_cFv.s" +int daAlink_c::procRoofHangTurn() { + if (commonRoofHangProc()) { + return 1; + } + + daPy_frameCtrl_c* frame_ctrl = mUnderFrameCtrl; + if (checkAnmEnd(frame_ctrl)) { + if (field_0x3008 == 0) { + shape_angle.y += 0x8000; + current.angle.y = shape_angle.y; + setOldRootQuaternion(0, -0x8000, 0); + field_0x2060->getOldFrameTransInfo(0)->mTranslate.z += lit_26297; + } + + checkNextActionRoofHang(); + } else { + if (frame_ctrl->getFrame() >= field_0x3478 && frame_ctrl->getFrame() <= field_0x347c) { + cLib_addCalcAngleS(&shape_angle.y, field_0x300c, 3, 0x200, 0x100); + current.angle.y = shape_angle.y; + } + + setRoofHangHandOnSE(&mPolyInfo2); + } + + return 1; } -#pragma pop /* 8010163C-801016AC 0FBF7C 0070+00 2/2 0/0 0/0 .text setRoofHangSwitch__9daAlink_cFv */ #pragma push @@ -981,14 +1391,27 @@ asm int daAlink_c::procRoofSwitchHangInit(fopAc_ac_c* param_0) { #pragma pop /* 801017AC-80101874 0FC0EC 00C8+00 1/0 0/0 0/0 .text procRoofSwitchHang__9daAlink_cFv */ -#pragma push -#pragma optimization_level 0 -#pragma optimizewithasm off -asm int daAlink_c::procRoofSwitchHang() { - nofralloc -#include "asm/d/a/d_a_alink/procRoofSwitchHang__9daAlink_cFv.s" +int daAlink_c::procRoofSwitchHang() { + if (field_0x280c.getActor() == NULL) { + return procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + + setRoofHangSwitch(); + + if (checkAnmEnd(mUnderFrameCtrl)) { + setSingleAnimeBaseSpeed(ANM_ROOF_HANG_WAIT, daAlinkHIO_roofHang_c0::m.field_0x1C, + daAlinkHIO_roofHang_c0::m.field_0x20); + field_0x300c = 1; + } else if (field_0x300c != 0) { + setDoStatus(0x33); + + if (doTrigger()) { + procFallInit(1, daAlinkHIO_autoJump_c0::m.mFallInterpolation); + } + } + + return 1; } -#pragma pop /* 80101874-80101890 0FC1B4 001C+00 2/2 0/0 0/0 .text getHangPos__13daObjSwHang_cFv */ #pragma push