silphscope 1.4.13 → 1.4.15
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 +1 -1
- package/src/graphics/balls/render-ball-particle.js +15 -1
- package/src/graphics/balls/render-balls.js +21 -2
- package/src/graphics/graphics-extractor-main.js +145 -13
- package/src/graphics/icons/render-icons.js +7 -1
- package/src/graphics/mons/render-mon-foot.js +7 -3
- package/src/graphics/moves/render-moves.js +15 -1
- package/src/graphics/trainers/render-trainer-back-pics.js +11 -6
- package/src/graphics/trainers/render-trainers.js +43 -5
package/package.json
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
|
68
|
+
return {
|
|
69
|
+
...(returnFileBuffer && { pngBuffer }),
|
|
70
|
+
fullFileCount,
|
|
71
|
+
};
|
|
66
72
|
}
|
|
@@ -17,7 +17,7 @@ const streamToBuffer = (stream) => new Promise((resolve, reject) => {
|
|
|
17
17
|
export async function renderMonFoot(monName, mons, reader, rom, options = {}) {
|
|
18
18
|
const {
|
|
19
19
|
pngFilterType = null,
|
|
20
|
-
|
|
20
|
+
pngCompressionLevel = null,
|
|
21
21
|
returnFileBuffer,
|
|
22
22
|
outputDir = null,
|
|
23
23
|
} = options;
|
|
@@ -32,7 +32,11 @@ export async function renderMonFoot(monName, mons, reader, rom, options = {}) {
|
|
|
32
32
|
throw new Error(`Missing mon entry for ${monName}`);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
if (monName.includes("UNOWN"))
|
|
35
|
+
if (monName.includes("UNOWN")) {
|
|
36
|
+
return {
|
|
37
|
+
fileCount: 0,
|
|
38
|
+
}
|
|
39
|
+
}
|
|
36
40
|
|
|
37
41
|
const footAsset = resolveMonFootprint(mon, reader, monName); // possibly the easiest change ive had to do if it works first try :o
|
|
38
42
|
if (!footAsset) {
|
|
@@ -78,7 +82,7 @@ export async function renderMonFoot(monName, mons, reader, rom, options = {}) {
|
|
|
78
82
|
png.data = image;
|
|
79
83
|
const pngBuffer = PNG.sync.write(png, {
|
|
80
84
|
filterType: pngFilterType,
|
|
81
|
-
deflateLevel:
|
|
85
|
+
deflateLevel: pngCompressionLevel,
|
|
82
86
|
});
|
|
83
87
|
|
|
84
88
|
if (outputDir) {
|
|
@@ -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
|
|
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
|
-
});
|
|
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
|
-
|
|
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
|
|
126
|
+
return {
|
|
127
|
+
...(returnFileBuffer && { results }),
|
|
128
|
+
fullFileCount,
|
|
129
|
+
};
|
|
92
130
|
}
|