From b756f914dea24194ded2407932b86fd59b245835 Mon Sep 17 00:00:00 2001 From: CreateSource Date: Sat, 29 Jun 2024 22:54:16 -0400 Subject: [PATCH] match m409/main.c --- config/GMPE01_00/rels/m409Dll/symbols.txt | 183 ++-- configure.py | 2 +- include/REL/m409Dll.h | 115 ++- include/ext_math.h | 1 + src/REL/m409Dll/main.c | 1003 ++++++++++++++++++++- 5 files changed, 1189 insertions(+), 115 deletions(-) diff --git a/config/GMPE01_00/rels/m409Dll/symbols.txt b/config/GMPE01_00/rels/m409Dll/symbols.txt index b79b1e92..56b2975f 100644 --- a/config/GMPE01_00/rels/m409Dll/symbols.txt +++ b/config/GMPE01_00/rels/m409Dll/symbols.txt @@ -114,90 +114,90 @@ fn_1_F478 = .text:0x0000F478; // type:function size:0x78 fn_1_F4F0 = .text:0x0000F4F0; // type:function size:0x98 _ctors = .ctors:0x00000000; // type:label scope:global data:4byte _dtors = .dtors:0x00000000; // type:label scope:global data:4byte -lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 data:float -lbl_1_rodata_14 = .rodata:0x00000014; // type:object size:0x4 data:float -lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x4 data:float -lbl_1_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 data:float -lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 data:float -lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 data:float -lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x4 data:float -lbl_1_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 data:float -lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x4 data:float -lbl_1_rodata_34 = .rodata:0x00000034; // type:object size:0x4 data:float -lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x4 data:float -lbl_1_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 data:float -lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x4 data:float -lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0x4 data:float -lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x8 data:double -lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 data:float -lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x8 data:double -lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 data:float -lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 data:float -lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x4 data:float -lbl_1_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 data:float -lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x4 data:float -lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0x4 data:float -lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x4 data:float -lbl_1_rodata_7C = .rodata:0x0000007C; // type:object size:0x4 data:float -lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0x4 data:float -lbl_1_rodata_84 = .rodata:0x00000084; // type:object size:0x4 data:float -lbl_1_rodata_88 = .rodata:0x00000088; // type:object size:0x4 data:float -lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x8 data:double -lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 data:float -lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 data:float -lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 data:float -lbl_1_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 data:float -lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 data:float -lbl_1_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 data:float -lbl_1_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 data:float -lbl_1_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 data:float -lbl_1_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 data:float -lbl_1_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 data:float -lbl_1_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 data:float -lbl_1_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 data:float -lbl_1_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 data:float -lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 data:float -lbl_1_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 data:float -lbl_1_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 data:float -lbl_1_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 data:float -lbl_1_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 data:float -lbl_1_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 data:float -lbl_1_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 data:float -lbl_1_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 data:float -lbl_1_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 data:float -lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 data:float -lbl_1_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 data:float -lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 data:float -lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 data:float -lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 data:float -lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 data:float -lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 data:float -lbl_1_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 data:float -lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x4 data:float -lbl_1_rodata_114 = .rodata:0x00000114; // type:object size:0x4 data:float -lbl_1_rodata_118 = .rodata:0x00000118; // type:object size:0x4 data:float -lbl_1_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 data:float -lbl_1_rodata_120 = .rodata:0x00000120; // type:object size:0x4 data:float -lbl_1_rodata_128 = .rodata:0x00000128; // type:object size:0x8 data:double -lbl_1_rodata_130 = .rodata:0x00000130; // type:object size:0x4 data:float -lbl_1_rodata_134 = .rodata:0x00000134; // type:object size:0x4 data:float -lbl_1_rodata_138 = .rodata:0x00000138; // type:object size:0x4 data:float -lbl_1_rodata_140 = .rodata:0x00000140; // type:object size:0x8 data:double -lbl_1_rodata_148 = .rodata:0x00000148; // type:object size:0x8 data:double -lbl_1_rodata_150 = .rodata:0x00000150; // type:object size:0x4 data:float -lbl_1_rodata_154 = .rodata:0x00000154; // type:object size:0x4 data:float -lbl_1_rodata_158 = .rodata:0x00000158; // type:object size:0x4 data:float -lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x8 data:double -lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x8 data:double -lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x4 data:float -lbl_1_rodata_174 = .rodata:0x00000174; // type:object size:0x4 data:float -lbl_1_rodata_178 = .rodata:0x00000178; // type:object size:0x8 data:double -lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x8 data:double -lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x8 data:double -lbl_1_rodata_190 = .rodata:0x00000190; // type:object size:0x4 data:float -lbl_1_rodata_194 = .rodata:0x00000194; // type:object size:0x4 data:float -lbl_1_rodata_198 = .rodata:0x00000198; // type:object size:0x4 data:float -lbl_1_rodata_19C = .rodata:0x0000019C; // type:object size:0x4 data:float +lbl_1_rodata_10 = .rodata:0x00000010; // type:object size:0x4 scope:local data:float +lbl_1_rodata_14 = .rodata:0x00000014; // type:object size:0x4 scope:local data:float +lbl_1_rodata_18 = .rodata:0x00000018; // type:object size:0x4 scope:local data:float +lbl_1_rodata_1C = .rodata:0x0000001C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_20 = .rodata:0x00000020; // type:object size:0x4 scope:local data:float +lbl_1_rodata_24 = .rodata:0x00000024; // type:object size:0x4 scope:local data:float +lbl_1_rodata_28 = .rodata:0x00000028; // type:object size:0x4 scope:local data:float +lbl_1_rodata_2C = .rodata:0x0000002C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_30 = .rodata:0x00000030; // type:object size:0x4 scope:local data:float +lbl_1_rodata_34 = .rodata:0x00000034; // type:object size:0x4 scope:local data:float +lbl_1_rodata_38 = .rodata:0x00000038; // type:object size:0x4 scope:local data:float +lbl_1_rodata_3C = .rodata:0x0000003C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_40 = .rodata:0x00000040; // type:object size:0x4 scope:local data:float +lbl_1_rodata_44 = .rodata:0x00000044; // type:object size:0x4 scope:local data:float +lbl_1_rodata_48 = .rodata:0x00000048; // type:object size:0x8 scope:local data:double +lbl_1_rodata_50 = .rodata:0x00000050; // type:object size:0x4 scope:local data:float +lbl_1_rodata_58 = .rodata:0x00000058; // type:object size:0x8 scope:local data:double +lbl_1_rodata_60 = .rodata:0x00000060; // type:object size:0x4 scope:local data:float +lbl_1_rodata_64 = .rodata:0x00000064; // type:object size:0x4 scope:local data:float +lbl_1_rodata_68 = .rodata:0x00000068; // type:object size:0x4 scope:local data:float +lbl_1_rodata_6C = .rodata:0x0000006C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_70 = .rodata:0x00000070; // type:object size:0x4 scope:local data:float +lbl_1_rodata_74 = .rodata:0x00000074; // type:object size:0x4 scope:local data:float +lbl_1_rodata_78 = .rodata:0x00000078; // type:object size:0x4 scope:local data:float +lbl_1_rodata_7C = .rodata:0x0000007C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_80 = .rodata:0x00000080; // type:object size:0x4 scope:local data:float +lbl_1_rodata_84 = .rodata:0x00000084; // type:object size:0x4 scope:local data:float +lbl_1_rodata_88 = .rodata:0x00000088; // type:object size:0x4 scope:local data:float +lbl_1_rodata_90 = .rodata:0x00000090; // type:object size:0x8 scope:local data:double +lbl_1_rodata_98 = .rodata:0x00000098; // type:object size:0x4 scope:local data:float +lbl_1_rodata_9C = .rodata:0x0000009C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A0 = .rodata:0x000000A0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A4 = .rodata:0x000000A4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_A8 = .rodata:0x000000A8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_AC = .rodata:0x000000AC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_B0 = .rodata:0x000000B0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_B4 = .rodata:0x000000B4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_B8 = .rodata:0x000000B8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_BC = .rodata:0x000000BC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_C0 = .rodata:0x000000C0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_C4 = .rodata:0x000000C4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_C8 = .rodata:0x000000C8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_CC = .rodata:0x000000CC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D0 = .rodata:0x000000D0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D4 = .rodata:0x000000D4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_D8 = .rodata:0x000000D8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_DC = .rodata:0x000000DC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E0 = .rodata:0x000000E0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E4 = .rodata:0x000000E4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_E8 = .rodata:0x000000E8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_EC = .rodata:0x000000EC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F0 = .rodata:0x000000F0; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F4 = .rodata:0x000000F4; // type:object size:0x4 scope:local data:float +lbl_1_rodata_F8 = .rodata:0x000000F8; // type:object size:0x4 scope:local data:float +lbl_1_rodata_FC = .rodata:0x000000FC; // type:object size:0x4 scope:local data:float +lbl_1_rodata_100 = .rodata:0x00000100; // type:object size:0x4 scope:local data:float +lbl_1_rodata_104 = .rodata:0x00000104; // type:object size:0x4 scope:local data:float +lbl_1_rodata_108 = .rodata:0x00000108; // type:object size:0x4 scope:local data:float +lbl_1_rodata_10C = .rodata:0x0000010C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_110 = .rodata:0x00000110; // type:object size:0x4 scope:local data:float +lbl_1_rodata_114 = .rodata:0x00000114; // type:object size:0x4 scope:local data:float +lbl_1_rodata_118 = .rodata:0x00000118; // type:object size:0x4 scope:local data:float +lbl_1_rodata_11C = .rodata:0x0000011C; // type:object size:0x4 scope:local data:float +lbl_1_rodata_120 = .rodata:0x00000120; // type:object size:0x4 scope:local data:float +lbl_1_rodata_128 = .rodata:0x00000128; // type:object size:0x8 scope:local data:double +lbl_1_rodata_130 = .rodata:0x00000130; // type:object size:0x4 scope:local data:float +lbl_1_rodata_134 = .rodata:0x00000134; // type:object size:0x4 scope:local data:float +lbl_1_rodata_138 = .rodata:0x00000138; // type:object size:0x4 scope:local data:float +lbl_1_rodata_140 = .rodata:0x00000140; // type:object size:0x8 scope:local data:double +lbl_1_rodata_148 = .rodata:0x00000148; // type:object size:0x8 scope:local data:double +lbl_1_rodata_150 = .rodata:0x00000150; // type:object size:0x4 scope:local data:float +lbl_1_rodata_154 = .rodata:0x00000154; // type:object size:0x4 scope:local data:float +lbl_1_rodata_158 = .rodata:0x00000158; // type:object size:0x4 scope:local data:float +lbl_1_rodata_160 = .rodata:0x00000160; // type:object size:0x8 scope:local data:double +lbl_1_rodata_168 = .rodata:0x00000168; // type:object size:0x8 scope:local data:double +lbl_1_rodata_170 = .rodata:0x00000170; // type:object size:0x4 scope:local data:float +lbl_1_rodata_174 = .rodata:0x00000174; // type:object size:0x4 scope:local data:float +lbl_1_rodata_178 = .rodata:0x00000178; // type:object size:0x8 scope:local data:double +lbl_1_rodata_180 = .rodata:0x00000180; // type:object size:0x8 scope:local data:double +lbl_1_rodata_188 = .rodata:0x00000188; // type:object size:0x8 scope:local data:double +lbl_1_rodata_190 = .rodata:0x00000190; // type:object size:0x4 scope:local data:float +lbl_1_rodata_194 = .rodata:0x00000194; // type:object size:0x4 scope:local data:float +lbl_1_rodata_198 = .rodata:0x00000198; // type:object size:0x4 scope:local data:float +lbl_1_rodata_19C = .rodata:0x0000019C; // type:object size:0x4 scope:local data:float lbl_1_rodata_1A0 = .rodata:0x000001A0; // type:object size:0x30 data:4byte lbl_1_rodata_1D0 = .rodata:0x000001D0; // type:object size:0x100 lbl_1_rodata_2D0 = .rodata:0x000002D0; // type:object size:0x4 data:float @@ -289,12 +289,12 @@ lbl_1_data_40 = .data:0x00000040; // type:object size:0xC lbl_1_data_4C = .data:0x0000004C; // type:object size:0x70 data:float lbl_1_data_BC = .data:0x000000BC; // type:object size:0x4 data:4byte lbl_1_data_C0 = .data:0x000000C0; // type:object size:0x4 data:4byte -lbl_1_data_C4 = .data:0x000000C4; // type:object size:0x9 data:string -lbl_1_data_CD = .data:0x000000CD; // type:object size:0x9 data:string -lbl_1_data_D6 = .data:0x000000D6; // type:object size:0x3 data:string -lbl_1_data_D9 = .data:0x000000D9; // type:object size:0x10 data:string -lbl_1_data_E9 = .data:0x000000E9; // type:object size:0x26 data:string -lbl_1_data_10F = .data:0x0000010F; // type:object size:0x24 data:string +lbl_1_data_C4 = .data:0x000000C4; // type:object size:0x9 scope:local data:string +lbl_1_data_CD = .data:0x000000CD; // type:object size:0x9 scope:local data:string +lbl_1_data_D6 = .data:0x000000D6; // type:object size:0x3 scope:local data:string +lbl_1_data_D9 = .data:0x000000D9; // type:object size:0x10 scope:local data:string +lbl_1_data_E9 = .data:0x000000E9; // type:object size:0x26 scope:local data:string +lbl_1_data_10F = .data:0x0000010F; // type:object size:0x24 scope:local data:string lbl_1_data_138 = .data:0x00000138; // type:object size:0x4 lbl_1_data_13C = .data:0x0000013C; // type:object size:0x1C lbl_1_data_158 = .data:0x00000158; // type:object size:0x20 @@ -318,7 +318,8 @@ lbl_1_bss_20 = .bss:0x00000020; // type:object size:0x1 data:byte lbl_1_bss_21 = .bss:0x00000021; // type:object size:0x1 data:byte lbl_1_bss_24 = .bss:0x00000024; // type:object size:0x18 data:4byte lbl_1_bss_3C = .bss:0x0000003C; // type:object size:0x4 data:4byte -lbl_1_bss_40 = .bss:0x00000040; // type:object size:0x9C data:2byte +lbl_1_bss_40 = .bss:0x00000040; // type:object size:0x90 data:2byte +lbl_1_bss_D0 = .bss:0x000000D0; // type:object size:0xC data:float lbl_1_bss_DC = .bss:0x000000DC; // type:object size:0x4 data:4byte lbl_1_bss_E0 = .bss:0x000000E0; // type:object size:0x4 data:4byte lbl_1_bss_E4 = .bss:0x000000E4; // type:object size:0x2 data:2byte diff --git a/configure.py b/configure.py index 6d6cd6e1..774a1a68 100644 --- a/configure.py +++ b/configure.py @@ -893,7 +893,7 @@ config.libs = [ "m409Dll", objects={ Object(Matching, "REL/executor.c"), - Object(NonMatching, "REL/m409Dll/main.c"), + Object(Matching, "REL/m409Dll/main.c"), Object(NonMatching, "REL/m409Dll/player.c"), Object(NonMatching, "REL/m409Dll/cursor.c"), }, diff --git a/include/REL/m409Dll.h b/include/REL/m409Dll.h index ef062913..f917634f 100644 --- a/include/REL/m409Dll.h +++ b/include/REL/m409Dll.h @@ -1,9 +1,12 @@ #include "dolphin.h" + #include "game/object.h" #include "game/animdata.h" +#include "game/hsfanim.h" +extern s32 rand8(void); // types -typedef void (*m409VoidFunc)(void); +typedef void (*m409Func6)(ModelData*, struct _unkStruct6*, Mtx); typedef struct _unkStruct { f32 zoom; @@ -17,10 +20,12 @@ typedef struct _unkStruct2 { } unkStruct2; // sizeof 0x10 typedef struct _unkStruct3 { - char unk0[0x2]; + s8 unk0; + s8 unk1; s16 unk2; - s16 unk4; - char unk6[0x8]; + struct _unkStruct4* unk4; + s16 unk8; + s16 unkA; s16 unkC; s16 unkE; s16 unk10; @@ -28,12 +33,79 @@ typedef struct _unkStruct3 { f32 unk14; } unkStruct3; +typedef struct _unkStruct4 { + union { + u16 unk0; + u8 unk0b; + }; + s16 unk2; + s16 unk4; + s16 unk6; + s16 unk8; + s16 unkA; + s16 unkC; + s16 unkE; + f32 unk10; + s16 unk14; + s16 unk16; + f32 unk18; + f32 unk1C; + struct _unkStruct4* unk20; +} unkStruct4; // sizeof 0x24 + +typedef struct _unkStruct5 { + Vec unk0; + Vec unkC; + f32 unk18; + f32 unk1C; + f32 unk20; + f32 unk24; + s16 unk28; + s16 unk2A; + s16 unk2C; + s16 unk2E; + f32 unk30; + Vec unk34; + Vec unk40; + s16 unk4C; + s8 unk4E; +} unkStruct5; + +typedef struct _unkStruct6 { + s16 unk0; + s16 unk2; + u32 unk4; + u8 unk8; + m409Func6 unkC; + AnimData* unk10; + s16 unk14; + unkStruct5* unk18; + Vec* unk1C; + HsfVector2f* unk20; + GXColor* unk24; + void* unk28; + Vec unk2C; + Vec unk38; + Vec unk44; + Vec unk50; + HsfVector2f* unk5C; + f32 unk60; + f32 unk64; +} unkStruct6; + // bss extern Process* lbl_1_bss_E8; extern s16 lbl_1_bss_E4; extern omObjData* lbl_1_bss_E0; extern omObjData* lbl_1_bss_DC; +extern Vec lbl_1_bss_D0; +extern unkStruct4 lbl_1_bss_40[4]; +extern s32 lbl_1_bss_3C; extern unkStruct3 lbl_1_bss_24; +extern s8 lbl_1_bss_21; +extern u8 lbl_1_bss_20; +extern f32 lbl_1_bss_1C; +extern f32 lbl_1_bss_18; extern s16 lbl_1_bss_16; extern s8 lbl_1_bss_14; extern f32 lbl_1_bss_10; @@ -67,19 +139,30 @@ extern void fn_1_F70(omObjData* object); extern s8 fn_1_10E8(omObjData* object); extern s8 fn_1_1B74(omObjData* object); extern void fn_1_2098(omObjData* object); +extern void fn_1_2414(u16, u16); +extern u16 fn_1_2454(u16); extern void fn_1_2484(omObjData* object); +extern void fn_1_2DCC(omObjData* object); extern void fn_1_3840(void); +extern void fn_1_3988(unkStruct4*, s16, s16); +extern s32 fn_1_3AD8(s32, f32, f32, f32, f32, f32, f32); +extern void fn_1_40A4(Mtx, Mtx); extern f32 fn_1_4120(f32, f32, f32, f32); -extern void fn_1_4FFC(s16, f32, f32, f32, u8); -extern void fn_1_5408(void); -extern void fn_1_55E0(void); -extern void fn_1_67E0(Process*); -extern void fn_1_6900(void); -// ... -extern void fn_1_2414(s32, s32); -extern u16 fn_1_2454(s32); -extern s16 fn_1_5A18(AnimData*, s32, f32, s32, s32); -extern void fn_1_5FBC(s16, m409VoidFunc); -extern void fn_1_5FF4(s16, s32); +extern void fn_1_417C(void); +extern void fn_1_44F0(s16, f32, f32, f32, s8, s16); +extern void fn_1_4FFC(s16, f32, f32, f32, s16); +extern void fn_1_5408(ModelData*, struct _unkStruct6*, Mtx); +extern void fn_1_55E0(ModelData*, struct _unkStruct6*, Mtx); +extern void fn_1_57DC(ModelData*, struct _unkStruct6*, Mtx); +extern unkStruct5* fn_1_58E0(s16, Vec*, Vec*, f32, GXColor*); +extern s16 fn_1_5A18(AnimData*, s16, f32, s16, s16); extern void fn_1_5F5C(s16); -extern void fn_1_44F0(s16, f32, f32, f32, s32, s32); \ No newline at end of file +extern void fn_1_5FBC(s16, m409Func6); +extern void fn_1_5FF4(s16, u8); +extern void fn_1_602C(ModelData*, Mtx); +extern void fn_1_6608(HsfVector2f*, s16, s16, f32, f32); +extern void fn_1_66D4(HsfVector2f*, HsfVector2f*, s16, f32, f32); +extern void fn_1_6778(Vec*, Vec*, Vec*, s16); +// player.c +extern void fn_1_67E0(Process*); +extern void fn_1_6900(void); \ No newline at end of file diff --git a/include/ext_math.h b/include/ext_math.h index 5cb24432..4651c2c4 100644 --- a/include/ext_math.h +++ b/include/ext_math.h @@ -24,6 +24,7 @@ typedef struct vec2f { #define VECMag2Point(a) (((a)->x*(a)->x)+((a)->y*(a)->y)+((a)->z*(a)->z)) #define VECMagPoint(x, y, z) sqrtf(((x)*(x))+((y)*(y))+((z)*(z))) +// #define sqrtDist3D(x, y, z) sqrtf(x * x + y * y + z * z) #define sind(x) sin(M_PI*(x)/180.0) #define cosd(x) cos(M_PI*(x)/180.0) diff --git a/src/REL/m409Dll/main.c b/src/REL/m409Dll/main.c index a2756660..d056cc79 100644 --- a/src/REL/m409Dll/main.c +++ b/src/REL/m409Dll/main.c @@ -17,7 +17,15 @@ Process* lbl_1_bss_E8; s16 lbl_1_bss_E4; omObjData* lbl_1_bss_E0; omObjData* lbl_1_bss_DC; +Vec lbl_1_bss_D0; +unkStruct4 lbl_1_bss_40[4]; +s32 lbl_1_bss_3C; unkStruct3 lbl_1_bss_24; +s8 lbl_1_bss_21; +u8 lbl_1_bss_20; +f32 lbl_1_bss_1C; +f32 lbl_1_bss_18; +s16 lbl_1_bss_16; s8 lbl_1_bss_14; f32 lbl_1_bss_10; f32 lbl_1_bss_C; @@ -253,7 +261,6 @@ void fn_1_F70(omObjData* object) { s8 fn_1_10E8(omObjData* object) { Vec sp8; ModelData* temp_r31; - f32 temp_f1; f32 var_f26; f32 var_f27; f32 temp_f29; @@ -261,7 +268,6 @@ s8 fn_1_10E8(omObjData* object) { f32 temp_f30; f32 var_f31; s8 var_r29; - u8 temp_r0; unkStruct3* temp_r30; temp_r31 = &Hu3DData[lbl_1_bss_DC->model[4]]; @@ -332,11 +338,11 @@ s8 fn_1_10E8(omObjData* object) { temp_f29 = 20.0f + temp_r31->pos.y; temp_f28 = 95.0f + temp_r31->pos.z; var_f31 = 1.0f - (lbl_1_bss_C - 3.5f); - fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (s8)(2.0f * var_f31)); + fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (u8)(2.0f * var_f31)); temp_f30 = 370.0f + temp_r31->pos.x; - fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (s8)var_f31); + fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (u8)var_f31); temp_f30 = 490.0f + temp_r31->pos.x; - fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (s8)var_f31); + fn_1_4FFC(lbl_1_bss_E0->model[1], temp_f30, temp_f29, temp_f28, (u8)var_f31); } } if (++lbl_1_bss_14 > 1) { @@ -375,9 +381,9 @@ s8 fn_1_1B74(omObjData* object) { f32 temp_f31; s16 temp_r27; s32 temp_r28; - unkStruct3* temp_r30; + unkStruct4* temp_r30; - temp_r30 = (unkStruct3*)object->data; + temp_r30 = (unkStruct4*)object->data; switch (lbl_1_bss_8) { case 0: temp_r30->unk2 = MGSeqCreate(3, 1); @@ -424,4 +430,987 @@ s8 fn_1_1B74(omObjData* object) { break; } return 0; +} + +void fn_1_2098(omObjData* object) { + ModelData* temp_r31; + f32 var_f28; + f32 var_f29; + f32 var_f31; + f32 var_f30; + s32 var_r30; + + temp_r31 = &Hu3DData[lbl_1_bss_DC->model[4]]; + if (fn_1_2454(0x18) != 0x18) { + lbl_1_bss_18 += 0.008f; + if (lbl_1_bss_18 >= 1.0f) { + fn_1_2414(0x60, 0x40); + Hu3DModelAttrSet(lbl_1_bss_DC->model[4], 1U); + lbl_1_bss_18 = 1.0f; + } + var_f31 = sin((M_PI * (90.0f * lbl_1_bss_18)) / 180.0); + var_f29 = -1030.0f; + var_f28 = -1880.0f; + var_f30 = var_f29 + (var_f31 * (var_f28 - var_f29)); + Hu3DModelPosSet(lbl_1_bss_DC->model[4], var_f30, 0.0f, -1200.0f); + Hu3DMotionSpeedSet(lbl_1_bss_DC->model[4], 3.0f * var_f31); + var_f31 = (4.0f * (9.0f * lbl_1_bss_18)); + fn_1_44F0(lbl_1_bss_E0->model[0], 0.0f, 0.0f, 0.0f, 0, var_f31); + fn_1_44F0(lbl_1_bss_E0->model[0], 190.0f + var_f30, 15.0f, 95.0f + temp_r31->pos.z, 1, 1); + fn_1_44F0(lbl_1_bss_E0->model[0], 370.0f + var_f30, 15.0f, 95.0f + temp_r31->pos.z, 1, 1); + fn_1_44F0(lbl_1_bss_E0->model[0], 490.0f + var_f30, 15.0f, 95.0f + temp_r31->pos.z, 1, 1); + } +} + +void fn_1_23EC(s16 arg0) { + unkStruct4* var_r31; + + var_r31 = (unkStruct4*)lbl_1_bss_E0->data; + var_r31->unk4 = arg0; +} + +void fn_1_2414(u16 arg0, u16 arg1) { + unkStruct4* var_r31; + + var_r31 = (unkStruct4*)lbl_1_bss_E0->data; + var_r31->unk0 &= ~arg0; + var_r31->unk0 |= arg1; +} + +u16 fn_1_2454(u16 arg0) { + unkStruct4* var_r31; + + var_r31 = (unkStruct4*)lbl_1_bss_E0->data; + return var_r31->unk0 & arg0; +} + +static inline void unkInline(unkStruct4* var_r31, s16 var_r29, s16* var_r28, s16 arg3) { + var_r31[var_r29].unk2 = Hu3DModelCreateFile(0x280002); + var_r31[var_r29].unk4 = Hu3DModelCreateFile(0x280003); + Hu3DModelAttrSet(var_r31[var_r29].unk2, 0x40000001); + Hu3DModelAttrSet(var_r31[var_r29].unk4, 0x40000002); + if (arg3) { + Hu3DModelAttrSet(var_r31[var_r29].unk2, 0x00000001); + Hu3DModelAttrSet(var_r31[var_r29].unk4, 0x00000001); + } + var_r31[var_r29].unk6 = Hu3DModelCreateFile(0x2001C); + var_r31[var_r29].unk8 = Hu3DJointMotion(var_r31[var_r29].unk6, HuDataSelHeapReadNum(0x28000B, 0x10000000, HEAP_DATA)); + var_r31[var_r29].unkA = Hu3DJointMotion(var_r31[var_r29].unk6, HuDataSelHeapReadNum(0x28000C, 0x10000000, HEAP_DATA)); + Hu3DModelAttrSet(var_r31[var_r29].unk6, 0x40000001); + Hu3DMotionSet(var_r31[var_r29].unk6, var_r31[var_r29].unk8); + var_r31[var_r29].unkC = var_r29 + 3; + if (arg3) { + *var_r28 += (((rand8() << 8) | rand8()) % 4) + 2; + } else { + *var_r28 = 2; + } + fn_1_3988(&var_r31[var_r29], *var_r28, var_r29); + Hu3DModelPosSet(var_r31[var_r29].unk2, var_r31[var_r29].unk18, 0.0f, -1200.0f); + Hu3DModelPosSet(var_r31[var_r29].unk4, var_r31[var_r29].unk18, 0.0f, -1200.0f); +} + +void fn_1_2484(omObjData* object) { + s16 var_r28; + s16 var_r29; + unkStruct4* var_r31; + s32 temp_r27; + + var_r31 = &lbl_1_bss_40[0]; + object->stat |= 0x100; + object->model[0] = Hu3DModelCreateFile(0x280000); + object->model[5] = Hu3DModelCreateFile(0x280008); + Hu3DModelLayerSet(object->model[0], 2); + Hu3DModelLayerSet(object->model[5], 2); + object->model[2] = Hu3DModelCreateFile(0x280005); + object->model[3] = Hu3DModelCreateFile(0x280006); + Hu3DModelScaleSet(object->model[2], 1.1f, 1.0f, 1.0f); + Hu3DModelScaleSet(object->model[3], 1.1f, 1.0f, 1.0f); + Hu3DModelRotSet(object->model[2], 0.2f * lbl_1_data_4C->rot.x, 0.85f * lbl_1_data_4C->rot.y, 0.0f); + Hu3DModelRotSet(object->model[3], 0.2f * lbl_1_data_4C->rot.x, 0.85f * lbl_1_data_4C->rot.y, 0.0f); + Hu3DModelLayerSet(object->model[2], 2); + Hu3DModelLayerSet(object->model[3], 2); + lbl_1_bss_24.unkE = Hu3DTexScrollCreate(object->model[2], "cr_kumo2"); + Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unkE, -0.0002f, 0.0f, 0.0f); + lbl_1_bss_24.unk10 = Hu3DTexScrollCreate(object->model[3], "cr_kumo3"); + Hu3DTexScrollPosMoveSet(lbl_1_bss_24.unk10, -0.0003f, 0.0f, 0.0f); + var_r29 = Hu3DModelCreateFile(0x28000A); + Hu3DModelLayerSet(var_r29, 0); + object->model[6] = Hu3DModelCreateFile(0x280007); + Hu3DModelAttrSet(object->model[6], 2); + Hu3DModelScaleSet(object->model[6], 1.1f, 1.0f, 1.0f); + Hu3DModelRotSet(object->model[6], 0.2f * lbl_1_data_4C->rot.x, 0.85f * lbl_1_data_4C->rot.y, 0.0f); + Hu3DModelLayerSet(object->model[6], 1); + lbl_1_bss_24.unk12 = Hu3DTexScrollCreate(object->model[6], "bg"); + lbl_1_bss_24.unk14 = 0.0f; + object->model[4] = Hu3DModelCreateFile(0x280001); + object->model[1] = Hu3DModelCreateFile(0x280004); + Hu3DModelAttrSet(object->model[4], 0x40000001); + Hu3DModelPosSet(object->model[4], 1660.0f, 0.0f, -1200.0f); + Hu3DModelPosSet(object->model[1], 1660.0f, 0.0f, -1200.0f); + Hu3DModelLayerSet(object->model[1], 6); + Hu3DModelAttrSet(object->model[1], 0x40000002); + + unkInline(var_r31, 0, &var_r28, 0); + for (var_r29 = 1; var_r29 < 4; var_r29++) { + unkInline(var_r31, var_r29, &var_r28, 1); + } + + lbl_1_bss_24.unk0 = 0; + lbl_1_bss_24.unk1 = 0; + lbl_1_bss_24.unk8 = 0; + lbl_1_bss_24.unkA = 0xB4; + Hu3DModelShadowMapSet(object->model[0]); + Hu3DModelShadowSet(object->model[4]); + + for (var_r29 = 0; var_r29 < 4; var_r29++) { + Hu3DModelShadowSet(var_r31[var_r29].unk2); + Hu3DModelShadowSet(var_r31[var_r29].unk4); + } + lbl_1_bss_3C = 0; + object->func = fn_1_2DCC; +} + +void fn_1_2DCC(omObjData* object) { + u16 spE; + u16 spC; + u16 spA; + u16 sp8; + ModelData* temp_r30; + f32 temp_f29; + f32 var_f31; + f32 var_f30; + s16 var_r22; + s16 var_r23; + s16 var_r28; + s16 var_r27; + s16 var_r29; + s32 temp_r16; + s16 var_r18; + unkStruct4* var_r31; + + if ((lbl_1_bss_24.unk0 == 0) || (fn_1_2454(0x18) == 0x18)) { + if (lbl_1_bss_24.unk1 != 0) { + var_r31 = lbl_1_bss_24.unk4; + switch (lbl_1_bss_24.unk1) { + case 1: + if (++lbl_1_bss_24.unk8 == (lbl_1_bss_24.unkA - 5)) { + Hu3DMotionSet(var_r31->unk6, var_r31->unkA); + Hu3DModelAttrReset(var_r31->unk6, 0x40000001); + lbl_1_bss_3C++; + break; + } + if (lbl_1_bss_24.unk8 > lbl_1_bss_24.unkA) { + lbl_1_bss_24.unk8 = 0; + lbl_1_bss_24.unkA = 0xF; + Hu3DModelAttrReset(var_r31->unk4, 0x40000002); + lbl_1_bss_24.unk1 = 2; + HuAudFXPlay(0x55B); + HuAudFXPlay(0x55D); + } + break; + case 2: + temp_f29 = Hu3DMotionMaxTimeGet(var_r31->unk4); + if (Hu3DMotionTimeGet(var_r31->unk4) >= temp_f29) { + Hu3DMotionSet(var_r31->unk6, var_r31->unk8); + Hu3DModelAttrSet(var_r31->unk6, 0x40000001); + Hu3DModelAttrSet(var_r31->unk4, 0x40000002); + fn_1_2414(24, 8); + lbl_1_bss_24.unk1 = 0; + } + break; + } + } else { + var_r31 = lbl_1_bss_24.unk4; + switch (fn_1_2454(0x18)) { + case 16: + Hu3DMotionSet(var_r31->unk6, var_r31->unkA); + Hu3DMotionTimeSet(var_r31->unk6, Hu3DMotionMaxTimeGet(var_r31->unk6)); + Hu3DMotionSpeedSet(var_r31->unk6, -1.0f); + Hu3DModelAttrReset(var_r31->unk6, 0x40000001); + Hu3DMotionSpeedSet(var_r31->unk4, -1.0f); + Hu3DModelAttrReset(var_r31->unk4, 0x40000002); + fn_1_2414(24, 0x18); + HuAudFXPlay(0x55C); + HuAudFXPlay(0x55D); + break; + case 24: + if (Hu3DMotionTimeGet(var_r31->unk4) <= 0.0f) { + Hu3DMotionSet(var_r31->unk6, var_r31->unk8); + Hu3DMotionSpeedSet(var_r31->unk6, 1.0f); + Hu3DModelAttrSet(var_r31->unk6, 0x40000001); + Hu3DMotionSpeedSet(var_r31->unk4, 1.0f); + Hu3DModelAttrSet(var_r31->unk4, 0x40000002); + fn_1_2414(24, 0); + } + break; + } + } + } else { + if (fn_1_2454(7) == 2) { + var_f30 = 0.004f; + } else { + var_f30 = 0.008f; + } + var_r29 = 0; + var_r23 = 0; + var_r31 = lbl_1_bss_40; + + for (;var_r29 < 4; var_r29++, var_r31++) { + if ((s8)var_r31->unk0b == 0) { + var_r23++; + } else { + if (var_r31->unkE-- <= 0) { + temp_r30 = &Hu3DData[var_r31->unk2]; + if ((var_r31->unkC < 2) && (lbl_1_bss_3C < 0xBU)) { + Hu3DModelAttrReset(var_r31->unk2, 1U); + Hu3DModelAttrReset(var_r31->unk4, 1U); + Hu3DModelAttrReset(var_r31->unk6, 1U); + } + var_r31->unk10 += var_f30; + var_f31 = sin((M_PI * (90.0f * var_r31->unk10)) / 180.0); + if (var_r31->unk10 >= 1.0f) { + var_f31 = 1.0f; + var_r31->unk10 = var_f31; + temp_r30->pos.x = var_r31->unk1C; + if (var_r31->unkC == 0) { + lbl_1_bss_24.unk4 = var_r31; + } + var_r27 = var_r31->unkC - 1; + if (var_r27 == -3) { + Hu3DModelAttrSet(var_r31->unk2, 1); + Hu3DModelAttrSet(var_r31->unk4, 1); + Hu3DModelAttrSet(var_r31->unk6, 1); + var_r31->unkC = 2; + var_r27 = 1; + } + fn_1_3988(var_r31, 0, var_r27); + } else { + temp_r30->pos.x = var_r31->unk18 + (var_f31 * (var_r31->unk1C - var_r31->unk18)); + } + if (var_f31 > 0.1f) { + if (++var_r31->unk16 > 1) { + var_r31->unk16 = 0; + fn_1_44F0(*lbl_1_bss_E0->model, 130.0f + temp_r30->pos.x, 15.0f, 95.0f + temp_r30->pos.z, 1, 1); + fn_1_44F0(*lbl_1_bss_E0->model, 630.0f + temp_r30->pos.x, 15.0f, 95.0f + temp_r30->pos.z, 1, 1); + } + } + if ((var_r31->unk10 > 0.7f) && (var_r31->unk10 < 0.9f)) { + var_f31 = var_r31->unk10 - 3.5f; + if (++lbl_1_bss_1C > (40.0f * var_f31)) { + lbl_1_bss_1C = 0.0f; + var_f31 = 1.0f - var_f31; + fn_1_4FFC(lbl_1_bss_E0->model[1], 130.0f + temp_r30->pos.x, 20.0f + temp_r30->pos.y, 95.0f + temp_r30->pos.z, (u8)(2.0f * var_f31)); + fn_1_4FFC(lbl_1_bss_E0->model[1], 630.0f + temp_r30->pos.x, 20.0f + temp_r30->pos.y, 95.0f + temp_r30->pos.z, (u8)var_f31); + } + if (var_r31->unk10 < (0.7f + var_f30)) { + HuAudFXEmiterPlay(0x55E, &temp_r30->pos); + } + } + Hu3DModelPosSet(var_r31->unk6, 70.0f + temp_r30->pos.x, 290.0f, -1200.0f); + Hu3DData[var_r31->unk4].pos.x = temp_r30->pos.x; + var_f31 = (0.800000011920929 * sin((M_PI * (180.0f * var_r31->unk10)) / 180.0)); + Hu3DMotionSpeedSet(var_r31->unk2, var_f31); + } + } + } + if (var_r23 == 4) { + var_r22 = 0x63; + lbl_1_bss_24.unk0 = 0; + + for (var_r29 = 0, var_r31 = &lbl_1_bss_40[0]; var_r29 < 4; var_r29++, var_r31++) { + if (var_r31->unkC < var_r22) { + var_r22 = var_r31->unkC; + var_r27 = var_r29; + } + + for (var_r28 = 0, var_r31->unk20 = NULL; var_r28 < 4; var_r28++) { + if ((var_r31->unkC + 1) == lbl_1_bss_40[var_r28].unkC) { + var_r31->unk20 = &lbl_1_bss_40[var_r28]; + } + } + } + var_r31 = &lbl_1_bss_40[var_r27]; + var_r31->unkE = 0; + + loop: + if (var_r31->unk20) { + var_r31->unk20->unkE = 2 + (((rand8() << 8) | rand8()) % 4) + var_r31->unkE ; + var_r31 = var_r31->unk20; + goto loop; + } + lbl_1_bss_24.unk1 = 1; + } + } +} + +void fn_1_3840(void) { + s16 var_r31; + + if ((lbl_1_bss_24.unk0 == 0) && (fn_1_2454(7) != 4)) { + lbl_1_bss_24.unk0 = 1; + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + lbl_1_bss_40[var_r31].unk0b = 1; + } + if (++lbl_1_bss_20 == 2) { + + for (var_r31 = 0; var_r31 < 4; var_r31++) { + lbl_1_bss_40[var_r31].unkE += 3; + } + fn_1_2414(0x60, 0x20); + } + HuAudFXPlay(0x55F); + } +} + +void fn_1_3988(unkStruct4* arg0, s16 arg1, s16 arg2) { + arg0->unk0b = 0; + arg0->unkE = arg1; + arg0->unk10 = 0.0f; + arg0->unk18 = ((850.0f * arg0->unkC) - 370.0f); + arg0->unk1C = ((850.0f * arg2) - 370.0f); + arg0->unkC = arg2; + if ((arg0->unkC >= 2) && (fn_1_2454(7) != 2)) { + Hu3DModelAttrSet(arg0->unk2, 1U); + Hu3DModelAttrSet(arg0->unk4, 1U); + Hu3DModelAttrSet(arg0->unk6, 1U); + } +} + +s32 fn_1_3AD8(s32 arg0, f32 arg8, f32 arg9, f32 argA, f32 argB, f32 argC, f32 argD) { + f32 sp1C; + f32 temp; + ModelData* temp_r31; + f32 temp_f31; + f32 temp_f30; + f32 temp_f29; + f32 temp_f28; + f32 temp_f27; + f32 temp_f26; + s16 var_r29; + unkStruct4* var_r30; + + var_r30 = lbl_1_bss_24.unk4; + if (!var_r30) return; + + for (var_r29 = 0; var_r29 < 2; var_r29++) { + temp_r31 = &Hu3DData[var_r30->unk6]; + temp_f31 = temp_r31->pos.x; + temp_f30 = 75.0f + temp_r31->pos.y; + temp_f29 = temp_r31->pos.z; + temp_f28 = arg8 + argB; + temp_f27 = arg9 + argC; + temp_f26 = argA + argD; + temp = sqrtf((temp_f28 - temp_f31) * (temp_f28 - temp_f31) + (temp_f27 - temp_f30) * (temp_f27 - temp_f30) + (temp_f26 - temp_f29) * (temp_f26 - temp_f29)); + if (temp < 50.0f) { + return 1; + } + sp1C = -((argA * argD) + (((arg9 * argC) + (((-temp_f31 * argB) + (arg8 * argB)) - (temp_f30 * argC))) - (temp_f29 * argD))) / ((argD * argD) + ((argB * argB) + (argC * argC))); + if (sp1C >= 1.0f) continue; + + temp_f28 = arg8 + (argB * sp1C); + temp_f27 = arg9 + (argC * sp1C); + temp_f26 = argA + (argD * sp1C); + temp = sqrtf((temp_f28 - temp_f31) * (temp_f28 - temp_f31) + (temp_f27 - temp_f30) * (temp_f27 - temp_f30) + (temp_f26 - temp_f29) * (temp_f26 - temp_f29)); + if (temp < 50.0f) { + return 1; + } + var_r30 = var_r30->unk20; + continue; + } + return 0; +} + +void fn_1_40A4(Mtx arg0, Mtx arg1) { + arg1[0][0] = arg0[0][0]; + arg1[1][0] = arg0[0][1]; + arg1[2][0] = arg0[0][2]; + arg1[0][1] = arg0[1][0]; + arg1[1][1] = arg0[1][1]; + arg1[2][1] = arg0[1][2]; + arg1[0][2] = arg0[2][0]; + arg1[1][2] = arg0[2][1]; + arg1[2][2] = arg0[2][2]; + arg1[0][3] = 0.0f; + arg1[1][3] = 0.0f; + arg1[2][3] = 0.0f; +} + +f32 fn_1_4120(f32 arg0, f32 arg1, f32 arg2, f32 arg3) { + f32 temp_f31; + + temp_f31 = 1.0f - arg3; + return (arg2 * (arg3 * arg3)) + ((arg0 * (temp_f31 * temp_f31)) + (arg1 * (2.0f * temp_f31 * arg3))); +} + +void fn_1_417C(void) { + + if ((HuPadBtnDown[0] & 0x40) != 0) { + lbl_1_bss_21 ^= 1; + } + if (lbl_1_bss_21 != 0) { + if ((HuPadBtn[0] & 1) != 0) { + CRot.y++; + } + if ((HuPadBtn[0] & 2) != 0) { + CRot.y--; + } + if ((HuPadBtn[0] & 8) != 0) { + CRot.x--; + } + if ((HuPadBtn[0] & 4) != 0) { + CRot.x++; + } + Center.x += HuPadSubStkX[0]; + if ((HuPadBtn[0] & 0x20) != 0) { + Center.y += HuPadSubStkY[0]; + } else { + Center.z += HuPadSubStkY[0]; + } + if ((HuPadBtn[0] & 0x400) != 0) { + CZoom += 10.0f; + } + if ((HuPadBtn[0] & 0x800) != 0) { + CZoom -= 10.0f; + } + if ((HuPadBtnDown[0] & 0x100) != 0) { + OSReport("\nCZoom = %.2f \n", CZoom); + OSReport("Center x = %.2f: y = %.2f: z = %.2f \n", Center.x, Center.y, Center.z); + OSReport("CRot x = %.2f: y = %.2f: z = %.2f \n", CRot.x, CRot.y, CRot.z); + } + } +} + +void fn_1_44F0(s16 arg0, f32 arg8, f32 arg9, f32 argA, s8 arg1, s16 arg2) { + Vec sp20; + Vec sp14; + unkStruct4* sp10; + GXColor spA; + ModelData* temp_r30; + f32 temp_f31; + s16 var_r29; + unkStruct5* var_r31; + + temp_r30 = &Hu3DData[lbl_1_bss_DC->model[4]]; + sp10 = (unkStruct4*)temp_r30->unk_120; + if (arg1 == 0) { + arg8 = 150.0f + temp_r30->pos.x; + arg9 = 360.0f + temp_r30->pos.y; + argA = temp_r30->pos.z; + } + + for (var_r29 = 0; var_r29 < arg2; var_r29++) { + switch (arg1) { /* irregular */ + case 0: + sp20.x = arg8 + ((((rand8() << 8) | rand8()) % 41) - 20); + sp20.z = argA + ((((rand8() << 8) | rand8()) % 41) - 20); + sp20.y = arg9; + sp14.x = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 200); + sp14.y = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 200); + sp14.z = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 200); + spA.r = spA.g = spA.b = (((rand8() << 8) | rand8()) % 33) + 32; + spA.a = 0xFF; + var_r31 = fn_1_58E0(arg0, &sp20, &sp14, 0.0f, &spA); + if (!var_r31) return; + + temp_f31 = (((rand8() << 8) | rand8()) % 361); + var_r31->unk0.x = (2.0 + (3.0 * sin((M_PI * temp_f31) / 180.0))); + var_r31->unk0.y = (0.1f * ((((rand8() << 8) | rand8()) % 31) + 40)); + var_r31->unk0.z = (3.5 * cos((M_PI * temp_f31) / 180.0)); + var_r31->unk28 = 0; + var_r31->unk2A = ((((rand8() << 8) | rand8()) % 3) + 2); + var_r31->unk18 = (f32)spA.r; + var_r31->unk1C = (((((rand8() << 8) | rand8()) % 69) + 0x80) / (f32)(var_r31->unk2A * 0xE)); + var_r31->unk20 = 255.0f; + var_r31->unk24 = (((((rand8() << 8) | rand8())) % 128 + 0x80) / (f32)(var_r31->unk2A * 0xE)); + break; + case 1: + sp20.x = arg8 + ((((rand8() << 8) | rand8()) % 41) - 20); + sp20.z = argA + ((((rand8() << 8) | rand8()) % 41) - 20); + sp20.y = arg9 + ((((rand8() << 8) | rand8()) % 41) - 20); + sp14.x = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 300); + sp14.y = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 300); + sp14.z = 0.01f * ((((rand8() << 8) | rand8()) % 101) + 300); + spA.r = 0xFF; + spA.g = 0xDC; + spA.b = 0x8C; + spA.a = 0x80; + var_r31 = fn_1_58E0(arg0, &sp20, &sp14, 0.0f, &spA); + if (!var_r31) return; + + var_r31->unk28 = 0; + var_r31->unk2A = ((((rand8() << 8) | rand8()) % 3) + 2); + var_r31->unk0.x = (0.1f * ((((rand8() << 8) | rand8()) % 11) + 30)); + var_r31->unk0.y = 0.0f; + var_r31->unk0.z = (0.1f * ((((rand8() << 8) | rand8()) % 41) - 20)); + var_r31->unk20 = 32.0f; + var_r31->unk24 = (32.0f / (var_r31->unk2A * 0xE)); + break; + } + var_r31->unk2C = arg1; + } +} + +void fn_1_4FFC(s16 arg0, f32 arg1, f32 arg2, f32 arg3, s16 arg4) { + Vec sp2C; + Vec sp20; + GXColor sp1A; + s16 sp18; + f32 temp_f31; + s16 var_r30; + unkStruct5* temp_r31; + + for (var_r30 = 0; var_r30 < arg4; var_r30++) { + sp2C.x = arg1 + ((((rand8() << 8) | rand8()) % 21) - 10); + sp2C.y = arg2; + sp2C.z = arg3 + ((((rand8() << 8) | rand8()) % 21) - 10); + sp20.x = 0.1f * ((((rand8() << 8) | rand8()) % 31) + 10); + sp20.y = 1.0f; + sp20.z = 1.0f; + sp1A.r = sp1A.g = sp1A.b = sp1A.a = 0xFF; + temp_r31 = fn_1_58E0(arg0, &sp2C, &sp20, 0.0f, &sp1A); + if (!temp_r31) break; + + temp_r31->unk4C = -1; + temp_f31 = ((((rand8() << 8) | rand8()) % 81) - 40); + temp_r31->unk0.x = (13.0 * cos((M_PI * temp_f31) / 180.0)); + temp_r31->unk0.y = 0.1f * ((((rand8() << 8) | rand8()) % 21) + 20); + temp_r31->unk0.z = (9.0 * sin((M_PI * temp_f31) / 180.0)); + temp_r31->unkC.x = (0.05f * temp_r31->unk0.x); + temp_r31->unkC.z = (0.05f * temp_r31->unk0.z); + temp_r31->unk18 = 500.0f; + temp_r31->unk1C = ((((rand8() << 8) | rand8()) % 21) + 40); + } +} + +void fn_1_5408(ModelData* arg0, struct _unkStruct6* arg1, Mtx arg2) { + s16 var_r29; + GXColor* var_r30; + unkStruct5* var_r31; + + var_r29 = 0; + var_r31 = arg1->unk18; + var_r30 = arg1->unk24; + + for (;var_r29 < arg1->unk0; var_r29++, var_r31++, var_r30++) { + if (var_r31->unk4E != 0) { + switch (var_r31->unk2C) { + case 0: + var_r31->unk0.y -= 0.1f; + var_r31->unk40.x += var_r31->unk0.x; + var_r31->unk40.y += var_r31->unk0.y; + var_r31->unk40.z += var_r31->unk0.z; + var_r31->unk18 += var_r31->unk1C; + if (var_r31->unk18 > 255.0f) { + var_r31->unk18 = 255.0f; + } + var_r30->r = var_r30->g = var_r30->b = var_r31->unk18; + break; + case 1: + var_r31->unk40.x += var_r31->unk0.x; + var_r31->unk40.z += var_r31->unk0.z; + break; + } + var_r31->unk20 -= var_r31->unk24; + if (var_r31->unk20 < 0.0f) { + var_r31->unk20 = 0.0f; + } + var_r30->a = var_r31->unk20; + var_r31->unk28++; + if (var_r31->unk28 >= var_r31->unk2A) { + var_r31->unk28 = 0; + var_r31->unk4C++; + } + if (var_r31->unk4C >= (arg1->unk14 - 2)) { + var_r31->unk4E = 0; + } + } + } +} + +void fn_1_55E0(ModelData* arg0, struct _unkStruct6* arg1, Mtx arg2) { + GXColor* var_r30; + f32 var_f31; + f32 var_f30; + s16 var_r29; + s32 var_r28; + unkStruct5* var_r31; + + var_r29 = 0; + var_r31 = arg1->unk18; + var_r30 = arg1->unk24; + + for (;var_r29 < arg1->unk0; var_r29++, var_r31++, var_r30++) { + if (var_r31->unk4E != 0) { + var_r31->unk0.x -= var_r31->unkC.x; + var_r31->unk0.y -= 0.2f; + var_r31->unk0.z -= var_r31->unkC.z; + if (var_r31->unk0.x < var_r31->unkC.x) { + var_r31->unk0.x = var_r31->unkC.x; + } + if (var_r31->unkC.z < 0.0f) { + var_f31 = -var_r31->unkC.z; + } else { + var_f31 = var_r31->unkC.z; + } + if (var_r31->unk0.z < 0.0f) { + var_f30 = -var_r31->unk0.z; + } else { + var_f30 = var_r31->unk0.z; + } + if (var_f30 < var_f31) { + var_r31->unk0.z = var_r31->unkC.z; + } + var_r31->unk40.x += var_r31->unk0.x; + var_r31->unk40.y += var_r31->unk0.y; + var_r31->unk40.z += var_r31->unk0.z; + var_r31->unk18 -= var_r31->unk1C; + if (var_r31->unk18 < 0.0f) { + var_r31->unk18 = 0.0f; + } + if (var_r31->unk18 > 255.0f) { + var_r28 = 0xFF; + } else { + var_r28 = (u8)var_r31->unk18; + } + var_r30->a = var_r28; + if (0.0f == var_r31->unk18) { + var_r31->unk4E = 0; + } + } + } +} + +void fn_1_57DC(ModelData* arg0, struct _unkStruct6* arg1, Mtx arg2) { + Vec sp18; + Vec spC; + GXColor sp8; + ModelData* temp_r30; + unkStruct5* temp_r31; + + temp_r30 = &Hu3DData[lbl_1_bss_DC->model[4]]; + temp_r31 = arg1->unk18; + if (temp_r31->unk4E == 0) { + spC.x = spC.y = spC.z = 1.0f; + sp8.r = sp8.g = sp8.b = sp8.a = 0xFF; + fn_1_58E0(lbl_1_bss_E0->model[2], &sp18, &spC, 0.0f, &sp8); + } + temp_r31->unk40.x = (60.0f + temp_r30->pos.x); + temp_r31->unk40.y = (260.0f + temp_r30->pos.y); + temp_r31->unk40.z = temp_r30->pos.z; +} + +unkStruct5* fn_1_58E0(s16 arg0, Vec* arg1, Vec* arg2, f32 arg3, GXColor* arg4) { + s16 var_r29; + unkStruct5* var_r31; + unkStruct6* temp_r30; + ModelData* var_r28; + + var_r28 = &Hu3DData[arg0]; + temp_r30 = (unkStruct6*)var_r28->unk_120; + + var_r29 = 0; + var_r31 = temp_r30->unk18; + for (;var_r29 < temp_r30->unk0; var_r29++, var_r31++) { + if (var_r31->unk4E == 0) { + break; + } + } + if (var_r29 == temp_r30->unk0) { + return NULL; + } + temp_r30->unk24[var_r29].r = arg4->r; + temp_r30->unk24[var_r29].g = arg4->g; + temp_r30->unk24[var_r29].b = arg4->b; + temp_r30->unk24[var_r29].a = arg4->a; + var_r31->unk2E = var_r29; + var_r31->unk30 = arg3; + var_r31->unk34 = *arg2; + var_r31->unk40 = *arg1; + var_r31->unk4C = 0; + var_r31->unk4E = 1; + return var_r31; +} + +s16 fn_1_5A18(AnimData* arg0, s16 arg1, f32 arg8, s16 arg2, s16 arg3) { + ModelData* temp_r28; + f32 temp_f0; + s16 var_r21; + s16 var_r22; + s16 var_r30; + s16 var_r20; + unkStruct6* var_r31; + void* var_r19; + void* var_r18; + unkStruct5* var_r24; + Vec* var_r25; + GXColor* var_r27; + HsfVector2f* var_r29; + + var_r21 = Hu3DHookFuncCreate(fn_1_602C); + temp_r28 = &Hu3DData[var_r21]; + var_r31 = HuMemDirectMallocNum(HEAP_DATA, 0x68, temp_r28->unk_48); + temp_r28->unk_120 = var_r31; + arg0->useNum++; + var_r31->unk10 = arg0; + var_r31->unk0 = arg1; + var_r31->unk8 = 0; + var_r31->unkC = NULL; + var_r24 = HuMemDirectMallocNum(HEAP_DATA, arg1 * 0x50, temp_r28->unk_48); + var_r31->unk18 = var_r24; + + for (var_r30 = 0; var_r30 < arg1; var_r30++, var_r24++) { + var_r24->unk4C = -1; + var_r24->unk4E = 0; + } + var_r25 = HuMemDirectMallocNum(HEAP_DATA, arg1 * 0xC * 4, temp_r28->unk_48); + var_r31->unk1C = 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 * 4, temp_r28->unk_48); + var_r31->unk24 = 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 * 8 * 4, temp_r28->unk_48); + var_r31->unk20 = 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_r20 = arg0->bmp->sizeY / arg3; + var_r31->unk14 = (var_r22 * var_r20); + var_r31->unk60 = (1.0f / var_r22); + var_r31->unk64 = (1.0f / var_r20); + } else { + var_r22 = 1; + var_r31->unk14 = 1; + var_r31->unk60 = 1.0f; + var_r31->unk64 = 1.0f; + } + var_r31->unk5C = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk14 * 8, temp_r28->unk_48); + fn_1_6608(var_r31->unk5C, var_r31->unk14, var_r22, var_r31->unk60, var_r31->unk64); + var_r31->unk2C.x = var_r31->unk50.x = var_r31->unk44.y = var_r31->unk50.y = -arg8; + var_r31->unk38.x = var_r31->unk44.x = var_r31->unk2C.y = var_r31->unk38.y = arg8; + var_r31->unk2C.z = var_r31->unk38.z = var_r31->unk44.z = var_r31->unk50.z = 0.0f; + var_r19 = var_r18 = HuMemDirectMallocNum(HEAP_DATA, 0x20000, temp_r28->unk_48); + DCFlushRange(var_r19, 0x20000); + GXBeginDisplayList(var_r19, 0x20000); + GXBegin(GX_QUADS, GX_VTXFMT0, (arg1 * 4)); + + for (var_r30 = 0; var_r30 < arg1; var_r30++) { + GXPosition1x16(var_r30 * 4); + GXColor1x16(var_r30); + GXTexCoord1x16(var_r30 * 4); + GXPosition1x16((var_r30 * 4) + 1); + GXColor1x16(var_r30); + GXTexCoord1x16((var_r30 * 4) + 1); + GXPosition1x16((var_r30 * 4) + 2); + GXColor1x16(var_r30); + GXTexCoord1x16((var_r30 * 4) + 2); + GXPosition1x16((var_r30 * 4) + 3); + GXColor1x16(var_r30); + GXTexCoord1x16((var_r30 * 4) + 3); + } + var_r31->unk4 = GXEndDisplayList(); + var_r31->unk28 = HuMemDirectMallocNum(HEAP_DATA, var_r31->unk4, temp_r28->unk_48); + memcpy(var_r31->unk28, var_r18, var_r31->unk4); + DCFlushRange(var_r31->unk28, var_r31->unk4); + HuMemDirectFree(var_r18); + return var_r21; +} + +void fn_1_5F5C(s16 arg0) { + ModelData* var_r31; + unkStruct6* var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = (unkStruct6*)var_r31->unk_120; + HuSprAnimKill(var_r30->unk10); + Hu3DModelKill(arg0); +} + +void fn_1_5FBC(s16 arg0, m409Func6 arg1) { + ModelData* var_r31; + unkStruct6* var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = (unkStruct6*)var_r31->unk_120; + var_r30->unkC = arg1; +} + +void fn_1_5FF4(s16 arg0, u8 arg1) { + ModelData* var_r31; + unkStruct6* var_r30; + + var_r31 = &Hu3DData[arg0]; + var_r30 = (unkStruct6*)var_r31->unk_120; + var_r30->unk8 = arg1; +} + +void fn_1_602C(ModelData* arg0, f32 (*arg1)[4]) { + 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; + s16 var_r24; + HsfVector2f* var_r26; + s16 var_r25; + unkStruct6* temp_r30; + unkStruct5* var_r29; + m409Func6 var_r23; + + temp_r30 = (unkStruct6*)arg0->unk_120; + GXLoadPosMtxImm(arg1, 0); + GXSetNumTevStages(1); + GXSetNumTexGens(1); + GXSetTexCoordGen2(GX_TEXCOORD0, GX_TG_MTX2x4, GX_TG_TEX0, GX_IDENTITY, GX_FALSE, GX_PTIDENTITY); + GXSetTevOrder(GX_TEVSTAGE0, GX_TEXCOORD0, GX_TEXMAP0, GX_COLOR0A0); + var_r24 = temp_r30->unk10->bmp->dataFmt & 0xF; + if ((var_r24 == 7) || (var_r24 == 8)) { + GXSetTevColorIn(GX_TEVSTAGE0, GX_CC_ZERO, GX_CC_ONE, 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 ((arg0->attr & 2) != 0) { + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE); + } else { + GXSetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE); + } + HuSprTexLoad(temp_r30->unk10, 0, 0, GX_REPEAT, GX_REPEAT, GX_LINEAR); + GXSetAlphaCompare(GX_GEQUAL, 1, GX_AOP_AND, GX_GEQUAL, 1); + GXSetZCompLoc(0); + switch (temp_r30->unk8) { + 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_TEX_ST, GX_RGBA6, 0); + GXSetArray(GX_VA_POS, temp_r30->unk1C, 0xC); + GXSetVtxDesc(GX_VA_CLR0, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_CLR0, GX_TEX_ST, GX_RGBA8, 0); + GXSetArray(GX_VA_CLR0, temp_r30->unk24, 4); + GXSetVtxDesc(GX_VA_TEX0, GX_INDEX16); + GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_RGBA6, 0); + GXSetArray(GX_VA_TEX0, temp_r30->unk20, 8); + fn_1_40A4(arg1, sp128); + PSMTXReorder(sp128, spF8); + if (((u8)omPauseChk() == 0) && (temp_r30->unkC)) { + var_r23 = temp_r30->unkC; + var_r23(arg0, temp_r30, arg1); + } + var_r29 = temp_r30->unk18; + var_r31 = temp_r30->unk1C; + var_r26 = temp_r30->unk20; + PSMTXROMultVecArray(spF8, &temp_r30->unk2C, &sp68[0], 4); + + for (var_r25 = 0; var_r25 < temp_r30->unk0; var_r25++, var_r29++, var_r26+=4) { + if (var_r29->unk4E == 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->unk30 == 0.0f) { + fn_1_6778(&sp68[0], &sp38, &var_r29->unk34, 4); + PSVECAdd(&sp38, &var_r29->unk40, var_r31++); + PSVECAdd(&sp44, &var_r29->unk40, var_r31++); + PSVECAdd(&sp50, &var_r29->unk40, var_r31++); + PSVECAdd(&sp5C, &var_r29->unk40, var_r31++); + } else { + fn_1_6778(&temp_r30->unk2C, &sp38, &var_r29->unk34, 4); + PSMTXRotRad(spC8, 0x5A, 0.017453292f * var_r29->unk30); + PSMTXConcat(sp128, spC8, sp98); + PSMTXMultVecArray(sp98, &sp38, &sp8, 4); + PSVECAdd(&sp8, &var_r29->unk40, var_r31++); + PSVECAdd(&sp14, &var_r29->unk40, var_r31++); + PSVECAdd(&sp20, &var_r29->unk40, var_r31++); + PSVECAdd(&sp2C, &var_r29->unk40, var_r31++); + } + if (var_r29->unk4C != -1) { + fn_1_66D4(var_r26, temp_r30->unk5C, var_r29->unk4C, temp_r30->unk60, temp_r30->unk64); + } + } + } + DCFlushRangeNoSync(temp_r30->unk1C, temp_r30->unk0 * 0xC * 4); + DCFlushRangeNoSync(temp_r30->unk20, temp_r30->unk0 * 8 * 4); + PPCSync(); + GXCallDisplayList(temp_r30->unk28, temp_r30->unk4); +} + +void fn_1_6608(HsfVector2f* arg0, s16 arg1, s16 arg2, f32 arg3, f32 arg4) { + 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 * arg3); + arg0->y = (var_r29 * arg4); + } +} + +void fn_1_66D4(HsfVector2f* arg0, HsfVector2f* arg1, s16 arg2, f32 arg3, f32 arg4) { + arg0[0].x = arg1[arg2].x; + arg0[0].y = arg1[arg2].y; + arg0[1].x = (arg3 + arg1[arg2].x); + arg0[1].y = arg1[arg2].y; + arg0[2].x = (arg3 + arg1[arg2].x); + arg0[2].y = (arg4 + arg1[arg2].y); + arg0[3].x = arg1[arg2].x; + arg0[3].y = (arg4 + arg1[arg2].y); +} + +void fn_1_6778(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; + } } \ No newline at end of file