From b4739b766dbd19e36568bf9af034b527137e9ae1 Mon Sep 17 00:00:00 2001 From: Evan Debenham Date: Mon, 16 Dec 2019 16:49:19 -0500 Subject: [PATCH] v0.8.0: added an initial window for key bindings, more work needed --- .../java/com/watabou/input/GameAction.java | 2 + .../java/com/watabou/input/KeyBindings.java | 29 ++- .../shatteredpixeldungeon/SPDAction.java | 50 ++-- .../ShatteredPixelDungeon.java | 2 +- .../scenes/CellSelector.java | 3 - .../windows/WndKeyBindings.java | 217 ++++++++++++++++++ .../windows/WndSettings.java | 15 +- .../messages/windows/windows.properties | 36 +++ 8 files changed, 327 insertions(+), 27 deletions(-) create mode 100644 core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKeyBindings.java diff --git a/SPD-classes/src/main/java/com/watabou/input/GameAction.java b/SPD-classes/src/main/java/com/watabou/input/GameAction.java index 2985fcea5..3958b529f 100644 --- a/SPD-classes/src/main/java/com/watabou/input/GameAction.java +++ b/SPD-classes/src/main/java/com/watabou/input/GameAction.java @@ -28,4 +28,6 @@ public class GameAction { public static final int BACK = 1; public static final int MENU = 2; + public static final int TOTAL_ACTIONS = 3; + } diff --git a/SPD-classes/src/main/java/com/watabou/input/KeyBindings.java b/SPD-classes/src/main/java/com/watabou/input/KeyBindings.java index 239ffef82..3e06604b9 100644 --- a/SPD-classes/src/main/java/com/watabou/input/KeyBindings.java +++ b/SPD-classes/src/main/java/com/watabou/input/KeyBindings.java @@ -21,11 +21,16 @@ package com.watabou.input; -import java.util.HashMap; +import com.badlogic.gdx.Input; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; + +//TODO maybe just move to game action? public class KeyBindings { - private static HashMap bindings = new HashMap<>(); + private static LinkedHashMap bindings = new LinkedHashMap<>(); private static HashMap names = new HashMap<>(); public static void addBinding( int keyCode, int keyAction){ @@ -40,6 +45,26 @@ public class KeyBindings { return bindings.get( event.code ); } + public static ArrayList getBindings( int gameAction ){ + ArrayList result = new ArrayList<>(); + for( int i : bindings.keySet()){ + if (bindings.get(i) == gameAction){ + result.add(i); + } + } + return result; + } + + public static String getKeyName( int keyCode ){ + String result = Input.Keys.toString(keyCode); + + if (result.equals("Plus")){ + return "+"; + } else { + return result; + } + } + public static void addName( int keyAction, String name ){ names.put(keyAction, name); } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java index 3a510cfd8..49d0dbea9 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/SPDAction.java @@ -54,18 +54,19 @@ public class SPDAction extends GameAction { public static final int ZOOM_IN = 17; public static final int ZOOM_OUT = 18; - public static final int ZOOM_DEFAULT= 19; - public static final int N = 20; - public static final int NE = 21; - public static final int E = 22; - public static final int SE = 23; - public static final int S = 24; + public static final int N = 19; + public static final int E = 20; + public static final int S = 21; + public static final int W = 22; + public static final int NE = 23; + public static final int SE = 24; public static final int SW = 25; - public static final int W = 26; - public static final int NW = 27; + public static final int NW = 26; - public static void initialize() { + public static final int TOTAL_ACTIONS = 27; + + public static void initDefaults() { KeyBindings.addName(NONE, "none"); @@ -92,16 +93,15 @@ public class SPDAction extends GameAction { KeyBindings.addName(ZOOM_IN, "zoom_in"); KeyBindings.addName(ZOOM_OUT, "zoom_out"); - KeyBindings.addName(ZOOM_DEFAULT, "zoom_default"); - KeyBindings.addName(N, "none"); - KeyBindings.addName(NE, "none"); - KeyBindings.addName(E, "none"); - KeyBindings.addName(SE, "none"); - KeyBindings.addName(S, "none"); - KeyBindings.addName(SW, "none"); - KeyBindings.addName(W, "none"); - KeyBindings.addName(NW, "none"); + KeyBindings.addName(N, "n"); + KeyBindings.addName(E, "e"); + KeyBindings.addName(S, "s"); + KeyBindings.addName(W, "w"); + KeyBindings.addName(NE, "ne"); + KeyBindings.addName(SE, "se"); + KeyBindings.addName(SW, "sw"); + KeyBindings.addName(NW, "nw"); //default key bindings KeyBindings.addBinding( Input.Keys.BACK, GameAction.BACK ); @@ -110,7 +110,6 @@ public class SPDAction extends GameAction { KeyBindings.addBinding( Input.Keys.H, SPDAction.HERO_INFO ); KeyBindings.addBinding( Input.Keys.J, SPDAction.JOURNAL ); - KeyBindings.addBinding( Input.Keys.NUMPAD_5, SPDAction.WAIT ); KeyBindings.addBinding( Input.Keys.SPACE, SPDAction.WAIT ); KeyBindings.addBinding( Input.Keys.S, SPDAction.SEARCH ); @@ -129,12 +128,13 @@ public class SPDAction extends GameAction { KeyBindings.addBinding( Input.Keys.PLUS, SPDAction.ZOOM_IN ); KeyBindings.addBinding( Input.Keys.EQUALS, SPDAction.ZOOM_IN ); KeyBindings.addBinding( Input.Keys.MINUS, SPDAction.ZOOM_OUT ); - KeyBindings.addBinding( Input.Keys.SLASH, SPDAction.ZOOM_DEFAULT ); KeyBindings.addBinding( Input.Keys.UP, SPDAction.N ); KeyBindings.addBinding( Input.Keys.RIGHT, SPDAction.E ); KeyBindings.addBinding( Input.Keys.DOWN, SPDAction.S ); KeyBindings.addBinding( Input.Keys.LEFT, SPDAction.W ); + + KeyBindings.addBinding( Input.Keys.NUMPAD_5, SPDAction.WAIT ); KeyBindings.addBinding( Input.Keys.NUMPAD_8, SPDAction.N ); KeyBindings.addBinding( Input.Keys.NUMPAD_9, SPDAction.NE ); KeyBindings.addBinding( Input.Keys.NUMPAD_6, SPDAction.E ); @@ -146,4 +146,14 @@ public class SPDAction extends GameAction { } + //file name? perhaps + + public static void loadBindings(){ + + } + + public static void saveBindings(){ + + } + } diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java index 969c30d3b..e0df0b76e 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/ShatteredPixelDungeon.java @@ -132,7 +132,7 @@ public class ShatteredPixelDungeon extends Game { super.create(); updateSystemUI(); - SPDAction.initialize(); + SPDAction.initDefaults(); Music.INSTANCE.enable( SPDSettings.music() ); Music.INSTANCE.volume( SPDSettings.musicVol()/10f ); diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java index 935d7c64e..983e548f5 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/scenes/CellSelector.java @@ -228,9 +228,6 @@ public class CellSelector extends ScrollArea { case SPDAction.ZOOM_OUT: zoom( camera.zoom-1 ); return true; - case SPDAction.ZOOM_DEFAULT: - zoom( PixelScene.defaultZoom ); - return true; } } } else if (moveFromKey(action)) { diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKeyBindings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKeyBindings.java new file mode 100644 index 000000000..b99bcf62c --- /dev/null +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndKeyBindings.java @@ -0,0 +1,217 @@ +/* + * Pixel Dungeon + * Copyright (C) 2012-2015 Oleg Dolya + * + * Shattered Pixel Dungeon + * Copyright (C) 2014-2019 Evan Debenham + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ + +package com.shatteredpixel.shatteredpixeldungeon.windows; + +import com.shatteredpixel.shatteredpixeldungeon.SPDAction; +import com.shatteredpixel.shatteredpixeldungeon.messages.Messages; +import com.shatteredpixel.shatteredpixeldungeon.scenes.PixelScene; +import com.shatteredpixel.shatteredpixeldungeon.ui.RedButton; +import com.shatteredpixel.shatteredpixeldungeon.ui.RenderedTextBlock; +import com.shatteredpixel.shatteredpixeldungeon.ui.ScrollPane; +import com.shatteredpixel.shatteredpixeldungeon.ui.Window; +import com.watabou.input.KeyBindings; +import com.watabou.noosa.ColorBlock; +import com.watabou.noosa.ui.Component; + +import java.util.ArrayList; + +public class WndKeyBindings extends Window { + + private static final int WIDTH = 120; + + private static final int TTL_HEIGHT = 16; + + private static final int COL1_CENTER = WIDTH/4; + private static final int COL2_CENTER = 5*WIDTH/8; + private static final int COL3_CENTER = 7*WIDTH/8; + + private Component bindingsList; + + public WndKeyBindings() { + + resize(WIDTH, Math.min(340, PixelScene.uiCamera.height-20)); + + RenderedTextBlock ttlAction = PixelScene.renderTextBlock(Messages.get(this, "ttl_action"), 9); + ttlAction.setPos( COL1_CENTER - ttlAction.width()/2, (TTL_HEIGHT - ttlAction.height())/2); + add(ttlAction); + + ColorBlock ttlSep1 = new ColorBlock(1, TTL_HEIGHT, 0xFF222222); + ttlSep1.x = WIDTH/2; + add(ttlSep1); + + RenderedTextBlock ttlKey1 = PixelScene.renderTextBlock(Messages.get(this, "ttl_key1"), 9); + ttlKey1.setPos(COL2_CENTER - ttlKey1.width()/2, (TTL_HEIGHT - ttlKey1.height())/2); + add(ttlKey1); + + ColorBlock ttlSep2 = new ColorBlock(1, TTL_HEIGHT, 0xFF222222); + ttlSep2.x = 3*WIDTH/4; + add(ttlSep2); + + RenderedTextBlock ttlKey2 = PixelScene.renderTextBlock(Messages.get(this, "ttl_key2"), 9); + ttlKey2.setPos(COL3_CENTER - ttlKey2.width()/2, (TTL_HEIGHT - ttlKey2.height())/2); + add(ttlKey2); + + ColorBlock ttlSep3 = new ColorBlock(WIDTH, 1, 0xFF222222); + ttlSep3.y = TTL_HEIGHT; + add(ttlSep3); + + bindingsList = new Component(); + + ScrollPane scrollingList = new ScrollPane(bindingsList){ + @Override + public void onClick(float x, float y) { + //TODO + } + }; + + add(scrollingList); + + int y = 0; + //start at 3. No bindings for NONE, BACK, and MENU. + for (int action = 3; action < SPDAction.TOTAL_ACTIONS; action++){ + BindingListItem item = new BindingListItem(action); + item.setRect(0, y, WIDTH, 12); + bindingsList.add(item); + y += item.height(); + } + bindingsList.setSize(WIDTH, y); + + RedButton btnDefaults = new RedButton(Messages.get(this, "default"), 9){ + @Override + protected void onClick() { + //TODO reset to default functionality + } + }; + btnDefaults.setRect(0, height - TTL_HEIGHT*2 -1, WIDTH, TTL_HEIGHT); + add(btnDefaults); + + RedButton btnConfirm = new RedButton(Messages.get(this, "confirm"), 9){ + @Override + protected void onClick() { + //TODO save changed bindings + hide(); + } + }; + btnConfirm.setRect(0, height - TTL_HEIGHT, WIDTH/2 - 1, TTL_HEIGHT); + add(btnConfirm); + + RedButton btnCancel = new RedButton(Messages.get(this, "cancel"), 9){ + @Override + protected void onClick() { + hide(); //close and don't save + } + }; + btnCancel.setRect(WIDTH/2, height - TTL_HEIGHT, WIDTH/2, TTL_HEIGHT); + add(btnCancel); + + scrollingList.setRect(0, TTL_HEIGHT+1, WIDTH, btnDefaults.top()-TTL_HEIGHT-1); + + } + + @Override + public void onBackPressed() { + //do nothing, avoids accidental back presses which would lose progress. + } + + private class BindingListItem extends Component { + + private static final int CHANGED = TITLE_COLOR; + private static final int DEFAULT = 0xFFFFFF; + private static final int UNBOUND = 0x888888; + + private int gameAction; + private int key1; + private int key2; + + private RenderedTextBlock actionName; + private RenderedTextBlock key1Name; + private RenderedTextBlock key2Name; + + private ColorBlock sep1; + private ColorBlock sep2; + private ColorBlock sep3; + + public BindingListItem( int action ){ + gameAction = action; + + actionName = PixelScene.renderTextBlock(Messages.get(WndKeyBindings.class, KeyBindings.getName(action)), 6 ); + actionName.setHightlighting(false); + add(actionName); + + ArrayList keys = KeyBindings.getBindings(action); + + if (keys.size() >= 1){ + key1Name = PixelScene.renderTextBlock( KeyBindings.getKeyName(keys.get(0)), 6 ); + key1 = keys.get(0); + } else { + key1Name = PixelScene.renderTextBlock( Messages.get(WndKeyBindings.class, "unbound"), 6 ); + key1Name.hardlight(UNBOUND); + key1 = SPDAction.NONE; + } + add(key1Name); + + if (keys.size() >= 2){ + key2Name = PixelScene.renderTextBlock( KeyBindings.getKeyName(keys.get(1)), 6 ); + key2 = keys.get(1); + } else { + key2Name = PixelScene.renderTextBlock( Messages.get(WndKeyBindings.class, "unbound"), 6 ); + key2Name.hardlight(UNBOUND); + key2 = SPDAction.NONE; + } + add(key2Name); + + sep1 = new ColorBlock(1, 1, 0xFF222222); + add(sep1); + + sep2 = new ColorBlock(1, 1, 0xFF222222); + add(sep2); + + sep3 = new ColorBlock(1, 1, 0xFF222222); + add(sep3); + } + + @Override + protected void layout() { + super.layout(); + + actionName.setPos( x, y + (height() - actionName.height())/2); + key1Name.setPos(x + width()/2 + 2, y + (height() - key1Name.height())/2); + key2Name.setPos(x + 3*width()/4 + 2, y + (height() - key2Name.height())/2); + + sep1.size(width, 1); + sep1.x = x; + sep1.y = bottom(); + + sep2.size(1, height); + sep2.x = key1Name.left()-2; + sep2.y = y; + + sep3.size(1, height); + sep3.x = key2Name.left()-2; + sep3.y = y; + } + + //onclick opens a new window depending on whether you pressed key 1 or 2. + //give you the option to change that binding by pressing a key, then lets your confirm/cancel/unbind + //warns you if a new binding conflicts with an old one + } +} diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java index 129e7f07f..3db98c228 100644 --- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java +++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/windows/WndSettings.java @@ -280,7 +280,7 @@ public class WndSettings extends WndTabbed { SPDSettings.fullscreen(checked()); } }; - chkFullscreen.setRect( 0, chkFlipTags.bottom() + GAP_LRG, WIDTH, BTN_HEIGHT ); + chkFullscreen.setRect( 0, chkFlipTags.bottom() + GAP_SML, WIDTH, BTN_HEIGHT ); chkFullscreen.checked(SPDSettings.fullscreen()); chkFullscreen.enable(DeviceCompat.supportsFullScreen()); add(chkFullscreen); @@ -305,6 +305,19 @@ public class WndSettings extends WndTabbed { chkFont.setRect(0, chkFullscreen.bottom() + GAP_TINY, WIDTH, BTN_HEIGHT); chkFont.checked(SPDSettings.systemFont()); add(chkFont); + + if (DeviceCompat.isDesktop()){ + RedButton btnKeyBindings = new RedButton(Messages.get(this, "key_bindings")){ + @Override + protected void onClick() { + super.onClick(); + ShatteredPixelDungeon.scene().addToFront(new WndKeyBindings()); + } + }; + + btnKeyBindings.setRect(0, chkFont.bottom() + GAP_SML, WIDTH, BTN_HEIGHT); + add(btnKeyBindings); + } } } diff --git a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties index 983f62b2e..75babac73 100644 --- a/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties +++ b/core/src/main/resources/com/shatteredpixel/shatteredpixeldungeon/messages/windows/windows.properties @@ -59,6 +59,41 @@ windows.wndjournal$guidetab$guideitem.missing=page missing windows.wndjournal$notestab.keys=Keys windows.wndjournal$notestab.landmarks=Landmarks +windows.wndkeybindings.ttl_action=Action +windows.wndkeybindings.ttl_key1=Key 1 +windows.wndkeybindings.ttl_key2=Key 2 +windows.wndkeybindings.default=Default Bindings +windows.wndkeybindings.confirm=Confirm +windows.wndkeybindings.cancel=Cancel +windows.wndkeybindings.unbound=Unbound +windows.wndkeybindings.none=None +windows.wndkeybindings.back=Back +windows.wndkeybindings.menu=Menu +windows.wndkeybindings.hero_info=Hero Info +windows.wndkeybindings.journal=Journal +windows.wndkeybindings.wait=Wait +windows.wndkeybindings.search=Search +windows.wndkeybindings.inventory=Inventory +windows.wndkeybindings.quickslot_1=Quickslot 1 +windows.wndkeybindings.quickslot_2=Quickslot 2 +windows.wndkeybindings.quickslot_3=Quickslot 3 +windows.wndkeybindings.quickslot_4=Quickslot 4 +windows.wndkeybindings.tag_attack=Attack Enemy +windows.wndkeybindings.tag_danger=Switch Enemy +windows.wndkeybindings.tag_action=Special Action +windows.wndkeybindings.tag_loot=Pickup Item +windows.wndkeybindings.tag_resume=Resume Motion +windows.wndkeybindings.zoom_in=Zoom In +windows.wndkeybindings.zoom_out=Zoom Out +windows.wndkeybindings.n=Go North +windows.wndkeybindings.e=Go East +windows.wndkeybindings.s=Go South +windows.wndkeybindings.w=Go West +windows.wndkeybindings.ne=Go NE +windows.wndkeybindings.se=Go SE +windows.wndkeybindings.sw=Go SW +windows.wndkeybindings.nw=Go NW + windows.wndlangs.completed=This language has been fully translated and reviewed. windows.wndlangs.unreviewed=This language has not yet been reviewed.\n\nIt may contain errors, but all text has been translated. windows.wndlangs.unfinished=This language has not been fully translated.\n\nLarge amounts of text may still be in English. @@ -123,6 +158,7 @@ windows.wndsettings$uitab.flip_indicators=Flip Indicators windows.wndsettings$uitab.quickslots=Quickslots windows.wndsettings$uitab.fullscreen=Fullscreen windows.wndsettings$uitab.system_font=System Font +windows.wndsettings$uitab.key_bindings=Key Bindings windows.wndsettings$audiotab.music_vol=Music Volume windows.wndsettings$audiotab.music_mute=Mute Music windows.wndsettings$audiotab.sfx_vol=SFX Volume