155 lines
4.9 KiB
Python
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
|
|
|