Ticket #1691: trader.patch

File trader.patch, 3.5 KB (added by mimo, 12 years ago)

small changes following discussions on forums

  • simulation/helpers/TraderGain.js

     
    44// Additional gain for trading performed between markets of different players, in percents
    55const INTERNATIONAL_TRADING_ADDITION = 50;
    66
     7// Fraction of the additionnal gain to go to the owner of the trader, in percents
     8const FRACTION_BONUS_TRADER = 60;
     9
    710function CalculateTraderGain(firstMarket, secondMarket, template)
    811{
    912    var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
     
    3134    return gain;
    3235}
    3336
     37function CalculateTraderShare()
     38{
     39    var fraction = (100 - INTERNATIONAL_TRADING_ADDITION + 2*INTERNATIONAL_TRADING_ADDITION*FRACTION_BONUS_TRADER/100);
     40    fraction = fraction / (100 + INTERNATIONAL_TRADING_ADDITION);
     41    // Add protections against unreasonnable input values
     42    if(fraction < 0) return 0;
     43    if(fraction > 1) return 1;
     44    return fraction;
     45}
     46
    3447Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain);
     48Engine.RegisterGlobal("CalculateTraderShare", CalculateTraderShare);
  • simulation/components/UnitAI.js

     
    31803180
    31813181    if (this.CheckTargetRange(currentMarket, IID_Trader))
    31823182    {
    3183         this.PerformTrade();
     3183        this.PerformTrade(currentMarket);
    31843184        if (this.MoveToMarket(nextMarket))
    31853185        {
    31863186            // We've started walking to the next market
     
    31943194    }
    31953195};
    31963196
    3197 UnitAI.prototype.PerformTrade = function()
     3197UnitAI.prototype.PerformTrade = function(currentMarket)
    31983198{
    31993199    var cmpTrader = Engine.QueryInterface(this.entity, IID_Trader);
    3200     cmpTrader.PerformTrade();
     3200    cmpTrader.PerformTrade(currentMarket);
    32013201};
    32023202
    32033203UnitAI.prototype.StopTrading = function()
  • simulation/components/Trader.js

     
    3232    this.preferredGoods = "metal";
    3333    // Currently carried goods
    3434    this.goods = { "type": null, "amount": 0 };
     35    // Fraction of the gain to go to the trader at each market stop
     36    this.fraction = CalculateTraderShare();
    3537}
    3638
    3739Trader.prototype.CalculateGain = function(firstMarket, secondMarket, template)
     
    175177    return true;
    176178}
    177179
    178 Trader.prototype.PerformTrade = function()
     180Trader.prototype.PerformTrade = function(market)
    179181{
    180182    if (this.goods.amount > 0)
    181183    {
     184        var traderGain = Math.round(this.fraction * this.goods.amount);
     185
    182186        var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
    183         cmpPlayer.AddResource(this.goods.type, this.goods.amount);
     187        cmpPlayer.AddResource(this.goods.type, traderGain);
    184188
    185189        var cmpStatisticsTracker = QueryOwnerInterface(this.entity, IID_StatisticsTracker);
    186190        if (cmpStatisticsTracker)
    187             cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount);
     191            cmpStatisticsTracker.IncreaseTradeIncomeCounter(traderGain);
     192
     193        var marketGain = this.goods.amount - traderGain;
     194
     195        var marketOwner = QueryOwnerInterface(market, IID_Player);
     196        marketOwner.AddResource(this.goods.type, marketGain);
     197
     198        var marketStatisticsTracker = QueryOwnerInterface(market, IID_StatisticsTracker);
     199        if (marketStatisticsTracker)
     200            marketStatisticsTracker.IncreaseTradeIncomeCounter(marketGain);
    188201    }
    189202    this.goods.type = this.preferredGoods;
    190203    this.goods.amount = this.gain;