/ game.js
game.js
  1  'use strict';
  2  import fs from "node:fs";
  3  import {adjacent} from "./public_html/script/src/adjacent.js";
  4  
  5  let shuffle = (array) => {
  6      for(var i = array.length; i > 0; i--) {
  7          var r = Math.floor(Math.random() * i);
  8          [array[r], array[i - 1]] = [array[i - 1], array[r]];
  9      }
 10      return array;
 11  };
 12  
 13  class Game {
 14      exists(name) {
 15          try {
 16              fs.statSync(`./games/${name}.game`);
 17              return true;
 18          } catch(e) {
 19              return false;
 20          }
 21      }
 22      new(name) {
 23          let tilesList = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5];
 24          let numbersList = [2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10, 11, 11, 12];
 25          let robber = [];
 26  
 27          let ok = false;
 28          let tiles;
 29          let n = 0;
 30          while(!ok) {
 31              ok = true;
 32              tiles = shuffle(new Array(...tilesList));
 33              let numbers = shuffle(new Array(...numbersList));
 34  
 35              for(let i = 0; i < tiles.length; i++) {
 36                  if(tiles[i] != 5) {
 37                      tiles[i] = [tiles[i], numbers[0]];
 38                      numbers.splice(0, 1);
 39                  } else {
 40                      tiles[i] = [5, 7];
 41                  }
 42              }
 43              tiles = [
 44                  [tiles[0], tiles[1], tiles[2]],
 45                  [tiles[3], tiles[4], tiles[5], tiles[6]],
 46                  [tiles[7], tiles[8], tiles[9], tiles[10], tiles[11]],
 47                  [tiles[12], tiles[13], tiles[14], tiles[15]],
 48                  [tiles[16], tiles[17], tiles[18]]
 49              ];
 50              out:
 51              for(let i = 0; i < tiles.length; i++) {
 52                  for(let j = 0; j < tiles[i].length; j++) {
 53                      if([6,8].indexOf(tiles[i][j][1]) != -1) {
 54                          let adj = adjacent(i, j, 'tile', 'tile');
 55                          for(let tile of adj) {
 56                              if([6,8].indexOf(tiles[tile[0]][tile[1]][1]) != -1) {
 57                                  ok = false;
 58                                  break out;
 59                              }
 60                          }
 61                      }
 62                  }
 63              }
 64          }
 65          out2:
 66          for(let i = 0; i < tiles.length; i++) {
 67              for(let j = 0; j < tiles[i].length; j++) {
 68                  if(tiles[i][j][0] == 5) {
 69                      robber = [i, j];
 70                      break out2;
 71                  }
 72              }
 73          }
 74          let ports = shuffle([0, 1, 2, 3, 4, 5, 5, 5, 5]);
 75          let devCards = shuffle([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4]);
 76  
 77          let data = {
 78              tiles: tiles,
 79              ports: ports,
 80              roads: [
 81                  [-1, -1, -1, -1, -1, -1],
 82                  [-1, -1, -1, -1],
 83                  [-1, -1, -1, -1, -1, -1, -1, -1],
 84                  [-1, -1, -1, -1, -1],
 85                  [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
 86                  [-1, -1, -1, -1, -1, -1],
 87                  [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1],
 88                  [-1, -1, -1, -1, -1],
 89                  [-1, -1, -1, -1, -1, -1, -1, -1],
 90                  [-1, -1, -1, -1],
 91                  [-1, -1, -1, -1, -1, -1]
 92              ],
 93              houses: [
 94                  [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]],
 95                  [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]],
 96                  [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]],
 97                  [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]],
 98                  [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]],
 99                  [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]]
100              ],
101              devCards: devCards,
102              trade: null,
103              players: {
104                  /*
105                  name: {
106                      turn: 0,
107                      hand: [
108                          [0,0,0,0,0],
109                          [[0,0,0,0,0],[0,0,0,0,0]]
110                      ],
111                      color: 'red'|'orange'|'blue'|'white',
112                      response: {
113                          robber: null,
114                          trade: null
115                      },
116                      longestRoadCount: 1,
117                      knights: 0,
118                      largestArmy: false,
119                      longestRoad: false
120                  }
121                  */
122              },
123              gameState: 0,
124              turn: -1,
125              turnCount: 0,
126              dice: [1, 1],
127              rolled: false,
128              robber: robber
129          };
130  
131          console.log(`New game created: ${name}`);
132          this.save(name, data);
133  
134          return data;
135      }
136      load(name) {
137          return JSON.parse(fs.readFileSync(`./games/${name}.game`, 'utf8'));
138      }
139      save(file, data) {
140          fs.writeFile(`./games/${file}.game`, JSON.stringify(data), (err) => {
141              if(err) {
142                  console.log(err);
143                  return;
144              }
145              console.log(`Game was saved to './games/${file}.game'`);
146          });
147      }
148  }
149  
150  export default new Game();