pokemon-io-core 0.0.60 → 0.0.63
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/api/room.d.ts +2 -0
- package/dist/api/socketTypes.d.ts +5 -0
- package/dist/skins/cliches/clicheSkin.d.ts +13 -0
- package/dist/skins/cliches/clicheSkin.js +92 -0
- package/dist/skins/cliches/fighters.d.ts +2 -0
- package/dist/skins/cliches/fighters.js +174 -0
- package/dist/skins/cliches/index.d.ts +5 -0
- package/dist/skins/cliches/index.js +5 -0
- package/dist/skins/cliches/items.d.ts +2 -0
- package/dist/skins/cliches/items.js +143 -0
- package/dist/skins/cliches/moves.d.ts +2 -0
- package/dist/skins/cliches/moves.js +422 -0
- package/dist/skins/cliches/statuses.d.ts +2 -0
- package/dist/skins/cliches/statuses.js +81 -0
- package/dist/skins/cliches/types.d.ts +13 -0
- package/dist/skins/cliches/types.js +98 -0
- package/dist/skins/index.d.ts +1 -0
- package/dist/skins/index.js +1 -0
- package/dist/skins/pokemon/data/pokemon-moves.json +609 -0
- package/dist/skins/pokemon/moves.js +601 -451
- package/package.json +1 -1
package/dist/api/room.d.ts
CHANGED
|
@@ -21,6 +21,11 @@ export interface ClientToServerEvents {
|
|
|
21
21
|
"room:startBattleRequest": (payload: {
|
|
22
22
|
roomId: string;
|
|
23
23
|
}) => void;
|
|
24
|
+
"room:setConfig": (payload: {
|
|
25
|
+
roomId: string;
|
|
26
|
+
skinId: string;
|
|
27
|
+
stageId: string;
|
|
28
|
+
}) => void;
|
|
24
29
|
"battle:useMove": (payload: {
|
|
25
30
|
roomId: string;
|
|
26
31
|
moveIndex: number;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ItemDefinition, MoveDefinition, PlayerBattleConfig } from "../../core";
|
|
2
|
+
import type { CombatSkin, FighterLoadout } from "../CombatSkin";
|
|
3
|
+
export declare class TribeSkin implements CombatSkin {
|
|
4
|
+
readonly id = "tribe";
|
|
5
|
+
getTypes(): import("../..").TypeDefinition[];
|
|
6
|
+
getTypeEffectiveness(): import("../..").TypeEffectivenessMatrix;
|
|
7
|
+
getMoves(): MoveDefinition[];
|
|
8
|
+
getItems(): ItemDefinition[];
|
|
9
|
+
getAmulets(): never[];
|
|
10
|
+
getStatuses(): import("../..").StatusDefinition[];
|
|
11
|
+
buildPlayerConfig(loadout: FighterLoadout): PlayerBattleConfig;
|
|
12
|
+
}
|
|
13
|
+
export declare const createTribeSkin: () => CombatSkin;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// pokemon-io-core/src/skins/pokemon/pokemonSkin.ts
|
|
2
|
+
import { POKEMON_ITEMS } from "../pokemon";
|
|
3
|
+
import { TRIBE_FIGHTERS, TRIBE_MOVES, TRIBE_STATUSES, TRIBE_TYPES, TRIBE_TYPE_MATRIX, } from "./index";
|
|
4
|
+
// --- helpers ---
|
|
5
|
+
const findPokemonById = (id) => {
|
|
6
|
+
const lower = id.toLowerCase();
|
|
7
|
+
return TRIBE_FIGHTERS.find((f) => f.id.toLowerCase() === lower) ?? null;
|
|
8
|
+
};
|
|
9
|
+
const findMoveById = (id) => {
|
|
10
|
+
return TRIBE_MOVES.find((m) => m.id === id) ?? null;
|
|
11
|
+
};
|
|
12
|
+
const findItemById = (id) => {
|
|
13
|
+
return POKEMON_ITEMS.find((i) => i.id === id) ?? null;
|
|
14
|
+
};
|
|
15
|
+
const FILLER_MOVE_ID = "tackle";
|
|
16
|
+
const buildMovesFromLoadout = (fighter, loadout) => {
|
|
17
|
+
const selectedMoveIds = loadout.moveIds ?? [];
|
|
18
|
+
const selectedMoves = selectedMoveIds
|
|
19
|
+
.map((id) => findMoveById(id))
|
|
20
|
+
.filter((m) => m !== null);
|
|
21
|
+
if (selectedMoves.length >= 4) {
|
|
22
|
+
return selectedMoves.slice(0, 4);
|
|
23
|
+
}
|
|
24
|
+
const result = [...selectedMoves];
|
|
25
|
+
const recommendedIds = fighter.recommendedMoves ?? [];
|
|
26
|
+
for (const recId of recommendedIds) {
|
|
27
|
+
if (result.length >= 4)
|
|
28
|
+
break;
|
|
29
|
+
const move = findMoveById(recId);
|
|
30
|
+
if (move && !result.some((m) => m.id === move.id)) {
|
|
31
|
+
result.push(move);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const filler = findMoveById(FILLER_MOVE_ID);
|
|
35
|
+
while (result.length < 4 && filler) {
|
|
36
|
+
result.push(filler);
|
|
37
|
+
}
|
|
38
|
+
if (result.length === 0 && filler) {
|
|
39
|
+
result.push(filler);
|
|
40
|
+
}
|
|
41
|
+
return result.slice(0, 4);
|
|
42
|
+
};
|
|
43
|
+
const buildItemsFromLoadout = (loadout) => {
|
|
44
|
+
const selectedItemIds = loadout.itemIds ?? [];
|
|
45
|
+
const selectedItems = selectedItemIds
|
|
46
|
+
.map((id) => findItemById(id))
|
|
47
|
+
.filter((i) => i !== null);
|
|
48
|
+
return selectedItems;
|
|
49
|
+
};
|
|
50
|
+
export class TribeSkin {
|
|
51
|
+
id = "tribe";
|
|
52
|
+
getTypes() {
|
|
53
|
+
return TRIBE_TYPES;
|
|
54
|
+
}
|
|
55
|
+
getTypeEffectiveness() {
|
|
56
|
+
return TRIBE_TYPE_MATRIX;
|
|
57
|
+
}
|
|
58
|
+
getMoves() {
|
|
59
|
+
return TRIBE_MOVES;
|
|
60
|
+
}
|
|
61
|
+
getItems() {
|
|
62
|
+
return POKEMON_ITEMS;
|
|
63
|
+
}
|
|
64
|
+
getAmulets() {
|
|
65
|
+
return []; // más adelante
|
|
66
|
+
}
|
|
67
|
+
getStatuses() {
|
|
68
|
+
return TRIBE_STATUSES; // más adelante
|
|
69
|
+
}
|
|
70
|
+
buildPlayerConfig(loadout) {
|
|
71
|
+
if (!loadout.fighterId) {
|
|
72
|
+
throw new Error("fighterId is required in FighterLoadout");
|
|
73
|
+
}
|
|
74
|
+
console.log("buildPlayerConfig", loadout.fighterId);
|
|
75
|
+
const fighter = findPokemonById(loadout.fighterId);
|
|
76
|
+
if (!fighter) {
|
|
77
|
+
throw new Error(`Unknown fighterId for Pokemon skin: ${loadout.fighterId}`);
|
|
78
|
+
}
|
|
79
|
+
const moves = buildMovesFromLoadout(fighter, loadout);
|
|
80
|
+
const items = buildItemsFromLoadout(loadout);
|
|
81
|
+
return {
|
|
82
|
+
fighter,
|
|
83
|
+
maxHp: fighter.baseStats.defense + fighter.baseStats.offense,
|
|
84
|
+
moves,
|
|
85
|
+
items,
|
|
86
|
+
amulet: null,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export const createTribeSkin = () => {
|
|
91
|
+
return new TribeSkin();
|
|
92
|
+
};
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { TRIBE_TYPE_IDS } from "./types";
|
|
2
|
+
const makeStats = (offense, defense, speed, crit) => ({
|
|
3
|
+
offense,
|
|
4
|
+
defense,
|
|
5
|
+
speed,
|
|
6
|
+
crit,
|
|
7
|
+
});
|
|
8
|
+
export const TRIBE_FIGHTERS = [
|
|
9
|
+
// --- TIER 1: AZUL (Suma Atk + Def < 100) ---
|
|
10
|
+
{
|
|
11
|
+
id: "becario_nft", // (Era Pikachu)
|
|
12
|
+
name: "Becario NFT",
|
|
13
|
+
description: "Cree que se hará rico mañana. Rápido hablando, frágil si le preguntas qué hace.",
|
|
14
|
+
img: "becario_nft", // Asume que tienes esta imagen o mapeala
|
|
15
|
+
classId: TRIBE_TYPE_IDS.cryptobro,
|
|
16
|
+
baseStats: makeStats(55, 35, 90, 15),
|
|
17
|
+
recommendedMoves: ["venta_humo", "spam_whatsapp"],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: "rrpp_discoteca", // (Era Cyndaquil)
|
|
21
|
+
name: "RRPP de Discoteca",
|
|
22
|
+
description: "Te promete entrada gratis hasta la 1:00. Ofensivo pero se quema rápido.",
|
|
23
|
+
img: "rrpp_discoteca",
|
|
24
|
+
classId: TRIBE_TYPE_IDS.canallita,
|
|
25
|
+
baseStats: makeStats(52, 38, 75, 10),
|
|
26
|
+
recommendedMoves: ["tortazo_cara", "colilla"],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "junior_esade", // (Era Squirtle)
|
|
30
|
+
name: "Junior de ESADE",
|
|
31
|
+
description: "Lleva chaleco incluso en verano. Resiste bien gracias al dinero de papá.",
|
|
32
|
+
img: "junior_esade",
|
|
33
|
+
classId: TRIBE_TYPE_IDS.cayetano,
|
|
34
|
+
baseStats: makeStats(40, 58, 45, 5),
|
|
35
|
+
recommendedMoves: ["golpe_remo", "cafe_hirviendo"],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
id: "malabarista_semaforo", // (Era Chikorita)
|
|
39
|
+
name: "Malabarista de Semáforo",
|
|
40
|
+
description: "Aguanta mucho tiempo en el mismo sitio. Soporte natural del ecosistema urbano.",
|
|
41
|
+
img: "malabarista",
|
|
42
|
+
classId: TRIBE_TYPE_IDS.perroflauta,
|
|
43
|
+
baseStats: makeStats(35, 60, 40, 5),
|
|
44
|
+
recommendedMoves: ["malabares", "pedir_un_euro"],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
id: "borracho_filosofo", // (Era Psyduck)
|
|
48
|
+
name: "Borracho Filósofo",
|
|
49
|
+
description: "Le duele la cabeza pero te suelta verdades incómodas a gritos.",
|
|
50
|
+
img: "borracho",
|
|
51
|
+
classId: TRIBE_TYPE_IDS.cunado,
|
|
52
|
+
baseStats: makeStats(50, 40, 60, 12),
|
|
53
|
+
recommendedMoves: ["yo_se_mas"],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
id: "novato_gym", // (Era Geodude)
|
|
57
|
+
name: "Novato del Gym",
|
|
58
|
+
description: "Muy duro de cabeza, pero lento haciendo los ejercicios.",
|
|
59
|
+
img: "novato_gym",
|
|
60
|
+
classId: TRIBE_TYPE_IDS.gymbro,
|
|
61
|
+
baseStats: makeStats(40, 58, 20, 5),
|
|
62
|
+
recommendedMoves: ["flexion", "disco_movil"],
|
|
63
|
+
},
|
|
64
|
+
// --- TIER 2: AMBER (Suma Atk + Def >= 100 y < 120) ---
|
|
65
|
+
{
|
|
66
|
+
id: "trader_agresivo", // (Era Electabuzz)
|
|
67
|
+
name: "Trader Agresivo",
|
|
68
|
+
description: "Vende cursos online. Balanceado y con gran capacidad de estafa.",
|
|
69
|
+
img: "trader",
|
|
70
|
+
classId: TRIBE_TYPE_IDS.cryptobro,
|
|
71
|
+
baseStats: makeStats(65, 45, 95, 10),
|
|
72
|
+
recommendedMoves: ["venta_humo", "spam_whatsapp"],
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "rey_del_reservado", // (Era Magmortar)
|
|
76
|
+
name: "Rey del Reservado",
|
|
77
|
+
description: "Pide botellas con bengalas. Daño masivo a la tarjeta de crédito.",
|
|
78
|
+
img: "reservado",
|
|
79
|
+
classId: TRIBE_TYPE_IDS.canallita,
|
|
80
|
+
baseStats: makeStats(70, 45, 60, 8),
|
|
81
|
+
recommendedMoves: ["tortazo_cara", "colilla"],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: "heredero_empresa", // (Era Blastoise)
|
|
85
|
+
name: "Heredero de la Empresa",
|
|
86
|
+
description: "Tanque con náuticos blindados. Una muralla de abogados.",
|
|
87
|
+
img: "heredero",
|
|
88
|
+
classId: TRIBE_TYPE_IDS.cayetano,
|
|
89
|
+
baseStats: makeStats(50, 65, 55, 5),
|
|
90
|
+
recommendedMoves: ["golpe_remo", "cafe_hirviendo"],
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: "activista_twitter", // (Era Sceptile)
|
|
94
|
+
name: "Activista de Twitter",
|
|
95
|
+
description: "Depredador de las redes, ataca letalmente desde el anonimato.",
|
|
96
|
+
img: "activista",
|
|
97
|
+
classId: TRIBE_TYPE_IDS.perroflauta,
|
|
98
|
+
baseStats: makeStats(68, 40, 100, 12),
|
|
99
|
+
recommendedMoves: ["malabares", "pedir_un_euro"],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "todologo_de_bar", // (Era Alakazam)
|
|
103
|
+
name: "Todólogo de Bar",
|
|
104
|
+
description: "IQ de 5000 (según él). Poder mental puro, cero defensa ante hechos reales.",
|
|
105
|
+
img: "todologo",
|
|
106
|
+
classId: TRIBE_TYPE_IDS.cunado,
|
|
107
|
+
baseStats: makeStats(75, 30, 95, 8),
|
|
108
|
+
recommendedMoves: ["codazo", "yo_se_mas"],
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
id: "portero_discoteca", // (Era Onix)
|
|
112
|
+
name: "Portero de Discoteca",
|
|
113
|
+
description: "No pasas con esas zapatillas. Defensa física impenetrable.",
|
|
114
|
+
img: "portero",
|
|
115
|
+
classId: TRIBE_TYPE_IDS.gymbro,
|
|
116
|
+
baseStats: makeStats(35, 80, 30, 5),
|
|
117
|
+
recommendedMoves: ["flexion", "derrumbe"],
|
|
118
|
+
},
|
|
119
|
+
// --- TIER 3: RED (Suma Atk + Def >= 120) ---
|
|
120
|
+
{
|
|
121
|
+
id: "elon_musk_hacendado", // (Era Zapdos)
|
|
122
|
+
name: "Elon Musk de Hacendado",
|
|
123
|
+
description: "Leyenda del emprendimiento. Domina LinkedIn con poder bruto.",
|
|
124
|
+
img: "elon_hacendado",
|
|
125
|
+
classId: TRIBE_TYPE_IDS.cryptobro,
|
|
126
|
+
baseStats: makeStats(70, 55, 85, 10),
|
|
127
|
+
recommendedMoves: ["rug_pull", "tuit_elon"],
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "dueño_del_garito", // (Era Charizard)
|
|
131
|
+
name: "Dueño del Garito",
|
|
132
|
+
description: "Leyenda de la noche madrileña. Arrasa con todo a su paso.",
|
|
133
|
+
img: "dueno_garito",
|
|
134
|
+
classId: TRIBE_TYPE_IDS.canallita,
|
|
135
|
+
baseStats: makeStats(75, 50, 85, 10),
|
|
136
|
+
recommendedMoves: ["tortazo_cara", "cubatazo"],
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
id: "amancio", // (Era Kyogre)
|
|
140
|
+
name: "Don Amancio",
|
|
141
|
+
description: "Leviatán del textil capaz de comprar el país entero.",
|
|
142
|
+
img: "amancio",
|
|
143
|
+
classId: TRIBE_TYPE_IDS.cayetano,
|
|
144
|
+
baseStats: makeStats(75, 65, 60, 8),
|
|
145
|
+
recommendedMoves: ["golpe_remo", "yate_papa"],
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: "lider_comuna", // (Era Venusaur)
|
|
149
|
+
name: "Líder de la Comuna",
|
|
150
|
+
description: "Coloso del huerto urbano. Combina toxicidad pasiva y fuerza bruta.",
|
|
151
|
+
img: "lider_comuna",
|
|
152
|
+
classId: TRIBE_TYPE_IDS.perroflauta,
|
|
153
|
+
baseStats: makeStats(62, 63, 60, 6),
|
|
154
|
+
recommendedMoves: ["malabares", "huelga_general"],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: "teorico_conspiracion", // (Era Mew)
|
|
158
|
+
name: "Teórico de la Conspiración",
|
|
159
|
+
description: "El ancestro de todos los foros. Versátil y místico.",
|
|
160
|
+
img: "conspiranoico",
|
|
161
|
+
classId: TRIBE_TYPE_IDS.cunado,
|
|
162
|
+
baseStats: makeStats(65, 65, 80, 10),
|
|
163
|
+
recommendedMoves: ["codazo", "dato_inventado"],
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
id: "jefe_desokupa", // (Era Groudon)
|
|
167
|
+
name: "Jefe de Desokupa",
|
|
168
|
+
description: "Creador de polémicas, poder físico devastador.",
|
|
169
|
+
img: "desokupa",
|
|
170
|
+
classId: TRIBE_TYPE_IDS.gymbro,
|
|
171
|
+
baseStats: makeStats(80, 70, 50, 6),
|
|
172
|
+
recommendedMoves: ["flexion", "derrumbe"],
|
|
173
|
+
},
|
|
174
|
+
];
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export const POKEMON_ITEMS = [
|
|
2
|
+
{
|
|
3
|
+
id: "super_potion",
|
|
4
|
+
name: "Super Poción",
|
|
5
|
+
category: "heal_shield",
|
|
6
|
+
target: "self",
|
|
7
|
+
maxUses: 1,
|
|
8
|
+
effects: [{ kind: "heal", amount: 50 }],
|
|
9
|
+
image: "hiper-potion",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: "potion",
|
|
13
|
+
name: "Poción",
|
|
14
|
+
category: "heal_shield",
|
|
15
|
+
target: "self",
|
|
16
|
+
maxUses: 2,
|
|
17
|
+
effects: [{ kind: "heal", amount: 25 }],
|
|
18
|
+
image: "potion",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "apple",
|
|
22
|
+
name: "Manzana",
|
|
23
|
+
category: "heal_shield",
|
|
24
|
+
target: "self",
|
|
25
|
+
maxUses: 3,
|
|
26
|
+
effects: [{ kind: "heal", amount: 17 }],
|
|
27
|
+
image: "fancy-apple",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "mushroom",
|
|
31
|
+
name: "Seta",
|
|
32
|
+
category: "heal_shield",
|
|
33
|
+
target: "self",
|
|
34
|
+
maxUses: 4,
|
|
35
|
+
effects: [{ kind: "heal", amount: 14 }],
|
|
36
|
+
image: "mushroom",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: "shotgun",
|
|
40
|
+
name: "Escopeta",
|
|
41
|
+
target: "enemy",
|
|
42
|
+
category: "damage",
|
|
43
|
+
maxUses: 2,
|
|
44
|
+
effects: [
|
|
45
|
+
{ kind: "damage", flatAmount: 15 },
|
|
46
|
+
{ kind: "apply_status", statusId: "burn" },
|
|
47
|
+
],
|
|
48
|
+
image: "shotgun",
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "pistol",
|
|
52
|
+
name: "Pistola",
|
|
53
|
+
category: "damage",
|
|
54
|
+
target: "enemy",
|
|
55
|
+
maxUses: 4,
|
|
56
|
+
effects: [
|
|
57
|
+
{ kind: "damage", flatAmount: 8 },
|
|
58
|
+
{ kind: "apply_status", statusId: "burn" },
|
|
59
|
+
],
|
|
60
|
+
image: "pistol",
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "riffle",
|
|
64
|
+
name: "Rifle",
|
|
65
|
+
target: "enemy",
|
|
66
|
+
category: "damage",
|
|
67
|
+
maxUses: 3,
|
|
68
|
+
effects: [
|
|
69
|
+
{ kind: "damage", flatAmount: 10 },
|
|
70
|
+
{ kind: "apply_status", statusId: "burn" },
|
|
71
|
+
],
|
|
72
|
+
image: "riffle",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "sniper",
|
|
76
|
+
name: "Sniper",
|
|
77
|
+
target: "enemy",
|
|
78
|
+
category: "damage",
|
|
79
|
+
maxUses: 1,
|
|
80
|
+
effects: [
|
|
81
|
+
{ kind: "damage", flatAmount: 30 },
|
|
82
|
+
{ kind: "apply_status", statusId: "burn" },
|
|
83
|
+
],
|
|
84
|
+
image: "sniper",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "blue-berry",
|
|
88
|
+
name: "Baya azul",
|
|
89
|
+
category: "status_buff",
|
|
90
|
+
maxUses: 1,
|
|
91
|
+
target: "self",
|
|
92
|
+
effects: [
|
|
93
|
+
{
|
|
94
|
+
kind: "clear_status",
|
|
95
|
+
statusIds: ["burn"], // cura QUEMADURA
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
image: "blue-berry",
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "pink-berry",
|
|
102
|
+
name: "Baya rosa",
|
|
103
|
+
category: "status_buff",
|
|
104
|
+
maxUses: 1,
|
|
105
|
+
target: "self",
|
|
106
|
+
effects: [
|
|
107
|
+
{
|
|
108
|
+
kind: "clear_status",
|
|
109
|
+
statusIds: ["poison"], // cura VENENO
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
image: "pink-berry",
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
id: "yellow-berry",
|
|
116
|
+
name: "Baya amarilla",
|
|
117
|
+
category: "status_buff",
|
|
118
|
+
maxUses: 1,
|
|
119
|
+
target: "self",
|
|
120
|
+
effects: [
|
|
121
|
+
{
|
|
122
|
+
kind: "clear_status",
|
|
123
|
+
statusIds: ["paralysis"], // cura PARÁLISIS
|
|
124
|
+
},
|
|
125
|
+
],
|
|
126
|
+
image: "yellow-berry",
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
id: "green-berry",
|
|
130
|
+
name: "Baya verde",
|
|
131
|
+
category: "status_buff",
|
|
132
|
+
maxUses: 1,
|
|
133
|
+
target: "self",
|
|
134
|
+
effects: [
|
|
135
|
+
{
|
|
136
|
+
kind: "clear_status",
|
|
137
|
+
statusIds: ["burn", "poison"], // por ejemplo: limpia quemadura o veneno
|
|
138
|
+
kinds: ["soft"], // redundante pero semántico
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
image: "green-berry",
|
|
142
|
+
},
|
|
143
|
+
];
|