Asciifarm/asciifarm/client/display/display.py

155 lines
4.8 KiB
Python
Raw Normal View History

2017-12-28 21:47:36 +00:00
import curses
2017-12-28 21:47:36 +00:00
from .field import Field
from .info import Info
from .health import Health
from .inventory import Inventory
2017-12-28 21:47:36 +00:00
from .screen import Screen
from .colours import Colours
from .messages import Messages
from .switcher import Switcher
2017-12-28 21:47:36 +00:00
from .textinput import TextInput
from .widget import Widget
2017-12-28 21:47:36 +00:00
from asciifarm.common.utils import get
2017-12-28 21:47:36 +00:00
SIDEWIDTH = 20
2018-05-22 14:45:09 +00:00
ALPHABET = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
2017-12-28 21:47:36 +00:00
class Display:
def __init__(self, stdscr, charMap, colours=False):
2018-05-23 19:08:52 +00:00
if colours and curses.has_colors and curses.COLORS > 1:
2017-12-28 21:47:36 +00:00
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
2018-05-22 14:45:09 +00:00
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
2017-12-28 21:47:36 +00:00
self.widgets = {}
self.addWidget(Field((1, 1), charMap.get("charwidth", 1), self.colours), "field")
self.addWidget(Info(), "info")
self.addWidget(Health(
2017-12-28 21:47:36 +00:00
charMap.get("healthfull", ("@",7, 2)),
2019-01-20 00:19:24 +00:00
charMap.get("healthempty", ("-",7, 1))
),
"health")
self.addWidget(Inventory("Inventory"), "inventory")
self.addWidget(Inventory("Ground"), "ground")
self.addWidget(Inventory("Equipment"), "equipment")
2017-12-28 21:47:36 +00:00
switcher = Switcher([self.widgets["ground"], self.widgets["inventory"], self.widgets["equipment"]], 1)
self.addWidget(switcher, "switch")
2019-01-20 00:19:24 +00:00
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
2017-12-28 21:47:36 +00:00
def resizeField(self, size):
self.getWidget("field").resize(*size)
self.forced = True
2017-12-28 21:47:36 +00:00
def drawFieldCells(self, cells):
field = self.getWidget("field")
2017-12-28 21:47:36 +00:00
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)
2017-12-28 21:47:36 +00:00
def setFieldCenter(self, pos):
self.getWidget("field").setCenter(pos)
2017-12-28 21:47:36 +00:00
def setHealth(self, health, maxHealth):
self.getWidget("health").setHealth(health, maxHealth)
2017-12-28 21:47:36 +00:00
def showInfo(self, infostring):
self.getWidget("info").showString(infostring)
2017-12-28 21:47:36 +00:00
def setInventory(self, items):
self.getWidget("inventory").setInventory(items)
2017-12-28 21:47:36 +00:00
2017-12-30 11:49:28 +00:00
def setEquipment(self, slots):
self.getWidget("equipment").setInventory(
2017-12-30 11:49:28 +00:00
sorted([
slot + ": " + (item if item else "")
for slot, item in slots.items()
])
)
2017-12-28 21:47:36 +00:00
def setGround(self, items):
self.getWidget("ground").setInventory(items)
2017-12-28 21:47:36 +00:00
2019-01-20 00:19:24 +00:00
def addMessage(self, message, type):
self.getWidget("msg").addMessage(message, type)
2017-12-28 21:47:36 +00:00
2018-01-03 17:30:14 +00:00
def scrollBack(self, amount, relative=True):
self.getWidget("msg").scroll(amount, relative)
2017-12-28 21:47:36 +00:00
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)
2017-12-28 21:47:36 +00:00
def setInputString(self, string, cursor):
self.getWidget("textinput").setText(string, cursor)
2017-12-28 21:47:36 +00:00
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
2017-12-28 21:47:36 +00:00