pokemon-io-core 0.0.83 → 0.0.84

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 (75) hide show
  1. package/dist/core/battleState.d.ts +1 -1
  2. package/dist/core/index.d.ts +0 -1
  3. package/dist/core/index.js +0 -1
  4. package/dist/engine/actions/forcedSwitch.d.ts +5 -0
  5. package/dist/engine/actions/forcedSwitch.js +44 -0
  6. package/dist/engine/actions/index.d.ts +5 -0
  7. package/dist/engine/actions/index.js +5 -0
  8. package/dist/engine/actions/item.d.ts +6 -0
  9. package/dist/engine/actions/item.js +61 -0
  10. package/dist/engine/actions/move.d.ts +6 -0
  11. package/dist/engine/actions/move.js +120 -0
  12. package/dist/engine/actions/priority.d.ts +6 -0
  13. package/dist/engine/actions/priority.js +30 -0
  14. package/dist/engine/actions/switch.d.ts +6 -0
  15. package/dist/engine/actions/switch.js +55 -0
  16. package/dist/engine/combat/crit.d.ts +2 -0
  17. package/dist/engine/combat/crit.js +4 -0
  18. package/dist/engine/combat/damage.d.ts +20 -0
  19. package/dist/engine/combat/damage.js +66 -0
  20. package/dist/engine/combat/heal.d.ts +6 -0
  21. package/dist/engine/combat/heal.js +25 -0
  22. package/dist/engine/combat/index.d.ts +5 -0
  23. package/dist/engine/combat/index.js +5 -0
  24. package/dist/engine/combat/typeEffectiveness.d.ts +3 -0
  25. package/dist/engine/combat/typeEffectiveness.js +7 -0
  26. package/dist/engine/combat/winner.d.ts +2 -0
  27. package/dist/engine/combat/winner.js +11 -0
  28. package/dist/engine/debug.d.ts +1 -0
  29. package/dist/engine/debug.js +6 -0
  30. package/dist/engine/effects/applyEffects.d.ts +7 -0
  31. package/dist/engine/effects/applyEffects.js +103 -0
  32. package/dist/engine/effects/index.d.ts +2 -0
  33. package/dist/engine/effects/index.js +2 -0
  34. package/dist/engine/effects/target.d.ts +6 -0
  35. package/dist/engine/effects/target.js +26 -0
  36. package/dist/engine/engine.d.ts +53 -0
  37. package/dist/engine/engine.js +1046 -0
  38. package/dist/engine/events.d.ts +4 -0
  39. package/dist/engine/events.js +12 -0
  40. package/dist/engine/fighters/fighter.d.ts +4 -0
  41. package/dist/engine/fighters/fighter.js +53 -0
  42. package/dist/engine/fighters/index.d.ts +3 -0
  43. package/dist/engine/fighters/index.js +3 -0
  44. package/dist/engine/fighters/selectors.d.ts +13 -0
  45. package/dist/engine/fighters/selectors.js +19 -0
  46. package/dist/engine/fighters/update.d.ts +3 -0
  47. package/dist/engine/fighters/update.js +30 -0
  48. package/dist/engine/index.d.ts +11 -1
  49. package/dist/engine/index.js +11 -1
  50. package/dist/engine/rng.d.ts +2 -0
  51. package/dist/engine/rng.js +8 -0
  52. package/dist/engine/rules.d.ts +44 -0
  53. package/dist/engine/rules.js +10 -0
  54. package/dist/engine/runtime.d.ts +7 -0
  55. package/dist/engine/runtime.js +49 -0
  56. package/dist/engine/status/apply.d.ts +6 -0
  57. package/dist/engine/status/apply.js +49 -0
  58. package/dist/engine/status/clear.d.ts +6 -0
  59. package/dist/engine/status/clear.js +47 -0
  60. package/dist/engine/status/endOfTurn.d.ts +6 -0
  61. package/dist/engine/status/endOfTurn.js +80 -0
  62. package/dist/engine/status/hardCc.d.ts +3 -0
  63. package/dist/engine/status/hardCc.js +4 -0
  64. package/dist/engine/status/index.d.ts +4 -0
  65. package/dist/engine/status/index.js +4 -0
  66. package/dist/engine/turn/index.d.ts +1 -0
  67. package/dist/engine/turn/index.js +1 -0
  68. package/dist/engine/turn/resolveTurn.d.ts +5 -0
  69. package/dist/engine/turn/resolveTurn.js +139 -0
  70. package/dist/index.d.ts +1 -0
  71. package/dist/index.js +1 -0
  72. package/dist/skins/CombatSkin.d.ts +1 -1
  73. package/dist/skins/cliches/clicheSkin.d.ts +2 -1
  74. package/dist/skins/pokemon/pokemonSkin.d.ts +2 -1
  75. package/package.json +1 -1
