diff --git a/config/GALE01/symbols.txt b/config/GALE01/symbols.txt index 26896a287b..b821303007 100644 --- a/config/GALE01/symbols.txt +++ b/config/GALE01/symbols.txt @@ -27,20 +27,20 @@ _bss_init_info = .init:0x800054F4; // type:object size:0x18 scope:global data:4b @etb_80005570 = extab:0x80005570; // type:object size:0x8 scope:local hidden @etb_80005578 = extab:0x80005578; // type:object size:0x8 scope:local hidden @etb_80005580 = extab:0x80005580; // type:object size:0x8 scope:local hidden -@etb_80005588 = extab:0x80005588; // type:object size:0x8 scope:local hidden -@etb_80005590 = extab:0x80005590; // type:object size:0x8 scope:local hidden -@etb_80005598 = extab:0x80005598; // type:object size:0x8 scope:local hidden -@etb_800055A0 = extab:0x800055A0; // type:object size:0x8 scope:local hidden -@etb_800055A8 = extab:0x800055A8; // type:object size:0x8 scope:local hidden -@etb_800055B0 = extab:0x800055B0; // type:object size:0x8 scope:local hidden -@etb_800055B8 = extab:0x800055B8; // type:object size:0x8 scope:local hidden -@etb_800055C0 = extab:0x800055C0; // type:object size:0x8 scope:local hidden -@etb_800055C8 = extab:0x800055C8; // type:object size:0x8 scope:local hidden -@etb_800055D0 = extab:0x800055D0; // type:object size:0x8 scope:local hidden -@etb_800055D8 = extab:0x800055D8; // type:object size:0x8 scope:local hidden -@etb_800055E0 = extab:0x800055E0; // type:object size:0x8 scope:local hidden -@etb_800055E8 = extab:0x800055E8; // type:object size:0x8 scope:local hidden -@etb_800055F0 = extab:0x800055F0; // type:object size:0x8 scope:local hidden +@225 = extab:0x80005588; // type:object size:0x8 scope:local hidden +@228 = extab:0x80005590; // type:object size:0x8 scope:local hidden +@258 = extab:0x80005598; // type:object size:0x8 scope:local hidden +@283 = extab:0x800055A0; // type:object size:0x8 scope:local hidden +@294 = extab:0x800055A8; // type:object size:0x8 scope:local hidden +@317 = extab:0x800055B0; // type:object size:0x8 scope:local hidden +@332 = extab:0x800055B8; // type:object size:0x8 scope:local hidden +@369 = extab:0x800055C0; // type:object size:0x8 scope:local hidden +@395 = extab:0x800055C8; // type:object size:0x8 scope:local hidden +@740 = extab:0x800055D0; // type:object size:0x8 scope:local hidden +@774 = extab:0x800055D8; // type:object size:0x8 scope:local hidden +@793 = extab:0x800055E0; // type:object size:0x8 scope:local hidden +@912 = extab:0x800055E8; // type:object size:0x8 scope:local hidden +@929 = extab:0x800055F0; // type:object size:0x8 scope:local hidden @etb_800055F8 = extab:0x800055F8; // type:object size:0x8 scope:local hidden @etb_80005600 = extab:0x80005600; // type:object size:0x8 scope:local hidden @etb_80005608 = extab:0x80005608; // type:object size:0x8 scope:local hidden @@ -77,20 +77,20 @@ _bss_init_info = .init:0x800054F4; // type:object size:0x18 scope:global data:4b @eti_80005738 = extabindex:0x80005738; // type:object size:0xC scope:local hidden @eti_80005744 = extabindex:0x80005744; // type:object size:0xC scope:local hidden @eti_80005750 = extabindex:0x80005750; // type:object size:0xC scope:local hidden -@eti_8000575C = extabindex:0x8000575C; // type:object size:0xC scope:local hidden -@eti_80005768 = extabindex:0x80005768; // type:object size:0xC scope:local hidden -@eti_80005774 = extabindex:0x80005774; // type:object size:0xC scope:local hidden -@eti_80005780 = extabindex:0x80005780; // type:object size:0xC scope:local hidden -@eti_8000578C = extabindex:0x8000578C; // type:object size:0xC scope:local hidden -@eti_80005798 = extabindex:0x80005798; // type:object size:0xC scope:local hidden -@eti_800057A4 = extabindex:0x800057A4; // type:object size:0xC scope:local hidden -@eti_800057B0 = extabindex:0x800057B0; // type:object size:0xC scope:local hidden -@eti_800057BC = extabindex:0x800057BC; // type:object size:0xC scope:local hidden -@eti_800057C8 = extabindex:0x800057C8; // type:object size:0xC scope:local hidden -@eti_800057D4 = extabindex:0x800057D4; // type:object size:0xC scope:local hidden -@eti_800057E0 = extabindex:0x800057E0; // type:object size:0xC scope:local hidden -@eti_800057EC = extabindex:0x800057EC; // type:object size:0xC scope:local hidden -@eti_800057F8 = extabindex:0x800057F8; // type:object size:0xC scope:local hidden +@226 = extabindex:0x8000575C; // type:object size:0xC scope:local hidden +@229 = extabindex:0x80005768; // type:object size:0xC scope:local hidden +@259 = extabindex:0x80005774; // type:object size:0xC scope:local hidden +@284 = extabindex:0x80005780; // type:object size:0xC scope:local hidden +@295 = extabindex:0x8000578C; // type:object size:0xC scope:local hidden +@318 = extabindex:0x80005798; // type:object size:0xC scope:local hidden +@333 = extabindex:0x800057A4; // type:object size:0xC scope:local hidden +@370 = extabindex:0x800057B0; // type:object size:0xC scope:local hidden +@396 = extabindex:0x800057BC; // type:object size:0xC scope:local hidden +@741 = extabindex:0x800057C8; // type:object size:0xC scope:local hidden +@775 = extabindex:0x800057D4; // type:object size:0xC scope:local hidden +@794 = extabindex:0x800057E0; // type:object size:0xC scope:local hidden +@913 = extabindex:0x800057EC; // type:object size:0xC scope:local hidden +@930 = extabindex:0x800057F8; // type:object size:0xC scope:local hidden @eti_80005804 = extabindex:0x80005804; // type:object size:0xC scope:local hidden @eti_80005810 = extabindex:0x80005810; // type:object size:0xC scope:local hidden @eti_8000581C = extabindex:0x8000581C; // type:object size:0xC scope:local hidden @@ -17269,7 +17269,7 @@ ifTime_Reset = .text:0x802F480C; // type:function size:0x30 scope:global ifTime_FreeTimers = .text:0x802F483C; // type:function size:0x5C scope:global ifTime_IsTimerHidden = .text:0x802F4898; // type:function size:0x78 scope:global ifStatus_GetHUDInfo = .text:0x802F4910; // type:function size:0xC scope:global -ifStatus_PercentOnDeathAnimationThink = .text:0x802F491C; // type:function size:0x268 scope:global +ifStatus_PercentOnDeathAnimationThink = .text:0x802F491C; // type:function size:0x268 scope:local ifStatus_802F4B84 = .text:0x802F4B84; // type:function size:0x358 scope:global ifStatus_802F4EDC = .text:0x802F4EDC; // type:function size:0xC6C scope:global ifStatus_802F5B48 = .text:0x802F5B48; // type:function size:0x298 scope:global @@ -24247,12 +24247,13 @@ it_803F94A0 = .data:0x803F94A0; // type:object size:0x30 scope:global @263 = .data:0x803F953C; // type:object size:0xA scope:local data:string @309 = .data:0x803F9548; // type:object size:0x25 scope:local data:string @310 = .data:0x803F9570; // type:object size:0x25 scope:local data:string -ifStatus_803F9598 = .data:0x803F9598; // type:object size:0x14 scope:global data:string -ifStatus_803F95AC = .data:0x803F95AC; // type:object size:0x14 scope:global data:string -lbl_803F95C0 = .data:0x803F95C0; // type:object size:0xA data:string -lbl_803F95CC = .data:0x803F95CC; // type:object size:0x25 data:string -lbl_803F95F4 = .data:0x803F95F4; // type:object size:0xB data:string -lbl_803F9600 = .data:0x803F9600; // type:object size:0x25 data:string +num_models_name = .data:0x803F9598; // type:object size:0x14 scope:global data:string +...data.0 = .data:0x803F9598; // type:label scope:local +mrk_models_name = .data:0x803F95AC; // type:object size:0x14 scope:global data:string +@692 = .data:0x803F95C0; // type:object size:0xA scope:local data:string +@754 = .data:0x803F95CC; // type:object size:0x25 scope:local data:string +@755 = .data:0x803F95F4; // type:object size:0xB scope:local data:string +@757 = .data:0x803F9600; // type:object size:0x25 scope:local data:string ifStatus_803F9628 = .data:0x803F9628; // type:object size:0x140 scope:global data:4byte ...data.0 = .data:0x803F9628; // type:label scope:local @234 = .data:0x803F9768; // type:object size:0x16 scope:local data:string @@ -25953,13 +25954,13 @@ lbl_8040BFEC = .data:0x8040BFEC; // type:object size:0x22 scope:local data:strin lbl_8040C010 = .data:0x8040C010; // type:object size:0x9 scope:local data:string lbl_8040C01C = .data:0x8040C01C; // type:object size:0x27 scope:local data:string jumptable_8040C044 = .data:0x8040C044; // type:object size:0x200 scope:local -lbl_8040C248 = .data:0x8040C248; // type:object size:0xC scope:local data:string -lbl_8040C254 = .data:0x8040C254; // type:object size:0x9 scope:local data:string -jumptable_8040C260 = .data:0x8040C260; // type:object size:0x20 scope:local -jumptable_8040C280 = .data:0x8040C280; // type:object size:0x24 scope:local -lbl_8040C2A4 = .data:0x8040C2A4; // type:object size:0x9 scope:local data:string -lbl_8040C2B0 = .data:0x8040C2B0; // type:object size:0x27 scope:local data:string -jumptable_8040C2D8 = .data:0x8040C2D8; // type:object size:0x24 scope:local +@722 = .data:0x8040C248; // type:object size:0xC scope:local data:string +@723 = .data:0x8040C254; // type:object size:0x9 scope:local data:string +@738 = .data:0x8040C260; // type:object size:0x20 scope:local +@737 = .data:0x8040C280; // type:object size:0x24 scope:local +@791 = .data:0x8040C2A4; // type:object size:0x9 scope:local data:string +@792 = .data:0x8040C2B0; // type:object size:0x27 scope:local data:string +@911 = .data:0x8040C2D8; // type:object size:0x24 scope:local HSD_PSDisp_8040C300 = .data:0x8040C300; // type:object size:0x9 scope:local data:string HSD_PSDisp_8040C30C = .data:0x8040C30C; // type:object size:0x27 scope:local data:string HSD_PSDisp_8040C334 = .data:0x8040C334; // type:object size:0xC scope:local @@ -26383,6 +26384,7 @@ ifTime_data = .bss:0x804A1078; // type:object size:0x3C scope:local data:4byte ...bss.0 = .bss:0x804A1078; // type:label scope:local ifTime_match_timer_models = .bss:0x804A10B4; // type:object size:0x10 scope:local data:4byte ifStatus_HudInfo = .bss:0x804A10C8; // type:object size:0x278 scope:global data:4byte +...bss.0 = .bss:0x804A10C8; // type:label scope:local lbl_804A1340 = .bss:0x804A1340; // type:object size:0x34 data:4byte ...bss.0 = .bss:0x804A1340; // type:label scope:local ifStock_804A1378 = .bss:0x804A1378; // type:object size:0x3FC scope:global data:4byte @@ -27874,9 +27876,9 @@ it_804D5518$198 = .sdata:0x804D5518; // type:object size:0x8 scope:local @262 = .sdata:0x804D579C; // type:object size:0x5 scope:local data:string ifStatus_804D57A8 = .sdata:0x804D57A8; // type:object size:0x4 scope:global data:byte ifStatus_804D57AC = .sdata:0x804D57AC; // type:object size:0x4 scope:global data:byte -ifStatus_804D57B0 = .sdata:0x804D57B0; // type:object size:0x7 scope:global data:string -ifStatus_804D57B8 = .sdata:0x804D57B8; // type:object size:0x5 scope:global data:string -ifStatus_804D57C0 = .sdata:0x804D57C0; // type:object size:0x2 scope:global data:string +@283 = .sdata:0x804D57B0; // type:object size:0x7 scope:local data:string +@284 = .sdata:0x804D57B8; // type:object size:0x5 scope:local data:string +@756 = .sdata:0x804D57C0; // type:object size:0x2 scope:local data:string @307 = .sdata:0x804D57C8; // type:object size:0x7 scope:local data:string @308 = .sdata:0x804D57D0; // type:object size:0x5 scope:local data:string ifStock_804D57D8 = .sdata:0x804D57D8; // type:object size:0x7 scope:global data:string @@ -28316,8 +28318,8 @@ lbl_804D6350 = .sdata:0x804D6350; // type:object size:0x8 scope:local lbl_804D6358 = .sdata:0x804D6358; // type:object size:0x7 scope:local data:string lbl_804D6360 = .sdata:0x804D6360; // type:object size:0x5 scope:local data:string lbl_804D6368 = .sdata:0x804D6368; // type:object size:0x2 scope:local data:2byte -lbl_804D636C = .sdata:0x804D636C; // type:object size:0x7 scope:local data:string -lbl_804D6374 = .sdata:0x804D6374; // type:object size:0x5 scope:local data:string +@223 = .sdata:0x804D636C; // type:object size:0x7 scope:local data:string +@224 = .sdata:0x804D6374; // type:object size:0x5 scope:local data:string psFrameNum = .sdata:0x804D6380; // type:object size:0x1 scope:global data:byte HSD_PSDisp_804D6384 = .sdata:0x804D6384; // type:object size:0x2 scope:global data:string @104 = .sdata:0x804D6388; // type:object size:0x5 scope:local data:string @@ -35039,23 +35041,23 @@ lbl_804DE98C = .sdata2:0x804DE98C; // type:object size:0x4 scope:local align:4 d lbl_804DE990 = .sdata2:0x804DE990; // type:object size:0x4 scope:local align:4 data:float lbl_804DE998 = .sdata2:0x804DE998; // type:object size:0x8 scope:local align:8 data:double lbl_804DE9A0 = .sdata2:0x804DE9A0; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9A8 = .sdata2:0x804DE9A8; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9AC = .sdata2:0x804DE9AC; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9B0 = .sdata2:0x804DE9B0; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9B8 = .sdata2:0x804DE9B8; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9C0 = .sdata2:0x804DE9C0; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9C4 = .sdata2:0x804DE9C4; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9C8 = .sdata2:0x804DE9C8; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9CC = .sdata2:0x804DE9CC; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9D0 = .sdata2:0x804DE9D0; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9D8 = .sdata2:0x804DE9D8; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9E0 = .sdata2:0x804DE9E0; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9E8 = .sdata2:0x804DE9E8; // type:object size:0x8 scope:local align:8 data:double -lbl_804DE9F0 = .sdata2:0x804DE9F0; // type:object size:0x4 scope:local align:4 data:float -lbl_804DE9F8 = .sdata2:0x804DE9F8; // type:object size:0x8 scope:local align:8 data:double -lbl_804DEA00 = .sdata2:0x804DEA00; // type:object size:0x8 scope:local align:8 data:double -lbl_804DEA08 = .sdata2:0x804DEA08; // type:object size:0x4 scope:local align:4 data:float -lbl_804DEA0C = .sdata2:0x804DEA0C; // type:object size:0x4 scope:local align:4 data:float +@257 = .sdata2:0x804DE9A8; // type:object size:0x4 scope:local align:4 data:float +@719 = .sdata2:0x804DE9AC; // type:object size:0x4 scope:local align:4 data:float +@720 = .sdata2:0x804DE9B0; // type:object size:0x8 scope:local align:8 data:double +@721 = .sdata2:0x804DE9B8; // type:object size:0x8 scope:local align:8 data:double +@724 = .sdata2:0x804DE9C0; // type:object size:0x4 scope:local align:4 data:float +@725 = .sdata2:0x804DE9C4; // type:object size:0x4 scope:local align:4 data:float +@726 = .sdata2:0x804DE9C8; // type:object size:0x4 scope:local align:4 data:float +@727 = .sdata2:0x804DE9CC; // type:object size:0x4 scope:local align:4 data:float +@728 = .sdata2:0x804DE9D0; // type:object size:0x8 scope:local align:8 data:double +@729 = .sdata2:0x804DE9D8; // type:object size:0x8 scope:local align:8 data:double +@730 = .sdata2:0x804DE9E0; // type:object size:0x8 scope:local align:8 data:double +@731 = .sdata2:0x804DE9E8; // type:object size:0x8 scope:local align:8 data:double +@732 = .sdata2:0x804DE9F0; // type:object size:0x4 scope:local align:4 data:float +@733 = .sdata2:0x804DE9F8; // type:object size:0x8 scope:local align:8 data:double +@736 = .sdata2:0x804DEA00; // type:object size:0x8 scope:local align:8 data:double +@909 = .sdata2:0x804DEA08; // type:object size:0x4 scope:local align:4 data:float +@910 = .sdata2:0x804DEA0C; // type:object size:0x4 scope:local align:4 data:float HSD_PSDisp_804DEA10 = .sdata2:0x804DEA10; // type:object size:0x4 scope:global align:4 data:float HSD_PSDisp_804DEA14 = .sdata2:0x804DEA14; // type:object size:0x4 scope:global align:4 data:float HSD_PSDisp_804DEA18 = .sdata2:0x804DEA18; // type:object size:0x4 scope:global align:4 data:float diff --git a/configure.py b/configure.py index 12820f8745..b9b96e08bd 100755 --- a/configure.py +++ b/configure.py @@ -1552,7 +1552,7 @@ def MatchingFor(*versions): [ Object(Matching, "melee/if/ifall.c"), Object(Matching, "melee/if/iftime.c"), - Object(Linkable, "melee/if/ifstatus.c"), + Object(Matching, "melee/if/ifstatus.c"), Object(Matching, "melee/if/if_2F6E.c"), Object(Matching, "melee/if/if_2F72.c"), Object(Linkable, "melee/if/ifstock.c"), @@ -1926,7 +1926,7 @@ def MatchingFor(*versions): extra_cflags=["-Cpp_exceptions on"], ), Object( - Linkable, + Matching, "sysdolphin/baselib/generator.c", extra_cflags=["-Cpp_exceptions on"], ), diff --git a/src/melee/ef/eflib.c b/src/melee/ef/eflib.c index 5c46069810..ea699c85b2 100644 --- a/src/melee/ef/eflib.c +++ b/src/melee/ef/eflib.c @@ -1050,20 +1050,16 @@ void (*lbl_803BF810[0x03])(HSD_Particle* particle) = { efLib_Cb_ParticleRender, // parent joint. void efLib_Cb_PtclAppSRTHook(HSD_Generator* gen) { - if (gen->cmdList == ((HSD_PSCmdList*) ptclref_804D0E5C[0][0x96])->cmdList) - { + if (gen->cmdList == ptclref_804D0E5C[0][0x96]->cmdList) { hsd_8039D1E4(gen, lbl_803BF810); } - if (gen->cmdList == ((HSD_PSCmdList*) ptclref_804D0E5C[0][0x97])->cmdList) - { + if (gen->cmdList == ptclref_804D0E5C[0][0x97]->cmdList) { hsd_8039D1E4(gen, lbl_803BF810); } - if (gen->cmdList == ((HSD_PSCmdList*) ptclref_804D0E5C[0][0x98])->cmdList) - { + if (gen->cmdList == ptclref_804D0E5C[0][0x98]->cmdList) { hsd_8039D1E4(gen, lbl_803BF810); } - if (gen->cmdList == ((HSD_PSCmdList*) ptclref_804D0E5C[0][0x21B])->cmdList) - { + if (gen->cmdList == ptclref_804D0E5C[0][0x21B]->cmdList) { hsd_8039D1E4(gen, lbl_803BF810); } } diff --git a/src/melee/ft/chara/ftCommon/ftCo_0A01.c b/src/melee/ft/chara/ftCommon/ftCo_0A01.c index 144bdd11f5..a3b0f71971 100644 --- a/src/melee/ft/chara/ftCommon/ftCo_0A01.c +++ b/src/melee/ft/chara/ftCommon/ftCo_0A01.c @@ -1056,6 +1056,18 @@ void ftCo_800A1F3C(Fighter* fp, float arg1, float arg2, float arg3) } } +static inline void ftCo_800A75DC_set_target(Fighter* fp, const int* x60, + float arg1, float arg2, float arg3) +{ + struct Fighter_x1A88_t* data = &fp->x1A88; + if (*x60 == 0) { + data->x54.x = arg1; + data->x54.y = arg2; + data->x38 = arg3; + ftCo_800A1CC4(fp, ftCo_803C6594[stage_info.grkind]); + } +} + bool ftCo_800A1F98(int x, float y) { float slope; @@ -3657,7 +3669,7 @@ void ftCo_800A75DC(Fighter* fp0, Fighter* fp1) Vec3 floor_normal; int line_id; u32 flags; - u8 _[0x14]; + u8 _[0x18]; Vec3 sp18; f32 fx; f32 fy; @@ -3668,22 +3680,38 @@ void ftCo_800A75DC(Fighter* fp0, Fighter* fp1) } if (fp1->ground_or_air == GA_Air) { s32 result; - mp_UnkStruct0* island; + s32 blocked; fx = fp1->cur_pos.x; { f32 fx2 = fx; f32 below; f32 above; fy = fp1->cur_pos.y; + blocked = 0; + line_id = -1; below = fy - 1000.0f; above = 10.0f + fy; - result = - ftCo_800A75DC_CheckFloor(fx2, above, fx, below, &floor_pos, - &line_id, &flags, &floor_normal); + result = mpCheckFloor(fx2, above, fx, below, 0.0f, &floor_pos, + &line_id, &flags, &floor_normal, -1, -1, -1, + NULL, (Fighter_GObj*) blocked); + } + if (result != 0) { + int line = line_id; + if (grBigBlue_801EF844(line) || grInishie1_801FCAAC(line) || + grCorneria_801E2D90(line) || grVenom_80206D10(line)) + { + blocked = 1; + } + if (blocked != 0) { + result = 0; + } } if (result != 0) { + int* x60; + mp_UnkStruct0* island; island = mpIsland_8005AB54(line_id); if (ftCo_800A2718(island) == 0) { + x60 = &fp0->x1A88.x60; ftCo_800A1F3C(fp0, floor_pos.x, floor_pos.y, data->x56C + fp1->x1A88.x564); if (island != NULL) { @@ -3692,8 +3720,9 @@ void ftCo_800A75DC(Fighter* fp0, Fighter* fp1) d = -d; } if (d < 5.0) { - ftCo_800A1F3C(fp0, island->x14.x - 5.0, island->x14.y, - data->x56C + fp1->x1A88.x564); + ftCo_800A75DC_set_target(fp0, x60, island->x14.x - 5.0, + island->x14.y, + data->x56C + fp1->x1A88.x564); } else { d = ABS(island->x8.x - data->x54.x); if (d < 5.0) { @@ -3711,10 +3740,12 @@ void ftCo_800A75DC(Fighter* fp0, Fighter* fp1) } else if (ftCo_800A2718(mpIsland_8005AB54(fp1->coll_data.floor.index)) == 0) { + int* x60; mp_UnkStruct0* island; mp_UnkStruct0* fp0_island; s32 same_island; + x60 = &fp0->x1A88.x60; ftCo_800A1F3C(fp0, fp1->cur_pos.x, fp1->cur_pos.y, data->x56C + fp1->x1A88.x564); if (fp0->ground_or_air == GA_Air) { @@ -3739,8 +3770,9 @@ void ftCo_800A75DC(Fighter* fp0, Fighter* fp1) { if (data->x54.x - fp0->cur_pos.x > 0.0) { if (fp0->cur_pos.x < island->x8.x) { - ftCo_800A1F3C(fp0, 5.0 + island->x8.x, island->x8.y, - data->x56C + fp1->x1A88.x564); + ftCo_800A75DC_set_target(fp0, x60, 5.0 + island->x8.x, + island->x8.y, + data->x56C + fp1->x1A88.x564); } } else { if (fp0->cur_pos.x > island->x14.x) { diff --git a/src/melee/gm/types.h b/src/melee/gm/types.h index 7f50bdb1a4..84aed1ec74 100644 --- a/src/melee/gm/types.h +++ b/src/melee/gm/types.h @@ -478,6 +478,44 @@ struct Placeholder_8016AE38_flags_2 { /* +2:7 */ u8 x2_b7 : 1; }; +struct lbl_8046B6A0_FighterMatchInfoFlags { + u8 x4_b0 : 1; ///< metal + u8 x4_b1 : 1; + u8 x4_b2 : 1; ///< invisible + u8 x4_b3 : 1; + u8 x4_b4 : 1; ///< Zelda/Sheik transforming on load + u8 x4_b5 : 1; + u8 x4_b6 : 1; + u8 x4_b7 : 1; +}; + +struct lbl_8046B6A0_FighterMatchInfo { + u8 x0; ///< CharacterKind + u8 x1; + u8 slot_type; + s8 spawn_point; + union { + struct { + u8 x4_b0 : 1; ///< metal + u8 x4_b1 : 1; + u8 x4_b2 : 1; ///< invisible + u8 x4_b3 : 1; + u8 x4_b4 : 1; ///< Zelda/Sheik transforming on load + u8 x4_b5 : 1; + u8 x4_b6 : 1; + u8 x4_b7 : 1; + }; + struct lbl_8046B6A0_FighterMatchInfoFlags flags; + }; + u8 x5; + u16 x6; + u8 x8; + u8 x9; + u8 respawn_timer; + u8 xB; + u16 xC; +}; + struct lbl_8046B6A0_t { /* 0x0000 */ u8 unk_0; ///< 0 During a match ///< 1 While GAME! or "TIMEOUT!" is displayed/match @@ -519,27 +557,7 @@ struct lbl_8046B6A0_t { /* 0x002E */ u16 unk_2E; /* 0x0030 */ u8 unk_30; /* 0x0034 */ f32 unk_34; - /* 0x0038 */ struct { - u8 x0; ///< CharacterKind - u8 x1; - u8 slot_type; - s8 spawn_point; - u8 x4_b0 : 1; ///< metal - u8 x4_b1 : 1; - u8 x4_b2 : 1; ///< invisible - u8 x4_b3 : 1; - u8 x4_b4 : 1; ///< Zelda/Sheik transforming on load - u8 x4_b5 : 1; - u8 x4_b6 : 1; - u8 x4_b7 : 1; - u8 x5; - u16 x6; - u8 x8; - u8 x9; - u8 respawn_timer; - u8 xB; - u16 xC; - } FighterMatchInfo[6]; + /* 0x0038 */ struct lbl_8046B6A0_FighterMatchInfo FighterMatchInfo[6]; /* 0x0038 */ char pad_8C[0x24C - 0x8C]; /* maybe part of unk_34[0x925]? */ /* 0x024C */ struct lbl_8046B6A0_24C_t x24C; /* 0x24C8 */ struct StartMeleeRules x24C8; diff --git a/src/melee/if/ifstatus.c b/src/melee/if/ifstatus.c index ead732e793..91618ae38d 100644 --- a/src/melee/if/ifstatus.c +++ b/src/melee/if/ifstatus.c @@ -64,6 +64,33 @@ char mrk_models_name[] = "DmgMrk_scene_models"; HudIndex ifStatus_HudInfo; +/// @todo .sdata2 order hack +#ifdef MUST_MATCH +static void sdata2_order(void) +{ + (void) 1.0F; + (void) 0.0F; + (void) 2.0F; + (void) U32_TO_F32; + (void) S32_TO_F32; + (void) 300.0F; + (void) 100.0F; + (void) 0.5069F; + (void) 0.6083F; + (void) 0.3041F; + (void) 1.2165F; + (void) 0.811F; + (void) 0.1014F; + (void) 1.5207F; + (void) -100.0F; + (void) 0.2028F; + (void) 0.5F; + (void) 0.65F; + (void) 0.1F; + (void) 0.25F; +} +#endif + HudIndex* ifStatus_GetHUDInfo(void) { return &ifStatus_HudInfo; @@ -205,66 +232,123 @@ void ifStatus_802F4B84(IfDamageState* state, s32 is_stamina) PAD_STACK(8); } -inline void ifStatus_SetDamageDigit(HSD_JObj* digit_jobj, - HSD_MatAnimJoint** anim_base, u8 digit) +static inline void ifStatus_InitDamageDigits(IfDamageState* state, + HSD_MatAnimJoint** anim_base) { - HSD_TObjAddAnimAll(digit_jobj->u.dobj->mobj->tobj, - (HSD_TexAnim*) ((HSD_AnimJoint*) anim_base[0]) - ->child->child->aobjdesc->fobjdesc); - HSD_TObjReqAnimAll(digit_jobj->u.dobj->mobj->tobj, 2.0F * digit); - HSD_AObjSetRate(digit_jobj->u.dobj->mobj->tobj->aobj, 0.0F); -} - -inline void ifStatus_InitDamageDigits(IfDamageState* state, - HSD_MatAnimJoint** anim_base) -{ - HSD_JObj* digit_jobj; + HSD_JObj* hundreds_jobj; + HSD_JObj* tens_jobj; + HSD_JObj* ones_jobj; u8 digit; - digit_jobj = state->jobjs[Ones]; + ones_jobj = state->jobjs[Ones]; digit = state->damage_percent % 10; - ifStatus_SetDamageDigit(digit_jobj, anim_base, digit); + HSD_TObjAddAnimAll(ones_jobj->u.dobj->mobj->tobj, + (HSD_TexAnim*) ((HSD_AnimJoint*) anim_base[0]) + ->child->child->aobjdesc->fobjdesc); + HSD_TObjReqAnimAll(ones_jobj->u.dobj->mobj->tobj, 2.0F * digit); + HSD_AObjSetRate(ones_jobj->u.dobj->mobj->tobj->aobj, 0.0F); - digit_jobj = state->jobjs[Tens]; + tens_jobj = state->jobjs[Tens]; digit = (state->damage_percent % 100) / 10; - ifStatus_SetDamageDigit(digit_jobj, anim_base, digit); + HSD_TObjAddAnimAll(tens_jobj->u.dobj->mobj->tobj, + (HSD_TexAnim*) ((HSD_AnimJoint*) anim_base[0]) + ->child->child->aobjdesc->fobjdesc); + HSD_TObjReqAnimAll(tens_jobj->u.dobj->mobj->tobj, 2.0F * digit); + HSD_AObjSetRate(tens_jobj->u.dobj->mobj->tobj->aobj, 0.0F); - digit_jobj = state->jobjs[Hundreds]; + hundreds_jobj = state->jobjs[Hundreds]; digit = (state->damage_percent % 1000) / 100; - ifStatus_SetDamageDigit(digit_jobj, anim_base, digit); + HSD_TObjAddAnimAll(hundreds_jobj->u.dobj->mobj->tobj, + (HSD_TexAnim*) ((HSD_AnimJoint*) anim_base[0]) + ->child->child->aobjdesc->fobjdesc); + HSD_TObjReqAnimAll(hundreds_jobj->u.dobj->mobj->tobj, 2.0F * digit); + HSD_AObjSetRate(hundreds_jobj->u.dobj->mobj->tobj->aobj, 0.0F); } -inline void ifStatus_ApplyDamageColor(IfDamageState* state, GXColor* color) +static inline f32 ifStatus_GetStoredTranslationX(IfDamageState* state, + s32 index) { - HSD_MObj* mobj; - - mobj = state->jobjs[Hundreds]->u.dobj->mobj; - mobj->mat->diffuse.r = color->r; - mobj->mat->diffuse.g = color->g; - mobj->mat->diffuse.b = color->b; - - mobj = state->jobjs[Tens]->u.dobj->mobj; - mobj->mat->diffuse.r = color->r; - mobj->mat->diffuse.g = color->g; - mobj->mat->diffuse.b = color->b; - - mobj = state->jobjs[Ones]->u.dobj->mobj; - mobj->mat->diffuse.r = color->r; - mobj->mat->diffuse.g = color->g; - mobj->mat->diffuse.b = color->b; - - mobj = state->jobjs[Percent]->u.dobj->mobj; - mobj->mat->diffuse.r = color->r; - mobj->mat->diffuse.g = color->g; - mobj->mat->diffuse.b = color->b; + return state->translation_x[index]; } -inline void ifStatus_StoreDamageTranslations(IfDamageState* state, - HSD_JObj* jobj) +static inline void ifStatus_UpdateDamageDisplay(IfDamageState* state, + HSD_JObj* jobj, GXColor* color, + GXColor* stamina_color, + GXColor* normal_color) { + HSD_MObj* mobj; HSD_JObj* digit_jobj; + s16 clamped_damage; + f32 factor; s32 i; + if ((state->damage_percent % 1000) / 100 == 0) { + HSD_JObjSetFlagsAll(state->jobjs[Hundreds], JOBJ_HIDDEN); + } else { + HSD_JObjClearFlagsAll(state->jobjs[Hundreds], JOBJ_HIDDEN); + } + + if (state->old_damage != state->damage_percent) { + if (Player_GetMoreFlagsBit2((s8) state->player_slot)) { + if ((clamped_damage = state->damage_percent) > 100) { + clamped_damage = 100; + } else if (clamped_damage < 0) { + clamped_damage = 0; + } + factor = 1.0F - ((f32) clamped_damage / 100.0F); + stamina_color->r = (s8) (factor * (f32) (ifStatus_804D57AC[0] - + ifStatus_804D57A8[0]) + + (f32) ifStatus_804D57A8[0]); + stamina_color->g = (s8) (factor * (f32) (ifStatus_804D57AC[1] - + ifStatus_804D57A8[1]) + + (f32) ifStatus_804D57A8[1]); + stamina_color->b = (s8) (factor * (f32) (ifStatus_804D57AC[2] - + ifStatus_804D57A8[2]) + + (f32) ifStatus_804D57A8[2]); + stamina_color->a = 255; + *color = *stamina_color; + } else { + clamped_damage = state->damage_percent; + if (clamped_damage > 300) { + clamped_damage = 300; + } else if (clamped_damage < 0) { + clamped_damage = 0; + } + factor = (f32) clamped_damage / 300.0F; + normal_color->r = (s8) (factor * (f32) (ifStatus_804D57AC[0] - + ifStatus_804D57A8[0]) + + (f32) ifStatus_804D57A8[0]); + normal_color->g = (s8) (factor * (f32) (ifStatus_804D57AC[1] - + ifStatus_804D57A8[1]) + + (f32) ifStatus_804D57A8[1]); + normal_color->b = (s8) (factor * (f32) (ifStatus_804D57AC[2] - + ifStatus_804D57A8[2]) + + (f32) ifStatus_804D57A8[2]); + normal_color->a = 255; + *color = *normal_color; + } + + mobj = state->jobjs[Hundreds]->u.dobj->mobj; + mobj->mat->diffuse.r = color->r; + mobj->mat->diffuse.g = color->g; + mobj->mat->diffuse.b = color->b; + + mobj = state->jobjs[Tens]->u.dobj->mobj; + mobj->mat->diffuse.r = color->r; + mobj->mat->diffuse.g = color->g; + mobj->mat->diffuse.b = color->b; + + mobj = state->jobjs[Ones]->u.dobj->mobj; + mobj->mat->diffuse.r = color->r; + mobj->mat->diffuse.g = color->g; + mobj->mat->diffuse.b = color->b; + + mobj = state->jobjs[Percent]->u.dobj->mobj; + mobj->mat->diffuse.r = color->r; + mobj->mat->diffuse.g = color->g; + mobj->mat->diffuse.b = color->b; + } + if (lb_8000B09C(jobj)) { for (i = 0; i < 4; i++) { digit_jobj = state->jobjs[i]; @@ -278,11 +362,6 @@ inline void ifStatus_StoreDamageTranslations(IfDamageState* state, } } -inline f32 ifStatus_GetStoredTranslationX(IfDamageState* state, s32 index) -{ - return state->translation_x[index]; -} - void ifStatus_802F4EDC(HSD_GObj* gobj) { HudIndex* hud; @@ -291,20 +370,21 @@ void ifStatus_802F4EDC(HSD_GObj* gobj) HSD_JObj* digit_jobj; s32 is_stamina; GXColor color; + UNUSED u8 pad_a[28]; + GXColor stamina_color; + UNUSED u8 pad_b[4]; + GXColor normal_color; + UNUSED u8 pad_c[24]; HSD_TObj* tobj; HSD_MatAnimJoint** anim_base; s32 i; u8 digit; - f32 digit_offset; f32 ones_offset; f32 tens_offset; f32 hundreds_offset; f32 pos; - s16 clamped_damage; - f32 factor; IfDamageState* ptr; - PAD_STACK(0x10); hud = ifStatus_GetHUDInfo(); { @@ -402,102 +482,53 @@ void ifStatus_802F4EDC(HSD_GObj* gobj) HSD_AObjSetRate(post_digit_jobj->u.dobj->mobj->tobj->aobj, 0.0F); } - if ((state->damage_percent % 1000) / 100 == 0) { - HSD_JObjSetFlagsAll(state->jobjs[Hundreds], JOBJ_HIDDEN); - } else { - HSD_JObjClearFlagsAll(state->jobjs[Hundreds], JOBJ_HIDDEN); - } + ifStatus_UpdateDamageDisplay(state, jobj, &color, &stamina_color, + &normal_color); - /* Update colors when damage changes */ - if (state->old_damage != state->damage_percent) { - if (Player_GetMoreFlagsBit2((s8) state->player_slot)) { - GXColor stamina_color; + { + struct { + f32 value; + } digit_offset; - /* Stamina mode: 0-100% range */ - if ((clamped_damage = state->damage_percent) > 100) { - clamped_damage = 100; - } else if (clamped_damage < 0) { - clamped_damage = 0; - } - factor = 1.0F - ((f32) clamped_damage / 100.0F); - stamina_color.r = (s8) (factor * (f32) (ifStatus_804D57AC[0] - - ifStatus_804D57A8[0]) + - (f32) ifStatus_804D57A8[0]); - PAD_STACK(4); - stamina_color.g = (s8) (factor * (f32) (ifStatus_804D57AC[1] - - ifStatus_804D57A8[1]) + - (f32) ifStatus_804D57A8[1]); - stamina_color.b = (s8) (factor * (f32) (ifStatus_804D57AC[2] - - ifStatus_804D57A8[2]) + - (f32) ifStatus_804D57A8[2]); - stamina_color.a = 255; - color = stamina_color; - } else { - GXColor normal_color; + /* Calculate digit spacing offsets based on which digit is "1" */ + ones_offset = (state->damage_percent % 10 == 1) ? 0.5069F : 0.0F; + tens_offset = + ((state->damage_percent % 100) / 10 == 1) ? 0.5069F : 0.0F; - /* Normal mode: 0-300% range */ - clamped_damage = state->damage_percent; - if (clamped_damage > 300) { - clamped_damage = 300; - } else if (clamped_damage < 0) { - clamped_damage = 0; - } - factor = (f32) clamped_damage / 300.0F; - normal_color.r = (s8) (factor * (f32) (ifStatus_804D57AC[0] - - ifStatus_804D57A8[0]) + - (f32) ifStatus_804D57A8[0]); - PAD_STACK(0x28); - normal_color.g = (s8) (factor * (f32) (ifStatus_804D57AC[1] - - ifStatus_804D57A8[1]) + - (f32) ifStatus_804D57A8[1]); - normal_color.b = (s8) (factor * (f32) (ifStatus_804D57AC[2] - - ifStatus_804D57A8[2]) + - (f32) ifStatus_804D57A8[2]); - normal_color.a = 255; - color = normal_color; + /* Position percent sign */ + digit_jobj = state->jobjs[Percent]; + pos = state->translation_x[Percent] - ones_offset; + if (digit_jobj == NULL) { + __assert("jobj.h", 932, "jobj"); } - - ifStatus_ApplyDamageColor(state, &color); - } - - /* Update JObj positions when animating */ - ifStatus_StoreDamageTranslations(state, jobj); - - /* Calculate digit spacing offsets based on which digit is "1" */ - ones_offset = (state->damage_percent % 10 == 1) ? 0.5069F : 0.0F; - tens_offset = ((state->damage_percent % 100) / 10 == 1) ? 0.5069F : 0.0F; - - /* Position percent sign */ - digit_jobj = state->jobjs[Percent]; - pos = state->translation_x[Percent] - ones_offset; - if (digit_jobj == NULL) { - __assert("jobj.h", 932, "jobj"); - } - digit_jobj->translate.x = pos; - jobj_flagCheckSetMtxDirtySub(digit_jobj); - - /* Position tens digit */ - digit_offset = ones_offset + tens_offset; - digit_jobj = state->jobjs[Tens]; - pos = state->translation_x[Tens] + digit_offset; - (void) pos; - if (digit_jobj == NULL) { - __assert("jobj.h", 932, "jobj"); - } - digit_jobj->translate.x = pos; - jobj_flagCheckSetMtxDirtySub(digit_jobj); - - /* Position hundreds digit */ - hundreds_offset = - ((state->damage_percent % 1000) / 100 == 1) ? 0.5069F : 0.0F; - digit_offset += tens_offset + hundreds_offset; - digit_jobj = state->jobjs[Hundreds]; - pos = ifStatus_GetStoredTranslationX(state, Hundreds) + digit_offset; - if (digit_jobj == NULL) { - __assert("jobj.h", 932, "jobj"); + digit_jobj->translate.x = pos; + jobj_flagCheckSetMtxDirtySub(digit_jobj); + + /* Position tens digit */ + digit_offset.value = ones_offset; + digit_offset.value += tens_offset; + digit_jobj = state->jobjs[Tens]; + pos = state->translation_x[Tens] + digit_offset.value; + (void) pos; + if (digit_jobj == NULL) { + __assert("jobj.h", 932, "jobj"); + } + digit_jobj->translate.x = pos; + jobj_flagCheckSetMtxDirtySub(digit_jobj); + + /* Position hundreds digit */ + hundreds_offset = + ((state->damage_percent % 1000) / 100 == 1) ? 0.5069F : 0.0F; + digit_jobj = state->jobjs[Hundreds]; + digit_offset.value += tens_offset + hundreds_offset; + pos = ifStatus_GetStoredTranslationX(state, Hundreds) - + -digit_offset.value; + if (digit_jobj == NULL) { + __assert("jobj.h", 932, "jobj"); + } + digit_jobj->translate.x = pos; + jobj_flagCheckSetMtxDirtySub(digit_jobj); } - digit_jobj->translate.x = pos; - jobj_flagCheckSetMtxDirtySub(digit_jobj); /* Handle shake animation */ if (state->flags.force_digit_shake) { @@ -638,9 +669,9 @@ void ifStatus_802F5E50(HSD_GObj* gobj, s32 arg1) } } -static inline HSD_JObj* ifStatus_GetDamageJObj(HSD_JObj* arg0, s32 i) +static inline HSD_JObj* ifStatus_GetDamageJObj(HSD_JObj* jobj, s32 i) { - HSD_GObj* node = (HSD_GObj*) arg0; + HSD_GObj* node = (HSD_GObj*) jobj; return (HSD_JObj*) ifStatus_802F6194(node, i); } @@ -764,12 +795,12 @@ HSD_GObj* ifStatus_802F61FC(IfDamageState* state, s32 player_idx) HudIndex* hud = ifStatus_GetHUDInfo(); GXColor color; u8 idx = player_idx; - - PAD_STACK(16); + PAD_STACK(0x10); ifStatus_GetPlayerCharacter(player_idx, &chara); if (state->next == NULL) { HSD_GObj* gobj; + ifAll_GetArchive(); ifStatus_CreateMarkGObj(&gobj); if (gobj == NULL) { diff --git a/src/melee/if/ifstock.c b/src/melee/if/ifstock.c index 769d8b8aaf..1a04cdf32c 100644 --- a/src/melee/if/ifstock.c +++ b/src/melee/if/ifstock.c @@ -50,6 +50,8 @@ struct IfStockDataOffset { unsigned char x0[0x204]; }; +static char ifStock_SceneModels[] = "Stc_scemdls"; + int ifStock_802F7EFC(int arg0, int arg1) { Vec3 pos; @@ -215,8 +217,8 @@ void ifStock_802F8298(HSD_GObj* gobj) if (ifStock_802F8298_get_data(stock)[user_data->player] .x0[i + 5] == 0) { - HSD_JObjGetTranslation(jobj, &vecA); - HSD_JObjGetTranslation( + HSD_JObjGetTranslation2(jobj, &vecA); + HSD_JObjGetTranslation2( stock->player[user_data->player].x4[i + 1], &vecB); vecB.x += vecA.x; vecB.y += vecA.y; @@ -284,12 +286,18 @@ void ifStock_802F8298(HSD_GObj* gobj) stock->x204[user_data->player].x0[anim_offset], &vecC, 0.1f * data[i + 5]); } - HSD_JObjGetTranslation(stock->player[user_data->player].x4[0], - &vecD); + HSD_JObjGetTranslation2(stock->player[user_data->player].x4[0], + &vecD); vecC.x -= vecD.x; vecC.y -= vecD.y; vecC.z -= vecD.z; - HSD_JObjSetTranslate(jobj2, &vecC); + if (jobj2 == NULL) { + __assert("jobj.h", 916, "jobj"); + } + jobj2->translate = vecC; + if (!(jobj2->flags & JOBJ_MTX_INDEP_SRT)) { + HSD_JObjSetMtxDirty(jobj2); + } if (stock->x204[user_data->player].x0[i + 5] == 1) { vecC.x = ((struct IfStockStealAnim*) &stock @@ -627,16 +635,37 @@ static inline HSD_JObj* ifStock_802F98E8_get_x3C(unsigned char player) return ifStock_804A1378.player[player].x3C; } +static inline struct lbl_8046B6A0_FighterMatchInfoFlags* +ifStock_802F98E8_get_match_info(lbl_8046B6A0_t* data, int player) +{ + return &data->FighterMatchInfo[player].flags; +} + +static inline unsigned char* +ifStock_802F98E8_get_anim(unsigned char* user_data) +{ + return &user_data[5]; +} + +static const GXColor ifStock_802F98E8_color1 = { 0x08, 0x08, 0x08, 0x80 }; +static const GXColor ifStock_802F98E8_color2 = { 0x3C, 0x3C, 0x46, 0x80 }; + void ifStock_802F98E8(unsigned char player, int b) { struct ifStock_804A1378* stock = &ifStock_804A1378; - unsigned char* data; + HSD_GObj* gobj; HSD_JObj* jobj; unsigned char* user_data; + int* stocks; int i; - HSD_GObj* gobj; lbl_8046B6A0_t* ae44; + HSD_JObj* icon_jobj; + GXColor c2; + GXColor c1; if (stock->x0 != NULL) { +#ifdef MUST_MATCH + (void) &stock->player[player = player]; +#endif user_data = ((struct IfStockData*) stock)[player].x0; *(user_data += sizeof(struct IfStockDataOffset)) = player; stock->x204[player].x0[1] = b; @@ -649,12 +678,9 @@ void ifStock_802F98E8(unsigned char player, int b) if (gobj != NULL) { jobj = HSD_JObjLoadJoint((*stock->x0)->joint); if (jobj != NULL) { - DynamicModelDesc* model_desc; - HSD_GObjObject_80390A70(gobj, HSD_GObj_JObjKind, jobj); GObj_SetupGXLink(gobj, fn_802F94E0, 11, 0); - model_desc = *stock->x0; - gm_8016895C(jobj, model_desc, 0); + gm_8016895C(jobj, *stock->x0, 0); HSD_JObjReqAnimAll(jobj, 0.0f); HSD_GObj_SetupProc(gobj, fn_802F9410, 17); HSD_JObjSetTranslate(jobj, ifAll_GetPlayerHUDPosition(player)); @@ -664,44 +690,40 @@ void ifStock_802F98E8(unsigned char player, int b) stock->player[player].x0 = gobj; ifStock_804A1378.player[player].coins = Player_GetCoins(player); - ifStock_804A1378.player[player].stocks = + *(stocks = &ifStock_804A1378.player[player].stocks) = Player_GetStocks(player); - if (ifStock_804A1378.player[player].stocks < 0) { - ifStock_804A1378.player[player].stocks = 1; + if (*stocks < 0) { + *stocks = 1; } - data = user_data; switch ((unsigned char) b) { case 0: HSD_JObjSetFlagsAll(ifStock_804A1378.player[player].x24, JOBJ_HIDDEN); - { - struct ifStock_804A1378_per_player* players = - stock->player; - if (players[player].stocks <= 5) { - HSD_JObjSetFlagsAll( - ifStock_804A1378.player[player].x3C, - JOBJ_HIDDEN); - for (i = 0; i < 7; i++, data++) { - jobj = - ifStock_804A1378.player[player].x4[i + 1]; - if (i < ifStock_804A1378.player[player] - .stocks || - i >= 5) - { - data[5] = 0; - if (i >= 5) { - HSD_JObjSetFlagsAll(jobj, JOBJ_HIDDEN); - } - } else { - data[5] = 10; - HSD_JObjSetFlagsAll(jobj, JOBJ_HIDDEN); + if (*stocks <= 5) { + HSD_JObjSetFlagsAll( + ifStock_804A1378.player[player].x3C, JOBJ_HIDDEN); + for (i = 0; i < 7; i++, user_data++) { + icon_jobj = + ifStock_804A1378.player[player].x4[i + 1]; + if (i < ifStock_804A1378.player[player].stocks || + i >= 5) + { + user_data[5] = 0; + if (i >= 5) { + HSD_JObjSetFlagsAll(icon_jobj, + JOBJ_HIDDEN); } - HSD_JObjReqAnimAll(jobj, data[5]); - HSD_TObjReqAnimAll(jobj->u.dobj->mobj->tobj, - gm_80168BF8(player)); - HSD_AObjSetRate(jobj->u.dobj->mobj->tobj->aobj, - 0.0f); + } else { + user_data[5] = 10; + HSD_JObjSetFlagsAll(icon_jobj, JOBJ_HIDDEN); } + HSD_JObjReqAnimAll( + icon_jobj, + *ifStock_802F98E8_get_anim(user_data)); + HSD_TObjReqAnimAll(icon_jobj->u.dobj->mobj->tobj, + gm_80168BF8(player)); + HSD_AObjSetRate( + icon_jobj->u.dobj->mobj->tobj->aobj, 0.0f); } } break; @@ -710,24 +732,27 @@ void ifStock_802F98E8(unsigned char player, int b) JOBJ_HIDDEN); HSD_JObjSetFlagsAll(ifStock_802F98E8_get_x3C(player), JOBJ_HIDDEN); - for (i = 0; i < 7; i++, data++) { - jobj = ifStock_804A1378.player[player].x4[i + 1]; + for (i = 0; i < 7; i++, user_data++) { + HSD_JObj* icon_jobj = + ifStock_804A1378.player[player].x4[i + 1]; if (i == 0) { - data[5] = 0; + user_data[5] = 0; } else { - data[5] = 10; + user_data[5] = 10; } if (i < 5) { - HSD_JObjReqAnimAll(jobj, data[5]); - HSD_TObjReqAnimAll(jobj->u.dobj->mobj->tobj, + HSD_JObjReqAnimAll( + icon_jobj, + *ifStock_802F98E8_get_anim(user_data)); + HSD_TObjReqAnimAll(icon_jobj->u.dobj->mobj->tobj, gm_80168BF8(player)); - HSD_AObjSetRate(jobj->u.dobj->mobj->tobj->aobj, - 0.0f); + HSD_AObjSetRate( + icon_jobj->u.dobj->mobj->tobj->aobj, 0.0f); if (i != 0) { - HSD_JObjSetFlagsAll(jobj, JOBJ_HIDDEN); + HSD_JObjSetFlagsAll(icon_jobj, JOBJ_HIDDEN); } } else { - HSD_JObjSetFlagsAll(jobj, JOBJ_HIDDEN); + HSD_JObjSetFlagsAll(icon_jobj, JOBJ_HIDDEN); } } break; @@ -742,38 +767,47 @@ void ifStock_802F98E8(unsigned char player, int b) JOBJ_HIDDEN); HSD_JObjSetFlagsAll(ifStock_804A1378.player[player].x3C, JOBJ_HIDDEN); - for (i = 0; i < 7; i++, data++) { - jobj = ifStock_804A1378.player[player].x4[i + 1]; + for (i = 0; i < 7; i++, user_data++) { + HSD_JObj* icon_jobj = + ifStock_804A1378.player[player].x4[i + 1]; if (i == 0) { - data[5] = 0; + user_data[5] = 0; } else { - data[5] = 10; + user_data[5] = 10; } if (i < 5) { - HSD_JObjReqAnimAll(jobj, data[5]); - HSD_TObjReqAnimAll(jobj->u.dobj->mobj->tobj, + HSD_JObjReqAnimAll( + icon_jobj, + *ifStock_802F98E8_get_anim(user_data)); + HSD_TObjReqAnimAll(icon_jobj->u.dobj->mobj->tobj, gm_80168BF8(player)); - HSD_AObjSetRate(jobj->u.dobj->mobj->tobj->aobj, - 0.0f); + HSD_AObjSetRate( + icon_jobj->u.dobj->mobj->tobj->aobj, 0.0f); if (i != 0) { - HSD_JObjSetFlagsAll(jobj, JOBJ_HIDDEN); + HSD_JObjSetFlagsAll(icon_jobj, JOBJ_HIDDEN); } } else { - HSD_JObjSetFlagsAll(jobj, JOBJ_HIDDEN); + HSD_JObjSetFlagsAll(icon_jobj, JOBJ_HIDDEN); } } break; } HSD_JObjAnimAll(jobj); ae44 = gm_16AE_GetUnkData_1(); - if (ae44->FighterMatchInfo[player].x4_b1) { - GXColor c = { 0x08, 0x08, 0x08, 0x80 }; - GXColor* color = &c; - ifStock_802FB4EC(player, color); - } else if (ae44->FighterMatchInfo[player].x4_b0) { - GXColor c = { 0x3C, 0x3C, 0x46, 0x80 }; - GXColor* color = &c; - ifStock_802FB4EC(player, color); + { + struct lbl_8046B6A0_FighterMatchInfoFlags* match_info = + ifStock_802F98E8_get_match_info(ae44, player); + if (match_info->x4_b1) { + GXColor* color; + c1 = ifStock_802F98E8_color1; + color = &c1; + ifStock_802FB4EC(player, color); + } else if (match_info->x4_b0) { + GXColor* color; + c2 = ifStock_802F98E8_color2; + color = &c2; + ifStock_802FB4EC(player, color); + } } fn_802F9410(gobj); // inlined } else { @@ -880,6 +914,9 @@ void ifStock_802FA5BC(int arg) lb_80011E24(jobj, &ifStock_804A1378.jobj, 0, 1, 2, 3, 4, 5, -1); } +#ifdef MUST_MATCH +#pragma dont_inline on +#endif void fn_802FA6C4(HSD_GObj* arg) { int i; @@ -922,6 +959,9 @@ void fn_802FA6C4(HSD_GObj* arg) ifStock_804A1774.x0 = 0; } } +#ifdef MUST_MATCH +#pragma dont_inline off +#endif void fn_802FA8C0(HSD_GObj* arg) { @@ -968,55 +1008,6 @@ void fn_802FA8C0(HSD_GObj* arg) } } -static inline void ifStock_802FAEC4_call_802FA5BC(int arg) -{ - ifStock_802FA5BC(arg); -} - -static inline void ifStock_802FAEC4_clear_acc(int count) -{ - int i; - - for (i = 0; i < count; i++) { - ifStock_804A1ACC.x10C[i] = NULL; - } -} - -static inline void ifStock_802FAEC4_clear_1774(int count) -{ - int i; - - for (i = 0; i < count; i++) { - ifStock_804A1774.x10C[i + 1] = NULL; - } -} - -static inline void ifStock_802FAEC4_init_1A8C(HSD_GObj** p) -{ - struct ifStock_804A1378* stock = &ifStock_804A1378; - HSD_GObj* gobj; - HSD_JObj* jobj; - int i; - - for (i = 0; i < 16; i++, p++) { - *p = NULL; - if (gm_8016B1A8()) { - *p = ifStock_802FA118(i); - } - } - if (gm_IsMultimanSmashMode()) { - gobj = GObj_Create(14, 15, 0); - jobj = HSD_JObjLoadJoint(stock->x4->joint); - HSD_GObjObject_80390A70(gobj, HSD_GObj_JObjKind, jobj); - GObj_SetupGXLink(gobj, fn_802F9598, 11, 0); - gm_8016895C(jobj, stock->x4, 0); - HSD_JObjReqAnimAll(jobj, 10.0f); - HSD_JObjAnimAll(jobj); - stock->gobj = gobj; - lb_80011E24(jobj, &stock->jobj, 0, 1, 2, 3, 4, 5, -1); - } -} - void fn_802FAC34(HSD_GObj* arg) { int i; @@ -1066,47 +1057,77 @@ void fn_802FAC34(HSD_GObj* arg) } } +static inline void ifStock_802FA5BC_noinline(int arg) +{ + ifStock_802FA5BC(arg); +} + +static inline void ifStock_ClearGObjSlots(HSD_GObj** slots, int count) +{ + int i; + + for (i = 0; i < count; i++) { + slots[i] = NULL; + } +} + +static inline void ifStock_CreateStockGObjs(HSD_GObj** slots) +{ + struct ifStock_804A1378* stock = &ifStock_804A1378; + HSD_GObj* gobj; + HSD_JObj* jobj; + int i; + + for (i = 0; i < 16; i++, slots++) { + *slots = NULL; + if (gm_8016B1A8()) { + *slots = ifStock_802FA118(i); + } + } + if (gm_IsMultimanSmashMode()) { + gobj = GObj_Create(14, 15, 0); + jobj = HSD_JObjLoadJoint(stock->x4->joint); + HSD_GObjObject_80390A70(gobj, HSD_GObj_JObjKind, jobj); + GObj_SetupGXLink(gobj, fn_802F9598, 11, 0); + gm_8016895C(jobj, stock->x4, 0); + HSD_JObjReqAnimAll(jobj, 10.0f); + HSD_JObjAnimAll(jobj); + stock->gobj = gobj; + lb_80011E24(jobj, &stock->jobj, 0, 1, 2, 3, 4, 5, -1); + } +} + void ifStock_802FAEC4(void) { struct ifStock_804A1378* stock = &ifStock_804A1378; - union { - void* raw; - DynamicModelDesc** typed; - } scene_models; + DynamicModelDesc** scene_models; + HSD_GObj* gobj; memzero(stock, sizeof(*stock) - sizeof(stock->x204)); memzero(&ifStock_804A1ACC, sizeof(ifStock_804A1ACC)); memzero(&ifStock_804A1A8C, sizeof(ifStock_804A1A8C)); memzero(&ifStock_804A1774, sizeof(ifStock_804A1774)); - lbArchive_LoadSections(*ifAll_GetArchive(), &scene_models.raw, - "Stc_scemdls", 0); - { - HSD_GObj** proc = (HSD_GObj**) &ifStock_804A1ACC.x108; - HSD_GObj* gobj; - - stock->x0 = scene_models.typed; - stock->x4 = scene_models.typed[1]; - *proc = NULL; - ifStock_804A1ACC.x0 = 0; - gobj = GObj_Create(14, 15, 0); - HSD_GObj_SetupProc(gobj, fn_802FAC34, 17); - *proc = gobj; - ifStock_802FAEC4_clear_acc(130); - } + lbArchive_LoadSections(*ifAll_GetArchive(), (void**) &scene_models, + ifStock_SceneModels, 0); + stock->x0 = scene_models; + stock->x4 = scene_models[1]; + ifStock_804A1ACC.x108 = NULL; + ifStock_804A1ACC.x0 = 0; + gobj = GObj_Create(14, 15, 0); + HSD_GObj_SetupProc(gobj, fn_802FAC34, 17); + ifStock_804A1ACC.x108 = gobj; + ifStock_ClearGObjSlots(&ifStock_804A1ACC.x10C[0], 130); if (gm_80169394() == 0) { - HSD_GObj** proc = &ifStock_804A1774.x10C[0]; - HSD_GObj* gobj; - - *proc = NULL; + ifStock_804A1774.x10C[0] = NULL; ifStock_804A1774.x0 = 0; gobj = GObj_Create(14, 15, 0); HSD_GObj_SetupProc(gobj, fn_802FA6C4, 17); - *proc = gobj; - ifStock_802FAEC4_clear_1774(130); + ifStock_804A1774.x10C[0] = gobj; + ifStock_ClearGObjSlots(&ifStock_804A1774.x10C[1], 130); } else if (gm_8016A1F8()) { ifStock_804A1774.x108 = -1; - ifStock_802FAEC4_call_802FA5BC(1); + ifStock_802FA5BC_noinline(1); } - ifStock_802FAEC4_init_1A8C(ifStock_804A1A8C); + ifStock_CreateStockGObjs(ifStock_804A1A8C); } void ifStock_802FB390(void) diff --git a/src/melee/if/ifstock.static.h b/src/melee/if/ifstock.static.h index c26a33d8dd..5497955ada 100644 --- a/src/melee/if/ifstock.static.h +++ b/src/melee/if/ifstock.static.h @@ -55,7 +55,7 @@ struct ifStock_804A1ACC { char x0; signed char x1[130]; signed char x83[133]; - int x108; + HSD_GObj* x108; HSD_GObj* x10C[130]; }; diff --git a/src/melee/lb/lbcollision.c b/src/melee/lb/lbcollision.c index 9d4d6750b2..2457603807 100644 --- a/src/melee/lb/lbcollision.c +++ b/src/melee/lb/lbcollision.c @@ -1152,14 +1152,15 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, float broadphase_scale) { float hit_end_min_z; - float start_delta_y; - float start_delta_x; + float closest_delta_y; float hit_start_mid_x; + float local_delta_x; float hurt_mid_z; Vec3 hit_start_copy; Vec3 hurt_start_copy; Vec3 hit_delta; u8 operand_pad[4]; + u8 frame_pad[32]; float start_delta_z; float hit_start_dot; float scaled_hurt_radius; @@ -1173,17 +1174,16 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, float allowed_distance; float hurt_closest_x; float hurt_closest_y; - float hit_end_y; + float hurt_end_x; float hit_start_mid_y; float hit_param_candidate; - float closest_delta_y; + float closest_delta_x; float closest_dist_sq; float local_delta_y; - float closest_delta_x; + float start_delta_x; float hurt_param_from_hit_start; - Mtx inv_hurt_mtx; - float candidate_hit_param; - float hit_start_max_x; + float hurt_delta_z; + float x_work; float hit_end_min_x; float hit_start_min_x; float hit_end_max_x; @@ -1193,28 +1193,26 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, float contact_lerp; float broadphase_radius; float hit_end_mid_z; - float hit_start_max_y; + float y_work; float hit_end_min_y; float hit_start_min_y; float hit_end_max_y; float hurt_len_sq; float hit_end_max_z; - float candidate_hurt_param; - float hurt_delta_z; float hit_end_x; float hit_len_sq; float hit_end_mid_x; - float segment_dot; + float hit_start_y; float hit_start_max_z; float hit_start_min_z; float hurt_closest_z; - float hit_end_z; - float hurt_end_x; + float hit_start_z; + float segment_dot; float hurt_end_y; float hit_param; float local_dist; float hurt_param; - float local_delta_x; + float start_delta_y; float hurt_param_from_hit_end; float closest_dist; float hurt_end_z; @@ -1224,13 +1222,16 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, f64 closest_rsqrt_estimate; f64 closest_rsqrt_step1; f64 closest_rsqrt_step2; + float candidate_hurt_param; + float candidate_hit_param; + Mtx inv_hurt_mtx; s32 is_hurt_segment_degenerate; s32 is_hit_segment_degenerate; s32 is_parallel; s32 is_zero_distance; - float hurt_delta_x; - float hurt_delta_y; - PAD_STACK(40); + float hurt_start_y; + float hurt_start_z; + PAD_STACK(4); // Fast reject when the expanded hit segment AABB misses both hurt // endpoints. @@ -1239,10 +1240,8 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, hurt_start_copy = *hurt_start; hit_end_x = hit_end->x; if (hit_start_copy.x > hit_end_x) { - hit_start_max_x = hit_start_copy.x + broadphase_radius; - if ((hit_start_max_x < hurt_start_copy.x) && - (hit_start_max_x < hurt_end->x)) - { + x_work = hit_start_copy.x + broadphase_radius; + if ((x_work < hurt_start_copy.x) && (x_work < hurt_end->x)) { return 0; } hit_end_min_x = hit_end_x - broadphase_radius; @@ -1264,14 +1263,13 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, return 0; } block_13: - if (hit_start_copy.y > (hit_end_y = hit_end->y)) { - hit_start_max_y = hit_start_copy.y + broadphase_radius; - if ((hit_start_max_y < hurt_start_copy.y) && - (hit_start_max_y < hurt_end->y)) - { + hit_start_y = hit_start_copy.y; + if (hit_start_y > hit_end->y) { + y_work = hit_start_y + broadphase_radius; + if ((y_work < hurt_start_copy.y) && (y_work < hurt_end->y)) { return 0; } - hit_end_min_y = hit_end_y - broadphase_radius; + hit_end_min_y = hit_end->y - broadphase_radius; if ((hit_end_min_y > hurt_start_copy.y) && (hit_end_min_y > hurt_end->y)) { @@ -1279,25 +1277,26 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, } goto block_26; } - hit_start_min_y = hit_start_copy.y - broadphase_radius; + hit_start_min_y = hit_start_y - broadphase_radius; if ((hit_start_min_y > hurt_start_copy.y) && (hit_start_min_y > hurt_end->y)) { return 0; } - hit_end_max_y = hit_end_y + broadphase_radius; + hit_end_max_y = hit_end->y + broadphase_radius; if ((hit_end_max_y < hurt_start_copy.y) && (hit_end_max_y < hurt_end->y)) { return 0; } block_26: - if (hit_start_copy.z > (hit_end_z = hit_end->z)) { - hit_start_max_z = hit_start_copy.z + broadphase_radius; + hit_start_z = hit_start_copy.z; + if (hit_start_z > hit_end->z) { + hit_start_max_z = hit_start_z + broadphase_radius; if ((hit_start_max_z < hurt_start_copy.z) && (hit_start_max_z < hurt_end->z)) { return 0; } - hit_end_min_z = hit_end_z - broadphase_radius; + hit_end_min_z = hit_end->z - broadphase_radius; if ((hit_end_min_z > hurt_start_copy.z) && (hit_end_min_z > hurt_end->z)) { @@ -1305,13 +1304,13 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, } goto block_39; } - hit_start_min_z = hit_start_copy.z - broadphase_radius; + hit_start_min_z = hit_start_z - broadphase_radius; if ((hit_start_min_z > hurt_start_copy.z) && (hit_start_min_z > hurt_end->z)) { return 0; } - hit_end_max_z = hit_end_z; + hit_end_max_z = hit_end->z; hit_end_max_z += broadphase_radius; if ((hit_end_max_z < hurt_start_copy.z) && (hit_end_max_z < hurt_end->z)) { return 0; @@ -1323,41 +1322,37 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, hit_delta.z = hit_end->z - hit_start_copy.z; hurt_end_y = hurt_end->y; (void) hurt_end_y; - start_delta_y = hit_start_copy.y - hurt_start_copy.y; - hurt_delta_y = hurt_end_y - hurt_start_copy.y; + start_delta_y = hurt_start_y = hurt_start_copy.y; + y_work = hurt_end_y - hurt_start_y; + start_delta_y = hit_start_copy.y - hurt_start_y; hurt_end_x = hurt_end->x; (void) hurt_end_x; - hurt_delta_x = hurt_end_x - hurt_start_copy.x; - segment_dot = hit_delta.y * hurt_delta_y; - hurt_len_sq = hurt_delta_y * hurt_delta_y; + x_work = hurt_end_x - (start_delta_x = hurt_start_copy.x); + segment_dot = hit_delta.y * y_work; + hurt_len_sq = y_work * y_work; hit_start_mid_x = hit_delta.x * hit_delta.x; hit_start_mid_y = hit_delta.y * hit_delta.y; hurt_end_z = hurt_end->z; (void) hurt_end_z; - start_delta_x = hit_start_copy.x - hurt_start_copy.x; - hurt_delta_z = hurt_end_z - hurt_start_copy.z; - segment_dot = (hit_delta.x * hurt_delta_x) + segment_dot; - /* Cache 1.0 constant in a callee-save to avoid reloading it across the - * several `hit_param = 1.0` / `hurt_param = 1.0` branches below. The - * variable name is a borrow from the unused-after-broadphase-rejection - * slot. */ + start_delta_x = hit_start_copy.x - start_delta_x; + hurt_delta_z = hurt_end_z - (hurt_start_z = hurt_start_copy.z); + segment_dot = (hit_delta.x * x_work) + segment_dot; hit_start_min_z = 1.0F; - hurt_len_sq = (hurt_delta_x * hurt_delta_x) + hurt_len_sq; + hurt_len_sq = (x_work * x_work) + hurt_len_sq; segment_dot = (hit_delta.z * hurt_delta_z) + segment_dot; hurt_len_sq = (hurt_delta_z * hurt_delta_z) + hurt_len_sq; { float hit_delta_z_sq = hit_delta.z * hit_delta.z; hit_start_mid_z = hit_delta_z_sq; } - start_delta_z = hit_start_copy.z - hurt_start_copy.z; + start_delta_z = hit_start_copy.z - hurt_start_z; hit_len_sq = hit_start_mid_z + (hit_start_mid_y + hit_start_mid_x); hit_start_dot = hit_delta.y * start_delta_y; { float hit_start_dot_x = hit_delta.x * start_delta_x; hit_start_dot = hit_start_dot_x + hit_start_dot; } - hurt_start_dot = - (hurt_delta_x * start_delta_x) + (hurt_delta_y * start_delta_y); + hurt_start_dot = (x_work * start_delta_x) + (y_work * start_delta_y); hurt_start_dot = (hurt_delta_z * start_delta_z) + hurt_start_dot; hit_start_dot = (hit_delta.z * start_delta_z) + hit_start_dot; closest_denom = (hurt_len_sq * hit_len_sq) - (segment_dot * segment_dot); @@ -1394,13 +1389,12 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, if (is_parallel != 0) { // For parallel axes, project the hit endpoint nearer the hurt // midpoint. - hurt_mid_y = - (float) ((0.5 * (f64) hurt_delta_y) + (f64) hurt_start_copy.y); + hurt_mid_y = (float) ((0.5 * (f64) y_work) + (f64) hurt_start_y); hurt_mid_x = - (float) ((0.5 * (f64) hurt_delta_x) + (f64) hurt_start_copy.x); + (float) ((0.5 * (f64) x_work) + (f64) hurt_start_copy.x); hit_start_mid_y = hit_start_copy.y - hurt_mid_y; hurt_mid_z = - (float) ((0.5 * (f64) hurt_delta_z) + (f64) hurt_start_copy.z); + (float) ((0.5 * (f64) hurt_delta_z) + (f64) hurt_start_z); hit_end_mid_y = hit_end->y - hurt_mid_y; hit_start_mid_x = hit_start_copy.x - hurt_mid_x; hit_end_mid_x = hit_end->x - hurt_mid_x; @@ -1416,6 +1410,7 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, Vec3 a2; Vec3 d1; Vec3 c3; + PAD_STACK(4); c3 = *hurt_start; hit_param = 0.0F; d1.x = hurt_end_x - hurt_start->x; @@ -1512,15 +1507,15 @@ bool lbColl_80006E58(Vec3* hit_start, Vec3* hit_end, Vec3* hurt_start, hit_closest->x = (hit_delta.x * hit_param) + hit_start_copy.x; hit_closest->y = (hit_delta.y * hit_param) + hit_start_copy.y; hit_closest->z = (hit_delta.z * hit_param) + hit_start_copy.z; - hurt_closest->x = (hurt_delta_x * hurt_param) + hurt_start_copy.x; - hurt_closest->y = (hurt_delta_y * hurt_param) + hurt_start_copy.y; - hurt_closest->z = (hurt_delta_z * hurt_param) + hurt_start_copy.z; - closest_delta_y = hit_closest->y - hurt_closest->y; + hurt_closest->x = (x_work * hurt_param) + hurt_start_copy.x; + hurt_closest->y = (y_work * hurt_param) + hurt_start_y; + hurt_closest->z = (hurt_delta_z * hurt_param) + hurt_start_z; closest_delta_x = hit_closest->x - hurt_closest->x; + closest_delta_y = hit_closest->y - hurt_closest->y; closest_delta_z = hit_closest->z - hurt_closest->z; closest_dist_sq = (closest_delta_z * closest_delta_z) + - ((closest_delta_y * closest_delta_y) + - (closest_delta_x * closest_delta_x)); + ((closest_delta_x * closest_delta_x) + + (closest_delta_y * closest_delta_y)); if (closest_dist_sq > 0.0F) { volatile float sp38; diff --git a/src/sysdolphin/baselib/generator.c b/src/sysdolphin/baselib/generator.c index cefa7add3a..fac8f23ed9 100644 --- a/src/sysdolphin/baselib/generator.c +++ b/src/sysdolphin/baselib/generator.c @@ -11,18 +11,11 @@ #include #include -/* 4D78F0 */ HSD_CObj* psCamera; /* 4D0E5C */ -/* 4D78DA */ static u16 hsd_804D78DA; -/* 4D78E0 */ static u16 hsd_804D78E0; -/* 4D78E8 */ static u32 hsd_804D78E8; -/* 4D78EC */ static u32 hsd_804D78EC; -/* 4D78F0 */ static u32 hsd_804D78F0; -/* 4D78F4 */ static u32 hsd_804D78F4; /* 4D78F8 */ static u32 hsd_804D78F8; -/* 4D78FC */ HSD_Generator* hsd_804D78FC; -/* 4D7900 */ void (*hsd_804D7900)(HSD_Generator*); +/* 4D78FC */ HSD_Generator* hsd_804D78FC = NULL; +/* 4D7900 */ void (*hsd_804D7900)(HSD_Generator*) = NULL; /* 4D0F90 */ struct hsd_804D0F60_t hsd_804D0F90; @@ -357,15 +350,18 @@ HSD_Generator* hsd_8039D9C8(void) return gen; } -// @TODO: Currently 97.23% match - register allocation, shape/velocity -// switch case logic, Newton-Raphson sqrt inlining, trig matrix layout +static inline f32 hsd_8039DAD4_home(f32 value) +{ + return value; +} + f32 hsd_8039DAD4(HSD_Generator* gen) { Vec3 vel_copy; - f32 vel_mag_sq; + f32 tmp; Vec3 emit_pos; Vec3 tmpvec; - Vec3 vel_out; + Vec3 vec; Mtx rot_mtx; Mtx jobj_mtx; Vec3 look_dir; @@ -374,8 +370,7 @@ f32 hsd_8039DAD4(HSD_Generator* gen) Vec3 vel_norm; Mtx trig_mtx; f64 eps; - f32 abs_projected; - f32 tmp; + f32 vel_mag_sq; f32 angle1; f32 sin_az; f32 cos_az; @@ -386,14 +381,11 @@ f32 hsd_8039DAD4(HSD_Generator* gen) f32 elevation; f32 radius; f32 angle3; - angle3 = angle1 = 0.0F; if (gen->count < 1.0F) { return gen->count; } - vel_mag_sq = angle3; - /* Copy velocity */ vel_copy.x = gen->vel.x; vel_copy.y = gen->vel.y; @@ -414,29 +406,29 @@ f32 hsd_8039DAD4(HSD_Generator* gen) PSMTXCopy(gen->jobj->mtx, jobj_mtx); /* Extract and normalize each column of the 3x3 rotation */ - vel_out.x = jobj_mtx[0][0]; - vel_out.y = jobj_mtx[1][0]; - vel_out.z = jobj_mtx[2][0]; - PSVECNormalize(&vel_out, &vel_out); - rot_mtx[0][0] = vel_out.x; - rot_mtx[1][0] = vel_out.y; - rot_mtx[2][0] = vel_out.z; - - vel_out.x = jobj_mtx[0][1]; - vel_out.y = jobj_mtx[1][1]; - vel_out.z = jobj_mtx[2][1]; - PSVECNormalize(&vel_out, &vel_out); - rot_mtx[0][1] = vel_out.x; - rot_mtx[1][1] = vel_out.y; - rot_mtx[2][1] = vel_out.z; - - vel_out.x = jobj_mtx[0][2]; - vel_out.y = jobj_mtx[1][2]; - vel_out.z = jobj_mtx[2][2]; - PSVECNormalize(&vel_out, &vel_out); - rot_mtx[0][2] = vel_out.x; - rot_mtx[1][2] = vel_out.y; - rot_mtx[2][2] = vel_out.z; + vec.x = jobj_mtx[0][0]; + vec.y = jobj_mtx[1][0]; + vec.z = jobj_mtx[2][0]; + PSVECNormalize(&vec, &vec); + rot_mtx[0][0] = vec.x; + rot_mtx[1][0] = vec.y; + rot_mtx[2][0] = vec.z; + + vec.x = jobj_mtx[0][1]; + vec.y = jobj_mtx[1][1]; + vec.z = jobj_mtx[2][1]; + PSVECNormalize(&vec, &vec); + rot_mtx[0][1] = vec.x; + rot_mtx[1][1] = vec.y; + rot_mtx[2][1] = vec.z; + + vec.x = jobj_mtx[0][2]; + vec.y = jobj_mtx[1][2]; + vec.z = jobj_mtx[2][2]; + PSVECNormalize(&vec, &vec); + rot_mtx[0][2] = vec.x; + rot_mtx[1][2] = vec.y; + rot_mtx[2][2] = vec.z; rot_mtx[2][3] = 0.0F; rot_mtx[1][3] = 0.0F; @@ -473,9 +465,7 @@ f32 hsd_8039DAD4(HSD_Generator* gen) vel_norm.z = gen->vel.z; PSVECNormalize(&vel_norm, &vel_norm); - tmp = vel_norm.z; - *(s32*) &tmp &= 0x7FFFFFFF; - if (tmp < 1.1754944e-38F) { + if (fabsf_bitwise(vel_norm.z) < 1.1754944e-38F) { if (vel_norm.y >= 0.0F) { sin_az = 1.5707964F; } else { @@ -489,9 +479,7 @@ f32 hsd_8039DAD4(HSD_Generator* gen) { f32 projected_z = vel_norm.y * cos_az + vel_norm.z * sin_az; - abs_projected = projected_z; - *(s32*) &abs_projected &= 0x7FFFFFFF; - if (abs_projected < 1.1754944e-38F) { + if (fabsf_bitwise(projected_z) < 1.1754944e-38F) { if (vel_norm.x >= 0.0F) { elevation = 1.5707964F; } else { @@ -505,7 +493,6 @@ f32 hsd_8039DAD4(HSD_Generator* gen) { f32 cos_el = cosf(elevation); f32 neg_cos_az = -cos_az; - f32 neg_sin_az_s = -sin_az; trig_mtx[0][0] = cos_el; trig_mtx[0][1] = 0.0F; @@ -515,19 +502,18 @@ f32 hsd_8039DAD4(HSD_Generator* gen) trig_mtx[1][1] = sin_az; trig_mtx[1][2] = cos_az * cos_el; trig_mtx[1][3] = 0.0F; - trig_mtx[2][0] = neg_sin_az_s * sin_el; + trig_mtx[2][0] = -sin_az * sin_el; trig_mtx[2][1] = neg_cos_az; trig_mtx[2][2] = sin_az * cos_el; trig_mtx[2][3] = 0.0F; } PSMTXConcat(rot_mtx, trig_mtx, rot_mtx); } + elevation = vel_mag_sq; /* Type 2: extract Euler angles from rotation matrix */ if ((gen->type & 0xF) == 2) { - tmp = rot_mtx[2][2]; - *(s32*) &tmp &= 0x7FFFFFFF; - if (tmp < 1.1754944e-38F) { + if (fabsf_bitwise(rot_mtx[2][2]) < 1.1754944e-38F) { if (rot_mtx[1][2] >= 0.0F) { angle1 = 1.5707964F; } else { @@ -538,11 +524,8 @@ f32 hsd_8039DAD4(HSD_Generator* gen) } { f32 first = rot_mtx[2][2] * cosf(angle1); - f32 comb_value = first + rot_mtx[1][2] * sinf(angle1); - f32 comb = comb_value; - tmp = comb; - *(s32*) &tmp &= 0x7FFFFFFF; - if (tmp < 1.1754944e-38F) { + f32 comb = first + rot_mtx[1][2] * sinf(angle1); + if (fabsf_bitwise(comb) < 1.1754944e-38F) { if (rot_mtx[0][2] >= 0.0F) { angle3 = 1.5707964F; } else { @@ -562,8 +545,8 @@ f32 hsd_8039DAD4(HSD_Generator* gen) case 4: { f32 min_a = gen->aux.disc.minAngle; f32 rnd = HSD_Randf(); - f32 range = gen->aux.disc.maxAngle - min_a; - angle_step = range / (f32) (s32) gen->count; + angle_step = + (gen->aux.disc.maxAngle - min_a) / (f32) (s32) gen->count; cur_angle = angle_step * rnd + min_a; break; } @@ -571,14 +554,15 @@ f32 hsd_8039DAD4(HSD_Generator* gen) case 7: { f32 min_a = gen->aux.cone.minAngle; f32 rnd = HSD_Randf(); - f32 range = gen->aux.cone.maxAngle - min_a; - angle_step = range / (f32) (s32) gen->count; + angle_step = + (gen->aux.cone.maxAngle - min_a) / (f32) (s32) gen->count; cur_angle = angle_step * rnd + min_a; break; } default: { f32 rnd = HSD_Randf(); - cur_angle = (f32) (2.0 * (M_PI * (f64) rnd)); + cur_angle = + (f32) ((eps = M_PI * (f64) hsd_8039DAD4_home(rnd)) * 2.0); angle_step = (f32) ((2.0 * M_PI) / (f64) (s32) gen->count); break; } @@ -610,20 +594,19 @@ f32 hsd_8039DAD4(HSD_Generator* gen) switch (gen->type & 0xF) { case 6: if (gen->angle < 0.0F) { - cur_angle += angle_step; - tmp = sin_az; - *(s32*) &tmp &= 0x7FFFFFFF; - if (tmp < 1.1754944e-38F) { + tmp = cur_angle + angle_step; + cur_angle = tmp; + if (fabsf_bitwise(sin_az) < 1.1754944e-38F) { if (gen->aux.cone.height >= 0.0F) { cone_angle = -gen->angle; } else { cone_angle = (f32) (M_PI - gen->angle); } } else { - f64 cone_angle_d = - M_PI_2 - atan2f(gen->aux.cone.height, sin_az) - - gen->angle; - cone_angle = (f32) cone_angle_d; + cone_angle = + (f32) (M_PI_2 - + atan2f(gen->aux.cone.height, sin_az) - + gen->angle); } } else { { @@ -632,30 +615,29 @@ f32 hsd_8039DAD4(HSD_Generator* gen) } { f32 rnd = HSD_Randf(); - f32 range = gen->aux.cone.maxAngle - cur_angle; + cone_angle = gen->aux.cone.maxAngle - cur_angle; + cur_angle = cone_angle * rnd + cur_angle; cone_angle = radius * gen->angle; - cur_angle = range * rnd + cur_angle; } - tmp = sin_az; - *(s32*) &tmp &= 0x7FFFFFFF; - if (tmp < 1.1754944e-38F) { + if (fabsf_bitwise(sin_az) < 1.1754944e-38F) { if (gen->aux.cone.height >= 0.0F) { cone_angle = gen->angle; } else { cone_angle = (f32) (M_PI + gen->angle); } } else { - f64 cone_angle_d = - gen->angle + - (M_PI_2 - atan2f(gen->aux.cone.height, sin_az)); - cone_angle = (f32) cone_angle_d; + cone_angle = + (f32) (gen->angle + + (M_PI_2 - + atan2f(gen->aux.cone.height, sin_az))); } } break; case 7: if (gen->angle < 0.0F) { cone_angle = (f32) (M_PI_2 - gen->angle); - cur_angle += angle_step; + tmp = cur_angle + angle_step; + cur_angle = tmp; } else { { f32 min_angle = gen->aux.disc.minAngle; @@ -663,8 +645,8 @@ f32 hsd_8039DAD4(HSD_Generator* gen) } { f32 rnd = HSD_Randf(); - f32 range = gen->aux.disc.maxAngle - cur_angle; - cur_angle = range * rnd + cur_angle; + cone_angle = gen->aux.disc.maxAngle - cur_angle; + cur_angle = cone_angle * rnd + cur_angle; cone_angle = (f32) (M_PI_2 + gen->angle); } } @@ -678,17 +660,18 @@ f32 hsd_8039DAD4(HSD_Generator* gen) cur_angle = gen->aux.disc.minAngle; { f32 rnd = HSD_Randf(); - f32 range = gen->aux.disc.maxAngle - cur_angle; cone_angle = radius * gen->angle; - cur_angle = range * rnd + cur_angle; + sin_el = gen->aux.disc.maxAngle - cur_angle; + cur_angle = sin_el * rnd + cur_angle; } } break; } /* Compute emission position and velocity from angle */ - emit_pos.x = sin_az * cosf(cur_angle); - emit_pos.y = sin_az * sinf(cur_angle); + cos_az = cur_angle; + emit_pos.x = sin_az * cosf(cos_az); + emit_pos.y = sin_az * sinf(cos_az); /* Shape 6,7: z from random, scale by height */ if ((gen->type & 0xF) == 6 || (gen->type & 0xF) == 7) { @@ -704,17 +687,17 @@ f32 hsd_8039DAD4(HSD_Generator* gen) /* Compute velocity direction from cone angle */ { - f32 sin_ca = vel_mag_sq * sinf(cone_angle); - vel_out.x = sin_ca * cosf(cur_angle); - vel_out.y = sin_ca * sinf(cur_angle); - vel_out.z = vel_mag_sq * cosf(cone_angle); + f32 sin_ca = elevation * sinf(cone_angle); + vec.x = sin_ca * cosf(cos_az); + vec.y = sin_ca * sinf(cos_az); + vec.z = elevation * cosf(cone_angle); } /* Shape 3: scale velocity by radius factor */ if ((gen->type & 0xF) == 3) { - vel_out.x *= radius; - vel_out.y *= radius; - vel_out.z *= radius; + vec.x *= radius; + vec.y *= radius; + vec.z *= radius; } /* Apply rotation matrix to emission position */ @@ -724,14 +707,14 @@ f32 hsd_8039DAD4(HSD_Generator* gen) emit_pos.z += gen->pos.z; /* Apply rotation matrix to velocity */ - PSMTXMultVec(rot_mtx, &vel_out, &vel_out); + PSMTXMultVec(rot_mtx, &vec, &vec); /* Spawn particle */ + cur_angle = cos_az; hsd_80398F0C(gen->linkNo, gen->bank, gen->kind, gen->texGroup, (s32) gen->cmdList, gen->life, 0, (s32) gen, - emit_pos.x, emit_pos.y, emit_pos.z, vel_out.x, - vel_out.y, vel_out.z, gen->size, gen->grav, - gen->fric); + emit_pos.x, emit_pos.y, emit_pos.z, vec.x, vec.y, + vec.z, gen->size, gen->grav, gen->fric); break; } @@ -747,13 +730,12 @@ f32 hsd_8039DAD4(HSD_Generator* gen) emit_pos.y += gen->pos.y; emit_pos.z += gen->pos.z; - PSMTXMultVec(rot_mtx, &vel_copy, &vel_out); + PSMTXMultVec(rot_mtx, &vel_copy, &vec); hsd_80398F0C(gen->linkNo, gen->bank, gen->kind, gen->texGroup, (s32) gen->cmdList, gen->life, 0, (s32) gen, - emit_pos.x, emit_pos.y, emit_pos.z, vel_out.x, - vel_out.y, vel_out.z, gen->size, gen->grav, - gen->fric); + emit_pos.x, emit_pos.y, emit_pos.z, vec.x, vec.y, + vec.z, gen->size, gen->grav, gen->fric); break; } @@ -768,9 +750,10 @@ f32 hsd_8039DAD4(HSD_Generator* gen) cur_angle += angle_step; } else { f32 rnd = HSD_Randf(); - cur_angle = (f32) (2.0 * (M_PI * (f64) rnd)); + cur_angle = + (f32) (2.0 * (M_PI * (f64) hsd_8039DAD4_home(rnd))); } - gen->aux.line.x2 = vel_mag_sq; + gen->aux.line.x2 = elevation; hsd_80398F0C(gen->linkNo, gen->bank, gen->kind | 4, gen->texGroup, (s32) gen->cmdList, gen->life, 0, (s32) gen, 0.0F, 0.0F, 0.0F, cur_angle, sin_az, 0.0F, gen->size, @@ -797,8 +780,7 @@ f32 hsd_8039DAD4(HSD_Generator* gen) { f32 rnd = HSD_Randf(); f32 a2 = gen->aux.rect.x; - f32 b2 = gen->aux.rect.y; - if (rnd > a2 / (a2 + b2)) { + if (rnd > a2 / (a2 + gen->aux.rect.y)) { emit_pos.y = emit_pos.y > 0.5F ? 1.0F : 0.0F; } else { emit_pos.x = emit_pos.x > 0.5F ? 1.0F : 0.0F; @@ -812,8 +794,7 @@ f32 hsd_8039DAD4(HSD_Generator* gen) { f32 rnd = HSD_Randf(); f32 a2 = gen->aux.rect.x; - f32 b2 = gen->aux.rect.z; - if (rnd > a2 / (a2 + b2)) { + if (rnd > a2 / (a2 + gen->aux.rect.z)) { emit_pos.z = emit_pos.z > 0.5F ? 1.0F : 0.0F; } else { emit_pos.x = emit_pos.x > 0.5F ? 1.0F : 0.0F; @@ -824,8 +805,7 @@ f32 hsd_8039DAD4(HSD_Generator* gen) { f32 rnd = HSD_Randf(); f32 a2 = gen->aux.rect.y; - f32 b2 = gen->aux.rect.z; - if (rnd > a2 / (a2 + b2)) { + if (rnd > a2 / (a2 + gen->aux.rect.z)) { emit_pos.z = emit_pos.z > 0.5F ? 1.0F : 0.0F; } else { emit_pos.y = emit_pos.y > 0.5F ? 1.0F : 0.0F; @@ -838,16 +818,11 @@ f32 hsd_8039DAD4(HSD_Generator* gen) f32 a2 = gen->aux.rect.z; f32 b2 = gen->aux.rect.y; f32 c2 = gen->aux.rect.x; - f32 ab = b2 * a2; - f32 ca = c2 * b2; - f32 total = c2 * (b2 + a2) + ab; - f32 r0 = 1.0F / total; - f32 t1 = r0 * ca; - if (rnd < t1) { + f32 r0 = 1.0F / (c2 * (b2 + a2) + b2 * a2); + if (rnd < r0 * (c2 * b2)) { emit_pos.z = emit_pos.z > 0.5F ? 1.0F : 0.0F; } else { - f32 t2 = 1.0F - c2 * a2 * r0; - if (rnd > t2) { + if (rnd > 1.0F - r0 * (c2 * a2)) { emit_pos.y = emit_pos.y > 0.5F ? 1.0F : 0.0F; } else { emit_pos.x = emit_pos.x > 0.5F ? 1.0F : 0.0F; @@ -887,20 +862,19 @@ f32 hsd_8039DAD4(HSD_Generator* gen) gen->aux.rect.zz * gen->aux.rect.zz; mag = sqrtf(mag); { - f32 scale = vel_mag_sq / mag; - vel_out.x = gen->aux.rect.zx * scale; - vel_out.y = gen->aux.rect.zy * scale; - vel_out.z = gen->aux.rect.zz * scale; + f32 scale = elevation / mag; + vec.x = gen->aux.rect.zx * scale; + vec.y = gen->aux.rect.zy * scale; + vec.z = gen->aux.rect.zz * scale; } } - PSMTXMultVec(rot_mtx, &vel_out, &vel_out); + PSMTXMultVec(rot_mtx, &vec, &vec); hsd_80398F0C(gen->linkNo, gen->bank, gen->kind, gen->texGroup, (s32) gen->cmdList, gen->life, 0, (s32) gen, - emit_pos.x, emit_pos.y, emit_pos.z, vel_out.x, - vel_out.y, vel_out.z, gen->size, gen->grav, - gen->fric); + emit_pos.x, emit_pos.y, emit_pos.z, vec.x, vec.y, + vec.z, gen->size, gen->grav, gen->fric); break; } @@ -908,8 +882,9 @@ f32 hsd_8039DAD4(HSD_Generator* gen) { f32 r0 = gen->aux.cone.height; if (r0 == 0.0F || __fabs(r0 - M_PI) < eps) { - f32 rnd = sqrtf(HSD_Randf()); - radius = (f32) (M_PI_2 * rnd); + radius = HSD_Randf(); + radius = sqrtf(radius); + radius = (f32) (M_PI_2 * radius); { f32 rnd2 = HSD_Randf(); if (rnd2 < 0.5F) { @@ -917,21 +892,23 @@ f32 hsd_8039DAD4(HSD_Generator* gen) } } } else { - f32 rnd = sqrtf(HSD_Randf()); - radius = gen->aux.cone.height * rnd; + radius = HSD_Randf(); + radius = sqrtf(radius); + radius = gen->aux.cone.height * radius; } { - f32 rnd = HSD_Randf(); - f32 az_angle; - f32 r2 = gen->radius; - az_angle = (f32) (2.0 * (M_PI * (f64) rnd)); - cone_angle = az_angle; - - if (r2 < 0.0F) { - sin_az = -r2; - } else { - rnd = sqrtf(HSD_Randf()); - sin_az = r2 * rnd; + cone_angle = HSD_Randf(); + cone_angle = + (f32) (2.0 * (M_PI * (f64) hsd_8039DAD4_home(cone_angle))); + { + f32 r2 = gen->radius; + if (r2 < 0.0F) { + sin_az = -r2; + } else { + sin_az = HSD_Randf(); + sin_az = sqrtf(sin_az); + sin_az = r2 * sin_az; + } } } { @@ -939,26 +916,26 @@ f32 hsd_8039DAD4(HSD_Generator* gen) f32 sin_r; cos_r = cosf(cone_angle); cos_az = sinf(radius); - vel_out.x = cos_az * cos_r; + vec.x = cos_az * cos_r; sin_el = sinf(cone_angle); sin_r = sinf(radius); - vel_out.y = sin_r * sin_el; - vel_out.z = cosf(radius); + vec.y = sin_r * sin_el; + vec.z = cosf(radius); } - PSMTXMultVec(rot_mtx, &vel_out, &emit_pos); + PSMTXMultVec(rot_mtx, &vec, &emit_pos); /* Scale position by aux.rect.x */ - vel_out.x = emit_pos.x * gen->aux.rect.x; - vel_out.y = emit_pos.y * gen->aux.rect.x; - vel_out.z = emit_pos.z * gen->aux.rect.x; + vec.x = emit_pos.x * gen->aux.rect.x; + vec.y = emit_pos.y * gen->aux.rect.x; + vec.z = emit_pos.z * gen->aux.rect.x; /* Scale velocity if needed */ if (gen->radius >= 0.0F && gen->aux.rect.x < 0.0F) { f32 scale = sin_az / gen->radius; - vel_out.x *= scale; - vel_out.y *= scale; - vel_out.z *= scale; + vec.x *= scale; + vec.y *= scale; + vec.z *= scale; } emit_pos.x = sin_az * emit_pos.x + gen->pos.x; @@ -967,9 +944,8 @@ f32 hsd_8039DAD4(HSD_Generator* gen) hsd_80398F0C(gen->linkNo, gen->bank, gen->kind, gen->texGroup, (s32) gen->cmdList, gen->life, 0, (s32) gen, - emit_pos.x, emit_pos.y, emit_pos.z, vel_out.x, - vel_out.y, vel_out.z, gen->size, gen->grav, - gen->fric); + emit_pos.x, emit_pos.y, emit_pos.z, vec.x, vec.y, + vec.z, gen->size, gen->grav, gen->fric); break; } @@ -1061,8 +1037,8 @@ HSD_Generator* hsd_8039EFAC(s32 linkNo, s32 bank, s32 gfx_id, HSD_JObj* jobj) return gen; } -// @TODO: Currently 96.66% match - command-array register swap and stack -// frame differences remain +/// @todo The bound check reads the .bss array named `psCmdListArray`, not +/// `psNumCmdList`; the two names look swapped against their addresses. HSD_Generator* hsd_8039F05C(s32 linkNo, s32 bank, s32 idx) { HSD_Generator* gen; @@ -1073,39 +1049,36 @@ HSD_Generator* hsd_8039F05C(s32 linkNo, s32 bank, s32 idx) if (linkNo >= 8) { return NULL; } - if (idx >= psNumCmdList[bank]) { + if (idx >= psCmdListArray[bank]) { return NULL; } - if (((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx] == NULL) { + if (ptclref_804D0E5C[bank][idx] == NULL) { return NULL; } gen = hsd_8039D9C8(); if (gen != NULL) { - gen->type = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->type; + gen->type = ptclref_804D0E5C[bank][idx]->type; gen->bank = bank; gen->linkNo = linkNo; - gen->kind = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->kind; - gen->texGroup = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->texGroup; - gen->life = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->life; - gen->genLife = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->genLife; + gen->kind = ptclref_804D0E5C[bank][idx]->kind; + gen->texGroup = ptclref_804D0E5C[bank][idx]->texGroup; + gen->life = ptclref_804D0E5C[bank][idx]->life; + gen->genLife = ptclref_804D0E5C[bank][idx]->genLife; gen->pos.z = 0.0F; gen->pos.y = 0.0F; gen->pos.x = 0.0F; - gen->vel.x = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->vx; - gen->vel.y = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->vy; - gen->vel.z = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->vz; - gen->grav = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->grav; - gen->fric = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->fric; - gen->size = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->size; - gen->cmdList = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->cmdList; - gen->radius = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->radius; - gen->angle = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->angle; - gen->random = ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->random; + gen->vel.x = ptclref_804D0E5C[bank][idx]->vx; + gen->vel.y = ptclref_804D0E5C[bank][idx]->vy; + gen->vel.z = ptclref_804D0E5C[bank][idx]->vz; + gen->grav = ptclref_804D0E5C[bank][idx]->grav; + gen->fric = ptclref_804D0E5C[bank][idx]->fric; + gen->size = ptclref_804D0E5C[bank][idx]->size; + gen->cmdList = ptclref_804D0E5C[bank][idx]->cmdList; + gen->radius = ptclref_804D0E5C[bank][idx]->radius; + gen->angle = ptclref_804D0E5C[bank][idx]->angle; + gen->random = ptclref_804D0E5C[bank][idx]->random; if (gen->kind & 0x100) { if (gen->random < 0.0F) { @@ -1134,51 +1107,45 @@ HSD_Generator* hsd_8039F05C(s32 linkNo, s32 bank, s32 idx) case 0: case 3: case 4: { - HSD_PSCmdList* c = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]; + HSD_PSCmdList* c = ptclref_804D0E5C[bank][idx]; f32 p1 = c->param1; if (p1 == 0.0F && c->param2 == 0.0F) { gen->aux.disc.minAngle = 0.0F; gen->aux.disc.maxAngle = 6.2831855F; } else { gen->aux.disc.minAngle = p1; - gen->aux.disc.maxAngle = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param2; + gen->aux.disc.maxAngle = ptclref_804D0E5C[bank][idx]->param2; } break; } case 1: - gen->aux.line.x2 = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param1; - gen->aux.line.y2 = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param2; - gen->aux.line.z2 = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param3; + gen->aux.line.x2 = ptclref_804D0E5C[bank][idx]->param1; + gen->aux.line.y2 = ptclref_804D0E5C[bank][idx]->param2; + gen->aux.line.z2 = ptclref_804D0E5C[bank][idx]->param3; + break; + case 2: break; case 6: case 7: { - HSD_PSCmdList* c = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]; + HSD_PSCmdList* c = ptclref_804D0E5C[bank][idx]; f32 p1 = c->param1; if (p1 == 0.0F && c->param2 == 0.0F) { gen->aux.cone.minAngle = 0.0F; gen->aux.cone.maxAngle = 6.2831855F; } else { gen->aux.cone.minAngle = p1; - gen->aux.cone.maxAngle = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param2; + gen->aux.cone.maxAngle = ptclref_804D0E5C[bank][idx]->param2; } - gen->aux.cone.height = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param3; + gen->aux.cone.height = ptclref_804D0E5C[bank][idx]->param3; break; } case 5: { gen->aux.rect.xx = gen->aux.rect.x = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param1; + ptclref_804D0E5C[bank][idx]->param1; gen->aux.rect.yy = gen->aux.rect.y = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param2; + ptclref_804D0E5C[bank][idx]->param2; gen->aux.rect.zz = gen->aux.rect.z = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param3; + ptclref_804D0E5C[bank][idx]->param3; gen->aux.rect.zy = 0.0F; gen->aux.rect.zx = 0.0F; gen->aux.rect.yz = 0.0F; @@ -1186,19 +1153,13 @@ HSD_Generator* hsd_8039F05C(s32 linkNo, s32 bank, s32 idx) gen->aux.rect.xz = 0.0F; gen->aux.rect.xy = 0.0F; gen->aux.rect.flag = 0; - if (((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param1 < - 0.0F) - { + if (ptclref_804D0E5C[bank][idx]->param1 < 0.0F) { gen->aux.rect.flag |= 1; } - if (((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param2 < - 0.0F) - { + if (ptclref_804D0E5C[bank][idx]->param2 < 0.0F) { gen->aux.rect.flag |= 2; } - if (((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param3 < - 0.0F) - { + if (ptclref_804D0E5C[bank][idx]->param3 < 0.0F) { gen->aux.rect.flag |= 4; } break; @@ -1231,14 +1192,12 @@ HSD_Generator* hsd_8039F05C(s32 linkNo, s32 bank, s32 idx) } else { gen->aux.sphere.lonMid = atan2f(gen->vel.z, gen->vel.x); } - gen->aux.sphere.latRange = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param1; + gen->aux.sphere.latRange = ptclref_804D0E5C[bank][idx]->param1; if (gen->aux.sphere.latRange < 0.0F) { gen->aux.sphere.latRange = -gen->aux.sphere.latRange; gen->aux.sphere.speed = -gen->aux.sphere.speed; } - gen->aux.sphere.lonRange = - ((HSD_PSCmdList***) ptclref_804D0E5C)[bank][idx]->param2; + gen->aux.sphere.lonRange = ptclref_804D0E5C[bank][idx]->param2; break; } default: diff --git a/src/sysdolphin/baselib/hsd_3915.static.h b/src/sysdolphin/baselib/hsd_3915.static.h index fbeac46329..2b82a56005 100644 --- a/src/sysdolphin/baselib/hsd_3915.static.h +++ b/src/sysdolphin/baselib/hsd_3915.static.h @@ -1,4 +1,4 @@ -#include +#include // IWYU pragma: keep // types @@ -23,11 +23,6 @@ typedef struct { static PerfDispItem hsd_804CE3F8[6]; -extern int psNumTexGroup[65]; -static HSD_PSFormGroup** psFormGroupArray[65]; - -/* 4D0908 */ static void* hsd_804D0908[146]; -/* 4D0C54 */ static HSD_PSCmdList** psCmdListArray[65]; /* 4D7850 */ static HSD_SList* hsd_804D7850; /* 4D7858 */ static f32 hsd_804D7858; /* 4D785C */ static f32 hsd_804D785C; diff --git a/src/sysdolphin/baselib/particle.c b/src/sysdolphin/baselib/particle.c index 36bd6a9829..488090b83e 100644 --- a/src/sysdolphin/baselib/particle.c +++ b/src/sysdolphin/baselib/particle.c @@ -32,16 +32,25 @@ typedef struct { #include #include -/* 4D78D8 */ u16 hsd_804D78D8; -/* 4D78DE */ u16 hsd_804D78DE; +/* 4D78D8 */ u16 hsd_804D78D8 = 0; +/* 4D78DA */ u16 hsd_804D78DA = 0; +/* 4D78DC */ static u16 numPeakParticles; +/* 4D78DE */ u16 hsd_804D78DE = 0; +/* 4D78E0 */ u16 hsd_804D78E0 = 0; +/* 4D78E2 */ static u16 hsd_804D78E2; +/* 4D78E4 */ static u16 hsd_804D78E4 = 0; +/* 4D78E8 */ u32 hsd_804D78E8 = 0; +/* 4D78EC */ u32 hsd_804D78EC = 0; +/* 4D78F0 */ HSD_CObj* psCamera = NULL; +/* 4D78F4 */ u32 hsd_804D78F4 = 0; static HSD_JObj* hsd_804D08E8[8]; /* 4D0908 */ HSD_Particle* hsd_804D0908[16]; /* 4D0948 */ HSD_Particle* hsd_804D0948[65]; /* 4D0A4C */ HSD_PSFormGroup** psFormGroupArray[65]; /* 4D0B50 */ HSD_PSTexGroup** psTexGroupArray[65]; -/* 4D0C54 */ int psNumCmdList[65]; -/* 4D0D58 */ HSD_PSCmdList** psCmdListArray[65]; -/* 4D0E5C */ u32* ptclref_804D0E5C[65]; +/* 4D0C54 */ HSD_PSFormGroup** psNumCmdList[65]; +/* 4D0D58 */ int psCmdListArray[65]; +/* 4D0E5C */ HSD_PSCmdList** ptclref_804D0E5C[65]; /* 4D0F60 */ struct hsd_804D0F60_t hsd_804D0F60; typedef struct PSNode { @@ -337,14 +346,14 @@ void hsd_80398A08(u32 unused) for (i = 0; i < 16; i++) { hsd_804D0908[i] = NULL; } - hsd_804D78E2[0] = 0; + hsd_804D78E2 = 0; numPeakParticles = 0; for (i = 0; i < 0x41; i++) { - psCmdListArray[i] = NULL; + psCmdListArray[i] = 0; psFormGroupArray[i] = NULL; ptclref_804D0E5C[i] = NULL; psTexGroupArray[i] = NULL; - psNumCmdList[i] = 0; + psNumCmdList[i] = NULL; hsd_804D0948[i] = NULL; } psCallback = NULL; @@ -376,9 +385,9 @@ HSD_Particle* psGenerateParticle0(HSD_Particle** head, int linkNo, int bank, return NULL; } - hsd_804D78E2[0] += 1; - if (hsd_804D78E2[0] > numPeakParticles) { - numPeakParticles = hsd_804D78E2[0]; + hsd_804D78E2 += 1; + if (hsd_804D78E2 > numPeakParticles) { + numPeakParticles = hsd_804D78E2; } if (gp != NULL) { @@ -974,10 +983,10 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) child = NULL; } else if (bank >= 65) { child = NULL; - } else if (idx >= psNumCmdList[bank]) { + } else if (idx >= psCmdListArray[bank]) { child = NULL; } else { - cl = psCmdListArray[bank][idx]; + cl = ptclref_804D0E5C[bank][idx]; if (cl == NULL) { child = NULL; } else { @@ -1023,7 +1032,7 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) pc += 2; if (ptclref_804D0E5C[bank] != NULL) { - idx = ptclref_804D0E5C[bank][idx]; + idx = (u32) ptclref_804D0E5C[bank][idx]; } linkNo = pp->linkNo; @@ -1032,10 +1041,10 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) child = NULL; } else if (bank >= 65) { child = NULL; - } else if (idx >= psNumCmdList[bank]) { + } else if (idx >= psCmdListArray[bank]) { child = NULL; } else { - cl = psCmdListArray[bank][idx]; + cl = ptclref_804D0E5C[bank][idx]; if (cl == NULL) { child = NULL; } else { @@ -1205,7 +1214,7 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) pc += 3; if (ptclref_804D0E5C[pp->bank] != NULL) { - idx = ptclref_804D0E5C[pp->bank][idx]; + idx = (u32) ptclref_804D0E5C[pp->bank][idx]; } gchild = hsd_8039F05C(pp->linkNo, pp->bank, idx); @@ -1342,7 +1351,7 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) idx = baseIdx + (s32) ((f32) randomRange * HSD_Randf()); if (ptclref_804D0E5C[pp->bank] != NULL) { - idx = ptclref_804D0E5C[pp->bank][idx]; + idx = (u32) ptclref_804D0E5C[pp->bank][idx]; } linkNo = pp->linkNo; @@ -1351,10 +1360,10 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) child = NULL; } else if (bank >= 65) { child = NULL; - } else if (idx >= psNumCmdList[bank]) { + } else if (idx >= psCmdListArray[bank]) { child = NULL; } else { - cl = psCmdListArray[bank][idx]; + cl = ptclref_804D0E5C[bank][idx]; if (cl == NULL) { child = NULL; } else { @@ -1687,10 +1696,10 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) child = NULL; } else if (bank >= 65) { child = NULL; - } else if (idx >= psNumCmdList[bank]) { + } else if (idx >= psCmdListArray[bank]) { child = NULL; } else { - cl = psCmdListArray[bank][idx]; + cl = ptclref_804D0E5C[bank][idx]; if (cl == NULL) { child = NULL; } else { @@ -1742,7 +1751,7 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) pc += 2; if (ptclref_804D0E5C[bank] != NULL) { - idx = ptclref_804D0E5C[bank][idx]; + idx = (u32) ptclref_804D0E5C[bank][idx]; } linkNo = pp->linkNo; @@ -1750,10 +1759,10 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) child = NULL; } else if (bank >= 65) { child = NULL; - } else if (idx >= psNumCmdList[bank]) { + } else if (idx >= psCmdListArray[bank]) { child = NULL; } else { - cl = psCmdListArray[bank][idx]; + cl = ptclref_804D0E5C[bank][idx]; if (cl == NULL) { child = NULL; } else { @@ -2865,7 +2874,7 @@ void* hsd_8039930C(void* pp_arg, void* prev_arg) /* Free particle */ hsd_8039D048(pp); HSD_ObjFree(&hsd_804D0F60.alloc_data, pp); - hsd_804D78E2[0]--; + hsd_804D78E2--; return next_pp; } } @@ -3102,7 +3111,7 @@ void hsd_8039D0A0(HSD_Generator* gen) } HSD_ObjFree(&data->alloc_data, prt); - hsd_804D78E2[0]--; + hsd_804D78E2--; } else { prev = prt; } diff --git a/src/sysdolphin/baselib/particle.h b/src/sysdolphin/baselib/particle.h index 8843658390..bb7f044382 100644 --- a/src/sysdolphin/baselib/particle.h +++ b/src/sysdolphin/baselib/particle.h @@ -33,9 +33,16 @@ psGenerateParticle0(HSD_Particle** head, int linkNo, int bank, u32 kind, /* 39CF4C */ void hsd_8039CF4C(s32, HSD_JObj*); /* 39D048 */ void hsd_8039D048(void* particle); /* 4D0B50 */ extern HSD_PSTexGroup** psTexGroupArray[65]; -/* 4D0D58 */ extern int psNumCmdList[65]; -/* 4D0E5C */ extern u32* ptclref_804D0E5C[65]; +/* 4D0C54 */ extern HSD_PSFormGroup** psNumCmdList[65]; +/* 4D0D58 */ extern int psCmdListArray[65]; +/* 4D0E5C */ extern HSD_PSCmdList** ptclref_804D0E5C[65]; /* 4D78D8 */ extern u16 hsd_804D78D8; +/* 4D78DA */ extern u16 hsd_804D78DA; /* 4D78DE */ extern u16 hsd_804D78DE; +/* 4D78E0 */ extern u16 hsd_804D78E0; +/* 4D78E8 */ extern u32 hsd_804D78E8; +/* 4D78EC */ extern u32 hsd_804D78EC; +/* 4D78F0 */ extern HSD_CObj* psCamera; +/* 4D78F4 */ extern u32 hsd_804D78F4; #endif diff --git a/src/sysdolphin/baselib/particle.static.h b/src/sysdolphin/baselib/particle.static.h index 209e753d43..6e2578cc0a 100644 --- a/src/sysdolphin/baselib/particle.static.h +++ b/src/sysdolphin/baselib/particle.static.h @@ -8,7 +8,5 @@ /* 4D78D0 */ static u32 hsd_804D78D0; /* 4D78D4 */ static int (**psCallback)(HSD_Particle* part); -/* 4D78DC */ static u16 numPeakParticles; -/* 4D78E2 */ static u16 hsd_804D78E2[2]; #endif