enefel 2.15.4 → 2.16.1

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.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.15.4",
3
+ "version": "2.16.1",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "enefel",
9
- "version": "2.15.4",
9
+ "version": "2.16.1",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "csv-parse": "^6.1.0",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.15.4",
3
+ "version": "2.16.1",
4
4
  "description": "Fantasy Football game engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/dist/skill.d.ts CHANGED
@@ -130,6 +130,17 @@ declare const getPlayersWithSkill: (players: PlayerWithSkill[], skillId: SKILL_N
130
130
  declare const hasSkillDisplayableInfo: (skillId: SKILL_NAMES) => boolean;
131
131
  declare const isActivableSkills: (skill: SKILL_NAMES) => boolean;
132
132
  declare const isSelectPlayersSkills: (skill: SKILL_NAMES) => boolean;
133
+ /**
134
+ * Parmi les compétences à sélection de joueurs, celles dont les cibles sont ses
135
+ * propres coéquipiers et non l'équipe adverse.
136
+ *
137
+ * Sauvagerie Animale frappe un coéquipier adjacent : le rulebook laisse le
138
+ * choix au coach (« one Standing team-mate of your choice »), alors que le jet
139
+ * est résolu côté serveur en une seule requête. On ne peut donc pas demander la
140
+ * victime au moment du jet — le coach la désigne à l'avance, comme pour les
141
+ * autres préférences de compétence.
142
+ */
143
+ declare const isSelectTeamMatesSkills: (skill: SKILL_NAMES) => boolean;
133
144
  declare const hasSkillForPlayer: (playerWithSkill: PlayerWithSkill, playerTarget: Player, skillId: SKILL_NAMES) => boolean;
134
145
  declare function getStarLimit(teamPlayers: PlayerWithSkill[]): number;
135
146
  declare function getSpecialistLimit(teamPlayers: PlayerWithSkill[]): number;
@@ -175,4 +186,4 @@ declare const helpSkillsToDisplay: {
175
186
  };
176
187
  };
177
188
  declare const hasToAgilityJumpUp: (player: PlayerWithSkill) => boolean;
178
- export { BIG_GUY_LIMIT, getDisturbingPresenceMalus, getNoTurnoverSkill, getPlayersWithSkill, getSkill, getSkillDisplayedWithCarrer, getSkillLimitSizeTeam, getSpecialistLimit, getStarLimit, hasSkill, hasSkillDisplayableInfo, hasSkillForPlayer, hasToAgilityJumpUp, hasUsedSkill, helpSkillsToDisplay, isActivableSkills, isNoTurnoverSkill, isSelectPlayersSkills, isSpecialSkill, SKILL_DURATION, SKILL_INFO_ACTIVE, SKILL_INFO_INACTIVE, SKILL_IS_2025, SKILL_MIGRATION_2025, SKILL_NAMES, SKILL_TYPE, SKILLS, useSkill, };
189
+ export { BIG_GUY_LIMIT, getDisturbingPresenceMalus, getNoTurnoverSkill, getPlayersWithSkill, getSkill, getSkillDisplayedWithCarrer, getSkillLimitSizeTeam, getSpecialistLimit, getStarLimit, hasSkill, hasSkillDisplayableInfo, hasSkillForPlayer, hasToAgilityJumpUp, hasUsedSkill, helpSkillsToDisplay, isActivableSkills, isNoTurnoverSkill, isSelectPlayersSkills, isSelectTeamMatesSkills, isSpecialSkill, SKILL_DURATION, SKILL_INFO_ACTIVE, SKILL_INFO_INACTIVE, SKILL_IS_2025, SKILL_MIGRATION_2025, SKILL_NAMES, SKILL_TYPE, SKILLS, useSkill, };
package/dist/skill.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SKILLS = exports.SKILL_TYPE = exports.SKILL_NAMES = exports.SKILL_MIGRATION_2025 = exports.SKILL_IS_2025 = exports.SKILL_INFO_INACTIVE = exports.SKILL_INFO_ACTIVE = exports.SKILL_DURATION = exports.isSpecialSkill = exports.isSelectPlayersSkills = exports.isActivableSkills = exports.helpSkillsToDisplay = exports.hasToAgilityJumpUp = exports.hasSkillForPlayer = exports.hasSkillDisplayableInfo = exports.getPlayersWithSkill = exports.BIG_GUY_LIMIT = void 0;
3
+ exports.SKILLS = exports.SKILL_TYPE = exports.SKILL_NAMES = exports.SKILL_MIGRATION_2025 = exports.SKILL_IS_2025 = exports.SKILL_INFO_INACTIVE = exports.SKILL_INFO_ACTIVE = exports.SKILL_DURATION = exports.isSpecialSkill = exports.isSelectTeamMatesSkills = exports.isSelectPlayersSkills = exports.isActivableSkills = exports.helpSkillsToDisplay = exports.hasToAgilityJumpUp = exports.hasSkillForPlayer = exports.hasSkillDisplayableInfo = exports.getPlayersWithSkill = exports.BIG_GUY_LIMIT = void 0;
4
4
  exports.getDisturbingPresenceMalus = getDisturbingPresenceMalus;
