From 244d935367d88b64d702a73757bd4010c3ba6225 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Thu, 4 Jan 2024 17:28:30 +0900 Subject: [PATCH] musicplayer: click on the song title to change the music --- .../terrarum/musicplayer/gui/MusicPlayer.kt | 47 ++++++++++++++----- assets/mods/musicplayer/configplan.csv | 3 +- assets/mods/musicplayer/default.json | 3 +- .../musicplayer/locales/en/musicplayer.json | 3 +- .../modulebasegame/TerrarumMusicGovernor.kt | 16 ++++++- 5 files changed, 55 insertions(+), 17 deletions(-) diff --git a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt index 4fcc87f2a..c3584185d 100644 --- a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt +++ b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayer.kt @@ -1,6 +1,5 @@ package net.torvald.terrarum.musicplayer.gui -import com.badlogic.gdx.Gdx import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.Pixmap @@ -11,7 +10,6 @@ import com.badlogic.gdx.utils.JsonValue import com.jme3.math.FastMath import net.torvald.reflection.extortField import net.torvald.terrarum.* -import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.audio.* import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.MusicContainer @@ -28,6 +26,8 @@ import java.util.BitSet import kotlin.math.* /** + * When the current music is controlled by the ingame (e.g. Jukebox) the MusicPlayer gets disabled. + * * Created by minjaesong on 2023-12-23. */ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { @@ -92,13 +92,13 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { private var currentlySelectedAlbum: AlbumProp? = null /** Returns the internal playlist of the MusicGovernor */ - private val playlist: List + private val songsInGovernor: List get() = ingame.musicGovernor.extortField>("songs")!! /** Returns the playlist name from the MusicGovernor. Getting the value from the MusicGovernor * is recommended as an ingame interaction may cancel the playback from the playlist from the MusicPlayer * (e.g. interacting with a jukebox) */ - private val playlistName: String + private val internalPlaylistName: String get() = ingame.musicGovernor.playlistName fun registerPlaylist(path: String, fileToName: JsonValue?, shuffled: Boolean, diskJockeyingMode: String) { @@ -145,7 +145,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { } } - setPlaylistDisplayVars(playlist) + setPlaylistDisplayVars(songsInGovernor) } private var currentMusicName = "" @@ -311,7 +311,9 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { // prev song if (mode < MODE_SHOW_LIST) { getPrevSongFromPlaylist()?.let { ingame.musicGovernor.unshiftPlaylist(it) } - AudioMixer.requestFadeOut(AudioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) + AudioMixer.requestFadeOut(AudioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) { + ingame.musicGovernor.startMusic() // required for "intermittent" mode + } } // prev page in the list else { @@ -337,7 +339,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { // next song if (mode < MODE_SHOW_LIST) { AudioMixer.requestFadeOut(AudioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) { -// ingame.musicGovernor.startMusic() // it works without this? + ingame.musicGovernor.startMusic() // required for "intermittent" mode, does seemingly nothing on "continuous" mode } } // next page in the list @@ -352,7 +354,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { transitionRequest = MODE_SHOW_LIST currentListMode = 1 // reset list scroll - val currentlyPlaying = playlist.indexOf(AudioMixer.musicTrack.currentTrack) + val currentlyPlaying = songsInGovernor.indexOf(AudioMixer.musicTrack.currentTrack) if (currentlyPlaying >= 0) { playlistScroll = (currentlyPlaying / PLAYLIST_LINES) * PLAYLIST_LINES } @@ -372,6 +374,25 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { } } } + // make playlist clicking work + else if (!playControlButtonLatched && mouseOnList != null && Terrarum.mouseDown) { + playControlButtonLatched = true + val index = playlistScroll + mouseOnList!! + val list = songsInGovernor + if (index < list.size) { + // if selected song != currently playing + if (AudioMixer.musicTrack.currentTrack == null || list[index] != AudioMixer.musicTrack.currentTrack) { + // rebuild playlist + ingame.musicGovernor.queueIndexFromPlaylist(index) + + // fade out + AudioMixer.requestFadeOut(AudioMixer.musicTrack, AudioMixer.DEFAULT_FADEOUT_LEN / 3f) { + ingame.musicGovernor.startMusic() // required for "intermittent" mode + } + } + } + } + // unlatch the click latch else if (!Terrarum.mouseDown) { playControlButtonLatched = false } @@ -383,7 +404,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { private var playControlButtonLatched = false private fun getPrevSongFromPlaylist(): MusicContainer? { - val list = playlist.slice(playlist.indices) // make copy of the list + val list = songsInGovernor.slice(songsInGovernor.indices) // make copy of the list val nowPlaying = AudioMixer.musicTrack.currentTrack ?: return null // find current index @@ -653,7 +674,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { blendNormalStraightAlpha(batch) // draw text - App.fontGameFBO.draw(batch, if (pnum in playlist.indices) playlist[pnum].name else "", maskOffWidth - playlistNameScrolls[pnum], (PLAYLIST_LINE_HEIGHT - 24) / 2) + App.fontGameFBO.draw(batch, if (pnum in songsInGovernor.indices) songsInGovernor[pnum].name else "", maskOffWidth - playlistNameScrolls[pnum], (PLAYLIST_LINE_HEIGHT - 24) / 2) // mask off the area batch.color = Color.WHITE @@ -675,7 +696,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { val alpha2 = alpha + (playListAnimAkku[i] * 0.2f) val pnum = i + playlistScroll - val m1 = playlist.getOrNull(pnum) + val m1 = songsInGovernor.getOrNull(pnum) val m2 = AudioMixer.musicTrack.currentTrack val currentlyPlaying = if (m1 == null || m2 == null) false else (m1 == m2) @@ -694,7 +715,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { batch.color = Color(1f, 1f, 1f, alpha * 0.75f) App.fontSmallNumbers.draw( batch, - if (pnum in playlist.indices) "${pnum + 1}" else "", + if (pnum in songsInGovernor.indices) "${pnum + 1}" else "", x + xoff, y + yoff + PLAYLIST_LINE_HEIGHT * i * scale ) @@ -711,7 +732,7 @@ class MusicPlayer(private val ingame: TerrarumIngame) : UICanvas() { // print the album name batch.color = Color(1f, 1f, 1f, alpha * 0.75f) - Toolkit.drawTextCentered(batch, App.fontGame, playlistName, width, x.roundToInt(), 3 + (y + PLAYLIST_LINE_HEIGHT * PLAYLIST_LINES * scale).roundToInt()) + Toolkit.drawTextCentered(batch, App.fontGame, internalPlaylistName, width, x.roundToInt(), 3 + (y + PLAYLIST_LINE_HEIGHT * PLAYLIST_LINES * scale).roundToInt()) } } diff --git a/assets/mods/musicplayer/configplan.csv b/assets/mods/musicplayer/configplan.csv index 9911ae55b..64f72f9d1 100644 --- a/assets/mods/musicplayer/configplan.csv +++ b/assets/mods/musicplayer/configplan.csv @@ -1 +1,2 @@ -usemusicplayer->Lang:MENU_OPTIONS_USE_MUSIC_PLAYER->toggle \ No newline at end of file +usemusicplayer->Lang:MENU_OPTIONS_USE_MUSIC_PLAYER->toggle +playlistlines->Lang:MENU_OPTIONS_MUSIC_PLAYLIST_LINES->spinner,4,16,1 \ No newline at end of file diff --git a/assets/mods/musicplayer/default.json b/assets/mods/musicplayer/default.json index 080c63222..25b218a90 100644 --- a/assets/mods/musicplayer/default.json +++ b/assets/mods/musicplayer/default.json @@ -1,3 +1,4 @@ { - "usemusicplayer": true + "usemusicplayer": true, + "playlistlines": 8 } \ No newline at end of file diff --git a/assets/mods/musicplayer/locales/en/musicplayer.json b/assets/mods/musicplayer/locales/en/musicplayer.json index 5c96f2c00..9c4d1de9e 100644 --- a/assets/mods/musicplayer/locales/en/musicplayer.json +++ b/assets/mods/musicplayer/locales/en/musicplayer.json @@ -1,3 +1,4 @@ { - "MENU_OPTIONS_USE_MUSIC_PLAYER": "Use Music Player" + "MENU_OPTIONS_USE_MUSIC_PLAYER": "Use Music Player", + "MENU_OPTIONS_MUSIC_PLAYLIST_LINES": "Playlist Height (lines)" } \ No newline at end of file diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt index 782d31ae3..a45e1c235 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumMusicGovernor.kt @@ -225,9 +225,23 @@ class TerrarumMusicGovernor : MusicGovernor() { */ fun unshiftPlaylist(music: MusicContainer) { val indexAtMusicBin = songs.indexOf(music) - if (indexAtMusicBin < 0) throw IllegalArgumentException("The music does not exist on the interal songs list ($music)") + if (indexAtMusicBin < 0) throw IllegalArgumentException("The music does not exist on the internal songs list ($music)") // rewrite musicBin + // TODO take shuffing into account + val newMusicBin = Array(songs.size - indexAtMusicBin) { offset -> + val k = offset + indexAtMusicBin + songs[k] + } + + musicBin = ArrayList(newMusicBin.toList()) + } + + fun queueIndexFromPlaylist(indexAtMusicBin: Int) { + if (indexAtMusicBin !in songs.indices) throw IndexOutOfBoundsException("The index is outside of the internal songs list ($indexAtMusicBin/${songs.size})") + + // rewrite musicBin + // TODO take shuffing into account val newMusicBin = Array(songs.size - indexAtMusicBin) { offset -> val k = offset + indexAtMusicBin songs[k]