skylib_mudos_v1/
skylib_mudos_v1/bin/
skylib_mudos_v1/bin/db/
skylib_mudos_v1/mudlib/banish/a/
skylib_mudos_v1/mudlib/banish/b/
skylib_mudos_v1/mudlib/banish/c/
skylib_mudos_v1/mudlib/banish/d/
skylib_mudos_v1/mudlib/banish/e/
skylib_mudos_v1/mudlib/banish/f/
skylib_mudos_v1/mudlib/banish/g/
skylib_mudos_v1/mudlib/banish/h/
skylib_mudos_v1/mudlib/banish/j/
skylib_mudos_v1/mudlib/banish/l/
skylib_mudos_v1/mudlib/banish/m/
skylib_mudos_v1/mudlib/banish/n/
skylib_mudos_v1/mudlib/banish/o/
skylib_mudos_v1/mudlib/banish/p/
skylib_mudos_v1/mudlib/banish/r/
skylib_mudos_v1/mudlib/banish/s/
skylib_mudos_v1/mudlib/banish/t/
skylib_mudos_v1/mudlib/banish/u/
skylib_mudos_v1/mudlib/banish/w/
skylib_mudos_v1/mudlib/cmds/
skylib_mudos_v1/mudlib/cmds/admin/
skylib_mudos_v1/mudlib/cmds/guild-race/
skylib_mudos_v1/mudlib/cmds/guild-race/crafts/
skylib_mudos_v1/mudlib/cmds/guild-race/magic/
skylib_mudos_v1/mudlib/cmds/guild-race/other/
skylib_mudos_v1/mudlib/cmds/living/broken/
skylib_mudos_v1/mudlib/cmds/player/group_cmds/
skylib_mudos_v1/mudlib/d/admin/
skylib_mudos_v1/mudlib/d/admin/room/
skylib_mudos_v1/mudlib/d/admin/room/we_care/
skylib_mudos_v1/mudlib/d/admin/save/
skylib_mudos_v1/mudlib/d/admin/text/
skylib_mudos_v1/mudlib/d/learning/TinyTown/buildings/
skylib_mudos_v1/mudlib/d/learning/TinyTown/map/
skylib_mudos_v1/mudlib/d/learning/TinyTown/roads/
skylib_mudos_v1/mudlib/d/learning/chars/
skylib_mudos_v1/mudlib/d/learning/functions/
skylib_mudos_v1/mudlib/d/learning/handlers/
skylib_mudos_v1/mudlib/d/learning/help_topics/
skylib_mudos_v1/mudlib/d/learning/help_topics/npcs/
skylib_mudos_v1/mudlib/d/learning/help_topics/objects/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/
skylib_mudos_v1/mudlib/d/learning/help_topics/rcs_demo/RCS/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/crowd/
skylib_mudos_v1/mudlib/d/learning/help_topics/rooms/situations/
skylib_mudos_v1/mudlib/d/learning/save/
skylib_mudos_v1/mudlib/d/learning/school/
skylib_mudos_v1/mudlib/d/learning/school/add_sc/
skylib_mudos_v1/mudlib/d/learning/school/characters/
skylib_mudos_v1/mudlib/d/learning/school/general/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/basic_commands/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/edtutor/
skylib_mudos_v1/mudlib/d/learning/school/getting-started/unix_tutor/
skylib_mudos_v1/mudlib/d/learning/school/items/
skylib_mudos_v1/mudlib/d/learning/school/npc_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/
skylib_mudos_v1/mudlib/d/learning/school/room_school/room_basic/
skylib_mudos_v1/mudlib/d/learning/school/room_school/situations/
skylib_mudos_v1/mudlib/d/learning/school/room_school/terrain_tutor/
skylib_mudos_v1/mudlib/d/learning/text/
skylib_mudos_v1/mudlib/d/liaison/
skylib_mudos_v1/mudlib/d/mudlib/
skylib_mudos_v1/mudlib/d/mudlib/changes/
skylib_mudos_v1/mudlib/d/playtesters/
skylib_mudos_v1/mudlib/d/playtesters/effects/
skylib_mudos_v1/mudlib/d/playtesters/handlers/
skylib_mudos_v1/mudlib/d/playtesters/items/
skylib_mudos_v1/mudlib/d/sage/
skylib_mudos_v1/mudlib/doc/
skylib_mudos_v1/mudlib/doc/creator/
skylib_mudos_v1/mudlib/doc/driver/
skylib_mudos_v1/mudlib/doc/driver/efuns/arrays/
skylib_mudos_v1/mudlib/doc/driver/efuns/buffers/
skylib_mudos_v1/mudlib/doc/driver/efuns/compile/
skylib_mudos_v1/mudlib/doc/driver/efuns/filesystem/
skylib_mudos_v1/mudlib/doc/driver/efuns/floats/
skylib_mudos_v1/mudlib/doc/driver/efuns/functions/
skylib_mudos_v1/mudlib/doc/driver/efuns/general/
skylib_mudos_v1/mudlib/doc/driver/efuns/mappings/
skylib_mudos_v1/mudlib/doc/driver/efuns/mixed/
skylib_mudos_v1/mudlib/doc/driver/efuns/mudlib/
skylib_mudos_v1/mudlib/doc/driver/efuns/numbers/
skylib_mudos_v1/mudlib/doc/driver/efuns/parsing/
skylib_mudos_v1/mudlib/doc/known_command/
skylib_mudos_v1/mudlib/doc/login/
skylib_mudos_v1/mudlib/doc/lpc/basic_manual/
skylib_mudos_v1/mudlib/doc/lpc/intermediate/
skylib_mudos_v1/mudlib/doc/new/add_command/
skylib_mudos_v1/mudlib/doc/new/events/
skylib_mudos_v1/mudlib/doc/new/handlers/
skylib_mudos_v1/mudlib/doc/new/living/race/
skylib_mudos_v1/mudlib/doc/new/living/spells/
skylib_mudos_v1/mudlib/doc/new/object/
skylib_mudos_v1/mudlib/doc/new/player/
skylib_mudos_v1/mudlib/doc/new/room/guild/
skylib_mudos_v1/mudlib/doc/new/room/outside/
skylib_mudos_v1/mudlib/doc/new/room/storeroom/
skylib_mudos_v1/mudlib/doc/object/
skylib_mudos_v1/mudlib/doc/playtesters/
skylib_mudos_v1/mudlib/doc/policy/
skylib_mudos_v1/mudlib/doc/weapons/
skylib_mudos_v1/mudlib/global/
skylib_mudos_v1/mudlib/global/creator/
skylib_mudos_v1/mudlib/global/handlers/
skylib_mudos_v1/mudlib/global/virtual/setup_compiler/
skylib_mudos_v1/mudlib/include/cmds/
skylib_mudos_v1/mudlib/include/effects/
skylib_mudos_v1/mudlib/include/npc/
skylib_mudos_v1/mudlib/include/room/
skylib_mudos_v1/mudlib/include/shops/
skylib_mudos_v1/mudlib/net/daemon/
skylib_mudos_v1/mudlib/net/daemon/chars/
skylib_mudos_v1/mudlib/net/inherit/
skylib_mudos_v1/mudlib/net/obj/
skylib_mudos_v1/mudlib/obj/amulets/
skylib_mudos_v1/mudlib/obj/b_day/
skylib_mudos_v1/mudlib/obj/clothes/
skylib_mudos_v1/mudlib/obj/dwarmours/plate/
skylib_mudos_v1/mudlib/obj/dwclothes/transport/horse/
skylib_mudos_v1/mudlib/obj/dwscabbards/
skylib_mudos_v1/mudlib/obj/dwweapons/axes/
skylib_mudos_v1/mudlib/obj/dwweapons/chains/
skylib_mudos_v1/mudlib/obj/faith/symbols/
skylib_mudos_v1/mudlib/obj/fungi/
skylib_mudos_v1/mudlib/obj/gatherables/
skylib_mudos_v1/mudlib/obj/instruments/
skylib_mudos_v1/mudlib/obj/magic/
skylib_mudos_v1/mudlib/obj/media/
skylib_mudos_v1/mudlib/obj/misc/player_shop/
skylib_mudos_v1/mudlib/obj/monster/godmother/
skylib_mudos_v1/mudlib/obj/monster/transport/
skylib_mudos_v1/mudlib/obj/rings/
skylib_mudos_v1/mudlib/obj/spells/
skylib_mudos_v1/mudlib/obj/stationery/
skylib_mudos_v1/mudlib/obj/stationery/envelopes/
skylib_mudos_v1/mudlib/obj/stationery/papers/
skylib_mudos_v1/mudlib/obj/toys/
skylib_mudos_v1/mudlib/obj/vessels/
skylib_mudos_v1/mudlib/obj/weapons/swords/
skylib_mudos_v1/mudlib/save/autodoc/
skylib_mudos_v1/mudlib/save/leaflets/
skylib_mudos_v1/mudlib/save/mail/
skylib_mudos_v1/mudlib/save/new_soul/data/
skylib_mudos_v1/mudlib/save/parcels/
skylib_mudos_v1/mudlib/save/playerinfo/
skylib_mudos_v1/mudlib/save/players/d/
skylib_mudos_v1/mudlib/save/random_names/
skylib_mudos_v1/mudlib/save/random_names/data/
skylib_mudos_v1/mudlib/save/terrains/
skylib_mudos_v1/mudlib/save/terrains/tutorial_desert/
skylib_mudos_v1/mudlib/save/terrains/tutorial_grassy_field/
skylib_mudos_v1/mudlib/save/terrains/tutorial_mountain/
skylib_mudos_v1/mudlib/save/todo_lists/
skylib_mudos_v1/mudlib/secure/
skylib_mudos_v1/mudlib/secure/cmds/admin/
skylib_mudos_v1/mudlib/secure/cmds/lord/
skylib_mudos_v1/mudlib/secure/config/
skylib_mudos_v1/mudlib/secure/handlers/autodoc/
skylib_mudos_v1/mudlib/secure/handlers/intermud/
skylib_mudos_v1/mudlib/secure/include/global/
skylib_mudos_v1/mudlib/secure/save/
skylib_mudos_v1/mudlib/secure/save/handlers/
skylib_mudos_v1/mudlib/secure/std/classes/
skylib_mudos_v1/mudlib/secure/std/modules/
skylib_mudos_v1/mudlib/std/commands/
skylib_mudos_v1/mudlib/std/commands/shadows/
skylib_mudos_v1/mudlib/std/creator/
skylib_mudos_v1/mudlib/std/dom/
skylib_mudos_v1/mudlib/std/effects/
skylib_mudos_v1/mudlib/std/effects/external/
skylib_mudos_v1/mudlib/std/effects/fighting/
skylib_mudos_v1/mudlib/std/effects/priest/
skylib_mudos_v1/mudlib/std/effects/room/
skylib_mudos_v1/mudlib/std/environ/
skylib_mudos_v1/mudlib/std/guilds/
skylib_mudos_v1/mudlib/std/guilds/old/
skylib_mudos_v1/mudlib/std/languages/
skylib_mudos_v1/mudlib/std/languages/BACKUPS/
skylib_mudos_v1/mudlib/std/liquids/
skylib_mudos_v1/mudlib/std/npc/
skylib_mudos_v1/mudlib/std/npc/goals/
skylib_mudos_v1/mudlib/std/npc/goals/basic/
skylib_mudos_v1/mudlib/std/npc/goals/misc/
skylib_mudos_v1/mudlib/std/npc/plans/
skylib_mudos_v1/mudlib/std/npc/plans/basic/
skylib_mudos_v1/mudlib/std/npc/types/
skylib_mudos_v1/mudlib/std/npc/types/helper/
skylib_mudos_v1/mudlib/std/npcs/
skylib_mudos_v1/mudlib/std/outsides/
skylib_mudos_v1/mudlib/std/races/shadows/
skylib_mudos_v1/mudlib/std/room/basic/topography/
skylib_mudos_v1/mudlib/std/room/controller/
skylib_mudos_v1/mudlib/std/room/inherit/topography/
skylib_mudos_v1/mudlib/std/room/topography/area/
skylib_mudos_v1/mudlib/std/room/topography/iroom/
skylib_mudos_v1/mudlib/std/room/topography/milestone/
skylib_mudos_v1/mudlib/std/shadows/curses/
skylib_mudos_v1/mudlib/std/shadows/disease/
skylib_mudos_v1/mudlib/std/shadows/fighting/
skylib_mudos_v1/mudlib/std/shadows/healing/
skylib_mudos_v1/mudlib/std/shadows/magic/
skylib_mudos_v1/mudlib/std/shadows/poison/
skylib_mudos_v1/mudlib/std/shadows/rituals/
skylib_mudos_v1/mudlib/std/shadows/room/
skylib_mudos_v1/mudlib/std/shops/controllers/
skylib_mudos_v1/mudlib/std/shops/objs/
skylib_mudos_v1/mudlib/std/shops/player_shop/
skylib_mudos_v1/mudlib/std/socket/
skylib_mudos_v1/mudlib/std/soul/
skylib_mudos_v1/mudlib/std/soul/d/
skylib_mudos_v1/mudlib/std/soul/e/
skylib_mudos_v1/mudlib/std/soul/i/
skylib_mudos_v1/mudlib/std/soul/j/
skylib_mudos_v1/mudlib/std/soul/k/
skylib_mudos_v1/mudlib/std/soul/l/
skylib_mudos_v1/mudlib/std/soul/n/
skylib_mudos_v1/mudlib/std/soul/o/
skylib_mudos_v1/mudlib/std/soul/q/
skylib_mudos_v1/mudlib/std/soul/u/
skylib_mudos_v1/mudlib/std/soul/v/
skylib_mudos_v1/mudlib/std/soul/y/
skylib_mudos_v1/mudlib/std/soul/z/
skylib_mudos_v1/mudlib/std/stationery/
skylib_mudos_v1/mudlib/w/
skylib_mudos_v1/mudlib/w/default/
skylib_mudos_v1/mudlib/w/default/armour/
skylib_mudos_v1/mudlib/w/default/clothes/
skylib_mudos_v1/mudlib/w/default/item/
skylib_mudos_v1/mudlib/w/default/npc/
skylib_mudos_v1/mudlib/w/default/room/
skylib_mudos_v1/mudlib/w/default/weapon/
skylib_mudos_v1/mudlib/www/
skylib_mudos_v1/mudlib/www/download/
skylib_mudos_v1/mudlib/www/java/
skylib_mudos_v1/mudlib/www/secure/
skylib_mudos_v1/mudlib/www/secure/lpc/advanced/
skylib_mudos_v1/mudlib/www/secure/lpc/intermediate/
skylib_mudos_v1/v22.2b14-DSv10/
skylib_mudos_v1/v22.2b14-DSv10/ChangeLog.old/
skylib_mudos_v1/v22.2b14-DSv10/Win32/
skylib_mudos_v1/v22.2b14-DSv10/compat/
skylib_mudos_v1/v22.2b14-DSv10/compat/simuls/
skylib_mudos_v1/v22.2b14-DSv10/include/
skylib_mudos_v1/v22.2b14-DSv10/mudlib/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/clone/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/command/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/data/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/etc/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/include/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/inherit/master/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/log/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/compiler/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/efuns/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/single/tests/operators/
skylib_mudos_v1/v22.2b14-DSv10/testsuite/u/
skylib_mudos_v1/v22.2b14-DSv10/tmp/
skylib_mudos_v1/v22.2b14-DSv10/windows/
inherit COMMAND_BASE;

