Asciifarm/asciifarm/client/display/display.py

155 lines
4.9 KiB
Python

import curses
from .field import Field
from .info import Info
from .health import Health
from .inventory import Inventory
from .screen import Screen
from .colours import Colours
from .messages import Messages
from .switcher import Switcher
from .textinput import TextInput
from .widget import Widget
from asciifarm.common.utils import get
SIDEWIDTH = 20
ALPHABET = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
class Display:
def __init__(self, stdscr, charMap, colours=False):
if colours and curses.has_colors and curses.COLORS > 1:
self.colours = Colours()
else:
self.colours = None
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", "?"))
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):
if name in self.widgets:
return self.widgets[name].getImpl()
else:
return None
def resizeField(self, size):
self.getWidget("field").resize(*size)
self.forced = True
def drawFieldCells(self, cells):
field = self.getWidget("field")
for cell in cells:
(x, y), spriteNames = cell
sprites = [self.getChar(spriteName) for spriteName in spriteNames]
if not len(sprites):
sprites = [self.getChar(" ")]
field.changeCell(x, y, sprites)
def setFieldCenter(self, pos):
self.getWidget("field").setCenter(pos)
def setHealth(self, health, maxHealth):
self.getWidget("health").setHealth(health, maxHealth)
def showInfo(self, infostring):
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").addMessage(message, type)
def scrollBack(self, amount, relative=True):
self.getWidget("msg").scroll(amount, relative)
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 setInputString(self, string, cursor):
self.getWidget("textinput").setText(string, cursor)
def update(self):
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