From 973729f117cc54e6bc8d9a11b6e777d20110f00e Mon Sep 17 00:00:00 2001 From: InspirationByte Date: Tue, 25 Jan 2022 21:17:14 +0300 Subject: [PATCH] - lay tyre tracks only if wheels on ground - new SurfaceType enum --- src_rebuild/Game/C/dr2roads.c | 4 ++-- src_rebuild/Game/C/handling.c | 35 +++++++++++++++++--------------- src_rebuild/Game/C/shadow.c | 8 ++++---- src_rebuild/Game/C/wheelforces.c | 20 +++++++++--------- src_rebuild/Game/dr2types.h | 16 +++++++++++---- 5 files changed, 47 insertions(+), 36 deletions(-) diff --git a/src_rebuild/Game/C/dr2roads.c b/src_rebuild/Game/C/dr2roads.c index c04ba24d..236d0f90 100644 --- a/src_rebuild/Game/C/dr2roads.c +++ b/src_rebuild/Game/C/dr2roads.c @@ -11,9 +11,9 @@ #include "main.h" #include "ASM/d2mapasm.h" -sdPlane default_plane = { 0, 0, 0, 0, 2048 }; +sdPlane default_plane = { SURF_CONCRETE, 0, 0, 0, 2048 }; -sdPlane sea_plane = { 9, 0, 16384, 0, 2048 }; // a default surface if FindSurfaceD2 fails +sdPlane sea_plane = { SURF_DEEPWATER, 0, 16384, 0, 2048 }; // a default surface if FindSurfaceD2 fails sdPlane* GetSeaPlane() { diff --git a/src_rebuild/Game/C/handling.c b/src_rebuild/Game/C/handling.c index 739b669f..57dab608 100644 --- a/src_rebuild/Game/C/handling.c +++ b/src_rebuild/Game/C/handling.c @@ -1511,7 +1511,7 @@ void CheckCarEffects(CAR_DATA* cp, int player_id) for (cnt = 0; cnt < 4; cnt++) { if (cp->hd.wheel[cnt].susCompression != 0) - wheels_on_ground = 1; + wheels_on_ground |= 1 << cnt; } skidsound = 0; @@ -1523,7 +1523,7 @@ void CheckCarEffects(CAR_DATA* cp, int player_id) rear_vel = ABS(cp->hd.rear_vel); front_vel = ABS(cp->hd.front_vel); - if (rear_vel > 15000 || cp->wheelspin) + if ((wheels_on_ground & 5) && (rear_vel > 15000 || cp->wheelspin)) { lay_down_tracks |= 1; @@ -1536,7 +1536,7 @@ void CheckCarEffects(CAR_DATA* cp, int player_id) skidsound = 13000; } - if (front_vel > 15000) + if ((wheels_on_ground & 10) && front_vel > 15000) { lay_down_tracks |= 2; } @@ -1667,18 +1667,21 @@ void CheckCarEffects(CAR_DATA* cp, int player_id) // make tyre tracks GetTyreTrackPositions(cp, player_id); +#define ADD_WHEEL_TYRE_TRACK(wheelNum, trackIdx) \ + if (wheels_on_ground & (1 << wheelNum)) { \ + AddTyreTrack(trackIdx, tracks_and_smoke, player_id, last_track_state[player_id][trackIdx] != -1); \ + last_track_state[player_id][trackIdx] = 1; \ + } else \ + last_track_state[player_id][trackIdx] = -1; + if (lay_down_tracks & 1) // rear { #if MAX_TYRE_TRACK_WHEELS == 4 - AddTyreTrack(0, tracks_and_smoke, player_id, last_track_state[player_id][0] != -1); - AddTyreTrack(2, tracks_and_smoke, player_id, last_track_state[player_id][2] != -1); - last_track_state[player_id][0] = 1; - last_track_state[player_id][2] = 1; + ADD_WHEEL_TYRE_TRACK(0, 0) + ADD_WHEEL_TYRE_TRACK(2, 2) #else - AddTyreTrack(0, tracks_and_smoke, player_id, last_track_state[player_id][0] != -1); - AddTyreTrack(1, tracks_and_smoke, player_id, last_track_state[player_id][1] != -1); - last_track_state[player_id][0] = 1; - last_track_state[player_id][1] = 1; + ADD_WHEEL_TYRE_TRACK(0, 0) + ADD_WHEEL_TYRE_TRACK(2, 1) #endif } else @@ -1695,17 +1698,17 @@ void CheckCarEffects(CAR_DATA* cp, int player_id) #if MAX_TYRE_TRACK_WHEELS == 4 if (lay_down_tracks & 2) // front { - AddTyreTrack(1, tracks_and_smoke, player_id, last_track_state[player_id][1] != -1); - AddTyreTrack(3, tracks_and_smoke, player_id, last_track_state[player_id][3] != -1); - last_track_state[player_id][1] = 1; - last_track_state[player_id][3] = 1; + ADD_WHEEL_TYRE_TRACK(1, 1) + ADD_WHEEL_TYRE_TRACK(3, 3) } else { last_track_state[player_id][1] = -1; last_track_state[player_id][3] = -1; } -#endif +#endif + +#undef ADD_WHEEL_TYRE_TRACK SetTyreTrackOldPositions(player_id); } diff --git a/src_rebuild/Game/C/shadow.c b/src_rebuild/Game/C/shadow.c index 49240709..cc11f43c 100644 --- a/src_rebuild/Game/C/shadow.c +++ b/src_rebuild/Game/C/shadow.c @@ -137,10 +137,10 @@ void AddTyreTrack(int wheel, int tracksAndSmoke, int player_id, int continuous_t // check surface type if (SurfaceDataPtr != NULL) { - if (SurfaceDataPtr->surface == 6) + if (SurfaceDataPtr->surface == SURF_WATER) return; - if (SurfaceDataPtr->surface == 4) + if (SurfaceDataPtr->surface == SURF_GRASS) { tt_p->surface = 2; player[player_id].onGrass = 1; @@ -162,10 +162,10 @@ void AddTyreTrack(int wheel, int tracksAndSmoke, int player_id, int continuous_t SurfaceDataPtr = sdGetCell(newtp); trackSurface = 1; - if (SurfaceDataPtr->surface == 6) + if (SurfaceDataPtr->surface == SURF_WATER) return; - if (SurfaceDataPtr->surface == 4) + if (SurfaceDataPtr->surface == SURF_GRASS) trackSurface = 2; } diff --git a/src_rebuild/Game/C/wheelforces.c b/src_rebuild/Game/C/wheelforces.c index 34a90156..1be49ff7 100644 --- a/src_rebuild/Game/C/wheelforces.c +++ b/src_rebuild/Game/C/wheelforces.c @@ -253,7 +253,7 @@ void AddWheelForcesDriver1(CAR_DATA* cp, CAR_LOCALS* cl) friction_coef = (newCompression * (32400 - wetness) >> 15) + 500; if (SurfacePtr != NULL) - wheel->onGrass = SurfacePtr->surface == 4; + wheel->onGrass = SurfacePtr->surface == SURF_GRASS; else wheel->onGrass = 0; @@ -261,10 +261,10 @@ void AddWheelForcesDriver1(CAR_DATA* cp, CAR_LOCALS* cl) { switch (SurfacePtr->surface) { - case 4: - case 6: - case 9: - case 11: + case SURF_GRASS: + case SURF_WATER: + case SURF_DEEPWATER: + case SURF_SAND: wheel->surface = 0x80; break; default: @@ -277,14 +277,14 @@ void AddWheelForcesDriver1(CAR_DATA* cp, CAR_LOCALS* cl) switch (SurfacePtr->surface) { - case 8: + case SURF_ALLEY: wheel->surface |= 0x2; break; - case 6: - case 9: + case SURF_WATER: + case SURF_DEEPWATER: wheel->surface |= 0x1; break; - case 11: + case SURF_SAND: wheel->surface |= 0x3; break; } @@ -697,7 +697,7 @@ void StepOneCar(CAR_DATA* cp) Setup_Debris((VECTOR*)&deepestPoint, &direction, 10, 0); } - if (SurfacePtr && (SurfacePtr->surface != 9) && (SurfacePtr->surface != 6)) + if (SurfacePtr && (SurfacePtr->surface != SURF_DEEPWATER) && (SurfacePtr->surface != SURF_WATER)) { CollisionSound(GetPlayerId(cp), cp, (impulse / 6 + (impulse >> 0x1f) >> 3) - (impulse >> 0x1f), 0); } diff --git a/src_rebuild/Game/dr2types.h b/src_rebuild/Game/dr2types.h index a2d301f5..3045f41d 100644 --- a/src_rebuild/Game/dr2types.h +++ b/src_rebuild/Game/dr2types.h @@ -152,12 +152,20 @@ struct DRIVER2_JUNCTION u_int flags; }; +enum SurfaceType +{ + SURF_CONCRETE = 0, // concrete/paved tiles + SURF_GRASS = 4, + SURF_WATER = 6, + SURF_ALLEY = 8, + SURF_DEEPWATER = 9, + SURF_SAND = 11, +}; + typedef struct _sdPlane { - short surface; - short a; - short b; - short c; + short surface; // also one of SurfaceTypes + short a, b, c; int d; } sdPlane;