volleyballsimtypes 0.0.79 → 0.0.81

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 (31) hide show
  1. package/dist/cjs/src/service/event/block.d.ts +2 -2
  2. package/dist/cjs/src/service/event/block.js +12 -2
  3. package/dist/cjs/src/service/event/block.test.js +6 -6
  4. package/dist/cjs/src/service/event/reception.d.ts +2 -2
  5. package/dist/cjs/src/service/event/reception.js +12 -2
  6. package/dist/cjs/src/service/event/reception.test.js +2 -2
  7. package/dist/cjs/src/service/event/serve.js +1 -0
  8. package/dist/cjs/src/service/event/set.d.ts +2 -2
  9. package/dist/cjs/src/service/event/set.js +17 -2
  10. package/dist/cjs/src/service/event/set.test.js +2 -2
  11. package/dist/cjs/src/service/event/spike.d.ts +2 -2
  12. package/dist/cjs/src/service/event/spike.js +16 -2
  13. package/dist/cjs/src/service/event/spike.test.js +3 -3
  14. package/dist/cjs/src/service/player/role.js +1 -1
  15. package/dist/cjs/src/service/player/trait.js +7 -7
  16. package/dist/esm/src/service/event/block.d.ts +2 -2
  17. package/dist/esm/src/service/event/block.js +12 -2
  18. package/dist/esm/src/service/event/block.test.js +6 -6
  19. package/dist/esm/src/service/event/reception.d.ts +2 -2
  20. package/dist/esm/src/service/event/reception.js +12 -2
  21. package/dist/esm/src/service/event/reception.test.js +2 -2
  22. package/dist/esm/src/service/event/serve.js +1 -0
  23. package/dist/esm/src/service/event/set.d.ts +2 -2
  24. package/dist/esm/src/service/event/set.js +17 -2
  25. package/dist/esm/src/service/event/set.test.js +2 -2
  26. package/dist/esm/src/service/event/spike.d.ts +2 -2
  27. package/dist/esm/src/service/event/spike.js +16 -2
  28. package/dist/esm/src/service/event/spike.test.js +3 -3
  29. package/dist/esm/src/service/player/role.js +1 -1
  30. package/dist/esm/src/service/player/trait.js +7 -7
  31. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
2
- import { Player } from '../player';
2
+ import { Player, Trait } from '../player';
3
3
  export declare enum BlockFailureEnum {
4
4
  NO_FAILURE = 0,
5
5
  FAULT = 1,
@@ -24,6 +24,6 @@ export declare class Block extends InPlayEvent {
24
24
  readonly type: BlockTypeEnum;
25
25
  readonly blockers: Player[];
26
26
  constructor({ id, order, score, player, target, failure, type, modifier, eventType, blockers, activeTraits }: BlockOpts);
27
- static getScore(blockers: Player[], modifier: number): number;
27
+ static getScore(blockers: Player[], modifier: number, activeTraits: Trait[]): number;
28
28
  }
29
29
  export {};
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Block = exports.BlockTypeEnum = exports.BlockFailureEnum = void 0;
4
4
  const in_play_event_1 = require("./in-play-event");
5
+ const player_1 = require("../player");
5
6
  var BlockFailureEnum;
6
7
  (function (BlockFailureEnum) {
7
8
  BlockFailureEnum[BlockFailureEnum["NO_FAILURE"] = 0] = "NO_FAILURE";
@@ -25,7 +26,7 @@ class Block extends in_play_event_1.InPlayEvent {
25
26
  this.failure = failure;
26
27
  this.blockers = blockers;
27
28
  }
28
- static getScore(blockers, modifier) {
29
+ static getScore(blockers, modifier, activeTraits) {
29
30
  const type = blockers.length;
30
31
  if (blockers.length > 3)
31
32
  throw new Error('UNKNOWN_TYPE');
@@ -49,7 +50,16 @@ class Block extends in_play_event_1.InPlayEvent {
49
50
  return score + Block.calculateScore(player.stats, 'BLOCK', BlockTypeEnum[type]);
50
51
  }, 0);
51
52
  const avg = total / blockers.length;
52
- return avg * bmod * modifier;
53
+ let score = avg * bmod * modifier;
54
+ for (const trait of activeTraits) {
55
+ switch (true) {
56
+ case trait === player_1.Trait.MOVING_WALL: {
57
+ score *= player_1.Trait.MOVING_WALL.modifier;
58
+ break;
59
+ }
60
+ }
61
+ }
62
+ return score;
53
63
  }
54
64
  }
55
65
  exports.Block = Block;
@@ -23,7 +23,7 @@ const uuid_1 = require("uuid");
23
23
  eventType: rally_event_1.EventTypeEnum.BLOCK,
24
24
  modifier: 1,
25
25
  blockers: [],
26
- score: block_1.Block.getScore([], 1),
26
+ score: block_1.Block.getScore([], 1, []),
27
27
  activeTraits: []
28
28
  });