#include <top_ten_tables.h>
#include <clubs.h>
#include <player.h>

#define essify(x,y) ( x > 1  ||  x == 0 ? " " y "s" : " " y )
#define LIMIT 150

int score_quests( object ob, int sorted ) {
    string *quests;
    mixed quest_info;

    if( ob->query_property("dead") ) {
        write( "You are just a disembodied spirit.  What use does a wispy "
            "thing like you have for a collection of meaningless numbers?\n");
        return 1;
    }

    quests = LIBRARY_H->query_quests( ob->query_name() );
    if( !sizeof( quests ) ) {
        printf("You have not completed any quests.\n");
        return 1;
    }

    quest_info = map( quests, (: ({ QUEST_H->query_quest_title($1),
                                    QUEST_H->query_quest_story($1) }) :) );

    if( sorted )
        quest_info = sort_array( quest_info, (: strcmp($1[0], $2[0]) :) );

    write("$P$Quests$P$You have completed the following quests:\n"+
        implode( map( map( quest_info, (: "     \""+
            $1[0] +"\", in which you "+replace( $1[1], "was", "were" ) :) ),
            (: sprintf( $1[0..24]+"%*-=s",
            $(ob)->query_cols() - 30, $1[25..] ) :) ), ",\n" ) +".\n" );

    return 1;

} /* score_quests() */

