home · contact · privacy
Add key control hints to web client buttons.
[plomrogue2] / rogue_chat_curses.py
index c4fa34997173858ede1385d68d5034f957e7f45a..1711f6497bed16daf3fdc4dafadf8f793d261262 100755 (executable)
@@ -27,33 +27,37 @@ 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.'
+        'long': 'This mode allows you to change the map tile you currently stand on (if your world editing password authorizes you so).  Just enter any printable ASCII character to imprint it on the ground below you.'
     },
     'control_pw_type': {
         'short': 'change protection character password',
-        'long': 'This mode is the first of two steps to change the password for a tile protection character.  First enter the tile protection character for which you want to change the password.'
+        'long': 'This mode is the first of two steps to change the password for a protection character.  First enter the protection character for which you want to change the password.'
     },
     'control_pw_pw': {
         'short': 'change protection character password',
-        'long': 'This mode is the second of two steps to change the password for a tile protection character.  Enter the new password for the tile protection character you chose.'
+        'long': 'This mode is the second of two steps to change the password for a protection character.  Enter the new password for the protection character you chose.'
     },
     'control_tile_type': {
         'short': 'change tiles protection',
-        'long': 'This mode is the first of two steps to change tile protection areas on the map.  First enter the tile tile protection character you want to write.'
+        'long': 'This mode is the first of two steps to change tile protection areas on the map.  First enter the tile protection character you want to write.'
     },
     'control_tile_draw': {
         'short': 'change tiles protection',
-        'long': 'This mode is the second of two steps to change tile protection areas on the map.  Toggle tile protection drawing on/off and move the ?? cursor around the map to draw the selected tile protection character.'
+        'long': 'This mode is the second of two steps to change tile protection areas on the map.  Toggle tile protection drawing on/off and move the ?? cursor around the map to draw the selected protection character.'
     },
     'annotate': {
         'short': 'annotate tile',
-        'long': 'This mode allows you to add/edit a comment on the tile you are currently standing on (provided your map editing password authorizes you so).  Hit Return to leave.'
+        'long': 'This mode allows you to add/edit a comment on the tile you are currently standing on (provided your world editing password authorizes you so).  Hit Return to leave.'
     },
     'portal': {
         'short': 'edit portal',
-        'long': 'This mode allows you to imprint/edit/remove a teleportation target on the ground you are currently standing on (provided your map editing password authorizes you so).  Enter or edit a URL to imprint a teleportation target; enter emptiness to remove a pre-existing teleportation target.  Hit Return to leave.'
+        'long': 'This mode allows you to imprint/edit/remove a teleportation target on the ground you are currently standing on (provided your world editing password authorizes you so).  Enter or edit a URL to imprint a teleportation target; enter emptiness to remove a pre-existing teleportation target.  Hit Return to leave.'
     },
     'chat': {
         'short': 'chat',
@@ -72,8 +76,8 @@ mode_helps = {
         'long': 'Waiting for a server response.'
     },
     'password': {
-        'short': 'set map edit password',
-        'long': 'This mode allows you to change the password that you send to authorize yourself for editing password-protected map tiles.  Hit return to confirm and leave.'
+        'short': 'set world edit password',
+        'long': 'This mode allows you to change the password that you send to authorize yourself for editing password-protected elements of the world.  Hit return to confirm and leave.'
     },
     'admin_enter': {
         'short': 'become admin',
@@ -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
@@ -565,13 +575,15 @@ class TUI:
         elif self.mode.name == 'admin_enter':
             self.log_msg('@ enter admin password:')
         elif self.mode.name == 'control_pw_type':
-            self.log_msg('@ enter tile protection character for which you want to change the password:')
+            self.log_msg('@ enter 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:')
+            self.log_msg('@ enter 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)
+            self.log_msg('@ enter protection password for "%s":' % self.tile_control_char)
         elif self.mode.name == 'control_tile_draw':
-            self.log_msg('@ can draw tile protection character "%s", turn drawing on/off with [%s], finish with [%s].' % (self.tile_control_char, self.keys['toggle_tile_draw'], self.keys['switch_to_admin_enter']))
+            self.log_msg('@ can draw protection character "%s", turn drawing on/off with [%s], finish with [%s].' % (self.tile_control_char, self.keys['toggle_tile_draw'], self.keys['switch_to_admin_enter']))
         self.input_ = ""
         self.restore_input_values()
 
@@ -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'):
@@ -805,6 +820,11 @@ class TUI:
                 content += '/%s or /study – switch to study mode\n' % self.keys['switch_to_study']
                 content += '/%s or /edit – switch to map edit mode\n' % self.keys['switch_to_edit']
                 content += '/%s or /admin – switch to admin mode\n' % self.keys['switch_to_admin_enter']
+            elif self.mode.name == 'admin':
+                content += "Available actions:\n"
+                if 'MOVE' in self.game.tasks:
+                    content += "[%s] – move player\n" % ','.join(self.movement_keys)
+                content += '\n'
             content += self.mode.list_available_modes(self)
             for i in range(self.size.y):
                 safe_addstr(i,
@@ -822,8 +842,8 @@ class TUI:
 
         def draw_screen():
             stdscr.clear()
+            recalc_input_lines()
             if self.mode.has_input_prompt:
-                recalc_input_lines()
                 draw_input()
             if self.mode.shows_info:
                 draw_info()
@@ -915,6 +935,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 +976,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_ == '':
@@ -1000,6 +1029,8 @@ class TUI:
             elif self.mode.name == 'admin':
                 if self.mode.mode_switch_on_key(self, key):
                     continue
+                elif key in self.movement_keys and 'MOVE' in self.game.tasks:
+                    self.send('TASK:MOVE ' + self.movement_keys[key])
             elif self.mode.name == 'edit':
                 if self.mode.mode_switch_on_key(self, key):
                     continue