Ticket #3894: marketVisibility-v3.1.patch
File marketVisibility-v3.1.patch, 12.0 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 */ 47 Market.prototype.OnDiplomacyChanged = function(msg) 58 59 Market.prototype.UpdateTraders = function(onDestruction) 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) || !onDestruction && cmpTrader.CanTrade(this.entity)) 70 continue; 71 // this trader can no more trade 72 this.RemoveTrader(trader); 73 cmpTrader.RemoveMarket(this.entity); 59 74 } 60 75 }; 61 76 77 Market.prototype.OnDiplomacyChanged = function(msg) 78 { 79 this.UpdateTraders(false); 80 }; 81 62 82 Market.prototype.OnOwnershipChanged = function(msg) 63 83 { 64 for (let ent of this.traders) 65 { 66 let cmpTrader = Engine.QueryInterface(ent, IID_Trader); 67 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 { 73 this.RemoveTrader(ent); 74 cmpTrader.RemoveMarket(this.entity); 75 } 76 } 84 this.UpdateTraders(msg.to == -1); 77 85 }; 78 86 79 87 Engine.RegisterComponentType(IID_Market, "Market", Market); -
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 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 170 if (cmpTrader) 171 cmpTrader.RemoveMarket(this.entity); 172 } 173 return; 174 } 175 176 // The market becomes visible, switch all traders from the mirage to the market 177 for (let trader of this.traders) 178 { 179 let cmpTrader = Engine.QueryInterface(trader, IID_Trader); 180 if (!cmpTrader) 181 continue; 182 cmpTrader.SwitchMarket(this.entity, cmpMarket.entity); 183 this.RemoveTrader(trader); 184 cmpMarket.AddTrader(trader); 185 } 186 }; 187 128 188 // ============================ 129 189 130 190 Mirage.prototype.OnVisibilityChanged = function(msg) … … 132 192 if (msg.player != this.player || msg.newVisibility != VIS_HIDDEN) 133 193 return; 134 194 195 if (this.miragedIids.has(IID_Market)) 196 this.UpdateTraders(msg); 197 135 198 if (this.parent == INVALID_ENTITY) 136 199 Engine.DestroyEntity(this.entity); 137 200 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 (let 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 if (index != -1) 261 this.markets.splice(index, 1); 267 if (index == -1) 268 return; 269 this.markets.splice(index, 1); 270 let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); 271 if (cmpUnitAI) 272 cmpUnitAI.MarketRemoved(market); 262 273 }; 263 274 275 /** 276 * Switch between a market and its mirage according to visibility 277 */ 278 Trader.prototype.SwitchMarket = function(oldMarket, newMarket) 279 { 280 let index = this.markets.indexOf(oldMarket); 281 if (index == -1) 282 return; 283 this.markets[index] = newMarket; 284 let cmpUnitAI = Engine.QueryInterface(this.entity, IID_UnitAI); 285 if (cmpUnitAI) 286 cmpUnitAI.SwitchMarketOrder(oldMarket, newMarket); 287 }; 288 264 289 Trader.prototype.StopTrading = function() 265 290 { 266 291 for (let market of this.markets) 267 292 { 268 let cmpMarket = Engine.QueryInterface(market, IID_Market);293 let cmpMarket = QueryMiragedInterface(market, IID_Market); 269 294 if (cmpMarket) 270 295 cmpMarket.RemoveTrader(this.entity); 271 296 } -
binaries/data/mods/public/simulation/components/UnitAI.js
166 166 // ignore 167 167 }, 168 168 169 "TradingCanceled": function(msg) { 170 // ignore 171 }, 172 169 173 "GuardedAttacked": function(msg) { 170 174 // ignore 171 175 }, … … 648 652 "Order.Trade": function(msg) { 649 653 // We must check if this trader has both markets in case it was a back-to-work order 650 654 var cmpTrader = Engine.QueryInterface(this.entity, IID_Trader); 651 if (!cmpTrader || ! 655 if (!cmpTrader || !cmpTrader.HasBothMarkets()) 652 656 { 653 657 this.FinishOrder(); 654 658 return; … … 5209 5213 return marketsChanged; 5210 5214 }; 5211 5215 5216 UnitAI.prototype.SwitchMarketOrder = function(oldMarket, newMarket) 5217 { 5218 if (this.order.data && this.order.data.target && this.order.data.target == oldMarket) 5219 this.order.data.target == newMarket; 5220 }; 5221 5212 5222 UnitAI.prototype.MoveToMarket = function(targetMarket) 5213 5223 { 5214 5224 if (this.waypoints && this.waypoints.length > 1) … … 5268 5278 this.StopTrading(); 5269 5279 }; 5270 5280 5281 UnitAI.prototype.MarketRemoved = function(market) 5282 { 5283 if (this.GetCurrentState().split(".").pop() != "APPROACHINGMARKET" || this.order.data.target != market) 5284 return; 5285 let cmpTrader = Engine.QueryInterface(this.entity, IID_Trader); 5286 let otherMarket = cmpTrader && cmpTrader.GetFirstMarket(); 5287 this.StopTrading(); 5288 if (otherMarket) 5289 this.WalkToTarget(otherMarket); 5290 }; 5291 5271 5292 UnitAI.prototype.StopTrading = function() 5272 5293 { 5273 5294 this.StopMoving(); … … 5274 5295 this.FinishOrder(); 5275 5296 var cmpTrader = Engine.QueryInterface(this.entity, IID_Trader); 5276 5297 cmpTrader.StopTrading(); 5298 // dummy call to be sure we go out of the APPROACHINGMARKET state 5299 this.UnitFsm.ProcessMessage(this, { "type": "TradingCanceled", "data": null }); 5277 5300 }; 5278 5301 5279 5302 /** -
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