From: Christian Heller <c.heller@plomlompom.de> Date: Fri, 20 Nov 2020 00:25:08 +0000 (+0100) Subject: Add tile control drawing capabilities. X-Git-Url: https://plomlompom.com/repos/%7B%7Bprefix%7D%7D/%7B%7B%20web_path%20%7D%7D/static/foo.html?a=commitdiff_plain;h=d3167bc558c709d7f10a237def2763530b7fed32;p=plomrogue2 Add tile control drawing capabilities. --- diff --git a/config.json b/config.json index 01777ee..3538488 100644 --- a/config.json +++ b/config.json @@ -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", diff --git a/plomrogue/commands.py b/plomrogue/commands.py index c079599..1df56bc 100644 --- a/plomrogue/commands.py +++ b/plomrogue/commands.py @@ -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) diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index 0db2695..295c041 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -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/') diff --git a/rogue_chat_nocanvas_monochrome.html b/rogue_chat_nocanvas_monochrome.html index 7928e24..c2c6bc7 100644 --- a/rogue_chat_nocanvas_monochrome.html +++ b/rogue_chat_nocanvas_monochrome.html @@ -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';