- lay tyre tracks only if wheels on ground

- new SurfaceType enum
This commit is contained in:
InspirationByte 2022-01-25 21:17:14 +03:00
parent 2a9fd24865
commit 973729f117
5 changed files with 47 additions and 36 deletions

View File

@ -11,9 +11,9 @@
#include "main.h" #include "main.h"
#include "ASM/d2mapasm.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() sdPlane* GetSeaPlane()
{ {

View File

@ -1511,7 +1511,7 @@ void CheckCarEffects(CAR_DATA* cp, int player_id)
for (cnt = 0; cnt < 4; cnt++) for (cnt = 0; cnt < 4; cnt++)
{ {
if (cp->hd.wheel[cnt].susCompression != 0) if (cp->hd.wheel[cnt].susCompression != 0)
wheels_on_ground = 1; wheels_on_ground |= 1 << cnt;
} }
skidsound = 0; skidsound = 0;
@ -1523,7 +1523,7 @@ void CheckCarEffects(CAR_DATA* cp, int player_id)
rear_vel = ABS(cp->hd.rear_vel); rear_vel = ABS(cp->hd.rear_vel);
front_vel = ABS(cp->hd.front_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; lay_down_tracks |= 1;
@ -1536,7 +1536,7 @@ void CheckCarEffects(CAR_DATA* cp, int player_id)
skidsound = 13000; skidsound = 13000;
} }
if (front_vel > 15000) if ((wheels_on_ground & 10) && front_vel > 15000)
{ {
lay_down_tracks |= 2; lay_down_tracks |= 2;
} }
@ -1667,18 +1667,21 @@ void CheckCarEffects(CAR_DATA* cp, int player_id)
// make tyre tracks // make tyre tracks
GetTyreTrackPositions(cp, player_id); 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 (lay_down_tracks & 1) // rear
{ {
#if MAX_TYRE_TRACK_WHEELS == 4 #if MAX_TYRE_TRACK_WHEELS == 4
AddTyreTrack(0, tracks_and_smoke, player_id, last_track_state[player_id][0] != -1); ADD_WHEEL_TYRE_TRACK(0, 0)
AddTyreTrack(2, tracks_and_smoke, player_id, last_track_state[player_id][2] != -1); ADD_WHEEL_TYRE_TRACK(2, 2)
last_track_state[player_id][0] = 1;
last_track_state[player_id][2] = 1;
#else #else
AddTyreTrack(0, tracks_and_smoke, player_id, last_track_state[player_id][0] != -1); ADD_WHEEL_TYRE_TRACK(0, 0)
AddTyreTrack(1, tracks_and_smoke, player_id, last_track_state[player_id][1] != -1); ADD_WHEEL_TYRE_TRACK(2, 1)
last_track_state[player_id][0] = 1;
last_track_state[player_id][1] = 1;
#endif #endif
} }
else else
@ -1695,17 +1698,17 @@ void CheckCarEffects(CAR_DATA* cp, int player_id)
#if MAX_TYRE_TRACK_WHEELS == 4 #if MAX_TYRE_TRACK_WHEELS == 4
if (lay_down_tracks & 2) // front if (lay_down_tracks & 2) // front
{ {
AddTyreTrack(1, tracks_and_smoke, player_id, last_track_state[player_id][1] != -1); ADD_WHEEL_TYRE_TRACK(1, 1)
AddTyreTrack(3, tracks_and_smoke, player_id, last_track_state[player_id][3] != -1); ADD_WHEEL_TYRE_TRACK(3, 3)
last_track_state[player_id][1] = 1;
last_track_state[player_id][3] = 1;
} }
else else
{ {
last_track_state[player_id][1] = -1; last_track_state[player_id][1] = -1;
last_track_state[player_id][3] = -1; last_track_state[player_id][3] = -1;
} }
#endif #endif
#undef ADD_WHEEL_TYRE_TRACK
SetTyreTrackOldPositions(player_id); SetTyreTrackOldPositions(player_id);
} }

View File

@ -137,10 +137,10 @@ void AddTyreTrack(int wheel, int tracksAndSmoke, int player_id, int continuous_t
// check surface type // check surface type
if (SurfaceDataPtr != NULL) if (SurfaceDataPtr != NULL)
{ {
if (SurfaceDataPtr->surface == 6) if (SurfaceDataPtr->surface == SURF_WATER)
return; return;
if (SurfaceDataPtr->surface == 4) if (SurfaceDataPtr->surface == SURF_GRASS)
{ {
tt_p->surface = 2; tt_p->surface = 2;
player[player_id].onGrass = 1; player[player_id].onGrass = 1;
@ -162,10 +162,10 @@ void AddTyreTrack(int wheel, int tracksAndSmoke, int player_id, int continuous_t
SurfaceDataPtr = sdGetCell(newtp); SurfaceDataPtr = sdGetCell(newtp);
trackSurface = 1; trackSurface = 1;
if (SurfaceDataPtr->surface == 6) if (SurfaceDataPtr->surface == SURF_WATER)
return; return;
if (SurfaceDataPtr->surface == 4) if (SurfaceDataPtr->surface == SURF_GRASS)
trackSurface = 2; trackSurface = 2;
} }

View File

@ -253,7 +253,7 @@ void AddWheelForcesDriver1(CAR_DATA* cp, CAR_LOCALS* cl)
friction_coef = (newCompression * (32400 - wetness) >> 15) + 500; friction_coef = (newCompression * (32400 - wetness) >> 15) + 500;
if (SurfacePtr != NULL) if (SurfacePtr != NULL)
wheel->onGrass = SurfacePtr->surface == 4; wheel->onGrass = SurfacePtr->surface == SURF_GRASS;
else else
wheel->onGrass = 0; wheel->onGrass = 0;
@ -261,10 +261,10 @@ void AddWheelForcesDriver1(CAR_DATA* cp, CAR_LOCALS* cl)
{ {
switch (SurfacePtr->surface) switch (SurfacePtr->surface)
{ {
case 4: case SURF_GRASS:
case 6: case SURF_WATER:
case 9: case SURF_DEEPWATER:
case 11: case SURF_SAND:
wheel->surface = 0x80; wheel->surface = 0x80;
break; break;
default: default:
@ -277,14 +277,14 @@ void AddWheelForcesDriver1(CAR_DATA* cp, CAR_LOCALS* cl)
switch (SurfacePtr->surface) switch (SurfacePtr->surface)
{ {
case 8: case SURF_ALLEY:
wheel->surface |= 0x2; wheel->surface |= 0x2;
break; break;
case 6: case SURF_WATER:
case 9: case SURF_DEEPWATER:
wheel->surface |= 0x1; wheel->surface |= 0x1;
break; break;
case 11: case SURF_SAND:
wheel->surface |= 0x3; wheel->surface |= 0x3;
break; break;
} }
@ -697,7 +697,7 @@ void StepOneCar(CAR_DATA* cp)
Setup_Debris((VECTOR*)&deepestPoint, &direction, 10, 0); 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); CollisionSound(GetPlayerId(cp), cp, (impulse / 6 + (impulse >> 0x1f) >> 3) - (impulse >> 0x1f), 0);
} }

View File

@ -152,12 +152,20 @@ struct DRIVER2_JUNCTION
u_int flags; 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 typedef struct _sdPlane
{ {
short surface; short surface; // also one of SurfaceTypes
short a; short a, b, c;
short b;
short c;
int d; int d;
} sdPlane; } sdPlane;