diff --git a/assets/audio/effects/haptic_bip.ogg b/assets/audio/effects/haptic_bip.ogg new file mode 100644 index 000000000..f73014357 --- /dev/null +++ b/assets/audio/effects/haptic_bip.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6229297f96b07042da90c10370cc615653cb634c56bac5734853c1e3b1f5a548 +size 4553 diff --git a/assets/audio/effects/haptic_bop.ogg b/assets/audio/effects/haptic_bop.ogg new file mode 100644 index 000000000..cf1065a83 --- /dev/null +++ b/assets/audio/effects/haptic_bop.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0727fa9934e3894e3ea3557f9d69d88c5a2e96fd7471476195cd274e51e7b8fb +size 4611 diff --git a/assets/audio/effects/haptic_bup.ogg b/assets/audio/effects/haptic_bup.ogg new file mode 100644 index 000000000..2d97ef518 --- /dev/null +++ b/assets/audio/effects/haptic_bup.ogg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5a8784798e886a9b05e69ae971c8d70d9ec580ea5d868879d3de4ac38444ae2 +size 4735 diff --git a/src/net/torvald/terrarum/App.java b/src/net/torvald/terrarum/App.java index 81118fdf8..1e988ce86 100644 --- a/src/net/torvald/terrarum/App.java +++ b/src/net/torvald/terrarum/App.java @@ -2,6 +2,7 @@ package net.torvald.terrarum; import com.badlogic.gdx.*; import com.badlogic.gdx.audio.AudioDevice; +import com.badlogic.gdx.audio.Music; import com.badlogic.gdx.backends.lwjgl3.Lwjgl3ApplicationConfiguration; import com.badlogic.gdx.backends.lwjgl3.TerrarumLwjgl3Application; import com.badlogic.gdx.controllers.Controllers; @@ -17,6 +18,8 @@ import kotlin.jvm.functions.Function0; import kotlin.text.Charsets; import net.torvald.getcpuname.GetCpuName; import net.torvald.terrarum.audio.AudioMixer; +import net.torvald.terrarum.audio.MusicContainer; +import net.torvald.terrarum.audio.dsp.BinoPan; import net.torvald.terrarum.controller.GdxControllerAdapter; import net.torvald.terrarum.controller.TerrarumController; import net.torvald.terrarum.controller.XinputControllerAdapter; @@ -551,6 +554,9 @@ public class App implements ApplicationListener { CommonResourcePool.INSTANCE.addToLoadingList("title_health1", () -> new Texture(Gdx.files.internal("./assets/graphics/gui/health_take_a_break.tga"))); CommonResourcePool.INSTANCE.addToLoadingList("title_health2", () -> new Texture(Gdx.files.internal("./assets/graphics/gui/health_distance.tga"))); + CommonResourcePool.INSTANCE.addToLoadingList("sound:haptic_bop", () -> new MusicContainer("haptic_bop", Gdx.files.internal("./assets/audio/effects/haptic_bop.ogg").file(), false, (Music m) -> { return null; })); + CommonResourcePool.INSTANCE.addToLoadingList("sound:haptic_bup", () -> new MusicContainer("haptic_bup", Gdx.files.internal("./assets/audio/effects/haptic_bup.ogg").file(), false, (Music m) -> { return null; })); + CommonResourcePool.INSTANCE.addToLoadingList("sound:haptic_bip", () -> new MusicContainer("haptic_bip", Gdx.files.internal("./assets/audio/effects/haptic_bip.ogg").file(), false, (Music m) -> { highPrioritySoundPlaying = false; return null; })); // make loading list CommonResourcePool.INSTANCE.loadAll(); @@ -1959,4 +1965,35 @@ public class App implements ApplicationListener { setConfig("autosaveinterval", 5 * 60000); } } + + + private static boolean highPrioritySoundPlaying = false; + + public static void playGUIsound(MusicContainer sound, double volume, float pan) { + if (!highPrioritySoundPlaying) { + var it = audioMixer.getGuiTrack(); + it.stop(); + it.setCurrentTrack(sound); + it.setMaxVolumeFun(() -> volume); + it.setVolume(volume); + ((BinoPan) Arrays.stream(it.getFilters()).findFirst().get()).setPan(pan); + it.play(); + } + } + public static void playGUIsound(MusicContainer sound, double volume) { playGUIsound(sound, volume, 0.0f); } + public static void playGUIsound(MusicContainer sound) { playGUIsound(sound, 1.0, 0.0f); } + + public static void playGUIsoundHigh(MusicContainer sound, double volume, float pan) { + // TODO when a sound is played thru this function, other sound play calls thru playGUIsound are ignored until this sound finishes playing + var it = audioMixer.getGuiTrack(); + highPrioritySoundPlaying = true; + it.stop(); + it.setCurrentTrack(sound); + it.setMaxVolumeFun(() -> volume); + it.setVolume(volume); + ((BinoPan) Arrays.stream(it.getFilters()).findFirst().get()).setPan(pan); + it.play(); + } + public static void playGUIsoundHigh(MusicContainer sound, double volume) { playGUIsoundHigh(sound, volume, 0.0f); } + public static void playGUIsoundHigh(MusicContainer sound) { playGUIsoundHigh(sound, 1.0, 0.0f); } } diff --git a/src/net/torvald/terrarum/CreditSingleton.kt b/src/net/torvald/terrarum/CreditSingleton.kt index 50bceeaad..55a27a059 100644 --- a/src/net/torvald/terrarum/CreditSingleton.kt +++ b/src/net/torvald/terrarum/CreditSingleton.kt @@ -341,6 +341,10 @@ Remixed sound from and + - effects/haptic_*.ogg +℗ 2024 CuriousTorvald +My own recordings + $BULLET Impulse Responses: diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 6a2efd785..796001b7a 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -444,16 +444,6 @@ open class IngameInstance(val batch: FlippingSpriteBatch, val isMultiplayer: Boo loadedTime_t = App.getTIME_T() } - open fun playGUIsound(sound: MusicContainer, volume: Double = 1.0, pan: Float = 0f) { - App.audioMixer.guiTrack.let { - it.currentTrack = sound - it.maxVolumeFun= { volume } - it.volume = volume - it.playRequested.set(true) - it.getFilter().pan = pan - } - } - /** * Copies most recent `save` to `save.1`, leaving `save` for overwriting, previous `save.1` will be copied to `save.2` */ diff --git a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt index 84989b496..e74470870 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameitems/PickaxeGeneric.kt @@ -255,7 +255,7 @@ object PickaxeCore { val pan = 1.3 * relX / distFallOff val vol = MixerTrackProcessor.getVolFun(dist / distFallOff).coerceAtLeast(0.0) if (!tooltipWasShown && tooltipSet) { - INGAME.playGUIsound(soundCue, 0.25 * vol, pan.toFloat()) + App.playGUIsound(soundCue, 0.18 * vol, pan.toFloat()) } true // just a placeholder diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryCellBase.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryCellBase.kt index f1f29b38f..7f8e4cd61 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryCellBase.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryCellBase.kt @@ -35,9 +35,16 @@ abstract class UIItemInventoryCellBase( var colourTheme: InventoryCellColourTheme = UIItemInventoryCellCommonRes.defaultInventoryCellTheme, var showTooltip: Boolean = true, ) : UIItem(parentUI, initialX, initialY) { - abstract override fun update(delta: Float) + + override fun update(delta: Float) { + suppressHaptic = (item == null) + super.update(delta) + } + abstract override fun render(frameDelta: Float, batch: SpriteBatch, camera: OrthographicCamera) + override var suppressHaptic = false + protected val tooltipHash = System.nanoTime() /** Custom highlight rule to highlight tihs button to primary accent colour (blue by default). diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt index 579cb395e..4a6fc589e 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryItemGrid.kt @@ -51,6 +51,8 @@ open class UIItemInventoryItemGrid( private val colourTheme: InventoryCellColourTheme = defaultInventoryCellTheme ) : UIItem(parentUI, initialX, initialY) { + override var suppressHaptic = true + // deal with the moving position //override var oldPosX = posX //override var oldPosY = posY diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt index 59d9fb2b7..67aa98b48 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIItemListNavBarVertical.kt @@ -23,6 +23,7 @@ class UIItemListNavBarVertical( var extraDrawOpOnBottom: (UIItemListNavBarVertical, SpriteBatch) -> Unit = { _,_ -> } ) : UIItem(parentUI, initialX, initialY) { + override var suppressHaptic = true override val width = UIItemListNavBarVertical.WIDTH override val mouseUp: Boolean diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt index bbab1b311..7bcb28279 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UILoadDemoSavefiles.kt @@ -496,6 +496,8 @@ class UIItemPlayerCells( val playerUUID: UUID, ) : UIItem(parent, initialX, initialY) { + override var suppressHaptic = false + override val width = SAVE_CELL_WIDTH override val height = SAVE_CELL_HEIGHT @@ -766,6 +768,7 @@ class UIItemWorldCells( initialY: Int, val skimmer: DiskSkimmer) : UIItem(parent, initialX, initialY) { + override var suppressHaptic = false private val metaFile: EntryFile? private val saveName: String diff --git a/src/net/torvald/terrarum/ui/UIItem.kt b/src/net/torvald/terrarum/ui/UIItem.kt index 03148c45a..1ede8691a 100644 --- a/src/net/torvald/terrarum/ui/UIItem.kt +++ b/src/net/torvald/terrarum/ui/UIItem.kt @@ -3,7 +3,10 @@ package net.torvald.terrarum.ui import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.App +import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticCursorHovered /** @@ -141,15 +144,20 @@ abstract class UIItem(var parentUI: UICanvas, val initialX: Int, val initialY: I */ open var isActive = true + private var oldMouseUp = false + + open var suppressHaptic = true override fun update(delta: Float) { if (parentUI.isVisible) { if (isActive) { + val mU = mouseUp + updateListener.invoke(delta) mouseOverCall?.update(delta) - if (mouseUp) { + if (mU) { if (mouseOverCall?.isVisible == true) { mouseOverCall?.setAsOpen() } @@ -168,7 +176,17 @@ abstract class UIItem(var parentUI: UICanvas, val initialX: Int, val initialY: I } } + if (!oldMouseUp && mU && !suppressHaptic) + playHapticCursorHovered() + + oldMouseUp = mU } + else { + oldMouseUp = false + } + } + else { + oldMouseUp = false } } @@ -233,6 +251,8 @@ abstract class UIItem(var parentUI: UICanvas, val initialX: Int, val initialY: I if (!clickOnceListenerFired && mouseUp && button == App.getConfigInt("config_mouseprimary")) { clickOnceListener.invoke(itemRelativeMouseX, itemRelativeMouseY) + if (!suppressHaptic) + playHapticPushedDown() actionDone = true } } @@ -262,3 +282,12 @@ abstract class UIItem(var parentUI: UICanvas, val initialX: Int, val initialY: I abstract override fun dispose() } + +object UIItemAccessibilityUtil { + fun playHapticCursorHovered() { + App.playGUIsound(CommonResourcePool.getAs("sound:haptic_bup"), 0.1666666) + } + fun playHapticPushedDown() { + App.playGUIsoundHigh(CommonResourcePool.getAs("sound:haptic_bip"), 0.5) + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt b/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt index 01e23a119..9e3645fb2 100644 --- a/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt +++ b/src/net/torvald/terrarum/ui/UIItemHorzSlider.kt @@ -6,6 +6,8 @@ import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.* +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticCursorHovered +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown import kotlin.math.absoluteValue import kotlin.math.roundToInt @@ -32,6 +34,8 @@ class UIItemHorzSlider( private val disposeTexture: Boolean = false ) : UIItem(parentUI, initialX, initialY) { + override var suppressHaptic = false + override val height = 24 private var mouseOnHandle = false @@ -50,6 +54,7 @@ class UIItemHorzSlider( // update handle position and value if (mouseUp && Terrarum.mouseDown || mouseLatched) { + if (!mouseLatched) playHapticPushedDown() mouseLatched = true handlePos = (itemRelativeMouseX - handleWidth/2.0).coerceIn(0.0, handleTravelDist.toDouble()) value = interpolateLinear(handlePos / handleTravelDist, min, max) diff --git a/src/net/torvald/terrarum/ui/UIItemImageButton.kt b/src/net/torvald/terrarum/ui/UIItemImageButton.kt index 8a19b6c9d..54796039d 100644 --- a/src/net/torvald/terrarum/ui/UIItemImageButton.kt +++ b/src/net/torvald/terrarum/ui/UIItemImageButton.kt @@ -51,6 +51,8 @@ open class UIItemImageButton( val imageDrawHeight: Int = image.regionHeight, ) : UIItem(parent, initialX, initialY) { + override var suppressHaptic = false + var highlighted = false var extraDrawOp: (UIItem, SpriteBatch) -> Unit = { _,_ -> } diff --git a/src/net/torvald/terrarum/ui/UIItemInventoryElemSimple.kt b/src/net/torvald/terrarum/ui/UIItemInventoryElemSimple.kt index d2b90e254..1630b05b3 100644 --- a/src/net/torvald/terrarum/ui/UIItemInventoryElemSimple.kt +++ b/src/net/torvald/terrarum/ui/UIItemInventoryElemSimple.kt @@ -41,7 +41,9 @@ class UIItemInventoryElemSimple( var emptyCellIconColour: Color = Color(0xdddddd7f.toInt()), val updateOnNull: Boolean = false, ) : UIItemInventoryCellBase(parentUI, initialX, initialY, item, amount, itemImage, quickslot, equippedSlot, keyDownFun, touchDownFun, wheelFun, extraInfo, highlightEquippedItem, colourTheme) { - + + override var suppressHaptic = false + companion object { val height = UIItemInventoryElemWide.height } @@ -60,9 +62,6 @@ class UIItemInventoryElemSimple( private val emptyCellIconOffsetX = (this.height - (emptyCellIcon?.regionWidth ?: 0)).div(2).toFloat() private val emptyCellIconOffsetY = (this.height - (emptyCellIcon?.regionHeight ?: 0)).div(2).toFloat() - override fun update(delta: Float) { - } - private var highlightToMainCol = false private var highlightToSubCol = false diff --git a/src/net/torvald/terrarum/ui/UIItemInventoryElemWide.kt b/src/net/torvald/terrarum/ui/UIItemInventoryElemWide.kt index edd534397..7f79fd185 100644 --- a/src/net/torvald/terrarum/ui/UIItemInventoryElemWide.kt +++ b/src/net/torvald/terrarum/ui/UIItemInventoryElemWide.kt @@ -41,6 +41,8 @@ class UIItemInventoryElemWide( var showItemCount: Boolean = true, ) : UIItemInventoryCellBase(parentUI, initialX, initialY, item, amount, itemImage, quickslot, equippedSlot, keyDownFun, touchDownFun, wheelFun, extraInfo, highlightEquippedItem, colourTheme) { + override var suppressHaptic = false + companion object { val height = 48 val UNIQUE_ITEM_HAS_NO_AMOUNT = -1L @@ -65,11 +67,6 @@ class UIItemInventoryElemWide( private val durabilityBarOffY = 35 - - - override fun update(delta: Float) { - } - private var highlightToMainCol = false private var highlightToSubCol = false diff --git a/src/net/torvald/terrarum/ui/UIItemSpinner.kt b/src/net/torvald/terrarum/ui/UIItemSpinner.kt index 56f211e3e..5caddc1ee 100644 --- a/src/net/torvald/terrarum/ui/UIItemSpinner.kt +++ b/src/net/torvald/terrarum/ui/UIItemSpinner.kt @@ -6,6 +6,8 @@ import net.torvald.terrarum.App import net.torvald.terrarum.CommonResourcePool import net.torvald.terrarum.Terrarum import net.torvald.terrarum.ceilToInt +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticCursorHovered +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown import kotlin.math.absoluteValue /** @@ -26,6 +28,8 @@ class UIItemSpinner( private val numberToTextFunction: (Number) -> String = { "$it" } ) : UIItem(parentUI, initialX, initialY) { + override var suppressHaptic = false + // to alleviate floating point errors adding up as the spinner is being used private val values = DoubleArray(1 + ((max.toDouble() - min.toDouble()).div(step.toDouble())).ceilToInt()) { // printdbg(this, "$min..$max step $step; index [$it] = ${min.toDouble() + (step.toDouble() * it)}") @@ -89,6 +93,8 @@ class UIItemSpinner( fboUpdateLatch = true } + private var oldMouseOnButton = 0 + override fun update(delta: Float) { super.update(delta) @@ -106,7 +112,14 @@ class UIItemSpinner( changeValueBy((mouseOnButton * 2) - 3) fboUpdateLatch = true selectionChangeListener(value) + playHapticPushedDown() } + + if (mouseOnButton > 0 && mouseOnButton != oldMouseOnButton) { + playHapticCursorHovered() + } + + oldMouseOnButton = mouseOnButton } private var textCache = "" @@ -199,6 +212,7 @@ class UIItemSpinner( selectionChangeListener(value) fboUpdateLatch = true + playHapticPushedDown() return true } else { diff --git a/src/net/torvald/terrarum/ui/UIItemTextButton.kt b/src/net/torvald/terrarum/ui/UIItemTextButton.kt index 273273945..eb5529a28 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextButton.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextButton.kt @@ -51,6 +51,8 @@ open class UIItemTextButton( val tags: Array = arrayOf("") ) : UIItem(parentUI, initialX, initialY) { + override var suppressHaptic = false + companion object { val font = App.fontGame val height = 24 diff --git a/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt b/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt index 81850cb32..9483d753e 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextButtonList.kt @@ -1,11 +1,11 @@ package net.torvald.terrarum.ui -import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.OrthographicCamera import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.* import net.torvald.terrarum.langpack.Lang +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown import net.torvald.terrarumsansbitmap.gdx.TextureRegionPack /** @@ -86,22 +86,22 @@ class UIItemTextButtonList( // if (!kinematic) { UIItemTextButton( - parentUI, if (readFromLang) ld1 else ld0, - initialX = posX, - initialY = posY + vertOff, - width = width, - activeCol = activeCol, - activeBackCol = activeBackCol, - activeBackBlendMode = activeBackBlendMode, - highlightCol = highlightCol, - highlightBackCol = highlightBackCol, - highlightBackBlendMode = highlightBackBlendMode, - inactiveCol = inactiveCol, - paddingLeft = pregap, - paddingRight = postgap, - alignment = alignment, - hitboxSize = itemHitboxSize, - tags = tagsCollection[i] + parentUI, if (readFromLang) ld1 else ld0, + initialX = posX, + initialY = posY + vertOff, + width = width, + activeCol = activeCol, + activeBackCol = activeBackCol, + activeBackBlendMode = activeBackBlendMode, + highlightCol = highlightCol, + highlightBackCol = highlightBackCol, + highlightBackBlendMode = highlightBackBlendMode, + inactiveCol = inactiveCol, + paddingLeft = pregap, + paddingRight = postgap, + alignment = alignment, + hitboxSize = itemHitboxSize, + tags = tagsCollection[i], ) // } // else { @@ -211,6 +211,7 @@ class UIItemTextButtonList( // } selectionChangeListener?.invoke(oldIndex, index) + playHapticPushedDown() } btn.highlighted = (index == selectedIndex) // forcibly highlight if this.highlighted != null } diff --git a/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt b/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt index 0e9a054a9..3956f3b49 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextLineInput.kt @@ -10,6 +10,8 @@ import com.ibm.icu.text.Normalizer2 import com.jme3.math.FastMath import net.torvald.terrarum.* import net.torvald.terrarum.gamecontroller.* +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticCursorHovered +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown import net.torvald.terrarum.utils.Clipboard import net.torvald.terrarumsansbitmap.gdx.CodepointSequence import net.torvald.unicode.toJavaString @@ -433,6 +435,8 @@ class UIItemTextLineInput( } } + private var oldButtonStatus: Int? = null + override fun update(delta: Float) { if (mouseoverUpdateLatch) { super.update(delta) @@ -443,7 +447,10 @@ class UIItemTextLineInput( isEnabled = mouseUp if (oldEnabled && !isEnabled) TerrarumGlobalState.HAS_KEYBOARD_INPUT_FOCUS.unset() - if (!oldEnabled && isEnabled) TerrarumGlobalState.HAS_KEYBOARD_INPUT_FOCUS.set() + if (!oldEnabled && isEnabled) { + TerrarumGlobalState.HAS_KEYBOARD_INPUT_FOCUS.set() + playHapticPushedDown() + } } if (App.getConfigString("inputmethod") == "none") imeOn = false @@ -468,6 +475,23 @@ class UIItemTextLineInput( } imeOn = KeyToggler.isOn(ControlPresets.getKey("control_key_toggleime")) + + + val buttonStatus = if (mouseUpOnIMEButton) + 0 + else if (mouseUpOnPasteButton) + 2 + else if (mouseUpOnTextArea) + 1 + else + null + + + if (buttonStatus != null && buttonStatus != oldButtonStatus) + playHapticCursorHovered() + + + oldButtonStatus = buttonStatus } } diff --git a/src/net/torvald/terrarum/ui/UIItemTextSelector.kt b/src/net/torvald/terrarum/ui/UIItemTextSelector.kt index 196e94947..18a7e1fab 100644 --- a/src/net/torvald/terrarum/ui/UIItemTextSelector.kt +++ b/src/net/torvald/terrarum/ui/UIItemTextSelector.kt @@ -10,6 +10,8 @@ import com.badlogic.gdx.graphics.glutils.FrameBuffer import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg import net.torvald.terrarum.gameworld.fmod +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticCursorHovered +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap /** @@ -71,6 +73,9 @@ class UIItemTextSelector( fboUpdateLatch = true } + private var oldMouseOnButton = 0 + private var oldMouseOnPaletteItem: Int? = null + override fun update(delta: Float) { super.update(delta) @@ -99,7 +104,7 @@ class UIItemTextSelector( mouseLatch.latch { - if (paletteShowing && mouseOnPaletteItem != null ) { + if (paletteShowing && mouseOnPaletteItem != null) { selection = mouseOnPaletteItem!! fboUpdateLatch = true selectionChangeListener(selection) @@ -125,7 +130,22 @@ class UIItemTextSelector( else { paletteShowing = false } + + if (mouseOnButton > 0 && (clickToShowPalette || mouseOnButton != 3)) { + playHapticPushedDown() + } } + + if (mouseOnButton > 0 && mouseOnButton != oldMouseOnButton) { + if (drawBorder || mouseOnButton != 2) + playHapticCursorHovered() + } + else if (mouseOnPaletteItem != null && mouseOnPaletteItem != oldMouseOnPaletteItem) { + playHapticCursorHovered() + } + + oldMouseOnButton = mouseOnButton + oldMouseOnPaletteItem = mouseOnPaletteItem } private val leftIcon = if (useSpinnerButtons) labels.get(9,2) else labels.get(16,0) @@ -255,6 +275,7 @@ class UIItemTextSelector( selectionChangeListener(selection) fboUpdateLatch = true + playHapticPushedDown() return true } else { diff --git a/src/net/torvald/terrarum/ui/UIItemToggleButton.kt b/src/net/torvald/terrarum/ui/UIItemToggleButton.kt index 64a56ccab..2c576a8a0 100644 --- a/src/net/torvald/terrarum/ui/UIItemToggleButton.kt +++ b/src/net/torvald/terrarum/ui/UIItemToggleButton.kt @@ -24,6 +24,7 @@ class UIItemToggleButton( private var status: Boolean = false, ) : UIItem(parent, initialX, initialY) { + override var suppressHaptic = false init { CommonResourcePool.addToLoadingList("gui_toggler_icons") { diff --git a/src/net/torvald/terrarum/ui/UIItemVertSlider.kt b/src/net/torvald/terrarum/ui/UIItemVertSlider.kt index b74b2a26b..df8c41661 100644 --- a/src/net/torvald/terrarum/ui/UIItemVertSlider.kt +++ b/src/net/torvald/terrarum/ui/UIItemVertSlider.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.graphics.g2d.TextureRegion import net.torvald.terrarum.* import net.torvald.terrarum.App.printdbg +import net.torvald.terrarum.ui.UIItemAccessibilityUtil.playHapticPushedDown import kotlin.math.roundToInt /** @@ -23,6 +24,8 @@ class UIItemVertSlider( private val disposeTexture: Boolean = false ) : UIItem(parentUI, initialX, initialY) { + override var suppressHaptic = false + companion object { const val WIDTH = 16 } @@ -49,6 +52,7 @@ class UIItemVertSlider( // update handle position and value if (mouseUp && Terrarum.mouseDown || mouseLatched) { + if (!mouseLatched) playHapticPushedDown() mouseLatched = true handlePos = (itemRelativeMouseY - handleHeight/2.0).coerceIn(0.0, handleTravelDist.toDouble()) value = interpolateLinear(handlePos / handleTravelDist, min, max)