From c84e01646c228f743c976543082da4a95578a9a7 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 14 Feb 2024 16:59:01 +0900 Subject: [PATCH] boom sound for the bomb --- .../audio/effects/explosion/bang_bomb.ogg | 3 ++ .../audio/effects/explosion/bang_small.ogg | 3 ++ src/net/torvald/terrarum/CreditSingleton.kt | 10 ++++++ src/net/torvald/terrarum/audio/AudioCodex.kt | 2 +- .../torvald/terrarum/audio/MusicContainer.kt | 7 +++- src/net/torvald/terrarum/gameactors/Actor.kt | 1 + .../modulebasegame/ExplosionManager.kt | 8 +++-- .../modulebasegame/TerrarumMusicGovernor.kt | 9 ++--- .../gameactors/ActorPrimedBomb.kt | 34 +++++++++++++++---- .../gameactors/FixtureFurnaceAndAnvil.kt | 6 +--- .../gameactors/FixtureJukebox.kt | 2 +- .../gameactors/FixtureMusicalTurntable.kt | 2 +- .../gameactors/FixtureSmelterBasic.kt | 7 +--- 13 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 assets/mods/basegame/audio/effects/explosion/bang_bomb.ogg create mode 100644 assets/mods/basegame/audio/effects/explosion/bang_small.ogg diff --git a/assets/mods/basegame/audio/effects/explosion/bang_bomb.ogg b/assets/mods/basegame/audio/effects/explosion/bang_bomb.ogg new file mode 100644 index 000000000..341016f2f --- /dev/null +++ b/assets/mods/basegame/audio/effects/explosion/bang_bomb.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e165b96c97358a47db014586d9f3c117ee79e8b978d431493098f8a0f4f93218 +size 66764 diff --git a/assets/mods/basegame/audio/effects/explosion/bang_small.ogg b/assets/mods/basegame/audio/effects/explosion/bang_small.ogg new file mode 100644 index 000000000..8a5def614 --- /dev/null +++ b/assets/mods/basegame/audio/effects/explosion/bang_small.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7b529f192c1dc4fc8833ab516907c680d5c0d16368c723ea8736adee5ba8ab5 +size 31188 diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index ebc286858..777a914fd 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -335,6 +335,16 @@ Sound from ℗ 2019 DrinkingWindGames Sound from + - effects/explosion/bang_bomb.ogg + +℗ 2019 Richwise +Sound from + + - effects/explosion/bang_small.ogg + +℗ 2009 Superex1110 +Sound from + $BULLET Impulse Responses: diff --git a/src/net/torvald/terrarum/audio/AudioCodex.kt b/src/net/torvald/terrarum/audio/AudioCodex.kt index 36e7dccbf..1c8f0eec5 100644 --- a/src/net/torvald/terrarum/audio/AudioCodex.kt +++ b/src/net/torvald/terrarum/audio/AudioCodex.kt @@ -31,7 +31,7 @@ class AudioCodex { fun getRandomAudio(identifier: String): MusicContainer? { val file = audio[identifier]?.random() return if (file != null) { - MusicContainer(file.nameWithoutExtension(), file.file(), Gdx.audio.newMusic(file)) { + MusicContainer(file.nameWithoutExtension(), file.file()) { it.tryDispose() } } diff --git a/src/net/torvald/terrarum/audio/MusicContainer.kt b/src/net/torvald/terrarum/audio/MusicContainer.kt index 594be26e8..07da21812 100644 --- a/src/net/torvald/terrarum/audio/MusicContainer.kt +++ b/src/net/torvald/terrarum/audio/MusicContainer.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.backends.lwjgl3.audio.Mp3 import com.badlogic.gdx.backends.lwjgl3.audio.Ogg import com.badlogic.gdx.backends.lwjgl3.audio.OggInputStream import com.badlogic.gdx.backends.lwjgl3.audio.Wav +import com.badlogic.gdx.files.FileHandle import com.badlogic.gdx.utils.Disposable import com.jcraft.jorbis.VorbisFile import javazoom.jl.decoder.Bitstream @@ -20,7 +21,7 @@ import javax.sound.sampled.AudioSystem data class MusicContainer( val name: String, val file: File, - val gdxMusic: Music, + val loop: Boolean = false, internal var songFinishedHook: (Music) -> Unit = {} ): Disposable { val samplingRate: Int @@ -29,7 +30,11 @@ data class MusicContainer( var samplesRead = 0L; internal set val samplesTotal: Long + val gdxMusic = Gdx.audio.newMusic(FileHandle(file)) + init { + gdxMusic.isLooping = loop + gdxMusic.setOnCompletionListener(songFinishedHook) samplingRate = when (gdxMusic) { diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 2a40cb982..fe8b913f2 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -166,6 +166,7 @@ abstract class Actor : Comparable, Runnable { it.trackingTarget = this it.currentTrack = music it.maxVolumeFun = { volume } + it.volume = volume doSomethingWithTrack(it) it.play() } diff --git a/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt b/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt index 4afd15257..060f152a9 100644 --- a/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt +++ b/src/net/torvald/terrarum/modulebasegame/ExplosionManager.kt @@ -14,7 +14,7 @@ object ExplosionManager { private const val CALC_RADIUS = 127 private const val CALC_WIDTH = CALC_RADIUS * 2 + 1 - fun goBoom(world: GameWorld, tx: Int, ty: Int, power: Float) { + fun goBoom(world: GameWorld, tx: Int, ty: Int, power: Float, callback: () -> Unit) { // create a copy of the tilemap val tilemap = BlockLayerI16(CALC_WIDTH, CALC_WIDTH) @@ -23,7 +23,7 @@ object ExplosionManager { memcpyFromWorld(world, tx - CALC_RADIUS, ty - CALC_RADIUS, line, tilemap) } - createExplosionWorker(tilemap, tx, ty, power, world).start() + createExplosionWorker(tilemap, tx, ty, power, world, callback).start() } private fun memcpyFromWorld(world: GameWorld, xStart: Int, yStart: Int, yOff: Int, out: BlockLayerI16) { @@ -64,7 +64,7 @@ object ExplosionManager { * @param ty tilewise centre-y of the explosive * @param outWorld world object to write the result to */ - private fun createExplosionWorker(tilemap: BlockLayerI16, tx: Int, ty: Int, power: Float, outWorld: GameWorld): Thread { + private fun createExplosionWorker(tilemap: BlockLayerI16, tx: Int, ty: Int, power: Float, outWorld: GameWorld, callback: () -> Unit): Thread { return Thread { // simulate explosion like lightmaprenderer @@ -74,6 +74,8 @@ object ExplosionManager { // dispose of the tilemap copy tilemap.tryDispose() + + callback() } } diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index 2a31706be..a62a05277 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -46,8 +46,7 @@ class TerrarumMusicGovernor : MusicGovernor() { try { MusicContainer( fileToName(it.name), - it, - Gdx.audio.newMusic(Gdx.files.absolute(it.absolutePath)) + it ).also { muscon -> printdbg(this, "MusicTitle: ${muscon.name}") @@ -149,10 +148,8 @@ class TerrarumMusicGovernor : MusicGovernor() { MusicContainer( fileHandle.nameWithoutExtension().replace('_', ' ').split(" ").map { it.capitalize() }.joinToString(" "), fileHandle.file(), - Gdx.audio.newMusic(fileHandle).also { - it.isLooping = true - } - ) { } + loop = true, + ) } catch (e: GdxRuntimeException) { e.printStackTrace() diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt index 0b1fad2b8..6d2294ad4 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorPrimedBomb.kt @@ -1,9 +1,10 @@ package net.torvald.terrarum.modulebasegame.gameactors +import com.badlogic.gdx.Gdx import net.torvald.spriteanimation.SingleImageSprite -import net.torvald.terrarum.CommonResourcePool -import net.torvald.terrarum.INGAME -import net.torvald.terrarum.Second +import net.torvald.terrarum.* +import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.decibelsToFullscale import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gameactors.PhysProperties import net.torvald.terrarum.modulebasegame.ExplosionManager @@ -19,6 +20,7 @@ open class ActorPrimedBomb( init { renderOrder = RenderOrder.MIDTOP physProp = PhysProperties.PHYSICS_OBJECT() + elasticity = 0.34 } protected constructor() : this(1f, 1f) { @@ -26,17 +28,37 @@ open class ActorPrimedBomb( physProp = PhysProperties.PHYSICS_OBJECT() } + private var explosionCalled = false + + @Transient private val boomSound = MusicContainer( + "boom", ModMgr.getFile("basegame", "audio/effects/explosion/bang_bomb.ogg") + ) { + this.flagDespawn() + } + override fun updateImpl(delta: Float) { super.updateImpl(delta) fuse -= delta - if (fuse <= 0f) { + if (fuse <= 0f && !explosionCalled) { + explosionCalled = true physProp.usePhysics = false - ExplosionManager.goBoom(INGAME.world, intTilewiseHitbox.centeredX.toInt(), intTilewiseHitbox.centeredY.toInt(), explosionPower) - flagDespawn() + + this.isVisible = false // or play explosion anim + startAudio(boomSound, 10.0) + + ExplosionManager.goBoom(INGAME.world, intTilewiseHitbox.centeredX.toInt(), intTilewiseHitbox.centeredY.toInt(), explosionPower) { + + + } } } + + override fun dispose() { + super.dispose() + boomSound.dispose() + } } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt index e1da3a035..f916eeb88 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt @@ -60,11 +60,7 @@ class FixtureFurnaceAndAnvil : FixtureBase, CraftingStation { } } - @Transient val static = MusicContainer("bonfire", ModMgr.getFile("basegame", "audio/effects/static/bonfire.ogg"), Gdx.audio.newMusic( - ModMgr.getGdxFile("basegame", "audio/effects/static/bonfire.ogg") - ).also { - it.isLooping = true - }) + @Transient val static = MusicContainer("bonfire", ModMgr.getFile("basegame", "audio/effects/static/bonfire.ogg"), true) @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 0.0, TerrarumAppConfiguration.TILE_SIZED * 2, TerrarumAppConfiguration.TILE_SIZED * 2), Cvec(0.5f, 0.18f, 0f, 0f))) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt index 69cfcdd0f..d2f372034 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt @@ -127,7 +127,7 @@ class FixtureJukebox : Electric, PlaysMusic { printdbg(this, "Title: $title, artist: $artist") - musicNowPlaying = MusicContainer(title, musicFile.file(), Gdx.audio.newMusic(musicFile)) { + musicNowPlaying = MusicContainer(title, musicFile.file()) { unloadEffector(musicNowPlaying) discCurrentlyPlaying = null musicNowPlaying?.gdxMusic?.tryDispose() diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt index 0b62da305..bfd309a0f 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt @@ -119,7 +119,7 @@ class FixtureMusicalTurntable : Electric, PlaysMusic { App.printdbg(this, "Title: $title, artist: $artist") - musicNowPlaying = MusicContainer(title, musicFile.file(), Gdx.audio.newMusic(musicFile)) { + musicNowPlaying = MusicContainer(title, musicFile.file()) { unloadEffector(musicNowPlaying) musicNowPlaying?.gdxMusic?.tryDispose() musicNowPlaying = null diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt index eae20d2c2..89f8e899c 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt @@ -81,12 +81,7 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { this.mainUI = UISmelterBasic(this) } - @Transient val static = MusicContainer("bonfire", ModMgr.getFile("basegame", "audio/effects/static/bonfire.ogg"), Gdx.audio.newMusic( - ModMgr.getGdxFile("basegame", "audio/effects/static/bonfire.ogg") - ).also { - it.isLooping = true - }) - + @Transient val static = MusicContainer("bonfire", ModMgr.getFile("basegame", "audio/effects/static/bonfire.ogg"), true) @Transient val light = Cvec(0.5f, 0.18f, 0f, 0f) @Transient override var lightBoxList = arrayListOf(Lightbox(Hitbox(0.0, 2*TILE_SIZED, TILE_SIZED * 2, TILE_SIZED * 2), Cvec(0.5f, 0.18f, 0f, 0f)))