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 - 1, y + 1), B = getRGB(x, y + 1), C = getRGB(x + 1, y + 1), D = getRGB(x - 1, y), E = getRGB(x, y), F = getRGB(x + 1, y), G = getRGB(x - 1, y - 1), H = getRGB(x, y - 1), I = getRGB(x + 1, y - 1), J = getRGB(x, y + 2), K = getRGB(x - 2, y), L = getRGB(x + 2, y), M = getRGB(x, y - 2); if (B==D && B!=F && D!=H && (E!=A || E==C || E==G || A==J || A==K)) p1 = B if (B==F & B!=D & F!=H && (E!=C || E==A || E==I || C==J || C==L)) p2 = F if (D==H & B!=D & F!=H && (E!=G || E==A || E==I || G==K || G==M)) p3 = D if (F==H & B!=F & D!=H && (E!=I || E==C || E==G || I==L || I==M)) p4 = H 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' }else{ 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()] } exec { commandLine arguments } } } } task pack(){ dependsOn 'cleanSprites', 'scaleSprites' //finalizedBy 'cleanup' 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") } } task cleanup(){ doLast { delete { delete genFolder 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/" }