diff --git a/src/net/torvald/terrarum/IngameInstance.kt b/src/net/torvald/terrarum/IngameInstance.kt index 2ee2d2815..4d49be2ab 100644 --- a/src/net/torvald/terrarum/IngameInstance.kt +++ b/src/net/torvald/terrarum/IngameInstance.kt @@ -25,6 +25,8 @@ open class IngameInstance(val batch: SpriteBatch) : Screen { open var consoleHandler: ConsoleWindow = ConsoleWindow() var paused: Boolean = false + val consoleOpened: Boolean + get() = consoleHandler.isOpened || consoleHandler.isOpening init { consoleHandler.setPosition(0, 0) diff --git a/src/net/torvald/terrarum/gamecontroller/IngameController.kt b/src/net/torvald/terrarum/gamecontroller/IngameController.kt index 1d5f74cde..98dc2be20 100644 --- a/src/net/torvald/terrarum/gamecontroller/IngameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/IngameController.kt @@ -11,7 +11,6 @@ import net.torvald.terrarum.floorInt import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameworld.fmod import net.torvald.terrarum.modulebasegame.TerrarumIngame -import net.torvald.terrarum.toInt import net.torvald.terrarum.worlddrawer.CreateTileAtlas import net.torvald.terrarum.worlddrawer.WorldCamera @@ -55,7 +54,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.canPlayerControl) { + if (!terrarumIngame.paused) { // fire world click events; the event is defined as Ingame's (or any others') WorldClick event if (terrarumIngame.uiContainer.map { if ((it.isOpening || it.isOpened) && it.mouseUp) 1 else 0 }.sum() == 0) { // no UI on the mouse, right? @@ -81,8 +80,11 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { // KEYBOARD CONTROL // ////////////////////// + //KeyToggler.update(terrarumIngame.canPlayerControl) + //printdbg(this, terrarumIngame.canPlayerControl) + // FIXME temporarily make zoom work with 'Z' key - terrarumIngame.screenZoom = 1f + KeyToggler.isOn(AppLoader.getConfigInt("keyzoom")).toInt() + //terrarumIngame.screenZoom = 1f + KeyToggler.isOn(AppLoader.getConfigInt("keyzoom")).toInt() } @@ -90,7 +92,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { override fun keyDown(keycode: Int): Boolean { - if (terrarumIngame.canPlayerControl) { + if (!terrarumIngame.paused) { terrarumIngame.actorNowPlaying?.keyDown(keycode) // quickslot by number keys @@ -155,7 +157,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { override fun touchUp(screenX: Int, screenY: Int, pointer: Int, button: Int): Boolean { // don't separate Player from this! Physics will break, esp. airborne manoeuvre - if (terrarumIngame.canPlayerControl) { + if (!terrarumIngame.paused) { // fire world click events; the event is defined as Ingame's (or any others') WorldClick event if (terrarumIngame.uiContainer.map { if ((it.isOpening || it.isOpened) && it.mouseUp) 1 else 0 }.sum() == 0) { // no UI on the mouse, right? @@ -177,7 +179,7 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() { } override fun scrolled(amount: Int): Boolean { - if (terrarumIngame.canPlayerControl) { + if (!terrarumIngame.paused) { // quickslot by wheel if (terrarumIngame.actorNowPlaying != null) { terrarumIngame.actorNowPlaying!!.actorValue.set( diff --git a/src/net/torvald/terrarum/gamecontroller/KeyToggler.kt b/src/net/torvald/terrarum/gamecontroller/KeyToggler.kt index e587187ef..a9e19050c 100644 --- a/src/net/torvald/terrarum/gamecontroller/KeyToggler.kt +++ b/src/net/torvald/terrarum/gamecontroller/KeyToggler.kt @@ -1,7 +1,9 @@ package net.torvald.terrarum.gamecontroller import com.badlogic.gdx.Gdx -import net.torvald.terrarum.Terrarum +import com.badlogic.gdx.Input +import net.torvald.terrarum.AppLoader.printdbg +import net.torvald.util.sortedArrayListOf import java.util.* object KeyToggler { @@ -13,7 +15,13 @@ object KeyToggler { /** * Keys that won't be updated when console is opened */ - private val gameKeys = (16..27) + (30..40) + (43..53) + private val gameKeys = sortedArrayListOf( + Input.Keys.NUM_1, Input.Keys.NUM_2, Input.Keys.NUM_3, Input.Keys.NUM_4, Input.Keys.NUM_5, Input.Keys.NUM_6, Input.Keys.NUM_7, Input.Keys.NUM_8, Input.Keys.NUM_9, Input.Keys.NUM_0, Input.Keys.MINUS, Input.Keys.EQUALS, + Input.Keys.Q, Input.Keys.W, Input.Keys.E, Input.Keys.R, Input.Keys.T, Input.Keys.Y, Input.Keys.U, Input.Keys.I, Input.Keys.O, Input.Keys.P, Input.Keys.LEFT_BRACKET, Input.Keys.RIGHT_BRACKET, + Input.Keys.A, Input.Keys.S, Input.Keys.D, Input.Keys.F, Input.Keys.G, Input.Keys.H, Input.Keys.J, Input.Keys.K, Input.Keys.L, Input.Keys.SEMICOLON, Input.Keys.APOSTROPHE, + Input.Keys.Z, Input.Keys.X, Input.Keys.C, Input.Keys.V, Input.Keys.B, Input.Keys.N, Input.Keys.M, Input.Keys.COMMA, Input.Keys.PERIOD, Input.Keys.SLASH, + Input.Keys.NUMPAD_0, Input.Keys.NUMPAD_1, Input.Keys.NUMPAD_2, Input.Keys.NUMPAD_3, Input.Keys.NUMPAD_4, Input.Keys.NUMPAD_5, Input.Keys.NUMPAD_6, Input.Keys.NUMPAD_7, Input.Keys.NUMPAD_8, Input.Keys.NUMPAD_9 + ) fun isOn(key: Int): Boolean { @@ -22,11 +30,15 @@ object KeyToggler { /** * Put this into the each scene's update/render method. + * + * Set ```toggleGameKeys = true``` to make toggling work for keys like Q, W, E, ...; otherwise only F1-F12 keys will be toggled */ - fun update(gameMode: Boolean = true) { + fun update(toggleGameKeys: Boolean) { for (it in 0..255) { - if (gameMode && it in gameKeys && - (Terrarum.ingame!!.consoleHandler.isOpening || Terrarum.ingame!!.consoleHandler.isOpened)) { + if (!toggleGameKeys && gameKeys.contains(it)) { + if (Gdx.input.isKeyPressed(it)) + printdbg(this, "Disallowed key: $it") + continue } diff --git a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt index 474b8854a..14f532e02 100644 --- a/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt +++ b/src/net/torvald/terrarum/modulebasegame/TerrarumIngame.kt @@ -144,11 +144,6 @@ open class TerrarumIngame(batch: SpriteBatch) : IngameInstance(batch) { //var paused: Boolean = false //get() = uiAliasesPausing.map { if (it.isOpened) return true else 0 }.isEmpty() // isEmpty is always false, which we want - /** - * Set to false if UI is opened; set to true if UI is closed. - */ - inline val canPlayerControl: Boolean - get() = !paused // FIXME temporary behab (block movement if the game is paused or paused by UIs) var particlesActive = 0 private set diff --git a/src/net/torvald/terrarum/ui/ConsoleWindow.kt b/src/net/torvald/terrarum/ui/ConsoleWindow.kt index 6df2e5118..639f5c00e 100644 --- a/src/net/torvald/terrarum/ui/ConsoleWindow.kt +++ b/src/net/torvald/terrarum/ui/ConsoleWindow.kt @@ -14,6 +14,8 @@ import net.torvald.util.HistoryArray /** + * Don't let the debug console have the ```toggleKeyLiteral```, this must open even when the game is paused + * * Created by minjaesong on 2015-12-31. */ class ConsoleWindow : UICanvas() { @@ -203,11 +205,13 @@ class ConsoleWindow : UICanvas() { } override fun endOpening(delta: Float) { + Terrarum.ingame?.paused = true drawOffY = 0f openingTimeCounter = 0f } override fun endClosing(delta: Float) { + Terrarum.ingame?.paused = false drawOffY = -height.toFloat() openingTimeCounter = 0f } diff --git a/src/net/torvald/terrarum/ui/UIHandler.kt b/src/net/torvald/terrarum/ui/UIHandler.kt index 8dd35220c..5df4898eb 100644 --- a/src/net/torvald/terrarum/ui/UIHandler.kt +++ b/src/net/torvald/terrarum/ui/UIHandler.kt @@ -6,6 +6,7 @@ import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import com.badlogic.gdx.utils.Disposable +import net.torvald.terrarum.Terrarum import net.torvald.terrarum.gamecontroller.KeyToggler import net.torvald.terrarum.modulebasegame.TerrarumIngame @@ -105,23 +106,25 @@ class UIHandler(//var UI: UICanvas, fun update(ui: UICanvas, delta: Float) { // open/close UI by key pressed - if (toggleKey != null && Gdx.input.isKeyJustPressed(toggleKey!!)) { - if (isClosed) - setAsOpen() - else if (isOpened) + // some UIs will pause the game, and they still need to be closed + if (Terrarum.ingame?.consoleOpened == false && (Terrarum.ingame?.paused == false || isOpened)) { + if (toggleKey != null && Gdx.input.isKeyJustPressed(toggleKey!!)) { + if (isClosed) + setAsOpen() + else if (isOpened) + setAsClose() + + // for the case of intermediate states, do nothing. + } + if (toggleButton != null) { + /* */ + } + + // ESC is a master key for closing + if (allowESCtoClose && Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE) && isOpened) { setAsClose() - - // for the case of intermediate states, do nothing. + } } - if (toggleButton != null) { - /* */ - } - - // ESC is a master key for closing - if (allowESCtoClose && Gdx.input.isKeyJustPressed(Input.Keys.ESCAPE) && isOpened) { - setAsClose() - } - //if (openFired && openCloseCounter > 9) openFired = false //if (closeFired && openCloseCounter > 9) closeFired = false diff --git a/src/net/torvald/util/SortedArrayList.kt b/src/net/torvald/util/SortedArrayList.kt index e5ec86a24..ff55ea165 100644 --- a/src/net/torvald/util/SortedArrayList.kt +++ b/src/net/torvald/util/SortedArrayList.kt @@ -152,4 +152,13 @@ class SortedArrayList>(initialSize: Int = 10) { * Does NOT create copies! */ fun toArrayList() = arrayList +} + +fun > sortedArrayListOf(vararg elements: T): SortedArrayList { + val a = SortedArrayList(elements.size + 1) + ReentrantLock().lock { + a.arrayList.addAll(elements) + a.arrayList.sort() + } + return a } \ No newline at end of file