@gamepark/its-a-wonderful-world 2.4.2 → 2.6.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.
@@ -1,4 +1,4 @@
1
- import { Action, Competitive, Eliminations, SecretInformation, SimultaneousGame, TimeLimit, Undo } from '@gamepark/rules-api';
1
+ import { Action, Competitive, Eliminations, Rules, SecretInformation, TimeLimit, Undo } from '@gamepark/rules-api';
2
2
  import GameState from './GameState';
3
3
  import GameView from './GameView';
4
4
  import Character from './material/Character';
@@ -15,12 +15,13 @@ import Player from './Player';
15
15
  import PlayerView from './PlayerView';
16
16
  export declare const numberOfCardsToDraft = 7;
17
17
  export declare const numberOfRounds = 4;
18
- export default class ItsAWonderfulWorld extends SimultaneousGame<GameState, Move, EmpireName> implements SecretInformation<GameState, GameView, Move, MoveView, EmpireName>, Undo<GameState, Move, EmpireName>, Competitive<GameState, Move, EmpireName>, Eliminations<GameState, Move, EmpireName>, TimeLimit<GameState, Move, EmpireName> {
18
+ export default class ItsAWonderfulWorld extends Rules<GameState, Move, EmpireName> implements SecretInformation<GameView, Move, MoveView, EmpireName>, Undo<GameState, Move, EmpireName>, Competitive<GameState, Move, EmpireName>, Eliminations<Move, EmpireName>, TimeLimit<GameState, Move, EmpireName> {
19
19
  constructor(state: GameState);
20
20
  constructor(options: ItsAWonderfulWorldOptions);
21
21
  isTurnToPlay(playerId: EmpireName): boolean;
22
22
  isOver(): boolean;
23
- getAutomaticMove(): Move | void;
23
+ getAutomaticMoves(): Move[];
24
+ getAutomaticMove(): Move | undefined;
24
25
  getLegalMoves(empire: EmpireName): Move[];
25
26
  play(move: Move): void;
26
27
  getScore(empire: EmpireName): number;
@@ -36,7 +37,7 @@ export default class ItsAWonderfulWorld extends SimultaneousGame<GameState, Move
36
37
  giveTime(playerId: EmpireName): number;
37
38
  }
38
39
  export declare function setupPlayers(options: ItsAWonderfulWorldOptions): Player[];
39
- export declare function getPredictableAutomaticMoves(state: GameState | GameView): Move & MoveView | void;
40
+ export declare function getPredictableAutomaticMoves(state: GameState | GameView): Move & MoveView | undefined;
40
41
  export declare function getLegalMoves(player: Player, phase: Phase): Move[];
41
42
  export declare function getCost(card: number): (Resource | Character)[];
42
43
  export declare function getRemainingCost(construction: Construction): {
@@ -55,3 +56,4 @@ export declare function countCharacters(player: Player | PlayerView): number;
55
56
  export declare function isOver(game: GameState | GameView): boolean;
56
57
  export declare function constructionsThatMayReceiveCubes(player: Player | PlayerView): Construction[];
57
58
  export declare function placeAvailableCubesMoves(player: Player | PlayerView, construction: Construction): PlaceResource[];
59
+ export declare function isTurnToPlay(state: GameState | GameView, playerId: EmpireName): boolean;
@@ -95,7 +95,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
95
95
  return (mod && mod.__esModule) ? mod : { "default": mod };
96
96
  };
97
97
  Object.defineProperty(exports, "__esModule", { value: true });
98
- exports.placeAvailableCubesMoves = exports.constructionsThatMayReceiveCubes = exports.isOver = exports.countCharacters = exports.isActive = exports.isPlaceItemOnCard = exports.getMovesToBuild = exports.canPay = exports.canBuild = exports.getNextProductionStep = exports.couldPlaceResource = exports.getSpacesMissingItem = exports.getRemainingCost = exports.getCost = exports.getLegalMoves = exports.getPredictableAutomaticMoves = exports.setupPlayers = exports.numberOfRounds = exports.numberOfCardsToDraft = void 0;
98
+ exports.isTurnToPlay = exports.placeAvailableCubesMoves = exports.constructionsThatMayReceiveCubes = exports.isOver = exports.countCharacters = exports.isActive = exports.isPlaceItemOnCard = exports.getMovesToBuild = exports.canPay = exports.canBuild = exports.getNextProductionStep = exports.couldPlaceResource = exports.getSpacesMissingItem = exports.getRemainingCost = exports.getCost = exports.getLegalMoves = exports.getPredictableAutomaticMoves = exports.setupPlayers = exports.numberOfRounds = exports.numberOfCardsToDraft = void 0;
99
99
  var rules_api_1 = require("@gamepark/rules-api");
100
100
  var lodash_shuffle_1 = __importDefault(require("lodash.shuffle"));
101
101
  var canUndo_1 = __importDefault(require("./canUndo"));
@@ -153,20 +153,15 @@ var ItsAWonderfulWorld = (function (_super) {
153
153
  return _this;
154
154
  }
155
155
  ItsAWonderfulWorld.prototype.isTurnToPlay = function (playerId) {
156
- var player = this.state.players.find(function (player) { return player.empire === playerId; });
157
- if (!player)
158
- return false;
159
- switch (this.state.phase) {
160
- case Phase_1.default.Draft:
161
- return player.chosenCard === undefined && player.hand.length > 0;
162
- case Phase_1.default.Planning:
163
- case Phase_1.default.Production:
164
- return !player.ready;
165
- }
156
+ return isTurnToPlay(this.state, playerId);
166
157
  };
167
158
  ItsAWonderfulWorld.prototype.isOver = function () {
168
159
  return isOver(this.state);
169
160
  };
161
+ ItsAWonderfulWorld.prototype.getAutomaticMoves = function () {
162
+ var move = this.getAutomaticMove();
163
+ return move ? [move] : [];
164
+ };
170
165
  ItsAWonderfulWorld.prototype.getAutomaticMove = function () {
171
166
  var e_1, _a;
172
167
  switch (this.state.phase) {
@@ -357,7 +352,7 @@ var ItsAWonderfulWorld = (function (_super) {
357
352
  }
358
353
  };
359
354
  return ItsAWonderfulWorld;
360
- }(rules_api_1.SimultaneousGame));
355
+ }(rules_api_1.Rules));
361
356
  exports.default = ItsAWonderfulWorld;
362
357
  function setupPlayers(options) {
363
358
  var players = options.players;
@@ -438,6 +433,7 @@ function getPredictableAutomaticMoves(state) {
438
433
  }
439
434
  finally { if (e_2) throw e_2.error; }
440
435
  }
436
+ return;
441
437
  }
442
438
  exports.getPredictableAutomaticMoves = getPredictableAutomaticMoves;
