home · contact · privacy
Minor client refactoring.
[plomrogue2-experiments] / client.py
index e270a8c9a63d6dc424ce28ef3c91c38febbf387c..f91a0ddc48f80f5992c77cd5beaeb46c1cd3959a 100755 (executable)
--- a/client.py
+++ b/client.py
@@ -14,7 +14,7 @@ class MapSquare(game_common.Map):
         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)
@@ -23,7 +23,7 @@ class MapSquare(game_common.Map):
 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:
@@ -33,28 +33,33 @@ class MapHex(game_common.Map):
                 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."""
@@ -98,10 +103,20 @@ class WidgetManager:
         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')
+        self.palette = [('foo', 'white', 'dark red'),
+                        ('bar', 'white', 'dark blue'),
+                        ('baz', 'white', 'dark green')]
 
     def draw_map(self):
         """Draw map view from .game.map_.terrain, .game.things."""
@@ -109,7 +124,18 @@ class WidgetManager:
         for t in self.game.world.things:
             pos_i = self.game.world.map_.get_position_index(t.position)
             terrain_as_list[pos_i] = self.game.symbol_for_type(t.type_)
-        return self.game.world.map_.list_terrain_to_lines(terrain_as_list)
+        text = self.game.world.map_.list_terrain_to_lines(terrain_as_list)
+        new_map_text = []
+        for char in text:
+            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]
+        return new_map_text
 
     def update(self):
         """Redraw all non-edit widgets."""
@@ -161,7 +187,8 @@ class PlomRogueClient:
         self.socket = socket
         self.widget_manager = WidgetManager(self.socket, self.game)
         self.server_output = []
-        self.urwid_loop = urwid.MainLoop(self.widget_manager.top)
+        self.urwid_loop = urwid.MainLoop(self.widget_manager.top,
+                                         self.widget_manager.palette)
         self.urwid_pipe_write_fd = self.urwid_loop.watch_pipe(self.
                                                               handle_input)
         self.recv_loop_thread = threading.Thread(target=self.recv_loop)