enefel 2.9.0 → 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.
Files changed (77) hide show
  1. package/.claude/settings.local.json +7 -0
  2. package/2025/newSkills.ts +769 -0
  3. package/2025/raceMigration.ts +66 -0
  4. package/2025/rawTeamsData.ts +1726 -0
  5. package/2025/skillMigration.ts +155 -0
  6. package/avatarsSeason.ts +61 -0
  7. package/career.ts +64 -8
  8. package/career2025.ts +2752 -0
  9. package/dice.ts +40 -8
  10. package/dist/2025/newSkills.d.ts +10 -0
  11. package/dist/2025/newSkills.js +663 -0
  12. package/dist/2025/raceMigration.d.ts +10 -0
  13. package/dist/2025/raceMigration.js +53 -0
  14. package/dist/2025/rawTeamsData.d.ts +12 -0
  15. package/dist/2025/rawTeamsData.js +1699 -0
  16. package/dist/2025/skillMigration.d.ts +31 -0
  17. package/dist/2025/skillMigration.js +95 -0
  18. package/dist/avatarsSeason.d.ts +22 -0
  19. package/dist/avatarsSeason.js +54 -0
  20. package/dist/career.d.ts +13 -4
  21. package/dist/career.js +36 -7
  22. package/dist/career2025.d.ts +192 -0
  23. package/dist/career2025.js +2611 -0
  24. package/dist/dice.d.ts +10 -2
  25. package/dist/dice.js +31 -8
  26. package/dist/index.d.ts +17 -2
  27. package/dist/index.js +44 -5
  28. package/dist/move.d.ts +6 -2
  29. package/dist/move.js +35 -0
  30. package/dist/package-lock.json +913 -7
  31. package/dist/package.json +6 -2
  32. package/dist/pitch.d.ts +10 -1
  33. package/dist/pitch.js +16 -0
  34. package/dist/player.d.ts +8 -4
  35. package/dist/player.js +104 -20
  36. package/dist/position.d.ts +4 -0
  37. package/dist/position.js +17 -1
  38. package/dist/race.d.ts +23 -12
  39. package/dist/race.js +210 -2
  40. package/dist/skill.d.ts +26 -3
  41. package/dist/skill.js +199 -81
  42. package/dist/skills/hitAndRun.d.ts +10 -0
  43. package/dist/skills/hitAndRun.js +12 -0
  44. package/dist/skills/safePairOfHands.d.ts +28 -0
  45. package/dist/skills/safePairOfHands.js +18 -0
  46. package/dist/skills/sidestep.d.ts +21 -0
  47. package/dist/skills/sidestep.js +20 -0
  48. package/dist/status.d.ts +4 -1
  49. package/dist/status.js +14 -4
  50. package/dist/store.d.ts +3 -0
  51. package/dist/store.js +3 -0
  52. package/dist/teams/career_v2025.d.ts +246 -0
  53. package/dist/teams/career_v2025.js +3512 -0
  54. package/dist/teams/convert-csv-to-career.d.ts +1 -0
  55. package/dist/teams/convert-csv-to-career.js +1085 -0
  56. package/dist/types/models.d.ts +4 -0
  57. package/index.ts +57 -4
  58. package/jest.config.js +3 -0
  59. package/move.ts +50 -2
  60. package/npm-login.sh +0 -0
  61. package/package.json +6 -2
  62. package/pitch.ts +22 -0
  63. package/player.ts +105 -22
  64. package/position.ts +16 -0
  65. package/race.ts +227 -13
  66. package/skill.ts +217 -83
  67. package/skills/hitAndRun.ts +14 -0
  68. package/skills/safePairOfHands.ts +33 -0
  69. package/skills/sidestep.ts +25 -0
  70. package/status.ts +15 -3
  71. package/store.ts +3 -0
  72. package/teams/README.md +53 -0
  73. package/teams/clean-stats.js +54 -0
  74. package/teams/convert-csv-to-career.ts +1209 -0
  75. package/teams/players_clean.csv +107 -0
  76. package/teams/players_next.csv +21 -0
  77. package/types/models.ts +4 -0
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.9.0",
3
+ "version": "2.11.0",
4
4
  "description": "Blood Bowl 3 game engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,12 +20,16 @@
