diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index 881e971076..1035c1dd53 100644 --- a/binaries/data/mods/public/gui/session/session.js +++ b/binaries/data/mods/public/gui/session/session.js @@ -837,7 +837,7 @@ function recalculateStatusBarDisplay() { let entities; if (g_ShowAllStatusBars) - entities = Engine.PickPlayerEntitiesOnScreen(Engine.GetPlayerID()); + entities = Engine.GetPlayerID() == -1 ? Engine.PickNonGaiaEntitiesOnScreen() : Engine.PickPlayerEntitiesOnScreen(Engine.GetPlayerID()); else { let selected = g_Selection.toList(); @@ -845,7 +845,7 @@ function recalculateStatusBarDisplay() selected.push(g_Selection.highlighted[ent]); // Remove selected entities from the 'all entities' array, to avoid disabling their status bars. - entities = Engine.GuiInterfaceCall("GetPlayerEntities").filter(idx => selected.indexOf(idx) == -1); + entities = Engine.GuiInterfaceCall(Engine.GetPlayerID() == -1 ? "GetNonGaiaEntities" : "GetPlayerEntities").filter(idx => selected.indexOf(idx) == -1); } Engine.GuiInterfaceCall("SetStatusBars", { "entities": entities, "enabled": g_ShowAllStatusBars }); diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js index 3787865a11..97e0753e21 100644 --- a/binaries/data/mods/public/simulation/components/GuiInterface.js +++ b/binaries/data/mods/public/simulation/components/GuiInterface.js @@ -860,6 +860,11 @@ GuiInterface.prototype.GetPlayerEntities = function(player) return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetEntitiesByPlayer(player); }; +GuiInterface.prototype.GetNonGaiaEntities = function() +{ + return Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager).GetNonGaiaEntities(); +}; + /** * Displays the rally points of a given list of entities (carried in cmd.entities). * @@ -1854,6 +1859,7 @@ let exposedFunctions = { "GetAllBuildableEntities": 1, "SetStatusBars": 1, "GetPlayerEntities": 1, + "GetNonGaiaEntities": 1, "DisplayRallyPoint": 1, "SetBuildingPlacementPreview": 1, "SetWallPlacementPreview": 1, diff --git a/source/gui/scripting/ScriptFunctions.cpp b/source/gui/scripting/ScriptFunctions.cpp index 80d1ccf342..d6cfd917db 100644 --- a/source/gui/scripting/ScriptFunctions.cpp +++ b/source/gui/scripting/ScriptFunctions.cpp @@ -62,6 +62,7 @@ #include "simulation2/components/ICmpAIManager.h" #include "simulation2/components/ICmpCommandQueue.h" #include "simulation2/components/ICmpGuiInterface.h" +#include "simulation2/components/ICmpPlayerManager.h" #include "simulation2/components/ICmpRangeManager.h" #include "simulation2/components/ICmpSelectable.h" #include "simulation2/components/ICmpTemplateManager.h" @@ -164,6 +165,24 @@ std::vector PickPlayerEntitiesOnScreen(ScriptInterface::CxPrivate* return PickPlayerEntitiesInRect(pCxPrivate, 0, 0, g_xres, g_yres, player); } +std::vector PickNonGaiaEntitiesOnScreen(ScriptInterface::CxPrivate* pCxPrivate) +{ + std::vector entities; + + CmpPtr cmpPlayerManager(*g_Game->GetSimulation2(), SYSTEM_ENTITY); + if (!cmpPlayerManager) + return entities; + + i32 numPlayers = cmpPlayerManager->GetNumPlayers(); + for (i32 player = 1; player < numPlayers; ++player) + { + std::vector ents = PickPlayerEntitiesOnScreen(pCxPrivate, player); + entities.insert(entities.end(), ents.begin(), ents.end()); + } + + return entities; +} + std::vector PickSimilarPlayerEntities(ScriptInterface::CxPrivate* UNUSED(pCxPrivate), std::string templateName, bool includeOffScreen, bool matchRank, bool allowFoundations) { return EntitySelection::PickSimilarEntities(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), templateName, g_Game->GetPlayerID(), includeOffScreen, matchRank, false, allowFoundations); @@ -967,6 +986,7 @@ void GuiScriptingInit(ScriptInterface& scriptInterface) scriptInterface.RegisterFunction("PickEntityAtPoint"); scriptInterface.RegisterFunction, int, int, int, int, int, &PickPlayerEntitiesInRect>("PickPlayerEntitiesInRect"); scriptInterface.RegisterFunction, int, &PickPlayerEntitiesOnScreen>("PickPlayerEntitiesOnScreen"); + scriptInterface.RegisterFunction, &PickNonGaiaEntitiesOnScreen>("PickNonGaiaEntitiesOnScreen"); scriptInterface.RegisterFunction, std::string, bool, bool, bool, &PickSimilarPlayerEntities>("PickSimilarPlayerEntities"); scriptInterface.RegisterFunction("GetTerrainAtScreenPoint"); diff --git a/source/simulation2/components/CCmpRangeManager.cpp b/source/simulation2/components/CCmpRangeManager.cpp index 4d88c7effe..0fb74e883f 100644 --- a/source/simulation2/components/CCmpRangeManager.cpp +++ b/source/simulation2/components/CCmpRangeManager.cpp @@ -1,4 +1,4 @@ -/* Copyright (C) 2015 Wildfire Games. +/* Copyright (C) 2016 Wildfire Games. * This file is part of 0 A.D. * * 0 A.D. is free software: you can redistribute it and/or modify @@ -922,9 +922,17 @@ public: virtual std::vector GetEntitiesByPlayer(player_id_t player) { - std::vector entities; + return GetEntitiesByMask(CalcOwnerMask(player)); + } - u32 ownerMask = CalcOwnerMask(player); + virtual std::vector GetNonGaiaEntities() + { + return GetEntitiesByMask(((1 << MAX_LOS_PLAYER_ID) - 1) << 1); + } + + virtual std::vector GetEntitiesByMask(u32 ownerMask) + { + std::vector entities; for (EntityMap::const_iterator it = m_EntityData.begin(); it != m_EntityData.end(); ++it) { diff --git a/source/simulation2/components/ICmpRangeManager.cpp b/source/simulation2/components/ICmpRangeManager.cpp index da11a98adc..afd9a392cb 100644 --- a/source/simulation2/components/ICmpRangeManager.cpp +++ b/source/simulation2/components/ICmpRangeManager.cpp @@ -46,6 +46,7 @@ DEFINE_INTERFACE_METHOD_1("ResetActiveQuery", std::vector, ICmpRang DEFINE_INTERFACE_METHOD_3("SetEntityFlag", void, ICmpRangeManager, SetEntityFlag, entity_id_t, std::string, bool) DEFINE_INTERFACE_METHOD_1("GetEntityFlagMask", u8, ICmpRangeManager, GetEntityFlagMask, std::string) DEFINE_INTERFACE_METHOD_1("GetEntitiesByPlayer", std::vector, ICmpRangeManager, GetEntitiesByPlayer, player_id_t) +DEFINE_INTERFACE_METHOD_0("GetNonGaiaEntities", std::vector, ICmpRangeManager, GetNonGaiaEntities) DEFINE_INTERFACE_METHOD_1("SetDebugOverlay", void, ICmpRangeManager, SetDebugOverlay, bool) DEFINE_INTERFACE_METHOD_1("ExploreAllTiles", void, ICmpRangeManager, ExploreAllTiles, player_id_t) DEFINE_INTERFACE_METHOD_0("ExploreTerritories", void, ICmpRangeManager, ExploreTerritories) diff --git a/source/simulation2/components/ICmpRangeManager.h b/source/simulation2/components/ICmpRangeManager.h index 35e063282c..a7d45a5223 100644 --- a/source/simulation2/components/ICmpRangeManager.h +++ b/source/simulation2/components/ICmpRangeManager.h @@ -192,6 +192,11 @@ public: */ virtual std::vector GetEntitiesByPlayer(player_id_t player) = 0; + /** + * Returns a list of all entities of all players except gaia. + */ + virtual std::vector GetNonGaiaEntities() = 0; + /** * Toggle the rendering of debug info. */