From bb8d2341527ba3c6fc7e70e630e2cf9c418d593a Mon Sep 17 00:00:00 2001 From: Jed Grabman Date: Wed, 15 Apr 2026 21:38:48 -0400 Subject: [PATCH] Spinout functions (#762) * Document steering * Refer to steering position, instead of steering angle Refer to steering position instead of steering angle, to make clear that it is not the same thing as degrees. * Change comment to block format * Pre-spinout swerving When you sharply move a joystick in 150CC or hit a banana, you can enter a pre-spinout state where you swerve back and forth. This primarily documents how the swerving works, as well as updating some related function / property names --- include/common_structs.h | 10 +-- include/defines.h | 2 +- src/audio/external.c | 2 +- src/code_80057C60.c | 4 +- src/effects.c | 170 +++++++++++++++++++++------------------ src/effects.h | 16 ++-- src/player_controller.c | 26 +++--- src/spawn_players.c | 6 +- 8 files changed, 123 insertions(+), 113 deletions(-) diff --git a/include/common_structs.h b/include/common_structs.h index b1864d386..06c00a843 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -273,7 +273,7 @@ typedef struct { /* 0x0064 */ Vec3f unk_064; /* 0x0070 */ f32 boundingBoxSize; /* 0x0074 */ f32 unk_074; - /* 0x0078 */ s16 unk_078; + /* 0x0078 */ s16 unk_078; // One source of angular velocity (turning / swerving) /* 0x007A */ s16 unk_07A; /* 0x007C */ s32 steerPosition; // Where the kart is steering, related to joystick position. Basically, in [-53 to 53], but shifted 16 bits left /* 0x0080 */ f32 boostPower; @@ -288,13 +288,13 @@ typedef struct { /* 0x00A4 */ f32 unk_0A4; /* 0x00A8 */ s16 unk_0A8; /* 0x00AA */ s16 unk_0AA; - /* 0x00AC */ s16 unk_0AC; - /* 0x00AE */ s16 unk_0AE; + /* 0x00AC */ s16 swerveDirection; + /* 0x00AE */ s16 unk_0AE; // preserved rotation velocity? To restore after effects wear off /* 0x00B0 */ s16 unk_0B0; /* 0x00B2 */ s16 unk_0B2; - /* 0x00B4 */ u16 unk_0B4; + /* 0x00B4 */ u16 swerveTimer; /* 0x00B6 */ u16 kartGraphics; - /* 0x00B8 */ f32 unk_0B8; + /* 0x00B8 */ f32 swerveAccelInit; /* 0x00BC */ u32 effects; /* 0x00C0 */ s16 unk_0C0; /* 0x00C2 */ s16 unk_0C2; diff --git a/include/defines.h b/include/defines.h index b6bb00f47..66523f42a 100644 --- a/include/defines.h +++ b/include/defines.h @@ -395,7 +395,7 @@ player spins. Something with avoding rollover of aniamation frame data? */ #define UNUSED_0x1000 0x1000 // 0x1000 locked behind 0x400 (func_8002B830 -> func_800911B4) #define UNUSED_0x2000 0x2000 // 0x2000 locked behind 0x400 and 0x800 (func_8002B830 -> func_800911B4, apply_effect -> func_80091298, // func_80091440) -#define DRIVING_SPINOUT 0x4000 +#define DRIVING_NEAR_SPINOUT 0x4000 #define UNKNOWN_BATTLE_VAR 0x8000 // 0x8000 something battle related, unclear if ever set /* diff --git a/src/audio/external.c b/src/audio/external.c index 869ac8ec3..cf1e55bec 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -2385,7 +2385,7 @@ void func_800C70A8(u8 playerId) { ((gPlayers[playerId].effects & BANANA_NEAR_SPINOUT_EFFECT) == BANANA_NEAR_SPINOUT_EFFECT) || ((gPlayers[playerId].effects & BANANA_SPINOUT_EFFECT) == BANANA_SPINOUT_EFFECT) || ((gPlayers[playerId].effects & DRIVING_SPINOUT_EFFECT) == DRIVING_SPINOUT_EFFECT) || - ((gPlayers[playerId].kartProps & DRIVING_SPINOUT) == DRIVING_SPINOUT)) { + ((gPlayers[playerId].kartProps & DRIVING_NEAR_SPINOUT) == DRIVING_NEAR_SPINOUT)) { D_800E9E74[playerId] = 0x00000012; } if ((((gPlayers[playerId].effects & AB_SPIN_EFFECT) == AB_SPIN_EFFECT) && diff --git a/src/code_80057C60.c b/src/code_80057C60.c index 0f48812e8..557c48ae9 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -6258,7 +6258,7 @@ void func_8006C6AC(Player* player, s16 particleIndex, s8 playerId, s8 arg3) { func_8005F90C(player, particleIndex, sp28, playerIdCopy, arg3); } else if (((player->effects & EARLY_START_SPINOUT_EFFECT) && !(player->type & PLAYER_START_SEQUENCE)) || (player->effects & BANANA_NEAR_SPINOUT_EFFECT) || (player->effects & AB_SPIN_EFFECT) || - (player->kartProps & DRIVING_SPINOUT)) { + (player->kartProps & DRIVING_NEAR_SPINOUT)) { func_8005ED48(player, particleIndex, sp28, playerIdCopy, arg3); } else { setup_tyre_particles(player, particleIndex, sp28, playerIdCopy, arg3); @@ -6398,7 +6398,7 @@ void func_8006CEC0(Player* arg0, s16 arg1, s8 playerId, s8 arg3) { break; } } else { - if ((arg0->kartProps & BECOME_INVISIBLE) && (arg0->type & DRIVING_SPINOUT)) { + if ((arg0->kartProps & BECOME_INVISIBLE) && (arg0->type & DRIVING_NEAR_SPINOUT)) { func_80061224(arg0, arg1, sp20, playerId, arg3); return; } else if (((arg0->effects & LIGHTNING_EFFECT) == LIGHTNING_EFFECT) && (arg0->unk_0B0 < 0x32)) { diff --git a/src/effects.c b/src/effects.c index ad5d88de9..e31963708 100644 --- a/src/effects.c +++ b/src/effects.c @@ -152,13 +152,13 @@ void clean_effect(Player* player, s8 playerIndex) { if (((player->effects & BANANA_SPINOUT_EFFECT) == BANANA_SPINOUT_EFFECT) || (player->effects & DRIVING_SPINOUT_EFFECT) == DRIVING_SPINOUT_EFFECT) { - func_8008C8C4(player, playerIndex); + remove_spinout_effects(player, playerIndex); } if ((player->effects & BANANA_NEAR_SPINOUT_EFFECT) == BANANA_NEAR_SPINOUT_EFFECT) { - func_8008D0E4(player, playerIndex); + remove_banana_near_spinout_effect(player, playerIndex); } - if ((player->kartProps & DRIVING_SPINOUT) != 0) { - func_8008D3B0(player, playerIndex); + if ((player->kartProps & DRIVING_NEAR_SPINOUT) != 0) { + remove_driving_near_spinout_effect(player, playerIndex); } if ((player->effects & MUSHROOM_EFFECT) == MUSHROOM_EFFECT) { remove_mushroom_effect(player); @@ -257,13 +257,13 @@ void func_8008C6D0(Player* player, s8 playerIndex) { player->unk_042 = 0; } -void func_8008C73C(Player* player, s8 playerIndex) { +void add_spinout_effect(Player* player, s8 playerIndex) { clean_effect(player, playerIndex); if (((player->effects & BANANA_SPINOUT_EFFECT) != BANANA_SPINOUT_EFFECT) && ((player->effects & DRIVING_SPINOUT_EFFECT) != DRIVING_SPINOUT_EFFECT)) { player->effects &= ~DRIFTING_EFFECT; - if ((player->unk_0C0 / 182) >= 0) { + if ((player->unk_0C0 / DEGREES_CONVERSION_FACTOR) >= 0) { player->effects |= DRIVING_SPINOUT_EFFECT; } else { player->effects |= BANANA_SPINOUT_EFFECT; @@ -293,7 +293,7 @@ void func_8008C73C(Player* player, s8 playerIndex) { } } -void func_8008C8C4(Player* player, s8 playerId) { +void remove_spinout_effects(Player* player, s8 playerId) { player->effects &= ~BANANA_SPINOUT_EFFECT; player->effects &= ~DRIVING_SPINOUT_EFFECT; player->unk_0A8 = 0; @@ -347,7 +347,7 @@ void func_8008C9EC(Player* player, s8 playerIndex) { if (gModeSelection == BATTLE) { pop_player_balloon(player, playerIndex); } - func_8008C8C4(player, playerIndex); + remove_spinout_effects(player, playerIndex); } } } else { @@ -357,7 +357,7 @@ void func_8008C9EC(Player* player, s8 playerIndex) { if (stackPadding2 == 0) { player->unk_0B2--; if (player->unk_0B2 <= 0) { - func_8008C8C4(player, playerIndex); + remove_spinout_effects(player, playerIndex); if (gModeSelection == BATTLE) { pop_player_balloon(player, playerIndex); } @@ -372,141 +372,151 @@ void func_8008C9EC(Player* player, s8 playerIndex) { } } -void func_8008CDC0(Player* player, s8 playerIndex) { +void trigger_hit_banana(Player* player, s8 playerIndex) { clean_effect(player, playerIndex); player->triggers &= ~HIT_BANANA_TRIGGER; - player->unk_0B4 = 0; - player->unk_0B8 = 3.0f; - player->unk_0AC = 1; + player->swerveTimer = 0; + player->swerveAccelInit = 3.0f; + player->swerveDirection = 1; player->effects &= ~DRIFTING_EFFECT; if (((player->steerPosition >> 16) >= 20) || ((player->steerPosition >> 16) <= -20) || (((player->speed / 18.0f) * 216.0f) <= 30.0f) || ((player->effects & MIDAIR_EFFECT) != 0) || (((player->type & PLAYER_HUMAN) == 0) && ((player->effects & LOST_RACE_EFFECT) == 0))) { - func_8008C73C(player, playerIndex); + add_spinout_effect(player, playerIndex); } else { player->effects |= BANANA_NEAR_SPINOUT_EFFECT; } } -void func_8008CEB0(Player* player, s8 playerIndex) { - f32 var_f0; - s16 var_v1; - s16 var_a3; - s16 temp_f16; +// almost identical to apply_driving_near_spinout_effect, see there for more documentation +void apply_banana_near_spinout_effect(Player* player, s8 playerIndex) { + f32 swerve_accel_init; + s16 swerve_timer; + s16 swerve_direction; + s16 swerve_velo_current; - var_f0 = player->unk_0B8; - var_v1 = player->unk_0B4; - var_a3 = player->unk_0AC; - var_v1++; - temp_f16 = (var_v1 * var_f0) - (0.2 * (var_v1 * var_v1)); - if ((var_v1 != 0) && (temp_f16 < 0)) { - var_v1 = 0; - var_a3 = -var_a3; - var_f0 *= 0.8; + swerve_accel_init = player->swerveAccelInit; + swerve_timer = player->swerveTimer; + swerve_direction = player->swerveDirection; + swerve_timer++; + swerve_velo_current = (swerve_timer * swerve_accel_init) - (0.2 * (swerve_timer * swerve_timer)); + if ((swerve_timer != 0) && (swerve_velo_current < 0)) { + swerve_timer = 0; + swerve_direction = -swerve_direction; + swerve_accel_init *= 0.8; + // requires braking to recover. A driving spinout allows just releasing gas as well if ((player->effects & BRAKING_EFFECT) == BRAKING_EFFECT) { player->effects |= BANANA_SPINOUT_SAVE_EFFECT; } - if (var_f0 <= 1.0f) { + if (swerve_accel_init <= 1.0f) { player->effects &= ~BANANA_NEAR_SPINOUT_EFFECT; if ((player->effects & BANANA_SPINOUT_SAVE_EFFECT) != BANANA_SPINOUT_SAVE_EFFECT) { - func_8008C73C(player, playerIndex); - var_v1 = 0; + add_spinout_effect(player, playerIndex); + swerve_timer = 0; } else { player->kartGraphics |= WHISTLE; player->effects &= ~BANANA_SPINOUT_SAVE_EFFECT; if ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) { func_800C90F4(playerIndex, (player->characterId * 0x10) + 0x29008008); - var_v1 = 0; + swerve_timer = 0; } } } } - temp_f16 *= var_a3; - if ((temp_f16 <= 0) && (var_a3 == 1)) { - temp_f16 = 0; + swerve_velo_current *= swerve_direction; + if ((swerve_velo_current <= 0) && (swerve_direction == 1)) { + swerve_velo_current = 0; } - if ((temp_f16 >= 0) && (var_a3 == -1)) { - temp_f16 = 0; + if ((swerve_velo_current >= 0) && (swerve_direction == -1)) { + swerve_velo_current = 0; } - player->unk_078 += temp_f16 * 0x12; - player->unk_0B8 = var_f0; - player->unk_0B4 = var_v1; - player->unk_0AC = var_a3; + player->unk_078 += swerve_velo_current * 18; + player->swerveAccelInit = swerve_accel_init; + player->swerveTimer = swerve_timer; + player->swerveDirection = swerve_direction; if (player->effects & MIDAIR_EFFECT) { - func_8008C73C(player, playerIndex); + add_spinout_effect(player, playerIndex); player->effects &= ~BANANA_NEAR_SPINOUT_EFFECT; } } -void func_8008D0E4(Player* player, UNUSED s8 playerIndex) { +void remove_banana_near_spinout_effect(Player* player, UNUSED s8 playerIndex) { player->effects &= ~BANANA_NEAR_SPINOUT_EFFECT; } -void func_8008D0FC(Player* player, s8 playerIndex) { +void trigger_driving_spinout(Player* player, s8 playerIndex) { clean_effect(player, playerIndex); player->triggers &= ~DRIVING_SPINOUT_TRIGGER; - player->unk_0B4 = 0; - player->unk_0B8 = 2.0f; - player->unk_0AC = 1; + player->swerveTimer = 0; + player->swerveAccelInit = 2.0f; + player->swerveDirection = 1; player->effects &= ~DRIFTING_EFFECT; - player->kartProps |= DRIVING_SPINOUT; + player->kartProps |= DRIVING_NEAR_SPINOUT; } -void func_8008D170(Player* player, s8 playerIndex) { - f32 var_f0; - s16 var_v1; - s16 var_a3; - s16 temp_f16; +void apply_driving_near_spinout_effect(Player* player, s8 playerIndex) { + f32 swerve_accel_init; + s16 swerve_timer; + s16 swerve_direction; + s16 swerve_velo_current; - var_f0 = player->unk_0B8; - var_v1 = player->unk_0B4; - var_a3 = player->unk_0AC; - var_v1++; - temp_f16 = (var_v1 * var_f0) - (0.1 * (var_v1 * var_v1)); - if ((var_v1 != 0) && (temp_f16 < 0)) { - var_v1 = 0; - var_a3 = -var_a3; - var_f0 *= 0.9; + // These properties are only used for swerving before spinouts + swerve_accel_init = player->swerveAccelInit; + swerve_timer = player->swerveTimer; + swerve_direction = player->swerveDirection; + swerve_timer++; + + // Standard physics formula: Velo_current = velo_init + (accel_init * time) + (accel_jerk * time**2) / 2 + swerve_velo_current = (swerve_accel_init * swerve_timer) - (0.1 * (swerve_timer * swerve_timer)); + + // Once one swerve finishes, setup to start a smaller one in the opposite direction + if ((swerve_timer != 0) && (swerve_velo_current < 0)) { // (10 * swerve_accel_init < swerve_timer)) + swerve_timer = 0; + swerve_direction = -swerve_direction; + swerve_accel_init *= 0.9; if (((player->effects & BRAKING_EFFECT) == BRAKING_EFFECT) || !(player->kartProps & THROTTLE)) { player->effects |= BANANA_SPINOUT_SAVE_EFFECT; } - if (var_f0 <= 1.3) { - player->kartProps &= ~DRIVING_SPINOUT; + // stop swerving once they are small enough + if (swerve_accel_init <= 1.3) { + player->kartProps &= ~DRIVING_NEAR_SPINOUT; if ((player->effects & BANANA_SPINOUT_SAVE_EFFECT) != BANANA_SPINOUT_SAVE_EFFECT) { - func_8008C73C(player, playerIndex); - var_v1 = 0; + add_spinout_effect(player, playerIndex); + swerve_timer = 0; } else { player->kartGraphics |= WHISTLE; player->effects &= ~BANANA_SPINOUT_SAVE_EFFECT; if ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN) { func_800C90F4(playerIndex, (player->characterId * 0x10) + 0x29008008); - var_v1 = 0; + swerve_timer = 0; } } } } - temp_f16 *= var_a3; - if ((temp_f16 <= 0) && (var_a3 == 1)) { - temp_f16 = 0; + swerve_velo_current *= swerve_direction; + if ((swerve_velo_current <= 0) && (swerve_direction == 1)) { + swerve_velo_current = 0; } - if ((temp_f16 >= 0) && (var_a3 == -1)) { - temp_f16 = 0; + if ((swerve_velo_current >= 0) && (swerve_direction == -1)) { + swerve_velo_current = 0; } - player->unk_078 += temp_f16 * 0x14; - player->unk_0B8 = var_f0; - player->unk_0B4 = var_v1; - player->unk_0AC = var_a3; + /* unk_078 contributes to rotational velocity (spin). It looks to be set each frame in steering code + (e.g. func_80033AE0), so it does not accumulate values from swerve_velo_current over multiple frames */ + player->unk_078 += swerve_velo_current * 20; + player->swerveAccelInit = swerve_accel_init; + player->swerveTimer = swerve_timer; + player->swerveDirection = swerve_direction; if (player->effects & MIDAIR_EFFECT) { - func_8008C73C(player, playerIndex); - player->kartProps &= ~DRIVING_SPINOUT; + add_spinout_effect(player, playerIndex); + player->kartProps &= ~DRIVING_NEAR_SPINOUT; } } -void func_8008D3B0(Player* player, UNUSED s8 playerIndex) { - player->kartProps &= ~DRIVING_SPINOUT; +void remove_driving_near_spinout_effect(Player* player, UNUSED s8 playerIndex) { + player->kartProps &= ~DRIVING_NEAR_SPINOUT; } void trigger_shroom(Player* player, s8 playerIndex) { diff --git a/src/effects.h b/src/effects.h index 5649359d5..dfae0fc7c 100644 --- a/src/effects.h +++ b/src/effects.h @@ -50,15 +50,15 @@ void clean_effect(Player*, s8); void func_8008C528(Player*, s8); void func_8008C62C(Player*, s8); void func_8008C6D0(Player*, s8); -void func_8008C73C(Player*, s8); -void func_8008C8C4(Player*, s8); +void add_spinout_effect(Player*, s8); +void remove_spinout_effects(Player*, s8); void func_8008C9EC(Player*, s8); -void func_8008CDC0(Player*, s8); -void func_8008CEB0(Player*, s8); -void func_8008D0E4(Player*, s8); -void func_8008D0FC(Player*, s8); -void func_8008D170(Player*, s8); -void func_8008D3B0(Player*, s8); +void trigger_hit_banana(Player*, s8); +void apply_banana_near_spinout_effect(Player*, s8); +void remove_banana_near_spinout_effect(Player*, s8); +void trigger_driving_spinout(Player*, s8); +void apply_driving_near_spinout_effect(Player*, s8); +void remove_driving_near_spinout_effect(Player*, s8); void trigger_shroom(Player*, s8); void apply_mushroom_effect(Player*); void remove_mushroom_effect(Player*); diff --git a/src/player_controller.c b/src/player_controller.c index 853f97782..a7a4927ee 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -1308,7 +1308,7 @@ void func_8002AE38(Player* player, s8 arg1, f32 arg2, f32 arg3, f32 arg4, f32 ar sp28 = (sins(-player->rotation[1]) * player->speed) + arg2; temp_f16 = (coss(-player->rotation[1]) * player->speed) + arg3; if (((player->effects & BANANA_NEAR_SPINOUT_EFFECT) != BANANA_NEAR_SPINOUT_EFFECT) && - ((player->effects & DRIFTING_EFFECT) != DRIFTING_EFFECT) && !(player->kartProps & DRIVING_SPINOUT) && + ((player->effects & DRIFTING_EFFECT) != DRIFTING_EFFECT) && !(player->kartProps & DRIVING_NEAR_SPINOUT) && ((((player->speed / 18.0f) * 216.0f) <= 8.0f) || (((player->steerPosition >> 16) < 5) && ((player->steerPosition >> 16) > -5)))) { if ((player->effects & AB_SPIN_EFFECT) == AB_SPIN_EFFECT) { @@ -1384,7 +1384,7 @@ void apply_triggers(Player* player, s8 playerId, UNUSED s8 screenId) { func_8008C528(player, playerId); } if ((player->triggers & HIT_BANANA_TRIGGER) == HIT_BANANA_TRIGGER) { - func_8008CDC0(player, playerId); + trigger_hit_banana(player, playerId); } if ((player->triggers & SHROOM_TRIGGER) == SHROOM_TRIGGER) { trigger_shroom(player, playerId); @@ -1405,7 +1405,7 @@ void apply_triggers(Player* player, s8 playerId, UNUSED s8 screenId) { trigger_lightning_strike(player, playerId); } if ((player->triggers & SPINOUT_TRIGGER) == SPINOUT_TRIGGER) { - func_8008C73C(player, playerId); + add_spinout_effect(player, playerId); } if ((player->triggers & VERTICAL_TUMBLE_TRIGGER) == VERTICAL_TUMBLE_TRIGGER) { trigger_vertical_tumble(player, playerId); @@ -1426,7 +1426,7 @@ void apply_triggers(Player* player, s8 playerId, UNUSED s8 screenId) { trigger_boo(player, playerId); } if (player->triggers & DRIVING_SPINOUT_TRIGGER) { - func_8008D0FC(player, playerId); + trigger_driving_spinout(player, playerId); } if (player->triggers & HIT_PADDLE_BOAT_TRIGGER) { trigger_vertical_tumble(player, playerId); @@ -1453,7 +1453,7 @@ void func_8002B5C0(Player* player, UNUSED s8 playerId, UNUSED s8 screenId) { if ((player->effects & BANANA_NEAR_SPINOUT_EFFECT) == BANANA_NEAR_SPINOUT_EFFECT) { player->triggers &= ALL_TRIGGERS & ~(ANY_BOOST_TRIGGERS | RACING_SPINOUT_TRIGGERS | STATE_TRANSITION_TRIGGERS); } - if ((player->kartProps & DRIVING_SPINOUT) != 0) { + if ((player->kartProps & DRIVING_NEAR_SPINOUT) != 0) { player->triggers &= ALL_TRIGGERS & ~(ANY_BOOST_TRIGGERS | RACING_SPINOUT_TRIGGERS | STATE_TRANSITION_TRIGGERS); } // unclear @@ -1590,7 +1590,7 @@ void func_8002B9CC(Player* player, s8 playerIndex, UNUSED s32 arg2) { player->unk_08C /= 4; player->currentSpeed /= 4; if (!(player->effects & BANANA_SPINOUT_EFFECT) && !(player->effects & DRIVING_SPINOUT_EFFECT)) { - func_8008C73C(player, playerIndex); + add_spinout_effect(player, playerIndex); } } } else { @@ -1601,7 +1601,7 @@ void func_8002B9CC(Player* player, s8 playerIndex, UNUSED s32 arg2) { player->unk_08C /= 4; player->currentSpeed /= 4; if (!(player->effects & BANANA_SPINOUT_EFFECT) && !(player->effects & DRIVING_SPINOUT_EFFECT)) { - func_8008C73C(player, playerIndex); + add_spinout_effect(player, playerIndex); } } temp = (-(s16) get_xz_angle_between_points(player->pos, &player->oldPos[0])); @@ -1984,10 +1984,10 @@ void apply_effect(Player* player, s8 playerIndex, s8 arg2) { func_80090970(player, playerIndex, arg2); } if ((player->effects & BANANA_NEAR_SPINOUT_EFFECT) == BANANA_NEAR_SPINOUT_EFFECT) { - func_8008CEB0(player, playerIndex); + apply_banana_near_spinout_effect(player, playerIndex); } - if (player->kartProps & DRIVING_SPINOUT) { - func_8008D170(player, playerIndex); + if (player->kartProps & DRIVING_NEAR_SPINOUT) { + apply_driving_near_spinout_effect(player, playerIndex); } if ((player->effects & MUSHROOM_EFFECT) == MUSHROOM_EFFECT) { apply_mushroom_effect(player); @@ -3955,7 +3955,7 @@ void func_80033AE0(Player* player, struct Controller* controller, s8 playerIndex steer_position_delta = steer_position - player->steerPosition; // x change steer_position_delta = steer_position_delta >> 16; player->steerPositionDelta = (s16) steer_position_delta; - if (((steer_position_delta >= 90) || (steer_position_delta <= -90)) && (!(player->kartProps & DRIVING_SPINOUT))) { + if (((steer_position_delta >= 90) || (steer_position_delta <= -90)) && (!(player->kartProps & DRIVING_NEAR_SPINOUT))) { if ((((((!(player->effects & DRIFTING_EFFECT)) && (gCCSelection == CC_150)) && (gModeSelection != BATTLE)) && (!(player->effects & MIDAIR_EFFECT))) && (((player->speed / 18.0f) * 216.0f) >= 40.0f)) && @@ -4366,7 +4366,7 @@ void func_80036DB4(Player* player, Vec3f arg1, Vec3f arg2) { ((player->effects & HOP_EFFECT) != HOP_EFFECT)) { var_f18 = player->unk_208 + ((-(player->speed / 18.0f) * 216.0f) * 3.0f) + (-player->unk_20C * 10.0f); sp20 = player->unk_084 * 3.0f; - } else if (!(player->effects & BANANA_NEAR_SPINOUT_EFFECT) && !(player->kartProps & DRIVING_SPINOUT)) { + } else if (!(player->effects & BANANA_NEAR_SPINOUT_EFFECT) && !(player->kartProps & DRIVING_NEAR_SPINOUT)) { steer_position_delta = player->steerPositionDelta; if (steer_position_delta > 0) { steer_position_delta *= -1; @@ -4427,7 +4427,7 @@ void func_800371F4(Player* player, Vec3f arg1, Vec3f arg2) { ((player->effects & HOP_EFFECT) != HOP_EFFECT)) { var_f18 = player->unk_208 + ((-(player->speed / 18.0f) * 216.0f) * 3.0f) + (-player->unk_20C * 50.0f); sp20 = player->unk_084 * 3.0f; - } else if (!(player->effects & BANANA_NEAR_SPINOUT_EFFECT) && !(player->kartProps & DRIVING_SPINOUT)) { + } else if (!(player->effects & BANANA_NEAR_SPINOUT_EFFECT) && !(player->kartProps & DRIVING_NEAR_SPINOUT)) { steer_position_delta = player->steerPositionDelta; if (steer_position_delta > 0) { steer_position_delta *= -1; diff --git a/src/spawn_players.c b/src/spawn_players.c index ec587e982..d7d38255d 100644 --- a/src/spawn_players.c +++ b/src/spawn_players.c @@ -177,11 +177,11 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC player->unk_078 = 0; player->unk_0A8 = 0; player->unk_0AA = 0; - player->unk_0AC = 0; + player->swerveDirection = 0; player->unk_0AE = 0; player->unk_0B0 = 0; player->unk_0B2 = 0; - player->unk_0B4 = 0; + player->swerveTimer = 0; player->unk_0C0 = 0; player->unk_0C2 = 0; player->unk_0C8 = 0; @@ -228,7 +228,7 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC player->currentSpeed = 0.0f; player->unk_0A0 = 0.0f; player->unk_0A4 = 0.0f; - player->unk_0B8 = 0.0f; + player->swerveAccelInit = 0.0f; player->unk_0E4 = 0.0f; player->unk_0E8 = 0.0f; player->kartHopVelocity = 0.0f;