nakedmud-mod/
nakedmud-mod/html/tutorials/
nakedmud-mod/html/tutorials/building_extras/
nakedmud-mod/html/tutorials/c/
nakedmud-mod/html/tutorials/reference/
nakedmud-mod/html/tutorials/scripting/
nakedmud-mod/html/tutorials/scripting_extras/
nakedmud-mod/lib/
nakedmud-mod/lib/help/A/
nakedmud-mod/lib/help/B/
nakedmud-mod/lib/help/C/
nakedmud-mod/lib/help/D/
nakedmud-mod/lib/help/G/
nakedmud-mod/lib/help/H/
nakedmud-mod/lib/help/J/
nakedmud-mod/lib/help/L/
nakedmud-mod/lib/help/M/
nakedmud-mod/lib/help/O/
nakedmud-mod/lib/help/P/
nakedmud-mod/lib/help/R/
nakedmud-mod/lib/help/S/
nakedmud-mod/lib/help/W/
nakedmud-mod/lib/logs/
nakedmud-mod/lib/misc/
nakedmud-mod/lib/players/
nakedmud-mod/lib/pymodules/polc/
nakedmud-mod/lib/txt/
nakedmud-mod/lib/world/
nakedmud-mod/lib/world/zones/examples/
nakedmud-mod/lib/world/zones/examples/mproto/
nakedmud-mod/lib/world/zones/examples/oproto/
nakedmud-mod/lib/world/zones/examples/reset/
nakedmud-mod/lib/world/zones/examples/rproto/
nakedmud-mod/lib/world/zones/examples/trigger/
nakedmud-mod/lib/world/zones/limbo/
nakedmud-mod/lib/world/zones/limbo/room/
nakedmud-mod/lib/world/zones/limbo/rproto/
nakedmud-mod/src/alias/
nakedmud-mod/src/dyn_vars/
nakedmud-mod/src/editor/
nakedmud-mod/src/example_module/
nakedmud-mod/src/help2/
nakedmud-mod/src/set_val/
nakedmud-mod/src/socials/
nakedmud-mod/src/time/
"""
inform.py

Python's mirror of C's inform.c -- contains various functions that perform
informative duties. Examining places/things, displaying proper names, etc...
"""
import utils, char, hooks, mudsock, mud, string, display



################################################################################
# utility functions
################################################################################
def build_who(ch = None):
    '''returns a formatted list of all the people currently online'''
    buf = [ ]
    buf.append(display.seperator)

    # build character info
    count   = len(mudsock.socket_list())
    playing = 0
    for sock in mudsock.socket_list():
        if not (sock.ch == None or sock.ch.room == None):
            desc = sock.ch.name
            if ch != None:
                desc = ch.see_as(sock.ch)
            buf.append(" %-12s %-10s %53s" %
                       (desc,sock.ch.race,sock.ch.user_groups))
            playing = playing + 1

    conn_end = "s"
    if count == 1: conn_end = ""
    play_end = "s"
    if playing == 1: play_end = ""

    # build our footer
    buf.append(display.seperator)
    buf.append((" %d socket" % count)  + conn_end + " logged in." + (" %d player" % playing) + play_end + " currently playing.")
    buf.append(display.seperator)
    buf.append("")
    return "\r\n".join(buf)



################################################################################
# look append functions
################################################################################
def show_equipment(ch, tgt):
    '''shows ch tgt\'s equipment'''
    for obj in tgt.eq:
        if ch.cansee(obj) or ch == tgt:
            ch.send("  %-30s %s" % (obj.name, tgt.get_slots(obj)))

cardinal_dirs = ["north", "south", "east", "west"]
compass_dirs  = ["north", "south", "east", "west",
                 "northwest", "northeast", "southwest", "southeast"]

def list_one_exit(ch, ex, dir):
    builder_info = ""
    if ch.isInGroup("builder"):
        builder_info = " [" + ex.dest.proto + "]"

    # display the direction we can go
    ch.send("  {n- %-10s :: %s%s" % (dir, ch.see_as(ex), builder_info))
                  
