From c0fa190bb9286623363bf5f07883115f711a6d04 Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Sat, 18 Sep 2021 18:55:08 -0700 Subject: [PATCH] Add ground turn circle fix --- include/config.h | 2 ++ src/game/mario_actions_moving.c | 37 ++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/include/config.h b/include/config.h index 1b419b38..0809f625 100644 --- a/include/config.h +++ b/include/config.h @@ -76,6 +76,8 @@ #define HANGING_SPEED 12.f // Makes Mario face the direction of the analog stick directly while hanging from a ceiling, without doing "semicircles" #define TIGHTER_HANGING_CONTROLS +// Fixes Mario's turn radius by making it dependent on forward speed. +#define FIX_GROUND_TURN_RADIUS // Makes Mario turn around instantly when moving on the ground //#define SUPER_RESPONSIVE_CONTROLS // Disables fall damage diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index a24f05dd..b95f4f66 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -434,6 +434,11 @@ s32 update_decelerating_speed(struct MarioState *m) { return stopped; } +s32 analog_stick_held_back(struct MarioState *m) { + s16 intendedDYaw = m->intendedYaw - m->faceAngle[1]; + return intendedDYaw < -0x471C || intendedDYaw > 0x471C; +} + void update_walking_speed(struct MarioState *m) { f32 maxTargetSpeed; f32 targetSpeed; @@ -461,9 +466,30 @@ void update_walking_speed(struct MarioState *m) { if (m->forwardVel > 48.0f) { m->forwardVel = 48.0f; } - -#ifdef SUPER_RESPONSIVE_CONTROLS - m->faceAngle[1] = m->intendedYaw; + +#ifdef FIX_GROUND_TURN_RADIUS + if ((m->forwardVel < 0.0f) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + m->faceAngle[1] += 0x8000; + m->forwardVel *= -1.0f; + } + if (analog_stick_held_back(m) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + set_mario_action(m, ACT_TURNING_AROUND, 0); + if (m->forwardVel < 10.0f) { + m->faceAngle[1] = m->intendedYaw; + } + } else { + s16 turnRange = (0xFFF - (m->forwardVel * 0x20)); + if (turnRange < 0x800) { + turnRange = 0x800; + set_mario_action(m, ACT_TURNING_AROUND, 0); + } else if (turnRange > 0xFFF) { + turnRange = 0xFFF; + } + m->faceAngle[1] = + m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800); + } +#elif SUPER_RESPONSIVE_CONTROLS + m->faceAngle[1] = m->intendedYaw; #else m->faceAngle[1] = m->intendedYaw - approach_s32((s16)(m->intendedYaw - m->faceAngle[1]), 0, 0x800, 0x800); @@ -484,11 +510,6 @@ s32 should_begin_sliding(struct MarioState *m) { return FALSE; } -s32 analog_stick_held_back(struct MarioState *m) { - s16 intendedDYaw = m->intendedYaw - m->faceAngle[1]; - return intendedDYaw < -0x471C || intendedDYaw > 0x471C; -} - s32 check_ground_dive_or_punch(struct MarioState *m) { UNUSED s32 unused;