diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbMerchantDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbMerchantDAO.java new file mode 100644 index 000000000..ef177d26f --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbMerchantDAO.java @@ -0,0 +1,21 @@ +package com.gempukku.lotro.db; + +import java.util.Date; + +public class DbMerchantDAO implements MerchantDAO { + private DbAccess _dbAccess; + + public DbMerchantDAO(DbAccess dbAccess) { + _dbAccess = dbAccess; + } + + @Override + public void addTransaction(String blueprintId, float price, Date date) { + + } + + @Override + public Transaction getLastTransaction(String blueprintId) { + return null; + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java index bac20d1ea..687530037 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/MerchantService.java @@ -3,6 +3,7 @@ package com.gempukku.lotro.merchant; import com.gempukku.lotro.cards.packs.RarityReader; import com.gempukku.lotro.cards.packs.SetRarity; import com.gempukku.lotro.collection.CollectionsManager; +import com.gempukku.lotro.db.MerchantDAO; import com.gempukku.lotro.db.vo.CollectionType; import com.gempukku.lotro.game.CardItem; import com.gempukku.lotro.game.LotroCardBlueprintLibrary; @@ -21,20 +22,25 @@ public class MerchantService { private ReadWriteLock _lock = new ReentrantReadWriteLock(true); private Set _merchantableItems = new HashSet(); + private Set _merchantableStrings = new HashSet(); private CollectionType _permanentCollection = new CollectionType("permanent", "My cards"); private CollectionsManager _collectionsManager; - public MerchantService(LotroCardBlueprintLibrary library, CollectionsManager collectionsManager) { + public MerchantService(LotroCardBlueprintLibrary library, CollectionsManager collectionsManager, MerchantDAO merchantDAO) { _collectionsManager = collectionsManager; ParametrizedMerchant parametrizedMerchant = new ParametrizedMerchant(); parametrizedMerchant.setMerchantSetupDate(new Date()); + parametrizedMerchant.setMerchantDao(merchantDAO); _merchant = parametrizedMerchant; RarityReader rarityReader = new RarityReader(); for (int i = 0; i <= 19; i++) { SetRarity rarity = rarityReader.getSetRarity(String.valueOf(i)); - for (String blueprintId : rarity.getAllCards()) - _merchantableItems.add(new BasicCardItem(library.getBaseBlueprintId(blueprintId))); + for (String blueprintId : rarity.getAllCards()) { + String baseBlueprintId = library.getBaseBlueprintId(blueprintId); + _merchantableItems.add(new BasicCardItem(baseBlueprintId)); + _merchantableStrings.add(baseBlueprintId); + } } } @@ -50,12 +56,16 @@ public class MerchantService { Map buyPrices = new HashMap(); Map sellPrices = new HashMap(); for (CardItem cardItem : cardBlueprintIds) { - Integer buyPrice = _merchant.getCardBuyPrice(cardItem.getBlueprintId(), currentTime); + String blueprintId = cardItem.getBlueprintId(); + + Integer buyPrice = _merchant.getCardBuyPrice(blueprintId, currentTime); if (buyPrice != null) - buyPrices.put(cardItem.getBlueprintId(), buyPrice); - Integer sellPrice = _merchant.getCardSellPrice(cardItem.getBlueprintId(), currentTime); - if (sellPrice != null) - sellPrices.put(cardItem.getBlueprintId(), sellPrice); + buyPrices.put(blueprintId, buyPrice); + if (_merchantableStrings.contains(blueprintId)) { + Integer sellPrice = _merchant.getCardSellPrice(blueprintId, currentTime); + if (sellPrice != null) + sellPrices.put(blueprintId, sellPrice); + } } PriceGuarantee priceGuarantee = new PriceGuarantee(sellPrices, buyPrices, currentTime); _priceGuarantees.put(player, priceGuarantee); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/ParametrizedMerchant.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/ParametrizedMerchant.java index d8fdfe416..1b25d81a7 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/ParametrizedMerchant.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/merchant/ParametrizedMerchant.java @@ -9,7 +9,8 @@ import java.util.HashMap; import java.util.Map; public class ParametrizedMerchant implements Merchant { - private static final long DAY = 1000 * 60 * 60 * 24; + private static final int BOOSTER_PRICE = 1000; + private static final long DAY = BOOSTER_PRICE * 60 * 60 * 24; private Date _merchantSetupDate; @@ -37,15 +38,18 @@ public class ParametrizedMerchant implements Merchant { @Override public Integer getCardBuyPrice(String blueprintId, Date currentTime) { - double normalPrice = getNormalPrice(blueprintId, currentTime); + Double normalPrice = getNormalPrice(blueprintId, currentTime); + if (normalPrice == null) + return null; return (int) Math.floor(_profitMargin * normalPrice / getSetupComponent(currentTime)); } @Override public Integer getCardSellPrice(String blueprintId, Date currentTime) { - double normalPrice = getNormalPrice(blueprintId, currentTime); + Double normalPrice = getNormalPrice(blueprintId, currentTime); + if (normalPrice == null) + return null; double setupComponent = getSetupComponent(currentTime); - System.out.println(setupComponent); return (int) Math.ceil(normalPrice * setupComponent); } @@ -55,12 +59,35 @@ public class ParametrizedMerchant implements Merchant { return 1; } - private double getNormalPrice(String blueprintId, Date currentTime) { + private Double getNormalPrice(String blueprintId, Date currentTime) { MerchantDAO.Transaction lastTrans = _merchantDao.getLastTransaction(blueprintId); + if (lastTrans == null) { + Integer basePrice = getBasePrice(blueprintId); + if (basePrice == null) + return null; + lastTrans = new MerchantDAO.Transaction(_merchantSetupDate, basePrice); + } // (stored price)/(1+(fluctuation value * ms since last transaction)/(price revert time in ms)) return lastTrans.getPrice() / (1 + (_fluctuationValue * Math.pow(1f * (currentTime.getTime() - lastTrans.getDate().getTime()) / _priceRevertTimeMs, 0.9))); } + private Integer getBasePrice(String blueprintId) { + int underscoreIndex = blueprintId.indexOf("_"); + if (underscoreIndex == -1) + return null; + SetRarity rarity = _rarity.get(Integer.parseInt(blueprintId.substring(0, blueprintId.indexOf("_")))); + String cardRarity = rarity.getCardRarity(blueprintId); + if (cardRarity.equals("X")) + return 3 * BOOSTER_PRICE; + if (cardRarity.equals("R") || cardRarity.equals("P")) + return BOOSTER_PRICE; + if (cardRarity.equals("U") || cardRarity.equals("S")) + return BOOSTER_PRICE / 3; + if (cardRarity.equals("C")) + return BOOSTER_PRICE / 7; + throw new RuntimeException("Unkown rarity for priced card: " + cardRarity); + } + @Override public void cardBought(String blueprintId, Date currentTime, int price) { _merchantDao.addTransaction(blueprintId, (price / _profitMargin) * (1 + _fluctuationValue), currentTime); diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DaoProvider.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DaoProvider.java index 9e2121b36..4c607773d 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DaoProvider.java +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/DaoProvider.java @@ -15,6 +15,7 @@ import java.lang.reflect.Type; public class DaoProvider implements InjectableProvider { private Injectable _playerDaoInjectable; private Injectable _collectionDaoInjectable; + private Injectable _merchantDaoInjectable; private Injectable _deckDaoInjectable; private Injectable _gameHistoryDAOInjectable; @@ -46,6 +47,8 @@ public class DaoProvider implements InjectableProvider { return getLeagueMatchDaoSafely(); else if (type.equals(LeaguePointsDAO.class)) return getLeaguePointsDaoSafely(); + else if (type.equals(MerchantDAO.class)) + return getMerchantDaoSafely(); return null; } @@ -75,6 +78,19 @@ public class DaoProvider implements InjectableProvider { return _leagueMatchDAOInjectable; } + private synchronized Injectable getMerchantDaoSafely() { + if (_merchantDaoInjectable == null) { + final MerchantDAO merchantDAO = new DbMerchantDAO(_dbAccess); + _merchantDaoInjectable = new Injectable() { + @Override + public MerchantDAO getValue() { + return merchantDAO; + } + }; + } + return _merchantDaoInjectable; + } + private synchronized Injectable getLeagueDaoSafely() { if (_leagueDaoInjectable == null) { final LeagueDAO leagueDao = new LeagueDAO(_dbAccess, _collectionSerializer); diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerProvider.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerProvider.java index f4720c9b1..14bc96924 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerProvider.java +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerProvider.java @@ -39,6 +39,8 @@ public class ServerProvider implements InjectableProvider { @Context private CollectionDAO _collectionDao; @Context + private MerchantDAO _merchantDao; + @Context private LeagueDAO _leagueDao; @Context private LeagueMatchDAO _leagueMatchDao; @@ -100,7 +102,7 @@ public class ServerProvider implements InjectableProvider { private synchronized Injectable getMerchantServiceInjectable() { if (_merchantServiceInjectable == null) { - final MerchantService merchantService = new MerchantService(_library, getCollectionsManagerInjectable().getValue()); + final MerchantService merchantService = new MerchantService(_library, getCollectionsManagerInjectable().getValue(), _merchantDao); _merchantServiceInjectable = new Injectable() { @Override public MerchantService getValue() {