map_lines = []
start_cut = 0
while start_cut < len(terrain):
- limit = start_cut + self.game.world.map_.size[1]
+ limit = start_cut + self.size[1]
map_lines += [terrain[start_cut:limit]]
start_cut = limit
return "\n".join(map_lines)
class MapHex(game_common.Map):
def list_terrain_to_lines(self, terrain_as_list):
- new_terrain_list = []
+ new_terrain_list = [' ']
x = 0
y = 0
for c in terrain_as_list:
new_terrain_list += ['\n']
x = 0
y += 1
- if y % 2 != 0:
+ if y % 2 == 0:
new_terrain_list += [' ']
return ''.join(new_terrain_list)
+map_manager = game_common.MapManager(globals())
+
+
class World(game_common.World):
- def __init__(self, *args, **kwargs):
+ def __init__(self, game, *args, **kwargs):
"""Extend original with local classes and empty default map.
We need the empty default map because we draw the map widget
on any update, even before we actually receive map data.
"""
super().__init__(*args, **kwargs)
- self.MapHex = MapHex
- self.MapSquare = MapSquare
- self.map_ = self.MapHex()
+ self.game = game
+ self.map_ = self.game.map_manager.get_map_class('Hex')()
class Game(game_common.CommonCommandsMixin):
- world = World()
- log_text = ''
+
+ def __init__(self):
+ self.map_manager = map_manager
+ self.world = World(self)
+ self.log_text = ''
def log(self, msg):
"""Prefix msg plus newline to self.log_text."""
self.map_widget = urwid.Text('', wrap='clip')
self.turn_widget = urwid.Text('')
self.log_widget = urwid.Text('')
- map_box = urwid.Padding(self.map_widget, width=50)
- widget_pile = urwid.Pile([edit_widget, map_box, self.turn_widget,
- self.log_widget])
- self.top = urwid.Filler(widget_pile, valign='top')
+
+ edit_map = urwid.AttrMap(edit_widget, 'foo')
+ turn_map = urwid.AttrMap(self.turn_widget, 'bar')
+ log_map = urwid.AttrMap(self.log_widget, 'baz')
+ widget_pile = urwid.Pile([edit_map,
+ urwid.Divider(),
+ turn_map,
+ urwid.Divider(),
+ log_map])
+ widget_columns = urwid.Columns([(20, widget_pile), self.map_widget],
+ dividechars=1)
+
+ self.top = urwid.Filler(widget_columns, valign='top')
def draw_map(self):
"""Draw map view from .game.map_.terrain, .game.things."""
"""Redraw all non-edit widgets."""
self.turn_widget.set_text('TURN: ' + str(self.game.world.turn))
self.log_widget.set_text(self.game.log_text)
- self.map_widget.set_text(self.draw_map())
+ map_lines = self.draw_map()
+ new_map_text = []
+ for char in map_lines:
+ if char == '.':
+ new_map_text += [('foo', char)]
+ elif char in {'x', 'X', '#'}:
+ new_map_text += [('bar', char)]
+ elif char in {'@', 'm'}:
+ new_map_text += [('baz', char)]
+ else:
+ new_map_text += [char]
+ self.map_widget.set_text(new_map_text)
class EditToSocketWidget(urwid.Edit):
"""Extends urwid.Edit with socket to send input on 'enter' to."""
self.socket = socket
self.widget_manager = WidgetManager(self.socket, self.game)
self.server_output = []
- self.urwid_loop = urwid.MainLoop(self.widget_manager.top)
+ palette = [('foo', 'white', 'dark red'),
+ ('bar', 'white', 'dark blue'),
+ ('baz', 'white', 'dark green')]
+ self.urwid_loop = urwid.MainLoop(self.widget_manager.top, palette)
self.urwid_pipe_write_fd = self.urwid_loop.watch_pipe(self.
handle_input)
self.recv_loop_thread = threading.Thread(target=self.recv_loop)