summaryrefslogtreecommitdiff
path: root/src/engine/vehicles/Utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine/vehicles/Utils.cpp')
-rw-r--r--src/engine/vehicles/Utils.cpp30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/engine/vehicles/Utils.cpp b/src/engine/vehicles/Utils.cpp
index d2a3ece57..6f51ea731 100644
--- a/src/engine/vehicles/Utils.cpp
+++ b/src/engine/vehicles/Utils.cpp
@@ -10,3 +10,33 @@ extern "C" {
uint32_t CalculateWaypointDistribution(size_t i, uint32_t numVehicles, size_t numWaypoints, uint32_t centerWaypoint) {
return (uint32_t)(((i * numWaypoints) / numVehicles) + centerWaypoint) % numWaypoints;
}
+
+uint32_t GetVehiclePathPointDistributed(std::vector<uint32_t>& existingTrains, uint32_t numWaypoints) {
+ if (existingTrains.empty()) {
+ return 0; // first train at start
+ }
+
+ // Sort trains along path
+ std::sort(existingTrains.begin(), existingTrains.end());
+
+ if (existingTrains.size() == 1) {
+ // Place train halfway around the path
+ return (existingTrains[0] + numWaypoints / 2) % numWaypoints;
+ }
+
+ uint32_t bestGap = 0;
+ uint32_t bestPos = 0;
+
+ for (size_t i = 0; i < existingTrains.size(); i++) {
+ uint32_t start = existingTrains[i];
+ uint32_t end = existingTrains[(i + 1) % existingTrains.size()];
+ uint32_t gap = (end + numWaypoints - start) % numWaypoints;
+
+ if (gap > bestGap) {
+ bestGap = gap;
+ bestPos = (start + gap / 2) % numWaypoints;
+ }
+ }
+
+ return bestPos;
+}