volleyballsimtypes 0.0.501 → 0.0.503

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 (81) hide show
  1. package/dist/cjs/src/data/models/box-score.d.ts +12 -0
  2. package/dist/cjs/src/data/models/box-score.js +30 -0
  3. package/dist/cjs/src/data/models/views/box-score-totals.d.ts +12 -0
  4. package/dist/cjs/src/data/models/views/box-score-totals.js +24 -0
  5. package/dist/cjs/src/data/transformers/box-score.js +13 -1
  6. package/dist/cjs/src/data/transformers/player.js +7 -1
  7. package/dist/cjs/src/data/transformers/rally-event-positional.test.d.ts +1 -0
  8. package/dist/cjs/src/data/transformers/rally-event-positional.test.js +56 -0
  9. package/dist/cjs/src/data/transformers/rally-event.d.ts +4 -0
  10. package/dist/cjs/src/data/transformers/rally-event.js +34 -6
  11. package/dist/cjs/src/service/event/block.js +2 -2
  12. package/dist/cjs/src/service/event/free-ball.js +2 -2
  13. package/dist/cjs/src/service/event/in-play-event.d.ts +19 -1
  14. package/dist/cjs/src/service/event/in-play-event.js +17 -2
  15. package/dist/cjs/src/service/event/reception.js +2 -2
  16. package/dist/cjs/src/service/event/schemas/block.z.d.ts +10 -0
  17. package/dist/cjs/src/service/event/schemas/block.z.js +3 -1
  18. package/dist/cjs/src/service/event/schemas/free-ball.z.d.ts +10 -0
  19. package/dist/cjs/src/service/event/schemas/free-ball.z.js +3 -1
  20. package/dist/cjs/src/service/event/schemas/positional.z.d.ts +17 -0
  21. package/dist/cjs/src/service/event/schemas/positional.z.js +18 -0
  22. package/dist/cjs/src/service/event/schemas/reception.z.d.ts +10 -0
  23. package/dist/cjs/src/service/event/schemas/reception.z.js +3 -1
  24. package/dist/cjs/src/service/event/schemas/serve.z.d.ts +10 -0
  25. package/dist/cjs/src/service/event/schemas/serve.z.js +3 -1
  26. package/dist/cjs/src/service/event/schemas/set.z.d.ts +10 -0
  27. package/dist/cjs/src/service/event/schemas/set.z.js +3 -1
  28. package/dist/cjs/src/service/event/schemas/spike.z.d.ts +10 -0
  29. package/dist/cjs/src/service/event/schemas/spike.z.js +4 -2
  30. package/dist/cjs/src/service/event/serve.js +2 -2
  31. package/dist/cjs/src/service/event/set.js +2 -2
  32. package/dist/cjs/src/service/event/spike.d.ts +3 -2
  33. package/dist/cjs/src/service/event/spike.js +6 -2
  34. package/dist/cjs/src/service/match/box-score.d.ts +6 -0
  35. package/dist/cjs/src/service/match/box-score.js +7 -1
  36. package/dist/cjs/src/service/match/schemas/box-score.z.d.ts +12 -0
  37. package/dist/cjs/src/service/match/schemas/box-score.z.js +15 -2
  38. package/dist/cjs/src/service/player/schemas/player.z.d.ts +12 -0
  39. package/dist/cjs/src/service/player/trait.d.ts +1 -0
  40. package/dist/cjs/src/stat-config/traits.json +55 -11
  41. package/dist/esm/src/data/models/box-score.d.ts +12 -0
  42. package/dist/esm/src/data/models/box-score.js +30 -0
  43. package/dist/esm/src/data/models/views/box-score-totals.d.ts +12 -0
  44. package/dist/esm/src/data/models/views/box-score-totals.js +24 -0
  45. package/dist/esm/src/data/transformers/box-score.js +13 -1
  46. package/dist/esm/src/data/transformers/player.js +7 -1
  47. package/dist/esm/src/data/transformers/rally-event-positional.test.d.ts +1 -0
  48. package/dist/esm/src/data/transformers/rally-event-positional.test.js +54 -0
  49. package/dist/esm/src/data/transformers/rally-event.d.ts +4 -0
  50. package/dist/esm/src/data/transformers/rally-event.js +34 -6
  51. package/dist/esm/src/service/event/block.js +2 -2
  52. package/dist/esm/src/service/event/free-ball.js +2 -2
  53. package/dist/esm/src/service/event/in-play-event.d.ts +19 -1
  54. package/dist/esm/src/service/event/in-play-event.js +16 -1
  55. package/dist/esm/src/service/event/reception.js +2 -2
  56. package/dist/esm/src/service/event/schemas/block.z.d.ts +10 -0
  57. package/dist/esm/src/service/event/schemas/block.z.js +3 -1
  58. package/dist/esm/src/service/event/schemas/free-ball.z.d.ts +10 -0
  59. package/dist/esm/src/service/event/schemas/free-ball.z.js +3 -1
  60. package/dist/esm/src/service/event/schemas/positional.z.d.ts +17 -0
  61. package/dist/esm/src/service/event/schemas/positional.z.js +15 -0
  62. package/dist/esm/src/service/event/schemas/reception.z.d.ts +10 -0
  63. package/dist/esm/src/service/event/schemas/reception.z.js +3 -1
  64. package/dist/esm/src/service/event/schemas/serve.z.d.ts +10 -0
  65. package/dist/esm/src/service/event/schemas/serve.z.js +3 -1
  66. package/dist/esm/src/service/event/schemas/set.z.d.ts +10 -0
  67. package/dist/esm/src/service/event/schemas/set.z.js +3 -1
  68. package/dist/esm/src/service/event/schemas/spike.z.d.ts +10 -0
  69. package/dist/esm/src/service/event/schemas/spike.z.js +4 -2
  70. package/dist/esm/src/service/event/serve.js +2 -2
  71. package/dist/esm/src/service/event/set.js +2 -2
  72. package/dist/esm/src/service/event/spike.d.ts +3 -2
  73. package/dist/esm/src/service/event/spike.js +6 -2
  74. package/dist/esm/src/service/match/box-score.d.ts +6 -0
  75. package/dist/esm/src/service/match/box-score.js +7 -1
  76. package/dist/esm/src/service/match/schemas/box-score.z.d.ts +12 -0
  77. package/dist/esm/src/service/match/schemas/box-score.z.js +15 -2
  78. package/dist/esm/src/service/player/schemas/player.z.d.ts +12 -0
  79. package/dist/esm/src/service/player/trait.d.ts +1 -0
  80. package/dist/esm/src/stat-config/traits.json +55 -11
  81. package/package.json +1 -1
