diff options
Diffstat (limited to 'asciifarm/client/newdisplay/display.py')
| -rw-r--r-- | asciifarm/client/newdisplay/display.py | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/asciifarm/client/newdisplay/display.py b/asciifarm/client/newdisplay/display.py new file mode 100644 index 0000000..66f89ca --- /dev/null +++ b/asciifarm/client/newdisplay/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 + + +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") + with open(fname) as f: + layouttext = f.read() + + self.layout = Layout(layouttext) + 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() + + + #screen = Screen(self, stdscr, self.colours) + #self.screen = screen + + #self.widgets = {} + + #self.addWidget(Field((1, 1), charMap.get("charwidth", 1), self.colours), "field") + #self.addWidget(Info(), "info") + #self.addWidget(Health( + #charMap.get("healthfull", ("@",7, 2)), + #charMap.get("healthempty", ("-",7, 1)) + #), + #"health") + #self.addWidget(Inventory("Inventory"), "inventory") + #self.addWidget(Inventory("Ground"), "ground") + #self.addWidget(Inventory("Equipment"), "equipment") + + + ##switcher = Switcher([self.widgets["ground"], self.widgets["inventory"], self.widgets["equipment"]], 1) + #self.addWidget(Inventory(""), "switch") + #self.addWidget(Messages(charMap.get("msgcolours", {})), "msg") + #self.addWidget(TextInput(), "textinput") + + #self.forced = False + + #def addWidget(self, w, name, winname=None): + #if not winname: + #winname = name + #widget = Widget(w, name) + #self.widgets[name] = widget + #widget.setWin(winname, self.screen) + + def getWidget(self, name): + return self.layout.get(name) + #if name in self.widgets: + #return self.widgets[name].getImpl() + #else: + #return None + + def resizeField(self, size): + self.getWidget("field").set_size(*size) + #self.forced = True + + 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(0) + 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): + self.getWidget("health").set_total(maxHealth) + self.getWidget("health").set_filled(health) + + + def showInfo(self, infostring): + pass + #self.getWidget("info").showString(infostring) + + + #def setInventory(self, items): + #self.getWidget("inventory").setInventory(items) + + + #def setEquipment(self, slots): + #self.getWidget("equipment").setInventory( + #sorted([ + #slot + ": " + (item if item else "") + #for slot, item in slots.items() + #]) + #) + + #def setGround(self, items): + #self.getWidget("ground").setInventory(items) + + + def addMessage(self, message, type): + self.getWidget("msg").add_message(message, TextStyle(*self.messageColours.get(type, (7,0)))) + + 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() + #changed = False + #for widget in self.widgets.values(): + #if self.forced or widget.isChanged(): + #widget.update() + #changed = True + #if changed: + #self.screen.update() + #self.forced = False + + #def forceUpdate(self): + #self.forced = True + + 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() + |
