1
0
forked from 0ad/0ad
0ad/binaries/data/mods/public/simulation/helpers/TraderGain.js

52 lines
2.6 KiB
JavaScript

// This constant used to adjust gain value depending on distance
const DISTANCE_FACTOR = 1 / 110;
// Additional gain (applying to each market) for trading performed between markets of different players, in percents
const INTERNATIONAL_TRADING_ADDITION = 25;
// If trader undefined, the trader owner is supposed to be the same as the first market
function CalculateTraderGain(firstMarket, secondMarket, template, trader)
{
var gain = {};
var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
return null;
var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
// Calculate ordinary Euclidean distance between markets.
// We don't use pathfinder, because ordinary distance looks more fair.
var distance = Math.sqrt(Math.pow(firstMarketPosition.x - secondMarketPosition.x, 2) + Math.pow(firstMarketPosition.y - secondMarketPosition.y, 2));
// We calculate gain as square of distance to encourage trading between remote markets
gain.traderGain = Math.pow(distance * DISTANCE_FACTOR, 2);
if (template && template.GainMultiplier)
gain.traderGain *= template.GainMultiplier;
gain.traderGain = Math.round(gain.traderGain);
// If trader undefined, the trader owner is supposed to be the same as the first market
if (trader)
var cmpOwnership = Engine.QueryInterface(trader, IID_Ownership);
else
var cmpOwnership = Engine.QueryInterface(firstMarket, IID_Ownership);
gain.traderOwner = cmpOwnership.GetOwner();
// If markets belong to different players, add gain from international trading
var ownerFirstMarket = Engine.QueryInterface(firstMarket, IID_Ownership).GetOwner();
var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner();
if (ownerFirstMarket != ownerSecondMarket)
{
var internationalGain1 = ApplyTechModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket);
gain.market1Gain = Math.round(gain.traderGain * internationalGain1 / 100);
gain.market1Owner = ownerFirstMarket;
var internationalGain2 = ApplyTechModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket);
gain.market2Gain = Math.round(gain.traderGain * internationalGain2 / 100);
gain.market2Owner = ownerSecondMarket;
}
return gain;
}
Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain);