volleyballsimtypes 0.0.139 → 0.0.140
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/data/index.d.ts +3 -0
- package/dist/esm/data/index.js +3 -0
- package/dist/esm/data/init-models.d.ts +2 -0
- package/dist/esm/data/init-models.js +194 -0
- package/dist/esm/data/models/coach.d.ts +40 -0
- package/dist/esm/data/models/coach.js +51 -0
- package/dist/esm/data/models/competition-champion.d.ts +23 -0
- package/dist/esm/data/models/competition-champion.js +34 -0
- package/dist/esm/data/models/competition-match.d.ts +29 -0
- package/dist/esm/data/models/competition-match.js +42 -0
- package/dist/esm/data/models/competition-teams.d.ts +23 -0
- package/dist/esm/data/models/competition-teams.js +38 -0
- package/dist/esm/data/models/competition.d.ts +67 -0
- package/dist/esm/data/models/competition.js +34 -0
- package/dist/esm/data/models/country.d.ts +61 -0
- package/dist/esm/data/models/country.js +30 -0
- package/dist/esm/data/models/draft-pick.d.ts +31 -0
- package/dist/esm/data/models/draft-pick.js +46 -0
- package/dist/esm/data/models/draft.d.ts +29 -0
- package/dist/esm/data/models/draft.js +30 -0
- package/dist/esm/data/models/index.d.ts +24 -0
- package/dist/esm/data/models/index.js +24 -0
- package/dist/esm/data/models/iteration.d.ts +26 -0
- package/dist/esm/data/models/iteration.js +26 -0
- package/dist/esm/data/models/league-season.d.ts +23 -0
- package/dist/esm/data/models/league-season.js +34 -0
- package/dist/esm/data/models/league.d.ts +44 -0
- package/dist/esm/data/models/league.js +34 -0
- package/dist/esm/data/models/match-rating.d.ts +27 -0
- package/dist/esm/data/models/match-rating.js +48 -0
- package/dist/esm/data/models/match-set-stats.d.ts +58 -0
- package/dist/esm/data/models/match-set-stats.js +123 -0
- package/dist/esm/data/models/match-set.d.ts +85 -0
- package/dist/esm/data/models/match-set.js +47 -0
- package/dist/esm/data/models/match.d.ts +67 -0
- package/dist/esm/data/models/match.js +47 -0
- package/dist/esm/data/models/performance-stats.d.ts +40 -0
- package/dist/esm/data/models/performance-stats.js +81 -0
- package/dist/esm/data/models/player-team.d.ts +28 -0
- package/dist/esm/data/models/player-team.js +48 -0
- package/dist/esm/data/models/player-trait.d.ts +23 -0
- package/dist/esm/data/models/player-trait.js +38 -0
- package/dist/esm/data/models/player.d.ts +124 -0
- package/dist/esm/data/models/player.js +42 -0
- package/dist/esm/data/models/rally.d.ts +29 -0
- package/dist/esm/data/models/rally.js +46 -0
- package/dist/esm/data/models/set-position.d.ts +29 -0
- package/dist/esm/data/models/set-position.js +46 -0
- package/dist/esm/data/models/team.d.ts +162 -0
- package/dist/esm/data/models/team.js +59 -0
- package/dist/esm/data/models/trait.d.ts +37 -0
- package/dist/esm/data/models/trait.js +26 -0
- package/dist/esm/data/models/user.d.ts +22 -0
- package/dist/esm/data/models/user.js +53 -0
- package/dist/esm/data/transformers/coach.d.ts +5 -0
- package/dist/esm/data/transformers/coach.js +25 -0
- package/dist/esm/data/transformers/country.d.ts +5 -0
- package/dist/esm/data/transformers/country.js +16 -0
- package/dist/esm/data/transformers/court-position.d.ts +5 -0
- package/dist/esm/data/transformers/court-position.js +27 -0
- package/dist/esm/data/transformers/draft-pick.d.ts +5 -0
- package/dist/esm/data/transformers/draft-pick.js +18 -0
- package/dist/esm/data/transformers/draft.d.ts +5 -0
- package/dist/esm/data/transformers/draft.js +20 -0
- package/dist/esm/data/transformers/formation.d.ts +5 -0
- package/dist/esm/data/transformers/formation.js +8 -0
- package/dist/esm/data/transformers/index.d.ts +25 -0
- package/dist/esm/data/transformers/index.js +25 -0
- package/dist/esm/data/transformers/iteration.d.ts +5 -0
- package/dist/esm/data/transformers/iteration.js +14 -0
- package/dist/esm/data/transformers/league.d.ts +5 -0
- package/dist/esm/data/transformers/league.js +28 -0
- package/dist/esm/data/transformers/match-rating.d.ts +4 -0
- package/dist/esm/data/transformers/match-rating.js +13 -0
- package/dist/esm/data/transformers/match-set-stats.d.ts +5 -0
- package/dist/esm/data/transformers/match-set-stats.js +57 -0
- package/dist/esm/data/transformers/match-set.d.ts +5 -0
- package/dist/esm/data/transformers/match-set.js +44 -0
- package/dist/esm/data/transformers/match.d.ts +5 -0
- package/dist/esm/data/transformers/match.js +27 -0
- package/dist/esm/data/transformers/performance-stats.d.ts +5 -0
- package/dist/esm/data/transformers/performance-stats.js +33 -0
- package/dist/esm/data/transformers/player-team.d.ts +3 -0
- package/dist/esm/data/transformers/player-team.js +9 -0
- package/dist/esm/data/transformers/player.d.ts +5 -0
- package/dist/esm/data/transformers/player.js +26 -0
- package/dist/esm/data/transformers/rally.d.ts +5 -0
- package/dist/esm/data/transformers/rally.js +23 -0
- package/dist/esm/data/transformers/role.d.ts +5 -0
- package/dist/esm/data/transformers/role.js +23 -0
- package/dist/esm/data/transformers/season-match.d.ts +4 -0
- package/dist/esm/data/transformers/season-match.js +13 -0
- package/dist/esm/data/transformers/season.d.ts +5 -0
- package/dist/esm/data/transformers/season.js +39 -0
- package/dist/esm/data/transformers/set-position.d.ts +5 -0
- package/dist/esm/data/transformers/set-position.js +16 -0
- package/dist/esm/data/transformers/stage.d.ts +5 -0
- package/dist/esm/data/transformers/stage.js +21 -0
- package/dist/esm/data/transformers/team.d.ts +5 -0
- package/dist/esm/data/transformers/team.js +28 -0
- package/dist/esm/data/transformers/tournament-match.d.ts +5 -0
- package/dist/esm/data/transformers/tournament-match.js +19 -0
- package/dist/esm/data/transformers/tournament.d.ts +5 -0
- package/dist/esm/data/transformers/tournament.js +33 -0
- package/dist/esm/data/transformers/trait.d.ts +5 -0
- package/dist/esm/data/transformers/trait.js +15 -0
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/service/coach/coach.d.ts +19 -0
- package/dist/esm/service/coach/coach.js +11 -0
- package/dist/esm/service/coach/formation.d.ts +31 -0
- package/dist/esm/service/coach/formation.js +122 -0
- package/dist/esm/service/coach/index.d.ts +2 -0
- package/dist/esm/service/coach/index.js +2 -0
- package/dist/esm/service/competition/index.d.ts +11 -0
- package/dist/esm/service/competition/index.js +12 -0
- package/dist/esm/service/competition/iteration.d.ts +10 -0
- package/dist/esm/service/competition/iteration.js +8 -0
- package/dist/esm/service/competition/league.d.ts +16 -0
- package/dist/esm/service/competition/league.js +8 -0
- package/dist/esm/service/competition/season.d.ts +23 -0
- package/dist/esm/service/competition/season.js +27 -0
- package/dist/esm/service/competition/stage.d.ts +11 -0
- package/dist/esm/service/competition/stage.js +24 -0
- package/dist/esm/service/competition/standing.d.ts +28 -0
- package/dist/esm/service/competition/standing.js +76 -0
- package/dist/esm/service/competition/tournament-match.d.ts +14 -0
- package/dist/esm/service/competition/tournament-match.js +9 -0
- package/dist/esm/service/competition/tournament.d.ts +20 -0
- package/dist/esm/service/competition/tournament.js +18 -0
- package/dist/esm/service/country/country.d.ts +17 -0
- package/dist/esm/service/country/country.js +18 -0
- package/dist/esm/service/country/index.d.ts +1 -0
- package/dist/esm/service/country/index.js +1 -0
- package/dist/esm/service/draft/draft-pick.d.ts +14 -0
- package/dist/esm/service/draft/draft-pick.js +7 -0
- package/dist/esm/service/draft/draft.d.ts +15 -0
- package/dist/esm/service/draft/draft.js +8 -0
- package/dist/esm/service/draft/index.d.ts +2 -0
- package/dist/esm/service/draft/index.js +2 -0
- package/dist/esm/service/event/index.d.ts +1 -0
- package/dist/esm/service/event/index.js +1 -0
- package/dist/esm/service/event/rally-event.d.ts +20 -0
- package/dist/esm/service/event/rally-event.js +16 -0
- package/dist/esm/service/index.d.ts +9 -0
- package/dist/esm/service/index.js +9 -0
- package/dist/esm/service/match/court-position.d.ts +21 -0
- package/dist/esm/service/match/court-position.js +53 -0
- package/dist/esm/service/match/court-target-enum.d.ts +21 -0
- package/dist/esm/service/match/court-target-enum.js +54 -0
- package/dist/esm/service/match/index.d.ts +7 -0
- package/dist/esm/service/match/index.js +7 -0
- package/dist/esm/service/match/match-rating.d.ts +35 -0
- package/dist/esm/service/match/match-rating.js +61 -0
- package/dist/esm/service/match/match-set.d.ts +65 -0
- package/dist/esm/service/match/match-set.js +56 -0
- package/dist/esm/service/match/match-team.d.ts +7 -0
- package/dist/esm/service/match/match-team.js +17 -0
- package/dist/esm/service/match/match.d.ts +36 -0
- package/dist/esm/service/match/match.js +57 -0
- package/dist/esm/service/match/rally.d.ts +22 -0
- package/dist/esm/service/match/rally.js +13 -0
- package/dist/esm/service/player/index.d.ts +5 -0
- package/dist/esm/service/player/index.js +5 -0
- package/dist/esm/service/player/performance-stats.d.ts +30 -0
- package/dist/esm/service/player/performance-stats.js +34 -0
- package/dist/esm/service/player/player.d.ts +46 -0
- package/dist/esm/service/player/player.js +84 -0
- package/dist/esm/service/player/role.d.ts +17 -0
- package/dist/esm/service/player/role.js +42 -0
- package/dist/esm/service/player/stats.d.ts +11 -0
- package/dist/esm/service/player/stats.js +25 -0
- package/dist/esm/service/player/trait.d.ts +21 -0
- package/dist/esm/service/player/trait.js +108 -0
- package/dist/esm/service/team/index.d.ts +1 -0
- package/dist/esm/service/team/index.js +1 -0
- package/dist/esm/service/team/team.d.ts +31 -0
- package/dist/esm/service/team/team.js +32 -0
- package/dist/esm/service/utils/index.d.ts +2 -0
- package/dist/esm/service/utils/index.js +2 -0
- package/dist/esm/service/utils/object-utils.d.ts +1 -0
- package/dist/esm/service/utils/object-utils.js +1 -0
- package/dist/esm/service/utils/string-utils.d.ts +2 -0
- package/dist/esm/service/utils/string-utils.js +11 -0
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface CountryOpts {
|
|
2
|
+
readonly id: string;
|
|
3
|
+
readonly name: string;
|
|
4
|
+
readonly short: string;
|
|
5
|
+
readonly language?: string;
|
|
6
|
+
readonly league?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare class Country {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly name: string;
|
|
11
|
+
readonly short: string;
|
|
12
|
+
readonly language?: string;
|
|
13
|
+
readonly league?: string;
|
|
14
|
+
constructor({ id, name, short, language, league }: CountryOpts);
|
|
15
|
+
toString(): string;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export class Country {
|
|
2
|
+
constructor({ id, name, short, language, league }) {
|
|
3
|
+
this.id = id;
|
|
4
|
+
this.name = name;
|
|
5
|
+
this.short = short;
|
|
6
|
+
this.language = language;
|
|
7
|
+
this.league = league;
|
|
8
|
+
}
|
|
9
|
+
toString() {
|
|
10
|
+
return JSON.stringify({
|
|
11
|
+
id: this.id,
|
|
12
|
+
name: this.name,
|
|
13
|
+
short: this.short,
|
|
14
|
+
language: this.language,
|
|
15
|
+
league: this.league
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './country';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './country';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Team } from '../team';
|
|
2
|
+
import { Player } from '../player';
|
|
3
|
+
interface DraftPickOpts {
|
|
4
|
+
readonly team: Team;
|
|
5
|
+
readonly pick: Player;
|
|
6
|
+
readonly priority: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class DraftPick {
|
|
9
|
+
readonly team: Team;
|
|
10
|
+
readonly pick: Player;
|
|
11
|
+
readonly priority: number;
|
|
12
|
+
constructor({ team, pick, priority }: DraftPickOpts);
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DraftPick } from './draft-pick';
|
|
2
|
+
interface DraftParams {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly start: Date;
|
|
5
|
+
readonly end: Date;
|
|
6
|
+
readonly picks: DraftPick[];
|
|
7
|
+
}
|
|
8
|
+
export declare class Draft {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly start: Date;
|
|
11
|
+
readonly end: Date;
|
|
12
|
+
readonly picks: DraftPick[];
|
|
13
|
+
constructor({ id, start, end, picks }: DraftParams);
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rally-event';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './rally-event';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Player } from '../player';
|
|
2
|
+
export declare enum EventTypeEnum {
|
|
3
|
+
LIBERO_REPLACEMENT = 0,
|
|
4
|
+
SUBSTITUTION = 1,
|
|
5
|
+
SERVE = 2,
|
|
6
|
+
RECEPTION = 3,
|
|
7
|
+
SET = 4,
|
|
8
|
+
SPIKE = 5,
|
|
9
|
+
BLOCK = 6
|
|
10
|
+
}
|
|
11
|
+
export interface RallyEventOpts {
|
|
12
|
+
readonly player: Player;
|
|
13
|
+
readonly eventType: EventTypeEnum;
|
|
14
|
+
}
|
|
15
|
+
export declare abstract class RallyEvent {
|
|
16
|
+
readonly player: string;
|
|
17
|
+
readonly eventType: EventTypeEnum;
|
|
18
|
+
protected constructor({ eventType, player }: RallyEventOpts);
|
|
19
|
+
abstract toString(): string;
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export var EventTypeEnum;
|
|
2
|
+
(function (EventTypeEnum) {
|
|
3
|
+
EventTypeEnum[EventTypeEnum["LIBERO_REPLACEMENT"] = 0] = "LIBERO_REPLACEMENT";
|
|
4
|
+
EventTypeEnum[EventTypeEnum["SUBSTITUTION"] = 1] = "SUBSTITUTION";
|
|
5
|
+
EventTypeEnum[EventTypeEnum["SERVE"] = 2] = "SERVE";
|
|
6
|
+
EventTypeEnum[EventTypeEnum["RECEPTION"] = 3] = "RECEPTION";
|
|
7
|
+
EventTypeEnum[EventTypeEnum["SET"] = 4] = "SET";
|
|
8
|
+
EventTypeEnum[EventTypeEnum["SPIKE"] = 5] = "SPIKE";
|
|
9
|
+
EventTypeEnum[EventTypeEnum["BLOCK"] = 6] = "BLOCK";
|
|
10
|
+
})(EventTypeEnum || (EventTypeEnum = {}));
|
|
11
|
+
export class RallyEvent {
|
|
12
|
+
constructor({ eventType, player }) {
|
|
13
|
+
this.player = player.id;
|
|
14
|
+
this.eventType = eventType;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare enum CourtRow {
|
|
2
|
+
BACK = "BACK_ROW",
|
|
3
|
+
FRONT = "FRONT_ROW"
|
|
4
|
+
}
|
|
5
|
+
export declare enum CourtPosition {
|
|
6
|
+
NOT_IN_COURT = -1,
|
|
7
|
+
LIBERO_ZONE = 0,
|
|
8
|
+
LEFT_FRONT = 4,
|
|
9
|
+
MIDDLE_FRONT = 3,
|
|
10
|
+
RIGHT_FRONT = 2,
|
|
11
|
+
LEFT_BACK = 5,
|
|
12
|
+
MIDDLE_BACK = 6,
|
|
13
|
+
RIGHT_BACK = 1
|
|
14
|
+
}
|
|
15
|
+
export declare namespace CourtPosition {
|
|
16
|
+
function getPositions(): CourtPosition[];
|
|
17
|
+
function rotatePosition(position: number): CourtPosition;
|
|
18
|
+
function isFrontRow(position: number): boolean;
|
|
19
|
+
function isBackRow(position: number): boolean;
|
|
20
|
+
function getRow(row: CourtRow): CourtPosition[];
|
|
21
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
export var CourtRow;
|
|
2
|
+
(function (CourtRow) {
|
|
3
|
+
CourtRow["BACK"] = "BACK_ROW";
|
|
4
|
+
CourtRow["FRONT"] = "FRONT_ROW";
|
|
5
|
+
})(CourtRow || (CourtRow = {}));
|
|
6
|
+
export var CourtPosition;
|
|
7
|
+
(function (CourtPosition) {
|
|
8
|
+
CourtPosition[CourtPosition["NOT_IN_COURT"] = -1] = "NOT_IN_COURT";
|
|
9
|
+
CourtPosition[CourtPosition["LIBERO_ZONE"] = 0] = "LIBERO_ZONE";
|
|
10
|
+
// -----------------------------------------------------
|
|
11
|
+
CourtPosition[CourtPosition["LEFT_FRONT"] = 4] = "LEFT_FRONT";
|
|
12
|
+
CourtPosition[CourtPosition["MIDDLE_FRONT"] = 3] = "MIDDLE_FRONT";
|
|
13
|
+
CourtPosition[CourtPosition["RIGHT_FRONT"] = 2] = "RIGHT_FRONT";
|
|
14
|
+
CourtPosition[CourtPosition["LEFT_BACK"] = 5] = "LEFT_BACK";
|
|
15
|
+
CourtPosition[CourtPosition["MIDDLE_BACK"] = 6] = "MIDDLE_BACK";
|
|
16
|
+
CourtPosition[CourtPosition["RIGHT_BACK"] = 1] = "RIGHT_BACK";
|
|
17
|
+
})(CourtPosition || (CourtPosition = {}));
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
19
|
+
(function (CourtPosition) {
|
|
20
|
+
const FRONT_ROW = [CourtPosition.LEFT_FRONT, CourtPosition.MIDDLE_FRONT, CourtPosition.RIGHT_FRONT];
|
|
21
|
+
const BACK_ROW = [CourtPosition.LEFT_BACK, CourtPosition.MIDDLE_BACK, CourtPosition.RIGHT_BACK];
|
|
22
|
+
function getPositions() {
|
|
23
|
+
return [...BACK_ROW, ...FRONT_ROW];
|
|
24
|
+
}
|
|
25
|
+
CourtPosition.getPositions = getPositions;
|
|
26
|
+
function rotatePosition(position) {
|
|
27
|
+
if (position < 1 || position > 6)
|
|
28
|
+
throw new Error('POSITION_INDEX_OUT_OF_BOUNDS');
|
|
29
|
+
if (position > CourtPosition.RIGHT_BACK)
|
|
30
|
+
return position - 1;
|
|
31
|
+
else
|
|
32
|
+
return CourtPosition.MIDDLE_BACK;
|
|
33
|
+
}
|
|
34
|
+
CourtPosition.rotatePosition = rotatePosition;
|
|
35
|
+
function isFrontRow(position) {
|
|
36
|
+
if (position < 1 || position > 6)
|
|
37
|
+
throw new Error('POSITION_INDEX_OUT_OF_BOUNDS');
|
|
38
|
+
return FRONT_ROW.includes(position);
|
|
39
|
+
}
|
|
40
|
+
CourtPosition.isFrontRow = isFrontRow;
|
|
41
|
+
function isBackRow(position) {
|
|
42
|
+
if (position < 1 || position > 6)
|
|
43
|
+
throw new Error(`POSITION_INDEX_OUT_OF_BOUNDS: ${position}`);
|
|
44
|
+
return BACK_ROW.includes(position);
|
|
45
|
+
}
|
|
46
|
+
CourtPosition.isBackRow = isBackRow;
|
|
47
|
+
function getRow(row) {
|
|
48
|
+
if (![CourtRow.BACK, CourtRow.FRONT].includes(row))
|
|
49
|
+
throw new Error(`INVALID_ROW: ${row}`);
|
|
50
|
+
return CourtRow.BACK === row ? [...BACK_ROW] : [...FRONT_ROW];
|
|
51
|
+
}
|
|
52
|
+
CourtPosition.getRow = getRow;
|
|
53
|
+
})(CourtPosition || (CourtPosition = {}));
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { CourtPosition, CourtRow } from './court-position';
|
|
2
|
+
export declare enum CourtTargetEnum {
|
|
3
|
+
NO_TARGET = 0,
|
|
4
|
+
OPPONENT_RIGHT_BACK = 7,
|
|
5
|
+
OPPONENT_MIDDLE_BACK = 12,
|
|
6
|
+
OPPONENT_LEFT_BACK = 11,
|
|
7
|
+
OPPONENT_RIGHT_FRONT = 8,
|
|
8
|
+
OPPONENT_MIDDLE_FRONT = 9,
|
|
9
|
+
OPPONENT_LEFT_FRONT = 10,
|
|
10
|
+
TEAM_LEFT_FRONT = 4,
|
|
11
|
+
TEAM_MIDDLE_FRONT = 3,
|
|
12
|
+
TEAM_RIGHT_FRONT = 2,
|
|
13
|
+
TEAM_LEFT_BACK = 5,
|
|
14
|
+
TEAM_MIDDLE_BACK = 6,
|
|
15
|
+
TEAM_RIGHT_BACK = 1
|
|
16
|
+
}
|
|
17
|
+
export declare namespace CourtTargetEnum {
|
|
18
|
+
function getTeamSide(row?: CourtRow): CourtTargetEnum[];
|
|
19
|
+
function getOpponentSide(row?: CourtRow): CourtTargetEnum[];
|
|
20
|
+
function getSidePosition(position: number): CourtPosition;
|
|
21
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { CourtRow } from './court-position';
|
|
2
|
+
export var CourtTargetEnum;
|
|
3
|
+
(function (CourtTargetEnum) {
|
|
4
|
+
CourtTargetEnum[CourtTargetEnum["NO_TARGET"] = 0] = "NO_TARGET";
|
|
5
|
+
CourtTargetEnum[CourtTargetEnum["OPPONENT_RIGHT_BACK"] = 7] = "OPPONENT_RIGHT_BACK";
|
|
6
|
+
CourtTargetEnum[CourtTargetEnum["OPPONENT_MIDDLE_BACK"] = 12] = "OPPONENT_MIDDLE_BACK";
|
|
7
|
+
CourtTargetEnum[CourtTargetEnum["OPPONENT_LEFT_BACK"] = 11] = "OPPONENT_LEFT_BACK";
|
|
8
|
+
CourtTargetEnum[CourtTargetEnum["OPPONENT_RIGHT_FRONT"] = 8] = "OPPONENT_RIGHT_FRONT";
|
|
9
|
+
CourtTargetEnum[CourtTargetEnum["OPPONENT_MIDDLE_FRONT"] = 9] = "OPPONENT_MIDDLE_FRONT";
|
|
10
|
+
CourtTargetEnum[CourtTargetEnum["OPPONENT_LEFT_FRONT"] = 10] = "OPPONENT_LEFT_FRONT";
|
|
11
|
+
// --------------------------------------------------------------------------------
|
|
12
|
+
CourtTargetEnum[CourtTargetEnum["TEAM_LEFT_FRONT"] = 4] = "TEAM_LEFT_FRONT";
|
|
13
|
+
CourtTargetEnum[CourtTargetEnum["TEAM_MIDDLE_FRONT"] = 3] = "TEAM_MIDDLE_FRONT";
|
|
14
|
+
CourtTargetEnum[CourtTargetEnum["TEAM_RIGHT_FRONT"] = 2] = "TEAM_RIGHT_FRONT";
|
|
15
|
+
CourtTargetEnum[CourtTargetEnum["TEAM_LEFT_BACK"] = 5] = "TEAM_LEFT_BACK";
|
|
16
|
+
CourtTargetEnum[CourtTargetEnum["TEAM_MIDDLE_BACK"] = 6] = "TEAM_MIDDLE_BACK";
|
|
17
|
+
CourtTargetEnum[CourtTargetEnum["TEAM_RIGHT_BACK"] = 1] = "TEAM_RIGHT_BACK";
|
|
18
|
+
})(CourtTargetEnum || (CourtTargetEnum = {}));
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
20
|
+
(function (CourtTargetEnum) {
|
|
21
|
+
function getTeamSide(row) {
|
|
22
|
+
switch (true) {
|
|
23
|
+
case row === CourtRow.BACK:
|
|
24
|
+
return [CourtTargetEnum.TEAM_RIGHT_BACK, CourtTargetEnum.TEAM_MIDDLE_BACK, CourtTargetEnum.TEAM_LEFT_BACK];
|
|
25
|
+
case row === CourtRow.FRONT:
|
|
26
|
+
return [CourtTargetEnum.TEAM_RIGHT_FRONT, CourtTargetEnum.TEAM_MIDDLE_FRONT, CourtTargetEnum.TEAM_LEFT_FRONT];
|
|
27
|
+
default:
|
|
28
|
+
return [CourtTargetEnum.TEAM_RIGHT_BACK, CourtTargetEnum.TEAM_MIDDLE_BACK, CourtTargetEnum.TEAM_LEFT_BACK,
|
|
29
|
+
CourtTargetEnum.TEAM_RIGHT_FRONT, CourtTargetEnum.TEAM_MIDDLE_FRONT, CourtTargetEnum.TEAM_LEFT_FRONT];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
CourtTargetEnum.getTeamSide = getTeamSide;
|
|
33
|
+
function getOpponentSide(row) {
|
|
34
|
+
switch (true) {
|
|
35
|
+
case row === CourtRow.BACK:
|
|
36
|
+
return [CourtTargetEnum.OPPONENT_RIGHT_BACK, CourtTargetEnum.OPPONENT_MIDDLE_BACK, CourtTargetEnum.OPPONENT_LEFT_BACK];
|
|
37
|
+
case row === CourtRow.FRONT:
|
|
38
|
+
return [CourtTargetEnum.OPPONENT_RIGHT_FRONT, CourtTargetEnum.OPPONENT_MIDDLE_FRONT, CourtTargetEnum.OPPONENT_LEFT_FRONT];
|
|
39
|
+
default:
|
|
40
|
+
return [CourtTargetEnum.OPPONENT_RIGHT_BACK, CourtTargetEnum.OPPONENT_MIDDLE_BACK, CourtTargetEnum.OPPONENT_LEFT_BACK,
|
|
41
|
+
CourtTargetEnum.OPPONENT_RIGHT_FRONT, CourtTargetEnum.OPPONENT_MIDDLE_FRONT, CourtTargetEnum.OPPONENT_LEFT_FRONT];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
CourtTargetEnum.getOpponentSide = getOpponentSide;
|
|
45
|
+
function getSidePosition(position) {
|
|
46
|
+
if (position < 1 || position > 12)
|
|
47
|
+
throw new Error('POSITION_INDEX_OUT_OF_BOUNDS');
|
|
48
|
+
if (position > 6)
|
|
49
|
+
return position - 6;
|
|
50
|
+
else
|
|
51
|
+
return position;
|
|
52
|
+
}
|
|
53
|
+
CourtTargetEnum.getSidePosition = getSidePosition;
|
|
54
|
+
})(CourtTargetEnum || (CourtTargetEnum = {}));
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Match, MatchTeam } from '.';
|
|
2
|
+
import { CompetitionType } from '../../data';
|
|
3
|
+
interface MatchRatingParams {
|
|
4
|
+
readonly match: Match;
|
|
5
|
+
readonly competitionType: CompetitionType;
|
|
6
|
+
}
|
|
7
|
+
interface SetScoreVariant {
|
|
8
|
+
'3-0': number;
|
|
9
|
+
'3-1': number;
|
|
10
|
+
'3-2': number;
|
|
11
|
+
'2-3': number;
|
|
12
|
+
'1-3': number;
|
|
13
|
+
'0-3': number;
|
|
14
|
+
}
|
|
15
|
+
interface MatchWeightFactor {
|
|
16
|
+
TOURNAMENT: number;
|
|
17
|
+
LEAGUE: number;
|
|
18
|
+
}
|
|
19
|
+
export declare class MatchRating {
|
|
20
|
+
static K: number;
|
|
21
|
+
static SSV: SetScoreVariant;
|
|
22
|
+
static C1: number;
|
|
23
|
+
static C2: number;
|
|
24
|
+
static C3: number;
|
|
25
|
+
static C4: number;
|
|
26
|
+
static C5: number;
|
|
27
|
+
static MWF: MatchWeightFactor;
|
|
28
|
+
readonly match: Match;
|
|
29
|
+
readonly weight: number;
|
|
30
|
+
constructor({ match, competitionType }: MatchRatingParams);
|
|
31
|
+
getPoints(team: MatchTeam): number;
|
|
32
|
+
static calculateProbability(z: number): number;
|
|
33
|
+
getExpectedResult(): number;
|
|
34
|
+
}
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { MatchScore } from '.';
|
|
2
|
+
export class MatchRating {
|
|
3
|
+
constructor({ match, competitionType }) {
|
|
4
|
+
this.match = match;
|
|
5
|
+
this.weight = MatchRating.MWF[competitionType];
|
|
6
|
+
}
|
|
7
|
+
getPoints(team) {
|
|
8
|
+
const rankingValue = MatchRating.SSV[this.match.getScore()] - this.getExpectedResult();
|
|
9
|
+
const weighted = rankingValue * this.weight / MatchRating.K;
|
|
10
|
+
if (this.match.isWinner(team))
|
|
11
|
+
return weighted;
|
|
12
|
+
else
|
|
13
|
+
return weighted * -1;
|
|
14
|
+
}
|
|
15
|
+
static calculateProbability(z) {
|
|
16
|
+
let area = 0.0;
|
|
17
|
+
const rectangles = 100000;
|
|
18
|
+
const width = (z - (-10)) / rectangles;
|
|
19
|
+
for (let i = 0; i < rectangles; i++) {
|
|
20
|
+
area += width * Math.exp(-Math.pow((width * i + (-10)), 2) / 2) / Math.sqrt(2 * Math.PI);
|
|
21
|
+
}
|
|
22
|
+
return area;
|
|
23
|
+
}
|
|
24
|
+
getExpectedResult() {
|
|
25
|
+
const D = MatchRating.K * (this.match.homeTeam.rating - this.match.awayTeam.rating) / 1000; // Strength difference between the teams
|
|
26
|
+
const P1 = MatchRating.calculateProbability(MatchRating.C1 + D); // 3-0
|
|
27
|
+
const P2 = MatchRating.calculateProbability(MatchRating.C2 + D) -
|
|
28
|
+
MatchRating.calculateProbability(MatchRating.C1 + D); // 3-1
|
|
29
|
+
const P3 = MatchRating.calculateProbability(MatchRating.C3 + D) -
|
|
30
|
+
MatchRating.calculateProbability(MatchRating.C2 + D); // 3-2
|
|
31
|
+
const P4 = MatchRating.calculateProbability(MatchRating.C4 + D) -
|
|
32
|
+
MatchRating.calculateProbability(MatchRating.C3 + D); // 2-3
|
|
33
|
+
const P5 = MatchRating.calculateProbability(MatchRating.C5 + D) -
|
|
34
|
+
MatchRating.calculateProbability(MatchRating.C4 + D); // 1-3
|
|
35
|
+
const P6 = 1 - MatchRating.calculateProbability(MatchRating.C5 + D); // 0-3
|
|
36
|
+
return P1 * MatchRating.SSV['3-0'] +
|
|
37
|
+
P2 * MatchRating.SSV['3-1'] +
|
|
38
|
+
P3 * MatchRating.SSV['3-2'] +
|
|
39
|
+
P4 * MatchRating.SSV['2-3'] +
|
|
40
|
+
P5 * MatchRating.SSV['1-3'] +
|
|
41
|
+
P6 * MatchRating.SSV['0-3']; // Expected Match Result EMR
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
MatchRating.K = 8; // Standard scaling factor
|
|
45
|
+
MatchRating.SSV = {
|
|
46
|
+
[MatchScore['3-0']]: 2,
|
|
47
|
+
[MatchScore['3-1']]: 1.5,
|
|
48
|
+
[MatchScore['3-2']]: 1,
|
|
49
|
+
[MatchScore['2-3']]: -1,
|
|
50
|
+
[MatchScore['1-3']]: -1.5,
|
|
51
|
+
[MatchScore['0-3']]: -2
|
|
52
|
+
};
|
|
53
|
+
MatchRating.C1 = -1.060;
|
|
54
|
+
MatchRating.C2 = -0.394;
|
|
55
|
+
MatchRating.C3 = 0;
|
|
56
|
+
MatchRating.C4 = 0.394;
|
|
57
|
+
MatchRating.C5 = 1.060;
|
|
58
|
+
MatchRating.MWF = {
|
|
59
|
+
TOURNAMENT: 50,
|
|
60
|
+
LEAGUE: 35
|
|
61
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { PlayerPosition, Rally } from './rally';
|
|
2
|
+
import { MatchTeam } from './match-team';
|
|
3
|
+
import { Player } from '../player';
|
|
4
|
+
declare enum ScoreThreshold {
|
|
5
|
+
SET = 25,
|
|
6
|
+
TIE_BREAK = 15
|
|
7
|
+
}
|
|
8
|
+
interface MatchSetParams {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
readonly order: number;
|
|
11
|
+
readonly isTieBreak: boolean;
|
|
12
|
+
readonly homePlayerPosition: PlayerPosition[];
|
|
13
|
+
readonly awayPlayerPosition: PlayerPosition[];
|
|
14
|
+
readonly homeScore: number;
|
|
15
|
+
readonly awayScore: number;
|
|
16
|
+
readonly stats: SetStatistics[];
|
|
17
|
+
readonly rallies: Rally[];
|
|
18
|
+
}
|
|
19
|
+
export interface EventStat {
|
|
20
|
+
success: number;
|
|
21
|
+
error: number;
|
|
22
|
+
}
|
|
23
|
+
export interface SetStatistics {
|
|
24
|
+
player: Player;
|
|
25
|
+
ace: number;
|
|
26
|
+
attempts: number;
|
|
27
|
+
contacts: number;
|
|
28
|
+
ralliesPlayed: number;
|
|
29
|
+
serve: EventStat;
|
|
30
|
+
reception: EventStat;
|
|
31
|
+
set: EventStat;
|
|
32
|
+
attack: EventStat;
|
|
33
|
+
block: EventStat;
|
|
34
|
+
kills: number;
|
|
35
|
+
killBlocks: number;
|
|
36
|
+
assists: number;
|
|
37
|
+
}
|
|
38
|
+
export declare class MatchSet {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly order: number;
|
|
41
|
+
readonly isTieBreak: boolean;
|
|
42
|
+
readonly homePlayerPosition: PlayerPosition[];
|
|
43
|
+
readonly awayPlayerPosition: PlayerPosition[];
|
|
44
|
+
readonly stats: SetStatistics[];
|
|
45
|
+
readonly rallies: Rally[];
|
|
46
|
+
readonly scoreThreshold: ScoreThreshold;
|
|
47
|
+
private _homeScore;
|
|
48
|
+
private _awayScore;
|
|
49
|
+
constructor({ id, order, isTieBreak, homePlayerPosition, awayPlayerPosition, stats, rallies, homeScore, awayScore }: MatchSetParams);
|
|
50
|
+
get homeScore(): number;
|
|
51
|
+
get awayScore(): number;
|
|
52
|
+
increaseScore(team: MatchTeam): void;
|
|
53
|
+
addRally(rally: Rally): void;
|
|
54
|
+
/**
|
|
55
|
+
* Has a team reached at least 25 points and is the score difference between both teams at least 2?
|
|
56
|
+
* @returns boolean
|
|
57
|
+
*/
|
|
58
|
+
isOver(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Get the team that won the Set. Return undefined if set is not over.
|
|
61
|
+
* @returns CourtTeam
|
|
62
|
+
*/
|
|
63
|
+
getWinner(): MatchTeam;
|
|
64
|
+
}
|
|
65
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { validateUUID } from '../utils';
|
|
2
|
+
import { MatchTeam } from './match-team';
|
|
3
|
+
var ScoreThreshold;
|
|
4
|
+
(function (ScoreThreshold) {
|
|
5
|
+
ScoreThreshold[ScoreThreshold["SET"] = 25] = "SET";
|
|
6
|
+
ScoreThreshold[ScoreThreshold["TIE_BREAK"] = 15] = "TIE_BREAK";
|
|
7
|
+
})(ScoreThreshold || (ScoreThreshold = {}));
|
|
8
|
+
export class MatchSet {
|
|
9
|
+
constructor({ id, order, isTieBreak, homePlayerPosition, awayPlayerPosition, stats, rallies, homeScore, awayScore }) {
|
|
10
|
+
validateUUID(id);
|
|
11
|
+
this.id = id;
|
|
12
|
+
this.order = order;
|
|
13
|
+
this._homeScore = homeScore;
|
|
14
|
+
this._awayScore = awayScore;
|
|
15
|
+
this.homePlayerPosition = homePlayerPosition;
|
|
16
|
+
this.awayPlayerPosition = awayPlayerPosition;
|
|
17
|
+
this.stats = stats;
|
|
18
|
+
this.rallies = rallies;
|
|
19
|
+
this.isTieBreak = isTieBreak;
|
|
20
|
+
this.scoreThreshold = isTieBreak ? ScoreThreshold.TIE_BREAK : ScoreThreshold.SET;
|
|
21
|
+
}
|
|
22
|
+
get homeScore() {
|
|
23
|
+
return this._homeScore;
|
|
24
|
+
}
|
|
25
|
+
get awayScore() {
|
|
26
|
+
return this._awayScore;
|
|
27
|
+
}
|
|
28
|
+
increaseScore(team) {
|
|
29
|
+
if (team === MatchTeam.HOME)
|
|
30
|
+
this._homeScore++;
|
|
31
|
+
else if (team === MatchTeam.AWAY)
|
|
32
|
+
this._awayScore++;
|
|
33
|
+
else
|
|
34
|
+
throw new Error('UNKNOWN_TEAM');
|
|
35
|
+
}
|
|
36
|
+
addRally(rally) {
|
|
37
|
+
this.rallies.push(rally);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Has a team reached at least 25 points and is the score difference between both teams at least 2?
|
|
41
|
+
* @returns boolean
|
|
42
|
+
*/
|
|
43
|
+
isOver() {
|
|
44
|
+
return Math.abs(this.homeScore - this.awayScore) > 1 &&
|
|
45
|
+
(this.homeScore >= this.scoreThreshold || this.awayScore >= this.scoreThreshold);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Get the team that won the Set. Return undefined if set is not over.
|
|
49
|
+
* @returns CourtTeam
|
|
50
|
+
*/
|
|
51
|
+
getWinner() {
|
|
52
|
+
if (!this.isOver())
|
|
53
|
+
throw new Error('UNFINISHED_SET');
|
|
54
|
+
return this.homeScore > this.awayScore ? MatchTeam.HOME : MatchTeam.AWAY;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export var MatchTeam;
|
|
2
|
+
(function (MatchTeam) {
|
|
3
|
+
MatchTeam["HOME"] = "homeTeam";
|
|
4
|
+
MatchTeam["AWAY"] = "awayTeam";
|
|
5
|
+
})(MatchTeam || (MatchTeam = {}));
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
7
|
+
(function (MatchTeam) {
|
|
8
|
+
function otherTeam(team) {
|
|
9
|
+
if (team === MatchTeam.HOME)
|
|
10
|
+
return MatchTeam.AWAY;
|
|
11
|
+
else if (team === MatchTeam.AWAY)
|
|
12
|
+
return MatchTeam.HOME;
|
|
13
|
+
else
|
|
14
|
+
throw new Error('UNKNOWN_MATCH_TEAM');
|
|
15
|
+
}
|
|
16
|
+
MatchTeam.otherTeam = otherTeam;
|
|
17
|
+
})(MatchTeam || (MatchTeam = {}));
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { MatchSet } from './match-set';
|
|
2
|
+
import { Team } from '../team';
|
|
3
|
+
import { MatchTeam } from './match-team';
|
|
4
|
+
interface MatchParams {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly homeTeam: Team;
|
|
7
|
+
readonly awayTeam: Team;
|
|
8
|
+
readonly scheduledDate: Date;
|
|
9
|
+
readonly sets: MatchSet[];
|
|
10
|
+
readonly isSimulated: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare enum MatchScore {
|
|
13
|
+
'3-0' = "3-0",
|
|
14
|
+
'3-1' = "3-1",
|
|
15
|
+
'3-2' = "3-2",
|
|
16
|
+
'2-3' = "2-3",
|
|
17
|
+
'1-3' = "1-3",
|
|
18
|
+
'0-3' = "0-3"
|
|
19
|
+
}
|
|
20
|
+
export declare class Match {
|
|
21
|
+
static readonly BEST_OF = 5;
|
|
22
|
+
readonly id: string;
|
|
23
|
+
readonly homeTeam: Team;
|
|
24
|
+
readonly awayTeam: Team;
|
|
25
|
+
readonly sets: MatchSet[];
|
|
26
|
+
readonly scheduledDate: Date;
|
|
27
|
+
isSimulated: boolean;
|
|
28
|
+
constructor({ id, homeTeam, awayTeam, scheduledDate, sets, isSimulated }: MatchParams);
|
|
29
|
+
addSet(set: MatchSet): void;
|
|
30
|
+
getTeamSets(team: MatchTeam): number;
|
|
31
|
+
getScore(): MatchScore;
|
|
32
|
+
isOver(): boolean;
|
|
33
|
+
getWinner(): Team;
|
|
34
|
+
isWinner(team: MatchTeam): boolean;
|
|
35
|
+
}
|
|
36
|
+
export {};
|