pokemon-io-core 0.0.125 → 0.0.127
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/core/ids.d.ts +18 -6
- package/dist/core/ids.js +10 -1
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.js +2 -1
- package/dist/core/randomEvents.d.ts +21 -5
- package/dist/core/randomEvents.js +4 -4
- package/dist/core/randomEventsList.d.ts +10 -4
- package/dist/core/randomEventsList.js +24 -163
- package/dist/core/status.d.ts +1 -0
- package/dist/core/validation.d.ts +21 -0
- package/dist/core/validation.js +183 -0
- package/dist/engine/combat/damage.js +2 -1
- package/dist/engine/events/applyRandomEvent.js +13 -6
- package/dist/engine/turn/resolveTurn.js +3 -2
- package/dist/skins/CombatSkin.d.ts +1 -0
- package/dist/skins/cliches/clicheSkin.d.ts +2 -1
- package/dist/skins/cliches/clicheSkin.js +3 -0
- package/dist/skins/cliches/constants.d.ts +135 -0
- package/dist/skins/cliches/constants.js +136 -0
- package/dist/skins/cliches/fighters.d.ts +1 -1
- package/dist/skins/cliches/fighters.js +165 -165
- package/dist/skins/cliches/index.d.ts +1 -0
- package/dist/skins/cliches/index.js +1 -0
- package/dist/skins/cliches/items.js +45 -44
- package/dist/skins/cliches/moves.js +74 -69
- package/dist/skins/cliches/randomEvents.d.ts +7 -0
- package/dist/skins/cliches/randomEvents.js +1167 -0
- package/dist/skins/cliches/statuses.js +63 -36
- package/dist/skins/cliches/types.d.ts +1 -15
- package/dist/skins/cliches/types.js +165 -181
- package/dist/skins/pokemon/constants.d.ts +83 -0
- package/dist/skins/pokemon/constants.js +84 -0
- package/dist/skins/pokemon/fighters.js +55 -55
- package/dist/skins/pokemon/index.d.ts +1 -0
- package/dist/skins/pokemon/index.js +1 -0
- package/dist/skins/pokemon/items.js +23 -22
- package/dist/skins/pokemon/moves.js +59 -58
- package/dist/skins/pokemon/pokemonSkin.d.ts +2 -1
- package/dist/skins/pokemon/pokemonSkin.js +3 -0
- package/dist/skins/pokemon/randomEvents.d.ts +6 -0
- package/dist/skins/pokemon/randomEvents.js +165 -0
- package/dist/skins/pokemon/statuses.js +5 -4
- package/dist/skins/pokemon/types.d.ts +0 -9
- package/dist/skins/pokemon/types.js +49 -56
- package/package.json +1 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { POKEMON_MOVE_IDS, POKEMON_STATUS_IDS, POKEMON_TYPE_IDS } from "./constants.js";
|
|
1
2
|
// Balance Standards:
|
|
2
3
|
// Nuke: 45 Power, 85 Acc, 4 PP.
|
|
3
4
|
// Core: 25 Power, 95 Acc, 8 PP. (10% Status Chance)
|
|
4
5
|
// Utility/Heal: 100 Acc, 12 PP.
|
|
5
6
|
export const POKEMON_MOVES = [
|
|
6
7
|
{
|
|
7
|
-
id:
|
|
8
|
+
id: POKEMON_MOVE_IDS.PHANTOM_STEP,
|
|
8
9
|
name: "Paso Fantasma",
|
|
9
|
-
typeId:
|
|
10
|
+
typeId: POKEMON_TYPE_IDS.TYPELESS,
|
|
10
11
|
accuracy: 95,
|
|
11
12
|
maxPP: 4,
|
|
12
13
|
priority: 0,
|
|
@@ -14,9 +15,9 @@ export const POKEMON_MOVES = [
|
|
|
14
15
|
effects: [{ kind: "damage", basePower: 40 }]
|
|
15
16
|
},
|
|
16
17
|
{
|
|
17
|
-
id:
|
|
18
|
+
id: POKEMON_MOVE_IDS.TRUE_SIGHT,
|
|
18
19
|
name: "Visión Verdadera",
|
|
19
|
-
typeId:
|
|
20
|
+
typeId: POKEMON_TYPE_IDS.TYPELESS,
|
|
20
21
|
accuracy: 100,
|
|
21
22
|
maxPP: 8,
|
|
22
23
|
priority: 0,
|
|
@@ -24,25 +25,25 @@ export const POKEMON_MOVES = [
|
|
|
24
25
|
effects: [{ kind: "damage", basePower: 40 }]
|
|
25
26
|
},
|
|
26
27
|
{
|
|
27
|
-
id:
|
|
28
|
+
id: POKEMON_MOVE_IDS.HYPNOSIS,
|
|
28
29
|
name: "Hipnosis",
|
|
29
|
-
typeId:
|
|
30
|
+
typeId: POKEMON_TYPE_IDS.TYPELESS,
|
|
30
31
|
accuracy: 70, // Low accuracy for Hard CC
|
|
31
32
|
maxPP: 4,
|
|
32
33
|
priority: 0,
|
|
33
34
|
effects: [
|
|
34
35
|
{
|
|
35
36
|
kind: "apply_status",
|
|
36
|
-
statusId:
|
|
37
|
+
statusId: POKEMON_STATUS_IDS.SLEEP,
|
|
37
38
|
chance: 1 // 100% chance if hits
|
|
38
39
|
}
|
|
39
40
|
]
|
|
40
41
|
},
|
|
41
42
|
// --- FIRE ---
|
|
42
43
|
{
|
|
43
|
-
id:
|
|
44
|
+
id: POKEMON_MOVE_IDS.INFERNO,
|
|
44
45
|
name: "Infierno",
|
|
45
|
-
typeId:
|
|
46
|
+
typeId: POKEMON_TYPE_IDS.FIRE,
|
|
46
47
|
accuracy: 85,
|
|
47
48
|
maxPP: 4,
|
|
48
49
|
narration: [
|
|
@@ -57,28 +58,28 @@ export const POKEMON_MOVES = [
|
|
|
57
58
|
]
|
|
58
59
|
},
|
|
59
60
|
{
|
|
60
|
-
id:
|
|
61
|
+
id: POKEMON_MOVE_IDS.EMBER,
|
|
61
62
|
name: "Ascuas",
|
|
62
|
-
typeId:
|
|
63
|
+
typeId: POKEMON_TYPE_IDS.FIRE,
|
|
63
64
|
accuracy: 95,
|
|
64
65
|
maxPP: 8,
|
|
65
66
|
effects: [
|
|
66
67
|
{ kind: "damage", basePower: 25 },
|
|
67
|
-
{ kind: "apply_status", statusId:
|
|
68
|
+
{ kind: "apply_status", statusId: POKEMON_STATUS_IDS.BURN, chance: 0.1 }
|
|
68
69
|
]
|
|
69
70
|
},
|
|
70
71
|
{
|
|
71
|
-
id:
|
|
72
|
+
id: POKEMON_MOVE_IDS.HEAT_WAVE,
|
|
72
73
|
name: "Onda de Calor",
|
|
73
|
-
typeId:
|
|
74
|
+
typeId: POKEMON_TYPE_IDS.FIRE,
|
|
74
75
|
accuracy: 100,
|
|
75
76
|
maxPP: 12,
|
|
76
77
|
effects: [{ kind: "heal", target: "self", amount: 50 }]
|
|
77
78
|
},
|
|
78
79
|
{
|
|
79
|
-
id:
|
|
80
|
+
id: POKEMON_MOVE_IDS.CAUTERIZE,
|
|
80
81
|
name: "Cauterizar",
|
|
81
|
-
typeId:
|
|
82
|
+
typeId: POKEMON_TYPE_IDS.FIRE,
|
|
82
83
|
accuracy: 100,
|
|
83
84
|
maxPP: 12,
|
|
84
85
|
effects: [
|
|
@@ -88,9 +89,9 @@ export const POKEMON_MOVES = [
|
|
|
88
89
|
},
|
|
89
90
|
// --- WATER ---
|
|
90
91
|
{
|
|
91
|
-
id:
|
|
92
|
+
id: POKEMON_MOVE_IDS.TSUNAMI,
|
|
92
93
|
name: "Tsunami",
|
|
93
|
-
typeId:
|
|
94
|
+
typeId: POKEMON_TYPE_IDS.WATER,
|
|
94
95
|
accuracy: 85,
|
|
95
96
|
maxPP: 4,
|
|
96
97
|
effects: [
|
|
@@ -99,25 +100,25 @@ export const POKEMON_MOVES = [
|
|
|
99
100
|
]
|
|
100
101
|
},
|
|
101
102
|
{
|
|
102
|
-
id:
|
|
103
|
+
id: POKEMON_MOVE_IDS.STREAM,
|
|
103
104
|
name: "Corriente",
|
|
104
|
-
typeId:
|
|
105
|
+
typeId: POKEMON_TYPE_IDS.WATER,
|
|
105
106
|
accuracy: 95,
|
|
106
107
|
maxPP: 8,
|
|
107
108
|
effects: [{ kind: "damage", basePower: 25 }]
|
|
108
109
|
},
|
|
109
110
|
{
|
|
110
|
-
id:
|
|
111
|
+
id: POKEMON_MOVE_IDS.REFRESH,
|
|
111
112
|
name: "Refrescar",
|
|
112
|
-
typeId:
|
|
113
|
+
typeId: POKEMON_TYPE_IDS.WATER,
|
|
113
114
|
accuracy: 100,
|
|
114
115
|
maxPP: 12,
|
|
115
116
|
effects: [{ kind: "heal", target: "self", amount: 50 }]
|
|
116
117
|
},
|
|
117
118
|
{
|
|
118
|
-
id:
|
|
119
|
+
id: POKEMON_MOVE_IDS.PURIFY,
|
|
119
120
|
name: "Purificar",
|
|
120
|
-
typeId:
|
|
121
|
+
typeId: POKEMON_TYPE_IDS.WATER,
|
|
121
122
|
accuracy: 100,
|
|
122
123
|
maxPP: 12,
|
|
123
124
|
effects: [
|
|
@@ -127,9 +128,9 @@ export const POKEMON_MOVES = [
|
|
|
127
128
|
},
|
|
128
129
|
// --- GRASS ---
|
|
129
130
|
{
|
|
130
|
-
id:
|
|
131
|
+
id: POKEMON_MOVE_IDS.SOLAR_BEAM,
|
|
131
132
|
name: "Rayo Solar",
|
|
132
|
-
typeId:
|
|
133
|
+
typeId: POKEMON_TYPE_IDS.GRASS,
|
|
133
134
|
accuracy: 85,
|
|
134
135
|
maxPP: 4,
|
|
135
136
|
effects: [
|
|
@@ -138,28 +139,28 @@ export const POKEMON_MOVES = [
|
|
|
138
139
|
]
|
|
139
140
|
},
|
|
140
141
|
{
|
|
141
|
-
id:
|
|
142
|
+
id: POKEMON_MOVE_IDS.VINE,
|
|
142
143
|
name: "Látigo Cepa",
|
|
143
|
-
typeId:
|
|
144
|
+
typeId: POKEMON_TYPE_IDS.GRASS,
|
|
144
145
|
accuracy: 95,
|
|
145
146
|
maxPP: 8,
|
|
146
147
|
effects: [
|
|
147
148
|
{ kind: "damage", basePower: 25 },
|
|
148
|
-
{ kind: "apply_status", statusId:
|
|
149
|
+
{ kind: "apply_status", statusId: POKEMON_STATUS_IDS.POISON, chance: 0.1 }
|
|
149
150
|
]
|
|
150
151
|
},
|
|
151
152
|
{
|
|
152
|
-
id:
|
|
153
|
+
id: POKEMON_MOVE_IDS.SYNTHESIS,
|
|
153
154
|
name: "Síntesis",
|
|
154
|
-
typeId:
|
|
155
|
+
typeId: POKEMON_TYPE_IDS.GRASS,
|
|
155
156
|
accuracy: 100,
|
|
156
157
|
maxPP: 12,
|
|
157
158
|
effects: [{ kind: "heal", target: "self", amount: 50 }]
|
|
158
159
|
},
|
|
159
160
|
{
|
|
160
|
-
id:
|
|
161
|
+
id: POKEMON_MOVE_IDS.BLOOM,
|
|
161
162
|
name: "Floración",
|
|
162
|
-
typeId:
|
|
163
|
+
typeId: POKEMON_TYPE_IDS.GRASS,
|
|
163
164
|
accuracy: 100,
|
|
164
165
|
maxPP: 12,
|
|
165
166
|
effects: [
|
|
@@ -169,9 +170,9 @@ export const POKEMON_MOVES = [
|
|
|
169
170
|
},
|
|
170
171
|
// --- ELECTRIC ---
|
|
171
172
|
{
|
|
172
|
-
id:
|
|
173
|
+
id: POKEMON_MOVE_IDS.THUNDER_STRIKE,
|
|
173
174
|
name: "Golpe Trueno",
|
|
174
|
-
typeId:
|
|
175
|
+
typeId: POKEMON_TYPE_IDS.ELECTRIC,
|
|
175
176
|
accuracy: 85,
|
|
176
177
|
maxPP: 4,
|
|
177
178
|
effects: [
|
|
@@ -180,28 +181,28 @@ export const POKEMON_MOVES = [
|
|
|
180
181
|
]
|
|
181
182
|
},
|
|
182
183
|
{
|
|
183
|
-
id:
|
|
184
|
+
id: POKEMON_MOVE_IDS.SPARK,
|
|
184
185
|
name: "Chispa",
|
|
185
|
-
typeId:
|
|
186
|
+
typeId: POKEMON_TYPE_IDS.ELECTRIC,
|
|
186
187
|
accuracy: 95,
|
|
187
188
|
maxPP: 8,
|
|
188
189
|
effects: [
|
|
189
190
|
{ kind: "damage", basePower: 25 },
|
|
190
|
-
{ kind: "apply_status", statusId:
|
|
191
|
+
{ kind: "apply_status", statusId: POKEMON_STATUS_IDS.PARALYSIS, chance: 0.1 }
|
|
191
192
|
]
|
|
192
193
|
},
|
|
193
194
|
{
|
|
194
|
-
id:
|
|
195
|
+
id: POKEMON_MOVE_IDS.RECHARGE,
|
|
195
196
|
name: "Recarga",
|
|
196
|
-
typeId:
|
|
197
|
+
typeId: POKEMON_TYPE_IDS.ELECTRIC,
|
|
197
198
|
accuracy: 100,
|
|
198
199
|
maxPP: 12,
|
|
199
200
|
effects: [{ kind: "heal", target: "self", amount: 50 }]
|
|
200
201
|
},
|
|
201
202
|
{
|
|
202
|
-
id:
|
|
203
|
+
id: POKEMON_MOVE_IDS.GROUNDING,
|
|
203
204
|
name: "Toma de Tierra",
|
|
204
|
-
typeId:
|
|
205
|
+
typeId: POKEMON_TYPE_IDS.ELECTRIC,
|
|
205
206
|
accuracy: 100,
|
|
206
207
|
maxPP: 12,
|
|
207
208
|
effects: [
|
|
@@ -211,9 +212,9 @@ export const POKEMON_MOVES = [
|
|
|
211
212
|
},
|
|
212
213
|
// --- PSYCHIC ---
|
|
213
214
|
{
|
|
214
|
-
id:
|
|
215
|
+
id: POKEMON_MOVE_IDS.PSYSTRIKE,
|
|
215
216
|
name: "Onda Mental",
|
|
216
|
-
typeId:
|
|
217
|
+
typeId: POKEMON_TYPE_IDS.PSYCHIC,
|
|
217
218
|
accuracy: 85,
|
|
218
219
|
maxPP: 4,
|
|
219
220
|
effects: [
|
|
@@ -222,25 +223,25 @@ export const POKEMON_MOVES = [
|
|
|
222
223
|
]
|
|
223
224
|
},
|
|
224
225
|
{
|
|
225
|
-
id:
|
|
226
|
+
id: POKEMON_MOVE_IDS.PULSE,
|
|
226
227
|
name: "Pulso",
|
|
227
|
-
typeId:
|
|
228
|
+
typeId: POKEMON_TYPE_IDS.PSYCHIC,
|
|
228
229
|
accuracy: 95,
|
|
229
230
|
maxPP: 8,
|
|
230
231
|
effects: [{ kind: "damage", basePower: 25 }]
|
|
231
232
|
},
|
|
232
233
|
{
|
|
233
|
-
id:
|
|
234
|
+
id: POKEMON_MOVE_IDS.MEDITATE,
|
|
234
235
|
name: "Meditar",
|
|
235
|
-
typeId:
|
|
236
|
+
typeId: POKEMON_TYPE_IDS.PSYCHIC,
|
|
236
237
|
accuracy: 100,
|
|
237
238
|
maxPP: 12,
|
|
238
239
|
effects: [{ kind: "heal", target: "self", amount: 50 }]
|
|
239
240
|
},
|
|
240
241
|
{
|
|
241
|
-
id:
|
|
242
|
+
id: POKEMON_MOVE_IDS.CLARITY,
|
|
242
243
|
name: "Claridad",
|
|
243
|
-
typeId:
|
|
244
|
+
typeId: POKEMON_TYPE_IDS.PSYCHIC,
|
|
244
245
|
accuracy: 100,
|
|
245
246
|
maxPP: 12,
|
|
246
247
|
effects: [
|
|
@@ -250,9 +251,9 @@ export const POKEMON_MOVES = [
|
|
|
250
251
|
},
|
|
251
252
|
// --- ROCK ---
|
|
252
253
|
{
|
|
253
|
-
id:
|
|
254
|
+
id: POKEMON_MOVE_IDS.LANDSLIDE,
|
|
254
255
|
name: "Avalancha",
|
|
255
|
-
typeId:
|
|
256
|
+
typeId: POKEMON_TYPE_IDS.ROCK,
|
|
256
257
|
accuracy: 85,
|
|
257
258
|
maxPP: 4,
|
|
258
259
|
effects: [
|
|
@@ -261,25 +262,25 @@ export const POKEMON_MOVES = [
|
|
|
261
262
|
]
|
|
262
263
|
},
|
|
263
264
|
{
|
|
264
|
-
id:
|
|
265
|
+
id: POKEMON_MOVE_IDS.THROW,
|
|
265
266
|
name: "Lanzar Rocas",
|
|
266
|
-
typeId:
|
|
267
|
+
typeId: POKEMON_TYPE_IDS.ROCK,
|
|
267
268
|
accuracy: 95,
|
|
268
269
|
maxPP: 8,
|
|
269
270
|
effects: [{ kind: "damage", basePower: 25 }]
|
|
270
271
|
},
|
|
271
272
|
{
|
|
272
|
-
id:
|
|
273
|
+
id: POKEMON_MOVE_IDS.MEND,
|
|
273
274
|
name: "Reconstruir",
|
|
274
|
-
typeId:
|
|
275
|
+
typeId: POKEMON_TYPE_IDS.ROCK,
|
|
275
276
|
accuracy: 100,
|
|
276
277
|
maxPP: 12,
|
|
277
278
|
effects: [{ kind: "heal", target: "self", amount: 50 }]
|
|
278
279
|
},
|
|
279
280
|
{
|
|
280
|
-
id:
|
|
281
|
+
id: POKEMON_MOVE_IDS.POLISH,
|
|
281
282
|
name: "Pulir",
|
|
282
|
-
typeId:
|
|
283
|
+
typeId: POKEMON_TYPE_IDS.ROCK,
|
|
283
284
|
accuracy: 100,
|
|
284
285
|
maxPP: 12,
|
|
285
286
|
effects: [
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { ItemDefinition, MoveDefinition } from "../../core/index.js";
|
|
1
|
+
import { FighterDefinition, ItemDefinition, MoveDefinition } from "../../core/index.js";
|
|
2
2
|
import { PlayerBattleConfig } from "../../engine/rules.js";
|
|
3
3
|
import type { CombatSkin, PlayerTeamLoadout } from "../CombatSkin.js";
|
|
4
4
|
export declare class PokemonSkin implements CombatSkin {
|
|
5
5
|
readonly id = "pokemon";
|
|
6
6
|
getTypes(): import("../../index.js").TypeDefinition[];
|
|
7
|
+
getFighters(): FighterDefinition[];
|
|
7
8
|
getTypeEffectiveness(): import("../../index.js").TypeEffectivenessMatrix;
|
|
8
9
|
getMoves(): MoveDefinition[];
|
|
9
10
|
getItems(): ItemDefinition[];
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// @pokemon-io/combat-core/src/skins/pokemon/randomEvents.ts
|
|
2
|
+
/**
|
|
3
|
+
* POKEMON-SPECIFIC Random Events
|
|
4
|
+
* These only appear when using the Pokemon skin
|
|
5
|
+
*/
|
|
6
|
+
export const POKEMON_RANDOM_EVENTS = [
|
|
7
|
+
// ==================== COMMON (3 events) ====================
|
|
8
|
+
{
|
|
9
|
+
id: "pokemon_center",
|
|
10
|
+
name: "🏥 Centro Pokémon Móvil",
|
|
11
|
+
description: "Una enfermera Joy aparece y cura a ambos Pokémon.",
|
|
12
|
+
narration: ["¡Suena una música familiar!", "¡La Enfermera Joy ha venido a ayudar!"],
|
|
13
|
+
rarity: "common",
|
|
14
|
+
effects: [
|
|
15
|
+
{
|
|
16
|
+
effectType: "heal_percent",
|
|
17
|
+
target: "both",
|
|
18
|
+
percentValue: 15,
|
|
19
|
+
},
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
id: "team_rocket",
|
|
24
|
+
name: "🚀 ¡Equipo Rocket!",
|
|
25
|
+
description: "¡Preparaos para los problemas! El ataque de ambos baja.",
|
|
26
|
+
narration: ["¡Prepárense para los problemas!", "¡Y más vale que teman!"],
|
|
27
|
+
rarity: "common",
|
|
28
|
+
effects: [
|
|
29
|
+
{
|
|
30
|
+
effectType: "stat_change",
|
|
31
|
+
target: "both",
|
|
32
|
+
statType: "offense",
|
|
33
|
+
statChange: -1,
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "rare_candy",
|
|
39
|
+
name: "🍬 Caramelo Raro",
|
|
40
|
+
description: "Un Pokémon aleatorio encuentra un caramelo y se fortalece.",
|
|
41
|
+
narration: ["¡Un objeto brillante aparece!", "¡Es un Caramelo Raro!"],
|
|
42
|
+
rarity: "common",
|
|
43
|
+
effects: [
|
|
44
|
+
{
|
|
45
|
+
effectType: "stat_change",
|
|
46
|
+
target: "random_one",
|
|
47
|
+
statType: "offense",
|
|
48
|
+
statChange: 1,
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
effectType: "stat_change",
|
|
52
|
+
target: "random_one",
|
|
53
|
+
statType: "defense",
|
|
54
|
+
statChange: 1,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
// ==================== RARE (4 events) ====================
|
|
59
|
+
{
|
|
60
|
+
id: "sandstorm",
|
|
61
|
+
name: "🌪️ Tormenta de Arena",
|
|
62
|
+
description: "Una tormenta de arena daña a todos los Pokémon.",
|
|
63
|
+
narration: ["¡El viento empieza a soplar con fuerza!", "¡Una tormenta de arena azota el combate!"],
|
|
64
|
+
rarity: "rare",
|
|
65
|
+
effects: [
|
|
66
|
+
{
|
|
67
|
+
effectType: "damage_percent",
|
|
68
|
+
target: "both",
|
|
69
|
+
percentValue: 8,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
id: "professor_oak",
|
|
75
|
+
name: "👴 Profesor Oak",
|
|
76
|
+
description: "¡El Profesor Oak anima a tu Pokémon!",
|
|
77
|
+
narration: ["¡Un mensaje del laboratorio!", "¡El Profesor Oak envía sus ánimos!"],
|
|
78
|
+
rarity: "rare",
|
|
79
|
+
effects: [
|
|
80
|
+
{
|
|
81
|
+
effectType: "stat_change",
|
|
82
|
+
target: "random_one",
|
|
83
|
+
statType: "offense",
|
|
84
|
+
statChange: 2,
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
effectType: "stat_change",
|
|
88
|
+
target: "random_one",
|
|
89
|
+
statType: "speed",
|
|
90
|
+
statChange: 1,
|
|
91
|
+
},
|
|
92
|
+
],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: "dawn_stone",
|
|
96
|
+
name: "💎 Piedra Alba",
|
|
97
|
+
description: "Una piedra evolutiva aumenta la defensa de un Pokémon.",
|
|
98
|
+
narration: ["¡Una extraña piedra emite luz!", "¡El poder de la Piedra Alba se manifiesta!"],
|
|
99
|
+
rarity: "rare",
|
|
100
|
+
effects: [
|
|
101
|
+
{
|
|
102
|
+
effectType: "stat_change",
|
|
103
|
+
target: "random_one",
|
|
104
|
+
statType: "defense",
|
|
105
|
+
statChange: 3,
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "potion_spray",
|
|
111
|
+
name: "💊 Lluvia de Pociones",
|
|
112
|
+
description: "Pociones caen del cielo curando a ambos Pokémon.",
|
|
113
|
+
narration: ["¡Empieza a llover... ¿medicina?!", "¡Una lluvia de pociones cubre el estadio!"],
|
|
114
|
+
rarity: "rare",
|
|
115
|
+
effects: [
|
|
116
|
+
{
|
|
117
|
+
effectType: "heal_percent",
|
|
118
|
+
target: "both",
|
|
119
|
+
percentValue: 12,
|
|
120
|
+
},
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
// ==================== EPIC (2 events) ====================
|
|
124
|
+
{
|
|
125
|
+
id: "legendary_appearance",
|
|
126
|
+
name: "✨ Aparición Legendaria",
|
|
127
|
+
description: "Un Pokémon legendario otorga poder a un luchador aleatorio.",
|
|
128
|
+
narration: ["¡UNA PRESENCIA ABRUMADORA SE SIENTE!", "¡Un Pokémon Legendario observa el combate!"],
|
|
129
|
+
rarity: "epic",
|
|
130
|
+
effects: [
|
|
131
|
+
{
|
|
132
|
+
effectType: "stat_change",
|
|
133
|
+
target: "random_one",
|
|
134
|
+
statType: "offense",
|
|
135
|
+
statChange: 3,
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
effectType: "stat_change",
|
|
139
|
+
target: "random_one",
|
|
140
|
+
statType: "defense",
|
|
141
|
+
statChange: 2,
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
effectType: "stat_change",
|
|
145
|
+
target: "random_one",
|
|
146
|
+
statType: "speed",
|
|
147
|
+
statChange: 2,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: "max_revive",
|
|
153
|
+
name: "⚡ Revivir Máximo",
|
|
154
|
+
description: "El Pokémon con menos vida recupera un 30% de HP.",
|
|
155
|
+
narration: ["¡Un cristal amarillo brilla con intensidad!", "¡El poder del Revivir Máximo restaura la energía!"],
|
|
156
|
+
rarity: "epic",
|
|
157
|
+
effects: [
|
|
158
|
+
{
|
|
159
|
+
effectType: "heal_percent",
|
|
160
|
+
target: "random_one", // TODO: Cambiar a "lowest_hp" cuando se implemente
|
|
161
|
+
percentValue: 30,
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
];
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { POKEMON_STATUS_IDS } from "./constants.js";
|
|
1
2
|
export const POKEMON_STATUSES = [
|
|
2
3
|
// --- BURN (Fuego) ---
|
|
3
4
|
// Effect: DoT + Halves Attack (Engine)
|
|
4
5
|
{
|
|
5
|
-
id:
|
|
6
|
+
id: POKEMON_STATUS_IDS.BURN,
|
|
6
7
|
name: "Quemado",
|
|
7
8
|
kind: "soft",
|
|
8
9
|
minDurationTurns: 3,
|
|
@@ -17,7 +18,7 @@ export const POKEMON_STATUSES = [
|
|
|
17
18
|
// --- PARALYSIS (Eléctrico) ---
|
|
18
19
|
// Effect: Halves Speed + 25% Chance to Skip Turn (Engine)
|
|
19
20
|
{
|
|
20
|
-
id:
|
|
21
|
+
id: POKEMON_STATUS_IDS.PARALYSIS,
|
|
21
22
|
name: "Paralizado",
|
|
22
23
|
kind: "soft",
|
|
23
24
|
minDurationTurns: 3,
|
|
@@ -29,7 +30,7 @@ export const POKEMON_STATUSES = [
|
|
|
29
30
|
// --- POISON (Planta/Toxic) ---
|
|
30
31
|
// Effect: DoT that scales each turn (Engine)
|
|
31
32
|
{
|
|
32
|
-
id:
|
|
33
|
+
id: POKEMON_STATUS_IDS.POISON,
|
|
33
34
|
name: "Envenenado",
|
|
34
35
|
kind: "soft",
|
|
35
36
|
minDurationTurns: 4,
|
|
@@ -44,7 +45,7 @@ export const POKEMON_STATUSES = [
|
|
|
44
45
|
// --- SLEEP (Psychic/Hypnosis) ---
|
|
45
46
|
// Effect: Hard CC. 30% Wake on Hit (Engine)
|
|
46
47
|
{
|
|
47
|
-
id:
|
|
48
|
+
id: POKEMON_STATUS_IDS.SLEEP,
|
|
48
49
|
name: "Dormido",
|
|
49
50
|
kind: "hard_cc",
|
|
50
51
|
minDurationTurns: 2,
|
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
import type { TypeDefinition, TypeEffectivenessMatrix, TypeId } from "../../core/index.js";
|
|
2
|
-
export declare const POKEMON_TYPE_IDS: {
|
|
3
|
-
readonly fire: "fire";
|
|
4
|
-
readonly water: "water";
|
|
5
|
-
readonly grass: "grass";
|
|
6
|
-
readonly electric: "electric";
|
|
7
|
-
readonly psychic: "psychic";
|
|
8
|
-
readonly rock: "rock";
|
|
9
|
-
};
|
|
10
|
-
export type PokemonTypeId = (typeof POKEMON_TYPE_IDS)[keyof typeof POKEMON_TYPE_IDS];
|
|
11
2
|
export declare const POKEMON_TYPES: TypeDefinition[];
|
|
12
3
|
export declare const POKEMON_TYPE_MATRIX: TypeEffectivenessMatrix;
|
|
13
4
|
export declare const getPokemonTypeEffectiveness: (attackerTypeId: TypeId, defenderTypeId: TypeId) => number;
|