summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2018-09-09 14:52:59 +0200
committertroido <troido@protonmail.com>2018-09-09 14:52:59 +0200
commit9fe119a95b4cd8ab23ea30db9a72645063da264f (patch)
tree82c4ee67fb43cfb31a475ae598ac3abf902b307e
parent5bd11fd1914ea6744852b78047b207e521a304f1 (diff)
switchable menus are now somewhat usable and presentable
-rw-r--r--asciifarm/client/commandhandler.py34
-rw-r--r--asciifarm/client/display/display.py9
-rw-r--r--asciifarm/client/display/inventory.py11
-rw-r--r--asciifarm/client/display/screen.py19
-rw-r--r--asciifarm/client/display/switcher.py8
-rw-r--r--asciifarm/client/display/widget.py7
-rw-r--r--asciifarm/client/gameclient.py5
-rw-r--r--asciifarm/keybindings/keybindings.json14
8 files changed, 75 insertions, 32 deletions
diff --git a/asciifarm/client/commandhandler.py b/asciifarm/client/commandhandler.py
index 0b5351a..1f5177b 100644
--- a/asciifarm/client/commandhandler.py
+++ b/asciifarm/client/commandhandler.py
@@ -24,6 +24,9 @@ class CommandHandler:
"selectwidget": self.selectWidget,
"selectitem": self.selectItem,
"inputwithselected": self.actWithSelected,
+ "use": self.useSelected,
+ "unuse": self.unUseSelected,
+ "take": self.takeSelected,
"eval": self.eval,
"exec": self.exec,
"scrollchat": self.scrollChat,
@@ -82,6 +85,37 @@ class CommandHandler:
def actWithSelected(self, action, widget):
self.input([action, self.client.display.getWidget(widget).getSelected()])
+ def useSelected(self):
+ widget = self.client.display.getWidget("switch").getSelectedItem()
+ selected = widget.getImpl().getSelected()
+ if widget.name in ("inventory", "equipment"):
+ action = "use"
+ elif widget.name == "ground":
+ action = "interact",
+ else:
+ return
+ self.input([action, selected])
+
+ def unUseSelected(self):
+ widget = self.client.display.getWidget("switch").getSelectedItem()
+ selected = widget.getImpl().getSelected()
+ if widget.name == "inventory":
+ action = "drop"
+ elif widget.name == "equipment":
+ action = "unequip"
+ else:
+ return
+ self.input([action, selected])
+
+ def takeSelected(self):
+ widget = self.client.display.getWidget("switch").getSelectedItem()
+ selected = widget.getImpl().getSelected()
+ if widget.name == "ground":
+ action = "take"
+ else:
+ return
+ self.input([action, selected])
+
def eval(self, *texts):
text = " ".join(texts)
self.log(eval(text, {"self": self, "client": self.client, "connection": self.client.connection, "display": self.client.display}))
diff --git a/asciifarm/client/display/display.py b/asciifarm/client/display/display.py
index 1d5f542..0660bb9 100644
--- a/asciifarm/client/display/display.py
+++ b/asciifarm/client/display/display.py
@@ -63,20 +63,19 @@ class Display:
self.addWidget(Inventory("Inventory"), "inventory")
self.addWidget(Inventory("Ground"), "ground")
self.addWidget(Inventory("Equipment"), "equipment")
- self.addWidget(Messages(), "msg")
- self.addWidget(TextInput(), "textinput")
- switcher = Switcher([self.widgets["ground"], self.widgets["inventory"]], 1)
+ switcher = Switcher([self.widgets["ground"], self.widgets["inventory"], self.widgets["equipment"]], 1)
self.addWidget(switcher, "switch")
+ self.addWidget(Messages(), "msg")
+ self.addWidget(TextInput(), "textinput")
self.forced = False
- self.update()
def addWidget(self, w, name, winname=None):
if not winname:
winname = name
- widget = Widget(w)
+ widget = Widget(w, name)
self.widgets[name] = widget
widget.setWin(winname, self.screen)
diff --git a/asciifarm/client/display/inventory.py b/asciifarm/client/display/inventory.py
index 4ad7719..9e62eff 100644
--- a/asciifarm/client/display/inventory.py
+++ b/asciifarm/client/display/inventory.py
@@ -5,8 +5,9 @@ from .widimp import WidImp
class Inventory(WidImp):
- def __init__(self, title):
+ def __init__(self, title, titlebar="{}:"):
self.title = title
+ self.titlebar = titlebar
self.items = []
self.selector = 0
@@ -47,7 +48,11 @@ class Inventory(WidImp):
def getNumItems(self):
return len(self.items)
+ def itemName(self, item):
+ return item
+
def update(self, win):
+
width, height = win.getSize()
height -= 1
selected = self.selector
@@ -55,11 +60,11 @@ class Inventory(WidImp):
start = max(start, 0)
end = start + height
win.erase()
- win.addLine((0,0), (self.title + ":")[:width])
+ win.addLine((0,0), (self.titlebar.format(self.title))[:width])
for i, item in enumerate(self.items[start:end]):
if i + start == selected:
win.addLine((0, i+1), '*')
- win.addLine((1, i+1), item)
+ win.addLine((1, i+1), self.itemName(item))
if end < len(self.items):
win.addLine((width-1, height), "+")
if start > 0:
diff --git a/asciifarm/client/display/screen.py b/asciifarm/client/display/screen.py
index 31b50c8..438e818 100644
--- a/asciifarm/client/display/screen.py
+++ b/asciifarm/client/display/screen.py
@@ -43,13 +43,11 @@ class Screen:
healthY = 0
healthH = self._limitHeight(2, healthY)
- groundY = healthY + healthH
- groundH = self._limitHeight(6, groundY)
- invY = groundY + groundH
- invH = self._limitHeight(9, invY)
- eqY = invY + invH
- eqH = self._limitHeight(5, eqY)
- infoY = eqY + eqH
+ indexY = healthY + healthH
+ indexH = self._limitHeight(4, indexY)
+ listY = indexY + indexH + 1
+ listH = self._limitHeight(12, listY)
+ infoY = listY + listH
infoH = self._limitHeight(20, infoY)
self.windows = {
@@ -58,9 +56,10 @@ class Screen:
"textinput": self.makeWin(0, inputY, sideX - 1, inputH),
"health": self.makeWin(sideX, healthY, sideW, healthH),
- "ground": self.makeWin(sideX, groundY, sideW, invH),
- "inventory": self.makeWin(sideX, groundY, sideW, invH),
- "equipment": self.makeWin(sideX, eqY, sideW, eqH),
+ "switch": self.makeWin(sideX, indexY, sideW, indexH),
+ "ground": self.makeWin(sideX, listY, sideW, listH),
+ "inventory": self.makeWin(sideX, listY, sideW, listH),
+ "equipment": self.makeWin(sideX, listY, sideW, listH),
"info": self.makeWin(sideX, infoY, sideW, infoH)
}
diff --git a/asciifarm/client/display/switcher.py b/asciifarm/client/display/switcher.py
index 196aa88..b62e650 100644
--- a/asciifarm/client/display/switcher.py
+++ b/asciifarm/client/display/switcher.py
@@ -1,5 +1,5 @@
-from .widimp import WidImp
+
from .inventory import Inventory
class Switcher(Inventory):
@@ -8,7 +8,7 @@ class Switcher(Inventory):
"""
def __init__(self, widgets, initial=0):
- Inventory.__init__(self, " ")
+ Inventory.__init__(self, "", "")
self.setInventory(widgets)
for wid in widgets:
@@ -19,7 +19,11 @@ class Switcher(Inventory):
def doSelect(self, value):
self.getSelectedItem().hidden = True
self.selector = value
+ self.change()
newWid = self.getSelectedItem()
newWid.hidden = False
newWid.change()
+ def itemName(self, item):
+ return item.getImpl().title
+
diff --git a/asciifarm/client/display/widget.py b/asciifarm/client/display/widget.py
index 59bed62..31bb093 100644
--- a/asciifarm/client/display/widget.py
+++ b/asciifarm/client/display/widget.py
@@ -1,17 +1,16 @@
-
-
class Widget:
- def __init__(self, impl):
+ def __init__(self, impl, name=None):
self.impl = impl
- self.impl.setWidget(self)
self.win = None
self.screen = None
self.changed = False
self.hidden = False
+ self.name = name
+ self.impl.setWidget(self)
def setWin(self, win, screen):
self.win = win
diff --git a/asciifarm/client/gameclient.py b/asciifarm/client/gameclient.py
index 4197735..8c94e68 100644
--- a/asciifarm/client/gameclient.py
+++ b/asciifarm/client/gameclient.py
@@ -10,8 +10,6 @@ import argparse
import string
from queue import Queue
-from .display.screen import Screen
-from .display.display import Display
from .inputhandler import InputHandler
@@ -35,7 +33,8 @@ class Client:
def send(self, data):
- self.connection.send(json.dumps(data))
+ text = json.dumps(data)
+ self.connection.send(text)
def start(self):
threading.Thread(target=self.listen, daemon=True).start()
diff --git a/asciifarm/keybindings/keybindings.json b/asciifarm/keybindings/keybindings.json
index d2148e5..ecd8fd2 100644
--- a/asciifarm/keybindings/keybindings.json
+++ b/asciifarm/keybindings/keybindings.json
@@ -12,10 +12,10 @@
"j": ["move", "south"],
"l": ["move", "east"],
"h": ["move", "west"],
-"e": ["inputwithselected", "take", "ground"],
-"q": ["inputwithselected", "drop", "inventory"],
-"E": ["inputwithselected", "use", "inventory"],
-"z": ["inputwithselected", "unequip", "equipment"],
+"e": ["input", ["take"]],
+"q": ["unuse"],
+"Q": ["take"],
+"E": ["use"],
"R": ["input", ["interact"]],
"r": ["do", [
["input", ["interact"]],
@@ -27,6 +27,10 @@
"c": ["selectitem", 1, true, true],
"v": ["selectwidget", -1, true, true],
"b": ["selectwidget", 1, true, true],
+"-": ["selectitem", -1, true, true],
+"+": ["selectitem", 1, true, true],
+"/": ["selectwidget", -1, true, true],
+"*": ["selectwidget", 1, true, true],
"f": ["do", [
["input", ["attack"]],
["input", ["attack", "north"]],
@@ -44,5 +48,5 @@
"KEY_NPAGE": ["scrollchat", -1],
"/": ["runinput", "/"]
},
-"help": "Controls:\n wasd or arrows:\n Move around\n e: Grab\n q: Drop\n E: Use/Equip\n r: Interact\n f: Attack\n t: Chat\n z: Unequip\n xcv: scroll\n ctrl-c: close client"
+"help": "Controls:\n wasd or arrows:\n Move around\n e: Grab\n q: Drop/unequip\n selected\n r: Interact\n f: Attack\n t: Chat\n E: Use selected\n Q: Take selected\n xc: select item\n vb: select menu\n ctrl-c: close client"
}