home · contact · privacy
Add writable signs.
[plomrogue2] / rogue_chat_curses.py
index f7ac8cf0bf33c492eac88482d18f7c0b1a9c7c9b..a6471eed4f9da9c206b900a5e7d55437b0c26a94 100755 (executable)
@@ -53,13 +53,18 @@ mode_helps = {
     },
     'enter_face': {
         'short': 'edit face',
-        'intro': '@ enter face line (enter nothing to abort):',
+        'intro': '@ enter face line:',
         'long': 'Draw your face as ASCII art.  The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom..'
     },
+    'enter_design': {
+        'short': 'edit design',
+        'intro': '@ enter design:',
+        'long': 'Enter design for carried thing as ASCII art.'
+    },
     'enter_hat': {
         'short': 'edit hat',
-        'intro': '@ enter hat line (enter nothing to abort):',
-        'long': 'Draw your face as ASCII art.  The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom.  Eat cookies to extend the ASCII characters available for drawing.'
+        'intro': '@ enter hat line:',
+        'long': 'Draw your hat as ASCII art.  The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom.  Eat cookies to extend the ASCII characters available for drawing.'
     },
     'write': {
         'short': 'edit tile',
@@ -248,6 +253,11 @@ def cmd_THING_HAT(game, thing_id, hat):
     t.hat = hat
 cmd_THING_HAT.argtypes = 'int:pos string'
 
+def cmd_THING_DESIGN(game, thing_id, size, design):
+    t = game.get_thing_temp(thing_id)
+    t.design = [size, design]
+cmd_THING_DESIGN.argtypes = 'int:pos yx_tuple string'
+
 def cmd_THING_CHAR(game, thing_id, c):
     t = game.get_thing_temp(thing_id)
     t.thing_char = c
@@ -392,6 +402,7 @@ class Game(GameBase):
         self.register_command(cmd_THING_CHAR)
         self.register_command(cmd_THING_FACE)
         self.register_command(cmd_THING_HAT)
+        self.register_command(cmd_THING_DESIGN)
         self.register_command(cmd_THING_CARRYING)
         self.register_command(cmd_THING_INSTALLED)
         self.register_command(cmd_TERRAIN)
@@ -502,6 +513,7 @@ class TUI:
     mode_drop_thing = Mode('drop_thing', has_input_prompt=True)
     mode_enter_face = Mode('enter_face', has_input_prompt=True)
     mode_enter_hat = Mode('enter_hat', has_input_prompt=True)
+    mode_enter_design = Mode('enter_design', has_input_prompt=True)
     is_admin = False
     tile_draw = False
 
@@ -524,7 +536,7 @@ class TUI:
                                                          "toggle_tile_draw"]
         self.mode_edit.available_modes = ["write", "annotate", "portal",
                                           "name_thing", "enter_face", "enter_hat",
-                                          "password",
+                                          "enter_design", "password",
                                           "chat", "study", "play", "admin_enter"]
         self.mode_edit.available_actions = ["move", "flatten", "install",
                                             "toggle_map_mode"]
@@ -558,6 +570,7 @@ class TUI:
             'flatten': 'F',
             'switch_to_enter_face': 'f',
             'switch_to_enter_hat': 'H',
+            'switch_to_enter_design': 'D',
             'switch_to_take_thing': 'z',
             'switch_to_drop_thing': 'u',
             'teleport': 'p',
@@ -672,6 +685,11 @@ class TUI:
                 self.input_ = self.game.player.face[start:end]
             elif self.mode.name == 'enter_hat':
                 self.input_ = self.game.player.hat[start:end]
+        elif self.mode.name == 'enter_design':
+            width = self.game.player.carrying.design[0].x
+            start = self.ascii_draw_stage * width
+            end = (self.ascii_draw_stage + 1) * width
+            self.input_ = self.game.player.carrying.design[1][start:end]
 
     def send_tile_control_command(self):
         self.send('SET_TILE_CONTROL %s %s' %
@@ -712,6 +730,10 @@ class TUI:
             return fail('not carrying anything droppable')
         if mode_name == 'enter_hat' and not hasattr(self.game.player, 'hat'):
             return fail('not wearing hat to edit', 'edit')
+        if mode_name == 'enter_design' and\
+           (not self.game.player.carrying or
+            not hasattr(self.game.player.carrying, 'design')):
+            return fail('not carrying designable to edit', 'edit')
         if mode_name == 'admin_enter' and self.is_admin:
             mode_name = 'admin'
         self.mode = getattr(self, 'mode_' + mode_name)
@@ -824,6 +846,18 @@ class TUI:
                         info_to_cache += t.face[0:6] + '\n'
                         info_to_cache += t.face[6:12] + '\n'
                         info_to_cache += t.face[12:18] + '\n'
+                    if hasattr(t, 'design'):
+                        import textwrap
+                        line_length = t.design[0].x
+                        wrapper = textwrap.TextWrapper(drop_whitespace=False,
+                                                       width=line_length)
+                        lines = wrapper.wrap(t.design[1])
+                        if t.type_ == 'Sign':
+                            info_to_cache += '-' * (line_length + 4) + '\n'
+                        for line in lines:
+                            info_to_cache += '| %s |\n' % line
+                        if t.type_ == 'Sign':
+                            info_to_cache += '-' * (line_length + 4) + '\n'
             terrain_char = self.game.map_content[pos_i]
             terrain_desc = '?'
             if terrain_char in self.game.terrains:
@@ -1116,19 +1150,24 @@ class TUI:
             self.input_ = ''
             self.switch_mode('play')
 
-        def enter_ascii_art(command):
-            if len(self.input_) > 6:
-                self.log_msg('? wrong input length, must be max 6; try again')
+        def enter_ascii_art(command, height, width, with_pw=False):
+            if len(self.input_) > width:
+                self.log_msg('? wrong input length, '
+                             'must be max %s; try again' % width)
                 return
-            if len(self.input_) < 6:
-                self.input_ += ' ' * (6 - len(self.input_))
+            if len(self.input_) < width:
+                self.input_ += ' ' * (width - len(self.input_))
             self.log_msg('  ' + self.input_)
             self.full_ascii_draw += self.input_
             self.ascii_draw_stage += 1
-            if self.ascii_draw_stage < 3:
+            if self.ascii_draw_stage < height:
                 self.restore_input_values()
             else:
-                self.send('%s %s' % (command, quote(self.full_ascii_draw)))
+                if with_pw:
+                    self.send('%s %s %s' % (command, quote(self.full_ascii_draw),
+                                            quote(self.password)))
+                else:
+                    self.send('%s %s' % (command, quote(self.full_ascii_draw)))
                 self.full_ascii_draw = ""
                 self.ascii_draw_stage = 0
                 self.input_ = ""
@@ -1245,9 +1284,13 @@ class TUI:
                 self.send('LOGIN ' + quote(self.input_))
                 self.input_ = ""
             elif self.mode.name == 'enter_face' and key == '\n':
-                enter_ascii_art('PLAYER_FACE')
+                enter_ascii_art('PLAYER_FACE', 3, 6)
             elif self.mode.name == 'enter_hat' and key == '\n':
-                enter_ascii_art('PLAYER_HAT')
+                enter_ascii_art('PLAYER_HAT', 3, 6)
+            elif self.mode.name == 'enter_design' and key == '\n':
+                enter_ascii_art('THING_DESIGN',
+                                self.game.player.carrying.design[0].y,
+                                self.game.player.carrying.design[0].x, True)
             elif self.mode.name == 'take_thing' and key == '\n':
                 pick_selectable('PICK_UP')
             elif self.mode.name == 'drop_thing' and key == '\n':