diff options
author | Mateusz Naściszewski <matin1111@wp.pl> | 2020-12-26 06:57:02 +0100 |
---|---|---|
committer | Seth Barberee <seth.barberee@gmail.com> | 2020-12-28 20:13:22 -0600 |
commit | 6362345b04a04fefec25fdb29fd1b1bb9f8da163 (patch) | |
tree | 84059fefe70ebab180e8f5efcc5d2208abd28275 /src/input.c | |
parent | b64320b043fe0a774327d7d880e9f16605db54ee (diff) |
Decompile UpdateInput
and some other minor stuff.
Diffstat (limited to 'src/input.c')
-rw-r--r-- | src/input.c | 99 |
1 files changed, 81 insertions, 18 deletions
diff --git a/src/input.c b/src/input.c index 99d894b..91b20ac 100644 --- a/src/input.c +++ b/src/input.c @@ -4,23 +4,26 @@ EWRAM_DATA struct Input gUnknown_2025600; EWRAM_DATA struct UnkInputStruct1 gUnknown_20255F0; EWRAM_DATA struct UnkInputStruct1 gUnknown_2025638; -EWRAM_DATA struct UnkInputStruct1 gUnknown_2025648; +EWRAM_DATA struct UnkInputStruct1 gCurrentInputs; +EWRAM_DATA struct UnkInputStruct1 gLastInputs; EWRAM_DATA struct UnkInputStruct2 gUnknown_2025668; -EWRAM_DATA u32 gUnknown_202562C; +EWRAM_DATA u32 gUnusedScrambledInputJunk; + +void ReadKeyInput(struct UnkInputStruct1 *r0); void InitInput(void) { - gUnknown_20255F0.unk0 = 0; - gUnknown_20255F0.unk2 = 0; + gUnknown_20255F0.held = 0; + gUnknown_20255F0.pressed = 0; gUnknown_20255F0.unk4 = 0; gUnknown_20255F0.unk6 = 0; - gUnknown_2025638.unk0 = 0; - gUnknown_2025638.unk2 = 0; + gUnknown_2025638.held = 0; + gUnknown_2025638.pressed = 0; gUnknown_2025638.unk4 = 0; gUnknown_2025638.unk6 = 0; - gUnknown_202562C = 4854977; // ????? (0x4a14c1) + gUnusedScrambledInputJunk = 0x4a14c1; // seems like random keyboard mashing (see UpdateInput) gUnknown_2025600.unk20 = 0; gUnknown_2025600.unk0 = 0xffff; // probably a mask @@ -40,16 +43,16 @@ void InitInput(void) gUnknown_2025600.unk28 = 0; gUnknown_2025600.unk29 = 0; - gUnknown_2025668.unk0 = 0; - gUnknown_2025668.unk2 = 0; + gUnknown_2025668.holdTimerB = 0; + gUnknown_2025668.holdTimerR = 0; } void sub_800485C(void) { gUnknown_20255F0 = gUnknown_2025638; - gUnknown_2025638.unk0 = 0; - gUnknown_2025638.unk2 = 0; + gUnknown_2025638.held = 0; + gUnknown_2025638.pressed = 0; gUnknown_2025638.unk4 = 0; gUnknown_2025638.unk6 = 0; @@ -107,18 +110,18 @@ u8 sub_80048CC(void) void sub_80048D0(void) { gUnknown_20255F0.unk4 = 0; - gUnknown_2025648.unkC = 0; - gUnknown_2025648.unk8 = 0; - gUnknown_2025668.unk0 = 0x3e7; - gUnknown_2025668.unk2 = 0x3e7; + gCurrentInputs.repeatTimer = 0; + gCurrentInputs.unk8 = 0; + gUnknown_2025668.holdTimerB = 999; + gUnknown_2025668.holdTimerR = 999; } void sub_80048F8(void) { - gUnknown_20255F0.unk2 = 0; - gUnknown_2025638.unk2 = 0; - gUnknown_2025648.unk2 = 0; + gUnknown_20255F0.pressed = 0; + gUnknown_2025638.pressed = 0; + gCurrentInputs.pressed = 0; } void sub_8004914(void) @@ -142,3 +145,63 @@ void sub_8004914(void) gUnknown_2025600.unk29 = 0; } + +void UpdateInput(void) +{ + gLastInputs = gCurrentInputs; + + ReadKeyInput(&gCurrentInputs); + + gCurrentInputs.pressed = (gLastInputs.held ^ gCurrentInputs.held) & gCurrentInputs.held; + + if (gCurrentInputs.held) { + // 0xF0 -- DPAD buttons + if ((gCurrentInputs.unk8 & 0xf0) == (gCurrentInputs.held & 0xf0)) { + if (gCurrentInputs.repeatTimer < 50) + gCurrentInputs.repeatTimer = gCurrentInputs.repeatTimer + 1; + } else { + gCurrentInputs.unk8 = gCurrentInputs.held & 0xf0; + gCurrentInputs.repeatTimer = 1; + } + } else { + gCurrentInputs.repeatTimer = 0; + gCurrentInputs.unk8 = 0; + } + + if (gCurrentInputs.repeatTimer == 1) { + gCurrentInputs.unk4 = (gCurrentInputs.unk8 & 0xf0) | gCurrentInputs.pressed; + } else if (gCurrentInputs.repeatTimer == 48) { + gCurrentInputs.repeatTimer = 43; + gCurrentInputs.unk4 = (gCurrentInputs.unk8 & 0xf0) | gCurrentInputs.pressed; + } else { + gCurrentInputs.unk4 = 0; + } + gCurrentInputs.unk6 = 0; + + if (gCurrentInputs.held & B_BUTTON) { + if (gUnknown_2025668.holdTimerB < 100) + gUnknown_2025668.holdTimerB++; + } else if (1 < gUnknown_2025668.holdTimerB && gUnknown_2025668.holdTimerB < 12) { + gCurrentInputs.unk6 = B_BUTTON; + gUnknown_2025668.holdTimerB = 0; + } else { + gUnknown_2025668.holdTimerB = 0; + } + + if (gCurrentInputs.held & R_BUTTON) { + if (gUnknown_2025668.holdTimerR < 100) + gUnknown_2025668.holdTimerR++; + } else if (1 < gUnknown_2025668.holdTimerR && gUnknown_2025668.holdTimerR < 12) { + gCurrentInputs.unk6 |= R_BUTTON; + gUnknown_2025668.holdTimerR = 0; + } else { + gUnknown_2025668.holdTimerR = 0; + } + + gUnknown_2025638.held |= gCurrentInputs.held; + gUnknown_2025638.pressed |= gCurrentInputs.pressed; + gUnknown_2025638.unk4 |= gCurrentInputs.unk4; + gUnknown_2025638.unk6 |= gCurrentInputs.unk6; + + gUnusedScrambledInputJunk *= gCurrentInputs.held | 0x54a1c41; // very similar to odd constant in InitInput - probably keymashing +} |