20
20
  "watch": "tsc -w",
21
21
  "prepare": "yarn build",
22
22
  "test": "jest",
23
- "test:watch": "jest --watch"
23
+ "test:watch": "jest --watch",
24
+ "convert:career": "npx ts-node teams/convert-csv-to-career.ts"
24
25
  },
25
26
  "keywords": [],
26
27
  "author": "Manest",
27
28
  "license": "MIT",
28
29
  "dependencies": {
30
+ "csv-parse": "^6.1.0",
31
+ "csv-stringify": "^6.6.0",
32
+ "jsdom": "^27.2.0",
29
33
  "seedrandom": "3.0.5",
30
34
  "yup": "^0.29.3"
31
35
  },
package/dist/pitch.d.ts CHANGED
@@ -28,4 +28,13 @@ declare function getNumberPlayerZone(teamNumber: number, players: Player[], game
28
28
  playerLateralB: number;
29
29
  playerCenter: number;
30
30
  };
31
- export { coordinatesConvertorX, coordinatesConvertorY, getCenterTile, getHalfStadium, getIndexFromXY, getLateralATile, getLateralBTile, getNumberPlayerZone, getScrimmageTile, getTdTile, getTile, TILES, };
31
+ /**
32
+ * Checks if a tile at position (x, y) is the enemy team's touchdown zone
33
+ * @param x - X coordinate
34
+ * @param y - Y coordinate
35
+ * @param teamId - The player's team ID
36
+ * @param game - Game object containing stadium_zone, stadium_width, team1, team2
37
+ * @returns true if the tile is the enemy TD zone
38
+ */
39
+ declare function isEnemyTDZone(x: number, y: number, teamId: string, game: Game): boolean;
40
+ export { coordinatesConvertorX, coordinatesConvertorY, getCenterTile, getHalfStadium, getIndexFromXY, getLateralATile, getLateralBTile, getNumberPlayerZone, getScrimmageTile, getTdTile, getTile, isEnemyTDZone, TILES, };
package/dist/pitch.js CHANGED
@@ -12,6 +12,7 @@ exports.getNumberPlayerZone = getNumberPlayerZone;
12
12
  exports.getScrimmageTile = getScrimmageTile;
13
13
  exports.getTdTile = getTdTile;
14
14
  exports.getTile = getTile;
15
+ exports.isEnemyTDZone = isEnemyTDZone;
15
16
  const index_1 = require("./index");
16
17
  const status_1 = require("./status");
17
18
  var TILES;
@@ -112,3 +113,18 @@ function getNumberPlayerZone(teamNumber, players, game) {
112
113
  });
113
114
  return { playerScrimmage, playerLateralA, playerLateralB, playerCenter };
114
115
  }
116
+ /**
117
+ * Checks if a tile at position (x, y) is the enemy team's touchdown zone
118
+ * @param x - X coordinate
119
+ * @param y - Y coordinate
120
+ * @param teamId - The player's team ID
121
+ * @param game - Game object containing stadium_zone, stadium_width, team1, team2
122
+ * @returns true if the tile is the enemy TD zone
123
+ */
124
+ function isEnemyTDZone(x, y, teamId, game) {
125
+ const tile = getTile(game, x, y);
126
+ // Determine if player is team1 or team2, then get enemy TD zone
127
+ const enemyTDTeamNumber = teamId === game.team1?.id ? 2 : 1;
128
+ const enemyTD = getTdTile(enemyTDTeamNumber);
129
+ return tile === enemyTD;
130
+ }
package/dist/player.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { CAREER_VERSION } from "./career";
1
2
  import { Game, Player, PlayerWithSkill, Team } from "./types/models";
