@pompidup/kingdomino-engine 1.1.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/adapters/driver/index.ts","../src/datasources/dominoes.json","../src/adapters/driven/inMemoryDominoes.ts","../src/hexagon/internal/services/init.ts","../src/hexagon/internal/entities/kingdom.ts","../src/hexagon/internal/services/setup.ts","../src/hexagon/internal/services/startTurn.ts","../src/hexagon/internal/services/pick.ts","../src/hexagon/internal/services/place.ts","../src/hexagon/internal/services/order.ts","../src/hexagon/internal/services/draw.ts","../src/hexagon/internal/services/scoring.ts","../src/hexagon/internal/services/pass.ts","../src/hexagon/internal/services/game.ts","../src/hexagon/internal/services/result.ts","../src/hexagon/internal/entities/mode.ts","../src/adapters/driven/uuid.ts","../src/adapters/driven/shuffle.ts","../src/index.ts"],"sourcesContent":["import { loadEnvFile } from \"node:process\";\nimport inMemoryDominoes from \"../driven/inMemoryDominoes.js\";\nimport type { Game } from \"../../hexagon/internal/entities/game.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"../../hexagon/internal/entities/kingdom.js\";\nimport gameStep, {\n type GameDependencies,\n} from \"../../hexagon/internal/services/game.js\";\nimport {\n result,\n type FinalResult,\n type ScoreResult,\n} from \"../../hexagon/internal/services/result.js\";\nimport { availableMode } from \"../../hexagon/internal/entities/mode.js\";\nimport { uuidMethod } from \"../../adapters/driven/uuid.js\";\nimport { shuffleMethod } from \"../../adapters/driven/shuffle.js\";\n\nexport type Resp = {\n nextLord: string;\n nextAction: \"pick\" | \"place\" | \"end\";\n game: Game;\n};\n\nexport type GameResult = {\n result: FinalResult[];\n game: Game;\n};\n\n/** Todo\n * Add rules step\n *\n **/\n\nconst gameEngine = () => {\n loadEnvFile();\n let dependencies: GameDependencies;\n if (\n process.env.NODE_ENV === \"development\" ||\n process.env.NODE_ENV === \"test\"\n ) {\n console.log(\"Game engine is running in development mode\");\n dependencies = {\n dominoesRepository: inMemoryDominoes(),\n uuidMethod: () => `uuid-${Math.random()}`,\n shuffleMethod: (array) => array,\n };\n } else {\n console.log(\"Game engine is running in production mode\");\n dependencies = {\n dominoesRepository: inMemoryDominoes(),\n uuidMethod,\n shuffleMethod,\n };\n }\n\n const {\n init,\n setup,\n startTurn,\n pick,\n place,\n pass,\n definePlayerOrder,\n draw,\n calculateScore,\n } = gameStep(dependencies);\n\n /**\n * WIP\n **/\n const getMode = () => {\n return availableMode;\n };\n\n const setMode = (mode: string, game: Game) => {\n return game;\n };\n\n const getRules = (mode: string) => {\n return [];\n };\n\n const setRules = (rules: string[], game: Game) => {\n return game;\n };\n\n const start = (game: Game, players: { name: string }[]): Resp => {\n const setupState = setup({\n state: game,\n players,\n });\n const drawState = draw({ state: setupState });\n\n return {\n nextLord: drawState.lords[0]!.id,\n nextAction: \"pick\",\n game: drawState,\n };\n };\n\n const passTurn = (game: Game, lordId: string): Resp => {\n const updatedGame = pass({\n lordId,\n action: \"pass\",\n data: {\n state: game,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"pass\", lordId);\n\n return resp;\n };\n\n const placeDomino = (\n game: Game,\n lordId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n ): Resp => {\n const updatedGame = place({\n lordId,\n action: \"place\",\n data: {\n state: game,\n position,\n orientation,\n rotation,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"place\", lordId);\n\n return resp;\n };\n\n const pickDomino = (game: Game, lordId: string, dominoPick: number): Resp => {\n const updatedGame = pick({\n lordId,\n action: \"pick\",\n data: {\n state: game,\n dominoPick,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"pick\", lordId);\n\n return resp;\n };\n\n const prepareNextTurn = (game: Game): Game => {\n const updatedOrder = definePlayerOrder({ state: game });\n const updateDraw = draw({ state: updatedOrder });\n const updateTurn = startTurn({ state: updateDraw });\n\n if (updateTurn.game.turn > updateTurn.game.maxTurns) {\n throw new Error(\"Game is over\");\n }\n\n return updateTurn.game;\n };\n\n const defineNextAction = (\n game: Game,\n currentAction: string,\n currentLordId: string\n ): Resp => {\n const { lords, turn } = game;\n\n if (turn === 0) {\n const nextLord = lords.find((lord) => !lord.hasPick);\n if (!nextLord) {\n const newState = prepareNextTurn(game);\n return {\n nextLord: newState.lords[0]!.id,\n nextAction: \"place\",\n game: newState,\n };\n }\n return {\n nextLord: nextLord.id,\n nextAction: \"pick\",\n game,\n };\n }\n\n if (currentAction === \"place\" || currentAction === \"pass\") {\n if (game.turn === game.maxTurns) {\n const nextLord = lords.find((lord) => !lord.hasPlace);\n if (!nextLord) {\n return {\n nextLord: \"none\",\n nextAction: \"end\",\n game,\n };\n }\n return {\n nextLord: nextLord!.id,\n nextAction: \"place\",\n game,\n };\n }\n return {\n nextLord: currentLordId,\n nextAction: \"pick\",\n game,\n };\n }\n\n const allLordsHavePicked = lords.every((lord) => lord.hasPick);\n\n if (allLordsHavePicked) {\n const newState = prepareNextTurn(game);\n return {\n nextLord: newState.order[\"1\"]!,\n nextAction: \"place\",\n game: newState,\n };\n }\n\n const nextLord = lords.find((lord) => !lord.hasPlace);\n\n return {\n nextLord: nextLord!.id,\n nextAction: \"place\",\n game,\n };\n };\n\n const endGame = (game: Game): GameResult => {\n const players = game.players;\n const scores: ScoreResult[] = [];\n\n for (let player of players) {\n const score = calculateScore(player.kingdom);\n scores.push({\n playerId: player.id!,\n playerName: player.name,\n details: score,\n });\n }\n\n const finalResult = result(scores);\n\n return {\n result: finalResult,\n game,\n };\n };\n\n return {\n init,\n getMode,\n setMode,\n getRules,\n setRules,\n start,\n pass: passTurn,\n placeDomino,\n pickDomino,\n endGame,\n };\n};\n\nexport default gameEngine;\n\n// TODO\n// Add rules step\n// Add error handling\n// Refactor game.js\n// Manage env for injection of dependencies (uuid, random, etc.)\n// Add variant available (queendomino, giant extension, dragonomino, etc.)\n","[\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 1\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 2\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 3\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 4\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 5\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 6\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 7\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 8\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 9\n },\n {\n \"left\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"number\": 10\n },\n {\n \"left\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"number\": 11\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 12\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 13\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 14\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"number\": 15\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 16\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 17\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"number\": 18\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 19\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 20\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"number\": 21\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 22\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 0\n },\n \"number\": 23\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 24\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 25\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 26\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 27\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"number\": 28\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"number\": 29\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 30\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 31\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 32\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 33\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 34\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 35\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 1\n },\n \"number\": 36\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 1\n },\n \"number\": 37\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 1\n },\n \"number\": 38\n },\n {\n \"left\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 39\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 40\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 2\n },\n \"number\": 41\n },\n {\n \"left\": {\n \"type\": \"water\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"grass\",\n \"crowns\": 2\n },\n \"number\": 42\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 43\n },\n {\n \"left\": {\n \"type\": \"grass\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 44\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 45\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 46\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 47\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 3\n },\n \"number\": 48\n }\n]","import type { Domino, Ground } from \"../../hexagon/internal/entities/domino.js\";\nimport dominoesJson from \"../../datasources/dominoes.json\" assert { type: \"json\" };\nimport type { DominoesRepository } from \"../../hexagon/ports/driven/dominoesRepository.js\";\n\nconst inMemoryDominoes = (): DominoesRepository => {\n const dominoes: Domino[] = [];\n\n dominoesJson.forEach((domino) => {\n dominoes.push({\n left: {\n type: <Ground>domino.left.type,\n crowns: domino.left.crowns,\n },\n right: {\n type: <Ground>domino.right.type,\n crowns: domino.right.crowns,\n },\n number: domino.number,\n });\n });\n\n return {\n getAll: () => {\n return dominoes;\n },\n };\n};\n\nexport default inMemoryDominoes;\n","import type { Game } from \"../entities/game.js\";\nimport type { GameDependencies } from \"./game.js\";\n\nconst init = (dependencies: GameDependencies) => (): Game => {\n const dominoes = dependencies.dominoesRepository.getAll();\n const id = dependencies.uuidMethod();\n\n const state = {\n id,\n dominoes,\n currentDominoes: [],\n players: [],\n lords: [],\n turn: 0,\n maxTurns: 0,\n maxDominoes: 0,\n dominoesPerTurn: 0,\n order: {},\n };\n\n return state;\n};\n\nexport { init };\n","import type { Domino, Tile, EmptyTile } from \"./domino.js\";\n\nexport type Position = {\n x: number; // cols\n y: number; // rows\n};\n\nexport type Orientation = \"vertical\" | \"horizontal\";\n\nexport type Rotation = 0 | 180;\n\nexport type Kingdom = (Tile | EmptyTile)[][];\n\nconst createEmptyKingdom = (): Kingdom => {\n const gridSize = 9;\n const emptyTile: EmptyTile = { type: \"empty\", crowns: 0 };\n\n return Array.from({ length: gridSize }, () =>\n Array.from({ length: gridSize }, () => emptyTile)\n );\n};\n\nconst createKingdomWithCastle = (): Kingdom => {\n const kingdom = createEmptyKingdom();\n return placeTile(kingdom, { x: 4, y: 4 }, { type: \"castle\", crowns: 0 });\n};\n\nconst placeTile = (\n kingdom: Kingdom,\n position: Position,\n tile: Tile\n): Kingdom => {\n const newRow = [...kingdom[position.y]!];\n newRow[position.x] = tile;\n return [\n ...kingdom.slice(0, position.y),\n newRow,\n ...kingdom.slice(position.y + 1),\n ];\n};\n\nconst getTile = (grid: Kingdom, position: Position): Tile | EmptyTile => {\n const tile = grid[position.y]?.[position.x];\n if (tile === undefined) {\n throw new Error(\"Invalid placement (not fit into the grid)\");\n }\n return tile;\n};\n\nconst calculateDominoPosition = (\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): [{ tile: Tile; position: Position }, { tile: Tile; position: Position }] => {\n let firstTile: {\n tile: Tile;\n position: Position;\n };\n let secondTile: {\n tile: Tile;\n position: Position;\n };\n\n if (orientation === \"horizontal\") {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n }\n } else {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n }\n }\n\n return [firstTile, secondTile];\n};\n\nconst placeDomino = (\n kingdom: Kingdom,\n position: Position,\n orientation: \"vertical\" | \"horizontal\",\n rotation: 0 | 180,\n domino: Domino\n): Kingdom => {\n const [firstTile, secondTile] = calculateDominoPosition(\n position,\n orientation,\n rotation,\n domino\n );\n\n if (!isFreePlace(kingdom, firstTile.position, secondTile.position)) {\n throw new Error(\"Invalid placement (not free place)\");\n }\n\n if (!isFitIntoTheGrid(kingdom, [firstTile, secondTile])) {\n throw new Error(\"Invalid placement (not fit into the grid)\");\n }\n\n const adjacentTiles = isAdjacent(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n\n if (adjacentTiles.length === 0) {\n throw new Error(\"Invalid placement (no adjacent)\");\n }\n\n const hasValidAdjacentTiles = hasValidAdjacent(adjacentTiles, [\n firstTile.tile,\n secondTile.tile,\n ]);\n\n if (!hasValidAdjacentTiles) {\n throw new Error(\"Invalid placement (no valid adjacent)\");\n }\n\n return placeTiles(kingdom, [firstTile, secondTile]);\n};\n\nconst placeTiles = (\n kingdom: Kingdom,\n tiles: { tile: Tile; position: Position }[]\n): Kingdom => {\n return tiles.reduce(\n (newKingdom, { tile, position }) => placeTile(newKingdom, position, tile),\n kingdom\n );\n};\n\nconst isFreePlace = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): boolean => {\n const firstTile = getTile(kingdom, firstPosition);\n const secondTile = getTile(kingdom, secondPosition);\n\n if (firstTile.type !== \"empty\" || secondTile.type !== \"empty\") {\n return false;\n }\n\n return true;\n};\n\nconst isAdjacent = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): (Tile | EmptyTile)[] => {\n const xFirstPosition = firstPosition.x;\n const yFirstPosition = firstPosition.y;\n const xSecondPosition = secondPosition.x;\n const ySecondPosition = secondPosition.y;\n\n const adjacentTiles: (Tile | EmptyTile)[] = [];\n const adjacentTilesKeys = [\n { x: xFirstPosition - 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition - 1 },\n { x: xFirstPosition + 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition + 1 },\n { x: xSecondPosition - 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition - 1 },\n { x: xSecondPosition + 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition + 1 },\n ];\n\n // Remove firstPosition and secondPosition from adjacentTilesKeys\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xFirstPosition && pos.y === yFirstPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xSecondPosition && pos.y === ySecondPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.forEach((key) => {\n const tile = getTile(kingdom, key);\n if (tile) {\n adjacentTiles.push(tile);\n }\n });\n\n return adjacentTiles;\n};\n\nconst hasValidAdjacent = (\n adjacentTiles: (Tile | EmptyTile)[],\n tiles: Tile[]\n): boolean => {\n return adjacentTiles.some((adjacentTile) => {\n return tiles.some((tile) => {\n return tile.type === adjacentTile.type || adjacentTile.type === \"castle\";\n });\n });\n};\n\nconst isFitIntoTheGrid = (\n grid: Kingdom,\n positions: {\n tile: Tile;\n position: Position;\n }[]\n): boolean => {\n const maxSize = 5;\n\n const simulateNewGrid = [...grid];\n\n simulateNewGrid[positions[0]!.position.y]![positions[0]!.position.x] =\n positions[0]!.tile;\n simulateNewGrid[positions[1]!.position.y]![positions[1]!.position.x] =\n positions[1]!.tile;\n\n const lines = simulateNewGrid.map((line) =>\n line.filter((tile) => tile.type !== \"empty\")\n );\n const columns = simulateNewGrid[0]!.map((_, index) =>\n simulateNewGrid\n .map((line) => line[index])\n .filter((tile) => tile?.type !== \"empty\")\n );\n\n const linesLength = lines.map((line) => line.length);\n const columnsLength = columns.map((line) => line.length);\n\n const maxLineLength = Math.max(...linesLength);\n const maxColumnLength = Math.max(...columnsLength);\n\n if (maxLineLength > maxSize || maxColumnLength > maxSize) {\n return false;\n }\n\n return true;\n};\n\nconst kingdom = {\n createEmptyKingdom,\n createKingdomWithCastle,\n getTile,\n placeDomino,\n};\n\nexport default kingdom;\n","import type { Game } from \"../entities/game.js\";\nimport type { Lord } from \"../entities/lord.js\";\nimport type { Player } from \"../entities/player.js\";\nimport kingdom from \"../entities/kingdom.js\";\nimport { type GameDependencies, rules } from \"./game.js\";\n\ntype SetupPayload = {\n state: Game;\n players: { name: string }[];\n};\n\nconst setup =\n (dependencies: GameDependencies) =>\n (payload: SetupPayload): Game => {\n const { state, players } = payload;\n\n if (!players) {\n throw new Error(\"There must be at least 2 players\");\n }\n\n if (players.length > 4) {\n throw new Error(\"There must be no more than 4 players\");\n }\n\n if (players.length < 2) {\n throw new Error(\"There must be at least 2 players\");\n }\n\n const { dominoes } = state;\n const { shuffleMethod, uuidMethod } = dependencies;\n const { maxDominoes, dominoesPerTurn, maxTurns } = rules[players.length]!;\n const shuffledDominoes = shuffleMethod(dominoes);\n shuffledDominoes.splice(maxDominoes);\n\n const newPlayers: Player[] = players.map((player) => {\n return {\n ...player,\n kingdom: kingdom.createKingdomWithCastle(),\n id: uuidMethod(),\n };\n });\n\n let newLords: Lord[];\n if (newPlayers.length === 2) {\n newLords = [\n {\n id: uuidMethod(),\n playerId: newPlayers[0]!.id!,\n order: 1,\n turnEnded: false,\n hasPick: false,\n hasPlace: false,\n },\n {\n id: uuidMethod(),\n playerId: newPlayers[0]!.id!,\n order: 2,\n turnEnded: false,\n hasPick: false,\n hasPlace: false,\n },\n {\n id: uuidMethod(),\n playerId: newPlayers[1]!.id!,\n order: 3,\n turnEnded: false,\n hasPick: false,\n hasPlace: false,\n },\n {\n id: uuidMethod(),\n playerId: newPlayers[1]!.id!,\n order: 4,\n turnEnded: false,\n hasPick: false,\n hasPlace: false,\n },\n ];\n } else {\n newLords = newPlayers.map((player, index) => {\n return {\n id: uuidMethod(),\n playerId: player.id!,\n order: index + 1,\n turnEnded: false,\n hasPick: false,\n hasPlace: false,\n };\n });\n }\n\n const lordsWithOrder = shuffleMethod(newLords);\n\n lordsWithOrder.forEach((lord, index) => {\n lord.order = index + 1;\n });\n\n lordsWithOrder.sort((a, b) => a.order - b.order);\n\n const newState = {\n ...state,\n dominoes: shuffledDominoes,\n players: newPlayers,\n lords: lordsWithOrder,\n maxTurns,\n maxDominoes,\n dominoesPerTurn,\n turn: 0,\n };\n\n return newState;\n };\n\nexport { setup };\n","import type { Game } from \"../entities/game.js\";\n\ntype StartTurnPayload = {\n state: Game;\n};\n\nconst startTurn = (payload: StartTurnPayload): { game: Game } => {\n const { state } = payload;\n\n const turn = state.turn + 1;\n const lords = state.lords;\n\n lords.forEach((lord) => {\n lord.turnEnded = false;\n lord.hasPick = false;\n lord.hasPlace = false;\n });\n\n const updatedState = {\n ...state,\n lords,\n turn,\n };\n\n return { game: updatedState };\n};\n\nexport { startTurn };\n","import type { Game } from \"../entities/game.js\";\nimport type { RevealsDomino } from \"../entities/domino.js\";\nimport {\n type PlayerActionPayload,\n type CustomError,\n checkValidityDomino,\n isLordTurn,\n} from \"./game.js\";\n\nconst pick = (payload: PlayerActionPayload<\"pick\">): Game => {\n const { lordId, data } = payload;\n const { state, dominoPick } = data;\n const { currentDominoes, lords } = state;\n\n // Check if it is the lord's turn\n if (!isLordTurn(state, lordId)) {\n throw new Error(\"It is not your turn\");\n }\n\n // Check if lord has already picked\n const lord = lords.find((lord) => lord.id === lordId);\n if (lord?.hasPick) {\n throw new Error(\"You have already picked\");\n }\n\n // Check if dominoPick is valid choice\n const domino = checkValidityDomino(state, dominoPick);\n\n // typeguard to check if domino is a CustomError\n const isError = (\n domino: CustomError | RevealsDomino\n ): domino is CustomError => {\n return (domino as CustomError).error !== undefined;\n };\n\n if (isError(domino)) {\n throw new Error(domino.error);\n }\n\n // update currentDominoes\n const updatedCurrentDominoes = currentDominoes.map((domino) => {\n if (domino.domino.number === dominoPick) {\n domino.picked = true;\n domino.lordId = lordId;\n }\n\n return domino;\n });\n\n // update lords\n const updatedLords = lords.map((lord) => {\n if (lord.id === lordId) {\n lord.hasPick = true;\n lord.turnEnded = true;\n lord.dominoPicked = domino.domino;\n }\n\n return lord;\n });\n\n // update state\n const updatedState = {\n ...state,\n currentDominoes: updatedCurrentDominoes,\n lords: updatedLords,\n };\n\n return updatedState;\n};\n\nexport { pick };\n","import type { Game } from \"../entities/game.js\";\nimport kingdom from \"../entities/kingdom.js\";\nimport type { PlayerActionPayload } from \"./game.js\";\n\nconst place = (payload: PlayerActionPayload<\"place\">): Game => {\n const { lordId, data } = payload;\n const { state, position, orientation, rotation } = data;\n\n const currentLord = state.lords.find((lord) => lord.id === lordId);\n const currentPlayer = state.players.find(\n (player) => player.id === currentLord?.playerId\n );\n const currentKingdom = currentPlayer?.kingdom;\n\n if (!currentKingdom) {\n throw new Error(\"Kingdom not found\");\n }\n\n const domino = currentLord?.dominoPicked;\n\n if (!domino) {\n throw new Error(\"Domino not found\");\n }\n\n kingdom.placeDomino(currentKingdom, position, orientation, rotation, domino);\n\n currentPlayer.kingdom = currentKingdom;\n currentLord.hasPlace = true;\n\n const newState = {\n ...state,\n lords: state.lords.map((lord) => {\n if (lord.id === lordId) {\n return currentLord;\n }\n\n return lord;\n }),\n };\n\n return newState;\n};\n\nexport { place };\n","import type { Game } from \"../entities/game.js\";\n\ntype DefinePlayerOrderPayload = {\n state: Game;\n};\n\nconst definePlayerOrder = (payload: DefinePlayerOrderPayload): Game => {\n const { state } = payload;\n const { lords, currentDominoes } = state;\n\n const allLordsHavePlayed = lords.every((lord) => lord.turnEnded);\n\n if (!allLordsHavePlayed) {\n throw new Error(\"Not all lords have played\");\n }\n\n const updatedLords = lords.map((lord) => {\n return {\n ...lord,\n order:\n currentDominoes.find((domino) => domino.lordId === lord.id)?.position ||\n 0,\n };\n });\n\n const order = updatedLords.reduce((acc, lord) => {\n return {\n ...acc,\n [lord.order!]: lord.id,\n };\n }, {});\n\n const newState = {\n ...state,\n lords: updatedLords,\n order,\n };\n\n return newState;\n};\n\nexport { definePlayerOrder };\n","import type { Game } from \"../entities/game.js\";\n\ntype DrawPayload = {\n state: Game;\n};\n\nconst draw = (payload: DrawPayload): Game => {\n const { state } = payload;\n\n const dominoesCopy = [...state.dominoes];\n const dominoesDrawn = dominoesCopy.splice(0, state.dominoesPerTurn);\n dominoesDrawn.sort((a, b) => a.number - b.number);\n\n const newState = {\n ...state,\n dominoes: dominoesCopy,\n currentDominoes: dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n }),\n };\n\n return newState;\n};\n\nexport { draw };\n","import type { Kingdom } from \"../entities/kingdom.js\";\n\ntype Property = {\n type: string;\n crowns: number;\n size: number;\n tiles: number[][];\n};\n\nexport type Score = {\n score: number;\n maxPropertiesSize: number;\n totalCrowns: number;\n};\n\nconst calculateScore = (kingdom: Kingdom): Score => {\n const visited: boolean[][] = kingdom.map((row) => row.map(() => false));\n const properties: Property[] = [];\n\n const directions = [\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n ]; // Up, Down, Left, Right\n\n const markZone = (\n x: number,\n y: number,\n type: string,\n crowns: number\n ): void => {\n if (\n x < 0 ||\n y < 0 ||\n x >= kingdom[0]!.length ||\n y >= kingdom.length ||\n visited[y]![x] ||\n kingdom[y]![x]!.type !== type ||\n kingdom[y]![x]!.type === \"empty\" ||\n kingdom[y]![x]!.type === \"castle\"\n ) {\n return;\n }\n\n visited[y]![x] = true;\n const currentZone = properties.find(\n (property) =>\n property.type === type &&\n property.tiles.some(([tx, ty]) => {\n for (let [dx, dy] of directions) {\n if (\n (tx as number) + (dx as number) === x &&\n (ty as number) + (dy as number) === y\n ) {\n return true;\n }\n }\n return false;\n })\n );\n\n if (currentZone) {\n currentZone.crowns += crowns;\n currentZone.size++;\n currentZone.tiles.push([x, y]);\n } else {\n properties.push({ type, crowns, size: 1, tiles: [[x, y]] });\n }\n\n directions.forEach(([dx, dy]) => {\n const nx = x + (dx as number);\n const ny = y + (dy as number);\n if (\n nx >= 0 &&\n ny >= 0 &&\n nx < kingdom[0]!.length &&\n ny < kingdom.length &&\n kingdom[ny]![nx]!.type === type\n ) {\n markZone(nx, ny, kingdom[ny]![nx]!.type, kingdom[ny]![nx]!.crowns);\n }\n });\n };\n\n kingdom.forEach((row, y) => {\n row.forEach((tile, x) => {\n if (!visited[y]![x]) {\n markZone(x, y, tile.type, tile.crowns);\n }\n });\n });\n\n if (properties.length === 0) {\n return {\n score: 0,\n maxPropertiesSize: 0,\n totalCrowns: 0,\n };\n }\n\n const score = properties.reduce(\n (score, property) => score + property.crowns * property.size,\n 0\n );\n const maxPropertiesSize = Math.max(\n ...properties.map((property) => property.size ?? 0)\n );\n\n const totalCrowns = properties.reduce(\n (total, property) => total + property.crowns,\n 0\n );\n\n return {\n score,\n maxPropertiesSize,\n totalCrowns,\n };\n};\n\nexport { calculateScore };\n","import type { Game } from \"../entities/game.js\";\nimport type { PlayerActionPayload } from \"./game.js\";\n\nconst pass = (payload: PlayerActionPayload<\"pass\">): Game => {\n const { lordId, data } = payload;\n const { state } = data;\n\n const currentLord = state.lords.find((lord) => lord.id === lordId);\n\n if (!currentLord) {\n throw new Error(\"Lord not found\");\n }\n\n currentLord.hasPlace = true;\n\n const newState = {\n ...state,\n lords: state.lords.map((lord) => {\n if (lord.id === lordId) {\n return currentLord;\n }\n\n return lord;\n }),\n };\n\n return newState;\n};\n\nexport { pass };\n","import type { DominoesRepository } from \"../../ports/driven/dominoesRepository.js\";\nimport type { Position } from \"../entities/kingdom.js\";\nimport type { Game } from \"../entities/game.js\";\nimport { init } from \"./init.js\";\nimport { setup } from \"./setup.js\";\nimport { startTurn } from \"./startTurn.js\";\nimport { pick } from \"./pick.js\";\nimport { place } from \"./place.js\";\nimport { definePlayerOrder } from \"./order.js\";\nimport { draw } from \"./draw.js\";\nimport { calculateScore } from \"./scoring.js\";\nimport { pass } from \"./pass.js\";\nimport type { UuidMethod } from \"../../ports/driven/uuidMethod.js\";\nimport type { ShuffleMethod } from \"../../ports/driven/shuffleMethod.js\";\n\nexport type GameDependencies = {\n dominoesRepository: DominoesRepository;\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n};\n\nexport const playerAction = {\n pick: \"pick\",\n place: \"place\",\n pass: \"pass\",\n} as const;\n\ntype ObjectValues<T> = T[keyof T];\n\nexport type PlayerAction = ObjectValues<typeof playerAction>;\n\ntype PickData = {\n state: Game;\n dominoPick: number;\n};\n\ntype PlaceData = {\n state: Game;\n position: Position;\n orientation: \"vertical\" | \"horizontal\";\n rotation: 0 | 180;\n};\n\ntype PassData = {\n state: Game;\n};\n\ntype ActionToDataMap = {\n pick: PickData;\n place: PlaceData;\n pass: PassData;\n};\n\nexport type PlayerActionPayload<T extends PlayerAction> = {\n lordId: string;\n action: T;\n data: ActionToDataMap[T];\n};\n\nconst gameStep = (dependencies: GameDependencies) => {\n return {\n init: init(dependencies),\n setup: setup(dependencies),\n startTurn,\n pick,\n place,\n pass,\n definePlayerOrder,\n draw,\n calculateScore,\n };\n};\n\nexport const isLordTurn = (state: Game, lordId: string): boolean => {\n const { lords, currentDominoes } = state;\n const currentLordOrder = lords.find((lord) => lord.id === lordId)?.order;\n\n const pickedDominoes = currentDominoes.filter(\n (currentDomino) => currentDomino.picked\n );\n\n if (currentLordOrder !== pickedDominoes.length + 1) {\n return false;\n }\n\n return true;\n};\n\nexport type CustomError = {\n error: string;\n};\n\nexport const checkValidityDomino = (state: Game, dominoPick: number) => {\n const { currentDominoes } = state;\n const domino = currentDominoes.find(\n (currentDomino) => currentDomino.domino.number === dominoPick\n );\n\n if (!domino) {\n const error: CustomError = {\n error: \"Domino not found\",\n };\n\n return error;\n }\n\n if (domino.picked) {\n const error: CustomError = {\n error: \"Domino already picked\",\n };\n return error;\n }\n\n return domino;\n};\n\n// 2 players => 24 dominoes, 2 lords, 4 dominoes per turn, 6 turns\n// 3 players => 36 dominoes, 1 lord, 3 dominoes per turn, 12 turns\n// 4 players => 48 dominoes, 1 lord, 4 dominoes per turn, 12 turns\nexport const rules: {\n [key: number]: {\n lords: number;\n maxDominoes: number;\n dominoesPerTurn: number;\n maxTurns: number;\n };\n} = {\n 2: {\n lords: 2,\n maxDominoes: 24,\n dominoesPerTurn: 4,\n maxTurns: 6,\n },\n 3: {\n lords: 1,\n maxDominoes: 36,\n dominoesPerTurn: 3,\n maxTurns: 12,\n },\n 4: {\n lords: 1,\n maxDominoes: 48,\n dominoesPerTurn: 4,\n maxTurns: 12,\n },\n};\n\nexport default gameStep;\n","import type { Score } from \"./scoring.js\";\n\nexport type ScoreResult = {\n playerId: string;\n playerName: string;\n details: Score;\n};\n\nexport type FinalResult = ScoreResult & {\n position: number;\n};\n\nconst result = (scores: ScoreResult[]): FinalResult[] => {\n // 1 order players by score, then by maxPropertiesSize, then by totalCrowns all descending\n scores.sort((a, b) => {\n if (a.details.score !== b.details.score) {\n return b.details.score - a.details.score;\n }\n if (a.details.maxPropertiesSize !== b.details.maxPropertiesSize) {\n return b.details.maxPropertiesSize - a.details.maxPropertiesSize;\n }\n return b.details.totalCrowns - a.details.totalCrowns;\n });\n\n const result: FinalResult[] = [];\n let isTie = false;\n result.push({\n ...scores[0]!,\n position: 1,\n });\n\n for (let i = 1; i < scores.length; i++) {\n const currentScore = scores[i];\n const previousScore = scores[i - 1];\n if (\n previousScore &&\n currentScore &&\n currentScore.details.score === previousScore.details.score &&\n currentScore.details.maxPropertiesSize ===\n previousScore.details.maxPropertiesSize &&\n currentScore.details.totalCrowns === previousScore.details.totalCrowns\n ) {\n isTie = true;\n }\n\n if (isTie) {\n result.push({\n ...currentScore!,\n position: result[i - 1]!.position,\n });\n } else {\n result.push({\n ...currentScore!,\n position: i + 1,\n });\n }\n\n isTie = false;\n }\n\n return result;\n};\n\nexport { result };\n","export const availableMode = [\"Classic\"] as const;\n\nexport type AvailableMode = (typeof availableMode)[number];\n\nexport const isValidMode = (mode: string): mode is AvailableMode => {\n return availableMode.includes(mode as AvailableMode);\n};\n","import type { UuidMethod } from \"../../hexagon/ports/driven/uuidMethod.js\";\nimport { randomUUID } from \"crypto\";\n\nexport const uuidMethod: UuidMethod = () => {\n return randomUUID();\n};\n","import type { ShuffleMethod } from \"../../hexagon/ports/driven/shuffleMethod\";\n\nexport const shuffleMethod: ShuffleMethod = <T>(array: T[]) => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j] as T, array[i] as T];\n }\n return array;\n};\n","import gameEngine from \"./adapters/driver/index.js\";\n\nexport default gameEngine;\n"],"mappings":"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","names":["kingdom","shuffleMethod","uuidMethod","lord","domino","kingdom","score","result","init","setup","startTurn","pick","place","pass","definePlayerOrder","draw","calculateScore","rules","placeDomino","nextLord"]}
1
+ {"version":3,"sources":["../src/datasources/dominoes.json","../src/adapterServerside/jsonDominoes.ts","../src/datasources/modes.json","../src/adapterServerside/jsonModes.ts","../src/datasources/rules.json","../src/adapterServerside/jsonRules.ts","../src/utils/result.ts","../src/application/handlers/addExtraRulesHandler.ts","../src/application/handlers/addPlayersHandler.ts","../src/application/handlers/chooseDominoHandler.ts","../src/application/handlers/createGameHandler.ts","../src/core/domain/types/game.ts","../src/application/handlers/discardDominoHandler.ts","../src/application/handlers/getExtraRulesHandler.ts","../src/application/handlers/getModesHandler.ts","../src/application/handlers/getResultHandler.ts","../src/application/handlers/placeDominoHandler.ts","../src/application/handlers/startGameHandler.ts","../src/core/domain/types/kingdom.ts","../src/core/domain/types/domino.ts","../src/core/domain/types/player.ts","../src/core/domain/entities/rule.ts","../src/core/useCases/addExtraRules.ts","../src/core/domain/entities/player.ts","../src/core/domain/entities/domino.ts","../src/core/domain/entities/kingdom.ts","../src/core/useCases/addPlayers.ts","../src/core/domain/entities/lord.ts","../src/core/useCases/chooseDomino.ts","../src/core/domain/entities/game.ts","../src/core/domain/entities/mode.ts","../src/core/useCases/createGame.ts","../src/core/useCases/discardDomino.ts","../src/core/useCases/getExtraRules.ts","../src/core/useCases/getModes.ts","../src/core/useCases/getResult.ts","../src/core/useCases/placeDomino.ts","../src/core/useCases/startGame.ts","../src/adapterServerside/shuffle.ts","../src/adapterServerside/uuid.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["{\n \"Classic\": [\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 1\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 2\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 3\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 4\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 5\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 6\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 7\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 8\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 9\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 10\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 11\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 12\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 13\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 14\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 15\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 16\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 17\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 18\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 19\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 20\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 21\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 22\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 0\n },\n \"number\": 23\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 24\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 25\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 26\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 27\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 28\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 29\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 30\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 31\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 32\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 33\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 34\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 35\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 36\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 37\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 1\n },\n \"number\": 38\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 39\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 40\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 41\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 42\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 43\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 44\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 45\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 46\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 47\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 3\n },\n \"number\": 48\n }\n ]\n}\n","import type { Domino, Ground } from \"../core/domain/types/domino.js\";\nimport dominoesJson from \"../datasources/dominoes.json\" assert { type: \"json\" };\nimport type { DominoesRepository } from \"../core/portServerside/dominoesRepository.js\";\nimport type { GameMode } from \"../core/domain/types/mode.js\";\n\nconst jsonDominoes = (): DominoesRepository => {\n const dominoes: Record<string, Domino[]> = {};\n\n for (const [key, value] of Object.entries(dominoesJson)) {\n const currentDominoes: Domino[] = [];\n value.forEach((domino) => {\n currentDominoes.push({\n left: {\n type: <Ground>domino.left.type,\n crowns: domino.left.crowns,\n },\n right: {\n type: <Ground>domino.right.type,\n crowns: domino.right.crowns,\n },\n number: domino.number,\n });\n });\n\n dominoes[key] = currentDominoes;\n }\n\n return {\n getForMode: (mode: GameMode) => {\n return dominoes[mode.name] || [];\n },\n };\n};\n\nexport default jsonDominoes;\n","[\n {\n \"name\": \"Classic\",\n \"description\": \"Original KingDomino rules\"\n }\n]","import type { ModeRepository } from \"../core/portServerside/modeRepository.js\";\nimport modesJson from \"../datasources/modes.json\" assert { type: \"json\" };\nimport type { GameMode } from \"../core/domain/types/mode.js\";\n\nconst jsonModes = (): ModeRepository => {\n const modes: GameMode[] = [];\n\n modesJson.forEach((mode) => {\n modes.push({\n name: mode.name,\n description: mode.description,\n });\n });\n\n return {\n getAvailables: () => {\n return modes;\n },\n };\n};\n\nexport default jsonModes;\n","{\n \"commun\": [\n {\n \"playersLimit\": 2,\n \"lordsPerPlayer\": 2,\n \"maxDominoes\": 24,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 6\n },\n {\n \"playersLimit\": 3,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 36,\n \"dominoesPerTurn\": 3,\n \"maxTurns\": 12\n },\n {\n \"playersLimit\": 4,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 48,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 12\n }\n ],\n \"extra\": [\n {\n \"name\": \"The middle Kingdom\",\n \"description\": \"Gain 10 additional points if your castle is in the middle of the kingdom.\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n },\n {\n \"name\": \"Harmony\",\n \"description\": \"Gain 5 additional points if your kingdom is complete (no discarded dominoes).\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n }\n ]\n}\n","import type { Rules } from \"../core/domain/types/rule.js\";\nimport rulesJson from \"../datasources/rules.json\" assert { type: \"json\" };\nimport type { RuleRepository } from \"../core/portServerside/ruleRepository.js\";\n\nconst jsonRules = (): RuleRepository => {\n const rules: Rules = {\n basic: {},\n extraRules: [],\n };\n\n const commonRules = rulesJson.commun;\n const extraRules = rulesJson.extra;\n\n commonRules.forEach((rule) => {\n rules.basic[rule.playersLimit] = {\n lords: rule.lordsPerPlayer,\n maxDominoes: rule.maxDominoes,\n dominoesPerTurn: rule.dominoesPerTurn,\n maxTurns: rule.maxTurns,\n };\n });\n\n extraRules.forEach((rule) => {\n rules.extraRules.push({\n name: rule.name,\n description: rule.description,\n mode: rule.mode,\n });\n });\n\n return {\n getAll: () => {\n return rules;\n },\n getAllExtra: () => {\n return rules.extraRules;\n },\n };\n};\n\nexport default jsonRules;\n","export type Result<T> = Ok<T> | Err;\n\nexport interface Ok<T> {\n readonly tag: \"Ok\";\n readonly value: T;\n}\n\nexport interface Err {\n readonly tag: \"Err\";\n readonly error: string;\n}\n\nexport const ok = <T>(value: T): Ok<T> => ({ tag: \"Ok\", value });\nexport const err = (error: string): Err => ({ tag: \"Err\", error });\n\nexport const isOk = <T>(result: Result<T>): result is Ok<T> =>\n result.tag === \"Ok\";\nexport const isErr = <T>(result: Result<T>): result is Err =>\n result.tag === \"Err\";\n","import { isErr } from \"../../utils/result.js\";\nimport type { Game, NextStep } from \"../../core/domain/types/game.js\";\nimport type { AddExtraRulesCommand } from \"../commands/addExtraRulesCommand.js\";\nimport type { AddExtraRulesUseCase } from \"../../core/useCases/addExtraRules.js\";\n\ntype AddExtraRulesHandler = (\n command: AddExtraRulesCommand\n) => Game & { nextAction: NextStep };\n\nexport const addExtraRulesHandler =\n (useCase: AddExtraRulesUseCase): AddExtraRulesHandler =>\n (command: AddExtraRulesCommand) => {\n const { game, extraRules } = command;\n\n if (game.nextAction.step !== \"options\") {\n throw new Error(\"Invalid next action\");\n }\n\n const result = useCase(game, extraRules);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n return result.value;\n };\n","import type { AddPlayersCommand } from \"../commands/addPlayersCommand.js\";\nimport type { Game, NextStep } from \"../../core/domain/types/game.js\";\nimport { isErr } from \"../../utils/result.js\";\nimport type { AddPlayersUseCase } from \"../../core/useCases/addPlayers.js\";\n\ntype AddPlayersHandler = (\n command: AddPlayersCommand\n) => Game & { nextAction: NextStep };\n\nexport const addPlayersHandler =\n (useCase: AddPlayersUseCase): AddPlayersHandler =>\n (command: AddPlayersCommand) => {\n const { game, players } = command;\n\n if (game.nextAction.step !== \"addPlayers\") {\n throw new Error(\"Invalid next action\");\n }\n\n const result = useCase(game, players);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n return result.value;\n };\n","import type { ChooseDominoCommand } from \"../commands/chooseDominoCommand.js\";\nimport type { GameWithNextAction } from \"../../core/domain/types/game.js\";\nimport type { ChooseDominoUseCase } from \"../../core/useCases/chooseDomino.js\";\nimport { isErr } from \"../../utils/result.js\";\n\ntype ChooseDominoHandler = (command: ChooseDominoCommand) => GameWithNextAction;\n\nexport const chooseDominoHandler =\n (useCase: ChooseDominoUseCase): ChooseDominoHandler =>\n (command: ChooseDominoCommand) => {\n const { game, lordId, dominoPick } = command;\n\n if (game.nextAction.nextAction !== \"pickDomino\") {\n throw new Error(\"Invalid next action\");\n }\n\n const result = useCase(game, lordId, dominoPick);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n return result.value;\n };\n","import { isErr } from \"./../../utils/result\";\nimport type { Game, NextStep } from \"../../core/domain/types/game.js\";\nimport type { CreateGameCommand } from \"../commands/createGameCommand.js\";\nimport type { CreateGameUseCase } from \"../../core/useCases/createGame.js\";\n\ntype CreateGameHandler = (\n command: CreateGameCommand\n) => Game & { nextAction: NextStep };\n\nexport const createGameHandler =\n (useCase: CreateGameUseCase): CreateGameHandler =>\n (command: CreateGameCommand) => {\n const result = useCase(command.mode);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n return result.value;\n };\n","import type { Result } from \"./../../../utils/result\";\nimport type { Domino, RevealsDomino } from \"./domino.js\";\nimport type { Lord } from \"./lord.js\";\nimport type { GameMode } from \"./mode.js\";\nimport type { Player, PlayerActions } from \"./player.js\";\nimport type { SelectedRules } from \"./rule.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n lords: Lord[];\n turn: number;\n nextAction: NextAction | NextStep;\n rules: SelectedRules;\n mode: GameMode;\n};\n\nexport const gameSteps = {\n addPlayers: \"addPlayers\",\n options: \"options\",\n start: \"start\",\n result: \"result\",\n} as const;\n\nexport type GameSteps = ObjectValues<typeof gameSteps>;\n\nexport type NextAction = {\n type: \"action\";\n nextLord: string;\n nextAction: PlayerActions;\n};\n\nexport type NextStep = {\n type: \"step\";\n step: GameSteps;\n};\n\nexport type GameWithNextAction = Game & { nextAction: NextAction };\nexport type GameWithNextStep = Game & { nextAction: NextStep };\nexport type GameResult = Result<GameWithNextAction | GameWithNextStep>;\n\nexport const isGameWithNextAction = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextAction => {\n return game.nextAction.type === \"action\";\n};\n\nexport type Score = {\n points: number;\n maxPropertiesSize: number;\n totalCrowns: number;\n};\n\nexport type ScoreResult = {\n playerId: string;\n playerName: string;\n details: Score;\n};\n\nexport type FinalResult = ScoreResult & {\n position: number;\n};\n\nexport type GameWithResults = Game & { result: FinalResult[] };\n","import type { DiscardDominoCommand } from \"../commands/discardDominoCommand.js\";\nimport type { DiscardDominoUseCase } from \"../../core/useCases/discardDomino.js\";\nimport { isErr } from \"../../utils/result.js\";\nimport {\n isGameWithNextAction,\n type GameWithNextAction,\n type GameWithNextStep,\n} from \"../../core/domain/types/game.js\";\n\ntype DiscardDominoHandler = (\n command: DiscardDominoCommand\n) => GameWithNextAction | GameWithNextStep;\n\nexport const discardDominoHandler =\n (useCase: DiscardDominoUseCase): DiscardDominoHandler =>\n (command: DiscardDominoCommand) => {\n const { game, lordId } = command;\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n throw new Error(\"Invalid next action\");\n }\n\n const result = useCase(game, lordId);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n return result.value;\n }\n\n return result.value;\n };\n","import type { GetExtraRulesCommand } from \"../commands/getExtraRulesCommand.js\";\nimport { isErr } from \"../../utils/result.js\";\nimport type { ExtraRule } from \"../../core/domain/types/rule.js\";\nimport type { GetExtraRulesUseCase } from \"../../core/useCases/getExtraRules.js\";\n\ntype GetExtraRulesHandler = (command: GetExtraRulesCommand) => ExtraRule[];\n\nexport const getExtraRulesHandler =\n (getExtraRulesUseCase: GetExtraRulesUseCase): GetExtraRulesHandler =>\n (command: GetExtraRulesCommand) => {\n const { mode, players } = command;\n const result = getExtraRulesUseCase(mode, players);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n return result.value;\n };\n","import type { GetModesCommand } from \"../commands/getModesCommand.js\";\nimport type { GameMode } from \"../../core/domain/types/mode.js\";\nimport type { GetModesUseCase } from \"../../core/useCases/getModes.js\";\nimport { isErr } from \"../../utils/result.js\";\n\ntype GetModesHandler = (command: GetModesCommand) => GameMode[];\n\nexport const getModesHandler =\n (getModeUseCase: GetModesUseCase): GetModesHandler =>\n (_command: GetModesCommand) => {\n const result = getModeUseCase();\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n return result.value;\n };\n","import type { GetResultCommand } from \"../commands/getResultCommand.js\";\nimport type { GameWithResults } from \"../../core/domain/types/game.js\";\nimport { isErr } from \"../../utils/result.js\";\nimport type { GetResultUseCase } from \"../../core/useCases/getResult.js\";\n\ntype GetResultHandler = (command: GetResultCommand) => GameWithResults;\n\nexport const getResultHandler =\n (useCase: GetResultUseCase): GetResultHandler =>\n (command: GetResultCommand) => {\n const { game } = command;\n\n if (game.nextAction.step !== \"result\") {\n throw new Error(\"Invalid next step\");\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n return result.value;\n };\n","import type { PlaceDominoCommand } from \"../commands/placeDominoCommand.js\";\nimport {\n isGameWithNextAction,\n type Game,\n type GameWithNextAction,\n type GameWithNextStep,\n} from \"../../core/domain/types/game.js\";\nimport { isErr } from \"../../utils/result.js\";\nimport type { PlaceDominoUseCase } from \"../../core/useCases/placeDomino.js\";\n\ntype PlaceDominoHandler = (\n command: PlaceDominoCommand\n) => GameWithNextAction | GameWithNextStep;\n\nexport const placeDominoHandler =\n (useCase: PlaceDominoUseCase): PlaceDominoHandler =>\n (command: PlaceDominoCommand) => {\n const { game, lordId, position, orientation, rotation } = command;\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n throw new Error(\"Invalid next action\");\n }\n\n const result = useCase(game, lordId, position, orientation, rotation);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n return result.value;\n }\n\n return result.value;\n };\n","import type { StartGameCommand } from \"../commands/startGameCommand.js\";\nimport type { Game, NextAction } from \"../../core/domain/types/game.js\";\nimport { isErr } from \"../../utils/result.js\";\nimport type { StartGameUseCase } from \"../../core/useCases/startGame.js\";\n\ntype StartGameHandler = (\n command: StartGameCommand\n) => Game & { nextAction: NextAction };\n\nexport const startGameHandler =\n (useCase: StartGameUseCase): StartGameHandler =>\n (command: StartGameCommand) => {\n const { game } = command;\n\n if (game.nextAction.step !== \"start\") {\n throw new Error(\"Invalid next action\");\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n throw new Error(result.error);\n }\n\n return result.value;\n };\n","import type { EmptyTile, Tile } from \"./domino.js\";\n\nexport type Position = {\n x: number; // cols\n y: number; // rows\n};\n\nexport type Orientation = \"vertical\" | \"horizontal\";\n\nexport type Rotation = 0 | 180;\n\nexport type Kingdom = (Tile | EmptyTile)[][];\n\nexport const GRIDSIZE = 9;\n","export const GROUND = [\n \"castle\",\n \"wheat\",\n \"forest\",\n \"sea\",\n \"plain\",\n \"swamp\",\n \"mine\",\n] as const;\n\nexport type Ground = (typeof GROUND)[number];\nexport type EmptyGround = \"empty\";\n\nexport type Crown = number;\n\nexport type Tile = {\n type: Ground;\n crowns: Crown;\n};\n\nexport type EmptyTile = {\n type: EmptyGround;\n crowns: 0;\n};\n\nexport type Domino = {\n left: Tile;\n right: Tile;\n number: number;\n};\n\nexport type RevealsDomino = {\n domino: Domino;\n picked: boolean;\n lordId: string | null;\n position: number;\n};\n","import type { Kingdom } from \"./kingdom.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Player = {\n id: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport type PlayerPayload = {\n name: string;\n};\n\nexport type PlayersPayload = PlayerPayload[];\n\nexport type Players = Player[];\n\nexport const playerActions = {\n placeDomino: \"placeDomino\",\n pickDomino: \"pickDomino\",\n pass: \"pass\",\n} as const;\n\nexport type PlayerActions = ObjectValues<typeof playerActions>;\n","import type { ExtraRule } from \"../types/rule.js\";\nimport { ok, err, type Result } from \"../../../utils/result.js\";\n\nexport const getAvailablesExtraRules = (\n extraRules: ExtraRule[],\n mode: string,\n numberOfPlayers: number\n): Result<ExtraRule[]> => {\n const availableExtraRules = extraRules.filter((rule) => {\n return (\n rule.mode.filter((m) => m.name === mode).length > 0 &&\n (!rule.playersLimit || rule.playersLimit === numberOfPlayers)\n );\n });\n\n if (availableExtraRules.length === 0) {\n return err(\"No extra rules found\");\n }\n\n return ok(availableExtraRules);\n};\n\nexport const toExtraRule = (\n rule: string,\n extraRules: ExtraRule[]\n): Result<ExtraRule> => {\n const foundRule = extraRules.find((r) => r.name === rule);\n\n if (!foundRule) {\n return err(`Rule not found: ${rule}`);\n }\n\n return ok(foundRule);\n};\n","import {\n gameSteps,\n type ExtraRule,\n type Game,\n type NextStep,\n} from \"../domain/types/index.js\";\nimport { isErr, ok, type Result } from \"../../utils/result.js\";\nimport type { RuleRepository } from \"../portServerside/ruleRepository.js\";\nimport { toExtraRule } from \"../domain/entities/rule.js\";\n\nexport type AddExtraRulesUseCase = (\n game: Game & { nextAction: NextStep },\n rules: string[]\n) => Result<Game & { nextAction: NextStep }>;\n\nexport const addExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): AddExtraRulesUseCase =>\n (game, rules) => {\n const { ruleRepository } = deps;\n const availableExtraRules = ruleRepository.getAllExtra();\n\n const newExtraRules: ExtraRule[] = [];\n\n for (const rule of rules) {\n const result = toExtraRule(rule, availableExtraRules);\n\n if (isErr(result)) {\n return result;\n }\n\n newExtraRules.push(result.value);\n }\n\n const updatedRules = {\n basic: game.rules.basic,\n extra: newExtraRules,\n };\n\n const next: NextStep = {\n type: \"step\",\n step: gameSteps.start,\n };\n\n const updatedGame: Game & { nextAction: NextStep } = {\n ...game,\n rules: updatedRules,\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import { type Result, err, ok, isErr } from \"../../../utils/result.js\";\nimport type { PlayerPayload, Player } from \"../types/player.js\";\nimport type { Kingdom } from \"../types/kingdom.js\";\n\nconst MINPLAYERSNAMELENGTH = 3;\n\nexport const validatePlayer = (name: string): Result<string> => {\n if (!name || name.trim().length < MINPLAYERSNAMELENGTH) {\n return err(`Invalid player name: ${name}`);\n }\n\n return ok(name);\n};\n\nexport const createPlayer = (\n playerName: string,\n id: string,\n kingdom: Kingdom\n): Result<Player> => {\n const name = validatePlayer(playerName);\n\n if (isErr(name)) {\n return name;\n }\n\n return ok({\n name: name.value,\n id,\n kingdom,\n });\n};\n","import {\n GROUND,\n type Crown,\n type EmptyGround,\n type EmptyTile,\n type Ground,\n type Tile,\n} from \"../types/domino.js\";\n\nconst isGround = (ground: any): ground is Ground => {\n return GROUND.includes(ground);\n};\n\nexport const createTile = (\n ground: Ground | EmptyGround,\n crowns: Crown = 0\n): Tile | EmptyTile => {\n if (isGround(ground)) {\n return { type: ground, crowns } as Tile;\n }\n return { type: ground, crowns: 0 } as EmptyTile;\n};\n","import { isOk } from \"../../../utils/result.js\";\nimport { err, isErr, ok, type Result } from \"../../../utils/result.js\";\nimport { createTile } from \"./domino.js\";\nimport {\n GRIDSIZE,\n type Domino,\n type EmptyTile,\n type Kingdom,\n type Orientation,\n type Position,\n type Rotation,\n type Tile,\n} from \"../types/index.js\";\n\nexport const createEmptyKingdom = (): Kingdom => {\n const emptyTile = createTile(\"empty\");\n const grid = Array.from({ length: GRIDSIZE }, () =>\n Array.from({ length: GRIDSIZE }, () => emptyTile)\n );\n\n return grid;\n};\n\nexport const placeCastle = (kingdom: Kingdom): Kingdom => {\n const castle = createTile(\"castle\");\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[4]![4] = castle;\n return newKingdom;\n};\n\nexport const placeTile = (\n kingdom: Kingdom,\n position: Position,\n tile: Tile\n): Kingdom => {\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[position.y]![position.x] = tile;\n return newKingdom;\n};\n\nexport const getTile = (\n kingdom: Kingdom,\n position: Position\n): Result<Tile | EmptyTile> => {\n const tile = kingdom[position.y]?.[position.x];\n if (!tile) {\n return err(\"Invalid placement (not fit into the grid)\");\n }\n return ok(tile);\n};\n\nexport const calculateDominoPosition = (\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): [{ tile: Tile; position: Position }, { tile: Tile; position: Position }] => {\n let firstTile: {\n tile: Tile;\n position: Position;\n };\n let secondTile: {\n tile: Tile;\n position: Position;\n };\n\n if (orientation === \"horizontal\") {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n }\n } else {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n }\n }\n\n return [firstTile, secondTile];\n};\n\nexport const placeDomino = (\n kingdom: Kingdom,\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): Result<Kingdom> => {\n const [firstTile, secondTile] = calculateDominoPosition(\n position,\n orientation,\n rotation,\n domino\n );\n\n const isFreePlaceResult = isFreePlace(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n if (isErr(isFreePlaceResult)) {\n return isFreePlaceResult;\n }\n\n const adjacentTiles = isAdjacent(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n\n if (adjacentTiles.length === 0) {\n return err(\"Invalid placement (not adjacent)\");\n }\n\n const hasValidAdjacentTiles = hasValidAdjacent(adjacentTiles, [\n firstTile.tile,\n secondTile.tile,\n ]);\n\n if (!hasValidAdjacentTiles) {\n return err(\"Invalid placement (not valid adjacent)\");\n }\n\n return ok(placeTiles(kingdom, [firstTile, secondTile]));\n};\n\nconst placeTiles = (\n kingdom: Kingdom,\n tiles: { tile: Tile; position: Position }[]\n) => {\n let newKingdom = deepCopyKingdom(kingdom);\n for (const { tile, position } of tiles) {\n newKingdom = placeTile(newKingdom, position, tile);\n }\n return newKingdom;\n};\n\nconst isFreePlace = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Result<boolean> => {\n const firstTile = getTile(kingdom, firstPosition);\n const secondTile = getTile(kingdom, secondPosition);\n\n if (isErr(firstTile)) {\n return firstTile;\n }\n\n if (isErr(secondTile)) {\n return secondTile;\n }\n\n if (firstTile.value.type !== \"empty\" || secondTile.value.type !== \"empty\") {\n return err(\"Invalid placement (not empty)\");\n }\n\n return ok(true);\n};\n\nconst isAdjacent = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Tile[] => {\n const xFirstPosition = firstPosition.x;\n const yFirstPosition = firstPosition.y;\n const xSecondPosition = secondPosition.x;\n const ySecondPosition = secondPosition.y;\n\n const adjacentTiles: Tile[] = [];\n const adjacentTilesKeys = [\n { x: xFirstPosition - 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition - 1 },\n { x: xFirstPosition + 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition + 1 },\n { x: xSecondPosition - 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition - 1 },\n { x: xSecondPosition + 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition + 1 },\n ];\n\n // Remove firstPosition and secondPosition from adjacentTilesKeys\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xFirstPosition && pos.y === yFirstPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xSecondPosition && pos.y === ySecondPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.forEach((key) => {\n const tile = getTile(kingdom, key);\n if (isOk(tile)) {\n if (tile.value.type !== \"empty\") {\n adjacentTiles.push(tile.value);\n }\n }\n });\n\n return adjacentTiles;\n};\n\nconst hasValidAdjacent = (\n adjacentTiles: (Tile | EmptyTile)[],\n tiles: Tile[]\n): boolean => {\n return adjacentTiles.some((adjacentTile) => {\n return tiles.some((tile) => {\n return tile.type === adjacentTile.type || adjacentTile.type === \"castle\";\n });\n });\n};\n\nexport const checkCastleIsInMiddle = (kingdom: Kingdom): boolean => {\n // Find index of castle\n const castlePosition = kingdom\n .map((row) => row.findIndex((tile) => tile.type === \"castle\"))\n .find((index) => index !== -1);\n\n // Count how many tiles not empty are on the left of the castle\n const leftTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const leftTilesCount = leftTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the right of the castle\n const rightTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const rightTilesCount = rightTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the top of the castle\n const topTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const topTilesCount = topTiles.filter((tile) => tile.type !== \"empty\").length;\n\n // Count how many tiles not empty are on the bottom of the castle\n const bottomTiles =\n castlePosition != undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const bottomTilesCount = bottomTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n return (\n leftTilesCount === rightTilesCount &&\n topTilesCount === bottomTilesCount &&\n leftTilesCount === topTilesCount\n );\n};\n\nexport const countDominoes = (kingdom: Kingdom): number => {\n const notEmpties = kingdom.flat().filter((tile) => tile.type !== \"empty\");\n const totalDominoes = (notEmpties.length - 1) / 2; // -1 because the castle is not a domino\n return totalDominoes;\n};\n\nconst deepCopyKingdom = (kingdom: Kingdom): Kingdom => {\n return kingdom.map((line) => line.map((tile) => ({ ...tile })));\n};\n","import type { Game, NextStep, Players } from \"../domain/types/index.js\";\nimport type { UuidMethod } from \"../portServerside/uuidMethod.js\";\nimport type { ShuffleMethod } from \"../portServerside/shuffleMethod.js\";\nimport { ok, err, type Result, isErr } from \"../../utils/result.js\";\nimport { createPlayer } from \"../domain/entities/player.js\";\nimport { createEmptyKingdom, placeCastle } from \"../domain/entities/kingdom.js\";\nimport type { RuleRepository } from \"../portServerside/ruleRepository.js\";\n\nexport type AddPlayersUseCase = (\n game: Game & { nextAction: NextStep },\n players: string[]\n) => Result<Game & { nextAction: NextStep }>;\n\nexport const addPlayersUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n ruleRepository: RuleRepository;\n }): AddPlayersUseCase =>\n (game, players) => {\n const { uuidMethod, shuffleMethod, ruleRepository } = deps;\n\n if (!players || players.length < 2 || players.length > 4) {\n return err(\"Invalid number of players\");\n }\n\n const newPlayers: Players = [];\n\n for (const player of players) {\n let kingdom = createEmptyKingdom();\n kingdom = placeCastle(kingdom);\n let id = uuidMethod();\n const newPlayer = createPlayer(player, id, kingdom);\n\n if (isErr(newPlayer)) {\n return newPlayer;\n }\n\n newPlayers.push(newPlayer.value);\n }\n\n // set rules\n const rules = ruleRepository.getAll();\n const basicRules = rules.basic[newPlayers.length];\n\n if (!basicRules) {\n return err(\"No base rules found\");\n }\n\n // updateDominoes\n const dominoes = game.dominoes;\n const { maxDominoes } = basicRules;\n const shuffledDominoes = shuffleMethod(dominoes);\n const splicedDominoes = shuffledDominoes.slice(0, maxDominoes);\n const next: NextStep = {\n type: \"step\",\n step: \"options\",\n };\n\n const updatedGame: Game & { nextAction: NextStep } = {\n ...game,\n players: newPlayers,\n dominoes: splicedDominoes,\n rules: {\n ...game.rules,\n basic: basicRules,\n },\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import type { NextAction } from \"../types/game.js\";\nimport type { Lord } from \"../types/lord.js\";\nimport { playerActions, type PlayerActions } from \"../types/player.js\";\n\nexport const createLord = (id: string, playerId: string): Lord => {\n return {\n id,\n playerId,\n turnEnded: false,\n hasPick: false,\n hasPlace: true,\n };\n};\n\nconst hasPick = (lord: Lord): boolean => lord.hasPick;\nconst hasPlace = (lord: Lord): boolean => lord.hasPlace;\nconst hasTurnEnded = (lord: Lord): boolean => lord.turnEnded;\n\nexport const canPass = (lord: Lord): boolean => {\n return !hasPick(lord) && !hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPick = (lord: Lord): boolean => {\n return !hasPick(lord) && hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPlaceAndDominoPickedIsDefined = (\n lord: Lord\n): lord is Required<Lord & Pick<Lord, \"dominoPicked\">> => {\n return (\n !hasPick(lord) &&\n !hasPlace(lord) &&\n !hasTurnEnded(lord) &&\n lord.dominoPicked !== undefined\n );\n};\n\nexport const updateLordOrder = (lords: Lord[]): Lord[] => {\n return lords.sort((a, b) => {\n return a.dominoPicked!.number - b.dominoPicked!.number;\n });\n};\n\nexport const resetLordsActions = (lord: Lord[]): Lord[] => {\n const lordsCopy = [...lord];\n for (const lord of lordsCopy) {\n lord.turnEnded = false;\n lord.hasPick = false;\n lord.hasPlace = false;\n }\n\n return lordsCopy;\n};\n\nexport const nextLordWithAction = (lords: Lord[]): NextAction => {\n const nextLord = findNextLord(lords);\n\n return {\n type: \"action\",\n nextLord: nextLord.id,\n nextAction: hasPlace(nextLord)\n ? playerActions.pickDomino\n : playerActions.placeDomino,\n };\n};\n\nconst findNextLord = (lords: Lord[]): Lord => {\n const lord = lords.find((lord) => !hasTurnEnded(lord));\n if (!lord) {\n return lords[0]!;\n }\n return lord;\n};\n\nexport const allLordsHavePlayed = (lords: Lord[]) => {\n return lords.every((lord) => lord.turnEnded);\n};\n","import {\n nextLordWithAction,\n resetLordsActions,\n} from \"./../domain/entities/lord.js\";\nimport { type GameWithNextAction } from \"../domain/types/game.js\";\nimport { err, ok, type Result } from \"../../utils/result.js\";\nimport {\n allLordsHavePlayed,\n canPick,\n updateLordOrder,\n} from \"../domain/entities/lord.js\";\n\nexport type ChooseDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n dominoPick: number\n) => Result<GameWithNextAction>;\n\nexport const chooseDominoUseCase: ChooseDominoUseCase = (\n game,\n lordId,\n dominoPick\n) => {\n const currentLord = game.lords.find(\n (lord) => lord.id === game.nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPick(currentLord)) {\n return err(\"Lord can't pick\");\n }\n\n // Check if dominoPick is valid choice\n const selectedDomino = game.currentDominoes.find(\n (domino) => domino.domino.number === dominoPick\n );\n\n if (!selectedDomino) {\n return err(\"Domino not found\");\n }\n\n if (selectedDomino.picked) {\n return err(\"Domino already picked\");\n }\n\n // update currentDominoes\n const updatedCurrentDominoes = game.currentDominoes.map((domino) => {\n if (domino.domino.number === dominoPick) {\n domino.picked = true;\n domino.lordId = currentLord.id;\n }\n return domino;\n });\n\n // update lords\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n lord.hasPick = true;\n lord.turnEnded = true;\n lord.dominoPicked = selectedDomino.domino;\n }\n return lord;\n });\n\n const turnEnded = allLordsHavePlayed(updatedLords);\n\n if (turnEnded) {\n const lords = resetLordsActions(updateLordOrder(updatedLords));\n const updatedTurn = game.turn + 1;\n const next = nextLordWithAction(lords);\n const dominoesCopy = [...game.dominoes];\n const dominoesDrawn = dominoesCopy.splice(\n 0,\n game.rules.basic.dominoesPerTurn\n );\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const updatedCurrentDominoes = dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n });\n\n return ok({\n ...game,\n currentDominoes: updatedCurrentDominoes,\n dominoes: dominoesCopy,\n lords,\n turn: updatedTurn,\n nextAction: next,\n });\n }\n\n const next = nextLordWithAction(updatedLords);\n\n // update state\n const updatedState = {\n ...game,\n currentDominoes: updatedCurrentDominoes,\n lords: updatedLords,\n nextAction: next,\n };\n\n return ok(updatedState);\n};\n","import {\n gameSteps,\n type Domino,\n type Game,\n type GameMode,\n type NextStep,\n} from \"../types/index.js\";\n\nexport const create = (payload: {\n id: string;\n mode: GameMode;\n dominoes: Domino[];\n}): Game & { nextAction: NextStep } => {\n const { id, mode, dominoes } = payload;\n return {\n id,\n dominoes,\n currentDominoes: [],\n players: [],\n lords: [],\n turn: 0,\n nextAction: {\n type: \"step\",\n step: gameSteps.addPlayers,\n },\n rules: {\n basic: {\n lords: 0,\n maxDominoes: 0,\n dominoesPerTurn: 0,\n maxTurns: 0,\n },\n extra: [],\n },\n mode,\n };\n};\n","import { err, ok, type Result } from \"../../../utils/result.js\";\nimport type { GameMode } from \"../types/mode.js\";\n\nconst findMode = (\n mode: string,\n availableMode: GameMode[]\n): GameMode | undefined => {\n return availableMode.find((m) => m.name === mode);\n};\n\nexport const createMode = (\n mode: string,\n availableMode: GameMode[]\n): Result<GameMode> => {\n const foundMode = findMode(mode, availableMode);\n if (foundMode) {\n return ok(foundMode);\n }\n\n return err(`Invalid mode: ${mode}`);\n};\n","import { err, isErr, ok, type Result } from \"../../utils/result.js\";\nimport type { Game, NextStep } from \"../domain/types/game.js\";\nimport { create } from \"../domain/entities/game.js\";\nimport type { ModeRepository } from \"../portServerside/modeRepository.js\";\nimport type { DominoesRepository } from \"core/portServerside/dominoesRepository.js\";\nimport type { UuidMethod } from \"../portServerside/uuidMethod.js\";\nimport { createMode } from \"../domain/entities/mode.js\";\n\nexport type CreateGameUseCase = (\n mode: string\n) => Result<Game & { nextAction: NextStep }>;\n\nexport const createGameUseCase =\n (deps: {\n modeRepository: ModeRepository;\n dominoesRepository: DominoesRepository;\n uuidMethod: UuidMethod;\n }): CreateGameUseCase =>\n (mode) => {\n const { modeRepository, dominoesRepository, uuidMethod } = deps;\n const id = uuidMethod();\n const availableMode = modeRepository.getAvailables();\n const newMode = createMode(mode, availableMode);\n\n if (isErr(newMode)) {\n return newMode;\n }\n\n const dominoes = dominoesRepository.getForMode(newMode.value);\n\n if (!dominoes || dominoes.length === 0) {\n return err(`No dominoes found for mode ${newMode.value.name}`);\n }\n\n const payload = {\n id,\n mode: newMode.value,\n dominoes,\n };\n\n const newGame = create(payload);\n\n return ok(newGame);\n };\n","import {\n gameSteps,\n type GameResult,\n type GameWithNextAction,\n type GameWithNextStep,\n type NextAction,\n type NextStep,\n} from \"../domain/types/game.js\";\nimport {\n canPass,\n nextLordWithAction,\n allLordsHavePlayed,\n} from \"../domain/entities/lord.js\";\nimport { err, ok } from \"../../utils/result.js\";\n\nexport type DiscardDominoUseCase = (\n game: GameWithNextAction,\n lordId: string\n) => GameResult;\n\nexport const discardDominoUseCase: DiscardDominoUseCase = (game, lordId) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPass(currentLord)) {\n return err(\"Lord can't pass\");\n }\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLord = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameWithNextAction | GameWithNextStep;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLord)) {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: resultStep,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: <NextAction>nextLordWithAction(updatedLord),\n };\n }\n\n return ok(updatedGame);\n};\n","import { err, type Result } from \"../../utils/result.js\";\nimport type { ExtraRule } from \"../domain/types/rule.js\";\nimport { getAvailablesExtraRules } from \"../domain/entities/rule.js\";\nimport type { GameMode } from \"../domain/types/mode.js\";\nimport type { RuleRepository } from \"../portServerside/ruleRepository.js\";\n\nexport type GetExtraRulesUseCase = (\n mode: GameMode[\"name\"],\n players: number\n) => Result<ExtraRule[]>;\n\nexport const getExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): GetExtraRulesUseCase =>\n (mode: GameMode[\"name\"], players: number): Result<ExtraRule[]> => {\n const { ruleRepository } = deps;\n\n const allExtraRules = ruleRepository.getAllExtra();\n\n if (!allExtraRules) {\n return err(\"No rules found\");\n }\n\n return getAvailablesExtraRules(allExtraRules, mode, players);\n };\n","import type { GameMode } from \"../domain/types/mode.js\";\nimport { ok, type Result } from \"../../utils/result.js\";\nimport type { ModeRepository } from \"core/portServerside/modeRepository.js\";\n\nexport type GetModesUseCase = () => Result<GameMode[]>;\n\nexport const getModesUseCase =\n (deps: { modeRepository: ModeRepository }): GetModesUseCase =>\n (): Result<GameMode[]> => {\n const { modeRepository } = deps;\n return ok(modeRepository.getAvailables());\n };\n","import type {\n FinalResult,\n GameWithNextStep,\n GameWithResults,\n ScoreResult,\n} from \"../domain/types/index.js\";\nimport { ok, type Result } from \"../../utils/result.js\";\nimport {\n checkCastleIsInMiddle,\n countDominoes,\n} from \"../domain/entities/kingdom.js\";\n\ntype Property = {\n type: string;\n crowns: number;\n size: number;\n tiles: number[][];\n};\n\nexport type GetResultUseCase = (\n game: GameWithNextStep\n) => Result<GameWithResults>;\n\nexport const getResultUseCase: GetResultUseCase = (game) => {\n const { players, rules } = game;\n const { basic, extra } = rules;\n const scores: ScoreResult[] = players.map((player) => {\n const { kingdom } = player;\n const visited: boolean[][] = kingdom.map((row) => row.map(() => false));\n const properties: Property[] = [];\n\n const directions = [\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n ]; // Up, Down, Left, Right\n\n const markZone = (\n x: number,\n y: number,\n type: string,\n crowns: number\n ): void => {\n if (\n x < 0 ||\n y < 0 ||\n x >= kingdom[0]!.length ||\n y >= kingdom.length ||\n visited[y]![x] ||\n kingdom[y]![x]!.type !== type ||\n kingdom[y]![x]!.type === \"empty\" ||\n kingdom[y]![x]!.type === \"castle\"\n ) {\n return;\n }\n\n visited[y]![x] = true;\n const currentZone = properties.find(\n (property) =>\n property.type === type &&\n property.tiles.some(([tx, ty]) => {\n for (let [dx, dy] of directions) {\n if (\n (tx as number) + (dx as number) === x &&\n (ty as number) + (dy as number) === y\n ) {\n return true;\n }\n }\n return false;\n })\n );\n\n if (currentZone) {\n currentZone.size += 1;\n currentZone.tiles.push([x, y]);\n currentZone.crowns += crowns;\n } else {\n properties.push({\n type,\n crowns,\n size: 1,\n tiles: [[x, y]],\n });\n }\n\n directions.forEach(([dx, dy]) => {\n const nx = x + (dx as number);\n const ny = y + (dy as number);\n if (\n nx >= 0 &&\n ny >= 0 &&\n nx < kingdom[0]!.length &&\n ny < kingdom.length &&\n kingdom[ny]![nx]!.type === type\n ) {\n markZone(nx, ny, kingdom[ny]![nx]!.type, kingdom[ny]![nx]!.crowns);\n }\n });\n };\n\n kingdom.forEach((row, y) => {\n row.forEach((tile, x) => {\n if (!visited[y]![x]) {\n markZone(x, y, tile.type, tile.crowns);\n }\n });\n });\n\n if (properties.length === 0) {\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n points: 0,\n maxPropertiesSize: 0,\n totalCrowns: 0,\n },\n };\n }\n\n let points = properties.reduce(\n (score, property) => score + property.crowns * property.size,\n 0\n );\n const maxPropertiesSize = Math.max(\n ...properties.map((property) => property.size ?? 0)\n );\n\n const totalCrowns = properties.reduce(\n (total, property) => total + property.crowns,\n 0\n );\n\n if (extra.length > 0) {\n extra.forEach((extraRule) => {\n if (extraRule.name === \"The middle Kingdom\") {\n const castleIsInMiddle = checkCastleIsInMiddle(kingdom);\n if (castleIsInMiddle) {\n points += 10;\n }\n }\n\n if (extraRule.name === \"Harmony\") {\n const totalDominoes = countDominoes(kingdom);\n const dominoLimit = basic.maxDominoes;\n const totalPlayers = players.length;\n const dominoesPerPlayer = dominoLimit / totalPlayers;\n if (totalDominoes === dominoesPerPlayer) {\n points += 5;\n }\n }\n });\n }\n\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n points,\n maxPropertiesSize,\n totalCrowns,\n },\n };\n });\n\n // 1 order players by score, then by maxPropertiesSize, then by totalCrowns all descending\n scores.sort((a, b) => {\n if (a.details.points !== b.details.points) {\n return b.details.points - a.details.points;\n }\n if (a.details.maxPropertiesSize !== b.details.maxPropertiesSize) {\n return b.details.maxPropertiesSize - a.details.maxPropertiesSize;\n }\n return b.details.totalCrowns - a.details.totalCrowns;\n });\n\n const result: FinalResult[] = [];\n\n let isTie = false;\n result.push({\n playerId: scores[0]!.playerId,\n playerName: scores[0]!.playerName,\n details: scores[0]!.details,\n position: 1,\n });\n\n for (let i = 1; i < scores.length; i++) {\n const currentScore = scores[i];\n const previousScore = scores[i - 1];\n if (\n previousScore &&\n currentScore &&\n currentScore.details.points === previousScore.details.points &&\n currentScore.details.maxPropertiesSize ===\n previousScore.details.maxPropertiesSize &&\n currentScore.details.totalCrowns === previousScore.details.totalCrowns\n ) {\n isTie = true;\n }\n\n if (isTie) {\n result.push({\n ...currentScore!,\n position: result[i - 1]!.position,\n });\n } else {\n result.push({\n ...currentScore!,\n position: i + 1,\n });\n }\n\n isTie = false;\n }\n\n return ok({\n ...game,\n result: result,\n });\n};\n","import { err, isErr, ok } from \"../../utils/result.js\";\nimport {\n gameSteps,\n type GameResult,\n type GameWithNextAction,\n type GameWithNextStep,\n type NextAction,\n type NextStep,\n} from \"../domain/types/game.js\";\nimport {\n allLordsHavePlayed,\n canPlaceAndDominoPickedIsDefined,\n nextLordWithAction,\n} from \"../domain/entities/lord.js\";\nimport { placeDomino } from \"../domain/entities/kingdom.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"../domain/types/kingdom.js\";\n\nexport type PlaceDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n) => GameResult;\n\nexport const placeDominoUseCase: PlaceDominoUseCase = (\n game,\n lordId,\n position,\n orientation,\n rotation\n) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPlaceAndDominoPickedIsDefined(currentLord)) {\n return err(\"Lord can't place\");\n }\n\n const domino = currentLord.dominoPicked;\n\n const currentPlayer = game.players.find(\n (player) => player.id === currentLord.playerId\n );\n\n if (!currentPlayer) {\n return err(\"Player not found\");\n }\n\n const updatedKingdom = placeDomino(\n currentPlayer.kingdom,\n position,\n orientation,\n rotation,\n domino\n );\n\n if (isErr(updatedKingdom)) {\n return updatedKingdom;\n }\n\n const updatedPlayers = game.players.map((player) => {\n if (player.id === currentPlayer.id) {\n player.kingdom = updatedKingdom.value;\n }\n return player;\n });\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameWithNextAction | GameWithNextStep;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLords)) {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: resultStep,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: <NextAction>nextLordWithAction(updatedLords),\n };\n }\n\n return ok(updatedGame);\n};\n","import type { UuidMethod } from \"../portServerside/uuidMethod.js\";\nimport { ok, type Result } from \"../../utils/result.js\";\nimport type { Game, NextAction, NextStep } from \"../domain/types/game.js\";\nimport type { ShuffleMethod } from \"../portServerside/shuffleMethod.js\";\nimport type { Lord } from \"../domain/types/lord.js\";\nimport { createLord } from \"../domain/entities/lord\";\nimport { playerActions } from \"../domain/types/player.js\";\n\nexport type StartGameUseCase = (\n game: Game & { nextAction: NextStep }\n) => Result<Game & { nextAction: NextAction }>;\n\nexport const startGameUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n }): StartGameUseCase =>\n (game) => {\n const { uuidMethod, shuffleMethod } = deps;\n const {\n rules: {\n basic: { lords: maxLords, dominoesPerTurn },\n },\n players,\n dominoes,\n } = game;\n\n const numberOfPlayers = players.length;\n\n const newLords: Lord[] = [];\n\n for (let i = 0; i < numberOfPlayers; i++) {\n for (let j = 0; j < maxLords; j++) {\n const lord = createLord(uuidMethod(), players[i]!.id);\n newLords.push(lord);\n }\n }\n\n const shuffledLords = shuffleMethod(newLords);\n const dominoesCopy = [...dominoes];\n const dominoesDrawn = dominoesCopy.splice(0, dominoesPerTurn);\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const nextAction: NextAction = {\n type: \"action\",\n nextLord: shuffledLords[0]!.id,\n nextAction: playerActions.pickDomino,\n };\n\n const newState: Game & { nextAction: NextAction } = {\n ...game,\n lords: shuffledLords,\n nextAction,\n dominoes: dominoesCopy,\n currentDominoes: dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n }),\n };\n\n return ok(newState);\n };\n","import type { ShuffleMethod } from \"../core/portServerside/shuffleMethod.js\";\n\nexport const shuffleMethod: ShuffleMethod = <T>(array: T[]) => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j] as T, array[i] as T];\n }\n return array;\n};\n","import type { UuidMethod } from \"../core/portServerside/uuidMethod.js\";\nimport { randomUUID } from \"crypto\";\n\nexport const uuidMethod: UuidMethod = () => {\n return randomUUID();\n};\n","import jsonDominoes from \"./adapterServerside/jsonDominoes.js\";\nimport jsonModes from \"./adapterServerside/jsonModes.js\";\nimport jsonRules from \"./adapterServerside/jsonRules.js\";\nimport { addExtraRulesHandler } from \"./application/handlers/addExtraRulesHandler.js\";\nimport { addPlayersHandler } from \"./application/handlers/addPlayersHandler.js\";\nimport { chooseDominoHandler } from \"./application/handlers/chooseDominoHandler.js\";\nimport { createGameHandler } from \"./application/handlers/createGameHandler.js\";\nimport { discardDominoHandler } from \"./application/handlers/discardDominoHandler.js\";\nimport { getExtraRulesHandler } from \"./application/handlers/getExtraRulesHandler.js\";\nimport { getModesHandler } from \"./application/handlers/getModesHandler.js\";\nimport { getResultHandler } from \"./application/handlers/getResultHandler.js\";\nimport { placeDominoHandler } from \"./application/handlers/placeDominoHandler.js\";\nimport { startGameHandler } from \"./application/handlers/startGameHandler.js\";\nimport type { DominoesRepository } from \"./core/portServerside/dominoesRepository.js\";\nimport type { ModeRepository } from \"./core/portServerside/modeRepository.js\";\nimport type { RuleRepository } from \"./core/portServerside/ruleRepository.js\";\nimport type { ShuffleMethod } from \"./core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"./core/portServerside/uuidMethod.js\";\nimport { addExtraRulesUseCase } from \"./core/useCases/addExtraRules.js\";\nimport { addPlayersUseCase } from \"./core/useCases/addPlayers.js\";\nimport { chooseDominoUseCase } from \"./core/useCases/chooseDomino.js\";\nimport { createGameUseCase } from \"./core/useCases/createGame.js\";\nimport { discardDominoUseCase } from \"./core/useCases/discardDomino.js\";\nimport { getExtraRulesUseCase } from \"./core/useCases/getExtraRules.js\";\nimport { getModesUseCase } from \"./core/useCases/getModes.js\";\nimport { getResultUseCase } from \"./core/useCases/getResult.js\";\nimport { placeDominoUseCase } from \"./core/useCases/placeDomino.js\";\nimport { startGameUseCase } from \"./core/useCases/startGame.js\";\nimport { shuffleMethod } from \"./adapterServerside/shuffle.js\";\nimport { uuidMethod } from \"./adapterServerside/uuid.js\";\n\nexport type EngineConfig = {\n modeRepository?: ModeRepository;\n dominoesRepository?: DominoesRepository;\n ruleRepository?: RuleRepository;\n uuidMethod?: UuidMethod;\n shuffleMethod?: ShuffleMethod;\n};\n\nexport const configureEngine = (config: Partial<EngineConfig>) => {\n const modeRepository = config.modeRepository || jsonModes();\n const dominoesRepository = config.dominoesRepository || jsonDominoes();\n const ruleRepository = config.ruleRepository || jsonRules();\n const uuid = config.uuidMethod || uuidMethod;\n const shuffle = config.shuffleMethod || shuffleMethod;\n\n return {\n createGameHandler: createGameHandler(\n createGameUseCase({\n modeRepository,\n dominoesRepository,\n uuidMethod: uuid,\n })\n ),\n getModesHandler: getModesHandler(getModesUseCase({ modeRepository })),\n getExtraRulesHandler: getExtraRulesHandler(\n getExtraRulesUseCase({ ruleRepository })\n ),\n addPlayersHandler: addPlayersHandler(\n addPlayersUseCase({\n uuidMethod: uuid,\n shuffleMethod: shuffle,\n ruleRepository,\n })\n ),\n addExtraRulesHandler: addExtraRulesHandler(\n addExtraRulesUseCase({ ruleRepository })\n ),\n startGameHandler: startGameHandler(\n startGameUseCase({ uuidMethod: uuid, shuffleMethod: shuffle })\n ),\n chooseDominoHandler: chooseDominoHandler(chooseDominoUseCase),\n placeDominoHandler: placeDominoHandler(placeDominoUseCase),\n discardDominoHandler: discardDominoHandler(discardDominoUseCase),\n getResultHandler: getResultHandler(getResultUseCase),\n };\n};\n","import type { GameEngine } from \"./core/portUserside/engine.js\";\nimport { configureEngine, type EngineConfig } from \"./config.js\";\nimport { isGameWithNextAction } from \"./core/domain/types/game.js\";\n\nexport const createGameEngine = (config: Partial<EngineConfig>): GameEngine => {\n const {\n createGameHandler,\n getModesHandler,\n getExtraRulesHandler,\n addPlayersHandler,\n addExtraRulesHandler,\n startGameHandler,\n chooseDominoHandler,\n placeDominoHandler,\n discardDominoHandler,\n getResultHandler,\n } = configureEngine(config);\n\n return {\n getModes: (command) => getModesHandler(command),\n getExtraRules: (command) => getExtraRulesHandler(command),\n createGame: (command) => createGameHandler(command),\n addPlayers: (command) => addPlayersHandler(command),\n addExtraRules: (command) => addExtraRulesHandler(command),\n startGame: (command) => startGameHandler(command),\n chooseDomino: (command) => chooseDominoHandler(command),\n placeDomino: (command) => placeDominoHandler(command),\n discardDomino: (command) => discardDominoHandler(command),\n getResults: (command) => getResultHandler(command),\n };\n};\n\nconst engine = createGameEngine({});\n\nconst a = engine.createGame({ mode: \"standard\" });\nconst b = engine.getModes({});\nconst c = engine.getExtraRules({ mode: \"standard\", players: 2 });\nconst d = engine.addPlayers({ game: a, players: [\"player1\"] });\nconst e = engine.addExtraRules({ game: d, extraRules: [\"rule1\"] });\nconst f = engine.startGame({ game: e });\nconst g = engine.chooseDomino({\n game: f,\n lordId: \"player1\",\n dominoPick: 1,\n});\nconst h = engine.discardDomino({ game: g, lordId: \"player1\" });\nconst i = engine.placeDomino({\n game: g,\n lordId: \"player1\",\n position: { x: 1, y: 1 },\n orientation: \"horizontal\",\n rotation: 0,\n});\nif (isGameWithNextAction(i)) {\n const j = engine.chooseDomino({\n game: i,\n lordId: \"player1\",\n dominoPick: 1,\n });\n}\n\nif (!isGameWithNextAction(i)) {\n const j = engine.getResults({ game: i });\n}\n"],"mappings":"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","names":["getExtraRulesUseCase","uuidMethod","shuffleMethod","a","b","lord","next","a","b","updatedCurrentDominoes","uuidMethod","a","b","i","uuidMethod","shuffleMethod","i","a","b","i","createGameHandler","getModesHandler","getExtraRulesHandler","addPlayersHandler","addExtraRulesHandler","startGameHandler","chooseDominoHandler","placeDominoHandler","discardDominoHandler","getResultHandler"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pompidup/kingdomino-engine",
3
- "version": "1.1.0",
3
+ "version": "2.0.0",
4
4
  "description": "A simple engine for the game Kingdomino",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",
@@ -35,11 +35,11 @@
35
35
  },
36
36
  "homepage": "https://github.com/Pompidup/KDomino#readme",
37
37
  "devDependencies": {
38
- "@types/node": "^20.12.6",
39
- "@vitest/coverage-v8": "^1.4.0",
38
+ "@types/node": "^22.5.2",
39
+ "@vitest/coverage-v8": "^2.0.5",
40
40
  "ts-node": "^10.9.2",
41
- "tsup": "^8.0.2",
42
- "typescript": "^5.4.4",
43
- "vitest": "^1.4.0"
41
+ "tsup": "^8.2.4",
42
+ "typescript": "^5.5.4",
43
+ "vitest": "^2.0.5"
44
44
  }
45
45
  }