From 75ec938ae3198c47a648d1ed5f5e99d329362f84 Mon Sep 17 00:00:00 2001
From: Jan Grewe <jan@faked.org>
Date: Tue, 6 Jun 2023 01:17:18 +0200
Subject: [PATCH] display last game scores and highscores

---
 data_src/index.html | 55 +++++++++++++++++++++++++++++++++++++++++++++
 data_src/main.js    | 32 ++++++++++++++++++++++++++
 src/gameoflife.cpp  |  2 +-
 3 files changed, 88 insertions(+), 1 deletion(-)

diff --git a/data_src/index.html b/data_src/index.html
index 55930d2..654eaf5 100644
--- a/data_src/index.html
+++ b/data_src/index.html
@@ -65,6 +65,61 @@
 
     </div> <!-- main -->
 
+    <div class="col-lg-4 offset-lg-4 mt-3" id="scores">
+
+      <div class="card">
+        <h5 class="card-header">
+          Last Game / Highscores
+        </h5>
+        <div class="card-body">
+
+          <div class="row mb-1">
+            <div class="col col-lg-3 text-end">Games</div>
+            <div class="col col-lg-8 pt-1">
+              <div class="progress-stacked">
+                <div class="progress" role="progressbar" style="width: 0%" id="lastGame">
+                  <div class="progress-bar progress-bar-striped progress-bar-animated bg-success"></div>
+                </div>
+                <div class="progress" role="progressbar" style="width: 100%" id="hsGames">
+                  <div class="progress-bar bg-primary"></div>
+                </div>
+              </div>
+            </div>
+          </div>
+
+          <div class="row mb-1">
+            <div class="col col-lg-3 text-end">Ticks</div>
+            <div class="col col-lg-8 pt-1">
+              <div class="progress-stacked">
+                <div class="progress" role="progressbar" style="width: 0%" id="lastTicks">
+                  <div class="progress-bar progress-bar-striped progress-bar-animated bg-success"></div>
+                </div>
+                <div class="progress" role="progressbar" style="width: 100%" id="hsTicks">
+                  <div class="progress-bar bg-primary"></div>
+                </div>
+              </div>
+            </div>
+          </div>
+
+          <div class="row">
+            <div class="col col-lg-3 text-end">Cells</div>
+            <div class="col col-lg-8 pt-1">
+              <div class="progress-stacked">
+                <div class="progress" role="progressbar" style="width: 0%" id="lastCells">
+                  <div class="progress-bar progress-bar-striped progress-bar-animated bg-success"></div>
+                </div>
+                <div class="progress" role="progressbar" style="width: 100%" id="hsCells">
+                  <div class="progress-bar bg-primary"></div>
+                </div>
+              </div>
+            </div>
+          </div>
+
+        </div>
+      </div>
+
+    </div> <!-- scores -->
+
     <div class="col-lg-4 offset-lg-4 mt-3 collapse" id="debug">
 
       <div class="card">
diff --git a/data_src/main.js b/data_src/main.js
index 58eaac2..57a89e9 100644
--- a/data_src/main.js
+++ b/data_src/main.js
@@ -10,6 +10,8 @@ var settings = {
     }
 };
 
+var highscores = {};
+
 var uiEnabled = false;
 
 $(document).ready(function() {
@@ -128,7 +130,12 @@ function startSocket() {
         addMessage("⬅️ " + JSON.stringify(data));
         if (data.settings) {
             loadSettings(data.settings);
+        } else if (data.highscores) {
+            updateHighscore(data.highscores);
+        } else if (data.stats) {
+            updateStats(data.stats);
         }
+
     });
 }
 
@@ -149,6 +156,31 @@ function loadSettings(data) {
     sendAction('getHighscores');
 }
 
+function updateHighscore(hs) {
+    highscores = hs;
+    $('#hsGames').find('.progress-bar').text(hs.games);
+    $('#hsTicks').find('.progress-bar').text(hs.ticks);
+    $('#hsCells').find('.progress-bar').text(hs.cells);
+}
+
+function updateStats(lg) {
+    var lastGameWidth = 100 / (highscores.games / lg.game);
+    var lastTicksWidth = 100 / (highscores.ticks / lg.ticks);
+    var lastCellsWidth = 100 / (highscores.cells / lg.cells);
+    var hsGamesWidth = (1 - (lg.game / highscores.games)) * 100;
+    var hsTicksWidth = (1 - (lg.ticks / highscores.ticks)) * 100;
+    var hsCellsWidth = (1 - (lg.cells / highscores.cells)) * 100;
+    $('#hsGames').css('width', hsGamesWidth+'%');
+    $('#lastGame').css('width', lastGameWidth+'%');
+    $('#lastGame').find('.progress-bar').text(lg.game);
+    $('#hsTicks').css('width', hsTicksWidth+'%');
+    $('#lastTicks').css('width', lastTicksWidth+'%');
+    $('#lastTicks').find('.progress-bar').text(lg.ticks);
+    $('#hsCells').css('width', hsCellsWidth+'%');
+    $('#lastCells').css('width', lastCellsWidth+'%');
+    $('#lastCells').find('.progress-bar').text(lg.cells);
+}
+
 function mapRange(number, inMin, inMax, outMin, outMax) {
     return Math.round((number - inMin) * (outMax - outMin) / (inMax - inMin) + outMin);
 }
diff --git a/src/gameoflife.cpp b/src/gameoflife.cpp
index f268749..b15ea13 100644
--- a/src/gameoflife.cpp
+++ b/src/gameoflife.cpp
@@ -163,10 +163,10 @@ void gameLoop()
       finalTicks = currentTick - noEvolutionTicksLimit;
       currentMillis = millis();
       showEndScreen(finalTicks);
-      sendGameStats(gameEra, finalTicks, cellsAliveNow);
       if(updateHighscores(gameEra, finalTicks, cellsAliveNow)) {
         sendHighscores();
       }
+      sendGameStats(gameEra, finalTicks, cellsAliveNow);
       gameOver = true;
     }
   }
-- 
GitLab