2
3
  declare enum PLAYER_INJURY {
3
4
  BADLY_HURT = "badly-hurt",
@@ -13,6 +14,8 @@ declare enum PLAYER_CARAC {
13
14
  ST = "ST",
14
15
  PA = "PA"
15
16
  }
17
+ declare const CARAC_MAX: Record<PLAYER_CARAC, number>;
18
+ declare const CARAC_MIN: Record<PLAYER_CARAC, number>;
16
19
  declare function hasMove(player: PlayerWithSkill, game: Game): boolean;
17
20
  declare function arePlayingSameGame(p1: Player, p2: Player): boolean;
18
21
  declare function hasTeam(player: Player): boolean;
@@ -25,17 +28,18 @@ declare function isTeam1(player: Player, game: Game): boolean;
25
28
  declare function isRookie(player: Player): boolean;
26
29
  declare function getCareerBaseCarac(player: Player, carac: PLAYER_CARAC): number;
27
30
  declare function getCareerBaseCaracLimit(player: Player, value: number, carac: PLAYER_CARAC): number;
28
- declare function getMaxCarac(player: Player, carac: PLAYER_CARAC, game: Game): number;
29
- declare function getMaxCommun(player: Player, carac: PLAYER_CARAC, _game: Game): any;
31
+ declare function getMaxCarac(player: Player, carac: PLAYER_CARAC, game?: Game): number;
32
+ declare function getMaxCommun(player: Player, carac: PLAYER_CARAC, _game: Game): number;
30
33
  declare function getMaxAV(player: Player, game: Game): number;
31
34
  declare function getMaxST(player: Player, game: Game): number;
32
35
  declare function getMaxAG(player: Player, game: Game): number;
33
36
  declare function getMaxMA(player: Player, game: Game): number;
37
+ declare function getMaxPA(player: Player, game?: Game): number;
34
38
  declare function getMaxGfi(player: PlayerWithSkill): 2 | 3;
35
39
  declare const AGING_SIZE_RANGE = 5;
36
40
  declare function gamesforAgingRoll(totalGames: number): number;
37
41
  declare const AGING_INITIAL_BONUS = 5;
38
42
  declare const AGING_MIN_BONUS = -3;
39
43
  declare function getAgingBonus(player: Player, totalGames: number): number | null;
40
- declare function BB2020Carac(value: number, carac: PLAYER_CARAC): string | number;
41
- export { AGING_INITIAL_BONUS, AGING_MIN_BONUS, AGING_SIZE_RANGE, areFromSameTeam, arePlayingSameGame, BB2020Carac, gamesforAgingRoll, getAgingBonus, getCareerBaseCarac, getCareerBaseCaracLimit, getMaxAG, getMaxAV, getMaxCarac, getMaxCommun, getMaxGfi, getMaxMA, getMaxST, hasMove, hasTeam, isPlaying, isPlayingGame, isRookie, isTeam1, isTeamPlaying, isTeamPlayingGame, PLAYER_CARAC, PLAYER_INJURY, };
44
+ declare function BB2020Carac(value: number, carac: PLAYER_CARAC, careerVersion?: CAREER_VERSION): string | number;
45
+ export { AGING_INITIAL_BONUS, AGING_MIN_BONUS, AGING_SIZE_RANGE, areFromSameTeam, arePlayingSameGame, BB2020Carac, CARAC_MAX, CARAC_MIN, gamesforAgingRoll, getAgingBonus, getCareerBaseCarac, getCareerBaseCaracLimit, getMaxAG, getMaxAV, getMaxCarac, getMaxCommun, getMaxGfi, getMaxMA, getMaxPA, getMaxST, hasMove, hasTeam, isPlaying, isPlayingGame, isRookie, isTeam1, isTeamPlaying, isTeamPlayingGame, PLAYER_CARAC, PLAYER_INJURY, };
package/dist/player.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PLAYER_INJURY = exports.PLAYER_CARAC = exports.AGING_SIZE_RANGE = exports.AGING_MIN_BONUS = exports.AGING_INITIAL_BONUS = void 0;
3
+ exports.PLAYER_INJURY = exports.PLAYER_CARAC = exports.CARAC_MIN = exports.CARAC_MAX = exports.AGING_SIZE_RANGE = exports.AGING_MIN_BONUS = exports.AGING_INITIAL_BONUS = void 0;
4
4
  exports.areFromSameTeam = areFromSameTeam;
5
5
  exports.arePlayingSameGame = arePlayingSameGame;
6
6
  exports.BB2020Carac = BB2020Carac;
@@ -14,6 +14,7 @@ exports.getMaxCarac = getMaxCarac;
14
14
  exports.getMaxCommun = getMaxCommun;
15
15
  exports.getMaxGfi = getMaxGfi;
16
16
  exports.getMaxMA = getMaxMA;
17
+ exports.getMaxPA = getMaxPA;
17
18
  exports.getMaxST = getMaxST;
18
19
  exports.hasMove = hasMove;
19
20
  exports.hasTeam = hasTeam;
@@ -23,6 +24,7 @@ exports.isRookie = isRookie;
23
24
  exports.isTeam1 = isTeam1;
24
25
  exports.isTeamPlaying = isTeamPlaying;
25
26
  exports.isTeamPlayingGame = isTeamPlayingGame;
27
+ const career_1 = require("./career");
26
28
  const improvement_1 = require("./improvement");
27
29
  const meteo_1 = require("./meteo");
28
30
  const race_1 = require("./race");
@@ -43,6 +45,24 @@ var PLAYER_CARAC;
43
45
  PLAYER_CARAC["ST"] = "ST";
44
46
  PLAYER_CARAC["PA"] = "PA";
45
47
  })(PLAYER_CARAC || (exports.PLAYER_CARAC = PLAYER_CARAC = {}));
