@pkmn/data 0.10.6 → 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 CHANGED
@@ -1,11 +1,8 @@
1
- import * as _pkmn_dex_types from '@pkmn/dex-types';
2
- import { Data, GenerationNum, ID, Dex, Move, Species as Species$1, SpeciesName, Nonstandard, StatsTable, FormeName, SpeciesAbility, AbilityName, TypeName, EggGroup, SpeciesTag, Tier, MoveName, ItemName, GenderName, EvoType, Condition, MoveCategory, Type as Type$1, Nature, MoveSource, StatID } from '@pkmn/dex-types';
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): _pkmn_dex_types.Ability | undefined;
42
- [Symbol.iterator](): Generator<_pkmn_dex_types.Ability, void, unknown>;
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): _pkmn_dex_types.Item | undefined;
49
- [Symbol.iterator](): Generator<_pkmn_dex_types.Item, void, unknown>;
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 Species$1 {
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: Species$1);
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: Type$1, dex: Dex, types: Types);
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<_pkmn_dex_types.Learnset | undefined>;
213
- [Symbol.iterator](): AsyncGenerator<_pkmn_dex_types.Learnset, void, unknown>;
214
- all(species: Specie): AsyncGenerator<_pkmn_dex_types.Learnset, void, unknown>;
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 * as _pkmn_dex_types from '@pkmn/dex-types';
2
- import { Data, GenerationNum, ID, Dex, Move, Species as Species$1, SpeciesName, Nonstandard, StatsTable, FormeName, SpeciesAbility, AbilityName, TypeName, EggGroup, SpeciesTag, Tier, MoveName, ItemName, GenderName, EvoType, Condition, MoveCategory, Type as Type$1, Nature, MoveSource, StatID } from '@pkmn/dex-types';
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): _pkmn_dex_types.Ability | undefined;
42
- [Symbol.iterator](): Generator<_pkmn_dex_types.Ability, void, unknown>;
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): _pkmn_dex_types.Item | undefined;
49
- [Symbol.iterator](): Generator<_pkmn_dex_types.Item, void, unknown>;
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 Species$1 {
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: Species$1);
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: Type$1, dex: Dex, types: Types);
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<_pkmn_dex_types.Learnset | undefined>;
213
- [Symbol.iterator](): AsyncGenerator<_pkmn_dex_types.Learnset, void, unknown>;
214
- all(species: Specie): AsyncGenerator<_pkmn_dex_types.Learnset, void, unknown>;
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';
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kjs/Code/src/github.com/pkmn/ps/data/build/index.js","../index.ts"],"names":[],"mappings":"AAAA;AC6BA,IAAM,eAAA,EAAiB,CAAC,CAAA,EAAA,GAAY;AAClC,EAAA,GAAA,CAAI,CAAC,CAAA,CAAE,MAAA,EAAQ,OAAO,KAAA;AACtB,EAAA,GAAA,CAAI,gBAAA,GAAmB,EAAA,GAAK,CAAA,CAAE,aAAA,EAAe,OAAO,KAAA;AACpD,EAAA,GAAA,CAAI,CAAA,CAAE,KAAA,IAAS,UAAA,GAAa,CAAA,CAAE,GAAA,IAAO,WAAA,EAAa,OAAO,KAAA;AACzD,EAAA,OAAO,CAAA,CAAE,OAAA,GAAU,EAAA,GAAK,CAAC,SAAA,EAAW,YAAY,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,CAAA;AACnE,CAAA;AAEA,IAAM,GAAA,EAAK,CAAC,GAAA,EAAa,KAAA,EAAO,CAAA,EAAA,GAAM,KAAA,EAAA,CAAQ,IAAA,IAAQ,CAAA,EAAA,EAAM,EAAA,GAAK,KAAA,EAAQ,IAAA,IAAQ,CAAA;AAKjF,SAAS,aAAA,CAAc,CAAA,EAAyB,CAAA,EAAyB,OAAA,EAAsB;AAC7F,EAAA,IAAA,CAAA,MAAW,IAAA,GAAO,CAAA,EAAG;AACnB,IAAA,GAAA,CAAI,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,CAAA,EAAG,GAAG,EAAA,GAAK,CAAC,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACrE,MAAA,CAAA,CAAE,GAAG,EAAA,EAAI,CAAA,CAAE,GAAG,CAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,OAAO,CAAA;AACT;AAEO,SAAS,IAAA,CAAK,IAAA,EAAe;AAClC,EAAA,GAAA,CAAI,KAAA,GAAA,KAAA,EAAA,KAAA,EAAA,EAAA,IAAA,CAAM,EAAA,EAAI,KAAA,EAAO,IAAA,CAAK,EAAA;AAC1B,EAAA,GAAA,CAAI,OAAO,KAAA,IAAS,SAAA,GAAY,OAAO,KAAA,IAAS,QAAA,EAAU,OAAO,EAAA;AACjE,EAAA,OAAA,CAAQ,GAAA,EAAK,IAAA,CAAA,CAAM,WAAA,CAAY,CAAA,CAAE,OAAA,CAAQ,aAAA,EAAe,EAAE,CAAA;AAC5D;AAEO,IAAM,aAAA,EAAN,MAAM,aAAY;AAAA,EAQvB,WAAA,CAAY,GAAA,EAAU,OAAA,EAAS,YAAA,CAAY,cAAA,EAAgB;AAP7C;AAAA,IAAA,IAAA,CAAS,MAAA,kBAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAQ/C,IAAA,IAAA,CAAK,IAAA,EAAM,GAAA;AACX,IAAA,IAAA,CAAK,OAAA,EAAS,MAAA;AAAA,EAChB;AAAA,EAEA,GAAA,CAAI,CAAA,EAAoB;AAEtB,IAAA,MAAM,IAAA,EAAO,OAAO,EAAA,IAAM,SAAA,EAAW,QAAA,CAAS,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO,IAAI,CAAC,CAAC,EAAA,EAAI,CAAA;AACzE,IAAA,GAAA,CAAI,KAAA,CAAM,CAAC,GAAG,CAAA,EAAG,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,CAAC,CAAA,CAAA;AACP,IAAA;AACQ,IAAA;AACpD,EAAA;AAEqB,EAAA;AACgB,IAAA;AACE,MAAA;AACrC,IAAA;AACF,EAAA;AACF;AApB0B;AANnB;AA4BiB;AAe4C,EAAA;AACvB,IAAA;AAC3C,EAAA;AAE6C,EAAA;AAChC,IAAA;AACG,IAAA;AAEgC,IAAA;AACF,IAAA;AACA,IAAA;AACI,IAAA;AACA,IAAA;AACJ,IAAA;AACG,IAAA;AACC,IAAA;AACjB,IAAA;AACjC,EAAA;AAEU,EAAA;AACQ,IAAA;AAClB,EAAA;AAEW,EAAA;AACqB,IAAA;AAChC,EAAA;AAES,EAAA;AACc,IAAA;AACvB,EAAA;AACF;AAEuB;AAIwB,EAAA;AAChC,IAAA;AACG,IAAA;AAChB,EAAA;AAEkB,EAAA;AAC2B,IAAA;AACH,IAAA;AAC1C,EAAA;AAEqB,EAAA;AAC4B,IAAA;AACnB,MAAA;AACb,MAAA;AACf,IAAA;AACF,EAAA;AACF;AAEmB;AAI4B,EAAA;AAChC,IAAA;AACG,IAAA;AAChB,EAAA;AAEkB,EAAA;AACoB,IAAA;AACF,IAAA;AACpC,EAAA;AAEqB,EAAA;AACqB,IAAA;AACf,MAAA;AACV,MAAA;AACf,IAAA;AACF,EAAA;AACF;AAEmB;AAI4B,EAAA;AAChC,IAAA;AACG,IAAA;AAChB,EAAA;AAEkB,EAAA;AACoB,IAAA;AACF,IAAA;AACpC,EAAA;AAEqB,EAAA;AACqB,IAAA;AACf,MAAA;AACV,MAAA;AACf,IAAA;AACF,EAAA;AACF;AAEqB;AAM0B,EAAA;AAL/B;AAAmC,IAAA;AAMpC,IAAA;AACG,IAAA;AAChB,EAAA;AAEkB,EAAA;AACyB,IAAA;AACP,IAAA;AACe,IAAA;AACrB,IAAA;AACT,IAAA;AACgC,IAAA;AACrD,EAAA;AAEqB,EAAA;AAC0B,IAAA;AACjB,MAAA;AACS,MAAA;AACrC,IAAA;AACF,EAAA;AACF;AAE0C;AAqE0B,EAAA;AAtSpE,IAAA;AAuS+C,IAAA;AAChC,IAAA;AACY,IAAA;AACC,MAAA;AACK,MAAA;AACtB,IAAA;AACyB,MAAA;AAChC,IAAA;AACuB,IAAA;AACoB,MAAA;AAGlB,MAAA;AACkB,QAAA;AACzC,MAAA;AAC8C,MAAA;AACA,MAAA;AACzC,IAAA;AACkB,MAAA;AACzB,IAAA;AACY,IAAA;AACC,IAAA;AACc,IAAA;AACG,IAAA;AACzB,IAAA;AACc,IAAA;AACd,IAAA;AACa,IAAA;AACgC,IAAA;AACpC,IAAA;AAGqB,IAAA;AACrC,EAAA;AAEe,EAAA;AAEJ,IAAA;AAEoC,MAAA;AAC3C,IAAA;AACJ,EAAA;AAEW,EAAA;AACG,IAAA;AACd,EAAA;AAES,EAAA;AACwB,IAAA;AACjC,EAAA;AACF;AAAA;AAxDkD;AAC9C,EAAA;AAAa,EAAA;AAAkB,EAAA;AAAQ,EAAA;AACvC,EAAA;AAAU,EAAA;AAAe,EAAA;AAAO,EAAA;AAAe,EAAA;AAChD;AAnEI;AA0HiB;AAIuB,EAAA;AAChC,IAAA;AACG,IAAA;AAChB,EAAA;AAEkB,EAAA;AAC8B,IAAA;AACF,IAAA;AAC9C,EAAA;AACF;AAEqB;AAI0B,EAAA;AAChC,IAAA;AACG,IAAA;AAChB,EAAA;AAEkB,EAAA;AACa,IAAA;AACW,IAAA;AACF,IAAA;AACxC,EAAA;AAEqB,EAAA;AACyB,IAAA;AACjB,MAAA;AACZ,MAAA;AACf,IAAA;AACF,EAAA;AACF;AAEsB;AACd,EAAA;AACA,EAAA;AACA,EAAA;AACD,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACP;AAImB;AAO4B,EAAA;AAN/B;AAAmC,IAAA;AAOpC,IAAA;AACG,IAAA;AAEU,IAAA;AACV,MAAA;AACN,MAAA;AAAA;AAEF,MAAA;AACE,MAAA;AAAA;AAAA;AAGa,MAAA;AACd,MAAA;AAAA;AAES,MAAA;AACN,MAAA;AACA,MAAA;AACE,IAAA;AACd,EAAA;AAEkB,EAAA;AACgC,IAAA;AACZ,IAAA;AACL,IAAA;AACE,IAAA;AACd,IAAA;AAC+B,IAAA;AACpD,EAAA;AAEqB,EAAA;AACqB,IAAA;AACf,MAAA;AACV,MAAA;AACf,IAAA;AAC4C,IAAA;AAC/B,MAAA;AACb,IAAA;AACF,EAAA;AAEgC,EAAA;AACI,IAAA;AACpC,EAAA;AAEmE,EAAA;AACvB,IAAA;AAC5C,EAAA;AAE4E,EAAA;AAC9B,IAAA;AACG,IAAA;AAEK,IAAA;AACtD,EAAA;AACF;AAIkC;AACqB;AAErC;AAcmC,EAAA;AACzB,IAAA;AACX,IAAA;AACiC,IAAA;AAGhB,IAAA;AACE,IAAA;AACiB,MAAA;AACG,MAAA;AACR,MAAA;AAC5C,IAAA;AACF,EAAA;AAE8B,EAAA;AACiB,IAAA;AAC/C,EAAA;AAEuC,EAAA;AACW,IAAA;AAClD,EAAA;AAEW,EAAA;AACG,IAAA;AACd,EAAA;AAES,EAAA;AACwB,IAAA;AACjC,EAAA;AACF;AAGyB;AAGA;AAIF;AASyC,EAAA;AARhD;AAAmC,IAAA;AASpC,IAAA;AACA,IAAA;AACG,IAAA;AAChB,EAAA;AAEwB,EAAA;AACwB,IAAA;AACJ,IAAA;AAC5C,EAAA;AAE2B,EAAA;AACoB,IAAA;AACH,IAAA;AACb,MAAA;AACd,MAAA;AACf,IAAA;AACF,EAAA;AAE4B,EAAA;AACT,IAAA;AACe,IAAA;AACjB,IAAA;AACkC,MAAA;AAGnB,MAAA;AAC9B,IAAA;AAEiB,IAAA;AACT,MAAA;AAEuC,MAAA;AACtC,QAAA;AACoC,MAAA;AACpC,QAAA;AACqC,MAAA;AACrC,QAAA;AACA,MAAA;AACmC,QAAA;AAC1C,MAAA;AAES,MAAA;AACwB,MAAA;AACzB,MAAA;AACE,MAAA;AACkB,MAAA;AAC9B,IAAA;AACF,EAAA;AAAA;AAAA;AAIyD,EAAA;AACd,IAAA;AACpB,IAAA;AAEH,IAAA;AACoB,MAAA;AACjB,MAAA;AACrB,IAAA;AAEiD,IAAA;AAED,IAAA;AACvB,MAAA;AACmB,QAAA;AACA,UAAA;AAC5B,UAAA;AACgC,YAAA;AACR,YAAA;AACQ,cAAA;AAChB,cAAA;AACF,cAAA;AASF,gBAAA;AAGqB,gBAAA;AACH,kBAAA;AAEI,kBAAA;AAClB,kBAAA;AACpB,gBAAA;AAC6B,gBAAA;AACxB,cAAA;AACY,gBAAA;AACnB,cAAA;AACF,YAAA;AACF,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AAE2C,IAAA;AACpC,IAAA;AACT,EAAA;AAAA;AAAA;AAI6E,EAAA;AAznB/E,IAAA;AA0nB6C,IAAA;AACpB,IAAA;AAE6B,IAAA;AACb,IAAA;AAEW,IAAA;AACd,MAAA;AACvB,QAAA;AACT,MAAA;AACF,IAAA;AAEO,IAAA;AACT,EAAA;AAAA;AAAA;AAIsF,EAAA;AAC/D,IAAA;AAEqB,IAAA;AACX,IAAA;AAEC,IAAA;AAIc,IAAA;AACE,IAAA;AACC,IAAA;AACL,IAAA;AAEM,IAAA;AAChC,MAAA;AACA,MAAA;AAEE,MAAA;AACH,QAAA;AACD,QAAA;AACd,MAAA;AACgD,MAAA;AAEb,MAAA;AACpB,QAAA;AACD,QAAA;AACd,MAAA;AACgD,MAAA;AAEA,MAAA;AACL,MAAA;AACL,MAAA;AACjC,IAAA;AACyC,MAAA;AAChD,IAAA;AACF,EAAA;AACF;AAEsD;AAEJ;AAC5C,EAAA;AAAU,EAAA;AACN,EAAA;AAAY,EAAA;AAAY,EAAA;AACvB,EAAA;AAAY,EAAA;AAAY,EAAA;AACf,EAAA;AAAY,EAAA;AAAa,EAAA;AAAc,EAAA;AAAY,EAAA;AAC5D,EAAA;AAAY,EAAA;AAAY,EAAA;AACd,EAAA;AAAY,EAAA;AAAa,EAAA;AAAc,EAAA;AAAY,EAAA;AAC/D,EAAA;AAAY,EAAA;AAAY,EAAA;AAAY,EAAA;AAC7C;AAEwE;AACvD,EAAA;AACM,EAAA;AACC,EAAA;AACO,EAAA;AACC,EAAA;AACV,EAAA;AACE,EAAA;AACxB;AAEmB;AAGK,EAAA;AACT,IAAA;AACb,EAAA;AAEqF,EAAA;AAC/B,IAAA;AAC9B,IAAA;AACC,MAAA;AACZ,MAAA;AACX,IAAA;AACmB,IAAA;AAC2B,MAAA;AACvC,IAAA;AAC2C,MAAA;AACtB,MAAA;AACqB,QAAA;AACC,QAAA;AAChD,MAAA;AACO,MAAA;AACT,IAAA;AACF,EAAA;AAEmC,EAAA;AACnB,IAAA;AAChB,EAAA;AAE2C,EAAA;AACI,IAAA;AACjB,IAAA;AACe,IAAA;AACpB,IAAA;AACzB,EAAA;AAE8D,EAAA;AAClC,IAAA;AACY,MAAA;AACtC,IAAA;AACO,IAAA;AACT,EAAA;AAE0C,EAAA;AAES,IAAA;AAKnD,EAAA;AAE+C,EAAA;AACtB,IAAA;AACf,MAAA;AACR,IAAA;AACF,EAAA;AAEyB,EAAA;AACC,IAAA;AAC1B,EAAA;AAEyB,EAAA;AACP,IAAA;AAClB,EAAA;AACF;ADxPsD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","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"]}
@@ -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.6",
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.6"
19
+ "@pkmn/dex-types": "^0.10.8"
20
20
  },
21
21
  "devDependencies": {
22
- "@pkmn/dex": "^0.10.6",
23
- "@pkmn/mods": "^0.10.6",
24
- "@pkmn/sim": "^0.10.6",
25
- "@smogon/calc": "^0.10.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",