papermario/src/7B440.c

244 lines
7.9 KiB
C

#include "common.h"
s32 PeachDisguiseNpcIndex;
Entity* TweesterTouchingPartner;
Entity* TweesterTouchingPlayer;
s32 PrevPlayerDirection;
s32 PlayerRunStateTime;
f32 PlayerNormalYaw;
f32 PlayerNormalPitch;
PlayerSpinState gPlayerSpinState;
BSS s32 PlayerYInterpUpdateDelay;
void update_player_input(void) {
PlayerStatus* playerStatus = &gPlayerStatus;
s32 inputBufPos = playerStatus->inputBufPos;
playerStatus->stickAxis[0] = gGameStatusPtr->stickX[0];
playerStatus->stickAxis[1] = gGameStatusPtr->stickY[0];
playerStatus->curButtons = gGameStatusPtr->curButtons[0];
playerStatus->pressedButtons = gGameStatusPtr->pressedButtons[0];
playerStatus->heldButtons = gGameStatusPtr->heldButtons[0];
inputBufPos++;
if (inputBufPos >= 10) {
inputBufPos = 0;
}
playerStatus->stickXBuffer[inputBufPos] = playerStatus->stickAxis[0];
playerStatus->stickYBuffer[inputBufPos] = playerStatus->stickAxis[1];
playerStatus->curButtonsBuffer[inputBufPos] = playerStatus->curButtons;
playerStatus->pressedButtonsBuffer[inputBufPos] = playerStatus->pressedButtons;
playerStatus->heldButtonsBuffer[inputBufPos] = playerStatus->heldButtons;
playerStatus->inputBufPos = inputBufPos;
if (playerStatus->flags & (PS_FLAG_INPUT_DISABLED | PS_FLAG_NO_STATIC_COLLISION)) {
playerStatus->stickAxis[0] = 0;
playerStatus->stickAxis[1] = 0;
playerStatus->curButtons = 0;
playerStatus->pressedButtons = 0;
playerStatus->heldButtons = 0;
}
if (playerStatus->animFlags & PA_FLAG_FORCE_USE_PARTNER) {
playerStatus->animFlags |= PA_FLAG_PARTNER_USAGE_FORCED;
playerStatus->pressedButtons |= 4;
}
}
void reset_player_status(void) {
PlayerStatus* playerStatus = &gPlayerStatus;
MapSettings* mapSettings;
f32 one;
f32* floatsTemp;
PeachDisguiseNpcIndex = -1;
TweesterTouchingPartner = NULL;
PulseStoneNotificationCallback = NULL;
TalkNotificationCallback = NULL;
InteractNotificationCallback = NULL;
D_8010C92C = 0;
PrevPlayerDirection = 0;
PlayerRunStateTime = 0;
PrevPlayerCamRelativeYaw = 0;
D_800F7B44 = 0;
PlayerNormalYaw = 0;
PlayerNormalPitch = 0.0f;
playerStatus->availableDisguiseType = 1;
playerStatus->renderMode = RENDER_MODE_ALPHATEST;
playerStatus->curAlpha = 255;
playerStatus->prevAlpha = 255;
gGameStatusPtr->peachFlags &= ~PEACH_FLAG_BLOCK_NEXT_DISGUISE;
gGameStatusPtr->peachFlags &= ~PEACH_FLAG_DEPRESSED;
one = 1.0f;
if (gGameStatusPtr->peachFlags & PEACH_FLAG_IS_PEACH) {
playerStatus->colliderHeight = 55;
playerStatus->colliderDiameter = 38;
playerStatus->animFlags |= PA_FLAG_USING_PEACH_PHYSICS;
if (gGameStatusPtr->peachFlags & PEACH_FLAG_DISGUISED) {
D_8010C92C = 2;
playerStatus->peachDisguise = gGameStatusPtr->peachDisguise;
}
} else {
playerStatus->colliderHeight = 37;
playerStatus->colliderDiameter = 26;
gGameStatusPtr->peachBakingIngredient = PEACH_BAKING_NONE;
}
// TODO required to match
floatsTemp = &(&D_800F7B74)[-1]; // index of 0 does not work
playerStatus->walkSpeed = *floatsTemp++ * one;
playerStatus->runSpeed = *floatsTemp++ * one;
playerStatus->maxJumpSpeed = *floatsTemp++ * one;
set_action_state(ACTION_STATE_IDLE);
playerStatus->curSpeed = 0.0f;
playerStatus->targetYaw = 0.0f;
playerStatus->overlapPushAmount = 0.0f;
playerStatus->overlapPushYaw = 0.0f;
playerStatus->anim = 0;
playerStatus->timeInAir = 0;
playerStatus->pos.x = 0.0f;
playerStatus->pos.y = 0.0f;
playerStatus->pos.z = 0.0f;
playerStatus->curYaw = 0.0f;
playerStatus->flipYaw[CAM_DEFAULT] = 0.0f;
playerStatus->flipYaw[CAM_BATTLE] = 0.0f;
playerStatus->flipYaw[CAM_TATTLE] = 0.0f;
playerStatus->flipYaw[CAM_3] = 0.0f;
mapSettings = gAreas[gGameStatusPtr->areaID].maps[gGameStatusPtr->mapID].settings;
if (mapSettings->entryList != NULL) {
if (gGameStatusPtr->entryID < mapSettings->entryCount) {
playerStatus->pos.x = (*mapSettings->entryList)[gGameStatusPtr->entryID].x;
playerStatus->pos.y = (*mapSettings->entryList)[gGameStatusPtr->entryID].y;
playerStatus->pos.z = (*mapSettings->entryList)[gGameStatusPtr->entryID].z;
playerStatus->curYaw = (*mapSettings->entryList)[gGameStatusPtr->entryID].yaw;
}
}
gCameras[CAM_DEFAULT].targetPos.x = playerStatus->pos.x;
gCameras[CAM_DEFAULT].targetPos.y = playerStatus->pos.y;
gCameras[CAM_DEFAULT].targetPos.z = playerStatus->pos.z;
phys_reset_spin_history();
mem_clear(&gPlayerSpinState, sizeof(gPlayerSpinState));
}
void get_packed_buttons(s32* out) {
PlayerStatus* playerStatus = &gPlayerStatus;
*out = (playerStatus->curButtons & 0xFFFF) | (playerStatus->pressedButtons << 16);
}
void player_input_to_move_vector(f32* outAngle, f32* outMagnitude) {
PlayerStatus* playerStatus = &gPlayerStatus;
f32 stickAxisX = playerStatus->stickAxis[0];
f32 stickAxisY = -playerStatus->stickAxis[1];
f32 maxRadius = 70.0f;
f32 magnitude;
f32 angle;
magnitude = dist2D(0.0f, 0.0f, stickAxisX, stickAxisY);
if (magnitude >= maxRadius) {
magnitude = maxRadius;
}
angle = clamp_angle(atan2(0.0f, 0.0f, stickAxisX, stickAxisY) + gCameras[CAM_DEFAULT].curYaw);
if (magnitude == 0.0f) {
angle = playerStatus->targetYaw;
}
*outAngle = angle;
*outMagnitude = magnitude;
}
void game_input_to_move_vector(f32* outAngle, f32* outMagnitude) {
PlayerStatus* playerStatus = &gPlayerStatus;
f32 stickX = gGameStatusPtr->stickX[0];
f32 stickY = -gGameStatusPtr->stickY[0];
f32 maxRadius = 70.0f;
f32 magnitude;
f32 angle;
magnitude = dist2D(0.0f, 0.0f, stickX, stickY);
if (magnitude >= maxRadius) {
magnitude = maxRadius;
}
angle = clamp_angle(atan2(0.0f, 0.0f, stickX, stickY) + gCameras[CAM_DEFAULT].curYaw);
if (magnitude == 0.0f) {
angle = playerStatus->targetYaw;
}
*outAngle = angle;
*outMagnitude = magnitude;
}
void calculate_camera_yinterp_rate(void) {
Shadow* shadow = get_shadow_by_index(gPlayerStatus.shadowID);
f32 x = shadow->rot.x + 180.0;
f32 z = shadow->rot.z + 180.0;
Camera* camera = &gCameras[CAM_DEFAULT];
f32 rate;
if (x != 0.0f || z != 0.0f) {
switch (gPlayerStatus.actionState) {
case ACTION_STATE_JUMP:
case ACTION_STATE_FALLING:
rate = 32.0f;
camera->yinterpRate = rate;
break;
case ACTION_STATE_WALK:
case ACTION_STATE_RUN:
if (camera->targetScreenCoords.y < 130) {
camera->yinterpRate = 3.0f;
break;
}
rate = 3.0f;
if (PlayerYInterpUpdateDelay++ <= 10) {
return;
}
PlayerYInterpUpdateDelay = 10;
camera->yinterpRate -= 2.0f;
if (camera->yinterpRate < rate) {
camera->yinterpRate = rate;
}
break;
case ACTION_STATE_SLIDING:
rate = 3.0f;
camera->yinterpRate = rate;
break;
default:
rate = 3.0f;
PlayerYInterpUpdateDelay = 0;
camera->yinterpRate -= 2.0f;
if (camera->yinterpRate < rate) {
camera->yinterpRate = rate;
}
break;
}
} else {
switch (gPlayerStatus.actionState) {
case ACTION_STATE_WALK:
case ACTION_STATE_RUN:
case ACTION_STATE_JUMP:
case ACTION_STATE_SLIDING:
rate = 7.2f;
break;
default:
rate = 24.0f;
break;
}
camera->yinterpRate = rate;
}
}