Archived
0

hide incorrect offers

- illegal buy offers,
  - illegal sell offers if haven't black market,
  - legal offers if haven't market
This commit is contained in:
iMoHax
2016-03-14 16:23:49 +03:00
parent 01fc65ec94
commit 5c482b16f2
9 changed files with 94 additions and 20 deletions

View File

@@ -131,14 +131,22 @@ public class StationModel {
return market.getModeler().get(station.getPlace()); return market.getModeler().get(station.getPlace());
} }
public List<OfferModel> getSells() { public List<OfferModel> getAllSells() {
return station.getAllSellOffers().stream().map(this::asModel).collect(Collectors.toList()); return station.getAllSellOffers().stream().map(this::asModel).collect(Collectors.toList());
} }
public List<OfferModel> getBuys() { public List<OfferModel> getSells() {
return station.getSellOffers().map(this::asModel).collect(Collectors.toList());
}
public List<OfferModel> getAllBuys() {
return station.getAllBuyOffers().stream().map(this::asModel).collect(Collectors.toList()); return station.getAllBuyOffers().stream().map(this::asModel).collect(Collectors.toList());
} }
public List<OfferModel> getBuys() {
return station.getBuyOffers().map(this::asModel).collect(Collectors.toList());
}
public OfferModel add(OFFER_TYPE type, ItemModel item, double price, long count){ public OfferModel add(OFFER_TYPE type, ItemModel item, double price, long count){
OfferModel offer = asModel(station.addOffer(type, ModelFabric.get(item), price, count), item); OfferModel offer = asModel(station.addOffer(type, ModelFabric.get(item), price, count), item);
LOG.info("Add offer {} to station {}", offer, station); LOG.info("Add offer {} to station {}", offer, station);

View File

@@ -72,8 +72,8 @@ public class StationUpdater {
for (SERVICE_TYPE service : station.getServices()) { for (SERVICE_TYPE service : station.getServices()) {
serviceProperty(service).set(true); serviceProperty(service).set(true);
} }
station.getSells().forEach(this::fillOffer); station.getAllSells().forEach(this::fillOffer);
station.getBuys().forEach(this::fillOffer); station.getAllBuys().forEach(this::fillOffer);
} else { } else {
name.setValue(""); name.setValue("");
type.setValue(null); type.setValue(null);

View File

@@ -2,14 +2,10 @@ package ru.trader.analysis;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import ru.trader.core.Offer; import ru.trader.core.*;
import ru.trader.core.Order;
import ru.trader.core.SERVICE_TYPE;
import ru.trader.core.Vendor;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator; import java.util.stream.Stream;
import java.util.List;
public class MarketUtils { public class MarketUtils {
private final static Logger LOG = LoggerFactory.getLogger(MarketUtils.class); private final static Logger LOG = LoggerFactory.getLogger(MarketUtils.class);
@@ -48,7 +44,8 @@ public class MarketUtils {
LOG.trace("Get orders from {}, to {}", seller, buyer); LOG.trace("Get orders from {}, to {}", seller, buyer);
List<Order> orders = new ArrayList<>(); List<Order> orders = new ArrayList<>();
if (seller.isTransit() || buyer.isTransit()) return orders; if (seller.isTransit() || buyer.isTransit()) return orders;
for (Offer sell : seller.getAllSellOffers()) { for (Iterator<Offer> iterator = seller.getSellOffers().iterator(); iterator.hasNext(); ) {
Offer sell = iterator.next();
Offer buy = buyer.getBuy(sell.getItem()); Offer buy = buyer.getBuy(sell.getItem());
if (buy != null) { if (buy != null) {
Order order = new Order(sell, buy, 1); Order order = new Order(sell, buy, 1);
@@ -60,6 +57,26 @@ public class MarketUtils {
return orders; return orders;
} }
public static boolean isIncorrect(Offer offer){
return offer != null && isIncorrect(offer.getVendor(), offer.isIllegal(), offer.getType());
}
public static boolean isIncorrect(Vendor vendor, Item item, OFFER_TYPE type){
return isIncorrect(vendor, item.isIllegal(vendor), type);
}
public static boolean isIncorrect(Vendor vendor, boolean isIllegal, OFFER_TYPE type){
if (type == OFFER_TYPE.SELL){
return isIllegal || !vendor.has(SERVICE_TYPE.MARKET);
} else {
return isIllegal ? !vendor.has(SERVICE_TYPE.BLACK_MARKET) : !vendor.has(SERVICE_TYPE.MARKET);
}
}
public static Stream<Offer> getOffers(Collection<Offer> offers){
return offers.stream().filter(o -> !isIncorrect(o));
}
public static boolean hasMarket(Vendor vendor) { public static boolean hasMarket(Vendor vendor) {
return vendor.has(SERVICE_TYPE.MARKET) || vendor.has(SERVICE_TYPE.BLACK_MARKET); return vendor.has(SERVICE_TYPE.MARKET) || vendor.has(SERVICE_TYPE.BLACK_MARKET);
} }

View File

@@ -49,7 +49,8 @@ public class RouteFiller {
LOG.trace("Fill orders for {}", seller); LOG.trace("Fill orders for {}", seller);
final int nextIndex = i+1; final int nextIndex = i+1;
Collection<Vendor> vendors = route.getVendors(nextIndex); Collection<Vendor> vendors = route.getVendors(nextIndex);
for (Offer sell : seller.getAllSellOffers()) { for (Iterator<Offer> iterator = seller.getSellOffers().iterator(); iterator.hasNext(); ) {
Offer sell = iterator.next();
for (Vendor buyer : vendors) { for (Vendor buyer : vendors) {
Offer buy = buyer.getBuy(sell.getItem()); Offer buy = buyer.getBuy(sell.getItem());
if (buy != null) { if (buy != null) {

View File

@@ -111,7 +111,8 @@ public class MarketAnalyzer {
callback.start(sellers.size()); callback.start(sellers.size());
for (Vendor vendor : sellers) { for (Vendor vendor : sellers) {
if (callback.isCancel()) break; if (callback.isCancel()) break;
for (Offer sell : vendor.getAllSellOffers()) { for (Iterator<Offer> iterator = vendor.getSellOffers().iterator(); iterator.hasNext(); ) {
Offer sell = iterator.next();
if (callback.isCancel()) break; if (callback.isCancel()) break;
LOG.trace("Sell offer {}", sell); LOG.trace("Sell offer {}", sell);
if (sell.getCount() == 0) continue; if (sell.getCount() == 0) continue;
@@ -148,7 +149,8 @@ public class MarketAnalyzer {
callback.start(sellers.size()); callback.start(sellers.size());
for (Vendor seller : sellers) { for (Vendor seller : sellers) {
if (callback.isCancel()) break; if (callback.isCancel()) break;
for (Offer sell : seller.getAllSellOffers()) { for (Iterator<Offer> iterator = seller.getSellOffers().iterator(); iterator.hasNext(); ) {
Offer sell = iterator.next();
if (callback.isCancel()) break; if (callback.isCancel()) break;
if (sell.getCount() == 0) continue; if (sell.getCount() == 0) continue;
long count = Order.getMaxCount(sell, profile.getBalance(), profile.getShip().getCargo()); long count = Order.getMaxCount(sell, profile.getBalance(), profile.getShip().getCargo());
@@ -157,7 +159,7 @@ public class MarketAnalyzer {
for (Vendor buyer : buyers) { for (Vendor buyer : buyers) {
if (callback.isCancel()) break; if (callback.isCancel()) break;
Offer buy = buyer.getBuy(sell.getItem()); Offer buy = buyer.getBuy(sell.getItem());
if (buy != null){ if (buy != null) {
Order order = new Order(sell, buy, count); Order order = new Order(sell, buy, count);
LOG.trace("Buy offer {} profit = {}", buy, order.getProfit()); LOG.trace("Buy offer {} profit = {}", buy, order.getProfit());
if (order.getProfit() < lowProfit) { if (order.getProfit() < lowProfit) {

View File

@@ -1,10 +1,12 @@
package ru.trader.core; package ru.trader.core;
import ru.trader.analysis.MarketUtils;
import ru.trader.analysis.graph.Connectable; import ru.trader.analysis.graph.Connectable;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.stream.Stream;
public interface Vendor extends Connectable<Vendor> { public interface Vendor extends Connectable<Vendor> {
@@ -55,24 +57,34 @@ public interface Vendor extends Connectable<Vendor> {
return get(OFFER_TYPE.SELL); return get(OFFER_TYPE.SELL);
} }
default Stream<Offer> getSellOffers(){
return MarketUtils.getOffers(getAllSellOffers());
}
default Collection<Offer> getAllBuyOffers(){ default Collection<Offer> getAllBuyOffers(){
return get(OFFER_TYPE.BUY); return get(OFFER_TYPE.BUY);
} }
default Stream<Offer> getBuyOffers(){
return MarketUtils.getOffers(getAllBuyOffers());
}
default Offer getSell(Item item){ default Offer getSell(Item item){
return get(OFFER_TYPE.SELL, item); Offer offer = get(OFFER_TYPE.SELL, item);
return MarketUtils.isIncorrect(offer) ? null : offer;
} }
default Offer getBuy(Item item){ default Offer getBuy(Item item){
return get(OFFER_TYPE.BUY, item); Offer offer = get(OFFER_TYPE.BUY, item);
return MarketUtils.isIncorrect(offer) ? null : offer;
} }
default boolean hasSell(Item item){ default boolean hasSell(Item item){
return has(OFFER_TYPE.SELL, item); return has(OFFER_TYPE.SELL, item) && !MarketUtils.isIncorrect(this, item, OFFER_TYPE.SELL);
} }
default boolean hasBuy(Item item){ default boolean hasBuy(Item item){
return has(OFFER_TYPE.BUY, item); return has(OFFER_TYPE.BUY, item) && !MarketUtils.isIncorrect(this, item, OFFER_TYPE.BUY);
} }

View File

@@ -46,6 +46,8 @@ public class RouteFillerTest extends Assert {
ITEM3 = market.addItem("ITEM3", null); ITEM3 = market.addItem("ITEM3", null);
v1 = market.addPlace("p1",0,0,0).addVendor("v1"); v1 = market.addPlace("p1",0,0,0).addVendor("v1");
v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v2 = market.addPlace("p2",0,0,0).addVendor("v2");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1);
@@ -88,6 +90,9 @@ public class RouteFillerTest extends Assert {
v1 = market.addPlace("p1",0,0,0).addVendor("v1"); v1 = market.addPlace("p1",0,0,0).addVendor("v1");
v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v2 = market.addPlace("p2",0,0,0).addVendor("v2");
v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v3 = market.addPlace("p3",0,0,0).addVendor("v3");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v3.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1);
v2.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v2.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1);
@@ -134,6 +139,10 @@ public class RouteFillerTest extends Assert {
v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v2 = market.addPlace("p2",0,0,0).addVendor("v2");
v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v3 = market.addPlace("p3",0,0,0).addVendor("v3");
v4 = market.addPlace("p4",0,0,0).addVendor("v4"); v4 = market.addPlace("p4",0,0,0).addVendor("v4");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v3.add(SERVICE_TYPE.MARKET);
v4.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1);
@@ -216,6 +225,11 @@ public class RouteFillerTest extends Assert {
v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v3 = market.addPlace("p3",0,0,0).addVendor("v3");
v4 = market.addPlace("p4",0,0,0).addVendor("v4"); v4 = market.addPlace("p4",0,0,0).addVendor("v4");
v5 = market.addPlace("p5",0,0,0).addVendor("v5"); v5 = market.addPlace("p5",0,0,0).addVendor("v5");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v3.add(SERVICE_TYPE.MARKET);
v4.add(SERVICE_TYPE.MARKET);
v5.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 410, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 410, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1);
@@ -277,6 +291,10 @@ public class RouteFillerTest extends Assert {
v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v2 = market.addPlace("p2",0,0,0).addVendor("v2");
v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v3 = market.addPlace("p3",0,0,0).addVendor("v3");
v4 = market.addPlace("p4",0,0,0).addVendor("v4"); v4 = market.addPlace("p4",0,0,0).addVendor("v4");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v3.add(SERVICE_TYPE.MARKET);
v4.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5);
@@ -363,6 +381,8 @@ public class RouteFillerTest extends Assert {
ITEM4 = market.addItem("ITEM4", null); ITEM4 = market.addItem("ITEM4", null);
v1 = market.addPlace("p1",0,0,0).addVendor("v1"); v1 = market.addPlace("p1",0,0,0).addVendor("v1");
v2 = market.addPlace("p2",0,1,0).addVendor("v2"); v2 = market.addPlace("p2",0,1,0).addVendor("v2");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, -1);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, -1);
@@ -382,6 +402,8 @@ public class RouteFillerTest extends Assert {
LOG.info("Init test 6B"); LOG.info("Init test 6B");
v3 = market.addPlace("p3",0,1,1).addVendor("v3"); v3 = market.addPlace("p3",0,1,1).addVendor("v3");
v4 = market.addPlace("p4",1,1,1).addVendor("v4"); v4 = market.addPlace("p4",1,1,1).addVendor("v4");
v3.add(SERVICE_TYPE.MARKET);
v4.add(SERVICE_TYPE.MARKET);
v3.addOffer(OFFER_TYPE.SELL, ITEM3, 390, -1); v3.addOffer(OFFER_TYPE.SELL, ITEM3, 390, -1);
@@ -523,6 +545,10 @@ public class RouteFillerTest extends Assert {
v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v2 = market.addPlace("p2",0,0,0).addVendor("v2");
v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v3 = market.addPlace("p3",0,0,0).addVendor("v3");
v4 = market.addPlace("p4",0,0,0).addVendor("v4"); v4 = market.addPlace("p4",0,0,0).addVendor("v4");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v3.add(SERVICE_TYPE.MARKET);
v4.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5);
@@ -591,6 +617,10 @@ public class RouteFillerTest extends Assert {
v2 = market.addPlace("p2",0,0,0).addVendor("v2"); v2 = market.addPlace("p2",0,0,0).addVendor("v2");
v3 = market.addPlace("p3",0,0,0).addVendor("v3"); v3 = market.addPlace("p3",0,0,0).addVendor("v3");
v4 = market.addPlace("p4",0,0,0).addVendor("v4"); v4 = market.addPlace("p4",0,0,0).addVendor("v4");
v1.add(SERVICE_TYPE.MARKET);
v2.add(SERVICE_TYPE.MARKET);
v3.add(SERVICE_TYPE.MARKET);
v4.add(SERVICE_TYPE.MARKET);
v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM1, 100, 5);
v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM2, 200, 5);
v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5); v1.addOffer(OFFER_TYPE.SELL, ITEM3, 300, 5);

View File

@@ -25,8 +25,10 @@ public class VendorTest extends Assert {
public void fillVendor(){ public void fillVendor(){
sellVendor = new SimpleVendor(); sellVendor = new SimpleVendor();
sellVendor.add(SELL_OFFER); sellVendor.add(SELL_OFFER);
sellVendor.add(SERVICE_TYPE.MARKET);
buyVendor = new SimpleVendor(); buyVendor = new SimpleVendor();
buyVendor.add(BUY_OFFER); buyVendor.add(BUY_OFFER);
buyVendor.add(SERVICE_TYPE.MARKET);
} }
@Test @Test

View File

@@ -39,12 +39,14 @@ public class VendorTest2 extends Assert {
sellVendor.add(SELL_OFFER2); sellVendor.add(SELL_OFFER2);
sellVendor.add(SELL_OFFER3); sellVendor.add(SELL_OFFER3);
sellVendor.add(DUBLE_SELL_OFFER1); sellVendor.add(DUBLE_SELL_OFFER1);
sellVendor.add(SERVICE_TYPE.MARKET);
buyVendor = new SimpleVendor(); buyVendor = new SimpleVendor();
buyVendor.add(BUY_OFFER1); buyVendor.add(BUY_OFFER1);
buyVendor.add(BUY_OFFER2); buyVendor.add(BUY_OFFER2);
buyVendor.add(BUY_OFFER3); buyVendor.add(BUY_OFFER3);
buyVendor.add(DUBLE_BUY_OFFER1); buyVendor.add(DUBLE_BUY_OFFER1);
buyVendor.add(SERVICE_TYPE.MARKET);
} }
@Test @Test