silphscope 1.1.6 → 1.2.1

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/README.md CHANGED
@@ -20,10 +20,11 @@ const rom = fs.readFileSync("pokefirered.gba"); // replace with path to your own
20
20
  await renderAllGraphics(rom, {
21
21
  outputMonDir: "./Assets/monImages", // must I explain?
22
22
  outputIconDir: "./Assets/Icons", // same thing here :p
23
+ outputTrainerDir: "./Assets/Trainers", // ...
23
24
  });
24
25
  ```
25
26
 
26
- Of course though the above is for extracting all graphics (which is kinda a lie... In reality it only extracts mon images and item icons... but like I said this is a WIP :p so wait a bit please!).
27
+ Of course though the above is for extracting all graphics (which is kinda a lie... In reality it only extracts mon images, item icons, and trainer images... but like I said this is a WIP :p so wait a bit please!).
27
28
 
28
29
  But if you want say just the mon images or item icons refer below:
29
30
 
@@ -49,4 +50,15 @@ const rom = fs.readFileSync("pokefirered.gba")// find your own rom and so on :l
49
50
  await renderAllIcons(rom, {
50
51
  outputDir: "./Assets/Icons" // no comment (wait... that was a comment :p)
51
52
  });
53
+ ```
54
+
55
+ trainer image extraction:
56
+ ```JavaScript
57
+ import fs from "fs";
58
+ import { renderAllTrainers } from "silphscope" // :O
59
+
60
+ const rom = fs.readFileSync("pokefirered.gba") // stuff stuff stuff
61
+ await renderAllTrainers(rom, {
62
+ outputDir: "./Assets/trainers" // more stuff
63
+ })
52
64
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "silphscope",
3
- "version": "1.1.6",
3
+ "version": "1.2.1",
4
4
  "description": "A firered/leafgreen ROM asset extractor for use in web applications",
5
5
  "main": "main.js",
6
6
  "exports": {
@@ -15,7 +15,8 @@
15
15
  "graphics-maps/",
16
16
  "mon-data/",
17
17
  "rom-maps/",
18
- "item-data/"
18
+ "item-data/",
19
+ "trainer-data"
19
20
  ],
20
21
  "keywords": [],
21
22
  "author": "chickenPoo",
@@ -6,6 +6,7 @@ import path from "path";
6
6
  import { fileURLToPath } from "url";
7
7
  import { renderMon } from "./render-mons.js";
8
8
  import { renderIcon } from "./icons/render-icons.js";
9
+ import { renderTrainer } from "./trainers/render-trainers.js";
9
10
 
10
11
  const currentDir = path.dirname(fileURLToPath(import.meta.url));
11
12
 
@@ -17,6 +18,7 @@ function loadDefaultJson(relativePath) {
17
18
  const assets = loadDefaultJson("../graphics-maps/fr-graphic-map.json");
18
19
  const mons = loadDefaultJson("../mon-data/monData.json");
19
20
  const icons = loadDefaultJson("../item-data/itemData.json");
21
+ const trainers = loadDefaultJson("../trainer-data/trainerData.json");
20
22
 
21
23
  export async function renderAllMons(rom, options = {}) {
22
24
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
@@ -85,6 +87,25 @@ export async function renderAllIcons(rom, options = {}) {
85
87
  }
86
88
  }
87
89
 
90
+ export async function renderAllTrainers(rom, options = {}) {
91
+ if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
92
+ throw new TypeError("renderAllTrainers(rom, options) requires rom Buffer/Uint8Array as first argument");
93
+ }
94
+
95
+ const {
96
+ assets: providedAssets = assets,
97
+ trainers: providedTrainers = trainers,
98
+ outputDir = "./out",
99
+ } = options;
100
+
101
+ fs.mkdirSync(outputDir, { recursive: true });
102
+
103
+ for (const trainerName of Object.keys(providedTrainers)) {
104
+ await renderTrainer(trainerName, providedTrainers, providedAssets, rom, { outputDir });
105
+ console.log(`Done: ${trainerName}`);
106
+ }
107
+ }
108
+
88
109
  export async function renderAllGraphics(rom, options = {}) { // eventually I will speed this up instead of doing it sequentially :p but for now its fine I guess
89
110
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
90
111
  throw new TypeError("renderAllGraphics(rom, options) requires rom Buffer/Uint8Array as first argument");
@@ -93,6 +114,7 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
93
114
  const {
94
115
  outputMonDir = "./out/mons",
95
116
  outputIconDir = "./out/icons",
117
+ outputTrainerDir = "./out/trainers",
96
118
  } = options;
97
119
 
98
120
  await renderAllMons(rom, {
@@ -104,6 +126,10 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
104
126
  await renderAllIcons(rom, {
105
127
  outputDir: outputIconDir,
106
128
  });
129
+
130
+ await renderTrainer(rom, {
131
+ outputDir: outputTrainerDir,
132
+ });
107
133
  }
108
134
 
109
135
  export function loadDefaultRom() {
@@ -0,0 +1,58 @@
1
+ // Copyright (c) 2026 chickenPoo
2
+ // Licensed under the MIT License. See LICENSE file in project root.
3
+
4
+ import { extract } from "../extract.js";
5
+ import { render4bppImage } from "../render-4bpp-image.js";
6
+ import { PNG } from "pngjs";
7
+ import fs from "fs";
8
+
9
+ const streamToBuffer = (stream) => new Promise((resolve, reject) => {
10
+ const chunks = [];
11
+ stream.on("data", chunk => chunks.push(chunk));
12
+ stream.on("end", () => resolve(Buffer.concat(chunks)));
13
+ stream.on("error", reject);
14
+ });
15
+
16
+ export async function renderTrainer(trainerName, trainers, assets, rom, options = {}) {
17
+ const { outputDir = null } = options;
18
+ if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
19
+ throw new TypeError("renderTrainer(..., rom) requires a ROM Buffer/Uint8Array");
20
+ }
21
+
22
+ const trainer = trainers[trainerName];
23
+ if (!trainer) {
24
+ throw new Error(`Missing Trainer: ${trainerName}`);
25
+ }
26
+
27
+ const trainerPal = assets.find(a => a.name === trainer.Palette);
28
+ const trainerPic = assets.find(a => a.name === trainer.Pic);
29
+
30
+ if (!trainerPal || !trainerPic) {
31
+ throw new Error(`Missing assets for: ${trainerName}`);
32
+ }
33
+
34
+ const trainerImageData = extract(trainerPic, rom);
35
+ const rawTrainerPalData = extract(trainerPal, rom);
36
+ const width = 64;
37
+ const height = 64;
38
+
39
+ const image = render4bppImage({
40
+ tileData: trainerImageData.data,
41
+ paletteData: rawTrainerPalData.data,
42
+ width,
43
+ height
44
+ });
45
+
46
+ const png = new PNG({ width, height });
47
+ png.data = image;
48
+ const pngBuffer = await streamToBuffer(png.pack());
49
+
50
+ if (outputDir) {
51
+ const dir = `${outputDir}/${trainerName}`;
52
+ if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
53
+ const fileName = `${dir}/trainer_front.png`;
54
+ fs.writeFileSync(fileName, pngBuffer);
55
+ }
56
+
57
+ return pngBuffer;
58
+ }
@@ -0,0 +1,24 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+
4
+ const trainerFrontPicMap = path.resolve("../trainer_graphics/front_pic_tables.h");
5
+ const frontPicLines = fs.readFileSync(trainerFrontPicMap, "utf-8").split("\n");
6
+
7
+ const trainerData = {};
8
+
9
+ for (let i = 0; i < frontPicLines.length; i++) {
10
+ const match = frontPicLines[i].match(/TRAINER_(SPRITE|PAL)\(\s*([A-Z0-9_]+)\s*,\s*(gTrainer(?:FrontPic|Palette)_[A-Za-z0-9_]+)/);
11
+ if (match) {
12
+ let trainerName = match[2];
13
+ if (!trainerData[trainerName]) {
14
+ trainerData[trainerName] = {};
15
+ }
16
+ if (match[1] === "SPRITE") {
17
+ trainerData[trainerName]["Pic"] = match[3];
18
+ } else {
19
+ trainerData[trainerName]["Palette"] = match[3];
20
+ }
21
+ }
22
+ }
23
+
24
+ fs.writeFileSync("../trainer-data/trainerData.json", JSON.stringify(trainerData, null, 2));
@@ -0,0 +1,594 @@
1
+ {
2
+ "AQUA_LEADER_ARCHIE": {
3
+ "Pic": "gTrainerFrontPic_AquaLeaderArchie",
4
+ "Palette": "gTrainerPalette_AquaLeaderArchie"
5
+ },
6
+ "AQUA_GRUNT_M": {
7
+ "Pic": "gTrainerFrontPic_AquaGruntM",
8
+ "Palette": "gTrainerPalette_AquaGruntM"
9
+ },
10
+ "AQUA_GRUNT_F": {
11
+ "Pic": "gTrainerFrontPic_AquaGruntF",
12
+ "Palette": "gTrainerPalette_AquaGruntF"
13
+ },
14
+ "RS_AROMA_LADY": {
15
+ "Pic": "gTrainerFrontPic_RSAromaLady",
16
+ "Palette": "gTrainerPalette_RSAromaLady"
17
+ },
18
+ "RS_RUIN_MANIAC": {
19
+ "Pic": "gTrainerFrontPic_RSRuinManiac",
20
+ "Palette": "gTrainerPalette_RSRuinManiac"
21
+ },
22
+ "INTERVIEWER": {
23
+ "Pic": "gTrainerFrontPic_Interviewer",
24
+ "Palette": "gTrainerPalette_Interviewer"
25
+ },
26
+ "RS_TUBER_F": {
27
+ "Pic": "gTrainerFrontPic_RSTuberF",
28
+ "Palette": "gTrainerPalette_RSTuberF"
29
+ },
30
+ "RS_TUBER_M": {
31
+ "Pic": "gTrainerFrontPic_TuberM",
32
+ "Palette": "gTrainerPalette_TuberM"
33
+ },
34
+ "RS_COOLTRAINER_M": {
35
+ "Pic": "gTrainerFrontPic_RSCooltrainerM",
36
+ "Palette": "gTrainerPalette_RSCooltrainerM"
37
+ },
38
+ "RS_COOLTRAINER_F": {
39
+ "Pic": "gTrainerFrontPic_RSCooltrainerF",
40
+ "Palette": "gTrainerPalette_RSCooltrainerF"
41
+ },
42
+ "HEX_MANIAC": {
43
+ "Pic": "gTrainerFrontPic_HexManiac",
44
+ "Palette": "gTrainerPalette_HexManiac"
45
+ },
46
+ "RS_LADY": {
47
+ "Pic": "gTrainerFrontPic_RSLady",
48
+ "Palette": "gTrainerPalette_RSLady"
49
+ },
50
+ "RS_BEAUTY": {
51
+ "Pic": "gTrainerFrontPic_RSBeauty",
52
+ "Palette": "gTrainerPalette_RSBeauty"
53
+ },
54
+ "RICH_BOY": {
55
+ "Pic": "gTrainerFrontPic_RichBoy",
56
+ "Palette": "gTrainerPalette_RichBoy"
57
+ },
58
+ "RS_POKEMANIAC": {
59
+ "Pic": "gTrainerFrontPic_RSPokeManiac",
60
+ "Palette": "gTrainerPalette_RSPokeManiac"
61
+ },
62
+ "RS_SWIMMER_M": {
63
+ "Pic": "gTrainerFrontPic_RSSwimmerM",
64
+ "Palette": "gTrainerPalette_RSSwimmerM"
65
+ },
66
+ "RS_BLACK_BELT": {
67
+ "Pic": "gTrainerFrontPic_RSBlackBelt",
68
+ "Palette": "gTrainerPalette_RSBlackBelt"
69
+ },
70
+ "GUITARIST": {
71
+ "Pic": "gTrainerFrontPic_Guitarist",
72
+ "Palette": "gTrainerPalette_Guitarist"
73
+ },
74
+ "KINDLER": {
75
+ "Pic": "gTrainerFrontPic_Kindler",
76
+ "Palette": "gTrainerPalette_Kindler"
77
+ },
78
+ "RS_CAMPER": {
79
+ "Pic": "gTrainerFrontPic_RSCamper",
80
+ "Palette": "gTrainerPalette_RSCamper"
81
+ },
82
+ "BUG_MANIAC": {
83
+ "Pic": "gTrainerFrontPic_BugManiac",
84
+ "Palette": "gTrainerPalette_BugManiac"
85
+ },
86
+ "RS_PSYCHIC_M": {
87
+ "Pic": "gTrainerFrontPic_RSPsychicM",
88
+ "Palette": "gTrainerPalette_RSPsychicM"
89
+ },
90
+ "RS_PSYCHIC_F": {
91
+ "Pic": "gTrainerFrontPic_RSPsychicF",
92
+ "Palette": "gTrainerPalette_RSPsychicF"
93
+ },
94
+ "RS_GENTLEMAN": {
95
+ "Pic": "gTrainerFrontPic_RSGentleman",
96
+ "Palette": "gTrainerPalette_RSGentleman"
97
+ },
98
+ "ELITE_FOUR_SIDNEY": {
99
+ "Pic": "gTrainerFrontPic_EliteFourSidney",
100
+ "Palette": "gTrainerPalette_EliteFourSidney"
101
+ },
102
+ "ELITE_FOUR_PHOEBE": {
103
+ "Pic": "gTrainerFrontPic_EliteFourPhoebe",
104
+ "Palette": "gTrainerPalette_EliteFourPhoebe"
105
+ },
106
+ "LEADER_ROXANNE": {
107
+ "Pic": "gTrainerFrontPic_LeaderRoxanne",
108
+ "Palette": "gTrainerPalette_LeaderRoxanne"
109
+ },
110
+ "LEADER_BRAWLY": {
111
+ "Pic": "gTrainerFrontPic_LeaderBrawly",
112
+ "Palette": "gTrainerPalette_LeaderBrawly"
113
+ },
114
+ "LEADER_TATE_AND_LIZA": {
115
+ "Pic": "gTrainerFrontPic_LeaderTateAndLiza",
116
+ "Palette": "gTrainerPalette_LeaderTateAndLiza"
117
+ },
118
+ "SCHOOL_KID_M": {
119
+ "Pic": "gTrainerFrontPic_SchoolKidM",
120
+ "Palette": "gTrainerPalette_SchoolKidM"
121
+ },
122
+ "SCHOOL_KID_F": {
123
+ "Pic": "gTrainerFrontPic_SchoolKidF",
124
+ "Palette": "gTrainerPalette_SchoolKidF"
125
+ },
126
+ "SR_AND_JR": {
127
+ "Pic": "gTrainerFrontPic_SrAndJr",
128
+ "Palette": "gTrainerPalette_SrAndJr"
129
+ },
130
+ "POKEFAN_M": {
131
+ "Pic": "gTrainerFrontPic_PokefanM",
132
+ "Palette": "gTrainerPalette_PokefanM"
133
+ },
134
+ "POKEFAN_F": {
135
+ "Pic": "gTrainerFrontPic_PokefanF",
136
+ "Palette": "gTrainerPalette_PokefanF"
137
+ },
138
+ "EXPERT_M": {
139
+ "Pic": "gTrainerFrontPic_ExpertM",
140
+ "Palette": "gTrainerPalette_ExpertM"
141
+ },
142
+ "EXPERT_F": {
143
+ "Pic": "gTrainerFrontPic_ExpertF",
144
+ "Palette": "gTrainerPalette_ExpertF"
145
+ },
146
+ "RS_YOUNGSTER": {
147
+ "Pic": "gTrainerFrontPic_RSYoungster",
148
+ "Palette": "gTrainerPalette_RSYoungster"
149
+ },
150
+ "CHAMPION_STEVEN": {
151
+ "Pic": "gTrainerFrontPic_ChampionSteven",
152
+ "Palette": "gTrainerPalette_ChampionSteven"
153
+ },
154
+ "RS_FISHERMAN": {
155
+ "Pic": "gTrainerFrontPic_RSFisherman",
156
+ "Palette": "gTrainerPalette_RSFisherman"
157
+ },
158
+ "CYCLING_TRIATHLETE_M": {
159
+ "Pic": "gTrainerFrontPic_CyclingTriathleteM",
160
+ "Palette": "gTrainerPalette_CyclingTriathleteM"
161
+ },
162
+ "CYCLING_TRIATHLETE_F": {
163
+ "Pic": "gTrainerFrontPic_CyclingTriathleteF",
164
+ "Palette": "gTrainerPalette_CyclingTriathleteF"
165
+ },
166
+ "RUNNING_TRIATHLETE_M": {
167
+ "Pic": "gTrainerFrontPic_RunningTriathleteM",
168
+ "Palette": "gTrainerPalette_RunningTriathleteM"
169
+ },
170
+ "RUNNING_TRIATHLETE_F": {
171
+ "Pic": "gTrainerFrontPic_RunningTriathleteF",
172
+ "Palette": "gTrainerPalette_RunningTriathleteF"
173
+ },
174
+ "SWIMMING_TRIATHLETE_M": {
175
+ "Pic": "gTrainerFrontPic_SwimmingTriathleteM",
176
+ "Palette": "gTrainerPalette_SwimmingTriathleteM"
177
+ },
178
+ "SWIMMING_TRIATHLETE_F": {
179
+ "Pic": "gTrainerFrontPic_SwimmingTriathleteF",
180
+ "Palette": "gTrainerPalette_SwimmingTriathleteF"
181
+ },
182
+ "DRAGON_TAMER": {
183
+ "Pic": "gTrainerFrontPic_DragonTamer",
184
+ "Palette": "gTrainerPalette_DragonTamer"
185
+ },
186
+ "RS_BIRD_KEEPER": {
187
+ "Pic": "gTrainerFrontPic_RSBirdKeeper",
188
+ "Palette": "gTrainerPalette_RSBirdKeeper"
189
+ },
190
+ "NINJA_BOY": {
191
+ "Pic": "gTrainerFrontPic_NinjaBoy",
192
+ "Palette": "gTrainerPalette_NinjaBoy"
193
+ },
194
+ "BATTLE_GIRL": {
195
+ "Pic": "gTrainerFrontPic_BattleGirl",
196
+ "Palette": "gTrainerPalette_BattleGirl"
197
+ },
198
+ "PARASOL_LADY": {
199
+ "Pic": "gTrainerFrontPic_ParasolLady",
200
+ "Palette": "gTrainerPalette_ParasolLady"
201
+ },
202
+ "RS_SWIMMER_F": {
203
+ "Pic": "gTrainerFrontPic_RSSwimmerF",
204
+ "Palette": "gTrainerPalette_RSSwimmerF"
205
+ },
206
+ "RS_PICNICKER": {
207
+ "Pic": "gTrainerFrontPic_RSPicnicker",
208
+ "Palette": "gTrainerPalette_RSPicnicker"
209
+ },
210
+ "RS_TWINS": {
211
+ "Pic": "gTrainerFrontPic_RSTwins",
212
+ "Palette": "gTrainerPalette_RSTwins"
213
+ },
214
+ "RS_SAILOR": {
215
+ "Pic": "gTrainerFrontPic_RSSailor",
216
+ "Palette": "gTrainerPalette_RSSailor"
217
+ },
218
+ "COLLECTOR": {
219
+ "Pic": "gTrainerFrontPic_Collector",
220
+ "Palette": "gTrainerPalette_Collector"
221
+ },
222
+ "WALLY": {
223
+ "Pic": "gTrainerFrontPic_Wally",
224
+ "Palette": "gTrainerPalette_Wally"
225
+ },
226
+ "RS_BRENDAN_1": {
227
+ "Pic": "gTrainerFrontPic_RSBrendan1",
228
+ "Palette": "gTrainerPalette_RSBrendan1"
229
+ },
230
+ "RS_MAY_1": {
231
+ "Pic": "gTrainerFrontPic_RSMay1",
232
+ "Palette": "gTrainerPalette_RSMay1"
233
+ },
234
+ "RS_POKEMON_BREEDER_M": {
235
+ "Pic": "gTrainerFrontPic_RSPokemonBreederM",
236
+ "Palette": "gTrainerPalette_RSPokemonBreederM"
237
+ },
238
+ "RS_POKEMON_BREEDER_F": {
239
+ "Pic": "gTrainerFrontPic_RSPokemonBreederF",
240
+ "Palette": "gTrainerPalette_RSPokemonBreederF"
241
+ },
242
+ "RS_POKEMON_RANGER_M": {
243
+ "Pic": "gTrainerFrontPic_RSPokemonRangerM",
244
+ "Palette": "gTrainerPalette_RSPokemonRangerM"
245
+ },
246
+ "RS_POKEMON_RANGER_F": {
247
+ "Pic": "gTrainerFrontPic_RSPokemonRangerF",
248
+ "Palette": "gTrainerPalette_RSPokemonRangerF"
249
+ },
250
+ "MAGMA_LEADER_MAXIE": {
251
+ "Pic": "gTrainerFrontPic_MagmaLeaderMaxie",
252
+ "Palette": "gTrainerPalette_MagmaLeaderMaxie"
253
+ },
254
+ "MAGMA_GRUNT_M": {
255
+ "Pic": "gTrainerFrontPic_MagmaGruntM",
256
+ "Palette": "gTrainerPalette_MagmaGruntM"
257
+ },
258
+ "MAGMA_GRUNT_F": {
259
+ "Pic": "gTrainerFrontPic_MagmaGruntF",
260
+ "Palette": "gTrainerPalette_MagmaGruntF"
261
+ },
262
+ "RS_LASS": {
263
+ "Pic": "gTrainerFrontPic_RSLass",
264
+ "Palette": "gTrainerPalette_RSLass"
265
+ },
266
+ "RS_BUG_CATCHER": {
267
+ "Pic": "gTrainerFrontPic_RSBugCatcher",
268
+ "Palette": "gTrainerPalette_RSBugCatcher"
269
+ },
270
+ "RS_HIKER": {
271
+ "Pic": "gTrainerFrontPic_RSHiker",
272
+ "Palette": "gTrainerPalette_RSHiker"
273
+ },
274
+ "RS_YOUNG_COUPLE": {
275
+ "Pic": "gTrainerFrontPic_RSYoungCouple",
276
+ "Palette": "gTrainerPalette_RSYoungCouple"
277
+ },
278
+ "OLD_COUPLE": {
279
+ "Pic": "gTrainerFrontPic_OldCouple",
280
+ "Palette": "gTrainerPalette_OldCouple"
281
+ },
282
+ "RS_SIS_AND_BRO": {
283
+ "Pic": "gTrainerFrontPic_RSSisAndBro",
284
+ "Palette": "gTrainerPalette_RSSisAndBro"
285
+ },
286
+ "AQUA_ADMIN_M": {
287
+ "Pic": "gTrainerFrontPic_AquaAdminM",
288
+ "Palette": "gTrainerPalette_AquaAdminM"
289
+ },
290
+ "AQUA_ADMIN_F": {
291
+ "Pic": "gTrainerFrontPic_AquaAdminF",
292
+ "Palette": "gTrainerPalette_AquaAdminF"
293
+ },
294
+ "MAGMA_ADMIN_M": {
295
+ "Pic": "gTrainerFrontPic_MagmaAdminM",
296
+ "Palette": "gTrainerPalette_MagmaAdminM"
297
+ },
298
+ "MAGMA_ADMIN_F": {
299
+ "Pic": "gTrainerFrontPic_MagmaAdminF",
300
+ "Palette": "gTrainerPalette_MagmaAdminF"
301
+ },
302
+ "LEADER_WATTSON": {
303
+ "Pic": "gTrainerFrontPic_LeaderWattson",
304
+ "Palette": "gTrainerPalette_LeaderWattson"
305
+ },
306
+ "LEADER_FLANNERY": {
307
+ "Pic": "gTrainerFrontPic_LeaderFlannery",
308
+ "Palette": "gTrainerPalette_LeaderFlannery"
309
+ },
310
+ "LEADER_NORMAN": {
311
+ "Pic": "gTrainerFrontPic_LeaderNorman",
312
+ "Palette": "gTrainerPalette_LeaderNorman"
313
+ },
314
+ "LEADER_WINONA": {
315
+ "Pic": "gTrainerFrontPic_LeaderWinona",
316
+ "Palette": "gTrainerPalette_LeaderWinona"
317
+ },
318
+ "LEADER_WALLACE": {
319
+ "Pic": "gTrainerFrontPic_LeaderWallace",
320
+ "Palette": "gTrainerPalette_LeaderWallace"
321
+ },
322
+ "ELITE_FOUR_GLACIA": {
323
+ "Pic": "gTrainerFrontPic_EliteFourGlacia",
324
+ "Palette": "gTrainerPalette_EliteFourGlacia"
325
+ },
326
+ "ELITE_FOUR_DRAKE": {
327
+ "Pic": "gTrainerFrontPic_EliteFourDrake",
328
+ "Palette": "gTrainerPalette_EliteFourDrake"
329
+ },
330
+ "YOUNGSTER": {
331
+ "Pic": "gTrainerFrontPic_Youngster",
332
+ "Palette": "gTrainerPalette_Youngster"
333
+ },
334
+ "BUG_CATCHER": {
335
+ "Pic": "gTrainerFrontPic_BugCatcher",
336
+ "Palette": "gTrainerPalette_BugCatcher"
337
+ },
338
+ "LASS": {
339
+ "Pic": "gTrainerFrontPic_Lass",
340
+ "Palette": "gTrainerPalette_Lass"
341
+ },
342
+ "SAILOR": {
343
+ "Pic": "gTrainerFrontPic_Sailor",
344
+ "Palette": "gTrainerPalette_Sailor"
345
+ },
346
+ "CAMPER": {
347
+ "Pic": "gTrainerFrontPic_Camper",
348
+ "Palette": "gTrainerPalette_Camper"
349
+ },
350
+ "PICNICKER": {
351
+ "Pic": "gTrainerFrontPic_Picnicker",
352
+ "Palette": "gTrainerPalette_Picnicker"
353
+ },
354
+ "POKEMANIAC": {
355
+ "Pic": "gTrainerFrontPic_PokeManiac",
356
+ "Palette": "gTrainerPalette_PokeManiac"
357
+ },
358
+ "SUPER_NERD": {
359
+ "Pic": "gTrainerFrontPic_SuperNerd",
360
+ "Palette": "gTrainerPalette_SuperNerd"
361
+ },
362
+ "HIKER": {
363
+ "Pic": "gTrainerFrontPic_Hiker",
364
+ "Palette": "gTrainerPalette_Hiker"
365
+ },
366
+ "BIKER": {
367
+ "Pic": "gTrainerFrontPic_Biker",
368
+ "Palette": "gTrainerPalette_Biker"
369
+ },
370
+ "BURGLAR": {
371
+ "Pic": "gTrainerFrontPic_Burglar",
372
+ "Palette": "gTrainerPalette_Burglar"
373
+ },
374
+ "ENGINEER": {
375
+ "Pic": "gTrainerFrontPic_Engineer",
376
+ "Palette": "gTrainerPalette_Engineer"
377
+ },
378
+ "FISHERMAN": {
379
+ "Pic": "gTrainerFrontPic_Fisherman",
380
+ "Palette": "gTrainerPalette_Fisherman"
381
+ },
382
+ "SWIMMER_M": {
383
+ "Pic": "gTrainerFrontPic_SwimmerM",
384
+ "Palette": "gTrainerPalette_SwimmerM"
385
+ },
386
+ "CUE_BALL": {
387
+ "Pic": "gTrainerFrontPic_CueBall",
388
+ "Palette": "gTrainerPalette_CueBall"
389
+ },
390
+ "GAMER": {
391
+ "Pic": "gTrainerFrontPic_Gamer",
392
+ "Palette": "gTrainerPalette_Gamer"
393
+ },
394
+ "BEAUTY": {
395
+ "Pic": "gTrainerFrontPic_Beauty",
396
+ "Palette": "gTrainerPalette_Beauty"
397
+ },
398
+ "SWIMMER_F": {
399
+ "Pic": "gTrainerFrontPic_SwimmerF",
400
+ "Palette": "gTrainerPalette_SwimmerF"
401
+ },
402
+ "PSYCHIC_M": {
403
+ "Pic": "gTrainerFrontPic_PsychicM",
404
+ "Palette": "gTrainerPalette_PsychicM"
405
+ },
406
+ "ROCKER": {
407
+ "Pic": "gTrainerFrontPic_Rocker",
408
+ "Palette": "gTrainerPalette_Rocker"
409
+ },
410
+ "JUGGLER": {
411
+ "Pic": "gTrainerFrontPic_Juggler",
412
+ "Palette": "gTrainerPalette_Juggler"
413
+ },
414
+ "TAMER": {
415
+ "Pic": "gTrainerFrontPic_Tamer",
416
+ "Palette": "gTrainerPalette_Tamer"
417
+ },
418
+ "BIRD_KEEPER": {
419
+ "Pic": "gTrainerFrontPic_BirdKeeper",
420
+ "Palette": "gTrainerPalette_BirdKeeper"
421
+ },
422
+ "BLACK_BELT": {
423
+ "Pic": "gTrainerFrontPic_BlackBelt",
424
+ "Palette": "gTrainerPalette_BlackBelt"
425
+ },
426
+ "RIVAL_EARLY": {
427
+ "Pic": "gTrainerFrontPic_RivalEarly",
428
+ "Palette": "gTrainerPalette_RivalEarly"
429
+ },
430
+ "SCIENTIST": {
431
+ "Pic": "gTrainerFrontPic_Scientist",
432
+ "Palette": "gTrainerPalette_Scientist"
433
+ },
434
+ "LEADER_GIOVANNI": {
435
+ "Pic": "gTrainerFrontPic_LeaderGiovanni",
436
+ "Palette": "gTrainerPalette_LeaderGiovanni"
437
+ },
438
+ "ROCKET_GRUNT_M": {
439
+ "Pic": "gTrainerFrontPic_RocketGruntM",
440
+ "Palette": "gTrainerPalette_RocketGruntM"
441
+ },
442
+ "COOLTRAINER_M": {
443
+ "Pic": "gTrainerFrontPic_CooltrainerM",
444
+ "Palette": "gTrainerPalette_CooltrainerM"
445
+ },
446
+ "COOLTRAINER_F": {
447
+ "Pic": "gTrainerFrontPic_CooltrainerF",
448
+ "Palette": "gTrainerPalette_CooltrainerF"
449
+ },
450
+ "ELITE_FOUR_LORELEI": {
451
+ "Pic": "gTrainerFrontPic_EliteFourLorelei",
452
+ "Palette": "gTrainerPalette_EliteFourLorelei"
453
+ },
454
+ "ELITE_FOUR_BRUNO": {
455
+ "Pic": "gTrainerFrontPic_EliteFourBruno",
456
+ "Palette": "gTrainerPalette_EliteFourBruno"
457
+ },
458
+ "ELITE_FOUR_AGATHA": {
459
+ "Pic": "gTrainerFrontPic_EliteFourAgatha",
460
+ "Palette": "gTrainerPalette_EliteFourAgatha"
461
+ },
462
+ "ELITE_FOUR_LANCE": {
463
+ "Pic": "gTrainerFrontPic_EliteFourLance",
464
+ "Palette": "gTrainerPalette_EliteFourLance"
465
+ },
466
+ "LEADER_BROCK": {
467
+ "Pic": "gTrainerFrontPic_LeaderBrock",
468
+ "Palette": "gTrainerPalette_LeaderBrock"
469
+ },
470
+ "LEADER_MISTY": {
471
+ "Pic": "gTrainerFrontPic_LeaderMisty",
472
+ "Palette": "gTrainerPalette_LeaderMisty"
473
+ },
474
+ "LEADER_LT_SURGE": {
475
+ "Pic": "gTrainerFrontPic_LeaderLtSurge",
476
+ "Palette": "gTrainerPalette_LeaderLtSurge"
477
+ },
478
+ "LEADER_ERIKA": {
479
+ "Pic": "gTrainerFrontPic_LeaderErika",
480
+ "Palette": "gTrainerPalette_LeaderErika"
481
+ },
482
+ "LEADER_KOGA": {
483
+ "Pic": "gTrainerFrontPic_LeaderKoga",
484
+ "Palette": "gTrainerPalette_LeaderKoga"
485
+ },
486
+ "LEADER_BLAINE": {
487
+ "Pic": "gTrainerFrontPic_LeaderBlaine",
488
+ "Palette": "gTrainerPalette_LeaderBlaine"
489
+ },
490
+ "LEADER_SABRINA": {
491
+ "Pic": "gTrainerFrontPic_LeaderSabrina",
492
+ "Palette": "gTrainerPalette_LeaderSabrina"
493
+ },
494
+ "GENTLEMAN": {
495
+ "Pic": "gTrainerFrontPic_Gentleman",
496
+ "Palette": "gTrainerPalette_Gentleman"
497
+ },
498
+ "RIVAL_LATE": {
499
+ "Pic": "gTrainerFrontPic_RivalLate",
500
+ "Palette": "gTrainerPalette_RivalLate"
501
+ },
502
+ "CHAMPION_RIVAL": {
503
+ "Pic": "gTrainerFrontPic_ChampionRival",
504
+ "Palette": "gTrainerPalette_ChampionRival"
505
+ },
506
+ "CHANNELER": {
507
+ "Pic": "gTrainerFrontPic_Channeler",
508
+ "Palette": "gTrainerPalette_Channeler"
509
+ },
510
+ "TWINS": {
511
+ "Pic": "gTrainerFrontPic_Twins",
512
+ "Palette": "gTrainerPalette_Twins"
513
+ },
514
+ "COOL_COUPLE": {
515
+ "Pic": "gTrainerFrontPic_CoolCouple",
516
+ "Palette": "gTrainerPalette_CoolCouple"
517
+ },
518
+ "YOUNG_COUPLE": {
519
+ "Pic": "gTrainerFrontPic_YoungCouple",
520
+ "Palette": "gTrainerPalette_YoungCouple"
521
+ },
522
+ "CRUSH_KIN": {
523
+ "Pic": "gTrainerFrontPic_CrushKin",
524
+ "Palette": "gTrainerPalette_CrushKin"
525
+ },
526
+ "SIS_AND_BRO": {
527
+ "Pic": "gTrainerFrontPic_SisAndBro",
528
+ "Palette": "gTrainerPalette_SisAndBro"
529
+ },
530
+ "PROFESSOR_OAK": {
531
+ "Pic": "gTrainerFrontPic_ProfessorOak",
532
+ "Palette": "gTrainerPalette_ProfessorOak"
533
+ },
534
+ "RS_BRENDAN_2": {
535
+ "Pic": "gTrainerFrontPic_RSBrendan2",
536
+ "Palette": "gTrainerPalette_RSBrendan2"
537
+ },
538
+ "RS_MAY_2": {
539
+ "Pic": "gTrainerFrontPic_RSMay2",
540
+ "Palette": "gTrainerPalette_RSMay2"
541
+ },
542
+ "RED": {
543
+ "Pic": "gTrainerFrontPic_Red",
544
+ "Palette": "gTrainerPalette_Red"
545
+ },
546
+ "LEAF": {
547
+ "Pic": "gTrainerFrontPic_Leaf",
548
+ "Palette": "gTrainerPalette_Leaf"
549
+ },
550
+ "ROCKET_GRUNT_F": {
551
+ "Pic": "gTrainerFrontPic_RocketGruntF",
552
+ "Palette": "gTrainerPalette_RocketGruntF"
553
+ },
554
+ "PSYCHIC_F": {
555
+ "Pic": "gTrainerFrontPic_PsychicF",
556
+ "Palette": "gTrainerPalette_PsychicF"
557
+ },
558
+ "CRUSH_GIRL": {
559
+ "Pic": "gTrainerFrontPic_CrushGirl",
560
+ "Palette": "gTrainerPalette_CrushGirl"
561
+ },
562
+ "TUBER_F": {
563
+ "Pic": "gTrainerFrontPic_TuberF",
564
+ "Palette": "gTrainerPalette_TuberF"
565
+ },
566
+ "POKEMON_BREEDER": {
567
+ "Pic": "gTrainerFrontPic_PokemonBreeder",
568
+ "Palette": "gTrainerPalette_PokemonBreeder"
569
+ },
570
+ "POKEMON_RANGER_M": {
571
+ "Pic": "gTrainerFrontPic_PokemonRangerM",
572
+ "Palette": "gTrainerPalette_PokemonRangerM"
573
+ },
574
+ "POKEMON_RANGER_F": {
575
+ "Pic": "gTrainerFrontPic_PokemonRangerF",
576
+ "Palette": "gTrainerPalette_PokemonRangerF"
577
+ },
578
+ "AROMA_LADY": {
579
+ "Pic": "gTrainerFrontPic_AromaLady",
580
+ "Palette": "gTrainerPalette_AromaLady"
581
+ },
582
+ "RUIN_MANIAC": {
583
+ "Pic": "gTrainerFrontPic_RuinManiac",
584
+ "Palette": "gTrainerPalette_RuinManiac"
585
+ },
586
+ "LADY": {
587
+ "Pic": "gTrainerFrontPic_Lady",
588
+ "Palette": "gTrainerPalette_Lady"
589
+ },
590
+ "PAINTER": {
591
+ "Pic": "gTrainerFrontPic_Painter",
592
+ "Palette": "gTrainerPalette_Painter"
593
+ }
594
+ }