@pkmn/data 0.10.7 → 0.10.8
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/build/index.d.mts +27 -31
- package/build/index.d.ts +27 -31
- package/build/index.js.map +1 -1
- package/build/index.mjs.map +1 -1
- package/build/index.test.d.ts +1 -0
- package/package.json +6 -6
package/build/index.d.mts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export { Ability, AbilityData, AbilityName, As, BasicEffect, BoostID, BoostsTable, Condition, ConditionData, Data, DataKind, Dex, Effect, EffectData, EffectType, EggGroup, EventInfo, EventInfoData, EvoType, FieldCondition, FormeName, GameType, GenID, GenderName, GenerationNum, HPColor, HPTypeName, HitEffect, ID, Item, ItemData, ItemName, Learnset, LearnsetData, Move, MoveCategory, MoveData, MoveName, MoveSource, MoveTarget, Nature, NatureData, NatureName, Nonstandard, Player, PokemonSet, SecondaryEffect, SideCondition, SideID, SpeciesData, SpeciesName, StatID, StatsTable, StatusName, Tier, TypeData, TypeName, Weather } from '@pkmn/dex-types';
|
|
4
|
-
|
|
5
|
-
type ExistsFn = (d: Data, g: GenerationNum) => boolean;
|
|
1
|
+
import { AbilityName, Condition, Data, Dex, Species as DexSpecies, Type as DexType, EggGroup, EvoType, FormeName, GenderName, GenerationNum, ID, ItemName, Move, MoveCategory, MoveName, MoveSource, Nature, Nonstandard, SpeciesAbility, SpeciesName, SpeciesTag, StatID, StatsTable, Tier, TypeName } from '@pkmn/dex-types';
|
|
2
|
+
export type ExistsFn = (d: Data, g: GenerationNum) => boolean;
|
|
6
3
|
type BoundExistsFn = (d: Data) => boolean;
|
|
7
|
-
declare function toID(text: any): ID;
|
|
8
|
-
declare class Generations {
|
|
4
|
+
export declare function toID(text: any): ID;
|
|
5
|
+
export declare class Generations {
|
|
9
6
|
readonly cache: {
|
|
10
7
|
[num: number]: Generation;
|
|
11
8
|
};
|
|
@@ -16,7 +13,7 @@ declare class Generations {
|
|
|
16
13
|
get(g: string | number): Generation;
|
|
17
14
|
[Symbol.iterator](): Generator<Generation, void, unknown>;
|
|
18
15
|
}
|
|
19
|
-
declare class Generation {
|
|
16
|
+
export declare class Generation {
|
|
20
17
|
readonly abilities: Abilities;
|
|
21
18
|
readonly items: Items;
|
|
22
19
|
readonly moves: Moves;
|
|
@@ -34,28 +31,28 @@ declare class Generation {
|
|
|
34
31
|
toString(): string;
|
|
35
32
|
toJSON(): string;
|
|
36
33
|
}
|
|
37
|
-
declare class Abilities {
|
|
34
|
+
export declare class Abilities {
|
|
38
35
|
readonly dex: Dex;
|
|
39
36
|
readonly exists: BoundExistsFn;
|
|
40
37
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
41
|
-
get(name: string):
|
|
42
|
-
[Symbol.iterator](): Generator<
|
|
38
|
+
get(name: string): import("@pkmn/dex-types").Ability | undefined;
|
|
39
|
+
[Symbol.iterator](): Generator<import("@pkmn/dex-types").Ability, void, unknown>;
|
|
43
40
|
}
|
|
44
|
-
declare class Items {
|
|
41
|
+
export declare class Items {
|
|
45
42
|
readonly dex: Dex;
|
|
46
43
|
readonly exists: BoundExistsFn;
|
|
47
44
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
48
|
-
get(name: string):
|
|
49
|
-
[Symbol.iterator](): Generator<
|
|
45
|
+
get(name: string): import("@pkmn/dex-types").Item | undefined;
|
|
46
|
+
[Symbol.iterator](): Generator<import("@pkmn/dex-types").Item, void, unknown>;
|
|
50
47
|
}
|
|
51
|
-
declare class Moves {
|
|
48
|
+
export declare class Moves {
|
|
52
49
|
readonly dex: Dex;
|
|
53
50
|
readonly exists: BoundExistsFn;
|
|
54
51
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
55
52
|
get(name: string): Move | undefined;
|
|
56
53
|
[Symbol.iterator](): Generator<Move, void, unknown>;
|
|
57
54
|
}
|
|
58
|
-
declare class Species {
|
|
55
|
+
export declare class Species {
|
|
59
56
|
readonly cache: {
|
|
60
57
|
[id: string]: Specie;
|
|
61
58
|
};
|
|
@@ -65,7 +62,7 @@ declare class Species {
|
|
|
65
62
|
get(name: string): Specie | undefined;
|
|
66
63
|
[Symbol.iterator](): Generator<Specie, void, unknown>;
|
|
67
64
|
}
|
|
68
|
-
declare class Specie implements
|
|
65
|
+
export declare class Specie implements DexSpecies {
|
|
69
66
|
readonly id: ID;
|
|
70
67
|
readonly name: SpeciesName;
|
|
71
68
|
readonly fullname: string;
|
|
@@ -129,20 +126,20 @@ declare class Specie implements Species$1 {
|
|
|
129
126
|
readonly isCosmeticForme: boolean;
|
|
130
127
|
readonly dex: Dex;
|
|
131
128
|
static readonly EXCLUDE: Set<string>;
|
|
132
|
-
constructor(dex: Dex, exists: BoundExistsFn, species:
|
|
129
|
+
constructor(dex: Dex, exists: BoundExistsFn, species: DexSpecies);
|
|
133
130
|
get formeNum(): number;
|
|
134
131
|
toString(): SpeciesName;
|
|
135
132
|
toJSON(): {
|
|
136
133
|
[key: string]: any;
|
|
137
134
|
};
|
|
138
135
|
}
|
|
139
|
-
declare class Conditions {
|
|
136
|
+
export declare class Conditions {
|
|
140
137
|
readonly dex: Dex;
|
|
141
138
|
readonly exists: BoundExistsFn;
|
|
142
139
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
143
140
|
get(name: string): Condition | undefined;
|
|
144
141
|
}
|
|
145
|
-
declare class Natures {
|
|
142
|
+
export declare class Natures {
|
|
146
143
|
readonly dex: Dex;
|
|
147
144
|
readonly exists: BoundExistsFn;
|
|
148
145
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
@@ -154,7 +151,7 @@ type TypeTarget = {
|
|
|
154
151
|
} | {
|
|
155
152
|
types: TypeName[];
|
|
156
153
|
} | TypeName[] | TypeName;
|
|
157
|
-
declare class Types {
|
|
154
|
+
export declare class Types {
|
|
158
155
|
readonly cache: {
|
|
159
156
|
[id: string]: Type;
|
|
160
157
|
};
|
|
@@ -175,8 +172,8 @@ declare class Types {
|
|
|
175
172
|
type: TypeName;
|
|
176
173
|
} | TypeName, target: TypeTarget): number;
|
|
177
174
|
}
|
|
178
|
-
type TypeEffectiveness = 0 | 0.5 | 1 | 2;
|
|
179
|
-
declare class Type {
|
|
175
|
+
export type TypeEffectiveness = 0 | 0.5 | 1 | 2;
|
|
176
|
+
export declare class Type {
|
|
180
177
|
readonly id: ID;
|
|
181
178
|
readonly name: TypeName;
|
|
182
179
|
readonly effectType: 'Type';
|
|
@@ -190,7 +187,7 @@ declare class Type {
|
|
|
190
187
|
readonly HPdvs: Partial<StatsTable>;
|
|
191
188
|
readonly category?: Exclude<MoveCategory, 'Status'>;
|
|
192
189
|
readonly types: Types;
|
|
193
|
-
constructor(type:
|
|
190
|
+
constructor(type: DexType, dex: Dex, types: Types);
|
|
194
191
|
canDamage(target: TypeTarget): boolean;
|
|
195
192
|
totalEffectiveness(target: TypeTarget): number;
|
|
196
193
|
toString(): TypeName;
|
|
@@ -199,7 +196,7 @@ declare class Type {
|
|
|
199
196
|
};
|
|
200
197
|
}
|
|
201
198
|
type Restriction = 'Pentagon' | 'Plus' | 'Galar' | 'Paldea';
|
|
202
|
-
declare class Learnsets {
|
|
199
|
+
export declare class Learnsets {
|
|
203
200
|
readonly cache: {
|
|
204
201
|
[speciesid: string]: {
|
|
205
202
|
[moveid: string]: MoveSource[];
|
|
@@ -209,16 +206,16 @@ declare class Learnsets {
|
|
|
209
206
|
readonly dex: Dex;
|
|
210
207
|
readonly exists: BoundExistsFn;
|
|
211
208
|
constructor(gen: Generation, dex: Dex, exists: BoundExistsFn);
|
|
212
|
-
get(name: string): Promise<
|
|
213
|
-
[Symbol.iterator](): AsyncGenerator<
|
|
214
|
-
all(species: Specie): AsyncGenerator<
|
|
209
|
+
get(name: string): Promise<import("@pkmn/dex-types").Learnset | undefined>;
|
|
210
|
+
[Symbol.iterator](): AsyncGenerator<import("@pkmn/dex-types").Learnset, void, unknown>;
|
|
211
|
+
all(species: Specie): AsyncGenerator<import("@pkmn/dex-types").Learnset, void, unknown>;
|
|
215
212
|
learnable(name: string, restriction?: Restriction): Promise<{
|
|
216
213
|
[moveid: string]: string[];
|
|
217
214
|
} | undefined>;
|
|
218
215
|
canLearn(name: string, move: Move | string, restriction?: Restriction): Promise<boolean>;
|
|
219
216
|
isLegal(move: Move, sources: MoveSource[] | undefined, gen: Generation | Restriction): boolean | undefined;
|
|
220
217
|
}
|
|
221
|
-
declare class Stats {
|
|
218
|
+
export declare class Stats {
|
|
222
219
|
readonly dex: Dex;
|
|
223
220
|
constructor(dex: Dex);
|
|
224
221
|
calc(stat: StatID, base: number, iv?: number, ev?: number, level?: number, nature?: Nature): number;
|
|
@@ -230,5 +227,4 @@ declare class Stats {
|
|
|
230
227
|
toDV(iv: number): number;
|
|
231
228
|
toIV(dv: number): number;
|
|
232
229
|
}
|
|
233
|
-
|
|
234
|
-
export { Abilities, Conditions, type ExistsFn, Generation, Generations, Items, Learnsets, Moves, Natures, Specie, Species, Stats, Type, type TypeEffectiveness, Types, toID };
|
|
230
|
+
export type { ID, As, Weather, FieldCondition, SideCondition, GenerationNum, GenderName, StatID, StatsTable, BoostID, BoostsTable, MoveCategory, MoveTarget, Nonstandard, EvoType, EggGroup, SideID, Player, GameType, HPColor, StatusName, NatureName, TypeName, HPTypeName, Tier, PokemonSet, AbilityName, ItemName, MoveName, SpeciesName, FormeName, EffectType, Effect, DataKind, Data, EffectData, HitEffect, SecondaryEffect, ConditionData, AbilityData, ItemData, MoveData, SpeciesData, MoveSource, EventInfoData, LearnsetData, TypeData, NatureData, BasicEffect, Condition, Ability, Item, Move, EventInfo, Learnset, Nature, GenID, Dex, } from '@pkmn/dex-types';
|
package/build/index.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
export { Ability, AbilityData, AbilityName, As, BasicEffect, BoostID, BoostsTable, Condition, ConditionData, Data, DataKind, Dex, Effect, EffectData, EffectType, EggGroup, EventInfo, EventInfoData, EvoType, FieldCondition, FormeName, GameType, GenID, GenderName, GenerationNum, HPColor, HPTypeName, HitEffect, ID, Item, ItemData, ItemName, Learnset, LearnsetData, Move, MoveCategory, MoveData, MoveName, MoveSource, MoveTarget, Nature, NatureData, NatureName, Nonstandard, Player, PokemonSet, SecondaryEffect, SideCondition, SideID, SpeciesData, SpeciesName, StatID, StatsTable, StatusName, Tier, TypeData, TypeName, Weather } from '@pkmn/dex-types';
|
|
4
|
-
|
|
5
|
-
type ExistsFn = (d: Data, g: GenerationNum) => boolean;
|
|
1
|
+
import { AbilityName, Condition, Data, Dex, Species as DexSpecies, Type as DexType, EggGroup, EvoType, FormeName, GenderName, GenerationNum, ID, ItemName, Move, MoveCategory, MoveName, MoveSource, Nature, Nonstandard, SpeciesAbility, SpeciesName, SpeciesTag, StatID, StatsTable, Tier, TypeName } from '@pkmn/dex-types';
|
|
2
|
+
export type ExistsFn = (d: Data, g: GenerationNum) => boolean;
|
|
6
3
|
type BoundExistsFn = (d: Data) => boolean;
|
|
7
|
-
declare function toID(text: any): ID;
|
|
8
|
-
declare class Generations {
|
|
4
|
+
export declare function toID(text: any): ID;
|
|
5
|
+
export declare class Generations {
|
|
9
6
|
readonly cache: {
|
|
10
7
|
[num: number]: Generation;
|
|
11
8
|
};
|
|
@@ -16,7 +13,7 @@ declare class Generations {
|
|
|
16
13
|
get(g: string | number): Generation;
|
|
17
14
|
[Symbol.iterator](): Generator<Generation, void, unknown>;
|
|
18
15
|
}
|
|
19
|
-
declare class Generation {
|
|
16
|
+
export declare class Generation {
|
|
20
17
|
readonly abilities: Abilities;
|
|
21
18
|
readonly items: Items;
|
|
22
19
|
readonly moves: Moves;
|
|
@@ -34,28 +31,28 @@ declare class Generation {
|
|
|
34
31
|
toString(): string;
|
|
35
32
|
toJSON(): string;
|
|
36
33
|
}
|
|
37
|
-
declare class Abilities {
|
|
34
|
+
export declare class Abilities {
|
|
38
35
|
readonly dex: Dex;
|
|
39
36
|
readonly exists: BoundExistsFn;
|
|
40
37
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
41
|
-
get(name: string):
|
|
42
|
-
[Symbol.iterator](): Generator<
|
|
38
|
+
get(name: string): import("@pkmn/dex-types").Ability | undefined;
|
|
39
|
+
[Symbol.iterator](): Generator<import("@pkmn/dex-types").Ability, void, unknown>;
|
|
43
40
|
}
|
|
44
|
-
declare class Items {
|
|
41
|
+
export declare class Items {
|
|
45
42
|
readonly dex: Dex;
|
|
46
43
|
readonly exists: BoundExistsFn;
|
|
47
44
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
48
|
-
get(name: string):
|
|
49
|
-
[Symbol.iterator](): Generator<
|
|
45
|
+
get(name: string): import("@pkmn/dex-types").Item | undefined;
|
|
46
|
+
[Symbol.iterator](): Generator<import("@pkmn/dex-types").Item, void, unknown>;
|
|
50
47
|
}
|
|
51
|
-
declare class Moves {
|
|
48
|
+
export declare class Moves {
|
|
52
49
|
readonly dex: Dex;
|
|
53
50
|
readonly exists: BoundExistsFn;
|
|
54
51
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
55
52
|
get(name: string): Move | undefined;
|
|
56
53
|
[Symbol.iterator](): Generator<Move, void, unknown>;
|
|
57
54
|
}
|
|
58
|
-
declare class Species {
|
|
55
|
+
export declare class Species {
|
|
59
56
|
readonly cache: {
|
|
60
57
|
[id: string]: Specie;
|
|
61
58
|
};
|
|
@@ -65,7 +62,7 @@ declare class Species {
|
|
|
65
62
|
get(name: string): Specie | undefined;
|
|
66
63
|
[Symbol.iterator](): Generator<Specie, void, unknown>;
|
|
67
64
|
}
|
|
68
|
-
declare class Specie implements
|
|
65
|
+
export declare class Specie implements DexSpecies {
|
|
69
66
|
readonly id: ID;
|
|
70
67
|
readonly name: SpeciesName;
|
|
71
68
|
readonly fullname: string;
|
|
@@ -129,20 +126,20 @@ declare class Specie implements Species$1 {
|
|
|
129
126
|
readonly isCosmeticForme: boolean;
|
|
130
127
|
readonly dex: Dex;
|
|
131
128
|
static readonly EXCLUDE: Set<string>;
|
|
132
|
-
constructor(dex: Dex, exists: BoundExistsFn, species:
|
|
129
|
+
constructor(dex: Dex, exists: BoundExistsFn, species: DexSpecies);
|
|
133
130
|
get formeNum(): number;
|
|
134
131
|
toString(): SpeciesName;
|
|
135
132
|
toJSON(): {
|
|
136
133
|
[key: string]: any;
|
|
137
134
|
};
|
|
138
135
|
}
|
|
139
|
-
declare class Conditions {
|
|
136
|
+
export declare class Conditions {
|
|
140
137
|
readonly dex: Dex;
|
|
141
138
|
readonly exists: BoundExistsFn;
|
|
142
139
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
143
140
|
get(name: string): Condition | undefined;
|
|
144
141
|
}
|
|
145
|
-
declare class Natures {
|
|
142
|
+
export declare class Natures {
|
|
146
143
|
readonly dex: Dex;
|
|
147
144
|
readonly exists: BoundExistsFn;
|
|
148
145
|
constructor(dex: Dex, exists: BoundExistsFn);
|
|
@@ -154,7 +151,7 @@ type TypeTarget = {
|
|
|
154
151
|
} | {
|
|
155
152
|
types: TypeName[];
|
|
156
153
|
} | TypeName[] | TypeName;
|
|
157
|
-
declare class Types {
|
|
154
|
+
export declare class Types {
|
|
158
155
|
readonly cache: {
|
|
159
156
|
[id: string]: Type;
|
|
160
157
|
};
|
|
@@ -175,8 +172,8 @@ declare class Types {
|
|
|
175
172
|
type: TypeName;
|
|
176
173
|
} | TypeName, target: TypeTarget): number;
|
|
177
174
|
}
|
|
178
|
-
type TypeEffectiveness = 0 | 0.5 | 1 | 2;
|
|
179
|
-
declare class Type {
|
|
175
|
+
export type TypeEffectiveness = 0 | 0.5 | 1 | 2;
|
|
176
|
+
export declare class Type {
|
|
180
177
|
readonly id: ID;
|
|
181
178
|
readonly name: TypeName;
|
|
182
179
|
readonly effectType: 'Type';
|
|
@@ -190,7 +187,7 @@ declare class Type {
|
|
|
190
187
|
readonly HPdvs: Partial<StatsTable>;
|
|
191
188
|
readonly category?: Exclude<MoveCategory, 'Status'>;
|
|
192
189
|
readonly types: Types;
|
|
193
|
-
constructor(type:
|
|
190
|
+
constructor(type: DexType, dex: Dex, types: Types);
|
|
194
191
|
canDamage(target: TypeTarget): boolean;
|
|
195
192
|
totalEffectiveness(target: TypeTarget): number;
|
|
196
193
|
toString(): TypeName;
|
|
@@ -199,7 +196,7 @@ declare class Type {
|
|
|
199
196
|
};
|
|
200
197
|
}
|
|
201
198
|
type Restriction = 'Pentagon' | 'Plus' | 'Galar' | 'Paldea';
|
|
202
|
-
declare class Learnsets {
|
|
199
|
+
export declare class Learnsets {
|
|
203
200
|
readonly cache: {
|
|
204
201
|
[speciesid: string]: {
|
|
205
202
|
[moveid: string]: MoveSource[];
|
|
@@ -209,16 +206,16 @@ declare class Learnsets {
|
|
|
209
206
|
readonly dex: Dex;
|
|
210
207
|
readonly exists: BoundExistsFn;
|
|
211
208
|
constructor(gen: Generation, dex: Dex, exists: BoundExistsFn);
|
|
212
|
-
get(name: string): Promise<
|
|
213
|
-
[Symbol.iterator](): AsyncGenerator<
|
|
214
|
-
all(species: Specie): AsyncGenerator<
|
|
209
|
+
get(name: string): Promise<import("@pkmn/dex-types").Learnset | undefined>;
|
|
210
|
+
[Symbol.iterator](): AsyncGenerator<import("@pkmn/dex-types").Learnset, void, unknown>;
|
|
211
|
+
all(species: Specie): AsyncGenerator<import("@pkmn/dex-types").Learnset, void, unknown>;
|
|
215
212
|
learnable(name: string, restriction?: Restriction): Promise<{
|
|
216
213
|
[moveid: string]: string[];
|
|
217
214
|
} | undefined>;
|
|
218
215
|
canLearn(name: string, move: Move | string, restriction?: Restriction): Promise<boolean>;
|
|
219
216
|
isLegal(move: Move, sources: MoveSource[] | undefined, gen: Generation | Restriction): boolean | undefined;
|
|
220
217
|
}
|
|
221
|
-
declare class Stats {
|
|
218
|
+
export declare class Stats {
|
|
222
219
|
readonly dex: Dex;
|
|
223
220
|
constructor(dex: Dex);
|
|
224
221
|
calc(stat: StatID, base: number, iv?: number, ev?: number, level?: number, nature?: Nature): number;
|
|
@@ -230,5 +227,4 @@ declare class Stats {
|
|
|
230
227
|
toDV(iv: number): number;
|
|
231
228
|
toIV(dv: number): number;
|
|
232
229
|
}
|
|
233
|
-
|
|
234
|
-
export { Abilities, Conditions, type ExistsFn, Generation, Generations, Items, Learnsets, Moves, Natures, Specie, Species, Stats, Type, type TypeEffectiveness, Types, toID };
|
|
230
|
+
export type { ID, As, Weather, FieldCondition, SideCondition, GenerationNum, GenderName, StatID, StatsTable, BoostID, BoostsTable, MoveCategory, MoveTarget, Nonstandard, EvoType, EggGroup, SideID, Player, GameType, HPColor, StatusName, NatureName, TypeName, HPTypeName, Tier, PokemonSet, AbilityName, ItemName, MoveName, SpeciesName, FormeName, EffectType, Effect, DataKind, Data, EffectData, HitEffect, SecondaryEffect, ConditionData, AbilityData, ItemData, MoveData, SpeciesData, MoveSource, EventInfoData, LearnsetData, TypeData, NatureData, BasicEffect, Condition, Ability, Item, Move, EventInfo, Learnset, Nature, GenID, Dex, } from '@pkmn/dex-types';
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kjs/Code/src/github.com/pkmn/ps/data/build/index.js","../index.ts"],"names":[],"mappings":"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","file":"/Users/kjs/Code/src/github.com/pkmn/ps/data/build/index.js","sourcesContent":[null,"import {\n AbilityName,\n Condition,\n Data,\n Dex,\n Species as DexSpecies,\n Type as DexType,\n EggGroup,\n EvoType,\n FormeName,\n GenderName,\n GenerationNum,\n ID,\n ItemName,\n Move,\n MoveCategory,\n MoveName,\n MoveSource,\n Nature,\n Nonstandard,\n SpeciesAbility,\n SpeciesName,\n SpeciesTag,\n StatID,\n StatsTable,\n Tier,\n TypeName,\n} from '@pkmn/dex-types';\n\nconst DEFAULT_EXISTS = (d: Data) => {\n if (!d.exists) return false;\n if ('isNonstandard' in d && d.isNonstandard) return false;\n if (d.kind === 'Ability' && d.id === 'noability') return false;\n return !('tier' in d && ['Illegal', 'Unreleased'].includes(d.tier));\n};\n\nconst tr = (num: number, bits = 0) => bits ? (num >>> 0) % (2 ** bits) : num >>> 0;\n\nexport type ExistsFn = (d: Data, g: GenerationNum) => boolean;\ntype BoundExistsFn = (d: Data) => boolean;\n\nfunction assignWithout(a: {[key: string]: any}, b: {[key: string]: any}, exclude: Set<string>) {\n for (const key in b) {\n if (Object.prototype.hasOwnProperty.call(b, key) && !exclude.has(key)) {\n a[key] = b[key];\n }\n }\n return a;\n}\n\nexport function toID(text: any): ID {\n if (text?.id) text = text.id;\n if (typeof text !== 'string' && typeof text !== 'number') return '';\n return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as ID;\n}\n\nexport class Generations {\n /* private */ readonly cache = Object.create(null) as {[num: number]: Generation};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: ExistsFn;\n\n static DEFAULT_EXISTS = DEFAULT_EXISTS;\n\n constructor(dex: Dex, exists = Generations.DEFAULT_EXISTS) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(g: string | number) {\n // May not actually be a GenerationNum, but isNaN and Dex.forGen will validate the rest\n const gen = (typeof g === 'string' ? parseInt(g.slice(g.search(/\\d/))) : g) as GenerationNum;\n if (isNaN(+gen)) throw new Error(`Invalid gen ${g}`);\n if (this.cache[gen]) return this.cache[gen];\n return (this.cache[gen] = new Generation(this.dex.forGen(gen), d => this.exists(d, gen)));\n }\n\n *[Symbol.iterator]() {\n for (let gen = 1; gen <= 9; gen++) {\n yield this.get(gen as GenerationNum);\n }\n }\n}\n\nexport class Generation {\n readonly abilities: Abilities;\n readonly items: Items;\n readonly moves: Moves;\n readonly species: Species;\n readonly types: Types;\n readonly natures: Natures;\n readonly learnsets: Learnsets;\n readonly conditions: Conditions;\n readonly stats: Stats;\n\n readonly dex: Dex;\n\n /* private */ readonly exists: BoundExistsFn;\n\n static get(dex: Dex, g: string | number, exists = DEFAULT_EXISTS) {\n return new Generations(dex, exists).get(g);\n }\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n\n this.abilities = new Abilities(this.dex, this.exists);\n this.items = new Items(this.dex, this.exists);\n this.moves = new Moves(this.dex, this.exists);\n this.species = new Species(this.dex, this.exists);\n this.natures = new Natures(this.dex, this.exists);\n this.types = new Types(this.dex, this.exists);\n this.learnsets = new Learnsets(this, this.dex, this.exists);\n this.conditions = new Conditions(this.dex, this.exists);\n this.stats = new Stats(this.dex);\n }\n\n get num() {\n return this.dex.gen;\n }\n\n toString() {\n return `[Generation:${this.num}]`;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nexport class Abilities {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const ability = this.dex.abilities.get(name);\n return this.exists(ability) ? ability : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const ability in this.dex.data.Abilities) {\n const a = this.get(ability);\n if (a) yield a;\n }\n }\n}\n\nexport class Items {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const item = this.dex.items.get(name);\n return this.exists(item) ? item : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const item in this.dex.data.Items) {\n const i = this.get(item);\n if (i) yield i;\n }\n }\n}\n\nexport class Moves {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const move = this.dex.moves.get(name);\n return this.exists(move) ? move : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const move in this.dex.data.Moves) {\n const m = this.get(move);\n if (m) yield m;\n }\n }\n}\n\nexport class Species {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Specie};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const species = this.dex.species.get(name);\n if (!this.exists(species)) return undefined;\n const id = (species as any).speciesid || species.id; // FIXME Event-only ability hack\n const cached = this.cache[id];\n if (cached) return cached;\n return (this.cache[id] = new Specie(this.dex, this.exists, species));\n }\n\n *[Symbol.iterator]() {\n for (const species in this.dex.data.Species) {\n const s = this.get(species);\n if (s && !s.isCosmeticForme) yield s;\n }\n }\n}\n\nexport class Specie implements DexSpecies {\n readonly id!: ID;\n readonly name!: SpeciesName;\n readonly fullname!: string;\n readonly exists!: boolean;\n readonly num!: number;\n readonly gen!: GenerationNum;\n readonly shortDesc!: string;\n readonly desc!: string;\n readonly isNonstandard!: Nonstandard | null;\n readonly duration?: number;\n\n readonly effectType!: 'Pokemon';\n readonly kind!: 'Species';\n readonly baseStats!: StatsTable;\n readonly baseSpecies!: SpeciesName;\n readonly baseForme!: FormeName | '';\n readonly forme!: FormeName | '';\n readonly abilities!: SpeciesAbility<AbilityName | ''>;\n readonly types!: [TypeName] | [TypeName, TypeName];\n readonly prevo?: SpeciesName | '';\n readonly evos?: SpeciesName[];\n readonly nfe: boolean;\n readonly eggGroups!: EggGroup[];\n readonly weightkg!: number;\n readonly weighthg!: number;\n readonly tags!: SpeciesTag[];\n readonly unreleasedHidden!: boolean | 'Past';\n readonly maleOnlyHidden!: boolean;\n readonly inheritsFrom!: ID;\n readonly tier!: Tier.Singles | Tier.Other;\n readonly doublesTier!: Tier.Doubles | Tier.Other;\n readonly natDexTier!: Tier.Singles | Tier.Other;\n\n readonly changesFrom?: SpeciesName;\n readonly cosmeticFormes?: SpeciesName[];\n readonly otherFormes?: SpeciesName[];\n readonly formeOrder?: SpeciesName[];\n readonly formes?: SpeciesName[];\n readonly genderRatio: {M: number; F: number};\n readonly isMega?: boolean;\n readonly isPrimal?: boolean;\n readonly battleOnly?: SpeciesName | SpeciesName[];\n readonly canGigantamax?: MoveName;\n readonly gmaxUnreleased?: boolean;\n readonly cannotDynamax?: boolean;\n readonly requiredAbility?: AbilityName;\n readonly requiredItem?: ItemName;\n readonly requiredItems?: ItemName[];\n readonly requiredMove?: MoveName;\n readonly gender?: GenderName;\n readonly maxHP?: number;\n readonly evoMove?: MoveName;\n readonly evoItem?: string;\n readonly evoRegion?: 'Alola' | 'Galar';\n readonly evoLevel?: number;\n readonly evoCondition?: string;\n readonly evoType?: EvoType;\n readonly condition?: Partial<Condition>;\n readonly canHatch!: boolean;\n readonly isCosmeticForme!: boolean;\n\n /* private */ readonly dex: Dex;\n\n /* private */ static readonly EXCLUDE = new Set([\n 'abilities', 'cosmeticFormes', 'evos', 'formeOrder',\n 'gender', 'genderRatio', 'nfe', 'otherFormes', 'prevo',\n ]);\n\n constructor(dex: Dex, exists: BoundExistsFn, species: DexSpecies) {\n assignWithout(this, species, Specie.EXCLUDE);\n this.dex = dex;\n if (this.dex.gen >= 2) {\n this.gender = species.gender;\n this.genderRatio = species.genderRatio;\n } else {\n this.genderRatio = {M: 0, F: 0};\n }\n if (this.dex.gen >= 3) {\n this.abilities = {0: species.abilities[0]};\n // \"because PS\", Pokemon have the abilities that were added in Gen 4 in Gen 3 :bigthonk:\n if (species.abilities[1] &&\n this.dex.abilities.get(species.abilities[1]).gen <= this.dex.gen) {\n this.abilities[1] = species.abilities[1];\n }\n if (this.dex.gen >= 5 && species.abilities.H) this.abilities.H = species.abilities.H;\n if (this.dex.gen >= 7 && species.abilities.S) this.abilities.S = species.abilities.S;\n } else {\n this.abilities = {0: ''};\n }\n this.evos = species.evos?.filter(s => exists(this.dex.species.get(s)));\n this.nfe = !!this.evos?.length;\n if (!this.nfe) this.evos = undefined;\n this.cosmeticFormes = species.cosmeticFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.cosmeticFormes?.length) this.cosmeticFormes = undefined;\n this.otherFormes = species.otherFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.otherFormes?.length) this.otherFormes = undefined;\n this.formeOrder = species.formeOrder?.filter(s => exists(this.dex.species.get(s)));\n if (!this.formeOrder || this.formeOrder.length <= 1) this.formeOrder = undefined;\n this.formes = this.formeOrder?.filter(s =>\n this.dex.species.get(s).isNonstandard !== 'Gigantamax');\n this.prevo =\n species.prevo && exists(this.dex.species.get(species.prevo)) ? species.prevo : undefined;\n }\n\n get formeNum() {\n return (this.baseSpecies === this.name\n ? this.formeOrder ? this.formeOrder.findIndex(name => name === this.name) : 0\n : this.dex.species.get(this.baseSpecies).formeOrder!.findIndex(\n name => name === (this.isNonstandard === 'Gigantamax' ? this.baseSpecies : this.name)\n ));\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['dex']));\n }\n}\n\nexport class Conditions {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const condition = this.dex.conditions.get(name);\n return this.exists(condition) ? condition : undefined;\n }\n}\n\nexport class Natures {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n if (this.dex.gen < 3) return undefined;\n const nature = this.dex.natures.get(name);\n return this.exists(nature) ? nature : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const nature in this.dex.data.Natures) {\n const n = this.get(nature);\n if (n) yield n;\n }\n }\n}\n\nconst EFFECTIVENESS = {\n '-3': 0.125,\n '-2': 0.25,\n '-1': 0.5,\n '0': 1,\n '1': 2,\n '2': 4,\n '3': 8,\n};\n\ntype TypeTarget = {getTypes: () => TypeName[]} | {types: TypeName[]} | TypeName[] | TypeName;\n\nexport class Types {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Type};\n\n /* private */ readonly unknown: Type;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n // PS doesn't contain data for the '???' type\n this.unknown = new Type({\n effectType: 'Type',\n kind: 'Type',\n // Regrettably PS ID's can't represent '???'\n id: '',\n name: '???',\n // Technically this only exists as a true type in Gens 2-4, but there are moves dealing\n // typeless damage in Gen 1 so we include it there.\n exists: dex.gen <= 4,\n gen: 1,\n // This gets filled in for us by Type's constructor\n damageTaken: {} as {[t in Exclude<TypeName, '???'>]: number},\n HPivs: {},\n HPdvs: {},\n }, dex, this);\n }\n\n get(name: string) {\n if (name === '???' && this.dex.gen >= 2 && this.dex.gen <= 4) return this.unknown;\n const type = this.dex.types.get(name);\n if (!this.exists(type)) return undefined;\n const cached = this.cache[type.id];\n if (cached) return cached;\n return (this.cache[type.id] = new Type(type, this.dex, this));\n }\n\n *[Symbol.iterator]() {\n for (const type in this.dex.data.Types) {\n const t = this.get(type);\n if (t) yield t;\n }\n if (this.dex.gen >= 2 && this.dex.gen <= 4) {\n yield this.unknown;\n }\n }\n\n getHiddenPower(ivs: StatsTable) {\n return this.dex.getHiddenPower(ivs);\n }\n\n canDamage(source: {type: TypeName} | TypeName, target: TypeTarget) {\n return this.dex.getImmunity(source, target);\n }\n\n totalEffectiveness(source: {type: TypeName} | TypeName, target: TypeTarget) {\n if (!this.canDamage(source, target)) return 0;\n const e = `${this.dex.getEffectiveness(source, target)}`;\n // convert from PS's ridiculous encoding to something usable\n return EFFECTIVENESS[e as keyof typeof EFFECTIVENESS];\n }\n}\n\nexport type TypeEffectiveness = 0 | 0.5 | 1 | 2;\n\nconst DAMAGE_TAKEN = [1, 2, 0.5, 0] as TypeEffectiveness[];\nconst SPECIAL = ['Fire', 'Water', 'Grass', 'Electric', 'Ice', 'Psychic', 'Dark', 'Dragon'];\n\nexport class Type {\n readonly id!: ID;\n readonly name!: TypeName;\n readonly effectType!: 'Type';\n readonly kind!: 'Type';\n readonly exists!: boolean;\n readonly gen!: GenerationNum;\n readonly effectiveness: {[t in TypeName]: TypeEffectiveness};\n readonly HPivs!: Partial<StatsTable>;\n readonly HPdvs!: Partial<StatsTable>;\n readonly category?: Exclude<MoveCategory, 'Status'>;\n\n /* private */ readonly types: Types;\n\n constructor(type: DexType, dex: Dex, types: Types) {\n Object.assign(this, type);\n this.types = types;\n this.category = ['Fairy', 'Stellar'].includes(this.name)\n ? undefined : SPECIAL.includes(this.name) ? 'Special' : 'Physical';\n // convert from PS's ridiculous encoding to something usable (plus damage taken -> dealt)\n this.effectiveness = {'???': 1} as {[t in TypeName]: TypeEffectiveness};\n for (const k in dex.data.Types) {\n const t = k.charAt(0).toUpperCase() + k.slice(1) as Exclude<TypeName, '???'>;\n const data = dex.data.Types[k as Lowercase<string>];\n this.effectiveness[t] = DAMAGE_TAKEN[data.damageTaken[this.name] || 0];\n }\n }\n\n canDamage(target: TypeTarget) {\n return this.types.canDamage(this.name, target);\n }\n\n totalEffectiveness(target: TypeTarget) {\n return this.types.totalEffectiveness(this.name, target);\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['types']));\n }\n}\n\nconst GEN3_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'flash', 'rocksmash', 'waterfall', 'dive'] as ID[]);\n// NOTE: Whirlpool and Defog are Gen 4 HMs but the HMs differ in DPPt vs. HGSS\nconst GEN4_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'rocksmash', 'waterfall', 'rockclimb'] as ID[]);\n\ntype Restriction = 'Pentagon' | 'Plus' | 'Galar' | 'Paldea';\n\nexport class Learnsets {\n /* private */ readonly cache = Object.create(null) as {\n [speciesid: string]: {[moveid: string]: MoveSource[]};\n };\n\n /* private */ readonly gen: Generation;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(gen: Generation, dex: Dex, exists: BoundExistsFn) {\n this.gen = gen;\n this.dex = dex;\n this.exists = exists;\n }\n\n async get(name: string) {\n const learnset = await this.dex.learnsets.get(toID(name));\n return this.exists(learnset) ? learnset : undefined;\n }\n\n async *[Symbol.iterator]() {\n if (!this.dex.data.Learnsets) await this.dex.learnsets.get('LOAD' as ID);\n for (const id in this.dex.data.Learnsets) {\n const l = await this.get(id);\n if (l) yield l;\n }\n }\n\n async* all(species: Specie) {\n let id = species.id;\n let learnset = await this.get(id);\n if (!learnset) {\n id = typeof species.battleOnly === 'string' && species.battleOnly !== species.baseSpecies\n ? toID(species.battleOnly)\n : toID(species.baseSpecies);\n learnset = await this.get(id);\n }\n\n while (learnset) {\n yield learnset;\n\n if (id === 'lycanrocdusk' || (species.id === 'rockruff' && id === 'rockruff')) {\n id = 'rockruffdusk' as ID;\n } else if (species.id === 'gastrodoneast') {\n id = 'gastrodon' as ID;\n } else if (species.id === 'pumpkaboosuper') {\n id = 'pumpkaboo' as ID;\n } else {\n id = toID(species.battleOnly || species.changesFrom || species.prevo);\n }\n\n if (!id) break;\n const s = this.gen.species.get(id);\n if (!s) break;\n species = s;\n learnset = await this.get(id);\n }\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async learnable(name: string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return undefined;\n\n if (!restriction) {\n const cached = this.cache[species.id];\n if (cached) return cached;\n }\n\n const moves: {[moveid: string]: MoveSource[]} = {};\n\n for await (const learnset of this.all(species)) {\n if (learnset.learnset) {\n for (const moveid in learnset.learnset) {\n const move = this.gen.moves.get(moveid);\n if (move) {\n const sources = learnset.learnset[moveid];\n if (this.isLegal(move, sources, restriction || this.gen)) {\n const filtered = sources.filter(s => +s.charAt(0) <= this.gen.num);\n if (!filtered.length) continue;\n if (moves[move.id]) {\n // If we simply add filtered to moves[move.id] we may end up with some duplicates or\n // situations where we have mixed learnset information. We assume that while\n // moves[move.id] and filtered are already deduped, their union might not be, and\n // thus iterate through looking for unique prefixes. For efficiency, instead of\n // appending each deduped source from filtered to moves[move.id] immediately and\n // making each subsequent iteration longer we make a list of the unique sources to\n // add at the end. This is only safe given our assumption that filtered is unique\n // internally to begin with.\n const unique = [];\n // These lists are all expected to be short arrays so this O(n^2) linear searching\n // is still expected to be faster runtime-wise than a more sophisticated approach\n loop: for (const source of filtered) {\n const prefix = source.slice(0, 2);\n // sadly Babel chokes on using an .every(...) here due to throwIfClosureRequired\n for (const s of moves[move.id]) if (s.startsWith(prefix)) continue loop;\n unique.push(source);\n }\n moves[move.id].push(...unique);\n } else {\n moves[move.id] = filtered;\n }\n }\n }\n }\n }\n }\n\n if (!restriction) this.cache[species.id] = moves;\n return moves;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async canLearn(name: string, move: Move | string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return false;\n\n move = typeof move === 'string' && this.gen.moves.get(move) || move;\n if (typeof move === 'string') return false;\n\n for await (const learnset of this.all(species)) {\n if (this.isLegal(move, learnset.learnset?.[move.id], restriction || this.gen)) {\n return true;\n }\n }\n\n return false;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n isLegal(move: Move, sources: MoveSource[] | undefined, gen: Generation | Restriction) {\n if (!sources) return undefined;\n\n const gens = sources.map(x => Number(x[0]));\n const minGen = Math.min(...gens);\n const vcOnly = (\n minGen === 7 && sources.every(x => x[0] !== '7' || x === '7V') ||\n minGen === 8 && sources.every(x => x[0] !== '8' || x === '8V')\n );\n\n if (gen === 'Pentagon') return gens.includes(6);\n if (gen === 'Plus') return gens.includes(7) && !vcOnly;\n if (gen === 'Galar') return gens.includes(8) && !vcOnly;\n if (gen === 'Paldea') return gens.includes(9);\n\n if (this.gen.num >= 3 && minGen <= 4 && (GEN3_HMS.has(move.id) || GEN4_HMS.has(move.id))) {\n let legalGens = '';\n let available = false;\n\n if (minGen === 3) {\n legalGens += '3';\n available = true;\n }\n if (available) available = !GEN3_HMS.has(move.id);\n\n if (available || gens.includes(4)) {\n legalGens += '4';\n available = true;\n }\n if (available) available = !GEN4_HMS.has(move.id);\n\n const minUpperGen = available ? 5 : Math.min(...gens.filter(g => g > 4));\n legalGens += '0123456789'.slice(minUpperGen);\n return legalGens.includes(`${gen.num}`);\n } else {\n return '0123456789'.slice(minGen).includes(`${gen.num}`);\n }\n }\n}\n\nconst STATS = ['hp', 'atk', 'def', 'spe', 'spa', 'spd'] as const;\n\nconst NAMES: Readonly<{[name: string]: StatID}> = {\n HP: 'hp', hp: 'hp',\n Attack: 'atk', Atk: 'atk', atk: 'atk',\n Defense: 'def', Def: 'def', def: 'def',\n 'Special Attack': 'spa', SpA: 'spa', SAtk: 'spa', SpAtk: 'spa', spa: 'spa',\n Special: 'spa', spc: 'spa', Spc: 'spa',\n 'Special Defense': 'spd', SpD: 'spd', SDef: 'spd', SpDef: 'spd', spd: 'spd',\n Speed: 'spe', Spe: 'spe', Spd: 'spe', spe: 'spe',\n};\n\nconst DISPLAY: Readonly<{[stat: string]: Readonly<[string, string]>}> = {\n hp: ['HP', 'HP'],\n atk: ['Atk', 'Attack'],\n def: ['Def', 'Defense'],\n spa: ['SpA', 'Special Attack'],\n spd: ['SpD', 'Special Defense'],\n spe: ['Spe', 'Speed'],\n spc: ['Spc', 'Special'],\n};\n\nexport class Stats {\n /* private */ readonly dex: Dex;\n\n constructor(dex: Dex) {\n this.dex = dex;\n }\n\n calc(stat: StatID, base: number, iv = 31, ev?: number, level = 100, nature?: Nature) {\n if (ev === undefined) ev = this.dex.gen < 3 ? 252 : 0;\n if (this.dex.gen < 3) {\n iv = this.toDV(iv) * 2;\n nature = undefined;\n }\n if (stat === 'hp') {\n return base === 1 ? base : tr(tr(2 * base + iv + tr(ev / 4) + 100) * level / 100 + 10);\n } else {\n const val = tr(tr(2 * base + iv + tr(ev / 4)) * level / 100 + 5);\n if (nature !== undefined) {\n if (nature.plus === stat) return tr(tr(val * 110, 16) / 100);\n if (nature.minus === stat) return tr(tr(val * 90, 16) / 100);\n }\n return val;\n }\n }\n\n get(s: string): StatID | undefined {\n return NAMES[s];\n }\n\n display(str: string, full = false): string {\n let s: StatID | 'spc' | undefined = NAMES[str];\n if (s === undefined) return str;\n if (this.dex.gen === 1 && s === 'spa') s = 'spc';\n return DISPLAY[s][+full];\n }\n\n fill<T>(stats: Partial<StatsTable<T>>, val: T): StatsTable<T> {\n for (const stat of STATS) {\n if (!(stat in stats)) stats[stat] = val;\n }\n return stats as StatsTable<T>;\n }\n\n getHPDV(ivs: Partial<StatsTable>): number {\n return (\n (this.toDV(ivs.atk === undefined ? 31 : ivs.atk) % 2) * 8 +\n (this.toDV(ivs.def === undefined ? 31 : ivs.def) % 2) * 4 +\n (this.toDV(ivs.spe === undefined ? 31 : ivs.spe) % 2) * 2 +\n (this.toDV(ivs.spa === undefined ? 31 : ivs.spa) % 2)\n );\n }\n\n *[Symbol.iterator](): IterableIterator<StatID> {\n for (const s of STATS) {\n yield s;\n }\n }\n\n toDV(iv: number): number {\n return Math.floor(iv / 2);\n }\n\n toIV(dv: number): number {\n return dv * 2 + 1;\n }\n}\n\nexport type {\n ID,\n As,\n Weather,\n FieldCondition,\n SideCondition,\n GenerationNum,\n GenderName,\n StatID,\n StatsTable,\n BoostID,\n BoostsTable,\n MoveCategory,\n MoveTarget,\n Nonstandard,\n EvoType,\n EggGroup,\n SideID,\n Player,\n GameType,\n HPColor,\n StatusName,\n NatureName,\n TypeName,\n HPTypeName,\n Tier,\n PokemonSet,\n AbilityName,\n ItemName,\n MoveName,\n SpeciesName,\n FormeName,\n EffectType,\n Effect,\n DataKind,\n Data,\n EffectData,\n HitEffect,\n SecondaryEffect,\n ConditionData,\n AbilityData,\n ItemData,\n MoveData,\n SpeciesData,\n MoveSource,\n EventInfoData,\n LearnsetData,\n TypeData,\n NatureData,\n BasicEffect,\n Condition,\n Ability,\n Item,\n Move,\n // Species,\n EventInfo,\n Learnset,\n // Type,\n Nature,\n GenID,\n Dex,\n} from '@pkmn/dex-types';\n"]}
|
|
1
|
+
{"version":3,"sources":["/Users/kjs/Code/src/github.com/pkmn/ps/data/build/index.js","../index.ts"],"names":[],"mappings":"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","file":"/Users/kjs/Code/src/github.com/pkmn/ps/data/build/index.js","sourcesContent":[null,"import {\n AbilityName,\n Condition,\n Data,\n Dex,\n Species as DexSpecies,\n Type as DexType,\n EggGroup,\n EvoType,\n FormeName,\n GenderName,\n GenerationNum,\n ID,\n ItemName,\n Move,\n MoveCategory,\n MoveName,\n MoveSource,\n Nature,\n Nonstandard,\n SpeciesAbility,\n SpeciesName,\n SpeciesTag,\n StatID,\n StatsTable,\n Tier,\n TypeName,\n} from '@pkmn/dex-types';\n\nconst DEFAULT_EXISTS = (d: Data) => {\n if (!d.exists) return false;\n if ('isNonstandard' in d && d.isNonstandard) return false;\n if (d.kind === 'Ability' && d.id === 'noability') return false;\n return !('tier' in d && ['Illegal', 'Unreleased'].includes(d.tier));\n};\n\nconst tr = (num: number, bits = 0) => bits ? (num >>> 0) % (2 ** bits) : num >>> 0;\n\nexport type ExistsFn = (d: Data, g: GenerationNum) => boolean;\ntype BoundExistsFn = (d: Data) => boolean;\n\nfunction assignWithout(a: {[key: string]: any}, b: {[key: string]: any}, exclude: Set<string>) {\n for (const key in b) {\n if (Object.prototype.hasOwnProperty.call(b, key) && !exclude.has(key)) {\n a[key] = b[key];\n }\n }\n return a;\n}\n\nexport function toID(text: any): ID {\n if (text?.id) text = text.id;\n if (typeof text !== 'string' && typeof text !== 'number') return '';\n return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as ID;\n}\n\nexport class Generations {\n /* private */ readonly cache = Object.create(null) as {[num: number]: Generation};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: ExistsFn;\n\n static DEFAULT_EXISTS = DEFAULT_EXISTS;\n\n constructor(dex: Dex, exists = Generations.DEFAULT_EXISTS) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(g: string | number) {\n // May not actually be a GenerationNum, but isNaN and Dex.forGen will validate the rest\n const gen = (typeof g === 'string' ? parseInt(g.slice(g.search(/\\d/))) : g) as GenerationNum;\n if (isNaN(+gen)) throw new Error(`Invalid gen ${g}`);\n if (this.cache[gen]) return this.cache[gen];\n return (this.cache[gen] = new Generation(this.dex.forGen(gen), d => this.exists(d, gen)));\n }\n\n *[Symbol.iterator]() {\n for (let gen = 1; gen <= 9; gen++) {\n yield this.get(gen);\n }\n }\n}\n\nexport class Generation {\n readonly abilities: Abilities;\n readonly items: Items;\n readonly moves: Moves;\n readonly species: Species;\n readonly types: Types;\n readonly natures: Natures;\n readonly learnsets: Learnsets;\n readonly conditions: Conditions;\n readonly stats: Stats;\n\n readonly dex: Dex;\n\n /* private */ readonly exists: BoundExistsFn;\n\n static get(dex: Dex, g: string | number, exists = DEFAULT_EXISTS) {\n return new Generations(dex, exists).get(g);\n }\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n\n this.abilities = new Abilities(this.dex, this.exists);\n this.items = new Items(this.dex, this.exists);\n this.moves = new Moves(this.dex, this.exists);\n this.species = new Species(this.dex, this.exists);\n this.natures = new Natures(this.dex, this.exists);\n this.types = new Types(this.dex, this.exists);\n this.learnsets = new Learnsets(this, this.dex, this.exists);\n this.conditions = new Conditions(this.dex, this.exists);\n this.stats = new Stats(this.dex);\n }\n\n get num() {\n return this.dex.gen;\n }\n\n toString() {\n return `[Generation:${this.num}]`;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nexport class Abilities {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const ability = this.dex.abilities.get(name);\n return this.exists(ability) ? ability : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const ability in this.dex.data.Abilities) {\n const a = this.get(ability);\n if (a) yield a;\n }\n }\n}\n\nexport class Items {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const item = this.dex.items.get(name);\n return this.exists(item) ? item : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const item in this.dex.data.Items) {\n const i = this.get(item);\n if (i) yield i;\n }\n }\n}\n\nexport class Moves {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const move = this.dex.moves.get(name);\n return this.exists(move) ? move : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const move in this.dex.data.Moves) {\n const m = this.get(move);\n if (m) yield m;\n }\n }\n}\n\nexport class Species {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Specie};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const species = this.dex.species.get(name);\n if (!this.exists(species)) return undefined;\n const id = (species as any).speciesid || species.id; // FIXME Event-only ability hack\n const cached = this.cache[id];\n if (cached) return cached;\n return (this.cache[id] = new Specie(this.dex, this.exists, species));\n }\n\n *[Symbol.iterator]() {\n for (const species in this.dex.data.Species) {\n const s = this.get(species);\n if (s && !s.isCosmeticForme) yield s;\n }\n }\n}\n\nexport class Specie implements DexSpecies {\n readonly id!: ID;\n readonly name!: SpeciesName;\n readonly fullname!: string;\n readonly exists!: boolean;\n readonly num!: number;\n readonly gen!: GenerationNum;\n readonly shortDesc!: string;\n readonly desc!: string;\n readonly isNonstandard!: Nonstandard | null;\n readonly duration?: number;\n\n readonly effectType!: 'Pokemon';\n readonly kind!: 'Species';\n readonly baseStats!: StatsTable;\n readonly baseSpecies!: SpeciesName;\n readonly baseForme!: FormeName | '';\n readonly forme!: FormeName | '';\n readonly abilities!: SpeciesAbility<AbilityName | ''>;\n readonly types!: [TypeName] | [TypeName, TypeName];\n readonly prevo?: SpeciesName | '';\n readonly evos?: SpeciesName[];\n readonly nfe: boolean;\n readonly eggGroups!: EggGroup[];\n readonly weightkg!: number;\n readonly weighthg!: number;\n readonly tags!: SpeciesTag[];\n readonly unreleasedHidden!: boolean | 'Past';\n readonly maleOnlyHidden!: boolean;\n readonly inheritsFrom!: ID;\n readonly tier!: Tier.Singles | Tier.Other;\n readonly doublesTier!: Tier.Doubles | Tier.Other;\n readonly natDexTier!: Tier.Singles | Tier.Other;\n\n readonly changesFrom?: SpeciesName;\n readonly cosmeticFormes?: SpeciesName[];\n readonly otherFormes?: SpeciesName[];\n readonly formeOrder?: SpeciesName[];\n readonly formes?: SpeciesName[];\n readonly genderRatio: {M: number; F: number};\n readonly isMega?: boolean;\n readonly isPrimal?: boolean;\n readonly battleOnly?: SpeciesName | SpeciesName[];\n readonly canGigantamax?: MoveName;\n readonly gmaxUnreleased?: boolean;\n readonly cannotDynamax?: boolean;\n readonly requiredAbility?: AbilityName;\n readonly requiredItem?: ItemName;\n readonly requiredItems?: ItemName[];\n readonly requiredMove?: MoveName;\n readonly gender?: GenderName;\n readonly maxHP?: number;\n readonly evoMove?: MoveName;\n readonly evoItem?: string;\n readonly evoRegion?: 'Alola' | 'Galar';\n readonly evoLevel?: number;\n readonly evoCondition?: string;\n readonly evoType?: EvoType;\n readonly condition?: Partial<Condition>;\n readonly canHatch!: boolean;\n readonly isCosmeticForme!: boolean;\n\n /* private */ readonly dex: Dex;\n\n /* private */ static readonly EXCLUDE = new Set([\n 'abilities', 'cosmeticFormes', 'evos', 'formeOrder',\n 'gender', 'genderRatio', 'nfe', 'otherFormes', 'prevo',\n ]);\n\n constructor(dex: Dex, exists: BoundExistsFn, species: DexSpecies) {\n assignWithout(this, species, Specie.EXCLUDE);\n this.dex = dex;\n if (this.dex.gen >= 2) {\n this.gender = species.gender;\n this.genderRatio = species.genderRatio;\n } else {\n this.genderRatio = {M: 0, F: 0};\n }\n if (this.dex.gen >= 3) {\n this.abilities = {0: species.abilities[0]};\n // \"because PS\", Pokemon have the abilities that were added in Gen 4 in Gen 3 :bigthonk:\n if (species.abilities[1] &&\n this.dex.abilities.get(species.abilities[1]).gen <= this.dex.gen) {\n this.abilities[1] = species.abilities[1];\n }\n if (this.dex.gen >= 5 && species.abilities.H) this.abilities.H = species.abilities.H;\n if (this.dex.gen >= 7 && species.abilities.S) this.abilities.S = species.abilities.S;\n } else {\n this.abilities = {0: ''};\n }\n this.evos = species.evos?.filter(s => exists(this.dex.species.get(s)));\n this.nfe = !!this.evos?.length;\n if (!this.nfe) this.evos = undefined;\n this.cosmeticFormes = species.cosmeticFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.cosmeticFormes?.length) this.cosmeticFormes = undefined;\n this.otherFormes = species.otherFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.otherFormes?.length) this.otherFormes = undefined;\n this.formeOrder = species.formeOrder?.filter(s => exists(this.dex.species.get(s)));\n if (!this.formeOrder || this.formeOrder.length <= 1) this.formeOrder = undefined;\n this.formes = this.formeOrder?.filter(s =>\n this.dex.species.get(s).isNonstandard !== 'Gigantamax');\n this.prevo =\n species.prevo && exists(this.dex.species.get(species.prevo)) ? species.prevo : undefined;\n }\n\n get formeNum() {\n return (this.baseSpecies === this.name\n ? this.formeOrder ? this.formeOrder.findIndex(name => name === this.name) : 0\n : this.dex.species.get(this.baseSpecies).formeOrder!.findIndex(\n name => name === (this.isNonstandard === 'Gigantamax' ? this.baseSpecies : this.name)\n ));\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['dex']));\n }\n}\n\nexport class Conditions {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const condition = this.dex.conditions.get(name);\n return this.exists(condition) ? condition : undefined;\n }\n}\n\nexport class Natures {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n if (this.dex.gen < 3) return undefined;\n const nature = this.dex.natures.get(name);\n return this.exists(nature) ? nature : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const nature in this.dex.data.Natures) {\n const n = this.get(nature);\n if (n) yield n;\n }\n }\n}\n\nconst EFFECTIVENESS = {\n '-3': 0.125,\n '-2': 0.25,\n '-1': 0.5,\n '0': 1,\n '1': 2,\n '2': 4,\n '3': 8,\n};\n\ntype TypeTarget = {getTypes: () => TypeName[]} | {types: TypeName[]} | TypeName[] | TypeName;\n\nexport class Types {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Type};\n\n /* private */ readonly unknown: Type;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n // PS doesn't contain data for the '???' type\n this.unknown = new Type({\n effectType: 'Type',\n kind: 'Type',\n // Regrettably PS ID's can't represent '???'\n id: '',\n name: '???',\n // Technically this only exists as a true type in Gens 2-4, but there are moves dealing\n // typeless damage in Gen 1 so we include it there.\n exists: dex.gen <= 4,\n gen: 1,\n // This gets filled in for us by Type's constructor\n damageTaken: {} as {[t in Exclude<TypeName, '???'>]: number},\n HPivs: {},\n HPdvs: {},\n }, dex, this);\n }\n\n get(name: string) {\n if (name === '???' && this.dex.gen >= 2 && this.dex.gen <= 4) return this.unknown;\n const type = this.dex.types.get(name);\n if (!this.exists(type)) return undefined;\n const cached = this.cache[type.id];\n if (cached) return cached;\n return (this.cache[type.id] = new Type(type, this.dex, this));\n }\n\n *[Symbol.iterator]() {\n for (const type in this.dex.data.Types) {\n const t = this.get(type);\n if (t) yield t;\n }\n if (this.dex.gen >= 2 && this.dex.gen <= 4) {\n yield this.unknown;\n }\n }\n\n getHiddenPower(ivs: StatsTable) {\n return this.dex.getHiddenPower(ivs);\n }\n\n canDamage(source: {type: TypeName} | TypeName, target: TypeTarget) {\n return this.dex.getImmunity(source, target);\n }\n\n totalEffectiveness(source: {type: TypeName} | TypeName, target: TypeTarget) {\n if (!this.canDamage(source, target)) return 0;\n const e = `${this.dex.getEffectiveness(source, target)}`;\n // convert from PS's ridiculous encoding to something usable\n return EFFECTIVENESS[e as keyof typeof EFFECTIVENESS];\n }\n}\n\nexport type TypeEffectiveness = 0 | 0.5 | 1 | 2;\n\nconst DAMAGE_TAKEN = [1, 2, 0.5, 0] as TypeEffectiveness[];\nconst SPECIAL = ['Fire', 'Water', 'Grass', 'Electric', 'Ice', 'Psychic', 'Dark', 'Dragon'];\n\nexport class Type {\n readonly id!: ID;\n readonly name!: TypeName;\n readonly effectType!: 'Type';\n readonly kind!: 'Type';\n readonly exists!: boolean;\n readonly gen!: GenerationNum;\n readonly effectiveness: {[t in TypeName]: TypeEffectiveness};\n readonly HPivs!: Partial<StatsTable>;\n readonly HPdvs!: Partial<StatsTable>;\n readonly category?: Exclude<MoveCategory, 'Status'>;\n\n /* private */ readonly types: Types;\n\n constructor(type: DexType, dex: Dex, types: Types) {\n Object.assign(this, type);\n this.types = types;\n this.category = ['Fairy', 'Stellar'].includes(this.name)\n ? undefined : SPECIAL.includes(this.name) ? 'Special' : 'Physical';\n // convert from PS's ridiculous encoding to something usable (plus damage taken -> dealt)\n this.effectiveness = {'???': 1} as {[t in TypeName]: TypeEffectiveness};\n for (const k in dex.data.Types) {\n const t = k.charAt(0).toUpperCase() + k.slice(1) as Exclude<TypeName, '???'>;\n const data = dex.data.Types[k as Lowercase<string>];\n this.effectiveness[t] = DAMAGE_TAKEN[data.damageTaken[this.name] || 0];\n }\n }\n\n canDamage(target: TypeTarget) {\n return this.types.canDamage(this.name, target);\n }\n\n totalEffectiveness(target: TypeTarget) {\n return this.types.totalEffectiveness(this.name, target);\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['types']));\n }\n}\n\nconst GEN3_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'flash', 'rocksmash', 'waterfall', 'dive'] as ID[]);\n// NOTE: Whirlpool and Defog are Gen 4 HMs but the HMs differ in DPPt vs. HGSS\nconst GEN4_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'rocksmash', 'waterfall', 'rockclimb'] as ID[]);\n\ntype Restriction = 'Pentagon' | 'Plus' | 'Galar' | 'Paldea';\n\nexport class Learnsets {\n /* private */ readonly cache = Object.create(null) as {\n [speciesid: string]: {[moveid: string]: MoveSource[]};\n };\n\n /* private */ readonly gen: Generation;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(gen: Generation, dex: Dex, exists: BoundExistsFn) {\n this.gen = gen;\n this.dex = dex;\n this.exists = exists;\n }\n\n async get(name: string) {\n const learnset = await this.dex.learnsets.get(toID(name));\n return this.exists(learnset) ? learnset : undefined;\n }\n\n async *[Symbol.iterator]() {\n if (!this.dex.data.Learnsets) await this.dex.learnsets.get('LOAD');\n for (const id in this.dex.data.Learnsets) {\n const l = await this.get(id);\n if (l) yield l;\n }\n }\n\n async* all(species: Specie) {\n let id = species.id;\n let learnset = await this.get(id);\n if (!learnset) {\n id = typeof species.battleOnly === 'string' && species.battleOnly !== species.baseSpecies\n ? toID(species.battleOnly)\n : toID(species.baseSpecies);\n learnset = await this.get(id);\n }\n\n while (learnset) {\n yield learnset;\n\n if (id === 'lycanrocdusk' || (species.id === 'rockruff' && id === 'rockruff')) {\n id = 'rockruffdusk' as ID;\n } else if (species.id === 'gastrodoneast') {\n id = 'gastrodon' as ID;\n } else if (species.id === 'pumpkaboosuper') {\n id = 'pumpkaboo' as ID;\n } else {\n id = toID(species.battleOnly || species.changesFrom || species.prevo);\n }\n\n if (!id) break;\n const s = this.gen.species.get(id);\n if (!s) break;\n species = s;\n learnset = await this.get(id);\n }\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async learnable(name: string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return undefined;\n\n if (!restriction) {\n const cached = this.cache[species.id];\n if (cached) return cached;\n }\n\n const moves: {[moveid: string]: MoveSource[]} = {};\n\n for await (const learnset of this.all(species)) {\n if (learnset.learnset) {\n for (const moveid in learnset.learnset) {\n const move = this.gen.moves.get(moveid);\n if (move) {\n const sources = learnset.learnset[moveid];\n if (this.isLegal(move, sources, restriction || this.gen)) {\n const filtered = sources.filter(s => +s.charAt(0) <= this.gen.num);\n if (!filtered.length) continue;\n if (moves[move.id]) {\n // If we simply add filtered to moves[move.id] we may end up with some duplicates or\n // situations where we have mixed learnset information. We assume that while\n // moves[move.id] and filtered are already deduped, their union might not be, and\n // thus iterate through looking for unique prefixes. For efficiency, instead of\n // appending each deduped source from filtered to moves[move.id] immediately and\n // making each subsequent iteration longer we make a list of the unique sources to\n // add at the end. This is only safe given our assumption that filtered is unique\n // internally to begin with.\n const unique = [];\n // These lists are all expected to be short arrays so this O(n^2) linear searching\n // is still expected to be faster runtime-wise than a more sophisticated approach\n loop: for (const source of filtered) {\n const prefix = source.slice(0, 2);\n // sadly Babel chokes on using an .every(...) here due to throwIfClosureRequired\n for (const s of moves[move.id]) if (s.startsWith(prefix)) continue loop;\n unique.push(source);\n }\n moves[move.id].push(...unique);\n } else {\n moves[move.id] = filtered;\n }\n }\n }\n }\n }\n }\n\n if (!restriction) this.cache[species.id] = moves;\n return moves;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async canLearn(name: string, move: Move | string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return false;\n\n move = typeof move === 'string' && this.gen.moves.get(move) || move;\n if (typeof move === 'string') return false;\n\n for await (const learnset of this.all(species)) {\n if (this.isLegal(move, learnset.learnset?.[move.id], restriction || this.gen)) {\n return true;\n }\n }\n\n return false;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n isLegal(move: Move, sources: MoveSource[] | undefined, gen: Generation | Restriction) {\n if (!sources) return undefined;\n\n const gens = sources.map(x => Number(x[0]));\n const minGen = Math.min(...gens);\n const vcOnly = (\n minGen === 7 && sources.every(x => x[0] !== '7' || x === '7V') ||\n minGen === 8 && sources.every(x => x[0] !== '8' || x === '8V')\n );\n\n if (gen === 'Pentagon') return gens.includes(6);\n if (gen === 'Plus') return gens.includes(7) && !vcOnly;\n if (gen === 'Galar') return gens.includes(8) && !vcOnly;\n if (gen === 'Paldea') return gens.includes(9);\n\n if (this.gen.num >= 3 && minGen <= 4 && (GEN3_HMS.has(move.id) || GEN4_HMS.has(move.id))) {\n let legalGens = '';\n let available = false;\n\n if (minGen === 3) {\n legalGens += '3';\n available = true;\n }\n if (available) available = !GEN3_HMS.has(move.id);\n\n if (available || gens.includes(4)) {\n legalGens += '4';\n available = true;\n }\n if (available) available = !GEN4_HMS.has(move.id);\n\n const minUpperGen = available ? 5 : Math.min(...gens.filter(g => g > 4));\n legalGens += '0123456789'.slice(minUpperGen);\n return legalGens.includes(`${gen.num}`);\n } else {\n return '0123456789'.slice(minGen).includes(`${gen.num}`);\n }\n }\n}\n\nconst STATS = ['hp', 'atk', 'def', 'spe', 'spa', 'spd'] as const;\n\nconst NAMES: Readonly<{[name: string]: StatID}> = {\n HP: 'hp', hp: 'hp',\n Attack: 'atk', Atk: 'atk', atk: 'atk',\n Defense: 'def', Def: 'def', def: 'def',\n 'Special Attack': 'spa', SpA: 'spa', SAtk: 'spa', SpAtk: 'spa', spa: 'spa',\n Special: 'spa', spc: 'spa', Spc: 'spa',\n 'Special Defense': 'spd', SpD: 'spd', SDef: 'spd', SpDef: 'spd', spd: 'spd',\n Speed: 'spe', Spe: 'spe', Spd: 'spe', spe: 'spe',\n};\n\nconst DISPLAY: Readonly<{[stat: string]: Readonly<[string, string]>}> = {\n hp: ['HP', 'HP'],\n atk: ['Atk', 'Attack'],\n def: ['Def', 'Defense'],\n spa: ['SpA', 'Special Attack'],\n spd: ['SpD', 'Special Defense'],\n spe: ['Spe', 'Speed'],\n spc: ['Spc', 'Special'],\n};\n\nexport class Stats {\n /* private */ readonly dex: Dex;\n\n constructor(dex: Dex) {\n this.dex = dex;\n }\n\n calc(stat: StatID, base: number, iv = 31, ev?: number, level = 100, nature?: Nature) {\n if (ev === undefined) ev = this.dex.gen < 3 ? 252 : 0;\n if (this.dex.gen < 3) {\n iv = this.toDV(iv) * 2;\n nature = undefined;\n }\n if (stat === 'hp') {\n return base === 1 ? base : tr(tr(2 * base + iv + tr(ev / 4) + 100) * level / 100 + 10);\n } else {\n const val = tr(tr(2 * base + iv + tr(ev / 4)) * level / 100 + 5);\n if (nature !== undefined) {\n if (nature.plus === stat) return tr(tr(val * 110, 16) / 100);\n if (nature.minus === stat) return tr(tr(val * 90, 16) / 100);\n }\n return val;\n }\n }\n\n get(s: string): StatID | undefined {\n return NAMES[s];\n }\n\n display(str: string, full = false): string {\n let s: StatID | 'spc' | undefined = NAMES[str];\n if (s === undefined) return str;\n if (this.dex.gen === 1 && s === 'spa') s = 'spc';\n return DISPLAY[s][+full];\n }\n\n fill<T>(stats: Partial<StatsTable<T>>, val: T): StatsTable<T> {\n for (const stat of STATS) {\n if (!(stat in stats)) stats[stat] = val;\n }\n return stats as StatsTable<T>;\n }\n\n getHPDV(ivs: Partial<StatsTable>): number {\n return (\n (this.toDV(ivs.atk === undefined ? 31 : ivs.atk) % 2) * 8 +\n (this.toDV(ivs.def === undefined ? 31 : ivs.def) % 2) * 4 +\n (this.toDV(ivs.spe === undefined ? 31 : ivs.spe) % 2) * 2 +\n (this.toDV(ivs.spa === undefined ? 31 : ivs.spa) % 2)\n );\n }\n\n *[Symbol.iterator](): IterableIterator<StatID> {\n for (const s of STATS) {\n yield s;\n }\n }\n\n toDV(iv: number): number {\n return Math.floor(iv / 2);\n }\n\n toIV(dv: number): number {\n return dv * 2 + 1;\n }\n}\n\nexport type {\n ID,\n As,\n Weather,\n FieldCondition,\n SideCondition,\n GenerationNum,\n GenderName,\n StatID,\n StatsTable,\n BoostID,\n BoostsTable,\n MoveCategory,\n MoveTarget,\n Nonstandard,\n EvoType,\n EggGroup,\n SideID,\n Player,\n GameType,\n HPColor,\n StatusName,\n NatureName,\n TypeName,\n HPTypeName,\n Tier,\n PokemonSet,\n AbilityName,\n ItemName,\n MoveName,\n SpeciesName,\n FormeName,\n EffectType,\n Effect,\n DataKind,\n Data,\n EffectData,\n HitEffect,\n SecondaryEffect,\n ConditionData,\n AbilityData,\n ItemData,\n MoveData,\n SpeciesData,\n MoveSource,\n EventInfoData,\n LearnsetData,\n TypeData,\n NatureData,\n BasicEffect,\n Condition,\n Ability,\n Item,\n Move,\n // Species,\n EventInfo,\n Learnset,\n // Type,\n Nature,\n GenID,\n Dex,\n} from '@pkmn/dex-types';\n"]}
|
package/build/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../index.ts"],"sourcesContent":["import {\n AbilityName,\n Condition,\n Data,\n Dex,\n Species as DexSpecies,\n Type as DexType,\n EggGroup,\n EvoType,\n FormeName,\n GenderName,\n GenerationNum,\n ID,\n ItemName,\n Move,\n MoveCategory,\n MoveName,\n MoveSource,\n Nature,\n Nonstandard,\n SpeciesAbility,\n SpeciesName,\n SpeciesTag,\n StatID,\n StatsTable,\n Tier,\n TypeName,\n} from '@pkmn/dex-types';\n\nconst DEFAULT_EXISTS = (d: Data) => {\n if (!d.exists) return false;\n if ('isNonstandard' in d && d.isNonstandard) return false;\n if (d.kind === 'Ability' && d.id === 'noability') return false;\n return !('tier' in d && ['Illegal', 'Unreleased'].includes(d.tier));\n};\n\nconst tr = (num: number, bits = 0) => bits ? (num >>> 0) % (2 ** bits) : num >>> 0;\n\nexport type ExistsFn = (d: Data, g: GenerationNum) => boolean;\ntype BoundExistsFn = (d: Data) => boolean;\n\nfunction assignWithout(a: {[key: string]: any}, b: {[key: string]: any}, exclude: Set<string>) {\n for (const key in b) {\n if (Object.prototype.hasOwnProperty.call(b, key) && !exclude.has(key)) {\n a[key] = b[key];\n }\n }\n return a;\n}\n\nexport function toID(text: any): ID {\n if (text?.id) text = text.id;\n if (typeof text !== 'string' && typeof text !== 'number') return '';\n return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as ID;\n}\n\nexport class Generations {\n /* private */ readonly cache = Object.create(null) as {[num: number]: Generation};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: ExistsFn;\n\n static DEFAULT_EXISTS = DEFAULT_EXISTS;\n\n constructor(dex: Dex, exists = Generations.DEFAULT_EXISTS) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(g: string | number) {\n // May not actually be a GenerationNum, but isNaN and Dex.forGen will validate the rest\n const gen = (typeof g === 'string' ? parseInt(g.slice(g.search(/\\d/))) : g) as GenerationNum;\n if (isNaN(+gen)) throw new Error(`Invalid gen ${g}`);\n if (this.cache[gen]) return this.cache[gen];\n return (this.cache[gen] = new Generation(this.dex.forGen(gen), d => this.exists(d, gen)));\n }\n\n *[Symbol.iterator]() {\n for (let gen = 1; gen <= 9; gen++) {\n yield this.get(gen as GenerationNum);\n }\n }\n}\n\nexport class Generation {\n readonly abilities: Abilities;\n readonly items: Items;\n readonly moves: Moves;\n readonly species: Species;\n readonly types: Types;\n readonly natures: Natures;\n readonly learnsets: Learnsets;\n readonly conditions: Conditions;\n readonly stats: Stats;\n\n readonly dex: Dex;\n\n /* private */ readonly exists: BoundExistsFn;\n\n static get(dex: Dex, g: string | number, exists = DEFAULT_EXISTS) {\n return new Generations(dex, exists).get(g);\n }\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n\n this.abilities = new Abilities(this.dex, this.exists);\n this.items = new Items(this.dex, this.exists);\n this.moves = new Moves(this.dex, this.exists);\n this.species = new Species(this.dex, this.exists);\n this.natures = new Natures(this.dex, this.exists);\n this.types = new Types(this.dex, this.exists);\n this.learnsets = new Learnsets(this, this.dex, this.exists);\n this.conditions = new Conditions(this.dex, this.exists);\n this.stats = new Stats(this.dex);\n }\n\n get num() {\n return this.dex.gen;\n }\n\n toString() {\n return `[Generation:${this.num}]`;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nexport class Abilities {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const ability = this.dex.abilities.get(name);\n return this.exists(ability) ? ability : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const ability in this.dex.data.Abilities) {\n const a = this.get(ability);\n if (a) yield a;\n }\n }\n}\n\nexport class Items {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const item = this.dex.items.get(name);\n return this.exists(item) ? item : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const item in this.dex.data.Items) {\n const i = this.get(item);\n if (i) yield i;\n }\n }\n}\n\nexport class Moves {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const move = this.dex.moves.get(name);\n return this.exists(move) ? move : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const move in this.dex.data.Moves) {\n const m = this.get(move);\n if (m) yield m;\n }\n }\n}\n\nexport class Species {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Specie};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const species = this.dex.species.get(name);\n if (!this.exists(species)) return undefined;\n const id = (species as any).speciesid || species.id; // FIXME Event-only ability hack\n const cached = this.cache[id];\n if (cached) return cached;\n return (this.cache[id] = new Specie(this.dex, this.exists, species));\n }\n\n *[Symbol.iterator]() {\n for (const species in this.dex.data.Species) {\n const s = this.get(species);\n if (s && !s.isCosmeticForme) yield s;\n }\n }\n}\n\nexport class Specie implements DexSpecies {\n readonly id!: ID;\n readonly name!: SpeciesName;\n readonly fullname!: string;\n readonly exists!: boolean;\n readonly num!: number;\n readonly gen!: GenerationNum;\n readonly shortDesc!: string;\n readonly desc!: string;\n readonly isNonstandard!: Nonstandard | null;\n readonly duration?: number;\n\n readonly effectType!: 'Pokemon';\n readonly kind!: 'Species';\n readonly baseStats!: StatsTable;\n readonly baseSpecies!: SpeciesName;\n readonly baseForme!: FormeName | '';\n readonly forme!: FormeName | '';\n readonly abilities!: SpeciesAbility<AbilityName | ''>;\n readonly types!: [TypeName] | [TypeName, TypeName];\n readonly prevo?: SpeciesName | '';\n readonly evos?: SpeciesName[];\n readonly nfe: boolean;\n readonly eggGroups!: EggGroup[];\n readonly weightkg!: number;\n readonly weighthg!: number;\n readonly tags!: SpeciesTag[];\n readonly unreleasedHidden!: boolean | 'Past';\n readonly maleOnlyHidden!: boolean;\n readonly inheritsFrom!: ID;\n readonly tier!: Tier.Singles | Tier.Other;\n readonly doublesTier!: Tier.Doubles | Tier.Other;\n readonly natDexTier!: Tier.Singles | Tier.Other;\n\n readonly changesFrom?: SpeciesName;\n readonly cosmeticFormes?: SpeciesName[];\n readonly otherFormes?: SpeciesName[];\n readonly formeOrder?: SpeciesName[];\n readonly formes?: SpeciesName[];\n readonly genderRatio: {M: number; F: number};\n readonly isMega?: boolean;\n readonly isPrimal?: boolean;\n readonly battleOnly?: SpeciesName | SpeciesName[];\n readonly canGigantamax?: MoveName;\n readonly gmaxUnreleased?: boolean;\n readonly cannotDynamax?: boolean;\n readonly requiredAbility?: AbilityName;\n readonly requiredItem?: ItemName;\n readonly requiredItems?: ItemName[];\n readonly requiredMove?: MoveName;\n readonly gender?: GenderName;\n readonly maxHP?: number;\n readonly evoMove?: MoveName;\n readonly evoItem?: string;\n readonly evoRegion?: 'Alola' | 'Galar';\n readonly evoLevel?: number;\n readonly evoCondition?: string;\n readonly evoType?: EvoType;\n readonly condition?: Partial<Condition>;\n readonly canHatch!: boolean;\n readonly isCosmeticForme!: boolean;\n\n /* private */ readonly dex: Dex;\n\n /* private */ static readonly EXCLUDE = new Set([\n 'abilities', 'cosmeticFormes', 'evos', 'formeOrder',\n 'gender', 'genderRatio', 'nfe', 'otherFormes', 'prevo',\n ]);\n\n constructor(dex: Dex, exists: BoundExistsFn, species: DexSpecies) {\n assignWithout(this, species, Specie.EXCLUDE);\n this.dex = dex;\n if (this.dex.gen >= 2) {\n this.gender = species.gender;\n this.genderRatio = species.genderRatio;\n } else {\n this.genderRatio = {M: 0, F: 0};\n }\n if (this.dex.gen >= 3) {\n this.abilities = {0: species.abilities[0]};\n // \"because PS\", Pokemon have the abilities that were added in Gen 4 in Gen 3 :bigthonk:\n if (species.abilities[1] &&\n this.dex.abilities.get(species.abilities[1]).gen <= this.dex.gen) {\n this.abilities[1] = species.abilities[1];\n }\n if (this.dex.gen >= 5 && species.abilities.H) this.abilities.H = species.abilities.H;\n if (this.dex.gen >= 7 && species.abilities.S) this.abilities.S = species.abilities.S;\n } else {\n this.abilities = {0: ''};\n }\n this.evos = species.evos?.filter(s => exists(this.dex.species.get(s)));\n this.nfe = !!this.evos?.length;\n if (!this.nfe) this.evos = undefined;\n this.cosmeticFormes = species.cosmeticFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.cosmeticFormes?.length) this.cosmeticFormes = undefined;\n this.otherFormes = species.otherFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.otherFormes?.length) this.otherFormes = undefined;\n this.formeOrder = species.formeOrder?.filter(s => exists(this.dex.species.get(s)));\n if (!this.formeOrder || this.formeOrder.length <= 1) this.formeOrder = undefined;\n this.formes = this.formeOrder?.filter(s =>\n this.dex.species.get(s).isNonstandard !== 'Gigantamax');\n this.prevo =\n species.prevo && exists(this.dex.species.get(species.prevo)) ? species.prevo : undefined;\n }\n\n get formeNum() {\n return (this.baseSpecies === this.name\n ? this.formeOrder ? this.formeOrder.findIndex(name => name === this.name) : 0\n : this.dex.species.get(this.baseSpecies).formeOrder!.findIndex(\n name => name === (this.isNonstandard === 'Gigantamax' ? this.baseSpecies : this.name)\n ));\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['dex']));\n }\n}\n\nexport class Conditions {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const condition = this.dex.conditions.get(name);\n return this.exists(condition) ? condition : undefined;\n }\n}\n\nexport class Natures {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n if (this.dex.gen < 3) return undefined;\n const nature = this.dex.natures.get(name);\n return this.exists(nature) ? nature : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const nature in this.dex.data.Natures) {\n const n = this.get(nature);\n if (n) yield n;\n }\n }\n}\n\nconst EFFECTIVENESS = {\n '-3': 0.125,\n '-2': 0.25,\n '-1': 0.5,\n '0': 1,\n '1': 2,\n '2': 4,\n '3': 8,\n};\n\ntype TypeTarget = {getTypes: () => TypeName[]} | {types: TypeName[]} | TypeName[] | TypeName;\n\nexport class Types {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Type};\n\n /* private */ readonly unknown: Type;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n // PS doesn't contain data for the '???' type\n this.unknown = new Type({\n effectType: 'Type',\n kind: 'Type',\n // Regrettably PS ID's can't represent '???'\n id: '',\n name: '???',\n // Technically this only exists as a true type in Gens 2-4, but there are moves dealing\n // typeless damage in Gen 1 so we include it there.\n exists: dex.gen <= 4,\n gen: 1,\n // This gets filled in for us by Type's constructor\n damageTaken: {} as {[t in Exclude<TypeName, '???'>]: number},\n HPivs: {},\n HPdvs: {},\n }, dex, this);\n }\n\n get(name: string) {\n if (name === '???' && this.dex.gen >= 2 && this.dex.gen <= 4) return this.unknown;\n const type = this.dex.types.get(name);\n if (!this.exists(type)) return undefined;\n const cached = this.cache[type.id];\n if (cached) return cached;\n return (this.cache[type.id] = new Type(type, this.dex, this));\n }\n\n *[Symbol.iterator]() {\n for (const type in this.dex.data.Types) {\n const t = this.get(type);\n if (t) yield t;\n }\n if (this.dex.gen >= 2 && this.dex.gen <= 4) {\n yield this.unknown;\n }\n }\n\n getHiddenPower(ivs: StatsTable) {\n return this.dex.getHiddenPower(ivs);\n }\n\n canDamage(source: {type: TypeName} | TypeName, target: TypeTarget) {\n return this.dex.getImmunity(source, target);\n }\n\n totalEffectiveness(source: {type: TypeName} | TypeName, target: TypeTarget) {\n if (!this.canDamage(source, target)) return 0;\n const e = `${this.dex.getEffectiveness(source, target)}`;\n // convert from PS's ridiculous encoding to something usable\n return EFFECTIVENESS[e as keyof typeof EFFECTIVENESS];\n }\n}\n\nexport type TypeEffectiveness = 0 | 0.5 | 1 | 2;\n\nconst DAMAGE_TAKEN = [1, 2, 0.5, 0] as TypeEffectiveness[];\nconst SPECIAL = ['Fire', 'Water', 'Grass', 'Electric', 'Ice', 'Psychic', 'Dark', 'Dragon'];\n\nexport class Type {\n readonly id!: ID;\n readonly name!: TypeName;\n readonly effectType!: 'Type';\n readonly kind!: 'Type';\n readonly exists!: boolean;\n readonly gen!: GenerationNum;\n readonly effectiveness: {[t in TypeName]: TypeEffectiveness};\n readonly HPivs!: Partial<StatsTable>;\n readonly HPdvs!: Partial<StatsTable>;\n readonly category?: Exclude<MoveCategory, 'Status'>;\n\n /* private */ readonly types: Types;\n\n constructor(type: DexType, dex: Dex, types: Types) {\n Object.assign(this, type);\n this.types = types;\n this.category = ['Fairy', 'Stellar'].includes(this.name)\n ? undefined : SPECIAL.includes(this.name) ? 'Special' : 'Physical';\n // convert from PS's ridiculous encoding to something usable (plus damage taken -> dealt)\n this.effectiveness = {'???': 1} as {[t in TypeName]: TypeEffectiveness};\n for (const k in dex.data.Types) {\n const t = k.charAt(0).toUpperCase() + k.slice(1) as Exclude<TypeName, '???'>;\n const data = dex.data.Types[k as Lowercase<string>];\n this.effectiveness[t] = DAMAGE_TAKEN[data.damageTaken[this.name] || 0];\n }\n }\n\n canDamage(target: TypeTarget) {\n return this.types.canDamage(this.name, target);\n }\n\n totalEffectiveness(target: TypeTarget) {\n return this.types.totalEffectiveness(this.name, target);\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['types']));\n }\n}\n\nconst GEN3_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'flash', 'rocksmash', 'waterfall', 'dive'] as ID[]);\n// NOTE: Whirlpool and Defog are Gen 4 HMs but the HMs differ in DPPt vs. HGSS\nconst GEN4_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'rocksmash', 'waterfall', 'rockclimb'] as ID[]);\n\ntype Restriction = 'Pentagon' | 'Plus' | 'Galar' | 'Paldea';\n\nexport class Learnsets {\n /* private */ readonly cache = Object.create(null) as {\n [speciesid: string]: {[moveid: string]: MoveSource[]};\n };\n\n /* private */ readonly gen: Generation;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(gen: Generation, dex: Dex, exists: BoundExistsFn) {\n this.gen = gen;\n this.dex = dex;\n this.exists = exists;\n }\n\n async get(name: string) {\n const learnset = await this.dex.learnsets.get(toID(name));\n return this.exists(learnset) ? learnset : undefined;\n }\n\n async *[Symbol.iterator]() {\n if (!this.dex.data.Learnsets) await this.dex.learnsets.get('LOAD' as ID);\n for (const id in this.dex.data.Learnsets) {\n const l = await this.get(id);\n if (l) yield l;\n }\n }\n\n async* all(species: Specie) {\n let id = species.id;\n let learnset = await this.get(id);\n if (!learnset) {\n id = typeof species.battleOnly === 'string' && species.battleOnly !== species.baseSpecies\n ? toID(species.battleOnly)\n : toID(species.baseSpecies);\n learnset = await this.get(id);\n }\n\n while (learnset) {\n yield learnset;\n\n if (id === 'lycanrocdusk' || (species.id === 'rockruff' && id === 'rockruff')) {\n id = 'rockruffdusk' as ID;\n } else if (species.id === 'gastrodoneast') {\n id = 'gastrodon' as ID;\n } else if (species.id === 'pumpkaboosuper') {\n id = 'pumpkaboo' as ID;\n } else {\n id = toID(species.battleOnly || species.changesFrom || species.prevo);\n }\n\n if (!id) break;\n const s = this.gen.species.get(id);\n if (!s) break;\n species = s;\n learnset = await this.get(id);\n }\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async learnable(name: string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return undefined;\n\n if (!restriction) {\n const cached = this.cache[species.id];\n if (cached) return cached;\n }\n\n const moves: {[moveid: string]: MoveSource[]} = {};\n\n for await (const learnset of this.all(species)) {\n if (learnset.learnset) {\n for (const moveid in learnset.learnset) {\n const move = this.gen.moves.get(moveid);\n if (move) {\n const sources = learnset.learnset[moveid];\n if (this.isLegal(move, sources, restriction || this.gen)) {\n const filtered = sources.filter(s => +s.charAt(0) <= this.gen.num);\n if (!filtered.length) continue;\n if (moves[move.id]) {\n // If we simply add filtered to moves[move.id] we may end up with some duplicates or\n // situations where we have mixed learnset information. We assume that while\n // moves[move.id] and filtered are already deduped, their union might not be, and\n // thus iterate through looking for unique prefixes. For efficiency, instead of\n // appending each deduped source from filtered to moves[move.id] immediately and\n // making each subsequent iteration longer we make a list of the unique sources to\n // add at the end. This is only safe given our assumption that filtered is unique\n // internally to begin with.\n const unique = [];\n // These lists are all expected to be short arrays so this O(n^2) linear searching\n // is still expected to be faster runtime-wise than a more sophisticated approach\n loop: for (const source of filtered) {\n const prefix = source.slice(0, 2);\n // sadly Babel chokes on using an .every(...) here due to throwIfClosureRequired\n for (const s of moves[move.id]) if (s.startsWith(prefix)) continue loop;\n unique.push(source);\n }\n moves[move.id].push(...unique);\n } else {\n moves[move.id] = filtered;\n }\n }\n }\n }\n }\n }\n\n if (!restriction) this.cache[species.id] = moves;\n return moves;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async canLearn(name: string, move: Move | string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return false;\n\n move = typeof move === 'string' && this.gen.moves.get(move) || move;\n if (typeof move === 'string') return false;\n\n for await (const learnset of this.all(species)) {\n if (this.isLegal(move, learnset.learnset?.[move.id], restriction || this.gen)) {\n return true;\n }\n }\n\n return false;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n isLegal(move: Move, sources: MoveSource[] | undefined, gen: Generation | Restriction) {\n if (!sources) return undefined;\n\n const gens = sources.map(x => Number(x[0]));\n const minGen = Math.min(...gens);\n const vcOnly = (\n minGen === 7 && sources.every(x => x[0] !== '7' || x === '7V') ||\n minGen === 8 && sources.every(x => x[0] !== '8' || x === '8V')\n );\n\n if (gen === 'Pentagon') return gens.includes(6);\n if (gen === 'Plus') return gens.includes(7) && !vcOnly;\n if (gen === 'Galar') return gens.includes(8) && !vcOnly;\n if (gen === 'Paldea') return gens.includes(9);\n\n if (this.gen.num >= 3 && minGen <= 4 && (GEN3_HMS.has(move.id) || GEN4_HMS.has(move.id))) {\n let legalGens = '';\n let available = false;\n\n if (minGen === 3) {\n legalGens += '3';\n available = true;\n }\n if (available) available = !GEN3_HMS.has(move.id);\n\n if (available || gens.includes(4)) {\n legalGens += '4';\n available = true;\n }\n if (available) available = !GEN4_HMS.has(move.id);\n\n const minUpperGen = available ? 5 : Math.min(...gens.filter(g => g > 4));\n legalGens += '0123456789'.slice(minUpperGen);\n return legalGens.includes(`${gen.num}`);\n } else {\n return '0123456789'.slice(minGen).includes(`${gen.num}`);\n }\n }\n}\n\nconst STATS = ['hp', 'atk', 'def', 'spe', 'spa', 'spd'] as const;\n\nconst NAMES: Readonly<{[name: string]: StatID}> = {\n HP: 'hp', hp: 'hp',\n Attack: 'atk', Atk: 'atk', atk: 'atk',\n Defense: 'def', Def: 'def', def: 'def',\n 'Special Attack': 'spa', SpA: 'spa', SAtk: 'spa', SpAtk: 'spa', spa: 'spa',\n Special: 'spa', spc: 'spa', Spc: 'spa',\n 'Special Defense': 'spd', SpD: 'spd', SDef: 'spd', SpDef: 'spd', spd: 'spd',\n Speed: 'spe', Spe: 'spe', Spd: 'spe', spe: 'spe',\n};\n\nconst DISPLAY: Readonly<{[stat: string]: Readonly<[string, string]>}> = {\n hp: ['HP', 'HP'],\n atk: ['Atk', 'Attack'],\n def: ['Def', 'Defense'],\n spa: ['SpA', 'Special Attack'],\n spd: ['SpD', 'Special Defense'],\n spe: ['Spe', 'Speed'],\n spc: ['Spc', 'Special'],\n};\n\nexport class Stats {\n /* private */ readonly dex: Dex;\n\n constructor(dex: Dex) {\n this.dex = dex;\n }\n\n calc(stat: StatID, base: number, iv = 31, ev?: number, level = 100, nature?: Nature) {\n if (ev === undefined) ev = this.dex.gen < 3 ? 252 : 0;\n if (this.dex.gen < 3) {\n iv = this.toDV(iv) * 2;\n nature = undefined;\n }\n if (stat === 'hp') {\n return base === 1 ? base : tr(tr(2 * base + iv + tr(ev / 4) + 100) * level / 100 + 10);\n } else {\n const val = tr(tr(2 * base + iv + tr(ev / 4)) * level / 100 + 5);\n if (nature !== undefined) {\n if (nature.plus === stat) return tr(tr(val * 110, 16) / 100);\n if (nature.minus === stat) return tr(tr(val * 90, 16) / 100);\n }\n return val;\n }\n }\n\n get(s: string): StatID | undefined {\n return NAMES[s];\n }\n\n display(str: string, full = false): string {\n let s: StatID | 'spc' | undefined = NAMES[str];\n if (s === undefined) return str;\n if (this.dex.gen === 1 && s === 'spa') s = 'spc';\n return DISPLAY[s][+full];\n }\n\n fill<T>(stats: Partial<StatsTable<T>>, val: T): StatsTable<T> {\n for (const stat of STATS) {\n if (!(stat in stats)) stats[stat] = val;\n }\n return stats as StatsTable<T>;\n }\n\n getHPDV(ivs: Partial<StatsTable>): number {\n return (\n (this.toDV(ivs.atk === undefined ? 31 : ivs.atk) % 2) * 8 +\n (this.toDV(ivs.def === undefined ? 31 : ivs.def) % 2) * 4 +\n (this.toDV(ivs.spe === undefined ? 31 : ivs.spe) % 2) * 2 +\n (this.toDV(ivs.spa === undefined ? 31 : ivs.spa) % 2)\n );\n }\n\n *[Symbol.iterator](): IterableIterator<StatID> {\n for (const s of STATS) {\n yield s;\n }\n }\n\n toDV(iv: number): number {\n return Math.floor(iv / 2);\n }\n\n toIV(dv: number): number {\n return dv * 2 + 1;\n }\n}\n\nexport type {\n ID,\n As,\n Weather,\n FieldCondition,\n SideCondition,\n GenerationNum,\n GenderName,\n StatID,\n StatsTable,\n BoostID,\n BoostsTable,\n MoveCategory,\n MoveTarget,\n Nonstandard,\n EvoType,\n EggGroup,\n SideID,\n Player,\n GameType,\n HPColor,\n StatusName,\n NatureName,\n TypeName,\n HPTypeName,\n Tier,\n PokemonSet,\n AbilityName,\n ItemName,\n MoveName,\n SpeciesName,\n FormeName,\n EffectType,\n Effect,\n DataKind,\n Data,\n EffectData,\n HitEffect,\n SecondaryEffect,\n ConditionData,\n AbilityData,\n ItemData,\n MoveData,\n SpeciesData,\n MoveSource,\n EventInfoData,\n LearnsetData,\n TypeData,\n NatureData,\n BasicEffect,\n Condition,\n Ability,\n Item,\n Move,\n // Species,\n EventInfo,\n Learnset,\n // Type,\n Nature,\n GenID,\n Dex,\n} from '@pkmn/dex-types';\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../index.ts"],"sourcesContent":["import {\n AbilityName,\n Condition,\n Data,\n Dex,\n Species as DexSpecies,\n Type as DexType,\n EggGroup,\n EvoType,\n FormeName,\n GenderName,\n GenerationNum,\n ID,\n ItemName,\n Move,\n MoveCategory,\n MoveName,\n MoveSource,\n Nature,\n Nonstandard,\n SpeciesAbility,\n SpeciesName,\n SpeciesTag,\n StatID,\n StatsTable,\n Tier,\n TypeName,\n} from '@pkmn/dex-types';\n\nconst DEFAULT_EXISTS = (d: Data) => {\n if (!d.exists) return false;\n if ('isNonstandard' in d && d.isNonstandard) return false;\n if (d.kind === 'Ability' && d.id === 'noability') return false;\n return !('tier' in d && ['Illegal', 'Unreleased'].includes(d.tier));\n};\n\nconst tr = (num: number, bits = 0) => bits ? (num >>> 0) % (2 ** bits) : num >>> 0;\n\nexport type ExistsFn = (d: Data, g: GenerationNum) => boolean;\ntype BoundExistsFn = (d: Data) => boolean;\n\nfunction assignWithout(a: {[key: string]: any}, b: {[key: string]: any}, exclude: Set<string>) {\n for (const key in b) {\n if (Object.prototype.hasOwnProperty.call(b, key) && !exclude.has(key)) {\n a[key] = b[key];\n }\n }\n return a;\n}\n\nexport function toID(text: any): ID {\n if (text?.id) text = text.id;\n if (typeof text !== 'string' && typeof text !== 'number') return '';\n return ('' + text).toLowerCase().replace(/[^a-z0-9]+/g, '') as ID;\n}\n\nexport class Generations {\n /* private */ readonly cache = Object.create(null) as {[num: number]: Generation};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: ExistsFn;\n\n static DEFAULT_EXISTS = DEFAULT_EXISTS;\n\n constructor(dex: Dex, exists = Generations.DEFAULT_EXISTS) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(g: string | number) {\n // May not actually be a GenerationNum, but isNaN and Dex.forGen will validate the rest\n const gen = (typeof g === 'string' ? parseInt(g.slice(g.search(/\\d/))) : g) as GenerationNum;\n if (isNaN(+gen)) throw new Error(`Invalid gen ${g}`);\n if (this.cache[gen]) return this.cache[gen];\n return (this.cache[gen] = new Generation(this.dex.forGen(gen), d => this.exists(d, gen)));\n }\n\n *[Symbol.iterator]() {\n for (let gen = 1; gen <= 9; gen++) {\n yield this.get(gen);\n }\n }\n}\n\nexport class Generation {\n readonly abilities: Abilities;\n readonly items: Items;\n readonly moves: Moves;\n readonly species: Species;\n readonly types: Types;\n readonly natures: Natures;\n readonly learnsets: Learnsets;\n readonly conditions: Conditions;\n readonly stats: Stats;\n\n readonly dex: Dex;\n\n /* private */ readonly exists: BoundExistsFn;\n\n static get(dex: Dex, g: string | number, exists = DEFAULT_EXISTS) {\n return new Generations(dex, exists).get(g);\n }\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n\n this.abilities = new Abilities(this.dex, this.exists);\n this.items = new Items(this.dex, this.exists);\n this.moves = new Moves(this.dex, this.exists);\n this.species = new Species(this.dex, this.exists);\n this.natures = new Natures(this.dex, this.exists);\n this.types = new Types(this.dex, this.exists);\n this.learnsets = new Learnsets(this, this.dex, this.exists);\n this.conditions = new Conditions(this.dex, this.exists);\n this.stats = new Stats(this.dex);\n }\n\n get num() {\n return this.dex.gen;\n }\n\n toString() {\n return `[Generation:${this.num}]`;\n }\n\n toJSON() {\n return this.toString();\n }\n}\n\nexport class Abilities {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const ability = this.dex.abilities.get(name);\n return this.exists(ability) ? ability : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const ability in this.dex.data.Abilities) {\n const a = this.get(ability);\n if (a) yield a;\n }\n }\n}\n\nexport class Items {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const item = this.dex.items.get(name);\n return this.exists(item) ? item : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const item in this.dex.data.Items) {\n const i = this.get(item);\n if (i) yield i;\n }\n }\n}\n\nexport class Moves {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const move = this.dex.moves.get(name);\n return this.exists(move) ? move : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const move in this.dex.data.Moves) {\n const m = this.get(move);\n if (m) yield m;\n }\n }\n}\n\nexport class Species {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Specie};\n\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const species = this.dex.species.get(name);\n if (!this.exists(species)) return undefined;\n const id = (species as any).speciesid || species.id; // FIXME Event-only ability hack\n const cached = this.cache[id];\n if (cached) return cached;\n return (this.cache[id] = new Specie(this.dex, this.exists, species));\n }\n\n *[Symbol.iterator]() {\n for (const species in this.dex.data.Species) {\n const s = this.get(species);\n if (s && !s.isCosmeticForme) yield s;\n }\n }\n}\n\nexport class Specie implements DexSpecies {\n readonly id!: ID;\n readonly name!: SpeciesName;\n readonly fullname!: string;\n readonly exists!: boolean;\n readonly num!: number;\n readonly gen!: GenerationNum;\n readonly shortDesc!: string;\n readonly desc!: string;\n readonly isNonstandard!: Nonstandard | null;\n readonly duration?: number;\n\n readonly effectType!: 'Pokemon';\n readonly kind!: 'Species';\n readonly baseStats!: StatsTable;\n readonly baseSpecies!: SpeciesName;\n readonly baseForme!: FormeName | '';\n readonly forme!: FormeName | '';\n readonly abilities!: SpeciesAbility<AbilityName | ''>;\n readonly types!: [TypeName] | [TypeName, TypeName];\n readonly prevo?: SpeciesName | '';\n readonly evos?: SpeciesName[];\n readonly nfe: boolean;\n readonly eggGroups!: EggGroup[];\n readonly weightkg!: number;\n readonly weighthg!: number;\n readonly tags!: SpeciesTag[];\n readonly unreleasedHidden!: boolean | 'Past';\n readonly maleOnlyHidden!: boolean;\n readonly inheritsFrom!: ID;\n readonly tier!: Tier.Singles | Tier.Other;\n readonly doublesTier!: Tier.Doubles | Tier.Other;\n readonly natDexTier!: Tier.Singles | Tier.Other;\n\n readonly changesFrom?: SpeciesName;\n readonly cosmeticFormes?: SpeciesName[];\n readonly otherFormes?: SpeciesName[];\n readonly formeOrder?: SpeciesName[];\n readonly formes?: SpeciesName[];\n readonly genderRatio: {M: number; F: number};\n readonly isMega?: boolean;\n readonly isPrimal?: boolean;\n readonly battleOnly?: SpeciesName | SpeciesName[];\n readonly canGigantamax?: MoveName;\n readonly gmaxUnreleased?: boolean;\n readonly cannotDynamax?: boolean;\n readonly requiredAbility?: AbilityName;\n readonly requiredItem?: ItemName;\n readonly requiredItems?: ItemName[];\n readonly requiredMove?: MoveName;\n readonly gender?: GenderName;\n readonly maxHP?: number;\n readonly evoMove?: MoveName;\n readonly evoItem?: string;\n readonly evoRegion?: 'Alola' | 'Galar';\n readonly evoLevel?: number;\n readonly evoCondition?: string;\n readonly evoType?: EvoType;\n readonly condition?: Partial<Condition>;\n readonly canHatch!: boolean;\n readonly isCosmeticForme!: boolean;\n\n /* private */ readonly dex: Dex;\n\n /* private */ static readonly EXCLUDE = new Set([\n 'abilities', 'cosmeticFormes', 'evos', 'formeOrder',\n 'gender', 'genderRatio', 'nfe', 'otherFormes', 'prevo',\n ]);\n\n constructor(dex: Dex, exists: BoundExistsFn, species: DexSpecies) {\n assignWithout(this, species, Specie.EXCLUDE);\n this.dex = dex;\n if (this.dex.gen >= 2) {\n this.gender = species.gender;\n this.genderRatio = species.genderRatio;\n } else {\n this.genderRatio = {M: 0, F: 0};\n }\n if (this.dex.gen >= 3) {\n this.abilities = {0: species.abilities[0]};\n // \"because PS\", Pokemon have the abilities that were added in Gen 4 in Gen 3 :bigthonk:\n if (species.abilities[1] &&\n this.dex.abilities.get(species.abilities[1]).gen <= this.dex.gen) {\n this.abilities[1] = species.abilities[1];\n }\n if (this.dex.gen >= 5 && species.abilities.H) this.abilities.H = species.abilities.H;\n if (this.dex.gen >= 7 && species.abilities.S) this.abilities.S = species.abilities.S;\n } else {\n this.abilities = {0: ''};\n }\n this.evos = species.evos?.filter(s => exists(this.dex.species.get(s)));\n this.nfe = !!this.evos?.length;\n if (!this.nfe) this.evos = undefined;\n this.cosmeticFormes = species.cosmeticFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.cosmeticFormes?.length) this.cosmeticFormes = undefined;\n this.otherFormes = species.otherFormes?.filter(s => exists(this.dex.species.get(s)));\n if (!this.otherFormes?.length) this.otherFormes = undefined;\n this.formeOrder = species.formeOrder?.filter(s => exists(this.dex.species.get(s)));\n if (!this.formeOrder || this.formeOrder.length <= 1) this.formeOrder = undefined;\n this.formes = this.formeOrder?.filter(s =>\n this.dex.species.get(s).isNonstandard !== 'Gigantamax');\n this.prevo =\n species.prevo && exists(this.dex.species.get(species.prevo)) ? species.prevo : undefined;\n }\n\n get formeNum() {\n return (this.baseSpecies === this.name\n ? this.formeOrder ? this.formeOrder.findIndex(name => name === this.name) : 0\n : this.dex.species.get(this.baseSpecies).formeOrder!.findIndex(\n name => name === (this.isNonstandard === 'Gigantamax' ? this.baseSpecies : this.name)\n ));\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['dex']));\n }\n}\n\nexport class Conditions {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n const condition = this.dex.conditions.get(name);\n return this.exists(condition) ? condition : undefined;\n }\n}\n\nexport class Natures {\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n }\n\n get(name: string) {\n if (this.dex.gen < 3) return undefined;\n const nature = this.dex.natures.get(name);\n return this.exists(nature) ? nature : undefined;\n }\n\n *[Symbol.iterator]() {\n for (const nature in this.dex.data.Natures) {\n const n = this.get(nature);\n if (n) yield n;\n }\n }\n}\n\nconst EFFECTIVENESS = {\n '-3': 0.125,\n '-2': 0.25,\n '-1': 0.5,\n '0': 1,\n '1': 2,\n '2': 4,\n '3': 8,\n};\n\ntype TypeTarget = {getTypes: () => TypeName[]} | {types: TypeName[]} | TypeName[] | TypeName;\n\nexport class Types {\n /* private */ readonly cache = Object.create(null) as {[id: string]: Type};\n\n /* private */ readonly unknown: Type;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(dex: Dex, exists: BoundExistsFn) {\n this.dex = dex;\n this.exists = exists;\n // PS doesn't contain data for the '???' type\n this.unknown = new Type({\n effectType: 'Type',\n kind: 'Type',\n // Regrettably PS ID's can't represent '???'\n id: '',\n name: '???',\n // Technically this only exists as a true type in Gens 2-4, but there are moves dealing\n // typeless damage in Gen 1 so we include it there.\n exists: dex.gen <= 4,\n gen: 1,\n // This gets filled in for us by Type's constructor\n damageTaken: {} as {[t in Exclude<TypeName, '???'>]: number},\n HPivs: {},\n HPdvs: {},\n }, dex, this);\n }\n\n get(name: string) {\n if (name === '???' && this.dex.gen >= 2 && this.dex.gen <= 4) return this.unknown;\n const type = this.dex.types.get(name);\n if (!this.exists(type)) return undefined;\n const cached = this.cache[type.id];\n if (cached) return cached;\n return (this.cache[type.id] = new Type(type, this.dex, this));\n }\n\n *[Symbol.iterator]() {\n for (const type in this.dex.data.Types) {\n const t = this.get(type);\n if (t) yield t;\n }\n if (this.dex.gen >= 2 && this.dex.gen <= 4) {\n yield this.unknown;\n }\n }\n\n getHiddenPower(ivs: StatsTable) {\n return this.dex.getHiddenPower(ivs);\n }\n\n canDamage(source: {type: TypeName} | TypeName, target: TypeTarget) {\n return this.dex.getImmunity(source, target);\n }\n\n totalEffectiveness(source: {type: TypeName} | TypeName, target: TypeTarget) {\n if (!this.canDamage(source, target)) return 0;\n const e = `${this.dex.getEffectiveness(source, target)}`;\n // convert from PS's ridiculous encoding to something usable\n return EFFECTIVENESS[e as keyof typeof EFFECTIVENESS];\n }\n}\n\nexport type TypeEffectiveness = 0 | 0.5 | 1 | 2;\n\nconst DAMAGE_TAKEN = [1, 2, 0.5, 0] as TypeEffectiveness[];\nconst SPECIAL = ['Fire', 'Water', 'Grass', 'Electric', 'Ice', 'Psychic', 'Dark', 'Dragon'];\n\nexport class Type {\n readonly id!: ID;\n readonly name!: TypeName;\n readonly effectType!: 'Type';\n readonly kind!: 'Type';\n readonly exists!: boolean;\n readonly gen!: GenerationNum;\n readonly effectiveness: {[t in TypeName]: TypeEffectiveness};\n readonly HPivs!: Partial<StatsTable>;\n readonly HPdvs!: Partial<StatsTable>;\n readonly category?: Exclude<MoveCategory, 'Status'>;\n\n /* private */ readonly types: Types;\n\n constructor(type: DexType, dex: Dex, types: Types) {\n Object.assign(this, type);\n this.types = types;\n this.category = ['Fairy', 'Stellar'].includes(this.name)\n ? undefined : SPECIAL.includes(this.name) ? 'Special' : 'Physical';\n // convert from PS's ridiculous encoding to something usable (plus damage taken -> dealt)\n this.effectiveness = {'???': 1} as {[t in TypeName]: TypeEffectiveness};\n for (const k in dex.data.Types) {\n const t = k.charAt(0).toUpperCase() + k.slice(1) as Exclude<TypeName, '???'>;\n const data = dex.data.Types[k as Lowercase<string>];\n this.effectiveness[t] = DAMAGE_TAKEN[data.damageTaken[this.name] || 0];\n }\n }\n\n canDamage(target: TypeTarget) {\n return this.types.canDamage(this.name, target);\n }\n\n totalEffectiveness(target: TypeTarget) {\n return this.types.totalEffectiveness(this.name, target);\n }\n\n toString() {\n return this.name;\n }\n\n toJSON() {\n return assignWithout({}, this, new Set(['types']));\n }\n}\n\nconst GEN3_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'flash', 'rocksmash', 'waterfall', 'dive'] as ID[]);\n// NOTE: Whirlpool and Defog are Gen 4 HMs but the HMs differ in DPPt vs. HGSS\nconst GEN4_HMS =\n new Set(['cut', 'fly', 'surf', 'strength', 'rocksmash', 'waterfall', 'rockclimb'] as ID[]);\n\ntype Restriction = 'Pentagon' | 'Plus' | 'Galar' | 'Paldea';\n\nexport class Learnsets {\n /* private */ readonly cache = Object.create(null) as {\n [speciesid: string]: {[moveid: string]: MoveSource[]};\n };\n\n /* private */ readonly gen: Generation;\n /* private */ readonly dex: Dex;\n /* private */ readonly exists: BoundExistsFn;\n\n constructor(gen: Generation, dex: Dex, exists: BoundExistsFn) {\n this.gen = gen;\n this.dex = dex;\n this.exists = exists;\n }\n\n async get(name: string) {\n const learnset = await this.dex.learnsets.get(toID(name));\n return this.exists(learnset) ? learnset : undefined;\n }\n\n async *[Symbol.iterator]() {\n if (!this.dex.data.Learnsets) await this.dex.learnsets.get('LOAD');\n for (const id in this.dex.data.Learnsets) {\n const l = await this.get(id);\n if (l) yield l;\n }\n }\n\n async* all(species: Specie) {\n let id = species.id;\n let learnset = await this.get(id);\n if (!learnset) {\n id = typeof species.battleOnly === 'string' && species.battleOnly !== species.baseSpecies\n ? toID(species.battleOnly)\n : toID(species.baseSpecies);\n learnset = await this.get(id);\n }\n\n while (learnset) {\n yield learnset;\n\n if (id === 'lycanrocdusk' || (species.id === 'rockruff' && id === 'rockruff')) {\n id = 'rockruffdusk' as ID;\n } else if (species.id === 'gastrodoneast') {\n id = 'gastrodon' as ID;\n } else if (species.id === 'pumpkaboosuper') {\n id = 'pumpkaboo' as ID;\n } else {\n id = toID(species.battleOnly || species.changesFrom || species.prevo);\n }\n\n if (!id) break;\n const s = this.gen.species.get(id);\n if (!s) break;\n species = s;\n learnset = await this.get(id);\n }\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async learnable(name: string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return undefined;\n\n if (!restriction) {\n const cached = this.cache[species.id];\n if (cached) return cached;\n }\n\n const moves: {[moveid: string]: MoveSource[]} = {};\n\n for await (const learnset of this.all(species)) {\n if (learnset.learnset) {\n for (const moveid in learnset.learnset) {\n const move = this.gen.moves.get(moveid);\n if (move) {\n const sources = learnset.learnset[moveid];\n if (this.isLegal(move, sources, restriction || this.gen)) {\n const filtered = sources.filter(s => +s.charAt(0) <= this.gen.num);\n if (!filtered.length) continue;\n if (moves[move.id]) {\n // If we simply add filtered to moves[move.id] we may end up with some duplicates or\n // situations where we have mixed learnset information. We assume that while\n // moves[move.id] and filtered are already deduped, their union might not be, and\n // thus iterate through looking for unique prefixes. For efficiency, instead of\n // appending each deduped source from filtered to moves[move.id] immediately and\n // making each subsequent iteration longer we make a list of the unique sources to\n // add at the end. This is only safe given our assumption that filtered is unique\n // internally to begin with.\n const unique = [];\n // These lists are all expected to be short arrays so this O(n^2) linear searching\n // is still expected to be faster runtime-wise than a more sophisticated approach\n loop: for (const source of filtered) {\n const prefix = source.slice(0, 2);\n // sadly Babel chokes on using an .every(...) here due to throwIfClosureRequired\n for (const s of moves[move.id]) if (s.startsWith(prefix)) continue loop;\n unique.push(source);\n }\n moves[move.id].push(...unique);\n } else {\n moves[move.id] = filtered;\n }\n }\n }\n }\n }\n }\n\n if (!restriction) this.cache[species.id] = moves;\n return moves;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n async canLearn(name: string, move: Move | string, restriction?: Restriction) {\n const species = this.gen.species.get(name);\n if (!species) return false;\n\n move = typeof move === 'string' && this.gen.moves.get(move) || move;\n if (typeof move === 'string') return false;\n\n for await (const learnset of this.all(species)) {\n if (this.isLegal(move, learnset.learnset?.[move.id], restriction || this.gen)) {\n return true;\n }\n }\n\n return false;\n }\n\n // BUG: this only covers what Pokémon Showdown deems \"teambuilder legality\" - proper legality\n // checks/restriction enforcement requires @pkmn/sim's TeamValidator.\n isLegal(move: Move, sources: MoveSource[] | undefined, gen: Generation | Restriction) {\n if (!sources) return undefined;\n\n const gens = sources.map(x => Number(x[0]));\n const minGen = Math.min(...gens);\n const vcOnly = (\n minGen === 7 && sources.every(x => x[0] !== '7' || x === '7V') ||\n minGen === 8 && sources.every(x => x[0] !== '8' || x === '8V')\n );\n\n if (gen === 'Pentagon') return gens.includes(6);\n if (gen === 'Plus') return gens.includes(7) && !vcOnly;\n if (gen === 'Galar') return gens.includes(8) && !vcOnly;\n if (gen === 'Paldea') return gens.includes(9);\n\n if (this.gen.num >= 3 && minGen <= 4 && (GEN3_HMS.has(move.id) || GEN4_HMS.has(move.id))) {\n let legalGens = '';\n let available = false;\n\n if (minGen === 3) {\n legalGens += '3';\n available = true;\n }\n if (available) available = !GEN3_HMS.has(move.id);\n\n if (available || gens.includes(4)) {\n legalGens += '4';\n available = true;\n }\n if (available) available = !GEN4_HMS.has(move.id);\n\n const minUpperGen = available ? 5 : Math.min(...gens.filter(g => g > 4));\n legalGens += '0123456789'.slice(minUpperGen);\n return legalGens.includes(`${gen.num}`);\n } else {\n return '0123456789'.slice(minGen).includes(`${gen.num}`);\n }\n }\n}\n\nconst STATS = ['hp', 'atk', 'def', 'spe', 'spa', 'spd'] as const;\n\nconst NAMES: Readonly<{[name: string]: StatID}> = {\n HP: 'hp', hp: 'hp',\n Attack: 'atk', Atk: 'atk', atk: 'atk',\n Defense: 'def', Def: 'def', def: 'def',\n 'Special Attack': 'spa', SpA: 'spa', SAtk: 'spa', SpAtk: 'spa', spa: 'spa',\n Special: 'spa', spc: 'spa', Spc: 'spa',\n 'Special Defense': 'spd', SpD: 'spd', SDef: 'spd', SpDef: 'spd', spd: 'spd',\n Speed: 'spe', Spe: 'spe', Spd: 'spe', spe: 'spe',\n};\n\nconst DISPLAY: Readonly<{[stat: string]: Readonly<[string, string]>}> = {\n hp: ['HP', 'HP'],\n atk: ['Atk', 'Attack'],\n def: ['Def', 'Defense'],\n spa: ['SpA', 'Special Attack'],\n spd: ['SpD', 'Special Defense'],\n spe: ['Spe', 'Speed'],\n spc: ['Spc', 'Special'],\n};\n\nexport class Stats {\n /* private */ readonly dex: Dex;\n\n constructor(dex: Dex) {\n this.dex = dex;\n }\n\n calc(stat: StatID, base: number, iv = 31, ev?: number, level = 100, nature?: Nature) {\n if (ev === undefined) ev = this.dex.gen < 3 ? 252 : 0;\n if (this.dex.gen < 3) {\n iv = this.toDV(iv) * 2;\n nature = undefined;\n }\n if (stat === 'hp') {\n return base === 1 ? base : tr(tr(2 * base + iv + tr(ev / 4) + 100) * level / 100 + 10);\n } else {\n const val = tr(tr(2 * base + iv + tr(ev / 4)) * level / 100 + 5);\n if (nature !== undefined) {\n if (nature.plus === stat) return tr(tr(val * 110, 16) / 100);\n if (nature.minus === stat) return tr(tr(val * 90, 16) / 100);\n }\n return val;\n }\n }\n\n get(s: string): StatID | undefined {\n return NAMES[s];\n }\n\n display(str: string, full = false): string {\n let s: StatID | 'spc' | undefined = NAMES[str];\n if (s === undefined) return str;\n if (this.dex.gen === 1 && s === 'spa') s = 'spc';\n return DISPLAY[s][+full];\n }\n\n fill<T>(stats: Partial<StatsTable<T>>, val: T): StatsTable<T> {\n for (const stat of STATS) {\n if (!(stat in stats)) stats[stat] = val;\n }\n return stats as StatsTable<T>;\n }\n\n getHPDV(ivs: Partial<StatsTable>): number {\n return (\n (this.toDV(ivs.atk === undefined ? 31 : ivs.atk) % 2) * 8 +\n (this.toDV(ivs.def === undefined ? 31 : ivs.def) % 2) * 4 +\n (this.toDV(ivs.spe === undefined ? 31 : ivs.spe) % 2) * 2 +\n (this.toDV(ivs.spa === undefined ? 31 : ivs.spa) % 2)\n );\n }\n\n *[Symbol.iterator](): IterableIterator<StatID> {\n for (const s of STATS) {\n yield s;\n }\n }\n\n toDV(iv: number): number {\n return Math.floor(iv / 2);\n }\n\n toIV(dv: number): number {\n return dv * 2 + 1;\n }\n}\n\nexport type {\n ID,\n As,\n Weather,\n FieldCondition,\n SideCondition,\n GenerationNum,\n GenderName,\n StatID,\n StatsTable,\n BoostID,\n BoostsTable,\n MoveCategory,\n MoveTarget,\n Nonstandard,\n EvoType,\n EggGroup,\n SideID,\n Player,\n GameType,\n HPColor,\n StatusName,\n NatureName,\n TypeName,\n HPTypeName,\n Tier,\n PokemonSet,\n AbilityName,\n ItemName,\n MoveName,\n SpeciesName,\n FormeName,\n EffectType,\n Effect,\n DataKind,\n Data,\n EffectData,\n HitEffect,\n SecondaryEffect,\n ConditionData,\n AbilityData,\n ItemData,\n MoveData,\n SpeciesData,\n MoveSource,\n EventInfoData,\n LearnsetData,\n TypeData,\n NatureData,\n BasicEffect,\n Condition,\n Ability,\n Item,\n Move,\n // Species,\n EventInfo,\n Learnset,\n // Type,\n Nature,\n GenID,\n Dex,\n} from '@pkmn/dex-types';\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pkmn/data",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.8",
|
|
4
4
|
"description": "A forked implementation of the Pokémon Showdown client's data layer",
|
|
5
5
|
"repository": "github:pkmn/ps",
|
|
6
6
|
"license": "MIT",
|
|
@@ -16,13 +16,13 @@
|
|
|
16
16
|
"build"
|
|
17
17
|
],
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@pkmn/dex-types": "^0.10.
|
|
19
|
+
"@pkmn/dex-types": "^0.10.8"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
|
-
"@pkmn/dex": "^0.10.
|
|
23
|
-
"@pkmn/mods": "^0.10.
|
|
24
|
-
"@pkmn/sim": "^0.10.
|
|
25
|
-
"@smogon/calc": "^0.
|
|
22
|
+
"@pkmn/dex": "^0.10.8",
|
|
23
|
+
"@pkmn/mods": "^0.10.8",
|
|
24
|
+
"@pkmn/sim": "^0.10.8",
|
|
25
|
+
"@smogon/calc": "^0.11.0"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
28
|
"lint": "eslint --cache *.ts",
|