forked from mirrors/0ad
Fix market exploit by basing the price change on the amount purchased.
Fix credit to Atrik Credit for test fix goes to Itms Fixes #6760
This commit is contained in:
committed by
real_tabasco_sauce
parent
eba8439295
commit
94d3699ce4
@@ -113,7 +113,7 @@ Barter.prototype.ExchangeResources = function(playerID, resourceToSell, resource
|
||||
cmpStatisticsTracker.IncreaseResourcesBoughtCounter(resourceToBuy, amountToAdd);
|
||||
}
|
||||
|
||||
const difference = this.DIFFERENCE_PER_DEAL * amount / this.DEAL_AMOUNT;
|
||||
const difference = this.DIFFERENCE_PER_DEAL * amountToAdd / this.DEAL_AMOUNT;
|
||||
// Overall price difference (dynamic +/- constant) can't exceed +-99%.
|
||||
const maxDifference = this.DEAL_AMOUNT * 0.99;
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ cmpBarter.priceDifferences = { "wood": 0, "stone": 0, "metal": 0 };
|
||||
cmpBarter.ExchangeResources(playerID, "wood", "stone", 100);
|
||||
TS_ASSERT_EQUALS(cmpBarter.restoreTimer, 7);
|
||||
TS_ASSERT(timerActivated);
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL, "stone": cmpBarter.DIFFERENCE_PER_DEAL, "metal": 0 });
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "stone": cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "metal": 0 });
|
||||
TS_ASSERT_EQUALS(sold, 100);
|
||||
TS_ASSERT_EQUALS(bought, Math.round(100 * (100 - cmpBarter.CONSTANT_DIFFERENCE + 0) / (100 + cmpBarter.CONSTANT_DIFFERENCE + 0)));
|
||||
|
||||
@@ -125,12 +125,12 @@ TS_ASSERT_EQUALS(bought, 0);
|
||||
|
||||
cmpBarter.priceDifferences = { "wood": 0, "stone": 99 - cmpBarter.CONSTANT_DIFFERENCE, "metal": 0 };
|
||||
cmpBarter.ExchangeResources(playerID, "wood", "stone", 100);
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL, "stone": 99 - cmpBarter.CONSTANT_DIFFERENCE, "metal": 0 });
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "stone": 99 - cmpBarter.CONSTANT_DIFFERENCE, "metal": 0 });
|
||||
TS_ASSERT_EQUALS(bought, Math.round(100 * (100 - cmpBarter.CONSTANT_DIFFERENCE + 0) / (100 + cmpBarter.CONSTANT_DIFFERENCE + 99 - cmpBarter.CONSTANT_DIFFERENCE)));
|
||||
|
||||
cmpBarter.priceDifferences = { "wood": -99 + cmpBarter.CONSTANT_DIFFERENCE, "stone": 0, "metal": 0 };
|
||||
cmpBarter.ExchangeResources(playerID, "wood", "stone", 100);
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -99 + cmpBarter.CONSTANT_DIFFERENCE, "stone": cmpBarter.DIFFERENCE_PER_DEAL, "metal": 0 });
|
||||
TS_ASSERT_UNEVAL_EQUALS(cmpBarter.priceDifferences, { "wood": -99 + cmpBarter.CONSTANT_DIFFERENCE, "stone": cmpBarter.DIFFERENCE_PER_DEAL * bought / 100, "metal": 0 });
|
||||
TS_ASSERT_EQUALS(bought, Math.round(100 * (100 - cmpBarter.CONSTANT_DIFFERENCE - 99 + cmpBarter.CONSTANT_DIFFERENCE) / (100 + cmpBarter.CONSTANT_DIFFERENCE + 0)));
|
||||
|
||||
cmpBarter.priceDifferences = { "wood": 0, "stone": 0, "metal": 0 };
|
||||
|
||||
Reference in New Issue
Block a user