summaryrefslogtreecommitdiff
path: root/src/pathfinder/npf/npf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pathfinder/npf/npf.cpp')
-rw-r--r--src/pathfinder/npf/npf.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/pathfinder/npf/npf.cpp b/src/pathfinder/npf/npf.cpp
index 53f84f2a7..f10e4cd9e 100644
--- a/src/pathfinder/npf/npf.cpp
+++ b/src/pathfinder/npf/npf.cpp
@@ -14,6 +14,7 @@
#include "../../viewport_func.h"
#include "../../ship.h"
#include "../../roadstop_base.h"
+#include "../../vehicle_func.h"
#include "../pathfinder_func.h"
#include "../pathfinder_type.h"
#include "../follow_track.hpp"
@@ -303,6 +304,15 @@ static void NPFMarkTile(TileIndex tile)
}
}
+static Vehicle *CountShipProc(Vehicle *v, void *data)
+{
+ uint *count = (uint *)data;
+ /* Ignore other vehicles (aircraft) and ships inside depot. */
+ if (v->type == VEH_SHIP && (v->vehstatus & VS_HIDDEN) == 0) (*count)++;
+
+ return nullptr;
+}
+
static int32 NPFWaterPathCost(AyStar *as, AyStarNode *current, OpenListNode *parent)
{
/* TileIndex tile = current->tile; */
@@ -319,6 +329,13 @@ static int32 NPFWaterPathCost(AyStar *as, AyStarNode *current, OpenListNode *par
cost += _settings_game.pf.npf.npf_water_curve_penalty;
}
+ if (IsDockingTile(current->tile)) {
+ /* Check docking tile for occupancy */
+ uint count = 1;
+ HasVehicleOnPos(current->tile, &count, &CountShipProc);
+ cost += count * 3 * _trackdir_length[trackdir];
+ }
+
/* @todo More penalties? */
return cost;