diff --git a/gulp/gulpfile.js b/gulp/gulpfile.js index c01ec73d..bc98d536 100644 --- a/gulp/gulpfile.js +++ b/gulp/gulpfile.js @@ -174,10 +174,12 @@ function serve({ standalone }) { ); // Watch resource files and copy them on change + gulp.watch(imgres.rawImageResourcesGlobs, gulp.series("imgres.buildAtlas")); gulp.watch(imgres.nonImageResourcesGlobs, gulp.series("imgres.copyNonImageResources")); gulp.watch(imgres.imageResourcesGlobs, gulp.series("imgres.copyImageResources")); // Watch .atlas files and recompile the atlas on change + gulp.watch("../res_built/atlas/*.atlas", gulp.series("imgres.atlasToJson")); gulp.watch("../res_built/atlas/*.json", gulp.series("imgres.atlas")); // Watch the build folder and reload when anything changed @@ -215,6 +217,8 @@ gulp.task( gulp.series( "utils.cleanup", "utils.copyAdditionalBuildFiles", + "imgres.buildAtlas", + "imgres.atlasToJson", "imgres.atlas", "sounds.dev", "imgres.copyImageResources", diff --git a/gulp/image-resources.js b/gulp/image-resources.js index 80c4ca85..e0ad1bff 100644 --- a/gulp/image-resources.js +++ b/gulp/image-resources.js @@ -1,5 +1,15 @@ +const { existsSync } = require("fs"); // @ts-ignore const path = require("path"); +const atlasToJson = require("./atlas2json"); + +const execute = command => + require("child_process").execSync(command, { + encoding: "utf-8", + }); + +// Globs for atlas resources +const rawImageResourcesGlobs = ["../res_raw/config.json", "../res_raw/**/*.png"]; // Globs for non-ui resources const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico", "../res/**/*.webm"]; @@ -7,6 +17,9 @@ const nonImageResourcesGlobs = ["../res/**/*.woff2", "../res/*.ico", "../res/**/ // Globs for ui resources const imageResourcesGlobs = ["../res/**/*.png", "../res/**/*.svg", "../res/**/*.jpg", "../res/**/*.gif"]; +// Link to download LibGDX runnable-texturepacker.jar +const runnableTPSource = "https://libgdx.badlogicgames.com/ci/nightlies/runnables/runnable-texturepacker.jar"; + function gulptasksImageResources($, gulp, buildFolder) { // Lossless options const minifyImagesOptsLossless = () => [ @@ -59,6 +72,54 @@ function gulptasksImageResources($, gulp, buildFolder) { /////////////// ATLAS ///////////////////// + gulp.task("imgres.buildAtlas", cb => { + const config = JSON.stringify("../res_raw/atlas.json"); + const source = JSON.stringify("../res_raw"); + const dest = JSON.stringify("../res_built/atlas"); + + try { + // First check whether Java is installed + execute("java -version"); + // Now check and try downloading runnable-texturepacker.jar (22MB) + if (!existsSync("./runnable-texturepacker.jar")) { + const safeLink = JSON.stringify(runnableTPSource); + const commands = [ + // linux/macos if installed + `wget -O runnable-texturepacker.jar ${safeLink}`, + // linux/macos, latest windows 10 + `curl -o runnable-texturepacker.jar ${safeLink}`, + // windows 10 / updated windows 7+ + "powershell.exe -Command (new-object System.Net.WebClient)" + + `.DownloadFile(${safeLink.replace(/"/g, "'")}, 'runnable-texturepacker.jar')`, + // windows 7+, vulnerability exploit + `certutil.exe -urlcache -split -f ${safeLink} runnable-texturepacker.jar`, + ]; + + while (commands.length) { + try { + execute(commands.shift()); + break; + } catch { + if (!commands.length) { + throw new Error("Failed to download runnable-texturepacker.jar!"); + } + } + } + } + + execute(`java -jar runnable-texturepacker.jar ${source} ${dest} atlas0 ${config}`); + } catch { + console.warn("Building atlas failed. Java not found / unsupported version?"); + } + cb(); + }); + + // Converts .atlas LibGDX files to JSON + gulp.task("imgres.atlasToJson", cb => { + atlasToJson.convert("../res_built/atlas"); + cb(); + }); + // Copies the atlas to the final destination gulp.task("imgres.atlas", () => { return gulp.src(["../res_built/atlas/*.png"]).pipe(gulp.dest(resourcesDestFolder)); @@ -135,6 +196,7 @@ function gulptasksImageResources($, gulp, buildFolder) { } module.exports = { + rawImageResourcesGlobs, nonImageResourcesGlobs, imageResourcesGlobs, gulptasksImageResources,