getcompetitive 6.0.0 → 6.1.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.
- package/dist/inference.js +206 -0
- package/dist/inference.js.map +1 -0
- package/dist/meta-history.data.js +268 -168
- package/dist/meta-history.data.js.map +1 -1
- package/dist/prompts.js +31 -0
- package/dist/prompts.js.map +1 -1
- package/dist/roles.js +77 -0
- package/dist/roles.js.map +1 -0
- package/dist/tools/compound.js +3 -0
- package/dist/tools/compound.js.map +1 -1
- package/dist/tools/infer.js +7 -216
- package/dist/tools/infer.js.map +1 -1
- package/dist/tools/levels.js +1 -1
- package/dist/tools/levels.js.map +1 -1
- package/dist/tools/meta.js +15 -2
- package/dist/tools/meta.js.map +1 -1
- package/dist/tools/optimize.js +46 -8
- package/dist/tools/optimize.js.map +1 -1
- package/dist/tools/replay.js +24 -2
- package/dist/tools/replay.js.map +1 -1
- package/dist/tools/scout.js +135 -0
- package/dist/tools/scout.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SetInferenceEngine: reverse constraint solving over battle observations.
|
|
3
|
+
* Shared by `analyze_battle`'s "infer" mode and the scouting pipeline, so a
|
|
4
|
+
* replay and a hand-typed observation narrow candidate sets with identical
|
|
5
|
+
* math. Battle observations are normalized into the `BattleObservation` union
|
|
6
|
+
* — the kinds a battle can actually reveal (speed relations, damage taken or
|
|
7
|
+
* dealt, item and ability reveals).
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { getChampionsDex } from './champions.js';
|
|
11
|
+
import { damageResult, finalStat } from './dex.js';
|
|
12
|
+
import { getRegulationSet } from './regulations.js';
|
|
13
|
+
import { findThreat } from './threats.js';
|
|
14
|
+
import { requireExists } from './result.js';
|
|
15
|
+
export const observationSchema = z.union([
|
|
16
|
+
z.object({
|
|
17
|
+
kind: z.literal('speed'),
|
|
18
|
+
referenceSpeed: z.number().int().describe('The Speed of the member it raced against.'),
|
|
19
|
+
relation: z.enum(['outsped', 'outspeeds']).describe('"outsped" means it moved first; "outspeeds" means your member moved first.'),
|
|
20
|
+
}),
|
|
21
|
+
z.object({
|
|
22
|
+
kind: z.literal('damageDealt'),
|
|
23
|
+
move: z.string().describe('The move it used.'),
|
|
24
|
+
target: z.object({
|
|
25
|
+
species: z.string(),
|
|
26
|
+
level: z.number().int().optional(),
|
|
27
|
+
nature: z.string().optional(),
|
|
28
|
+
evs: z.record(z.string(), z.number()).optional(),
|
|
29
|
+
championsPoints: z.record(z.string(), z.number()).optional(),
|
|
30
|
+
item: z.string().optional(),
|
|
31
|
+
ability: z.string().optional(),
|
|
32
|
+
}),
|
|
33
|
+
percent: z.number().describe('Damage as a percentage of the target\u2019s HP.'),
|
|
34
|
+
}),
|
|
35
|
+
z.object({
|
|
36
|
+
kind: z.literal('damageTaken'),
|
|
37
|
+
move: z.string().describe('The move that hit it.'),
|
|
38
|
+
attacker: z.object({
|
|
39
|
+
species: z.string(),
|
|
40
|
+
level: z.number().int().optional(),
|
|
41
|
+
nature: z.string().optional(),
|
|
42
|
+
evs: z.record(z.string(), z.number()).optional(),
|
|
43
|
+
championsPoints: z.record(z.string(), z.number()).optional(),
|
|
44
|
+
item: z.string().optional(),
|
|
45
|
+
ability: z.string().optional(),
|
|
46
|
+
}),
|
|
47
|
+
percentTaken: z.number().describe('Damage it took, as a percentage of its own HP.'),
|
|
48
|
+
}),
|
|
49
|
+
z.object({ kind: z.literal('ability'), ability: z.string().describe('An ability it is known to have.') }),
|
|
50
|
+
z.object({ kind: z.literal('item'), item: z.string().describe('An item it is known to hold.') }),
|
|
51
|
+
]);
|
|
52
|
+
const ITEM_POOL = ['Choice Scarf', 'Choice Band', 'Choice Specs', 'Life Orb', 'Focus Sash', 'Assault Vest', 'Sitrus Berry'];
|
|
53
|
+
const SPEED_NATURES = ['Jolly', 'Timid'];
|
|
54
|
+
function spreadBy(primary, secondary) {
|
|
55
|
+
const evs = {};
|
|
56
|
+
evs[primary] = 252;
|
|
57
|
+
evs[secondary] = 252;
|
|
58
|
+
evs['hp'] = 4;
|
|
59
|
+
return evs;
|
|
60
|
+
}
|
|
61
|
+
function candidatesFor(dex, speciesName, curated) {
|
|
62
|
+
const sp = dex.species.get(speciesName);
|
|
63
|
+
requireExists(sp, 'Pokemon species', speciesName);
|
|
64
|
+
const base = sp.baseStats;
|
|
65
|
+
const offensiveStat = base.atk >= base.spa ? 'atk' : 'spa';
|
|
66
|
+
const speedNature = base.atk >= base.spa ? 'Jolly' : 'Timid';
|
|
67
|
+
const powerNature = base.atk >= base.spa ? 'Adamant' : 'Modest';
|
|
68
|
+
const mega = speciesName.toLowerCase().includes('mega');
|
|
69
|
+
const threat = curated?.threat;
|
|
70
|
+
const natures = [...new Set([...(threat?.nature ? [threat.nature] : []), speedNature, powerNature])];
|
|
71
|
+
const items = mega
|
|
72
|
+
? [...new Set([...(threat?.item ? [threat.item] : []), 'Life Orb', 'Sitrus Berry'])]
|
|
73
|
+
: [...new Set([...(threat?.item ? [threat.item] : []), ...ITEM_POOL])];
|
|
74
|
+
const spreads = [...new Set([
|
|
75
|
+
JSON.stringify(threat?.evs ?? spreadBy(offensiveStat, 'spe')),
|
|
76
|
+
JSON.stringify(spreadBy(offensiveStat, 'spe')),
|
|
77
|
+
JSON.stringify(spreadBy('hp', offensiveStat)),
|
|
78
|
+
JSON.stringify(spreadBy('hp', 'def')),
|
|
79
|
+
])].map((s) => JSON.parse(s));
|
|
80
|
+
const ability = threat?.ability ?? (sp.abilities?.[0] ?? '');
|
|
81
|
+
const out = [];
|
|
82
|
+
for (const nature of natures) {
|
|
83
|
+
for (const item of items) {
|
|
84
|
+
for (const evs of spreads) {
|
|
85
|
+
const baseSpeed = finalStat(9, 'spe', base.spe, 31, evs.spe ?? 0, 50, nature);
|
|
86
|
+
const speed = item === 'Choice Scarf' ? Math.floor(baseSpeed * 1.5) : baseSpeed;
|
|
87
|
+
const weight = (nature === threat?.nature ? 1 : SPEED_NATURES.includes(nature) ? 0.7 : 0.5) *
|
|
88
|
+
(item === threat?.item ? 1 : item === 'Choice Scarf' ? 0.6 : 0.5) *
|
|
89
|
+
(JSON.stringify(evs) === JSON.stringify(threat?.evs ?? {}) ? 1 : 0.6);
|
|
90
|
+
out.push({ item: item || undefined, ability, nature, evs, speed, weight });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Narrow the candidate space for one species with normalized battle
|
|
98
|
+
* observations, deterministic and offline: exact level-50 Speed math and real
|
|
99
|
+
* damage rolls, the meta's own set anchoring the prior where one exists.
|
|
100
|
+
*/
|
|
101
|
+
export function runInference(species, observations, regulation) {
|
|
102
|
+
const dex = getChampionsDex();
|
|
103
|
+
const set = regulation ? getRegulationSet(regulation) : undefined;
|
|
104
|
+
const curated = findThreat(species, set?.id);
|
|
105
|
+
const sp = dex.species.get(species);
|
|
106
|
+
requireExists(sp, 'Pokemon species', species);
|
|
107
|
+
const priorPool = candidatesFor(dex, sp.name, curated);
|
|
108
|
+
let candidates = priorPool;
|
|
109
|
+
const constraints = [];
|
|
110
|
+
for (const obs of observations) {
|
|
111
|
+
const before = candidates.length;
|
|
112
|
+
const keep = [];
|
|
113
|
+
if (obs.kind === 'speed') {
|
|
114
|
+
for (const c of candidates) {
|
|
115
|
+
const faster = obs.relation === 'outsped' ? c.speed > obs.referenceSpeed : c.speed < obs.referenceSpeed;
|
|
116
|
+
if (faster)
|
|
117
|
+
keep.push(c);
|
|
118
|
+
}
|
|
119
|
+
constraints.push({
|
|
120
|
+
observation: `${obs.relation === 'outsped' ? 'outsped' : 'was outsped by'} a member at ${obs.referenceSpeed} Speed`,
|
|
121
|
+
before, after: keep.length, eliminated: before - keep.length,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
else if (obs.kind === 'ability') {
|
|
125
|
+
for (const c of candidates) {
|
|
126
|
+
if (c.ability.toLowerCase() === obs.ability.toLowerCase())
|
|
127
|
+
keep.push(c);
|
|
128
|
+
}
|
|
129
|
+
constraints.push({ observation: `has ${obs.ability}`, before, after: keep.length, eliminated: before - keep.length });
|
|
130
|
+
}
|
|
131
|
+
else if (obs.kind === 'item') {
|
|
132
|
+
for (const c of candidates) {
|
|
133
|
+
if (c.item?.toLowerCase() === obs.item.toLowerCase())
|
|
134
|
+
keep.push(c);
|
|
135
|
+
}
|
|
136
|
+
constraints.push({ observation: `holds ${obs.item}`, before, after: keep.length, eliminated: before - keep.length });
|
|
137
|
+
}
|
|
138
|
+
else if (obs.kind === 'damageDealt') {
|
|
139
|
+
const targetSet = { ...obs.target, level: obs.target.level ?? 50 };
|
|
140
|
+
for (const c of candidates) {
|
|
141
|
+
let consistent = false;
|
|
142
|
+
try {
|
|
143
|
+
const res = damageResult(9, { species: sp.name, level: 50, nature: c.nature, evs: c.evs, item: c.item, ability: c.ability, moves: [obs.move] }, targetSet, obs.move);
|
|
144
|
+
const targetHp = res.defender.stats.hp;
|
|
145
|
+
const observedHp = (obs.percent / 100) * targetHp;
|
|
146
|
+
consistent = res.damageRange[0] <= observedHp && observedHp <= res.damageRange[1];
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
consistent = false;
|
|
150
|
+
}
|
|
151
|
+
if (consistent)
|
|
152
|
+
keep.push(c);
|
|
153
|
+
}
|
|
154
|
+
constraints.push({
|
|
155
|
+
observation: `${obs.move} did ${obs.percent}% to ${obs.target.species}`,
|
|
156
|
+
before, after: keep.length, eliminated: before - keep.length,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
const attackerSet = { ...obs.attacker, level: obs.attacker.level ?? 50 };
|
|
161
|
+
for (const c of candidates) {
|
|
162
|
+
let consistent = false;
|
|
163
|
+
try {
|
|
164
|
+
const res = damageResult(9, attackerSet, { species: sp.name, level: 50, nature: c.nature, evs: c.evs, item: c.item, ability: c.ability }, obs.move);
|
|
165
|
+
const targetHp = res.defender.stats.hp;
|
|
166
|
+
const observedHp = (obs.percentTaken / 100) * targetHp;
|
|
167
|
+
consistent = res.damageRange[0] <= observedHp && observedHp <= res.damageRange[1];
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
consistent = false;
|
|
171
|
+
}
|
|
172
|
+
if (consistent)
|
|
173
|
+
keep.push(c);
|
|
174
|
+
}
|
|
175
|
+
constraints.push({
|
|
176
|
+
observation: `took ${obs.percentTaken}% from ${obs.attacker.species}'s ${obs.move}`,
|
|
177
|
+
before, after: keep.length, eliminated: before - keep.length,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
candidates = keep;
|
|
181
|
+
if (!candidates.length)
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
const total = candidates.reduce((a, c) => a + c.weight, 0);
|
|
185
|
+
const ranked = [...candidates]
|
|
186
|
+
.sort((a, b) => b.weight - a.weight)
|
|
187
|
+
.slice(0, 8)
|
|
188
|
+
.map((c) => ({
|
|
189
|
+
...(c.item ? { item: c.item } : {}),
|
|
190
|
+
ability: c.ability,
|
|
191
|
+
nature: c.nature,
|
|
192
|
+
evs: c.evs,
|
|
193
|
+
speed: c.speed,
|
|
194
|
+
probability: Number(((c.weight / total) * 100).toFixed(1)),
|
|
195
|
+
}));
|
|
196
|
+
return {
|
|
197
|
+
species: sp.name,
|
|
198
|
+
...(set ? { regulation: set.name } : {}),
|
|
199
|
+
priorSets: priorPool.length,
|
|
200
|
+
survivingSets: candidates.length,
|
|
201
|
+
constraints,
|
|
202
|
+
candidates: ranked,
|
|
203
|
+
note: 'The engine assumes neutral abilities when unknown, no stat stages on either side, and that damage percentages are rounded by the client — a range that contains the observed value survives, which is why a single roll rarely pins one set. Speed observations are strict inequalities. For an unranked species the prior is a flat pool of plausible natures, items and spreads, so probabilities are relative within that pool, not metagame odds. At most the top 8 survivors are listed; `survivingSets` tells you when more were cut off.',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=inference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inference.js","sourceRoot":"","sources":["../src/inference.ts"],"names":[],"mappings":"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"}
|