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:
parent
739a63828a
commit
ac7db9850b
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
Loading…
Reference in New Issue
Block a user