From fcfca8661ae2536d18d6a2660644802b6f4bc711 Mon Sep 17 00:00:00 2001 From: blott Date: Tue, 4 Feb 2025 18:03:31 +0000 Subject: [PATCH 1/3] P2/basic.c: Match FIsBasicDerivedFrom --- include/basic.h | 4 ++-- include/vtables.h | 13 +++++++++++++ src/P2/basic.c | 10 +++++++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/include/basic.h b/include/basic.h index 7b1b6d30..22d475d1 100644 --- a/include/basic.h +++ b/include/basic.h @@ -8,7 +8,7 @@ #include "common.h" #include -#include +#include /** * @brief Basic object. @@ -19,7 +19,7 @@ */ struct BASIC { - int field_0x0; // placeholder for vtable + VTBASIC *pvtbasic; CSidebag *psidebag; }; diff --git a/include/vtables.h b/include/vtables.h index 9f11f997..1ef44175 100644 --- a/include/vtables.h +++ b/include/vtables.h @@ -6,8 +6,21 @@ #ifndef VTABLES_H #define VTABLES_H +#include + struct BLOT; +/** + * @brief VT for basic objects. + * + * @todo pvtSuper should be VT* according to prototype. + */ +struct VTBASIC +{ + VTBASIC *pvtSuper; + CID cid; +}; + /** * @brief VT for generic blots. */ diff --git a/src/P2/basic.c b/src/P2/basic.c index 0b21af82..2af2221f 100644 --- a/src/P2/basic.c +++ b/src/P2/basic.c @@ -1,6 +1,14 @@ #include -INCLUDE_ASM(const s32, "P2/basic", FIsBasicDerivedFrom__FP5BASIC3CID); +int FIsBasicDerivedFrom(BASIC *pbasic, CID cid) { + VTBASIC *vt = pbasic->pvtbasic; + while (vt != 0) { + if (vt->cid == cid) return 1; + vt = vt->pvtSuper; + } + + return 0; +} INCLUDE_ASM(const s32, "P2/basic", EnsureBasicSidebag__FP5BASIC); From e5ced9f3bdd8bd1fb88d889495eacee2210ae9e3 Mon Sep 17 00:00:00 2001 From: blott Date: Tue, 4 Feb 2025 18:48:35 +0000 Subject: [PATCH 2/3] P2/basic.c: Match EnsureBasicSidebag --- include/splice/sidebag.h | 2 ++ src/P2/basic.c | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/splice/sidebag.h b/include/splice/sidebag.h index 5f263925..b6274a85 100644 --- a/include/splice/sidebag.h +++ b/include/splice/sidebag.h @@ -28,4 +28,6 @@ class CSidebag SBB m_asbb[16]; }; +CSidebag* PsidebagNew(); + #endif // SPLICE_SIDEBAG_H diff --git a/src/P2/basic.c b/src/P2/basic.c index 2af2221f..37716982 100644 --- a/src/P2/basic.c +++ b/src/P2/basic.c @@ -1,4 +1,8 @@ #include +#include +#include + +extern CGc g_gc; int FIsBasicDerivedFrom(BASIC *pbasic, CID cid) { VTBASIC *vt = pbasic->pvtbasic; @@ -10,6 +14,13 @@ int FIsBasicDerivedFrom(BASIC *pbasic, CID cid) { return 0; } -INCLUDE_ASM(const s32, "P2/basic", EnsureBasicSidebag__FP5BASIC); +void EnsureBasicSidebag(BASIC *pbasic) { + if (pbasic->psidebag == 0) { + CSidebag *psidebag = PsidebagNew(); + pbasic->psidebag = psidebag; + g_gc.AddRootSidebag(psidebag); + } + return; +} INCLUDE_ASM(const s32, "P2/basic", func_00130158); From 2fa62e537b84441888a21492cffb704d880a59c2 Mon Sep 17 00:00:00 2001 From: blott Date: Tue, 4 Feb 2025 19:03:33 +0000 Subject: [PATCH 3/3] P2/basic.c: Match GetBasicCid --- config/symbol_addrs.txt | 1 + src/P2/basic.c | 8 +++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/config/symbol_addrs.txt b/config/symbol_addrs.txt index 48577b19..3eaeb412 100644 --- a/config/symbol_addrs.txt +++ b/config/symbol_addrs.txt @@ -406,6 +406,7 @@ GGetActsegPoseGoal__FP6ACTSEGi = 0x123358; // type:func //////////////////////////////////////////////////////////////// FIsBasicDerivedFrom__FP5BASIC3CID = 0x1300e8; // type:func EnsureBasicSidebag__FP5BASIC = 0x130110; // type:func +GetBasicCid__FP5BASICP3CID = 0x130158; // type:func //////////////////////////////////////////////////////////////// diff --git a/src/P2/basic.c b/src/P2/basic.c index 37716982..dd958924 100644 --- a/src/P2/basic.c +++ b/src/P2/basic.c @@ -6,7 +6,7 @@ extern CGc g_gc; int FIsBasicDerivedFrom(BASIC *pbasic, CID cid) { VTBASIC *vt = pbasic->pvtbasic; - while (vt != 0) { + while (vt != nullptr) { if (vt->cid == cid) return 1; vt = vt->pvtSuper; } @@ -15,7 +15,7 @@ int FIsBasicDerivedFrom(BASIC *pbasic, CID cid) { } void EnsureBasicSidebag(BASIC *pbasic) { - if (pbasic->psidebag == 0) { + if (pbasic->psidebag == nullptr) { CSidebag *psidebag = PsidebagNew(); pbasic->psidebag = psidebag; g_gc.AddRootSidebag(psidebag); @@ -23,4 +23,6 @@ void EnsureBasicSidebag(BASIC *pbasic) { return; } -INCLUDE_ASM(const s32, "P2/basic", func_00130158); +void GetBasicCid(BASIC *pbasic, CID* pcid) { + *pcid = pbasic->pvtbasic->cid; +}