From f6ca7da9438cc94de545390dfae4bf3a5632176b Mon Sep 17 00:00:00 2001 From: CreateSource <72283721+abnormalhare@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:59:55 -0500 Subject: [PATCH] complete m438Dll/map.c (#534) * get halfway through m424/ball * get halfway through m424/ball * get halfway through m424/ball * complete m424/ball * fix merge errors * Revert "complete m424/ball" This reverts commit acbc3196c585acc5e6328e53f4aaf31e1b52db73. * fix up ball, start claw * get halfway through m424/ball * complete m424/ball * Revert "complete m424/ball" This reverts commit acbc3196c585acc5e6328e53f4aaf31e1b52db73. * fix up ball, start claw * complete m424Dll * fix m424, begin m438/map * Start m438/map * complete m438/map * fix m424 --- .vscode/settings.json | 5 +- config/GMPE01_00/rels/m438Dll/symbols.txt | 71 +-- configure.py | 2 +- include/REL/m438Dll.h | 13 + src/REL/m424Dll/claw.c | 9 +- src/REL/m424Dll/main.c | 2 +- src/REL/m438Dll/main.c | 32 +- src/REL/m438Dll/map.c | 690 ++++++++++++++++++++++ 8 files changed, 756 insertions(+), 68 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index a155f802..d1282bec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -36,7 +36,10 @@ "vcruntime.h": "c", "hsfmotion.h": "c", "m424dll.h": "c", - "chrman.h": "c" + "chrman.h": "c", + "os.h": "c", + "type_traits": "cpp", + "xutility": "cpp" }, "search.useIgnoreFiles": false, "search.exclude": { diff --git a/config/GMPE01_00/rels/m438Dll/symbols.txt b/config/GMPE01_00/rels/m438Dll/symbols.txt index 94448680..c1e2961a 100644 --- a/config/GMPE01_00/rels/m438Dll/symbols.txt +++ b/config/GMPE01_00/rels/m438Dll/symbols.txt @@ -397,43 +397,43 @@ lbl_1_data_678 = .data:0x00000678; // type:object size:0x24 lbl_1_data_69C = .data:0x0000069C; // type:object size:0x6C lbl_1_data_708 = .data:0x00000708; // type:object size:0x24 lbl_1_data_72C = .data:0x0000072C; // type:object size:0x24 -lbl_1_data_750 = .data:0x00000750; // type:object size:0x7 data:string -lbl_1_data_757 = .data:0x00000757; // type:object size:0x7 data:string -lbl_1_data_75E = .data:0x0000075E; // type:object size:0x7 data:string -lbl_1_data_765 = .data:0x00000765; // type:object size:0x7 data:string -lbl_1_data_76C = .data:0x0000076C; // type:object size:0x7 data:string -lbl_1_data_773 = .data:0x00000773; // type:object size:0x7 data:string -lbl_1_data_77A = .data:0x0000077A; // type:object size:0x7 data:string -lbl_1_data_781 = .data:0x00000781; // type:object size:0x7 data:string -lbl_1_data_788 = .data:0x00000788; // type:object size:0x7 data:string -lbl_1_data_78F = .data:0x0000078F; // type:object size:0x8 data:string -lbl_1_data_797 = .data:0x00000797; // type:object size:0x8 data:string -lbl_1_data_79F = .data:0x0000079F; // type:object size:0x8 data:string -lbl_1_data_7A7 = .data:0x000007A7; // type:object size:0x8 data:string -lbl_1_data_7AF = .data:0x000007AF; // type:object size:0x8 data:string -lbl_1_data_7B7 = .data:0x000007B7; // type:object size:0x8 data:string -lbl_1_data_7BF = .data:0x000007BF; // type:object size:0x8 data:string -lbl_1_data_7C7 = .data:0x000007C7; // type:object size:0x8 data:string -lbl_1_data_7CF = .data:0x000007CF; // type:object size:0x8 data:string -lbl_1_data_7D7 = .data:0x000007D7; // type:object size:0x8 data:string -lbl_1_data_7DF = .data:0x000007DF; // type:object size:0x8 data:string -lbl_1_data_7E7 = .data:0x000007E7; // type:object size:0x8 data:string -lbl_1_data_7EF = .data:0x000007EF; // type:object size:0x8 data:string -lbl_1_data_7F7 = .data:0x000007F7; // type:object size:0x8 data:string -lbl_1_data_7FF = .data:0x000007FF; // type:object size:0x8 data:string -lbl_1_data_807 = .data:0x00000807; // type:object size:0x8 data:string -lbl_1_data_80F = .data:0x0000080F; // type:object size:0x8 data:string -lbl_1_data_817 = .data:0x00000817; // type:object size:0x8 data:string -lbl_1_data_81F = .data:0x0000081F; // type:object size:0x8 data:string -lbl_1_data_827 = .data:0x00000827; // type:object size:0x8 data:string -lbl_1_data_82F = .data:0x0000082F; // type:object size:0x8 data:string -lbl_1_data_837 = .data:0x00000837; // type:object size:0x8 data:string -lbl_1_data_83F = .data:0x0000083F; // type:object size:0x9 +lbl_1_data_750 = .data:0x00000750; // type:object size:0x7 scope:local data:string +lbl_1_data_757 = .data:0x00000757; // type:object size:0x7 scope:local data:string +lbl_1_data_75E = .data:0x0000075E; // type:object size:0x7 scope:local data:string +lbl_1_data_765 = .data:0x00000765; // type:object size:0x7 scope:local data:string +lbl_1_data_76C = .data:0x0000076C; // type:object size:0x7 scope:local data:string +lbl_1_data_773 = .data:0x00000773; // type:object size:0x7 scope:local data:string +lbl_1_data_77A = .data:0x0000077A; // type:object size:0x7 scope:local data:string +lbl_1_data_781 = .data:0x00000781; // type:object size:0x7 scope:local data:string +lbl_1_data_788 = .data:0x00000788; // type:object size:0x7 scope:local data:string +lbl_1_data_78F = .data:0x0000078F; // type:object size:0x8 scope:local data:string +lbl_1_data_797 = .data:0x00000797; // type:object size:0x8 scope:local data:string +lbl_1_data_79F = .data:0x0000079F; // type:object size:0x8 scope:local data:string +lbl_1_data_7A7 = .data:0x000007A7; // type:object size:0x8 scope:local data:string +lbl_1_data_7AF = .data:0x000007AF; // type:object size:0x8 scope:local data:string +lbl_1_data_7B7 = .data:0x000007B7; // type:object size:0x8 scope:local data:string +lbl_1_data_7BF = .data:0x000007BF; // type:object size:0x8 scope:local data:string +lbl_1_data_7C7 = .data:0x000007C7; // type:object size:0x8 scope:local data:string +lbl_1_data_7CF = .data:0x000007CF; // type:object size:0x8 scope:local data:string +lbl_1_data_7D7 = .data:0x000007D7; // type:object size:0x8 scope:local data:string +lbl_1_data_7DF = .data:0x000007DF; // type:object size:0x8 scope:local data:string +lbl_1_data_7E7 = .data:0x000007E7; // type:object size:0x8 scope:local data:string +lbl_1_data_7EF = .data:0x000007EF; // type:object size:0x8 scope:local data:string +lbl_1_data_7F7 = .data:0x000007F7; // type:object size:0x8 scope:local data:string +lbl_1_data_7FF = .data:0x000007FF; // type:object size:0x8 scope:local data:string +lbl_1_data_807 = .data:0x00000807; // type:object size:0x8 scope:local data:string +lbl_1_data_80F = .data:0x0000080F; // type:object size:0x8 scope:local data:string +lbl_1_data_817 = .data:0x00000817; // type:object size:0x8 scope:local data:string +lbl_1_data_81F = .data:0x0000081F; // type:object size:0x8 scope:local data:string +lbl_1_data_827 = .data:0x00000827; // type:object size:0x8 scope:local data:string +lbl_1_data_82F = .data:0x0000082F; // type:object size:0x8 scope:local data:string +lbl_1_data_837 = .data:0x00000837; // type:object size:0x8 scope:local data:string +lbl_1_data_83F = .data:0x0000083F; // type:object size:0x9 scope:local lbl_1_data_848 = .data:0x00000848; // type:object size:0x80 -lbl_1_data_8C8 = .data:0x000008C8; // type:object size:0x9 data:string -lbl_1_data_8D1 = .data:0x000008D1; // type:object size:0x7 data:string +lbl_1_data_8C8 = .data:0x000008C8; // type:object size:0x9 scope:local data:string +lbl_1_data_8D1 = .data:0x000008D1; // type:object size:0x7 scope:local data:string lbl_1_data_8D8 = .data:0x000008D8; // type:object size:0x60 -lbl_1_data_938 = .data:0x00000938; // type:object size:0xB data:string +lbl_1_data_938 = .data:0x00000938; // type:object size:0xB scope:local data:string lbl_1_bss_0 = .bss:0x00000000; // type:object size:0x4 scope:local data:4byte lbl_1_bss_4 = .bss:0x00000004; // type:object size:0x4 data:4byte lbl_1_bss_8 = .bss:0x00000008; // type:object size:0x4 data:4byte @@ -458,6 +458,7 @@ lbl_1_bss_DD8 = .bss:0x00000DD8; // type:object size:0x4 data:4byte lbl_1_bss_DDC = .bss:0x00000DDC; // type:object size:0x4 data:4byte lbl_1_bss_DE0 = .bss:0x00000DE0; // type:object size:0x4 data:4byte lbl_1_bss_DE4 = .bss:0x00000DE4; // type:object size:0x44 data:4byte +lbl_1_bss_E28 = .bss:0x00000E28; // type:object size:0x4 data:4byte lbl_1_bss_E2C = .bss:0x00000E2C; // type:object size:0x4 data:4byte lbl_1_bss_E30 = .bss:0x00000E30; // type:object size:0x4 data:4byte lbl_1_bss_E34 = .bss:0x00000E34; // type:object size:0x258 data:4byte diff --git a/configure.py b/configure.py index e653b8d1..54bb4561 100644 --- a/configure.py +++ b/configure.py @@ -1160,7 +1160,7 @@ config.libs = [ "m438Dll", # Chain Chomp Fever objects={ Object(MatchingFor("GMPE01_00", "GMPE01_01"), "REL/m438Dll/main.c"), - Object(NonMatching, "REL/m438Dll/map.c"), + Object(MatchingFor("GMPE01_00", "GMPE01_01"), "REL/m438Dll/map.c"), Object(NonMatching, "REL/m438Dll/fire.c"), }, ), diff --git a/include/REL/m438Dll.h b/include/REL/m438Dll.h index 798483ee..84847928 100644 --- a/include/REL/m438Dll.h +++ b/include/REL/m438Dll.h @@ -3,6 +3,19 @@ #include "game/object.h" +typedef struct M438MainWork4 { + u8 unk_00; + char unk01[0x3]; + s32 unk_04; + float unk_08; + float unk_0C; + Vec unk_10; + Vec unk_1C; + Vec unk_28; + Vec unk_34; + char unk40[0xC]; +} M438MainWork4; /* size = 0x4C */ + void fn_1_B4D8(Process *arg0); void fn_1_B548(); s32 fn_1_DA64(float arg8); diff --git a/src/REL/m424Dll/claw.c b/src/REL/m424Dll/claw.c index 2e6b061f..bae108e8 100644 --- a/src/REL/m424Dll/claw.c +++ b/src/REL/m424Dll/claw.c @@ -1,5 +1,6 @@ #include "REL/m424Dll.h" +#include "math.h" #include "ext_math.h" #include "game/audio.h" #include "game/chrman.h" @@ -7,8 +8,6 @@ #include "game/hsfman.h" #include "game/hsfmotion.h" #include "game/pad.h" -#include "math.h" - // STRUCT typedef struct _M424DllClawStruct { @@ -67,8 +66,8 @@ typedef struct _M424DllClawStruct3 { } M424DllClawStruct3; // sizeof 0x8 // BSS -Process *lbl_1_bss_6DC; -omObjData *lbl_1_bss_6D8; +Process* lbl_1_bss_6DC; +omObjData* lbl_1_bss_6D8; s32 lbl_1_bss_6D0[2]; s32 lbl_1_bss_6CC; s32 lbl_1_bss_6C8; @@ -179,7 +178,7 @@ void fn_1_94D0(omObjData *arg0) } var_r31->unk184 = -1; var_r31->unk30 = lbl_1_data_30C; - + for (var_r29 = 0; var_r29 < 0xC; var_r29++) { var_r31->unk3C[var_r29] = lbl_1_data_30C; var_r31->unkCC[var_r29] = lbl_1_data_30C; diff --git a/src/REL/m424Dll/main.c b/src/REL/m424Dll/main.c index 00db5d94..8fb9218d 100644 --- a/src/REL/m424Dll/main.c +++ b/src/REL/m424Dll/main.c @@ -273,7 +273,7 @@ void fn_1_41C(omObjData* object) { void fn_1_EE0(omObjData* object) { if (WipeStatGet() == 0) { - Hu3DBGColorSet(0U, 0U, 0U); + Hu3DBGColorSet(0, 0, 0); fn_1_1B8C(); fn_1_2880(); fn_1_94A4(); diff --git a/src/REL/m438Dll/main.c b/src/REL/m438Dll/main.c index c7409d36..dc82ed96 100644 --- a/src/REL/m438Dll/main.c +++ b/src/REL/m438Dll/main.c @@ -121,24 +121,6 @@ typedef struct M438MainWork3 { u16 unk_188[3]; } M438MainWork3; /* size = */ -typedef struct M438MainWork4 { - u8 unk_00; - char unk01[0x7]; - float unk_08; - float unk_0C; - float unk_10; - float unk_14; - float unk_18; - float unk_1C; - float unk_20; - float unk_24; - char unk28[4]; - float unk_2C; - char unk30[4]; - Vec unk_34; - char unk40[0xC]; -} M438MainWork4; /* size = 0x4C */ - typedef struct M438StructBss298 { /* 0x00 */ u8 unk_00; u8 unk_01; @@ -1595,15 +1577,15 @@ void fn_1_4724(omObjData *object) var_r31 = fn_1_7BFC(sizeof(M438MainWork4)); object->data = var_r31; memset(var_r31, 0, sizeof(M438MainWork4)); - var_r31->unk_10 = 0.0f; - var_r31->unk_14 = -450.0f; - var_r31->unk_18 = -1550.0f; - var_r31->unk_1C = var_r31->unk_20 = var_r31->unk_24 = 0.0f; - var_r31->unk_2C = 35.0f; + var_r31->unk_10.x = 0.0f; + var_r31->unk_10.y = -450.0f; + var_r31->unk_10.z = -1550.0f; + var_r31->unk_1C.x = var_r31->unk_1C.y = var_r31->unk_1C.z = 0.0f; + var_r31->unk_28.y = 35.0f; var_r31->unk_0C = 0.0f; var_r31->unk_00 = 0; - omSetTra(object, var_r31->unk_10, var_r31->unk_14, var_r31->unk_18); - omSetRot(object, var_r31->unk_1C, var_r31->unk_20, var_r31->unk_24); + omSetTra(object, var_r31->unk_10.x, var_r31->unk_10.y, var_r31->unk_10.z); + omSetRot(object, var_r31->unk_1C.x, var_r31->unk_1C.y, var_r31->unk_1C.z); omSetSca(object, 1.25f, 1.25f, 1.25f); object->func = fn_1_4984; } diff --git a/src/REL/m438Dll/map.c b/src/REL/m438Dll/map.c index e69de29b..ee37c2c3 100644 --- a/src/REL/m438Dll/map.c +++ b/src/REL/m438Dll/map.c @@ -0,0 +1,690 @@ +#include "REL/m438Dll.h" + +#include "ext_math.h" +#include "string.h" +#include "game/hsfanim.h" +#include "game/hsfmotion.h" +#include "game/sprite.h" +#include "game/wipe.h" + +// STRUCT +typedef struct M438MapStruct { + s32 unk0; + s32 unk4; + s32 unk8; + Vec unkC; + f32 unk18; + f32 unk1C; + f32 unk20; +} M438MapStruct; + +typedef struct M438MapStruct2 { + s32 unk0; + s32 unk4; + f32 unk8; + f32 unkC; + f32 unk10; + f32 unk14; + f32 unk18; + f32 unk1C; + f32 unk20; + Vec unk24; + Vec unk30; + Vec unk3C; + union { + M438MainWork4* unk48; + HsfObject* unk48o; + }; +} M438MapStruct2; + +typedef struct M438MapStruct3 { + u32 unk0; + M438MapStruct2 unk4; + char unk4C[0x934]; + M438MapStruct unk984; +} M438MapStruct3; + +// BSS +omObjData* lbl_1_bss_108C[6]; +HsfanimStruct01* lbl_1_bss_E34[0x96]; +s32 lbl_1_bss_E30; +s32 lbl_1_bss_E2C; +s32 lbl_1_bss_E28; + +// DATA +char* lbl_1_data_848[] = { + "iwa_s1", "iwa_s2", "iwa_s3", "iwa_s4", "iwa_s5", + "iwa_s6", "iwa_s7", "iwa_s8", "iwa_s9", + "iwa_s10", "iwa_s11", "iwa_s12", "iwa_s13", + "iwa_s14", "iwa_s15", "iwa_s16", "iwa_s17", + "iwa_s18", "iwa_s19", "iwa_s20", "iwa_s21", + "iwa_s22", "iwa_s23", "iwa_s24", "iwa_s25", + "iwa_s26", "iwa_s27", "iwa_s28", "iwa_s29", + "iwa_s30", "iwa_s31", "iwa_s32" +}; + +// PROTO +void fn_1_B54C(omObjData*); +void fn_1_BF20(omObjData*); +void fn_1_CAB0(f32); +void fn_1_C764(ModelData* model, ParticleData* particle, Mtx matrix); +void fn_1_C8E8(ModelData* model, ParticleData* particle, Mtx matrix); +void fn_1_D3FC(ModelData* model, ParticleData* particle, Mtx matrix); +void fn_1_D57C(Vec*, f32); +void fn_1_E034(Mtx, Vec*); + +void fn_1_B4D8(Process* arg0) { + omObjData* var_r31; + + lbl_1_bss_E30 = 0; + var_r31 = lbl_1_bss_108C[0] = omAddObjEx(arg0, 0x20, 8, 0, -1, fn_1_B54C); + var_r31->work[0] = 0; +} + +void fn_1_B548(void) {} + +void fn_1_B54C(omObjData* arg0) { + Vec sp20; + Vec sp14; + Vec sp8; + s32 var_r30; + s32 var_r29; + HsfObject* var_r26; + s32 var_r27; + M438MapStruct2* var_r28; + HsfanimStruct01* var_r25; + M438MapStruct* var_r24; + M438MapStruct3* temp_r23; + + arg0->data = HuMemDirectMallocNum(HEAP_SYSTEM, 0x108C, 0x10000000); + temp_r23 = arg0->data; + memset(temp_r23, 0, 0x108C); + arg0->model[0] = Hu3DModelCreateFile(0x450000); + Hu3DModelLayerSet(arg0->model[0], 0); + Hu3DModelAttrSet(arg0->model[0], 0x40000001); + Hu3DModelShadowMapSet(arg0->model[0]); + arg0->model[1] = Hu3DModelCreateFile(0x450001); + Hu3DModelLayerSet(arg0->model[1], 1); + Hu3DModelPosSet(arg0->model[1], 0.0f, -80.0f, 0.0f); + arg0->model[2] = Hu3DModelCreateFile(0x450002); + Hu3DModelLayerSet(arg0->model[2], 0); + Hu3DModelPosSet(arg0->model[2], 0.0f, -50.0f, 0.0f); + Hu3DModelAttrSet(arg0->model[2], 0x40000001); + Hu3DMotionSpeedSet(arg0->model[2], 0.1f); + var_r29 = Hu3DTexScrollCreate(arg0->model[1], "lavafall"); + Hu3DTexScrollPosMoveSet(var_r29, 0.0f, -0.025000002f, 0.0f); + var_r29 = Hu3DTexScrollCreate(arg0->model[1], "lafall"); + Hu3DTexScrollPosMoveSet(var_r29, 0.0f, -(1.0f / 60.0f), 0.0f); + var_r29 = 0; + + var_r27 = Hu3DParticleCreate(HuSprAnimReadFile(0x45000C), 0x32); + arg0->model[3] = var_r27; + Hu3DModelLayerSet(var_r27, 3); + Hu3DParticleHookSet(var_r27, fn_1_C764); + for (var_r30 = 0; var_r30 < 0x32; var_r30++, var_r29++) { + lbl_1_bss_E34[var_r29] = &((ParticleData*)(Hu3DData[var_r27].unk_120))->unk_48[var_r30]; + } + + var_r27 = Hu3DParticleCreate(HuSprAnimReadFile(0x45000D), 0x32); + arg0->model[4] = var_r27; + Hu3DModelLayerSet(var_r27, 3); + Hu3DParticleHookSet(var_r27, fn_1_C764); + for (var_r30 = 0; var_r30 < 0x32; var_r30++, var_r29++) { + lbl_1_bss_E34[var_r29] = &((ParticleData*)(Hu3DData[var_r27].unk_120))->unk_48[var_r30]; + } + + var_r27 = Hu3DParticleCreate(HuSprAnimReadFile(0x45000E), 0x32); + arg0->model[5] = var_r27; + Hu3DModelLayerSet(var_r27, 3); + Hu3DParticleHookSet(var_r27, fn_1_C764); + for (var_r30 = 0; var_r30 < 0x32; var_r30++, var_r29++) { + lbl_1_bss_E34[var_r29] = &((ParticleData*)(Hu3DData[var_r27].unk_120))->unk_48[var_r30]; + } + for (var_r30 = 0; var_r30 < 0x95; var_r30++) { + for (var_r29 = 1; var_r29 < 0x96; var_r29++) { + if (frandmod(0x3E8) < 0x1C2) { + var_r25 = lbl_1_bss_E34[var_r30]; + lbl_1_bss_E34[var_r30] = lbl_1_bss_E34[var_r29]; + lbl_1_bss_E34[var_r29] = var_r25; + } + } + } + + for (var_r30 = 0; var_r30 < 0x96; var_r30++) { + lbl_1_bss_E34[var_r30]->unk2C = 0.0f; + lbl_1_bss_E34[var_r30]->unk40.a = 0; + lbl_1_bss_E34[var_r30]->unk00 = 0; + } + + var_r27 = Hu3DParticleCreate(HuSprAnimReadFile(0x45000F), 0x32); + arg0->model[6] = var_r27; + Hu3DModelLayerSet(var_r27, 3); + Hu3DParticleHookSet(var_r27, fn_1_C8E8); + var_r25 = &((ParticleData*)(Hu3DData[var_r27].unk_120))->unk_48[0]; + for (var_r30 = 0; var_r30 < 0x32; var_r30++, var_r25++) { + var_r25->unk2C = 0.0f; + var_r25->unk40.a = 0; + var_r25->unk00 = 0; + } + + var_r27 = Hu3DParticleCreate(HuSprAnimReadFile(0x450010), 0x1F4); + arg0->model[7] = var_r27; + Hu3DModelLayerSet(var_r27, 2); + Hu3DParticleBlendModeSet(var_r27, 1); + Hu3DParticleHookSet(var_r27, fn_1_D3FC); + var_r25 = &((ParticleData*)(Hu3DData[var_r27].unk_120))->unk_48[0]; + for (var_r30 = 0; var_r30 < 0x1F4; var_r30++, var_r25++) { + var_r25->unk2C = 0.0f; + var_r25->unk40.a = 0; + var_r25->unk00 = 0; + } + var_r28 = &temp_r23->unk4; + for (var_r30 = 0; var_r30 < 0x20; var_r30++, var_r28++) { + var_r28->unk0 = 1; + var_r28->unk4 = 0; + var_r28->unkC = var_r28->unk10 = 0.0f; + var_r28->unk14 = var_r28->unk18 = 0.0f; + var_r28->unk1C = var_r28->unk20 = 0.0f; + var_r26 = Hu3DModelObjPtrGet(arg0->model[0], lbl_1_data_848[var_r30]); + var_r28->unk48o = var_r26; + sp14.x = sp14.y = sp14.z = -100000.0f; + sp8.x = sp8.y = sp8.z = 100000.0f; + + for (var_r29 = 0; var_r29 < var_r26->data.vertex->count; var_r29++) { + if (((Vec*)var_r26->data.vertex->data)[var_r29].x > sp14.x) { + sp14.x = ((Vec*)var_r26->data.vertex->data)[var_r29].x; + } + if (((Vec*)var_r26->data.vertex->data)[var_r29].y > sp14.y) { + sp14.y = ((Vec*)var_r26->data.vertex->data)[var_r29].y; + } + if (((Vec*)var_r26->data.vertex->data)[var_r29].z > sp14.z) { + sp14.z = ((Vec*)var_r26->data.vertex->data)[var_r29].z; + } + if (((Vec*)var_r26->data.vertex->data)[var_r29].x < sp8.x) { + sp8.x = ((Vec*)var_r26->data.vertex->data)[var_r29].x; + } + if (((Vec*)var_r26->data.vertex->data)[var_r29].y < sp8.y) { + sp8.y = ((Vec*)var_r26->data.vertex->data)[var_r29].y; + } + if (((Vec*)var_r26->data.vertex->data)[var_r29].z < sp8.z) { + sp8.z = ((Vec*)var_r26->data.vertex->data)[var_r29].z; + } + } + PSVECAdd(&sp14, &sp8, &sp20); + PSVECScale(&sp20, &sp20, 0.5f); + var_r28->unk24 = sp20; + var_r28->unk30 = var_r28->unk24; + var_r28->unk8 = (360.0 + atan2d(sp20.x, sp20.z)); + if (var_r28->unk8 >= 360.0f) { + var_r28->unk8 -= 360.0f; + } + } + var_r27 = Hu3DModelCreateFile(0x45000B); + Hu3DModelLayerSet(var_r27, 2); + var_r24 = &temp_r23->unk984; + for (var_r30 = 0; var_r30 < 0x32; var_r30++, var_r24++) { + var_r24->unk0 = 0; + var_r24->unk8 = 0; + var_r24->unk18 = 0.0f; + var_r24->unk1C = var_r24->unk20 = 0.0f; + var_r24->unk4 = Hu3DModelLink(var_r27); + Hu3DModelLayerSet(var_r24->unk4, 2); + Hu3DModelAttrSet(var_r24->unk4, 1); + } + Hu3DModelKill(var_r27); + arg0->func = fn_1_BF20; +} + +Vec lbl_1_data_8D8[4][2] = { + { + { -967.0f, -80.0f, -312.0f }, + { -867.0f, -80.0f, -485.0f }, + }, + { + { -917.0f, -80.0f, -857.0f }, + { -817.0f, -80.0f, -1030.0f }, + }, + { + { 967.0f, -80.0f, -312.0f }, + { 867.0f, -80.0f, -485.0f }, + }, + { + { 917.0f, -80.0f, -857.0f }, + { 817.0f, -80.0f, -1030.0f }, + }, +}; + +void fn_1_BF20(omObjData* arg0) { + Mtx sp5C; + Mtx sp2C; + Vec sp20; + Vec sp14; + Vec sp8; + f32 temp_f29; + f32 temp_f30; + f32 temp_f31; + s32 var_r29; + M438MapStruct2* var_r31; + M438MapStruct* var_r30; + M438MapStruct3* temp_r28; + + temp_r28 = arg0->data; + temp_r28->unk0++; + var_r31 = &temp_r28->unk4; + + for (var_r29 = 0; var_r29 < 0x20; var_r29++, var_r31++) { + if ((var_r31->unk0 == 0) && (var_r31->unk4 != 0)) { + temp_f29 = var_r31->unk30.y; + PSVECAdd(&var_r31->unk30, &var_r31->unk3C, &var_r31->unk30); + var_r31->unk3C.x *= 0.92f; + var_r31->unk3C.z *= 0.92f; + var_r31->unk3C.y += -0.27222225f; + if (temp_f29 > 0.0) { + if (var_r31->unk30.y <= 0.0) { + HuAudFXEmiterPlay(0x6FF, &var_r31->unk30); + } + } + var_r31->unkC += var_r31->unk10; + var_r31->unk14 += var_r31->unk18; + var_r31->unk1C += var_r31->unk20; + sp14.x = sind(90.0f + var_r31->unk8); + sp14.z = cosd(90.0f + var_r31->unk8); + sp14.y = 0.0f; + PSMTXRotAxisRad(sp5C, &sp14, MTXDegToRad(var_r31->unkC)); + sp14.x = sp14.z = 0.0f; + sp14.y = 1.0f; + PSMTXRotAxisRad(sp2C, &sp14, MTXDegToRad(var_r31->unk14)); + PSMTXConcat(sp2C, sp5C, sp5C); + sp14.x = sind(var_r31->unk8); + sp14.z = cosd(var_r31->unk8); + sp14.y = 0.0f; + PSMTXRotAxisRad(sp2C, &sp14, MTXDegToRad(var_r31->unk1C)); + PSMTXConcat(sp2C, sp5C, sp5C); + fn_1_E034(sp5C, &sp20); + var_r31->unk48->unk_28.x = sp20.x; + var_r31->unk48->unk_28.y = sp20.y; + var_r31->unk48->unk_28.z = sp20.z; + PSMTXInverse(sp5C, sp5C); + PSMTXMultVec(sp5C, &var_r31->unk24, &sp8); + var_r31->unk48->unk_1C.x = (var_r31->unk30.x - sp8.x); + var_r31->unk48->unk_1C.y = (var_r31->unk30.y - sp8.y); + var_r31->unk48->unk_1C.z = (var_r31->unk30.z - sp8.z); + if (var_r31->unk30.y < -500.0f) { + var_r31->unk4 = 0; + } + } + } + if ((temp_r28->unk0 & 1) == 0) { + var_r30 = &temp_r28->unk984; + + for (var_r29 = 0; var_r29 < 0x32; var_r29++, var_r30++) { + if (var_r30->unk0 != 0) continue; + var_r30->unk0 = 1; + var_r30->unk18 = frandmod(0x168); + if (frandmod(0x64) < 0x14) { + var_r30->unkC.x = (0.8f * (frandmod(0x7D0) - 0x3E8)); + var_r30->unkC.y = -80.0f; + var_r30->unkC.z = ((-1.2f * frandmod(0x3E8)) - 1000.0f); + } else { + temp_f31 = frandmod(0x168); + temp_f30 = 800.0f + (0.25f * frandmod(0x3E8)); + var_r30->unkC.x = (temp_f30 * sind(temp_f31)); + var_r30->unkC.y = -80.0f; + var_r30->unkC.z = (temp_f30 * cosd(temp_f31)); + } + var_r30->unk20 = (0.1f + (0.0005f * frandmod(0x3E8))); + var_r30->unk1C = 0.0f; + Hu3DModelAttrReset(var_r30->unk4, 1); + Hu3DModelPosSetV(var_r30->unk4, &var_r30->unkC); + Hu3DModelRotSet(var_r30->unk4, 0.0f, var_r30->unk18, 0.0f); + Hu3DModelScaleSet(var_r30->unk4, var_r30->unk1C, var_r30->unk1C, var_r30->unk1C); + break; + } + } + var_r30 = &temp_r28->unk984; + for (var_r29 = 0; var_r29 < 0x32; var_r29++, var_r30++) { + if (var_r30->unk0 != 0) { + var_r30->unk1C += 0.005f; + if (var_r30->unk1C > var_r30->unk20) { + var_r30->unk0 = 0; + Hu3DModelAttrSet(var_r30->unk4, 1); + fn_1_D57C(&Hu3DData[var_r30->unk4].pos, var_r30->unk20); + } + Hu3DModelScaleSet(var_r30->unk4, var_r30->unk1C, var_r30->unk1C, var_r30->unk1C); + } + } + + for (var_r29 = 0; var_r29 < 4; var_r29++) { + PSVECSubtract(&lbl_1_data_8D8[var_r29][1], &lbl_1_data_8D8[var_r29][0], &sp14); + temp_f31 = 0.001f * frandmod(0x3E8); + PSVECScale(&sp14, &sp14, temp_f31); + PSVECAdd(&lbl_1_data_8D8[var_r29][0], &sp14, &sp8); + PSVECScale(&sp8, &sp8, 0.98f); + fn_1_D57C(&sp8, 0.03f); + } + if ((lbl_1_bss_E30 == 0) && (WipeStatGet() == 0)) { + HuAudFXPlay(0x6F9); + HuAudFXPlay(0x6FD); + lbl_1_bss_E30 = 1; + } +} + +void fn_1_C764(ModelData* model, ParticleData* particle, Mtx matrix) { + HsfanimStruct01* var_r31; + s32 var_r29; + u16 temp_r0; + + var_r31 = particle->unk_48; + + for (var_r29 = 0; var_r29 < particle->unk_30; var_r29++, var_r31++) { + if (var_r31->unk00_s16 != 0) { + PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); + var_r31->unk08.x *= 0.95f; + var_r31->unk08.z *= 0.95f; + var_r31->unk08.y += -0.27222225f; + if (var_r31->unk00_s16 < 24.0f) { + var_r31->unk40.a = 0.9f * var_r31->unk40.a; + } + if (--var_r31->unk00_s16 == 0) { + var_r31->unk00 = 0; + var_r31->unk2C = 0.0f; + var_r31->unk40.a = 0; + } + } + } + DCStoreRange(particle->unk_48, particle->unk_30 * 0x44); +} + +void fn_1_C8E8(ModelData* model, ParticleData* particle, Mtx matrix) { + HsfanimStruct01* var_r31; + s32 var_r29; + u16 temp_r0; + + var_r31 = particle->unk_48; + + for (var_r29 = 0; var_r29 < particle->unk_30; var_r29++, var_r31++) { + if (var_r31->unk00_s16 != 0) { + PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); + var_r31->unk08.x *= 0.92f; + var_r31->unk08.z *= 0.92f; + var_r31->unk2C += 5.0f; + var_r31->unk40.a *= 0.99f; + if (var_r31->unk00_s16 < 24.0f) { + var_r31->unk40.a = 0.9f * var_r31->unk40.a; + } + if (--var_r31->unk00_s16 == 0) { + var_r31->unk00 = 0; + var_r31->unk2C = 0.0f; + var_r31->unk40.a = 0; + } + } + } + DCStoreRange(particle->unk_48, particle->unk_30 * 0x44); +} + +void fn_1_CAB0(f32 arg8) { + Vec sp8; + f32 temp_f31; + f32 temp_f30; + f32 temp_f28; + f32 temp_f27; + HsfanimStruct01* var_r31; + s32 var_r30; + u32 var_r29; + + temp_f28 = 20.0f; + temp_f27 = 7.0f; + var_r29 = 0x19; + + for (var_r30 = 0; var_r30 < 0x96; var_r30++) { + var_r31 = lbl_1_bss_E34[var_r30]; + if (var_r31->unk00_s16 == 0) { + var_r31->unk00_s16 = 60.0f * (0.6f + (0.0006f * frandmod(0x3E8))); + temp_f31 = ((0.002f * frandmod(0x3E8)) - 1.0f); + temp_f31 = arg8 + (temp_f31 * temp_f28); + sp8.x = sind(temp_f31); + sp8.y = 0.0f; + sp8.z = cosd(temp_f31); + + temp_f31 = arg8 + (((0.002f * frandmod(0x3E8)) - 1.0f)) * temp_f27; + var_r31->unk34.x = 7.5 * sind(temp_f31) * 100.0; + var_r31->unk34.y = 0.2f * frandmod(0x3E8); + var_r31->unk34.z = 7.5 * cosd(temp_f31) * 100.0; + + temp_f30 = 1.6666667f * (4.0f + (0.014f * frandmod(0x3E8))); + var_r31->unk08.x = sp8.x * temp_f30; + var_r31->unk08.z = sp8.z * temp_f30; + var_r31->unk08.y = temp_f30 * ((0.0006f * frandmod(0x3E8)) - 0.2f); + + var_r31->unk30 = frandmod(0x168); + var_r31->unk2C = 10.0f + frandmod(0x32); + var_r31->unk40.a = 0xFA; + var_r31->unk40.r = var_r31->unk40.g = var_r31->unk40.b = 0xFF; + + var_r29--; + if (var_r29 < 1) break; + } + } + var_r31 = ((ParticleData*)(Hu3DData[lbl_1_bss_108C[0]->model[6]].unk_120))->unk_48; + var_r29 = 0xF; + for (var_r30 = 0; var_r30 < 0x32; var_r30++, var_r31++) { + if (var_r31->unk00_s16 == 0) { + var_r31->unk00_s16 = 60.0f * (0.6f + (0.0006f * frandmod(0x3E8))); + temp_f31 = ((0.002f * frandmod(0x3E8)) - 1.0f); + temp_f31 = arg8 + (temp_f31 * temp_f28); + sp8.x = sind(temp_f31); + sp8.y = 0.0f; + sp8.z = cosd(temp_f31); + + temp_f31 = arg8 + (((0.002f * frandmod(0x3E8)) - 1.0f)) * temp_f27; + var_r31->unk34.x = 7.5 * sind(temp_f31) * 100.0; + var_r31->unk34.y = 0.2f * frandmod(0x3E8); + var_r31->unk34.z = 7.5 * cosd(temp_f31) * 100.0; + + temp_f30 = 1.6666667f * -(0.01f * frandmod(0x3E8)); + var_r31->unk08.x = sp8.x * temp_f30; + var_r31->unk08.z = sp8.z * temp_f30; + var_r31->unk08.y = temp_f30 * -((0.00020000001f * frandmod(0x3E8)) + 0.05f); + + var_r31->unk30 = frandmod(0x168); + var_r31->unk2C = 100.0f + frandmod(0x64); + var_r31->unk40.a = 0x50 + frandmod(0x50); + temp_f31 = frandmod(0x3E8) * 0.001f; + var_r31->unk40.r = (60.0f * temp_f31) + 80.0f; + var_r31->unk40.g = (60.0f * temp_f31) + 61.0f; + var_r31->unk40.b = (60.0f * temp_f31) + 54.0f; + + var_r29--; + if (var_r29 < 1) break; + } + } +} + +void fn_1_D3FC(ModelData* model, ParticleData* particle, Mtx matrix) { + HsfanimStruct01* var_r31; + s32 var_r29; + u16 temp_r0; + + lbl_1_bss_E2C = 0; + var_r31 = particle->unk_48; + for (var_r29 = 0; var_r29 < particle->unk_30; var_r29++, var_r31++) { + if (var_r31->unk00_s16 != 0) { + PSVECAdd(&var_r31->unk34, &var_r31->unk08, &var_r31->unk34); + var_r31->unk08.y += -0.27222225f; + if (var_r31->unk00_s16 < 12.0f) { + var_r31->unk40.a = (0.8f * var_r31->unk40.a); + } + if (--var_r31->unk00_s16 == 0) { + var_r31->unk00_s16 = 0; + var_r31->unk2C = 0.0f; + var_r31->unk40.a = 0; + } + lbl_1_bss_E2C++; + } + } + DCStoreRange(particle->unk_48, particle->unk_30 * 0x44); +} + +void fn_1_D57C(Vec* arg0, f32 arg1) { + Vec sp8; + f32 temp_f31; + f32 temp_f29; + HsfanimStruct01* var_r31; + s32 var_r30; + u32 var_r29; + + var_r31 = ((ParticleData*)(Hu3DData[lbl_1_bss_108C[0]->model[7]].unk_120))->unk_48; + var_r29 = (u32)(3.0f + (15.0f * arg1)); + + for (var_r30 = 0; var_r30 < 0x1F4; var_r30++, var_r31++) { + if (var_r31->unk00_s16 == 0) { + var_r31->unk00_s16 = 60.0f * (0.3f + (0.0003f * frandmod(0x3E8))); + var_r31->unk34 = *arg0; + var_r31->unk34.x += arg1 * (0.07f * (frandmod(0x3E8) - 0x1F4)); + var_r31->unk34.z += arg1 * (0.07f * (frandmod(0x3E8) - 0x1F4)); + + temp_f31 = frandmod(0x168); + sp8.x = sind(temp_f31); + sp8.y = 0.0f; + sp8.z = cosd(temp_f31); + + temp_f29 = 1.6666667f * (0.5f + (0.001f * frandmod(0x3E8))); + var_r31->unk08.x = sp8.x * temp_f29; + var_r31->unk08.z = sp8.z * temp_f29; + var_r31->unk08.y = 1.6666667f * ((2.0f * arg1) + (1.0f + (0.002f * frandmod(0x3E8)))); + var_r31->unk30 = frandmod(0x168); + var_r31->unk2C = (20.0f + frandmod(0x14)); + var_r31->unk40.a = (frandmod(0x46) + 0x64); + + temp_f31 = 0.001f * frandmod(0x3E8); + var_r31->unk40.r = 177.0f + (78.0f * temp_f31); + var_r31->unk40.g = 60.0f + (129.0f * temp_f31); + var_r31->unk40.b = 30.0f + (122.0f * temp_f31); + + var_r29--; + if (var_r29 < 1) break; + } + } +} + +s32 fn_1_DA64(f32 arg8) { + M438MapStruct3* var_r28; + s32 var_r29; + s32 var_r30; + M438MapStruct2* var_r31; + float var_f31; + float var_f29; + + var_r28 = lbl_1_bss_108C[0]->data; + var_r29 = 0; + var_r31 = &var_r28->unk4; + + for (var_r30 = 0; var_r30 < 0x20; var_r30++, var_r31++) { + var_f31 = fn_1_E5A4(var_r31->unk8, arg8); + if ((fabs(var_f31) < 12.0) && (var_r31->unk0 != 0)) { + var_r31->unk0 = 0; + var_r31->unk4 = 1; + var_r31->unk30 = var_r31->unk24; + var_r31->unk3C.y = (1.6666667f * (2.0f + (0.002f * frandmod(0x3E8)))); + var_r31->unk3C.x = (1.6666667461395264f * (sind(var_r31->unk8) * (10.0f + (0.006f * frandmod(0x3E8))))); + var_r31->unk3C.z = (1.6666667461395264f * (cosd(var_r31->unk8) * (10.0f + (0.006f * frandmod(0x3E8))))); + var_r31->unkC = var_r31->unk14 = var_r31->unk1C = 0.0f; + var_r31->unk10 = (0.016666668f * (10.0f + (0.05f * frandmod(0x3E8)))); + var_r31->unk18 = (0.016666668f * (30.0f + (0.05f * frandmod(0x3E8)))); + var_r31->unk20 = (0.016666668f * (10.0f + (0.02f * frandmod(0x3E8)))); + if (frandmod(0x64) < 0x50) { + var_r31->unk10 *= -1.0f; + } + if (frandmod(0x64) < 0x32) { + var_r31->unk18 *= -1.0f; + } + if (frandmod(0x64) < 0x32) { + var_r31->unk20 *= -1.0f; + } + fn_1_CAB0(var_r31->unk8); + var_r29 = 1; + } + } + return var_r29; +} + +s32 fn_1_DEA0(f32 arg8) { + M438MapStruct3* var_r28; + s32 var_r29; + s32 var_r30; + M438MapStruct2* var_r31; + f32 var_f31; + + var_r28 = lbl_1_bss_108C[0]->data; + var_r29 = 0; + var_r31 = &var_r28->unk4; + + for (var_r30 = 0; var_r30 < 0x20; var_r30++, var_r31++) { + var_f31 = fn_1_E5A4(var_r31->unk8, arg8); + if ((fabs(var_f31) < 8.0) && (var_r31->unk0 != 0)) { + var_r29 = 1; + break; + } + } + return var_r29; +} + +f32 fn_1_DF70(f32 arg8, f32 arg9) { + f32 temp_f30; + f32 var_f31; + + temp_f30 = 360.0f; + var_f31 = 180.0 * (atan2f(arg9, arg8) / M_PI); + if (var_f31 < 0.0f) { + var_f31 += temp_f30; + } else if (var_f31 >= temp_f30) { + var_f31 -= temp_f30; + } + return var_f31; +} + +void fn_1_E034(Mtx arg0, Vec* arg1) { + f32 var_f26; + f32 temp_f25; + + arg1->x = fn_1_DF70(arg0[2][2], arg0[1][2]); + arg1->z = fn_1_DF70(arg0[0][0], arg0[0][1]); + temp_f25 = -arg0[0][2]; + var_f26 = sqrtf(fabs(1.0 - (temp_f25 * temp_f25))); + if ((arg1->x > 90.0f) && (arg1->x < 270.0f) && (arg1->z > 90.0f) && (arg1->z < 270.0f)) { + arg1->x = fmod((180.0f + arg1->x), 360.0); + arg1->z = fmod((180.0f + arg1->z), 360.0); + var_f26 = -var_f26; + } + arg1->y = fn_1_DF70(var_f26, temp_f25); +} + +f32 fn_1_E488(f32 arg8, f32 arg9, f32 argA) { + f32 var_f31; + + var_f31 = fmodf((arg9 - arg8), 360.0); + if (var_f31 < 0.0f) { + var_f31 += 360.0f; + } + if (var_f31 > 180.0f) { + var_f31 -= 360.0f; + } + var_f31 = fmodf((arg8 + (argA * var_f31)), 360.0); + if (var_f31 < 0.0f) { + var_f31 += 360.0f; + } + return var_f31; +} + +f32 fn_1_E5A4(f32 arg8, f32 arg9) { + f32 var_f31; + + var_f31 = fmodf((arg9 - arg8), 360.0); + if (var_f31 < 0.0f) { + var_f31 += 360.0f; + } + if (var_f31 > 180.0f) { + var_f31 -= 360.0f; + } + return var_f31; +}