'intro': '@ enter face 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..'
},
+ 'enter_hat': {
+ 'short': 'enter your hat',
+ 'intro': '@ enter hat line (enter nothing to abort):',
+ '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..'
+ },
'write': {
'short': 'change terrain',
'intro': '',
pass # we assume socket will be known as dead by now
def cmd_TURN(game, n):
- game.annotations = {}
game.turn = n
- game.things = []
- game.portals = {}
game.turn_complete = False
- game.fov = ''
cmd_TURN.argtypes = 'int:nonneg'
+def cmd_PSEUDO_FOV_WIPE(game):
+ game.portals_new = {}
+ game.annotations_new = {}
+ game.things_new = []
+cmd_PSEUDO_FOV_WIPE.argtypes = ''
+
def cmd_LOGIN_OK(game):
game.tui.switch_mode('post_login_wait')
game.tui.send('GET_GAMESTATE')
game.player_id = player_id
cmd_PLAYER_ID.argtypes = 'int:nonneg'
+def cmd_PLAYERS_HAT_CHARS(game, hat_chars):
+ game.players_hat_chars_new = hat_chars
+cmd_PLAYERS_HAT_CHARS.argtypes = 'string'
+
def cmd_THING(game, yx, thing_type, protection, thing_id, portable, commandable):
- t = game.get_thing(thing_id)
+ t = game.get_thing_temp(thing_id)
if not t:
t = ThingBase(game, thing_id)
- game.things += [t]
+ game.things_new += [t]
t.position = yx
t.type_ = thing_type
t.protection = protection
cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg bool bool'
def cmd_THING_NAME(game, thing_id, name):
- t = game.get_thing(thing_id)
+ t = game.get_thing_temp(thing_id)
t.name = name
cmd_THING_NAME.argtypes = 'int:pos string'
def cmd_THING_FACE(game, thing_id, face):
- t = game.get_thing(thing_id)
+ t = game.get_thing_temp(thing_id)
t.face = face
cmd_THING_FACE.argtypes = 'int:pos string'
def cmd_THING_HAT(game, thing_id, hat):
- t = game.get_thing(thing_id)
+ t = game.get_thing_temp(thing_id)
t.hat = hat
cmd_THING_HAT.argtypes = 'int:pos string'
def cmd_THING_CHAR(game, thing_id, c):
- t = game.get_thing(thing_id)
+ t = game.get_thing_temp(thing_id)
t.thing_char = c
cmd_THING_CHAR.argtypes = 'int:pos char'
def cmd_MAP(game, geometry, size, content):
map_geometry_class = globals()['MapGeometry' + geometry]
- game.map_geometry = map_geometry_class(size)
- game.map_content = content
+ game.map_geometry_new = map_geometry_class(size)
+ game.map_content_new = content
if type(game.map_geometry) == MapGeometrySquare:
game.tui.movement_keys = {
game.tui.keys['square_move_up']: 'UP',
cmd_MAP.argtypes = 'string:map_geometry yx_tuple:pos string'
def cmd_FOV(game, content):
- game.fov = content
+ game.fov_new = content
cmd_FOV.argtypes = 'string'
def cmd_MAP_CONTROL(game, content):
- game.map_control_content = content
+ game.map_control_content_new = content
cmd_MAP_CONTROL.argtypes = 'string'
def cmd_GAME_STATE_COMPLETE(game):
- game.turn_complete = True
game.tui.do_refresh = True
game.tui.info_cached = None
+ game.things = game.things_new
+ game.portals = game.portals_new
+ game.annotations = game.annotations_new
+ game.fov = game.fov_new
+ game.map_geometry = game.map_geometry_new
+ game.map_content = game.map_content_new
+ game.map_control_content = game.map_control_content_new
game.player = game.get_thing(game.player_id)
+ game.players_hat_chars = game.players_hat_chars_new
+ game.turn_complete = True
if game.tui.mode.name == 'post_login_wait':
game.tui.switch_mode('play')
cmd_GAME_STATE_COMPLETE.argtypes = ''
def cmd_PORTAL(game, position, msg):
- game.portals[position] = msg
+ game.portals_new[position] = msg
cmd_PORTAL.argtypes = 'yx_tuple:nonneg string'
def cmd_PLAY_ERROR(game, msg):
cmd_ARGUMENT_ERROR.argtypes = 'string'
def cmd_ANNOTATION(game, position, msg):
- game.annotations[position] = msg
+ game.annotations_new[position] = msg
if game.tui.mode.shows_info:
game.tui.do_refresh = True
cmd_ANNOTATION.argtypes = 'yx_tuple:nonneg string'
cmd_THING_TYPE.argtypes = 'string char'
def cmd_THING_INSTALLED(game, thing_id):
- game.get_thing(thing_id).installed = True
+ game.get_thing_temp(thing_id).installed = True
cmd_THING_INSTALLED.argtypes = 'int:pos'
def cmd_THING_CARRYING(game, thing_id, carried_id):
- game.get_thing(thing_id).carrying = game.get_thing(carried_id)
+ game.get_thing_temp(thing_id).carrying = game.get_thing(carried_id)
cmd_THING_CARRYING.argtypes = 'int:pos int:pos'
def cmd_TERRAIN(game, terrain_char, terrain_desc):
turn_complete = False
tasks = {}
thing_types = {}
+ things_new = []
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.register_command(cmd_REPLY)
self.register_command(cmd_PLAYER_ID)
self.register_command(cmd_TURN)
+ self.register_command(cmd_PSEUDO_FOV_WIPE)
self.register_command(cmd_THING)
self.register_command(cmd_THING_TYPE)
self.register_command(cmd_THING_NAME)
self.register_command(cmd_PORTAL)
self.register_command(cmd_ANNOTATION)
self.register_command(cmd_GAME_STATE_COMPLETE)
+ self.register_command(cmd_PLAYERS_HAT_CHARS)
self.register_command(cmd_ARGUMENT_ERROR)
self.register_command(cmd_GAME_ERROR)
self.register_command(cmd_PLAY_ERROR)
self.register_command(cmd_DEFAULT_COLORS)
self.register_command(cmd_RANDOM_COLORS)
self.map_content = ''
+ self.players_hat_chars = ''
self.player_id = -1
self.annotations = {}
+ self.annotations_new = {}
self.portals = {}
+ self.portals_new = {}
self.terrains = {}
self.player = None
f.argtypes = self.commands[command_name].argtypes
return f
+ def get_thing_temp(self, id_):
+ for thing in self.things_new:
+ if id_ == thing.id_:
+ return thing
+ return None
+
class Mode:
def __init__(self, name, has_input_prompt=False, shows_info=False,
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)
is_admin = False
tile_draw = False
self.mode_control_tile_draw.available_actions = ["move_explorer",
"toggle_tile_draw"]
self.mode_edit.available_modes = ["write", "annotate", "portal",
- "name_thing", "enter_face", "password",
+ "name_thing", "enter_face", "enter_hat", "password",
"chat", "study", "play", "admin_enter"]
self.mode_edit.available_actions = ["move", "flatten", "install",
"toggle_map_mode"]
'switch_to_admin_thing_protect': 'T',
'flatten': 'F',
'switch_to_enter_face': 'f',
+ 'switch_to_enter_hat': 'H',
'switch_to_take_thing': 'z',
'switch_to_drop_thing': 'u',
'teleport': 'p',
elif self.mode.name == 'admin_thing_protect':
if hasattr(self.thing_selected, 'protection'):
self.input_ = self.thing_selected.protection
+ elif self.mode.name == 'enter_face':
+ self.input_ = self.game.player.face
+ elif self.mode.name == 'enter_hat':
+ self.input_ = self.game.player.hat
def send_tile_control_command(self):
self.send('SET_TILE_CONTROL %s %s' %
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 == 'admin_enter' and self.is_admin:
mode_name = 'admin'
elif mode_name in {'name_thing', 'admin_thing_protect'}:
['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 == 'command_thing':
self.send('TASK:COMMAND ' + quote('HELP'))
elif self.mode.name == 'control_pw_pw':
'MODE: %s – %s' % (self.mode.short_desc, help))
def draw_map():
- if not self.game.turn_complete and len(self.map_lines) == 0:
+ if (not self.game.turn_complete) and len(self.map_lines) == 0:
return
if self.game.turn_complete:
map_lines_split = []
def draw_face_popup():
t = self.game.get_thing(self.draw_face)
- if not t:
+ if not t or not hasattr(t, 'face'):
self.draw_face = False
return
start_x = self.window_width - 10
+ t_char = ' '
+ if hasattr(t, 'thing_char'):
+ t_char = t.thing_char
def draw_body_part(body_part, end_y):
- safe_addstr(end_y - 4, start_x, ' ________ ')
+ safe_addstr(end_y - 4, start_x, ' _[ @' + t_char + ' ]_ ')
safe_addstr(end_y - 3, start_x, '| |')
safe_addstr(end_y - 2, start_x, '| ' + body_part[0:6] + ' |')
safe_addstr(end_y - 1, start_x, '| ' + body_part[6:12] + ' |')
self.send('PLAYER_FACE %s' % quote(self.input_))
self.input_ = ""
self.switch_mode('edit')
+ elif self.mode.name == 'enter_hat' and key == '\n':
+ if len(self.input_) != 18:
+ self.log_msg('? wrong input length, aborting')
+ else:
+ self.send('PLAYER_HAT %s' % quote(self.input_))
+ self.input_ = ""
+ self.switch_mode('edit')
elif self.mode.name == 'take_thing' and key == '\n':
pick_selectable('PICK_UP')
elif self.mode.name == 'drop_thing' and key == '\n':