Files
ac-decomp/rel/zurumode.c
T
2023-03-22 17:42:02 -04:00

242 lines
6.8 KiB
C

#include "zurumode.h"
#include "m_nmibuf.h"
#include "padmgr.h"
#include "jsyswrap.h"
#include "types.h"
static zuru_keycheck zuruKeyCheck;
s32 zurumode_flag;
static 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
*/
static 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;
}
static s32 zurumode_update() {
s32 flag_now;
s32 zurumode_now;
flag_now = zurumode_flag;
zurumode_flag = zurumode_now = (APPNMI_ZURUMODE_GET()) ? (APPNMI_ZURUMODE2_GET() ? 2 : 1) : 0;
if (flag_now != zurumode_now) {
OSReport("zurumode_flag が %d から %d に変更されました\n", flag_now,
zurumode_now);
if (zurumode_flag != 0) {
if (APPNMI_TESTMODE_GET() || APPNMI_ZURUMODE_GET()) {
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;
}
static void zurumode_callback(void* param) {
zerucheck_key_check(&zuruKeyCheck, (u32)(((padmgr*)param)->n64_pads[1].button));
if (APPNMI_DEBUGMODE_GET() ||
(APPNMI_TESTMODE_GET() && (padmgr_isConnectedController(1) != 0)) ||
(zuruKeyCheck.zurumode_enabled != 0)) {
APPNMI_ZURUMODE_SET();
} else {
APPNMI_ZURUMODE_CLR();
}
if (APPNMI_DEBUGMODE_GET() &&
(zuruKeyCheck.state != 0) && (zuruKeyCheck.zurumode_enabled == 0)) {
JW_JUTReport(60, 90, 1, "ZURU %d/%d", zuruKeyCheck.state,
zuruKeyCheck.progressing);
}
zurumode_update();
}
extern void zurumode_init(void) {
zurumode_flag = 0;
zerucheck_init(&zuruKeyCheck);
zuruKeyCheck.zurumode_enabled = APPNMI_ZURUMODE_GET();
padmgr_setClient2(zurumode_callback, &padmgr_class);
zurumode_update();
}
extern void zurumode_cleanup(void) {
padmgr_removeClient2(zurumode_callback, &padmgr_class);
zurumode_flag = 0;
}