home · contact · privacy
Don't enter command_thing mode when not carrying anything commandable.
[plomrogue2] / rogue_chat_curses.py
index 89c841140edc871c4108d91c6bb3b5f389599e0a..15f59bf5d915bd13d8b3c5fafe1f761440854cd8 100755 (executable)
@@ -49,7 +49,7 @@ mode_helps = {
     'enter_face': {
         'short': 'enter your face',
         'intro': '@ enter face line (enter nothing to abort):',
-        'long': 'Draw your face as ASCII art.  The string you enter must be 9 characters long, and will be divided on display into three lines of three characters each, from top to bottom..'
+        '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..'
     },
     'write': {
         'short': 'change terrain',
@@ -199,7 +199,7 @@ def cmd_PLAYER_ID(game, player_id):
     game.player_id = player_id
 cmd_PLAYER_ID.argtypes = 'int:nonneg'
 
-def cmd_THING(game, yx, thing_type, protection, thing_id, portable):
+def cmd_THING(game, yx, thing_type, protection, thing_id, portable, commandable):
     t = game.get_thing(thing_id)
     if not t:
         t = ThingBase(game, thing_id)
@@ -208,7 +208,8 @@ def cmd_THING(game, yx, thing_type, protection, thing_id, portable):
     t.type_ = thing_type
     t.protection = protection
     t.portable = portable
-cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg bool'
+    t.commandable = commandable
+cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg bool bool'
 
 def cmd_THING_NAME(game, thing_id, name):
     t = game.get_thing(thing_id)
@@ -220,6 +221,11 @@ def cmd_THING_FACE(game, thing_id, face):
     t.face = face
 cmd_THING_FACE.argtypes = 'int:pos string'
 
+def cmd_THING_HAT(game, thing_id, hat):
+    t = game.get_thing(thing_id)
+    t.hat = hat
+cmd_THING_HAT.argtypes = 'int:pos string'
+
 def cmd_THING_CHAR(game, thing_id, c):
     t = game.get_thing(thing_id)
     t.thing_char = c
@@ -304,9 +310,9 @@ def cmd_THING_INSTALLED(game, thing_id):
     game.get_thing(thing_id).installed = True
 cmd_THING_INSTALLED.argtypes = 'int:pos'
 
-def cmd_THING_CARRYING(game, thing_id):
-    game.get_thing(thing_id).carrying = True
-cmd_THING_CARRYING.argtypes = 'int:pos'
+def cmd_THING_CARRYING(game, thing_id, carried_id):
+    game.get_thing(thing_id).carrying = game.get_thing(carried_id)
+cmd_THING_CARRYING.argtypes = 'int:pos int:pos'
 
 def cmd_TERRAIN(game, terrain_char, terrain_desc):
     game.terrains[terrain_char] = terrain_desc
@@ -343,6 +349,7 @@ class Game(GameBase):
         self.register_command(cmd_THING_NAME)
         self.register_command(cmd_THING_CHAR)
         self.register_command(cmd_THING_FACE)
+        self.register_command(cmd_THING_HAT)
         self.register_command(cmd_THING_CARRYING)
         self.register_command(cmd_THING_INSTALLED)
         self.register_command(cmd_TERRAIN)
@@ -449,7 +456,7 @@ class TUI:
                                           "command_thing", "take_thing"]
         self.mode_play.available_actions = ["move", "drop_thing",
                                             "teleport", "door", "consume",
-                                            "install"]
+                                            "install", "wear"]
         self.mode_study.available_modes = ["chat", "play", "admin_enter", "edit"]
         self.mode_study.available_actions = ["toggle_map_mode", "move_explorer"]
         self.mode_admin.available_modes = ["admin_thing_protect", "control_pw_type",
@@ -498,6 +505,7 @@ class TUI:
             'consume': 'C',
             'door': 'D',
             'install': 'I',
+            'wear': 'W',
             'help': 'h',
             'toggle_map_mode': 'L',
             'toggle_tile_draw': 'm',
@@ -613,10 +621,16 @@ class TUI:
         if self.mode and self.mode.name == 'control_tile_draw':
             self.log_msg('@ finished tile protection drawing.')
         self.tile_draw = False
+        player = self.game.get_thing(self.game.player_id)
+        if mode_name == 'command_thing' and\
+           (not hasattr(player, 'carrying') or not player.carrying.commandable):
+            self.log_msg('? not carrying anything commandable')
+            self.flash = True
+            self.switch_mode('play')
+            return
         if mode_name == 'admin_enter' and self.is_admin:
             mode_name = 'admin'
         elif mode_name in {'name_thing', 'admin_thing_protect'}:
-            player = self.game.get_thing(self.game.player_id)
             thing = None
             for t in [t for t in self.game.things if t.position == player.position
                       and t.id_ != player.id_]:
@@ -665,6 +679,9 @@ class TUI:
                                 if t.portable and t.position in select_range]
             if len(self.selectables) == 0:
                 self.log_msg('none')
