Ticket #2179: extendedEntityState.diff
File extendedEntityState.diff, 13.1 KB (added by , 10 years ago) |
---|
-
binaries/data/mods/public/gui/session/input.js
213 213 // Look at the first targeted entity 214 214 // (TODO: maybe we eventually want to look at more, and be more context-sensitive? 215 215 // e.g. prefer to attack an enemy unit, even if some friendly units are closer to the mouse) 216 var targetState = GetE ntityState(target);216 var targetState = GetExtendedEntityState(target); 217 217 218 218 var gaiaOwned = (targetState.player == 0); 219 219 220 220 // Look to see what type of command units going to the rally point should use 221 221 if (action == "set-rallypoint") 222 222 { 223 // We assume that all entities are owned by the same player. 224 var entState = GetEntityState(selection[0]); 225 223 // We assume that all entities are owned by the same player (given par entState of selection[0]). 226 224 var playerState = simState.players[entState.player]; 227 225 var playerOwned = (targetState.player == entState.player); 228 226 var allyOwned = playerState.isAlly[targetState.player]; … … 315 313 // can return to the dropsite, can build the foundation, or can attack the enemy 316 314 for each (var entityID in selection) 317 315 { 318 var entState = GetE ntityState(entityID);316 var entState = GetExtendedEntityState(entityID); 319 317 if (!entState) 320 318 continue; 321 319 … … 485 483 486 484 var targets = []; 487 485 var target = undefined; 488 var targetState = undefined;489 486 if (!fromMinimap) 490 487 targets = Engine.PickEntitiesAtPoint(x, y); 491 488 … … 1852 1849 { 1853 1850 if (entity) 1854 1851 { 1855 var entState = GetE ntityState(entity);1852 var entState = GetExtendedEntityState(entity); 1856 1853 var playerID = Engine.GetPlayerID(); 1857 1854 1858 1855 if (entState.player == playerID || g_DevSettings.controlAll) -
binaries/data/mods/public/gui/session/selection_details.js
325 325 /* If the unit has no data (e.g. it was killed), don't try displaying any 326 326 data for it. (TODO: it should probably be removed from the selection too; 327 327 also need to handle multi-unit selections) */ 328 var entState = GetE ntityState(selection[0]);328 var entState = GetExtendedEntityState(selection[0]); 329 329 if (!entState) 330 330 return; 331 331 -
binaries/data/mods/public/gui/session/session.js
33 33 34 34 // Cache EntityStates 35 35 var g_EntityStates = {}; // {id:entState} 36 var g_ExtendedEntityStates = {}; // {id:entState} 36 37 37 38 // Whether the player has lost/won and reached the end of their game 38 39 var g_GameEnded = false; … … 72 73 return g_EntityStates[entId]; 73 74 } 74 75 76 function GetExtendedEntityState(entId) 77 { 78 if (!(entId in g_ExtendedEntityStates)) 79 { 80 if (!(entId in g_EntityStates)) 81 { 82 var entState = Engine.GuiInterfaceCall("GetEntityState", entId); 83 g_EntityStates[entId] = entState; 84 } 85 else 86 var entState = g_EntityStates[entId]; 87 88 var extendedEntState = Engine.GuiInterfaceCall("GetExtendedEntityState", entId); 89 for (var prop in entState) 90 extendedEntState[prop] = entState[prop]; 91 g_ExtendedEntityStates[entId] = extendedEntState; 92 } 93 94 return g_ExtendedEntityStates[entId]; 95 } 96 75 97 // Cache TemplateData 76 98 var g_TemplateData = {}; // {id:template} 77 99 … … 435 457 function onSimulationUpdate() 436 458 { 437 459 g_EntityStates = {}; 460 g_ExtendedEntityStates = {}; 438 461 g_TemplateData = {}; 439 462 g_TechnologyData = {}; 440 463 … … 480 503 } 481 504 482 505 var heroImage = getGUIObjectByName("unitHeroImage"); 483 var heroState = GetE ntityState(playerState.heroes[0]);506 var heroState = GetExtendedEntityState(playerState.heroes[0]); 484 507 var template = GetTemplateData(heroState.template); 485 508 heroImage.sprite = "stretched:session/portraits/" + template.icon; 486 509 var hero = playerState.heroes[0]; … … 555 578 var selection = g_Selection.toList(); 556 579 if (selection.length) 557 580 { 558 var entState = GetE ntityState(selection[0]);581 var entState = GetExtendedEntityState(selection[0]); 559 582 if (entState) 560 583 { 561 584 var template = GetTemplateData(entState.template); -
binaries/data/mods/public/simulation/components/GuiInterface.js
145 145 this.renamedEntities = []; 146 146 }; 147 147 148 /** 149 * Get common entity info, often used in the gui 150 */ 148 151 GuiInterface.prototype.GetEntityState = function(player, ent) 149 152 { 150 153 var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); … … 185 188 ret.needsHeal = !cmpHealth.IsUnhealable(); 186 189 } 187 190 188 var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI);189 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);190 var cmpAttack = Engine.QueryInterface(ent, IID_Attack);191 192 if (cmpAttack)193 {194 var type = cmpAttack.GetBestAttack(); // TODO: how should we decide which attack to show? show all?195 ret.attack = cmpAttack.GetAttackStrengths(type);196 var range = cmpAttack.GetRange(type);197 ret.attack.type = type;198 ret.attack.minRange = range.min;199 ret.attack.maxRange = range.max;200 if (type == "Ranged")201 {202 ret.attack.elevationBonus = range.elevationBonus;203 if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld())204 {205 // For units, take the rage in front of it, no spread. So angle = 0206 ret.attack.elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(ret.position, ret.rotation, range.max, range.elevationBonus, 0);207 }208 else if(cmpPosition && cmpPosition.IsInWorld())209 {210 // For buildings, take the average elevation around it. So angle = 2*pi211 ret.attack.elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(ret.position, ret.rotation, range.max, range.elevationBonus, 2*Math.PI);212 }213 else214 {215 // not in world, set a default?216 ret.attack.elevationAdaptedRange = ret.attack.maxRange;217 }218 219 }220 else221 {222 // not a ranged attack, set some defaults223 ret.attack.elevationBonus = 0;224 ret.attack.elevationAdaptedRange = ret.attack.maxRange;225 }226 }227 228 var cmpArmour = Engine.QueryInterface(ent, IID_DamageReceiver);229 if (cmpArmour)230 {231 ret.armour = cmpArmour.GetArmourStrengths();232 }233 234 191 var cmpBuilder = Engine.QueryInterface(ent, IID_Builder); 235 192 if (cmpBuilder) 236 193 { … … 274 231 }; 275 232 } 276 233 277 var cmpObstruction = Engine.QueryInterface(ent, IID_Obstruction);278 if (cmpObstruction)279 {280 ret.obstruction = {281 "controlGroup": cmpObstruction.GetControlGroup(),282 "controlGroup2": cmpObstruction.GetControlGroup2(),283 };284 }285 286 234 var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership); 287 235 if (cmpOwnership) 288 236 { 289 237 ret.player = cmpOwnership.GetOwner(); 290 238 } 291 239 292 var cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply);293 if (cmpResourceSupply)294 {295 ret.resourceSupply = {296 "isInfinite": cmpResourceSupply.IsInfinite(),297 "max": cmpResourceSupply.GetMaxAmount(),298 "amount": cmpResourceSupply.GetCurrentAmount(),299 "type": cmpResourceSupply.GetType(),300 "killBeforeGather": cmpResourceSupply.GetKillBeforeGather(),301 "maxGatherers": cmpResourceSupply.GetMaxGatherers(),302 "gatherers": cmpResourceSupply.GetGatherers()303 };304 }305 306 var cmpResourceGatherer = Engine.QueryInterface(ent, IID_ResourceGatherer);307 if (cmpResourceGatherer)308 {309 ret.resourceGatherRates = cmpResourceGatherer.GetGatherRates();310 ret.resourceCarrying = cmpResourceGatherer.GetCarryingStatus();311 }312 313 var cmpResourceDropsite = Engine.QueryInterface(ent, IID_ResourceDropsite);314 if (cmpResourceDropsite)315 {316 ret.resourceDropsite = {317 "types": cmpResourceDropsite.GetTypes()318 };319 }320 321 240 var cmpRallyPoint = Engine.QueryInterface(ent, IID_RallyPoint); 322 241 if (cmpRallyPoint) 323 242 { … … 335 254 }; 336 255 } 337 256 338 var cmpPromotion = Engine.QueryInterface(ent, IID_Promotion); 339 if (cmpPromotion) 340 { 341 ret.promotion = { 342 "curr": cmpPromotion.GetCurrentXp(), 343 "req": cmpPromotion.GetRequiredXp() 344 }; 345 } 346 257 var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); 347 258 if (cmpUnitAI) 348 259 { 349 260 ret.unitAI = { … … 365 276 "entities": cmpGuard.GetEntities(), 366 277 }; 367 278 } 368 279 369 280 var cmpGate = Engine.QueryInterface(ent, IID_Gate); 370 281 if (cmpGate) 371 282 { 372 283 ret.gate = { 373 284 "locked": cmpGate.IsLocked(), 374 285 }; 286 } 287 288 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 289 ret.visibility = cmpRangeManager.GetLosVisibility(ent, player, false); 290 291 return ret; 292 }; 293 294 /** 295 * Get additionnal entity info, rarely used in the gui 296 */ 297 GuiInterface.prototype.GetExtendedEntityState = function(player, ent) 298 { 299 var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager); 300 301 // All units must have a template; if not then it's a nonexistent entity id 302 var template = cmpTemplateManager.GetCurrentTemplateName(ent); 303 if (!template) 304 return null; 305 306 var ret = { "id": ent }; 307 308 var cmpIdentity = Engine.QueryInterface(ent, IID_Identity); 309 var cmpUnitAI = Engine.QueryInterface(ent, IID_UnitAI); 310 var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager); 311 var cmpAttack = Engine.QueryInterface(ent, IID_Attack); 312 313 if (cmpAttack) 314 { 315 var type = cmpAttack.GetBestAttack(); // TODO: how should we decide which attack to show? show all? 316 ret.attack = cmpAttack.GetAttackStrengths(type); 317 var range = cmpAttack.GetRange(type); 318 ret.attack.type = type; 319 ret.attack.minRange = range.min; 320 ret.attack.maxRange = range.max; 321 if (type == "Ranged") 322 { 323 ret.attack.elevationBonus = range.elevationBonus; 324 var cmpPosition = Engine.QueryInterface(ent, IID_Position); 325 if (cmpUnitAI && cmpPosition && cmpPosition.IsInWorld()) 326 { 327 // For units, take the rage in front of it, no spread. So angle = 0 328 ret.attack.elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 0); 329 } 330 else if(cmpPosition && cmpPosition.IsInWorld()) 331 { 332 // For buildings, take the average elevation around it. So angle = 2*pi 333 ret.attack.elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(cmpPosition.GetPosition(), cmpPosition.GetRotation(), range.max, range.elevationBonus, 2*Math.PI); 334 } 335 else 336 { 337 // not in world, set a default? 338 ret.attack.elevationAdaptedRange = ret.attack.maxRange; 339 } 340 341 } 342 else 343 { 344 // not a ranged attack, set some defaults 345 ret.attack.elevationBonus = 0; 346 ret.attack.elevationAdaptedRange = ret.attack.maxRange; 347 } 348 } 349 350 var cmpArmour = Engine.QueryInterface(ent, IID_DamageReceiver); 351 if (cmpArmour) 352 { 353 ret.armour = cmpArmour.GetArmourStrengths(); 354 } 355 356 var cmpObstruction = Engine.QueryInterface(ent, IID_Obstruction); 357 if (cmpObstruction) 358 { 359 ret.obstruction = { 360 "controlGroup": cmpObstruction.GetControlGroup(), 361 "controlGroup2": cmpObstruction.GetControlGroup2(), 362 }; 363 } 364 365 var cmpResourceSupply = Engine.QueryInterface(ent, IID_ResourceSupply); 366 if (cmpResourceSupply) 367 { 368 ret.resourceSupply = { 369 "isInfinite": cmpResourceSupply.IsInfinite(), 370 "max": cmpResourceSupply.GetMaxAmount(), 371 "amount": cmpResourceSupply.GetCurrentAmount(), 372 "type": cmpResourceSupply.GetType(), 373 "killBeforeGather": cmpResourceSupply.GetKillBeforeGather(), 374 "maxGatherers": cmpResourceSupply.GetMaxGatherers(), 375 "gatherers": cmpResourceSupply.GetGatherers() 376 }; 377 } 378 379 var cmpResourceGatherer = Engine.QueryInterface(ent, IID_ResourceGatherer); 380 if (cmpResourceGatherer) 381 { 382 ret.resourceGatherRates = cmpResourceGatherer.GetGatherRates(); 383 ret.resourceCarrying = cmpResourceGatherer.GetCarryingStatus(); 384 } 385 386 var cmpResourceDropsite = Engine.QueryInterface(ent, IID_ResourceDropsite); 387 if (cmpResourceDropsite) 388 { 389 ret.resourceDropsite = { 390 "types": cmpResourceDropsite.GetTypes() 391 }; 392 } 393 394 var cmpPromotion = Engine.QueryInterface(ent, IID_Promotion); 395 if (cmpPromotion) 396 { 397 ret.promotion = { 398 "curr": cmpPromotion.GetCurrentXp(), 399 "req": cmpPromotion.GetRequiredXp() 400 }; 375 401 } 376 402 403 var cmpFoundation = Engine.QueryInterface(ent, IID_Foundation); 377 404 if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("BarterMarket")) 378 405 { 379 406 var cmpBarter = Engine.QueryInterface(SYSTEM_ENTITY, IID_Barter); … … 389 416 }; 390 417 } 391 418 392 ret.visibility = cmpRangeManager.GetLosVisibility(ent, player, false);393 394 419 return ret; 395 420 }; 396 421 … … 407 432 return cmpRangeManager.GetElevationAdaptedRange(pos, rot, range, elevationBonus, 2*Math.PI); 408 433 }; 409 434 410 411 412 435 GuiInterface.prototype.GetTemplateData = function(player, extendedName) 413 436 { 414 437 var name = extendedName; … … 1799 1822 "GetRenamedEntities": 1, 1800 1823 "ClearRenamedEntities": 1, 1801 1824 "GetEntityState": 1, 1825 "GetExtendedEntityState": 1, 1802 1826 "GetAverageRangeForBuildings": 1, 1803 1827 "GetTemplateData": 1, 1804 1828 "GetTechnologyData": 1,