pokemon-io-core 0.0.125 → 0.0.126

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 (41) hide show
  1. package/dist/core/ids.d.ts +18 -6
  2. package/dist/core/ids.js +10 -1
  3. package/dist/core/index.d.ts +2 -1
  4. package/dist/core/index.js +2 -1
  5. package/dist/core/randomEvents.d.ts +21 -5
  6. package/dist/core/randomEvents.js +4 -4
  7. package/dist/core/randomEventsList.d.ts +10 -4
  8. package/dist/core/randomEventsList.js +24 -163
  9. package/dist/core/status.d.ts +1 -0
  10. package/dist/core/validation.d.ts +21 -0
  11. package/dist/core/validation.js +183 -0
  12. package/dist/engine/combat/damage.js +2 -1
  13. package/dist/engine/events/applyRandomEvent.js +13 -6
  14. package/dist/engine/turn/resolveTurn.js +3 -2
  15. package/dist/skins/CombatSkin.d.ts +1 -0
  16. package/dist/skins/cliches/clicheSkin.d.ts +2 -1
  17. package/dist/skins/cliches/clicheSkin.js +3 -0
  18. package/dist/skins/cliches/constants.d.ts +135 -0
  19. package/dist/skins/cliches/constants.js +136 -0
  20. package/dist/skins/cliches/fighters.d.ts +1 -1
  21. package/dist/skins/cliches/fighters.js +165 -165
  22. package/dist/skins/cliches/items.js +45 -44
  23. package/dist/skins/cliches/moves.js +74 -69
  24. package/dist/skins/cliches/randomEvents.d.ts +7 -0
  25. package/dist/skins/cliches/randomEvents.js +1167 -0
  26. package/dist/skins/cliches/statuses.js +63 -36
  27. package/dist/skins/cliches/types.d.ts +12 -12
  28. package/dist/skins/cliches/types.js +12 -11
  29. package/dist/skins/pokemon/constants.d.ts +83 -0
  30. package/dist/skins/pokemon/constants.js +84 -0
  31. package/dist/skins/pokemon/fighters.js +55 -55
  32. package/dist/skins/pokemon/items.js +23 -22
  33. package/dist/skins/pokemon/moves.js +59 -58
  34. package/dist/skins/pokemon/pokemonSkin.d.ts +2 -1
  35. package/dist/skins/pokemon/pokemonSkin.js +3 -0
  36. package/dist/skins/pokemon/randomEvents.d.ts +6 -0
  37. package/dist/skins/pokemon/randomEvents.js +165 -0
  38. package/dist/skins/pokemon/statuses.js +5 -4
  39. package/dist/skins/pokemon/types.d.ts +6 -6
  40. package/dist/skins/pokemon/types.js +7 -6
  41. package/package.json +1 -1
