Ingame summary screen and allied resource / population tooltips for active players. Patch by Imarok, also reviewed by fatherbushido and discussed with mimo, fixes #3841.

Shows (only) the stats of the current player in the summary screen while
playing.
Also shows those of mutual allies too if the shared vision tech is
researched.
Display the resources and population counts of allies in the tooltips of
the top panel.
Use a sprintf for the pop / limit ratio and remove hardcoded resource
strings in the XML, refs #3934.

This was SVN commit r18533.
This commit is contained in:
elexis 2016-07-20 01:22:07 +00:00
parent fa7e0c10ba
commit cf04bad4bc
10 changed files with 48 additions and 18 deletions

View file

@ -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": {

View file

@ -48,7 +48,6 @@
style="StoneButtonFancy"
size="0 96 100% 124"
tooltip_style="sessionToolTip"
enabled="false"
>
<translatableAttribute id="caption">Summary</translatableAttribute>
<action on="Press">openGameSummary();</action>

View file

@ -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;
}

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<object name="food" size="10 0 100 100%" type="image" style="resourceCounter" tooltip_style="sessionToolTipBold">
<translatableAttribute id="tooltip">Food</translatableAttribute>
<object size="0 -4 40 36" type="image" sprite="stretched:session/icons/resources/food.png" ghost="true"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resourceFood"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resource_food"/>
</object>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<object name="metal" size="280 0 370 100%" type="image" style="resourceCounter" tooltip_style="sessionToolTipBold">
<translatableAttribute id="tooltip">Metal</translatableAttribute>
<object size="0 -4 40 36" type="image" sprite="stretched:session/icons/resources/metal.png" ghost="true"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resourceMetal"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resource_metal"/>
</object>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<object name="stone" size="190 0 280 100%" type="image" style="resourceCounter" tooltip_style="sessionToolTipBold">
<translatableAttribute id="tooltip">Stone</translatableAttribute>
<object size="0 -4 40 36" type="image" sprite="stretched:session/icons/resources/stone.png" ghost="true"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resourceStone"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resource_stone"/>
</object>

View file

@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<object name="wood" size="100 0 190 100%" type="image" style="resourceCounter" tooltip_style="sessionToolTipBold">
<translatableAttribute id="tooltip">Wood</translatableAttribute>
<object size="0 -4 40 36" type="image" sprite="stretched:session/icons/resources/wood.png" ghost="true"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resourceWood"/>
<object size="32 0 100% 100%-2" type="text" style="resourceText" name="resource_wood"/>
</object>

View file

@ -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,

View file

@ -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;

View file

@ -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],