From 206bc731c1d0df621c1f0d256f3b5994f9b5e900 Mon Sep 17 00:00:00 2001 From: Prakxo Date: Mon, 9 Jan 2023 20:34:45 +0100 Subject: [PATCH] matched zurumode wooo --- config/rel_slices.yml | 2 + include/zurumode.h | 22 ++- rel/zurumode/zurumode.c | 246 ++++++++++++++++++++++++++++++++ rel/zurumode/zurumode_cleanup.c | 14 +- rel/zurumode/zurumode_init.c | 11 ++ rel/zurumode/zurumode_update.c | 2 + 6 files changed, 280 insertions(+), 17 deletions(-) create mode 100644 rel/zurumode/zurumode.c create mode 100644 rel/zurumode/zurumode_init.c diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 66155206..d18dade3 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -6,6 +6,8 @@ zurumode/zerucheck_key_check.c: .text: [0x8040EB50, 0x8040EDA8] 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. m_random_field/mRF_MakePerfectBit.c: diff --git a/include/zurumode.h b/include/zurumode.h index c484b7e3..10f29cd4 100644 --- a/include/zurumode.h +++ b/include/zurumode.h @@ -15,8 +15,24 @@ typedef struct zuru_keycheck_s { u8 zurumode_enabled; } zuru_keycheck; +typedef struct { // This needs to be researched and in its corresponding file tbh + u8 pad_pattern; + void (*callback)(void*); + void* callback_param; + void (*callback2)(void*); + void* callback2_param; +} 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); +void zurumode_callback(void* padmgr); +int zerucheck_key_check(zuru_keycheck* key_check, u32 controller); + #define ZURUMODE_RESET 0 #define ZURUMODE_PROGRESSING 1 @@ -62,8 +78,4 @@ enum zurumode_stage { ZURUMODE_STAGE_FINAL_e = ZURUMODE_STAGE_11_e }; -enum zurumode_flags { - ZURUMODE_DISABLED_e = 0 << 0, - ZURUMODE_ENABLED_e = 1 << 0 -}; #endif \ No newline at end of file diff --git a/rel/zurumode/zurumode.c b/rel/zurumode/zurumode.c new file mode 100644 index 00000000..822dd95e --- /dev/null +++ b/rel/zurumode/zurumode.c @@ -0,0 +1,246 @@ +#include "zurumode.h" + +int zerucheck_init(zuru_keycheck* key_check) { + key_check->zurumode_enabled = FALSE; + key_check->state = ZURUMODE_STAGE_BEGIN_e; + key_check->progressing = ZURUMODE_RESET; + key_check->last_controller = 0; +} + +/** + * Checks that the current controller state is correct + * and updates zurumode enable progress accordingly + * + * Zurumode code: + * 1) L + R -> L + R + Z (Hold L & R, then press Z) + * 2) D-Pad Up + * 3) C-Stick Down + * 4) C-Stick Up + * 5) D-Pad Down + * 6) D-Pad Left + * 7) C-Stick Left + * 8) C-Stick Right + * 9) D-Pad Right + * 10) A + B + * 11) Start + * + * Params: + * key_check zurumode keycheck struct + * controller current controller state + * + * returns int zurumodeEnabled + */ +int zerucheck_key_check(zuru_keycheck* key_check, u32 controller) { + u32 controller_new; /* Buttons pressed on the current frame only */ + int state = key_check->state; /* Keycheck state */ + int progressing = key_check->progressing; /* Progressing through keycheck */ + + if (state != ZURUMODE_STAGE_FINAL_e) { + u16 controller_now = controller; + controller_new = + controller_now & (key_check->last_controller ^ controller_now); + key_check->last_controller = controller_now; + + if (controller_now == BUTTON_NONE && progressing == ZURUMODE_PROGRESSING) { + progressing = ZURUMODE_RESET; + } else if (controller_new != BUTTON_NONE) { + if (progressing == ZURUMODE_PROGRESSING) { + state = ZURUMODE_STAGE_BEGIN_e; + } + + switch (state) { + case ZURUMODE_STAGE_BEGIN_e: + /* L & R must be held first, then Z */ + if (controller_now == (BUTTON_R | BUTTON_L | BUTTON_Z) && + controller_new == BUTTON_Z) { + state = ZURUMODE_STAGE_1_e; + progressing = ZURUMODE_PROGRESSING; + } + break; + + case ZURUMODE_STAGE_1_e: + if (controller_new == BUTTON_DUP) { + state = ZURUMODE_STAGE_2_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_2_e: + if (controller_new == BUTTON_CDOWN) { + state = ZURUMODE_STAGE_3_e; + progressing = ZURUMODE_PROGRESSING; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_3_e: + if (controller_new == BUTTON_CUP) { + state = ZURUMODE_STAGE_4_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_4_e: + if (controller_new == BUTTON_DDOWN) { + state = ZURUMODE_STAGE_5_e; + progressing = ZURUMODE_PROGRESSING; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_5_e: + if (controller_new == BUTTON_DLEFT) { + state = ZURUMODE_STAGE_6_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_6_e: + if (controller_new == BUTTON_CLEFT) { + state = ZURUMODE_STAGE_7_e; + progressing = ZURUMODE_PROGRESSING; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_7_e: + if (controller_new == BUTTON_CRIGHT) { + state = ZURUMODE_STAGE_8_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_8_e: + if (controller_new == BUTTON_DRIGHT) { + state = ZURUMODE_STAGE_9_e; + progressing = ZURUMODE_PROGRESSING; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_9_e: + if (controller_new == (BUTTON_B | BUTTON_A)) { + state = ZURUMODE_STAGE_10_e; + } else if (controller_new == BUTTON_A) { + state = ZURUMODE_STAGE_91_e; + } else if (controller_new == BUTTON_B) { + state = ZURUMODE_STAGE_92_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_91_e: + if (controller_new == BUTTON_B) { + state = ZURUMODE_STAGE_10_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_92_e: + if (controller_new == BUTTON_A) { + state = ZURUMODE_STAGE_10_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + + case ZURUMODE_STAGE_10_e: + if (controller_new == BUTTON_START) { + state = ZURUMODE_STAGE_FINAL_e; + } else { + state = ZURUMODE_STAGE_BEGIN_e; + } + break; + } + } + } + + if (state == ZURUMODE_STAGE_FINAL_e) { + /* Zurumode code has been correctly input */ + key_check->zurumode_enabled ^= TRUE; + key_check->state = ZURUMODE_STAGE_BEGIN_e; + key_check->progressing = ZURUMODE_RESET; + } else { + key_check->state = state; + key_check->progressing = progressing; + } + + return key_check->zurumode_enabled; +} + +s32 zurumode_update() { + s32 flag_now; + s32 zurumode_now; + + flag_now = zurumode_flag; + zurumode_now = osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX]; + + if (zurumode_now & 1) { + zurumode_now = (zurumode_now >> 3) & 1; + zurumode_now = (int)(zurumode_now + 1); + } + else { + zurumode_now = 0; + } + zurumode_flag = zurumode_now; + + if (flag_now != zurumode_now) { + OSReport("zurumode_flag が %d から %d に変更されました\n", flag_now, zurumode_now); + if (zurumode_flag != 0) { + if ((osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] & 0x40) || (osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] & 1)) { + JC_JUTAssertion_changeDevice(3); + JC_JUTDbPrint_setVisible(JC_JUTDbPrint_getManager(), 1); + } + } else { + JC_JUTAssertion_changeDevice(2); + JC_JUTDbPrint_setVisible(JC_JUTDbPrint_getManager(), 0); + } + } + return zurumode_flag; +} + +void zurumode_callback(padmgr* padmgr) { + u32 val; + zerucheck_key_check(&zuruKeyCheck, (u32)(padmgr->pad_pattern)); + val = osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX]; + if ((val & 0x20) || ((val & 0x40) && (padmgr_isConnectedController(1) != 0)) || (zuruKeyCheck.zurumode_enabled != 0)){ + osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] = (osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] | 1); + } else { + osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] = osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] & ~0x1; + } + if ((osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] & 0x20) && (zuruKeyCheck.state != 0) && (zuruKeyCheck.zurumode_enabled == 0)){ + JW_JUTReport(0x3c, 0x5a, 1, "ZURU %d %d", zuruKeyCheck.state, zuruKeyCheck.progressing); + } + zurumode_update(); + } + +// Padmgr struct might be huge lol, 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 + +void zurumode_init(void){ + zurumode_flag = 0; + zerucheck_init(&zuruKeyCheck); + zuruKeyCheck.zurumode_enabled = osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] & 1; + padmgr_class.callback2 = zurumode_callback; + padmgr_class.callback2_param = &padmgr_class; + zurumode_update(); +} + +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; + padmgr_class.callback2_param = NULL; + } + zurumode_flag = 0; +} diff --git a/rel/zurumode/zurumode_cleanup.c b/rel/zurumode/zurumode_cleanup.c index 2d1f222f..328f3b4c 100644 --- a/rel/zurumode/zurumode_cleanup.c +++ b/rel/zurumode/zurumode_cleanup.c @@ -1,17 +1,7 @@ #include "zurumode.h" -typedef struct { - u8 pad_pattern; - void (*callback)(void*); - void* callback_param; - void (*callback2)(void*); - void* callback2_param; -} padmgr; - -extern padmgr padmgr_class; -extern void zurumode_callback(void*); - -extern void zurumode_cleanup(void) { // Hm, this looks like PADMGR_UNSET_RETRACE_CALLBACK macro lol +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; padmgr_class.callback2_param = NULL; diff --git a/rel/zurumode/zurumode_init.c b/rel/zurumode/zurumode_init.c new file mode 100644 index 00000000..6943ac32 --- /dev/null +++ b/rel/zurumode/zurumode_init.c @@ -0,0 +1,11 @@ +#include "zurumode.h" + +extern s32 zurumode_flag; +void zurumode_init(void){ + zurumode_flag = 0; + zerucheck_init(&zuruKeyCheck); + zuruKeyCheck.zurumode_enabled = osAppNMIBuffer[OS_APP_NMI_ZURUMODE_IDX] & 1; + padmgr_class.callback2 = zurumode_callback; + padmgr_class.callback2_param = &padmgr_class; + zurumode_update(); +} \ No newline at end of file diff --git a/rel/zurumode/zurumode_update.c b/rel/zurumode/zurumode_update.c index ee185341..776aa048 100644 --- a/rel/zurumode/zurumode_update.c +++ b/rel/zurumode/zurumode_update.c @@ -1,4 +1,6 @@ #include "zurumode.h" + +extern s32 zurumode_flag; s32 zurumode_update() { s32 flag_now; s32 zurumode_now;