volleyballsimtypes 0.0.168 → 0.0.170

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 (49) hide show
  1. package/dist/cjs/src/data/common/index.d.ts +0 -1
  2. package/dist/cjs/src/data/common/index.js +0 -1
  3. package/dist/cjs/src/data/models/performance-stats.d.ts +2 -2
  4. package/dist/cjs/src/data/models/performance-stats.js +1 -1
  5. package/dist/cjs/src/data/transformers/performance-stats.js +2 -2
  6. package/dist/cjs/src/service/event/events.d.ts +93 -0
  7. package/dist/cjs/src/{data/common → service/event}/events.js +4 -5
  8. package/dist/cjs/src/service/event/index.d.ts +1 -0
  9. package/dist/cjs/src/service/event/index.js +1 -0
  10. package/dist/cjs/src/service/event/rally-event.d.ts +3 -3
  11. package/dist/cjs/src/service/player/performance-stats.d.ts +1 -1
  12. package/dist/cjs/src/service/player/performance-stats.js +1 -1
  13. package/dist/cjs/src/service/player/stats.js +1 -2
  14. package/dist/cjs/src/service/player/trait.d.ts +34 -8
  15. package/dist/cjs/src/service/player/trait.js +41 -11
  16. package/dist/cjs/src/service/utils/index.d.ts +2 -0
  17. package/dist/cjs/src/service/utils/index.js +2 -0
  18. package/dist/cjs/src/service/utils/number-utils.d.ts +1 -0
  19. package/dist/cjs/src/service/utils/number-utils.js +7 -0
  20. package/dist/cjs/src/service/utils/rng-utils.d.ts +7 -0
  21. package/dist/cjs/src/service/utils/rng-utils.js +32 -0
  22. package/dist/cjs/src/stat-config/roles.json +5 -5
  23. package/dist/cjs/src/stat-config/traits.json +61 -25
  24. package/dist/esm/src/data/common/index.d.ts +0 -1
  25. package/dist/esm/src/data/common/index.js +0 -1
  26. package/dist/esm/src/data/models/performance-stats.d.ts +2 -2
  27. package/dist/esm/src/data/models/performance-stats.js +1 -1
  28. package/dist/esm/src/data/transformers/performance-stats.js +2 -2
  29. package/dist/esm/src/service/event/events.d.ts +93 -0
  30. package/dist/esm/src/{data/common → service/event}/events.js +4 -5
  31. package/dist/esm/src/service/event/index.d.ts +1 -0
  32. package/dist/esm/src/service/event/index.js +1 -0
  33. package/dist/esm/src/service/event/rally-event.d.ts +3 -3
  34. package/dist/esm/src/service/player/performance-stats.d.ts +1 -1
  35. package/dist/esm/src/service/player/performance-stats.js +1 -1
  36. package/dist/esm/src/service/player/stats.js +1 -2
  37. package/dist/esm/src/service/player/trait.d.ts +34 -8
  38. package/dist/esm/src/service/player/trait.js +41 -11
  39. package/dist/esm/src/service/utils/index.d.ts +2 -0
  40. package/dist/esm/src/service/utils/index.js +2 -0
  41. package/dist/esm/src/service/utils/number-utils.d.ts +1 -0
  42. package/dist/esm/src/service/utils/number-utils.js +3 -0
  43. package/dist/esm/src/service/utils/rng-utils.d.ts +7 -0
  44. package/dist/esm/src/service/utils/rng-utils.js +27 -0
  45. package/dist/esm/src/stat-config/roles.json +5 -5
  46. package/dist/esm/src/stat-config/traits.json +61 -25
  47. package/package.json +1 -1
  48. package/dist/cjs/src/data/common/events.d.ts +0 -82
  49. package/dist/esm/src/data/common/events.d.ts +0 -82
@@ -1,2 +1 @@
1
1
  export * from './status';
2
- export * from './events';
@@ -15,4 +15,3 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./status"), exports);
18
- __exportStar(require("./events"), exports);
@@ -20,7 +20,7 @@ export interface PerformanceStatsAttributes {
20
20
  focus: number;
21
21
  defense: number;
22
22
  stamina: number;
23
- saving: number;
23
+ reflex: number;
24
24
  }
