matched zurumode wooo

This commit is contained in:
Prakxo
2023-01-09 20:34:45 +01:00
parent 70983ac31a
commit 206bc731c1
6 changed files with 280 additions and 17 deletions
+2
View File
@@ -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:
+17 -5
View File
@@ -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
+246
View File
@@ -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;
}
+2 -12
View File
@@ -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;
+11
View File
@@ -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();
}
+2
View File
@@ -1,4 +1,6 @@
#include "zurumode.h"
extern s32 zurumode_flag;
s32 zurumode_update() {
s32 flag_now;
s32 zurumode_now;