X-Git-Url: https://plomlompom.com/repos/feed.xml?a=blobdiff_plain;f=rogue_chat_curses.py;h=9d2ab3befde074db274e23349703dba0f5691b07;hb=afca68ffc4beb3a8365875d459fc2ce05784f2c0;hp=ff0c46c579559e0faacbb8bee6ff07ac19b01ffc;hpb=3b86e8effe9aa77fa87f86a1057d12d4c8019324;p=plomrogue2 diff --git a/rogue_chat_curses.py b/rogue_chat_curses.py index ff0c46c..9d2ab3b 100755 --- a/rogue_chat_curses.py +++ b/rogue_chat_curses.py @@ -623,6 +623,7 @@ class TUI: self.disconnected = False self.game.thing_types = {} self.game.terrains = {} + self.is_admin = False time.sleep(0.1) # give potential SSL negotation some time … self.socket.send('TASKS') self.socket.send('TERRAINS') @@ -706,6 +707,8 @@ class TUI: self.log_msg('@ finished tile protection drawing.') self.draw_face = False self.tile_draw = False + self.ascii_draw_stage = 0 + self.full_ascii_draw = '' if mode_name == 'command_thing' and\ (not self.game.player.carrying or not self.game.player.carrying.commandable): @@ -786,13 +789,16 @@ class TUI: for i in range(len(self.selectables)): self.log_msg(str(i) + ': ' + self.selectables[i]) 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('@ 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)) self.log_msg('@ Legal characters: ' + self.game.players_hat_chars) self.log_msg('@ (Eat cookies to extend the ASCII characters available for drawing.)') + else: + self.log_msg('@ Width of first line determines maximum width for remaining design') + self.log_msg('@ Finish design by entering an empty line (multiple space characters do not count as empty)') elif self.mode.name == 'command_thing': self.send('TASK:COMMAND ' + quote('HELP')) elif self.mode.name == 'control_pw_pw': @@ -937,7 +943,8 @@ class TUI: self.size = YX(*stdscr.getmaxyx()) self.size = self.size - YX(self.size.y % 4, 0) self.size = self.size - YX(0, self.size.x % 4) - self.window_width = int(self.size.x / 2) + self.left_window_width = min(52, int(self.size.x / 2)) + self.right_window_width = self.size.x - self.left_window_width def recalc_input_lines(): if not self.mode.has_input_prompt: @@ -945,7 +952,7 @@ class TUI: else: self.input_lines = msg_into_lines_of_width(input_prompt + self.input_ + '█', - self.window_width) + self.right_window_width) def move_explorer(direction): target = self.game.map_geometry.move_yx(self.explorer, direction) @@ -960,41 +967,41 @@ class TUI: def draw_history(): lines = [] for line in self.log: - lines += msg_into_lines_of_width(line, self.window_width) + lines += msg_into_lines_of_width(line, self.right_window_width) lines.reverse() height_header = 2 max_y = self.size.y - len(self.input_lines) for i in range(len(lines)): if (i >= max_y - height_header): break - safe_addstr(max_y - i - 1, self.window_width, lines[i]) + safe_addstr(max_y - i - 1, self.left_window_width, lines[i]) def draw_info(): info = 'MAP VIEW: %s\n%s' % (self.map_mode, self.get_info()) - lines = msg_into_lines_of_width(info, self.window_width) + lines = msg_into_lines_of_width(info, self.right_window_width) height_header = 2 for i in range(len(lines)): y = height_header + i if y >= self.size.y - len(self.input_lines): break - safe_addstr(y, self.window_width, lines[i]) + safe_addstr(y, self.left_window_width, lines[i]) def draw_input(): y = self.size.y - len(self.input_lines) for i in range(len(self.input_lines)): - safe_addstr(y, self.window_width, self.input_lines[i]) + safe_addstr(y, self.left_window_width, self.input_lines[i]) y += 1 def draw_stats(): stats = 'ENERGY: %s BLADDER: %s' % (self.game.energy, self.game.bladder_pressure) - safe_addstr(0, self.window_width, stats) + safe_addstr(0, self.left_window_width, stats) def draw_mode(): 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, + safe_addstr(1, self.left_window_width, 'MODE: %s – %s' % (self.mode.short_desc, help)) def draw_map(): @@ -1051,7 +1058,7 @@ class TUI: for line in map_lines_split: self.map_lines += [''.join(line)] window_center = YX(int(self.size.y / 2), - int(self.window_width / 2)) + int(self.left_window_width / 2)) center = self.game.player.position if self.mode.shows_info or self.mode.name == 'control_tile_draw': center = self.explorer @@ -1064,7 +1071,7 @@ class TUI: map_y = max(0, self.offset.y) map_x = max(0, self.offset.x) while term_y < self.size.y and map_y < len(self.map_lines): - to_draw = self.map_lines[map_y][map_x:self.window_width + self.offset.x] + to_draw = self.map_lines[map_y][map_x:self.left_window_width + self.offset.x] safe_addstr(term_y, term_x, to_draw) term_y += 1 map_y += 1 @@ -1075,7 +1082,7 @@ class TUI: self.draw_face = False return - start_x = self.window_width - 10 + start_x = self.left_window_width - 10 def draw_body_part(body_part, end_y): safe_addstr(end_y - 3, start_x, '----------') safe_addstr(end_y - 2, start_x, '| ' + body_part[0:6] + ' |') @@ -1113,16 +1120,16 @@ class TUI: content += self.mode.list_available_modes(self) for i in range(self.size.y): safe_addstr(i, - self.window_width * (not self.mode.has_input_prompt), - ' ' * self.window_width) + self.left_window_width * (not self.mode.has_input_prompt), + ' ' * self.left_window_width) lines = [] for line in content.split('\n'): - lines += msg_into_lines_of_width(line, self.window_width) + lines += msg_into_lines_of_width(line, self.right_window_width) for i in range(len(lines)): if i >= self.size.y: break safe_addstr(i, - self.window_width * (not self.mode.has_input_prompt), + self.left_window_width * (not self.mode.has_input_prompt), lines[i]) def draw_screen(): @@ -1156,19 +1163,43 @@ class TUI: self.input_ = '' self.switch_mode('play') - def enter_ascii_art(command, height, width, with_pw=False): - if len(self.input_) > width: + def enter_ascii_art(command, height, width, + with_pw=False, with_size=False): + if with_size and self.ascii_draw_stage == 0: + width = len(self.input_) + if width > 36: + self.log_msg('? input too long, must be max 36; try again') + # TODO: move max width mechanism server-side + return + old_size = self.game.player.carrying.design[0] + if width != old_size.x: + # TODO: save remaining design? + self.game.player.carrying.design[1] = '' + self.game.player.carrying.design[0] = YX(old_size.y, width) + elif len(self.input_) > width: self.log_msg('? input too long, ' 'must be max %s; try again' % width) return - if len(self.input_) < width: - self.input_ += ' ' * (width - len(self.input_)) self.log_msg(' ' + self.input_) - self.full_ascii_draw += self.input_ + if with_size and self.input_ in {'', ' '}\ + and self.ascii_draw_stage > 0: + height = self.ascii_draw_stage + else: + if with_size: + height = self.ascii_draw_stage + 2 + if len(self.input_) < width: + self.input_ += ' ' * (width - len(self.input_)) + self.full_ascii_draw += self.input_ + if with_size: + old_size = self.game.player.carrying.design[0] + self.game.player.carrying.design[0] = YX(height, old_size.x) self.ascii_draw_stage += 1 if self.ascii_draw_stage < height: self.restore_input_values() else: + if with_pw and with_size: + self.send('%s_SIZE %s %s' % (command, YX(height, width), + quote(self.password))) if with_pw: self.send('%s %s %s' % (command, quote(self.full_ascii_draw), quote(self.password))) @@ -1280,7 +1311,7 @@ class TUI: self.restore_input_values() elif self.mode.has_input_prompt and key != '\n': # Return key self.input_ += key - max_length = self.window_width * self.size.y - len(input_prompt) - 1 + max_length = self.right_window_width * self.size.y - len(input_prompt) - 1 if len(self.input_) > max_length: self.input_ = self.input_[:max_length] elif key == self.keys['help'] and not self.mode.is_single_char_entry: @@ -1292,9 +1323,15 @@ class TUI: elif self.mode.name == 'enter_face' and key == '\n': enter_ascii_art('PLAYER_FACE', 3, 6) elif self.mode.name == 'enter_design' and key == '\n': - enter_ascii_art('THING_DESIGN', - self.game.player.carrying.design[0].y, - self.game.player.carrying.design[0].x, True) + if self.game.player.carrying.type_ == 'Hat': + enter_ascii_art('THING_DESIGN', + self.game.player.carrying.design[0].y, + self.game.player.carrying.design[0].x, True) + else: + enter_ascii_art('THING_DESIGN', + self.game.player.carrying.design[0].y, + self.game.player.carrying.design[0].x, + True, True) elif self.mode.name == 'take_thing' and key == '\n': pick_selectable('PICK_UP') elif self.mode.name == 'drop_thing' and key == '\n':