papermario/src/7B440.c

239 lines
6.9 KiB
C

#include "common.h"
void update_player_input(void) {
PlayerStatus* playerStatus = &gPlayerStatus;
s32 inputBufPos = playerStatus->inputBufPos;
playerStatus->stickAxis[0] = gGameStatusPtr->stickX;
playerStatus->stickAxis[1] = gGameStatusPtr->stickY;
playerStatus->currentButtons = gGameStatusPtr->currentButtons;
playerStatus->pressedButtons = gGameStatusPtr->pressedButtons;
playerStatus->heldButtons = gGameStatusPtr->heldButtons;
inputBufPos++;
if (inputBufPos >= 10) {
inputBufPos = 0;
}
playerStatus->stickXBuffer[inputBufPos] = playerStatus->stickAxis[0];
playerStatus->stickYBuffer[inputBufPos] = playerStatus->stickAxis[1];
playerStatus->currentButtonsBuffer[inputBufPos] = playerStatus->currentButtons;
playerStatus->pressedButtonsBuffer[inputBufPos] = playerStatus->pressedButtons;
playerStatus->heldButtonsBuffer[inputBufPos] = playerStatus->heldButtons;
playerStatus->inputBufPos = inputBufPos;
if (playerStatus->flags & 0x3000) {
playerStatus->stickAxis[0] = 0;
playerStatus->stickAxis[1] = 0;
playerStatus->currentButtons = 0;
playerStatus->pressedButtons = 0;
playerStatus->heldButtons = 0;
}
if (playerStatus->animFlags & 8) {
playerStatus->animFlags |= 0x200000;
playerStatus->pressedButtons |= 4;
}
}
#ifdef NON_MATCHING
void reset_player_status(void) {
s32* temp8010C92C = &D_8010C92C;
PlayerStatus* playerStatus = &gPlayerStatus;
MapConfig* mapConfig;
f32 one;
f32* floatsTemp;
D_8010C96C = -1;
D_8010C954 = 0;
D_8010C920 = 0;
D_8010C940 = 0;
D_8010C958 = 0;
*temp8010C92C = 0;
D_8010C95C = 0;
D_8010C980 = 0;
D_800F7B40 = 0;
D_800F7B44 = 0;
D_8010C938 = 0;
D_8010C990 = 0.0f;
playerStatus->unk_0D = 1;
playerStatus->renderMode = 0xD;
playerStatus->alpha1 = 255;
playerStatus->alpha2 = 255;
gGameStatusPtr->peachFlags &= ~0x8;
gGameStatusPtr->peachFlags &= ~0x10;
one = 1.0f;
if (gGameStatusPtr->peachFlags & 1) {
playerStatus->colliderHeight = 55;
playerStatus->colliderDiameter = 38;
playerStatus->animFlags |= 0x1000;
if (gGameStatusPtr->peachFlags & 2) {
*temp8010C92C = 2;
playerStatus->peachDisguise = gGameStatusPtr->peachDisguise;
}
} else {
playerStatus->colliderHeight = 37;
playerStatus->colliderDiameter = 26;
gGameStatusPtr->peachAnimIdx = 0;
}
// This grossness is needed for matching
floatsTemp = &D_800F7B70[0];
playerStatus->walkSpeed = *(floatsTemp++) * one;
playerStatus->runSpeed = *(floatsTemp++) * one;
playerStatus->unk_6C = *(floatsTemp++) * one;
set_action_state(ACTION_STATE_IDLE);
playerStatus->currentSpeed = 0.0f;
playerStatus->targetYaw = 0.0f;
playerStatus->unk_64 = 0.0f;
playerStatus->unk_88 = 0.0f;
playerStatus->anim = 0;
playerStatus->decorationList = 0;
playerStatus->position.x = 0.0f;
playerStatus->position.y = 0.0f;
playerStatus->position.z = 0.0f;
playerStatus->currentYaw = 0.0f;
playerStatus->unk_90 = 0.0f;
playerStatus->unk_94 = 0;
playerStatus->unk_98 = 0;
playerStatus->unk_9C = 0;
mapConfig = gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID].config;
if (mapConfig->entryList != NULL) {
if (gGameStatusPtr->entryID < mapConfig->entryCount) {
playerStatus->position.x = (*mapConfig->entryList)[gGameStatusPtr->entryID].x;
playerStatus->position.y = (*mapConfig->entryList)[gGameStatusPtr->entryID].y;
playerStatus->position.z = (*mapConfig->entryList)[gGameStatusPtr->entryID].z;
playerStatus->currentYaw = (*mapConfig->entryList)[gGameStatusPtr->entryID].yaw;
}
}
gCameras->targetPos.x = playerStatus->position.x;
gCameras->targetPos.y = playerStatus->position.y;
gCameras->targetPos.z = playerStatus->position.z;
phys_reset_spin_history(mapConfig);
mem_clear(&D_8010F250, sizeof(Temp8010F250));
}
#else
INCLUDE_ASM(s32, "7B440", reset_player_status);
#endif
void get_packed_buttons(s32* arg0) {
PlayerStatus* playerStatus = &gPlayerStatus;
*arg0 = (u16)playerStatus->currentButtons | (playerStatus->pressedButtons << 16);
}
void player_input_to_move_vector(f32* angle, f32* magnitude) {
PlayerStatus* playerStatus = &gPlayerStatus;
f32 stickAxisX;
f32 stickAxisY;
f32 ang;
f32 mag;
f32 magMax = 70.0f;
stickAxisX = playerStatus->stickAxis[0];
stickAxisY = -playerStatus->stickAxis[1];
mag = dist2D(0.0f, 0.0f, stickAxisX, stickAxisY);
if (mag >= magMax) {
mag = magMax;
}
ang = clamp_angle(atan2(0.0f, 0.0f, stickAxisX, stickAxisY) + gCameras[0].currentYaw);
if (mag == 0.0f) {
ang = playerStatus->targetYaw;
}
*angle = ang;
*magnitude = mag;
}
void game_input_to_move_vector(f32* arg0, f32* arg1) {
PlayerStatus* playerStatus = &gPlayerStatus;
f32 stickX = gGameStatusPtr->stickX;
f32 stickY = -gGameStatusPtr->stickY;
f32 tempMax = 70.0f;
f32 temp1;
f32 temp2;
temp1 = dist2D(0.0f, 0.0f, stickX, stickY);
if (temp1 >= tempMax) {
temp1 = tempMax;
}
temp2 = clamp_angle(atan2(0.0f, 0.0f, stickX, stickY) + gCameras[0].currentYaw);
if (temp1 == 0.0f) {
temp2 = playerStatus->targetYaw;
}
*arg0 = temp2;
*arg1 = temp1;
}
// tail merge crap
#ifdef NON_MATCHING
void func_800E24F8(void) {
Shadow* playerShadow = get_shadow_by_index(gPlayerStatus.shadowID);
Camera* camera = &gCameras[0];
f32 x = playerShadow->rotation.x + 180.0;
f32 z = playerShadow->rotation.z + 180.0;
if (x != 0.0f || z != 0.0f) {
switch (gPlayerStatus.actionState) {
case 3:
case 8:
camera->unk_49C = 32.0f;
break;
case 1:
case 2:
if (camera->targetScreenCoords[1] < 130) {
camera->unk_49C = 3.0f;
return;
}
if (D_8010C9A0++ > 10) {
D_8010C9A0 = 10;
camera->unk_49C -= 2.0f;
if (camera->unk_49C < 3.0f) {
camera->unk_49C = 3.0f;
}
}
break;
case 17:
camera->unk_49C = 3.0f;
break;
default:
D_8010C9A0 = 0;
camera->unk_49C -= 2.0f;
if (camera->unk_49C < 3.0f) {
camera->unk_49C = 3.0f;
}
break;
}
} else {
switch (gPlayerStatus.actionState) {
case 1:
case 2:
case 3:
case 0x11:
camera->unk_49C = 7.2f;
break;
default:
camera->unk_49C = 24.0f;
break;
}
}
}
#else
INCLUDE_ASM(s32, "7B440", func_800E24F8);
#endif