X-Git-Url: https://plomlompom.com/repos/berlin_corona.txt?a=blobdiff_plain;f=client.py;h=c5d6fcde99000d5972cd9d0a4b3c93a5737ed25b;hb=ca1257ec655f95611de1cbbac2814509d23f6116;hp=c32c62f2da9263a168d34442fc7150c0aafb9955;hpb=5765f660c2da8b03b7a5d1eba42bd76cf0abf815;p=plomrogue2-experiments diff --git a/client.py b/client.py index c32c62f..c5d6fcd 100755 --- a/client.py +++ b/client.py @@ -9,12 +9,13 @@ from parser import ArgError, Parser class Game: turn = 0 log_text = '' - map_size = (5, 5) - terrain_map = ('?'*5+'\n')*4+'?'*5 + map_size = (0, 0) + terrain_map = '' things = [] class Thing: - def __init__(self, position, symbol): + def __init__(self, id_, position, symbol): + self.id_ = id_ self.position = position self.symbol = symbol @@ -22,15 +23,33 @@ class Game: """Prefix msg plus newline to self.log_text.""" self.log_text = msg + '\n' + self.log_text - def cmd_THING(self, type_, yx): - """Add to self.things at .position yx with .symbol defined by type_.""" + def get_thing(self, i): + for thing in self.things: + if i == thing.id_: + return thing + t = self.Thing(i, [0,0], '?') + self.things += [t] + return t + + def cmd_THING_TYPE(self, i, type_): + t = self.get_thing(i) symbol = '?' - if type_ == 'TYPE:human': + if type_ == 'human': symbol = '@' - elif type_ == 'TYPE:monster': + elif type_ == 'monster': symbol = 'm' - self.things += [self.Thing(yx, symbol)] - cmd_THING.argtypes = 'string yx_tuple:nonneg' + t.symbol = symbol + cmd_THING_TYPE.argtypes = 'int:nonneg string' + + def cmd_THING_POS(self, i, yx): + t = self.get_thing(i) + t.position = list(yx) + cmd_THING_POS.argtypes = 'int:nonneg yx_tuple:nonneg' + + def cmd_THING_POS(self, i, yx): + t = self.get_thing(i) + t.position = list(yx) + cmd_THING_POS.argtypes = 'int:nonneg yx_tuple:nonneg' def cmd_MAP_SIZE(self, yx): """Set self.map_size to yx, redraw self.terrain_map as '?' cells.""" @@ -38,8 +57,7 @@ class Game: self.map_size = (y, x) self.terrain_map = '' for y in range(self.map_size[0]): - self.terrain_map += '?' * self.map_size[1] + '\n' - self.terrain_map = self.terrain_map[:-1] + self.terrain_map += '?' * self.map_size[1] cmd_MAP_SIZE.argtypes = 'yx_tuple:nonneg' def cmd_TURN_FINISHED(self, n): @@ -53,16 +71,16 @@ class Game: self.things = [] cmd_NEW_TURN.argtypes = 'int:nonneg' - def cmd_TERRAIN(self, terrain_map): - """Reset self.terrain_map from terrain_map.""" - lines = terrain_map.split('\n') - if len(lines) != self.map_size[0]: - raise ArgError('wrong map height %s' % len(lines)) - for line in lines: - if len(line) != self.map_size[1]: - raise ArgError('wrong map width') - self.terrain_map = terrain_map - cmd_TERRAIN.argtypes = 'string' + def cmd_TERRAIN_LINE(self, y, terrain_line): + width_map = self.map_size[1] + if y >= self.map_size[0]: + raise ArgError('too large row number %s' % y) + width_line = len(terrain_line) + if width_line > width_map: + raise ArgError('too large map line width %s' % width_line) + self.terrain_map = self.terrain_map[:y * width_map] + \ + terrain_line + self.terrain_map[(y + 1) * width_map:] + cmd_TERRAIN_LINE.argtypes = 'int:nonneg string' class WidgetManager: @@ -81,13 +99,18 @@ class WidgetManager: def draw_map(self): """Draw map view from .game.terrain_map, .game.things.""" - whole_map = [] - for c in self.game.terrain_map: - whole_map += [c] + map_lines = [] + map_size = len(self.game.terrain_map) + start_cut = 0 + while start_cut < map_size: + limit = start_cut + self.game.map_size[1] + map_lines += [self.game.terrain_map[start_cut:limit]] + start_cut = limit for t in self.game.things: - pos_i = t.position[0] * (self.game.map_size[1] + 1) + t.position[1] - whole_map[pos_i] = t.symbol - return ''.join(whole_map) + line_as_list = list(map_lines[t.position[0]]) + line_as_list[t.position[1]] = t.symbol + map_lines[t.position[0]] = ''.join(line_as_list) + return "\n".join(map_lines) def update(self): """Redraw all non-edit widgets."""