papermario/src/input.c
Ethan Roseman 6ea08f8257
Map funcs and update_input (#888)
* warning

* func_80240098_BBD238

* hos/kkj stuff

* update_input is deated (thanks arienain on decomp.me\!)

* 4 mo
2022-12-15 10:56:16 +09:00

241 lines
6.5 KiB
C

#include "common.h"
#include "nu/nusys.h"
extern OSContPad D_8009A5B8;
void func_800287F0(void) {
gGameStatusPtr->currentButtons[0] = 0;
gGameStatusPtr->pressedButtons[0] = 0;
gGameStatusPtr->heldButtons[0] = 0;
gGameStatusPtr->stickX[0] = 0;
gGameStatusPtr->stickY[0] = 0;
gGameStatusPtr->prevButtons[0] = 0;
gGameStatusPtr->unk_50[0] = 4;
gGameStatusPtr->unk_48[0] = 15;
gGameStatusPtr->unk_60 = 0;
gGameStatusPtr->unk_58 = 0;
}
void func_80028838(void) {
func_800287F0();
D_8009A6A0 = 0;
D_8009A6A2 = 0;
D_8009A6A4 = 0;
D_8009A6A6 = 0;
}
void update_input(void) {
OSContPad* contData = &D_8009A5B8;
s16 handleInput = FALSE;
s16 cond1;
s32 buttons;
s16 stickX;
s16 stickY;
if (gGameStatusPtr->contBitPattern & 1) {
handleInput = TRUE;
nuContDataGet(contData, 0);
}
if (gGameStatusPtr->demoState != 0) {
if (gGameStatusPtr->demoState < 2 &&
(contData->button & (BUTTON_A | BUTTON_B | BUTTON_Z | BUTTON_START)) &&
handleInput)
{
gGameStatusPtr->demoState = 2;
}
contData->button = gGameStatusPtr->demoButtonInput;
contData->stick_x = gGameStatusPtr->demoStickX;
contData->stick_y = gGameStatusPtr->demoStickY;
handleInput = TRUE;
}
if (!handleInput) {
return;
}
stickX = contData->stick_x;
stickY = contData->stick_y;
if (stickX > 0) {
stickX -= 4;
if (stickX < 0) {
stickX = 0;
}
}
if (stickX < 0) {
stickX += 4;
if (stickX > 0) {
stickX = 0;
}
}
if (stickY > 0) {
stickY -= 4;
if (stickY < 0) {
stickY = 0;
}
}
if (stickY < 0) {
stickY += 4;
if (stickY > 0) {
stickY = 0;
}
}
gGameStatusPtr->stickX[0] = stickX;
gGameStatusPtr->stickY[0] = stickY;
buttons = contData->button;
cond1 = FALSE;
if (stickX > 0x20) {
cond1 = TRUE;
buttons |= BUTTON_STICK_RIGHT;
if (!(gGameStatusPtr->prevButtons[0] & BUTTON_STICK_RIGHT)) {
D_8009A6A0 = stickX;
} else if (D_8009A6A4 == 0) {
if (D_8009A6A0 < stickX) {
D_8009A6A0 = stickX;
}
} else {
if (D_8009A6A0 > stickX) {
D_8009A6A0 = stickX;
}
}
}
if (stickX < -0x20) {
cond1 = TRUE;
buttons |= BUTTON_STICK_LEFT;
if (!(gGameStatusPtr->prevButtons[0] & BUTTON_STICK_LEFT)) {
D_8009A6A0 = stickX;
} else if (D_8009A6A4 == 0) {
if (D_8009A6A0 > stickX) {
D_8009A6A0 = stickX;
}
} else {
if (D_8009A6A0 < stickX)
{
D_8009A6A0 = stickX;
}
}
}
if (!cond1) {
D_8009A6A4 = 0;
D_8009A6A0 = stickX;
}
cond1 = FALSE;
if (stickY > 0x20) {
cond1 = TRUE;
buttons |= BUTTON_STICK_UP;
if (!(gGameStatusPtr->prevButtons[0] & BUTTON_STICK_UP)) {
D_8009A6A2 = stickY;
} else if (D_8009A6A6 == 0) {
if (D_8009A6A2 < stickY) {
D_8009A6A2 = stickY;
}
} else {
if (D_8009A6A2 > stickY) {
D_8009A6A2 = stickY;
}
}
}
if (stickY < -0x20) {
cond1 = TRUE;
buttons |= BUTTON_STICK_DOWN;
if (!(gGameStatusPtr->prevButtons[0] & BUTTON_STICK_DOWN)) {
D_8009A6A2 = stickY;
} else if (D_8009A6A6 == 0) {
if (D_8009A6A2 > stickY) {
D_8009A6A2 = stickY;
}
} else {
if (D_8009A6A2 < stickY) {
D_8009A6A2 = stickY;
}
}
}
if (!cond1) {
D_8009A6A6 = 0;
D_8009A6A2 = stickY;
}
if (stickX > 0x20) {
if (D_8009A6A4 == 1 && stickX - D_8009A6A0 > 0x10) {
buttons &= ~BUTTON_STICK_RIGHT;
D_8009A6A4 = 0;
}
if (D_8009A6A0 - stickX > 0x10) {
D_8009A6A4 = 1;
}
}
if (stickX < -0x20) {
if (D_8009A6A4 == 1 && D_8009A6A0 - stickX > 0x10) {
buttons &= ~BUTTON_STICK_LEFT;
D_8009A6A4 = 0;
}
if (stickX - D_8009A6A0 > 0x10) {
D_8009A6A4 = 1;
}
}
if (stickY > 0x20) {
if (D_8009A6A6 == 1 && stickY - D_8009A6A2 > 0x10) {
buttons &= ~BUTTON_STICK_UP;
D_8009A6A6 = 0;
}
if (D_8009A6A2 - stickY > 0x10) {
D_8009A6A6 = 1;
}
}
if (stickY < -0x20) {
if (D_8009A6A6 == 1 && D_8009A6A2 - stickY > 0x10) {
buttons &= ~BUTTON_STICK_DOWN;
D_8009A6A6 = 0;
}
if (stickY - D_8009A6A2 > 0x10) {
D_8009A6A6 = 1;
}
}
gGameStatusPtr->currentButtons[0] = buttons;
gGameStatusPtr->pressedButtons[0] = gGameStatusPtr->currentButtons[0] ^ gGameStatusPtr->prevButtons[0];
gGameStatusPtr->pressedButtons[0] &= gGameStatusPtr->currentButtons[0];
do {
if (gGameStatusPtr->currentButtons[0] == 0) {
gGameStatusPtr->heldButtons[0] = 0;
} else if (gGameStatusPtr->prevButtons[0] != gGameStatusPtr->currentButtons[0]) {
gGameStatusPtr->heldButtons[0] = gGameStatusPtr->currentButtons[0];
gGameStatusPtr->unk_60 = -1;
gGameStatusPtr->heldButtons[0] = gGameStatusPtr->currentButtons[0] ^ gGameStatusPtr->prevButtons[0];
gGameStatusPtr->heldButtons[0] &= gGameStatusPtr->currentButtons[0];
gGameStatusPtr->unk_58 = gGameStatusPtr->unk_48[0];
} else {
if (gGameStatusPtr->unk_60 >= 0) {
gGameStatusPtr->unk_60--;
if (gGameStatusPtr->unk_60 != 0) {
gGameStatusPtr->heldButtons[0] = 0;
} else {
gGameStatusPtr->heldButtons[0] = gGameStatusPtr->currentButtons[0];
gGameStatusPtr->unk_60 = gGameStatusPtr->unk_50[0];
}
} else {
gGameStatusPtr->unk_58--;
if (gGameStatusPtr->unk_58 != 0) {
gGameStatusPtr->heldButtons[0] = 0;
} else {
gGameStatusPtr->heldButtons[0] = gGameStatusPtr->currentButtons[0];
gGameStatusPtr->unk_60 = gGameStatusPtr->unk_50[0];
}
}
}
} while (0);
gGameStatusPtr->prevButtons[0] = gGameStatusPtr->currentButtons[0];
}