443
439
  function getLegalMoves(player, phase) {
@@ -694,3 +690,21 @@ function placeAvailableCubesMoves(player, construction) {
694
690
  return moves;
695
691
  }
696
692
  exports.placeAvailableCubesMoves = placeAvailableCubesMoves;
693
+ function isTurnToPlay(state, playerId) {
694
+ var player = state.players.find(function (player) { return player.empire === playerId; });
695
+ if (!player)
696
+ return false;
697
+ switch (state.phase) {
698
+ case Phase_1.default.Draft:
699
+ if ((0, typeguards_1.isPlayerView)(player)) {
700
+ return !player.ready;
701
+ }
702
+ else {
703
+ return player.chosenCard === undefined && player.hand.length > 0;
704
+ }
705
+ case Phase_1.default.Planning:
706
+ case Phase_1.default.Production:
707
+ return !player.ready;
708
+ }
709
+ }
710
+ exports.isTurnToPlay = isTurnToPlay;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gamepark/its-a-wonderful-world",
3
- "version": "2.4.2",
3
+ "version": "2.6.0",
4
4
  "description": "It's a Wonderful World rules for Game Park",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -12,13 +12,19 @@
12
12
  "publishConfig": {
13
13
  "access": "public"
14
14
  },
15
- "peerDependencies": {
16
- "@gamepark/rules-api": "~5.11.2",
17
- "lodash.shuffle": "^4.2.0"
18
- },
19
15
  "scripts": {
20
16
  "build": "tsc",
21
17
  "prepublishOnly": "tsc"
22
18
  },
23
- "gitHead": "976b78c55eab1bb4917da4c725c0a01eb5a91d9a"
19
+ "peerDependencies": {
20
+ "@gamepark/rules-api": "^5.15.1",
21
+ "lodash.shuffle": "^4.2.0"
22
+ },
23
+ "devDependencies": {
24
+ "@gamepark/rules-api": "~5.20.0",
25
+ "@types/lodash.shuffle": "^4.2.7",
26
+ "i18next": "^21.3.2",
27
+ "lodash.shuffle": "^4.2.0"
28
+ },
29
+ "gitHead": "6479034138c8183014f7ae927e48319f985c363c"
24
30
  }
