enefel 2.2.4 → 2.4.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/dist/index.js CHANGED
@@ -721,7 +721,8 @@ function canPass(player, playerTeam, playerIdWithBall) {
721
721
  player.id === playerIdWithBall);
722
722
  }
723
723
  function canEndTurn(player, game) {
724
- return (player.date_next_action === null &&
724
+ return ((0, status_1.hasStatusOnField)(player) &&
725
+ player.date_next_action === null &&
725
726
  (player.has_action === false || (0, player_1.hasMove)(player, game)));
726
727
  }
727
728
  function canThrowTeamMate(player, target, playerTeam) {
package/dist/item.d.ts CHANGED
@@ -12,7 +12,9 @@ declare enum ITEM_ID {
12
12
  DRUG = "drug",
13
13
  GREEN_PILL = "green-pill",
14
14
  NEWSPAPER = "newspaper",
15
- BOOSTER = "booster"
15
+ BOOSTER = "booster",
16
+ ENERGY_GEL = "energy-gel",
17
+ SMELLING_SALTS = "smelling-salts"
16
18
  }
17
19
  declare enum ITEM_TYPE {
18
20
  CONSUMABLE = "consumable",
@@ -20,4 +22,4 @@ declare enum ITEM_TYPE {
20
22
  FILE = "file"
21
23
  }
22
24
  declare const getQteFromRarity: (rarity: RARITY) => 1 | 10 | 100 | 1000 | 10000 | undefined;
23
- export { getQteFromRarity, ITEM_ID, ITEM_TYPE, RARITY };
25
+ export { ITEM_ID, ITEM_TYPE, RARITY, getQteFromRarity };
package/dist/item.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RARITY = exports.ITEM_TYPE = exports.ITEM_ID = exports.getQteFromRarity = void 0;
3
+ exports.getQteFromRarity = exports.RARITY = exports.ITEM_TYPE = exports.ITEM_ID = void 0;
4
4
  var RARITY;
5
5
  (function (RARITY) {
6
6
  RARITY["COMMUN"] = "c";
@@ -18,6 +18,8 @@ var ITEM_ID;
18
18
  ITEM_ID["GREEN_PILL"] = "green-pill";
19
19
  ITEM_ID["NEWSPAPER"] = "newspaper";
20
20
  ITEM_ID["BOOSTER"] = "booster";
21
+ ITEM_ID["ENERGY_GEL"] = "energy-gel";
22
+ ITEM_ID["SMELLING_SALTS"] = "smelling-salts";
21
23
  })(ITEM_ID || (exports.ITEM_ID = ITEM_ID = {}));
22
24
  var ITEM_TYPE;
23
25
  (function (ITEM_TYPE) {
@@ -0,0 +1,11 @@
1
+ import { Player } from "./types/models";
2
+ export interface TempCaracEffect {
3
+ t: number;
4
+ gainCarac?: string;
5
+ loseCarac?: string;
6
+ moralePenalty?: number;
7
+ itemId?: string;
8
+ }
9
+ export declare const countItemUsagesInKickoff: (player: Player, itemId: string) => number;
10
+ export declare const canUseItem: (player: Player, itemId: string, maxUsesPerKickoff?: number) => boolean;
11
+ export declare const getRemainingUsages: (player: Player, itemId: string, maxUsesPerKickoff?: number) => number;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getRemainingUsages = exports.canUseItem = exports.countItemUsagesInKickoff = void 0;
4
+ const item_1 = require("item");
5
+ const status_1 = require("status");
6
+ const countItemUsagesInKickoff = (player, itemId) => {
7
+ if (!player.tempCarac) {
8
+ return 0;
9
+ }
10
+ let tempCarac;
11
+ try {
12
+ tempCarac = JSON.parse(player.tempCarac);
13
+ }
14
+ catch (e) {
15
+ return 0;
16
+ }
17
+ let count = 0;
18
+ for (const effect of Object.values(tempCarac)) {
19
+ // Compter tous les effets liés à cet item
20
+ if (effect.itemId === itemId) {
21
+ count++;
22
+ }
23
+ }
24
+ return count;
25
+ };
26
+ exports.countItemUsagesInKickoff = countItemUsagesInKickoff;
27
+ const canUseItem = (player, itemId, maxUsesPerKickoff) => {
28
+ if (maxUsesPerKickoff && maxUsesPerKickoff > 0) {
29
+ const currentUsages = (0, exports.countItemUsagesInKickoff)(player, itemId);
30
+ if (currentUsages >= maxUsesPerKickoff) {
31
+ return false;
32
+ }
33
+ }
34
+ if (itemId === item_1.ITEM_ID.SMELLING_SALTS) {
35
+ return player.status === status_1.PLAYER_STATUS.KO;
36
+ }
37
+ return true;
38
+ };
39
+ exports.canUseItem = canUseItem;
40
+ const getRemainingUsages = (player, itemId, maxUsesPerKickoff) => {
41
+ if (!maxUsesPerKickoff || maxUsesPerKickoff <= 0) {
42
+ return -1; // Pas de limite
43
+ }
44
+ const currentUsages = (0, exports.countItemUsagesInKickoff)(player, itemId);
45
+ return Math.max(0, maxUsesPerKickoff - currentUsages);
46
+ };
47
+ exports.getRemainingUsages = getRemainingUsages;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.2.4",
3
+ "version": "2.4.0",
4
4
  "lockfileVersion": 2,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "enefel",
9
- "version": "2.2.4",
9
+ "version": "2.4.0",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "seedrandom": "3.0.5",
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.2.4",
3
+ "version": "2.4.0",
4
4
  "description": "Blood Bowl 3 game engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/dist/race.js CHANGED
@@ -174,7 +174,7 @@ const getPlayerAvatarPath = (player) => {
174
174
  exports.getPlayerAvatarPath = getPlayerAvatarPath;
175
175
  const getRaceFromCareer = (careerId) => {
176
176
  const career = getCareerFromKey(careerId);
177
- return career.badge;
177
+ return career?.badge;
178
178
  };
179
179
  exports.getRaceFromCareer = getRaceFromCareer;
180
180
  const getAvatarTypeFromPlayer = (player, avatarFile) => {
@@ -120,6 +120,8 @@ export interface Player extends Point {
120
120
  prevY: number | null;
121
121
  hasEndTurn: boolean;
122
122
  canUseSkills?: boolean;
123
+ stats?: Stat[];
124
+ team?: Team;
123
125
  }
124
126
  export interface PlayerWithSkill extends Player {
125
127
  skills: PlayerSkill[];
@@ -198,6 +200,7 @@ export interface Item {
198
200
  y: number;
199
201
  type: string;
200
202
  forUser?: boolean;
203
+ maxUsesPerKickoff?: number;
201
204
  }
202
205
  export interface UserItem {
203
206
  id: string;
package/index.ts CHANGED
@@ -820,6 +820,7 @@ function canPass(
820
820
 
821
821
  function canEndTurn(player: PlayerWithSkill, game: Game) {
822
822
  return (
823
+ hasStatusOnField(player) &&
823
824
  player.date_next_action === null &&
824
825
  (player.has_action === false || hasMove(player, game))
825
826
  );
package/item.ts CHANGED
@@ -14,6 +14,8 @@ enum ITEM_ID {
14
14
  GREEN_PILL = "green-pill",
15
15
  NEWSPAPER = "newspaper",
16
16
  BOOSTER = "booster",
17
+ ENERGY_GEL = "energy-gel",
18
+ SMELLING_SALTS = "smelling-salts",
17
19
  }
18
20
 
19
21
  enum ITEM_TYPE {
@@ -40,4 +42,4 @@ const getQteFromRarity = (rarity: RARITY) => {
40
42
  }
41
43
  };
42
44
 
43
- export { getQteFromRarity, ITEM_ID, ITEM_TYPE, RARITY };
45
+ export { ITEM_ID, ITEM_TYPE, RARITY, getQteFromRarity };
package/itemUsage.ts ADDED
@@ -0,0 +1,69 @@
1
+ import { ITEM_ID } from "item";
2
+ import { PLAYER_STATUS } from "status";
3
+ import { Player } from "./types/models";
4
+
5
+ export interface TempCaracEffect {
6
+ t: number;
7
+ gainCarac?: string;
8
+ loseCarac?: string;
9
+ moralePenalty?: number;
10
+ itemId?: string;
11
+ }
12
+
13
+ export const countItemUsagesInKickoff = (
14
+ player: Player,
15
+ itemId: string
16
+ ): number => {
17
+ if (!player.tempCarac) {
18
+ return 0;
19
+ }
20
+
21
+ let tempCarac: Record<string, TempCaracEffect>;
22
+ try {
23
+ tempCarac = JSON.parse(player.tempCarac);
24
+ } catch (e) {
25
+ return 0;
26
+ }
27
+
28
+ let count = 0;
29
+ for (const effect of Object.values(tempCarac)) {
30
+ // Compter tous les effets liés à cet item
31
+ if (effect.itemId === itemId) {
32
+ count++;
33
+ }
34
+ }
35
+
36
+ return count;
37
+ };
38
+
39
+ export const canUseItem = (
40
+ player: Player,
41
+ itemId: string,
42
+ maxUsesPerKickoff?: number
43
+ ): boolean => {
44
+ if (maxUsesPerKickoff && maxUsesPerKickoff > 0) {
45
+ const currentUsages = countItemUsagesInKickoff(player, itemId);
46
+ if (currentUsages >= maxUsesPerKickoff) {
47
+ return false;
48
+ }
49
+ }
50
+
51
+ if (itemId === ITEM_ID.SMELLING_SALTS) {
52
+ return player.status === PLAYER_STATUS.KO;
53
+ }
54
+
55
+ return true;
56
+ };
57
+
58
+ export const getRemainingUsages = (
59
+ player: Player,
60
+ itemId: string,
61
+ maxUsesPerKickoff?: number
62
+ ): number => {
63
+ if (!maxUsesPerKickoff || maxUsesPerKickoff <= 0) {
64
+ return -1; // Pas de limite
65
+ }
66
+
67
+ const currentUsages = countItemUsagesInKickoff(player, itemId);
68
+ return Math.max(0, maxUsesPerKickoff - currentUsages);
69
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enefel",
3
- "version": "2.2.4",
3
+ "version": "2.4.0",
4
4
  "description": "Blood Bowl 3 game engine",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/player.ts CHANGED
@@ -164,10 +164,8 @@ function getMaxAG(player: Player, game: Game) {
164
164
 
165
165
  function getMaxMA(player: Player, game: Game) {
166
166
  let c = getMaxCommun(player, PLAYER_CARAC.MA, game);
167
-
168
167
  if (game) {
169
168
  const maxMA = meteoMaxMA(game.meteo);
170
-
171
169
  if (c > maxMA) {
172
170
  c = maxMA;
173
171
  }
package/race.ts CHANGED
@@ -168,7 +168,7 @@ const getPlayerAvatarPath = (player: Player) => {
168
168
 
169
169
  const getRaceFromCareer = (careerId: CAREER_ID) => {
170
170
  const career = getCareerFromKey(careerId);
171
- return career.badge;
171
+ return career?.badge;
172
172
  };
173
173
 
174
174
  const getAvatarTypeFromPlayer = (player: Player, avatarFile: string) => {
package/types/models.ts CHANGED
@@ -124,6 +124,8 @@ export interface Player extends Point {
124
124
  prevY: number | null; // add by Game
125
125
  hasEndTurn: boolean; // add by Game
126
126
  canUseSkills?: boolean; // add by Game
127
+ stats?: Stat[];
128
+ team?: Team;
127
129
  }
128
130
 
129
131
  export interface PlayerWithSkill extends Player {
@@ -208,6 +210,7 @@ export interface Item {
208
210
  y: number;
209
211
  type: string;
210
212
  forUser?: boolean;
213
+ maxUsesPerKickoff?: number;
211
214
  }
212
215
 
213
216
  export interface UserItem {