@@ -0,0 +1,139 @@
1
+ // ------------------------------------------------------
2
+ // Bucle principal de turno
3
+ import { resolveItemUse } from "../actions/item";
4
+ import { resolveDamageMove } from "../actions/move";
5
+ import { getMovePriorityAndSpeed } from "../actions/priority";
6
+ import { resolveSwitchFighter } from "../actions/switch";
7
+ import { checkWinner } from "../combat/winner";
8
+ import { dbg } from "../debug";
9
+ import { createBaseEvent } from "../events";
10
+ import { recomputeEffectiveStatsForFighter } from "../fighters/fighter";
11
+ import { getOpponentAndSelf } from "../fighters/selectors";
12
+ import { applyEndOfTurnStatuses } from "../status/endOfTurn";
13
+ import { hasHardCc } from "../status/hardCc";
14
+ // ------------------------------------------------------
15
+ export const resolveTurn = (state, actions) => {
16
+ const runtimeState = state;
17
+ let currentState = runtimeState;
18
+ const recalcForPlayer = (player) => {
19
+ const team = player.fighterTeam.map((f) => recomputeEffectiveStatsForFighter(runtimeState, f));
20
+ return { ...player, fighterTeam: team };
21
+ };
22
+ currentState = {
23
+ ...currentState,
24
+ player1: recalcForPlayer(currentState.player1),
25
+ player2: recalcForPlayer(currentState.player2),
26
+ };
27
+ const events = [];
28
+ dbg(`TURN ${runtimeState.turnNumber} start`, {
29
+ p1Action: actions.player1.kind,
30
+ p2Action: actions.player2.kind,
31
+ });
32
+ events.push({
33
+ ...createBaseEvent(runtimeState.turnNumber, "turn_start", `Comienza el turno ${runtimeState.turnNumber}`),
34
+ });
35
+ const entries = [
36
+ {
37
+ playerKey: "player1",
38
+ action: actions.player1,
39
+ ...getMovePriorityAndSpeed(runtimeState, "player1", actions.player1),
40
+ },
41
+ {
42
+ playerKey: "player2",
43
+ action: actions.player2,
44
+ ...getMovePriorityAndSpeed(runtimeState, "player2", actions.player2),
45
+ },
46
+ ];
47
+ entries.sort((a, b) => {
48
+ if (b.priority !== a.priority) {
49
+ return b.priority - a.priority;
50
+ }
51
+ if (b.speed !== a.speed) {
52
+ return b.speed - a.speed;
53
+ }
54
+ // empate total → coin flip
55
+ return Math.random() < 0.5 ? -1 : 1;
56
+ });
57
+ dbg(`TURN ${runtimeState.turnNumber} order`, entries.map((e) => ({
58
+ player: e.playerKey,
59
+ action: e.action.kind,
60
+ priority: e.priority,
61
+ speed: e.speed,
62
+ })));
63
+ for (const entry of entries) {
64
+ const { playerKey, action } = entry;
65
+ if (action.kind === "no_action")
66
+ continue;
67
+ const { self } = getOpponentAndSelf(currentState, playerKey);
68
+ if (!self.isAlive || self.currentHp <= 0)
69
+ continue;
70
+ if (hasHardCc(currentState, self)) {
71
+ events.push({
72
+ ...createBaseEvent(currentState.turnNumber, "action_skipped_hard_cc", `${self.fighterId} no puede actuar por control total`),
73
+ actorId: self.fighterId,
74
+ });
75
+ continue;
76
+ }
77
+ if (action.kind === "switch_fighter") {
78
+ const result = resolveSwitchFighter(currentState, playerKey, action);
79
+ currentState = result.state;
80
+ events.push(...result.events);
81
+ }
82
+ if (action.kind === "use_move") {
83
+ const result = resolveDamageMove(currentState, playerKey, action);
84
+ currentState = result.state;
85
+ events.push(...result.events);
86
+ }
87
+ if (action.kind === "use_item") {
88
+ const result = resolveItemUse(currentState, playerKey, action);
89
+ currentState = result.state;
90
+ events.push(...result.events);
91
+ }
92
+ else {
93
+ // switch_fighter u otros no implementados aún
94
+ continue;
95
+ }
96
+ if (currentState.forcedSwitch) {
97
+ return {
98
+ newState: currentState,
99
+ events,
100
+ };
101
+ }
102
+ const winnerAfterAction = checkWinner(currentState);
103
+ if (winnerAfterAction !== "none") {
104
+ events.push({
105
+ ...createBaseEvent(currentState.turnNumber, "battle_end", `La batalla termina: ${winnerAfterAction}`),
106
+ winner: winnerAfterAction,
107
+ });
108
+ const finalState = {
109
+ ...currentState,
110
+ turnNumber: currentState.turnNumber + 1,
111
+ };
112
+ return {
113
+ newState: finalState,
114
+ events,
115
+ };
116
+ }
117
+ }
118
+ const statusResult = applyEndOfTurnStatuses(currentState);
119
+ currentState = statusResult.state;
120
+ events.push(...statusResult.events);
121
+ const winnerAtEnd = checkWinner(currentState);
122
+ if (winnerAtEnd !== "none") {
123
+ events.push({
124
+ ...createBaseEvent(currentState.turnNumber, "battle_end", `La batalla termina: ${winnerAtEnd}`),
125
+ winner: winnerAtEnd,
126
+ });
127
+ }
128
+ events.push({
129
+ ...createBaseEvent(currentState.turnNumber, "turn_end", `Termina el turno ${currentState.turnNumber}`),
130
+ });
131
+ const finalState = {
132
+ ...currentState,
133
+ turnNumber: currentState.turnNumber + 1,
134
+ };
135
+ return {
136
+ newState: finalState,
137
+ events,
138
+ };
139
+ };
package/dist/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export * from "./api/battle.js";
3
3
  export * from "./api/room.js";
