summaryrefslogtreecommitdiff
path: root/yapf
diff options
context:
space:
mode:
authorKUDr <kudr@openttd.org>2006-10-17 16:16:19 +0000
committerKUDr <kudr@openttd.org>2006-10-17 16:16:19 +0000
commitc758f7d812af5b3421938ad0c11ff865d0f5f04b (patch)
tree70880ca0146adbd4518bce82cbad4db6e7dd3b36 /yapf
parentda639420411af786afb8935b3ffa8ae5b7a2bf02 (diff)
downloadopenttd-c758f7d812af5b3421938ad0c11ff865d0f5f04b.tar.xz
(svn r6800) -Feature change: [train is lost] message is now generated immediately when pathfinder can't find the path. (thanks MeusH, peter1138 and Brianetta for ideas and help).
Diffstat (limited to 'yapf')
-rw-r--r--yapf/yapf.h5
-rw-r--r--yapf/yapf_rail.cpp18
2 files changed, 14 insertions, 9 deletions
diff --git a/yapf/yapf.h b/yapf/yapf.h
index 55b9f73ca..3bf8468e9 100644
--- a/yapf/yapf.h
+++ b/yapf/yapf.h
@@ -27,10 +27,11 @@ Trackdir YapfChooseRoadTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir)
* @param v the train that needs to find a path
* @param tile the tile to find the path from (should be next tile the train is about to enter)
* @param enterdir diagonal direction which the RV will enter this new tile from
- * @param tracks available tracks on the new tile (to choose from)
+ * @param trackdirs available trackdirs on the new tile (to choose from)
+ * @param no_path_found [out] true is returned if no path can be found (returned Trackdir is only a 'guess')
* @return the best trackdir for next turn or INVALID_TRACKDIR if the path could not be found
*/
-Trackdir YapfChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs);
+Trackdir YapfChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool *path_not_found);
/** Used by RV multistop feature to find the nearest road stop that has a free slot.
* @param v RV (its current tile will be the origin)
diff --git a/yapf/yapf_rail.cpp b/yapf/yapf_rail.cpp
index e80614662..0dc596927 100644
--- a/yapf/yapf_rail.cpp
+++ b/yapf/yapf_rail.cpp
@@ -103,21 +103,25 @@ public:
/// return debug report character to identify the transportation type
FORCEINLINE char TransportTypeChar() const {return 't';}
- static Trackdir stChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs)
+ static Trackdir stChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool *path_not_found)
{
// create pathfinder instance
Tpf pf;
- return pf.ChooseRailTrack(v, tile, enterdir, trackdirs);
+ return pf.ChooseRailTrack(v, tile, enterdir, trackdirs, path_not_found);
}
- FORCEINLINE Trackdir ChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs)
+ FORCEINLINE Trackdir ChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool *path_not_found)
{
// set origin and destination nodes
Yapf().SetOrigin(v->tile, GetVehicleTrackdir(v), INVALID_TILE, INVALID_TRACKDIR, 1, true);
Yapf().SetDestination(v);
// find the best path
- Yapf().FindPath(v);
+ bool path_found = Yapf().FindPath(v);
+ if (!path_found && path_not_found != NULL) {
+ // tell controller that the path was only 'guessed'
+ *path_not_found = !path_found;
+ }
// if path not found - return INVALID_TRACKDIR
Trackdir next_trackdir = INVALID_TRACKDIR;
@@ -195,10 +199,10 @@ struct CYapfAnyDepotRail2 : CYapfT<CYapfRail_TypesT<CYapfAnyDepotRail2, CFollowT
struct CYapfAnyDepotRail3 : CYapfT<CYapfRail_TypesT<CYapfAnyDepotRail3, CFollowTrackRailNo90, CRailNodeListTrackDir, CYapfDestinationAnyDepotRailT , CYapfFollowAnyDepotRailT> > {};
-Trackdir YapfChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs)
+Trackdir YapfChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir, TrackdirBits trackdirs, bool *path_not_found)
{
// default is YAPF type 2
- typedef Trackdir (*PfnChooseRailTrack)(Vehicle*, TileIndex, DiagDirection, TrackdirBits);
+ typedef Trackdir (*PfnChooseRailTrack)(Vehicle*, TileIndex, DiagDirection, TrackdirBits, bool*);
PfnChooseRailTrack pfnChooseRailTrack = &CYapfRail2::stChooseRailTrack;
// check if non-default YAPF type needed
@@ -207,7 +211,7 @@ Trackdir YapfChooseRailTrack(Vehicle *v, TileIndex tile, DiagDirection enterdir,
else if (_patches.yapf.disable_node_optimization)
pfnChooseRailTrack = &CYapfRail1::stChooseRailTrack; // Trackdir, allow 90-deg
- Trackdir td_ret = pfnChooseRailTrack(v, tile, enterdir, trackdirs);
+ Trackdir td_ret = pfnChooseRailTrack(v, tile, enterdir, trackdirs, path_not_found);
return td_ret;
}