'intro': 'Pick up a thing in reach by entering its index number. Enter nothing to abort.',
'long': 'You see a list of things which you could pick up. Enter the target thing\'s index, or, to leave, nothing.'
},
+ 'drop_thing': {
+ 'short': 'drop thing',
+ 'intro': 'Enter number of direction to which you want to drop thing.',
+ 'long': 'Drop currently carried thing by entering the target direction index. Enter nothing to return to play mode..'
+ },
'admin_thing_protect': {
'short': 'change thing protection',
'intro': '@ enter thing protection character:',
game.player_id = player_id
cmd_PLAYER_ID.argtypes = 'int:nonneg'
-def cmd_THING(game, yx, thing_type, protection, thing_id, portable):
+def cmd_THING(game, yx, thing_type, protection, thing_id, portable, commandable):
t = game.get_thing(thing_id)
if not t:
t = ThingBase(game, thing_id)
t.type_ = thing_type
t.protection = protection
t.portable = portable
-cmd_THING.argtypes = 'yx_tuple:nonneg string:thing_type char int:nonneg bool'
+ t.commandable = commandable
+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)
game.tui.mode_write.legal = 'WRITE' in game.tasks
game.tui.mode_command_thing.legal = 'COMMAND' in game.tasks
game.tui.mode_take_thing.legal = 'PICK_UP' in game.tasks
+ game.tui.mode_drop_thing.legal = 'DROP' in game.tasks
cmd_TASKS.argtypes = 'string'
def cmd_THING_TYPE(game, thing_type, symbol_hint):
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:pos'
+def cmd_THING_CARRYING(game, thing_id, carried_id):
+ game.get_thing(thing_id).carrying = game.get_thing(carried_id)
+cmd_THING_CARRYING.argtypes = 'int:pos int:pos'
def cmd_TERRAIN(game, terrain_char, terrain_desc):
game.terrains[terrain_char] = terrain_desc
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_drop_thing = Mode('drop_thing', has_input_prompt=True)
mode_enter_face = Mode('enter_face', has_input_prompt=True)
is_admin = False
tile_draw = False
import os
import json
self.mode_play.available_modes = ["chat", "study", "edit", "admin_enter",
- "command_thing", "take_thing"]
- self.mode_play.available_actions = ["move", "drop_thing",
- "teleport", "door", "consume",
+ "command_thing", "take_thing",
+ "drop_thing"]
+ self.mode_play.available_actions = ["move", "teleport", "door", "consume",
"install", "wear"]
self.mode_study.available_modes = ["chat", "play", "admin_enter", "edit"]
self.mode_study.available_actions = ["toggle_map_mode", "move_explorer"]
'flatten': 'F',
'switch_to_enter_face': 'f',
'switch_to_take_thing': 'z',
- 'drop_thing': 'u',
+ 'switch_to_drop_thing': 'u',
'teleport': 'p',
'consume': 'C',
'door': 'D',
if self.mode and self.mode.name == 'control_tile_draw':
self.log_msg('@ finished tile protection drawing.')
self.tile_draw = False
+ player = self.game.get_thing(self.game.player_id)
+ if mode_name == 'command_thing' and\
+ (not hasattr(player, 'carrying') or not player.carrying.commandable):
+ self.log_msg('? not carrying anything commandable')
+ self.flash = True
+ self.switch_mode('play')
+ return
if mode_name == 'admin_enter' and self.is_admin:
mode_name = 'admin'
elif mode_name in {'name_thing', 'admin_thing_protect'}:
- player = self.game.get_thing(self.game.player_id)
thing = None
for t in [t for t in self.game.things if t.position == player.position
and t.id_ != player.id_]:
else:
select_range += [player.position + YX(-1, -1),
player.position + YX(1, -1)]
- self.selectables = [t for t in self.game.things
+ self.selectables = [t.id_ for t in self.game.things
if t.portable and t.position in select_range]
if len(self.selectables) == 0:
self.log_msg('none')
return
else:
for i in range(len(self.selectables)):
- t = self.selectables[i]
+ t = self.game.get_thing(self.selectables[i])
self.log_msg(str(i) + ': ' + self.get_thing_info(t))
+ elif self.mode.name == 'drop_thing':
+ self.log_msg('Direction to drop thing to:')
+ self.selectables =\
+ ['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 == 'command_thing':
self.send('TASK:COMMAND ' + quote('HELP'))
elif self.mode.name == 'control_pw_pw':
if self.show_help:
draw_help()
+ def pick_selectable(task_name):
+ try:
+ i = int(self.input_)
+ if i < 0 or i >= len(self.selectables):
+ self.log_msg('? invalid index, aborted')
+ else:
+ self.send('TASK:%s %s' % (task_name, self.selectables[i]))
+ except ValueError:
+ self.log_msg('? invalid index, aborted')
+ self.input_ = ''
+ self.switch_mode('play')
+
action_descriptions = {
'move': 'move',
'flatten': 'flatten surroundings',
self.input_ = self.input_[:-1]
elif self.mode.has_input_prompt and key == '\n' and self.input_ == ''\
and self.mode.name in {'chat', 'command_thing', 'take_thing',
- 'admin_enter'}:
+ 'drop_thing', 'admin_enter'}:
if self.mode.name != 'chat':
self.log_msg('@ aborted')
self.switch_mode('play')
self.input_ = ""
self.switch_mode('edit')
elif self.mode.name == 'take_thing' and key == '\n':
- try:
- i = int(self.input_)
- if i < 0 or i >= len(self.selectables):
- self.log_msg('? invalid index, aborted')
- else:
- self.send('TASK:PICK_UP %s' % self.selectables[i].id_)
- except ValueError:
- self.log_msg('? invalid index, aborted')
- self.input_ = ''
- self.switch_mode('play')
+ pick_selectable('PICK_UP')
+ elif self.mode.name == 'drop_thing' and key == '\n':
+ pick_selectable('DROP')
elif self.mode.name == 'command_thing' and key == '\n':
- if task_action_on('command'):
- self.send('TASK:COMMAND ' + quote(self.input_))
- self.input_ = ""
+ self.send('TASK:COMMAND ' + quote(self.input_))
+ self.input_ = ""
elif self.mode.name == 'control_pw_pw' and key == '\n':
if self.input_ == '':
self.log_msg('@ aborted')
elif self.mode.name == 'play':
if self.mode.mode_switch_on_key(self, key):
continue
- elif key == self.keys['drop_thing'] and task_action_on('drop_thing'):
- self.send('TASK:DROP')
elif key == self.keys['door'] and task_action_on('door'):
self.send('TASK:DOOR')
elif key == self.keys['consume'] and task_action_on('consume'):