Index: ps/trunk/binaries/data/mods/public/globalscripts/Trade.js
===================================================================
--- ps/trunk/binaries/data/mods/public/globalscripts/Trade.js
+++ ps/trunk/binaries/data/mods/public/globalscripts/Trade.js
@@ -0,0 +1,15 @@
+/**
+ * Normalize the trade gain as a function of mapSize, default=1024
+ */
+function TradeGainNormalization(mapSize)
+{
+ return 1;
+}
+
+/**
+ * Dependance of the gain with distance, normalized on a distance of 100m
+ */
+function NormalizedTradeGain(distanceSquared)
+{
+ return distanceSquared / 10000;
+}
Index: ps/trunk/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
+++ ps/trunk/binaries/data/mods/public/simulation/ai/common-api/gamestate.js
@@ -936,10 +936,13 @@
let supportTraderTemplateName = this.applyCiv("units/{civ}_support_trader");
let shipMerchantTemplate = !this.isTemplateDisabled(shipMechantTemplateName) && this.getTemplate(shipMechantTemplateName);
let supportTraderTemplate = !this.isTemplateDisabled(supportTraderTemplateName) && this.getTemplate(supportTraderTemplateName);
- return {
- "navalGainMultiplier": shipMerchantTemplate && shipMerchantTemplate.gainMultiplier(),
- "landGainMultiplier": supportTraderTemplate && supportTraderTemplate.gainMultiplier()
- };
+ let norm = TradeGainNormalization(this.sharedScript.mapSize);
+ let ret = {};
+ if (supportTraderTemplate)
+ ret.landGainMultiplier = norm * supportTraderTemplate.gainMultiplier();
+ if (shipMerchantTemplate)
+ ret.navalGainMultiplier = norm * shipMerchantTemplate.gainMultiplier();
+ return ret;
};
return m;
Index: ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js
+++ ps/trunk/binaries/data/mods/public/simulation/ai/petra/headquarters.js
@@ -1104,8 +1104,9 @@
/**
* Returns the best position to build a new market: if the allies already have a market, build it as far as possible
* from it, although not in our border to be able to defend it easily. If no allied market, our second market will
- * follow the same logic
- * TODO check that it is on same accessIndex
+ * follow the same logic.
+ * To do so, we suppose that the gain/distance is an increasing function of distance and look for the max distance
+ * for performance reasons.
*/
m.HQ.prototype.findMarketLocation = function(gameState, template)
{
@@ -1127,6 +1128,8 @@
let bestIdx;
let bestJdx;
let bestVal;
+ let bestDistSq;
+ let bestGainMult;
let radius = Math.ceil(template.obstructionRadius().max / obstructions.cellSize);
let isNavalMarket = template.hasClass("NavalMarket");
@@ -1152,6 +1155,8 @@
let pos = [cellSize * (j%width+0.5), cellSize * (Math.floor(j/width)+0.5)];
// checking distances to other markets
let maxVal = 0;
+ let maxDistSq;
+ let maxGainMult;
let gainMultiplier;
for (let market of markets)
{
@@ -1168,9 +1173,13 @@
continue;
if (!gainMultiplier)
continue;
- let val = API3.SquareVectorDistance(market.position(), pos) * gainMultiplier;
- if (val > maxVal)
- maxVal = val;
+ let distSq = API3.SquareVectorDistance(market.position(), pos);
+ if (gainMultiplier * distSq > maxVal)
+ {
+ maxVal = gainMultiplier * distSq;
+ maxDistSq = distSq;
+ maxGainMult = gainMultiplier;
+ }
}
if (maxVal === 0)
continue;
@@ -1179,6 +1188,8 @@
if (this.isDangerousLocation(gameState, pos, halfSize))
continue;
bestVal = maxVal;
+ bestDistSq = maxDistSq;
+ bestGainMult = maxGainMult;
bestIdx = i;
bestJdx = j;
}
@@ -1188,7 +1199,7 @@
if (bestVal === undefined) // no constraints. For the time being, place it arbitrarily by the ConstructionPlan
return [-1, -1, -1, 0];
- let expectedGain = Math.round(bestVal / 10000);
+ let expectedGain = Math.round(bestGainMult * NormalizedTradeGain(bestDistSq));
if (this.Config.debug > 1)
API3.warn("this would give a trading gain of " + expectedGain);
// do not keep it if gain is too small, except if this is our first BarterMarket
Index: ps/trunk/binaries/data/mods/public/simulation/ai/petra/tradeManager.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/ai/petra/tradeManager.js
+++ ps/trunk/binaries/data/mods/public/simulation/ai/petra/tradeManager.js
@@ -444,7 +444,7 @@
gainMultiplier = traderTemplatesGains.navalGainMultiplier;
else
continue;
- let gain = Math.round(API3.SquareVectorDistance(m1.position(), m2.position()) * gainMultiplier / 10000);
+ let gain = Math.round(gainMultiplier * NormalizedTradeGain(API3.SquareVectorDistance(m1.position(), m2.position())));
if (gain < this.minimalGain)
continue;
if (m1.foundationProgress() === undefined && m2.foundationProgress() === undefined)
Index: ps/trunk/binaries/data/mods/public/simulation/components/Trader.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/components/Trader.js
+++ ps/trunk/binaries/data/mods/public/simulation/components/Trader.js
@@ -11,7 +11,7 @@
"" +
"0.75" +
"" +
- "" +
+ "" +
"" +
"";
Index: ps/trunk/binaries/data/mods/public/simulation/helpers/TraderGain.js
===================================================================
--- ps/trunk/binaries/data/mods/public/simulation/helpers/TraderGain.js
+++ ps/trunk/binaries/data/mods/public/simulation/helpers/TraderGain.js
@@ -18,19 +18,19 @@
let firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
let secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
- let gainMultiplier;
+ let gainMultiplier = TradeGainNormalization(Engine.QueryInterface(SYSTEM_ENTITY, IID_Terrain).GetMapSize());
if (trader)
{
let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
if (!cmpTrader)
return null;
- gainMultiplier = cmpTrader.GetTraderGainMultiplier();
+ gainMultiplier *= cmpTrader.GetTraderGainMultiplier();
}
else //called from the gui, modifications already applied
{
if (!traderTemplate || !traderTemplate.GainMultiplier)
return null;
- gainMultiplier = traderTemplate.GainMultiplier;
+ gainMultiplier *= traderTemplate.GainMultiplier;
}
let gain = {};
@@ -40,7 +40,7 @@
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 = gainMultiplier * distanceSq / 10000;
+ gain.traderGain = gainMultiplier * NormalizedTradeGain(distanceSq);
gain.market1Owner = cmpMarket1Player.GetPlayerID();
gain.market2Owner = cmpMarket2Player.GetPlayerID();