summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/train_cmd.cpp27
-rw-r--r--src/vehicle.cpp33
-rw-r--r--src/vehicle_base.h1
3 files changed, 35 insertions, 26 deletions
diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp
index 824745ec6..b1119d8ee 100644
--- a/src/train_cmd.cpp
+++ b/src/train_cmd.cpp
@@ -2408,32 +2408,7 @@ static Track ChooseTrainTrack(Train *v, TileIndex tile, DiagDirection enterdir,
Track next_track = DoTrainPathfind(v, new_tile, dest_enterdir, tracks, &path_not_found, do_track_reservation, &res_dest);
if (new_tile == tile) best_track = next_track;
-
- /* handle "path not found" state */
- if (path_not_found) {
- /* PF didn't find the route */
- if (!HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) {
- /* It is first time the problem occurred, set the "lost" flag. */
- SetBit(v->vehicle_flags, VF_PATHFINDER_LOST);
- /* and notify user about the event */
- AI::NewEvent(v->owner, new AIEventVehicleLost(v->index));
- if (_settings_client.gui.lost_vehicle_warn && v->owner == _local_company) {
- SetDParam(0, v->index);
- AddVehicleNewsItem(
- STR_NEWS_VEHICLE_IS_LOST,
- NS_ADVICE,
- v->index
- );
- }
- }
- } else {
- /* route found, is the train marked with "path not found" flag? */
- if (HasBit(v->vehicle_flags, VF_PATHFINDER_LOST)) {
- /* clear the flag as the PF's problem was solved */
- ClrBit(v->vehicle_flags, VF_PATHFINDER_LOST);
- /* can we also delete the "News" item somehow? */
- }
- }
+ v->HandlePathfindingResult(!path_not_found);
}
/* No track reservation requested -> finished. */
diff --git a/src/vehicle.cpp b/src/vehicle.cpp
index b7bae6cb0..0c42fbaf0 100644
--- a/src/vehicle.cpp
+++ b/src/vehicle.cpp
@@ -624,6 +624,39 @@ bool Vehicle::IsEngineCountable() const
}
}
+/**
+ * Handle the pathfinding result, especially the lost status.
+ * If the vehicle is now lost and wasn't previously fire an
+ * event to the AIs and a news message to the user. If the
+ * vehicle is not lost anymore remove the news message.
+ * @param path_found Whether the vehicle has a path to its destination.
+ */
+void Vehicle::HandlePathfindingResult(bool path_found)
+{
+ if (path_found) {
+ /* Route found, is the vehicle marked with "lost" flag? */
+ if (!HasBit(this->vehicle_flags, VF_PATHFINDER_LOST)) return;
+
+ /* Clear the flag as the PF's problem was solved. */
+ ClrBit(this->vehicle_flags, VF_PATHFINDER_LOST);
+ /* Delete the news item. */
+ DeleteVehicleNews(this->index, STR_NEWS_VEHICLE_IS_LOST);
+ return;
+ }
+
+ /* Were we already lost? */
+ if (HasBit(this->vehicle_flags, VF_PATHFINDER_LOST)) return;
+
+ /* It is first time the problem occurred, set the "lost" flag. */
+ SetBit(this->vehicle_flags, VF_PATHFINDER_LOST);
+ /* Notify user about the event. */
+ AI::NewEvent(this->owner, new AIEventVehicleLost(this->index));
+ if (_settings_client.gui.lost_vehicle_warn && this->owner == _local_company) {
+ SetDParam(0, this->index);
+ AddVehicleNewsItem(STR_NEWS_VEHICLE_IS_LOST, NS_ADVICE, this->index);
+ }
+}
+
void Vehicle::PreDestructor()
{
if (CleaningPool()) return;
diff --git a/src/vehicle_base.h b/src/vehicle_base.h
index f0cd76628..642b80424 100644
--- a/src/vehicle_base.h
+++ b/src/vehicle_base.h
@@ -660,6 +660,7 @@ public:
bool IsEngineCountable() const;
bool HasDepotOrder() const;
+ void HandlePathfindingResult(bool path_found);
};
#define FOR_ALL_VEHICLES_FROM(var, start) FOR_ALL_ITEMS_FROM(Vehicle, vehicle_index, var, start)