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.
Files changed (132) hide show
  1. package/package.json +5 -5
  2. package/src/data/index.ts +0 -2
  3. package/src/data/models/block.ts +0 -159
  4. package/src/data/models/coach.ts +0 -94
  5. package/src/data/models/country.ts +0 -105
  6. package/src/data/models/event.ts +0 -83
  7. package/src/data/models/index.ts +0 -22
  8. package/src/data/models/league.ts +0 -90
  9. package/src/data/models/libero-replacement.ts +0 -104
  10. package/src/data/models/match-set-stats.ts +0 -204
  11. package/src/data/models/match-set.ts +0 -152
  12. package/src/data/models/match.ts +0 -106
  13. package/src/data/models/performance-stats.ts +0 -136
  14. package/src/data/models/player.ts +0 -370
  15. package/src/data/models/rally-position.ts +0 -79
  16. package/src/data/models/rally.ts +0 -229
  17. package/src/data/models/reception.ts +0 -113
  18. package/src/data/models/score.ts +0 -99
  19. package/src/data/models/season-teams.ts +0 -67
  20. package/src/data/models/season.ts +0 -103
  21. package/src/data/models/serve.ts +0 -113
  22. package/src/data/models/set.ts +0 -113
  23. package/src/data/models/spike.ts +0 -113
  24. package/src/data/models/substitution.ts +0 -98
  25. package/src/data/models/team.ts +0 -193
  26. package/src/data/transformers/block.ts +0 -117
  27. package/src/data/transformers/coach.ts +0 -33
  28. package/src/data/transformers/country.ts +0 -23
  29. package/src/data/transformers/court-position.ts +0 -43
  30. package/src/data/transformers/court-target.ts +0 -58
  31. package/src/data/transformers/event-type.ts +0 -35
  32. package/src/data/transformers/formation.ts +0 -16
  33. package/src/data/transformers/index.ts +0 -27
  34. package/src/data/transformers/league.ts +0 -26
  35. package/src/data/transformers/libero-replacement.ts +0 -62
  36. package/src/data/transformers/match-set-stats.ts +0 -101
  37. package/src/data/transformers/match-set.ts +0 -59
  38. package/src/data/transformers/match.ts +0 -48
  39. package/src/data/transformers/performance-stats.ts +0 -40
  40. package/src/data/transformers/player.ts +0 -109
  41. package/src/data/transformers/rally-position.ts +0 -24
  42. package/src/data/transformers/rally.ts +0 -139
  43. package/src/data/transformers/reception.ts +0 -98
  44. package/src/data/transformers/role.ts +0 -31
  45. package/src/data/transformers/score.ts +0 -43
  46. package/src/data/transformers/season.ts +0 -42
  47. package/src/data/transformers/serve.ts +0 -100
  48. package/src/data/transformers/set.ts +0 -98
  49. package/src/data/transformers/spike.ts +0 -102
  50. package/src/data/transformers/substitution.ts +0 -42
  51. package/src/data/transformers/team.ts +0 -45
  52. package/src/data/transformers/trait.ts +0 -37
  53. package/src/index.ts +0 -7
  54. package/src/routing/events.ts +0 -60
  55. package/src/routing/index.ts +0 -5
  56. package/src/routing/league.ts +0 -15
  57. package/src/routing/match.ts +0 -52
  58. package/src/routing/player.ts +0 -24
  59. package/src/routing/team.ts +0 -14
  60. package/src/service/coach/__stubs__/index.ts +0 -46
  61. package/src/service/coach/coach.test.ts +0 -10
  62. package/src/service/coach/coach.ts +0 -30
  63. package/src/service/coach/formation.test.ts +0 -10
  64. package/src/service/coach/formation.ts +0 -160
  65. package/src/service/coach/index.ts +0 -2
  66. package/src/service/country/__stubs__/index.ts +0 -13
  67. package/src/service/country/country.test.ts +0 -10
  68. package/src/service/country/country.ts +0 -23
  69. package/src/service/country/index.ts +0 -1
  70. package/src/service/event/__stubs__/index.ts +0 -25
  71. package/src/service/event/block.test.ts +0 -100
  72. package/src/service/event/block.ts +0 -69
  73. package/src/service/event/in-play-event.ts +0 -37
  74. package/src/service/event/libero-replacement.test.ts +0 -37
  75. package/src/service/event/libero-replacement.ts +0 -25
  76. package/src/service/event/rally-event.ts +0 -33
  77. package/src/service/event/reception.test.ts +0 -50
  78. package/src/service/event/reception.ts +0 -38
  79. package/src/service/event/score.test.ts +0 -29
  80. package/src/service/event/score.ts +0 -22
  81. package/src/service/event/serve.test.ts +0 -50
  82. package/src/service/event/serve.ts +0 -39
  83. package/src/service/event/set.test.ts +0 -50
  84. package/src/service/event/set.ts +0 -38
  85. package/src/service/event/spike.test.ts +0 -64
  86. package/src/service/event/spike.ts +0 -46
  87. package/src/service/event/substitution.ts +0 -16
  88. package/src/service/index.ts +0 -17
  89. package/src/service/league/index.ts +0 -3
  90. package/src/service/league/league.ts +0 -112
  91. package/src/service/league/season.ts +0 -41
  92. package/src/service/league/standing.ts +0 -82
  93. package/src/service/main.ts +0 -52
  94. package/src/service/match/__stubs__/index.ts +0 -119
  95. package/src/service/match/court-position.test.ts +0 -73
  96. package/src/service/match/court-position.ts +0 -46
  97. package/src/service/match/court-target.test.ts +0 -39
  98. package/src/service/match/court-target.ts +0 -30
  99. package/src/service/match/index.ts +0 -6
  100. package/src/service/match/match-set.test.ts +0 -174
  101. package/src/service/match/match-set.ts +0 -140
  102. package/src/service/match/match-team.test.ts +0 -16
  103. package/src/service/match/match-team.ts +0 -13
  104. package/src/service/match/match.test.ts +0 -80
  105. package/src/service/match/match.ts +0 -63
  106. package/src/service/match/rally.test.ts +0 -94
  107. package/src/service/match/rally.ts +0 -79
  108. package/src/service/player/__stubs__/index.ts +0 -1433
  109. package/src/service/player/index.ts +0 -5
  110. package/src/service/player/performance-stats.test.ts +0 -24
  111. package/src/service/player/performance-stats.ts +0 -47
  112. package/src/service/player/player.test.ts +0 -51
  113. package/src/service/player/player.ts +0 -101
  114. package/src/service/player/role.test.ts +0 -29
  115. package/src/service/player/role.ts +0 -33
  116. package/src/service/player/stats.test.ts +0 -23
  117. package/src/service/player/stats.ts +0 -29
  118. package/src/service/player/trait.test.ts +0 -10
  119. package/src/service/player/trait.ts +0 -124
  120. package/src/service/team/__stubs__/index.ts +0 -290
  121. package/src/service/team/index.ts +0 -1
  122. package/src/service/team/team.test.ts +0 -30
  123. package/src/service/team/team.ts +0 -45
  124. package/src/service/utils/enum-utils.test.ts +0 -10
  125. package/src/service/utils/enum-utils.ts +0 -6
  126. package/src/service/utils/index.ts +0 -4
  127. package/src/service/utils/object-utils.ts +0 -1
  128. package/src/service/utils/rng-utils.test.ts +0 -32
  129. package/src/service/utils/rng-utils.ts +0 -41
  130. package/src/service/utils/string-utils.test.ts +0 -28
  131. package/src/service/utils/string-utils.ts +0 -13
  132. 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,2 +0,0 @@
1
- export * from './coach'
2
- export * from './formation'
@@ -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
- }