Ticket #3894: marketVisibility-v2.patch
File marketVisibility-v2.patch, 11.1 KB (added by , 8 years ago) |
---|
-
binaries/data/mods/public/simulation/components/Fogging.js
129 129 if (cmpResourceSupply) 130 130 cmpMirage.CopyResourceSupply(cmpResourceSupply); 131 131 132 var cmpMarket = Engine.QueryInterface(this.entity, IID_Market); 133 if (cmpMarket) 134 cmpMirage.CopyMarket(cmpMarket); 135 132 136 // Notify the GUI the entity has been replaced by a mirage, in case it is selected at this moment 133 137 var cmpGuiInterface = Engine.QueryInterface(SYSTEM_ENTITY, IID_GuiInterface); 134 138 cmpGuiInterface.AddMiragedEntity(player, this.entity, this.mirages[player]); -
binaries/data/mods/public/simulation/components/GuiInterface.js
289 289 if (cmpBuilder) 290 290 ret.builder = true; 291 291 292 let cmpMarket = Engine.QueryInterface(ent, IID_Market);292 let cmpMarket = QueryMiragedInterface(ent, IID_Market); 293 293 if (cmpMarket) 294 294 ret.market = { 295 295 "land": cmpMarket.HasType("land"), -
binaries/data/mods/public/simulation/components/Market.js
41 41 return this.tradeType.has(type); 42 42 }; 43 43 44 Market.prototype.GetType = function() 45 { 46 return this.tradeType; 47 }; 48 49 Market.prototype.GetTraders = function() 50 { 51 return this.traders; 52 }; 53 44 54 /** 45 * Check if all traders with a route on this market can still trade 55 * Check if the traders attached to this market can still trade with it 56 * Warning traders currently trading with a mirage of this market are dealt with in Mirage.js 46 57 */ 58 47 59 Market.prototype.OnDiplomacyChanged = function(msg) 48 60 { 49 for (let entof this.traders)61 for (let trader of this.traders) 50 62 { 51 let cmpTrader = Engine.QueryInterface( ent, IID_Trader);63 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 52 64 if (!cmpTrader) 53 this.RemoveTrader(ent);54 else if (!cmpTrader.CanTrade(this.entity))55 65 { 56 this.RemoveTrader( ent);57 c mpTrader.RemoveMarket(this.entity);66 this.RemoveTrader(trader); 67 continue; 58 68 } 69 if (!cmpTrader.HasMarket(this.entity) || cmpTrader.CanTrade(this.entity)) 70 continue; 71 // this trader can no more trade TODO warn UnitAI 72 this.RemoveTrader(trader); 73 cmpTrader.RemoveMarket(this.entity); 59 74 } 60 75 }; 61 76 62 77 Market.prototype.OnOwnershipChanged = function(msg) 63 78 { 64 for (let entof this.traders)79 for (let trader of this.traders) 65 80 { 66 let cmpTrader = Engine.QueryInterface( ent, IID_Trader);81 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 67 82 if (!cmpTrader) 68 this.RemoveTrader(ent);69 else if (msg.to == -1)70 cmpTrader.RemoveMarket(this.entity);71 else if (!cmpTrader.CanTrade(this.entity))72 83 { 73 this.RemoveTrader( ent);74 c mpTrader.RemoveMarket(this.entity);84 this.RemoveTrader(trader); 85 continue; 75 86 } 87 if (!cmpTrader.HasMarket(this.entity) || (msg.to != -1 && cmpTrader.CanTrade(this.entity))) 88 continue; 89 // this trader can no more trade TODO warn UnitAI 90 this.RemoveTrader(trader); 91 cmpTrader.RemoveMarket(this.entity); 76 92 } 77 93 }; 78 94 -
binaries/data/mods/public/simulation/components/Mirage.js
34 34 this.killBeforeGather = null; 35 35 this.maxGatherers = null; 36 36 this.numGatherers = null; 37 38 this.traders = null; 39 this.marketType = null; 40 this.internationalBonus = null; 37 41 }; 38 42 39 43 Mirage.prototype.SetParent = function(ent) … … 125 129 Mirage.prototype.GetMaxGatherers = function() { return this.maxGatherers; }; 126 130 Mirage.prototype.GetNumGatherers = function() { return this.numGatherers; }; 127 131 132 // Market data 133 134 Mirage.prototype.CopyMarket = function(cmpMarket) 135 { 136 this.miragedIids.add(IID_Market); 137 this.traders = new Set(); 138 for (let trader of cmpMarket.GetTraders()) 139 { 140 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 141 let cmpOwnership = Engine.QueryInterface(trader, IID_Ownership); 142 if (!cmpTrader || !cmpOwnership) 143 { 144 cmpMarket.RemoveTrader(trader); 145 continue; 146 } 147 if (this.player != cmpOwnership.GetOwner()) 148 continue; 149 cmpTrader.SwitchMarket(cmpMarket.entity, this.entity); 150 cmpMarket.RemoveTrader(trader); 151 this.AddTrader(trader); 152 } 153 this.marketType = cmpMarket.GetType(); 154 this.internationalBonus = cmpMarket.GetInternationalBonus(); 155 }; 156 157 Mirage.prototype.HasType = function(type) { return this.marketType.has(type); }; 158 Mirage.prototype.GetInternationalBonus = function() { return this.internationalBonus; }; 159 Mirage.prototype.AddTrader = function(trader) { this.traders.add(trader); }; 160 Mirage.prototype.RemoveTrader = function(trader) { this.traders.delete(trader); }; 161 162 Mirage.prototype.UpdateTraders = function(msg) 163 { 164 let cmpMarket = Engine.QueryInterface(this.parent, IID_Market); 165 if (!cmpMarket) // The parent market does not exist anymore 166 { 167 for (let trader of this.traders) 168 { 169 // TODO warn UnitAI 170 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 171 if (cmpTrader) 172 cmpTrader.RemoveMarket(this.entity); 173 } 174 return; 175 } 176 177 // The market becomes visible, switch all traders from the mirage to the market 178 for (let trader of this.traders) 179 { 180 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 181 if (!cmpTrader) 182 continue; 183 cmpTrader.SwitchMarket(this.entity, cmpMarket.entity); 184 this.RemoveTrader(trader); 185 cmpMarket.AddTrader(trader); 186 } 187 }; 188 128 189 // ============================ 129 190 130 191 Mirage.prototype.OnVisibilityChanged = function(msg) … … 132 193 if (msg.player != this.player || msg.newVisibility != VIS_HIDDEN) 133 194 return; 134 195 196 if (this.miragedIids.has(IID_Market)) 197 this.UpdateTraders(msg); 198 135 199 if (this.parent == INVALID_ENTITY) 136 200 Engine.DestroyEntity(this.entity); 137 201 else -
binaries/data/mods/public/simulation/components/Trader.js
44 44 { 45 45 var garrisonMultiplier = 1; 46 46 var garrisonedTradersCount = 0; 47 for each (var entity incmpGarrisonHolder.GetEntities())47 for (var entity of cmpGarrisonHolder.GetEntities()) 48 48 { 49 49 var cmpGarrisonedUnitTrader = Engine.QueryInterface(entity, IID_Trader); 50 50 if (cmpGarrisonedUnitTrader) … … 68 68 // Return true if at least one of markets was changed. 69 69 Trader.prototype.SetTargetMarket = function(target, source) 70 70 { 71 var cmpTargetMarket = Engine.QueryInterface(target, IID_Market);71 let cmpTargetMarket = QueryMiragedInterface(target, IID_Market); 72 72 if (!cmpTargetMarket) 73 73 return false; 74 74 … … 75 75 if (source) 76 76 { 77 77 // Establish a trade route with both markets in one go. 78 let cmpSourceMarket = Engine.QueryInterface(source, IID_Market);78 let cmpSourceMarket = QueryMiragedInterface(source, IID_Market); 79 79 if (!cmpSourceMarket) 80 80 return false; 81 81 this.markets = [source]; 82 cmpSourceMarket.AddTrader(this.entity);83 82 } 84 83 if (this.markets.length >= 2) 85 84 { … … 87 86 // and use the target as first market 88 87 for (let market of this.markets) 89 88 { 90 let cmpMarket = Engine.QueryInterface(market, IID_Market);89 let cmpMarket = QueryMiragedInterface(market, IID_Market); 91 90 if (cmpMarket) 92 91 cmpMarket.RemoveTrader(this.entity); 93 92 } … … 160 159 { 161 160 var cmpTraderIdentity = Engine.QueryInterface(this.entity, IID_Identity); 162 161 // Check that the target exists 163 var cmpTargetMarket = Engine.QueryInterface(target, IID_Market);162 var cmpTargetMarket = QueryMiragedInterface(target, IID_Market); 164 163 if (!cmpTargetMarket) 165 164 return false; 166 165 // Check that the target is not a foundation … … 252 251 }; 253 252 254 253 /** 255 * Called when this trader can no longer trade with the market254 * Returns true if the trader has the given market (can be either a market or a mirage) 256 255 */ 256 Trader.prototype.HasMarket = function(market) 257 { 258 return this.markets.indexOf(market) != -1; 259 }; 260 261 /** 262 * Remove a market when this trader can no longer trade with it 263 */ 257 264 Trader.prototype.RemoveMarket = function(market) 258 265 { 259 266 let index = this.markets.indexOf(market); 260 267 if (index != -1) 261 268 this.markets.splice(index, 1); 269 else 270 error(" RemoveMarket problem: " + market); 262 271 }; 263 272 273 /** 274 * Switch between a market and its mirage according to visibility 275 */ 276 Trader.prototype.SwitchMarket = function(oldMarket, newMarket) 277 { 278 let index = this.markets.indexOf(oldMarket); 279 if (index == -1) 280 return; 281 this.markets[index] = newMarket; 282 let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); 283 if (cmpUnitAI) 284 cmpUnitAI.SwitchMarketOrder(oldMarket, newMarket); 285 }; 286 264 287 Trader.prototype.StopTrading = function() 265 288 { 266 289 for (let market of this.markets) 267 290 { 268 let cmpMarket = Engine.QueryInterface(market, IID_Market);291 let cmpMarket = QueryMiragedInterface(market, IID_Market); 269 292 if (cmpMarket) 270 293 cmpMarket.RemoveTrader(this.entity); 271 294 } -
binaries/data/mods/public/simulation/components/UnitAI.js
648 648 "Order.Trade": function(msg) { 649 649 // We must check if this trader has both markets in case it was a back-to-work order 650 650 var cmpTrader = Engine.QueryInterface(this.entity, IID_Trader); 651 if (!cmpTrader || ! 651 if (!cmpTrader || !cmpTrader.HasBothMarkets()) 652 652 { 653 653 this.FinishOrder(); 654 654 return; … … 5344 5344 error("UnitAI: Setting to invalid stance '"+stance+"'"); 5345 5345 }; 5346 5346 5347 UnitAI.prototype.SwitchMarketOrder = function(oldMarket, newMarket) 5348 { 5349 if (this.order.data && this.order.data.target && this.order.data.target == oldMarket) 5350 this.order.data.target == newMarket; 5351 }; 5352 5347 5353 UnitAI.prototype.SwitchToStance = function(stance) 5348 5354 { 5349 5355 var cmpPosition = Engine.QueryInterface(this.entity, IID_Position); -
binaries/data/mods/public/simulation/helpers/TraderGain.js
1 1 function CalculateTraderGain(firstMarket, secondMarket, traderTemplate, trader) 2 2 { 3 let cmpMarket1 = Engine.QueryInterface(firstMarket, IID_Market);4 let cmpMarket2 = Engine.QueryInterface(secondMarket, IID_Market);3 let cmpMarket1 = QueryMiragedInterface(firstMarket, IID_Market); 4 let cmpMarket2 = QueryMiragedInterface(secondMarket, IID_Market); 5 5 if (!cmpMarket1 || !cmpMarket2) 6 6 return null; 7 7