Ticket #3277: ticket3277-v2.2.patch

File ticket3277-v2.2.patch, 10.1 KB (added by mimo, 8 years ago)

updated with new comments

  • binaries/data/mods/public/gui/session/unit_actions.js

     
    307307        },
    308308        "getActionInfo": function(entState, targetState)
    309309        {
    310             if (targetState.foundation || !entState.trader)
     310            if (targetState.foundation || !entState.trader || !targetState.market)
    311311                return false;
    312312            if (!playerCheck(entState, targetState, ["Player", "Ally"]))
    313313                return false;
    314             if (!(hasClass(entState, "Organic") && hasClass(targetState, "Market")) && !(hasClass(entState, "Ship") && hasClass(targetState, "NavalMarket")))
     314            if (!(targetState.market.land && hasClass(entState, "Organic") ||
     315                  targetState.market.naval && hasClass(entState, "Ship")))
    315316                return false;
    316317
    317318            var tradingData = {"trader": entState.id, "target": targetState.id};
     
    529530                data.resourceType = resourceType;
    530531                data.resourceTemplate = targetState.template;
    531532            }
    532             else if (hasClass(entState, "Market") && hasClass(targetState, "Market") && entState.id != targetState.id &&
    533                     (!hasClass(entState, "NavalMarket") || hasClass(targetState, "NavalMarket")) && !playerCheck(entState, targetState, ["Enemy"]))
     533            else if (entState.market && targetState.market && entState.id != targetState.id &&
     534                (!entState.market.naval || targetState.market.naval) && !playerCheck(entState, targetState, ["Enemy"]))
    534535            {
    535536                // Find a trader (if any) that this building can produce.
    536537                var trader;
     
    881882    "select-trading-goods": {
    882883        "getInfo": function(entState)
    883884        {
    884             if (!hasClass(entState, "Market"))
     885            if (!entState.market)
    885886                return false;
    886887            return {
    887888                "tooltip": translate("Select trading goods"),
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    234234        "garrisonHolder": null,
    235235        "gate": null,
    236236        "guard": null,
     237        "market": null,
    237238        "mirage": null,
    238239        "pack": null,
    239240        "player": -1,
     
    288289    if (cmpBuilder)
    289290        ret.builder = true;
    290291
     292    let cmpMarket = Engine.QueryInterface(ent, IID_Market);
     293    if (cmpMarket)
     294        ret.market = {
     295            "land": cmpMarket.HasType("land"),
     296            "naval": cmpMarket.HasType("naval"),
     297        };
     298
    291299    let cmpPack = Engine.QueryInterface(ent, IID_Pack);
    292300    if (cmpPack)
    293301        ret.pack = {
  • binaries/data/mods/public/simulation/components/Market.js

     
     1function Market() {}
     2
     3Market.prototype.Schema =
     4    "<element name='TradeType' a:help='Specifies the type of possible trade route (land or naval).'>" +
     5        "<list>" +
     6            "<oneOrMore>" +
     7                "<choice>" +
     8                    "<value>land</value>" +
     9                    "<value>naval</value>" +
     10                "</choice>" +
     11            "</oneOrMore>" +
     12        "</list>" +
     13    "</element>";
     14
     15Market.prototype.Init = function()
     16{
     17    this.traders = new Set();   // list of traders with a route on this market
     18    this.tradeType = new Set(this.template.TradeType.split(/\s+/));
     19};
     20
     21Market.prototype.AddTrader = function(ent)
     22{
     23    this.traders.add(ent);
     24};
     25
     26Market.prototype.RemoveTrader = function(ent)
     27{
     28    this.traders.delete(ent);
     29};
     30
     31Market.prototype.HasType = function(type)
     32{
     33    return this.tradeType.has(type);
     34};
     35
     36/**
     37 * Check if all traders with a route on this market can still trade
     38 */
     39Market.prototype.OnDiplomacyChanged = function(msg)
     40{
     41    for (let ent of this.traders)
     42    {
     43        let cmpTrader = Engine.QueryInterface(ent, IID_Trader);
     44        if (!cmpTrader)
     45            this.RemoveTrader(ent);
     46        else if (!cmpTrader.CanTrade(this.entity))
     47        {
     48            this.RemoveTrader(ent);
     49            cmpTrader.RemoveMarket(this.entity);
     50        }
     51    }
     52};
     53
     54Market.prototype.OnOwnershipChanged = function(msg)
     55{
     56    for (let ent of this.traders)
     57    {
     58        let cmpTrader = Engine.QueryInterface(ent, IID_Trader);
     59        if (!cmpTrader)
     60            this.RemoveTrader(ent);
     61        else if (msg.to == -1)
     62            cmpTrader.RemoveMarket(this.entity);
     63        else if (!cmpTrader.CanTrade(this.entity))
     64        {
     65            this.RemoveTrader(ent);
     66            cmpTrader.RemoveMarket(this.entity);
     67        }
     68    }
     69};
     70
     71Engine.RegisterComponentType(IID_Market, "Market", Market);
  • binaries/data/mods/public/simulation/components/Trader.js

     
    1 // See helpers/TraderGain.js for the CalculateTaderGain() function which works out how many 
    2 // resources a trader gets 
     1// See helpers/TraderGain.js for the CalculateTaderGain() function which works out how many
     2// resources a trader gets
    33
    44// Additional gain for ships for each garrisoned trader, in percents
    55const GARRISONED_TRADER_ADDITION = 20;
     
    6161                gain.market2Gain = Math.round(garrisonMultiplier * gain.market2Gain);
    6262        }
    6363    }
    64    
     64
    6565    return gain;
    6666};
    6767
     
    6969// Return true if at least one of markets was changed.
    7070Trader.prototype.SetTargetMarket = function(target, source)
    7171{
    72     // Check that target is a market
    73     var cmpTargetIdentity = Engine.QueryInterface(target, IID_Identity);
    74     if (!cmpTargetIdentity)
     72    var cmpTargetMarket = Engine.QueryInterface(target, IID_Market);
     73    if (!cmpTargetMarket)
    7574        return false;
    76     if (!cmpTargetIdentity.HasClass("Market") && !cmpTargetIdentity.HasClass("NavalMarket"))
    77         return false;
    7875
    7976    if (source)
    8077    {
    8178        // Establish a trade route with both markets in one go.
    82         cmpTargetIdentity = Engine.QueryInterface(source, IID_Identity);
    83         if (!cmpTargetIdentity)
     79        let cmpSourceMarket = Engine.QueryInterface(source, IID_Market);
     80        if (!cmpSourceMarket)
    8481            return false;
    85         if (!cmpTargetIdentity.HasClass("Market") && !cmpTargetIdentity.HasClass("NavalMarket"))
    86             return false;
    8782        this.markets = [source];
     83        cmpSourceMarket.AddTrader(this.entity);
    8884    }
    8985    if (this.markets.length >= 2)
    9086    {
    9187        // If we already have both markets - drop them
    9288        // and use the target as first market
     89        for (let market of this.markets)
     90        {
     91            let cmpMarket = Engine.QueryInterface(market, IID_Market);
     92            if (cmpMarket)
     93                cmpMarket.RemoveTrader(this.entity);
     94        }
    9395        this.index = 0;
    9496        this.markets = [target];
     97        cmpTargetMarket.AddTrader(this.entity);
    9598    }
    9699    else if (this.markets.length == 1)
    97100    {
     
    103106        {
    104107            this.index = 0;
    105108            this.markets.push(target);
     109            cmpTargetMarket.AddTrader(this.entity);
    106110            this.goods.amount = this.CalculateGain(this.markets[0], this.markets[1]);
    107111        }
    108112    }
     
    112116        // set the target as first market
    113117        this.index = 0;
    114118        this.markets = [target];
     119        cmpTargetMarket.AddTrader(this.entity);
    115120    }
    116121    // Drop carried goods if markets were changed
    117122    this.goods.amount = null;
     
    150155Trader.prototype.CanTrade = function(target)
    151156{
    152157    var cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity);
    153     var cmpTargetIdentity = Engine.QueryInterface(target, IID_Identity);
    154158    // Check that the target exists
    155     if (!cmpTargetIdentity)
     159    var cmpTargetMarket = Engine.QueryInterface(target, IID_Market);
     160    if (!cmpTargetMarket)
    156161        return false;
    157162    // Check that the target is not a foundation
    158163    var cmpTargetFoundation = Engine.QueryInterface(target, IID_Foundation);
    159164    if (cmpTargetFoundation)
    160165        return false;
    161     var landTradingPossible = cmpTraderIdentity.HasClass("Organic") && cmpTargetIdentity.HasClass("Market");
    162     var seaTradingPossible = cmpTraderIdentity.HasClass("Ship") && cmpTargetIdentity.HasClass("NavalMarket");
     166    var landTradingPossible = cmpTraderIdentity.HasClass("Organic") && cmpTargetMarket.HasType("land");
     167    var seaTradingPossible = cmpTraderIdentity.HasClass("Ship") && cmpTargetMarket.HasType("naval");
    163168    if (!landTradingPossible && !seaTradingPossible)
    164169        return false;
    165170
     
    242247    return this.goods;
    243248};
    244249
     250/**
     251 * Called when this trader can no longer trade with the market
     252 */
     253Trader.prototype.RemoveMarket = function(market)
     254{
     255    let index = this.markets.indexOf(market);
     256    if (index != -1)
     257        this.markets.splice(index, 1);
     258};
     259
    245260Trader.prototype.StopTrading = function()
    246261{
     262    for (let market of this.markets)
     263    {
     264        let cmpMarket = Engine.QueryInterface(market, IID_Market);
     265        if (cmpMarket)
     266            cmpMarket.RemoveTrader(this.entity);
     267    }
    247268    this.index = -1;
    248269    this.markets = [];
    249270    // Drop carried goods
  • binaries/data/mods/public/simulation/components/interfaces/Market.js

     
     1Engine.RegisterInterface("Market");
  • binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml

     
    3232    <stone>25</stone>
    3333    <metal>25</metal>
    3434  </Loot>
     35  <Market>
     36    <TradeType>land</TradeType>
     37  </Market>
    3538  <Obstruction>
    3639    <Static width="30.0" depth="26.0"/>
    3740  </Obstruction>
  • binaries/data/mods/public/simulation/templates/template_structure_military_dock.xml

     
    3434    <stone>0</stone>
    3535    <metal>0</metal>
    3636  </Loot>
     37  <Market>
     38    <TradeType>land naval</TradeType>
     39  </Market>
    3740  <Obstruction>
    3841    <Static width="18.0" depth="18.0"/>
    3942  </Obstruction>