summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/aircraft_cmd.cpp28
-rw-r--r--src/roadveh_cmd.cpp27
-rw-r--r--src/ship_cmd.cpp27
-rw-r--r--src/train_cmd.cpp31
-rw-r--r--src/vehicle.cpp34
-rw-r--r--src/vehicle.h7
6 files changed, 45 insertions, 109 deletions
diff --git a/src/aircraft_cmd.cpp b/src/aircraft_cmd.cpp
index 3dfca75bb..546022d83 100644
--- a/src/aircraft_cmd.cpp
+++ b/src/aircraft_cmd.cpp
@@ -1416,32 +1416,6 @@ void Aircraft::MarkDirty()
MarkAllViewportsDirty(this->left_coord, this->top_coord, this->right_coord + 1, this->bottom_coord + 1);
}
-static void HandleAircraftLoading(Vehicle *v, int mode)
-{
- switch (v->current_order.type) {
- case OT_LOADING: {
- if (mode != 0) return;
- if (--v->load_unload_time_rem != 0) return;
-
- if (LoadUnloadVehicle(v)) return;
-
- Order b = v->current_order;
- v->LeaveStation();
- v->current_order.Free();
- v->MarkDirty();
- if (!(b.flags & OF_NON_STOP)) return;
- break;
- }
-
- case OT_DUMMY: break;
-
- default: return;
- }
-
- v->cur_order_index++;
- InvalidateVehicleOrder(v);
-}
-
static void CrashAirplane(Vehicle *v)
{
v->vehstatus |= VS_CRASHED;
@@ -2130,7 +2104,7 @@ static void AircraftEventHandler(Vehicle *v, int loop)
HandleAircraftSmoke(v);
ProcessAircraftOrder(v);
- HandleAircraftLoading(v, loop);
+ v->HandleLoading(loop != 0);
if (v->current_order.type >= OT_LOADING) return;
diff --git a/src/roadveh_cmd.cpp b/src/roadveh_cmd.cpp
index 390a14d30..d87688600 100644
--- a/src/roadveh_cmd.cpp
+++ b/src/roadveh_cmd.cpp
@@ -753,31 +753,6 @@ static void ProcessRoadVehOrder(Vehicle *v)
InvalidateVehicleOrder(v);
}
-static void HandleRoadVehLoading(Vehicle *v)
-{
- switch (v->current_order.type) {
- case OT_LOADING: {
- Order b;
-
- if (--v->load_unload_time_rem != 0) return;
-
- if (LoadUnloadVehicle(v)) return;
-
- b = v->current_order;
- v->LeaveStation();
- if (!(b.flags & OF_NON_STOP)) return;
- break;
- }
-
- case OT_DUMMY: break;
-
- default: return;
- }
-
- v->cur_order_index++;
- InvalidateVehicleOrder(v);
-}
-
static void StartRoadVehSound(const Vehicle* v)
{
if (!PlayVehicleSound(v, VSE_START)) {
@@ -1304,7 +1279,7 @@ static void RoadVehController(Vehicle *v)
if (v->vehstatus & VS_STOPPED) return;
ProcessRoadVehOrder(v);
- HandleRoadVehLoading(v);
+ v->HandleLoading();
if (v->current_order.type == OT_LOADING) return;
diff --git a/src/ship_cmd.cpp b/src/ship_cmd.cpp
index aeda55d0d..41ee5260c 100644
--- a/src/ship_cmd.cpp
+++ b/src/ship_cmd.cpp
@@ -305,31 +305,6 @@ static void ProcessShipOrder(Vehicle *v)
InvalidateWindowClasses(WC_SHIPS_LIST);
}
-static void HandleShipLoading(Vehicle *v)
-{
- switch (v->current_order.type) {
- case OT_LOADING: {
- if (--v->load_unload_time_rem != 0) return;
-
- if (LoadUnloadVehicle(v)) return;
-
- v->PlayLeaveStationSound();
-
- Order b = v->current_order;
- v->LeaveStation();
- if (!(b.flags & OF_NON_STOP)) return;
- break;
- }
-
- case OT_DUMMY: break;
-
- default: return;
- }
-
- v->cur_order_index++;
- InvalidateVehicleOrder(v);
-}
-
void Ship::UpdateDeltaXY(Direction direction)
{
#define MKIT(a, b, c, d) ((a & 0xFF) << 24) | ((b & 0xFF) << 16) | ((c & 0xFF) << 8) | ((d & 0xFF) << 0)
@@ -681,7 +656,7 @@ static void ShipController(Vehicle *v)
if (v->vehstatus & VS_STOPPED) return;
ProcessShipOrder(v);
- HandleShipLoading(v);
+ v->HandleLoading();
if (v->current_order.type == OT_LOADING) return;
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index a28f862a6..7ed30d147 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -2526,35 +2526,6 @@ void Train::MarkDirty()
UpdateTrainAcceleration(this);
}
-static void HandleTrainLoading(Vehicle *v, bool mode)
-{
- switch (v->current_order.type) {
- case OT_LOADING: {
- if (mode) return;
-
- if (--v->load_unload_time_rem) return;
-
- if (LoadUnloadVehicle(v)) return;
-
- v->PlayLeaveStationSound();
-
- Order b = v->current_order;
- v->LeaveStation();
-
- /* If this was not the final order, don't remove it from the list. */
- if (!(b.flags & OF_NON_STOP)) return;
- break;
- }
-
- case OT_DUMMY: break;
-
- default: return;
- }
-
- v->cur_order_index++;
- InvalidateVehicleOrder(v);
-}
-
static int UpdateTrainSpeed(Vehicle *v)
{
uint accel;
@@ -3333,7 +3304,7 @@ static void TrainLocoHandler(Vehicle *v, bool mode)
return;
}
- HandleTrainLoading(v, mode);
+ v->HandleLoading(mode);
if (v->current_order.type == OT_LOADING) return;
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
index 745ca776a..89757e7e7 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -2929,6 +2929,40 @@ void Vehicle::LeaveStation()
}
+void Vehicle::HandleLoading(bool mode)
+{
+ switch (this->current_order.type) {
+ case OT_LOADING: {
+ /* Not the first call for this tick */
+ if (mode) return;
+
+ /* We have not waited enough time till the next round of loading/unloading */
+ if (--this->load_unload_time_rem) return;
+
+ /* Load/unload the vehicle; when it actually did something
+ * we do not leave the station. */
+ if (LoadUnloadVehicle(this)) return;
+
+ this->PlayLeaveStationSound();
+
+ Order b = this->current_order;
+ this->LeaveStation();
+
+ /* If this was not the final order, don't remove it from the list. */
+ if (!(b.flags & OF_NON_STOP)) return;
+ break;
+ }
+
+ case OT_DUMMY: break;
+
+ default: return;
+ }
+
+ this->cur_order_index++;
+ InvalidateVehicleOrder(this);
+}
+
+
void SpecialVehicle::UpdateDeltaXY(Direction direction)
{
this->x_offs = 0;
diff --git a/src/vehicle.h b/src/vehicle.h
index 37bff24ca..6fe8f5521 100644
--- a/src/vehicle.h
+++ b/src/vehicle.h
@@ -317,6 +317,13 @@ struct Vehicle {
void LeaveStation();
/**
+ * Handle the loading of the vehicle; when not it skips through dummy
+ * orders and does nothing in all other cases.
+ * @param mode is the non-first call for this vehicle in this tick?
+ */
+ void HandleLoading(bool mode = false);
+
+ /**
* An overriden version of new, so you can use the vehicle instance
* instead of a newly allocated piece of memory.
* @param size the size of the variable (unused)