From 7bb37c6ace16f1006fbeeafc42f01967debaf0c0 Mon Sep 17 00:00:00 2001 From: Maciek Baron <1668712+MaciekBaron@users.noreply.github.com> Date: Fri, 11 Jul 2025 23:04:02 +0100 Subject: [PATCH] Add kartPropulsionStrength and waterInteractionFlags (#425) * Add kartPropulsionStrength and waterInteractionFlags * Add reset_player_speed_and_velocity * Fix merge * Reorder and cleanup * Document hopVerticalOffset and hopFrameCounter * Fix missed variabled * Further things * Use constant --------- Co-authored-by: MegaMech --- include/common_structs.h | 8 +- include/defines.h | 12 +++ src/audio/external.c | 4 +- src/camera.c | 10 +- src/code_8003DC40.c | 4 +- src/code_80057C60.c | 40 +++---- src/code_80057C60.h | 2 +- src/code_80086E70.c | 6 +- src/code_80086E70.h | 2 +- src/effects.c | 40 +++---- src/engine/objects/Thwomp.cpp | 6 +- src/player_controller.c | 190 ++++++++++++++++++---------------- src/player_controller.h | 4 +- src/render_player.c | 8 +- src/render_player.h | 2 +- src/spawn_players.c | 26 ++--- src/spawn_players.h | 6 +- 17 files changed, 197 insertions(+), 173 deletions(-) diff --git a/include/common_structs.h b/include/common_structs.h index 058bb3770..4691e3310 100644 --- a/include/common_structs.h +++ b/include/common_structs.h @@ -289,12 +289,12 @@ typedef struct { /* 0x0070 */ f32 boundingBoxSize; /* 0x0074 */ f32 unk_074; /* 0x0078 */ s16 unk_078; - /* 0x007A */ s16 unk_07A; + /* 0x007A */ s16 hopFrameCounter; /* 0x007C */ s32 unk_07C; /* 0x0080 */ f32 boostPower; /* 0x0084 */ f32 unk_084; /* 0x0088 */ f32 unk_088; - /* 0x008C */ f32 unk_08C; + /* 0x008C */ f32 kartPropulsionStrength; /* 0x0090 */ f32 unk_090; /* 0x0094 */ f32 speed; /* 0x0098 */ f32 unk_098; @@ -320,7 +320,7 @@ typedef struct { /* 0x00CC */ Vec4s unk_0CC; /* 0x00D4 */ Vec4s unk_0D4; /* 0x00DC */ s16 boostTimer; - /* 0x00DE */ u16 unk_0DE; + /* 0x00DE */ u16 waterInteractionFlags; /* 0x00E0 */ s16 unk_0E0; /* 0x00E2 */ s16 unk_0E2; /* 0x00E4 */ f32 unk_0E4; @@ -333,7 +333,7 @@ typedef struct { /* 0x00FC */ f32 kartFriction; /* 0x0100 */ f32 kartGravity; /* 0x0104 */ f32 unk_104; - /* 0x0108 */ f32 unk_108; + /* 0x0108 */ f32 hopVerticalOffset; /* 0x010C */ s16 unk_10C; /* 0x010E */ char unk_10E[0x2]; /* 0x0110 */ Collision collision; diff --git a/include/defines.h b/include/defines.h index 594d43f46..b33633404 100644 --- a/include/defines.h +++ b/include/defines.h @@ -430,6 +430,18 @@ enum PLACE { FIRST_PLACE, SECOND_PLACE, THIRD_PLACE, FOURTH_PLACE }; #define COLOR_LAVA GPACK_RGB888(0x34, 0x00, 0x00) #define COLOR_BLACK GPACK_RGB888(0, 0, 0) + +/** + * @brief player water interaction flags (player->unk_0DE) + * + */ + +#define WATER_NO_INTERACTION 0x0000 // No water interaction +#define WATER_IS_FULLY_SUBMERGED 0x0001 // Kart is completely underwater +#define WATER_IS_PARTIALLY_SUBMERGED 0x0002 // Kart is partially in the water +#define WATER_IN_DEEP_LIQUID_STATE 0x0004 // Persistent flag for being in a deep liquid state? +#define WATER_JUST_ENTERED_DEEP_LIQUID 0x0008 // Momentary flag for the instant of entering deep liquid + /** * * Collision mesh flags diff --git a/src/audio/external.c b/src/audio/external.c index 0dae888a4..726a03d2e 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -593,7 +593,7 @@ void func_800C2474(void) { gPlayers[var_v0].unk_20C = 0.0f; gPlayers[var_v0].unk_0C0 = 0; gPlayers[var_v0].unk_098 = 0.0f; - gPlayers[var_v0].unk_0DE = 0; + gPlayers[var_v0].waterInteractionFlags = WATER_NO_INTERACTION; D_8018FC10[var_v0][0] = 0x00FF; D_8018FC10[var_v0][1] = 0; D_800EA10C[var_v0] = 0; @@ -2689,7 +2689,7 @@ void func_800C76C0(u8 playerId) { } void func_800C847C(u8 playerId) { - if ((gPlayers[playerId].unk_0DE & 1) == 1) { + if ((gPlayers[playerId].waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) == WATER_IS_FULLY_SUBMERGED) { if (D_800E9F74[playerId] == 0) { if ((s32) D_800EA1C0 < 2) { func_800C9018(playerId, SOUND_ARG_LOAD(0x01, 0x00, 0xF9, 0x26)); diff --git a/src/camera.c b/src/camera.c index 3dc170209..6787ef6ea 100644 --- a/src/camera.c +++ b/src/camera.c @@ -539,8 +539,8 @@ void func_8001CCEC(Player* player, Camera* camera, Vec3f arg2, f32* arg3, f32* a *arg4 = camera->pos[1] + (((y - camera->pos[1]) * 0.15)); } - if ((player->unk_0DE & 1) != 0) { - *arg4 = D_801652A0[index]; + if ((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) != 0) { + *arg4 = gPlayerWaterLevel[index]; } } @@ -562,7 +562,7 @@ void func_8001D53C(Player* player, Camera* camera, Vec3f arg2, f32* arg3, f32* a } else { move_f32_towards(&camera->unk_A0, 0.0f, 0.06f); } - thing = D_801652A0[arg7]; + thing = gPlayerWaterLevel[arg7]; sp68[0] = camera->unk_30[0]; sp68[1] = camera->unk_30[1]; sp68[2] = camera->unk_30[2]; @@ -759,8 +759,8 @@ void func_8001D944(Player* player, Camera* camera, Vec3f arg2, f32* arg3, f32* a *arg4 = camera->pos[1] + (((y - camera->pos[1]) * 0.15)); } - if ((player->unk_0DE & 1) != 0) { - *arg4 = D_801652A0[index]; + if ((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) != 0) { + *arg4 = gPlayerWaterLevel[index]; } } diff --git a/src/code_8003DC40.c b/src/code_8003DC40.c index 47fcf98c5..27299e581 100644 --- a/src/code_8003DC40.c +++ b/src/code_8003DC40.c @@ -74,7 +74,7 @@ void func_8003E048(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4 if ((player->effects & BOOST_EFFECT) != 0) { remove_boost_effect(player); player->currentSpeed /= 2; - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; } } else if ((((player->speed / 18.0f) * 216.0f) > 20.0f) || ((player->effects & 0x10000) == 0x10000)) { arg3[0] = ((player->unk_206 / 182) * 0x32); @@ -102,7 +102,7 @@ void func_8003E37C(Player* player, Vec3f arg1, Vec3f arg2, Vec3f arg3, f32* arg4 if ((player->effects & BOOST_EFFECT) != 0) { remove_boost_effect(player); player->currentSpeed /= 2; - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; } } else if ((((player->speed / 18.0f) * 216.0f) > 20.0f) || ((player->effects & 0x10000) == 0x10000)) { arg3[0] = ((player->unk_206 / 182) * 0x32); diff --git a/src/code_80057C60.c b/src/code_80057C60.c index 7bd39e50d..90fc552df 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -3122,7 +3122,7 @@ void func_8005EA94(Player* player, s16 arg1, s32 arg2, s8 arg3, UNUSED s8 arg4) surfaceType = 0x000000FF; temp_v0 = random_int(test); if ((temp_v0 == 0) || (temp_v0 == 8)) { - if ((D_801652A0[arg3] - player->tyres[BACK_LEFT].baseHeight) >= 3.5) { + if ((gPlayerWaterLevel[arg3] - player->tyres[BACK_LEFT].baseHeight) >= 3.5) { x = player->tyres[BACK_LEFT].pos[0]; y = player->tyres[BACK_LEFT].baseHeight + 2.0f; z = player->tyres[BACK_LEFT].pos[2]; @@ -3131,7 +3131,7 @@ void func_8005EA94(Player* player, s16 arg1, s32 arg2, s8 arg3, UNUSED s8 arg4) } } if ((temp_v0 == 2) || (temp_v0 == 6)) { - if ((D_801652A0[arg3] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5) { + if ((gPlayerWaterLevel[arg3] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5) { x = player->tyres[BACK_RIGHT].pos[0]; y = player->tyres[BACK_RIGHT].baseHeight + 2.0f; z = player->tyres[BACK_RIGHT].pos[2]; @@ -3606,14 +3606,14 @@ void func_800608E0(Player* player, s16 arg1, UNUSED s32 arg2, s8 arg3, UNUSED s8 f32 sp4C; f32 sp48; - var_f0 = 8.0f - (D_801652A0[arg3] - player->pos[1]); + var_f0 = 8.0f - (gPlayerWaterLevel[arg3] - player->pos[1]); if ((f64) var_f0 <= 0.0) { var_f0 = 0.0f; } - sp4C = (D_801652A0[arg3] - player->pos[1]) - 3.0f; - if ((player->unk_0DE & 1) && (!IsKoopaTroopaBeach())) { + sp4C = (gPlayerWaterLevel[arg3] - player->pos[1]) - 3.0f; + if ((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) && (!IsKoopaTroopaBeach())) { var_f0 = 2.5f; - sp4C = (f32) ((f64) (D_801652A0[arg3] - player->pos[1]) + 0.1); + sp4C = (f32) ((f64) (gPlayerWaterLevel[arg3] - player->pos[1]) + 0.1); } set_particle_position_and_rotation(player, &player->particlePool0[arg1], 0.0f, 0.0f, 0.0f, (s8) 0, (s8) 0); init_particle_player(&player->particlePool0[arg1], 3, var_f0); @@ -3697,8 +3697,8 @@ void func_80060F50(Player* player, s16 arg1, UNUSED s32 arg2, s8 arg3, UNUSED s8 player->pos[2] + (coss(player->particlePool0[arg1].unk_020) * -5.8); player->particlePool0[arg1].pos[0] = player->pos[0] + (sins(player->particlePool0[arg1].unk_020) * -5.8); - player->particlePool0[arg1].pos[1] = D_801652A0[arg3]; - player->unk_0DE &= ~0x0008; + player->particlePool0[arg1].pos[1] = gPlayerWaterLevel[arg3]; + player->waterInteractionFlags &= ~WATER_JUST_ENTERED_DEEP_LIQUID; } void func_80061094(Player* player, s16 arg1, UNUSED s32 arg2, UNUSED s8 arg3, UNUSED s8 arg4) { @@ -4278,13 +4278,13 @@ void func_80062F98(Player* player, s16 arg1, s8 arg2, UNUSED s8 arg3) { if ((player->unk_0CA & 1) == 1) { player->particlePool1[arg1].pos[1] += (temp_f0 + 0.3); if ((player->particlePool1[arg1].unk_01E == 0x10) || - ((D_801652A0[arg2] - player->particlePool1[arg1].pos[1]) < 3.0f)) { + ((gPlayerWaterLevel[arg2] - player->particlePool1[arg1].pos[1]) < 3.0f)) { player->particlePool1[arg1].isAlive = 0; player->particlePool1[arg1].unk_01E = 0; player->particlePool1[arg1].type = 0; } } else if ((player->particlePool1[arg1].unk_01E == 0xA) || - ((D_801652A0[arg2] - player->particlePool1[arg1].pos[1]) < 3.0f)) { + ((gPlayerWaterLevel[arg2] - player->particlePool1[arg1].pos[1]) < 3.0f)) { player->particlePool1[arg1].isAlive = 0; player->particlePool1[arg1].unk_01E = 0; player->particlePool1[arg1].type = 0; @@ -4295,7 +4295,7 @@ void set_oob_splash_particle_position(Player* player, s16 arg1, s8 arg2, UNUSED ++player->particlePool0[arg1].unk_01E; player->particlePool0[arg1].pos[2] = player->pos[2] + coss(player->particlePool0[arg1].unk_020) * -5.8; player->particlePool0[arg1].pos[0] = player->pos[0] + sins(player->particlePool0[arg1].unk_020) * -5.8; - player->particlePool0[arg1].pos[1] = D_801652A0[arg2]; + player->particlePool0[arg1].pos[1] = gPlayerWaterLevel[arg2]; if (player->particlePool0[arg1].unk_01E == 15) { player->particlePool0[arg1].isAlive = 0; player->particlePool0[arg1].unk_01E = 0; @@ -4614,9 +4614,9 @@ void func_80064184(Player* player, s16 arg1, s8 arg2, UNUSED s8 arg3) { f32 sp40; f32 sp3C; - sp40 = D_801652A0[arg2] - player->pos[1] - 3.0f; - if (((player->unk_0DE & 1) != 0) && (!IsKoopaTroopaBeach())) { - sp40 = D_801652A0[arg2] - player->pos[1] + 0.1; + sp40 = gPlayerWaterLevel[arg2] - player->pos[1] - 3.0f; + if (((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) != 0) && (!IsKoopaTroopaBeach())) { + sp40 = gPlayerWaterLevel[arg2] - player->pos[1] + 0.1; } func_80062B18(&sp44, &sp40, &sp3C, 0.0f, sp40, @@ -4627,7 +4627,7 @@ void func_80064184(Player* player, s16 arg1, s8 arg2, UNUSED s8 arg3) { player->particlePool0[arg1].pos[1] = player->pos[1] + sp40; ++player->particlePool0[arg1].unk_01E; if ((player->particlePool0[arg1].unk_01E == 12) || - (D_801652A0[arg2] <= (player->pos[1] - player->boundingBoxSize))) { + (gPlayerWaterLevel[arg2] <= (player->pos[1] - player->boundingBoxSize))) { player->particlePool0[arg1].isAlive = 0; player->particlePool0[arg1].unk_01E = 0; player->particlePool0[arg1].type = 0; @@ -6342,14 +6342,14 @@ void func_8006C6AC(Player* player, s16 particleIndex, s8 arg2, s8 arg3) { break; } } else { - if (player->unk_0DE & 1) { + if (player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) { func_80060BCC(player, particleIndex, sp28, arg2_copy, arg3); } else if (!(player->effects & 8) && !(player->effects & 2)) { if (((player->effects & DRIFTING_EFFECT) == DRIFTING_EFFECT) && ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN)) { check_drift_particles_setup_valid(player, particleIndex, sp28, arg2_copy, arg3); - } else if (((f64) (D_801652A0[arg2_copy] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5) || - ((f64) (D_801652A0[arg2_copy] - player->tyres[BACK_LEFT].baseHeight) >= 3.5)) { + } else if (((f64) (gPlayerWaterLevel[arg2_copy] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5) || + ((f64) (gPlayerWaterLevel[arg2_copy] - player->tyres[BACK_LEFT].baseHeight) >= 3.5)) { func_8005EA94(player, particleIndex, sp28, arg2_copy, arg3); } else if (((player->effects & 0x80) == 0x80) || ((player->effects & 0x40) == 0x40)) { func_8005F90C(player, particleIndex, sp28, arg2_copy, arg3); @@ -6498,10 +6498,10 @@ void func_8006CEC0(Player* player, s16 arg1, s8 arg2, s8 arg3) { func_80061094(player, arg1, sp20, arg2, arg3); return; } else if ((player->type & 0x4000) == 0x4000) { - if ((player->unk_0DE & 8) == 8) { + if ((player->waterInteractionFlags & WATER_JUST_ENTERED_DEEP_LIQUID) == WATER_JUST_ENTERED_DEEP_LIQUID) { func_80060F50(player, arg1, sp20, arg2, arg3); return; - } else if ((player->unk_0DE & 2) || (player->unk_0DE & 1)) { + } else if ((player->waterInteractionFlags & WATER_IS_PARTIALLY_SUBMERGED) || (player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED)) { func_80060B14(player, arg1, sp20, arg2, arg3); return; } diff --git a/src/code_80057C60.h b/src/code_80057C60.h index 8a91bd889..795cee52b 100644 --- a/src/code_80057C60.h +++ b/src/code_80057C60.h @@ -266,7 +266,7 @@ extern u8** D_800E47A0[]; extern s32 D_800E47DC[]; extern s32 D_800E480C[]; -extern f32 D_801652A0[]; +extern f32 gPlayerWaterLevel[]; extern s32 D_80165590; extern s32 D_80165594; diff --git a/src/code_80086E70.c b/src/code_80086E70.c index c5823deef..b84c55696 100644 --- a/src/code_80086E70.c +++ b/src/code_80086E70.c @@ -954,15 +954,15 @@ UNUSED bool func_80088F94(s32 objectIndex, Player* player, f32 arg2) { return var_v1; } -void func_80088FF0(Player* player) { - player->unk_08C = 0.0f; +void reset_player_speed_and_velocity(Player* player) { + player->kartPropulsionStrength = 0.0f; player->currentSpeed = 0.0f; player->velocity[0] = 0.0f; player->velocity[2] = 0.0f; } UNUSED void func_8008900C(Player* player) { - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; player->currentSpeed = 0.0f; } diff --git a/src/code_80086E70.h b/src/code_80086E70.h index 7ed425169..f921405a2 100644 --- a/src/code_80086E70.h +++ b/src/code_80086E70.h @@ -76,7 +76,7 @@ bool has_collided_with_player_1d(s32, Player*, f32); bool has_collided_with_player_and_within_height(s32, Player*, f32); f32 func_80088F54(s32, Player*); UNUSED bool func_80088F94(s32, Player*, f32); -void func_80088FF0(Player*); +void reset_player_speed_and_velocity(Player*); void func_8008900C(Player*); void func_80089020(s32, f32*); void func_800892E0(s32); diff --git a/src/effects.c b/src/effects.c index da9b8b659..b585f063a 100644 --- a/src/effects.c +++ b/src/effects.c @@ -724,7 +724,7 @@ void apply_hit_effect(Player* player, s8 arg1) { player->unk_0A8 = 0; player->unk_07C = 0; player->unk_0C0 = 0; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; player->currentSpeed = 0.0f; // clang-format off if ((player->collision.surfaceDistance[2] >= 600.0f) || ((player->effects & 0x1000) != 0)) { D_8018D990[arg1] = 3; } // placed block on same line to match @@ -833,7 +833,7 @@ void apply_hit_rotating_sound_effect(Player* player, s8 arg1) { player->soundEffects &= ~HIT_ROTATING_SOUND_EFFECT; player->effects |= 0x40020000; player->effects &= ~0x10; - player->unk_08C *= 0.6; + player->kartPropulsionStrength *= 0.6; player->unk_0B0 = 0; player->size = 1.0f; gPlayerStarEffectStartTime[arg1] = gCourseTimer; @@ -896,7 +896,7 @@ void apply_lightning_effect(Player* player, s8 arg1) { player_decelerate_alternative(player, 1.0f); } else { player->unk_0B0 += 1; - player->unk_08C = (f32) ((f64) player->unk_08C * 0.6); + player->kartPropulsionStrength = (f32) ((f64) player->kartPropulsionStrength * 0.6); if ((player->unk_0B0 == 1) && (player->type & PLAYER_HUMAN)) { func_800C90F4(arg1, (player->characterId * 0x10) + 0x29008005); } @@ -938,7 +938,7 @@ void func_8008E4A4(Player* player, s8 arg1) { player->unk_07C = 0; player->unk_0C2 = 0xF; player->unk_042 += 0xAAA; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; player->currentSpeed = 0.0f; player->velocity[0] = 0.0f; player->velocity[2] = 0.0f; @@ -1051,7 +1051,7 @@ void apply_hit_by_item_effect(Player* player, s8 arg1) { player->unk_07C = 0; player->unk_0C2 = 0xF; player->unk_042 += 0xAAA; - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; player->currentSpeed = 0.0f; player->effects &= ~0xC0; @@ -1183,7 +1183,7 @@ void apply_boost_ramp_asphalt_effect(Player* player) { if (player->unk_0C2 >= 0x33) { temp_f0 = 0.7; player->currentSpeed = (player->currentSpeed * temp_f0); - player->unk_08C = (player->unk_08C * temp_f0); + player->kartPropulsionStrength = (player->kartPropulsionStrength * temp_f0); } } } @@ -1226,7 +1226,7 @@ void apply_boost_ramp_wood_effect(Player* player) { player->effects &= ~BOOST_RAMP_WOOD_EFFECT; player->boostPower = 0.0f; player->currentSpeed /= 2; - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; } } @@ -1255,7 +1255,7 @@ void func_8008F104(Player* player, s8 arg1) { void func_8008F1B8(Player* player, s8 arg1) { s16 temp; - player->unk_08C = (player->unk_210 * 0.05); + player->kartPropulsionStrength = (player->unk_210 * 0.05); if (player->unk_0B2 < 0) { if ((player->unk_044 & 0x80) == 0x80) { player->rotation[1] += 182; @@ -1310,7 +1310,7 @@ void func_8008F3F4(Player* player, UNUSED s8 arg1) { player->unk_042 += 0x71C; player->unk_07C = 0; player->currentSpeed = 0.0f; - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; if (player->unk_0A8 >= 0x2000) { player->unk_0A8 = 0; --player->unk_236; @@ -1339,7 +1339,7 @@ void func_8008F494(Player* player, s8 arg1) { player->unk_042 = 0; if (((player->type & PLAYER_HUMAN) != 0) && ((player->type & PLAYER_INVISIBLE_OR_BOMB) == 0) && - ((player->unk_0CA & 2) == 0) && ((player->unk_0DE & 1) == 0) && ((player->unk_0DE & 2) == 0)) { + ((player->unk_0CA & 2) == 0) && ((player->waterInteractionFlags & 1) == 0) && ((player->waterInteractionFlags & 2) == 0)) { func_800C90F4(arg1, (player->characterId * 0x10) + 0x29008004); } } @@ -1577,7 +1577,7 @@ void func_8008FE84(Player* player, UNUSED s8 arg1) { if ((player->effects & 8) != 8) { player->effects &= ~0x10000000; player->currentSpeed /= 2; - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; } } @@ -1762,7 +1762,7 @@ void func_80090778(Player* player) { player->unk_0CA |= 8; player->effects &= ~0x10; player->unk_222 = 0; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; clean_effect(player, playerIndex); func_8008F86C(player, playerIndex); @@ -1789,7 +1789,7 @@ void func_80090868(Player* player) { player->unk_078 = 0; player->unk_07C = 0; player->unk_0C0 = 0; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; playerIndex = get_player_index_for_player(player); if ((player->unk_0CA & 2) != 2) { @@ -1800,7 +1800,7 @@ void func_80090868(Player* player) { player->unk_222 = 0; player->unk_0CA |= 2; player->unk_0C8 = 0; - if ((player->unk_0DE & 1) == 1) { + if ((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) == WATER_IS_FULLY_SUBMERGED) { if ((IsBowsersCastle()) || (IsBigDonut())) { player->unk_0CA |= 0x1000; } else { @@ -1828,7 +1828,7 @@ void func_80090970(Player* player, s8 playerId, s8 arg2) { player->unk_078 = 0; player->unk_07C = 0; player->unk_0C0 = 0; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; clean_effect(player, playerId); switch (player->unk_222) { case 0: @@ -1839,9 +1839,9 @@ void func_80090970(Player* player, s8 playerId, s8 arg2) { player->unk_0C8 = 0x003C; } } else { - move_f32_towards(&player->pos[1], D_801652A0[playerId] + 100.0f, 0.012f); + move_f32_towards(&player->pos[1], gPlayerWaterLevel[playerId] + 100.0f, 0.012f); move_s16_towards(&player->unk_0CC[arg2], 0, 0.2f); - if ((D_801652A0[playerId] + 40.0f) <= player->pos[1]) { + if ((gPlayerWaterLevel[playerId] + 40.0f) <= player->pos[1]) { player->unk_222 = 1; player->unk_0CA |= 4; player->alpha = ALPHA_MAX; @@ -1865,7 +1865,7 @@ void func_80090970(Player* player, s8 playerId, s8 arg2) { func_8009E088(playerId, 0xA); } if ((player->unk_0CA & 1) == 1) { - move_f32_towards(&player->pos[1], D_801652A0[playerId] + 40.0f, 0.02f); + move_f32_towards(&player->pos[1], gPlayerWaterLevel[playerId] + 40.0f, 0.02f); player->alpha -= ALPHA_CHANGE_LARGE; if (player->alpha <= ALPHA_CHANGE_LARGE) { player->alpha = ALPHA_MIN; @@ -1933,7 +1933,7 @@ void func_80090970(Player* player, s8 playerId, s8 arg2) { pop_player_balloon(player, playerId); } player->unk_0CA &= ~0x0002; - player->unk_0DE &= ~0x0004; + player->waterInteractionFlags &= ~WATER_IN_DEEP_LIQUID_STATE; if ((player->unk_0CA & 0x80) != 0x80) { player->unk_0CA &= ~0x0008; if ((player->topSpeed * 0.9) <= player->currentSpeed) { @@ -2076,7 +2076,7 @@ void func_80091298(Player* player, s8 arg1) { player->unk_0D4[0] = 0; player->type |= PLAYER_START_SEQUENCE; player->speed = 0.0f; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; player->currentSpeed = 0.0f; if (arg1 == 0) { D_801658BC = 1; diff --git a/src/engine/objects/Thwomp.cpp b/src/engine/objects/Thwomp.cpp index b783395b7..2f8281cb6 100644 --- a/src/engine/objects/Thwomp.cpp +++ b/src/engine/objects/Thwomp.cpp @@ -54,7 +54,7 @@ OThwomp::OThwomp(s16 x, s16 z, s16 direction, f32 scale, s16 behaviour, s16 prim _faceDirection = direction; _boundingBoxSize = boundingBoxSize; State = (States)behaviour; - + find_unused_obj_index(&_objectIndex); s32 objectId = _objectIndex; @@ -650,11 +650,11 @@ void OThwomp::func_80080B28(s32 objectIndex, s32 playerId) { player->unk_040 = (s16) objectIndex; player->unk_046 |= 2; player->soundEffects |= 0x100; - func_80088FF0(player); + reset_player_speed_and_velocity(player); } } } else { - func_80088FF0(player); + reset_player_speed_and_velocity(player); } } } diff --git a/src/player_controller.c b/src/player_controller.c index 4a53aa429..422faab9c 100644 --- a/src/player_controller.c +++ b/src/player_controller.c @@ -1265,7 +1265,7 @@ void func_8002AAC0(Player* player) { void func_8002AB70(Player* player) { UNUSED s32 pad[2]; - if (((player->effects & 8) != 8) && (player->unk_08C > 0.0f)) { + if (((player->effects & 8) != 8) && (player->kartPropulsionStrength > 0.0f)) { if (((player->slopeAccel / 182) < -1) && ((player->slopeAccel / 182) >= -0x14) && (((player->speed / 18.0f) * 216.0f) >= 20.0f)) { move_f32_towards(&player->kartGravity, 500.0f, 1.0f); @@ -1582,7 +1582,7 @@ void func_8002B9CC(Player* player, s8 arg1, UNUSED s32 arg2) { temp_f2 = 0; temp_f14 = D_8018CE10[arg1].unk_04[2]; if (sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)) >= 6.5) { - player->unk_08C /= 4; + player->kartPropulsionStrength /= 4; player->currentSpeed /= 4; if (!(player->effects & 0x80) && !(player->effects & 0x40)) { func_8008C73C(player, arg1); @@ -1593,7 +1593,7 @@ void func_8002B9CC(Player* player, s8 arg1, UNUSED s32 arg2) { temp_f2 = gPlayerLastVelocity[arg1][1] - player->velocity[1]; temp_f14 = gPlayerLastVelocity[arg1][2] - player->velocity[2]; if (sqrtf((temp_f0 * temp_f0) + (temp_f2 * temp_f2) + (temp_f14 * temp_f14)) >= 4.2) { - player->unk_08C /= 4; + player->kartPropulsionStrength /= 4; player->currentSpeed /= 4; if (!(player->effects & 0x80) && !(player->effects & 0x40)) { func_8008C73C(player, arg1); @@ -1811,39 +1811,46 @@ void func_8002C17C(Player* player, s8 playerId) { } } -void func_8002C4F8(Player* player, s8 arg1) { - D_801652A0[arg1] = get_water_level(player); - if (player->pos[1] <= D_801652A0[arg1]) { - player->unk_0DE |= 0x0002; +void update_player_environment_and_hazard_state(Player* player, s8 playerIndex) { + gPlayerWaterLevel[playerIndex] = get_water_level(player); + if (player->pos[1] <= gPlayerWaterLevel[playerIndex]) { // Player is in water, at least partially + player->waterInteractionFlags |= WATER_IS_PARTIALLY_SUBMERGED; } else { - player->unk_0DE &= ~0x0002; + player->waterInteractionFlags &= ~WATER_IS_PARTIALLY_SUBMERGED; } - if (player->boundingBoxSize < (D_801652A0[arg1] - player->pos[1])) { - player->unk_0DE |= 1; - player->unk_0DE &= ~0x0002; + if (player->boundingBoxSize < (gPlayerWaterLevel[playerIndex] - player->pos[1])) { + // Player is fully submerged in water + player->waterInteractionFlags |= WATER_IS_FULLY_SUBMERGED; + player->waterInteractionFlags &= ~WATER_IS_PARTIALLY_SUBMERGED; } else { - player->unk_0DE &= ~0x0001; + // Player is not fully submerged in water, clear the flag + player->waterInteractionFlags &= ~WATER_IS_FULLY_SUBMERGED; } - if (player->boundingBoxSize < (D_801652A0[arg1] - player->pos[1])) { - if ((player->unk_0DE & 4) != 4) { - player->unk_0DE |= 8; - player->unk_0DE |= 4; + if (player->boundingBoxSize < (gPlayerWaterLevel[playerIndex] - player->pos[1])) { + // We confirm again that the player if fully submerged + if ((player->waterInteractionFlags & WATER_IN_DEEP_LIQUID_STATE) != WATER_IN_DEEP_LIQUID_STATE) { + // Set flag - it will be cleared shortly after + player->waterInteractionFlags |= WATER_JUST_ENTERED_DEEP_LIQUID; + // This flag persists longer + player->waterInteractionFlags |= WATER_IN_DEEP_LIQUID_STATE; if ((!IsKoopaTroopaBeach()) && (!IsSkyscraper()) && (!IsRainbowRoad()) && ((player->type & PLAYER_HUMAN) == PLAYER_HUMAN)) { if ((IsBowsersCastle()) || (IsBigDonut())) { - func_800C9060((u8) arg1, 0x1900801CU); + func_800C9060((u8) playerIndex, 0x1900801CU); } else { - func_800C9060((u8) arg1, 0x19008008U); + func_800C9060((u8) playerIndex, 0x19008008U); } } } } if ((IsKoopaTroopaBeach()) || (IsSkyscraper()) || (IsRainbowRoad())) { - player->unk_0DE &= ~0x000C; + // Different handling for these tracks, we just use the first two (0x0001 and 0x0002) + player->waterInteractionFlags &= ~(WATER_IN_DEEP_LIQUID_STATE | WATER_JUST_ENTERED_DEEP_LIQUID); } - if ((player->boundingBoxSize < (D_801652A0[arg1] - player->pos[1])) && + if ((player->boundingBoxSize < (gPlayerWaterLevel[playerIndex] - player->pos[1])) && (player->collision.surfaceDistance[2] >= 600.0f)) { + // We are fully submerged in water and far away from the surface (out of bounds?) player->unk_0CA |= 1; } if (player->collision.surfaceDistance[2] >= 600.0f) { @@ -1861,7 +1868,7 @@ void func_8002C4F8(Player* player, s8 arg1) { func_80090778(player); func_80090868(player); } - func_8002C17C(player, arg1); + func_8002C17C(player, playerIndex); } void func_8002C7E4(Player* player, s8 arg1, s8 arg2) { @@ -1960,7 +1967,7 @@ void func_8002C954(Player* player, s8 playerId, Vec3f arg2) { } if (player->effects & BOOST_EFFECT) { remove_boost_effect(player); - player->unk_08C /= 2; + player->kartPropulsionStrength /= 2; } } @@ -2073,7 +2080,7 @@ void func_8002D028(Player* player, s8 arg1) { if ((player->rotation[1] < (-0x7F41)) || (player->rotation[1] > 0x7F41)) { player->type &= ~0x0200; } - player->unk_08C = 0; + player->kartPropulsionStrength = 0; player->speed = 0; player->unk_104 = 0; player->tyreSpeed = 0; @@ -2084,7 +2091,7 @@ void func_8002D028(Player* player, s8 arg1) { player->unk_0C0 = 0; player->unk_078 = 0; } else { - player->unk_08C = 1200; + player->kartPropulsionStrength = 1200; } } @@ -2173,7 +2180,7 @@ void func_8002D268(Player* player, UNUSED Camera* camera, s8 screenId, s8 player } else { player->unk_044 &= 0xFFF7; } - if (((player->unk_08C <= 0.0f) && ((temp_v0_3 = player->effects, (temp_v0_3 & 1) == 1))) && + if (((player->kartPropulsionStrength <= 0.0f) && ((temp_v0_3 = player->effects, (temp_v0_3 & 1) == 1))) && ((temp_v0_3 & 0x20) != 0x20)) { sp178[2] = temp_f2_2 * 4500.0f; } else { @@ -2362,7 +2369,7 @@ void func_8002D268(Player* player, UNUSED Camera* camera, s8 screenId, s8 player player->previousSpeed = player->speed; player->speed = sqrtf(temp2); - if ((player->unk_08C <= 0.0f) && (player->speed <= 0.08) && (D_8018CE10[playerId].unk_04[0] == 0.0f) && + if ((player->kartPropulsionStrength <= 0.0f) && (player->speed <= 0.08) && (D_8018CE10[playerId].unk_04[0] == 0.0f) && (D_8018CE10[playerId].unk_04[2] == 0.0f)) { newVelocity[0] = newVelocity[0] + (-1 * newVelocity[0]); newVelocity[2] = newVelocity[2] + (-1 * newVelocity[2]); @@ -2406,7 +2413,7 @@ void func_8002D268(Player* player, UNUSED Camera* camera, s8 screenId, s8 player if (player->collision.surfaceDistance[2] >= 500.0f) { player->unk_078 = (s16) (((s16) player->unk_078) / 2); } - func_8002C4F8(player, playerId); + update_player_environment_and_hazard_state(player, playerId); } void set_player_height(Player* player) { @@ -2644,8 +2651,8 @@ void func_8002E594(Player* player, UNUSED Camera* camera, s8 screenId, s8 player temp = (sp54[0] * sp54[0]) + (sp54[2] * sp54[2]); player->previousSpeed = player->speed; player->speed = sqrtf(temp); - if ((((player->effects & 0x400) != 0x400) && (player->unk_08C <= 0) && (player->speed < 0.13)) || - (((player->effects & 0x400) != 0x400) && (player->unk_08C <= 0) && (player->speed < 0.20) && + if ((((player->effects & 0x400) != 0x400) && (player->kartPropulsionStrength <= 0) && (player->speed < 0.13)) || + (((player->effects & 0x400) != 0x400) && (player->kartPropulsionStrength <= 0) && (player->speed < 0.20) && ((player->effects & 1) == 1))) { sp54[0] = sp54[0] + (-1 * sp54[0]); sp54[2] = sp54[2] + (-1 * sp54[2]); @@ -2668,7 +2675,7 @@ void func_8002E594(Player* player, UNUSED Camera* camera, s8 screenId, s8 player player->speed = gKartTopSpeedTable[player->characterId]; } } - func_8002C4F8(player, playerId); + update_player_environment_and_hazard_state(player, playerId); } void control_cpu_movement(Player* player, UNUSED Camera* camera, s8 screenId, s8 playerId) { @@ -2824,8 +2831,8 @@ void func_8002F730(Player* player, UNUSED Camera* camera, UNUSED s8 screenId, s8 sqrt = (sp68[0] * sp68[0]) + (sp68[1] * sp68[1]) + (sp68[2] * sp68[2]); player->previousSpeed = player->speed; player->speed = sqrtf(sqrt); - if (((player->unk_08C <= 0.0f) && ((f64) player->speed < 0.13)) || - ((player->unk_08C <= 0.0f) && ((f64) player->speed < 0.2) && ((player->effects & 1) == 1))) { + if (((player->kartPropulsionStrength <= 0.0f) && ((f64) player->speed < 0.13)) || + ((player->kartPropulsionStrength <= 0.0f) && ((f64) player->speed < 0.2) && ((player->effects & 1) == 1))) { sp68[0] = sp68[0] + (sp68[0] * -1.0f); sp68[2] = sp68[2] + (sp68[2] * -1.0f); } else { @@ -3015,19 +3022,19 @@ f32 func_80030150(Player* player, s8 arg1) { var_f0 += -0.25; } } - if ((player->unk_0DE & 1) == 1) { + if ((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) == WATER_IS_FULLY_SUBMERGED) { var_f0 += 0.3; } else { - if ((player->unk_0DE & 2) == 2) { + if ((player->waterInteractionFlags & WATER_IS_PARTIALLY_SUBMERGED) == WATER_IS_PARTIALLY_SUBMERGED) { var_f0 += 0.15; } - if (((D_801652A0[arg1] - player->tyres[BACK_LEFT].baseHeight) >= 3.5) || - ((D_801652A0[arg1] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5)) { + if (((gPlayerWaterLevel[arg1] - player->tyres[BACK_LEFT].baseHeight) >= 3.5) || + ((gPlayerWaterLevel[arg1] - player->tyres[BACK_RIGHT].baseHeight) >= 3.5)) { var_f0 += 0.05; } } if ((player->effects & 8) != 0) { - move_f32_towards(&player->unk_0A0, player->unk_08C * 0.04, 0.15f); + move_f32_towards(&player->unk_0A0, player->kartPropulsionStrength * 0.04, 0.15f); } else { move_f32_towards(&player->unk_0A0, 0.0f, 0.1f); } @@ -3061,7 +3068,7 @@ f32 func_80030150(Player* player, s8 arg1) { } } move_f32_towards(&player->unk_104, var_f0, gKartTurnSpeedReductionTable1[player->characterId] + 0.05); - var_f2 = (player->unk_08C + player->unk_0E8 + player->boostPower + player->unk_0E4) - player->unk_0A0; + var_f2 = (player->kartPropulsionStrength + player->unk_0E8 + player->boostPower + player->unk_0E4) - player->unk_0A0; if (var_f2 < 0.0f) { var_f2 = 0.0f; } @@ -3078,58 +3085,63 @@ f32 func_80030150(Player* player, s8 arg1) { if (((player->effects & BOOST_EFFECT) == (BOOST_EFFECT & 0xFFFFFFFF)) || ((player->effects & BOOST_RAMP_ASPHALT_EFFECT) == BOOST_RAMP_ASPHALT_EFFECT) || ((player->effects & BOOST_RAMP_WOOD_EFFECT) == BOOST_RAMP_WOOD_EFFECT)) { - func_8002FE84(player, player->boostPower + player->unk_08C); - return player->boostPower + player->unk_08C; + func_8002FE84(player, player->boostPower + player->kartPropulsionStrength); + return player->boostPower + player->kartPropulsionStrength; } func_8002FE84(player, var_f2); return (1.0f - player->unk_104) * var_f2; } -void func_80030A34(Player* player) { - f32 var_f0; - f32 var_f2; +void update_player_kart_hop(Player* player) { + f32 hopInitialUpwardVelocity; + f32 hopDownwardAcceleration; if (((player->unk_0CA & 2) != 2) && ((player->unk_0CA & 8) != 8)) { if ((((player->speed / 18.0f) * 216.0f) >= 8.0f) && (player->unk_DB4.unkC < 1.0f)) { switch (player->surfaceType) { /* irregular */ case ASPHALT: if (random_int(0x000AU) != 8) { - var_f0 = 0.35f; - var_f2 = 0.55f; + hopInitialUpwardVelocity = 0.35f; + hopDownwardAcceleration = 0.55f; } else { - player->unk_07A = 0; - player->unk_108 = 0.0f; - var_f0 = 0.0f; - var_f2 = 0.0f; + player->hopFrameCounter = 0; + player->hopVerticalOffset = 0.0f; + hopInitialUpwardVelocity = 0.0f; + hopDownwardAcceleration = 0.0f; } break; case TRAIN_TRACK: case ROPE_BRIDGE: - var_f0 = 0.94f; - var_f2 = 0.85f; + hopInitialUpwardVelocity = 0.94f; + hopDownwardAcceleration = 0.85f; break; default: if (1) {} - var_f0 = 0.46f; - var_f2 = 0.48f; + hopInitialUpwardVelocity = 0.46f; + hopDownwardAcceleration = 0.48f; break; } } else if (random_int(0x000AU) != 8) { - var_f0 = 0.3f; - var_f2 = 0.54f; + hopInitialUpwardVelocity = 0.3f; + hopDownwardAcceleration = 0.54f; } else { - player->unk_07A = 0; - player->unk_108 = 0.0f; - var_f0 = 0.0f; - var_f2 = 0.0f; + player->hopFrameCounter = 0; + player->hopVerticalOffset = 0.0f; + hopInitialUpwardVelocity = 0.0f; + hopDownwardAcceleration = 0.0f; } - player->unk_07A += 1; - player->unk_108 = (player->unk_07A * var_f0) - (0.5 * var_f2 * (player->unk_07A * player->unk_07A)); - if ((player->unk_07A != 0) && (player->unk_108 < 0.0f)) { - player->unk_07A = 0; + + // Increase the hop frame counter + player->hopFrameCounter += 1; + + // Vertical displacement under constant acceleration: Δy = v₀t + (1/2)at² + player->hopVerticalOffset = (player->hopFrameCounter * hopInitialUpwardVelocity) - (0.5 * hopDownwardAcceleration * (player->hopFrameCounter * player->hopFrameCounter)); + + if ((player->hopFrameCounter != 0) && (player->hopVerticalOffset < 0.0f)) { + player->hopFrameCounter = 0; } - if (player->unk_108 <= 0.0f) { - player->unk_108 = 0.0f; + if (player->hopVerticalOffset <= 0.0f) { + player->hopVerticalOffset = 0.0f; } } } @@ -3167,7 +3179,7 @@ void detect_triple_a_combo_a_released(Player* player) { gCountASwitch[playerIndex] = 0; } gFrameSinceLastACombo[playerIndex] = 0; - D_80165400[playerIndex] = 0; + gPlayerAButtonComboActiveThisFrame[playerIndex] = 0; } gPlayerIsThrottleActive[playerIndex] = false; gFrameSinceLastACombo[playerIndex]++; @@ -3175,10 +3187,10 @@ void detect_triple_a_combo_a_released(Player* player) { gFrameSinceLastACombo[playerIndex] = 9; } if ((gFrameSinceLastACombo[playerIndex] >= 2) && (gFrameSinceLastACombo[playerIndex] < 9)) { - if (D_80165400[playerIndex] == 0) { + if (gPlayerAButtonComboActiveThisFrame[playerIndex] == 0) { gCountASwitch[playerIndex] += 1; } - D_80165400[playerIndex] = 1; + gPlayerAButtonComboActiveThisFrame[playerIndex] = 1; } if (gCountASwitch[playerIndex] == 5) { gIsPlayerTripleAButtonCombo[playerIndex] = true; @@ -3227,7 +3239,7 @@ void detect_triple_a_combo_a_pressed(Player* player) { gCountASwitch[playerIndex] = 0; } gFrameSinceLastACombo[playerIndex] = 0; - D_80165400[playerIndex] = 0; + gPlayerAButtonComboActiveThisFrame[playerIndex] = 0; } gPlayerIsThrottleActive[playerIndex] = true; gFrameSinceLastACombo[playerIndex]++; @@ -3235,10 +3247,10 @@ void detect_triple_a_combo_a_pressed(Player* player) { gFrameSinceLastACombo[playerIndex] = 9; } if ((gFrameSinceLastACombo[playerIndex] >= 2) && (gFrameSinceLastACombo[playerIndex] < 9)) { - if (D_80165400[playerIndex] == 0) { + if (gPlayerAButtonComboActiveThisFrame[playerIndex] == 0) { gCountASwitch[playerIndex] += 1; } - D_80165400[playerIndex] = 1; + gPlayerAButtonComboActiveThisFrame[playerIndex] = 1; } if (gCountASwitch[playerIndex] == 5) { gIsPlayerTripleAButtonCombo[playerIndex] = true; @@ -3358,7 +3370,7 @@ void player_accelerate_alternative(Player* player) { player->currentSpeed = player->topSpeed; } if (!((player->effects & 8)) || ((player->effects & LIGHTNING_EFFECT))) { - player->unk_08C = (player->currentSpeed * player->currentSpeed) / 25.0f; + player->kartPropulsionStrength = (player->currentSpeed * player->currentSpeed) / 25.0f; } player->unk_044 |= 0x20; if ((player->soundEffects * 8) < 0) { @@ -3376,13 +3388,13 @@ void player_decelerate_alternative(Player* player, f32 speed) { player->currentSpeed = 0.0f; } if (player->speed < 0.2) { - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; } if (player->topSpeed <= player->currentSpeed) { player->currentSpeed = player->topSpeed; } if ((player->effects & 8) != 8) { - player->unk_08C = (player->currentSpeed * player->currentSpeed) / 25.0f; + player->kartPropulsionStrength = (player->currentSpeed * player->currentSpeed) / 25.0f; } player->unk_044 &= 0xFFDF; if ((player->soundEffects * 8) < 0) { @@ -3425,7 +3437,7 @@ void detect_triple_b_combo_b_released(Player* player) { gCountBChangement[playerIndex] = 0; } gFrameSinceLastBCombo[playerIndex] = 0; - D_801654C0[playerIndex] = 0; + gPlayerBButtonComboActiveThisFrame[playerIndex] = 0; } gPlayerIsBrakeActive[playerIndex] = false; gFrameSinceLastBCombo[playerIndex]++; @@ -3433,10 +3445,10 @@ void detect_triple_b_combo_b_released(Player* player) { gFrameSinceLastBCombo[playerIndex] = 9; } if ((gFrameSinceLastBCombo[playerIndex] >= 2) && (gFrameSinceLastBCombo[playerIndex] < 9)) { - if (D_801654C0[playerIndex] == 0) { + if (gPlayerBButtonComboActiveThisFrame[playerIndex] == 0) { gCountBChangement[playerIndex]++; } - D_801654C0[playerIndex] = 1; + gPlayerBButtonComboActiveThisFrame[playerIndex] = 1; } if (gCountBChangement[playerIndex] == 5) { gIsPlayerTripleBButtonCombo[playerIndex] = true; @@ -3486,7 +3498,7 @@ void detect_triple_b_combo_b_pressed(Player* player) { gCountBChangement[playerIndex] = 0; } gFrameSinceLastBCombo[playerIndex] = 0; - D_801654C0[playerIndex] = 0; + gPlayerBButtonComboActiveThisFrame[playerIndex] = 0; } gPlayerIsBrakeActive[playerIndex] = true; gFrameSinceLastBCombo[playerIndex]++; @@ -3494,10 +3506,10 @@ void detect_triple_b_combo_b_pressed(Player* player) { gFrameSinceLastBCombo[playerIndex] = 9; } if ((gFrameSinceLastBCombo[playerIndex] >= 2) && (gFrameSinceLastBCombo[playerIndex] < 9)) { - if (D_801654C0[playerIndex] == 0) { + if (gPlayerBButtonComboActiveThisFrame[playerIndex] == 0) { gCountBChangement[playerIndex]++; } - D_801654C0[playerIndex] = 1; + gPlayerBButtonComboActiveThisFrame[playerIndex] = 1; } if (gCountBChangement[playerIndex] == 5) { gIsPlayerTripleBButtonCombo[playerIndex] = true; @@ -3645,7 +3657,7 @@ void player_decelerate_during_start_sequence(Player* player, f32 speedReduction) player->currentSpeed = 0.0f; } if (player->speed < 0.2) { - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; } if (player->topSpeed <= player->currentSpeed) { player->currentSpeed = player->topSpeed; @@ -3949,16 +3961,16 @@ void func_80033AE0(Player* player, struct Controller* controller, s8 arg2) { sp2CC = 8; } } - if ((player->unk_0DE & 1) == 1) { + if ((player->waterInteractionFlags & WATER_IS_FULLY_SUBMERGED) == WATER_IS_FULLY_SUBMERGED) { sp2C8 *= 1.5; sp2CC *= 1.5; } else { - if ((player->unk_0DE & 2) == 2) { + if ((player->waterInteractionFlags & WATER_IS_PARTIALLY_SUBMERGED) == WATER_IS_PARTIALLY_SUBMERGED) { sp2C8 *= 1.2; sp2CC *= 1.2; } - if ((((f64) (D_801652A0[arg2] - player->tyres[BACK_LEFT].baseHeight)) >= 3.5) || - (((f64) (D_801652A0[arg2] - player->tyres[BACK_RIGHT].baseHeight)) >= 3.5)) { + if ((((f64) (gPlayerWaterLevel[arg2] - player->tyres[BACK_LEFT].baseHeight)) >= 3.5) || + (((f64) (gPlayerWaterLevel[arg2] - player->tyres[BACK_RIGHT].baseHeight)) >= 3.5)) { sp2C8 *= 1.05; sp2CC *= 1.05; } @@ -4597,7 +4609,7 @@ void func_80037CFC(Player* player, struct Controller* controller, s8 arg2) { (controller->button & B_BUTTON)) { player->currentSpeed = 140.0f; player->unk_044 |= 1; - player->unk_08C = (player->currentSpeed * player->currentSpeed) / 25.0f; + player->kartPropulsionStrength = (player->currentSpeed * player->currentSpeed) / 25.0f; player->unk_20C = 0.0f; } if ((func_800388B0(controller) >= -0x1D) || (!(controller->button & B_BUTTON))) { @@ -4833,7 +4845,7 @@ void func_80038BE4(Player* player, s16 arg1) { player->currentSpeed = 250.0f; } player->unk_044 |= 0x20; - player->unk_08C = (player->currentSpeed * player->currentSpeed) / 25.0f; + player->kartPropulsionStrength = (player->currentSpeed * player->currentSpeed) / 25.0f; } void func_80038C6C(Player* player, UNUSED Camera* camera, s8 arg2, s8 playerId) { @@ -4879,7 +4891,7 @@ void func_80038C6C(Player* player, UNUSED Camera* camera, s8 arg2, s8 playerId) mtxf_translate_vec3f_mat3(sp108, player->orientationMatrix); spA4 += sp108[0]; sp9C += sp108[2]; - sp114[2] = player->unk_08C; + sp114[2] = player->kartPropulsionStrength; mtxf_translate_vec3f_mat3(sp114, player->orientationMatrix); sp88[0] = player->velocity[0]; @@ -4985,5 +4997,5 @@ void func_80038C6C(Player* player, UNUSED Camera* camera, s8 arg2, s8 playerId) if (player->collision.surfaceDistance[2] >= 500.0f) { player->unk_078 /= 2; } - func_8002C4F8(player, playerId); + update_player_environment_and_hazard_state(player, playerId); } diff --git a/src/player_controller.h b/src/player_controller.h index 57bb03395..65451eb7a 100644 --- a/src/player_controller.h +++ b/src/player_controller.h @@ -55,7 +55,7 @@ void func_8002BF4C(Player*, s8); void func_8002C11C(Player*); void func_8002C17C(Player*, s8); -void func_8002C4F8(Player*, s8); +void update_player_environment_and_hazard_state(Player*, s8); void func_8002C7E4(Player*, s8, s8); void func_8002C954(Player*, s8, Vec3f); void apply_effect(Player*, s8, s8); @@ -70,7 +70,7 @@ void func_8002FCA8(Player*, s8); void func_8002FE84(Player*, f32); f32 func_80030150(Player*, s8); -void func_80030A34(Player*); +void update_player_kart_hop(Player*); void detect_triple_a_combo_a_released(Player*); void detect_triple_a_combo_a_pressed(Player*); void player_accelerate_alternative(Player*); diff --git a/src/render_player.c b/src/render_player.c index 2ca70ce98..5fa8e2bbe 100644 --- a/src/render_player.c +++ b/src/render_player.c @@ -1154,7 +1154,7 @@ void func_80022A98(Player* player, s8 arg1) { } else { func_80022DB4(player, arg1); } - func_80030A34(player); + update_player_kart_hop(player); } } @@ -1627,13 +1627,13 @@ void render_kart(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { if (((s32) player->effects & HIT_EFFECT) == HIT_EFFECT) { func_80062B18(&sp148, &sp144, &sp140, 0.0f, 8.0f, 0.0f, -player->unk_048[screenId], player->unk_050[screenId]); - sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->unk_108; + sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->hopVerticalOffset; sp154[0] = player->pos[0] + sp148; sp154[2] = player->pos[2] + sp140; } else { func_80062B18(&sp148, &sp144, &sp140, 0.0f, 1.5f, 0.0f, -player->unk_048[screenId], player->unk_050[screenId]); - sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->unk_108 + (sp144 - 2.0); + sp154[1] = (player->pos[1] - player->boundingBoxSize) + player->hopVerticalOffset + (sp144 - 2.0); sp154[0] = player->pos[0] + sp148; sp154[2] = player->pos[2] + sp140; } @@ -1799,7 +1799,7 @@ void func_80025DE8(Player* player, s8 playerId, s8 screenId, s8 flipOffset) { Vec3s sp94; sp9C[0] = player->pos[0] + (sins(-player->rotation[1]) * -1.5); - sp9C[1] = ((player->pos[1] - player->boundingBoxSize) + player->unk_108) + 0.1; + sp9C[1] = ((player->pos[1] - player->boundingBoxSize) + player->hopVerticalOffset) + 0.1; sp9C[2] = player->pos[2] + (coss(-player->rotation[1]) * -1.5); sp94[0] = -0x00B6; sp94[1] = player->unk_048[screenId]; diff --git a/src/render_player.h b/src/render_player.h index 2cd79e638..ca2944a4a 100644 --- a/src/render_player.h +++ b/src/render_player.h @@ -60,7 +60,7 @@ void render_player_ice_reflection(Player*, s8, s8, s8); void render_player(Player*, s8, s8); void func_80026A48(Player*, s8); void update_wheel_palette(Player*, s8, s8, s8); -void func_80030A34(Player*); +void update_player_kart_hop(Player*); void func_8002701C(void); void func_80027024(s32, s32, s32); diff --git a/src/spawn_players.c b/src/spawn_players.c index 46be8d509..f340e8978 100644 --- a/src/spawn_players.c +++ b/src/spawn_players.c @@ -33,7 +33,7 @@ f32 D_80165230[8]; UNUSED f32 D_80165250[8]; s16 D_80165270[8]; f32 gPlayerCurrentSpeed[8]; -f32 D_801652A0[8]; +f32 gPlayerWaterLevel[8]; s32 D_801652C0[8]; s32 D_801652E0[8]; s16 D_80165300[8]; @@ -47,14 +47,14 @@ UNUSED s32 D_80165348[29]; Player* D_801653C0[8]; bool gPlayerIsThrottleActive[8]; -s32 D_80165400[8]; +s32 gPlayerAButtonComboActiveThisFrame[8]; s32 gFrameSinceLastACombo[8]; s32 gCountASwitch[8]; bool gIsPlayerTripleAButtonCombo[8]; s32 gTimerBoostTripleACombo[8]; bool gPlayerIsBrakeActive[8]; -s32 D_801654C0[8]; +s32 gPlayerBButtonComboActiveThisFrame[8]; s32 gFrameSinceLastBCombo[8]; s32 gCountBChangement[8]; bool gIsPlayerTripleBButtonCombo[8]; @@ -81,7 +81,7 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC s8 idx; player->type = PLAYER_INACTIVE; - player->unk_08C = 0; + player->kartPropulsionStrength = 0; player->characterId = characterId; player->unk_0B6 = 0; player->kartFriction = gKartFrictionTable[player->characterId]; @@ -157,16 +157,16 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC player->effects = 0; player->unk_0C0 = 0; player->unk_07C = 0; - player->unk_07A = 0; + player->hopFrameCounter = 0; player->unk_006 = 0; player->lapCount = -1; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; player->unk_090 = 0.0f; player->speed = 0.0f; player->unk_074 = 0.0f; player->type = playerType; player->unk_0CA = 0; - player->unk_0DE = 0; + player->waterInteractionFlags = WATER_NO_INTERACTION; player->unk_10C = 0; player->unk_0E2 = 0; player->unk_0E8 = 0.0f; @@ -208,7 +208,7 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC player->unk_0C8 = 0; player->unk_0CA = 0; player->boostTimer = 0; - player->unk_0DE = 0; + player->waterInteractionFlags = WATER_NO_INTERACTION; player->unk_0E0 = 0; player->unk_0E2 = 0; player->unk_10C = 0; @@ -242,7 +242,7 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC player->unk_DB4.unk14 = 0.0f; player->unk_084 = 0.0f; player->unk_088 = 0.0f; - player->unk_08C = 0.0f; + player->kartPropulsionStrength = 0.0f; player->unk_090 = 0.0f; player->speed = 0.0f; player->unk_098 = 0.0f; @@ -256,7 +256,7 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC player->kartHopJerk = 0.0f; player->kartHopAcceleration = 0.0f; player->unk_104 = 0.0f; - player->unk_108 = 0.0f; + player->hopVerticalOffset = 0.0f; player->unk_1F8 = 0.0f; player->unk_1FC = 0.0f; player->unk_208 = 0.0f; @@ -304,11 +304,11 @@ void spawn_player(Player* player, s8 playerIndex, f32 startingRow, f32 startingC gPlayerLastVelocity[playerIndex][1] = 0.0f; gPlayerLastVelocity[playerIndex][2] = 0.0f; gPlayerCurrentSpeed[playerIndex] = 0.0f; - D_801652A0[playerIndex] = 0.0f; + gPlayerWaterLevel[playerIndex] = 0.0f; gPlayerIsThrottleActive[playerIndex] = 0; - D_80165400[playerIndex] = 0; + gPlayerAButtonComboActiveThisFrame[playerIndex] = 0; gPlayerIsBrakeActive[playerIndex] = 0; - D_801654C0[playerIndex] = 0; + gPlayerBButtonComboActiveThisFrame[playerIndex] = 0; D_80165340 = 0; player->tyres[FRONT_LEFT].surfaceType = 0; diff --git a/src/spawn_players.h b/src/spawn_players.h index e0c474bd4..4eebfb089 100644 --- a/src/spawn_players.h +++ b/src/spawn_players.h @@ -29,7 +29,7 @@ extern f32 D_80165210[]; extern f32 D_80165230[]; extern s16 D_80165270[]; extern f32 gPlayerCurrentSpeed[]; -extern f32 D_801652A0[]; +extern f32 gPlayerWaterLevel[]; extern s32 D_801652C0[]; extern s32 D_801652E0[]; extern s16 D_80165300[]; @@ -39,13 +39,13 @@ extern s16 D_80165330[]; extern s16 D_80165340; extern Player* D_801653C0[]; extern bool gPlayerIsThrottleActive[]; -extern s32 D_80165400[]; +extern s32 gPlayerAButtonComboActiveThisFrame[]; extern s32 gFrameSinceLastACombo[]; extern s32 gCountASwitch[]; extern bool gIsPlayerTripleAButtonCombo[]; extern s32 gTimerBoostTripleACombo[]; extern bool gPlayerIsBrakeActive[]; -extern s32 D_801654C0[]; +extern s32 gPlayerBButtonComboActiveThisFrame[]; extern s32 gFrameSinceLastBCombo[]; extern s32 gCountBChangement[]; extern bool gIsPlayerTripleBButtonCombo[];