home · contact · privacy
Don't enter command_thing mode when not carrying anything commandable.
[plomrogue2] / rogue_chat_curses.py
index aeb955e60f9593d113f37fb6f0f33c4f9b2817d6..15f59bf5d915bd13d8b3c5fafe1f761440854cd8 100755 (executable)
@@ -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)
@@ -309,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
@@ -620,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_]:
@@ -1090,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')