diff --git a/config/GMPE01_00/rels/m427Dll/symbols.txt b/config/GMPE01_00/rels/m427Dll/symbols.txt index d075d6af..96db2763 100644 --- a/config/GMPE01_00/rels/m427Dll/symbols.txt +++ b/config/GMPE01_00/rels/m427Dll/symbols.txt @@ -271,11 +271,11 @@ lbl_1_rodata_328 = .rodata:0x00000328; // type:object size:0x8 scope:local data: lbl_1_rodata_330 = .rodata:0x00000330; // type:object size:0x4 scope:local data:float lbl_1_rodata_334 = .rodata:0x00000334; // type:object size:0x4 scope:local data:float lbl_1_rodata_338 = .rodata:0x00000338; // type:object size:0x4 scope:local data:float -lbl_1_rodata_33C = .rodata:0x0000033C; // type:object size:0xC scope:local data:4byte +lbl_1_rodata_33C = .rodata:0x0000033C; // type:object size:0xC scope:local data:float lbl_1_rodata_348 = .rodata:0x00000348; // type:object size:0x4 scope:local data:float lbl_1_rodata_34C = .rodata:0x0000034C; // type:object size:0x4 scope:local data:float lbl_1_rodata_350 = .rodata:0x00000350; // type:object size:0x4 scope:local data:float -lbl_1_rodata_354 = .rodata:0x00000354; // type:object size:0x1 scope:local data:byte +lbl_1_rodata_354 = .rodata:0x00000354; // type:object size:0x4 scope:local data:byte lbl_1_rodata_358 = .rodata:0x00000358; // type:object size:0x4 scope:local data:float lbl_1_rodata_35C = .rodata:0x0000035C; // type:object size:0x4 scope:local data:float lbl_1_rodata_360 = .rodata:0x00000360; // type:object size:0x4 scope:local data:float @@ -353,8 +353,8 @@ lbl_1_data_D0 = .data:0x000000D0; // type:object size:0x8 lbl_1_data_D8 = .data:0x000000D8; // type:object size:0x4 lbl_1_data_DC = .data:0x000000DC; // type:object size:0x4 lbl_1_data_E0 = .data:0x000000E0; // type:object size:0x4 data:2byte -lbl_1_data_E8 = .data:0x000000E8; // type:object size:0x4 data:2byte -lbl_1_data_EC = .data:0x000000EC; // type:object size:0x5 data:string +lbl_1_data_E8 = .data:0x000000E8; // type:object size:0x4 data:byte +lbl_1_data_EC = .data:0x000000EC; // type:object size:0x5 scope:local data:string lbl_1_data_F4 = .data:0x000000F4; // type:object size:0x4 data:float lbl_1_data_F8 = .data:0x000000F8; // type:object size:0x4 data:float lbl_1_data_FC = .data:0x000000FC; // type:object size:0x30 @@ -365,10 +365,10 @@ lbl_1_data_1D4 = .data:0x000001D4; // type:object size:0x8 lbl_1_data_1DC = .data:0x000001DC; // type:object size:0x8 lbl_1_data_1E4 = .data:0x000001E4; // type:object size:0x8 lbl_1_data_1EC = .data:0x000001EC; // type:object size:0x4 -lbl_1_data_1F0 = .data:0x000001F0; // type:object size:0x13 data:string -lbl_1_data_203 = .data:0x00000203; // type:object size:0x10 data:string -lbl_1_data_213 = .data:0x00000213; // type:object size:0x26 data:string -lbl_1_data_239 = .data:0x00000239; // type:object size:0x25 +lbl_1_data_1F0 = .data:0x000001F0; // type:object size:0x13 scope:local data:string +lbl_1_data_203 = .data:0x00000203; // type:object size:0x10 scope:local data:string +lbl_1_data_213 = .data:0x00000213; // type:object size:0x26 scope:local data:string +lbl_1_data_239 = .data:0x00000239; // type:object size:0x24 scope:local data:string lbl_1_data_260 = .data:0x00000260; // type:object size:0x15C lbl_1_data_3BC = .data:0x000003BC; // type:object size:0x15C lbl_1_data_518 = .data:0x00000518; // type:object size:0x1C diff --git a/config/GMPE01_00/rels/m463Dll/symbols.txt b/config/GMPE01_00/rels/m463Dll/symbols.txt index 351f689b..e336c47f 100644 --- a/config/GMPE01_00/rels/m463Dll/symbols.txt +++ b/config/GMPE01_00/rels/m463Dll/symbols.txt @@ -157,7 +157,7 @@ lbl_1_bss_54 = .bss:0x00000054; // type:object size:0x4 data:4byte lbl_1_bss_58 = .bss:0x00000058; // type:object size:0x4 data:4byte lbl_1_bss_5C = .bss:0x0000005C; // type:object size:0x2D0 lbl_1_bss_32C = .bss:0x0000032C; // type:object size:0x4 data:4byte -lbl_1_bss_330 = .bss:0x00000330; // type:object size:0x24 data:4byte +lbl_1_bss_330 = .bss:0x00000330; // type:object size:0x24 scope:local data:4byte lbl_1_bss_354 = .bss:0x00000354; // type:object size:0x4 data:4byte lbl_1_bss_358 = .bss:0x00000358; // type:object size:0x4 data:4byte lbl_1_bss_35C = .bss:0x0000035C; // type:object size:0x1C0 data:4byte diff --git a/config/GMPE01_00/splits.txt b/config/GMPE01_00/splits.txt index d7d8237a..4751f858 100644 --- a/config/GMPE01_00/splits.txt +++ b/config/GMPE01_00/splits.txt @@ -955,7 +955,7 @@ Runtime.PPCEABI.H/NewMore.cp: .data start:0x8013E208 end:0x8013E218 .sdata start:0x801D39A0 end:0x801D39A8 -Runtime.PPCEABI.H/NMWException.cp: +Runtime.PPCEABI.H/NMWException.cpp: extab start:0x80005650 end:0x80005670 extabindex start:0x80005718 end:0x80005748 .text start:0x800E2108 end:0x800E23CC @@ -971,7 +971,7 @@ Runtime.PPCEABI.H/__init_cpp_exceptions.cpp: .dtors start:0x8011DCE0 end:0x8011DCE8 .sdata start:0x801D39B0 end:0x801D39B8 -Runtime.PPCEABI.H/Gecko_ExceptionPPC.cp: +Runtime.PPCEABI.H/Gecko_ExceptionPPC.cpp: extab start:0x80005670 end:0x800056E4 extabindex start:0x80005748 end:0x8000579C .text start:0x800E2B24 end:0x800E3F5C diff --git a/config/GMPE01_00/symbols.txt b/config/GMPE01_00/symbols.txt index d4d7595a..43ae5aae 100644 --- a/config/GMPE01_00/symbols.txt +++ b/config/GMPE01_00/symbols.txt @@ -3646,10 +3646,10 @@ __THPAANScaleFactor = .rodata:0x8011E490; // type:object size:0x40 data:byte lbl_8011E4D0 = .rodata:0x8011E4D0; // type:object size:0x10 lbl_8011E4E0 = .rodata:0x8011E4E0; // type:object size:0x10 __constants = .rodata:0x8011E4F0; // type:object size:0x18 scope:local data:double -lbl_8011E508 = .rodata:0x8011E508; // type:object size:0x54 -lbl_8011E55C = .rodata:0x8011E55C; // type:object size:0x14 -lbl_8011E570 = .rodata:0x8011E570; // type:object size:0x10 -lbl_8011E580 = .rodata:0x8011E580; // type:object size:0x20 +lbl_8011E508 = .rodata:0x8011E508; // type:object size:0x54 data:string +lbl_8011E55C = .rodata:0x8011E55C; // type:object size:0x14 data:string +lbl_8011E570 = .rodata:0x8011E570; // type:object size:0x10 data:string +lbl_8011E580 = .rodata:0x8011E580; // type:object size:0x20 data:string lbl_8011E5A0 = .rodata:0x8011E5A0; // type:object size:0x38 lbl_8011E5D8 = .rodata:0x8011E5D8; // type:object size:0x40 fix_pool_sizes = .rodata:0x8011E618; // type:object size:0x18 scope:local data:4byte diff --git a/config/GMPE01_01/splits.txt b/config/GMPE01_01/splits.txt index d7d8237a..4751f858 100644 --- a/config/GMPE01_01/splits.txt +++ b/config/GMPE01_01/splits.txt @@ -955,7 +955,7 @@ Runtime.PPCEABI.H/NewMore.cp: .data start:0x8013E208 end:0x8013E218 .sdata start:0x801D39A0 end:0x801D39A8 -Runtime.PPCEABI.H/NMWException.cp: +Runtime.PPCEABI.H/NMWException.cpp: extab start:0x80005650 end:0x80005670 extabindex start:0x80005718 end:0x80005748 .text start:0x800E2108 end:0x800E23CC @@ -971,7 +971,7 @@ Runtime.PPCEABI.H/__init_cpp_exceptions.cpp: .dtors start:0x8011DCE0 end:0x8011DCE8 .sdata start:0x801D39B0 end:0x801D39B8 -Runtime.PPCEABI.H/Gecko_ExceptionPPC.cp: +Runtime.PPCEABI.H/Gecko_ExceptionPPC.cpp: extab start:0x80005670 end:0x800056E4 extabindex start:0x80005748 end:0x8000579C .text start:0x800E2B24 end:0x800E3F5C diff --git a/configure.py b/configure.py index fbfa721c..1e740726 100644 --- a/configure.py +++ b/configure.py @@ -209,7 +209,7 @@ else: cflags_runtime = [ *cflags_base, "-use_lmw_stmw on", - "-str reuse,pool,readonly", + "-str reuse,readonly", "-common off", "-inline auto,deferred", ] @@ -668,11 +668,15 @@ config.libs = [ Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/__mem.c"), Object(NonMatching, "Runtime.PPCEABI.H/New.cp"), Object(NonMatching, "Runtime.PPCEABI.H/NewMore.cp"), - Object(NonMatching, "Runtime.PPCEABI.H/NMWException.cp"), + Object(NonMatching, "Runtime.PPCEABI.H/NMWException.cpp"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/runtime.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/__init_cpp_exceptions.cpp"), - Object(NonMatching, "Runtime.PPCEABI.H/Gecko_ExceptionPPC.cp"), - Object(NonMatching, "Runtime.PPCEABI.H/GCN_mem_alloc.c"), + Object( + NonMatching, + "Runtime.PPCEABI.H/Gecko_ExceptionPPC.cpp", + extra_cflags=["-Cpp_exceptions on"] + ), + Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/GCN_mem_alloc.c"), ], }, { @@ -1080,7 +1084,7 @@ config.libs = [ "m427Dll", # Right Oar Left? objects={ Object(MatchingFor("GMPE01_00", "GMPE01_01"), "REL/m427Dll/main.c"), - Object(NonMatching, "REL/m427Dll/map.c"), + Object(MatchingFor("GMPE01_00", "GMPE01_01"), "REL/m427Dll/map.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "REL/m427Dll/player.c"), }, ), @@ -1140,7 +1144,7 @@ config.libs = [ "m435Dll", # Darts of Doom objects={ Object(MatchingFor("GMPE01_00", "GMPE01_01", "GMPJ01_00"), "REL/m435Dll/main.c"), - Object(MatchingFor("GMPE01_00", "GMPE01_01" "GMPJ01_00"), "REL/m435Dll/sequence.c"), + Object(MatchingFor("GMPE01_00", "GMPE01_01", "GMPJ01_00"), "REL/m435Dll/sequence.c"), }, ), Rel( diff --git a/include/PowerPC_EABI_Support/Runtime/Gecko_ExceptionPPC.h b/include/PowerPC_EABI_Support/Runtime/Gecko_ExceptionPPC.h new file mode 100755 index 00000000..a864ea0d --- /dev/null +++ b/include/PowerPC_EABI_Support/Runtime/Gecko_ExceptionPPC.h @@ -0,0 +1,231 @@ +#ifndef _RUNTIME_GECKO_EXCEPTIONPPC_H +#define _RUNTIME_GECKO_EXCEPTIONPPC_H + +#include + +typedef u8 exaction_type; + +#define EXACTION_ENDBIT 0x80 +#define EXACTION_MASK 0x7F + +// EXAction structs + +#define EXACTION_ENDOFLIST 0 +#define EXACTION_BRANCH 1 + +typedef struct ex_branch { + exaction_type action; + u8 unused; + u16 target; +} ex_branch; + +#define EXACTION_DESTROYLOCAL 2 + +typedef struct ex_destroylocal { + exaction_type action; + u8 unused; + s16 local; + void* dtor; +} ex_destroylocal; + +#define EXACTION_DESTROYLOCALCOND 3 + +typedef struct ex_destroylocalcond { + exaction_type action; + u8 dlc_field; + s16 cond; + s16 local; + void* dtor; +} ex_destroylocalcond; + +#define ex_destroylocalcond_MakeField(regcond) (((regcond) << 7)) +#define ex_destroylocalcond_GetRegCond(field) ((field) >> 7) + +#define EXACTION_DESTROYLOCALPOINTER 4 + +typedef struct ex_destroylocalpointer { + exaction_type action; + u8 dlp_field; + s16 pointer; + void* dtor; +} ex_destroylocalpointer; + +#define ex_destroylocalpointer_MakeField(regpointer) (((regpointer) << 7)) +#define ex_destroylocalpointer_GetRegPointer(field) ((field) >> 7) + +#define EXACTION_DESTROYLOCALARRAY 5 + +typedef struct ex_destroylocalarray { + exaction_type action; + u8 unused; + s16 localarray; + u16 elements; + u16 element_size; + void* dtor; +} ex_destroylocalarray; + +#define EXACTION_DESTROYBASE 6 +#define EXACTION_DESTROYMEMBER 7 + +typedef struct ex_destroymember { + exaction_type action; + u8 dm_field; + s16 objectptr; + s32 offset; + void* dtor; +} ex_destroymember; + +#define ex_destroymember_MakeField(regpointer) (((regpointer) << 7)) +#define ex_destroymember_GetRegPointer(field) ((field) >> 7) + +#define EXACTION_DESTROYMEMBERCOND 8 + +typedef struct ex_destroymembercond { + exaction_type action; + u8 dmc_field; + s16 cond; + s16 objectptr; + s32 offset; + void* dtor; +} ex_destroymembercond; + +#define ex_destroymembercond_MakeField(regcond, regpointer) (((regcond) << 7) | (((regpointer)&0x1) << 6)) +#define ex_destroymembercond_GetRegCond(field) ((field) >> 7) +#define ex_destroymembercond_GetRegPointer(field) (((field) >> 6) & 0x1) + +#define EXACTION_DESTROYMEMBERARRAY 9 + +typedef struct ex_destroymemberarray { + exaction_type action; + u8 dma_field; + s16 objectptr; + s32 offset; + s32 elements; + s32 element_size; + void* dtor; +} ex_destroymemberarray; + +#define ex_destroymemberarray_MakeField(regpointer) (((regpointer) << 7)) +#define ex_destroymemberarray_GetRegPointer(field) ((field) >> 7) + +#define EXACTION_DELETEPOINTER 10 + +typedef struct ex_deletepointer { + exaction_type action; + u8 dp_field; + s16 objectptr; + void* deletefunc; +} ex_deletepointer; + +#define ex_deletepointer_MakeField(regpointer) (((regpointer) << 7)) +#define ex_deletepointer_GetRegPointer(field) ((field) >> 7) + +#define EXACTION_DELETEPOINTERCOND 11 + +typedef struct ex_deletepointercond { + exaction_type action; + u8 dpc_field; + s16 cond; + s16 objectptr; + void* deletefunc; +} ex_deletepointercond; + +#define ex_deletepointercond_MakeField(regcond, regpointer) (((regcond) << 7) | (((regpointer)&0x1) << 6)) +#define ex_deletepointercond_GetRegCond(field) ((field) >> 7) +#define ex_deletepointercond_GetRegPointer(field) (((field) >> 6) & 0x1) + +#define EXACTION_CATCHBLOCK 12 + +typedef struct ex_catchblock { + exaction_type action; + u8 unused; + char* catch_type; + u16 catch_pcoffset; + s16 cinfo_ref; +} ex_catchblock; + +#define EXACTION_ACTIVECATCHBLOCK 13 + +typedef struct ex_activecatchblock { + exaction_type action; + u8 unused; + s16 cinfo_ref; +} ex_activecatchblock; + +#define EXACTION_TERMINATE 14 + +typedef struct ex_terminate { + exaction_type action; + u8 unused; +} ex_terminate; + +#define EXACTION_SPECIFICATION 15 + +typedef struct ex_specification { + exaction_type action; + u8 unused; + u16 specs; + s32 pcoffset; + s32 cinfo_ref; + char* spec[]; +} ex_specification; + +#define EXACTION_CATCHBLOCK_32 16 + +typedef struct ex_catchblock_32 { + exaction_type action; + u8 unused; + char* catch_type; + s32 catch_pcoffset; + s32 cinfo_ref; +} ex_catchblock_32; + +// Other structs + +typedef struct ExceptionRangeSmall { + u16 start; + u16 end; + u16 action; +} ExceptionRangeSmall; + +typedef struct ExceptionTableSmall { + u16 et_field; + ExceptionRangeSmall ranges[0]; +} ExceptionTableSmall; + +typedef struct ExceptionRangeLarge { + u32 start; + u16 size; + u16 action; +} ExceptionRangeLarge; + +typedef struct ExceptionTableLarge { + u16 et_field; + u16 et_field2; + ExceptionRangeLarge ranges[]; +} ExceptionTableLarge; + +#define ET_MakeField(savedGPRs, savedFPRs, savedCR, hasframeptr, isLarge) \ + (((savedGPRs) << 11) | ((savedFPRs & 0x1f) << 6) | ((savedCR & 0x1) << 5) | ((hasframeptr & 0x1) << 4) | ((isLarge & 1) << 3)) + +#define ET_GetSavedGPRs(field) ((field) >> 11) +#define ET_GetSavedFPRs(field) (((field) >> 6) & 0x1f) +#define ET_GetSavedCR(field) (((field) >> 5) & 0x1) +#define ET_GetHasFramePtr(field) (((field) >> 4) & 0x1) +#define ET_IsLargeTable(field) (((field) >> 3) & 0x1) +#define ET_ClearLargeBit(field) ((field) & ~(1 << 3)) +#define ET_SetLargeBit(field) ((field) | (1 << 3)) + +#define ET_HasElfVector(field) (((field) >> 1) & 0x1) + +typedef struct ExceptionTableIndex { + u32 functionoffset; + u32 eti_field; + u32 exceptionoffset; +} ExceptionTableIndex; + +#define ETI_MakeField(direct, fsize) ((((s32)(direct)) << 31) | ((fsize)&0x7fffffff)) +#define ETI_GetDirectStore(field) ((field) >> 31) +#define ETI_GetFunctionSize(field) ((field)&0x7fffffff) + +#endif diff --git a/include/PowerPC_EABI_Support/Runtime/NMWException.h b/include/PowerPC_EABI_Support/Runtime/NMWException.h index 2358f785..aba83f4d 100644 --- a/include/PowerPC_EABI_Support/Runtime/NMWException.h +++ b/include/PowerPC_EABI_Support/Runtime/NMWException.h @@ -1,7 +1,15 @@ #ifndef _NMWEXCEPTION #define _NMWEXCEPTION -typedef short vbase_ctor_arg_type; +#include "types.h" +#include "PowerPC_EABI_Support/Runtime/exception.h" +#include "PowerPC_EABI_Support/Runtime/__ppc_eabi_linker.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef s16 vbase_ctor_arg_type; typedef char local_cond_type; typedef struct CatchInfo { @@ -9,7 +17,7 @@ typedef struct CatchInfo { void* typeinfo; void* dtor; void* sublocation; - long pointercopy; + s32 pointercopy; void* stacktop; } CatchInfo; @@ -19,18 +27,12 @@ typedef struct DestructorChain { void* object; } DestructorChain; -#ifdef __cplusplus -extern "C" { -#endif - -extern void* __register_global_object(void* object, void* destructor, - void* registration); +extern void* __register_global_object(void* object, void* destructor, void* registration); extern void __destroy_global_chain(void); extern void __end__catch(CatchInfo* catchinfo); extern void __throw(char* throwtype, void* location, void* dtor); -extern char __throw_catch_compare(const char* throwtype, const char* catchtype, - long* offset_result); +extern char __throw_catch_compare(const char* throwtype, const char* catchtype, s32* offset_result); extern void __unexpected(CatchInfo* catchinfo); extern int __register_fragment(struct __eti_init_info* info, char* TOC); diff --git a/include/PowerPC_EABI_Support/Runtime/exception.h b/include/PowerPC_EABI_Support/Runtime/exception.h new file mode 100755 index 00000000..2530b3de --- /dev/null +++ b/include/PowerPC_EABI_Support/Runtime/exception.h @@ -0,0 +1,38 @@ +#ifndef _EXCEPTION +#define _EXCEPTION + +namespace std { +class exception { +public: + exception() { } + virtual ~exception() { } + virtual const char* what() const { return "exception"; } +}; + +class bad_exception : public exception { +public: + bad_exception() { } + virtual ~bad_exception() { } + virtual const char* what() const { return "bad_exception"; } +}; + +typedef void (*unexpected_handler)(); +unexpected_handler set_unexpected(unexpected_handler handler); +void unexpected(); + +typedef void (*terminate_handler)(); +terminate_handler set_terminate(terminate_handler handler); +void terminate(); + +} // namespace std + +using std::bad_exception; +using std::exception; +using std::set_terminate; +using std::set_unexpected; +using std::terminate; +using std::terminate_handler; +using std::unexpected; +using std::unexpected_handler; + +#endif diff --git a/include/REL/m427Dll.h b/include/REL/m427Dll.h index c8290376..ceda94c3 100644 --- a/include/REL/m427Dll.h +++ b/include/REL/m427Dll.h @@ -1,21 +1,35 @@ #include "dolphin.h" #include "game/object.h" -s32 fn_1_1788(void); -void fn_1_1798(s32 arg0, float arg8); -s32 fn_1_1884(void); -s32 fn_1_32EC(void); +typedef struct M427DllStruct { + s32 unk0; + s32 unk4; +} M427DllStruct; -void fn_1_32F4(Process* arg0); -void fn_1_3B20(s8 arg0, s16 arg1); +s32 fn_1_1788(void); +void fn_1_1798(s32 arg0, float arg8); +s32 fn_1_1884(void); +s32 fn_1_32EC(void); + +void fn_1_32F4(Process *arg0); +void fn_1_3B20(s8 arg0, s16 arg1); void fn_1_3A88(void); -void fn_1_91E0(s16 arg0, float arg8, float arg9, float argA, float argB); -float fn_1_AE78(s16 arg0, float arg8, float arg9); -void fn_1_E98C(Process*); +void fn_1_91E0(s16 arg0, float arg8, float arg9, float argA, float argB); +float fn_1_AE78(s16 arg0, float arg8, float arg9); +void fn_1_E98C(Process *); void fn_1_EC54(void); s32 fn_1_10FE8(s32 arg0, s32 *arg1); -void fn_1_110E8(s32, s32*); -void fn_1_111C0(s32, s32*); +void fn_1_110E8(s32, s32 *); +void fn_1_111C0(s32, s32 *); void fn_1_11298(f32); s32 fn_1_113F0(s32); f32 fn_1_168FC(f32, f32, f32); + +s32 fn_1_15F10(Vec arg0, Vec arg1, s32 arg2, s32 arg3, s32 arg4); +s32 fn_1_15FD0(Vec arg0, float arg8, s32 arg1, s32 arg2, s32 arg3); + +extern s32 lbl_1_bss_580; +extern Vec *lbl_1_bss_558; +extern Vec *lbl_1_bss_554; +extern Vec *lbl_1_bss_550; +extern M427DllStruct lbl_1_bss_0[8]; diff --git a/include/game/audio.h b/include/game/audio.h index 16738144..f5ca39f0 100644 --- a/include/game/audio.h +++ b/include/game/audio.h @@ -30,41 +30,41 @@ void HuAudFXFadeOut(int seNo, s32 speed); void HuAudFXPanning(int seNo, s16 pan); void HuAudFXListnerSet(Vec *pos, Vec *heading, float sndDist, float sndSpeed); void HuAudFXListnerSetEX(Vec *pos, Vec *heading, float sndDist, float sndSpeed, float startDis, float frontSurDis, float backSurDis); -void HuAudFXListnerUpdate(Vec *arg0, Vec *arg1); +void HuAudFXListnerUpdate(Vec *pos, Vec *heading); int HuAudFXEmiterPlay(int seId, Vec *pos); void HuAudFXEmiterUpDate(int seNo, Vec *pos); void HuAudFXListnerKill(void); -void HuAudFXPauseAll(s32 arg0); +void HuAudFXPauseAll(s32 pause); s32 HuAudFXStatusGet(int seNo); s32 HuAudFXPitchSet(int seNo, s16 pitch); s32 HuAudFXVolSet(int seNo, s16 vol); -s32 HuAudSeqPlay(s16 arg0); -void HuAudSeqStop(s32 arg0); -void HuAudSeqFadeOut(s32 arg0, s32 arg1); -void HuAudSeqAllFadeOut(s32 arg0); +s32 HuAudSeqPlay(s16 musId); +void HuAudSeqStop(s32 musNo); +void HuAudSeqFadeOut(s32 musNo, s32 speed); +void HuAudSeqAllFadeOut(s32 speed); void HuAudSeqAllStop(void); -void HuAudSeqPauseAll(s32 arg0); -void HuAudSeqPause(s32 arg0, s32 arg1, s32 arg2); -s32 HuAudSeqMidiCtrlGet(s32 arg0, s8 arg1, s8 arg2); -s32 HuAudSStreamPlay(s16 arg0); -void HuAudSStreamStop(s32 arg0); -void HuAudSStreamFadeOut(s32 arg0, s32 arg1); -void HuAudSStreamAllFadeOut(s32 arg0); +void HuAudSeqPauseAll(s32 pause); +void HuAudSeqPause(s32 musNo, s32 pause, s32 speed); +s32 HuAudSeqMidiCtrlGet(s32 musNo, s8 channel, s8 ctrl); +s32 HuAudSStreamPlay(s16 streamId); +void HuAudSStreamStop(s32 seNo); +void HuAudSStreamFadeOut(s32 seNo, s32 speed); +void HuAudSStreamAllFadeOut(s32 speed); void HuAudSStreamAllStop(void); -s32 HuAudSStreamStatGet(s32 arg0); +s32 HuAudSStreamStatGet(s32 seNo); void HuAudDllSndGrpSet(u16 ovl); -void HuAudSndGrpSetSet(s16 arg0); -void HuAudSndGrpSet(s16 arg0); -void HuAudSndCommonGrpSet(s16 arg0, s32 arg1); -void HuAudAUXSet(s32 arg0, s32 arg1); -void HuAudAUXVolSet(s8 arg0, s8 arg1); +void HuAudSndGrpSetSet(s16 data_size); +void HuAudSndGrpSet(s16 grpId); +void HuAudSndCommonGrpSet(s16 grpId, s32 groupCheck); +void HuAudAUXSet(s32 auxA, s32 auxB); +void HuAudAUXVolSet(s8 auxA, s8 auxB); void HuAudVoiceInit(s16 ovl); -s32 HuAudPlayerVoicePlay(s16 arg0, s16 arg1); -s32 HuAudPlayerVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2); -void HuAudPlayerVoicePlayEntry(s16 arg0, s16 arg1); -s32 HuAudCharVoicePlay(s16 arg0, s16 arg1); -s32 HuAudCharVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2); -void HuAudCharVoicePlayEntry(s16 arg0, s16 arg1); +s32 HuAudPlayerVoicePlay(s16 player, s16 seId); +s32 HuAudPlayerVoicePlayPos(s16 player, s16 seId, Vec *pos); +void HuAudPlayerVoicePlayEntry(s16 player, s16 seId); +s32 HuAudCharVoicePlay(s16 charNo, s16 seId); +s32 HuAudCharVoicePlayPos(s16 charNo, s16 seId, Vec *pos); +void HuAudCharVoicePlayEntry(s16 charNo, s16 seId); extern float Snd3DBackSurDisOffset; extern float Snd3DFrontSurDisOffset; diff --git a/include/game/board/audio.h b/include/game/board/audio.h index a3b617b9..714e97fa 100755 --- a/include/game/board/audio.h +++ b/include/game/board/audio.h @@ -4,13 +4,13 @@ #include "dolphin/types.h" void BoardMusStartBoard(void); -void BoardMusStart(s32 arg0, s32 arg1, s8 arg2, u16 arg3); -void BoardAudSeqFadeOutFast(s32 arg0); -void BoardAudSeqFadeOut(s32 arg0, u16 arg1); -void BoardMusLoudSet(s32 arg0, s32 arg1); -void BoardMusVolPanSet(s32 arg0, s8 arg1, u16 arg2); -void BoardAudSeqPause(s32 arg0, s32 arg1, u16 arg2); -s32 BoardMusStatusGet(s32 arg0); +void BoardMusStart(s32 boardNo, s32 musId, s8 vol, u16 speed); +void BoardAudSeqFadeOutFast(s32 boardNo); +void BoardAudSeqFadeOut(s32 boardNo, u16 speed); +void BoardMusLoudSet(s32 boardNo, s32 isQuieter); +void BoardMusVolPanSet(s32 boardNo, s8 vol, u16 fadeSpeed); +void BoardAudSeqPause(s32 boardNo, s32 pause, u16 speed); +s32 BoardMusStatusGet(s32 boardNo); void BoardAudSeqClear(void); void BoardAudSeqFadeOutAll(void); void BoardAudFXPlay(void); diff --git a/src/MSL_C.PPCEABI.bare.H/abort_exit.c b/src/MSL_C.PPCEABI.bare.H/abort_exit.c index b54f4742..4432d145 100644 --- a/src/MSL_C.PPCEABI.bare.H/abort_exit.c +++ b/src/MSL_C.PPCEABI.bare.H/abort_exit.c @@ -2,7 +2,6 @@ #include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/critical_regions.h" #include "PowerPC_EABI_Support/Msl/MSL_C/MSL_Common/signal.h" #include "stddef.h" -#include "PowerPC_EABI_Support/Runtime/NMWException.h" void _ExitProcess(); diff --git a/src/REL/m427Dll/main.c b/src/REL/m427Dll/main.c index 84bcb03b..fdf0de2d 100644 --- a/src/REL/m427Dll/main.c +++ b/src/REL/m427Dll/main.c @@ -10,11 +10,6 @@ #include "game/objsub.h" #include "game/wipe.h" -typedef struct M427DllStruct { - s32 unk0; - s32 unk4; -} M427DllStruct; - typedef struct M427DllStruct2 { s32 unk0[3]; s32 unkC; diff --git a/src/REL/m427Dll/map.c b/src/REL/m427Dll/map.c index acbbb20e..1678f422 100644 --- a/src/REL/m427Dll/map.c +++ b/src/REL/m427Dll/map.c @@ -1,19 +1,27 @@ #include "REL/m427Dll.h" +#include "dolphin/gx/GXEnum.h" +#include "dolphin/gx/GXStruct.h" +#include "dolphin/gx/GXVert.h" +#include "dolphin/pad.h" #include "ext_math.h" #include "game/animdata.h" +#include "game/audio.h" +#include "game/hsfanim.h" #include "game/hsfdraw.h" #include "game/hsfman.h" #include "game/hsfmotion.h" +#include "game/memory.h" +#include "game/object.h" +#include "game/pad.h" #include "game/sprite.h" +#include "string.h" + +extern s32 rand8(void); +extern LightData Hu3DLocalLight[0x20]; #define FABS(value) ((value < 0) ? -(value) : (value)) -typedef struct M427DllStruct { - s32 unk0; - s32 unk4; -} M427DllStruct; - typedef struct M427DllStruct2 { s32 unk0[3]; s32 unkC; @@ -35,24 +43,38 @@ typedef struct M427DllStruct3 { Vec rot; Vec cen; f32 zoom; -} M427DllStruct3; +} M427DllStruct3; // sizeof 0x1C typedef struct M427DllMapStruct { - char unk_0[0x2]; + u8 unk0; + char unk_1; s16 unk2; s16 unk4; char unk_6[0x2]; - AnimData* unk8; - char unk_C[0x74]; - void* unk80; - char unk_84[0x14]; + AnimData *unk8; + Vec unkC; + Vec unk18; + Vec unk24; + Vec unk30; + Vec2f unk3C; + Vec2f unk44; + Vec2f unk4C; + Vec2f unk54; + Vec2f unk5C[4]; + GXColor unk7C; + void *unk80; + s32 unk84; + float unk88; + float unk8C; + float unk90; + float unk94; } M427DllMapStruct; // sizeof 0x98 typedef struct M427DllMapStruct2 { s8 unk0; s16 unk2; s16 unk4; -} M427DllMapStruct2; +} M427DllMapStruct2; // sizeof 0x6 typedef struct M427DllMapSubstruct { s16 unk0; @@ -62,31 +84,46 @@ typedef struct M427DllMapSubstruct { typedef struct M427DllMapSubstruct2 { s16 unk0; Vec unk4; - s16 unk10; - s16 unk12; + s16 unk10[2]; s16 unk14[4]; } M427DllMapSubstruct2; // sizeof 0x1C -typedef struct M427DllMapSubstruct4 { - char unk[0x28]; - AnimData* unk28; -} M427DllMapSubstruct4; - typedef struct M427DllMapSubstruct7 { s16 unk0; s32 unk4; - void* unk8; -} M427DllMapSubstruct7; + void *unk8; +} M427DllMapSubstruct7; // sizeof 0xC -typedef struct M427DllMapUNKBA { - s16 unk0; - char unk[0x2E]; -} M427DllMapUNKBA; - -typedef struct M427DllMapUNK180 { +typedef struct M427DllMapUNKB8 { s16 unk0; s16 unk2; -} M427DllMapUNK180; + s16 unk4; + s16 unk6; + u8 unk8; + s16 unkA; + float unkC; + float unk_10; + float unk_14; + s16 unk18; + s16 unk1A; + s16 unk1C; + s16 unk1E; + float unk20; + float unk24; + float unk28; + float unk2C; +} M427DllMapUNKB8; // sizeof 0x30 + +typedef struct M427DllMapUNK17E { + s16 unk0; + s16 unk2; +} M427DllMapUNK17E; // sizeof 0x4 + +typedef struct M427DllMapSubstruct3Sub { + s16 unk0; + void *unk4; + u32 unk8; +} M427DllMapSubstruct3Sub; // sizeof 0xC typedef struct M427DllMapSubstruct3 { s16 unk0; @@ -96,30 +133,44 @@ typedef struct M427DllMapSubstruct3 { s16 unk1C; s16 unk1E; s16 unk20; - char unk_22[0x3A]; + char unk_22[2]; + float unk24[4]; + s16 unk34[4]; + s16 unk3C[4]; + s16 unk44[0xB]; + s16 unk5A; s16 unk5C; - char unk_5E[0x1A]; + char unk_5E[2]; + Vec unk_60; + Vec unk_6C; Vec unk78; Vec unk84; f32 unk90; - char unk_94[0x4]; - void* unk98; - M427DllMapSubstruct7* unk9C; + M427DllMapSubstruct3Sub unk94; char unk_A0[0xC]; - M427DllMapSubstruct4* unkAC; - char unk_B0[0xA]; - M427DllMapUNKBA unkBA[2][2]; - char unk_17A[0x6]; - M427DllMapUNK180 unk180[2][2]; - char unk_190[0x8]; + struct M427DllMapStruct6 *unkAC; + s16 unkB0[1]; + char unk_B2[0x6]; + M427DllMapUNKB8 unkB8[2][2]; + s16 unk178[3]; + M427DllMapUNK17E unk17E[2][2]; + s16 unk18E[2]; + char unk194[4]; } M427DllMapSubstruct3; // sizeof 0x198 +typedef struct M427DllMapStruct3Sub { + AnimData *unk_00; + AnimData *unk_04; + float unk_08; + float unk_0C; + float unk_10; + float unk_14; +} M427DllMapStruct3Sub; // sizeof 0x18 + typedef struct M427DllMapStruct3 { u8 unk0; M427DllMapSubstruct3 unk4[2]; - AnimData* unk334; - AnimData* unk338; - char unk_33C[0x10]; + M427DllMapStruct3Sub unk334; M427DllMapSubstruct2 unk34C[3]; M427DllMapSubstruct unk3A0[5]; } M427DllMapStruct3; // sizeof 0x3F0 @@ -130,24 +181,24 @@ typedef struct M427DllMapSubstruct5 { s16 unk4; s16 unk6; Vec unk8; - char unk[0x8]; -} M427DllMapSubstruct5; + char unk14[0x8]; +} M427DllMapSubstruct5; // sizeof 0x1C typedef struct M427DllMapStruct4 { s16 unk0; - Vec* unk4; - Vec2f* unk8; - Vec* unkC; - GXColor* unk10; + Vec *unk4; + Vec2f *unk8; + Vec *unkC; + GXColor *unk10; s16 unk14; s16 unk16; s16 unk18; - M427DllMapSubstruct5* unk1C; - void* unk20; + M427DllMapSubstruct5 *unk1C; + void *unk20; u32 unk24; - void* unk28; + void *unk28; u32 unk2C; - void* unk30; + void *unk30; u32 unk34; f32 unk38; f32 unk3C; @@ -155,7 +206,7 @@ typedef struct M427DllMapStruct4 { f32 unk44; s16 unk48[1]; s16 unk4A; -} M427DllMapStruct4; +} M427DllMapStruct4; // sizeof 0x4C typedef struct M427DllMapStruct5 { f32 unk0; @@ -165,56 +216,193 @@ typedef struct M427DllMapStruct5 { f32 unk10; } M427DllMapStruct5; // sizeof 0x14 -omObjData* lbl_1_bss_548; +typedef struct M427DllMapStruct6 { + s16 unk_00; + Vec *unk_04; + Vec *unk_08; + float unk_0C; + float unk_10; + float unk_14; + float unk_18; + float unk_1C; + float unk_20; + float unk_24; + AnimData *unk_28; + Vec *unk_2C; + Vec2f *unk_30; + Vec *unk_34; + s16 unk_38; + s16 unk_3A; + s16 unk_3C; + char pad_3E[2]; + void *unk_40; + u32 unk_44; + M427DllMapSubstruct5 *unk_48; + float unk_4C; + float unk_50; + float unk_54; + float unk_58; + float unk_5C; + /* 0x60 */ float unk_60; +} M427DllMapStruct6; /* size = 0x64, stored in unk_120 */ + +typedef struct M427DllMapSubstruct6 { + /* 0x00 */ float unk_00; + /* 0x04 */ float unk_04; + /* 0x08 */ float unk_08; + /* 0x0C */ char pad_0C[0xC]; /* maybe part of unk_08[4]? */ + /* 0x18 */ float unk_18; + /* 0x1C */ float unk_1C; + /* 0x20 */ float unk_20; + /* 0x24 */ float unk_24; + /* 0x28 */ float unk_28; + /* 0x2C */ float unk_2C; + /* 0x30 */ float unk_30; + /* 0x34 */ s16 unk_34; + /* 0x36 */ s16 unk_36; + /* 0x38 */ s16 unk_38; + /* 0x3A */ char pad_3A[2]; + /* 0x3C */ s32 unk_3C; + /* 0x40 */ s16 unk_40; + /* 0x42 */ char pad_42[2]; + /* 0x44 */ float unk_44; + /* 0x48 */ Vec unk_48; + /* 0x54 */ Vec unk_54; + /* 0x60 */ s16 unk_60; + /* 0x62 */ s8 unk_62; + /* 0x63 */ char pad_63[1]; +} M427DllMapSubstruct6; // sizeof 0x64 + +typedef void (*M427DllHook)(ModelData *model, struct M427DllMapStruct7 *particle, Mtx matrix); + +typedef struct M427DllMapStruct7 { + /* 0x00 */ s16 unk_00; + /* 0x02 */ char pad_02[2]; + /* 0x04 */ u32 unk_04; + /* 0x08 */ u8 unk_08; + /* 0x09 */ char pad_09[3]; /* maybe part of unk_08[4]? */ + /* 0x0C */ M427DllHook unk_0C; + /* 0x10 */ AnimData *unk_10; + /* 0x14 */ s16 unk_14; + /* 0x16 */ char pad_16[2]; + /* 0x18 */ M427DllMapSubstruct6 *unk_18; + /* 0x1C */ Vec *unk_1C; + /* 0x20 */ Vec2f *unk_20; + /* 0x24 */ GXColor *unk_24; + /* 0x28 */ void *unk_28; + /* 0x2C */ Vec unk_2C; + /* 0x38 */ float unk_38; + /* 0x3C */ float unk_3C; + /* 0x40 */ float unk_40; + /* 0x44 */ float unk_44; + /* 0x48 */ float unk_48; + /* 0x4C */ float unk_4C; + /* 0x50 */ float unk_50; + /* 0x54 */ float unk_54; + /* 0x58 */ float unk_58; + /* 0x5C */ Vec2f *unk_5C; + /* 0x60 */ float unk_60; + /* 0x64 */ float unk_64; +} M427DllMapStruct7; /* size = 0x68, stored in unk_120 */ + +GXColor lbl_1_data_E8 = { 0xFF, 0xFF, 0xFF, 0xFF }; + +omObjData *lbl_1_bss_548; M427DllMapStruct3 lbl_1_bss_158; M427DllMapStruct2 lbl_1_bss_F8[0x10]; -M427DllMapStruct* lbl_1_bss_F0; +AnimData *lbl_1_bss_F4; +M427DllMapStruct *lbl_1_bss_F0; s16 lbl_1_bss_EC[2]; s16 lbl_1_bss_E8[2]; -M427DllMapStruct5* lbl_1_bss_E4; +M427DllMapStruct5 *lbl_1_bss_E4; M427DllMapStruct4 lbl_1_bss_98; f32 lbl_1_bss_94; +s8 lbl_1_bss_91; +s8 lbl_1_bss_90; void fn_1_372C(void); -void fn_1_4218(omObjData*); +void fn_1_4218(omObjData *object); void fn_1_44F4(f32, f32, f32, f32, f32); -void fn_1_48EC(ModelData*, Mtx); -void fn_1_4D7C(ModelData*, Mtx); -void fn_1_50A0(ModelData*, Mtx); +void fn_1_48EC(ModelData *model, Mtx matrix); +void fn_1_4D7C(ModelData *model, Mtx matrix); +void fn_1_50A0(ModelData *model, Mtx matrix); void fn_1_510C(s32, s16, s16); -void fn_1_558C(M427DllMapStruct4*); -void fn_1_618C(ModelData*, Mtx); -void fn_1_6760(omObjData*); -void fn_1_C2C8(Vec*, Vec*, Vec*, void*); -void fn_1_D22C(void); -s16 fn_1_D63C(AnimData*, s32, f32, s32, s32); +void fn_1_558C(M427DllMapStruct4 *); +void fn_1_618C(ModelData *model, Mtx matrix); +void fn_1_6760(omObjData *object); +void fn_1_C2C8(Vec *arg0, Vec *arg1, Vec *arg2, Vec *arg3); +void fn_1_D22C(ModelData *model, struct M427DllMapStruct7 *arg1, Mtx matrix); +s16 fn_1_D63C(AnimData *arg0, s16 arg1, float arg8, s16 arg2, s16 arg3); void fn_1_DB80(s16); -void fn_1_DC64(s16, void (*)(void)); -void fn_1_DC9C(s16, s32); +void fn_1_DC64(s16, M427DllHook); +void fn_1_DC9C(s16, u8); +void fn_1_72E4(omObjData *arg0); +void fn_1_73BC(void); +void fn_1_794C(M427DllMapSubstruct3 *arg0, s16 arg1); +void fn_1_7C34(void); +void fn_1_7E60(s16 arg0, M427DllMapSubstruct3 *arg1); +void fn_1_7F38(void); +void fn_1_85D4(s16 arg0, M427DllMapSubstruct3 *arg1); +void fn_1_8768(M427DllMapSubstruct3 *arg0, M427DllMapUNKB8 *arg1, s16 arg2, float arg8, float arg9); +void fn_1_8E1C(u8 arg0, M427DllMapSubstruct3 *arg1, M427DllMapUNKB8 *arg2); +void fn_1_8F90(omObjData *object); +void fn_1_9240(void); +void fn_1_9318(s16 *arg0, s16 arg1); +void fn_1_93EC(s32 arg0, s32 arg1, float arg8, float arg9, float argA, float argB); +s16 fn_1_95E8(s32 arg0, s16 arg1, s16 arg2, float arg8, float arg9, float argA, float argB, float argC); +void fn_1_9958(s16 arg0, u8 arg1); +void fn_1_999C(s16 arg0, u8 arg1); +void fn_1_99E4(s16 arg0, u8 arg1, u8 arg2, u8 arg3, u8 arg4); +void fn_1_9A2C(s16 arg0, float arg8, float arg9, float argA); +void fn_1_9AA0(s16 arg0, float arg8, float arg9, float argA); +void fn_1_9B14(s16 arg0, float arg8, float arg9, float argA); +void fn_1_9B88(ModelData *model, Mtx matrix); +void fn_1_A148(ModelData *model, Mtx matrix); +s16 fn_1_A1F4(s32 arg0, s16 arg1, s16 arg2, s16 arg3, float arg8, Vec *arg4, Vec *arg5); +void fn_1_A7F8(M427DllMapStruct6 *arg0); +void fn_1_B194(M427DllMapStruct6 *arg0, float arg8, Vec *arg1); +void fn_1_B3CC(ModelData *model, Mtx matrix); +void fn_1_C154(ModelData *model, Mtx matrix); +void fn_1_C200(ModelData *model, Mtx matrix); +void fn_1_C2AC(Vec *arg0, float arg8, float arg9, float argA); +void fn_1_C2BC(Vec2f *arg0, float arg8, float arg9); +s16 fn_1_C41C(float arg8, float arg9, float argA, float argB, float argC, float argD, u8 arg0, u8 arg1, u8 arg2); +void fn_1_C528(s16 arg0, s16 arg1, float arg8, float arg9, float argA, float argB, float argC, float argD, u8 arg2, u8 arg3, u8 arg4); +void fn_1_C68C(LightData *arg0, Vec *arg1, Vec *arg2, GXColor *arg3); +void fn_1_C76C(u8 arg0, float arg8, float arg9, float argA, s16 arg1, float argB, float argC, s16 arg2); +s16 fn_1_D430(float arg8, float arg9, float argA, s16 arg0); +M427DllMapSubstruct6 *fn_1_D4FC(s16 arg0, Vec *arg1, Vec *arg2, float arg8, GXColor *arg3); +M427DllMapSubstruct6 *fn_1_DC0C(s16 arg0, s16 arg1); +void fn_1_DCD4(ModelData *model, Mtx matrix); +void fn_1_E2B0(Vec2f *arg0, s16 arg1, s16 arg2, float arg8, float arg9); +void fn_1_E37C(Vec2f *arg0, Vec2f *arg1, s16 arg2, float arg8, float arg9); +void fn_1_E420(Vec *arg0, Vec *arg1, Vec *arg2, s16 arg3); -void fn_1_32F4(Process* arg0) { +void fn_1_32F4(Process *arg0) +{ s16 var_r31; - AnimData* temp_r30; + AnimData *temp_r30; s32 var_r29; s32 var_r28; lbl_1_bss_158.unk0 = 0; lbl_1_bss_548 = omAddObjEx(arg0, 0x7F, 0, 0, -1, fn_1_6760); - lbl_1_bss_F0 = HuMemDirectMallocNum(HEAP_SYSTEM, 0x10 * sizeof(M427DllMapStruct), 0x10000000); - + lbl_1_bss_F0 = HuMemDirectMallocNum(HEAP_SYSTEM, 0x10 * sizeof(M427DllMapStruct), MEMORY_DEFAULT_NUM); + for (var_r31 = 0; var_r31 < 0x10; var_r31++) { lbl_1_bss_F0[var_r31].unk2 = -1; } - temp_r30 = HuSprAnimRead(HuDataReadNum(0x3A0017, MEMORY_DEFAULT_NUM)); + temp_r30 = HuSprAnimRead(HuDataReadNum(0x3A0017, MEMORY_DEFAULT_NUM)); for (var_r31 = 0; var_r31 < 2; var_r31++) { lbl_1_bss_EC[var_r31] = fn_1_D63C(temp_r30, 0x200, 80.0f, 0x40, 0x40); - fn_1_DC64(lbl_1_bss_EC[var_r31], &fn_1_D22C); + fn_1_DC64(lbl_1_bss_EC[var_r31], fn_1_D22C); fn_1_DC9C(lbl_1_bss_EC[var_r31], 1); Hu3DModelLayerSet(lbl_1_bss_EC[var_r31], 7); if (var_r31 == 0) { var_r29 = 1; - } else { + } + else { var_r29 = 2; } Hu3DModelCameraSet(lbl_1_bss_EC[var_r31], var_r29); @@ -226,13 +414,14 @@ void fn_1_32F4(Process* arg0) { Hu3DModelLayerSet(lbl_1_bss_E8[var_r31], 7); if (var_r31 == 0) { var_r28 = 1; - } else { + } + else { var_r28 = 2; } Hu3DModelCameraSet(lbl_1_bss_E8[var_r31], var_r28); } fn_1_372C(); - + for (var_r31 = 0; var_r31 < 0x10; var_r31++) { lbl_1_bss_F8[var_r31].unk0 = -1; lbl_1_bss_F8[var_r31].unk2 = Hu3DModelCreateFile(0x3A0012); @@ -245,77 +434,62 @@ void fn_1_32F4(Process* arg0) { } } -void fn_1_372C(void) { - M427DllMapSubstruct* var_r29 = &lbl_1_bss_158.unk3A0[0]; - M427DllMapSubstruct2* var_r30 = &lbl_1_bss_158.unk34C[0]; +void fn_1_372C(void) +{ + M427DllMapSubstruct *var_r29 = &lbl_1_bss_158.unk3A0[0]; + M427DllMapSubstruct2 *var_r30 = &lbl_1_bss_158.unk34C[0]; s16 sp1A[5] = { 0, 0, 1, 1, 0 }; - Vec sp60[5] = { - { -700.0f, -150.0f, -7000.0f }, - { 0.0f, -300.0f, -12000.0f }, - { 800.0f, -350.0f, -12700.0f }, - { 600.0f, -350.0f, -13700.0f }, - { 825.0f, -450.0f, -15000.0f } - }; + Vec sp60[5] = { { -700.0f, -150.0f, -7000.0f }, { 0.0f, -300.0f, -12000.0f }, { 800.0f, -350.0f, -12700.0f }, { 600.0f, -350.0f, -13700.0f }, + { 825.0f, -450.0f, -15000.0f } }; s16 sp8[3] = { 1, 1, 0 }; - s16 spE[3][2] = { { 4, 5 }, { 8, -1 }, { 9, -1 } }; - s16 sp24[3][4] = { - { 180, 120, 60, 60 }, - { 90, 180, 60, 60 }, - { 90, 180, 60, 60 } - }; - Vec sp3C[3] = { - -350.0f, -300.0f, -10000.0f, - -700.0f, -600.0f, -17000.0f, - 700.0f, -600.0f, -19000.0f - }; + s16 spE[3][2] = { { 4, 5 }, { 8, -1 }, { 9, -1 } }; + s16 sp24[3][4] = { { 180, 120, 60, 60 }, { 90, 180, 60, 60 }, { 90, 180, 60, 60 } }; + Vec sp3C[3] = { -350.0f, -300.0f, -10000.0f, -700.0f, -600.0f, -17000.0f, 700.0f, -600.0f, -19000.0f }; s16 var_r28; s16 var_r31; - + for (var_r31 = 0; var_r31 < 5; var_r31++, var_r29++) { var_r29->unk0 = sp1A[var_r31]; var_r29->unk4.x = sp60[var_r31].x; var_r29->unk4.y = sp60[var_r31].y; var_r29->unk4.z = sp60[var_r31].z; } - + for (var_r31 = 0; var_r31 < 3; var_r31++, var_r30++) { var_r30->unk0 = sp8[var_r31]; var_r30->unk4.x = sp3C[var_r31].x; var_r30->unk4.y = sp3C[var_r31].y; var_r30->unk4.z = sp3C[var_r31].z; - var_r30->unk10 = spE[var_r31][0]; - var_r30->unk12 = spE[var_r31][1]; + var_r30->unk10[0] = spE[var_r31][0]; + var_r30->unk10[1] = spE[var_r31][1]; for (var_r28 = 0; var_r28 < 4; var_r28++) { var_r30->unk14[var_r28] = sp24[var_r31][var_r28]; } } } -void fn_1_3A88(void) { - M427DllMapStruct* sp8; +void fn_1_3A88(void) +{ + M427DllMapStruct *sp8; s16 var_r30; - M427DllMapSubstruct3* var_r31; + M427DllMapSubstruct3 *var_r31; sp8 = lbl_1_bss_F0; - HuSprAnimKill(lbl_1_bss_158.unk334); - HuSprAnimKill(lbl_1_bss_158.unk338); - + HuSprAnimKill(lbl_1_bss_158.unk334.unk_00); + HuSprAnimKill(lbl_1_bss_158.unk334.unk_04); + for (var_r30 = 0, var_r31 = &lbl_1_bss_158.unk4[0]; var_r30 < 2; var_r30++, var_r31++) { - if (var_r31->unk98) { - HuMemDirectFree(var_r31->unk98); + if (var_r31->unk94.unk4) { + HuMemDirectFree(var_r31->unk94.unk4); } } } -void fn_1_3B20(s8 arg0, s16 arg1) { - M427DllMapStruct2* var_r31 = &lbl_1_bss_F8[0]; - M427DllMapSubstruct3* temp_r30 = &lbl_1_bss_158.unk4[arg1]; - Vec sp54[4] = { - { 110.0f, -20.0f, 0.0f }, - { -110.0f, -20.0f, 0.0f }, - { 110.0f, -20.0f, 190.0f }, - { -110.0f, -20.0f, 190.0f } - }; +void fn_1_3B20(s8 arg0, s16 arg1) +{ + M427DllMapStruct2 *var_r31 = &lbl_1_bss_F8[0]; + M427DllMapSubstruct3 *temp_r30 = &lbl_1_bss_158.unk4[arg1]; + Vec sp54[4] = { { 110.0f, -20.0f, 0.0f }, { -110.0f, -20.0f, 0.0f }, { 110.0f, -20.0f, 190.0f }, { -110.0f, -20.0f, 190.0f } }; Mtx sp24; f32 sp14[4] = { 135.0f, 225.0f, 45.0f, 315.0f }; Point3d sp8; @@ -324,20 +498,22 @@ void fn_1_3B20(s8 arg0, s16 arg1) { s32 var_r27; for (var_r29 = 0; var_r29 < 0x10; var_r29++, var_r31++) { - if (var_r31->unk0 == -1) break; + if (var_r31->unk0 == -1) + break; } if (var_r29 != 0x10) { var_r31->unk0 = arg0; temp_f31 = temp_r30->unk90; - PSMTXRotRad(sp24, 0x59, MTXDegToRad(temp_f31)); - PSMTXMultVec(sp24, &sp54[arg0], &sp8); + MTXRotRad(sp24, 0x59, MTXDegToRad(temp_f31)); + MTXMultVec(sp24, &sp54[arg0], &sp8); sp8.x += temp_r30->unk84.x; sp8.y += temp_r30->unk84.y; sp8.z += temp_r30->unk84.z; Hu3DModelAttrReset(var_r31->unk2, 1); if (arg1 == 0) { var_r27 = 1; - } else { + } + else { var_r27 = 2; } Hu3DModelCameraSet(var_r31->unk2, var_r27); @@ -346,15 +522,17 @@ void fn_1_3B20(s8 arg0, s16 arg1) { Hu3DMotionTimeSet(var_r31->unk2, 0.0f); if (arg0 < 2) { Hu3DModelAmbSet(var_r31->unk2, 1.0f, 1.0f, 1.0f); - } else { + } + else { Hu3DModelAmbSet(var_r31->unk2, 0.5f, 0.5f, 0.5f); } Hu3DAnimBankSet(var_r31->unk4, 0); } } -void fn_1_3DBC(void) { - M427DllMapStruct2* var_r31; +void fn_1_3DBC(void) +{ + M427DllMapStruct2 *var_r31; s16 var_r30; f32 temp_f31; @@ -370,13 +548,14 @@ void fn_1_3DBC(void) { } } -void fn_1_3E58(omObjData* arg0) { +void fn_1_3E58(omObjData *arg0) +{ s32 sp8[8]; - M427DllMapStruct* var_r26; - M427DllMapSubstruct3* var_r31; - ModelData* temp_r25; + M427DllMapStruct *var_r26; + M427DllMapSubstruct3 *var_r31; + ModelData *temp_r25; s16 var_r30; - M427DllMapStruct4* var_r29; + M427DllMapStruct4 *var_r29; s16 var_r28; s16 var_r27; @@ -388,22 +567,22 @@ void fn_1_3E58(omObjData* arg0) { temp_r25 = &Hu3DData[sp8[var_r30]]; temp_r25->unk_38[4] = temp_r25->unk_38[5] = temp_r25->unk_38[6] = temp_r25->unk_38[7] = -1; } - + for (var_r30 = 0; var_r30 < 2; var_r30++) { for (var_r27 = 0; var_r27 < 2; var_r27++) { - Hu3DModelKill(var_r31->unk180[var_r30][var_r27].unk0); + Hu3DModelKill(var_r31->unk17E[var_r30][var_r27].unk2); } } for (var_r30 = 0; var_r30 < 2; var_r30++) { for (var_r27 = 0; var_r27 < 2; var_r27++) { - Hu3DModelKill(var_r31->unkBA[var_r30][var_r27].unk0); + Hu3DModelKill(var_r31->unkB8[var_r30][var_r27].unk2); } } - HuSprAnimKill(var_r31->unkAC->unk28); + HuSprAnimKill(var_r31->unkAC->unk_28); Hu3DModelKill(var_r31->unk1A); Hu3DModelKill(var_r31->unk1C); - HuMemDirectFree(var_r31->unk98); - var_r31->unk98 = NULL; + HuMemDirectFree(var_r31->unk94.unk4); + var_r31->unk94.unk4 = NULL; fn_1_DB80(lbl_1_bss_EC[var_r28]); fn_1_DB80(lbl_1_bss_E8[var_r28]); @@ -442,13 +621,14 @@ void fn_1_3E58(omObjData* arg0) { arg0->func = fn_1_4218; } -void fn_1_4218(omObjData* arg0) { +void fn_1_4218(omObjData *arg0) +{ f32 var_f31; f32 temp_f30; f32 var_f29; - M427DllMapStruct5* var_r31; + M427DllMapStruct5 *var_r31; s16 var_r30; - M427DllMapStruct4* var_r29; + M427DllMapStruct4 *var_r29; s32 temp_r28; var_r29 = &lbl_1_bss_98; @@ -462,7 +642,7 @@ void fn_1_4218(omObjData* arg0) { fn_1_44F4(var_f31, 0.0f, temp_f30, var_f29, 0.0f); } } - + for (var_r30 = 0; var_r30 < 0x10; var_r30++, var_r31++) { if (-1.0f != var_r31->unk10) { var_r31->unkC += 20.0f; @@ -474,14 +654,16 @@ void fn_1_4218(omObjData* arg0) { } } -void fn_1_44F4(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4) { - M427DllMapStruct5* var_r31; +void fn_1_44F4(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4) +{ + M427DllMapStruct5 *var_r31; s16 var_r30; var_r31 = &lbl_1_bss_E4[0]; - + for (var_r30 = 0; var_r30 < 0x10; var_r30++, var_r31++) { - if (-1.0f == var_r31->unk10) break; + if (-1.0f == var_r31->unk10) + break; } if (var_r30 != 0x10) { var_r31->unk0 = arg0; @@ -494,18 +676,19 @@ void fn_1_44F4(f32 arg0, f32 arg1, f32 arg2, f32 arg3, f32 arg4) { f32 lbl_1_data_F4 = 450.0f; -f32 fn_1_4570(Vec* arg0) { +f32 fn_1_4570(Vec *arg0) +{ f32 temp_f31; f32 temp_f30; f32 var_f28; f32 var_f27; f32 var_f23; - M427DllMapStruct5* var_r31; + M427DllMapStruct5 *var_r31; s16 var_r30; var_r31 = &lbl_1_bss_E4[0]; var_f27 = 0.0f; - + for (var_r30 = 0; var_r30 < 0x10; var_r30++, var_r31++) { if (-1.0f != var_r31->unk10) { temp_f31 = arg0->x - var_r31->unk0; @@ -527,7 +710,8 @@ f32 fn_1_4570(Vec* arg0) { return var_f27; } -void fn_1_48EC(ModelData* arg0, Mtx arg1) { +void fn_1_48EC(ModelData *arg0, Mtx arg1) +{ Vec sp3C; Vec sp30; Vec sp24; @@ -548,7 +732,7 @@ void fn_1_48EC(ModelData* arg0, Mtx arg1) { CenterM->x = -CenterM->x; CenterM->y = -CenterM->y; CenterM->z = CenterM->z; - CRotM->x = 180.0f + CRotM->x; + CRotM->x = 180.0f + CRotM->x; CRotM->y = 180.0f + -CRotM->y; CRotM->z = CRotM->z; *CZoomM = *CZoomM; @@ -574,7 +758,8 @@ void fn_1_48EC(ModelData* arg0, Mtx arg1) { *CZoomM = temp_f29; } -void fn_1_4D7C(ModelData* arg0, Mtx arg1) { +void fn_1_4D7C(ModelData *arg0, Mtx arg1) +{ Vec sp24; Vec sp18; Vec spC; @@ -602,7 +787,8 @@ void fn_1_4D7C(ModelData* arg0, Mtx arg1) { } } -void fn_1_50A0(ModelData* arg0, Mtx arg1) { +void fn_1_50A0(ModelData *arg0, Mtx arg1) +{ if (lbl_1_bss_98.unk28) { GXSetTexCopySrc(0, 0, 0x280, 0x1E0); GXSetTexCopyDst(0x280, 0x1E0, GX_TF_RGB5A3, 0); @@ -610,20 +796,21 @@ void fn_1_50A0(ModelData* arg0, Mtx arg1) { } } -void fn_1_510C(s32 arg0, s16 arg1, s16 arg2) { +void fn_1_510C(s32 arg0, s16 arg1, s16 arg2) +{ s16 sp12; s16 sp10; s16 spE; s16 spC; s16 spA; s16 sp8; - M427DllMapStruct4* var_r31; - M427DllMapSubstruct5* var_r30; + M427DllMapStruct4 *var_r31; + M427DllMapSubstruct5 *var_r30; s16 var_r29; - ModelData* temp_r28; + ModelData *temp_r28; s16 var_r27; - M427DllMapSubstruct5* var_r26; - M427DllMapSubstruct5* var_r23; + M427DllMapSubstruct5 *var_r26; + M427DllMapSubstruct5 *var_r23; var_r31 = &lbl_1_bss_98; var_r29 = Hu3DHookFuncCreate(fn_1_618C); @@ -657,7 +844,7 @@ void fn_1_510C(s32 arg0, s16 arg1, s16 arg2) { DCFlushRange(var_r26, 0x20000); GXBeginDisplayList(var_r23, 0x20000); GXBegin(GX_QUADS, GX_VTXFMT0, (arg1 * arg2 * 4)); - + for (var_r29 = 0; var_r29 < arg2; var_r29++) { for (var_r27 = 0; var_r27 < arg1; var_r30++, var_r27++) { var_r30->unk0 = var_r27 + var_r29 * var_r31->unk16; @@ -689,7 +876,8 @@ void fn_1_510C(s32 arg0, s16 arg1, s16 arg2) { f32 lbl_1_data_F8 = -1.0f; -void fn_1_558C(M427DllMapStruct4* arg0) { +void fn_1_558C(M427DllMapStruct4 *arg0) +{ Mtx spAC; Mtx sp7C; Mtx sp4C; @@ -703,14 +891,14 @@ void fn_1_558C(M427DllMapStruct4* arg0) { f32 var_f26; f32 var_f25; f32 var_f20; - M427DllMapSubstruct5* var_r30; - Vec* var_r29; - Vec* var_r28; + M427DllMapSubstruct5 *var_r30; + Vec *var_r29; + Vec *var_r28; s16 var_r27; - M427DllMapStruct5* var_r26; - Vec2f* var_r25; + M427DllMapStruct5 *var_r26; + Vec2f *var_r25; s16 var_r24; - CameraData* var_r23; + CameraData *var_r23; s16 var_r22; var_r23 = &Hu3DCamera[0]; @@ -737,12 +925,12 @@ void fn_1_558C(M427DllMapStruct4* arg0) { sp2C.x = sp44.x; sp2C.y = (sp44.y - sp44.x) / (arg0->unk18 - 1); var_f25 = arg0->unk44; - + for (var_r27 = 0; var_r27 < arg0->unk18; var_r27++) { sp34.x = sp3C.x; sp34.y = (sp3C.y - sp3C.x) / (arg0->unk16 - 1); var_f26 = arg0->unk40; - + for (var_r24 = 0; var_r24 < arg0->unk16; var_r28++, var_r29++, var_r24++) { var_r28->x = sp34.x; var_r28->z = sp2C.x; @@ -763,7 +951,7 @@ void fn_1_558C(M427DllMapStruct4* arg0) { } var_r30 = arg0->unk1C; var_r24 = (arg0->unk16 - 1) * (arg0->unk18 - 1); - + for (var_r27 = 0; var_r27 < var_r24; var_r27++, var_r30++) { fn_1_C2C8(&arg0->unk4[var_r30->unk0], &arg0->unk4[var_r30->unk2], &arg0->unk4[var_r30->unk4], &var_r30->unk8); arg0->unkC[var_r30->unk0].x += var_r30->unk8.x; @@ -779,7 +967,7 @@ void fn_1_558C(M427DllMapStruct4* arg0) { arg0->unkC[var_r30->unk6].y += var_r30->unk8.y; arg0->unkC[var_r30->unk6].z += var_r30->unk8.z; } - + var_r29 = arg0->unkC; for (var_r27 = 0; var_r27 < arg0->unk14; var_r27++, var_r29++) { var_f20 = sqrtf((var_r29->x * var_r29->x) + (var_r29->y * var_r29->y) + (var_r29->z * var_r29->z)); @@ -792,7 +980,7 @@ void fn_1_558C(M427DllMapStruct4* arg0) { C_MTXLookAt(spAC, &var_r23->pos, &var_r23->up, &var_r23->target); GXGetProjectionv(&sp7C[0][0]); GXGetViewportv(&sp4C[0][0]); - + for (var_r27 = 0; var_r27 < arg0->unk14; var_r27++, var_r28++, var_r25++) { GXProject(var_r28->x, var_r28->y, var_r28->z, spAC, &sp7C[0][0], &sp4C[0][0], &sp28, &sp24, &sp20); var_r25->x = 0.0015625f * sp28; @@ -811,14 +999,15 @@ void fn_1_558C(M427DllMapStruct4* arg0) { PPCSync(); } -void fn_1_618C(ModelData* arg0, Mtx arg1) { +void fn_1_618C(ModelData *arg0, Mtx arg1) +{ Mtx sp64; Mtx sp34; GXTexObj sp14; GXColor spC; - M427DllMapStruct4* var_r31 = &lbl_1_bss_98; - AnimData** var_r30 = &lbl_1_bss_158.unk334; - + M427DllMapStruct4 *var_r31 = &lbl_1_bss_98; + M427DllMapStruct3Sub *var_r30 = &lbl_1_bss_158.unk334; + fn_1_558C(var_r31); GXLoadPosMtxImm(arg1, 0); GXClearVtxDesc(); @@ -837,7 +1026,7 @@ void fn_1_618C(ModelData* arg0, Mtx arg1) { GXInitTexObj(&sp14, var_r31->unk28, 0x280, 0x1E0, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, 0); GXInitTexObjLOD(&sp14, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); GXLoadTexObj(&sp14, GX_TEXMAP1); - HuSprTexLoad(*var_r30, 0, 2, GX_REPEAT, GX_REPEAT, GX_LINEAR); + HuSprTexLoad(var_r30->unk_00, 0, 2, GX_REPEAT, GX_REPEAT, GX_LINEAR); GXSetNumTevStages(3); spC.r = 0; spC.g = 0x10; @@ -846,40 +1035,40 @@ void fn_1_618C(ModelData* arg0, Mtx arg1) { GXSetTevColor(GX_TEVREG2, spC); GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_ONE, GX_CC_ZERO); - GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVREG0); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0); GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); - GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVREG0); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0); GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP1, GX_COLOR0A0); GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_TEXC, GX_CC_C0, GX_CC_A2, GX_CC_ZERO); - GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVREG1); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG1); GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); - GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVREG1); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG1); GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD0, GX_TEXMAP1, GX_COLOR0A0); GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_C1, GX_CC_ZERO, GX_CC_ZERO, GX_CC_C2); - GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); - GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, 1, GX_TEVPREV); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); GXSetNumIndStages(1); GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD1, GX_TEXMAP2); GXSetTevIndWarp(GX_TEVSTAGE0, GX_INDTEXSTAGE0, 1, 0, GX_ITM_0); GXSetIndTexCoordScale(GX_INDTEXSTAGE0, GX_ITS_1, GX_ITS_1); - PSMTXScale(sp64, -0.1f, 0.0f, 1.0f); + MTXScale(sp64, -0.1f, 0.0f, 1.0f); GXSetIndTexMtx(GX_ITM_0, (f32(*)[3])(sp64), 0); GXSetNumTexGens(2); if (omPauseChk() == 0) { var_r31->unk38 += 0.001f; var_r31->unk3C += 0.0005f; } - PSMTXRotRad(sp64, 0x58, 1.5707964f); - PSMTXScale(sp34, 0.001f, 0.001f, 0.001f); - PSMTXConcat(sp64, sp34, sp64); + MTXRotRad(sp64, 0x58, 1.5707964f); + MTXScale(sp34, 0.001f, 0.001f, 0.001f); + MTXConcat(sp64, sp34, sp64); mtxTransCat(sp64, var_r31->unk38, var_r31->unk3C, 0.0f); GXLoadTexMtxImm(sp64, 0x1E, GX_MTX2x4); - GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, 0, 0x7D); - GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_POS, 0x1E, 0, 0x7D); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, GX_FALSE, 0x7D); + GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_POS, 0x1E, GX_FALSE, 0x7D); GXSetNumChans(1); GXSetChanCtrl(GX_COLOR0A0, 0, GX_SRC_REG, GX_SRC_VTX, 0, GX_DF_CLAMP, GX_AF_NONE); - GXSetZMode(1, GX_LEQUAL, 1); + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); GXSetZCompLoc(0); GXSetBlendMode(GX_BM_NONE, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); @@ -888,3 +1077,2081 @@ void fn_1_618C(ModelData* arg0, Mtx arg1) { GXSetTevDirect(GX_TEVSTAGE0); GXSetTevDirect(GX_TEVSTAGE1); } + +s32 lbl_1_data_FC[0xC] = { + 0x3A0000, + 0x3A0001, + 0x3A0002, + 0x3A0003, + 0x3A0004, + 0x3A0005, + 0x3A0006, + 0x3A0007, + 0x3A0008, + 0x3A0009, + 0x3A000A, + 0x3A000B, +}; +s32 lbl_1_data_12C[2] = { 0x3A000C, 0x3A000D }; +s32 lbl_1_data_134[4] = { 0x3A000E, 0x3A000F, 0x3F800000, 0x01000000 }; + +void fn_1_6760(omObjData *object) +{ + s16 sp14[2][0x20]; + s16 sp10[2]; + s16 spC[2]; + s16 sp8[2]; + M427DllMapSubstruct3 *var_r31; + s16 var_r30; + M427DllMapUNKB8 *var_r29; + s16 var_r28; + M427DllMapUNK17E *var_r27; + s16 var_r26; + M427DllMapSubstruct3Sub *var_r25; + M427DllMapStruct3 *var_r24; + u16 var_r23; + + var_r24 = &lbl_1_bss_158; + Hu3DFogSet(3500.0f, 20000.0f, 0, 0, 0); + for (var_r28 = 0, var_r31 = &var_r24->unk4[0]; var_r28 < 2; var_r28++, var_r31++) { + var_r31->unk0 = var_r28; + sp10[var_r28] = 0; + for (var_r30 = 0; var_r30 < 3; var_r30++) { + var_r31->unk178[var_r30] = 0; + } + for (var_r30 = 0; var_r30 < 0xB; var_r30++) { + var_r31->unk2[var_r30] = Hu3DModelCreateFile(lbl_1_data_FC[var_r30]); + var_r31->unk44[var_r30] = -1; + if (var_r30 < 0xA) { + Hu3DModelLayerSet(var_r31->unk2[var_r30], 2); + } + else { + Hu3DModelLayerSet(var_r31->unk2[var_r30], 5); + } + Hu3DModelAmbSet(var_r31->unk2[var_r30], 0.1f, 0.1f, 0.1f); + if (var_r28 == 0) { + Hu3DModelCameraSet(var_r31->unk2[var_r30], 1); + } + else { + Hu3DModelCameraSet(var_r31->unk2[var_r30], 2); + } + sp14[var_r28][sp10[var_r28]++] = var_r31->unk2[var_r30]; + } + var_r30 = Hu3DHookFuncCreate(fn_1_C154); + var_r31->unk1E = var_r30; + Hu3DModelLayerSet(var_r30, 4); + if (var_r28 == 0) { + Hu3DModelCameraSet(var_r30, 1); + } + else { + Hu3DModelCameraSet(var_r30, 2); + } + var_r30 = Hu3DHookFuncCreate(fn_1_C200); + var_r31->unk20 = var_r30; + Hu3DModelLayerSet(var_r30, 6); + if (var_r28 == 0) { + Hu3DModelCameraSet(var_r30, 1); + } + else { + Hu3DModelCameraSet(var_r30, 2); + } + for (var_r30 = 0; var_r30 < 2; var_r30++) { + var_r29 = var_r31->unkB8[var_r30]; + for (var_r26 = 0; var_r26 < 2; var_r26++, var_r29++) { + if ((var_r28 == 0) && (var_r26 == 0)) { + var_r29->unk2 = spC[var_r30] = Hu3DModelCreateFile(lbl_1_data_134[var_r30]); + } + else { + var_r29->unk2 = Hu3DModelLink(spC[var_r30]); + } + Hu3DModelAttrSet(var_r29->unk2, HU3D_ATTR_DISPOFF); + Hu3DModelLayerSet(var_r29->unk2, 2); + Hu3DModelAmbSet(var_r29->unk2, 0.0f, 0.0f, 0.0f); + if (var_r28 == 0) { + Hu3DModelCameraSet(var_r29->unk2, 1); + } + else { + Hu3DModelCameraSet(var_r29->unk2, 2); + } + sp14[var_r28][sp10[var_r28]++] = var_r29->unk2; + var_r29->unk6 = fn_1_95E8(0x3A0018, var_r28, 0, 0.0f, -400.0f, 700.0f, 800.0f, -5.0f); + fn_1_9958(var_r29->unk6, 1); + fn_1_99E4(var_r29->unk6, 0xFF, 0xFF, 0xFF, 0); + var_r29->unk4 = 2 * var_r30 + 4 + var_r26; + fn_1_C528(var_r29->unk2, var_r29->unk4, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0xFF, 0xA0, 0x60); + Hu3DLLightStaticSet(var_r29->unk2, var_r29->unk4, 1); + Hu3DLLightPointSet(var_r29->unk2, var_r29->unk4, 1.0f, 0.6f, 3); + } + } + for (var_r30 = 0; var_r30 < 2; var_r30++) { + var_r27 = var_r31->unk17E[var_r30]; + for (var_r26 = 0; var_r26 < 2; var_r26++, var_r27++) { + if ((var_r28 == 0) && (var_r26 == 0)) { + var_r27->unk2 = sp8[var_r30] = Hu3DModelCreateFile(lbl_1_data_12C[var_r30]); + } + else { + var_r27->unk2 = Hu3DModelLink(sp8[var_r30]); + } + Hu3DModelAttrSet(var_r27->unk2, HU3D_ATTR_DISPOFF); + Hu3DModelLayerSet(var_r27->unk2, 2); + Hu3DModelAmbSet(var_r27->unk2, 0.0f, 0.0f, 0.0f); + if (var_r28 == 0) { + Hu3DModelCameraSet(var_r27->unk2, 1); + } + else { + Hu3DModelCameraSet(var_r27->unk2, 2); + } + sp14[var_r28][sp10[var_r28]++] = var_r27->unk2; + } + } + for (var_r30 = 0; var_r30 < 4; var_r30++) { + var_r31->unk34[var_r30] = fn_1_C41C(0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0xFF, 0xFF, 0xFF); + var_r31->unk24[var_r30] = -1.0f; + } + } + for (var_r28 = 0, var_r31 = var_r24->unk4; var_r28 < 2; var_r28++, var_r31++) { + var_r31->unk5C = Hu3DLLightCreate(var_r31->unk2[0], 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0xFA, 0xF0, 0xD2); + Hu3DLLightSpotSet(var_r31->unk2[0], var_r31->unk5C, 37.5f, 4); + Hu3DLLightStaticSet(var_r31->unk2[0], var_r31->unk5C, 1); + var_r31->unk78.x = 0.0f; + var_r31->unk78.y = 0.0f; + var_r31->unk78.z = 0.0f; + var_r31->unk84.x = 0.0f; + var_r31->unk84.y = 0.0f; + var_r31->unk84.z = 0.0f; + var_r31->unk90 = 0.0f; + } + fn_1_93EC(0x3A0016, 0x3A0014, 2000.0f, 6000.0f, 4.0f, 9.0f); + for (var_r28 = 0, var_r31 = var_r24->unk4; var_r28 < 2; var_r28++, var_r31++) { + var_r31->unkB0[0] = fn_1_95E8(0x3A0015, var_r28, 0.0f, 0.0f, -900.0f, 500.0f, 700.0f, -10.0f); + var_r25 = &var_r31->unk94; + var_r25->unk0 = var_r28; + var_r25->unk8 = GXGetTexBufferSize(0x140, 0x1E0, 5, 0, 0); + var_r25->unk4 = HuMemDirectMalloc(HEAP_DATA, var_r25->unk8); + var_r30 = Hu3DHookFuncCreate(fn_1_A148); + var_r31->unk1C = var_r30; + Hu3DModelCameraSet(var_r30, var_r28 ? 2 : 1); + Hu3DModelLayerSet(var_r30, 1); + Hu3DData[var_r30].unk_120 = var_r25; + var_r31->unk1A = fn_1_A1F4(0x3A0013, 0xA, 0x1E, var_r28, 6000.0f, lbl_1_bss_554, lbl_1_bss_558); + fn_1_C528(var_r31->unk1A, 1, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0xC8, 0xF0, 0xA0); + Hu3DLLightStaticSet(var_r31->unk1A, 1, 1); + Hu3DLLightPointSet(var_r31->unk1A, 1, 125.0f, 0.5f, 3); + fn_1_C528(var_r31->unk1A, 2, 0.0f, -500.0f, -23500.0f, 0.0f, 0.0f, 0.0f, 0xFA, 0xF0, 0xD2); + Hu3DLLightStaticSet(var_r31->unk1A, 2, 1); + Hu3DLLightPointSet(var_r31->unk1A, 2, 800.0f, 0.5f, 3); + sp14[var_r28][sp10[var_r28]++] = var_r31->unk1A; + fn_1_9318(sp14[var_r28], sp10[var_r28]); + } + object->func = fn_1_72E4; +} + +void fn_1_72E4(omObjData *object) +{ + float var_f31; + M427DllMapStruct2 *var_r31; + s16 var_r30; + + if (fn_1_1788() == 7) { + object->func = fn_1_3E58; + } + fn_1_73BC(); + fn_1_7C34(); + fn_1_7F38(); + fn_1_8F90(object); + fn_1_9240(); + for (var_r31 = lbl_1_bss_F8, var_r30 = 0; var_r30 < 0x10; var_r30++, var_r31++) { + if (var_r31->unk0 != -1) { + var_f31 = Hu3DMotionMaxTimeGet(var_r31->unk2); + if (Hu3DMotionTimeGet(var_r31->unk2) >= var_f31) { + var_r31->unk0 = -1; + Hu3DModelAttrSet(var_r31->unk2, HU3D_ATTR_DISPOFF); + } + } + } +} + +void fn_1_73BC(void) +{ + float var_f31; + M427DllMapSubstruct3 *var_r31; + M427DllMapSubstruct6 *var_r30; + s16 var_r29; + ModelData *var_r28; + s16 var_r27; + + for (var_r27 = 0, var_r31 = lbl_1_bss_158.unk4; var_r27 < 2; var_r27++, var_r31++) { + for (var_r29 = 0; var_r29 < 0xA; var_r29++) { + var_r28 = &Hu3DData[var_r31->unk2[var_r29]]; + var_r30 = fn_1_DC0C(lbl_1_bss_E8[var_r31->unk0], var_r31->unk3C[var_r31->unk44[var_r29]]); + var_f31 = -2000.0f * var_r29; + if (((var_r31->unk84.z - 25000.0f) < var_f31) && ((3000.0f + var_r31->unk84.z) > var_f31)) { + if (var_r31->unk44[var_r29] == -1) { + fn_1_794C(var_r31, var_r29); + var_r28->attr &= 0xFFFFFFFE; + } + else { + if (var_r30) { + var_r30->unk_24 += 5.0f; + if (var_r30->unk_24 >= 360.0f) { + var_r30->unk_24 -= 360.0f; + } + var_r30->unk_48.x = var_r30->unk_48.y = var_r30->unk_48.z = 1.0 + (0.05000000074505806 * sind(var_r30->unk_24)); + } + var_r31->unk24[var_r31->unk44[var_r29]] += 5.0f; + if (var_r31->unk24[var_r31->unk44[var_r29]] >= 360.0f) { + var_r31->unk24[var_r31->unk44[var_r29]] -= 360.0f; + } + var_f31 = 50.0 * sind(var_r31->unk24[var_r31->unk44[var_r29]]); + var_f31 = var_f31; + Hu3DLLightPointSet(var_r31->unk2[var_r29], 1, 400.0f + var_f31, 0.5f, 3); + if (var_r29 == 0) { + var_r30 = fn_1_DC0C(lbl_1_bss_E8[var_r31->unk0], var_r31->unk5A); + if (var_r30->unk_24 >= 360.0f) { + var_r30->unk_24 -= 360.0f; + } + var_r30->unk_48.x = var_r30->unk_48.y = var_r30->unk_48.z = 1.0 + (0.05000000074505806 * sind(var_r30->unk_24)); + var_r31->unk24[1] += 5.0f; + if (var_r31->unk24[1] >= 360.0f) { + var_r31->unk24[1] -= 360.0f; + } + var_f31 = 50.0 * sind(var_r31->unk24[1]); + var_f31 = var_f31; + Hu3DLLightPointSet(var_r31->unk2[var_r29], 2, 400.0f + var_f31, 0.5f, 3); + } + } + } + else { + if (var_r31->unk44[var_r29] != -1) { + if (var_r30) { + var_r30->unk_62 = 0; + } + var_r28->unk_38[1] = -1; + var_r31->unk24[var_r31->unk44[var_r29]] = -1.0f; + var_r31->unk44[var_r29] = -1; + if (var_r29 == 0) { + var_r30 = fn_1_DC0C(lbl_1_bss_E8[var_r31->unk0], var_r31->unk5A); + var_r30->unk_62 = 0; + var_r28->unk_38[2] = -1; + var_r31->unk24[1] = -1.0f; + } + } + var_r28->attr |= 1; + } + } + } +} + +Vec lbl_1_data_144[0xC] = { + { -670.0f, 400.0f, 1750.0f }, + { 930.0f, 400.0f, -1000.0f }, + { -930.0f, 400.0f, -3000.0f }, + { 230.0f, 400.0f, -5000.0f }, + { -1630.0f, 300.0f, -7000.0f }, + { 530.0f, 100.0f, -9000.0f }, + { -530.0f, 100.0f, -11000.0f }, + { 1630.0f, 100.0f, -13000.0f }, + { -230.0f, 0.0f, -15000.0f }, + { 930.0f, -200.0f, -17000.0f }, + { -930.0f, -200.0f, -19000.0f }, + { 930.0f, -200.0f, -21000.0f }, +}; + +void fn_1_794C(M427DllMapSubstruct3 *arg0, s16 arg1) +{ + Vec sp14; + s16 var_r30; + ModelData *var_r28; + + var_r28 = &Hu3DData[arg0->unk2[arg1]]; + { + Vec sp8 = { 0.0f, 0.0f, 0.0f }; + if (arg1 != 0xA) { + for (var_r30 = 0; var_r30 < 4; var_r30++) { + if (arg0->unk24[var_r30] == -1.0f) { + break; + } + } + if (var_r30 != 4) { + var_r28->unk_38[1] = arg0->unk34[var_r30]; + arg0->unk24[var_r30] = 0.0f; + arg0->unk44[arg1] = var_r30; + if (var_r28->unk_38[1] != -1) { + sp14.x = lbl_1_data_144[arg1 + 1].x; + sp14.y = lbl_1_data_144[arg1 + 1].y; + sp14.z = lbl_1_data_144[arg1 + 1].z; + Hu3DLLightPointSet(arg0->unk2[arg1], 1, 400.0f, 0.5f, 3); + Hu3DLLightPosSetV(arg0->unk2[arg1], 1, &sp14, &sp8); + } + arg0->unk3C[var_r30] = fn_1_D430(sp14.x, sp14.y, sp14.z, lbl_1_bss_E8[arg0->unk0]); + if (arg1 == 0) { + var_r30 = 1; + var_r28->unk_38[2] = arg0->unk34[var_r30]; + arg0->unk24[var_r30] = 0.0f; + sp14.x = lbl_1_data_144[0].x; + sp14.y = lbl_1_data_144[0].y; + sp14.z = lbl_1_data_144[0].z; + Hu3DLLightPointSet(arg0->unk2[0], 2, 400.0f, 0.5f, 3); + Hu3DLLightPosSetV(arg0->unk2[0], 2, &sp14, &sp8); + arg0->unk5A = fn_1_D430(sp14.x, sp14.y, sp14.z, lbl_1_bss_E8[arg0->unk0]); + } + } + } + } +} + +float lbl_1_data_1D4[2] = { 50.0f, 80.0f }; + +void fn_1_7C34(void) +{ + Vec sp14; + M427DllMapSubstruct3 *var_r31; + ModelData *var_r30; + s16 var_r29; + s16 var_r28; + M427DllMapUNK17E *var_r27; + M427DllMapSubstruct *var_r26; + s16 var_r25; + + for (var_r26 = lbl_1_bss_158.unk3A0, var_r29 = 0; var_r29 < 5; var_r29++, var_r26++) { + for (var_r28 = 0, var_r31 = lbl_1_bss_158.unk4; var_r28 < 2; var_r28++, var_r31++) { + if ((var_r31->unk18E[var_r29] == 0) && ((var_r31->unk84.z - 7000.0f) < var_r26->unk4.z) + && ((1000.0f + var_r31->unk84.z) > var_r26->unk4.z)) { + fn_1_7E60(var_r29, var_r31); + } + } + } + for (var_r29 = 0, var_r31 = lbl_1_bss_158.unk4; var_r29 < 2; var_r29++, var_r31++) { + for (var_r28 = 0; var_r28 < 2; var_r28++) { + var_r27 = var_r31->unk17E[var_r28]; + for (var_r25 = 0; var_r25 < 2; var_r25++, var_r27++) { + var_r30 = &Hu3DData[var_r27->unk2]; + if ((var_r30->attr & 1) == 0) { + if (((var_r31->unk84.z - 7000.0f) > var_r30->pos.z) || ((1000.0f + var_r31->unk84.z) < var_r30->pos.z)) { + var_r30->attr |= 1; + var_r31->unk18E[var_r27->unk0] = 0; + } + else { + sp14.x = var_r30->pos.x; + sp14.z = var_r30->pos.z; + fn_1_15FD0(sp14, lbl_1_data_1D4[var_r28], 0, 1, var_r31->unk0); + } + } + } + } + } +} + +void fn_1_7E60(s16 arg0, M427DllMapSubstruct3 *arg1) +{ + M427DllMapUNK17E *var_r31; + M427DllMapSubstruct *var_r30; + s16 var_r29; + ModelData *var_r28; + + var_r30 = &lbl_1_bss_158.unk3A0[arg0]; + var_r31 = arg1->unk17E[var_r30->unk0]; + for (var_r29 = 0; var_r29 < 2; var_r29++, var_r31++) { + var_r28 = &Hu3DData[var_r31->unk2]; + if ((var_r28->attr & 1) != 0) { + Hu3DModelAttrReset(var_r31->unk2, HU3D_ATTR_DISPOFF); + Hu3DModelPosSet(var_r31->unk2, var_r30->unk4.x, var_r30->unk4.y, var_r30->unk4.z); + var_r31->unk0 = arg0; + arg1->unk18E[arg0] = 1; + return; + } + } +} + +void fn_1_7F38(void) +{ + Vec sp14; + float var_f31; + M427DllMapUNKB8 *var_r31; + M427DllMapSubstruct3 *var_r30; + ModelData *var_r29; + s16 var_r28; + s16 var_r27; + M427DllMapSubstruct2 *var_r26; + s16 var_r25; + s32 var_r24; + s32 var_r23; + + for (var_r26 = lbl_1_bss_158.unk34C, var_r27 = 0; var_r27 < 3; var_r27++, var_r26++) { + for (var_r28 = 0, var_r30 = lbl_1_bss_158.unk4; var_r28 < 2; var_r28++, var_r30++) { + if ((var_r30->unk178[var_r27] == 0) && ((var_r30->unk84.z - 7000.0f) < var_r26->unk4.z) + && ((1000.0f + var_r30->unk84.z) > var_r26->unk4.z)) { + fn_1_85D4(var_r27, var_r30); + } + } + } + for (var_r27 = 0, var_r30 = lbl_1_bss_158.unk4; var_r27 < 2; var_r27++, var_r30++) { + for (var_r28 = 0; var_r28 < 2; var_r28++) { + var_r31 = var_r30->unkB8[var_r28]; + for (var_r25 = 0; var_r25 < 2; var_r25++, var_r31++) { + var_r29 = &Hu3DData[var_r31->unk2]; + if ((var_r29->attr & 1) == 0) { + if (((var_r30->unk84.z - 7000.0f) > var_r29->pos.z) || ((1000.0f + var_r30->unk84.z) < var_r29->pos.z)) { + if (var_r31->unk8 == 0) { + fn_1_8E1C(1, var_r30, var_r31); + fn_1_9958(var_r31->unk6, 1); + var_r29->attr |= 1; + var_r31->unk8 = 0x63; + var_r30->unk178[var_r31->unk0] = 0; + } + else if (var_r31->unk8 != 2) { + var_r31->unkA = 0; + var_r31->unk8 = 2; + } + } + switch (var_r31->unk8) { + case 0: + if (++var_r31->unkA > var_r31->unk18) { + var_r31->unkA = 0; + var_r31->unkC = 0.0f; + var_r31->unk20 = ((rand8() << 8) | rand8()) % 361; + var_r31->unk24 = ((rand8() << 8) | rand8()) % 361; + var_r31->unk28 = 1.0f; + var_r31->unk2C = 0.0f; + var_r31->unk8++; + } + break; + case 1: + if (++var_r31->unkA > var_r31->unk1E) { + var_r31->unkA = 0; + var_r31->unk8++; + if (fn_1_1788() <= 4) { + if (var_r27 == 0) { + var_r24 = HuAudFXPlay(0x65A); + } + else { + var_r24 = HuAudFXPlay(0x65B); + } + var_r23 = var_r27 * 4 + var_r28 * 2 + var_r25; + lbl_1_bss_0[var_r23].unk0 = var_r24; + lbl_1_bss_0[var_r23].unk4 = 0x78; + } + } + var_r31->unk_14 = 0.1f; + fn_1_8768(var_r30, var_r31, var_r28, 0.2f, var_r31->unk_14); + break; + case 2: + if (++var_r31->unkA > var_r31->unk1A) { + var_r31->unkA = 0; + var_r31->unk8++; + } + if (var_r31->unk_14 < 1.0f) { + var_r31->unk_14 += 0.05f; + } + if (var_r31->unk_14 > 1.0f) { + var_r31->unk_14 = 1.0f; + } + var_r31->unk_10 += 40.0f; + var_r31->unkC += 0.05f; + fn_1_8768(var_r30, var_r31, var_r28, 1.0f, var_r31->unk_14); + break; + case 3: + var_r31->unkA++; + var_f31 = 1.0f - ((float)var_r31->unkA / var_r31->unk1C); + if (var_r31->unkA > var_r31->unk1C) { + var_r31->unkA = 0; + var_f31 = 0.0f; + var_r31->unk8 = 0; + } + var_r31->unk_10 = 400.0 * sind((90.0f * var_f31)); + var_r31->unkC = 1.2f * var_f31; + var_r31->unk_14 = var_f31; + fn_1_8768(var_r30, var_r31, var_r28, var_f31, var_r31->unk_14); + break; + } + sp14.x = var_r29->pos.x; + sp14.z = var_r29->pos.z; + fn_1_15FD0(sp14, 50.0f, 0, 1, var_r30->unk0); + } + } + } + } +} + +void fn_1_85D4(s16 arg0, M427DllMapSubstruct3 *arg1) +{ + float var_f31; + M427DllMapUNKB8 *var_r31; + M427DllMapSubstruct2 *var_r30; + s16 var_r29; + ModelData *var_r27; + + var_r30 = &lbl_1_bss_158.unk34C[arg0]; + var_r31 = arg1->unkB8[var_r30->unk0]; + for (var_r29 = 0; var_r29 < 2; var_r29++, var_r31++) { + var_r27 = &Hu3DData[var_r31->unk2]; + if ((var_r27->attr & 1) != 0) { + Hu3DModelAttrReset(var_r31->unk2, HU3D_ATTR_DISPOFF); + Hu3DModelPosSet(var_r31->unk2, var_r30->unk4.x, var_r30->unk4.y, var_r30->unk4.z); + var_r31->unk8 = 0; + var_r31->unkA = 0; + var_r31->unk18 = var_r30->unk14[0]; + var_r31->unk1A = var_r30->unk14[1]; + var_r31->unk1C = var_r30->unk14[2]; + var_r31->unk1E = var_r30->unk14[3]; + var_r31->unk0 = arg0; + arg1->unk178[arg0] = 1; + fn_1_9A2C(var_r31->unk6, var_r30->unk4.x, var_r30->unk4.y, var_r30->unk4.z); + if (var_r30->unk0 == 0) { + var_f31 = 90.0f; + } + else { + var_f31 = 270.0f; + } + fn_1_9B14(var_r31->unk6, 0.0f, var_f31, 0.0f); + fn_1_999C(var_r31->unk6, 1); + fn_1_8E1C(0, arg1, var_r31); + return; + } + } +} + +float lbl_1_data_1DC[2] = { -1.0f, 1.0f }; +float lbl_1_data_1E4[2] = { 270.0f, 90.0f }; + +void fn_1_8768(M427DllMapSubstruct3 *var_r28, M427DllMapUNKB8 *var_r31, s16 var_r27, float var_f28, float var_f29) +{ + Vec sp50; + Vec sp44; + Vec sp38; + Vec sp2C; + Vec sp20; + float var_f31; + float var_f30; + ModelData *var_r30; + M427DllMapStruct *var_r29; + + var_r30 = &Hu3DData[var_r31->unk2]; + var_f31 = var_f28 * var_r31->unk28; + sp50.x = var_r30->pos.x + (60.0f * lbl_1_data_1DC[var_r27]); + sp50.y = 80.0f + var_r30->pos.y; + sp50.z = var_r30->pos.z; + if (var_r31->unk8 == 1) { + fn_1_C76C(0, sp50.x, sp50.y, sp50.z, 1, lbl_1_data_1E4[var_r27], var_f31, lbl_1_bss_EC[var_r28->unk0]); + return; + } + fn_1_C76C(1, sp50.x, sp50.y, sp50.z, 1, lbl_1_data_1E4[var_r27], var_f31, lbl_1_bss_EC[var_r28->unk0]); + if (var_r31->unk_10 > (400.0f * var_r31->unk28)) { + var_r31->unk_10 = 400.0f * var_r31->unk28; + } + else if (var_r31->unk_10 < 1.0f) { + var_r31->unk_10 = 1.0f; + } + var_r31->unk2C += 30.0f; + if (var_r31->unk2C >= 360.0f) { + var_r31->unk2C -= 360.0f; + } + sp50.x = var_r30->pos.x + (240.0f * lbl_1_data_1DC[var_r27]); + sp50.y = 100.0f + var_r30->pos.y; + sp50.z = var_r30->pos.z; + sp44.x = sp44.y = sp44.z = 0.0f; + var_f30 = var_r31->unk_10 + (var_f28 * (50.0 * sind(var_r31->unk2C))); + Hu3DLLightPointSet(var_r31->unk2, var_r31->unk4, var_f30, 0.5f, 3); + Hu3DLLightPosSetV(var_r31->unk2, var_r31->unk4, &sp50, &sp44); + var_r29 = &lbl_1_bss_F0[var_r31->unk6]; + var_r29->unk90 -= 0.0005f; + var_r29->unk8C += 0.005f; + var_r29->unk94 += 0.001f; + if (var_r31->unkC > 1.0f) { + var_r31->unkC = 1.0f; + } + else if (var_r31->unkC < 0.0f) { + var_r31->unkC = 0.0f; + } + fn_1_99E4(var_r31->unk6, 0xFF, 0xA0, 0x60, 255.0f * var_r31->unkC); + var_r31->unk20 += 2.0f; + var_r31->unk24 += (((rand8() << 8) | rand8()) % 5) + 4; + if (var_r31->unk20 >= 360.0f) { + var_r31->unk20 -= 360.0f; + } + if (var_r31->unk24 >= 360.0f) { + var_r31->unk24 -= 360.0f; + } + sp38.x = 1.0 + (0.009999999776482582 * sind(var_r31->unk24)); + sp38.z = var_r31->unk28 + (0.009999999776482582 * sind(var_r31->unk20)); + fn_1_9AA0(var_r31->unk6, sp38.x, 1.0f, sp38.z); + if (var_r27 == 0) { + sp2C.x = var_r30->pos.x - (700.0f * var_f31 * var_f29); + sp20.x = var_r30->pos.x - 50.0f; + } + else { + sp2C.x = 50.0f + var_r30->pos.x; + sp20.x = var_r30->pos.x + (700.0f * var_f31 * var_f29); + } + sp2C.z = var_r30->pos.z - 30.0f; + sp20.z = 30.0f + var_r30->pos.z; + fn_1_15F10(sp2C, sp20, 1, 1, var_r28->unk0); +} + +void fn_1_8E1C(u8 arg0, M427DllMapSubstruct3 *arg1, M427DllMapUNKB8 *arg2) +{ + s32 spC[8]; + s16 var_r30; + ModelData *var_r29; + M427DllMapSubstruct2 *var_r27; + s16 var_r26; + ModelData *var_r25; + s16 var_r24; + + var_r27 = &lbl_1_bss_158.unk34C[arg2->unk0]; + var_r25 = &Hu3DData[arg2->unk2]; + if (arg0 == 0) { + var_r26 = var_r25->unk_38[arg2->unk4]; + } + else { + var_r26 = -1; + } + var_r24 = fn_1_10FE8(arg1->unk0, spC); + for (var_r30 = 0; var_r30 < var_r24; var_r30++) { + var_r29 = &Hu3DData[spC[var_r30]]; + var_r29->unk_38[arg2->unk4] = var_r26; + } + var_r29 = &Hu3DData[arg1->unk1A]; + var_r29->unk_38[arg2->unk4] = var_r26; + for (var_r30 = 0; var_r30 < 2; var_r30++) { + if (var_r27->unk10[var_r30] != -1) { + var_r29 = &Hu3DData[arg1->unk2[var_r27->unk10[var_r30]]]; + var_r29->unk_38[arg2->unk4] = var_r26; + } + } +} + +void fn_1_8F90(omObjData *object) +{ + Vec sp14; + Vec sp8; + float var_f31; + float var_f30; + M427DllMapSubstruct3 *var_r31; + s16 var_r30; + M427DllMapStruct3 *var_r29; + + var_r29 = &lbl_1_bss_158; + for (var_r30 = 0, var_r31 = var_r29->unk4; var_r30 < 2; var_r30++, var_r31++) { + var_f31 = sind(var_r31->unk90); + var_f30 = cosd(var_r31->unk90); + var_r31->unk_60.x = var_r31->unk84.x - (25.0f * var_f31); + var_r31->unk_60.y = 100.0f + var_r31->unk84.y; + var_r31->unk_60.z = var_r31->unk84.z - (25.0f * var_f30); + var_r31->unk_6C.x = var_r31->unk_60.x - (50.0f * var_f31); + var_r31->unk_6C.y = var_r31->unk_60.y; + var_r31->unk_6C.z = var_r31->unk_60.z - (50.0f * var_f30); + Hu3DLLightPosSet(var_r31->unk2[0], var_r31->unk5C, var_r31->unk_60.x, var_r31->unk_60.y, var_r31->unk_60.z, 0.0f, 0.0f, 0.0f); + Hu3DLLightPosAimSetV(var_r31->unk2[0], var_r31->unk5C, &var_r31->unk_60, &var_r31->unk_6C); + fn_1_9A2C(var_r31->unkB0[0], var_r31->unk84.x, var_r31->unk84.y, var_r31->unk84.z); + fn_1_9B14(var_r31->unkB0[0], 0.0f, var_r31->unk90, 0.0f); + sp14.x = var_r31->unk84.x; + sp14.y = 100.0f + var_r31->unk84.y; + sp14.z = 50.0f + var_r31->unk84.z; + sp8.x = sp8.y = sp8.z = 0.0f; + Hu3DLLightPosSetV(var_r31->unk1A, 1, &sp14, &sp8); + } +} + +void fn_1_91E0(s16 arg0, float arg8, float arg9, float argA, float argB) +{ + M427DllMapSubstruct3 *var_r31; + + var_r31 = &lbl_1_bss_158.unk4[arg0]; + var_r31->unk84.x = arg8; + var_r31->unk84.y = arg9; + var_r31->unk84.z = argA; + var_r31->unk90 = argB; + if (var_r31->unkAC) { + var_r31->unkAC->unk_0C = 1500.0f + argA; + } +} + +void fn_1_9240(void) +{ + M427DllMapStruct *var_r31; + M427DllMapSubstruct3 *var_r30; + s16 var_r29; + s16 var_r28; + + for (var_r30 = lbl_1_bss_158.unk4, var_r28 = 0; var_r28 < 2; var_r28++, var_r30++) { + for (var_r29 = 0; var_r29 < 1; var_r29++) { + var_r31 = &lbl_1_bss_F0[var_r30->unkB0[var_r29]]; + var_r31->unk90 -= 0.0005f; + var_r31->unk8C += 0.0005f; + var_r31->unk94 += 0.0005f; + } + } +} + +void fn_1_9318(s16 *arg0, s16 arg1) +{ + s16 var_r31; + ModelData *var_r30; + ModelData *var_r29; + s16 var_r28; + + var_r30 = &Hu3DData[*arg0]; + for (var_r28 = 1; var_r28 < arg1; var_r28++) { + var_r29 = &Hu3DData[arg0[var_r28]]; + for (var_r31 = 0; var_r31 < 8; var_r31++) { + if (var_r30->unk_38[var_r31] != -1) { + var_r29->unk_38[var_r31] = var_r30->unk_38[var_r31]; + } + } + var_r29->attr |= 0x1000; + } +} + +void fn_1_93EC(s32 sp8, s32 spC, float var_f30, float var_f31, float sp10, float sp14) +{ + M427DllMapStruct3Sub *var_r31; + + var_r31 = &lbl_1_bss_158.unk334; + var_r31->unk_00 = HuSprAnimRead(HuDataReadNum(sp8, MEMORY_DEFAULT_NUM)); + var_r31->unk_04 = HuSprAnimRead(HuDataReadNum(spC, MEMORY_DEFAULT_NUM)); + var_r31->unk_08 = 0.5f * var_f30; + var_r31->unk_0C = 0.5f * var_f31; + var_r31->unk_10 = sp10 / var_f30; + var_r31->unk_14 = sp14 / var_f31; +} + +void fn_1_94BC(Vec *arg0, Vec *arg1, Vec *arg2, Vec *arg3, float arg8, Vec2f *arg4, s16 arg5) +{ + Mtx sp58; + Mtx sp28; + Vec sp1C; + Vec sp10; + M427DllMapStruct3Sub *var_r31; + s16 var_r28; + + var_r31 = &lbl_1_bss_158.unk334; + for (var_r28 = 0; var_r28 < arg5; var_r28++, arg2++, arg4++) { + MTXScale(sp58, arg3->x, arg3->y, arg3->z); + MTXRotRad(sp28, 0x59, MTXDegToRad(arg8)); + MTXConcat(sp58, sp28, sp58); + MTXMultVec(sp58, arg2, &sp1C); + sp10.x = var_r31->unk_08 + ((sp1C.x + arg1->x) - arg0->x); + sp10.z = var_r31->unk_0C + ((sp1C.z + arg1->z) - arg0->z); + arg4->x = sp10.x * var_r31->unk_10; + arg4->y = sp10.z * var_r31->unk_14; + } +} + +s16 fn_1_95E8(s32 arg0, s16 arg1, s16 arg2, float arg8, float arg9, float argA, float argB, float argC) +{ + M427DllMapStruct *var_r31; + s16 var_r30; + s16 var_r29; + void *var_r28; + void *var_r26; + + for (var_r31 = lbl_1_bss_F0, var_r29 = 0; var_r29 < 0x10; var_r29++, var_r31++) { + if (var_r31->unk2 == -1) { + break; + } + } + if (var_r29 == 0x10) { + return -1; + } + var_r31->unk4 = Hu3DHookFuncCreate(fn_1_9B88); + Hu3DModelCameraSet(var_r31->unk4, arg1 ? 2 : 1); + Hu3DModelLayerSet(var_r31->unk4, arg2); + Hu3DData[var_r31->unk4].unk_120 = var_r31; + Hu3DModelPosSet(var_r31->unk4, 0.0f, 0.0f, -2000.0f); + var_r31->unk0 = 0; + var_r31->unk2 = arg1; + var_r31->unk7C.r = var_r31->unk7C.g = var_r31->unk7C.b = var_r31->unk7C.a = 0xFF; + var_r31->unk88 = var_r31->unk8C = 0.0f; + var_r31->unk90 = var_r31->unk94 = 0.0f; + var_r31->unk8 = HuSprAnimRead(HuDataReadNum(arg0, MEMORY_DEFAULT_NUM)); + fn_1_C2AC(&var_r31->unkC, arg8 - argA, argC, arg9 - argB); + fn_1_C2BC(&var_r31->unk3C, 0.0f, 0.0f); + fn_1_C2AC(&var_r31->unk18, arg8 + argA, argC, arg9 - argB); + fn_1_C2BC(&var_r31->unk44, 1.0f, 0.0f); + fn_1_C2AC(&var_r31->unk24, arg8 + argA, argC, arg9 + argB); + fn_1_C2BC(&var_r31->unk4C, 1.0f, 1.0f); + fn_1_C2AC(&var_r31->unk30, arg8 - argA, argC, arg9 + argB); + fn_1_C2BC(&var_r31->unk54, 0.0f, 1.0f); + DCFlushRangeNoSync(&var_r31->unkC, 0x30); + DCFlushRangeNoSync(&var_r31->unk3C, 0x20); + PPCSync(); + var_r28 = HuMemDirectMallocNum(HEAP_SYSTEM, 0x1000, MEMORY_DEFAULT_NUM); + var_r26 = var_r28; + DCFlushRange(var_r28, 0x1000); + GXBeginDisplayList(var_r26, 0x1000); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + for (var_r30 = 0; var_r30 < 4; var_r30++) { + GXPosition1x16(var_r30); + GXPosition1x16(var_r30); + GXPosition1x16(var_r30); + } + var_r31->unk84 = GXEndDisplayList(); + var_r31->unk80 = HuMemDirectMallocNum(HEAP_SYSTEM, var_r31->unk84, MEMORY_DEFAULT_NUM); + memcpy(var_r31->unk80, var_r28, var_r31->unk84); + DCFlushRange(var_r31->unk80, var_r31->unk84); + HuMemDirectFree(var_r28); + return var_r29; +} + +void fn_1_9958(s16 arg0, u8 arg1) +{ + M427DllMapStruct *var_r31; + + if (arg0 != -1) { + var_r31 = &lbl_1_bss_F0[arg0]; + var_r31->unk0 |= arg1; + } +} + +void fn_1_999C(s16 arg0, u8 arg1) +{ + M427DllMapStruct *var_r31; + + if (arg0 != -1) { + var_r31 = &lbl_1_bss_F0[arg0]; + var_r31->unk0 &= ~arg1; + } +} + +void fn_1_99E4(s16 arg0, u8 arg1, u8 arg2, u8 arg3, u8 arg4) +{ + M427DllMapStruct *var_r31; + + if (arg0 != -1) { + var_r31 = &lbl_1_bss_F0[arg0]; + var_r31->unk7C.r = arg1; + var_r31->unk7C.g = arg2; + var_r31->unk7C.b = arg3; + var_r31->unk7C.a = arg4; + } +} + +void fn_1_9A2C(s16 arg0, float arg8, float arg9, float argA) +{ + M427DllMapStruct *var_r31; + + if (arg0 != -1) { + var_r31 = &lbl_1_bss_F0[arg0]; + Hu3DModelPosSet(var_r31->unk4, arg8, arg9, argA); + } +} + +void fn_1_9AA0(s16 arg0, float arg8, float arg9, float argA) +{ + M427DllMapStruct *var_r31; + + if (arg0 != -1) { + var_r31 = &lbl_1_bss_F0[arg0]; + Hu3DModelScaleSet(var_r31->unk4, arg8, arg9, argA); + } +} + +void fn_1_9B14(s16 arg0, float arg8, float arg9, float argA) +{ + M427DllMapStruct *var_r31; + + if (arg0 != -1) { + var_r31 = &lbl_1_bss_F0[arg0]; + Hu3DModelRotSet(var_r31->unk4, arg8, arg9, argA); + } +} + +void fn_1_9B88(ModelData *model, Mtx matrix) +{ + Mtx sp88; + M427DllMapStruct *var_r31; + M427DllMapSubstruct3 *var_r27; + M427DllMapStruct3Sub *var_r26; + + var_r31 = model->unk_120; + var_r27 = &lbl_1_bss_158.unk4[var_r31->unk2]; + var_r26 = &lbl_1_bss_158.unk334; + if ((var_r31->unk0 & 1) == 0) { + fn_1_94BC(&var_r27->unk78, &model->pos, &var_r31->unkC, &model->scale, model->rot.y, var_r31->unk5C, 4); + DCFlushRangeNoSync(var_r31->unk5C, 4 * sizeof(Vec2f)); + PPCSync(); + GXLoadPosMtxImm(matrix, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_TEX_ST, GX_RGBA6, 0); + GXSetArray(GX_VA_POS, &var_r31->unkC, sizeof(Vec)); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_RGBA6, 0); + GXSetArray(GX_VA_TEX0, &var_r31->unk3C, sizeof(Vec2f)); + GXSetVtxDesc(GX_VA_TEX1, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX1, GX_TEX_ST, GX_RGBA6, 0); + GXSetArray(GX_VA_TEX1, var_r31->unk5C, sizeof(Vec2f)); + HuSprTexLoad(var_r31->unk8, 0, 0, GX_REPEAT, GX_REPEAT, GX_LINEAR); + HuSprTexLoad(var_r26->unk_04, 0, 1, GX_REPEAT, GX_REPEAT, GX_LINEAR); + HuSprTexLoad(var_r26->unk_00, 0, 2, GX_REPEAT, GX_REPEAT, GX_LINEAR); + GXSetNumTexGens(3); + MTXScale(sp88, 1.0f, 1.0f, 1.0f); + mtxTransCat(sp88, var_r31->unk88, var_r31->unk90, 0.0f); + GXLoadTexMtxImm(sp88, 0x1E, GX_MTX2x4); + MTXScale(sp88, 1.0f, 1.0f, 1.0f); + mtxTransCat(sp88, var_r31->unk8C, var_r31->unk94, 0.0f); + GXLoadTexMtxImm(sp88, 0x21, GX_MTX2x4); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, 0, 0x7D); + GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX1, 0x1E, 0, 0x7D); + GXSetTexCoordGen2(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX0, 0x21, 0, 0x7D); + GXSetNumTevStages(2); + GXSetTevColor(GX_TEVREG1, var_r31->unk7C); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_C1, GX_CC_TEXA, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_C0, GX_CC_TEXA, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_A1, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetNumIndStages(1); + GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD2, GX_TEXMAP2); + GXSetTevIndWarp(0, 0, 1, 0, 1); + MTXScale(sp88, 0.1f, 0.10000000149011612 * -sind(model->rot.y), 1.0f); + GXSetIndTexMtx(GX_ITM_0, (float(*)[3])sp88, 0); + GXSetNumChans(0); + GXSetZMode(0, GX_LEQUAL, 0); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetZCompLoc(0); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_NOOP); + GXCallDisplayList(var_r31->unk80, var_r31->unk84); + GXSetNumIndStages(0); + GXSetTevDirect(GX_TEVSTAGE0); + GXSetTevDirect(GX_TEVSTAGE1); + } +} + +void fn_1_A148(ModelData *model, Mtx matrix) +{ + M427DllMapSubstruct3Sub *var_r31; + + var_r31 = model->unk_120; + if (var_r31->unk0 == 0) { + GXSetTexCopySrc(0, 0, 0x140, 0x1E0); + GXSetTexCopyDst(0x140, 0x1E0, GX_TF_RGB5A3, 0); + } + else { + GXSetTexCopySrc(0x140, 0, 0x140, 0x1E0); + GXSetTexCopyDst(0x140, 0x1E0, GX_TF_RGB5A3, 0); + } + GXCopyTex(var_r31->unk4, 1); + DCFlushRange(var_r31->unk4, var_r31->unk8); +} + +s16 fn_1_A1F4(s32 arg0, s16 arg1, s16 arg2, s16 arg3, float arg8, Vec *arg4, Vec *arg5) +{ + float var_f31; + float var_f30; + float var_f29; + float var_f28; + M427DllMapStruct6 *var_r31; + M427DllMapSubstruct5 *var_r30; + ModelData *var_r29; + s16 var_r28; + s16 var_r27; + Vec2f *var_r26; + void *var_r25; + M427DllMapStruct3 *var_r22; + u16 var_r21; + s16 var_r19; + void *var_r18; + + var_r22 = &lbl_1_bss_158; + var_r28 = Hu3DHookFuncCreate(fn_1_B3CC); + var_r19 = var_r28; + Hu3DModelCameraSet(var_r28, arg3 ? 2 : 1); + Hu3DModelLayerSet(var_r28, 5); + var_r29 = &Hu3DData[var_r28]; + var_r31 = HuMemDirectMallocNum(HEAP_DATA, sizeof(M427DllMapStruct6), var_r29->unk_48); + var_r29->unk_120 = var_r31; + var_r22->unk4[arg3].unkAC = var_r31; + var_r31->unk_00 = arg3; + var_r31->unk_0C = 0.0f; + var_r31->unk_10 = arg8; + var_r31->unk_04 = arg4; + var_r31->unk_08 = arg5; + var_r31->unk_14 = var_r31->unk_18 = 0.0f; + var_r31->unk_1C = var_r31->unk_20 = 0.0f; + var_r31->unk_4C = var_r31->unk_50 = 0.0f; + var_r31->unk_54 = 120.0f; + var_r31->unk_58 = 72.0f; + var_r31->unk_5C = 10.0f; + var_r31->unk_60 = 10.0f; + var_r31->unk_28 = HuSprAnimRead(HuDataReadNum(arg0, MEMORY_DEFAULT_NUM)); + var_r31->unk_3A = arg1 + 1; + var_r31->unk_3C = arg2 + 1; + var_r31->unk_38 = var_r31->unk_3A * var_r31->unk_3C; + var_r31->unk_2C = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk_38 * sizeof(Vec), var_r29->unk_48); + var_r26 = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk_38 * sizeof(Vec2f), var_r29->unk_48); + var_r31->unk_30 = var_r26; + var_r31->unk_34 = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk_38 * sizeof(Vec), var_r29->unk_48); + var_r30 = HuMemDirectMallocNum(HEAP_DATA, arg2 * (arg1 * sizeof(M427DllMapSubstruct5)), var_r29->unk_48); + var_r31->unk_48 = var_r30; + var_r25 = HuMemDirectMallocNum(HEAP_DATA, 0x20000, var_r29->unk_48); + var_r18 = var_r25; + DCFlushRange(var_r25, 0x20000); + GXBeginDisplayList(var_r18, 0x20000); + GXBegin(GX_QUADS, GX_VTXFMT0, arg1 * arg2 * 4); + for (var_r28 = 0; var_r28 < arg2; var_r28++) { + for (var_r27 = 0; var_r27 < arg1; var_r27++) { + var_r30->unk0 = var_r27 + (var_r28 * var_r31->unk_3A); + var_r30->unk2 = var_r27 + var_r28 * var_r31->unk_3A + 1; + var_r30->unk4 = var_r27 + ((var_r28 + 1) * var_r31->unk_3A) + 1; + var_r30->unk6 = var_r27 + ((var_r28 + 1) * var_r31->unk_3A); + GXPosition1x16(var_r30->unk0); + GXPosition1x16(var_r30->unk0); + GXPosition1x16(var_r30->unk0); + GXPosition1x16(var_r30->unk2); + GXPosition1x16(var_r30->unk2); + GXPosition1x16(var_r30->unk2); + GXPosition1x16(var_r30->unk4); + GXPosition1x16(var_r30->unk4); + GXPosition1x16(var_r30->unk4); + GXPosition1x16(var_r30->unk6); + GXPosition1x16(var_r30->unk6); + GXPosition1x16(var_r30->unk6); + fn_1_C2C8(&var_r31->unk_2C[var_r30->unk0], &var_r31->unk_2C[var_r30->unk2], &var_r31->unk_2C[var_r30->unk4], &var_r30->unk8); + var_r30++; + } + } + var_r31->unk_44 = GXEndDisplayList(); + var_r31->unk_40 = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk_44, var_r29->unk_48); + memcpy(var_r31->unk_40, var_r25, var_r31->unk_44); + DCFlushRange(var_r31->unk_40, var_r31->unk_44); + HuMemDirectFree(var_r25); + fn_1_A7F8(var_r31); + var_f29 = 3.0f / (var_r31->unk_3A - 1); + var_f28 = 5.0f / (var_r31->unk_3C - 1); + var_f30 = 0.0f; + for (var_r28 = 0; var_r28 < var_r31->unk_3C; var_r28++) { + var_f31 = 0.0f; + for (var_r27 = 0; var_r27 < var_r31->unk_3A; var_r27++) { + var_r26->x = var_f31; + var_r26->y = var_f30; + var_f31 += var_f29; + var_r26++; + } + var_f30 += var_f28; + } + DCFlushRangeNoSync(var_r31->unk_30, var_r31->unk_38 * 8); + PPCSync(); + return var_r19; +} + +void fn_1_A7F8(M427DllMapStruct6 *var_r31) +{ + Vec sp1C; + float sp14[2]; + float spC[2]; + float var_f29; + float var_f28; + float var_f27; + M427DllMapSubstruct5 *var_r30; + Vec *var_r29; + s16 var_r28; + Vec *var_r27; + s16 var_r26; + s16 var_r25; + + if (omPauseChk() == 0) { + var_r31->unk_4C += 1.0f; + var_r31->unk_50 += 1.5f; + } + if (var_r31->unk_4C >= 360.0f) { + var_r31->unk_4C -= 360.0f; + } + if (var_r31->unk_50 >= 360.0f) { + var_r31->unk_50 -= 360.0f; + } + var_r27 = var_r31->unk_2C; + var_r29 = var_r31->unk_34; + spC[0] = var_r31->unk_0C - var_r31->unk_10; + spC[1] = var_r31->unk_10 / (var_r31->unk_3C - 1); + var_f28 = var_r31->unk_50; + for (var_r28 = 0; var_r28 < var_r31->unk_3C; var_r28++) { + fn_1_B194(var_r31, spC[0], &sp1C); + sp14[0] = sp1C.x; + sp14[1] = (sp1C.y - sp1C.x) / (var_r31->unk_3A - 1); + var_f29 = var_r31->unk_4C; + for (var_r26 = 0; var_r26 < var_r31->unk_3A; var_r26++) { + var_r27->x = sp14[0]; + var_r27->y = sp1C.z + (var_r31->unk_5C * sind(var_f29)) + var_r31->unk_60 * sind(var_f28); + var_r27->z = spC[0]; + sp14[0] += sp14[1]; + var_r27++; + var_r29->x = var_r29->y = var_r29->z = 0.0f; + var_r29++; + var_f29 += var_r31->unk_54; + if (var_f29 >= 360.0f) { + var_f29 -= 360.0f; + } + } + spC[0] += spC[1]; + var_f28 += var_r31->unk_58; + if (var_f28 >= 360.0f) { + var_f28 -= 360.0f; + } + } + var_r30 = var_r31->unk_48; + var_r25 = (var_r31->unk_3A - 1) * (var_r31->unk_3C - 1); + for (var_r28 = 0; var_r28 < var_r25; var_r28++) { + fn_1_C2C8(&var_r31->unk_2C[var_r30->unk0], &var_r31->unk_2C[var_r30->unk2], &var_r31->unk_2C[var_r30->unk4], &var_r30->unk8); + var_r31->unk_34[var_r30->unk0].x += var_r30->unk8.x; + var_r31->unk_34[var_r30->unk0].y += var_r30->unk8.y; + var_r31->unk_34[var_r30->unk0].z += var_r30->unk8.z; + + var_r31->unk_34[var_r30->unk2].x += var_r30->unk8.x; + var_r31->unk_34[var_r30->unk2].y += var_r30->unk8.y; + var_r31->unk_34[var_r30->unk2].z += var_r30->unk8.z; + + var_r31->unk_34[var_r30->unk4].x += var_r30->unk8.x; + var_r31->unk_34[var_r30->unk4].y += var_r30->unk8.y; + var_r31->unk_34[var_r30->unk4].z += var_r30->unk8.z; + + var_r31->unk_34[var_r30->unk6].x += var_r30->unk8.x; + var_r31->unk_34[var_r30->unk6].y += var_r30->unk8.y; + var_r31->unk_34[var_r30->unk6].z += var_r30->unk8.z; + var_r30++; + } + var_r29 = var_r31->unk_34; + for (var_r28 = 0; var_r28 < var_r31->unk_38; var_r28++) { + var_f27 = sqrtf((var_r29->z * var_r29->z) + ((var_r29->x * var_r29->x) + (var_r29->y * var_r29->y))); + var_r29->x /= var_f27; + var_r29->y /= var_f27; + var_r29->z /= var_f27; + var_r29++; + } + DCFlushRangeNoSync(var_r31->unk_2C, var_r31->unk_38 * sizeof(Vec)); + DCFlushRangeNoSync(var_r31->unk_34, var_r31->unk_38 * sizeof(Vec)); + PPCSync(); +} + +s16 lbl_1_data_1EC[2] = { 0, 0 }; + +float fn_1_AE78(s16 arg0, float arg8, float arg9) +{ + float sp8[2]; + float var_f31; + float var_f30; + Vec *var_r31; + s16 var_r30; + M427DllMapSubstruct3 *var_r29; + Vec *var_r28; + s16 var_r27; + s16 var_r26; + + var_r29 = &lbl_1_bss_158.unk4[arg0]; + if (lbl_1_bss_158.unk0 != 0) { + if (lbl_1_bss_158.unk0 == 1) { + lbl_1_data_1EC[arg0] = 0; + lbl_1_bss_158.unk0 = 2; + } + if (!lbl_1_bss_98.unk4) { + return 0.0f; + } + var_r28 = lbl_1_bss_98.unk4; + var_r31 = &lbl_1_bss_98.unk4[lbl_1_data_1EC[arg0]]; + var_r27 = lbl_1_bss_98.unk14; + var_r26 = lbl_1_bss_98.unk16; + for (var_r30 = lbl_1_data_1EC[arg0]; var_r30 < var_r27; var_r30++, var_r31++) { + if (arg9 >= var_r31->z && arg8 >= var_r31->x) { + break; + } + } + if (var_r30 == var_r27) { + return 0.0f; + } + } + else { + if (!var_r29->unkAC) { + return 0.0f; + } + var_r28 = var_r29->unkAC->unk_2C; + var_r31 = &var_r29->unkAC->unk_2C[lbl_1_data_1EC[arg0]]; + var_r27 = var_r29->unkAC->unk_38; + var_r26 = var_r29->unkAC->unk_3A; + for (var_r30 = lbl_1_data_1EC[arg0]; var_r30 < var_r27; var_r30++, var_r31++) { + if (arg9 <= var_r31->z && arg8 <= var_r31->x) { + break; + } + } + if (var_r30 == var_r27) { + return 0.0f; + } + } + sp8[0] = var_r31->x - var_r28[var_r30 - 1].x; + sp8[1] = arg8 - var_r28[var_r30 - 1].x; + var_f30 = sp8[1] / sp8[0]; + var_f31 = var_r31->y - var_r28[var_r30 - 1].y; + var_f31 = var_r28[var_r30 - 1].y + (var_f31 * var_f30); + lbl_1_data_1EC[arg0] = var_r30 - (var_r26 * 2); + return 20.0f + var_f31; +} + +void fn_1_B194(M427DllMapStruct6 *arg0, float arg8, Vec *arg1) +{ + float sp10[2]; + float sp8[2]; + float var_f31; + s16 var_r31; + + for (var_r31 = lbl_1_bss_580; var_r31 != 0;) { + var_r31--; + if (arg0->unk_04[var_r31].z >= arg8) { + if (var_r31 == (lbl_1_bss_580 - 1)) { + arg1->x = arg0->unk_08[var_r31].x; + arg1->y = arg0->unk_04[var_r31].x; + arg1->z = arg0->unk_04[var_r31].y; + } + else { + var_f31 = (arg0->unk_04[var_r31].z - arg8) / (arg0->unk_04[var_r31].z - arg0->unk_04[var_r31 + 1].z); + sp10[0] = arg0->unk_08[var_r31].x - 100.0f; + sp10[1] = arg0->unk_08[var_r31 + 1].x - 100.0f; + sp8[0] = 100.0f + arg0->unk_04[var_r31].x; + sp8[1] = 100.0f + arg0->unk_04[var_r31 + 1].x; + arg1->x = sp10[0] + (var_f31 * (sp10[1] - sp10[0])); + arg1->y = sp8[0] + (var_f31 * (sp8[1] - sp8[0])); + arg1->z = arg0->unk_04[var_r31].y + (var_f31 * (arg0->unk_04[var_r31 + 1].y - arg0->unk_04[var_r31].y)); + } + return; + } + } +} + +void fn_1_B3CC(ModelData *model, Mtx matrix) +{ + Mtx sp154; + Mtx sp124; + Mtx spF4; + Mtx spC4; + GXTexObj sp44; + Vec2f sp18; + GXColor sp14; + float var_f31; + M427DllMapStruct6 *var_r31; + M427DllMapSubstruct3 *var_r30; + M427DllMapSubstruct3Sub *var_r27; + M427DllMapStruct3Sub *var_r24; + s16 var_r21; + + var_r31 = model->unk_120; + var_r30 = &lbl_1_bss_158.unk4[var_r31->unk_00]; + var_r27 = &var_r30->unk94; + var_r24 = &lbl_1_bss_158.unk334; + fn_1_A7F8(var_r31); + GXLoadPosMtxImm(matrix, 0); + MTXInvXpose(matrix, spF4); + GXLoadNrmMtxImm(spF4, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetArray(GX_VA_POS, var_r31->unk_2C, sizeof(Vec)); + GXSetVtxDesc(GX_VA_NRM, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0); + GXSetArray(GX_VA_NRM, var_r31->unk_34, sizeof(Vec)); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GXSetArray(GX_VA_TEX0, var_r31->unk_30, 8); + if (var_r31->unk_00 == 0) { + GXInitTexObj(&sp44, var_r27->unk4, 0x140, 0x1E0, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, 0); + } + else { + GXInitTexObj(&sp44, var_r27->unk4, 0x140, 0x1E0, GX_TF_RGB5A3, GX_CLAMP, GX_CLAMP, 0); + } + GXInitTexObjLOD(&sp44, GX_LINEAR, GX_LINEAR, 0.0f, 0.0f, 0.0f, 0, 0, GX_ANISO_1); + GXLoadTexObj(&sp44, GX_TEXMAP0); + HuSprTexLoad(var_r31->unk_28, 0, 1, GX_REPEAT, GX_REPEAT, GX_LINEAR); + HuSprTexLoad(var_r24->unk_00, 0, 2, GX_REPEAT, GX_REPEAT, GX_LINEAR); + GXSetNumTevStages(3); + sp14.r = 0; + sp14.g = 0xB6; + sp14.b = 0xCC; + sp14.a = 0x40; + GXSetTevColor(GX_TEVREG2, sp14); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_RASC, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_4, GX_TRUE, GX_TEVREG0); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG0); + GXSetTevOrder(GX_TEVSTAGE1, GX_TEXCOORD1, GX_TEXMAP1, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE1, GX_CC_ZERO, GX_CC_TEXA, GX_CC_C2, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG1); + GXSetTevAlphaIn(GX_TEVSTAGE1, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE1, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVREG1); + GXSetTevOrder(GX_TEVSTAGE2, GX_TEXCOORD_NULL, GX_TEXMAP_NULL, GX_COLOR0A0); + GXSetTevColorIn(GX_TEVSTAGE2, GX_CC_ZERO, GX_CC_C1, GX_CC_RASC, GX_CC_C0); + GXSetTevColorOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE2, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE2, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetNumIndStages(1); + GXSetIndTexOrder(GX_INDTEXSTAGE0, GX_TEXCOORD2, GX_TEXMAP2); + GXSetTevIndWarp(1, 0, 1, 0, 1); + MTXScale(spF4, -0.1f, 0.1f, 1.0f); + GXSetIndTexMtx(GX_ITM_0, (float(*)[3])spF4, 0); + GXSetNumTexGens(3); + C_MTXLightPerspective(sp154, 45.0f, 0.6f, 0.5f, -0.5f, 0.5f, 0.5f); + MTXCopy(matrix, sp124); + MTXInverse(Hu3DCameraMtx, spF4); + MTXConcat(spF4, sp124, spF4); + MTXConcat(sp154, Hu3DCameraMtx, spC4); + MTXConcat(spC4, spF4, spF4); + GXLoadTexMtxImm(spF4, 0x1E, GX_MTX3x4); + { + Vec sp38 = { 1.0f, 1.0f, 1.0f }; + var_f31 = 0.0f; + fn_1_94BC(&var_r30->unk78, &var_r30->unk84, var_r31->unk_2C, &sp38, var_f31, &sp18, 1); + } + if (omPauseChk() == 0) { + var_r31->unk_20 = var_r31->unk_20 - 0.001f; + } + MTXScale(spF4, 1.0f, 1.0f, 1.0f); + mtxTransCat(spF4, 0.0f, var_r31->unk_20 + (0.3f * sp18.y), 0.0f); + GXLoadTexMtxImm(spF4, 0x21, GX_MTX2x4); + if (omPauseChk() == 0) { + var_r31->unk_24 += 0.05f; + } + if (var_r31->unk_24 >= 360.0f) { + var_r31->unk_24 -= 360.0f; + } + var_r31->unk_14 = sind(var_r31->unk_24); + if (omPauseChk() == 0) { + var_r31->unk_1C += 0.0005f; + } + MTXScale(spF4, 0.5f, 0.5f, 0.5f); + mtxTransCat(spF4, var_r31->unk_14, var_r31->unk_1C, 0.0f); + GXLoadTexMtxImm(spF4, 0x24, GX_MTX2x4); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX3x4, GX_TG_POS, 0x1E, GX_FALSE, 0x7D); + GXSetTexCoordGen2(GX_TEXCOORD1, GX_TG_MTX2x4, GX_TG_TEX0, 0x21, GX_FALSE, 0x7D); + GXSetTexCoordGen2(GX_TEXCOORD2, GX_TG_MTX2x4, GX_TG_TEX0, 0x24, GX_FALSE, 0x7D); + GXSetNumChans(1); + var_r21 = Hu3DLightSet(model, &Hu3DCameraMtx, &Hu3DCameraMtxXPose, 0.0f); + GXSetChanCtrl(GX_COLOR0A0, GX_TRUE, GX_SRC_REG, GX_SRC_REG, var_r21, GX_DF_CLAMP, GX_AF_SPOT); + sp14.r = sp14.g = sp14.b = 0x10; + sp14.a = 0xFF; + GXSetChanAmbColor(GX_COLOR0A0, sp14); + sp14.r = sp14.g = sp14.b = 0xFF; + sp14.a = 0xFF; + GXSetChanMatColor(GX_COLOR0A0, sp14); + GXSetZMode(1, GX_LEQUAL, GX_TRUE); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetZCompLoc(0); + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_NOOP); + GXCallDisplayList(var_r31->unk_40, var_r31->unk_44); + GXSetNumIndStages(0); + GXSetTevDirect(GX_TEVSTAGE0); + GXSetTevDirect(GX_TEVSTAGE1); +} + +void fn_1_BD2C(ModelData *model, Mtx matrix) +{ + GXColor sp14 = { 0, 0, 0, 0xFF }; + GXSetFog(GX_FOG_EXP, 10000.0f, 20000.0f, 300.0f, 50000.0f, sp14); + GXLoadPosMtxImm(matrix, 0); + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetVtxDesc(GX_VA_TEX0, GX_DIRECT); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + HuSprTexLoad(lbl_1_bss_F4, 0, 0, GX_REPEAT, GX_REPEAT, GX_LINEAR); + GXSetNumTevStages(1); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR_NULL); + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_TEXC, GX_CC_ZERO, GX_CC_ZERO, GX_CC_ZERO); + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_KONST, GX_CA_ZERO, GX_CA_ZERO, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, GX_FALSE, 0x7D); + GXSetNumChans(0); + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetZCompLoc(GX_FALSE); + GXSetBlendMode(GX_BM_NONE, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); + GXBegin(GX_QUADS, GX_VTXFMT0, 4); + GXPosition3f32(-1000.0f, 1000.0f, -24000.0f); + GXTexCoord2f32(0.0f, 0.0f); + + GXPosition3f32(1000.0f, 1000.0f, -24000.0f); + GXTexCoord2f32(1.0f, 0.0f); + + GXPosition3f32(1000.0f, -1000.0f, -24000.0f); + GXTexCoord2f32(1.0f, 1.0f); + + GXPosition3f32(-1000.0f, -1000.0f, -24000.0f); + GXTexCoord2f32(0.0f, 1.0f); + + GXSetFog(GX_FOG_EXP, 3500.0f, 20000.0f, 300.0f, 50000.0f, sp14); +} + +void fn_1_C154(ModelData *model, Mtx matrix) +{ + GXColor spC = { 0, 0, 0, 255 }; + GXSetFog(GX_FOG_EXP, 10000.0f, 20000.0f, 300.0f, 50000.0f, spC); +} + +void fn_1_C200(ModelData *model, Mtx matrix) +{ + GXColor spC = { 0, 0, 0, 255 }; + GXSetFog(GX_FOG_EXP, 3500.0f, 20000.0f, 300.0f, 50000.0f, spC); +} + +void fn_1_C2AC(Vec *arg0, float arg8, float arg9, float argA) +{ + arg0->x = arg8; + arg0->y = arg9; + arg0->z = argA; +} + +void fn_1_C2BC(Vec2f *arg0, float arg8, float arg9) +{ + arg0->x = arg8; + arg0->y = arg9; +} + +void fn_1_C2C8(Vec *arg0, Vec *arg1, Vec *arg2, Vec *arg3) +{ + Vec sp14; + Vec sp8; + + sp14.x = arg1->x - arg0->x; + sp14.y = arg1->y - arg0->y; + sp14.z = arg1->z - arg0->z; + sp8.x = arg2->x - arg1->x; + sp8.y = arg2->y - arg1->y; + sp8.z = arg2->z - arg1->z; + arg3->x = -((sp14.y * sp8.z) - (sp14.z * sp8.y)); + arg3->y = -((sp14.z * sp8.x) - (sp14.x * sp8.z)); + arg3->z = -((sp14.x * sp8.y) - (sp14.y * sp8.x)); +} + +// is this one of the structs? +void fn_1_C3A0(float *arg0, float *arg1) +{ + arg1[0] = arg0[0]; + arg1[4] = arg0[1]; + arg1[8] = arg0[2]; + arg1[1] = arg0[4]; + arg1[5] = arg0[5]; + arg1[9] = arg0[6]; + arg1[2] = arg0[8]; + arg1[6] = arg0[9]; + arg1[10] = arg0[10]; + arg1[3] = 0.0f; + arg1[7] = 0.0f; + arg1[11] = 0.0f; +} + +s16 fn_1_C41C(float x1, float y1, float z1, float x2, float y2, float z2, u8 r, u8 g, u8 b) +{ + Vec sp34; + Vec sp28; + GXColor sp23; + LightData *var_r31; + s16 var_r30; + + sp34.x = x1; + sp34.y = y1; + sp34.z = z1; + sp28.x = x2; + sp28.y = y2; + sp28.z = z2; + sp23.r = r; + sp23.g = g; + sp23.b = b; + sp23.a = 0xFF; + for (var_r31 = Hu3DLocalLight, var_r30 = 0; var_r30 < 0x20; var_r30++, var_r31++) { + if (var_r31->unk_00 == -1) { + break; + } + } + if (var_r30 == 0x20) { + return -1; + } + fn_1_C68C(var_r31, &sp34, &sp28, &sp23); + var_r31->unk_00 |= 0x8000; + return var_r30; +} + +void fn_1_C528(s16 sp8, s16 var_r28, float x1, float y1, float z1, float x2, float y2, float z2, u8 r, u8 g, u8 b) +{ + Vec sp38; + Vec sp2C; + GXColor sp27; + ModelData *var_r31; + LightData *var_r30; + s16 var_r29; + + var_r31 = &Hu3DData[sp8]; + sp38.x = x1; + sp38.y = y1; + sp38.z = z1; + sp2C.x = x2; + sp2C.y = y2; + sp2C.z = z2; + sp27.r = r; + sp27.g = g; + sp27.b = b; + sp27.a = 0xFF; + for (var_r30 = Hu3DLocalLight, var_r29 = 0; var_r29 < 0x20; var_r29++, var_r30++) { + if (var_r30->unk_00 == -1) { + break; + } + } + if (var_r29 == 0x20) { + OSReport("Light Entry Over!\n"); + return; + } + fn_1_C68C(var_r30, &sp38, &sp2C, &sp27); + if (var_r31->unk_38[var_r28] == -1) { + var_r31->unk_38[var_r28] = var_r29; + var_r31->attr |= 0x1000; + } +} + +void fn_1_C68C(LightData *arg0, Vec *arg1, Vec *arg2, GXColor *arg3) +{ + arg0->unk_00 = 0; + arg0->unk_1C = *arg1; + arg0->unk_28 = *arg2; + arg0->unk_34.x = arg0->unk_34.y = arg0->unk_34.z = 0.0f; + arg0->unk_04 = 30.0f; + arg0->unk_02 = 2; + VECNormalize(&arg0->unk_28, &arg0->unk_28); + arg0->color.r = arg3->r; + arg0->color.g = arg3->g; + arg0->color.b = arg3->b; + arg0->color.a = arg3->a; +} + +void fn_1_C76C(u8 arg0, float arg8, float arg9, float argA, s16 arg1, float argB, float argC, s16 arg2) +{ + Vec sp24; + Vec sp18; + float sp10[2]; + GXColor spC; + M427DllMapSubstruct6 *var_r31; + s16 var_r30; + + if (arg0 != 0) { + argB += (((rand8() << 8) | rand8()) % 21) - 0xA; + } + else { + argB += (((rand8() << 8) | rand8()) % 61) - 0x1E; + } + sp10[0] = sind(argB); + sp10[1] = cosd(argB); + for (var_r30 = 0; var_r30 < arg1; var_r30++) { + if (arg0 != 0) { + sp24.x = arg8 + ((((rand8() << 8) | rand8()) % 21) - 0xA); + sp24.y = arg9 + ((((rand8() << 8) | rand8()) % 21) - 0xA); + sp24.z = argA + ((((rand8() << 8) | rand8()) % 21) - 0xA); + } + else { + sp24.x = arg8 + ((((rand8() << 8) | rand8()) % 41) - 0x14); + sp24.y = arg9 + ((((rand8() << 8) | rand8()) % 41) - 0x14); + sp24.z = argA + ((((rand8() << 8) | rand8()) % 41) - 0x14); + } + sp18.x = sp18.y = sp18.z = 0.0f; + spC.r = spC.g = spC.b = spC.a = 0xFF; + var_r31 = fn_1_D4FC(arg2, &sp24, &sp18, 0.0f, &spC); + if (!var_r31) { + break; + } + var_r31->unk_38 = arg0; + if (arg0 != 0) { + var_r31->unk_34 = 0; + var_r31->unk_36 = 3; + var_r31->unk_00 = argC * (sp10[0] * (0.1f * ((((rand8() << 8) | rand8()) % 151) + 0x96))); + var_r31->unk_04 = 0.1f * ((((rand8() << 8) | rand8()) % 31) - 0x14); + var_r31->unk_08 = argC * (sp10[1] * (0.1f * ((((rand8() << 8) | rand8()) % 151) + 0x96))); + var_r31->unk_18 = 0.01f * var_r31->unk_00; + var_r31->unk_1C = 0.1f; + var_r31->unk_20 = 0.01f * var_r31->unk_08; + var_r31->unk_24 = argC * (0.1f * ((((rand8() << 8) | rand8()) % 11) + 0xA)); + var_r31->unk_28 = argC * (0.01f * ((((rand8() << 8) | rand8()) % 101) + 0x32) / (var_r31->unk_36 * 0xE)); + } + else { + var_r31->unk_34 = 0; + var_r31->unk_36 = 2; + var_r31->unk_00 = sp10[0] * (0.1f * ((((rand8() << 8) | rand8()) % 31) + 0x32)); + var_r31->unk_04 = 0.1f * ((((rand8() << 8) | rand8()) % 31) - 0x14); + var_r31->unk_08 = sp10[1] * (0.1f * (((((rand8() << 8) | rand8()) % 31)) + 0x32)); + var_r31->unk_18 = 0.0f; + var_r31->unk_1C = 0.1f; + var_r31->unk_20 = 0.0f; + var_r31->unk_24 = 0.3f * (0.1f * ((((rand8() << 8) | rand8()) % 11) + 0xA)); + var_r31->unk_28 = 0.4f * ((0.01f * ((((rand8() << 8) | rand8()) % 51) + 0x32)) / (var_r31->unk_36 * 0xE)); + } + var_r31->unk_2C = 1024.0f * argC; + var_r31->unk_30 = var_r31->unk_2C / (var_r31->unk_36 * 0xE); + } +} + +void fn_1_D22C(ModelData *model, M427DllMapStruct7 *arg1, Mtx matrix) +{ + M427DllMapSubstruct6 *var_r31; + GXColor *var_r30; + s16 var_r29; + u8 var_r28; + + var_r31 = arg1->unk_18; + var_r30 = arg1->unk_24; + for (var_r29 = 0; var_r29 < arg1->unk_00; var_r29++, var_r31++, var_r30++) { + if (var_r31->unk_62 != 0) { + var_r31->unk_54.x += var_r31->unk_00; + var_r31->unk_54.y += var_r31->unk_04; + var_r31->unk_54.z += var_r31->unk_08; + if (var_r31->unk_38 != 0) { + var_r31->unk_00 -= var_r31->unk_18; + var_r31->unk_04 += var_r31->unk_1C; + var_r31->unk_08 -= var_r31->unk_20; + var_r31->unk_18 = 0.01f * var_r31->unk_00; + var_r31->unk_1C *= 1.04f; + var_r31->unk_20 = 0.01f * var_r31->unk_08; + } + else { + var_r31->unk_04 += var_r31->unk_1C; + var_r31->unk_1C *= 1.1f; + } + var_r31->unk_24 += var_r31->unk_28; + var_r31->unk_48.x = var_r31->unk_48.y = var_r31->unk_48.z = var_r31->unk_24; + var_r31->unk_2C -= var_r31->unk_30; + if (var_r31->unk_2C > 255.0f) { + var_r28 = 0xFF; + } + else { + var_r28 = (s32)var_r31->unk_2C; + } + var_r30->a = (s32)var_r28; + var_r31->unk_34++; + if (var_r31->unk_34 >= var_r31->unk_36) { + var_r31->unk_34 = 0; + var_r31->unk_60++; + } + if (var_r31->unk_60 >= arg1->unk_14) { + var_r31->unk_62 = 0; + } + } + } +} + +s16 fn_1_D430(float arg8, float arg9, float argA, s16 arg0) +{ + Vec sp28; + Vec sp1C; + GXColor sp16; + M427DllMapSubstruct6 *var_r31; + + sp28.x = arg8; + sp28.y = arg9; + sp28.z = argA; + sp1C.x = sp1C.y = sp1C.z = 1.0f; + sp16.r = 0xFF; + sp16.g = 0xA0; + sp16.b = 0x60; + sp16.a = 0xFF; + var_r31 = fn_1_D4FC(arg0, &sp28, &sp1C, 0.0f, &sp16); + if (!var_r31) { + return -1; + } + var_r31->unk_24 = 0.0f; + return var_r31->unk_40; +} + +M427DllMapSubstruct6 *fn_1_D4FC(s16 arg0, Vec *arg1, Vec *arg2, float arg8, GXColor *arg3) +{ + M427DllMapSubstruct6 *var_r31; + M427DllMapStruct7 *var_r30; + s16 var_r29; + ModelData *var_r28; + + var_r28 = &Hu3DData[arg0]; + var_r30 = var_r28->unk_120; + for (var_r29 = 0, var_r31 = var_r30->unk_18; var_r29 < var_r30->unk_00; var_r29++, var_r31++) { + if (var_r31->unk_62 == 0) { + break; + } + } + if (var_r29 == var_r30->unk_00) { + return NULL; + } + var_r30->unk_24[var_r29].r = arg3->r; + var_r30->unk_24[var_r29].g = arg3->g; + var_r30->unk_24[var_r29].b = arg3->b; + var_r30->unk_24[var_r29].a = arg3->a; + var_r31->unk_40 = var_r29; + var_r31->unk_44 = arg8; + var_r31->unk_48 = *arg2; + var_r31->unk_54 = *arg1; + var_r31->unk_60 = 0; + var_r31->unk_3C = 0; + var_r31->unk_62 = 1; + return var_r31; +} + +s16 fn_1_D63C(AnimData *arg0, s16 arg1, float arg8, s16 arg2, s16 arg3) +{ + float temp_f0; + M427DllMapStruct7 *var_r31; + s16 var_r30; + Vec2f *var_r29; + ModelData *var_r28; + GXColor *var_r27; + Vec *var_r25; + M427DllMapSubstruct6 *var_r24; + s16 var_r22; + void *var_r21; + s16 var_r20; + s16 var_r19; + void *var_r18; + + var_r20 = Hu3DHookFuncCreate(fn_1_DCD4); + var_r28 = &Hu3DData[var_r20]; + var_r31 = HuMemDirectMallocNum(HEAP_DATA, sizeof(M427DllMapStruct7), var_r28->unk_48); + var_r28->unk_120 = var_r31; + arg0->useNum++; + var_r31->unk_10 = arg0; + var_r31->unk_00 = arg1; + var_r31->unk_08 = 0; + var_r31->unk_0C = 0; + var_r24 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(M427DllMapSubstruct6), var_r28->unk_48); + var_r31->unk_18 = var_r24; + for (var_r30 = 0; var_r30 < arg1; var_r30++, var_r24++) { + var_r24->unk_60 = -1; + var_r24->unk_62 = 0; + } + var_r25 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(Vec) * 4, var_r28->unk_48); + var_r31->unk_1C = var_r25; + for (var_r30 = 0; var_r30 < (arg1 * 4); var_r30++, var_r25++) { + var_r25->x = var_r25->y = var_r25->z = 0.0f; + } + var_r27 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(GXColor), var_r28->unk_48); + var_r31->unk_24 = var_r27; + for (var_r30 = 0; var_r30 < arg1; var_r30++, var_r27++) { + var_r27->r = var_r27->g = var_r27->b = var_r27->a = 0xFF; + } + var_r29 = HuMemDirectMallocNum(HEAP_DATA, arg1 * sizeof(Vec2f) * 4, var_r28->unk_48); + var_r31->unk_20 = var_r29; + for (var_r30 = 0; var_r30 < arg1; var_r30++) { + var_r29->x = 0.0f; + var_r29->y = 0.0f; + var_r29++; + var_r29->x = 1.0f; + var_r29->y = 0.0f; + var_r29++; + var_r29->x = 1.0f; + var_r29->y = 1.0f; + var_r29++; + var_r29->x = 0.0f; + var_r29->y = 1.0f; + var_r29++; + } + if ((arg2 != 0) || (arg3 != 0)) { + var_r22 = arg0->bmp->sizeX / arg2; + var_r19 = arg0->bmp->sizeY / arg3; + var_r31->unk_14 = var_r22 * var_r19; + var_r31->unk_60 = 1.0f / var_r22; + var_r31->unk_64 = 1.0f / var_r19; + } + else { + var_r22 = 1; + var_r31->unk_14 = 1; + var_r31->unk_60 = 1.0f; + var_r31->unk_64 = 1.0f; + } + var_r31->unk_5C = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk_14 * sizeof(Vec2f), var_r28->unk_48); + fn_1_E2B0(var_r31->unk_5C, var_r31->unk_14, var_r22, var_r31->unk_60, var_r31->unk_64); + var_r31->unk_2C.x = var_r31->unk_50 = var_r31->unk_48 = var_r31->unk_54 = -arg8; + var_r31->unk_38 = var_r31->unk_44 = var_r31->unk_2C.y = var_r31->unk_3C = arg8; + var_r31->unk_2C.z = var_r31->unk_40 = var_r31->unk_4C = var_r31->unk_58 = 0.0f; + var_r21 = HuMemDirectMallocNum(HEAP_DATA, 0x20000, var_r28->unk_48); + var_r18 = var_r21; + DCFlushRange(var_r21, 0x20000); + GXBeginDisplayList(var_r18, 0x20000); + GXBegin(GX_QUADS, GX_VTXFMT0, arg1 * 4); + for (var_r30 = 0; var_r30 < arg1; var_r30++) { + GXPosition1x16(var_r30 * 4); + GXPosition1x16(var_r30); + GXPosition1x16(var_r30 * 4); + GXPosition1x16(var_r30 * 4 + 1); + GXPosition1x16(var_r30); + GXPosition1x16(var_r30 * 4 + 1); + GXPosition1x16(var_r30 * 4 + 2); + GXPosition1x16(var_r30); + GXPosition1x16(var_r30 * 4 + 2); + GXPosition1x16(var_r30 * 4 + 3); + GXPosition1x16(var_r30); + GXPosition1x16(var_r30 * 4 + 3); + } + var_r31->unk_04 = GXEndDisplayList(); + var_r31->unk_28 = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk_04, var_r28->unk_48); + memcpy(var_r31->unk_28, var_r21, var_r31->unk_04); + DCFlushRange(var_r31->unk_28, var_r31->unk_04); + HuMemDirectFree(var_r21); + return var_r20; +} + +void fn_1_DB80(s16 arg0) +{ + ModelData *var_r31; + M427DllMapStruct7 *var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = var_r31->unk_120; + HuSprAnimKill(var_r30->unk_10); + Hu3DModelKill(arg0); +} + +void *fn_1_DBE0(s16 arg0) +{ + ModelData *var_r31; + + var_r31 = &Hu3DData[arg0]; + return var_r31->unk_120; +} + +M427DllMapSubstruct6 *fn_1_DC0C(s16 arg0, s16 arg1) +{ + ModelData *var_r31; + M427DllMapStruct7 *var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = var_r31->unk_120; + if (arg1 == -1) { + return NULL; + } + return &var_r30->unk_18[arg1]; +} + +void fn_1_DC64(s16 arg0, M427DllHook arg1) +{ + ModelData *var_r31; + M427DllMapStruct7 *var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = var_r31->unk_120; + var_r30->unk_0C = arg1; +} + +void fn_1_DC9C(s16 arg0, u8 arg1) +{ + ModelData *var_r31; + M427DllMapStruct7 *var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = var_r31->unk_120; + var_r30->unk_08 = arg1; +} + +void fn_1_DCD4(ModelData *model, Mtx matrix) +{ + Mtx sp128; + ROMtx spF8; + Mtx spC8; + Mtx sp98; + Vec sp68[4]; + Vec sp5C; + Vec sp50; + Vec sp44; + Vec sp38; + Vec sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + Vec *var_r31; + M427DllMapStruct7 *var_r30; + M427DllMapSubstruct6 *var_r29; + Vec2f *var_r26; + s16 var_r25; + s16 var_r24; + M427DllHook var_r23; + + var_r30 = model->unk_120; + GXLoadPosMtxImm(matrix, 0); + GXSetNumTevStages(1); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, 0x3C, GX_FALSE, 0x7D); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + var_r24 = var_r30->unk_10->bmp->dataFmt & 0xF; + if ((var_r24 == 7) || (var_r24 == 8)) { + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXA, GX_CC_RASC, GX_CC_ZERO); + } + else { + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_TEXC, GX_CC_RASC, GX_CC_ZERO); + } + GXSetTevColorOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetTevAlphaIn(GX_TEVSTAGE0, GX_CA_ZERO, GX_CA_TEXA, GX_CA_RASA, GX_CA_ZERO); + GXSetTevAlphaOp(GX_TEVSTAGE0, GX_TEV_ADD, GX_TB_ZERO, GX_CS_SCALE_1, GX_TRUE, GX_TEVPREV); + GXSetNumChans(1); + GXSetChanCtrl(GX_COLOR0A0, GX_FALSE, GX_SRC_REG, GX_SRC_VTX, 0, GX_DF_CLAMP, GX_AF_NONE); + if ((model->attr & 2) != 0) { + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + } + else { + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); + } + HuSprTexLoad(var_r30->unk_10, 0, 0, GX_REPEAT, GX_REPEAT, GX_LINEAR); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetZCompLoc(0); + switch (var_r30->unk_08) { + case 0: + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_NOOP); + break; + case 1: + GXSetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_ONE, GX_LO_NOOP); + break; + case 2: + GXSetBlendMode(GX_BM_BLEND, GX_BL_ZERO, GX_BL_INVDSTCLR, GX_LO_NOOP); + break; + } + GXClearVtxDesc(); + GXSetVtxDesc(GX_VA_POS, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0); + GXSetArray(GX_VA_POS, var_r30->unk_1C, 0xC); + GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_CLR_RGBA, GX_RGBA8, 0); + GXSetArray(GX_VA_CLR0, var_r30->unk_24, 4); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0); + GXSetArray(GX_VA_TEX0, var_r30->unk_20, 8); + sp128[0][0] = matrix[0][0]; + sp128[1][0] = matrix[0][1]; + sp128[2][0] = matrix[0][2]; + sp128[0][1] = matrix[1][0]; + sp128[1][1] = matrix[1][1]; + sp128[2][1] = matrix[1][2]; + sp128[0][2] = matrix[2][0]; + sp128[1][2] = matrix[2][1]; + sp128[2][2] = matrix[2][2]; + sp128[0][3] = 0.0f; + sp128[1][3] = 0.0f; + sp128[2][3] = 0.0f; + PSMTXReorder(sp128, spF8); + if ((omPauseChk() == 0) && (var_r30->unk_0C)) { + var_r23 = var_r30->unk_0C; + var_r23(model, var_r30, matrix); + } + var_r29 = var_r30->unk_18; + var_r31 = var_r30->unk_1C; + var_r26 = var_r30->unk_20; + PSMTXROMultVecArray(spF8, &var_r30->unk_2C, sp68, 4); + for (var_r25 = 0; var_r25 < var_r30->unk_00; var_r25++, var_r29++, var_r26 += 4) { + if (var_r29->unk_62 == 0) { + var_r31->x = var_r31->y = var_r31->z = 0.0f; + var_r31++; + var_r31->x = var_r31->y = var_r31->z = 0.0f; + var_r31++; + var_r31->x = var_r31->y = var_r31->z = 0.0f; + var_r31++; + var_r31->x = var_r31->y = var_r31->z = 0.0f; + var_r31++; + } + else { + if (var_r29->unk_44 == 0.0f) { + fn_1_E420(sp68, &sp38, &var_r29->unk_48, 4); + PSVECAdd(&sp38, &var_r29->unk_54, var_r31++); + PSVECAdd(&sp44, &var_r29->unk_54, var_r31++); + PSVECAdd(&sp50, &var_r29->unk_54, var_r31++); + PSVECAdd(&sp5C, &var_r29->unk_54, var_r31++); + } + else { + fn_1_E420(&var_r30->unk_2C, &sp38, &var_r29->unk_48, 4); + PSMTXRotRad(spC8, 0x5A, MTXDegToRad(var_r29->unk_44)); + PSMTXConcat(sp128, spC8, sp98); + PSMTXMultVecArray(sp98, &sp38, &sp8, 4); + PSVECAdd(&sp8, &var_r29->unk_54, var_r31++); + PSVECAdd(&sp14, &var_r29->unk_54, var_r31++); + PSVECAdd(&sp20, &var_r29->unk_54, var_r31++); + PSVECAdd(&sp2C, &var_r29->unk_54, var_r31++); + } + if (var_r29->unk_60 != -1) { + fn_1_E37C(var_r26, var_r30->unk_5C, var_r29->unk_60, var_r30->unk_60, var_r30->unk_64); + } + } + } + DCFlushRangeNoSync(var_r30->unk_1C, var_r30->unk_00 * sizeof(Vec) * 4); + DCFlushRangeNoSync(var_r30->unk_20, var_r30->unk_00 * sizeof(Vec2f) * 4); + PPCSync(); + GXCallDisplayList(var_r30->unk_28, var_r30->unk_04); +} + +void fn_1_E2B0(Vec2f *arg0, s16 arg1, s16 arg2, float arg8, float arg9) +{ + s16 var_r31; + s16 var_r30; + s16 var_r29; + + for (var_r31 = 0; var_r31 < arg1; var_r31++, arg0++) { + var_r30 = var_r31 % arg2; + var_r29 = var_r31 / arg2; + arg0->x = var_r30 * arg8; + arg0->y = var_r29 * arg9; + } +} + +void fn_1_E37C(Vec2f *arg0, Vec2f *arg1, s16 arg2, float arg8, float arg9) +{ + arg0[0].x = arg1[arg2].x; + arg0[0].y = arg1[arg2].y; + arg0[1].x = arg8 + arg1[arg2].x; + arg0[1].y = arg1[arg2].y; + arg0[2].x = arg8 + arg1[arg2].x; + arg0[2].y = arg9 + arg1[arg2].y; + arg0[3].x = arg1[arg2].x; + arg0[3].y = arg9 + arg1[arg2].y; +} + +void fn_1_E420(Vec *arg0, Vec *arg1, Vec *arg2, s16 arg3) +{ + s16 var_r31; + + for (var_r31 = 0; var_r31 < arg3; var_r31++, arg0++, arg1++) { + arg1->x = arg0->x * arg2->x; + arg1->y = arg0->y * arg2->y; + arg1->z = arg0->z * arg2->z; + } +} + +void fn_1_E488(void) +{ + if ((HuPadBtnDown[0] & PAD_TRIGGER_L) != 0) { + lbl_1_bss_91 ^= 1; + } + if (lbl_1_bss_91 != 0) { + if ((HuPadBtnDown[0] & PAD_TRIGGER_Z) != 0) { + lbl_1_bss_90 = lbl_1_bss_90 ^ 1; + } + if ((HuPadBtn[0] & PAD_BUTTON_LEFT) != 0) { + CRotM[lbl_1_bss_90].y += 1.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_RIGHT) != 0) { + CRotM[lbl_1_bss_90].y -= 1.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_UP) != 0) { + CRotM[lbl_1_bss_90].x -= 1.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_DOWN) != 0) { + CRotM[lbl_1_bss_90].x += 1.0f; + } + CenterM[lbl_1_bss_90].x += HuPadSubStkX[0]; + if ((HuPadBtn[0] & PAD_TRIGGER_R) != 0) { + CenterM[lbl_1_bss_90].y += HuPadSubStkY[0]; + } + else { + CenterM[lbl_1_bss_90].z += HuPadSubStkY[0]; + } + if ((HuPadBtn[0] & PAD_BUTTON_X) != 0) { + CZoomM[lbl_1_bss_90] += 10.0f; + } + if ((HuPadBtn[0] & PAD_BUTTON_Y) != 0) { + CZoomM[lbl_1_bss_90] -= 10.0f; + } + if ((HuPadBtnDown[0] & PAD_BUTTON_A) != 0) { + OSReport("\nCZoom = %.2f \n", CZoomM[lbl_1_bss_90]); + OSReport("Center x = %.2f: y = %.2f: z = %.2f \n", CenterM[lbl_1_bss_90].x, CenterM[lbl_1_bss_90].y, CenterM[lbl_1_bss_90].z); + OSReport("CRot x = %.2f: y = %.2f: z = %.2f \n", CRotM[lbl_1_bss_90].x, CRotM[lbl_1_bss_90].y, CRotM[lbl_1_bss_90].z); + } + } +} diff --git a/src/REL/m427Dll/player.c b/src/REL/m427Dll/player.c index b27e5584..fe097531 100644 --- a/src/REL/m427Dll/player.c +++ b/src/REL/m427Dll/player.c @@ -1967,7 +1967,7 @@ block_18: return 0; } -s32 fn_1_15F10(Vec *arg0, Vec *arg1, s32 arg2, s32 arg3, s32 arg4) +s32 fn_1_15F10(Vec arg0, Vec arg1, s32 arg2, s32 arg3, s32 arg4) { M427DllBss57CStruct *var_r31; s32 var_r30; @@ -1986,12 +1986,12 @@ s32 fn_1_15F10(Vec *arg0, Vec *arg1, s32 arg2, s32 arg3, s32 arg4) var_r31->unk_10 = arg4; var_r31->unk_18 = arg3; var_r31->unk_14 = 0; - var_r31->unk_1C = *arg0; - var_r31->unk_28 = *arg1; + var_r31->unk_1C = arg0; + var_r31->unk_28 = arg1; return var_r30; } -s32 fn_1_15FD0(Vec *arg0, s32 arg1, s32 arg2, s32 arg3, float arg8) +s32 fn_1_15FD0(Vec arg0, float arg8, s32 arg1, s32 arg2, s32 arg3) { M427DllBss57CStruct *var_r31; s32 var_r30; @@ -2010,7 +2010,7 @@ s32 fn_1_15FD0(Vec *arg0, s32 arg1, s32 arg2, s32 arg3, float arg8) var_r31->unk_10 = arg3; var_r31->unk_18 = arg2; var_r31->unk_14 = 0; - var_r31->unk_1C = *arg0; + var_r31->unk_1C = arg0; var_r31->unk_34 = arg8; return var_r30; } diff --git a/src/Runtime.PPCEABI.H/GCN_mem_alloc.c b/src/Runtime.PPCEABI.H/GCN_mem_alloc.c new file mode 100755 index 00000000..c36465e2 --- /dev/null +++ b/src/Runtime.PPCEABI.H/GCN_mem_alloc.c @@ -0,0 +1,30 @@ +#include "dolphin/os.h" + +inline static void InitDefaultHeap(void) { + void* arenaLo; + void* arenaHi; + + OSReport("GCN_Mem_Alloc.c : InitDefaultHeap. No Heap Available\n"); + OSReport("Metrowerks CW runtime library initializing default heap\n"); + + arenaLo = OSGetArenaLo(); + arenaHi = OSGetArenaHi(); + + arenaLo = OSInitAlloc(arenaLo, arenaHi, 1); + OSSetArenaLo(arenaLo); + + arenaLo = OSRoundUpPtr(arenaLo, 0x20); + arenaHi = OSRoundDownPtr(arenaHi, 0x20); + + OSSetCurrentHeap(OSCreateHeap(arenaLo, arenaHi)); + OSSetArenaLo(arenaLo = arenaHi); +} + +/* 80362914-803629CC 35D254 00B8+00 0/0 1/1 0/0 .text __sys_free */ +void __sys_free(void* p) { + if (__OSCurrHeap == -1) { + InitDefaultHeap(); + } + + OSFreeToHeap(__OSCurrHeap, p); +} diff --git a/src/Runtime.PPCEABI.H/Gecko_ExceptionPPC.cpp b/src/Runtime.PPCEABI.H/Gecko_ExceptionPPC.cpp new file mode 100755 index 00000000..faa1385f --- /dev/null +++ b/src/Runtime.PPCEABI.H/Gecko_ExceptionPPC.cpp @@ -0,0 +1,1052 @@ +#include "PowerPC_EABI_Support/Runtime/MWCPlusLib.h" +#include "PowerPC_EABI_Support/Runtime/Gecko_ExceptionPPC.h" +#include "PowerPC_EABI_Support/Runtime/NMWException.h" +#include "PowerPC_EABI_Support/Runtime/__ppc_eabi_linker.h" + +#define RETURN_ADDRESS 4 + +union MWE_GeckoVector64 { + f64 d; + f32 f[2]; +}; + +typedef union MWE_GeckoVector64 MWE_GeckoVector64; + +struct GeckoFPRContext { + f64 d; + MWE_GeckoVector64 v; +}; + +typedef struct GeckoFPRContext GeckoFPRContext; + +typedef struct ThrowContext { + GeckoFPRContext FPR[32]; + s32 GPR[32]; + s32 CR; + char* SP; + char* FP; + char* throwSP; + char* returnaddr; + char* throwtype; + void* location; + void* dtor; + CatchInfo* catchinfo; +} ThrowContext; + +typedef ThrowContext* ThrowContextPtr; + +typedef struct MWExceptionInfo { + ExceptionTableSmall* exception_record; + char* current_function; + char* action_pointer; + char* code_section; + char* data_section; + char* TOC; +} MWExceptionInfo; + +typedef struct FragmentInfo { + ExceptionTableIndex* exception_start; + ExceptionTableIndex* exception_end; + char* code_start; + char* code_end; + char* data_start; + char* data_end; + char* TOC; + int active; +} FragmentInfo; + +typedef struct ProcessInfo { + __eti_init_info* exception_info; + char* TOC; + int active; +} ProcessInfo; + +typedef struct ActionIterator { + MWExceptionInfo info; + char* current_SP; + char* current_FP; + s32 current_R31; +} ActionIterator; + +#define MAXFRAGMENTS 1 +static ProcessInfo fragmentinfo[MAXFRAGMENTS]; + +typedef void (*DeleteFunc)(void*); + +/** + * @note Address: 0x800C2374 + * @note Size: 0x34 + */ +int __register_fragment(struct __eti_init_info* info, char* TOC) +{ + + ProcessInfo* f = fragmentinfo; + int i; + + for (i = 0; i < MAXFRAGMENTS; i++, f++) { + if (f->active == 0) { + f->exception_info = info; + f->TOC = TOC; + f->active = 1; + return i; + } + } + + return -1; +} + +/** + * @note Address: 0x800C2340 + * @note Size: 0x34 + */ +void __unregister_fragment(int fragmentID) +{ + ProcessInfo* f; + + if (fragmentID >= 0 && fragmentID < MAXFRAGMENTS) { + f = &fragmentinfo[fragmentID]; + f->exception_info = 0; + f->TOC = 0; + f->active = 0; + } +} + +/** + * @note Address: N/A + * @note Size: 0x88 + */ +static inline int ExPPC_FindExceptionFragment(char* returnaddr, FragmentInfo* frag) +{ + ProcessInfo* f; + int i; + __eti_init_info* eti_info; + + for (i = 0, f = fragmentinfo; i < MAXFRAGMENTS; ++i, ++f) { + if (f->active) { + eti_info = f->exception_info; + while (1) { + if (eti_info->code_size == 0) + break; + if (returnaddr >= eti_info->code_start && returnaddr < (char*)eti_info->code_start + eti_info->code_size) { + frag->exception_start = (ExceptionTableIndex*)eti_info->eti_start; + frag->exception_end = (ExceptionTableIndex*)eti_info->eti_end; + frag->code_start = 0; + frag->code_end = 0; + frag->data_start = 0; + frag->data_end = 0; + frag->TOC = f->TOC; + frag->active = f->active; + return 1; + } + eti_info++; + } + } + } + + return 0; +} + +/** + * @note Address: N/A + * @note Size: 0x204 + */ +static void ExPPC_FindExceptionRecord(char* returnaddr, MWExceptionInfo* info) +{ + FragmentInfo* fragment; + FragmentInfo frag; + ExceptionTableIndex *exceptionindex, *p; + u32 returnoffset; + s32 i, m, n; + + info->exception_record = 0; + info->action_pointer = 0; + + if ((ExPPC_FindExceptionFragment(returnaddr, &frag)) == 0) + return; + fragment = &frag; + + info->code_section = fragment->code_start; + info->data_section = fragment->data_start; + info->TOC = fragment->TOC; + + returnoffset = returnaddr - fragment->code_start; + exceptionindex = fragment->exception_start; + for (i = 0, n = fragment->exception_end - fragment->exception_start;;) { + if (i > n) + return; + p = &exceptionindex[m = (i + n) / 2]; + + if (returnoffset < p->functionoffset) { + n = m - 1; + } else if (returnoffset > p->functionoffset + ETI_GetFunctionSize(p->eti_field)) { + i = m + 1; + } else + break; + } + info->current_function = fragment->code_start + p->functionoffset; + info->exception_record = ETI_GetDirectStore(p->eti_field) ? (ExceptionTableSmall*)(&p->exceptionoffset) + : (ExceptionTableSmall*)(fragment->data_start + p->exceptionoffset); + + returnoffset -= p->functionoffset; + + if (ET_IsLargeTable(info->exception_record->et_field)) { + ExceptionTableLarge* etl = (ExceptionTableLarge*)info->exception_record; + ExceptionRangeLarge* erl; + + for (erl = etl->ranges; erl->start != 0; erl++) { + u32 range_end = erl->start + (erl->size * 4); + + if (erl->start <= returnoffset && range_end >= returnoffset) { + info->action_pointer = (char*)etl + erl->action; + break; + } + } + } else { + ExceptionTableSmall* ets = (ExceptionTableSmall*)info->exception_record; + ExceptionRangeSmall* ers; + + for (ers = ets->ranges; ers->start != 0; ers++) { + if (ers->start <= returnoffset && ers->end >= returnoffset) { + info->action_pointer = (char*)ets + ers->action; + break; + } + } + } +} + +/** + * @note Address: N/A + * @note Size: 0x18 + */ +static inline s32 ExPPC_PopR31(char* SP, MWExceptionInfo* info) +{ + f64* FPR_save_area; + s32* GPR_save_area; + int saved_GPRs, saved_FPRs; + + saved_FPRs = ET_GetSavedFPRs(info->exception_record->et_field); + FPR_save_area = (f64*)(SP - saved_FPRs * 8); + saved_GPRs = ET_GetSavedGPRs(info->exception_record->et_field); + GPR_save_area = (s32*)FPR_save_area; + + return GPR_save_area[-1]; +} + +/** + * @note Address: N/A + * @note Size: 0x20 + */ +static inline exaction_type ExPPC_CurrentAction(const ActionIterator* iter) +{ + if (iter->info.action_pointer == 0) { + return EXACTION_ENDOFLIST; + } + + return ((ex_destroylocal*)iter->info.action_pointer)->action & EXACTION_MASK; +} + +/** + * @note Address: N/A + * @note Size: 0x1C0 + */ +static exaction_type ExPPC_NextAction(ActionIterator* iter) +{ + exaction_type action; + + for (;;) { + if (iter->info.action_pointer == 0 || ((action = ((ex_destroylocal*)iter->info.action_pointer)->action) & EXACTION_ENDBIT) != 0) { + char *return_addr, *callers_SP; + + callers_SP = *(char**)iter->current_SP; + + if (ET_GetSavedGPRs(iter->info.exception_record->et_field)) { + iter->current_R31 = ExPPC_PopR31(callers_SP, &iter->info); + } + + return_addr = *(char**)(callers_SP + RETURN_ADDRESS); + + ExPPC_FindExceptionRecord(return_addr, &iter->info); + + if (iter->info.exception_record == 0) { + terminate(); + } + + iter->current_SP = callers_SP; + iter->current_FP = (ET_GetHasFramePtr(iter->info.exception_record->et_field)) ? (char*)iter->current_R31 : iter->current_SP; + + if (iter->info.action_pointer == 0) + continue; + } else { + switch (action) { + case EXACTION_DESTROYLOCAL: + iter->info.action_pointer += sizeof(ex_destroylocal); + break; + case EXACTION_DESTROYLOCALCOND: + iter->info.action_pointer += sizeof(ex_destroylocalcond); + break; + case EXACTION_DESTROYLOCALPOINTER: + iter->info.action_pointer += sizeof(ex_destroylocalpointer); + break; + case EXACTION_DESTROYLOCALARRAY: + iter->info.action_pointer += sizeof(ex_destroylocalarray); + break; + case EXACTION_DESTROYBASE: + case EXACTION_DESTROYMEMBER: + iter->info.action_pointer += sizeof(ex_destroymember); + break; + case EXACTION_DESTROYMEMBERCOND: + iter->info.action_pointer += sizeof(ex_destroymembercond); + break; + case EXACTION_DESTROYMEMBERARRAY: + iter->info.action_pointer += sizeof(ex_destroymemberarray); + break; + case EXACTION_DELETEPOINTER: + iter->info.action_pointer += sizeof(ex_deletepointer); + break; + case EXACTION_DELETEPOINTERCOND: + iter->info.action_pointer += sizeof(ex_deletepointercond); + break; + case EXACTION_CATCHBLOCK: + iter->info.action_pointer += sizeof(ex_catchblock); + break; + case EXACTION_CATCHBLOCK_32: + iter->info.action_pointer += sizeof(ex_catchblock_32); + break; + case EXACTION_ACTIVECATCHBLOCK: + iter->info.action_pointer += sizeof(ex_activecatchblock); + break; + case EXACTION_SPECIFICATION: + iter->info.action_pointer + += sizeof(ex_specification) + ((ex_specification*)iter->info.action_pointer)->specs * sizeof(void*); + break; + default: + terminate(); + } + } + + action = ((ex_destroylocal*)iter->info.action_pointer)->action & EXACTION_MASK; + + if (action == EXACTION_BRANCH) { + iter->info.action_pointer = ((char*)iter->info.exception_record) + ((ex_branch*)iter->info.action_pointer)->target; + action = ((ex_destroylocal*)iter->info.action_pointer)->action & EXACTION_MASK; + } + return action; + } +} + +/** + * @note Address: N/A + * @note Size: 0x248 + */ +static char* ExPPC_PopStackFrame(ThrowContext* context, MWExceptionInfo* info) +{ + char *SP, *callers_SP; + f64* FPR_save_area; + s32* GPR_save_area; + int saved_GPRs, saved_FPRs; + GeckoFPRContext* Vector_save_area; + int i, j; + + SP = context->SP; + callers_SP = *(char**)SP; + saved_FPRs = ET_GetSavedFPRs(info->exception_record->et_field); + + if (ET_HasElfVector(info->exception_record->et_field)) { + Vector_save_area = (GeckoFPRContext*)(callers_SP - saved_FPRs * 16); + FPR_save_area = (f64*)Vector_save_area; + } else { + FPR_save_area = (f64*)(callers_SP - saved_FPRs * 8); + } + + if (ET_HasElfVector(info->exception_record->et_field)) { + for (i = 32 - saved_FPRs, j = 0; i < 32; ++i, ++j) { + context->FPR[i].v.f[0] = Vector_save_area[j].v.f[0]; + context->FPR[i].v.f[1] = Vector_save_area[j].v.f[1]; + context->FPR[i].d = Vector_save_area[j].d; + } + } else { + for (i = 32 - saved_FPRs, j = 0; i < 32; ++i, ++j) { + context->FPR[i].d = FPR_save_area[j]; + } + } + + saved_GPRs = ET_GetSavedGPRs(info->exception_record->et_field); + GPR_save_area = (s32*)FPR_save_area; + GPR_save_area -= saved_GPRs; + + for (i = 32 - saved_GPRs, j = 0; i < 32; ++i, ++j) { + context->GPR[i] = GPR_save_area[j]; + } + + context->SP = callers_SP; + return *(char**)(callers_SP + RETURN_ADDRESS); +} + +/** + * @note Address: N/A + * @note Size: 0x3C + */ +static inline void ExPPC_DestroyLocal(ThrowContext* context, const ex_destroylocal* ex) { DTORCALL_COMPLETE(ex->dtor, context->FP + ex->local); } + +/** + * @note Address: N/A + * @note Size: 0x74 + */ +static inline void ExPPC_DestroyLocalCond(ThrowContext* context, const ex_destroylocalcond* ex) +{ + int cond = ex_destroylocalcond_GetRegCond(ex->dlc_field) ? (local_cond_type)context->GPR[ex->cond] + : *(local_cond_type*)(context->FP + ex->cond); + + if (cond) { + DTORCALL_COMPLETE(ex->dtor, context->FP + ex->local); + } +} + +/** + * @note Address: N/A + * @note Size: 0x58 + */ +static inline void ExPPC_DestroyLocalPointer(ThrowContext* context, const ex_destroylocalpointer* ex) +{ + void* pointer + = ex_destroylocalpointer_GetRegPointer(ex->dlp_field) ? (void*)context->GPR[ex->pointer] : *(void**)(context->FP + ex->pointer); + + DTORCALL_COMPLETE(ex->dtor, pointer); +} + +/** + * @note Address: N/A + * @note Size: 0x84 + */ +static inline void ExPPC_DestroyLocalArray(ThrowContext* context, const ex_destroylocalarray* ex) +{ + char* ptr = context->FP + ex->localarray; + s32 n = ex->elements; + s32 size = ex->element_size; + + for (ptr = ptr + size * n; n > 0; n--) { + ptr -= size; + DTORCALL_COMPLETE(ex->dtor, ptr); + } +} + +/** + * @note Address: N/A + * @note Size: 0x64 + */ +static inline void ExPPC_DestroyMember(ThrowContext* context, const ex_destroymember* ex) +{ + char* objectptr + = ex_destroymember_GetRegPointer(ex->dm_field) ? (char*)context->GPR[ex->objectptr] : *(char**)(context->FP + ex->objectptr); + + DTORCALL_COMPLETE(ex->dtor, objectptr + ex->offset); +} + +/** + * @note Address: N/A + * @note Size: 0x64 + */ +static inline void ExPPC_DestroyBase(ThrowContext* context, const ex_destroymember* ex) +{ + char* objectptr + = ex_destroymember_GetRegPointer(ex->dm_field) ? (char*)context->GPR[ex->objectptr] : *(char**)(context->FP + ex->objectptr); + + DTORCALL_PARTIAL(ex->dtor, objectptr + ex->offset); +} + +/** + * @note Address: N/A + * @note Size: 0x98 + */ +static inline void ExPPC_DestroyMemberCond(ThrowContext* context, const ex_destroymembercond* ex) +{ + char* objectptr + = ex_destroymembercond_GetRegPointer(ex->dmc_field) ? (char*)context->GPR[ex->objectptr] : *(char**)(context->FP + ex->objectptr); + int cond = ex_destroymembercond_GetRegCond(ex->dmc_field) ? (vbase_ctor_arg_type)context->GPR[ex->cond] + : *(vbase_ctor_arg_type*)(context->FP + ex->cond); + + if (cond) { + DTORCALL_PARTIAL(ex->dtor, objectptr + ex->offset); + } +} + +/** + * @note Address: N/A + * @note Size: 0xAC + */ +static inline void ExPPC_DestroyMemberArray(ThrowContext* context, const ex_destroymemberarray* ex) +{ + char* ptr + = ex_destroymemberarray_GetRegPointer(ex->dma_field) ? (char*)context->GPR[ex->objectptr] : *(char**)(context->FP + ex->objectptr); + s32 n = ex->elements; + s32 size = ex->element_size; + + ptr += ex->offset; + + for (ptr = ptr + size * n; n > 0; n--) { + ptr -= size; + DTORCALL_COMPLETE(ex->dtor, ptr); + } +} + +/** + * @note Address: N/A + * @note Size: 0x54 + */ +static inline void ExPPC_DeletePointer(ThrowContext* context, const ex_deletepointer* ex) +{ + char* objectptr + = ex_deletepointer_GetRegPointer(ex->dp_field) ? (char*)context->GPR[ex->objectptr] : *(char**)(context->FP + ex->objectptr); + + ((DeleteFunc)ex->deletefunc)(objectptr); +} + +/** + * @note Address: N/A + * @note Size: 0x8C + */ +static inline void ExPPC_DeletePointerCond(ThrowContext* context, const ex_deletepointercond* ex) +{ + char* objectptr + = ex_deletepointercond_GetRegPointer(ex->dpc_field) ? (char*)context->GPR[ex->objectptr] : *(char**)(context->FP + ex->objectptr); + int cond = ex_deletepointercond_GetRegCond(ex->dpc_field) ? (local_cond_type)context->GPR[ex->cond] + : *(local_cond_type*)(context->FP + ex->cond); + + if (cond) { + ((DeleteFunc)ex->deletefunc)(objectptr); + } +} + +/** + * @note Address: N/A + * @note Size: 0x50C + */ +static void ExPPC_UnwindStack(ThrowContext* context, MWExceptionInfo* info, void* catcher) +{ + exaction_type action; + +#pragma exception_terminate + + for (;;) { + if (info->action_pointer == 0) { + char* return_addr; + + return_addr = ExPPC_PopStackFrame(context, info); + ExPPC_FindExceptionRecord(return_addr, info); + + if (info->exception_record == 0) { + terminate(); + } + + context->FP = (ET_GetHasFramePtr(info->exception_record->et_field)) ? (char*)context->GPR[31] : context->SP; + continue; + } + + action = ((ex_destroylocal*)info->action_pointer)->action; + + switch (action & EXACTION_MASK) { + case EXACTION_BRANCH: + info->action_pointer = ((char*)info->exception_record) + ((ex_branch*)info->action_pointer)->target; + break; + case EXACTION_DESTROYLOCAL: + ExPPC_DestroyLocal(context, (ex_destroylocal*)info->action_pointer); + info->action_pointer += sizeof(ex_destroylocal); + break; + case EXACTION_DESTROYLOCALCOND: + ExPPC_DestroyLocalCond(context, (ex_destroylocalcond*)info->action_pointer); + info->action_pointer += sizeof(ex_destroylocalcond); + break; + case EXACTION_DESTROYLOCALPOINTER: + ExPPC_DestroyLocalPointer(context, (ex_destroylocalpointer*)info->action_pointer); + info->action_pointer += sizeof(ex_destroylocalpointer); + break; + case EXACTION_DESTROYLOCALARRAY: + ExPPC_DestroyLocalArray(context, (ex_destroylocalarray*)info->action_pointer); + info->action_pointer += sizeof(ex_destroylocalarray); + break; + case EXACTION_DESTROYBASE: + ExPPC_DestroyBase(context, (ex_destroymember*)info->action_pointer); + info->action_pointer += sizeof(ex_destroymember); + break; + case EXACTION_DESTROYMEMBER: + ExPPC_DestroyMember(context, (ex_destroymember*)info->action_pointer); + info->action_pointer += sizeof(ex_destroymember); + break; + case EXACTION_DESTROYMEMBERCOND: + ExPPC_DestroyMemberCond(context, (ex_destroymembercond*)info->action_pointer); + info->action_pointer += sizeof(ex_destroymembercond); + break; + case EXACTION_DESTROYMEMBERARRAY: + ExPPC_DestroyMemberArray(context, (ex_destroymemberarray*)info->action_pointer); + info->action_pointer += sizeof(ex_destroymemberarray); + break; + case EXACTION_DELETEPOINTER: + ExPPC_DeletePointer(context, (ex_deletepointer*)info->action_pointer); + info->action_pointer += sizeof(ex_deletepointer); + break; + case EXACTION_DELETEPOINTERCOND: + ExPPC_DeletePointerCond(context, (ex_deletepointercond*)info->action_pointer); + info->action_pointer += sizeof(ex_deletepointercond); + break; + case EXACTION_CATCHBLOCK: + if (catcher == (void*)info->action_pointer) + return; + info->action_pointer += sizeof(ex_catchblock); + break; + case EXACTION_CATCHBLOCK_32: + if (catcher == (void*)info->action_pointer) + return; + info->action_pointer += sizeof(ex_catchblock_32); + break; + case EXACTION_ACTIVECATCHBLOCK: { + CatchInfo* catchinfo; + + catchinfo = (CatchInfo*)(context->FP + ((ex_activecatchblock*)info->action_pointer)->cinfo_ref); + + if (catchinfo->dtor) { + if (context->location == catchinfo->location) { + context->dtor = catchinfo->dtor; + } else { + DTORCALL_COMPLETE(catchinfo->dtor, catchinfo->location); + } + } + info->action_pointer += sizeof(ex_activecatchblock); + } break; + case EXACTION_SPECIFICATION: + if (catcher == (void*)info->action_pointer) + return; + info->action_pointer += sizeof(ex_specification) + ((ex_specification*)info->action_pointer)->specs * sizeof(void*); + break; + default: + terminate(); + } + + if (action & EXACTION_ENDBIT) + info->action_pointer = 0; + } +} + +/** + * @note Address: N/A + * @note Size: 0x88 + */ +static inline int ExPPC_IsInSpecification(char* extype, ex_specification* spec) +{ + s32 i, offset; + + for (i = 0; i < spec->specs; i++) { + if (__throw_catch_compare(extype, spec->spec[i], &offset)) + return 1; + } + + return 0; +} + +/** + * @note Address: N/A + * @note Size: 0x1B4 + */ +extern void __unexpected(CatchInfo* catchinfo) +{ + ex_specification* unexp = (ex_specification*)catchinfo->stacktop; + +#pragma exception_magic // allow access to __exception_magic in try/catch blocks + + try { + unexpected(); + } catch (...) { + if (ExPPC_IsInSpecification((char*)((CatchInfo*)&__exception_magic)->typeinfo, unexp)) { + throw; + } + if (ExPPC_IsInSpecification("!bad_exception!!", unexp)) { + throw bad_exception(); + } + if (ExPPC_IsInSpecification("!std::bad_exception!!", unexp)) { + throw bad_exception(); + } + } + terminate(); +} + +/** + * @note Address: N/A + * @note Size: 0x104 + */ +asm static void ExPPC_LongJump(register ThrowContext* context, register void* newRTOC, register void* newPC) +{ +#ifdef __MWERKS__ // clang-format off + nofralloc + + mr r8, newPC + mr RTOC, newRTOC + lwz r0, context->CR + mtcrf 255, r0 + + lmw r13, context->GPR[13] + + la r7, context->FPR[14].v + psq_lx fp14, 0, r7, 0, 0 + lfd fp14, context->FPR[14].d + + la r7, context->FPR[15].v + psq_lx fp15, 0, r7, 0, 0 + lfd fp15, context->FPR[15].d + + la r7, context->FPR[16].v + psq_lx fp16, 0, r7, 0, 0 + lfd fp16, context->FPR[16].d + + la r7, context->FPR[17].v + psq_lx fp17, 0, r7, 0, 0 + lfd fp17, context->FPR[17].d + + la r7, context->FPR[18].v + psq_lx fp18, 0, r7, 0, 0 + lfd fp18, context->FPR[18].d + + la r7, context->FPR[19].v + psq_lx fp19, 0, r7, 0, 0 + lfd fp19, context->FPR[19].d + + la r7, context->FPR[20].v + psq_lx fp20, 0, r7, 0, 0 + lfd fp20, context->FPR[20].d + + la r7, context->FPR[21].v + psq_lx fp21, 0, r7, 0, 0 + lfd fp21, context->FPR[21].d + + la r7, context->FPR[22].v + psq_lx fp22, 0, r7, 0, 0 + lfd fp22, context->FPR[22].d + + la r7, context->FPR[23].v + psq_lx fp23, 0, r7, 0, 0 + lfd fp23, context->FPR[23].d + + la r7, context->FPR[24].v + psq_lx fp24, 0, r7, 0, 0 + lfd fp24, context->FPR[24].d + + la r7, context->FPR[25].v + psq_lx fp25, 0, r7, 0, 0 + lfd fp25, context->FPR[25].d + + la r7, context->FPR[26].v + psq_lx fp26, 0, r7, 0, 0 + lfd fp26, context->FPR[26].d + + la r7, context->FPR[27].v + psq_lx fp27, 0, r7, 0, 0 + lfd fp27, context->FPR[27].d + + la r7, context->FPR[28].v + psq_lx fp28, 0, r7, 0, 0 + lfd fp28, context->FPR[28].d + + la r7, context->FPR[29].v + psq_lx fp29, 0, r7, 0, 0 + lfd fp29, context->FPR[29].d + + la r7, context->FPR[30].v + psq_lx fp30, 0, r7, 0, 0 + lfd fp30, context->FPR[30].d + + la r7, context->FPR[31].v + psq_lx fp31, 0, r7, 0, 0 + lfd fp31, context->FPR[31].d + + mtlr r8 + + lwz SP, context->throwSP + lwz r3, context->SP + lwz r3, 0(r3) + stw r3, 0(SP) + blr +#endif // clang-format on +} + +/** + * @note Address: N/A + * @note Size: 0x84 + */ +static inline void ExPPC_HandleUnexpected(ThrowContext* context, MWExceptionInfo* info, ex_specification* unexp) +{ + CatchInfo* catchinfo; + +#pragma exception_terminate + + ExPPC_UnwindStack(context, info, unexp); + + catchinfo = (CatchInfo*)(context->FP + unexp->cinfo_ref); + catchinfo->location = context->location; + catchinfo->typeinfo = context->throwtype; + catchinfo->dtor = context->dtor; + catchinfo->stacktop = unexp; + + ExPPC_LongJump(context, info->TOC, info->current_function + unexp->pcoffset); +} + +/** + * @note Address: N/A + * @note Size: 0x410 + */ +static void ExPPC_ThrowHandler(ThrowContext* context) +{ + ActionIterator iter; + MWExceptionInfo info; + exaction_type action; + CatchInfo* catchinfo; + s32 offset; + + ExPPC_FindExceptionRecord(context->returnaddr, &info); + + if (info.exception_record == 0) { + terminate(); + } + + context->FP = (ET_GetHasFramePtr(info.exception_record->et_field)) ? (char*)context->GPR[31] : context->SP; + + if (context->throwtype == 0) { + iter.info = info; + iter.current_SP = context->SP; + iter.current_FP = context->FP; + iter.current_R31 = context->GPR[31]; + + for (action = ExPPC_CurrentAction(&iter);; action = ExPPC_NextAction(&iter)) { + switch (action) { + case EXACTION_ACTIVECATCHBLOCK: + break; + case EXACTION_ENDOFLIST: + case EXACTION_DESTROYLOCAL: + case EXACTION_DESTROYLOCALCOND: + case EXACTION_DESTROYLOCALPOINTER: + case EXACTION_DESTROYLOCALARRAY: + case EXACTION_DESTROYBASE: + case EXACTION_DESTROYMEMBER: + case EXACTION_DESTROYMEMBERCOND: + case EXACTION_DESTROYMEMBERARRAY: + case EXACTION_DELETEPOINTER: + case EXACTION_DELETEPOINTERCOND: + case EXACTION_CATCHBLOCK: + case EXACTION_CATCHBLOCK_32: + case EXACTION_SPECIFICATION: + continue; + case EXACTION_TERMINATE: + default: + terminate(); + } + break; + } + + catchinfo = (CatchInfo*)(iter.current_FP + ((ex_activecatchblock*)iter.info.action_pointer)->cinfo_ref); + context->throwtype = (char*)catchinfo->typeinfo; + context->location = catchinfo->location; + context->dtor = 0; + context->catchinfo = catchinfo; + } else { + context->catchinfo = 0L; + } + + iter.info = info; + iter.current_SP = context->SP; + iter.current_FP = context->FP; + iter.current_R31 = context->GPR[31]; + + for (action = ExPPC_CurrentAction(&iter);; action = ExPPC_NextAction(&iter)) { + switch (action) { + case EXACTION_CATCHBLOCK_32: + if (__throw_catch_compare(context->throwtype, ((ex_catchblock_32*)iter.info.action_pointer)->catch_type, &offset)) { + break; + } + continue; + case EXACTION_CATCHBLOCK: + if (__throw_catch_compare(context->throwtype, ((ex_catchblock*)iter.info.action_pointer)->catch_type, &offset)) { + break; + } + continue; + case EXACTION_SPECIFICATION: + if (!ExPPC_IsInSpecification(context->throwtype, (ex_specification*)iter.info.action_pointer)) { + ExPPC_HandleUnexpected(context, &info, (ex_specification*)iter.info.action_pointer); + } + continue; + case EXACTION_ENDOFLIST: + case EXACTION_DESTROYLOCAL: + case EXACTION_DESTROYLOCALCOND: + case EXACTION_DESTROYLOCALPOINTER: + case EXACTION_DESTROYLOCALARRAY: + case EXACTION_DESTROYBASE: + case EXACTION_DESTROYMEMBER: + case EXACTION_DESTROYMEMBERCOND: + case EXACTION_DESTROYMEMBERARRAY: + case EXACTION_DELETEPOINTER: + case EXACTION_DELETEPOINTERCOND: + case EXACTION_ACTIVECATCHBLOCK: + continue; + case EXACTION_TERMINATE: + default: + terminate(); + } + break; + } + + if (action == EXACTION_CATCHBLOCK_32) { + ex_catchblock_32* catchblock_32; + catchblock_32 = (ex_catchblock_32*)iter.info.action_pointer; + + ExPPC_UnwindStack(context, &info, catchblock_32); + + catchinfo = (CatchInfo*)(context->FP + catchblock_32->cinfo_ref); + catchinfo->location = context->location; + catchinfo->typeinfo = context->throwtype; + catchinfo->dtor = context->dtor; + + if (*context->throwtype == '*') { + catchinfo->sublocation = &catchinfo->pointercopy; + catchinfo->pointercopy = *(s32*)context->location + offset; + } else { + catchinfo->sublocation = (char*)context->location + offset; + } + + ExPPC_LongJump(context, info.TOC, info.current_function + catchblock_32->catch_pcoffset); + } else { + ex_catchblock* catchblock; + + catchblock = (ex_catchblock*)iter.info.action_pointer; + ExPPC_UnwindStack(context, &info, catchblock); + + catchinfo = (CatchInfo*)(context->FP + catchblock->cinfo_ref); + catchinfo->location = context->location; + catchinfo->typeinfo = context->throwtype; + catchinfo->dtor = context->dtor; + + if (*context->throwtype == '*') { + catchinfo->sublocation = &catchinfo->pointercopy; + catchinfo->pointercopy = *(s32*)context->location + offset; + } else { + catchinfo->sublocation = (char*)context->location + offset; + } + + ExPPC_LongJump(context, info.TOC, info.current_function + catchblock->catch_pcoffset); + } +} + +/** + * @note Address: N/A + * @note Size: 0x44 + */ +void __end__catch(CatchInfo* catchinfo) +{ + if (catchinfo->location && catchinfo->dtor) { + DTORCALL_COMPLETE(catchinfo->dtor, catchinfo->location); + } +} + +/** + * @note Address: N/A + * @note Size: 0x144 + */ +asm void __throw(char* throwtype, void* location, void* dtor) +{ +#ifdef __MWERKS__ // clang-format off + ThrowContext throwcontext; + + fralloc + + stmw r13, throwcontext.GPR[13] + + stfd fp14, throwcontext.FPR[14].d + la r3, throwcontext.FPR[14].v + psq_stx fp14, 0, r3,0,0 + + stfd fp15, throwcontext.FPR[15].d + la r3, throwcontext.FPR[15].v + psq_stx fp15, 0, r3, 0, 0 + + stfd fp16, throwcontext.FPR[16].d + la r3, throwcontext.FPR[16].v + psq_stx fp16, 0, r3, 0, 0 + + stfd fp17, throwcontext.FPR[17].d + la r3, throwcontext.FPR[17].v + psq_stx fp17, 0, r3, 0, 0 + + stfd fp18, throwcontext.FPR[18].d + la r3, throwcontext.FPR[18].v + psq_stx fp18, 0, r3, 0, 0 + + stfd fp19, throwcontext.FPR[19].d + la r3, throwcontext.FPR[19].v + psq_stx fp19, 0, r3, 0, 0 + + stfd fp20, throwcontext.FPR[20].d + la r3, throwcontext.FPR[20].v + psq_stx fp20, 0, r3, 0, 0 + + stfd fp21, throwcontext.FPR[21].d + la r3, throwcontext.FPR[21].v + psq_stx fp21, 0, r3, 0, 0 + + stfd fp22, throwcontext.FPR[22].d + la r3, throwcontext.FPR[22].v + psq_stx fp22, 0, r3, 0, 0 + + stfd fp23, throwcontext.FPR[23].d + la r3, throwcontext.FPR[23].v + psq_stx fp23, 0, r3, 0, 0 + + stfd fp24, throwcontext.FPR[24].d + la r3, throwcontext.FPR[24].v + psq_stx fp24, 0, r3, 0, 0 + + stfd fp25, throwcontext.FPR[25].d + la r3, throwcontext.FPR[25].v + psq_stx fp25, 0, r3, 0, 0 + + stfd fp26, throwcontext.FPR[26].d + la r3, throwcontext.FPR[26].v + psq_stx fp26, 0, r3, 0, 0 + + stfd fp27, throwcontext.FPR[27].d + la r3, throwcontext.FPR[27].v + psq_stx fp27, 0, r3, 0, 0 + + stfd fp28, throwcontext.FPR[28].d + la r3, throwcontext.FPR[28].v + psq_stx fp28, 0, r3, 0, 0 + + stfd fp29, throwcontext.FPR[29].d + la r3, throwcontext.FPR[29].v + psq_stx fp29, 0, r3, 0, 0 + + stfd fp30, throwcontext.FPR[30].d + la r3, throwcontext.FPR[30].v + psq_stx fp30, 0, r3, 0, 0 + + stfd fp31, throwcontext.FPR[31].d + la r3, throwcontext.FPR[31].v + psq_stx fp31, 0, r3, 0, 0 + + + mfcr r3 + stw r3, throwcontext.CR; + + lwz r3, 0(sp) + lwz r4, RETURN_ADDRESS(r3) + stw r3, throwcontext.SP; + stw r3, throwcontext.throwSP; + stw r4, throwcontext.returnaddr; + + lwz r3,throwtype + stw r3, throwcontext.throwtype + lwz r3,location + stw r3, throwcontext.location + lwz r3,dtor + stw r3, throwcontext.dtor + la r3, throwcontext + bl ExPPC_ThrowHandler + nop + frfree + blr +#endif // clang-format on +} diff --git a/src/Runtime.PPCEABI.H/NMWException.cpp b/src/Runtime.PPCEABI.H/NMWException.cpp new file mode 100755 index 00000000..b5f722de --- /dev/null +++ b/src/Runtime.PPCEABI.H/NMWException.cpp @@ -0,0 +1,157 @@ +#include "PowerPC_EABI_Support/Runtime/NMWException.h" +#include "PowerPC_EABI_Support/Runtime/MWCPlusLib.h" + +#define ARRAY_HEADER_SIZE 16 + +extern "C" { +extern void abort(); +} + +namespace std { +/** + * @note Address: N/A + * @note Size: 0x20 + */ +static void dthandler() { abort(); } + +static terminate_handler thandler = dthandler; + +/** + * @note Address: N/A + * @note Size: 0x28 + */ +static void duhandler() { terminate(); } + +static unexpected_handler uhandler = duhandler; + +/** + * @note Address: N/A + * @note Size: 0x28 + */ +extern void terminate() { thandler(); } + +/** + * @note Address: N/A + * @note Size: 0x28 + */ +extern void unexpected() { uhandler(); } +} // namespace std + +/** + * @note Address: N/A + * @note Size: 0x22C + */ +extern char __throw_catch_compare(const char* throwtype, const char* catchtype, s32* offset_result) +{ + const char *cptr1, *cptr2; + + *offset_result = 0; + + if ((cptr2 = catchtype) == 0) { + return true; + } + + cptr1 = throwtype; + + if (*cptr2 == 'P') { + cptr2++; + if (*cptr2 == 'C') + cptr2++; + if (*cptr2 == 'V') + cptr2++; + if (*cptr2 == 'v') { + if (*cptr1 == 'P' || *cptr1 == '*') { + return true; + } + } + cptr2 = catchtype; + } + + switch (*cptr1) { + case '*': + case '!': + if (*cptr1++ != *cptr2++) + return false; + for (;;) { + if (*cptr1 == *cptr2++) { + if (*cptr1++ == '!') { + s32 offset; + + for (offset = 0; *cptr1 != '!';) { + offset = offset * 10 + *cptr1++ - '0'; + } + *offset_result = offset; + return true; + } + } else { + while (*cptr1++ != '!') { } + while (*cptr1++ != '!') { } + if (*cptr1 == 0) + return false; + + cptr2 = catchtype + 1; + } + } + return false; + } + + while ((*cptr1 == 'P' || *cptr1 == 'R') && *cptr1 == *cptr2) { + cptr1++; + cptr2++; + + if (*cptr2 == 'C') { + if (*cptr1 == 'C') + cptr1++; + cptr2++; + } + if (*cptr1 == 'C') + return false; + + if (*cptr2 == 'V') { + if (*cptr1 == 'V') + cptr1++; + cptr2++; + } + if (*cptr1 == 'V') + return false; + } + + for (; *cptr1 == *cptr2; cptr1++, cptr2++) { + if (*cptr1 == 0) + return true; + } + + return false; +} + +class __partial_array_destructor { +private: + void* p; + size_t size; + size_t n; + ConstructorDestructor dtor; + +public: + size_t i; + + __partial_array_destructor(void* array, size_t elementsize, size_t nelements, ConstructorDestructor destructor) + { + p = array; + size = elementsize; + n = nelements; + dtor = destructor; + i = n; + } + + ~__partial_array_destructor() + { + char* ptr; + + if (i < n && dtor) { + for (ptr = (char*)p + size * i; i > 0; i--) { + ptr -= size; + DTORCALL_COMPLETE(dtor, ptr); + } + } + } +}; diff --git a/src/game/audio.c b/src/game/audio.c index 8b01f192..83f5f259 100644 --- a/src/game/audio.c +++ b/src/game/audio.c @@ -100,10 +100,10 @@ void HuAudAllStop(void) { HuAudSStreamAllStop(); } -void HuAudFadeOut(s32 arg0) { +void HuAudFadeOut(s32 speed) { HuAudFXAllStop(); - HuAudSeqAllFadeOut(arg0); - HuAudSStreamAllFadeOut(arg0); + HuAudSeqAllFadeOut(speed); + HuAudSStreamAllFadeOut(speed); } int HuAudFXPlay(int seId) @@ -228,8 +228,8 @@ void HuAudFXListnerKill(void) { msmSeDelListener(); } -void HuAudFXPauseAll(s32 arg0) { - msmSePauseAll(arg0, 0x64); +void HuAudFXPauseAll(s32 pause) { + msmSePauseAll(pause, 0x64); } s32 HuAudFXStatusGet(int seNo) { @@ -259,35 +259,35 @@ s32 HuAudFXVolSet(int seNo, s16 vol) return msmSeSetParam(seNo, ¶m); } -s32 HuAudSeqPlay(s16 arg0) { - s32 temp_r31; +s32 HuAudSeqPlay(s16 musId) { + s32 channel; if (musicOffF != 0 || omSysExitReq != 0) { return 0; } - temp_r31 = msmMusPlay(arg0, NULL); - return temp_r31; + channel = msmMusPlay(musId, NULL); + return channel; } -void HuAudSeqStop(s32 arg0) { +void HuAudSeqStop(s32 musNo) { if (musicOffF != 0 || omSysExitReq != 0) { return; } - msmMusStop(arg0, 0); + msmMusStop(musNo, 0); } -void HuAudSeqFadeOut(s32 arg0, s32 arg1) { +void HuAudSeqFadeOut(s32 musNo, s32 speed) { if (musicOffF == 0) { - msmMusStop(arg0, arg1); + msmMusStop(musNo, speed); } } -void HuAudSeqAllFadeOut(s32 arg0) { +void HuAudSeqAllFadeOut(s32 speed) { s16 i; for (i = 0; i < 4; i++) { if (msmMusGetStatus(i) == 2) { - msmMusStop(i, arg0); + msmMusStop(i, speed); } } } @@ -296,22 +296,22 @@ void HuAudSeqAllStop(void) { msmMusStopAll(0, 0); } -void HuAudSeqPauseAll(s32 arg0) { - msmMusPauseAll(arg0, 0x64); +void HuAudSeqPauseAll(s32 pause) { + msmMusPauseAll(pause, 0x64); } -void HuAudSeqPause(s32 arg0, s32 arg1, s32 arg2) { +void HuAudSeqPause(s32 musNo, s32 pause, s32 speed) { if (musicOffF != 0 || omSysExitReq != 0) { return; } - msmMusPause(arg0, arg1, arg2); + msmMusPause(musNo, pause, speed); } -s32 HuAudSeqMidiCtrlGet(s32 arg0, s8 arg1, s8 arg2) { +s32 HuAudSeqMidiCtrlGet(s32 musNo, s8 channel, s8 ctrl) { if (musicOffF != 0 || omSysExitReq != 0) { return 0; } - return msmMusGetMidiCtrl(arg0, arg1, arg2); + return msmMusGetMidiCtrl(musNo, channel, ctrl); } s32 HuAudSStreamPlay(s16 streamId) { @@ -326,28 +326,28 @@ s32 HuAudSStreamPlay(s16 streamId) { return result; } -void HuAudSStreamStop(s32 arg0) { +void HuAudSStreamStop(s32 seNo) { if (musicOffF == 0) { - msmStreamStop(arg0, 0); + msmStreamStop(seNo, 0); } } -void HuAudSStreamFadeOut(s32 arg0, s32 arg1) { +void HuAudSStreamFadeOut(s32 seNo, s32 speed) { if (musicOffF == 0) { - msmStreamStop(arg0, arg1); + msmStreamStop(seNo, speed); } } -void HuAudSStreamAllFadeOut(s32 arg0) { - msmStreamStopAll(arg0); +void HuAudSStreamAllFadeOut(s32 speed) { + msmStreamStopAll(speed); } void HuAudSStreamAllStop(void) { msmStreamStopAll(0); } -s32 HuAudSStreamStatGet(s32 arg0) { - return msmStreamGetStatus(arg0); +s32 HuAudSStreamStatGet(s32 seNo) { + return msmStreamGetStatus(seNo); } SNDGRPTBL sndGrpTable[] = { @@ -445,75 +445,75 @@ SNDGRPTBL sndGrpTable[] = { }; void HuAudDllSndGrpSet(u16 ovl) { - SNDGRPTBL *var_r31; - s16 var_r29; + SNDGRPTBL *sndGrp; + s16 grpSet; - var_r31 = sndGrpTable; + sndGrp = sndGrpTable; while (1) { - if (var_r31->ovl == ovl) { - var_r29 = var_r31->grpSet; + if (sndGrp->ovl == ovl) { + grpSet = sndGrp->grpSet; break; } - if (var_r31->ovl == OVL_INVALID) { - var_r29 = 0x12; + if (sndGrp->ovl == OVL_INVALID) { + grpSet = 0x12; break; } - var_r31++; + sndGrp++; } - if (var_r29 != -1) { + if (grpSet != -1) { OSReport("SOUND ##########################\n"); - HuAudSndGrpSetSet(var_r29); - if (var_r31->auxANo != auxANoBak || var_r31->auxBNo != auxBNoBak) { - msmSysSetAux(var_r31->auxANo, var_r31->auxBNo); - OSReport("Change AUX %d,%d\n", var_r31->auxANo, var_r31->auxBNo); - auxANoBak = var_r31->auxANo; - auxBNoBak = var_r31->auxBNo; + HuAudSndGrpSetSet(grpSet); + if (sndGrp->auxANo != auxANoBak || sndGrp->auxBNo != auxBNoBak) { + msmSysSetAux(sndGrp->auxANo, sndGrp->auxBNo); + OSReport("Change AUX %d,%d\n", sndGrp->auxANo, sndGrp->auxBNo); + auxANoBak = sndGrp->auxANo; + auxBNoBak = sndGrp->auxBNo; HuPrcVSleep(); } - HuAudAUXVolSet(var_r31->auxAVol, var_r31->auxBVol); + HuAudAUXVolSet(sndGrp->auxAVol, sndGrp->auxBVol); OSReport("##########################\n"); } } -void HuAudSndGrpSetSet(s16 arg0) { - void *temp_r3; - OSTick temp_r31; - s32 temp_r26; - s32 temp_r27; +void HuAudSndGrpSetSet(s16 data_size) { + void *buf; + OSTick osTick; + s32 numPlay; + s32 err; - if (sndGroupBak != arg0) { + if (sndGroupBak != data_size) { msmMusStopAll(1, 0); msmSeStopAll(1, 0); - temp_r31 = OSGetTick(); + osTick = OSGetTick(); while ((msmMusGetNumPlay(1) != 0 || msmSeGetNumPlay(1) != 0) - && OSTicksToMilliseconds(OSGetTick() - temp_r31) < 500); - OSReport("%d\n", OSTicksToMilliseconds(OSGetTick() - temp_r31)); - if (OSTicksToMilliseconds(OSGetTick() - temp_r31) >= 500) { - temp_r26 = msmSeGetNumPlay(1); - OSReport("Timed Out! Mus %d:SE %d\n", msmMusGetNumPlay(1), temp_r26); + && OSTicksToMilliseconds(OSGetTick() - osTick) < 500); + OSReport("%d\n", OSTicksToMilliseconds(OSGetTick() - osTick)); + if (OSTicksToMilliseconds(OSGetTick() - osTick) >= 500) { + numPlay = msmSeGetNumPlay(1); + OSReport("Timed Out! Mus %d:SE %d\n", msmMusGetNumPlay(1), numPlay); } - OSReport("GroupSet %d\n", arg0); - sndGroupBak = arg0; - temp_r27 = msmSysDelGroupAll(); - temp_r3 = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(1)); - temp_r27 = msmSysLoadGroupSet(arg0, temp_r3); - OSReport("***********GroupSet Error %d\n", temp_r27); - HuMemDirectFree(temp_r3); + OSReport("GroupSet %d\n", data_size); + sndGroupBak = data_size; + err = msmSysDelGroupAll(); + buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(1)); + err = msmSysLoadGroupSet(data_size, buf); + OSReport("***********GroupSet Error %d\n", err); + HuMemDirectFree(buf); } } -void HuAudSndGrpSet(s16 arg0) { - void *temp_r3; +void HuAudSndGrpSet(s16 grpId) { + void *buf; - temp_r3 = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(arg0)); - msmSysLoadGroup(arg0, temp_r3, 0); - HuMemDirectFree(temp_r3); + buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(grpId)); + msmSysLoadGroup(grpId, buf, 0); + HuMemDirectFree(buf); } -void HuAudSndCommonGrpSet(s16 arg0, s32 arg1) { - s16 temp_r30; - OSTick temp_r27; - void *temp_r3; +void HuAudSndCommonGrpSet(s16 grpId, s32 groupCheck) { + s16 err; + OSTick osTick; + void *buf; s16 i; for (i = 0; i < 8; i++) { @@ -521,75 +521,75 @@ void HuAudSndCommonGrpSet(s16 arg0, s32 arg1) { } msmMusStopAll(1, 0); msmSeStopAll(1, 0); - temp_r27 = OSGetTick(); + osTick = OSGetTick(); while ((msmMusGetNumPlay(1) != 0 || msmSeGetNumPlay(1) != 0) - && OSTicksToMilliseconds(OSGetTick() - temp_r27) < 500); - OSReport("CommonGrpSet %d\n", arg0); - if (arg1 != 0) { - temp_r30 = msmSysDelGroupBase(0); - if (temp_r30 < 0) { - OSReport("Del Group Error %d\n", temp_r30); + && OSTicksToMilliseconds(OSGetTick() - osTick) < 500); + OSReport("CommonGrpSet %d\n", grpId); + if (groupCheck != 0) { + err = msmSysDelGroupBase(0); + if (err < 0) { + OSReport("Del Group Error %d\n", err); } } - temp_r3 = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(arg0)); - msmSysLoadGroupBase(arg0, temp_r3); - HuMemDirectFree(temp_r3); + buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(grpId)); + msmSysLoadGroupBase(grpId, buf); + HuMemDirectFree(buf); sndGroupBak = -1; } -void HuAudAUXSet(s32 arg0, s32 arg1) { - if (arg0 == -1) { - arg0 = 0; +void HuAudAUXSet(s32 auxA, s32 auxB) { + if (auxA == -1) { + auxA = 0; } - if (arg1 == -1) { - arg1 = 1; + if (auxB == -1) { + auxB = 1; } - msmSysSetAux(arg0, arg1); + msmSysSetAux(auxA, auxB); } -void HuAudAUXVolSet(s8 arg0, s8 arg1) { - HuAuxAVol = arg0; - HuAuxBVol = arg1; +void HuAudAUXVolSet(s8 auxA, s8 auxB) { + HuAuxAVol = auxA; + HuAuxBVol = auxB; } void HuAudVoiceInit(s16 ovl) { - SNDGRPTBL *var_r29; - OSTick temp_r23; - s16 var_r27; - s16 temp_r26; + SNDGRPTBL *sndGrp; + OSTick osTick; + s16 numNotChars; + s16 grpId; s16 temp_r25; - s16 temp_r30; + s16 character; - void *temp_r3; + void *buf; s16 i; if (ovl != OVL_INVALID) { - var_r29 = sndGrpTable; + sndGrp = sndGrpTable; while (1) { - if (var_r29->ovl == ovl && var_r29->grpSet == -1) { + if (sndGrp->ovl == ovl && sndGrp->grpSet == -1) { return; } - if (var_r29->ovl == OVL_INVALID) { + if (sndGrp->ovl == OVL_INVALID) { break; } - var_r29++; + sndGrp++; } } - for (i = var_r27 = 0; i < 4; i++) { - temp_r30 = GWPlayerCfg[i].character; - if (temp_r30 < 0 || temp_r30 >= 8 || temp_r30 == 0xFF || charVoiceGroupStat[temp_r30] != 0) { - var_r27++; + for (i = numNotChars = 0; i < 4; i++) { + character = GWPlayerCfg[i].character; + if (character < 0 || character >= 8 || character == 0xFF || charVoiceGroupStat[character] != 0) { + numNotChars++; } } - if (var_r27 < 4) { + if (numNotChars < 4) { for (i = 0; i < 8; i++) { charVoiceGroupStat[i] = 0; } msmMusStopAll(1, 0); msmSeStopAll(1, 0); - temp_r23 = OSGetTick(); + osTick = OSGetTick(); while ((msmMusGetNumPlay(1) != 0 || msmSeGetNumPlay(1) != 0) - && OSTicksToMilliseconds(OSGetTick() - temp_r23) < 500); + && OSTicksToMilliseconds(OSGetTick() - osTick) < 500); OSReport("############CharGrpSet\n"); temp_r25 = msmSysDelGroupBase(0); if (temp_r25 < 0) { @@ -598,39 +598,39 @@ void HuAudVoiceInit(s16 ovl) { OSReport("Del Group OK\n"); } for (i = 0; i < 4; i++) { - temp_r30 = GWPlayerCfg[i].character; - if (temp_r30 >= 0 && temp_r30 < 8 && temp_r30 != 0xFF) { - charVoiceGroupStat[temp_r30] = 1; - temp_r26 = temp_r30 + 0xA; - temp_r3 = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(temp_r26)); + character = GWPlayerCfg[i].character; + if (character >= 0 && character < 8 && character != 0xFF) { + charVoiceGroupStat[character] = 1; + grpId = character + 10; + buf = HuMemDirectMalloc(HEAP_DATA, msmSysGetSampSize(grpId)); #if VERSION_NTSC - msmSysLoadGroupBase(temp_r26, temp_r3); + msmSysLoadGroupBase(grpId, buf); #else - temp_r25 = msmSysLoadGroupBase(temp_r26, temp_r3); + temp_r25 = msmSysLoadGroupBase(grpId, buf); #endif - HuMemDirectFree(temp_r3); + HuMemDirectFree(buf); } } sndGroupBak = -1; } } -s32 HuAudPlayerVoicePlay(s16 arg0, s16 arg1) { - s16 temp_r31 = GWPlayerCfg[arg0].character; +s32 HuAudPlayerVoicePlay(s16 player, s16 seId) { + s16 charNo = GWPlayerCfg[player].character; - return HuAudCharVoicePlay(temp_r31, arg1); + return HuAudCharVoicePlay(charNo, seId); } -s32 HuAudPlayerVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2) { - s16 temp_r31 = GWPlayerCfg[arg0].character; +s32 HuAudPlayerVoicePlayPos(s16 player, s16 seId, Vec *pos) { + s16 charNo = GWPlayerCfg[player].character; - return HuAudCharVoicePlayPos(temp_r31, arg1, arg2); + return HuAudCharVoicePlayPos(charNo, seId, pos); } -void HuAudPlayerVoicePlayEntry(s16 arg0, s16 arg1) { - s16 temp_r31 = GWPlayerCfg[arg0].character; +void HuAudPlayerVoicePlayEntry(s16 player, s16 seId) { + s16 charNo = GWPlayerCfg[player].character; - HuAudCharVoicePlayEntry(temp_r31, arg1); + HuAudCharVoicePlayEntry(charNo, seId); } s32 HuAudCharVoicePlay(s16 charNo, s16 seId) @@ -676,14 +676,14 @@ s32 HuAudCharVoicePlayPos(s16 charNo, s16 seId, Vec *pos) { } void HuAudCharVoicePlayEntry(s16 charNo, s16 seId) { - int spC[MSM_ENTRY_SENO_MAX]; // size unknown (min: 30, max: 33) - u16 temp_r29; + int seNoTbl[MSM_ENTRY_SENO_MAX]; // size unknown (min: 30, max: 33) + u16 id; u16 i; seId += (charNo << 6); - temp_r29 = msmSeGetEntryID(seId, spC); - for (i = 0; i < temp_r29; i++) { - msmSeStop(spC[i], 0); + id = msmSeGetEntryID(seId, seNoTbl); + for (i = 0; i < id; i++) { + msmSeStop(seNoTbl[i], 0); } } diff --git a/src/game/board/audio.c b/src/game/board/audio.c index e79abe27..d5d8ccda 100755 --- a/src/game/board/audio.c +++ b/src/game/board/audio.c @@ -15,64 +15,64 @@ static s16 boardMusTbl[] = { }; void BoardMusStartBoard(void) { - s16 temp_r31 = boardMusTbl[GWBoardGet()]; + s16 musIdx = boardMusTbl[GWBoardGet()]; - BoardMusStart(0, temp_r31, 0x7F, 0); + BoardMusStart(0, musIdx, 0x7F, 0); BoardAudFXPlay(); } -void BoardMusStart(s32 arg0, s32 arg1, s8 arg2, u16 arg3) { - s16 *temp_r31 = boardSeq[arg0]; +void BoardMusStart(s32 boardNo, s32 musId, s8 vol, u16 speed) { + s16 *board = boardSeq[boardNo]; MSM_MUSPARAM param; - if (arg1 == temp_r31[1]) { + if (musId == board[1]) { return; } - if (temp_r31[0] != -1) { - BoardAudSeqFadeOutFast(temp_r31[0]); + if (board[0] != -1) { + BoardAudSeqFadeOutFast(board[0]); } param.flag = MSM_MUSPARAM_CHAN; - if (arg3 != 0) { + if (speed != 0) { param.flag |= MSM_MUSPARAM_FADESPEED; } - if (arg2 < 0) { + if (vol < 0) { param.flag |= MSM_MUSPARAM_VOL; - arg2 = 0x7F; + vol = 0x7F; } - param.fadeSpeed = arg3; - param.vol = arg2; - param.chan = arg0; - temp_r31[0] = msmMusPlay(arg1, ¶m); - temp_r31[1] = arg1; + param.fadeSpeed = speed; + param.vol = vol; + param.chan = boardNo; + board[0] = msmMusPlay(musId, ¶m); + board[1] = musId; } -void BoardAudSeqFadeOutFast(s32 arg0) { - BoardAudSeqFadeOut(arg0, 0x64); +void BoardAudSeqFadeOutFast(s32 boardNo) { + BoardAudSeqFadeOut(boardNo, 0x64); } -void BoardAudSeqFadeOut(s32 arg0, u16 arg1) { - s16 *temp_r31 = boardSeq[arg0]; +void BoardAudSeqFadeOut(s32 boardNo, u16 speed) { + s16 *board = boardSeq[boardNo]; - if (temp_r31[0] == -1) { + if (board[0] == -1) { return; } - HuAudSeqFadeOut(temp_r31[0], arg1); - temp_r31[1] = temp_r31[0] = -1; + HuAudSeqFadeOut(board[0], speed); + board[1] = board[0] = -1; } -void BoardMusLoudSet(s32 arg0, s32 arg1) { - if (arg1 != 0) { - BoardMusVolPanSet(arg0, 0x60, 0x1F4); +void BoardMusLoudSet(s32 boardNo, s32 isQuieter) { + if (isQuieter != 0) { + BoardMusVolPanSet(boardNo, 0x60, 0x1F4); } else { - BoardMusVolPanSet(arg0, 0x7F, 0x1F4); + BoardMusVolPanSet(boardNo, 0x7F, 0x1F4); } } -void BoardMusVolPanSet(s32 arg0, s8 vol, u16 fadeSpeed) { - s16 *temp_r31 = boardSeq[arg0]; +void BoardMusVolPanSet(s32 boardNo, s8 vol, u16 fadeSpeed) { + s16 *board = boardSeq[boardNo]; MSM_MUSPARAM param; - if (temp_r31[0] == -1) { + if (board[0] == -1) { return; } param.flag = MSM_MUSPARAM_CHAN; @@ -82,32 +82,32 @@ void BoardMusVolPanSet(s32 arg0, s8 vol, u16 fadeSpeed) { } param.fadeSpeed = fadeSpeed; param.vol = vol; - msmMusSetParam(temp_r31[0], ¶m); + msmMusSetParam(board[0], ¶m); } -void BoardAudSeqPause(s32 arg0, s32 arg1, u16 arg2) { - s16 *temp_r31 = boardSeq[arg0]; +void BoardAudSeqPause(s32 boardNo, s32 pause, u16 speed) { + s16 *board = boardSeq[boardNo]; - if (temp_r31[0] == -1) { + if (board[0] == -1) { return; } - if (arg1 != 0) { - if (BoardMusStatusGet(arg0) == 3) { + if (pause != 0) { + if (BoardMusStatusGet(boardNo) == 3) { return; } - } else if (BoardMusStatusGet(arg0) != 3) { + } else if (BoardMusStatusGet(boardNo) != 3) { return; } - HuAudSeqPause(temp_r31[0], arg1, arg2); + HuAudSeqPause(board[0], pause, speed); } -s32 BoardMusStatusGet(s32 arg0) { - s16 *temp_r31 = boardSeq[arg0]; +s32 BoardMusStatusGet(s32 boardNo) { + s16 *board = boardSeq[boardNo]; - if (temp_r31[0] == -1) { + if (board[0] == -1) { return 0; } - return msmMusGetStatus(temp_r31[0]); + return msmMusGetStatus(board[0]); } void BoardAudSeqClear(void) { @@ -134,20 +134,20 @@ void BoardAudSeqFadeOutAll(void) { } void BoardAudFXPlay(void) { - s32 var_r31; + s32 seId; switch (GWBoardGet()) { case BOARD_ID_MAIN5: - var_r31 = 0x48D; + seId = 0x48D; break; case BOARD_ID_MAIN6: - var_r31 = 0x4A2; + seId = 0x4A2; break; default: return; } if (boardFX == -1) { - boardFX = HuAudFXPlay(var_r31); + boardFX = HuAudFXPlay(seId); } }