Skip to content

Commit 5d5d8fc

Browse files
KunoichiZfavna
andauthored
feat: add Natures (#1028)
* feat: add natures * refactor: remove parameters from `getAllNatures` * fix: assign `key` field for natures --------- Co-authored-by: Jeroen Claassens <[email protected]>
1 parent e3bc7dc commit 5d5d8fc

File tree

15 files changed

+640
-1
lines changed

15 files changed

+640
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ and [Bulbapedia].
6262
- Moves
6363
- Learnsets
6464
- Type matchups
65+
- Natures
6566

6667
## JavaScript Companion Library
6768

graphql/enums.graphql

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3502,3 +3502,32 @@ enum IsNonStandard {
35023502
"When set the move can exclusively be used Pokémon Sword and Pokémon Shield as it requires Gigantamaxing your Pokémon."
35033503
Gigantamax
35043504
}
3505+
3506+
"The Natures in Pokémon"
3507+
enum NaturesEnum {
3508+
adamant
3509+
bashful
3510+
bold
3511+
brave
3512+
calm
3513+
careful
3514+
docile
3515+
gentle
3516+
hardy
3517+
hasty
3518+
impish
3519+
jolly
3520+
lax
3521+
lonely
3522+
mild
3523+
modest
3524+
naive
3525+
naughty
3526+
quiet
3527+
quirky
3528+
rash
3529+
relaxed
3530+
sassy
3531+
serious
3532+
timid
3533+
}

graphql/resolvers.graphql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,14 @@ type Query {
223223

224224
"Gets the type matchup data for the given type or types"
225225
getTypeMatchup("The primary type to check" primaryType: TypesEnum!, "The secondary type to check" secondaryType: TypesEnum): TypeMatchup!
226+
227+
"Gets the details of a specific Nature"
228+
getNature("The nature to look up" nature: NaturesEnum!): Nature!
229+
230+
"""
231+
Returns a list of all the Natures in Pokémon.
232+
233+
For every Nature all the data on each requested field is returned.
234+
"""
235+
getAllNatures: [Nature!]!
226236
}

graphql/schema.graphql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,3 +496,24 @@ type TypeEffectiveness {
496496
"The types with 0.5x effectiveness"
497497
resistedTypes: [String!]!
498498
}
499+
500+
"A single Nature entry"
501+
type Nature {
502+
"The key of the nature as stored in the API"
503+
key: NaturesEnum!
504+
505+
"The name of a nature"
506+
name: String!
507+
508+
"The stat the nature increases by 10%"
509+
increasedStat: String
510+
511+
"The stat the nature decreases by 10%"
512+
decreasedStat: String
513+
514+
"The flavor of food the nature prefers"
515+
preferredFlavor: String
516+
517+
"The flavor of food the nature dislikes"
518+
dislikedFlavor: String
519+
}

src/lib/assets/natures.ts

Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
import type { PokemonTypes } from '#assets/pokemon-source';
2+
import { Collection } from '@discordjs/collection';
3+
4+
/** The natures in Pokémon */
5+
export const natures = new Collection<string, PokemonTypes.Natures>([
6+
[
7+
'adamant',
8+
{
9+
name: 'Adamant',
10+
increasedStat: 'Attack',
11+
decreasedStat: 'Special Attack',
12+
preferredFlavor: 'Spicy',
13+
dislikedFlavor: 'Dry'
14+
}
15+
],
16+
[
17+
'bashful',
18+
{
19+
name: 'Bashful',
20+
increasedStat: null,
21+
decreasedStat: null,
22+
preferredFlavor: null,
23+
dislikedFlavor: null
24+
}
25+
],
26+
[
27+
'bold',
28+
{
29+
name: 'Bold',
30+
increasedStat: 'Defense',
31+
decreasedStat: 'Attack',
32+
preferredFlavor: 'Sour',
33+
dislikedFlavor: 'Spicy'
34+
}
35+
],
36+
[
37+
'brave',
38+
{
39+
name: 'Brave',
40+
increasedStat: 'Attack',
41+
decreasedStat: 'Speed',
42+
preferredFlavor: 'Spicy',
43+
dislikedFlavor: 'Sweet'
44+
}
45+
],
46+
[
47+
'calm',
48+
{
49+
name: 'Calm',
50+
increasedStat: 'Special Defense',
51+
decreasedStat: 'Attack',
52+
preferredFlavor: 'Bitter',
53+
dislikedFlavor: 'Spicy'
54+
}
55+
],
56+
[
57+
'careful',
58+
{
59+
name: 'Careful',
60+
increasedStat: 'Special Defense',
61+
decreasedStat: 'Special Attack',
62+
preferredFlavor: 'Bitter',
63+
dislikedFlavor: 'Dry'
64+
}
65+
],
66+
[
67+
'docile',
68+
{
69+
name: 'Docile',
70+
increasedStat: null,
71+
decreasedStat: null,
72+
preferredFlavor: null,
73+
dislikedFlavor: null
74+
}
75+
],
76+
[
77+
'gentle',
78+
{
79+
name: 'Gentle',
80+
increasedStat: 'Special Defense',
81+
decreasedStat: 'Defense',
82+
preferredFlavor: 'Bitter',
83+
dislikedFlavor: 'Sour'
84+
}
85+
],
86+
[
87+
'hardy',
88+
{
89+
name: 'Hardy',
90+
increasedStat: null,
91+
decreasedStat: null,
92+
preferredFlavor: null,
93+
dislikedFlavor: null
94+
}
95+
],
96+
[
97+
'hasty',
98+
{
99+
name: 'Hasty',
100+
increasedStat: 'Hasty',
101+
decreasedStat: 'Defense',
102+
preferredFlavor: 'Sweet',
103+
dislikedFlavor: 'Sour'
104+
}
105+
],
106+
[
107+
'impish',
108+
{
109+
name: 'Impish',
110+
increasedStat: 'Defense',
111+
decreasedStat: 'Sour',
112+
preferredFlavor: 'Special Attack',
113+
dislikedFlavor: 'Dry'
114+
}
115+
],
116+
[
117+
'jolly',
118+
{
119+
name: 'Jolly',
120+
increasedStat: 'Speed',
121+
decreasedStat: 'Special Attack',
122+
preferredFlavor: 'Sweet',
123+
dislikedFlavor: 'Dry'
124+
}
125+
],
126+
[
127+
'lax',
128+
{
129+
name: 'Lax',
130+
increasedStat: 'Defense',
131+
decreasedStat: 'Sour',
132+
preferredFlavor: 'Special Defense',
133+
dislikedFlavor: 'Bitter'
134+
}
135+
],
136+
[
137+
'lonely',
138+
{
139+
name: 'Lonely',
140+
increasedStat: 'Attack',
141+
decreasedStat: 'Defense',
142+
preferredFlavor: 'Spicy',
143+
dislikedFlavor: 'Sour'
144+
}
145+
],
146+
[
147+
'mild',
148+
{
149+
name: 'Mild',
150+
increasedStat: 'Special Attack',
151+
decreasedStat: 'Defense',
152+
preferredFlavor: 'Dry',
153+
dislikedFlavor: 'Sour'
154+
}
155+
],
156+
[
157+
'modest',
158+
{
159+
name: 'Modest',
160+
increasedStat: 'Special Attack',
161+
decreasedStat: 'Attack',
162+
preferredFlavor: 'Dry',
163+
dislikedFlavor: 'Spicy'
164+
}
165+
],
166+
[
167+
'naive',
168+
{
169+
name: 'Naive',
170+
increasedStat: 'Speed',
171+
decreasedStat: 'Special Defense',
172+
preferredFlavor: 'Sweet',
173+
dislikedFlavor: 'Bitter'
174+
}
175+
],
176+
[
177+
'naughty',
178+
{
179+
name: 'Naughty',
180+
increasedStat: 'Attack',
181+
decreasedStat: 'Special Defense',
182+
preferredFlavor: 'Spicy',
183+
dislikedFlavor: 'Bitter'
184+
}
185+
],
186+
[
187+
'quiet',
188+
{
189+
name: 'Quiet',
190+
increasedStat: 'Special Attack',
191+
decreasedStat: 'Speed',
192+
preferredFlavor: 'Dry',
193+
dislikedFlavor: 'Sweet'
194+
}
195+
],
196+
[
197+
'quirky',
198+
{
199+
name: 'Quirky',
200+
increasedStat: null,
201+
decreasedStat: null,
202+
preferredFlavor: null,
203+
dislikedFlavor: null
204+
}
205+
],
206+
[
207+
'rash',
208+
{
209+
name: 'Rash',
210+
increasedStat: 'Special Attack',
211+
decreasedStat: 'Special Defense',
212+
preferredFlavor: 'Dry',
213+
dislikedFlavor: 'Bitter'
214+
}
215+
],
216+
[
217+
'relaxed',
218+
{
219+
name: 'Relaxed',
220+
increasedStat: 'Defense',
221+
decreasedStat: 'Speed',
222+
preferredFlavor: 'Sour',
223+
dislikedFlavor: 'Sweet'
224+
}
225+
],
226+
[
227+
'sassy',
228+
{
229+
name: 'Sassy',
230+
increasedStat: 'Special Defense',
231+
decreasedStat: 'Speed',
232+
preferredFlavor: 'Bitter',
233+
dislikedFlavor: 'Sweet'
234+
}
235+
],
236+
[
237+
'serious',
238+
{
239+
name: 'Serious',
240+
increasedStat: null,
241+
decreasedStat: null,
242+
preferredFlavor: null,
243+
dislikedFlavor: null
244+
}
245+
],
246+
[
247+
'timid',
248+
{
249+
name: 'Timid',
250+
increasedStat: 'Speed',
251+
decreasedStat: 'Attack',
252+
preferredFlavor: 'Sweet',
253+
dislikedFlavor: 'Spicy'
254+
}
255+
]
256+
]);
257+
258+
for (const [key, value] of natures.entries()) {
259+
value.key = key;
260+
}

src/lib/assets/pokemon-source.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,17 @@ export namespace PokemonTypes {
287287
| "Ally's Side"
288288
| 'Normal'
289289
| 'All';
290+
291+
export interface Natures {
292+
key?: string;
293+
name: string;
294+
295+
increasedStat: string | null;
296+
297+
decreasedStat: string | null;
298+
299+
preferredFlavor: string | null;
300+
301+
dislikedFlavor: string | null;
302+
}
290303
}

src/lib/mappers/natureMapper.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import type { PokemonTypes } from '#assets/pokemon-source';
2+
import type { Nature } from '#types/graphql-mapped-types';
3+
import type { GraphQLSet } from '#utils/GraphQLSet';
4+
import { addPropertyToObjectFieldBased } from '#utils/addPropertyToObject';
5+
6+
export function mapNatureDataToNatureGraphQL({ data, requestedFields }: MapNatureDataToNatureGraphQLParameters): Nature {
7+
const natureObject: Nature = {} as Nature;
8+
9+
addPropertyToObjectFieldBased({ objectTarget: natureObject, propertyKey: 'key', propertyValue: data.key, requestedFields });
10+
addPropertyToObjectFieldBased({ objectTarget: natureObject, propertyKey: 'name', propertyValue: data.name, requestedFields });
11+
addPropertyToObjectFieldBased({ objectTarget: natureObject, propertyKey: 'increasedStat', propertyValue: data.increasedStat, requestedFields });
12+
addPropertyToObjectFieldBased({ objectTarget: natureObject, propertyKey: 'decreasedStat', propertyValue: data.decreasedStat, requestedFields });
13+
addPropertyToObjectFieldBased({ objectTarget: natureObject, propertyKey: 'preferredFlavor', propertyValue: data.preferredFlavor, requestedFields });
14+
addPropertyToObjectFieldBased({ objectTarget: natureObject, propertyKey: 'dislikedFlavor', propertyValue: data.dislikedFlavor, requestedFields });
15+
16+
return natureObject;
17+
}
18+
19+
interface MapNatureDataToNatureGraphQLParameters {
20+
data: PokemonTypes.Natures;
21+
requestedFields: GraphQLSet<keyof Nature>;
22+
}

0 commit comments

Comments
 (0)