diff --git a/assets/graphics/gui/ui_config_keymap_keycap.tga b/assets/graphics/gui/ui_config_keymap_keycap.tga new file mode 100644 index 000000000..ac3774cfd --- /dev/null +++ b/assets/graphics/gui/ui_config_keymap_keycap.tga @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c345da16bae663dbd506ac4be32d60e0d2be27b61c0682ecd1f41be80a91aa7b +size 1580 diff --git a/assets/graphics/logo_placeholder.tga b/assets/graphics/logo_placeholder.tga index 36f402708..df958d1ff 100644 --- a/assets/graphics/logo_placeholder.tga +++ b/assets/graphics/logo_placeholder.tga @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b596174b933a3377a07853a9ef1fd89e39d23cf20efd6646add262afd19e25c5 -size 131090 +oid sha256:c155ce45a0a830fa2527f52c9533de3c8938aed4a76667f449bc274c3e331268 +size 65580 diff --git a/assets/graphics/logo_placeholder_noreflection.tga b/assets/graphics/logo_placeholder_noreflection.tga deleted file mode 100644 index 0e23748fd..000000000 --- a/assets/graphics/logo_placeholder_noreflection.tga +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6bb9c79adcebd4932729432c96dc609d00071ddd3e4f3b0a1dee4dd3e4b52238 -size 262162 diff --git a/assets/keylayout.json b/assets/keylayout.json deleted file mode 100644 index c1438f8dd..000000000 --- a/assets/keylayout.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "qwerty": { - "layout": "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./", - "capslock": "Caps", - "name": "QWERTY" - }, - "qwertz": { - "layout": "1234567890-=QWERTZUIOP[]ASDFGHJKL;'YXCVBNM,./", - "capslock": "Caps", - "name": "QWERTZ" - }, - "azerty": { - "layout": "1234567890-=AZERTYUIOP[]QSDFGHJKL;'WXCVBNM,./", - "capslock": "Caps", - "name": "AZERTY" - }, - "colemak": { - "layout": "1234567890-=QWFPGJLUY;[]ARSTDHNEIO'ZXCVBKM,./", - "capslock": "Back", - "name": "Colemak" - }, - "workman": { - "layout": "1234567890-=QDRWBJFUP;[]ASHTGYNEOI'ZXMCVKL,./", - "capslock": "Back", - "name": "Workman" - }, - "dvorak": { - "layout": "1234567890[]',.PYFGCRL/=AOEUIDHTNS-;QJKXBMWVZ", - "capslock": "Caps", - "name": "Dvorak" - }, - "bepo": { - "layout": "1234567890=%BÉPOÈ!VDLJZWAUIE,CTSRNMÀYX.K'QGHF", - "capslock": "Caps", - "name": "Bépo" - }, - "turk-f": { - "layout": "1234567890/-FGĞIODRNHPQWUİEAÜTKMLYŞJÖVCÇZSB.,", - "capslock": "Caps", - "name": "F klavye" - }, - "qwerty-jis-apple": { - "layout": "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./", - "capslock": "Ctrl", - "name": "Apple 日本語" - }, - "hhkb": { - "layout": "1234567890-=QWERTYUIOP[]ASDFGHJKL;'ZXCVBNM,./", - "capslock": "Ctrl", - "name": "HHKB2" - } -} \ No newline at end of file diff --git a/assets/keylayout/colemak.properties b/assets/keylayout/colemak.properties new file mode 100644 index 000000000..8391244c7 --- /dev/null +++ b/assets/keylayout/colemak.properties @@ -0,0 +1,6 @@ +layout_name=Colemak +ROW1=4s;4qNUM_1;4qNUM_2;4qNUM_3;4qNUM_4;4qNUM_5;4qNUM_6;4qNUM_7;4qNUM_8;4qNUM_9;4qNUM_0;4qMINUS;4qEQUALS;6qBACKSPACE +ROW2=6qTAB;4qQ;4qW;4qF;4qP;4qG;4qJ;4qL;4qU;4qY;4qSEMICOLON;4qLEFT_BRACKET;4qRIGHT_BRACKET;4qBACKSLASH +ROW3=7qCAPS_LOCK;4qA;4qR;4qS;4qT;4qD;4qH;4qN;4qE;4qI;4qO;4qAPOSTROPHE;7qENTER +ROW4=9qSHIFT_LEFT;4qZ;4qX;4qC;4qV;4qB;4qK;4qM;4qCOMMA;4qPERIOD;4qSLASH;9qSHIFT_RIGHT +ROW5=15s;28qSPACE diff --git a/assets/keylayout/dvorak.properties b/assets/keylayout/dvorak.properties new file mode 100644 index 000000000..be6375087 --- /dev/null +++ b/assets/keylayout/dvorak.properties @@ -0,0 +1,6 @@ +layout_name=Dvorak Simplified +ROW1=4s;4qNUM_1;4qNUM_2;4qNUM_3;4qNUM_4;4qNUM_5;4qNUM_6;4qNUM_7;4qNUM_8;4qNUM_9;4qNUM_0;4qLEFT_BRACKET;4qRIGHT_BRACKET;6qBACKSPACE +ROW2=6qTAB;4qAPOSTROPHE;4qCOMMA;4qPERIOD;4qP;4qY;4qF;4qG;4qC;4qR;4qL;4qSLASH;4qEQUALS;4qBACKSLASH +ROW3=7qCAPS_LOCK;4qA;4qO;4qE;4qU;4qI;4qD;4qH;4qT;4qN;4qS;4qMINUS;7qENTER +ROW4=9qSHIFT_LEFT;4qSEMICOLON;4qQ;4qJ;4qK;4qX;4qB;4qM;4qW;4qV;4qZ;9qSHIFT_RIGHT +ROW5=15s;28qSPACE diff --git a/assets/keylayout/malt89.properties b/assets/keylayout/malt89.properties new file mode 100644 index 000000000..c3aa94f25 --- /dev/null +++ b/assets/keylayout/malt89.properties @@ -0,0 +1,6 @@ +layout_name=Maltron 89 +ROW1=4qNUM_1;4qNUM_2;4qNUM_3;4qNUM_4;4qNUM_5;10s;4qNUM_6;4qNUM_7;4qNUM_8;4qNUM_9;4qNUM_0 +ROW2=4qQ;4qP;4qY;4qC;4qB;10s;4qV;4qM;4qU;4qZ;4qL +ROW3=4qA;4qN;4qI;4qS;4qF;10s;4qD;4qT;4qH;4qO;4qR +ROW4=4qCOMMA;4qPERIOD;4qJ;4qG;4qSEMICOLON;10s;4qAPOSTROPHE;4qW;4qK;4qX;4qNULL +ROW5=4qSHIFT_LEFT;4qBACKSLASH;4qLEFT_BRACKET;4qMINUS;3s;4qE;4s;4qENTER;3s;4qEQUALS;4qRIGHT_BACKET;4qSLASH;4qSHIFT_RIGHT diff --git a/assets/keylayout/qwerty.properties b/assets/keylayout/qwerty.properties new file mode 100644 index 000000000..705eba4ec --- /dev/null +++ b/assets/keylayout/qwerty.properties @@ -0,0 +1,13 @@ +! generic QWERTY keyboard + +! row format: (n)q(keyname) +! n: width of a key, 4 for regular key (1.0u). Value smaller than 4 will break the UI, so DON'T +! keyname: name of the key that is recognised by the UI parser. +! each key in the row is separated by one semicolon. + +layout_name=QWERTY +ROW1=4s;4qNUM_1;4qNUM_2;4qNUM_3;4qNUM_4;4qNUM_5;4qNUM_6;4qNUM_7;4qNUM_8;4qNUM_9;4qNUM_0;4qMINUS;4qEQUALS;6qBACKSPACE +ROW2=6qTAB;4qQ;4qW;4qE;4qR;4qT;4qY;4qU;4qI;4qO;4qP;4qLEFT_BRACKET;4qRIGHT_BRACKET;4qBACKSLASH +ROW3=7qCAPS_LOCK;4qA;4qS;4qD;4qF;4qG;4qH;4qJ;4qK;4qL;4qSEMICOLON;4qAPOSTROPHE;7qENTER +ROW4=9qSHIFT_LEFT;4qZ;4qX;4qC;4qV;4qB;4qN;4qM;4qCOMMA;4qPERIOD;4qSLASH;9qSHIFT_RIGHT +ROW5=15s;28qSPACE diff --git a/assets/reflect.frag b/assets/reflect.frag new file mode 100644 index 000000000..c88816242 --- /dev/null +++ b/assets/reflect.frag @@ -0,0 +1,9 @@ +varying vec4 v_color; +varying vec2 v_texCoords; +uniform sampler2D u_texture; + +void main(void) { + vec4 color = texture2D(u_texture, vec2(v_texCoords.x, 1.0 - v_texCoords.y)); + vec4 alphamul = vec4(1.0, 1.0, 1.0, 0.5 * (1.0 - v_texCoords.y)); + gl_FragColor = color * alphamul; +} \ No newline at end of file diff --git a/src/net/torvald/terrarum/AppLoader.java b/src/net/torvald/terrarum/AppLoader.java index 96b75903c..4a67bbe7c 100644 --- a/src/net/torvald/terrarum/AppLoader.java +++ b/src/net/torvald/terrarum/AppLoader.java @@ -217,6 +217,7 @@ public class AppLoader implements ApplicationListener { public static ShaderProgram shaderHicolour; public static ShaderProgram shaderPassthruRGB; public static ShaderProgram shaderColLUT; + public static ShaderProgram shaderReflect; public static Mesh fullscreenQuad; private static OrthographicCamera camera; @@ -388,6 +389,7 @@ public class AppLoader implements ApplicationListener { shaderHicolour = loadShader("assets/4096.vert", "assets/hicolour.frag"); shaderPassthruRGB = loadShader("assets/4096.vert", "assets/passthrurgb.frag"); shaderColLUT = loadShader("assets/4096.vert", "assets/passthrurgb.frag"); + shaderReflect = loadShader("assets/4096.vert", "assets/reflect.frag"); fullscreenQuad = new Mesh( true, 4, 6, @@ -561,18 +563,35 @@ public class AppLoader implements ApplicationListener { fullscreenQuad.render(shaderBayerSkyboxFill, GL20.GL_TRIANGLES); shaderBayerSkyboxFill.end(); - logoBatch.begin(); - logoBatch.setColor(Color.WHITE); - //blendNormal(); - logoBatch.setShader(null); setCameraPosition(0f, 0f); + int safetyTextLen = fontGame.getWidth(Lang.INSTANCE.get("APP_WARNING_HEALTH_AND_SAFETY")); + int logoPosX = (appConfig.width - logo.getRegionWidth() - safetyTextLen) >>> 1; + int logoPosY = Math.round(appConfig.height / 15f); + int textY = logoPosY + logo.getRegionHeight() - 16; + + // draw logo reflection + logoBatch.setShader(shaderReflect); + logoBatch.setColor(Color.WHITE); + logoBatch.begin(); + + if (getConfigBoolean("showhealthmessageonstartup")) { + logoBatch.draw(logo, logoPosX, logoPosY + logo.getRegionHeight()); + } + else { + logoBatch.draw(logo, (appConfig.width - logo.getRegionWidth()) / 2f, + (appConfig.height - logo.getRegionHeight() * 2) / 2f + logo.getRegionHeight() + ); + } + + logoBatch.end(); + + // draw health messages + logoBatch.setShader(null); + logoBatch.begin(); + if (getConfigBoolean("showhealthmessageonstartup")) { - int safetyTextLen = fontGame.getWidth(Lang.INSTANCE.get("APP_WARNING_HEALTH_AND_SAFETY")); - int logoPosX = (appConfig.width - logo.getRegionWidth() - safetyTextLen) >>> 1; - int logoPosY = Math.round(appConfig.height / 15f); - int textY = logoPosY + (logo.getRegionHeight() >>> 1) - 16; logoBatch.draw(logo, logoPosX, logoPosY); logoBatch.setColor(new Color(0x666666ff)); @@ -600,10 +619,11 @@ public class AppLoader implements ApplicationListener { int virtualHeightOffset = appConfig.height - virtualHeight; logoBatch.draw(tex1, (appConfig.width - tex1.getWidth()) >>> 1, virtualHeightOffset + (virtualHeight >>> 1) - 16, tex1.getWidth(), -tex1.getHeight()); logoBatch.draw(tex2, (appConfig.width - tex2.getWidth()) >>> 1, virtualHeightOffset + (virtualHeight >>> 1) + 16 + tex2.getHeight(), tex2.getWidth(), -tex2.getHeight()); + } else { logoBatch.draw(logo, (appConfig.width - logo.getRegionWidth()) / 2f, - (appConfig.height - logo.getRegionHeight()) / 2f + (appConfig.height - logo.getRegionHeight() * 2) / 2f ); } diff --git a/src/net/torvald/terrarum/TitleScreen.kt b/src/net/torvald/terrarum/TitleScreen.kt index 9c4686c3f..cc6e3e000 100644 --- a/src/net/torvald/terrarum/TitleScreen.kt +++ b/src/net/torvald/terrarum/TitleScreen.kt @@ -114,8 +114,6 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { private val gradWhiteBottom = Color(0xd8d8d8ff.toInt()) - lateinit var logo: TextureRegion - val uiContainer = ArrayList() private lateinit var uiMenu: UICanvas @@ -174,9 +172,6 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { initViewPort(AppLoader.screenW, AppLoader.screenH) - logo = TextureRegion(Texture(Gdx.files.internal("assets/graphics/logo_placeholder.tga"))) - logo.flip(false, true) - Gdx.input.inputProcessor = TitleScreenController(this) @@ -317,7 +312,6 @@ class TitleScreen(batch: SpriteBatch) : IngameInstance(batch) { } override fun dispose() { - logo.texture.dispose() uiMenu.dispose() demoWorld.dispose() } diff --git a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryEquippedView.kt b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryEquippedView.kt index 62b82a62e..3bee2dbcd 100644 --- a/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryEquippedView.kt +++ b/src/net/torvald/terrarum/modulebasegame/ui/UIItemInventoryEquippedView.kt @@ -44,7 +44,7 @@ class UIItemInventoryEquippedView( val spriteViewBackCol: Color = CELLCOLOUR_BLACK - private val equipPosIcon = TextureRegionPack("./assets/graphics/gui/inventory/equip_position.tga", 18, 18) + private val equipPosIcon = CommonResourcePool.getAsTextureRegionPack("inventory_caticons") private val cellToIcon = intArrayOf(0,1,2,3,4,5,6,7,6,7,6,7) private val equipPosIconCol = Color(0xdddddd7f.toInt()) @@ -107,7 +107,7 @@ class UIItemInventoryEquippedView( cell.render(batch, camera) if (cell.item == null) { batch.color = equipPosIconCol - batch.draw(equipPosIcon.get(cellToIcon[index], 0), 15f + cell.posX, 15f + cell.posY) + batch.draw(equipPosIcon.get(cellToIcon[index], 1), 15f + cell.posX, 15f + cell.posY) } } diff --git a/src/net/torvald/terrarum/tests/KeyLayoutParserTest.kt b/src/net/torvald/terrarum/tests/KeyLayoutParserTest.kt new file mode 100644 index 000000000..8ffc003b8 --- /dev/null +++ b/src/net/torvald/terrarum/tests/KeyLayoutParserTest.kt @@ -0,0 +1,235 @@ +package net.torvald.terrarum.tests + +import com.badlogic.gdx.Gdx +import com.badlogic.gdx.Input +import java.io.FileReader +import java.lang.StringBuilder +import java.util.* +import kotlin.collections.ArrayList + +fun main() { + val prop = Properties() + prop.load(FileReader("./assets/keylayout/colemak.properties")) + val layout = KeyboardLayout(prop) + + layout.drawToASCII() +} + +class KeyboardLayout(layoutDesc: Properties) { + data class Keycap(val width: Int, val label: String, val keycode: Int, val isSpace: Boolean, val isBlockedKey: Boolean) + + val keys = Array(5) { rowNum -> + val rowNum = rowNum + 1 + val eachKeys = ArrayList() + + (layoutDesc["ROW$rowNum"] ?: "").toString().split(';').forEach { + // text parsing machine + val _size = StringBuilder() + val _keyID = StringBuilder() + var isSpace = false + var delimiterLatched = false + it.forEachIndexed { index, c -> + if (!delimiterLatched && (c == 'q' || c == 's')) { + delimiterLatched = true + + if (c == 's') isSpace = true + } + else if (!delimiterLatched) { + _size.append(c) + } + else { + _keyID.append(c) + } + } + + val size = _size.toString().toInt() + val keyID = _keyID.toString() + + eachKeys.add(Keycap(size, toLabel(keyID), toKeycode(keyID), isSpace, keyID == "NULL")) + } + + eachKeys.toTypedArray() + } + + internal fun drawToASCII() { + keys.forEach { row -> + row.forEach { + for (c in -1 until it.width - 1) { + if (c == -1 && !it.isSpace) { + print("|") + } + else { + if (it.isBlockedKey) { + print("#") + } + else { + try { + print(it.label[c]) + } + catch (_: IndexOutOfBoundsException) { + print(" ") + } + } + } + } + + } + + println("|") + + } + } + + private fun toLabel(keyID: String) = when (keyID) { + "" -> " " + "MINUS" -> "-" + "EQUAL" -> "=" + "QUOTE" -> "\"" + "SEMICOLON" -> ";" + "LEFT_BRACKET" -> "[" + "RIGHT_BRACKET" -> "]" + "COMMA" -> "," + "PERIOD" -> "." + "SLASH" -> "/" + "BACKSLASH" -> "\\" + else -> keyID + } + private fun toKeycode(keyID: String) = when (keyID) { + else -> 10 + } +} + +// NOTE: this keydict does NOT have numpad_0..numpad_9 +val keyDict = arrayOf( // arrayOf(keyID, keycode, keylabel(CP437)) + arrayOf("NUM_0", Input.Keys.NUM_0, "0"), // use toUppercase() if necessary + arrayOf("NUM_1", Input.Keys.NUM_1, "1"), + arrayOf("NUM_2", Input.Keys.NUM_2, "2"), + arrayOf("NUM_3", Input.Keys.NUM_3, "3"), + arrayOf("NUM_4", Input.Keys.NUM_4, "4"), + arrayOf("NUM_5", Input.Keys.NUM_5, "5"), + arrayOf("NUM_6", Input.Keys.NUM_6, "6"), + arrayOf("NUM_7", Input.Keys.NUM_7, "7"), + arrayOf("NUM_8", Input.Keys.NUM_8, "8"), + arrayOf("NUM_9", Input.Keys.NUM_9, "9"), + arrayOf("A", Input.Keys.A, "A"), + arrayOf("ALT_LEFT", Input.Keys.ALT_LEFT, "Alt"), + arrayOf("ALT_RIGHT", Input.Keys.ALT_RIGHT, "Alt"), + arrayOf("APOSTROPHE", Input.Keys.APOSTROPHE, "'"), + arrayOf("AT", Input.Keys.AT, "@"), + arrayOf("B", Input.Keys.B, "B"), + arrayOf("BACK", Input.Keys.BACK, "Back"), + arrayOf("BACKSLASH", Input.Keys.BACKSLASH, "\\"), + arrayOf("C", Input.Keys.C, "C"), + arrayOf("CALL", Input.Keys.CALL, "Call"), + arrayOf("CAMERA", Input.Keys.CAMERA, "Cam"), + arrayOf("CLEAR", Input.Keys.CLEAR, "Clear"), + arrayOf("COMMA", Input.Keys.COMMA, "Comma"), + arrayOf("D", Input.Keys.D, "D"), + arrayOf("DEL", Input.Keys.DEL, "Del"), + arrayOf("BACKSPACE", Input.Keys.BACKSPACE, "Bksp"), + arrayOf("FORWARD_DEL", Input.Keys.FORWARD_DEL, "Del"), + arrayOf("DPAD_CENTER", Input.Keys.DPAD_CENTER, "_"), + arrayOf("DPAD_DOWN", Input.Keys.DPAD_DOWN, "_"), + arrayOf("DPAD_LEFT", Input.Keys.DPAD_LEFT, "_"), + arrayOf("DPAD_RIGHT", Input.Keys.DPAD_RIGHT, "_"), + arrayOf("DPAD_UP", Input.Keys.DPAD_UP, "_"), + arrayOf("CENTER", Input.Keys.CENTER, "_"), + arrayOf("DOWN", Input.Keys.DOWN, "${0x19.toChar()}"), + arrayOf("LEFT", Input.Keys.LEFT, "${0x1B.toChar()}"), + arrayOf("RIGHT", Input.Keys.RIGHT, "${0x1A.toChar()}"), + arrayOf("UP", Input.Keys.UP, "${0x18.toChar()}"), + arrayOf("E", Input.Keys.E, "E"), + arrayOf("ENDCALL", Input.Keys.ENDCALL, "EndCall"), + arrayOf("ENTER", Input.Keys.ENTER, "Enter"), + arrayOf("ENVELOPE", Input.Keys.ENVELOPE, "Mail"), + arrayOf("EQUALS", Input.Keys.EQUALS, "="), + arrayOf("EXPLORER", Input.Keys.EXPLORER, "Expl"), + arrayOf("F", Input.Keys.F, "F"), + arrayOf("FOCUS", Input.Keys.FOCUS, "Focus"), + arrayOf("G", Input.Keys.G, "G"), + arrayOf("GRAVE", Input.Keys.GRAVE, "`"), + arrayOf("H", Input.Keys.H, "H"), + arrayOf("HEADSETHOOK", Input.Keys.HEADSETHOOK, "Headset"), + arrayOf("HOME", Input.Keys.HOME, "Home"), + arrayOf("I", Input.Keys.I, "I"), + arrayOf("J", Input.Keys.J, "J"), + arrayOf("K", Input.Keys.K, "K"), + arrayOf("L", Input.Keys.L, "L"), + arrayOf("LEFT_BRACKET", Input.Keys.LEFT_BRACKET, "["), + arrayOf("M", Input.Keys.M, "M"), + arrayOf("MEDIA_FAST_FORWARD", Input.Keys.MEDIA_FAST_FORWARD, "${0x10.toChar()}${0x10.toChar()}"), + arrayOf("MEDIA_NEXT", Input.Keys.MEDIA_NEXT, "Next"), + arrayOf("MEDIA_PLAY_PAUSE", Input.Keys.MEDIA_PLAY_PAUSE, "${0x10.toChar()}"), + arrayOf("MEDIA_PREVIOUS", Input.Keys.MEDIA_PREVIOUS, "Prev"), + arrayOf("MEDIA_REWIND", Input.Keys.MEDIA_REWIND, "${0x11.toChar()}${0x11.toChar()}"), + arrayOf("MEDIA_STOP", Input.Keys.MEDIA_STOP, "${0xFE.toChar()}"), + arrayOf("MENU", Input.Keys.MENU, "${0xF0.toChar()}"), + arrayOf("MINUS", Input.Keys.MINUS, "-"), + arrayOf("MUTE", Input.Keys.MUTE, "Mute"), + arrayOf("N", Input.Keys.N, "M"), + arrayOf("NOTIFICATION", Input.Keys.NOTIFICATION, "Notif"), + arrayOf("NUM", Input.Keys.NUM, "Num"), + arrayOf("O", Input.Keys.O, "O"), + arrayOf("P", Input.Keys.P, "P"), + arrayOf("PERIOD", Input.Keys.PERIOD, "."), + arrayOf("PLUS", Input.Keys.PLUS, "+"), + arrayOf("POUND", Input.Keys.POUND, "#"), + arrayOf("POWER", Input.Keys.POWER, "Pwr"), + arrayOf("Q", Input.Keys.Q, "Q"), + arrayOf("R", Input.Keys.R, "R"), + arrayOf("RIGHT_BRACKET", Input.Keys.RIGHT_BRACKET, "]"), + arrayOf("S", Input.Keys.S, "S"), + arrayOf("SEARCH", Input.Keys.SEARCH, "Find"), + arrayOf("SEMICOLON", Input.Keys.SEMICOLON, ";"), + arrayOf("SHIFT_LEFT", Input.Keys.SHIFT_LEFT, "Shift"), + arrayOf("SHIFT_RIGHT", Input.Keys.SHIFT_RIGHT, "Shift"), + arrayOf("SLASH", Input.Keys.SLASH, "/"), + arrayOf("SOFT_LEFT", Input.Keys.SOFT_LEFT, "S${0x1B.toChar()}"), + arrayOf("SOFT_RIGHT", Input.Keys.SOFT_RIGHT, "S${0x1A.toChar()}"), + arrayOf("SPACE", Input.Keys.SPACE, " "), + arrayOf("STAR", Input.Keys.STAR, "*"), + arrayOf("SYM", Input.Keys.SYM, "Sym"), + arrayOf("T", Input.Keys.T, "T"), + arrayOf("TAB", Input.Keys.TAB, "Tab"), + arrayOf("U", Input.Keys.U, "U"), + arrayOf("UNKNOWN", Input.Keys.UNKNOWN, "??"), + arrayOf("V", Input.Keys.V, "V"), + arrayOf("VOLUME_DOWN", Input.Keys.VOLUME_DOWN, "V-"), + arrayOf("VOLUME_UP", Input.Keys.VOLUME_UP, "V+"), + arrayOf("W", Input.Keys.W, "W"), + arrayOf("X", Input.Keys.X, "X"), + arrayOf("Y", Input.Keys.Y, "Y"), + arrayOf("Z", Input.Keys.Z, "Z"), + arrayOf("META_ALT_LEFT_ON", Input.Keys.META_ALT_LEFT_ON, "_"), + arrayOf("META_ALT_ON", Input.Keys.META_ALT_ON, "_"), + arrayOf("META_ALT_RIGHT_ON", Input.Keys.META_ALT_RIGHT_ON, "_"), + arrayOf("META_SHIFT_LEFT_ON", Input.Keys.META_SHIFT_LEFT_ON, "_"), + arrayOf("META_SHIFT_ON", Input.Keys.META_SHIFT_ON, "_"), + arrayOf("META_SHIFT_RIGHT_ON", Input.Keys.META_SHIFT_RIGHT_ON, "_"), + arrayOf("META_SYM_ON", Input.Keys.META_SYM_ON, "_"), + arrayOf("CONTROL_LEFT", Input.Keys.CONTROL_LEFT, "Ctr"), + arrayOf("CONTROL_RIGHT", Input.Keys.CONTROL_RIGHT, "Ctr"), + arrayOf("ESCAPE", Input.Keys.ESCAPE, "Esc"), + arrayOf("END", Input.Keys.END, "End"), + arrayOf("INSERT", Input.Keys.INSERT, "Ins"), + arrayOf("PAGE_UP", Input.Keys.PAGE_UP, "P${0x18.toChar()}"), + arrayOf("PAGE_DOWN", Input.Keys.PAGE_DOWN, "P${0x19.toChar()}"), + arrayOf("PICTSYMBOLS", Input.Keys.PICTSYMBOLS, "_"), + arrayOf("SWITCH_CHARSET", Input.Keys.SWITCH_CHARSET, "Lang"), + arrayOf("BUTTON_CIRCLE", Input.Keys.BUTTON_CIRCLE, "_"), + arrayOf("BUTTON_A", Input.Keys.BUTTON_A, "_"), + arrayOf("BUTTON_B", Input.Keys.BUTTON_B, "_"), + arrayOf("BUTTON_C", Input.Keys.BUTTON_C, "_"), + arrayOf("BUTTON_X", Input.Keys.BUTTON_X, "_"), + arrayOf("BUTTON_Y", Input.Keys.BUTTON_Y, "_"), + arrayOf("BUTTON_Z", Input.Keys.BUTTON_Z, "_"), + arrayOf("BUTTON_L1", Input.Keys.BUTTON_L1, "_"), + arrayOf("BUTTON_R1", Input.Keys.BUTTON_R1, "_"), + arrayOf("BUTTON_L2", Input.Keys.BUTTON_L2, "_"), + arrayOf("BUTTON_R2", Input.Keys.BUTTON_R2, "_"), + arrayOf("BUTTON_THUMBL", Input.Keys.BUTTON_THUMBL, "_"), + arrayOf("BUTTON_THUMBR", Input.Keys.BUTTON_THUMBR, "_"), + arrayOf("BUTTON_START", Input.Keys.BUTTON_START, "_"), + arrayOf("BUTTON_SELECT", Input.Keys.BUTTON_SELECT, "_"), + arrayOf("BUTTON_MODE", Input.Keys.BUTTON_MODE, "_") +) \ No newline at end of file