5
5
  exports.getNoTurnoverSkill = getNoTurnoverSkill;
6
6
  exports.getSkill = getSkill;
@@ -405,10 +405,25 @@ const isActivableSkills = (skill) => {
405
405
  };
406
406
  exports.isActivableSkills = isActivableSkills;
407
407
  const isSelectPlayersSkills = (skill) => {
408
- const activables = [SKILL_NAMES.DIVING_TACKLE];
408
+ const activables = [SKILL_NAMES.DIVING_TACKLE, SKILL_NAMES.ANIMAL_SAVAGERY];
409
409
  return activables.includes(skill);
410
410
  };
411
411
  exports.isSelectPlayersSkills = isSelectPlayersSkills;
412
+ /**
413
+ * Parmi les compétences à sélection de joueurs, celles dont les cibles sont ses
414
+ * propres coéquipiers et non l'équipe adverse.
415
+ *
416
+ * Sauvagerie Animale frappe un coéquipier adjacent : le rulebook laisse le
417
+ * choix au coach (« one Standing team-mate of your choice »), alors que le jet
418
+ * est résolu côté serveur en une seule requête. On ne peut donc pas demander la
419
+ * victime au moment du jet — le coach la désigne à l'avance, comme pour les
420
+ * autres préférences de compétence.
421
+ */
422
+ const isSelectTeamMatesSkills = (skill) => {
423
+ const teamMates = [SKILL_NAMES.ANIMAL_SAVAGERY];
424
+ return teamMates.includes(skill);
425
+ };
426
+ exports.isSelectTeamMatesSkills = isSelectTeamMatesSkills;
412
427
  const hasSkillForPlayer = (playerWithSkill, playerTarget, skillId) => {
413
428
  if (hasSkill(playerWithSkill, skillId)) {
414
429
  const skill = getSkill(playerWithSkill, skillId);
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Sauvagerie Animale — choix de la victime.
3
+ *
4
+ * Le rulebook laisse la victime au choix du coach (« one Standing team-mate of
5
+ * your choice »). Le jet étant résolu côté serveur au milieu d'une action déjà
6
+ * déclarée, on ne peut pas la demander sur le moment : le coach exprime une
7
+ * intention à l'avance, comme pour Glissade Contrôlée.
8
+ */
9
+ export declare enum AnimalSavageryStrategy {
10
+ /** Le porteur du ballon est épargné tant qu'un autre coéquipier est adjacent. */
11
+ AVOID_BALL_CARRIER = "AVOID_BALL_CARRIER",
12
+ /** Les coéquipiers cochés, dans l'ordre de la liste. */
13
+ DESIGNATED = "DESIGNATED",
14
+ /** La meilleure armure : celui qui encaissera le mieux. */
15
+ TOUGHEST = "TOUGHEST",
16
+ /** Le moins d'expérience : on protège ses joueurs les plus avancés. */
17
+ LEAST_VALUABLE = "LEAST_VALUABLE",
18
+ /** Tirage au sort parmi les coéquipiers adjacents. */
19
+ RANDOM = "RANDOM"
20
+ }
21
+ export interface AnimalSavageryPreference {
22
+ strategy: AnimalSavageryStrategy;
23
+ /** Ids des coéquipiers désignés, dans l'ordre, pour DESIGNATED. */
24
+ designated?: string[];
25
+ }
26
+ /**
27
+ * Épargner le porteur du ballon est le comportement par défaut : un coach à qui
28
+ * on laisse le choix n'assommerait jamais son propre porteur, et la morsure du
29
+ * vampire l'évite déjà de la même manière.
30
+ */
31
+ export declare const DEFAULT_ANIMAL_SAVAGERY_STRATEGY = AnimalSavageryStrategy.AVOID_BALL_CARRIER;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_ANIMAL_SAVAGERY_STRATEGY = exports.AnimalSavageryStrategy = void 0;
4
+ /**
5
+ * Sauvagerie Animale — choix de la victime.
6
+ *
7
+ * Le rulebook laisse la victime au choix du coach (« one Standing team-mate of
8
+ * your choice »). Le jet étant résolu côté serveur au milieu d'une action déjà
9
+ * déclarée, on ne peut pas la demander sur le moment : le coach exprime une
10
+ * intention à l'avance, comme pour Glissade Contrôlée.
11
+ */
12
+ var AnimalSavageryStrategy;
13
+ (function (AnimalSavageryStrategy) {
14
+ /** Le porteur du ballon est épargné tant qu'un autre coéquipier est adjacent. */
15
+ AnimalSavageryStrategy["AVOID_BALL_CARRIER"] = "AVOID_BALL_CARRIER";
16
+ /** Les coéquipiers cochés, dans l'ordre de la liste. */
17
+ AnimalSavageryStrategy["DESIGNATED"] = "DESIGNATED";
18
+ /** La meilleure armure : celui qui encaissera le mieux. */
19
+ AnimalSavageryStrategy["TOUGHEST"] = "TOUGHEST";
20
+ /** Le moins d'expérience : on protège ses joueurs les plus avancés. */
21
+ AnimalSavageryStrategy["LEAST_VALUABLE"] = "LEAST_VALUABLE";
22
+ /** Tirage au sort parmi les coéquipiers adjacents. */
23
+ AnimalSavageryStrategy["RANDOM"] = "RANDOM";
24
+ })(AnimalSavageryStrategy || (exports.AnimalSavageryStrategy = AnimalSavageryStrategy = {}));
25
+ /**
26
+ * Épargner le porteur du ballon est le comportement par défaut : un coach à qui
27
+ * on laisse le choix n'assommerait jamais son propre porteur, et la morsure du
28
+ * vampire l'évite déjà de la même manière.
29
+ */
30
+ exports.DEFAULT_ANIMAL_SAVAGERY_STRATEGY = AnimalSavageryStrategy.AVOID_BALL_CARRIER;
package/dist/time.js CHANGED
@@ -35,7 +35,10 @@ const getTime = (type) => {
35
35
  // after turnover malus time for player actions
36
36
  const TIME_TURNOVER = 4 * 60 * 60;
37
37
  // how many hours a game stay pending
38
- const TIME_WAITING_GAME = 24;
38
+ // 24h était trop court pour la population actuelle : un défi lancé le soir
39
+ // n'était vu que par les gens connectés le lendemain soir, et disparaissait.
40
+ // Le coach peut de toute façon annuler son défi à tout moment.
41
+ const TIME_WAITING_GAME = 72;
39
42
  // before league games (last game end + 1 day)
40
43
  const TIME_INIT_LEAGUE = 1 * 24 * 60 * 60;
41
44
  // between each league games
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.15.4",
3
+ "version": "2.16.1",
4
4
  "description": "Fantasy Football game engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/skill.ts CHANGED
@@ -433,10 +433,25 @@ const isActivableSkills = (skill: SKILL_NAMES) => {
433
433
  };
434
434
 
435
435
  const isSelectPlayersSkills = (skill: SKILL_NAMES) => {
436
- const activables = [SKILL_NAMES.DIVING_TACKLE];
436
+ const activables = [SKILL_NAMES.DIVING_TACKLE, SKILL_NAMES.ANIMAL_SAVAGERY];
437
437
  return activables.includes(skill);
438
438
  };
439
439
 
440
+ /**
441
+ * Parmi les compétences à sélection de joueurs, celles dont les cibles sont ses
442
+ * propres coéquipiers et non l'équipe adverse.
443
+ *
444
+ * Sauvagerie Animale frappe un coéquipier adjacent : le rulebook laisse le
445
+ * choix au coach (« one Standing team-mate of your choice »), alors que le jet
446
+ * est résolu côté serveur en une seule requête. On ne peut donc pas demander la
447
+ * victime au moment du jet — le coach la désigne à l'avance, comme pour les
448
+ * autres préférences de compétence.
449
+ */
450
+ const isSelectTeamMatesSkills = (skill: SKILL_NAMES) => {
451
+ const teamMates = [SKILL_NAMES.ANIMAL_SAVAGERY];
452
+ return teamMates.includes(skill);
453
+ };
454
+
440
455
  const hasSkillForPlayer = (
441
456
  playerWithSkill: PlayerWithSkill,
442
457
  playerTarget: Player,
@@ -608,6 +623,7 @@ export {
608
623
  isActivableSkills,
609
624
  isNoTurnoverSkill,
610
625
  isSelectPlayersSkills,
626
+ isSelectTeamMatesSkills,
611
627
  isSpecialSkill,
612
628
  SKILL_DURATION,
613
629
  SKILL_INFO_ACTIVE,
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Sauvagerie Animale — choix de la victime.
3
+ *
4
+ * Le rulebook laisse la victime au choix du coach (« one Standing team-mate of
5
+ * your choice »). Le jet étant résolu côté serveur au milieu d'une action déjà
6
+ * déclarée, on ne peut pas la demander sur le moment : le coach exprime une
7
+ * intention à l'avance, comme pour Glissade Contrôlée.
8
+ */
9
+ export enum AnimalSavageryStrategy {
10
+ /** Le porteur du ballon est épargné tant qu'un autre coéquipier est adjacent. */
11
+ AVOID_BALL_CARRIER = "AVOID_BALL_CARRIER",
12
+ /** Les coéquipiers cochés, dans l'ordre de la liste. */
13
+ DESIGNATED = "DESIGNATED",
14
+ /** La meilleure armure : celui qui encaissera le mieux. */
15
+ TOUGHEST = "TOUGHEST",
16
+ /** Le moins d'expérience : on protège ses joueurs les plus avancés. */
17
+ LEAST_VALUABLE = "LEAST_VALUABLE",
18
+ /** Tirage au sort parmi les coéquipiers adjacents. */
19
+ RANDOM = "RANDOM",
20
+ }
21
+
22
+ export interface AnimalSavageryPreference {
23
+ strategy: AnimalSavageryStrategy;
24
+ /** Ids des coéquipiers désignés, dans l'ordre, pour DESIGNATED. */
25
+ designated?: string[];
26
+ }
27
+
28
+ /**
29
+ * Épargner le porteur du ballon est le comportement par défaut : un coach à qui
30
+ * on laisse le choix n'assommerait jamais son propre porteur, et la morsure du
31
+ * vampire l'évite déjà de la même manière.
32
+ */
33
+ export const DEFAULT_ANIMAL_SAVAGERY_STRATEGY =
34
+ AnimalSavageryStrategy.AVOID_BALL_CARRIER;
package/time.ts CHANGED
@@ -38,7 +38,10 @@ const getTime = (type: TYPE_TIMER) => {
38
38
  const TIME_TURNOVER = 4 * 60 * 60;
39
39
 
40
40
  // how many hours a game stay pending
41
- const TIME_WAITING_GAME = 24;
41
+ // 24h était trop court pour la population actuelle : un défi lancé le soir
42
+ // n'était vu que par les gens connectés le lendemain soir, et disparaissait.
43
+ // Le coach peut de toute façon annuler son défi à tout moment.
44
+ const TIME_WAITING_GAME = 72;
42
45
 
43
46
  // before league games (last game end + 1 day)
44
47
  const TIME_INIT_LEAGUE = 1 * 24 * 60 * 60;