pokemon-io-core 0.0.82 → 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 (76) hide show
  1. package/dist/core/battleState.d.ts +1 -1
  2. package/dist/core/engine.js +43 -7
  3. package/dist/core/index.d.ts +0 -1
  4. package/dist/core/index.js +0 -1
  5. package/dist/engine/actions/forcedSwitch.d.ts +5 -0
  6. package/dist/engine/actions/forcedSwitch.js +44 -0
  7. package/dist/engine/actions/index.d.ts +5 -0
  8. package/dist/engine/actions/index.js +5 -0
  9. package/dist/engine/actions/item.d.ts +6 -0
  10. package/dist/engine/actions/item.js +61 -0
  11. package/dist/engine/actions/move.d.ts +6 -0
  12. package/dist/engine/actions/move.js +120 -0
  13. package/dist/engine/actions/priority.d.ts +6 -0
  14. package/dist/engine/actions/priority.js +30 -0
  15. package/dist/engine/actions/switch.d.ts +6 -0
  16. package/dist/engine/actions/switch.js +55 -0
  17. package/dist/engine/combat/crit.d.ts +2 -0
  18. package/dist/engine/combat/crit.js +4 -0
  19. package/dist/engine/combat/damage.d.ts +20 -0
  20. package/dist/engine/combat/damage.js +66 -0
  21. package/dist/engine/combat/heal.d.ts +6 -0
  22. package/dist/engine/combat/heal.js +25 -0
  23. package/dist/engine/combat/index.d.ts +5 -0
  24. package/dist/engine/combat/index.js +5 -0
  25. package/dist/engine/combat/typeEffectiveness.d.ts +3 -0
  26. package/dist/engine/combat/typeEffectiveness.js +7 -0
  27. package/dist/engine/combat/winner.d.ts +2 -0
  28. package/dist/engine/combat/winner.js +11 -0
  29. package/dist/engine/debug.d.ts +1 -0
  30. package/dist/engine/debug.js +6 -0
  31. package/dist/engine/effects/applyEffects.d.ts +7 -0
  32. package/dist/engine/effects/applyEffects.js +103 -0
  33. package/dist/engine/effects/index.d.ts +2 -0
  34. package/dist/engine/effects/index.js +2 -0
  35. package/dist/engine/effects/target.d.ts +6 -0
  36. package/dist/engine/effects/target.js +26 -0
  37. package/dist/engine/engine.d.ts +53 -0
  38. package/dist/engine/engine.js +1046 -0
  39. package/dist/engine/events.d.ts +4 -0
  40. package/dist/engine/events.js +12 -0
  41. package/dist/engine/fighters/fighter.d.ts +4 -0
  42. package/dist/engine/fighters/fighter.js +53 -0
  43. package/dist/engine/fighters/index.d.ts +3 -0
  44. package/dist/engine/fighters/index.js +3 -0
  45. package/dist/engine/fighters/selectors.d.ts +13 -0
  46. package/dist/engine/fighters/selectors.js +19 -0
  47. package/dist/engine/fighters/update.d.ts +3 -0
  48. package/dist/engine/fighters/update.js +30 -0
  49. package/dist/engine/index.d.ts +11 -1
  50. package/dist/engine/index.js +11 -1
  51. package/dist/engine/rng.d.ts +2 -0
  52. package/dist/engine/rng.js +8 -0
  53. package/dist/engine/rules.d.ts +44 -0
  54. package/dist/engine/rules.js +10 -0
  55. package/dist/engine/runtime.d.ts +7 -0
  56. package/dist/engine/runtime.js +49 -0
  57. package/dist/engine/status/apply.d.ts +6 -0
  58. package/dist/engine/status/apply.js +49 -0
  59. package/dist/engine/status/clear.d.ts +6 -0
  60. package/dist/engine/status/clear.js +47 -0
  61. package/dist/engine/status/endOfTurn.d.ts +6 -0
  62. package/dist/engine/status/endOfTurn.js +80 -0
  63. package/dist/engine/status/hardCc.d.ts +3 -0
  64. package/dist/engine/status/hardCc.js +4 -0
  65. package/dist/engine/status/index.d.ts +4 -0
  66. package/dist/engine/status/index.js +4 -0
  67. package/dist/engine/turn/index.d.ts +1 -0
  68. package/dist/engine/turn/index.js +1 -0
  69. package/dist/engine/turn/resolveTurn.d.ts +5 -0
  70. package/dist/engine/turn/resolveTurn.js +139 -0
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.js +1 -0
  73. package/dist/skins/CombatSkin.d.ts +1 -1
  74. package/dist/skins/cliches/clicheSkin.d.ts +2 -1
  75. package/dist/skins/pokemon/pokemonSkin.d.ts +2 -1
  76. package/package.json +1 -1