int query_verbose( object ob, string verbose )  {
    if( !verbose )
        return ob->query_verbose("score");
    return verbose == "verbose";
} /* query_verbose() */

int score_stats( object ob, string verbose )  {
    string word;

    if( ob->query_property("dead") ) {
        write("You are just a disembodied spirit.  What use does a wispy "
            "thing like you have for a collection of meaningless numbers?\n");
        return 1;
    }

    word = ( ob->query_weight() / 20 ) +"."+ ( ob->query_weight() % 10 );
    if( query_verbose( ob, verbose ) )  {
        printf("%-#*s\n", ob->query_cols(),
            "Constitution ... "+ ob->query_con() +"\n"
            "Dexterity ...... "+ ob->query_dex() +"\n"
            "Intelligence ... "+ ob->query_int() +"\n"
            "Strength ....... "+ ob->query_str() +"\n"
            "Wisdom ......... "+ ob->query_wis() +"\n"
            "Height ......... "+ ob->query_height()+"cm\n"
            "Weight ......... "+ word +"kg\n");
    } else  {
        printf("%-#*s\n", ob->query_cols(),
            "Con: "+ ob->query_con()+"\n"
            "Dex: "+ ob->query_dex() +"\n"
            "Int: "+ ob->query_int() +"\n"
            "Str: "+ ob->query_str() +"\n"
            "Wis: "+ ob->query_wis() +"\n"
            "Hgt: "+ ob->query_height()+"cm\n"
            "Wgt: "+ word +"kg\n");
    }

    return 1;

} /* score_stats() */

