pokemon-io-core 0.0.106 → 0.0.108
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/battle.d.ts
CHANGED
|
@@ -60,6 +60,15 @@ export interface BattleView {
|
|
|
60
60
|
turnStartHpByPlayerId: {
|
|
61
61
|
[playerId: string]: number;
|
|
62
62
|
};
|
|
63
|
+
turnStartStatusesByPlayerId?: Record<string, BattlePlayerStatusView[]>;
|
|
64
|
+
turnStartStatStagesByPlayerId?: Record<string, {
|
|
65
|
+
offense: number;
|
|
66
|
+
defense: number;
|
|
67
|
+
speed: number;
|
|
68
|
+
crit: number;
|
|
69
|
+
accuracy: number;
|
|
70
|
+
evasion: number;
|
|
71
|
+
}>;
|
|
63
72
|
turnNumber: number;
|
|
64
73
|
pendingActions?: {
|
|
65
74
|
player1: boolean;
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { applyStatusToFighter } from "../status/apply.js";
|
|
2
|
+
import { applyDamageToFighter } from "../combat/damage.js";
|
|
3
|
+
import { applyHealToFighter } from "../combat/heal.js";
|
|
4
|
+
import { createBaseEvent } from "../events.js";
|
|
2
5
|
// Simple ID generator (no external dependency)
|
|
3
6
|
const generateId = () => `evt_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
4
7
|
/**
|
|
@@ -119,90 +122,71 @@ const applySingleEffectToFighter = (state, playerKey, fighter, effect) => {
|
|
|
119
122
|
if (effect.percentValue) {
|
|
120
123
|
const maxHp = fighter.baseStats.offense + fighter.baseStats.defense;
|
|
121
124
|
const damage = Math.floor(maxHp * (effect.percentValue / 100));
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
events.push({
|
|
127
|
-
id: generateId(),
|
|
128
|
-
turnNumber: state.turnNumber,
|
|
129
|
-
kind: "random_event_effect",
|
|
130
|
-
eventId: "",
|
|
131
|
-
targetId: fighter.fighterId,
|
|
132
|
-
effectType: "damage",
|
|
133
|
-
message: `${fighter.fighterId} recibió ${damage} de daño del evento`,
|
|
134
|
-
timestamp: Date.now(),
|
|
135
|
-
});
|
|
125
|
+
const res = applyDamageToFighter(state, updatedFighter, damage, "random_event", // attackerId for log
|
|
126
|
+
false);
|
|
127
|
+
updatedFighter = res.updatedDefender;
|
|
128
|
+
events.push(...res.events);
|
|
136
129
|
}
|
|
137
130
|
break;
|
|
138
131
|
case "heal_percent":
|
|
139
132
|
if (effect.percentValue) {
|
|
140
133
|
const maxHp = fighter.baseStats.offense + fighter.baseStats.defense;
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
};
|
|
146
|
-
events.push({
|
|
147
|
-
id: generateId(),
|
|
148
|
-
turnNumber: state.turnNumber,
|
|
149
|
-
kind: "random_event_effect",
|
|
150
|
-
eventId: "",
|
|
151
|
-
targetId: fighter.fighterId,
|
|
152
|
-
effectType: "heal",
|
|
153
|
-
message: `${fighter.fighterId} recuperó ${heal} HP`,
|
|
154
|
-
timestamp: Date.now(),
|
|
155
|
-
});
|
|
134
|
+
const healAmount = Math.floor(maxHp * (effect.percentValue / 100));
|
|
135
|
+
const res = applyHealToFighter(state, updatedFighter, healAmount, "random_event");
|
|
136
|
+
updatedFighter = res.updated;
|
|
137
|
+
events.push(...res.events);
|
|
156
138
|
}
|
|
157
139
|
break;
|
|
158
140
|
case "stat_change":
|
|
159
141
|
if (effect.statType && effect.statChange !== undefined) {
|
|
160
142
|
const currentStage = fighter.statStages[effect.statType];
|
|
161
143
|
const newStage = Math.max(-6, Math.min(6, currentStage + effect.statChange));
|
|
162
|
-
updatedFighter = {
|
|
163
|
-
...fighter,
|
|
164
|
-
statStages: {
|
|
165
|
-
...fighter.statStages,
|
|
166
|
-
[effect.statType]: newStage,
|
|
167
|
-
},
|
|
168
|
-
};
|
|
169
144
|
const change = newStage - currentStage;
|
|
170
145
|
if (change !== 0) {
|
|
146
|
+
updatedFighter = {
|
|
147
|
+
...fighter,
|
|
148
|
+
statStages: {
|
|
149
|
+
...fighter.statStages,
|
|
150
|
+
[effect.statType]: newStage,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
171
153
|
events.push({
|
|
172
|
-
|
|
173
|
-
turnNumber: state.turnNumber,
|
|
174
|
-
kind: "stats_changed",
|
|
154
|
+
...createBaseEvent(state.turnNumber, "stats_changed", `${fighter.fighterId} ${change > 0 ? "aumentó" : "redujo"} ${effect.statType}`),
|
|
175
155
|
targetId: fighter.fighterId,
|
|
176
|
-
changes: { [effect.statType]: change }
|
|
177
|
-
message: `${fighter.fighterId} ${change > 0 ? "aumentó" : "redujo"} ${effect.statType} en ${Math.abs(change)}`,
|
|
178
|
-
timestamp: Date.now(),
|
|
156
|
+
changes: { [effect.statType]: change }
|
|
179
157
|
});
|
|
180
158
|
}
|
|
181
159
|
}
|
|
182
160
|
break;
|
|
183
|
-
case "reset_stats":
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
events.push({
|
|
196
|
-
id: generateId(),
|
|
197
|
-
turnNumber: state.turnNumber,
|
|
198
|
-
kind: "random_event_effect",
|
|
199
|
-
eventId: "",
|
|
200
|
-
targetId: fighter.fighterId,
|
|
201
|
-
effectType: "reset_stats",
|
|
202
|
-
message: `${fighter.fighterId} tuvo sus stats reseteadas`,
|
|
203
|
-
timestamp: Date.now(),
|
|
161
|
+
case "reset_stats": {
|
|
162
|
+
const changes = {};
|
|
163
|
+
const newStages = { ...fighter.statStages };
|
|
164
|
+
let hasChange = false;
|
|
165
|
+
// Reset all to 0 and record diff
|
|
166
|
+
Object.keys(newStages).forEach(stat => {
|
|
167
|
+
const currentVal = newStages[stat];
|
|
168
|
+
if (currentVal !== 0) {
|
|
169
|
+
changes[stat] = -currentVal; // Apply inverse to reach 0
|
|
170
|
+
newStages[stat] = 0;
|
|
171
|
+
hasChange = true;
|
|
172
|
+
}
|
|
204
173
|
});
|
|
174
|
+
if (hasChange) {
|
|
175
|
+
updatedFighter = {
|
|
176
|
+
...fighter,
|
|
177
|
+
statStages: newStages
|
|
178
|
+
};
|
|
179
|
+
// Emit Granular Events for animation
|
|
180
|
+
Object.entries(changes).forEach(([stat, diff]) => {
|
|
181
|
+
events.push({
|
|
182
|
+
...createBaseEvent(state.turnNumber, "stats_changed", `Stats reseteados: ${stat}`),
|
|
183
|
+
targetId: fighter.fighterId,
|
|
184
|
+
changes: { [stat]: diff }
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
}
|
|
205
188
|
break;
|
|
189
|
+
}
|
|
206
190
|
case "apply_status":
|
|
207
191
|
if (effect.statusId) {
|
|
208
192
|
// Cast state to RuntimeBattleState as required by status system
|