},
'enter_face': {
'short': 'edit face',
- 'intro': '@ enter face line (enter nothing to abort):',
+ 'intro': '@ enter face line:',
'long': 'Draw your face 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..'
},
+ 'enter_design': {
+ 'short': 'edit design',
+ 'intro': '@ enter design:',
+ 'long': 'Enter design for carried thing as ASCII art.'
+ },
'enter_hat': {
'short': 'edit hat',
- 'intro': '@ enter hat line (enter nothing to abort):',
- 'long': 'Draw your face 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.'
+ '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',
t.hat = hat
cmd_THING_HAT.argtypes = 'int:pos string'
+def cmd_THING_DESIGN(game, thing_id, size, design):
+ t = game.get_thing_temp(thing_id)
+ t.design = [size, design]
+cmd_THING_DESIGN.argtypes = 'int:pos yx_tuple string'
+
def cmd_THING_CHAR(game, thing_id, c):
t = game.get_thing_temp(thing_id)
t.thing_char = c
self.register_command(cmd_THING_CHAR)
self.register_command(cmd_THING_FACE)
self.register_command(cmd_THING_HAT)
+ self.register_command(cmd_THING_DESIGN)
self.register_command(cmd_THING_CARRYING)
self.register_command(cmd_THING_INSTALLED)
self.register_command(cmd_TERRAIN)
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
self.mode_admin.available_modes = ["admin_thing_protect", "control_pw_type",
"control_tile_type", "chat",
"study", "play", "edit"]
- self.mode_admin.available_actions = ["move"]
+ self.mode_admin.available_actions = ["move", "toggle_map_mode"]
self.mode_control_tile_draw.available_modes = ["admin_enter"]
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",
- "password",
+ "enter_design", "password",
"chat", "study", "play", "admin_enter"]
self.mode_edit.available_actions = ["move", "flatten", "install",
"toggle_map_mode"]
'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',
'teleport': 'p',
self.input_ = self.game.player.face[start:end]
elif self.mode.name == 'enter_hat':
self.input_ = self.game.player.hat[start:end]
+ elif self.mode.name == 'enter_design':
+ width = self.game.player.carrying.design[0].x
+ start = self.ascii_draw_stage * width
+ end = (self.ascii_draw_stage + 1) * width
+ self.input_ = self.game.player.carrying.design[1][start:end]
def send_tile_control_command(self):
self.send('SET_TILE_CONTROL %s %s' %
not self.game.player.carrying.commandable):
return fail('not carrying anything commandable')
if mode_name == 'name_thing' and not self.game.player.carrying:
- return fail('not carrying anything to re-name')
+ return fail('not carrying anything to re-name', 'edit')
if mode_name == 'admin_thing_protect' and not self.game.player.carrying:
return fail('not carrying anything to protect')
if mode_name == 'take_thing' and 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')):
+ return fail('not carrying designable to edit', 'edit')
if mode_name == 'admin_enter' and self.is_admin:
mode_name = 'admin'
self.mode = getattr(self, 'mode_' + mode_name)
info_to_cache += t.face[0:6] + '\n'
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])
+ 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':
+ info_to_cache += '-' * (line_length + 4) + '\n'
terrain_char = self.game.map_content[pos_i]
terrain_desc = '?'
if terrain_char in self.game.terrains:
self.input_ = ''
self.switch_mode('play')
- def enter_ascii_art(command):
- if len(self.input_) != 6:
- self.log_msg('? wrong input length, must be 6; try again')
+ def enter_ascii_art(command, height, width, with_pw=False):
+ if len(self.input_) > width:
+ self.log_msg('? wrong input length, '
+ '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_
self.ascii_draw_stage += 1
- if self.ascii_draw_stage < 3:
+ if self.ascii_draw_stage < height:
self.restore_input_values()
else:
- self.send('%s %s' % (command, quote(self.full_ascii_draw)))
+ if with_pw:
+ self.send('%s %s %s' % (command, quote(self.full_ascii_draw),
+ quote(self.password)))
+ else:
+ self.send('%s %s' % (command, quote(self.full_ascii_draw)))
self.full_ascii_draw = ""
self.ascii_draw_stage = 0
self.input_ = ""
reset_screen_size()
self.explorer = YX(0, 0)
self.input_ = ''
+ store_widechar = False
input_prompt = '> '
interval = datetime.timedelta(seconds=5)
last_ping = datetime.datetime.now() - interval
keycode = None
if len(key) == 1:
keycode = ord(key)
+ # workaround for <https://stackoverflow.com/a/56390915>
+ if store_widechar:
+ store_widechar = False
+ key = bytes([195, keycode]).decode()
+ if keycode == 195:
+ store_widechar = True
+ continue
self.show_help = False
self.draw_face = False
if key == 'KEY_RESIZE':
self.send('LOGIN ' + quote(self.input_))
self.input_ = ""
elif self.mode.name == 'enter_face' and key == '\n':
- enter_ascii_art('PLAYER_FACE')
+ enter_ascii_art('PLAYER_FACE', 3, 6)
elif self.mode.name == 'enter_hat' and key == '\n':
- enter_ascii_art('PLAYER_HAT')
+ 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,
+ self.game.player.carrying.design[0].x, True)
elif self.mode.name == 'take_thing' and key == '\n':
pick_selectable('PICK_UP')
elif self.mode.name == 'drop_thing' and key == '\n':
elif self.mode.name == 'admin':
if self.mode.mode_switch_on_key(self, key):
continue
+ elif key == self.keys['toggle_map_mode']:
+ self.toggle_map_mode()
elif key in self.movement_keys and task_action_on('move'):
self.send('TASK:MOVE ' + self.movement_keys[key])
elif self.mode.name == 'edit':