@pompidup/kingdomino-engine 2.1.2 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +160 -102
- package/dist/index.js.map +1 -1
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -180,6 +180,12 @@ You can get the results by calling the `getResults` method:
|
|
|
180
180
|
gameState = engine.getResults({ game: gameState });
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
+
You have the possibility to get the results at any time of a kingdom, you can use `calculateScore` method:
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
const score = engine.calculateScore({ kingdom: gameState.players[0].kingdom });
|
|
187
|
+
```
|
|
188
|
+
|
|
183
189
|
## Extra Rules
|
|
184
190
|
|
|
185
191
|
The engine supports extra rules that can modify gameplay. Some examples include:
|
package/dist/index.d.ts
CHANGED
|
@@ -174,6 +174,10 @@ type GetResultCommand = {
|
|
|
174
174
|
game: GameState;
|
|
175
175
|
};
|
|
176
176
|
|
|
177
|
+
type CalculateScoreCommand = {
|
|
178
|
+
kingdom: Kingdom;
|
|
179
|
+
};
|
|
180
|
+
|
|
177
181
|
type GameEngine = {
|
|
178
182
|
getModes: (command: GetModesCommand) => GameMode[];
|
|
179
183
|
getExtraRules: (command: GetExtraRulesCommand) => ExtraRule[];
|
|
@@ -185,6 +189,7 @@ type GameEngine = {
|
|
|
185
189
|
placeDomino: (command: PlaceDominoCommand) => GameState;
|
|
186
190
|
discardDomino: (command: DiscardDominoCommand) => GameState;
|
|
187
191
|
getResults: (command: GetResultCommand) => GameWithResults;
|
|
192
|
+
calculateScore: (command: CalculateScoreCommand) => Score;
|
|
188
193
|
};
|
|
189
194
|
|
|
190
195
|
type ShuffleMethod = <T>(array: T[]) => T[];
|
package/dist/index.js
CHANGED
|
@@ -761,7 +761,9 @@ var addExtraRulesHandler = (logger, useCase) => (command) => {
|
|
|
761
761
|
logger.info(`Adding extra rules to game: ${game.id}`);
|
|
762
762
|
logger.info(`Extra rules: ${extraRules}`);
|
|
763
763
|
if (!isGameWithNextStep(game)) {
|
|
764
|
-
logger.error(
|
|
764
|
+
logger.error(
|
|
765
|
+
`Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`
|
|
766
|
+
);
|
|
765
767
|
throw new InvalidStepError("Required game with nextAction type: 'step'");
|
|
766
768
|
}
|
|
767
769
|
if (game.nextAction.step !== "options") {
|
|
@@ -784,7 +786,9 @@ var addPlayersHandler = (logger, useCase) => (command) => {
|
|
|
784
786
|
const { game, players } = command;
|
|
785
787
|
logger.info(`Adding players to game: ${game.id}`);
|
|
786
788
|
if (!isGameWithNextStep(game)) {
|
|
787
|
-
logger.error(
|
|
789
|
+
logger.error(
|
|
790
|
+
`Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`
|
|
791
|
+
);
|
|
788
792
|
throw new InvalidStepError("Required game with nextAction type: 'step'");
|
|
789
793
|
}
|
|
790
794
|
if (game.nextAction.step !== "addPlayers") {
|
|
@@ -809,7 +813,9 @@ var chooseDominoHandler = (logger, useCase) => (command) => {
|
|
|
809
813
|
`Choosing domino: ${dominoPick} for lord: ${lordId} in game: ${game.id}`
|
|
810
814
|
);
|
|
811
815
|
if (!isGameWithNextAction(game)) {
|
|
812
|
-
logger.error(
|
|
816
|
+
logger.error(
|
|
817
|
+
`Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`
|
|
818
|
+
);
|
|
813
819
|
throw new InvalidStepError(
|
|
814
820
|
"Required game with nextAction type: 'action'"
|
|
815
821
|
);
|
|
@@ -848,7 +854,9 @@ var discardDominoHandler = (logger, useCase) => (command) => {
|
|
|
848
854
|
const { game, lordId } = command;
|
|
849
855
|
logger.info(`Discarding domino for lord: ${lordId} in game: ${game.id}`);
|
|
850
856
|
if (!isGameWithNextAction(game)) {
|
|
851
|
-
logger.error(
|
|
857
|
+
logger.error(
|
|
858
|
+
`Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`
|
|
859
|
+
);
|
|
852
860
|
throw new InvalidStepError(
|
|
853
861
|
"Required game with nextAction type: 'action'"
|
|
854
862
|
);
|
|
@@ -900,11 +908,14 @@ var getModesHandler = (logger, useCase) => (_command) => {
|
|
|
900
908
|
};
|
|
901
909
|
|
|
902
910
|
// src/application/handlers/getResultHandler.ts
|
|
903
|
-
var getResultHandler = (logger,
|
|
911
|
+
var getResultHandler = (logger, useCases) => (command) => {
|
|
912
|
+
const { getResultUseCase: getResultUseCase2, calculateScoreUseCase: calculateScoreUseCase2 } = useCases;
|
|
904
913
|
const { game } = command;
|
|
905
914
|
logger.info(`Getting result for game: ${game.id}`);
|
|
906
915
|
if (!isGameWithNextStep(game)) {
|
|
907
|
-
logger.error(
|
|
916
|
+
logger.error(
|
|
917
|
+
`Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`
|
|
918
|
+
);
|
|
908
919
|
throw new InvalidStepError("Required game with nextAction type: 'step'");
|
|
909
920
|
}
|
|
910
921
|
if (game.nextAction.step !== "result") {
|
|
@@ -913,7 +924,24 @@ var getResultHandler = (logger, useCase) => (command) => {
|
|
|
913
924
|
);
|
|
914
925
|
throw new InvalidStepError("Required game with result step");
|
|
915
926
|
}
|
|
916
|
-
|
|
927
|
+
let scoreResult;
|
|
928
|
+
const { players } = game;
|
|
929
|
+
scoreResult = players.map((player) => {
|
|
930
|
+
const { kingdom } = player;
|
|
931
|
+
const result2 = calculateScoreUseCase2(kingdom);
|
|
932
|
+
if (isErr(result2)) {
|
|
933
|
+
logger.error(`Error when calculating score: ${result2.error}`);
|
|
934
|
+
throw new StepExecutionError(result2.error);
|
|
935
|
+
}
|
|
936
|
+
return {
|
|
937
|
+
playerId: player.id,
|
|
938
|
+
playerName: player.name,
|
|
939
|
+
details: {
|
|
940
|
+
...result2.value
|
|
941
|
+
}
|
|
942
|
+
};
|
|
943
|
+
});
|
|
944
|
+
const result = getResultUseCase2(game, scoreResult);
|
|
917
945
|
if (isErr(result)) {
|
|
918
946
|
logger.error(`Error getting result: ${result.error}`);
|
|
919
947
|
throw new NotFoundError(result.error);
|
|
@@ -931,7 +959,9 @@ var placeDominoHandler = (logger, useCase) => (command) => {
|
|
|
931
959
|
)} with orientation: ${orientation} and rotation: ${rotation} in game: ${game.id}`
|
|
932
960
|
);
|
|
933
961
|
if (!isGameWithNextAction(game)) {
|
|
934
|
-
logger.error(
|
|
962
|
+
logger.error(
|
|
963
|
+
`Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`
|
|
964
|
+
);
|
|
935
965
|
throw new InvalidStepError(
|
|
936
966
|
"Required game with nextAction type: 'action'"
|
|
937
967
|
);
|
|
@@ -968,7 +998,9 @@ var startGameHandler = (logger, useCase) => (command) => {
|
|
|
968
998
|
const { game } = command;
|
|
969
999
|
logger.info(`Starting game: ${game.id}`);
|
|
970
1000
|
if (!isGameWithNextStep(game)) {
|
|
971
|
-
logger.error(
|
|
1001
|
+
logger.error(
|
|
1002
|
+
`Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`
|
|
1003
|
+
);
|
|
972
1004
|
throw new InvalidStepError("Required game with nextAction type: 'step'");
|
|
973
1005
|
}
|
|
974
1006
|
if (game.nextAction.step !== "start" && game.nextAction.step !== "options") {
|
|
@@ -988,6 +1020,19 @@ var startGameHandler = (logger, useCase) => (command) => {
|
|
|
988
1020
|
return result.value;
|
|
989
1021
|
};
|
|
990
1022
|
|
|
1023
|
+
// src/application/handlers/calculateScoreHandler.ts
|
|
1024
|
+
var calculateScoreHandler = (logger, useCase) => (command) => {
|
|
1025
|
+
const { kingdom } = command;
|
|
1026
|
+
logger.info(`Calculating score for kingdom`);
|
|
1027
|
+
const result = useCase(kingdom);
|
|
1028
|
+
if (isErr(result)) {
|
|
1029
|
+
logger.error(`Error calculating score: ${result.error}`);
|
|
1030
|
+
throw new Error(result.error);
|
|
1031
|
+
}
|
|
1032
|
+
logger.info(`Score calculated: ${result.value}`);
|
|
1033
|
+
return result.value;
|
|
1034
|
+
};
|
|
1035
|
+
|
|
991
1036
|
// src/core/domain/types/kingdom.ts
|
|
992
1037
|
var GRIDSIZE = 9;
|
|
993
1038
|
|
|
@@ -1615,113 +1660,44 @@ var getModesUseCase = (deps) => () => {
|
|
|
1615
1660
|
};
|
|
1616
1661
|
|
|
1617
1662
|
// src/core/useCases/getResult.ts
|
|
1618
|
-
var getResultUseCase = (game) => {
|
|
1619
|
-
const {
|
|
1663
|
+
var getResultUseCase = (game, scoreResult) => {
|
|
1664
|
+
const { rules } = game;
|
|
1620
1665
|
const { basic, extra } = rules;
|
|
1621
|
-
const
|
|
1622
|
-
|
|
1623
|
-
const
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
[-1, 0],
|
|
1627
|
-
[1, 0],
|
|
1628
|
-
[0, -1],
|
|
1629
|
-
[0, 1]
|
|
1630
|
-
];
|
|
1631
|
-
const markZone = (x, y, type, crowns) => {
|
|
1632
|
-
if (x < 0 || y < 0 || x >= kingdom[0].length || y >= kingdom.length || visited[y][x] || kingdom[y][x].type !== type || kingdom[y][x].type === "empty" || kingdom[y][x].type === "castle") {
|
|
1633
|
-
return;
|
|
1634
|
-
}
|
|
1635
|
-
visited[y][x] = true;
|
|
1636
|
-
const currentZone = properties.find(
|
|
1637
|
-
(property) => property.type === type && property.tiles.some(([tx, ty]) => {
|
|
1638
|
-
for (let [dx, dy] of directions) {
|
|
1639
|
-
if (tx + dx === x && ty + dy === y) {
|
|
1640
|
-
return true;
|
|
1641
|
-
}
|
|
1642
|
-
}
|
|
1643
|
-
return false;
|
|
1644
|
-
})
|
|
1645
|
-
);
|
|
1646
|
-
if (currentZone) {
|
|
1647
|
-
currentZone.size += 1;
|
|
1648
|
-
currentZone.tiles.push([x, y]);
|
|
1649
|
-
currentZone.crowns += crowns;
|
|
1650
|
-
} else {
|
|
1651
|
-
properties.push({
|
|
1652
|
-
type,
|
|
1653
|
-
crowns,
|
|
1654
|
-
size: 1,
|
|
1655
|
-
tiles: [[x, y]]
|
|
1656
|
-
});
|
|
1666
|
+
const finalScoreResult = scoreResult.map((score) => {
|
|
1667
|
+
let finalScore = score.details.points;
|
|
1668
|
+
const kingdom = game.players.find((player) => {
|
|
1669
|
+
if (player.id === score.playerId) {
|
|
1670
|
+
return player;
|
|
1657
1671
|
}
|
|
1658
|
-
|
|
1659
|
-
const nx = x + dx;
|
|
1660
|
-
const ny = y + dy;
|
|
1661
|
-
if (nx >= 0 && ny >= 0 && nx < kingdom[0].length && ny < kingdom.length && kingdom[ny][nx].type === type) {
|
|
1662
|
-
markZone(nx, ny, kingdom[ny][nx].type, kingdom[ny][nx].crowns);
|
|
1663
|
-
}
|
|
1664
|
-
});
|
|
1665
|
-
};
|
|
1666
|
-
kingdom.forEach((row, y) => {
|
|
1667
|
-
row.forEach((tile, x) => {
|
|
1668
|
-
if (!visited[y][x]) {
|
|
1669
|
-
markZone(x, y, tile.type, tile.crowns);
|
|
1670
|
-
}
|
|
1671
|
-
});
|
|
1672
|
-
});
|
|
1673
|
-
if (properties.length === 0) {
|
|
1674
|
-
return {
|
|
1675
|
-
playerId: player.id,
|
|
1676
|
-
playerName: player.name,
|
|
1677
|
-
details: {
|
|
1678
|
-
points: 0,
|
|
1679
|
-
maxPropertiesSize: 0,
|
|
1680
|
-
totalCrowns: 0
|
|
1681
|
-
}
|
|
1682
|
-
};
|
|
1683
|
-
}
|
|
1684
|
-
let points = properties.reduce(
|
|
1685
|
-
(score, property) => score + property.crowns * property.size,
|
|
1686
|
-
0
|
|
1687
|
-
);
|
|
1688
|
-
const maxPropertiesSize = Math.max(
|
|
1689
|
-
...properties.map((property) => property.size ?? 0)
|
|
1690
|
-
);
|
|
1691
|
-
const totalCrowns = properties.reduce(
|
|
1692
|
-
(total, property) => total + property.crowns,
|
|
1693
|
-
0
|
|
1694
|
-
);
|
|
1672
|
+
})?.kingdom;
|
|
1695
1673
|
if (extra.length > 0) {
|
|
1696
1674
|
extra.forEach((extraRule) => {
|
|
1697
1675
|
if (extraRule.name === "The middle Kingdom") {
|
|
1698
1676
|
const castleIsInMiddle = checkCastleIsInMiddle(kingdom);
|
|
1699
1677
|
if (castleIsInMiddle) {
|
|
1700
|
-
|
|
1678
|
+
finalScore += 10;
|
|
1701
1679
|
}
|
|
1702
1680
|
}
|
|
1703
1681
|
if (extraRule.name === "Harmony") {
|
|
1704
1682
|
const totalDominoes = countDominoes(kingdom);
|
|
1705
1683
|
const dominoLimit = basic.maxDominoes;
|
|
1706
|
-
const totalPlayers = players.length;
|
|
1684
|
+
const totalPlayers = game.players.length;
|
|
1707
1685
|
const dominoesPerPlayer = dominoLimit / totalPlayers;
|
|
1708
1686
|
if (totalDominoes === dominoesPerPlayer) {
|
|
1709
|
-
|
|
1687
|
+
finalScore += 5;
|
|
1710
1688
|
}
|
|
1711
1689
|
}
|
|
1712
1690
|
});
|
|
1713
1691
|
}
|
|
1714
1692
|
return {
|
|
1715
|
-
|
|
1716
|
-
playerName: player.name,
|
|
1693
|
+
...score,
|
|
1717
1694
|
details: {
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
totalCrowns
|
|
1695
|
+
...score.details,
|
|
1696
|
+
points: finalScore
|
|
1721
1697
|
}
|
|
1722
1698
|
};
|
|
1723
1699
|
});
|
|
1724
|
-
|
|
1700
|
+
finalScoreResult.sort((a, b) => {
|
|
1725
1701
|
if (a.details.points !== b.details.points) {
|
|
1726
1702
|
return b.details.points - a.details.points;
|
|
1727
1703
|
}
|
|
@@ -1733,14 +1709,14 @@ var getResultUseCase = (game) => {
|
|
|
1733
1709
|
const result = [];
|
|
1734
1710
|
let isTie = false;
|
|
1735
1711
|
result.push({
|
|
1736
|
-
playerId:
|
|
1737
|
-
playerName:
|
|
1738
|
-
details:
|
|
1712
|
+
playerId: finalScoreResult[0].playerId,
|
|
1713
|
+
playerName: finalScoreResult[0].playerName,
|
|
1714
|
+
details: finalScoreResult[0].details,
|
|
1739
1715
|
position: 1
|
|
1740
1716
|
});
|
|
1741
|
-
for (let i = 1; i <
|
|
1742
|
-
const currentScore =
|
|
1743
|
-
const previousScore =
|
|
1717
|
+
for (let i = 1; i < finalScoreResult.length; i++) {
|
|
1718
|
+
const currentScore = finalScoreResult[i];
|
|
1719
|
+
const previousScore = finalScoreResult[i - 1];
|
|
1744
1720
|
if (previousScore && currentScore && currentScore.details.points === previousScore.details.points && currentScore.details.maxPropertiesSize === previousScore.details.maxPropertiesSize && currentScore.details.totalCrowns === previousScore.details.totalCrowns) {
|
|
1745
1721
|
isTie = true;
|
|
1746
1722
|
}
|
|
@@ -1887,6 +1863,82 @@ var startGameUseCase = (deps) => (game) => {
|
|
|
1887
1863
|
return ok(newState);
|
|
1888
1864
|
};
|
|
1889
1865
|
|
|
1866
|
+
// src/core/useCases/calculateScore.ts
|
|
1867
|
+
var calculateScoreUseCase = (kingdom) => {
|
|
1868
|
+
const visited = kingdom.map((row) => row.map(() => false));
|
|
1869
|
+
const properties = [];
|
|
1870
|
+
const directions = [
|
|
1871
|
+
[-1, 0],
|
|
1872
|
+
[1, 0],
|
|
1873
|
+
[0, -1],
|
|
1874
|
+
[0, 1]
|
|
1875
|
+
];
|
|
1876
|
+
const markZone = (x, y, type, crowns) => {
|
|
1877
|
+
if (x < 0 || y < 0 || x >= kingdom[0].length || y >= kingdom.length || visited[y][x] || kingdom[y][x].type !== type || kingdom[y][x].type === "empty" || kingdom[y][x].type === "castle") {
|
|
1878
|
+
return;
|
|
1879
|
+
}
|
|
1880
|
+
visited[y][x] = true;
|
|
1881
|
+
const currentZone = properties.find(
|
|
1882
|
+
(property) => property.type === type && property.tiles.some(([tx, ty]) => {
|
|
1883
|
+
for (let [dx, dy] of directions) {
|
|
1884
|
+
if (tx + dx === x && ty + dy === y) {
|
|
1885
|
+
return true;
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
return false;
|
|
1889
|
+
})
|
|
1890
|
+
);
|
|
1891
|
+
if (currentZone) {
|
|
1892
|
+
currentZone.size += 1;
|
|
1893
|
+
currentZone.tiles.push([x, y]);
|
|
1894
|
+
currentZone.crowns += crowns;
|
|
1895
|
+
} else {
|
|
1896
|
+
properties.push({
|
|
1897
|
+
type,
|
|
1898
|
+
crowns,
|
|
1899
|
+
size: 1,
|
|
1900
|
+
tiles: [[x, y]]
|
|
1901
|
+
});
|
|
1902
|
+
}
|
|
1903
|
+
directions.forEach(([dx, dy]) => {
|
|
1904
|
+
const nx = x + dx;
|
|
1905
|
+
const ny = y + dy;
|
|
1906
|
+
if (nx >= 0 && ny >= 0 && nx < kingdom[0].length && ny < kingdom.length && kingdom[ny][nx].type === type) {
|
|
1907
|
+
markZone(nx, ny, kingdom[ny][nx].type, kingdom[ny][nx].crowns);
|
|
1908
|
+
}
|
|
1909
|
+
});
|
|
1910
|
+
};
|
|
1911
|
+
kingdom.forEach((row, y) => {
|
|
1912
|
+
row.forEach((tile, x) => {
|
|
1913
|
+
if (!visited[y][x]) {
|
|
1914
|
+
markZone(x, y, tile.type, tile.crowns);
|
|
1915
|
+
}
|
|
1916
|
+
});
|
|
1917
|
+
});
|
|
1918
|
+
if (properties.length === 0) {
|
|
1919
|
+
return ok({
|
|
1920
|
+
points: 0,
|
|
1921
|
+
maxPropertiesSize: 0,
|
|
1922
|
+
totalCrowns: 0
|
|
1923
|
+
});
|
|
1924
|
+
}
|
|
1925
|
+
let points = properties.reduce((acc, property) => {
|
|
1926
|
+
return acc + property.size * property.crowns;
|
|
1927
|
+
}, 0);
|
|
1928
|
+
const maxPropertiesSize = Math.max(
|
|
1929
|
+
...properties.map((property) => property.size)
|
|
1930
|
+
);
|
|
1931
|
+
const totalCrowns = properties.reduce(
|
|
1932
|
+
(acc, property) => acc + property.crowns,
|
|
1933
|
+
0
|
|
1934
|
+
);
|
|
1935
|
+
return ok({
|
|
1936
|
+
points,
|
|
1937
|
+
maxPropertiesSize,
|
|
1938
|
+
totalCrowns
|
|
1939
|
+
});
|
|
1940
|
+
};
|
|
1941
|
+
|
|
1890
1942
|
// src/config.ts
|
|
1891
1943
|
var configureEngine = (config) => {
|
|
1892
1944
|
const modeRepository = jsonModes_default();
|
|
@@ -1931,7 +1983,11 @@ var configureEngine = (config) => {
|
|
|
1931
1983
|
chooseDominoHandler: chooseDominoHandler(logger, chooseDominoUseCase),
|
|
1932
1984
|
placeDominoHandler: placeDominoHandler(logger, placeDominoUseCase),
|
|
1933
1985
|
discardDominoHandler: discardDominoHandler(logger, discardDominoUseCase),
|
|
1934
|
-
getResultHandler: getResultHandler(logger,
|
|
1986
|
+
getResultHandler: getResultHandler(logger, {
|
|
1987
|
+
getResultUseCase,
|
|
1988
|
+
calculateScoreUseCase
|
|
1989
|
+
}),
|
|
1990
|
+
calculateScoreHandler: calculateScoreHandler(logger, calculateScoreUseCase)
|
|
1935
1991
|
};
|
|
1936
1992
|
};
|
|
1937
1993
|
|
|
@@ -1947,7 +2003,8 @@ var createGameEngine = (config) => {
|
|
|
1947
2003
|
chooseDominoHandler: chooseDominoHandler2,
|
|
1948
2004
|
placeDominoHandler: placeDominoHandler2,
|
|
1949
2005
|
discardDominoHandler: discardDominoHandler2,
|
|
1950
|
-
getResultHandler: getResultHandler2
|
|
2006
|
+
getResultHandler: getResultHandler2,
|
|
2007
|
+
calculateScoreHandler: calculateScoreHandler2
|
|
1951
2008
|
} = configureEngine(config);
|
|
1952
2009
|
return {
|
|
1953
2010
|
getModes: (command) => getModesHandler2(command),
|
|
@@ -1959,7 +2016,8 @@ var createGameEngine = (config) => {
|
|
|
1959
2016
|
chooseDomino: (command) => chooseDominoHandler2(command),
|
|
1960
2017
|
placeDomino: (command) => placeDominoHandler2(command),
|
|
1961
2018
|
discardDomino: (command) => discardDominoHandler2(command),
|
|
1962
|
-
getResults: (command) => getResultHandler2(command)
|
|
2019
|
+
getResults: (command) => getResultHandler2(command),
|
|
2020
|
+
calculateScore: (command) => calculateScoreHandler2(command)
|
|
1963
2021
|
};
|
|
1964
2022
|
};
|
|
1965
2023
|
export {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/datasources/dominoes.json","../src/adapterServerside/jsonDominoes.ts","../src/datasources/modes.json","../src/adapterServerside/jsonModes.ts","../src/datasources/rules.json","../src/adapterServerside/jsonRules.ts","../src/adapterServerside/shuffle.ts","../src/adapterServerside/uuid.ts","../src/adapterServerside/winstonLogger.ts","../src/core/domain/errors/domainErrors.ts","../src/core/domain/types/game.ts","../src/utils/result.ts","../src/application/handlers/addExtraRulesHandler.ts","../src/application/handlers/addPlayersHandler.ts","../src/application/handlers/chooseDominoHandler.ts","../src/application/handlers/createGameHandler.ts","../src/application/handlers/discardDominoHandler.ts","../src/application/handlers/getExtraRulesHandler.ts","../src/application/handlers/getModesHandler.ts","../src/application/handlers/getResultHandler.ts","../src/application/handlers/placeDominoHandler.ts","../src/application/handlers/startGameHandler.ts","../src/core/domain/types/kingdom.ts","../src/core/domain/types/domino.ts","../src/core/domain/types/player.ts","../src/core/domain/entities/rule.ts","../src/core/useCases/addExtraRules.ts","../src/core/domain/entities/domino.ts","../src/core/domain/entities/kingdom.ts","../src/core/domain/entities/player.ts","../src/core/useCases/addPlayers.ts","../src/core/domain/entities/lord.ts","../src/core/useCases/chooseDomino.ts","../src/core/domain/entities/game.ts","../src/core/domain/entities/mode.ts","../src/core/useCases/createGame.ts","../src/core/useCases/discardDomino.ts","../src/core/useCases/getExtraRules.ts","../src/core/useCases/getModes.ts","../src/core/useCases/getResult.ts","../src/core/useCases/placeDomino.ts","../src/core/useCases/startGame.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["{\n \"Classic\": [\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 1\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 2\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 3\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 4\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 5\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 6\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 7\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 8\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 9\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 10\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 11\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 12\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 13\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 14\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 15\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 16\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 17\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 18\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 19\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 20\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 21\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 22\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 0\n },\n \"number\": 23\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 24\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 25\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 26\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 27\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 28\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 29\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 30\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 31\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 32\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 33\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 34\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 35\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 36\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 37\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 1\n },\n \"number\": 38\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 39\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 40\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 41\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 42\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 43\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 44\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 45\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 46\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 47\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 3\n },\n \"number\": 48\n }\n ]\n}\n","import type { Domino, Ground } from \"@core/domain/types/domino.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport dominoesJson from \"../datasources/dominoes.json\" assert { type: \"json\" };\n\nconst jsonDominoes = (): DominoesRepository => {\n const dominoes: Record<string, Domino[]> = {};\n\n for (const [key, value] of Object.entries(dominoesJson)) {\n const currentDominoes: Domino[] = [];\n value.forEach((domino) => {\n currentDominoes.push({\n left: {\n type: <Ground>domino.left.type,\n crowns: domino.left.crowns,\n },\n right: {\n type: <Ground>domino.right.type,\n crowns: domino.right.crowns,\n },\n number: domino.number,\n });\n });\n\n dominoes[key] = currentDominoes;\n }\n\n return {\n getForMode: (mode: GameMode) => {\n return dominoes[mode.name] || [];\n },\n };\n};\n\nexport default jsonDominoes;\n","[\n {\n \"name\": \"Classic\",\n \"description\": \"Original KingDomino rules\"\n }\n]","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport modesJson from \"../datasources/modes.json\" assert { type: \"json\" };\n\nconst jsonModes = (): ModeRepository => {\n const modes: GameMode[] = [];\n\n modesJson.forEach((mode) => {\n modes.push({\n name: mode.name,\n description: mode.description,\n });\n });\n\n return {\n getAvailables: () => {\n return modes;\n },\n };\n};\n\nexport default jsonModes;\n","{\n \"commun\": [\n {\n \"playersLimit\": 2,\n \"lordsPerPlayer\": 2,\n \"maxDominoes\": 24,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 6\n },\n {\n \"playersLimit\": 3,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 36,\n \"dominoesPerTurn\": 3,\n \"maxTurns\": 12\n },\n {\n \"playersLimit\": 4,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 48,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 12\n }\n ],\n \"extra\": [\n {\n \"name\": \"The middle Kingdom\",\n \"description\": \"Gain 10 additional points if your castle is in the middle of the kingdom.\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n },\n {\n \"name\": \"Harmony\",\n \"description\": \"Gain 5 additional points if your kingdom is complete (no discarded dominoes).\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n }\n ]\n}\n","import type { Rules } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport rulesJson from \"../datasources/rules.json\" assert { type: \"json\" };\n\nconst jsonRules = (): RuleRepository => {\n const rules: Rules = {\n basic: {},\n extraRules: [],\n };\n\n const commonRules = rulesJson.commun;\n const extraRules = rulesJson.extra;\n\n commonRules.forEach((rule) => {\n rules.basic[rule.playersLimit] = {\n lords: rule.lordsPerPlayer,\n maxDominoes: rule.maxDominoes,\n dominoesPerTurn: rule.dominoesPerTurn,\n maxTurns: rule.maxTurns,\n };\n });\n\n extraRules.forEach((rule) => {\n rules.extraRules.push({\n name: rule.name,\n description: rule.description,\n mode: rule.mode,\n });\n });\n\n return {\n getAll: () => {\n return rules;\n },\n getAllExtra: () => {\n return rules.extraRules;\n },\n };\n};\n\nexport default jsonRules;\n","import type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\n\nexport const shuffleMethod: ShuffleMethod = <T>(array: T[]) => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j] as T, array[i] as T];\n }\n return array;\n};\n","import type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { randomUUID } from \"crypto\";\n\nexport const uuidMethod: UuidMethod = () => {\n return randomUUID();\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport winston from \"winston\";\n\nexport const winstonLogger = (isLoggingEnabled: boolean): Logger => {\n const myFormat = winston.format.printf(\n ({ level, message, label, timestamp }) => {\n return `${timestamp} [${label}] ${level}: ${message}`;\n }\n );\n\n const logger = winston.createLogger({\n level: \"info\",\n format: winston.format.combine(\n winston.format.label({ label: \"KDomino_Engine\" }),\n winston.format.timestamp(),\n winston.format.simple(),\n winston.format.json(),\n winston.format.colorize(),\n myFormat\n ),\n transports: [new winston.transports.Console()],\n });\n\n return {\n info: (message: string) => {\n if (isLoggingEnabled) {\n logger.info(message);\n }\n return void 0;\n },\n error: (message: string) => {\n if (isLoggingEnabled) {\n logger.error(message);\n }\n return void 0;\n },\n };\n};\n","export class InvalidStepError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidStepError\";\n }\n}\n\nexport class StepExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StepExecutionError\";\n }\n}\n\nexport class ActionExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ActionExecutionError\";\n }\n}\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n","import type { Result } from \"@utils/result.js\";\nimport type { Domino, RevealsDomino } from \"./domino.js\";\nimport type { Lord } from \"./lord.js\";\nimport type { GameMode } from \"./mode.js\";\nimport type { Player, PlayerActions } from \"./player.js\";\nimport type { SelectedRules } from \"./rule.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n lords: Lord[];\n turn: number;\n nextAction: NextAction | NextStep;\n rules: SelectedRules;\n mode: GameMode;\n};\n\nexport const gameSteps = {\n addPlayers: \"addPlayers\",\n options: \"options\",\n start: \"start\",\n result: \"result\",\n} as const;\n\nexport type GameSteps = ObjectValues<typeof gameSteps>;\n\nexport type NextAction = {\n type: \"action\";\n nextLord: string;\n nextAction: PlayerActions;\n};\n\nexport type NextStep = {\n type: \"step\";\n step: GameSteps;\n};\n\nexport type GameWithNextAction = Game & { nextAction: NextAction };\nexport type GameWithNextStep = Game & { nextAction: NextStep };\nexport type GameState = GameWithNextAction | GameWithNextStep;\nexport type GameStateResult = Result<GameState>;\n\nexport const isGameWithNextAction = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextAction => {\n return game.nextAction.type === \"action\";\n};\n\nexport const isGameWithNextStep = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextStep => {\n return game.nextAction.type === \"step\";\n};\n\nexport type Score = {\n points: number;\n maxPropertiesSize: number;\n totalCrowns: number;\n};\n\nexport type ScoreResult = {\n playerId: string;\n playerName: string;\n details: Score;\n};\n\nexport type FinalResult = ScoreResult & {\n position: number;\n};\n\nexport type GameWithResults = Game & { result: FinalResult[] };\n","export type Result<T> = Ok<T> | Err;\n\nexport interface Ok<T> {\n readonly tag: \"Ok\";\n readonly value: T;\n}\n\nexport interface Err {\n readonly tag: \"Err\";\n readonly error: string;\n}\n\nexport const ok = <T>(value: T): Ok<T> => ({ tag: \"Ok\", value });\nexport const err = (error: string): Err => ({ tag: \"Err\", error });\n\nexport const isOk = <T>(result: Result<T>): result is Ok<T> =>\n result.tag === \"Ok\";\nexport const isErr = <T>(result: Result<T>): result is Err =>\n result.tag === \"Err\";\n\nexport const unwrap = <T>(result: Ok<T> | Err): T => {\n if (result.tag === \"Err\") {\n throw result.error;\n }\n return result.value;\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddExtraRulesCommand } from \"@application/commands/addExtraRulesCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddExtraRulesHandler = (command: AddExtraRulesCommand) => GameWithNextStep;\n\nexport const addExtraRulesHandler =\n (logger: Logger, useCase: AddExtraRulesUseCase): AddExtraRulesHandler =>\n (command: AddExtraRulesCommand) => {\n const { game, extraRules } = command;\n logger.info(`Adding extra rules to game: ${game.id}`);\n logger.info(`Extra rules: ${extraRules}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\"Invalid game with nextAction type: 'step'\");\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"options\") {\n logger.error(\n `Required game with options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with options step\");\n }\n\n const result = useCase(game, extraRules);\n\n if (isErr(result)) {\n logger.error(`Error adding extra rules: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Extra rules added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddPlayersCommand } from \"@application/commands/addPlayersCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddPlayersHandler = (command: AddPlayersCommand) => GameWithNextStep;\n\nexport const addPlayersHandler =\n (logger: Logger, useCase: AddPlayersUseCase): AddPlayersHandler =>\n (command: AddPlayersCommand) => {\n const { game, players } = command;\n\n logger.info(`Adding players to game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\"Invalid game with nextAction type: 'step'\");\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"addPlayers\") {\n logger.error(\n `Required game with addPlayers step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with addPlayers step\");\n }\n\n const result = useCase(game, players);\n\n if (isErr(result)) {\n logger.error(`Error adding players: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Players added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { ChooseDominoCommand } from \"@application/commands/chooseDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { ChooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype ChooseDominoHandler = (command: ChooseDominoCommand) => GameWithNextAction;\n\nexport const chooseDominoHandler =\n (logger: Logger, useCase: ChooseDominoUseCase): ChooseDominoHandler =>\n (command: ChooseDominoCommand) => {\n const { game, lordId, dominoPick } = command;\n logger.info(\n `Choosing domino: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\"Invalid game with nextAction type: 'action'\");\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"pickDomino\") {\n logger.error(\n `Required game with pickDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with pickDomino action\");\n }\n\n const result = useCase(game, lordId, dominoPick);\n\n if (isErr(result)) {\n logger.error(`Error choosing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n logger.info(\n `Domino chosen: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n return result.value;\n };\n","import { StepExecutionError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { CreateGameUseCase } from \"@core/useCases/createGame.js\";\nimport type { CreateGameCommand } from \"@application/commands/createGameCommand.js\";\nimport { isErr } from \"@utils/result.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\n\ntype CreateGameHandler = (command: CreateGameCommand) => GameWithNextStep;\n\nexport const createGameHandler =\n (logger: Logger, useCase: CreateGameUseCase): CreateGameHandler =>\n (command: CreateGameCommand) => {\n logger.info(`Creating game with mode: ${command.mode}`);\n const result = useCase(command.mode);\n\n if (isErr(result)) {\n logger.error(`Error creating game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game created: ${result.value.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { DiscardDominoCommand } from \"@application/commands/discardDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { DiscardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype DiscardDominoHandler = (command: DiscardDominoCommand) => GameState;\n\nexport const discardDominoHandler =\n (logger: Logger, useCase: DiscardDominoUseCase): DiscardDominoHandler =>\n (command: DiscardDominoCommand) => {\n const { game, lordId } = command;\n logger.info(`Discarding domino for lord: ${lordId} in game: ${game.id}`);\n\n if (!isGameWithNextAction(game)) {\n logger.error(\"Invalid game with nextAction type: 'action'\");\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino action\");\n }\n\n const result = useCase(game, lordId);\n\n if (isErr(result)) {\n logger.error(`Error discarding domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n }\n\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetExtraRulesCommand } from \"@application/commands/getExtraRulesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { GetExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetExtraRulesHandler = (command: GetExtraRulesCommand) => ExtraRule[];\n\nexport const getExtraRulesHandler =\n (logger: Logger, useCase: GetExtraRulesUseCase): GetExtraRulesHandler =>\n (command: GetExtraRulesCommand) => {\n const { mode, players } = command;\n logger.info(\n `Getting extra rules for mode: ${mode} and players: ${players}`\n );\n const result = useCase(mode, players);\n\n if (isErr(result)) {\n logger.error(`Error getting extra rules: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Extra rules retrieved: ${result.value}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetModesCommand } from \"@application/commands/getModesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { GetModesUseCase } from \"@core/useCases/getModes.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetModesHandler = (command: GetModesCommand) => GameMode[];\n\nexport const getModesHandler =\n (logger: Logger, useCase: GetModesUseCase): GetModesHandler =>\n (_command: GetModesCommand) => {\n logger.info(\"Getting modes\");\n const result = useCase();\n\n if (isErr(result)) {\n logger.error(`Error getting modes: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Modes retrieved: ${result.value}`);\n return result.value;\n };\n","import type { GetResultCommand } from \"@application/commands/getResultCommand.js\";\nimport {\n InvalidStepError,\n NotFoundError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithResults,\n} from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetResultUseCase } from \"@core/useCases/getResult.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetResultHandler = (command: GetResultCommand) => GameWithResults;\n\nexport const getResultHandler =\n (logger: Logger, useCase: GetResultUseCase): GetResultHandler =>\n (command: GetResultCommand) => {\n const { game } = command;\n logger.info(`Getting result for game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\"Invalid game with nextAction type: 'step'\");\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"result\") {\n logger.error(\n `Required game with result step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with result step\");\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n logger.error(`Error getting result: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Result retrieved for game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { PlaceDominoCommand } from \"@application/commands/placeDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { PlaceDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype PlaceDominoHandler = (command: PlaceDominoCommand) => GameState;\n\nexport const placeDominoHandler =\n (logger: Logger, useCase: PlaceDominoUseCase): PlaceDominoHandler =>\n (command: PlaceDominoCommand) => {\n const { game, lordId, position, orientation, rotation } = command;\n logger.info(\n `Placing domino: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\"Invalid game with nextAction type: 'action'\");\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino step\");\n }\n\n const result = useCase(game, lordId, position, orientation, rotation);\n\n if (isErr(result)) {\n logger.error(`Error placing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n }\n\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { StartGameCommand } from \"@application/commands/startGameCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { StartGameUseCase } from \"@core/useCases/startGame.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype StartGameHandler = (command: StartGameCommand) => GameWithNextAction;\n\nexport const startGameHandler =\n (logger: Logger, useCase: StartGameUseCase): StartGameHandler =>\n (command: StartGameCommand) => {\n const { game } = command;\n logger.info(`Starting game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\"Invalid game with nextAction type: 'step'\");\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (\n game.nextAction.step !== \"start\" &&\n game.nextAction.step !== \"options\"\n ) {\n logger.error(\n `Required game with start step or options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\n \"Required game with start step or options step\"\n );\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n logger.error(`Error starting game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game started: ${game.id}`);\n return result.value;\n };\n","import type { EmptyTile, Tile } from \"./domino.js\";\n\nexport type Position = {\n x: number; // cols\n y: number; // rows\n};\n\nexport type Orientation = \"vertical\" | \"horizontal\";\n\nexport type Rotation = 0 | 180;\n\nexport type Kingdom = (Tile | EmptyTile)[][];\n\nexport const GRIDSIZE = 9;\n","export const GROUND = [\n \"castle\",\n \"wheat\",\n \"forest\",\n \"sea\",\n \"plain\",\n \"swamp\",\n \"mine\",\n] as const;\n\nexport type Ground = (typeof GROUND)[number];\nexport type EmptyGround = \"empty\";\n\nexport type Crown = number;\n\nexport type Tile = {\n type: Ground;\n crowns: Crown;\n};\n\nexport type EmptyTile = {\n type: EmptyGround;\n crowns: 0;\n};\n\nexport type Domino = {\n left: Tile;\n right: Tile;\n number: number;\n};\n\nexport type RevealsDomino = {\n domino: Domino;\n picked: boolean;\n lordId: string | null;\n position: number;\n};\n","import type { Kingdom } from \"./kingdom.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Player = {\n id: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport type PlayerPayload = {\n name: string;\n};\n\nexport type PlayersPayload = PlayerPayload[];\n\nexport type Players = Player[];\n\nexport const playerActions = {\n placeDomino: \"placeDomino\",\n pickDomino: \"pickDomino\",\n pass: \"pass\",\n} as const;\n\nexport type PlayerActions = ObjectValues<typeof playerActions>;\n","import type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport { ok, err, type Result } from \"@utils/result.js\";\n\nexport const getAvailablesExtraRules = (\n extraRules: ExtraRule[],\n mode: string,\n numberOfPlayers: number\n): Result<ExtraRule[]> => {\n const availableExtraRules = extraRules.filter((rule) => {\n return (\n rule.mode.filter((m) => m.name === mode).length > 0 &&\n (!rule.playersLimit || rule.playersLimit === numberOfPlayers)\n );\n });\n\n if (availableExtraRules.length === 0) {\n return err(\"No extra rules found\");\n }\n\n return ok(availableExtraRules);\n};\n\nexport const toExtraRule = (\n rule: string,\n extraRules: ExtraRule[]\n): Result<ExtraRule> => {\n const foundRule = extraRules.find((r) => r.name === rule);\n\n if (!foundRule) {\n return err(`Rule not found: ${rule}`);\n }\n\n return ok(foundRule);\n};\n","import {\n gameSteps,\n type ExtraRule,\n type GameWithNextStep,\n type NextStep,\n} from \"@core/domain/types/index.js\";\nimport { isErr, ok, type Result } from \"@utils/result.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { toExtraRule } from \"@core/domain/entities/rule.js\";\n\nexport type AddExtraRulesUseCase = (\n game: GameWithNextStep,\n rules: string[]\n) => Result<GameWithNextStep>;\n\nexport const addExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): AddExtraRulesUseCase =>\n (game, rules) => {\n const { ruleRepository } = deps;\n const availableExtraRules = ruleRepository.getAllExtra();\n\n const newExtraRules: ExtraRule[] = [];\n\n for (const rule of rules) {\n const result = toExtraRule(rule, availableExtraRules);\n\n if (isErr(result)) {\n return result;\n }\n\n newExtraRules.push(result.value);\n }\n\n const updatedRules = {\n basic: game.rules.basic,\n extra: newExtraRules,\n };\n\n const next: NextStep = {\n type: \"step\",\n step: gameSteps.start,\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n rules: updatedRules,\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import {\n GROUND,\n type Crown,\n type EmptyGround,\n type EmptyTile,\n type Ground,\n type Tile,\n} from \"@core/domain/types/domino.js\";\n\nconst isGround = (ground: any): ground is Ground => {\n return GROUND.includes(ground);\n};\n\nexport const createTile = (\n ground: Ground | EmptyGround,\n crowns: Crown = 0\n): Tile | EmptyTile => {\n if (isGround(ground)) {\n return { type: ground, crowns } as Tile;\n }\n return { type: ground, crowns: 0 } as EmptyTile;\n};\n","import {\n GRIDSIZE,\n type Domino,\n type EmptyTile,\n type Kingdom,\n type Orientation,\n type Position,\n type Rotation,\n type Tile,\n} from \"@core/domain/types/index.js\";\nimport { err, isErr, isOk, ok, type Result } from \"@utils/result.js\";\nimport { createTile } from \"./domino.js\";\n\nexport const createEmptyKingdom = (): Kingdom => {\n const emptyTile = createTile(\"empty\");\n const grid = Array.from({ length: GRIDSIZE }, () =>\n Array.from({ length: GRIDSIZE }, () => emptyTile)\n );\n\n return grid;\n};\n\nexport const placeCastle = (kingdom: Kingdom): Kingdom => {\n const castle = createTile(\"castle\");\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[4]![4] = castle;\n return newKingdom;\n};\n\nexport const placeTile = (\n kingdom: Kingdom,\n position: Position,\n tile: Tile\n): Kingdom => {\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[position.y]![position.x] = tile;\n return newKingdom;\n};\n\nexport const getTile = (\n kingdom: Kingdom,\n position: Position\n): Result<Tile | EmptyTile> => {\n const tile = kingdom[position.y]?.[position.x];\n if (!tile) {\n return err(\"Invalid placement (not fit into the grid)\");\n }\n return ok(tile);\n};\n\nexport const calculateDominoPosition = (\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): [{ tile: Tile; position: Position }, { tile: Tile; position: Position }] => {\n let firstTile: {\n tile: Tile;\n position: Position;\n };\n let secondTile: {\n tile: Tile;\n position: Position;\n };\n\n if (orientation === \"horizontal\") {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n }\n } else {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n }\n }\n\n return [firstTile, secondTile];\n};\n\nexport const placeDomino = (\n kingdom: Kingdom,\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): Result<Kingdom> => {\n const [firstTile, secondTile] = calculateDominoPosition(\n position,\n orientation,\n rotation,\n domino\n );\n\n const isFreePlaceResult = isFreePlace(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n if (isErr(isFreePlaceResult)) {\n return isFreePlaceResult;\n }\n\n const adjacentTiles = isAdjacent(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n\n if (adjacentTiles.length === 0) {\n return err(\"Invalid placement (not adjacent)\");\n }\n\n const hasValidAdjacentTiles = hasValidAdjacent(adjacentTiles, [\n firstTile.tile,\n secondTile.tile,\n ]);\n\n if (!hasValidAdjacentTiles) {\n return err(\"Invalid placement (not valid adjacent)\");\n }\n\n return ok(placeTiles(kingdom, [firstTile, secondTile]));\n};\n\nconst placeTiles = (\n kingdom: Kingdom,\n tiles: { tile: Tile; position: Position }[]\n) => {\n let newKingdom = deepCopyKingdom(kingdom);\n for (const { tile, position } of tiles) {\n newKingdom = placeTile(newKingdom, position, tile);\n }\n return newKingdom;\n};\n\nconst isFreePlace = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Result<boolean> => {\n const firstTile = getTile(kingdom, firstPosition);\n const secondTile = getTile(kingdom, secondPosition);\n\n if (isErr(firstTile)) {\n return firstTile;\n }\n\n if (isErr(secondTile)) {\n return secondTile;\n }\n\n if (firstTile.value.type !== \"empty\" || secondTile.value.type !== \"empty\") {\n return err(\"Invalid placement (not empty)\");\n }\n\n return ok(true);\n};\n\nconst isAdjacent = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Tile[] => {\n const xFirstPosition = firstPosition.x;\n const yFirstPosition = firstPosition.y;\n const xSecondPosition = secondPosition.x;\n const ySecondPosition = secondPosition.y;\n\n const adjacentTiles: Tile[] = [];\n const adjacentTilesKeys = [\n { x: xFirstPosition - 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition - 1 },\n { x: xFirstPosition + 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition + 1 },\n { x: xSecondPosition - 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition - 1 },\n { x: xSecondPosition + 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition + 1 },\n ];\n\n // Remove firstPosition and secondPosition from adjacentTilesKeys\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xFirstPosition && pos.y === yFirstPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xSecondPosition && pos.y === ySecondPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.forEach((key) => {\n const tile = getTile(kingdom, key);\n if (isOk(tile)) {\n if (tile.value.type !== \"empty\") {\n adjacentTiles.push(tile.value);\n }\n }\n });\n\n return adjacentTiles;\n};\n\nconst hasValidAdjacent = (\n adjacentTiles: (Tile | EmptyTile)[],\n tiles: Tile[]\n): boolean => {\n return adjacentTiles.some((adjacentTile) => {\n return tiles.some((tile) => {\n return tile.type === adjacentTile.type || adjacentTile.type === \"castle\";\n });\n });\n};\n\nexport const checkCastleIsInMiddle = (kingdom: Kingdom): boolean => {\n // Find index of castle\n const castlePosition = kingdom\n .map((row) => row.findIndex((tile) => tile.type === \"castle\"))\n .find((index) => index !== -1);\n\n // Count how many tiles not empty are on the left of the castle\n const leftTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const leftTilesCount = leftTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the right of the castle\n const rightTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const rightTilesCount = rightTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the top of the castle\n const topTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const topTilesCount = topTiles.filter((tile) => tile.type !== \"empty\").length;\n\n // Count how many tiles not empty are on the bottom of the castle\n const bottomTiles =\n castlePosition != undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const bottomTilesCount = bottomTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n return (\n leftTilesCount === rightTilesCount &&\n topTilesCount === bottomTilesCount &&\n leftTilesCount === topTilesCount\n );\n};\n\nexport const countDominoes = (kingdom: Kingdom): number => {\n const notEmpties = kingdom.flat().filter((tile) => tile.type !== \"empty\");\n const totalDominoes = (notEmpties.length - 1) / 2; // -1 because the castle is not a domino\n return totalDominoes;\n};\n\nconst deepCopyKingdom = (kingdom: Kingdom): Kingdom => {\n return kingdom.map((line) => line.map((tile) => ({ ...tile })));\n};\n","import { type Result, err, ok, isErr } from \"@utils/result.js\";\nimport type { Player } from \"@core/domain/types/player.js\";\nimport type { Kingdom } from \"@core/domain/types/kingdom.js\";\n\nconst MINPLAYERSNAMELENGTH = 3;\n\nexport const validatePlayer = (name: string): Result<string> => {\n if (!name || name.trim().length < MINPLAYERSNAMELENGTH) {\n return err(`Invalid player name: ${name}`);\n }\n\n return ok(name);\n};\n\nexport const createPlayer = (\n playerName: string,\n id: string,\n kingdom: Kingdom\n): Result<Player> => {\n const name = validatePlayer(playerName);\n\n if (isErr(name)) {\n return name;\n }\n\n return ok({\n name: name.value,\n id,\n kingdom,\n });\n};\n","import {\n createEmptyKingdom,\n placeCastle,\n} from \"@core/domain/entities/kingdom.js\";\nimport { createPlayer } from \"@core/domain/entities/player.js\";\nimport type {\n GameWithNextStep,\n NextStep,\n Players,\n} from \"@core/domain/types/index.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type AddPlayersUseCase = (\n game: GameWithNextStep,\n players: string[]\n) => Result<GameWithNextStep>;\n\nexport const addPlayersUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n ruleRepository: RuleRepository;\n }): AddPlayersUseCase =>\n (game, players) => {\n const { uuidMethod, shuffleMethod, ruleRepository } = deps;\n\n if (!players || players.length < 2 || players.length > 4) {\n return err(\"Invalid number of players\");\n }\n\n const newPlayers: Players = [];\n\n for (const player of players) {\n let kingdom = createEmptyKingdom();\n kingdom = placeCastle(kingdom);\n let id = uuidMethod();\n const newPlayer = createPlayer(player, id, kingdom);\n\n if (isErr(newPlayer)) {\n return newPlayer;\n }\n\n newPlayers.push(newPlayer.value);\n }\n\n // set rules\n const rules = ruleRepository.getAll();\n const basicRules = rules.basic[newPlayers.length];\n\n if (!basicRules) {\n return err(\"No base rules found\");\n }\n\n // updateDominoes\n const dominoes = game.dominoes;\n const { maxDominoes } = basicRules;\n const shuffledDominoes = shuffleMethod(dominoes);\n const splicedDominoes = shuffledDominoes.slice(0, maxDominoes);\n const next: NextStep = {\n type: \"step\",\n step: \"options\",\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n players: newPlayers,\n dominoes: splicedDominoes,\n rules: {\n ...game.rules,\n basic: basicRules,\n },\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import type { NextAction } from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\n\nexport const createLord = (id: string, playerId: string): Lord => {\n return {\n id,\n playerId,\n turnEnded: false,\n hasPick: false,\n hasPlace: true,\n };\n};\n\nconst hasPick = (lord: Lord): boolean => lord.hasPick;\nconst hasPlace = (lord: Lord): boolean => lord.hasPlace;\nconst hasTurnEnded = (lord: Lord): boolean => lord.turnEnded;\n\nexport const canPass = (lord: Lord): boolean => {\n return !hasPick(lord) && !hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPick = (lord: Lord): boolean => {\n return !hasPick(lord) && hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPlaceAndDominoPickedIsDefined = (\n lord: Lord\n): lord is Required<Lord & Pick<Lord, \"dominoPicked\">> => {\n return (\n !hasPick(lord) &&\n !hasPlace(lord) &&\n !hasTurnEnded(lord) &&\n lord.dominoPicked !== undefined\n );\n};\n\nexport const updateLordOrder = (lords: Lord[]): Lord[] => {\n return lords.sort((a, b) => {\n return a.dominoPicked!.number - b.dominoPicked!.number;\n });\n};\n\nexport const resetLordsActions = (lord: Lord[]): Lord[] => {\n const lordsCopy = [...lord];\n for (const lord of lordsCopy) {\n lord.turnEnded = false;\n lord.hasPick = false;\n lord.hasPlace = false;\n }\n\n return lordsCopy;\n};\n\nexport const nextLordWithAction = (lords: Lord[]): NextAction => {\n const nextLord = findNextLord(lords);\n\n return {\n type: \"action\",\n nextLord: nextLord.id,\n nextAction: hasPlace(nextLord)\n ? playerActions.pickDomino\n : playerActions.placeDomino,\n };\n};\n\nconst findNextLord = (lords: Lord[]): Lord => {\n const lord = lords.find((lord) => !hasTurnEnded(lord));\n if (!lord) {\n return lords[0]!;\n }\n return lord;\n};\n\nexport const allLordsHavePlayed = (lords: Lord[]) => {\n return lords.every((lord) => lord.turnEnded);\n};\n","import {\n allLordsHavePlayed,\n canPick,\n nextLordWithAction,\n resetLordsActions,\n updateLordOrder,\n} from \"@core/domain/entities/lord.js\";\nimport type { GameWithNextAction } from \"@core/domain/types/game.js\";\nimport { err, ok, type Result } from \"@utils/result.js\";\n\nexport type ChooseDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n dominoPick: number\n) => Result<GameWithNextAction>;\n\nexport const chooseDominoUseCase: ChooseDominoUseCase = (\n game,\n lordId,\n dominoPick\n) => {\n const currentLord = game.lords.find(\n (lord) => lord.id === game.nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPick(currentLord)) {\n return err(\"Lord can't pick\");\n }\n\n // Check if dominoPick is valid choice\n const selectedDomino = game.currentDominoes.find(\n (domino) => domino.domino.number === dominoPick\n );\n\n if (!selectedDomino) {\n return err(\"Domino not found\");\n }\n\n if (selectedDomino.picked) {\n return err(\"Domino already picked\");\n }\n\n // update currentDominoes\n const updatedCurrentDominoes = game.currentDominoes.map((domino) => {\n if (domino.domino.number === dominoPick) {\n domino.picked = true;\n domino.lordId = currentLord.id;\n }\n return domino;\n });\n\n // update lords\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n lord.hasPick = true;\n lord.turnEnded = true;\n lord.dominoPicked = selectedDomino.domino;\n }\n return lord;\n });\n\n const turnEnded = allLordsHavePlayed(updatedLords);\n\n if (turnEnded) {\n const lords = resetLordsActions(updateLordOrder(updatedLords));\n const updatedTurn = game.turn + 1;\n const next = nextLordWithAction(lords);\n const dominoesCopy = [...game.dominoes];\n const dominoesDrawn = dominoesCopy.splice(\n 0,\n game.rules.basic.dominoesPerTurn\n );\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const updatedCurrentDominoes = dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n });\n\n return ok({\n ...game,\n currentDominoes: updatedCurrentDominoes,\n dominoes: dominoesCopy,\n lords,\n turn: updatedTurn,\n nextAction: next,\n });\n }\n\n const next = nextLordWithAction(updatedLords);\n\n // update state\n const updatedState = {\n ...game,\n currentDominoes: updatedCurrentDominoes,\n lords: updatedLords,\n nextAction: next,\n };\n\n return ok(updatedState);\n};\n","import {\n gameSteps,\n type Domino,\n type GameMode,\n type GameWithNextStep,\n} from \"@core/domain/types/index.js\";\n\nexport const create = (payload: {\n id: string;\n mode: GameMode;\n dominoes: Domino[];\n}): GameWithNextStep => {\n const { id, mode, dominoes } = payload;\n return {\n id,\n dominoes,\n currentDominoes: [],\n players: [],\n lords: [],\n turn: 0,\n nextAction: {\n type: \"step\",\n step: gameSteps.addPlayers,\n },\n rules: {\n basic: {\n lords: 0,\n maxDominoes: 0,\n dominoesPerTurn: 0,\n maxTurns: 0,\n },\n extra: [],\n },\n mode,\n };\n};\n","import { err, ok, type Result } from \"@utils/result.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\n\nconst findMode = (\n mode: string,\n availableMode: GameMode[]\n): GameMode | undefined => {\n return availableMode.find((m) => m.name === mode);\n};\n\nexport const createMode = (\n mode: string,\n availableMode: GameMode[]\n): Result<GameMode> => {\n const foundMode = findMode(mode, availableMode);\n if (foundMode) {\n return ok(foundMode);\n }\n\n return err(`Invalid mode: ${mode}`);\n};\n","import { create } from \"@core/domain/entities/game.js\";\nimport { createMode } from \"@core/domain/entities/mode.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type CreateGameUseCase = (mode: string) => Result<GameWithNextStep>;\n\nexport const createGameUseCase =\n (deps: {\n modeRepository: ModeRepository;\n dominoesRepository: DominoesRepository;\n uuidMethod: UuidMethod;\n }): CreateGameUseCase =>\n (mode) => {\n const { modeRepository, dominoesRepository, uuidMethod } = deps;\n const id = uuidMethod();\n const availableMode = modeRepository.getAvailables();\n const newMode = createMode(mode, availableMode);\n\n if (isErr(newMode)) {\n return newMode;\n }\n\n const dominoes = dominoesRepository.getForMode(newMode.value);\n\n if (!dominoes || dominoes.length === 0) {\n return err(`No dominoes found for mode ${newMode.value.name}`);\n }\n\n const payload = {\n id,\n mode: newMode.value,\n dominoes,\n };\n\n const newGame = create(payload);\n\n return ok(newGame);\n };\n","import {\n allLordsHavePlayed,\n canPass,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport { err, ok } from \"@utils/result.js\";\n\nexport type DiscardDominoUseCase = (\n game: GameWithNextAction,\n lordId: string\n) => GameStateResult;\n\nexport const discardDominoUseCase: DiscardDominoUseCase = (game, lordId) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPass(currentLord)) {\n return err(\"Lord can't pass\");\n }\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLord = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLord)) {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: resultStep,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: <NextAction>nextLordWithAction(updatedLord),\n };\n }\n\n return ok(updatedGame);\n};\n","import { getAvailablesExtraRules } from \"@core/domain/entities/rule.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { err, type Result } from \"@utils/result.js\";\n\nexport type GetExtraRulesUseCase = (\n mode: GameMode[\"name\"],\n players: number\n) => Result<ExtraRule[]>;\n\nexport const getExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): GetExtraRulesUseCase =>\n (mode: GameMode[\"name\"], players: number): Result<ExtraRule[]> => {\n const { ruleRepository } = deps;\n\n const allExtraRules = ruleRepository.getAllExtra();\n\n if (!allExtraRules) {\n return err(\"No rules found\");\n }\n\n return getAvailablesExtraRules(allExtraRules, mode, players);\n };\n","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetModesUseCase = () => Result<GameMode[]>;\n\nexport const getModesUseCase =\n (deps: { modeRepository: ModeRepository }): GetModesUseCase =>\n (): Result<GameMode[]> => {\n const { modeRepository } = deps;\n return ok(modeRepository.getAvailables());\n };\n","import {\n checkCastleIsInMiddle,\n countDominoes,\n} from \"@core/domain/entities/kingdom.js\";\nimport type {\n FinalResult,\n GameWithNextStep,\n GameWithResults,\n ScoreResult,\n} from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\ntype Property = {\n type: string;\n crowns: number;\n size: number;\n tiles: number[][];\n};\n\nexport type GetResultUseCase = (\n game: GameWithNextStep\n) => Result<GameWithResults>;\n\nexport const getResultUseCase: GetResultUseCase = (game) => {\n const { players, rules } = game;\n const { basic, extra } = rules;\n const scores: ScoreResult[] = players.map((player) => {\n const { kingdom } = player;\n const visited: boolean[][] = kingdom.map((row) => row.map(() => false));\n const properties: Property[] = [];\n\n const directions = [\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n ]; // Up, Down, Left, Right\n\n const markZone = (\n x: number,\n y: number,\n type: string,\n crowns: number\n ): void => {\n if (\n x < 0 ||\n y < 0 ||\n x >= kingdom[0]!.length ||\n y >= kingdom.length ||\n visited[y]![x] ||\n kingdom[y]![x]!.type !== type ||\n kingdom[y]![x]!.type === \"empty\" ||\n kingdom[y]![x]!.type === \"castle\"\n ) {\n return;\n }\n\n visited[y]![x] = true;\n const currentZone = properties.find(\n (property) =>\n property.type === type &&\n property.tiles.some(([tx, ty]) => {\n for (let [dx, dy] of directions) {\n if (\n (tx as number) + (dx as number) === x &&\n (ty as number) + (dy as number) === y\n ) {\n return true;\n }\n }\n return false;\n })\n );\n\n if (currentZone) {\n currentZone.size += 1;\n currentZone.tiles.push([x, y]);\n currentZone.crowns += crowns;\n } else {\n properties.push({\n type,\n crowns,\n size: 1,\n tiles: [[x, y]],\n });\n }\n\n directions.forEach(([dx, dy]) => {\n const nx = x + (dx as number);\n const ny = y + (dy as number);\n if (\n nx >= 0 &&\n ny >= 0 &&\n nx < kingdom[0]!.length &&\n ny < kingdom.length &&\n kingdom[ny]![nx]!.type === type\n ) {\n markZone(nx, ny, kingdom[ny]![nx]!.type, kingdom[ny]![nx]!.crowns);\n }\n });\n };\n\n kingdom.forEach((row, y) => {\n row.forEach((tile, x) => {\n if (!visited[y]![x]) {\n markZone(x, y, tile.type, tile.crowns);\n }\n });\n });\n\n if (properties.length === 0) {\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n points: 0,\n maxPropertiesSize: 0,\n totalCrowns: 0,\n },\n };\n }\n\n let points = properties.reduce(\n (score, property) => score + property.crowns * property.size,\n 0\n );\n const maxPropertiesSize = Math.max(\n ...properties.map((property) => property.size ?? 0)\n );\n\n const totalCrowns = properties.reduce(\n (total, property) => total + property.crowns,\n 0\n );\n\n if (extra.length > 0) {\n extra.forEach((extraRule) => {\n if (extraRule.name === \"The middle Kingdom\") {\n const castleIsInMiddle = checkCastleIsInMiddle(kingdom);\n if (castleIsInMiddle) {\n points += 10;\n }\n }\n\n if (extraRule.name === \"Harmony\") {\n const totalDominoes = countDominoes(kingdom);\n const dominoLimit = basic.maxDominoes;\n const totalPlayers = players.length;\n const dominoesPerPlayer = dominoLimit / totalPlayers;\n if (totalDominoes === dominoesPerPlayer) {\n points += 5;\n }\n }\n });\n }\n\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n points,\n maxPropertiesSize,\n totalCrowns,\n },\n };\n });\n\n // 1 order players by score, then by maxPropertiesSize, then by totalCrowns all descending\n scores.sort((a, b) => {\n if (a.details.points !== b.details.points) {\n return b.details.points - a.details.points;\n }\n if (a.details.maxPropertiesSize !== b.details.maxPropertiesSize) {\n return b.details.maxPropertiesSize - a.details.maxPropertiesSize;\n }\n return b.details.totalCrowns - a.details.totalCrowns;\n });\n\n const result: FinalResult[] = [];\n\n let isTie = false;\n result.push({\n playerId: scores[0]!.playerId,\n playerName: scores[0]!.playerName,\n details: scores[0]!.details,\n position: 1,\n });\n\n for (let i = 1; i < scores.length; i++) {\n const currentScore = scores[i];\n const previousScore = scores[i - 1];\n if (\n previousScore &&\n currentScore &&\n currentScore.details.points === previousScore.details.points &&\n currentScore.details.maxPropertiesSize ===\n previousScore.details.maxPropertiesSize &&\n currentScore.details.totalCrowns === previousScore.details.totalCrowns\n ) {\n isTie = true;\n }\n\n if (isTie) {\n result.push({\n ...currentScore!,\n position: result[i - 1]!.position,\n });\n } else {\n result.push({\n ...currentScore!,\n position: i + 1,\n });\n }\n\n isTie = false;\n }\n\n return ok({\n ...game,\n result: result,\n });\n};\n","import { err, isErr, ok } from \"@utils/result.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport {\n allLordsHavePlayed,\n canPlaceAndDominoPickedIsDefined,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport { placeDomino } from \"@core/domain/entities/kingdom.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"@core/domain/types/kingdom.js\";\n\nexport type PlaceDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n) => GameStateResult;\n\nexport const placeDominoUseCase: PlaceDominoUseCase = (\n game,\n lordId,\n position,\n orientation,\n rotation\n) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPlaceAndDominoPickedIsDefined(currentLord)) {\n return err(\"Lord can't place\");\n }\n\n const domino = currentLord.dominoPicked;\n\n const currentPlayer = game.players.find(\n (player) => player.id === currentLord.playerId\n );\n\n if (!currentPlayer) {\n return err(\"Player not found\");\n }\n\n const updatedKingdom = placeDomino(\n currentPlayer.kingdom,\n position,\n orientation,\n rotation,\n domino\n );\n\n if (isErr(updatedKingdom)) {\n return updatedKingdom;\n }\n\n const updatedPlayers = game.players.map((player) => {\n if (player.id === currentPlayer.id) {\n player.kingdom = updatedKingdom.value;\n }\n return player;\n });\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLords)) {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: resultStep,\n players: updatedPlayers,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: <NextAction>nextLordWithAction(updatedLords),\n players: updatedPlayers,\n };\n }\n\n return ok(updatedGame);\n};\n","import { createLord } from \"@core/domain/entities/lord\";\nimport type {\n GameWithNextAction,\n GameWithNextStep,\n NextAction,\n} from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type StartGameUseCase = (\n game: GameWithNextStep\n) => Result<GameWithNextAction>;\n\nexport const startGameUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n }): StartGameUseCase =>\n (game) => {\n const { uuidMethod, shuffleMethod } = deps;\n const {\n rules: {\n basic: { lords: maxLords, dominoesPerTurn },\n },\n players,\n dominoes,\n } = game;\n\n const numberOfPlayers = players.length;\n\n const newLords: Lord[] = [];\n\n for (let i = 0; i < numberOfPlayers; i++) {\n for (let j = 0; j < maxLords; j++) {\n const lord = createLord(uuidMethod(), players[i]!.id);\n newLords.push(lord);\n }\n }\n\n const shuffledLords = shuffleMethod(newLords);\n const dominoesCopy = [...dominoes];\n const dominoesDrawn = dominoesCopy.splice(0, dominoesPerTurn);\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const nextAction: NextAction = {\n type: \"action\",\n nextLord: shuffledLords[0]!.id,\n nextAction: playerActions.pickDomino,\n };\n\n const newState: GameWithNextAction = {\n ...game,\n lords: shuffledLords,\n nextAction,\n dominoes: dominoesCopy,\n currentDominoes: dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n }),\n };\n\n return ok(newState);\n };\n","import jsonDominoes from \"@adapter/jsonDominoes.js\";\nimport jsonModes from \"@adapter/jsonModes.js\";\nimport jsonRules from \"@adapter/jsonRules.js\";\nimport { shuffleMethod } from \"@adapter/shuffle.js\";\nimport { uuidMethod } from \"@adapter/uuid.js\";\nimport { winstonLogger } from \"@adapter/winstonLogger.js\";\nimport { addExtraRulesHandler } from \"@application/handlers/addExtraRulesHandler.js\";\nimport { addPlayersHandler } from \"@application/handlers/addPlayersHandler.js\";\nimport { chooseDominoHandler } from \"@application/handlers/chooseDominoHandler.js\";\nimport { createGameHandler } from \"@application/handlers/createGameHandler.js\";\nimport { discardDominoHandler } from \"@application/handlers/discardDominoHandler.js\";\nimport { getExtraRulesHandler } from \"@application/handlers/getExtraRulesHandler.js\";\nimport { getModesHandler } from \"@application/handlers/getModesHandler.js\";\nimport { getResultHandler } from \"@application/handlers/getResultHandler.js\";\nimport { placeDominoHandler } from \"@application/handlers/placeDominoHandler.js\";\nimport { startGameHandler } from \"@application/handlers/startGameHandler.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { addExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { addPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { chooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { createGameUseCase } from \"@core/useCases/createGame.js\";\nimport { discardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { getExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { getModesUseCase } from \"@core/useCases/getModes.js\";\nimport { getResultUseCase } from \"@core/useCases/getResult.js\";\nimport { placeDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { startGameUseCase } from \"@core/useCases/startGame.js\";\n\nexport type EngineConfig = {\n uuidMethod?: UuidMethod;\n shuffleMethod?: ShuffleMethod;\n logging?: boolean;\n};\n\nexport const configureEngine = (config: Partial<EngineConfig>) => {\n const modeRepository = jsonModes();\n const dominoesRepository = jsonDominoes();\n const ruleRepository = jsonRules();\n const uuid = config.uuidMethod || uuidMethod;\n const shuffle = config.shuffleMethod || shuffleMethod;\n const logger = config.logging ? winstonLogger(true) : winstonLogger(false);\n\n return {\n createGameHandler: createGameHandler(\n logger,\n createGameUseCase({\n modeRepository,\n dominoesRepository,\n uuidMethod: uuid,\n })\n ),\n getModesHandler: getModesHandler(\n logger,\n getModesUseCase({ modeRepository })\n ),\n getExtraRulesHandler: getExtraRulesHandler(\n logger,\n getExtraRulesUseCase({ ruleRepository })\n ),\n addPlayersHandler: addPlayersHandler(\n logger,\n addPlayersUseCase({\n uuidMethod: uuid,\n shuffleMethod: shuffle,\n ruleRepository,\n })\n ),\n addExtraRulesHandler: addExtraRulesHandler(\n logger,\n addExtraRulesUseCase({ ruleRepository })\n ),\n startGameHandler: startGameHandler(\n logger,\n startGameUseCase({ uuidMethod: uuid, shuffleMethod: shuffle })\n ),\n chooseDominoHandler: chooseDominoHandler(logger, chooseDominoUseCase),\n placeDominoHandler: placeDominoHandler(logger, placeDominoUseCase),\n discardDominoHandler: discardDominoHandler(logger, discardDominoUseCase),\n getResultHandler: getResultHandler(logger, getResultUseCase),\n };\n};\n","import type { GameEngine } from \"./core/portUserside/engine.js\";\nimport { configureEngine, type EngineConfig } from \"./config.js\";\n\nexport const createGameEngine = (config: Partial<EngineConfig>): GameEngine => {\n const {\n createGameHandler,\n getModesHandler,\n getExtraRulesHandler,\n addPlayersHandler,\n addExtraRulesHandler,\n startGameHandler,\n chooseDominoHandler,\n placeDominoHandler,\n discardDominoHandler,\n getResultHandler,\n } = configureEngine(config);\n\n return {\n getModes: (command) => getModesHandler(command),\n getExtraRules: (command) => getExtraRulesHandler(command),\n createGame: (command) => createGameHandler(command),\n addPlayers: (command) => addPlayersHandler(command),\n addExtraRules: (command) => addExtraRulesHandler(command),\n startGame: (command) => startGameHandler(command),\n chooseDomino: (command) => chooseDominoHandler(command),\n placeDomino: (command) => placeDominoHandler(command),\n discardDomino: (command) => discardDominoHandler(command),\n getResults: (command) => getResultHandler(command),\n };\n};\n"],"mappings":"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","names":["uuidMethod","shuffleMethod","lord","next","updatedCurrentDominoes","uuidMethod","uuidMethod","shuffleMethod","createGameHandler","getModesHandler","getExtraRulesHandler","addPlayersHandler","addExtraRulesHandler","startGameHandler","chooseDominoHandler","placeDominoHandler","discardDominoHandler","getResultHandler"]}
|
|
1
|
+
{"version":3,"sources":["../src/datasources/dominoes.json","../src/adapterServerside/jsonDominoes.ts","../src/datasources/modes.json","../src/adapterServerside/jsonModes.ts","../src/datasources/rules.json","../src/adapterServerside/jsonRules.ts","../src/adapterServerside/shuffle.ts","../src/adapterServerside/uuid.ts","../src/adapterServerside/winstonLogger.ts","../src/core/domain/errors/domainErrors.ts","../src/core/domain/types/game.ts","../src/utils/result.ts","../src/application/handlers/addExtraRulesHandler.ts","../src/application/handlers/addPlayersHandler.ts","../src/application/handlers/chooseDominoHandler.ts","../src/application/handlers/createGameHandler.ts","../src/application/handlers/discardDominoHandler.ts","../src/application/handlers/getExtraRulesHandler.ts","../src/application/handlers/getModesHandler.ts","../src/application/handlers/getResultHandler.ts","../src/application/handlers/placeDominoHandler.ts","../src/application/handlers/startGameHandler.ts","../src/application/handlers/calculateScoreHandler.ts","../src/core/domain/types/kingdom.ts","../src/core/domain/types/domino.ts","../src/core/domain/types/player.ts","../src/core/domain/entities/rule.ts","../src/core/useCases/addExtraRules.ts","../src/core/domain/entities/domino.ts","../src/core/domain/entities/kingdom.ts","../src/core/domain/entities/player.ts","../src/core/useCases/addPlayers.ts","../src/core/domain/entities/lord.ts","../src/core/useCases/chooseDomino.ts","../src/core/domain/entities/game.ts","../src/core/domain/entities/mode.ts","../src/core/useCases/createGame.ts","../src/core/useCases/discardDomino.ts","../src/core/useCases/getExtraRules.ts","../src/core/useCases/getModes.ts","../src/core/useCases/getResult.ts","../src/core/useCases/placeDomino.ts","../src/core/useCases/startGame.ts","../src/core/useCases/calculateScore.ts","../src/config.ts","../src/index.ts"],"sourcesContent":["{\n \"Classic\": [\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 1\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 2\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 3\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 4\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 5\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 6\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 7\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 8\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 9\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 10\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 11\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 12\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 13\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 14\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 15\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 16\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 17\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 18\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 19\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 20\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 21\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 22\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 0\n },\n \"number\": 23\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 24\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 25\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 26\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 27\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"number\": 28\n },\n {\n \"left\": {\n \"type\": \"forest\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"number\": 29\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 30\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 31\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 32\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 33\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 34\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"forest\",\n \"crowns\": 0\n },\n \"number\": 35\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 36\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 1\n },\n \"number\": 37\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 1\n },\n \"number\": 38\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"number\": 39\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 1\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 40\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 41\n },\n {\n \"left\": {\n \"type\": \"sea\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"plain\",\n \"crowns\": 2\n },\n \"number\": 42\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 43\n },\n {\n \"left\": {\n \"type\": \"plain\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"swamp\",\n \"crowns\": 2\n },\n \"number\": 44\n },\n {\n \"left\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"right\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"number\": 45\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 46\n },\n {\n \"left\": {\n \"type\": \"swamp\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 2\n },\n \"number\": 47\n },\n {\n \"left\": {\n \"type\": \"wheat\",\n \"crowns\": 0\n },\n \"right\": {\n \"type\": \"mine\",\n \"crowns\": 3\n },\n \"number\": 48\n }\n ]\n}\n","import type { Domino, Ground } from \"@core/domain/types/domino.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport dominoesJson from \"../datasources/dominoes.json\" assert { type: \"json\" };\n\nconst jsonDominoes = (): DominoesRepository => {\n const dominoes: Record<string, Domino[]> = {};\n\n for (const [key, value] of Object.entries(dominoesJson)) {\n const currentDominoes: Domino[] = [];\n value.forEach((domino) => {\n currentDominoes.push({\n left: {\n type: <Ground>domino.left.type,\n crowns: domino.left.crowns,\n },\n right: {\n type: <Ground>domino.right.type,\n crowns: domino.right.crowns,\n },\n number: domino.number,\n });\n });\n\n dominoes[key] = currentDominoes;\n }\n\n return {\n getForMode: (mode: GameMode) => {\n return dominoes[mode.name] || [];\n },\n };\n};\n\nexport default jsonDominoes;\n","[\n {\n \"name\": \"Classic\",\n \"description\": \"Original KingDomino rules\"\n }\n]","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport modesJson from \"../datasources/modes.json\" assert { type: \"json\" };\n\nconst jsonModes = (): ModeRepository => {\n const modes: GameMode[] = [];\n\n modesJson.forEach((mode) => {\n modes.push({\n name: mode.name,\n description: mode.description,\n });\n });\n\n return {\n getAvailables: () => {\n return modes;\n },\n };\n};\n\nexport default jsonModes;\n","{\n \"commun\": [\n {\n \"playersLimit\": 2,\n \"lordsPerPlayer\": 2,\n \"maxDominoes\": 24,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 6\n },\n {\n \"playersLimit\": 3,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 36,\n \"dominoesPerTurn\": 3,\n \"maxTurns\": 12\n },\n {\n \"playersLimit\": 4,\n \"lordsPerPlayer\": 1,\n \"maxDominoes\": 48,\n \"dominoesPerTurn\": 4,\n \"maxTurns\": 12\n }\n ],\n \"extra\": [\n {\n \"name\": \"The middle Kingdom\",\n \"description\": \"Gain 10 additional points if your castle is in the middle of the kingdom.\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n },\n {\n \"name\": \"Harmony\",\n \"description\": \"Gain 5 additional points if your kingdom is complete (no discarded dominoes).\",\n \"mode\": [{ \"name\": \"Classic\", \"description\": \"King Domino classic mode\" }]\n }\n ]\n}\n","import type { Rules } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport rulesJson from \"../datasources/rules.json\" assert { type: \"json\" };\n\nconst jsonRules = (): RuleRepository => {\n const rules: Rules = {\n basic: {},\n extraRules: [],\n };\n\n const commonRules = rulesJson.commun;\n const extraRules = rulesJson.extra;\n\n commonRules.forEach((rule) => {\n rules.basic[rule.playersLimit] = {\n lords: rule.lordsPerPlayer,\n maxDominoes: rule.maxDominoes,\n dominoesPerTurn: rule.dominoesPerTurn,\n maxTurns: rule.maxTurns,\n };\n });\n\n extraRules.forEach((rule) => {\n rules.extraRules.push({\n name: rule.name,\n description: rule.description,\n mode: rule.mode,\n });\n });\n\n return {\n getAll: () => {\n return rules;\n },\n getAllExtra: () => {\n return rules.extraRules;\n },\n };\n};\n\nexport default jsonRules;\n","import type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\n\nexport const shuffleMethod: ShuffleMethod = <T>(array: T[]) => {\n for (let i = array.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [array[i], array[j]] = [array[j] as T, array[i] as T];\n }\n return array;\n};\n","import type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { randomUUID } from \"crypto\";\n\nexport const uuidMethod: UuidMethod = () => {\n return randomUUID();\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport winston from \"winston\";\n\nexport const winstonLogger = (isLoggingEnabled: boolean): Logger => {\n const myFormat = winston.format.printf(\n ({ level, message, label, timestamp }) => {\n return `${timestamp} [${label}] ${level}: ${message}`;\n }\n );\n\n const logger = winston.createLogger({\n level: \"info\",\n format: winston.format.combine(\n winston.format.label({ label: \"KDomino_Engine\" }),\n winston.format.timestamp(),\n winston.format.simple(),\n winston.format.json(),\n winston.format.colorize(),\n myFormat\n ),\n transports: [new winston.transports.Console()],\n });\n\n return {\n info: (message: string) => {\n if (isLoggingEnabled) {\n logger.info(message);\n }\n return void 0;\n },\n error: (message: string) => {\n if (isLoggingEnabled) {\n logger.error(message);\n }\n return void 0;\n },\n };\n};\n","export class InvalidStepError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"InvalidStepError\";\n }\n}\n\nexport class StepExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"StepExecutionError\";\n }\n}\n\nexport class ActionExecutionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ActionExecutionError\";\n }\n}\n\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotFoundError\";\n }\n}\n","import type { Result } from \"@utils/result.js\";\nimport type { Domino, RevealsDomino } from \"./domino.js\";\nimport type { Lord } from \"./lord.js\";\nimport type { GameMode } from \"./mode.js\";\nimport type { Player, PlayerActions } from \"./player.js\";\nimport type { SelectedRules } from \"./rule.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Game = {\n id: string;\n dominoes: Domino[];\n currentDominoes: RevealsDomino[];\n players: Player[];\n lords: Lord[];\n turn: number;\n nextAction: NextAction | NextStep;\n rules: SelectedRules;\n mode: GameMode;\n};\n\nexport const gameSteps = {\n addPlayers: \"addPlayers\",\n options: \"options\",\n start: \"start\",\n result: \"result\",\n} as const;\n\nexport type GameSteps = ObjectValues<typeof gameSteps>;\n\nexport type NextAction = {\n type: \"action\";\n nextLord: string;\n nextAction: PlayerActions;\n};\n\nexport type NextStep = {\n type: \"step\";\n step: GameSteps;\n};\n\nexport type GameWithNextAction = Game & { nextAction: NextAction };\nexport type GameWithNextStep = Game & { nextAction: NextStep };\nexport type GameState = GameWithNextAction | GameWithNextStep;\nexport type GameStateResult = Result<GameState>;\n\nexport const isGameWithNextAction = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextAction => {\n return game.nextAction.type === \"action\";\n};\n\nexport const isGameWithNextStep = (\n game: GameWithNextAction | GameWithNextStep\n): game is GameWithNextStep => {\n return game.nextAction.type === \"step\";\n};\n\nexport type Score = {\n points: number;\n maxPropertiesSize: number;\n totalCrowns: number;\n};\n\nexport type ScoreResult = {\n playerId: string;\n playerName: string;\n details: Score;\n};\n\nexport type FinalResult = ScoreResult & {\n position: number;\n};\n\nexport type GameWithResults = Game & { result: FinalResult[] };\n","export type Result<T> = Ok<T> | Err;\n\nexport interface Ok<T> {\n readonly tag: \"Ok\";\n readonly value: T;\n}\n\nexport interface Err {\n readonly tag: \"Err\";\n readonly error: string;\n}\n\nexport const ok = <T>(value: T): Ok<T> => ({ tag: \"Ok\", value });\nexport const err = (error: string): Err => ({ tag: \"Err\", error });\n\nexport const isOk = <T>(result: Result<T>): result is Ok<T> =>\n result.tag === \"Ok\";\nexport const isErr = <T>(result: Result<T>): result is Err =>\n result.tag === \"Err\";\n\nexport const unwrap = <T>(result: Ok<T> | Err): T => {\n if (result.tag === \"Err\") {\n throw result.error;\n }\n return result.value;\n};\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddExtraRulesCommand } from \"@application/commands/addExtraRulesCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddExtraRulesHandler = (command: AddExtraRulesCommand) => GameWithNextStep;\n\nexport const addExtraRulesHandler =\n (logger: Logger, useCase: AddExtraRulesUseCase): AddExtraRulesHandler =>\n (command: AddExtraRulesCommand) => {\n const { game, extraRules } = command;\n logger.info(`Adding extra rules to game: ${game.id}`);\n logger.info(`Extra rules: ${extraRules}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"options\") {\n logger.error(\n `Required game with options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with options step\");\n }\n\n const result = useCase(game, extraRules);\n\n if (isErr(result)) {\n logger.error(`Error adding extra rules: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Extra rules added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { AddPlayersCommand } from \"@application/commands/addPlayersCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextStep,\n} from \"@core/domain/types/game.js\";\nimport type { AddPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype AddPlayersHandler = (command: AddPlayersCommand) => GameWithNextStep;\n\nexport const addPlayersHandler =\n (logger: Logger, useCase: AddPlayersUseCase): AddPlayersHandler =>\n (command: AddPlayersCommand) => {\n const { game, players } = command;\n\n logger.info(`Adding players to game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"addPlayers\") {\n logger.error(\n `Required game with addPlayers step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with addPlayers step\");\n }\n\n const result = useCase(game, players);\n\n if (isErr(result)) {\n logger.error(`Error adding players: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Players added to game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { ChooseDominoCommand } from \"@application/commands/chooseDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { ChooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype ChooseDominoHandler = (command: ChooseDominoCommand) => GameWithNextAction;\n\nexport const chooseDominoHandler =\n (logger: Logger, useCase: ChooseDominoUseCase): ChooseDominoHandler =>\n (command: ChooseDominoCommand) => {\n const { game, lordId, dominoPick } = command;\n logger.info(\n `Choosing domino: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"pickDomino\") {\n logger.error(\n `Required game with pickDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with pickDomino action\");\n }\n\n const result = useCase(game, lordId, dominoPick);\n\n if (isErr(result)) {\n logger.error(`Error choosing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n logger.info(\n `Domino chosen: ${dominoPick} for lord: ${lordId} in game: ${game.id}`\n );\n return result.value;\n };\n","import { StepExecutionError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { CreateGameUseCase } from \"@core/useCases/createGame.js\";\nimport type { CreateGameCommand } from \"@application/commands/createGameCommand.js\";\nimport { isErr } from \"@utils/result.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\n\ntype CreateGameHandler = (command: CreateGameCommand) => GameWithNextStep;\n\nexport const createGameHandler =\n (logger: Logger, useCase: CreateGameUseCase): CreateGameHandler =>\n (command: CreateGameCommand) => {\n logger.info(`Creating game with mode: ${command.mode}`);\n const result = useCase(command.mode);\n\n if (isErr(result)) {\n logger.error(`Error creating game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game created: ${result.value.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { DiscardDominoCommand } from \"@application/commands/discardDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { DiscardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype DiscardDominoHandler = (command: DiscardDominoCommand) => GameState;\n\nexport const discardDominoHandler =\n (logger: Logger, useCase: DiscardDominoUseCase): DiscardDominoHandler =>\n (command: DiscardDominoCommand) => {\n const { game, lordId } = command;\n logger.info(`Discarding domino for lord: ${lordId} in game: ${game.id}`);\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino action\");\n }\n\n const result = useCase(game, lordId);\n\n if (isErr(result)) {\n logger.error(`Error discarding domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n }\n\n logger.info(`Domino discarded: ${lordId} in game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetExtraRulesCommand } from \"@application/commands/getExtraRulesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { GetExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetExtraRulesHandler = (command: GetExtraRulesCommand) => ExtraRule[];\n\nexport const getExtraRulesHandler =\n (logger: Logger, useCase: GetExtraRulesUseCase): GetExtraRulesHandler =>\n (command: GetExtraRulesCommand) => {\n const { mode, players } = command;\n logger.info(\n `Getting extra rules for mode: ${mode} and players: ${players}`\n );\n const result = useCase(mode, players);\n\n if (isErr(result)) {\n logger.error(`Error getting extra rules: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Extra rules retrieved: ${result.value}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { GetModesCommand } from \"@application/commands/getModesCommand.js\";\nimport { NotFoundError } from \"@core/domain/errors/domainErrors.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { GetModesUseCase } from \"@core/useCases/getModes.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetModesHandler = (command: GetModesCommand) => GameMode[];\n\nexport const getModesHandler =\n (logger: Logger, useCase: GetModesUseCase): GetModesHandler =>\n (_command: GetModesCommand) => {\n logger.info(\"Getting modes\");\n const result = useCase();\n\n if (isErr(result)) {\n logger.error(`Error getting modes: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Modes retrieved: ${result.value}`);\n return result.value;\n };\n","import type { GetResultCommand } from \"@application/commands/getResultCommand.js\";\nimport {\n InvalidStepError,\n NotFoundError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithResults,\n type ScoreResult,\n} from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { CalculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\nimport type { GetResultUseCase } from \"@core/useCases/getResult.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype GetResultHandler = (command: GetResultCommand) => GameWithResults;\n\nexport const getResultHandler =\n (\n logger: Logger,\n useCases: {\n getResultUseCase: GetResultUseCase;\n calculateScoreUseCase: CalculateScoreUseCase;\n }\n ): GetResultHandler =>\n (command: GetResultCommand) => {\n const { getResultUseCase, calculateScoreUseCase } = useCases;\n const { game } = command;\n logger.info(`Getting result for game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (game.nextAction.step !== \"result\") {\n logger.error(\n `Required game with result step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\"Required game with result step\");\n }\n\n let scoreResult: ScoreResult[];\n const { players } = game;\n\n scoreResult = players.map((player) => {\n const { kingdom } = player;\n const result = calculateScoreUseCase(kingdom);\n\n if (isErr(result)) {\n logger.error(`Error when calculating score: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n return {\n playerId: player.id,\n playerName: player.name,\n details: {\n ...result.value,\n },\n };\n });\n\n const result = getResultUseCase(game, scoreResult);\n\n if (isErr(result)) {\n logger.error(`Error getting result: ${result.error}`);\n throw new NotFoundError(result.error);\n }\n\n logger.info(`Result retrieved for game: ${game.id}`);\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { PlaceDominoCommand } from \"@application/commands/placeDominoCommand.js\";\nimport {\n ActionExecutionError,\n InvalidStepError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextAction,\n type GameState,\n} from \"@core/domain/types/game.js\";\nimport type { PlaceDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype PlaceDominoHandler = (command: PlaceDominoCommand) => GameState;\n\nexport const placeDominoHandler =\n (logger: Logger, useCase: PlaceDominoUseCase): PlaceDominoHandler =>\n (command: PlaceDominoCommand) => {\n const { game, lordId, position, orientation, rotation } = command;\n logger.info(\n `Placing domino: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n\n if (!isGameWithNextAction(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'action' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\n \"Required game with nextAction type: 'action'\"\n );\n }\n\n if (game.nextAction.nextAction !== \"placeDomino\") {\n logger.error(\n `Required game with placeDomino action but got: ${game.nextAction.nextAction}`\n );\n throw new InvalidStepError(\"Required game with placeDomino step\");\n }\n\n const result = useCase(game, lordId, position, orientation, rotation);\n\n if (isErr(result)) {\n logger.error(`Error placing domino: ${result.error}`);\n throw new ActionExecutionError(result.error);\n }\n\n if (isGameWithNextAction(result.value)) {\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n }\n\n logger.info(\n `Domino placed: ${lordId} in position: ${JSON.stringify(\n position\n )} with orientation: ${orientation} and rotation: ${rotation} in game: ${\n game.id\n }`\n );\n return result.value;\n };\n","import type { Logger } from \"@core/portServerside/logger.js\";\nimport type { StartGameCommand } from \"@application/commands/startGameCommand.js\";\nimport {\n InvalidStepError,\n StepExecutionError,\n} from \"@core/domain/errors/domainErrors.js\";\nimport {\n isGameWithNextStep,\n type GameWithNextAction,\n} from \"@core/domain/types/game.js\";\nimport type { StartGameUseCase } from \"@core/useCases/startGame.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype StartGameHandler = (command: StartGameCommand) => GameWithNextAction;\n\nexport const startGameHandler =\n (logger: Logger, useCase: StartGameUseCase): StartGameHandler =>\n (command: StartGameCommand) => {\n const { game } = command;\n logger.info(`Starting game: ${game.id}`);\n\n if (!isGameWithNextStep(game)) {\n logger.error(\n `Invalid game, required nextAction type: 'step' but got: ${game.nextAction.type}`\n );\n throw new InvalidStepError(\"Required game with nextAction type: 'step'\");\n }\n\n if (\n game.nextAction.step !== \"start\" &&\n game.nextAction.step !== \"options\"\n ) {\n logger.error(\n `Required game with start step or options step but got: ${game.nextAction.step}`\n );\n throw new InvalidStepError(\n \"Required game with start step or options step\"\n );\n }\n\n const result = useCase(game);\n\n if (isErr(result)) {\n logger.error(`Error starting game: ${result.error}`);\n throw new StepExecutionError(result.error);\n }\n\n logger.info(`Game started: ${game.id}`);\n return result.value;\n };\n","import type { CalculateScoreCommand } from \"@application/commands/calculateScoreCommand.js\";\nimport type { Score } from \"@core/domain/types/game.js\";\nimport type { Logger } from \"@core/portServerside/logger.js\";\nimport type { CalculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\nimport { isErr } from \"@utils/result.js\";\n\ntype CalculateScoreHandler = (command: CalculateScoreCommand) => Score;\n\nexport const calculateScoreHandler =\n (logger: Logger, useCase: CalculateScoreUseCase): CalculateScoreHandler =>\n (command) => {\n const { kingdom } = command;\n logger.info(`Calculating score for kingdom`);\n const result = useCase(kingdom);\n\n if (isErr(result)) {\n logger.error(`Error calculating score: ${result.error}`);\n throw new Error(result.error);\n }\n\n logger.info(`Score calculated: ${result.value}`);\n return result.value;\n };\n","import type { EmptyTile, Tile } from \"./domino.js\";\n\nexport type Position = {\n x: number; // cols\n y: number; // rows\n};\n\nexport type Orientation = \"vertical\" | \"horizontal\";\n\nexport type Rotation = 0 | 180;\n\nexport type Kingdom = (Tile | EmptyTile)[][];\n\nexport const GRIDSIZE = 9;\n","export const GROUND = [\n \"castle\",\n \"wheat\",\n \"forest\",\n \"sea\",\n \"plain\",\n \"swamp\",\n \"mine\",\n] as const;\n\nexport type Ground = (typeof GROUND)[number];\nexport type EmptyGround = \"empty\";\n\nexport type Crown = number;\n\nexport type Tile = {\n type: Ground;\n crowns: Crown;\n};\n\nexport type EmptyTile = {\n type: EmptyGround;\n crowns: 0;\n};\n\nexport type Domino = {\n left: Tile;\n right: Tile;\n number: number;\n};\n\nexport type RevealsDomino = {\n domino: Domino;\n picked: boolean;\n lordId: string | null;\n position: number;\n};\n","import type { Kingdom } from \"./kingdom.js\";\nimport type { ObjectValues } from \"./utils.js\";\n\nexport type Player = {\n id: string;\n name: string;\n kingdom: Kingdom;\n};\n\nexport type PlayerPayload = {\n name: string;\n};\n\nexport type PlayersPayload = PlayerPayload[];\n\nexport type Players = Player[];\n\nexport const playerActions = {\n placeDomino: \"placeDomino\",\n pickDomino: \"pickDomino\",\n pass: \"pass\",\n} as const;\n\nexport type PlayerActions = ObjectValues<typeof playerActions>;\n","import type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport { ok, err, type Result } from \"@utils/result.js\";\n\nexport const getAvailablesExtraRules = (\n extraRules: ExtraRule[],\n mode: string,\n numberOfPlayers: number\n): Result<ExtraRule[]> => {\n const availableExtraRules = extraRules.filter((rule) => {\n return (\n rule.mode.filter((m) => m.name === mode).length > 0 &&\n (!rule.playersLimit || rule.playersLimit === numberOfPlayers)\n );\n });\n\n if (availableExtraRules.length === 0) {\n return err(\"No extra rules found\");\n }\n\n return ok(availableExtraRules);\n};\n\nexport const toExtraRule = (\n rule: string,\n extraRules: ExtraRule[]\n): Result<ExtraRule> => {\n const foundRule = extraRules.find((r) => r.name === rule);\n\n if (!foundRule) {\n return err(`Rule not found: ${rule}`);\n }\n\n return ok(foundRule);\n};\n","import {\n gameSteps,\n type ExtraRule,\n type GameWithNextStep,\n type NextStep,\n} from \"@core/domain/types/index.js\";\nimport { isErr, ok, type Result } from \"@utils/result.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { toExtraRule } from \"@core/domain/entities/rule.js\";\n\nexport type AddExtraRulesUseCase = (\n game: GameWithNextStep,\n rules: string[]\n) => Result<GameWithNextStep>;\n\nexport const addExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): AddExtraRulesUseCase =>\n (game, rules) => {\n const { ruleRepository } = deps;\n const availableExtraRules = ruleRepository.getAllExtra();\n\n const newExtraRules: ExtraRule[] = [];\n\n for (const rule of rules) {\n const result = toExtraRule(rule, availableExtraRules);\n\n if (isErr(result)) {\n return result;\n }\n\n newExtraRules.push(result.value);\n }\n\n const updatedRules = {\n basic: game.rules.basic,\n extra: newExtraRules,\n };\n\n const next: NextStep = {\n type: \"step\",\n step: gameSteps.start,\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n rules: updatedRules,\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import {\n GROUND,\n type Crown,\n type EmptyGround,\n type EmptyTile,\n type Ground,\n type Tile,\n} from \"@core/domain/types/domino.js\";\n\nconst isGround = (ground: any): ground is Ground => {\n return GROUND.includes(ground);\n};\n\nexport const createTile = (\n ground: Ground | EmptyGround,\n crowns: Crown = 0\n): Tile | EmptyTile => {\n if (isGround(ground)) {\n return { type: ground, crowns } as Tile;\n }\n return { type: ground, crowns: 0 } as EmptyTile;\n};\n","import {\n GRIDSIZE,\n type Domino,\n type EmptyTile,\n type Kingdom,\n type Orientation,\n type Position,\n type Rotation,\n type Tile,\n} from \"@core/domain/types/index.js\";\nimport { err, isErr, isOk, ok, type Result } from \"@utils/result.js\";\nimport { createTile } from \"./domino.js\";\n\nexport const createEmptyKingdom = (): Kingdom => {\n const emptyTile = createTile(\"empty\");\n const grid = Array.from({ length: GRIDSIZE }, () =>\n Array.from({ length: GRIDSIZE }, () => emptyTile)\n );\n\n return grid;\n};\n\nexport const placeCastle = (kingdom: Kingdom): Kingdom => {\n const castle = createTile(\"castle\");\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[4]![4] = castle;\n return newKingdom;\n};\n\nexport const placeTile = (\n kingdom: Kingdom,\n position: Position,\n tile: Tile\n): Kingdom => {\n const newKingdom = deepCopyKingdom(kingdom);\n newKingdom[position.y]![position.x] = tile;\n return newKingdom;\n};\n\nexport const getTile = (\n kingdom: Kingdom,\n position: Position\n): Result<Tile | EmptyTile> => {\n const tile = kingdom[position.y]?.[position.x];\n if (!tile) {\n return err(\"Invalid placement (not fit into the grid)\");\n }\n return ok(tile);\n};\n\nexport const calculateDominoPosition = (\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): [{ tile: Tile; position: Position }, { tile: Tile; position: Position }] => {\n let firstTile: {\n tile: Tile;\n position: Position;\n };\n let secondTile: {\n tile: Tile;\n position: Position;\n };\n\n if (orientation === \"horizontal\") {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x + 1,\n y: position.y,\n },\n };\n }\n } else {\n if (rotation === 0) {\n firstTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n } else {\n firstTile = {\n tile: domino.right,\n position: {\n x: position.x,\n y: position.y,\n },\n };\n secondTile = {\n tile: domino.left,\n position: {\n x: position.x,\n y: position.y + 1,\n },\n };\n }\n }\n\n return [firstTile, secondTile];\n};\n\nexport const placeDomino = (\n kingdom: Kingdom,\n position: Position,\n orientation: Orientation,\n rotation: Rotation,\n domino: Domino\n): Result<Kingdom> => {\n const [firstTile, secondTile] = calculateDominoPosition(\n position,\n orientation,\n rotation,\n domino\n );\n\n const isFreePlaceResult = isFreePlace(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n if (isErr(isFreePlaceResult)) {\n return isFreePlaceResult;\n }\n\n const adjacentTiles = isAdjacent(\n kingdom,\n firstTile.position,\n secondTile.position\n );\n\n if (adjacentTiles.length === 0) {\n return err(\"Invalid placement (not adjacent)\");\n }\n\n const hasValidAdjacentTiles = hasValidAdjacent(adjacentTiles, [\n firstTile.tile,\n secondTile.tile,\n ]);\n\n if (!hasValidAdjacentTiles) {\n return err(\"Invalid placement (not valid adjacent)\");\n }\n\n return ok(placeTiles(kingdom, [firstTile, secondTile]));\n};\n\nconst placeTiles = (\n kingdom: Kingdom,\n tiles: { tile: Tile; position: Position }[]\n) => {\n let newKingdom = deepCopyKingdom(kingdom);\n for (const { tile, position } of tiles) {\n newKingdom = placeTile(newKingdom, position, tile);\n }\n return newKingdom;\n};\n\nconst isFreePlace = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Result<boolean> => {\n const firstTile = getTile(kingdom, firstPosition);\n const secondTile = getTile(kingdom, secondPosition);\n\n if (isErr(firstTile)) {\n return firstTile;\n }\n\n if (isErr(secondTile)) {\n return secondTile;\n }\n\n if (firstTile.value.type !== \"empty\" || secondTile.value.type !== \"empty\") {\n return err(\"Invalid placement (not empty)\");\n }\n\n return ok(true);\n};\n\nconst isAdjacent = (\n kingdom: Kingdom,\n firstPosition: Position,\n secondPosition: Position\n): Tile[] => {\n const xFirstPosition = firstPosition.x;\n const yFirstPosition = firstPosition.y;\n const xSecondPosition = secondPosition.x;\n const ySecondPosition = secondPosition.y;\n\n const adjacentTiles: Tile[] = [];\n const adjacentTilesKeys = [\n { x: xFirstPosition - 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition - 1 },\n { x: xFirstPosition + 1, y: yFirstPosition },\n { x: xFirstPosition, y: yFirstPosition + 1 },\n { x: xSecondPosition - 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition - 1 },\n { x: xSecondPosition + 1, y: ySecondPosition },\n { x: xSecondPosition, y: ySecondPosition + 1 },\n ];\n\n // Remove firstPosition and secondPosition from adjacentTilesKeys\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xFirstPosition && pos.y === yFirstPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.splice(\n adjacentTilesKeys.findIndex((pos) => {\n return pos.x === xSecondPosition && pos.y === ySecondPosition;\n }),\n 1\n );\n\n adjacentTilesKeys.forEach((key) => {\n const tile = getTile(kingdom, key);\n if (isOk(tile)) {\n if (tile.value.type !== \"empty\") {\n adjacentTiles.push(tile.value);\n }\n }\n });\n\n return adjacentTiles;\n};\n\nconst hasValidAdjacent = (\n adjacentTiles: (Tile | EmptyTile)[],\n tiles: Tile[]\n): boolean => {\n return adjacentTiles.some((adjacentTile) => {\n return tiles.some((tile) => {\n return tile.type === adjacentTile.type || adjacentTile.type === \"castle\";\n });\n });\n};\n\nexport const checkCastleIsInMiddle = (kingdom: Kingdom): boolean => {\n // Find index of castle\n const castlePosition = kingdom\n .map((row) => row.findIndex((tile) => tile.type === \"castle\"))\n .find((index) => index !== -1);\n\n // Count how many tiles not empty are on the left of the castle\n const leftTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const leftTilesCount = leftTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the right of the castle\n const rightTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const rightTilesCount = rightTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n // Count how many tiles not empty are on the top of the castle\n const topTiles =\n castlePosition !== undefined\n ? kingdom[castlePosition]!.slice(0, castlePosition)\n : [];\n const topTilesCount = topTiles.filter((tile) => tile.type !== \"empty\").length;\n\n // Count how many tiles not empty are on the bottom of the castle\n const bottomTiles =\n castlePosition != undefined\n ? kingdom[castlePosition]!.slice(castlePosition + 1)\n : [];\n const bottomTilesCount = bottomTiles.filter(\n (tile) => tile.type !== \"empty\"\n ).length;\n\n return (\n leftTilesCount === rightTilesCount &&\n topTilesCount === bottomTilesCount &&\n leftTilesCount === topTilesCount\n );\n};\n\nexport const countDominoes = (kingdom: Kingdom): number => {\n const notEmpties = kingdom.flat().filter((tile) => tile.type !== \"empty\");\n const totalDominoes = (notEmpties.length - 1) / 2; // -1 because the castle is not a domino\n return totalDominoes;\n};\n\nconst deepCopyKingdom = (kingdom: Kingdom): Kingdom => {\n return kingdom.map((line) => line.map((tile) => ({ ...tile })));\n};\n","import { type Result, err, ok, isErr } from \"@utils/result.js\";\nimport type { Player } from \"@core/domain/types/player.js\";\nimport type { Kingdom } from \"@core/domain/types/kingdom.js\";\n\nconst MINPLAYERSNAMELENGTH = 3;\n\nexport const validatePlayer = (name: string): Result<string> => {\n if (!name || name.trim().length < MINPLAYERSNAMELENGTH) {\n return err(`Invalid player name: ${name}`);\n }\n\n return ok(name);\n};\n\nexport const createPlayer = (\n playerName: string,\n id: string,\n kingdom: Kingdom\n): Result<Player> => {\n const name = validatePlayer(playerName);\n\n if (isErr(name)) {\n return name;\n }\n\n return ok({\n name: name.value,\n id,\n kingdom,\n });\n};\n","import {\n createEmptyKingdom,\n placeCastle,\n} from \"@core/domain/entities/kingdom.js\";\nimport { createPlayer } from \"@core/domain/entities/player.js\";\nimport type {\n GameWithNextStep,\n NextStep,\n Players,\n} from \"@core/domain/types/index.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type AddPlayersUseCase = (\n game: GameWithNextStep,\n players: string[]\n) => Result<GameWithNextStep>;\n\nexport const addPlayersUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n ruleRepository: RuleRepository;\n }): AddPlayersUseCase =>\n (game, players) => {\n const { uuidMethod, shuffleMethod, ruleRepository } = deps;\n\n if (!players || players.length < 2 || players.length > 4) {\n return err(\"Invalid number of players\");\n }\n\n const newPlayers: Players = [];\n\n for (const player of players) {\n let kingdom = createEmptyKingdom();\n kingdom = placeCastle(kingdom);\n let id = uuidMethod();\n const newPlayer = createPlayer(player, id, kingdom);\n\n if (isErr(newPlayer)) {\n return newPlayer;\n }\n\n newPlayers.push(newPlayer.value);\n }\n\n // set rules\n const rules = ruleRepository.getAll();\n const basicRules = rules.basic[newPlayers.length];\n\n if (!basicRules) {\n return err(\"No base rules found\");\n }\n\n // updateDominoes\n const dominoes = game.dominoes;\n const { maxDominoes } = basicRules;\n const shuffledDominoes = shuffleMethod(dominoes);\n const splicedDominoes = shuffledDominoes.slice(0, maxDominoes);\n const next: NextStep = {\n type: \"step\",\n step: \"options\",\n };\n\n const updatedGame: GameWithNextStep = {\n ...game,\n players: newPlayers,\n dominoes: splicedDominoes,\n rules: {\n ...game.rules,\n basic: basicRules,\n },\n nextAction: next,\n };\n\n return ok(updatedGame);\n };\n","import type { NextAction } from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\n\nexport const createLord = (id: string, playerId: string): Lord => {\n return {\n id,\n playerId,\n turnEnded: false,\n hasPick: false,\n hasPlace: true,\n };\n};\n\nconst hasPick = (lord: Lord): boolean => lord.hasPick;\nconst hasPlace = (lord: Lord): boolean => lord.hasPlace;\nconst hasTurnEnded = (lord: Lord): boolean => lord.turnEnded;\n\nexport const canPass = (lord: Lord): boolean => {\n return !hasPick(lord) && !hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPick = (lord: Lord): boolean => {\n return !hasPick(lord) && hasPlace(lord) && !hasTurnEnded(lord);\n};\n\nexport const canPlaceAndDominoPickedIsDefined = (\n lord: Lord\n): lord is Required<Lord & Pick<Lord, \"dominoPicked\">> => {\n return (\n !hasPick(lord) &&\n !hasPlace(lord) &&\n !hasTurnEnded(lord) &&\n lord.dominoPicked !== undefined\n );\n};\n\nexport const updateLordOrder = (lords: Lord[]): Lord[] => {\n return lords.sort((a, b) => {\n return a.dominoPicked!.number - b.dominoPicked!.number;\n });\n};\n\nexport const resetLordsActions = (lord: Lord[]): Lord[] => {\n const lordsCopy = [...lord];\n for (const lord of lordsCopy) {\n lord.turnEnded = false;\n lord.hasPick = false;\n lord.hasPlace = false;\n }\n\n return lordsCopy;\n};\n\nexport const nextLordWithAction = (lords: Lord[]): NextAction => {\n const nextLord = findNextLord(lords);\n\n return {\n type: \"action\",\n nextLord: nextLord.id,\n nextAction: hasPlace(nextLord)\n ? playerActions.pickDomino\n : playerActions.placeDomino,\n };\n};\n\nconst findNextLord = (lords: Lord[]): Lord => {\n const lord = lords.find((lord) => !hasTurnEnded(lord));\n if (!lord) {\n return lords[0]!;\n }\n return lord;\n};\n\nexport const allLordsHavePlayed = (lords: Lord[]) => {\n return lords.every((lord) => lord.turnEnded);\n};\n","import {\n allLordsHavePlayed,\n canPick,\n nextLordWithAction,\n resetLordsActions,\n updateLordOrder,\n} from \"@core/domain/entities/lord.js\";\nimport type { GameWithNextAction } from \"@core/domain/types/game.js\";\nimport { err, ok, type Result } from \"@utils/result.js\";\n\nexport type ChooseDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n dominoPick: number\n) => Result<GameWithNextAction>;\n\nexport const chooseDominoUseCase: ChooseDominoUseCase = (\n game,\n lordId,\n dominoPick\n) => {\n const currentLord = game.lords.find(\n (lord) => lord.id === game.nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPick(currentLord)) {\n return err(\"Lord can't pick\");\n }\n\n // Check if dominoPick is valid choice\n const selectedDomino = game.currentDominoes.find(\n (domino) => domino.domino.number === dominoPick\n );\n\n if (!selectedDomino) {\n return err(\"Domino not found\");\n }\n\n if (selectedDomino.picked) {\n return err(\"Domino already picked\");\n }\n\n // update currentDominoes\n const updatedCurrentDominoes = game.currentDominoes.map((domino) => {\n if (domino.domino.number === dominoPick) {\n domino.picked = true;\n domino.lordId = currentLord.id;\n }\n return domino;\n });\n\n // update lords\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n lord.hasPick = true;\n lord.turnEnded = true;\n lord.dominoPicked = selectedDomino.domino;\n }\n return lord;\n });\n\n const turnEnded = allLordsHavePlayed(updatedLords);\n\n if (turnEnded) {\n const lords = resetLordsActions(updateLordOrder(updatedLords));\n const updatedTurn = game.turn + 1;\n const next = nextLordWithAction(lords);\n const dominoesCopy = [...game.dominoes];\n const dominoesDrawn = dominoesCopy.splice(\n 0,\n game.rules.basic.dominoesPerTurn\n );\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const updatedCurrentDominoes = dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n });\n\n return ok({\n ...game,\n currentDominoes: updatedCurrentDominoes,\n dominoes: dominoesCopy,\n lords,\n turn: updatedTurn,\n nextAction: next,\n });\n }\n\n const next = nextLordWithAction(updatedLords);\n\n // update state\n const updatedState = {\n ...game,\n currentDominoes: updatedCurrentDominoes,\n lords: updatedLords,\n nextAction: next,\n };\n\n return ok(updatedState);\n};\n","import {\n gameSteps,\n type Domino,\n type GameMode,\n type GameWithNextStep,\n} from \"@core/domain/types/index.js\";\n\nexport const create = (payload: {\n id: string;\n mode: GameMode;\n dominoes: Domino[];\n}): GameWithNextStep => {\n const { id, mode, dominoes } = payload;\n return {\n id,\n dominoes,\n currentDominoes: [],\n players: [],\n lords: [],\n turn: 0,\n nextAction: {\n type: \"step\",\n step: gameSteps.addPlayers,\n },\n rules: {\n basic: {\n lords: 0,\n maxDominoes: 0,\n dominoesPerTurn: 0,\n maxTurns: 0,\n },\n extra: [],\n },\n mode,\n };\n};\n","import { err, ok, type Result } from \"@utils/result.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\n\nconst findMode = (\n mode: string,\n availableMode: GameMode[]\n): GameMode | undefined => {\n return availableMode.find((m) => m.name === mode);\n};\n\nexport const createMode = (\n mode: string,\n availableMode: GameMode[]\n): Result<GameMode> => {\n const foundMode = findMode(mode, availableMode);\n if (foundMode) {\n return ok(foundMode);\n }\n\n return err(`Invalid mode: ${mode}`);\n};\n","import { create } from \"@core/domain/entities/game.js\";\nimport { createMode } from \"@core/domain/entities/mode.js\";\nimport type { GameWithNextStep } from \"@core/domain/types/game.js\";\nimport type { DominoesRepository } from \"@core/portServerside/dominoesRepository.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { err, isErr, ok, type Result } from \"@utils/result.js\";\n\nexport type CreateGameUseCase = (mode: string) => Result<GameWithNextStep>;\n\nexport const createGameUseCase =\n (deps: {\n modeRepository: ModeRepository;\n dominoesRepository: DominoesRepository;\n uuidMethod: UuidMethod;\n }): CreateGameUseCase =>\n (mode) => {\n const { modeRepository, dominoesRepository, uuidMethod } = deps;\n const id = uuidMethod();\n const availableMode = modeRepository.getAvailables();\n const newMode = createMode(mode, availableMode);\n\n if (isErr(newMode)) {\n return newMode;\n }\n\n const dominoes = dominoesRepository.getForMode(newMode.value);\n\n if (!dominoes || dominoes.length === 0) {\n return err(`No dominoes found for mode ${newMode.value.name}`);\n }\n\n const payload = {\n id,\n mode: newMode.value,\n dominoes,\n };\n\n const newGame = create(payload);\n\n return ok(newGame);\n };\n","import {\n allLordsHavePlayed,\n canPass,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport { err, ok } from \"@utils/result.js\";\n\nexport type DiscardDominoUseCase = (\n game: GameWithNextAction,\n lordId: string\n) => GameStateResult;\n\nexport const discardDominoUseCase: DiscardDominoUseCase = (game, lordId) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPass(currentLord)) {\n return err(\"Lord can't pass\");\n }\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLord = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLord)) {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: resultStep,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLord,\n nextAction: <NextAction>nextLordWithAction(updatedLord),\n };\n }\n\n return ok(updatedGame);\n};\n","import { getAvailablesExtraRules } from \"@core/domain/entities/rule.js\";\nimport type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ExtraRule } from \"@core/domain/types/rule.js\";\nimport type { RuleRepository } from \"@core/portServerside/ruleRepository.js\";\nimport { err, type Result } from \"@utils/result.js\";\n\nexport type GetExtraRulesUseCase = (\n mode: GameMode[\"name\"],\n players: number\n) => Result<ExtraRule[]>;\n\nexport const getExtraRulesUseCase =\n (deps: { ruleRepository: RuleRepository }): GetExtraRulesUseCase =>\n (mode: GameMode[\"name\"], players: number): Result<ExtraRule[]> => {\n const { ruleRepository } = deps;\n\n const allExtraRules = ruleRepository.getAllExtra();\n\n if (!allExtraRules) {\n return err(\"No rules found\");\n }\n\n return getAvailablesExtraRules(allExtraRules, mode, players);\n };\n","import type { GameMode } from \"@core/domain/types/mode.js\";\nimport type { ModeRepository } from \"@core/portServerside/modeRepository.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetModesUseCase = () => Result<GameMode[]>;\n\nexport const getModesUseCase =\n (deps: { modeRepository: ModeRepository }): GetModesUseCase =>\n (): Result<GameMode[]> => {\n const { modeRepository } = deps;\n return ok(modeRepository.getAvailables());\n };\n","import {\n checkCastleIsInMiddle,\n countDominoes,\n} from \"@core/domain/entities/kingdom.js\";\nimport type {\n FinalResult,\n GameWithNextStep,\n GameWithResults,\n ScoreResult,\n} from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type GetResultUseCase = (\n game: GameWithNextStep,\n scoreResult: ScoreResult[]\n) => Result<GameWithResults>;\n\nexport const getResultUseCase: GetResultUseCase = (game, scoreResult) => {\n const { rules } = game;\n const { basic, extra } = rules;\n\n const finalScoreResult = scoreResult.map((score): ScoreResult => {\n let finalScore = score.details.points;\n\n const kingdom = game.players.find((player) => {\n if (player.id === score.playerId) {\n return player;\n }\n })?.kingdom!;\n\n if (extra.length > 0) {\n extra.forEach((extraRule) => {\n if (extraRule.name === \"The middle Kingdom\") {\n const castleIsInMiddle = checkCastleIsInMiddle(kingdom);\n if (castleIsInMiddle) {\n finalScore += 10;\n }\n }\n\n if (extraRule.name === \"Harmony\") {\n const totalDominoes = countDominoes(kingdom);\n const dominoLimit = basic.maxDominoes;\n const totalPlayers = game.players.length;\n const dominoesPerPlayer = dominoLimit / totalPlayers;\n if (totalDominoes === dominoesPerPlayer) {\n finalScore += 5;\n }\n }\n });\n }\n\n return {\n ...score,\n details: {\n ...score.details,\n points: finalScore,\n },\n };\n });\n\n // 1 order players by score, then by maxPropertiesSize, then by totalCrowns all descending\n finalScoreResult.sort((a, b) => {\n if (a.details.points !== b.details.points) {\n return b.details.points - a.details.points;\n }\n if (a.details.maxPropertiesSize !== b.details.maxPropertiesSize) {\n return b.details.maxPropertiesSize - a.details.maxPropertiesSize;\n }\n return b.details.totalCrowns - a.details.totalCrowns;\n });\n\n const result: FinalResult[] = [];\n\n let isTie = false;\n result.push({\n playerId: finalScoreResult[0]!.playerId,\n playerName: finalScoreResult[0]!.playerName,\n details: finalScoreResult[0]!.details,\n position: 1,\n });\n\n for (let i = 1; i < finalScoreResult.length; i++) {\n const currentScore = finalScoreResult[i];\n const previousScore = finalScoreResult[i - 1];\n if (\n previousScore &&\n currentScore &&\n currentScore.details.points === previousScore.details.points &&\n currentScore.details.maxPropertiesSize ===\n previousScore.details.maxPropertiesSize &&\n currentScore.details.totalCrowns === previousScore.details.totalCrowns\n ) {\n isTie = true;\n }\n\n if (isTie) {\n result.push({\n ...currentScore!,\n position: result[i - 1]!.position,\n });\n } else {\n result.push({\n ...currentScore!,\n position: i + 1,\n });\n }\n\n isTie = false;\n }\n\n return ok({\n ...game,\n result: result,\n });\n};\n","import { err, isErr, ok } from \"@utils/result.js\";\nimport {\n gameSteps,\n type GameState,\n type GameStateResult,\n type GameWithNextAction,\n type NextAction,\n type NextStep,\n} from \"@core/domain/types/game.js\";\nimport {\n allLordsHavePlayed,\n canPlaceAndDominoPickedIsDefined,\n nextLordWithAction,\n} from \"@core/domain/entities/lord.js\";\nimport { placeDomino } from \"@core/domain/entities/kingdom.js\";\nimport type {\n Orientation,\n Position,\n Rotation,\n} from \"@core/domain/types/kingdom.js\";\n\nexport type PlaceDominoUseCase = (\n game: GameWithNextAction,\n lordId: string,\n position: Position,\n orientation: Orientation,\n rotation: Rotation\n) => GameStateResult;\n\nexport const placeDominoUseCase: PlaceDominoUseCase = (\n game,\n lordId,\n position,\n orientation,\n rotation\n) => {\n const nextAction = game.nextAction;\n\n const currentLord = game.lords.find(\n (lord) => lord.id === nextAction.nextLord\n );\n\n if (!currentLord) {\n return err(\"Lord not found\");\n }\n\n if (currentLord.id !== lordId) {\n return err(\"Not your turn\");\n }\n\n if (!canPlaceAndDominoPickedIsDefined(currentLord)) {\n return err(\"Lord can't place\");\n }\n\n const domino = currentLord.dominoPicked;\n\n const currentPlayer = game.players.find(\n (player) => player.id === currentLord.playerId\n );\n\n if (!currentPlayer) {\n return err(\"Player not found\");\n }\n\n const updatedKingdom = placeDomino(\n currentPlayer.kingdom,\n position,\n orientation,\n rotation,\n domino\n );\n\n if (isErr(updatedKingdom)) {\n return updatedKingdom;\n }\n\n const updatedPlayers = game.players.map((player) => {\n if (player.id === currentPlayer.id) {\n player.kingdom = updatedKingdom.value;\n }\n return player;\n });\n\n const maxTurns = game.rules.basic.maxTurns;\n const currentTurn = game.turn;\n const isLastTurn = currentTurn === maxTurns;\n\n const updatedLords = game.lords.map((lord) => {\n if (lord.id === currentLord.id) {\n if (isLastTurn) {\n return {\n ...lord,\n turnEnded: true,\n hasPlace: true,\n };\n }\n return {\n ...lord,\n hasPlace: true,\n };\n }\n return lord;\n });\n\n let updatedGame: GameState;\n\n const resultStep: NextStep = {\n type: \"step\",\n step: gameSteps.result,\n };\n\n if (isLastTurn && allLordsHavePlayed(updatedLords)) {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: resultStep,\n players: updatedPlayers,\n };\n } else {\n updatedGame = {\n ...game,\n lords: updatedLords,\n nextAction: <NextAction>nextLordWithAction(updatedLords),\n players: updatedPlayers,\n };\n }\n\n return ok(updatedGame);\n};\n","import { createLord } from \"@core/domain/entities/lord\";\nimport type {\n GameWithNextAction,\n GameWithNextStep,\n NextAction,\n} from \"@core/domain/types/game.js\";\nimport type { Lord } from \"@core/domain/types/lord.js\";\nimport { playerActions } from \"@core/domain/types/player.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type StartGameUseCase = (\n game: GameWithNextStep\n) => Result<GameWithNextAction>;\n\nexport const startGameUseCase =\n (deps: {\n uuidMethod: UuidMethod;\n shuffleMethod: ShuffleMethod;\n }): StartGameUseCase =>\n (game) => {\n const { uuidMethod, shuffleMethod } = deps;\n const {\n rules: {\n basic: { lords: maxLords, dominoesPerTurn },\n },\n players,\n dominoes,\n } = game;\n\n const numberOfPlayers = players.length;\n\n const newLords: Lord[] = [];\n\n for (let i = 0; i < numberOfPlayers; i++) {\n for (let j = 0; j < maxLords; j++) {\n const lord = createLord(uuidMethod(), players[i]!.id);\n newLords.push(lord);\n }\n }\n\n const shuffledLords = shuffleMethod(newLords);\n const dominoesCopy = [...dominoes];\n const dominoesDrawn = dominoesCopy.splice(0, dominoesPerTurn);\n dominoesDrawn.sort((a, b) => a.number - b.number);\n const nextAction: NextAction = {\n type: \"action\",\n nextLord: shuffledLords[0]!.id,\n nextAction: playerActions.pickDomino,\n };\n\n const newState: GameWithNextAction = {\n ...game,\n lords: shuffledLords,\n nextAction,\n dominoes: dominoesCopy,\n currentDominoes: dominoesDrawn.map((domino, index) => {\n return {\n domino,\n picked: false,\n lordId: null,\n position: index + 1,\n };\n }),\n };\n\n return ok(newState);\n };\n","import type { Kingdom, Score } from \"@core/domain/types/index.js\";\nimport { ok, type Result } from \"@utils/result.js\";\n\nexport type CalculateScoreUseCase = (kingdom: Kingdom) => Result<Score>;\n\ntype Property = {\n type: string;\n crowns: number;\n size: number;\n tiles: number[][];\n};\n\nexport const calculateScoreUseCase: CalculateScoreUseCase = (kingdom) => {\n const visited: boolean[][] = kingdom.map((row) => row.map(() => false));\n const properties: Property[] = [];\n\n const directions = [\n [-1, 0],\n [1, 0],\n [0, -1],\n [0, 1],\n ]; // Up, Down, Left, Right\n\n const markZone = (\n x: number,\n y: number,\n type: string,\n crowns: number\n ): void => {\n if (\n x < 0 ||\n y < 0 ||\n x >= kingdom[0]!.length ||\n y >= kingdom.length ||\n visited[y]![x] ||\n kingdom[y]![x]!.type !== type ||\n kingdom[y]![x]!.type === \"empty\" ||\n kingdom[y]![x]!.type === \"castle\"\n ) {\n return;\n }\n\n visited[y]![x] = true;\n const currentZone = properties.find(\n (property) =>\n property.type === type &&\n property.tiles.some(([tx, ty]) => {\n for (let [dx, dy] of directions) {\n if (\n (tx as number) + (dx as number) === x &&\n (ty as number) + (dy as number) === y\n ) {\n return true;\n }\n }\n return false;\n })\n );\n\n if (currentZone) {\n currentZone.size += 1;\n currentZone.tiles.push([x, y]);\n currentZone.crowns += crowns;\n } else {\n properties.push({\n type,\n crowns,\n size: 1,\n tiles: [[x, y]],\n });\n }\n\n directions.forEach(([dx, dy]) => {\n const nx = x + (dx as number);\n const ny = y + (dy as number);\n if (\n nx >= 0 &&\n ny >= 0 &&\n nx < kingdom[0]!.length &&\n ny < kingdom.length &&\n kingdom[ny]![nx]!.type === type\n ) {\n markZone(nx, ny, kingdom[ny]![nx]!.type, kingdom[ny]![nx]!.crowns);\n }\n });\n };\n\n kingdom.forEach((row, y) => {\n row.forEach((tile, x) => {\n if (!visited[y]![x]) {\n markZone(x, y, tile.type, tile.crowns);\n }\n });\n });\n\n if (properties.length === 0) {\n return ok({\n points: 0,\n maxPropertiesSize: 0,\n totalCrowns: 0,\n });\n }\n\n let points = properties.reduce((acc, property) => {\n return acc + property.size * property.crowns;\n }, 0);\n\n const maxPropertiesSize = Math.max(\n ...properties.map((property) => property.size)\n );\n const totalCrowns = properties.reduce(\n (acc, property) => acc + property.crowns,\n 0\n );\n\n return ok({\n points,\n maxPropertiesSize,\n totalCrowns,\n });\n};\n","import jsonDominoes from \"@adapter/jsonDominoes.js\";\nimport jsonModes from \"@adapter/jsonModes.js\";\nimport jsonRules from \"@adapter/jsonRules.js\";\nimport { shuffleMethod } from \"@adapter/shuffle.js\";\nimport { uuidMethod } from \"@adapter/uuid.js\";\nimport { winstonLogger } from \"@adapter/winstonLogger.js\";\nimport { addExtraRulesHandler } from \"@application/handlers/addExtraRulesHandler.js\";\nimport { addPlayersHandler } from \"@application/handlers/addPlayersHandler.js\";\nimport { chooseDominoHandler } from \"@application/handlers/chooseDominoHandler.js\";\nimport { createGameHandler } from \"@application/handlers/createGameHandler.js\";\nimport { discardDominoHandler } from \"@application/handlers/discardDominoHandler.js\";\nimport { getExtraRulesHandler } from \"@application/handlers/getExtraRulesHandler.js\";\nimport { getModesHandler } from \"@application/handlers/getModesHandler.js\";\nimport { getResultHandler } from \"@application/handlers/getResultHandler.js\";\nimport { placeDominoHandler } from \"@application/handlers/placeDominoHandler.js\";\nimport { startGameHandler } from \"@application/handlers/startGameHandler.js\";\nimport { calculateScoreHandler } from \"@application/handlers/calculateScoreHandler.js\";\nimport type { ShuffleMethod } from \"@core/portServerside/shuffleMethod.js\";\nimport type { UuidMethod } from \"@core/portServerside/uuidMethod.js\";\nimport { addExtraRulesUseCase } from \"@core/useCases/addExtraRules.js\";\nimport { addPlayersUseCase } from \"@core/useCases/addPlayers.js\";\nimport { chooseDominoUseCase } from \"@core/useCases/chooseDomino.js\";\nimport { createGameUseCase } from \"@core/useCases/createGame.js\";\nimport { discardDominoUseCase } from \"@core/useCases/discardDomino.js\";\nimport { getExtraRulesUseCase } from \"@core/useCases/getExtraRules.js\";\nimport { getModesUseCase } from \"@core/useCases/getModes.js\";\nimport { getResultUseCase } from \"@core/useCases/getResult.js\";\nimport { placeDominoUseCase } from \"@core/useCases/placeDomino.js\";\nimport { startGameUseCase } from \"@core/useCases/startGame.js\";\nimport { calculateScoreUseCase } from \"@core/useCases/calculateScore.js\";\n\nexport type EngineConfig = {\n uuidMethod?: UuidMethod;\n shuffleMethod?: ShuffleMethod;\n logging?: boolean;\n};\n\nexport const configureEngine = (config: Partial<EngineConfig>) => {\n const modeRepository = jsonModes();\n const dominoesRepository = jsonDominoes();\n const ruleRepository = jsonRules();\n const uuid = config.uuidMethod || uuidMethod;\n const shuffle = config.shuffleMethod || shuffleMethod;\n const logger = config.logging ? winstonLogger(true) : winstonLogger(false);\n\n return {\n createGameHandler: createGameHandler(\n logger,\n createGameUseCase({\n modeRepository,\n dominoesRepository,\n uuidMethod: uuid,\n })\n ),\n getModesHandler: getModesHandler(\n logger,\n getModesUseCase({ modeRepository })\n ),\n getExtraRulesHandler: getExtraRulesHandler(\n logger,\n getExtraRulesUseCase({ ruleRepository })\n ),\n addPlayersHandler: addPlayersHandler(\n logger,\n addPlayersUseCase({\n uuidMethod: uuid,\n shuffleMethod: shuffle,\n ruleRepository,\n })\n ),\n addExtraRulesHandler: addExtraRulesHandler(\n logger,\n addExtraRulesUseCase({ ruleRepository })\n ),\n startGameHandler: startGameHandler(\n logger,\n startGameUseCase({ uuidMethod: uuid, shuffleMethod: shuffle })\n ),\n chooseDominoHandler: chooseDominoHandler(logger, chooseDominoUseCase),\n placeDominoHandler: placeDominoHandler(logger, placeDominoUseCase),\n discardDominoHandler: discardDominoHandler(logger, discardDominoUseCase),\n getResultHandler: getResultHandler(logger, {\n getResultUseCase,\n calculateScoreUseCase,\n }),\n calculateScoreHandler: calculateScoreHandler(logger, calculateScoreUseCase),\n };\n};\n","import type { GameEngine } from \"./core/portUserside/engine.js\";\nimport { configureEngine, type EngineConfig } from \"./config.js\";\n\nexport const createGameEngine = (config: Partial<EngineConfig>): GameEngine => {\n const {\n createGameHandler,\n getModesHandler,\n getExtraRulesHandler,\n addPlayersHandler,\n addExtraRulesHandler,\n startGameHandler,\n chooseDominoHandler,\n placeDominoHandler,\n discardDominoHandler,\n getResultHandler,\n calculateScoreHandler,\n } = configureEngine(config);\n\n return {\n getModes: (command) => getModesHandler(command),\n getExtraRules: (command) => getExtraRulesHandler(command),\n createGame: (command) => createGameHandler(command),\n addPlayers: (command) => addPlayersHandler(command),\n addExtraRules: (command) => addExtraRulesHandler(command),\n startGame: (command) => startGameHandler(command),\n chooseDomino: (command) => chooseDominoHandler(command),\n placeDomino: (command) => placeDominoHandler(command),\n discardDomino: (command) => discardDominoHandler(command),\n getResults: (command) => getResultHandler(command),\n calculateScore: (command) => calculateScoreHandler(command),\n };\n};\n"],"mappings":"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","names":["getResultUseCase","calculateScoreUseCase","result","uuidMethod","shuffleMethod","lord","next","updatedCurrentDominoes","uuidMethod","uuidMethod","shuffleMethod","createGameHandler","getModesHandler","getExtraRulesHandler","addPlayersHandler","addExtraRulesHandler","startGameHandler","chooseDominoHandler","placeDominoHandler","discardDominoHandler","getResultHandler","calculateScoreHandler"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pompidup/kingdomino-engine",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "A simple engine for the game Kingdomino",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -12,16 +12,6 @@
|
|
|
12
12
|
"type": "git",
|
|
13
13
|
"url": "git+https://github.com/Pompidup/KDomino.git"
|
|
14
14
|
},
|
|
15
|
-
"scripts": {
|
|
16
|
-
"lint": "tsc",
|
|
17
|
-
"test": "vitest",
|
|
18
|
-
"coverage": "vitest --coverage --config ./vitest.config.ts",
|
|
19
|
-
"build": "tsup",
|
|
20
|
-
"bump:major": "npm version major",
|
|
21
|
-
"bump:minor": "npm version minor",
|
|
22
|
-
"bump:patch": "npm version patch",
|
|
23
|
-
"pub": "pnpm build && npm login && npm publish --access public"
|
|
24
|
-
},
|
|
25
15
|
"keywords": [
|
|
26
16
|
"kingdomino",
|
|
27
17
|
"boardgame",
|
|
@@ -45,5 +35,15 @@
|
|
|
45
35
|
},
|
|
46
36
|
"dependencies": {
|
|
47
37
|
"winston": "^3.14.2"
|
|
38
|
+
},
|
|
39
|
+
"scripts": {
|
|
40
|
+
"lint": "tsc",
|
|
41
|
+
"test": "vitest",
|
|
42
|
+
"coverage": "vitest --coverage --config ./vitest.config.ts",
|
|
43
|
+
"build": "tsup",
|
|
44
|
+
"bump:major": "npm version major",
|
|
45
|
+
"bump:minor": "npm version minor",
|
|
46
|
+
"bump:patch": "npm version patch",
|
|
47
|
+
"pub": "pnpm build && npm login && npm publish --access public"
|
|
48
48
|
}
|
|
49
|
-
}
|
|
49
|
+
}
|