volleyballsimtypes 0.0.166 → 0.0.167
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/init-models.js +0 -21
- package/dist/cjs/src/data/models/index.d.ts +0 -2
- package/dist/cjs/src/data/models/index.js +0 -2
- package/dist/cjs/src/data/models/performance-stats.d.ts +2 -0
- package/dist/cjs/src/data/models/performance-stats.js +5 -0
- package/dist/cjs/src/data/models/player.d.ts +8 -30
- package/dist/cjs/src/data/models/player.js +6 -2
- package/dist/cjs/src/data/transformers/index.d.ts +0 -2
- package/dist/cjs/src/data/transformers/index.js +0 -2
- package/dist/cjs/src/data/transformers/performance-stats.js +4 -2
- package/dist/cjs/src/data/transformers/player.js +4 -3
- package/dist/cjs/src/index.d.ts +0 -1
- package/dist/cjs/src/index.js +0 -1
- package/dist/cjs/src/service/coach/formation.js +57 -57
- package/dist/cjs/src/service/player/index.d.ts +2 -1
- package/dist/cjs/src/service/player/index.js +2 -1
- 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/player.d.ts +4 -5
- package/dist/cjs/src/service/player/player.js +21 -41
- package/dist/cjs/src/service/player/rarity.d.ts +4 -1
- package/dist/cjs/src/service/player/rarity.js +16 -14
- package/dist/cjs/src/service/player/role.d.ts +16 -15
- package/dist/cjs/src/service/player/role.js +43 -39
- package/dist/cjs/src/service/player/stats.d.ts +12 -0
- package/dist/cjs/src/{formula → service/player}/stats.js +18 -10
- package/dist/cjs/src/service/player/trait.d.ts +12 -19
- package/dist/cjs/src/service/player/trait.js +49 -140
- package/dist/cjs/src/{formula/role.formula.json → stat-config/roles.json} +10 -5
- package/dist/cjs/src/stat-config/traits.json +58 -0
- package/dist/esm/src/data/init-models.js +1 -22
- package/dist/esm/src/data/models/index.d.ts +0 -2
- package/dist/esm/src/data/models/index.js +0 -2
- package/dist/esm/src/data/models/performance-stats.d.ts +2 -0
- package/dist/esm/src/data/models/performance-stats.js +5 -0
- package/dist/esm/src/data/models/player.d.ts +8 -30
- package/dist/esm/src/data/models/player.js +7 -3
- package/dist/esm/src/data/transformers/index.d.ts +0 -2
- package/dist/esm/src/data/transformers/index.js +0 -2
- package/dist/esm/src/data/transformers/performance-stats.js +4 -2
- package/dist/esm/src/data/transformers/player.js +5 -4
- package/dist/esm/src/index.d.ts +0 -1
- package/dist/esm/src/index.js +0 -1
- package/dist/esm/src/service/coach/formation.js +58 -58
- package/dist/esm/src/service/player/index.d.ts +2 -1
- package/dist/esm/src/service/player/index.js +2 -1
- 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/player.d.ts +4 -5
- package/dist/esm/src/service/player/player.js +21 -18
- package/dist/esm/src/service/player/rarity.d.ts +4 -1
- package/dist/esm/src/service/player/rarity.js +15 -13
- package/dist/esm/src/service/player/role.d.ts +16 -15
- package/dist/esm/src/service/player/role.js +37 -37
- package/dist/esm/src/service/player/stats.d.ts +12 -0
- package/dist/esm/src/{formula → service/player}/stats.js +16 -8
- package/dist/esm/src/service/player/trait.d.ts +12 -19
- package/dist/esm/src/service/player/trait.js +46 -117
- package/dist/esm/src/{formula/role.formula.json → stat-config/roles.json} +10 -5
- package/dist/esm/src/stat-config/traits.json +58 -0
- package/package.json +1 -1
- package/dist/cjs/src/data/models/player-trait.d.ts +0 -23
- package/dist/cjs/src/data/models/player-trait.js +0 -42
- package/dist/cjs/src/data/models/trait.d.ts +0 -37
- package/dist/cjs/src/data/models/trait.js +0 -30
- package/dist/cjs/src/data/transformers/role.d.ts +0 -5
- package/dist/cjs/src/data/transformers/role.js +0 -25
- package/dist/cjs/src/data/transformers/trait.d.ts +0 -5
- package/dist/cjs/src/data/transformers/trait.js +0 -19
- package/dist/cjs/src/formula/index.d.ts +0 -2
- package/dist/cjs/src/formula/index.js +0 -18
- package/dist/cjs/src/formula/roles.d.ts +0 -9
- package/dist/cjs/src/formula/roles.js +0 -9
- package/dist/cjs/src/formula/stats.d.ts +0 -6
- package/dist/esm/src/data/models/player-trait.d.ts +0 -23
- package/dist/esm/src/data/models/player-trait.js +0 -38
- package/dist/esm/src/data/models/trait.d.ts +0 -37
- package/dist/esm/src/data/models/trait.js +0 -26
- package/dist/esm/src/data/transformers/role.d.ts +0 -5
- package/dist/esm/src/data/transformers/role.js +0 -21
- package/dist/esm/src/data/transformers/trait.d.ts +0 -5
- package/dist/esm/src/data/transformers/trait.js +0 -15
- package/dist/esm/src/formula/index.d.ts +0 -2
- package/dist/esm/src/formula/index.js +0 -2
- package/dist/esm/src/formula/roles.d.ts +0 -9
- package/dist/esm/src/formula/roles.js +0 -3
- package/dist/esm/src/formula/stats.d.ts +0 -6
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RarityRanges = exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
3
|
+
exports.RarityDataType = exports.RarityRanges = exports.RarityEnum = void 0;
|
|
4
|
+
const sequelize_1 = require("sequelize");
|
|
5
|
+
var RarityEnum;
|
|
6
|
+
(function (RarityEnum) {
|
|
7
|
+
RarityEnum["COMMON"] = "COMMON";
|
|
8
|
+
RarityEnum["RARE"] = "RARE";
|
|
9
|
+
RarityEnum["LEGENDARY"] = "LEGENDARY";
|
|
10
|
+
RarityEnum["MYTHIC"] = "MYTHIC";
|
|
11
|
+
RarityEnum["SPECIAL"] = "SPECIAL";
|
|
12
|
+
})(RarityEnum = exports.RarityEnum || (exports.RarityEnum = {}));
|
|
12
13
|
exports.RarityRanges = {
|
|
13
|
-
[
|
|
14
|
-
[
|
|
15
|
-
[
|
|
16
|
-
[
|
|
17
|
-
[
|
|
14
|
+
[RarityEnum.COMMON]: [0, 50],
|
|
15
|
+
[RarityEnum.RARE]: [51, 70],
|
|
16
|
+
[RarityEnum.LEGENDARY]: [71, 85],
|
|
17
|
+
[RarityEnum.MYTHIC]: [86, 98],
|
|
18
|
+
[RarityEnum.SPECIAL]: [99, 100]
|
|
18
19
|
};
|
|
20
|
+
exports.RarityDataType = sequelize_1.DataTypes.ENUM(...Object.values(RarityEnum));
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { PerformanceStats } from './performance-stats';
|
|
3
|
-
export declare
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
private static readonly ROLES;
|
|
10
|
-
readonly name: Roles;
|
|
11
|
-
private constructor();
|
|
12
|
-
toString(): string;
|
|
13
|
-
static getRoles(): Role[];
|
|
14
|
-
static calculateScore(stats: PerformanceStats, role: Role): number;
|
|
15
|
-
static assignRoles(stats: PerformanceStats): Role[];
|
|
1
|
+
import { EnumDataType } from 'sequelize';
|
|
2
|
+
import { PerformanceStats, PerformanceStatsParams } from './performance-stats';
|
|
3
|
+
export declare enum RoleEnum {
|
|
4
|
+
SETTER = "SETTER",
|
|
5
|
+
LIBERO = "LIBERO",
|
|
6
|
+
OUTSIDE_HITTER = "OUTSIDE_HITTER",
|
|
7
|
+
OPPOSITE_HITTER = "OPPOSITE_HITTER",
|
|
8
|
+
MIDDLE_BLOCKER = "MIDDLE_BLOCKER"
|
|
16
9
|
}
|
|
10
|
+
export type Role = RoleEnum.SETTER | RoleEnum.LIBERO | RoleEnum.MIDDLE_BLOCKER | RoleEnum.OUTSIDE_HITTER | RoleEnum.OPPOSITE_HITTER;
|
|
11
|
+
export declare const RoleDataType: EnumDataType<Role>;
|
|
12
|
+
export interface RolesFormula {
|
|
13
|
+
role: Role;
|
|
14
|
+
weight: PerformanceStatsParams;
|
|
15
|
+
}
|
|
16
|
+
export declare function calculateRoleScore(stats: PerformanceStats, role: Role): number;
|
|
17
|
+
export declare function assignRoles(stats: PerformanceStats): Role[];
|
|
@@ -1,44 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
6
|
+
exports.assignRoles = exports.calculateRoleScore = exports.RoleDataType = exports.RoleEnum = void 0;
|
|
7
|
+
const sequelize_1 = require("sequelize");
|
|
8
|
+
const roles_json_1 = __importDefault(require("../../stat-config/roles.json"));
|
|
9
|
+
var RoleEnum;
|
|
10
|
+
(function (RoleEnum) {
|
|
11
|
+
RoleEnum["SETTER"] = "SETTER";
|
|
12
|
+
RoleEnum["LIBERO"] = "LIBERO";
|
|
13
|
+
RoleEnum["OUTSIDE_HITTER"] = "OUTSIDE_HITTER";
|
|
14
|
+
RoleEnum["OPPOSITE_HITTER"] = "OPPOSITE_HITTER";
|
|
15
|
+
RoleEnum["MIDDLE_BLOCKER"] = "MIDDLE_BLOCKER";
|
|
16
|
+
})(RoleEnum = exports.RoleEnum || (exports.RoleEnum = {}));
|
|
17
|
+
exports.RoleDataType = sequelize_1.DataTypes.ENUM(...Object.values(RoleEnum));
|
|
18
|
+
const rolesFormula = roles_json_1.default;
|
|
19
|
+
function calculateRoleScore(stats, role) {
|
|
20
|
+
const weights = rolesFormula.find(r => r.role === role);
|
|
21
|
+
if (weights == null)
|
|
22
|
+
throw new Error('COULD_NOT_FIND_ROLE_WEIGHT');
|
|
23
|
+
const score = Object.keys(weights.weight)
|
|
24
|
+
.reduce((score, key) => {
|
|
25
|
+
const stat = stats[key];
|
|
26
|
+
const weight = weights.weight[key];
|
|
27
|
+
return score + (stat * weight);
|
|
28
|
+
}, 0);
|
|
29
|
+
return Math.round(score);
|
|
30
|
+
}
|
|
31
|
+
exports.calculateRoleScore = calculateRoleScore;
|
|
32
|
+
function assignRoles(stats) {
|
|
33
|
+
const scores = Object.values(RoleEnum)
|
|
34
|
+
.map((role) => ({
|
|
35
|
+
role,
|
|
36
|
+
score: calculateRoleScore(stats, role)
|
|
37
|
+
}))
|
|
38
|
+
.sort((x, y) => y.score - x.score);
|
|
39
|
+
const out = [scores[0].role];
|
|
40
|
+
if (scores[1].score >= 75) {
|
|
41
|
+
out.push(scores[1].role);
|
|
22
42
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
role,
|
|
26
|
-
score: this.calculateScore(stats, role)
|
|
27
|
-
})).sort((x, y) => y.score - x.score);
|
|
28
|
-
const out = [scores[0].role];
|
|
29
|
-
if (scores[1].score >= 75) {
|
|
30
|
-
out.push(scores[1].role);
|
|
31
|
-
}
|
|
32
|
-
if (scores[2].score >= 85) {
|
|
33
|
-
out.push(scores[2].role);
|
|
34
|
-
}
|
|
35
|
-
return out;
|
|
43
|
+
if (scores[2].score >= 85) {
|
|
44
|
+
out.push(scores[2].role);
|
|
36
45
|
}
|
|
46
|
+
return out;
|
|
37
47
|
}
|
|
38
|
-
exports.
|
|
39
|
-
Role.SETTER = new Role('SETTER');
|
|
40
|
-
Role.LIBERO = new Role('LIBERO');
|
|
41
|
-
Role.OUTSIDE_HITTER = new Role('OUTSIDE_HITTER');
|
|
42
|
-
Role.OPPOSITE_HITTER = new Role('OPPOSITE_HITTER');
|
|
43
|
-
Role.MIDDLE_BLOCKER = new Role('MIDDLE_BLOCKER');
|
|
44
|
-
Role.ROLES = [Role.LIBERO, Role.SETTER, Role.OPPOSITE_HITTER, Role.OUTSIDE_HITTER, Role.MIDDLE_BLOCKER];
|
|
48
|
+
exports.assignRoles = assignRoles;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PerformanceStats } from './performance-stats';
|
|
2
|
+
export declare enum StatsEnum {
|
|
3
|
+
ATTACK = "ATTACK",
|
|
4
|
+
SET = "SET",
|
|
5
|
+
RECEIVE = "RECEIVE",
|
|
6
|
+
SERVE = "SERVE",
|
|
7
|
+
BLOCK = "BLOCK",
|
|
8
|
+
STAMINA = "STAMINA"
|
|
9
|
+
}
|
|
10
|
+
export type Stats = StatsEnum.ATTACK | StatsEnum.SET | StatsEnum.RECEIVE | StatsEnum.SERVE | StatsEnum.BLOCK | StatsEnum.STAMINA;
|
|
11
|
+
export declare function calculateStatScore(performanceStats: PerformanceStats, statName: Stats): number;
|
|
12
|
+
export declare function getMultipliers(statName: Stats, performanceStats?: PerformanceStats): any;
|
|
@@ -1,17 +1,25 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getMultipliers = exports.
|
|
4
|
-
|
|
5
|
-
function
|
|
3
|
+
exports.getMultipliers = exports.calculateStatScore = exports.StatsEnum = void 0;
|
|
4
|
+
var StatsEnum;
|
|
5
|
+
(function (StatsEnum) {
|
|
6
|
+
StatsEnum["ATTACK"] = "ATTACK";
|
|
7
|
+
StatsEnum["SET"] = "SET";
|
|
8
|
+
StatsEnum["RECEIVE"] = "RECEIVE";
|
|
9
|
+
StatsEnum["SERVE"] = "SERVE";
|
|
10
|
+
StatsEnum["BLOCK"] = "BLOCK";
|
|
11
|
+
StatsEnum["STAMINA"] = "STAMINA";
|
|
12
|
+
})(StatsEnum = exports.StatsEnum || (exports.StatsEnum = {}));
|
|
13
|
+
function calculateStatScore(performanceStats, statName) {
|
|
6
14
|
const multipliers = getMultipliers(statName, performanceStats);
|
|
7
15
|
const score = Object.entries(multipliers)
|
|
8
16
|
.reduce((total, [key, value]) => total + value * performanceStats[key], 0);
|
|
9
17
|
return Math.round(score);
|
|
10
18
|
}
|
|
11
|
-
exports.
|
|
19
|
+
exports.calculateStatScore = calculateStatScore;
|
|
12
20
|
function getMultipliers(statName, performanceStats) {
|
|
13
21
|
switch (statName) {
|
|
14
|
-
case
|
|
22
|
+
case StatsEnum.ATTACK:
|
|
15
23
|
return {
|
|
16
24
|
spike: 0.55,
|
|
17
25
|
backAttack: 0.1,
|
|
@@ -20,7 +28,7 @@ function getMultipliers(statName, performanceStats) {
|
|
|
20
28
|
awareness: 0.05,
|
|
21
29
|
attack: 0.05
|
|
22
30
|
};
|
|
23
|
-
case
|
|
31
|
+
case StatsEnum.SET:
|
|
24
32
|
return {
|
|
25
33
|
setting: 0.7,
|
|
26
34
|
overhand: 0.1,
|
|
@@ -28,7 +36,7 @@ function getMultipliers(statName, performanceStats) {
|
|
|
28
36
|
awareness: 0.075,
|
|
29
37
|
attack: 0.075
|
|
30
38
|
};
|
|
31
|
-
case
|
|
39
|
+
case StatsEnum.RECEIVE:
|
|
32
40
|
return {
|
|
33
41
|
reception: 0.75,
|
|
34
42
|
overhand: 0.025,
|
|
@@ -36,13 +44,13 @@ function getMultipliers(statName, performanceStats) {
|
|
|
36
44
|
focus: 0.025,
|
|
37
45
|
defense: 0.05
|
|
38
46
|
};
|
|
39
|
-
case
|
|
47
|
+
case StatsEnum.SERVE:
|
|
40
48
|
return {
|
|
41
49
|
serve: 0.85,
|
|
42
50
|
awareness: 0.075,
|
|
43
51
|
attack: 0.075
|
|
44
52
|
};
|
|
45
|
-
case
|
|
53
|
+
case StatsEnum.BLOCK:
|
|
46
54
|
return {
|
|
47
55
|
block: 0.65,
|
|
48
56
|
read: performanceStats == null ? 0.125 : performanceStats.read > performanceStats.commit ? 0.2 : 0.05,
|
|
@@ -50,7 +58,7 @@ function getMultipliers(statName, performanceStats) {
|
|
|
50
58
|
focus: 0.05,
|
|
51
59
|
defense: 0.05
|
|
52
60
|
};
|
|
53
|
-
case
|
|
61
|
+
case StatsEnum.STAMINA:
|
|
54
62
|
return { stamina: 1 };
|
|
55
63
|
default:
|
|
56
64
|
throw new Error('INVALID_STAT');
|
|
@@ -1,22 +1,15 @@
|
|
|
1
|
-
import * as GeneralStat from '../../formula/stats';
|
|
2
1
|
import { PerformanceStats } from './performance-stats';
|
|
3
2
|
import { Rarity } from './rarity';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
readonly modifier: number;
|
|
14
|
-
readonly chance: number;
|
|
15
|
-
readonly statThreshold: number;
|
|
16
|
-
readonly stat: GeneralStat.Stats;
|
|
17
|
-
readonly weight: number;
|
|
18
|
-
private constructor();
|
|
19
|
-
static getTraits(): Trait[];
|
|
20
|
-
static assignTraits(performanceStats: PerformanceStats, rarity: Rarity): Trait[];
|
|
21
|
-
toString(): string;
|
|
3
|
+
import { EnumDataType } from 'sequelize';
|
|
4
|
+
export declare enum TraitEnum {
|
|
5
|
+
MASTER_MIND = "MASTER_MIND",
|
|
6
|
+
MOVING_WALL = "MOVING_WALL",
|
|
7
|
+
MARKSMAN = "MARKSMAN",
|
|
8
|
+
METEOR_SERVE = "METEOR_SERVE",
|
|
9
|
+
VIGOROUS = "VIGOROUS",
|
|
10
|
+
GUARDIAN = "GUARDIAN",
|
|
11
|
+
FLOAT_SERVE = "FLOAT_SERVE"
|
|
22
12
|
}
|
|
13
|
+
export type Trait = TraitEnum.FLOAT_SERVE | TraitEnum.GUARDIAN | TraitEnum.MASTER_MIND | TraitEnum.MOVING_WALL | TraitEnum.MARKSMAN | TraitEnum.METEOR_SERVE | TraitEnum.VIGOROUS;
|
|
14
|
+
export declare const TraitDataType: EnumDataType<Trait>;
|
|
15
|
+
export declare function assignTraits(performanceStats: PerformanceStats, rarity: Rarity): Trait[];
|
|
@@ -1,148 +1,57 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
4
|
};
|
|
25
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
27
|
-
const GeneralStat = __importStar(require("../../formula/stats"));
|
|
6
|
+
exports.assignTraits = exports.TraitDataType = exports.TraitEnum = void 0;
|
|
28
7
|
const rarity_1 = require("./rarity");
|
|
29
8
|
const node_crypto_1 = require("node:crypto");
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
traitCount = (0, node_crypto_1.randomInt)(0, 1);
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
case rarity_1.Rarity.LEGENDARY: {
|
|
55
|
-
traitCount = (0, node_crypto_1.randomInt)(0, 2);
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
case rarity_1.Rarity.MYTHIC: {
|
|
59
|
-
traitCount = (0, node_crypto_1.randomInt)(1, 3);
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
case rarity_1.Rarity.SPECIAL: {
|
|
63
|
-
traitCount = (0, node_crypto_1.randomInt)(2, 3);
|
|
64
|
-
break;
|
|
65
|
-
}
|
|
66
|
-
default:
|
|
67
|
-
throw new Error('INVALID_RARITY');
|
|
9
|
+
const traits_json_1 = __importDefault(require("../../stat-config/traits.json"));
|
|
10
|
+
const sequelize_1 = require("sequelize");
|
|
11
|
+
const stats_1 = require("./stats");
|
|
12
|
+
const traits = traits_json_1.default;
|
|
13
|
+
var TraitEnum;
|
|
14
|
+
(function (TraitEnum) {
|
|
15
|
+
TraitEnum["MASTER_MIND"] = "MASTER_MIND";
|
|
16
|
+
TraitEnum["MOVING_WALL"] = "MOVING_WALL";
|
|
17
|
+
TraitEnum["MARKSMAN"] = "MARKSMAN";
|
|
18
|
+
TraitEnum["METEOR_SERVE"] = "METEOR_SERVE";
|
|
19
|
+
TraitEnum["VIGOROUS"] = "VIGOROUS";
|
|
20
|
+
TraitEnum["GUARDIAN"] = "GUARDIAN";
|
|
21
|
+
TraitEnum["FLOAT_SERVE"] = "FLOAT_SERVE";
|
|
22
|
+
})(TraitEnum = exports.TraitEnum || (exports.TraitEnum = {}));
|
|
23
|
+
exports.TraitDataType = sequelize_1.DataTypes.ENUM(...Object.values(TraitEnum));
|
|
24
|
+
function assignTraits(performanceStats, rarity) {
|
|
25
|
+
let traitCount;
|
|
26
|
+
switch (rarity) {
|
|
27
|
+
case rarity_1.RarityEnum.COMMON: {
|
|
28
|
+
traitCount = 0;
|
|
29
|
+
break;
|
|
68
30
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
31
|
+
case rarity_1.RarityEnum.RARE: {
|
|
32
|
+
traitCount = (0, node_crypto_1.randomInt)(0, 1);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
case rarity_1.RarityEnum.LEGENDARY: {
|
|
36
|
+
traitCount = (0, node_crypto_1.randomInt)(0, 2);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
case rarity_1.RarityEnum.MYTHIC: {
|
|
40
|
+
traitCount = (0, node_crypto_1.randomInt)(1, 3);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case rarity_1.RarityEnum.SPECIAL: {
|
|
44
|
+
traitCount = (0, node_crypto_1.randomInt)(2, 3);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
default:
|
|
48
|
+
throw new Error('INVALID_RARITY');
|
|
85
49
|
}
|
|
50
|
+
if (traitCount < 1)
|
|
51
|
+
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);
|
|
86
56
|
}
|
|
87
|
-
exports.
|
|
88
|
-
// A Setter gets a bonus to their score, and the receiving attacker gets a bonus as well.
|
|
89
|
-
// Stacks with attacker bonus
|
|
90
|
-
Trait.MASTER_MIND = new Trait({
|
|
91
|
-
id: '0117a315-a743-43e3-9ec2-ad5cf700ef08',
|
|
92
|
-
name: 'Master Mind',
|
|
93
|
-
modifier: 1.1,
|
|
94
|
-
chance: 0.2,
|
|
95
|
-
statThreshold: 80,
|
|
96
|
-
stat: 'ATTACK',
|
|
97
|
-
weight: 10
|
|
98
|
-
});
|
|
99
|
-
// Will always participate in blocking regardless of chance and adds
|
|
100
|
-
Trait.MOVING_WALL = new Trait({
|
|
101
|
-
id: '304c53f6-5e7a-44d3-9625-f10d8109421a',
|
|
102
|
-
name: 'Moving Wall',
|
|
103
|
-
modifier: 1.1,
|
|
104
|
-
chance: 1,
|
|
105
|
-
statThreshold: 75,
|
|
106
|
-
stat: 'DEFENSE',
|
|
107
|
-
weight: 5
|
|
108
|
-
});
|
|
109
|
-
// On attack, will always pick the worst receiver and adds a 10% to score
|
|
110
|
-
Trait.MARKSMAN = new Trait({
|
|
111
|
-
id: 'ace3458e-69ab-487c-a9c0-d656f705d8dd',
|
|
112
|
-
name: 'Marksman',
|
|
113
|
-
modifier: 1.05,
|
|
114
|
-
chance: 0.3,
|
|
115
|
-
statThreshold: 75,
|
|
116
|
-
stat: 'ATTACK',
|
|
117
|
-
weight: 5
|
|
118
|
-
});
|
|
119
|
-
// Increases the score of the serve by 10% when serve type is Jumping.
|
|
120
|
-
Trait.METEOR_SERVE = new Trait({
|
|
121
|
-
id: 'c929a79d-5866-40d6-bbd6-b0b67a929c4c',
|
|
122
|
-
name: 'Meteor Serve',
|
|
123
|
-
modifier: 1.1,
|
|
124
|
-
chance: 0.1,
|
|
125
|
-
statThreshold: 75,
|
|
126
|
-
stat: 'SERVE',
|
|
127
|
-
weight: 10
|
|
128
|
-
});
|
|
129
|
-
// Has a 50% chance of taking an action without decreasing energy.
|
|
130
|
-
Trait.VIGOROUS = new Trait({
|
|
131
|
-
id: 'f9599b87-b3b2-49ce-8224-470f6fe6ed64',
|
|
132
|
-
name: 'Vigorous',
|
|
133
|
-
modifier: 1,
|
|
134
|
-
statThreshold: 60,
|
|
135
|
-
chance: 0.5,
|
|
136
|
-
stat: 'PHYSICAL',
|
|
137
|
-
weight: 1
|
|
138
|
-
});
|
|
139
|
-
// Takes place of the receiver and increases reception score by 15%, guaranteeing success. Can only trigger in back-row.
|
|
140
|
-
Trait.GUARDIAN = new Trait({
|
|
141
|
-
id: 'c3291953-9256-4559-b5a9-955ccb8f9a6f',
|
|
142
|
-
name: 'Guardian',
|
|
143
|
-
chance: 0.2,
|
|
144
|
-
statThreshold: 75,
|
|
145
|
-
modifier: 1.15,
|
|
146
|
-
stat: 'DEFENSE',
|
|
147
|
-
weight: 10
|
|
148
|
-
});
|
|
57
|
+
exports.assignTraits = assignTraits;
|
|
@@ -18,7 +18,8 @@
|
|
|
18
18
|
"read": 0,
|
|
19
19
|
"commit": 0,
|
|
20
20
|
"focus": 0,
|
|
21
|
-
"defense": 0
|
|
21
|
+
"defense": 0,
|
|
22
|
+
"saving": 0
|
|
22
23
|
}
|
|
23
24
|
},
|
|
24
25
|
{
|
|
@@ -40,7 +41,8 @@
|
|
|
40
41
|
"read": 0,
|
|
41
42
|
"commit": 0,
|
|
42
43
|
"focus": 0,
|
|
43
|
-
"defense": 0
|
|
44
|
+
"defense": 0,
|
|
45
|
+
"saving": 0
|
|
44
46
|
}
|
|
45
47
|
},
|
|
46
48
|
{
|
|
@@ -62,7 +64,8 @@
|
|
|
62
64
|
"read": 0,
|
|
63
65
|
"commit": 0,
|
|
64
66
|
"focus": 0,
|
|
65
|
-
"defense": 0
|
|
67
|
+
"defense": 0,
|
|
68
|
+
"saving": 0
|
|
66
69
|
}
|
|
67
70
|
},
|
|
68
71
|
{
|
|
@@ -84,7 +87,8 @@
|
|
|
84
87
|
"read": 0,
|
|
85
88
|
"commit": 0,
|
|
86
89
|
"focus": 0,
|
|
87
|
-
"defense": 0
|
|
90
|
+
"defense": 0,
|
|
91
|
+
"saving": 0
|
|
88
92
|
}
|
|
89
93
|
},
|
|
90
94
|
{
|
|
@@ -106,7 +110,8 @@
|
|
|
106
110
|
"read": 0,
|
|
107
111
|
"commit": 0,
|
|
108
112
|
"focus": 0,
|
|
109
|
-
"defense": 0
|
|
113
|
+
"defense": 0,
|
|
114
|
+
"saving": 0
|
|
110
115
|
}
|
|
111
116
|
}
|
|
112
117
|
]
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"name": "MASTER_MIND",
|
|
4
|
+
"modifier": 1.1,
|
|
5
|
+
"chance": 0.2,
|
|
6
|
+
"statThreshold": 80,
|
|
7
|
+
"stat": "SET",
|
|
8
|
+
"weight": 10
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"name": "MOVING_WALL",
|
|
12
|
+
"modifier": 1.1,
|
|
13
|
+
"chance": 1,
|
|
14
|
+
"statThreshold": 75,
|
|
15
|
+
"stat": "BLOCK",
|
|
16
|
+
"weight": 5
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "MARKSMAN",
|
|
20
|
+
"modifier": 1.05,
|
|
21
|
+
"chance": 0.3,
|
|
22
|
+
"statThreshold": 75,
|
|
23
|
+
"stat": "ATTACK",
|
|
24
|
+
"weight": 5
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "METEOR_SERVE",
|
|
28
|
+
"modifier": 1.1,
|
|
29
|
+
"chance": 0.1,
|
|
30
|
+
"statThreshold": 75,
|
|
31
|
+
"stat": "SERVE",
|
|
32
|
+
"weight": 10
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "FLOAT_SERVE",
|
|
36
|
+
"modifier": 1,
|
|
37
|
+
"chance": 0.5,
|
|
38
|
+
"statThreshold": 60,
|
|
39
|
+
"stat": "SERVE",
|
|
40
|
+
"weight": 10
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "VIGOROUS",
|
|
44
|
+
"modifier": 1,
|
|
45
|
+
"statThreshold": 60,
|
|
46
|
+
"chance": 0.5,
|
|
47
|
+
"stat": "STAMINA",
|
|
48
|
+
"weight": 1
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"name": "GUARDIAN",
|
|
52
|
+
"chance": 0.2,
|
|
53
|
+
"statThreshold": 75,
|
|
54
|
+
"modifier": 1.15,
|
|
55
|
+
"stat": "RECEIVE",
|
|
56
|
+
"weight": 10
|
|
57
|
+
}
|
|
58
|
+
]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CoachModel, CompetitionChampionModel, CompetitionMatchModel, CompetitionModel, CompetitionTeamsModel, CountryModel, DraftModel, DraftPickModel, IterationModel, LeagueModel, LeagueSeasonModel, MatchModel, MatchRatingModel, MatchResultModel, MatchSetModel, MatchSetStatsModel, PerformanceStatsModel, PlayerModel, PlayerTeamModel,
|
|
1
|
+
import { CoachModel, CompetitionChampionModel, CompetitionMatchModel, CompetitionModel, CompetitionTeamsModel, CountryModel, DraftModel, DraftPickModel, IterationModel, LeagueModel, LeagueSeasonModel, MatchModel, MatchRatingModel, MatchResultModel, MatchSetModel, MatchSetStatsModel, PerformanceStatsModel, PlayerModel, PlayerTeamModel, RallyModel, SetPositionModel, TeamModel, UserModel } from './models';
|
|
2
2
|
export function initModels(sequelize) {
|
|
3
3
|
const Coach = CoachModel.initModel(sequelize);
|
|
4
4
|
const Country = CountryModel.initModel(sequelize);
|
|
@@ -19,11 +19,9 @@ export function initModels(sequelize) {
|
|
|
19
19
|
const PerformanceStats = PerformanceStatsModel.initModel(sequelize);
|
|
20
20
|
const Player = PlayerModel.initModel(sequelize);
|
|
21
21
|
const PlayerTeam = PlayerTeamModel.initModel(sequelize);
|
|
22
|
-
const PlayerTrait = PlayerTraitModel.initModel(sequelize);
|
|
23
22
|
const Rally = RallyModel.initModel(sequelize);
|
|
24
23
|
const SetPosition = SetPositionModel.initModel(sequelize);
|
|
25
24
|
const Team = TeamModel.initModel(sequelize);
|
|
26
|
-
const Trait = TraitModel.initModel(sequelize);
|
|
27
25
|
const User = UserModel.initModel(sequelize);
|
|
28
26
|
Coach.belongsTo(Country, { as: 'country', foreignKey: 'country_id' });
|
|
29
27
|
Coach.hasMany(Team, { as: 'Teams', foreignKey: 'coach_id' });
|
|
@@ -112,22 +110,13 @@ export function initModels(sequelize) {
|
|
|
112
110
|
foreignKey: 'player_id',
|
|
113
111
|
otherKey: 'team_id'
|
|
114
112
|
});
|
|
115
|
-
Player.belongsToMany(Trait, {
|
|
116
|
-
as: 'Traits',
|
|
117
|
-
through: PlayerTrait,
|
|
118
|
-
foreignKey: 'player_id',
|
|
119
|
-
otherKey: 'trait_id'
|
|
120
|
-
});
|
|
121
113
|
Player.hasMany(MatchSetStats, { as: 'MatchSetStats', foreignKey: 'player_id' });
|
|
122
114
|
Player.hasMany(PlayerTeam, { as: 'PlayerTeams', foreignKey: 'player_id' });
|
|
123
|
-
Player.hasMany(PlayerTrait, { as: 'PlayerTraits', foreignKey: 'player_id' });
|
|
124
115
|
Player.hasMany(SetPosition, { as: 'SetPositions', foreignKey: 'player_id' });
|
|
125
116
|
Player.hasOne(DraftPick, { as: 'DraftPick', foreignKey: 'player_id' });
|
|
126
117
|
Player.hasOne(PerformanceStats, { as: 'PerformanceStat', foreignKey: 'player_id' });
|
|
127
118
|
PlayerTeam.belongsTo(Player, { as: 'player', foreignKey: 'player_id' });
|
|
128
119
|
PlayerTeam.belongsTo(Team, { as: 'team', foreignKey: 'team_id' });
|
|
129
|
-
PlayerTrait.belongsTo(Player, { as: 'player', foreignKey: 'player_id' });
|
|
130
|
-
PlayerTrait.belongsTo(Trait, { as: 'trait', foreignKey: 'trait_id' });
|
|
131
120
|
Rally.belongsTo(MatchSet, { as: 'matchSet', foreignKey: 'match_set_id' });
|
|
132
121
|
Rally.belongsTo(Team, { as: 'ServingTeam', foreignKey: 'serving_team' });
|
|
133
122
|
SetPosition.belongsTo(MatchSet, { as: 'matchSet', foreignKey: 'match_set_id' });
|
|
@@ -162,13 +151,6 @@ export function initModels(sequelize) {
|
|
|
162
151
|
Team.hasMany(PlayerTeam, { as: 'PlayerTeams', foreignKey: 'team_id' });
|
|
163
152
|
Team.hasMany(Rally, { as: 'Rallies', foreignKey: 'serving_team' });
|
|
164
153
|
Team.hasMany(MatchResult, { as: 'WonMatches', foreignKey: 'winner_team_id' });
|
|
165
|
-
Trait.belongsToMany(Player, {
|
|
166
|
-
as: 'Players',
|
|
167
|
-
through: PlayerTrait,
|
|
168
|
-
foreignKey: 'trait_id',
|
|
169
|
-
otherKey: 'player_id'
|
|
170
|
-
});
|
|
171
|
-
Trait.hasMany(PlayerTrait, { as: 'PlayerTraits', foreignKey: 'trait_id' });
|
|
172
154
|
return {
|
|
173
155
|
Coach,
|
|
174
156
|
Competition,
|
|
@@ -178,7 +160,6 @@ export function initModels(sequelize) {
|
|
|
178
160
|
Country,
|
|
179
161
|
Draft,
|
|
180
162
|
DraftPick,
|
|
181
|
-
Event,
|
|
182
163
|
Iteration,
|
|
183
164
|
League,
|
|
184
165
|
LeagueSeason,
|
|
@@ -190,11 +171,9 @@ export function initModels(sequelize) {
|
|
|
190
171
|
PerformanceStats,
|
|
191
172
|
Player,
|
|
192
173
|
PlayerTeam,
|
|
193
|
-
PlayerTrait,
|
|
194
174
|
Rally,
|
|
195
175
|
SetPosition,
|
|
196
176
|
Team,
|
|
197
|
-
Trait,
|
|
198
177
|
User
|
|
199
178
|
};
|
|
200
179
|
}
|