@pompidup/kingdomino-engine 1.0.1 → 1.0.2
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.d.ts +110 -0
- package/dist/index.js +1402 -2
- package/dist/index.js.map +1 -7
- package/package.json +6 -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.cjs.js.map
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../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"],
|
|
4
|
-
"sourcesContent": ["import gameEngine from \"./application/engine/index.js\";\n\nexport default gameEngine;\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 \"../../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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["src_exports", "__export", "src_default", "__toCommonJS", "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,9 +0,0 @@
|
|
|
1
|
-
type Dependency<T> = () => T;
|
|
2
|
-
type Container = {
|
|
3
|
-
register: <T>(name: string, dependency: Dependency<T>, isSingleton?: boolean) => void;
|
|
4
|
-
resolve: <T>(name: string) => T;
|
|
5
|
-
reset: () => void;
|
|
6
|
-
remove: (name: string) => void;
|
|
7
|
-
};
|
|
8
|
-
declare const createContainer: () => Container;
|
|
9
|
-
export default createContainer;
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { type Game } from "../../domain/entities/game.js";
|
|
2
|
-
import type { Orientation, Position, Rotation } from "../../domain/entities/kingdom.js";
|
|
3
|
-
import { type FinalResult } from "../../domain/useCases/game/result.js";
|
|
4
|
-
export type Resp = {
|
|
5
|
-
nextKing: string;
|
|
6
|
-
nextAction: "pick" | "place" | "end";
|
|
7
|
-
game: Game;
|
|
8
|
-
};
|
|
9
|
-
export type GameResult = {
|
|
10
|
-
result: FinalResult[];
|
|
11
|
-
game: Game;
|
|
12
|
-
};
|
|
13
|
-
/** Todo
|
|
14
|
-
* Add rules step
|
|
15
|
-
*
|
|
16
|
-
**/
|
|
17
|
-
declare const gameEngine: () => {
|
|
18
|
-
init: () => Game;
|
|
19
|
-
getMode: () => readonly ["Classic"];
|
|
20
|
-
setMode: (mode: string, game: Game) => Game;
|
|
21
|
-
getRules: (mode: string) => never[];
|
|
22
|
-
setRules: (rules: string[], game: Game) => Game;
|
|
23
|
-
start: (game: Game, players: {
|
|
24
|
-
name: string;
|
|
25
|
-
}[]) => Resp;
|
|
26
|
-
pass: (game: Game, kingId: string) => Resp;
|
|
27
|
-
placeDomino: (game: Game, kingId: string, position: Position, orientation: Orientation, rotation: Rotation) => Resp;
|
|
28
|
-
pickDomino: (game: Game, kingId: string, dominoPick: number) => Resp;
|
|
29
|
-
endGame: (game: Game) => GameResult;
|
|
30
|
-
};
|
|
31
|
-
export default gameEngine;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Game } from "../entities/game.js";
|
|
2
|
-
import type { Orientation, Position, Rotation } from "../entities/kingdom.js";
|
|
3
|
-
export type Resp = {
|
|
4
|
-
nextKing: string;
|
|
5
|
-
nextAction: "pick" | "place";
|
|
6
|
-
game: Game;
|
|
7
|
-
};
|
|
8
|
-
declare const gameEngine: () => {
|
|
9
|
-
start: (players: {
|
|
10
|
-
name: string;
|
|
11
|
-
}[]) => Promise<Resp>;
|
|
12
|
-
placeDomino: (gameId: string, kingId: string, position: Position, orientation: Orientation, rotation: Rotation) => Promise<Resp>;
|
|
13
|
-
pickDomino: (gameId: string, kingId: string, dominoPick: number) => Promise<Resp>;
|
|
14
|
-
};
|
|
15
|
-
export default gameEngine;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
declare const ground: readonly ["castle", "wheat", "forest", "sea", "plain", "swamp", "mine"];
|
|
2
|
-
export type Ground = (typeof ground)[number];
|
|
3
|
-
export type Tile = {
|
|
4
|
-
type: Ground;
|
|
5
|
-
crowns: number;
|
|
6
|
-
};
|
|
7
|
-
export type EmptyTile = {
|
|
8
|
-
type: "empty";
|
|
9
|
-
crowns: 0;
|
|
10
|
-
};
|
|
11
|
-
export type Domino = {
|
|
12
|
-
left: Tile;
|
|
13
|
-
right: Tile;
|
|
14
|
-
number: number;
|
|
15
|
-
};
|
|
16
|
-
export type RevealsDomino = {
|
|
17
|
-
domino: Domino;
|
|
18
|
-
picked: boolean;
|
|
19
|
-
kingId: string | null;
|
|
20
|
-
position: number;
|
|
21
|
-
};
|
|
22
|
-
export {};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { Domino, RevealsDomino } from "./domino";
|
|
2
|
-
import type { Kingdom } from "./kingdom";
|
|
3
|
-
export type King = {
|
|
4
|
-
id: string;
|
|
5
|
-
playerId: string;
|
|
6
|
-
order: number;
|
|
7
|
-
turnEnded: boolean;
|
|
8
|
-
hasPick: boolean;
|
|
9
|
-
hasPlace: boolean;
|
|
10
|
-
dominoPicked?: Domino;
|
|
11
|
-
};
|
|
12
|
-
export type Player = {
|
|
13
|
-
id?: string;
|
|
14
|
-
name: string;
|
|
15
|
-
kingdom: Kingdom;
|
|
16
|
-
};
|
|
17
|
-
export declare const availableMode: readonly ["Classic"];
|
|
18
|
-
export type AvailableMode = (typeof availableMode)[number];
|
|
19
|
-
export declare const isValidMode: (mode: string) => mode is "Classic";
|
|
20
|
-
export type Rule = {
|
|
21
|
-
name: string;
|
|
22
|
-
description: string;
|
|
23
|
-
mode: AvailableMode[];
|
|
24
|
-
playersLimit?: number;
|
|
25
|
-
};
|
|
26
|
-
export type Game = {
|
|
27
|
-
id: string;
|
|
28
|
-
dominoes: Domino[];
|
|
29
|
-
currentDominoes: RevealsDomino[];
|
|
30
|
-
players: Player[];
|
|
31
|
-
kings: King[];
|
|
32
|
-
turn: number;
|
|
33
|
-
maxTurns: number;
|
|
34
|
-
maxDominoes: number;
|
|
35
|
-
dominoesPerTurn: number;
|
|
36
|
-
order: Record<number, string>;
|
|
37
|
-
rules?: Rule[];
|
|
38
|
-
};
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { Domino, Tile, EmptyTile } from "domain/entities/domino";
|
|
2
|
-
export type Position = {
|
|
3
|
-
x: number;
|
|
4
|
-
y: number;
|
|
5
|
-
};
|
|
6
|
-
export type Orientation = "vertical" | "horizontal";
|
|
7
|
-
export type Rotation = 0 | 180;
|
|
8
|
-
export type Kingdom = (Tile | EmptyTile)[][];
|
|
9
|
-
declare const kingdom: {
|
|
10
|
-
createEmptyKingdom: () => Kingdom;
|
|
11
|
-
createKingdomWithCastle: () => Kingdom;
|
|
12
|
-
getTile: (grid: Kingdom, position: Position) => Tile | EmptyTile;
|
|
13
|
-
placeDomino: (kingdom: Kingdom, position: Position, orientation: "vertical" | "horizontal", rotation: 0 | 180, domino: Domino) => Kingdom;
|
|
14
|
-
};
|
|
15
|
-
export default kingdom;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import type { DominoesRepository } from "../../port/dominoesRepository.js";
|
|
2
|
-
import type { Position } from "../../entities/kingdom.js";
|
|
3
|
-
import type { Game } from "../../entities/game.js";
|
|
4
|
-
export type GameDependencies = {
|
|
5
|
-
dominoesRepository: DominoesRepository;
|
|
6
|
-
uuidMethod: () => string;
|
|
7
|
-
randomMethod<T>(array: T[]): T[];
|
|
8
|
-
};
|
|
9
|
-
export declare const playerAction: {
|
|
10
|
-
readonly pick: "pick";
|
|
11
|
-
readonly place: "place";
|
|
12
|
-
readonly pass: "pass";
|
|
13
|
-
};
|
|
14
|
-
type ObjectValues<T> = T[keyof T];
|
|
15
|
-
export type PlayerAction = ObjectValues<typeof playerAction>;
|
|
16
|
-
type PickData = {
|
|
17
|
-
state: Game;
|
|
18
|
-
dominoPick: number;
|
|
19
|
-
};
|
|
20
|
-
type PlaceData = {
|
|
21
|
-
state: Game;
|
|
22
|
-
position: Position;
|
|
23
|
-
orientation: "vertical" | "horizontal";
|
|
24
|
-
rotation: 0 | 180;
|
|
25
|
-
};
|
|
26
|
-
type PassData = {
|
|
27
|
-
state: Game;
|
|
28
|
-
};
|
|
29
|
-
type ActionToDataMap = {
|
|
30
|
-
pick: PickData;
|
|
31
|
-
place: PlaceData;
|
|
32
|
-
pass: PassData;
|
|
33
|
-
};
|
|
34
|
-
export type PlayerActionPayload<T extends PlayerAction> = {
|
|
35
|
-
kingId: string;
|
|
36
|
-
action: T;
|
|
37
|
-
data: ActionToDataMap[T];
|
|
38
|
-
};
|
|
39
|
-
declare const gameStep: (dependencies: GameDependencies) => {
|
|
40
|
-
init: () => Game;
|
|
41
|
-
setup: (payload: {
|
|
42
|
-
state: Game;
|
|
43
|
-
players: {
|
|
44
|
-
name: string;
|
|
45
|
-
}[];
|
|
46
|
-
}) => Game;
|
|
47
|
-
startTurn: (payload: {
|
|
48
|
-
state: Game;
|
|
49
|
-
}) => {
|
|
50
|
-
game: Game;
|
|
51
|
-
};
|
|
52
|
-
pick: (payload: PlayerActionPayload<"pick">) => Game;
|
|
53
|
-
place: (payload: PlayerActionPayload<"place">) => Game;
|
|
54
|
-
pass: (payload: PlayerActionPayload<"pass">) => Game;
|
|
55
|
-
definePlayerOrder: (payload: {
|
|
56
|
-
state: Game;
|
|
57
|
-
}) => Game;
|
|
58
|
-
draw: (payload: {
|
|
59
|
-
state: Game;
|
|
60
|
-
}) => Game;
|
|
61
|
-
calculateScore: (kingdom: import("../../entities/kingdom.js").Kingdom) => import("./scoring.js").Score;
|
|
62
|
-
};
|
|
63
|
-
export declare const isKingTurn: (state: Game, kingId: string) => boolean;
|
|
64
|
-
export type CustomError = {
|
|
65
|
-
error: string;
|
|
66
|
-
};
|
|
67
|
-
export declare const checkValidityDomino: (state: Game, dominoPick: number) => import("../../entities/domino.js").RevealsDomino | CustomError;
|
|
68
|
-
export declare const rules: {
|
|
69
|
-
[key: number]: {
|
|
70
|
-
kings: number;
|
|
71
|
-
maxDominoes: number;
|
|
72
|
-
dominoesPerTurn: number;
|
|
73
|
-
maxTurns: number;
|
|
74
|
-
};
|
|
75
|
-
};
|
|
76
|
-
export default gameStep;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Score } from "./scoring.js";
|
|
2
|
-
export type ScoreResult = {
|
|
3
|
-
playerId: string;
|
|
4
|
-
playerName: string;
|
|
5
|
-
details: Score;
|
|
6
|
-
};
|
|
7
|
-
export type FinalResult = ScoreResult & {
|
|
8
|
-
position: number;
|
|
9
|
-
};
|
|
10
|
-
declare const result: (scores: ScoreResult[]) => FinalResult[];
|
|
11
|
-
export { result };
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Game } from "../../entities/game.js";
|
|
2
|
-
import { type GameDependencies } from "./game.js";
|
|
3
|
-
type SetupPayload = {
|
|
4
|
-
state: Game;
|
|
5
|
-
players: {
|
|
6
|
-
name: string;
|
|
7
|
-
}[];
|
|
8
|
-
};
|
|
9
|
-
declare const setup: (dependencies: GameDependencies) => (payload: SetupPayload) => Game;
|
|
10
|
-
export { setup };
|
package/dist/src/index.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { Game } from "domain/entities/game";
|
|
2
|
-
import type { GamesRepository } from "domain/port/gamesRepository";
|
|
3
|
-
interface InMemoryGamesRepository extends GamesRepository {
|
|
4
|
-
setup: (game: Game) => Promise<void>;
|
|
5
|
-
reset: () => Promise<void>;
|
|
6
|
-
}
|
|
7
|
-
declare const inMemoryGamesRepository: () => InMemoryGamesRepository;
|
|
8
|
-
export default inMemoryGamesRepository;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type Dependency<T> = () => T;
|
|
2
|
-
type Container = {
|
|
3
|
-
register: <T>(name: string, dependency: Dependency<T>, isSingleton?: boolean) => void;
|
|
4
|
-
resolve: <T>(name: string) => T;
|
|
5
|
-
reset: () => void;
|
|
6
|
-
remove: (name: string) => void;
|
|
7
|
-
};
|
|
8
|
-
declare const createContainer: () => Container;
|
|
9
|
-
export default createContainer;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Game } from "../domain/entities/game.js";
|
|
2
|
-
import type { Domino, EmptyTile, Tile } from "../domain/entities/domino.js";
|
|
3
|
-
declare const helper: () => {
|
|
4
|
-
setupGame: (nbPlayers: number, allDominoes: Domino[], firstPick?: boolean, turnCompleted?: boolean) => Game;
|
|
5
|
-
displayGrid: (grid: (Tile | EmptyTile)[][]) => void;
|
|
6
|
-
};
|
|
7
|
-
export default helper;
|