Ticket #1691: trader.diff

File trader.diff, 10.5 KB (added by mimo, 11 years ago)
  • binaries/data/mods/public/gui/session/input.js

     
    270270
    271271            var traderData = { "firstMarket": entState.id, "secondMarket": targetState.id, "template": trader };
    272272            var gain = Engine.GuiInterfaceCall("GetTradingRouteGain", traderData);
    273             if (gain !== null)
     273            if (gain && gain.trader)
    274274            {
    275275                data.command = "trade";
    276276                data.target = traderData.secondMarket;
    277277                data.source = traderData.firstMarket;
    278278                cursor = "action-setup-trade-route";
    279                 tooltip = "Click to establish a default route for new traders. Gain: " + gain + " metal.";
     279                tooltip = "Click to establish a default route for new traders. Gain: " + gain.trader + " metal";
     280                if (gain.market2)
     281                    tooltip += " and " + gain.market2 + " metal for the allied.";
     282                else
     283                    tooltip += ".";
    280284            }
    281285        }
    282286
     
    335339                case "is first":
    336340                    tooltip = "Origin trade market.";
    337341                    if (tradingDetails.hasBothMarkets)
    338                         tooltip += " Gain: " + tradingDetails.gain + " " + tradingDetails.goods + ". Right-click to create a new trade route."
     342                    {
     343                        tooltip += " Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods;
     344                        if (tradingDetails.gain.market1)
     345                            tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1;
     346                        if (tradingDetails.gain.market2)
     347                            tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2;
     348                        tooltip += ". Right-click to create a new trade route.";
     349                    }
    339350                    else
    340351                        tooltip += " Right-click on another market to set it as a destination trade market."
    341352                    break;
    342353                case "is second":
    343                     tooltip = "Destination trade market. Gain: " + tradingDetails.gain + " " + tradingDetails.goods + "." + " Right-click to create a new trade route.";
     354                    tooltip = "Destination trade market. Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods;
     355                    if (tradingDetails.gain.market1)
     356                        tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1;
     357                    if (tradingDetails.gain.market2)
     358                        tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2;
     359                    tooltip += ". Right-click to create a new trade route.";
    344360                    break;
    345361                case "set first":
    346362                    tooltip = "Set as origin trade market";
    347363                    break;
    348364                case "set second":
    349                     tooltip = "Set as destination trade market. Gain: " + tradingDetails.gain + " " + tradingDetails.goods + ".";
     365                    tooltip = "Set as destination trade market. Gain: " + tradingDetails.gain.trader + " " + tradingDetails.goods;
     366                    if (tradingDetails.gain.market1)
     367                        tooltip += ", plus " + tradingDetails.gain.market1 + " for the player " + tradingDetails.gain.owner1;
     368                    if (tradingDetails.gain.market2)
     369                        tooltip += " and " + tradingDetails.gain.market2 + " for the player " + tradingDetails.gain.owner2;
     370                    tooltip += ". ";
    350371                    break;
    351372                }
    352373                return {"possible": true, "tooltip": tooltip};
  • binaries/data/mods/public/simulation/helpers/TraderGain.js

     
    11// This constant used to adjust gain value depending on distance
    22const DISTANCE_FACTOR = 1 / 110;
    33
    4 // Additional gain for trading performed between markets of different players, in percents
    5 const INTERNATIONAL_TRADING_ADDITION = 50;
     4// Additional gain (applying to each market) for trading performed between markets of different players, in percents
     5const INTERNATIONAL_TRADING_ADDITION = 25;
    66
    7 function CalculateTraderGain(firstMarket, secondMarket, template)
     7// If trader undefined, the trader owner is supposed to be the same as the first market
     8function CalculateTraderGain(firstMarket, secondMarket, template, trader)
    89{
     10    var gain = {};
     11
    912    var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
    1013    var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
    1114    if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() || !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
     
    1720    // We don't use pathfinder, because ordinary distance looks more fair.
    1821    var distance = Math.sqrt(Math.pow(firstMarketPosition.x - secondMarketPosition.x, 2) + Math.pow(firstMarketPosition.y - secondMarketPosition.y, 2));
    1922    // We calculate gain as square of distance to encourage trading between remote markets
    20     var gain = Math.pow(distance * DISTANCE_FACTOR, 2);
     23    gain.trader = Math.pow(distance * DISTANCE_FACTOR, 2);
     24    if (template.GainMultiplier)
     25        gain.trader *= template.GainMultiplier;
     26    gain.trader = Math.round(gain.trader);
    2127
    2228    // If markets belong to different players, multiple gain to INTERNATIONAL_TRADING_MULTIPLIER
    23     var cmpFirstMarketOwnership = Engine.QueryInterface(firstMarket, IID_Ownership);
    24     var cmpSecondMarketOwnership = Engine.QueryInterface(secondMarket, IID_Ownership);
    25     if (cmpFirstMarketOwnership.GetOwner() != cmpSecondMarketOwnership.GetOwner())
    26         gain *= 1 + INTERNATIONAL_TRADING_ADDITION / 100;
     29    var ownerFirstMarket = Engine.QueryInterface(firstMarket, IID_Ownership).GetOwner();
     30    var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner();
     31    if (ownerFirstMarket != ownerSecondMarket)
     32    {
     33        var internationalGain1 = ApplyTechModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket);
     34        internationalGain1 = Math.round(gain.trader * internationalGain1 / 100);
     35        var internationalGain2 = ApplyTechModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket);
     36        internationalGain2 = Math.round(gain.trader * internationalGain2 / 100);
    2737
    28     if (template.GainMultiplier)
    29         gain *= template.GainMultiplier;
    30     gain = Math.round(gain);
     38        if (trader)
     39        {
     40            var cmpTraderOwnership = Engine.QueryInterface(trader, IID_Ownership);
     41            if (ownerFirstMarket == cmpTraderOwnership.GetOwner())
     42                gain.trader += internationalGain1;
     43            else
     44            {
     45                gain.market1 = internationalGain1;
     46                gain.owner1 = ownerFirstMarket;
     47            }
     48
     49            if (ownerSecondMarket == cmpTraderOwnership.GetOwner())
     50                gain.trader += internationalGain2;
     51            else
     52            {
     53                gain.market2 = internationalGain2;
     54                gain.owner2 = ownerSecondMarket;
     55            }
     56        }
     57        else
     58        {
     59            // If trader undefined, the trader owner is supposed to be the same as the first market
     60            gain.trader += internationalGain1;
     61            gain.market2 = internationalGain2;
     62            gain.owner2 = ownerSecondMarket;
     63        }
     64    }
     65
    3166    return gain;
    3267}
    3368
  • binaries/data/mods/public/simulation/components/Trader.js

     
    3131    // Selected resource for trading
    3232    this.preferredGoods = "metal";
    3333    // Currently carried goods
    34     this.goods = { "type": null, "amount": 0 };
     34    this.goods = { "type": null, "amount": null };
    3535}
    3636
    3737Trader.prototype.CalculateGain = function(firstMarket, secondMarket, template)
    3838{
     39    var gain = CalculateTraderGain(firstMarket, secondMarket, this.template, this.entity);
     40
    3941    // For ship increase gain for each garrisoned trader
    40     // Calculate this here to save passing unnecessary stuff into the CalculatetraderGain function
    41     var garrisonMultiplier = 1;
     42    // Calculate this here to save passing unnecessary stuff into the CalculateTraderGain function
    4243    var cmpIdentity = Engine.QueryInterface(this.entity, IID_Identity);
    4344    if (cmpIdentity && cmpIdentity.HasClass("Ship"))
    4445    {
    4546        var cmpGarrisonHolder = Engine.QueryInterface(this.entity, IID_GarrisonHolder);
    4647        if (cmpGarrisonHolder)
    4748        {
     49            var garrisonMultiplier = 1;
    4850            var garrisonedTradersCount = 0;
    4951            for each (var entity in cmpGarrisonHolder.GetEntities())
    5052            {
     
    5355                    garrisonedTradersCount++;
    5456            }
    5557            garrisonMultiplier *= 1 + GARRISONED_TRADER_ADDITION * garrisonedTradersCount / 100;
     58
     59            if (gain.trader)
     60                gain.trader = Math.round(garrisonMultiplier * gain.trader);
     61            if (gain.market1)
     62                gain.market1 = Math.round(garrisonMultiplier * gain.market1);
     63            if (gain.market2)
     64                gain.market2 = Math.round(garrisonMultiplier * gain.market2);
    5665        }
    5766    }
    5867   
    59     return garrisonMultiplier * CalculateTraderGain(firstMarket, secondMarket, this.template);
     68    return gain;
    6069}
    6170
    6271Trader.prototype.GetGain = function()
     
    116125    if (marketsChanged)
    117126    {
    118127        // Drop carried goods
    119         this.goods.amount = 0;
     128        this.goods.amount = null;
    120129    }
    121130    return marketsChanged;
    122131}
     
    177186
    178187Trader.prototype.PerformTrade = function()
    179188{
    180     if (this.goods.amount > 0)
     189    if (this.goods.amount && this.goods.amount.trader)
    181190    {
    182191        var cmpPlayer = QueryOwnerInterface(this.entity, IID_Player);
    183         cmpPlayer.AddResource(this.goods.type, this.goods.amount);
     192        cmpPlayer.AddResource(this.goods.type, this.goods.amount.trader);
    184193
    185194        var cmpStatisticsTracker = QueryOwnerInterface(this.entity, IID_StatisticsTracker);
    186195        if (cmpStatisticsTracker)
    187             cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount);
     196            cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.trader);
     197
     198        if (this.goods.amount.market1)
     199        {
     200            var cmpPlayer = QueryOwnerInterface(this.firstMarket, IID_Player);
     201            cmpPlayer.AddResource(this.goods.type, this.goods.amount.market1);
     202
     203            var cmpStatisticsTracker = QueryOwnerInterface(this.firstMarket, IID_StatisticsTracker);
     204            if (cmpStatisticsTracker)
     205                cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.market1);
     206        }
     207
     208        if (this.goods.amount.market2)
     209        {
     210            var cmpPlayer = QueryOwnerInterface(this.secondMarket, IID_Player);
     211            cmpPlayer.AddResource(this.goods.type, this.goods.amount.market2);
     212
     213            var cmpStatisticsTracker = QueryOwnerInterface(this.secondMarket, IID_StatisticsTracker);
     214            if (cmpStatisticsTracker)
     215                cmpStatisticsTracker.IncreaseTradeIncomeCounter(this.goods.amount.market2);
     216        }
    188217    }
    189218    this.goods.type = this.preferredGoods;
    190219    this.goods.amount = this.gain;
     
    198227Trader.prototype.StopTrading = function()
    199228{
    200229    // Drop carried goods
    201     this.goods.amount = 0;
     230    this.goods.amount = null;
    202231    // Reset markets
    203232    this.firstMarket = INVALID_ENTITY;
    204233    this.secondMarket = INVALID_ENTITY;