diff --git a/src/aircraft.h b/src/aircraft.h index 0876fee7f4..1baad94c77 100644 --- a/src/aircraft.h +++ b/src/aircraft.h @@ -131,6 +131,7 @@ struct Aircraft : public Vehicle { virtual ~Aircraft() {} const char *GetTypeString() { return "aircraft"; } + void MarkDirty(); }; #endif /* AIRCRAFT_H */ diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp index 4993b6d4ab..88716c8298 100644 --- a/src/aircraft_cmd.cpp +++ b/src/aircraft_cmd.cpp @@ -1385,14 +1385,11 @@ static void ProcessAircraftOrder(Vehicle *v) InvalidateWindowClasses(WC_AIRCRAFT_LIST); } -/** Mark all views dirty for an aircraft. - * @param v vehicle to be redrawn. - */ -static void MarkAircraftDirty(Vehicle *v) +void Aircraft::MarkDirty() { - v->cur_image = GetAircraftImage(v, v->direction); - if (v->subtype == AIR_HELICOPTER) v->next->next->cur_image = GetRotorImage(v); - MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1); + this->cur_image = GetAircraftImage(this, this->direction); + if (this->subtype == AIR_HELICOPTER) this->next->next->cur_image = GetRotorImage(this); + MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1); } static void HandleAircraftLoading(Vehicle *v, int mode) @@ -1409,7 +1406,7 @@ static void HandleAircraftLoading(Vehicle *v, int mode) SET_EXPENSES_TYPE(EXPENSES_AIRCRAFT_INC); if (LoadUnloadVehicle(v, false)) { InvalidateWindow(WC_AIRCRAFT_LIST, v->owner); - MarkAircraftDirty(v); + v->MarkDirty(); } return; } @@ -1417,7 +1414,7 @@ static void HandleAircraftLoading(Vehicle *v, int mode) Order b = v->current_order; v->LeaveStation(); v->current_order.Free(); - MarkAircraftDirty(v); + v->MarkDirty(); if (!(b.flags & OF_NON_STOP)) return; break; } @@ -1511,12 +1508,6 @@ static void AircraftEntersTerminal(Vehicle *v) } v->BeginLoading(); - - SET_EXPENSES_TYPE(EXPENSES_AIRCRAFT_INC); - LoadUnloadVehicle(v, true); - MarkAircraftDirty(v); - InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); - InvalidateWindowClasses(WC_AIRCRAFT_LIST); } static void AircraftLand(Vehicle *v) diff --git a/src/roadveh.h b/src/roadveh.h index 1e9ec81805..ec1e0354f5 100644 --- a/src/roadveh.h +++ b/src/roadveh.h @@ -39,6 +39,7 @@ struct RoadVehicle : public Vehicle { virtual ~RoadVehicle() {} const char *GetTypeString() { return "road vehicle"; } + void MarkDirty(); }; #endif /* ROADVEH_H */ diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp index 012233164a..c6ca012656 100644 --- a/src/roadveh_cmd.cpp +++ b/src/roadveh_cmd.cpp @@ -486,10 +486,10 @@ int32 CmdTurnRoadVeh(TileIndex tile, uint32 flags, uint32 p1, uint32 p2) } -static void MarkRoadVehDirty(Vehicle *v) +void RoadVehicle::MarkDirty() { - v->cur_image = GetRoadVehImage(v, v->direction); - MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1); + this->cur_image = GetRoadVehImage(this, this->direction); + MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1); } static void UpdateRoadVehDeltaXY(Vehicle *v) @@ -765,7 +765,7 @@ static void HandleRoadVehLoading(Vehicle *v) SET_EXPENSES_TYPE(EXPENSES_ROADVEH_INC); if (LoadUnloadVehicle(v, false)) { InvalidateWindow(WC_ROADVEH_LIST, v->owner); - MarkRoadVehDirty(v); + v->MarkDirty(); } return; } @@ -1598,15 +1598,8 @@ again: v->last_station_visited = GetStationIndex(v->tile); RoadVehArrivesAt(v, st); - v->BeginLoading(); - SET_EXPENSES_TYPE(EXPENSES_ROADVEH_INC); - if (LoadUnloadVehicle(v, true)) { - InvalidateWindow(WC_ROADVEH_LIST, v->owner); - MarkRoadVehDirty(v); - } - InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); return; } diff --git a/src/ship.h b/src/ship.h index 6c64e4a7a8..6e696f0882 100644 --- a/src/ship.h +++ b/src/ship.h @@ -40,6 +40,7 @@ struct Ship: public Vehicle { virtual ~Ship() {} const char *GetTypeString() { return "ship"; } + void MarkDirty(); }; #endif /* SHIP_H */ diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp index 10c93d97fb..6ce7676497 100644 --- a/src/ship_cmd.cpp +++ b/src/ship_cmd.cpp @@ -229,10 +229,10 @@ static void HandleBrokenShip(Vehicle *v) } } -static void MarkShipDirty(Vehicle *v) +void Ship::MarkDirty() { - v->cur_image = GetShipImage(v, v->direction); - MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1); + this->cur_image = GetShipImage(this, this->direction); + MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1); } static void PlayShipSound(Vehicle *v) @@ -313,7 +313,7 @@ static void HandleShipLoading(Vehicle *v) SET_EXPENSES_TYPE(EXPENSES_SHIP_INC); if (LoadUnloadVehicle(v, false)) { InvalidateWindow(WC_SHIPS_LIST, v->owner); - MarkShipDirty(v); + v->MarkDirty(); } return; } @@ -359,7 +359,7 @@ void RecalcShipStuff(Vehicle *v) { UpdateShipDeltaXY(v, v->direction); v->cur_image = GetShipImage(v, v->direction); - MarkShipDirty(v); + v->MarkDirty(); InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); } @@ -735,15 +735,8 @@ static void ShipController(Vehicle *v) /* Process station in the orderlist. */ st = GetStation(v->current_order.dest); if (st->facilities & FACIL_DOCK) { // ugly, ugly workaround for problem with ships able to drop off cargo at wrong stations - v->BeginLoading(); ShipArrivesAt(v, st); - - SET_EXPENSES_TYPE(EXPENSES_SHIP_INC); - if (LoadUnloadVehicle(v, true)) { - InvalidateWindow(WC_SHIPS_LIST, v->owner); - MarkShipDirty(v); - } - InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); + v->BeginLoading(); } else { // leave stations without docks right aways v->current_order.type = OT_LEAVESTATION; v->cur_order_index++; diff --git a/src/train.h b/src/train.h index 33ffc16322..8d67c4a187 100644 --- a/src/train.h +++ b/src/train.h @@ -244,6 +244,7 @@ struct Train : public Vehicle { virtual ~Train() {} const char *GetTypeString() { return "train"; } + void MarkDirty(); }; #endif /* TRAIN_H */ diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 936d13c614..e00c0bc29f 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2522,12 +2522,17 @@ static bool ProcessTrainOrder(Vehicle *v) return !at_waypoint && CheckReverseTrain(v); } -static void MarkTrainDirty(Vehicle *v) +void Train::MarkDirty() { + Vehicle *v = this; do { v->cur_image = GetTrainImage(v, v->direction); MarkAllViewportsDirty(v->left_coord, v->top_coord, v->right_coord + 1, v->bottom_coord + 1); } while ((v = v->next) != NULL); + + /* need to update acceleration and cached values since the goods on the train changed. */ + TrainCargoChanged(this); + UpdateTrainAcceleration(this); } static void HandleTrainLoading(Vehicle *v, bool mode) @@ -2551,11 +2556,7 @@ static void HandleTrainLoading(Vehicle *v, bool mode) SET_EXPENSES_TYPE(EXPENSES_TRAIN_INC); if (LoadUnloadVehicle(v, false)) { InvalidateWindow(WC_TRAINS_LIST, v->owner); - MarkTrainDirty(v); - - /* need to update acceleration and cached values since the goods on the train changed. */ - TrainCargoChanged(v); - UpdateTrainAcceleration(v); + v->MarkDirty(); } return; } @@ -2636,15 +2637,6 @@ static void TrainEnterStation(Vehicle *v, StationID station) v->BeginLoading(); v->current_order.dest = 0; - - SET_EXPENSES_TYPE(EXPENSES_TRAIN_INC); - if (LoadUnloadVehicle(v, true) != 0) { - InvalidateWindow(WC_TRAINS_LIST, v->owner); - TrainCargoChanged(v); - UpdateTrainAcceleration(v); - } - MarkTrainDirty(v); - InvalidateWindowWidget(WC_VEHICLE_VIEW, v->index, STATUS_BAR); } static byte AfterSetTrainPos(Vehicle *v, bool new_tile) diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 5338bd554c..5ec8c1c5f4 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2980,6 +2980,17 @@ void Vehicle::BeginLoading() current_order.type = OT_LOADING; GetStation(this->last_station_visited)->loading_vehicles.push_back(this); + + static const int expense_type[] = { EXPENSES_TRAIN_INC, EXPENSES_ROADVEH_INC, EXPENSES_SHIP_INC, EXPENSES_AIRCRAFT_INC }; + SET_EXPENSES_TYPE(expense_type[this->type]); + + if (LoadUnloadVehicle(this, true) != 0) { + static const WindowClass invalidate_windows[] = { WC_TRAINS_LIST, WC_ROADVEH_LIST, WC_SHIPS_LIST, WC_AIRCRAFT_LIST }; + InvalidateWindow(invalidate_windows[this->type], this->owner); + + this->MarkDirty(); + } + InvalidateWindowWidget(WC_VEHICLE_VIEW, this->index, STATUS_BAR); } void Vehicle::LeaveStation() diff --git a/src/vehicle.h b/src/vehicle.h index df5daf1a42..2a1b75d25c 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -353,6 +353,11 @@ struct Vehicle { * @return the string representation. */ virtual const char* GetTypeString() = 0; + + /** + * Marks the vehicles to be redrawn and updates cached variables + */ + virtual void MarkDirty() {} }; /** @@ -417,6 +422,7 @@ struct InvalidVehicle : public Vehicle { virtual ~InvalidVehicle() {} const char *GetTypeString() { return "invalid vehicle"; } + void MarkDirty() { NOT_REACHED(); } }; #define is_custom_sprite(x) (x >= 0xFD)