29
29
  block = new block_1.Block({
@@ -36,7 +36,7 @@ const uuid_1 = require("uuid");
36
36
  eventType: rally_event_1.EventTypeEnum.BLOCK,
37
37
  modifier: 1,
38
38
  blockers: [__stubs__1.player],
39
- score: block_1.Block.getScore([__stubs__1.player], 1),
39
+ score: block_1.Block.getScore([__stubs__1.player], 1, []),
40
40
  activeTraits: []
41
41
  });
42
42
  double = new block_1.Block({
@@ -49,7 +49,7 @@ const uuid_1 = require("uuid");
49
49
  eventType: rally_event_1.EventTypeEnum.BLOCK,
50
50
  modifier: 1,
51
51
  blockers: [__stubs__1.player, __stubs__1.player],
52
- score: block_1.Block.getScore([__stubs__1.player, __stubs__1.player], 1),
52
+ score: block_1.Block.getScore([__stubs__1.player, __stubs__1.player], 1, []),
53
53
  activeTraits: []
54
54
  });
55
55
  triple = new block_1.Block({
@@ -62,7 +62,7 @@ const uuid_1 = require("uuid");
62
62
  eventType: rally_event_1.EventTypeEnum.BLOCK,
63
63
  modifier: 1,
64
64
  blockers: [__stubs__1.player, __stubs__1.player, __stubs__1.player],
65
- score: block_1.Block.getScore([__stubs__1.player, __stubs__1.player, __stubs__1.player], 1),
65
+ score: block_1.Block.getScore([__stubs__1.player, __stubs__1.player, __stubs__1.player], 1, []),
66
66
  activeTraits: []
67
67
  });
68
68
  failed = new block_1.Block({
@@ -75,7 +75,7 @@ const uuid_1 = require("uuid");
75
75
  eventType: rally_event_1.EventTypeEnum.BLOCK,
76
76
  modifier: 1,
77
77
  blockers: [__stubs__1.player],
78
- score: block_1.Block.getScore([__stubs__1.player], 1),
78
+ score: block_1.Block.getScore([__stubs__1.player], 1, []),
79
79
  activeTraits: []
80
80
  });
81
81
  });
@@ -97,7 +97,7 @@ const uuid_1 = require("uuid");
97
97
  (0, globals_1.expect)(failed.score).toBe(7);
98
98
  });
99
99
  (0, globals_1.test)('Should throw Error when getting score with invalid amount of blockers', () => {
100
- function score() { block_1.Block.getScore([__stubs__1.player, __stubs__1.player, __stubs__1.player, __stubs__1.player, __stubs__1.player], 1); }
100
+ function score() { block_1.Block.getScore([__stubs__1.player, __stubs__1.player, __stubs__1.player, __stubs__1.player, __stubs__1.player], 1, []); }
101
101
  (0, globals_1.expect)(score).toThrow(/^UNKNOWN_TYPE$/);
102
102
  });
103
103
  });
@@ -1,4 +1,4 @@
1
- import { PerformanceStats } from '../player';
1
+ import { PerformanceStats, Trait } from '../player';
2
2
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
3
3
  export declare enum ReceptionTypeEnum {
4
4
  DIG = 0,
@@ -21,6 +21,6 @@ export declare class Reception extends InPlayEvent {
21
21
  readonly failure: ReceptionFailureEnum;
22
22
  readonly type: ReceptionTypeEnum;
23
23
  constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: ReceptionOpts);
24
- static getScore(stats: PerformanceStats, type: ReceptionTypeEnum, modifier: number): number;
24
+ static getScore(stats: PerformanceStats, type: ReceptionTypeEnum, modifier: number, activeTraits: Trait[]): number;
25
25
  }
26
26
  export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Reception = exports.ReceptionFailureEnum = exports.ReceptionTypeEnum = void 0;
4
+ const player_1 = require("../player");
4
5
  const in_play_event_1 = require("./in-play-event");
5
6
  var ReceptionTypeEnum;