int score_normal( object ob, string verbose )  {
    string word, tmp;
    int age, temp1, temp2, temp3, temp4;
    mapping m;

    if( ob->query_property("dead") ) {
        write("You are just a disembodied spirit.  What use does a wispy "
            "thing like you have for a collection of meaningless numbers?\n");
        return 1;
    }

    if( query_verbose( ob, verbose ) )  {
        temp1 = ob->query_hp();
        temp2 = ob->query_gp();
        temp3 = (int)LIBRARY_H->query_quest_points( ob->query_name() );
        temp4 = ob->query_sp();

        printf("%-=*s", ob->query_cols(), "You have "+temp1+" ("+
            ob->query_max_hp()+") hit"+essify( temp1, "point")+", "+
            temp2+" ("+ob->query_max_gp()+") guild"+
            essify( temp2, "point")+", "+temp3+" ("+
            (int)QUEST_H->query_total_qp()+") quest"+
            essify( temp3, "point")+" and "+temp4+" ("+
            ob->query_max_sp()+") social"+essify( temp4, "point")+".\n");
        printf("%-=*s", ob->query_cols(), "Your current experience is "+
            ob->query_xp()+" and you are level "+(int)ob->query_level()+".\n"
            "Your overall rating is "+
            (int)TOP_TEN_HANDLER->calculate_rating( ob )+".\n" );

        temp1 = ob->query_deaths();
        temp2 = ob->query_max_deaths();
        printf("%-=*s", ob->query_cols(), "You have lost "+
            ( temp1 == temp2 ? 98 : ( temp1 * 100 ) / temp2 )+
            "% of your lifeforce.\n");

        if( temp1 = ob->query_wimpy() )
            printf("Your wimpy is set to %d%%.\n", temp1 );
        else
            printf("You are in brave mode.\n" );

        if( tmp = ob->align_string() ) {
            word = ob->query_deity();
            if( word && DEITY_H->query_deity( word ) )
                printf("You are %s, and worshipping %s, %s.\n",
                    tmp, word, DEITY_H->query_title(word) );
            else
                printf("You are %s.\n", tmp );
        }

        tmp = ob->query_temp_str();
        printf("You are %s (%i%%)%s.\n", ob->burden_string(),
            ob->query_burden(), ( tmp ? " and feeling "+tmp : "") );

        if( ob->query_property( PKER ) )
            printf("You are registered as a player killer.\n");

        if( sizeof( m = ob->query_hide_invis() ) )  {
            printf("%-=*s\n", ob->query_cols(), "You are "+
                query_multiple_short( keys( m ) )+".");
        }

        printf("%-=*s", ob->query_cols(), ob->extra_score() );
        age = -ob->query_time_on();
        if( age > 86400 ) {
            temp1 = age / 86400;
            word = temp1 + essify( temp1, "day");
        } else  {
            word = "";
        }

        if( age > 3600 )  {
            if( age > 86400 )
                word += ", ";
            temp1 = ( age / 3600 ) % 24;
            word += temp1 + essify( temp1, "hour");
        }

        if( age > 60 )  {
            if( age > 3600 )
                word += ", ";
            temp1 = ( age / 60 ) % 60;
            temp2 = age % 60;
            temp3 = ob->query_no_logins();
            printf("%-=*s", ob->query_cols(), "You are "+word+temp1+
                essify( temp1, "minute")+" and "+temp2+
                essify( temp2, "second")+" old and have logged in "+temp3+
                essify( temp3, "time")+".\n");
        } else  {
            temp1 = age % 60;
            temp2 = ob->query_no_logins();
            printf("%-=*s", ob->query_cols(), "You are "+temp1+
                essify( temp1, "second")+" old and have logged in "+temp2+
                essify( temp2, "time")+".\n");
        }
    } else {
        printf("%-=*s", ob->query_cols(),
            "Hp: "+ob->query_hp()+"("+ob->query_max_hp()+")  "
            "Gp: "+ob->query_gp()+"("+ob->query_max_gp()+")  "
            "Xp: "+ob->query_xp()+"\n");
    }

    return 1;

} /* score_normal() */

