enefel 2.9.1 → 2.11.0
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/.claude/settings.local.json +7 -0
- package/2025/newSkills.ts +769 -0
- package/2025/raceMigration.ts +66 -0
- package/2025/rawTeamsData.ts +1726 -0
- package/2025/skillMigration.ts +155 -0
- package/avatarsSeason.ts +61 -0
- package/career.ts +64 -8
- package/career2025.ts +2752 -0
- package/dice.ts +40 -8
- package/dist/2025/newSkills.d.ts +10 -0
- package/dist/2025/newSkills.js +663 -0
- package/dist/2025/raceMigration.d.ts +10 -0
- package/dist/2025/raceMigration.js +53 -0
- package/dist/2025/rawTeamsData.d.ts +12 -0
- package/dist/2025/rawTeamsData.js +1699 -0
- package/dist/2025/skillMigration.d.ts +31 -0
- package/dist/2025/skillMigration.js +95 -0
- package/dist/avatarsSeason.d.ts +22 -0
- package/dist/avatarsSeason.js +54 -0
- package/dist/career.d.ts +13 -4
- package/dist/career.js +36 -7
- package/dist/career2025.d.ts +192 -0
- package/dist/career2025.js +2611 -0
- package/dist/dice.d.ts +10 -2
- package/dist/dice.js +31 -8
- package/dist/index.d.ts +17 -2
- package/dist/index.js +44 -5
- package/dist/move.d.ts +6 -2
- package/dist/move.js +35 -0
- package/dist/package-lock.json +913 -7
- package/dist/package.json +6 -2
- package/dist/pitch.d.ts +10 -1
- package/dist/pitch.js +16 -0
- package/dist/player.d.ts +8 -4
- package/dist/player.js +104 -20
- package/dist/position.d.ts +4 -0
- package/dist/position.js +17 -1
- package/dist/race.d.ts +23 -12
- package/dist/race.js +210 -2
- package/dist/skill.d.ts +26 -3
- package/dist/skill.js +199 -81
- package/dist/skills/hitAndRun.d.ts +10 -0
- package/dist/skills/hitAndRun.js +12 -0
- package/dist/skills/safePairOfHands.d.ts +28 -0
- package/dist/skills/safePairOfHands.js +18 -0
- package/dist/skills/sidestep.d.ts +21 -0
- package/dist/skills/sidestep.js +20 -0
- package/dist/status.d.ts +4 -1
- package/dist/status.js +14 -4
- package/dist/store.d.ts +3 -0
- package/dist/store.js +3 -0
- package/dist/teams/career_v2025.d.ts +246 -0
- package/dist/teams/career_v2025.js +3512 -0
- package/dist/teams/convert-csv-to-career.d.ts +1 -0
- package/dist/teams/convert-csv-to-career.js +1085 -0
- package/dist/types/models.d.ts +4 -0
- package/index.ts +57 -4
- package/jest.config.js +3 -0
- package/move.ts +50 -2
- package/npm-login.sh +0 -0
- package/package.json +6 -2
- package/pitch.ts +22 -0
- package/player.ts +105 -22
- package/position.ts +16 -0
- package/race.ts +227 -13
- package/skill.ts +217 -83
- package/skills/hitAndRun.ts +14 -0
- package/skills/safePairOfHands.ts +33 -0
- package/skills/sidestep.ts +25 -0
- package/status.ts +15 -3
- package/store.ts +3 -0
- package/teams/README.md +53 -0
- package/teams/clean-stats.js +54 -0
- package/teams/convert-csv-to-career.ts +1209 -0
- package/teams/players_clean.csv +107 -0
- package/teams/players_next.csv +21 -0
- package/types/models.ts +4 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SKILL_TYPE } from "../skill";
|
|
2
|
+
type CareerLite = {
|
|
3
|
+
skills?: (string | [string, number])[];
|
|
4
|
+
};
|
|
5
|
+
type SkillBasic = {
|
|
6
|
+
id: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
family?: string;
|
|
9
|
+
mode?: string;
|
|
10
|
+
elite?: boolean;
|
|
11
|
+
};
|
|
12
|
+
type SkillMigrationRow = {
|
|
13
|
+
key: string;
|
|
14
|
+
label: string;
|
|
15
|
+
intrinsic: boolean;
|
|
16
|
+
legacy?: {
|
|
17
|
+
name: string;
|
|
18
|
+
family: string;
|
|
19
|
+
};
|
|
20
|
+
next?: {
|
|
21
|
+
name: string;
|
|
22
|
+
family?: string;
|
|
23
|
+
mode?: string;
|
|
24
|
+
elite?: boolean;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
declare const SKILL_DISPLAY_OVERRIDE: Record<string, string>;
|
|
28
|
+
declare const normalizeSkillKey: (value: string) => string;
|
|
29
|
+
declare const formatSkillName: (value: string) => string;
|
|
30
|
+
declare const buildSkillMigrationRows: (existingSkills: Record<string, SKILL_TYPE>, nextSkills: SkillBasic[], legacyCareers: Record<string, CareerLite>, nextCareers: Record<string, CareerLite>) => SkillMigrationRow[];
|
|
31
|
+
export { buildSkillMigrationRows, formatSkillName, normalizeSkillKey, SKILL_DISPLAY_OVERRIDE, SkillBasic, SkillMigrationRow, };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SKILL_DISPLAY_OVERRIDE = exports.normalizeSkillKey = exports.formatSkillName = exports.buildSkillMigrationRows = void 0;
|
|
4
|
+
const skill_1 = require("../skill");
|
|
5
|
+
const SKILL_DISPLAY_OVERRIDE = {
|
|
6
|
+
"animal-salvagery": "Animal Savagery",
|
|
7
|
+
"distrubing-presence": "Disturbing Presence",
|
|
8
|
+
claw: "Claws",
|
|
9
|
+
animosity: "Animosity (X)",
|
|
10
|
+
"running-pass": "Give and Go", // GIVE_AND_GO renamed to Give and Go
|
|
11
|
+
runningpass: "Give and Go", // Alias for GIVE_AND_GO
|
|
12
|
+
};
|
|
13
|
+
exports.SKILL_DISPLAY_OVERRIDE = SKILL_DISPLAY_OVERRIDE;
|
|
14
|
+
const SKILL_KEY_ALIAS = {
|
|
15
|
+
fumblerooskie: "fumblerooski",
|
|
16
|
+
giveandgo: "runningpass",
|
|
17
|
+
animalsalvagery: "animalsavagery",
|
|
18
|
+
distrubingpresence: "disturbingpresence",
|
|
19
|
+
claws: "claw",
|
|
20
|
+
animosityx: "animosity",
|
|
21
|
+
nohand: "noball",
|
|
22
|
+
lonerx: "loner",
|
|
23
|
+
pogostick: "pogo",
|
|
24
|
+
};
|
|
25
|
+
const normalizeSkillKey = (value) => {
|
|
26
|
+
const base = value.toLowerCase().replace(/[^a-z0-9]/gi, "");
|
|
27
|
+
return SKILL_KEY_ALIAS[base] ?? base;
|
|
28
|
+
};
|
|
29
|
+
exports.normalizeSkillKey = normalizeSkillKey;
|
|
30
|
+
const formatSkillName = (value) => value.replace(/-/g, " ").replace(/\b\w/g, (char) => char.toUpperCase());
|
|
31
|
+
exports.formatSkillName = formatSkillName;
|
|
32
|
+
const buildSkillMigrationRows = (existingSkills, nextSkills, legacyCareers, nextCareers) => {
|
|
33
|
+
const labelByType = {
|
|
34
|
+
[skill_1.SKILL_TYPE.AGILITY]: "Agility",
|
|
35
|
+
[skill_1.SKILL_TYPE.EXTRAORDINARY]: "Extraordinary",
|
|
36
|
+
[skill_1.SKILL_TYPE.GENERAL]: "General",
|
|
37
|
+
[skill_1.SKILL_TYPE.MUTATION]: "Mutation",
|
|
38
|
+
[skill_1.SKILL_TYPE.PASSING]: "Passing",
|
|
39
|
+
[skill_1.SKILL_TYPE.STRENGTH]: "Strength",
|
|
40
|
+
[skill_1.SKILL_TYPE.DEVIOUS]: "Devious",
|
|
41
|
+
[skill_1.SKILL_TYPE.SPECIAL]: "Special",
|
|
42
|
+
};
|
|
43
|
+
const intrinsicSkills = new Set();
|
|
44
|
+
const collectSkills = (careers) => {
|
|
45
|
+
Object.values(careers).forEach((career) => {
|
|
46
|
+
(career.skills ?? []).forEach((s) => {
|
|
47
|
+
const skillName = Array.isArray(s) ? s[0] : s;
|
|
48
|
+
intrinsicSkills.add(normalizeSkillKey(String(skillName)));
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
collectSkills(legacyCareers);
|
|
53
|
+
collectSkills(nextCareers);
|
|
54
|
+
const existingMap = new Map();
|
|
55
|
+
Object.entries(existingSkills).forEach(([id, type]) => {
|
|
56
|
+
const key = normalizeSkillKey(id);
|
|
57
|
+
const display = SKILL_DISPLAY_OVERRIDE[id] ?? formatSkillName(id);
|
|
58
|
+
existingMap.set(key, {
|
|
59
|
+
name: display,
|
|
60
|
+
family: labelByType[type] ?? String(type),
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
const nextMap = new Map();
|
|
64
|
+
nextSkills.forEach((skill) => {
|
|
65
|
+
const key = normalizeSkillKey(skill.id);
|
|
66
|
+
nextMap.set(key, {
|
|
67
|
+
name: skill.name ?? formatSkillName(skill.id),
|
|
68
|
+
family: skill.family,
|
|
69
|
+
mode: skill.mode,
|
|
70
|
+
elite: skill.elite,
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
const keys = [];
|
|
74
|
+
existingMap.forEach((_v, key) => keys.push(key));
|
|
75
|
+
nextMap.forEach((_v, key) => {
|
|
76
|
+
if (!existingMap.has(key)) {
|
|
77
|
+
keys.push(key);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return keys
|
|
81
|
+
.map((key) => {
|
|
82
|
+
const legacy = existingMap.get(key);
|
|
83
|
+
const next = nextMap.get(key);
|
|
84
|
+
const label = next?.name ?? legacy?.name ?? key;
|
|
85
|
+
return {
|
|
86
|
+
key,
|
|
87
|
+
label,
|
|
88
|
+
legacy,
|
|
89
|
+
next,
|
|
90
|
+
intrinsic: intrinsicSkills.has(key),
|
|
91
|
+
};
|
|
92
|
+
})
|
|
93
|
+
.sort((a, b) => a.label.localeCompare(b.label));
|
|
94
|
+
};
|
|
95
|
+
exports.buildSkillMigrationRows = buildSkillMigrationRows;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AVATAR_RARITY } from "./career";
|
|
2
|
+
export type SeasonAvatar = {
|
|
3
|
+
file: string;
|
|
4
|
+
season: number;
|
|
5
|
+
rarity: AVATAR_RARITY;
|
|
6
|
+
/** true for portrait images (ratio 2:3, e.g. 1024×1536) */
|
|
7
|
+
portrait?: boolean;
|
|
8
|
+
};
|
|
9
|
+
/** Display height multiplier for portrait avatars (2:3 ratio) */
|
|
10
|
+
export declare const PORTRAIT_RATIO = 1.5;
|
|
11
|
+
/**
|
|
12
|
+
* Avatars saisonniers — universels (aucune restriction de race).
|
|
13
|
+
* Pour ajouter des avatars : déposer l'image dans
|
|
14
|
+
* client/public/tile/shop/avatar-season/s{season}/
|
|
15
|
+
* et ajouter une entrée ici.
|
|
16
|
+
*/
|
|
17
|
+
export declare const AVATAR_SEASON_LIST: SeasonAvatar[];
|
|
18
|
+
/** Chemin complet utilisé pour afficher l'avatar d'un joueur (ex: <img src>) */
|
|
19
|
+
export declare function getSeasonAvatarPath(season: number): string;
|
|
20
|
+
/** Chemin relatif utilisé comme prop `type` dans le composant Item du shop */
|
|
21
|
+
export declare function getSeasonAvatarItemType(season: number): string;
|
|
22
|
+
export declare function findSeasonAvatar(file: string): SeasonAvatar | undefined;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AVATAR_SEASON_LIST = exports.PORTRAIT_RATIO = void 0;
|
|
4
|
+
exports.getSeasonAvatarPath = getSeasonAvatarPath;
|
|
5
|
+
exports.getSeasonAvatarItemType = getSeasonAvatarItemType;
|
|
6
|
+
exports.findSeasonAvatar = findSeasonAvatar;
|
|
7
|
+
const career_1 = require("./career");
|
|
8
|
+
/** Display height multiplier for portrait avatars (2:3 ratio) */
|
|
9
|
+
exports.PORTRAIT_RATIO = 1.5;
|
|
10
|
+
/**
|
|
11
|
+
* Avatars saisonniers — universels (aucune restriction de race).
|
|
12
|
+
* Pour ajouter des avatars : déposer l'image dans
|
|
13
|
+
* client/public/tile/shop/avatar-season/s{season}/
|
|
14
|
+
* et ajouter une entrée ici.
|
|
15
|
+
*/
|
|
16
|
+
exports.AVATAR_SEASON_LIST = [
|
|
17
|
+
{ file: "1.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
18
|
+
{ file: "2.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
19
|
+
{ file: "3.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
20
|
+
{ file: "4.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
21
|
+
{ file: "5.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
22
|
+
{ file: "6.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
23
|
+
{ file: "7.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
24
|
+
{ file: "8.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
25
|
+
{ file: "9.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
26
|
+
{ file: "10.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
27
|
+
{ file: "11.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
28
|
+
{ file: "12.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
29
|
+
{ file: "13.png", season: 17, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
30
|
+
{ file: "1.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
31
|
+
{ file: "2.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
32
|
+
{ file: "3.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
33
|
+
{ file: "4.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
34
|
+
{ file: "5.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
35
|
+
{ file: "6.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
36
|
+
{ file: "7.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
37
|
+
{ file: "8.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
38
|
+
{ file: "9.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
39
|
+
{ file: "10.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
40
|
+
{ file: "11.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
41
|
+
{ file: "12.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
42
|
+
{ file: "13.png", season: 19, rarity: career_1.AVATAR_RARITY.SEASONAL, portrait: true },
|
|
43
|
+
];
|
|
44
|
+
/** Chemin complet utilisé pour afficher l'avatar d'un joueur (ex: <img src>) */
|
|
45
|
+
function getSeasonAvatarPath(season) {
|
|
46
|
+
return `tile/shop/avatar-season/s${season}`;
|
|
47
|
+
}
|
|
48
|
+
/** Chemin relatif utilisé comme prop `type` dans le composant Item du shop */
|
|
49
|
+
function getSeasonAvatarItemType(season) {
|
|
50
|
+
return `avatar-season/s${season}`;
|
|
51
|
+
}
|
|
52
|
+
function findSeasonAvatar(file) {
|
|
53
|
+
return exports.AVATAR_SEASON_LIST.find((a) => a.file === file);
|
|
54
|
+
}
|
package/dist/career.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CAREER_ID as CAREER_ID_2025, Career as Career2025 } from "./career2025";
|
|
1
2
|
import { SKILL_NAMES } from "./skill";
|
|
2
3
|
declare enum RACE {
|
|
3
4
|
AMAZON = "amazon-career",
|
|
@@ -26,7 +27,8 @@ declare enum RACE {
|
|
|
26
27
|
declare enum AVATAR_RARITY {
|
|
27
28
|
COMMUN = "c",
|
|
28
29
|
RARE = "r",
|
|
29
|
-
UNIQUE = "u"
|
|
30
|
+
UNIQUE = "u",
|
|
31
|
+
SEASONAL = "s"
|
|
30
32
|
}
|
|
31
33
|
declare enum AVATAR {
|
|
32
34
|
BEASTMAN = "beastman",
|
|
@@ -157,7 +159,8 @@ declare enum CAREER_ID {
|
|
|
157
159
|
}
|
|
158
160
|
declare enum CAREER_VERSION {
|
|
159
161
|
V6 = "v6",
|
|
160
|
-
V2020 = "v2020"
|
|
162
|
+
V2020 = "v2020",
|
|
163
|
+
V2025 = "v2025"
|
|
161
164
|
}
|
|
162
165
|
export type Career = {
|
|
163
166
|
MA: number;
|
|
@@ -177,5 +180,11 @@ export type Career = {
|
|
|
177
180
|
hasSprite?: boolean;
|
|
178
181
|
version: CAREER_VERSION;
|
|
179
182
|
};
|
|
180
|
-
|
|
181
|
-
|
|
183
|
+
type CAREER_ID_ALL = CAREER_ID | CAREER_ID_2025;
|
|
184
|
+
type CareerMap = Record<CAREER_ID_ALL, Career | Career2025>;
|
|
185
|
+
type AvailableCareerMap = Record<CAREER_ID_2025, Career2025>;
|
|
186
|
+
declare const getCareers: () => CareerMap;
|
|
187
|
+
declare const getAvailableCareers: () => AvailableCareerMap;
|
|
188
|
+
declare const CAREER_IS_2025: Record<CAREER_ID, boolean>;
|
|
189
|
+
declare const CAREER_MIGRATION_2025: Record<CAREER_ID, boolean>;
|
|
190
|
+
export { AVATAR, AVATAR_RARITY, CAREER_ID, CAREER_ID_ALL, CAREER_IS_2025, CAREER_MIGRATION_2025, CAREER_VERSION, RACE, getAvailableCareers, getCareers, };
|
package/dist/career.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
// AG: Agility
|
|
5
5
|
// AV: Armour Value
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.
|
|
7
|
+
exports.getCareers = exports.getAvailableCareers = exports.RACE = exports.CAREER_VERSION = exports.CAREER_MIGRATION_2025 = exports.CAREER_IS_2025 = exports.CAREER_ID = exports.AVATAR_RARITY = exports.AVATAR = void 0;
|
|
8
|
+
const career2025_1 = require("./career2025");
|
|
8
9
|
const skill_1 = require("./skill");
|
|
9
10
|
var RACE;
|
|
10
11
|
(function (RACE) {
|
|
@@ -36,6 +37,7 @@ var AVATAR_RARITY;
|
|
|
36
37
|
AVATAR_RARITY["COMMUN"] = "c";
|
|
37
38
|
AVATAR_RARITY["RARE"] = "r";
|
|
38
39
|
AVATAR_RARITY["UNIQUE"] = "u";
|
|
40
|
+
AVATAR_RARITY["SEASONAL"] = "s";
|
|
39
41
|
})(AVATAR_RARITY || (exports.AVATAR_RARITY = AVATAR_RARITY = {}));
|
|
40
42
|
var AVATAR;
|
|
41
43
|
(function (AVATAR) {
|
|
@@ -179,6 +181,7 @@ var CAREER_VERSION;
|
|
|
179
181
|
(function (CAREER_VERSION) {
|
|
180
182
|
CAREER_VERSION["V6"] = "v6";
|
|
181
183
|
CAREER_VERSION["V2020"] = "v2020";
|
|
184
|
+
CAREER_VERSION["V2025"] = "v2025";
|
|
182
185
|
})(CAREER_VERSION || (exports.CAREER_VERSION = CAREER_VERSION = {}));
|
|
183
186
|
const CAREER = {
|
|
184
187
|
// SLANN
|
|
@@ -670,11 +673,7 @@ const CAREER = {
|
|
|
670
673
|
double: "AS",
|
|
671
674
|
normalCoach: "G",
|
|
672
675
|
icons: ["imperial-thrower1"],
|
|
673
|
-
skills: [
|
|
674
|
-
skill_1.SKILL_NAMES.PASS,
|
|
675
|
-
skill_1.SKILL_NAMES.RUNNING_PASS,
|
|
676
|
-
skill_1.SKILL_NAMES.SPECIALIST,
|
|
677
|
-
],
|
|
676
|
+
skills: [skill_1.SKILL_NAMES.PASS, skill_1.SKILL_NAMES.GIVE_AND_GO, skill_1.SKILL_NAMES.SPECIALIST],
|
|
678
677
|
avatars: [AVATAR.HUMAN, AVATAR.HUMAN_WOMAN],
|
|
679
678
|
badge: RACE.IMPERIAL,
|
|
680
679
|
range: 1,
|
|
@@ -2120,6 +2119,36 @@ const CAREER = {
|
|
|
2120
2119
|
},
|
|
2121
2120
|
};
|
|
2122
2121
|
const getCareers = () => {
|
|
2123
|
-
|
|
2122
|
+
const nextCareers = (0, career2025_1.getCareers)();
|
|
2123
|
+
return {
|
|
2124
|
+
...CAREER,
|
|
2125
|
+
...nextCareers,
|
|
2126
|
+
};
|
|
2124
2127
|
};
|
|
2125
2128
|
exports.getCareers = getCareers;
|
|
2129
|
+
const getAvailableCareers = () => {
|
|
2130
|
+
const nextCareers = (0, career2025_1.getCareers)();
|
|
2131
|
+
const allowedBadges = new Set(Object.values(RACE));
|
|
2132
|
+
return Object.entries(nextCareers).reduce((acc, [id, career]) => {
|
|
2133
|
+
if (allowedBadges.has(career.badge)) {
|
|
2134
|
+
acc[id] = career;
|
|
2135
|
+
}
|
|
2136
|
+
return acc;
|
|
2137
|
+
}, {});
|
|
2138
|
+
};
|
|
2139
|
+
exports.getAvailableCareers = getAvailableCareers;
|
|
2140
|
+
const CAREER_IS_2025 = Object.values(CAREER_ID).reduce((acc, id) => {
|
|
2141
|
+
acc[id] = new Set(Object.values(career2025_1.CAREER_ID)).has(id);
|
|
2142
|
+
return acc;
|
|
2143
|
+
}, {});
|
|
2144
|
+
exports.CAREER_IS_2025 = CAREER_IS_2025;
|
|
2145
|
+
// Migration 2025 : indique si un career legacy existe en v2025
|
|
2146
|
+
const CAREER_MIGRATION_2025 = (() => {
|
|
2147
|
+
const migrated = new Set(Object.values(career2025_1.CAREER_ID));
|
|
2148
|
+
const map = {};
|
|
2149
|
+
Object.values(CAREER_ID).forEach((id) => {
|
|
2150
|
+
map[id] = migrated.has(id);
|
|
2151
|
+
});
|
|
2152
|
+
return map;
|
|
2153
|
+
})();
|
|
2154
|
+
exports.CAREER_MIGRATION_2025 = CAREER_MIGRATION_2025;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { SKILL_NAMES } from "./skill";
|
|
2
|
+
declare enum RACE {
|
|
3
|
+
AMAZON_CAREER = "amazon-career",
|
|
4
|
+
CHAOS_CAREER = "chaos-career",
|
|
5
|
+
CHAOS_DWARF_CAREER = "chaos-dwarf-career",
|
|
6
|
+
DARK_ELFE_CAREER = "dark-elfe-career",
|
|
7
|
+
DWARF_CAREER = "dwarf-career",
|
|
8
|
+
ELVEN_UNION_CAREER = "elven-union-career",
|
|
9
|
+
GOBELIN_CAREER = "gobelin-career",
|
|
10
|
+
HALFLING_CAREER = "halfling-career",
|
|
11
|
+
HIGH_ELF_CAREER = "high-elf-career",
|
|
12
|
+
HUMAN_CAREER = "human-career",
|
|
13
|
+
IMPERIAL_CAREER = "imperial-career",
|
|
14
|
+
KHORNE_CAREER = "khorne-career",
|
|
15
|
+
LIZARDMEN_CAREER = "lizardmen-career",
|
|
16
|
+
NECROMANTIC_CAREER = "necromantic-career",
|
|
17
|
+
NORSE_CAREER = "norse-career",
|
|
18
|
+
NURGLE_CAREER = "nurgle-career",
|
|
19
|
+
ORC_CAREER = "orc-career",
|
|
20
|
+
RAT_CAREER = "rat-career",
|
|
21
|
+
SILVAN_CAREER = "silvan-career",
|
|
22
|
+
SLANN_CAREER = "slann-career",
|
|
23
|
+
SNOTLING_CAREER = "snotling-career",
|
|
24
|
+
UNDEAD_CAREER = "undead-career",
|
|
25
|
+
VAMPIRE_CAREER = "vampire-career"
|
|
26
|
+
}
|
|
27
|
+
declare enum AVATAR {
|
|
28
|
+
BEASTMAN = "beastman",
|
|
29
|
+
BLACK_ORC = "black-orc",
|
|
30
|
+
BLOATER = "bloater",
|
|
31
|
+
BLOODSPAWN = "bloodspawn",
|
|
32
|
+
CENTAUR = "centaur",
|
|
33
|
+
CHAOS_DWARF = "chaos-dwarf",
|
|
34
|
+
CHAOS_WARRIOR = "chaos-warrior",
|
|
35
|
+
DARK_ELF = "dark_elf",
|
|
36
|
+
DWARF = "dwarf",
|
|
37
|
+
ELF = "elf",
|
|
38
|
+
GOBELIN = "gobelin",
|
|
39
|
+
GOLEM = "golem",
|
|
40
|
+
HALFING = "halfing",
|
|
41
|
+
HUMAN_WOMAN = "human-woman",
|
|
42
|
+
HUMAN = "human",
|
|
43
|
+
LIZARDMEN = "lezard",
|
|
44
|
+
MINOTAUR = "minotaur",
|
|
45
|
+
MUMMIE = "mummie",
|
|
46
|
+
OGRE = "ogre",
|
|
47
|
+
ORC = "orc",
|
|
48
|
+
RAT_OGRE = "rat_ogre",
|
|
49
|
+
RAT = "rat",
|
|
50
|
+
ROTSPAWN = "rotspawn",
|
|
51
|
+
SLANN = "slann",
|
|
52
|
+
TREEMAN = "treeman",
|
|
53
|
+
TROLL = "troll",
|
|
54
|
+
UNDEAD = "undead",
|
|
55
|
+
VAMPIRE = "vampire",
|
|
56
|
+
WAGON = "wagon",
|
|
57
|
+
WEREWOLF = "werewolf",
|
|
58
|
+
YHETEE = "yhetee"
|
|
59
|
+
}
|
|
60
|
+
declare enum CAREER_ID {
|
|
61
|
+
AMAZON_BLITZER_2025 = "amazon-blitzer-2025",
|
|
62
|
+
AMAZON_BLOCKER_2025 = "amazon-blocker-2025",
|
|
63
|
+
AMAZON_LINEWOMAN_2025 = "amazon-linewoman-2025",
|
|
64
|
+
AMAZON_THROWER_2025 = "amazon-thrower-2025",
|
|
65
|
+
CHAOS_CHOSEN_BEASTMAN_2025 = "chaos-chosen-beastman-2025",
|
|
66
|
+
CHAOS_CHOSEN_CHOSEN_2025 = "chaos-chosen-chosen-2025",
|
|
67
|
+
CHAOS_CHOSEN_MINOTAUR_2025 = "chaos-chosen-minotaur-2025",
|
|
68
|
+
CHAOS_DWARF_BLOCKER_2025 = "chaos-dwarf-blocker-2025",
|
|
69
|
+
CHAOS_DWARF_BULL_CENTAUR_2025 = "chaos-dwarf-bull-centaur-2025",
|
|
70
|
+
CHAOS_DWARF_FLAMER_2025 = "chaos-dwarf-flamer-2025",
|
|
71
|
+
CHAOS_DWARF_HOBGOBLIN_2025 = "chaos-dwarf-hobgoblin-2025",
|
|
72
|
+
CHAOS_DWARF_MINOTAUR_2025 = "chaos-dwarf-minotaur-2025",
|
|
73
|
+
CHAOS_DWARF_STABBA_2025 = "chaos-dwarf-stabba-2025",
|
|
74
|
+
DARK_ELF_ASSASSIN_2025 = "dark-elf-assassin-2025",
|
|
75
|
+
DARK_ELF_BLITZER_2025 = "dark-elf-blitzer-2025",
|
|
76
|
+
DARK_ELF_LINEMAN_2025 = "dark-elf-lineman-2025",
|
|
77
|
+
DARK_ELF_RUNNER_2025 = "dark-elf-runner-2025",
|
|
78
|
+
DARK_ELF_WITCH_ELF_2025 = "dark-elf-witch-elf-2025",
|
|
79
|
+
DWARF_BLITZER_2025 = "dwarf-blitzer-2025",
|
|
80
|
+
DWARF_DEATHROLLER_2025 = "dwarf-deathroller-2025",
|
|
81
|
+
DWARF_LINEMAN_2025 = "dwarf-lineman-2025",
|
|
82
|
+
DWARF_RUNNER_2025 = "dwarf-runner-2025",
|
|
83
|
+
DWARF_TROLL_SLAYER_2025 = "dwarf-troll-slayer-2025",
|
|
84
|
+
ELVEN_UNION_BLITZER_2025 = "elven-union-blitzer-2025",
|
|
85
|
+
ELVEN_UNION_CATCHER_2025 = "elven-union-catcher-2025",
|
|
86
|
+
ELVEN_UNION_LINEMAN_2025 = "elven-union-lineman-2025",
|
|
87
|
+
ELVEN_UNION_THROWER_2025 = "elven-union-thrower-2025",
|
|
88
|
+
GOBLIN_DOOM_DIVER_2025 = "goblin-doom-diver-2025",
|
|
89
|
+
GOBLIN_LINEMAN_2025 = "goblin-lineman-2025",
|
|
90
|
+
GOBLIN_LOONY_2025 = "goblin-loony-2025",
|
|
91
|
+
GOBLIN_OOLIGAN_2025 = "goblin-ooligan-2025",
|
|
92
|
+
GOBLIN_POGOER_2025 = "goblin-pogoer-2025",
|
|
93
|
+
GOBLIN_TROLL_2025 = "goblin-troll-2025",
|
|
94
|
+
HALFLING_CATCHER_2025 = "halfling-catcher-2025",
|
|
95
|
+
HALFLING_HEFTY_2025 = "halfling-hefty-2025",
|
|
96
|
+
HALFLING_LINEMAN_2025 = "halfling-lineman-2025",
|
|
97
|
+
HALFLING_TREEMAN_2025 = "halfling-treeman-2025",
|
|
98
|
+
HIGH_ELF_BLITZER_2025 = "high-elf-blitzer-2025",
|
|
99
|
+
HIGH_ELF_CATCHER_2025 = "high-elf-catcher-2025",
|
|
100
|
+
HIGH_ELF_LINEMAN_2025 = "high-elf-lineman-2025",
|
|
101
|
+
HIGH_ELF_THROWER_2025 = "high-elf-thrower-2025",
|
|
102
|
+
HUMAN_BLITZER_2025 = "human-blitzer-2025",
|
|
103
|
+
HUMAN_CATCHER_2025 = "human-catcher-2025",
|
|
104
|
+
HUMAN_LINEMAN_2025 = "human-lineman-2025",
|
|
105
|
+
HUMAN_OGRE_2025 = "human-ogre-2025",
|
|
106
|
+
HUMAN_THROWER_2025 = "human-thrower-2025",
|
|
107
|
+
IMPERIAL_NOBILITY_BLITZER_2025 = "imperial-nobility-blitzer-2025",
|
|
108
|
+
IMPERIAL_NOBILITY_BODYGUARD_2025 = "imperial-nobility-bodyguard-2025",
|
|
109
|
+
IMPERIAL_NOBILITY_OGRE_2025 = "imperial-nobility-ogre-2025",
|
|
110
|
+
IMPERIAL_NOBILITY_RETAINER_2025 = "imperial-nobility-retainer-2025",
|
|
111
|
+
IMPERIAL_NOBILITY_THROWER_2025 = "imperial-nobility-thrower-2025",
|
|
112
|
+
KHORNE_BLOODSEEKER_2025 = "khorne-bloodseeker-2025",
|
|
113
|
+
KHORNE_BLOODSPAWN_2025 = "khorne-bloodspawn-2025",
|
|
114
|
+
KHORNE_KHORNGOR_2025 = "khorne-khorngor-2025",
|
|
115
|
+
KHORNE_MARAUDER_2025 = "khorne-marauder-2025",
|
|
116
|
+
LIZARDMEN_CHAMELEON_2025 = "lizardmen-chameleon-2025",
|
|
117
|
+
LIZARDMEN_KROXIGOR_2025 = "lizardmen-kroxigor-2025",
|
|
118
|
+
LIZARDMEN_SAURUS_2025 = "lizardmen-saurus-2025",
|
|
119
|
+
LIZARDMEN_SKINK_2025 = "lizardmen-skink-2025",
|
|
120
|
+
NECROMANTIC_HORROR_FLESH_GOLEM_2025 = "necromantic-horror-flesh-golem-2025",
|
|
121
|
+
NECROMANTIC_HORROR_GHOUL_2025 = "necromantic-horror-ghoul-2025",
|
|
122
|
+
NECROMANTIC_HORROR_WEREWOLF_2025 = "necromantic-horror-werewolf-2025",
|
|
123
|
+
NECROMANTIC_HORROR_WRAITH_2025 = "necromantic-horror-wraith-2025",
|
|
124
|
+
NECROMANTIC_HORROR_ZOMBIE_2025 = "necromantic-horror-zombie-2025",
|
|
125
|
+
NORSE_BERSERKER_2025 = "norse-berserker-2025",
|
|
126
|
+
NORSE_RAIDER_2025 = "norse-raider-2025",
|
|
127
|
+
NORSE_ULFWERNER_2025 = "norse-ulfwerner-2025",
|
|
128
|
+
NORSE_VALKYRIE_2025 = "norse-valkyrie-2025",
|
|
129
|
+
NORSE_YHETEE_2025 = "norse-yhetee-2025",
|
|
130
|
+
NURGLE_BLOATER_2025 = "nurgle-bloater-2025",
|
|
131
|
+
NURGLE_PESTIGOR_2025 = "nurgle-pestigor-2025",
|
|
132
|
+
NURGLE_ROTSPAWN_2025 = "nurgle-rotspawn-2025",
|
|
133
|
+
NURGLE_ROTTER_2025 = "nurgle-rotter-2025",
|
|
134
|
+
ORC_BIG_UN_2025 = "orc-big-un-2025",
|
|
135
|
+
ORC_BLITZER_2025 = "orc-blitzer-2025",
|
|
136
|
+
ORC_LINEMAN_2025 = "orc-lineman-2025",
|
|
137
|
+
ORC_THROWER_2025 = "orc-thrower-2025",
|
|
138
|
+
ORC_TROLL_2025 = "orc-troll-2025",
|
|
139
|
+
SHAMBLING_UNDEAD_GHOUL_2025 = "shambling-undead-ghoul-2025",
|
|
140
|
+
SHAMBLING_UNDEAD_MUMMY_2025 = "shambling-undead-mummy-2025",
|
|
141
|
+
SHAMBLING_UNDEAD_SKELETON_2025 = "shambling-undead-skeleton-2025",
|
|
142
|
+
SHAMBLING_UNDEAD_WIGHT_2025 = "shambling-undead-wight-2025",
|
|
143
|
+
SHAMBLING_UNDEAD_ZOMBIE_2025 = "shambling-undead-zombie-2025",
|
|
144
|
+
SKAVEN_BLITZER_2025 = "skaven-blitzer-2025",
|
|
145
|
+
SKAVEN_CLANRAT_2025 = "skaven-clanrat-2025",
|
|
146
|
+
SKAVEN_GUTTER_2025 = "skaven-gutter-2025",
|
|
147
|
+
SKAVEN_RAT_OGRE_2025 = "skaven-rat-ogre-2025",
|
|
148
|
+
SKAVEN_THROWER_2025 = "skaven-thrower-2025",
|
|
149
|
+
SLANN_BLITZER_2025 = "slann-blitzer-2025",
|
|
150
|
+
SLANN_CATCHER_2025 = "slann-catcher-2025",
|
|
151
|
+
SLANN_KROXIGOR_2025 = "slann-kroxigor-2025",
|
|
152
|
+
SLANN_LINEMAN_2025 = "slann-lineman-2025",
|
|
153
|
+
SNOTLING_HOPPA_2025 = "snotling-hoppa-2025",
|
|
154
|
+
SNOTLING_LINEMAN_2025 = "snotling-lineman-2025",
|
|
155
|
+
SNOTLING_PUMP_WAGON_2025 = "snotling-pump-wagon-2025",
|
|
156
|
+
SNOTLING_RUNNA_2025 = "snotling-runna-2025",
|
|
157
|
+
SNOTLING_TROLL_2025 = "snotling-troll-2025",
|
|
158
|
+
VAMPIRE_BLITZER_2025 = "vampire-blitzer-2025",
|
|
159
|
+
VAMPIRE_RUNNER_2025 = "vampire-runner-2025",
|
|
160
|
+
VAMPIRE_THRALL_2025 = "vampire-thrall-2025",
|
|
161
|
+
VAMPIRE_THROWER_2025 = "vampire-thrower-2025",
|
|
162
|
+
VAMPIRE_VARGHEIST_2025 = "vampire-vargheist-2025",
|
|
163
|
+
WOOD_ELF_CATCHER_2025 = "wood-elf-catcher-2025",
|
|
164
|
+
WOOD_ELF_LINEMAN_2025 = "wood-elf-lineman-2025",
|
|
165
|
+
WOOD_ELF_THROWER_2025 = "wood-elf-thrower-2025",
|
|
166
|
+
WOOD_ELF_WARDANCER_2025 = "wood-elf-wardancer-2025"
|
|
167
|
+
}
|
|
168
|
+
declare enum CAREER_VERSION {
|
|
169
|
+
V6 = "v6",
|
|
170
|
+
V2020 = "v2020",
|
|
171
|
+
V2025 = "v2025"
|
|
172
|
+
}
|
|
173
|
+
export type Career = {
|
|
174
|
+
MA: number;
|
|
175
|
+
ST: number;
|
|
176
|
+
AG: number;
|
|
177
|
+
PA: number;
|
|
178
|
+
AV: number;
|
|
179
|
+
normal: string;
|
|
180
|
+
double: string;
|
|
181
|
+
normalCoach: string;
|
|
182
|
+
icons: string[];
|
|
183
|
+
skills: (SKILL_NAMES | [SKILL_NAMES, number])[];
|
|
184
|
+
avatars: AVATAR[];
|
|
185
|
+
badge: RACE;
|
|
186
|
+
range: number;
|
|
187
|
+
cost: number;
|
|
188
|
+
hasSprite?: boolean;
|
|
189
|
+
version: CAREER_VERSION;
|
|
190
|
+
};
|
|
191
|
+
declare const getCareers: () => Record<CAREER_ID, Career>;
|
|
192
|
+
export { AVATAR, CAREER_ID, CAREER_VERSION, getCareers, RACE };
|