Index: binaries/data/mods/public/simulation/components/GuiInterface.js =================================================================== --- binaries/data/mods/public/simulation/components/GuiInterface.js +++ binaries/data/mods/public/simulation/components/GuiInterface.js @@ -1894,7 +1894,8 @@ 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) Index: binaries/data/mods/public/simulation/components/Market.js =================================================================== --- binaries/data/mods/public/simulation/components/Market.js +++ binaries/data/mods/public/simulation/components/Market.js @@ -74,6 +74,70 @@ } }; +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.CalculateTraderGain = Market.prototype.CalculateTraderGain; + Engine.RegisterGlobal("MarketMirage", MarketMirage); Market.prototype.Mirage = function(mirageID, miragePlayer) Index: binaries/data/mods/public/simulation/components/Trader.js =================================================================== --- binaries/data/mods/public/simulation/components/Trader.js +++ binaries/data/mods/public/simulation/components/Trader.js @@ -31,7 +31,8 @@ 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; Index: binaries/data/mods/public/simulation/helpers/TraderGain.js =================================================================== --- binaries/data/mods/public/simulation/helpers/TraderGain.js +++ /dev/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);