1
0
forked from 0ad/0ad

Move trader gain to cmpMarket.

Deletes the helper, since we need at least one market anyway.

Differential revision: D3808
Closes: #5890

This was SVN commit r25202.
This commit is contained in:
Freagarach 2021-04-07 06:58:36 +00:00
parent 739a63828a
commit ac7db9850b
4 changed files with 70 additions and 68 deletions

View File

@ -1894,7 +1894,8 @@ GuiInterface.prototype.GetTradingRouteGain = function(player, data)
if (!data.firstMarket || !data.secondMarket)
return null;
return CalculateTraderGain(data.firstMarket, data.secondMarket, data.template);
let cmpMarket = QueryMiragedInterface(data.firstMarket, IID_Market);
return cmpMarket && cmpMarket.CalculateTraderGain(data.secondMarket, data.template);
};
GuiInterface.prototype.GetTradingDetails = function(player, data)

View File

@ -74,6 +74,70 @@ Market.prototype.UpdateTraders = function(onDestruction)
}
};
Market.prototype.CalculateTraderGain = function(secondMarket, traderTemplate, trader)
{
let cmpMarket2 = QueryMiragedInterface(secondMarket, IID_Market);
if (!cmpMarket2)
return null;
let cmpMarket1Player = QueryOwnerInterface(this.entity);
let cmpMarket2Player = QueryOwnerInterface(secondMarket);
if (!cmpMarket1Player || !cmpMarket2Player)
return null;
let cmpFirstMarketPosition = Engine.QueryInterface(this.entity, IID_Position);
let cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() ||
!cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
return null;
let firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
let secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
let mapSize = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain).GetMapSize();
let gainMultiplier = TradeGainNormalization(mapSize);
if (trader)
{
let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
if (!cmpTrader)
return null;
gainMultiplier *= cmpTrader.GetTraderGainMultiplier();
}
// Called from the gui, modifications already applied.
else
{
if (!traderTemplate || !traderTemplate.GainMultiplier)
return null;
gainMultiplier *= traderTemplate.GainMultiplier;
}
let gain = {};
// Calculate ordinary Euclidean distance between markets.
// We don't use pathfinder, because ordinary distance looks more fair.
let distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition);
// We calculate gain as square of distance to encourage trading between remote markets
// and gainMultiplier corresponds to the gain for a 100m distance
gain.traderGain = Math.round(gainMultiplier * TradeGain(distanceSq, mapSize));
gain.market1Owner = cmpMarket1Player.GetPlayerID();
gain.market2Owner = cmpMarket2Player.GetPlayerID();
// If trader undefined, the trader owner is supposed to be the same as the first market.
let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player;
if (!cmpPlayer)
return null;
gain.traderOwner = cmpPlayer.GetPlayerID();
if (gain.market1Owner != gain.market2Owner)
{
let internationalBonus1 = this.GetInternationalBonus();
let internationalBonus2 = cmpMarket2.GetInternationalBonus();
gain.market1Gain = Math.round(gain.traderGain * internationalBonus1);
gain.market2Gain = Math.round(gain.traderGain * internationalBonus2);
}
return gain;
};
Market.prototype.OnDiplomacyChanged = function(msg)
{
this.UpdateTraders(false);
@ -142,6 +206,8 @@ MarketMirage.prototype.UpdateTraders = function(msg)
}
};
MarketMirage.prototype.CalculateTraderGain = Market.prototype.CalculateTraderGain;
Engine.RegisterGlobal("MarketMirage", MarketMirage);
Market.prototype.Mirage = function(mirageID, miragePlayer)

View File

@ -31,7 +31,8 @@ Trader.prototype.Init = function()
Trader.prototype.CalculateGain = function(currentMarket, nextMarket)
{
let gain = CalculateTraderGain(currentMarket, nextMarket, this.template, this.entity);
let cmpMarket = QueryMiragedInterface(currentMarket, IID_Market);
let gain = cmpMarket && cmpMarket.CalculateTraderGain(nextMarket, this.template, this.entity);
if (!gain) // One of our markets must have been destroyed
return null;

View File

@ -1,66 +0,0 @@
function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader)
{
let cmpMarket1 = QueryMiragedInterface(firstMarket, IID_Market);
let cmpMarket2 = QueryMiragedInterface(secondMarket, IID_Market);
if (!cmpMarket1 || !cmpMarket2)
return null;
let cmpMarket1Player = QueryOwnerInterface(firstMarket);
let cmpMarket2Player = QueryOwnerInterface(secondMarket);
if (!cmpMarket1Player || !cmpMarket2Player)
return null;
let cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
let cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() ||
!cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
return null;
let firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
let secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
let mapSize = Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain).GetMapSize();
let gainMultiplier = TradeGainNormalization(mapSize);
if (trader)
{
let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
if (!cmpTrader)
return null;
gainMultiplier *= cmpTrader.GetTraderGainMultiplier();
}
else // Called from the gui, modifications already applied.
{
if (!traderTemplate || !traderTemplate.GainMultiplier)
return null;
gainMultiplier *= traderTemplate.GainMultiplier;
}
let gain = {};
// Calculate ordinary Euclidean distance between markets.
// We don't use pathfinder, because ordinary distance looks more fair.
let distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition);
// We calculate gain as square of distance to encourage trading between remote markets
// and gainMultiplier corresponds to the gain for a 100m distance
gain.traderGain = Math.round(gainMultiplier * TradeGain(distanceSq, mapSize));
gain.market1Owner = cmpMarket1Player.GetPlayerID();
gain.market2Owner = cmpMarket2Player.GetPlayerID();
// If trader undefined, the trader owner is supposed to be the same as the first market
let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player;
if (!cmpPlayer)
return null;
gain.traderOwner = cmpPlayer.GetPlayerID();
// If markets belong to different players, add gain from international trading
if (gain.market1Owner != gain.market2Owner)
{
let internationalBonus1 = cmpMarket1.GetInternationalBonus();
let internationalBonus2 = cmpMarket2.GetInternationalBonus();
gain.market1Gain = Math.round(gain.traderGain * internationalBonus1);
gain.market2Gain = Math.round(gain.traderGain * internationalBonus2);
}
return gain;
}
Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain);