summaryrefslogtreecommitdiff
path: root/asciifarm/client/display.py
diff options
context:
space:
mode:
Diffstat (limited to 'asciifarm/client/display.py')
-rw-r--r--asciifarm/client/display.py174
1 files changed, 174 insertions, 0 deletions
diff --git a/asciifarm/client/display.py b/asciifarm/client/display.py
new file mode 100644
index 0000000..f138382
--- /dev/null
+++ b/asciifarm/client/display.py
@@ -0,0 +1,174 @@
+
+
+
+import os
+from ratuil.layout import Layout
+from ratuil.bufferedscreen import BufferedScreen as Screen
+#from ratuil.screen import Screen
+from ratuil.textstyle import TextStyle
+from asciifarm.common.utils import get
+from .listselector import ListSelector
+
+
+SIDEWIDTH = 20
+
+ALPHABET = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
+
+class Display:
+
+ def __init__(self, charMap):
+
+ self.characters = {}
+
+ def parseSprite(sprite):
+ if isinstance(sprite, str):
+ return (sprite, None, None)
+ char = get(sprite, 0, " ")
+ fg = get(sprite, 1)
+ bg = get(sprite, 2)
+ return (char, fg, bg)
+ for name, sprite in charMap["mapping"].items():
+ vals = parseSprite(sprite)
+ if vals:
+ self.characters[name] = vals
+
+ for name, colours in charMap.get("writable", {}).items():
+ fg = get(colours, 0)
+ bg = get(colours, 1)
+ for i in range(min(len(ALPHABET), len(charMap.get("alphabet", [])))):
+ self.characters[name + '-' + ALPHABET[i]] = (charMap["alphabet"][i], fg, bg)
+
+ self.defaultChar = parseSprite(charMap.get("default", "?"))
+
+ self.messageColours = charMap.get("msgcolours", {})
+
+ fname = os.path.join(os.path.dirname(__file__), "layout.xml")
+ self.layout = Layout.from_xml_file(fname)
+ self.layout.get("field").set_char_size(charMap.get("charwidth", 1))
+
+ self.screen = Screen()
+ self.screen.clear()
+
+ self.layout.set_target(self.screen)
+ self.layout.update()
+
+
+
+ # temporary, until these have a better place
+ self.inventory = ListSelector(self.getWidget("inventory"))
+ self.inventory._debug_name = "inventory"
+ self.equipment = ListSelector(self.getWidget("equipment"))
+ self.equipment._debug_name = "equipment"
+ self.ground = ListSelector(self.getWidget("ground"))
+ self.ground._debug_name = "ground"
+ self.switch = ListSelector(self.getWidget("switchtitles"))
+ self.switch._debug_name = "switch"
+
+ self.switch.setItems(["inventory", "equipment", "ground"])
+ self.menus = {
+ "inventory": self.inventory,
+ "equipment": self.equipment,
+ "ground": self.ground
+ }
+
+ self.layout.get("switch").select(0)
+
+
+ def getWidget(self, name):
+ return self.layout.get(name)
+
+ def resizeField(self, size):
+ self.getWidget("field").set_size(*size)
+
+ def drawFieldCells(self, cells):
+ field = self.getWidget("field")
+ for cell in cells:
+ (x, y), spriteNames = cell
+ if not len(spriteNames):
+ char, fg, bg = self.getChar(' ')
+ else:
+ char, fg, bg = self.getChar(spriteNames[0])
+ for spriteName in spriteNames[1:]:
+ if bg is not None:
+ break
+ _char, _fg, bg = self.getChar(spriteName)
+ field.change_cell(x, y, char, TextStyle(fg, bg))
+
+
+ def setFieldCenter(self, pos):
+ self.getWidget("field").set_center(*pos)
+
+ def setHealth(self, health, maxHealth):
+ if health is None:
+ health = 0
+ if maxHealth is None:
+ maxHealth = 0
+ self.getWidget("health").set_total(maxHealth)
+ self.getWidget("health").set_filled(health)
+
+
+ def showInfo(self, infostring):
+ self.getWidget("info").set_text(infostring)
+
+ def selectMenu(self, *args, **kwargs):
+ self.switch.select(*args, **kwargs)
+ self.layout.get("switch").select(self.getSelectedMenu())
+
+ def getSelectedMenu(self):
+ return self.switch.getSelectedItem()
+
+ def getSelectedItem(self, menu=None):
+ return self._getMenu(menu).getSelected()
+
+ def selectItem(self, menu=None, *args, **kwargs):
+ self._getMenu(menu).select(*args, **kwargs)
+
+ def _getMenu(self, name=None):
+ if name is None:
+ name = self.getSelectedMenu()
+ name = name.casefold()
+ return self.menus[name]
+
+ def setInventory(self, items):
+ self.inventory.setItems(items)
+
+
+ def setEquipment(self, slots):
+ self.equipment.setItems(
+ sorted([
+ slot + ": " + (item if item else "")
+ for slot, item in slots.items()
+ ])
+ )
+
+ def setGround(self, items):
+ self.ground.setItems(items)
+
+
+ def addMessage(self, message, msgtype=None):
+ if msgtype is not None:
+ style = TextStyle(*self.messageColours.get(msgtype, (7,0)))
+ else:
+ style = None
+ self.getWidget("msg").add_message(message, style)
+
+ def log(self, message):
+ self.addMessage(str(message))
+
+ def scrollBack(self, amount, relative=True):
+ self.getWidget("msg").scroll(amount, relative)
+
+ def setInputString(self, string, cursor):
+ self.getWidget("textinput").set_text(string, cursor)
+
+ def update(self):
+ self.layout.update()
+ self.screen.update()
+
+ def getChar(self, sprite):
+ """This returns the character belonging to some spritename. This does not read a character"""
+ return self.characters.get(sprite, self.defaultChar)
+
+ def update_size(self):
+ self.screen.reset()
+