diff --git a/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga b/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga index 9fb33d142..ec2be6a9e 100644 --- a/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga +++ b/assets/graphics/fonts/terrarum-sans-bitmap/puae000-e0ff.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:56091eeb4f186e7b641cb31b41b61ad62d435bf5b0cceb5755398fe06ea260ca -size 331820 +oid sha256:17954b34c03645174786eac5bcd2f86601c42eb54beb67d205b1e912b714f0d6 +size 331794 diff --git a/lib/javadoc/jxinput-1.0.0-javadoc.jar b/lib/javadoc/jxinput-1.0.0-javadoc.jar new file mode 100644 index 000000000..12d907f8a Binary files /dev/null and b/lib/javadoc/jxinput-1.0.0-javadoc.jar differ diff --git a/lib/jxinput-1.0.0.jar b/lib/jxinput-1.0.0.jar new file mode 100644 index 000000000..15ba084c3 Binary files /dev/null and b/lib/jxinput-1.0.0.jar differ diff --git a/lib/source/jxinput-1.0.0-sources.jar b/lib/source/jxinput-1.0.0-sources.jar new file mode 100644 index 000000000..91975b643 Binary files /dev/null and b/lib/source/jxinput-1.0.0-sources.jar differ diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 5e0f6a677..22ce952d9 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -175,7 +175,7 @@ public class AppLoader implements ApplicationListener { public static TinyAlphNum fontSmallNumbers; /** A gamepad. Multiple gamepads may controll this single virtualised gamepad. */ - public static float gamepadDeadzone = 0.1f; + public static float gamepadDeadzone = 0.2f; /** * For the events depends on rendering frame (e.g. flicker on post-hit invincibility) diff --git a/src/net/torvald/terrarum/DefaultConfig.kt b/src/net/torvald/terrarum/DefaultConfig.kt index c1d9b8412..6fc043309 100644 --- a/src/net/torvald/terrarum/DefaultConfig.kt +++ b/src/net/torvald/terrarum/DefaultConfig.kt @@ -28,6 +28,8 @@ object DefaultConfig { // control-gamepad + jsonObject.addProperty("usexinput", true) // when FALSE, LT+RT input on xbox controller is impossible + jsonObject.addProperty("gamepadkeyn", 3) jsonObject.addProperty("gamepadkeyw", 2) jsonObject.addProperty("gamepadkeys", 0) @@ -38,6 +40,9 @@ object DefaultConfig { jsonObject.addProperty("gamepadselect", 6) jsonObject.addProperty("gamepadstart", 7) + jsonObject.addProperty("gamepadltrigger", 8) + jsonObject.addProperty("gamepadrtrigger", 9) + jsonObject.addProperty("gamepadlstickx", 1) jsonObject.addProperty("gamepadlsticky", 0) jsonObject.addProperty("gamepadrstickx", 3) diff --git a/src/net/torvald/terrarum/controller/GdxControllerAdapter.kt b/src/net/torvald/terrarum/controller/GdxControllerAdapter.kt new file mode 100644 index 000000000..fc1b2cce2 --- /dev/null +++ b/src/net/torvald/terrarum/controller/GdxControllerAdapter.kt @@ -0,0 +1,29 @@ +package net.torvald.terrarum.controller + +import com.badlogic.gdx.controllers.Controller + +/** + * Created by minjaesong on 2019-02-09. + */ +class GdxControllerAdapter(val c: Controller): TerrarumController { + + override fun getButton(index: Int): Boolean { + return c.getButton(index) + } + + override fun getAxis(index: Int): Float { + return c.getAxis(index) + } + + override fun getPov(): Int { + TODO() + } + + override fun getName(): String { + return c.name + } + + override fun setRumble(left: Float, right: Float) { + return + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/controller/TerrarumController.kt b/src/net/torvald/terrarum/controller/TerrarumController.kt new file mode 100644 index 000000000..7e99321b8 --- /dev/null +++ b/src/net/torvald/terrarum/controller/TerrarumController.kt @@ -0,0 +1,66 @@ +package net.torvald.terrarum.controller + +/** + * Created by minjaesong on 2019-02-09. + */ +interface TerrarumController { + + /** + * 0, 1, 2, 3 : A B X Y + * + * 4, 5 : L/R Shoulder + * + * 6, 7 : Back Start + * + * 8, 9 : L/R Trigger + * + * DirectInput devices may need external Index-to-button mapping (just a config file) + * + */ + fun getButton(index: Int): Boolean + + /** + * 0: Left Y + * + * 1: Left X + * + * 2: Right Y + * + * 3: Right X + * + * 4: Left Trigger + * + * 5: Right Trigger + * + * DirectInput devices may need external Index-to-button mapping (just a config file). + * + * Warning: Under DirectInput, Xbox controllers' LT and RT shares the same axis #4, and thus it's impossible to read LT+RT input. + * + * @return 0f..1f for the axis + */ + fun getAxis(index: Int): Float + + /** + * ``` + * 12 8 9 + * 4 0 1 + * 6 2 3 + * ``` + */ + fun getPov(): Int + fun getName(): String + + fun setRumble(left: Float, right: Float) + + companion object { + const val POV_E = 1 + const val POV_S = 2 + const val POV_W = 4 + const val POV_N = 8 + + const val POV_SE = POV_E or POV_S + const val POV_SW = POV_W or POV_S + const val POV_NW = POV_W or POV_N + const val POV_NE = POV_E or POV_N + } +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/controller/XinputControllerAdapter.kt b/src/net/torvald/terrarum/controller/XinputControllerAdapter.kt new file mode 100644 index 000000000..eec24281f --- /dev/null +++ b/src/net/torvald/terrarum/controller/XinputControllerAdapter.kt @@ -0,0 +1,78 @@ +package net.torvald.terrarum.controller + +import com.github.strikerx3.jxinput.XInputAxes +import com.github.strikerx3.jxinput.XInputDevice +import net.torvald.terrarum.AppLoader +import kotlin.math.roundToInt + +/** + * Created by minjaesong on 2019-02-09. + */ +class XinputControllerAdapter(val c: XInputDevice): TerrarumController { + + override fun getButton(index: Int): Boolean { + if (c.poll()) { + val button = c.components.buttons + + return when (index) { + 0 -> button.a + 1 -> button.b + 2 -> button.x + 3 -> button.y + 4 -> button.lShoulder + 5 -> button.rShoulder + 6 -> button.back + 7 -> button.start + 8 -> getAxis(4) >= AppLoader.gamepadDeadzone + 9 -> getAxis(5) >= AppLoader.gamepadDeadzone + else -> throw UnsupportedOperationException("Unknown button: $index") + } + } + return false + } + + override fun getAxis(index: Int): Float { + if (c.poll()) { + val axes = c.components.axes + + return when (index) { + 0 -> axes.ly + 1 -> axes.lx + 2 -> axes.ry + 3 -> axes.rx + 4 -> axes.lt + 5 -> axes.rt + else -> throw UnsupportedOperationException("Unknown axis: $index") + } + } + return -1f + } + + override fun getPov(): Int { + if (c.poll()) { + val axes = c.components.axes + + return when (axes.dpad) { + XInputAxes.DPAD_CENTER -> 0 + XInputAxes.DPAD_UP_LEFT -> TerrarumController.POV_NW + XInputAxes.DPAD_UP -> TerrarumController.POV_N + XInputAxes.DPAD_UP_RIGHT -> TerrarumController.POV_NE + XInputAxes.DPAD_RIGHT -> TerrarumController.POV_E + XInputAxes.DPAD_DOWN_RIGHT -> TerrarumController.POV_SE + XInputAxes.DPAD_DOWN -> TerrarumController.POV_S + XInputAxes.DPAD_DOWN_LEFT -> TerrarumController.POV_SW + XInputAxes.DPAD_LEFT -> TerrarumController.POV_W + else -> throw UnsupportedOperationException("Unknown pov: ${axes.dpad}") + } + } + return -1 + } + + override fun getName(): String { + return "(XInput Compatible)" + } + + override fun setRumble(left: Float, right: Float) { + c.setVibration((left * 65535f).roundToInt(), (right * 65535f).roundToInt()) + } +} diff --git a/src/net/torvald/terrarum/gamecontroller/IngameController.kt b/src/net/torvald/terrarum/gamecontroller/IngameController.kt index 5c41486ab..ceaafd66f 100644 --- a/src/net/torvald/terrarum/gamecontroller/IngameController.kt +++ b/src/net/torvald/terrarum/gamecontroller/IngameController.kt @@ -3,14 +3,11 @@ package net.torvald.terrarum.gamecontroller import com.badlogic.gdx.Gdx import com.badlogic.gdx.Input import com.badlogic.gdx.InputAdapter -import com.badlogic.gdx.controllers.Controller -import com.badlogic.gdx.controllers.ControllerListener import com.badlogic.gdx.controllers.Controllers -import com.badlogic.gdx.controllers.PovDirection -import com.badlogic.gdx.math.Vector3 import net.torvald.terrarum.AppLoader import net.torvald.terrarum.AppLoader.printdbg import net.torvald.terrarum.Terrarum +import net.torvald.terrarum.controller.TerrarumController import net.torvald.terrarum.floorInt import net.torvald.terrarum.gameactors.AVKey import net.torvald.terrarum.gameworld.fmod @@ -22,10 +19,12 @@ import net.torvald.terrarum.worlddrawer.WorldCamera /** * Created by minjaesong on 2015-12-31. */ -class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener { +class IngameController(val ingame: Ingame) : InputAdapter() { - var hasController = true + val hasGamepad: Boolean + get() = gamepad != null + var gamepad: TerrarumController? = null // these four values can also be accessed with GameContainer. // e.g. gc.mouseTileX @@ -45,7 +44,6 @@ class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener init { if (Controllers.getControllers().size == 0) { - hasController = false printdbg(this, "Controller not found") } } @@ -211,39 +209,4 @@ class IngameController(val ingame: Ingame) : InputAdapter(), ControllerListener return true } - override fun connected(p0: Controller?) { - hasController = true - } - - override fun buttonUp(p0: Controller?, p1: Int): Boolean { - return false - } - - override fun ySliderMoved(p0: Controller?, p1: Int, p2: Boolean): Boolean { - return false - } - - override fun accelerometerMoved(p0: Controller?, p1: Int, p2: Vector3?): Boolean { - return false - } - - override fun axisMoved(p0: Controller?, p1: Int, p2: Float): Boolean { - return false - } - - override fun disconnected(p0: Controller?) { - hasController = false - } - - override fun xSliderMoved(p0: Controller?, p1: Int, p2: Boolean): Boolean { - return false - } - - override fun povMoved(p0: Controller?, p1: Int, p2: PovDirection?): Boolean { - return false - } - - override fun buttonDown(p0: Controller?, p1: Int): Boolean { - return false - } } diff --git a/src/net/torvald/terrarum/modulebasegame/Ingame.kt b/src/net/torvald/terrarum/modulebasegame/Ingame.kt index 94f3d17a6..ef460b190 100644 --- a/src/net/torvald/terrarum/modulebasegame/Ingame.kt +++ b/src/net/torvald/terrarum/modulebasegame/Ingame.kt @@ -4,6 +4,7 @@ import com.badlogic.gdx.Gdx import com.badlogic.gdx.controllers.Controllers import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.g2d.SpriteBatch +import com.github.strikerx3.jxinput.XInputDevice import net.torvald.dataclass.CircularArray import net.torvald.terrarum.* import net.torvald.terrarum.AppLoader.printdbg @@ -11,6 +12,8 @@ import net.torvald.terrarum.blockproperties.BlockPropUtil import net.torvald.terrarum.blockstats.BlockStats import net.torvald.terrarum.concurrent.ThreadParallel import net.torvald.terrarum.console.Authenticator +import net.torvald.terrarum.controller.GdxControllerAdapter +import net.torvald.terrarum.controller.XinputControllerAdapter import net.torvald.terrarum.gameactors.Actor import net.torvald.terrarum.gameactors.ActorWithBody import net.torvald.terrarum.gamecontroller.IngameController @@ -269,7 +272,11 @@ open class Ingame(batch: SpriteBatch) : IngameInstance(batch) { // make controls work Gdx.input.inputProcessor = ingameController - Controllers.addListener(ingameController) + ingameController.gamepad = + if (AppLoader.getConfigBoolean("usexinput")) + XinputControllerAdapter(XInputDevice.getDeviceFor(0)) + else + GdxControllerAdapter(Controllers.getControllers()[0]) diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt index 51d9934ea..5c6f200bf 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/ActorHumanoid.kt @@ -1,7 +1,6 @@ package net.torvald.terrarum.modulebasegame.gameactors import com.badlogic.gdx.Gdx -import com.badlogic.gdx.controllers.Controllers import com.badlogic.gdx.graphics.Color import com.jme3.math.FastMath import net.torvald.spriteanimation.HasAssembledSprite @@ -226,9 +225,9 @@ open class ActorHumanoid( isRightDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyright")) isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump")) - if ((Terrarum.ingame as Ingame).ingameController.hasController) { - val gamepad = Controllers.getControllers()[0] + val gamepad = (Terrarum.ingame as Ingame).ingameController.gamepad + if (gamepad != null) { axisX = gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx")) axisY = gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky")) axisRX = gamepad.getAxis(AppLoader.getConfigInt("gamepadrstickx")) @@ -241,7 +240,7 @@ open class ActorHumanoid( if (Math.abs(axisRY) < AppLoader.gamepadDeadzone) axisRY = 0f isJumpDown = Gdx.input.isKeyPressed(AppLoader.getConfigInt("keyjump")) || - gamepad.getAxis(AppLoader.getConfigInt("gamepadtriggeraxis")) < -AppLoader.gamepadDeadzone + gamepad.getButton(AppLoader.getConfigInt("gamepadltrigger")) } } else { @@ -253,7 +252,7 @@ open class ActorHumanoid( } private inline val hasController: Boolean - get() = if (isGamer) (Terrarum.ingame as Ingame).ingameController.hasController + get() = if (isGamer) (Terrarum.ingame as Ingame).ingameController.hasGamepad else true private fun processInput(delta: Float) { diff --git a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt index 7ebe5eb53..6c1cfcdad 100644 --- a/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt +++ b/src/net/torvald/terrarum/ui/BasicDebugInfoWindow.kt @@ -1,13 +1,13 @@ package net.torvald.terrarum.ui import com.badlogic.gdx.Gdx -import com.badlogic.gdx.controllers.Controllers import com.badlogic.gdx.graphics.Camera import com.badlogic.gdx.graphics.Color import com.badlogic.gdx.graphics.g2d.SpriteBatch import net.torvald.terrarum.* import net.torvald.terrarum.Terrarum.mouseTileX import net.torvald.terrarum.Terrarum.mouseTileY +import net.torvald.terrarum.controller.TerrarumController import net.torvald.terrarum.gameworld.GameWorld import net.torvald.terrarum.modulebasegame.Ingame import net.torvald.terrarum.modulebasegame.gameworld.GameWorldExtension @@ -192,10 +192,9 @@ class BasicDebugInfoWindow : UICanvas() { batch.color = Color.WHITE - if ((Terrarum.ingame as? Ingame)?.ingameController?.hasController == true) { - val gamepad = Controllers.getControllers()[0] - - drawGamepadAxis(batch, + val gamepad = (Terrarum.ingame as? Ingame)?.ingameController?.gamepad + if (gamepad != null) { + drawGamepadAxis(gamepad, batch, gamepad.getAxis(AppLoader.getConfigInt("gamepadlstickx")), gamepad.getAxis(AppLoader.getConfigInt("gamepadlsticky")), Terrarum.WIDTH - 135, @@ -311,7 +310,7 @@ class BasicDebugInfoWindow : UICanvas() { blendNormal(batch) } - private fun drawGamepadAxis(batch: SpriteBatch, axisX: Float, axisY: Float, uiX: Int, uiY: Int) { + private fun drawGamepadAxis(gamepad: TerrarumController, batch: SpriteBatch, axisX: Float, axisY: Float, uiX: Int, uiY: Int) { val uiColour = ItemSlotImageFactory.CELLCOLOUR_BLACK val w = 128f val h = 128f @@ -319,11 +318,7 @@ class BasicDebugInfoWindow : UICanvas() { val halfH = h / 2f val pointDX = axisX * halfW - val pointDY = axisY * halfH - - val gamepad = Controllers.getControllers()[0] - val padName = if (gamepad.name.isEmpty()) "Gamepad" - else gamepad.name + val pointDY = -axisY * halfH blendNormal(batch) @@ -338,7 +333,7 @@ class BasicDebugInfoWindow : UICanvas() { } batch.begin() - Terrarum.fontSmallNumbers.draw(batch, padName, Terrarum.WIDTH - (padName.length) * 8f, uiY.toFloat() + h + 2) + Terrarum.fontSmallNumbers.draw(batch, gamepad.getName(), Terrarum.WIDTH - (gamepad.getName().length) * 8f, uiY.toFloat() + h + 2) } diff --git a/work_files/graphics/fonts/puae000-e0ff.psd b/work_files/graphics/fonts/puae000-e0ff.psd index e376379b4..aa5160e23 100644 --- a/work_files/graphics/fonts/puae000-e0ff.psd +++ b/work_files/graphics/fonts/puae000-e0ff.psd @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f6b85a5f4606fca51e23b65abe48e541b1390263f284ab687419dad6522deed3 -size 184648 +oid sha256:c12efa6e9d45aefc8f62f0a1a7c655d3dab168d9a627c080a532dac5cfaf3887 +size 191510