diff --git a/config/GZ2J01/rels/d_a_obj_thdoor/symbols.txt b/config/GZ2J01/rels/d_a_obj_thdoor/symbols.txt index 458820c379..e101ef7787 100644 --- a/config/GZ2J01/rels/d_a_obj_thdoor/symbols.txt +++ b/config/GZ2J01/rels/d_a_obj_thdoor/symbols.txt @@ -64,4 +64,4 @@ __vt__10dCcD_GStts = .data:0x00000138; // type:object size:0xC scope:global __vt__8cM3dGAab = .data:0x00000144; // type:object size:0xC scope:global __vt__8cM3dGCyl = .data:0x00000150; // type:object size:0xC scope:global __vt__13daObjThDoor_c = .data:0x0000015C; // type:object size:0x28 scope:global -init$1622 = .bss:0x00000000; // type:object size:0x1 data:byte scope:local +init$1622 = .bss:0x00000000; // type:object size:0x1 scope:local data:byte diff --git a/config/GZ2J01/rels/d_a_obj_toby/symbols.txt b/config/GZ2J01/rels/d_a_obj_toby/symbols.txt index 6a074d0c9b..c2622d509a 100644 --- a/config/GZ2J01/rels/d_a_obj_toby/symbols.txt +++ b/config/GZ2J01/rels/d_a_obj_toby/symbols.txt @@ -98,7 +98,7 @@ __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:globa @1012 = .bss:0x0000003C; // type:object size:0x1 scope:local @1010 = .bss:0x00000040; // type:object size:0x1 scope:local @1009 = .bss:0x00000044; // type:object size:0x1 scope:local -l_HIOInit = .bss:0x00000045; // type:object size:0x1 data:byte scope:local +l_HIOInit = .bss:0x00000045; // type:object size:0x1 scope:local data:byte @3801 = .bss:0x00000048; // type:object size:0xC scope:local l_HIO = .bss:0x00000054; // type:object size:0xC scope:local data:byte hz_check_pos_x = .bss:0x00000060; // type:object size:0x4 scope:local align:4 data:float diff --git a/config/GZ2J01/rels/d_a_obj_tobyhouse/symbols.txt b/config/GZ2J01/rels/d_a_obj_tobyhouse/symbols.txt index fca66da497..73a2e017df 100644 --- a/config/GZ2J01/rels/d_a_obj_tobyhouse/symbols.txt +++ b/config/GZ2J01/rels/d_a_obj_tobyhouse/symbols.txt @@ -89,7 +89,7 @@ __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:globa @1012 = .bss:0x0000003C; // type:object size:0x1 scope:local @1010 = .bss:0x00000040; // type:object size:0x1 scope:local @1009 = .bss:0x00000044; // type:object size:0x1 scope:local -init$1832 = .bss:0x00000045; // type:object size:0x1 data:byte scope:local +init$1832 = .bss:0x00000045; // type:object size:0x1 scope:local data:byte @4351 = .bss:0x00000048; // type:object size:0xC scope:local l_shotSmokeScale$4350 = .bss:0x00000058; // type:object size:0xC scope:local sInstance__40JASGlobalInstance<19JASDefaultBankTable> = .bss:0x00000064; // type:object size:0x4 scope:global diff --git a/config/GZ2J01/rels/d_a_obj_togeTrap/symbols.txt b/config/GZ2J01/rels/d_a_obj_togeTrap/symbols.txt index 391c756d04..19351ce637 100644 --- a/config/GZ2J01/rels/d_a_obj_togeTrap/symbols.txt +++ b/config/GZ2J01/rels/d_a_obj_togeTrap/symbols.txt @@ -78,4 +78,4 @@ __vt__14mDoHIO_entry_c = .data:0x00000184; // type:object size:0xC scope:global __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global @3647 = .bss:0x00000008; // type:object size:0xC scope:local l_HIO = .bss:0x00000014; // type:object size:0x20 scope:local align:4 data:float -init$1675 = .bss:0x00000034; // type:object size:0x1 data:byte scope:local +init$1675 = .bss:0x00000034; // type:object size:0x1 scope:local data:byte diff --git a/config/GZ2J01/rels/d_a_obj_tombo/symbols.txt b/config/GZ2J01/rels/d_a_obj_tombo/symbols.txt index fb642bbc7b..0447e763cc 100644 --- a/config/GZ2J01/rels/d_a_obj_tombo/symbols.txt +++ b/config/GZ2J01/rels/d_a_obj_tombo/symbols.txt @@ -109,6 +109,6 @@ __vt__14dBgS_ObjGndChk = .data:0x000000A4; // type:object size:0x30 scope:global __vt__12J3DFrameCtrl = .data:0x000000D4; // type:object size:0xC scope:global __vt__14daObj_TomHIO_c = .data:0x000000E0; // type:object size:0xC scope:global __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -l_HIOInit = .bss:0x00000008; // type:object size:0x1 data:byte scope:local +l_HIOInit = .bss:0x00000008; // type:object size:0x1 scope:local data:byte @3770 = .bss:0x0000000C; // type:object size:0xC scope:local l_HIO = .bss:0x00000018; // type:object size:0x14 scope:global align:4 data:float diff --git a/config/GZ2J01/rels/d_a_obj_volcbom/symbols.txt b/config/GZ2J01/rels/d_a_obj_volcbom/symbols.txt index 3fca5d457b..39a023a402 100644 --- a/config/GZ2J01/rels/d_a_obj_volcbom/symbols.txt +++ b/config/GZ2J01/rels/d_a_obj_volcbom/symbols.txt @@ -122,5 +122,5 @@ __vt__8cM3dGAab = .data:0x000001F0; // type:object size:0xC scope:global __vt__12dBgS_ObjAcch = .data:0x000001FC; // type:object size:0x24 scope:global __vt__12J3DFrameCtrl = .data:0x00000220; // type:object size:0xC scope:global __vt__14daObjVolcBom_c = .data:0x0000022C; // type:object size:0x28 scope:global -init$1712 = .bss:0x00000000; // type:object size:0x1 data:byte scope:local -init$2146 = .bss:0x00000001; // type:object size:0x1 data:byte scope:local +init$1712 = .bss:0x00000000; // type:object size:0x1 scope:local data:byte +init$2146 = .bss:0x00000001; // type:object size:0x1 scope:local data:byte diff --git a/config/GZ2P01/rels/d_a_obj_thdoor/symbols.txt b/config/GZ2P01/rels/d_a_obj_thdoor/symbols.txt index 458820c379..e101ef7787 100644 --- a/config/GZ2P01/rels/d_a_obj_thdoor/symbols.txt +++ b/config/GZ2P01/rels/d_a_obj_thdoor/symbols.txt @@ -64,4 +64,4 @@ __vt__10dCcD_GStts = .data:0x00000138; // type:object size:0xC scope:global __vt__8cM3dGAab = .data:0x00000144; // type:object size:0xC scope:global __vt__8cM3dGCyl = .data:0x00000150; // type:object size:0xC scope:global __vt__13daObjThDoor_c = .data:0x0000015C; // type:object size:0x28 scope:global -init$1622 = .bss:0x00000000; // type:object size:0x1 data:byte scope:local +init$1622 = .bss:0x00000000; // type:object size:0x1 scope:local data:byte diff --git a/config/GZ2P01/rels/d_a_obj_toby/symbols.txt b/config/GZ2P01/rels/d_a_obj_toby/symbols.txt index ae85d28c6e..9583ab8c84 100644 --- a/config/GZ2P01/rels/d_a_obj_toby/symbols.txt +++ b/config/GZ2P01/rels/d_a_obj_toby/symbols.txt @@ -98,7 +98,7 @@ __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:globa @1012 = .bss:0x0000003C; // type:object size:0x1 scope:local @1010 = .bss:0x00000040; // type:object size:0x1 scope:local @1009 = .bss:0x00000044; // type:object size:0x1 scope:local -l_HIOInit = .bss:0x00000045; // type:object size:0x1 data:byte scope:local +l_HIOInit = .bss:0x00000045; // type:object size:0x1 scope:local data:byte @3801 = .bss:0x00000048; // type:object size:0xC scope:local l_HIO = .bss:0x00000054; // type:object size:0xC scope:local data:byte hz_check_pos_x = .bss:0x00000060; // type:object size:0x4 scope:local align:4 data:float diff --git a/config/GZ2P01/rels/d_a_obj_tobyhouse/symbols.txt b/config/GZ2P01/rels/d_a_obj_tobyhouse/symbols.txt index fca66da497..73a2e017df 100644 --- a/config/GZ2P01/rels/d_a_obj_tobyhouse/symbols.txt +++ b/config/GZ2P01/rels/d_a_obj_tobyhouse/symbols.txt @@ -89,7 +89,7 @@ __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:globa @1012 = .bss:0x0000003C; // type:object size:0x1 scope:local @1010 = .bss:0x00000040; // type:object size:0x1 scope:local @1009 = .bss:0x00000044; // type:object size:0x1 scope:local -init$1832 = .bss:0x00000045; // type:object size:0x1 data:byte scope:local +init$1832 = .bss:0x00000045; // type:object size:0x1 scope:local data:byte @4351 = .bss:0x00000048; // type:object size:0xC scope:local l_shotSmokeScale$4350 = .bss:0x00000058; // type:object size:0xC scope:local sInstance__40JASGlobalInstance<19JASDefaultBankTable> = .bss:0x00000064; // type:object size:0x4 scope:global diff --git a/config/GZ2P01/rels/d_a_obj_togeTrap/symbols.txt b/config/GZ2P01/rels/d_a_obj_togeTrap/symbols.txt index 391c756d04..19351ce637 100644 --- a/config/GZ2P01/rels/d_a_obj_togeTrap/symbols.txt +++ b/config/GZ2P01/rels/d_a_obj_togeTrap/symbols.txt @@ -78,4 +78,4 @@ __vt__14mDoHIO_entry_c = .data:0x00000184; // type:object size:0xC scope:global __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global @3647 = .bss:0x00000008; // type:object size:0xC scope:local l_HIO = .bss:0x00000014; // type:object size:0x20 scope:local align:4 data:float -init$1675 = .bss:0x00000034; // type:object size:0x1 data:byte scope:local +init$1675 = .bss:0x00000034; // type:object size:0x1 scope:local data:byte diff --git a/config/GZ2P01/rels/d_a_obj_tombo/symbols.txt b/config/GZ2P01/rels/d_a_obj_tombo/symbols.txt index fb642bbc7b..0447e763cc 100644 --- a/config/GZ2P01/rels/d_a_obj_tombo/symbols.txt +++ b/config/GZ2P01/rels/d_a_obj_tombo/symbols.txt @@ -109,6 +109,6 @@ __vt__14dBgS_ObjGndChk = .data:0x000000A4; // type:object size:0x30 scope:global __vt__12J3DFrameCtrl = .data:0x000000D4; // type:object size:0xC scope:global __vt__14daObj_TomHIO_c = .data:0x000000E0; // type:object size:0xC scope:global __global_destructor_chain = .bss:0x00000000; // type:object size:0x4 scope:global -l_HIOInit = .bss:0x00000008; // type:object size:0x1 data:byte scope:local +l_HIOInit = .bss:0x00000008; // type:object size:0x1 scope:local data:byte @3770 = .bss:0x0000000C; // type:object size:0xC scope:local l_HIO = .bss:0x00000018; // type:object size:0x14 scope:global align:4 data:float diff --git a/config/GZ2P01/rels/d_a_obj_volcbom/symbols.txt b/config/GZ2P01/rels/d_a_obj_volcbom/symbols.txt index e6a48fec7d..d4bc0a61ad 100644 --- a/config/GZ2P01/rels/d_a_obj_volcbom/symbols.txt +++ b/config/GZ2P01/rels/d_a_obj_volcbom/symbols.txt @@ -122,5 +122,5 @@ __vt__8cM3dGAab = .data:0x000001F0; // type:object size:0xC scope:global __vt__12dBgS_ObjAcch = .data:0x000001FC; // type:object size:0x24 scope:global __vt__12J3DFrameCtrl = .data:0x00000220; // type:object size:0xC scope:global __vt__14daObjVolcBom_c = .data:0x0000022C; // type:object size:0x28 scope:global -init$1712 = .bss:0x00000000; // type:object size:0x1 data:byte scope:local -init$2146 = .bss:0x00000001; // type:object size:0x1 data:byte scope:local +init$1712 = .bss:0x00000000; // type:object size:0x1 scope:local data:byte +init$2146 = .bss:0x00000001; // type:object size:0x1 scope:local data:byte diff --git a/configure.py b/configure.py index d49b5c6d3a..b01e941a72 100755 --- a/configure.py +++ b/configure.py @@ -1545,7 +1545,7 @@ config.libs = [ ActorRel(Equivalent, "d_a_e_dn"), # weak func order ActorRel(Equivalent, "d_a_e_fm"), ActorRel(MatchingFor("GZ2E01"), "d_a_e_ga"), - ActorRel(NonMatching, "d_a_e_hb"), + ActorRel(Equivalent, "d_a_e_hb"), ActorRel(MatchingFor("GZ2E01"), "d_a_e_nest"), ActorRel(Equivalent, "d_a_e_rd"), ActorRel(MatchingFor("GZ2E01"), "d_a_econt"), diff --git a/include/d/actor/d_a_e_hb.h b/include/d/actor/d_a_e_hb.h index 86e1915c67..a826621cbf 100644 --- a/include/d/actor/d_a_e_hb.h +++ b/include/d/actor/d_a_e_hb.h @@ -1,6 +1,10 @@ #ifndef D_A_E_HB_H #define D_A_E_HB_H + #include "f_op/f_op_actor_mng.h" +#include "d/d_bg_s_acch.h" +#include "d/d_cc_d.h" +#include "d/d_cc_uty.h" /** * @ingroup actors-enemies @@ -10,16 +14,81 @@ * @details * */ -class e_hb_class : public fopEn_enemy_c { -private: - /* 0x5ac */ u8 field_0x5ac[0x1268 - 0x5ac]; +class e_hb_class { +public: + /* 0x0000 */ fopEn_enemy_c enemy; + /* 0x05AC */ request_of_phase_process_class phase; + /* 0x05B4 */ u8 arg0; + /* 0x05B5 */ u8 arg3; + /* 0x05B6 */ u8 arg1; + /* 0x05B7 */ u8 arg2; + /* 0x05B8 */ mDoExt_McaMorfSO* modelMorf; + /* 0x05BC */ Z2CreatureEnemy sound; + /* 0x0660 */ int anm; + /* 0x0664 */ u32 shadowId; + /* 0x0668 */ s16 counter; + /* 0x066A */ s16 action; + /* 0x066C */ s16 mode; + /* 0x0670 */ f32 pl_search_range; + /* 0x0674 */ cXyz field_0x674; + /* 0x0680 */ s16 field_0x680; + /* 0x0682 */ u8 field_0x682[0x0684 - 0x0682]; + /* 0x0684 */ s16 angle_to_player; + /* 0x0688 */ f32 dist_to_player; + /* 0x068C */ s16 field_0x68c; + /* 0x0690 */ f32 field_0x690; + /* 0x0694 */ f32 size; + /* 0x0698 */ s16 timers[3]; + /* 0x069E */ s16 invulnerabilityTimer; + /* 0x06A0 */ cXyz field_0x6a0[12]; + /* 0x0730 */ csXyz field_0x730[12]; + /* 0x0778 */ J3DModel* thornModel[11]; + /* 0x07A4 */ u8 field_0x7A4[0x7D8 - 0x7A4]; + /* 0x07D8 */ f32 thorn_size[12]; + /* 0x0808 */ mDoExt_3DlineMat1_c stalkLine; + /* 0x0844 */ f32 field_0x844; + /* 0x0848 */ f32 field_0x848; + /* 0x084C */ f32 field_0x84c; + /* 0x0850 */ s8 field_0x850; + /* 0x0851 */ s8 field_0x851; + /* 0x0852 */ s8 field_0x852; + /* 0x0854 */ f32 field_0x854; + /* 0x0858 */ u8 field_0x858[0x860 - 0x858]; + /* 0x0860 */ dCcD_Stts ccStts; + /* 0x089C */ dCcD_Sph ccSph; + /* 0x09D4 */ dCcD_Sph atSph; + /* 0x0B0C */ s8 field_0xb0c; + /* 0x0B0D */ s8 field_0xb0d; + /* 0x0B10 */ dCcD_Sph kukiSph[4]; + /* 0x0FF0 */ dCcU_AtInfo atInfo; + /* 0x1014 */ dBgS_AcchCir acchcir; + /* 0x1054 */ dBgS_ObjAcch acch; + /* 0x122C */ u32 leaf_actor_id; + /* 0x1230 */ s8 field_0x1230; + /* 0x1231 */ s8 field_0x1231; + /* 0x1234 */ u32 field_0x1234[3]; + /* 0x1240 */ u32 field_0x1240; + /* 0x1244 */ u32 field_0x1244; + /* 0x1248 */ u32 field_0x1248; + /* 0x124C */ f32 field_0x124c; + /* 0x1250 */ u8 field_0x1250[0x1264 - 0x1250]; + /* 0x1264 */ u8 HIOInit; }; STATIC_ASSERT(sizeof(e_hb_class) == 0x1268); class daE_HB_HIO_c { +public: /* 804FBD6C */ daE_HB_HIO_c(); - /* 805005D0 */ ~daE_HB_HIO_c(); + /* 805005D0 */ virtual ~daE_HB_HIO_c() {} + + /* 0x04 */ s8 id; + /* 0x08 */ f32 base_size; + /* 0x0C */ f32 flower_size; + /* 0x10 */ f32 appear_size; + /* 0x14 */ s16 roof_reappear_interval; + /* 0x16 */ s16 attack_freq; + /* 0x18 */ u8 bite_pattern; }; diff --git a/include/d/actor/d_a_obj_carry.h b/include/d/actor/d_a_obj_carry.h index 5609c9f96a..933c541d11 100644 --- a/include/d/actor/d_a_obj_carry.h +++ b/include/d/actor/d_a_obj_carry.h @@ -290,10 +290,13 @@ public: field_0xdea = 1; } - static void make_prm(csXyz* param_1, u8 param_2, u8 param_3, u8 param_4, u8 param_5, - u8 param_6 = 0) { - param_1->x = (param_4 << 8) | param_3; - param_1->z = param_5 | (param_6 << 13) | ((u32(param_2) & 0xFF) << 1); + static void make_prm(u32* o_params, csXyz* o_paramsEx, u8 param_2, u8 i_itemNo, u8 i_itemBit, u8 i_itemType, u8 param_6) { + o_paramsEx->x = (i_itemBit << 8) | (i_itemNo & 0xFF); + o_paramsEx->z = (param_6 << 13) | (param_2 << 1) | i_itemType; + } + + static void make_prm_bokkuri(u32* o_params, csXyz* o_paramsEx, u8 i_itemNo, u8 i_itemBit, u8 i_itemType, u8 param_5) { + make_prm(o_params, o_paramsEx, 6, i_itemNo, i_itemBit, i_itemType, param_5); } static const daObjCarry_dt_t mData[]; diff --git a/include/d/d_com_inf_game.h b/include/d/d_com_inf_game.h index 04da6d3fef..1fdae3c74f 100644 --- a/include/d/d_com_inf_game.h +++ b/include/d/d_com_inf_game.h @@ -604,6 +604,7 @@ public: JKRArchive* getRubyArchive() { return mRubyArchive; } JKRArchive* getMeterButtonArchive() { return mMeterButtonArchive; } JKRArchive* getAllMapArchive() { return mAllMapArchive; } + JKRArchive* getCardIconResArchive() { return mCardIconResArchive; } void setFieldMapArchive2(JKRArchive* arc) { mFieldMapArchive2 = arc; } void setAnmArchive(JKRArchive* arc) { mAnmArchive = arc; } @@ -2293,6 +2294,10 @@ inline JKRArchive* dComIfGp_getMsgCommonArchive() { return g_dComIfG_gameInfo.play.getMsgCommonArchive(); } +inline JKRArchive* dComIfGp_getCardIconResArchive() { + return g_dComIfG_gameInfo.play.getCardIconResArchive(); +} + inline void dComIfGp_setFieldMapArchive2(JKRArchive* arc) { g_dComIfG_gameInfo.play.setFieldMapArchive2(arc); } diff --git a/include/d/d_s_logo.h b/include/d/d_s_logo.h index 6a796c14e5..200a6e8370 100644 --- a/include/d/d_s_logo.h +++ b/include/d/d_s_logo.h @@ -8,6 +8,7 @@ class JKRHeap; struct ResTIMG; class dDlst_2D_c; class mDoDvdThd_mountXArchive_c; +class mDoDvdThd_mountArchive_c; class mDoDvdThd_toMainRam_c; class dLog_HIO_c { @@ -68,6 +69,10 @@ public: /* 80258520 */ bool isProgressiveMode(); /* 8025854C */ void setRenderMode(); + #if VERSION == VERSION_GCN_PAL + u8 getPalLanguage(); + #endif + public: /* 0x1C4 */ request_of_phase_process_class field_0x1c4; /* 0x1CC */ mDoDvdThd_toMainRam_c* sceneCommand; @@ -82,6 +87,9 @@ public: /* 0x1F0 */ dDlst_2D_c* mProgressiveYes; /* 0x1F4 */ dDlst_2D_c* mProgressiveNo; /* 0x1F8 */ dDlst_2D_c* mProgressiveSel; +#if VERSION == VERSION_GCN_PAL + /* 0x1FC */ mDoDvdThd_mountArchive_c* mpPalLogoResCommand; +#endif /* 0x1FC */ request_of_phase_process_class* m_preLoad_dylPhase; /* 0x200 */ ResTIMG* mProgressivePro; /* 0x204 */ ResTIMG* mProgressiveInter; diff --git a/include/dolphin/os/OSRtc.h b/include/dolphin/os/OSRtc.h index ed3c3dd816..583043f4a4 100644 --- a/include/dolphin/os/OSRtc.h +++ b/include/dolphin/os/OSRtc.h @@ -21,6 +21,13 @@ extern "C" { #define OS_EURGB60_OFF 0 #define OS_EURGB60_ON 1 +#define OS_LANGUAGE_ENGLISH 0 +#define OS_LANGUAGE_GERMAN 1 +#define OS_LANGUAGE_FRENCH 2 +#define OS_LANGUAGE_SPANISH 3 +#define OS_LANGUAGE_ITALIAN 4 +#define OS_LANGUAGE_DUTCH 5 + typedef struct OSSram { u16 checkSum; u16 checkSumInv; diff --git a/include/f_op/f_op_actor_mng.h b/include/f_op/f_op_actor_mng.h index 8995430969..2b103073da 100644 --- a/include/f_op/f_op_actor_mng.h +++ b/include/f_op/f_op_actor_mng.h @@ -664,8 +664,8 @@ fopAc_ac_c* fopAcM_fastCreateItem(const cXyz* i_pos, int i_itemNo, int i_roomNo, f32* i_speedY, int i_itemBitNo, int param_9, createFunc i_createFunc); -fpc_ProcID fopAcM_createBokkuri(u16 i_setId, const cXyz* i_pos, int param_3, int param_4, - int i_roomNo, const cXyz* param_6, int param_7, int param_8); +fpc_ProcID fopAcM_createBokkuri(u16 i_setId, const cXyz* i_pos, int i_itemNo, int i_itemBit, + int i_roomNo, const cXyz* param_6, int i_itemType, int param_8); fpc_ProcID fopAcM_createWarpHole(const cXyz* i_pos, const csXyz* i_angle, int i_roomNo, u8 param_4, u8 param_5, u8 param_6); @@ -708,12 +708,6 @@ inline void make_prm_warp_hole(u32* o_params, u8 prm1, u8 prm2, u8 prm3) { *o_params = pprm2 | pprm3 | pprm1; } -inline void make_prm_bokkuri(u32* i_params, csXyz* i_angle, u8 param_2, u8 param_3, u8 param_4, - u8 param_5, u8 param_6) { - i_angle->x = (param_4 << 0x8) | (param_3 & 0xFF); - i_angle->z = (param_6 << 0xD) | (param_2 << 0x1) | param_5; -} - inline fopAc_ac_c* dComIfGp_getPlayer(int); inline s16 fopAcM_searchPlayerAngleY(const fopAc_ac_c* actor) { diff --git a/include/m_Do/m_Do_MemCard.h b/include/m_Do/m_Do_MemCard.h index 45d59322c6..8464766950 100644 --- a/include/m_Do/m_Do_MemCard.h +++ b/include/m_Do/m_Do_MemCard.h @@ -1,47 +1,70 @@ #ifndef M_DO_M_DO_MEMCARD_H #define M_DO_M_DO_MEMCARD_H -#include "card.h" +#include #include #include "global.h" +#define SAVEDATA_SIZE 0xA94 +#define SECTOR_SIZE 0x2000 +#define SAVEDATA_FILE_SIZE 0x8000 +#define SAVEDATA_VERSION 6 + class mDoMemCd_Ctrl_c { public: - enum CardCommand { - CARD_NO_COMMAND, - CARD_RESTORE, - CARD_STORE, - CARD_FORMAT, - CARD_ATTACH, - CARD_DETACH, + enum Command_e { + COMM_NONE_e, + COMM_RESTORE_e, + COMM_STORE_e, + COMM_FORMAT_e, + COMM_ATTACH_e, + COMM_DETACH_e, }; - /* 8001672C */ mDoMemCd_Ctrl_c(); - /* 80016730 */ void ThdInit(); - /* 800167D0 */ void main(); - /* 80016894 */ void update(); - /* 800169B4 */ void load(); - /* 80016A0C */ void restore(); - /* 80016AB0 */ s32 LoadSync(void*, u32, u32); - /* 80016B58 */ void save(void*, u32, u32); - /* 80016BD4 */ void store(); - /* 80016CE0 */ s32 SaveSync(); - /* 80016D74 */ u32 getStatus(u32); - /* 80016E58 */ void command_format(); - /* 80016EA8 */ void format(); - /* 80016F2C */ s32 FormatSync(); - /* 80016FB8 */ void attach(); - /* 800170B8 */ void command_attach(); - /* 80017110 */ void detach(); - /* 80017148 */ s32 mount(); - /* 80017274 */ s32 loadfile(); - /* 800172D4 */ s32 checkspace(); - /* 80017360 */ void setCardState(s32); + enum CardState_e { + CARD_STATE_NO_CARD_e, + CARD_STATE_READY_e, + CARD_STATE_NO_FILE_e, + CARD_STATE_READ_e, + CARD_STATE_WRITE_e, + CARD_STATE_FORMAT_e, + CARD_STATE_WRONG_ENCODING_e, + CARD_STATE_BROKEN_e, + CARD_STATE_INSSPACE_e, + CARD_STATE_NOENT_e, + CARD_STATE_WRONG_DEVICE_e, + CARD_STATE_WRONG_SECTORSIZE_e, + CARD_STATE_FATAL_ERROR_e, + CARD_STATE_13_e, + }; - bool isCardCommNone() { return mCardCommand == CARD_NO_COMMAND; } + mDoMemCd_Ctrl_c(); + + void ThdInit(); + void main(); + void update(); + void load(); + void restore(); + s32 LoadSync(void* i_buffer, u32 i_size, u32 i_position); + void save(void* i_buffer, u32 i_size, u32 i_position); + void store(); + s32 SaveSync(); + u32 getStatus(u32); + void command_format(); + void format(); + s32 FormatSync(); + void attach(); + void command_attach(); + void detach(); + s32 mount(); + s32 loadfile(); + s32 checkspace(); + void setCardState(s32); + + bool isCardCommNone() { return mCardCommand == COMM_NONE_e; } u8 getProbeStat() { return mProbeStat; } void clearProbeStat() { mProbeStat = 2; } - void setCopyToPos(u8 param_0) { mCopyToPos = param_0; } + void setCopyToPos(u8 i_pos) { mCopyToPos = i_pos; } u32 getDataVersion() { return mDataVersion; } void setDataVersion(u32 version) { mDataVersion = version; } void getCardStatus(s32 fileNo, CARDStat* stat) { CARDGetStatus(mChannel, fileNo, stat); } @@ -52,7 +75,7 @@ public: mSerialNo = serial_no; } - /* 0x0000 */ u8 mData[0x1FBC]; + /* 0x0000 */ u8 mData[SAVEDATA_SIZE * 3]; /* 0x1FBC */ u8 mChannel; /* 0x1FBD */ u8 mCopyToPos; /* 0x1FBE */ u8 mProbeStat; @@ -108,24 +131,24 @@ inline void mDoMemCd_Load() { g_mDoMemCd_control.load(); } -inline void mDoMemCd_setCopyToPos(u8 param_0) { - g_mDoMemCd_control.setCopyToPos(param_0); +inline void mDoMemCd_setCopyToPos(u8 i_pos) { + g_mDoMemCd_control.setCopyToPos(i_pos); } inline u32 mDoMemCd_getStatus(u8 param_0) { return g_mDoMemCd_control.getStatus(param_0); } -inline u32 mDoMemCd_LoadSync(void* buffer, u32 size, u32 index) { - return g_mDoMemCd_control.LoadSync(buffer, size, index); +inline u32 mDoMemCd_LoadSync(void* i_buffer, u32 i_size, u32 i_position) { + return g_mDoMemCd_control.LoadSync(i_buffer, i_size, i_position); } inline u32 mDoMemCd_getDataVersion() { return g_mDoMemCd_control.getDataVersion(); } -inline void mDoMemCd_setDataVersion(u32 version) { - g_mDoMemCd_control.setDataVersion(version); +inline void mDoMemCd_setDataVersion(u32 i_version) { + g_mDoMemCd_control.setDataVersion(i_version); } inline void mDoMemCd_setSerialNo() { diff --git a/include/m_Do/m_Do_MemCardRWmng.h b/include/m_Do/m_Do_MemCardRWmng.h index bfaf2a5cbf..d93e73a57c 100644 --- a/include/m_Do/m_Do_MemCardRWmng.h +++ b/include/m_Do/m_Do_MemCardRWmng.h @@ -1,9 +1,7 @@ #ifndef M_DO_M_DO_MEMCARDRWMNG_H #define M_DO_M_DO_MEMCARDRWMNG_H -#include "dolphin/types.h" - -typedef struct CARDFileInfo CARDFileInfo; +#include struct mDoMemCdRWm_HeaderData { /* 0x0000 */ u8 mBannerTexData[0xC00]; diff --git a/src/Z2AudioLib/Z2SeqMgr.cpp b/src/Z2AudioLib/Z2SeqMgr.cpp index c618323384..9d1bdcd82a 100644 --- a/src/Z2AudioLib/Z2SeqMgr.cpp +++ b/src/Z2AudioLib/Z2SeqMgr.cpp @@ -150,93 +150,89 @@ void Z2SeqMgr::bgmStop(u32 i_count, s32 param_1) { } } -/* ############################################################################################## */ -/* 8039BA08-8039BA08 028068 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_8039BA08 = "F_SP00"; -SECTION_DEAD static char const* const stringBase_8039BA0F = "F_SP103"; -SECTION_DEAD static char const* const stringBase_8039BA17 = "R_SP01"; -SECTION_DEAD static char const* const stringBase_8039BA1E = "F_SP104"; -SECTION_DEAD static char const* const stringBase_8039BA26 = "R_SP107"; -SECTION_DEAD static char const* const stringBase_8039BA2E = "F_SP108"; -SECTION_DEAD static char const* const stringBase_8039BA36 = "R_SP108"; -SECTION_DEAD static char const* const stringBase_8039BA3E = "F_SP117"; -SECTION_DEAD static char const* const stringBase_8039BA46 = "F_SP109"; -SECTION_DEAD static char const* const stringBase_8039BA4E = "R_SP109"; -SECTION_DEAD static char const* const stringBase_8039BA56 = "R_SP209"; -SECTION_DEAD static char const* const stringBase_8039BA5E = "F_SP110"; -SECTION_DEAD static char const* const stringBase_8039BA66 = "R_SP110"; -SECTION_DEAD static char const* const stringBase_8039BA6E = "F_SP111"; -SECTION_DEAD static char const* const stringBase_8039BA76 = "F_SP128"; -SECTION_DEAD static char const* const stringBase_8039BA7E = "R_SP128"; -SECTION_DEAD static char const* const stringBase_8039BA86 = "F_SP115"; -SECTION_DEAD static char const* const stringBase_8039BA8E = "F_SP112"; -SECTION_DEAD static char const* const stringBase_8039BA96 = "F_SP126"; -SECTION_DEAD static char const* const stringBase_8039BA9E = "F_SP127"; -SECTION_DEAD static char const* const stringBase_8039BAA6 = "R_SP127"; -SECTION_DEAD static char const* const stringBase_8039BAAE = "F_SP113"; -SECTION_DEAD static char const* const stringBase_8039BAB6 = "F_SP116"; -SECTION_DEAD static char const* const stringBase_8039BABE = "R_SP116"; -SECTION_DEAD static char const* const stringBase_8039BAC6 = "R_SP160"; -SECTION_DEAD static char const* const stringBase_8039BACE = "R_SP161"; -SECTION_DEAD static char const* const stringBase_8039BAD6 = "F_SP114"; -SECTION_DEAD static char const* const stringBase_8039BADE = "F_SP118"; -SECTION_DEAD static char const* const stringBase_8039BAE6 = "F_SP124"; -SECTION_DEAD static char const* const stringBase_8039BAEE = "F_SP125"; -SECTION_DEAD static char const* const stringBase_8039BAF6 = "F_SP121"; -SECTION_DEAD static char const* const stringBase_8039BAFE = "F_SP122"; -SECTION_DEAD static char const* const stringBase_8039BB06 = "F_SP123"; -SECTION_DEAD static char const* const stringBase_8039BB0E = "F_SP200"; -SECTION_DEAD static char const* const stringBase_8039BB16 = "F_SP102"; -SECTION_DEAD static char const* const stringBase_8039BB1E = ""; -SECTION_DEAD static char const* const stringBase_8039BB1F = "R_SP300"; -SECTION_DEAD static char const* const stringBase_8039BB27 = "R_SP301"; -SECTION_DEAD static char const* const stringBase_8039BB2F = "T_ENEMY"; -SECTION_DEAD static char const* const stringBase_8039BB37 = "D_MN54"; -SECTION_DEAD static char const* const stringBase_8039BB3E = "D_MN05"; -SECTION_DEAD static char const* const stringBase_8039BB45 = "D_MN05B"; -SECTION_DEAD static char const* const stringBase_8039BB4D = "D_MN05A"; -SECTION_DEAD static char const* const stringBase_8039BB55 = "D_MN04"; -SECTION_DEAD static char const* const stringBase_8039BB5C = "D_MN04B"; -SECTION_DEAD static char const* const stringBase_8039BB64 = "D_MN04A"; -SECTION_DEAD static char const* const stringBase_8039BB6C = "D_MN01"; -SECTION_DEAD static char const* const stringBase_8039BB73 = "D_MN01B"; -SECTION_DEAD static char const* const stringBase_8039BB7B = "D_MN01A"; -SECTION_DEAD static char const* const stringBase_8039BB83 = "D_MN10"; -SECTION_DEAD static char const* const stringBase_8039BB8A = "D_MN10B"; -SECTION_DEAD static char const* const stringBase_8039BB92 = "D_MN10A"; -SECTION_DEAD static char const* const stringBase_8039BB9A = "D_MN11"; -SECTION_DEAD static char const* const stringBase_8039BBA1 = "D_MN11B"; -SECTION_DEAD static char const* const stringBase_8039BBA9 = "D_MN11A"; -SECTION_DEAD static char const* const stringBase_8039BBB1 = "D_MN06"; -SECTION_DEAD static char const* const stringBase_8039BBB8 = "D_MN06B"; -SECTION_DEAD static char const* const stringBase_8039BBC0 = "D_MN06A"; -SECTION_DEAD static char const* const stringBase_8039BBC8 = "D_MN07"; -SECTION_DEAD static char const* const stringBase_8039BBCF = "D_MN07B"; -SECTION_DEAD static char const* const stringBase_8039BBD7 = "D_MN07A"; -SECTION_DEAD static char const* const stringBase_8039BBDF = "D_MN08"; -SECTION_DEAD static char const* const stringBase_8039BBE6 = "D_MN08B"; -SECTION_DEAD static char const* const stringBase_8039BBEE = "D_MN08C"; -SECTION_DEAD static char const* const stringBase_8039BBF6 = "D_MN08A"; -SECTION_DEAD static char const* const stringBase_8039BBFE = "D_MN08D"; -SECTION_DEAD static char const* const stringBase_8039BC06 = "D_MN09"; -SECTION_DEAD static char const* const stringBase_8039BC0D = "D_MN09A"; -SECTION_DEAD static char const* const stringBase_8039BC15 = "D_MN09B"; -SECTION_DEAD static char const* const stringBase_8039BC1D = "D_MN09C"; -SECTION_DEAD static char const* const stringBase_8039BC25 = "D_SB00"; -SECTION_DEAD static char const* const stringBase_8039BC2C = "D_SB01"; -SECTION_DEAD static char const* const stringBase_8039BC33 = "D_SB02"; -SECTION_DEAD static char const* const stringBase_8039BC3A = "D_SB03"; -SECTION_DEAD static char const* const stringBase_8039BC41 = "D_SB04"; -SECTION_DEAD static char const* const stringBase_8039BC48 = "D_SB05"; -SECTION_DEAD static char const* const stringBase_8039BC4F = "D_SB06"; -SECTION_DEAD static char const* const stringBase_8039BC56 = "D_SB07"; -SECTION_DEAD static char const* const stringBase_8039BC5D = "D_SB08"; -SECTION_DEAD static char const* const stringBase_8039BC64 = "D_SB09"; -SECTION_DEAD static char const* const stringBase_8039BC6B = "D_SB10"; -SECTION_DEAD static char const* const stringBase_8039BC72 = "force_start"; -#pragma pop +static void dummyString() { + DEAD_STRING("F_SP00"); + DEAD_STRING("F_SP103"); + DEAD_STRING("R_SP01"); + DEAD_STRING("F_SP104"); + DEAD_STRING("R_SP107"); + DEAD_STRING("F_SP108"); + DEAD_STRING("R_SP108"); + DEAD_STRING("F_SP117"); + DEAD_STRING("F_SP109"); + DEAD_STRING("R_SP109"); + DEAD_STRING("R_SP209"); + DEAD_STRING("F_SP110"); + DEAD_STRING("R_SP110"); + DEAD_STRING("F_SP111"); + DEAD_STRING("F_SP128"); + DEAD_STRING("R_SP128"); + DEAD_STRING("F_SP115"); + DEAD_STRING("F_SP112"); + DEAD_STRING("F_SP126"); + DEAD_STRING("F_SP127"); + DEAD_STRING("R_SP127"); + DEAD_STRING("F_SP113"); + DEAD_STRING("F_SP116"); + DEAD_STRING("R_SP116"); + DEAD_STRING("R_SP160"); + DEAD_STRING("R_SP161"); + DEAD_STRING("F_SP114"); + DEAD_STRING("F_SP118"); + DEAD_STRING("F_SP124"); + DEAD_STRING("F_SP125"); + DEAD_STRING("F_SP121"); + DEAD_STRING("F_SP122"); + DEAD_STRING("F_SP123"); + DEAD_STRING("F_SP200"); + DEAD_STRING("F_SP102"); + DEAD_STRING(""); + DEAD_STRING("R_SP300"); + DEAD_STRING("R_SP301"); + DEAD_STRING("T_ENEMY"); + DEAD_STRING("D_MN54"); + DEAD_STRING("D_MN05"); + DEAD_STRING("D_MN05B"); + DEAD_STRING("D_MN05A"); + DEAD_STRING("D_MN04"); + DEAD_STRING("D_MN04B"); + DEAD_STRING("D_MN04A"); + DEAD_STRING("D_MN01"); + DEAD_STRING("D_MN01B"); + DEAD_STRING("D_MN01A"); + DEAD_STRING("D_MN10"); + DEAD_STRING("D_MN10B"); + DEAD_STRING("D_MN10A"); + DEAD_STRING("D_MN11"); + DEAD_STRING("D_MN11B"); + DEAD_STRING("D_MN11A"); + DEAD_STRING("D_MN06"); + DEAD_STRING("D_MN06B"); + DEAD_STRING("D_MN06A"); + DEAD_STRING("D_MN07"); + DEAD_STRING("D_MN07B"); + DEAD_STRING("D_MN07A"); + DEAD_STRING("D_MN08"); + DEAD_STRING("D_MN08B"); + DEAD_STRING("D_MN08C"); + DEAD_STRING("D_MN08A"); + DEAD_STRING("D_MN08D"); + DEAD_STRING("D_MN09"); + DEAD_STRING("D_MN09A"); + DEAD_STRING("D_MN09B"); + DEAD_STRING("D_MN09C"); + DEAD_STRING("D_SB00"); + DEAD_STRING("D_SB01"); + DEAD_STRING("D_SB02"); + DEAD_STRING("D_SB03"); + DEAD_STRING("D_SB04"); + DEAD_STRING("D_SB05"); + DEAD_STRING("D_SB06"); + DEAD_STRING("D_SB07"); + DEAD_STRING("D_SB08"); + DEAD_STRING("D_SB09"); + DEAD_STRING("D_SB10"); +} /* 802AF49C-802AF884 2A9DDC 03E8+00 3/2 6/6 65/65 .text subBgmStart__8Z2SeqMgrFUl */ void Z2SeqMgr::subBgmStart(u32 i_bgmID) { diff --git a/src/d/actor/d_a_e_hb.cpp b/src/d/actor/d_a_e_hb.cpp index ed7e60dfb4..61028ef18e 100644 --- a/src/d/actor/d_a_e_hb.cpp +++ b/src/d/actor/d_a_e_hb.cpp @@ -4,1081 +4,1538 @@ */ #include "d/actor/d_a_e_hb.h" -#include "d/d_cc_d.h" -#include "dol2asm.h" +#include "d/actor/d_a_e_hb_leaf.h" + UNK_REL_DATA; #include "f_op/f_op_actor_enemy.h" +enum daE_HB_ACTION { + ACTION_STAY, + ACTION_APPEAR, + ACTION_APPEAR_V, + ACTION_WAIT, + ACTION_ATTACK, -// -// Forward References: -// - -extern "C" void __ct__12daE_HB_HIO_cFv(); -extern "C" static void anm_init__FP10e_hb_classifUcf(); -extern "C" static void leaf_anm_init__FP10e_hb_classifUcf(); -extern "C" static void daE_HB_Draw__FP10e_hb_class(); -extern "C" static void pl_check__FP10e_hb_classf(); -extern "C" static void damage_check__FP10e_hb_class(); -extern "C" static void e_hb_stay__FP10e_hb_class(); -extern "C" static void e_hb_appear__FP10e_hb_class(); -extern "C" static void e_hb_appear_v__FP10e_hb_class(); -extern "C" static void e_hb_wait__FP10e_hb_class(); -extern "C" static void e_hb_attack__FP10e_hb_class(); -extern "C" static void e_hb_chance__FP10e_hb_class(); -extern "C" static void e_hb_s_damage__FP10e_hb_class(); -extern "C" static void e_hb_damage__FP10e_hb_class(); -extern "C" static void kuki_control1__FP10e_hb_class(); -extern "C" static void kuki_control2__FP10e_hb_class(); -extern "C" static void kuki_control3__FP10e_hb_class(); -extern "C" static void kuki_ha_set__FP10e_hb_class(); -extern "C" static void action__FP10e_hb_class(); -extern "C" static void eff_set__FP10e_hb_classi(); -extern "C" static void anm_se_set__FP10e_hb_class(); -extern "C" static void daE_HB_Execute__FP10e_hb_class(); -extern "C" static bool daE_HB_IsDelete__FP10e_hb_class(); -extern "C" static void daE_HB_Delete__FP10e_hb_class(); -extern "C" static void useHeapInit__FP10fopAc_ac_c(); -extern "C" static void daE_HB_Create__FP10fopAc_ac_c(); -extern "C" void __dt__12dBgS_ObjAcchFv(); -extern "C" void __dt__12dBgS_AcchCirFv(); -extern "C" void __ct__8dCcD_SphFv(); -extern "C" void __dt__8dCcD_SphFv(); -extern "C" void __dt__8cM3dGSphFv(); -extern "C" void __dt__8cM3dGAabFv(); -extern "C" void __dt__10dCcD_GSttsFv(); -extern "C" void __ct__5csXyzFv(); -extern "C" void __ct__4cXyzFv(); -extern "C" void __dt__10cCcD_GSttsFv(); -extern "C" void __dt__12daE_HB_HIO_cFv(); -extern "C" void __sinit_d_a_e_hb_cpp(); -extern "C" static void func_80500654(); -extern "C" static void func_8050065C(); -extern "C" void __dt__5csXyzFv(); -extern "C" void __dt__4cXyzFv(); -extern "C" extern char const* const d_a_e_hb__stringBase0; - -// -// External References: -// - -extern "C" void mDoMtx_XrotM__FPA4_fs(); -extern "C" void mDoMtx_YrotS__FPA4_fs(); -extern "C" void mDoMtx_YrotM__FPA4_fs(); -extern "C" void mDoMtx_ZrotM__FPA4_fs(); -extern "C" void scaleM__14mDoMtx_stack_cFfff(); -extern "C" void mDoExt_modelUpdateDL__FP8J3DModel(); -extern "C" void setAnm__14mDoExt_McaMorfFP15J3DAnmTransformiffffPv(); -extern "C" void play__14mDoExt_McaMorfFP3VecUlSc(); -extern "C" void -__ct__16mDoExt_McaMorfSOFP12J3DModelDataP25mDoExt_McaMorfCallBack1_cP25mDoExt_McaMorfCallBack2_cP15J3DAnmTransformifiiP10Z2CreatureUlUl(); -extern "C" void setAnm__16mDoExt_McaMorfSOFP15J3DAnmTransformiffff(); -extern "C" void play__16mDoExt_McaMorfSOFUlSc(); -extern "C" void entryDL__16mDoExt_McaMorfSOFv(); -extern "C" void modelCalc__16mDoExt_McaMorfSOFv(); -extern "C" void stopZelAnime__16mDoExt_McaMorfSOFv(); -extern "C" void init__19mDoExt_3DlineMat1_cFUsUsP7ResTIMGi(); -extern "C" void update__19mDoExt_3DlineMat1_cFiR8_GXColorP12dKy_tevstr_c(); -extern "C" void setMat__26mDoExt_3DlineMatSortPacketFP18mDoExt_3DlineMat_c(); -extern "C" void mDoExt_J3DModel__create__FP12J3DModelDataUlUl(); -extern "C" void __ct__10fopAc_ac_cFv(); -extern "C" void fopAcIt_Judge__FPFPvPv_PvPv(); -extern "C" void fopAcM_delete__FP10fopAc_ac_c(); -extern "C" void fopAcM_createChild__FsUiUlPC4cXyziPC5csXyzPC4cXyzScPFPv_i(); -extern "C" void fopAcM_entrySolidHeap__FP10fopAc_ac_cPFP10fopAc_ac_c_iUl(); -extern "C" void fopAcM_SetMin__FP10fopAc_ac_cfff(); -extern "C" void fopAcM_SetMax__FP10fopAc_ac_cfff(); -extern "C" void fopAcM_searchActorAngleY__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void fopAcM_createBokkuri__FUsPC4cXyziiiPC4cXyzii(); -extern "C" void fopAcM_otherBgCheck__FPC10fopAc_ac_cPC10fopAc_ac_c(); -extern "C" void gndCheck__11fopAcM_gc_cFPC4cXyz(); -extern "C" void fpcSch_JudgeByID__FPvPv(); -extern "C" void dComIfG_resLoad__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfG_resDelete__FP30request_of_phase_process_classPCc(); -extern "C" void dComIfGp_getReverb__Fi(); -extern "C" void -dComIfGd_setShadow__FUlScP8J3DModelP4cXyzffffR13cBgS_PolyInfoP12dKy_tevstr_csfP9_GXTexObj(); -extern "C" void isSwitch__10dSv_info_cCFii(); -extern "C" void getRes__14dRes_control_cFPCclP11dRes_info_ci(); -extern "C" void forceOnEventMove__Q213dPa_control_c7level_cFUl(); -extern "C" void getEmitter__Q213dPa_control_c7level_cFUl(); -extern "C" void -set__13dPa_control_cFUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); -extern "C" void -set__13dPa_control_cFUlUcUsPC4cXyzPC12dKy_tevstr_cPC5csXyzPC4cXyzUcP18dPa_levelEcallBackScPC8_GXColorPC8_GXColorPC4cXyzf(); -extern "C" void StartShock__12dVibration_cFii4cXyz(); -extern "C" void __ct__12dBgS_AcchCirFv(); -extern "C" void SetWall__12dBgS_AcchCirFff(); -extern "C" void __dt__9dBgS_AcchFv(); -extern "C" void __ct__9dBgS_AcchFv(); -extern "C" void Set__9dBgS_AcchFP4cXyzP4cXyzP10fopAc_ac_ciP12dBgS_AcchCirP4cXyzP5csXyzP5csXyz(); -extern "C" void CrrPos__9dBgS_AcchFR4dBgS(); -extern "C" void SetObj__16dBgS_PolyPassChkFv(); -extern "C" void __ct__10dCcD_GSttsFv(); -extern "C" void Move__10dCcD_GSttsFv(); -extern "C" void Init__9dCcD_SttsFiiP10fopAc_ac_c(); -extern "C" void __ct__12dCcD_GObjInfFv(); -extern "C" void __dt__12dCcD_GObjInfFv(); -extern "C" void ChkAtHit__12dCcD_GObjInfFv(); -extern "C" void ChkTgHit__12dCcD_GObjInfFv(); -extern "C" void GetTgHitObj__12dCcD_GObjInfFv(); -extern "C" void Set__8dCcD_SphFRC11dCcD_SrcSph(); -extern "C" void StartCAt__8dCcD_SphFR4cXyz(); -extern "C" void MoveCAt__8dCcD_SphFR4cXyz(); -extern "C" void def_se_set__FP10Z2CreatureP8cCcD_ObjUlP10fopAc_ac_c(); -extern "C" void at_power_check__FP11dCcU_AtInfo(); -extern "C" void settingTevStruct__18dScnKy_env_light_cFiP4cXyzP12dKy_tevstr_c(); -extern "C" void setLightTevColorType_MAJI__18dScnKy_env_light_cFP12J3DModelDataP12dKy_tevstr_c(); -extern "C" void dKy_darkworld_check__Fv(); -extern "C" void GetAc__8cCcD_ObjFv(); -extern "C" void Set__4cCcSFP8cCcD_Obj(); -extern "C" void __pl__4cXyzCFRC3Vec(); -extern "C" void __mi__4cXyzCFRC3Vec(); -extern "C" void __ml__4cXyzCFf(); -extern "C" void cM_atan2s__Fff(); -extern "C" void cM_rndF__Ff(); -extern "C" void cM_rndFX__Ff(); -extern "C" void __dt__13cBgS_PolyInfoFv(); -extern "C" void __dt__8cM3dGCirFv(); -extern "C" void SetC__8cM3dGSphFRC4cXyz(); -extern "C" void SetR__8cM3dGSphFf(); -extern "C" void cLib_addCalc2__FPffff(); -extern "C" void cLib_addCalc0__FPfff(); -extern "C" void cLib_addCalcAngleS2__FPssss(); -extern "C" void MtxScale__FfffUc(); -extern "C" void MtxPosition__FP4cXyzP4cXyz(); -extern "C" void deleteAllParticle__14JPABaseEmitterFv(); -extern "C" void func_802807E0(); -extern "C" void func_80280808(); -extern "C" void __ct__15Z2CreatureEnemyFv(); -extern "C" void init__15Z2CreatureEnemyFP3VecP3VecUcUc(); -extern "C" void setLinkSearch__15Z2CreatureEnemyFb(); -extern "C" void setEnemyName__15Z2CreatureEnemyFPCc(); -extern "C" void* __nw__FUl(); -extern "C" void __dl__FPv(); -extern "C" void checkPass__12J3DFrameCtrlFf(); -extern "C" void __construct_array(); -extern "C" void _savegpr_19(); -extern "C" void _savegpr_22(); -extern "C" void _savegpr_23(); -extern "C" void _savegpr_24(); -extern "C" void _savegpr_25(); -extern "C" void _savegpr_26(); -extern "C" void _savegpr_27(); -extern "C" void _savegpr_28(); -extern "C" void _savegpr_29(); -extern "C" void _restgpr_19(); -extern "C" void _restgpr_22(); -extern "C" void _restgpr_23(); -extern "C" void _restgpr_24(); -extern "C" void _restgpr_25(); -extern "C" void _restgpr_26(); -extern "C" void _restgpr_27(); -extern "C" void _restgpr_28(); -extern "C" void _restgpr_29(); -extern "C" extern void* __vt__19mDoExt_3DlineMat1_c[5]; -extern "C" extern void* __vt__8dCcD_Sph[36]; -extern "C" extern void* __vt__9dCcD_Stts[11]; -extern "C" extern void* __vt__12cCcD_SphAttr[25]; -extern "C" extern void* __vt__14cCcD_ShapeAttr[22]; -extern "C" extern void* __vt__9cCcD_Stts[8]; -extern "C" u8 now__14mDoMtx_stack_c[48]; -extern "C" u8 mGndCheck__11fopAcM_gc_c[84]; -extern "C" u8 mSimpleTexObj__21dDlst_shadowControl_c[32]; -extern "C" u8 sincosTable___5JMath[65536]; -extern "C" f32 mGroundY__11fopAcM_gc_c; -extern "C" u8 m_midnaActor__9daPy_py_c[4]; -extern "C" void __register_global_object(); - -// -// Declarations: -// - -/* ############################################################################################## */ -/* 80500B30-80500B34 00002C 0004+00 1/4 0/0 0/0 .rodata @3809 */ -SECTION_RODATA static f32 const lit_3809 = 0.5f; -COMPILER_STRIP_GATE(0x80500B30, &lit_3809); - -/* 80500C74-80500C78 000038 0004+00 1/1 0/0 0/0 .data l_color$3841 */ -SECTION_DATA static u8 l_color[4] = { - 0x14, - 0x0F, - 0x00, - 0xFF, -}; - -/* 80500C78-80500C90 00003C 0016+02 1/1 0/0 0/0 .data pow_xa$4594 */ -SECTION_DATA static u8 pow_xa[22 + 2 /* padding */] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x20, - 0x00, - 0x30, - 0x00, - 0x40, - 0x00, - 0x30, - 0x00, - 0x20, - 0x00, - 0x10, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - /* padding */ - 0x00, - 0x00, -}; - -/* 80500C90-80500CB4 -00001 0024+00 1/1 0/0 0/0 .data @4967 */ -SECTION_DATA static void* lit_4967[9] = { - (void*)(((char*)action__FP10e_hb_class) + 0x1CC), - (void*)(((char*)action__FP10e_hb_class) + 0x1E0), - (void*)(((char*)action__FP10e_hb_class) + 0x200), - (void*)(((char*)action__FP10e_hb_class) + 0x220), - (void*)(((char*)action__FP10e_hb_class) + 0x240), - (void*)(((char*)action__FP10e_hb_class) + 0x2AC), - (void*)(((char*)action__FP10e_hb_class) + 0x260), - (void*)(((char*)action__FP10e_hb_class) + 0x280), - (void*)(((char*)action__FP10e_hb_class) + 0x2A0), -}; - -/* 80500CB4-80500CBC 000078 0006+02 1/1 0/0 0/0 .data p_name$4973 */ -SECTION_DATA static u8 p_name[6 + 2 /* padding */] = { - 0x83, - 0x39, - 0x83, - 0x3A, - 0x83, - 0x3B, - /* padding */ - 0x00, - 0x00, -}; - -/* 80500CBC-80500CC8 000080 000C+00 1/1 0/0 0/0 .data p_idx$4974 */ -SECTION_DATA static u8 p_idx[12] = { - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, -}; - -/* 80500CC8-80500D08 00008C 0040+00 0/1 0/0 0/0 .data cc_sph_src$5310 */ -#pragma push -#pragma force_active on -static dCcD_SrcSph cc_sph_src = { - { - {0x0, {{0x0, 0x0, 0xd}, {0xd8fbfdff, 0x3}, 0x25}}, // mObj - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt - {dCcD_SE_STONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf - { - {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph - } // mSphAttr -}; -#pragma pop - -/* 80500D08-80500D48 0000CC 0040+00 0/1 0/0 0/0 .data at_sph_src$5311 */ -#pragma push -#pragma force_active on -static dCcD_SrcSph at_sph_src = { - { - {0x0, {{AT_TYPE_CSTATUE_SWING, 0x1, 0xd}, {0x0, 0x0}, 0x0}}, // mObj - {dCcD_SE_HARD_BODY, 0x0, 0x0, 0x0, 0x0}, // mGObjAt - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf - { - {{0.0f, 0.0f, 0.0f}, 35.0f} // mSph - } // mSphAttr -}; -#pragma pop - -/* 80500D48-80500D88 00010C 0040+00 0/1 0/0 0/0 .data kuki_sph_src$5312 */ -#pragma push -#pragma force_active on -static dCcD_SrcSph kuki_sph_src = { - { - {0x0, {{0x0, 0x0, 0xd}, {0xd8fbfdff, 0x3}, 0x0}}, // mObj - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt - {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg - {0x0}, // mGObjCo - }, // mObjInf - { - {{0.0f, 0.0f, 0.0f}, 20.0f} // mSph - } // mSphAttr -}; -#pragma pop - -/* 80500D88-80500DA8 -00001 0020+00 1/0 0/0 0/0 .data l_daE_HB_Method */ -static actor_method_class l_daE_HB_Method = { - (process_method_func)daE_HB_Create__FP10fopAc_ac_c, - (process_method_func)daE_HB_Delete__FP10e_hb_class, - (process_method_func)daE_HB_Execute__FP10e_hb_class, - (process_method_func)daE_HB_IsDelete__FP10e_hb_class, - (process_method_func)daE_HB_Draw__FP10e_hb_class, -}; - -/* 80500DA8-80500DD8 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_HB */ -extern actor_process_profile_definition g_profile_E_HB = { - fpcLy_CURRENT_e, // mLayerID - 7, // mListID - fpcPi_CURRENT_e, // mListPrio - PROC_E_HB, // mProcName - &g_fpcLf_Method.base, // sub_method - sizeof(e_hb_class), // mSize - 0, // mSizeOther - 0, // mParameters - &g_fopAc_Method.base, // sub_method - 140, // mPriority - &l_daE_HB_Method, // sub_method - 0x10050100, // mStatus - fopAc_ENEMY_e, // mActorType - fopAc_CULLBOX_CUSTOM_e, // cullType -}; - -/* 80500DD8-80500DE4 00019C 000C+00 2/2 0/0 0/0 .data __vt__10cCcD_GStts */ -SECTION_DATA extern void* __vt__10cCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10cCcD_GSttsFv, -}; - -/* 80500DE4-80500DF0 0001A8 000C+00 1/1 0/0 0/0 .data __vt__10dCcD_GStts */ -SECTION_DATA extern void* __vt__10dCcD_GStts[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__10dCcD_GSttsFv, -}; - -/* 80500DF0-80500DFC 0001B4 000C+00 1/1 0/0 0/0 .data __vt__12dBgS_AcchCir */ -SECTION_DATA extern void* __vt__12dBgS_AcchCir[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12dBgS_AcchCirFv, -}; - -/* 80500DFC-80500E20 0001C0 0024+00 2/2 0/0 0/0 .data __vt__12dBgS_ObjAcch */ -SECTION_DATA extern void* __vt__12dBgS_ObjAcch[9] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12dBgS_ObjAcchFv, - (void*)NULL, - (void*)NULL, - (void*)func_8050065C, - (void*)NULL, - (void*)NULL, - (void*)func_80500654, -}; - -/* 80500E20-80500E2C 0001E4 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGSph */ -SECTION_DATA extern void* __vt__8cM3dGSph[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGSphFv, -}; - -/* 80500E2C-80500E38 0001F0 000C+00 4/4 0/0 0/0 .data __vt__8cM3dGAab */ -SECTION_DATA extern void* __vt__8cM3dGAab[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__8cM3dGAabFv, -}; - -/* 80500E38-80500E4C 0001FC 0014+00 1/1 0/0 0/0 .data __vt__18mDoExt_3DlineMat_c */ -SECTION_DATA extern void* __vt__18mDoExt_3DlineMat_c[5] = { - (void*)NULL /* RTTI */, (void*)NULL, (void*)NULL, (void*)NULL, (void*)NULL, -}; - -/* 80500E4C-80500E58 000210 000C+00 2/2 0/0 0/0 .data __vt__12daE_HB_HIO_c */ -SECTION_DATA extern void* __vt__12daE_HB_HIO_c[3] = { - (void*)NULL /* RTTI */, - (void*)NULL, - (void*)__dt__12daE_HB_HIO_cFv, + ACTION_CHANCE = 6, + ACTION_S_DAMAGE, + ACTION_DAMAGE }; /* 804FBD6C-804FBDB8 0000EC 004C+00 1/1 0/0 0/0 .text __ct__12daE_HB_HIO_cFv */ daE_HB_HIO_c::daE_HB_HIO_c() { - // NONMATCHING + id = -1; + base_size = 1.0f; + flower_size = 0.5f; + appear_size = 1.0f; + roof_reappear_interval = 70; + attack_freq = 30; + bite_pattern = 1; } -/* ############################################################################################## */ -/* 80500B34-80500B38 000030 0004+00 2/3 0/0 0/0 .rodata @3823 */ -SECTION_RODATA static f32 const lit_3823 = -1.0f; -COMPILER_STRIP_GATE(0x80500B34, &lit_3823); - -/* 80500C34-80500C34 000130 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ -#pragma push -#pragma force_active on -SECTION_DEAD static char const* const stringBase_80500C34 = "E_hb"; -#pragma pop - /* 804FBDB8-804FBE64 000138 00AC+00 8/8 0/0 0/0 .text anm_init__FP10e_hb_classifUcf */ -static void anm_init(e_hb_class* param_0, int param_1, f32 param_2, u8 param_3, f32 param_4) { - // NONMATCHING +static void anm_init(e_hb_class* i_this, int i_anm, f32 i_morf, u8 i_mode, f32 i_speed) { + i_this->modelMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_hb", i_anm), i_mode, i_morf, i_speed, 0.0f, -1.0f); + i_this->anm = i_anm; } /* 804FBE64-804FBF3C 0001E4 00D8+00 8/8 0/0 0/0 .text leaf_anm_init__FP10e_hb_classifUcf */ -static void leaf_anm_init(e_hb_class* param_0, int param_1, f32 param_2, u8 param_3, - f32 param_4) { - // NONMATCHING +static BOOL leaf_anm_init(e_hb_class* i_this, int i_anm, f32 i_morf, u8 i_mode, f32 i_speed) { + e_hb_leaf_class* pleaf = (e_hb_leaf_class*)fopAcM_SearchByID(i_this->leaf_actor_id); + if (pleaf != NULL) { + pleaf->mpMorf->setAnm((J3DAnmTransform*)dComIfG_getObjectRes("E_hb", i_anm), i_mode, i_morf, i_speed, 0.0f, -1.0f, NULL); + return TRUE; + } + + return FALSE; } -/* ############################################################################################## */ -/* 80500B38-80500B3C 000034 0004+00 0/6 0/0 0/0 .rodata @3870 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3870 = 50.0f; -COMPILER_STRIP_GATE(0x80500B38, &lit_3870); -#pragma pop - -/* 80500B3C-80500B40 000038 0004+00 0/1 0/0 0/0 .rodata @3871 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_3871 = 600.0f; -COMPILER_STRIP_GATE(0x80500B3C, &lit_3871); -#pragma pop - /* 804FBF3C-804FC0C0 0002BC 0184+00 1/0 0/0 0/0 .text daE_HB_Draw__FP10e_hb_class */ -static void daE_HB_Draw(e_hb_class* param_0) { - // NONMATCHING +static int daE_HB_Draw(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + + g_env_light.settingTevStruct(0, &actor->current.pos, &actor->tevStr); + + if (i_this->field_0x850 == 0) { + J3DModel* model = i_this->modelMorf->getModel(); + g_env_light.setLightTevColorType_MAJI(model, &actor->tevStr); + i_this->modelMorf->entryDL(); + + cXyz sp8; + sp8.set(actor->current.pos.x, 50.0f + actor->current.pos.y + BREG_F(18), actor->current.pos.z); + i_this->shadowId = dComIfGd_setShadow(i_this->shadowId, 1, model, &sp8, 600.0f + BREG_F(19), 0.0f, actor->current.pos.y, fopAcM_gc_c::getGroundY(), *fopAcM_gc_c::getGroundCheck(), &actor->tevStr, 0, 1.0f, dDlst_shadowControl_c::getSimpleTex()); + } + + static GXColor l_color = {0x14, 0x0F, 0x00, 0xFF}; + i_this->stalkLine.update(12, l_color, &actor->tevStr); + dComIfGd_set3DlineMat(&i_this->stalkLine); + + for (int i = 1; i < 11; i++) { + if (i_this->thornModel[i] != NULL) { + g_env_light.setLightTevColorType_MAJI(i_this->thornModel[i], &actor->tevStr); + mDoExt_modelUpdateDL(i_this->thornModel[i]); + } + } + + return 1; } /* 804FC0C0-804FC118 000440 0058+00 2/2 0/0 0/0 .text pl_check__FP10e_hb_classf */ -static void pl_check(e_hb_class* param_0, f32 param_1) { - // NONMATCHING +static BOOL pl_check(e_hb_class* i_this, f32 i_range) { + fopAc_ac_c* actor = &i_this->enemy; + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + if (i_this->dist_to_player < i_range && (i_this->field_0x851 || !fopAcM_otherBgCheck(actor, player))) { + return TRUE; + } else { + return FALSE; + } } /* 804FC118-804FC504 000498 03EC+00 1/1 0/0 0/0 .text damage_check__FP10e_hb_class */ -static void damage_check(e_hb_class* param_0) { - // NONMATCHING +static void damage_check(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + if (i_this->invulnerabilityTimer == 0) { + i_this->ccStts.Move(); + + if (i_this->atSph.ChkAtShieldHit()) { + i_this->invulnerabilityTimer = 6; + i_this->action = ACTION_S_DAMAGE; + i_this->mode = 0; + + i_this->timers[0] = 10; + i_this->timers[1] = 100; + + i_this->field_0x680 = player->shape_angle.y; + i_this->field_0x1230 = 10; + dComIfGp_getVibration().StartShock(4, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + return; + } + + s8 hit_type = 0; + + for (int i = 0; i < 4; i++) { + if (i_this->kukiSph[i].ChkTgHit()) { + i_this->invulnerabilityTimer = 10; + i_this->atInfo.mpCollider = i_this->kukiSph[i].GetTgHitObj(); + + if (i_this->atInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG)) { + hit_type = 2; + } else if (i_this->atInfo.mpCollider->ChkAtType(AT_TYPE_40 | AT_TYPE_BOMB) || i_this->action == ACTION_CHANCE) { + at_power_check(&i_this->atInfo); + if (daPy_getPlayerActorClass()->getCutType() != 0) { + hit_type = 1; + } else { + hit_type = 2; + } + } else { + i_this->action = ACTION_S_DAMAGE; + i_this->mode = 0; + i_this->timers[0] = 10; + i_this->timers[1] = 100; + i_this->field_0x680 = player->shape_angle.y; + def_se_set(&i_this->sound, i_this->atInfo.mpCollider, 0x2D, NULL); + i_this->field_0x1230 = 10; + } + break; + } + } + + if (hit_type == 0 && i_this->ccSph.ChkTgHit()) { + i_this->atInfo.mpCollider = i_this->ccSph.GetTgHitObj(); + fopAc_ac_c* tg_hit_actor = dCc_GetAc(i_this->atInfo.mpCollider->GetAc()); + + if (i_this->atInfo.mpCollider->ChkAtType(AT_TYPE_BOOMERANG | AT_TYPE_40 | AT_TYPE_BOMB)) { + hit_type = 2; + } + + if (i_this->field_0x850 == 0) { + i_this->invulnerabilityTimer = 6; + i_this->action = ACTION_S_DAMAGE; + i_this->mode = 0; + i_this->timers[0] = 10; + i_this->timers[1] = 100; + i_this->field_0x680 = player->shape_angle.y; + i_this->field_0x1230 = 10; + def_se_set(&i_this->sound, i_this->atInfo.mpCollider, 0x2D, NULL); + } + } + + if (hit_type != 0) { + int item_no = actor->field_0x565; + if (item_no == 0xFF) { + item_no = -1; + } + + int item_bit = actor->field_0x564; + if (item_bit == 0xFF) { + item_bit = -1; + } + + cXyz sp2C(0.0f, 0.0f, 0.0f); + fopAc_ac_c* hit_actor = dCc_GetAc(i_this->atInfo.mpCollider->GetAc()); + if (hit_actor != NULL) { + sp2C = actor->current.pos - hit_actor->current.pos; + } + + e_hb_leaf_class* pleaf = (e_hb_leaf_class*)fopAcM_SearchByID(i_this->leaf_actor_id); + if (pleaf != NULL) { + pleaf->field_0x5bc = fopAcM_createBokkuri(fopAcM_GetSetId(actor), &actor->current.pos, item_no, item_bit, fopAcM_GetRoomNo(actor), &sp2C, 0, 0); + daPy_getPlayerActorClass()->onEnemyDead(); + } + + i_this->field_0x124c = 0.0f; + dComIfGp_particle_set(0x8335, &i_this->field_0x6a0[4], NULL, NULL); + i_this->field_0x850 = 3; + i_this->field_0x1230 = 10; + actor->health = 0; + + def_se_set(&i_this->sound, i_this->atInfo.mpCollider, 0x21, NULL); + i_this->sound.startCreatureSound(Z2SE_EN_DB_DRY, 0, -1); + + if (hit_type == 1) { + dScnPly_c::setPauseTimer(4); + } + } + } } -/* ############################################################################################## */ -/* 80500B40-80500B44 00003C 0004+00 0/4 0/0 0/0 .rodata @4035 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4035 = 10.0f; -COMPILER_STRIP_GATE(0x80500B40, &lit_4035); -#pragma pop - -/* 80500B44-80500B48 000040 0004+00 0/2 0/0 0/0 .rodata @4036 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4036 = -170.0f; -COMPILER_STRIP_GATE(0x80500B44, &lit_4036); -#pragma pop - -/* 80500B48-80500B4C 000044 0004+00 0/4 0/0 0/0 .rodata @4037 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4037 = 170.0f; -COMPILER_STRIP_GATE(0x80500B48, &lit_4037); -#pragma pop - -/* 80500B4C-80500B50 000048 0004+00 0/4 0/0 0/0 .rodata @4038 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4038 = 1.0f / 5.0f; -COMPILER_STRIP_GATE(0x80500B4C, &lit_4038); -#pragma pop - -/* 80500B50-80500B54 00004C 0004+00 0/6 0/0 0/0 .rodata @4039 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4039 = 1.0f / 10.0f; -COMPILER_STRIP_GATE(0x80500B50, &lit_4039); -#pragma pop - -/* 80500B54-80500B58 000050 0004+00 0/5 0/0 0/0 .rodata @4040 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4040 = 20.0f; -COMPILER_STRIP_GATE(0x80500B54, &lit_4040); -#pragma pop - -/* 80500B58-80500B5C 000054 0004+00 0/1 0/0 0/0 .rodata @4041 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4041 = 4.0f; -COMPILER_STRIP_GATE(0x80500B58, &lit_4041); -#pragma pop - -/* 80500B5C-80500B60 000058 0004+00 0/1 0/0 0/0 .rodata @4042 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4042 = 2.0f / 5.0f; -COMPILER_STRIP_GATE(0x80500B5C, &lit_4042); -#pragma pop - -/* 80500B60-80500B64 00005C 0004+00 0/1 0/0 0/0 .rodata @4043 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4043 = 1.0f / 50.0f; -COMPILER_STRIP_GATE(0x80500B60, &lit_4043); -#pragma pop - -/* 80500B64-80500B68 000060 0004+00 0/7 0/0 0/0 .rodata @4044 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4044 = 1.0f / 20.0f; -COMPILER_STRIP_GATE(0x80500B64, &lit_4044); -#pragma pop - /* 80500E60-80500E64 000008 0004+00 2/2 0/0 0/0 .bss None */ -static u8 data_80500E60[4]; - -/* 80500E64-80500E70 00000C 000C+00 1/1 0/0 0/0 .bss @3804 */ -static u8 lit_3804[12]; +static u8 l_HIOInit; /* 80500E70-80500E8C 000018 001C+00 9/9 0/0 0/0 .bss l_HIO */ -static u8 l_HIO[28]; +static daE_HB_HIO_c l_HIO; /* 804FC504-804FC85C 000884 0358+00 1/1 0/0 0/0 .text e_hb_stay__FP10e_hb_class */ -static void e_hb_stay(e_hb_class* param_0) { - // NONMATCHING -} +static void e_hb_stay(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; -/* ############################################################################################## */ -/* 80500B68-80500B6C 000064 0004+00 0/5 0/0 0/0 .rodata @4078 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4078 = 30.0f; -COMPILER_STRIP_GATE(0x80500B68, &lit_4078); -#pragma pop + cXyz sp14; + i_this->invulnerabilityTimer = 15; + + switch (i_this->mode) { + case 0: + i_this->field_0x674.y = 0.0f; + /* fallthrough */ + case 1: + anm_init(i_this, 0xD, 10.0f, 0, 1.0f); + if (leaf_anm_init(i_this, 0x14, 10.0f, 2, 0.0f)) { + i_this->mode = 5; + i_this->field_0x690 = 0.0f; + i_this->timers[0] = 50; + } + break; + case 2: + if (i_this->field_0x851 != 0) { + i_this->field_0x674.y = -170.0f; + } else { + i_this->field_0x674.y = 170.0f; + } + i_this->mode = 1; + break; + case 5: + cLib_addCalc2(&actor->current.pos.x, actor->home.pos.x, 0.2f, 10.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.y, actor->home.pos.y + i_this->field_0x674.y, 0.2f, 10.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, actor->home.pos.z, 0.2f, 10.0f * i_this->field_0x690); + cLib_addCalc2(&i_this->field_0x690, 1.0f, 1.0f, 0.1f); + + sp14 = actor->current.pos - actor->home.pos; + sp14.y = 0.0f; + if (sp14.abs() < 20.0f) { + cLib_addCalc0(&i_this->field_0x674.y, 1.0f, 4.0f); + + if (i_this->field_0x851 != 0) { + cLib_addCalcAngleS2(&actor->shape_angle.x, 0x4000, 4, 0x200); + } else { + cLib_addCalcAngleS2(&actor->shape_angle.x, -0x4000, 4, 0x200); + } + + cLib_addCalc2(&i_this->field_0x848, 0.4f, 1.0f, 0.02f); + cLib_addCalc2(&i_this->size, l_HIO.flower_size, 1.0f, 0.05f); + } + + if (i_this->timers[0] == 0 && (i_this->arg2 == 1 || pl_check(i_this, i_this->pl_search_range))) { + if (i_this->field_0x851 != 0) { + i_this->action = ACTION_APPEAR_V; + } else { + i_this->action = ACTION_APPEAR; + } + i_this->mode = 0; + } + break; + } +} /* 804FC85C-804FCB1C 000BDC 02C0+00 1/1 0/0 0/0 .text e_hb_appear__FP10e_hb_class */ -static void e_hb_appear(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_appear(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + int anm_frame = i_this->modelMorf->getFrame(); + + switch (i_this->mode) { + case 0: + anm_init(i_this, 5, 10.0f, 0, 1.0f); + leaf_anm_init(i_this, 0x13, 10.0f, 2, 1.0f); + i_this->mode = 1; + + i_this->field_0x674.x = actor->home.pos.x + cM_rndFX(100.0f); + i_this->field_0x674.z = actor->home.pos.z + cM_rndFX(100.0f); + if (i_this->field_0x851 != 0) { + i_this->field_0x674.y = actor->home.pos.y - (170.0f + cM_rndFX(50.0f)); + } else { + i_this->field_0x674.y = 170.0f + actor->home.pos.y + cM_rndFX(50.0f); + } + + i_this->field_0x690 = 0.2f; + i_this->sound.startCreatureSound(Z2SE_EN_DB_GRASS, 0, -1); + i_this->sound.startCreatureSound(Z2SE_EN_DB_APPEAR, 0, -1); + break; + case 1: + if (anm_frame >= 15 && anm_frame <= 35) { + i_this->field_0x1231 = 2; + } + + i_this->field_0xb0c = 1; + cLib_addCalc2(&actor->current.pos.x, i_this->field_0x674.x, 0.1f, 30.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, i_this->field_0x674.z, 0.1f, 30.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y, 0.1f, 30.0f * i_this->field_0x690); + cLib_addCalc2(&i_this->field_0x690, 1.0f, 1.0f, 0.05f); + + if (i_this->modelMorf->isStop()) { + i_this->action = ACTION_WAIT; + i_this->mode = 0; + } + break; + } + + if (i_this->field_0x851 != 0) { + cLib_addCalcAngleS2(&actor->shape_angle.y, (i_this->angle_to_player + 0x8000), 8, 0x800); + cLib_addCalcAngleS2(&actor->shape_angle.x, -0x8000, 8, 0x400); + } else { + cLib_addCalcAngleS2(&actor->shape_angle.y, i_this->angle_to_player, 8, 0x800); + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 8, 0x400); + } + + cLib_addCalc2(&i_this->size, l_HIO.appear_size, 1.0f, 0.1f); } -/* ############################################################################################## */ -/* 80500B6C-80500B70 000068 0004+00 1/5 0/0 0/0 .rodata @4108 */ -SECTION_RODATA static f32 const lit_4108 = 5.0f; -COMPILER_STRIP_GATE(0x80500B6C, &lit_4108); - -/* 80500B70-80500B74 00006C 0004+00 0/3 0/0 0/0 .rodata @4109 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4109 = 15.0f; -COMPILER_STRIP_GATE(0x80500B70, &lit_4109); -#pragma pop - -/* 80500B74-80500B78 000070 0004+00 0/3 0/0 0/0 .rodata @4110 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4110 = 60.0f; -COMPILER_STRIP_GATE(0x80500B74, &lit_4110); -#pragma pop - -/* 80500B78-80500B7C 000074 0004+00 0/3 0/0 0/0 .rodata @4111 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4111 = 40.0f; -COMPILER_STRIP_GATE(0x80500B78, &lit_4111); -#pragma pop - -/* 80500B7C-80500B80 000078 0004+00 0/2 0/0 0/0 .rodata @4112 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4112 = 400.0f; -COMPILER_STRIP_GATE(0x80500B7C, &lit_4112); -#pragma pop - -/* 80500B80-80500B84 00007C 0004+00 0/1 0/0 0/0 .rodata @4113 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4113 = 3.0f / 20.0f; -COMPILER_STRIP_GATE(0x80500B80, &lit_4113); -#pragma pop - /* 804FCB1C-804FCCE8 000E9C 01CC+00 1/1 0/0 0/0 .text e_hb_appear_v__FP10e_hb_class */ -static void e_hb_appear_v(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_appear_v(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + cXyz spC; + f32 temp_f31 = 60.0f + TREG_F(17); + + switch (i_this->mode) { + case 0: + anm_init(i_this, 5, 5.0f, 0, 1.0f); + leaf_anm_init(i_this, 0x13, 5.0f, 2, 1.0f); + i_this->mode = 1; + i_this->timers[0] = JREG_S(6) + 30; + i_this->field_0x690 = 0.0f; + i_this->modelMorf->setFrame(15.0f); + /* fallthrough */ + case 1: + spC.x = temp_f31 * cM_ssin(i_this->counter * (TREG_S(0) + 1200)); + spC.z = temp_f31 * cM_scos(i_this->counter * (TREG_S(2) + 1500)); + + cLib_addCalc2(&actor->current.pos.x, actor->home.pos.x + spC.x, 0.1f, 40.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, actor->home.pos.z + spC.z, 0.1f, 40.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.y, actor->home.pos.y - (400.0f + JREG_F(18)), 0.5f, 40.0f * i_this->field_0x690); + cLib_addCalc2(&i_this->field_0x690, 1.0f, 1.0f, 0.2f + JREG_F(5)); + + if (i_this->timers[0] == 0) { + i_this->action = ACTION_WAIT; + i_this->mode = 0; + i_this->field_0x84c = 0.0f; + } + break; + } + + cLib_addCalcAngleS2(&actor->shape_angle.x, 0x4000, 4, 0x400); + cLib_addCalc2(&i_this->field_0x848, 0.5f + JREG_F(4), 1.0f, 0.05f); + cLib_addCalc2(&i_this->size, l_HIO.appear_size, 1.0f, 0.15f); + i_this->field_0xb0c = 1; } -/* ############################################################################################## */ -/* 80500B84-80500B88 000080 0004+00 0/1 0/0 0/0 .rodata @4206 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4206 = 0.75f; -COMPILER_STRIP_GATE(0x80500B84, &lit_4206); -#pragma pop - -/* 80500B88-80500B8C 000084 0004+00 0/1 0/0 0/0 .rodata @4207 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4207 = 90.0f; -COMPILER_STRIP_GATE(0x80500B88, &lit_4207); -#pragma pop - -/* 80500B8C-80500B90 000088 0004+00 0/2 0/0 0/0 .rodata @4208 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4208 = -100.0f; -COMPILER_STRIP_GATE(0x80500B8C, &lit_4208); -#pragma pop - -/* 80500B90-80500B94 00008C 0004+00 0/1 0/0 0/0 .rodata @4209 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4209 = 3.0f / 10.0f; -COMPILER_STRIP_GATE(0x80500B90, &lit_4209); -#pragma pop - -/* 80500B94-80500B9C 000090 0004+04 0/1 0/0 0/0 .rodata @4210 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4210[1 + 1 /* padding */] = { - 700.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x80500B94, &lit_4210); -#pragma pop - -/* 80500B9C-80500BA4 000098 0008+00 1/3 0/0 0/0 .rodata @4212 */ -SECTION_RODATA static u8 const lit_4212[8] = { - 0x43, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80500B9C, &lit_4212); - /* 804FCCE8-804FD230 001068 0548+00 1/1 0/0 0/0 .text e_hb_wait__FP10e_hb_class */ -static void e_hb_wait(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_wait(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp48; + f32 temp_f31 = 30.0f + TREG_F(12); + + if ((i_this->counter & 15) == 0 && cM_rndF(1.0f) < 0.75f) { + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_WAIT, -1); + } + + switch (i_this->mode) { + case -1: + if (i_this->modelMorf->isStop()) { + i_this->mode = 0; + } else { + cXyz sp3C(0.0f, 90.0f, -100.0f); + cXyz sp30; + cMtx_YrotS(*calc_mtx, actor->shape_angle.y); + MtxPosition(&sp3C, &sp30); + i_this->field_0x674 = actor->home.pos + sp30; + + cLib_addCalc2(&actor->current.pos.x, i_this->field_0x674.x, 0.3f, 30.0f); + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y, 0.3f, 30.0f); + cLib_addCalc2(&actor->current.pos.z, i_this->field_0x674.z, 0.3f, 30.0f); + break; + } + case 0: + anm_init(i_this, 0x12, 10.0f, 2, 1.0f); + leaf_anm_init(i_this, 0x14, 10.0f, 2, 1.0f); + i_this->mode = 1; + + if (i_this->arg1 == 1) { + i_this->timers[1] = 30.0f + cM_rndF(20.0f); + } else { + i_this->timers[1] = l_HIO.attack_freq + cM_rndF(l_HIO.attack_freq); + } + + i_this->timers[0] = 0; + break; + case 1: + if (i_this->timers[0] == 0) { + i_this->timers[0] = 10.0f + cM_rndF(30.0f); + i_this->field_0x674.x = actor->home.pos.x + cM_rndFX(100.0f); + i_this->field_0x674.z = actor->home.pos.z + cM_rndFX(100.0f); + + if (i_this->field_0x851 != 0) { + i_this->field_0x674.y = actor->home.pos.y - (170.0f + cM_rndFX(50.0f)); + } else { + i_this->field_0x674.y = 170.0f + actor->home.pos.y + cM_rndFX(50.0f); + } + + i_this->field_0x690 = 0.0f; + } + + sp48.x = temp_f31 * cM_ssin(i_this->counter * (TREG_S(0) + 1900)); + sp48.y = temp_f31 * cM_ssin(i_this->counter * (TREG_S(1) + 2200)); + sp48.z = temp_f31 * cM_scos(i_this->counter * (TREG_S(2) + 2000)); + + cLib_addCalc2(&actor->current.pos.x, i_this->field_0x674.x + sp48.x, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, i_this->field_0x674.z + sp48.z, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y + sp48.y, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&i_this->field_0x690, 1.0f, 1.0f, 0.05f); + + if (i_this->timers[2] == 0) { + if (i_this->arg2 != 1 && !pl_check(i_this, 100.0f + i_this->pl_search_range)) { + i_this->action = ACTION_STAY; + i_this->mode = 2; + i_this->sound.startCreatureSound(Z2SE_EN_DB_HIKKOMU, 0, -1); + } else if (i_this->timers[1] == 0 && pl_check(i_this, 700.0f)) { + i_this->action = ACTION_ATTACK; + i_this->mode = 0; + } + } + break; + } + + if (i_this->field_0x851 != 0) { + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cLib_addCalcAngleS2(&actor->shape_angle.y, (i_this->angle_to_player + 0x8000), 8, 0x800); + + cXyz sp24 = player->eyePos - actor->current.pos; + int sp8 = cM_atan2s(sp24.y, JMAFastSqrt(SQUARE(sp24.x) + SQUARE(sp24.z))); + cLib_addCalcAngleS2(&actor->shape_angle.x, (sp8 + 0x8000), 8, 0x400); + i_this->field_0xb0c = 1; + } else { + cLib_addCalcAngleS2(&actor->shape_angle.y, i_this->angle_to_player, 8, 0x800); + cLib_addCalcAngleS2(&actor->shape_angle.x, 0, 8, 0x400); + } } -/* ############################################################################################## */ -/* 80500BA4-80500BA8 0000A0 0004+00 0/1 0/0 0/0 .rodata @4405 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4405 = 350.0f; -COMPILER_STRIP_GATE(0x80500BA4, &lit_4405); -#pragma pop - -/* 80500BA8-80500BAC 0000A4 0004+00 0/1 0/0 0/0 .rodata @4406 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4406 = 4.0f / 5.0f; -COMPILER_STRIP_GATE(0x80500BA8, &lit_4406); -#pragma pop - -/* 80500BAC-80500BB0 0000A8 0004+00 0/1 0/0 0/0 .rodata @4407 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4407 = 2.0f; -COMPILER_STRIP_GATE(0x80500BAC, &lit_4407); -#pragma pop - -/* 80500BB0-80500BB4 0000AC 0004+00 0/1 0/0 0/0 .rodata @4408 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4408 = 2000.0f; -COMPILER_STRIP_GATE(0x80500BB0, &lit_4408); -#pragma pop - -/* 80500BB4-80500BB8 0000B0 0004+00 0/2 0/0 0/0 .rodata @4409 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4409 = 70.0f; -COMPILER_STRIP_GATE(0x80500BB4, &lit_4409); -#pragma pop - -/* 80500BB8-80500BBC 0000B4 0004+00 0/3 0/0 0/0 .rodata @4410 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4410 = -50.0f; -COMPILER_STRIP_GATE(0x80500BB8, &lit_4410); -#pragma pop - -/* 80500BBC-80500BC0 0000B8 0004+00 0/1 0/0 0/0 .rodata @4411 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4411 = 200.0f; -COMPILER_STRIP_GATE(0x80500BBC, &lit_4411); -#pragma pop - /* 804FD230-804FDC90 0015B0 0A60+00 1/1 0/0 0/0 .text e_hb_attack__FP10e_hb_class */ -static void e_hb_attack(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_attack(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + fopAc_ac_c* player = (fopAc_ac_c*)dComIfGp_getPlayer(0); + cXyz sp78; + cXyz sp6C; + s16 spA = 0; + + sp78 = player->eyePos - actor->current.pos; + spA = (s16)cM_atan2s(sp78.y, JMAFastSqrt(SQUARE(sp78.x) + SQUARE(sp78.z))); + + switch (i_this->mode) { + case 0: + i_this->mode = 1; + i_this->timers[0] = 17; + i_this->field_0x690 = 0.0f; + i_this->field_0xb0d = 0; + + i_this->sound.startCreatureSound(Z2SE_EN_DB_GRASS, 0, -1); + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_ATTACK, -1); + + leaf_anm_init(i_this, 0x13, 5.0f, 2, 1.0f); + anm_init(i_this, 6, 5.0f, 0, 1.0f); + /* fallthrough */ + case 1: + if (i_this->field_0x851 != 0) { + cLib_addCalcAngleS2(&actor->shape_angle.y, (i_this->angle_to_player + 0x8000), 8, 0x800); + sp78.x = 0.0f; + sp78.y = -170.0f + TREG_F(3); + sp78.z = 100.0f + TREG_F(4); + } else { + cLib_addCalcAngleS2(&actor->shape_angle.y, i_this->angle_to_player, 8, 0x800); + sp78.x = 0.0f; + sp78.y = 170.0f + TREG_F(3); + sp78.z = -100.0f + TREG_F(4); + } + + cMtx_YrotS(*calc_mtx, actor->shape_angle.y); + MtxPosition(&sp78, &sp6C); + i_this->field_0x674 = actor->home.pos + sp6C; + + cLib_addCalc2(&actor->current.pos.x, i_this->field_0x674.x, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, i_this->field_0x674.z, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&i_this->field_0x690, 1.0f, 1.0f, 0.1f); + + if (i_this->timers[0] == 0) { + i_this->mode = 2; + i_this->timers[1] = 10; + + if (i_this->field_0x851 != 0) { + cMtx_YrotS(*calc_mtx, (actor->shape_angle.y + 0x8000)); + cMtx_XrotM(*calc_mtx, -spA); + sp78.x = 0.0f; + sp78.y = TREG_F(5); + sp78.z = 350.0f + TREG_F(6); + MtxPosition(&sp78, &sp6C); + i_this->field_0x674 = actor->current.pos + sp6C; + } else { + cMtx_YrotS(*calc_mtx, actor->shape_angle.y); + cMtx_XrotM(*calc_mtx, (-spA + 0x800)); + sp78.x = 0.0f; + sp78.y = 0.0f; + sp78.z = 350.0f + TREG_F(6); + MtxPosition(&sp78, &sp6C); + i_this->field_0x674 = actor->current.pos + sp6C; + } + + actor->speed.x = fabsf(i_this->field_0x674.x - actor->current.pos.x); + actor->speed.y = fabsf(i_this->field_0x674.y - actor->current.pos.y); + actor->speed.z = fabsf(i_this->field_0x674.z - actor->current.pos.z); + i_this->field_0x690 = 0.0f; + + i_this->atSph.StartCAt(actor->current.pos); + + if (cM_rndF(1.0f) < 0.5f) { + i_this->field_0x68c = 0x4000; + } else { + i_this->field_0x68c = -0x4000; + } + + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_BITE, -1); + } + break; + case 2: + if (i_this->timers[1] != 0) { + i_this->field_0xb0c = 1; + } + + cLib_addCalc2(&actor->current.pos.x, i_this->field_0x674.x, 0.8f, actor->speed.x * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, i_this->field_0x674.z, 0.8f, actor->speed.z * i_this->field_0x690); + + if (l_HIO.bite_pattern == 1) { + cLib_addCalcAngleS2(&actor->shape_angle.z, i_this->field_0x68c, 2, 0x2000); + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y - 30.0f, 0.8f, actor->speed.y * i_this->field_0x690); + } else { + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y, 0.8f, actor->speed.y * i_this->field_0x690); + } + + cLib_addCalc2(&i_this->field_0x690, 0.2f, 1.0f, 0.05f); + + if (!daPy_getPlayerActorClass()->getDkCaught() && !daPy_getPlayerActorClass()->getStCaught() && i_this->atSph.ChkAtHit()) { + OS_REPORT("E_HB//////////////AT SET 1 !!\n"); + i_this->mode = 5; + i_this->field_0x690 = 20.0f; + anm_init(i_this, 7, 2.0f, 2, 1.0f); + i_this->timers[0] = 120; + + daPy_getPlayerActorClass()->setDkCaught(actor); + dComIfGp_getVibration().StartShock(6, 0x1F, cXyz(0.0f, 1.0f, 0.0f)); + } else if (i_this->modelMorf->isStop()) { + i_this->mode = 3; + i_this->timers[0] = 0; + } + break; + case 3: + if (i_this->timers[0] == 0) { + i_this->action = ACTION_WAIT; + i_this->mode = 0; + } + break; + case 5: + i_this->field_0x852 = 1; + i_this->sound.startCreatureVoiceLevel(Z2SE_EN_DB_V_BITING, -1); + i_this->ccSph.OffCoSetBit(); + spA = 0; + + if (daPy_getPlayerActorClass()->getDkCaught()) { + if (i_this->timers[0] == 30) { + dComIfGp_setItemLifeCount(-1.0f, 0); + } + + sp78 = player->current.pos - actor->home.pos; + s16 sp8 = cM_atan2s(sp78.x, sp78.z); + sp78.y = 0.0f; + + f32 temp_f1 = sp78.abs(); + if (temp_f1 > (100.0f + YREG_F(2))) { + f32 var_f30 = (0.1f + YREG_F(0)) * (temp_f1 - (100.0f + YREG_F(2))); + if (var_f30 > (100.0f + YREG_F(1))) { + var_f30 = 100.0f + YREG_F(1); + } + daPy_getPlayerActorClass()->setOutPower(var_f30, (sp8 + 0x8000), 0); + } + + if (i_this->field_0x851 == 0) { + cMtx_YrotS(*calc_mtx, sp8); + cLib_addCalcAngleS2(&actor->shape_angle.z, i_this->field_0x68c + ((2000.0f + KREG_F(17)) * cM_ssin((i_this->counter * (KREG_S(0) + 12000)))), 2, 0x2000); + sp78.x = 0.0f; + sp78.y = (100.0f + XREG_F(2)) - 30.0f; + sp78.z = XREG_F(3) - 50.0f; + MtxPosition(&sp78, &i_this->field_0x674); + i_this->field_0x674 += player->current.pos; + cLib_addCalcAngleS2(&actor->shape_angle.y, sp8, 2, 0x1000); + } else { + spA = -0x4000; + i_this->field_0x674 = player->eyePos; + i_this->field_0x674.y += 70.0f + JREG_F(8); + } + + cLib_addCalc2(&actor->current.pos.x, i_this->field_0x674.x, 1.0f, i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, i_this->field_0x674.z, 1.0f, i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.y, i_this->field_0x674.y, 1.0f, i_this->field_0x690); + cLib_addCalc2(&i_this->field_0x690, 200.0f, 1.0f, 10.0f); + } else { + i_this->action = ACTION_WAIT; + i_this->mode = -1; + anm_init(i_this, 0x10, 2.0f, 0, 1.0f); + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_RELEASE, -1); + } + break; + } + + if (i_this->field_0xb0c != 0) { + f32 temp_f31 = 50.0f + JREG_F(11); + actor->current.pos.y -= temp_f31; + actor->old.pos.y -= temp_f31; + + i_this->acch.CrrPos(dComIfG_Bgsp()); + + actor->current.pos.y += temp_f31; + actor->old.pos.y += temp_f31; + } + + if (i_this->field_0x851 != 0) { + cLib_addCalcAngleS2(&actor->shape_angle.x, (spA + 0x8000), 8, 0x400); + i_this->field_0xb0c = 1; + } else { + cLib_addCalcAngleS2(&actor->shape_angle.x, -spA, 8, 0x400); + } } -/* ############################################################################################## */ -/* 80500BC0-80500BC4 0000BC 0004+00 0/1 0/0 0/0 .rodata @4464 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4464 = 230.0f; -COMPILER_STRIP_GATE(0x80500BC0, &lit_4464); -#pragma pop - -/* 80500BC4-80500BC8 0000C0 0004+00 0/4 0/0 0/0 .rodata @4465 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4465 = 3.0f; -COMPILER_STRIP_GATE(0x80500BC4, &lit_4465); -#pragma pop - /* 804FDC90-804FDF90 002010 0300+00 1/1 0/0 0/0 .text e_hb_chance__FP10e_hb_class */ -static void e_hb_chance(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_chance(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + fopAc_ac_c* player = dComIfGp_getPlayer(0); + + cXyz sp14; + f32 temp_f31 = 60.0f + TREG_F(17); + + switch (i_this->mode) { + case 0: + if (i_this->field_0x851 != 0) { + anm_init(i_this, 0xA, 5.0f, 2, 1.0f); + } else { + anm_init(i_this, 9, 5.0f, 2, 1.0f); + } + + leaf_anm_init(i_this, 0x14, 5.0f, 2, 1.0f); + i_this->mode = 1; + i_this->timers[0] = 60; + i_this->field_0x690 = 0.0f; + /* fallthrough */ + case 1: + sp14.x = temp_f31 * cM_ssin(i_this->counter * (TREG_S(0) + 900)); + sp14.z = temp_f31 * cM_scos(i_this->counter * (TREG_S(2) + 1000)); + + cLib_addCalc2(&actor->current.pos.x, actor->home.pos.x + sp14.x, 0.1f, 20.0f * i_this->field_0x690); + cLib_addCalc2(&actor->current.pos.z, actor->home.pos.z + sp14.z, 0.1f, 20.0f * i_this->field_0x690); + + if (i_this->field_0x851 != 0) { + cLib_addCalc2(&actor->current.pos.y, actor->home.pos.y - (230.0f + TREG_F(18)), 0.1f, 20.0f * i_this->field_0x690); + } else { + cLib_addCalc2(&actor->current.pos.y, 230.0f + actor->home.pos.y + TREG_F(18), 0.1f, 20.0f * i_this->field_0x690); + } + + cLib_addCalc2(&i_this->field_0x690, 1.0f, 1.0f, 0.1f); + + if (i_this->timers[0] <= 50 && i_this->timers[0] >= 10) { + i_this->sound.startCreatureSoundLevel(0x70088, 0, -1); + } + + if (i_this->timers[0] == 0) { + i_this->mode++; + anm_init(i_this, 0x11, 3.0f, 0, 1.0f); + leaf_anm_init(i_this, 0x13, 3.0f, 2, 1.0f); + i_this->sound.startCreatureSound(Z2SE_EN_DB_GRASS, 0, -1); + } + break; + case 2: + if (i_this->modelMorf->isStop()) { + i_this->action = ACTION_WAIT; + i_this->mode = 0; + i_this->field_0x84c = 0.0f; + } + break; + } + + if (i_this->field_0x851 != 0) { + cLib_addCalcAngleS2(&actor->shape_angle.x, 0x4000, 4, 0x400); + } else { + cLib_addCalcAngleS2(&actor->shape_angle.x, -0x4000, 4, 0x400); + } + + cLib_addCalc2(&i_this->field_0x848, 0.5f + JREG_F(4), 1.0f, 0.05f); } -/* ############################################################################################## */ -/* 80500BC8-80500BCC 0000C4 0004+00 0/1 0/0 0/0 .rodata @4510 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4510 = 250.0f; -COMPILER_STRIP_GATE(0x80500BC8, &lit_4510); -#pragma pop - -/* 80500BCC-80500BD0 0000C8 0004+00 0/1 0/0 0/0 .rodata @4511 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4511 = 23.0f / 25.0f; -COMPILER_STRIP_GATE(0x80500BCC, &lit_4511); -#pragma pop - /* 804FDF90-804FE1E8 002310 0258+00 1/1 0/0 0/0 .text e_hb_s_damage__FP10e_hb_class */ -static void e_hb_s_damage(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_s_damage(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp10; + + switch (i_this->mode) { + case 0: + anm_init(i_this, 0xB, 3.0f, 0, 1.0f); + leaf_anm_init(i_this, 0x13, 3.0f, 2, 0.0f); + i_this->sound.startCreatureSound(Z2SE_EN_DB_GRASS, 0, -1); + + if (i_this->field_0x851 != 0) { + cMtx_YrotS(*calc_mtx, (actor->shape_angle.y + 0x8000)); + } else { + cMtx_YrotS(*calc_mtx, actor->shape_angle.y); + } + + sp10.x = 0.0f; + sp10.y = 15.0f; + sp10.z = -50.0f + TREG_F(16); + MtxPosition(&sp10, &actor->speed); + i_this->mode = 1; + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_DAMAGE_S, -1); + break; + case 1: + actor->current.pos += actor->speed; + sp10.x = actor->current.pos.x - actor->home.pos.x; + sp10.z = actor->current.pos.z - actor->home.pos.z; + + if (JMAFastSqrt(SQUARE(sp10.x) + SQUARE(sp10.z)) > 250.0f + nREG_F(8)) { + actor->speed.zero(); + } else { + actor->speed.x *= 0.92f; + actor->speed.y *= 0.92f; + actor->speed.z *= 0.92f; + } + + if (i_this->timers[0] == 0) { + i_this->action = ACTION_CHANCE; + i_this->mode = 0; + } + if (i_this->timers[1] == 0) { + i_this->action = ACTION_WAIT; + i_this->mode = 0; + i_this->field_0x84c = 0.0f; + } + break; + } + + if (i_this->field_0x851 != 0) { + cLib_addCalcAngleS2(&actor->shape_angle.x, 0x4000, 4, 0x400); + } else { + cLib_addCalcAngleS2(&actor->shape_angle.x, -0x4000, 4, 0x400); + } } -/* ############################################################################################## */ -/* 80500BD0-80500BD4 0000CC 0004+00 0/1 0/0 0/0 .rodata @4588 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4588 = -20.0f; -COMPILER_STRIP_GATE(0x80500BD0, &lit_4588); -#pragma pop - -/* 80500BD4-80500BD8 0000D0 0004+00 0/1 0/0 0/0 .rodata @4589 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4589 = 450.0f; -COMPILER_STRIP_GATE(0x80500BD4, &lit_4589); -#pragma pop - -/* 80500BD8-80500BDC 0000D4 0004+00 0/1 0/0 0/0 .rodata @4590 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4590 = -1.0f / 10.0f; -COMPILER_STRIP_GATE(0x80500BD8, &lit_4590); -#pragma pop - /* 804FE1E8-804FE5C8 002568 03E0+00 1/1 0/0 0/0 .text e_hb_damage__FP10e_hb_class */ -static void e_hb_damage(e_hb_class* param_0) { - // NONMATCHING +static void e_hb_damage(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp1C; + + switch (i_this->mode) { + case 0: + anm_init(i_this, 0xB, 3.0f, 0, 1.0f); + leaf_anm_init(i_this, 0x13, 3.0f, 2, 0.0f); + i_this->sound.startCreatureSound(Z2SE_EN_DB_GRASS, 0, -1); + cMtx_YrotS(*calc_mtx, i_this->field_0x680); + + sp1C.x = 0.0f; + if (i_this->arg0 != 1) { + if (i_this->arg0 == 2) { + sp1C.y = 20.0f + AREG_F(1); + } else { + sp1C.y = 30.0f; + } + sp1C.z = -50.0f; + } else { + sp1C.y = 0.0f; + sp1C.z = -20.0f; + } + MtxPosition(&sp1C, &actor->speed); + + i_this->mode = 1; + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_DAMAGE, -1); + break; + case 1: + sp1C = actor->current.pos - actor->home.pos; + if (sp1C.abs() > (450.0f + TREG_F(15))) { + actor->current.pos = actor->old.pos; + actor->speed.x *= -0.1f; + actor->speed.z *= -0.1f; + i_this->mode++; + } + case 2: + s16 var_r27; + if (i_this->arg0 == 2) { + var_r27 = 0; + } else { + var_r27 = -0x8000; + } + cLib_addCalcAngleS2(&actor->shape_angle.y, (i_this->field_0x680 + var_r27), 2, 0x2000); + actor->current.pos += actor->speed; + + if (i_this->arg0 != 1) { + if (i_this->arg0 == 2) { + actor->speed.y -= 1.0f + AREG_F(0); + } else { + actor->speed.y -= 5.0f; + } + } + + f32 temp_f31 = ((40.0f + TREG_F(15)) * i_this->size) * l_HIO.base_size; + + actor->current.pos.y -= temp_f31; + actor->old.pos.y -= temp_f31; + i_this->acch.CrrPos(dComIfG_Bgsp()); + actor->current.pos.y += temp_f31; + actor->old.pos.y += temp_f31; + + if (i_this->modelMorf->isStop()) { + i_this->action = ACTION_WAIT; + i_this->mode = 0; + } + } } -/* ############################################################################################## */ -/* 80500BDC-80500BE0 0000D8 0004+00 0/1 0/0 0/0 .rodata @4669 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4669 = -30.0f; -COMPILER_STRIP_GATE(0x80500BDC, &lit_4669); -#pragma pop - -/* 80500BE0-80500BE4 0000DC 0004+00 0/1 0/0 0/0 .rodata @4670 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4670 = -200.0f; -COMPILER_STRIP_GATE(0x80500BE0, &lit_4670); -#pragma pop - /* 804FE5C8-804FE8F8 002948 0330+00 1/1 0/0 0/0 .text kuki_control1__FP10e_hb_class */ -static void kuki_control1(e_hb_class* param_0) { - // NONMATCHING +static void kuki_control1(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp40; + cXyz sp34; + cXyz sp28; + + int i; + cXyz* var_r31 = i_this->field_0x6a0; + *var_r31 = actor->home.pos; + + cXyz sp1C; + sp40.x = 0.0f; + sp40.y = 0.0f; + sp40.z = i_this->field_0x844; + + var_r31++; + + f32 temp_f30; + f32 temp_f25; + f32 temp_f29; + f32 var_f27; + f32 var_f26; + + f32 var_f31 = 50.0f + TREG_F(2); + sp28.x = 0.0f; + sp28.z = 0.0f; + + if (i_this->action == ACTION_CHANCE) { + sp28.y = 0.0f; + var_f31 = 70.0f + JREG_F(1); + sp1C.set(0.0f, -30.0f + JREG_F(3), 0.0f); + } else { + sp28.y = -(200.0f + TREG_F(0)); + } + + f32 temp_f28 = i_this->field_0x84c; + + for (i = 1; i < 12; i++, var_r31++) { + if (i_this->action == ACTION_CHANCE) { + var_f27 = var_f31 * cM_ssin((i_this->counter * (TREG_S(0) + 1000)) + (i * (TREG_S(1) + 12000))); + var_f26 = var_f31 * cM_scos((i_this->counter * (TREG_S(2) + 1300)) + (i * (TREG_S(3) + 10000))); + } else { + var_f27 = var_f31 * cM_ssin((i_this->counter * (TREG_S(0) + 2000)) + (i * (TREG_S(1) + 12000))); + var_f26 = var_f31 * cM_scos((i_this->counter * (TREG_S(2) + 2300)) + (i * (TREG_S(3) + 10000))); + + static s16 pow_xa[] = { + 0x0000, + 0x0000, + 0x1000, + 0x2000, + 0x3000, + 0x4000, + 0x3000, + 0x2000, + 0x1000, + 0x0000, + 0x0000, + }; + + if (i_this->field_0x851 != 0) { + cMtx_YrotS(*calc_mtx, (s16)actor->shape_angle.y); + cMtx_XrotM(*calc_mtx, pow_xa[i - 1] + 0x8000); + } else { + cMtx_YrotS(*calc_mtx, (s16)actor->shape_angle.y); + cMtx_XrotM(*calc_mtx, pow_xa[i - 1]); + } + + MtxScale(temp_f28, temp_f28, temp_f28, 1); + MtxPosition(&sp28, &sp1C); + } + + temp_f30 = var_f27 + (sp1C.x + (var_r31[0].x - var_r31[-1].x)); + temp_f25 = (var_r31[0].y - var_r31[-1].y) - sp1C.y; + temp_f29 = var_f26 + (sp1C.z + (var_r31[0].z - var_r31[-1].z)); + + s16 spA, sp8; + sp8 = (s16)cM_atan2s(temp_f30, temp_f29); + spA = -cM_atan2s(temp_f25, JMAFastSqrt(SQUARE(temp_f30) + SQUARE(temp_f29))); + cMtx_YrotS(*calc_mtx, sp8); + cMtx_XrotM(*calc_mtx, spA); + MtxPosition(&sp40, &sp34); + + *var_r31 = var_r31[-1] + sp34; + } } /* 804FE8F8-804FEA6C 002C78 0174+00 1/1 0/0 0/0 .text kuki_control2__FP10e_hb_class */ -static void kuki_control2(e_hb_class* param_0) { - // NONMATCHING +static void kuki_control2(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp28; + cXyz sp1C; + + int i; + s16 temp_r27, temp_r26; + cXyz* var_r31 = &i_this->field_0x6a0[11]; + csXyz* var_r30 = &i_this->field_0x730[11]; + + *var_r31 = actor->current.pos; + + sp28.x = 0.0f; + sp28.y = 0.0f; + sp28.z = i_this->field_0x844; + + var_r31--; + var_r30--; + + for (i = 10; i >= 0; i--, var_r31--, var_r30--) { + f32 temp_f31 = var_r31[0].x - var_r31[1].x; + f32 temp_f29 = var_r31[0].y - var_r31[1].y; + f32 temp_f30 = var_r31[0].z - var_r31[1].z; + + temp_r26 = (s16)cM_atan2s(temp_f31, temp_f30); + temp_r27 = -cM_atan2s(temp_f29, JMAFastSqrt(SQUARE(temp_f31) + SQUARE(temp_f30))); + cMtx_YrotS(*calc_mtx, temp_r26); + cMtx_XrotM(*calc_mtx, temp_r27); + MtxPosition(&sp28, &sp1C); + *var_r31 = var_r31[1] + sp1C; + var_r30->x = temp_r27; + var_r30->y = temp_r26; + } } -/* ############################################################################################## */ -/* 80500BE4-80500BE8 0000E0 0004+00 1/1 0/0 0/0 .rodata @4725 */ -SECTION_RODATA static f32 const lit_4725 = 11.0f; -COMPILER_STRIP_GATE(0x80500BE4, &lit_4725); - /* 804FEA6C-804FEB48 002DEC 00DC+00 1/1 0/0 0/0 .text kuki_control3__FP10e_hb_class */ -static void kuki_control3(e_hb_class* param_0) { - // NONMATCHING +static void kuki_control3(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp20; + + sp20 = i_this->field_0x6a0[0] - actor->home.pos; + + cXyz* var_r29 = i_this->field_0x6a0; + for (int i = 0; i < 12; i++, var_r29++) { + *var_r29 -= sp20 * ((12 - i) / 11.0f); + } } /* 804FEB48-804FEC34 002EC8 00EC+00 1/1 0/0 0/0 .text kuki_ha_set__FP10e_hb_class */ -static void kuki_ha_set(e_hb_class* param_0) { - // NONMATCHING +static void kuki_ha_set(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz* ppos = i_this->field_0x6a0; + csXyz* prot = i_this->field_0x730; + + for (int i = 0; i < 12; i++, ppos++, prot++) { + if (i > 0 && i < 11) { + if (i_this->thornModel[i] != NULL) { + mDoMtx_stack_c::transS(ppos->x, ppos->y, ppos->z); + mDoMtx_stack_c::YrotM(prot->y); + mDoMtx_stack_c::XrotM(prot->x); + mDoMtx_stack_c::ZrotM(i << 13); + mDoMtx_stack_c::scaleM(i_this->thorn_size[i], i_this->thorn_size[i], i_this->thorn_size[i]); + i_this->thornModel[i]->setBaseTRMtx(mDoMtx_stack_c::get()); + } + } + } +} + +static f32 dummyFloat() { + f32 temp = -10.0f; + temp += 10000.0f; + temp += 65536.0f; + temp += -5.0f; + return temp; } /* 804FEC34-804FF214 002FB4 05E0+00 2/1 0/0 0/0 .text action__FP10e_hb_class */ -static void action(e_hb_class* param_0) { - // NONMATCHING +static void action(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + fopAc_ac_c* player = dComIfGp_getPlayer(0); + cXyz sp70; + cXyz sp64; + + i_this->angle_to_player = fopAcM_searchPlayerAngleY(actor); + i_this->dist_to_player = (actor->home.pos - player->current.pos).abs(); + actor->field_0x566 = 0; + i_this->field_0x1231 = 1; + + damage_check(i_this); + + if (i_this->invulnerabilityTimer != 0 && i_this->field_0x852 != 0) { + daPy_getPlayerActorClass()->offDkCaught(); + daPy_getPlayerActorClass()->offDkCaught2(); + } + + s8 attn_ON = FALSE; + s8 spA = FALSE; + s8 kuki_sph_ON = FALSE; + s8 sound_pl_search = FALSE; + + i_this->ccSph.OnCoSetBit(); + i_this->field_0x852 = 0; + + switch (i_this->action) { + case ACTION_STAY: + e_hb_stay(i_this); + i_this->field_0x1231 = 0; + break; + case ACTION_APPEAR: + e_hb_appear(i_this); + attn_ON = TRUE; + kuki_sph_ON = TRUE; + actor->field_0x566 = 1; + sound_pl_search = TRUE; + break; + case ACTION_APPEAR_V: + e_hb_appear_v(i_this); + attn_ON = TRUE; + kuki_sph_ON = TRUE; + actor->field_0x566 = 1; + sound_pl_search = TRUE; + break; + case ACTION_WAIT: + e_hb_wait(i_this); + attn_ON = TRUE; + kuki_sph_ON = TRUE; + actor->field_0x566 = 1; + sound_pl_search = TRUE; + break; + case ACTION_ATTACK: + e_hb_attack(i_this); + attn_ON = TRUE; + kuki_sph_ON = TRUE; + actor->field_0x566 = 1; + sound_pl_search = TRUE; + break; + case ACTION_CHANCE: + e_hb_chance(i_this); + attn_ON = TRUE; + kuki_sph_ON = TRUE; + actor->field_0x566 = 1; + sound_pl_search = TRUE; + break; + case ACTION_S_DAMAGE: + e_hb_s_damage(i_this); + attn_ON = TRUE; + kuki_sph_ON = TRUE; + actor->field_0x566 = 1; + sound_pl_search = TRUE; + break; + case ACTION_DAMAGE: + e_hb_damage(i_this); + attn_ON = TRUE; + break; + } + + if (sound_pl_search) { + i_this->sound.setLinkSearch(true); + } else { + i_this->sound.setLinkSearch(false); + } + + if (attn_ON) { + fopAcM_OnStatus(actor, 0); + actor->attention_info.flags = 4; + } else { + fopAcM_OffStatus(actor, 0); + actor->attention_info.flags = 0; + } + + if (!spA) { + sp70 = actor->current.pos - actor->home.pos; + i_this->field_0x844 = i_this->field_0x848 * ((0.2f + TREG_F(1)) * sp70.abs()); + if (i_this->field_0x844 > 25.0f + TREG_F(7)) { + i_this->field_0x844 = 25.0f + TREG_F(7); + } + + cLib_addCalc2(&i_this->field_0x848, 1.0f, 1.0f, 0.01f); + kuki_control1(i_this); + kuki_control2(i_this); + kuki_control3(i_this); + kuki_ha_set(i_this); + + e_hb_leaf_class* pleaf = (e_hb_leaf_class*)fopAcM_SearchByID(i_this->leaf_actor_id); + if (pleaf != NULL) { + pleaf->mpMorf->play(NULL, 0, 0); + } + + cLib_addCalc2(&i_this->field_0x84c, 1.0f, 1.0f, 0.05f); + } else { + kuki_ha_set(i_this); + } + + cXyz* sp1C = i_this->field_0x6a0; + cXyz* pkukipos = i_this->stalkLine.getPos(0); + cXyz hide_offset(-30000.0f, 300000.0f, 30000.0f); + int kuki_no = 0; + + for (int i = 0; i < 12; i++, pkukipos++, sp1C++) { + *pkukipos = *sp1C; + if (i == 3 || i == 5 || i == 7 || i == 9) { + if (kuki_sph_ON) { + i_this->kukiSph[kuki_no].SetC(*sp1C); + i_this->kukiSph[kuki_no].SetR(30.0f); + } else { + i_this->kukiSph[kuki_no].SetC(*sp1C + hide_offset); + } + + dComIfG_Ccsp()->Set(&i_this->kukiSph[kuki_no]); + kuki_no++; + } + } + + cLib_addCalc0(&i_this->field_0x854, 1.0f, 5.0f + TREG_F(12)); + + cXyz effsize(1.0f, 1.0f, 1.0f); + setMidnaBindEffect((fopEn_enemy_c*)actor, &i_this->sound, &actor->eyePos, &effsize); } /* 804FF214-804FF5DC 003594 03C8+00 1/1 0/0 0/0 .text eff_set__FP10e_hb_classi */ -static void eff_set(e_hb_class* param_0, int param_1) { - // NONMATCHING +static void eff_set(e_hb_class* i_this, int param_1) { + fopAc_ac_c* actor = &i_this->enemy; + J3DModel* model = i_this->modelMorf->getModel(); + + if (i_this->field_0x1230 != 0) { + i_this->field_0x1230--; + i_this->field_0x1231 = 3; + } + + f32 var_f31; + if (i_this->field_0x1231 != 1) { + var_f31 = 0.0f; + } else { + var_f31 = 1.0f; + } + cLib_addCalc2(&i_this->field_0x124c, var_f31, 1.0f, 0.05f); + + for (int i = 0; i <= 2; i++) { + static u16 p_name[] = {0x8339, 0x833A, 0x833B}; + static int p_idx[] = {2, 2, 6}; + + if (param_1 == 0) { + i_this->field_0x1234[i] = dComIfGp_particle_set(i_this->field_0x1234[i], p_name[i], &actor->current.pos, NULL, NULL); + } + + JPABaseEmitter* pemitter = dComIfGp_particle_getEmitter(i_this->field_0x1234[i]); + if (pemitter != NULL) { + if (param_1 != 0) { + pemitter->deleteAllParticle(); + dComIfGp_particle_levelEmitterOnEventMove(i_this->field_0x1234[i]); + } else { + MTXCopy(model->getAnmMtx(p_idx[i]), *calc_mtx); + MtxScale(i_this->field_0x124c, i_this->field_0x124c, i_this->field_0x124c, 1); + pemitter->setGlobalSRTMatrix(*calc_mtx); + } + } + } + + if (i_this->field_0x1231 != 0) { + if (i_this->field_0x1231 == 1) { + cXyz sp8(actor->current.pos); + sp8.y += 100.0f; + + if (fopAcM_gc_c::gndCheck(&sp8)) { + sp8.y = fopAcM_gc_c::getGroundY(); + } + + i_this->field_0x1244 = dComIfGp_particle_set(i_this->field_0x1244, 0x8338, &sp8, NULL, NULL); + } else if (i_this->field_0x1231 == 2) { + i_this->field_0x1240 = dComIfGp_particle_set(i_this->field_0x1240, 0x8336, &actor->current.pos, NULL, NULL); + + JPABaseEmitter* pemitter = dComIfGp_particle_getEmitter(i_this->field_0x1240); + if (pemitter != NULL) { + MTXCopy(model->getAnmMtx(1), *calc_mtx); + pemitter->setGlobalRTMatrix(*calc_mtx); + } + } else if (i_this->field_0x1231 == 3) { + i_this->field_0x1248 = dComIfGp_particle_set(i_this->field_0x1248, 0x8337, &actor->current.pos, NULL, NULL); + + JPABaseEmitter* pemitter = dComIfGp_particle_getEmitter(i_this->field_0x1248); + if (pemitter != NULL) { + MTXCopy(model->getAnmMtx(1), *calc_mtx); + pemitter->setGlobalRTMatrix(*calc_mtx); + } + } + + i_this->field_0x1231 = 0; + } } -/* ############################################################################################## */ -/* 80500BE8-80500BEC 0000E4 0004+00 0/0 0/0 0/0 .rodata @4821 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4821 = -10.0f; -COMPILER_STRIP_GATE(0x80500BE8, &lit_4821); -#pragma pop - -/* 80500BEC-80500BF0 0000E8 0004+00 0/1 0/0 0/0 .rodata @4822 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4822 = 10000.0f; -COMPILER_STRIP_GATE(0x80500BEC, &lit_4822); -#pragma pop - -/* 80500BF0-80500BF4 0000EC 0004+00 0/0 0/0 0/0 .rodata @4823 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4823 = 65536.0f; -COMPILER_STRIP_GATE(0x80500BF0, &lit_4823); -#pragma pop - -/* 80500BF4-80500BF8 0000F0 0004+00 0/0 0/0 0/0 .rodata @4824 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4824 = -5.0f; -COMPILER_STRIP_GATE(0x80500BF4, &lit_4824); -#pragma pop - -/* 80500BF8-80500BFC 0000F4 0004+00 0/0 0/0 0/0 .rodata @4963 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4963 = 25.0f; -COMPILER_STRIP_GATE(0x80500BF8, &lit_4963); -#pragma pop - -/* 80500BFC-80500C00 0000F8 0004+00 0/1 0/0 0/0 .rodata @4964 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4964 = -30000.0f; -COMPILER_STRIP_GATE(0x80500BFC, &lit_4964); -#pragma pop - -/* 80500C00-80500C04 0000FC 0004+00 0/0 0/0 0/0 .rodata @4965 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4965 = 300000.0f; -COMPILER_STRIP_GATE(0x80500C00, &lit_4965); -#pragma pop - -/* 80500C04-80500C08 000100 0004+00 0/0 0/0 0/0 .rodata @4966 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_4966 = 30000.0f; -COMPILER_STRIP_GATE(0x80500C04, &lit_4966); -#pragma pop - -/* 80500C08-80500C0C 000104 0004+00 0/1 0/0 0/0 .rodata @5136 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5136 = 22.0f; -COMPILER_STRIP_GATE(0x80500C08, &lit_5136); -#pragma pop - -/* 80500C0C-80500C10 000108 0004+00 0/1 0/0 0/0 .rodata @5137 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5137 = 21.0f; -COMPILER_STRIP_GATE(0x80500C0C, &lit_5137); -#pragma pop - /* 804FF5DC-804FF744 00395C 0168+00 1/1 0/0 0/0 .text anm_se_set__FP10e_hb_class */ -static void anm_se_set(e_hb_class* param_0) { - // NONMATCHING +static void anm_se_set(e_hb_class* i_this) { + if (i_this->anm == 5) { + if (i_this->modelMorf->checkFrame(22.0f)) { + i_this->sound.startCreatureSound(Z2SE_EN_DB_BERON, 0, -1); + } + } else if (i_this->anm == 6) { + if (i_this->modelMorf->checkFrame(21.0f)) { + i_this->sound.startCreatureSound(Z2SE_EN_DB_ATTACK, 0, -1); + } + } else if (i_this->anm == 17) { + if (i_this->modelMorf->checkFrame(15.0f)) { + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_AWAKE, -1); + } + } else if (i_this->anm == 15) { + if (i_this->modelMorf->checkFrame(3.0f)) { + i_this->sound.startCreatureVoice(Z2SE_EN_DB_V_CREEP, -1); + } + } } - -/* ############################################################################################## */ -/* 80500C10-80500C14 00010C 0004+00 0/1 0/0 0/0 .rodata @5234 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5234 = -20000.0f; -COMPILER_STRIP_GATE(0x80500C10, &lit_5234); -#pragma pop - /* 804FF744-804FFAFC 003AC4 03B8+00 2/1 0/0 0/0 .text daE_HB_Execute__FP10e_hb_class */ -static void daE_HB_Execute(e_hb_class* param_0) { - // NONMATCHING +static int daE_HB_Execute(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + cXyz sp4C; + cXyz sp40; + + if (i_this->field_0x850 != 0) { + i_this->field_0x850--; + if (i_this->field_0x850 == 0) { + fopAcM_delete(actor); + } + return 1; + } + + if (actor->health == 1000) { + cXyz effsize(1.0f, 1.0f, 1.0f); + u16 effname = 0x109; + cXyz effpos(actor->current.pos); + + dComIfGp_particle_set(effname, &effpos, NULL, &effsize); + fopAcM_delete(actor); + return 1; + } + + i_this->counter++; + + for (int i = 0; i < 3; i++) { + if (i_this->timers[i] != 0) { + i_this->timers[i]--; + } + } + + if (i_this->invulnerabilityTimer != 0) { + i_this->invulnerabilityTimer--; + } + + action(i_this); + anm_se_set(i_this); + + mDoMtx_stack_c::transS(actor->current.pos.x, actor->current.pos.y, actor->current.pos.z); + mDoMtx_stack_c::YrotM(actor->shape_angle.y); + mDoMtx_stack_c::XrotM(actor->shape_angle.x); + mDoMtx_stack_c::ZrotM(actor->shape_angle.z); + + cLib_addCalcAngleS2(&actor->shape_angle.z, 0, 8, 0x400); + + f32 size = l_HIO.base_size * i_this->size; + mDoMtx_stack_c::scaleM(size, size, size); + + J3DModel* model = i_this->modelMorf->getModel(); + model->setBaseTRMtx(mDoMtx_stack_c::get()); + + i_this->modelMorf->play(0, dComIfGp_getReverb(fopAcM_GetRoomNo(actor))); + i_this->modelMorf->modelCalc(); + + cXyz hide_offset(-30000.0f, 10000.0f, -20000.0f); + + MTXCopy(model->getAnmMtx(1), *calc_mtx); + sp4C.set(30.0f + JREG_F(0), KREG_F(1), KREG_F(2)); + + if (i_this->field_0x851 != 0) { + actor->eyePos = i_this->field_0x6a0[YREG_S(3) + 6]; + actor->attention_info.position = actor->eyePos; + i_this->ccSph.SetTgType(0xD8FBFDBF); + } else { + MtxPosition(&sp4C, &actor->eyePos); + actor->attention_info.position = actor->eyePos; + actor->attention_info.position.y += 60.0f; + i_this->ccSph.SetTgType(0xD8FBFDFF); + } + + MtxPosition(&sp4C, &sp40); + if (i_this->invulnerabilityTimer != 0) { + sp40 += hide_offset; + } + + i_this->ccSph.SetC(sp40); + i_this->ccSph.SetR(((40.0f + JREG_F(2)) * l_HIO.base_size) * i_this->size); + dComIfG_Ccsp()->Set(&i_this->ccSph); + + if (i_this->field_0xb0c != 0) { + i_this->atSph.MoveCAt(sp40); + i_this->field_0xb0c = 0; + } else { + i_this->atSph.SetC(sp40 + hide_offset); + } + + i_this->atSph.SetR(((30.0f + JREG_F(3)) * l_HIO.base_size) * i_this->size); + dComIfG_Ccsp()->Set(&i_this->atSph); + eff_set(i_this, 0); + return 1; } /* 804FFAFC-804FFB04 003E7C 0008+00 1/0 0/0 0/0 .text daE_HB_IsDelete__FP10e_hb_class */ -static bool daE_HB_IsDelete(e_hb_class* param_0) { - return true; +static int daE_HB_IsDelete(e_hb_class* i_this) { + return 1; } /* 804FFB04-804FFB6C 003E84 0068+00 1/0 0/0 0/0 .text daE_HB_Delete__FP10e_hb_class */ -static void daE_HB_Delete(e_hb_class* param_0) { - // NONMATCHING +static int daE_HB_Delete(e_hb_class* i_this) { + fopAc_ac_c* actor = &i_this->enemy; + fpc_ProcID id = fopAcM_GetID(i_this); + dComIfG_resDelete(&i_this->phase, "E_hb"); + + if (i_this->HIOInit) { + l_HIOInit = FALSE; + mDoHIO_DELETE_CHILD(l_HIO.id); + } + + if (actor->heap != NULL) { + i_this->modelMorf->stopZelAnime(); + } + + return 1; } /* 804FFB6C-804FFD60 003EEC 01F4+00 1/1 0/0 0/0 .text useHeapInit__FP10fopAc_ac_c */ -static void useHeapInit(fopAc_ac_c* param_0) { - // NONMATCHING +static int useHeapInit(fopAc_ac_c* i_this) { + e_hb_class* a_this = (e_hb_class*)i_this; + + a_this->modelMorf = new mDoExt_McaMorfSO((J3DModelData*)dComIfG_getObjectRes("E_hb", 0x17), NULL, NULL, (J3DAnmTransform*)dComIfG_getObjectRes("E_hb", 0x12), 2, 1.0f, 0, -1, &a_this->sound, 0x80000, 0x11000084); + if (a_this->modelMorf == NULL || a_this->modelMorf->getModel() == NULL) { + return 0; + } + + if (!a_this->stalkLine.init(1, 12, (ResTIMG*)dComIfG_getObjectRes("E_hb", 0x1D), 1)) { + return 0; + } + + f32* psize = a_this->stalkLine.getSize(0); + for (int i = 0; i < 12; i++, psize++) { + *psize = 5.0f + (0.1f * XREG_S(0)); + } + + J3DModelData* modelData = (J3DModelData*)dComIfG_getObjectRes("E_hb", 0x19); + JUT_ASSERT(3031, modelData != 0); + + for (int i = 1; i < 11; i++) { + if (i & 1) { + a_this->thornModel[i] = mDoExt_J3DModel__create(modelData, 0x80000, 0x11000084); + if (a_this->thornModel[i] == NULL) { + return 0; + } + + a_this->thorn_size[i] = 1.0f + cM_rndF(1.0f); + } + } + + return 1; } -/* ############################################################################################## */ -/* 80500C14-80500C18 000110 0004+00 0/1 0/0 0/0 .rodata @5440 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5440 = 500.0f; -COMPILER_STRIP_GATE(0x80500C14, &lit_5440); -#pragma pop - -/* 80500C18-80500C1C 000114 0004+00 0/1 0/0 0/0 .rodata @5441 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5441 = -300.0f; -COMPILER_STRIP_GATE(0x80500C18, &lit_5441); -#pragma pop - -/* 80500C1C-80500C20 000118 0004+00 0/1 0/0 0/0 .rodata @5442 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5442 = -400.0f; -COMPILER_STRIP_GATE(0x80500C1C, &lit_5442); -#pragma pop - -/* 80500C20-80500C24 00011C 0004+00 0/1 0/0 0/0 .rodata @5443 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5443 = 300.0f; -COMPILER_STRIP_GATE(0x80500C20, &lit_5443); -#pragma pop - -/* 80500C24-80500C2C 000120 0004+04 0/1 0/0 0/0 .rodata @5444 */ -#pragma push -#pragma force_active on -SECTION_RODATA static f32 const lit_5444[1 + 1 /* padding */] = { - 65535.0f, - /* padding */ - 0.0f, -}; -COMPILER_STRIP_GATE(0x80500C24, &lit_5444); -#pragma pop - -/* 80500C2C-80500C34 000128 0008+00 0/1 0/0 0/0 .rodata @5446 */ -#pragma push -#pragma force_active on -SECTION_RODATA static u8 const lit_5446[8] = { - 0x43, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; -COMPILER_STRIP_GATE(0x80500C2C, &lit_5446); -#pragma pop - /* 804FFD60-80500264 0040E0 0504+00 1/0 0/0 0/0 .text daE_HB_Create__FP10fopAc_ac_c */ -static void daE_HB_Create(fopAc_ac_c* param_0) { - // NONMATCHING +static int daE_HB_Create(fopAc_ac_c* i_this) { + e_hb_class* a_this = (e_hb_class*)i_this; + fopAcM_SetupActor(i_this, e_hb_class); + + int phase_state = dComIfG_resLoad(&a_this->phase, "E_hb"); + if (phase_state == cPhs_COMPLEATE_e) { + OS_REPORT("E_HB PARAM %x\n", fopAcM_GetParam(i_this)); + + u8 swbit = ((fopAcM_GetParam(i_this) & 0xFF000000) >> 0x18); + if (swbit != 0xFF && dComIfGs_isSwitch(swbit, fopAcM_GetRoomNo(i_this))) { + OS_REPORT("E_HB やられ後なので再セットしません\n"); + return cPhs_ERROR_e; + } + + a_this->arg0 = fopAcM_GetParam(i_this) & 0xF; + a_this->arg1 = (fopAcM_GetParam(i_this) & 0x30) >> 4; + a_this->arg2 = (fopAcM_GetParam(i_this) & 0xC0) >> 6; + a_this->arg3 = (fopAcM_GetParam(i_this) & 0xFF00) >> 8; + + if (a_this->arg0 == 0xF) { + a_this->arg0 = 0; + } + + if (a_this->arg3 == 0xFF || a_this->arg3 == 0) { + a_this->pl_search_range = 500.0f; + } else { + a_this->pl_search_range = 100.0f * a_this->arg3; + } + + OS_REPORT("E_HB//////////////E_HB SET 1 !!\n"); + + if (!fopAcM_entrySolidHeap(i_this, useHeapInit, 0x4060)) { + OS_REPORT("//////////////E_HB SET NON !!\n"); + return cPhs_ERROR_e; + } + + OS_REPORT("//////////////E_HB SET 2 !!\n"); + + if (!l_HIOInit) { + a_this->HIOInit = TRUE; + l_HIOInit = TRUE; + l_HIO.id = mDoHIO_CREATE_CHILD("デグババ(ボックリ)", &l_HIO); + } + + i_this->attention_info.flags = 4; + + fopAcM_SetMtx(i_this, a_this->modelMorf->getModel()->getBaseTRMtx()); + fopAcM_SetMin(i_this, -300.0f, -400.0f, -300.0f); + fopAcM_SetMax(i_this, 300.0f, 400.0f, 300.0f); + + i_this->health = 30; + i_this->field_0x560 = 30; + + static dCcD_SrcSph cc_sph_src = { + { + {0x0, {{0x0, 0x0, 0xd}, {0xd8fbfdff, 0x3}, 0x25}}, // mObj + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt + {dCcD_SE_STONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 40.0f} // mSph + } // mSphAttr + }; + + static dCcD_SrcSph at_sph_src = { + { + {0x0, {{AT_TYPE_CSTATUE_SWING, 0x1, 0xd}, {0x0, 0x0}, 0x0}}, // mObj + {dCcD_SE_HARD_BODY, 0x0, 0x0, 0x0, 0x0}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 35.0f} // mSph + } // mSphAttr + }; + + static dCcD_SrcSph kuki_sph_src = { + { + {0x0, {{0x0, 0x0, 0xd}, {0xd8fbfdff, 0x3}, 0x0}}, // mObj + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x0}, // mGObjAt + {dCcD_SE_NONE, 0x0, 0x0, 0x0, 0x2}, // mGObjTg + {0x0}, // mGObjCo + }, // mObjInf + { + {{0.0f, 0.0f, 0.0f}, 20.0f} // mSph + } // mSphAttr + }; + + a_this->ccStts.Init(100, 0, i_this); + + a_this->ccSph.Set(cc_sph_src); + a_this->ccSph.SetStts(&a_this->ccStts); + + a_this->atSph.Set(at_sph_src); + a_this->atSph.SetStts(&a_this->ccStts); + + for (int i = 0; i < 4; i++) { + a_this->kukiSph[i].Set(kuki_sph_src); + a_this->kukiSph[i].SetStts(&a_this->ccStts); + } + + a_this->acch.Set(fopAcM_GetPosition_p(i_this), fopAcM_GetOldPosition_p(i_this), i_this, 1, &a_this->acchcir, fopAcM_GetSpeed_p(i_this), NULL, NULL); + + a_this->acchcir.SetWall(50.0f, 50.0f); + a_this->sound.init(&i_this->current.pos, &i_this->eyePos, 3, 1); + a_this->sound.setEnemyName("E_hb"); + + a_this->atInfo.mpSound = &a_this->sound; + a_this->atInfo.mPowerType = 1; + a_this->atInfo.field_0x18 = 45; + a_this->counter = cM_rndF(65535.0f); + a_this->size = l_HIO.flower_size; + + if (a_this->arg0 == 2) { + i_this->current.angle.x = -0x8000; + i_this->shape_angle.x = -0x8000; + a_this->field_0x851 = 1; + } + + a_this->leaf_actor_id = fopAcM_createChild(PROC_E_HB_LEAF, fopAcM_GetID(i_this), 0, &i_this->current.pos, fopAcM_GetRoomNo(i_this), &i_this->shape_angle, NULL, -1, NULL); + i_this->field_0x565 = (fopAcM_GetParam(i_this) & 0xFF0000) >> 0x10; + i_this->field_0x564 = (fopAcM_GetParam(i_this) & 0xFF000000) >> 0x18; + + daE_HB_Execute(a_this); + } + + return phase_state; } -/* 80500264-805002D4 0045E4 0070+00 3/2 0/0 0/0 .text __dt__12dBgS_ObjAcchFv */ -// dBgS_ObjAcch::~dBgS_ObjAcch() { -extern "C" void __dt__12dBgS_ObjAcchFv() { - // NONMATCHING -} +/* 80500D88-80500DA8 -00001 0020+00 1/0 0/0 0/0 .data l_daE_HB_Method */ +static actor_method_class l_daE_HB_Method = { + (process_method_func)daE_HB_Create, + (process_method_func)daE_HB_Delete, + (process_method_func)daE_HB_Execute, + (process_method_func)daE_HB_IsDelete, + (process_method_func)daE_HB_Draw, +}; -/* 805002D4-80500344 004654 0070+00 1/0 0/0 0/0 .text __dt__12dBgS_AcchCirFv */ -// dBgS_AcchCir::~dBgS_AcchCir() { -extern "C" void __dt__12dBgS_AcchCirFv() { - // NONMATCHING -} - -/* 80500344-805003C8 0046C4 0084+00 1/1 0/0 0/0 .text __ct__8dCcD_SphFv */ -// dCcD_Sph::dCcD_Sph() { -extern "C" void __ct__8dCcD_SphFv() { - // NONMATCHING -} - -/* 805003C8-80500494 004748 00CC+00 1/1 0/0 0/0 .text __dt__8dCcD_SphFv */ -// dCcD_Sph::~dCcD_Sph() { -extern "C" void __dt__8dCcD_SphFv() { - // NONMATCHING -} - -/* 80500494-805004DC 004814 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGSphFv */ -// cM3dGSph::~cM3dGSph() { -extern "C" void __dt__8cM3dGSphFv() { - // NONMATCHING -} - -/* 805004DC-80500524 00485C 0048+00 1/0 0/0 0/0 .text __dt__8cM3dGAabFv */ -// cM3dGAab::~cM3dGAab() { -extern "C" void __dt__8cM3dGAabFv() { - // NONMATCHING -} - -/* 80500524-80500580 0048A4 005C+00 1/0 0/0 0/0 .text __dt__10dCcD_GSttsFv */ -// dCcD_GStts::~dCcD_GStts() { -extern "C" void __dt__10dCcD_GSttsFv() { - // NONMATCHING -} - -/* 80500580-80500584 004900 0004+00 1/1 0/0 0/0 .text __ct__5csXyzFv */ -// csXyz::csXyz() { -extern "C" void __ct__5csXyzFv() { - /* empty function */ -} - -/* 80500584-80500588 004904 0004+00 1/1 0/0 0/0 .text __ct__4cXyzFv */ -// cXyz::cXyz() { -extern "C" void __ct__4cXyzFv() { - /* empty function */ -} - -/* 80500588-805005D0 004908 0048+00 1/0 0/0 0/0 .text __dt__10cCcD_GSttsFv */ -// cCcD_GStts::~cCcD_GStts() { -extern "C" void __dt__10cCcD_GSttsFv() { - // NONMATCHING -} - -/* 805005D0-80500618 004950 0048+00 2/1 0/0 0/0 .text __dt__12daE_HB_HIO_cFv */ -daE_HB_HIO_c::~daE_HB_HIO_c() { - // NONMATCHING -} - -/* 80500618-80500654 004998 003C+00 0/0 1/0 0/0 .text __sinit_d_a_e_hb_cpp */ -void __sinit_d_a_e_hb_cpp() { - // NONMATCHING -} - -#pragma push -#pragma force_active on -REGISTER_CTORS(0x80500618, __sinit_d_a_e_hb_cpp); -#pragma pop - -/* 80500654-8050065C 0049D4 0008+00 1/0 0/0 0/0 .text @36@__dt__12dBgS_ObjAcchFv */ -static void func_80500654() { - // NONMATCHING -} - -/* 8050065C-80500664 0049DC 0008+00 1/0 0/0 0/0 .text @20@__dt__12dBgS_ObjAcchFv */ -static void func_8050065C() { - // NONMATCHING -} - -/* 80500A78-80500AB4 004DF8 003C+00 1/1 0/0 0/0 .text __dt__5csXyzFv */ -// csXyz::~csXyz() { -extern "C" void __dt__5csXyzFv() { - // NONMATCHING -} - -/* 80500AB4-80500AF0 004E34 003C+00 1/1 0/0 0/0 .text __dt__4cXyzFv */ -// cXyz::~cXyz() { -extern "C" void __dt__4cXyzFv() { - // NONMATCHING -} - -/* 80500C34-80500C34 000130 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ +/* 80500DA8-80500DD8 -00001 0030+00 0/0 0/0 1/0 .data g_profile_E_HB */ +extern actor_process_profile_definition g_profile_E_HB = { + fpcLy_CURRENT_e, // mLayerID + 7, // mListID + fpcPi_CURRENT_e, // mListPrio + PROC_E_HB, // mProcName + &g_fpcLf_Method.base, // sub_method + sizeof(e_hb_class), // mSize + 0, // mSizeOther + 0, // mParameters + &g_fopAc_Method.base, // sub_method + 140, // mPriority + &l_daE_HB_Method, // sub_method + 0x10050100, // mStatus + fopAc_ENEMY_e, // mActorType + fopAc_CULLBOX_CUSTOM_e, // cullType +}; diff --git a/src/d/actor/d_a_obj_bk_leaf.cpp b/src/d/actor/d_a_obj_bk_leaf.cpp index 98fa7bf4b1..26081f72cb 100644 --- a/src/d/actor/d_a_obj_bk_leaf.cpp +++ b/src/d/actor/d_a_obj_bk_leaf.cpp @@ -13,10 +13,10 @@ static int CheckCreateHeap(fopAc_ac_c* i_this) { } /* 80BB60F8-80BB618C 000098 0094+00 2/2 0/0 0/0 .text setBokkuri__10daBkLeaf_cFv */ -// fake match? void daBkLeaf_c::setBokkuri() { - csXyz currentAngle = current.angle; - daObjCarry_c::make_prm(¤tAngle, 6, getItem(), getItemBit(), 1, 2); + u32 sp10 = 0; + csXyz currentAngle(current.angle); + daObjCarry_c::make_prm(&sp10, ¤tAngle, 6, getItem(), getItemBit(), 1, 2); field_0x578 = fopAcM_createChild(PROC_Obj_Carry, fopAcM_GetID(this), 0, ¤t.pos, fopAcM_GetRoomNo(this), ¤tAngle, &scale, -1, 0); } diff --git a/src/d/d_gameover.cpp b/src/d/d_gameover.cpp index 6c5c91c446..5d07b5e5d0 100644 --- a/src/d/d_gameover.cpp +++ b/src/d/d_gameover.cpp @@ -100,7 +100,7 @@ static u8 cNullVec__6Z2Calc[12] = { /* 803BBBC8-803BBC34 018CE8 006C+00 2/3 0/0 0/0 .data init_process */ typedef void (dGameover_c::*initFunc)(); -initFunc init_process[] = { +static initFunc init_process[] = { &dGameover_c::playerAnmWait_init, &dGameover_c::dispFadeOut_init, &dGameover_c::dispWait_init, &dGameover_c::demoFadeIn_init, &dGameover_c::demoFadeOut_init, &dGameover_c::saveOpen_init, &dGameover_c::saveMove_init, &dGameover_c::saveClose_init, &dGameover_c::deleteWait_init, @@ -108,7 +108,7 @@ initFunc init_process[] = { /* 803BBCA0-803BBD0C 018DC0 006C+00 1/2 0/0 0/0 .data move_process */ typedef void (dGameover_c::*moveFunc)(); -moveFunc move_process[] = { +static moveFunc move_process[] = { &dGameover_c::playerAnmWait_proc, &dGameover_c::dispFadeOut_proc, &dGameover_c::dispWait_proc, &dGameover_c::demoFadeIn_proc, &dGameover_c::demoFadeOut_proc, &dGameover_c::saveOpen_proc, &dGameover_c::saveMove_proc, &dGameover_c::saveClose_proc, &dGameover_c::deleteWait_proc, diff --git a/src/d/d_s_logo.cpp b/src/d/d_s_logo.cpp index f5f5afe456..410247f4d0 100644 --- a/src/d/d_s_logo.cpp +++ b/src/d/d_s_logo.cpp @@ -6,6 +6,7 @@ #include "d/d_s_logo.h" #include "JSystem/JKernel/JKRAram.h" #include "JSystem/JKernel/JKRExpHeap.h" +#include "JSystem/JKernel/JKRMemArchive.h" #include "c/c_dylink.h" #include "d/d_com_inf_game.h" #include "d/d_item.h" @@ -18,11 +19,22 @@ #if VERSION == VERSION_GCN_JPN #define LOGO_ARC "Logo" #define MSG_PATH "/res/Msgjp/bmgres.arc" +#elif VERSION == VERSION_GCN_PAL +#define LOGO_ARC "LogoPal" +#define MSG_PATH "/res/Msgus/bmgres.arc" #else #define LOGO_ARC "LogoUs" #define MSG_PATH "/res/Msgus/bmgres.arc" #endif +#if VERSION == VERSION_GCN_PAL +#define PROGRESSIVE_MODE_OFF OS_EURGB60_OFF +#define PROGRESSIVE_MODE_ON OS_EURGB60_ON +#else +#define PROGRESSIVE_MODE_OFF OS_PROGRESSIVE_MODE_OFF +#define PROGRESSIVE_MODE_ON OS_PROGRESSIVE_MODE_ON +#endif + /* 803C2E38-803C2E44 01FF58 000C+00 1/1 0/0 0/0 .data cNullVec__6Z2Calc */ static u8 cNullVec__6Z2Calc[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -80,12 +92,24 @@ bool dScnLogo_c::preLoad_dyl() { /* 80256198-80256210 250AD8 0078+00 1/1 0/0 0/0 .text checkProgSelect__10dScnLogo_cFv */ void dScnLogo_c::checkProgSelect() { + #if VERSION == VERSION_GCN_PAL + if (mDoRst::getProgSeqFlag() == 0) { + field_0x20a = 1; + + if (isProgressiveMode()) { + field_0x209 = 0; + } else { + field_0x209 = 1; + } + } + #else if (mDoRst::getProgSeqFlag() == 0 && VIGetDTVStatus() != 0) { if (isProgressiveMode() || mDoCPd_c::getHoldB(PAD_1)) { field_0x20a = 1; field_0x209 = 0; } } + #endif } /* 80256210-80256264 250B50 0054+00 1/1 0/0 0/0 .text draw__10dScnLogo_cFv */ @@ -139,12 +163,12 @@ void dScnLogo_c::progSelDraw() { if (mDoCPd_c::getTrigA(PAD_1) || mTimer == 0) { if (field_0x209 == 0) { mProgressiveSel->getPicture()->changeTexture(mProgressivePro, 0); - setProgressiveMode(1); + setProgressiveMode(PROGRESSIVE_MODE_ON); mDoRst::setProgChgFlag(1); mDoAud_seStart(Z2SE_SY_CURSOR_OK, NULL, 0, 0); } else { mProgressiveSel->getPicture()->changeTexture(mProgressiveInter, 0); - setProgressiveMode(0); + setProgressiveMode(PROGRESSIVE_MODE_OFF); mDoAud_seStart(Z2SE_SY_CURSOR_OK, NULL, 0, 0); } @@ -210,7 +234,11 @@ void dScnLogo_c::progOutDraw() { dComIfGd_set2DOpa(mProgressiveNo); if (mTimer == 0) { + #if VERSION == VERSION_GCN_PAL + if (field_0x218 == 1 && field_0x209 == 0) { + #else if (field_0x218 != 0 && field_0x209 == 0) { + #endif mExecCommand = EXEC_PROG_CHANGE; mTimer = 150; } else if (field_0x218 == 0 && field_0x209 != 0) { @@ -427,6 +455,12 @@ dScnLogo_c::~dScnLogo_c() { delete mProgressiveNo; delete mProgressiveSel; + #if VERSION == VERSION_GCN_PAL + mpPalLogoResCommand->getArchive()->removeResourceAll(); + mpPalLogoResCommand->getArchive()->unmount(); + mpPalLogoResCommand->destroy(); + #endif + preLoad_dyl_remove(); dComIfG_deleteObjectResMain(LOGO_ARC); @@ -513,6 +547,27 @@ static int phase_0(dScnLogo_c* i_this) { i_this->field_0x1d0 = JKRExpHeap::create(i_this->dummyGameAlloc, 0x340000, NULL, false); i_this->field_0x1d4 = JKRExpHeap::create(0x130000, i_this->field_0x1d0, false); + #if VERSION == VERSION_GCN_PAL + switch (i_this->getPalLanguage()) { + case 1: + i_this->mpPalLogoResCommand = mDoDvdThd_mountArchive_c::create("/res/Layout/LogoPalGm.arc", 0, NULL); + break; + case 2: + i_this->mpPalLogoResCommand = mDoDvdThd_mountArchive_c::create("/res/Layout/LogoPalFr.arc", 0, NULL); + break; + case 3: + i_this->mpPalLogoResCommand = mDoDvdThd_mountArchive_c::create("/res/Layout/LogoPalSp.arc", 0, NULL); + break; + case 4: + i_this->mpPalLogoResCommand = mDoDvdThd_mountArchive_c::create("/res/Layout/LogoPalIt.arc", 0, NULL); + break; + case 0: + default: + i_this->mpPalLogoResCommand = mDoDvdThd_mountArchive_c::create("/res/Layout/LogoPalUk.arc", 0, NULL); + break; + } + #endif + return cPhs_NEXT_e; } @@ -526,6 +581,16 @@ static int phase_1(dScnLogo_c* i_this) { return cPhs_INIT_e; } + #if VERSION == VERSION_GCN_PAL + if (!SyncWidthSound) { + return cPhs_INIT_e; + } + + if (!i_this->mpPalLogoResCommand->sync()) { + return cPhs_INIT_e; + } + #endif + dComIfG_setObjectRes(LOGO_ARC, (u8)0, i_this->field_0x1d0); mDoRst::setLogoScnFlag(1); archiveHeap->dump_sort(); @@ -605,6 +670,89 @@ void dScnLogo_c::logoInitGC() { ResTIMG* dolbyImg = (ResTIMG*)dComIfG_getObjectRes(LOGO_ARC, 3); mDolbyLogo = new dDlst_2D_c(dolbyImg, 189, 150, 232, 112, 255); +#if VERSION == VERSION_GCN_PAL + u8 language = getPalLanguage(); + if (language >= 5) { + language = 0; + } + + static const char* choice[] = { + "50_60_choice_eng.bti", + "50_60_choice_ger.bti", + "50_60_choice_fra.bti", + "50_60_choice_spa.bti", + "50_60_choice_ita.bti", + }; + + static const char* yes[] = { + "60_set_eng.bti", + "60_set_ger.bti", + "60_set_fra.bti", + "60_set_spa.bti", + "60_set_ita.bti", + }; + + static const char* no[] = { + "50_set_eng.bti", + "50_set_ger.bti", + "50_set_fra.bti", + "50_set_spa.bti", + "50_set_ita.bti", + }; + + static const char* prog[] = { + "progressive_pro.bti", + "progressive_pro_gm.bti", + "progressive_pro_fr.bti", + "progressive_pro_sp.bti", + "progressive_pro_it.bti", + }; + + static const char* intr[] = { + "progressive_inter.bti", + "progressive_inter_gm.bti", + "progressive_inter_fr.bti", + "progressive_inter_sp.bti", + "progressive_inter_it.bti", + }; + + static const char* warning[] = { + "warning.bti", + "warning_gm.bti", + "warning_fr.bti", + "warning_sp.bti", + "warning_it.bti", + }; + + static const char* warningPs[] = { + "warning_pstart.bti", + "warning_pstart_gm.bti", + "warning_pstart_fr.bti", + "warning_pstart_sp.bti", + "warning_pstart_it.bti", + }; + + ResTIMG* warningImg = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', warning[language]); + mWarning = new dDlst_2D_c(warningImg, 0, 0, 608, 448, 255); + + ResTIMG* warnStartImg = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', warningPs[language]); + mWarningStart = new dDlst_2D_c(warnStartImg, 0, 359, 608, 48, 255); + + ResTIMG* progChoiceImg = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', choice[language]); + mProgressiveChoice = new dDlst_2D_c(progChoiceImg, 113, 143, 416, 210, 255); + + ResTIMG* progYesImg = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', yes[language]); + mProgressiveYes = new dDlst_2D_c(progYesImg, 121, 352, 200, 72, 255); + mProgressiveYes->getPicture()->setWhite(JUtility::TColor(160, 160, 160, 255)); + + ResTIMG* progNoImg = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', no[language]); + mProgressiveNo = new dDlst_2D_c(progNoImg, 320, 352, 200, 72, 255); + mProgressiveNo->getPicture()->setWhite(JUtility::TColor(160, 160, 160, 255)); + + mProgressivePro = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', prog[language]); + mProgressiveInter = (ResTIMG*)mpPalLogoResCommand->getArchive()->getResource('DAT ', intr[language]); + mProgressiveSel = new dDlst_2D_c(mProgressivePro, 153, 309, 336, 88, 255); +#else ResTIMG* warningImg = (ResTIMG*)dComIfG_getObjectRes(LOGO_ARC, 10); mWarning = new dDlst_2D_c(warningImg, 0, 0, 608, 448, 255); @@ -625,6 +773,7 @@ void dScnLogo_c::logoInitGC() { mProgressivePro = (ResTIMG*)dComIfG_getObjectRes(LOGO_ARC, 8); mProgressiveInter = (ResTIMG*)dComIfG_getObjectRes(LOGO_ARC, 6); mProgressiveSel = new dDlst_2D_c(mProgressivePro, 153, 309, 336, 88, 255); +#endif } /* 80257FEC-80258420 25292C 0434+00 1/1 0/0 0/0 .text dvdDataLoad__10dScnLogo_cFv */ @@ -656,8 +805,30 @@ void dScnLogo_c::dvdDataLoad() { "/res/Layout/button.arc", 0, JKRArchive::MOUNT_ARAM, mDoExt_getJ2dHeap()); mpCardIconCommand = mDoDvdThd_mountXArchive_c::create( "/res/CardIcon/cardicon.arc", 0, JKRArchive::MOUNT_ARAM, mDoExt_getJ2dHeap()); - mpBmgResCommand = - mDoDvdThd_mountXArchive_c::create(MSG_PATH, 0, JKRArchive::MOUNT_MEM, NULL); + + #if VERSION == VERSION_GCN_PAL + switch (getPalLanguage()) { + case 1: + mpBmgResCommand = mDoDvdThd_mountXArchive_c::create("/res/Msgde/bmgres.arc", 0, JKRArchive::MOUNT_MEM, NULL); + break; + case 2: + mpBmgResCommand = mDoDvdThd_mountXArchive_c::create("/res/Msgfr/bmgres.arc", 0, JKRArchive::MOUNT_MEM, NULL); + break; + case 3: + mpBmgResCommand = mDoDvdThd_mountXArchive_c::create("/res/Msgsp/bmgres.arc", 0, JKRArchive::MOUNT_MEM, NULL); + break; + case 4: + mpBmgResCommand = mDoDvdThd_mountXArchive_c::create("/res/Msgit/bmgres.arc", 0, JKRArchive::MOUNT_MEM, NULL); + break; + case 0: + default: + mpBmgResCommand = mDoDvdThd_mountXArchive_c::create("/res/Msguk/bmgres.arc", 0, JKRArchive::MOUNT_MEM, NULL); + break; + } + #else + mpBmgResCommand = mDoDvdThd_mountXArchive_c::create(MSG_PATH, 0, JKRArchive::MOUNT_MEM, NULL); + #endif + mpMsgComCommand = mDoDvdThd_mountXArchive_c::create( "/res/Layout/msgcom.arc", 0, JKRArchive::MOUNT_ARAM, mDoExt_getJ2dHeap()); mpMsgResCommand[0] = mDoDvdThd_mountXArchive_c::create( @@ -681,11 +852,17 @@ void dScnLogo_c::dvdDataLoad() { "/res/Layout/msgres06.arc", 0, JKRArchive::MOUNT_ARAM, mDoExt_getJ2dHeap()); mpMain2DCommand = mDoDvdThd_mountXArchive_c::create("/res/Layout/main2D.arc", 0, JKRArchive::MOUNT_MEM, NULL); + #if VERSION == VERSION_GCN_JPN mpFontResCommand = mDoDvdThd_mountXArchive_c::create("/res/Fontjp/fontres.arc", 1, JKRArchive::MOUNT_MEM, NULL); mpRubyResCommand = mDoDvdThd_mountXArchive_c::create("/res/Fontjp/rubyres.arc", 0, JKRArchive::MOUNT_MEM, NULL); +#elif VERSION == VERSION_GCN_PAL + mpFontResCommand = mDoDvdThd_mountXArchive_c::create("/res/Fonteu/fontres.arc", 0, + JKRArchive::MOUNT_MEM, NULL); + mpRubyResCommand = mDoDvdThd_mountXArchive_c::create("/res/Fonteu/rubyres.arc", 0, + JKRArchive::MOUNT_MEM, NULL); #else mpFontResCommand = mDoDvdThd_mountXArchive_c::create("/res/Fontus/fontres.arc", 0, JKRArchive::MOUNT_MEM, NULL); @@ -732,22 +909,62 @@ static int dScnLogo_IsDelete(dScnLogo_c* i_this) { return 1; } +#if VERSION == VERSION_GCN_PAL +u8 dScnLogo_c::getPalLanguage() { + u8 language; + switch (OSGetLanguage()) { + case OS_LANGUAGE_ENGLISH: + language = 0; + break; + case OS_LANGUAGE_GERMAN: + language = 1; + break; + case OS_LANGUAGE_FRENCH: + language = 2; + break; + case OS_LANGUAGE_SPANISH: + language = 3; + break; + case OS_LANGUAGE_ITALIAN: + language = 4; + break; + case OS_LANGUAGE_DUTCH: + language = 5; + break; + } + + return language; +} +#endif + /* 802584D8-802584FC 252E18 0024+00 1/1 0/0 0/0 .text setProgressiveMode__10dScnLogo_cFUc */ void dScnLogo_c::setProgressiveMode(u8 mode) { + #if VERSION == VERSION_GCN_PAL + OSSetEuRgb60Mode(mode); + #else OSSetProgressiveMode(mode); + #endif } /* 802584FC-80258520 252E3C 0024+00 3/3 0/0 0/0 .text getProgressiveMode__10dScnLogo_cFv */ u8 dScnLogo_c::getProgressiveMode() { + #if VERSION == VERSION_GCN_PAL + return OSGetEuRgb60Mode(); + #else return OSGetProgressiveMode(); + #endif } /* 80258520-8025854C 252E60 002C+00 1/1 0/0 0/0 .text isProgressiveMode__10dScnLogo_cFv */ bool dScnLogo_c::isProgressiveMode() { - return OSGetProgressiveMode() == 1; + #if VERSION == VERSION_GCN_PAL + return OSGetEuRgb60Mode() == OS_EURGB60_ON; + #else + return OSGetProgressiveMode() == OS_PROGRESSIVE_MODE_ON; + #endif } /* 8025854C-8025855C 252E8C 0010+00 1/1 0/0 0/0 .text setRenderMode__10dScnLogo_cFv */ diff --git a/src/f_op/f_op_actor_mng.cpp b/src/f_op/f_op_actor_mng.cpp index 5711b52594..e31b483c79 100644 --- a/src/f_op/f_op_actor_mng.cpp +++ b/src/f_op/f_op_actor_mng.cpp @@ -15,6 +15,7 @@ #include "d/actor/d_a_tag_stream.h" #include "d/d_item.h" #include "d/d_path.h" +#include "d/actor/d_a_obj_carry.h" #include "f_op/f_op_scene_mng.h" #include "m_Do/m_Do_lib.h" @@ -1571,18 +1572,18 @@ fopAc_ac_c* fopAcM_fastCreateItem(const cXyz* i_pos, int i_itemNo, int i_roomNo, /* 8001C870-8001C95C 0171B0 00EC+00 0/0 0/0 1/1 .text fopAcM_createBokkuri__FUsPC4cXyziiiPC4cXyzii */ -fpc_ProcID fopAcM_createBokkuri(u16 i_setId, const cXyz* i_pos, int param_3, int param_4, - int i_roomNo, const cXyz* param_6, int param_7, int param_8) { - csXyz angle(0, 0, 0); +fpc_ProcID fopAcM_createBokkuri(u16 i_setId, const cXyz* i_pos, int i_itemNo, int i_itemBit, + int i_roomNo, const cXyz* param_6, int i_itemType, int param_8) { + csXyz params_ex(0, 0, 0); if (param_6 != NULL) { - angle.y = param_6->atan2sX_Z(); - angle.y += (s16)(2048.0f * cM_rndFX(1.0f)); + params_ex.y = param_6->atan2sX_Z(); + params_ex.y += (s16)(2048.0f * cM_rndFX(1.0f)); param_8 = 1; } - u32 actorParams = 0; - make_prm_bokkuri(&actorParams, &angle, 6, param_3, param_4, param_7, param_8); - return fopAcM_create(PROC_Obj_Carry, i_setId, actorParams, i_pos, i_roomNo, &angle, NULL, -1, - NULL); + + u32 params = 0; + daObjCarry_c::make_prm_bokkuri(¶ms, ¶ms_ex, i_itemNo, i_itemBit, i_itemType, param_8); + return fopAcM_create(PROC_Obj_Carry, i_setId, params, i_pos, i_roomNo, ¶ms_ex, NULL, -1, NULL); } /* 8001C95C-8001C9CC 01729C 0070+00 0/0 0/0 12/12 .text diff --git a/src/m_Do/m_Do_MemCard.cpp b/src/m_Do/m_Do_MemCard.cpp index 93b0f9e95c..2e207e1569 100644 --- a/src/m_Do/m_Do_MemCard.cpp +++ b/src/m_Do/m_Do_MemCard.cpp @@ -3,19 +3,25 @@ * Memory Card Control */ +#include #include "m_Do/m_Do_MemCard.h" #include "JSystem/JKernel/JKRAssertHeap.h" -#include "dolphin/card.h" #include "m_Do/m_Do_ext.h" #include "m_Do/m_Do_MemCardRWmng.h" #include "m_Do/m_Do_Reset.h" +#define SLOT_A 0 + +#define CHECKSPACE_RESULT_READY 0 +#define CHECKSPACE_RESULT_INSSPACE 1 +#define CHECKSPACE_RESULT_NOENT 2 +#define CHECKSPACE_RESULT_ERROR 3 + /* 8001672C-80016730 01106C 0004+00 1/1 0/0 0/0 .text __ct__15mDoMemCd_Ctrl_cFv */ mDoMemCd_Ctrl_c::mDoMemCd_Ctrl_c() {} -/* ############################################################################################## */ /* 803DFC20-803E0C20 00C940 1000+00 1/1 0/0 0/0 .bss MemCardStack */ -static u8 MemCardStack[4096]; +static u8 MemCardStack[0x1000]; /* 803E0C20-803E0F40 00D940 0318+08 1/1 0/0 0/0 .bss MemCardThread */ static OSThread MemCardThread; @@ -25,9 +31,9 @@ void mDoMemCd_Ctrl_c::ThdInit() { CARDInit(); mCopyToPos = 0; mProbeStat = 2; - mCardState = 0; - mCardCommand = CARD_NO_COMMAND; - mChannel = 0; + mCardState = CARD_STATE_NO_CARD_e; + mCardCommand = COMM_NONE_e; + mChannel = SLOT_A; OSInitMutex(&mMutex); OSInitCond(&mCond); @@ -36,37 +42,40 @@ void mDoMemCd_Ctrl_c::ThdInit() { OSCreateThread(&MemCardThread, (void*(*)(void*))mDoMemCd_main, NULL, MemCardStack + sizeof(MemCardStack), sizeof(MemCardStack), priority + 1, 1); OSResumeThread(&MemCardThread); + + // "Memory Card Thread Init\n" + OS_REPORT("メモリーカードスレッド起動\n"); } /* 800167D0-80016894 011110 00C4+00 1/1 0/0 0/0 .text main__15mDoMemCd_Ctrl_cFv */ void mDoMemCd_Ctrl_c::main() { do { OSLockMutex(&mMutex); - while (mCardCommand == CARD_NO_COMMAND) { + while (mCardCommand == COMM_NONE_e) { OSWaitCond(&mCond, &mMutex); } OSUnlockMutex(&mMutex); switch (mCardCommand) { - case CARD_RESTORE: + case COMM_RESTORE_e: restore(); break; - case CARD_STORE: + case COMM_STORE_e: store(); break; - case CARD_FORMAT: + case COMM_FORMAT_e: format(); break; - case CARD_ATTACH: + case COMM_ATTACH_e: attach(); break; - case CARD_DETACH: + case COMM_DETACH_e: detach(); break; } OSLockMutex(&mMutex); - mCardCommand = CARD_NO_COMMAND; + mCardCommand = COMM_NONE_e; OSUnlockMutex(&mMutex); } while (true); } @@ -75,23 +84,23 @@ void mDoMemCd_Ctrl_c::main() { void mDoMemCd_Ctrl_c::update() { if (mDoRst::isReset()) { OSLockMutex(&mMutex); - mCardCommand = CARD_DETACH; + mCardCommand = COMM_DETACH_e; mProbeStat = 3; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); } else if (getStatus(0) != 14) { - if (CARDProbe(0) && getStatus(0) == 0) { + if (CARDProbe(SLOT_A) && getStatus(0) == 0) { OSLockMutex(&mMutex); mProbeStat = 0; - mCardState = 13; - mCardCommand = CARD_ATTACH; + mCardState = CARD_STATE_13_e; + mCardCommand = COMM_ATTACH_e; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); - } else if (!CARDProbe(0) && getStatus(0) != 0) { + } else if (!CARDProbe(SLOT_A) && getStatus(0) != 0) { OSLockMutex(&mMutex); mProbeStat = 1; - mCardState = 13; - mCardCommand = CARD_DETACH; + mCardState = CARD_STATE_13_e; + mCardCommand = COMM_DETACH_e; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); } @@ -102,7 +111,7 @@ void mDoMemCd_Ctrl_c::update() { void mDoMemCd_Ctrl_c::load() { if (OSTryLockMutex(&mMutex)) { field_0x1fc8 = 0; - mCardCommand = CARD_RESTORE; + mCardCommand = COMM_RESTORE_e; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); } @@ -113,16 +122,19 @@ void mDoMemCd_Ctrl_c::restore() { CARDFileInfo file; field_0x1fc8 = 0; - s32 card_state = CARDOpen(mChannel, "gczelda2", &file); - if (card_state == CARD_RESULT_READY) { - if (!mDoMemCdRWm_Restore(&file, this, sizeof(mData))) { - mCardState = 3; + s32 ret = CARDOpen(mChannel, "gczelda2", &file); + OS_REPORT("\x1b[43;30mCret=%d\n\x1b[m", ret); + if (ret == CARD_RESULT_READY) { + s32 ret2 = mDoMemCdRWm_Restore(&file, this, sizeof(mData)); + OS_REPORT("\x1b[43;30mret2=%d\n\x1b[m", ret2); + if (ret2 == CARD_RESULT_READY) { + mCardState = CARD_STATE_READ_e; } else { - setCardState(card_state); + setCardState(ret); } CARDClose(&file); } else { - setCardState(card_state); + setCardState(ret); } field_0x1fc8 = 1; @@ -130,7 +142,7 @@ void mDoMemCd_Ctrl_c::restore() { /* 80016AB0-80016B58 0113F0 00A8+00 0/0 2/2 0/0 .text LoadSync__15mDoMemCd_Ctrl_cFPvUlUl */ -s32 mDoMemCd_Ctrl_c::LoadSync(void* buffer, u32 size, u32 index) { +s32 mDoMemCd_Ctrl_c::LoadSync(void* i_buffer, u32 i_size, u32 i_position) { int ret = 0; if (field_0x1fc8 == 0) { @@ -138,12 +150,12 @@ s32 mDoMemCd_Ctrl_c::LoadSync(void* buffer, u32 size, u32 index) { } if (OSTryLockMutex(&mMutex)) { - if (mCardState == 3) { - memcpy(buffer, &mData[index], size); - mCardState = 1; + if (mCardState == CARD_STATE_READ_e) { + memcpy(i_buffer, &mData[i_position], i_size); + mCardState = CARD_STATE_READY_e; ret = 1; } else { - mCardState = 2; + mCardState = CARD_STATE_NO_FILE_e; ret = 2; } OSUnlockMutex(&mMutex); @@ -153,11 +165,11 @@ s32 mDoMemCd_Ctrl_c::LoadSync(void* buffer, u32 size, u32 index) { } /* 80016B58-80016BD4 011498 007C+00 0/0 2/2 0/0 .text save__15mDoMemCd_Ctrl_cFPvUlUl */ -void mDoMemCd_Ctrl_c::save(void* buffer, u32 size, u32 index) { +void mDoMemCd_Ctrl_c::save(void* i_buffer, u32 i_size, u32 i_position) { if (OSTryLockMutex(&mMutex)) { - memcpy(&mData[index], buffer, size); + memcpy(&mData[i_position], i_buffer, i_size); field_0x1fc8 = 0; - mCardCommand = CARD_STORE; + mCardCommand = COMM_STORE_e; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); } @@ -166,33 +178,35 @@ void mDoMemCd_Ctrl_c::save(void* buffer, u32 size, u32 index) { /* 80016BD4-80016CE0 011514 010C+00 1/1 0/0 0/0 .text store__15mDoMemCd_Ctrl_cFv */ void mDoMemCd_Ctrl_c::store() { CARDFileInfo file; - s32 card_state; + s32 ret; field_0x1fc8 = 0; - if (mCardState == 2) { - card_state = CARDCreate(mChannel, "gczelda2", 0x8000, &file); - if (card_state == CARD_RESULT_READY || card_state == CARD_RESULT_EXIST) { - mCardState = 1; + if (mCardState == CARD_STATE_NO_FILE_e) { + ret = CARDCreate(mChannel, "gczelda2", SAVEDATA_FILE_SIZE, &file); + if (ret == CARD_RESULT_READY || ret == CARD_RESULT_EXIST) { + mCardState = CARD_STATE_READY_e; } else { - setCardState(card_state); + setCardState(ret); } } - if (mCardState == 1) { - card_state = CARDOpen(mChannel, "gczelda2", &file); - if (card_state == CARD_RESULT_READY) { - card_state = mDoMemCdRWm_Store(&file, this, sizeof(mData)); - if (card_state != CARD_RESULT_READY) { - setCardState(card_state); + if (mCardState == CARD_STATE_READY_e) { + ret = CARDOpen(mChannel, "gczelda2", &file); + if (ret == CARD_RESULT_READY) { + ret = mDoMemCdRWm_Store(&file, this, sizeof(mData)); + if (ret != CARD_RESULT_READY) { + setCardState(ret); + OS_REPORT("CARD Write ERR ret:%d\n", ret); } else { - mCardState = 4; + mCardState = CARD_STATE_WRITE_e; + OS_REPORT("CARD Write OK ret:%d stat:%d\n", ret, mCardState); } CARDClose(&file); } else { - setCardState(card_state); + setCardState(ret); } } else { - setCardState(card_state); + setCardState(ret); } field_0x1fc8 = 1; @@ -207,14 +221,16 @@ s32 mDoMemCd_Ctrl_c::SaveSync() { } if (OSTryLockMutex(&mMutex)) { - if (mCardState == 4) { - mCardState = 1; + if (mCardState == CARD_STATE_WRITE_e) { + mCardState = CARD_STATE_READY_e; ret = 1; - } else if (mCardState == 1) { + } else if (mCardState == CARD_STATE_READY_e) { ret = 0; } else { ret = 2; } + + OS_REPORT("CARD Save Sync ret:%d stat:%d\n", ret, mCardState); OSUnlockMutex(&mMutex); } @@ -226,46 +242,46 @@ u32 mDoMemCd_Ctrl_c::getStatus(u32) { u32 status; if (OSTryLockMutex(&mMutex)) { switch (mCardState) { - case 1: + case CARD_STATE_READY_e: status = 2; break; - case 2: + case CARD_STATE_NO_FILE_e: status = 1; break; - case 3: + case CARD_STATE_READ_e: status = 3; break; - case 4: + case CARD_STATE_WRITE_e: status = 4; break; - case 5: + case CARD_STATE_FORMAT_e: status = 5; break; - case 0: + case CARD_STATE_NO_CARD_e: status = 0; break; - case 6: + case CARD_STATE_WRONG_ENCODING_e: status = 7; break; - case 7: + case CARD_STATE_BROKEN_e: status = 6; break; - case 8: + case CARD_STATE_INSSPACE_e: status = 11; break; - case 9: + case CARD_STATE_NOENT_e: status = 12; break; - case 10: + case CARD_STATE_WRONG_DEVICE_e: status = 9; break; - case 11: + case CARD_STATE_WRONG_SECTORSIZE_e: status = 10; break; - case 12: + case CARD_STATE_FATAL_ERROR_e: status = 8; break; - case 13: + case CARD_STATE_13_e: status = 14; break; } @@ -281,7 +297,7 @@ u32 mDoMemCd_Ctrl_c::getStatus(u32) { */ void mDoMemCd_Ctrl_c::command_format() { if (OSTryLockMutex(&mMutex)) { - mCardCommand = CARD_FORMAT; + mCardCommand = COMM_FORMAT_e; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); } @@ -291,12 +307,12 @@ void mDoMemCd_Ctrl_c::command_format() { void mDoMemCd_Ctrl_c::format() { field_0x1fc8 = 0; - s32 card_state = CARDFormat(mChannel); + s32 ret = CARDFormat(mChannel); if (OSTryLockMutex(&mMutex)) { - if (card_state == CARD_RESULT_READY) { - mCardState = 5; + if (ret == CARD_RESULT_READY) { + mCardState = CARD_STATE_FORMAT_e; } else { - setCardState(card_state); + setCardState(ret); } field_0x1fc8 = 1; @@ -313,9 +329,9 @@ s32 mDoMemCd_Ctrl_c::FormatSync() { } if (OSTryLockMutex(&mMutex)) { - if (mCardState != 13) { - if (mCardState == 5) { - mCardState = 2; + if (mCardState != CARD_STATE_13_e) { + if (mCardState == CARD_STATE_FORMAT_e) { + mCardState = CARD_STATE_NO_FILE_e; ret = 1; } else { ret = 2; @@ -330,33 +346,33 @@ s32 mDoMemCd_Ctrl_c::FormatSync() { /* 80016FB8-800170B8 0118F8 0100+00 1/1 0/0 0/0 .text attach__15mDoMemCd_Ctrl_cFv */ void mDoMemCd_Ctrl_c::attach() { s32 mem_size; - s32 sect_size; + s32 sector_size; - s32 card_state = CARDProbeEx(mChannel, &mem_size, §_size); - if (card_state == CARD_RESULT_NOCARD) { - mCardState = 0; - } else if (card_state == CARD_RESULT_FATAL_ERROR) { - mCardState = 12; - } else if (card_state == CARD_RESULT_WRONGDEVICE) { - mCardState = 10; - } else if (sect_size != 0x2000) { - mCardState = 11; + s32 ret = CARDProbeEx(mChannel, &mem_size, §or_size); + if (ret == CARD_RESULT_NOCARD) { + mCardState = CARD_STATE_NO_CARD_e; + } else if (ret == CARD_RESULT_FATAL_ERROR) { + mCardState = CARD_STATE_FATAL_ERROR_e; + } else if (ret == CARD_RESULT_WRONGDEVICE) { + mCardState = CARD_STATE_WRONG_DEVICE_e; + } else if (sector_size != SECTOR_SIZE) { + mCardState = CARD_STATE_WRONG_SECTORSIZE_e; } else { if (mount()) { if (loadfile()) { - mCardState = 1; + mCardState = CARD_STATE_READY_e; } else { switch (checkspace()) { - case 0: - mCardState = 2; + case CHECKSPACE_RESULT_READY: + mCardState = CARD_STATE_NO_FILE_e; break; - case 1: - mCardState = 8; + case CHECKSPACE_RESULT_INSSPACE: + mCardState = CARD_STATE_INSSPACE_e; break; - case 2: - mCardState = 9; + case CHECKSPACE_RESULT_NOENT: + mCardState = CARD_STATE_NOENT_e; break; - case 3: + case CHECKSPACE_RESULT_ERROR: break; } } @@ -368,8 +384,8 @@ void mDoMemCd_Ctrl_c::attach() { */ void mDoMemCd_Ctrl_c::command_attach() { if (OSTryLockMutex(&mMutex)) { - mCardState = 13; - mCardCommand = CARD_ATTACH; + mCardState = CARD_STATE_13_e; + mCardCommand = COMM_ATTACH_e; OSUnlockMutex(&mMutex); OSSignalCond(&mCond); } @@ -378,64 +394,62 @@ void mDoMemCd_Ctrl_c::command_attach() { /* 80017110-80017148 011A50 0038+00 1/1 0/0 0/0 .text detach__15mDoMemCd_Ctrl_cFv */ void mDoMemCd_Ctrl_c::detach() { CARDUnmount(mChannel); - mCardState = 0; + mCardState = CARD_STATE_NO_CARD_e; } -/* ############################################################################################## */ - /* 803E0F40-803EAF40 00DC60 A000+00 1/1 0/0 0/0 .bss MemCardWorkArea0 */ -static u8 MemCardWorkArea0[5 * 8 * 1024] ALIGN_DECL(32); +static u8 MemCardWorkArea0[CARD_WORKAREA_SIZE] ALIGN_DECL(32); /* 80017148-80017274 011A88 012C+00 2/1 0/0 0/0 .text mount__15mDoMemCd_Ctrl_cFv */ s32 mDoMemCd_Ctrl_c::mount() { - s32 result = CARDMount(mChannel, MemCardWorkArea0, 0); + s32 result = CARDMount(mChannel, MemCardWorkArea0, NULL); switch (result) { case CARD_RESULT_IOERROR: case CARD_RESULT_FATAL_ERROR: - mCardState = 12; - return 0; + mCardState = CARD_STATE_FATAL_ERROR_e; + return FALSE; case CARD_RESULT_NOCARD: - mCardState = 0; - return 0; + mCardState = CARD_STATE_NO_CARD_e; + return FALSE; case CARD_RESULT_BROKEN: case CARD_RESULT_READY: switch (CARDCheck(mChannel)) { case CARD_RESULT_READY: - return 1; + return TRUE; case CARD_RESULT_BROKEN: - mCardState = 7; - return 0; + mCardState = CARD_STATE_BROKEN_e; + return FALSE; case CARD_RESULT_IOERROR: - mCardState = 12; - return 0; + mCardState = CARD_STATE_FATAL_ERROR_e; + return FALSE; case CARD_RESULT_NOCARD: - mCardState = 0; - return 0; + mCardState = CARD_STATE_NO_CARD_e; + return FALSE; case CARD_RESULT_ENCODING: - mCardState = 6; - return 0; + mCardState = CARD_STATE_WRONG_ENCODING_e; + return FALSE; } break; case CARD_RESULT_ENCODING: - mCardState = 6; - return 0; + mCardState = CARD_STATE_WRONG_ENCODING_e; + return FALSE; } - return 0; + return FALSE; } /* 80017274-800172D4 011BB4 0060+00 1/1 0/0 0/0 .text loadfile__15mDoMemCd_Ctrl_cFv */ s32 mDoMemCd_Ctrl_c::loadfile() { CARDFileInfo file; - s32 card_state = CARDOpen(mChannel, "gczelda2", &file); - if (card_state == CARD_RESULT_READY) { + s32 ret = CARDOpen(mChannel, "gczelda2", &file); + if (ret == CARD_RESULT_READY) { CARDClose(&file); - return CARD_RESULT_UNLOCKED; + return TRUE; } else { - setCardState(card_state); - return CARD_RESULT_READY; + setCardState(ret); + return FALSE; } } @@ -443,51 +457,50 @@ s32 mDoMemCd_Ctrl_c::loadfile() { // s32 mDoMemCd_Ctrl_c::checkspace() { s32 bytesNotUsed, filesNotUsed; - s32 result = CARDFreeBlocks(mChannel,&bytesNotUsed,&filesNotUsed); + s32 result = CARDFreeBlocks(mChannel, &bytesNotUsed, &filesNotUsed); - if (result != 0) { + if (result != CARD_RESULT_READY) { setCardState(result); - return 3; + return CHECKSPACE_RESULT_ERROR; } - if (bytesNotUsed < 0x8000) { - return 1; + if (bytesNotUsed < SAVEDATA_FILE_SIZE) { + return CHECKSPACE_RESULT_INSSPACE; } if (filesNotUsed < 1) { - return 2; + return CHECKSPACE_RESULT_NOENT; } - return 0; + return CHECKSPACE_RESULT_READY; } /* 80017360-8001741C 011CA0 00BC+00 5/5 0/0 0/0 .text setCardState__15mDoMemCd_Ctrl_cFl */ -void mDoMemCd_Ctrl_c::setCardState(s32 param_0) { - switch (param_0) { +void mDoMemCd_Ctrl_c::setCardState(s32 i_result) { + switch (i_result) { case CARD_RESULT_IOERROR: case CARD_RESULT_FATAL_ERROR: - mCardState = 12; + mCardState = CARD_STATE_FATAL_ERROR_e; break; case CARD_RESULT_NOCARD: - mCardState = 0; + mCardState = CARD_STATE_NO_CARD_e; break; case CARD_RESULT_BROKEN: case CARD_RESULT_READY: - if (CARDCheck(mChannel) != 0) { - mCardState = 7; + if (CARDCheck(mChannel) != CARD_RESULT_READY) { + mCardState = CARD_STATE_BROKEN_e; } break; case CARD_RESULT_ENCODING: - mCardState = 6; + mCardState = CARD_STATE_WRONG_ENCODING_e; break; case CARD_RESULT_NOFILE: - mCardState = 2; + mCardState = CARD_STATE_NO_FILE_e; break; } } -/* ############################################################################################## */ /* 803EAF40-803ECF40 017C60 2000+00 2/2 27/27 0/0 .bss g_mDoMemCd_control */ mDoMemCd_Ctrl_c g_mDoMemCd_control; diff --git a/src/m_Do/m_Do_MemCardRWmng.cpp b/src/m_Do/m_Do_MemCardRWmng.cpp index 3e1ae1b80b..6fed29460f 100644 --- a/src/m_Do/m_Do_MemCardRWmng.cpp +++ b/src/m_Do/m_Do_MemCardRWmng.cpp @@ -4,12 +4,11 @@ */ #include "m_Do/m_Do_MemCardRWmng.h" +#include "m_Do/m_Do_MemCard.h" #include "JSystem/JUtility/JUTTexture.h" -#include "stdio.h" #include "d/d_com_inf_game.h" #include "d/d_save.h" -#include "dolphin/card.h" -#include "m_Do/m_Do_MemCard.h" +#include #if VERSION == VERSION_GCN_JPN #define HEADER_TITLE "ゼルダの伝説 トワイライトプリンセス" @@ -19,123 +18,118 @@ #define HEADER_COMMENT "%d/%d Save Data" #endif +struct data_s { + int unk_0x0; + int data_version; + u8 data[(SAVEDATA_SIZE * 3) + 0x38]; // unsure what the extra 0x38 is + u32 checksum; +}; + /* 803ECF40-803F0F40 019C60 4000+00 2/2 0/0 0/0 .bss sTmpBuf */ -static u8 sTmpBuf[0x4000]; +static u8 sTmpBuf[SECTOR_SIZE * 2]; /* 80017498-8001769C 011DD8 0204+00 0/0 1/1 0/0 .text mDoMemCdRWm_Store__FP12CARDFileInfoPvUl */ s32 mDoMemCdRWm_Store(CARDFileInfo* file, void* data, u32 length) { mDoMemCdRWm_BuildHeader((mDoMemCdRWm_HeaderData*)sTmpBuf); - s32 card_state = CARDWrite(file, sTmpBuf, sizeof(sTmpBuf), 0); - if (card_state != CARD_RESULT_READY) { - return card_state; + s32 ret = CARDWrite(file, sTmpBuf, sizeof(sTmpBuf), 0); + if (ret != CARD_RESULT_READY) { + return ret; } if (!mDoMemCdRWm_CheckCardStat(file)) { memset(sTmpBuf, 0, sizeof(sTmpBuf)); - card_state = CARDWrite(file, sTmpBuf, sizeof(sTmpBuf) / 2, 0x4000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDWrite(file, sTmpBuf, SECTOR_SIZE, 0x4000); + if (ret != CARD_RESULT_READY) { + return ret; } - card_state = CARDWrite(file, sTmpBuf, sizeof(sTmpBuf) / 2, 0x6000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDWrite(file, sTmpBuf, SECTOR_SIZE, 0x6000); + if (ret != CARD_RESULT_READY) { + return ret; } } - struct data_s { - int field_0x0; - int field_0x4; - u8 mData[0x1FF4]; - u32 mChecksum; - }; - memset(sTmpBuf, 0, sizeof(sTmpBuf)); + data_s* tmp_data = (data_s*)sTmpBuf; - tmp_data->field_0x4 = 6; - memcpy(tmp_data->mData, data, length); - tmp_data->field_0x0 = 0; - u32 checksum = mDoMemCdRWm_CalcCheckSum(tmp_data, 0x1FFC); - tmp_data->mChecksum = checksum; + tmp_data->data_version = SAVEDATA_VERSION; + memcpy(tmp_data->data, data, length); + tmp_data->unk_0x0 = 0; - card_state = CARDWrite(file, sTmpBuf, sizeof(sTmpBuf) / 2, 0x4000); - if (card_state != CARD_RESULT_READY) { - return card_state; + u32 checksum = mDoMemCdRWm_CalcCheckSum(tmp_data, sizeof(data_s) - 4); + tmp_data->checksum = checksum; + + ret = CARDWrite(file, sTmpBuf, SECTOR_SIZE, 0x4000); + if (ret != CARD_RESULT_READY) { + return ret; } - card_state = CARDRead(file, sTmpBuf, sizeof(sTmpBuf) / 2, 0x4000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDRead(file, sTmpBuf, SECTOR_SIZE, 0x4000); + if (ret != CARD_RESULT_READY) { + return ret; } - if (checksum != mDoMemCdRWm_CalcCheckSum(sTmpBuf, 0x1FFC)) { - return card_state; + if (checksum != mDoMemCdRWm_CalcCheckSum(sTmpBuf, sizeof(data_s) - 4)) { + return ret; } - card_state = CARDWrite(file, sTmpBuf, sizeof(sTmpBuf) / 2, 0x6000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDWrite(file, sTmpBuf, SECTOR_SIZE, 0x6000); + if (ret != CARD_RESULT_READY) { + return ret; } - card_state = CARDRead(file, sTmpBuf, sizeof(sTmpBuf) / 2, 0x6000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDRead(file, sTmpBuf, SECTOR_SIZE, 0x6000); + if (ret != CARD_RESULT_READY) { + return ret; } - if (checksum != mDoMemCdRWm_CalcCheckSum(sTmpBuf, 0x1FFC)) { - return card_state; + if (checksum != mDoMemCdRWm_CalcCheckSum(sTmpBuf, sizeof(data_s) - 4)) { + return ret; } + mDoMemCdRWm_SetCardStat(file); - return card_state; + return ret; } /* 8001769C-8001787C 011FDC 01E0+00 0/0 1/1 0/0 .text mDoMemCdRWm_Restore__FP12CARDFileInfoPvUl */ s32 mDoMemCdRWm_Restore(CARDFileInfo* file, void* data, u32 length) { BOOL rewrite = FALSE; - struct save_data_s { - u8 field_0x0[4]; - u32 mDataVersion; - u8 mSave1[QUEST_LOG_SIZE]; - u8 mSave2[QUEST_LOG_SIZE]; - u8 mSave3[QUEST_LOG_SIZE]; - }; + data_s* saves = (data_s*)sTmpBuf; + data_s* backup_saves = (data_s*)(sTmpBuf + SECTOR_SIZE); - save_data_s* saves = (save_data_s*)sTmpBuf; - save_data_s* backup_saves = (save_data_s*)(sTmpBuf + sizeof(sTmpBuf) / 2); - - s32 card_state = CARDRead(file, saves, sizeof(sTmpBuf) / 2, 0x4000); - if (card_state != CARD_RESULT_READY) { - return card_state; + s32 ret = CARDRead(file, saves, SECTOR_SIZE, 0x4000); + if (ret != CARD_RESULT_READY) { + return ret; } - BOOL test_save1 = mDoMemCdRWm_TestCheckSumGameData(saves->mSave1); - BOOL test_save2 = mDoMemCdRWm_TestCheckSumGameData(saves->mSave2); - BOOL test_save3 = mDoMemCdRWm_TestCheckSumGameData(saves->mSave3); + BOOL save1_valid = mDoMemCdRWm_TestCheckSumGameData(&saves->data[SAVEDATA_SIZE * 0]); + BOOL save2_valid = mDoMemCdRWm_TestCheckSumGameData(&saves->data[SAVEDATA_SIZE * 1]); + BOOL save3_valid = mDoMemCdRWm_TestCheckSumGameData(&saves->data[SAVEDATA_SIZE * 2]); - card_state = CARDRead(file, backup_saves, sizeof(sTmpBuf) / 2, 0x6000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDRead(file, backup_saves, SECTOR_SIZE, 0x6000); + if (ret != CARD_RESULT_READY) { + return ret; } - BOOL test_backup1 = mDoMemCdRWm_TestCheckSumGameData(backup_saves->mSave1); - BOOL test_backup2 = mDoMemCdRWm_TestCheckSumGameData(backup_saves->mSave2); - BOOL test_backup3 = mDoMemCdRWm_TestCheckSumGameData(backup_saves->mSave3); + BOOL backup1_valid = mDoMemCdRWm_TestCheckSumGameData(&backup_saves->data[SAVEDATA_SIZE * 0]); + BOOL backup2_valid = mDoMemCdRWm_TestCheckSumGameData(&backup_saves->data[SAVEDATA_SIZE * 1]); + BOOL backup3_valid = mDoMemCdRWm_TestCheckSumGameData(&backup_saves->data[SAVEDATA_SIZE * 2]); - if (!test_save1 && test_backup1) { - memcpy(saves->mSave1, backup_saves->mSave1, QUEST_LOG_SIZE); + if (!save1_valid && backup1_valid) { + memcpy(&saves->data[SAVEDATA_SIZE * 0], &backup_saves->data[SAVEDATA_SIZE * 0], SAVEDATA_SIZE); rewrite = TRUE; } - if (!test_save2 && test_backup2) { - memcpy(saves->mSave2, backup_saves->mSave2, QUEST_LOG_SIZE); + if (!save2_valid && backup2_valid) { + memcpy(&saves->data[SAVEDATA_SIZE * 1], &backup_saves->data[SAVEDATA_SIZE * 1], SAVEDATA_SIZE); rewrite = TRUE; } - if (!test_save3 && test_backup3) { - memcpy(saves->mSave3, backup_saves->mSave3, QUEST_LOG_SIZE); + if (!save3_valid && backup3_valid) { + memcpy(&saves->data[SAVEDATA_SIZE * 2], &backup_saves->data[SAVEDATA_SIZE * 2], SAVEDATA_SIZE); rewrite = TRUE; } @@ -144,19 +138,19 @@ s32 mDoMemCdRWm_Restore(CARDFileInfo* file, void* data, u32 length) { } if (rewrite) { - card_state = CARDWrite(file, saves, sizeof(sTmpBuf) / 2, 0x4000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDWrite(file, saves, SECTOR_SIZE, 0x4000); + if (ret != CARD_RESULT_READY) { + return ret; } - card_state = CARDWrite(file, saves, sizeof(sTmpBuf) / 2, 0x6000); - if (card_state != CARD_RESULT_READY) { - return card_state; + ret = CARDWrite(file, saves, SECTOR_SIZE, 0x6000); + if (ret != CARD_RESULT_READY) { + return ret; } } - memcpy(data, saves->mSave1, length); - mDoMemCd_setDataVersion(saves->mDataVersion); + memcpy(data, saves->data, length); + mDoMemCd_setDataVersion(saves->data_version); mDoMemCd_setSerialNo(); return CARD_RESULT_READY; @@ -192,26 +186,24 @@ static void mDoMemCdRWm_BuildHeader(mDoMemCdRWm_HeaderData* header) { snprintf(header->mComment, sizeof(header->mComment), HEADER_COMMENT, time.mon + 1, time.mday); #endif - ResTIMG* banner_data = - (ResTIMG*)g_dComIfG_gameInfo.play.mCardIconResArchive->getResource("zelda2_gc_banner.bti"); - ResTIMG* icon_data = - (ResTIMG*)g_dComIfG_gameInfo.play.mCardIconResArchive->getResource("zelda2_gc_icon.bti"); + ResTIMG* banner_data = (ResTIMG*)dComIfGp_getCardIconResArchive()->getResource("zelda2_gc_banner.bti"); + ResTIMG* icon_data = (ResTIMG*)dComIfGp_getCardIconResArchive()->getResource("zelda2_gc_icon.bti"); - memcpy(header->mBannerTexData, (u8*)banner_data + banner_data->imageOffset, - (banner_data->numColors * 2) + 0xC00); + memcpy(header->mBannerTexData, (u8*)banner_data + banner_data->imageOffset, (banner_data->numColors * 2) + 0xC00); memcpy(header->mIconTexData0, (u8*)icon_data + icon_data->imageOffset, 0x400); memcpy(header->mIconTexData1, (u8*)icon_data + icon_data->imageOffset, 0x400); memcpy(header->mIconTexData2, (u8*)icon_data + icon_data->imageOffset, 0x400); memcpy(header->mIconTexData3, (u8*)icon_data + icon_data->imageOffset, 0x400); - memcpy(header->mIconTexData4, (u8*)icon_data + icon_data->imageOffset, - (icon_data->numColors * 2) + 0x400); - g_dComIfG_gameInfo.play.mCardIconResArchive->removeResourceAll(); + memcpy(header->mIconTexData4, (u8*)icon_data + icon_data->imageOffset, (icon_data->numColors * 2) + 0x400); + + dComIfGp_getCardIconResArchive()->removeResourceAll(); } /* 800179E4-80017B4C 012324 0168+00 1/1 0/0 0/0 .text mDoMemCdRWm_SetCardStat__FP12CARDFileInfo */ static void mDoMemCdRWm_SetCardStat(CARDFileInfo* file) { CARDStat stat; mDoMemCd_getCardStatus(file->fileNo, &stat); + stat.iconAddr = 0; stat.commentAddr = 0x2400; CARDSetBannerFormat(&stat, CARD_STAT_BANNER_C8); @@ -232,6 +224,7 @@ static void mDoMemCdRWm_SetCardStat(CARDFileInfo* file) { CARDSetIconSpeed(&stat, 5, CARD_STAT_SPEED_END); CARDSetIconSpeed(&stat, 6, CARD_STAT_SPEED_END); CARDSetIconSpeed(&stat, 7, CARD_STAT_SPEED_END); + mDoMemCd_setCardStatus(file->fileNo, &stat); } @@ -240,6 +233,7 @@ static void mDoMemCdRWm_SetCardStat(CARDFileInfo* file) { static BOOL mDoMemCdRWm_CheckCardStat(CARDFileInfo* file) { CARDStat stat; mDoMemCd_getCardStatus(file->fileNo, &stat); + if (stat.iconAddr != 0 || stat.commentAddr != 0x2400 || CARDGetBannerFormat(&stat) != CARD_STAT_BANNER_C8 || CARDGetIconAnim(&stat) != CARD_STAT_ANIM_BOUNCE @@ -262,6 +256,7 @@ static BOOL mDoMemCdRWm_CheckCardStat(CARDFileInfo* file) { { return FALSE; } + return TRUE; } @@ -303,15 +298,12 @@ static u64 mDoMemCdRWm_CalcCheckSumGameData(void* data, u32 size) { /* 80017CEC-80017D38 01262C 004C+00 1/1 4/4 0/0 .text mDoMemCdRWm_TestCheckSumGameData__FPv */ BOOL mDoMemCdRWm_TestCheckSumGameData(void* data) { - u64 checksum = mDoMemCdRWm_CalcCheckSumGameData(data, 0xA8C); - return checksum == *(u64*)((u8*)data + 0xA8C); + u64 checksum = mDoMemCdRWm_CalcCheckSumGameData(data, (SAVEDATA_SIZE - sizeof(u64))); + return checksum == *(u64*)((u8*)data + (SAVEDATA_SIZE - sizeof(u64))); } /* 80017D38-80017D7C 012678 0044+00 0/0 4/4 0/0 .text mDoMemCdRWm_SetCheckSumGameData__FPUcUc */ void mDoMemCdRWm_SetCheckSumGameData(u8* data, u8 dataNum) { - u8* file_ptr = data + (dataNum * QUEST_LOG_SIZE); - - *(u64*)(file_ptr + 0xA8C) = mDoMemCdRWm_CalcCheckSumGameData(file_ptr, 0xA8C); + u8* file_ptr = data + (dataNum * SAVEDATA_SIZE); + *(u64*)(file_ptr + (SAVEDATA_SIZE - sizeof(u64))) = mDoMemCdRWm_CalcCheckSumGameData(file_ptr, (SAVEDATA_SIZE - sizeof(u64))); } - -/* 80374408-80374408 000A68 0000+00 0/0 0/0 0/0 .rodata @stringBase0 */ diff --git a/src/m_Do/m_Do_machine.cpp b/src/m_Do/m_Do_machine.cpp index 645a8cdb39..44e40aba06 100644 --- a/src/m_Do/m_Do_machine.cpp +++ b/src/m_Do/m_Do_machine.cpp @@ -418,6 +418,7 @@ void my_SysPrintHeap(char const* message, void* start, u32 size) { (u32)start + size, size / 1024); } +#if VERSION != VERSION_GCN_PAL /* 803A2F60-803A2F9C 000080 003C+00 1/0 0/0 0/0 .data g_ntscZeldaIntDf */ extern GXRenderModeObj g_ntscZeldaIntDf = { VI_TVMODE_NTSC_INT, @@ -473,6 +474,63 @@ extern GXRenderModeObj g_ntscZeldaProg = { {6, 6}}, {0, 0, 21, 22, 21, 0, 0}, }; +#else +/* 803A2F60-803A2F9C 000080 003C+00 1/0 0/0 0/0 .data g_ntscZeldaIntDf */ +extern GXRenderModeObj g_ntscZeldaIntDf = { + VI_TVMODE_PAL_INT, + 608, + 448, + 538, + 25, + 18, + 670, + 538, + VI_XFBMODE_DF, + 0, + 0, + {{6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}}, + {8, 8, 10, 12, 10, 8, 8}, +}; + +/* 803A2F9C-803A2FD8 0000BC 003C+00 1/1 1/1 0/0 .data g_ntscZeldaProg */ +extern GXRenderModeObj g_ntscZeldaProg = { + VI_TVMODE_EURGB60_INT, + 608, + 448, + 448, + 27, + 16, + 666, + 448, + VI_XFBMODE_DF, + 0, + 0, + {{6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}, + {6, 6}}, + {8, 8, 10, 12, 10, 8, 8}, +}; +#endif /* 804505A0-804505A8 -00001 0004+04 1/1 3/3 0/0 .sdata mRenderModeObj__15mDoMch_render_c */ @@ -533,7 +591,8 @@ int mDoMch_Create() { JFWSystem::setAramAudioBufSize(0xA00000); JFWSystem::setAramGraphBufSize(-1); - if (!(OSGetResetCode() >> 0x1F)) { + #if VERSION != VERSION_GCN_PAL + if ((OSGetResetCode() >> 31) == 0) { if (VIGetDTVStatus() == 0) { OSSetProgressiveMode(0); } @@ -542,6 +601,15 @@ int mDoMch_Create() { mDoMch_render_c::setProgressiveMode(); } } + #else + if ((int)(OSGetResetCode() >> 31) == 1) { + if (mDoRst::getProgSeqFlag() != 0) { + if (OSGetEuRgb60Mode() == OS_EURGB60_ON) { + mDoMch_render_c::setProgressiveMode(); + } + } + } + #endif JFWSystem::setRenderMode(mDoMch_render_c::getRenderModeObj()); JFWSystem::firstInit();