diff --git a/Dockerfile b/Dockerfile index 80b138c..f9f2778 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,14 +9,13 @@ WORKDIR /render COPY --from=build /build/render/build/libs/render.jar . COPY .revisions . COPY render/src/main/compress.sh . -RUN chmod +x compress.sh RUN apk update && \ apk add git pngquant && \ mkdir -p tmp/repo && \ git clone --progress https://github.com/TauCetiStation/TauCetiClassic.git tmp/repo && \ java -Xms1g -Xmx1g -jar render.jar && \ -./compress.sh +chmod +x compress.sh && ./compress.sh FROM oracle/graalvm-ce:1.0.0-rc11 as native WORKDIR /native diff --git a/render/build.gradle.kts b/render/build.gradle.kts index f46d2e0..928c0c2 100644 --- a/render/build.gradle.kts +++ b/render/build.gradle.kts @@ -14,6 +14,7 @@ application { dependencies { implementation(kotlin("stdlib-jdk8")) implementation(group = "io.github.spair", name = "byond-dmm-util", version = "1.0.1") + implementation(group = "com.eclipsesource.minimal-json", name = "minimal-json", version = "0.9.5") } tasks { diff --git a/render/src/main/kotlin/io/github/spair/tauwebmap/configuration.kt b/render/src/main/kotlin/io/github/spair/tauwebmap/configuration.kt new file mode 100644 index 0000000..d0b3bd7 --- /dev/null +++ b/render/src/main/kotlin/io/github/spair/tauwebmap/configuration.kt @@ -0,0 +1,90 @@ +package io.github.spair.tauwebmap + +import com.eclipsesource.json.Json +import com.eclipsesource.json.JsonObject + +private const val CONFIG_FILE = "config.json" + +private const val MORE_EQUAL_ENTRY = ">=" +private const val MORE_ENTRY = ">" +private const val EQUAL_ENTRY = "==" +private const val LESS_ENTRY = "<" +private const val LESS_EQUAL_ENTRY = "<=" + +val RENDER_CONFIG = mutableMapOf>() + +fun readConfigForRevisions(revisionList: List) { + val configJson = Json.parse(readResource(CONFIG_FILE)).asObject() + + configJson.entryForEach(MORE_EQUAL_ENTRY) { config -> + for (revision in revisionList) { + addToRenderConfig(revision, config) + if (config.getRevision() == revision) { + break + } + } + } + configJson.entryForEach(MORE_ENTRY) { config -> + for (revision in revisionList) { + if (config.getRevision() == revision) { + break + } + addToRenderConfig(revision, config) + } + } + configJson.entryForEach(EQUAL_ENTRY) { config -> + for (revision in revisionList) { + if (config.getRevision() == revision) { + addToRenderConfig(revision, config) + } + } + } + configJson.entryForEach(LESS_ENTRY) { config -> + for (revision in revisionList.reversed()) { + if (config.getRevision() == revision) { + break + } + addToRenderConfig(revision, config) + } + } + configJson.entryForEach(LESS_EQUAL_ENTRY) { config -> + for (revision in revisionList.reversed()) { + addToRenderConfig(revision, config) + if (config.getRevision() == revision) { + break + } + } + } +} + +private fun addToRenderConfig(revision: String, config: JsonObject) { + if (config.renderExcluded(revision)) + return + RENDER_CONFIG.getOrPut(revision) { mutableListOf() }.let { list -> + config.getRender().forEach { renderFileName -> + list.add(renderFileName.asString()) + } + } +} + +private fun JsonObject.entryForEach(entryName: String, action: (JsonObject) -> (Unit)) { + get(entryName)?.asArray()?.forEach { action(it.asObject()) } +} + +private fun JsonObject.getRender() = get("render").asArray() +private fun JsonObject.getRevision() = get("revision").asString() + +private fun JsonObject.renderExcluded(revision: String): Boolean { + val exclude = get("render_exclude")?.asArray() + if (exclude != null) { + for (excl in exclude) { + if (revision == excl.asString()) { + return true + } + } + } + return false +} + +internal class Resource +fun readResource(path: String) = Resource::class.java.classLoader.getResource(path).readText() diff --git a/render/src/main/kotlin/io/github/spair/tauwebmap/render.kt b/render/src/main/kotlin/io/github/spair/tauwebmap/render.kt index 5479e5b..2c85e4b 100644 --- a/render/src/main/kotlin/io/github/spair/tauwebmap/render.kt +++ b/render/src/main/kotlin/io/github/spair/tauwebmap/render.kt @@ -1,5 +1,6 @@ package io.github.spair.tauwebmap +import io.github.spair.byond.dme.Dme import io.github.spair.byond.dme.parser.DmeParser import io.github.spair.byond.dmm.Dmm import io.github.spair.byond.dmm.drawer.DmmDrawer @@ -31,9 +32,20 @@ private val IGNORE_TYPES = arrayOf("/turf/space", "/area", "/obj/effect/landmark private val ZOOM_FACTORS = mapOf(3 to 8, 4 to 16, 5 to 32) private val SCALE_FACTORS = mapOf(3 to 0.3, 4 to 0.6, 5 to 1.0) +private var CURRENT_REVISION = "" + fun main() { + val revisionList = mutableListOf() + File(REVISIONS).forEachLine { line -> - val revision = line.split(" ")[1] + if (line.isNotBlank()) { + revisionList.add(line.split(" ")[1]) + } + } + + readConfigForRevisions(revisionList) + + revisionList.forEach { revision -> ProcessBuilder("git", "checkout", revision).directory(File(REPO_PATH)).start().waitFor() renderRevision(revision) } @@ -41,6 +53,7 @@ fun main() { private fun renderRevision(revision: String) { println("Generating images for $revision:") + CURRENT_REVISION = revision LAYERS.forEach { layer -> print(" - $layer...") renderLayer("data/maps/$revision/$layer", TYPES_TO_RENDER.getValue(layer)) @@ -57,10 +70,8 @@ private fun renderLayer(layerFolderPath: String, typesToUse: Array) { } } -internal class Resource private fun generateMapImage(typesToUse: Array): BufferedImage { - val dme = DmeParser.parse(File(DME_PATH)) - dme.mergeWithJson(Resource::class.java.classLoader.getResourceAsStream("render_config.json")) + val dme = DmeParser.parse(File(DME_PATH)).apply { mergeDmeWithConfigJsons(this) } val dmmData = DmmReader.readMap(File(DMM_PATH)) val dmm = Dmm(dmmData, dme) @@ -71,6 +82,12 @@ private fun generateMapImage(typesToUse: Array): BufferedImage { } } +private fun mergeDmeWithConfigJsons(dme: Dme) { + RENDER_CONFIG[CURRENT_REVISION]?.forEach { filePath -> + dme.mergeWithJson(readResource(filePath)) + } +} + private fun createSubImages(img: BufferedImage, zoomFolderPath: String, zoomFactor: Int, scaleFactor: Double) { val imageToCrop: BufferedImage diff --git a/render/src/main/resources/render_config.json b/render/src/main/resources/common_render.json similarity index 100% rename from render/src/main/resources/render_config.json rename to render/src/main/resources/common_render.json diff --git a/render/src/main/resources/config.json b/render/src/main/resources/config.json new file mode 100644 index 0000000..3bd9546 --- /dev/null +++ b/render/src/main/resources/config.json @@ -0,0 +1,16 @@ +{ + ">=": [ + { + "revision": "887f80dff", + "render": [ + "common_render.json" + ] + }, + { + "revision": "1f995d5f7", + "render": [ + "specific_render/from_1f995d5f7.json" + ] + } + ] +} diff --git a/render/src/main/resources/specific_render/from_1f995d5f7.json b/render/src/main/resources/specific_render/from_1f995d5f7.json new file mode 100644 index 0000000..d87e04b --- /dev/null +++ b/render/src/main/resources/specific_render/from_1f995d5f7.json @@ -0,0 +1,47 @@ +{ + "definitions": [ + { + "type": "/turf/simulated/floor", + "parent": "/turf/simulated", + "subtypes": [], + "vars": { + "plane": -1 + } + },{ + "type": "/obj/machinery/ai_slipper", + "parent": "/obj/machinery", + "subtypes": [], + "vars": { + "plane": -1 + } + },{ + "type": "/obj/machinery/hologram/holopad", + "parent": "/obj/machinery/hologram", + "subtypes": [], + "vars": { + "plane": -1 + } + },{ + "type": "/obj/machinery/igniter", + "parent": "/obj/machinery", + "subtypes": [], + "vars": { + "plane": -1 + } + },{ + "type": "/obj/structure/lattice", + "parent": "/obj/structure", + "subtypes": [], + "vars": { + "plane": -1 + } + },{ + "type": "/obj/structure/alien/weeds", + "parent": "/obj/structure/alien", + "subtypes": [], + "vars": { + "plane": -1 + } + } + ] +} diff --git a/ui/build.gradle b/ui/build.gradle index 64b1c8e..8a84c78 100644 --- a/ui/build.gradle +++ b/ui/build.gradle @@ -40,7 +40,7 @@ task copyIndex(type: Copy) { it.replace('@{version}', "${rootProject.version}-build:$currentTimeStamp") } filter { - it.replace('@{revisions}', file("../.revisions").text.replaceAll('\n', ',')) + it.replace('@{revisions}', file("../.revisions").text.trim().replaceAll('\n', ',')) } filter { it.replace('@{style}', file('src/main/dist/style.min.css').text)