summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--aircraft.h1
-rw-r--r--aircraft_cmd.c57
-rw-r--r--rail_cmd.c2
-rw-r--r--road_cmd.c4
-rw-r--r--roadveh_cmd.c46
-rw-r--r--ship.h1
-rw-r--r--ship_cmd.c48
-rw-r--r--train_cmd.c49
-rw-r--r--vehicle.c79
-rw-r--r--vehicle.h3
10 files changed, 93 insertions, 197 deletions
diff --git a/aircraft.h b/aircraft.h
index 132aa6a96..b7c93ee28 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 440347bdc..a64227a97 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 653444ffa..206b9cbad 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 bcf57f94b..999c24bf7 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 a38701237..f6817de62 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 eb81ef9a6..4f91276ef 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 913fa93ce..857e1d385 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 5c1abe6ae..e1c0ac017 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 fc3c78c54..b29338c91 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 efdba0a24..f7ec20d3b 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 */