From ccd36ffdbd44b5db5bb4590149a81fe50190ef66 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Wed, 3 Jan 2024 15:46:52 +0900 Subject: [PATCH] fix: non-pausing UIs AND the ingame control are both getting input processed --- COPYING.md | 2 +- assets/mods/musicplayer/writing_playlist.md | 12 ++++------ src/net/torvald/terrarum/IngameInstance.kt | 2 ++ src/net/torvald/terrarum/Terrarum.kt | 22 +++++++++++++++++++ .../torvald/terrarum/TerrarumPostProcessor.kt | 9 +++++++- src/net/torvald/terrarum/UIFakeGradOverlay.kt | 3 +++ .../gamecontroller/IngameController.kt | 6 ++--- .../terrarum/modulebasegame/BuildingMaker.kt | 2 -- .../terrarum/modulebasegame/TerrarumIngame.kt | 1 - .../terrarum/modulebasegame/TitleScreen.kt | 1 - .../modulebasegame/ui/UIQuickslotBar.kt | 2 ++ .../modulebasegame/ui/UIQuickslotPie.kt | 2 ++ .../modulebasegame/ui/UIScreenZoom.kt | 2 ++ .../terrarum/modulebasegame/ui/UITooltip.kt | 2 ++ .../modulebasegame/ui/UIWatchLargeAnalogue.kt | 2 ++ .../modulebasegame/ui/UIWatchLargeDigital.kt | 2 ++ .../torvald/terrarum/ui/UIAutosaveNotifier.kt | 1 + src/net/torvald/terrarum/ui/UICanvas.kt | 7 ++++++ 18 files changed, 63 insertions(+), 17 deletions(-) diff --git a/COPYING.md b/COPYING.md index c190b5bbd..2a78a973b 100644 --- a/COPYING.md +++ b/COPYING.md @@ -1,4 +1,4 @@ -Copyright (C) 2013-2023 Minjae Song ("CuriousTorvald") +Copyright (C) 2013-2024 Minjae Song ("CuriousTorvald") This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/assets/mods/musicplayer/writing_playlist.md b/assets/mods/musicplayer/writing_playlist.md index faa6d9ffc..5208f0473 100644 --- a/assets/mods/musicplayer/writing_playlist.md +++ b/assets/mods/musicplayer/writing_playlist.md @@ -1,12 +1,13 @@ The playlists (or albums) are stored under (userdata)/Custom/Music/(album name) -The name of the directory is used as the album title, and the lexicographic sorting of the files is used -as the playing order, so it is advised to name your files as 01.ogg, 02.ogg, 03.ogg, etc. +The lexicographic sorting of the files is used as the playing order, so it is advised to name your +files as 01.ogg, 02.ogg, 03.ogg, etc. To actually give titles to the files, you must write `playlist.json` with following format: ```json { + "albumName": "Totally Awesome Playlist 2024", "diskJockeyingMode": "continuous", /* "continuous" allows the Gapless Playback, "intermittent" will put random length of pause (in a range of 30 to 60 seconds) between tracks */ "shuffled": false, /* self-explanatory, often used with "diskJockeyingMode": "intermittent" */ "titles": { @@ -19,9 +20,4 @@ To actually give titles to the files, you must write `playlist.json` with follow } ``` - -### Limitations - -On certain filesystem and platform combination, you cannot use non-ASCII character on the album title -due to an incompatibility with the Java's File implementation. Song titles on `playlist.json` has no -such limitation. \ No newline at end of file +- `albumName` may be omitted, in which the name of the directory will be substituted as the album title. \ No newline at end of file diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index f6ed1f8bd..fb9edbdde 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -88,6 +88,8 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo val deltaTeeBenchmarks = CircularArray(App.getConfigInt("debug_deltat_benchmark_sample_sizes"), true) + val uiContainer = UIContainer() + init { consoleHandler.setPosition(0, 0) notifier.setPosition( diff --git a/src/net/torvald/terrarum/Terrarum.kt b/src/net/torvald/terrarum/Terrarum.kt index 9fad0322a..bd553f9e5 100644 --- a/src/net/torvald/terrarum/Terrarum.kt +++ b/src/net/torvald/terrarum/Terrarum.kt @@ -32,6 +32,7 @@ import net.torvald.terrarum.itemproperties.MaterialCodex import net.torvald.terrarum.savegame.DiskSkimmer import net.torvald.terrarum.serialise.Common import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable import net.torvald.terrarum.worlddrawer.WorldCamera import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap import net.torvald.unsafe.UnsafeHelper @@ -40,6 +41,7 @@ import org.dyn4j.geometry.Vector2 import java.io.File import java.io.PrintStream import kotlin.math.* +import kotlin.reflect.full.findAnnotation typealias RGBA8888 = Int @@ -750,6 +752,26 @@ class UIContainer { fun map(transformation: (UICanvas?) -> T) = iterator().asSequence().map(transformation) fun filter(predicate: (Any) -> Boolean) = data.filter(predicate) + + fun filterNotNull(): List = data.filter { + if (it is UICanvas) true + else if (it is Id_UICanvasNullable) it.get() != null + else false + }.map { + if (it is UICanvas) it + else if (it is Id_UICanvasNullable) it.get()!! + else throw InternalError() + } + + val UIsUnderMouse: List + get() = filterNotNull().filter { it.isVisible && it.mouseUp && it::class.findAnnotation() == null } + + val hasNoUIsUnderMouse: Boolean + get() = UIsUnderMouse.isEmpty() + + val hasUIunderMouse: Boolean + get() = UIsUnderMouse.isNotEmpty() + } interface Id_UICanvasNullable { diff --git a/src/net/torvald/terrarum/TerrarumPostProcessor.kt b/src/net/torvald/terrarum/TerrarumPostProcessor.kt index 3b80f15e7..f62bbeb47 100644 --- a/src/net/torvald/terrarum/TerrarumPostProcessor.kt +++ b/src/net/torvald/terrarum/TerrarumPostProcessor.kt @@ -144,7 +144,14 @@ object TerrarumPostProcessor : Disposable { if (KeyToggler.isOn(Input.Keys.F10)) { batch.color = Color.WHITE batch.inUse { - App.fontSmallNumbers.draw(it, "Wire draw class: ${(Terrarum.ingame as? net.torvald.terrarum.modulebasegame.TerrarumIngame)?.selectedWireRenderClass}", 2f, 2f) + // print wire draw class + App.fontSmallNumbers.draw(it, "${ccY}Wire draw class: $ccG${(Terrarum.ingame as? net.torvald.terrarum.modulebasegame.TerrarumIngame)?.selectedWireRenderClass}", 2f, 2f) + + // print UIs under cursor + App.fontSmallNumbers.draw(it, "${ccY}UIs under mouse:", 2f, 15f) + Terrarum.ingame?.uiContainer?.UIsUnderMouse?.forEachIndexed { i, ui -> + App.fontSmallNumbers.draw(it, "${ccY}-$ccG ${ui.javaClass.simpleName}", 2f, 28f + 13*i) + } } } diff --git a/src/net/torvald/terrarum/UIFakeGradOverlay.kt b/src/net/torvald/terrarum/UIFakeGradOverlay.kt index 7e286ebf6..e3ee45a04 100644 --- a/src/net/torvald/terrarum/UIFakeGradOverlay.kt +++ b/src/net/torvald/terrarum/UIFakeGradOverlay.kt @@ -10,10 +10,12 @@ import com.jme3.math.FastMath import net.torvald.random.HQRNG import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable /** * Created by minjaesong on 2021-09-09. */ +@UINotControllable class UIFakeGradOverlay : UICanvas() { init { handler.allowESCtoClose = false @@ -68,6 +70,7 @@ class UIFakeGradOverlay : UICanvas() { override fun dispose() {} } +@UINotControllable class UIFakeBlurOverlay(val blurRadius: Float, val nodarken: Boolean) : UICanvas() { init { handler.allowESCtoClose = false diff --git a/src/net/torvald/terrarum/gamecontroller/IngameController.kt b/src/net/torvald/terrarum/gamecontroller/IngameController.kt index 9ca81d30a..ba3d29c6e 100644 --- a/src/net/torvald/terrarum/gamecontroller/IngameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/IngameController.kt @@ -16,6 +16,7 @@ import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.gameactors.DroppedItem import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar +import net.torvald.terrarum.ui.UICanvas import net.torvald.terrarum.worlddrawer.WorldCamera import org.dyn4j.geometry.Vector2 import java.util.* @@ -131,7 +132,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { // Use item: assuming the player has only one effective grip (EquipPosition.HAND_GRIP) // don't separate Player from this! Physics will break, esp. airborne manoeuvre - if (!terrarumIngame.paused) { + if (!terrarumIngame.paused && terrarumIngame.uiContainer.hasNoUIsUnderMouse) { val actor = terrarumIngame.actorNowPlaying val itemOnGrip = terrarumIngame.actorNowPlaying?.inventory?.itemEquipped?.get(GameItem.EquipPosition.HAND_GRIP) // fire world click events; the event is defined as Ingame's (or any others') WorldClick event @@ -159,7 +160,6 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { } - updateKeyboard() } @@ -272,7 +272,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { } override fun scrolled(amountX: Float, amountY: Float): Boolean { - if (!terrarumIngame.paused) { + if (!terrarumIngame.paused && terrarumIngame.uiContainer.hasNoUIsUnderMouse) { // quickslot by wheel terrarumIngame.actorNowPlaying?.let { var selection = it.actorValue.getAsInt(AVKey.__PLAYER_QUICKSLOTSEL)!! diff --git a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt index 416bca25a..ad6dc8509 100644 --- a/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt +++ b/src/net/torvald/terrarum/modulebasegame/BuildingMaker.kt @@ -87,8 +87,6 @@ class BuildingMaker(batch: FlippingSpriteBatch) : IngameInstance(batch) { val uiGetPoiName = UIBuildingMakerGetFilename() // used for both import and export - val uiContainer = UIContainer() - val keyboardUsedByTextInput: Boolean get() = uiGetPoiName.textInput.isEnabled diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 4df0ba4e7..650e2fd15 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -88,7 +88,6 @@ open class TerrarumIngame(batch: FlippingSpriteBatch) : IngameInstance(batch) { //val ACTORCONTAINER_INITIAL_SIZE = 64 val PARTICLES_MAX = App.getConfigInt("maxparticles") val particlesContainer = CircularArray(PARTICLES_MAX, true) - val uiContainer = UIContainer() // these are required because actors always change their position private var visibleActorsRenderBehind: ArrayList = ArrayList(1) diff --git a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt index 35254a1b6..204d5725d 100644 --- a/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt +++ b/src/net/torvald/terrarum/modulebasegame/TitleScreen.kt @@ -146,7 +146,6 @@ class TitleScreen(batch: FlippingSpriteBatch) : IngameInstance(batch) { private val gradWhiteBottom = Color(0xd8d8d8ff.toInt()) - val uiContainer = UIContainer() internal lateinit var uiRemoCon: UIRemoCon internal lateinit var uiFakeBlurOverlay: UICanvas diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt index 6ab428688..a677dbb96 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotBar.kt @@ -11,6 +11,7 @@ import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.modulebasegame.ui.UIItemInventoryCellCommonRes.toItemCountText import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable import kotlin.math.roundToInt /** @@ -18,6 +19,7 @@ import kotlin.math.roundToInt * * Created by minjaesong on 2016-07-20. */ +@UINotControllable class UIQuickslotBar : UICanvas() { init { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt index 754b652f9..8e934b8d7 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIQuickslotPie.kt @@ -13,6 +13,7 @@ import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.COMMON_OP import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.SLOT_COUNT import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable import org.dyn4j.geometry.Vector2 import kotlin.math.roundToInt @@ -21,6 +22,7 @@ import kotlin.math.roundToInt * * Created by minjaesong on 2016-07-20. */ +@UINotControllable class UIQuickslotPie : UICanvas() { init { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIScreenZoom.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIScreenZoom.kt index af12b26e2..713a6d89f 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIScreenZoom.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIScreenZoom.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.langpack.Lang import net.torvald.terrarum.modulebasegame.ui.UIQuickslotBar.Companion.COMMON_OPEN_CLOSE import net.torvald.terrarum.ui.Movement import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable import net.torvald.unicode.EMDASH import net.torvald.unicode.getKeycapPC import kotlin.math.roundToInt @@ -19,6 +20,7 @@ import kotlin.math.roundToInt * * Created by minjaesong on 2019-08-11. */ +@UINotControllable class UIScreenZoom : UICanvas( "control_key_zoom" ) { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt b/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt index 2c2a874f1..0e0108270 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UITooltip.kt @@ -9,10 +9,12 @@ import net.torvald.terrarum.Second import net.torvald.terrarum.Terrarum import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable /** * Created by minjaesong on 2017-11-25. */ +@UINotControllable class UITooltip : UICanvas() { init { diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeAnalogue.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeAnalogue.kt index 618f19673..55a9971b2 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeAnalogue.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeAnalogue.kt @@ -10,6 +10,7 @@ import net.torvald.terrarum.gameworld.WorldTime import net.torvald.terrarum.modulebasegame.TerrarumIngame import net.torvald.terrarum.ui.Toolkit import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.cos import kotlin.math.roundToInt @@ -18,6 +19,7 @@ import kotlin.math.sin /** * Created by minjaesong on 2023-09-09. */ +@UINotControllable class UIWatchLargeAnalogue() : UICanvas() { override var width = 76 diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeDigital.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeDigital.kt index 9a4f85619..6985ea83f 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeDigital.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIWatchLargeDigital.kt @@ -10,12 +10,14 @@ import net.torvald.terrarum.* import net.torvald.terrarum.gameworld.WorldTime import net.torvald.terrarum.modulebasegame.imagefont.WatchFont import net.torvald.terrarum.ui.UICanvas +import net.torvald.terrarum.ui.UINotControllable import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack import kotlin.math.roundToInt /** * Created by minjaesong on 2017-06-11. */ +@UINotControllable class UIWatchLargeDigital() : UICanvas() { override var width = 162 override var height = 25 diff --git a/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt b/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt index 5ad8af997..dbdea8d15 100644 --- a/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt +++ b/src/net/torvald/terrarum/ui/UIAutosaveNotifier.kt @@ -12,6 +12,7 @@ import kotlin.math.roundToInt /** * Created by minjaesong on 2021-10-01. */ +@UINotControllable class UIAutosaveNotifier : UICanvas() { init { diff --git a/src/net/torvald/terrarum/ui/UICanvas.kt b/src/net/torvald/terrarum/ui/UICanvas.kt index 162b6cb8b..1e27b82bf 100644 --- a/src/net/torvald/terrarum/ui/UICanvas.kt +++ b/src/net/torvald/terrarum/ui/UICanvas.kt @@ -431,3 +431,10 @@ abstract class UICanvas( override fun toString(): String = "${this.javaClass.simpleName}@${this.hashCode().toString(16)}" } + +/** + * Annotation added to the UI that is not meant to have a user interaction in any way, so that even if + * the mouse cursor is above it, the UI is not recognised as such. This is useful on UIs that spawn a + * tooltip and the said UI is checking if the mouse cursor is NOT above any other overlaid UI (e.g. a message box) + */ +annotation class UINotControllable \ No newline at end of file