From 3429a62f923b8ebe896e05b5e488e69738bee85e Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Tue, 13 Mar 2012 12:29:33 +0000 Subject: [PATCH] Modifying merchant. --- .../com/gempukku/lotro/db/DbMerchantDAO.java | 2 +- .../com/gempukku/lotro/db/MerchantDAO.java | 14 ++++- .../lotro/merchant/ParametrizedMerchant.java | 24 ++++--- .../lotro/merchant/MockMerchantDAO.java | 6 +- .../merchant/ParametrizedMerchantTest.java | 63 +++++++++++++++++-- 5 files changed, 91 insertions(+), 18 deletions(-) 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 index ef177d26f..1ef6c1894 100644 --- 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 @@ -10,7 +10,7 @@ public class DbMerchantDAO implements MerchantDAO { } @Override - public void addTransaction(String blueprintId, float price, Date date) { + public void addTransaction(String blueprintId, float price, Date date, TransactionType transactionType) { } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/MerchantDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/MerchantDAO.java index d50575851..36d23b482 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/MerchantDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/MerchantDAO.java @@ -5,15 +5,21 @@ import java.util.Date; public interface MerchantDAO { public Transaction getLastTransaction(String blueprintId); - public void addTransaction(String blueprintId, float price, Date date); + public void addTransaction(String blueprintId, float price, Date date, TransactionType transactionType); + + public enum TransactionType { + SELL, BUY + } public static class Transaction { private float _price; private Date _date; + private TransactionType _transactionType; - public Transaction(Date date, float price) { + public Transaction(Date date, float price, TransactionType transactionType) { _date = date; _price = price; + _transactionType = transactionType; } public Date getDate() { @@ -23,5 +29,9 @@ public interface MerchantDAO { public float getPrice() { return _price; } + + public TransactionType getTransactionType() { + return _transactionType; + } } } 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 1b25d81a7..dc1eb8c8b 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 @@ -14,10 +14,12 @@ public class ParametrizedMerchant implements Merchant { private Date _merchantSetupDate; - private float _fluctuationValue = 0.1f; - private long _priceRevertTimeMs = 5 * DAY; - private long _easingTimeMs = 30 * DAY; - private float _profitMargin = 0.7f; + private final float _fluctuationValue = 0.1f; + private final long _priceRevertTimeMs = 5 * DAY; + private final long _easingTimeMs = 30 * DAY; + private final float _profitMargin = 0.7f; + private final double _returnPrizeSlope = 0.3; + private final double _decreasePrizeSlope = 0.8; private MerchantDAO _merchantDao; private Map _rarity = new HashMap(); @@ -65,10 +67,16 @@ public class ParametrizedMerchant implements Merchant { Integer basePrice = getBasePrice(blueprintId); if (basePrice == null) return null; - lastTrans = new MerchantDAO.Transaction(_merchantSetupDate, basePrice); + lastTrans = new MerchantDAO.Transaction(_merchantSetupDate, basePrice, MerchantDAO.TransactionType.SELL); } + if (lastTrans.getDate().getTime() + _priceRevertTimeMs > currentTime.getTime()) + if (lastTrans.getTransactionType() == MerchantDAO.TransactionType.SELL) { + return (1 + _fluctuationValue) * lastTrans.getPrice() / (1 + (_fluctuationValue * Math.pow(1f * (currentTime.getTime() - lastTrans.getDate().getTime()) / _priceRevertTimeMs, _returnPrizeSlope))); + } else { + return (1 - _fluctuationValue) * lastTrans.getPrice() / (1 - (_fluctuationValue * Math.pow(1f * (currentTime.getTime() - lastTrans.getDate().getTime()) / _priceRevertTimeMs, _returnPrizeSlope))); + } // (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))); + return lastTrans.getPrice() / (1 + (_fluctuationValue * Math.pow(1f * (currentTime.getTime() - lastTrans.getDate().getTime() - _priceRevertTimeMs) / _priceRevertTimeMs, _decreasePrizeSlope))); } private Integer getBasePrice(String blueprintId) { @@ -90,11 +98,11 @@ public class ParametrizedMerchant implements Merchant { @Override public void cardBought(String blueprintId, Date currentTime, int price) { - _merchantDao.addTransaction(blueprintId, (price / _profitMargin) * (1 + _fluctuationValue), currentTime); + _merchantDao.addTransaction(blueprintId, (price / _profitMargin), currentTime, MerchantDAO.TransactionType.BUY); } @Override public void cardSold(String blueprintId, Date currentTime, int price) { - _merchantDao.addTransaction(blueprintId, price * (1 + _fluctuationValue), currentTime); + _merchantDao.addTransaction(blueprintId, price, currentTime, MerchantDAO.TransactionType.SELL); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java index eb1bceba9..46bd00765 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/MockMerchantDAO.java @@ -9,17 +9,19 @@ import java.util.Map; public class MockMerchantDAO implements MerchantDAO { private Map _prices = new HashMap(); private Map _dates = new HashMap(); + private Map _transactionTypes = new HashMap(); @Override - public void addTransaction(String blueprintId, float price, Date date) { + public void addTransaction(String blueprintId, float price, Date date, TransactionType transactionType) { _prices.put(blueprintId, price); _dates.put(blueprintId, date); + _transactionTypes.put(blueprintId, transactionType); } @Override public Transaction getLastTransaction(String blueprintId) { if (_dates.containsKey(blueprintId)) - return new Transaction(_dates.get(blueprintId), _prices.get(blueprintId)); + return new Transaction(_dates.get(blueprintId), _prices.get(blueprintId), _transactionTypes.get(blueprintId)); return null; } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/ParametrizedMerchantTest.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/ParametrizedMerchantTest.java index 674429a75..1476bf255 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/ParametrizedMerchantTest.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/merchant/ParametrizedMerchantTest.java @@ -5,10 +5,35 @@ import org.junit.Test; import java.util.Date; +import static org.junit.Assert.assertTrue; + public class ParametrizedMerchantTest { @Test - public void checkBuying() { - Date setupDate = new Date(0); + public void checkTransactionRevertsPriceAfterFiveDays() { + Date setupDate = new Date(-1000 * 60 * 60 * 24 * 50L); + Date firstTrans = new Date(0); + + MerchantDAO merchantDao = new MockMerchantDAO(); + + ParametrizedMerchant merchant = new ParametrizedMerchant(); + merchant.setMerchantDao(merchantDao); + merchant.setMerchantSetupDate(setupDate); + + merchant.cardSold("1_1", firstTrans, 1000); + merchant.cardBought("1_2", firstTrans, 1000); + + Date currentTime = new Date(1000 * 60 * 60 * 24 * 5L); + + assertEqualsMoreOrLess(1100, (int) merchant.getCardSellPrice("1_1", firstTrans)); + assertEqualsMoreOrLess(900, (int) merchant.getCardBuyPrice("1_2", firstTrans)); + + assertEqualsMoreOrLess(1000, (int) merchant.getCardSellPrice("1_1", currentTime)); + assertEqualsMoreOrLess(1000, (int) merchant.getCardBuyPrice("1_2", currentTime)); + } + + @Test + public void plotPriceAfterSold() { + Date setupDate = new Date(-1000 * 60 * 60 * 24 * 50L); Date firstTrans = new Date(0); MerchantDAO merchantDao = new MockMerchantDAO(); @@ -19,8 +44,36 @@ public class ParametrizedMerchantTest { merchant.cardSold("1_1", firstTrans, 1000); - Date buyTime = new Date(1000 * 60 * 60 * 12); - System.out.println(merchant.getCardBuyPrice("1_1", buyTime)); - System.out.println(merchant.getCardSellPrice("1_1", buyTime)); + long hour = 1000 * 60 * 60; + + System.out.println("-2,1000"); + for (long time = 0; time < hour * 24 * 20L; time += hour * 2) { + System.out.println(time / hour + "," + (int) merchant.getCardSellPrice("1_1", new Date(time))); + } + } + + @Test + public void plotPriceAfterBought() { + Date setupDate = new Date(-1000 * 60 * 60 * 24 * 50L); + Date firstTrans = new Date(0); + + MerchantDAO merchantDao = new MockMerchantDAO(); + + ParametrizedMerchant merchant = new ParametrizedMerchant(); + merchant.setMerchantDao(merchantDao); + merchant.setMerchantSetupDate(setupDate); + + merchant.cardBought("1_1", firstTrans, 700); + + long hour = 1000 * 60 * 60; + + System.out.println("-2,1000"); + for (long time = 0; time < hour * 24 * 20L; time += hour * 2) { + System.out.println(time / hour + "," + (int) merchant.getCardSellPrice("1_1", new Date(time))); + } + } + + private void assertEqualsMoreOrLess(int expected, int given) { + assertTrue("Expected " + expected + " more or less, but received " + given, given <= expected + 1 && given >= expected - 1); } }