25
25
  export type PerformanceStatsPk = 'player_id';
26
26
  export type PerformanceStatsId = PerformanceStatsModel[PerformanceStatsPk];
@@ -44,7 +44,7 @@ export declare class PerformanceStatsModel extends Model<PerformanceStatsAttribu
44
44
  focus: number;
45
45
  defense: number;
46
46
  stamina: number;
47
- saving: number;
47
+ reflex: number;
48
48
  player: PlayerModel;
49
49
  getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
50
50
  setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
@@ -99,7 +99,7 @@ class PerformanceStatsModel extends sequelize_1.Model {
99
99
  allowNull: false,
100
100
  defaultValue: 0
101
101
  },
102
- saving: {
102
+ reflex: {
103
103
  type: sequelize_1.DataTypes.INTEGER,
104
104
  allowNull: false,
105
105
  defaultValue: 0
@@ -22,7 +22,7 @@ function transformToAttributes(player) {
22
22
  setting: player.stats.setting,
23
23
  spike: player.stats.spike,
24
24
  stamina: player.stats.stamina,
25
- saving: player.stats.saving
25
+ reflex: player.stats.reflex
26
26
  };
27
27
  }
28
28
  exports.transformFromPerformanceStats = transformToAttributes;
@@ -45,7 +45,7 @@ function transformToObject(model) {
45
45
  focus: model.focus,
46
46
  defense: model.defense,
47
47
  stamina: model.stamina,
48
- saving: model.saving
48
+ reflex: model.reflex
49
49
  });
50
50
  }
51
51
  exports.transformToPerformanceStats = transformToObject;
