pokemon-io-core 0.0.83 → 0.0.85
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/battleState.d.ts +1 -1
- package/dist/core/index.d.ts +0 -1
- package/dist/core/index.js +0 -1
- package/dist/engine/actions/forcedSwitch.d.ts +5 -0
- package/dist/engine/actions/forcedSwitch.js +44 -0
- package/dist/engine/actions/index.d.ts +5 -0
- package/dist/engine/actions/index.js +5 -0
- package/dist/engine/actions/item.d.ts +6 -0
- package/dist/engine/actions/item.js +61 -0
- package/dist/engine/actions/move.d.ts +6 -0
- package/dist/engine/actions/move.js +120 -0
- package/dist/engine/actions/priority.d.ts +6 -0
- package/dist/engine/actions/priority.js +36 -0
- package/dist/engine/actions/switch.d.ts +6 -0
- package/dist/engine/actions/switch.js +55 -0
- package/dist/engine/combat/crit.d.ts +2 -0
- package/dist/engine/combat/crit.js +4 -0
- package/dist/engine/combat/damage.d.ts +20 -0
- package/dist/engine/combat/damage.js +66 -0
- package/dist/engine/combat/heal.d.ts +6 -0
- package/dist/engine/combat/heal.js +25 -0
- package/dist/engine/combat/index.d.ts +5 -0
- package/dist/engine/combat/index.js +5 -0
- package/dist/engine/combat/typeEffectiveness.d.ts +3 -0
- package/dist/engine/combat/typeEffectiveness.js +7 -0
- package/dist/engine/combat/winner.d.ts +2 -0
- package/dist/engine/combat/winner.js +11 -0
- package/dist/engine/debug.d.ts +1 -0
- package/dist/engine/debug.js +6 -0
- package/dist/engine/effects/applyEffects.d.ts +7 -0
- package/dist/engine/effects/applyEffects.js +103 -0
- package/dist/engine/effects/index.d.ts +2 -0
- package/dist/engine/effects/index.js +2 -0
- package/dist/engine/effects/target.d.ts +6 -0
- package/dist/engine/effects/target.js +26 -0
- package/dist/engine/engine.d.ts +53 -0
- package/dist/engine/engine.js +1046 -0
- package/dist/engine/events.d.ts +4 -0
- package/dist/engine/events.js +12 -0
- package/dist/engine/fighters/fighter.d.ts +4 -0
- package/dist/engine/fighters/fighter.js +53 -0
- package/dist/engine/fighters/index.d.ts +3 -0
- package/dist/engine/fighters/index.js +3 -0
- package/dist/engine/fighters/selectors.d.ts +13 -0
- package/dist/engine/fighters/selectors.js +19 -0
- package/dist/engine/fighters/update.d.ts +3 -0
- package/dist/engine/fighters/update.js +30 -0
- package/dist/engine/index.d.ts +11 -1
- package/dist/engine/index.js +11 -1
- package/dist/engine/rng.d.ts +2 -0
- package/dist/engine/rng.js +8 -0
- package/dist/engine/rules.d.ts +44 -0
- package/dist/engine/rules.js +10 -0
- package/dist/engine/runtime.d.ts +7 -0
- package/dist/engine/runtime.js +49 -0
- package/dist/engine/status/apply.d.ts +6 -0
- package/dist/engine/status/apply.js +49 -0
- package/dist/engine/status/clear.d.ts +6 -0
- package/dist/engine/status/clear.js +47 -0
- package/dist/engine/status/endOfTurn.d.ts +6 -0
- package/dist/engine/status/endOfTurn.js +80 -0
- package/dist/engine/status/hardCc.d.ts +3 -0
- package/dist/engine/status/hardCc.js +4 -0
- package/dist/engine/status/index.d.ts +4 -0
- package/dist/engine/status/index.js +4 -0
- package/dist/engine/turn/index.d.ts +1 -0
- package/dist/engine/turn/index.js +1 -0
- package/dist/engine/turn/resolveTurn.d.ts +5 -0
- package/dist/engine/turn/resolveTurn.js +139 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/skins/CombatSkin.d.ts +1 -1
- package/dist/skins/cliches/clicheSkin.d.ts +2 -1
- package/dist/skins/pokemon/pokemonSkin.d.ts +2 -1
- 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
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { TypeDefinition, TypeEffectivenessMatrix, MoveDefinition, ItemDefinition, AmuletDefinition, StatusDefinition } from "../core/index.js";
|
|
2
|
-
import
|
|
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
|
|
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
|
|
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";
|