6
7
  (function (ReceptionTypeEnum) {
@@ -23,8 +24,17 @@ class Reception extends in_play_event_1.InPlayEvent {
23
24
  this.type = type;
24
25
  this.failure = failure;
25
26
  }
26
- static getScore(stats, type, modifier) {
27
- return Reception.calculateScore(stats, 'RECEPTION', ReceptionTypeEnum[type]) * modifier;
27
+ static getScore(stats, type, modifier, activeTraits) {
28
+ let score = Reception.calculateScore(stats, 'RECEPTION', ReceptionTypeEnum[type]) * modifier;
29
+ for (const trait of activeTraits) {
30
+ switch (true) {
31
+ case trait === player_1.Trait.GUARDIAN: {
32
+ score *= player_1.Trait.GUARDIAN.modifier;
33
+ break;
34
+ }
35
+ }
36
+ }
37
+ return score;
28
38
  }
29
39
  }
30
40
  exports.Reception = Reception;
@@ -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 Reception types', () => {
48
- (0, globals_1.expect)(reception_1.Reception.getScore(reception.player.stats, reception.type, 1)).toBe(4);
49
- (0, globals_1.expect)(reception_1.Reception.getScore(failed.player.stats, failed.type, 1)).toBe(3);
48
+ (0, globals_1.expect)(reception_1.Reception.getScore(reception.player.stats, reception.type, 1, [])).toBe(4);
49
+ (0, globals_1.expect)(reception_1.Reception.getScore(failed.player.stats, failed.type, 1, [])).toBe(3);
50
50
  });
51
51
  });
@@ -31,6 +31,7 @@ class Serve extends in_play_event_1.InPlayEvent {
31
31
  switch (true) {
32
32
  case trait === player_1.Trait.METEOR_SERVE: {
33
33
  score *= player_1.Trait.METEOR_SERVE.modifier;
34
+ break;
34
35
  }
35
36
  }
36
37
  }
@@ -1,4 +1,4 @@
1
- import { PerformanceStats } from '../player';
1
+ import { PerformanceStats, Trait } from '../player';
2
2
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
3
3
  export declare enum SetTypeEnum {
4
4
  OVERHAND = 0,
@@ -21,6 +21,6 @@ export declare class Set extends InPlayEvent {
21
21
  readonly failure: SetFailureEnum;
22
22
  readonly type: SetTypeEnum;
23
23
  constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: SetOpts);
24
- static getScore(stats: PerformanceStats, type: SetTypeEnum, modifier: number): number;
24
+ static getScore(stats: PerformanceStats, type: SetTypeEnum, modifier: number, activeTraits: Trait[]): number;
25
25
  }
26
26
  export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Set = exports.SetFailureEnum = exports.SetTypeEnum = void 0;
4
+ const player_1 = require("../player");
4
5
  const in_play_event_1 = require("./in-play-event");
5
6
  var SetTypeEnum;
6
7
  (function (SetTypeEnum) {
@@ -23,8 +24,22 @@ class Set extends in_play_event_1.InPlayEvent {
23
24
  this.type = type;
24
25
  this.failure = failure;
25
26
  }
26
- static getScore(stats, type, modifier) {
27
- return Set.calculateScore(stats, 'SET', SetTypeEnum[type]) * modifier;
27
+ static getScore(stats, type, modifier, activeTraits) {
28
+ let score = Set.calculateScore(stats, 'SET', SetTypeEnum[type]) * modifier;
29
+ for (const trait of activeTraits) {
30
+ switch (true) {
31
+ case trait === player_1.Trait.MASTER_MIND: {
32
+ score *= player_1.Trait.MASTER_MIND.modifier;
33
+ break;
34
+ }
35
+ case trait === player_1.Trait.MARKSMAN: {
36
+ if ([SetTypeEnum.DUMP, SetTypeEnum.SPIKE].includes(type))
37
+ score *= player_1.Trait.MARKSMAN.modifier;
38
+ break;
39
+ }
40
+ }
41
+ }
42
+ return score;
28
43
  }
29
44
  }
30
45
  exports.Set = Set;
@@ -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 Set types', () => {
48
- (0, globals_1.expect)(set_1.Set.getScore(set.player.stats, set.type, 1)).toBe(3);
49
- (0, globals_1.expect)(set_1.Set.getScore(failed.player.stats, failed.type, 1)).toBe(6);
48
+ (0, globals_1.expect)(set_1.Set.getScore(set.player.stats, set.type, 1, [])).toBe(3);
49
+ (0, globals_1.expect)(set_1.Set.getScore(failed.player.stats, failed.type, 1, [])).toBe(6);
50
50
  });
51
51
  });
@@ -1,5 +1,5 @@
1
1
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
2
- import { Player } from '../player';
2
+ import { Player, Trait } from '../player';
3
3
  export declare enum SpikeTypeEnum {
4
4
  CROSS_SHOT = 0,
5
5
  LINE_SHOT = 1,
@@ -23,6 +23,6 @@ export declare class Spike extends InPlayEvent {
23
23
  readonly failure: SpikeFailureEnum;
24
24
  readonly type: SpikeTypeEnum;
25
25
  constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: SpikeOpts);
26
- static getScore(player: Player, type: SpikeTypeEnum, modifier: number, isBackRow: boolean): number;
26
+ static getScore(player: Player, type: SpikeTypeEnum, modifier: number, isBackRow: boolean, activeTraits: Trait[]): number;
27
27
  }
