@robsonbittencourt/calc 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +12 -0
  3. package/bundle +107 -0
  4. package/dist/adaptable.d.ts +6 -0
  5. package/dist/adaptable.js +28 -0
  6. package/dist/adaptable.js.map +1 -0
  7. package/dist/calc.d.ts +6 -0
  8. package/dist/calc.js +26 -0
  9. package/dist/calc.js.map +1 -0
  10. package/dist/data/abilities.d.ts +15 -0
  11. package/dist/data/abilities.js +448 -0
  12. package/dist/data/abilities.js.map +1 -0
  13. package/dist/data/index.d.ts +2 -0
  14. package/dist/data/index.js +30 -0
  15. package/dist/data/index.js.map +1 -0
  16. package/dist/data/interface.d.ts +150 -0
  17. package/dist/data/interface.js +3 -0
  18. package/dist/data/interface.js.map +1 -0
  19. package/dist/data/items.d.ts +24 -0
  20. package/dist/data/items.js +708 -0
  21. package/dist/data/items.js.map +1 -0
  22. package/dist/data/moves.d.ts +86 -0
  23. package/dist/data/moves.js +5014 -0
  24. package/dist/data/moves.js.map +1 -0
  25. package/dist/data/natures.d.ts +17 -0
  26. package/dist/data/natures.js +127 -0
  27. package/dist/data/natures.js.map +1 -0
  28. package/dist/data/production.min.js +1 -0
  29. package/dist/data/species.d.ts +48 -0
  30. package/dist/data/species.js +10126 -0
  31. package/dist/data/species.js.map +1 -0
  32. package/dist/data/types.d.ts +23 -0
  33. package/dist/data/types.js +538 -0
  34. package/dist/data/types.js.map +1 -0
  35. package/dist/desc.d.ts +65 -0
  36. package/dist/desc.js +866 -0
  37. package/dist/desc.js.map +1 -0
  38. package/dist/field.d.ts +49 -0
  39. package/dist/field.js +111 -0
  40. package/dist/field.js.map +1 -0
  41. package/dist/index.d.ts +44 -0
  42. package/dist/index.js +99 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/items.d.ts +13 -0
  45. package/dist/items.js +434 -0
  46. package/dist/items.js.map +1 -0
  47. package/dist/mechanics/gen12.d.ts +6 -0
  48. package/dist/mechanics/gen12.js +271 -0
  49. package/dist/mechanics/gen12.js.map +1 -0
  50. package/dist/mechanics/gen3.d.ts +11 -0
  51. package/dist/mechanics/gen3.js +371 -0
  52. package/dist/mechanics/gen3.js.map +1 -0
  53. package/dist/mechanics/gen4.d.ts +11 -0
  54. package/dist/mechanics/gen4.js +596 -0
  55. package/dist/mechanics/gen4.js.map +1 -0
  56. package/dist/mechanics/gen56.d.ts +13 -0
  57. package/dist/mechanics/gen56.js +836 -0
  58. package/dist/mechanics/gen56.js.map +1 -0
  59. package/dist/mechanics/gen789.d.ts +14 -0
  60. package/dist/mechanics/gen789.js +1325 -0
  61. package/dist/mechanics/gen789.js.map +1 -0
  62. package/dist/mechanics/util.d.ts +39 -0
  63. package/dist/mechanics/util.js +675 -0
  64. package/dist/mechanics/util.js.map +1 -0
  65. package/dist/move.d.ts +50 -0
  66. package/dist/move.js +324 -0
  67. package/dist/move.js.map +1 -0
  68. package/dist/pokemon.d.ts +55 -0
  69. package/dist/pokemon.js +240 -0
  70. package/dist/pokemon.js.map +1 -0
  71. package/dist/production.min.js +1 -0
  72. package/dist/result.d.ts +34 -0
  73. package/dist/result.js +94 -0
  74. package/dist/result.js.map +1 -0
  75. package/dist/state.d.ts +77 -0
  76. package/dist/state.js +3 -0
  77. package/dist/state.js.map +1 -0
  78. package/dist/stats.d.ts +26 -0
  79. package/dist/stats.js +183 -0
  80. package/dist/stats.js.map +1 -0
  81. package/dist/test/calc.test.d.ts +1 -0
  82. package/dist/test/calc.test.js +1297 -0
  83. package/dist/test/calc.test.js.map +1 -0
  84. package/dist/test/data.test.d.ts +1 -0
  85. package/dist/test/data.test.js +368 -0
  86. package/dist/test/data.test.js.map +1 -0
  87. package/dist/test/gen.d.ts +135 -0
  88. package/dist/test/gen.js +636 -0
  89. package/dist/test/gen.js.map +1 -0
  90. package/dist/test/helper.d.ts +55 -0
  91. package/dist/test/helper.js +174 -0
  92. package/dist/test/helper.js.map +1 -0
  93. package/dist/test/move.test.d.ts +1 -0
  94. package/dist/test/move.test.js +14 -0
  95. package/dist/test/move.test.js.map +1 -0
  96. package/dist/test/pokemon.test.d.ts +1 -0
  97. package/dist/test/pokemon.test.js +102 -0
  98. package/dist/test/pokemon.test.js.map +1 -0
  99. package/dist/test/stats.test.d.ts +1 -0
  100. package/dist/test/stats.test.js +64 -0
  101. package/dist/test/stats.test.js.map +1 -0
  102. package/dist/test/utils.test.d.ts +1 -0
  103. package/dist/test/utils.test.js +19 -0
  104. package/dist/test/utils.test.js.map +1 -0
  105. package/dist/util.d.ts +17 -0
  106. package/dist/util.js +115 -0
  107. package/dist/util.js.map +1 -0
  108. package/jest.config.js +11 -0
  109. package/package.json +40 -0
  110. package/src/adaptable.ts +12 -0
  111. package/src/calc.ts +40 -0
  112. package/src/data/abilities.ts +383 -0
  113. package/src/data/index.ts +36 -0
  114. package/src/data/interface.ts +176 -0
  115. package/src/data/items.ts +632 -0
  116. package/src/data/moves.ts +5028 -0
  117. package/src/data/natures.ts +65 -0
  118. package/src/data/species.ts +10098 -0
  119. package/src/data/types.ts +478 -0
  120. package/src/desc.ts +1063 -0
  121. package/src/field.ts +124 -0
  122. package/src/index.ts +156 -0
  123. package/src/items.ts +423 -0
  124. package/src/mechanics/gen12.ts +297 -0
  125. package/src/mechanics/gen3.ts +444 -0
  126. package/src/mechanics/gen4.ts +702 -0
  127. package/src/mechanics/gen56.ts +1134 -0
  128. package/src/mechanics/gen789.ts +1788 -0
  129. package/src/mechanics/util.ts +676 -0
  130. package/src/move.ts +337 -0
  131. package/src/pokemon.ts +244 -0
  132. package/src/result.ts +106 -0
  133. package/src/state.ts +81 -0
  134. package/src/stats.ts +213 -0
  135. package/src/test/calc.test.ts +1588 -0
  136. package/src/test/data.test.ts +129 -0
  137. package/src/test/gen.ts +514 -0
  138. package/src/test/helper.ts +185 -0
  139. package/src/test/move.test.ts +13 -0
  140. package/src/test/pokemon.test.ts +121 -0
  141. package/src/test/stats.test.ts +84 -0
  142. package/src/test/utils.test.ts +18 -0
  143. package/src/util.ts +153 -0
  144. package/tsconfig.json +10 -0
