Ticket #3917: tradeinternational.3.diff

File tradeinternational.3.diff, 9.5 KB (added by fatherbushido, 8 years ago)
  • binaries/data/mods/public/simulation/components/Trader.js

    function Trader() {}  
    1212Trader.prototype.Schema =
    1313    "<a:help>Lets the unit generate resouces while moving between markets (or docks in case of water trading).</a:help>" +
    1414    "<a:example>" +
    1515        "<MaxDistance>2.0</MaxDistance>" +
    1616        "<GainMultiplier>1.0</GainMultiplier>" +
     17        "<InternationalBonus>0.25</InternationalBonus>" +
    1718    "</a:example>" +
    1819    "<element name='GainMultiplier' a:help='Additional gain multiplier'>" +
    1920        "<ref name='positiveDecimal'/>" +
     21    "</element>" +
     22    "<element name='InternationalBonus' a:help='Additional part of the gain donated when two different players trade'>" +
     23        "<ref name='positiveDecimal'/>" +
    2024    "</element>";
    2125
    2226Trader.prototype.Init = function()
    2327{
    2428    this.markets = [];
  • binaries/data/mods/public/simulation/helpers/TraderGain.js

     
    11// This constant used to adjust gain value depending on distance
    22const DISTANCE_FACTOR = 1 / 115;
    33
    4 // Additional gain (applying to each market) for trading performed between markets of different players, in percents
    5 const INTERNATIONAL_TRADING_ADDITION = 25;
    6 
    74// If trader undefined, the trader owner is supposed to be the same as the first market
    85function CalculateTraderGain(firstMarket, secondMarket, template, trader)
    96{
    107    var gain = {};
    118
    function CalculateTraderGain(firstMarket  
    2017    // Calculate ordinary Euclidean distance between markets.
    2118    // We don't use pathfinder, because ordinary distance looks more fair.
    2219    var distance = firstMarketPosition.distanceTo(secondMarketPosition);
    2320    // We calculate gain as square of distance to encourage trading between remote markets
    2421    gain.traderGain = Math.pow(distance * DISTANCE_FACTOR, 2);
    25     if (template && template.GainMultiplier)
    26     {
    27         if (trader)
    28             gain.traderGain *= ApplyValueModificationsToEntity("Trader/GainMultiplier", +template.GainMultiplier, trader);
    29         else    // called from the gui with modifications already applied
    30             gain.traderGain *= template.GainMultiplier;
    31     }
    32     // If trader undefined, the trader owner is supposed to be the same as the first market
    33     var cmpOwnership = trader ? Engine.QueryInterface(trader, IID_Ownership) : Engine.QueryInterface(firstMarket, IID_Ownership);
    34     if (!cmpOwnership)
    35         return null;
    36     gain.traderOwner = cmpOwnership.GetOwner();
    37 
    38     // If markets belong to different players, add gain from international trading
    39     var ownerFirstMarket = Engine.QueryInterface(firstMarket, IID_Ownership).GetOwner();
    40     var ownerSecondMarket = Engine.QueryInterface(secondMarket, IID_Ownership).GetOwner();
    41     if (ownerFirstMarket != ownerSecondMarket)
    42     {
    43         gain.market1Gain = gain.traderGain * ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, firstMarket) / 100;
    44         gain.market1Owner = ownerFirstMarket;
    45         gain.market2Gain = gain.traderGain * ApplyValueModificationsToEntity("Trade/International", INTERNATIONAL_TRADING_ADDITION, secondMarket) / 100;
    46         gain.market2Owner = ownerSecondMarket;
    47     }
    4822
    49     // Add potential trade multipliers and roundings
    50     var cmpPlayer = trader ? QueryOwnerInterface(trader) : QueryOwnerInterface(firstMarket);
    51     if (cmpPlayer)
    52         gain.traderGain *= cmpPlayer.GetTradeRateMultiplier();
    53     gain.traderGain = Math.round(gain.traderGain);
     23    // else case is called from the gui with modifications already applied
     24    let gainMultiplier = template && template.GainMultiplier && trader ? ApplyValueModificationsToEntity("Trader/GainMultiplier", +template.GainMultiplier, trader) : template.GainMultiplier;
    5425
    55     if (ownerFirstMarket != ownerSecondMarket)
     26    let cmpFirstMarketOwnership = Engine.QueryInterface(firstMarket, IID_Ownership);
     27    let cmpSecondMarketOwnership = Engine.QueryInterface(secondMarket, IID_Ownership);
     28    if (!cmpFirstMarketOwnership || !cmpSecondMarketOwnership)
     29        return null;
     30    let ownerFirstMarket = cmpFirstMarketOwnership.GetOwner();
     31    let ownerSecondMarket = cmpSecondMarketOwnership.GetOwner();
     32    // If trader undefined, the trader owner is supposed to be the same as the first market
     33    let ownerTrader = ownerFirstMarket;
     34    if (trader)
    5635    {
    57         if ((cmpPlayer = QueryOwnerInterface(firstMarket)))
    58             gain.market1Gain *= cmpPlayer.GetTradeRateMultiplier();
    59         gain.market1Gain = Math.round(gain.market1Gain);
    60 
    61         if ((cmpPlayer = QueryOwnerInterface(secondMarket)))
    62             gain.market2Gain *= cmpPlayer.GetTradeRateMultiplier();
    63         gain.market2Gain = Math.round(gain.market2Gain);
     36        let cmpOwnership = Engine.QueryInterface(trader, IID_Ownership);
     37        if (!cmpOwnership)
     38            return null;
     39        let ownerTrader = cmpOwnership.GetOwner();
    6440    }
     41    gain.traderOwner = ownerTrader;
     42    gain.market1Owner = ownerFirstMarket;
     43    gain.market2Owner = ownerSecondMarket;
     44    // Add potential player trade multipliers
     45    let cmpPlayer = QueryPlayerIDInterface(ownerTrader);
     46    let playerBonus = cmpPlayer ? cmpPlayer.GetTradeRateMultiplier() : 1;
     47    // If markets belong to different players, add gain from international trading
     48    let internationalBonus = (template && template.InternationalBonus && ownerFirstMarket != ownerSecondMarket ) ? template.InternationalBonus : 0;
     49    let market1Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, firstMarket) * ((ownerTrader == ownerFirstMarket) ? playerBonus : 1);
     50    let market2Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, secondMarket) * ((ownerTrader == ownerSecondMarket) ? playerBonus : 1);
     51
     52    gain.traderGain *= gainMultiplier;
     53    gain.market1Gain = Math.round(gain.traderGain * market1Bonus);
     54    gain.market2Gain = Math.round(gain.traderGain * market2Bonus);
     55    gain.traderGain = Math.round(gain.traderGain * playerBonus);
    6556
    6657    return gain;
    6758}
    6859
    6960Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain);
  • binaries/data/mods/public/simulation/templates/template_formation.xml

     
    4040    <WalkSpeed>1.0</WalkSpeed>
    4141    <PassabilityClass>large</PassabilityClass>
    4242  </UnitMotion>
    4343  <Trader>
    4444    <GainMultiplier>1.0</GainMultiplier>
     45    <InternationalBonus>0.25</InternationalBonus>
    4546  </Trader>
    4647</Entity>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml

     
    4444    <BarHeight>0.5</BarHeight>
    4545    <HeightOffset>6.0</HeightOffset>
    4646  </StatusBars>
    4747  <Trader>
    4848    <GainMultiplier>1.0</GainMultiplier>
     49    <InternationalBonus>0.25</InternationalBonus>InternationalBonus>
    4950  </Trader>
    5051  <UnitAI>
    5152    <DefaultStance>passive</DefaultStance>
    5253    <CanGuard>false</CanGuard>
    5354  </UnitAI>
  • binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml

     
    3838      <gather_ore>resource/mining/mining.xml</gather_ore>
    3939    </SoundGroups>
    4040  </Sound>
    4141  <Trader>
    4242    <GainMultiplier>1.0</GainMultiplier>
     43    <InternationalBonus>0.25</InternationalBonus>
    4344  </Trader>
    4445  <UnitAI>
    4546    <CanGuard>false</CanGuard>
    4647  </UnitAI>
    4748  <UnitMotion>
  • binaries/data/mods/public/simulation/templates/units/cart_ship_merchant.xml

     
    1212    <Icon>units/cart_ship_merchant.png</Icon>
    1313    <RequiredTechnology>phase_village</RequiredTechnology>
    1414  </Identity>
    1515  <Trader>
    1616    <GainMultiplier>1.25</GainMultiplier>
     17    <InternationalBonus op="add">0.1</InternationalBonus>
    1718  </Trader>
    1819  <VisualActor>
    1920    <Actor>structures/carthaginians/merchant_ship.xml</Actor>
    2021  </VisualActor>
    2122</Entity>
  • binaries/data/mods/public/simulation/templates/units/cart_support_trader.xml

     
    1616      <select>actor/fauna/animal/camel.xml</select>
    1717      <order_walk>actor/fauna/movement/camel.xml</order_walk>
    1818      <death>actor/fauna/death/death_camel.xml</death>
    1919    </SoundGroups>
    2020  </Sound>
     21  <Trader>
     22    <GainMultiplier>1.0</GainMultiplier>
     23    <InternationalBonus op="add">0.1</InternationalBonus>
     24  </Trader>
    2125  <VisualActor>
    2226    <Actor>units/carthaginians/trader.xml</Actor>
    2327  </VisualActor>
    2428</Entity>