@@ -0,0 +1,93 @@
1
+ export declare enum EventTypeEnum {
2
+ LIBERO_REPLACEMENT = 0,
3
+ SUBSTITUTION = 1,
4
+ SERVE = 2,
5
+ RECEPTION = 3,
6
+ SET = 4,
7
+ SPIKE = 5,
8
+ BLOCK = 6
9
+ }
10
+ export type EventType = EventTypeEnum.LIBERO_REPLACEMENT | EventTypeEnum.SUBSTITUTION | EventTypeEnum.SERVE | EventTypeEnum.RECEPTION | EventTypeEnum.SET | EventTypeEnum.SPIKE | EventTypeEnum.BLOCK;
11
+ export declare enum BlockFailureEnum {
12
+ NO_FAILURE = 0,
13
+ MISS = 1,
14
+ FAULT = 2,
15
+ OUT_OF_BOUNDS = 3,
16
+ WIPE = 4,
17
+ TOOL = 5
18
+ }
19
+ export type BlockFailure = BlockFailureEnum.NO_FAILURE | BlockFailureEnum.MISS | BlockFailureEnum.FAULT | BlockFailureEnum.OUT_OF_BOUNDS | BlockFailureEnum.WIPE | BlockFailureEnum.TOOL;
20
+ export declare enum BlockTypeEnum {
21
+ NO_BLOCKER = 0,
22
+ SINGLE = 1,
23
+ DOUBLE = 2,
24
+ TRIPLE = 3
25
+ }
26
+ export type BlockType = BlockTypeEnum.NO_BLOCKER | BlockTypeEnum.SINGLE | BlockTypeEnum.DOUBLE | BlockTypeEnum.TRIPLE;
27
+ export declare enum LiberoReplacementTypeEnum {
28
+ LIBERO_IN = 0,
29
+ LIBERO_OUT = 1
30
+ }
31
+ export type LiberoReplacementType = LiberoReplacementTypeEnum.LIBERO_IN | LiberoReplacementTypeEnum.LIBERO_OUT;
32
+ export declare enum ReceptionTypeEnum {
33
+ DIG = 0,
34
+ OVERHAND = 1,
35
+ ONE_HAND = 2,
36
+ OTHER_BODY_PART = 3
37
+ }
38
+ export type ReceptionType = ReceptionTypeEnum.DIG | ReceptionTypeEnum.OVERHAND | ReceptionTypeEnum.ONE_HAND | ReceptionTypeEnum.OTHER_BODY_PART;
39
+ export declare enum ReceptionFailureEnum {
40
+ NO_FAILURE = 0,
41
+ FAULT = 1,
42
+ MISS = 2,
43
+ OUT_OF_BOUNDS = 3,
44
+ BAD_PASS = 4
45
+ }
46
+ export type ReceptionFailure = ReceptionFailureEnum.NO_FAILURE | ReceptionFailureEnum.FAULT | ReceptionFailureEnum.MISS | ReceptionFailureEnum.OUT_OF_BOUNDS | ReceptionFailureEnum.BAD_PASS;
47
+ export declare enum ServeTypeEnum {
48
+ OVERHAND_TOPSPIN = 0,
49
+ OVERHAND_FLOAT = 1,
50
+ JUMP_TOPSPIN = 2,
51
+ JUMP_FLOAT = 3
52
+ }
53
+ export type ServeType = ServeTypeEnum.OVERHAND_TOPSPIN | ServeTypeEnum.OVERHAND_FLOAT | ServeTypeEnum.JUMP_TOPSPIN | ServeTypeEnum.JUMP_FLOAT;
54
+ export declare enum ServeFailureEnum {
55
+ NO_FAILURE = 0,
56
+ FAULT = 1,
57
+ MISS = 2,
58
+ NET = 3,
59
+ OUT_OF_BOUNDS = 4
60
+ }
61
+ export type ServeFailure = ServeFailureEnum.NO_FAILURE | ServeFailureEnum.FAULT | ServeFailureEnum.MISS | ServeFailureEnum.NET | ServeFailureEnum.OUT_OF_BOUNDS;
62
+ export declare enum SetTypeEnum {
63
+ OVERHAND = 0,
64
+ UNDERHAND = 1,
65
+ SPIKE = 2,
66
+ DUMP = 3
67
+ }
68
+ export type SetType = SetTypeEnum.OVERHAND | SetTypeEnum.UNDERHAND | SetTypeEnum.SPIKE | SetTypeEnum.DUMP;
69
+ export declare enum SetFailureEnum {
70
+ NO_FAILURE = 0,
71
+ FAULT = 1,
72
+ MISS = 2,
73
+ BAD_PASS = 3,
74
+ OUT_OF_BOUNDS = 4
75
+ }
76
+ export type SetFailure = SetFailureEnum.NO_FAILURE | SetFailureEnum.FAULT | SetFailureEnum.MISS | SetFailureEnum.BAD_PASS | SetFailureEnum.OUT_OF_BOUNDS;
77
+ export declare enum SpikeTypeEnum {
78
+ CROSS_SHOT = 0,
79
+ LINE_SHOT = 1,
80
+ TOOL_SHOT = 2,
81
+ TIP = 3,
82
+ DOWN_BALL = 4,
83
+ OVERHAND = 5
84
+ }
85
+ export type SpikeType = SpikeTypeEnum.CROSS_SHOT | SpikeTypeEnum.LINE_SHOT | SpikeTypeEnum.TOOL_SHOT | SpikeTypeEnum.TIP | SpikeTypeEnum.DOWN_BALL | SpikeTypeEnum.OVERHAND;
86
+ export declare enum SpikeFailureEnum {
87
+ NO_FAILURE = 0,
88
+ FAULT = 1,
89
+ MISS = 2,
90
+ OUT_OF_BOUNDS = 3,
91
+ NET = 4
92
+ }
93
+ export type SpikeFailure = SpikeFailureEnum.NO_FAILURE | SpikeFailureEnum.FAULT | SpikeFailureEnum.MISS | SpikeFailureEnum.OUT_OF_BOUNDS | SpikeFailureEnum.NET;
@@ -49,11 +49,10 @@ var ReceptionFailureEnum;
49
49
  })(ReceptionFailureEnum = exports.ReceptionFailureEnum || (exports.ReceptionFailureEnum = {}));
50
50
  var ServeTypeEnum;
