From cc970381c81be22bab60a396f7ba948e4e4c426f Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo Nitti <96613413+sonicdcer@users.noreply.github.com> Date: Sun, 21 Jan 2024 13:27:47 -0300 Subject: [PATCH] fox_hud & fox_me Decompiled (#95) * func_80092D48 * func_800927A0 * TempComp.bin.mio0 git ignored * func_800924E0 * func_80094D20 * func_80096A74 * func_80095604 * all functions done * symbols for segmented addresses * move symbols to c file for now * failed attempt to import data * fix * Import data * move data below * ready for BSS attempt * fix warnings * ordering * symbols for some segmented addresses * rename to fox_hud * clear mess * . * . * space * . * func_i2_80187530 * func_i2_8018756C * func_i2_80187650 * func_i2_801877C4 * func_i2_8018795C * func_i2_80187B08 * func_i2_80187C68 * bss again (#98) * func_i2_80187D08 * func_i2_80187D98 * func_i2_80187FF8 * func_i2_801881A8 * func_i2_80188228 * func_i2_80188298 * ARRAY_COUNT * func_i2_80188344 * func_i2_80188B84 * func_i2_80188C2C * func_i2_80188E8C * func_i2_80188F2C * func_i2_80188CAC * func_i2_80189114 * func_i2_8018B7C4 * func_i2_8018C77C * func_i2_8018C8F4 * func_i2_8018CA10 * func_i2_8018CB50 * func_i2_8018BACC co-authored-by: @inspectredc * func_i2_8018CCF8 * func_i2_8018CB50 * func_i2_8018CD8C co-authored-by: @inspectredc & @petrie911 * func_i2_8018D9EC * func_i2_8018DA6C * func_i2_8018DAEC * func_i2_8018DB6C * func_i2_8018DBEC * func_i2_8018DCE4 * func_i2_8018DE14 * func_i2_8018DF08 co-authored-by @inspectredc & @petrie911 * func_i2_8018E084 * func_i2_8018ED9C * func_i2_80188088 * func_i2_801892F0 * func_i2_8018978C co-authored-by @KiritoDv & inspectredc * fox_me DATA IMPORTED * resolve conflicts * func_i6_80197B30 * func_i6_80197CC4 * func_i6_80197F84 * func_i6_80198244 * merge and solve bss * func_i6_801983E4 * PR review --------- Co-authored-by: petrie911 <69443847+petrie911@users.noreply.github.com> --- .gitignore | 1 + include/functions.h | 6 + include/hud.h | 58 +- include/i3.h | 4 +- include/sf64math.h | 2 +- include/sf64object.h | 4 +- include/sf64player.h | 4 +- include/variables.h | 33 +- linker_scripts/us/symbol_addrs_engine.txt | 4 +- linker_scripts/us/undefined_syms.ld | 47 + src/main/fox_97F80.c | 1 + src/main/{sf_hud.c => fox_hud.c} | 1748 ++++++++++++-- src/main/fox_play.c | 12 +- src/overlays/ovl_i2/fox_me.c | 2528 ++++++++++++++++++++- src/overlays/ovl_i3/sf_so.c | 1 + src/overlays/ovl_i4/fox_ka.c | 2 +- src/overlays/ovl_i6/fox_sy.c | 327 ++- src/overlays/ovl_menu/fox_title.c | 21 +- yamls/us/main.yaml | 8 +- yamls/us/overlays.yaml | 2 +- 20 files changed, 4476 insertions(+), 337 deletions(-) rename src/main/{sf_hud.c => fox_hud.c} (71%) diff --git a/.gitignore b/.gitignore index b80a46ba..38c99622 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ tools/mio0 tools/ido-recomp .venv/ m2cfiles/ +TempComp.bin.mio0 \ No newline at end of file diff --git a/include/functions.h b/include/functions.h index 036586a2..3f6ee859 100644 --- a/include/functions.h +++ b/include/functions.h @@ -39,6 +39,7 @@ void func_8001CA24(u8); void func_8001CB80(u8, u8); void func_8001CCDC(u8, Vec3f *); void func_8001CE28(u8, Vec3f *); +void func_8001D034(Vec3f*, s32, u8); void func_8001D10C(Vec3f*, u32); void func_8001D15C(u8); void func_8001D1C8(u8, s32); @@ -302,6 +303,8 @@ void func_8006BB78(Actor*); void func_8006C008(Actor*); void func_8006D350(Object_80*); void func_8006EEFC(s32, f32, f32, f32, f32, f32, f32, f32, f32, f32); +void func_8006EFA0(s32 unk0E4, f32 xPos, f32 yPos, f32 zPos, f32 arg4, f32 arg5, f32 arg6, f32 xRot, f32 yRot, + f32 zRot); void func_8006F0D8(f32 xPos, f32 yPos, f32 zPos, f32 arg3); void func_80072594(Actor*); s32 func_80074F90(Object_80*); @@ -492,6 +495,9 @@ void func_80092D48(Actor *); void func_80092EC0(Actor* actor); void func_80093164(Actor*); void func_800935E8(Player*); +void func_800953A0(Actor*, s32); +void func_8009546C(Actor*, s32); +void func_80095538(Actor*, s32); void func_80095604(Player*); void func_80094954(Effect*); void func_80094BBC(Effect*); diff --git a/include/hud.h b/include/hud.h index 7ddc03aa..68615254 100644 --- a/include/hud.h +++ b/include/hud.h @@ -3,14 +3,18 @@ #include "global.h" -typedef struct UnkStruct_func_80095350 { - /* 0x00 */ s8 unk0; - /* 0x01 */ char pad_1[0x1]; - /* 0x02 */ s16 unk2; - /* 0x04 */ char pad_4[0xB2]; - /* 0xB6 */ s16 unkB6; -} UnkStruct_func_80095350; +typedef struct { + /* 0x00 */ u8* unk_00; + /* 0x04 */ s32 width; + /* 0x08 */ s32 height; + /* 0x0C */ u8* unk_0C; + /* 0x10 */ s32 unk_10; + /* 0x14 */ s32 unk_14; +} UnkStruct_D_800D1AEC; +void func_80084930(f32, f32, s32); +void func_80086444(void); +void func_80087788(void); void func_80084E78(Gfx** gfxP, void* arg1, void* arg2, u32 arg3, u32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9, f32 argA); void func_80085944(void); @@ -36,44 +40,4 @@ void func_8008E5E8(void); s32 func_80090E8C(Actor*); s32 func_800910C0(Actor*); -// Weird addresses, assets maybe? -extern u16 D_1000E80[]; -extern u16 D_1002280[]; -extern u16 D_10030D0[]; -extern s32 D_1011280[]; -extern s32 D_10116A0[]; -extern s32 D_10116B0[]; -extern s32 D_1011730[]; -extern s32 D_1011AC0[]; -extern s32 D_1011B90[]; -extern s32 D_1011BB0[]; -extern s32 D_1011C80[]; -extern s32 D_1011CA0[]; -extern s32 D_1011D70[]; -extern s32 D_1011D90[]; -extern s32 D_1011E60[]; -extern s32 D_1013580[]; -extern s32 D_1013700[]; -extern Gfx D_20031B0[]; -extern Gfx D_2010A30[]; -extern u16 D_3000B20[]; -extern u8 D_30013E0[]; - -extern s32 D_80161690; -extern s32 D_80161718; -extern s32 D_8016171C; -extern s32 D_801617E8[]; -extern s32 D_801617FC; -extern s32 gHitCount; -extern s32 D_80177838; -extern s32 D_80177854; -extern s32 gTeamShields[]; -extern s32 D_801778BC; -extern s32 gVersusMode; -extern s32 D_80177B50[]; -extern s32 D_80177B70[]; -extern s32 D_80177E7C; -extern LevelId gCurrentLevel; -extern s32 D_80178750; - #endif diff --git a/include/i3.h b/include/i3.h index a404bf83..36982576 100644 --- a/include/i3.h +++ b/include/i3.h @@ -10,6 +10,8 @@ // extern f32 D_i3_801C4188; Currently externed in relevant files for bss ordering +void func_i3_801BE034(Actor*, Player*); + void func_i3_8018DA58(Actor*); void func_i3_8019E5F0(Actor*); void func_i3_801A8BE8(Actor*); @@ -94,7 +96,6 @@ void func_i3_801AACF8(Player*); void func_i3_801ABA40(PlayerShot*); void func_i3_801AC274(Player*); void func_i3_801AC8A8(f32, f32, f32, f32, s32); -void func_i3_801AC8A8(f32, f32, f32, f32, s32); void func_i3_801AC918(Effect*); void func_i3_801ACBB4(void); void func_i3_801ACE50(Player*); @@ -140,6 +141,7 @@ void func_i3_801BC9A0(Actor*); void func_i3_801BD264(Actor*); void func_i3_801BD54C(Actor*); void func_i3_801BDE6C(Actor*); +void func_i3_801BDF14(void); void func_i3_801BE1FC(Object_80*); void func_i3_801BE3F8(Actor*); void func_i3_801BEB1C(Actor*); diff --git a/include/sf64math.h b/include/sf64math.h index e8877e6b..f68c02a1 100644 --- a/include/sf64math.h +++ b/include/sf64math.h @@ -1,7 +1,7 @@ #ifndef SF64_MATH_H #define SF64_MATH_H -#include "PR/ultratypes.h" +#include "libultra/ultra64.h" typedef struct { /* 0x0 */ f32 x; diff --git a/include/sf64object.h b/include/sf64object.h index 689b43c7..8208de75 100644 --- a/include/sf64object.h +++ b/include/sf64object.h @@ -206,7 +206,9 @@ typedef struct { /* 0x01C */ ObjectInfo info; /* 0x040 */ s32 index; /* 0x044 */ s16 unk_044; - /* 0x046 */ char unk_46[6]; + /* 0x046 */ s16 unk_046; + /* 0x048 */ s16 unk_048; + /* 0x04A */ s16 unk_04A; /* 0x04C */ s16 unk_04C; /* 0x04E */ s16 actionState; /* 0x050 */ s16 timer_050; diff --git a/include/sf64player.h b/include/sf64player.h index c17b0401..139faa1e 100644 --- a/include/sf64player.h +++ b/include/sf64player.h @@ -212,7 +212,7 @@ typedef struct Player { /* 0x1CC */ PlayerForm form; /* 0x1D0 */ s32 unk_1D0; /* 0x1D4 */ s32 unk_1D4; - /* 0x1D8 */ char pad1D8[4]; + /* 0x1D8 */ s32 unk_1D8; /* 0x1DC */ s32 unk_1DC; /* 0x1E0 */ s32 timer_1E0; /* 0x1E4 */ s32 timer_1E4; @@ -224,7 +224,7 @@ typedef struct Player { /* 0x1FC */ s32 timer_1FC; /* 0x200 */ s32 unk_200; /* 0x204 */ s32 unk_204; - /* 0x208 */ char pad208[4]; + /* 0x208 */ s32 unk_208; /* 0x20C */ s32 unk_20C; /* 0x210 */ s32 timer_210; /* 0x214 */ s32 timer_214; diff --git a/include/variables.h b/include/variables.h index c9bc74dd..37651739 100644 --- a/include/variables.h +++ b/include/variables.h @@ -209,7 +209,7 @@ extern f32 D_800CFFC4[]; // fox_effect -// sf_hud +// fox_hud extern s16 D_800D1970; extern f32 D_800D19AC[]; extern f32 D_800D19E0[]; @@ -308,38 +308,15 @@ extern u8 D_80161684; // fox_6B3B0 extern s32 D_80161690; -// sf_hud? -extern f32 D_801616A0; -extern f32 D_801616BC; -extern f32 D_801616C0; -extern f32 D_801616C4; -extern f32 D_801616C8; +// fox_hud extern s32 D_80161704; extern s32 D_80161708; extern s32 D_8016170C; -extern s32 gTotalHits; // gTotalGameScore -extern f32 D_80161720; -extern f32 D_80161724; -extern f32 D_80161728; +extern s32 gTotalHits; // 0x80161714 gTotalGameScore +extern f32 D_80161720[3]; extern s32 D_8016172C; extern s32 D_80161730; -extern s32 gShowBossHealth; -extern s32 D_80161788; -extern s32 D_8016178C; -extern s32 D_80161790; -extern s32 D_80161794; -extern s32 D_80161798; -extern f32 D_8016179C; -extern f32 D_801617A0; -extern f32 D_801617A4; -extern f32 D_801617A8; -extern f32 D_801617AC; -extern s32 D_801617B0; -extern s32 gMedalStatus; -extern s32 gMedalFlashTimer; -extern s32 D_80161810[]; -extern s32 D_80161900[]; -extern s32 D_80161910[0x10]; // could be in fox_97F80 +extern s32 gShowBossHealth; // 0x80161734 // fox_game extern f32 D_80161A10; diff --git a/linker_scripts/us/symbol_addrs_engine.txt b/linker_scripts/us/symbol_addrs_engine.txt index 4b31e917..f48e5959 100644 --- a/linker_scripts/us/symbol_addrs_engine.txt +++ b/linker_scripts/us/symbol_addrs_engine.txt @@ -360,11 +360,13 @@ func_800A3608 = 0x800A3608; // sf_hud +D_801616A0 = 0x801616A0; //type:s32 size:0xC +D_801616B0 = 0x801616B0; //type:s32 size:0xC gTotalHits = 0x80161714; gShowBossHealth = 0x80161734; gMedalStatus = 0x801617B4; gMedalFlashTimer = 0x801617B8; - +D_800D1AEC = 0x800D1AEC; //type:s32 size:0x1B0 // fox_play D_80161A50 = 0x80161A50; diff --git a/linker_scripts/us/undefined_syms.ld b/linker_scripts/us/undefined_syms.ld index 0adbc4ae..87510fbc 100644 --- a/linker_scripts/us/undefined_syms.ld +++ b/linker_scripts/us/undefined_syms.ld @@ -353,6 +353,9 @@ D_5000300 = 0x05000300; D_5000380 = 0x05000380; D_5000400 = 0x05000400; D_5000480 = 0x05000480; +D_500A5F0 = 0x0500A5F0; +D_500A6E0 = 0x0500A6E0; +D_500A7D0 = 0x0500A7D0; D_6000E00 = 0x06000E00; D_6001360 = 0x06001360; @@ -772,6 +775,32 @@ D_D000000 = 0x0D000000; D_D00B5C0 = 0x0D00B5C0; D_D00B720 = 0x0D00B720; +// fox_title, to be ordered later +D_602F8E0 = 0x0602F8E0; +D_60305C0 = 0x060305C0; +D_6031DB8 = 0x06031DB8; +D_6031120 = 0x06031120; +D_6035024 = 0x06035024; +D_60338DC = 0x060338DC; +D_603531C = 0x0603531C; +D_6036278 = 0x06036278; +D_602FBAC = 0x0602FBAC; +D_603088C = 0x0603088C; +D_6032084 = 0x06032084; +D_60313AC = 0x060313AC; + +D_602F8E0 = 0x0602F8E0; +D_60305C0 = 0x060305C0; +D_6031DB8 = 0x06031DB8; +D_6031120 = 0x06031120; +D_60338DC = 0x060338DC; +D_6035024 = 0x06035024; +D_603531C = 0x0603531C; +D_6036278 = 0x06036278; + +D_6036290 = 0x06036290; +D_6036B30 = 0x06036B30; + // fox_map, to be ordered later D_6001C80 = 0x06001C80; D_6002160 = 0x06002160; @@ -832,6 +861,24 @@ D_9005380 = 0x09005380; D_90075A0 = 0x090075A0; D_9004230 = 0x09004230; +// fox_hud, to be ordered later +D_101C170 = 0x0101C170; +D_101C000 = 0x0101C000; +D_101BE90 = 0x0101BE90; +D_101BD20 = 0x0101BD20; +D_101BBB0 = 0x0101BBB0; +D_101BA40 = 0x0101BA40; +D_101B8D0 = 0x0101B8D0; +D_101B760 = 0x0101B760; +D_101B5F0 = 0x0101B5F0; +D_101B480 = 0x0101B480; +D_101B310 = 0x0101B310; +D_101B1A0 = 0x0101B1A0; +D_3000000 = 0x03000000; +D_3000080 = 0x03000080; +D_6001B80 = 0x06001B80; +D_60020D0 = 0x060020D0; + D_C001880 = 0x0C001880; D_C037FCC = 0x0C037FCC; D_C0380C0 = 0x0C0380C0; diff --git a/src/main/fox_97F80.c b/src/main/fox_97F80.c index 0fe560b8..1602158e 100644 --- a/src/main/fox_97F80.c +++ b/src/main/fox_97F80.c @@ -1,4 +1,5 @@ #include "global.h" +#include "prevent_bss_reordering.h" f32 __dx1; f32 __dx2; diff --git a/src/main/sf_hud.c b/src/main/fox_hud.c similarity index 71% rename from src/main/sf_hud.c rename to src/main/fox_hud.c index 9b240516..421085de 100644 --- a/src/main/sf_hud.c +++ b/src/main/fox_hud.c @@ -1,44 +1,111 @@ +#include "sf64math.h" + +// BSS section range: +// D_801616A0 <==> D_80161910 + +// BSS SECTION START + +// placed before global.h for reordering reasons + +Vec3f D_801616A0; +Vec3f D_801616B0; +f32 D_801616BC; +f32 D_801616C0; +f32 D_801616C4; +f32 D_801616C8; +s32 D_801616D0[13]; +s32 D_80161704; +s32 D_80161708; +s32 D_8016170C; +s32 D_80161710; +s32 gTotalHits; // 0x80161714 +s32 D_80161718; +s32 D_8016171C; +f32 D_80161720[3]; +s32 D_8016172C; +s32 D_80161730; +s32 gShowBossHealth; // 0x80161734 +s32 D_80161738[4]; +s32 D_80161748[4]; +s32 D_80161758; +// gap = 0x4 bytes, probably padding +s32 D_80161760[4]; +f32 D_80161770; +f32 D_80161774; +f32 D_80161778; +f32 D_8016177C; +f32 D_80161780; +f32 D_80161784; +s32 D_80161788; +s32 D_8016178C; +s32 D_80161790; +s32 D_80161794; +s32 D_80161798; +f32 D_8016179C; +f32 D_801617A0; +f32 D_801617A4; +f32 D_801617A8; +f32 D_801617AC; +s32 D_801617B0; +s32 gMedalStatus; // 0x801617B4 +s32 gMedalFlashTimer; // 0x801617B8 +// gap = 0x4 bytes, probably padding +s32 D_801617C0[10]; +s32 D_801617E8[10]; +s32 D_80161810[10]; +s32 D_80161838[10]; +s32 D_80161860[20]; +f32 D_801618B0[20]; +s32 D_80161900[20]; + +// BSS SECTION END + +#include "global.h" #include "hud.h" -typedef struct { - /* 0x00 */ u8* unk_00; - /* 0x04 */ s32 width; - /* 0x08 */ s32 height; - /* 0x0C */ u8* unk_0C; - /* 0x10 */ s32 unk_10; - /* 0x14 */ s32 unk_14; -} UnkStruct_D_800D1AEC; +void func_80087788(void); -extern f32 D_800D19F0; -extern s32 D_800D19F4; -extern s32 D_800D19F8; +// Segmented addresses -extern UnkStruct_D_800D1AEC D_800D1AEC[]; - -extern f32 D_800D1CFC; -extern f32 D_800D1E10; -extern s32 D_80161710; -extern s32 D_80161738[4]; -extern s32 D_80161748[4]; -extern s32 D_80161758; -extern s32 D_80161760[4]; -extern f32 D_80161770; -extern f32 D_80161774; -extern f32 D_80161778; -extern f32 D_8016177C; -extern f32 D_80161780; -extern f32 D_80161784; -extern s32 D_801617C0[10]; -extern s32 D_80161838[10]; -extern f32 D_801618C8[20]; -extern s32 D_80161860[20]; -extern f32 D_801618B0[20]; extern u8 D_1000000[]; -extern u8 D_1000280; +extern u8 D_1000280[]; extern u8 D_1000640[]; +extern u16 D_1000E80[]; +extern u16 D_1002280[]; +extern u16 D_10030D0[]; +extern s32 D_1011280[]; +extern s32 D_10116A0[]; +extern s32 D_10116B0[]; +extern s32 D_1011730[]; +extern s32 D_1011AC0[]; +extern s32 D_1011B90[]; +extern s32 D_1011BB0[]; +extern s32 D_1011C80[]; +extern s32 D_1011CA0[]; +extern s32 D_1011D70[]; +extern s32 D_1011D90[]; +extern s32 D_1011E60[]; +extern s32 D_1013580[]; +extern s32 D_1013700[]; +extern Gfx D_20031B0[]; +extern Gfx D_2010A30[]; +extern u16 D_3000B20[]; +extern u8 D_30013E0[]; extern Gfx D_1012110[]; extern Gfx D_101C2E0[]; extern Gfx D_1024990[]; +extern Gfx D_101C170[]; +extern Gfx D_101C000[]; +extern Gfx D_101BE90[]; +extern Gfx D_101BD20[]; +extern Gfx D_101BBB0[]; +extern Gfx D_101BA40[]; +extern Gfx D_101B8D0[]; +extern Gfx D_101B760[]; +extern Gfx D_101B5F0[]; +extern Gfx D_101B480[]; +extern Gfx D_101B310[]; +extern Gfx D_101B1A0[]; extern u16 D_3000120[]; extern u8 D_5000500[]; extern u8 D_5001110[]; @@ -52,19 +119,60 @@ extern u8 D_5004580[]; extern u8 D_5004DC0[]; extern u8 D_5004E20[]; extern u8 D_5005460[]; +extern u8 D_5009F60[]; +extern u8 D_500A050[]; +extern u8 D_500A140[]; +extern u8 D_500A230[]; +extern u8 D_500A320[]; +extern u8 D_500A410[]; +extern u8 D_500A500[]; +extern u8 D_500A5F0[]; +extern u8 D_500A6E0[]; +extern u8 D_500A7D0[]; extern u16 D_6000840[]; extern u16 D_6000C80[]; +extern u8 D_6000D80[]; extern u8 D_6001260[]; extern u8 D_60012D0[]; extern u8 D_6002890[]; extern Gfx D_6003090[]; -void func_80084930(f32, f32, s32); -void func_80086444(void); -void func_80087788(void); -void func_801BE034(Actor*, Player*); +// DATA SECTION START + +s16 D_800D1970 = 0; + +// unused +UNK_TYPE D_800D1974[14] = { 0 }; + +f32 D_800D19AC[] = { 255.0f, 255.0f, 255.0f, 255.0f, 255.0f }; + +f32 D_800D19C0[] = { 255.0f, 255.0f, 255.0f, 255.0f }; + +s32 D_800D19D0[] = { 0, 0, 0, 0 }; + +f32 D_800D19E0[] = { 1.0f, 1.0f, 1.0f, 1.0f }; + +f32 D_800D19F0 = 0.0f; + +s32 D_800D19F4 = 0; + +s32 D_800D19F8 = 0; + +s32 D_800D19FC = 0; + +Vtx D_800D1A00[] = { + { 10, 10, 0, 0, 0, 0, 255, 255, 255, 255 }, + { -10, 10, 0, 0, 0, 0, 255, 255, 255, 255 }, + { -10, -10, 0, 0, 0, 0, 255, 255, 255, 255 }, + { 10, -10, 0, 0, 0, 0, 255, 255, 255, 255 }, +}; + +Gfx D_800D1A40[] = { + gsSPVertex(D_800D1A00, 4, 0), + gsSP1Quadrangle(1, 2, 3, 0, 0), + gsSPEndDisplayList(), +}; -#ifdef IMPORT_DATA void func_80084930(f32 arg0, f32 arg1, s32 arg2) { u8* D_800D1A58[] = { D_3000000, @@ -127,11 +235,7 @@ void func_80084930(f32 arg0, f32 arg1, s32 arg2) { func_800869A0(arg0, arg1, arg2, 1.0f, 1, 99); } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80084930.s") -#endif -#ifdef IMPORT_DATA void func_80084B94(s32 arg0) { s32 i; Vec3f D_800D1A70[] = { @@ -170,9 +274,6 @@ void func_80084B94(s32 arg0) { Matrix_Pop(&gGfxMatrix); } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80084B94.s") -#endif void func_80084E78(Gfx** gfxP, void* arg1, void* arg2, u32 arg3, u32 arg4, f32 arg5, f32 arg6, f32 arg7, f32 arg8, f32 arg9, f32 argA) { @@ -249,11 +350,9 @@ void func_80085890(f32 arg0, f32 arg1, f32 arg2, f32 arg3) { } } -#ifdef IMPORT_BSS void func_80085944(void) { - Gfx* D_800D1A94[] = { (Gfx*) 0x0101C170, (Gfx*) 0x0101C000, (Gfx*) 0x0101BE90, (Gfx*) 0x0101BD20, - (Gfx*) 0x0101BBB0, (Gfx*) 0x0101BA40, (Gfx*) 0x0101B8D0, (Gfx*) 0x0101B760, - (Gfx*) 0x0101B5F0, (Gfx*) 0x0101B480, (Gfx*) 0x0101B310, (Gfx*) 0x0101B1A0 }; + Gfx* D_800D1A94[] = { D_101C170, D_101C000, D_101BE90, D_101BD20, D_101BBB0, D_101BA40, + D_101B8D0, D_101B760, D_101B5F0, D_101B480, D_101B310, D_101B1A0 }; s32 i; s32 j; f32 D_800D1AC4[] = { 0.0f, -30.0f, -26.0f, -22.0f, -18.0f }; @@ -263,9 +362,9 @@ void func_80085944(void) { f32 y; s32 temp; - D_801618C8[6] += 0.7f; - if (D_801618C8[6] >= 12.0f) { - D_801618C8[6] = 0.0f; + D_801618B0[6] += 0.7f; + if (D_801618B0[6] >= 12.0f) { + D_801618B0[6] = 0.0f; } if (D_80161900[4]) { @@ -289,7 +388,7 @@ void func_80085944(void) { D_80161860[1 + i] = 1; D_80161900[0 + i] = 14; - D_801618C8[2 + i] = 0.0f; + D_801618B0[2 + i] = 0.0f; if (i == 2) { D_80161900[4] = 28; @@ -328,9 +427,9 @@ void func_80085944(void) { case 2: if (D_80161900[i]) { if (D_80161900[i + 0] >= 7) { - D_801618C8[i + 2] += 0.15f; + D_801618B0[i + 2] += 0.15f; } else { - D_801618C8[i + 2] -= 0.15f; + D_801618B0[i + 2] -= 0.15f; } RCP_SetupDL(&gMasterDisp, 0x3E); @@ -338,8 +437,8 @@ void func_80085944(void) { Matrix_Push(&gGfxMatrix); Matrix_Translate(gGfxMatrix, D_800D1AC4[i + 1], D_800D1AD8[i + 1], -100.0f, 0); - Matrix_RotateZ(gGfxMatrix, (3.14159265358979323846f / 180.0f) * D_801618C8[0], 1); - Matrix_Scale(gGfxMatrix, D_801618C8[i + 2], D_801618C8[i + 2], D_801618C8[i + 2], 1); + Matrix_RotateZ(gGfxMatrix, (3.14159265358979323846f / 180.0f) * D_801618B0[0], 1); + Matrix_Scale(gGfxMatrix, D_801618B0[i + 2], D_801618B0[i + 2], D_801618B0[i + 2], 1); Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, D_101C2E0); @@ -373,7 +472,7 @@ void func_80085944(void) { gDPSetPrimColor(gMasterDisp++, 0, 0, 180, 180, 0, 50); gSPDisplayList(gMasterDisp++, D_1012110); } else { - temp = D_801618C8[6]; + temp = D_801618B0[6]; gSPDisplayList(gMasterDisp++, D_800D1A94[temp]); } Matrix_Pop(&gGfxMatrix); @@ -390,26 +489,18 @@ void func_80085944(void) { if (D_80161860[j + 1] == 1) { D_80161860[j + 1] = 2; D_80161900[j + 0] = 14; - D_801618C8[j + 2] = 0.0f; + D_801618B0[j + 2] = 0.0f; D_80161900[4] = 28; } else { D_80161860[j + 1] = 0; D_80161900[j + 0] = 14; - D_801618C8[j + 2] = 0.0f; + D_801618B0[j + 2] = 0.0f; } } } - D_801618C8[0] += 35.0f; - D_801618C8[1] += 10.0f; + D_801618B0[0] += 35.0f; + D_801618B0[1] += 10.0f; } -#else -#ifdef IMPORT_DATA -Gfx* D_800D1A94[] = { (Gfx*) 0x0101C170, (Gfx*) 0x0101C000, (Gfx*) 0x0101BE90, (Gfx*) 0x0101BD20, - (Gfx*) 0x0101BBB0, (Gfx*) 0x0101BA40, (Gfx*) 0x0101B8D0, (Gfx*) 0x0101B760, - (Gfx*) 0x0101B5F0, (Gfx*) 0x0101B480, (Gfx*) 0x0101B310, (Gfx*) 0x0101B1A0 }; -#endif -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80085944.s") -#endif void func_80086110(f32 arg0, f32 arg1, s32 arg2) { f32 temp = 0.82f; @@ -500,7 +591,18 @@ s32 func_800863C8(void) { return ret; } -#ifdef IMPORT_DATA +UnkStruct_D_800D1AEC D_800D1AEC[] = { + { D_500A050, 16, 15, (u8*) D_6000000, 128, 28 }, { D_500A140, 16, 15, (u8*) D_6000000, 96, 28 }, + { D_500A140, 16, 15, (u8*) D_6000000, 176, 12 }, { D_500A230, 16, 15, (u8*) D_6000000, 168, 28 }, + { D_500A230, 16, 15, (u8*) D_6000000, 168, 28 }, { D_500A230, 16, 15, (u8*) D_6000000, 96, 13 }, + { D_500A320, 16, 15, (u8*) D_6000000, 176, 12 }, { D_500A320, 16, 15, (u8*) D_6000000, 112, 13 }, + { D_500A320, 16, 15, (u8*) D_6000000, 112, 28 }, { D_500A410, 16, 15, (u8*) D_6000000, 96, 28 }, + { D_500A410, 16, 15, (u8*) D_6000000, 160, 28 }, { D_500A410, 16, 15, (u8*) D_6000000, 176, 12 }, + { D_500A500, 16, 15, (u8*) D_6000000, 168, 19 }, { D_500A500, 16, 15, (u8*) D_6000000, 104, 28 }, + { 0x0500A5F0, 16, 15, D_6000D80, 128, 28 }, { 0x0500A5F0, 16, 15, D_60012D0, 128, 28 }, + { 0x0500A5F0, 16, 15, 0x0C000A80, 128, 28 }, { D_5009F60, 16, 15, 0x05000D50, 80, 12 }, +}; + void func_80086444(void) { s32 i = 9; s32 j; @@ -518,7 +620,7 @@ void func_80086444(void) { i = 1; break; - case LEVEL_VENOM_ANDROSS: + case LEVEL_VENOM_1: i = 0; break; @@ -536,9 +638,6 @@ void func_80086444(void) { } } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80086444.s") -#endif void func_80086664(f32 x, f32 y) { s32 i; @@ -630,14 +729,14 @@ void func_80086664(f32 x, f32 y) { } } -#ifdef IMPORT_DATA void func_800869A0(f32 arg0, f32 arg1, s32 k, f32 arg3, s32 arg4, s32 arg5) { s32 var_s2; s32 i; s32 j; u16* D_800D1CD4[] = { - D_5009F60, D_500A050, D_500A140, D_500A230, D_500A320, D_500A410, D_500A500, D_500A5F0, D_500A6E0, D_500A7D0, + (u16*) D_5009F60, (u16*) D_500A050, (u16*) D_500A140, (u16*) D_500A230, (u16*) D_500A320, + (u16*) D_500A410, (u16*) D_500A500, (u16*) D_500A5F0, (u16*) D_500A6E0, (u16*) D_500A7D0, }; if (arg4 != 0) { @@ -660,9 +759,6 @@ void func_800869A0(f32 arg0, f32 arg1, s32 k, f32 arg3, s32 arg4, s32 arg5) { } TextureRect_8bIA(&gMasterDisp, D_800D1CD4[k], 16, 15, arg0, arg1, arg3, arg3); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800869A0.s") -#endif void func_80086C08(f32 xPos, f32 yPos, f32 xScale, f32 yScale) { RCP_SetupDL(&gMasterDisp, 0x4E); @@ -699,6 +795,8 @@ void func_80086CC8(void) { } } +f32 D_800D1CFC = 0.0f; + void func_80086DCC(void) { s32 i; s32 j; @@ -861,7 +959,6 @@ void func_80086DCC(void) { } } -#ifdef IMPORT_DATA void func_80087530(f32 x, f32 y, s32 number) { u8* D_800D1D00[] = { 0x03000000, 0x03000000, 0x03000000 }; u16* D_800D1D0C[] = { 0x03000080, 0x03000080, 0x03000080 }; @@ -924,11 +1021,7 @@ void func_80087530(f32 x, f32 y, s32 number) { gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 0, 255); Graphics_DisplayHUDNumber(x2, y2, number); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80087530.s") -#endif -#ifdef IMPORT_DATA void func_80087788(void) { u16* D_800D1D18[] = { D_10050E0, D_100BAC0, D_100D900, D_10032A0 }; u8* D_800D1D28[] = { 0x05006CB0, 0x05006E90, 0x05006B30 }; @@ -986,9 +1079,6 @@ void func_80087788(void) { func_80086110(x[j][2], y[j][2], shield); } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80087788.s") -#endif void func_80087B5C(void) { s32 i; @@ -1305,7 +1395,6 @@ s32 func_800886B8(void) { return var_v1; } -#ifdef IMPORT_DATA void func_80088784(s32 arg0) { Gfx* D_800D1D4C[] = { D_200B630, D_200A5A0, D_2009510, D_2008480, D_20073F0, D_2006360, D_200C6C0, D_20052D0, D_2004240, @@ -1337,12 +1426,8 @@ void func_80088784(s32 arg0) { Matrix_Pop(&gGfxMatrix); } } -#else -void func_80088784(s32 arg0); -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80088784.s") -#endif -#ifdef IMPORT_BSS +// #if defined(IMPORT_BSS) || defined(NON_MATCHING) // needs D_80161838 to be static void func_80088970(void) { s32 i; @@ -1388,7 +1473,7 @@ void func_80088970(void) { if (ret != 0) { D_80161838[0] = 0; if (((ret > 0) && (D_80161810[1] == 1)) || ((ret < 0) && (D_80161810[1] == 0))) { - D_80161810[1] = D_80161810[1] ^ 1; + D_80161810[1] ^= 1; Audio_PlaySfx(0x49000002U, &D_800C5D28, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); } } @@ -1475,7 +1560,8 @@ void func_80088970(void) { if (D_80161838[1] == 6) { gLifeCount[gPlayerNum]--; } - if ((D_80161838[1] += 1) > 13) { + D_80161838[1]++; + if (D_80161838[1] > 13) { D_80161810[0] = 4; D_80161838[1] = 0; } @@ -1665,9 +1751,10 @@ void func_80088970(void) { } } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80088970.s") -#endif +// #else +// void func_80088970(void); +// #pragma GLOBAL_ASM("asm/us/nonmatchings/main/fox_hud/func_80088970.s") +// #endif void func_80089670(void) { RCP_SetupDL(&gMasterDisp, 0x3E); @@ -1709,7 +1796,8 @@ void func_800898F0(void) { gSPDisplayList(gMasterDisp++, D_6004570); } -#ifdef IMPORT_DATA +f32 D_800D1E10 = 0.0f; + void func_80089994(s32 arg0) { s32 D_800D1E14[][4] = { { 177, 242, 12, 255 }, { 89, 121, 6, 128 }, { 90, 90, 255, 255 }, { 45, 45, 128, 128 }, @@ -1733,9 +1821,6 @@ void func_80089994(s32 arg0) { Matrix_SetGfxMtx(&gMasterDisp); gSPDisplayList(gMasterDisp++, D_1015510); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80089994.s") -#endif void func_80089AF4(void) { RCP_SetupDL(&gMasterDisp, 0x3E); @@ -1873,7 +1958,6 @@ void func_80089E98(s32 arg0) { } } -#ifdef IMPORT_DATA void func_8008A07C(f32 x, f32 y) { f32 D_800D1E94[] = { 20.0f, 180.0f, 20.0f, 180.0f }; f32 D_800D1EA4[] = { 72.0f, 72.0f, 192.0f, 192.0f }; @@ -1907,10 +1991,6 @@ void func_8008A07C(f32 x, f32 y) { gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255); func_80085404(xPos, yPos, xScale1, yScale1); } -#else -void func_8008A07C(f32 x, f32 y); -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008A07C.s") -#endif void func_8008A240(void) { s32 i; @@ -2284,6 +2364,10 @@ void func_8008B2A4(void) { } } +s32 D_800D1EB4 = 255; +s32 D_800D1EB8 = 255; +s32 D_800D1EBC = 255; + void func_8008B2F0(void) { f32 var_fv0; @@ -2662,10 +2746,10 @@ void func_8008C104(u16* texture, u16* arg1) { Texture_Mottle(dst, src, 2); } -#ifdef IMPORT_DATA void func_8008C390(f32 arg0, f32 arg1, f32 arg2, s32 arg3) { u16* D_800D1EC0[] = { - D_5000000, D_5000080, D_5000100, D_5000180, D_5000200, D_5000280, D_5000300, D_5000380, D_5000400, D_5000480, + (u16*) D_5000000, (u16*) D_5000080, (u16*) D_5000100, (u16*) D_5000180, (u16*) D_5000200, + (u16*) D_5000280, (u16*) D_5000300, (u16*) D_5000380, (u16*) D_5000400, (u16*) D_5000480, }; s32 i; @@ -2681,11 +2765,7 @@ void func_8008C390(f32 arg0, f32 arg1, f32 arg2, s32 arg3) { TextureRect_8bIA(&gMasterDisp, D_800D1EC0[arg3 / i], 16, 8, arg0, arg1, arg2, arg2); } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008C390.s") -#endif -#ifdef IMPORT_DATA void func_8008C5C8(f32 arg0, f32 arg1, f32 arg2, s32 arg3) { u16* D_800D1EE8[] = { D_10050E0, @@ -2701,11 +2781,7 @@ void func_8008C5C8(f32 arg0, f32 arg1, f32 arg2, s32 arg3) { } TextureRect_16bRGBA(&gMasterDisp, D_800D1EE8[arg3] + 1760, 44, 4, arg0, (40.0f * arg2) + arg1, arg2, arg2); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008C5C8.s") -#endif -#ifdef IMPORT_DATA void func_8008C6F4(s32 idx, s32 arg1) { f32 D_800D1EF8[] = { 0.0f, 0.0f, -9.0f, 9.0f, 10.0f, 10.0f, 10.0f, 10.0f, 0.0f, 0.0f, -8.0f, 8.0f }; f32 D_800D1F28[] = { -7.0f, 7.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 8.0f, -8.0f, 0.0f, 0.0f }; @@ -2744,11 +2820,7 @@ void func_8008C6F4(s32 idx, s32 arg1) { Matrix_Pop(&gGfxMatrix); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008C6F4.s") -#endif -#ifdef IMPORT_DATA void func_8008CA44(void) { s32 D_800D2048[] = { 0x80, 0x40, 0x20, 0x10, 0x0A, 0x09, 0x06, 0x05, 0x08, 0x04, 0x02, 0x01, @@ -2756,8 +2828,8 @@ void func_8008CA44(void) { s32 i; s32 j; - if ((gPlayer[gPlayerNum].unk228 != 0) && (gPlayer[gPlayerNum].unk210 == 0) && (D_80177854 != 100)) { - j = gPlayer[gPlayerNum].unk228; + if ((gPlayer[gPlayerNum].unk_228 != 0) && (gPlayer[gPlayerNum].timer_210 == 0) && (D_80177854 != 100)) { + j = gPlayer[gPlayerNum].unk_228; for (i = 0; i < 12; i++) { if ((j & D_800D2048[i]) != D_800D2048[i]) { @@ -2776,9 +2848,6 @@ void func_8008CA44(void) { func_8008BD00(D_1024A58, 8, 8, 2); } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008CA44.s") -#endif s32 func_8008CB8C(void) { return 0; @@ -2788,7 +2857,6 @@ void func_8008CB98(f32 arg0, f32 arg1, f32 arg2) { TextureRect_8bIA(&gMasterDisp, D_30013E0, 8, 8, arg0, arg1, arg2, arg2); } -#ifdef IMPORT_DATA void func_8008CBE4(void) { f32 D_800D2078[] = { 62.0f, 222.0f, 62.0f, 222.0f }; // X f32 D_800D2088[] = { 86.0f, 86.0f, 206.0f, 206.0f }; // Y @@ -2855,9 +2923,6 @@ void func_8008CBE4(void) { break; } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008CBE4.s") -#endif void func_8008CFB8(f32 arg0, f32 arg1, f32 arg2, f32 arg3) { s32 i; @@ -2878,7 +2943,6 @@ void func_8008D1F0(f32 arg0, f32 arg1, f32 arg2, f32 arg3) { TextureRect_4bCI(&gMasterDisp, D_10116B0, D_1011730, 16, 16, arg0, arg1, arg2, arg3); } -#ifdef IMPORT_DATA void func_8008D250(void) { f32 D_800D20C8[] = { 113.0f, 273.0f, 113.0f, 273.0f }; f32 D_800D20D8[] = { 79.0f, 79.0f, 199.0f, 199.0f }; @@ -2887,11 +2951,7 @@ void func_8008D250(void) { gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255); func_8008C5C8(D_800D20C8[gPlayerNum], D_800D20D8[gPlayerNum], 0.54f, gPlayerNum); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008D250.s") -#endif -#ifdef IMPORT_DATA void func_8008D31C(void) { f32 D_800D20E8[] = { 60.0f, 220.0f, 60.0f, 220.0f }; f32 D_800D20F8[] = { 78.0f, 78.0f, 198.0f, 198.0f }; @@ -2907,11 +2967,7 @@ void func_8008D31C(void) { func_8008CFB8(D_800D20E8[gPlayerNum], D_800D20F8[gPlayerNum], 1.0f, 1.0f); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008D31C.s") -#endif -#ifdef IMPORT_DATA void func_8008D4F0(f32 arg0, f32 arg1) { f32 D_800D2108[] = { 110.0f, 270.0f, 110.0f, 270.0f, 0.0f, @@ -2969,11 +3025,7 @@ void func_8008D4F0(f32 arg0, f32 arg1) { gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 255); func_80085740(D_800D2108[var_v1], D_800D211C[var_v1], 1.0f, 1.0f); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008D4F0.s") -#endif -#ifdef IMPORT_DATA void func_8008D7F4(void) { s32 D_800D2130[] = { 146, 165, 146, 165 }; s32 D_800D2140[] = { 106, 106, 125, 125 }; @@ -2985,11 +3037,12 @@ void func_8008D7F4(void) { gDPSetPrimColor(gMasterDisp++, 0, 0, D_800D2150[gPlayerNum], D_800D2160[gPlayerNum], D_800D2170[gPlayerNum], 255); Graphics_DisplayHUDNumber(D_800D2130[gPlayerNum], D_800D2140[gPlayerNum], gPlayerNum + 1); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008D7F4.s") -#endif -#ifdef IMPORT_DATA +s32 D_800D2180[4] = { 0, 0, 0, 0 }; +s32 D_800D2190[4] = { 0, 0, 0, 0 }; +f32 D_800D21A0 = 255.0f; +f32 D_800D21A4 = 0.0f; + void func_8008D984(void) { s32 D_800D21A8[] = { 146, 165, 146, 165 }; s32 D_800D21B8[] = { 94, 94, 137, 137 }; @@ -3024,9 +3077,6 @@ void func_8008D984(void) { func_8008D1F0(D_800D21A8[gPlayerNum], D_800D21B8[gPlayerNum], 1.0f, 1.0f); } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008D984.s") -#endif void func_8008DC34(void) { if ((D_80177E7C != 0) && (D_80178750 == 0)) { @@ -3657,7 +3707,6 @@ void func_8008FE78(Boss* boss) { gDPSetTextureFilter(gMasterDisp++, G_TF_BILERP); } -#ifdef IMPORT_DATA void func_8008FFF0(Boss* boss, s32 arg1) { Vec3s D_800D21C8[] = { { -385, 54, 233 }, { -324, 148, 193 }, { -267, 186, 136 }, { -128, 430, 180 }, { -231, 584, 140 }, @@ -3704,9 +3753,6 @@ void func_8008FFF0(Boss* boss, s32 arg1) { break; } } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8008FFF0.s") -#endif s32 func_80090200(Boss* boss) { Vec3f dest, src; @@ -4475,11 +4521,238 @@ void func_800922F4(Actor* actor) { } } -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800924E0.s") +bool func_800924E0(Actor* actor) { + Vec3f src; + Vec3f dest; + f32 var_fv0; + bool ret = false; -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800927A0.s") + if (actor->iwork[7] == 0) { + actor->vwork[29].x = actor->obj.rot.x; + actor->iwork[7] = 1; + actor->iwork[1] = 1; + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80092D48.s") + if (actor->fwork[29] < 2.0f) { + actor->fwork[29] = 2.0f; + } + + var_fv0 = 60.0f; + + if (actor->fwork[19] > 240.0f) { + var_fv0 = -50.0f; + } + + Math_SmoothStepToF(&actor->fwork[15], var_fv0, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[26], var_fv0, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[16], var_fv0, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[27], var_fv0, 0.3f, 100.0f, 0.0f); + + if (actor->fwork[19] < 180.0f) { + actor->obj.pos.y += 2.0f; + } + + if (Math_SmoothStepToF(&actor->fwork[19], 360.0f, 0.1f, 5.0f, 0.01f) == 0.0f) { + actor->obj.rot.x = actor->vwork[29].x; + actor->fwork[19] = actor->vwork[29].x = 0.0f; + ret = true; + actor->iwork[7] = 0; + actor->fwork[29] = 1.0f; + } + + if (actor->iwork[7] != 0) { + Math_SmoothStepToAngle(&actor->vwork[29].x, 0.0f, 0.1f, 5.0f, 0.0f); + Math_SmoothStepToAngle(&actor->obj.rot.z, 0.0f, 0.1f, 5.0f, 0.0f); + actor->obj.rot.x = actor->vwork[29].x + (360.0f - actor->fwork[19]); + + Matrix_RotateY(gCalcMatrix, actor->unk_0F4.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -(M_DTOR * ((actor->unk_0F4.x + actor->vwork[29].x) + actor->fwork[19])), 1); + + src.z = actor->fwork[1]; + src.y = 0.0f; + src.x = 0.0f; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + actor->vel.x = dest.x; + actor->vel.y = dest.y; + actor->vel.z = dest.z; + + if (actor->obj.pos.y < gGroundLevel + 50.0f) { + actor->obj.pos.y = gGroundLevel + 50.0f; + actor->vel.y = 0.0f; + } + } + + return ret; +} + +bool func_800927A0(Actor* actor) { + Vec3f src; + Vec3f dest; + f32 sp54; + f32 sp50; + bool ret = false; + + if (actor->iwork[11] == 0) { + actor->unk_046 = 0; + actor->iwork[11] = 1; + actor->iwork[1] = 1; + actor->vwork[29].x = actor->obj.rot.x; + actor->vwork[29].y = actor->obj.rot.y; + actor->vwork[29].z = actor->obj.rot.z; + } else { + Math_SmoothStepToAngle(&actor->vwork[29].z, 0.0f, 0.1f, 5.0f, 0.0f); + Math_SmoothStepToAngle(&actor->vwork[29].y, 0.0f, 0.1f, 5.0f, 0.0f); + Math_SmoothStepToAngle(&actor->vwork[29].x, 0.0f, 0.1f, 5.0f, 0.0f); + sp50 = Math_RadToDeg(Math_Atan2F(0.0f - actor->obj.pos.x, 0.0f - actor->obj.pos.z)); + + switch (actor->unk_046) { + case 0: + if (actor->unk_04A != 0) { + actor->timer_0BC = 30; + } else { + actor->timer_0BC = 10; + } + actor->unk_046 = 1; + if (actor->fwork[19] > 180.0f) { + actor->fwork[19] = actor->fwork[19] - 360.0f; + } + + case 1: + if (actor->timer_0BC == 0) { + actor->unk_046 = 2; + if (actor->unk_04A != 0) { + actor->timer_0BC = 80; + } else { + actor->timer_0BC = 60; + } + Math_SmoothStepToF(&actor->fwork[20], 0.0f, 0.1f, 15.0f, 0.0f); + } + break; + + case 2: + if (actor->fwork[19] > 140.0f) { + sp54 = 0.0f; + } else { + sp54 = 60.0f; + } + + Math_SmoothStepToF(&actor->fwork[15], sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[26], sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[16], sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[27], sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[19], 190.0f, 0.1f, 6.0f, 0.001f); + Math_SmoothStepToF(&actor->fwork[20], 0.0f, 0.1f, 15.0f, 0.0f); + + if (actor->fwork[19] > 180.0f) { + actor->unk_0F4.y += 180.0f; + if (actor->unk_0F4.y >= 360.0f) { + actor->unk_0F4.y = actor->unk_0F4.y - 360.0f; + } + + actor->fwork[19] -= 180.0f; + + if ((sp50 - actor->unk_0F4.y) < 180.0f) { + actor->fwork[20] = 180.0f; + } else { + actor->fwork[20] = -180.0f; + } + actor->iwork[1] = 1; + actor->unk_046 = 3; + } + actor->fwork[28] -= 0.2f; + break; + + case 3: + if (actor->fwork[29] < 2.0f) { + actor->fwork[29] = 2.0f; + } + Math_SmoothStepToF(&actor->fwork[20], 0.0f, 0.1f, 15.0f, 0.0f); + + sp54 = actor->fwork[20] * 0.3f; + + Math_SmoothStepToF(&actor->fwork[15], sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[26], sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[16], -sp54, 0.3f, 100.0f, 0.0f); + Math_SmoothStepToF(&actor->fwork[27], -sp54, 0.3f, 100.0f, 0.0f); + + if (actor->unk_04A != 0) { + Math_SmoothStepToAngle(&actor->unk_0F4.y, sp50, 0.1f, 2.0f, 0.0f); + } + + if (actor->obj.pos.y < gPlayer[0].unk_0A0) { + if (actor->fwork[28] < 0.0f) { + actor->fwork[28] = actor->fwork[28] + 0.2f; + } + } else { + actor->fwork[28] -= 0.2f; + } + + if (actor->timer_0BC == 0) { + ret = true; + actor->iwork[11] = 0; + actor->unk_046 = 0; + actor->fwork[28] = 0.0f; + actor->fwork[20] = 0.0f; + actor->fwork[29] = 1.0f; + } + break; + } + + actor->obj.rot.x = actor->vwork[29].x - actor->fwork[19]; + actor->obj.rot.y = actor->unk_0F4.y; + actor->obj.rot.z = actor->vwork[29].z + actor->fwork[20]; + actor->obj.pos.y += actor->fwork[28]; + + Matrix_RotateY(gCalcMatrix, actor->unk_0F4.y * 0.017453292f, 0U); + Matrix_RotateX(gCalcMatrix, -(M_DTOR * (actor->unk_0F4.x + actor->vwork[29].x + actor->fwork[19])), 1); + + src.z = actor->fwork[1]; + src.y = 0.0f; + src.x = 0.0f; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + actor->vel.x = dest.x; + actor->vel.y = dest.y; + actor->vel.z = dest.z; + } + return ret; +} + +void func_80092D48(Actor* actor) { + s32 D_800D22A8[] = { 1, 2, 3 }; + + if (gCurrentLevel != LEVEL_TITANIA) { + actor->fwork[1] = 40.0f; + actor->fwork[3] = 1.2f; + actor->unk_0E4 = (D_800D1970 & 3) + 1; + D_800D1970++; + } else { + actor->unk_0B8 = 7; + actor->unk_0E4 = 2; + actor->iwork[5] = 0; + gTeamShields[2] = 255; + } + + actor->iwork[12] = D_800D22A8[actor->unk_0E4 - 1]; + actor->iwork[11] = 1; + + if (gLevelType == LEVELTYPE_PLANET) { + actor->unk_0C9 = 1; + } + + Audio_PlaySfx(0x3100000CU, &actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + + if (((D_800D1970 & 3) == 2) && (gCurrentLevel == LEVEL_SECTOR_X)) { + Object_Kill(&actor->obj, &actor->sfxPos); + } + + if (gTeamShields[actor->unk_0E4] <= 0) { + Object_Kill(&actor->obj, &actor->sfxPos); + } +} void func_80092EC0(Actor* actor) { f32 var_fv1; @@ -4520,7 +4793,7 @@ void func_80092EC0(Actor* actor) { } if ((actor->iwork[10] != 0) && (gLevelMode == LEVELMODE_ALL_RANGE) && (actor->iwork[9] == 0) && - (gPlayer->state_1C8 != PLAYERSTATE_1C8_7)) { + (gPlayer[0].state_1C8 != PLAYERSTATE_1C8_7)) { actor->unk_048 = 2; actor->unk_04A = 0; } @@ -4578,7 +4851,7 @@ void func_80093164(Actor* actor) { break; case 41: - func_801BE034(actor, player); + func_i3_801BE034(actor, player); break; case 44: @@ -4624,7 +4897,7 @@ void func_800933D8(f32 x, f32 y, f32 z, f32 arg3) { Effect* effect = &gEffects[ARRAY_COUNT(gEffects) - 1]; Player* player = gPlayer; - for (i = 0; i < 100; i++) { + for (i = 0; i < ARRAY_COUNT(gEffects); i++) { if (effect->obj.status == 0) { Effect_Initialize(effect); effect->obj.status = 1; @@ -4668,10 +4941,446 @@ void func_800933D8(f32 x, f32 y, f32 z, f32 arg3) { } } -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800935E8.s") +f32 D_800D22B4 = -100.0f; +f32 D_800D22B8 = 0.01f; +f32 D_800D22BC = 0.04f; +f32 D_800D22C0 = 0.05f; +f32 D_800D22C4 = 260.0f; +f32 D_800D22C8 = 260.0f; +f32 D_800D22CC = 260.0f; +s32 D_800D22D0 = 50; +s32 D_800D22D4 = 2; +void func_800935E8(Player* player) { + Vec3f D_800D22D8[] = { { -1730.0f, 1600.0f, -6690.0f }, + { -830.0f, 1600.0f, -7380.0f }, + { 0.0f, 1600.0f, -7380.0f } }; + Vec3f D_800D22FC[] = { { 0.0f, 0.0f, 0.0f }, { 190.0f, 2570.0f, -4740.0f }, { 0.0f, 0.0f, 0.0f } }; + Vec3f D_800D2320[] = { { 50.0f, -165.0f, -900.0f }, { -100.0f, -165.0f, -900.0f }, { -100.0f, -165.0f, -850.0f }, + { -200.0f, -165.0f, -800.0f }, { -200.0f, -165.0f, -750.0f }, { -240.0f, -165.0f, -700.0f }, + { -240.0f, -165.0f, -650.0f }, { -280.0f, -165.0f, -600.0f }, { -280.0f, -165.0f, -550.0f }, + { -320.0f, -165.0f, -500.0f }, { -320.0f, -165.0f, -450.0f }, { -360.0f, -165.0f, -400.0f }, + { -360.0f, -165.0f, -350.0f }, { -400.0f, -165.0f, -300.0f }, { -400.0f, -165.0f, -250.0f }, + { -440.0f, -165.0f, -200.0f }, { -440.0f, -165.0f, -150.0f }, { -480.0f, -165.0f, -100.0f }, + { -480.0f, -165.0f, -50.0f }, { -520.0f, -165.0f, 0.0f }, { -520.0f, -165.0f, 50.0f }, + { -560.0f, -165.0f, 100.0f }, { -560.0f, -165.0f, 150.0f }, { -600.0f, -165.0f, 200.0f }, + { -600.0f, -165.0f, 250.0f }, { -640.0f, -165.0f, 300.0f }, { -640.0f, -165.0f, 350.0f }, + { -680.0f, -165.0f, 400.0f }, { -680.0f, -165.0f, 450.0f }, { -720.0f, -165.0f, 500.0f }, + { -720.0f, -165.0f, 550.0f }, { -50.0f, -165.0f, -900.0f } }; + Vec3f src, dest; + f32 x; + f32 y; + f32 z; + f32 stepSize; + f32 temp2; + f32 temp; + s32 i; + s32 j; + Actor* actor; + + actor = &gActors[0]; + + switch (player->unk_1D0) { + + case 0: + func_80093310(); + D_80177A80 = 0; + D_80177AB0 = 1; + D_80177AC8 = 1; + player->unk_234 = 0; + player->unk_1D0 = 1; + player->unk_208 = 0; + player->unk_0D0 = 0.0f; + + D_80178340 = 255; + D_80178348 = D_80178350 = D_80178354 = 0; + D_80178358 = 0; + + player->camEye.x = D_80177978 = -3061.2f; + player->camEye.y = D_80177980 = 1745.9f; + player->camEye.z = D_80177988 = -5786.0f; + + player->camAt.x = D_801779A0 = 300.0f; + player->camAt.y = D_801779B8 = 2200.0f; + player->camAt.z = D_801779C0 = -5700.0f; + + D_801616A0.x = 5.18f; + D_801616A0.y = 124.17f; + D_801616A0.z = 0.00f; + + actor->unk_0F4.y = 30.0f; + + D_80177A48[5] = 14.0f; + D_80177A48[0] = 0.2f; + D_80177A10[6] = 0; + D_80177A10[7] = 0; + D_801616B0.x = D_801616B0.y = D_801616B0.z = 0.0f; + D_80177A48[7] = 0.0f; + + case 1: + if ((player->unk_208 == 0) && (D_80177A80 < 250)) { + i = Rand_ZeroOne() * 64.0f; + if (i < 32) { + for (j = 0; j < 4; j++) { + src.x = D_800D2320[i].x; + src.y = D_800D2320[i].y + (Rand_ZeroOne() * 12.0f); + src.z = D_800D2320[i].z; + + Matrix_Translate(gCalcMatrix, actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 0); + Matrix_RotateY(gCalcMatrix, M_DTOR * 30.0f, 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + x = dest.x; + y = dest.y; + z = dest.z; + + func_800933D8(x, y, z, 20.0f); + + i = (i + 1) % 32; + } + } else { + i -= 32; + for (j = 0; j < 4; j++) { + src.x = -D_800D2320[i].x; + src.y = D_800D2320[i].y + (Rand_ZeroOne() * 12.0f); + src.z = D_800D2320[i].z; + + Matrix_Translate(gCalcMatrix, actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 0); + Matrix_RotateY(gCalcMatrix, M_DTOR * 30.0f, 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + x = dest.x; + y = dest.y; + z = dest.z; + + func_800933D8(x, y, z, 20.0f); + + i = (i + 1) % 32; + } + } + player->unk_208 = (s32) (Rand_ZeroOne() * 3.0f) + 1; + } else { + player->unk_208--; + } + + if (D_80177A10[6] < 3) { + i = D_80177A10[6]; + stepSize = D_80177A48[5]; + + src.x = D_80177978; + src.y = D_80177980; + src.z = D_80177988; + + dest.x = D_800D22D8[i].x; + dest.y = D_800D22D8[i].y; + dest.z = D_800D22D8[i].z; + + if (Math_PursueVec3f(&src, &dest, &D_801616A0, stepSize, 0.4f, 4.8f, stepSize)) { + if (D_80177A10[6] == 0) { + D_80177A10[7]++; + } + D_80177A10[6]++; + } + D_80177978 = src.x; + D_80177980 = src.y; + D_80177988 = src.z; + } + + if (D_80177A10[7] == 1) { + i = D_80177A10[7]; + stepSize = D_80177A48[5]; + + src.x = D_801779A0; + src.y = D_801779B8; + src.z = D_801779C0; + + dest.x = D_800D22FC[i].x; + dest.y = D_800D22FC[i].y; + dest.z = D_800D22FC[i].z; + + if (D_80177A10[6] <= D_80177A10[7]) { + if (Math_PursueVec3f(&src, &dest, &D_801616B0, stepSize, 0.4f, 4.8f, stepSize)) { + D_80177A10[7]++; + } + } + + D_801779A0 = src.x; + D_801779B8 = src.y; + D_801779C0 = src.z; + } + + if (D_80177A80 >= 50) { + // clang-format off + if (D_80178340 == 255) { player->unk_1D0 = 2; } + // clang-format on + D_80178348 = D_80178350 = D_80178354 = 255; + D_80178358 = 255; + Math_SmoothStepToF(&D_80177A48[7], 16.0f, 0.04f, 0.05f, 0.0f); + D_8017835C = D_80177A48[7]; + } + break; + + case 2: + D_80178380[0] = 0; + + D_80177A10[0] = gLight1R; + D_80177A10[1] = gLight1G; + D_80177A10[2] = gLight1B; + D_80177A10[3] = gAmbientR; + D_80177A10[4] = gAmbientG; + D_80177A10[5] = gAmbientB; + + gLight1R = 40; + gLight1G = 100; + gLight1B = 120; + + gAmbientR = 20; + gAmbientG = 30; + gAmbientB = 50; + + D_80177A48[2] = 0.0f; + D_80177A48[3] = -1600.0f; + D_80177A48[4] = 520.0f; + + player->unk_1D0 = 3; + + D_80177AB0 = 0; + + player->unk_034 = 60.0f; + player->timer_1F8 = 1000; + + player->unk_0E8 = 30.0f; + + player->pos.z = -5100.0f; + player->pos.x = -50.0f; + player->pos.y = 1200.0f; + + D_80178358 = 0; + + func_i3_801BDF14(); + + func_8001D444(0U, 0x2DU, 0U, 0xFFU); + + case 3: + D_8017835C = 16; + + if (player->timer_1F8 > 774) { + if (D_80177A48[4] >= 200.0f) { + Math_SmoothStepToF(&D_80177A48[4], -200.0f, 1.00f, 4.0f, 4.0f); + } else { + Math_SmoothStepToF(&D_80177A48[4], -200.0f, 0.06f, 4.0f, 0.0f); + } + + src.x = D_80177A48[2]; + src.y = D_80177A48[3]; + src.z = D_80177A48[4]; + + Matrix_Translate(gCalcMatrix, actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 0); + Matrix_RotateY(gCalcMatrix, M_DTOR * 30.0f, 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + D_80177978 = dest.x; + D_80177980 = dest.y; + D_80177988 = dest.z; + + player->camAt.x = D_801779A0 = D_80177978; + player->camAt.y = D_801779B8 = D_80177980 + 100.0f; + player->camAt.z = D_801779C0 = D_80177988 + 10.0f; + + player->camEye.x = D_80177978; + player->camEye.y = D_80177980; + player->camEye.z = D_80177988; + } + + if (player->timer_1F8 == 774) { + Audio_PlaySfx(0x01038026U, &player->unk_460, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_80177A10[9] = 40; + } + + if (player->timer_1F8 <= 774) { + D_80177A48[0] = 0.0f; + temp2 = 0.0f; + + if (D_80177A10[9]) { + D_80177A10[9] -= 1; + temp = D_80177A10[9]; + if (temp > 20.0f) { + temp = 20.0f; + } + temp2 = __sinf(M_DTOR * (((f32) gGameFrameCount) * 70.0f)) * temp; + } + + player->camEye.y = D_80177980 + temp2; + player->camAt.y = D_80177980 + 100.0f; + + Math_SmoothStepToF(&player->unk_018, -1200.0f, 0.02f, 60.0f, 0.0f); + + src.x = 0.0f; + src.y = 0.0f; + src.z = player->unk_018; + + Matrix_Translate(gCalcMatrix, player->pos.x, player->pos.y, player->pos.z, 0); + Matrix_RotateY(gCalcMatrix, M_DTOR * 30.0f, 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + player->pos.x = dest.x; + player->pos.y = dest.y; + player->pos.z = dest.z; + + if (((player->timer_1F8 % 8) == 0) && (player->timer_1F8 > 740)) { + func_8007D9DC(player->camEye.x, 1600.0f, player->camEye.z, 10.0f, 100.0f, 0); + } + + if ((player->unk_018 > -200.0f) && (D_80177A10[8] < 6)) { + if (D_80177A10[8] < 2) { + func_800933D8(player->pos.x, player->pos.y - 400.0f, player->pos.z, 20.0f); + } + if (D_80177A10[8] >= 2) { + func_800933D8(player->pos.x, player->pos.y, player->pos.z, 10.0f); + } + D_80177A10[8]++; + } + + if (((gGameFrameCount % 3) == 0) && (player->timer_1F8 <= 740)) { + for (i = 0; i < 8; i++) { + func_i3_801AC8A8(player->camEye.x + (Rand_ZeroOne() - 0.5f) * D_800D22C4, + player->camEye.y + 260.0f + ((Rand_ZeroOne() - 0.5f) * D_800D22C8), + player->camEye.z + (Rand_ZeroOne() - 0.5f) * D_800D22CC, 1.0f, 0); + } + } + } + + if (player->timer_1F8 < 736) { + player->unk_1D0 = 4; + D_80177AC8 = 1; + D_80178348 = D_80178350 = D_80178354 = 255; + D_80178358 = 255; + } + break; + + case 4: + if (D_80178340 == 255) { + player->unk_1D0 = 5; + } + break; + + case 5: + player->pos.x = 0.0f; + player->pos.y = 350.0f; + player->pos.z = 0.0f; + + player->camEye.x = player->pos.x * (600.0f / player->unk_09C); + player->camEye.y = player->pos.y * (1040.0f / player->unk_0A0); + player->camEye.y -= 50.0f; + + player->camAt.x = player->pos.x * (600.0f / player->unk_09C); + player->camAt.y = player->pos.y * (1050.0f / player->unk_0A0); + player->camAt.y += player->unk_060 * 10.0f; + + player->pos.z += 1000.0f; + player->unk_034 = 0.0f; + + D_80177A48[0] = 0.1f; + + player->unk_0E8 = 0.0f; + player->unk_0D0 = 20.0f; + player->unk_234 = 1; + player->unk_1D0 = 6; + + player->timer_1F8 = 1000; + + D_80177AC8 = 0; + D_80178358 = 0; + + Object_Kill(&actor->obj, &actor->sfxPos); + + player->camEye.z = D_80177988 = 800.0f; + player->camAt.z = D_801779C0 = 0.0f; + + case 6: + player->unk_060 = __sinf(M_DTOR * (player->unk_0F4 * 0.7f)) * 0.5f; + player->unk_088 += 10.0f; + player->unk_0F4 += 8.0f; + player->unk_080 = -__sinf(M_DTOR * player->unk_088) * 0.5f; + player->unk_0F0 = __sinf(M_DTOR * player->unk_0F4) * 1.5f; + + D_80177978 = player->pos.x * (600.0f / player->unk_09C); + D_80177980 = player->pos.y * (740.0f / player->unk_0A0); + D_80177980 -= -50.0f; + + D_801779A0 = player->pos.x * (600.0f / player->unk_09C); + D_801779B8 = player->pos.y * (750.0f / player->unk_0A0); + D_801779B8 += player->unk_060 * 10.0f; + + Math_SmoothStepToF(&player->pos.z, 0.0f, 0.1f, 40.0f, 0.1f); + + D_80177A48[0] = 0.03f; + D_80177988 = 240.0f; + D_801779C0 = player->pos.z + (D_80177D20 - 1.0f); + + if (((player->timer_1F8 % 2) == 0) && (player->timer_1F8 > 962)) { + func_800933D8(player->pos.x, player->pos.y, player->pos.z + 50.0f, 20.0f); + } + + if (player->timer_1F8 <= 900) { + D_80177838 = 50; + + player->state_1C8 = PLAYERSTATE_1C8_3; + player->unk_1D0 = 0; + player->timer_1F8 = 0; + + D_80178488 = 1; + func_800182F4(0x103200FF); + func_800182F4(0x113200FF); + func_8001D444(0U, 0xEU, 0U, 0xFFU); + } + + func_i3_801AC8A8(player->pos.x + (Rand_ZeroOne() - 0.5f) * 10.0f, + player->pos.y + (Rand_ZeroOne() - 0.5f) * 10.0f, + player->pos.z - 65.0f + (Rand_ZeroOne() - 0.5f) * 10.0f, 0.4f, 1); + break; + + default: + break; + } + + Matrix_RotateY(gCalcMatrix, M_DTOR * (player->unk_0E8 + player->unk_114 + 180.0f), 0); + Matrix_RotateX(gCalcMatrix, -(M_DTOR * player->unk_0E4), 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = player->unk_0D0; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + player->vel.x = dest.x; + player->vel.y = dest.y; + player->vel.z = dest.z; + + player->pos.x += player->vel.x; + player->pos.y += player->vel.y; + D_80177CE8 -= player->vel.z; + + player->unk_0F8 = player->unk_0EC + player->unk_12C + player->unk_130; + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 50000.0f, 0.0f); +} + +// unused data +s32 D_800D24A0[] = { 60, 200 }; +f32 D_800D24A8[] = { 0.0f, 10.0f, 20.0f, 5.0f, 7.0f, 13.0f }; +f32 D_800D24C0[] = { 128.0f, 128.0f, 255.0f, 128.0f }; +s32 D_800D24C8[] = { 0, 900 }; +f32 D_800D24CC = 0.02f; + +// 60, 200, 0, void func_80094954(Effect* effect) { - Player* player = gPlayer; + Player* player = &gPlayer[0]; if ((player->state_1C8 == PLAYERSTATE_1C8_2) && (gCurrentLevel == LEVEL_AQUAS) && (player->unk_1D0 < 2)) { switch (effect->unk_4E) { @@ -4747,7 +5456,139 @@ void stub_80094D10(void) { void stub_80094D18(void) { } -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80094D20.s") +void func_80094D20(f32 x, f32 y) { + u8* D_800D24DC[] = { D_5009F60, D_500A050, D_500A140, D_500A230, D_500A320, + D_500A410, D_500A500, D_500A5F0, D_500A6E0, D_500A7D0 }; + s32 D_800D2504[] = { 100, 10, 1 }; + bool boolTemp; + s32 i; + s32 j; + s32 temp; + s32 temp2; + s32 temp3; + s32 temp4; + f32 x1; + f32 y1; + f32 xScale; + + if (gHitCount > D_8016172C) { + temp3 = D_8016172C + 1; + temp4 = D_8016172C; + } else { + temp3 = gHitCount; + temp4 = D_8016172C; + } + + boolTemp = 0; + i = 1000; + temp3 %= i; + temp4 %= i; + + for (i /= 10, j = 0; i != 1; i /= 10, j++) { + xScale = 1.0f; + x1 = x; + y1 = y + 3.0f; + + temp = temp3 / i; + temp2 = temp4 / i; + + if ((temp != 0) || (boolTemp == 1)) { + if (temp != temp2) { + D_80161720[j] += 0.4f; + if (D_80161720[j] <= 0.9f) { + xScale = D_80161720[j]; + x1 += 8.0f * xScale; + xScale = 1.0f - xScale; + } + + if ((D_80161720[j] > 0.9f) && (D_80161720[j] < 1.1f)) { + xScale = 0.0f; + } + + if (D_80161720[j] >= 2.0f) { + temp2++; + if (temp2 >= 10) { + temp2 = 0; + } + D_80161720[j] = 0.0f; + } + + if ((D_80161720[j] < 2.0f) && (D_80161720[j] >= 1.1f)) { + temp2++; + if (temp2 >= 10) { + temp2 = 0; + } + xScale = 2.0f - D_80161720[j]; + x1 += 8.0f * xScale; + xScale = 1.0f - xScale; + } + temp = temp2; + } + + if (xScale != 0.0f) { + TextureRect_8bIA(&gMasterDisp, D_800D24DC[temp], 16, 15, x1, y1, xScale, 1.0f); + } + boolTemp = 1; + } + + if ((!boolTemp) && (xScale != 0.0f)) { + TextureRect_8bIA(&gMasterDisp, D_800D24DC[0], 16, 15, x1, y1, xScale, 1.0f); + } + + x += 13.0f; + temp3 %= i; + temp4 %= i; + } + + xScale = 1.0f; + x1 = x; + y1 = y + 3.0f; + + if (temp3 != temp4) { + D_80161720[j] += 0.4f; + if (D_80161720[j] <= 0.9f) { + xScale = D_80161720[j]; + x1 += 8.0f * xScale; + xScale = 1.0f - xScale; + } + + if ((D_80161720[j] > 0.9f) && (D_80161720[j] < 1.1f)) { + xScale = 0.0f; + } + + if (D_80161720[j] >= 2.0f) { + temp4++; + if (temp4 >= 10) { + temp4 = 0; + } + D_80161720[j] = 0.0f; + } + + if ((D_80161720[j] < 2.0f) && (D_80161720[j] >= 1.1f)) { + temp4++; + if (temp4 >= 10) { + temp4 = 0; + } + xScale = 2.0f - D_80161720[j]; + x1 += 8.0f * xScale; + xScale = 1.0f - xScale; + } + temp3 = temp4; + } + + if (xScale != 0.0f) { + TextureRect_8bIA(&gMasterDisp, D_800D24DC[temp3], 16, 15, x1, y1, xScale, 1.0f); + } + + if ((gHitCount != D_8016172C) && (D_80161720[0] == 0.0f) && (D_80161720[1] == 0.0f) && (D_80161720[2] == 0.0f)) { + D_8016172C++; + + if ((D_8016172C == 4) || (D_8016172C == 9) || (D_8016172C == 14) || (D_8016172C == 19) || (D_8016172C == 24) || + (D_8016172C == 29)) { + D_80161A62 = D_8016172C; + } + } +} void func_80095350(Actor* actor) { Actor_Initialize(actor); @@ -4757,7 +5598,6 @@ void func_80095350(Actor* actor) { Object_SetInfo(&actor->info, actor->obj.id); } -#ifdef IMPORT_DATA void func_800953A0(Actor* actor, s32 arg1) { Vec3f D_800D2510[] = { { 1800.0f, 0.0f, -4000.0f }, @@ -4774,11 +5614,7 @@ void func_800953A0(Actor* actor, s32 arg1) { actor->unk_0B6 = 45; Object_SetInfo(&actor->info, actor->obj.id); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_800953A0.s") -#endif -#ifdef IMPORT_DATA void func_8009546C(Actor* actor, s32 arg1) { Vec3f D_800D2540[] = { { 1300.0f, 0.0f, -2000.0f }, { -1000.0f, 0.0f, -3000.0f }, { 800.0f, 0.0f, 0.0f }, @@ -4793,11 +5629,7 @@ void func_8009546C(Actor* actor, s32 arg1) { actor->unk_0B6 = 46; Object_SetInfo(&actor->info, actor->obj.id); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_8009546C.s") -#endif -#ifdef IMPORT_DATA void func_80095538(Actor* actor, s32 arg1) { Vec3f D_800D257C[] = { { 0.0f, 0.0f, -200.0f }, { -300.0f, 0.0f, -700.0f }, { 400.0f, 0.0f, -900.0f }, @@ -4812,10 +5644,572 @@ void func_80095538(Actor* actor, s32 arg1) { actor->unk_0B6 = 47; Object_SetInfo(&actor->info, actor->obj.id); } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80095538.s") -#endif +void func_80095604(Player* player) { + s32 i; + s32 j; + Actor* actor; + f32 x; + f32 y; + f32 z; + f32 x1; + f32 y1; + f32 z1; + s32 pad; + Vec3f src; + Vec3f dest; + s32 shield; -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80095604.s") + actor = &gActors[0]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/main/sf_hud/func_80096A74.s") + switch (player->unk_1D0) { + case 0: + D_80177A80 = 0; + player->unk_280 = 0; + player->unk_1D0 = 1; + + D_80177A48[1] = gBosses[0].obj.pos.x; + D_80177A48[2] = gBosses[0].obj.pos.y; + D_80177A48[3] = gBosses[0].obj.pos.z; + D_80177A48[4] = 0.0f; + D_80177A48[5] = 0.0f; + D_80177A48[6] = 0.05f; + + D_80177A48[7] = 0.0f; + D_80177A48[8] = 0.0f; + D_80177A48[9] = 0.0f; + D_80177A48[0] = 0.0f; + + case 1: + if (D_80177A80 > 240) { + D_80178348 = D_80178350 = D_80178354 = 255; + D_80178358 = 255; + D_8017835C = 16; + if (D_80177A80 == 280) { + player->unk_1D0 = 10; + } + } + + if ((D_80177A80 >= 30) && (D_80177A80 < 90)) { + D_80177A48[5] -= 0.6f; + if ((D_80177A48[5]) < 0.0f) { + D_80177A48[5] += 360.0f; + } + if ((D_80177A48[5]) > 360.0f) { + D_80177A48[5] -= 360.0f; + } + src.x = 1000.0f; + src.y = 300.0f; + src.z = 1000.0f; + + Matrix_Translate(gCalcMatrix, D_80177A48[1], D_80177A48[2], D_80177A48[3], 0); + Matrix_RotateY(gCalcMatrix, -(M_DTOR * D_80177A48[5]), 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + } + + if (D_80177A80 < 30) { + dest.x = gBosses[0].obj.pos.x; + dest.y = player->pos.y; + dest.z = gBosses[0].obj.pos.z + 1000.0f; + } + if (D_80177A80 >= 90) { + dest.x = player->camEye.x; + dest.y = player->camEye.y; + dest.z = player->camEye.z + 200.0f - D_80177D20; + } + + Math_SmoothStepToAngle(&player->unk_130, 0.0f, 0.05f, 1.2f, 0.0001f); + Math_SmoothStepToAngle(&player->unk_12C, 0.0f, 0.05f, 1.2f, 0.0001f); + Math_SmoothStepToF(&player->unk_034, 0.0f, 0.1f, 3.0f, 0.0f); + Math_SmoothStepToAngle(&player->unk_4D8, 0.0f, 0.1f, 20.0f, 0.0f); + + x = player->pos.x - dest.x; + y = player->pos.y - dest.y; + z = player->pos.z - dest.z; + + y1 = Math_RadToDeg(Math_Atan2F(x, z)); + z = sqrtf(SQ(x) + SQ(z)); + x1 = Math_RadToDeg(-Math_Atan2F(y, z)); + + if ((x1 + 40.0f) >= 360.0f) { + x1 -= 360.0f; + } + if (x1 > 180.0f) { + x1 = 0.0f; + } + + z1 = Math_SmoothStepToAngle(&player->unk_0E8, y1, 0.5f, 2.0f, 0.0001f) * 30.0f; + Math_SmoothStepToAngle(&player->unk_0E4, x1, 0.5f, 2.0f, 0.0001f); + Math_SmoothStepToAngle(&player->unk_0EC, z1, 0.1f, 5.0f, 0.0001f); + + Math_SmoothStepToAngle(&D_80177A48[4], 30.0f, 0.05f, 1.0f, 0.001f); + Math_SmoothStepToF(&D_80177A48[8], 600.0f, 0.05f, 1000.0f, 0.001f); + Math_SmoothStepToF(&D_80177A48[9], 2400.0f, 0.05f, 1000.0f, 0.001f); + + src.x = 0.0f; + src.y = D_80177A48[8]; + src.z = D_80177A48[9]; + + Matrix_Translate(gCalcMatrix, gBosses[0].obj.pos.x, gBosses[0].obj.pos.y, gBosses[0].obj.pos.z + D_80177D20, + 0); + Matrix_RotateY(gCalcMatrix, -(M_DTOR * D_80177A48[4]), 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + Math_SmoothStepToF(&D_80177978, dest.x, 0.02f, player->unk_0D0, 0.001f); + Math_SmoothStepToF(&D_80177980, dest.y, 0.02f, player->unk_0D0, 0.001f); + Math_SmoothStepToF(&D_80177988, dest.z, 0.02f, player->unk_0D0, 0.001f); + + player->camEye.x = D_80177978; + player->camEye.y = D_80177980; + player->camEye.z = D_80177988; + + if (D_80177A80 < 200) { + Math_SmoothStepToF(&D_801779A0, gBosses[0].obj.pos.x, 0.03f, 100.0f, 0.001f); + Math_SmoothStepToF(&D_801779B8, gBosses[0].obj.pos.y, 0.03f, 100.0f, 0.001f); + Math_SmoothStepToF(&D_801779C0, gBosses[0].obj.pos.z + 600.0f + D_80177D20, 0.03f, 100.0f, 0.001f); + } else { + Math_SmoothStepToF(&D_801779A0, player->pos.x, D_80177A48[6], 1000.0f, 0.001f); + Math_SmoothStepToF(&D_801779B8, player->pos.y, D_80177A48[6], 1000.0f, 0.001f); + Math_SmoothStepToF(&D_801779C0, player->pos.z + D_80177D20, D_80177A48[6], 1000.0f, 0.001f); + if (D_80177A80 > 180) { + D_80177A48[6] += 0.005f; + } else { + D_80177A48[6] += 0.005f; + } + } + + player->camAt.x = D_801779A0; + player->camAt.y = D_801779B8; + player->camAt.z = D_801779C0; + + D_80177A48[0] = 0.0f; + break; + + case 10: + player->unk_234 = 1; + D_80177AC8 = 2; + player->unk_1D0 = 11; + + player->unk_0F8 = player->unk_0EC = player->unk_12C = player->unk_130 = 0.0f; + player->vel.x = player->vel.y = player->vel.z = 0.0f; + player->unk_0E4 = player->unk_0E8 = player->unk_0EC = 0.0f; + player->unk_110 = player->unk_114 = 0.0f; + player->unk_0D0 = 3.6f; + player->unk_138 = player->pos.z = 0.0f; + player->pos.y = 100.0f; + player->pos.x = -100.0f; + player->unk_280 = 0; + player->unk_17C = player->unk_180 = 0.0f; + + D_8015F974 = D_8015F978 = D_8015F97C = 255; + D_8015F980 = 0; + + gLight1R = 40; + gLight1G = 100; + gLight1B = 120; + + gAmbientR = 20; + gAmbientG = 30; + gAmbientB = 50; + + func_800A6148(); + + player->unk_144 = D_80177D20 = 0; + + j = 0; + func_80095350(actor); + j++; + + for (i = 0; i < 6; i++, j++) { + func_80095538(&gActors[j], i); + } + + for (i = 0; i < 5; i++, j++) { + func_8009546C(&gActors[j], i); + } + + for (i = 0; i < 4; i++, j++) { + func_800953A0(&gActors[j], i); + } + + player->pos.z -= D_80177D20; + player->unk_138 = player->pos.z; + + actor->fwork[1] = 0.0f; + actor->fwork[2] = 600.0f; + actor->fwork[3] = 2600.0f; + actor->fwork[7] = 0.5f; + + actor->unk_0F4.y = 130.0f; + + src.x = actor->fwork[1]; + src.y = actor->fwork[2]; + src.z = actor->fwork[3]; + + Matrix_Translate(gCalcMatrix, player->pos.x, player->pos.y, player->unk_138 + D_80177D20, 0); + Matrix_RotateY(gCalcMatrix, -(M_DTOR * actor->unk_0F4.y), 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + player->camAt.x = D_801779A0 = player->pos.x; + player->camAt.y = D_801779B8 = player->pos.y; + player->camAt.z = D_801779C0 = player->pos.z - 50.0f + D_80177D20; + + player->camEye.x = D_80177978 = dest.x; + player->camEye.y = D_80177980 = dest.y; + player->camEye.z = D_80177988 = dest.z; + + D_80177A48[0] = 1.0f; + + case 11: + D_80178348 = D_80178350 = D_80178354 = 255; + D_80178358 = 0; + D_8017835C = 8; + + if (D_80178340 == 0) { + player->unk_1D0 = 12; + } + + case 12: + if ((D_80177A80 >= 380) && (D_80177A80 < 640 + 280)) { + Math_SmoothStepToF(&actor->fwork[2], 0.0f, 0.02f, 1000.0f, 0.001f); + Math_SmoothStepToF(&actor->fwork[3], 300.0f, 0.02f, 1000.0f, 0.001f); + } + if (D_80177A80 >= 920) { + Math_SmoothStepToF(&actor->fwork[3], 200.0f, 0.02f, 1000.0f, 0.001f); + } + if (D_80177A80 >= 1120) { + Math_SmoothStepToF(&actor->fwork[7], 0.1f, 0.05f, 1000.0f, 0.001f); + } + if (D_80177A80 >= 1200) { + Math_SmoothStepToF(&actor->fwork[3], 800.0f, 0.02f, 1000.0f, 0.001f); + Math_SmoothStepToF(&player->unk_0D0, 5.0f, 0.1f, 1000.0f, 0.001f); + } else { + actor->fwork[4] = player->pos.x; + actor->fwork[5] = player->pos.y; + actor->fwork[6] = player->unk_138 + D_80177D20; + } + + if (D_80177A80 < 1200) { + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y; + D_801779C0 = player->pos.z - 50.0f + D_80177D20; + } else { + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y + 10.0f; + D_801779C0 = player->pos.z - 50.0f + D_80177D20; + } + D_80177A48[0] = 0.05f; + + actor->unk_0F4.y += actor->fwork[7]; + if ((actor->unk_0F4.y) < 0.0f) { + actor->unk_0F4.y += 360.0f; + } + if ((actor->unk_0F4.y) > 360.0f) { + actor->unk_0F4.y -= 360.0f; + } + + src.x = actor->fwork[1]; + src.y = actor->fwork[2]; + src.z = actor->fwork[3]; + + Matrix_Translate(gCalcMatrix, actor->fwork[4], actor->fwork[5], actor->fwork[6], 0); + Matrix_RotateY(gCalcMatrix, -(M_DTOR * actor->unk_0F4.y), 1); + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + D_80177978 = dest.x; + D_80177980 = dest.y; + D_80177988 = dest.z; + + if (D_80177A80 >= 1360) { + D_80178348 = D_80178350 = D_80178354 = 0; + D_80178358 = 255; + D_8017835C = 16; + + if (D_80178340 == 255) { + D_800D3180[13] = Play_CheckMedalStatus(150) + 1; + player->state_1C8 = PLAYERSTATE_1C8_6; + player->timer_1F8 = 0; + func_8001DBD0(10); + D_8017837C = 4; + } + } + + if (D_80177A80 == 1310) { + func_800182F4(0x105000FF); + func_800182F4(0x115000FF); + } + break; + + default: + break; + } + + switch (D_80177A80) { + case 300: + func_800BA808(gMsg_ID_15200, RCID_FOX); + break; + + case 400: + func_8001D444(0U, 0x26U, 0U, 0xFFU); + break; + + case 440: + D_80177840 = 100; + break; + + case 520: + func_800BA808(gMsg_ID_15253, RCID_FOX); + break; + + case 600: + shield = gTeamShields[3]; + gTeamShields[3] = 1; + func_800BA808(gMsg_ID_15210, RCID_PEPPY); + gTeamShields[3] = shield; + break; + + case 680: + shield = gTeamShields[2]; + gTeamShields[2] = 1; + func_800BA808(gMsg_ID_15220, RCID_SLIPPY); + gTeamShields[2] = shield; + break; + + case 760: + shield = gTeamShields[1]; + gTeamShields[1] = 1; + func_800BA808(gMsg_ID_15230, RCID_FALCO); + gTeamShields[1] = shield; + break; + + case 840: + shield = gTeamShields[2]; + gTeamShields[2] = 1; + func_800BA808(gMsg_ID_15240, RCID_SLIPPY); + gTeamShields[2] = shield; + break; + + case 1000: + D_80177830 = 1; + break; + + case 1200: + D_80177830 = 0; + break; + } + + Matrix_RotateY(gCalcMatrix, M_DTOR * (player->unk_0E8 + player->unk_114 + 180.0f), 0); + Matrix_RotateX(gCalcMatrix, -(M_DTOR * player->unk_0E4), 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = player->unk_0D0; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + player->vel.x = dest.x; + player->vel.y = dest.y; + player->vel.z = dest.z; + + player->pos.x += player->vel.x; + player->pos.y += player->vel.y; + player->pos.z += player->vel.z; + + player->unk_138 = player->pos.z; + + player->unk_0F8 = player->unk_0EC + player->unk_12C + player->unk_130; + + player->unk_060 = __sinf(M_DTOR * (player->unk_0F4 * 0.7f)) * 0.5f; + player->unk_088 += 10.0f; + player->unk_0F4 += 8.0f; + player->unk_080 = -__sinf(M_DTOR * player->unk_088) * 0.5f; + player->unk_0F0 = __sinf(M_DTOR * player->unk_0F4) * 1.5f; + + if (player->unk_234) { + src.x = 0.0f; + src.y = 0.0f; + src.z = -70.0f; + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + func_i3_801AC8A8(player->pos.x + dest.x + (Rand_ZeroOne() - 0.5f) * 10.0f, + player->pos.y + dest.y + (Rand_ZeroOne() - 0.5f) * 10.0f, + player->pos.z + dest.z + (Rand_ZeroOne() - 0.5f) * 10.0f, 0.4f, 1); + } + + player->unk_178 += 20.0f; + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 50000.0f, 0.001f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 50000.0f, 0.001f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 50000.0f, 0.001f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 50000.0f, 0.001f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 50000.0f, 0.001f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 50000.0f, 0.001f); +} + +void func_80096A74(Player* player) { + Vec3f src, dest; + s32 button; + + switch (player->unk_1D0) { + case 0: + player->pos.y += 3400.0f; + player->unk_0E4 = 270.0f; + gPlayer[0].unk_0D0 = 0.0f; + + D_80177A48[1] = 100.0f; + D_80177A48[2] = 0.0f; + D_80177A48[0] = 0.2f; + D_80177A80 = 0; + player->unk_1D0 = 1; + D_80178340 = D_80178358 = 255; + + player->camEye.x = D_80177978 = 0.0f; + player->camEye.y = D_80177980 = player->pos.y + D_80177A48[1]; + player->camEye.z = D_80177988 = 0.0f; + + player->camAt.x = D_801779A0 = 0.0f; + player->camAt.y = D_801779B8 = 0.0f; + player->camAt.z = D_801779C0 = 0.0f; + + D_80177A48[0] = 1.0f; + D_80177A48[2] = 0.0f; + D_80177A48[4] = 0.0f; + + case 1: + if (D_80177A80 < 30) { + break; + } + + if ((D_80177A80 >= 40) && (D_80178340 != 0)) { + D_80178358 = 0; + D_8017835C = 8; + } + + if (D_80177A80 < 140) { + Math_SmoothStepToF(&D_80177A48[1], 800.0f, 0.2f, 10.0f, 0.0f); + if (D_80177A80 > 60) { + Math_SmoothStepToF(&D_80177A48[4], 3.0f, 0.05f, 1000.0f, 0.001f); + } + player->unk_034 += D_80177A48[4]; + if (player->unk_034 >= 360.0f) { + player->unk_034 -= 360.0f; + } + if (player->unk_034 < 0.0f) { + player->unk_034 += 360.0f; + } + } + + if (D_80177A80 >= 140) { + Math_SmoothStepToAngle(&player->unk_034, 0.0f, 0.05f, 3.0f, 0.001f); + Math_SmoothStepToF(&D_80177A48[1], 200.0f, 0.2f, 6.0f, 0.0f); + Math_SmoothStepToF(&D_80177A48[2], 200.0f, 0.2f, 6.0f, 0.0f); + D_80177A48[0] = 0.2f; + } + + D_80177978 = player->pos.x; + D_80177980 = player->pos.y + D_80177A48[1]; + D_80177988 = player->pos.z + D_80177A48[2]; + + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y; + D_801779C0 = player->pos.z; + + if (D_80177A80 == 270) { + player->unk_190 = player->unk_194 = 10.0f; + player->unk_1D0 = 2; + D_80177A48[1] = 400.0f; + Audio_PlaySfx(0x09004002U, &player->unk_460, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + + case 2: + D_80177A48[0] = 0.12f; + + Math_SmoothStepToAngle(&player->unk_034, 0.0f, 0.05f, 3.0f, 0.001f); + Math_SmoothStepToF(&D_80177A48[1], (player->pos.y * player->unk_148 + 50.0f), 0.2f, 10.0f, 0.0f); + Math_SmoothStepToF(&D_80177A48[2], 400.0f, 0.2f, 6.0f, 0.0f); + Math_SmoothStepToF(&player->pos.y, 350.0f, 0.1f, 40.0f, 0.0f); + + button = gControllerHold[player->num].button; + gControllerHold[player->num].button = gBoostButton[player->num]; + player->unk_2BC = 1; + player->timer_1F8 = 60; + + func_800B2574(player); + + D_80137E84[0] = 0; + gControllerHold[player->num].button = button; + + D_80177978 = player->pos.x; + D_80177980 = (player->pos.y * player->unk_148 + 50.0f); + D_80177988 = D_80177A48[2]; + + D_801779A0 = player->pos.x; + D_801779B8 = (player->pos.y * player->unk_148 + 20.0f); + D_801779C0 = player->pos.z; + + if (D_80177A80 == 300) { + D_80177CE8 = 0; + D_80177838 = 50; + player->state_1C8 = PLAYERSTATE_1C8_3; + player->unk_0D0 = D_80161A54; + player->unk_1D0 = 0; + player->timer_1F8 = 0; + player->unk_014 = 0.0f; + player->unk_018 = 0.0f; + player->unk_034 = 0.0f; + D_80178488 = 1; + } + break; + } + + if (D_80177A80 >= 30) { + Math_SmoothStepToF(&player->unk_0D0, 30.0f, 0.05f, 1000.0f, 0.001f); + + if (D_80177A80 < 110) { + player->unk_0EC += (D_80177A48[4] * 2.0f); + if (player->unk_0EC >= 360.0f) { + player->unk_0EC -= 360.0f; + } + if (player->unk_0EC < 0.0f) { + player->unk_0EC += 360.0f; + } + } else { + Math_SmoothStepToAngle(&player->unk_0EC, 0.0f, 0.4f, (D_80177A48[4] * 2.0f), 1.0f); + if (player->unk_0EC == 0.0f) { + if (player->unk_0E4 != 0.0f) { + Math_SmoothStepToAngle(&player->unk_0E4, 0.0f, 0.1f, 2.4f, 0.001f); + } else { + player->unk_088 += 10.0f; + player->unk_080 = -__sinf(M_DTOR * (player->unk_088)) * 0.5f; + player->unk_0F4 += 3.0f; + player->unk_0F0 = __sinf(M_DTOR * (player->unk_0F4)) * 1.5f; + } + } + } + + Matrix_RotateY(gCalcMatrix, M_DTOR * (player->unk_0E8 + player->unk_114 + 180.0f), 0); + Matrix_RotateX(gCalcMatrix, -(M_DTOR * (player->unk_0E4)), 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = player->unk_0D0; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + player->vel.x = dest.x; + player->vel.z = dest.z; + player->vel.y = dest.y; + + player->pos.x += player->vel.x; + player->pos.y += player->vel.y; + D_80177CE8 += player->vel.z; + + player->unk_0F8 = player->unk_0EC + player->unk_12C + player->unk_130; + } + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 50000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 50000.0f, 0.0f); +} diff --git a/src/main/fox_play.c b/src/main/fox_play.c index 88ce4158..5176cb02 100644 --- a/src/main/fox_play.c +++ b/src/main/fox_play.c @@ -4123,9 +4123,9 @@ void func_800B0F50(Player* playerx) { } gHitCount = gSavedHitCount = D_80177CA4; } - D_80161720 = 0.0f; - D_80161724 = 0.0f; - D_80161728 = 0.0f; + D_80161720[0] = 0.0f; + D_80161720[1] = 0.0f; + D_80161720[2] = 0.0f; D_8016172C = gHitCount; D_80161730 = 0; D_80161684 = D_80161A50; @@ -4328,9 +4328,9 @@ void func_800B0F50(Player* playerx) { gBombCount[gPlayerNum] = 3; D_80177B8C = 1; if (gCamCount == (gPlayerNum + 1)) { - D_80161720 = 0.0f; - D_80161724 = 0.0f; - D_80161728 = 0.0f; + D_80161720[0] = 0.0f; + D_80161720[1] = 0.0f; + D_80161720[2] = 0.0f; D_8016172C = 0; gHitCount = 0; D_80177824 = 0; diff --git a/src/overlays/ovl_i2/fox_me.c b/src/overlays/ovl_i2/fox_me.c index c6642b21..2ac15a15 100644 --- a/src/overlays/ovl_i2/fox_me.c +++ b/src/overlays/ovl_i2/fox_me.c @@ -1,97 +1,2527 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187530.s") +extern s32 D_800C9E90[]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018756C.s") +extern Gfx D_6001310[]; +extern Gfx D_600CD60[]; +extern Gfx D_6016240[]; +extern Gfx D_6017AD0[]; +extern Gfx D_60236F0[]; +extern Gfx D_6023810[]; +extern Gfx D_6024AD0[]; +extern Gfx D_60240B0[]; +extern Gfx D_60263F0[]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187650.s") +Vec3f D_i2_80195430[] = { + { 122.0, -5.0, -1200.0 }, { 122.0, -103.0, -727.0 }, { 142.0, -323.0, -848.0 }, { 362.0, -59.0, -435.0 }, + { 692.0, -84.0, -308.0 }, { 1000.0, -7.0, -308.0 }, { 164.0, -700.0, -308.0 }, { 263.0, -370.0, -11.0 }, + { 307.0, -95.0, 36.0 }, { 307.0, -95.0, 36.0 }, { -122.0, -5.0, -1200.0 }, { -122.0, -103.0, -727.0 }, + { -142.0, -323.0, -848.0 }, { -362.0, -59.0, -435.0 }, { -692.0, -84.0, -308.0 }, { -1000.0, -7.0, -308.0 }, + { -164.0, -700.0, -308.0 }, { -263.0, -370.0, -11.0 }, { -307.0, -95.0, 36.0 }, { -307.0, -95.0, 36.0 }, +}; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_801877C4.s") +s32 D_i2_80195520[] = { 80, 70, 60, 50, 0 }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018795C.s") +f32 D_i2_80195534[] = { 0.15f, 0.45f, 0.75f, 1.3f, 0.75f, 0.45f, 0.15f, 0.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187B08.s") +f32 D_i2_80195554[] = { 101.0f, 96.0f, 85.0f, 80.0f, 69.0f, 64.0f, 53.0f, 48.0f, 37.0f, 32.0f, 21.0f, 16.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187C68.s") +f32 D_i2_80195584[] = { 180.0f, -180.0f, 0.0f, -1500.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187D08.s") +f32 D_i2_80195594[] = { 50.0f, 100.0f, -50.0f, 0.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187D98.s") +f32 D_i2_801955A4[] = { 240.0f, 480.0f, 720.0f, -5000.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187E38.s") +s32 D_i2_801955B4[] = { 0, 0, 0, 1 }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80187FF8.s") +Vec3f D_i2_801955C4 = { 0.0f, 0.0f, 100.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188088.s") +Vec3f D_i2_801955D0[] = { 2000.0f, 2000.0f, 2000.0f, -2000.0f, 2000.0f, 2000.0f, + 0.0f, -3000.0f, 3000.0f, 5000.0f, -3000.0f, -3000.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_801881A8.s") +f32 D_i2_80195600[] = { 75.0f, -80.0f, 85.0f, 0.0f }; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188228.s") +Vec3f D_i2_80195610[] = { + { 200.0f, -10.0f, 200.0f }, + { -200.0f, 20.0f, 200.0f }, + { 0.0f, 50.0f, 400.0f }, + { -2000.0f, -1000.0f, 0.0f }, +}; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188298.s") +void func_i2_80187530(Actor* actor) { + if (actor->unk_0D0 == 1) { + actor->unk_0D0 = 0; + func_8007A6F0(&actor->obj.pos, 0x2902107D); + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188344.s") +void func_i2_8018756C(Actor* actor) { + Vec3f vec; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_801887D0.s") + if (actor->unk_0D0 != 0) { + actor->unk_0D0 = 0; + actor->unk_0CE -= actor->unk_0D6; + if (actor->unk_0CE <= 0) { + actor->obj.status = 3; + } + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188A40.s") + actor->obj.rot.y += 2.0f; + actor->obj.rot.x += 1.3f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188B84.s") + vec.x = actor->vel.x; + vec.y = actor->vel.y; + vec.z = actor->vel.z; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188C2C.s") + if ((func_8006351C(actor->index, &actor->obj.pos, &vec, 0) != 0) || (actor->obj.pos.y < (gGroundLevel + 20.0f))) { + actor->obj.status = 3; + } + func_i2_80187530(actor); +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188CAC.s") +void func_i2_80187650(Actor* actor) { + Vec3f vec; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188E8C.s") + actor->obj.rot.y += 1.7f; + actor->obj.rot.x += 3.3f; + actor->unk_046 -= 15; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188F2C.s") + if (actor->unk_046 < 0) { + actor->unk_046 = 0; + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80188FAC.s") + actor->unk_048 += 8; + if (actor->unk_048 > 995) { + actor->unk_048 = 995; + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80189114.s") + if ((actor->timer_0BC & 3) == 1) { + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 6.0f); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_801892F0.s") + if (actor->unk_0D0 != 0) { + func_8007A6F0(&actor->obj.pos, 0x2903A008); + func_8007D2C8(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 10.0f); + Object_Kill(&actor->obj, &actor->sfxPos); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_80189624.s") + if (actor->timer_0C2 == 0) { + vec.x = actor->vel.x; + vec.y = actor->vel.y; + vec.z = actor->vel.z; + if ((func_8006351C(actor->index, &actor->obj.pos, &vec, 0) != 0) || + (actor->obj.pos.y < (gGroundLevel + 20.0f))) { + func_8007D2C8(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 10.0f); + actor->obj.status = 3; + } + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018978C.s") + func_i2_80187530(actor); +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018B7C4.s") +void func_i2_801877C4(Actor* actor) { + Vec3f sp44; + Vec3f sp38; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018BACC.s") + actor->obj.rot.z += 1.0f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018C77C.s") + Matrix_RotateZ(gCalcMatrix, actor->obj.rot.z * M_DTOR, 0); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018C8F4.s") + sp38.x = 0.0f; + sp38.y = -1100.0f; + sp38.z = 0.0f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018CA10.s") + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp38, &sp44); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018CAD8.s") + actor->obj.pos.x = actor->fwork[0] + sp44.x; + actor->obj.pos.y = actor->fwork[1] + sp44.y; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018CB50.s") + if (actor->unk_0D0 != 0) { + func_80066254(actor); + func_8007A6F0(&actor->obj.pos, 0x2903A008); + Object_Kill(&actor->obj, &actor->sfxPos); + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y + 30.0f, actor->obj.pos.z, 5.0f); + func_8007BFFC(actor->obj.pos.x, actor->obj.pos.y + 30.0f, actor->obj.pos.z, 0.0f, 0.0f, 0.0f, 3.0f, 10); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018CCF8.s") + if (actor->timer_0BC == 0) { + actor->timer_0BC = 40; + if (actor->obj.pos.z < (gPlayer->unk_138 - 1000.0f)) { + func_8007F11C(0x161, actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 120.0f); + } + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018CD8C.s") +void func_i2_8018795C(Actor* actor) { + Vec3f vec; + s32 pad[2]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018D9EC.s") + actor->obj.rot.y += 7.0f; + actor->obj.rot.x += 3.3f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DA6C.s") + if (actor->unk_0D0 != 0) { + func_80066254(actor); + func_8007A6F0(&actor->obj.pos, 0x2903A008); + Object_Kill(&actor->obj, &actor->sfxPos); + func_8007D0E0(actor->obj.pos.x - actor->vel.x, actor->obj.pos.y, actor->obj.pos.z - actor->vel.z, 8.0f); + func_8007BFFC(actor->obj.pos.x - actor->vel.x, actor->obj.pos.y + 30.0f, actor->obj.pos.z - actor->vel.z, 0.0f, + 0.0f, 0.0f, 4.0f, 10); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DAEC.s") + if (!(gGameFrameCount & 7)) { + Math_Vec3fFromAngles(&vec, actor->obj.rot.x, actor->obj.rot.y, 100.0f); + func_8007F04C(0x161, actor->obj.pos.x + (vec.x * 3.0f), actor->obj.pos.y + (vec.y * 3.0f), + actor->obj.pos.z + (vec.z * 3.0f), actor->obj.rot.x, actor->obj.rot.y, actor->obj.rot.z, 0.0f, + 0.0f, 0.0f, vec.x, vec.y, vec.z, 1.0f); + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DB6C.s") +void func_i2_80187B08(Actor* actor) { + actor->obj.rot.y += 7.0f; + actor->obj.rot.x += 3.3f; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DBEC.s") + actor->unk_046 -= 11; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DCE4.s") + if (actor->unk_046 < 0) { + actor->unk_046 = 0; + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DE14.s") + actor->unk_048 += 4; + if (actor->unk_048 > 995) { + actor->unk_048 = 995; + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018DF08.s") + if (!(actor->timer_0BC & 3)) { + func_8007D0E0(actor->obj.pos.x, actor->obj.pos.y, actor->obj.pos.z, 6.0f); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018E084.s") + if ((actor->unk_0D0 != 0) || (actor->timer_0BC == 0)) { + func_8007A6F0(&actor->obj.pos, 0x2903A008); + Object_Kill(&actor->obj, &actor->sfxPos); + func_8007D0E0(actor->obj.pos.x - actor->vel.x, actor->obj.pos.y, actor->obj.pos.z - actor->vel.z, 8.0f); + func_8007BFFC(actor->obj.pos.x - actor->vel.x, actor->obj.pos.y + 30.0f, actor->obj.pos.z - actor->vel.z, 0.0f, + 0.0f, 0.0f, 4.0f, 10); + } +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/func_i2_8018ED9C.s") +void func_i2_80187C68(Actor* actor, f32 x, f32 y, f32 z, f32 arg4, f32 xRot, f32 yRot, s32 timerBC, s32 arg8, s32 id) { + Actor_Initialize(actor); + actor->obj.status = 1; + actor->obj.id = (u16) id; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i2/fox_me/D_i2_80195790.s") + actor->obj.pos.x = x; + actor->obj.pos.y = y; + actor->obj.pos.z = z; + + actor->obj.rot.x = xRot; + actor->obj.rot.y = yRot; + + actor->timer_0BC = timerBC; + actor->timer_0BE = 20; + actor->unk_0B4 = arg8; + actor->fwork[5] = arg4; + Object_SetInfo(&actor->info, actor->obj.id); +} + +void func_i2_80187D08(f32 x, f32 y, f32 z, f32 arg3, f32 xRot, f32 yRot, s32 arg6, s32 arg7, s32 id) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(gActors); i++) { + if (gActors[i].obj.status == 0) { + func_i2_80187C68(&gActors[i], x, y, z, arg3, xRot, yRot, arg6, arg7, id); + return; + } + } +} + +void func_i2_80187D98(Effect* effect, f32 x, f32 y, f32 z, f32 arg4, bool arg5) { + Effect_Initialize(effect); + effect->obj.status = 1; + effect->obj.id = OBJ_EFFECT_369; + + effect->obj.pos.x = x; + effect->obj.pos.y = y; + effect->obj.pos.z = z; + + effect->unk_60.z = arg4; + effect->unk_48 = arg5; + effect->obj.rot.x = 45.0f; + + if (arg5) { + effect->obj.rot.x = -45.0f; + } + + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i2_80187E38(f32 x, f32 y, f32 z, f32 arg3) { + s32 i; + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_80187D98(&gEffects[i], x, y, z, arg3, 0); + Audio_PlaySfx(0x31037057U, &gEffects[i].sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + } + } + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_80187D98(&gEffects[i], x, y, z, arg3, 1); + break; + } + } + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_80187D98(&gEffects[i], x, y, z, arg3 + 90.0f, 0); + break; + } + } + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_80187D98(&gEffects[i], x, y, z, arg3 + 90.0f, 1); + break; + } + } +} + +void func_i2_80187FF8(Effect* effect, f32 x, f32 y, f32 z) { + Effect_Initialize(effect); + effect->obj.status = 1; + effect->obj.id = OBJ_EFFECT_371; + + effect->obj.pos.x = x; + effect->obj.pos.y = y; + effect->obj.pos.z = z; + + effect->unk_44 = 128; + effect->vel.z = 50.0f; + effect->scale2 = 1.0f; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i2_80188088(Boss* boss) { + s32 i; + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_80187FF8(&gEffects[i], boss->obj.pos.x + 700.0f, boss->obj.pos.y, boss->obj.pos.z + 1235.0f); + Audio_PlaySfx(0x19006035U, &gEffects[i].sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + } + } + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_80187FF8(&gEffects[i], boss->obj.pos.x - 700.0f, boss->obj.pos.y, boss->obj.pos.z + 1235.0f); + break; + } + } +} + +void func_i2_801881A8(Effect* effect, f32 x, f32 y, f32 z, f32 zRot, s32 arg5) { + Effect_Initialize(effect); + effect->obj.status = 1; + effect->obj.id = OBJ_EFFECT_370; + + effect->obj.pos.x = x; + effect->obj.pos.y = y; + effect->obj.pos.z = z; + + effect->obj.rot.z = zRot; + + effect->unk_4E = arg5; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i2_80188228(f32 x, f32 y, f32 z, f32 zRot) { + s32 i; + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_801881A8(&gEffects[i], x, y, z, zRot, 0); + break; + } + } +} + +void func_i2_80188298(f32 x, f32 y, f32 z, f32 zRot) { + s32 i; + + for (i = ARRAY_COUNT(gEffects) - 1; i >= 0; i--) { + if (gEffects[i].obj.status == 0) { + func_i2_801881A8(&gEffects[i], x, y, z, zRot, -1); + Audio_PlaySfx(0x3102705CU, &gEffects[i].sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + break; + } + } +} + +void func_i2_80188344(Boss* boss) { + Vec3f src; + Vec3f dest; + f32 temp; + + if (boss->actionState < 5) { + boss->obj.pos.x = gBosses[0].obj.pos.x; + boss->obj.pos.y = gBosses[0].obj.pos.y; + boss->obj.pos.z = gBosses[0].obj.pos.z; + boss->obj.rot.x = gBosses[0].obj.rot.x; + boss->obj.rot.y = gBosses[0].obj.rot.y; + boss->obj.rot.z = (gBosses[0].obj.rot.z + boss->unk_078.z) + 45.0f + 180.0f; + } + + switch (boss->actionState) { + case 0: + boss->timer_050 = 150; + boss->unk_078.z += 2.5f; + break; + + case 1: + temp = fabsf(90.0f - boss->unk_078.z) * 0.1f; + if (temp > 2.5f) { + temp = 2.5f; + } + + boss->unk_078.z += temp; + + if (boss->timer_050 == 0) { + boss->actionState = 2; + boss->dmgType = 0; + } + break; + + case 2: + if (boss->dmgType == 1) { + boss->dmgType = 0; + boss->timer_054 = 5; + boss->swork[0] += 32; + + func_8001D034(&boss->sfxPos, 0x3103605B, boss->unk_04A); + + boss->unk_04A++; + if (boss->unk_04A >= 8) { + boss->unk_04A = 7; + } + + if (boss->swork[0] >= 0xFF) { + boss->unk_04A = 0; + Audio_KillSfx(&boss->sfxPos); + if (boss->swork[1] == 0) { + boss->swork[1]++; + func_800BA808(gMsg_ID_3315, RCID_PEPPY); + } + + boss->swork[0] = 0; + + Matrix_RotateZ(gCalcMatrix, (boss->obj.rot.z - 45.0f) * M_DTOR, 0); + + src.x = 0.0f; + src.y = 156.0f; + src.z = 930.0f; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + func_i2_80188298(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, + boss->obj.rot.z - 45.0f); + func_i2_80188228(boss->obj.pos.x - dest.x, boss->obj.pos.y - dest.y, boss->obj.pos.z + dest.z, + boss->obj.rot.z - 45.0f); + func_i2_80188228(boss->obj.pos.x + dest.y, boss->obj.pos.y - dest.x, boss->obj.pos.z + dest.z, + (boss->obj.rot.z - 45.0f) + 90.0f); + } + } + break; + + case 3: + boss->timer_050 = 30; + boss->actionState = 4; + boss->timer_05C = 15; + boss->swork[0] = 0; + break; + + case 4: + if (boss->timer_050 == 0) { + func_8007D2C8(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z + 500.0f, 30.0f); + func_8007BFFC(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z + 500.0f, 0.0f, 0.0f, 0.0f, 20.0f, 30); + boss->actionState = 5; + + boss->info.unk_10 = 1000.0f; + + func_8001A55C(&boss->sfxPos, 0x3103605B); + Audio_PlaySfx(0x3102405DU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + break; + + case 5: + boss->obj.rot.z -= 3.0f; + if (boss->vel.z < 5.0f) { + boss->vel.z = boss->vel.z + 1.0f; + } + break; + } + + if (boss->unk_078.z >= 360.0f) { + boss->unk_078.z -= 360.0f; + } + if (boss->unk_078.z < 0.0f) { + boss->unk_078.z += 360.0f; + } +} + +void func_i2_801887D0(Boss* boss) { + s32 i; + + if (boss->timer_054 & 1) { + RCP_SetupDL_27(); + gDPSetPrimColor(gMasterDisp++, 0, 0, 0, 255, 0, 255); + } + + Matrix_RotateZ(gGfxMatrix, (M_PI / 4), 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_60240B0); + RCP_SetupDL_64(); + + for (i = 1; i < 4; i++) { + if (boss->swork[0] != 0) { + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, boss->swork[0]); + Matrix_Push(&gGfxMatrix); + Matrix_RotateZ(gGfxMatrix, i * (M_PI / 2), 1); + Matrix_Translate(gGfxMatrix, 0.0f, 156.0f, 930.0f, 1); + + if (gGameFrameCount & 1) { + Matrix_Scale(gGfxMatrix, 6.0f, 9.0f, 5.0f, 1); + } else { + Matrix_Scale(gGfxMatrix, 4.0f, 7.0f, 5.0f, 1); + } + + Matrix_RotateZ(gGfxMatrix, 1.5707964f, 1); // (M_PI / 2) does not match + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_60263F0); + Matrix_Pop(&gGfxMatrix); + } + } +} + +void func_i2_80188A40(Boss* boss) { + s32 i; + + func_8001D444(0, D_800C9E90[gCurrentLevel], 0, 255); + + D_80178284 = 1; + + boss->swork[2] = 40; + boss->swork[3] = 40; + boss->swork[4] = 40; + boss->swork[5] = 40; + boss->swork[7] = 180; + boss->swork[8] = 180; + boss->swork[6] = 150; + boss->fwork[0] = -10.0f; + boss->fwork[9] = -3000.0f; + boss->fwork[15] = 8.0f; + + i = boss->unk_044 = 1; + + Boss_Initialize(&gBosses[i]); + + gBosses[i].obj.status = 1; + gBosses[i].obj.id = 0x12A; + gBosses[i].obj.pos.x = boss->obj.pos.x; + gBosses[i].obj.pos.y = boss->obj.pos.y; + gBosses[i].obj.pos.z = boss->obj.pos.z; + + Object_SetInfo(&gBosses[i].info, gBosses[i].obj.id); + func_800BA808(gMsg_ID_3300, RCID_BOSS_METEO); + Audio_PlaySfx(0x3102505AU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i2_80188B84(Effect* effect, f32 x, f32 y, f32 z, f32 xRot, f32 yRot, f32 arg6, f32 arg7) { + Effect_Initialize(effect); + effect->obj.status = 1; + effect->obj.id = OBJ_EFFECT_369; + + effect->obj.pos.x = x; + effect->obj.pos.y = y; + effect->obj.pos.z = z; + + effect->obj.rot.x = xRot; + effect->obj.rot.y = yRot; + effect->unk_60.z = arg6; + + effect->timer_50 = 20; + effect->scale2 = arg7; + effect->unk_4E = 1; + effect->unk_44 = 0x80; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i2_80188C2C(f32 x, f32 y, f32 z, f32 xRot, f32 yRot, f32 arg5, f32 arg6) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(gEffects); i++) { + if (gEffects[i].obj.status == 0) { + func_i2_80188B84(&gEffects[i], x, y, z, xRot, yRot, arg5, arg6); + return; + } + } +} + +void func_i2_80188CAC(Effect* effect) { + Vec3f src; + Vec3f dest; + + if (effect->unk_4E == 0) { + switch (effect->unk_48) { + case 0: + effect->obj.rot.x -= 15.0f; + if (effect->obj.rot.x <= -45.0f) { + effect->unk_48 = 1; + } + break; + + case 1: + effect->obj.rot.x += 15.0f; + if (effect->obj.rot.x >= 45.0f) { + effect->unk_48 = 0; + } + break; + } + + effect->unk_44 = 255; + effect->scale2 = 1.0f; + effect->unk_60.z += 20.0f; + + Matrix_RotateZ(gCalcMatrix, effect->unk_60.z * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, effect->obj.rot.x * M_DTOR, 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = 80.0f; + + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + effect->vel.x = dest.x; + effect->vel.y = dest.y; + effect->vel.z = dest.z; + + func_i2_80188C2C(effect->obj.pos.x, effect->obj.pos.y, effect->obj.pos.z, effect->obj.rot.x, effect->obj.rot.y, + effect->unk_60.z, 1.0f); + } else if (effect->timer_50 == 0) { + Object_Kill(&effect->obj, &effect->sfxPos); + } + + func_8007A774(gPlayer, effect, 90.0f); +} + +void func_i2_80188E8C(Effect* effect, f32 x, f32 y, f32 z, f32 xRot, f32 yRot, f32 zRot, f32 scale) { + Effect_Initialize(effect); + effect->obj.status = 1; + effect->obj.id = OBJ_EFFECT_370; + + effect->obj.pos.x = x; + effect->obj.pos.y = y; + effect->obj.pos.z = z; + + effect->obj.rot.x = xRot; + effect->obj.rot.y = yRot; + effect->obj.rot.z = zRot; + + effect->scale2 = scale; + effect->unk_4E = 1; + effect->unk_44 = 0x80; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i2_80188F2C(f32 x, f32 y, f32 z, f32 xRot, f32 yRot, f32 arg5, f32 scale) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(gEffects); i++) { + if (gEffects[i].obj.status == 0) { + func_i2_80188E8C(&gEffects[i], x, y, z, xRot, yRot, arg5, scale); + return; + } + } +} + +void func_i2_80188FAC(Effect* effect) { + Vec3f src; + Vec3f dest; + + if (effect->unk_4E != 1) { + effect->obj.rot.x = 10.0f; + effect->obj.rot.z += 20.0f; + + Matrix_RotateZ(gCalcMatrix, effect->obj.rot.z * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, effect->obj.rot.x * M_DTOR, 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = 80.0f; + + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + effect->vel.x = dest.x; + effect->vel.y = dest.y; + effect->vel.z = dest.z; + + if (!(gGameFrameCount & 1)) { + func_i2_80188F2C(effect->obj.pos.x, effect->obj.pos.y, effect->obj.pos.z, effect->obj.rot.x, + effect->obj.rot.y, effect->obj.rot.z, 5.0f); + } + } else { + effect->unk_44 -= 8; + if (effect->unk_44 < 0) { + Object_Kill(&effect->obj, &effect->sfxPos); + } + } + func_8007A774(gPlayer, effect, 60.0f); +} + +void func_i2_80189114(Effect* arg0) { + if (gPlayer->state_1C8 == PLAYERSTATE_1C8_7) { + Object_Kill(&arg0->obj, &arg0->sfxPos); + } + + arg0->scale2 += 0.5f; + if (arg0->scale2 > 10.0f) { + arg0->scale2 = 10.0f; + } + + arg0->obj.rot.z += 35.0f; + if (arg0->obj.pos.x < gPlayer->pos.x) { + arg0->obj.pos.x += 1.5f; + if (arg0->vel.x < 40.0f) { + arg0->vel.x += 2.0f; + } + } + + if (gPlayer->pos.x < arg0->obj.pos.x) { + arg0->obj.pos.x -= 1.5f; + if (arg0->vel.x > -40.0f) { + arg0->vel.x -= 2.0f; + } + } + + if (arg0->obj.pos.y < gPlayer->pos.y) { + arg0->obj.pos.y += 1.5f; + if (arg0->vel.y < 40.0f) { + arg0->vel.y += 2.0f; + } + } + + if (gPlayer->pos.y < arg0->obj.pos.y) { + arg0->obj.pos.y -= 1.5f; + if (arg0->vel.y > -40.0f) { + arg0->vel.y -= 2.0f; + } + } + + func_8007A774(gPlayer, arg0, 100.0f); +} + +void func_i2_801892F0(Boss* boss, s32 arg1) { + Vec3f dest; + Vec3f src; + + func_8007A6F0(&boss->obj.pos, 0x2903B009); + + if (arg1 == 7) { + func_8007D2C8(boss->obj.pos.x, boss->obj.pos.y + 330.0f, boss->obj.pos.z + 1020.0f, 15.0f); + func_8007BFFC(boss->obj.pos.x, boss->obj.pos.y + 330.0f, boss->obj.pos.z + 1020.0f, 0.0f, 0.0f, 0.0f, 7.0f, 20); + } + + if (arg1 == 5) { + func_8007D2C8(boss->obj.pos.x, boss->obj.pos.y - 330.0f, boss->obj.pos.z + 1020.0f, 15.0f); + func_8007BFFC(boss->obj.pos.x, boss->obj.pos.y - 330.0f, boss->obj.pos.z + 1020.0f, 0.0f, 0.0f, 0.0f, 7.0f, 20); + } + + if (arg1 == 4) { + func_8007D2C8(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z + 300.0f, 20.0f); + func_8007BFFC(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z + 300.0f, 0.0f, 0.0f, 0.0f, 10.0f, 0x19); + } + + if (arg1 < 4) { + Matrix_RotateY(gCalcMatrix, boss->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, boss->obj.rot.x * M_DTOR, 1); + Matrix_RotateZ(gCalcMatrix, boss->obj.rot.z * M_DTOR, 1); + Matrix_RotateZ(gCalcMatrix, arg1 * (M_PI / 2), 1); + + src.x = 0.0f; + src.y = 200.0f; + src.z = 500.0f; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + func_8007D2C8(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, 10.0f); + func_8007BFFC(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, 0.0f, 0.0f, 0.0f, + 5.0f, 15); + } +} + +void func_i2_80189624(void) { + if (gGameFrameCount & 1) { + D_801784B8 = D_801784C4 = 0.0f; + D_801784BC = D_801784C8 = 5.0f; + D_801784C0 = D_801784CC = 0.0f; + D_801784EC = D_801784F8 = 0.0f; + D_801784F0 = D_801784FC = 100.0f; + D_801784F4 = D_80178500 = 0.0f; + } else { + D_801784B8 = D_801784C4 = 0.0f; + D_801784BC = D_801784C8 = -5.0f; + D_801784C0 = D_801784CC = 0.0f; + D_801784EC = D_801784F8 = 0.0f; + D_801784F0 = D_801784FC = 110.0f; + D_801784F4 = D_80178500 = 0.0f; + } +} + +void func_i2_8018978C(Boss* boss) { + f32 sp7C; + f32 rand; + s32 i; + s32 var_v0; + + Vec3f src; + Vec3f dest; + + gBossFrameCount++; + + Matrix_RotateY(gCalcMatrix, boss->obj.rot.y * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, boss->obj.rot.x * M_DTOR, 1); + Matrix_RotateZ(gCalcMatrix, boss->obj.rot.z * M_DTOR, 1); + + if (gGameFrameCount & 16) { + boss->swork[19] += 32; + if (boss->swork[19] > 128) { + boss->swork[19] = 128; + } + } else { + boss->swork[19] -= 32; + if (boss->swork[19] < 0) { + boss->swork[19] = 0; + } + } + + if (!(gGameFrameCount & 56)) { + boss->fwork[3] = D_i2_80195534[gGameFrameCount & 7]; + boss->fwork[4] = D_i2_80195534[gGameFrameCount & 7]; + boss->fwork[5] = D_i2_80195534[gGameFrameCount & 7]; + boss->fwork[6] = D_i2_80195534[gGameFrameCount & 7]; + } + + if (!((gGameFrameCount + 20) & 56)) { + boss->fwork[7] = D_i2_80195534[(gGameFrameCount + 20) & 7]; + boss->fwork[8] = D_i2_80195534[(gGameFrameCount + 20) & 7]; + } + + if (boss->swork[9] != 0) { + boss->swork[9]--; + } + + if (boss->swork[10] != 0) { + boss->swork[10]--; + } + + if (boss->swork[11] != 0) { + boss->swork[11]--; + } + + if (boss->swork[12] != 0) { + boss->swork[12]--; + } + + if (boss->swork[13] != 0) { + boss->swork[13]--; + } + + if (boss->swork[14] != 0) { + boss->swork[14]--; + } + + if (boss->swork[15] != 0) { + boss->swork[15]--; + } + + if (boss->swork[0] > 5) { + boss->swork[0]--; + if (boss->swork[0] == 5) { + func_8001A55C(&boss->sfxPos, 0x3102505AU); + } + } + + if (boss->swork[1] > 5) { + boss->swork[1] = boss->swork[1] - 1; + if (boss->swork[1] == 5) { + func_8001A55C(&boss->sfxPos, 0x3102505AU); + } + } + + if (boss->dmgType != 0) { + boss->dmgType = 0; + if ((boss->dmgPart != 7) && (boss->dmgPart >= 5) && (boss->dmgPart != 5)) { + Audio_PlaySfx(0x29121007U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + + if ((boss->actionState >= 2) && (boss->actionState < 20)) { + if ((boss->dmgPart < 5) && (boss[0].fwork[17 + boss->dmgPart] > 0.5f)) { + if (boss[0].swork[boss->dmgPart + 2] != 0) { + Audio_PlaySfx(0x29034003U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + + boss[0].swork[9 + boss->dmgPart] = 20; + boss[0].swork[2 + boss->dmgPart] -= boss->damage; + + if (boss[0].swork[2 + boss->dmgPart] <= 0) { + boss[0].swork[2 + boss->dmgPart] = 0; + func_i2_801892F0(boss, boss->dmgPart); + boss->swork[20] += 1; + if (boss->swork[20] == 2) { + func_800BA808(gMsg_ID_17160, RCID_PEPPY); + } + if (boss->swork[20] == 3) { + func_800BA808(gMsg_ID_3371, RCID_BOSS_METEO); + } + if (boss->swork[20] == 4) { + func_800BA808(gMsg_ID_3320, RCID_BOSS_METEO); + } + } + } else { + Audio_PlaySfx(0x29121007U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } + + if (boss->actionState >= 9) { + if (boss->dmgPart == 5) { + if ((boss->swork[7] != 0) && (boss->fwork[22] > 0.8f)) { + Audio_PlaySfx(0x2943500FU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + boss->swork[14] = 20; + boss->swork[7] -= boss->damage; + if (boss->swork[7] <= 0) { + boss->swork[7] = 0; + func_i2_801892F0(boss, boss->dmgPart); + } + } else { + Audio_PlaySfx(0x29121007U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } + + if (boss->dmgPart == 7) { + if ((boss->swork[8] != 0) && (boss->fwork[23] > 0.8f)) { + Audio_PlaySfx(0x2943500FU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + boss->swork[15] = 20; + boss->swork[8] -= boss->damage; + if (boss->swork[8] <= 0) { + boss->swork[8] = 0; + func_i2_801892F0(boss, boss->dmgPart); + } + } else { + Audio_PlaySfx(0x29121007U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } + + if (boss->swork[7] <= 0) { + if (boss->swork[8] <= 0) { + func_80042EC0(boss); + + boss->actionState = 20; + boss->timer_050 = 300; + boss->timer_052 = 260; + boss->vel.x = 0.0f; + boss->vel.y = 0.0f; + + if ((gPlayer[0].state_1C8 == PLAYERSTATE_1C8_3) || + (gPlayer[0].state_1C8 == PLAYERSTATE_1C8_5)) { + gPlayer[0].state_1C8 = PLAYERSTATE_1C8_7; + gPlayer[0].unk_1D0 = 0; + D_80177A80 = 0; + } + + func_800182F4(0x103200FF); + func_800182F4(0x113200FF); + Audio_PlaySfx(0x2940D09AU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_Timer_80161A60 = 8; + } + } + } + } + } + + sp7C = boss->obj.pos.z + D_80177D20; + + if (boss->actionState >= 3) { + if (boss->actionState < 20) { + Math_SmoothStepToF(&boss->vel.z, -D_80161A54, 0.1f, 2.0f, 0.0f); + if ((boss->fwork[9] + 200.0f) < sp7C) { + Math_SmoothStepToF(&boss->vel.z, -60.0f, 0.1f, 4.0f, 0.0f); + } + if (sp7C < (boss->fwork[9] - 300.0f)) { + Math_SmoothStepToF(&boss->vel.z, 20.0f, 0.1f, 4.0f, 0.0f); + } + } + } + + if ((boss->actionState >= 3) && (boss->actionState < 20)) { + switch (boss->swork[16]) { + case 0: + if (boss->vel.y > 0.0f) { + boss->vel.y -= 0.2f; + } + if (boss->vel.y < 0.0f) { + boss->vel.y += 0.2f; + } + + if (boss->timer_054 == 0) { + boss->timer_054 = 20; + boss->fwork[13] = 7.0f; + if (boss->obj.pos.y > 0.0f) { + boss->fwork[13] = -7.0f; + } + boss->timer_054 = (s32) (Rand_ZeroOne() * 30.0f) + 40.0f; + boss->swork[16] = 1; + } + break; + + case 1: + if (boss->fwork[13] < boss->vel.y) { + boss->vel.y = boss->vel.y - 0.2f; + } + + if (boss->vel.y < boss->fwork[13]) { + boss->vel.y += 0.2f; + } + + if (boss->timer_054 == 0) { + boss->swork[16] = 0; + boss->timer_054 = (s32) (Rand_ZeroOne() * 30.0f) + 40.0f; + } + break; + } + + switch (boss->swork[17]) { + case 0: + if (boss->vel.x > 0.0f) { + boss->vel.x = boss->vel.x - 0.2f; + } + + if (boss->vel.x < 0.0f) { + boss->vel.x += 0.2f; + } + + if (boss->timer_056 == 0) { + boss->timer_056 = 20; + boss->fwork[14] = 7.0f; + if (boss->obj.pos.x > 0.0f) { + boss->fwork[14] = -7.0f; + } + boss->timer_056 = (s32) (Rand_ZeroOne() * 40.0f) + 50.0f; + boss->swork[17] = 1; + } + break; + + case 1: + if (boss->fwork[14] < boss->vel.x) { + boss->vel.x = boss->vel.x - 0.2f; + } + if (boss->vel.x < boss->fwork[14]) { + boss->vel.x += 0.2f; + } + if (boss->timer_056 == 0) { + boss->swork[17] = 0; + boss->timer_056 = (s32) (Rand_ZeroOne() * 40.0f) + 50.0f; + } + break; + } + } + + if (boss->swork[18] != 0) { + s32 id; + + if (func_8008AC54(0) >= 4) { + id = 191; + } else { + id = 190; + } + + Audio_PlaySfx(0x2903201BU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + + src.x = 0.0f; + src.y = 330.0f; + src.z = -1022.0f; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + if (boss->swork[18] == 1) { + func_i2_80187D08(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, 50.0f, + 270.0f, 0.0f, 0x1E, 0, id); + } else { + func_i2_80187D08(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, 50.0f, 0.0f, + 0.0f, 0, 0, id); + } + + src.y = -330.0f; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + if (boss->swork[18] == 1) { + func_i2_80187D08(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, 50.0f, 90.0f, + 0.0f, 0x1E, 0, id); + } else { + func_i2_80187D08(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, 50.0f, 0.0f, + 0.0f, 0, 0, id); + } + boss->swork[18] = 0; + } + + if ((sp7C < 200.0f) && (sp7C > -1500.0f)) { + D_801784F8 = 0.0f; + D_801784FC = 150.0f; + D_80178500 = 0.0f; + } + + switch (boss->actionState) { + case 0: + boss->swork[0] = 10; + boss->swork[1] = 10; + + boss->obj.pos.y += ((0.0f - boss->obj.pos.y) * boss->fwork[1]); + boss->vel.z = boss->fwork[0] - D_80177D08; + + if (sp7C < boss->fwork[9]) { + boss->actionState = 1; + boss->fwork[1] = 0.0f; + } + + if (sp7C < -1000.0f) { + if (boss->fwork[1] < 0.005f) { + boss->fwork[1] = boss->fwork[1] + 0.0001f; + } + } + break; + + case 1: + boss->obj.pos.y += ((0.0f - boss->obj.pos.y) * boss->fwork[1]); + boss->vel.z = boss->fwork[0] - D_80177D08; + + if (boss->fwork[0] < 0.0f) { + boss->fwork[0] += 0.5f; + if (boss->fwork[0] >= 0.0f) { + boss->actionState = 2; + boss->timer_050 = 50; + gBosses[boss->unk_044].actionState = 1; + } + } + + if (boss->fwork[1] < 0.005f) { + boss->fwork[1] = boss->fwork[1] + 0.0001f; + } + break; + + case 2: + boss->obj.pos.y += ((0.0f - boss->obj.pos.y) * boss->fwork[1]); + boss->vel.z = boss->fwork[0] - D_80177D08; + + if (boss->fwork[1] < 0.05f) { + boss->fwork[1] = boss->fwork[1] + 0.0004f; + } + + if (boss->timer_050 == 0) { + boss->actionState = 3; + boss->timer_050 = 50; + boss->timer_058 = 100; + func_800BA808(gMsg_ID_3310, RCID_BOSS_METEO); + } + break; + + case 3: + if (boss->timer_052 == 0) { + rand = Rand_ZeroOne(); + boss->fwork[9] = -3000.0f; + if (rand < 0.3f) { + boss->fwork[9] = -2000.0f; + } + if (rand > 0.7f) { + boss->fwork[9] = -4000.0f; + } + boss->timer_052 = 80; + } else if (boss->vel.z < -50.0f) { + if (boss->swork[0] == 5) { + Audio_PlaySfx(0x3102505AU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + + if (boss->swork[0] < 10) { + boss->swork[0] += 2; + if (boss->swork[0] > 10) { + boss->swork[0] = 10; + } + } + + if (boss->swork[1] < 10) { + boss->swork[1] += 2; + if (boss->swork[1] > 10) { + boss->swork[1] = 10; + } + } + } + + if (gBosses[boss->unk_044].actionState < 3) { + var_v0 = 0; + if (boss->swork[2] == 0) { + var_v0 = 1; + boss->obj.rot.z += 0.1f; + } + if (boss->swork[3] == 0) { + var_v0 += 1; + boss->obj.rot.z += 0.1f; + } + if (boss->swork[4] == 0) { + var_v0 += 1; + boss->obj.rot.z += 0.1f; + } + if (boss->swork[5] == 0) { + var_v0 += 1; + boss->obj.rot.z += 0.1f; + } + if (var_v0 == 4) { + gBosses[boss->unk_044].actionState = 3; + boss->actionState = 4; + boss->timer_050 = 250; + boss->timer_05A = 30; + boss->fwork[10] = 0; + } + + if ((boss->timer_050 == 0) && (gBosses[boss->unk_044].actionState == 2)) { + boss->fwork[2] = 90.0f; + boss->timer_050 = D_i2_80195520[var_v0] + 45; + Audio_PlaySfx(0x19030036U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + + if (boss->fwork[2] > 0.0f) { + boss->fwork[2] -= 2.0f; + gBosses[boss->unk_044].unk_078.z -= 2.0f; + } + } + + if (boss->timer_058 == 0) { + boss->timer_058 = (s32) (Rand_ZeroOne() * 80.0f) + 180.0f; + boss->swork[18] = 1; + } + break; + + case 4: + boss->fwork[9] = -3000.0f; + if (boss->fwork[10] < 0.02f) { + boss->fwork[10] += 0.0002f; + } + boss->obj.rot.z += ((0.0f - boss->obj.rot.z) * boss->fwork[10]); + if (boss->timer_050 == 100) { + func_800BA808(gMsg_ID_3321, RCID_BOSS_METEO); + } + if (boss->timer_050 == 0) { + boss->actionState = 5; + boss->timer_050 = 70; + } + break; + + case 5: + boss->obj.rot.z += ((0.0f - boss->obj.rot.z) * 0.02f); + + if (boss->timer_050 == 1) { + Audio_PlaySfx(0x31016056U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + + if (boss->timer_050 == 0) { + D_801784C4 = 0.0f; + D_801784C8 = 5.0f; + D_801784CC = 0.0f; + D_801784F8 = 0.0f; + D_801784FC = 100.0f; + D_80178500 = 0.0f; + D_801784E8 = 5.0f; + D_80178510 = 5.0f; + + if (boss->fwork[11] < 70.0f) { + boss->fwork[11] += 1.0f; + if (boss->fwork[11] > 20.0f) { + boss->fwork[11] += 1.0f; + } + } else { + boss->actionState = 6; + boss->timer_050 = 75; + } + + if (boss->fwork[11] > 30.0f) { + func_i2_80189624(); + } + } + break; + + case 6: + boss->obj.rot.z = boss->obj.rot.z + ((0.0f - boss->obj.rot.z) * 0.02f); + Math_SmoothStepToF(&boss->fwork[0x15], 4.0f, 1.0f, 0.1f, 0.0f); + + if (gPlayer->state_1C8 != PLAYERSTATE_1C8_6) { + D_80178348 = D_80178340 = D_80178350 = D_80178354 = 0; + + if ((boss->timer_050 == 10) || (boss->timer_050 == 30) || (boss->timer_050 == 50) || + (boss->timer_050 == 70)) { + D_80178340 = 150; + D_80178348 = D_80178350 = D_80178354 = 0xFF; + func_i2_80187E38(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z + 1300.0f, + boss->fwork[12] + boss->obj.rot.z); + boss->fwork[12] = Rand_ZeroOne() * 360.0f; + } + if ((boss->timer_050 == 13) || (boss->timer_050 == 33) || (boss->timer_050 == 53) || + (boss->timer_050 == 73)) { + D_80178340 = 150; + D_80178348 = D_80178350 = D_80178354 = 255; + } + if (boss->timer_050 == 0) { + boss->actionState = 7; + Audio_PlaySfx(0x29038058U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + func_i2_80189624(); + } + break; + + case 7: + if (boss->fwork[11] > 26.0f) { + func_i2_80189624(); + } + + if (boss->fwork[11] > 0.0f) { + boss->fwork[11] -= 2.0f; + if (boss->fwork[11] <= 0.0f) { + boss->fwork[11] = 0.0f; + Audio_KillSfx(&boss->sfxPos); + if (boss->swork[6] == 0) { + boss->actionState = 8; + + boss->timer_050 = 190; + boss->timer_052 = 230; + + boss->fwork[10] = 0.0f; + boss->fwork[22] = 0.0f; + boss->fwork[23] = 0.0f; + D_80177A80 = 0; + func_800BA808(gMsg_ID_3322, RCID_BOSS_METEO); + func_800182F4(0x100100FF); + func_800182F4(0x110100FF); + } else { + boss->actionState = 5; + boss->timer_050 = 70; + } + } + } + break; + + case 8: + D_80177A80++; + if (D_80177A80 == 130) { + func_800BA808(gMsg_ID_3330, RCID_BOSS_METEO); + } + if (D_80177A80 == 300) { + PRINTF("msg_03340\n"); + func_800BA808(gMsg_ID_3340, RCID_FALCO); + } + + if (D_80177A80 == 400) { + func_8001D444(0U, 0x8041U, 0U, 0xFFU); + if (gTeamShields[1] > 0) { + func_800BA808(gMsg_ID_3345, RCID_BOSS_METEO); + } else { + func_800BA808(gMsg_ID_3350, RCID_BOSS_METEO); + } + } + + if (boss->timer_050 == 0) { + if (boss->fwork[10] < 0.02f) { + boss->fwork[10] = boss->fwork[10] + 0.0002f; + } + + boss->obj.rot.x += ((-180.0f - boss->obj.rot.x) * boss->fwork[10]); + + if (boss->timer_052 != 0) { + if (boss->swork[0] == 5) { + Audio_PlaySfx(0x3102505AU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + if (boss->swork[0] < 10) { + boss->swork[0] += 2; + if (boss->swork[0] >= 11) { + boss->swork[0] = 10; + } + } + } + + if (boss->obj.rot.x < -178.0f) { + boss->actionState = 9; + boss->timer_050 = 0; + boss->fwork[15] = 8.0f; + Audio_PlaySfx(0x11015034U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } + } + break; + + case 9: + boss->obj.rot.x += ((-180.0f - boss->obj.rot.x) * boss->fwork[10]); + if ((boss->timer_050 > 50) && (boss->timer_050 <= 64)) { + boss->fwork[22] -= 0.1f; + if (boss->fwork[22] < 0.0f) { + boss->fwork[22] = 0.0f; + } + boss->fwork[23] -= 0.1f; + if (boss->fwork[23] < 0.0f) { + boss->fwork[23] = 0.0f; + } + } + + if (boss->timer_050 < 20) { + boss->fwork[22] += 0.1f; + if (boss->fwork[22] > 1.0f) { + boss->fwork[22] = 1.0f; + } + boss->fwork[23] += 0.1f; + if (boss->fwork[23] > 1.0f) { + boss->fwork[23] = 1.0f; + } + } + + if (boss->timer_050 == 40) { + boss->swork[18] = 2; + } + + if (boss->timer_050 == 0) { + boss->fwork[15] -= 0.1f; + if (boss->fwork[15] < -1.0f) { + boss->timer_050 = 40; + boss->actionState = 10; + } + } + break; + + case 10: + if (boss->timer_050 == 0) { + boss->actionState = 9; + boss->timer_050 = 70; + boss->fwork[15] = 8.0f; + Audio_PlaySfx(0x11015034U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } else if ((boss->timer_050 & 1) == 1) { + func_i2_80188088(boss); + } + break; + + case 20: + if (boss->timer_052 == 230) { + func_800BA808(gMsg_ID_3370, RCID_BOSS_METEO); + } + if (boss->timer_052 == 90) { + func_800BA808(gMsg_ID_3360, RCID_FOX); + } + + if (!(gGameFrameCount & 7) && (Rand_ZeroOne() < 0.5f)) { + boss->timer_05C = 4; + } + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &D_i2_80195430[(s32) ((Rand_ZeroOne() * 19.9f))], &dest); + + if (!(gGameFrameCount & 1)) { + func_8007C120(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, boss->vel.x, + boss->vel.y, boss->vel.z, 0.3f, 20); + } + if (!(gGameFrameCount & 3)) { + func_8007BFFC(boss->obj.pos.x + dest.x, boss->obj.pos.y + dest.y, boss->obj.pos.z + dest.z, boss->vel.x, + boss->vel.y, boss->vel.z, 10.0f, 10); + } + + boss->vel.y = -5.0f; + boss->obj.rot.x += 0.2f; + boss->obj.rot.z -= 0.1f; + + if (boss->timer_050 == 0) { + func_8007D2C8(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z, 40.0f); + Object_Kill(&boss->obj, &boss->sfxPos); + } + if (boss->timer_050 == 20) { + func_8007A568(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z, 80.0f); + Audio_PlaySfx(0x2940F026U, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + D_Timer_80177BD0[0] = 60; + for (i = 0; i < ARRAY_COUNT(gActors); i++) { + if (gActors[i].obj.id == 0xC6) { + Object_Kill(&gActors[i].obj, &gActors[i].sfxPos); + } + } + } + + switch (boss->timer_050) { + case 20: + gShowBossHealth = false; + + case 1: + case 5: + case 10: + case 15: + func_8007B344(boss->obj.pos.x, boss->obj.pos.y, boss->obj.pos.z, 71.0f, 5); + + case 0: + for (i = 0; i < 0x64; i++) { + func_80079618(((Rand_ZeroOne() - 0.5f) * 1000.0f) + boss->obj.pos.x, + ((Rand_ZeroOne() - 0.5f) * 1000.0f) + boss->obj.pos.y, + ((Rand_ZeroOne() - 0.5f) * 1000.0f) + boss->obj.pos.z, 3.0f); + } + break; + } + } + + if (boss->obj.rot.z >= 360.0f) { + boss->obj.rot.z = boss->obj.rot.z - 360.0f; + } + if (boss->obj.rot.z < 0.0f) { + boss->obj.rot.z += 360.0f; + } + + if (gBossFrameCount == 250) { + func_800BA808(gMsg_ID_2225, RCID_SLIPPY); + } + if (gBossFrameCount == 406) { + gShowBossHealth = true; + } + if (gBossFrameCount > 406) { + gBossHealthBar = (boss->swork[2] + boss->swork[3] + boss->swork[4] + boss->swork[5] + boss->swork[7] + + boss->swork[8] + boss->swork[6]) / + 2.6274f; + if ((gBossFrameCount > 506) && (gBossFrameCount < 1000)) { + Math_SmoothStepToF(&boss->fwork[17], 3.3f, 1.0f, 0.1f, 0.0f); + Math_SmoothStepToF(&boss->fwork[0x12], 3.3f, 1.0f, 0.1f, 0.0f); + Math_SmoothStepToF(&boss->fwork[0x13], 3.3f, 1.0f, 0.1f, 0.0f); + Math_SmoothStepToF(&boss->fwork[20], 3.3f, 1.0f, 0.1f, 0.0f); + } + } +} + +void func_i2_8018B7C4(s32 arg0) { + f32 effect = arg0 * 0.83333f; + + if (gGameFrameCount & 1) { + effect *= 1.1f; + } + + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + + RCP_SetupDL_64(); + Matrix_Push(&gGfxMatrix); + Matrix_Scale(gGfxMatrix, 10.0f * effect, 10.0f * effect, 10.0f * effect, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 70); + gSPDisplayList(gMasterDisp++, D_102ED50); + + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 20.0f, 1); + Matrix_Scale(gGfxMatrix, 9.0f * effect, 9.0f * effect, 9.0f * effect, 1); + Matrix_SetGfxMtx(&gMasterDisp); + + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 60); + gSPDisplayList(gMasterDisp++, D_102ED50); + + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 35.0f, 1); + Matrix_Scale(gGfxMatrix, 7.5f * effect, 7.5f * effect, 7.5f * effect, 1); + Matrix_SetGfxMtx(&gMasterDisp); + + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 50); + gSPDisplayList(gMasterDisp++, D_102ED50); + + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 40.0f, 1); + Matrix_Scale(gGfxMatrix, 5.0f * effect, 5.0f * effect, 5.0f * effect, 1); + Matrix_SetGfxMtx(&gMasterDisp); + + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 40); + gSPDisplayList(gMasterDisp++, D_102ED50); + Matrix_Pop(&gGfxMatrix); + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); +} + +void func_i2_8018BACC(Boss* boss) { + s32 i; + f32 var_fs0; + f32 var_fs1; + s32 pad; + + gSPDisplayList(gMasterDisp++, D_6001310); + RCP_SetupDL_64(); + gSPClearGeometryMode(gMasterDisp++, G_CULL_BACK); + + for (i = 0; i < 6; i++) { + if ((boss->fwork[i + 3] != 0) && (boss->fwork[11] == 0.0f)) { + var_fs1 = 2.0f * boss->fwork[3 + i]; + Matrix_Push(&gGfxMatrix); + switch (i) { + case 0: + Matrix_Translate(gGfxMatrix, 746.0f, 741.0f, 680.0f, 1); + break; + + case 1: + Matrix_Translate(gGfxMatrix, -746.0f, 741.0f, 680.0f, 1); + break; + + case 2: + Matrix_Translate(gGfxMatrix, -746.0f, -741.0f, 680.0f, 1); + break; + + case 3: + Matrix_Translate(gGfxMatrix, 746.0f, -741.0f, 680.0f, 1); + break; + + case 4: + Matrix_Translate(gGfxMatrix, 1283.0f, 0.0f, -340.0f, 1); + break; + + case 5: + Matrix_Translate(gGfxMatrix, -1283.0f, 0.0f, -340.0f, 1); + break; + } + + if (i < 4) { + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 32, 32, 128); + Matrix_Scale(gGfxMatrix, var_fs1, var_fs1, var_fs1, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_102ED50); + } else { + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, 128); + Matrix_Scale(gGfxMatrix, var_fs1 * 6.0f, var_fs1 * 6.0f, var_fs1 * 6.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_102ED50); + } + Matrix_Pop(&gGfxMatrix); + } + } + + for (i = 0; i < 7; i++) { + if (boss->swork[2 + i] != 0) { + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, boss->swork[19], 255); + + if (boss->swork[9 + i] & 1) { + gDPSetPrimColor(gMasterDisp++, 0, 0, 0x50, 0, 0, 255); + } + + Matrix_Push(&gGfxMatrix); + + if (i == 4) { + Matrix_Translate(gGfxMatrix, 0.0f, 0, 300.0f, 1); + Matrix_RotateZ(gGfxMatrix, (M_PI / 4), 1); + Matrix_Scale(gGfxMatrix, boss->fwork[21], boss->fwork[21], 1.0f, 1); + } + + if (i == 5) { + Matrix_Translate(gGfxMatrix, 0.0f, 330.0f, -1022.0f, 1); + Matrix_Scale(gGfxMatrix, boss->fwork[22] * 3.2f, 2.0f * boss->fwork[22], 1.0f, 1); + } + + if (i == 6) { + Matrix_Translate(gGfxMatrix, 0.0f, -330.0f, -1022.0f, 1); + Matrix_Scale(gGfxMatrix, boss->fwork[23] * 3.2f, 2.0f * boss->fwork[23], 1.0f, 1); + } + + if (i < 4) { + Matrix_RotateZ(gGfxMatrix, i * (M_PI / 2), 1); + Matrix_Translate(gGfxMatrix, 0.0f, 200.0f, 500.0f, 1); + Matrix_Scale(gGfxMatrix, boss->fwork[17 + i], boss->fwork[17 + i], 1.0f, 1); + } + + Matrix_SetGfxMtx(&gMasterDisp); + + if (i < 4) { + gSPDisplayList(gMasterDisp++, D_6024AD0); + } else { + gSPDisplayList(gMasterDisp++, D_60236F0); + } + Matrix_Pop(&gGfxMatrix); + } + } + + gDPSetPrimColor(gMasterDisp++, 0, 0, 0xA0, 0xFF, 0xA0, 0x80); + for (i = 0; i < 4; i++) { + if (boss->fwork[11] != 0) { + var_fs1 = boss->fwork[11]; + if (boss->fwork[11] > 15.0f) { + var_fs1 = 15.0f; + } + + Matrix_Push(&gGfxMatrix); + switch (i) { + case 0: + Matrix_Translate(gGfxMatrix, 746.0f, 741.0f, 680.0f, 1); + Matrix_RotateZ(gGfxMatrix, -(M_PI / 4), 1); + break; + + case 1: + Matrix_Translate(gGfxMatrix, -746.0f, 741.0f, 680.0f, 1); + Matrix_RotateZ(gGfxMatrix, (M_PI / 4), 1); + break; + + case 2: + Matrix_Translate(gGfxMatrix, -746.0f, -741.0f, 680.0f, 1); + Matrix_RotateZ(gGfxMatrix, (3 * M_PI / 4), 1); + break; + + case 3: + Matrix_Translate(gGfxMatrix, 746.0f, -741.0f, 680.0f, 1); + Matrix_RotateZ(gGfxMatrix, -(3 * M_PI / 4), 1); + break; + } + + Matrix_SetGfxMtx(&gMasterDisp); + Matrix_Push(&gGfxMatrix); + + if (gGameFrameCount & 1) { + Matrix_Scale(gGfxMatrix, var_fs1 * 2.5f, var_fs1 * 2.5f, var_fs1 * 2.5f, 1); + } else { + Matrix_Scale(gGfxMatrix, var_fs1 * 3.0f, var_fs1 * 3.0f, var_fs1 * 3.0f, 1); + } + + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_102ED50); + Matrix_Pop(&gGfxMatrix); + Matrix_RotateX(gGfxMatrix, -(M_PI / 6), 1); + + if (gGameFrameCount & 1) { + Matrix_RotateY(gGfxMatrix, 3.1415927f, 1); + } + Matrix_Scale(gGfxMatrix, 2.0f, 2.0f * var_fs1, 2.0f, 1); + Matrix_Translate(gGfxMatrix, 0.0f, -20.0f, 0.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_102F5E0); + Matrix_Pop(&gGfxMatrix); + } + } + + if (boss->fwork[11] > 15.0f) { + var_fs1 = boss->fwork[11] - 15.0f; + gDPSetPrimColor(gMasterDisp++, 0, 0, 0xA0, 0xFF, 0xA0, 0xFF); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, 0.0f, 1300.0f, 1); + if (gGameFrameCount & 1) { + Matrix_Scale(gGfxMatrix, var_fs1 * 0.8f, var_fs1 * 0.8f, var_fs1 * 0.8f, 1); + } else { + Matrix_Scale(gGfxMatrix, var_fs1, var_fs1, var_fs1, 1); + } + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_102ED50); + Matrix_Pop(&gGfxMatrix); + } + + if ((boss->actionState == 9) || (boss->actionState == 0xA)) { + var_fs1 = boss->fwork[15]; + for (i = 0; i < 10; i++) { + var_fs1 += 0.3f; + var_fs0 = var_fs1; + if (var_fs1 <= 7.0f) { + if (var_fs1 < 1.0f) { + var_fs0 = 1.0f; + } + + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, D_i2_80195554[i]); + Matrix_Push(&gGfxMatrix); + + Matrix_Translate(gGfxMatrix, 700.0f, 0.0f, -(1235.0f - ((var_fs0 - 1.0f) * 89.2f)), 1); + + if (gGameFrameCount & 1) { + Matrix_Scale(gGfxMatrix, var_fs0, var_fs0, var_fs0, 1); + } else { + Matrix_Scale(gGfxMatrix, var_fs0 * 1.1f, var_fs0 * 1.1f, var_fs0 * 1.1f, 1); + } + + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_6023810); + Matrix_Pop(&gGfxMatrix); + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, -700.0f, 0.0f, -(1235.0f - ((var_fs0 - 1.0f) * 89.2f)), 1); + + if (gGameFrameCount & 1) { + Matrix_Scale(gGfxMatrix, var_fs0, var_fs0, var_fs0, 1); + } else { + Matrix_Scale(gGfxMatrix, var_fs0 * 1.1f, var_fs0 * 1.1f, var_fs0 * 1.1f, 1); + } + + Matrix_SetGfxMtx(&gMasterDisp); + gSPDisplayList(gMasterDisp++, D_6023810); + Matrix_Pop(&gGfxMatrix); + } + } + } + + if (boss->swork[0] > 0) { + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, 650.0f, 600.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + func_i2_8018B7C4(boss->swork[0] - 1); + Matrix_Pop(&gGfxMatrix); + } + + if (boss->swork[1] > 0) { + Matrix_Push(&gGfxMatrix); + Matrix_Translate(gGfxMatrix, 0.0f, -650.0f, 600.0f, 1); + Matrix_SetGfxMtx(&gMasterDisp); + func_i2_8018B7C4(boss->swork[1] - 1); + Matrix_Pop(&gGfxMatrix); + } + + gSPSetGeometryMode(gMasterDisp++, G_CULL_BACK); +} + +void func_i2_8018C77C(Actor* actor, s32 arg1) { + Actor_Initialize(actor); + actor->obj.status = 1; + actor->obj.id = OBJ_ACTOR_195; + + actor->obj.pos.x = D_i2_80195584[arg1] + gPlayer[0].pos.x; + actor->obj.pos.y = D_i2_80195594[arg1] + gPlayer[0].pos.y; + actor->obj.pos.z = D_i2_801955A4[arg1] + gPlayer[0].unk_138; + + actor->unk_0B6 = D_i2_801955B4[arg1]; + actor->obj.rot.y = 180.0f; + Object_SetInfo(&actor->info, actor->obj.id); + actor->info.unk_10 = 200.0f; + + if (actor->unk_0B6 == 0) { + actor->iwork[11] = 1; + Audio_PlaySfx(0x3100000CU, &actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + return; + } + + Audio_PlaySfx(0x11030010U, &actor->sfxPos, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + Audio_PlaySfx(0x31024059U, &actor->sfxPos, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i2_8018C8F4(Actor* actor1, Actor* actor2) { + Actor_Initialize(actor1); + actor1->obj.status = 1; + actor1->obj.id = OBJ_ACTOR_182; + + actor1->obj.pos.x = ((Rand_ZeroOneSeeded() - 0.5f) * 2000.0f) + actor2->obj.pos.x; + actor1->obj.pos.y = ((Rand_ZeroOneSeeded() - 0.5f) * 2000.0f) + actor2->obj.pos.y; + actor1->obj.pos.z = (((Rand_ZeroOneSeeded() - 0.5f) * 500.0f) + actor2->obj.pos.z) - 9000.0f; + + actor1->obj.rot.y = Rand_ZeroOneSeeded() * 360.0f; + actor1->obj.rot.x = Rand_ZeroOneSeeded() * 360.0f; + + actor1->timer_0C2 = 10000; + actor1->vel.z = 30.0f; + Object_SetInfo(&actor1->info, actor1->obj.id); +} + +void func_i2_8018CA10(Actor* actor1, Actor* actor2, f32 x, f32 y, f32 z) { + Actor_Initialize(actor1); + actor1->obj.status = 1; + actor1->obj.id = OBJ_ACTOR_182; + + actor1->obj.pos.x = actor2->obj.pos.x + x; + actor1->obj.pos.y = actor2->obj.pos.y + y; + actor1->obj.pos.z = actor2->obj.pos.x + z; + + actor1->obj.rot.y = Rand_ZeroOneSeeded() * 360.0f; + actor1->obj.rot.x = Rand_ZeroOneSeeded() * 360.0f; + + actor1->timer_0C2 = 0x2710; + actor1->vel.z = 30.0f; + Object_SetInfo(&actor1->info, actor1->obj.id); +} + +void func_i2_8018CAD8(void) { + Actor* actor = &gActors[50]; + + Actor_Initialize(actor); + actor->obj.status = 1; + actor->obj.pos.x = 0.0f; + actor->obj.pos.y = 0.0f; + actor->obj.pos.z = 9000.0f; + actor->unk_0B6 = 10; + actor->obj.id = OBJ_ACTOR_195; + Object_SetInfo(&actor->info, actor->obj.id); +} + +void func_i2_8018CB50(Effect* effect, Actor* actor) { + Effect_Initialize(effect); + effect->obj.status = 2; + effect->obj.id = OBJ_EFFECT_346; + effect->timer_50 = (s32) (Rand_ZeroOne() * 20.0f) + 20.0f; + effect->scale2 = (Rand_ZeroOne() * 0.5f) + 0.5f; + + effect->obj.pos.x = actor->obj.pos.x; + effect->obj.pos.y = actor->obj.pos.y; + effect->obj.pos.z = actor->obj.pos.z; + + effect->vel.x = (Rand_ZeroOne() - 0.5f) * 30.0f; + effect->vel.y = (Rand_ZeroOne() - 0.5f) * 30.0f; + effect->vel.z = (Rand_ZeroOne() - 0.5f) * 30.0f; + + effect->obj.rot.z = Rand_ZeroOne() * 360.0f; + Object_SetInfo(&effect->info, effect->obj.id); +} + +void func_i2_8018CCF8(Actor* actor) { + s32 i; + s32 j; + + func_8007A6F0(&actor->obj.pos, 0x2903A008); + + for (i = 0; i < 25; ++i) { + for (j = 0; j < ARRAY_COUNT(gEffects); j++) { + if (gEffects[j].obj.status == 0) { + func_i2_8018CB50(&gEffects[j], actor); + break; + } + } + } +} + +void func_i2_8018CD8C(Player* player) { + u8 sp8F; + s32 i; + Actor* actor0 = &gActors[0]; + Actor* actor1 = &gActors[1]; + Actor* actor2 = &gActors[2]; + Actor* actor3 = &gActors[3]; + f32 x; + f32 y; + f32 z; + f32 sp68; + f32 sp64; + Vec3f sp58; + Vec3f sp4C; + + D_8017835C = 4; + + PRINTF("Demo_Time %d\n"); + + switch (player->unk_1D0) { + case 0: + D_80177A80 = 0; + + if (gTeamShields[1] > 0) { + func_i2_8018C77C(actor0, 0); + } + if (gTeamShields[2] > 0) { + func_i2_8018C77C(actor1, 1); + } + if (gTeamShields[3] > 0) { + func_i2_8018C77C(actor2, 2); + } + + func_i2_8018C77C(actor3, 3); + func_i2_8018CAD8(); + + for (i = 5; i < 15; i++) { + func_i2_8018C8F4(&gActors[i], actor3); + } + + D_80177A48[1] = -13000.0f; + D_80177A48[2] = -13000.0f; + D_80177A48[4] = -22000.0f; + + player->camEye.x = D_80177978 = player->pos.x + 100.0f; + player->camEye.y = D_80177980 = player->pos.y; + player->camEye.z = D_80177988 = D_80177A48[1] + player->unk_138; + + player->camAt.x = D_801779A0 = D_80177A48[2] + player->pos.x; + player->camAt.y = D_801779B8 = player->pos.y; + player->camAt.z = D_801779C0 = D_80177A48[4] + player->unk_138; + + player->unk_1D0 = 1; + + D_80177A48[3] = 1.0f; + + case 1: + actor3->vel.z = 4.0f; + D_80177978 = player->pos.x + 100.0f; + D_80177980 = player->pos.y; + D_80177988 = D_80177A48[1] + player->unk_138; + D_801779A0 = D_80177A48[2] + player->pos.x; + D_801779B8 = player->pos.y + 20.0f; + D_801779C0 = D_80177A48[4] + player->unk_138; + Math_SmoothStepToF(&D_80177A48[1], 8000.0f, 0.05f, 20.0f, 0); + Math_SmoothStepToF(&D_80177A48[2], 0.0f, 0.05f, 25.0f, 0); + Math_SmoothStepToF(&D_80177A48[4], 0.0f, 0.05f, 200.0f, 0); + Math_SmoothStepToF(&player->unk_0EC, 0.0f, 0.05f, 0.3f, 0); + + D_80177A48[0] = 0.1f; + if (D_80177A80 == 680) { + actor3->unk_0B8 = 10; + } + if (D_80177A80 == 720) { + actor0->unk_0B8 = 11; + } + if (D_80177A80 == 750) { + actor2->unk_0B8 = 12; + } + if (D_80177A80 == 780) { + actor1->unk_0B8 = 13; + } + if (D_80177A80 > 810) { + player->unk_1D0 = 2; + D_80177A48[0] = 0.0f; + player->timer_1F8 = 40; + } + sp8F = false; + if (D_80177A80 == 190) { + player->timer_1FC = 5; + player->unk_1D8 = 10; + sp8F = true; + } + if (D_80177A80 == 230) { + player->timer_1FC = 3; + player->unk_1D8 = 6; + sp8F = true; + } + if (D_80177A80 == 240) { + player->timer_1FC = 3; + player->unk_1D8 = 11; + sp8F = true; + } + if (D_80177A80 == 270) { + player->timer_1FC = 2; + player->unk_1D8 = 12; + sp8F = true; + } + if (D_80177A80 == 600) { + func_i2_8018CA10(&gActors[16], &gActors[3], 100.0f, 500.0f, 1500.0f); + func_i2_8018CA10(&gActors[17], &gActors[3], 300.0f, 400.0f, 2000.0f); + } + if (D_80177A80 == 660) { + for (i = 4; i < 15; i++) { + gActors[i].obj.status = 0; + } + + actor3->obj.pos.x += 1000.0f; + actor3->obj.pos.z += 4000.0f; + + for (i = 4; i < 9; i++) { + func_i2_8018C8F4(&gActors[i], &gActors[3]); + } + + actor3->obj.pos.x -= 1000.0f; + actor3->obj.pos.z -= 4000.0f; + + func_i2_8018CA10(&gActors[13], &gActors[3], 1500.0f, 200.0f, 100.0f); + func_i2_8018CA10(&gActors[14], &gActors[3], 1200.0f, -200.0f, -500.0f); + func_i2_8018CA10(&gActors[15], &gActors[3], 2000.0f, -100.0f, -1000.0f); + + gActors[50].obj.status = gActors[16].obj.status = gActors[17].obj.status = 0; + } + + if (D_80177A80 > 660) { + player->wings.unk_2C = 0; + } + + if (D_80177A80 == 340) { + func_8007D2C8(gActors[8].obj.pos.x, gActors[8].obj.pos.y, gActors[8].obj.pos.z, 10.0f); + gActors[8].obj.status = 0; + func_i2_8018CCF8(&gActors[8]); + } + + if (player->timer_1FC != 0) { + if (sp8F != 0) { + sp58 = D_i2_801955C4; + D_80177A48[3] *= -1.0f; + x = gActors[player->unk_1D8].obj.pos.x - (actor3->obj.pos.x + (D_80177A48[3] * 74.0f)); + y = gActors[player->unk_1D8].obj.pos.y - (actor3->obj.pos.y - 232.0f); + z = gActors[player->unk_1D8].obj.pos.z - (actor3->obj.pos.z - 1190.0f); + + sp64 = Math_RadToDeg(Math_Atan2F(x, z)); + x = sqrtf((x * x) + (z * z)); + sp68 = Math_RadToDeg(-Math_Atan2F(y, x)); + + Matrix_RotateY(gCalcMatrix, M_DTOR * sp64, 0); + Matrix_RotateX(gCalcMatrix, M_DTOR * sp68, 1); + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp58, &sp4C); + + func_8006EFA0(100, actor3->obj.pos.x + (D_80177A48[3] * 74.0f) + (sp4C.x * 0.6f), + actor3->obj.pos.y - 232.0f + (sp4C.y * 0.8f), + actor3->obj.pos.z - 1190.0f + (sp4C.z * 0.8f), sp4C.x, sp4C.y, sp4C.z, sp68, sp64, + 0.0f); + } + if (player->timer_1FC == 1) { + func_8007D2C8(gActors[player->unk_1D8].obj.pos.x, gActors[player->unk_1D8].obj.pos.y, + gActors[player->unk_1D8].obj.pos.z, 10.0f); + gActors[player->unk_1D8].obj.status = 0; + func_i2_8018CCF8(&gActors[player->unk_1D8]); + Object_Kill(&gPlayerShots->obj, &gPlayerShots->sfxPos); + } + } + break; + + case 2: + D_80177978 = player->pos.x; + D_80177980 = (player->pos.y * player->unk_148) + 50.0f; + D_80177988 = 400.0f; + D_801779A0 = player->pos.x; + D_801779B8 = (player->pos.y * player->unk_148) + 20.0f; + D_801779C0 = player->unk_138; + + Math_SmoothStepToF(D_80177A48, 1.0f, 1.0f, 0.01f, 0.0f); + + if (player->timer_1F8 == 0) { + func_8001D444(0, D_80177C90, 0, 0xFF); + D_80177838 = 80; + player->state_1C8 = PLAYERSTATE_1C8_3; + player->unk_1D0 = 0; + player->timer_1F8 = 0; + player->timer_1FC = 0; + player->camEye.x = player->pos.x; + player->camEye.y = (player->pos.y * player->unk_148) + 50.0f; + player->camEye.z = 400.0f; + player->camAt.x = player->pos.x; + player->camAt.y = (player->pos.y * player->unk_148) + 20.0f; + player->camAt.z = player->unk_138; + + for (i = 0; i < 4; i++) { + Object_Kill(&gActors[i].obj, &gActors[i].sfxPos); + } + + D_80178488 = 1; + break; + } + } + + switch (D_80177A80) { + case 500: + if ((gTeamShields[2] > 0) && (gTeamShields[3] > 0)) { + func_800BA808(gMsg_ID_3005, RCID_SLIPPY); + } + break; + + case 600: + if ((gTeamShields[2] > 0) && (gTeamShields[3] > 0)) { + func_800BA808(gMsg_ID_3010, RCID_PEPPY); + } + break; + + case 700: + func_800BA808(gMsg_ID_3015, RCID_FOX); + break; + } + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 20000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 20000.0f, 0.0f); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 20000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 20000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 20000.0f, 0.0f); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 20000.0f, 0.0f); +} + +void func_i2_8018D9EC(Actor* actor) { + switch (actor->unk_0B8) { + case 0: + actor->fwork[0] = (Rand_ZeroOne() - 0.5f) * 10.0f; + actor->unk_0B8 = 1; + + case 1: + actor->obj.rot.z += actor->fwork[0]; + break; + } + func_i2_80187530(actor); +} + +void func_i2_8018DA6C(Actor* actor) { + RCP_SetupDL_60(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); + gSPDisplayList(gMasterDisp++, D_6017AD0); +} + +void func_i2_8018DAEC(Actor* actor) { + RCP_SetupDL_60(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); + gSPDisplayList(gMasterDisp++, D_6016240); +} + +void func_i2_8018DB6C(Actor* actor) { + RCP_SetupDL_60(gFogRed, gFogGreen, gFogBlue, gFogAlpha, gFogNear, gFogFar); + gSPDisplayList(gMasterDisp++, D_600CD60); +} + +void func_i2_8018DBEC(Effect* effect) { + if (effect->unk_4E == 1) { + Matrix_RotateX(gGfxMatrix, effect->obj.rot.x * M_DTOR, 1); + Matrix_Scale(gGfxMatrix, effect->scale2, effect->scale2, effect->scale2, 1); + Matrix_RotateZ(gGfxMatrix, (M_PI / 2), 1); + Matrix_SetGfxMtx(&gMasterDisp); + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, effect->unk_44); + gSPDisplayList(gMasterDisp++, D_60263F0); + } +} + +void func_i2_8018DCE4(Effect* effect) { + if (effect->unk_4E != 0) { + Matrix_RotateX(gGfxMatrix, effect->obj.rot.x * M_DTOR, 1); + Matrix_Scale(gGfxMatrix, effect->scale2, effect->scale2, effect->scale2 * 3.0f, 1); + + if (gGameFrameCount & 1) { + Matrix_RotateZ(gGfxMatrix, M_PI, 1); + } + + Matrix_RotateX(gGfxMatrix, -(M_PI / 2), 1); + Matrix_SetGfxMtx(&gMasterDisp); + gDPSetPrimColor(gMasterDisp++, 0, 0, 160, 255, 160, effect->unk_44); + gSPDisplayList(gMasterDisp++, D_102F5E0); + } +} + +void func_i2_8018DE14(Effect* effect) { + Matrix_RotateX(gGfxMatrix, effect->obj.rot.x * M_DTOR, 1); + Matrix_Scale(gGfxMatrix, effect->scale2, effect->scale2, effect->scale2, 1); + Matrix_SetGfxMtx(&gMasterDisp); + gDPSetPrimColor(gMasterDisp++, 0, 0, 255, 255, 255, effect->unk_44); + + switch (effect->unk_4C) { + case 0: + gSPDisplayList(gMasterDisp++, D_6023810); + case 1: + break; + } +} + +void func_i2_8018DF08(Actor* actor, s32 idx) { + Actor_Initialize(actor); + actor->obj.status = 1; + actor->obj.id = OBJ_ACTOR_195; + + actor->obj.pos.x = D_i2_801955D0[idx].x + gPlayer[0].pos.x; + actor->obj.pos.y = D_i2_801955D0[idx].y + gPlayer[0].pos.y; + actor->obj.pos.z = D_i2_801955D0[idx].z + gPlayer[0].unk_138; + + actor->unk_0F4.y = 0.0f; + actor->unk_0F4.z = D_i2_80195600[idx]; + + Object_SetInfo(&actor->info, actor->obj.id); + + if (idx == 3) { + Audio_PlaySfx(0x11030010U, &actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + Audio_PlaySfx(0x31024059U, &actor->sfxPos, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->unk_0B6 = 1; + } else { + actor->iwork[11] = 1; + Audio_PlaySfx(0x3100000CU, &actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + } +} + +void func_i2_8018E084(Player* player) { + Vec3f src; + Vec3f dest; + s32 pad[5]; + + gBosses[1].obj.status = 0; + + Math_SmoothStepToF(&player->unk_130, 0.0f, 0.1f, 15.0f, 0.0f); + Math_SmoothStepToF(&player->unk_12C, 0.0f, 0.1f, 15.0f, 0.0f); + Math_SmoothStepToF(&player->unk_0E8, 0.0f, 0.1f, 3.0f, 0.0f); + Math_SmoothStepToF(&player->unk_0EC, 0.0f, 0.1f, 3.0f, 0.0f); + Math_SmoothStepToF(&player->unk_08C, 0.0f, 0.1f, 3.0f, 0.0f); + Math_SmoothStepToF(&player->unk_034, 0.0f, 0.1f, 3.0f, 0.0f); + Math_SmoothStepToAngle(&player->unk_4D8, 0.0f, 0.1f, 20.0f, 0.0f); + Math_SmoothStepToF(&player->unk_110, 0.0f, 0.1f, 3.0f, 0.0f); + + switch (player->unk_1D0) { + case 0: + func_8001A38C(1, &player->unk_460); + player->unk_1D0++; + + D_80177A48[0] = 0.0f; + D_80177A48[1] = 0.0f; + D_80177A48[2] = 0.0f; + + player->wings.unk_2C = 1; + + D_80177A80 = 0; + + case 1: + Matrix_RotateY(gCalcMatrix, D_80177A48[1] * M_DTOR, 0); + src.x = 0.0f; + src.y = 0.0f; + src.z = D_80177A48[2] + 2000.0f; + + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + D_80177978 = gBosses->obj.pos.x + dest.x; + D_80177980 = gBosses->obj.pos.y + dest.y; + + D_80177988 = gBosses->obj.pos.z + D_80177D20 + dest.z; + D_801779A0 = gBosses->obj.pos.x; + D_801779B8 = gBosses->obj.pos.y; + + D_801779C0 = gBosses->obj.pos.z + D_80177D20; + + Math_SmoothStepToF(&D_80177A48[1], 180.0f, 0.05f, 1.0f, 0.0f); + Math_SmoothStepToF(&D_80177A48[2], 1500.0f, 0.1f, 10.0f, 0.0f); + Math_SmoothStepToF(&D_80177A48[0], 0.1f, 0.1f, 0.001f, 0.0f); + Math_SmoothStepToF(&player->unk_0D0, 0.0f, 1.0f, 0.5f, 0.0f); + Math_SmoothStepToF(&gBosses->vel.z, 0.0f, 1.0f, 0.5f, 0.0f); + Math_SmoothStepToF(&player->unk_0E4, 0.0f, 0.1f, 3.0f, 0.0f); + + if (D_80177A80 == 320) { + D_80177A80 = 200; + D_80177A48[0] = 0.0f; + D_80177A48[3] = 0.0f; + D_80177A48[4] = 0.0f; + player->unk_1D0++; + player->timer_1F8 = 100; + } + break; + + case 2: + if (player->timer_1F8 == 0) { + Math_SmoothStepToF(&D_80177A48[3], 1.0f, 1.0f, 0.01f, 0.0f); + } + if (player->timer_1F8 == 50) { + func_8001D444(0, 0x26U, 0, 0xFFU); + } + + Math_SmoothStepToF(&D_80177A48[1], 1080.0f, 0.01f, D_80177A48[3], 0.0f); + + if (D_80177A80 < 500) { + Math_SmoothStepToF(&D_80177A48[2], -1700.0f, 0.1f, 30.0f, 0.0f); + } else if (D_80177A80 < 800) { + Math_SmoothStepToF(&D_80177A48[2], -1000.0f, 0.1f, 4.0f, 0.0f); + } else if (D_80177A80 < 1150) { + Math_SmoothStepToF(&D_80177A48[2], -1250.0f, 0.1f, 4.0f, 0.0f); + } else { + Math_SmoothStepToF(&D_80177A48[2], -1500.0f, 0.1f, 4.0f, 0.0f); + } + + if (D_80177A80 < 400) { + Math_SmoothStepToF(&D_80177A48[4], 0.0f, 0.03f, 0.2f, 0.0f); + } else if (D_80177A80 < 700) { + Math_SmoothStepToF(&D_80177A48[4], -40.0f, 0.03f, 0.4f, 0.0f); + } else if (D_80177A80 < 1100) { + Math_SmoothStepToF(&D_80177A48[4], 40.0f, 0.03f, 0.4f, 0.0f); + } else { + Math_SmoothStepToF(&D_80177A48[4], 7.0f, 0.03f, 0.2f, 0.0f); + } + + Math_SmoothStepToF(D_80177A48, 0.1f, 0.1f, 0.002f, 0.0f); + + Matrix_RotateX(gCalcMatrix, D_80177A48[4] * M_DTOR, 0); + Matrix_RotateY(gCalcMatrix, D_80177A48[1] * M_DTOR, 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = D_80177A48[2] + 2000.0f; + + Matrix_MultVec3f(gCalcMatrix, &src, &dest); + + D_801779A0 = player->pos.x; + D_801779B8 = player->pos.y; + D_801779C0 = player->unk_138 + D_80177D20 + 150.0f; + + if (D_80177A80 > 1390) { + player->unk_0D0 += 2.0f; + player->unk_0E4 += 0.1f; + player->unk_190 = 2.0f; + + if (D_80177A80 == 1465) { + func_8001DBD0(20); + } + + if (D_80177A80 > 1465) { + D_80178358 = 255; + D_80178348 = D_80178350 = D_80178354 = 0; + D_8017835C = 8; + if (D_80178340 == 255) { + player->state_1C8 = PLAYERSTATE_1C8_6; + player->timer_1F8 = 0; + D_8017837C = 4; + D_800D3180[1] = Play_CheckMedalStatus(0xC8) + 1; + } + } + } else { + D_80177978 = player->pos.x + dest.x; + D_80177980 = player->pos.y + dest.y; + D_80177988 = player->unk_138 + D_80177D20 + 150.0f + dest.z; + } + break; + } + + switch (D_80177A80) { + case 350: + Object_Kill(&gActors->obj, &gActors->sfxPos); + Object_Kill(&gActors[1].obj, &gActors[1].sfxPos); + Object_Kill(&gActors[2].obj, &gActors[2].sfxPos); + + if (gTeamShields[1] > 0) { + func_i2_8018DF08(gActors, 0); + } + if (gTeamShields[2] > 0) { + func_i2_8018DF08(&gActors[1], 1); + } + if (gTeamShields[3] > 0) { + func_i2_8018DF08(&gActors[2], 2); + } + func_i2_8018DF08(&gActors[3], 3); + break; + + case 370: + D_80177840 = 100; + break; + + case 450: + func_800BA808(gMsg_ID_20010, RCID_FOX); + break; + + case 538: + switch (gTeamShields[2]) { + case -1: + func_800BA808(gMsg_ID_20333, RCID_ROB64); + break; + case 0: + func_800BA808(gMsg_ID_20345, RCID_ROB64); + break; + default: + func_80048AC0(2); + break; + } + break; + + case 685: + switch (gTeamShields[3]) { + case -1: + func_800BA808(gMsg_ID_20332, RCID_ROB64); + break; + case 0: + func_800BA808(gMsg_ID_20344, RCID_ROB64); + break; + default: + func_80048AC0(3); + break; + } + break; + + case 831: + switch (gTeamShields[1]) { + case -1: + func_800BA808(gMsg_ID_20331, RCID_ROB64); + break; + case 0: + func_800BA808(gMsg_ID_20340, RCID_ROB64); + break; + default: + func_80048AC0(1); + break; + } + break; + + case 976: + D_80177830 = 1; + break; + + case 1176: + D_80177830 = 0; + break; + + case 1300: + gActors->unk_0B8 = 1; + break; + + case 1330: + gActors[1].unk_0B8 = 1; + break; + + case 1360: + gActors[2].unk_0B8 = 1; + break; + + case 1390: + Audio_PlaySfx(0x09000002U, &player->unk_460, 0, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + player->unk_194 = 5.0f; + player->unk_190 = 5.0f; + break; + + case 1400: + gActors[3].unk_0B8 = 1; + gActors[3].obj.pos.x = player->camEye.x - 700.0f; + gActors[3].obj.pos.y = player->camEye.y; + gActors[3].obj.pos.z = player->camEye.z - D_80177D20 + 1000.0f; + break; + } + + Math_SmoothStepToF(&player->camEye.x, D_80177978, D_80177A48[0], 50000.0f, 0); + Math_SmoothStepToF(&player->camEye.y, D_80177980, D_80177A48[0], 50000.0f, 0); + Math_SmoothStepToF(&player->camEye.z, D_80177988, D_80177A48[0], 50000.0f, 0); + Math_SmoothStepToF(&player->camAt.x, D_801779A0, D_80177A48[0], 50000.0f, 0); + Math_SmoothStepToF(&player->camAt.y, D_801779B8, D_80177A48[0], 50000.0f, 0); + Math_SmoothStepToF(&player->camAt.z, D_801779C0, D_80177A48[0], 50000.0f, 0); + + Matrix_RotateY(gCalcMatrix, (player->unk_0E8 + 180.0f) * M_DTOR, 0); + Matrix_RotateX(gCalcMatrix, -((player->unk_0E4 + player->unk_4D8) * M_DTOR), 1); + + src.x = 0.0f; + src.y = 0.0f; + src.z = player->unk_0D0 + player->unk_110; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &src, &dest); + + player->vel.x = dest.x; + player->vel.z = dest.z; + player->vel.y = dest.y; + + player->pos.x += player->vel.x; + player->pos.y += player->vel.y; + player->pos.z += player->vel.z; + + player->unk_138 = player->pos.z + player->unk_08C; + player->unk_0F8 = player->unk_0EC + player->unk_12C + player->unk_130; + player->unk_088 += 10.0f; + player->unk_080 = -__sinf(player->unk_088 * M_DTOR) * 0.3f; + player->unk_0F4 += 8.0f; + player->unk_0F0 = __sinf(player->unk_0F4 * M_DTOR); +} + +void func_i2_8018ED9C(Actor* actor) { + Vec3f sp3C; + Vec3f sp30; + + switch (actor->unk_0B8) { + case 0: + actor->vwork[0].x = D_i2_80195610[actor->index].x + gPlayer->pos.x; + actor->vwork[0].y = D_i2_80195610[actor->index].y + gPlayer->pos.y; + actor->vwork[0].z = D_i2_80195610[actor->index].z + gPlayer->pos.z; + + Math_SmoothStepToF(&actor->obj.pos.x, actor->vwork[0].x, 0.02f, 50.0f, 0.0001f); + Math_SmoothStepToF(&actor->obj.pos.y, actor->vwork[0].y, 0.02f, 50.0f, 0.0001f); + Math_SmoothStepToF(&actor->obj.pos.z, actor->vwork[0].z, 0.02f, 50.0f, 0.0001f); + Math_SmoothStepToF(&actor->unk_0F4.z, 0.0f, 0.03f, 0.5f, 0.0001f); + break; + + case 1: + actor->unk_0B8 = 2; + Audio_PlaySfx(0x09000002U, &actor->sfxPos, 0U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); + actor->timer_0BC = 0x96; + actor->fwork[29] = 5.0f; + + case 2: + actor->iwork[11] = 2; + actor->fwork[0] += 2.0f; + actor->unk_0F4.x += 0.1f; + if (actor->timer_0BC == 0) { + Object_Kill(&actor->obj, &actor->sfxPos); + } + break; + } + + Matrix_RotateY(gCalcMatrix, (actor->unk_0F4.y + 180.0f) * M_DTOR, 0U); + Matrix_RotateX(gCalcMatrix, -(actor->unk_0F4.x * M_DTOR), 1U); + + sp3C.x = 0.0f; + sp3C.y = 0.0f; + sp3C.z = actor->fwork[0]; + + Matrix_MultVec3fNoTranslate(gCalcMatrix, &sp3C, &sp30); + + actor->vel.x = sp30.x; + actor->vel.y = sp30.y; + actor->vel.z = sp30.z; + + actor->obj.rot.x = -actor->unk_0F4.x; + actor->obj.rot.y = actor->unk_0F4.y + 180.0f; + actor->obj.rot.z = -actor->unk_0F4.z; +} diff --git a/src/overlays/ovl_i3/sf_so.c b/src/overlays/ovl_i3/sf_so.c index 29f27b5b..5422face 100644 --- a/src/overlays/ovl_i3/sf_so.c +++ b/src/overlays/ovl_i3/sf_so.c @@ -1,4 +1,5 @@ #include "global.h" +#include "prevent_bss_reordering.h" typedef void (*BossSOfunc)(Boss*); diff --git a/src/overlays/ovl_i4/fox_ka.c b/src/overlays/ovl_i4/fox_ka.c index 14b33d65..99b2b1ca 100644 --- a/src/overlays/ovl_i4/fox_ka.c +++ b/src/overlays/ovl_i4/fox_ka.c @@ -1,4 +1,4 @@ -#include "common.h" +#include "global.h" #pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i4/fox_ka/func_i4_801927E0.s") diff --git a/src/overlays/ovl_i6/fox_sy.c b/src/overlays/ovl_i6/fox_sy.c index dac77c8a..98a3b95f 100644 --- a/src/overlays/ovl_i6/fox_sy.c +++ b/src/overlays/ovl_i6/fox_sy.c @@ -1,22 +1,331 @@ -#include "common.h" +#include "global.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80197B30.s") +extern Gfx D_6014A40[]; +extern u16* D_60342A0[]; +extern u16* D_6034304[]; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80197C64.s") +void func_i6_80197F18(Boss*); +void func_i6_80198244(Boss*); +void func_i6_80198ABC(Boss*); +void func_i6_80199D64(Boss*); +void func_i6_8019AA08(Boss*); +void func_i6_8019AEC0(Boss*); +s32 func_i6_8019B528(Boss*); +s32 func_i6_8019B5CC(Boss*); +void func_i6_8019B6E8(Boss*); +void func_i6_8019BC14(Boss*); +void func_i6_8019C194(Boss*, f32, f32); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80197CB8.s") +void func_i6_80197B30(Actor* actor, s32 timer) { + Actor_Initialize(actor); + actor->obj.status = 2; + actor->obj.id = 0xC3; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80197CC4.s") + actor->obj.pos.x = gPlayer->pos.x; + actor->obj.pos.y = gPlayer->pos.y; + actor->obj.pos.z = gPlayer->pos.z; + actor->fwork[0] = gPlayer->unk_0D0; + + actor->vel.x = gPlayer->vel.x; + actor->vel.y = gPlayer->vel.y; + actor->vel.z = gPlayer->vel.z; + + actor->obj.rot.x = gPlayer->unk_4D8 + (gPlayer->unk_120 + gPlayer->unk_0E4); + actor->obj.rot.y = gPlayer->unk_0E8 + gPlayer->unk_114 + 180.0f; + actor->obj.rot.z = gPlayer->unk_0EC; + + actor->unk_0B8 = 5; + actor->timer_04C = timer; + actor->iwork[11] = 1; + + Object_SetInfo(&actor->info, actor->obj.id); + Audio_PlaySfx(0x3100000CU, &actor->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i6_80197C64(Effect* effect) { + RCP_SetupDL_21(); + gSPDisplayList(gMasterDisp++, D_6014A40); + RCP_SetupDL(&gMasterDisp, 0x40); +} + +void func_i6_80197CB8(Object_80* obj80) { +} + +void func_i6_80197CC4(Boss* boss) { + boss->fwork[9] = 0.0f; + boss->swork[33] = 5500; + boss->timer_050 = 10; + boss->timer_058 = 0; + D_80177A10[8] = 0; + + if (boss->index == 0) { + boss->info.hitbox = SEGMENTED_TO_VIRTUAL(D_60342A0); + boss->health = 150; + boss->swork[28] = 5; + boss->fwork[43] = 3.5f; + boss->fwork[45] = 40.0f; + + if (gPlayer->state_1C8 == PLAYERSTATE_1C8_9) { + boss->obj.pos.z = -28900.0f; + gObjects58->obj.pos.z = -30000.0f; + } + + boss->unk_078.y = 0.0f; + func_i6_8019AEC0(boss); + } else { + boss->fwork[34] = 2.8f; + boss->info.hitbox = SEGMENTED_TO_VIRTUAL(D_6034304); + + boss->health = 100; + boss->swork[28] = 0; + boss->swork[25] = 1; + boss->fwork[45] = 35.0f; + + if (boss->index == 1) { + boss->unk_078.y = 15.0f; + } else { + boss->unk_078.y = 345.0f; + } + + boss->vel.x = __sinf(boss->unk_078.y * M_DTOR); + boss->vel.x = (boss->fwork[45] * boss->vel.x) * 0.2f; + boss->vel.z = __cosf(boss->unk_078.y * M_DTOR); + boss->vel.z = (boss->fwork[45] * boss->vel.z) * 0.2f; + + func_i6_80198244(boss); + boss->timer_056 = 0xFA; + } + + if (gLevelMode == LEVELMODE_ON_RAILS) { + if (gPlayer->state_1C8 == PLAYERSTATE_1C8_3) { + gPlayer->state_1C8 = PLAYERSTATE_1C8_9; + gPlayer->unk_1D0 = 0; + func_800182F4(0x103200FF); + func_800182F4(0x113200FF); + } + Object_Kill(&boss->obj, &boss->sfxPos); + } +} + +// figure out arg0 type #pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80197F18.s") -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80197F84.s") +void func_i6_80197F84(Boss* boss) { + f32 var_fv1; -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80198238.s") + Math_SmoothStepToF(&boss->obj.pos.y, 0.0f, 0.5f, 15.0f, 0.1f); + Math_SmoothStepToF(&boss->vel.y, 0.0f, 0.1f, 0.2f, 0.1f); + Math_SmoothStepToF(&boss->vel.z, 0.0f, 0.1f, 0.2f, 0.1f); + Math_SmoothStepToF(&boss->vel.x, 0.0f, 0.1f, 0.2f, 0.1f); + Math_SmoothStepToAngle(&boss->unk_078.x, 0.0f, 0.1f, 4.0f, 0.1f); -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80198244.s") + if (func_i6_8019B5CC(boss) != 0) { + Math_SmoothStepToF(&boss->obj.pos.y, 1000.0f, 0.1f, 30.0f, 0.1f); + } else { + Math_SmoothStepToF(&boss->obj.pos.y, 0.0f, 0.1f, 10.0f, 0.1f); + } -#pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_801983E4.s") + func_i6_8019B6E8(boss); + if (boss->timer_052 == 0) { + func_i6_8019BC14(boss); + } + + Math_SmoothStepToAngle( + &boss->unk_078.y, + Math_RadToDeg(Math_Atan2F(boss->fwork[18] - boss->obj.pos.x, boss->fwork[20] - boss->obj.pos.z)), 0.1f, 8.0f, + 0.1f); + + if (boss->timer_050 == 0) { + func_i6_80198244(boss); + } + + if (boss->swork[22] == 1) { + if (boss->vel.x >= 0) { + var_fv1 = boss->vel.x; + } else { + var_fv1 = -boss->vel.x; + } + + if (var_fv1 <= 1.0f) { + if (boss->vel.z >= 0) { + var_fv1 = boss->vel.z; + } else { + var_fv1 = -boss->vel.z; + } + + if (((var_fv1 <= 1.0f) && (fabsf(boss->fwork[18] - boss->obj.pos.x) <= 400.0f)) && + (fabsf(boss->fwork[20] - boss->obj.pos.z) <= 1400.0f)) { + if ((Rand_ZeroOne() < 0.2f) && (boss->unk_078.x == 0.0f)) { + func_i6_8019AA08(boss); + } + if (Rand_ZeroOne() < 0.2f) { + func_i6_80198244(boss); + } + } + } + } + + if (func_i6_8019B528(boss) != 0) { + func_i6_80198ABC(boss); + } +} + +void func_i6_80198238(s32 arg0) { +} + +void func_i6_80198244(Boss* boss) { + f32 var_fv0; + + boss->swork[20] = 3; + boss->swork[21] = 1; + boss->timer_056 = (Rand_ZeroOne() * 500.0f) + 100.0f; + boss->fwork[11] = __sinf(boss->unk_078.y * M_DTOR) * boss->fwork[0x2D]; + boss->fwork[13] = __cosf(boss->unk_078.y * M_DTOR) * boss->fwork[0x2D]; + + if (boss->vel.x >= 0) { + var_fv0 = boss->vel.x; + } else { + var_fv0 = -boss->vel.x; + } + + if (var_fv0 < 5.0f) { + Math_SmoothStepToF(&boss->vel.x, boss->fwork[11], 0.1f, 5.0f, 0.1f); + } + + if (boss->vel.z >= 0) { + var_fv0 = boss->vel.z; + } else { + var_fv0 = -boss->vel.z; + } + + if (var_fv0 < 5.0f) { + Math_SmoothStepToF(&boss->vel.z, boss->fwork[13], 0.1f, 5.0f, 0.1f); + } + + boss->fwork[10] = 181.0f; + boss->fwork[34] = 2.8f; + Audio_PlaySfx(0x2902306CU, &boss->sfxPos, 4U, &D_800C5D34, &D_800C5D34, &D_800C5D3C); +} + +void func_i6_801983E4(Boss* boss) { + f32 var_fv1; + f32 sp38; + f32 sp34; + + func_i6_8019B6E8(boss); + + if (boss->timer_052 == 0) { + func_i6_8019BC14(boss); + } + + Math_SmoothStepToAngle(&boss->unk_078.z, 0.0f, 0.1f, 2.0f, 0.1f); + Math_SmoothStepToAngle(&boss->unk_078.x, 0.0f, 0.1f, 2.0f, 0.1f); + Math_SmoothStepToF(&boss->vel.x, boss->fwork[11], 0.1f, 0.5f, 0.1f); + Math_SmoothStepToF(&boss->vel.z, boss->fwork[13], 0.1f, 0.5f, 0.1f); + Math_SmoothStepToF(&boss->vel.y, 0.0f, 0.1f, 0.2f, 0.1f); + + if (boss->obj.pos.x <= boss->fwork[18]) { + sp38 = boss->fwork[18] - boss->obj.pos.x; + } else { + sp38 = -(boss->fwork[18] - boss->obj.pos.x); + } + + if (boss->obj.pos.z <= boss->fwork[20]) { + sp34 = boss->fwork[20] - boss->obj.pos.z; + } else { + sp34 = -(boss->fwork[20] - boss->obj.pos.z); + } + + if (boss->unk_078.x != 0.0f) { + Math_SmoothStepToAngle(&boss->unk_078.x, boss->fwork[10], 0.1f, 6.0f, 0.1f); + if (boss->unk_078.x < 200.0f) { + boss->swork[21] = 1; + boss->unk_078.y -= 180.0f; + boss->unk_078.z -= 180.0f; + boss->fwork[10] = 0.0f; + boss->unk_078.x = 0.0f; + + if (boss->unk_078.y < 0.0f) { + boss->unk_078.y = boss->unk_078.y + 360.0f; + } + if (boss->unk_078.z < 0.0f) { + boss->unk_078.z = boss->unk_078.z + 360.0f; + } + + boss->fwork[11] = __sinf(boss->unk_078.y * M_DTOR) * boss->fwork[45]; + boss->fwork[13] = __cosf(boss->unk_078.y * M_DTOR) * boss->fwork[45]; + boss->fwork[34] = 2.8f; + } + } + + func_i6_8019C194(boss, sp34, sp38); + + if (boss->swork[0x16] == 1) { + var_fv1 = gPlayer->unk_114 - 180.0f; + if (var_fv1 < 0.0f) { + var_fv1 += 360.0f; + } + + var_fv1 = boss->unk_078.y - var_fv1; + if (var_fv1 < 0.0f) { + var_fv1 += 360.0f; + } + + if ((sp34 <= 1300.0f) && (sp38 <= 800.0f) && (var_fv1 < 260.0f) && (var_fv1 > 100.0f) && + (boss->unk_078.x == 0.0f) && (boss->fwork[34] <= 2.0f)) { + if (Rand_ZeroOne() < 0.2f) { + func_i6_8019AA08(boss); + } + } + + if ((sp34 < 3400.0f) || (sp38 < 2400.0f)) { + if (((var_fv1 >= 60.0f) && (var_fv1 <= 100.0f)) || ((var_fv1 <= 300.0f) && (var_fv1 >= 260.0f))) { + if (Rand_ZeroOne() < 0.3f) { + if (Rand_ZeroOne() < 0.4f) { + func_i6_80197F18(boss); + } else { + func_i6_80199D64(boss); + } + } + } + + if (((var_fv1 > 300.0f) || (var_fv1 < 60.0f)) && (boss->unk_078.x == 0.0f)) { + if (Rand_ZeroOne() < 0.3f) { + if (Rand_ZeroOne() < 0.4f) { + func_i6_80197F18(boss); + } else { + func_i6_80199D64(boss); + } + } else if (gPlayer->state_1C8 != PLAYERSTATE_1C8_5) { + Math_SmoothStepToAngle(&boss->unk_078.x, 181.0f, 0.1f, 6.0f, 0.1f); + boss->swork[21] = 3; + boss->fwork[11] = __sinf(boss->unk_078.y * M_DTOR) * (boss->fwork[45] + 10.0f); + boss->fwork[13] = __cosf(boss->unk_078.y * M_DTOR) * (boss->fwork[45] + 10.0f); + boss->fwork[34] = 2.8f; + } + } + } + } + + if (func_i6_8019B5CC(boss) != 0) { + Math_SmoothStepToF(&boss->obj.pos.y, 1000.0f, 0.1f, 30.0f, 0.1f); + } else { + Math_SmoothStepToF(&boss->obj.pos.y, 0.0f, 0.1f, 5.0f, 0.1f); + } + + if (boss->timer_056 == 0) { + if (Rand_ZeroOne() <= 0.7f) { + func_i6_80199D64(boss); + } else { + func_i6_80197F18(boss); + } + } + + if (func_i6_8019B528(boss) != 0) { + func_i6_80198ABC(boss); + } +} #pragma GLOBAL_ASM("asm/us/nonmatchings/overlays/ovl_i6/fox_sy/func_i6_80198ABC.s") diff --git a/src/overlays/ovl_menu/fox_title.c b/src/overlays/ovl_menu/fox_title.c index 9e6963f2..0ae72330 100644 --- a/src/overlays/ovl_menu/fox_title.c +++ b/src/overlays/ovl_menu/fox_title.c @@ -11,15 +11,18 @@ extern AnimationHeader D_602F8E0; extern AnimationHeader D_60305C0; extern AnimationHeader D_6031DB8; extern AnimationHeader D_6031120; -extern AnimationHeader D_60338DC; extern AnimationHeader D_6035024; +extern AnimationHeader D_60338DC; extern AnimationHeader D_603531C; extern AnimationHeader D_6036278; extern SkelAnime D_602FBAC[]; extern SkelAnime D_603088C[]; -extern SkelAnime D_60313AC[]; extern SkelAnime D_6032084[]; +extern SkelAnime D_60313AC[]; + +extern Gfx D_6036290[]; +extern Gfx D_6036B30[]; f32 D_menu_801B7BB0; f32 D_menu_801B7BB4; @@ -157,14 +160,14 @@ f32 D_menu_801B9084; //! TODO: Symbols for segmented addresses Animation D_menu_801ADA00[4] = { - { (AnimationHeader*) 0x0602F8E0, (AnimationHeader*) 0x06035024, (SkelAnime*) 0x0602FBAC }, - { (AnimationHeader*) 0x060305C0, (AnimationHeader*) 0x060338DC, (SkelAnime*) 0x0603088C }, - { (AnimationHeader*) 0x06031DB8, (AnimationHeader*) 0x0603531C, (SkelAnime*) 0x06032084 }, - { (AnimationHeader*) 0x06031120, (AnimationHeader*) 0x06036278, (SkelAnime*) 0x060313AC }, + { &D_602F8E0, &D_6035024, D_602FBAC }, + { &D_60305C0, &D_60338DC, D_603088C }, + { &D_6031DB8, &D_603531C, D_6032084 }, + { &D_6031120, &D_6036278, D_60313AC }, }; u16* D_menu_801ADA30[5] = { - (u16*) 0x8017A150, (u16*) 0x8017A190, (u16*) 0x8017A1CC, (u16*) 0x8017A210, (u16*) 0x8017A260, + gMsg_ID_10, gMsg_ID_20, gMsg_ID_30, gMsg_ID_40, gMsg_ID_50, }; void func_menu_801875E0(void) { @@ -2953,8 +2956,8 @@ void func_menu_8018FD08(void) { } static Gfx* D_menu_801AE48C[12] = { - (Gfx*) 0x06036290, (Gfx*) 0x06036290, (Gfx*) 0x06036290, (Gfx*) 0x06036290, (Gfx*) 0x06036B30, (Gfx*) 0x06036290, - (Gfx*) 0x06036290, (Gfx*) 0x06036290, (Gfx*) 0x06036290, (Gfx*) 0x06036290, (Gfx*) 0x06036B30, (Gfx*) 0x06036290, + D_6036290, D_6036290, D_6036290, D_6036290, D_6036B30, D_6036290, + D_6036290, D_6036290, D_6036290, D_6036290, D_6036B30, D_6036290, }; static f32 D_menu_801AE4BC[12] = { diff --git a/yamls/us/main.yaml b/yamls/us/main.yaml index 198274e7..815d6cc5 100644 --- a/yamls/us/main.yaml +++ b/yamls/us/main.yaml @@ -185,7 +185,7 @@ - [0x77E40, c, fox_effect] - [0x84F70, c, fox_fade] - [0x852F0, c, fox_852F0] - - [0x85530, c, sf_hud] + - [0x85530, c, fox_hud] - [0x97F80, c, fox_97F80] - [0x9A580, c, fox_std_lib] - [0xA24B0, c, fox_game] @@ -276,7 +276,7 @@ - [0xD09A0, .data, fox_enmy] - [0xD0B80, .data, fox_enmy2] - [0xD20E0, .data, fox_effect] - - [0xD2570, data, sf_hud] + - [0xD2570, .data, fox_hud] - [0xD31D0, .data, fox_std_lib] - [0xD3460, .data, fox_game] - [0xD3520, .data, fox_A4290] @@ -301,7 +301,7 @@ - [0xD7650, .rodata, fox_enmy2] - [0xD7E30, .rodata, fox_effect] - [0xD82F0, .rodata, fox_fade] - - [0xD8320, .rodata, sf_hud] + - [0xD8320, .rodata, fox_hud] - [0xD8DE0, .rodata, fox_97F80] - [0xD8DF0, .rodata, fox_std_lib] - [0xD8E50, .rodata, fox_game] @@ -364,7 +364,7 @@ - { start: 0xDE480, type: .bss, vram: 0x801615D0, name: fox_edisplay } - { start: 0xDE480, type: .bss, vram: 0x80161670, name: fox_enmy } - { start: 0xDE480, type: .bss, vram: 0x80161690, name: fox_enmy2 } - - { start: 0xDE480, type: bss, vram: 0x801616A0, name: sf_hud } + - { start: 0xDE480, type: .bss, vram: 0x801616A0, name: fox_hud } - { start: 0xDE480, type: .bss, vram: 0x80161950, name: fox_97F80 } - { start: 0xDE480, type: .bss, vram: 0x801619A0, name: fox_std_lib } - { start: 0xDE480, type: .bss, vram: 0x80161A10, name: fox_game } diff --git a/yamls/us/overlays.yaml b/yamls/us/overlays.yaml index 1b2c69ab..4607becc 100644 --- a/yamls/us/overlays.yaml +++ b/yamls/us/overlays.yaml @@ -37,7 +37,7 @@ - [0xE08410, c, fox_me] - [0xE0FF10, c, fox_sx] - [0xE16300, .data, fox_i2] - - [0xE16310, data, fox_me] + - [0xE16310, .data, fox_me] - [0xE16520, .data, fox_sx] - [0xE16670, .rodata, fox_me] - [0xE16930, .rodata, fox_sx]