4
4
  export * from "./api/socketTypes.js";
5
5
  export * from "./skins/CombatSkin.js";
6
+ export * from "./engine/index.js";
package/dist/index.js CHANGED
@@ -3,3 +3,4 @@ export * from "./api/battle.js";
3
3
  export * from "./api/room.js";
4
4
  export * from "./api/socketTypes.js";
5
5
  export * from "./skins/CombatSkin.js";
6
+ export * from "./engine/index.js";
@@ -1,5 +1,5 @@
1
1
  import type { TypeDefinition, TypeEffectivenessMatrix, MoveDefinition, ItemDefinition, AmuletDefinition, StatusDefinition } from "../core/index.js";
2
- import type { PlayerBattleConfig } from "../core/engine.js";
2
+ import { PlayerBattleConfig } from "../engine/rules.js";
3
3
  export interface TeamFighterLoadout {
4
4
  fighterId: string | null;
5
5
  moveIds: string[];
@@ -1,4 +1,5 @@
1
- import { ItemDefinition, MoveDefinition, PlayerBattleConfig } from "../../core/index.js";
1
+ import { ItemDefinition, MoveDefinition } from "../../core/index.js";
2
+ import { PlayerBattleConfig } from "../../engine/rules.js";
2
3
  import type { CombatSkin, PlayerTeamLoadout } from "../CombatSkin.js";
3
4
  export declare class TribeSkin implements CombatSkin {
4
5
  readonly id = "tribe";
@@ -1,4 +1,5 @@
1
- import { ItemDefinition, MoveDefinition, PlayerBattleConfig } from "../../core/index.js";
1
+ import { ItemDefinition, MoveDefinition } from "../../core/index.js";
2
+ import { PlayerBattleConfig } from "../../engine/rules.js";
2
3
  import type { CombatSkin, PlayerTeamLoadout } from "../CombatSkin.js";
3
4
  export declare class PokemonSkin implements CombatSkin {
4
5
  readonly id = "pokemon";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pokemon-io-core",
3
- "version": "0.0.83",
3
+ "version": "0.0.84",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "type": "module",