Ticket #3277: ticket3277-v2.2.patch
File ticket3277-v2.2.patch, 10.1 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/gui/session/unit_actions.js
307 307 }, 308 308 "getActionInfo": function(entState, targetState) 309 309 { 310 if (targetState.foundation || !entState.trader )310 if (targetState.foundation || !entState.trader || !targetState.market) 311 311 return false; 312 312 if (!playerCheck(entState, targetState, ["Player", "Ally"])) 313 313 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"))) 315 316 return false; 316 317 317 318 var tradingData = {"trader": entState.id, "target": targetState.id}; … … 529 530 data.resourceType = resourceType; 530 531 data.resourceTemplate = targetState.template; 531 532 } 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"])) 534 535 { 535 536 // Find a trader (if any) that this building can produce. 536 537 var trader; … … 881 882 "select-trading-goods": { 882 883 "getInfo": function(entState) 883 884 { 884 if (! hasClass(entState, "Market"))885 if (!entState.market) 885 886 return false; 886 887 return { 887 888 "tooltip": translate("Select trading goods"), -
binaries/data/mods/public/simulation/components/GuiInterface.js
234 234 "garrisonHolder": null, 235 235 "gate": null, 236 236 "guard": null, 237 "market": null, 237 238 "mirage": null, 238 239 "pack": null, 239 240 "player": -1, … … 288 289 if (cmpBuilder) 289 290 ret.builder = true; 290 291 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 291 299 let cmpPack = Engine.QueryInterface(ent, IID_Pack); 292 300 if (cmpPack) 293 301 ret.pack = { -
binaries/data/mods/public/simulation/components/Market.js
1 function Market() {} 2 3 Market.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 15 Market.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 21 Market.prototype.AddTrader = function(ent) 22 { 23 this.traders.add(ent); 24 }; 25 26 Market.prototype.RemoveTrader = function(ent) 27 { 28 this.traders.delete(ent); 29 }; 30 31 Market.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 */ 39 Market.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 54 Market.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 71 Engine.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 3 3 4 4 // Additional gain for ships for each garrisoned trader, in percents 5 5 const GARRISONED_TRADER_ADDITION = 20; … … 61 61 gain.market2Gain = Math.round(garrisonMultiplier * gain.market2Gain); 62 62 } 63 63 } 64 64 65 65 return gain; 66 66 }; 67 67 … … 69 69 // Return true if at least one of markets was changed. 70 70 Trader.prototype.SetTargetMarket = function(target, source) 71 71 { 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) 75 74 return false; 76 if (!cmpTargetIdentity.HasClass("Market") && !cmpTargetIdentity.HasClass("NavalMarket"))77 return false;78 75 79 76 if (source) 80 77 { 81 78 // Establish a trade route with both markets in one go. 82 cmpTargetIdentity = Engine.QueryInterface(source, IID_Identity);83 if (!cmp TargetIdentity)79 let cmpSourceMarket = Engine.QueryInterface(source, IID_Market); 80 if (!cmpSourceMarket) 84 81 return false; 85 if (!cmpTargetIdentity.HasClass("Market") && !cmpTargetIdentity.HasClass("NavalMarket"))86 return false;87 82 this.markets = [source]; 83 cmpSourceMarket.AddTrader(this.entity); 88 84 } 89 85 if (this.markets.length >= 2) 90 86 { 91 87 // If we already have both markets - drop them 92 88 // 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 } 93 95 this.index = 0; 94 96 this.markets = [target]; 97 cmpTargetMarket.AddTrader(this.entity); 95 98 } 96 99 else if (this.markets.length == 1) 97 100 { … … 103 106 { 104 107 this.index = 0; 105 108 this.markets.push(target); 109 cmpTargetMarket.AddTrader(this.entity); 106 110 this.goods.amount = this.CalculateGain(this.markets[0], this.markets[1]); 107 111 } 108 112 } … … 112 116 // set the target as first market 113 117 this.index = 0; 114 118 this.markets = [target]; 119 cmpTargetMarket.AddTrader(this.entity); 115 120 } 116 121 // Drop carried goods if markets were changed 117 122 this.goods.amount = null; … … 150 155 Trader.prototype.CanTrade = function(target) 151 156 { 152 157 var cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity); 153 var cmpTargetIdentity = Engine.QueryInterface(target, IID_Identity);154 158 // Check that the target exists 155 if (!cmpTargetIdentity) 159 var cmpTargetMarket = Engine.QueryInterface(target, IID_Market); 160 if (!cmpTargetMarket) 156 161 return false; 157 162 // Check that the target is not a foundation 158 163 var cmpTargetFoundation = Engine.QueryInterface(target, IID_Foundation); 159 164 if (cmpTargetFoundation) 160 165 return false; 161 var landTradingPossible = cmpTraderIdentity.HasClass("Organic") && cmpTarget Identity.HasClass("Market");162 var seaTradingPossible = cmpTraderIdentity.HasClass("Ship") && cmpTarget Identity.HasClass("NavalMarket");166 var landTradingPossible = cmpTraderIdentity.HasClass("Organic") && cmpTargetMarket.HasType("land"); 167 var seaTradingPossible = cmpTraderIdentity.HasClass("Ship") && cmpTargetMarket.HasType("naval"); 163 168 if (!landTradingPossible && !seaTradingPossible) 164 169 return false; 165 170 … … 242 247 return this.goods; 243 248 }; 244 249 250 /** 251 * Called when this trader can no longer trade with the market 252 */ 253 Trader.prototype.RemoveMarket = function(market) 254 { 255 let index = this.markets.indexOf(market); 256 if (index != -1) 257 this.markets.splice(index, 1); 258 }; 259 245 260 Trader.prototype.StopTrading = function() 246 261 { 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 } 247 268 this.index = -1; 248 269 this.markets = []; 249 270 // Drop carried goods -
binaries/data/mods/public/simulation/components/interfaces/Market.js
1 Engine.RegisterInterface("Market"); -
binaries/data/mods/public/simulation/templates/template_structure_economic_market.xml
32 32 <stone>25</stone> 33 33 <metal>25</metal> 34 34 </Loot> 35 <Market> 36 <TradeType>land</TradeType> 37 </Market> 35 38 <Obstruction> 36 39 <Static width="30.0" depth="26.0"/> 37 40 </Obstruction> -
binaries/data/mods/public/simulation/templates/template_structure_military_dock.xml
34 34 <stone>0</stone> 35 35 <metal>0</metal> 36 36 </Loot> 37 <Market> 38 <TradeType>land naval</TradeType> 39 </Market> 37 40 <Obstruction> 38 41 <Static width="18.0" depth="18.0"/> 39 42 </Obstruction>