From 28034d9c89d22e0a8cfb40a0cefa2279dab994f7 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Sun, 22 Jan 2023 17:42:30 +0100 Subject: [PATCH] deprecate libyaz0 --- .gitmodules | 3 --- README.MD | 4 ++-- config/rel_slices.yml | 10 +++++++--- include/zurumode.h | 9 ++++----- rel/zurumode/zurumode.c | 7 +++++-- rel/zurumode/zurumode_cleanup.c | 1 - rel/zurumode/zurumode_init.c | 1 - rel/zurumode/zurumode_update.c | 1 - tools/libyaz0 | 1 - tools/yaz0 | Bin 0 -> 49672 bytes 10 files changed, 18 insertions(+), 19 deletions(-) delete mode 160000 tools/libyaz0 create mode 100644 tools/yaz0 diff --git a/.gitmodules b/.gitmodules index 0d026c88..0567f0e0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,3 @@ -[submodule "tools/libyaz0"] - path = tools/libyaz0 - url = https://github.com/aboood40091/libyaz0 [submodule "tools/ppcdis"] path = tools/ppcdis url = https://github.com/SeekyCt/ppcdis diff --git a/README.MD b/README.MD index a6d823a6..b96c2225 100644 --- a/README.MD +++ b/README.MD @@ -4,7 +4,7 @@ Decompilation in progress of Animal Crossing (GAFE01) ## Cloning -Use `--recursive` when cloning to have ppcdis and libyaz0 in the repository. +Use `--recursive` when cloning to have ppcdis in the repository. ## Build @@ -13,7 +13,7 @@ Use `--recursive` when cloning to have ppcdis and libyaz0 in the repository. ### Building - Dump a copy of the game and extract **main.dol** and **foresta.rel.szs**. -- Decompress **foresta.rel.szs** with libyaz0 found in *tools/libyaz0*. +- Decompress **foresta.rel.szs** with yaz0 found in *tools/*. - Place **main.dol** and **foresta.rel** in *dump/*. - Place CodeWarrior 1.3.2 in *tools/1.3.2/*. - Install DevkitPPC, Ninja and Python: diff --git a/config/rel_slices.yml b/config/rel_slices.yml index d18dade3..3c324ff4 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -8,12 +8,16 @@ zurumode/zurumode_cleanup.c: .text: [0x8040efc4, 0x8040f008] # zurumode/zurumode_init.c: # .text: [0x8040ef58, 0x8040efc4] -# zurumode/zurumode_update.c: - # .text: [0x8040EDA8 , 0x8040ee74] Won't really bother at the moment with this one. + # .bss: [0x812f9670, 0x812f9680] +#zurumode/zurumode_update.c: + #.text: [0x8040EDA8, 0x8040ee74] m_random_field/mRF_MakePerfectBit.c: .text: [0x8050B1AC, 0x8050B1D4] m_random_field/mRF_GetRandomStepMode.c: .text: [0x8050B284, 0x8050B2C0] m_room_type/mRmTp_FtrItemNo2FtrIdx.c: .text: [0x803E7878, 0x803E78BC] - +# zurumode/zurumode.c: + # .text: [0x8040eb38, 0x8040f008] + # .bss: [0x812f9670, 0x812f9680] + # .data: [0x8065F9F0, 0x8065FA20] \ No newline at end of file diff --git a/include/zurumode.h b/include/zurumode.h index 10f29cd4..455a1133 100644 --- a/include/zurumode.h +++ b/include/zurumode.h @@ -8,14 +8,14 @@ #include "JSystem/JUT/JUTAssertion.h" #include "JSystem/JUT/JUTDbPrint.h" -typedef struct zuru_keycheck_s { +typedef struct zuru_keycheck { u8 state; u8 progressing; u16 last_controller; u8 zurumode_enabled; } zuru_keycheck; -typedef struct { // This needs to be researched and in its corresponding file tbh +typedef struct { u8 pad_pattern; void (*callback)(void*); void* callback_param; @@ -24,12 +24,11 @@ typedef struct { // This needs to be researched and in its corresponding file tb } padmgr; extern padmgr padmgr_class; -extern zuru_keycheck zuruKeyCheck; - +extern s32 zurumode_flag; void zurumode_cleanup(void); int zerucheck_init(zuru_keycheck* key_check); -void zurumode_update(void); +s32 zurumode_update(void); void zurumode_callback(void* padmgr); int zerucheck_key_check(zuru_keycheck* key_check, u32 controller); diff --git a/rel/zurumode/zurumode.c b/rel/zurumode/zurumode.c index 822dd95e..8d1ce770 100644 --- a/rel/zurumode/zurumode.c +++ b/rel/zurumode/zurumode.c @@ -1,5 +1,8 @@ #include "zurumode.h" +static zuru_keycheck zuruKeyCheck; +static s32 zurumode_flag; + int zerucheck_init(zuru_keycheck* key_check) { key_check->zurumode_enabled = FALSE; key_check->state = ZURUMODE_STAGE_BEGIN_e; @@ -224,7 +227,7 @@ void zurumode_callback(padmgr* padmgr) { zurumode_update(); } -// Padmgr struct might be huge lol, anyway I think it's matched, +// Padmgr struct is unknown, anyway I think it's matched, //just that the struct that is declared here it's not that accurate //and pad_pattern is at 0x42E @@ -237,7 +240,7 @@ void zurumode_init(void){ zurumode_update(); } -void zurumode_cleanup(void) { // Hm, this looks like PADMGR_UNSET_RETRACE_CALLBACK macro lol +void zurumode_cleanup(void) { // Hm, this looks like PADMGR_UNSET_RETRACE_CALLBACK macro if ((padmgr_class.callback2 == &zurumode_callback) && (padmgr_class.callback2_param == &padmgr_class)) { padmgr_class.callback2 = NULL; padmgr_class.callback2_param = NULL; diff --git a/rel/zurumode/zurumode_cleanup.c b/rel/zurumode/zurumode_cleanup.c index 328f3b4c..3c213677 100644 --- a/rel/zurumode/zurumode_cleanup.c +++ b/rel/zurumode/zurumode_cleanup.c @@ -1,6 +1,5 @@ #include "zurumode.h" -extern s32 zurumode_flag; void zurumode_cleanup(void) { // Hm, this looks like PADMGR_UNSET_RETRACE_CALLBACK macro lol if ((padmgr_class.callback2 == &zurumode_callback) && (padmgr_class.callback2_param == &padmgr_class)) { padmgr_class.callback2 = NULL; diff --git a/rel/zurumode/zurumode_init.c b/rel/zurumode/zurumode_init.c index 6943ac32..1ef8cd96 100644 --- a/rel/zurumode/zurumode_init.c +++ b/rel/zurumode/zurumode_init.c @@ -1,6 +1,5 @@ #include "zurumode.h" -extern s32 zurumode_flag; void zurumode_init(void){ zurumode_flag = 0; zerucheck_init(&zuruKeyCheck); diff --git a/rel/zurumode/zurumode_update.c b/rel/zurumode/zurumode_update.c index 776aa048..b81a1836 100644 --- a/rel/zurumode/zurumode_update.c +++ b/rel/zurumode/zurumode_update.c @@ -1,6 +1,5 @@ #include "zurumode.h" -extern s32 zurumode_flag; s32 zurumode_update() { s32 flag_now; s32 zurumode_now; diff --git a/tools/libyaz0 b/tools/libyaz0 deleted file mode 160000 index 5b598640..00000000 --- a/tools/libyaz0 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5b5986401dbdc39fee9011b8848a095ca7646f77 diff --git a/tools/yaz0 b/tools/yaz0 new file mode 100644 index 0000000000000000000000000000000000000000..0298c7263db10bdb5240956aae3b3bdc349a872d GIT binary patch literal 49672 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