home · contact · privacy
Add thing protection.
[plomrogue2] / rogue_chat_curses.py
index 7ffee570842b6bb234e1bd143889c331006d7188..5ad366a78815e6fd6d3526d256f62e8232b1c7ed 100755 (executable)
@@ -27,6 +27,10 @@ mode_helps = {
         'short': 'name thing',
         'long': 'Give name to/change name of thing here.'
     },
+    'admin_thing_protect': {
+        'short': 'change thing protection',
+        'long': 'Change protection character for thing here.'
+    },
     'write': {
         'short': 'change terrain',
         'long': 'This mode allows you to change the map tile you currently stand on (if your map editing password authorizes you so).  Just enter any printable ASCII character to imprint it on the ground below you.'
@@ -156,14 +160,15 @@ 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, thing_id):
+def cmd_THING(game, yx, thing_type, protection, thing_id):
     t = game.get_thing(thing_id)
     if not t:
         t = ThingBase(game, thing_id)
         game.things += [t]
     t.position = yx
     t.type_ = thing_type
-cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type int:nonneg'
+    t.protection = protection
+cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg'
 
 def cmd_THING_NAME(game, thing_id, name):
     t = game.get_thing(thing_id)
@@ -360,6 +365,7 @@ class TUI:
     mode_control_pw_pw = Mode('control_pw_pw', has_input_prompt=True)
     mode_control_tile_type = Mode('control_tile_type', has_input_prompt=True)
     mode_control_tile_draw = Mode('control_tile_draw')
+    mode_admin_thing_protect = Mode('admin_thing_protect', has_input_prompt=True)
     mode_annotate = Mode('annotate', has_input_prompt=True, shows_info=True)
     mode_portal = Mode('portal', has_input_prompt=True, shows_info=True)
     mode_chat = Mode('chat', has_input_prompt=True)
@@ -376,7 +382,7 @@ class TUI:
         import json
         self.mode_play.available_modes = ["chat", "study", "edit", "admin_enter"]
         self.mode_study.available_modes = ["chat", "play", "admin_enter", "edit"]
-        self.mode_admin.available_modes = ["control_pw_type",
+        self.mode_admin.available_modes = ["admin_thing_protect", "control_pw_type",
                                            "control_tile_type", "chat",
                                            "study", "play", "edit"]
         self.mode_control_tile_draw.available_modes = ["admin_enter"]
@@ -408,6 +414,7 @@ class TUI:
             'switch_to_admin_enter': 'A',
             'switch_to_control_pw_type': 'C',
             'switch_to_control_tile_type': 'Q',
+            'switch_to_admin_thing_protect': 'T',
             'flatten': 'F',
             'take_thing': 'z',
             'drop_thing': 'u',
@@ -508,6 +515,9 @@ class TUI:
         elif self.mode.name == 'name_thing':
             if hasattr(self.thing_selected, 'name'):
                 self.input_ = self.thing_selected.name
+        elif self.mode.name == 'admin_thing_protect':
+            if hasattr(self.thing_selected, 'protection'):
+                self.input_ = self.thing_selected.protection
 
     def send_tile_control_command(self):
         self.send('SET_TILE_CONTROL %s %s' %
@@ -527,7 +537,7 @@ class TUI:
         self.tile_draw = False
         if mode_name == 'admin_enter' and self.is_admin:
             mode_name = 'admin'
-        elif mode_name == 'name_thing':
+        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
@@ -568,6 +578,8 @@ class TUI:
             self.log_msg('@ enter tile protection character for which you want to change the password:')
         elif self.mode.name == 'control_tile_type':
             self.log_msg('@ enter tile protection character which you want to draw:')
+        elif self.mode.name == 'admin_thing_protect':
+            self.log_msg('@ enter thing protection character:')
         elif self.mode.name == 'control_pw_pw':
             self.log_msg('@ enter tile protection password for "%s":' % self.tile_control_char)
         elif self.mode.name == 'control_tile_draw':
@@ -665,8 +677,11 @@ class TUI:
                 info += 'PROTECTION: %s\n' % protection
                 for t in self.game.things:
                     if t.position == self.explorer:
-                        info += 'THING: %s / %s' % (t.type_,
-                                                    self.game.thing_types[t.type_])
+                        protection = t.protection
+                        if protection == '.':
+                            protection = 'unprotected'
+                        info += 'THING: %s / protection: %s / %s' %\
+                            (t.type_, protection, self.game.thing_types[t.type_])
                         if hasattr(t, 'player_char'):
                             info += t.player_char
                         if hasattr(t, 'name'):
@@ -915,6 +930,14 @@ class TUI:
                 else:
                     self.tile_control_char = self.input_
                     self.switch_mode('control_pw_pw')
+            elif self.mode.name == 'admin_thing_protect' and key == '\n':
+                if len(self.input_) != 1:
+                    self.log_msg('@ entered non-single-char, therefore aborted')
+                else:
+                    self.send('THING_PROTECTION %s %s' % (self.thing_selected.id_,
+                                                          quote(self.input_)))
+                    self.log_msg('@ sent new protection character for thing')
+                self.switch_mode('admin')
             elif self.mode.name == 'control_tile_type' and key == '\n':
                 if len(self.input_) != 1:
                     self.log_msg('@ entered non-single-char, therefore aborted')
@@ -948,8 +971,9 @@ class TUI:
             elif self.mode.name == 'name_thing' and key == '\n':
                 if self.input_ == '':
                     self.input_ = ' '
-                self.send('THING_NAME %s %s' % (self.thing_selected.id_,
-                                                quote(self.input_)))
+                self.send('THING_NAME %s %s %s' % (self.thing_selected.id_,
+                                                   quote(self.input_),
+                                                   quote(self.password)))
                 self.switch_mode('edit')
             elif self.mode.name == 'annotate' and key == '\n':
                 if self.input_ == '':