Ticket #3917: tradeinternational.4.diff

File tradeinternational.4.diff, 9.7 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
    2 const DISTANCE_FACTOR = 1 / 115;
    3 
    4 // Additional gain (applying to each market) for trading performed between markets of different players, in percents
    5 const INTERNATIONAL_TRADING_ADDITION = 25;
     2const DISTANCE_FACTOR = 1 / 13225;
    63
    74// If trader undefined, the trader owner is supposed to be the same as the first market
    8 function CalculateTraderGain(firstMarket, secondMarket, template, trader)
     5function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader)
    96{
     7    if (!traderTemplate)
     8        return null;
    109    var gain = {};
    1110
    1211    var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
    1312    var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
    1413    if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() ||
    function CalculateTraderGain(firstMarket  
    1716    var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
    1817    var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
    1918
    2019    // Calculate ordinary Euclidean distance between markets.
    2120    // We don't use pathfinder, because ordinary distance looks more fair.
    22     var distance = firstMarketPosition.distanceTo(secondMarketPosition);
     21    var distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition);
    2322    // We calculate gain as square of distance to encourage trading between remote markets
    24     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     }
     23    gain.traderGain = distanceSq * DISTANCE_FACTOR;
     24    let gainMultiplier = traderTemplate.GainMultiplier || 1;
     25    // false when called from the gui, modifications already applied
     26    if (trader)
     27        gainMultiplier = ApplyValueModificationsToEntity("Trader/GainMultiplier", gainMultiplier, trader);
     28    let cmpFirstMarketPlayer = QueryOwnerInterface(firstMarket);
     29    let cmpSecondMarketPlayer = QueryOwnerInterface(secondMarket);
     30    if (!cmpFirstMarketPlayer || !cmpSecondMarketPlayer)
     31        return null;
     32    gain.market1Owner = cmpFirstMarketPlayer.GetPlayerID();
     33    gain.market2Owner = cmpSecondMarketPlayer.GetPlayerID();
    3234    // 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    let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpFirstMarketPlayer;
     36    if (!cmpPlayer)
    3537        return null;
    36     gain.traderOwner = cmpOwnership.GetOwner();
    37 
     38    gain.traderOwner = cmpPlayer.GetPlayerID();
     39    // Add potential player trade multipliers
     40    let playerBonus = cmpPlayer.GetTradeRateMultiplier();
    3841    // 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     }
    48 
    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);
    54 
    55     if (ownerFirstMarket != ownerSecondMarket)
    56     {
    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);
    64     }
     42    let internationalBonus = traderTemplate && traderTemplate.InternationalBonus && gain.market1Owner != gain.market2Owner ? traderTemplate.InternationalBonus : 0;
     43    let market1Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, firstMarket) * ((gain.traderOwner == gain.market1Owner) ? playerBonus : 1);
     44    let market2Bonus = ApplyValueModificationsToEntity("Trader/InternationalBonus", internationalBonus, secondMarket) * ((gain.traderOwner == gain.market2Owner) ? playerBonus : 1);
     45    gain.traderGain *= gainMultiplier;
     46    gain.market1Gain = Math.round(gain.traderGain * market1Bonus);
     47    gain.market2Gain = Math.round(gain.traderGain * market2Bonus);
     48    gain.traderGain = Math.round(gain.traderGain * playerBonus);
    6549
    6650    return gain;
    6751}
    6852
    6953Engine.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>
    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>