getcompetitive 4.3.0 → 4.5.0

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.
@@ -0,0 +1,221 @@
1
+ /**
2
+ * Replay analysis: a Showdown-format battle log in, a deterministic post-match
3
+ * read out. Pure text parsing over the bundled dataset — the caller pastes the
4
+ * log (the server does no network I/O, so it cannot fetch replay URLs; a client
5
+ * that has the URL can fetch and paste it). What the log proves is extracted
6
+ * exactly: both teams, every KO with the move that caused it, the Speed order
7
+ * observed turn by turn, the damage percentages taken, and a type-coverage read
8
+ * of the matchup. Everything the log does not prove is stated as such.
9
+ */
10
+ import { z } from 'zod';
11
+ import { getDex, typeEffectiveness, TYPES18 } from '../dex.js';
12
+ import { ok, wrap, READ_ONLY_ANNOTATIONS } from '../result.js';
13
+ function parseReplay(log) {
14
+ const dex = getDex(9);
15
+ const players = {};
16
+ const species = {};
17
+ const seen = { p1: new Set(), p2: new Set() };
18
+ const teamSize = {};
19
+ const kos = [];
20
+ const speed = [];
21
+ const damage = [];
22
+ const unresolved = [];
23
+ const lastMoveOn = {};
24
+ const moveOrder = [];
25
+ let winner;
26
+ let currentTurn = 0;
27
+ const recordSpecies = (posKey, display) => {
28
+ const name = display.split(',')[0].trim();
29
+ species[posKey] = name;
30
+ if (!dex.species.get(name).exists && !unresolved.includes(name))
31
+ unresolved.push(name);
32
+ const side = posKey.startsWith('p1') ? 'p1' : 'p2';
33
+ if (name)
34
+ seen[side].add(name);
35
+ };
36
+ for (const raw of log.split('\n')) {
37
+ const line = raw.trim();
38
+ if (!line.startsWith('|'))
39
+ continue;
40
+ const [event, ...args] = line.split('|').slice(1);
41
+ switch (event) {
42
+ case 'player':
43
+ players[args[0]] = args[1] ?? args[0];
44
+ break;
45
+ case 'teamsize':
46
+ // |teamsize|p1|6|p2|6
47
+ for (let i = 0; i < args.length; i += 2)
48
+ teamSize[args[i]] = Number(args[i + 1]);
49
+ break;
50
+ case 'poke': {
51
+ const side = args[0];
52
+ const name = (args[1] ?? '').split(',')[0].trim();
53
+ if (name && (side === 'p1' || side === 'p2'))
54
+ seen[side].add(name);
55
+ break;
56
+ }
57
+ case 'switch': {
58
+ // |switch|p1a: Sneasler|Sneasler, F|100/100
59
+ const posKey = args[0].split(':')[0];
60
+ recordSpecies(posKey, args[1] ?? '');
61
+ break;
62
+ }
63
+ case 'turn':
64
+ currentTurn = Number(args[0]);
65
+ break;
66
+ case 'move': {
67
+ // |move|p1a: Sneasler|Close Combat|p2a: Rillaboom
68
+ const posKey = args[0].split(':')[0];
69
+ const move = args[1] ?? '';
70
+ const targetKey = (args[2] ?? '').split(':')[0];
71
+ moveOrder.push({ turn: currentTurn, pos: args[0], side: args[0].startsWith('p1') ? 'p1' : 'p2' });
72
+ if (targetKey && targetKey !== '')
73
+ lastMoveOn[targetKey] = { turn: currentTurn, move, attacker: args[0] };
74
+ break;
75
+ }
76
+ case '-damage': {
77
+ // |-damage|p2a: Rillaboom|71/100|[from] Close Combat
78
+ const targetKey = (args[0] ?? '').split(':')[0];
79
+ const match = (args[1] ?? '').match(/^(\d+)\/(\d+)$/);
80
+ const att = lastMoveOn[targetKey];
81
+ if (match && att) {
82
+ const percent = Number(((Number(match[1]) / Number(match[2])) * 100).toFixed(1));
83
+ damage.push({ turn: currentTurn, move: att.move, attacker: att.attacker, defender: args[0], percent });
84
+ }
85
+ break;
86
+ }
87
+ case 'faint': {
88
+ const targetKey = (args[0] ?? '').split(':')[0];
89
+ const att = lastMoveOn[targetKey];
90
+ kos.push({
91
+ turn: currentTurn,
92
+ move: att?.move ?? '',
93
+ attacker: att?.attacker ?? '',
94
+ defender: args[0] ?? '',
95
+ });
96
+ break;
97
+ }
98
+ case 'win':
99
+ winner = args[0];
100
+ break;
101
+ }
102
+ }
103
+ // Speed order within a turn: moves appear in execution order, so of two
104
+ // opposing movers the earlier one was faster. Caveats are on the caller.
105
+ for (let i = 1; i < moveOrder.length; i++) {
106
+ const a = moveOrder[i - 1];
107
+ const b = moveOrder[i];
108
+ if (a.turn === b.turn && a.side !== b.side && speed.length < 24) {
109
+ speed.push({ turn: a.turn, faster: a.pos, slower: b.pos });
110
+ }
111
+ }
112
+ return {
113
+ players,
114
+ winner,
115
+ turns: currentTurn,
116
+ teamSize,
117
+ teams: { p1: [...seen.p1], p2: [...seen.p2] },
118
+ kos,
119
+ speed,
120
+ damage,
121
+ unresolved,
122
+ };
123
+ }
124
+ export function registerReplayTool(server) {
125
+ server.registerTool('analyze_replay', {
126
+ title: 'Analyze a battle replay',
127
+ description: 'Turn a Showdown-format battle log into a deterministic post-match read: both teams, every KO with the move that caused it, the Speed order observed turn by turn (with the caveats that come with it), the damage percentages taken per hit, and a type-coverage read of the matchup from STAB and the moves actually seen. The log is parsed text, so replay URLs must be fetched and pasted client-side \u2014 the server does no network I/O. A log only proves what it contains: Speed order is read off execution order (priority, Tailwind, Trick Room and paralysis all distort it), damage is reported as the percentage the target showed, and a species the dataset cannot resolve is reported in `unresolvedSpecies` rather than guessed at. Feed the output to `calculate_damage` to check whether an observed roll fits a suspected spread, and `check_speed` to test the speed races it reveals. Read-only and offline.',
128
+ annotations: READ_ONLY_ANNOTATIONS,
129
+ inputSchema: {
130
+ log: z
131
+ .string()
132
+ .describe('The battle log text, exactly as exported (lines beginning with |), e.g. from Showdown or a Champions client export.'),
133
+ },
134
+ outputSchema: {
135
+ players: z.array(z.string()).describe('The two players, in side order (p1, p2).'),
136
+ winner: z.string().optional().describe('Winning side; absent when the log ends before a win line.'),
137
+ turns: z.number().int().describe('How many turns the log reached.'),
138
+ teamSize: z.record(z.string(), z.number()).optional().describe('Declared team sizes by side; present only when the log carried a teamsize line.'),
139
+ teams: z
140
+ .object({
141
+ p1: z.array(z.string()).describe('Species seen on side p1, in first-seen order.'),
142
+ p2: z.array(z.string()).describe('Species seen on side p2, in first-seen order.'),
143
+ })
144
+ .describe('The teams as the log revealed them.'),
145
+ kos: z
146
+ .array(z.object({
147
+ turn: z.number().int().describe('Turn the faint happened on.'),
148
+ move: z.string().describe('The move that last hit the fainted member; empty when the log does not attribute it.'),
149
+ attacker: z.string().describe('The attacker position, e.g. "p2a: Sneasler"; empty when unattributed.'),
150
+ defender: z.string().describe('The fainted member.'),
151
+ }))
152
+ .describe('Every faint, with the move that caused it.'),
153
+ speedConstraints: z
154
+ .array(z.object({
155
+ turn: z.number().int().describe('Turn the pair was observed on.'),
156
+ faster: z.string().describe('The member that moved first.'),
157
+ slower: z.string().describe('The member that moved after it.'),
158
+ }))
159
+ .describe('Speed order read off execution order within each turn, at most 24 pairs; see the note for the caveats.'),
160
+ damageEvents: z
161
+ .array(z.object({
162
+ turn: z.number().int().describe('Turn the damage happened on.'),
163
+ move: z.string().describe('The move that dealt it.'),
164
+ attacker: z.string().describe('The attacker.'),
165
+ defender: z.string().describe('The target.'),
166
+ percent: z.number().describe('Damage as a percentage of the target\u2019s shown HP, e.g. 71 for "71/100".'),
167
+ }))
168
+ .describe('Damage events with observed percentages, at most 24.'),
169
+ typeRead: z
170
+ .object({
171
+ p1: z.object({
172
+ uncovered: z.array(z.string()).describe('Types side p1 never hit super-effectively with STAB or observed moves.'),
173
+ }),
174
+ p2: z.object({
175
+ uncovered: z.array(z.string()).describe('Types side p2 never hit super-effectively with STAB or observed moves.'),
176
+ }),
177
+ })
178
+ .describe('Which types each side was never able to answer, from the species and moves the log showed.'),
179
+ unresolvedSpecies: z
180
+ .array(z.string())
181
+ .optional()
182
+ .describe('Species names the dataset could not resolve; present only when the log contained any.'),
183
+ note: z.string().describe('What the log can and cannot prove: Speed order is distorted by priority and field effects, damage percentages are as shown, and the coverage read only knows the moves that appeared.'),
184
+ },
185
+ }, wrap(async (args) => {
186
+ const parsed = parseReplay(args.log);
187
+ const dex = getDex(9);
188
+ // Type read: per side, the types nothing hits super-effectively, from
189
+ // STAB types and the types of moves the log showed.
190
+ const readSide = (side) => {
191
+ const atkTypes = new Set();
192
+ for (const name of parsed.teams[side]) {
193
+ const sp = dex.species.get(name);
194
+ if (sp.exists)
195
+ for (const t of sp.types)
196
+ atkTypes.add(t);
197
+ }
198
+ for (const m of parsed.kos.concat(parsed.damage.map((d) => ({ move: d.move }))).map((k) => k.move)) {
199
+ const mv = dex.moves.get(m);
200
+ if (mv.exists)
201
+ atkTypes.add(mv.type);
202
+ }
203
+ const uncovered = TYPES18.filter((def) => ![...atkTypes].some((atk) => typeEffectiveness(atk, [def], 9) > 1));
204
+ return { uncovered };
205
+ };
206
+ return ok({
207
+ players: ['p1', 'p2'].map((s) => parsed.players[s] ?? s),
208
+ ...(parsed.winner ? { winner: parsed.winner } : {}),
209
+ turns: parsed.turns,
210
+ ...(Object.keys(parsed.teamSize).length ? { teamSize: parsed.teamSize } : {}),
211
+ teams: parsed.teams,
212
+ kos: parsed.kos,
213
+ speedConstraints: parsed.speed,
214
+ damageEvents: parsed.damage.slice(0, 24),
215
+ typeRead: { p1: readSide('p1'), p2: readSide('p2') },
216
+ ...(parsed.unresolved.length ? { unresolvedSpecies: [...new Set(parsed.unresolved)] } : {}),
217
+ note: 'What a log proves is bounded by what it contains. Speed order is read off execution order, so priority moves, Tailwind, Trick Room and paralysis all distort it — treat each pair as evidence, not proof. Damage percentages are exactly what the target showed. The type read only knows the species and moves that appeared in the log.',
218
+ });
219
+ }));
220
+ }
221
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/tools/replay.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "getcompetitive",
3
- "version": "4.3.0",
3
+ "version": "4.5.0",
4
4
  "description": "MCP server exposing competitive Pokemon data and battle mechanics for team building and decision making",
5
5
  "type": "module",
6
6
  "bin": {