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.
- package/dist/cjs/src/data/common/index.d.ts +0 -1
- package/dist/cjs/src/data/common/index.js +0 -1
- package/dist/cjs/src/data/models/performance-stats.d.ts +2 -2
- package/dist/cjs/src/data/models/performance-stats.js +1 -1
- package/dist/cjs/src/data/transformers/performance-stats.js +2 -2
- package/dist/cjs/src/service/event/events.d.ts +93 -0
- package/dist/cjs/src/{data/common → service/event}/events.js +4 -5
- package/dist/cjs/src/service/event/index.d.ts +1 -0
- package/dist/cjs/src/service/event/index.js +1 -0
- package/dist/cjs/src/service/event/rally-event.d.ts +3 -3
- package/dist/cjs/src/service/player/performance-stats.d.ts +1 -1
- package/dist/cjs/src/service/player/performance-stats.js +1 -1
- package/dist/cjs/src/service/player/stats.js +1 -2
- package/dist/cjs/src/service/player/trait.d.ts +34 -8
- package/dist/cjs/src/service/player/trait.js +41 -11
- package/dist/cjs/src/service/utils/index.d.ts +2 -0
- package/dist/cjs/src/service/utils/index.js +2 -0
- package/dist/cjs/src/service/utils/number-utils.d.ts +1 -0
- package/dist/cjs/src/service/utils/number-utils.js +7 -0
- package/dist/cjs/src/service/utils/rng-utils.d.ts +7 -0
- package/dist/cjs/src/service/utils/rng-utils.js +32 -0
- package/dist/cjs/src/stat-config/roles.json +5 -5
- package/dist/cjs/src/stat-config/traits.json +61 -25
- package/dist/esm/src/data/common/index.d.ts +0 -1
- package/dist/esm/src/data/common/index.js +0 -1
- package/dist/esm/src/data/models/performance-stats.d.ts +2 -2
- package/dist/esm/src/data/models/performance-stats.js +1 -1
- package/dist/esm/src/data/transformers/performance-stats.js +2 -2
- package/dist/esm/src/service/event/events.d.ts +93 -0
- package/dist/esm/src/{data/common → service/event}/events.js +4 -5
- package/dist/esm/src/service/event/index.d.ts +1 -0
- package/dist/esm/src/service/event/index.js +1 -0
- package/dist/esm/src/service/event/rally-event.d.ts +3 -3
- package/dist/esm/src/service/player/performance-stats.d.ts +1 -1
- package/dist/esm/src/service/player/performance-stats.js +1 -1
- package/dist/esm/src/service/player/stats.js +1 -2
- package/dist/esm/src/service/player/trait.d.ts +34 -8
- package/dist/esm/src/service/player/trait.js +41 -11
- package/dist/esm/src/service/utils/index.d.ts +2 -0
- package/dist/esm/src/service/utils/index.js +2 -0
- package/dist/esm/src/service/utils/number-utils.d.ts +1 -0
- package/dist/esm/src/service/utils/number-utils.js +3 -0
- package/dist/esm/src/service/utils/rng-utils.d.ts +7 -0
- package/dist/esm/src/service/utils/rng-utils.js +27 -0
- package/dist/esm/src/stat-config/roles.json +5 -5
- package/dist/esm/src/stat-config/traits.json +61 -25
- package/package.json +1 -1
- package/dist/cjs/src/data/common/events.d.ts +0 -82
- package/dist/esm/src/data/common/events.d.ts +0 -82
|
@@ -20,7 +20,7 @@ export interface PerformanceStatsAttributes {
|
|
|
20
20
|
focus: number;
|
|
21
21
|
defense: number;
|
|
22
22
|
stamina: number;
|
|
23
|
-
|
|
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
|
-
|
|
47
|
+
reflex: number;
|
|
48
48
|
player: PlayerModel;
|
|
49
49
|
getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
|
|
50
50
|
setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
|
|
@@ -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
|
-
|
|
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
|
-
|
|
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["
|
|
53
|
-
ServeTypeEnum[ServeTypeEnum["
|
|
54
|
-
ServeTypeEnum[ServeTypeEnum["
|
|
55
|
-
ServeTypeEnum[ServeTypeEnum["
|
|
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,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EventType } from './events';
|
|
2
2
|
export interface RallyEventOpts {
|
|
3
3
|
readonly player: string;
|
|
4
|
-
readonly eventType:
|
|
4
|
+
readonly eventType: EventType;
|
|
5
5
|
}
|
|
6
6
|
export declare abstract class RallyEvent {
|
|
7
7
|
readonly player: string;
|
|
8
|
-
readonly eventType:
|
|
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", "
|
|
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', '
|
|
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);
|
|
@@ -1,26 +1,52 @@
|
|
|
1
|
-
import { PerformanceStats } from './performance-stats';
|
|
2
1
|
import { Rarity } from './rarity';
|
|
3
2
|
import { EnumDataType } from 'sequelize';
|
|
4
|
-
import {
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
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(
|
|
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,
|
|
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)(
|
|
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)(
|
|
69
|
+
traitCount = (0, node_crypto_1.randomInt)(2, 4);
|
|
41
70
|
break;
|
|
42
71
|
}
|
|
43
72
|
case rarity_1.RarityEnum.SPECIAL: {
|
|
44
|
-
traitCount =
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
.
|
|
55
|
-
|
|
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]));
|
|
@@ -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
|
+
/**
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
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
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
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.
|
|
22
|
-
"
|
|
23
|
-
|
|
24
|
-
|
|
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.
|
|
29
|
-
"chance": 0.
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
"
|
|
48
|
-
|
|
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":
|
|
56
|
-
|
|
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
|
]
|
|
@@ -20,7 +20,7 @@ export interface PerformanceStatsAttributes {
|
|
|
20
20
|
focus: number;
|
|
21
21
|
defense: number;
|
|
22
22
|
stamina: number;
|
|
23
|
-
|
|
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
|
-
|
|
47
|
+
reflex: number;
|
|
48
48
|
player: PlayerModel;
|
|
49
49
|
getPlayer: Sequelize.BelongsToGetAssociationMixin<PlayerModel>;
|
|
50
50
|
setPlayer: Sequelize.BelongsToSetAssociationMixin<PlayerModel, PlayerId>;
|