diff --git a/aircraft.h b/aircraft.h index 132aa6a966..b7c93ee287 100644 --- a/aircraft.h +++ b/aircraft.h @@ -21,5 +21,6 @@ static inline bool IsAircraftInHangarStopped(const Vehicle* v) uint16 AircraftDefaultCargoCapacity(CargoID cid, EngineID engine_type); void CcCloneAircraft(bool success, TileIndex tile, uint32 p1, uint32 p2); +inline void HandleAircraftEnterHangar(Vehicle *v); #endif /* AIRCRAFT_H */ diff --git a/aircraft_cmd.c b/aircraft_cmd.c index 440347bdc8..a64227a975 100644 --- a/aircraft_cmd.c +++ b/aircraft_cmd.c @@ -833,14 +833,17 @@ static void SetAircraftPosition(Vehicle *v, int x, int y, int z) } } -static void ServiceAircraft(Vehicle *v) +/** Handle Aircraft specific tasks when a an Aircraft enters a hangar + * Made inline because it's only called from one location (VehicleEnterDepot) + * Can't be moved to vehicle.c because it calls static Aircraft specific functions + * @param *v Vehicle that enters the hangar + */ +inline void HandleAircraftEnterHangar(Vehicle *v) { Vehicle *u; - v->cur_speed = 0; v->subspeed = 0; v->progress = 0; - v->vehstatus |= VS_HIDDEN; u = v->next; u->vehstatus |= VS_HIDDEN; @@ -851,10 +854,6 @@ static void ServiceAircraft(Vehicle *v) } SetAircraftPosition(v, v->x_pos, v->y_pos, v->z_pos); - InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); - - VehicleServiceInDepot(v); - InvalidateWindow(WC_VEHICLE_DETAILS, v->index); } static void PlayAircraftSound(const Vehicle* v) @@ -1385,48 +1384,6 @@ static void AircraftEntersTerminal(Vehicle *v) InvalidateWindowClasses(WC_AIRCRAFT_LIST); } - -static void AircraftEnterHangar(Vehicle *v) -{ - Order old_order; - - ServiceAircraft(v); - InvalidateWindowClasses(WC_AIRCRAFT_LIST); - - TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT); - - if (v->current_order.type == OT_GOTO_DEPOT) { - int32 cost; - - InvalidateWindow(WC_VEHICLE_VIEW, v->index); - - old_order = v->current_order; - v->current_order.type = OT_NOTHING; - v->current_order.flags = 0; - - _current_player = v->owner; - cost = DoCommand(v->tile, v->index, old_order.refit_cargo | old_order.refit_subtype << 8, DC_EXEC, CMD_REFIT_AIRCRAFT); - if (!CmdFailed(cost) && v->owner == _local_player && cost != 0) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost); - - if (HASBIT(old_order.flags, OFB_PART_OF_ORDERS)) { - v->cur_order_index++; - } else if (HASBIT(old_order.flags, OFB_HALT_IN_DEPOT)) { // force depot visit - v->vehstatus |= VS_STOPPED; - InvalidateWindowClasses(WC_AIRCRAFT_LIST); - - if (v->owner == _local_player) { - SetDParam(0, v->unitnumber); - AddNewsItem( - STR_A014_AIRCRAFT_IS_WAITING_IN, - NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), - v->index, - 0 - ); - } - } - } -} - static void AircraftLand(Vehicle *v) { v->sprite_width = v->sprite_height = 2; @@ -1493,7 +1450,7 @@ static void AircraftEventHandler_EnterTerminal(Vehicle *v, const AirportFTAClass static void AircraftEventHandler_EnterHangar(Vehicle *v, const AirportFTAClass *Airport) { - AircraftEnterHangar(v); + VehicleEnterDepot(v); v->u.air.state = Airport->layout[v->u.air.pos].heading; } diff --git a/rail_cmd.c b/rail_cmd.c index 653444ffa4..206b9cbadb 100644 --- a/rail_cmd.c +++ b/rail_cmd.c @@ -2006,7 +2006,7 @@ static uint32 VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y) v->vehstatus |= VS_HIDDEN; /* hide it */ v->direction = ReverseDir(v->direction); if (v->next == NULL) - TrainEnterDepot(v, tile); + VehicleEnterDepot(v); v->tile = tile; InvalidateWindow(WC_VEHICLE_DEPOT, tile); return 4; diff --git a/road_cmd.c b/road_cmd.c index bcf57f94b4..999c24bf71 100644 --- a/road_cmd.c +++ b/road_cmd.c @@ -22,8 +22,6 @@ #include "yapf/yapf.h" #include "depot.h" -void RoadVehEnterDepot(Vehicle *v); - static uint CountRoadBits(RoadBits r) { @@ -1057,7 +1055,7 @@ static uint32 VehicleEnter_Road(Vehicle *v, TileIndex tile, int x, int y) if (v->type == VEH_Road && v->u.road.frame == 11 && _roadveh_enter_depot_unk0[GetRoadDepotDirection(tile)] == v->u.road.state) { - RoadVehEnterDepot(v); + VehicleEnterDepot(v); return 4; } break; diff --git a/roadveh_cmd.c b/roadveh_cmd.c index a38701237a..f6817de621 100644 --- a/roadveh_cmd.c +++ b/roadveh_cmd.c @@ -1575,52 +1575,6 @@ again: RoadZPosAffectSpeed(v, SetRoadVehPosition(v, x, y)); } -void RoadVehEnterDepot(Vehicle *v) -{ - v->u.road.state = 254; - v->vehstatus |= VS_HIDDEN; - - InvalidateWindow(WC_VEHICLE_DETAILS, v->index); - - VehicleServiceInDepot(v); - - TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT); - - if (v->current_order.type == OT_GOTO_DEPOT) { - Order t; - int32 cost; - - InvalidateWindow(WC_VEHICLE_VIEW, v->index); - - t = v->current_order; - v->current_order.type = OT_DUMMY; - v->current_order.flags = 0; - - _current_player = v->owner; - cost = DoCommand(v->tile, v->index, t.refit_cargo | t.refit_subtype << 8, DC_EXEC, CMD_REFIT_ROAD_VEH); - if (!CmdFailed(cost) && v->owner == _local_player && cost != 0) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost); - - // Part of the orderlist? - if (HASBIT(t.flags, OFB_PART_OF_ORDERS)) { - v->cur_order_index++; - } else if (HASBIT(t.flags, OFB_HALT_IN_DEPOT)) { - v->vehstatus |= VS_STOPPED; - if (v->owner == _local_player) { - SetDParam(0, v->unitnumber); - AddNewsItem( - STR_9016_ROAD_VEHICLE_IS_WAITING, - NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), - v->index, - 0 - ); - } - } - } - - InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); - InvalidateWindowClasses(WC_ROADVEH_LIST); -} - static void AgeRoadVehCargo(Vehicle *v) { if (_age_cargo_skip_counter != 0) return; diff --git a/ship.h b/ship.h index eb81ef9a62..4f91276eff 100644 --- a/ship.h +++ b/ship.h @@ -6,6 +6,7 @@ #include "vehicle.h" void CcCloneShip(bool success, TileIndex tile, uint32 p1, uint32 p2); +void RecalcShipStuff(Vehicle *v); static inline bool IsShipInDepot(const Vehicle* v) { diff --git a/ship_cmd.c b/ship_cmd.c index 913fa93ce3..857e1d3858 100644 --- a/ship_cmd.c +++ b/ship_cmd.c @@ -316,7 +316,7 @@ static void UpdateShipDeltaXY(Vehicle *v, int dir) v->sprite_height = GB(x, 24, 8); } -static void RecalcShipStuff(Vehicle *v) +void RecalcShipStuff(Vehicle *v) { UpdateShipDeltaXY(v, v->direction); v->cur_image = GetShipImage(v, v->direction); @@ -391,50 +391,6 @@ static int32 EstimateShipCost(EngineID engine_type) return ShipVehInfo(engine_type)->base_cost * (_price.ship_base>>3)>>5; } -static void ShipEnterDepot(Vehicle *v) -{ - v->u.ship.state = 0x80; - v->vehstatus |= VS_HIDDEN; - v->cur_speed = 0; - RecalcShipStuff(v); - - VehicleServiceInDepot(v); - - InvalidateWindow(WC_VEHICLE_DETAILS, v->index); - - TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT); - - if (v->current_order.type == OT_GOTO_DEPOT) { - Order t; - int32 cost; - - InvalidateWindow(WC_VEHICLE_VIEW, v->index); - - t = v->current_order; - v->current_order.type = OT_DUMMY; - v->current_order.flags = 0; - - _current_player = v->owner; - cost = DoCommand(v->tile, v->index, t.refit_cargo | t.refit_subtype << 8, DC_EXEC, CMD_REFIT_SHIP); - if (!CmdFailed(cost) && v->owner == _local_player && cost != 0) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost); - - if (HASBIT(t.flags, OFB_PART_OF_ORDERS)) { - v->cur_order_index++; - } else if (HASBIT(t.flags, OFB_HALT_IN_DEPOT)) { - v->vehstatus |= VS_STOPPED; - if (v->owner == _local_player) { - SetDParam(0, v->unitnumber); - AddNewsItem( - STR_981C_SHIP_IS_WAITING_IN_DEPOT, - NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), - v->index, - 0); - } - } - } - InvalidateWindowClasses(WC_SHIPS_LIST); -} - static void ShipArrivesAt(const Vehicle* v, Station* st) { /* Check if station was ever visited before */ @@ -731,7 +687,7 @@ static void ShipController(Vehicle *v) if (v->dest_tile == gp.new_tile) { if (v->current_order.type == OT_GOTO_DEPOT) { if ((gp.x&0xF)==8 && (gp.y&0xF)==8) { - ShipEnterDepot(v); + VehicleEnterDepot(v); return; } } else if (v->current_order.type == OT_GOTO_STATION) { diff --git a/train_cmd.c b/train_cmd.c index 5c1abe6aeb..e1c0ac0179 100644 --- a/train_cmd.c +++ b/train_cmd.c @@ -3476,55 +3476,6 @@ void Train_Tick(Vehicle *v) } } - -void TrainEnterDepot(Vehicle *v, TileIndex tile) -{ - UpdateSignalsOnSegment(tile, GetRailDepotDirection(tile)); - - if (!IsFrontEngine(v)) v = GetFirstVehicleInChain(v); - - VehicleServiceInDepot(v); - - InvalidateWindow(WC_VEHICLE_DETAILS, v->index); - - v->load_unload_time_rem = 0; - v->cur_speed = 0; - - TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT); - - if (v->current_order.type == OT_GOTO_DEPOT) { - Order t; - int32 cost; - - InvalidateWindow(WC_VEHICLE_VIEW, v->index); - - t = v->current_order; - v->current_order.type = OT_DUMMY; - v->current_order.flags = 0; - - _current_player = v->owner; - cost = DoCommand(v->tile, v->index, t.refit_cargo | t.refit_subtype << 8, DC_EXEC, CMD_REFIT_RAIL_VEHICLE); - if (!CmdFailed(cost) && v->owner == _local_player && cost != 0) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost); - - if (HASBIT(t.flags, OFB_PART_OF_ORDERS)) { // Part of the orderlist? - v->u.rail.days_since_order_progr = 0; - v->cur_order_index++; - } else if (HASBIT(t.flags, OFB_HALT_IN_DEPOT)) { // User initiated? - v->vehstatus |= VS_STOPPED; - if (v->owner == _local_player) { - SetDParam(0, v->unitnumber); - AddNewsItem( - STR_8814_TRAIN_IS_WAITING_IN_DEPOT, - NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), - v->index, - 0 - ); - } - } - } - InvalidateWindowClasses(WC_TRAINS_LIST); -} - #define MAX_ACCEPTABLE_DEPOT_DIST 16 static void CheckIfTrainNeedsService(Vehicle *v) diff --git a/vehicle.c b/vehicle.c index fc3c78c54c..b29338c911 100644 --- a/vehicle.c +++ b/vehicle.c @@ -106,6 +106,7 @@ void VehicleServiceInDepot(Vehicle *v) v->date_of_last_service = _date; v->breakdowns_since_last_service = 0; v->reliability = GetEngine(v->engine_type)->reliability; + InvalidateWindow(WC_VEHICLE_DETAILS, v->index); // ensure that last service date and reliability are updated } bool VehicleNeedsService(const Vehicle *v) @@ -2416,6 +2417,84 @@ int32 SendAllVehiclesToDepot(byte type, uint32 flags, bool service, PlayerID own return (flags & DC_EXEC) ? 0 : CMD_ERROR; } +void VehicleEnterDepot(Vehicle *v) +{ + switch (v->type) { + case VEH_Train: + InvalidateWindowClasses(WC_TRAINS_LIST); + if (!IsFrontEngine(v)) v = GetFirstVehicleInChain(v); + UpdateSignalsOnSegment(v->tile, GetRailDepotDirection(v->tile)); + v->load_unload_time_rem = 0; + break; + + case VEH_Road: + InvalidateWindowClasses(WC_ROADVEH_LIST); + v->u.road.state = 254; + break; + + case VEH_Ship: + InvalidateWindowClasses(WC_SHIPS_LIST); + v->u.ship.state = 0x80; + RecalcShipStuff(v); + break; + + case VEH_Aircraft: + InvalidateWindowClasses(WC_AIRCRAFT_LIST); + HandleAircraftEnterHangar(v); + break; + default: NOT_REACHED(); + } + + InvalidateWindow(WC_VEHICLE_DEPOT, v->tile); + + v->vehstatus |= VS_HIDDEN; + v->cur_speed = 0; + + VehicleServiceInDepot(v); + + TriggerVehicle(v, VEHICLE_TRIGGER_DEPOT); + + if (v->current_order.type == OT_GOTO_DEPOT) { + Order t; + + InvalidateWindow(WC_VEHICLE_VIEW, v->index); + + t = v->current_order; + v->current_order.type = OT_DUMMY; + v->current_order.flags = 0; + + if (t.refit_cargo != CT_NO_REFIT) { + int32 cost; + + _current_player = v->owner; + cost = DoCommand(v->tile, v->index, t.refit_cargo | t.refit_subtype << 8, DC_EXEC, CMD_REFIT_VEH(v->type)); + if (!CmdFailed(cost) && v->owner == _local_player && cost != 0) ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost); + } + + if (HASBIT(t.flags, OFB_PART_OF_ORDERS)) { + /* Part of orders */ + if (v->type == VEH_Train) v->u.rail.days_since_order_progr = 0; + v->cur_order_index++; + } else if (HASBIT(t.flags, OFB_HALT_IN_DEPOT)) { + /* Force depot visit */ + v->vehstatus |= VS_STOPPED; + if (v->owner == _local_player) { + StringID string; + + switch (v->type) { + case VEH_Train: string = STR_8814_TRAIN_IS_WAITING_IN_DEPOT; break; + case VEH_Road: string = STR_9016_ROAD_VEHICLE_IS_WAITING; break; + case VEH_Ship: string = STR_981C_SHIP_IS_WAITING_IN_DEPOT; break; + case VEH_Aircraft: string = STR_A014_AIRCRAFT_IS_WAITING_IN; break; + default: NOT_REACHED(); string = STR_EMPTY; // Set the string to something to avoid a compiler warning + } + + SetDParam(0, v->unitnumber); + AddNewsItem(string, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0); + } + } + } +} /** Give a custom name to your vehicle * @param tile unused diff --git a/vehicle.h b/vehicle.h index efdba0a249..f7ec20d3b8 100644 --- a/vehicle.h +++ b/vehicle.h @@ -272,8 +272,6 @@ int32 GetRefitCost(EngineID engine_type); void ViewportAddVehicles(DrawPixelInfo *dpi); -void TrainEnterDepot(Vehicle *v, TileIndex tile); - /* train_cmd.h */ int GetTrainImage(const Vehicle* v, Direction direction); int GetAircraftImage(const Vehicle* v, Direction direction); @@ -320,6 +318,7 @@ bool VehicleNeedsService(const Vehicle *v); uint GenerateVehicleSortList(const Vehicle*** sort_list, uint16 *length_of_array, byte type, PlayerID owner, StationID station, OrderID order, uint16 depot_airport_index, uint16 window_type); void BuildDepotVehicleList(byte type, TileIndex tile, Vehicle ***engine_list, uint16 *engine_list_length, uint16 *engine_count, Vehicle ***wagon_list, uint16 *wagon_list_length, uint16 *wagon_count); int32 SendAllVehiclesToDepot(byte type, uint32 flags, bool service, PlayerID owner, uint16 vlw_flag, uint32 id); +void VehicleEnterDepot(Vehicle *v); /* Flags to add to p2 for goto depot commands */ /* Note: bits 8-10 are used for VLW flags */