'intro': '@ enter thing protection character:',
'long': 'Change protection character for thing here.'
},
+ 'enter_face': {
+ 'short': 'enter your face',
+ 'intro': '@ enter face line (enter nothing to abort):',
+ 'long': 'Draw your face as ASCII art. The string you enter must be 9 characters long, and will be divided on display into three lines of three characters each, from top to bottom..'
+ },
'write': {
'short': 'change terrain',
'intro': '',
def cmd_THING_NAME(game, thing_id, name):
t = game.get_thing(thing_id)
- if t:
- t.name = name
-cmd_THING_NAME.argtypes = 'int:nonneg string'
+ 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.face = face
+cmd_THING_FACE.argtypes = 'int:pos string'
+
+def cmd_THING_HAT(game, thing_id, hat):
+ t = game.get_thing(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)
- if t:
- t.thing_char = c
-cmd_THING_CHAR.argtypes = 'int:nonneg char'
+ 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.thing_types[thing_type] = symbol_hint
cmd_THING_TYPE.argtypes = 'string char'
+def cmd_THING_INSTALLED(game, thing_id):
+ game.get_thing(thing_id).installed = True
+cmd_THING_INSTALLED.argtypes = 'int:pos'
+
def cmd_THING_CARRYING(game, thing_id):
game.get_thing(thing_id).carrying = True
-cmd_THING_CARRYING.argtypes = 'int:nonneg'
+cmd_THING_CARRYING.argtypes = 'int:pos'
def cmd_TERRAIN(game, terrain_char, terrain_desc):
game.terrains[terrain_char] = terrain_desc
self.register_command(cmd_THING_TYPE)
self.register_command(cmd_THING_NAME)
self.register_command(cmd_THING_CHAR)
+ self.register_command(cmd_THING_FACE)
+ self.register_command(cmd_THING_HAT)
self.register_command(cmd_THING_CARRYING)
+ self.register_command(cmd_THING_INSTALLED)
self.register_command(cmd_TERRAIN)
self.register_command(cmd_MAP)
self.register_command(cmd_MAP_CONTROL)
mode_name_thing = Mode('name_thing', has_input_prompt=True, shows_info=True)
mode_command_thing = Mode('command_thing', has_input_prompt=True)
mode_take_thing = Mode('take_thing', has_input_prompt=True)
+ mode_enter_face = Mode('enter_face', has_input_prompt=True)
is_admin = False
tile_draw = False
"command_thing", "take_thing"]
self.mode_play.available_actions = ["move", "drop_thing",
"teleport", "door", "consume",
- "install"]
+ "install", "wear"]
self.mode_study.available_modes = ["chat", "play", "admin_enter", "edit"]
self.mode_study.available_actions = ["toggle_map_mode", "move_explorer"]
self.mode_admin.available_modes = ["admin_thing_protect", "control_pw_type",
"toggle_tile_draw"]
self.mode_edit.available_modes = ["write", "annotate", "portal", "name_thing",
"password", "chat", "study", "play",
- "admin_enter"]
+ "admin_enter", "enter_face"]
self.mode_edit.available_actions = ["move", "flatten", "toggle_map_mode"]
self.mode = None
self.host = host
'switch_to_control_tile_type': 'Q',
'switch_to_admin_thing_protect': 'T',
'flatten': 'F',
+ 'switch_to_enter_face': 'f',
'switch_to_take_thing': 'z',
'drop_thing': 'u',
'teleport': 'p',
'consume': 'C',
'door': 'D',
'install': 'I',
+ 'wear': 'W',
'help': 'h',
'toggle_map_mode': 'L',
'toggle_tile_draw': 'm',
if len(self.game.fov) > pos_i and self.game.fov[pos_i] != '.':
info_to_cache += 'outside field of view'
else:
+ for t in self.game.things:
+ if t.position == self.explorer:
+ info_to_cache += 'THING: %s' % self.get_thing_info(t)
+ protection = t.protection
+ if protection == '.':
+ protection = 'none'
+ info_to_cache += ' / protection: %s\n' % protection
+ if hasattr(t, 'hat'):
+ info_to_cache += t.hat[0:3] + '\n'
+ info_to_cache += t.hat[3:6] + '\n'
+ info_to_cache += t.hat[6:9] + '\n'
+ if hasattr(t, 'face'):
+ info_to_cache += t.face[0:3] + '\n'
+ info_to_cache += t.face[3:6] + '\n'
+ info_to_cache += t.face[6:9] + '\n'
terrain_char = self.game.map_content[pos_i]
terrain_desc = '?'
if terrain_char in self.game.terrains:
if protection == '.':
protection = 'unprotected'
info_to_cache += 'PROTECTION: %s\n' % protection
- for t in self.game.things:
- if t.position == self.explorer:
- info_to_cache += 'THING: %s' % self.get_thing_info(t)
- protection = t.protection
- if protection == '.':
- protection = 'none'
- info_to_cache += ' / protection: %s\n' % protection
if self.explorer in self.game.portals:
info_to_cache += 'PORTAL: ' +\
self.game.portals[self.explorer] + '\n'
info += t.thing_char
if hasattr(t, 'name'):
info += ' (%s)' % t.name
+ if hasattr(t, 'installed'):
+ info += ' / installed'
return info
def loop(self, stdscr):
term_x = max(0, -self.offset.x)
map_y = max(0, self.offset.y)
map_x = max(0, self.offset.x)
- while (term_y < self.size.y and map_y < self.game.map_geometry.size.y):
+ 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]
safe_addstr(term_y, term_x, to_draw)
term_y += 1
'drop_thing': 'drop thing',
'toggle_map_mode': 'toggle map view',
'toggle_tile_draw': 'toggle protection character drawing',
- 'install': 'install',
+ 'install': '(un-)install',
+ 'wear': '(un-)wear',
'door': 'open/close',
'consume': 'consume',
}
'drop_thing': 'DROP',
'door': 'DOOR',
'install': 'INSTALL',
+ 'wear': 'WEAR',
'move': 'MOVE',
'command': 'COMMAND',
'consume': 'INTOXICATE',
self.login_name = self.input_
self.send('LOGIN ' + quote(self.input_))
self.input_ = ""
+ elif self.mode.name == 'enter_face' and key == '\n':
+ if len(self.input_) != 9:
+ self.log_msg('? wrong input length, aborting')
+ else:
+ self.send('PLAYER_FACE %s' % quote(self.input_))
+ self.input_ = ""
+ self.switch_mode('edit')
elif self.mode.name == 'take_thing' and key == '\n':
try:
i = int(self.input_)
self.send('TASK:INTOXICATE')
elif key == self.keys['install'] and task_action_on('install'):
self.send('TASK:INSTALL')
+ elif key == self.keys['wear'] and task_action_on('wear'):
+ self.send('TASK:WEAR')
elif key == self.keys['teleport']:
player = self.game.get_thing(self.game.player_id)
if player.position in self.game.portals: