Last active
January 21, 2017 17:09
-
-
Save meganukebmp/337bde5dba56731affcaf0b2af20e93d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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