Ticket #3917: tradeinternational.5.diff

File tradeinternational.5.diff, 12.0 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

    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'/>" +
    2021    "</element>";
    2122
    Trader.prototype.GetFirstMarket = functi  
    131132Trader.prototype.GetSecondMarket = function()
    132133{
    133134    return this.markets[1] || null;
    134135};
    135136
     137Trader.prototype.GetTraderGainMultiplier = function()
     138{
     139    return ApplyValueModificationsToEntity("Trader/GainMultiplier", +this.template.GainMultiplier, this.entity);
     140}
     141
    136142Trader.prototype.HasBothMarkets = function()
    137143{
    138144    return this.markets.length >= 2;
    139145};
    140146
  • 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

     
    11// This constant used to adjust gain value depending on distance
    2 const DISTANCE_FACTOR = 1 / 115;
     2const DISTANCE_FACTOR = 1 / 13225;
    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 
    7 // If trader undefined, the trader owner is supposed to be the same as the first market
    8 function CalculateTraderGain(firstMarket, secondMarket, template, trader)
     4function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader)
    95{
     6    if (!traderTemplate)
     7        return null;
    108    var gain = {};
    119
    1210    var cmpFirstMarketPosition = Engine.QueryInterface(firstMarket, IID_Position);
    1311    var cmpSecondMarketPosition = Engine.QueryInterface(secondMarket, IID_Position);
    1412    if (!cmpFirstMarketPosition || !cmpFirstMarketPosition.IsInWorld() ||
    function CalculateTraderGain(firstMarket  
    1715    var firstMarketPosition = cmpFirstMarketPosition.GetPosition2D();
    1816    var secondMarketPosition = cmpSecondMarketPosition.GetPosition2D();
    1917
    2018    // Calculate ordinary Euclidean distance between markets.
    2119    // We don't use pathfinder, because ordinary distance looks more fair.
    22     var distance = firstMarketPosition.distanceTo(secondMarketPosition);
     20    var distanceSq = firstMarketPosition.distanceToSquared(secondMarketPosition);
    2321    // 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     }
     22    gain.traderGain = distanceSq * DISTANCE_FACTOR;
     23    let gainMultiplier = traderTemplate.GainMultiplier || 1;
     24    // false when called from the gui, modifications already applied
     25    if (trader)
     26        gainMultiplier = ApplyValueModificationsToEntity("Trader/GainMultiplier", gainMultiplier, trader);
     27    let cmpMarket1Player = QueryOwnerInterface(firstMarket);
     28    let cmpMarket2Player = QueryOwnerInterface(secondMarket);
     29    if (!cmpMarket1Player || !cmpMarket2Player)
     30        return null;
     31    gain.market1Owner = cmpMarket1Player.GetPlayerID();
     32    gain.market2Owner = cmpMarket2Player.GetPlayerID();
    3233    // 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)
     34    let cmpPlayer = trader ? QueryOwnerInterface(trader) : cmpMarket1Player;
     35    if (!cmpPlayer)
    3536        return null;
    36     gain.traderOwner = cmpOwnership.GetOwner();
    37 
     37    gain.traderOwner = cmpPlayer.GetPlayerID();
     38    // Add potential player trade multipliers
     39    let playerBonus = cmpPlayer.GetTradeRateMultiplier();
     40    let market1PlayerBonus = gain.traderOwner == gain.market1Owner ? cmpMarket1Player.GetTradeRateMultiplier() : 1;
     41    let market2PlayerBonus = gain.traderOwner == gain.market2Owner ? cmpMarket2Player.GetTradeRateMultiplier() : 1;
    3842    // 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     }
     43    let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market);
     44    let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market);
     45    if (!cmpMarket1 || !cmpMarket2)
     46        return null;
     47    let internationalBonus1 = gain.market1Owner != gain.market2Owner ? cmpMarket1.GetInternationalBonus() : 0;
     48    let internationalBonus2 = gain.market1Owner != gain.market2Owner ? cmpMarket2.GetInternationalBonus() : 0;
     49    gain.traderGain *= gainMultiplier;
     50    gain.market1Gain = Math.round(gain.traderGain * internationalBonus1 * market1PlayerBonus);
     51    gain.market2Gain = Math.round(gain.traderGain * internationalBonus2 * market2PlayerBonus);
     52    gain.traderGain = Math.round(gain.traderGain * playerBonus);
    6553
    6654    return gain;
    6755}
    6856
    6957Engine.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_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>