'''
movement.py
all of the functions concerned with movement and position change
'''
import inform, hooks, mudsys, mud
# a ranking of positions
positions = ["unconscious", "sleeping", "sitting", "standing", "flying"]
pos_act = ["collapse", "sleep", "sit", "stand", "fly"]
# stuff for handling movement
dir_name = ["north", "east", "south", "west", "northeast", "northwest",
"southwest", "southeast", "up", "down"]
dir_abbr = ["n", "e", "s", "w", "ne", "nw", "sw", "se", "u", "d"]
dir_opp = [ 2, 3, 0, 1, 6, 7, 4, 5, 9, 8]
def try_use_furniture(ch, obj, pos):
'''attempts to resituate a person on the piece of furniture'''
# are we already on it?
if ch.on == obj:
ch.send("You are already " +ch.on.furniture_type+ " " +ch.on.name+ ".")
# make sure we have room
elif obj.furniture_capacity <= len(obj.chars):
ch.send("There isn't any room left.")
else:
# are we already on something? get up first
if ch.on:
mud.message(ch,None,ch.on,None,True,"to_char",
"You stand up from $o.")
mud.message(ch,None,ch.on,None,True,"to_room",
"$n stands up from $o.")
ch.on = None
# send our mud.messages for sitting down
act = pos_act[positions.index(pos)]
mud.message(ch, None, obj, None, True,
"to_char", "You " + act + " " + obj.furniture_type + " $o.")
mud.message(ch, None, obj, None, True,
"to_room", "$n " + act + " " + obj.furniture_type + " $o.")
# place ourselves down on our new furniture
ch.on = obj
ch.pos = pos
return True
# we didn't manage to get on the furniture
return False
def try_change_pos(ch, pos):
'''this function attempts to change the position of the person'''
if ch.pos == pos:
ch.send("You are already " + pos + ".")
return False
else:
if ch.pos == "flying":
mud.message(ch,None,None,None,True, "to_char", "You stop flying.")
mud.message(ch,None,None,None,True, "to_room", "$n stops flying.")
act = pos_act[positions.index(pos)]
mud.message(ch, None, None, None, True, "to_char", "You " + act + ".")
mud.message(ch, None, None, None, True, "to_room", "$n " + act + "s.")
ch.pos = pos
return True
def cmd_sit(ch, cmd, arg):
'''If standing, attempts to sit on the ground.'''
try:
obj, = mud.parse_args(ch, True, cmd, arg, "| [on] obj.room")
except: return
if obj == None:
try_change_pos(ch, "sitting")
elif obj.istype("furniture"):
try_use_furniture(ch, obj, "sitting")
else:
ch.send("You cannot sit on " + ch.see_as(obj) + ".")
def cmd_sleep(ch, cmd, arg):
'''If awake, attempts to lay down and sleep.'''
try:
obj, = mud.parse_args(ch, True, cmd, arg, "| [on] obj.room")
except: return
if obj == None:
try_change_pos(ch, "sleeping")
elif obj.istype("furniture"):
try_use_furniture(ch, obj, "sleeping")
else:
ch.send("You cannot sleep on " + ch.see_as(obj) + ".")
def cmd_stand(ch, cmd, arg):
'''If sitting, attempts to stand. If flying, attempts to land.'''
try_change_pos(ch, "standing")
def cmd_wake(ch, cmd, arg):
'''If sleep, attempts to wake up and sit.'''
mud.message(ch,None,None,None,True, "to_char",
"You stop sleeping and sit up.")
mud.message(ch,None,None,None,True, "to_room",
"$n stops sleeping and sits up.")
ch.pos = "sitting"
def dir_opposite(dir):
'''returns the opposite direction of the specified one, or None if none.'''
try:
return dir_name[dir_opp[dir_index(dir)]]
except: return None
def dir_index(dir):
'''returns the index of the direction name'''
try:
return dir_name.index(dir)
except: pass
try:
return dir_abbr.index(dir)
except: pass
return -1
def try_move_mssg(ch, dir):
'''Handles all moving of characters from one room to another, through
commands. Attempts a move. If successful, returns the exit left through.
Informs people of our moving'''
ex, success = try_move(ch, dir, True)
return ex
def try_move(ch, dir, mssg = False):
'''Handles all moving of characters from one room to another, through
commands. Attempts a move. If successful, returns the exit left
through.'''
ex = ch.room.exit(dir)
success = False
exname = "it"
if ex != None and ex.name != "":
exname = ex.name
# did we find an exit?
if ex == None or not ch.cansee(ex):
ch.send("Alas, there is no exit in that direction.")
elif ex.is_closed:
ch.send("You will have to open " + exname + " first.")
elif ex.dest == None:
ch.send("It doesn't look like " + exname + " leads anywhere!")
else:
old_room = ch.room
dirnum = dir_index(dir)
# send out our leave mud.messages as needed. Is anyone in the old room?
if mssg == True:
if ex.leave_mssg != '':
mud.message(ch, None, None, None, True, "to_room",ex.leave_mssg)
elif dirnum == -1:
mud.message(ch, None, None, None, True, "to_room", "$n leaves.")
else:
mud.message(ch, None, None, None, True, "to_room",
"$n leaves " + dir_name[dirnum] + ".")
# run our leave hooks
hooks.run("exit", hooks.build_info("ch rm ex", (ch, ch.room, ex)))
# if a hook hasn't moved us, go through with going through the exit
if ch.room == old_room:
ch.room = ex.dest
# stuff that happens before we 'look'
hooks.run("pre_enter", hooks.build_info("ch rm", (ch, ch.room)))
ch.act("look")
# send out our enter mud.messages as needed
if mssg == True:
if ex.enter_mssg != '':
mud.message(ch,None,None,None,True,"to_room",ex.enter_mssg)
elif dirnum == -1:
mud.message(ch,None,None,None,True,"to_room","$n has arrived.")
else:
mud.message(ch, None, None, None, True, "to_room",
"$n arrives from the "+dir_name[dir_opp[dirnum]]+".")
# run our enter hooks
hooks.run("enter", hooks.build_info("ch rm", (ch, ch.room)))
success = True
# return the exit we found (if we found any)
return ex, success
def cmd_move(ch, cmd, arg):
'''A basic movement command, relocating you to another room in the
specified direction.'''
# cmd_move is the basic entry to all of the movement utilities.
# See try_move() in movement.py
try_move_mssg(ch, cmd)
################################################################################
# mud commands
################################################################################
mudsys.add_cmd("north", "n", cmd_move, "player", True)
mudsys.add_cmd("west", "w", cmd_move, "player", True)
mudsys.add_cmd("east", "e", cmd_move, "player", True)
mudsys.add_cmd("south", "s", cmd_move, "player", True)
mudsys.add_cmd("up", "u", cmd_move, "player", True)
mudsys.add_cmd("down", "d", cmd_move, "player", True)
mudsys.add_cmd("northwest", None, cmd_move, "player", True)
mudsys.add_cmd("northeast", None, cmd_move, "player", True)
mudsys.add_cmd("southwest", None, cmd_move, "player", True)
mudsys.add_cmd("southeast", None, cmd_move, "player", True)
mudsys.add_cmd("nw", None, cmd_move, "player", True)
mudsys.add_cmd("ne", None, cmd_move, "player", True)
mudsys.add_cmd("sw", None, cmd_move, "player", True)
mudsys.add_cmd("se", None, cmd_move, "player", True)
mudsys.add_cmd("wake", None, cmd_wake, "player", True)
mudsys.add_cmd("sleep", None, cmd_sleep,"player", True)
mudsys.add_cmd("stand", None, cmd_stand,"player", True)
mudsys.add_cmd("land", None, cmd_stand,"player", True)
mudsys.add_cmd("sit", None, cmd_sit, "player", True)
# The mud needs to know our command for movement as well
mudsys.set_cmd_move(cmd_move)
# useful mud methods
mud.dir_opposite = dir_opposite
def chk_can_move(ch, cmd):
if not ch.pos in ["standing", "flying"]:
ch.send("You cannot do that while " + ch.pos + "!")
return False
for cmd in ["north", "west", "east", "south", "up", "down", "northwest",
"northeast", "southwest", "southeast", "nw", "ne", "sw", "se"]:
mudsys.register_dflt_move_cmd(cmd)
mudsys.register_move_check(chk_can_move)
def chk_wake(ch, cmd):
if not ch.pos == "sleeping":
ch.send("You must be asleep to wake up.")
return False
mudsys.add_cmd_check("wake", chk_wake)
def chk_sleep(ch, cmd):
if ch.pos == "sleeping":
ch.send("You are already sleeping!")
return False
elif ch.pos == "unconscious":
ch.send("You cannot sleep while you are unconscious.")
return False
mudsys.add_cmd_check("sleep", chk_sleep)
def chk_stand(ch, cmd):
if ch.pos == "standing":
ch.send("You are already standing!")
return False
elif ch.pos != "sitting":
ch.send("You cannot stand while " + ch.pos + ".")
return False
mudsys.add_cmd_check("stand", chk_stand)
def chk_land(ch, cmd):
if ch.pos == "standing":
ch.send("You are already on the ground!")
return False
elif ch.pos != "flying":
ch.send("You cannot land if you are not flying.")
return False
mudsys.add_cmd_check("land", chk_land)
def chk_sit(ch, cmd):
if ch.pos == "sitting":
ch.send("You are already sitting!")
return False
elif ch.pos != "standing":
ch.send("You must be standing to sit.")
return False
mudsys.add_cmd_check("sit", chk_sit)