diff --git a/core/src/main/java/ru/trader/analysis/RouteSearcher.java b/core/src/main/java/ru/trader/analysis/RouteSearcher.java index 5a3071c..0eb2329 100644 --- a/core/src/main/java/ru/trader/analysis/RouteSearcher.java +++ b/core/src/main/java/ru/trader/analysis/RouteSearcher.java @@ -3,10 +3,7 @@ package ru.trader.analysis; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ru.trader.analysis.graph.*; -import ru.trader.core.Order; -import ru.trader.core.Place; -import ru.trader.core.Profile; -import ru.trader.core.Vendor; +import ru.trader.core.*; import java.util.ArrayList; import java.util.Collection; @@ -128,6 +125,16 @@ public class RouteSearcher { } } + private static RouteEntry find(Vendor vendor, List entries){ + for (int i = entries.size() - 1; i >= 0; i--) { + RouteEntry entry = entries.get(i); + if (entry.getVendor().equals(vendor)){ + return entry; + } + } + throw new IllegalStateException(String.format("Wrong route, vendor %s not found", vendor)); + } + public static Route toRoute(List> edges, final Scorer scorer){ List entries = new ArrayList<>(edges.size()+1); Vendor buyer = null; @@ -149,8 +156,20 @@ public class RouteSearcher { entry.setFullTime(vEdge.getTime()); List orders = vEdge.getOrders(); if (!orders.isEmpty()) { + Vendor seller = orders.get(0).getSeller(); + RouteEntry sellerEntry; + if (entry.getVendor().equals(seller)){ + sellerEntry = entry; + } else { + sellerEntry = find(seller, entries); + entry.setLand(true); + } buyer = orders.get(0).getBuyer(); - entry.addAll(orders); + sellerEntry.addAll(orders); + } else { + if (!(vendor instanceof TransitVendor)){ + entry.setLand(true); + } } } if (prev != null){ @@ -162,7 +181,7 @@ public class RouteSearcher { } if (vEdge != null) { RouteEntry entry = new RouteEntry(vEdge.getTarget().getEntry(), 0, 0, 0); - if (buyer != null) entry.setLand(true); + if (!(entry.getVendor() instanceof TransitVendor)) entry.setLand(true); if (prev != null){ prev.setTime(scorer.getTime(entry, prev)); } diff --git a/core/src/main/java/ru/trader/analysis/VendorsCrawler.java b/core/src/main/java/ru/trader/analysis/VendorsCrawler.java index 1d9a124..e32e16c 100644 --- a/core/src/main/java/ru/trader/analysis/VendorsCrawler.java +++ b/core/src/main/java/ru/trader/analysis/VendorsCrawler.java @@ -3,10 +3,13 @@ package ru.trader.analysis; import org.jetbrains.annotations.NotNull; import ru.trader.analysis.graph.*; import ru.trader.core.Order; +import ru.trader.core.SERVICE_TYPE; import ru.trader.core.Vendor; import java.util.Collection; +import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; public class VendorsCrawler extends Crawler { @@ -77,7 +80,16 @@ public class VendorsCrawler extends Crawler { Path path = edge.getPath(fuel); if (path == null) return null; VendorsEdge res = new VendorsEdge(edge.getSource(), edge.getTarget(), new TransitPath(path, fuel)); - res.setOrders(MarketUtils.getStack(edge.getOrders(), balance, getScorer().getProfile().getShip().getCargo())); + List orders = Collections.emptyList(); + if (edge.getSource().getEntry().has(SERVICE_TYPE.MARKET) || !edge.getTarget().getEntry().has(SERVICE_TYPE.MARKET)){ + orders = edge.getOrders(); + } else { + Vendor seller = findMarket(); + if (seller != null) { + orders = MarketUtils.getOrders(seller, edge.getTarget().getEntry()); + } + } + res.setOrders(MarketUtils.getStack(orders, balance, getScorer().getProfile().getShip().getCargo())); return res; } @@ -88,6 +100,18 @@ public class VendorsCrawler extends Crawler { } return weight; } + + + private Vendor findMarket(){ + Optional> head = getHead(); + while (head.isPresent()) { + Traversal curr = head.get(); + Vendor vendor = curr.getTarget().getEntry(); + if (vendor.has(SERVICE_TYPE.MARKET)) return vendor; + head = curr.getHead(); + } + return null; + } } public class VendorsEdge extends ConnectibleEdge {