diff --git a/binaries/data/mods/public/gui/session/menu.js b/binaries/data/mods/public/gui/session/menu.js
index f7db497dcc..494bd143b3 100644
--- a/binaries/data/mods/public/gui/session/menu.js
+++ b/binaries/data/mods/public/gui/session/menu.js
@@ -610,7 +610,10 @@ function toggleGameSpeed()
let gameSpeed = Engine.GetGUIObjectByName("gameSpeed");
gameSpeed.hidden = !gameSpeed.hidden;
}
-
+/**
+ * Allows players to see their own summary.
+ * If they have shared ally vision researched, they are able to see the summary of there allies too.
+ */
function openGameSummary()
{
closeOpenDialogs();
@@ -620,7 +623,9 @@ function openGameSummary()
Engine.PushGuiPage("page_summary.xml", {
"sim": {
"mapSettings": g_GameAttributes.settings,
- "playerStates": extendedSimState.players,
+ "playerStates":extendedSimState.players.filter((state,player) =>
+ g_IsObserver || player == 0 || player == g_ViewedPlayer ||
+ extendedSimState.players[g_ViewedPlayer].hasSharedLos && g_Players[player].isMutualAlly[g_ViewedPlayer]),
"timeElapsed" : extendedSimState.timeElapsed
},
"gui": {
diff --git a/binaries/data/mods/public/gui/session/menu.xml b/binaries/data/mods/public/gui/session/menu.xml
index f9ce348403..5f50bb21fc 100644
--- a/binaries/data/mods/public/gui/session/menu.xml
+++ b/binaries/data/mods/public/gui/session/menu.xml
@@ -48,7 +48,6 @@
style="StoneButtonFancy"
size="0 96 100% 124"
tooltip_style="sessionToolTip"
- enabled="false"
>
Summary
openGameSummary();
diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js
index ff1421c6f1..245ff19335 100644
--- a/binaries/data/mods/public/gui/session/session.js
+++ b/binaries/data/mods/public/gui/session/session.js
@@ -483,7 +483,6 @@ function updateTopPanel()
// Disable stuff observers shouldn't use
Engine.GetGUIObjectByName("pauseButton").enabled = !g_IsObserver || !g_IsNetworked;
Engine.GetGUIObjectByName("menuResignButton").enabled = !g_IsObserver;
- Engine.GetGUIObjectByName("summaryButton").enabled = g_IsObserver;
}
function reportPerformance(time)
@@ -936,19 +935,38 @@ function updateDebug()
debug.caption = text.replace(/\[/g, "\\[");
}
+function getAllyStatTooltip(resource)
+{
+ let playersState = GetSimState().players;
+ let ret = "";
+ for (let player in playersState)
+ if (player != 0 && player != g_ViewedPlayer &&
+ (g_IsObserver || playersState[g_ViewedPlayer].hasSharedLos && g_Players[player].isMutualAlly[g_ViewedPlayer]))
+ ret += "\n" + sprintf(translate("%(playername)s: %(statValue)s"),{
+ "playername": colorizePlayernameHelper("■", player) + " " + g_Players[player].name,
+ "statValue": resource == "pop" ?
+ sprintf(translate("%(popCount)s/%(popLimit)s/%(popMax)s"), playersState[player]) :
+ playersState[player].resourceCounts[resource]
+ });
+ return ret;
+}
+
function updatePlayerDisplay()
{
let playerState = GetSimState().players[g_ViewedPlayer];
if (!playerState)
return;
- Engine.GetGUIObjectByName("resourceFood").caption = Math.floor(playerState.resourceCounts.food);
- Engine.GetGUIObjectByName("resourceWood").caption = Math.floor(playerState.resourceCounts.wood);
- Engine.GetGUIObjectByName("resourceStone").caption = Math.floor(playerState.resourceCounts.stone);
- Engine.GetGUIObjectByName("resourceMetal").caption = Math.floor(playerState.resourceCounts.metal);
- Engine.GetGUIObjectByName("resourcePop").caption = playerState.popCount + "/" + playerState.popLimit;
+ for (let res of RESOURCES)
+ {
+ Engine.GetGUIObjectByName("resource_" + res).caption = Math.floor(playerState.resourceCounts[res]);
+ Engine.GetGUIObjectByName(res).tooltip = getLocalizedResourceName(res, "firstWord") + getAllyStatTooltip(res);
+ }
+
+ Engine.GetGUIObjectByName("resourcePop").caption = sprintf(translate("%(popCount)s/%(popLimit)s"), playerState);
Engine.GetGUIObjectByName("population").tooltip = translate("Population (current / limit)") + "\n" +
- sprintf(translate("Maximum population: %(popCap)s"), { "popCap": playerState.popMax });
+ sprintf(translate("Maximum population: %(popCap)s"), { "popCap": playerState.popMax }) +
+ getAllyStatTooltip("pop");
g_IsTrainingBlocked = playerState.trainingBlocked;
}
diff --git a/binaries/data/mods/public/gui/session/top_panel/resource_food.xml b/binaries/data/mods/public/gui/session/top_panel/resource_food.xml
index c3f49a4688..4d84ca7551 100644
--- a/binaries/data/mods/public/gui/session/top_panel/resource_food.xml
+++ b/binaries/data/mods/public/gui/session/top_panel/resource_food.xml
@@ -1,6 +1,5 @@
diff --git a/binaries/data/mods/public/gui/session/top_panel/resource_metal.xml b/binaries/data/mods/public/gui/session/top_panel/resource_metal.xml
index 8dc01ecc93..4edba7939b 100644
--- a/binaries/data/mods/public/gui/session/top_panel/resource_metal.xml
+++ b/binaries/data/mods/public/gui/session/top_panel/resource_metal.xml
@@ -1,6 +1,5 @@
- Metal
-
+
diff --git a/binaries/data/mods/public/gui/session/top_panel/resource_stone.xml b/binaries/data/mods/public/gui/session/top_panel/resource_stone.xml
index 37d08e39e9..6133acc30e 100644
--- a/binaries/data/mods/public/gui/session/top_panel/resource_stone.xml
+++ b/binaries/data/mods/public/gui/session/top_panel/resource_stone.xml
@@ -1,6 +1,5 @@
- Stone
-
+
diff --git a/binaries/data/mods/public/gui/session/top_panel/resource_wood.xml b/binaries/data/mods/public/gui/session/top_panel/resource_wood.xml
index 90558afb3b..f020979f33 100644
--- a/binaries/data/mods/public/gui/session/top_panel/resource_wood.xml
+++ b/binaries/data/mods/public/gui/session/top_panel/resource_wood.xml
@@ -1,6 +1,5 @@
- Wood
-
+
diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js
index de6aebaf92..aaa7855580 100644
--- a/binaries/data/mods/public/simulation/components/GuiInterface.js
+++ b/binaries/data/mods/public/simulation/components/GuiInterface.js
@@ -107,6 +107,7 @@ GuiInterface.prototype.GetSimulationState = function()
"cheatsEnabled": cmpPlayer.GetCheatsEnabled(),
"disabledTemplates": cmpPlayer.GetDisabledTemplates(),
"hasSharedDropsites": cmpPlayer.HasSharedDropsites(),
+ "hasSharedLos": cmpPlayer.HasSharedLos(),
"phase": phase,
"isAlly": allies,
"isMutualAlly": mutualAllies,
diff --git a/binaries/data/mods/public/simulation/components/Player.js b/binaries/data/mods/public/simulation/components/Player.js
index 4f81bd6254..cb137ddd93 100644
--- a/binaries/data/mods/public/simulation/components/Player.js
+++ b/binaries/data/mods/public/simulation/components/Player.js
@@ -545,6 +545,11 @@ Player.prototype.HasStartingCamera = function()
return this.startCam !== undefined;
};
+Player.prototype.HasSharedLos = function()
+{
+ let cmpTechnologyManager = Engine.QueryInterface(this.entity, IID_TechnologyManager);
+ return cmpTechnologyManager && cmpTechnologyManager.IsTechnologyResearched(this.template.SharedLosTech);
+};
Player.prototype.HasSharedDropsites = function()
{
return this.sharedDropsites;
diff --git a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
index 2224a3f7a1..6ae026e645 100644
--- a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
+++ b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
@@ -91,6 +91,7 @@ AddMock(100, IID_Player, {
IsEnemy: function() { return true; },
GetDisabledTemplates: function() { return {}; },
HasSharedDropsites: function() { return false; },
+ HasSharedLos: function() { return false; },
});
AddMock(100, IID_EntityLimits, {
@@ -174,6 +175,7 @@ AddMock(101, IID_Player, {
IsEnemy: function() { return false; },
GetDisabledTemplates: function() { return {}; },
HasSharedDropsites: function() { return false; },
+ HasSharedLos: function() { return false; },
});
AddMock(101, IID_EntityLimits, {
@@ -257,6 +259,7 @@ TS_ASSERT_UNEVAL_EQUALS(cmp.GetSimulationState(), {
cheatsEnabled: false,
disabledTemplates: {},
hasSharedDropsites: false,
+ hasSharedLos: false,
phase: "village",
isAlly: [false, false],
isMutualAlly: [false, false],
@@ -298,6 +301,7 @@ TS_ASSERT_UNEVAL_EQUALS(cmp.GetSimulationState(), {
cheatsEnabled: false,
disabledTemplates: {},
hasSharedDropsites: false,
+ hasSharedLos: false,
phase: "village",
isAlly: [true, true],
isMutualAlly: [false, false],
@@ -348,6 +352,7 @@ TS_ASSERT_UNEVAL_EQUALS(cmp.GetExtendedSimulationState(), {
cheatsEnabled: false,
disabledTemplates: {},
hasSharedDropsites: false,
+ hasSharedLos: false,
phase: "village",
isAlly: [false, false],
isMutualAlly: [false, false],
@@ -402,6 +407,7 @@ TS_ASSERT_UNEVAL_EQUALS(cmp.GetExtendedSimulationState(), {
cheatsEnabled: false,
disabledTemplates: {},
hasSharedDropsites: false,
+ hasSharedLos: false,
phase: "village",
isAlly: [true, true],
isMutualAlly: [false, false],