summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@hotmail.com>2017-12-29 22:10:16 +0100
committertroido <troido@hotmail.com>2017-12-29 22:10:16 +0100
commita1c60cfcb63b013f575943e17854cf205f8db913 (patch)
treead3829ef22dab6e9082728dc400b14eb06d94fdc
parent26c5eb315a4512a53a51a85abf4c0385b978c2f5 (diff)
made selectors for inventorypad and made key config in hy
-rw-r--r--asciifarm/client/display/display.py24
-rw-r--r--asciifarm/client/display/inventorypad.py16
-rw-r--r--asciifarm/client/display/screen.py1
-rw-r--r--asciifarm/client/display/selector.py26
-rw-r--r--asciifarm/client/gameclient.py26
-rw-r--r--asciifarm/client/keybindings.hy38
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))
+
+})