package/src/field.ts ADDED
@@ -0,0 +1,124 @@
1
+ import type {State} from './state';
2
+ import type {GameType, Weather, Terrain} from './data/interface';
3
+
4
+ export class Field implements State.Field {
5
+ gameType: GameType;
6
+ weather?: Weather;
7
+ terrain?: Terrain;
8
+ isMagicRoom: boolean;
9
+ isWonderRoom: boolean;
10
+ isGravity: boolean;
11
+ isAuraBreak?: boolean;
12
+ isFairyAura?: boolean;
13
+ isDarkAura?: boolean;
14
+ isBeadsOfRuin?: boolean;
15
+ isSwordOfRuin?: boolean;
16
+ isTabletsOfRuin?: boolean;
17
+ isVesselOfRuin?: boolean;
18
+ attackerSide: Side;
19
+ defenderSide: Side;
20
+
21
+ constructor(field: Partial<State.Field> = {}) {
22
+ this.gameType = field.gameType || 'Singles';
23
+ this.terrain = field.terrain;
24
+ this.weather = field.weather;
25
+ this.isMagicRoom = !!field.isMagicRoom;
26
+ this.isWonderRoom = !!field.isWonderRoom;
27
+ this.isGravity = !!field.isGravity;
28
+ this.isAuraBreak = field.isAuraBreak || false;
29
+ this.isFairyAura = field.isFairyAura || false;
30
+ this.isDarkAura = field.isDarkAura || false;
31
+ this.isBeadsOfRuin = field.isBeadsOfRuin || false;
32
+ this.isSwordOfRuin = field.isSwordOfRuin || false;
33
+ this.isTabletsOfRuin = field.isTabletsOfRuin || false;
34
+ this.isVesselOfRuin = field.isVesselOfRuin || false;
35
+
36
+ this.attackerSide = new Side(field.attackerSide || {});
37
+ this.defenderSide = new Side(field.defenderSide || {});
38
+ }
39
+
40
+ hasWeather(...weathers: Weather[]) {
41
+ return !!(this.weather && weathers.includes(this.weather));
42
+ }
43
+
44
+ hasTerrain(...terrains: Terrain[]) {
45
+ return !!(this.terrain && terrains.includes(this.terrain));
46
+ }
47
+
48
+ swap() {
49
+ [this.attackerSide, this.defenderSide] = [this.defenderSide, this.attackerSide];
50
+ return this;
51
+ }
52
+
53
+ clone() {
54
+ return new Field({
55
+ gameType: this.gameType,
56
+ weather: this.weather,
57
+ terrain: this.terrain,
58
+ isMagicRoom: this.isMagicRoom,
59
+ isWonderRoom: this.isWonderRoom,
60
+ isGravity: this.isGravity,
61
+ attackerSide: this.attackerSide,
62
+ defenderSide: this.defenderSide,
63
+ isAuraBreak: this.isAuraBreak,
64
+ isDarkAura: this.isDarkAura,
65
+ isFairyAura: this.isFairyAura,
66
+ isBeadsOfRuin: this.isBeadsOfRuin,
67
+ isSwordOfRuin: this.isSwordOfRuin,
68
+ isTabletsOfRuin: this.isTabletsOfRuin,
69
+ isVesselOfRuin: this.isVesselOfRuin,
70
+ });
71
+ }
72
+ }
73
+
74
+ export class Side implements State.Side {
75
+ spikes: number;
76
+ steelsurge: boolean;
77
+ vinelash: boolean;
78
+ wildfire: boolean;
79
+ cannonade: boolean;
80
+ volcalith: boolean;
81
+ isSR: boolean;
82
+ isReflect: boolean;
83
+ isLightScreen: boolean;
84
+ isProtected: boolean;
85
+ isSeeded: boolean;
86
+ isForesight: boolean;
87
+ isTailwind: boolean;
88
+ isHelpingHand: boolean;
89
+ isFlowerGift: boolean;
90
+ isFriendGuard: boolean;
91
+ isAuroraVeil: boolean;
92
+ isBattery: boolean;
93
+ isPowerSpot: boolean;
94
+ isSteelySpirit: boolean;
95
+ isSwitching?: 'out' | 'in';
96
+
97
+ constructor(side: State.Side = {}) {
98
+ this.spikes = side.spikes || 0;
99
+ this.steelsurge = !!side.steelsurge;
100
+ this.vinelash = !!side.vinelash;
101
+ this.wildfire = !!side.wildfire;
102
+ this.cannonade = !!side.cannonade;
103
+ this.volcalith = !!side.volcalith;
104
+ this.isSR = !!side.isSR;
105
+ this.isReflect = !!side.isReflect;
106
+ this.isLightScreen = !!side.isLightScreen;
107
+ this.isProtected = !!side.isProtected;
108
+ this.isSeeded = !!side.isSeeded;
109
+ this.isForesight = !!side.isForesight;
110
+ this.isTailwind = !!side.isTailwind;
111
+ this.isHelpingHand = !!side.isHelpingHand;
112
+ this.isFlowerGift = !!side.isFlowerGift;
113
+ this.isFriendGuard = !!side.isFriendGuard;
114
+ this.isAuroraVeil = !!side.isAuroraVeil;
115
+ this.isBattery = !!side.isBattery;
116
+ this.isPowerSpot = !!side.isPowerSpot;
117
+ this.isSteelySpirit = !!side.isSteelySpirit;
118
+ this.isSwitching = side.isSwitching;
119
+ }
120
+
121
+ clone() {
122
+ return new Side(this);
123
+ }
124
+ }
package/src/index.ts ADDED
@@ -0,0 +1,156 @@
1
+ // When using this library in the browser, a bundler like Webpack should be
2
+ // used to encapsulate the various interdependencies between internal packages.
3
+ // However, if you are requiring contents of this package in HTML <script>
4
+ // tags, the following loading order is required:
5
+ //
6
+ // - util.js
7
+ // - stats.js
8
+ //
9
+ // - data/species.js
10
+ // - data/types.js
11
+ // - data/natures.js
12
+ // - data/abilities.js
13
+ // - data/moves.js
14
+ // - data/items.js
15
+ // - data/index.js
16
+ //
17
+ // - pokemon.js
18
+ // - field.js
19
+ // - move.js
20
+ // - items.js
21
+ //
22
+ // - mechanics/util.js
23
+ // - mechanics/gen78.js
24
+ // - mechanics/gen56.js
25
+ // - mechanics/gen4.js
26
+ // - mechanics/gen3.js
27
+ // - mechanics/gen12.js
28
+ //
29
+ // - calc.js
30
+ // - desc.js
31
+ // - result.ts
32
+ //
33
+ // - adaptable.js
34
+ // - index.js
35
+ //
36
+ // Furthermore, before anything is loaded, the following is required:
37
+ //
38
+ // <script type="text/javascript">
39
+ // var calc = exports = {};
40
+ // function require() { return exports; };
41
+ // </script>
42
+
43
+ // If we're not being used as a module we're just going to rely on globals and
44
+ // that the correct loading order being followed.
45
+
46
+ import {Generations} from './data';
47
+ import type {State} from './state';
48
+ import type * as I from './data/interface';
49
+ import * as A from './adaptable';
50
+
51
+ // The loading strategy outlined in the comment above breaks in the browser when we start reusing
52
+ // names as we're doing here with our shim overrides. Because exporting calculate below tramples
53
+ // A.calculate, this ends up infinitely calling itself. As a workaround we save the original value
54
+ // of A.calculate (which would be exports.calculate if files are loaded as outlined above) so that
55
+ // we can call that instead.
56
+ //
57
+ // This is obviously kludge, use a bundler kids.
58
+ const Acalculate = exports.calculate;
59
+
60
+ export function calculate(
61
+ gen: I.GenerationNum | I.Generation,
62
+ attacker: A.Pokemon,
63
+ defender: A.Pokemon,
64
+ move: A.Move,
65
+ field?: A.Field
66
+ ): A.Result {
67
+ return (Acalculate || A.calculate)(
68
+ typeof gen === 'number' ? Generations.get(gen) : gen,
69
+ attacker,
70
+ defender,
71
+ move,
72
+ field
73
+ );
74
+ }
75
+
76
+ export class Move extends A.Move {
77
+ constructor(
78
+ gen: I.GenerationNum | I.Generation,
79
+ name: string,
80
+ options: Partial<Omit<State.Move, 'ability' | 'item' | 'species'>> & {
81
+ ability?: string;
82
+ item?: string;
83
+ species?: string;
84
+ } = {}
85
+ ) {
86
+ super(typeof gen === 'number' ? Generations.get(gen) : gen, name, options as any);
87
+ }
88
+ }
89
+
90
+ export class Pokemon extends A.Pokemon {
91
+ constructor(
92
+ gen: I.GenerationNum | I.Generation,
93
+ name: string,
94
+ options: Partial<Omit<State.Pokemon, 'ability' | 'item' | 'nature' | 'moves'>> & {
95
+ ability?: string;
96
+ item?: string;
97
+ nature?: string;
98
+ moves?: string[];
99
+ curHP?: number;
100
+ ivs?: Partial<I.StatsTable> & {spc?: number};
101
+ evs?: Partial<I.StatsTable> & {spc?: number};
102
+ boosts?: Partial<I.StatsTable> & {spc?: number};
103
+ } = {}
104
+ ) {
105
+ super(typeof gen === 'number' ? Generations.get(gen) : gen, name, options as any);
106
+ }
107
+
108
+ static getForme(
109
+ gen: I.GenerationNum | I.Generation,
110
+ speciesName: string,
111
+ item?: string,
112
+ moveName?: string
113
+ ) {
114
+ return A.Pokemon.getForme(
115
+ typeof gen === 'number' ? Generations.get(gen) : gen,
116
+ speciesName,
117
+ item as I.ItemName,
118
+ moveName as I.MoveName
119
+ );
120
+ }
121
+ }
122
+
123
+ export function calcStat(
124
+ gen: I.GenerationNum | I.Generation,
125
+ stat: I.StatID | 'spc',
126
+ base: number,
127
+ iv: number,
128
+ ev: number,
129
+ level: number,
130
+ nature?: string
131
+ ) {
132
+ return A.Stats.calcStat(
133
+ typeof gen === 'number' ? Generations.get(gen) : gen,
134
+ stat === 'spc' ? 'spa' : stat,
135
+ base,
136
+ iv,
137
+ ev,
138
+ level,
139
+ nature
140
+ );
141
+ }
142
+
143
+ export {Field, Side} from './field';
144
+ export {Result} from './result';
145
+ export {type GenerationNum, type StatsTable, type StatID} from './data/interface';
146
+ export {Generations} from './data/index';
147
+ export {toID} from './util';
148
+ export {type State} from './state';
149
+
150
+ export {ABILITIES} from './data/abilities';
151
+ export {ITEMS, MEGA_STONES} from './data/items';
152
+ export {MOVES} from './data/moves';
153
+ export {SPECIES} from './data/species';
154
+ export {NATURES} from './data/natures';
155
+ export {TYPE_CHART} from './data/types';
156
+ export {STATS, Stats} from './stats';
package/src/items.ts ADDED
@@ -0,0 +1,423 @@
1
+ import type {Generation, TypeName, StatID} from './data/interface';
2
+ import {toID} from './util';
3
+
4
+ export const SEED_BOOSTED_STAT: {[item: string]: StatID} = {
5
+ 'Electric Seed': 'def',
6
+ 'Grassy Seed': 'def',
7
+ 'Misty Seed': 'spd',
8
+ 'Psychic Seed': 'spd',
9
+ };
10
+
11
+ export function getItemBoostType(item: string | undefined) {
12
+ switch (item) {
13
+ case 'Draco Plate':
14
+ case 'Dragon Fang':
15
+ return 'Dragon';
16
+ case 'Dread Plate':
17
+ case 'Black Glasses':
18
+ return 'Dark';
19
+ case 'Earth Plate':
20
+ case 'Soft Sand':
21
+ return 'Ground';
22
+ case 'Fist Plate':
23
+ case 'Black Belt':
24
+ return 'Fighting';
25
+ case 'Flame Plate':
26
+ case 'Charcoal':
27
+ return 'Fire';
28
+ case 'Icicle Plate':
29
+ case 'Never-Melt Ice':
30
+ return 'Ice';
31
+ case 'Insect Plate':
32
+ case 'Silver Powder':
33
+ return 'Bug';
34
+ case 'Iron Plate':
35
+ case 'Metal Coat':
36
+ return 'Steel';
37
+ case 'Meadow Plate':
38
+ case 'Rose Incense':
39
+ case 'Miracle Seed':
40
+ return 'Grass';
41
+ case 'Mind Plate':
42
+ case 'Odd Incense':
43
+ case 'Twisted Spoon':
44
+ return 'Psychic';
45
+ case 'Fairy Feather':
46
+ case 'Pixie Plate':
47
+ return 'Fairy';
48
+ case 'Sky Plate':
49
+ case 'Sharp Beak':
50
+ return 'Flying';
51
+ case 'Splash Plate':
52
+ case 'Sea Incense':
53
+ case 'Wave Incense':
54
+ case 'Mystic Water':
55
+ return 'Water';
56
+ case 'Spooky Plate':
57
+ case 'Spell Tag':
58
+ return 'Ghost';
59
+ case 'Stone Plate':
60
+ case 'Rock Incense':
61
+ case 'Hard Stone':
62
+ return 'Rock';
63
+ case 'Toxic Plate':
64
+ case 'Poison Barb':
65
+ return 'Poison';
66
+ case 'Zap Plate':
67
+ case 'Magnet':
68
+ return 'Electric';
69
+ case 'Silk Scarf':
70
+ case 'Pink Bow':
71
+ case 'Polkadot Bow':
72
+ return 'Normal';
73
+ default:
74
+ return undefined;
75
+ }
76
+ }
77
+
78
+ export function getBerryResistType(berry: string | undefined) {
79
+ switch (berry) {
80
+ case 'Chilan Berry':
81
+ return 'Normal';
82
+ case 'Occa Berry':
83
+ return 'Fire';
84
+ case 'Passho Berry':
85
+ return 'Water';
86
+ case 'Wacan Berry':
87
+ return 'Electric';
88
+ case 'Rindo Berry':
89
+ return 'Grass';
90
+ case 'Yache Berry':
91
+ return 'Ice';
92
+ case 'Chople Berry':
93
+ return 'Fighting';
94
+ case 'Kebia Berry':
95
+ return 'Poison';
96
+ case 'Shuca Berry':
97
+ return 'Ground';
98
+ case 'Coba Berry':
99
+ return 'Flying';
100
+ case 'Payapa Berry':
101
+ return 'Psychic';
102
+ case 'Tanga Berry':
103
+ return 'Bug';
104
+ case 'Charti Berry':
105
+ return 'Rock';
106
+ case 'Kasib Berry':
107
+ return 'Ghost';
108
+ case 'Haban Berry':
109
+ return 'Dragon';
110
+ case 'Colbur Berry':
111
+ return 'Dark';
112
+ case 'Babiri Berry':
113
+ return 'Steel';
114
+ case 'Roseli Berry':
115
+ return 'Fairy';
116
+ default:
117
+ return undefined;
118
+ }
119
+ }
120
+
121
+ const FLING_120 = new Set([
122
+ 'TR24',
123
+ 'TR28',
124
+ 'TR34',
125
+ 'TR39',
126
+ 'TR53',
127
+ 'TR55',
128
+ 'TR64',
129
+ 'TR66',
130
+ 'TR72',
131
+ 'TR73',
132
+ ]);
133
+
134
+ const FLING_100 = new Set([
135
+ 'Hard Stone',
136
+ 'Room Service',
137
+ 'Claw Fossil',
138
+ 'Dome Fossil',
139
+ 'Helix Fossil',
140
+ 'Old Amber',
141
+ 'Root Fossil',
142
+ 'Armor Fossil',
143
+ 'Old Amber',
144
+ 'Fossilized Bird',
145
+ 'Fossilized Dino',
146
+ 'Fossilized Drake',
147
+ 'Fossilized Fish',
148
+ 'Plume Fossil',
149
+ 'Jaw Fossil',
150
+ 'Cover Fossil',
151
+ 'Sail Fossil',
152
+ 'Rare Bone',
153
+ 'Skull Fossil',
154
+ 'TR10',
155
+ 'TR31',
156
+ 'TR75',
157
+ ]);
158
+
159
+ const FLING_90 = new Set([
160
+ 'Deep Sea Tooth',
161
+ 'Thick Club',
162
+ 'TR02',
163
+ 'TR04',
164
+ 'TR05',
165
+ 'TR08',
166
+ 'TR11',
167
+ 'TR22',
168
+ 'TR35',
169
+ 'TR42',
170
+ 'TR45',
171
+ 'TR50',
172
+ 'TR61',
173
+ 'TR65',
174
+ 'TR67',
175
+ 'TR86',
176
+ 'TR90',
177
+ 'TR96',
178
+ ]);
179
+
180
+ const FLING_85 = new Set(['TR01', 'TR41', 'TR62', 'TR93', 'TR97', 'TR98']);
181
+
182
+ const FLING_80 = new Set([
183
+ 'Assault Vest',
184
+ 'Blunder Policy',
185
+ 'Chipped Pot',
186
+ 'Cracked Pot',
187
+ 'Heavy-Duty Boots',
188
+ 'Weakness Policy',
189
+ 'Quick Claw',
190
+ 'Dawn Stone',
191
+ 'Dusk Stone',
192
+ 'Electirizer',
193
+ 'Magmarizer',
194
+ 'Oval Stone',
195
+ 'Protector',
196
+ 'Sachet',
197
+ 'Whipped Dream',
198
+ 'Razor Claw',
199
+ 'Shiny Stone',
200
+ 'TR16',
201
+ 'TR18',
202
+ 'TR19',
203
+ 'TR25',
204
+ 'TR32',
205
+ 'TR33',
206
+ 'TR47',
207
+ 'TR56',
208
+ 'TR57',
209
+ 'TR58',
210
+ 'TR59',
211
+ 'TR60',
212
+ 'TR63',
213
+ 'TR69',
214
+ 'TR70',
215
+ 'TR74',
216
+ 'TR84',
217
+ 'TR87',
218
+ 'TR92',
219
+ 'TR95',
220
+ 'TR99',
221
+ ]);
222
+
223
+ const FLING_70 = new Set([
224
+ 'Poison Barb',
225
+ 'Dragon Fang',
226
+ 'Power Anklet',
227
+ 'Power Band',
228
+ 'Power Belt',
229
+ 'Power Bracer',
230
+ 'Power Lens',
231
+ 'Power Weight',
232
+ ]);
233
+
234
+ const FLING_60 = new Set([
235
+ 'Adamant Orb',
236
+ 'Damp Rock',
237
+ 'Heat Rock',
238
+ 'Leek',
239
+ 'Lustrous Orb',
240
+ 'Macho Brace',
241
+ 'Rocky Helmet',
242
+ 'Stick',
243
+ 'Utility Umbrella',
244
+ 'Terrain Extender',
245
+ ]);
246
+ const FLING_30 = new Set([
247
+ 'Absorb Bulb',
248
+ 'Black Belt',
249
+ 'Black Sludge',
250
+ 'Black Glasses',
251
+ 'Cell Battery',
252
+ 'Charcoal',
253
+ 'Deep Sea Scale',
254
+ 'Flame Orb',
255
+ 'King\'s Rock',
256
+ 'Life Orb',
257
+ 'Light Ball',
258
+ 'Light Clay',
259
+ 'Magnet',
260
+ 'Metal Coat',
261
+ 'Miracle Seed',
262
+ 'Mystic Water',
263
+ 'Never-Melt Ice',
264
+ 'Razor Fang',
265
+ 'Scope Lens',
266
+ 'Soul Dew',
267
+ 'Spell Tag',
268
+ 'Sweet Apple',
269
+ 'Tart Apple',
270
+ 'Throat Spray',
271
+ 'Toxic Orb',
272
+ 'Twisted Spoon',
273
+ 'Dragon Scale',
274
+ 'Energy Powder',
275
+ 'Fire Stone',
276
+ 'Leaf Stone',
277
+ 'Moon Stone',
278
+ 'Sun Stone',
279
+ 'Thunder Stone',
280
+ 'Up-Grade',
281
+ 'Water Stone',
282
+ 'Berry Juice',
283
+ 'Black Sludge',
284
+ 'Prism Scale',
285
+ 'Ice Stone',
286
+ 'Gold Bottle Cap',
287
+ 'Luminous Moss',
288
+ 'Eject Button',
289
+ 'Snowball',
290
+ 'Bottle Cap',
291
+ ]);
292
+ const FLING_10 = new Set([
293
+ 'Air Balloon',
294
+ 'Berry Sweet',
295
+ 'Choice Band',
296
+ 'Choice Scarf',
297
+ 'Choice Specs',
298
+ 'Clover Sweet',
299
+ 'Destiny Knot',
300
+ 'Electric Seed',
301
+ 'Expert Belt',
302
+ 'Flower Sweet',
303
+ 'Focus Band',
304
+ 'Focus Sash',
305
+ 'Full Incense',
306
+ 'Grassy Seed',
307
+ 'Lagging Tail',
308
+ 'Lax Incense',
309
+ 'Leftovers',
310
+ 'Love Sweet',
311
+ 'Mental Herb',
312
+ 'Metal Powder',
313
+ 'Mint Berry',
314
+ 'Miracle Berry',
315
+ 'Misty Seed',
316
+ 'Muscle Band',
317
+ 'Power Herb',
318
+ 'Psychic Seed',
319
+ 'Odd Incense',
320
+ 'Quick Powder',
321
+ 'Reaper Cloth',
322
+ 'Red Card',
323
+ 'Ribbon Sweet',
324
+ 'Ring Target',
325
+ 'Rock Incense',
326
+ 'Rose Incense',
327
+ 'Sea Incense',
328
+ 'Shed Shell',
329
+ 'Silk Scarf',
330
+ 'Silver Powder',
331
+ 'Smooth Rock',
332
+ 'Soft Sand',
333
+ 'Soothe Bell',
334
+ 'Star Sweet',
335
+ 'Strawberry Sweet',
336
+ 'Wave Incense',
337
+ 'White Herb',
338
+ 'Wide Lens',
339
+ 'Wise Glasses',
340
+ 'Zoom Lens',
341
+ 'Silver Powder',
342
+ 'Power Herb',
343
+ 'TR00',
344
+ 'TR07',
345
+ 'TR12',
346
+ 'TR13',
347
+ 'TR14',
348
+ 'TR17',
349
+ 'TR20',
350
+ 'TR21',
351
+ 'TR23',
352
+ 'TR26',
353
+ 'TR27',
354
+ 'TR29',
355
+ 'TR30',
356
+ 'TR37',
357
+ 'TR38',
358
+ 'TR40',
359
+ 'TR44',
360
+ 'TR46',
361
+ 'TR48',
362
+ 'TR49',
363
+ 'TR51',
364
+ 'TR52',
365
+ 'TR54',
366
+ 'TR68',
367
+ 'TR76',
368
+ 'TR77',
369
+ 'TR79',
370
+ 'TR80',
371
+ 'TR83',
372
+ 'TR85',
373
+ 'TR88',
374
+ 'TR91',
375
+ ]);
376
+
377
+ // TODO: move this data to the data files instead.
378
+ export function getFlingPower(item?: string) {
379
+ if (!item) return 0;
380
+ if (['Big Nugget', 'Iron Ball', 'TR43', 'TR71'].includes(item)) return 130;
381
+ if (FLING_120.has(item)) return 85;
382
+ if (['TR03', 'TR06', 'TR09', 'TR15', 'TR89'].includes(item)) return 110;
383
+ if (FLING_100.has(item)) return 100;
384
+ if (['TR36', 'TR78', 'TR81', 'TR94'].includes(item)) return 95;
385
+ if (item.includes('Plate') || FLING_90.has(item)) return 90;
386
+ if (FLING_85.has(item)) return 85;
387
+ if (FLING_80.has(item)) return 80;
388
+ if (FLING_70.has(item)) return 70;
389
+ if (FLING_60.has(item)) return 60;
390
+ if (['Eject Pack', 'Sharp Beak', 'Dubious Disc'].includes(item)) return 50;
391
+ if (['Icy Rock', 'Eviolite', 'Lucky Punch'].includes(item)) return 40;
392
+ if (FLING_30.has(item)) return 30;
393
+ if (item === 'TR82') return 20;
394
+ if (item.includes('Berry') || FLING_10.has(item)) return 10;
395
+ return 0;
396
+ }
397
+
398
+ export function getNaturalGift(gen: Generation, item: string) {
399
+ const gift = gen.items.get(toID(item))?.naturalGift;
400
+ return gift ? {t: gift.type, p: gift.basePower} : {t: 'Normal' as TypeName, p: 1};
401
+ }
402
+
403
+ export function getTechnoBlast(item: string) {
404
+ switch (item) {
405
+ case 'Burn Drive':
406
+ return 'Fire';
407
+ case 'Chill Drive':
408
+ return 'Ice';
409
+ case 'Douse Drive':
410
+ return 'Water';
411
+ case 'Shock Drive':
412
+ return 'Electric';
413
+ default:
414
+ return undefined;
415
+ }
416
+ }
417
+
418
+ export function getMultiAttack(item: string) {
419
+ if (item.includes('Memory')) {
420
+ return item.substring(0, item.indexOf(' ')) as TypeName;
421
+ }
422
+ return undefined;
423
+ }