From 4fba0f70c954b3ebd8e08152d92e58e5c04894c7 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Sun, 14 Apr 2024 00:18:30 +0900 Subject: [PATCH] weather in weathercodex --- .../terrarum/musicplayer/gui/MusicPlayer.kt | 1 + .../mods/basegame/weathers/WeatherClear.json | 26 ++++ .../basegame/weathers/WeatherGeneric.json | 2 +- .../basegame/weathers/WeatherGeneric2.json | 2 +- .../basegame/weathers/WeatherOvercast.json | 4 +- src/net/torvald/terrarum/App.java | 6 +- src/net/torvald/terrarum/IngameInstance.kt | 4 +- src/net/torvald/terrarum/ModMgr.kt | 15 +++ src/net/torvald/terrarum/TaggedProp.kt | 20 +++ src/net/torvald/terrarum/Terrarum.kt | 4 + .../torvald/terrarum/TerrarumPostProcessor.kt | 2 +- src/net/torvald/terrarum/audio/AudioBank.kt | 7 - src/net/torvald/terrarum/audio/AudioCodex.kt | 2 +- .../terrarum/audio/TerrarumAudioMixerTrack.kt | 1 + .../audio/audiobank/AudioBankMusicBox.kt | 41 ++++++ .../audio/{ => audiobank}/MusicContainer.kt | 5 +- .../terrarum/blockproperties/BlockProp.kt | 13 +- .../terrarum/blockproperties/BlockPropUtil.kt | 2 +- .../terrarum/blockproperties/OreCodex.kt | 5 +- .../terrarum/blockproperties/WireProp.kt | 15 +-- .../torvald/terrarum/blockstats/TileSurvey.kt | 2 +- src/net/torvald/terrarum/gameactors/Actor.kt | 2 +- .../torvald/terrarum/gameitems/GameItem.kt | 7 +- .../torvald/terrarum/gameworld/GameWorld.kt | 2 +- .../terrarum/modulebasegame/BuildingMaker.kt | 2 +- .../terrarum/modulebasegame/EntryPoint.kt | 6 + .../terrarum/modulebasegame/IngameRenderer.kt | 2 +- .../terrarum/modulebasegame/TerrarumIngame.kt | 8 +- .../modulebasegame/TerrarumMusicGovernor.kt | 3 +- .../terrarum/modulebasegame/WorldSimulator.kt | 4 +- .../gameactors/ActorPrimedBomb.kt | 2 +- .../modulebasegame/gameactors/Cultivable.kt | 8 +- .../gameactors/FixtureAlloyingFurnace.kt | 2 +- .../gameactors/FixtureFurnaceAndAnvil.kt | 2 +- .../gameactors/FixtureJukebox.kt | 2 +- .../gameactors/FixtureMusicalTurntable.kt | 6 +- .../gameactors/FixtureSmelterBasic.kt | 2 +- .../modulebasegame/gameitems/AxeCore.kt | 14 +- .../gameitems/FixtureItemBase.kt | 2 +- .../gameitems/PickaxeGeneric.kt | 7 +- .../gameitems/SledgehammerCore.kt | 2 +- .../modulebasegame/worldgenerator/Oregen.kt | 2 +- src/net/torvald/terrarum/serialise/Common.kt | 10 +- .../terrarum/weather/BaseModularWeather.kt | 10 +- .../torvald/terrarum/weather/WeatherCodex.kt | 121 ++++++++++++++++++ .../torvald/terrarum/weather/WeatherMixer.kt | 103 +-------------- .../torvald/terrarum/weather/Weatherbox.kt | 5 +- .../terrarum/worlddrawer/BlocksDrawer.kt | 4 +- 48 files changed, 311 insertions(+), 208 deletions(-) create mode 100644 assets/mods/basegame/weathers/WeatherClear.json create mode 100644 src/net/torvald/terrarum/TaggedProp.kt create mode 100644 src/net/torvald/terrarum/audio/audiobank/AudioBankMusicBox.kt rename src/net/torvald/terrarum/audio/{ => audiobank}/MusicContainer.kt (98%) create mode 100644 src/net/torvald/terrarum/weather/WeatherCodex.kt diff --git a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt index 6f16bc13c..f754de1f1 100644 --- a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt +++ b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt @@ -12,6 +12,7 @@ import net.torvald.reflection.extortField import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.* +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.PlaysMusic diff --git a/assets/mods/basegame/weathers/WeatherClear.json b/assets/mods/basegame/weathers/WeatherClear.json new file mode 100644 index 000000000..cac5156f0 --- /dev/null +++ b/assets/mods/basegame/weathers/WeatherClear.json @@ -0,0 +1,26 @@ +{ + "identifier": "clear01", + "skyboxGradColourMap": "generic_skybox.tga", + "daylightClut": "clut_daylight.tga", + "tags": "generic,clear", + "cloudChance": 12, + "cloudGamma": [1.2, 2.4], + "cloudGammaVariance": [0.111, 0.0], + "windSpeed": 0.35, + "windSpeedVariance": 0.4, + "windSpeedDamping": 0.5, + "clouds": { + "cumulus": { + "filename": "cloud_normal.png", "tw": 1024, "th": 512, "probability": 0.05, + "baseScale": 2.0, "scaleVariance": 0.6, + "altLow": 1080, "altHigh": 2400 + }, + "altocumulus": { + "filename": "cloud_normal.png", "tw": 1024, "th": 512, "probability": 1.0, + "baseScale": 1.0, "scaleVariance": 0.1, + "altLow": 2600, "altHigh": 4800 + } + }, + "atmoTurbidity": 3.2, + "shaderVibrancy": [1.0, 1.0] +} \ No newline at end of file diff --git a/assets/mods/basegame/weathers/WeatherGeneric.json b/assets/mods/basegame/weathers/WeatherGeneric.json index c83026bed..97196e05c 100644 --- a/assets/mods/basegame/weathers/WeatherGeneric.json +++ b/assets/mods/basegame/weathers/WeatherGeneric.json @@ -2,7 +2,7 @@ "identifier": "generic01", "skyboxGradColourMap": "generic_skybox.tga", "daylightClut": "clut_daylight.tga", - "classification": "generic", + "tags": "generic", "cloudChance": 60, "cloudGamma": [0.9, 2.4], "cloudGammaVariance": [0.111, 0.0], diff --git a/assets/mods/basegame/weathers/WeatherGeneric2.json b/assets/mods/basegame/weathers/WeatherGeneric2.json index c29d9900e..3dfce35e3 100644 --- a/assets/mods/basegame/weathers/WeatherGeneric2.json +++ b/assets/mods/basegame/weathers/WeatherGeneric2.json @@ -2,7 +2,7 @@ "identifier": "generic02", "skyboxGradColourMap": "generic_skybox.tga", "daylightClut": "clut_daylight.tga", - "classification": "generic2", + "tags": "generic2", "cloudChance": 150, "cloudGamma": [0.9, 2.4], "cloudGammaVariance": [0.111, 0.0], diff --git a/assets/mods/basegame/weathers/WeatherOvercast.json b/assets/mods/basegame/weathers/WeatherOvercast.json index 46a1bba56..2ec4f2e97 100644 --- a/assets/mods/basegame/weathers/WeatherOvercast.json +++ b/assets/mods/basegame/weathers/WeatherOvercast.json @@ -2,8 +2,8 @@ "identifier": "overcast01", "skyboxGradColourMap": "generic_skybox.tga", "daylightClut": "clut_daylight.tga", - "classification": "overcast", - "cloudChance": 300, + "tags": "overcast", + "cloudChance": 200, "cloudGamma": [1.45, 1.0], "cloudGammaVariance": [0.0, 0.0], "windSpeed": 10.45, diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index a9923a32d..984ca42f9 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -19,7 +19,7 @@ import kotlin.text.Charsets; import net.torvald.getcpuname.GetCpuName; import net.torvald.terrarum.audio.AudioBank; import net.torvald.terrarum.audio.AudioMixer; -import net.torvald.terrarum.audio.MusicContainer; +import net.torvald.terrarum.audio.audiobank.MusicContainer; import net.torvald.terrarum.audio.dsp.BinoPan; import net.torvald.terrarum.controller.GdxControllerAdapter; import net.torvald.terrarum.controller.TerrarumController; @@ -239,7 +239,7 @@ public class App implements ApplicationListener { /** * For the events depends on rendering frame (e.g. flicker on post-hit invincibility) */ - public static int GLOBAL_RENDER_TIMER = new Random().nextInt(1020) + 1; + public static long GLOBAL_RENDER_TIMER = new Random().nextInt(1020) + 1L; public static DebugTimers debugTimers = new DebugTimers(); @@ -745,7 +745,7 @@ public class App implements ApplicationListener { } public static Texture getCurrentDitherTex() { - int hash = 31 + GLOBAL_RENDER_TIMER + 0x165667B1 + GLOBAL_RENDER_TIMER * 0xC2B2AE3D; + int hash = (int) (31 + GLOBAL_RENDER_TIMER + 0x165667B1 + GLOBAL_RENDER_TIMER * 0xC2B2AE3D); hash = Integer.rotateLeft(hash, 17) * 0x27D4EB2F; hash ^= hash >>> 15; hash *= 0x85EBCA77; diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 796001b7a..bfcb67404 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -5,7 +5,7 @@ import com.badlogic.gdx.Input import com.badlogic.gdx.utils.Disposable import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.dsp.BinoPan import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorID @@ -46,7 +46,7 @@ import kotlin.math.min */ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boolean = false) : TerrarumGamescreen { - var WORLD_UPDATE_TIMER = Random().nextInt(1020) + 1; protected set + var WORLD_UPDATE_TIMER = Random().nextInt(1020) + 1L; protected set open protected val actorMBRConverter = object : MBRConverter { override fun getDimensions(): Int = 2 diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index 292fcceda..a8a0da664 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -29,6 +29,7 @@ import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.utils.CSVFetcher import net.torvald.terrarum.utils.JsonFetcher +import net.torvald.terrarum.weather.WeatherCodex import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import org.apache.commons.codec.digest.DigestUtils import org.apache.commons.csv.CSVFormat @@ -794,6 +795,20 @@ object ModMgr { } } + object GameWeatherLoader { + val weatherPath = "weathers/" + + init { + Terrarum.weatherCodex = WeatherCodex() + } + + @JvmStatic operator fun invoke(module: String) { + getFiles(module, weatherPath).filter { it.isFile && it.name.lowercase().endsWith(".json") }.forEach { + Terrarum.weatherCodex.readFromJson(module, it) + } + } + } + /** * A sugar-library for easy texture pack creation */ diff --git a/src/net/torvald/terrarum/TaggedProp.kt b/src/net/torvald/terrarum/TaggedProp.kt new file mode 100644 index 000000000..ebb5220b4 --- /dev/null +++ b/src/net/torvald/terrarum/TaggedProp.kt @@ -0,0 +1,20 @@ +package net.torvald.terrarum + +/** + * Created by minjaesong on 2024-04-13. + */ +interface TaggedProp { + + fun hasTag(s: String): Boolean + fun hasAnyTagsOf(vararg s: String) = s.any { hasTag(it) } + fun hasAnyTags(s: Collection) = s.any { hasTag(it) } + fun hasAnyTags(s: Array) = s.any { hasTag(it) } + fun hasAllTagsOf(vararg s: String) = s.all { hasTag(it) } + fun hasAllTags(s: Collection) = s.all { hasTag(it) } + fun hasAllTags(s: Array) = s.all { hasTag(it) } + fun hasNoTagsOf(vararg s: String) = s.none { hasTag(it) } + fun hasNoTags(s: Collection) = s.none { hasTag(it) } + fun hasNoTags(s: Array) = s.none { hasTag(it) } + + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 9d0bb70a4..767a708a6 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -35,6 +35,7 @@ import net.torvald.terrarum.savegame.DiskSkimmer import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.ui.UINotControllable +import net.torvald.terrarum.weather.WeatherCodex import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap import net.torvald.unsafe.UnsafeHelper @@ -83,6 +84,7 @@ object Terrarum : Disposable { var fluidCodex = FluidCodex(); internal set var oreCodex = OreCodex(); internal set var audioCodex = AudioCodex(); internal set + var weatherCodex = WeatherCodex(); internal set ////////////////////////////// @@ -829,6 +831,8 @@ val FluidCodex: FluidCodex get() = Terrarum.fluidCodex val OreCodex: OreCodex get() = Terrarum.oreCodex +val WeatherCodex: WeatherCodex + get() = Terrarum.weatherCodex class Codex : KVHashMap() { diff --git a/src/net/torvald/terrarum/TerrarumPostProcessor.kt b/src/net/torvald/terrarum/TerrarumPostProcessor.kt index c13099416..61366c4ae 100644 --- a/src/net/torvald/terrarum/TerrarumPostProcessor.kt +++ b/src/net/torvald/terrarum/TerrarumPostProcessor.kt @@ -174,7 +174,7 @@ object TerrarumPostProcessor : Disposable { } if (KeyToggler.isOn(Input.Keys.F2)) { - if (INGAME.WORLD_UPDATE_TIMER % 64 == 42) { + if (INGAME.WORLD_UPDATE_TIMER % 64 == 42L) { // we're going to assume the data are normally distributed deltatBenchStr = if (INGAME.deltaTeeBenchmarks.elemCount < INGAME.deltaTeeBenchmarks.size) { "ΔF: Gathering data (${INGAME.deltaTeeBenchmarks.elemCount}/${INGAME.deltaTeeBenchmarks.size})" diff --git a/src/net/torvald/terrarum/audio/AudioBank.kt b/src/net/torvald/terrarum/audio/AudioBank.kt index 6920524ac..26a520832 100644 --- a/src/net/torvald/terrarum/audio/AudioBank.kt +++ b/src/net/torvald/terrarum/audio/AudioBank.kt @@ -1,19 +1,12 @@ package net.torvald.terrarum.audio import com.badlogic.gdx.utils.Disposable -import java.io.File /** * Created by minjaesong on 2024-04-05. */ abstract class AudioBank : Disposable { - companion object { - fun fromMusic(name: String, file: File, looping: Boolean = false, toRAM: Boolean = false, songFinishedHook: (AudioBank) -> Unit = {}): AudioBank { - return MusicContainer(name, file, looping, toRAM, songFinishedHook) - } - } - protected val hash = System.nanoTime() abstract fun makeCopy(): AudioBank diff --git a/src/net/torvald/terrarum/audio/AudioCodex.kt b/src/net/torvald/terrarum/audio/AudioCodex.kt index c900247b0..dbfca73be 100644 --- a/src/net/torvald/terrarum/audio/AudioCodex.kt +++ b/src/net/torvald/terrarum/audio/AudioCodex.kt @@ -1,7 +1,7 @@ package net.torvald.terrarum.audio -import com.badlogic.gdx.Gdx import com.badlogic.gdx.files.FileHandle +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.tryDispose /** diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index 84719dc46..5b52686f9 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.utils.Disposable import com.badlogic.gdx.utils.Queue import net.torvald.terrarum.App import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.audio.dsp.TerrarumAudioFilter import net.torvald.terrarum.gameactors.Actor diff --git a/src/net/torvald/terrarum/audio/audiobank/AudioBankMusicBox.kt b/src/net/torvald/terrarum/audio/audiobank/AudioBankMusicBox.kt new file mode 100644 index 000000000..a37878346 --- /dev/null +++ b/src/net/torvald/terrarum/audio/audiobank/AudioBankMusicBox.kt @@ -0,0 +1,41 @@ +package net.torvald.terrarum.audio.audiobank + +import com.badlogic.gdx.utils.Queue +import net.torvald.terrarum.INGAME +import net.torvald.terrarum.audio.AudioBank + +/** + * Created by minjaesong on 2024-04-12. + */ +class AudioBankMusicBox(override var songFinishedHook: (AudioBank) -> Unit = {}) : AudioBank() { + + override val name = "spieluhr" + override val samplingRate = 48000 + override val channels = 1 + + override val totalSizeInSamples = Long.MAX_VALUE // TODO length of lowest-pitch note + + private val messageQueue = Queue>() // pair of: absolute tick count, notes (61 notes polyphony) + + override fun currentPositionInSamples(): Long { + TODO("Not yet implemented") + } + + override fun readSamples(bufferL: FloatArray, bufferR: FloatArray): Int { + val tickCount = INGAME.WORLD_UPDATE_TIMER + + TODO("Not yet implemented") + } + + override fun reset() { + TODO("Not yet implemented") + } + + override fun makeCopy(): AudioBank { + TODO("Not yet implemented") + } + + override fun dispose() { + TODO("Not yet implemented") + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/MusicContainer.kt b/src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt similarity index 98% rename from src/net/torvald/terrarum/audio/MusicContainer.kt rename to src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt index 73ace8cc8..9dc550692 100644 --- a/src/net/torvald/terrarum/audio/MusicContainer.kt +++ b/src/net/torvald/terrarum/audio/audiobank/MusicContainer.kt @@ -1,4 +1,4 @@ -package net.torvald.terrarum.audio +package net.torvald.terrarum.audio.audiobank import com.badlogic.gdx.Gdx import com.badlogic.gdx.audio.Music @@ -12,6 +12,8 @@ import javazoom.jl.decoder.Bitstream import net.torvald.reflection.extortField import net.torvald.reflection.forceInvoke import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.audio.AudioBank +import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.serialise.toUint import net.torvald.unsafe.UnsafeHelper import net.torvald.unsafe.UnsafePtr @@ -195,7 +197,6 @@ class MusicContainer( val bytesToRead = minOf(buffer.size.toLong(), 2 * channels * (totalSizeInSamples - samplesReadCount)) if (!looping && bytesToRead <= 0) return bytesToRead.toInt() -// if (looping) printdbg(this, "toRAM music loop (bytes cursor: $samplesReadCount/$totalSizeInSamples, bytesToRead=$bytesToRead, buffer.size=${buffer.size})") UnsafeHelper.memcpyRaw( null, diff --git a/src/net/torvald/terrarum/blockproperties/BlockProp.kt b/src/net/torvald/terrarum/blockproperties/BlockProp.kt index e9c7d6796..4288848ab 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockProp.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockProp.kt @@ -9,7 +9,7 @@ import net.torvald.terrarum.gameworld.fmod /** * Created by minjaesong on 2016-02-16. */ -class BlockProp { +class BlockProp : TaggedProp { var id: ItemID = "" var numericID: Int = -1 @@ -75,16 +75,7 @@ class BlockProp { BlockCodex[BlockCodex.tileToVirtual[id]!![offset]]._lumCol.lane(channel) } - fun hasTag(s: String) = tags.contains(s) - fun hasAnyTagOf(vararg s: String) = s.any { hasTag(it) } - fun hasAnyTag(s: Collection) = s.any { hasTag(it) } - fun hasAnyTag(s: Array) = s.any { hasTag(it) } - fun hasAllTagOf(vararg s: String) = s.all { hasTag(it) } - fun hasAllTag(s: Collection) = s.all { hasTag(it) } - fun hasAllTag(s: Array) = s.all { hasTag(it) } - fun hasNoTagOf(vararg s: String) = s.none { hasTag(it) } - fun hasNoTag(s: Collection) = s.none { hasTag(it) } - fun hasNoTag(s: Array) = s.none { hasTag(it) } + override fun hasTag(s: String) = tags.contains(s) /** * @param luminosity diff --git a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt index c2d91e2b6..814014433 100644 --- a/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt +++ b/src/net/torvald/terrarum/blockproperties/BlockPropUtil.kt @@ -108,7 +108,7 @@ object BlockPropUtil { return when (prop.dynamicLuminosityFunction) { 1 -> getTorchFlicker(prop) 2 -> (INGAME.world).globalLight.cpy() // current global light - 3 -> WeatherMixer.getGlobalLightOfTimeOfNoon(WeatherMixer.weatherDict["generic01"]!!).cpy() // daylight at noon + 3 -> WeatherMixer.getGlobalLightOfTimeOfNoon(WeatherCodex.getById("generic01")!!).cpy() // daylight at noon 4 -> getSlowBreath(prop) 5 -> getPulsate(prop) else -> prop.baseLumCol diff --git a/src/net/torvald/terrarum/blockproperties/OreCodex.kt b/src/net/torvald/terrarum/blockproperties/OreCodex.kt index 94e7fb33d..2f90bddfd 100644 --- a/src/net/torvald/terrarum/blockproperties/OreCodex.kt +++ b/src/net/torvald/terrarum/blockproperties/OreCodex.kt @@ -1,6 +1,7 @@ package net.torvald.terrarum.blockproperties import net.torvald.terrarum.App +import net.torvald.terrarum.TaggedProp import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.utils.CSVFetcher import org.apache.commons.csv.CSVRecord @@ -78,11 +79,11 @@ class OreCodex { } -class OreProp { +class OreProp : TaggedProp { var id: String = "" var item: ItemID = "" var tags = HashSet() - fun hasTag(s: String) = tags.contains(s) + override fun hasTag(s: String) = tags.contains(s) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/blockproperties/WireProp.kt b/src/net/torvald/terrarum/blockproperties/WireProp.kt index c200dfebf..c328fa850 100644 --- a/src/net/torvald/terrarum/blockproperties/WireProp.kt +++ b/src/net/torvald/terrarum/blockproperties/WireProp.kt @@ -1,12 +1,13 @@ package net.torvald.terrarum.blockproperties import net.torvald.terrarum.Codex +import net.torvald.terrarum.TaggedProp import net.torvald.terrarum.gameitems.ItemID /** * Created by minjaesong on 2021-07-28. */ -class WireProp { +class WireProp : TaggedProp { var id: ItemID = "" var numericID: Int = -1 @@ -27,15 +28,5 @@ class WireProp { @Transient var tags = HashSet() - fun hasTag(s: String) = tags.contains(s) - fun hasAnyTagOf(vararg s: String) = s.any { hasTag(it) } - fun hasAnyTag(s: Collection) = s.any { hasTag(it) } - fun hasAnyTag(s: Array) = s.any { hasTag(it) } - fun hasAllTagOf(vararg s: String) = s.all { hasTag(it) } - fun hasAllTag(s: Collection) = s.all { hasTag(it) } - fun hasAllTag(s: Array) = s.all { hasTag(it) } - fun hasNoTagOf(vararg s: String) = s.none { hasTag(it) } - fun hasNoTag(s: Collection) = s.none { hasTag(it) } - fun hasNoTag(s: Array) = s.none { hasTag(it) } - + override fun hasTag(s: String) = tags.contains(s) } \ No newline at end of file diff --git a/src/net/torvald/terrarum/blockstats/TileSurvey.kt b/src/net/torvald/terrarum/blockstats/TileSurvey.kt index 47996e136..c5ce759ca 100644 --- a/src/net/torvald/terrarum/blockstats/TileSurvey.kt +++ b/src/net/torvald/terrarum/blockstats/TileSurvey.kt @@ -48,7 +48,7 @@ object TileSurvey { proposals.forEach { (_, proposal) -> - if (INGAME.WORLD_UPDATE_TIMER % proposal.temporalGranularity == 0) { + if (INGAME.WORLD_UPDATE_TIMER % proposal.temporalGranularity == 0L) { val for_x_start = floor(player.intTilewiseHitbox.centeredX - proposal.width / 2.0).toInt() val for_y_start = floor(player.intTilewiseHitbox.centeredY - proposal.height / 2.0).toInt() val for_x_end = ceil(player.intTilewiseHitbox.centeredX + proposal.width / 2.0).toInt() diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 476ac0a38..24d17d90c 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -7,7 +7,7 @@ import net.torvald.terrarum.App.printdbgerr import net.torvald.terrarum.INGAME import net.torvald.terrarum.Terrarum import net.torvald.terrarum.audio.AudioBank -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.audio.TrackVolume import net.torvald.terrarum.audio.dsp.NullFilter diff --git a/src/net/torvald/terrarum/gameitems/GameItem.kt b/src/net/torvald/terrarum/gameitems/GameItem.kt index 2200c4e48..7e90935c1 100644 --- a/src/net/torvald/terrarum/gameitems/GameItem.kt +++ b/src/net/torvald/terrarum/gameitems/GameItem.kt @@ -25,7 +25,7 @@ typealias ItemID = String * * Created by minjaesong on 2016-01-16. */ -abstract class GameItem(val originalID: ItemID) : Comparable, Cloneable { +abstract class GameItem(val originalID: ItemID) : Comparable, Cloneable, TaggedProp { constructor() : this("-uninitialised-") @@ -392,10 +392,7 @@ abstract class GameItem(val originalID: ItemID) : Comparable, Cloneabl return this } - fun hasTag(s: String) = tags.contains(s) - fun hasAllTags(s: List) = tags.containsAll(s) - fun hasAllTagOf(vararg s: String) = s.all { hasTag(it) } - + override fun hasTag(s: String) = tags.contains(s) companion object { diff --git a/src/net/torvald/terrarum/gameworld/GameWorld.kt b/src/net/torvald/terrarum/gameworld/GameWorld.kt index 7e355172c..c47e8240c 100644 --- a/src/net/torvald/terrarum/gameworld/GameWorld.kt +++ b/src/net/torvald/terrarum/gameworld/GameWorld.kt @@ -181,7 +181,7 @@ open class GameWorld( var weatherbox = Weatherbox() init { - weatherbox.initWith(WeatherMixer.weatherDict["generic01"] ?: WeatherMixer.DEFAULT_WEATHER, 3600L) + weatherbox.initWith(WeatherCodex.getById("generic01") ?: WeatherMixer.DEFAULT_WEATHER, 3600L) val currentWeather = weatherbox.currentWeather // TEST FILL WITH RANDOM VALUES (0..6).map { WeatherMixer.takeUniformRand(0f..1f) }.let { diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index 03316e347..a9a24e749 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -391,7 +391,7 @@ class BuildingMaker(batch: FlippingSpriteBatch) : IngameInstance(batch) { BlockPropUtil.dynamicLumFuncTickClock() WeatherMixer.update(delta, actorNowPlaying, gameWorld) - if (WORLD_UPDATE_TIMER % 2 == 1) { + if (WORLD_UPDATE_TIMER % 2 == 1L) { fillUpWiresBuffer() } diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 3aa80b097..89324e50b 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -3,6 +3,7 @@ package net.torvald.terrarum.modulebasegame import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.modulebasegame.imagefont.WatchFont +import net.torvald.terrarum.weather.WeatherMixer /** * The entry point for the module "Basegame" @@ -36,6 +37,11 @@ class EntryPoint : ModuleEntryPoint() { ModMgr.GameLanguageLoader.invoke(moduleName) ModMgr.GameCraftingRecipeLoader.invoke(moduleName) ModMgr.GameAudioLoader.invoke(moduleName) + ModMgr.GameWeatherLoader.invoke(moduleName) + + WeatherCodex.weatherById["titlescreen"] = + WeatherCodex.getById("generic01")?.copy(identifier = "titlescreen", windSpeed = 1f) ?: WeatherMixer.DEFAULT_WEATHER + if (App.IS_DEVELOPMENT_BUILD) { println("[EntryPoint] Crafting Recipes: ") diff --git a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt index 847eae3b8..05ce06bb2 100644 --- a/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt +++ b/src/net/torvald/terrarum/modulebasegame/IngameRenderer.kt @@ -261,7 +261,7 @@ object IngameRenderer : Disposable { if ((!gamePaused && !App.isScreenshotRequested()) || newWorldLoadedLatch) { measureDebugTime("Renderer.LightRun*") { // recalculate for even frames, or if the sign of the cam-x changed - if (App.GLOBAL_RENDER_TIMER % 3 == 0 || Math.abs(WorldCamera.x - oldCamX) >= world.width * 0.85f * TILE_SIZEF || newWorldLoadedLatch) { + if (App.GLOBAL_RENDER_TIMER % 3 == 0L || Math.abs(WorldCamera.x - oldCamX) >= world.width * 0.85f * TILE_SIZEF || newWorldLoadedLatch) { LightmapRenderer.recalculate(actorsRenderFarBehind + actorsRenderBehind + actorsRenderFront + actorsRenderMidTop + actorsRenderMiddle + actorsRenderOverlay) } oldCamX = WorldCamera.x diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 11f9e7bc4..c3bb7ab0a 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -948,12 +948,12 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } // fill up visibleActorsRenderFront for wires but not on every update measureDebugTime("Ingame.FillUpWiresBuffer*") { - if (WORLD_UPDATE_TIMER % 2 == 1) { + if (WORLD_UPDATE_TIMER % 2 == 1L) { fillUpWiresBuffer() } } measureDebugTime("Ingame.FillUpWirePortsView*") { - if (WORLD_UPDATE_TIMER % 2 == 0) { + if (WORLD_UPDATE_TIMER % 2 == 0L) { val fixtures = INGAME.actorContainerActive.filterIsInstance() fillUpWirePortsView(fixtures) } @@ -978,7 +978,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { - actorNowPlaying?.let { if (WORLD_UPDATE_TIMER % 4 == 1) updateWorldGenerator(actorNowPlaying!!) } + actorNowPlaying?.let { if (WORLD_UPDATE_TIMER % 4 == 1L) updateWorldGenerator(actorNowPlaying!!) } @@ -1646,7 +1646,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { val punchSize = getPunchSize(actor) val punchBlockSize = punchSize.div(TILE_SIZED).floorToInt() - val mouseUnderPunchableTree = BlockCodex[world.getTileFromTerrain(mtx, mty)].hasAnyTagOf("LEAVES", "TREESMALL") + val mouseUnderPunchableTree = BlockCodex[world.getTileFromTerrain(mtx, mty)].hasAnyTagsOf("LEAVES", "TREESMALL") // punch a small tree/shrub diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index ad4f1a03c..e0c59b2cd 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -6,7 +6,8 @@ import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.AudioBank import net.torvald.terrarum.audio.AudioMixer -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer + import net.torvald.terrarum.gameworld.WorldTime.Companion.DAY_LENGTH import java.io.File diff --git a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt index bbd57ccda..7422b19bc 100644 --- a/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt +++ b/src/net/torvald/terrarum/modulebasegame/WorldSimulator.kt @@ -3,7 +3,6 @@ package net.torvald.terrarum.modulebasegame import com.badlogic.gdx.utils.Queue import net.torvald.random.HQRNG import net.torvald.terrarum.* -import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.blockproperties.Block @@ -16,7 +15,6 @@ import net.torvald.terrarum.modulebasegame.TerrarumIngame.Companion.inUpdateRang import net.torvald.terrarum.modulebasegame.gameactors.* import net.torvald.terrarum.modulebasegame.gameitems.AxeCore import org.dyn4j.geometry.Vector2 -import java.lang.Math.pow import kotlin.math.cosh import kotlin.math.min import kotlin.math.pow @@ -154,7 +152,7 @@ object WorldSimulator { val ry = rng.nextInt(updateYFrom, updateYTo + 1) val tile = world.getTileFromTerrain(rx, ry) // if the dirt tile has a grass and an air tile nearby, put grass to it - if (BlockCodex[tile].hasAllTagOf("TREE", "LEAVES")) { + if (BlockCodex[tile].hasAllTagsOf("TREE", "LEAVES")) { val nearby8 = getNearbyTiles8(rx, ry) val nearbyCount = nearby8.count { BlockCodex[it].hasTag("TREE") } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt index 1706d0e6b..a11914ecc 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt @@ -4,7 +4,7 @@ import com.badlogic.gdx.Gdx import net.torvald.spriteanimation.SingleImageSprite import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.decibelsToFullscale import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.PhysProperties diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt index 98df53ce7..7c58a2bc2 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt @@ -1,13 +1,9 @@ package net.torvald.terrarum.modulebasegame.gameactors -import com.badlogic.gdx.Input -import com.badlogic.gdx.graphics.Color -import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.blockproperties.Block -import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.gameitems.ItemID import net.torvald.terrarum.modulebasegame.gameitems.PickaxeCore import net.torvald.terrarum.modulebasegame.worldgenerator.Treegen @@ -76,7 +72,7 @@ open class SaplingBase(val species: Int) : Cultivable(72000) { // check for soil val groundTile = INGAME.world.getTileFromTerrain(intTilewiseHitbox.startX.toInt(), intTilewiseHitbox.endY.toInt() + 1) - if (BlockCodex[groundTile].hasNoTagOf("CULTIVABLE")) { + if (BlockCodex[groundTile].hasNoTagsOf("CULTIVABLE")) { despawnHook = { printdbg(this, "Sapling despawn!") PickaxeCore.dropItem("item@basegame:${160 + species}", intTilewiseHitbox.canonicalX.toInt(), intTilewiseHitbox.canonicalY.toInt()) @@ -96,7 +92,7 @@ open class SaplingBase(val species: Int) : Cultivable(72000) { } private var treeHasBeenGrown = false override fun tryToSpawnMaturePlant() { - if (INGAME.WORLD_UPDATE_TIMER % 3 == 2) { + if (INGAME.WORLD_UPDATE_TIMER % 3 == 2L) { val size = if (Math.random() < 0.1) 2 else 1 val result = Treegen.plantTree(INGAME.world, intTilewiseHitbox.startX.toInt(), intTilewiseHitbox.endY.toInt() + 1, species, size) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt index f5ef43f9e..e67b9262f 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureAlloyingFurnace.kt @@ -8,7 +8,7 @@ import net.torvald.random.HQRNG import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.dsp.Gain import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.blockproperties.Block diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt index 4bc9d0fef..fe840129b 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt @@ -3,7 +3,7 @@ package net.torvald.terrarum.modulebasegame.gameactors import net.torvald.gdx.graphics.Cvec import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.dsp.Gain import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.blockproperties.Block diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt index f8f82f423..1697c1a9a 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt @@ -11,7 +11,7 @@ import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.audio.AudioMixer.Companion.DEFAULT_FADEOUT_LEN -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.audio.dsp.Phono diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt index 193336b78..d180cd573 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt @@ -1,11 +1,10 @@ package net.torvald.terrarum.modulebasegame.gameactors -import com.badlogic.gdx.Gdx import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.audio.AudioMixer -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameitems.GameItem @@ -16,7 +15,6 @@ import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase import net.torvald.terrarum.modulebasegame.gameitems.ItemFileRef import net.torvald.terrarum.modulebasegame.gameitems.MusicDiscHelper import net.torvald.terrarum.modulebasegame.gameitems.PickaxeCore -import net.torvald.terrarum.ui.MouseLatch import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import org.dyn4j.geometry.Vector2 @@ -75,7 +73,7 @@ class FixtureMusicalTurntable : Electric, PlaysMusic { INGAME.actorNowPlaying!!.inventory.itemEquipped.get(GameItem.EquipPosition.HAND_GRIP) val itemProp = ItemCodex[itemOnGrip] - if (itemProp?.hasAllTagOf("MUSIC", "PHONO") == true) { + if (itemProp?.hasAllTagsOf("MUSIC", "PHONO") == true) { disc = itemOnGrip INGAME.actorNowPlaying!!.removeItem(itemOnGrip!!) playDisc() diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt index 715c28c45..3c99141c8 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt @@ -8,7 +8,7 @@ import net.torvald.random.HQRNG import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.audio.dsp.Gain import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.blockproperties.Block diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt index 97c432e62..b62e84e67 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/AxeCore.kt @@ -69,7 +69,7 @@ object AxeCore { val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! val swingDmgToFrameDmg = delta.toDouble() / actionInterval - if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toInt()) { + if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toLong()) { PickaxeCore.makeNoiseTileTouching(actor, tile) } @@ -95,7 +95,7 @@ object AxeCore { val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! val swingDmgToFrameDmg = delta.toDouble() / actionInterval - if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toInt()) { + if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toLong()) { PickaxeCore.makeNoiseTileTouching(actor, tile) } @@ -121,13 +121,13 @@ object AxeCore { usageStatus = usageStatus or true } // check if tile under mouse is a tree - else if (tileprop.hasAllTag(listOf("TREE", "TREETRUNK") + additionalCheckTags)) { + else if (tileprop.hasAllTags(listOf("TREE", "TREETRUNK") + additionalCheckTags)) { val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! val swingDmgToFrameDmg = delta.toDouble() / actionInterval val isLargeTree = tileprop.hasTag("TREELARGE") val axePowerMult = if (isLargeTree) 0.5f else 1f - if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toInt()) { + if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toLong()) { PickaxeCore.makeNoiseTileTouching(actor, tile) } @@ -144,8 +144,8 @@ object AxeCore { val tileThereR = INGAME.world.getTileFromTerrain(x+1, y - upCtr) val propThereL = BlockCodex[tileThereL] val propThereR = BlockCodex[tileThereR] - val treeTrunkXoff = if (propThereL.hasAllTagOf("TREELARGE", "TREETRUNK")) -1 - else if (propThereR.hasAllTagOf("TREELARGE", "TREETRUNK")) 1 + val treeTrunkXoff = if (propThereL.hasAllTagsOf("TREELARGE", "TREETRUNK")) -1 + else if (propThereR.hasAllTagsOf("TREELARGE", "TREETRUNK")) 1 else 0 if (treeTrunkXoff != 0) { @@ -162,7 +162,7 @@ object AxeCore { val tileHere = INGAME.world.getTileFromTerrain(x, y - upCtr) val propHere = BlockCodex[tileHere] - if (propHere.hasAllTagOf("TREELARGE", "TREETRUNK")) { + if (propHere.hasAllTagsOf("TREELARGE", "TREETRUNK")) { INGAME.world.setTileTerrain(x, y - upCtr, Block.AIR, false) PickaxeCore.dropItem(propHere.drop, x, y - upCtr) PickaxeCore.makeDust(tile, x, y - upCtr, 2 + Math.random().roundToInt()) diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt index 207df0db9..d75512002 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/FixtureItemBase.kt @@ -68,7 +68,7 @@ open class FixtureItemBase(originalID: ItemID, val fixtureClassName: String) : G // update the ghost sparingly - if (INGAME.WORLD_UPDATE_TIMER % 2 == 0) { + if (INGAME.WORLD_UPDATE_TIMER % 2 == 0L) { (INGAME as TerrarumIngame).blockMarkingActor.let { val item = ghostItem.get() diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index cf8c57fc5..182eae18a 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -2,12 +2,11 @@ package net.torvald.terrarum.modulebasegame.gameitems import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.TextureRegion -import com.jme3.math.FastMath.pow import net.torvald.terrarum.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED import net.torvald.terrarum.audio.MixerTrackProcessor -import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.audiobank.MusicContainer import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.ActorWithBody @@ -84,7 +83,7 @@ object PickaxeCore { } // return false for punchable trees // non-punchable trees (= "log" tile placed by log item) must be mineable in order to make them useful as decor tiles - if (BlockCodex[tile].hasAllTagOf("TREE", "TREETRUNK", "TREESMALL")) { + if (BlockCodex[tile].hasAllTagsOf("TREE", "TREETRUNK", "TREESMALL")) { usageStatus = usageStatus or false continue } @@ -93,7 +92,7 @@ object PickaxeCore { val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! val swingDmgToFrameDmg = delta.toDouble() / actionInterval - if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toInt()) { + if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toLong()) { makeNoiseTileTouching(actor, tile) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt index 66b5b0be5..ec830f41e 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/SledgehammerCore.kt @@ -82,7 +82,7 @@ object SledgehammerCore { val actionInterval = actorvalue.getAsDouble(AVKey.ACTION_INTERVAL)!! val swingDmgToFrameDmg = delta.toDouble() / actionInterval - if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toInt()) { + if (INGAME.WORLD_UPDATE_TIMER % 11 == (Math.random() * 3).toLong()) { PickaxeCore.makeNoiseTileTouching(actor, wall) } diff --git a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt index 642af9ad8..e7585d481 100644 --- a/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt +++ b/src/net/torvald/terrarum/modulebasegame/worldgenerator/Oregen.kt @@ -61,7 +61,7 @@ class Oregen(world: GameWorld, isFinal: Boolean, private val caveAttenuateBiasSc val blockTagNonGrata = ores.firstOrNull { it.tile == tileToPut }?.blockTagNonGrata ?: hashSetOf() val backingTileProp = BlockCodex[backingTile] - if (tileToPut != null && backingTileProp.hasAllTagOf("ROCK", "OREBEARING") && backingTileProp.hasNoTag(blockTagNonGrata)) { + if (tileToPut != null && backingTileProp.hasAllTagsOf("ROCK", "OREBEARING") && backingTileProp.hasNoTags(blockTagNonGrata)) { // actually put the ore block world.setTileOre(x, y, tileToPut, 0) // autotiling will be handled by the other worldgen process } diff --git a/src/net/torvald/terrarum/serialise/Common.kt b/src/net/torvald/terrarum/serialise/Common.kt index 7914b79a0..fdd0fd404 100644 --- a/src/net/torvald/terrarum/serialise/Common.kt +++ b/src/net/torvald/terrarum/serialise/Common.kt @@ -8,8 +8,7 @@ import io.airlift.compress.snappy.SnappyFramedOutputStream import io.airlift.compress.zstd.ZstdInputStream import io.airlift.compress.zstd.ZstdOutputStream import net.torvald.random.HQRNG -import net.torvald.terrarum.App -import net.torvald.terrarum.TerrarumAppConfiguration +import net.torvald.terrarum.* import net.torvald.terrarum.console.EchoError import net.torvald.terrarum.gameworld.BlockLayerI16 import net.torvald.terrarum.gameworld.GameWorld @@ -18,12 +17,9 @@ import net.torvald.terrarum.savegame.ByteArray64 import net.torvald.terrarum.savegame.ByteArray64GrowableOutputStream import net.torvald.terrarum.savegame.ByteArray64InputStream import net.torvald.terrarum.savegame.ByteArray64Reader -import net.torvald.terrarum.toHex import net.torvald.terrarum.utils.* -import net.torvald.terrarum.weather.BaseModularWeather -import net.torvald.terrarum.weather.WeatherDirBox +import net.torvald.terrarum.weather.* import net.torvald.terrarum.weather.WeatherMixer -import net.torvald.terrarum.weather.WeatherStateBox import org.apache.commons.codec.digest.DigestUtils import java.io.File import java.io.InputStream @@ -269,7 +265,7 @@ object Common { } override fun read(json: Json, jsonData: JsonValue, type: Class<*>?): BaseModularWeather { - return WeatherMixer.weatherDict[jsonData.asString()]!! + return WeatherCodex.getById(jsonData.asString())!! } }) // Fill diff --git a/src/net/torvald/terrarum/weather/BaseModularWeather.kt b/src/net/torvald/terrarum/weather/BaseModularWeather.kt index 90d80d759..a0b257757 100644 --- a/src/net/torvald/terrarum/weather/BaseModularWeather.kt +++ b/src/net/torvald/terrarum/weather/BaseModularWeather.kt @@ -2,10 +2,10 @@ package net.torvald.terrarum.weather import com.badlogic.gdx.graphics.Texture import com.badlogic.gdx.math.Vector2 -import com.badlogic.gdx.math.Vector3 import com.badlogic.gdx.utils.JsonValue import com.jme3.math.FastMath import net.torvald.terrarum.GdxColorMap +import net.torvald.terrarum.TaggedProp import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.absoluteValue @@ -21,7 +21,7 @@ data class BaseModularWeather( val json: JsonValue, var skyboxGradColourMap: GdxColorMap, // row 0: skybox grad top, row 1: skybox grad bottom, row 2: sunlight (RGBA) val daylightClut: GdxColorMap, - val classification: String, + val tags: List, val cloudChance: Float, val windSpeed: Float, val windSpeedVariance: Float, @@ -33,7 +33,7 @@ data class BaseModularWeather( val mixFrom: String? = null, val mixPercentage: Double? = null, -) { +) : TaggedProp { /** @@ -60,6 +60,10 @@ data class BaseModularWeather( return Vector2(gx, gy) } + + + override fun hasTag(s: String) = tags.contains(s) + } data class CloudProps( diff --git a/src/net/torvald/terrarum/weather/WeatherCodex.kt b/src/net/torvald/terrarum/weather/WeatherCodex.kt new file mode 100644 index 000000000..261c96f48 --- /dev/null +++ b/src/net/torvald/terrarum/weather/WeatherCodex.kt @@ -0,0 +1,121 @@ +package net.torvald.terrarum.weather + +import com.badlogic.gdx.math.Vector2 +import com.badlogic.gdx.utils.Disposable +import net.torvald.terrarum.App +import net.torvald.terrarum.GdxColorMap +import net.torvald.terrarum.ModMgr +import net.torvald.terrarum.tryDispose +import net.torvald.terrarum.utils.JsonFetcher +import net.torvald.terrarum.utils.forEachSiblings +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import java.io.File + +/** + * Created by minjaesong on 2024-04-13. + */ +class WeatherCodex : Disposable { + + internal val weatherById = HashMap() + internal val weatherByTags = HashMap>() + + fun getById(id: String) = weatherById[id] + + fun getByAllTags(tags: Array) = weatherById.values.filter { it.hasAllTags(tags) }.ifEmpty { null } + fun getByAllTags(tags: Collection) = weatherById.values.filter { it.hasAllTags(tags) }.ifEmpty { null } + fun getByAllTagsOf(tag: String, vararg tags: String) = weatherById.values.filter { it.hasAllTags(tags.toList() + tag) }.ifEmpty { null } + + fun getByAnyTag(tags: Array) = weatherById.values.filter { it.hasAnyTags(tags) }.ifEmpty { null } + fun getByAnyTag(tags: Collection) = weatherById.values.filter { it.hasAnyTags(tags) }.ifEmpty { null } + fun getByAnyTag(tag: String, vararg tags: String) = weatherById.values.filter { it.hasAnyTags(tags.toList() + tag) }.ifEmpty { null } + + fun getByTag(tag: String) = weatherByTags[tag] + + + init { + App.disposables.add(this) + } + + + fun readFromJson(modname: String, file: File) = readFromJson(modname, file.path) + + fun readFromJson(modname: String, path: String) { + /* JSON structure: +{ + "skyboxGradColourMap": "colourmap/sky_colour.tga", // string (path to image) for dynamic. Image must be RGBA8888 or RGB888 + "extraImages": [ + // if any, it will be like: + sun01.tga, + clouds01.tga, + clouds02.tga, + auroraBlueViolet.tga + ] +} + */ + val pathToImage = "weathers" + + val JSON = JsonFetcher(path) + + val skyboxInJson = JSON.getString("skyboxGradColourMap") + val lightbox = JSON.getString("daylightClut") + + val cloudsMap = ArrayList() + val clouds = JSON["clouds"] + clouds.forEachSiblings { name, json -> + cloudsMap.add(CloudProps( + name, + TextureRegionPack(ModMgr.getGdxFile(modname, "$pathToImage/${json.getString("filename")}"), json.getInt("tw"), json.getInt("th")), + json.getFloat("probability"), + json.getFloat("baseScale"), + json.getFloat("scaleVariance"), + json.getFloat("altLow"), + json.getFloat("altHigh"), + )) + } + cloudsMap.sortBy { it.probability } + + + val ident = JSON.getString("identifier") + val tags = JSON.getString("tags").split(',') + + val obj = BaseModularWeather( + identifier = ident, + json = JSON, + skyboxGradColourMap = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${skyboxInJson}")), + daylightClut = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${lightbox}")), + tags = tags, + cloudChance = JSON.getFloat("cloudChance"), + windSpeed = JSON.getFloat("windSpeed"), + windSpeedVariance = JSON.getFloat("windSpeedVariance"), + windSpeedDamping = JSON.getFloat("windSpeedDamping"), + cloudGamma = JSON["cloudGamma"].asFloatArray().let { Vector2(it[0], it[1]) }, + cloudGammaVariance = JSON["cloudGammaVariance"].asFloatArray().let { Vector2(it[0], it[1]) }, + clouds = cloudsMap, + shaderVibrancy = JSON["shaderVibrancy"].asFloatArray() + ) + + weatherById[ident] = obj + tags.forEach { + if (weatherByTags[it] == null) { + weatherByTags[it] = mutableSetOf() + } + + weatherByTags[it]!!.add(obj) + } + } + + override fun dispose() { + weatherById.values.forEach { + it.clouds.forEach { it.spriteSheet.tryDispose() } + } + } + + fun getRandom(tag: String? = null): BaseModularWeather { + return if (tag == null) { + var k = weatherById.values.random() + if (k.identifier == "titlescreen") k = weatherById.values.random() + k + } + else getByTag(tag)!!.random() + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/weather/WeatherMixer.kt b/src/net/torvald/terrarum/weather/WeatherMixer.kt index ce7ee81cf..6941c4ed3 100644 --- a/src/net/torvald/terrarum/weather/WeatherMixer.kt +++ b/src/net/torvald/terrarum/weather/WeatherMixer.kt @@ -59,7 +59,7 @@ internal object WeatherMixer : RNGConsumer { JsonValue(JsonValue.ValueType.`object`), GdxColorMap(1, 3, Color(0x55aaffff), Color(0xaaffffff.toInt()), Color.WHITE), GdxColorMap(2, 2, Color.WHITE, Color.WHITE, Color.WHITE, Color.WHITE), - "default", + listOf("default"), 0f, 0f, 0f, @@ -74,9 +74,6 @@ internal object WeatherMixer : RNGConsumer { var globalLightOverridden = false - val weatherDB: HashMap> // search by classification - val weatherDict: HashMap // search by identifier - private var forceWindVec: Vector3? = null val globalLightNow = Cvec(0) @@ -153,37 +150,6 @@ internal object WeatherMixer : RNGConsumer { oldCamPos.set(WorldCamera.camVector) } - init { - weatherDB = HashMap>() - weatherDict = HashMap() - - - // read weather descriptions from assets/weather (modular weather) - val weatherRawValidList = ArrayList>() - val weatherRawsDir = ModMgr.getFilesFromEveryMod("weathers") - weatherRawsDir.forEach { (modname, parentdir) -> - printdbg(this, "Scanning dir $parentdir") - parentdir.listFiles(FileFilter { !it.isDirectory && it.name.endsWith(".json") })?.forEach { - weatherRawValidList.add(modname to it) - printdbg(this, "Registering weather '$it' from module $modname") - } - } - // --> read from directory and store file that looks like RAW - for ((modname, raw) in weatherRawValidList) { - val weather = readFromJson(modname, raw) - - weatherDict[weather.identifier] = weather - - // if List for the classification does not exist, make one - if (!weatherDB.containsKey(weather.classification)) - weatherDB.put(weather.classification, ArrayList()) - - weatherDB[weather.classification]!!.add(weather) - } - - weatherDict["titlescreen"] = weatherDB[WEATHER_GENERIC]?.get(0)?.copy(identifier = "titlescreen", windSpeed = 1f) ?: DEFAULT_WEATHER - } - /** * Part of Ingame update */ @@ -527,7 +493,7 @@ internal object WeatherMixer : RNGConsumer { } internal fun titleScreenInitWeather(weatherbox: Weatherbox) { - weatherbox.initWith(weatherDict["titlescreen"]!!, Long.MAX_VALUE) + weatherbox.initWith(WeatherCodex.getById("titlescreen")!!, Long.MAX_VALUE) forceWindVec = Vector3( -0.98f, 0f, @@ -923,72 +889,7 @@ internal object WeatherMixer : RNGConsumer { return lerp(x, c1.linearise(), c2.linearise()).unlinearise() } - fun getWeatherList(classification: String) = weatherDB[classification]!! - fun getRandomWeather(classification: String) = - getWeatherList(classification)[RNG.nextInt(getWeatherList(classification).size)] - - fun readFromJson(modname: String, file: File): BaseModularWeather = readFromJson(modname, file.path) - - fun readFromJson(modname: String, path: String): BaseModularWeather { - /* JSON structure: -{ - "skyboxGradColourMap": "colourmap/sky_colour.tga", // string (path to image) for dynamic. Image must be RGBA8888 or RGB888 - "extraImages": [ - // if any, it will be like: - sun01.tga, - clouds01.tga, - clouds02.tga, - auroraBlueViolet.tga - ] -} - */ - val pathToImage = "weathers" - - val JSON = JsonFetcher(path) - - val skyboxInJson = JSON.getString("skyboxGradColourMap") - val lightbox = JSON.getString("daylightClut") - - val cloudsMap = ArrayList() - val clouds = JSON["clouds"] - clouds.forEachSiblings { name, json -> - cloudsMap.add(CloudProps( - name, - TextureRegionPack(ModMgr.getGdxFile(modname, "$pathToImage/${json.getString("filename")}"), json.getInt("tw"), json.getInt("th")), - json.getFloat("probability"), - json.getFloat("baseScale"), - json.getFloat("scaleVariance"), - json.getFloat("altLow"), - json.getFloat("altHigh"), - )) - } - cloudsMap.sortBy { it.probability } - - - - return BaseModularWeather( - identifier = JSON.getString("identifier"), - json = JSON, - skyboxGradColourMap = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${skyboxInJson}")), - daylightClut = GdxColorMap(ModMgr.getGdxFile(modname, "$pathToImage/${lightbox}")), - classification = JSON.getString("classification"), - cloudChance = JSON.getFloat("cloudChance"), - windSpeed = JSON.getFloat("windSpeed"), - windSpeedVariance = JSON.getFloat("windSpeedVariance"), - windSpeedDamping = JSON.getFloat("windSpeedDamping"), - cloudGamma = JSON["cloudGamma"].asFloatArray().let { Vector2(it[0], it[1]) }, - cloudGammaVariance = JSON["cloudGammaVariance"].asFloatArray().let { Vector2(it[0], it[1]) }, - clouds = cloudsMap, - shaderVibrancy = JSON["shaderVibrancy"].asFloatArray() - ) - } - fun dispose() { - weatherDB.values.forEach { list -> - list.forEach { weather -> - weather.clouds.forEach { it.spriteSheet.dispose() } - } - } starmapTex.texture.dispose() shaderAstrum.dispose() shaderClouds.dispose() diff --git a/src/net/torvald/terrarum/weather/Weatherbox.kt b/src/net/torvald/terrarum/weather/Weatherbox.kt index 52645f529..5b4385290 100644 --- a/src/net/torvald/terrarum/weather/Weatherbox.kt +++ b/src/net/torvald/terrarum/weather/Weatherbox.kt @@ -3,6 +3,7 @@ package net.torvald.terrarum.weather import com.badlogic.gdx.math.Vector2 import com.jme3.math.FastMath import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.WeatherCodex import net.torvald.terrarum.floorToInt import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.gameworld.fmod @@ -64,9 +65,9 @@ class Weatherbox { private fun pickNextWeather(): WeatherSchedule { // temporary setup for the release - val newName = if (takeUniformRand(0f..1f) < 0.5f) "generic01" else "generic02" + val newWeather = WeatherCodex.getRandom() val newDuration = takeTriangularRand(3600f..10800f).roundToLong() - return WeatherSchedule(WeatherMixer.weatherDict[newName]!!, newDuration) + return WeatherSchedule(newWeather, newDuration) } fun update(world: GameWorld) { diff --git a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt index 66c385575..f65295b5b 100644 --- a/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt +++ b/src/net/torvald/terrarum/worlddrawer/BlocksDrawer.kt @@ -919,8 +919,8 @@ internal object BlocksDrawer { fun isWallSticker(b: ItemID) = App.tileMaker.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_WALL_STICKER fun isPlatform(b: ItemID) = App.tileMaker.getRenderTag(b).connectionType == CreateTileAtlas.RenderTag.CONNECT_WALL_STICKER_CONNECT_SELF //fun isBlendMul(b: Int) = TILES_BLEND_MUL.contains(b) - fun isTreeFoliage(b: ItemID) = BlockCodex[b].hasAllTagOf("TREE", "LEAVES") - fun isTreeTrunk(b: ItemID) = BlockCodex[b].hasAllTagOf("TREE", "TREETRUNK") + fun isTreeFoliage(b: ItemID) = BlockCodex[b].hasAllTagsOf("TREE", "LEAVES") + fun isTreeTrunk(b: ItemID) = BlockCodex[b].hasAllTagsOf("TREE", "TREETRUNK") fun tileInCamera(x: Int, y: Int) = x >= WorldCamera.x.div(TILE_SIZE) && y >= WorldCamera.y.div(TILE_SIZE) &&