home · contact · privacy
Add tile control drawing capabilities.
authorChristian Heller <c.heller@plomlompom.de>
Fri, 20 Nov 2020 00:25:08 +0000 (01:25 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 20 Nov 2020 00:25:08 +0000 (01:25 +0100)
config.json
plomrogue/commands.py
rogue_chat_curses.py
rogue_chat_nocanvas_monochrome.html

index 01777ee60737522417ecc3ccfc4c94329d561557..35384883fecaf2ecac79c52036835ff6fa4f4433 100644 (file)
@@ -8,6 +8,7 @@
     "switch_to_edit": "m",
     "switch_to_admin": "A",
     "switch_to_control_pw_pw": "C",
+    "switch_to_control_tile_type": "Q",
     "flatten": "F",
     "take_thing": "z",
     "drop_thing": "u",
index c0795991666f941cb85ecfe11d446b61d8dab9f8..1df56bc4ed49ce36bd6e1cecd723f24f0997a2ba 100644 (file)
@@ -109,7 +109,8 @@ def cmd_SET_TILE_CONTROL(game, yx, control_char, connection_id):
     big_yx, little_yx = player.fov_stencil.source_yxyx(yx)
     map_control = game.get_map(big_yx, 'control')
     map_control[little_yx] = control_char
-cmd_SET_TILE_CONTROL.argtypes = 'yx:nonneg char'
+    game.changed = True
+cmd_SET_TILE_CONTROL.argtypes = 'yx_tuple:nonneg char'
 
 def cmd_SET_MAP_CONTROL_PASSWORD(game, tile_class, password, connection_id):
     player = game.get_player(connection_id)
index 0db2695266ea5aa45c66fff3153d0a230b46a714..295c04192bda3871ec2057088781299d0d595bd8 100755 (executable)
@@ -27,9 +27,17 @@ mode_helps = {
         'long': 'This mode is the first of two steps to change the password for a tile control character.  First enter the tile control character for which you want to change the password!'
     },
     'control_pw_pw': {
-        'short': '',
+        'short': 'change tile control password',
         'long': 'This mode is the second of two steps to change the password for a tile control character.  Enter the new password for the tile control character you chose.'
     },
+    'control_tile_type': {
+        'short': 'change tiles control',
+        'long': 'This mode is the first of two steps to change tile control areas on the map.  First enter the tile control character you want to write.'
+    },
+    'control_tile_draw': {
+        'short': 'change tiles control',
+        'long': 'This mode is the second of two steps to change tile control areas on the map.  Move cursor around the map to draw selected tile control character'
+    },
     'annotate': {
         'short': 'annotation',
         '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.'
@@ -43,15 +51,15 @@ mode_helps = {
         'long': 'This mode allows you to engage in chit-chat with other users.  Any line you enter into the input prompt that does not start with a "/" will be sent out to nearby players – but barriers and distance will reduce what they can read, so stand close to them to ensure they get your message.  Lines that start with a "/" are used for commands like:'
     },
     'login': {
-        'short': '',
+        'short': 'login',
         'long': 'Pick your player name.'
     },
     'waiting_for_server': {
-        'short': '',
+        'short': 'waiting for server response',
         'long': 'Waiting for a server response.'
     },
     'post_login_wait': {
-        'short': '',
+        'short': 'waiting for server response',
         'long': 'Waiting for a server response.'
     },
     'password': {
@@ -328,6 +336,8 @@ class TUI:
     mode_edit = Mode('edit', is_single_char_entry=True)
     mode_control_pw_type = Mode('control_pw_type', is_single_char_entry=True)
     mode_control_pw_pw = Mode('control_pw_pw', has_input_prompt=True)
+    mode_control_tile_type = Mode('control_tile_type', is_single_char_entry=True)
+    mode_control_tile_draw = Mode('control_tile_draw')
     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)
@@ -342,8 +352,10 @@ class TUI:
         self.mode_play.available_modes = ["chat", "study", "edit",
                                           "annotate", "portal",
                                           "password", "admin",
-                                          "control_pw_type"]
+                                          "control_pw_type",
+                                          "control_tile_type"]
         self.mode_study.available_modes = ["chat", "play"]
+        self.mode_control_tile_draw.available_modes = ["play"]
         self.host = host
         self.game = Game()
         self.game.tui = self
@@ -365,6 +377,7 @@ class TUI:
             'switch_to_edit': 'm',
             'switch_to_admin': 'A',
             'switch_to_control_pw_type': 'C',
+            'switch_to_control_tile_type': 'Q',
             'flatten': 'F',
             'take_thing': 'z',
             'drop_thing': 'u',
@@ -461,13 +474,21 @@ class TUI:
         elif self.mode.name == 'password':
             self.input_ = self.password
 
+    def send_tile_control_command(self):
+        self.send('SET_TILE_CONTROL %s %s' %
+                  (self.explorer, quote(self.tile_control_char)))
+
     def switch_mode(self, mode_name):
         self.map_mode = 'terrain'
         self.mode = getattr(self, 'mode_' + mode_name)
-        if self.mode.shows_info:
+        if self.mode.shows_info or self.mode.name == 'control_tile_draw':
             player = self.game.get_thing(self.game.player_id)
             self.explorer = YX(player.position.y, player.position.x)
-            self.query_info()
+            if self.mode.shows_info:
+                self.query_info()
+            elif self.mode.name == 'control_tile_draw':
+                self.send_tile_control_command()
+                self.map_mode = 'control'
         if self.mode.is_single_char_entry:
             self.show_help = True
         if self.mode.name == 'waiting_for_server':
@@ -533,7 +554,10 @@ class TUI:
             target = self.game.map_geometry.move_yx(self.explorer, direction)
             if target:
                 self.explorer = target
-                self.query_info()
+                if self.mode.shows_info:
+                    self.query_info()
+                elif self.mode.name == 'control_tile_draw':
+                    self.send_tile_control_command()
             else:
                 self.flash = True
 
@@ -604,7 +628,8 @@ class TUI:
             help = "hit [%s] for help" % self.keys['help']
             if self.mode.has_input_prompt:
                 help = "enter /help for help"
-            safe_addstr(1, self.window_width, 'MODE: %s – %s' % (self.mode.name, help))
+            safe_addstr(1, self.window_width,
+                        'MODE: %s – %s' % (self.mode.short_desc, help))
 
         def draw_map():
             if not self.game.turn_complete:
@@ -633,7 +658,7 @@ class TUI:
                         meta_char = '+'
                     map_lines_split[t.position.y][t.position.x] = symbol + meta_char
                     used_positions += [t.position]
-            if self.mode.shows_info:
+            if self.mode.shows_info or self.mode.name == 'control_tile_draw':
                 map_lines_split[self.explorer.y][self.explorer.x] = '??'
             map_lines = []
             if type(self.game.map_geometry) == MapGeometryHex:
@@ -665,8 +690,8 @@ class TUI:
                 map_y += 1
 
         def draw_help():
-            content = "%s mode help\n\n%s\n\n" % (self.mode.name,
-                                                  self.mode.help_intro)
+            content = "%s help\n\n%s\n\n" % (self.mode.short_desc,
+                                             self.mode.help_intro)
             if self.mode.name == 'play':
                 content += "Available actions:\n"
                 if 'MOVE' in self.game.tasks:
@@ -864,6 +889,14 @@ class TUI:
             elif self.mode.name == 'control_pw_type':
                 self.tile_control_char = key
                 self.switch_mode('control_pw_pw')
+            elif self.mode.name == 'control_tile_type':
+                self.tile_control_char = key
+                self.switch_mode('control_tile_draw')
+            elif self.mode.name == 'control_tile_draw':
+                if self.mode.mode_switch_on_key(self, key):
+                    continue
+                elif key in self.movement_keys:
+                    move_explorer(self.movement_keys[key])
 
 #TUI('localhost:5000')
 TUI('wss://plomlompom.com/rogue_chat/')
index 7928e2412f8b6c2acfd3006dad58bb0c164a0e95..c2c6bc7d338ae912218f91df48d5f2c0ba532e32 100644 (file)
@@ -32,6 +32,7 @@ terminal columns: <input id="n_cols" type="number" step=4 min=80 value=80 />
 <button id="toggle_map_mode">toggle terrain/annotations/control view</button>
 <button id="switch_to_admin">become admin</button>
 <button id="switch_to_control_pw_type">change tile control password</button>
+<button id="switch_to_control_tile_type">change tiles control</button>
 </div>
 <h3>edit keybindings</h3> (see <a href="https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values">here</a> for non-obvious available values):<br />
 <ul>
@@ -57,6 +58,7 @@ terminal columns: <input id="n_cols" type="number" step=4 min=80 value=80 />
 <li>enter tile password (from play mode): <input id="key_switch_to_password" type="text" value="P" />
 <li>enter admin password (from play mode): <input id="key_switch_to_admin" type="text" value="A" />
 <li>change tile control password (from play mode): <input id="key_switch_to_control_pw_type" type="text" value="C" />
+<li>change tiles control (from play mode): <input id="key_switch_to_control_tile_type" type="text" value="Q" />
 <li>annotate tile (from play mode): <input id="key_switch_to_annotate" type="text" value="M" />
 <li>annotate portal (from play mode): <input id="key_switch_to_portal" type="text" value="T" />
 <li>toggle terrain/annotations/control view (from study mode): <input id="key_toggle_map_mode" type="text" value="M" />
@@ -84,9 +86,17 @@ let mode_helps = {
         'long': 'This mode is the first of two steps to change the password for a tile control character.  First enter the tile control character for which you want to change the password!'
     },
     'control_pw_pw': {
-        'short': '',
+        'short': 'change tile control password',
         'long': 'This mode is the second of two steps to change the password for a tile control character.  Enter the new password for the tile control character you chose.'
     },
+    'control_tile_type': {
+        'short': 'change tiles control',
+        'long': 'This mode is the first of two steps to change tile control areas on the map.  First enter the tile control character you want to write.'
+    },
+    'control_tile_draw': {
+        'short': 'change tiles control',
+        'long': 'This mode is the second of two steps to change tile control areas on the map.  Move cursor around the map to draw selected tile control character'
+    },
     'annotate': {
         'short': 'annotation',
         '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.'
@@ -100,15 +110,15 @@ let mode_helps = {
         'long': 'This mode allows you to engage in chit-chat with other users.  Any line you enter into the input prompt that does not start with a "/" will be sent out to nearby players – but barriers and distance will reduce what they can read, so stand close to them to ensure they get your message.  Lines that start with a "/" are used for commands like:'
     },
     'login': {
-        'short': '',
+        'short': 'login',
         'long': 'Pick your player name.'
     },
     'waiting_for_server': {
-        'short': '',
+        'short': 'waiting for server response',
         'long': 'Waiting for a server response.'
     },
     'post_login_wait': {
-        'short': '',
+        'short': 'waiting for server response',
         'long': 'Waiting for a server response.'
     },
     'password': {
@@ -452,12 +462,17 @@ let tui = {
   mode_password: new Mode('password', true),
   mode_admin: new Mode('admin', true),
   mode_control_pw_pw: new Mode('control_pw_pw', true),
+  mode_control_tile_type: new Mode('control_tile_type',
+                                   false, false, false, true),
+  mode_control_tile_draw: new Mode('control_tile_draw'),
   init: function() {
       this.mode_play.available_modes = ["chat", "study", "edit",
                                         "annotate", "portal",
                                         "password", "admin",
-                                        "control_pw_type"]
+                                        "control_pw_type",
+                                        "control_tile_type"]
       this.mode_study.available_modes = ["chat", "play"]
+      this.mode_control_tile_draw.available_modes = ["play"]
       this.mode = this.mode_waiting_for_server;
       this.inputEl = document.getElementById("input");
       this.inputEl.focus();
@@ -492,9 +507,14 @@ let tui = {
     this.inputEl.focus();
     this.map_mode = 'terrain';
     this.mode = this['mode_' + mode_name];
-    if (this.mode.shows_info && game.player_id in game.things) {
-      explorer.position = game.things[game.player_id].position;
-      explorer.query_info();
+    if (game.player_id in game.things && (this.mode.shows_info || this.mode.name == 'control_tile_draw')) {
+        explorer.position = game.things[game.player_id].position;
+        if (this.mode.shows_info) {
+        explorer.query_info();
+        } else if (this.mode.name == 'control_tile_draw') {
+            explorer.send_tile_control_command();
+            this.map_mode = 'control';
+        }
     }
     this.empty_input();
     this.restore_input_values();
@@ -512,6 +532,7 @@ let tui = {
     document.getElementById("switch_to_password").disabled = true;
     document.getElementById("switch_to_admin").disabled = true;
     document.getElementById("switch_to_control_pw_type").disabled = true;
+    document.getElementById("switch_to_control_tile_type").disabled = true;
     document.getElementById("move_left").disabled = true;
     document.getElementById("move_upleft").disabled = true;
     document.getElementById("move_up").disabled = true;
@@ -520,7 +541,7 @@ let tui = {
     document.getElementById("move_down").disabled = true;
     document.getElementById("move_downright").disabled = true;
     document.getElementById("move_right").disabled = true;
-    if (this.mode.name == 'play' || this.mode.name == 'study') {
+    if (this.mode.name == 'play' || this.mode.name == 'study' || this.mode.name == 'control_tile_draw') {
         document.getElementById("move_left").disabled = false;
         document.getElementById("move_right").disabled = false;
         if (game.map_geometry == 'Hex') {
@@ -567,6 +588,7 @@ let tui = {
         document.getElementById("switch_to_password").disabled = false;
         document.getElementById("switch_to_admin").disabled = false;
         document.getElementById("switch_to_control_pw_type").disabled = false;
+        document.getElementById("switch_to_control_tile_type").disabled = false;
     } else if (this.mode.name == 'study') {
         document.getElementById("toggle_map_mode").disabled = false;
     } else if (this.mode.is_single_char_entry) {
@@ -575,6 +597,8 @@ let tui = {
         this.log_msg('@ enter admin password:')
     } else if (this.mode.name == 'control_pw_pw') {
         this.log_msg('@ enter tile control password for "' + this.tile_control_char + '":');
+    } else if (this.mode.name == 'control_pw_pw') {
+        this.log_msg('@ enter tile control password for "' + this.tile_control_char + '":');
     }
     this.full_refresh();
   },
@@ -669,7 +693,7 @@ let tui = {
             used_positions.push(t.position.toString());
         };
     }
-    if (tui.mode.shows_info) {
+    if (tui.mode.shows_info || tui.mode.name == 'control_tile_draw') {
         map_lines_split[explorer.position[0]][explorer.position[1]] = '??';
     }
     let map_lines = []
@@ -714,7 +738,7 @@ let tui = {
       if (this.mode.has_input_prompt) {
           help = 'enter /help for help';
       }
-      terminal.write(0, this.window_width, 'MODE: ' + this.mode.name + ' – ' + help);
+      terminal.write(0, this.window_width, 'MODE: ' + this.mode.short_desc + ' – ' + help);
   },
   draw_turn_line: function(n) {
     terminal.write(1, this.window_width, 'TURN: ' + game.turn);
@@ -746,7 +770,7 @@ let tui = {
   },
   draw_help: function() {
       let movement_keys_desc = Object.keys(this.movement_keys).join(',');
-      let content = this.mode.name + " mode help\n\n" + this.mode.help_intro + "\n\n";
+      let content = this.mode.short_desc + " help\n\n" + this.mode.help_intro + "\n\n";
       if (this.mode.name == 'play') {
           content += "Available actions:\n";
           if (game.tasks.includes('MOVE')) {
@@ -895,7 +919,11 @@ let explorer = {
         let target = game.move(this.position, direction);
         if (target) {
             this.position = target
-            this.query_info();
+            if (tui.mode.shows_info) {
+                this.query_info();
+            } else if (tui.mode.name == 'control_tile_draw') {
+                this.send_tile_control_command();
+            }
         } else {
             terminal.blink_screen();
         };
@@ -968,6 +996,9 @@ let explorer = {
             msg = " ";  // triggers portal deletion
         }
         server.send(["PORTAL", unparser.to_yx(explorer.position), msg, tui.password]);
+    },
+    send_tile_control_command: function() {
+        server.send(["SET_TILE_CONTROL", unparser.to_yx(this.position), tui.tile_control_char]);
     }
 }
 
@@ -984,6 +1015,9 @@ tui.inputEl.addEventListener('input', (event) => {
     } else if (tui.mode.name == 'control_pw_type' && tui.inputEl.value.length > 0) {
         tui.tile_control_char = tui.inputEl.value[0];
         tui.switch_mode('control_pw_pw');
+    } else if (tui.mode.name == 'control_tile_type' && tui.inputEl.value.length > 0) {
+        tui.tile_control_char = tui.inputEl.value[0];
+        tui.switch_mode('control_tile_draw');
     }
     tui.full_refresh();
 }, false);
@@ -1077,8 +1111,6 @@ tui.inputEl.addEventListener('keydown', (event) => {
     } else if (tui.mode.name == 'study') {
         if (tui.mode.mode_switch_on_key(event)) {
               null;
-        } else if (event.key == tui.keys.switch_to_play) {
-            tui.switch_mode('play');
         } else if (event.key in tui.movement_keys) {
             explorer.move(tui.movement_keys[event.key]);
         } else if (event.key == tui.keys.toggle_map_mode) {
@@ -1090,6 +1122,12 @@ tui.inputEl.addEventListener('keydown', (event) => {
                 tui.map_mode = 'terrain';
             }
         };
+    } else if (tui.mode.name == 'control_tile_draw') {
+        if (tui.mode.mode_switch_on_key(event)) {
+              null;
+        } else if (event.key in tui.movement_keys) {
+            explorer.move(tui.movement_keys[event.key]);
+        };
     }
     tui.full_refresh();
 }, false);
@@ -1168,6 +1206,10 @@ document.getElementById("switch_to_control_pw_type").onclick = function() {
     tui.switch_mode('control_pw_type');
     tui.full_refresh();
 };
+document.getElementById("switch_to_control_tile_type").onclick = function() {
+    tui.switch_mode('control_tile_type');
+    tui.full_refresh();
+};
 document.getElementById("toggle_map_mode").onclick = function() {
     if (tui.map_mode == 'terrain') {
         tui.map_mode = 'annotations';