From 5495e017d508825046ff279383c848cfa6ec6bc6 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 29 Apr 2025 22:59:26 +0900 Subject: [PATCH] more canisters --- .../canisters.csv} | 0 assets/mods/basegame/items/itemid.csv | 4 +- src/net/torvald/terrarum/ModMgr.kt | 13 ++++ src/net/torvald/terrarum/Terrarum.kt | 2 + .../terrarum/itemproperties/CanistersCodex.kt | 75 +++++++++++++++++++ .../terrarum/modulebasegame/EntryPoint.kt | 1 + 6 files changed, 93 insertions(+), 2 deletions(-) rename assets/mods/basegame/{containers/containers.csv => canisters/canisters.csv} (100%) create mode 100644 src/net/torvald/terrarum/itemproperties/CanistersCodex.kt diff --git a/assets/mods/basegame/containers/containers.csv b/assets/mods/basegame/canisters/canisters.csv similarity index 100% rename from assets/mods/basegame/containers/containers.csv rename to assets/mods/basegame/canisters/canisters.csv diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index 2c1e4b56c..2d281985a 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -173,10 +173,10 @@ id;classname;tags 65536;net.torvald.terrarum.modulebasegame.gameitems.ItemFileRef;BASEOBJECT # fluids on storage -# FUTURE QUEST: autogenerate them using CONTAINERS CODEX +# FUTURE QUEST: autogenerate them using CANISTERS CODEX # with new ItemID scheme: # basegame_2) : URLClassLoader(urls) { diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index db22927c2..a47f80c1c 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -28,6 +28,7 @@ import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.ActorWithBody.Companion.METER import net.torvald.terrarum.gameactors.faction.FactionCodex import net.torvald.terrarum.gameworld.fmod +import net.torvald.terrarum.itemproperties.CanistersCodex import net.torvald.terrarum.itemproperties.CraftingCodex import net.torvald.terrarum.itemproperties.ItemCodex import net.torvald.terrarum.itemproperties.MaterialCodex @@ -86,6 +87,7 @@ object Terrarum : Disposable { var oreCodex = OreCodex(); internal set var audioCodex = AudioCodex(); internal set var weatherCodex = WeatherCodex(); internal set + var canistersCodex = CanistersCodex(); internal set ////////////////////////////// diff --git a/src/net/torvald/terrarum/itemproperties/CanistersCodex.kt b/src/net/torvald/terrarum/itemproperties/CanistersCodex.kt new file mode 100644 index 000000000..db1436f01 --- /dev/null +++ b/src/net/torvald/terrarum/itemproperties/CanistersCodex.kt @@ -0,0 +1,75 @@ +package net.torvald.terrarum.itemproperties + +import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.blockproperties.intVal +import net.torvald.terrarum.gameitems.ItemID +import net.torvald.terrarum.utils.CSVFetcher +import org.apache.commons.csv.CSVRecord +import java.io.IOException + +/** + * Created by minjaesong on 2025-04-29. + */ +class CanistersCodex { + + @Transient val CanisterProps = HashMap() // itemID is _ + + @Transient private val nullProp = CanisterProp() + + + operator fun get(canister: ItemID?): CanisterProp { + if (canister == null || canister.substringAfter('_').substringBefore(':').substringBefore('@') == "0") { + return nullProp + } + + try { + return CanisterProps[canister]!! + } + catch (e: NullPointerException) { + throw NullPointerException("CanisterProp with id $canister does not exist.") + } + } + + fun getOrNull(blockID: ItemID?): CanisterProp? { + return CanisterProps[blockID] + } + + /** + * Later entry (possible from other modules) will replace older ones + */ + fun fromModule(module: String, path: String, registerHook: (CanisterProp) -> Unit = {}) { + printdbg(this, "Building fluid properties table") + try { + register(module, CSVFetcher.readFromModule(module, path), registerHook) + } + catch (e: IOException) { e.printStackTrace() } + } + + private fun register(module: String, records: List, registerHook: (CanisterProp) -> Unit) { + records.forEach { + setProp(module, it.intVal("id"), it) + val tileId = "${module}_${it.intVal("id")}" + CanisterProps[tileId]?.let(registerHook) + } + } + + private fun setProp(module: String, key: Int, record: CSVRecord) { + val prop = CanisterProp() + prop.tags = record.get("tags").split(',').map { it.trim().toUpperCase() }.toHashSet() + prop.id = "${module}_$key" + prop.itemID = record.get("itemid") + + CanisterProps[prop.id] = prop + + printdbg(this, "Setting canister prop ${prop.id}") + } +} + +/** + * Created by minjaesong on 2025-04-29. + */ +class CanisterProp { + var id: ItemID = "" + var itemID: ItemID = "" + @Transient var tags = HashSet() +} diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 3fba9ee1e..2bb02d4da 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -50,6 +50,7 @@ class EntryPoint : ModuleEntryPoint() { ModMgr.GameLanguageLoader.invoke(moduleName) ModMgr.GameAudioLoader.invoke(moduleName) ModMgr.GameWeatherLoader.invoke(moduleName) + ModMgr.GameCanistersLoader.invoke(moduleName) WeatherCodex.weatherById["titlescreen"] = WeatherCodex.getById("generic01")?.copy(identifier = "titlescreen", windSpeed = 1f) ?: WeatherMixer.DEFAULT_WEATHER