@@ -1,11 +0,0 @@
1
- import { Action, Game, Undo } from '@gamepark/rules-api';
2
- import GameView from './GameView';
3
- import EmpireName from './material/EmpireName';
4
- import { MoveView } from './moves/Move';
5
- export default class ItsAWonderfulWorldView implements Game<GameView, MoveView>, Undo<GameView, MoveView, EmpireName> {
6
- state: GameView;
7
- constructor(state: GameView);
8
- getAutomaticMove(): MoveView | void;
9
- play(move: MoveView): void;
10
- canUndo(action: Action<MoveView, EmpireName>, consecutiveActions: Action<MoveView, EmpireName>[]): boolean;
11
- }
@@ -1,73 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- var canUndo_1 = __importDefault(require("./canUndo"));
7
- var ChooseDevelopmentCard_1 = require("./moves/ChooseDevelopmentCard");
8
- var CompleteConstruction_1 = require("./moves/CompleteConstruction");
9
- var Concede_1 = require("./moves/Concede");
10
- var DealDevelopmentCards_1 = require("./moves/DealDevelopmentCards");
11
- var DiscardLeftoverCards_1 = require("./moves/DiscardLeftoverCards");
12
- var MoveType_1 = __importDefault(require("./moves/MoveType"));
13
- var PassCards_1 = require("./moves/PassCards");
14
- var PlaceCharacter_1 = require("./moves/PlaceCharacter");
15
- var PlaceResource_1 = require("./moves/PlaceResource");
16
- var Produce_1 = require("./moves/Produce");
17
- var ReceiveCharacter_1 = require("./moves/ReceiveCharacter");
18
- var Recycle_1 = require("./moves/Recycle");
19
- var RevealChosenCards_1 = require("./moves/RevealChosenCards");
20
- var SlateForConstruction_1 = require("./moves/SlateForConstruction");
21
- var StartPhase_1 = require("./moves/StartPhase");
22
- var TellYouAreReady_1 = require("./moves/TellYouAreReady");
23
- var TransformIntoKrystallium_1 = require("./moves/TransformIntoKrystallium");
24
- var ItsAWonderfulWorld_1 = require("./ItsAWonderfulWorld");
25
- var ItsAWonderfulWorldView = (function () {
26
- function ItsAWonderfulWorldView(state) {
27
- this.state = state;
28
- }
29
- ItsAWonderfulWorldView.prototype.getAutomaticMove = function () {
30
- return ItsAWonderfulWorld_1.getPredictableAutomaticMoves(this.state);
31
- };
32
- ItsAWonderfulWorldView.prototype.play = function (move) {
33
- switch (move.type) {
34
- case MoveType_1.default.DealDevelopmentCards:
35
- return DealDevelopmentCards_1.revealDealtDevelopmentCards(this.state, move);
36
- case MoveType_1.default.ChooseDevelopmentCard:
37
- return ChooseDevelopmentCard_1.chooseDevelopmentCardInView(this.state, move);
38
- case MoveType_1.default.RevealChosenCards:
39
- return RevealChosenCards_1.revealChosenCardsInView(this.state, move);
40
- case MoveType_1.default.PassCards:
41
- return PassCards_1.passCardsInView(this.state, move);
42
- case MoveType_1.default.DiscardLeftoverCards:
43
- return DiscardLeftoverCards_1.discardLeftOverCardsInView(this.state, move);
44
- case MoveType_1.default.StartPhase:
45
- return StartPhase_1.startPhase(this.state, move);
46
- case MoveType_1.default.SlateForConstruction:
47
- return SlateForConstruction_1.slateForConstruction(this.state, move);
48
- case MoveType_1.default.Recycle:
49
- return Recycle_1.recycle(this.state, move);
50
- case MoveType_1.default.PlaceResource:
51
- return PlaceResource_1.placeResource(this.state, move);
52
- case MoveType_1.default.CompleteConstruction:
53
- return CompleteConstruction_1.completeConstruction(this.state, move);
54
- case MoveType_1.default.TransformIntoKrystallium:
55
- return TransformIntoKrystallium_1.transformIntoKrystallium(this.state, move);
56
- case MoveType_1.default.TellYouAreReady:
57
- return TellYouAreReady_1.tellYouAreReady(this.state, move);
58
- case MoveType_1.default.Produce:
59
- return Produce_1.produce(this.state, move);
60
- case MoveType_1.default.ReceiveCharacter:
61
- return ReceiveCharacter_1.receiveCharacter(this.state, move);
62
- case MoveType_1.default.PlaceCharacter:
63
- return PlaceCharacter_1.placeCharacter(this.state, move);
64
- case MoveType_1.default.Concede:
65
- return Concede_1.concede(this.state, move);
66
- }
67
- };
68
- ItsAWonderfulWorldView.prototype.canUndo = function (action, consecutiveActions) {
69
- return canUndo_1.default(this.state, action, consecutiveActions);
70
- };
71
- return ItsAWonderfulWorldView;
72
- }());
73
- exports.default = ItsAWonderfulWorldView;
package/dist/Rules.d.ts DELETED
@@ -1,63 +0,0 @@
1
- import { Action, Competitive, Eliminations, SecretInformation, SimultaneousGame, TimeLimit, Undo } from '@gamepark/rules-api';
2
- import GameState from './GameState';
3
- import GameView from './GameView';
4
- import Character from './material/Character';
5
- import Construction from './material/Construction';
6
- import DevelopmentType from './material/DevelopmentType';
7
- import EmpireName from './material/EmpireName';
8
- import Resource from './material/Resource';
9
- import Move, { MoveView } from './moves/Move';
10
- import PlaceCharacter from './moves/PlaceCharacter';
11
- import PlaceResource, { PlaceResourceOnConstruction } from './moves/PlaceResource';
12
- import { ItsAWonderfulWorldOptions } from './Options';
13
- import Phase from './Phase';
14
- import Player from './Player';
15
- import PlayerView from './PlayerView';
16
- export declare const numberOfCardsToDraft = 7;
17
- export declare const numberOfRounds = 4;
18
- export default class ItsAWonderfulWorld extends SimultaneousGame<GameState, Move, EmpireName> implements SecretInformation<GameState, GameView, Move, MoveView, EmpireName>, Undo<GameState, Move, EmpireName>, Competitive<GameState, Move, EmpireName>, Eliminations<GameState, Move, EmpireName>, TimeLimit<GameState, Move, EmpireName> {
19
- constructor(state: GameState);
20
- constructor(options: ItsAWonderfulWorldOptions);
21
- isActive(playerId: EmpireName): boolean;
22
- isOver(): boolean;
23
- getAutomaticMove(): Move | void;
24
- getLegalMoves(empire: EmpireName): Move[];
25
- play(move: Move): void;
26
- getScore(empire: EmpireName): number;
27
- getPlayer(playerId: EmpireName): Player;
28
- rankPlayers(empireA: EmpireName, empireB: EmpireName): number;
29
- canUndo(action: Action<Move, EmpireName>, consecutiveActions: Action<Move, EmpireName>[]): boolean;
30
- getView(playerId?: EmpireName | undefined): GameView;
31
- getPlayerView(playerId: EmpireName): GameView;
32
- getMoveView(move: Move, playerId?: EmpireName): MoveView;
33
- getPlayerMoveView(move: Move, playerId: EmpireName): MoveView;
34
- isEliminated(playerId: EmpireName): boolean;
35
- getConcedeMove(playerId: EmpireName): Move;
36
- giveTime(playerId: EmpireName): number;
37
- }
38
- export declare function setupPlayers(options: ItsAWonderfulWorldOptions): Player[];
39
- export declare function getPredictableAutomaticMoves(state: GameState | GameView): Move & MoveView | void;
40
- export declare function getLegalMoves(player: Player, phase: Phase): Move[];
41
- export declare function getCost(card: number): (Resource | Character)[];
42
- export declare function getRemainingCost(construction: Construction): {
43
- item: Resource | Character;
44
- space: number;
45
- }[];
46
- export declare function getSpacesMissingItem(construction: Construction, predicate: (item: Resource | Character) => boolean): number[];
47
- export declare function getNextProductionStep(game: GameState | GameView): Resource.Energy | Resource.Science | Resource.Gold | Resource.Exploration | undefined;
48
- export declare function getProduction(player: Player | PlayerView, resource: Resource): number;
49
- export declare function getVictoryPointsBonusMultiplier(player: Player | PlayerView, item: DevelopmentType | Character): number;
50
- export declare function getVictoryPointsMultiplier(player: Player | PlayerView, item: DevelopmentType | Character): number;
51
- export declare function getScore(player: Player | PlayerView): number;
52
- export declare function getFlatVictoryPoints(player: Player | PlayerView): number;
53
- export declare function getComboVictoryPoints(player: Player | PlayerView, item: DevelopmentType | Character): number;
54
- export declare function getItemQuantity(player: Player | PlayerView, item: DevelopmentType | Character): number;
55
- export declare function canBuild(player: Player, card: number): boolean;
56
- export declare function canPay(player: Player, cost: (Resource | Character)[]): boolean;
57
- export declare function getMovesToBuild(player: Player, card: number): (PlaceResourceOnConstruction | PlaceCharacter)[];
58
- export declare function isPlaceItemOnCard(move: Move | MoveView, card?: number): move is (PlaceResourceOnConstruction | PlaceCharacter);
59
- export declare function isActive(game: GameView, playerId: EmpireName): boolean;
60
- export declare function countCharacters(player: Player | PlayerView): number;
61
- export declare function isOver(game: GameState | GameView): boolean;
62
- export declare function constructionsThatMayReceiveCubes(player: Player | PlayerView): Construction[];
63
- export declare function placeAvailableCubesMoves(player: Player | PlayerView, construction: Construction): PlaceResource[];
package/dist/Rules.js DELETED
@@ -1,744 +0,0 @@
1
- "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __assign = (this && this.__assign) || function () {
18
- __assign = Object.assign || function(t) {
19
- for (var s, i = 1, n = arguments.length; i < n; i++) {
20
- s = arguments[i];
21
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
- t[p] = s[p];
23
- }
24
- return t;
25
- };
26
- return __assign.apply(this, arguments);
27
- };
28
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
29
- if (k2 === undefined) k2 = k;
30
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
31
- }) : (function(o, m, k, k2) {
32
- if (k2 === undefined) k2 = k;
33
- o[k2] = m[k];
34
- }));
35
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
36
- Object.defineProperty(o, "default", { enumerable: true, value: v });
37
- }) : function(o, v) {
38
- o["default"] = v;
39
- });
40
- var __importStar = (this && this.__importStar) || function (mod) {
41
- if (mod && mod.__esModule) return mod;
42
- var result = {};
43
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
44
- __setModuleDefault(result, mod);
45
- return result;
46
- };
47
- var __rest = (this && this.__rest) || function (s, e) {
48
- var t = {};
49
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
50
- t[p] = s[p];
51
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
52
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
53
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
54
- t[p[i]] = s[p[i]];
55
- }
56
- return t;
57
- };
58
- var __values = (this && this.__values) || function(o) {
59
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
60
- if (m) return m.call(o);
61
- if (o && typeof o.length === "number") return {
62
- next: function () {
63
- if (o && i >= o.length) o = void 0;
64
- return { value: o && o[i++], done: !o };
65
- }
66
- };
67
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
68
- };
69
- var __read = (this && this.__read) || function (o, n) {
70
- var m = typeof Symbol === "function" && o[Symbol.iterator];
71
- if (!m) return o;
72
- var i = m.call(o), r, ar = [], e;
73
- try {
74
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
75
- }
76
- catch (error) { e = { error: error }; }
77
- finally {
78
- try {
79
- if (r && !r.done && (m = i["return"])) m.call(i);
80
- }
81
- finally { if (e) throw e.error; }
82
- }
83
- return ar;
84
- };
85
- var __spreadArray = (this && this.__spreadArray) || function (to, from) {
86
- for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
87
- to[j] = from[i];
88
- return to;
89
- };
90
- var __importDefault = (this && this.__importDefault) || function (mod) {
91
- return (mod && mod.__esModule) ? mod : { "default": mod };
92
- };
93
- Object.defineProperty(exports, "__esModule", { value: true });
94
- exports.placeAvailableCubesMoves = exports.constructionsThatMayReceiveCubes = exports.isOver = exports.countCharacters = exports.isActive = exports.isPlaceItemOnCard = exports.getMovesToBuild = exports.canPay = exports.canBuild = exports.getItemQuantity = exports.getComboVictoryPoints = exports.getFlatVictoryPoints = exports.getScore = exports.getVictoryPointsMultiplier = exports.getVictoryPointsBonusMultiplier = exports.getProduction = exports.getNextProductionStep = exports.getSpacesMissingItem = exports.getRemainingCost = exports.getCost = exports.getLegalMoves = exports.getPredictableAutomaticMoves = exports.setupPlayers = exports.numberOfRounds = exports.numberOfCardsToDraft = void 0;
95
- var rules_api_1 = require("@gamepark/rules-api");
96
- var lodash_shuffle_1 = __importDefault(require("lodash.shuffle"));
97
- var canUndo_1 = __importDefault(require("./canUndo"));
98
- var Character_1 = __importStar(require("./material/Character"));
99
- var Development_1 = require("./material/Development");
100
- var Developments_1 = require("./material/Developments");
101
- var DevelopmentType_1 = require("./material/DevelopmentType");
102
- var EmpireName_1 = __importDefault(require("./material/EmpireName"));
103
- var Empires_1 = __importDefault(require("./material/Empires"));
104
- var EmpireSide_1 = __importDefault(require("./material/EmpireSide"));
105
- var Resource_1 = __importStar(require("./material/Resource"));
106
- var ChooseDevelopmentCard_1 = require("./moves/ChooseDevelopmentCard");
107
- var CompleteConstruction_1 = require("./moves/CompleteConstruction");
108
- var Concede_1 = require("./moves/Concede");
109
- var DealDevelopmentCards_1 = require("./moves/DealDevelopmentCards");
110
- var DiscardLeftoverCards_1 = require("./moves/DiscardLeftoverCards");
111
- var MoveType_1 = __importDefault(require("./moves/MoveType"));
112
- var PassCards_1 = require("./moves/PassCards");
113
- var PlaceCharacter_1 = require("./moves/PlaceCharacter");
114
- var PlaceResource_1 = require("./moves/PlaceResource");
115
- var Produce_1 = require("./moves/Produce");
116
- var ReceiveCharacter_1 = require("./moves/ReceiveCharacter");
117
- var Recycle_1 = require("./moves/Recycle");
118
- var RevealChosenCards_1 = require("./moves/RevealChosenCards");
119
- var SlateForConstruction_1 = require("./moves/SlateForConstruction");
120
- var StartPhase_1 = require("./moves/StartPhase");
121
- var TellYouAreReady_1 = require("./moves/TellYouAreReady");
122
- var TransformIntoKrystallium_1 = require("./moves/TransformIntoKrystallium");
123
- var Options_1 = require("./Options");
124
- var Phase_1 = __importDefault(require("./Phase"));
125
- exports.numberOfCardsToDraft = 7;
126
- var numberOfCardsDeal2Players = 10;
127
- exports.numberOfRounds = 4;
128
- var defaultEmpireCardsSide = EmpireSide_1.default.A;
129
- var ItsAWonderfulWorld = (function (_super) {
130
- __extends(ItsAWonderfulWorld, _super);
131
- function ItsAWonderfulWorld(arg) {
132
- var _this = this;
133
- if (Options_1.isGameOptions(arg)) {
134
- _this = _super.call(this, {
135
- players: setupPlayers(arg),
136
- deck: lodash_shuffle_1.default(Array.from(Developments_1.developmentCards.keys())),
137
- discard: [],
138
- round: 1,
139
- phase: Phase_1.default.Draft
140
- }) || this;
141
- }
142
- else {
143
- _this = _super.call(this, arg) || this;
144
- }
145
- return _this;
146
- }
147
- ItsAWonderfulWorld.prototype.isActive = function (playerId) {
148
- var player = this.state.players.find(function (player) { return player.empire === playerId; });
149
- if (!player)
150
- return false;
151
- switch (this.state.phase) {
152
- case Phase_1.default.Draft:
153
- return player.chosenCard === undefined && player.hand.length > 0;
154
- case Phase_1.default.Planning:
155
- case Phase_1.default.Production:
156
- return !player.ready;
157
- }
158
- };
159
- ItsAWonderfulWorld.prototype.isOver = function () {
160
- return isOver(this.state);
161
- };
162
- ItsAWonderfulWorld.prototype.getAutomaticMove = function () {
163
- var e_1, _a;
164
- switch (this.state.phase) {
165
- case Phase_1.default.Draft:
166
- var anyPlayer = this.state.players.filter(function (player) { return !player.eliminated; })[0];
167
- if (anyPlayer && !anyPlayer.hand.length && !anyPlayer.draftArea.length) {
168
- return { type: MoveType_1.default.DealDevelopmentCards };
169
- }
170
- else if (this.state.players.every(function (player) { return player.chosenCard !== undefined || (player.eliminated && !player.hand.length); })) {
171
- return { type: MoveType_1.default.RevealChosenCards };
172
- }
173
- else if (anyPlayer && anyPlayer.cardsToPass) {
174
- return { type: MoveType_1.default.PassCards };
175
- }
176
- else if (anyPlayer && anyPlayer.draftArea.length === exports.numberOfCardsToDraft) {
177
- if (anyPlayer.hand.length) {
178
- return { type: MoveType_1.default.DiscardLeftoverCards };
179
- }
180
- else {
181
- return { type: MoveType_1.default.StartPhase, phase: Phase_1.default.Planning };
182
- }
183
- }
184
- else {
185
- try {
186
- for (var _b = __values(this.state.players), _c = _b.next(); !_c.done; _c = _b.next()) {
187
- var player = _c.value;
188
- if (player.chosenCard === undefined && player.hand.length === 1) {
189
- return { type: MoveType_1.default.ChooseDevelopmentCard, playerId: player.empire, card: player.hand[0] };
190
- }
191
- }
192
- }
193
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
194
- finally {
195
- try {
196
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
197
- }
198
- finally { if (e_1) throw e_1.error; }
199
- }
200
- }
201
- break;
202
- case Phase_1.default.Planning:
203
- if (this.state.players.every(function (player) { return player.ready; })) {
204
- return { type: MoveType_1.default.StartPhase, phase: Phase_1.default.Production };
205
- }
206
- break;
207
- case Phase_1.default.Production:
208
- if (!this.state.productionStep) {
209
- return { type: MoveType_1.default.Produce, resource: Resource_1.default.Materials };
210
- }
211
- else if (this.state.players.every(function (player) { return player.ready; })) {
212
- var nextProductionStep = getNextProductionStep(this.state);
213
- if (nextProductionStep) {
214
- return { type: MoveType_1.default.Produce, resource: nextProductionStep };
215
- }
216
- else if (this.state.round < exports.numberOfRounds) {
217
- return { type: MoveType_1.default.StartPhase, phase: Phase_1.default.Draft };
218
- }
219
- }
220
- break;
221
- }
222
- return getPredictableAutomaticMoves(this.state);
223
- };
224
- ItsAWonderfulWorld.prototype.getLegalMoves = function (empire) {
225
- var player = this.state.players.find(function (player) { return player.empire === empire; });
226
- if (!player || (this.state.round === exports.numberOfRounds && this.state.productionStep === Resource_1.default.Exploration && player.ready)) {
227
- return [];
228
- }
229
- return getLegalMoves(player, this.state.phase);
230
- };
231
- ItsAWonderfulWorld.prototype.play = function (move) {
232
- switch (move.type) {
233
- case MoveType_1.default.DealDevelopmentCards:
234
- return DealDevelopmentCards_1.dealDevelopmentCards(this.state);
235
- case MoveType_1.default.ChooseDevelopmentCard:
236
- return ChooseDevelopmentCard_1.chooseDevelopmentCard(this.state, move);
237
- case MoveType_1.default.RevealChosenCards:
238
- return RevealChosenCards_1.revealChosenCards(this.state);
239
- case MoveType_1.default.PassCards:
240
- return PassCards_1.passCards(this.state);
241
- case MoveType_1.default.DiscardLeftoverCards:
242
- return DiscardLeftoverCards_1.discardLeftOverCards(this.state);
243
- case MoveType_1.default.StartPhase:
244
- return StartPhase_1.startPhase(this.state, move);
245
- case MoveType_1.default.SlateForConstruction:
246
- return SlateForConstruction_1.slateForConstruction(this.state, move);
247
- case MoveType_1.default.Recycle:
248
- return Recycle_1.recycle(this.state, move);
249
- case MoveType_1.default.PlaceResource:
250
- return PlaceResource_1.placeResource(this.state, move);
251
- case MoveType_1.default.CompleteConstruction:
252
- return CompleteConstruction_1.completeConstruction(this.state, move);
253
- case MoveType_1.default.TransformIntoKrystallium:
254
- return TransformIntoKrystallium_1.transformIntoKrystallium(this.state, move);
255
- case MoveType_1.default.TellYouAreReady:
256
- return TellYouAreReady_1.tellYouAreReady(this.state, move);
257
- case MoveType_1.default.Produce:
258
- return Produce_1.produce(this.state, move);
259
- case MoveType_1.default.ReceiveCharacter:
260
- return ReceiveCharacter_1.receiveCharacter(this.state, move);
261
- case MoveType_1.default.PlaceCharacter:
262
- return PlaceCharacter_1.placeCharacter(this.state, move);
263
- case MoveType_1.default.Concede:
264
- return Concede_1.concede(this.state, move);
265
- }
266
- };
267
- ItsAWonderfulWorld.prototype.getScore = function (empire) {
268
- return getScore(this.getPlayer(empire));
269
- };
270
- ItsAWonderfulWorld.prototype.getPlayer = function (playerId) {
271
- var player = this.state.players.find(function (player) { return player.empire === playerId; });
272
- if (!player)
273
- throw new Error(playerId + " is expected on " + this.state);
274
- return player;
275
- };
276
- ItsAWonderfulWorld.prototype.rankPlayers = function (empireA, empireB) {
277
- var playerA = this.getPlayer(empireA), playerB = this.getPlayer(empireB);
278
- if (playerA.eliminated || playerB.eliminated) {
279
- return playerA.eliminated ? playerB.eliminated ? playerB.eliminated - playerA.eliminated : 1 : -1;
280
- }
281
- var scoreA = getScore(playerA), scoreB = getScore(playerB);
282
- if (scoreA !== scoreB) {
283
- return scoreB - scoreA;
284
- }
285
- var buildingsA = playerA.constructedDevelopments.length, buildingsB = playerB.constructedDevelopments.length;
286
- if (buildingsA !== buildingsB) {
287
- return buildingsB - buildingsA;
288
- }
289
- return countCharacters(playerB) - countCharacters(playerA);
290
- };
291
- ItsAWonderfulWorld.prototype.canUndo = function (action, consecutiveActions) {
292
- return canUndo_1.default(this.state, action, consecutiveActions);
293
- };
294
- ItsAWonderfulWorld.prototype.getView = function (playerId) {
295
- return __assign(__assign({}, this.state), { deck: this.state.deck.length, players: this.state.players.map(function (player) {
296
- if (player.empire === playerId) {
297
- return player;
298
- }
299
- else {
300
- var playerView = __assign(__assign({}, player), { hand: player.hand.length });
301
- if (player.chosenCard !== undefined) {
302
- playerView.chosenCard = true;
303
- }
304
- return playerView;
305
- }
306
- }) });
307
- };
308
- ItsAWonderfulWorld.prototype.getPlayerView = function (playerId) {
309
- return this.getView(playerId);
310
- };
311
- ItsAWonderfulWorld.prototype.getMoveView = function (move, playerId) {
312
- switch (move.type) {
313
- case MoveType_1.default.DealDevelopmentCards:
314
- return playerId ? __assign(__assign({}, move), { playerCards: this.state.players.find(function (player) { return player.empire === playerId; }).hand }) : move;
315
- case MoveType_1.default.ChooseDevelopmentCard:
316
- if (playerId !== move.playerId) {
317
- var card = move.card, moveView = __rest(move, ["card"]);
318
- return moveView;
319
- }
320
- break;
321
- case MoveType_1.default.RevealChosenCards:
322
- return __assign(__assign({}, move), { revealedCards: this.state.players.reduce(function (revealedCards, player) {
323
- revealedCards[player.empire] = player.draftArea[player.draftArea.length - 1];
324
- return revealedCards;
325
- }, {}) });
326
- case MoveType_1.default.PassCards:
327
- return __assign(__assign({}, move), { receivedCards: playerId ? this.state.players.find(function (player) { return player.empire === playerId; }).hand : undefined });
328
- case MoveType_1.default.DiscardLeftoverCards:
329
- return __assign(__assign({}, move), { discardedCards: this.state.discard.slice((exports.numberOfCardsToDraft - numberOfCardsDeal2Players) * this.state.players.length) });
330
- }
331
- return move;
332
- };
333
- ItsAWonderfulWorld.prototype.getPlayerMoveView = function (move, playerId) {
334
- return this.getMoveView(move, playerId);
335
- };
336
- ItsAWonderfulWorld.prototype.isEliminated = function (playerId) {
337
- return !!this.getPlayer(playerId).eliminated;
338
- };
339
- ItsAWonderfulWorld.prototype.getConcedeMove = function (playerId) {
340
- return { type: MoveType_1.default.Concede, playerId: playerId };
341
- };
342
- ItsAWonderfulWorld.prototype.giveTime = function (playerId) {
343
- switch (this.state.phase) {
344
- case Phase_1.default.Draft:
345
- if (this.state.round === 1 && this.getPlayer(playerId).draftArea.length === 0) {
346
- return 180;
347
- }
348
- else {
349
- return (exports.numberOfCardsToDraft - this.getPlayer(playerId).draftArea.length - 1) * 10;
350
- }
351
- case Phase_1.default.Planning:
352
- return (this.state.round + 1) * 60;
353
- case Phase_1.default.Production:
354
- return 15;
355
- }
356
- };
357
- return ItsAWonderfulWorld;
358
- }(rules_api_1.SimultaneousGame));
359
- exports.default = ItsAWonderfulWorld;
360
- function setupPlayers(options) {
361
- var players = options.players;
362
- var empireSide = options.empiresSide;
363
- var empiresLeft = lodash_shuffle_1.default(Object.values(EmpireName_1.default).filter(function (empire) { return players.some(function (player) { return player.id === empire; }); }));
364
- return players.map(function (player) { return setupPlayer(player.id || empiresLeft.pop(), empireSide); });
365
- }
366
- exports.setupPlayers = setupPlayers;
367
- function setupPlayer(empire, empireSide) {
368
- var _a;
369
- return {
370
- empire: empire,
371
- empireSide: empireSide || defaultEmpireCardsSide, hand: [], draftArea: [], constructionArea: [], availableResources: [], empireCardResources: [],
372
- constructedDevelopments: [], ready: false,
373
- characters: (_a = {}, _a[Character_1.default.Financier] = 0, _a[Character_1.default.General] = 0, _a),
374
- bonuses: []
375
- };
376
- }
377
- function getPredictableAutomaticMoves(state) {
378
- var e_2, _a, e_3, _b, e_4, _c;
379
- try {
380
- for (var _d = __values(state.players), _e = _d.next(); !_e.done; _e = _d.next()) {
381
- var player = _e.value;
382
- try {
383
- for (var _f = (e_3 = void 0, __values(player.constructionArea)), _g = _f.next(); !_g.done; _g = _f.next()) {
384
- var construction = _g.value;
385
- if (construction.costSpaces.every(function (space) { return space !== null; })) {
386
- return { type: MoveType_1.default.CompleteConstruction, playerId: player.empire, card: construction.card };
387
- }
388
- }
389
- }
390
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
391
- finally {
392
- try {
393
- if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
394
- }
395
- finally { if (e_3) throw e_3.error; }
396
- }
397
- if (player.empireCardResources.filter(function (resource) { return resource !== Resource_1.default.Krystallium; }).length >= 5) {
398
- return { type: MoveType_1.default.TransformIntoKrystallium, playerId: player.empire };
399
- }
400
- var bonus = player.bonuses.find(function (bonus) { return bonus !== Character_1.ChooseCharacter; });
401
- if (Resource_1.isResource(bonus)) {
402
- return { type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: bonus };
403
- }
404
- else if (Character_1.isCharacter(bonus)) {
405
- return { type: MoveType_1.default.ReceiveCharacter, playerId: player.empire, character: bonus };
406
- }
407
- var _loop_1 = function (resource) {
408
- if (!player.draftArea.some(function (card) { return Developments_1.developmentCards[card].constructionCost[resource]; })
409
- && !player.constructionArea.some(function (construction) { return getSpacesMissingItem(construction, function (item) { return item === resource; }).length > 0; })) {
410
- return { value: { type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: resource } };
411
- }
412
- };
413
- try {
414
- for (var _h = (e_4 = void 0, __values(__spreadArray([], __read(new Set(player.availableResources))))), _j = _h.next(); !_j.done; _j = _h.next()) {
415
- var resource = _j.value;
416
- var state_1 = _loop_1(resource);
417
- if (typeof state_1 === "object")
418
- return state_1.value;
419
- }
420
- }
421
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
422
- finally {
423
- try {
424
- if (_j && !_j.done && (_c = _h.return)) _c.call(_h);
425
- }
426
- finally { if (e_4) throw e_4.error; }
427
- }
428
- }
429
- }
430
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
431
- finally {
432
- try {
433
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
434
- }
435
- finally { if (e_2) throw e_2.error; }
436
- }
437
- }
438
- exports.getPredictableAutomaticMoves = getPredictableAutomaticMoves;
439
- function getLegalMoves(player, phase) {
440
- var moves = [];
441
- switch (phase) {
442
- case Phase_1.default.Draft:
443
- if (player.chosenCard === undefined) {
444
- player.hand.forEach(function (card) { return moves.push({ type: MoveType_1.default.ChooseDevelopmentCard, playerId: player.empire, card: card }); });
445
- }
446
- break;
447
- case Phase_1.default.Planning:
448
- player.draftArea.forEach(function (card) { return moves.push({ type: MoveType_1.default.SlateForConstruction, playerId: player.empire, card: card }, {
449
- type: MoveType_1.default.Recycle, playerId: player.empire,
450
- card: card
451
- }); });
452
- if (!player.draftArea.length && !player.availableResources.length && !player.ready) {
453
- moves.push({ type: MoveType_1.default.TellYouAreReady, playerId: player.empire });
454
- }
455
- break;
456
- case Phase_1.default.Production:
457
- if (!player.bonuses.length && !player.availableResources.length && !player.ready) {
458
- moves.push({ type: MoveType_1.default.TellYouAreReady, playerId: player.empire });
459
- }
460
- break;
461
- }
462
- __spreadArray([], __read(new Set(player.availableResources))).forEach(function (resource) {
463
- player.constructionArea.forEach(function (construction) {
464
- getSpacesMissingItem(construction, function (item) { return item === resource; })
465
- .forEach(function (space) { return moves.push({ type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: resource, card: construction.card, space: space }); });
466
- });
467
- moves.push({ type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: resource });
468
- });
469
- if (player.bonuses.some(function (bonus) { return bonus === Character_1.ChooseCharacter; })) {
470
- Character_1.characters.forEach(function (character) { return moves.push({ type: MoveType_1.default.ReceiveCharacter, playerId: player.empire, character: character }); });
471
- }
472
- player.constructionArea.forEach(function (construction) {
473
- moves.push({ type: MoveType_1.default.Recycle, playerId: player.empire, card: construction.card });
474
- });
475
- if (player.empireCardResources.some(function (resource) { return resource === Resource_1.default.Krystallium; })) {
476
- player.constructionArea.forEach(function (construction) {
477
- getSpacesMissingItem(construction, function (item) { return Resource_1.isResource(item); })
478
- .forEach(function (space) { return moves.push({ type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: Resource_1.default.Krystallium, card: construction.card, space: space }); });
479
- });
480
- }
481
- Character_1.characters.forEach(function (character) {
482
- if (player.characters[character]) {
483
- player.constructionArea.forEach(function (construction) {
484
- getSpacesMissingItem(construction, function (item) { return item === character; })
485
- .forEach(function (space) { return moves.push({ type: MoveType_1.default.PlaceCharacter, playerId: player.empire, character: character, card: construction.card, space: space }); });
486
- });
487
- }
488
- });
489
- return moves;
490
- }
491
- exports.getLegalMoves = getLegalMoves;
492
- function getCost(card) {
493
- var development = Developments_1.developmentCards[card];
494
- return Array.of.apply(Array, __spreadArray(__spreadArray([], __read(Resource_1.resources)), __read(Character_1.characters))).flatMap(function (item) { return Array(development.constructionCost[item] || 0).fill(item); });
495
- }
496
- exports.getCost = getCost;
497
- function getRemainingCost(construction) {
498
- var development = Developments_1.developmentCards[construction.card];
499
- return Array.of.apply(Array, __spreadArray(__spreadArray([], __read(Resource_1.resources)), __read(Character_1.characters))).flatMap(function (item) { return Array(development.constructionCost[item] || 0).fill(item); })
500
- .map(function (item, index) { return ({ item: item, space: index }); })
501
- .filter(function (item) { return !construction.costSpaces[item.space]; });
502
- }
503
- exports.getRemainingCost = getRemainingCost;
504
- function getSpacesMissingItem(construction, predicate) {
505
- return getRemainingCost(construction).filter(function (cost) { return predicate(cost.item); }).map(function (cost) { return cost.space; });
506
- }
507
- exports.getSpacesMissingItem = getSpacesMissingItem;
508
- function getNextProductionStep(game) {
509
- switch (game.productionStep) {
510
- case Resource_1.default.Materials:
511
- return Resource_1.default.Energy;
512
- case Resource_1.default.Energy:
513
- return Resource_1.default.Science;
514
- case Resource_1.default.Science:
515
- return Resource_1.default.Gold;
516
- case Resource_1.default.Gold:
517
- return Resource_1.default.Exploration;
518
- default:
519
- return undefined;
520
- }
521
- }
522
- exports.getNextProductionStep = getNextProductionStep;
523
- function getProduction(player, resource) {
524
- return getBaseProduction(player, resource) + player.constructedDevelopments.reduce(function (sum, card) { return sum + getDevelopmentProduction(player, Developments_1.developmentCards[card], resource); }, 0);
525
- }
526
- exports.getProduction = getProduction;
527
- function getBaseProduction(player, resource) {
528
- return Empires_1.default[player.empire][player.empireSide].production[resource] || 0;
529
- }
530
- function getDevelopmentProduction(player, development, resource) {
531
- if (!development.production) {
532
- return 0;
533
- }
534
- else if (Resource_1.isResource(development.production)) {
535
- return development.production === resource ? 1 : 0;
536
- }
537
- else {
538
- var production_1 = development.production[resource];
539
- if (DevelopmentType_1.isDevelopmentType(production_1)) {
540
- return player.constructedDevelopments.filter(function (card) { return Developments_1.developmentCards[card].type === production_1; }).length;
541
- }
542
- else {
543
- return production_1 || 0;
544
- }
545
- }
546
- }
547
- function getCardVictoryPointsMultiplier(item, victoryPoints) {
548
- return victoryPoints && typeof victoryPoints !== 'number' && victoryPoints[item] ? victoryPoints[item] : 0;
549
- }
550
- function getVictoryPointsBonusMultiplier(player, item) {
551
- return getCardVictoryPointsMultiplier(item, Empires_1.default[player.empire][player.empireSide].victoryPoints) +
552
- player.constructedDevelopments.map(function (card) { return Developments_1.developmentCards[card].victoryPoints; })
553
- .reduce(function (sum, victoryPoints) { return sum + getCardVictoryPointsMultiplier(item, victoryPoints); }, 0);
554
- }
555
- exports.getVictoryPointsBonusMultiplier = getVictoryPointsBonusMultiplier;
556
- function getVictoryPointsMultiplier(player, item) {
557
- return DevelopmentType_1.isDevelopmentType(item) ? getVictoryPointsBonusMultiplier(player, item) : getVictoryPointsBonusMultiplier(player, item) + 1;
558
- }
559
- exports.getVictoryPointsMultiplier = getVictoryPointsMultiplier;
560
- function getScore(player) {
561
- return getFlatVictoryPoints(player)
562
- + DevelopmentType_1.developmentTypes.reduce(function (sum, developmentType) { return sum + getComboVictoryPoints(player, developmentType); }, 0)
563
- + Character_1.characters.reduce(function (sum, characterType) { return sum + getComboVictoryPoints(player, characterType); }, 0);
564
- }
565
- exports.getScore = getScore;
566
- function getFlatVictoryPoints(player) {
567
- return player.constructedDevelopments.map(function (card) { return Developments_1.developmentCards[card].victoryPoints; })
568
- .reduce(function (sum, victoryPoints) { return sum + (typeof victoryPoints == 'number' ? victoryPoints : 0); }, 0);
569
- }
570
- exports.getFlatVictoryPoints = getFlatVictoryPoints;
571
- function getComboVictoryPoints(player, item) {
572
- return getItemQuantity(player, item) * getVictoryPointsMultiplier(player, item);
573
- }
574
- exports.getComboVictoryPoints = getComboVictoryPoints;
575
- function getItemQuantity(player, item) {
576
- return DevelopmentType_1.isDevelopmentType(item) ? player.constructedDevelopments.filter(function (card) { return Developments_1.developmentCards[card].type === item; }).length : player.characters[item];
577
- }
578
- exports.getItemQuantity = getItemQuantity;
579
- function canBuild(player, card) {
580
- var construction = player.constructionArea.find(function (construction) { return construction.card === card; });
581
- if (!construction) {
582
- return false;
583
- }
584
- return canPay(player, getRemainingCost(construction).map(function (cost) { return cost.item; }));
585
- }
586
- exports.canBuild = canBuild;
587
- function canPay(player, cost) {
588
- var e_5, _a, e_6, _b;
589
- var _loop_2 = function (character) {
590
- if (player.characters[character] < cost.filter(function (item) { return item === character; }).length) {
591
- return { value: false };
592
- }
593
- };
594
- try {
595
- for (var characters_1 = __values(Character_1.characters), characters_1_1 = characters_1.next(); !characters_1_1.done; characters_1_1 = characters_1.next()) {
596
- var character = characters_1_1.value;
597
- var state_2 = _loop_2(character);
598
- if (typeof state_2 === "object")
599
- return state_2.value;
600
- }
601
- }
602
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
603
- finally {
604
- try {
605
- if (characters_1_1 && !characters_1_1.done && (_a = characters_1.return)) _a.call(characters_1);
606
- }
607
- finally { if (e_5) throw e_5.error; }
608
- }
609
- var krystalliumLeft = player.empireCardResources.filter(function (resource) { return resource === Resource_1.default.Krystallium; }).length;
610
- var _loop_3 = function (resource) {
611
- var resourceCost = cost.filter(function (item) { return item === resource; }).length;
612
- var resources_2 = player.availableResources.filter(function (r) { return r === resource; }).length;
613
- if (resources_2 < resourceCost) {
614
- if (krystalliumLeft + resources_2 < resourceCost) {
615
- return { value: false };
616
- }
617
- krystalliumLeft -= resourceCost - resources_2;
618
- }
619
- };
620
- try {
621
- for (var resources_1 = __values(Resource_1.resources), resources_1_1 = resources_1.next(); !resources_1_1.done; resources_1_1 = resources_1.next()) {
622
- var resource = resources_1_1.value;
623
- var state_3 = _loop_3(resource);
624
- if (typeof state_3 === "object")
625
- return state_3.value;
626
- }
627
- }
628
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
629
- finally {
630
- try {
631
- if (resources_1_1 && !resources_1_1.done && (_b = resources_1.return)) _b.call(resources_1);
632
- }
633
- finally { if (e_6) throw e_6.error; }
634
- }
635
- return true;
636
- }
637
- exports.canPay = canPay;
638
- function getMovesToBuild(player, card) {
639
- var e_7, _a, e_8, _b;
640
- var moves = [];
641
- var construction = player.constructionArea.find(function (construction) { return construction.card === card; })
642
- || { card: card, costSpaces: Array(Development_1.totalCost(Developments_1.developmentCards[card])).fill(null) };
643
- var remainingCost = getRemainingCost(construction);
644
- var _loop_4 = function (resource) {
645
- var e_9, _c;
646
- var resourceCosts = remainingCost.filter(function (cost) { return cost.item === resource; });
647
- var resources_4 = player.availableResources.filter(function (r) { return r === resource; }).length;
648
- try {
649
- for (var resourceCosts_1 = (e_9 = void 0, __values(resourceCosts)), resourceCosts_1_1 = resourceCosts_1.next(); !resourceCosts_1_1.done; resourceCosts_1_1 = resourceCosts_1.next()) {
650
- var cost = resourceCosts_1_1.value;
651
- if (resources_4 > 0) {
652
- moves.push({ type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: resource, card: card, space: cost.space });
653
- resources_4--;
654
- }
655
- else {
656
- moves.push({ type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: Resource_1.default.Krystallium, card: card, space: cost.space });
657
- }
658
- }
659
- }
660
- catch (e_9_1) { e_9 = { error: e_9_1 }; }
661
- finally {
662
- try {
663
- if (resourceCosts_1_1 && !resourceCosts_1_1.done && (_c = resourceCosts_1.return)) _c.call(resourceCosts_1);
664
- }
665
- finally { if (e_9) throw e_9.error; }
666
- }
667
- };
668
- try {
669
- for (var resources_3 = __values(Resource_1.resources), resources_3_1 = resources_3.next(); !resources_3_1.done; resources_3_1 = resources_3.next()) {
670
- var resource = resources_3_1.value;
671
- _loop_4(resource);
672
- }
673
- }
674
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
675
- finally {
676
- try {
677
- if (resources_3_1 && !resources_3_1.done && (_a = resources_3.return)) _a.call(resources_3);
678
- }
679
- finally { if (e_7) throw e_7.error; }
680
- }
681
- try {
682
- for (var remainingCost_1 = __values(remainingCost), remainingCost_1_1 = remainingCost_1.next(); !remainingCost_1_1.done; remainingCost_1_1 = remainingCost_1.next()) {
683
- var cost = remainingCost_1_1.value;
684
- if (Character_1.isCharacter(cost.item)) {
685
- moves.push({ type: MoveType_1.default.PlaceCharacter, playerId: player.empire, character: cost.item, card: card, space: cost.space });
686
- }
687
- }
688
- }
689
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
690
- finally {
691
- try {
692
- if (remainingCost_1_1 && !remainingCost_1_1.done && (_b = remainingCost_1.return)) _b.call(remainingCost_1);
693
- }
694
- finally { if (e_8) throw e_8.error; }
695
- }
696
- return moves;
697
- }
698
- exports.getMovesToBuild = getMovesToBuild;
699
- function isPlaceItemOnCard(move, card) {
700
- if (card !== undefined) {
701
- return isPlaceItemOnCard(move) && move.card === card;
702
- }
703
- else {
704
- return PlaceResource_1.isPlaceResourceOnConstruction(move) || PlaceCharacter_1.isPlaceCharacter(move);
705
- }
706
- }
707
- exports.isPlaceItemOnCard = isPlaceItemOnCard;
708
- function isActive(game, playerId) {
709
- var player = game.players.find(function (player) { return player.empire === playerId; });
710
- switch (game.phase) {
711
- case Phase_1.default.Draft:
712
- return player.chosenCard === undefined;
713
- case Phase_1.default.Planning:
714
- case Phase_1.default.Production:
715
- return !player.ready;
716
- }
717
- }
718
- exports.isActive = isActive;
719
- function countCharacters(player) {
720
- return player.characters.Financier + player.characters.General;
721
- }
722
- exports.countCharacters = countCharacters;
723
- function isOver(game) {
724
- return game.round === exports.numberOfRounds && game.phase === Phase_1.default.Production && game.productionStep === Resource_1.default.Exploration && game.players.every(function (player) { return player.ready; });
725
- }
726
- exports.isOver = isOver;
727
- function constructionsThatMayReceiveCubes(player) {
728
- return player.constructionArea.filter(function (construction) { return getRemainingCost(construction).some(function (cost) { return Resource_1.isResource(cost.item) && player.availableResources.includes(cost.item); }); });
729
- }
730
- exports.constructionsThatMayReceiveCubes = constructionsThatMayReceiveCubes;
731
- function placeAvailableCubesMoves(player, construction) {
732
- var moves = [];
733
- var availableResource = JSON.parse(JSON.stringify(player.availableResources));
734
- getRemainingCost(construction).forEach(function (cost) {
735
- if (Resource_1.isResource(cost.item)) {
736
- if (availableResource.some(function (resource) { return resource === cost.item; })) {
737
- moves.push({ type: MoveType_1.default.PlaceResource, playerId: player.empire, resource: cost.item, card: construction.card, space: cost.space });
738
- availableResource.splice(availableResource.findIndex(function (resource) { return resource === cost.item; }), 1);
739
- }
740
- }
741
- });
742
- return moves;
743
- }
744
- exports.placeAvailableCubesMoves = placeAvailableCubesMoves;