@@ -1,81 +1,108 @@
1
+ import { TRIBE_STATUS_IDS } from "./constants.js";
1
2
  export const TRIBE_STATUSES = [
2
- // CANALLITA (Fuego) – Quemadura -> "Resaca"
3
+ // Nuevos estados humorísticos
3
4
  {
4
- id: "resaca",
5
- name: "Resaca",
5
+ id: TRIBE_STATUS_IDS.MEDITAR,
6
+ name: "Meditando",
6
7
  kind: "soft",
8
+ color: '#7f48ff',
7
9
  minDurationTurns: 3,
8
10
  maxDurationTurns: 5,
9
11
  effectsPerStack: [
10
12
  {
11
- kind: "damage",
12
- flatAmount: 6, // El hígado duele
13
+ kind: "modify_stats",
14
+ target: "self",
15
+ offenseDelta: 1,
16
+ },
17
+ {
18
+ kind: "heal",
19
+ target: "self",
20
+ amount: 5,
13
21
  },
14
22
  ],
15
23
  },
16
- // CAYETANO (Agua) – Escaldado -> "Cancelado" (en Twitter)
17
24
  {
18
- id: "cancelado",
19
- name: "Cancelado",
25
+ id: TRIBE_STATUS_IDS.RESACA,
26
+ name: "Resaca",
20
27
  kind: "soft",
21
- minDurationTurns: 3,
22
- maxDurationTurns: 5,
28
+ color: '#ff00aa',
29
+ minDurationTurns: 4,
30
+ maxDurationTurns: 6,
23
31
  effectsPerStack: [
24
32
  {
25
33
  kind: "damage",
26
- flatAmount: 5, // Daño a la reputación
34
+ flatAmount: 5,
35
+ },
36
+ {
37
+ kind: "modify_stats",
38
+ target: "self",
39
+ defenseDelta: -1,
27
40
  },
28
41
  ],
29
42
  },
30
- // PERROFLAUTA (Planta) – Enredado -> "Sin Cobertura"
31
43
  {
32
- id: "sin_cobertura",
33
- name: "Sin Cobertura",
44
+ id: TRIBE_STATUS_IDS.AGUJETAS,
45
+ name: "Agujetas",
34
46
  kind: "soft",
47
+ color: '#ff672b',
35
48
  minDurationTurns: 3,
36
49
  maxDurationTurns: 5,
37
50
  effectsPerStack: [
38
51
  {
39
52
  kind: "damage",
40
- flatAmount: 4, // La ansiedad de no conectarse
53
+ flatAmount: 6,
54
+ },
55
+ {
56
+ kind: "modify_stats",
57
+ target: "self",
58
+ speedDelta: -1,
41
59
  },
42
60
  ],
43
61
  },
44
- // CUÑADO (Psíquico) – Bloqueo mental -> "Turra" (Te aburren)
45
- {
46
- id: "turra_maxima",
47
- name: "Turra Máxima",
48
- kind: "hard_cc", // Hard CC, te duermes del aburrimiento
49
- minDurationTurns: 1,
50
- maxDurationTurns: 2,
51
- effectsPerStack: [],
52
- },
53
- // GYMBRO (Roca) – Petrificado -> "Agujetas"
54
62
  {
55
- id: "agujetas",
56
- name: "Agujetas",
63
+ id: TRIBE_STATUS_IDS.FUMADO,
64
+ name: "Fumado",
57
65
  kind: "soft",
66
+ color: '#00ff77',
58
67
  minDurationTurns: 2,
59
68
  maxDurationTurns: 4,
60
69
  effectsPerStack: [
61
70
  {
62
- kind: "damage",
63
- flatAmount: 5, // No puedes moverte del dolor
71
+ kind: "modify_stats",
72
+ target: "self",
73
+ speedDelta: -1,
74
+ },
75
+ {
76
+ kind: "modify_stats",
77
+ target: "self",
78
+ defenseDelta: -1,
79
+ },
80
+ {
81
+ kind: "modify_stats",
82
+ target: "self",
83
+ offenseDelta: 1,
64
84
  },
65
85
  ],
66
86
  },
67
- // CRYPTOBRO (Eléctrico) – Electrocutado -> "Ansiedad"
68
87
  {
69
- id: "ansiedad_financiera",
70
- name: "Ansiedad",
88
+ id: TRIBE_STATUS_IDS.ESTUDIAR,
89
+ name: "Estudiando",
71
90
  kind: "soft",
72
- minDurationTurns: 2,
73
- maxDurationTurns: 4,
91
+ color: '#cacaca',
92
+ minDurationTurns: 3,
93
+ maxDurationTurns: 5,
74
94
  effectsPerStack: [
75
95
  {
76
- kind: "damage",
77
- flatAmount: 5, // El mercado baja, tu salud también
96
+ kind: "modify_stats",
97
+ target: "self",
98
+ offenseDelta: 1,
99
+ },
100
+ {
101
+ kind: "modify_stats",
102
+ target: "self",
103
+ defenseDelta: 1,
78
104
  },
79
105
  ],
80
106
  },
81
107
  ];
