restore bag when loading backup file
authorLaurent Mazet <mazet@softndesign.org>
Tue, 4 Feb 2025 22:38:00 +0000 (23:38 +0100)
committerRaphaël Jakse <raphael.trivabble@jakse.fr>
Sun, 9 Feb 2025 10:24:09 +0000 (11:24 +0100)
server/trivabble-server.js

index dc036b43af56b5e6e0d4fe1582b0bc02aef484c9..b6ff155362e239ff60fafca4be768a7ace90a6d4 100644 (file)
@@ -106,6 +106,20 @@ function shuffleInPlace(a) {
         a[j] = x;
     }
 }
+function expandAndShuffleBag(bag, factor) {
+    let newBag = [];
+    while (factor >= 1) {
+        newBag = newBag.concat(bag);
+        factor--;
+    }
+    if (Math.round(bag.length * factor) > 0) {
+        let shuffleBag = bag.slice ();
+        shuffleInPlace(shuffleBag);
+        newBag = newBag.concat(shuffleBag.slice(0, Math.round(shuffleBag.length * factor)));
+    }
+    shuffleInPlace(newBag);
+    return (newBag);
+}
 
 function Game() {
     this.init();
@@ -239,17 +253,7 @@ Game.prototype.init = function (lang, label, factor) {
     this.lastUpdated = new Date();
     this.currentPlayer = "";
 
-    factor = this.factor;
-    this.bag = [];
-    while (factor > 1) {
-        this.bag = this.bag.concat(bag.slice());
-        factor--;
-    }
-    if (Math.round(bag.length * factor) > 0) {
-        shuffleInPlace(bag);
-        this.bag = this.bag.concat(bag.slice(0, Math.round(bag.length * factor)));
-    }
-    shuffleInPlace(this.bag);
+    this.bag = expandAndShuffleBag(bag, this.factor);
 };
 
 Game.prototype.toJSON = function () {
@@ -273,7 +277,7 @@ Game.fromJSON = function (obj) {
     game.factor           = obj.factor || DEFAULT_BAG_FACTOR;
     game.board            = obj.board  || newBoard(game.label);
     game.lang             = obj.lang   || DEFAULT_BOARD_LANG;
-    game.bag              = boardTilesPerLang[game.lang].bag.slice();
+    game.bag              = obj.bag    || expandAndShuffleBag(boardTilesPerLang[game.lang].bag.slice(), game.factor);
     game.letterValues     = boardTilesPerLang[game.lang].letterValues;
     game.racks            = obj.racks  || {};
     game.scores           = obj.scores || {};