diff options
| author | Prakxo <87568477+Prakxo@users.noreply.github.com> | 2023-08-11 03:49:09 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-08-10 19:49:09 -0700 |
| commit | d9a77b4949e78c889d5cc2c7554cce4a9b12992c (patch) | |
| tree | c210d468407bbfff5ce3d50b3e5c441684150489 /src/code | |
| parent | 380681908d5dee98c2f335f266738233de632c93 (diff) | |
zurumode OK (#46)
* zurumode OK
* forgor to rename zuruKeyCheck
* should remove warnings
* refactor
* rename pad to mgr
* refactor 2
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/zurumode.c | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/src/code/zurumode.c b/src/code/zurumode.c new file mode 100644 index 0000000..8c90d93 --- /dev/null +++ b/src/code/zurumode.c @@ -0,0 +1,203 @@ +#include "zurumode.h" +#include "m_nmi_buf.h" +#include "padmgr.h" + +zuruKeycheck zuruKeyCheck; + +s32 zurumode_flag = 0; + +s32 zurumode_update() { + zurumode_flag = (APPNMI_ZURUMODE_GET()) ? ((APPNMI_ZURUMODE2_GET()) ? 2 : 1) : 0; + + return zurumode_flag; +} + +s32 zerucheck_init(zuruKeycheck* keycheck) { + keycheck->state = 0; + keycheck->progressing = 0; + keycheck->lastController = 0; +} + +s32 zerucheck_key_check(zuruKeycheck* keycheck, u16 controller) { + u32 controller_now = controller; + s32 state = keycheck->state; + s32 progressing = keycheck->progressing; + u32 controller_new; + + if (state != ZURUMODE_STAGE_FINAL) { + controller_new = (keycheck->lastController ^ controller_now) & controller_now; + keycheck->lastController = controller_now; + + if ((controller == 0) && (progressing == 1)) { + progressing = 0; + } else if (controller_new != 0) { + if (progressing == 1) { + state = 0; + } + switch (state) { + + case ZURUMODE_STAGE_0: + + if (controller_now == (R_TRIG | L_TRIG | Z_TRIG) && controller_new == Z_TRIG) { + state = ZURUMODE_STAGE_1; + progressing = 1; + } + break; + + case ZURUMODE_STAGE_1: + + if (controller_new == U_JPAD) { + state = ZURUMODE_STAGE_2; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_2: + + if (controller_new == D_CBUTTONS) { + state = ZURUMODE_STAGE_3; + progressing = 1; + } else { + state = ZURUMODE_STAGE_0; + } + break; + + case ZURUMODE_STAGE_3: + + if (controller_new == U_CBUTTONS) { + state = ZURUMODE_STAGE_4; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_4: + + if (controller_new == D_JPAD) { + state = ZURUMODE_STAGE_5; + progressing = 1; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_5: + + if (controller_new == L_JPAD) { + state = ZURUMODE_STAGE_6; + } else { + state = ZURUMODE_STAGE_0; + } + break; + + case ZURUMODE_STAGE_6: + + if (controller_new == L_CBUTTONS) { + state = ZURUMODE_STAGE_7; + progressing = 1; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_7: + + if (controller_new == R_CBUTTONS) { + state = ZURUMODE_STAGE_8; + } else { + state = ZURUMODE_STAGE_0; + } + break; + + case ZURUMODE_STAGE_8: + + if (controller_new == R_JPAD) { + state = ZURUMODE_STAGE_9; + progressing = 1; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_9: + + if (controller_new == (B_BUTTON | A_BUTTON)) { + state = ZURUMODE_STAGE_10; + } else if (controller_new == A_BUTTON) { + state = ZURUMODE_STAGE_91; + } else if (controller_new == B_BUTTON) { + state = ZURUMODE_STAGE_92; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_91: + + if (controller_new == B_BUTTON) { + state = ZURUMODE_STAGE_10; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_92: + + if (controller_new == A_BUTTON) { + state = ZURUMODE_STAGE_10; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + + case ZURUMODE_STAGE_10: + + if (controller_new == START_BUTTON) { + state = ZURUMODE_STAGE_FINAL; + } else { + state = ZURUMODE_STAGE_0; + } + + break; + } + } + } + + keycheck->state = state; + keycheck->progressing = progressing; + + return state == ZURUMODE_STAGE_FINAL; +} + +void zurumode_callback(void* p) { + Padmgr* mgr = p; + + if (zerucheck_key_check(&zuruKeyCheck, mgr->pads[1].button)) { + zerucheck_init(&zuruKeyCheck); + APPNMI_ZURUMODE_FLP(); + zurumode_update(); + if ((mgr->pads[0].button) & 0x80) { + APPNMI_ZURUMODE3_FLP(); + } + } +} + +void zurumode_init() { + zurumode_update(); + zerucheck_init(&zuruKeyCheck); + PADMGR_SET_RETRACE_CALLACK(&zurumode_callback, &padmgr_class); +} + +void zurumode_cleanup() { + PADMGR_UNSET_RETRACE_CALLACK(&zurumode_callback, &padmgr_class); + zurumode_flag = 0; +} |
