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()
}
}