home · contact · privacy
Add Hex map capabilities.
[plomrogue2-experiments] / new2 / rogue_chat_curses.py
index 6d0f8b77f8518f16b224c0afb761438793a63180..643023bcc6292961974de7be71d4476ce28f4c77 100755 (executable)
@@ -6,7 +6,7 @@ import threading
 from plomrogue.io_tcp import PlomSocket
 from plomrogue.game import GameBase
 from plomrogue.parser import Parser
-from plomrogue.mapping import YX
+from plomrogue.mapping import YX, MapGeometrySquare, MapGeometryHex
 from plomrogue.things import ThingBase
 from plomrogue.misc import quote
 
@@ -42,10 +42,27 @@ def cmd_THING_NAME(game, thing_id, name):
     t.name = name
 cmd_THING_NAME.argtypes = 'int:nonneg string'
 
-def cmd_MAP(game, size, content):
-    game.map_geometry.size = size
+def cmd_MAP(game, geometry, size, content):
+    map_geometry_class = globals()['MapGeometry' + geometry]
+    game.map_geometry = map_geometry_class(size)
     game.map_content = content
-cmd_MAP.argtypes = 'yx_tuple:pos string'
+    if type(game.map_geometry) == MapGeometrySquare:
+        game.tui.movement_keys = {
+            'w': 'UP',
+            'a': 'LEFT',
+            's': 'DOWN',
+            'd': 'RIGHT',
+        }
+    elif type(game.map_geometry) == MapGeometryHex:
+        game.tui.movement_keys = {
+            'w': 'UPLEFT',
+            'e': 'UPRIGHT',
+            'd': 'RIGHT',
+            'c': 'DOWNRIGHT',
+            'x': 'DOWNLEFT',
+            's': 'LEFT',
+        }
+cmd_MAP.argtypes = 'string:map_geometry yx_tuple:pos string'
 
 def cmd_GAME_STATE_COMPLETE(game):
     game.info_db = {}
@@ -113,6 +130,11 @@ class Game(GameBase):
         self.info_db = {}
         self.portals = {}
 
+    def get_string_options(self, string_option_type):
+        if string_option_type == 'map_geometry':
+            return ['Hex', 'Square']
+        return None
+
     def get_command(self, command_name):
         from functools import partial
         f = partial(self.commands[command_name], self)
@@ -348,17 +370,25 @@ class TUI:
             if self.mode.shows_info:
                 map_lines_split[self.explorer.y][self.explorer.x] = '?'
             map_lines = []
-            for line in map_lines_split:
-                map_lines += [''.join(line)]
-            map_center = YX(int(self.game.map_geometry.size.y / 2),
-                            int(self.game.map_geometry.size.x / 2))
+            if type(self.game.map_geometry) == MapGeometryHex:
+                indent = 0
+                for line in map_lines_split:
+                    map_lines += [indent*' ' + ' '.join(line)]
+                    indent = 0 if indent else 1
+            else:
+                for line in map_lines_split:
+                    map_lines += [''.join(line)]
             window_center = YX(int(self.size.y / 2),
                                int(self.window_width / 2))
             player = self.game.get_thing(self.game.player_id, False)
             center = player.position
             if self.mode.shows_info:
                 center = self.explorer
+            if type(self.game.map_geometry) == MapGeometryHex:
+                center = YX(center.y, center.x * 2)
             offset = center - window_center
+            if type(self.game.map_geometry) == MapGeometryHex and offset.y % 2:
+                offset += YX(0, 1)
             term_y = max(0, -offset.y)
             term_x = max(0, -offset.x)
             map_y = max(0, offset.y)
@@ -467,39 +497,27 @@ class TUI:
                     self.switch_mode('play')
                 self.input_ = ''
             elif self.mode == self.mode_study:
-                if key == 'c':
+                if key == 'C':
                     self.switch_mode('chat')
-                elif key == 'p':
+                elif key == 'P':
                     self.switch_mode('play')
                 elif key == 'A':
                     self.switch_mode('annotate', keep_position=True)
-                elif key == 'P':
+                elif key == 'p':
                     self.switch_mode('portal', keep_position=True)
-                elif key == 'w':
-                    move_explorer('UP')
-                elif key == 'a':
-                    move_explorer('LEFT')
-                elif key == 's':
-                    move_explorer('DOWN')
-                elif key == 'd':
-                    move_explorer('RIGHT')
+                elif key in self.movement_keys:
+                    move_explorer(self.movement_keys[key])
             elif self.mode == self.mode_play:
-                if key == 'c':
+                if key == 'C':
                     self.switch_mode('chat')
                 elif key == '?':
                     self.switch_mode('study')
-                if key == 'e':
+                if key == 'E':
                     self.switch_mode('edit')
                 elif key == 'f':
                     self.send('TASK:FLATTEN_SURROUNDINGS')
-                elif key == 'w':
-                    self.send('TASK:MOVE UP')
-                elif key == 'a':
-                    self.send('TASK:MOVE LEFT')
-                elif key == 's':
-                    self.send('TASK:MOVE DOWN')
-                elif key == 'd':
-                    self.send('TASK:MOVE RIGHT')
+                elif key in self.movement_keys:
+                    self.send('TASK:MOVE ' + self.movement_keys[key])
             elif self.mode == self.mode_edit:
                 self.send('TASK:WRITE ' + key)
                 self.switch_mode('play')