51
51
  (function (ServeTypeEnum) {
52
- ServeTypeEnum[ServeTypeEnum["UNDERHAND"] = 0] = "UNDERHAND";
53
- ServeTypeEnum[ServeTypeEnum["OVERHAND_TOPSPIN"] = 1] = "OVERHAND_TOPSPIN";
54
- ServeTypeEnum[ServeTypeEnum["OVERHAND_FLOAT"] = 2] = "OVERHAND_FLOAT";
55
- ServeTypeEnum[ServeTypeEnum["JUMP_TOPSPIN"] = 3] = "JUMP_TOPSPIN";
56
- ServeTypeEnum[ServeTypeEnum["JUMP_FLOAT"] = 4] = "JUMP_FLOAT";
52
+ ServeTypeEnum[ServeTypeEnum["OVERHAND_TOPSPIN"] = 0] = "OVERHAND_TOPSPIN";
53
+ ServeTypeEnum[ServeTypeEnum["OVERHAND_FLOAT"] = 1] = "OVERHAND_FLOAT";
54
+ ServeTypeEnum[ServeTypeEnum["JUMP_TOPSPIN"] = 2] = "JUMP_TOPSPIN";
55
+ ServeTypeEnum[ServeTypeEnum["JUMP_FLOAT"] = 3] = "JUMP_FLOAT";
57
56
  })(ServeTypeEnum = exports.ServeTypeEnum || (exports.ServeTypeEnum = {}));
58
57
  var ServeFailureEnum;
