Dawn/scripts/tools/characters/sprite-generator.js
2021-08-21 11:46:04 -07:00

56 lines
1.6 KiB
JavaScript

const path = require('path');
const { imageCreate, imageWrite, imageLoad, imageCopy } = require('./../../utils/image');
const fs =require('fs');
// Where to crop
const FACE_AREA = { x: 367, y: 256, width: 280, height: 280 };
// Where the images are stored
const IMAGES_ROOT = path.join(...[
'.',
'assets',
'characters',
'penny',
'sprites'
]);
// Which image directories to crop
const IMAGES_DIRECTORIES = [ 'eyebrows', 'eyes', 'mouths' ];
(async () => {
// Load the base
const base = await imageLoad(path.join(IMAGES_ROOT, 'dealer.png'));
let columnsMax = 0;
for(let row = 0; row < IMAGES_DIRECTORIES.length; row++) {
const dir = path.join(IMAGES_ROOT, IMAGES_DIRECTORIES[row]);
const scan = fs.readdirSync(dir);
columnsMax = Math.max(scan.length, columnsMax);
}
// Create the output buffer
const out = imageCreate(base.width+(columnsMax*FACE_AREA.width), base.height);
// Copy the base
imageCopy(out, base, 0, 0);
// Now begin copying the children, row is defined by the directory
for(let row = 0; row < IMAGES_DIRECTORIES.length; row++) {
const dir = path.join(IMAGES_ROOT, IMAGES_DIRECTORIES[row]);
const scan = fs.readdirSync(dir);
// Column defined by the file index
for(let col = 0; col < scan.length; col++) {
const img = await imageLoad(path.join(dir, scan[col]));
console.log('Copying', scan[col]);
imageCopy(out, img,
base.width+(col*FACE_AREA.width), FACE_AREA.height*row,
FACE_AREA
);
}
}
await imageWrite(out, path.join(IMAGES_ROOT, 'sheet.png'));
})().catch(console.error);