1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
import curses
from .fieldpad import FieldPad
from .infopad import InfoPad
from .healthpad import HealthPad
from .inventorypad import InventoryPad
from .screen import Screen
from .colours import Colours
from .messagepad import MessagePad
SIDEWIDTH = 20
class Display:
def __init__(self, stdscr, charMap, colours=False):
if colours:
self.colours = Colours()
else:
self.colours = None
self.screen = Screen(stdscr)
self.fieldPad = FieldPad((1, 1), charMap.get("charwidth", 1), self.colours)
self.characters = charMap["mapping"]
self.defaultChar = charMap.get("default", "?")
self.infoPad = InfoPad((100, 100))
self.healthPad = HealthPad(20,
charMap.get("healthfull", ("@",7, 2)),
charMap.get("healthempty", ("-",7, 1)),
self.colours)
self.inventoryPad = InventoryPad("Inventory", 10)
self.groundPad = InventoryPad("Ground", 5)
self.lastinfostring = None
self.changed = False
self.messagePad = messagepad.MessagePad(5)
def resizeField(self, size):
self.fieldPad.resize(*size)
def drawFieldCells(self, cells):
for cell in cells:
(x, y), spriteName = cell
sprite = self.getChar(spriteName)
self.fieldPad.changeCell(x, y, *sprite)
self.change()
def setFieldCenter(self, pos):
self.fieldPad.setCenter(pos)
def setHealth(self, health, maxHealth):
self.healthPad.setHealth(health, maxHealth)
self.change()
def showInfo(self, infostring):
if infostring != self.lastinfostring:
self.infoPad.showString(infostring)
self.change()
self.lastinfostring = infostring
def setInventory(self, items):
self.inventoryPad.setInventory(items)
self.change()
def setGround(self, items):
self.groundPad.setInventory(items)
self.change()
def addMessage(self, message):
self.messagePad.addMessage(message)
self.change()
def getChar(self, sprite):
char = self.characters.get(sprite, self.defaultChar)
if isinstance(char, str):
return [char]
return char
def change(self):
self.changed = True
def update(self):
if self.changed:
fieldRight = min(self.fieldPad.getWidth(), self.screen.getWidth()-SIDEWIDTH-1)
fieldBottom = min(self.fieldPad.getHeight(), self.screen.getHeight()-self.messagePad.getHeight())
healthBottom = self.healthPad.getHeight()
groundBottom = healthBottom + self.groundPad.getHeight()
inventoryBottom = groundBottom + self.inventoryPad.getHeight()
self.fieldPad.update(self, 0,0,fieldRight, fieldBottom)
self.messagePad.update(self, 0,fieldBottom, fieldRight, min(self.screen.getHeight(), fieldBottom+self.messagePad.getHeight()))
self.healthPad.update(self, fieldRight+1,0, self.screen.getWidth(), healthBottom)
self.groundPad.update(self, fieldRight+1, healthBottom, self.screen.getWidth(), min(self.screen.getHeight(), groundBottom))
self.inventoryPad.update(self, fieldRight+1, groundBottom, self.screen.getWidth(), min(self.screen.getHeight(), inventoryBottom))
self.infoPad.update(self, fieldRight+1,inventoryBottom+1, self.screen.getWidth(), self.screen.getHeight())
curses.doupdate()
self.changed = False
|