Skip to content

Instantly share code, notes, and snippets.

@meganukebmp
Last active January 21, 2017 17:09
Show Gist options
  • Save meganukebmp/337bde5dba56731affcaf0b2af20e93d to your computer and use it in GitHub Desktop.
Save meganukebmp/337bde5dba56731affcaf0b2af20e93d to your computer and use it in GitHub Desktop.
var Jimp = require("jimp"); // load image manipulator
var plist = require("plist"); // load plist parser
var fs = require("fs"); // load filesystem
var selected = "spider_02"; // INPUT change value for different icons
var COL1 = [255, 0, 0];
var COL2 = [255, 255, 0];
var inputData = plist.parse(fs.readFileSync("./input.plist", "utf8")); // parse plist
var data = inputData.frames; // get frames
var list = Object.keys(inputData.frames).filter(removeShit); // get all item names
var items = list.filter(family,selected).reverse(); // flip the array. Main layer last
// find legs
var legs = items.filter(findLegs);
if (legs.length != 0) {
legs.forEach(element => {
items.splice(items.indexOf(element), 1);
});
items = items.concat(legs);
};
var firstLeg = items.filter(findFirstLeg).reverse();
if (firstLeg.length != 0) {
firstLeg.forEach(element => {
items.unshift(element.replace("001", "002"));
items.unshift(element.replace("001", "003"));
});
};
var middleLeg = items.filter(findMiddleLeg).reverse();
if (middleLeg.length != 0) {
middleLeg.forEach(element => {
items.splice(items.indexOf(element), 1);
items.unshift(element);
});
};
var lastLeg = items.filter(findLastLeg).reverse();
if (lastLeg.length != 0) {
lastLeg.forEach(element => {
items.splice(items.indexOf(element), 1);
items.unshift(element);
});
};
// check if extra image exists if so push extra to the end of array
var extra = items.filter(findExtra);
if (extra.length != 0) {
extra.forEach(element => {
items.splice(items.indexOf(element), 1);
});
items = items.concat(extra);
};
// generate new transparent blank image
var image = new Jimp(200, 100, 0x00000000, function(err, image) {
// read the spritesheet
Jimp.read("input.png", function(err, spritesheet) {
// for each part of the sprite
items.forEach((element, i) => {
var z = spritesheet.clone();
var original = element;
var element = element.replace("002", "001").replace("003", "001");
var x = transform(data[element].textureRect)[0][0];
var y = transform(data[element].textureRect)[0][1];
var sw = transform(data[element].spriteSize)[0];
var sh = transform(data[element].spriteSize)[1];
var ox = transform(data[element].spriteOffset)[0];
var oy = transform(data[element].spriteOffset)[1];
if (data[element].textureRotated) {
var h = transform(data[element].textureRect)[1][0];
var w = transform(data[element].textureRect)[1][1];
} else {
var w = transform(data[element].textureRect)[1][0];
var h = transform(data[element].textureRect)[1][1];
};
z.crop(x, y, w, h);
if (data[element].textureRotated) {
z.rotate(-90);
};
if ( original.includes("002") || original.includes("003")) {
z.brightness(-0.5);
}
z.resize(sw, sh);
// leg offset handling robot
if (element.includes(selected + "_02_") && element.includes("robot_")) {
ox = ox - 20;
oy = oy - 10;
z.rotate(45);
} else if (element.includes(selected + "_03_") && element.includes("robot_")) {
ox = ox - 15;
oy = oy - 30;
z.rotate(-45);
} else if (element.includes(selected + "_04_") && element.includes("robot_")) {
ox = ox;
oy = oy - 32;
};
// leg offset handling spider
if (element.includes(selected + "_02_") && element.includes("spider_") && original.includes("002")) {
ox = ox + 9;
oy = oy - 19;
} else if (element.includes(selected + "_02_") && element.includes("spider_") && original.includes("003")) {
ox = ox + 29;
oy = oy - 19;
z.flip(true, false);
} else if (element.includes(selected + "_02_") && element.includes("spider_")) {
ox = ox - 8;
oy = oy - 19;
} else if (element.includes(selected + "_03_") && element.includes("spider_")) {
ox = ox - 43;
oy = oy - 19;
// crap spider is crap
if (selected == "spider_07") {
ox = ox + 10;
oy = oy + 8;
}
// crap layer 2 handling
if (h < 11) {
ox = ox + 10;
} else if (h < 20 && w < 14) {
ox = ox + 9
oy = oy - 4
};
z.rotate(45);
} else if (element.includes(selected + "_04_") && element.includes("spider_")) {
ox = ox - 15;
oy = oy - 10;
};
px = sw / 2;
py = sh / 2;
console.log(x, y, w, h, sw, sh, ox, oy, element);
image.composite(z, 100 - px + ox, 50 - py - oy);
});
image
.autocrop()
.write("out.png");
});
});
function family(value) {
return value.includes(this);
};
function removeShit(value) {
return !value.includes("_glow_");
};
function findExtra(value) {
return value.includes("_extra_");
};
function findLegs(value) {
return (value.includes(selected + "_02_") && (value.includes("robot_") || value.includes("spider_"))) ||
(value.includes(selected + "_03_") && (value.includes("robot_") || value.includes("spider_"))) ||
(value.includes(selected + "_04_") && (value.includes("robot_") || value.includes("spider_")));
};
function findMiddleLeg(value) {
return value.includes(selected + "_03_") && value.includes("robot_");
}
function findFirstLeg(value) {
return value.includes(selected + "_02_") && value.includes("spider_") && !value.includes("extra");
}
function findLastLeg(value) {
return value.includes(selected + "_04_") && value.includes("spider_");
}
function transform(val) {
return JSON.parse(val.replace(/{/g, "[").replace(/}/g, "]"));
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment