diff options
-rw-r--r-- | src/train_cmd.cpp | 27 | ||||
-rw-r--r-- | src/vehicle.cpp | 33 | ||||
-rw-r--r-- | src/vehicle_base.h | 1 |
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) |