def list_room_exits(ch, room, filter_compass = False):
    # first, go through our standard exits
    if not filter_compass:
        for dir in compass_dirs:
            ex = room.exit(dir)
            if ex == None:
                continue
            if ex.dest == None:
                mud.log_string("ERROR: room %s headed %s to %s, which does not exist."%\
                               room.proto, dir, ex.destproto)
            elif ch.cansee(ex):
                list_one_exit(ch, ex, dir)

    # now do special exits
    for dir in room.exnames:
        if not dir in compass_dirs:
            ex = room.exit(dir)
            if ex.dest == None:
                mud.log_string("ERROR: room %s headed %s to %s, which does not exist." % \
                               room.proto, dir, ex.destproto)
            elif ch.cansee(ex):
                list_one_exit(ch, ex, dir)

def list_one_furniture(ch, obj):
    '''list the contents of a piece of furniture to the character.'''
    sitters = obj.chars
    am_on   = ch in sitters
    if am_on:
        sitters.remove(ch)

    # is it just us now?
    if len(sitters) == 0:
        ch.send(obj.rdesc)
    else:
        # build display info
        onat   = obj.furniture_type
        isare  = "is"
        if len(sitters) > 1:
            isare = "are"
        wth = ""
        if am_on:
            wth = " with you"
        sitter_descs = utils.build_show_list(ch, sitters,
                                             lambda x: x.name,
                                             lambda x: x.mname, ", ", True)
        ch.send("%s %s %s %s%s." % (sitter_descs, isare, onat, obj.name, wth))

def list_room_contents(ch, room):
    # find our list of visible objects and characters
    vis_objs  = utils.find_all_objs(ch, room.objs, "", None, True)
    vis_chars = utils.find_all_chars(ch, room.chars, "", None, True)

    # lists of used furnture, and characters using furniture
    furniture  = [ ]

    # find our list of used furniture
    for obj in vis_objs:
        if len(obj.chars) > 0:
            furniture.append(obj)

    # now remove our used furniture and people using it from the visible lists
    for furn in furniture:
        vis_objs.remove(furn)
        for pers in furn.chars:
            vis_chars.remove(pers)

    # show our list of visible characters
    if ch in vis_chars:
        vis_chars.remove(ch)
    if len(vis_chars) > 0:
        utils.show_list(ch, vis_chars, lambda(x): x.rdesc, lambda(x): x.mdesc)

    # show our list of used furniture
    for furn in furniture:
        list_one_furniture(ch, furn)

    # show our list of visible objects
    if len(vis_objs) > 0:
        utils.show_list(ch, vis_objs, lambda(x): x.rdesc, lambda(x): x.mdesc)



################################################################################
# hooks
################################################################################
def equipment_look_hook(info):
    '''displays a character\'s equipment when looked at'''
    tgt, ch = hooks.parse_info(info)

    if ch != tgt:
        gndr = tgt.heshe
        act  = "is"
    else:
        gndr = "You"
        act  = "are"

    if len(tgt.eq) > 0:
        ch.send("\n" + gndr + " " + act + " wearing:")
        show_equipment(ch, tgt)

def room_look_hook(info):
    '''diplays info about the room contents'''
    room, ch = hooks.parse_info(info)
    list_room_exits(ch, room)
    list_room_contents(ch, room)

def exit_look_hook(info):
    ex, ch = hooks.parse_info(info)
    if not ex.is_closed and ch.cansee(ex) and ex.dest != None:
        list_room_contents(ch, ex.dest)



################################################################################
# add our hooks
################################################################################
hooks.add("look_at_char", equipment_look_hook)
hooks.add("look_at_room", room_look_hook)
hooks.add("look_at_exit", exit_look_hook)



################################################################################
# unload procedure
################################################################################
def __unload__():
    '''things that need to be detached when the module is un/reloaded'''
    hooks.remove("look_at_char", equipment_look_hook)
    hooks.remove("look_at_room", room_look_hook)
    hooks.remove("look_at_exit", exit_look_hook)