48
+ // Valeurs maximales absolues des caractéristiques (Blood Bowl 2020 rulebook)
49
+ const CARAC_MAX = {
50
+ [PLAYER_CARAC.MA]: 9,
51
+ [PLAYER_CARAC.ST]: 8,
52
+ [PLAYER_CARAC.AG]: 5, // interne 5 = affichage 1+
53
+ [PLAYER_CARAC.PA]: 5, // interne 5 = affichage 1+
54
+ [PLAYER_CARAC.AV]: 10, // interne 10 = affichage 11+
55
+ };
56
+ exports.CARAC_MAX = CARAC_MAX;
57
+ // Valeurs minimales absolues des caractéristiques
58
+ const CARAC_MIN = {
59
+ [PLAYER_CARAC.MA]: 1,
60
+ [PLAYER_CARAC.ST]: 1,
61
+ [PLAYER_CARAC.AG]: 1, // interne 1 = affichage 6+
62
+ [PLAYER_CARAC.PA]: 0, // 0 = pas de PA
63
+ [PLAYER_CARAC.AV]: 2, // interne 2 = affichage 3+
64
+ };
65
+ exports.CARAC_MIN = CARAC_MIN;
46
66
  function hasMove(player, game) {
47
67
  if (player.current_MA >= getMaxCarac(player, PLAYER_CARAC.MA, game) &&
48
68
  player.current_gfi >= getMaxGfi(player) &&
@@ -103,21 +123,27 @@ function getMaxCarac(player, carac, game) {
103
123
  return -1;
104
124
  }
105
125
  if (carac === PLAYER_CARAC.AG) {
106
- return getMaxAG(player, game);
126
+ return getMaxAG(player, game || {});
107
127
  }
108
128
  else if (carac === PLAYER_CARAC.MA) {
109
- return getMaxMA(player, game);
129
+ return getMaxMA(player, game || {});
110
130
  }
111
131
  else if (carac === PLAYER_CARAC.AV) {
112
- return getMaxAV(player, game);
132
+ return getMaxAV(player, game || {});
113
133
  }
114
134
  else if (carac === PLAYER_CARAC.ST) {
115
- return getMaxST(player, game);
135
+ return getMaxST(player, game || {});
136
+ }
137
+ else if (carac === PLAYER_CARAC.PA) {
138
+ return getMaxPA(player, game);
116
139
  }
117
140
  return -1;
118
141
  }
119
142
  function getMaxCommun(player, carac, _game) {
120
143
  let c = player[carac];
144
+ if (c == null) {
145
+ return 0;
146
+ }
121
147
  if (!player.tempCarac) {
122
148
  return c;
123
149
  }
@@ -140,26 +166,29 @@ function getMaxCommun(player, carac, _game) {
140
166
  c = getCareerBaseCaracLimit(player, c, PLAYER_CARAC[carac]);
141
167
  return c;
142
168
  }
143
- function getLimitedValue(c) {
144
- if (c > 10) {
145
- c = 10;
146
- }
147
- if (c < 0) {
148
- c = 0;
149
- }
150
- return c;
151
- }
152
169
  function getMaxAV(player, game) {
153
170
  let c = getMaxCommun(player, PLAYER_CARAC.AV, game);
154
- return getLimitedValue(c);
171
+ if (c > CARAC_MAX[PLAYER_CARAC.AV])
172
+ c = CARAC_MAX[PLAYER_CARAC.AV];
173
+ if (c < CARAC_MIN[PLAYER_CARAC.AV])
174
+ c = CARAC_MIN[PLAYER_CARAC.AV];
175
+ return c;
155
176
  }
156
177
  function getMaxST(player, game) {
157
178
  let c = getMaxCommun(player, PLAYER_CARAC.ST, game);
158
- return getLimitedValue(c);
179
+ if (c > CARAC_MAX[PLAYER_CARAC.ST])
180
+ c = CARAC_MAX[PLAYER_CARAC.ST];
181
+ if (c < CARAC_MIN[PLAYER_CARAC.ST])
182
+ c = CARAC_MIN[PLAYER_CARAC.ST];
183
+ return c;
159
184
  }
160
185
  function getMaxAG(player, game) {
161
186
  let c = getMaxCommun(player, PLAYER_CARAC.AG, game);
162
- return getLimitedValue(c);
187
+ if (c > CARAC_MAX[PLAYER_CARAC.AG])
188
+ c = CARAC_MAX[PLAYER_CARAC.AG];
189
+ if (c < CARAC_MIN[PLAYER_CARAC.AG])
190
+ c = CARAC_MIN[PLAYER_CARAC.AG];
191
+ return c;
163
192
  }
164
193
  function getMaxMA(player, game) {
165
194
  let c = getMaxCommun(player, PLAYER_CARAC.MA, game);
@@ -169,7 +198,57 @@ function getMaxMA(player, game) {
169
198
  c = maxMA;
170
199
  }
171
200
  }
172
- return getLimitedValue(c);
201
+ if (c > CARAC_MAX[PLAYER_CARAC.MA])
202
+ c = CARAC_MAX[PLAYER_CARAC.MA];
203
+ if (c < CARAC_MIN[PLAYER_CARAC.MA])
204
+ c = CARAC_MIN[PLAYER_CARAC.MA];
205
+ return c;
206
+ }
207
+ function clampPA(c) {
208
+ if (c <= 0)
209
+ return CARAC_MIN[PLAYER_CARAC.PA]; // 0 = pas de PA
210
+ if (c > CARAC_MAX[PLAYER_CARAC.PA])
211
+ return CARAC_MAX[PLAYER_CARAC.PA];
212
+ return c;
213
+ }
214
+ function getMaxPA(player, game) {
215
+ // Si le joueur a déjà une valeur PA en base, l'utiliser
216
+ if (player.PA != null) {
217
+ let c = getMaxCommun(player, PLAYER_CARAC.PA, game || {});
218
+ return clampPA(c);
219
+ }
220
+ // Sinon, déterminer la valeur selon la version de la career
221
+ const career = (0, race_1.getCareerFromPlayer)(player);
222
+ if (!career) {
223
+ // Fallback: utiliser AG si pas de career
224
+ return getMaxAG(player, game || {});
225
+ }
226
+ // Si c'est une career 2025, utiliser career.PA
227
+ if (career.version === career_1.CAREER_VERSION.V2025 && career.PA != null) {
228
+ let c = career.PA;
229
+ // Appliquer les modificateurs tempCarac si présents
230
+ if (player.tempCarac) {
231
+ let obj;
232
+ try {
233
+ obj = JSON.parse(player.tempCarac);
234
+ }
235
+ catch (e) {
236
+ return clampPA(c);
237
+ }
238
+ for (const value of Object.values(obj)) {
239
+ if (value.gainCarac === PLAYER_CARAC.PA) {
240
+ c += 1;
241
+ }
242
+ if (value.loseCarac === PLAYER_CARAC.PA) {
243
+ c -= 1;
244
+ }
245
+ }
246
+ c = getCareerBaseCaracLimit(player, c, PLAYER_CARAC.PA);
247
+ }
248
+ return clampPA(c);
249
+ }
250
+ // Sinon (career 2020 ou V6), utiliser AG
251
+ return getMaxAG(player, game || {});
173
252
  }
174
253
  function getMaxGfi(player) {
175
254
  return (0, skill_1.hasSkill)(player, skill_1.SKILL_NAMES.SPRINT) ? 3 : 2;
@@ -211,16 +290,21 @@ function getAgingBonus(player, totalGames) {
211
290
  }
212
291
  return bonus;
213
292
  }
214
- function BB2020Carac(value, carac) {
293
+ function BB2020Carac(value, carac, careerVersion) {
215
294
  // CHARACTERISTIC TABLE
216
295
  // Characteristic MA ST AG PA AV
217
296
  // Maximum 9 8 1+ 1+ 11+
218
297
  //Minimum 1 1 6+ 6+ 3+
298
+ // Les valeurs sont maintenant normalisées au format 2020 pour toutes les versions
299
+ // (les valeurs 2025 sont converties lors de la génération du fichier career2025.ts)
219
300
  if (carac === PLAYER_CARAC.AV && value) {
220
301
  // TODO: min3+, max11+
221
302
  return `${+value + 1}+`;
222
303
  }
223
- else if (carac === PLAYER_CARAC.AG && value) {
304
+ else if ((carac === PLAYER_CARAC.AG || carac === PLAYER_CARAC.PA) &&
305
+ value) {
306
+ // Conversion pour afficher la notation "+"
307
+ // PA se comporte exactement comme AG (PA n'existait pas en 2020)
224
308
  let newValue = 6;
225
309
  if (value <= 1)
226
310
  newValue = 6;
@@ -1,3 +1,7 @@
1
1
  import { PlayerWithSkill, Point } from "./types/models";
2
2
  export declare const isAdjacent: (p1: Point, p2: Point) => boolean;
3
+ /**
4
+ * Returns all 8 adjacent squares around a given position
5
+ */
6
+ export declare const getAllAdjacentSquares: (x: number, y: number) => Point[];
3
7
  export declare const getEnemyTackleZones: (location: Point, teamId: string, players: Record<string, PlayerWithSkill>) => PlayerWithSkill[];
package/dist/position.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getEnemyTackleZones = exports.isAdjacent = void 0;
3
+ exports.getEnemyTackleZones = exports.getAllAdjacentSquares = exports.isAdjacent = void 0;
4
4
  const status_1 = require("./status");
5
5
  const isAdjacent = (p1, p2) => {
6
6
  if (p1 === null ||
@@ -16,6 +16,22 @@ const isAdjacent = (p1, p2) => {
16
16
  Math.abs(p1.y - p2.y) <= 1);
17
17
  };
18
18
  exports.isAdjacent = isAdjacent;
19
+ /**
20
+ * Returns all 8 adjacent squares around a given position
21
+ */
22
+ const getAllAdjacentSquares = (x, y) => {
23
+ return [
24
+ { x: x - 1, y: y - 1 },
25
+ { x: x, y: y - 1 },
26
+ { x: x + 1, y: y - 1 },
27
+ { x: x - 1, y: y },
28
+ { x: x + 1, y: y },
29
+ { x: x - 1, y: y + 1 },
30
+ { x: x, y: y + 1 },
31
+ { x: x + 1, y: y + 1 },
32
+ ];
33
+ };
34
+ exports.getAllAdjacentSquares = getAllAdjacentSquares;
19
35
  const getEnemyTackleZones = (location, teamId, players) => {
20
36
  // player a un format : { id1: {player1}, id2:{player2} etc...}
21
37
  return Object.values(players).filter((player) => {
package/dist/race.d.ts CHANGED
@@ -1,20 +1,31 @@
1
- import { AVATAR, CAREER_ID, RACE } from "./career";
1
+ import { AVATAR, CAREER_ID_ALL, RACE } from "./career";
2
2
  import { Player, Team, User } from "./types/models";
3
3
  declare const ANIMOSITY_NUMBER = 2;
4
4
  declare const isPrivateRace: (race: RACE) => boolean;
5
5
  declare const hasUnlockRace: (user: User, race: RACE) => boolean;
6
6
  declare const hasUnlockCareer: (user: User, careerId: string) => boolean;
7
- declare const getCareerFromKey: (key: CAREER_ID) => import("./career").Career;
8
- declare const getCareerKeyFromPlayer: (player: Player) => CAREER_ID;
9
- declare const getCareerFromPlayer: (player: Player) => import("./career").Career;
10
- declare const getCareerFromIcon: (nameIcon: string) => import("./career").Career | null;
7
+ declare const getCareerFromKey: (key: CAREER_ID_ALL) => import("./career2025").Career | import("./career").Career;
8
+ declare const getCareerKeyFromPlayer: (player: Player) => CAREER_ID_ALL;
9
+ /**
10
+ * Returns the 2025 career ID for a given career ID (legacy or already 2025).
11
+ * Returns undefined for careers without a 2025 equivalent (e.g. Slann).
12
+ */
13
+ declare const getCareerId2025: (careerId: string) => string | undefined;
14
+ declare const getCareerFromPlayer: (player: Player) => import("./career2025").Career | import("./career").Career;
15
+ declare const getCareerFromIcon: (nameIcon: string) => import("./career2025").Career | import("./career").Career | null;
11
16
  declare const getPlayerAvatarDefault: (player: Player) => string | null;
12
17
  declare const getPlayerAvatar: (player: Player) => string | null;
13
- declare const getPlayerAvatarPath: (player: Player) => "tile/shop/avatar" | "tile/shop/avatar-default" | null;
14
- declare const getRaceFromCareer: (careerId: CAREER_ID) => RACE;
15
- declare const getAvatarTypeFromPlayer: (player: Player, avatarFile: string) => AVATAR | null;
16
- declare const getRaceFromPlayer: (player: Player) => RACE;
18
+ declare const getPlayerAvatarPath: (player: Player) => string | null;
19
+ declare const getRaceFromCareer: (careerId: CAREER_ID_ALL) => RACE | undefined;
20
+ declare const getAvatarTypeFromPlayer: (player: Player, avatarFile: string) => import("./career2025").AVATAR | AVATAR | null;
21
+ /** Returns the correct base path for an avatar file based on which list it belongs to,
22
+ * independent of the player's currently active avatar. */
23
+ declare const getAvatarBasePathFromFile: (player: Player, avatarFile: string) => string | null;
24
+ /** Returns the rarity string of a standard avatar file for the given player's career. */
25
+ declare const getAvatarRarityFromFile: (player: Player, avatarFile: string) => string | undefined;
26
+ declare const getRaceFromPlayer: (player: Player) => RACE | undefined;
17
27
  declare const getCareersByRace: () => any;
28
+ declare const getAvailableCareersByRace: () => any;
18
29
  declare const GAIN_CAREER_POINT = 2;
19
30
  declare const GAIN_CAREER_POINT_FRIENDLY = 2;
20
31
  declare enum GROUP_NAME {
@@ -34,8 +45,8 @@ declare const getRaceCompatibility: (race1: RACE, race2: RACE) => boolean;
34
45
  declare const getPlayerCompatibility: (player1: Player, player2: Player) => void;
35
46
  declare function getCareerRanges(): number[];
36
47
  declare function getPlayersAvailableForPromo(players?: never[]): Player[];
37
- declare function getPromoCareer(careerId: CAREER_ID, userPlayers: Player[]): number;
38
- declare function getPriceCareer(careerId: CAREER_ID): number;
48
+ declare function getPromoCareer(careerId: CAREER_ID_ALL, userPlayers: Player[]): number;
49
+ declare function getPriceCareer(careerId: CAREER_ID_ALL): number;
39
50
  declare function getTeamGroups(team: Team): any;
40
51
  declare function isPlayerNeutralGroup(player: Player): boolean;
41
52
  declare function isNeutralGroup(group: string): boolean;
@@ -46,4 +57,4 @@ declare const getPlayersByState: (players: Player[]) => {
46
57
  lastRetired: Player[];
47
58
  };
48
59
  declare const getRaceSpecialSkills: (race: RACE) => string[];
49
- export { ANIMOSITY_NUMBER, COMPATIBILITY, GAIN_CAREER_POINT, GAIN_CAREER_POINT_FRIENDLY, getAvatarTypeFromPlayer, getCareerFromIcon, getCareerFromKey, getCareerFromPlayer, getCareerKeyFromPlayer, getCareerRanges, getCareersByRace, getPlayerAvatar, getPlayerAvatarDefault, getPlayerAvatarPath, getPlayerCompatibility, getPlayerGroup, getPlayersAvailableForPromo, getPlayersByState, getPriceCareer, getPromoCareer, getRaceCompatibility, getRaceFromCareer, getRaceFromPlayer, getRaceGroup, getRaceSpecialSkills, getTeamGroups, getTeamIncompatibleGroups, GROUP_NAME, hasUnlockCareer, hasUnlockRace, isNeutralGroup, isPlayerNeutralGroup, isPrivateRace, };
60
+ export { ANIMOSITY_NUMBER, COMPATIBILITY, GAIN_CAREER_POINT, GAIN_CAREER_POINT_FRIENDLY, getAvailableCareersByRace, getAvatarBasePathFromFile, getAvatarRarityFromFile, getAvatarTypeFromPlayer, getCareerId2025, getCareerFromIcon, getCareerFromKey, getCareerFromPlayer, getCareerKeyFromPlayer, getCareerRanges, getCareersByRace, getPlayerAvatar, getPlayerAvatarDefault, getPlayerAvatarPath, getPlayerCompatibility, getPlayerGroup, getPlayersAvailableForPromo, getPlayersByState, getPriceCareer, getPromoCareer, getRaceCompatibility, getRaceFromCareer, getRaceFromPlayer, getRaceGroup, getRaceSpecialSkills, getTeamGroups, getTeamIncompatibleGroups, GROUP_NAME, hasUnlockCareer, hasUnlockRace, isNeutralGroup, isPlayerNeutralGroup, isPrivateRace, };