mirror of
https://gitea.wildfiregames.com/0ad/0ad
synced 2026-06-17 13:53:57 -07:00
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:
parent
fa7e0c10ba
commit
cf04bad4bc
10 changed files with 48 additions and 18 deletions
|
|
@ -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": {
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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],
|
||||
|
|
|
|||
Loading…
Reference in a new issue