From fd30223df8bba401464e33eb1f2391fcc4d4bf6b Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 11 Jan 2024 02:23:20 +0900 Subject: [PATCH] jukebox wip --- assets/mods/basegame/items/itemid.csv | 1 + .../basegame/sprites/fixtures/jukebox.tga | 3 + src/net/torvald/terrarum/audio/AudioMixer.kt | 2 +- .../terrarum/audio/MixerTrackProcessor.kt | 2 +- .../modulebasegame/gameactors/FixtureBase.kt | 4 + .../gameactors/FixtureJukebox.kt | 92 +++++++++++++++++++ .../modulebasegame/gameitems/ItemJukebox.kt | 21 +++++ .../terrarum/ui/BasicDebugInfoWindow.kt | 2 +- .../graphics/sprites/fixtures/jukebox.kra | 3 + 9 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 assets/mods/basegame/sprites/fixtures/jukebox.tga create mode 100644 src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt create mode 100644 src/net/torvald/terrarum/modulebasegame/gameitems/ItemJukebox.kt create mode 100644 work_files/graphics/sprites/fixtures/jukebox.kra diff --git a/assets/mods/basegame/items/itemid.csv b/assets/mods/basegame/items/itemid.csv index 0bf0356bb..d5c702d19 100644 --- a/assets/mods/basegame/items/itemid.csv +++ b/assets/mods/basegame/items/itemid.csv @@ -26,6 +26,7 @@ id;classname 25;net.torvald.terrarum.modulebasegame.gameitems.ItemClayBall 26;net.torvald.terrarum.modulebasegame.gameitems.IngotSteel 27;net.torvald.terrarum.modulebasegame.gameitems.ItemFurnaceAndAnvil +28;net.torvald.terrarum.modulebasegame.gameitems.ItemJukebox # ingots 112;net.torvald.terrarum.modulebasegame.gameitems.IngotCopper diff --git a/assets/mods/basegame/sprites/fixtures/jukebox.tga b/assets/mods/basegame/sprites/fixtures/jukebox.tga new file mode 100644 index 000000000..b5d8d7d42 --- /dev/null +++ b/assets/mods/basegame/sprites/fixtures/jukebox.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fb0b094064d191e81367acbb8266ddcf89b8aefca82a78015ee63d4ec4931aa +size 6162 diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 13ffa614d..7c47ddda5 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -411,7 +411,7 @@ object AudioMixer: Disposable { requestFadeOut(ambientTrack, DEFAULT_FADEOUT_LEN * 4) } - fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { + fun requestFadeOut(track: TerrarumAudioMixerTrack, length: Double = DEFAULT_FADEOUT_LEN, target: Double = 0.0, source: Double? = null, jobAfterFadeout: () -> Unit = {}) { val req = fadeReqs[track]!! if (!req.fadeoutFired) { req.fadeLength = length.coerceAtLeast(1.0/1024.0) diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index 806add743..e4a172016 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -37,7 +37,7 @@ class MixerTrackProcessor(val buffertaille: Int, val rate: Int, val track: Terra private var breakBomb = false - private val distFalloff = 2048.0 + private val distFalloff = 1024.0 private fun printdbg(msg: Any) { if (true) App.printdbg("AudioAdapter ${track.name}", msg) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt index 59a5af08b..429c6e694 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureBase.kt @@ -381,6 +381,8 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { /** force disable despawn when inventory is not empty */ val canBeDespawned: Boolean get() = inventory?.isEmpty() ?: true + @Transient open var despawnHook: (FixtureBase) -> Unit = {} + /** * Removes this instance of the fixture from the world */ @@ -405,6 +407,8 @@ open class FixtureBase : ActorWithBody, CuedByTerrainChange { wireEmission.clear() wireConsumption.clear() } + + despawnHook(this) } else { printdbg(this, "failed to despawn at T${INGAME.WORLD_UPDATE_TIMER}: ${nameFun()}") diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt new file mode 100644 index 000000000..97e26852b --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureJukebox.kt @@ -0,0 +1,92 @@ +package net.torvald.terrarum.modulebasegame.gameactors + +import com.badlogic.gdx.Gdx +import net.torvald.terrarum.INGAME +import net.torvald.terrarum.ModMgr +import net.torvald.terrarum.TerrarumAppConfiguration.TILE_SIZE +import net.torvald.terrarum.audio.AudioMixer +import net.torvald.terrarum.audio.AudioMixer.DEFAULT_FADEOUT_LEN +import net.torvald.terrarum.gameactors.AVKey +import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.modulebasegame.MusicContainer +import net.torvald.terrarum.modulebasegame.TerrarumMusicGovernor +import net.torvald.terrarum.modulebasegame.gameitems.FixtureItemBase +import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack +import org.dyn4j.geometry.Vector2 + +/** + * Created by minjaesong on 2024-01-11. + */ +class FixtureJukebox : Electric { + + constructor() : super( + BlockBox(BlockBox.NO_COLLISION, 2, 3), + nameFun = { Lang["ITEM_LOGIC_SIGNAL_EMITTER"] } + ) + + @Transient private var discCurrentlyPlaying: Int? = null + + @Transient private val testMusic = ModMgr.getGdxFile("basegame", "audio/music/discs/01 Thousands of Shards.ogg").let { + MusicContainer("Thousands of Shards", it.file(), Gdx.audio.newMusic(it)) { + discCurrentlyPlaying = null + (INGAME.musicGovernor as TerrarumMusicGovernor).stopMusic(pauseLen = Math.random().toFloat() * 30f + 30f) + } + } + + init { + val itemImage = FixtureItemBase.getItemImageFromSingleImage("basegame", "sprites/fixtures/jukebox.tga") + + density = 1400.0 + setHitboxDimension(TILE_SIZE * 2, TILE_SIZE * 3, 0, 0) + + makeNewSprite(TextureRegionPack(itemImage.texture, TILE_SIZE * 2, TILE_SIZE * 3)).let { + it.setRowsAndFrames(1,1) + } + + actorValue[AVKey.BASEMASS] = 200.0 + + setWireSinkAt(0, 2, "appliance_power") + setWireConsumptionAt(0, 2, Vector2(350.0, 0.0)) + } + + private var waitAkku = 0f + + override fun update(delta: Float) { + super.update(delta) + + if (discCurrentlyPlaying == null) { + // wait 3 seconds + if (waitAkku >= 3f) { + discCurrentlyPlaying = 0 + playDisc(discCurrentlyPlaying!!) + waitAkku = 0f + } + + waitAkku += delta + } + else if (!flagDespawn) { + (INGAME.musicGovernor as TerrarumMusicGovernor).stopMusic() + } + } + + private fun playDisc(index: Int) { + AudioMixer.requestFadeOut(AudioMixer.musicTrack, DEFAULT_FADEOUT_LEN / 2f) { + startAudio(testMusic) + } + } + + @Transient override var despawnHook: (FixtureBase) -> Unit = { + (INGAME.musicGovernor as TerrarumMusicGovernor).stopMusic(pauseLen = Math.random().toFloat() * 30f + 30f) + } + + override fun reload() { + super.reload() + // cannot resume playback, just stop the music + discCurrentlyPlaying = null + } + + override fun dispose() { + super.dispose() +// testMusic.gdxMusic.dispose() + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/ItemJukebox.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemJukebox.kt new file mode 100644 index 000000000..ffc14f72f --- /dev/null +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/ItemJukebox.kt @@ -0,0 +1,21 @@ +package net.torvald.terrarum.modulebasegame.gameitems + +import com.badlogic.gdx.graphics.g2d.TextureRegion +import net.torvald.terrarum.gameitems.ItemID + +/** + * Created by minjaesong on 2024-01-11. + */ +class ItemJukebox(originalID: ItemID) : FixtureItemBase(originalID, "net.torvald.terrarum.modulebasegame.gameactors.FixtureJukebox") { + + + override var baseMass = 200.0 + override val isDynamic = false + override val materialId = "" + override val itemImage: TextureRegion + get() = getItemImageFromSingleImage("basegame", "sprites/fixtures/jukebox.tga") + + override var baseToolSize: Double? = baseMass + override var originalName = "ITEM_JUKEBOX" + +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index f0518b072..f588d0c03 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -496,7 +496,7 @@ class BasicDebugInfoWindow : UICanvas() { batch.color = COL_METER_TROUGH val intensity = fullscaleToDecibels(fs.coerceAtMost(1.0)).plus(dbLow).div(dbLow).coerceIn(0.0, 1.0).toFloat() Toolkit.fillArea(batch, x, y + 2, miniW, 8) - batch.color = if (fs > 1.0) LAMP_OVERRANGE else Color(0.1f, intensity, 0.1f, 0.666f) + batch.color = if (fs > 1.0) LAMP_OVERRANGE else Color(0.1f, intensity, 0.1f, 1f) Toolkit.fillArea(batch, x + 2 + 13*ch, y + 4, 11, 4) oldPeakDS[index][ch] = fs diff --git a/work_files/graphics/sprites/fixtures/jukebox.kra b/work_files/graphics/sprites/fixtures/jukebox.kra new file mode 100644 index 000000000..87e97dab0 --- /dev/null +++ b/work_files/graphics/sprites/fixtures/jukebox.kra @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f06ac3748965d910f846f83b9e7b1ec003c8ab20a47b445aac3aa9e39dbcb344 +size 250290