Ticket #3917: tradeinternational.7.diff

File tradeinternational.7.diff, 15.1 KB (added by fatherbushido, 8 years ago)
  • binaries/data/mods/public/simulation/components/Market.js

    Market.prototype.Schema =  
    88                    "<value>land</value>" +
    99                    "<value>naval</value>" +
    1010                "</choice>" +
    1111            "</oneOrMore>" +
    1212        "</list>" +
     13    "</element>" +
     14    "<element name='InternationalBonus' a:help='Additional part of the gain donated when two different players trade'>" +
     15        "<ref name='nonNegativeDecimal'/>" +
    1316    "</element>";
    1417
    1518Market.prototype.Init = function()
    1619{
    1720    this.traders = new Set();   // list of traders with a route on this market
    Market.prototype.AddTrader = function(en  
    2629Market.prototype.RemoveTrader = function(ent)
    2730{
    2831    this.traders.delete(ent);
    2932};
    3033
     34Market.prototype.GetInternationalBonus = function()
     35{
     36    return ApplyValueModificationsToEntity("Market/InternationalBonus", +this.template.InternationalBonus, this.entity);
     37}
     38
    3139Market.prototype.HasType = function(type)
    3240{
    3341    return this.tradeType.has(type);
    3442};
    3543
  • binaries/data/mods/public/simulation/components/Trader.js

    Trader.prototype.GetFirstMarket = functi  
    131131Trader.prototype.GetSecondMarket = function()
    132132{
    133133    return this.markets[1] || null;
    134134};
    135135
     136Trader.prototype.GetTraderGainMultiplier = function()
     137{
     138    return ApplyValueModificationsToEntity("Trader/GainMultiplier", +this.template.GainMultiplier, this.entity);
     139}
     140
    136141Trader.prototype.HasBothMarkets = function()
    137142{
    138143    return this.markets.length >= 2;
    139144};
    140145
  • binaries/data/mods/public/simulation/data/technologies/trade_commercial_treaty.json

     
     1{
     2    "genericName": "Commercial Treaty",
     3    "description": "Improve the international trading profit.",
     4    "cost": { "food": 0, "wood": 0, "stone": 0, "metal": 100 },
     5    "requirements": { "tech": "phase_town" },
     6    "requirementsTooltip": "Unlocked in Town Phase.",
     7    "icon": "sibylline_books.png",
     8    "researchTime": 40,
     9    "tooltip": "Market +10% International Bonus.",
     10    "modifications": [{ "value": "Market/InternationalBonus", "add": 0.10 }],
     11    "affects": ["Market"],
     12    "soundComplete": "interface/alarm/alarm_upgradearmory.xml"
     13}
  • binaries/data/mods/public/simulation/helpers/TraderGain.js

     
    1 // 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;
    6 
    7 // If trader undefined, the trader owner is supposed to be the same as the first market
    8 function CalculateTraderGain(firstMarket, secondMarket, template, trader)
     1function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader)
     2{
     3let gainMultiplier;
     4if (trader)
    95{
     6    let cmpTrader = Engine.QueryInterface(trader, IID_Trader);
     7    if (!cmpTrader)
     8        return null;
     9    gainMultiplier = cmpTrader.GetTraderGainMultiplier();
     10}
     11//called from the gui, modifications already applied
     12else
     13{
     14    if (!traderTemplate || !traderTemplate.GainMultiplier)
     15        return null;
     16    gainMultiplier = traderTemplate.GainMultiplier;
     17}
     18
    1019    var gain = {};
    1120
    1221    var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
    1322    var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
    1423    if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() ||
    1524        !cmpSecondMarketPosition || !cmpSecondMarketPosition.IsInWorld())
    1625        return null;
    1726    var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
    1827    var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
    1928
     29    let cmpMarket1Player = QueryOwnerInterface(firstMarket);
     30    let cmpMarket2Player = QueryOwnerInterface(secondMarket);
     31    if (!cmpMarket1Player || !cmpMarket2Player)
     32        return null;
     33
     34    let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market);
     35    let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market);
     36    if (!cmpMarket1 || !cmpMarket2)
     37        return null;
     38
    2039    // Calculate ordinary Euclidean distance between markets.
    2140    // We don't use pathfinder, because ordinary distance looks more fair.
    22     var distance = firstMarketPosition.distanceTo(secondMarketPosition);
     41    var distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition);
    2342    // 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     }
     43    gain.traderGain = distanceSq * gainMultiplier;
     44
     45    gain.market1Owner = cmpMarket1Player.GetPlayerID();
     46    gain.market2Owner = cmpMarket2Player.GetPlayerID();
    3247    // 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)
     48    let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player;
     49    if (!cmpPlayer)
    3550        return null;
    36     gain.traderOwner = cmpOwnership.GetOwner();
    37 
     51    gain.traderOwner = cmpPlayer.GetPlayerID();
     52    // Add potential player trade multipliers
     53    let playerBonus = cmpPlayer.GetTradeRateMultiplier();
    3854    // 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);
     55    if (gain.market1Owner != gain.market2Owner)
     56    {   let market1PlayerBonus = cmpMarket1Player.GetTradeRateMultiplier();
     57        let market2PlayerBonus = cmpMarket2Player.GetTradeRateMultiplier();
     58        let internationalBonus1 = cmpMarket1.GetInternationalBonus();
     59        let internationalBonus2 = cmpMarket2.GetInternationalBonus();
     60        gain.market1Gain = Math.round(gain.traderGain * internationalBonus1 * market1PlayerBonus);
     61        gain.market2Gain = Math.round(gain.traderGain * internationalBonus2 * market2PlayerBonus);
    6462    }
     63    gain.traderGain = Math.round(gain.traderGain * playerBonus);
    6564
    6665    return gain;
    6766}
    6867
    6968Engine.RegisterGlobal("CalculateTraderGain", CalculateTraderGain);
  • binaries/data/mods/public/simulation/templates/structures/cart_dock.xml

     
    1717    <GenericName>Commercial Port</GenericName>
    1818    <SpecificName>Namel</SpecificName>
    1919    <History>The Carthaginians were famous for their sea trade. Carthage itself had an entire harbor dedicated to nothing more than commercial sea trade.</History>
    2020    <Tooltip>Construct fishing boats to gather meat and merchant ships to trade with other docks.</Tooltip>
    2121  </Identity>
     22  <Market>
     23    <InternationalBonus op="add">0.1</InternationalBonus>
     24  </Market>
    2225  <Obstruction>
    2326    <Static width="30.0" depth="19.0"/>
    2427  </Obstruction>
    2528  <ProductionQueue>
    2629    <Technologies datatype="tokens">
  • binaries/data/mods/public/simulation/templates/structures/cart_market.xml

     
    1010  <Identity>
    1111    <Civ>cart</Civ>
    1212    <SpecificName>Šūq</SpecificName>
    1313    <History>Carthaginian markets were probably just big sheds or structures surrounding a ?market? area or in a wharf area of a port.</History>
    1414  </Identity>
     15  <Market>
     16    <InternationalBonus op="add">0.1</InternationalBonus>
     17  </Market>
    1518  <Obstruction>
    1619    <Static width="27.0" depth="20.0"/>
    1720  </Obstruction>
    1821  <VisualActor>
    1922    <Actor>structures/carthaginians/market.xml</Actor>
  • binaries/data/mods/public/simulation/templates/template_formation.xml

     
    3939    <FormationController>true</FormationController>
    4040    <WalkSpeed>1.0</WalkSpeed>
    4141    <PassabilityClass>large</PassabilityClass>
    4242  </UnitMotion>
    4343  <Trader>
    44     <GainMultiplier>1.0</GainMultiplier>
     44    <GainMultiplier>0.0000756</GainMultiplier>
    4545  </Trader>
    4646</Entity>
  • binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml

     
    3232    <stone>25</stone>
    3333    <metal>25</metal>
    3434  </Loot>
    3535  <Market>
    3636    <TradeType>land</TradeType>
     37    <InternationalBonus>0.2</InternationalBonus>
    3738  </Market>
    3839  <Obstruction>
    3940    <Static width="30.0" depth="26.0"/>
    4041  </Obstruction>
    4142  <Sound>
     
    5758      unlock_shared_dropsites
    5859      trade_convoys_speed
    5960      trade_convoys_armor
    6061      trade_gain_01
    6162      trade_gain_02
     63      trade_commercial_treaty
    6264    </Technologies>
    6365    <Entities datatype="tokens">
    6466      units/{civ}_support_trader
    6567    </Entities>
    6668  </ProductionQueue>
  • binaries/data/mods/public/simulation/templates/template_structure_military_dock.xml

     
    3434    <stone>0</stone>
    3535    <metal>0</metal>
    3636  </Loot>
    3737  <Market>
    3838    <TradeType>land naval</TradeType>
     39    <InternationalBonus>0.2</InternationalBonus>
    3940  </Market>
    4041  <Obstruction>
    4142    <Static width="18.0" depth="18.0"/>
    4243  </Obstruction>
    4344  <Position>
  • binaries/data/mods/public/simulation/templates/template_unit_mechanical_ship_merchant.xml

     
    4343    <BarWidth>6.0</BarWidth>
    4444    <BarHeight>0.5</BarHeight>
    4545    <HeightOffset>6.0</HeightOffset>
    4646  </StatusBars>
    4747  <Trader>
    48     <GainMultiplier>1.0</GainMultiplier>
     48    <GainMultiplier>0.0000756</GainMultiplier>
    4949  </Trader>
    5050  <UnitAI>
    5151    <DefaultStance>passive</DefaultStance>
    5252    <CanGuard>false</CanGuard>
    5353  </UnitAI>
  • binaries/data/mods/public/simulation/templates/template_unit_support_trader.xml

     
    3737      <gather_rock>resource/mining/pickaxe.xml</gather_rock>
    3838      <gather_ore>resource/mining/mining.xml</gather_ore>
    3939    </SoundGroups>
    4040  </Sound>
    4141  <Trader>
    42     <GainMultiplier>1.0</GainMultiplier>
     42    <GainMultiplier>0.0000756</GainMultiplier>
    4343  </Trader>
    4444  <UnitAI>
    4545    <CanGuard>false</CanGuard>
    4646  </UnitAI>
    4747  <UnitMotion>
  • binaries/data/mods/public/simulation/templates/units/cart_ship_merchant.xml

     
    1111    <Tooltip>Trade between docks. Garrison a Trader aboard for additional profit (+20% for each garrisoned). Gather profitable aquatic treasures. Carthaginians have +25% sea trading bonus.</Tooltip>
    1212    <Icon>units/cart_ship_merchant.png</Icon>
    1313    <RequiredTechnology>phase_village</RequiredTechnology>
    1414  </Identity>
    1515  <Trader>
    16     <GainMultiplier>1.25</GainMultiplier>
     16    <GainMultiplier op="mul">1.25</GainMultiplier>
    1717  </Trader>
    1818  <VisualActor>
    1919    <Actor>structures/carthaginians/merchant_ship.xml</Actor>
    2020  </VisualActor>
    2121</Entity>
  • binaries/data/mods/public/simulation/templates/units/pers_support_trader.xml

     
    1919      <order_walk>actor/fauna/movement/camel.xml</order_walk>
    2020      <death>actor/fauna/death/death_camel.xml</death>
    2121    </SoundGroups>
    2222  </Sound>
    2323  <Trader>
    24     <GainMultiplier>1.25</GainMultiplier>
     24    <GainMultiplier op="mul">1.25</GainMultiplier>
    2525  </Trader>
    2626  <VisualActor>
    2727    <Actor>units/persians/trader.xml</Actor>
    2828  </VisualActor>
    2929</Entity>