string create_relationship_text( string relationship, mapping data ) {
    string *relatives;
    int size;

    if( !relatives = data[ relationship ] )
        return "";

    if( !size = sizeof( relatives ) )
        return "";

    if( size == 1 )
        return CAP( relatives[0] )+" is your "+relationship;

    return query_multiple_short( map( sort_array( relatives, 1 ),
        (: CAP( $1 ) :) ) )+" are your "+pluralize( relationship );

} /* create_relationship_text() */

int get_gender( string name ) {
    int gender;

    gender = PLAYER_H->test_gender( name );

    if( gender )
        gender -= 1;

    return gender;

} /* get_gender() */

int score_relationships( object ob, int verbose ) {
    string txt, family, *sorted;
    class relationship_data *bing;
    mapping grouped;

    family = ob->query_family_name();

    if( !family || !CLUB_HANDLER->is_family( family ) ) {
        add_failed_mess("You are not in a family.\n");
        return 0;
    }

    bing = CLUB_HANDLER->query_relationships( family, ob->query_name() );

    if( !sizeof( bing ) ) {
        add_failed_mess("You have no relatives.\n");
        return 0;
    }

    grouped = unique_mapping( bing,
        (: CLUB_HANDLER->query_relationship_gender(
           CLUB_HANDLER->query_opposite_relationship( $1->relationship ),
           get_gender( $1->related_to ) )  :) );

    grouped = map( grouped, (: map( $2, (: $1->related_to :) ) :) );
    sorted = sort_array( keys( grouped ), 1 );

    txt = implode( map( sorted,
        (: create_relationship_text( $1, $(grouped) ) :) ), ".\n" );

    tell_object( ob, "$P$Relationships$P$" + txt + ".\n");
    return 1;

} /* score_relationships() */