28
28
  export {};
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Spike = exports.SpikeFailureEnum = exports.SpikeTypeEnum = void 0;
4
4
  const in_play_event_1 = require("./in-play-event");
5
+ const player_1 = require("../player");
5
6
  var SpikeTypeEnum;
6
7
  (function (SpikeTypeEnum) {
7
8
  SpikeTypeEnum[SpikeTypeEnum["CROSS_SHOT"] = 0] = "CROSS_SHOT";
@@ -25,12 +26,25 @@ class Spike extends in_play_event_1.InPlayEvent {
25
26
  this.type = type;
26
27
  this.failure = failure;
27
28
  }
28
- static getScore(player, type, modifier, isBackRow) {
29
+ static getScore(player, type, modifier, isBackRow, activeTraits) {
29
30
  let score = Spike.calculateScore(player.stats, 'SPIKE', SpikeTypeEnum[type]);
30
31
  if (![SpikeTypeEnum.DOWN_BALL, SpikeTypeEnum.OVERHAND, SpikeTypeEnum.TIP].includes(type) && isBackRow) {
31
32
  score = score * 0.7 + player.stats.backAttack * 0.3;
32
33
  }
33
- return score * modifier;
34
+ score *= modifier;
35
+ for (const trait of activeTraits) {
36
+ switch (true) {
37
+ case trait === player_1.Trait.MASTER_MIND: {
38
+ score *= player_1.Trait.MASTER_MIND.modifier;
39
+ break;
40
+ }
41
+ case trait === player_1.Trait.MARKSMAN: {
42
+ score *= player_1.Trait.MARKSMAN.modifier;
43
+ break;
44
+ }
45
+ }
46
+ }
47
+ return score;
34
48
  }
35
49
  }
36
50
  exports.Spike = Spike;
@@ -20,7 +20,7 @@ const uuid_1 = require("uuid");
20
20
  type: spike_1.SpikeTypeEnum.CROSS_SHOT,
21
21
  eventType: rally_event_1.EventTypeEnum.SPIKE,
22
22
  modifier: 1,
23
- score: spike_1.Spike.getScore(__stubs__1.player, spike_1.SpikeTypeEnum.CROSS_SHOT, 1, false),
23
+ score: spike_1.Spike.getScore(__stubs__1.player, spike_1.SpikeTypeEnum.CROSS_SHOT, 1, false, []),
24
24
  activeTraits: []
25
25
  });
26
26
  failed = new spike_1.Spike({
@@ -32,7 +32,7 @@ const uuid_1 = require("uuid");
32
32
  type: spike_1.SpikeTypeEnum.TIP,
33
33
  eventType: rally_event_1.EventTypeEnum.SPIKE,
34
34
  modifier: 1,
35
- score: spike_1.Spike.getScore(__stubs__1.player, spike_1.SpikeTypeEnum.TIP, 1, false),
35
+ score: spike_1.Spike.getScore(__stubs__1.player, spike_1.SpikeTypeEnum.TIP, 1, false, []),
36
36
  activeTraits: []
37
37
  });
38
38
  backAttack = new spike_1.Spike({
@@ -44,7 +44,7 @@ const uuid_1 = require("uuid");
44
44
  type: spike_1.SpikeTypeEnum.CROSS_SHOT,
45
45
  eventType: rally_event_1.EventTypeEnum.SPIKE,
46
46
  modifier: 1,
47
- score: spike_1.Spike.getScore(__stubs__1.player, spike_1.SpikeTypeEnum.CROSS_SHOT, 1, true),
47
+ score: spike_1.Spike.getScore(__stubs__1.player, spike_1.SpikeTypeEnum.CROSS_SHOT, 1, true, []),
48
48
  activeTraits: []
49
49
  });
50
50
  });
@@ -26,7 +26,7 @@ class Role {
26
26
  score: this.calculateScore(stats, role)
27
27
  })).sort((x, y) => y.score - x.score);
28
28
  const out = [scores[0].role];
