apply plugin: "java" sourceCompatibility = 1.8 sourceSets.main.java.srcDirs = [ "src/" ] import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.tools.texturepacker.TexturePacker import javax.imageio.ImageIO import java.awt.image.BufferedImage def outFolder = "../core/assets-raw/sprites_out/" def genFolder = "../core/assets-raw/sprites_out/generated/" def scaling = "XBRZ 4x" def do4 = true task swapColors(){ doLast{ if (project.hasProperty("colors")) { def carr = new File(getProperty("colors")).text.split("\n") def map = [:] def swaps = 0 carr.each {str -> map[Color.argb8888(Color.valueOf(str.split("=")[0]))] = Color.argb8888(Color.valueOf(str.split("=")[1]))} def tmpc = new Color() fileTree(dir: '../core/assets-raw/sprites', include: "**/*.png").visit { file -> if(file.isDirectory()) return swaps ++ def img = ImageIO.read(file.file) for (x in (0..img.getWidth()-1)) { for (y in (0..img.getHeight()-1)) { def c = img.getRGB(x, y) Color.argb8888ToColor(tmpc, c) if(tmpc.a < 0.1f) continue if(map.containsKey(c)){ img.setRGB(x, y, (int)map.get(c)) } } } ImageIO.write(img, "png", file.file) } println "Swapped $swaps images." }else{ throw new InvalidUserDataException("No replacement colors specified. Use -Pcolors=\"\"") } } } task scaleSprites4x(){ doLast{ fileTree(dir: '../core/assets-raw/sprites_out/', include: "**/*.png").visit { file -> if(file.isDirectory() || file.toString().contains("/ui/")) return; for(int iteration in 0..1) { def image = ImageIO.read(file.file) def scaled = new BufferedImage(image.getWidth() * 2, image.getHeight() * 2, BufferedImage.TYPE_INT_ARGB) def getRGB = { int ix, int iy -> return image.getRGB(Math.max(Math.min(ix, image.width - 1), 0), Math.max(Math.min(iy, image.height - 1), 0)) } for (int x = 0; x < image.getWidth(); x++) { for (int y = 0; y < image.getHeight(); y++) { int p = image.getRGB(x, y) int p1 = p, p2 = p, p3 = p, p4 = p int A = getRGB(x, y + 1), B = getRGB(x + 1, y), C = getRGB(x - 1, y), D = getRGB(x, y - 1); if (C == A && C != D && A != B) p1 = A if (A == B && A != C && B != D) p2 = B if (D == C && D != B && C != A) p3 = C if (B == D && B != A && D != C) p4 = D scaled.setRGB(x * 2, y * 2 + 1, p1) scaled.setRGB(x * 2 + 1, y * 2 + 1, p2) scaled.setRGB(x * 2, y * 2, p3) scaled.setRGB(x * 2 + 1, y * 2, p4) } } ImageIO.write(scaled, "png", file.file) } } } } task scaleSprites(){ finalizedBy 'genSprites' if(do4) dependsOn 'scaleSprites4x' doLast{ def arguments = ["mono", "ImageResizer.exe"] fileTree(dir: '../core/assets-raw/sprites/', include: "**/*.png").visit { file -> if(file.isDirectory() || file.toString().contains("/ui/")) return; def write = new File(file.file.toString().replace("/sprites", "/sprites_out")) arguments += ["/load", file.file.toString(), "/resize", "auto", scaling, "/save", write.toString()] } if(!do4) exec{ commandLine arguments } } } task pack(){ dependsOn 'cleanSprites', 'scaleSprites' doLast{ copy{ from "../core/assets-raw/sprites_replacement/" into "../core/assets-raw/sprites_out/" } TexturePacker.process("core/assets-raw/sprites_out/", "core/assets/sprites/", "sprites.atlas") delete{ // delete outFolder } } } task cleanSprites(){ doLast{ delete{ delete "../core/assets-raw/sprites_out/" } copy{ from "../core/assets-raw/sprites/" into "../core/assets-raw/sprites_out/" } file(genFolder).mkdirs() } } task genSprites(dependsOn: classes, type: JavaExec) { main = "io.anuke.mindustry.PackerLauncher" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = genFolder } task updateBundles(dependsOn: classes, type: JavaExec) { file(genFolder).mkdirs() main = "io.anuke.mindustry.BundleLauncher" classpath = sourceSets.main.runtimeClasspath standardInput = System.in workingDir = "../core/assets/bundles/" }