volleyballsimtypes 0.0.7 → 0.0.8
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/package.json +5 -5
- package/src/data/index.ts +0 -2
- package/src/data/models/block.ts +0 -159
- package/src/data/models/coach.ts +0 -94
- package/src/data/models/country.ts +0 -105
- package/src/data/models/event.ts +0 -83
- package/src/data/models/index.ts +0 -22
- package/src/data/models/league.ts +0 -90
- package/src/data/models/libero-replacement.ts +0 -104
- package/src/data/models/match-set-stats.ts +0 -204
- package/src/data/models/match-set.ts +0 -152
- package/src/data/models/match.ts +0 -106
- package/src/data/models/performance-stats.ts +0 -136
- package/src/data/models/player.ts +0 -370
- package/src/data/models/rally-position.ts +0 -79
- package/src/data/models/rally.ts +0 -229
- package/src/data/models/reception.ts +0 -113
- package/src/data/models/score.ts +0 -99
- package/src/data/models/season-teams.ts +0 -67
- package/src/data/models/season.ts +0 -103
- package/src/data/models/serve.ts +0 -113
- package/src/data/models/set.ts +0 -113
- package/src/data/models/spike.ts +0 -113
- package/src/data/models/substitution.ts +0 -98
- package/src/data/models/team.ts +0 -193
- package/src/data/transformers/block.ts +0 -117
- package/src/data/transformers/coach.ts +0 -33
- package/src/data/transformers/country.ts +0 -23
- package/src/data/transformers/court-position.ts +0 -43
- package/src/data/transformers/court-target.ts +0 -58
- package/src/data/transformers/event-type.ts +0 -35
- package/src/data/transformers/formation.ts +0 -16
- package/src/data/transformers/index.ts +0 -27
- package/src/data/transformers/league.ts +0 -26
- package/src/data/transformers/libero-replacement.ts +0 -62
- package/src/data/transformers/match-set-stats.ts +0 -101
- package/src/data/transformers/match-set.ts +0 -59
- package/src/data/transformers/match.ts +0 -48
- package/src/data/transformers/performance-stats.ts +0 -40
- package/src/data/transformers/player.ts +0 -109
- package/src/data/transformers/rally-position.ts +0 -24
- package/src/data/transformers/rally.ts +0 -139
- package/src/data/transformers/reception.ts +0 -98
- package/src/data/transformers/role.ts +0 -31
- package/src/data/transformers/score.ts +0 -43
- package/src/data/transformers/season.ts +0 -42
- package/src/data/transformers/serve.ts +0 -100
- package/src/data/transformers/set.ts +0 -98
- package/src/data/transformers/spike.ts +0 -102
- package/src/data/transformers/substitution.ts +0 -42
- package/src/data/transformers/team.ts +0 -45
- package/src/data/transformers/trait.ts +0 -37
- package/src/index.ts +0 -7
- package/src/routing/events.ts +0 -60
- package/src/routing/index.ts +0 -5
- package/src/routing/league.ts +0 -15
- package/src/routing/match.ts +0 -52
- package/src/routing/player.ts +0 -24
- package/src/routing/team.ts +0 -14
- package/src/service/coach/__stubs__/index.ts +0 -46
- package/src/service/coach/coach.test.ts +0 -10
- package/src/service/coach/coach.ts +0 -30
- package/src/service/coach/formation.test.ts +0 -10
- package/src/service/coach/formation.ts +0 -160
- package/src/service/coach/index.ts +0 -2
- package/src/service/country/__stubs__/index.ts +0 -13
- package/src/service/country/country.test.ts +0 -10
- package/src/service/country/country.ts +0 -23
- package/src/service/country/index.ts +0 -1
- package/src/service/event/__stubs__/index.ts +0 -25
- package/src/service/event/block.test.ts +0 -100
- package/src/service/event/block.ts +0 -69
- package/src/service/event/in-play-event.ts +0 -37
- package/src/service/event/libero-replacement.test.ts +0 -37
- package/src/service/event/libero-replacement.ts +0 -25
- package/src/service/event/rally-event.ts +0 -33
- package/src/service/event/reception.test.ts +0 -50
- package/src/service/event/reception.ts +0 -38
- package/src/service/event/score.test.ts +0 -29
- package/src/service/event/score.ts +0 -22
- package/src/service/event/serve.test.ts +0 -50
- package/src/service/event/serve.ts +0 -39
- package/src/service/event/set.test.ts +0 -50
- package/src/service/event/set.ts +0 -38
- package/src/service/event/spike.test.ts +0 -64
- package/src/service/event/spike.ts +0 -46
- package/src/service/event/substitution.ts +0 -16
- package/src/service/index.ts +0 -17
- package/src/service/league/index.ts +0 -3
- package/src/service/league/league.ts +0 -112
- package/src/service/league/season.ts +0 -41
- package/src/service/league/standing.ts +0 -82
- package/src/service/main.ts +0 -52
- package/src/service/match/__stubs__/index.ts +0 -119
- package/src/service/match/court-position.test.ts +0 -73
- package/src/service/match/court-position.ts +0 -46
- package/src/service/match/court-target.test.ts +0 -39
- package/src/service/match/court-target.ts +0 -30
- package/src/service/match/index.ts +0 -6
- package/src/service/match/match-set.test.ts +0 -174
- package/src/service/match/match-set.ts +0 -140
- package/src/service/match/match-team.test.ts +0 -16
- package/src/service/match/match-team.ts +0 -13
- package/src/service/match/match.test.ts +0 -80
- package/src/service/match/match.ts +0 -63
- package/src/service/match/rally.test.ts +0 -94
- package/src/service/match/rally.ts +0 -79
- package/src/service/player/__stubs__/index.ts +0 -1433
- package/src/service/player/index.ts +0 -5
- package/src/service/player/performance-stats.test.ts +0 -24
- package/src/service/player/performance-stats.ts +0 -47
- package/src/service/player/player.test.ts +0 -51
- package/src/service/player/player.ts +0 -101
- package/src/service/player/role.test.ts +0 -29
- package/src/service/player/role.ts +0 -33
- package/src/service/player/stats.test.ts +0 -23
- package/src/service/player/stats.ts +0 -29
- package/src/service/player/trait.test.ts +0 -10
- package/src/service/player/trait.ts +0 -124
- package/src/service/team/__stubs__/index.ts +0 -290
- package/src/service/team/index.ts +0 -1
- package/src/service/team/team.test.ts +0 -30
- package/src/service/team/team.ts +0 -45
- package/src/service/utils/enum-utils.test.ts +0 -10
- package/src/service/utils/enum-utils.ts +0 -6
- package/src/service/utils/index.ts +0 -4
- package/src/service/utils/object-utils.ts +0 -1
- package/src/service/utils/rng-utils.test.ts +0 -32
- package/src/service/utils/rng-utils.ts +0 -41
- package/src/service/utils/string-utils.test.ts +0 -28
- package/src/service/utils/string-utils.ts +0 -13
- package/src/service/utils/testing-utils.ts +0 -2
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { Role } from '../player'
|
|
2
|
-
import { CourtPosition } from '../match'
|
|
3
|
-
|
|
4
|
-
interface FormationOpts {
|
|
5
|
-
readonly name: string
|
|
6
|
-
readonly initialRotation: PositionRole
|
|
7
|
-
readonly base: PositionRole
|
|
8
|
-
readonly draftingPriorities: Role[][]
|
|
9
|
-
readonly liberoSubPriority: SubPriority
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface PositionRole {
|
|
13
|
-
readonly [CourtPosition.LEFT_FRONT]: Role[]
|
|
14
|
-
readonly [CourtPosition.MIDDLE_FRONT]: Role[]
|
|
15
|
-
readonly [CourtPosition.RIGHT_FRONT]: Role[]
|
|
16
|
-
readonly [CourtPosition.LEFT_BACK]: Role[]
|
|
17
|
-
readonly [CourtPosition.MIDDLE_BACK]: Role[]
|
|
18
|
-
readonly [CourtPosition.RIGHT_BACK]: Role[]
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface SubPriority {
|
|
22
|
-
readonly [Role.MIDDLE_BLOCKER]: number
|
|
23
|
-
readonly [Role.LIBERO]: number
|
|
24
|
-
readonly [Role.DEFENSIVE_SPECIALIST]: number
|
|
25
|
-
readonly [Role.OUTSIDE_HITTER]: number
|
|
26
|
-
readonly [Role.OPPOSITE_HITTER]: number
|
|
27
|
-
readonly [Role.SETTER]: number
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export class Formation {
|
|
31
|
-
static readonly '5-1': Formation = new Formation({
|
|
32
|
-
name: '5-1',
|
|
33
|
-
initialRotation: {
|
|
34
|
-
1: [Role.SETTER],
|
|
35
|
-
2: [Role.OUTSIDE_HITTER],
|
|
36
|
-
3: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
37
|
-
4: [Role.OPPOSITE_HITTER],
|
|
38
|
-
5: [Role.OUTSIDE_HITTER],
|
|
39
|
-
6: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST]
|
|
40
|
-
},
|
|
41
|
-
base: {
|
|
42
|
-
1: [Role.OPPOSITE_HITTER, Role.SETTER],
|
|
43
|
-
2: [Role.OPPOSITE_HITTER],
|
|
44
|
-
3: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
45
|
-
4: [Role.OUTSIDE_HITTER],
|
|
46
|
-
5: [Role.OUTSIDE_HITTER],
|
|
47
|
-
6: [Role.LIBERO, Role.DEFENSIVE_SPECIALIST]
|
|
48
|
-
},
|
|
49
|
-
draftingPriorities: [
|
|
50
|
-
[Role.SETTER, Role.OPPOSITE_HITTER],
|
|
51
|
-
[Role.OPPOSITE_HITTER],
|
|
52
|
-
[Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
53
|
-
[Role.MIDDLE_BLOCKER],
|
|
54
|
-
[Role.OUTSIDE_HITTER],
|
|
55
|
-
[Role.OUTSIDE_HITTER],
|
|
56
|
-
[Role.LIBERO]
|
|
57
|
-
],
|
|
58
|
-
liberoSubPriority: {
|
|
59
|
-
'Middle Blocker': 1,
|
|
60
|
-
'Outside Hitter': 10,
|
|
61
|
-
'Opposite Hitter': 100,
|
|
62
|
-
'Defensive Specialist': 1000,
|
|
63
|
-
Setter: 10000,
|
|
64
|
-
Libero: 100000
|
|
65
|
-
}
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
static readonly '4-2': Formation = new Formation({
|
|
69
|
-
name: '4-2',
|
|
70
|
-
initialRotation: {
|
|
71
|
-
1: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
72
|
-
2: [Role.SETTER],
|
|
73
|
-
3: [Role.OUTSIDE_HITTER],
|
|
74
|
-
4: [Role.MIDDLE_BLOCKER],
|
|
75
|
-
5: [Role.SETTER],
|
|
76
|
-
6: [Role.OPPOSITE_HITTER]
|
|
77
|
-
},
|
|
78
|
-
base: {
|
|
79
|
-
1: [Role.SETTER],
|
|
80
|
-
2: [Role.OPPOSITE_HITTER, Role.SETTER],
|
|
81
|
-
3: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
82
|
-
4: [Role.OUTSIDE_HITTER],
|
|
83
|
-
5: [Role.OUTSIDE_HITTER],
|
|
84
|
-
6: [Role.LIBERO, Role.DEFENSIVE_SPECIALIST]
|
|
85
|
-
},
|
|
86
|
-
draftingPriorities: [
|
|
87
|
-
[Role.SETTER, Role.OPPOSITE_HITTER],
|
|
88
|
-
[Role.SETTER],
|
|
89
|
-
[Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
90
|
-
[Role.MIDDLE_BLOCKER],
|
|
91
|
-
[Role.OUTSIDE_HITTER],
|
|
92
|
-
[Role.OUTSIDE_HITTER],
|
|
93
|
-
[Role.LIBERO]
|
|
94
|
-
],
|
|
95
|
-
liberoSubPriority: {
|
|
96
|
-
'Middle Blocker': 1,
|
|
97
|
-
'Outside Hitter': 10,
|
|
98
|
-
'Opposite Hitter': 100,
|
|
99
|
-
'Defensive Specialist': 1000,
|
|
100
|
-
Setter: 10000,
|
|
101
|
-
Libero: 100000
|
|
102
|
-
}
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
static readonly '6-2': Formation = new Formation({
|
|
106
|
-
name: '6-2',
|
|
107
|
-
initialRotation: {
|
|
108
|
-
1: [Role.OPPOSITE_HITTER, Role.SETTER],
|
|
109
|
-
2: [Role.OUTSIDE_HITTER],
|
|
110
|
-
3: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
111
|
-
4: [Role.OPPOSITE_HITTER, Role.SETTER],
|
|
112
|
-
5: [Role.OUTSIDE_HITTER],
|
|
113
|
-
6: [Role.MIDDLE_BLOCKER]
|
|
114
|
-
},
|
|
115
|
-
base: {
|
|
116
|
-
1: [Role.SETTER],
|
|
117
|
-
2: [Role.OPPOSITE_HITTER, Role.SETTER],
|
|
118
|
-
3: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
119
|
-
4: [Role.OUTSIDE_HITTER],
|
|
120
|
-
5: [Role.OUTSIDE_HITTER],
|
|
121
|
-
6: [Role.LIBERO, Role.DEFENSIVE_SPECIALIST]
|
|
122
|
-
},
|
|
123
|
-
draftingPriorities: [
|
|
124
|
-
[Role.SETTER, Role.OPPOSITE_HITTER],
|
|
125
|
-
[Role.OPPOSITE_HITTER, Role.SETTER],
|
|
126
|
-
[Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
|
|
127
|
-
[Role.DEFENSIVE_SPECIALIST, Role.MIDDLE_BLOCKER],
|
|
128
|
-
[Role.OUTSIDE_HITTER],
|
|
129
|
-
[Role.OUTSIDE_HITTER],
|
|
130
|
-
[Role.LIBERO]
|
|
131
|
-
],
|
|
132
|
-
liberoSubPriority: {
|
|
133
|
-
'Middle Blocker': 1,
|
|
134
|
-
'Outside Hitter': 10,
|
|
135
|
-
'Opposite Hitter': 100,
|
|
136
|
-
'Defensive Specialist': 1000,
|
|
137
|
-
Setter: 10000,
|
|
138
|
-
Libero: 100000
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
readonly name: string
|
|
144
|
-
readonly initialRotation: PositionRole
|
|
145
|
-
readonly base: PositionRole
|
|
146
|
-
readonly draftingPriorities: Role[][]
|
|
147
|
-
readonly liberoSubPriority: SubPriority
|
|
148
|
-
|
|
149
|
-
private constructor ({ name, initialRotation, base, draftingPriorities, liberoSubPriority }: FormationOpts) {
|
|
150
|
-
this.name = name
|
|
151
|
-
this.initialRotation = initialRotation
|
|
152
|
-
this.base = base
|
|
153
|
-
this.draftingPriorities = draftingPriorities
|
|
154
|
-
this.liberoSubPriority = liberoSubPriority
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
public static getFormations (): Formation[] {
|
|
158
|
-
return [this['4-2'], this['5-1'], this['6-2']]
|
|
159
|
-
}
|
|
160
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { Country } from '../country'
|
|
2
|
-
|
|
3
|
-
export const countries: Country[] = [
|
|
4
|
-
new Country({ id: '53e01e62-fcc1-43fb-a38d-105cc7afb9ad', name: 'Republica de Zamunda', short: 'ZAM' }),
|
|
5
|
-
new Country({ id: 'acfef762-200a-40b8-b9a8-51bd1547ead9', name: 'Nocturna', short: 'NOC' }),
|
|
6
|
-
new Country({ id: '9e127575-e881-414e-b662-7a0f24caf227', name: 'Azura', short: 'AZU' }),
|
|
7
|
-
new Country({ id: '95eb288c-e01c-4593-8034-27c427e90823', name: 'Bantuland', short: 'BAN' })
|
|
8
|
-
]
|
|
9
|
-
export const country = new Country({
|
|
10
|
-
id: '622c36dc-f2d2-44b3-a744-667ea53218b7',
|
|
11
|
-
name: 'Argentina',
|
|
12
|
-
short: 'ARG'
|
|
13
|
-
})
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { country } from './__stubs__'
|
|
3
|
-
|
|
4
|
-
describe('Country Test Module', () => {
|
|
5
|
-
test('Should instantiate object properly', () => {
|
|
6
|
-
expect(country.id).toEqual('622c36dc-f2d2-44b3-a744-667ea53218b7')
|
|
7
|
-
expect(country.name).toEqual('Argentina')
|
|
8
|
-
expect(country.short).toEqual('ARG')
|
|
9
|
-
})
|
|
10
|
-
})
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export interface CountryOpts {
|
|
2
|
-
readonly id: string
|
|
3
|
-
readonly name: string
|
|
4
|
-
readonly short: string
|
|
5
|
-
readonly language?: string
|
|
6
|
-
readonly league?: string
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class Country {
|
|
10
|
-
readonly id: string
|
|
11
|
-
readonly name: string
|
|
12
|
-
readonly short: string
|
|
13
|
-
readonly language?: string
|
|
14
|
-
readonly league?: string
|
|
15
|
-
|
|
16
|
-
constructor ({ id, name, short, language, league }: CountryOpts) {
|
|
17
|
-
this.id = id
|
|
18
|
-
this.name = name
|
|
19
|
-
this.short = short
|
|
20
|
-
this.language = language
|
|
21
|
-
this.league = league
|
|
22
|
-
}
|
|
23
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './country'
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { Serve, ServeFailure, ServeType } from '../serve'
|
|
2
|
-
import { player } from '../../player/__stubs__'
|
|
3
|
-
import { CourtTarget } from '../../match'
|
|
4
|
-
import { EventType } from '../rally-event'
|
|
5
|
-
import { Score } from '../score'
|
|
6
|
-
import { team } from '../../team/__stubs__'
|
|
7
|
-
|
|
8
|
-
export const serve: Serve = new Serve({
|
|
9
|
-
score:50,
|
|
10
|
-
order:0,
|
|
11
|
-
id:'e92f4abb-66f4-4b6c-a602-258404d04484',
|
|
12
|
-
player: player,
|
|
13
|
-
target: CourtTarget.OPPONENT_RIGHT_BACK,
|
|
14
|
-
eventType: EventType.SERVE,
|
|
15
|
-
type: ServeType.JUMP_FLOAT,
|
|
16
|
-
failure: ServeFailure.NO_FAILURE,
|
|
17
|
-
modifier: 1
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
export const score: Score = new Score({
|
|
21
|
-
id:'e92f4abb-66f4-4b6c-a602-258404d04484',
|
|
22
|
-
order:0,
|
|
23
|
-
eventType: EventType.SCORE,
|
|
24
|
-
player,
|
|
25
|
-
team })
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { Block, BlockFailure, BlockType } from './block'
|
|
3
|
-
import { player } from '../player/__stubs__'
|
|
4
|
-
import { CourtTarget } from '../match'
|
|
5
|
-
import { EventType } from './rally-event'
|
|
6
|
-
import { v4 as uuidv4 } from 'uuid'
|
|
7
|
-
|
|
8
|
-
describe('Block Test Module', () => {
|
|
9
|
-
let none: Block
|
|
10
|
-
let block: Block
|
|
11
|
-
let double: Block
|
|
12
|
-
let triple: Block
|
|
13
|
-
let failed: Block
|
|
14
|
-
|
|
15
|
-
beforeEach(() => {
|
|
16
|
-
none = new Block({
|
|
17
|
-
id: uuidv4(),
|
|
18
|
-
order: 1,
|
|
19
|
-
player: player,
|
|
20
|
-
target: CourtTarget.OPPONENT_RIGHT_BACK,
|
|
21
|
-
failure: BlockFailure.NO_FAILURE,
|
|
22
|
-
type: BlockType.NO_BLOCKER,
|
|
23
|
-
eventType: EventType.BLOCK,
|
|
24
|
-
modifier: 1,
|
|
25
|
-
blockers: [],
|
|
26
|
-
score: Block.getScore([], 1)
|
|
27
|
-
})
|
|
28
|
-
block = new Block({
|
|
29
|
-
id: uuidv4(),
|
|
30
|
-
order: 1,
|
|
31
|
-
player: player,
|
|
32
|
-
target: CourtTarget.OPPONENT_RIGHT_BACK,
|
|
33
|
-
failure: BlockFailure.NO_FAILURE,
|
|
34
|
-
type: BlockType.SINGLE,
|
|
35
|
-
eventType: EventType.BLOCK,
|
|
36
|
-
modifier: 1,
|
|
37
|
-
blockers: [player],
|
|
38
|
-
score: Block.getScore([player], 1)
|
|
39
|
-
})
|
|
40
|
-
double = new Block({
|
|
41
|
-
id: uuidv4(),
|
|
42
|
-
order: 1,
|
|
43
|
-
player: player,
|
|
44
|
-
target: CourtTarget.OPPONENT_RIGHT_BACK,
|
|
45
|
-
failure: BlockFailure.NO_FAILURE,
|
|
46
|
-
type: BlockType.DOUBLE,
|
|
47
|
-
eventType: EventType.BLOCK,
|
|
48
|
-
modifier: 1,
|
|
49
|
-
blockers: [player, player],
|
|
50
|
-
score: Block.getScore([player, player], 1)
|
|
51
|
-
})
|
|
52
|
-
triple = new Block({
|
|
53
|
-
id: uuidv4(),
|
|
54
|
-
order: 1,
|
|
55
|
-
player: player,
|
|
56
|
-
target: CourtTarget.OPPONENT_RIGHT_BACK,
|
|
57
|
-
failure: BlockFailure.NO_FAILURE,
|
|
58
|
-
type: BlockType.TRIPLE,
|
|
59
|
-
eventType: EventType.BLOCK,
|
|
60
|
-
modifier: 1,
|
|
61
|
-
blockers: [player, player, player],
|
|
62
|
-
score: Block.getScore([player, player, player], 1)
|
|
63
|
-
})
|
|
64
|
-
failed = new Block({
|
|
65
|
-
id: uuidv4(),
|
|
66
|
-
order: 1,
|
|
67
|
-
player: player,
|
|
68
|
-
target: CourtTarget.NO_TARGET,
|
|
69
|
-
failure: BlockFailure.FAULT,
|
|
70
|
-
type: BlockType.TRIPLE,
|
|
71
|
-
eventType: EventType.BLOCK,
|
|
72
|
-
modifier: 1,
|
|
73
|
-
blockers: [player],
|
|
74
|
-
score: Block.getScore([player], 1)
|
|
75
|
-
})
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
test('Should instantiate object properly', () => {
|
|
79
|
-
expect(block.target).toBe(CourtTarget.OPPONENT_RIGHT_BACK)
|
|
80
|
-
expect(block.type).toBe(BlockType.SINGLE)
|
|
81
|
-
expect(block.eventType).toBe(EventType.BLOCK)
|
|
82
|
-
expect(block.player.id).toBe(player.id)
|
|
83
|
-
expect(block.failure).toBe(BlockFailure.NO_FAILURE)
|
|
84
|
-
expect(failed.failure).toBe(BlockFailure.FAULT)
|
|
85
|
-
expect(block.modifier).toBe(1)
|
|
86
|
-
})
|
|
87
|
-
// getScore Tests
|
|
88
|
-
test('Should get the correct score for all Block types', () => {
|
|
89
|
-
expect(none.score).toBe(0)
|
|
90
|
-
expect(block.score).toBe(7)
|
|
91
|
-
expect(double.score).toBe(8.4)
|
|
92
|
-
expect(triple.score).toBe(9.799999999999999)
|
|
93
|
-
expect(failed.score).toBe(7)
|
|
94
|
-
})
|
|
95
|
-
test('Should throw Error when getting score with invalid amount of blockers', () => {
|
|
96
|
-
function score (): void { Block.getScore([player, player, player, player, player], 1) }
|
|
97
|
-
|
|
98
|
-
expect(score).toThrow(/^UNKNOWN_TYPE$/)
|
|
99
|
-
})
|
|
100
|
-
})
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { InPlayEvent, InPlayEventOpts } from './in-play-event'
|
|
2
|
-
import { Player } from '../player'
|
|
3
|
-
|
|
4
|
-
export enum BlockFailure {
|
|
5
|
-
NO_FAILURE = 0,
|
|
6
|
-
FAULT = 1,
|
|
7
|
-
MISS = 2,
|
|
8
|
-
OUT_OF_BOUNDS = 3,
|
|
9
|
-
WIPE = 4,
|
|
10
|
-
TOOL = 5
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export enum BlockType {
|
|
14
|
-
NO_BLOCKER = 0,
|
|
15
|
-
SINGLE = 1,
|
|
16
|
-
DOUBLE = 2,
|
|
17
|
-
TRIPLE = 3
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
interface BlockOpts extends InPlayEventOpts {
|
|
21
|
-
readonly type: BlockType
|
|
22
|
-
readonly failure: BlockFailure
|
|
23
|
-
readonly blockers: Player[]
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class Block extends InPlayEvent {
|
|
27
|
-
readonly failure: BlockFailure
|
|
28
|
-
readonly type: BlockType
|
|
29
|
-
readonly blockers: Player[]
|
|
30
|
-
|
|
31
|
-
constructor ({ id, order, score, player, target, failure, type, modifier, eventType, blockers }: BlockOpts) {
|
|
32
|
-
super({ id, order, score, player, target, modifier, eventType })
|
|
33
|
-
|
|
34
|
-
this.type = type
|
|
35
|
-
this.failure = failure
|
|
36
|
-
this.blockers = blockers
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
static getScore (blockers: Player[], modifier: number): number {
|
|
40
|
-
const type: BlockType = blockers.length
|
|
41
|
-
|
|
42
|
-
if (blockers.length > 3) throw new Error('UNKNOWN_TYPE')
|
|
43
|
-
|
|
44
|
-
let bmod: number
|
|
45
|
-
|
|
46
|
-
switch (type) {
|
|
47
|
-
case BlockType.NO_BLOCKER:
|
|
48
|
-
return 0
|
|
49
|
-
case BlockType.SINGLE:
|
|
50
|
-
bmod = 1
|
|
51
|
-
break
|
|
52
|
-
case BlockType.DOUBLE:
|
|
53
|
-
bmod = 1.2
|
|
54
|
-
break
|
|
55
|
-
case BlockType.TRIPLE:
|
|
56
|
-
bmod = 1.4
|
|
57
|
-
break
|
|
58
|
-
default:
|
|
59
|
-
throw new Error('UNKNOWN_TYPE')
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
const total: number = blockers.reduce((score, player) => {
|
|
63
|
-
return score + Block.calculateScore(player.stats, 'BLOCK', BlockType[type])
|
|
64
|
-
}, 0)
|
|
65
|
-
const avg: number = total / blockers.length
|
|
66
|
-
|
|
67
|
-
return avg * bmod * modifier
|
|
68
|
-
}
|
|
69
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { RallyEvent, RallyEventOpts } from './rally-event'
|
|
2
|
-
import { CourtTarget } from '../match'
|
|
3
|
-
import { PerformanceStats } from '../player'
|
|
4
|
-
import formula from '../../../data/formula/event.formula.json'
|
|
5
|
-
import { getKeys } from '../utils'
|
|
6
|
-
|
|
7
|
-
export interface InPlayEventOpts extends RallyEventOpts {
|
|
8
|
-
readonly target: CourtTarget
|
|
9
|
-
readonly modifier: number
|
|
10
|
-
readonly score: number
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export abstract class InPlayEvent extends RallyEvent {
|
|
14
|
-
abstract failure: number
|
|
15
|
-
abstract type: number
|
|
16
|
-
readonly target: CourtTarget
|
|
17
|
-
readonly modifier: number
|
|
18
|
-
readonly score: number
|
|
19
|
-
|
|
20
|
-
protected constructor (opts: InPlayEventOpts) {
|
|
21
|
-
super(opts)
|
|
22
|
-
|
|
23
|
-
this.target = opts.target
|
|
24
|
-
this.score = opts.score
|
|
25
|
-
this.modifier = opts.modifier
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
protected static calculateScore (stats: PerformanceStats, eventType: string, type: string): number {
|
|
29
|
-
const weight = (formula as any)[eventType][type]
|
|
30
|
-
const penalty: number = weight.penalty ?? 0
|
|
31
|
-
const score: number = getKeys(weight).reduce((score: number, key) => {
|
|
32
|
-
return score + (key === 'penalty' ? 0 : (stats as any)[key] * weight[key])
|
|
33
|
-
}, 0) as number
|
|
34
|
-
|
|
35
|
-
return Math.round(score * (1 - penalty))
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { EventType } from './rally-event'
|
|
3
|
-
import { players } from '../player/__stubs__'
|
|
4
|
-
import { LiberoReplacement, LiberoReplacementType } from './libero-replacement'
|
|
5
|
-
import { v4 as uuidv4 } from 'uuid'
|
|
6
|
-
|
|
7
|
-
describe('LiberoReplacement Test Module', () => {
|
|
8
|
-
let _in: LiberoReplacement
|
|
9
|
-
let _out: LiberoReplacement
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
_in = new LiberoReplacement({
|
|
13
|
-
id: uuidv4(),
|
|
14
|
-
order: 1,
|
|
15
|
-
player: players[0],
|
|
16
|
-
libero: players[1],
|
|
17
|
-
type: LiberoReplacementType.LIBERO_IN,
|
|
18
|
-
eventType: EventType.LIBERO_REPLACEMENT
|
|
19
|
-
})
|
|
20
|
-
_out = new LiberoReplacement({
|
|
21
|
-
id: uuidv4(),
|
|
22
|
-
order: 1,
|
|
23
|
-
player: players[0],
|
|
24
|
-
libero: players[1],
|
|
25
|
-
type: LiberoReplacementType.LIBERO_OUT,
|
|
26
|
-
eventType: EventType.LIBERO_REPLACEMENT
|
|
27
|
-
})
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
test('Should instantiate object properly', () => {
|
|
31
|
-
expect(_in.libero.id).toBe('e92f4abb-66f4-4b6c-a602-258404d04484')
|
|
32
|
-
expect(_in.player.id).toBe('622c36dc-f2d2-44b3-a744-667ea53218b7')
|
|
33
|
-
expect(_in.type).toBe(LiberoReplacementType.LIBERO_IN)
|
|
34
|
-
expect(_out.type).toBe(LiberoReplacementType.LIBERO_OUT)
|
|
35
|
-
expect(_in.eventType).toBe(EventType.LIBERO_REPLACEMENT)
|
|
36
|
-
})
|
|
37
|
-
})
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { EventType, RallyEvent, RallyEventOpts } from './rally-event'
|
|
2
|
-
import { Player } from '../player'
|
|
3
|
-
|
|
4
|
-
export interface LiberoReplacementOpts extends RallyEventOpts {
|
|
5
|
-
readonly player: Player
|
|
6
|
-
readonly libero: Player
|
|
7
|
-
readonly type: LiberoReplacementType
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export enum LiberoReplacementType {
|
|
11
|
-
LIBERO_IN = 0,
|
|
12
|
-
LIBERO_OUT = 1
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export class LiberoReplacement extends RallyEvent {
|
|
16
|
-
readonly type: LiberoReplacementType
|
|
17
|
-
readonly libero: Player
|
|
18
|
-
|
|
19
|
-
constructor ({ id, order, player, type, libero }: LiberoReplacementOpts) {
|
|
20
|
-
super({ id, order, player, eventType: EventType.LIBERO_REPLACEMENT })
|
|
21
|
-
|
|
22
|
-
this.type = type
|
|
23
|
-
this.libero = libero
|
|
24
|
-
}
|
|
25
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Player } from '../player'
|
|
2
|
-
|
|
3
|
-
export enum EventType {
|
|
4
|
-
LIBERO_REPLACEMENT = 0,
|
|
5
|
-
SUBSTITUTION = 1,
|
|
6
|
-
SERVE = 2,
|
|
7
|
-
RECEPTION = 3,
|
|
8
|
-
SET = 4,
|
|
9
|
-
SPIKE = 5,
|
|
10
|
-
BLOCK = 6,
|
|
11
|
-
SCORE = 7
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface RallyEventOpts {
|
|
15
|
-
readonly id: string
|
|
16
|
-
readonly player: Player
|
|
17
|
-
readonly eventType: EventType
|
|
18
|
-
readonly order: number
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export abstract class RallyEvent {
|
|
22
|
-
readonly id: string
|
|
23
|
-
readonly order: number
|
|
24
|
-
readonly player: Player
|
|
25
|
-
readonly eventType: EventType
|
|
26
|
-
|
|
27
|
-
protected constructor ({ id, eventType, player, order }: RallyEventOpts) {
|
|
28
|
-
this.id = id
|
|
29
|
-
this.player = player
|
|
30
|
-
this.order = order
|
|
31
|
-
this.eventType = eventType
|
|
32
|
-
}
|
|
33
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { Reception, ReceptionFailure, ReceptionType } from './reception'
|
|
3
|
-
import { player } from '../player/__stubs__'
|
|
4
|
-
import { CourtTarget } from '../match'
|
|
5
|
-
import { EventType } from './rally-event'
|
|
6
|
-
|
|
7
|
-
describe('Reception Test Module', () => {
|
|
8
|
-
let reception: Reception
|
|
9
|
-
let failed: Reception
|
|
10
|
-
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
reception = new Reception({
|
|
13
|
-
score: 60,
|
|
14
|
-
id: '622c36dc-f2d2-44b3-a744-667ea53218b7',
|
|
15
|
-
order: 0,
|
|
16
|
-
player: player,
|
|
17
|
-
target: CourtTarget.OPPONENT_RIGHT_BACK,
|
|
18
|
-
failure: ReceptionFailure.NO_FAILURE,
|
|
19
|
-
type: ReceptionType.DIG,
|
|
20
|
-
eventType: EventType.RECEPTION,
|
|
21
|
-
modifier: 1
|
|
22
|
-
})
|
|
23
|
-
failed = new Reception({
|
|
24
|
-
score: 60,
|
|
25
|
-
id: '622c36dc-f2d2-44b3-a744-667ea53218b7',
|
|
26
|
-
order: 0,
|
|
27
|
-
player: player,
|
|
28
|
-
target: CourtTarget.NO_TARGET,
|
|
29
|
-
failure: ReceptionFailure.OUT_OF_BOUNDS,
|
|
30
|
-
type: ReceptionType.OTHER_BODY_PART,
|
|
31
|
-
eventType: EventType.RECEPTION,
|
|
32
|
-
modifier: 1
|
|
33
|
-
})
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
test('Should instantiate object properly', () => {
|
|
37
|
-
expect(reception.target).toBe(CourtTarget.OPPONENT_RIGHT_BACK)
|
|
38
|
-
expect(reception.type).toBe(ReceptionType.DIG)
|
|
39
|
-
expect(reception.eventType).toBe(EventType.RECEPTION)
|
|
40
|
-
expect(reception.player.id).toBe(player.id)
|
|
41
|
-
expect(reception.failure).toBe(ReceptionFailure.NO_FAILURE)
|
|
42
|
-
expect(failed.failure).toBe(ReceptionFailure.OUT_OF_BOUNDS)
|
|
43
|
-
expect(reception.modifier).toBe(1)
|
|
44
|
-
})
|
|
45
|
-
// getScore Tests
|
|
46
|
-
test('Should get the correct score for all Reception types', () => {
|
|
47
|
-
expect(Reception.getScore(reception.player.stats, reception.type, 1)).toBe(4)
|
|
48
|
-
expect(Reception.getScore(failed.player.stats, failed.type, 1)).toBe(3)
|
|
49
|
-
})
|
|
50
|
-
})
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { PerformanceStats } from '../player'
|
|
2
|
-
import { InPlayEvent, InPlayEventOpts } from './in-play-event'
|
|
3
|
-
|
|
4
|
-
export enum ReceptionType {
|
|
5
|
-
DIG = 0,
|
|
6
|
-
OVERHAND = 1,
|
|
7
|
-
ONE_HAND = 2,
|
|
8
|
-
OTHER_BODY_PART = 3
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export enum ReceptionFailure {
|
|
12
|
-
NO_FAILURE = 0,
|
|
13
|
-
FAULT = 1,
|
|
14
|
-
MISS = 2,
|
|
15
|
-
OUT_OF_BOUNDS = 3,
|
|
16
|
-
BAD_PASS = 4
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface ReceptionOpts extends InPlayEventOpts {
|
|
20
|
-
readonly type: ReceptionType
|
|
21
|
-
readonly failure: ReceptionFailure
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class Reception extends InPlayEvent {
|
|
25
|
-
readonly failure: ReceptionFailure
|
|
26
|
-
readonly type: ReceptionType
|
|
27
|
-
|
|
28
|
-
constructor ({ id, order, score, player, target, failure, type, eventType, modifier }: ReceptionOpts) {
|
|
29
|
-
super({ id, order, score, player, target, eventType, modifier })
|
|
30
|
-
|
|
31
|
-
this.type = type
|
|
32
|
-
this.failure = failure
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
static getScore (stats: PerformanceStats, type: ReceptionType, modifier: number): number {
|
|
36
|
-
return Reception.calculateScore(stats, 'RECEPTION', ReceptionType[type]) * modifier
|
|
37
|
-
}
|
|
38
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { beforeEach, describe, expect, test } from '@jest/globals'
|
|
2
|
-
import { Score } from './score'
|
|
3
|
-
import { player } from '../player/__stubs__'
|
|
4
|
-
import { team } from '../team/__stubs__'
|
|
5
|
-
import { EventType } from './rally-event'
|
|
6
|
-
|
|
7
|
-
describe('Score Test Module', () => {
|
|
8
|
-
let score: Score
|
|
9
|
-
|
|
10
|
-
beforeEach(() => {
|
|
11
|
-
score = new Score({
|
|
12
|
-
id: '622c36dc-f2d2-44b3-a744-667ea53218b7',
|
|
13
|
-
order: 0,
|
|
14
|
-
eventType: EventType.SCORE,
|
|
15
|
-
player: player,
|
|
16
|
-
team
|
|
17
|
-
})
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
test('Should instantiate object properly', () => {
|
|
21
|
-
expect(score.eventType).toBe(EventType.SCORE)
|
|
22
|
-
expect(score.player.id).toBe('e92f4abb-66f4-4b6c-a602-258404d04484')
|
|
23
|
-
expect(score.team.id).toBe('426b5b9b-5be7-4963-92eb-71b7a3b29ffd')
|
|
24
|
-
})
|
|
25
|
-
// printEvent Test
|
|
26
|
-
test('Should print event properly', () => {
|
|
27
|
-
expect(score.printEvent()).toBe('event: SCORE, team: Yodo [YOD]')
|
|
28
|
-
})
|
|
29
|
-
})
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { RallyEvent, RallyEventOpts } from './rally-event'
|
|
2
|
-
import { Team } from '../team'
|
|
3
|
-
import { Player } from '../player'
|
|
4
|
-
|
|
5
|
-
interface ScoreOpts extends RallyEventOpts {
|
|
6
|
-
player: Player
|
|
7
|
-
team: Team
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export class Score extends RallyEvent {
|
|
11
|
-
readonly team: Team
|
|
12
|
-
|
|
13
|
-
constructor ({ id, order, player, team, eventType }: ScoreOpts) {
|
|
14
|
-
super({ id, order, player, eventType })
|
|
15
|
-
|
|
16
|
-
this.team = team
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
printEvent (): string {
|
|
20
|
-
return `event: SCORE, team: ${this.team.name} [${this.team.shortName}]`
|
|
21
|
-
}
|
|
22
|
-
}
|