108
+ ;
@@ -1,16 +1,16 @@
1
- import type { TypeDefinition, TypeEffectivenessMatrix, TypeId } from "../../core/index.js";
1
+ import { type TypeDefinition, type TypeEffectivenessMatrix, type TypeId } from "../../core/index.js";
2
2
  export declare const TRIBE_TYPE_IDS: {
3
- readonly formal: "formal";
4
- readonly deportista: "deportista";
5
- readonly nerd: "nerd";
6
- readonly chuleta: "chuleta";
7
- readonly kinki: "kinki";
8
- readonly artista: "artista";
9
- readonly fiestero: "fiestero";
10
- readonly hippie: "hippie";
11
- readonly mistico: "mistico";
12
- readonly misterioso: "misterioso";
13
- readonly loco: "loco";
3
+ readonly formal: TypeId;
4
+ readonly deportista: TypeId;
5
+ readonly nerd: TypeId;
6
+ readonly chuleta: TypeId;
7
+ readonly kinki: TypeId;
8
+ readonly artista: TypeId;
9
+ readonly fiestero: TypeId;
10
+ readonly hippie: TypeId;
11
+ readonly mistico: TypeId;
12
+ readonly misterioso: TypeId;
13
+ readonly loco: TypeId;
14
14
  };
15
15
  export type TribeTypeId = (typeof TRIBE_TYPE_IDS)[keyof typeof TRIBE_TYPE_IDS];
16
16
  export declare const TRIBE_TYPES: TypeDefinition[];
@@ -1,15 +1,16 @@
1
+ import { typeId, } from "../../core/index.js";
1
2
  export const TRIBE_TYPE_IDS = {
2
- formal: "formal",
3
- deportista: "deportista",
4
- nerd: "nerd",
5
- chuleta: "chuleta",
6
- kinki: "kinki",
7
- artista: "artista",
8
- fiestero: "fiestero",
9
- hippie: "hippie",
10
- mistico: "mistico",
11
- misterioso: "misterioso",
12
- loco: "loco",
3
+ formal: typeId("formal"),
4
+ deportista: typeId("deportista"),
5
+ nerd: typeId("nerd"),
6
+ chuleta: typeId("chuleta"),
7
+ kinki: typeId("kinki"),
8
+ artista: typeId("artista"),
9
+ fiestero: typeId("fiestero"),
10
+ hippie: typeId("hippie"),
11
+ mistico: typeId("mistico"),
12
+ misterioso: typeId("misterioso"),
13
+ loco: typeId("loco"),
13
14
  };