59
58
  (function (ServeFailureEnum) {
@@ -1 +1,2 @@
1
1
  export * from './rally-event';
2
+ export * from './events';
@@ -15,3 +15,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./rally-event"), exports);
18
+ __exportStar(require("./events"), exports);
@@ -1,11 +1,11 @@
1
- import { EventTypeEnum } from '../../data';
1
+ import { EventType } from './events';
2
2
  export interface RallyEventOpts {
3
3
  readonly player: string;
4
- readonly eventType: EventTypeEnum;
4
+ readonly eventType: EventType;
5
5
  }
6
6
  export declare abstract class RallyEvent {
7
7
  readonly player: string;
8
- readonly eventType: EventTypeEnum;
8
+ readonly eventType: EventType;
9
9
  protected constructor({ eventType, player }: RallyEventOpts);
10
10
  abstract toString(): string;
11
11
  }
@@ -1,4 +1,4 @@
1
- export declare const performanceStatKeys: readonly ["setting", "serve", "spike", "quick", "power", "awareness", "attack", "backAttack", "reception", "overhand", "bump", "block", "read", "commit", "focus", "defense", "stamina", "saving"];
1
+ export declare const performanceStatKeys: readonly ["setting", "serve", "spike", "quick", "power", "awareness", "attack", "backAttack", "reception", "overhand", "bump", "block", "read", "commit", "focus", "defense", "stamina", "reflex"];
2
2
  export type PerformanceStatsKey = typeof performanceStatKeys[number];
3
3
  export type PerformanceStatsParams = Record<PerformanceStatsKey, number>;
4
4
  export interface PerformanceStats extends PerformanceStatsParams {
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PerformanceStats = exports.performanceStatKeys = void 0;
4
4
  exports.performanceStatKeys = ['setting', 'serve', 'spike', 'quick', 'power', 'awareness', 'attack', 'backAttack',
5
- 'reception', 'overhand', 'bump', 'block', 'read', 'commit', 'focus', 'defense', 'stamina', 'saving'];
5
+ 'reception', 'overhand', 'bump', 'block', 'read', 'commit', 'focus', 'defense', 'stamina', 'reflex'];
6
6
  class PerformanceStats {
7
7
  constructor(opts) {
8
8
  Object.assign(this, opts);
@@ -30,9 +30,8 @@ function getMultipliers(statName, performanceStats) {
30
30
  };
31
31
  case StatsEnum.SET:
32
32
  return {
33
- setting: 0.7,
33
+ setting: 0.75,
34
34
  overhand: 0.1,
35
- bump: 0.05,
36
35
  awareness: 0.075,
37
36
  attack: 0.075
38
37
  };
@@ -1,26 +1,52 @@
1
- import { PerformanceStats } from './performance-stats';
2
1
  import { Rarity } from './rarity';
3
2
  import { EnumDataType } from 'sequelize';
4
- import { Stats } from './stats';
3
+ import { Role } from './role';
5
4
  interface TraitProps {
6
5
  readonly name: Trait;
7
6
  readonly modifier: number;
8
7
  readonly chance: number;
9
- readonly statThreshold: number;
10
- readonly stat: Stats;
11
- readonly weight: number;
8
+ readonly roles: Role[];
12
9
  }
13
10
  export declare enum TraitEnum {
11
+ /**
12
+ * When triggered, all actions before the net crossing have a bonus.
13
+ */
14
14
  MASTER_MIND = "MASTER_MIND",
15
+ /**
16
+ * When this player is part of the front row, they will always be part of the blocking block
17
+ */
15
18
  MOVING_WALL = "MOVING_WALL",
19
+ /**
20
+ * Enables the player making the second touch to spike or dump
21
+ */
22
+ SURPRISE_ATTACK = "SURPRISE_ATTACK",
23
+ /**
24
+ * Boosts the stat of the action taken and allows the player to choose the best target for the action.
25
+ */
16
26
  MARKSMAN = "MARKSMAN",
27
+ /**
28
+ * The server will perform an extra strong serve.
29
+ */
17
30
  METEOR_SERVE = "METEOR_SERVE",
31
+ /**
32
+ * The player has a 50% chance to perform an action with no energy decrease
33
+ */
18
34
  VIGOROUS = "VIGOROUS",
35
+ /**
36
+ * The player with this trait has a chance to take the receiver's place if their reception stat is higher.
37
+ */
19
38
  GUARDIAN = "GUARDIAN",
20
- FLOAT_SERVE = "FLOAT_SERVE"
39
+ /**
40
+ * Enables the server to perform a float serve, which checks against receiver overhand instead.
41
+ */
42
+ FLOAT_SERVE = "FLOAT_SERVE",
43
+ /**
44
+ * Gives the player a chance to perform a perfect reception.
45
+ */
46
+ DEFENSIVE_SPECIALIST = "DEFENSIVE_SPECIALIST"
21
47
  }
22
- export type Trait = TraitEnum.FLOAT_SERVE | TraitEnum.GUARDIAN | TraitEnum.MASTER_MIND | TraitEnum.MOVING_WALL | TraitEnum.MARKSMAN | TraitEnum.METEOR_SERVE | TraitEnum.VIGOROUS;
48
+ export type Trait = TraitEnum.FLOAT_SERVE | TraitEnum.SURPRISE_ATTACK | TraitEnum.GUARDIAN | TraitEnum.MASTER_MIND | TraitEnum.MOVING_WALL | TraitEnum.MARKSMAN | TraitEnum.METEOR_SERVE | TraitEnum.VIGOROUS | TraitEnum.DEFENSIVE_SPECIALIST;
23
49
  export declare const TraitDataType: EnumDataType<Trait>;
24
- export declare function assignTraits(performanceStats: PerformanceStats, rarity: Rarity): Trait[];
50
+ export declare function assignTraits(roles: Role[], rarity: Rarity): Trait[];
25
51
  export declare const traitMap: Map<Trait, TraitProps>;
26
52
  export {};
@@ -8,40 +8,69 @@ const rarity_1 = require("./rarity");
8
8
  const node_crypto_1 = require("node:crypto");
9
9
  const traits_json_1 = __importDefault(require("../../stat-config/traits.json"));
10
10
  const sequelize_1 = require("sequelize");
11
- const stats_1 = require("./stats");
11
+ const utils_1 = require("../utils");
12
12
  const traits = traits_json_1.default;
13
13
  var TraitEnum;
14
14
  (function (TraitEnum) {
15
+ /**
16
+ * When triggered, all actions before the net crossing have a bonus.
17
+ */
15
18
  TraitEnum["MASTER_MIND"] = "MASTER_MIND";
19
+ /**
20
+ * When this player is part of the front row, they will always be part of the blocking block
21
+ */
16
22
  TraitEnum["MOVING_WALL"] = "MOVING_WALL";
23
+ /**
24
+ * Enables the player making the second touch to spike or dump
25
+ */
26
+ TraitEnum["SURPRISE_ATTACK"] = "SURPRISE_ATTACK";
27
+ /**
28
+ * Boosts the stat of the action taken and allows the player to choose the best target for the action.
29
+ */
17
30
  TraitEnum["MARKSMAN"] = "MARKSMAN";
31
+ /**
32
+ * The server will perform an extra strong serve.
33
+ */
18
34
  TraitEnum["METEOR_SERVE"] = "METEOR_SERVE";
35
+ /**
36
+ * The player has a 50% chance to perform an action with no energy decrease
37
+ */
19
38
  TraitEnum["VIGOROUS"] = "VIGOROUS";
39
+ /**
40
+ * The player with this trait has a chance to take the receiver's place if their reception stat is higher.
41
+ */
20
42
  TraitEnum["GUARDIAN"] = "GUARDIAN";
43
+ /**
44
+ * Enables the server to perform a float serve, which checks against receiver overhand instead.
45
+ */
21
46
  TraitEnum["FLOAT_SERVE"] = "FLOAT_SERVE";
47
+ /**
48
+ * Gives the player a chance to perform a perfect reception.
49
+ */
50
+ TraitEnum["DEFENSIVE_SPECIALIST"] = "DEFENSIVE_SPECIALIST";
22
51
  })(TraitEnum = exports.TraitEnum || (exports.TraitEnum = {}));
23
52
  exports.TraitDataType = sequelize_1.DataTypes.ENUM(...Object.values(TraitEnum));
24
- function assignTraits(performanceStats, rarity) {
53
+ function assignTraits(roles, rarity) {
25
54
  let traitCount;
26
55
  switch (rarity) {
27
56
  case rarity_1.RarityEnum.COMMON: {
28
- traitCount = 0;
57
+ traitCount = (0, node_crypto_1.randomInt)(0, 1);
29
58
  break;
30
59
  }
31
60
  case rarity_1.RarityEnum.RARE: {
32
- traitCount = (0, node_crypto_1.randomInt)(0, 1);
61
+ traitCount = (0, node_crypto_1.randomInt)(0, 2);
33
62
  break;
34
63
  }
35
64
  case rarity_1.RarityEnum.LEGENDARY: {
36
- traitCount = (0, node_crypto_1.randomInt)(0, 2);
65
+ traitCount = (0, node_crypto_1.randomInt)(1, 3);
37
66
  break;
38
67
  }
39
68
  case rarity_1.RarityEnum.MYTHIC: {
40
- traitCount = (0, node_crypto_1.randomInt)(1, 3);
69
+ traitCount = (0, node_crypto_1.randomInt)(2, 4);
41
70
  break;
42
71
  }
43
72
  case rarity_1.RarityEnum.SPECIAL: {
44
- traitCount = (0, node_crypto_1.randomInt)(2, 3);
73
+ traitCount = 4;
45
74
  break;
46
75
  }
47
76
  default:
@@ -49,10 +78,11 @@ function assignTraits(performanceStats, rarity) {
49
78
  }
50
79
  if (traitCount < 1)
51
80
  return [];
52
- return traits.filter((trait) => (0, stats_1.calculateStatScore)(performanceStats, trait.stat) >= trait.statThreshold)
53
- .sort((t1, t2) => t2.weight - t1.weight)
54
- .map((trait) => trait.name)
55
- .slice(0, traitCount);
81
+ const filteredTraits = traits.filter((trait) => {
82
+ const setA = new Set(trait.roles);
83
+ return roles.some(el => setA.has(el));
84
+ }).map(trait => trait.name);
85
+ return (0, utils_1.shuffle)(filteredTraits).slice(0, traitCount);
56
86
  }
57
87
  exports.assignTraits = assignTraits;
58
88
  exports.traitMap = new Map(traits.map((trait) => [trait.name, trait]));
@@ -1,2 +1,4 @@
1
1
  export * from './string-utils';
2
2
  export * from './object-utils';
3
+ export * from './number-utils';
4
+ export * from './rng-utils';
@@ -16,3 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./string-utils"), exports);
18
18
  __exportStar(require("./object-utils"), exports);
19
+ __exportStar(require("./number-utils"), exports);
20
+ __exportStar(require("./rng-utils"), exports);
@@ -0,0 +1 @@
1
+ export declare function clamp(min: number, max: number, value: number): number;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.clamp = void 0;
4
+ function clamp(min, max, value) {
5
+ return Math.max(min, Math.min(value, max));
6
+ }
7
+ exports.clamp = clamp;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Fisher-Yates shuffle algorithm
3
+ * Shuffles array IN-PLACE
4
+ * @param {any[]} array
5
+ */
6
+ export declare function shuffle<Type>(array: Type[]): Type[];
7
+ export declare function calculateProbability(score: number, scale: number, minP: number, maxP: number): number;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateProbability = exports.shuffle = void 0;
4
+ const number_utils_1 = require("./number-utils");
5
+ /**
6
+ * Fisher-Yates shuffle algorithm
7
+ * Shuffles array IN-PLACE
8
+ * @param {any[]} array
9
+ */
10
+ function shuffle(array) {
11
+ let m = array.length;
12
+ let t;
13
+ let i;
14
+ // While there remain elements to shuffle…
15
+ while (m > 0) {
16
+ // Pick a remaining element…
17
+ i = Math.floor(Math.random() * m--);
18
+ // And swap it with the current element.
19
+ t = array[m];
20
+ array[m] = array[i];
21
+ array[i] = t;
22
+ }
23
+ return array;
24
+ }
25
+ exports.shuffle = shuffle;
26
+ function calculateProbability(score, scale, minP, maxP) {
27
+ const x = score / scale;
28
+ const sigmoid = 1 / (1 + Math.exp(-x));
29
+ const p = minP + (maxP - minP) * sigmoid;
30
+ return (0, number_utils_1.clamp)(0, 1, p);
31
+ }
32
+ exports.calculateProbability = calculateProbability;
@@ -19,7 +19,7 @@
19
19
  "commit": 0,
20
20
  "focus": 0,
21
21
  "defense": 0,
22
- "saving": 0
22
+ "reflex": 0
23
23
  }
24
24
  },
25
25
  {
@@ -42,7 +42,7 @@
42
42
  "commit": 0,
43
43
  "focus": 0,
44
44
  "defense": 0,
45
- "saving": 0
45
+ "reflex": 0
46
46
  }
47
47
  },
48
48
  {
@@ -65,7 +65,7 @@
65
65
  "commit": 0,
66
66
  "focus": 0,
67
67
  "defense": 0,
68
- "saving": 0
68
+ "reflex": 0
69
69
  }
70
70
  },
71
71
  {
@@ -88,7 +88,7 @@
88
88
  "commit": 0,
89
89
  "focus": 0,
90
90
  "defense": 0,
91
- "saving": 0
91
+ "reflex": 0
92
92
  }
93
93
  },
94
94
  {
@@ -111,7 +111,7 @@
111
111
  "commit": 0,
112
112
  "focus": 0,
113
113
  "defense": 0,
114
- "saving": 0
114
+ "reflex": 0
115
115
  }
116
116
  }
