Ticket #2179: extendedEntityState.diff

File extendedEntityState.diff, 13.1 KB (added by mimo, 10 years ago)
  • binaries/data/mods/public/gui/session/input.js

     
    213213    // Look at the first targeted entity
    214214    // (TODO: maybe we eventually want to look at more, and be more context-sensitive?
    215215    // e.g. prefer to attack an enemy unit, even if some friendly units are closer to the mouse)
    216     var targetState = GetEntityState(target);
     216    var targetState = GetExtendedEntityState(target);
    217217
    218218    var gaiaOwned = (targetState.player == 0);
    219219
    220220    // Look to see what type of command units going to the rally point should use
    221221    if (action == "set-rallypoint")
    222222    {
    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]).
    226224        var playerState = simState.players[entState.player];
    227225        var playerOwned = (targetState.player == entState.player);
    228226        var allyOwned = playerState.isAlly[targetState.player];
     
    315313    // can return to the dropsite, can build the foundation, or can attack the enemy
    316314    for each (var entityID in selection)
    317315    {
    318         var entState = GetEntityState(entityID);
     316        var entState = GetExtendedEntityState(entityID);
    319317        if (!entState)
    320318            continue;
    321319
     
    485483
    486484    var targets = [];
    487485    var target = undefined;
    488     var targetState = undefined;
    489486    if (!fromMinimap)
    490487        targets = Engine.PickEntitiesAtPoint(x, y);
    491488
     
    18521849{
    18531850    if (entity)
    18541851    {
    1855         var entState = GetEntityState(entity);
     1852        var entState = GetExtendedEntityState(entity);
    18561853        var playerID = Engine.GetPlayerID();
    18571854
    18581855        if (entState.player == playerID || g_DevSettings.controlAll)
  • binaries/data/mods/public/gui/session/selection_details.js

     
    325325    /* If the unit has no data (e.g. it was killed), don't try displaying any
    326326     data for it. (TODO: it should probably be removed from the selection too;
    327327     also need to handle multi-unit selections) */
    328     var entState = GetEntityState(selection[0]);
     328    var entState = GetExtendedEntityState(selection[0]);
    329329    if (!entState)
    330330        return;
    331331
  • binaries/data/mods/public/gui/session/session.js

     
    3333
    3434// Cache EntityStates
    3535var g_EntityStates = {}; // {id:entState}
     36var g_ExtendedEntityStates = {}; // {id:entState}
    3637
    3738// Whether the player has lost/won and reached the end of their game
    3839var g_GameEnded = false;
     
    7273    return g_EntityStates[entId];
    7374}
    7475
     76function 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
    7597// Cache TemplateData
    7698var g_TemplateData = {}; // {id:template}
    7799
     
    435457function onSimulationUpdate()
    436458{
    437459    g_EntityStates = {};
     460    g_ExtendedEntityStates = {};
    438461    g_TemplateData = {};
    439462    g_TechnologyData = {};
    440463
     
    480503    }
    481504
    482505    var heroImage = getGUIObjectByName("unitHeroImage");
    483     var heroState = GetEntityState(playerState.heroes[0]);
     506    var heroState = GetExtendedEntityState(playerState.heroes[0]);
    484507    var template = GetTemplateData(heroState.template);
    485508    heroImage.sprite = "stretched:session/portraits/" + template.icon;
    486509    var hero = playerState.heroes[0];
     
    555578    var selection = g_Selection.toList();
    556579    if (selection.length)
    557580    {
    558         var entState = GetEntityState(selection[0]);
     581        var entState = GetExtendedEntityState(selection[0]);
    559582        if (entState)
    560583        {
    561584            var template = GetTemplateData(entState.template);
  • binaries/data/mods/public/simulation/components/GuiInterface.js

     
    145145    this.renamedEntities = [];
    146146};
    147147
     148/**
     149 * Get common entity info, often used in the gui
     150 */
    148151GuiInterface.prototype.GetEntityState = function(player, ent)
    149152{
    150153    var cmpTemplateManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_TemplateManager);
     
    185188        ret.needsHeal = !cmpHealth.IsUnhealable();
    186189    }
    187190
    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 = 0
    206                 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*pi
    211                 ret.attack.elevationAdaptedRange = cmpRangeManager.GetElevationAdaptedRange(ret.position, ret.rotation, range.max, range.elevationBonus, 2*Math.PI);
    212             }
    213             else
    214             {
    215                 // not in world, set a default?
    216                 ret.attack.elevationAdaptedRange = ret.attack.maxRange;
    217             }
    218            
    219         }
    220         else
    221         {
    222             // not a ranged attack, set some defaults
    223             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 
    234191    var cmpBuilder = Engine.QueryInterface(ent, IID_Builder);
    235192    if (cmpBuilder)
    236193    {
     
    274231        };
    275232    }
    276233
    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 
    286234    var cmpOwnership = Engine.QueryInterface(ent, IID_Ownership);
    287235    if (cmpOwnership)
    288236    {
    289237        ret.player = cmpOwnership.GetOwner();
    290238    }
    291239
    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 
    321240    var cmpRallyPoint = Engine.QueryInterface(ent, IID_RallyPoint);
    322241    if (cmpRallyPoint)
    323242    {
     
    335254        };
    336255    }
    337256   
    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);
    347258    if (cmpUnitAI)
    348259    {
    349260        ret.unitAI = {
     
    365276            "entities": cmpGuard.GetEntities(),
    366277        };
    367278    }
    368    
     279
    369280    var cmpGate = Engine.QueryInterface(ent, IID_Gate);
    370281    if (cmpGate)
    371282    {
    372283        ret.gate = {
    373284            "locked": cmpGate.IsLocked(),
    374285        };
     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 */
     297GuiInterface.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        };
    375401    }   
    376402
     403    var cmpFoundation = Engine.QueryInterface(ent, IID_Foundation);
    377404    if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("BarterMarket"))
    378405    {
    379406        var cmpBarter = Engine.QueryInterface(SYSTEM_ENTITY, IID_Barter);
     
    389416        };
    390417    }
    391418
    392     ret.visibility = cmpRangeManager.GetLosVisibility(ent, player, false);
    393 
    394419    return ret;
    395420};
    396421
     
    407432    return cmpRangeManager.GetElevationAdaptedRange(pos, rot, range, elevationBonus, 2*Math.PI);
    408433};
    409434
    410 
    411 
    412435GuiInterface.prototype.GetTemplateData = function(player, extendedName)
    413436{
    414437    var name = extendedName;
     
    17991822    "GetRenamedEntities": 1,
    18001823    "ClearRenamedEntities": 1,
    18011824    "GetEntityState": 1,
     1825    "GetExtendedEntityState": 1,
    18021826    "GetAverageRangeForBuildings": 1,
    18031827    "GetTemplateData": 1,
    18041828    "GetTechnologyData": 1,