pokemon-io-core 0.0.107 → 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.
@@ -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
- updatedFighter = {
123
- ...fighter,
124
- currentHp: Math.max(0, fighter.currentHp - damage),
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 heal = Math.floor(maxHp * (effect.percentValue / 100));
142
- updatedFighter = {
143
- ...fighter,
144
- currentHp: Math.min(maxHp, fighter.currentHp + heal),
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
- id: generateId(),
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
- updatedFighter = {
185
- ...fighter,
186
- statStages: {
187
- offense: 0,
188
- defense: 0,
189
- speed: 0,
190
- crit: 0,
191
- accuracy: 0,
192
- evasion: 0,
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pokemon-io-core",
3
- "version": "0.0.107",
3
+ "version": "0.0.108",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "type": "module",