117
117
  ]
@@ -3,56 +3,92 @@
3
3
  "name": "MASTER_MIND",
4
4
  "modifier": 1.1,
5
5
  "chance": 0.2,
6
- "statThreshold": 80,
7
- "stat": "SET",
8
- "weight": 10
6
+ "roles": [
7
+ "SETTER",
8
+ "LIBERO"
9
+ ]
10
+ },
11
+ {
12
+ "name": "SURPRISE_ATTACK",
13
+ "modifier": 1.2,
14
+ "chance": 0.07,
15
+ "roles": [
16
+ "SETTER",
17
+ "OPPOSITE_HITTER"
18
+ ]
9
19
  },
10
20
  {
11
21
  "name": "MOVING_WALL",
12
22
  "modifier": 1.1,
13
23
  "chance": 1,
14
- "statThreshold": 75,
15
- "stat": "BLOCK",
16
- "weight": 5
24
+ "roles": [
25
+ "MIDDLE_BLOCKER",
26
+ "OPPOSITE_HITTER",
27
+ "SETTER"
28
+ ]
17
29
  },
18
30
  {
19
31
  "name": "MARKSMAN",
20
32
  "modifier": 1.05,
21
- "chance": 0.3,
22
- "statThreshold": 75,
23
- "stat": "ATTACK",
24
- "weight": 5
33
+ "chance": 0.5,
34
+ "stat": [
35
+ "SETTER",
36
+ "OPPOSITE_HITTER",
37
+ "OUTSIDE_HITTER",
38
+ "MIDDLE_BLOCKER"
39
+ ]
25
40
  },