+                self.flash = True
+                self.switch_mode('play')
+                return
             else:
                 for i in range(len(self.selectables)):
                     t = self.selectables[i]
@@ -708,10 +725,14 @@ class TUI:
                     if protection == '.':
                         protection = 'none'
                     info_to_cache += ' / protection: %s\n' % protection
+                    if hasattr(t, 'hat'):
+                        info_to_cache += t.hat[0:6] + '\n'
+                        info_to_cache += t.hat[6:12] + '\n'
+                        info_to_cache += t.hat[12:18] + '\n'
                     if hasattr(t, 'face'):
-                        info_to_cache += t.face[0:3] + '\n'
-                        info_to_cache += t.face[3:6] + '\n'
-                        info_to_cache += t.face[6:9] + '\n'
+                        info_to_cache += t.face[0:6] + '\n'
+                        info_to_cache += t.face[6:12] + '\n'
+                        info_to_cache += t.face[12:18] + '\n'
             terrain_char = self.game.map_content[pos_i]
             terrain_desc = '?'
             if terrain_char in self.game.terrains:
@@ -975,6 +996,7 @@ class TUI:
             'toggle_map_mode': 'toggle map view',
             'toggle_tile_draw': 'toggle protection character drawing',
             'install': '(un-)install',
+            'wear': '(un-)wear',
             'door': 'open/close',
             'consume': 'consume',
         }
@@ -985,6 +1007,7 @@ class TUI:
             'drop_thing': 'DROP',
             'door': 'DOOR',
             'install': 'INSTALL',
+            'wear': 'WEAR',
             'move': 'MOVE',
             'command': 'COMMAND',
             'consume': 'INTOXICATE',
@@ -1056,7 +1079,7 @@ class TUI:
                 self.send('LOGIN ' + quote(self.input_))
                 self.input_ = ""
             elif self.mode.name == 'enter_face' and key == '\n':
-                if len(self.input_) != 9:
+                if len(self.input_) != 18:
                     self.log_msg('? wrong input length, aborting')
                 else:
                     self.send('PLAYER_FACE %s' % quote(self.input_))
@@ -1074,9 +1097,8 @@ class TUI:
                 self.input_ = ''
                 self.switch_mode('play')
             elif self.mode.name == 'command_thing' and key == '\n':
-                if task_action_on('command'):
-                    self.send('TASK:COMMAND ' + quote(self.input_))
-                    self.input_ = ""
+                self.send('TASK:COMMAND ' + quote(self.input_))
+                self.input_ = ""
             elif self.mode.name == 'control_pw_pw' and key == '\n':
                 if self.input_ == '':
                     self.log_msg('@ aborted')
@@ -1166,6 +1188,8 @@ class TUI:
                     self.send('TASK:INTOXICATE')
                 elif key == self.keys['install'] and task_action_on('install'):
                     self.send('TASK:INSTALL')
+                elif key == self.keys['wear'] and task_action_on('wear'):
+                    self.send('TASK:WEAR')
                 elif key == self.keys['teleport']:
                     player = self.game.get_thing(self.game.player_id)
                     if player.position in self.game.portals: