123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282 |
- '''
- 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)
|