@@ -1,6 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import { TraitEnum } from '../../player';
3
3
  export declare const ReceptionInputSchema: z.ZodObject<{
4
+ contact: z.ZodOptional<z.ZodObject<{
5
+ x: z.ZodNumber;
6
+ y: z.ZodNumber;
7
+ }, z.core.$strip>>;
8
+ landing: z.ZodOptional<z.ZodObject<{
9
+ x: z.ZodNumber;
10
+ y: z.ZodNumber;
11
+ }, z.core.$strip>>;
12
+ speed: z.ZodOptional<z.ZodNumber>;
13
+ digQuality: z.ZodOptional<z.ZodNumber>;
4
14
  playerId: z.ZodUUID;
5
15
  score: z.ZodNumber;
6
16
  target: z.ZodNumber;
@@ -4,6 +4,7 @@ exports.ReceptionInputSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const player_1 = require("../../player");
6
6
  const incident_z_1 = require("./incident.z");
7
+ const positional_z_1 = require("./positional.z");
7
8
  const receptionTypeValues = [0, 1, 2, 3, 4];
8
9
  const receptionFailureValues = [0, 1, 2, 3, 4];
9
10
  const courtTargetValues = Array.from({ length: 13 }, (_, i) => i);
@@ -14,5 +15,6 @@ exports.ReceptionInputSchema = zod_1.z.object({
14
15
  activeTraits: zod_1.z.array(zod_1.z.enum(Object.values(player_1.TraitEnum))).default([]),
15
16
  failure: zod_1.z.number().int().refine((v) => receptionFailureValues.includes(v), { message: 'INVALID_RECEPTION_FAILURE' }),
16
17
  type: zod_1.z.number().int().refine((v) => receptionTypeValues.includes(v), { message: 'INVALID_RECEPTION_TYPE' }),
17
- incident: incident_z_1.EventIncidentSchema.optional()
18
+ incident: incident_z_1.EventIncidentSchema.optional(),
19
+ ...positional_z_1.positionalEventFields
18
20
  });
@@ -1,6 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import { TraitEnum } from '../../player';
3
3
  export declare const ServeInputSchema: z.ZodObject<{
4
+ contact: z.ZodOptional<z.ZodObject<{
5
+ x: z.ZodNumber;
6
+ y: z.ZodNumber;
7
+ }, z.core.$strip>>;
8
+ landing: z.ZodOptional<z.ZodObject<{
9
+ x: z.ZodNumber;
10
+ y: z.ZodNumber;
11
+ }, z.core.$strip>>;
12
+ speed: z.ZodOptional<z.ZodNumber>;
13
+ digQuality: z.ZodOptional<z.ZodNumber>;
4
14
  playerId: z.ZodUUID;
5
15
  score: z.ZodNumber;
6
16
  target: z.ZodNumber;
@@ -4,6 +4,7 @@ exports.ServeInputSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const player_1 = require("../../player");
6
6
  const incident_z_1 = require("./incident.z");
7
+ const positional_z_1 = require("./positional.z");
7
8
  const serveTypeValues = [0, 1, 2, 3];
8
9
  const serveFailureValues = [0, 1, 2, 3, 4];
9
10
  const courtTargetValues = Array.from({ length: 13 }, (_, i) => i);
@@ -14,5 +15,6 @@ exports.ServeInputSchema = zod_1.z.object({
14
15
  activeTraits: zod_1.z.array(zod_1.z.enum(Object.values(player_1.TraitEnum))).default([]),
15
16
  failure: zod_1.z.number().int().refine((v) => serveFailureValues.includes(v), { message: 'INVALID_SERVE_FAILURE' }),
16
17
  type: zod_1.z.number().int().refine((v) => serveTypeValues.includes(v), { message: 'INVALID_SERVE_TYPE' }),
17
- incident: incident_z_1.EventIncidentSchema.optional()
18
+ incident: incident_z_1.EventIncidentSchema.optional(),
19
+ ...positional_z_1.positionalEventFields
18
20
  });
@@ -1,6 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import { TraitEnum } from '../../player';
3
3
  export declare const SetInputSchema: z.ZodObject<{
4
+ contact: z.ZodOptional<z.ZodObject<{
5
+ x: z.ZodNumber;
6
+ y: z.ZodNumber;
7
+ }, z.core.$strip>>;
8
+ landing: z.ZodOptional<z.ZodObject<{
9
+ x: z.ZodNumber;
10
+ y: z.ZodNumber;
11
+ }, z.core.$strip>>;
12
+ speed: z.ZodOptional<z.ZodNumber>;
13
+ digQuality: z.ZodOptional<z.ZodNumber>;
4
14
  playerId: z.ZodUUID;
5
15
  score: z.ZodNumber;
6
16
  target: z.ZodNumber;
@@ -4,6 +4,7 @@ exports.SetInputSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const player_1 = require("../../player");
6
6
  const incident_z_1 = require("./incident.z");
7
+ const positional_z_1 = require("./positional.z");
7
8
  const setTypeValues = [0, 1];
8
9
  const setFailureValues = [0, 1, 2, 3, 4];
9
10
  const setTempoValues = [0, 1, 2];
@@ -17,5 +18,6 @@ exports.SetInputSchema = zod_1.z.object({
17
18
  type: zod_1.z.number().int().refine((v) => setTypeValues.includes(v), { message: 'INVALID_SET_TYPE' }),
18
19
  incident: incident_z_1.EventIncidentSchema.optional(),
19
20
  // Set tempo (FIRST=0, SECOND=1, HIGH=2). Optional: absent on dumps, failed sets, and every pre-tempo event.
20
- tempo: zod_1.z.number().int().refine((v) => setTempoValues.includes(v), { message: 'INVALID_SET_TEMPO' }).optional()
21
+ tempo: zod_1.z.number().int().refine((v) => setTempoValues.includes(v), { message: 'INVALID_SET_TEMPO' }).optional(),
22
+ ...positional_z_1.positionalEventFields
21
23
  });
@@ -1,6 +1,16 @@
1
1
  import { z } from 'zod';
2
2
  import { TraitEnum } from '../../player';
3
3
  export declare const SpikeInputSchema: z.ZodObject<{
4
+ contact: z.ZodOptional<z.ZodObject<{
5
+ x: z.ZodNumber;
6
+ y: z.ZodNumber;
7
+ }, z.core.$strip>>;
8
+ landing: z.ZodOptional<z.ZodObject<{
9
+ x: z.ZodNumber;
10
+ y: z.ZodNumber;
11
+ }, z.core.$strip>>;
12
+ speed: z.ZodOptional<z.ZodNumber>;
13
+ digQuality: z.ZodOptional<z.ZodNumber>;
4
14
  playerId: z.ZodUUID;
5
15
  score: z.ZodNumber;
6
16
  target: z.ZodNumber;
@@ -4,7 +4,8 @@ exports.SpikeInputSchema = void 0;
4
4
  const zod_1 = require("zod");
5
5
  const player_1 = require("../../player");
6
6
  const incident_z_1 = require("./incident.z");
7
- const spikeTypeValues = [0, 1, 2, 3, 4, 5];
7
+ const positional_z_1 = require("./positional.z");
8
+ const spikeTypeValues = [0, 1, 2, 3, 4, 5, 6];
8
9
  const spikeFailureValues = [0, 1, 2, 3, 4];
9
10
  const courtTargetValues = Array.from({ length: 13 }, (_, i) => i);
10
11
  exports.SpikeInputSchema = zod_1.z.object({
@@ -14,5 +15,6 @@ exports.SpikeInputSchema = zod_1.z.object({
14
15
  activeTraits: zod_1.z.array(zod_1.z.enum(Object.values(player_1.TraitEnum))).default([]),
15
16
  failure: zod_1.z.number().int().refine((v) => spikeFailureValues.includes(v), { message: 'INVALID_SPIKE_FAILURE' }),
16
17
  type: zod_1.z.number().int().refine((v) => spikeTypeValues.includes(v), { message: 'INVALID_SPIKE_TYPE' }),
17
- incident: incident_z_1.EventIncidentSchema.optional()
18
+ incident: incident_z_1.EventIncidentSchema.optional(),
19
+ ...positional_z_1.positionalEventFields
18
20
  });
@@ -33,8 +33,8 @@ class Serve extends in_play_event_1.InPlayEvent {
33
33
  }
34
34
  return new Serve(result.data);
35
35
  }
36
- constructor({ score, playerId, target, failure, type, activeTraits, incident }) {
37
- super({ score, playerId, target, activeTraits, incident, eventType });
36
+ constructor({ score, playerId, target, failure, type, activeTraits, incident, contact, landing, speed, digQuality }) {
37
+ super({ score, playerId, target, activeTraits, incident, eventType, contact, landing, speed, digQuality });
38
38
  this.type = type;
39
39
  this.failure = failure;
40
40
  }
@@ -41,8 +41,8 @@ class Set extends in_play_event_1.InPlayEvent {
41
41
  }
42
42
  return new Set(result.data);
43
43
  }
44
- constructor({ score, playerId, target, failure, type, activeTraits, incident, tempo }) {
45
- super({ score, playerId, target, activeTraits, incident, eventType });
44
+ constructor({ score, playerId, target, failure, type, activeTraits, incident, tempo, contact, landing, speed, digQuality }) {
45
+ super({ score, playerId, target, activeTraits, incident, eventType, contact, landing, speed, digQuality });
46
46
  this.type = type;
47
47
  this.failure = failure;
48
48
  this.tempo = tempo;
@@ -5,9 +5,10 @@ export declare enum SpikeTypeEnum {
5
5
  REVERSE_CROSS = 2,
6
6
  TIP = 3,
7
7
  DOWN_BALL = 4,
8
- OVERHAND = 5
8
+ OVERHAND = 5,
9
+ TOOL = 6
9
10
  }
10
- export type SpikeType = SpikeTypeEnum.CROSS_SHOT | SpikeTypeEnum.LINE_SHOT | SpikeTypeEnum.REVERSE_CROSS | SpikeTypeEnum.TIP | SpikeTypeEnum.DOWN_BALL | SpikeTypeEnum.OVERHAND;
11
+ export type SpikeType = SpikeTypeEnum.CROSS_SHOT | SpikeTypeEnum.LINE_SHOT | SpikeTypeEnum.REVERSE_CROSS | SpikeTypeEnum.TIP | SpikeTypeEnum.DOWN_BALL | SpikeTypeEnum.OVERHAND | SpikeTypeEnum.TOOL;
11
12
  export declare enum SpikeFailureEnum {
12
13
  NO_FAILURE = 0,
13
14
  FAULT = 1,
@@ -12,6 +12,10 @@ var SpikeTypeEnum;
12
12
  SpikeTypeEnum[SpikeTypeEnum["TIP"] = 3] = "TIP";
13
13
  SpikeTypeEnum[SpikeTypeEnum["DOWN_BALL"] = 4] = "DOWN_BALL";
14
14
  SpikeTypeEnum[SpikeTypeEnum["OVERHAND"] = 5] = "OVERHAND";
15
+ // A ball intentionally wiped/deflected off the block and out: the ATTACKER's shot (a kill), the block earns a
16
+ // TOUCH (FIVB: NOT a block error). Distinct from the legacy BlockFailureEnum.TOOL/WIPE, which the older zone
17
+ // engine still uses to mis-book a tool-out as a block error.
18
+ SpikeTypeEnum[SpikeTypeEnum["TOOL"] = 6] = "TOOL";
15
19
  })(SpikeTypeEnum || (exports.SpikeTypeEnum = SpikeTypeEnum = {}));
16
20
  var SpikeFailureEnum;
17
21
  (function (SpikeFailureEnum) {
@@ -35,8 +39,8 @@ class Spike extends in_play_event_1.InPlayEvent {
35
39
  }
36
40
  return new Spike(result.data);
37
41
  }
38
- constructor({ score, playerId, target, failure, type, activeTraits, incident }) {
39
- super({ score, playerId, target, activeTraits, incident, eventType });
42
+ constructor({ score, playerId, target, failure, type, activeTraits, incident, contact, landing, speed, digQuality }) {
43
+ super({ score, playerId, target, activeTraits, incident, eventType, contact, landing, speed, digQuality });
40
44
  this.type = type;
41
45
  this.failure = failure;
42
46
  }
@@ -2,6 +2,7 @@ export interface AttackStats {
2
2
  attempts: number;
3
3
  kills: number;
4
4
  errors: number;
5
+ blocked: number;
5
6
  }
6
7
  export interface ServeStats {
7
8
  attempts: number;
@@ -12,6 +13,8 @@ export interface ReceptionStats {
12
13
  attempts: number;
13
14
  perfect: number;
14
15
  positive: number;
16
+ ok: number;
17
+ negative: number;
15
18
  overpasses: number;
16
19
  errors: number;
17
20
  }
@@ -28,6 +31,9 @@ export interface SettingStats {
28
31
  }
29
32
  export interface DefenseStats {
30
33
  digs: number;
34
+ digsPerfect: number;
35
+ digsMediocre: number;
36
+ digsBad: number;
31
37
  errors: number;
32
38
  }
33
39
  /**
@@ -31,7 +31,8 @@ exports.BoxScore = BoxScore;
31
31
  BoxScore.createEmptyAttackStats = () => ({
32
32
  attempts: 0,
33
33
  kills: 0,
34
- errors: 0
34
+ errors: 0,
35
+ blocked: 0
35
36
  });
36
37
  BoxScore.createEmptyServeStats = () => ({
37
38
  attempts: 0,
@@ -42,6 +43,8 @@ BoxScore.createEmptyReceptionStats = () => ({
42
43
  attempts: 0,
43
44
  perfect: 0,
44
45
  positive: 0,
46
+ ok: 0,
47
+ negative: 0,
45
48
  overpasses: 0,
46
49
  errors: 0
47
50
  });
@@ -58,6 +61,9 @@ BoxScore.createEmptySettingStats = () => ({
58
61
  });
59
62
  BoxScore.createEmptyDefenseStats = () => ({
60
63
  digs: 0,
64
+ digsPerfect: 0,
65
+ digsMediocre: 0,
66
+ digsBad: 0,
61
67
  errors: 0
62
68
  });
63
69
  BoxScore.createEmptyMiscStats = () => ({
@@ -6,6 +6,7 @@ export declare const AttackStatsSchema: z.ZodObject<{
6
6
  attempts: z.ZodNumber;
7
7
  kills: z.ZodNumber;
8
8
  errors: z.ZodNumber;
9
+ blocked: z.ZodNumber;
9
10
  }, z.core.$strip>;
10
11
  export declare const ServeStatsSchema: z.ZodObject<{
11
12
  attempts: z.ZodNumber;
@@ -16,6 +17,8 @@ export declare const ReceptionStatsSchema: z.ZodObject<{
16
17
  attempts: z.ZodNumber;
17
18
  perfect: z.ZodNumber;
18
19
  positive: z.ZodNumber;
20
+ ok: z.ZodNumber;
21
+ negative: z.ZodNumber;
19
22
  overpasses: z.ZodNumber;
20
23
  errors: z.ZodNumber;
21
24
  }, z.core.$strip>;
@@ -32,6 +35,9 @@ export declare const SettingStatsSchema: z.ZodObject<{
32
35
  }, z.core.$strip>;
33
36
  export declare const DefenseStatsSchema: z.ZodObject<{
34
37
  digs: z.ZodNumber;
38
+ digsPerfect: z.ZodNumber;
39
+ digsMediocre: z.ZodNumber;
40
+ digsBad: z.ZodNumber;
35
41
  errors: z.ZodNumber;
36
42
  }, z.core.$strip>;
37
43
  export declare const MiscStatsSchema: z.ZodObject<{
@@ -51,6 +57,7 @@ export declare const BoxScoreInputSchema: z.ZodObject<{
51
57
  attempts: z.ZodNumber;
52
58
  kills: z.ZodNumber;
53
59
  errors: z.ZodNumber;
60
+ blocked: z.ZodNumber;
54
61
  }, z.core.$strip>;
55
62
  serve: z.ZodObject<{
56
63
  attempts: z.ZodNumber;
@@ -61,6 +68,8 @@ export declare const BoxScoreInputSchema: z.ZodObject<{
61
68
  attempts: z.ZodNumber;
62
69
  perfect: z.ZodNumber;
63
70
  positive: z.ZodNumber;
71
+ ok: z.ZodNumber;
72
+ negative: z.ZodNumber;
64
73
  overpasses: z.ZodNumber;
65
74
  errors: z.ZodNumber;
66
75
  }, z.core.$strip>;
@@ -77,6 +86,9 @@ export declare const BoxScoreInputSchema: z.ZodObject<{
77
86
  }, z.core.$strip>;
78
87
  defense: z.ZodObject<{
79
88
  digs: z.ZodNumber;
89
+ digsPerfect: z.ZodNumber;
90
+ digsMediocre: z.ZodNumber;
91
+ digsBad: z.ZodNumber;
80
92
  errors: z.ZodNumber;
81
93
  }, z.core.$strip>;
82
94
  misc: z.ZodObject<{
@@ -12,11 +12,15 @@ const nonNegInt = zod_1.z.number().int().min(0);
12
12
  exports.AttackStatsSchema = zod_1.z.object({
13
13
  attempts: nonNegInt,
14
14
  kills: nonNegInt,
15
- errors: nonNegInt
15
+ errors: nonNegInt,
16
+ blocked: nonNegInt
16
17
  }).superRefine((v, ctx) => {
17
18
  if (v.errors > v.attempts) {
18
19
  ctx.addIssue({ code: 'custom', message: 'ATTACK_ERRORS_EXCEEDS_ATTEMPTS', path: ['errors'] });
19
20
  }
21
+ if (v.blocked > v.errors) {
22
+ ctx.addIssue({ code: 'custom', message: 'ATTACK_BLOCKED_EXCEEDS_ERRORS', path: ['blocked'] });
23
+ }
20
24
  });
21
25
  exports.ServeStatsSchema = zod_1.z.object({
22
26
  attempts: nonNegInt,
@@ -31,10 +35,12 @@ exports.ReceptionStatsSchema = zod_1.z.object({
31
35
  attempts: nonNegInt,
32
36
  perfect: nonNegInt,
33
37
  positive: nonNegInt,
38
+ ok: nonNegInt,
39
+ negative: nonNegInt,
34
40
  overpasses: nonNegInt,
35
41
  errors: nonNegInt
36
42
  }).superRefine((v, ctx) => {
37
- const sum = v.perfect + v.positive + v.overpasses + v.errors;
43
+ const sum = v.perfect + v.positive + v.ok + v.negative + v.overpasses + v.errors;
38
44
  if (sum > v.attempts) {
39
45
  ctx.addIssue({ code: 'custom', message: 'RECEPTION_COMPONENTS_EXCEED_ATTEMPTS', path: ['attempts'] });
40
46
  }
@@ -57,7 +63,14 @@ exports.SettingStatsSchema = zod_1.z.object({
57
63
  });
58
64
  exports.DefenseStatsSchema = zod_1.z.object({
59
65
  digs: nonNegInt,
66
+ digsPerfect: nonNegInt,
67
+ digsMediocre: nonNegInt,
68
+ digsBad: nonNegInt,
60
69
  errors: nonNegInt
70
+ }).superRefine((v, ctx) => {
71
+ if (v.digsPerfect + v.digsMediocre + v.digsBad > v.digs) {
72
+ ctx.addIssue({ code: 'custom', message: 'DIG_QUALITY_SPLIT_EXCEEDS_DIGS', path: ['digs'] });
73
+ }
61
74
  });
62
75
  exports.MiscStatsSchema = zod_1.z.object({
63
76
  pointsPlayed: nonNegInt,
@@ -92,6 +92,7 @@ export declare const PlayerInputSchema: z.ZodObject<{
92
92
  attempts: z.ZodNumber;
93
93
  kills: z.ZodNumber;
94
94
  errors: z.ZodNumber;
95
+ blocked: z.ZodNumber;
95
96
  }, z.core.$strip>;
96
97
  serve: z.ZodObject<{
97
98
  attempts: z.ZodNumber;
@@ -102,6 +103,8 @@ export declare const PlayerInputSchema: z.ZodObject<{
102
103
  attempts: z.ZodNumber;
103
104
  perfect: z.ZodNumber;
104
105
  positive: z.ZodNumber;
106
+ ok: z.ZodNumber;
107
+ negative: z.ZodNumber;
105
108
  overpasses: z.ZodNumber;
106
109
  errors: z.ZodNumber;
107
110
  }, z.core.$strip>;
@@ -118,6 +121,9 @@ export declare const PlayerInputSchema: z.ZodObject<{
118
121
  }, z.core.$strip>;
119
122
  defense: z.ZodObject<{
120
123
  digs: z.ZodNumber;
124
+ digsPerfect: z.ZodNumber;
125
+ digsMediocre: z.ZodNumber;
126
+ digsBad: z.ZodNumber;
121
127
  errors: z.ZodNumber;
122
128
  }, z.core.$strip>;
123
129
  misc: z.ZodObject<{
@@ -133,6 +139,7 @@ export declare const PlayerInputSchema: z.ZodObject<{
133
139
  attempts: z.ZodNumber;
134
140
  kills: z.ZodNumber;
135
141
  errors: z.ZodNumber;
142
+ blocked: z.ZodNumber;
136
143
  }, z.core.$strip>;
137
144
  serve: z.ZodObject<{
138
145
  attempts: z.ZodNumber;
@@ -143,6 +150,8 @@ export declare const PlayerInputSchema: z.ZodObject<{
143
150
  attempts: z.ZodNumber;
144
151
  perfect: z.ZodNumber;
145
152
  positive: z.ZodNumber;
153
+ ok: z.ZodNumber;
154
+ negative: z.ZodNumber;
146
155
  overpasses: z.ZodNumber;
147
156
  errors: z.ZodNumber;
148
157
  }, z.core.$strip>;
@@ -159,6 +168,9 @@ export declare const PlayerInputSchema: z.ZodObject<{
159
168
  }, z.core.$strip>;
160
169
  defense: z.ZodObject<{
161
170
  digs: z.ZodNumber;
171
+ digsPerfect: z.ZodNumber;
172
+ digsMediocre: z.ZodNumber;
173
+ digsBad: z.ZodNumber;
162
174
  errors: z.ZodNumber;
163
175
  }, z.core.$strip>;
164
176
  misc: z.ZodObject<{
@@ -6,6 +6,7 @@ interface TraitProps {
6
6
  readonly chance: number;
7
7
  readonly roles: Role[];
8
8
  readonly maxRarity?: Rarity;
9
+ readonly params?: Readonly<Record<string, number>>;
9
10
  }
10
11
  export declare enum TraitEnum {
11
12
  /**
@@ -17,7 +17,11 @@
17
17
  "OPPOSITE_HITTER",
18
18
  "OUTSIDE_HITTER",
19
19
  "MIDDLE_BLOCKER"
20
- ]
20
+ ],
21
+ "params": {
22
+ "dumpPower": 2,
23
+ "dumpFreqMult": 1.5
24
+ }
21
25
  },
22
26
  {
23
27
  "name": "MOVING_WALL",
@@ -59,7 +63,11 @@
59
63
  "OPPOSITE_HITTER",
60
64
  "OUTSIDE_HITTER",
61
65
  "MIDDLE_BLOCKER"
62
- ]
66
+ ],
67
+ "params": {
68
+ "servePower": 1.14,
69
+ "receptionPenalty": 0.9
70
+ }
63
71
  },
64
72
  {
65
73
  "name": "VIGOROUS",
@@ -89,7 +97,12 @@
89
97
  "LIBERO",
90
98
  "OUTSIDE_HITTER",
91
99
  "MIDDLE_BLOCKER"
92
- ]
100
+ ],
101
+ "params": {
102
+ "digBonus": 0.1,
103
+ "digCap": 0.85,
104
+ "blockBonus": 0.1
105
+ }
93
106
  },
94
107
  {
95
108
  "name": "QUICK_LEARNER",
@@ -98,7 +111,10 @@
98
111
  "SETTER",
99
112
  "LIBERO",
100
113
  "OUTSIDE_HITTER"
101
- ]
114
+ ],
115
+ "params": {
116
+ "streakThreshold": 3
117
+ }
102
118
  },
103
119
  {
104
120
  "name": "MOMENTUM_ADDICT",
@@ -106,7 +122,13 @@
106
122
  "roles": [
107
123
  "OUTSIDE_HITTER",
108
124
  "OPPOSITE_HITTER"
109
- ]
125
+ ],
126
+ "params": {
127
+ "start": 0.9,
128
+ "perSuccess": 0.03,
129
+ "perKill": 0.06,
130
+ "cap": 1.2
131
+ }
110
132
  },
111
133
  {
112
134
  "name": "LOUDMOUTH",
@@ -115,7 +137,11 @@
115
137
  "OUTSIDE_HITTER",
116
138
  "OPPOSITE_HITTER",
117
139
  "MIDDLE_BLOCKER"
118
- ]
140
+ ],
141
+ "params": {
142
+ "debuffMagnitude": 0.8,
143
+ "debuffRallies": 3
144
+ }
119
145
  },
120
146
  {
121
147
  "name": "TRUE_LEADER",
@@ -138,7 +164,10 @@
138
164
  "OPPOSITE_HITTER",
139
165
  "MIDDLE_BLOCKER",
140
166
  "LIBERO"
141
- ]
167
+ ],
168
+ "params": {
169
+ "threshold": 120
170
+ }
142
171
  },
143
172
  {
144
173
  "name": "CRAFTY",
@@ -148,7 +177,10 @@
148
177
  "OUTSIDE_HITTER",
149
178
  "OPPOSITE_HITTER",
150
179
  "MIDDLE_BLOCKER"
151
- ]
180
+ ],
181
+ "params": {
182
+ "drainMult": 2
183
+ }
152
184
  },
153
185
  {
154
186
  "name": "TENACIOUS",
@@ -159,7 +191,12 @@
159
191
  "OPPOSITE_HITTER",
160
192
  "MIDDLE_BLOCKER",
161
193
  "LIBERO"
162
- ]
194
+ ],
195
+ "params": {
196
+ "base": 0.2,
197
+ "cap": 0.6,
198
+ "minStreak": 3
199
+ }
163
200
  },
164
201
  {
165
202
  "name": "HUNTER",
@@ -169,13 +206,20 @@
169
206
  "OUTSIDE_HITTER",
170
207
  "OPPOSITE_HITTER",
171
208
  "MIDDLE_BLOCKER"
172
- ]
209
+ ],
210
+ "params": {
211
+ "servePower": 1.08,
212
+ "attackFactor": 0.66
213
+ }
173
214
  },
174
215
  {
175
216
  "name": "LAST_RESORT",
176
217
  "chance": 0.1,
177
218
  "roles": [
178
219
  "LIBERO"
179
- ]
220
+ ],
221
+ "params": {
222
+ "freeballScore": 25
223
+ }
180
224
  }
181
225
  ]
@@ -7,12 +7,15 @@ export interface BoxScoreAttributes {
7
7
  attack_attempts: number;
8
8
  attack_kills: number;
9
9
  attack_errors: number;
10
+ attack_blocked: number;
10
11
  serve_attempts: number;
11
12
  serve_aces: number;
12
13
  serve_errors: number;
13
14
  reception_attempts: number;
14
15
  reception_perfect: number;
15
16
  reception_positive: number;
17
+ reception_ok: number;
18
+ reception_negative: number;
16
19
  reception_overpasses: number;
17
20
  reception_errors: number;
18
21
  block_solo: number;
@@ -23,6 +26,9 @@ export interface BoxScoreAttributes {
23
26
  setting_errors: number;
24
27
  setting_pass: number;
25
28
  defense_digs: number;
29
+ defense_digs_perfect: number;
30
+ defense_digs_mediocre: number;
31
+ defense_digs_bad: number;
26
32
  defense_errors: number;
27
33
  misc_points_played: number;
28
34
  misc_points_won_on_court: number;
@@ -39,12 +45,15 @@ export declare class BoxScoreModel extends Model<BoxScoreAttributes, BoxScoreCre
39
45
  attack_attempts: number;
40
46
  attack_kills: number;
41
47
  attack_errors: number;
48
+ attack_blocked: number;
42
49
  serve_attempts: number;
43
50
  serve_aces: number;
44
51
  serve_errors: number;
45
52
  reception_attempts: number;
46
53
  reception_perfect: number;
47
54
  reception_positive: number;
55
+ reception_ok: number;
56
+ reception_negative: number;
48
57
  reception_overpasses: number;
49
58
  reception_errors: number;
50
59
  block_solo: number;
@@ -55,6 +64,9 @@ export declare class BoxScoreModel extends Model<BoxScoreAttributes, BoxScoreCre
55
64
  setting_errors: number;
56
65
  setting_pass: number;
57
66
  defense_digs: number;
67
+ defense_digs_perfect: number;
68
+ defense_digs_mediocre: number;
69
+ defense_digs_bad: number;
58
70
  defense_errors: number;
59
71
  misc_points_played: number;
60
72
  misc_points_won_on_court: number;
@@ -36,6 +36,11 @@ export class BoxScoreModel extends Model {
36
36
  allowNull: false,
37
37
  defaultValue: 0
38
38
  },
39
+ attack_blocked: {
40
+ type: DataTypes.SMALLINT,
41
+ allowNull: false,
42
+ defaultValue: 0
43
+ },
39
44
  // Serve
40
45
  serve_attempts: {
41
46
  type: DataTypes.SMALLINT,
@@ -68,6 +73,16 @@ export class BoxScoreModel extends Model {
68
73
  allowNull: false,
69
74
  defaultValue: 0
70
75
  },
76
+ reception_ok: {
77
+ type: DataTypes.SMALLINT,
78
+ allowNull: false,
79
+ defaultValue: 0
80
+ },
81
+ reception_negative: {
82
+ type: DataTypes.SMALLINT,
83
+ allowNull: false,
84
+ defaultValue: 0
85
+ },
71
86
  reception_overpasses: {
72
87
  type: DataTypes.SMALLINT,
73
88
  allowNull: false,
@@ -121,6 +136,21 @@ export class BoxScoreModel extends Model {
121
136
  allowNull: false,
122
137
  defaultValue: 0
123
138
  },
139
+ defense_digs_perfect: {
140
+ type: DataTypes.SMALLINT,
141
+ allowNull: false,
142
+ defaultValue: 0
143
+ },
144
+ defense_digs_mediocre: {
145
+ type: DataTypes.SMALLINT,
146
+ allowNull: false,
147
+ defaultValue: 0
148
+ },
149
+ defense_digs_bad: {
150
+ type: DataTypes.SMALLINT,
151
+ allowNull: false,
152
+ defaultValue: 0
153
+ },
124
154
  defense_errors: {
125
155
  type: DataTypes.SMALLINT,
126
156
  allowNull: false,