26
41
  {
27
42
  "name": "METEOR_SERVE",
28
- "modifier": 1.1,
29
- "chance": 0.1,
30
- "statThreshold": 75,
31
- "stat": "SERVE",
32
- "weight": 10
43
+ "modifier": 1.2,
44
+ "chance": 0.5,
45
+ "stat": [
46
+ "SETTER",
47
+ "OPPOSITE_HITTER",
48
+ "OUTSIDE_HITTER",
49
+ "MIDDLE_BLOCKER"
50
+ ]
33
51
  },
34
52
  {
35
53
  "name": "FLOAT_SERVE",
36
- "modifier": 1,
54
+ "modifier": 1.2,
37
55
  "chance": 0.5,
38
- "statThreshold": 60,
39
- "stat": "SERVE",
40
- "weight": 10
56
+ "stat": [
57
+ "SETTER",
58
+ "OPPOSITE_HITTER",
59
+ "LIBERO",
60
+ "OUTSIDE_HITTER",
61
+ "MIDDLE_BLOCKER"
62
+ ]
41
63
  },
42
64
  {
43
65
  "name": "VIGOROUS",
44
66
  "modifier": 1,
45
- "statThreshold": 60,
46
67
  "chance": 0.5,
47
- "stat": "STAMINA",
48
- "weight": 1
68
+ "roles": [
69
+ "SETTER",
70
+ "OPPOSITE_HITTER",
71
+ "LIBERO",
72
+ "OUTSIDE_HITTER",
73
+ "MIDDLE_BLOCKER"
74
+ ]
49
75
  },