@@ -0,0 +1,6 @@
1
+ const DEBUG_BATTLE = true;
2
+ export const dbg = (...args) => {
3
+ if (!DEBUG_BATTLE)
4
+ return;
5
+ console.log("[BATTLE]", ...args);
6
+ };
@@ -0,0 +1,7 @@
1
+ import { BattleEvent, BattleFighter, EffectDefinition, TypeId } from "../../core";
2
+ import { RuntimeBattleState } from "../rules";
3
+ export declare const applyEffectsOnTarget: (state: RuntimeBattleState, actor: BattleFighter, target: BattleFighter, moveTypeId: TypeId | null, isCritical: boolean, effects: EffectDefinition[]) => {
4
+ actor: BattleFighter;
5
+ target: BattleFighter;
6
+ events: BattleEvent[];
7
+ };
@@ -0,0 +1,103 @@
1
+ import { applyDamageToFighter, computeDamage } from "../combat/damage";
2
+ import { applyHealToFighter } from "../combat/heal";
3
+ import { dbg } from "../debug";
4
+ import { applyStatusToFighter } from "../status/apply";
5
+ import { clearStatusFromFighter } from "../status/clear";
6
+ import { resolveEffectTarget } from "./target";
7
+ export const applyEffectsOnTarget = (state, actor, target, moveTypeId, isCritical, effects) => {
8
+ dbg("applyEffectsOnTarget", {
9
+ actorId: actor.fighterId,
10
+ targetId: target.fighterId,
11
+ moveTypeId,
12
+ isCritical,
13
+ effects,
14
+ });
15
+ let currentActor = actor;
16
+ let currentTarget = target;
17
+ const events = [];
18
+ dbg("APPLY_EFFECTS_START", {
19
+ actorId: actor.fighterId,
20
+ targetId: target.fighterId,
21
+ moveTypeId,
22
+ isCritical,
23
+ effectsCount: effects?.length ?? 0,
24
+ });
25
+ for (const eff of effects) {
26
+ dbg("EFFECT_LOOP", eff);
27
+ switch (eff.kind) {
28
+ case "heal": {
29
+ dbg("EFFECT_HEAL_START", {
30
+ amount: eff.amount,
31
+ targetDefault: eff.target,
32
+ });
33
+ const { primary, isSelf } = resolveEffectTarget(eff, currentActor, currentTarget);
34
+ const res = applyHealToFighter(state, primary, eff.amount, actor.fighterId);
35
+ if (isSelf)
36
+ currentActor = res.updated;
37
+ else
38
+ currentTarget = res.updated;
39
+ events.push(...res.events);
40
+ break;
41
+ }
42
+ case "apply_status": {
43
+ dbg("EFFECT_APPLY_STATUS_START", {
44
+ statusId: eff.statusId,
45
+ targetDefault: eff.target,
46
+ });
47
+ const { primary, isSelf } = resolveEffectTarget(eff, currentActor, currentTarget);
48
+ const res = applyStatusToFighter(state, primary, eff.statusId);
49
+ if (isSelf)
50
+ currentActor = res.updated;
51
+ else
52
+ currentTarget = res.updated;
53
+ events.push(...res.events);
54
+ break;
55
+ }
56
+ case "clear_status": {
57
+ dbg("debemos eliminar status");
58
+ const { primary, isSelf } = resolveEffectTarget(eff, currentActor, currentTarget);
59
+ const res = clearStatusFromFighter(state, primary, eff);
60
+ if (isSelf)
61
+ currentActor = res.updated;
62
+ else
63
+ currentTarget = res.updated;
64
+ events.push(...res.events);
65
+ break;
66
+ }
67
+ case "damage": {
68
+ dbg("debemos hacer daño");
69
+ const { primary, isSelf } = resolveEffectTarget(eff, currentActor, currentTarget);
70
+ let totalDamage = 0;
71
+ // Daño de fórmula (stats + tipo + crit…)
72
+ if (eff.basePower && moveTypeId) {
73
+ const { damage } = computeDamage({
74
+ state,
75
+ attacker: currentActor,
76
+ defender: primary,
77
+ moveTypeId,
78
+ basePower: eff.basePower,
79
+ isCritical,
80
+ });
81
+ totalDamage += damage;
82
+ }
83
+ // Daño plano adicional
84
+ if (eff.flatAmount && eff.flatAmount > 0) {
85
+ totalDamage += eff.flatAmount;
86
+ }
87
+ if (totalDamage > 0) {
88
+ const res = applyDamageToFighter(state, primary, totalDamage, currentActor.fighterId, isCritical);
89
+ if (isSelf)
90
+ currentActor = res.updatedDefender;
91
+ else
92
+ currentTarget = res.updatedDefender;
93
+ events.push(...res.events);
94
+ }
95
+ break;
96
+ }
97
+ // TODO: conectar shield, modify_stats, etc.
98
+ default:
99
+ break;
100
+ }
101
+ }
102
+ return { actor: currentActor, target: currentTarget, events };
103
+ };
@@ -0,0 +1,2 @@
1
+ export * from './applyEffects.js';
2
+ export * from './target.js';
@@ -0,0 +1,2 @@
1
+ export * from './applyEffects.js';
2
+ export * from './target.js';
@@ -0,0 +1,6 @@
1
+ import { BattleFighter, EffectDefinition, EffectKind, EffectTarget } from "../../core";
2
+ export declare const defaultTargetForKind: (kind: EffectKind) => EffectTarget;
3
+ export declare const resolveEffectTarget: (eff: EffectDefinition, actor: BattleFighter, target: BattleFighter) => {
4
+ primary: BattleFighter;
5
+ isSelf: boolean;
6
+ };
@@ -0,0 +1,26 @@
1
+ export const defaultTargetForKind = (kind) => {
2
+ switch (kind) {
3
+ case "damage":
4
+ case "apply_status":
5
+ return "enemy";
6
+ case "heal":
7
+ case "clear_status":
8
+ case "modify_stats":
9
+ case "modify_hit_chance":
10
+ case "modify_crit_chance":
11
+ case "modify_priority":
12
+ case "modify_effective_speed":
13
+ case "shield":
14
+ return "self";
15
+ default:
16
+ return "self";
17
+ }
18
+ };
19
+ export const resolveEffectTarget = (eff, actor, target) => {
20
+ const t = eff.target ?? defaultTargetForKind(eff.kind);
21
+ const isSelf = t === "self";
22
+ return {
23
+ primary: isSelf ? actor : target,
24
+ isSelf,
25
+ };
26
+ };
@@ -0,0 +1,53 @@
1
+ import { type BattleState, type FighterDefinition, type MoveDefinition, type ItemDefinition, type AmuletDefinition, type StatusDefinition, type TypeDefinition, type TypeEffectivenessMatrix, type BattleActions, type BattleEvent, type MoveId, type ItemId, type StatusId, type TypeId } from "../core/index.js";
2
+ interface BattleRules {
3
+ baseCritChance: number;
4
+ critPerStat: number;
5
+ critMultiplier: number;
6
+ stabMultiplier: number;
7
+ randomMinDamageFactor: number;
8
+ randomMaxDamageFactor: number;
9
+ }
10
+ export interface BattleRuntime {
11
+ rules: BattleRules;
12
+ typesById: Record<TypeId, TypeDefinition>;
13
+ movesById: Record<MoveId, MoveDefinition>;
14
+ itemsById: Record<ItemId, ItemDefinition>;
15
+ amuletsById: Record<string, AmuletDefinition>;
16
+ statusesById: Record<StatusId, StatusDefinition>;
17
+ typeEffectiveness: TypeEffectivenessMatrix;
18
+ }
19
+ export interface PlayerFighterBattleConfig {
20
+ fighter: FighterDefinition;
21
+ maxHp: number;
22
+ moves: MoveDefinition[];
23
+ amulet: AmuletDefinition | null;
24
+ }
25
+ export interface PlayerBattleConfig {
26
+ fighters: PlayerFighterBattleConfig[];
27
+ items: ItemDefinition[];
28
+ amulet: AmuletDefinition | null;
29
+ }
30
+ export interface BattleConfig {
31
+ types: TypeDefinition[];
32
+ typeEffectiveness: TypeEffectivenessMatrix;
33
+ moves: MoveDefinition[];
34
+ items: ItemDefinition[];
35
+ amulets: AmuletDefinition[];
36
+ statuses: StatusDefinition[];
37
+ player1: PlayerBattleConfig;
38
+ player2: PlayerBattleConfig;
39
+ rules?: Partial<BattleRules>;
40
+ }
41
+ export interface RuntimeBattleState extends BattleState {
42
+ runtime: BattleRuntime;
43
+ }
44
+ export declare const createInitialBattleState: (config: BattleConfig) => BattleState;
45
+ export declare const applyForcedSwitchChoice: (state: BattleState, targetPlayer: "player1" | "player2", newIndex: number) => {
46
+ state: BattleState;
47
+ events: BattleEvent[];
48
+ };
49
+ export declare const resolveTurn: (state: BattleState, actions: BattleActions) => {
50
+ newState: BattleState;
51
+ events: BattleEvent[];
52
+ };
53
+ export {};