From ee83c5baaf2a207a0e1c025985f59797db7cdf7a Mon Sep 17 00:00:00 2001 From: Christian Heller Date: Sat, 19 Dec 2020 03:18:39 +0100 Subject: [PATCH] Refactor hat editing into general design editing. --- plomrogue/commands.py | 37 +++++++------------------------- plomrogue/game.py | 12 +++-------- rogue_chat.html | 33 ++++++++++------------------- rogue_chat.py | 6 ++---- rogue_chat_curses.py | 49 +++++++++++++++++++------------------------ 5 files changed, 45 insertions(+), 92 deletions(-) diff --git a/plomrogue/commands.py b/plomrogue/commands.py index 8422161..9c34a1c 100644 --- a/plomrogue/commands.py +++ b/plomrogue/commands.py @@ -337,25 +337,6 @@ def cmd_PLAYER_FACE(game, face, connection_id): game.record_change(t.position, 'other') cmd_PLAYER_FACE.argtypes = 'string' -def cmd_PLAYER_HAT(game, hat, connection_id): - t = game.get_player(connection_id) - if not t: - raise GameError('can only edit hat when already logged in') - if not t.name in game.hats: - raise GameError('not currently wearing an editable hat') - if len(hat) != 18: - raise GameError('wrong hat string length') - legal_chars = t.get_cookie_chars() - for c in hat: - if c not in legal_chars: - raise GameError('used illegal character: "%s" – ' - 'allowed characters: %s' - % (c, legal_chars)) - game.hats[t.name] = hat - game.changed = True - game.record_change(t.position, 'other') -cmd_PLAYER_HAT.argtypes = 'string' - def cmd_GOD_PLAYER_FACE(game, name, face): if len(face) != 18: raise GameError('wrong face string length') @@ -372,17 +353,6 @@ def cmd_GOD_PLAYERS_HAT_CHARS(game, name, hat_chars): game.players_hat_chars[name] = hat_chars cmd_GOD_PLAYERS_HAT_CHARS.argtypes = 'string string' -def cmd_THING_HAT_DESIGN(game, thing_id, design): - if len(design) != 18: - raise GameError('hat design of wrong length') - t = game.get_thing(thing_id) - if not t: - raise GameError('thing of ID %s not found' % thing_id) - if t.type_ != 'Hat': - raise GameError('thing of ID %s not a hat' % thing_id) - t.design = design -cmd_THING_HAT_DESIGN.argtypes = 'int:pos string' - def cmd_THING_DESIGN(game, design, pw, connection_id): player = game.get_player(connection_id) if not player: @@ -393,6 +363,13 @@ def cmd_THING_DESIGN(game, design, pw, connection_id): raise GameError('wrong password for thing') if not hasattr(player.carrying, 'design'): raise GameError('carried thing not designable') + if player.carrying.type_ == 'Hat': + legal_chars = player.get_cookie_chars() + for c in design: + if c not in legal_chars: + raise GameError('used illegal character: "%s" – ' + 'allowed characters: %s' + % (c, legal_chars)) size = player.carrying.design_size if len(design) != size.y * size.x: raise GameError('design for carried thing of wrong length') diff --git a/plomrogue/game.py b/plomrogue/game.py index cfc4271..c560993 100755 --- a/plomrogue/game.py +++ b/plomrogue/game.py @@ -306,10 +306,7 @@ class Game(GameBase): quote(t.thing_char)), c_id) if hasattr(t, 'installable') and not t.portable: self.io.send('THING_INSTALLED %s' % (t.id_), c_id) - if t.type_ == 'Hat': - self.io.send('THING_HAT %s %s' % (t.id_, - quote(t.design)), c_id) - elif hasattr(t, 'design'): + if hasattr(t, 'design'): self.io.send('THING_DESIGN %s %s %s' % (t.id_, t.design_size, quote(t.design)), c_id) @@ -559,13 +556,10 @@ class Game(GameBase): write(f, 'GOD_THING_NAME %s %s' % (t.id_, quote(t.name))) if hasattr(t, 'installable') and (not t.portable): write(f, 'THING_INSTALLED %s' % t.id_) + if hasattr(t, 'design'): + write(f, 'GOD_THING_DESIGN %s %s' % (t.id_, quote(t.design))) if t.type_ == 'Door' and t.blocks_movement: write(f, 'THING_DOOR_CLOSED %s %s' % (t.id_, int(t.locked))) - elif t.type_ == 'Hat': - write(f, 'THING_HAT_DESIGN %s %s' % (t.id_, - quote(t.design))) - elif hasattr(t, 'design'): - write(f, 'GOD_THING_DESIGN %s %s' % (t.id_, quote(t.design))) elif t.type_ == 'MusicPlayer': write(f, 'THING_MUSICPLAYER_SETTINGS %s %s %s %s' % (t.id_, int(t.playing), t.playlist_index, int(t.repeat))) diff --git a/rogue_chat.html b/rogue_chat.html index f7d0234..304346d 100644 --- a/rogue_chat.html +++ b/rogue_chat.html @@ -72,7 +72,6 @@ terminal rows: - @@ -110,7 +109,6 @@ terminal rows:
  • (un-)wear:
  • -
  • @@ -186,11 +184,6 @@ let mode_helps = { 'intro': '@ enter design:', 'long': 'Enter design for carried thing as ASCII art.' }, - 'enter_hat': { - 'short': 'edit hat', - 'intro': '@ enter hat line:', - 'long': 'Draw your hat as ASCII art. The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom. Eat cookies to extend the ASCII characters available for drawing.' - }, 'write': { 'short': 'edit tile', 'intro': '', @@ -720,7 +713,6 @@ let tui = { mode_take_thing: new Mode('take_thing', true), mode_drop_thing: new Mode('drop_thing', true), mode_enter_face: new Mode('enter_face', true), - mode_enter_hat: new Mode('enter_hat', true), mode_enter_design: new Mode('enter_design', true), mode_admin_enter: new Mode('admin_enter', true), mode_admin: new Mode('admin'), @@ -761,8 +753,7 @@ let tui = { this.mode_control_tile_draw.available_actions = ["toggle_tile_draw"]; this.mode_edit.available_modes = ["write", "annotate", "portal", "name_thing", "enter_design", "password", "chat", "study", - "play", "admin_enter", "enter_face", - "enter_hat"] + "play", "admin_enter", "enter_face"] this.mode_edit.available_actions = ["move", "flatten", "install", "toggle_map_mode"] this.inputEl = document.getElementById("input"); @@ -832,8 +823,6 @@ let tui = { return fail('already carrying something'); } else if (mode_name == 'drop_thing' && !game.player.carrying) { return fail('not carrying anything droppable'); - } else if (mode_name == 'enter_hat' && !game.player.hat) { - return fail('not wearing hat to edit', 'edit'); } else if (mode_name == 'enter_design' && (!game.player.carrying || !game.player.carrying.design)) { return fail('not carrying designable to edit', 'edit'); @@ -943,8 +932,14 @@ let tui = { for (let [i, direction] of this.selectables.entries()) { this.log_msg(i + ': ' + direction); }; - } else if (this.mode.name == 'enter_hat') { - this.log_msg('legal characters: ' + game.players_hat_chars); + } else if (this.mode.name == 'enter_design') { + this.log_msg('@ The design you enter must be ' + + game.player.carrying.design[0][0] + ' lines of max ' + + game.player.carrying.design[0][1] + ' characters width each'); + if (game.player.carrying.type_ == 'Hat') { + this.log_msg('@ Legal characters: ' + game.players_hat_chars); + this.log_msg('@ (Eat cookies to extend the ASCII characters available for drawing.)'); + } } else if (this.mode.name == 'command_thing') { server.send(['TASK:COMMAND', 'HELP']); } else if (this.mode.name == 'control_pw_pw') { @@ -985,14 +980,10 @@ let tui = { if (game.player.carrying && game.player.carrying.protection) { this.inputEl.value = game.player.carrying.protection; } - } else if (['enter_face', 'enter_hat'].includes(this.mode.name)) { + } else if (this.mode.name == 'enter_face') { const start = this.ascii_draw_stage * 6; const end = (this.ascii_draw_stage + 1) * 6; - if (this.mode.name == 'enter_face') { - this.inputEl.value = game.player.face.slice(start, end); - } else if (this.mode.name == 'enter_hat') { - this.inputEl.value = game.player.hat.slice(start, end); - } + this.inputEl.value = game.player.face.slice(start, end); } else if (this.mode.name == 'enter_design') { const width = game.player.carrying.design[0][1]; const start = this.ascii_draw_stage * width; @@ -1638,8 +1629,6 @@ tui.inputEl.addEventListener('keydown', (event) => { tui.inputEl.value = ""; } else if (tui.mode.name == 'enter_face' && event.key == 'Enter') { tui.enter_ascii_art('PLAYER_FACE', 3, 6); - } else if (tui.mode.name == 'enter_hat' && event.key == 'Enter') { - tui.enter_ascii_art('PLAYER_HAT', 3, 6); } else if (tui.mode.name == 'enter_design' && event.key == 'Enter') { tui.enter_ascii_art('THING_DESIGN', game.player.carrying.design[0][0], diff --git a/rogue_chat.py b/rogue_chat.py index 71a94c7..af63366 100755 --- a/rogue_chat.py +++ b/rogue_chat.py @@ -10,11 +10,11 @@ from plomrogue.commands import (cmd_ALL, cmd_LOGIN, cmd_NICK, cmd_PING, cmd_THIN cmd_GOD_THING_NAME, cmd_THING_DOOR_CLOSED, cmd_GOD_THING_PROTECTION, cmd_THING_PROTECTION, cmd_SET_MAP_CONTROL_PASSWORD, cmd_SPAWN_POINT, - cmd_THING_MUSICPLAYER_SETTINGS, cmd_THING_HAT_DESIGN, + cmd_THING_MUSICPLAYER_SETTINGS, cmd_THING_MUSICPLAYER_PLAYLIST_ITEM, cmd_TERRAIN, cmd_THING_BOTTLE_EMPTY, cmd_PLAYER_FACE, cmd_GOD_PLAYER_FACE, cmd_GOD_PLAYER_HAT, - cmd_GOD_PLAYERS_HAT_CHARS, cmd_PLAYER_HAT, + cmd_GOD_PLAYERS_HAT_CHARS, cmd_TERRAIN_TAG, cmd_THING_DOOR_KEY, cmd_THING_CRATE_ITEM, cmd_MAP_CONTROL_PRESETS, cmd_THING_SPAWNPOINT_CREATED, cmd_GOD_THING_DESIGN, @@ -74,8 +74,6 @@ game.register_command(cmd_PLAYER_FACE) game.register_command(cmd_GOD_PLAYER_FACE) game.register_command(cmd_GOD_PLAYER_HAT) game.register_command(cmd_GOD_PLAYERS_HAT_CHARS) -game.register_command(cmd_PLAYER_HAT) -game.register_command(cmd_THING_HAT_DESIGN) game.register_command(cmd_THING_DOOR_KEY) game.register_command(cmd_THING_CRATE_ITEM) game.register_command(cmd_THING_DESIGN) diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index a6471ee..7ae6f67 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -61,11 +61,6 @@ mode_helps = { 'intro': '@ enter design:', 'long': 'Enter design for carried thing as ASCII art.' }, - 'enter_hat': { - 'short': 'edit hat', - 'intro': '@ enter hat line:', - 'long': 'Draw your hat as ASCII art. The string you enter must be 18 characters long, and will be divided on display into 3 lines of 6 characters each, from top to bottom. Eat cookies to extend the ASCII characters available for drawing.' - }, 'write': { 'short': 'edit tile', 'intro': '', @@ -512,7 +507,6 @@ class TUI: mode_take_thing = Mode('take_thing', has_input_prompt=True) mode_drop_thing = Mode('drop_thing', has_input_prompt=True) mode_enter_face = Mode('enter_face', has_input_prompt=True) - mode_enter_hat = Mode('enter_hat', has_input_prompt=True) mode_enter_design = Mode('enter_design', has_input_prompt=True) is_admin = False tile_draw = False @@ -535,8 +529,8 @@ class TUI: self.mode_control_tile_draw.available_actions = ["move_explorer", "toggle_tile_draw"] self.mode_edit.available_modes = ["write", "annotate", "portal", - "name_thing", "enter_face", "enter_hat", - "enter_design", "password", + "name_thing", "enter_face", "enter_design", + "password", "chat", "study", "play", "admin_enter"] self.mode_edit.available_actions = ["move", "flatten", "install", "toggle_map_mode"] @@ -569,7 +563,6 @@ class TUI: 'switch_to_admin_thing_protect': 'T', 'flatten': 'F', 'switch_to_enter_face': 'f', - 'switch_to_enter_hat': 'H', 'switch_to_enter_design': 'D', 'switch_to_take_thing': 'z', 'switch_to_drop_thing': 'u', @@ -678,13 +671,10 @@ class TUI: elif self.mode.name == 'admin_thing_protect': if hasattr(self.game.player.carrying, 'protection'): self.input_ = self.game.player.carrying.protection - elif self.mode.name in {'enter_face', 'enter_hat'}: + elif self.mode.name == 'enter_face': start = self.ascii_draw_stage * 6 end = (self.ascii_draw_stage + 1) * 6 - if self.mode.name == 'enter_face': - self.input_ = self.game.player.face[start:end] - elif self.mode.name == 'enter_hat': - self.input_ = self.game.player.hat[start:end] + self.input_ = self.game.player.face[start:end] elif self.mode.name == 'enter_design': width = self.game.player.carrying.design[0].x start = self.ascii_draw_stage * width @@ -728,8 +718,6 @@ class TUI: return fail('already carrying something') if mode_name == 'drop_thing' and not self.game.player.carrying: return fail('not carrying anything droppable') - if mode_name == 'enter_hat' and not hasattr(self.game.player, 'hat'): - return fail('not wearing hat to edit', 'edit') if mode_name == 'enter_design' and\ (not self.game.player.carrying or not hasattr(self.game.player.carrying, 'design')): @@ -797,8 +785,14 @@ class TUI: ['HERE'] + list(self.game.tui.movement_keys.values()) for i in range(len(self.selectables)): self.log_msg(str(i) + ': ' + self.selectables[i]) - elif self.mode.name == 'enter_hat': - self.log_msg('legal characters: ' + self.game.players_hat_chars) + elif self.mode.name == 'enter_design': + self.log_msg('@ The design you enter must be %s lines of max %s ' + 'characters width each' + % (self.game.player.carrying.design[0].y, + self.game.player.carrying.design[0].x)) + if self.game.player.carrying.type_ == 'Hat': + self.log_msg('@ Legal characters: ' + self.game.players_hat_chars) + self.log_msg('@ (Eat cookies to extend the ASCII characters available for drawing.)') elif self.mode.name == 'command_thing': self.send('TASK:COMMAND ' + quote('HELP')) elif self.mode.name == 'control_pw_pw': @@ -847,17 +841,20 @@ class TUI: info_to_cache += t.face[6:12] + '\n' info_to_cache += t.face[12:18] + '\n' if hasattr(t, 'design'): - import textwrap line_length = t.design[0].x - wrapper = textwrap.TextWrapper(drop_whitespace=False, - width=line_length) - lines = wrapper.wrap(t.design[1]) + lines = [] + for i in range(t.design[0].y): + start = i * line_length + end = (i + 1) * line_length + lines += [t.design[1][start:end]] if t.type_ == 'Sign': info_to_cache += '-' * (line_length + 4) + '\n' - for line in lines: - info_to_cache += '| %s |\n' % line - if t.type_ == 'Sign': + for line in lines: + info_to_cache += '| %s |\n' % line info_to_cache += '-' * (line_length + 4) + '\n' + else: + for line in lines: + info_to_cache += '%s\n' % line terrain_char = self.game.map_content[pos_i] terrain_desc = '?' if terrain_char in self.game.terrains: @@ -1285,8 +1282,6 @@ class TUI: self.input_ = "" elif self.mode.name == 'enter_face' and key == '\n': enter_ascii_art('PLAYER_FACE', 3, 6) - elif self.mode.name == 'enter_hat' and key == '\n': - enter_ascii_art('PLAYER_HAT', 3, 6) elif self.mode.name == 'enter_design' and key == '\n': enter_ascii_art('THING_DESIGN', self.game.player.carrying.design[0].y, -- 2.30.2