Change: Make ships stop and change direction slowly instead of instantly turning.

This commit is contained in:
Peter Nelson
2018-05-20 11:03:14 +01:00
committed by Charles Pigott
parent 479f13fc41
commit 225790892d
4 changed files with 49 additions and 12 deletions

View File

@@ -129,6 +129,8 @@ void Ship::GetImage(Direction direction, EngineImageType image_type, VehicleSpri
{
uint8 spritenum = this->spritenum;
if (image_type == EIT_ON_MAP) direction = this->rotation;
if (is_custom_sprite(spritenum)) {
GetCustomVehicleSprite(this, direction, image_type, result);
if (result->IsValid()) return;
@@ -311,7 +313,7 @@ void Ship::UpdateDeltaXY()
{32, 6, -16, -3}, // NW
};
const int8 *bb = _delta_xy_table[this->direction];
const int8 *bb = _delta_xy_table[this->rotation];
this->x_offs = bb[3];
this->y_offs = bb[2];
this->x_extent = bb[1];
@@ -370,10 +372,10 @@ static bool CheckShipLeaveDepot(Ship *v)
if (north_tracks) {
/* Leave towards north */
v->direction = DiagDirToDir(north_dir);
v->rotation = v->direction = DiagDirToDir(north_dir);
} else if (south_tracks) {
/* Leave towards south */
v->direction = DiagDirToDir(south_dir);
v->rotation = v->direction = DiagDirToDir(south_dir);
} else {
/* Both ways blocked */
return false;
@@ -543,7 +545,6 @@ static void ShipController(Ship *v)
{
uint32 r;
const byte *b;
Direction dir;
Track track;
TrackBits tracks;
@@ -563,6 +564,16 @@ static void ShipController(Ship *v)
v->ShowVisualEffect();
/* Rotating on spot */
if (v->direction != v->rotation) {
if ((v->tick_counter & 7) == 0) {
DirDiff diff = DirDifference(v->direction, v->rotation);
v->rotation = ChangeDir(v->rotation, diff > DIRDIFF_REVERSE ? DIRDIFF_45LEFT : DIRDIFF_45RIGHT);
v->UpdateViewport(true, true);
}
return;
}
if (!ShipAccelerate(v)) return;
GetNewVehiclePosResult gp = GetNewVehiclePos(v);
@@ -653,7 +664,22 @@ static void ShipController(Ship *v)
if (old_wc != new_wc) v->UpdateCache();
}
v->direction = (Direction)b[2];
Direction new_direction = (Direction)b[2];
DirDiff diff = DirDifference(new_direction, v->direction);
switch (diff) {
case DIRDIFF_SAME:
case DIRDIFF_45RIGHT:
case DIRDIFF_45LEFT:
/* Continue at speed */
v->rotation = v->direction = new_direction;
break;
default:
/* Stop for rotation */
v->cur_speed = 0;
v->direction = new_direction;
break;
}
}
} else {
/* On a bridge */
@@ -677,8 +703,8 @@ getout:
return;
reverse_direction:
dir = ReverseDir(v->direction);
v->direction = dir;
v->direction = ReverseDir(v->direction);
v->cur_speed = 0;
v->path.clear();
goto getout;
}