summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbjarni <bjarni@openttd.org>2006-10-04 12:01:59 +0000
committerbjarni <bjarni@openttd.org>2006-10-04 12:01:59 +0000
commitdb9cdd6749079590b975f6e2fe514b1206b47518 (patch)
treede1248467189ac58bfefca72dc98668d05a651bf
parent4204eb66744be0ebf39512c50a77691f4328dff0 (diff)
downloadopenttd-db9cdd6749079590b975f6e2fe514b1206b47518.tar.xz
(svn r6637) -Codechange: merged all (vehicle type)EnterDepot into VehicleEnterDepot()
This revealed duplicated code like aircraft lists got invalidated twice Moved invalidation of the vehicle detail window to VehicleServiceInDepot() as it should always be updated when serviced
-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 */