int score_align( object ob, int verbose ) {
    int al_range, al_offset;
    string deity, status;

    if( ob->query_property("dead") ) {
        write("You're dead.  Things such as 'good' and 'evil' are no longer "
            "of your concern.\n");
        return 1;
    }

    deity = ob->query_deity();

    if( !deity ) {
        write("You are "+ob->align_string()+", and not worried about the "
            "approval of any deity at all.\n");
        return 1;
    }

    if( !DEITY_H->query_deity( deity ) ) {
        write("You are "+ob->align_string()+", and apparently worshipping "
            "a non-existent god.\n" );
        return 1;
    }

    if( DEITY_H->query_valid_al( deity, ob->query_al() ) )
        status = "furious with you";
    else {
        al_range = ABS( ( DEITY_H->query_al_lower( deity ) -
                          DEITY_H->query_al_upper( deity ) ) );
        al_offset = ( ob->query_al() -
            DEITY_H->query_al_middle( deity ) ) / ( al_range / 20 );

        switch( ABS( al_offset ) ) {
          case 0 : status = "most pleased with you";
          break;
          case 1 : status = "pleased with you";
          break;
          case 2 : status = "satisfied with you";
          break;
          case 3 : status = "watching you with interest";
          break;
          case 4..5 : status = "contented with you";
          break;
          case 6 : status = "slightly discontented with you";
          break;
          case 7 : status = "displeased with you";
          break;
          case 8 : status = "annoyed with you";
          break;
          case 9 : status = "angry with you";
          break;
          default : status = "angry with you";
        }
    }

    write("You are "+ob->align_string()+", and "+deity+" is "+status+".\n");
    return 1;

} /* score_align */

