@gamepark/rules-api 6.7.0 → 6.8.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,12 +1,13 @@
1
1
  import { Rules } from './Rules';
2
- import { MaterialGame, MaterialRules } from './material';
3
- export interface Competitive<Game, Move = string, PlayerId = number> extends Rules<Game, Move, PlayerId> {
4
- rankPlayers(playerA: PlayerId, playerB: PlayerId): number;
2
+ export declare type Competitive<Game = any, Move = any, PlayerId = any> = CompetitiveScore<Game, Move, PlayerId> | CompetitiveRank<Game, Move, PlayerId>;
3
+ export interface CompetitiveScore<Game = any, Move = any, PlayerId = any> extends Rules<Game, Move, PlayerId> {
4
+ getScore(playerId: PlayerId): number;
5
+ getTieBreaker?(tieBreaker: number, playerId: PlayerId): number | undefined;
5
6
  }
6
- export interface CompetitiveScore<Game, Move = string, PlayerId = number> extends Competitive<Game, Move, PlayerId> {
7
- getScore(playerId: PlayerId, tieBreaker?: number): number | undefined;
7
+ export interface CompetitiveRank<Game = any, Move = any, PlayerId = any> extends Rules<Game, Move, PlayerId> {
8
+ rankPlayers(playerA: PlayerId, playerB: PlayerId): number;
8
9
  }
9
10
  export declare function isCompetitive<Game, Move, PlayerId>(rules: Rules<any, any, PlayerId>): rules is Competitive<Game, Move, PlayerId>;
10
11
  export declare function isCompetitiveScore<Game, Move, PlayerId>(rules: Rules<any, any, PlayerId>): rules is CompetitiveScore<Game, Move, PlayerId>;
11
- export declare const rankByScore: <PlayerId = number>(playerA: PlayerId, playerB: PlayerId, getScore: (playerId: PlayerId, tieBreaker?: number) => number | undefined) => number;
12
- export declare const getWinners: <PlayerId extends number = number>(rules: MaterialRules<PlayerId, number, number> & CompetitiveScore<MaterialGame<PlayerId, number, number>, any, PlayerId>) => PlayerId[];
12
+ export declare function isCompetitiveRank<Game, Move, PlayerId>(rules: Rules<any, any, PlayerId>): rules is CompetitiveRank<Game, Move, PlayerId>;
13
+ export declare const rankPlayers: <PlayerId = number>(rules: Rules<any, any, PlayerId>, playerA: PlayerId, playerB: PlayerId) => number;
@@ -1,50 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getWinners = exports.rankByScore = exports.isCompetitiveScore = exports.isCompetitive = void 0;
3
+ exports.rankPlayers = exports.isCompetitiveRank = exports.isCompetitiveScore = exports.isCompetitive = void 0;
4
4
  function isCompetitive(rules) {
5
- return rules.rankPlayers !== undefined;
5
+ return isCompetitiveScore(rules) || isCompetitiveRank(rules);
6
6
  }
7
7
  exports.isCompetitive = isCompetitive;
8
8
  function isCompetitiveScore(rules) {
9
- return isCompetitive(rules) && rules.rankPlayers !== undefined;
9
+ return typeof rules.getScore === 'function';
10
10
  }
11
11
  exports.isCompetitiveScore = isCompetitiveScore;
12
- var rankByScore = function (playerA, playerB, getScore) {
13
- var result = undefined;
14
- var tieBreaker = 0;
15
- while (result === undefined) {
16
- var scoreA = getScore(playerA, tieBreaker);
17
- var scoreB = getScore(playerB, tieBreaker);
18
- if (scoreA === undefined || scoreB === undefined) {
19
- result = 0;
20
- }
21
- else if (scoreA !== scoreB) {
22
- result = scoreB - scoreA;
12
+ function isCompetitiveRank(rules) {
13
+ return typeof rules.rankPlayers === 'function';
14
+ }
15
+ exports.isCompetitiveRank = isCompetitiveRank;
16
+ var rankPlayers = function (rules, playerA, playerB) {
17
+ if (isCompetitiveRank(rules)) {
18
+ return rules.rankPlayers(playerA, playerB);
19
+ }
20
+ if (isCompetitiveScore(rules)) {
21
+ var scoreA = rules.getScore(playerA);
22
+ var scoreB = rules.getScore(playerB);
23
+ if (scoreA !== scoreB) {
24
+ return scoreB - scoreA;
23
25
  }
24
- else {
25
- tieBreaker++;
26
+ if (rules.getTieBreaker) {
27
+ for (var tieBreaker = 1; tieBreaker <= 10; tieBreaker++) {
28
+ var tieBreakerA = rules.getTieBreaker(tieBreaker, playerA);
29
+ var tieBreakerB = rules.getTieBreaker(tieBreaker, playerB);
30
+ if (tieBreakerA === undefined || tieBreakerB === undefined) {
31
+ return 0;
32
+ }
33
+ if (tieBreakerA !== tieBreakerB) {
34
+ return tieBreakerB - tieBreakerA;
35
+ }
36
+ }
37
+ console.error('getTieBreaker must return "undefined" after the last tie breaker is still a tie!');
26
38
  }
27
39
  }
28
- return result;
29
- };
30
- exports.rankByScore = rankByScore;
31
- var getWinners = function (rules) {
32
- var playersLeft = rules.players;
33
- var tieBreaker = 0;
34
- var _loop_1 = function () {
35
- var scores = playersLeft.map(function (player) { return rules.getScore(player, tieBreaker); });
36
- if (scores.some(function (score) { return score === undefined; }))
37
- return { value: playersLeft };
38
- var maxScore = Math.max.apply(Math, scores);
39
- playersLeft = playersLeft.filter(function (_, index) { return scores[index] === maxScore; });
40
- tieBreaker++;
41
- };
42
- while (playersLeft.length > 1) {
43
- var state_1 = _loop_1();
44
- if (typeof state_1 === "object")
45
- return state_1.value;
46
- }
47
- return playersLeft;
40
+ return 0;
48
41
  };
49
- exports.getWinners = getWinners;
42
+ exports.rankPlayers = rankPlayers;
50
43
  //# sourceMappingURL=Competitive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Competitive.js","sourceRoot":"","sources":["../src/Competitive.ts"],"names":[],"mappings":";;;AAWA,SAAgB,aAAa,CAAuB,KAAgC;IAClF,OAAQ,KAA2C,CAAC,WAAW,KAAK,SAAS,CAAA;AAC/E,CAAC;AAFD,sCAEC;AAED,SAAgB,kBAAkB,CAAuB,KAAgC;IACvF,OAAO,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgD,CAAC,WAAW,KAAK,SAAS,CAAA;AAC5G,CAAC;AAFD,gDAEC;AAEM,IAAM,WAAW,GAAG,UACzB,OAAiB,EAAE,OAAiB,EAAE,QAAyE;IAE/G,IAAI,MAAM,GAAuB,SAAS,CAAA;IAC1C,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,OAAO,MAAM,KAAK,SAAS,EAAE;QAC3B,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAC5C,IAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;QAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE;YAChD,MAAM,GAAG,CAAC,CAAA;SACX;aAAM,IAAI,MAAM,KAAK,MAAM,EAAE;YAC5B,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;SACzB;aAAM;YACL,UAAU,EAAE,CAAA;SACb;KACF;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAjBY,QAAA,WAAW,eAiBvB;AAEM,IAAM,UAAU,GAAG,UACxB,KAAwF;IAExF,IAAI,WAAW,GAAG,KAAK,CAAC,OAAO,CAAA;IAC/B,IAAI,UAAU,GAAG,CAAC,CAAA;;QAEhB,IAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,UAAA,MAAM,IAAI,OAAA,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,EAAlC,CAAkC,CAAC,CAAA;QAC5E,IAAI,MAAM,CAAC,IAAI,CAAC,UAAA,KAAK,IAAI,OAAA,KAAK,KAAK,SAAS,EAAnB,CAAmB,CAAC;4BAAS,WAAW,GAAA;QACjE,IAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,OAAR,IAAI,EAAQ,MAAkB,CAAC,CAAA;QAChD,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,UAAC,CAAC,EAAE,KAAK,IAAK,OAAA,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,EAA1B,CAA0B,CAAC,CAAA;QAC1E,UAAU,EAAE,CAAA;;IALd,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC;;;;KAM5B;IACD,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAbY,QAAA,UAAU,cAatB"}
1
+ {"version":3,"file":"Competitive.js","sourceRoot":"","sources":["../src/Competitive.ts"],"names":[],"mappings":";;;AAcA,SAAgB,aAAa,CAAuB,KAAgC;IAClF,OAAO,kBAAkB,CAAC,KAAK,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAA;AAC9D,CAAC;AAFD,sCAEC;AAED,SAAgB,kBAAkB,CAAuB,KAAgC;IACvF,OAAO,OAAQ,KAAgD,CAAC,QAAQ,KAAK,UAAU,CAAA;AACzF,CAAC;AAFD,gDAEC;AAED,SAAgB,iBAAiB,CAAuB,KAAgC;IACtF,OAAO,OAAQ,KAA+C,CAAC,WAAW,KAAK,UAAU,CAAA;AAC3F,CAAC;AAFD,8CAEC;AAEM,IAAM,WAAW,GAAG,UAAoB,KAAgC,EAAE,OAAiB,EAAE,OAAiB;IACnH,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE;QAC5B,OAAO,KAAK,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;KAC3C;IACD,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE;QAC7B,IAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,IAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,IAAI,MAAM,KAAK,MAAM,EAAE;YACrB,OAAO,MAAM,GAAG,MAAM,CAAA;SACvB;QACD,IAAI,KAAK,CAAC,aAAa,EAAE;YACvB,KAAK,IAAI,UAAU,GAAG,CAAC,EAAE,UAAU,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE;gBACvD,IAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBAC5D,IAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;gBAC5D,IAAI,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE;oBAC1D,OAAO,CAAC,CAAA;iBACT;gBACD,IAAI,WAAW,KAAK,WAAW,EAAE;oBAC/B,OAAO,WAAW,GAAG,WAAW,CAAA;iBACjC;aACF;YACD,OAAO,CAAC,KAAK,CAAC,kFAAkF,CAAC,CAAA;SAClG;KACF;IACD,OAAO,CAAC,CAAA;AACV,CAAC,CAAA;AAzBY,QAAA,WAAW,eAyBvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gamepark/rules-api",
3
- "version": "6.7.0",
3
+ "version": "6.8.0",
4
4
  "description": "API to implement the rules of a board game",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -29,5 +29,5 @@
29
29
  "@types/lodash": "^4.14.195",
30
30
  "i18next": ">=21.3.0"
31
31
  },
32
- "gitHead": "038bbd531491e786c2633f551159ce992d111742"
32
+ "gitHead": "c362418fd6230ead89ca8696f780ec254f52d424"
33
33
  }