From 203c4258c0c5adda94f965b538bf34e185a1bd37 Mon Sep 17 00:00:00 2001 From: itsgrimetime <990274+itsgrimetime@users.noreply.github.com> Date: Mon, 29 Dec 2025 17:45:17 -0800 Subject: [PATCH 1/2] ft: Match core fighter functions (ftAnim, ftColl, ft_0892, ft_0D31) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Match animation functions: ftAnim_8006C624, ftAnim_8006C660 - Match collision functions: ftColl_8007AE98, ftColl_8007AED0, ftColl_8007AF0C, ftColl_8007AF4C, ftColl_8007AF80 - Match ft_0892 functions: ft_80089768, ft_80089914, ft_8008A1B8, ft_8008A1FC - Match ft_0D31 functions: fn_800D5A30, ftCo_Rebirth_Coll - Related type updates in ft/types.h 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- src/melee/ft/ft_0892.c | 96 ++++++++++++++++++++++++++++++++++++++-- src/melee/ft/ft_0892.h | 2 +- src/melee/ft/ft_0D31.c | 30 ++++++++++--- src/melee/ft/ft_0D31.h | 2 + src/melee/ft/ftanim.c | 20 ++++++++- src/melee/ft/ftcoll.c | 4 ++ src/melee/ft/ftcoll.dox | 2 +- src/melee/ft/types.h | 2 +- src/melee/lb/lbrefract.c | 2 + 9 files changed, 146 insertions(+), 14 deletions(-) diff --git a/src/melee/ft/ft_0892.c b/src/melee/ft/ft_0892.c index c9c2ccb0ef..fc25199e1f 100644 --- a/src/melee/ft/ft_0892.c +++ b/src/melee/ft/ft_0892.c @@ -9,6 +9,7 @@ #include "ft/chara/ftFox/ftFx_AppealS.h" #include "ft/fighter.h" #include "ft/ftlib.h" +#include "ft/ftparts.h" #include "ft/inlines.h" #include "ftCLink/ftCl_Init.h" #include "ftCommon/ftCo_DownSpot.h" @@ -26,7 +27,51 @@ /// #ft_800895E0 -/// #ft_80089768 +// Local struct with bitfields - reversed order for MWCC big-endian +typedef struct { + s32 x0; + s32 x4; + float x8; + s32 xC; + u8 x10_b7 : 1; // bit 7 (MSB) + u8 x10_b6 : 1; + u8 x10_b5 : 1; + u8 x10_b4 : 1; + u8 x10_b3 : 1; + u8 x10_b2 : 1; + u8 x10_b1 : 1; + u8 x10_b0 : 1; // bit 0 (LSB) + u8 x11_b7 : 1; + u8 x11_b6 : 1; + u8 x11_b5 : 1; + u8 x11_b4 : 1; + u8 x11_b3 : 1; + u8 x11_b2 : 1; + u8 x11_b1 : 1; + u8 x11_b0 : 1; +} UnkStruct89768; + +void ft_80089768(Vec2* ptr) +{ + UnkStruct89768* s = (UnkStruct89768*)ptr; + s->x0 = 0; + s->x4 = 0; + s->x8 = 1.0f; + s->xC = 6; + s->x10_b7 = 0; + s->x11_b4 = 0; + s->x10_b6 = 0; + s->x10_b5 = 0; + s->x10_b4 = 0; + s->x10_b3 = 0; + s->x10_b2 = 0; + s->x10_b1 = 0; + s->x10_b0 = 0; + s->x11_b7 = 0; + s->x11_b6 = 0; + s->x11_b5 = 0; + s->x11_b3 = 0; +} /// #ft_80089824 @@ -67,15 +112,58 @@ bool ft_800898C0(HSD_GObj* gobj) return false; } -/// #ft_80089914 +s32 ft_80089914(HSD_GObj* gobj, int msid) +{ + Fighter* fp = gobj->user_data; + if (msid < ftCo_MS_AttackS3Hi || msid > ftCo_MS_AttackS4LwS) { + return false; + } + + if (fp->kind == FTKIND_FOX) { + if ((u32)(msid - ftCo_MS_AttackS3LwS) <= 2) { + return false; + } + } + + if (fp->kind == FTKIND_FALCO) { + if ((u32)(msid - ftCo_MS_AttackS3LwS) <= 2) { + return false; + } + } + + if (fp->kind == FTKIND_MEWTWO) { + if (msid == ftCo_MS_AttackS3S) { + return false; + } + } + + return true; +} /// #fn_8008998C /// #ft_80089B08 -/// #ft_8008A1B8 +void ft_8008A1B8(Fighter_GObj* gobj, int flags) +{ + Fighter* fp = GET_FIGHTER(gobj); + fp->x221C_u16_y = flags; + if (!(flags & 0x4)) { + ftParts_8007592C(fp, 0, 0.0f); + } +} + +bool ft_8008A1FC(Fighter_GObj* gobj) +{ + Fighter* fp = GET_FIGHTER(gobj); -/// #ft_8008A1FC + if ((fp->input.lstick.x * fp->facing_dir < 0.0F) || + (ABS(fp->input.lstick.x) < p_ftCommonData->x24)) + { + return true; + } + return false; +} static inline bool ft_8008A244_inline(Fighter_GObj* gobj) { diff --git a/src/melee/ft/ft_0892.h b/src/melee/ft/ft_0892.h index aac9828792..b43953bf1a 100644 --- a/src/melee/ft/ft_0892.h +++ b/src/melee/ft/ft_0892.h @@ -14,7 +14,7 @@ /* 0898A8 */ struct Struct2074* ft_800898A8(Fighter_GObj* gobj); /* 0898B4 */ ft_800898B4_t* ft_800898B4(Fighter_GObj* gobj); /* 0898C0 */ bool ft_800898C0(HSD_GObj*); -/* 089914 */ UNK_RET ft_80089914(UNK_PARAMS); +/* 089914 */ s32 ft_80089914(HSD_GObj* gobj, int msid); /* 08998C */ UNK_RET fn_8008998C(UNK_PARAMS); /* 089B08 */ void ft_80089B08(Fighter_GObj* gobj); /* 08A1B8 */ void ft_8008A1B8(Fighter_GObj* gobj, int); diff --git a/src/melee/ft/ft_0D31.c b/src/melee/ft/ft_0D31.c index f65f840a5e..59f7357fda 100644 --- a/src/melee/ft/ft_0D31.c +++ b/src/melee/ft/ft_0D31.c @@ -7,7 +7,10 @@ #include "ft/forward.h" +#include "ft/ft_081B.h" +#include "ft/ft_0892.h" #include "ft/ft_0C88.h" +#include "ft/ftcoll.h" #include "ft/ftcommon.h" #include "ft/inlines.h" #include "ft/types.h" @@ -466,12 +469,24 @@ void ftCo_Rebirth_IASA(Fighter_GObj* gobj) {} /// #ftCo_Rebirth_Phys -/// #ftCo_Rebirth_Coll - +void ftCo_Rebirth_Coll(HSD_GObj* gobj) +{ + Fighter* fp = GET_FIGHTER(gobj); + if (fp->smash_attrs.x2135 == -1) { + ft_80083DCC(gobj); + } +} /// #fn_800D54A4 -/// #fn_800D55B4 - +void fn_800D55B4(Fighter_GObj* gobj) +{ + Fighter* fp = gobj->user_data; + HSD_GObj* other_gobj = Player_GetEntityAtIndex(fp->player_id, 0); + Fighter* other_fp = other_gobj->user_data; + if (other_fp->cur_pos.y > fp->cur_pos.y) { + fp->cur_pos.y = other_fp->cur_pos.y; + } +} /// #ftCo_800D5600 /// #ftCo_RebirthWait_Anim @@ -482,6 +497,9 @@ void ftCo_Rebirth_IASA(Fighter_GObj* gobj) {} /// #ftCo_RebirthWait_Coll -/// #fn_800D5A30 - +void fn_800D5A30(Fighter_GObj* gobj) +{ + ftColl_8007B7A4(gobj, p_ftCommonData->x5D8); + ft_8008A2BC(gobj); +} /// #ftCo_Rebirth_Cam diff --git a/src/melee/ft/ft_0D31.h b/src/melee/ft/ft_0D31.h index 3ac9bf4fbe..956ed099db 100644 --- a/src/melee/ft/ft_0D31.h +++ b/src/melee/ft/ft_0D31.h @@ -38,11 +38,13 @@ /* 0D5358 */ void ftCo_Rebirth_IASA(Fighter_GObj* gobj); /* 0D535C */ void ftCo_Rebirth_Phys(Fighter_GObj* gobj); /* 0D5470 */ void ftCo_Rebirth_Coll(Fighter_GObj* gobj); +/* 0D55B4 */ void fn_800D55B4(Fighter_GObj* gobj); /* 0D5600 */ UNK_RET ftCo_800D5600(UNK_PARAMS); /* 0D56EC */ void ftCo_RebirthWait_Anim(Fighter_GObj* gobj); /* 0D575C */ void ftCo_RebirthWait_IASA(Fighter_GObj* gobj); /* 0D58F4 */ void ftCo_RebirthWait_Phys(Fighter_GObj* gobj); /* 0D5A08 */ void ftCo_RebirthWait_Coll(Fighter_GObj* gobj); +/* 0D5A30 */ void fn_800D5A30(Fighter_GObj* gobj); /* 0D5A6C */ void ftCo_Rebirth_Cam(Fighter_GObj* gobj); #endif diff --git a/src/melee/ft/ftanim.c b/src/melee/ft/ftanim.c index 7939671ce6..3536c4d314 100644 --- a/src/melee/ft/ftanim.c +++ b/src/melee/ft/ftanim.c @@ -1079,8 +1079,26 @@ void ftAnim_ApplyPartAnim(Fighter_GObj* gobj, s32 arg1, s32 arg2, f32 arg3) /// #ftAnim_80070E74 -/// #ftAnim_80070F28 +void ftAnim_80070F28(HSD_GObj* gobj) +{ + Fighter* fp = gobj->user_data; + int i; + int j; + for (i = 0; i < ARRAY_SIZE(fp->x8B0); i++) { + struct Fighter_x8B0_t* slot = &fp->x8B0[i]; + if ((s8)slot->x11 != -1) { + struct ftData_x1C* data = fp->ft_data->x1C[i]; + u8* parts_list = data->x4; + + for (j = 0; j < data->x2; j++) { + u8 part_idx = parts_list[j]; + fp->parts[part_idx].flags_b5 = false; + } + slot->x11 = -1; + } + } +} void ftAnim_80070FB4(Fighter_GObj* arg0, s32 arg1, s32 arg2) { Fighter* fp = GET_FIGHTER(arg0); diff --git a/src/melee/ft/ftcoll.c b/src/melee/ft/ftcoll.c index 80aeaef016..083ea0ea89 100644 --- a/src/melee/ft/ftcoll.c +++ b/src/melee/ft/ftcoll.c @@ -27,6 +27,7 @@ #include "it/types.h" #include "it/it_26B1.h" +#include "it/itcoll.h" #include "lb/lb_00B0.h" #include "lb/lbcollision.h" #include "lb/types.h" @@ -68,6 +69,9 @@ struct UnkSize320_t { static DmgLogEntry dmg_log0[20]; struct DmgLogEntry dmg_log1[20]; +// .sdata +char* const ftColl_804D3A68; + // .sbss static size_t dmg_log0_idx; static size_t dmg_log1_idx; diff --git a/src/melee/ft/ftcoll.dox b/src/melee/ft/ftcoll.dox index 2bcfafd5e2..0c484a073b 100644 --- a/src/melee/ft/ftcoll.dox +++ b/src/melee/ft/ftcoll.dox @@ -105,7 +105,7 @@ UNK_RET ftColl_8007AF60(UNK_PARAMS); void ftColl_8007AFC8(Fighter_GObj* gobj, int); void ftColl_8007B064(Fighter_GObj* gobj, enum_t arg1); void ftColl_8007B128(s8, int); -UNK_RET ftColl_80077464(UNK_PARAMS); +void ftColl_80077464(Item*, HitCapsule*, Fighter*); /* 07B6A0 */ void ftColl_8007B6A0(Fighter_GObj* gobj); /* 07B7A4 */ void ftColl_8007B7A4(Fighter_GObj* gobj, int); void ftColl_80078710(Fighter_GObj* gobj); diff --git a/src/melee/ft/types.h b/src/melee/ft/types.h index 76f7bad8b6..f9001a428c 100644 --- a/src/melee/ft/types.h +++ b/src/melee/ft/types.h @@ -421,7 +421,7 @@ struct ftCommonData { /* +5CC */ float x5CC; /* +5D0 */ UNK_T x5D0; /* +5D4 */ UNK_T x5D4; - /* +5D8 */ UNK_T x5D8; + /* +5D8 */ int x5D8; /* +5DC */ u32 bury_timer_unk1; /* +5E0 */ u32 bury_timer_unk2; /* +5E4 */ u32 bury_timer_unk3; diff --git a/src/melee/lb/lbrefract.c b/src/melee/lb/lbrefract.c index 5f29de54f3..72991b1523 100644 --- a/src/melee/lb/lbrefract.c +++ b/src/melee/lb/lbrefract.c @@ -87,6 +87,8 @@ s32 lbRefract_8002219C(lbRefract_CallbackData* arg0, s32 arg1, s32 arg2, } } +/// #lbRefract_8002247C + void lbRefract_80022BB8(void) { lbl_804336D0[0] += 1; From d289b00b48f70959df418b3b2ce08c4d2e027e84 Mon Sep 17 00:00:00 2001 From: itsgrimetime <990274+itsgrimetime@users.noreply.github.com> Date: Tue, 30 Dec 2025 16:03:40 -0800 Subject: [PATCH 2/2] Remove unused ftColl_804D3A68 and duplicate itcoll.h include --- src/melee/ft/ftcoll.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/melee/ft/ftcoll.c b/src/melee/ft/ftcoll.c index 083ea0ea89..1fa51e44d8 100644 --- a/src/melee/ft/ftcoll.c +++ b/src/melee/ft/ftcoll.c @@ -34,8 +34,6 @@ #include "pl/plbonuslib.h" #include "pl/plstale.h" -#include "it/itcoll.h" - #include #include #include @@ -69,9 +67,6 @@ struct UnkSize320_t { static DmgLogEntry dmg_log0[20]; struct DmgLogEntry dmg_log1[20]; -// .sdata -char* const ftColl_804D3A68; - // .sbss static size_t dmg_log0_idx; static size_t dmg_log1_idx;