int score_fighting( object player, int verbose ) {
    object *attacker_list, *attacker_list_here;

    attacker_list = player->query_attacker_list();

    if( !sizeof( attacker_list ) ) {
        tell_object( player, "You are not fighting anyone.\n");
        return 1;
    }

    attacker_list_here = filter( attacker_list,
        (: living($1) && ENV($1) == $2 :), ENV(player) );
    attacker_list -= attacker_list_here;

    if( sizeof(attacker_list_here) ) {
        tell_object( player, "You are currently fighting "+
            query_multiple_short( attacker_list_here )+" here.\n");
    }

    if( sizeof(attacker_list) ) {
        tell_object( player, "You are currently fighting "+
            query_multiple_short( attacker_list )+".\n");
    }

    return 1;

} /* score_fighting() */

mixed query_patterns() {
   return ({ "quests", (: score_quests( TP, 0 ) :),
             "quests sorted", (: score_quests( TP, 1 ) :),
             "{brief|verbose} stats", (: score_stats( TP, $4[0] ) :),
             "stats", (: score_stats( TP, 0 ) :),
             "{brief|verbose}", (: score_normal( TP, $4[0] ) :),
             "relationships", (: score_relationships( TP, 0 ) :),
             "", (: score_normal( TP, 0) :),
             "align", (: score_align( TP, 0 ) :),
             "fighting", (: score_fighting( TP, 0 ) :) });
} /* query_patterns() */