volleyballsimtypes 0.0.77 → 0.0.79
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/cjs/src/data/models/event.d.ts +1 -3
- package/dist/cjs/src/data/models/event.js +0 -5
- package/dist/cjs/src/service/event/serve.d.ts +2 -2
- package/dist/cjs/src/service/event/serve.js +11 -2
- package/dist/cjs/src/service/event/serve.test.js +2 -2
- package/dist/cjs/src/service/player/trait.d.ts +1 -1
- package/dist/cjs/src/service/player/trait.js +2 -2
- package/dist/esm/src/data/models/event.d.ts +1 -3
- package/dist/esm/src/data/models/event.js +0 -5
- package/dist/esm/src/service/event/serve.d.ts +2 -2
- package/dist/esm/src/service/event/serve.js +11 -2
- package/dist/esm/src/service/event/serve.test.js +2 -2
- package/dist/esm/src/service/player/trait.d.ts +1 -1
- package/dist/esm/src/service/player/trait.js +2 -2
- package/package.json +1 -1
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import * as Sequelize from 'sequelize';
|
|
2
2
|
import { Model } from 'sequelize';
|
|
3
|
-
import { PlayerId, PlayerModel, RallyId, RallyModel
|
|
3
|
+
import { PlayerId, PlayerModel, RallyId, RallyModel } from '.';
|
|
4
4
|
export interface EventAttributes {
|
|
5
5
|
event_id: string;
|
|
6
6
|
rally_id: string;
|
|
7
7
|
event_type: EventType;
|
|
8
8
|
order: number;
|
|
9
9
|
player_id: string;
|
|
10
|
-
active_traits: TraitType[];
|
|
11
10
|
}
|
|
12
11
|
export type EventType = 'LIBERO_REPLACEMENT' | 'SUBSTITUTION' | 'SERVE' | 'RECEPTION' | 'SET' | 'SPIKE' | 'BLOCK' | 'SCORE';
|
|
13
12
|
export type CourtTarget = 'NO_TARGET' | 'OPPONENT_RIGHT_BACK' | 'OPPONENT_MIDDLE_BACK' | 'OPPONENT_LEFT_BACK' | 'OPPONENT_RIGHT_FRONT' | 'OPPONENT_MIDDLE_FRONT' | 'OPPONENT_LEFT_FRONT' | 'TEAM_LEFT_FRONT' | 'TEAM_MIDDLE_FRONT' | 'TEAM_RIGHT_FRONT' | 'TEAM_LEFT_BACK' | 'TEAM_MIDDLE_BACK' | 'TEAM_RIGHT_BACK';
|
|
@@ -20,7 +19,6 @@ export declare class EventModel extends Model<EventAttributes, EventCreationAttr
|
|
|
20
19
|
event_type: EventType;
|
|
21
20
|
order: number;
|
|
22
21
|
player_id: string;
|
|
23
|
-
active_traits: TraitType[];
|
|
24
22
|
player: PlayerModel;
|
|
25
23
|
getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
|
|
26
24
|
setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
|
|
@@ -33,11 +33,6 @@ class EventModel extends sequelize_1.Model {
|
|
|
33
33
|
model: 'Player',
|
|
34
34
|
key: 'player_id'
|
|
35
35
|
}
|
|
36
|
-
},
|
|
37
|
-
active_traits: {
|
|
38
|
-
type: sequelize_1.DataTypes.ARRAY(sequelize_1.DataTypes.ENUM('MARKSMAN', 'MOVING_WALL', 'MASTER_MIND', 'METEOR_SERVE', 'VIGOROUS', 'GUARDIAN')),
|
|
39
|
-
allowNull: false,
|
|
40
|
-
defaultValue: [[]]
|
|
41
36
|
}
|
|
42
37
|
}, {
|
|
43
38
|
sequelize,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InPlayEvent, InPlayEventOpts } from './in-play-event';
|
|
2
|
-
import { PerformanceStats } from '../player';
|
|
2
|
+
import { PerformanceStats, Trait } from '../player';
|
|
3
3
|
export declare enum ServeTypeEnum {
|
|
4
4
|
UNDERHAND = 0,
|
|
5
5
|
OVERHAND_TOPSPIN = 1,
|
|
@@ -22,6 +22,6 @@ export declare class Serve extends InPlayEvent {
|
|
|
22
22
|
readonly failure: ServeFailureEnum;
|
|
23
23
|
readonly type: ServeTypeEnum;
|
|
24
24
|
constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: ServeOpts);
|
|
25
|
-
static getScore(stats: PerformanceStats, type: ServeTypeEnum, modifier: number): number;
|
|
25
|
+
static getScore(stats: PerformanceStats, type: ServeTypeEnum, modifier: number, activeTraits: Trait[]): number;
|
|
26
26
|
}
|
|
27
27
|
export {};
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Serve = exports.ServeFailureEnum = exports.ServeTypeEnum = void 0;
|
|
4
4
|
const in_play_event_1 = require("./in-play-event");
|
|
5
|
+
const player_1 = require("../player");
|
|
5
6
|
var ServeTypeEnum;
|
|
6
7
|
(function (ServeTypeEnum) {
|
|
7
8
|
ServeTypeEnum[ServeTypeEnum["UNDERHAND"] = 0] = "UNDERHAND";
|
|
@@ -24,8 +25,16 @@ class Serve extends in_play_event_1.InPlayEvent {
|
|
|
24
25
|
this.type = type;
|
|
25
26
|
this.failure = failure;
|
|
26
27
|
}
|
|
27
|
-
static getScore(stats, type, modifier) {
|
|
28
|
-
|
|
28
|
+
static getScore(stats, type, modifier, activeTraits) {
|
|
29
|
+
let score = Serve.calculateScore(stats, 'SERVE', ServeTypeEnum[type]) * modifier;
|
|
30
|
+
for (const trait of activeTraits) {
|
|
31
|
+
switch (true) {
|
|
32
|
+
case trait === player_1.Trait.METEOR_SERVE: {
|
|
33
|
+
score *= player_1.Trait.METEOR_SERVE.modifier;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return score;
|
|
29
38
|
}
|
|
30
39
|
}
|
|
31
40
|
exports.Serve = Serve;
|
|
@@ -45,7 +45,7 @@ const rally_event_1 = require("./rally-event");
|
|
|
45
45
|
});
|
|
46
46
|
// getScore Tests
|
|
47
47
|
(0, globals_1.test)('Should get the correct score for all Serve types', () => {
|
|
48
|
-
(0, globals_1.expect)(serve_1.Serve.getScore(serve.player.stats, serve.type, 1)).toBe(6);
|
|
49
|
-
(0, globals_1.expect)(serve_1.Serve.getScore(failed.player.stats, failed.type, 1)).toBe(3);
|
|
48
|
+
(0, globals_1.expect)(serve_1.Serve.getScore(serve.player.stats, serve.type, 1, [])).toBe(6);
|
|
49
|
+
(0, globals_1.expect)(serve_1.Serve.getScore(failed.player.stats, failed.type, 1, [])).toBe(3);
|
|
50
50
|
});
|
|
51
51
|
});
|
|
@@ -17,5 +17,5 @@ export declare class Trait {
|
|
|
17
17
|
readonly weight: number;
|
|
18
18
|
private constructor();
|
|
19
19
|
static getTraits(): Trait[];
|
|
20
|
-
static
|
|
20
|
+
static assignTraits(roles: Role[], performanceStats: PerformanceStats): Trait[];
|
|
21
21
|
}
|
|
@@ -16,7 +16,7 @@ class Trait {
|
|
|
16
16
|
static getTraits() {
|
|
17
17
|
return [Trait.GUARDIAN, Trait.MARKSMAN, Trait.METEOR_SERVE, Trait.VIGOROUS, Trait.MOVING_WALL, Trait.MASTER_MIND];
|
|
18
18
|
}
|
|
19
|
-
static
|
|
19
|
+
static assignTraits(roles, performanceStats) {
|
|
20
20
|
const qualifiedTraits = this.getTraits().filter(trait => {
|
|
21
21
|
return (trait.roles.length < 1 || trait.roles.some(role => roles.includes(role))) &&
|
|
22
22
|
stats_1.GeneralStat.calculateScore(performanceStats, trait.stat) >= trait.statThreshold;
|
|
@@ -92,7 +92,7 @@ Trait.VIGOROUS = new Trait({
|
|
|
92
92
|
stat: stats_1.GeneralStat.PHYSICAL,
|
|
93
93
|
weight: 1
|
|
94
94
|
});
|
|
95
|
-
// Takes place of the receiver and increases reception score by 25
|
|
95
|
+
// Takes place of the receiver and increases reception score by 25%, guaranteeing success. Can only trigger in back-row.
|
|
96
96
|
Trait.GUARDIAN = new Trait({
|
|
97
97
|
name: 'Guardian',
|
|
98
98
|
roles: [role_1.Role.DEFENSIVE_SPECIALIST, role_1.Role.LIBERO],
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import * as Sequelize from 'sequelize';
|
|
2
2
|
import { Model } from 'sequelize';
|
|
3
|
-
import { PlayerId, PlayerModel, RallyId, RallyModel
|
|
3
|
+
import { PlayerId, PlayerModel, RallyId, RallyModel } from '.';
|
|
4
4
|
export interface EventAttributes {
|
|
5
5
|
event_id: string;
|
|
6
6
|
rally_id: string;
|
|
7
7
|
event_type: EventType;
|
|
8
8
|
order: number;
|
|
9
9
|
player_id: string;
|
|
10
|
-
active_traits: TraitType[];
|
|
11
10
|
}
|
|
12
11
|
export type EventType = 'LIBERO_REPLACEMENT' | 'SUBSTITUTION' | 'SERVE' | 'RECEPTION' | 'SET' | 'SPIKE' | 'BLOCK' | 'SCORE';
|
|
13
12
|
export type CourtTarget = 'NO_TARGET' | 'OPPONENT_RIGHT_BACK' | 'OPPONENT_MIDDLE_BACK' | 'OPPONENT_LEFT_BACK' | 'OPPONENT_RIGHT_FRONT' | 'OPPONENT_MIDDLE_FRONT' | 'OPPONENT_LEFT_FRONT' | 'TEAM_LEFT_FRONT' | 'TEAM_MIDDLE_FRONT' | 'TEAM_RIGHT_FRONT' | 'TEAM_LEFT_BACK' | 'TEAM_MIDDLE_BACK' | 'TEAM_RIGHT_BACK';
|
|
@@ -20,7 +19,6 @@ export declare class EventModel extends Model<EventAttributes, EventCreationAttr
|
|
|
20
19
|
event_type: EventType;
|
|
21
20
|
order: number;
|
|
22
21
|
player_id: string;
|
|
23
|
-
active_traits: TraitType[];
|
|
24
22
|
player: PlayerModel;
|
|
25
23
|
getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
|
|
26
24
|
setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
|
|
@@ -30,11 +30,6 @@ export class EventModel extends Model {
|
|
|
30
30
|
model: 'Player',
|
|
31
31
|
key: 'player_id'
|
|
32
32
|
}
|
|
33
|
-
},
|
|
34
|
-
active_traits: {
|
|
35
|
-
type: DataTypes.ARRAY(DataTypes.ENUM('MARKSMAN', 'MOVING_WALL', 'MASTER_MIND', 'METEOR_SERVE', 'VIGOROUS', 'GUARDIAN')),
|
|
36
|
-
allowNull: false,
|
|
37
|
-
defaultValue: [[]]
|
|
38
33
|
}
|
|
39
34
|
}, {
|
|
40
35
|
sequelize,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { InPlayEvent, InPlayEventOpts } from './in-play-event';
|
|
2
|
-
import { PerformanceStats } from '../player';
|
|
2
|
+
import { PerformanceStats, Trait } from '../player';
|
|
3
3
|
export declare enum ServeTypeEnum {
|
|
4
4
|
UNDERHAND = 0,
|
|
5
5
|
OVERHAND_TOPSPIN = 1,
|
|
@@ -22,6 +22,6 @@ export declare class Serve extends InPlayEvent {
|
|
|
22
22
|
readonly failure: ServeFailureEnum;
|
|
23
23
|
readonly type: ServeTypeEnum;
|
|
24
24
|
constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: ServeOpts);
|
|
25
|
-
static getScore(stats: PerformanceStats, type: ServeTypeEnum, modifier: number): number;
|
|
25
|
+
static getScore(stats: PerformanceStats, type: ServeTypeEnum, modifier: number, activeTraits: Trait[]): number;
|
|
26
26
|
}
|
|
27
27
|
export {};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { InPlayEvent } from './in-play-event';
|
|
2
|
+
import { Trait } from '../player';
|
|
2
3
|
export var ServeTypeEnum;
|
|
3
4
|
(function (ServeTypeEnum) {
|
|
4
5
|
ServeTypeEnum[ServeTypeEnum["UNDERHAND"] = 0] = "UNDERHAND";
|
|
@@ -21,7 +22,15 @@ export class Serve extends InPlayEvent {
|
|
|
21
22
|
this.type = type;
|
|
22
23
|
this.failure = failure;
|
|
23
24
|
}
|
|
24
|
-
static getScore(stats, type, modifier) {
|
|
25
|
-
|
|
25
|
+
static getScore(stats, type, modifier, activeTraits) {
|
|
26
|
+
let score = Serve.calculateScore(stats, 'SERVE', ServeTypeEnum[type]) * modifier;
|
|
27
|
+
for (const trait of activeTraits) {
|
|
28
|
+
switch (true) {
|
|
29
|
+
case trait === Trait.METEOR_SERVE: {
|
|
30
|
+
score *= Trait.METEOR_SERVE.modifier;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return score;
|
|
26
35
|
}
|
|
27
36
|
}
|
|
@@ -43,7 +43,7 @@ describe('Serve Test Module', () => {
|
|
|
43
43
|
});
|
|
44
44
|
// getScore Tests
|
|
45
45
|
test('Should get the correct score for all Serve types', () => {
|
|
46
|
-
expect(Serve.getScore(serve.player.stats, serve.type, 1)).toBe(6);
|
|
47
|
-
expect(Serve.getScore(failed.player.stats, failed.type, 1)).toBe(3);
|
|
46
|
+
expect(Serve.getScore(serve.player.stats, serve.type, 1, [])).toBe(6);
|
|
47
|
+
expect(Serve.getScore(failed.player.stats, failed.type, 1, [])).toBe(3);
|
|
48
48
|
});
|
|
49
49
|
});
|
|
@@ -17,5 +17,5 @@ export declare class Trait {
|
|
|
17
17
|
readonly weight: number;
|
|
18
18
|
private constructor();
|
|
19
19
|
static getTraits(): Trait[];
|
|
20
|
-
static
|
|
20
|
+
static assignTraits(roles: Role[], performanceStats: PerformanceStats): Trait[];
|
|
21
21
|
}
|
|
@@ -13,7 +13,7 @@ export class Trait {
|
|
|
13
13
|
static getTraits() {
|
|
14
14
|
return [Trait.GUARDIAN, Trait.MARKSMAN, Trait.METEOR_SERVE, Trait.VIGOROUS, Trait.MOVING_WALL, Trait.MASTER_MIND];
|
|
15
15
|
}
|
|
16
|
-
static
|
|
16
|
+
static assignTraits(roles, performanceStats) {
|
|
17
17
|
const qualifiedTraits = this.getTraits().filter(trait => {
|
|
18
18
|
return (trait.roles.length < 1 || trait.roles.some(role => roles.includes(role))) &&
|
|
19
19
|
GeneralStat.calculateScore(performanceStats, trait.stat) >= trait.statThreshold;
|
|
@@ -88,7 +88,7 @@ Trait.VIGOROUS = new Trait({
|
|
|
88
88
|
stat: GeneralStat.PHYSICAL,
|
|
89
89
|
weight: 1
|
|
90
90
|
});
|
|
91
|
-
// Takes place of the receiver and increases reception score by 25
|
|
91
|
+
// Takes place of the receiver and increases reception score by 25%, guaranteeing success. Can only trigger in back-row.
|
|
92
92
|
Trait.GUARDIAN = new Trait({
|
|
93
93
|
name: 'Guardian',
|
|
94
94
|
roles: [Role.DEFENSIVE_SPECIALIST, Role.LIBERO],
|