Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/public/simulation/components/Barter.js
Show All 28 Lines | |||||
Barter.prototype.Init = function() | Barter.prototype.Init = function() | ||||
{ | { | ||||
this.priceDifferences = {}; | this.priceDifferences = {}; | ||||
for (let resource of Resources.GetCodes()) | for (let resource of Resources.GetCodes()) | ||||
this.priceDifferences[resource] = 0; | this.priceDifferences[resource] = 0; | ||||
this.restoreTimer = undefined; | this.restoreTimer = undefined; | ||||
}; | }; | ||||
Barter.prototype.GetPrices = function() | Barter.prototype.GetPrices = function(playerEntity) | ||||
{ | { | ||||
var prices = { "buy": {}, "sell": {} }; | var prices = { "buy": {}, "sell": {} }; | ||||
let cmpPlayer = Engine.QueryInterface(playerEntity, IID_Player); | |||||
let multiplier = cmpPlayer.GetBarterMultiplier(); | |||||
for (let resource of Resources.GetCodes()) | for (let resource of Resources.GetCodes()) | ||||
{ | { | ||||
let truePrice = Resources.GetResource(resource).truePrice; | let truePrice = Resources.GetResource(resource).truePrice; | ||||
prices.buy[resource] = truePrice * (100 + this.CONSTANT_DIFFERENCE + this.priceDifferences[resource]) / 100; | prices.buy[resource] = truePrice * (100 + this.CONSTANT_DIFFERENCE + this.priceDifferences[resource]) * multiplier.buy[resource] / 100; | ||||
prices.sell[resource] = truePrice * (100 - this.CONSTANT_DIFFERENCE + this.priceDifferences[resource]) / 100; | prices.sell[resource] = truePrice * (100 - this.CONSTANT_DIFFERENCE + this.priceDifferences[resource]) * multiplier.sell[resource] / 100; | ||||
} | } | ||||
return prices; | return prices; | ||||
}; | }; | ||||
Barter.prototype.PlayerHasMarket = function(playerEntity) | Barter.prototype.PlayerHasMarket = function(playerEntity) | ||||
{ | { | ||||
var cmpPlayer = Engine.QueryInterface(playerEntity, IID_Player); | var cmpPlayer = Engine.QueryInterface(playerEntity, IID_Player); | ||||
var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); | ||||
Show All 29 Lines | Barter.prototype.ExchangeResources = function(playerEntity, resourceToSell, resourceToBuy, amount) | ||||
} | } | ||||
if (!this.PlayerHasMarket(playerEntity)) | if (!this.PlayerHasMarket(playerEntity)) | ||||
{ | { | ||||
warn("ExchangeResources: player has no markets"); | warn("ExchangeResources: player has no markets"); | ||||
return; | return; | ||||
} | } | ||||
var cmpPlayer = Engine.QueryInterface(playerEntity, IID_Player); | var cmpPlayer = Engine.QueryInterface(playerEntity, IID_Player); | ||||
var prices = this.GetPrices(); | var prices = this.GetPrices(playerEntity); | ||||
var amountsToSubtract = {}; | var amountsToSubtract = {}; | ||||
amountsToSubtract[resourceToSell] = amount; | amountsToSubtract[resourceToSell] = amount; | ||||
if (cmpPlayer.TrySubtractResources(amountsToSubtract)) | if (cmpPlayer.TrySubtractResources(amountsToSubtract)) | ||||
{ | { | ||||
var amountToAdd = Math.round(prices["sell"][resourceToSell] / prices["buy"][resourceToBuy] * amount); | var amountToAdd = Math.round(prices["sell"][resourceToSell] / prices["buy"][resourceToBuy] * amount); | ||||
cmpPlayer.AddResource(resourceToBuy, amountToAdd); | cmpPlayer.AddResource(resourceToBuy, amountToAdd); | ||||
var numberOfDeals = Math.round(amount / 100); | var numberOfDeals = Math.round(amount / 100); | ||||
Show All 12 Lines | if (cmpPlayer.TrySubtractResources(amountsToSubtract)) | ||||
var cmpStatisticsTracker = Engine.QueryInterface(playerEntity, IID_StatisticsTracker); | var cmpStatisticsTracker = Engine.QueryInterface(playerEntity, IID_StatisticsTracker); | ||||
if (cmpStatisticsTracker) | if (cmpStatisticsTracker) | ||||
{ | { | ||||
cmpStatisticsTracker.IncreaseResourcesSoldCounter(resourceToSell, amount); | cmpStatisticsTracker.IncreaseResourcesSoldCounter(resourceToSell, amount); | ||||
cmpStatisticsTracker.IncreaseResourcesBoughtCounter(resourceToBuy, amountToAdd); | cmpStatisticsTracker.IncreaseResourcesBoughtCounter(resourceToBuy, amountToAdd); | ||||
} | } | ||||
// Increase price difference for both exchange resources. | // Increase price difference for both exchange resources. | ||||
// Overal price difference (constant + dynamic) can't exceed +-99% | // Overal price difference (dynamic +- constant) can't exceed +-99%. | ||||
// so both buy/sell prices limited to [1%; 199%] interval. | |||||
this.priceDifferences[resourceToSell] -= this.DIFFERENCE_PER_DEAL * numberOfDeals; | this.priceDifferences[resourceToSell] -= this.DIFFERENCE_PER_DEAL * numberOfDeals; | ||||
this.priceDifferences[resourceToSell] = Math.min(99 - this.CONSTANT_DIFFERENCE, Math.max(this.CONSTANT_DIFFERENCE - 99, this.priceDifferences[resourceToSell])); | this.priceDifferences[resourceToSell] = Math.min(99 - this.CONSTANT_DIFFERENCE, Math.max(this.CONSTANT_DIFFERENCE - 99, this.priceDifferences[resourceToSell])); | ||||
this.priceDifferences[resourceToBuy] += this.DIFFERENCE_PER_DEAL * numberOfDeals; | this.priceDifferences[resourceToBuy] += this.DIFFERENCE_PER_DEAL * numberOfDeals; | ||||
this.priceDifferences[resourceToBuy] = Math.min(99 - this.CONSTANT_DIFFERENCE, Math.max(this.CONSTANT_DIFFERENCE - 99, this.priceDifferences[resourceToBuy])); | this.priceDifferences[resourceToBuy] = Math.min(99 - this.CONSTANT_DIFFERENCE, Math.max(this.CONSTANT_DIFFERENCE - 99, this.priceDifferences[resourceToBuy])); | ||||
} | } | ||||
if (this.restoreTimer === undefined) | if (this.restoreTimer === undefined) | ||||
{ | { | ||||
Show All 29 Lines |
Wildfire Games · Phabricator