diff --git a/binaries/data/mods/public/gui/common/functions_global_object.js b/binaries/data/mods/public/gui/common/functions_global_object.js
index ae9fe0e527..a52347ede2 100644
--- a/binaries/data/mods/public/gui/common/functions_global_object.js
+++ b/binaries/data/mods/public/gui/common/functions_global_object.js
@@ -74,7 +74,58 @@ function openURL(url)
messageBox(600, 200, sprintf(translate("Opening %(url)s\n in default web browser. Please wait...."), { url: url }), translate("Opening page"), 2);
}
-function updateFPS()
-{
- Engine.GetGUIObjectByName("fpsCounter").caption = sprintf(translate("FPS: %(fps)s"), { fps: Engine.GetFPS() });
+function updateCounters()
+{
+ var caption = "";
+ var linesCount = 0;
+ var researchCount = 0;
+
+ if (Engine.ConfigDB_GetValue("user", "overlay.fps") === "true")
+ {
+ caption += sprintf(translate("FPS: %(fps)4s"), { fps: Engine.GetFPS() }) + "\n";
+ ++linesCount;
+ }
+ if (Engine.ConfigDB_GetValue("user", "overlay.realtime") === "true")
+ {
+ caption += (new Date()).toLocaleTimeString() + "\n";
+ ++linesCount;
+ }
+
+ // If game has been started
+ if (typeof g_SimState != "undefined")
+ {
+ if (Engine.ConfigDB_GetValue("user", "gui.session.timeelapsedcounter") === "true")
+ {
+ var currentSpeed = Engine.GetSimRate();
+ if (currentSpeed != 1.0)
+ caption += sprintf(
+ translate("%(time)s (%(speed)sx)"),
+ {
+ time: timeToString(g_SimState.timeElapsed),
+ speed: Engine.FormatDecimalNumberIntoString(currentSpeed)
+ }
+ );
+ else
+ caption += timeToString(g_SimState.timeElapsed);
+ caption += "\n";
+ ++linesCount;
+ }
+ if (Engine.ConfigDB_GetValue("user", "gui.session.ceasefirecounter") === "true" && g_SimState.ceasefireActive)
+ {
+ var remainingTimeString = timeToString(g_SimState.ceasefireTimeRemaining);
+ caption += remainingTimeString + "\n";
+
+ var diplomacyCeasefireCounter = Engine.GetGUIObjectByName("diplomacyCeasefireCounter");
+ diplomacyCeasefireCounter.caption = sprintf(translateWithContext("ceasefire", "Time remaining until ceasefire is over: %(time)s."), {"time": remainingTimeString});
+ ++linesCount;
+ }
+
+ g_ResearchListTop = 4;
+ if (linesCount)
+ g_ResearchListTop += 14 * linesCount;
+ }
+
+ var dataCounter = Engine.GetGUIObjectByName("dataCounter");
+ dataCounter.caption = caption;
+ dataCounter.size = sprintf("100%%-100 40 100%%-5 %(bottom)s", { bottom: 40 + 14 * linesCount });
}
diff --git a/binaries/data/mods/public/gui/common/global.xml b/binaries/data/mods/public/gui/common/global.xml
index 782affda5a..04fc871606 100644
--- a/binaries/data/mods/public/gui/common/global.xml
+++ b/binaries/data/mods/public/gui/common/global.xml
@@ -14,27 +14,34 @@
-
+
+
@@ -49,18 +56,9 @@
ghost="true"
hidden="true"
hotkey="realtime.toggle"
- sprite="color: 0 0 0 200"
- font="mono-stroke-10"
- textcolor="white"
- size="100%-130 80 100%-60 100"
- z="199"
>
-
- this.hidden = Engine.ConfigDB_GetValue("user", "overlay.realtime") !== "true";
- this.caption = (new Date()).toLocaleTimeString();
-
- Engine.ConfigDB_CreateValue("user", "overlay.realtime", ""+this.hidden);
+ Engine.ConfigDB_CreateValue("user", "overlay.realtime", ""+(Engine.ConfigDB_GetValue("user", "overlay.realtime") !== "true"));
diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js
index 9337a8ebe5..52d726a743 100644
--- a/binaries/data/mods/public/gui/session/session.js
+++ b/binaries/data/mods/public/gui/session/session.js
@@ -44,6 +44,9 @@ var g_Disconnected = false; // Lost connection to server
// Holds player states from the last tick
var g_CachedLastStates = "";
+// Top coordinate of the research list
+var g_ResearchListTop = 4;
+
// Colors to flash when pop limit reached
const DEFAULT_POPULATION_COLOR = "white";
const POPULATION_ALERT_COLOR = "orange";
@@ -542,8 +545,6 @@ function onSimulationUpdate()
updatePlayerDisplay();
updateSelectionDetails();
updateBuildingPlacementPreview();
- updateTimeElapsedCounter();
- updateCeasefireCounter();
updateTimeNotifications();
if (!g_IsObserver)
updateResearchDisplay();
@@ -756,7 +757,7 @@ function updateResearchDisplay()
{
var button = Engine.GetGUIObjectByName("researchStartedButton[" + i + "]");
var size = button.size;
- size.top = (4 + buttonSideLength) * i;
+ size.top = g_ResearchListTop + (4 + buttonSideLength) * i;
size.bottom = size.top + buttonSideLength;
button.size = size;
}
@@ -792,32 +793,6 @@ function updateResearchDisplay()
Engine.GetGUIObjectByName("researchStartedButton[" + i + "]").hidden = true;
}
-function updateCeasefireCounter()
-{
- var simState = GetSimState();
- var isActive = simState.ceasefireActive;
- var remainingTimeString = timeToString(simState.ceasefireTimeRemaining);
-
- var ceasefireCounter = Engine.GetGUIObjectByName("ceasefireCounter");
- var diplomacyCeasefireCounter = Engine.GetGUIObjectByName("diplomacyCeasefireCounter");
-
- ceasefireCounter.hidden = !isActive || Engine.ConfigDB_GetValue("user", "gui.session.ceasefirecounter") !== "true";
- diplomacyCeasefireCounter.hidden = !isActive;
-
- ceasefireCounter.caption = remainingTimeString;
- diplomacyCeasefireCounter.caption = sprintf(translateWithContext("ceasefire", "Time remaining until ceasefire is over: %(time)s."), {"time": remainingTimeString});
-}
-
-function updateTimeElapsedCounter()
-{
- var simState = GetSimState();
- var timeElapsedCounter = Engine.GetGUIObjectByName("timeElapsedCounter");
- if (g_CurrentSpeed != 1.0)
- timeElapsedCounter.caption = sprintf(translate("%(time)s (%(speed)sx)"), { time: timeToString(simState.timeElapsed), speed: Engine.FormatDecimalNumberIntoString(g_CurrentSpeed) });
- else
- timeElapsedCounter.caption = timeToString(simState.timeElapsed);
-}
-
// Toggles the display of status bars for all of the player's entities.
function recalculateStatusBarDisplay()
{
diff --git a/binaries/data/mods/public/gui/session/session.xml b/binaries/data/mods/public/gui/session/session.xml
index 622759b518..ad84a47307 100644
--- a/binaries/data/mods/public/gui/session/session.xml
+++ b/binaries/data/mods/public/gui/session/session.xml
@@ -152,16 +152,13 @@