50
76
  {
51
77
  "name": "GUARDIAN",
52
78
  "chance": 0.2,
53
- "statThreshold": 75,
54
79
  "modifier": 1.15,
55
- "stat": "RECEIVE",
56
- "weight": 10
80
+ "stat": [
81
+ "LIBERO",
82
+ "OUTSIDE_HITTER"
83
+ ]
84
+ },
85
+ {
86
+ "name": "DEFENSIVE_SPECIALIST",
87
+ "chance": 0.2,
88
+ "modifier": 1.2,
89
+ "stat": [
90
+ "LIBERO",
91
+ "OUTSIDE_HITTER"
92
+ ]
57
93
  }
58
94
  ]
@@ -1,2 +1 @@
1
1
  export * from './status';
2
- export * from './events';
@@ -1,2 +1 @@
1
1
  export * from './status';
2
- export * from './events';
@@ -20,7 +20,7 @@ export interface PerformanceStatsAttributes {
20
20
  focus: number;
21
21
  defense: number;
22
22
  stamina: number;
23
- saving: number;
23
+ reflex: number;
24
24
  }
25
25
  export type PerformanceStatsPk = 'player_id';
26
26
  export type PerformanceStatsId = PerformanceStatsModel[PerformanceStatsPk];
@@ -44,7 +44,7 @@ export declare class PerformanceStatsModel extends Model<PerformanceStatsAttribu
44
44
  focus: number;
45
45
  defense: number;
46
46
  stamina: number;
47
- saving: number;
47
+ reflex: number;
48
48
  player: PlayerModel;
49
49
  getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
50
50
  setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
@@ -96,7 +96,7 @@ export class PerformanceStatsModel extends Model {
96
96
  allowNull: false,
97
97
  defaultValue: 0
98
98
  },
99
- saving: {
99
+ reflex: {
100
100
  type: DataTypes.INTEGER,
101
101
  allowNull: false,
102
102
  defaultValue: 0