From 7d871c5d49288011459922ca8a64939f01c0d396 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 12 Feb 2024 04:48:25 +0900 Subject: [PATCH] actors now use 'updateImpl'; static sound for smelter and furnace --- .../terrarum/audio/MixerTrackProcessor.kt | 13 +++--- .../torvald/terrarum/audio/MusicContainer.kt | 8 +++- src/net/torvald/terrarum/gameactors/Actor.kt | 24 +++++++++- .../gameactors/ActorMovingPlatform.kt | 3 ++ .../terrarum/gameactors/ActorWithBody.kt | 4 +- .../terrarum/gameactors/BlockMarkerActor.kt | 2 +- .../torvald/terrarum/gameactors/WireActor.kt | 2 +- .../terrarum/modulebasegame/BuildingMaker.kt | 8 ++-- .../terrarum/modulebasegame/TitleScreen.kt | 2 +- .../gameactors/ActorHumanoid.kt | 4 +- .../modulebasegame/gameactors/Cultivable.kt | 4 +- .../modulebasegame/gameactors/DroppedItem.kt | 4 +- .../modulebasegame/gameactors/FixtureBase.kt | 13 +++--- .../gameactors/FixtureFurnaceAndAnvil.kt | 45 +++++++++++++++++-- .../gameactors/FixtureJukebox.kt | 4 +- .../gameactors/FixtureMusicalTurntable.kt | 4 +- .../gameactors/FixtureSmelterBasic.kt | 43 +++++++++++++++++- .../gameactors/FixtureSwingingDoorBase.kt | 5 +-- .../gameactors/FixtureTikiTorch.kt | 6 +-- .../gameactors/FixtureTypewriter.kt | 4 +- .../modulebasegame/gameactors/HumanoidNPC.kt | 4 +- .../gameactors/PhysTestLuarLander.kt | 4 +- .../gameactors/ProjectileSimple.kt | 4 +- .../terrarum/ui/BasicDebugInfoWindow.kt | 14 +++--- 24 files changed, 164 insertions(+), 64 deletions(-) diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index 7b5f27038..2485acc44 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -138,15 +138,16 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud (track.filters[DS_FLTIDX_PAN] as BinoPan).earDist = App.audioMixer.listenerHeadSize if (App.audioMixer.actorNowPlaying != null) { - if (track.trackingTarget == null || track.trackingTarget == App.audioMixer.actorNowPlaying) { + val trackingTarget = track.trackingTarget + if (trackingTarget == null || trackingTarget == App.audioMixer.actorNowPlaying) { // "reset" the track track.volume = track.maxVolume (track.filters[DS_FLTIDX_PAN] as BinoPan).pan = 0f (track.filters[DS_FLTIDX_LOW] as Lowpass).setCutoff(SAMPLING_RATE / 2f) } - else if (track.trackingTarget is ActorWithBody) { - val relativeXpos = relativeXposition(App.audioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody) - val distFromActor = distBetweenActors(App.audioMixer.actorNowPlaying!!, track.trackingTarget as ActorWithBody) + else if (trackingTarget is ActorWithBody) { + val relativeXpos = relativeXposition(App.audioMixer.actorNowPlaying!!, trackingTarget as ActorWithBody) + val distFromActor = distBetweenActors(App.audioMixer.actorNowPlaying!!, trackingTarget as ActorWithBody) val vol = track.maxVolume * getVolFun(distFromActor / distFalloff).coerceAtLeast(0.0) track.volume = vol (track.filters[DS_FLTIDX_PAN] as BinoPan).pan = (1.3f * relativeXpos / distFalloff).toFloat() @@ -154,11 +155,11 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud (SAMPLING_RATED*0.5) / (24.0 * (distFromActor / distFalloff).sqr() + 1.0) ) - val sourceVec = (track.trackingTarget as ActorWithBody).let { it.externalV + (it.controllerV ?: Vector2()) } + val sourceVec = (trackingTarget as ActorWithBody).let { it.externalV + (it.controllerV ?: Vector2()) } val listenerVec = App.audioMixer.actorNowPlaying!!.let { it.externalV + (it.controllerV ?: Vector2()) } val distFromActorNext = distBetweenPoints( App.audioMixer.actorNowPlaying!!.centrePosVector + listenerVec, - (track.trackingTarget as ActorWithBody).centrePosVector + sourceVec + (trackingTarget as ActorWithBody).centrePosVector + sourceVec ) val isApproaching = if (distFromActorNext <= distFromActor) 1.0 else -1.0 val relativeSpeed = (sourceVec - listenerVec).magnitude * GAME_TO_SI_VELO * isApproaching diff --git a/src/net/torvald/terrarum/audio/MusicContainer.kt b/src/net/torvald/terrarum/audio/MusicContainer.kt index 0313283f6..594be26e8 100644 --- a/src/net/torvald/terrarum/audio/MusicContainer.kt +++ b/src/net/torvald/terrarum/audio/MusicContainer.kt @@ -6,11 +6,13 @@ 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.utils.Disposable import com.jcraft.jorbis.VorbisFile import javazoom.jl.decoder.Bitstream import net.torvald.reflection.extortField import net.torvald.reflection.forceInvoke import net.torvald.terrarum.App +import net.torvald.terrarum.tryDispose import java.io.File import java.io.FileInputStream import javax.sound.sampled.AudioSystem @@ -20,7 +22,7 @@ data class MusicContainer( val file: File, val gdxMusic: Music, internal var songFinishedHook: (Music) -> Unit = {} -) { +): Disposable { val samplingRate: Int val codec: String @@ -132,4 +134,8 @@ data class MusicContainer( } override fun equals(other: Any?) = this.file.path == (other as MusicContainer).file.path + + override fun dispose() { + gdxMusic.dispose() + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 9157df242..f070a3131 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -7,6 +7,7 @@ import net.torvald.terrarum.Terrarum import net.torvald.terrarum.audio.MusicContainer import net.torvald.terrarum.audio.TerrarumAudioMixerTrack import net.torvald.terrarum.audio.TrackVolume +import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.modulebasegame.gameactors.ActorHumanoid import net.torvald.terrarum.modulebasegame.gameactors.Pocketed import net.torvald.terrarum.savegame.toBigEndian @@ -51,14 +52,19 @@ abstract class Actor : Comparable, Runnable { OVERLAY // screen overlay, not affected by lightmap } - open fun update(delta: Float) { + fun update(delta: Float) { if (!canBeDespawned) flagDespawn = false // actively deny despawning request if cannot be despawned if (canBeDespawned && flagDespawn) { despawn() despawned = true } + if (!despawned) { + updateImpl(delta) + } } + open fun updateImpl(delta: Float) {} + var actorValue = ActorValue(this) @Volatile var flagDespawn = false @Transient var despawnHook: (Actor) -> Unit = {} @@ -95,6 +101,15 @@ abstract class Actor : Comparable, Runnable { open fun despawn() { if (canBeDespawned) { + musicTracks1.forEach { name -> + val it = App.audioMixer.dynamicTracks[name.substring(2).toInt() - 1] + + println("stop track $name") + it.stop() + it.filters[0] = NullFilter + it.filters[1] = NullFilter + } + despawnHook(this) } } @@ -108,6 +123,7 @@ abstract class Actor : Comparable, Runnable { // @Transient val soundTracks = HashMap() @Transient val musicTracks = HashMap() + @Transient private val musicTracks1 = ArrayList() /*open fun startAudio(sound: Sound) { getTrackByAudio(sound)?.let { @@ -117,7 +133,7 @@ abstract class Actor : Comparable, Runnable { } }*/ - private fun getTrackByAudio(music: MusicContainer): TerrarumAudioMixerTrack? { + fun getTrackByAudio(music: MusicContainer): TerrarumAudioMixerTrack? { // get existing track var track = musicTracks[music] @@ -130,6 +146,7 @@ abstract class Actor : Comparable, Runnable { // if the request was successful, put it into the hashmap if (track != null) { musicTracks[music] = track + musicTracks1.add(track.name) } } @@ -138,6 +155,9 @@ abstract class Actor : Comparable, Runnable { return track } + /** + * To loop the audio, set `music.gdxMusic.isLooping` to `true` + */ open fun startAudio(music: MusicContainer, volume: TrackVolume = 1.0, doSomethingWithTrack: (TerrarumAudioMixerTrack) -> Unit = {}) { getTrackByAudio(music)?.let { it.stop() diff --git a/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt b/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt index 4c6e9ba86..3edfcd985 100644 --- a/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt +++ b/src/net/torvald/terrarum/gameactors/ActorMovingPlatform.kt @@ -19,6 +19,9 @@ open class ActorMovingPlatform() : ActorWithBody() { setHitboxDimension(TILE_SIZE * tilewiseWidth, TILE_SIZE, 0, 0) } + override fun updateImpl(delta: Float) { + TODO("Not yet implemented") + } /** * Make the actor its externalV controlled by this platform diff --git a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt index 91aecd9f0..417861a4b 100644 --- a/src/net/torvald/terrarum/gameactors/ActorWithBody.kt +++ b/src/net/torvald/terrarum/gameactors/ActorWithBody.kt @@ -517,9 +517,7 @@ open class ActorWithBody : Actor { feetPosTile.set(hIntTilewiseHitbox.centeredX.floorToInt(), hIntTilewiseHitbox.endY.floorToInt()) } - override fun update(delta: Float) { - super.update(delta) - + override fun updateImpl(delta: Float) { // re-scale hitbox // it's just much better to poll them than use perfectly-timed setter because latter simply cannot exist hitbox.canonicalResize(baseHitboxW * scale, baseHitboxH * scale) diff --git a/src/net/torvald/terrarum/gameactors/BlockMarkerActor.kt b/src/net/torvald/terrarum/gameactors/BlockMarkerActor.kt index 0d2879c58..80e9a5327 100644 --- a/src/net/torvald/terrarum/gameactors/BlockMarkerActor.kt +++ b/src/net/torvald/terrarum/gameactors/BlockMarkerActor.kt @@ -93,7 +93,7 @@ class BlockMarkerActor : ActorWithBody(Actor.RenderOrder.OVERLAY, physProp = Phy override fun dispose() { } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { if (isVisible) { val hbx = (Terrarum.mouseTileX - floor((hitbox.width - 0.5).div(2) / TILE_SIZED)) * TILE_SIZED val hby = (Terrarum.mouseTileY - floor((hitbox.height - 0.5) / TILE_SIZED)) * TILE_SIZED diff --git a/src/net/torvald/terrarum/gameactors/WireActor.kt b/src/net/torvald/terrarum/gameactors/WireActor.kt index 5ab83b46a..884b58ca0 100644 --- a/src/net/torvald/terrarum/gameactors/WireActor.kt +++ b/src/net/torvald/terrarum/gameactors/WireActor.kt @@ -69,7 +69,7 @@ class WireActor : ActorWithBody, NoSerialise { ) } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { } override fun drawBody(frameDelta: Float, batch: SpriteBatch) { diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index d451c4f24..85b123634 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -125,7 +125,7 @@ class BuildingMaker(batch: FlippingSpriteBatch) : IngameInstance(batch) { override fun dispose() { } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { hitbox.setPosition( Terrarum.mouseTileX * 16.0, Terrarum.mouseTileY * 16.0 @@ -187,7 +187,7 @@ class BuildingMaker(batch: FlippingSpriteBatch) : IngameInstance(batch) { override fun drawGlow(frameDelta: Float, batch: SpriteBatch) { } - override fun update(delta: Float) { } + override fun updateImpl(delta: Float) { } override fun onActorValueChange(key: String, value: Any?) { } @@ -688,9 +688,7 @@ class MovableWorldCamera(val parent: BuildingMaker) : ActorHumanoid(0, physProp parent.world.height * TILE_SIZE - (App.scr.height - hitbox.height) / 2.0 ) - override fun update(delta: Float) { - super.update(delta) - + override fun updateImpl(delta: Float) { // confine the camera so it won't wrap this.hitbox.hitboxStart.setCoerceIn(coerceInStart, coerceInEnd) } diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index 63dc04283..d3c6aafd7 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -606,7 +606,7 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { override fun drawBody(frameDelta: Float, batch: SpriteBatch) { } override fun drawGlow(frameDelta: Float, batch: SpriteBatch) { } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { ai.update(this, delta) } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt index 9fe79e85a..c0b8c1a2d 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt @@ -201,13 +201,13 @@ open class ActorHumanoid : ActorWithBody, Controllable, Pocketed, Factionable, L } } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { // update lightbox lightBoxList[0].light = actorValueColour shadeBoxList[0].light = actorValueShade - super.update(delta) + super.updateImpl(delta) if (vehicleRiding is IngamePlayer) throw Error("Attempted to 'ride' player object. ($vehicleRiding)") diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt index c0e8320d3..98df53ce7 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/Cultivable.kt @@ -67,8 +67,8 @@ open class SaplingBase(val species: Int) : Cultivable(72000) { } } - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) // these have to run every frame to make the sprite static (sprite as SheetSpriteAnimation).currentRow = species diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt index e3cb09f49..6c79d4792 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/DroppedItem.kt @@ -140,15 +140,13 @@ open class DroppedItem : ActorWithBody { } } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { renderOrder = RenderOrder.OVERLAY // for some reason the "overlaying" won't work without this if (this.itemID.isBlock() || this.itemID.isItem()) { this.lightBoxList[0].light = getLum(this.itemID) } - super.update(delta) - timeSinceSpawned += delta // merge into the already existing droppeditem with isStationary==true if one is detected diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt index a1369d71a..5c38bd691 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt @@ -116,8 +116,8 @@ open class Electric : FixtureBase { } } - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) oldSinkStatus.indices.forEach { index -> val wx = (index % blockBox.width) + intTilewiseHitbox.startX.toInt() val wy = (index / blockBox.width) + intTilewiseHitbox.startY.toInt() @@ -478,7 +478,8 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { wireConsumption.clear() } - despawnHook(this) + + super.despawn() } else { printdbg(this, "failed to despawn at T${INGAME.WORLD_UPDATE_TIMER}: ${nameFun()}") @@ -494,8 +495,8 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { /** * This function MUST BE super-called for make despawn call to work at all. */ - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) } /** @@ -511,7 +512,7 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { despawned = true } // actual actor removal is performed by the TerrarumIngame.killOrKnockdownActors - super.update(delta) + super.updateImpl(delta) } override fun flagDespawn() { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt index 9d6779e28..e793e1037 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt @@ -1,8 +1,13 @@ package net.torvald.terrarum.modulebasegame.gameactors +import com.badlogic.gdx.Gdx 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.decibelsToFullscale +import net.torvald.terrarum.audio.dsp.Gain +import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.Hitbox @@ -47,8 +52,20 @@ class FixtureFurnaceAndAnvil : FixtureBase, CraftingStation { } actorValue[AVKey.BASEMASS] = 100.0 + + despawnHook = { + stopAudio(static) { + it.filters[filterIndex] = NullFilter + } + } } + @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 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))) @Transient private val actorBlocks = arrayOf( @@ -68,9 +85,8 @@ class FixtureFurnaceAndAnvil : FixtureBase, CraftingStation { private var nextDelay = 0.25f private var spawnTimer = 0f - override fun update(delta: Float) { - super.update(delta) - + override fun updateImpl(delta: Float) { + super.updateImpl(delta) // emit smokes TODO: only when hot if (spawnTimer >= nextDelay) { @@ -88,5 +104,28 @@ class FixtureFurnaceAndAnvil : FixtureBase, CraftingStation { } spawnTimer += delta + + + // manage audio + getTrackByAudio(static).let { + if (it != null && !it.isPlaying) { + startAudio(static) { + it.filters[filterIndex] = Gain(0f) + } + } + } + getTrackByAudio(static)?.let { + if (it.filters[filterIndex] !is Gain) // just in case... + it.filters[filterIndex] = Gain(0f) + + (it.filters[filterIndex] as Gain).gain = 0.4f // TODO randomsied undulation + } + } + + @Transient private val filterIndex = 0 + + override fun dispose() { + super.dispose() + static.dispose() } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt index 718fed80c..96837cc24 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt @@ -103,8 +103,8 @@ class FixtureJukebox : Electric, PlaysMusic { override val canBeDespawned: Boolean get() = discInventory.isEmpty() - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) // supress the normal background music playback if (musicIsPlaying && !flagDespawn) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt index b520aea25..0b62da305 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureMusicalTurntable.kt @@ -70,8 +70,8 @@ class FixtureMusicalTurntable : Electric, PlaysMusic { override val canBeDespawned: Boolean get() = disc == null - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) // right click if (mouseUp) { diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt index 2d493eef8..b6f1acbb1 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSmelterBasic.kt @@ -1,5 +1,6 @@ package net.torvald.terrarum.modulebasegame.gameactors +import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch @@ -9,6 +10,9 @@ import net.torvald.spriteanimation.SheetSpriteAnimation import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZED +import net.torvald.terrarum.audio.MusicContainer +import net.torvald.terrarum.audio.dsp.Gain +import net.torvald.terrarum.audio.dsp.NullFilter import net.torvald.terrarum.blockproperties.Block import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameactors.Hitbox @@ -77,6 +81,12 @@ 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 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))) @@ -190,8 +200,8 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { } } - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) val oreItemProp = ItemCodex[oreItem?.itm] val fuelItemProp = ItemCodex[fireboxItem?.itm] @@ -277,6 +287,35 @@ class FixtureSmelterBasic : FixtureBase, CraftingStation { spawnTimer += delta else spawnTimer = 0f + + + + // manage audio + getTrackByAudio(static).let { + if (it == null || (temperature > 0f && !it.isPlaying)) { + startAudio(static) { + it.filters[filterIndex] = Gain(0f) + } + } + else if (it != null && it.isPlaying && temperature <= 0f) { + stopAudio(static) { + it.filters[filterIndex] = NullFilter + } + } + } + getTrackByAudio(static)?.let { + if (it.filters[filterIndex] !is Gain) // just in case... + it.filters[filterIndex] = Gain(0f) + + (it.filters[filterIndex] as Gain).gain = (it.maxVolume * temperature).toFloat() // TODO randomsied undulation + } + } + @Transient private val filterIndex = 0 + + override fun dispose() { + super.dispose() + static.dispose() + } } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt index 2ce73fa12..124efc1bc 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureSwingingDoorBase.kt @@ -366,9 +366,8 @@ open class FixtureSwingingDoorBase : FixtureBase { private var lastDoorHandler = 0 // 0: automatic, 1: manual private var doorCloseQueueHandler = 0 - override fun update(delta: Float) { - super.update(delta) - + override fun updateImpl(delta: Float) { + super.updateImpl(delta) // debug colouring // this.sprite?.colourFilter = diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt index 81eed5669..8c648c5e5 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTikiTorch.kt @@ -51,10 +51,10 @@ internal class FixtureTikiTorch : FixtureBase { private var nextDelay = 0.25f private var spawnTimer = 0f - override fun update(delta: Float) { - lightBoxList[0].light = BlockCodex[Block.TORCH].getLumCol(rndHash1, rndHash2) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) - super.update(delta) + lightBoxList[0].light = BlockCodex[Block.TORCH].getLumCol(rndHash1, rndHash2) if (spawnTimer >= nextDelay) { (Terrarum.ingame as TerrarumIngame).addParticle(ParticleVanishingSprite( diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTypewriter.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTypewriter.kt index 4405e1ba6..df0b0b18a 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTypewriter.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureTypewriter.kt @@ -38,8 +38,8 @@ class FixtureTypewriter : FixtureBase { actorValue[AVKey.BASEMASS] = 3.6 } - override fun update(delta: Float) { - super.update(delta) + override fun updateImpl(delta: Float) { + super.updateImpl(delta) (sprite as SheetSpriteAnimation).currentRow = 1 + (carriagePosition.toFloat() / TYPEWRITER_COLUMNS * 10).roundToInt() } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt index 5f2d5c01c..334e6a213 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/HumanoidNPC.kt @@ -84,9 +84,9 @@ open class HumanoidNPC : ActorHumanoid, AIControlled, CanBeAnItem { isVisible = true } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { + super.updateImpl(delta) ai.update(this, delta) - super.update(delta) } override fun moveLeft(amount: Float) { // hit the buttons on the controller box diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt index f63197ddb..bff181939 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/PhysTestLuarLander.kt @@ -29,9 +29,7 @@ class PhysTestLuarLander : ActorWithBody(RenderOrder.MIDTOP, PhysProperties.PHYS super.run() } - override fun update(delta: Float) { - super.update(delta) - + override fun updateImpl(delta: Float) { if (Gdx.input.isKeyPressed(Input.Keys.UP)) { controllerV!!.y = avSpeedCap } diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt index cf8b31072..eea0b2e2e 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ProjectileSimple.kt @@ -75,7 +75,7 @@ open class ProjectileSimple : ActorWithBody, Projectile { collisionType = COLLISION_KINEMATIC } - override fun update(delta: Float) { + override fun updateImpl(delta: Float) { // hit something and despawn lifetimeCounter += delta if (walledTop || walledBottom || walledRight || walledLeft || lifetimeCounter >= lifetimeMax || @@ -86,8 +86,6 @@ open class ProjectileSimple : ActorWithBody, Projectile { } posPre.set(centrePosPoint) - - super.update(delta) } /** diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 4f7507ef1..ec4e0f454 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -546,13 +546,15 @@ class BasicDebugInfoWindow : UICanvas() { // Toolkit.fillArea(batch, x - stripGap, y - stripGap, strips.size * (stripW + stripGap) + stripGap, stripH + 2*stripGap) strips.forEachIndexed { index, track -> - // get clipping status - track.processor.hasClipping.forEachIndexed { channel, b -> - if (b) mixerLastTimeHadClipping[index][channel] = System.currentTimeMillis() - } + if (index < trackCount) { + // get clipping status + track.processor.hasClipping.forEachIndexed { channel, b -> + if (b) mixerLastTimeHadClipping[index][channel] = System.currentTimeMillis() + } - // draw - drawStrip(batch, x + index * (STRIP_W + stripGap), y, track, index) + // draw + drawStrip(batch, x + index * (STRIP_W + stripGap), y, track, index) + } } }