@pompidup/kingdomino-engine 1.0.1 → 1.0.3
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/README.md +66 -0
- package/dist/index.d.ts +110 -0
- package/dist/index.js +1402 -2
- package/dist/index.js.map +1 -7
- package/package.json +7 -8
- package/dist/bin/test.d.ts +0 -1
- package/dist/index.cjs.js +0 -2
- package/dist/index.cjs.js.map +0 -7
- package/dist/src/_utils/container.d.ts +0 -9
- package/dist/src/application/engine/index.d.ts +0 -31
- package/dist/src/domain/engine/index.d.ts +0 -15
- package/dist/src/domain/entities/domino.d.ts +0 -22
- package/dist/src/domain/entities/game.d.ts +0 -38
- package/dist/src/domain/entities/kingdom.d.ts +0 -15
- package/dist/src/domain/port/dominoesRepository.d.ts +0 -4
- package/dist/src/domain/port/gamesRepository.d.ts +0 -6
- package/dist/src/domain/useCases/game/availableRules.d.ts +0 -4
- package/dist/src/domain/useCases/game/draw.d.ts +0 -6
- package/dist/src/domain/useCases/game/endGame.d.ts +0 -1
- package/dist/src/domain/useCases/game/endTurn.d.ts +0 -8
- package/dist/src/domain/useCases/game/firstTurn.d.ts +0 -8
- package/dist/src/domain/useCases/game/game.d.ts +0 -76
- package/dist/src/domain/useCases/game/init.d.ts +0 -4
- package/dist/src/domain/useCases/game/order.d.ts +0 -6
- package/dist/src/domain/useCases/game/pass.d.ts +0 -4
- package/dist/src/domain/useCases/game/pick.d.ts +0 -4
- package/dist/src/domain/useCases/game/place.d.ts +0 -4
- package/dist/src/domain/useCases/game/result.d.ts +0 -11
- package/dist/src/domain/useCases/game/scoring.d.ts +0 -8
- package/dist/src/domain/useCases/game/setRules.d.ts +0 -6
- package/dist/src/domain/useCases/game/setup.d.ts +0 -10
- package/dist/src/domain/useCases/game/startTurn.d.ts +0 -8
- package/dist/src/index.d.ts +0 -2
- package/dist/src/infrastructure/repositories/inMemoryDominoes.d.ts +0 -3
- package/dist/src/infrastructure/repositories/inMemoryGames.d.ts +0 -8
- package/dist/src/utils/container.d.ts +0 -9
- package/dist/src/utils/testHelpers.d.ts +0 -7
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/infrastructure/data/dominoes.json", "../src/infrastructure/repositories/inMemoryDominoes.ts", "../src/domain/entities/game.ts", "../src/domain/useCases/game/init.ts", "../src/domain/entities/kingdom.ts", "../src/domain/useCases/game/setup.ts", "../src/domain/useCases/game/startTurn.ts", "../src/domain/useCases/game/pick.ts", "../src/domain/useCases/game/place.ts", "../src/domain/useCases/game/order.ts", "../src/domain/useCases/game/draw.ts", "../src/domain/useCases/game/scoring.ts", "../src/domain/useCases/game/pass.ts", "../src/domain/useCases/game/game.ts", "../src/domain/useCases/game/result.ts", "../src/application/engine/index.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["[\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 \"../../domain/entities/domino\";\nimport dominoesJson from \"../data/dominoes.json\" assert { type: \"json\" };\nimport type { DominoesRepository } from \"../../domain/port/dominoesRepository\";\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 { Domino, RevealsDomino } from \"./domino\";\nimport type { Kingdom } from \"./kingdom\";\n\nexport type King = {\n id: string;\n playerId: string;\n order: number;\n turnEnded: boolean;\n hasPick: boolean;\n hasPlace: boolean;\n dominoPicked?: Domino;\n};\n\nexport type Player = {\n id?: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport const availableMode = [\"Classic\"] as const;\nexport type AvailableMode = (typeof availableMode)[number];\nexport const isValidMode = (mode: string): mode is AvailableMode => {\n return availableMode.includes(mode as AvailableMode);\n};\n\nexport type Rule = {\n name: string;\n description: string;\n mode: AvailableMode[];\n playersLimit?: number;\n};\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n kings: King[];\n turn: number;\n maxTurns: number;\n maxDominoes: number;\n dominoesPerTurn: number;\n order: Record<number, string>;\n rules?: Rule[];\n};\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 kings: [],\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 \"domain/entities/domino\";\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, King, Player } from \"../../entities/game.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 { randomMethod, uuidMethod } = dependencies;\n const { maxDominoes, dominoesPerTurn, maxTurns } = rules[players.length]!;\n const shuffledDominoes = randomMethod(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 newKings: King[];\n if (newPlayers.length === 2) {\n newKings = [\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 newKings = 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 kingsWithOrder = randomMethod(newKings);\n\n kingsWithOrder.forEach((king, index) => {\n king.order = index + 1;\n });\n\n kingsWithOrder.sort((a, b) => a.order - b.order);\n\n const newState = {\n ...state,\n dominoes: shuffledDominoes,\n players: newPlayers,\n kings: kingsWithOrder,\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 kings = state.kings;\n\n kings.forEach((king) => {\n king.turnEnded = false;\n king.hasPick = false;\n king.hasPlace = false;\n });\n\n const updatedState = {\n ...state,\n kings,\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 isKingTurn,\n} from \"./game.js\";\n\nconst pick = (payload: PlayerActionPayload<\"pick\">): Game => {\n const { kingId, data } = payload;\n const { state, dominoPick } = data;\n const { currentDominoes, kings } = state;\n\n // Check if it is the king's turn\n if (!isKingTurn(state, kingId)) {\n throw new Error(\"It is not your turn\");\n }\n\n // Check if king has already picked\n const king = kings.find((king) => king.id === kingId);\n if (king?.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.kingId = kingId;\n }\n\n return domino;\n });\n\n // update kings\n const updatedKings = kings.map((king) => {\n if (king.id === kingId) {\n king.hasPick = true;\n king.turnEnded = true;\n king.dominoPicked = domino.domino;\n }\n\n return king;\n });\n\n // update state\n const updatedState = {\n ...state,\n currentDominoes: updatedCurrentDominoes,\n kings: updatedKings,\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 { kingId, data } = payload;\n const { state, position, orientation, rotation } = data;\n\n const currentKing = state.kings.find((king) => king.id === kingId);\n const currentPlayer = state.players.find(\n (player) => player.id === currentKing?.playerId\n );\n const currentKingdom = currentPlayer?.kingdom;\n\n if (!currentKingdom) {\n throw new Error(\"Kingdom not found\");\n }\n\n const domino = currentKing?.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 currentKing.hasPlace = true;\n\n const newState = {\n ...state,\n kings: state.kings.map((king) => {\n if (king.id === kingId) {\n return currentKing;\n }\n\n return king;\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 { kings, currentDominoes } = state;\n\n const allKingsHavePlayed = kings.every((king) => king.turnEnded);\n\n if (!allKingsHavePlayed) {\n throw new Error(\"Not all kings have played\");\n }\n\n const updatedKings = kings.map((king) => {\n return {\n ...king,\n order:\n currentDominoes.find((domino) => domino.kingId === king.id)?.position ||\n 0,\n };\n });\n\n const order = updatedKings.reduce((acc, king) => {\n return {\n ...acc,\n [king.order!]: king.id,\n };\n }, {});\n\n const newState = {\n ...state,\n kings: updatedKings,\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 kingId: 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 { kingId, data } = payload;\n const { state } = data;\n\n const currentKing = state.kings.find((king) => king.id === kingId);\n\n if (!currentKing) {\n throw new Error(\"King not found\");\n }\n\n currentKing.hasPlace = true;\n\n const newState = {\n ...state,\n kings: state.kings.map((king) => {\n if (king.id === kingId) {\n return currentKing;\n }\n\n return king;\n }),\n };\n\n return newState;\n};\n\nexport { pass };\n", "import type { DominoesRepository } from \"../../port/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\";\n\nexport type GameDependencies = {\n dominoesRepository: DominoesRepository;\n uuidMethod: () => string;\n randomMethod<T>(array: T[]): T[];\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 kingId: 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 isKingTurn = (state: Game, kingId: string): boolean => {\n const { kings, currentDominoes } = state;\n const currentKingOrder = kings.find((king) => king.id === kingId)?.order;\n\n const pickedDominoes = currentDominoes.filter(\n (currentDomino) => currentDomino.picked\n );\n\n if (currentKingOrder !== 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 kings, 4 dominoes per turn, 6 turns\n// 3 players => 36 dominoes, 1 king, 3 dominoes per turn, 12 turns\n// 4 players => 48 dominoes, 1 king, 4 dominoes per turn, 12 turns\nexport const rules: {\n [key: number]: {\n kings: number;\n maxDominoes: number;\n dominoesPerTurn: number;\n maxTurns: number;\n };\n} = {\n 2: {\n kings: 2,\n maxDominoes: 24,\n dominoesPerTurn: 4,\n maxTurns: 6,\n },\n 3: {\n kings: 1,\n maxDominoes: 36,\n dominoesPerTurn: 3,\n maxTurns: 12,\n },\n 4: {\n kings: 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", "import inMemoryDominoes from \"../../infrastructure/repositories/inMemoryDominoes.js\";\nimport { availableMode, type Game } from \"../../domain/entities/game.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"../../domain/entities/kingdom.js\";\nimport gameStep, {\n type GameDependencies,\n} from \"../../domain/useCases/game/game.js\";\nimport {\n result,\n type FinalResult,\n type ScoreResult,\n} from \"../../domain/useCases/game/result.js\";\n\nexport type Resp = {\n nextKing: 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 const dependencies: GameDependencies = {\n dominoesRepository: inMemoryDominoes(),\n uuidMethod: () => `uuid-${Math.random()}`,\n randomMethod: (array) => array,\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 nextKing: drawState.kings[0]!.id,\n nextAction: \"pick\",\n game: drawState,\n };\n };\n\n const passTurn = (game: Game, kingId: string): Resp => {\n const updatedGame = pass({\n kingId,\n action: \"pass\",\n data: {\n state: game,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"pass\", kingId);\n\n return resp;\n };\n\n const placeDomino = (\n game: Game,\n kingId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n ): Resp => {\n const updatedGame = place({\n kingId,\n action: \"place\",\n data: {\n state: game,\n position,\n orientation,\n rotation,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"place\", kingId);\n\n return resp;\n };\n\n const pickDomino = (game: Game, kingId: string, dominoPick: number): Resp => {\n const updatedGame = pick({\n kingId,\n action: \"pick\",\n data: {\n state: game,\n dominoPick,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"pick\", kingId);\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 currentKingId: string\n ): Resp => {\n const { kings, turn } = game;\n\n if (turn === 0) {\n const nextKing = kings.find((king) => !king.hasPick);\n if (!nextKing) {\n const newState = prepareNextTurn(game);\n return {\n nextKing: newState.kings[0]!.id,\n nextAction: \"place\",\n game: newState,\n };\n }\n return {\n nextKing: nextKing.id,\n nextAction: \"pick\",\n game,\n };\n }\n\n if (currentAction === \"place\" || currentAction === \"pass\") {\n if (game.turn === game.maxTurns) {\n const nextKing = kings.find((king) => !king.hasPlace);\n if (!nextKing) {\n return {\n nextKing: \"none\",\n nextAction: \"end\",\n game,\n };\n }\n return {\n nextKing: nextKing!.id,\n nextAction: \"place\",\n game,\n };\n }\n return {\n nextKing: currentKingId,\n nextAction: \"pick\",\n game,\n };\n }\n\n const allKingsHavePicked = kings.every((king) => king.hasPick);\n\n if (allKingsHavePicked) {\n const newState = prepareNextTurn(game);\n return {\n nextKing: newState.order[\"1\"]!,\n nextAction: \"place\",\n game: newState,\n };\n }\n\n const nextKing = kings.find((king) => !king.hasPlace);\n\n return {\n nextKing: nextKing!.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", "import gameEngine from \"./application/engine/index.js\";\n\nexport default gameEngine;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["dominoes_default", "inMemoryDominoes", "dominoes", "dominoes_default", "domino", "inMemoryDominoes_default", "availableMode", "init", "dependencies", "dominoes", "createEmptyKingdom", "emptyTile", "createKingdomWithCastle", "kingdom", "placeTile", "position", "tile", "newRow", "getTile", "grid", "calculateDominoPosition", "orientation", "rotation", "domino", "firstTile", "secondTile", "placeDomino", "isFreePlace", "isFitIntoTheGrid", "adjacentTiles", "isAdjacent", "hasValidAdjacent", "placeTiles", "tiles", "newKingdom", "firstPosition", "secondPosition", "xFirstPosition", "yFirstPosition", "xSecondPosition", "ySecondPosition", "adjacentTilesKeys", "pos", "key", "adjacentTile", "positions", "simulateNewGrid", "lines", "line", "columns", "_", "index", "linesLength", "columnsLength", "maxLineLength", "maxColumnLength", "kingdom_default", "setup", "dependencies", "payload", "state", "players", "dominoes", "randomMethod", "uuidMethod", "maxDominoes", "dominoesPerTurn", "maxTurns", "rules", "shuffledDominoes", "newPlayers", "player", "kingdom_default", "newKings", "index", "kingsWithOrder", "king", "a", "b", "startTurn", "payload", "state", "turn", "kings", "king", "pick", "payload", "kingId", "data", "state", "dominoPick", "currentDominoes", "kings", "isKingTurn", "king", "domino", "checkValidityDomino", "updatedCurrentDominoes", "updatedKings", "place", "payload", "kingId", "data", "state", "position", "orientation", "rotation", "currentKing", "king", "currentPlayer", "player", "currentKingdom", "domino", "kingdom_default", "definePlayerOrder", "payload", "state", "kings", "currentDominoes", "king", "updatedKings", "domino", "order", "acc", "draw", "payload", "state", "dominoesCopy", "dominoesDrawn", "a", "b", "domino", "index", "calculateScore", "kingdom", "visited", "row", "properties", "directions", "markZone", "x", "y", "type", "crowns", "currentZone", "property", "tx", "ty", "dx", "dy", "nx", "ny", "tile", "score", "maxPropertiesSize", "totalCrowns", "total", "pass", "payload", "kingId", "data", "state", "currentKing", "king", "gameStep", "dependencies", "init", "setup", "startTurn", "pick", "place", "pass", "definePlayerOrder", "draw", "calculateScore", "isKingTurn", "state", "kingId", "kings", "currentDominoes", "currentKingOrder", "king", "pickedDominoes", "currentDomino", "checkValidityDomino", "dominoPick", "domino", "rules", "game_default", "result", "scores", "a", "b", "isTie", "i", "currentScore", "previousScore", "gameEngine", "dependencies", "inMemoryDominoes_default", "array", "init", "setup", "startTurn", "pick", "place", "pass", "definePlayerOrder", "draw", "calculateScore", "game_default", "getMode", "availableMode", "setMode", "mode", "game", "getRules", "setRules", "rules", "start", "players", "setupState", "drawState", "passTurn", "kingId", "updatedGame", "defineNextAction", "placeDomino", "position", "orientation", "rotation", "pickDomino", "dominoPick", "prepareNextTurn", "updatedOrder", "updateDraw", "updateTurn", "currentAction", "currentKingId", "kings", "turn", "nextKing", "king", "newState", "scores", "player", "score", "result", "engine_default", "src_default", "engine_default"]
|
|
7
|
-
}
|
|
1
|
+
{"version":3,"sources":["../src/infrastructure/data/dominoes.json","../src/infrastructure/repositories/inMemoryDominoes.ts","../src/domain/entities/game.ts","../src/domain/useCases/game/init.ts","../src/domain/entities/kingdom.ts","../src/domain/useCases/game/setup.ts","../src/domain/useCases/game/startTurn.ts","../src/domain/useCases/game/pick.ts","../src/domain/useCases/game/place.ts","../src/domain/useCases/game/order.ts","../src/domain/useCases/game/draw.ts","../src/domain/useCases/game/scoring.ts","../src/domain/useCases/game/pass.ts","../src/domain/useCases/game/game.ts","../src/domain/useCases/game/result.ts","../src/application/engine/index.ts","../src/index.ts"],"sourcesContent":["[\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 \"../../domain/entities/domino\";\nimport dominoesJson from \"../data/dominoes.json\" assert { type: \"json\" };\nimport type { DominoesRepository } from \"../../domain/port/dominoesRepository\";\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 { Domino, RevealsDomino } from \"./domino\";\nimport type { Kingdom } from \"./kingdom\";\n\nexport type King = {\n id: string;\n playerId: string;\n order: number;\n turnEnded: boolean;\n hasPick: boolean;\n hasPlace: boolean;\n dominoPicked?: Domino;\n};\n\nexport type Player = {\n id?: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport const availableMode = [\"Classic\"] as const;\nexport type AvailableMode = (typeof availableMode)[number];\nexport const isValidMode = (mode: string): mode is AvailableMode => {\n return availableMode.includes(mode as AvailableMode);\n};\n\nexport type Rule = {\n name: string;\n description: string;\n mode: AvailableMode[];\n playersLimit?: number;\n};\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n kings: King[];\n turn: number;\n maxTurns: number;\n maxDominoes: number;\n dominoesPerTurn: number;\n order: Record<number, string>;\n rules?: Rule[];\n};\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 kings: [],\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 \"domain/entities/domino\";\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, King, Player } from \"../../entities/game.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 { randomMethod, uuidMethod } = dependencies;\n const { maxDominoes, dominoesPerTurn, maxTurns } = rules[players.length]!;\n const shuffledDominoes = randomMethod(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 newKings: King[];\n if (newPlayers.length === 2) {\n newKings = [\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 newKings = 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 kingsWithOrder = randomMethod(newKings);\n\n kingsWithOrder.forEach((king, index) => {\n king.order = index + 1;\n });\n\n kingsWithOrder.sort((a, b) => a.order - b.order);\n\n const newState = {\n ...state,\n dominoes: shuffledDominoes,\n players: newPlayers,\n kings: kingsWithOrder,\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 kings = state.kings;\n\n kings.forEach((king) => {\n king.turnEnded = false;\n king.hasPick = false;\n king.hasPlace = false;\n });\n\n const updatedState = {\n ...state,\n kings,\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 isKingTurn,\n} from \"./game.js\";\n\nconst pick = (payload: PlayerActionPayload<\"pick\">): Game => {\n const { kingId, data } = payload;\n const { state, dominoPick } = data;\n const { currentDominoes, kings } = state;\n\n // Check if it is the king's turn\n if (!isKingTurn(state, kingId)) {\n throw new Error(\"It is not your turn\");\n }\n\n // Check if king has already picked\n const king = kings.find((king) => king.id === kingId);\n if (king?.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.kingId = kingId;\n }\n\n return domino;\n });\n\n // update kings\n const updatedKings = kings.map((king) => {\n if (king.id === kingId) {\n king.hasPick = true;\n king.turnEnded = true;\n king.dominoPicked = domino.domino;\n }\n\n return king;\n });\n\n // update state\n const updatedState = {\n ...state,\n currentDominoes: updatedCurrentDominoes,\n kings: updatedKings,\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 { kingId, data } = payload;\n const { state, position, orientation, rotation } = data;\n\n const currentKing = state.kings.find((king) => king.id === kingId);\n const currentPlayer = state.players.find(\n (player) => player.id === currentKing?.playerId\n );\n const currentKingdom = currentPlayer?.kingdom;\n\n if (!currentKingdom) {\n throw new Error(\"Kingdom not found\");\n }\n\n const domino = currentKing?.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 currentKing.hasPlace = true;\n\n const newState = {\n ...state,\n kings: state.kings.map((king) => {\n if (king.id === kingId) {\n return currentKing;\n }\n\n return king;\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 { kings, currentDominoes } = state;\n\n const allKingsHavePlayed = kings.every((king) => king.turnEnded);\n\n if (!allKingsHavePlayed) {\n throw new Error(\"Not all kings have played\");\n }\n\n const updatedKings = kings.map((king) => {\n return {\n ...king,\n order:\n currentDominoes.find((domino) => domino.kingId === king.id)?.position ||\n 0,\n };\n });\n\n const order = updatedKings.reduce((acc, king) => {\n return {\n ...acc,\n [king.order!]: king.id,\n };\n }, {});\n\n const newState = {\n ...state,\n kings: updatedKings,\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 kingId: 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 { kingId, data } = payload;\n const { state } = data;\n\n const currentKing = state.kings.find((king) => king.id === kingId);\n\n if (!currentKing) {\n throw new Error(\"King not found\");\n }\n\n currentKing.hasPlace = true;\n\n const newState = {\n ...state,\n kings: state.kings.map((king) => {\n if (king.id === kingId) {\n return currentKing;\n }\n\n return king;\n }),\n };\n\n return newState;\n};\n\nexport { pass };\n","import type { DominoesRepository } from \"../../port/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\";\n\nexport type GameDependencies = {\n dominoesRepository: DominoesRepository;\n uuidMethod: () => string;\n randomMethod<T>(array: T[]): T[];\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 kingId: 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 isKingTurn = (state: Game, kingId: string): boolean => {\n const { kings, currentDominoes } = state;\n const currentKingOrder = kings.find((king) => king.id === kingId)?.order;\n\n const pickedDominoes = currentDominoes.filter(\n (currentDomino) => currentDomino.picked\n );\n\n if (currentKingOrder !== 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 kings, 4 dominoes per turn, 6 turns\n// 3 players => 36 dominoes, 1 king, 3 dominoes per turn, 12 turns\n// 4 players => 48 dominoes, 1 king, 4 dominoes per turn, 12 turns\nexport const rules: {\n [key: number]: {\n kings: number;\n maxDominoes: number;\n dominoesPerTurn: number;\n maxTurns: number;\n };\n} = {\n 2: {\n kings: 2,\n maxDominoes: 24,\n dominoesPerTurn: 4,\n maxTurns: 6,\n },\n 3: {\n kings: 1,\n maxDominoes: 36,\n dominoesPerTurn: 3,\n maxTurns: 12,\n },\n 4: {\n kings: 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","import inMemoryDominoes from \"../../infrastructure/repositories/inMemoryDominoes.js\";\nimport { availableMode, type Game } from \"../../domain/entities/game.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"../../domain/entities/kingdom.js\";\nimport gameStep, {\n type GameDependencies,\n} from \"../../domain/useCases/game/game.js\";\nimport {\n result,\n type FinalResult,\n type ScoreResult,\n} from \"../../domain/useCases/game/result.js\";\n\nexport type Resp = {\n nextKing: 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 const dependencies: GameDependencies = {\n dominoesRepository: inMemoryDominoes(),\n uuidMethod: () => `uuid-${Math.random()}`,\n randomMethod: (array) => array,\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 nextKing: drawState.kings[0]!.id,\n nextAction: \"pick\",\n game: drawState,\n };\n };\n\n const passTurn = (game: Game, kingId: string): Resp => {\n const updatedGame = pass({\n kingId,\n action: \"pass\",\n data: {\n state: game,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"pass\", kingId);\n\n return resp;\n };\n\n const placeDomino = (\n game: Game,\n kingId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n ): Resp => {\n const updatedGame = place({\n kingId,\n action: \"place\",\n data: {\n state: game,\n position,\n orientation,\n rotation,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"place\", kingId);\n\n return resp;\n };\n\n const pickDomino = (game: Game, kingId: string, dominoPick: number): Resp => {\n const updatedGame = pick({\n kingId,\n action: \"pick\",\n data: {\n state: game,\n dominoPick,\n },\n });\n\n const resp = defineNextAction(updatedGame, \"pick\", kingId);\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 currentKingId: string\n ): Resp => {\n const { kings, turn } = game;\n\n if (turn === 0) {\n const nextKing = kings.find((king) => !king.hasPick);\n if (!nextKing) {\n const newState = prepareNextTurn(game);\n return {\n nextKing: newState.kings[0]!.id,\n nextAction: \"place\",\n game: newState,\n };\n }\n return {\n nextKing: nextKing.id,\n nextAction: \"pick\",\n game,\n };\n }\n\n if (currentAction === \"place\" || currentAction === \"pass\") {\n if (game.turn === game.maxTurns) {\n const nextKing = kings.find((king) => !king.hasPlace);\n if (!nextKing) {\n return {\n nextKing: \"none\",\n nextAction: \"end\",\n game,\n };\n }\n return {\n nextKing: nextKing!.id,\n nextAction: \"place\",\n game,\n };\n }\n return {\n nextKing: currentKingId,\n nextAction: \"pick\",\n game,\n };\n }\n\n const allKingsHavePicked = kings.every((king) => king.hasPick);\n\n if (allKingsHavePicked) {\n const newState = prepareNextTurn(game);\n return {\n nextKing: newState.order[\"1\"]!,\n nextAction: \"place\",\n game: newState,\n };\n }\n\n const nextKing = kings.find((king) => !king.hasPlace);\n\n return {\n nextKing: nextKing!.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","import gameEngine from \"./application/engine/index.js\";\n\nexport default gameEngine;\n"],"mappings":"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","names":["kingdom","king","domino","kingdom","score","result","init","setup","startTurn","pick","place","pass","definePlayerOrder","draw","calculateScore","rules","placeDomino","nextKing"]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pompidup/kingdomino-engine",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "A simple engine for the game Kingdomino",
|
|
5
|
-
"main": "./dist/index.
|
|
6
|
-
"module": "./dist/index.js",
|
|
5
|
+
"main": "./dist/index.js",
|
|
7
6
|
"type": "module",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
8
|
"files": [
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
@@ -15,9 +15,9 @@
|
|
|
15
15
|
"scripts": {
|
|
16
16
|
"lint": "tsc",
|
|
17
17
|
"test": "vitest",
|
|
18
|
-
"coverage": "vitest --coverage --config ./vitest.config.ts",
|
|
19
|
-
"build": "
|
|
20
|
-
"
|
|
18
|
+
"coverage": "vitest --coverage --config ./vitest.config.ts",
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"pub": "pnpm build && npm login && npm publish --access public"
|
|
21
21
|
},
|
|
22
22
|
"keywords": [
|
|
23
23
|
"kingdomino",
|
|
@@ -34,9 +34,8 @@
|
|
|
34
34
|
"devDependencies": {
|
|
35
35
|
"@types/node": "^20.11.20",
|
|
36
36
|
"@vitest/coverage-v8": "^1.3.1",
|
|
37
|
-
"esbuild": "0.20.0",
|
|
38
|
-
"esbuild-plugin-d.ts": "^1.2.3",
|
|
39
37
|
"ts-node": "^10.9.2",
|
|
38
|
+
"tsup": "^8.0.2",
|
|
40
39
|
"typescript": "^5.3.3",
|
|
41
40
|
"vitest": "^1.3.1"
|
|
42
41
|
}
|
package/dist/bin/test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/index.cjs.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";var R=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var X=Object.getOwnPropertyNames;var ee=Object.prototype.hasOwnProperty;var te=(e,t)=>{for(var o in t)R(e,o,{get:t[o],enumerable:!0})},re=(e,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of X(t))!ee.call(e,n)&&n!==o&&R(e,n,{get:()=>t[n],enumerable:!(r=U(t,n))||r.enumerable});return e};var ne=e=>re(R({},"__esModule",{value:!0}),e);var he={};te(he,{default:()=>ge});module.exports=ne(he);var v=[{left:{type:"wheat",crowns:0},right:{type:"wheat",crowns:0},number:1},{left:{type:"wheat",crowns:0},right:{type:"wheat",crowns:0},number:2},{left:{type:"forest",crowns:0},right:{type:"forest",crowns:0},number:3},{left:{type:"forest",crowns:0},right:{type:"forest",crowns:0},number:4},{left:{type:"forest",crowns:0},right:{type:"forest",crowns:0},number:5},{left:{type:"forest",crowns:0},right:{type:"forest",crowns:0},number:6},{left:{type:"water",crowns:0},right:{type:"water",crowns:0},number:7},{left:{type:"water",crowns:0},right:{type:"water",crowns:0},number:8},{left:{type:"water",crowns:0},right:{type:"water",crowns:0},number:9},{left:{type:"grass",crowns:0},right:{type:"grass",crowns:0},number:10},{left:{type:"grass",crowns:0},right:{type:"grass",crowns:0},number:11},{left:{type:"swamp",crowns:0},right:{type:"swamp",crowns:0},number:12},{left:{type:"wheat",crowns:0},right:{type:"forest",crowns:0},number:13},{left:{type:"wheat",crowns:0},right:{type:"water",crowns:0},number:14},{left:{type:"wheat",crowns:0},right:{type:"grass",crowns:0},number:15},{left:{type:"wheat",crowns:0},right:{type:"swamp",crowns:0},number:16},{left:{type:"forest",crowns:0},right:{type:"water",crowns:0},number:17},{left:{type:"forest",crowns:0},right:{type:"grass",crowns:0},number:18},{left:{type:"wheat",crowns:1},right:{type:"forest",crowns:0},number:19},{left:{type:"wheat",crowns:1},right:{type:"water",crowns:0},number:20},{left:{type:"wheat",crowns:1},right:{type:"grass",crowns:0},number:21},{left:{type:"wheat",crowns:1},right:{type:"swamp",crowns:0},number:22},{left:{type:"wheat",crowns:1},right:{type:"mine",crowns:0},number:23},{left:{type:"forest",crowns:1},right:{type:"wheat",crowns:0},number:24},{left:{type:"forest",crowns:1},right:{type:"wheat",crowns:0},number:25},{left:{type:"forest",crowns:1},right:{type:"wheat",crowns:0},number:26},{left:{type:"forest",crowns:1},right:{type:"wheat",crowns:0},number:27},{left:{type:"forest",crowns:1},right:{type:"water",crowns:0},number:28},{left:{type:"forest",crowns:1},right:{type:"grass",crowns:0},number:29},{left:{type:"water",crowns:1},right:{type:"wheat",crowns:0},number:30},{left:{type:"water",crowns:1},right:{type:"wheat",crowns:0},number:31},{left:{type:"water",crowns:1},right:{type:"forest",crowns:0},number:32},{left:{type:"water",crowns:1},right:{type:"forest",crowns:0},number:33},{left:{type:"water",crowns:1},right:{type:"forest",crowns:0},number:34},{left:{type:"water",crowns:1},right:{type:"forest",crowns:0},number:35},{left:{type:"wheat",crowns:0},right:{type:"grass",crowns:1},number:36},{left:{type:"water",crowns:0},right:{type:"grass",crowns:1},number:37},{left:{type:"wheat",crowns:0},right:{type:"swamp",crowns:1},number:38},{left:{type:"grass",crowns:0},right:{type:"swamp",crowns:0},number:39},{left:{type:"mine",crowns:1},right:{type:"wheat",crowns:0},number:40},{left:{type:"wheat",crowns:0},right:{type:"grass",crowns:2},number:41},{left:{type:"water",crowns:0},right:{type:"grass",crowns:2},number:42},{left:{type:"wheat",crowns:0},right:{type:"swamp",crowns:2},number:43},{left:{type:"grass",crowns:0},right:{type:"swamp",crowns:2},number:44},{left:{type:"mine",crowns:2},right:{type:"wheat",crowns:0},number:45},{left:{type:"swamp",crowns:0},right:{type:"mine",crowns:2},number:46},{left:{type:"swamp",crowns:0},right:{type:"mine",crowns:2},number:47},{left:{type:"wheat",crowns:0},right:{type:"mine",crowns:3},number:48}];var se=()=>{let e=[];return v.forEach(t=>{e.push({left:{type:t.left.type,crowns:t.left.crowns},right:{type:t.right.type,crowns:t.right.crowns},number:t.number})}),{getAll:()=>e}},j=se;var M=["Classic"];var z=e=>()=>{let t=e.dominoesRepository.getAll();return{id:e.uuidMethod(),dominoes:t,currentDominoes:[],players:[],kings:[],turn:0,maxTurns:0,maxDominoes:0,dominoesPerTurn:0,order:{}}};var I=()=>{let t={type:"empty",crowns:0};return Array.from({length:9},()=>Array.from({length:9},()=>t))},ie=()=>{let e=I();return C(e,{x:4,y:4},{type:"castle",crowns:0})},C=(e,t,o)=>{let r=[...e[t.y]];return r[t.x]=o,[...e.slice(0,t.y),r,...e.slice(t.y+1)]},G=(e,t)=>{let o=e[t.y]?.[t.x];if(o===void 0)throw new Error("Invalid placement (not fit into the grid)");return o},ae=(e,t,o,r)=>{let n,s;return t==="horizontal"?o===0?(n={tile:r.left,position:{x:e.x,y:e.y}},s={tile:r.right,position:{x:e.x+1,y:e.y}}):(n={tile:r.right,position:{x:e.x,y:e.y}},s={tile:r.left,position:{x:e.x+1,y:e.y}}):o===0?(n={tile:r.left,position:{x:e.x,y:e.y}},s={tile:r.right,position:{x:e.x,y:e.y+1}}):(n={tile:r.right,position:{x:e.x,y:e.y}},s={tile:r.left,position:{x:e.x,y:e.y+1}}),[n,s]},ce=(e,t,o,r,n)=>{let[s,a]=ae(t,o,r,n);if(!me(e,s.position,a.position))throw new Error("Invalid placement (not free place)");if(!de(e,[s,a]))throw new Error("Invalid placement (not fit into the grid)");let y=le(e,s.position,a.position);if(y.length===0)throw new Error("Invalid placement (no adjacent)");if(!ue(y,[s.tile,a.tile]))throw new Error("Invalid placement (no valid adjacent)");return pe(e,[s,a])},pe=(e,t)=>t.reduce((o,{tile:r,position:n})=>C(o,n,r),e),me=(e,t,o)=>{let r=G(e,t),n=G(e,o);return!(r.type!=="empty"||n.type!=="empty")},le=(e,t,o)=>{let r=t.x,n=t.y,s=o.x,a=o.y,y=[],i=[{x:r-1,y:n},{x:r,y:n-1},{x:r+1,y:n},{x:r,y:n+1},{x:s-1,y:a},{x:s,y:a-1},{x:s+1,y:a},{x:s,y:a+1}];return i.splice(i.findIndex(c=>c.x===r&&c.y===n),1),i.splice(i.findIndex(c=>c.x===s&&c.y===a),1),i.forEach(c=>{let m=G(e,c);m&&y.push(m)}),y},ue=(e,t)=>e.some(o=>t.some(r=>r.type===o.type||o.type==="castle")),de=(e,t)=>{let r=[...e];r[t[0].position.y][t[0].position.x]=t[0].tile,r[t[1].position.y][t[1].position.x]=t[1].tile;let n=r.map(m=>m.filter(u=>u.type!=="empty")),s=r[0].map((m,u)=>r.map(d=>d[u]).filter(d=>d?.type!=="empty")),a=n.map(m=>m.length),y=s.map(m=>m.length),i=Math.max(...a),c=Math.max(...y);return!(i>5||c>5)},ye={createEmptyKingdom:I,createKingdomWithCastle:ie,getTile:G,placeDomino:ce},S=ye;var O=e=>t=>{let{state:o,players:r}=t;if(!r)throw new Error("There must be at least 2 players");if(r.length>4)throw new Error("There must be no more than 4 players");if(r.length<2)throw new Error("There must be at least 2 players");let{dominoes:n}=o,{randomMethod:s,uuidMethod:a}=e,{maxDominoes:y,dominoesPerTurn:i,maxTurns:c}=F[r.length],m=s(n);m.splice(y);let u=r.map(w=>({...w,kingdom:S.createKingdomWithCastle(),id:a()})),d;u.length===2?d=[{id:a(),playerId:u[0].id,order:1,turnEnded:!1,hasPick:!1,hasPlace:!1},{id:a(),playerId:u[0].id,order:2,turnEnded:!1,hasPick:!1,hasPlace:!1},{id:a(),playerId:u[1].id,order:3,turnEnded:!1,hasPick:!1,hasPlace:!1},{id:a(),playerId:u[1].id,order:4,turnEnded:!1,hasPick:!1,hasPlace:!1}]:d=u.map((w,h)=>({id:a(),playerId:w.id,order:h+1,turnEnded:!1,hasPick:!1,hasPlace:!1}));let l=s(d);return l.forEach((w,h)=>{w.order=h+1}),l.sort((w,h)=>w.order-h.order),{...o,dominoes:m,players:u,kings:l,maxTurns:c,maxDominoes:y,dominoesPerTurn:i,turn:0}};var V=e=>{let{state:t}=e,o=t.turn+1,r=t.kings;return r.forEach(s=>{s.turnEnded=!1,s.hasPick=!1,s.hasPlace=!1}),{game:{...t,kings:r,turn:o}}};var L=e=>{let{kingId:t,data:o}=e,{state:r,dominoPick:n}=o,{currentDominoes:s,kings:a}=r;if(!N(r,t))throw new Error("It is not your turn");if(a.find(l=>l.id===t)?.hasPick)throw new Error("You have already picked");let i=H(r,n);if((l=>l.error!==void 0)(i))throw new Error(i.error);let m=s.map(l=>(l.domino.number===n&&(l.picked=!0,l.kingId=t),l)),u=a.map(l=>(l.id===t&&(l.hasPick=!0,l.turnEnded=!0,l.dominoPicked=i.domino),l));return{...r,currentDominoes:m,kings:u}};var W=e=>{let{kingId:t,data:o}=e,{state:r,position:n,orientation:s,rotation:a}=o,y=r.kings.find(d=>d.id===t),i=r.players.find(d=>d.id===y?.playerId),c=i?.kingdom;if(!c)throw new Error("Kingdom not found");let m=y?.dominoPicked;if(!m)throw new Error("Domino not found");return S.placeDomino(c,n,s,a,m),i.kingdom=c,y.hasPlace=!0,{...r,kings:r.kings.map(d=>d.id===t?y:d)}};var Z=e=>{let{state:t}=e,{kings:o,currentDominoes:r}=t;if(!o.every(i=>i.turnEnded))throw new Error("Not all kings have played");let s=o.map(i=>({...i,order:r.find(c=>c.kingId===i.id)?.position||0})),a=s.reduce((i,c)=>({...i,[c.order]:c.id}),{});return{...t,kings:s,order:a}};var J=e=>{let{state:t}=e,o=[...t.dominoes],r=o.splice(0,t.dominoesPerTurn);return r.sort((s,a)=>s.number-a.number),{...t,dominoes:o,currentDominoes:r.map((s,a)=>({domino:s,picked:!1,kingId:null,position:a+1}))}};var Y=e=>{let t=e.map(i=>i.map(()=>!1)),o=[],r=[[-1,0],[1,0],[0,-1],[0,1]],n=(i,c,m,u)=>{if(i<0||c<0||i>=e[0].length||c>=e.length||t[c][i]||e[c][i].type!==m||e[c][i].type==="empty"||e[c][i].type==="castle")return;t[c][i]=!0;let d=o.find(l=>l.type===m&&l.tiles.some(([T,w])=>{for(let[h,K]of r)if(T+h===i&&w+K===c)return!0;return!1}));d?(d.crowns+=u,d.size++,d.tiles.push([i,c])):o.push({type:m,crowns:u,size:1,tiles:[[i,c]]}),r.forEach(([l,T])=>{let w=i+l,h=c+T;w>=0&&h>=0&&w<e[0].length&&h<e.length&&e[h][w].type===m&&n(w,h,e[h][w].type,e[h][w].crowns)})};if(e.forEach((i,c)=>{i.forEach((m,u)=>{t[c][u]||n(u,c,m.type,m.crowns)})}),o.length===0)return{score:0,maxPropertiesSize:0,totalCrowns:0};let s=o.reduce((i,c)=>i+c.crowns*c.size,0),a=Math.max(...o.map(i=>i.size??0)),y=o.reduce((i,c)=>i+c.crowns,0);return{score:s,maxPropertiesSize:a,totalCrowns:y}};var _=e=>{let{kingId:t,data:o}=e,{state:r}=o,n=r.kings.find(a=>a.id===t);if(!n)throw new Error("King not found");return n.hasPlace=!0,{...r,kings:r.kings.map(a=>a.id===t?n:a)}};var fe=e=>({init:z(e),setup:O(e),startTurn:V,pick:L,place:W,pass:_,definePlayerOrder:Z,draw:J,calculateScore:Y}),N=(e,t)=>{let{kings:o,currentDominoes:r}=e,n=o.find(a=>a.id===t)?.order,s=r.filter(a=>a.picked);return n===s.length+1},H=(e,t)=>{let{currentDominoes:o}=e,r=o.find(n=>n.domino.number===t);return r?r.picked?{error:"Domino already picked"}:r:{error:"Domino not found"}},F={2:{kings:2,maxDominoes:24,dominoesPerTurn:4,maxTurns:6},3:{kings:1,maxDominoes:36,dominoesPerTurn:3,maxTurns:12},4:{kings:1,maxDominoes:48,dominoesPerTurn:4,maxTurns:12}},$=fe;var q=e=>{e.sort((r,n)=>r.details.score!==n.details.score?n.details.score-r.details.score:r.details.maxPropertiesSize!==n.details.maxPropertiesSize?n.details.maxPropertiesSize-r.details.maxPropertiesSize:n.details.totalCrowns-r.details.totalCrowns);let t=[],o=!1;t.push({...e[0],position:1});for(let r=1;r<e.length;r++){let n=e[r],s=e[r-1];s&&n&&n.details.score===s.details.score&&n.details.maxPropertiesSize===s.details.maxPropertiesSize&&n.details.totalCrowns===s.details.totalCrowns&&(o=!0),o?t.push({...n,position:t[r-1].position}):t.push({...n,position:r+1}),o=!1}return t};var we=()=>{let e={dominoesRepository:j(),uuidMethod:()=>`uuid-${Math.random()}`,randomMethod:p=>p},{init:t,setup:o,startTurn:r,pick:n,place:s,pass:a,definePlayerOrder:y,draw:i,calculateScore:c}=$(e),m=()=>M,u=(p,f)=>f,d=p=>[],l=(p,f)=>f,T=(p,f)=>{let x=o({state:p,players:f}),g=i({state:x});return{nextKing:g.kings[0].id,nextAction:"pick",game:g}},w=(p,f)=>{let x=a({kingId:f,action:"pass",data:{state:p}});return E(x,"pass",f)},h=(p,f,x,g,b)=>{let k=s({kingId:f,action:"place",data:{state:p,position:x,orientation:g,rotation:b}});return E(k,"place",f)},K=(p,f,x)=>{let g=n({kingId:f,action:"pick",data:{state:p,dominoPick:x}});return E(g,"pick",f)},A=p=>{let f=y({state:p}),x=i({state:f}),g=r({state:x});if(g.game.turn>g.game.maxTurns)throw new Error("Game is over");return g.game},E=(p,f,x)=>{let{kings:g,turn:b}=p;if(b===0){let P=g.find(D=>!D.hasPick);if(!P){let D=A(p);return{nextKing:D.kings[0].id,nextAction:"place",game:D}}return{nextKing:P.id,nextAction:"pick",game:p}}if(f==="place"||f==="pass"){if(p.turn===p.maxTurns){let P=g.find(D=>!D.hasPlace);return P?{nextKing:P.id,nextAction:"place",game:p}:{nextKing:"none",nextAction:"end",game:p}}return{nextKing:x,nextAction:"pick",game:p}}if(g.every(P=>P.hasPick)){let P=A(p);return{nextKing:P.order[1],nextAction:"place",game:P}}return{nextKing:g.find(P=>!P.hasPlace).id,nextAction:"place",game:p}};return{init:t,getMode:m,setMode:u,getRules:d,setRules:l,start:T,pass:w,placeDomino:h,pickDomino:K,endGame:p=>{let f=p.players,x=[];for(let b of f){let k=c(b.kingdom);x.push({playerId:b.id,playerName:b.name,details:k})}return{result:q(x),game:p}}}},B=we;var ge=B;
|
|
2
|
-
//# sourceMappingURL=index.cjs.js.map
|