14
15
  export const TRIBE_TYPES = [
15
16
  // --- FÍSICOS ---
@@ -0,0 +1,83 @@
1
+ export declare const POKEMON_TYPE_IDS: {
2
+ readonly FIRE: import("../../index.js").TypeId;
3
+ readonly WATER: import("../../index.js").TypeId;
4
+ readonly GRASS: import("../../index.js").TypeId;
5
+ readonly ELECTRIC: import("../../index.js").TypeId;
6
+ readonly PSYCHIC: import("../../index.js").TypeId;
7
+ readonly ROCK: import("../../index.js").TypeId;
8
+ readonly TYPELESS: import("../../index.js").TypeId;
9
+ };
10
+ export declare const POKEMON_FIGHTER_IDS: {
11
+ readonly PIKACHU: import("../../index.js").FighterId;
12
+ readonly CYNDAQUIL: import("../../index.js").FighterId;
13
+ readonly SQUIRTLE: import("../../index.js").FighterId;
14
+ readonly CHIKORITA: import("../../index.js").FighterId;
15
+ readonly PSYDUCK: import("../../index.js").FighterId;
16
+ readonly GEODUDE: import("../../index.js").FighterId;
17
+ readonly ELECTABUZZ: import("../../index.js").FighterId;
18
+ readonly MAGMORTAR: import("../../index.js").FighterId;
19
+ readonly BLASTOISE: import("../../index.js").FighterId;
20
+ readonly SCEPTILE: import("../../index.js").FighterId;
21
+ readonly ALAKAZAM: import("../../index.js").FighterId;
22
+ readonly ONIX: import("../../index.js").FighterId;
23
+ readonly ZAPDOS: import("../../index.js").FighterId;
24
+ readonly CHARIZARD: import("../../index.js").FighterId;
25
+ readonly KYOGRE: import("../../index.js").FighterId;
26
+ readonly VENUSAUR: import("../../index.js").FighterId;
27
+ readonly MEW: import("../../index.js").FighterId;
28
+ readonly GROUDON: import("../../index.js").FighterId;
29
+ };
30
+ export declare const POKEMON_MOVE_IDS: {
31
+ readonly PHANTOM_STEP: import("../../index.js").MoveId;
32
+ readonly TRUE_SIGHT: import("../../index.js").MoveId;
33
+ readonly HYPNOSIS: import("../../index.js").MoveId;
34
+ readonly INFERNO: import("../../index.js").MoveId;
35
+ readonly EMBER: import("../../index.js").MoveId;
36
+ readonly HEAT_WAVE: import("../../index.js").MoveId;
37
+ readonly CAUTERIZE: import("../../index.js").MoveId;
38
+ readonly TSUNAMI: import("../../index.js").MoveId;
39
+ readonly STREAM: import("../../index.js").MoveId;
40
+ readonly REFRESH: import("../../index.js").MoveId;
41
+ readonly PURIFY: import("../../index.js").MoveId;
42
+ readonly SOLAR_BEAM: import("../../index.js").MoveId;
43
+ readonly VINE: import("../../index.js").MoveId;
44
+ readonly SYNTHESIS: import("../../index.js").MoveId;
45
+ readonly BLOOM: import("../../index.js").MoveId;
46
+ readonly THUNDER_STRIKE: import("../../index.js").MoveId;
47
+ readonly SPARK: import("../../index.js").MoveId;
48
+ readonly RECHARGE: import("../../index.js").MoveId;
49
+ readonly GROUNDING: import("../../index.js").MoveId;
50
+ readonly PSYSTRIKE: import("../../index.js").MoveId;
51
+ readonly PULSE: import("../../index.js").MoveId;
52
+ readonly MEDITATE: import("../../index.js").MoveId;
53
+ readonly CLARITY: import("../../index.js").MoveId;
54
+ readonly LANDSLIDE: import("../../index.js").MoveId;
55
+ readonly THROW: import("../../index.js").MoveId;
56
+ readonly MEND: import("../../index.js").MoveId;
57
+ readonly POLISH: import("../../index.js").MoveId;
58
+ };
59
+ export declare const POKEMON_STATUS_IDS: {
60
+ readonly BURN: import("../../index.js").StatusId;
61
+ readonly PARALYSIS: import("../../index.js").StatusId;
62
+ readonly POISON: import("../../index.js").StatusId;
63
+ readonly SLEEP: import("../../index.js").StatusId;
64
+ };
65
+ export declare const POKEMON_ITEM_IDS: {
66
+ readonly SUPER_POTION: import("../../index.js").ItemId;
67
+ readonly POTION: import("../../index.js").ItemId;
68
+ readonly APPLE: import("../../index.js").ItemId;
69
+ readonly MUSHROOM: import("../../index.js").ItemId;
70
+ readonly SHOTGUN: import("../../index.js").ItemId;
71
+ readonly PISTOL: import("../../index.js").ItemId;
72
+ readonly RIFFLE: import("../../index.js").ItemId;
73
+ readonly SNIPER: import("../../index.js").ItemId;
74
+ readonly BLUE_BERRY: import("../../index.js").ItemId;
75
+ readonly PINK_BERRY: import("../../index.js").ItemId;
76
+ readonly YELLOW_BERRY: import("../../index.js").ItemId;
77
+ readonly GREEN_BERRY: import("../../index.js").ItemId;
78
+ readonly ATTACK_POTION: import("../../index.js").ItemId;
79
+ readonly DEFENSE_POTION: import("../../index.js").ItemId;
80
+ readonly SPEED_ELIXIR: import("../../index.js").ItemId;
81
+ readonly CRIT_INJECTION: import("../../index.js").ItemId;
82
+ readonly CHESTO_BERRY: import("../../index.js").ItemId;
83
+ };
@@ -0,0 +1,84 @@
1
+ import { typeId, fighterId, moveId, statusId, itemId } from "../../core/ids.js";
2
+ export const POKEMON_TYPE_IDS = {
3
+ FIRE: typeId("fire"),
4
+ WATER: typeId("water"),
5
+ GRASS: typeId("grass"),
6
+ ELECTRIC: typeId("electric"),
7
+ PSYCHIC: typeId("psychic"),
8
+ ROCK: typeId("rock"),
9
+ TYPELESS: typeId("typeless"),
10
+ };
11
+ export const POKEMON_FIGHTER_IDS = {
12
+ PIKACHU: fighterId("pikachu"),
13
+ CYNDAQUIL: fighterId("cyndaquil"),
14
+ SQUIRTLE: fighterId("squirtle"),
15
+ CHIKORITA: fighterId("chikorita"),
16
+ PSYDUCK: fighterId("psyduck"),
17
+ GEODUDE: fighterId("geodude"),
18
+ ELECTABUZZ: fighterId("electabuzz"),
19
+ MAGMORTAR: fighterId("magmortar"),
20
+ BLASTOISE: fighterId("blastoise"),
21
+ SCEPTILE: fighterId("sceptile"),
22
+ ALAKAZAM: fighterId("alakazam"),
23
+ ONIX: fighterId("onix"),
24
+ ZAPDOS: fighterId("zapdos"),
25
+ CHARIZARD: fighterId("charizard"),
26
+ KYOGRE: fighterId("kyogre"),
27
+ VENUSAUR: fighterId("venusaur"),
28
+ MEW: fighterId("mew"),
29
+ GROUDON: fighterId("groudon"),
30
+ };
31
+ export const POKEMON_MOVE_IDS = {
32
+ PHANTOM_STEP: moveId("phantom_step"),
33
+ TRUE_SIGHT: moveId("true_sight"),
34
+ HYPNOSIS: moveId("hypnosis"),
35
+ INFERNO: moveId("inferno"),
36
+ EMBER: moveId("ember"),
37
+ HEAT_WAVE: moveId("heat_wave"),
38
+ CAUTERIZE: moveId("cauterize"),
39
+ TSUNAMI: moveId("tsunami"),
40
+ STREAM: moveId("stream"),
41
+ REFRESH: moveId("refresh"),
42
+ PURIFY: moveId("purify"),
43
+ SOLAR_BEAM: moveId("solar_beam"),
44
+ VINE: moveId("vine"),
45
+ SYNTHESIS: moveId("synthesis"),
46
+ BLOOM: moveId("bloom"),
47
+ THUNDER_STRIKE: moveId("thunder_strike"),
48
+ SPARK: moveId("spark"),
49
+ RECHARGE: moveId("recharge"),
50
+ GROUNDING: moveId("grounding"),
51
+ PSYSTRIKE: moveId("psystrike"),
52
+ PULSE: moveId("pulse"),
53
+ MEDITATE: moveId("meditate"),
54
+ CLARITY: moveId("clarity"),
55
+ LANDSLIDE: moveId("landslide"),
56
+ THROW: moveId("throw"),
57
+ MEND: moveId("mend"),
58
+ POLISH: moveId("polish"),
59
+ };
60
+ export const POKEMON_STATUS_IDS = {
61
+ BURN: statusId("burn"),
62
+ PARALYSIS: statusId("paralysis"),
63
+ POISON: statusId("poison"),
64
+ SLEEP: statusId("sleep"),
65
+ };
66
+ export const POKEMON_ITEM_IDS = {
67
+ SUPER_POTION: itemId("super_potion"),
68
+ POTION: itemId("potion"),
69
+ APPLE: itemId("apple"),
70
+ MUSHROOM: itemId("mushroom"),
71
+ SHOTGUN: itemId("shotgun"),
72
+ PISTOL: itemId("pistol"),
73
+ RIFFLE: itemId("riffle"),
74
+ SNIPER: itemId("sniper"),
75
+ BLUE_BERRY: itemId("blue-berry"),
76
+ PINK_BERRY: itemId("pink-berry"),
77
+ YELLOW_BERRY: itemId("yellow-berry"),
78
+ GREEN_BERRY: itemId("green-berry"),
79
+ ATTACK_POTION: itemId("attack_potion"),
80
+ DEFENSE_POTION: itemId("defense_potion"),
81
+ SPEED_ELIXIR: itemId("speed_elixir"),
82
+ CRIT_INJECTION: itemId("crit_injection"),
83
+ CHESTO_BERRY: itemId("chesto_berry"),
84
+ };
@@ -1,4 +1,4 @@
1
- import { POKEMON_TYPE_IDS } from "./types.js";
1
+ import { POKEMON_FIGHTER_IDS, POKEMON_TYPE_IDS } from "./constants.js";
2
2
  const makeStats = (offense, defense, speed, crit) => ({
3
3
  offense,
4
4
  defense,
@@ -8,167 +8,167 @@ const makeStats = (offense, defense, speed, crit) => ({
8
8
  export const POKEMON_FIGHTERS = [
9
9
  // --- TIER 1: AZUL (Suma Atk + Def < 100) ---
10
10
  {
11
- id: "pikachu",
11
+ id: POKEMON_FIGHTER_IDS.PIKACHU,
12
12
  name: "Pikachu",
13
13
  description: "Rápido y ágil, confía en su velocidad y golpes críticos.",
14
14
  img: "pikachu",
15
- classIds: [POKEMON_TYPE_IDS.electric],
15
+ classIds: [POKEMON_TYPE_IDS.ELECTRIC],
16
16
  baseStats: makeStats(55, 35, 90, 15), // Suma: 90
17
- recommendedMoves: ["tackle", "thunder_shock"],
17
+ recommendedMoves: [],
18
18
  },
19
19
  {
20
- id: "cyndaquil",
20
+ id: POKEMON_FIGHTER_IDS.CYNDAQUIL,
21
21
  name: "Cyndaquil",
22
22
  description: "Pequeño volcán en erupción, ofensivo pero frágil.",
23
23
  img: "cyndaquil",
24
- classIds: [POKEMON_TYPE_IDS.fire],
24
+ classIds: [POKEMON_TYPE_IDS.FIRE],
25
25
  baseStats: makeStats(52, 38, 75, 10), // Suma: 90
26
- recommendedMoves: ["tackle", "ember"],
26
+ recommendedMoves: [],
27
27
  },
28
28
  {
29
- id: "squirtle",
29
+ id: POKEMON_FIGHTER_IDS.SQUIRTLE,
30
30
  name: "Squirtle",
31
31
  description: "Caparazón resistente, ideal para resistir el daño inicial.",
32
32
  img: "squirtle",
33
- classIds: [POKEMON_TYPE_IDS.water],
33
+ classIds: [POKEMON_TYPE_IDS.WATER],
34
34
  baseStats: makeStats(40, 58, 45, 5), // Suma: 98
35
- recommendedMoves: ["tackle", "water_gun"],
35
+ recommendedMoves: [],
36
36
  },
37
37
  {
38
- id: "chikorita",
38
+ id: POKEMON_FIGHTER_IDS.CHIKORITA,
39
39
  name: "Chikorita",
40
40
  description: "Soporte natural, destaca por su defensa y persistencia.",
41
41
  img: "chikorita",
42
- classIds: [POKEMON_TYPE_IDS.grass],
42
+ classIds: [POKEMON_TYPE_IDS.GRASS],
43
43
  baseStats: makeStats(35, 60, 40, 5), // Suma: 95
44
- recommendedMoves: ["tackle", "vine_whip"],
44
+ recommendedMoves: [],
45
45
  },
46
46
  {
47
- id: "psyduck",
47
+ id: POKEMON_FIGHTER_IDS.PSYDUCK,
48
48
  name: "Psyduck",
49
49
  description: "Dolor de cabeza constante que desata ráfagas psíquicas.",
50
50
  img: "psyduck",
51
- classIds: [POKEMON_TYPE_IDS.psychic],
51
+ classIds: [POKEMON_TYPE_IDS.PSYCHIC],
52
52
  baseStats: makeStats(50, 40, 60, 12), // Suma: 90
53
- recommendedMoves: ["confusion"],
53
+ recommendedMoves: [],
54
54
  },
55
55
  {
56
- id: "geodude",
56
+ id: POKEMON_FIGHTER_IDS.GEODUDE,
57
57
  name: "Geodude",
58
58
  description: "Roca sólida, muy duro de derribar pero extremadamente lento.",
59
59
  img: "geodude",
60
- classIds: [POKEMON_TYPE_IDS.rock],
60
+ classIds: [POKEMON_TYPE_IDS.ROCK],
61
61
  baseStats: makeStats(40, 58, 20, 5), // Suma: 98
62
- recommendedMoves: ["tackle", "rock_throw"],
62
+ recommendedMoves: [],
63
63
  },
64
64
  // --- TIER 2: AMBER (Suma Atk + Def >= 100 y < 120) ---
65
65
  {
66
- id: "electabuzz",
66
+ id: POKEMON_FIGHTER_IDS.ELECTABUZZ,
67
67
  name: "Electabuzz",
68
68
  description: "Duelista eléctrico balanceado con gran capacidad ofensiva.",
69
69
  img: "electabuzz",
70
- classIds: [POKEMON_TYPE_IDS.electric],
70
+ classIds: [POKEMON_TYPE_IDS.ELECTRIC],
71
71
  baseStats: makeStats(65, 45, 95, 10), // Suma: 110
72
- recommendedMoves: ["tackle", "thunder_shock"],
72
+ recommendedMoves: [],
73
73
  },
74
74
  {
75
- id: "magmortar",
75
+ id: POKEMON_FIGHTER_IDS.MAGMORTAR,
76
76
  name: "Magmortar",
77
77
  description: "Artillería pesada de fuego, daño masivo a media distancia.",
78
78
  img: "magmortar",
79
- classIds: [POKEMON_TYPE_IDS.fire],
79
+ classIds: [POKEMON_TYPE_IDS.FIRE],
80
80
  baseStats: makeStats(70, 45, 60, 8), // Suma: 115
81
- recommendedMoves: ["tackle", "ember"],
81
+ recommendedMoves: [],
82
82
  },
83
83
  {
84
- id: "blastoise",
84
+ id: POKEMON_FIGHTER_IDS.BLASTOISE,
85
85
  name: "Blastoise",
86
86
  description: "Tanque con cañones hidráulicos, una muralla ofensiva.",
87
87
  img: "blastoise",
88
- classIds: [POKEMON_TYPE_IDS.water],
88
+ classIds: [POKEMON_TYPE_IDS.WATER],
89
89
  baseStats: makeStats(50, 65, 55, 5), // Suma: 115
90
- recommendedMoves: ["tackle", "water_gun"],
90
+ recommendedMoves: [],
91
91
  },
92
92
  {
93
- id: "sceptile",
93
+ id: POKEMON_FIGHTER_IDS.SCEPTILE,
94
94
  name: "Sceptile",
95
95
  description: "Depredador de la selva, golpea letalmente desde las sombras.",
96
96
  img: "sceptile",
97
- classIds: [POKEMON_TYPE_IDS.grass],
97
+ classIds: [POKEMON_TYPE_IDS.GRASS],
98
98
  baseStats: makeStats(68, 40, 100, 12), // Suma: 108
99
- recommendedMoves: ["tackle", "vine_whip"],
99
+ recommendedMoves: [],
100
100
  },
101
101
  {
102
- id: "alakazam",
102
+ id: POKEMON_FIGHTER_IDS.ALAKAZAM,
103
103
  name: "Alakazam",
104
104
  description: "Coeficiente intelectual de 5000, poder mental puro sin defensa física.",
105
105
  img: "alakazam",
106
- classIds: [POKEMON_TYPE_IDS.psychic],
106
+ classIds: [POKEMON_TYPE_IDS.PSYCHIC],
107
107
  baseStats: makeStats(75, 30, 95, 8), // Suma: 105
108
- recommendedMoves: ["tackle", "confusion"],
108
+ recommendedMoves: [],
109
109
  },
110
110
  {
111
- id: "onix",
111
+ id: POKEMON_FIGHTER_IDS.ONIX,
112
112
  name: "Onix",
113
113
  description: "Serpiente de roca gigante, defensa física casi impenetrable.",
114
114
  img: "onix",
115
- classIds: [POKEMON_TYPE_IDS.rock],
115
+ classIds: [POKEMON_TYPE_IDS.ROCK],
116
116
  baseStats: makeStats(35, 80, 30, 5), // Suma: 115
117
- recommendedMoves: ["tackle", "rock_slide"],
117
+ recommendedMoves: [],
118
118
  },
119
119
  // --- TIER 3: RED (Suma Atk + Def >= 120) ---
120
120
  {
121
- id: "zapdos",
121
+ id: POKEMON_FIGHTER_IDS.ZAPDOS,
122
122
  name: "Zapdos",
123
123
  description: "Ave legendaria del trueno, domina los cielos con poder bruto.",
124
124
  img: "zapdos",
125
- classIds: [POKEMON_TYPE_IDS.electric],
125
+ classIds: [POKEMON_TYPE_IDS.ELECTRIC],
126
126
  baseStats: makeStats(70, 55, 85, 10), // Suma: 125
127
- recommendedMoves: ["peck", "thunderbolt"],
127
+ recommendedMoves: [],
128
128
  },
129
129
  {
130
- id: "charizard",
130
+ id: POKEMON_FIGHTER_IDS.CHARIZARD,
131
131
  name: "Charizard",
132
132
  description: "Dragón de fuego icónico, arrasa con todo a su paso.",
133
133
  img: "charizard",
134
- classIds: [POKEMON_TYPE_IDS.fire],
134
+ classIds: [POKEMON_TYPE_IDS.FIRE],
135
135
  baseStats: makeStats(75, 50, 85, 10), // Suma: 125
136
- recommendedMoves: ["tackle", "ember"],
136
+ recommendedMoves: [],
137
137
  },
138
138
  {
139
- id: "kyogre",
139
+ id: POKEMON_FIGHTER_IDS.KYOGRE,
140
140
  name: "Kyogre",
141
141
  description: "Leviatán mítico capaz de inundar el mundo entero.",
142
142
  img: "kyogre",
143
- classIds: [POKEMON_TYPE_IDS.water],
143
+ classIds: [POKEMON_TYPE_IDS.WATER],
144
144
  baseStats: makeStats(75, 65, 60, 8), // Suma: 140
145
- recommendedMoves: ["tackle", "water_gun"],
145
+ recommendedMoves: [],
146
146
  },
147
147
  {
148
- id: "venusaur",
148
+ id: POKEMON_FIGHTER_IDS.VENUSAUR,
149
149
  name: "Venusaur",
150
150
  description: "Coloso de la jungla, combina toxicidad y fuerza bruta.",
151
151
  img: "venusaur",
152
- classIds: [POKEMON_TYPE_IDS.grass],
152
+ classIds: [POKEMON_TYPE_IDS.GRASS],
153
153
  baseStats: makeStats(62, 63, 60, 6), // Suma: 125
154
- recommendedMoves: ["tackle", "vine_whip"],
154
+ recommendedMoves: [],
155
155
  },
156
156
  {
157
- id: "mew",
157
+ id: POKEMON_FIGHTER_IDS.MEW,
158
158
  name: "Mew",
159
159
  description: "El ancestro de todos los Pokémon, versátil y místico.",
160
160
  img: "mew",
161
- classIds: [POKEMON_TYPE_IDS.psychic],
161
+ classIds: [POKEMON_TYPE_IDS.PSYCHIC],
162
162
  baseStats: makeStats(65, 65, 80, 10), // Suma: 130
163
- recommendedMoves: ["tackle", "confusion"], // Corregido vine_whip
163
+ recommendedMoves: []
164
164
  },
165
165
  {
166
- id: "groudon",
166
+ id: POKEMON_FIGHTER_IDS.GROUDON,
167
167
  name: "Groudon",
168
168
  description: "Creador de continentes, poder terrestre devastador.",
169
169
  img: "groudon",
170
- classIds: [POKEMON_TYPE_IDS.rock],
170
+ classIds: [POKEMON_TYPE_IDS.ROCK],
171
171
  baseStats: makeStats(80, 70, 50, 6), // Suma: 150
172
- recommendedMoves: ["tackle", "rock_slide"], // Corregido vine_whip
172
+ recommendedMoves: []
173
173
  },
174
174
  ];