silphscope 1.4.14 → 1.4.16

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/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "silphscope",
3
- "version": "1.4.14",
3
+ "version": "1.4.16",
4
4
  "description": "A firered/leafgreen ROM asset extractor for use in web applications",
5
5
  "main": "main.js",
6
+ "types": "silphscope.d.ts",
6
7
  "exports": {
7
8
  ".": "./main.js"
8
9
  },
@@ -37,6 +37,7 @@ export async function renderBallParticle(ballName, balls, reader, rom, options =
37
37
  const {
38
38
  pngFilterType = null,
39
39
  pngCompressionLevel = null,
40
+ returnFileBuffer = false,
40
41
  outputDir = null,
41
42
  renderMasterBallParticleImage = false,
42
43
  } = options;
@@ -44,6 +45,8 @@ export async function renderBallParticle(ballName, balls, reader, rom, options =
44
45
  throw new TypeError("renderBallParticle(..., rom) requires a ROM Buffer/Uint8Array");
45
46
  }
46
47
 
48
+ let fileCount = 0;
49
+ const results = returnFileBuffer? [] : null;
47
50
  const ball = balls[ballName];
48
51
  if (!ball) {
49
52
  throw new Error(`Missing Ball: ${ballName}`);
@@ -79,6 +82,10 @@ export async function renderBallParticle(ballName, balls, reader, rom, options =
79
82
  if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
80
83
  if (renderMasterBallParticleImage) {
81
84
  fs.writeFileSync(`${dir}/master-particle.png`, pngBuffer);
85
+ fileCount += 1;
86
+ if (returnFileBuffer) {
87
+ results.push(pngBuffer);
88
+ }
82
89
  }
83
90
  for (let i = 0; i < ball.particleFrames.length; i++) {
84
91
  const frame = ball.particleFrames[i];
@@ -93,8 +100,15 @@ export async function renderBallParticle(ballName, balls, reader, rom, options =
93
100
 
94
101
  const fileName = `${dir}/particle-${i}.png`;
95
102
  fs.writeFileSync(fileName, pngFrameBuffer);
103
+ fileCount += 1;
104
+ if (returnFileBuffer) {
105
+ results.push(pngFrameBuffer);
106
+ }
96
107
  }
97
108
  }
98
109
 
99
- return pngBuffer;
110
+ return {
111
+ ...(returnFileBuffer && { results }),
112
+ fileCount,
113
+ };
100
114
  }
@@ -38,6 +38,7 @@ export async function renderBall(ballName, balls, reader, rom, options = {}) {
38
38
  const {
39
39
  pngFilterType = null,
40
40
  pngCompressionLevel = null,
41
+ returnFileBuffer = false,
41
42
  outputDir = null,
42
43
  ballParticles = false,
43
44
  renderMasterBallImage = false,
@@ -47,17 +48,24 @@ export async function renderBall(ballName, balls, reader, rom, options = {}) {
47
48
  throw new TypeError("renderBall(..., rom) requires a ROM Buffer/Uint8Array");
48
49
  }
49
50
 
51
+ let fullFileCount = 0;
52
+ const results = returnFileBuffer? [] : null;
50
53
  const ball = balls[ballName];
51
54
  if (!ball) {
52
55
  throw new Error(`Missing Ball: ${ballName}`);
53
56
  }
54
57
  if (ballParticles) {
55
- renderBallParticle(ballName, balls, reader, rom, {
58
+ const renderBallParticleData = await renderBallParticle(ballName, balls, reader, rom, {
56
59
  pngFilterType,
57
60
  pngCompressionLevel,
61
+ returnFileBuffer,
58
62
  outputDir,
59
63
  renderMasterBallParticleImage,
60
64
  });
65
+ fullFileCount += renderBallParticleData.fileCount;
66
+ if (returnFileBuffer) {
67
+ results.push(...renderBallParticleData.results);
68
+ }
61
69
  }
62
70
  const ballPal = resolveBallSpritePal(ball, reader, ballName);
63
71
  const ballPic = resolveBallSpritePic(ball, reader, ballName);
@@ -89,6 +97,10 @@ export async function renderBall(ballName, balls, reader, rom, options = {}) {
89
97
  await fs.promises.mkdir(dir, { recursive: true });
90
98
  if (renderMasterBallImage) {
91
99
  await fs.promises.writeFile(`${dir}/master-image.png`, pngBuffer)
100
+ fullFileCount += 1;
101
+ if (returnFileBuffer) {
102
+ results.push(pngBuffer);
103
+ }
92
104
  }
93
105
  for (let i = 0; i < ball.frames.length; i++) {
94
106
  const frame = ball.frames[i];
@@ -103,8 +115,15 @@ export async function renderBall(ballName, balls, reader, rom, options = {}) {
103
115
 
104
116
  const fileName = `${dir}/frame-${i}.png`;
105
117
  await fs.promises.writeFile(fileName, pngFrameBuffer);
118
+ fullFileCount += 1;
119
+ if (returnFileBuffer) {
120
+ results.push(pngFrameBuffer);
121
+ }
106
122
  }
107
123
  }
108
124
 
109
- return pngBuffer;
125
+ return {
126
+ ...(returnFileBuffer && { results }),
127
+ fullFileCount,
128
+ };
110
129
  }
@@ -92,7 +92,7 @@ export async function renderAllMons(rom, options = {}) {
92
92
  console.log(`Done: ${monName}`);
93
93
  }
94
94
  totalFileCount += renderMonData.fullFileCount;
95
- if (returnFileBuffer) {
95
+ if (returnFileBuffer && renderMonData?.results) {
96
96
  finalResults.push(...renderMonData.results);
97
97
  }
98
98
  });
@@ -122,10 +122,10 @@ export async function renderAllMons(rom, options = {}) {
122
122
 
123
123
  if (showSummary) {
124
124
  console.log(`
125
- renderAllMons() Output Summary:
126
- Rendered ${Object.keys(providedMons).length} Mons amounting to:
127
- ${totalFileCount} Files written
128
- Done in ${elapsed}s with SilphScope`);
125
+ renderAllMons() Output Summary:
126
+ Rendered ${Object.keys(providedMons).length} Mons amounting to:
127
+ ${totalFileCount} Files written
128
+ Done in ${elapsed}s with SilphScope`);
129
129
  }
130
130
 
131
131
  return {
@@ -135,6 +135,7 @@ export async function renderAllMons(rom, options = {}) {
135
135
  }
136
136
 
137
137
  export async function renderAllIcons(rom, options = {}) {
138
+ const start = performance.now();
138
139
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
139
140
  throw new TypeError("renderAllIcons(rom, options) requires rom Buffer/Uint8Array as first argument");
140
141
  }
@@ -145,6 +146,8 @@ export async function renderAllIcons(rom, options = {}) {
145
146
  pngFilterType = 0,
146
147
  pngCompressionLevel = 4,
147
148
  verboseLogs = true,
149
+ showSummary = true,
150
+ returnFileBuffer = false,
148
151
  outputDir = "./out",
149
152
  } = options;
150
153
 
@@ -162,33 +165,61 @@ export async function renderAllIcons(rom, options = {}) {
162
165
 
163
166
  const config = getRomConfig(rom);
164
167
  const reader = new RomReader(rom, config);
168
+ let totalFileCount = 0;
169
+ const finalResults = returnFileBuffer? [] : null;
165
170
 
166
171
  if (concurrency > 1) {
167
172
  await mapLimit(Object.keys(providedIcons), concurrency, async (itemName) => {
168
- await renderIcon(itemName, providedIcons, reader, rom, {
173
+ const renderIconData = await renderIcon(itemName, providedIcons, reader, rom, {
169
174
  pngFilterType,
170
175
  pngCompressionLevel,
176
+ returnFileBuffer,
171
177
  outputDir,
172
178
  });
173
179
  if (verboseLogs) {
174
180
  console.log(`Done: ${itemName}`);
175
181
  }
182
+ totalFileCount += renderIconData.fullFileCount;
183
+ if (returnFileBuffer && renderIconData?.pngBuffer) {
184
+ finalResults.push(renderIconData.pngBuffer);
185
+ }
176
186
  });
177
187
  } else {
178
188
  for (const itemName of Object.keys(providedIcons)) {
179
- await renderIcon(itemName, providedIcons, reader, rom, {
189
+ const renderIconData = await renderIcon(itemName, providedIcons, reader, rom, {
180
190
  pngFilterType,
181
191
  pngCompressionLevel,
192
+ returnFileBuffer,
182
193
  outputDir,
183
194
  });
184
195
  if (verboseLogs) {
185
196
  console.log(`Done: ${itemName}`);
186
197
  }
198
+ totalFileCount += renderIconData.fullFileCount;
199
+ if (returnFileBuffer && renderIconData?.pngBuffer) {
200
+ finalResults.push(renderIconData.pngBuffer);
201
+ }
187
202
  }
188
203
  }
204
+
205
+ const elapsed = ((performance.now() - start) / 1000).toFixed(2);
206
+
207
+ if (showSummary) {
208
+ console.log(`
209
+ renderAllIcons() Output Summary:
210
+ Rendered ${Object.keys(providedIcons).length} Icons amounting to:
211
+ ${totalFileCount} Files written
212
+ Done in ${elapsed}s with SilphScope`);
213
+ }
214
+
215
+ return {
216
+ totalFileCount,
217
+ ...(returnFileBuffer && { finalResults }),
218
+ };
189
219
  }
190
220
 
191
221
  export async function renderAllTrainers(rom, options = {}) {
222
+ const start = performance.now();
192
223
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
193
224
  throw new TypeError("renderAllTrainers(rom, options) requires rom Buffer/Uint8Array as first argument");
194
225
  }
@@ -201,6 +232,8 @@ export async function renderAllTrainers(rom, options = {}) {
201
232
  pngFilterType = 0,
202
233
  pngCompressionLevel = 4,
203
234
  verboseLogs = true,
235
+ showSummary = true,
236
+ returnFileBuffer = false,
204
237
  outputDir = "./out",
205
238
  } = options;
206
239
 
@@ -218,35 +251,63 @@ export async function renderAllTrainers(rom, options = {}) {
218
251
 
219
252
  const config = getRomConfig(rom);
220
253
  const reader = new RomReader(rom, config);
254
+ let totalFileCount = 0;
255
+ const finalResults = returnFileBuffer? [] : null;
221
256
 
222
257
  if (concurrency > 1) {
223
258
  await mapLimit(Object.keys(providedTrainers), concurrency, async (trainerName) => {
224
- await renderTrainer(trainerName, providedTrainers, providedBackTrainers, reader, rom, {
259
+ const renderTrainerData = await renderTrainer(trainerName, providedTrainers, providedBackTrainers, reader, rom, {
225
260
  trainerBackPics,
226
261
  pngFilterType,
227
262
  pngCompressionLevel,
263
+ returnFileBuffer,
228
264
  outputDir
229
265
  });
230
266
  if (verboseLogs) {
231
267
  console.log(`Done: ${trainerName}`);
232
268
  }
269
+ totalFileCount += renderTrainerData.fullFileCount;
270
+ if (returnFileBuffer && renderTrainerData?.results) {
271
+ finalResults.push(...renderTrainerData.results);
272
+ }
233
273
  });
234
274
  } else {
235
275
  for (const trainerName of Object.keys(providedTrainers)) {
236
- await renderTrainer(trainerName, providedTrainers, providedBackTrainers, reader, rom, {
276
+ const renderTrainerData = await renderTrainer(trainerName, providedTrainers, providedBackTrainers, reader, rom, {
237
277
  trainerBackPics,
238
278
  pngFilterType,
239
279
  pngCompressionLevel,
280
+ returnFileBuffer,
240
281
  outputDir
241
282
  });
242
283
  if (verboseLogs) {
243
284
  console.log(`Done: ${trainerName}`);
244
285
  }
286
+ totalFileCount += renderTrainerData.fullFileCount;
287
+ if (returnFileBuffer && renderTrainerData?.results) {
288
+ finalResults.push(...renderTrainerData.results);
289
+ }
245
290
  }
246
291
  }
292
+
293
+ const elapsed = ((performance.now() - start) / 1000).toFixed(2);
294
+
295
+ if (showSummary) {
296
+ console.log(`
297
+ renderAllTrainers() Output Summary:
298
+ Rendered ${Object.keys(providedTrainers).length} Trainers amounting to:
299
+ ${totalFileCount} Files written
300
+ Done in ${elapsed}s with SilphScope`);
301
+ }
302
+
303
+ return {
304
+ ...(returnFileBuffer && { finalResults }),
305
+ totalFileCount,
306
+ };
247
307
  }
248
308
 
249
309
  export async function renderAllMoves(rom, options = {}) {
310
+ const start = performance.now();
250
311
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
251
312
  throw new TypeError("renderAllMoves(rom, options) requires rom Buffer/Uint8Array as first argument");
252
313
  }
@@ -257,6 +318,8 @@ export async function renderAllMoves(rom, options = {}) {
257
318
  pngFilterType = 0,
258
319
  pngCompressionLevel = 4,
259
320
  verboseLogs = true,
321
+ showSummary = true,
322
+ returnFileBuffer = false,
260
323
  outputDir = "./out",
261
324
  renderMasterImage = true,
262
325
  sortUnused = true,
@@ -276,12 +339,15 @@ export async function renderAllMoves(rom, options = {}) {
276
339
 
277
340
  const config = getRomConfig(rom);
278
341
  const reader = new RomReader(rom, config);
342
+ let totalFileCount = 0;
343
+ const finalResults = returnFileBuffer? [] : null;
279
344
 
280
345
  if (concurrency > 1) {
281
346
  await mapLimit(Object.keys(providedMoves), concurrency, async (moveName) => {
282
- await renderMove(moveName, providedMoves, reader, rom, {
347
+ const renderMoveData = await renderMove(moveName, providedMoves, reader, rom, {
283
348
  pngFilterType,
284
349
  pngCompressionLevel,
350
+ returnFileBuffer,
285
351
  outputDir,
286
352
  renderMasterImage,
287
353
  sortUnused,
@@ -289,12 +355,17 @@ export async function renderAllMoves(rom, options = {}) {
289
355
  if (verboseLogs) {
290
356
  console.log(`Done: ${moveName}`);
291
357
  }
358
+ totalFileCount += renderMoveData.fullFileCount;
359
+ if (returnFileBuffer && renderMoveData?.results) {
360
+ finalResults.push(...renderMoveData.results);
361
+ }
292
362
  });
293
363
  } else {
294
364
  for (const moveName of Object.keys(providedMoves)) {
295
- await renderMove(moveName, providedMoves, reader, rom, {
365
+ const renderMoveData = await renderMove(moveName, providedMoves, reader, rom, {
296
366
  pngFilterType,
297
367
  pngCompressionLevel,
368
+ returnFileBuffer,
298
369
  outputDir,
299
370
  renderMasterImage,
300
371
  sortUnused,
@@ -302,11 +373,31 @@ export async function renderAllMoves(rom, options = {}) {
302
373
  if (verboseLogs) {
303
374
  console.log(`Done: ${moveName}`);
304
375
  }
376
+ totalFileCount += renderMoveData.fullFileCount;
377
+ if (returnFileBuffer && renderMoveData?.results) {
378
+ finalResults.push(...renderMoveData.results);
379
+ }
305
380
  }
306
381
  }
382
+
383
+ const elapsed = ((performance.now() - start) / 1000).toFixed(2);
384
+
385
+ if (showSummary) {
386
+ console.log(`
387
+ renderAllMoves() Output Summary:
388
+ Rendered ${Object.keys(providedMoves).length} Moves amounting to:
389
+ ${totalFileCount} Files written
390
+ Done in ${elapsed}s with SilphScope`);
391
+ }
392
+
393
+ return {
394
+ ...(returnFileBuffer && { finalResults }),
395
+ totalFileCount,
396
+ }
307
397
  }
308
398
 
309
399
  export async function renderAllBalls(rom, options = {}) {
400
+ const start = performance.now();
310
401
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
311
402
  throw new TypeError("renderAllBalls(rom, options) requires rom Buffer/Uint8Array as first argument");
312
403
  }
@@ -317,6 +408,8 @@ export async function renderAllBalls(rom, options = {}) {
317
408
  pngFilterType = 0,
318
409
  pngCompressionLevel = 4,
319
410
  verboseLogs = true,
411
+ showSummary = true,
412
+ returnFileBuffer = false,
320
413
  outputDir = "./out",
321
414
  ballParticles = true,
322
415
  renderMasterBallImage = true,
@@ -337,12 +430,15 @@ export async function renderAllBalls(rom, options = {}) {
337
430
 
338
431
  const config = getRomConfig(rom);
339
432
  const reader = new RomReader(rom, config);
433
+ let totalFileCount = 0;
434
+ const finalResults = returnFileBuffer? [] : null;
340
435
 
341
436
  if (concurrency > 1) {
342
437
  await mapLimit(Object.keys(providedBalls), concurrency, async (ballName) => {
343
- await renderBall(ballName, providedBalls, reader, rom, {
438
+ const renderBallData = await renderBall(ballName, providedBalls, reader, rom, {
344
439
  pngFilterType,
345
440
  pngCompressionLevel,
441
+ returnFileBuffer,
346
442
  outputDir,
347
443
  ballParticles,
348
444
  renderMasterBallImage,
@@ -351,12 +447,17 @@ export async function renderAllBalls(rom, options = {}) {
351
447
  if (verboseLogs) {
352
448
  console.log(`Done: ${ballName}`);
353
449
  }
450
+ totalFileCount += renderBallData.fullFileCount;
451
+ if (returnFileBuffer) {
452
+ finalResults.push(...renderBallData.results);
453
+ }
354
454
  })
355
455
  } else {
356
456
  for (const ballName of Object.keys(providedBalls)) {
357
- await renderBall(ballName, providedBalls, reader, rom, {
457
+ const renderBallData = await renderBall(ballName, providedBalls, reader, rom, {
358
458
  pngFilterType,
359
459
  pngCompressionLevel,
460
+ returnFileBuffer,
360
461
  outputDir,
361
462
  ballParticles,
362
463
  renderMasterBallImage,
@@ -365,8 +466,27 @@ export async function renderAllBalls(rom, options = {}) {
365
466
  if (verboseLogs) {
366
467
  console.log(`Done: ${ballName}`);
367
468
  }
469
+ totalFileCount += renderBallData.fullFileCount;
470
+ if (returnFileBuffer) {
471
+ finalResults.push(...renderBallData.results);
472
+ }
368
473
  }
369
474
  }
475
+
476
+ const elapsed = ((performance.now() - start) / 1000).toFixed(2);
477
+
478
+ if (showSummary) {
479
+ console.log(`
480
+ renderAllBalls() Output Summary:
481
+ Rendered ${Object.keys(providedBalls).length} Balls amounting to:
482
+ ${totalFileCount} Files written
483
+ Done in ${elapsed}s with SilphScope`);
484
+ }
485
+
486
+ return {
487
+ ...(returnFileBuffer && { finalResults }),
488
+ totalFileCount,
489
+ };
370
490
  }
371
491
 
372
492
  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
@@ -379,6 +499,8 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
379
499
  pngFilterType = 0,
380
500
  pngCompressionLevel = 4,
381
501
  verboseLogs = true,
502
+ showSummary = true,
503
+ returnFileBuffer = false,
382
504
  outputMonDir = "./out/mons",
383
505
  outputIconDir = "./out/icons",
384
506
  outputTrainerDir = "./out/trainers",
@@ -402,6 +524,8 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
402
524
  pngFilterType,
403
525
  pngCompressionLevel,
404
526
  verboseLogs,
527
+ showSummary,
528
+ returnFileBuffer,
405
529
  outputDir: outputMonDir,
406
530
  icon: true,
407
531
  footprint: true,
@@ -412,6 +536,8 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
412
536
  pngFilterType,
413
537
  pngCompressionLevel,
414
538
  verboseLogs,
539
+ showSummary,
540
+ returnFileBuffer,
415
541
  outputDir: outputIconDir,
416
542
  });
417
543
 
@@ -420,6 +546,8 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
420
546
  pngFilterType,
421
547
  pngCompressionLevel,
422
548
  verboseLogs,
549
+ showSummary,
550
+ returnFileBuffer,
423
551
  outputDir: outputTrainerDir,
424
552
  trainerBackPics: true,
425
553
  });
@@ -429,6 +557,8 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
429
557
  pngFilterType,
430
558
  pngCompressionLevel,
431
559
  verboseLogs,
560
+ showSummary,
561
+ returnFileBuffer,
432
562
  outputDir: outputMoveDir,
433
563
  renderMasterImage: true,
434
564
  sortUnused: sortUnusedMoves,
@@ -439,6 +569,8 @@ export async function renderAllGraphics(rom, options = {}) { // eventually I wil
439
569
  pngFilterType,
440
570
  pngCompressionLevel,
441
571
  verboseLogs,
572
+ showSummary,
573
+ returnFileBuffer,
442
574
  outputDir: outputBallDir,
443
575
  ballParticles: true,
444
576
  renderMasterBallImage: true,
@@ -18,6 +18,7 @@ export async function renderIcon(itemName, items, reader, rom, options = {}) {
18
18
  const {
19
19
  pngFilterType = null,
20
20
  pngCompressionType = null,
21
+ returnFileBuffer = false,
21
22
  outputDir = null
22
23
  } = options;
23
24
 
@@ -25,6 +26,7 @@ export async function renderIcon(itemName, items, reader, rom, options = {}) {
25
26
  throw new TypeError("renderIcon(..., rom) requires a ROM Buffer/Uint8Array");
26
27
  }
27
28
 
29
+ let fullFileCount = 0;
28
30
  const item = items[itemName];
29
31
  if (!item) {
30
32
  throw new Error(`Missing Item: ${itemName}`);
@@ -60,7 +62,11 @@ export async function renderIcon(itemName, items, reader, rom, options = {}) {
60
62
  await fs.promises.mkdir(dir, { recursive: true });
61
63
  const fileName = `${dir}/icon.png`;
62
64
  await fs.promises.writeFile(fileName, pngBuffer);
65
+ fullFileCount += 1;
63
66
  }
64
67
 
65
- return pngBuffer;
68
+ return {
69
+ ...(returnFileBuffer && { pngBuffer }),
70
+ fullFileCount,
71
+ };
66
72
  }
@@ -39,6 +39,7 @@ export async function renderMove(moveName, moves, reader, rom, options = {}) {
39
39
  const {
40
40
  pngFilterType = null,
41
41
  pngCompressionLevel = null,
42
+ returnFileBuffer = false,
42
43
  outputDir = null,
43
44
  renderMasterImage = false,
44
45
  sortUnused = false,
@@ -47,6 +48,8 @@ export async function renderMove(moveName, moves, reader, rom, options = {}) {
47
48
  throw new TypeError("renderMove(..., rom) requires a ROM Buffer/Uint8Array");
48
49
  }
49
50
 
51
+ let fullFileCount = 0;
52
+ const results = returnFileBuffer? [] : null;
50
53
  const move = moves[moveName];
51
54
  if (!move) {
52
55
  throw new Error(`Missing move: ${moveName}`)
@@ -89,6 +92,10 @@ export async function renderMove(moveName, moves, reader, rom, options = {}) {
89
92
  deflateLevel: pngCompressionLevel,
90
93
  });
91
94
  await fs.promises.writeFile(`${dir}/master.png`, pngBuffer);
95
+ fullFileCount += 1;
96
+ if (returnFileBuffer) {
97
+ results.push(pngBuffer);
98
+ }
92
99
  }
93
100
  for (let i = 0; i < move.frames.length; i++) {
94
101
  const frame = move.frames[i];
@@ -103,8 +110,15 @@ export async function renderMove(moveName, moves, reader, rom, options = {}) {
103
110
 
104
111
  const fileName = `${dir}/frame-${i}.png`;
105
112
  await fs.promises.writeFile(fileName, pngBuffer);
113
+ fullFileCount += 1;
114
+ if (returnFileBuffer) {
115
+ results.push(pngBuffer);
116
+ }
106
117
  }
107
118
  }
108
119
 
109
- return pngBuffer;
120
+ return {
121
+ ...(returnFileBuffer && { results }),
122
+ fullFileCount,
123
+ };
110
124
  }
@@ -19,6 +19,7 @@ export async function renderTrainerBackPic(trainerName, trainers, reader, rom, o
19
19
  const {
20
20
  pngFilterType = null,
21
21
  pngCompressionLevel = null,
22
+ returnFileBuffer = false,
22
23
  outputDir = null
23
24
  } = options;
24
25
 
@@ -26,6 +27,7 @@ export async function renderTrainerBackPic(trainerName, trainers, reader, rom, o
26
27
  throw new TypeError("renderTrainerBackPic(..., rom) requires a ROM Buffer/Uint8Array");
27
28
  }
28
29
 
30
+ let fileCount = 0;
29
31
  const trainer = trainers[trainerName];
30
32
  if (!trainer) {
31
33
  throw new Error(`Missing trainer entry for ${trainerName}`);
@@ -87,7 +89,7 @@ export async function renderTrainerBackPic(trainerName, trainers, reader, rom, o
87
89
  filterType: pngFilterType,
88
90
  deflateLevel: pngCompressionLevel,
89
91
  });
90
- let buffer5
92
+ let buffer5 = null;
91
93
 
92
94
  if (outputDir) {
93
95
  const dir = `${outputDir}/${trainerName}`;
@@ -96,6 +98,7 @@ export async function renderTrainerBackPic(trainerName, trainers, reader, rom, o
96
98
  await fs.promises.writeFile(`${dir}/trainer_back_frame_2.png`, buffer2);
97
99
  await fs.promises.writeFile(`${dir}/trainer_back_frame_3.png`, buffer3);
98
100
  await fs.promises.writeFile(`${dir}/trainer_back_frame_4.png`, buffer4);
101
+ fileCount += 4;
99
102
  if (frame5) {
100
103
  const pngFrame5 = new PNG({ width, height: frameHeight });
101
104
  pngFrame5.data = frame5;
@@ -104,14 +107,16 @@ export async function renderTrainerBackPic(trainerName, trainers, reader, rom, o
104
107
  deflateLevel: pngCompressionLevel,
105
108
  });
106
109
  fs.writeFileSync(`${dir}/trainer_back_frame_5.png`, buffer5);
110
+ fileCount += 1;
107
111
  }
108
112
  }
109
113
 
110
114
  return {
111
- frame1: buffer1,
112
- frame2: buffer2,
113
- frame3: buffer3,
114
- frame4: buffer4,
115
- frame5: buffer5,
115
+ ...(returnFileBuffer && { frame1: buffer1 }),
116
+ ...(returnFileBuffer && { frame2: buffer2 }),
117
+ ...(returnFileBuffer && { frame3: buffer3 }),
118
+ ...(returnFileBuffer && { frame4: buffer4 }),
119
+ ...(returnFileBuffer && { frame5: buffer5 }),
120
+ fileCount,
116
121
  };
117
122
  }
@@ -21,12 +21,15 @@ export async function renderTrainer(trainerName, trainers, backTrainers, reader,
21
21
  trainerBackPics = false,
22
22
  pngFilterType = null,
23
23
  pngCompressionLevel = null,
24
+ returnFileBuffer = false,
24
25
  outputDir = null,
25
26
  } = options;
26
27
  if (!rom || !(rom instanceof Uint8Array || Buffer.isBuffer(rom))) {
27
28
  throw new TypeError("renderTrainer(..., rom) requires a ROM Buffer/Uint8Array");
28
29
  }
29
30
 
31
+ let fullFileCount = 0;
32
+ let results = returnFileBuffer? [] : null;
30
33
  const trainer = trainers[trainerName];
31
34
  if (!trainer) {
32
35
  throw new Error(`Missing Trainer: ${trainerName}`);
@@ -36,23 +39,50 @@ export async function renderTrainer(trainerName, trainers, backTrainers, reader,
36
39
  ? trainerName
37
40
  : false;
38
41
  if (backTrainerName) {
39
- await renderTrainerBackPic(backTrainerName, backTrainers, reader, rom, {
42
+ const trainerBackPicData = await renderTrainerBackPic(backTrainerName, backTrainers, reader, rom, {
40
43
  pngFilterType,
41
44
  pngCompressionLevel,
45
+ returnFileBuffer,
42
46
  outputDir,
43
- }); // that could have been bad lol I forgot to add await :p
47
+ });
48
+ fullFileCount += trainerBackPicData.fileCount;
49
+ if (returnFileBuffer) {
50
+ results.push(trainerBackPicData.frame1);
51
+ results.push(trainerBackPicData.frame2);
52
+ results.push(trainerBackPicData.frame3);
53
+ results.push(trainerBackPicData.frame4);
54
+ if (trainerBackPicData?.frame5) {
55
+ results.push(trainerBackPicData.frame5);
56
+ }
57
+ }
44
58
  }
45
59
  else if (backTrainerName === false && trainerName === "PAINTER") {
46
- await renderTrainerBackPic("OLDMAN", backTrainers, reader, rom, {
60
+ const trainerBackPicData = await renderTrainerBackPic("OLDMAN", backTrainers, reader, rom, {
47
61
  pngFilterType,
48
62
  pngCompressionLevel,
63
+ returnFileBuffer,
49
64
  outputDir,
50
65
  });
51
- await renderTrainerBackPic("POKEDUDE", backTrainers, reader, rom, {
66
+ fullFileCount += trainerBackPicData.fileCount;
67
+ if (returnFileBuffer) {
68
+ results.push(trainerBackPicData.frame1);
69
+ results.push(trainerBackPicData.frame2);
70
+ results.push(trainerBackPicData.frame3);
71
+ results.push(trainerBackPicData.frame4);
72
+ }
73
+ const trainerBackPicData2 = await renderTrainerBackPic("POKEDUDE", backTrainers, reader, rom, {
52
74
  pngFilterType,
53
75
  pngCompressionLevel,
76
+ returnFileBuffer,
54
77
  outputDir,
55
78
  });
79
+ fullFileCount += trainerBackPicData2.fileCount;
80
+ if (returnFileBuffer) {
81
+ results.push(trainerBackPicData.frame1);
82
+ results.push(trainerBackPicData.frame2);
83
+ results.push(trainerBackPicData.frame3);
84
+ results.push(trainerBackPicData.frame4);
85
+ }
56
86
  }
57
87
  }
58
88
  const trainerPal = resolveTrainerFrontPicPal(trainer, reader, trainerName);
@@ -81,12 +111,20 @@ export async function renderTrainer(trainerName, trainers, backTrainers, reader,
81
111
  deflateLevel: pngCompressionLevel,
82
112
  });
83
113
 
114
+ if (returnFileBuffer) {
115
+ results.push(pngBuffer);
116
+ }
117
+
84
118
  if (outputDir) {
85
119
  const dir = `${outputDir}/${trainerName}`;
86
120
  await fs.promises.mkdir(dir, { recursive: true });
87
121
  const fileName = `${dir}/trainer_front.png`;
88
122
  await fs.promises.writeFile(fileName, pngBuffer);
123
+ fullFileCount += 1;
89
124
  }
90
125
 
91
- return pngBuffer;
126
+ return {
127
+ ...(returnFileBuffer && { results }),
128
+ fullFileCount,
129
+ };
92
130
  }