From 1fbd3687acb5edcdf043abfed92ec022d342f807 Mon Sep 17 00:00:00 2001
From: Christian Heller <c.heller@plomlompom.de>
Date: Tue, 30 Apr 2019 23:37:47 +0200
Subject: [PATCH] Only send to client whether map starts indented, not whole
 offset.

---
 new/example_client.py   | 23 ++++++++++-------------
 new/plomrogue/game.py   |  4 ++--
 new/plomrogue/parser.py | 18 ++++++++++++------
 new/plomrogue/things.py |  2 +-
 4 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/new/example_client.py b/new/example_client.py
index 2a4b80c..88939ba 100755
--- a/new/example_client.py
+++ b/new/example_client.py
@@ -33,11 +33,11 @@ class ClientMap(Map):
                 cut_end = cut_start + view_width
             map_lines[:] = [line[cut_start:cut_end] for line in map_lines]
 
-    def format_to_view(self, map_cells, center, size, indent_first_line):
+    def format_to_view(self, map_cells, center, size):
 
         def map_cells_to_lines(map_cells):
             map_view_chars = []
-            if indent_first_line:
+            if self.start_indented:
                 map_view_chars += ['0']
             x = 0
             y = 0
@@ -51,9 +51,9 @@ class ClientMap(Map):
                     map_view_chars += ['\n']
                     x = 0
                     y += 1
-                    if y % 2 == int(not indent_first_line):
+                    if y % 2 == int(not self.start_indented):
                         map_view_chars += ['0']
-            if y % 2 == int(not indent_first_line):
+            if y % 2 == int(not self.start_indented):
                 map_view_chars = map_view_chars[:-1]
             map_view_chars = map_view_chars[:-1]
             return ''.join(map_view_chars).split('\n')
@@ -85,9 +85,9 @@ def cmd_TURN(game, n):
 cmd_TURN.argtypes = 'int:nonneg'
 
 
-def cmd_VISIBLE_MAP(game, offset, size):
-    game.new_map(offset, size)
-cmd_VISIBLE_MAP.argtypes = 'yx_tuple yx_tuple:pos'
+def cmd_VISIBLE_MAP(game, size, indent_first_line):
+    game.new_map(size, indent_first_line)
+cmd_VISIBLE_MAP.argtypes = 'yx_tuple:pos bool'
 
 
 def cmd_VISIBLE_MAP_LINE(game, y, terrain_line):
@@ -153,9 +153,8 @@ class Game(GameBase):
         self.do_quit = False
         self.tui = None
 
-    def new_map(self, offset, size):
-        self.map_ = ClientMap(size)
-        self.offset = offset
+    def new_map(self, size, indent_first_line):
+        self.map_ = ClientMap(size, start_indented=indent_first_line)
 
     @property
     def player(self):
@@ -449,10 +448,8 @@ class MapWidget(Widget):
         center = self.tui.game.player.position
         if self.tui.examiner_mode:
             center = self.tui.examiner_position
-        indent_first_line = not bool(self.tui.game.offset.y % 2)
         lines = self.tui.game.map_.\
-                format_to_view(annotated_terrain, center, self.size,
-                               indent_first_line)
+                format_to_view(annotated_terrain, center, self.size)
         pad_or_cut_x(lines)
         pad_y(lines)
         self.safe_write(lines_to_colored_chars(lines))
diff --git a/new/plomrogue/game.py b/new/plomrogue/game.py
index 948c97e..13b4002 100755
--- a/new/plomrogue/game.py
+++ b/new/plomrogue/game.py
@@ -114,8 +114,8 @@ class Game(GameBase):
 
         self.io.send('TURN ' + str(self.turn))
         visible_map = self.player.get_visible_map()
-        self.io.send('VISIBLE_MAP %s %s' % (self.player.view_offset,
-                                            visible_map.size))
+        self.io.send('VISIBLE_MAP %s %s' % (visible_map.size,
+                                            visible_map.start_indented))
         for y, line in visible_map.lines():
             self.io.send('VISIBLE_MAP_LINE %5s %s' % (y, quote(line)))
         visible_things = self.player.get_visible_things()
diff --git a/new/plomrogue/parser.py b/new/plomrogue/parser.py
index 13e2c1c..27bd95a 100644
--- a/new/plomrogue/parser.py
+++ b/new/plomrogue/parser.py
@@ -94,10 +94,12 @@ class Parser:
     def argsparse(self, signature, args_tokens):
         """Parse into / return args_tokens as args defined by signature.
 
-        Expects signature to be a ' '-delimited sequence of any of the strings
-        'int:nonneg', 'yx_tuple', 'yx_tuple:nonneg', 'yx_tuple:pos', 'string',
-        'seq:int:nonneg', 'string:' + an option type string accepted by
-        self.game.get_string_options, defining the respective argument types.
+        Expects signature to be a ' '-delimited sequence of any of the
+        strings 'bool', 'int:nonneg', 'yx_tuple', 'yx_tuple:nonneg',
+        'yx_tuple:pos', 'string', 'seq:int:nonneg', 'string:' + an
+        option type string accepted by self.game.get_string_options,
+        defining the respective argument types.
+
         """
         tmpl_tokens = signature.split()
         if len(tmpl_tokens) != len(args_tokens):
@@ -109,7 +111,11 @@ class Parser:
         for i in range(len(tmpl_tokens)):
             tmpl = tmpl_tokens[i]
             arg = args_tokens[i]
-            if tmpl == 'int:nonneg':
+            if tmpl == 'bool':
+                if arg not in {'True', 'False'}:
+                    raise ArgError('Argument must be "True" or "False".')
+                args += [True if arg == 'True' else False]
+            elif tmpl == 'int:nonneg':
                 if not arg.isdigit():
                     raise ArgError('Argument must be non-negative integer.')
                 args += [int(arg)]
@@ -147,7 +153,7 @@ class Parser:
                     raise ArgError(msg)
                 args += [arg]
             else:
-                raise ArgError('Unknown argument type.')
+                raise ArgError('Unknown argument type: %s' % tmpl)
         return args
 
 
diff --git a/new/plomrogue/things.py b/new/plomrogue/things.py
index 0e47cc0..1e23809 100644
--- a/new/plomrogue/things.py
+++ b/new/plomrogue/things.py
@@ -279,7 +279,7 @@ class ThingAnimate(Thing):
 
     def get_visible_map(self):
         stencil = self.get_stencil()
-        m = Map(self.surroundings.size, ' ')
+        m = Map(self.surroundings.size, ' ', self.surroundings.start_indented)
         for pos in m:
             if stencil[pos] == '.':
                 m[pos] = self.surroundings[pos]
-- 
2.30.2