diff --git a/assets/mods/basegame/audio/effects/steps/GRSS_1.ogg b/assets/mods/basegame/audio/effects/steps/GRSS_1.ogg new file mode 100644 index 000000000..73a01aa3b --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRSS_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6d39e145317d148c5f04c500a4920ba620bdea689ae60e96369b02fe59cc88b9 +size 6087 diff --git a/assets/mods/basegame/audio/effects/steps/GRSS_2.ogg b/assets/mods/basegame/audio/effects/steps/GRSS_2.ogg new file mode 100644 index 000000000..6bc6878fb --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRSS_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acf029acc7d5b8f277363313a48e55b7d3eec88ed9ea89272406698eb8faa1fb +size 6923 diff --git a/assets/mods/basegame/audio/effects/steps/GRSS_3.ogg b/assets/mods/basegame/audio/effects/steps/GRSS_3.ogg new file mode 100644 index 000000000..7eaa51ac5 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRSS_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cfd2cc1f0767047d970a365474e62c09e3d1233e0192639fada49d0051fa5e6 +size 6414 diff --git a/assets/mods/basegame/audio/effects/steps/GRSS_4.ogg b/assets/mods/basegame/audio/effects/steps/GRSS_4.ogg new file mode 100644 index 000000000..780ec9090 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRSS_4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c4f9eefec9b7c4eaa6c6704015f027728d78a332f6d65eee4bff9871436c543 +size 5840 diff --git a/assets/mods/basegame/audio/effects/steps/GRSS_5.ogg b/assets/mods/basegame/audio/effects/steps/GRSS_5.ogg new file mode 100644 index 000000000..89bb16952 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRSS_5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:914250b066b5e239dbc2d656bccbe57d45922a68863dd199fd398fa602bddd10 +size 6015 diff --git a/assets/mods/basegame/audio/effects/steps/GRSS_6.ogg b/assets/mods/basegame/audio/effects/steps/GRSS_6.ogg new file mode 100644 index 000000000..8ce14b9b9 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRSS_6.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8da875d6fd313ded105ca48d5f412195e9be47c41b66d1b8f7b52230ed521210 +size 6868 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_1.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_1.ogg new file mode 100644 index 000000000..d113a4bf7 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed38c6f597d43604eba88bd64e99a5fd32cdddb7db9eb093503c51736e6b7593 +size 9868 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_2.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_2.ogg new file mode 100644 index 000000000..c9eff945d --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:309d9ad7659c42448502daf30a650d664102e5022416636cf6492dfca2e8dbfc +size 8607 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_3.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_3.ogg new file mode 100644 index 000000000..95aa1acde --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a6441fca5c4848585374dba6c81106706bd8ba6aef35d2e828d0cccefc7a5e2 +size 7363 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_4.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_4.ogg new file mode 100644 index 000000000..fb226d406 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a31bf0a707f5500017698abb137e08907b075baba749f7feaea95c63e638c08f +size 7313 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_5.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_5.ogg new file mode 100644 index 000000000..2fe3c6891 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3850d88355eb8bf03d5b4a9f76198a59d19971dbdbe377ba42e05f1ca30985a8 +size 10740 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_6.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_6.ogg new file mode 100644 index 000000000..1e55c3676 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_6.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:70ce28e3551743c7bc382b4e7459f9079dc0d1a6c51a0185a14a1bcd6c5a2036 +size 8255 diff --git a/assets/mods/basegame/audio/effects/steps/GRVL_7.ogg b/assets/mods/basegame/audio/effects/steps/GRVL_7.ogg new file mode 100644 index 000000000..acf2ade73 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/GRVL_7.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74cb117770960c9030b18076cbc1b09dff9f7096754d86f27b8f89055db17b1d +size 8256 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_1.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_1.ogg new file mode 100644 index 000000000..85f8e2d7b --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb94dcc9b50cbd524d09e0235fefb1f13f90ce8f0145faaffa0aad737a6bb969 +size 6439 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_2.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_2.ogg new file mode 100644 index 000000000..3e82c46fe --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7452ee7892751c2c4b12800bbcafd13fbf2abaf7fcc6892201c38ebcc250853 +size 6016 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_3.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_3.ogg new file mode 100644 index 000000000..d3c8fc0c3 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5189c7f9ccc0dfddc00636b22ed1a1e8ac745e1870ba1905484fb4a691723b55 +size 6486 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_4.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_4.ogg new file mode 100644 index 000000000..45f1989d6 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:797918f888bd8b41fce6b681c44427c41e27de6befa976c1995fbfb7f3adaf63 +size 6242 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_5.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_5.ogg new file mode 100644 index 000000000..5c0c82aa3 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_5.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6482ba34302f0ca880c73bcb6ea68345c241416160a711daa5aef9db23ffbccb +size 6382 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_6.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_6.ogg new file mode 100644 index 000000000..ea5bee7ac --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_6.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4856743d4ac68bda2dac681533349399edd2d0aa8fb4ddbab0cd8b57d95adb44 +size 6591 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_7.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_7.ogg new file mode 100644 index 000000000..0342554d0 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_7.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a0f2fbd9094a9df05af709cf4671646b3a158dae0db2ad3420b32c233be51d7 +size 6766 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_8.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_8.ogg new file mode 100644 index 000000000..98e86129b --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_8.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae6b4480c031e85015fd1420c163428ca7ef335fc8c9b157a2877f13ed64615a +size 6004 diff --git a/assets/mods/basegame/audio/effects/steps/ROCK_9.ogg b/assets/mods/basegame/audio/effects/steps/ROCK_9.ogg new file mode 100644 index 000000000..08ca9d4db --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/ROCK_9.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cef3b1833df0271962ef636282733024cbce2266b6e894dcdf368c23052f8069 +size 6683 diff --git a/assets/mods/basegame/audio/effects/steps/SAND_1.ogg b/assets/mods/basegame/audio/effects/steps/SAND_1.ogg new file mode 100644 index 000000000..72dbc17bc --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/SAND_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2aa9dc7a5f98f82ec75919c13d884ee76b67ad1a332cdb58209dc7bb10dd0c6d +size 6464 diff --git a/assets/mods/basegame/audio/effects/steps/SAND_2.ogg b/assets/mods/basegame/audio/effects/steps/SAND_2.ogg new file mode 100644 index 000000000..67ef64c58 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/SAND_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87cad60616d289ea394acebc200d89e936ebecc397634c97b0333875f8222c65 +size 6562 diff --git a/assets/mods/basegame/audio/effects/steps/SAND_3.ogg b/assets/mods/basegame/audio/effects/steps/SAND_3.ogg new file mode 100644 index 000000000..258171970 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/SAND_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fea9b2822eec23db834c9524ba90940859910345145617e1b8a3632f8f7fa609 +size 6086 diff --git a/assets/mods/basegame/audio/effects/steps/SAND_4.ogg b/assets/mods/basegame/audio/effects/steps/SAND_4.ogg new file mode 100644 index 000000000..8470f7050 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/SAND_4.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f00647579756573ea343b6df49ca723d97a44ec377e4d6f48da8b519a110f6a +size 6989 diff --git a/assets/mods/basegame/audio/effects/steps/WOOD_1.ogg b/assets/mods/basegame/audio/effects/steps/WOOD_1.ogg new file mode 100644 index 000000000..113f45d60 --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/WOOD_1.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e68fb553d6ebb59a616c2c6c1a19fc4abb59e6439336f28fc600dfa5a2cf6906 +size 6967 diff --git a/assets/mods/basegame/audio/effects/steps/WOOD_2.ogg b/assets/mods/basegame/audio/effects/steps/WOOD_2.ogg new file mode 100644 index 000000000..99976fc1f --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/WOOD_2.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e972f0d43e7adc91c5e6199c8e4c9384a4f054ebf7de39ba42dbf375bda7fbc6 +size 6416 diff --git a/assets/mods/basegame/audio/effects/steps/WOOD_3.ogg b/assets/mods/basegame/audio/effects/steps/WOOD_3.ogg new file mode 100644 index 000000000..15a8642ea --- /dev/null +++ b/assets/mods/basegame/audio/effects/steps/WOOD_3.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8ab9ef3c68a2bc7e921e17515203c89ead0fceff827704d32ee04afe37e2298 +size 6363 diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index 232310a10..b3b89b266 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -261,7 +261,20 @@ $BULLET Ambient sound recordings: - crickets_02.ogg Copyright (C) 2012, 2013, 2015, 2016, 2017 Klankbeeld -Sound from +Sound from + + + +$BULLET Footstep sound recordings: + + - GRSS_01..06.ogg + - GRVL_01..07.ogg + - ROCK_01..09.ogg + - SAND_01..04.ogg + - WOOD_01..03.ogg + +Copyright (C) 2020, 2021, 2022 Nox Sound +Sound from diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 29b5a3fd9..f6ed1f8bd 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -217,7 +217,7 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo actorContainerInactive.forEach { it.dispose() } world.dispose() - disposables.forEach(Consumer { it.tryDispose() }) + disposables.forEach { it.tryDispose() } } //////////// diff --git a/src/net/torvald/terrarum/ModMgr.kt b/src/net/torvald/terrarum/ModMgr.kt index f2def82cc..ae3aa86dd 100644 --- a/src/net/torvald/terrarum/ModMgr.kt +++ b/src/net/torvald/terrarum/ModMgr.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.Pixmap import com.badlogic.gdx.utils.JsonValue import net.torvald.terrarum.App.* import net.torvald.terrarum.App.setToGameConfig +import net.torvald.terrarum.audio.AudioCodex import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.OreCodex import net.torvald.terrarum.blockproperties.WireCodex @@ -464,6 +465,16 @@ object ModMgr { return dir.listFiles() } } + fun getGdxFiles(module: String, path: String): Array { + checkExistence(module) + val dir = getGdxFile(module, path) + if (!dir.isDirectory) { + throw FileNotFoundException("The path is not a directory") + } + else { + return dir.list() + } + } /** Get a common file (literal file or directory) from all the installed mods. Files are guaranteed to exist. If a mod does not * contain the file, the mod will be skipped. @@ -668,6 +679,35 @@ object ModMgr { } } + object GameAudioLoader { + val audioPath = listOf( + "audio/music", + "audio/effects", + "audio/ambient", + ) + + init { + Terrarum.audioCodex = AudioCodex() + } + + private fun loadAudio(basename: String, file: FileHandle) { + if (file.isDirectory) + file.list().forEach { loadAudio("$basename.${it.nameWithoutExtension()}", it) } + else { + val id = basename + val materialID = file.nameWithoutExtension().substringBefore('_') + Terrarum.audioCodex.addToFootstepPool(materialID, file) + printdbg(this, "Registering music $id") + } + } + + @JvmStatic operator fun invoke(module: String) { + audioPath.forEach { + getGdxFiles(module, it).forEach { file -> loadAudio("audio.${file.name()}", file) } + } + } + } + /** * A sugar-library for easy texture pack creation */ diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 276e6c362..63170f1ab 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -16,6 +16,7 @@ import net.torvald.random.HQRNG import net.torvald.terrarum.App.* import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED +import net.torvald.terrarum.audio.AudioCodex import net.torvald.terrarum.blockproperties.BlockCodex import net.torvald.terrarum.blockproperties.FluidCodex import net.torvald.terrarum.blockproperties.OreCodex @@ -78,6 +79,7 @@ object Terrarum : Disposable { var apocryphas = HashMap(); internal set var fluidCodex = FluidCodex(); internal set var oreCodex = OreCodex(); internal set + var audioCodex = AudioCodex(); internal set ////////////////////////////// diff --git a/src/net/torvald/terrarum/audio/AudioCodex.kt b/src/net/torvald/terrarum/audio/AudioCodex.kt new file mode 100644 index 000000000..b7c26521d --- /dev/null +++ b/src/net/torvald/terrarum/audio/AudioCodex.kt @@ -0,0 +1,34 @@ +package net.torvald.terrarum.audio + +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.audio.Music +import com.badlogic.gdx.files.FileHandle +import com.badlogic.gdx.utils.Disposable +import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.modulebasegame.MusicContainer +import net.torvald.terrarum.tryDispose + +typealias MaterialID = String + +/** + * Created by minjaesong on 2023-12-02. + */ +class AudioCodex: Disposable { + + @Transient val footsteps = HashMap>() + + internal constructor() + + fun addToFootstepPool(materialID: MaterialID, music: FileHandle) { + if (footsteps[materialID] == null) footsteps[materialID] = HashSet() + footsteps[materialID]!!.add( + MusicContainer(music.nameWithoutExtension(), music.file(), Gdx.audio.newMusic(music)) {} + ) + } + + fun getRandomFootstep(materialID: MaterialID) = footsteps[materialID]?.random() + + override fun dispose() { + footsteps.values.forEach { it.forEach { it.gdxMusic.tryDispose() } } + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 27593dbb8..b69637950 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -101,18 +101,14 @@ object AudioMixer: Disposable { * Return oldest dynamic track, even if the track is currently playing */ fun getFreeTrackNoMatterWhat(): TerrarumAudioMixerTrack { - return dynamicTracks.minBy { it.playStartedTime } + return getFreeTrack() ?: dynamicTracks.minBy { it.playStartedTime } } /** * Return oldest dynamic track that is not playing */ fun getFreeTrack(): TerrarumAudioMixerTrack? { - val oldestTrack = dynamicTracks.minBy { it.playStartedTime } - return if (oldestTrack.isPlaying) - null - else - oldestTrack + return dynamicTracks.filter { it.trackingTarget == null && !it.isPlaying }.minByOrNull { it.playStartedTime } } private val processingExecutor = ThreadExecutor() diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index a2d2fe4ce..fdfbcaa87 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -2,6 +2,7 @@ package net.torvald.terrarum.audio import com.badlogic.gdx.utils.Queue import net.torvald.reflection.forceInvoke +import net.torvald.terrarum.App import net.torvald.terrarum.Terrarum import net.torvald.terrarum.audio.dsp.BinoPan import net.torvald.terrarum.audio.dsp.NullFilter @@ -41,7 +42,7 @@ class MixerTrackProcessor(val bufferSize: Int, val rate: Int, val track: Terraru private val distFalloff = 2048.0 private fun printdbg(msg: Any) { - if (true) println("[AudioAdapter ${track.name}] $msg") + if (true) App.printdbg("AudioAdapter ${track.name}", msg) } override fun run() { // while (running) { // uncomment to multithread @@ -80,8 +81,8 @@ class MixerTrackProcessor(val bufferSize: Int, val rate: Int, val track: Terraru track.volume = track.maxVolume (track.filters[0] as BinoPan).pan = 0f } - else { - val relativeXpos = relativeXposition(AudioMixer.actorNowPlaying!!, track.trackingTarget!!) + else if (track.trackingTarget is ActorWithBody) { + val relativeXpos = relativeXposition(AudioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody) track.volume = track.maxVolume * (1.0 - relativeXpos.absoluteValue.pow(0.5) / distFalloff) (track.filters[0] as BinoPan).pan = ((2*asin(relativeXpos / distFalloff)) / Math.PI).toFloat() } @@ -91,6 +92,10 @@ class MixerTrackProcessor(val bufferSize: Int, val rate: Int, val track: Terraru // fetch deviceBufferSize amount of sample from the disk if (track.trackType != TrackType.MASTER && track.trackType != TrackType.BUS && track.streamPlaying) { + if (track.trackType == TrackType.DYNAMIC_SOURCE) { + printdbg("${track.name} streaming") + } + streamBuf.fetchBytes { val bytesRead = track.currentTrack?.gdxMusic?.forceInvoke("read", arrayOf(it)) if (bytesRead == null || bytesRead <= 0) { // some class (namely Mp3) may return 0 instead of negative value diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index 085c2ec9a..21983ab18 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -9,6 +9,7 @@ import net.torvald.reflection.forceInvoke import net.torvald.terrarum.App import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.audio.dsp.TerrarumAudioFilter +import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.getHashStr import net.torvald.terrarum.hashStrMap @@ -22,7 +23,7 @@ enum class TrackType { STATIC_SOURCE, DYNAMIC_SOURCE, BUS, MASTER } -class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, private val maxVolumeFun: () -> Double = {1.0}): Disposable { +class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, var maxVolumeFun: () -> Double = {1.0}): Disposable { companion object { const val SAMPLING_RATE = 48000 @@ -57,7 +58,7 @@ class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, privat val filters: Array = Array(4) { NullFilter } - var trackingTarget: ActorWithBody? = null + var trackingTarget: Actor? = null var playStartedTime = 0L; private set @@ -140,9 +141,16 @@ class TerrarumAudioMixerTrack(val name: String, val trackType: TrackType, privat fun stop() { currentTrack?.gdxMusic?.forceInvoke("reset", arrayOf()) streamPlaying = false - playStartedTime = 0L +// playStartedTime = 0L + + if (trackingTarget != null && currentTrack != null) { + trackingTarget!!.onAudioInterrupt(currentTrack!!) + } + fireSongFinishHook() // fireSoundFinishHook() + + trackingTarget = null } fun fireSongFinishHook() { diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 59e84b669..f3c91f98c 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -3,11 +3,13 @@ package net.torvald.terrarum.gameactors import com.badlogic.gdx.audio.Music import com.badlogic.gdx.audio.Sound import net.torvald.random.HQRNG +import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.INGAME import net.torvald.terrarum.ReferencingRanges import net.torvald.terrarum.Terrarum import net.torvald.terrarum.audio.AudioMixer import net.torvald.terrarum.audio.TerrarumAudioMixerTrack +import net.torvald.terrarum.audio.TrackVolume import net.torvald.terrarum.modulebasegame.MusicContainer import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid import net.torvald.terrarum.modulebasegame.gameactors.Pocketed @@ -120,13 +122,17 @@ abstract class Actor : Comparable, Runnable { } } + printdbg(this, "Dynamic Source ${track?.name}") + return track } - open fun startAudio(music: MusicContainer) { + open fun startAudio(music: MusicContainer, volume: TrackVolume = 1.0) { getTrackByAudio(music)?.let { - it.trackingTarget = if (this is ActorWithBody) this else null + it.stop() + it.trackingTarget = this it.currentTrack = music + it.maxVolumeFun = { volume } it.play() } } diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 10ca6770b..364574da4 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -11,6 +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.TerrarumAppConfiguration.TILE_SIZEF +import net.torvald.terrarum.audio.AudioCodex import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.blockproperties.BlockProp import net.torvald.terrarum.gamecontroller.KeyToggler @@ -2041,6 +2042,20 @@ open class ActorWithBody : Actor { makeDust0(tile, px, py, particleCount, collisionDamage, vecSum) } } + + if (particleCount >= 1.0) { + val volumeMax = (particleCount.pow(0.75) / 8.0).coerceIn(0.0, 2.0) + val feetTileMats = feetTiles.map { BlockCodex[it.second].material } + val feetTileCnt = feetTileMats.size.toDouble() + val materialStats = feetTileMats.distinct().map { mat -> mat to feetTileMats.count { it == mat } } + materialStats.forEach { (mat, cnt) -> + Terrarum.audioCodex.getRandomFootstep(mat)?.let { + val vol = volumeMax * (cnt / feetTileCnt) + startAudio(it, vol) + printdbg(this, "Playing footstep $mat (vol: $vol, file: ${it.file.name})") + } + } + } } } diff --git a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt index 3be5e05c2..4a62aaed3 100644 --- a/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt +++ b/src/net/torvald/terrarum/modulebasegame/EntryPoint.kt @@ -43,6 +43,7 @@ class EntryPoint : ModuleEntryPoint() { ModMgr.GameOreLoader.invoke(moduleName) ModMgr.GameLanguageLoader.invoke(moduleName) ModMgr.GameCraftingRecipeLoader.invoke(moduleName) + ModMgr.GameAudioLoader.invoke(moduleName) if (App.IS_DEVELOPMENT_BUILD) { println("[EntryPoint] Crafting Recipes: ") diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 9e276bd86..492b4b8d8 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.glutils.ShapeRenderer import net.torvald.terrarum.* import net.torvald.terrarum.App.* +import net.torvald.terrarum.Terrarum.audioCodex import net.torvald.terrarum.Terrarum.getPlayerSaveFiledesc import net.torvald.terrarum.Terrarum.getWorldSaveFiledesc import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE @@ -1586,7 +1587,7 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { } musicGovernor.dispose() - + audioCodex.dispose() super.dispose() } }