29
- if (scores[1].score >= 60) {
29
+ if (scores[1].score >= 65) {
30
30
  out.push(scores[1].role);
31
31
  }
32
32
  if (scores[2].score >= 70) {
@@ -47,27 +47,27 @@ Trait.MASTER_MIND = new Trait({
47
47
  name: 'Master Mind',
48
48
  roles: [role_1.Role.SETTER],
49
49
  modifier: 1.25,
50
- chance: 0.25,
50
+ chance: 0.2,
51
51
  statThreshold: 80,
52
52
  stat: stats_1.GeneralStat.ATTACK,
53
53
  weight: 10
54
54
  });
55
- // Will always participate in blocking regardless of chance
55
+ // Will always participate in blocking regardless of chance and adds
56
56
  Trait.MOVING_WALL = new Trait({
57
57
  name: 'Moving Wall',
58
58
  roles: [role_1.Role.MIDDLE_BLOCKER, role_1.Role.DEFENSIVE_SPECIALIST],
59
- modifier: 1,
59
+ modifier: 1.1,
60
60
  chance: 1,
61
61
  statThreshold: 75,
62
62
  stat: stats_1.GeneralStat.DEFENSE,
63
63
  weight: 5
64
64
  });
65
- // On attack, will always pick the worst receiver
65
+ // On attack, will always pick the worst receiver and adds a 10% to score
66
66
  Trait.MARKSMAN = new Trait({
67
67
  name: 'Marksman',
68
68
  roles: [role_1.Role.OUTSIDE_HITTER, role_1.Role.OPPOSITE_HITTER, role_1.Role.SETTER],
69
- modifier: 1,
70
- chance: 0.33,
69
+ modifier: 1.1,
70
+ chance: 0.3,
71
71
  statThreshold: 75,
72
72
  stat: stats_1.GeneralStat.ATTACK,
73
73
  weight: 5
@@ -75,7 +75,7 @@ Trait.MARKSMAN = new Trait({
75
75
  // Increases the score of the serve by 25% when serve type is Jumping.
76
76
  Trait.METEOR_SERVE = new Trait({
77
77
  name: 'Meteor Serve',
78
- roles: [role_1.Role.OUTSIDE_HITTER, role_1.Role.OPPOSITE_HITTER, role_1.Role.SETTER, role_1.Role.DEFENSIVE_SPECIALIST, role_1.Role.MIDDLE_BLOCKER],
78
+ roles: [],
79
79
  modifier: 1.25,
80
80
  chance: 0.1,
81
81
  statThreshold: 75,
@@ -1,5 +1,5 @@
1
1
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
2
- import { Player } from '../player';
2
+ import { Player, Trait } from '../player';
3
3
  export declare enum BlockFailureEnum {
4
4
  NO_FAILURE = 0,
5
5
  FAULT = 1,
@@ -24,6 +24,6 @@ export declare class Block extends InPlayEvent {
24
24
  readonly type: BlockTypeEnum;
25
25
  readonly blockers: Player[];
26
26
  constructor({ id, order, score, player, target, failure, type, modifier, eventType, blockers, activeTraits }: BlockOpts);
27
- static getScore(blockers: Player[], modifier: number): number;
27
+ static getScore(blockers: Player[], modifier: number, activeTraits: Trait[]): number;
28
28
  }
29
29
  export {};
@@ -1,4 +1,5 @@
1
1
  import { InPlayEvent } from './in-play-event';
2
+ import { Trait } from '../player';
2
3
  export var BlockFailureEnum;
3
4
  (function (BlockFailureEnum) {
4
5
  BlockFailureEnum[BlockFailureEnum["NO_FAILURE"] = 0] = "NO_FAILURE";
@@ -22,7 +23,7 @@ export class Block extends InPlayEvent {
22
23
  this.failure = failure;
23
24
  this.blockers = blockers;
24
25
  }
25
- static getScore(blockers, modifier) {
26
+ static getScore(blockers, modifier, activeTraits) {
26
27
  const type = blockers.length;
27
28
  if (blockers.length > 3)
28
29
  throw new Error('UNKNOWN_TYPE');
@@ -46,6 +47,15 @@ export class Block extends InPlayEvent {
46
47
  return score + Block.calculateScore(player.stats, 'BLOCK', BlockTypeEnum[type]);
47
48
  }, 0);
48
49
  const avg = total / blockers.length;
49
- return avg * bmod * modifier;
50
+ let score = avg * bmod * modifier;
51
+ for (const trait of activeTraits) {
52
+ switch (true) {
53
+ case trait === Trait.MOVING_WALL: {
54
+ score *= Trait.MOVING_WALL.modifier;
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ return score;
50
60
  }
51
61
  }
@@ -21,7 +21,7 @@ describe('Block Test Module', () => {
21
21
  eventType: EventTypeEnum.BLOCK,
22
22
  modifier: 1,
23
23
  blockers: [],
24
- score: Block.getScore([], 1),
24
+ score: Block.getScore([], 1, []),
25
25
  activeTraits: []
26
26
  });
27
27
  block = new Block({
@@ -34,7 +34,7 @@ describe('Block Test Module', () => {
34
34
  eventType: EventTypeEnum.BLOCK,
35
35
  modifier: 1,
36
36
  blockers: [player],
37
- score: Block.getScore([player], 1),
37
+ score: Block.getScore([player], 1, []),
38
38
  activeTraits: []
39
39
  });
40
40
  double = new Block({
@@ -47,7 +47,7 @@ describe('Block Test Module', () => {
47
47
  eventType: EventTypeEnum.BLOCK,
48
48
  modifier: 1,
49
49
  blockers: [player, player],
50
- score: Block.getScore([player, player], 1),
50
+ score: Block.getScore([player, player], 1, []),
51
51
  activeTraits: []
52
52
  });
53
53
  triple = new Block({
@@ -60,7 +60,7 @@ describe('Block Test Module', () => {
60
60
  eventType: EventTypeEnum.BLOCK,
61
61
  modifier: 1,
62
62
  blockers: [player, player, player],
63
- score: Block.getScore([player, player, player], 1),
63
+ score: Block.getScore([player, player, player], 1, []),
64
64
  activeTraits: []
65
65
  });
66
66
  failed = new Block({
@@ -73,7 +73,7 @@ describe('Block Test Module', () => {
73
73
  eventType: EventTypeEnum.BLOCK,
74
74
  modifier: 1,
75
75
  blockers: [player],
76
- score: Block.getScore([player], 1),
76
+ score: Block.getScore([player], 1, []),
77
77
  activeTraits: []
78
78
  });
79
79
  });
@@ -95,7 +95,7 @@ describe('Block Test Module', () => {
95
95
  expect(failed.score).toBe(7);
96
96
  });
97
97
  test('Should throw Error when getting score with invalid amount of blockers', () => {
98
- function score() { Block.getScore([player, player, player, player, player], 1); }
98
+ function score() { Block.getScore([player, player, player, player, player], 1, []); }
99
99
  expect(score).toThrow(/^UNKNOWN_TYPE$/);
100
100
  });
101
101
  });
@@ -1,4 +1,4 @@
1
- import { PerformanceStats } from '../player';
1
+ import { PerformanceStats, Trait } from '../player';
2
2
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
3
3
  export declare enum ReceptionTypeEnum {
4
4
  DIG = 0,
@@ -21,6 +21,6 @@ export declare class Reception extends InPlayEvent {
21
21
  readonly failure: ReceptionFailureEnum;
22
22
  readonly type: ReceptionTypeEnum;
23
23
  constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: ReceptionOpts);
24
- static getScore(stats: PerformanceStats, type: ReceptionTypeEnum, modifier: number): number;
24
+ static getScore(stats: PerformanceStats, type: ReceptionTypeEnum, modifier: number, activeTraits: Trait[]): number;
25
25
  }
26
26
  export {};
@@ -1,3 +1,4 @@
1
+ import { Trait } from '../player';
1
2
  import { InPlayEvent } from './in-play-event';
2
3
  export var ReceptionTypeEnum;
3
4
  (function (ReceptionTypeEnum) {
@@ -20,7 +21,16 @@ export class Reception extends InPlayEvent {
20
21
  this.type = type;
21
22
  this.failure = failure;
22
23
  }
23
- static getScore(stats, type, modifier) {
24
- return Reception.calculateScore(stats, 'RECEPTION', ReceptionTypeEnum[type]) * modifier;
24
+ static getScore(stats, type, modifier, activeTraits) {
25
+ let score = Reception.calculateScore(stats, 'RECEPTION', ReceptionTypeEnum[type]) * modifier;
26
+ for (const trait of activeTraits) {
27
+ switch (true) {
28
+ case trait === Trait.GUARDIAN: {
29
+ score *= Trait.GUARDIAN.modifier;
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ return score;
25
35
  }
26
36
  }
@@ -43,7 +43,7 @@ describe('Reception Test Module', () => {
43
43
  });
44
44
  // getScore Tests
45
45
  test('Should get the correct score for all Reception types', () => {
46
- expect(Reception.getScore(reception.player.stats, reception.type, 1)).toBe(4);
47
- expect(Reception.getScore(failed.player.stats, failed.type, 1)).toBe(3);
46
+ expect(Reception.getScore(reception.player.stats, reception.type, 1, [])).toBe(4);
47
+ expect(Reception.getScore(failed.player.stats, failed.type, 1, [])).toBe(3);
48
48
  });
49
49
  });
@@ -28,6 +28,7 @@ export class Serve extends InPlayEvent {
28
28
  switch (true) {
29
29
  case trait === Trait.METEOR_SERVE: {
30
30
  score *= Trait.METEOR_SERVE.modifier;
31
+ break;
31
32
  }
32
33
  }
33
34
  }
@@ -1,4 +1,4 @@
1
- import { PerformanceStats } from '../player';
1
+ import { PerformanceStats, Trait } from '../player';
2
2
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
3
3
  export declare enum SetTypeEnum {
4
4
  OVERHAND = 0,
@@ -21,6 +21,6 @@ export declare class Set extends InPlayEvent {
21
21
  readonly failure: SetFailureEnum;
22
22
  readonly type: SetTypeEnum;
23
23
  constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: SetOpts);
24
- static getScore(stats: PerformanceStats, type: SetTypeEnum, modifier: number): number;
24
+ static getScore(stats: PerformanceStats, type: SetTypeEnum, modifier: number, activeTraits: Trait[]): number;
25
25
  }
26
26
  export {};
@@ -1,3 +1,4 @@
1
+ import { Trait } from '../player';
1
2
  import { InPlayEvent } from './in-play-event';
2
3
  export var SetTypeEnum;
3
4
  (function (SetTypeEnum) {
@@ -20,7 +21,21 @@ export class Set extends InPlayEvent {
20
21
  this.type = type;
21
22
  this.failure = failure;
22
23
  }
23
- static getScore(stats, type, modifier) {
24
- return Set.calculateScore(stats, 'SET', SetTypeEnum[type]) * modifier;
24
+ static getScore(stats, type, modifier, activeTraits) {
25
+ let score = Set.calculateScore(stats, 'SET', SetTypeEnum[type]) * modifier;
26
+ for (const trait of activeTraits) {
27
+ switch (true) {
28
+ case trait === Trait.MASTER_MIND: {
29
+ score *= Trait.MASTER_MIND.modifier;
30
+ break;
31
+ }
32
+ case trait === Trait.MARKSMAN: {
33
+ if ([SetTypeEnum.DUMP, SetTypeEnum.SPIKE].includes(type))
34
+ score *= Trait.MARKSMAN.modifier;
35
+ break;
36
+ }
37
+ }
38
+ }
39
+ return score;
25
40
  }
26
41
  }
@@ -43,7 +43,7 @@ describe('Set Test Module', () => {
43
43
  });
44
44
  // getScore Tests
45
45
  test('Should get the correct score for all Set types', () => {
46
- expect(Set.getScore(set.player.stats, set.type, 1)).toBe(3);
47
- expect(Set.getScore(failed.player.stats, failed.type, 1)).toBe(6);
46
+ expect(Set.getScore(set.player.stats, set.type, 1, [])).toBe(3);
47
+ expect(Set.getScore(failed.player.stats, failed.type, 1, [])).toBe(6);
48
48
  });
49
49
  });
@@ -1,5 +1,5 @@
1
1
  import { InPlayEvent, InPlayEventOpts } from './in-play-event';
2
- import { Player } from '../player';
2
+ import { Player, Trait } from '../player';
3
3
  export declare enum SpikeTypeEnum {
4
4
  CROSS_SHOT = 0,
5
5
  LINE_SHOT = 1,
@@ -23,6 +23,6 @@ export declare class Spike extends InPlayEvent {
23
23
  readonly failure: SpikeFailureEnum;
24
24
  readonly type: SpikeTypeEnum;
25
25
  constructor({ id, order, score, player, target, failure, type, eventType, modifier, activeTraits }: SpikeOpts);
26
- static getScore(player: Player, type: SpikeTypeEnum, modifier: number, isBackRow: boolean): number;
26
+ static getScore(player: Player, type: SpikeTypeEnum, modifier: number, isBackRow: boolean, activeTraits: Trait[]): number;
27
27
  }
28
28
  export {};
@@ -1,4 +1,5 @@
1
1
  import { InPlayEvent } from './in-play-event';
2
+ import { Trait } from '../player';
2
3
  export var SpikeTypeEnum;
3
4
  (function (SpikeTypeEnum) {
4
5
  SpikeTypeEnum[SpikeTypeEnum["CROSS_SHOT"] = 0] = "CROSS_SHOT";
@@ -22,11 +23,24 @@ export class Spike extends InPlayEvent {
22
23
  this.type = type;
23
24
  this.failure = failure;
24
25
  }
25
- static getScore(player, type, modifier, isBackRow) {
26
+ static getScore(player, type, modifier, isBackRow, activeTraits) {
26
27
  let score = Spike.calculateScore(player.stats, 'SPIKE', SpikeTypeEnum[type]);
27
28
  if (![SpikeTypeEnum.DOWN_BALL, SpikeTypeEnum.OVERHAND, SpikeTypeEnum.TIP].includes(type) && isBackRow) {
28
29
  score = score * 0.7 + player.stats.backAttack * 0.3;
29
30
  }
30
- return score * modifier;
31
+ score *= modifier;
32
+ for (const trait of activeTraits) {
33
+ switch (true) {
34
+ case trait === Trait.MASTER_MIND: {
35
+ score *= Trait.MASTER_MIND.modifier;
36
+ break;
37
+ }
38
+ case trait === Trait.MARKSMAN: {
39
+ score *= Trait.MARKSMAN.modifier;
40
+ break;
41
+ }
42
+ }
43
+ }
44
+ return score;
31
45
  }
32
46
  }
@@ -18,7 +18,7 @@ describe('Spike Test Module', () => {
18
18
  type: SpikeTypeEnum.CROSS_SHOT,
19
19
  eventType: EventTypeEnum.SPIKE,
20
20
  modifier: 1,
21
- score: Spike.getScore(player, SpikeTypeEnum.CROSS_SHOT, 1, false),
21
+ score: Spike.getScore(player, SpikeTypeEnum.CROSS_SHOT, 1, false, []),
22
22
  activeTraits: []
23
23
  });
24
24
  failed = new Spike({
@@ -30,7 +30,7 @@ describe('Spike Test Module', () => {
30
30
  type: SpikeTypeEnum.TIP,
31
31
  eventType: EventTypeEnum.SPIKE,
32
32
  modifier: 1,
33
- score: Spike.getScore(player, SpikeTypeEnum.TIP, 1, false),
33
+ score: Spike.getScore(player, SpikeTypeEnum.TIP, 1, false, []),
34
34
  activeTraits: []
35
35
  });
36
36
  backAttack = new Spike({
@@ -42,7 +42,7 @@ describe('Spike Test Module', () => {
42
42
  type: SpikeTypeEnum.CROSS_SHOT,
43
43
  eventType: EventTypeEnum.SPIKE,
44
44
  modifier: 1,
45
- score: Spike.getScore(player, SpikeTypeEnum.CROSS_SHOT, 1, true),
45
+ score: Spike.getScore(player, SpikeTypeEnum.CROSS_SHOT, 1, true, []),
46
46
  activeTraits: []
47
47
  });
48
48
  });
@@ -20,7 +20,7 @@ export class Role {
20
20
  score: this.calculateScore(stats, role)
21
21
  })).sort((x, y) => y.score - x.score);
22
22
  const out = [scores[0].role];
23
- if (scores[1].score >= 60) {
23
+ if (scores[1].score >= 65) {
24
24
  out.push(scores[1].role);
25
25
  }
26
26
  if (scores[2].score >= 70) {
@@ -43,27 +43,27 @@ Trait.MASTER_MIND = new Trait({
43
43
  name: 'Master Mind',
44
44
  roles: [Role.SETTER],
45
45
  modifier: 1.25,
46
- chance: 0.25,
46
+ chance: 0.2,
47
47
  statThreshold: 80,
48
48
  stat: GeneralStat.ATTACK,
49
49
  weight: 10
50
50
  });
51
- // Will always participate in blocking regardless of chance
51
+ // Will always participate in blocking regardless of chance and adds
52
52
  Trait.MOVING_WALL = new Trait({
53
53
  name: 'Moving Wall',
54
54
  roles: [Role.MIDDLE_BLOCKER, Role.DEFENSIVE_SPECIALIST],
55
- modifier: 1,
55
+ modifier: 1.1,
56
56
  chance: 1,
57
57
  statThreshold: 75,
58
58
  stat: GeneralStat.DEFENSE,
59
59
  weight: 5
60
60
  });
61
- // On attack, will always pick the worst receiver
61
+ // On attack, will always pick the worst receiver and adds a 10% to score
62
62
  Trait.MARKSMAN = new Trait({
63
63
  name: 'Marksman',
64
64
  roles: [Role.OUTSIDE_HITTER, Role.OPPOSITE_HITTER, Role.SETTER],
65
- modifier: 1,
66
- chance: 0.33,
65
+ modifier: 1.1,
66
+ chance: 0.3,
67
67
  statThreshold: 75,
68
68
  stat: GeneralStat.ATTACK,
69
69
  weight: 5
@@ -71,7 +71,7 @@ Trait.MARKSMAN = new Trait({
71
71
  // Increases the score of the serve by 25% when serve type is Jumping.
72
72
  Trait.METEOR_SERVE = new Trait({
73
73
  name: 'Meteor Serve',
74
- roles: [Role.OUTSIDE_HITTER, Role.OPPOSITE_HITTER, Role.SETTER, Role.DEFENSIVE_SPECIALIST, Role.MIDDLE_BLOCKER],
74
+ roles: [],
75
75
  modifier: 1.25,
76
76
  chance: 0.1,
77
77
  statThreshold: 75,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "volleyballsimtypes",
3
- "version": "0.0.79",
3
+ "version": "0.0.81",
4
4
  "description": "vbsim types",
5
5
  "main": "./dist/cjs/src/index.js",
6
6
  "module": "./dist/esm/src/index.js",