From 70272b88f5e38ccc8b52d2cdaffaf597f4bdfc44 Mon Sep 17 00:00:00 2001 From: YunataSavior <58997725+YunataSavior@users.noreply.github.com> Date: Mon, 10 Nov 2025 19:52:59 -0800 Subject: [PATCH] npc_wrestler dbg work (#2795) --- include/d/actor/d_a_npc_bouS.h | 3 +- include/d/actor/d_a_npc_wrestler.h | 178 +++-- include/d/actor/d_a_tag_arena.h | 2 +- include/f_op/f_op_actor_mng.h | 4 + .../MSL/MSL_C/MSL_Common/Include/cmath.h | 5 + .../MSL/MSL_C/MSL_Common/Include/math.h | 1 + .../Math/Double_precision/w_pow.c | 7 +- src/d/actor/d_a_npc_chat.cpp | 6 +- src/d/actor/d_a_npc_wrestler.cpp | 721 ++++++++++++------ 9 files changed, 590 insertions(+), 337 deletions(-) diff --git a/include/d/actor/d_a_npc_bouS.h b/include/d/actor/d_a_npc_bouS.h index d1836db9ab5..eba7f50f595 100644 --- a/include/d/actor/d_a_npc_bouS.h +++ b/include/d/actor/d_a_npc_bouS.h @@ -131,8 +131,7 @@ public: } void setHome() { - current.pos = home.pos; - old.pos = current.pos; + old.pos = current.pos = home.pos; shape_angle.y = home.angle.y; } void offDispFlag() { mDispFlag = 0; } diff --git a/include/d/actor/d_a_npc_wrestler.h b/include/d/actor/d_a_npc_wrestler.h index d7e3116911f..a5e867545c8 100644 --- a/include/d/actor/d_a_npc_wrestler.h +++ b/include/d/actor/d_a_npc_wrestler.h @@ -16,16 +16,16 @@ struct daNpcWrestler_HIOParamSub { /* 0x00 */ f32 field_0x0; /* 0x04 */ f32 mWallH; /* 0x08 */ f32 mWallR; - /* 0x0C */ f32 field_0xc; // リアル影サイズ (Real Shadow Size) + /* 0x0C */ f32 real_shadow_size; // リアル影サイズ (Real Shadow Size) /* 0x10 */ f32 field_0x10; - /* 0x14 */ f32 field_0x14; // 見合う距離 (Right Distance) + /* 0x14 */ f32 reasonable_distance; // 見合う距離 (Right Distance) /* 0x18 */ f32 grapple_distance; // 組み合い距離 (Grapple Distance) - /* 0x1C */ f32 field_0x1c; // 再配置距離 (Reconfiguration Distance) + /* 0x1C */ f32 reconfig_distance; // 再配置距離 (Reconfiguration Distance) /* 0x20 */ s16 lateral_movement_time; // 横移動時間 (Lateral Movement Time) /* 0x22 */ s16 horizontal_movement_speed; // 横移動速度 (Horizontal Movement Speed) /* 0x24 */ s16 stagger_time; // ふらふら時間 (Stagger Time) /* 0x26 */ s16 wait_time; // 待ち時間 (Wait Time) - /* 0x28 */ s16 field_0x28; // 曲がり限界 (Bending Limit) + /* 0x28 */ s16 bending_limit; // 曲がり限界 (Bending Limit) /* 0x2C */ struct { f32 lateral_movement_chance; // 横移動 の確率 (Lateral Movement Chance) f32 hit_chance; // 張り手 の確率 (Hit Chance) @@ -39,16 +39,13 @@ struct daNpcWrestler_HIOParamSub { /* 0x6C */ s16 ai_action; // AI行動 (AI Action) /* 0x6E */ s16 ready_appearance_time; // Ready? 出現時間 (Ready? Appearance Time) /* 0x70 */ s16 fight_appearance_time; // Fight! 出現時間 (Fight! Appearance Time) - /* 0x72 */ s16 field_0x72; /* 0x74 */ s32 slap_hit_impact; // 張り手Hit衝撃 (Slap Hit Impact) /* 0x78 */ s16 rotation; // 回転割り (Rotating) - /* 0x7A */ s16 field_0x7a; /* 0x7C */ f32 camera_rotation_angle; // カメラ回転角 (Camera Rotation Angle) - /* 0x80 */ f32 field_0x80; // 音 土俵際距離 (Sound, Distance From Edge Of Ring) - /* 0x84 */ f32 field_0x84; // 動 土俵際距離 (Movement, Distance From Edge Of Ring) + /* 0x80 */ f32 ring_edge_sound; // 音 土俵際距離 (Sound, Distance From Edge Of Ring) + /* 0x84 */ f32 ring_edge_movement; // 動 土俵際距離 (Movement, Distance From Edge Of Ring) /* 0x88 */ f32 fade_speed; /* 0x8C */ s16 field_0x8c; - /* 0x8E */ s16 field_0x8e; /* 0x90 */ f32 field_0x90; /* 0x94 */ f32 field_0x94; /* 0x98 */ f32 field_0x98; @@ -58,7 +55,6 @@ struct daNpcWrestler_HIOParamSub { /* 0xA8 */ s16 field_0xa8; /* 0xAA */ s16 field_0xaa; /* 0xAC */ s16 field_0xac; - /* 0xAE */ s16 field_0xae; /* 0xB0 */ f32 field_0xb0; /* 0xB4 */ s16 field_0xb4; /* 0xB6 */ s16 field_0xb6; @@ -94,27 +90,24 @@ public: /* 0x04 */ daNpcWrestler_HIOParamSub* field_0x4; }; -class daNpcWrestler_HIO_c -#ifdef DEBUG -: public mDoHIO_entry_c -#endif -{ +class daNpcWrestler_HIO_c : public mDoHIO_entry_c { public: - daNpcWrestler_HIO_c() { - for (int i = 0; i < 2; i++) { - field_0x19c[i].setParam(&field_0x8.mTypeParams[i]); - } - } + daNpcWrestler_HIO_c(); virtual ~daNpcWrestler_HIO_c() {} + void listenPropertyEvent(const JORPropertyEvent*); void genMessage(JORMContext*); - void listenPropertyEvent(JORPropertyEvent*); - /* 0x004 */ u8 field_0x4[0x8 - 0x4]; - /* 0x008 */ daNpcWrestler_HIOParam field_0x8; + /* 0x008 */ daNpcWrestler_HIOParam m; /* 0x19C */ daNpcWrestler_HIO_Node_c field_0x19c[2]; }; +#if DEBUG +#define NPC_WRESTLER_HIO_CLASS daNpcWrestler_HIO_c +#else +#define NPC_WRESTLER_HIO_CLASS daNpcWrestler_Param_c +#endif + struct WrestlerParamList { daNpc_GetParam1* bck_list; daNpc_GetParam2* face_list; @@ -147,95 +140,94 @@ public: /* 80B30170 */ static int ctrlJointCallBack(J3DJoint*, int); /* 80B301BC */ bool checkStartUp(); /* 80B308B0 */ void reset(); - /* 80B30AD8 */ int setAction(actionFunc); + /* 80B30AD8 */ inline int setAction(actionFunc); /* 80B30BEC */ void checkArenaInfo(); /* 80B30CA4 */ bool checkArenaSub(fopAc_ac_c*); /* 80B30D48 */ void setOnToArena(f32); - /* 80B30F00 */ bool wait(void*); - /* 80B316F4 */ bool talk(void*); - /* 80B31EB0 */ bool demo(void*); - /* 80B32058 */ bool gotoArena(void*); - /* 80B32444 */ bool gotoLiving(void*); - /* 80B32850 */ bool sumouReady(void*); - /* 80B331CC */ bool sumouWait(void*); - /* 80B339EC */ bool checkOutOfArenaP(); - /* 80B33B3C */ bool setNextAction(); - /* 80B34654 */ bool sumouPunchHit(void*); - /* 80B34CD0 */ bool sumouPunchChaseHit(void*); - /* 80B35364 */ bool sumouPunchMiss(void*); - /* 80B35780 */ bool checkOutOfArenaW(); + /* 80B30F00 */ inline bool wait(void*); + /* 80B316F4 */ inline bool talk(void*); + /* 80B31EB0 */ inline bool demo(void*); + /* 80B32058 */ inline bool gotoArena(void*); + /* 80B32444 */ inline bool gotoLiving(void*); + /* 80B32850 */ inline bool sumouReady(void*); + /* 80B331CC */ inline bool sumouWait(void*); + /* 80B339EC */ inline bool checkOutOfArenaP(); + /* 80B33B3C */ inline bool setNextAction(); + /* 80B34654 */ inline bool sumouPunchHit(void*); + /* 80B34CD0 */ inline bool sumouPunchChaseHit(void*); + /* 80B35364 */ inline bool sumouPunchMiss(void*); + /* 80B35780 */ inline bool checkOutOfArenaW(); /* 80B358F0 */ cXyz getJointPos(int); - /* 80B35968 */ bool sumouPunchDraw(void*); - /* 80B3606C */ bool sumouTackleHit(void*); - /* 80B36908 */ bool sumouTackleMiss(void*); - /* 80B36C8C */ bool sumouTackleDraw(void*); - /* 80B37270 */ bool sumouSideStep(void*); - /* 80B378F4 */ bool sumouLostBalance(void*); - /* 80B37C30 */ bool sumouPunchShock(void*); - /* 80B37FB8 */ bool sumouPunchChaseShock(void*); - /* 80B38518 */ bool sumouPunchStagger(void*); - /* 80B389A4 */ bool sumouTackleShock(void*); - /* 80B38C90 */ bool sumouTackleStagger(void*); - /* 80B39334 */ bool sumouTackleStaggerRelease(void*); - /* 80B39554 */ bool sumouTacklePush(void*); - /* 80B39C18 */ bool sumouTackleRelease(void*); - /* 80B39F88 */ bool demoSumouReady(void*); - /* 80B3AE24 */ bool demoSumouWin(void*); - /* 80B3B4B4 */ bool demoSumouLose(void*); - /* 80B3BC84 */ bool demoSumouWin2(void*); - /* 80B3C278 */ bool demoSumouLose2(void*); - /* 80B3CA2C */ bool demoSumouUnilateralWin(void*); - /* 80B3D0C0 */ bool demoTalkAfterLose(void*); - /* 80B3D584 */ BOOL EvCut_grDSEntry(int); - /* 80B3DB50 */ BOOL EvCut_grDSEntry2(int); - /* 80B3DCE8 */ BOOL EvCut_grDSEntry3_4(int); - /* 80B3E0FC */ BOOL EvCut_grDSEntry5(int); - /* 80B3E584 */ BOOL EvCut_grDSLose(int); - /* 80B3EF10 */ void setWrestlerVoice(); - /* 80B3FCE8 */ void playMotion(); - /* 80B40B3C */ void lookat(); + /* 80B35968 */ inline bool sumouPunchDraw(void*); + /* 80B3606C */ inline bool sumouTackleHit(void*); + /* 80B36908 */ inline bool sumouTackleMiss(void*); + /* 80B36C8C */ inline bool sumouTackleDraw(void*); + /* 80B37270 */ inline bool sumouSideStep(void*); + /* 80B378F4 */ inline bool sumouLostBalance(void*); + /* 80B37C30 */ inline bool sumouPunchShock(void*); + /* 80B37FB8 */ inline bool sumouPunchChaseShock(void*); + /* 80B38518 */ inline bool sumouPunchStagger(void*); + /* 80B389A4 */ inline bool sumouTackleShock(void*); + /* 80B38C90 */ inline bool sumouTackleStagger(void*); + /* 80B39334 */ inline bool sumouTackleStaggerRelease(void*); + /* 80B39554 */ inline bool sumouTacklePush(void*); + /* 80B39C18 */ inline bool sumouTackleRelease(void*); + /* 80B39F88 */ inline bool demoSumouReady(void*); + /* 80B3AE24 */ inline bool demoSumouWin(void*); + /* 80B3B4B4 */ inline bool demoSumouLose(void*); + /* 80B3BC84 */ inline bool demoSumouWin2(void*); + /* 80B3C278 */ inline bool demoSumouLose2(void*); + /* 80B3CA2C */ inline bool demoSumouUnilateralWin(void*); + /* 80B3D0C0 */ inline bool demoTalkAfterLose(void*); + /* 80B3D584 */ inline BOOL EvCut_grDSEntry(int); + /* 80B3DB50 */ inline BOOL EvCut_grDSEntry2(int); + /* 80B3DCE8 */ inline BOOL EvCut_grDSEntry3_4(int); + /* 80B3E0FC */ inline BOOL EvCut_grDSEntry5(int); + /* 80B3E584 */ inline BOOL EvCut_grDSLose(int); + /* 80B3EF10 */ inline void setWrestlerVoice(); + /* 80B3FCE8 */ inline void playMotion(); + /* 80B40B3C */ inline void lookat(); /* 80B2F4A0 */ virtual ~daNpcWrestler_c(); - /* 80B3EAE4 */ void setParam(); - /* 80B3EB94 */ BOOL main(); - /* 80B404FC */ BOOL ctrlBtk(); + /* 80B3EAE4 */ inline void setParam(); + /* 80B3EB94 */ inline BOOL main(); + /* 80B404FC */ inline BOOL ctrlBtk(); /* 80B4166C */ void adjustShapeAngle() {} - /* 80B405E8 */ void setAttnPos(); - /* 80B3023C */ bool setExpressionAnm(int, bool); - /* 80B30654 */ bool setExpressionBtp(int); - /* 80B316C8 */ void setExpression(int, f32); - /* 80B3074C */ void setMotionAnm(int, f32); + /* 80B405E8 */ inline void setAttnPos(); + /* 80B3023C */ inline bool setExpressionAnm(int, bool); + /* 80B30654 */ inline bool setExpressionBtp(int); + /* 80B316C8 */ inline void setExpression(int, f32); + /* 80B3074C */ inline void setMotionAnm(int, f32); /* 80B31680 */ void setMotion(int, f32, int); - /* 80B40D1C */ BOOL drawDbgInfo(); - /* 80B40D24 */ void drawOtherMdls(); + /* 80B40D1C */ inline BOOL drawDbgInfo(); + /* 80B40D24 */ inline void drawOtherMdls(); s16 getMessageNo() { return (fopAcM_GetParam(this) >> 8) & 0xFFFF; } int getWrestlerAction() { return mWrestlerAction; } u8 getType() { return argument & 0x7F; } u8 getWrestlerType() { return getType(); } bool chkAction(actionFunc i_action) { return i_action == field_0xdcc; } - bool selectAction(); + inline bool selectAction(); s8 getArenaNo() { return (u8)fopAcM_GetParam(this); } u32 getStatusNo() { return fopAcM_GetParam(this) >> 24; } - void setLookMode(int); - BOOL chkFindPlayer(); - BOOL step(s16, int); - bool setTalkAngle(); - void setStepAngle(); - void setExpressionTalkAfter(); + inline void setLookMode(int); + inline BOOL chkFindPlayer(); + inline BOOL step(s16, int); + inline bool setTalkAngle(); + inline void setStepAngle(); + inline void setExpressionTalkAfter(); void initTalkAngle() { mTurnMode = 0; } - void setNextSumouEvent(int); - csXyz* fopAcM_GetHomeAngle_p(fopAc_ac_c* i_actor) { return &i_actor->home.angle; } - void setBackToLiving(); + inline void setNextSumouEvent(int); + inline void setBackToLiving(); void offWrestlerNoDraw() { mWrestlerNoDraw = 0; } void onWrestlerNoDraw() { mWrestlerNoDraw = 1; } - void initDemoCamera_ArenaSide(); - void sumouAI(); - s16 oppositeToPlayer(); - void correctGraspPosAngle(bool); - void initDemoCamera_ReadyLink(); - void initDemoCamera_ReadyWrestler(); - void playExpression(); + inline void initDemoCamera_ArenaSide(); + inline void sumouAI(); + inline s16 oppositeToPlayer(); + inline void correctGraspPosAngle(bool); + inline void initDemoCamera_ReadyLink(); + inline void initDemoCamera_ReadyWrestler(); + inline void playExpression(); static EventFn mEvtSeqList[7]; diff --git a/include/d/actor/d_a_tag_arena.h b/include/d/actor/d_a_tag_arena.h index bb2d1581852..fc7031d672a 100644 --- a/include/d/actor/d_a_tag_arena.h +++ b/include/d/actor/d_a_tag_arena.h @@ -13,7 +13,7 @@ public: cXyz getArenaPos() { return home.pos; } f32 getArenaExtent() { return scale.x * 100.0f; } s16 getArenaAngle() { return home.angle.y; } - u16 getArenaNo() { return fopAcM_GetParam(this) & 0xFF; } + s16 getArenaNo() { return fopAcM_GetParam(this) & 0xFF; } }; #endif /* D_A_TAG_ARENA_H */ diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 52a032253f0..b71590829e3 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -425,6 +425,10 @@ inline void fopAcM_SetOldPosition(fopAc_ac_c* i_actor, f32 x, f32 y, f32 z) { i_actor->old.pos.set(x, y, z); } +inline csXyz* fopAcM_GetHomeAngle_p(fopAc_ac_c* i_actor) { + return &i_actor->home.angle; +} + inline void fopAcM_SetHomePosition(fopAc_ac_c* i_actor, f32 x, f32 y, f32 z) { i_actor->home.pos.set(x, y, z); } diff --git a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/cmath.h b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/cmath.h index 9b05ec65a9d..93524cc4914 100644 --- a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/cmath.h +++ b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/cmath.h @@ -42,6 +42,11 @@ inline float tan(float num) { inline float pow(float x, float y) { return ::pow(x, y); } + +inline float pow(float x, int y) { + // FIXME: Needs to use powf + return ::pow(x, y); +} } // namespace std #endif diff --git a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h index 34b65626aad..23dd1334e9d 100644 --- a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h +++ b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common/Include/math.h @@ -63,6 +63,7 @@ double frexp(double, int*); double ldexp(double, int); double modf(double, double*); double pow(double, double); +float powf(float, float); double sin(double); float sinf(float); double sqrt(double); diff --git a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_pow.c b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_pow.c index dc48afa66ed..650114d46fa 100644 --- a/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_pow.c +++ b/src/PowerPC_EABI_Support/MSL/MSL_C/MSL_Common_Embedded/Math/Double_precision/w_pow.c @@ -3,4 +3,9 @@ /* 8036C780-8036C7A0 3670C0 0020+00 0/0 3/3 24/24 .text pow */ double pow(double x, double y) { return __ieee754_pow(x, y); -} \ No newline at end of file +} + +float powf(float x, float y) { + // FIXME: Is this correct? + return __ieee754_pow(x, y); +} diff --git a/src/d/actor/d_a_npc_chat.cpp b/src/d/actor/d_a_npc_chat.cpp index 12aab6db5c3..2e258c1ce21 100644 --- a/src/d/actor/d_a_npc_chat.cpp +++ b/src/d/actor/d_a_npc_chat.cpp @@ -3950,7 +3950,7 @@ bool daNpcChat_c::wait(void* param_1) { if ( dKy_darkworld_check() == 0 && daPy_py_c::checkNowWolf() && - fopAcM_searchPlayerDistanceXZ2(this) < std::pow(500.0, 2.0) || mFear + fopAcM_searchPlayerDistanceXZ2(this) < std::pow(500.0f, 2.0f) || mFear ) { setAction(&daNpcChat_c::fear); if (!mFear) { @@ -3988,8 +3988,7 @@ bool daNpcChat_c::wait(void* param_1) { setMotion(i_motion, -1.0f, 1); } - if (mTalkFlag) { - if (dComIfGp_event_getTalkPartner() != this) { + if (mTalkFlag && dComIfGp_event_getTalkPartner() != this) { if (field_0xe51 == 1) { setMotion(MOT_SITWAIT_A, -1.0f, 0); } else if (field_0xe51 == 2) { @@ -3997,7 +3996,6 @@ bool daNpcChat_c::wait(void* param_1) { } else { setMotion(MOT_WAIT_A, -1.0f, 0); } - } } } else if (mTalkFlag) { mMode = 0; diff --git a/src/d/actor/d_a_npc_wrestler.cpp b/src/d/actor/d_a_npc_wrestler.cpp index 61ae710576c..0d3cbf6fe8b 100644 --- a/src/d/actor/d_a_npc_wrestler.cpp +++ b/src/d/actor/d_a_npc_wrestler.cpp @@ -15,6 +15,9 @@ #include "d/d_camera.h" #include "m_Do/m_Do_graphic.h" #include "d/d_meter2_info.h" +#if DEBUG +#include "JSystem/JHostIO/JORFile.h" +#endif enum Bou3_RES_File_ID { /* BCK */ @@ -359,18 +362,7 @@ static char* l_evtNames[7] = { static char* l_myName = "Wrestler"; /* 80B42E24-80B42E28 000014 0004+00 1/1 0/0 0/0 .bss l_HIO */ -static daNpcWrestler_Param_c l_HIO; - -/* 80B4266C-80B426C0 000874 0054+00 0/2 0/0 0/0 .data mEvtSeqList__15daNpcWrestler_c */ -daNpcWrestler_c::EventFn daNpcWrestler_c::mEvtSeqList[7] = { - NULL, - &daNpcWrestler_c::EvCut_grDSEntry, - &daNpcWrestler_c::EvCut_grDSEntry2, - &daNpcWrestler_c::EvCut_grDSEntry3_4, - &daNpcWrestler_c::EvCut_grDSEntry3_4, - &daNpcWrestler_c::EvCut_grDSEntry5, - &daNpcWrestler_c::EvCut_grDSLose, -}; +static NPC_WRESTLER_HIO_CLASS l_HIO; /* 80B416DC-80B41870 000000 0194+00 35/35 0/0 0/0 .rodata m__21daNpcWrestler_Param_c */ const daNpcWrestler_HIOParam daNpcWrestler_Param_c::m = { @@ -410,16 +402,13 @@ const daNpcWrestler_HIOParam daNpcWrestler_Param_c::m = { 0, 30, 60, - 0, 3, 10, - 0, 0.5f, 180.0f, 500.0f, 0.05f, 15, - 0, 0.0f, 30.0f, 20.0f, @@ -429,7 +418,6 @@ const daNpcWrestler_HIOParam daNpcWrestler_Param_c::m = { 400, 400, 0xFF00, - 0, 400.0f, 14, 11, @@ -501,6 +489,151 @@ const daNpcWrestler_HIOParam daNpcWrestler_Param_c::m = { 0.0f, }; +#if DEBUG +void daNpcWrestler_HIO_Node_c::genMessage(JORMContext* ctext) { + // Real shadow size + ctext->genSlider("リアル影サイズ", &field_0x4->real_shadow_size, 0.0f, 1000.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // reasonable distance + ctext->genSlider("見合う距離", &field_0x4->reasonable_distance, 0.0f, 500.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // grappling distance + ctext->genSlider("組み合い距離", &field_0x4->grapple_distance, 0.0f, 200.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // reconfig distance + ctext->genSlider("再配置距離", &field_0x4->reconfig_distance, 0.0f, 500.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // lateral movement time + ctext->genSlider("横移動時間", &field_0x4->lateral_movement_time, 0, 150, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // lateral movement speed + ctext->genSlider("横移動速度", &field_0x4->horizontal_movement_speed, 0, 0x1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // wandering time + ctext->genSlider("ふらふら時間", &field_0x4->stagger_time, 0, 300, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // waiting time + ctext->genSlider("待ち時間", &field_0x4->wait_time, 0, 300, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // "§ ↓Please set it so that the total sum is 100↓ §" + ctext->genLabel("§ ↓全部足して100になるように設定してください↓ §", 0, 0, NULL, -1, -1, 0x200, 0x18); + // "§ Practice Use §" + ctext->genLabel("§ 練習用 §", 0, 0, NULL, -1, -1, 0x200, 0x18); + // lateral movement probability + ctext->genSlider(" 横移動 の確率", &field_0x4->chances[0].lateral_movement_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // slap probability + ctext->genSlider(" 張り手 の確率", &field_0x4->chances[0].hit_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // tackle probability + ctext->genSlider("タックルの確率", &field_0x4->chances[0].tackle_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // waiting probability + ctext->genSlider(" 待 機 の確率", &field_0x4->chances[0].wait_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // "§ For production use §" + ctext->genLabel("§ 本番用 §", 0, 0, NULL, -1, -1, 0x200, 0x18); + // lateral movement probability + ctext->genSlider(" 横移動 の確率", &field_0x4->chances[1].lateral_movement_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // slap probability + ctext->genSlider(" 張り手 の確率", &field_0x4->chances[1].hit_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // tackle probability + ctext->genSlider("タックルの確率", &field_0x4->chances[1].tackle_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // waiting probability + ctext->genSlider(" 待 機 の確率", &field_0x4->chances[1].wait_chance, + 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // "§ ↑Please set it so that the total sum is 100↑ §" + ctext->genLabel("§ ↑全部足して100になるように設定してください↑ §", 0, 0, NULL, -1, -1, 0x200, 0x18); + // bending limit + ctext->genSlider("曲がり限界", &field_0x4->bending_limit, 0, 0x1000, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); +} + +daNpcWrestler_HIO_c::daNpcWrestler_HIO_c() { + m = daNpcWrestler_Param_c::m; + for (int i = 0; i < 2; i++) { + field_0x19c[i].setParam(&m.mTypeParams[i]); + } +} + +void daNpcWrestler_HIO_c::listenPropertyEvent(const JORPropertyEvent* event) { + char msg_buffer[1988]; + JORReflexible::listenPropertyEvent(event); + + JORFile aJStack_910; + int len; + switch (reinterpret_cast(event->id)) { + case 0x40000002: + if (aJStack_910.open(6, "すべてのファイル(*.*)\0*.*\0", NULL, NULL, NULL) != 0) { + memset(msg_buffer, 0, 2000); + len = 0; + daNpcF_commonListenPropertyEvent(msg_buffer, &len, &m.common); + len = strlen(msg_buffer); + aJStack_910.writeData(msg_buffer, len); + aJStack_910.close(); + OS_REPORT("write append success!::%6d\n", len); + } else { + OS_REPORT("write append failure!\n"); + } + break; + } +} + +void daNpcWrestler_HIO_c::genMessage(JORMContext* ctext) { + // TODO + // Horizontal speed + ctext->genSlider("水平速度", &m.horizontal_speed, 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // vertical velocity + ctext->genSlider("垂直速度", &m.vertical_speed, 0.0f, 100.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // --- AI action --- + ctext->startComboBox("AI行動", &m.ai_action, 0, NULL, 0xffff, 0xffff, 0x100, 0x1a); + // no specification + ctext->genComboBoxItem("指定無し", 0); + // lateral movement + ctext->genComboBoxItem("横移動", 1); + // slap + ctext->genComboBoxItem("張り手", 2); + // tackle + ctext->genComboBoxItem("タックル", 3); + // wait + ctext->genComboBoxItem("待ち", 4); + ctext->endComboBox(); + // rotating share + ctext->genSlider("回転割り", &m.rotation, 0, 30, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // Slap hit impact + ctext->startComboBox("張り手Hit衝撃", &m.slap_hit_impact, 0, NULL, 0xffff, 0xffff, 0x100, 0x1a); + ctext->genComboBoxItem("VIBMODE_Q_POWER1", 1); + ctext->genComboBoxItem("VIBMODE_Q_POWER2", 2); + ctext->genComboBoxItem("VIBMODE_Q_POWER3", 3); + ctext->genComboBoxItem("VIBMODE_Q_POWER4", 4); + ctext->genComboBoxItem("VIBMODE_Q_POWER5", 5); + ctext->genComboBoxItem("VIBMODE_Q_POWER6", 6); + ctext->genComboBoxItem("VIBMODE_Q_POWER7", 7); + ctext->genComboBoxItem("VIBMODE_Q_POWER8", 8); + ctext->endComboBox(); + // Ready? Appearance time + ctext->genSlider("Ready? 出現時間", &m.ready_appearance_time, 0, 300, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // Fight! Appearance time + ctext->genSlider("Fight! 出現時間", &m.fight_appearance_time, 0, 300, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // camera rotation angle + ctext->genSlider("カメラ回転角", &m.camera_rotation_angle, 0.0f, 2.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // sound at the edge of the ring + ctext->genSlider("音 土俵際距離", &m.ring_edge_sound, 0.0f, 500.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + // movement at the edge of the ring + ctext->genSlider("動 土俵際距離", &m.ring_edge_movement, 0.0f, 500.0f, 0, NULL, 0xFFFF, 0xFFFF, 0x200, 24); + daNpcF_commonGenMessage(ctext, &m.common); + // Bo + ctext->genNode("ボウ", &field_0x19c[0], 0, 0); + // Elder Goron Fatso + ctext->genNode("長老ゴロン デブ", &field_0x19c[1], 0, 0); +} +#endif + +/* 80B4266C-80B426C0 000874 0054+00 0/2 0/0 0/0 .data mEvtSeqList__15daNpcWrestler_c */ +daNpcWrestler_c::EventFn daNpcWrestler_c::mEvtSeqList[7] = { + NULL, + &daNpcWrestler_c::EvCut_grDSEntry, + &daNpcWrestler_c::EvCut_grDSEntry2, + &daNpcWrestler_c::EvCut_grDSEntry3_4, + &daNpcWrestler_c::EvCut_grDSEntry3_4, + &daNpcWrestler_c::EvCut_grDSEntry5, + &daNpcWrestler_c::EvCut_grDSLose, +}; + daNpcWrestler_c::daNpcWrestler_c() { // empty function } @@ -512,6 +645,10 @@ daNpcWrestler_c::~daNpcWrestler_c() { if (heap != NULL) { mpMorf->stopZelAnime(); } + +#if DEBUG + l_HIO.removeHIO(); +#endif } /* 80B2F688-80B2F974 0004E8 02EC+00 1/1 0/0 0/0 .text Create__15daNpcWrestler_cFv */ @@ -528,12 +665,17 @@ cPhs__Step daNpcWrestler_c::Create() { } if (phase == cPhs_COMPLEATE_e) { - if (!fopAcM_entrySolidHeap(this, createHeapCallBack, mType == 0 ? 0x49B0 : 0x3A40)) { + u32 i_size = mType == 0 ? 0x49B0 : 0x3A40; + if (!fopAcM_entrySolidHeap(this, createHeapCallBack, i_size)) { return cPhs_ERROR_e; } - field_0xbd8 = &daNpcWrestler_Param_c::m; + field_0xbd8 = &l_HIO.m; field_0xbdc = &field_0xbd8->mTypeParams[mType]; +#if DEBUG + // Sumo wrestler: + l_HIO.entryHIO("力士"); +#endif fopAcM_SetMtx(this, mpMorf->getModel()->getBaseTRMtx()); fopAcM_setCullSizeBox(this, -160.0f, -50.0f, -160.0f, 160.0f, 220.0f, 160.0f); @@ -565,10 +707,13 @@ cPhs__Step daNpcWrestler_c::Create() { /* 80B2F974-80B2FBF4 0007D4 0280+00 1/1 0/0 0/0 .text CreateHeap__15daNpcWrestler_cFv */ int daNpcWrestler_c::CreateHeap() { - J3DModelData* mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resName[mType], l_bmdGetParamList[mType]); + J3DModelData* mdlData_p = NULL; + J3DModel* model = NULL; + mdlData_p = (J3DModelData*)dComIfG_getObjectRes(l_resName[mType], l_bmdGetParamList[mType]); JUT_ASSERT(830, NULL != mdlData_p); - mpMorf = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, 0x11020284); + u32 reg_r23 = 0x11020284; + mpMorf = new mDoExt_McaMorfSO(mdlData_p, NULL, NULL, NULL, -1, 1.0f, 0, -1, &mSound, 0x80000, reg_r23); if (mpMorf != NULL && mpMorf->getModel() == NULL) { mpMorf->stopZelAnime(); mpMorf = NULL; @@ -577,7 +722,7 @@ int daNpcWrestler_c::CreateHeap() { return 0; } - J3DModel* model = mpMorf->getModel(); + model = mpMorf->getModel(); for (u16 i = 0; i < mdlData_p->getJointNum(); i++) { mdlData_p->getJointNodePointer(i)->setCallBack(ctrlJointCallBack); } @@ -598,7 +743,7 @@ int daNpcWrestler_c::CreateHeap() { /* 80B2FDB0-80B2FDE4 000C10 0034+00 1/1 0/0 0/0 .text Delete__15daNpcWrestler_cFv */ int daNpcWrestler_c::Delete() { - fopAcM_GetID(this); + fopAcM_RegisterDeleteID(this, "NPC_WRESTLER"); this->~daNpcWrestler_c(); return 1; } @@ -618,7 +763,7 @@ int daNpcWrestler_c::Draw() { J3DModelData* model_data = mpMorf->getModel()->getModelData(); model_data->getMaterialNodePointer(1)->setMaterialAnm(mpMatAnm); - return draw(FALSE, FALSE, field_0xbdc->field_0xc, NULL, FALSE); + return draw(FALSE, FALSE, field_0xbdc->real_shadow_size, NULL, FALSE); } /* 80B2FE84-80B30150 000CE4 02CC+00 1/1 0/0 0/0 .text ctrlJoint__15daNpcWrestler_cFP8J3DJointP8J3DModel */ @@ -711,7 +856,7 @@ bool daNpcWrestler_c::checkStartUp() { } /* 80B405E8-80B40B3C 011448 0554+00 1/1 0/0 0/0 .text setAttnPos__15daNpcWrestler_cFv */ -inline void daNpcWrestler_c::setAttnPos() { +void daNpcWrestler_c::setAttnPos() { static cXyz eyeOffset(-10.0f, 10.0f, 0.0f); cXyz* attnPos = NULL; cXyz sp44, sp50, sp5c; @@ -783,7 +928,7 @@ inline void daNpcWrestler_c::setAttnPos() { } /* 80B3023C-80B30654 00109C 0418+00 2/0 0/0 0/0 .text setExpressionAnm__15daNpcWrestler_cFib */ -inline bool daNpcWrestler_c::setExpressionAnm(int param_1, bool param_2) { +bool daNpcWrestler_c::setExpressionAnm(int param_1, bool param_2) { mAnmFlags &= 0xFFFFE03F; J3DAnmTransform* anmTransform = (field_0xe04->bck_list[param_1].fileIdx >= 0) ? @@ -925,7 +1070,7 @@ inline bool daNpcWrestler_c::setExpressionAnm(int param_1, bool param_2) { } /* 80B30654-80B3074C 0014B4 00F8+00 1/0 0/0 0/0 .text setExpressionBtp__15daNpcWrestler_cFi */ -inline bool daNpcWrestler_c::setExpressionBtp(int param_1) { +bool daNpcWrestler_c::setExpressionBtp(int param_1) { J3DAnmTexPattern* anmTexPattern = (field_0xe04->btp_list[param_1].fileIdx >= 0) ? getTexPtrnAnmP(l_resName[mType], field_0xe04->btp_list[param_1].fileIdx) : NULL; @@ -951,39 +1096,44 @@ inline bool daNpcWrestler_c::setExpressionBtp(int param_1) { return 0; } -inline void daNpcWrestler_c::setBackToLiving() { - if (mType != 1) { - daPy_py_c* player = daPy_getPlayerActorClass(); - daNpcBouS_c* bou = (daNpcBouS_c*)fpcM_SearchByID(parentActorID); - JUT_ASSERT(2205, bou != NULL); - - bou->setMessageNo(7); - bou->setForcibleTalk(); - bou->onDispFlag(); - - s16 sVar1 = fopAcM_GetHomeAngle_p(bou)->y + 0x8000; - mDoMtx_stack_c::transS(fopAcM_GetPosition(bou)); - mDoMtx_stack_c::YrotM(fopAcM_GetShapeAngle_p(bou)->y); - cXyz sp28(0.0f, 0.0f, field_0xbdc->field_0x1c); - mDoMtx_stack_c::multVec(&sp28, &sp28); - - player->setPlayerPosAndAngle(&sp28, sVar1, 0); - - if (mType == 0) { - player->setClothesChange(0); - OS_REPORT("リンクさん!出番です!着替えてください!\n"); // Link! It's your turn! Get changed! - } - - if (daNpcF_chkTmpBit(0x2F)) { - fopAcM_onSwitch(this, 0x46); - } - - field_0xe99 = 1; +void daNpcWrestler_c::setBackToLiving() { + if (mType == 1) { + return; } + + daPy_py_c* player = daPy_getPlayerActorClass(); + daNpcBouS_c* bou = (daNpcBouS_c*)fpcM_SearchByID(parentActorID); + JUT_ASSERT(2205, bou != NULL); + + bou->setMessageNo(7); + bou->setForcibleTalk(); + bou->onDispFlag(); + + s16 sVar1 = fopAcM_GetHomeAngle_p(bou)->y + 0x8000; + mDoMtx_stack_c::transS(fopAcM_GetPosition(bou)); + mDoMtx_stack_c::YrotM(fopAcM_GetShapeAngle_p(bou)->y); + cXyz sp28(0.0f, 0.0f, field_0xbdc->reconfig_distance); + mDoMtx_stack_c::multVec(&sp28, &sp28); + + player->setPlayerPosAndAngle(&sp28, sVar1, 0); + + if (mType == 0) { + player->setClothesChange(0); + OS_REPORT("リンクさん!出番です!着替えてください!\n"); // Link! It's your turn! Get changed! + } + + if (daNpcF_chkTmpBit(0x2F)) { + fopAcM_onSwitch(this, 0x46); + } + + field_0xe99 = 1; } /* 80B3074C-80B308B0 0015AC 0164+00 1/0 0/0 0/0 .text setMotionAnm__15daNpcWrestler_cFif */ void daNpcWrestler_c::setMotionAnm(int param_1, f32 param_2) { +#if DEBUG + const static int btkType = 0; +#endif J3DAnmTransformKey* anmTransformKey = (field_0xe04->bck_list[param_1].fileIdx >= 0)? getTrnsfrmKeyAnmP(l_resName[mType], field_0xe04->bck_list[param_1].fileIdx) : NULL; @@ -1005,6 +1155,48 @@ void daNpcWrestler_c::setMotionAnm(int param_1, f32 param_2) { } } +#if DEBUG +static s16 dummy_lit_123932(int sel) { + const s16 arr[2] = {0x00C8, 0x00FF}; + return arr[sel]; +} + +static s16 dummy_lit_123935(int sel) { + const s16 arr[2] = {0xC800, 0x00FF}; + return arr[sel]; +} + +static s16 dummy_lit_123941(int sel) { + const s16 arr[2] = {0x0000, 0xC8FF}; + return arr[sel]; +} + +static s16 dummy_lit_1239443(int sel) { + const s16 arr[2] = {0x0000, 0xC8FF}; + return arr[sel]; +} + +static s16 dummy_lit_123947(int sel) { + const s16 arr[2] = {0x0000, 0xC8FF}; + return arr[sel]; +} + +static s16 dummy_lit_123950(int sel) { + const s16 arr[2] = {0x8080, 0x80A0}; + return arr[sel]; +} + +static s16 dummy_lit_123953(int sel) { + const s16 arr[2] = {0x8080, 0x80A0}; + return arr[sel]; +} + +static s16 dummy_lit_123964(int sel) { + const s16 arr[2] = {0xFFFF, 0xFFFF}; + return arr[sel]; +} +#endif + /* 80B308B0-80B30AD8 001710 0228+00 1/1 0/0 0/0 .text reset__15daNpcWrestler_cFv */ void daNpcWrestler_c::reset() { initialize(); @@ -1054,37 +1246,37 @@ void daNpcWrestler_c::reset() { mMotionMorfOverride = 0.0f; } -inline void daNpcWrestler_c::setNextSumouEvent(int i_sumouEventNo) { +void daNpcWrestler_c::setNextSumouEvent(int i_sumouEventNo) { if (i_sumouEventNo == -1) { i_sumouEventNo = mItemNo; } OS_REPORT("相撲イベント要求 ステータスNo=%d\n", i_sumouEventNo); switch (i_sumouEventNo) { - case 1: - return; - case 2: setAction(&daNpcWrestler_c::demoSumouReady); - return; + break; case 3: setAction(&daNpcWrestler_c::sumouReady); - return; + break; case 4: setAction(&daNpcWrestler_c::gotoLiving); - return; + break; + default: + setAction(&daNpcWrestler_c::wait); + break; + + case 1: case 5: - return; + break; } - - setAction(&daNpcWrestler_c::wait); } /* 80B30AD8-80B30B80 001938 00A8+00 1/1 0/0 0/0 .text setAction__15daNpcWrestler_cFM15daNpcWrestler_cFPCvPvPv_b */ -inline int daNpcWrestler_c::setAction(actionFunc action) { +int daNpcWrestler_c::setAction(actionFunc action) { field_0xe96 = 3; if (field_0xdcc != NULL) { (this->*field_0xdcc)(NULL); @@ -1101,7 +1293,8 @@ inline int daNpcWrestler_c::setAction(actionFunc action) { /* 80B30B80-80B30BEC 0019E0 006C+00 1/1 0/0 0/0 .text s_sub1__FPvPv */ static void* s_sub1(void* i_actor, void* i_data) { - if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Tag_Arena && ((daNpcWrestler_c*)i_data)->checkArenaSub((daNpcWrestler_c*)i_actor)) { + if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_Tag_Arena + && ((daNpcWrestler_c*)i_data)->checkArenaSub((daNpcWrestler_c*)i_actor)) { return i_actor; } @@ -1136,6 +1329,7 @@ bool daNpcWrestler_c::checkArenaSub(fopAc_ac_c* actor) { /* 80B30CC8-80B30D48 001B28 0080+00 1/1 0/0 0/0 .text s_sub2__FPvPv */ static void* s_sub2(void* i_actor, void* i_data) { + (void) i_data; if (fopAcM_IsActor(i_actor) && fopAcM_GetName(i_actor) == PROC_NPC_GRA) { daNpc_grA_c* goron = (daNpc_grA_c*)i_actor; if (goron->getType() == 3) { @@ -1178,13 +1372,13 @@ void daNpcWrestler_c::setOnToArena(f32 param_1) { } } -inline void daNpcWrestler_c::setLookMode(int mode) { - if (mode > -1 && mode < 4 && mode != mLookMode) { +void daNpcWrestler_c::setLookMode(int mode) { + if (mode >= 0 && mode < 4 && mode != mLookMode) { mLookMode = mode; } } -inline BOOL daNpcWrestler_c::chkFindPlayer() { +BOOL daNpcWrestler_c::chkFindPlayer() { BOOL bVar1 = FALSE; if (mActorMngr[0].getActorP() == NULL) { bVar1 = chkPlayerInSpeakArea(this); @@ -1203,7 +1397,7 @@ inline BOOL daNpcWrestler_c::chkFindPlayer() { return bVar1; } -inline BOOL daNpcWrestler_c::step(s16 param_1, int param_2) { +BOOL daNpcWrestler_c::step(s16 param_1, int param_2) { if (mTurnMode == 0) { s16 ang_diff = param_1 - mCurAngle.y; if (mCurAngle.y == param_1) { @@ -1236,7 +1430,7 @@ inline BOOL daNpcWrestler_c::step(s16 param_1, int param_2) { return (1 < mTurnMode); } -inline void daNpcWrestler_c::playExpression() { +void daNpcWrestler_c::playExpression() { daNpcF_anmPlayData playData0 = {0x13, field_0xbd8->common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&playData0}; daNpcF_anmPlayData playData1 = {0x17, field_0xbd8->common.morf_frame, 1}; @@ -1266,7 +1460,7 @@ inline void daNpcWrestler_c::playExpression() { } /* 80B3FCE8-80B404FC 010B48 0814+00 1/2 0/0 0/0 .text playMotion__15daNpcWrestler_cFv */ -inline void daNpcWrestler_c::playMotion() { +void daNpcWrestler_c::playMotion() { daNpcF_anmPlayData playData0 = {0x39, field_0xbd8->common.morf_frame, 0}; daNpcF_anmPlayData* pDat0[1] = {&playData0}; daNpcF_anmPlayData playData1 = {0x39, 0.0f, 0}; @@ -1376,7 +1570,7 @@ inline void daNpcWrestler_c::playMotion() { } /* 80B40B3C-80B40D1C 01199C 01E0+00 1/1 0/0 0/0 .text lookat__15daNpcWrestler_cFv */ -inline void daNpcWrestler_c::lookat() { +void daNpcWrestler_c::lookat() { daPy_py_c* player = NULL; J3DModel* model = mpMorf->getModel(); BOOL snap = FALSE; @@ -1428,7 +1622,7 @@ inline void daNpcWrestler_c::lookat() { } /* 80B33B3C-80B34654 00499C 0B18+00 1/1 0/0 0/0 .text setNextAction__15daNpcWrestler_cFv */ -inline bool daNpcWrestler_c::setNextAction() { +bool daNpcWrestler_c::setNextAction() { daPy_py_c* player = daPy_getPlayerActorClass(); if (mType == 1 && !player->checkEquipHeavyBoots()) { @@ -1536,7 +1730,7 @@ inline bool daNpcWrestler_c::setNextAction() { } /* 80B30F00-80B31680 001D60 0780+00 13/1 0/0 0/0 .text wait__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::wait(void* param_1) { +bool daNpcWrestler_c::wait(void* param_1) { switch (field_0xe96) { case 0: { setExpression(5, -1.0f); @@ -1554,22 +1748,14 @@ inline bool daNpcWrestler_c::wait(void* param_1) { if (dComIfGp_event_chkTalkXY() == 0 || dComIfGp_evmng_ChkPresentEnd()) { if (mType == 1 && field_0xe99 == 0 && daNpcF_chkEvtBit(0x3A) && !daNpcF_chkEvtBit(0x3E) && daNpcF_chkEvtBit(0x3F)) { - s16 sVar1; - if (current.pos.z > 200.0f) { - sVar1 = 3; - } else { - sVar1 = 4; - } - - mOrderEvtNo = sVar1; - + mOrderEvtNo = (current.pos.z > 200.0f) ? 3 : 4; changeEvent(l_resName[mType], l_evtNames[mOrderEvtNo], 1, 0xFFFF); setAction(&daNpcWrestler_c::demo); - break; } else { setAction(&daNpcWrestler_c::talk); - break; } + + break; } } else { dEvent_manager_c& ev_mng = dComIfGp_getEventManager(); @@ -1653,8 +1839,13 @@ void daNpcWrestler_c::setExpression(int i_expression, f32 i_expressionMorfOvveri } } -inline bool daNpcWrestler_c::setTalkAngle() { - s16 playerAngleY = (int) fopAcM_searchPlayerAngleY(this); +bool daNpcWrestler_c::setTalkAngle() { +#if VERSION == VERSION_SHIELD_DEBUG + s16 playerAngleY = fopAcM_searchPlayerAngleY(this); +#else + // FIXME: Possible fakematch? + s16 playerAngleY = (int) fopAcM_searchPlayerAngleY(this); +#endif if (playerAngleY == mCurAngle.y) { return true; } @@ -1668,7 +1859,7 @@ inline bool daNpcWrestler_c::setTalkAngle() { return false; } -inline void daNpcWrestler_c::setExpressionTalkAfter() { +void daNpcWrestler_c::setExpressionTalkAfter() { switch (mExpression) { case 1: setExpression(3, -1.0f); @@ -1685,7 +1876,7 @@ inline void daNpcWrestler_c::setExpressionTalkAfter() { } /* 80B316F4-80B31EB0 002554 07BC+00 3/0 0/0 0/0 .text talk__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::talk(void* param_1) { +bool daNpcWrestler_c::talk(void* param_1) { bool rv = false; int i_expression, i_motion, iVar3; @@ -1780,7 +1971,7 @@ inline bool daNpcWrestler_c::talk(void* param_1) { } /* 80B31EB0-80B32058 002D10 01A8+00 4/0 0/0 0/0 .text demo__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::demo(void* param_1) { +bool daNpcWrestler_c::demo(void* param_1) { dEvent_manager_c* eventManager = &dComIfGp_getEventManager(); switch (field_0xe96) { @@ -1798,8 +1989,7 @@ inline bool daNpcWrestler_c::demo(void* param_1) { } if (eventInfo.checkCommandDemoAccrpt() && mEventIdx != -1 && eventManager->endCheck(mEventIdx)) { - u16 asdf = mOrderEvtNo; - (void) asdf; + // How to load mOrderEvtNo ? dComIfGp_event_reset(); mOrderEvtNo = 0; mEventIdx = -1; @@ -1824,9 +2014,8 @@ inline bool daNpcWrestler_c::demo(void* param_1) { } /* 80B32058-80B32444 002EB8 03EC+00 7/0 0/0 0/0 .text gotoArena__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::gotoArena(void* param_1) { +bool daNpcWrestler_c::gotoArena(void* param_1) { dCamera_c* camBody = dCam_getBody(); - int iVar1; switch (field_0xe96) { case 0: @@ -1856,9 +2045,7 @@ inline bool daNpcWrestler_c::gotoArena(void* param_1) { break; case 1: - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 != 0) { + if (field_0xe80-- != 0) { field_0xe9a = 1; field_0xe80 = field_0xbd8->field_0x8c + 1; field_0xe84++; @@ -1866,9 +2053,7 @@ inline bool daNpcWrestler_c::gotoArena(void* param_1) { break; case 2: { - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 <= 0) { + if (field_0xe80-- <= 0) { setNextSumouEvent(-1); } @@ -1896,7 +2081,7 @@ inline bool daNpcWrestler_c::gotoArena(void* param_1) { } /* 80B32444-80B32850 0032A4 040C+00 1/0 0/0 0/0 .text gotoLiving__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::gotoLiving(void* param_1) { +bool daNpcWrestler_c::gotoLiving(void* param_1) { dCamera_c* camBody = dCam_getBody(); int iVar1; @@ -1963,15 +2148,13 @@ inline bool daNpcWrestler_c::gotoLiving(void* param_1) { return true; } -inline void daNpcWrestler_c::initDemoCamera_ArenaSide() { - dCamera_c* camBody = dCam_getBody(); - - mDemoCamFovy = camBody->Fovy(); +void daNpcWrestler_c::initDemoCamera_ArenaSide() { + mDemoCamFovy = dCam_getBody()->Fovy(); field_0xe58 = field_0xbd8->field_0xac; field_0xe54 = field_0xbd8->camera_rotation_angle * 65535.0f; mDemoCam.mDemoCamCenter.set(mArenaPos.x, mArenaPos.y + 50.0f, mArenaPos.z); - field_0xe5e = mArenaAngle; + field_0xe5e = s16(mArenaAngle); mDoMtx_stack_c::transS(mDemoCam.mDemoCamCenter); mDoMtx_stack_c::YrotM(field_0xe54 + fopAcM_GetShapeAngle_p(daPy_getPlayerActorClass())->y); @@ -1983,7 +2166,6 @@ inline void daNpcWrestler_c::initDemoCamera_ArenaSide() { bool daNpcWrestler_c::sumouReady(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); dCamera_c* camBody = dCam_getBody(); - int iVar1; switch (field_0xe96) { case 0: @@ -2028,13 +2210,13 @@ bool daNpcWrestler_c::sumouReady(void* param_1) { camBody->Stop(); camBody->SetTrimSize(2); camBody->Set(mDemoCam.mDemoCamCenter, mDemoCam.mDemoCamEye, mDemoCamFovy, 0); - setOnToArena(field_0xbdc->field_0x14 * 0.5f); + setOnToArena(field_0xbdc->reasonable_distance * 0.5f); field_0xe9a = 0; field_0xe84++; break; } - setOnToArena(field_0xbdc->field_0x14 * 0.5f); + setOnToArena(field_0xbdc->reasonable_distance * 0.5f); field_0xe9a = 0; field_0xe84++; // fallthrough @@ -2061,10 +2243,7 @@ bool daNpcWrestler_c::sumouReady(void* param_1) { break; case 3: - iVar1 = field_0xe80; - field_0xe80--; - - if (iVar1 <= 0) { + if (field_0xe80-- <= 0) { camBody->Set(mDemoCam.mDemoCamCenter, mDemoCam.mDemoCamEye, mDemoCamFovy, 0); camBody->Reset(mDemoCam.mDemoCamCenter, mDemoCam.mDemoCamEye); camBody->SetTrimSize(0); @@ -2082,10 +2261,7 @@ bool daNpcWrestler_c::sumouReady(void* param_1) { break; case 4: - iVar1 = field_0xe80; - field_0xe80++; - - if (iVar1 > field_0xbd8->ready_appearance_time) { + if (field_0xe80++ > field_0xbd8->ready_appearance_time) { dMeter2Info_setMeterString(0x515); Z2GetAudioMgr()->seStart(Z2SE_SY_SUMO_READY, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); field_0xe80 = 0; @@ -2094,9 +2270,7 @@ bool daNpcWrestler_c::sumouReady(void* param_1) { break; case 5: - iVar1 = field_0xe80; - field_0xe80++; - if (iVar1 > field_0xbd8->fight_appearance_time) { + if (field_0xe80++ > field_0xbd8->fight_appearance_time) { dMeter2Info_setMeterString(0x516); Z2GetAudioMgr()->seStart(Z2SE_SY_SUMO_START, NULL, 0, 0, 1.0f, 1.0f, -1.0f, -1.0f, 0); Z2GetAudioMgr()->changeSubBgmStatus(1); @@ -2129,13 +2303,19 @@ bool daNpcWrestler_c::sumouReady(void* param_1) { case 3: { break; } + + default: + JUT_ASSERT(3181, FALSE); + break; } return 1; } -inline void daNpcWrestler_c::sumouAI() { +void daNpcWrestler_c::sumouAI() { if (mType == 1 && !daPy_getPlayerActorClass()->checkEquipHeavyBoots()) { + // The following is to force dbg asm stack to use r31: + int unused; mWrestlerAction = 0; return; } @@ -2163,13 +2343,13 @@ inline void daNpcWrestler_c::sumouAI() { } } -inline s16 daNpcWrestler_c::oppositeToPlayer() { +s16 daNpcWrestler_c::oppositeToPlayer() { s16 rv = cLib_addCalcAngleS(&mCurAngle.y, fopAcM_searchPlayerAngleY(this), field_0xbd8->rotation, 0x4000, 0x40); setAngle(mCurAngle.y); return rv; } -inline void daNpcWrestler_c::correctGraspPosAngle(bool param_1) { +void daNpcWrestler_c::correctGraspPosAngle(bool param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); cXyz sp24(0.0f, 0.0f, field_0xbdc->grapple_distance); mDoMtx_stack_c::transS(*player->getViewerCurrentPosP()); @@ -2183,12 +2363,12 @@ inline void daNpcWrestler_c::correctGraspPosAngle(bool param_1) { } /* 80B339EC-80B33B3C 00484C 0150+00 13/13 0/0 0/0 .text checkOutOfArenaP__15daNpcWrestler_cFv */ -inline bool daNpcWrestler_c::checkOutOfArenaP() { +bool daNpcWrestler_c::checkOutOfArenaP() { if (mArenaInfo.chkFlag == 0) { return false; } - f32 fVar1 = pow(mArenaExtent, 2.0); + f32 fVar1 = std::pow(mArenaExtent, 2); daPy_py_c* player = daPy_getPlayerActorClass(); cXyz left_foot_pos = player->getLeftFootPos(); cXyz right_foot_pos = player->getRightFootPos(); @@ -2196,10 +2376,7 @@ inline bool daNpcWrestler_c::checkOutOfArenaP() { } /* 80B331CC-80B339EC 00402C 0820+00 14/0 0/0 0/0 .text sumouWait__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::sumouWait(void* param_1) { - daPy_py_c* player; - int iVar1; - +bool daNpcWrestler_c::sumouWait(void* param_1) { switch (field_0xe96) { case 0: field_0xe80 = field_0xbdc->wait_time; @@ -2211,21 +2388,20 @@ inline bool daNpcWrestler_c::sumouWait(void* param_1) { field_0xe96 = 2; break; - case 2: + case 2: { correctGraspPosAngle(true); - if (cLib_distanceAngleS(mCurAngle.y, fopAcM_searchPlayerAngleY(this)) < 0x600) { + int dist_angle = cLib_distanceAngleS(mCurAngle.y, fopAcM_searchPlayerAngleY(this)); + if (dist_angle < 0x600) { setMotion(8, 6.0f, 0); } else { setMotion(9, 6.0f, 0); } if (!setNextAction()) { - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 < 0) { - player = daPy_getPlayerActorClass(); - if (mType == 1 && !daPy_getPlayerActorClass()->checkEquipHeavyBoots()) { + if (field_0xe80-- < 0) { + daPy_py_c* player = daPy_getPlayerActorClass(); + if (mType == 1 && !player->checkEquipHeavyBoots()) { setAction(&daNpcWrestler_c::sumouPunchHit); daPy_getPlayerActorClass()->setSumouForcePunch(); } else { @@ -2255,6 +2431,9 @@ inline bool daNpcWrestler_c::sumouWait(void* param_1) { case 5: setAction(&daNpcWrestler_c::sumouWait); break; + + default: + JUT_ASSERT(3294, FALSE); } } } @@ -2264,16 +2443,20 @@ inline bool daNpcWrestler_c::sumouWait(void* param_1) { setAction(&daNpcWrestler_c::demoSumouWin2); } break; + } case 3: break; + + default: + JUT_ASSERT(3310, FALSE); } return true; } /* 80B34654-80B34CD0 0054B4 067C+00 2/0 0/0 0/0 .text sumouPunchHit__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::sumouPunchHit(void* param_1) { +bool daNpcWrestler_c::sumouPunchHit(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); int jointNo = mType == 0 ? 0x12 : 0x11; cXyz sp2c; @@ -2397,8 +2580,7 @@ bool daNpcWrestler_c::sumouPunchChaseHit(void* param_1) { field_0xdd8->becomeImmortalEmitter(); } - field_0xde0 = NULL; - field_0xddc = NULL; + field_0xddc = field_0xde0 = NULL; field_0xe96 = 2; break; @@ -2454,7 +2636,7 @@ bool daNpcWrestler_c::sumouPunchChaseHit(void* param_1) { } break; - case 3: + case 3: { if (field_0xdd8 != NULL) { field_0xdd8->quitImmortalEmitter(); field_0xdd8 = NULL; @@ -2471,24 +2653,29 @@ bool daNpcWrestler_c::sumouPunchChaseHit(void* param_1) { } mDoMtx_stack_c::transS(current.pos); - mDoMtx_stack_c::YrotM(cLib_targetAngleY(daPy_getPlayerActorClass()->getViewerCurrentPosP(), ¤t.pos)); + s16 tgt_angle = cLib_targetAngleY(daPy_getPlayerActorClass()->getViewerCurrentPosP(), ¤t.pos); + mDoMtx_stack_c::YrotM(tgt_angle); current.pos.set(0.0f, 0.0f, -63.5f); mDoMtx_stack_c::multVec(¤t.pos, ¤t.pos); break; + } + + default: + JUT_ASSERT(3509, FALSE); } return true; } /* 80B35780-80B358F0 0065E0 0170+00 8/8 0/0 0/0 .text checkOutOfArenaW__15daNpcWrestler_cFv */ -inline bool daNpcWrestler_c::checkOutOfArenaW() { +bool daNpcWrestler_c::checkOutOfArenaW() { if (mArenaInfo.chkFlag == 0) { return false; } int jointNo = mType == 0 ? 0x1A : 0x18; int jointNo2 = mType == 0 ? 0x1E : 0x1B; - f32 fVar1 = pow(mArenaExtent, 2.0); + f32 fVar1 = std::pow(mArenaExtent, 2); field_0x89c = getJointPos(jointNo); field_0x8a8 = getJointPos(jointNo2); @@ -2496,7 +2683,7 @@ inline bool daNpcWrestler_c::checkOutOfArenaW() { } /* 80B35364-80B35780 0061C4 041C+00 1/0 0/0 0/0 .text sumouPunchMiss__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::sumouPunchMiss(void* param_1) { +bool daNpcWrestler_c::sumouPunchMiss(void* param_1) { // NONMATCHING - regalloc daPy_py_c* player = daPy_getPlayerActorClass(); int jointNo = mType == 0 ? 0x12 : 0x11; @@ -2586,8 +2773,7 @@ bool daNpcWrestler_c::sumouPunchDraw(void* param_1) { field_0xdd8->setLifeTime(5); } - field_0xde0 = NULL; - field_0xddc = NULL; + field_0xddc = field_0xde0 = NULL; field_0xe96 = 2; break; @@ -2663,6 +2849,9 @@ bool daNpcWrestler_c::sumouPunchDraw(void* param_1) { field_0xde0 = NULL; } break; + + default: + JUT_ASSERT(3681, FALSE); } return true; @@ -2709,8 +2898,7 @@ bool daNpcWrestler_c::sumouTackleHit(void* param_1) { } } - field_0xde4 = NULL; - field_0xde0 = NULL; + field_0xde0 = field_0xde4 = NULL; if (mType != 0) { setLookMode(0); @@ -2803,6 +2991,9 @@ bool daNpcWrestler_c::sumouTackleHit(void* param_1) { field_0xde4 = NULL; } break; + + default: + JUT_ASSERT(3804, FALSE); } return true; @@ -2838,6 +3029,9 @@ bool daNpcWrestler_c::sumouTackleMiss(void* param_1) { setLookMode(2); mActorMngr[0].entry(daPy_getPlayerActorClass()); break; + + default: + JUT_ASSERT(3845, FALSE); } return true; @@ -2853,10 +3047,7 @@ bool daNpcWrestler_c::sumouTackleDraw(void* param_1) { case 0: setExpressionAnm(0x12, true); setMotion(0x14, -1.0f, 0); - field_0xde4 = NULL; - field_0xde0 = NULL; - field_0xddc = NULL; - field_0xdd8 = NULL; + field_0xdd8 = field_0xddc = field_0xde0 = field_0xde4 = NULL; field_0xe96 = 2; break; @@ -2921,12 +3112,15 @@ bool daNpcWrestler_c::sumouTackleDraw(void* param_1) { case 3: break; + + default: + JUT_ASSERT(3932, FALSE); } return true; } -inline void daNpcWrestler_c::setStepAngle() { +void daNpcWrestler_c::setStepAngle() { f32 fVar1[2]; int var_r25 = 0; (void) var_r25; @@ -2962,7 +3156,7 @@ inline void daNpcWrestler_c::setStepAngle() { } /* 80B37270-80B378F4 0080D0 0684+00 4/0 0/0 0/0 .text sumouSideStep__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::sumouSideStep(void* param_1) { +bool daNpcWrestler_c::sumouSideStep(void* param_1) { // NONMATCHING - g_dComIfG_gameInfo weirdness switch (field_0xe96) { case 0: @@ -3047,8 +3241,9 @@ bool daNpcWrestler_c::sumouLostBalance(void* param_1) { field_0xe96 = 2; break; - case 2: - if (abs(oppositeToPlayer()) < 0x1000) { + case 2: { + s16 opp_to_player = oppositeToPlayer(); + if (abs(opp_to_player) < 0x1000) { setAction(&daNpcWrestler_c::sumouWait); } else { if (checkOutOfArenaP()) { @@ -3060,9 +3255,13 @@ bool daNpcWrestler_c::sumouLostBalance(void* param_1) { } } break; + } case 3: break; + + default: + JUT_ASSERT(4046, FALSE); } return true; @@ -3101,13 +3300,16 @@ bool daNpcWrestler_c::sumouPunchShock(void* param_1) { case 3: break; + + default: + JUT_ASSERT(4092, FALSE); } return true; } /* 80B37FB8-80B38518 008E18 0560+00 2/0 0/0 0/0 .text sumouPunchChaseShock__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::sumouPunchChaseShock(void* param_1) { +bool daNpcWrestler_c::sumouPunchChaseShock(void* param_1) { // NONMATCHING - regalloc daPy_py_c* player = daPy_getPlayerActorClass(); @@ -3193,6 +3395,9 @@ bool daNpcWrestler_c::sumouPunchStagger(void* param_1) { case 3: break; + + default: + JUT_ASSERT(4191, FALSE); } return true; @@ -3226,6 +3431,9 @@ bool daNpcWrestler_c::sumouTackleShock(void* param_1) { case 3: break; + + default: + JUT_ASSERT(4236, FALSE); } return true; } @@ -3262,11 +3470,11 @@ bool daNpcWrestler_c::sumouTackleStagger(void* param_1) { fVar1 = getJointPos(jointNo).absXZ(mArenaPos); fVar2 = getJointPos(jointNo2).absXZ(mArenaPos); - if (fVar1 > field_0xbd8->field_0x80 || fVar2 > field_0xbd8->field_0x80) { + if (fVar1 > field_0xbd8->ring_edge_sound || fVar2 > field_0xbd8->ring_edge_sound) { Z2GetAudioMgr()->changeSubBgmStatus(3); } - if (fVar1 > field_0xbd8->field_0x84 || fVar2 > field_0xbd8->field_0x84) { + if (fVar1 > field_0xbd8->ring_edge_movement || fVar2 > field_0xbd8->ring_edge_movement) { player->setSumouPushFrontStop(); } @@ -3282,10 +3490,10 @@ bool daNpcWrestler_c::sumouTackleStagger(void* param_1) { } break; } + case 3: player->setSumouForceGraspCancel(); break; - default: JUT_ASSERT(4311, FALSE); break; @@ -3319,13 +3527,16 @@ bool daNpcWrestler_c::sumouTackleStaggerRelease(void* param_1) { case 3: break; + + default: + JUT_ASSERT(4355, FALSE); } return true; } /* 80B39554-80B39C18 00A3B4 06C4+00 1/0 0/0 0/0 .text sumouTacklePush__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::sumouTacklePush(void* param_1) { +bool daNpcWrestler_c::sumouTacklePush(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); int jointNo, jointNo2; f32 fVar1, fVar2; @@ -3356,17 +3567,17 @@ inline bool daNpcWrestler_c::sumouTacklePush(void* param_1) { fVar1 = player->getLeftFootPos().absXZ(mArenaPos); fVar2 = player->getRightFootPos().absXZ(mArenaPos); - if (fVar1 > field_0xbd8->field_0x80 || fVar2 > field_0xbd8->field_0x80) { + if (fVar1 > field_0xbd8->ring_edge_sound || fVar2 > field_0xbd8->ring_edge_sound) { Z2GetAudioMgr()->changeSubBgmStatus(3); } - if (fVar1 > field_0xbd8->field_0x84 || fVar2 > field_0xbd8->field_0x84) { + if (fVar1 > field_0xbd8->ring_edge_movement || fVar2 > field_0xbd8->ring_edge_movement) { player->setSumouPushFrontStop(); } sVar1 = cLib_targetAngleY(mArenaPos, *player->getViewerCurrentPosP()) - mCurAngle.y; - if (abs(sVar1) > field_0xbdc->field_0x28) { - sVar1 = (sVar1 > 0) ? field_0xbdc->field_0x28 : (s16) -field_0xbdc->field_0x28; + if (abs(sVar1) > field_0xbdc->bending_limit) { + sVar1 = (sVar1 > 0) ? field_0xbdc->bending_limit : (s16) -field_0xbdc->bending_limit; } player->setSumouPushBackDirection(sVar1); @@ -3402,9 +3613,10 @@ bool daNpcWrestler_c::sumouTackleRelease(void* param_1) { field_0xe96 = 2; break; - case 2: + case 2: { correctGraspPosAngle(true); - if (mpMorf->getFrame() >= 23.0f && mpMorf->getFrame() <= 34.0f) { + f32 frame = mpMorf->getFrame(); + if (frame >= 23.0f && frame <= 34.0f) { int jointNo = mType == 0 ? 0x1A : 0x18; int jointNo2 = mType == 0 ? 0x1E : 0x1B; cXyz sp3c; @@ -3428,6 +3640,7 @@ bool daNpcWrestler_c::sumouTackleRelease(void* param_1) { setAction(&daNpcWrestler_c::sumouWait); } break; + } case 3: if (mType != 0) { @@ -3435,12 +3648,15 @@ bool daNpcWrestler_c::sumouTackleRelease(void* param_1) { mActorMngr[0].entry(daPy_getPlayerActorClass()); } break; + + default: + JUT_ASSERT(4506, FALSE); } return true; } -inline void daNpcWrestler_c::initDemoCamera_ReadyLink() { +void daNpcWrestler_c::initDemoCamera_ReadyLink() { field_0xe5e = mArenaAngle; mDemoCamFovy = dCam_getBody()->Fovy(); field_0xe54 = 0.0f; @@ -3454,7 +3670,7 @@ inline void daNpcWrestler_c::initDemoCamera_ReadyLink() { mDoMtx_stack_c::multVec(&mDemoCam.mDemoCamCenter, &mDemoCam.mDemoCamCenter); } -inline void daNpcWrestler_c::initDemoCamera_ReadyWrestler() { +void daNpcWrestler_c::initDemoCamera_ReadyWrestler() { field_0xe5e = mArenaAngle + 0x8000; mDemoCamFovy = dCam_getBody()->Fovy(); field_0xe54 = 0.0f; @@ -3470,7 +3686,7 @@ inline void daNpcWrestler_c::initDemoCamera_ReadyWrestler() { } /* 80B39F88-80B3AE24 00ADE8 0E9C+00 2/0 0/0 0/0 .text demoSumouReady__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::demoSumouReady(void* param_1) { +bool daNpcWrestler_c::demoSumouReady(void* param_1) { dCamera_c* camBody = dCam_getBody(); bool dbg_0x9 = false; @@ -3747,7 +3963,6 @@ bool daNpcWrestler_c::demoSumouWin(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); dCamera_c* camBody = dCam_getBody(); f32 fVar1; - int iVar1; switch (field_0xe96) { case 0: @@ -3786,9 +4001,7 @@ bool daNpcWrestler_c::demoSumouWin(void* param_1) { break; case 1: - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 <= 0) { + if (field_0xe80-- <= 0) { camBody->Stop(); camBody->SetTrimSize(2); field_0xe84++; @@ -3834,11 +4047,10 @@ bool daNpcWrestler_c::demoSumouWin(void* param_1) { } break; - case 3: - if (cLib_addCalc(&mDemoCam.mDemoCamCenter.y, mDemoCam.field_0x18.y, 0.04f, 10.0f, 0.9f) == 0.0f) { - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 <= 0) { + case 3: { + f32 add_calc = cLib_addCalc(&mDemoCam.mDemoCamCenter.y, mDemoCam.field_0x18.y, 0.04f, 10.0f, 0.9f); + if (add_calc == 0.0f) { + if (field_0xe80-- <= 0) { camBody->Reset(mDemoCam.mDemoCamCenter, mDemoCam.mDemoCamEye); camBody->Start(); camBody->SetTrimSize(0); @@ -3848,6 +4060,10 @@ bool daNpcWrestler_c::demoSumouWin(void* param_1) { } } break; + } + + default: + JUT_ASSERT(4952, FALSE); } if (field_0xe84 > 0) { @@ -3858,6 +4074,9 @@ bool daNpcWrestler_c::demoSumouWin(void* param_1) { case 3: field_0xe99 = 1; break; + + default: + JUT_ASSERT(4966, FALSE); } return true; @@ -3867,7 +4086,6 @@ bool daNpcWrestler_c::demoSumouWin(void* param_1) { bool daNpcWrestler_c::demoSumouLose(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); dCamera_c* camBody = dCam_getBody(); - int iVar1; f32 fVar1, fVar2, fVar3; switch (field_0xe96) { @@ -3934,9 +4152,7 @@ bool daNpcWrestler_c::demoSumouLose(void* param_1) { } } - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 <= 0) { + if (field_0xe80-- <= 0) { int joint_no = mType == 0 ? 2 : 2; fVar1 = cLib_addCalcPos(&mDemoCam.mDemoCamCenter, getJointPos(joint_no), 0.1f, 50.0f, 1.0f); fVar2 = cLib_addCalc(&mDemoCam.mDemoCamEye.y, mDemoCam.field_0x24.y, 0.05f, 50.0f, 1.0f); @@ -3962,11 +4178,10 @@ bool daNpcWrestler_c::demoSumouLose(void* param_1) { field_0xe80 = 20; field_0xe84++; // fallthrough - case 3: - if (cLib_addCalc(&mDemoCam.mDemoCamCenter.y, mDemoCam.field_0x18.y, 0.04f, 10.0f, 0.2f) == 0.0f) { - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 <= 0) { + case 3: { + f32 add_calc = cLib_addCalc(&mDemoCam.mDemoCamCenter.y, mDemoCam.field_0x18.y, 0.04f, 10.0f, 0.2f); + if (add_calc == 0.0f) { + if (field_0xe80-- <= 0) { player->changeDemoMode(1, 0, 0, 0); camBody->Reset(mDemoCam.mDemoCamCenter, mDemoCam.mDemoCamEye); camBody->Start(); @@ -3982,6 +4197,10 @@ bool daNpcWrestler_c::demoSumouLose(void* param_1) { } } break; + } + + default: + JUT_ASSERT(5094, FALSE); } if (field_0xe84 > 0) { @@ -3992,6 +4211,9 @@ bool daNpcWrestler_c::demoSumouLose(void* param_1) { case 3: field_0xe99 = 1; break; + + default: + JUT_ASSERT(5102, FALSE); } return true; @@ -4002,7 +4224,6 @@ bool daNpcWrestler_c::demoSumouWin2(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); dCamera_c* camBody = dCam_getBody(); f32 fVar1; - int iVar1; switch (field_0xe96) { case 0: @@ -4071,11 +4292,10 @@ bool daNpcWrestler_c::demoSumouWin2(void* param_1) { } break; - case 2: - if (cLib_addCalc(&mDemoCam.mDemoCamCenter.y, mDemoCam.field_0x18.y, 0.04f, 10.0f, 0.9f) == 0.0f) { - iVar1 = field_0xe80; - field_0xe80--; - if (iVar1 <= 0) { + case 2: { + f32 add_calc = cLib_addCalc(&mDemoCam.mDemoCamCenter.y, mDemoCam.field_0x18.y, 0.04f, 10.0f, 0.9f); + if (add_calc == 0.0f) { + if (field_0xe80-- <= 0) { camBody->Reset(mDemoCam.mDemoCamCenter, mDemoCam.mDemoCamEye); camBody->Start(); camBody->SetTrimSize(0); @@ -4085,6 +4305,10 @@ bool daNpcWrestler_c::demoSumouWin2(void* param_1) { } } break; + } + + default: + JUT_ASSERT(5213, FALSE); } if (field_0xe84 > 0) { @@ -4096,6 +4320,9 @@ bool daNpcWrestler_c::demoSumouWin2(void* param_1) { case 3: field_0xe99 = 1; break; + + default: + JUT_ASSERT(5221, FALSE); } return true; @@ -4242,7 +4469,7 @@ bool daNpcWrestler_c::demoSumouLose2(void* param_1) { } /* 80B3CA2C-80B3D0C0 00D88C 0694+00 4/0 0/0 0/0 .text demoSumouUnilateralWin__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::demoSumouUnilateralWin(void* param_1) { +bool daNpcWrestler_c::demoSumouUnilateralWin(void* param_1) { daPy_py_c* player = daPy_getPlayerActorClass(); dCamera_c* camBody = dCam_getBody(); f32 fVar1; @@ -4364,7 +4591,7 @@ inline bool daNpcWrestler_c::demoSumouUnilateralWin(void* param_1) { } /* 80B3D0C0-80B3D584 00DF20 04C4+00 2/0 0/0 0/0 .text demoTalkAfterLose__15daNpcWrestler_cFPv */ -inline bool daNpcWrestler_c::demoTalkAfterLose(void* param_1) { +bool daNpcWrestler_c::demoTalkAfterLose(void* param_1) { bool retval = false; switch (field_0xe96) { case 0: @@ -4451,7 +4678,7 @@ inline bool daNpcWrestler_c::demoTalkAfterLose(void* param_1) { } /* 80B3D584-80B3DB50 00E3E4 05CC+00 3/0 0/0 0/0 .text EvCut_grDSEntry__15daNpcWrestler_cFi */ -inline BOOL daNpcWrestler_c::EvCut_grDSEntry(int i_cutIndex) { +BOOL daNpcWrestler_c::EvCut_grDSEntry(int i_cutIndex) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); int* cutName = (int*)eventManager.getMyNowCutName(i_cutIndex); @@ -4566,7 +4793,7 @@ inline BOOL daNpcWrestler_c::EvCut_grDSEntry(int i_cutIndex) { } /* 80B3DB50-80B3DCE8 00E9B0 0198+00 1/0 0/0 0/0 .text EvCut_grDSEntry2__15daNpcWrestler_cFi */ -inline BOOL daNpcWrestler_c::EvCut_grDSEntry2(int i_cutIndex) { +BOOL daNpcWrestler_c::EvCut_grDSEntry2(int i_cutIndex) { dEvent_manager_c& eventManager = dComIfGp_getEventManager(); int* cutName = (int*)eventManager.getMyNowCutName(i_cutIndex); @@ -4606,14 +4833,14 @@ inline BOOL daNpcWrestler_c::EvCut_grDSEntry2(int i_cutIndex) { /* 80B3DCE8-80B3E0FC 00EB48 0414+00 2/0 0/0 0/0 .text EvCut_grDSEntry3_4__15daNpcWrestler_cFi */ BOOL daNpcWrestler_c::EvCut_grDSEntry3_4(int i_cutIndex) { - dEvent_manager_c* eventManager = dComIfGp_getPEvtManager(); - int* cutName = (int*)eventManager->getMyNowCutName(i_cutIndex); + dEvent_manager_c& eventManager = dComIfGp_getEventManager(); + int* cutName = (int*)eventManager.getMyNowCutName(i_cutIndex); if (cutName == NULL) { return FALSE; } - if (eventManager->getIsAddvance(i_cutIndex)){ + if (eventManager.getIsAddvance(i_cutIndex)){ switch (*cutName) { case '0001': setLookMode(3); @@ -4622,6 +4849,9 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry3_4(int i_cutIndex) { initTalkAngle(); mMsgTimer = 0; break; + + default: + JUT_ASSERT(5766, FALSE); } } @@ -4639,23 +4869,27 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry3_4(int i_cutIndex) { switch (*cutName) { case '0001': if (setTalkAngle() && talkProc(NULL, TRUE, NULL)) { - #ifdef DEBUG + s16 choice_no = mFlow.getChoiceNo(); +#ifdef DEBUG char* choice; - if (mFlow.getChoiceNo() == 0) { + if (choice_no == 0) { choice = "はい"; } else { choice = "いいえ"; } OS_REPORT("二択分岐 %s\n", choice); - #endif +#endif - if (mFlow.getChoiceNo() == 0) { + if (choice_no == 0) { mOrderEvtNo = 5; changeEvent(l_resName[mType], l_evtNames[mOrderEvtNo], 1, 0xFFFF); } return TRUE; } break; + + default: + JUT_ASSERT(5800, FALSE); } return FALSE; @@ -4663,10 +4897,10 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry3_4(int i_cutIndex) { /* 80B3E0FC-80B3E584 00EF5C 0488+00 1/0 0/0 0/0 .text EvCut_grDSEntry5__15daNpcWrestler_cFi */ BOOL daNpcWrestler_c::EvCut_grDSEntry5(int i_cutIndex) { - dEvent_manager_c* eventManager = dComIfGp_getPEvtManager(); - int* cutName = (int*)eventManager->getMyNowCutName(i_cutIndex); + dEvent_manager_c& eventManager = dComIfGp_getEventManager(); + int* cutName = (int*)eventManager.getMyNowCutName(i_cutIndex); - if (eventManager->getIsAddvance(i_cutIndex)) { + if (eventManager.getIsAddvance(i_cutIndex)) { switch (*cutName) { case '0001': case '0002': @@ -4676,12 +4910,17 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry5(int i_cutIndex) { initTalkAngle(); mMsgTimer = 0; break; + + default: + JUT_ASSERT(5830, FALSE); } } int iVar1 = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, FALSE) != 0) { + // The following is to force dbg asm stack to use r31: + int unused; setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (iVar1 && mMsgTimer == 0) { @@ -4691,7 +4930,7 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry5(int i_cutIndex) { switch (*cutName) { case '0001': return TRUE; - + case '0002': if (setTalkAngle() && talkProc(NULL, TRUE, NULL)) { mItemNo = 3; @@ -4701,6 +4940,11 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry5(int i_cutIndex) { mEventIdx = -1; return TRUE; } + + break; + + default: + JUT_ASSERT(5867, FALSE); } return FALSE; @@ -4708,12 +4952,12 @@ BOOL daNpcWrestler_c::EvCut_grDSEntry5(int i_cutIndex) { /* 80B3E584-80B3EA2C 00F3E4 04A8+00 1/0 0/0 0/0 .text EvCut_grDSLose__15daNpcWrestler_cFi */ BOOL daNpcWrestler_c::EvCut_grDSLose(int i_cutIndex) { - dEvent_manager_c* eventManager = dComIfGp_getPEvtManager(); - int* cutName = (int*)eventManager->getMyNowCutName(i_cutIndex); + dEvent_manager_c& eventManager = dComIfGp_getEventManager(); + int* cutName = (int*)eventManager.getMyNowCutName(i_cutIndex); int* piVar1; cXyz* pcVar1; - if (eventManager->getIsAddvance(i_cutIndex)) { + if (eventManager.getIsAddvance(i_cutIndex)) { switch (*cutName) { case '0001': break; @@ -4741,12 +4985,17 @@ BOOL daNpcWrestler_c::EvCut_grDSLose(int i_cutIndex) { initTalkAngle(); mMsgTimer = 0; break; + + default: + JUT_ASSERT(5909, FALSE); } } int iVar1 = mMsgTimer; int i_expression, i_motion; if (ctrlMsgAnm(i_expression, i_motion, this, FALSE) != 0) { + // The following is to force dbg asm stack to use r31: + int unused; setExpression(i_expression, -1.0f); setMotion(i_motion, -1.0f, 0); } else if (iVar1 != 0 && mMsgTimer == 0) { @@ -4765,6 +5014,9 @@ BOOL daNpcWrestler_c::EvCut_grDSLose(int i_cutIndex) { return TRUE; } break; + + default: + JUT_ASSERT(5942, FALSE); } return FALSE; @@ -4772,27 +5024,23 @@ BOOL daNpcWrestler_c::EvCut_grDSLose(int i_cutIndex) { /* 80B3EA2C-80B3EA4C 00F88C 0020+00 1/0 0/0 0/0 .text daNpcWrestler_Create__FPv */ static int daNpcWrestler_Create(void* a_this) { - daNpcWrestler_c* i_this = (daNpcWrestler_c*)a_this; - return i_this->Create(); + return ((daNpcWrestler_c*)a_this)->Create(); } /* 80B3EA4C-80B3EA6C 00F8AC 0020+00 1/0 0/0 0/0 .text daNpcWrestler_Delete__FPv */ static int daNpcWrestler_Delete(void* a_this) { - daNpcWrestler_c* i_this = (daNpcWrestler_c*)a_this; - return i_this->Delete(); + return ((daNpcWrestler_c*)a_this)->Delete(); } /* 80B3EA6C-80B3EA8C 00F8CC 0020+00 1/0 0/0 0/0 .text daNpcWrestler_Execute__FPv */ static int daNpcWrestler_Execute(void* a_this) { - daNpcWrestler_c* i_this = (daNpcWrestler_c*)a_this; - return i_this->Execute(); + return ((daNpcWrestler_c*)a_this)->Execute(); } /* 80B3EA8C-80B3EAAC 00F8EC 0020+00 1/0 0/0 0/0 .text daNpcWrestler_Draw__FPv */ static int daNpcWrestler_Draw(void* a_this) { - daNpcWrestler_c* i_this = (daNpcWrestler_c*)a_this; - return i_this->Draw(); + return ((daNpcWrestler_c*)a_this)->Draw(); } /* 80B3EAAC-80B3EAB4 00F90C 0008+00 1/0 0/0 0/0 .text daNpcWrestler_IsDelete__FPv */ @@ -4801,10 +5049,14 @@ static int daNpcWrestler_IsDelete(void* a_this) { } /* 80B3EAE4-80B3EB94 00F944 00B0+00 1/0 0/0 0/0 .text setParam__15daNpcWrestler_cFv */ -inline void daNpcWrestler_c::setParam() { - attention_info.distances[fopAc_attn_LOCK_e] = getDistTableIdx(5, 6); +void daNpcWrestler_c::setParam() { + s16 reg_r30 = 5; + s16 reg_r29 = 6; + s16 reg_r28 = 3; + s16 reg_r27 = 6; + attention_info.distances[fopAc_attn_LOCK_e] = getDistTableIdx(reg_r30, reg_r29); attention_info.distances[fopAc_attn_TALK_e] = attention_info.distances[fopAc_attn_LOCK_e]; - attention_info.distances[fopAc_attn_SPEAK_e] = getDistTableIdx(3, 6); + attention_info.distances[fopAc_attn_SPEAK_e] = getDistTableIdx(reg_r28, reg_r27); attention_info.flags = fopAc_AttnFlag_SPEAK_e | fopAc_AttnFlag_TALK_e; if (mType == 1 && daPy_py_c::checkNowWolf()) { @@ -4816,7 +5068,7 @@ inline void daNpcWrestler_c::setParam() { gravity = field_0xbd8->common.gravity; } -inline bool daNpcWrestler_c::selectAction() { +bool daNpcWrestler_c::selectAction() { actionFunc null_action = NULL; if (null_action != NULL && chkAction(null_action) == FALSE) { setAction(null_action); @@ -4827,7 +5079,7 @@ inline bool daNpcWrestler_c::selectAction() { } /* 80B3EF10-80B3FCE8 00FD70 0DD8+00 1/1 0/0 0/0 .text setWrestlerVoice__15daNpcWrestler_cFv */ -inline void daNpcWrestler_c::setWrestlerVoice() { +void daNpcWrestler_c::setWrestlerVoice() { J3DAnmTransform* anmTransform = mpMorf->getAnm(); if (mType == 0) { @@ -4970,7 +5222,7 @@ inline void daNpcWrestler_c::setWrestlerVoice() { } /* 80B3EB94-80B3EF10 00F9F4 037C+00 1/0 0/0 0/0 .text main__15daNpcWrestler_cFv */ -inline BOOL daNpcWrestler_c::main() { +BOOL daNpcWrestler_c::main() { if (!selectAction() && field_0xdcc != NULL) { (this->*field_0xdcc)(NULL); } @@ -4987,14 +5239,11 @@ inline BOOL daNpcWrestler_c::main() { } /* 80B404FC-80B405E8 01135C 00EC+00 1/0 0/0 0/0 .text ctrlBtk__15daNpcWrestler_cFv */ -inline BOOL daNpcWrestler_c::ctrlBtk() { - J3DAnmTextureSRTKey* btkAnm; +BOOL daNpcWrestler_c::ctrlBtk() { if (mpMatAnm != NULL) { - if (field_0xe04->btk_list->fileIdx >= 0) { - btkAnm = (J3DAnmTextureSRTKey*)getTexSRTKeyAnmP(l_resName[mType], field_0xe04->btk_list->fileIdx); - } else { - btkAnm = NULL; - } + J3DAnmTextureSRTKey* btkAnm = (field_0xe04->btk_list->fileIdx >= 0) + ? (J3DAnmTextureSRTKey*)getTexSRTKeyAnmP(l_resName[mType], field_0xe04->btk_list->fileIdx) + : NULL; if (btkAnm == mBtkAnm.getBtkAnm()) { mpMatAnm->setNowOffsetX(cM_ssin(mEyeAngle.y) * 0.2f * -1.0f); @@ -5010,12 +5259,12 @@ inline BOOL daNpcWrestler_c::ctrlBtk() { } /* 80B40D1C-80B40D24 011B7C 0008+00 1/0 0/0 0/0 .text drawDbgInfo__15daNpcWrestler_cFv */ -inline BOOL daNpcWrestler_c::drawDbgInfo() { +BOOL daNpcWrestler_c::drawDbgInfo() { return FALSE; } /* 80B40D24-80B40D28 011B84 0004+00 1/0 0/0 0/0 .text drawOtherMdls__15daNpcWrestler_cFv */ -inline void daNpcWrestler_c::drawOtherMdls() { +void daNpcWrestler_c::drawOtherMdls() { /* empty function */ }