diff options
| author | troido <troido@hotmail.com> | 2017-12-29 22:10:16 +0100 |
|---|---|---|
| committer | troido <troido@hotmail.com> | 2017-12-29 22:10:16 +0100 |
| commit | a1c60cfcb63b013f575943e17854cf205f8db913 (patch) | |
| tree | ad3829ef22dab6e9082728dc400b14eb06d94fdc | |
| parent | 26c5eb315a4512a53a51a85abf4c0385b978c2f5 (diff) | |
made selectors for inventorypad and made key config in hy
| -rw-r--r-- | asciifarm/client/display/display.py | 24 | ||||
| -rw-r--r-- | asciifarm/client/display/inventorypad.py | 16 | ||||
| -rw-r--r-- | asciifarm/client/display/screen.py | 1 | ||||
| -rw-r--r-- | asciifarm/client/display/selector.py | 26 | ||||
| -rw-r--r-- | asciifarm/client/gameclient.py | 26 | ||||
| -rw-r--r-- | asciifarm/client/keybindings.hy | 38 |
6 files changed, 109 insertions, 22 deletions
diff --git a/asciifarm/client/display/display.py b/asciifarm/client/display/display.py index a3dbb2e..4a74711 100644 --- a/asciifarm/client/display/display.py +++ b/asciifarm/client/display/display.py @@ -48,10 +48,23 @@ class Display: setwin(self.textInput, "textinput") self.lastinfostring = None + + + self.widgets = { + "field": self.fieldPad, + "info": self.infoPad, + "health": self.healthPad, + "inventory": self.inventoryPad, + "ground": self.groundPad, + "msg": self.messagePad, + "textinput": self.textInput + } self.changed = False - self.update(True) - + self.update() + + def getWidget(self, name): + return self.widgets.get(name, None) def resizeField(self, size): self.fieldPad.resize(*size) @@ -83,7 +96,14 @@ class Display: def setGround(self, items): self.groundPad.setInventory(items) self.change() + + def getSelector(self, name): + widget = self.getWidget(name) + if not widget or not hasattr(widget, "getSelector"): + return None + return widget.getSelector() + def addMessage(self, message): self.messagePad.addMessage(message) self.change() diff --git a/asciifarm/client/display/inventorypad.py b/asciifarm/client/display/inventorypad.py index 0cb0b01..c8bb497 100644 --- a/asciifarm/client/display/inventorypad.py +++ b/asciifarm/client/display/inventorypad.py @@ -1,10 +1,12 @@ import curses +from .selector import Selector class InventoryPad: def __init__(self, title): self.title = title + self.selector = Selector(self) self.setInventory([]) self.changed = False self.win = None @@ -12,12 +14,18 @@ class InventoryPad: def setWin(self, win): self.win = win + def getSelector(self): + return self.selector + + def change(self): + self.changed = True + def setInventory(self, items): self.items = items self.changed = True - def getHeight(self): - return self.maxItems+2 + def getNumItems(self): + return len(self.items) def update(self, force): if not self.changed and not force or not self.win: @@ -28,5 +36,7 @@ class InventoryPad: win.erase() win.addstr(0,0, (self.title + ":")[:width]) for i, item in enumerate(self.items[:height-1]): - win.addstr(i+1, 2, item) + if i == self.selector.getValue(): + win.addstr(i+1, 0, '*') + win.addstr(i+1, 1, item) win.noutrefresh() diff --git a/asciifarm/client/display/screen.py b/asciifarm/client/display/screen.py index 588310e..5eeb879 100644 --- a/asciifarm/client/display/screen.py +++ b/asciifarm/client/display/screen.py @@ -60,6 +60,7 @@ class Screen: self.setWins() self.stdscr.clear() self.display.update(True) + raise Exception("size updated") def update(self): diff --git a/asciifarm/client/display/selector.py b/asciifarm/client/display/selector.py new file mode 100644 index 0000000..41249c2 --- /dev/null +++ b/asciifarm/client/display/selector.py @@ -0,0 +1,26 @@ + + +class Selector: + + + def __init__(self, inventory): + self.value = 0 + self.inventory = inventory + + def getValue(self): + return min(self.value, self.inventory.getNumItems()-1) + + def select(self, value, relative=False): + invLen = self.inventory.getNumItems() + if relative: + value += self.selector + if value < 0: + if not relative: + value += invLen + else: + value = 0 + if value >= invLen: + value = invLen-1 + if value in range(invLen): + self.selector = value + self.inventory.change() diff --git a/asciifarm/client/gameclient.py b/asciifarm/client/gameclient.py index b4cd259..fb030d5 100644 --- a/asciifarm/client/gameclient.py +++ b/asciifarm/client/gameclient.py @@ -12,6 +12,8 @@ from .display.screen import Screen import string from .display.display import Display +import hy +import importlib class Client: @@ -23,17 +25,7 @@ class Client: self.connection = connection self.logFile = logFile - self.commands = {} - if "input" in keybindings: - for key, commands in keybindings["input"].items(): - if isinstance(commands[0], str): - commands = [commands] - self.commands[key] = [("send", ["input", command]) for command in commands] - if "control" in keybindings: - for key, commands in keybindings["control"].items(): - if isinstance(commands[0], str): - commands = [commands] - self.commands[key] = commands + self.commands = importlib.import_module(".keybindings", __package__).commands self.controlsString = """\ Default Controls: @@ -48,11 +40,12 @@ Default Controls: self.display.showInfo(self.controlsString) - self.actions = { - "send": (lambda data: self.connection.send(json.dumps(data))), - "text": (lambda: self.readString()) - } + def send(self, data): + self.connection.send(json.dumps(data)) + + def getDisplay(self): + return self.display def readString(self): text = self.display.getString() @@ -139,8 +132,7 @@ Default Controls: except ValueError: continue if keyname in self.commands: - for command, *data in self.commands[keyname]: - self.actions[command](*data) + self.commands[keyname](self) diff --git a/asciifarm/client/keybindings.hy b/asciifarm/client/keybindings.hy new file mode 100644 index 0000000..d91d6f5 --- /dev/null +++ b/asciifarm/client/keybindings.hy @@ -0,0 +1,38 @@ + +(defmacro send [data] + `(fn [client] (client.send ~data))) + +(defmacro input [action] + `(send ["input" ~action])) + +(defmacro doall [actions] + `(fn [client] (for [action ~actions] (action client)))) + +(defmacro selector [name] + `(.getSelector (.getDisplay client) ~name)) + +(defmacro selectorvalue [name] + `(.getValue (selector ~name))) + +(setv commands { + "w" (input ["move" "north"]) + "s" (input ["move" "south"]) + "d" (input ["move" "east"]) + "a" (input ["move" "west"]) + "KEY_UP" (input ["move" "north"]) + "KEY_DOWN" (input ["move" "south"]) + "KEY_RIGHT" (input ["move" "east"]) + "KEY_LEFT" (input ["move" "west"]) + "e" (input ["take" (selectorvalue "ground")]) + "q" (input ["drop" (selectorvalue "inventory")]) + "E" (input ["use" (selectorvalue "inventory")]) + "r" (input ["interact" (selectorvalue "ground")]) + "f" (doall [ + (input ["attack"]) + (input ["attack" "north"]) + (input ["attack" "south"]) + (input ["attack" "east"]) + (input ["attack" "west"])]) + "t" (fn [client] (client.readString)) + +}) |
