diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index e3979d03d2..d7f3ae20b6 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -420,6 +420,20 @@ static bool CheckShipLeaveDepot(Ship *v) return false; } +static inline void UpdateShipSpeed(Vehicle *v, uint speed) +{ + if (v->cur_speed == speed) return; + + v->cur_speed = speed; + + /* updates statusbar only if speed have changed to save CPU time */ + SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); + + if (HasBit(v->vcache.cached_veh_flags, VCF_REDRAW_ON_SPEED_CHANGE)) { + v->InvalidateImageCacheOfChain(); + } +} + static bool ShipAccelerate(Vehicle *v) { uint spd; @@ -440,11 +454,7 @@ static bool ShipAccelerate(Vehicle *v) spd = std::min(spd, v->breakdown_severity); } - /* updates statusbar only if speed have changed to save CPU time */ - if (spd != v->cur_speed) { - v->cur_speed = spd; - SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); - } + UpdateShipSpeed(v, spd); /* Convert direction-independent speed into direction-dependent speed. (old movement method) */ spd = v->GetOldAdvanceSpeed(spd); @@ -626,7 +636,7 @@ static bool HandleSpeedOnAqueduct(Ship *v, TileIndex tile, TileIndex ramp) if (IsValidTile(scc.search_tile) && (HasVehicleOnPos(ramp, VEH_SHIP, &scc, FindShipOnTile) || HasVehicleOnPos(GetOtherTunnelBridgeEnd(ramp), VEH_SHIP, &scc, FindShipOnTile))) { - v->cur_speed /= 4; + UpdateShipSpeed(v, v->cur_speed / 4); } return false; } @@ -688,7 +698,7 @@ static void CheckDistanceBetweenShips(TileIndex tile, Ship *v, TrackBits tracks, if (found) { /* Speed adjustment related to distance. */ - v->cur_speed /= scc.search_tile == tile ? 8 : 2; + UpdateShipSpeed(v, v->cur_speed / (scc.search_tile == tile ? 8 : 2)); /* Clean none wanted trackbits, including pathfinder track, TRACK_BIT_WORMHOLE and no 90 degree turns. */ if (IsDiagonalTrack(track)) { @@ -756,10 +766,7 @@ static bool ShipMoveUpDownOnLock(Ship *v) int dz = ShipTestUpDownOnLock(v); if (dz == 0) return false; - if (v->cur_speed != 0) { - v->cur_speed = 0; - SetWindowWidgetDirty(WC_VEHICLE_VIEW, v->index, WID_VV_START_STOP); - } + UpdateShipSpeed(v, 0); if ((v->tick_counter & 7) == 0) { v->z_pos += dz; @@ -931,7 +938,7 @@ static void ShipController(Ship *v) default: /* Stop for rotation */ - v->cur_speed = 0; + UpdateShipSpeed(v, 0); v->direction = new_direction; /* Remember our current location to avoid movement glitch */ v->rotation_x_pos = v->x_pos; @@ -971,7 +978,7 @@ reverse_direction: /* Remember our current location to avoid movement glitch */ v->rotation_x_pos = v->x_pos; v->rotation_y_pos = v->y_pos; - v->cur_speed = 0; + UpdateShipSpeed(v, 0); v->path.clear(); goto getout; }