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

#define COST 5
#define SKILL "general.evaluating.armour"
#define LEARN_LEVEL 2
#define TEACH_LEVEL 10

inherit COMMAND_BASE;

mixed *calc_ac( object ob ) {
    int j;
    string i;
    mapping ac;
    mixed *ret, bit;

    ac = (mapping)ob->query_armour_class();
    ret = ({ });
    foreach ( i in keys( ac ) ) {
        if ( member_array( ac[ i ][ A_TYPE ], ({ "blunt",
              "sharp", "pierce" }) ) == -1 )
            continue;
        bit = ac[ i ][ A_AC ];
        if( (j = member_array( ac[ i ][ A_TYPE ], ret )) == -1 ) {
            j = sizeof( ret );
            ret += ({ ac[ i ][ A_TYPE ], ({ 0, 0, 0 }) });
        }
        j++;
        if ( intp( bit ) ) {
            ret[ j ][ 1 ] += bit / 2; /* average */
            ret[ j ][ 2 ] += bit; /* maximun */
        } else
            switch ( sizeof( bit ) ) {
        case 1 :
            ret[ j ][ 0 ] += bit[ 0 ];
            ret[ j ][ 1 ] += bit[ 0 ];
            ret[ j ][ 2 ] += bit[ 0 ];
            break;
        case 2 :
            ret[ j ][ 0 ] += bit[ 0 ];
            ret[ j ][ 1 ] += (bit[ 0 ] + bit[ 1 ] / 2);
            ret[ j ][ 2 ] += (bit[ 0 ] + bit[ 1 ]);
            break;
        case 3 :
            ret[ j ][ 0 ] += bit[ 0 ];
            ret[ j ][ 1 ] += (bit[ 0 ] + bit[ 1 ] * bit[ 2 ] / 2);
            ret[ j ][ 2 ] += (bit[ 0 ] + bit[ 1 ] * bit[ 2 ]);
            break;
        default :
            write( "Barf!\n" );
        }
    }
    return ret;
} /* calc_ac() */

int calc_sausage( int sausage, int lvl ) {
    int tmp;
    tmp = 99 - (lvl * 99) / 200;
    if( tmp < 0 )
        tmp = 0;
    return random( sausage ) * tmp / 100 - random( sausage ) * tmp / 100 +
    sausage;
} /* calc_sausage() */

string check_string( int val, int bon ) {
    int dist;
    string s;

    dist = (350 - bon) / 10;
    if( dist > (val < 0 ? -val : val) )
        return " is the same as ";
    if( val > 0 )
        s = "better than ";
    else {
        s = "worse than ";
        val -= val;
    }
    if( !val )
        return " is exactly the same as ";
    if( val < 10 )
        return " is slightly " + s;
    if( val < 20 )
        return " " + s;
    if( val < 40 )
        return " is much " + s;
    return " is amazingly " + s;
} /* check_string() */

int cmd_against( object*from, object *to ) {
    int i, j, k, l, arm_lvl;
    object *ok, *fail;
    mixed *rat, *to_ac, *zip;

    arm_lvl = (int)this_player()->query_skill_bonus( SKILL );

    if(sizeof(from) + sizeof(to) > 10) {
        add_failed_mess("You cannot compare that many items at once.\n");
        return 0;
    }

    i = (COST*(sizeof(from)+sizeof(to)));
    if(this_player()->query_specific_gp("other") < i) {
        add_failed_mess("You cannot concentrate enough to compare these "
          "items.\n");
        return 0;
    }
    this_player()->adjust_gp( -i);

    to_ac = ({ });
    fail = ({ });
    for( i = 0; i < sizeof( to ); i++ ) {
        if( to[ i ]->query_armour() ) {
            rat = calc_ac( to[ i ] );
            to_ac += ({ to[ i ], rat });
        } else {
            fail += ({ to[ i ] });
            to = delete( to, i, 1 );
            i--;
        }
    }
    if( !sizeof( to ) ) {
        notify_fail( "None of " + query_multiple_short( fail ) +
          " are armour.\n" );
        return 0;
    }
    fail = ({ });
    ok = ({ });
    for( i = 0; i < sizeof( from ); i++ ) {
        if( from[ i ]->query_armour() ) {
            if( !sizeof( to_ac ) ) {
                fail += ({ from[ i ] });
                continue;
            }
            rat = calc_ac( from[ i ] );
            zip = ({ });
            for( j = 0; j < sizeof( to_ac ); j += 2 ) {
                for( k = 0; k < sizeof( to_ac[ j + 1 ] ); k += 2 ) {
                    if( (l = member_array( to_ac[ j + 1 ][ k ], rat )) == -1 ) {
                        write( capitalize( (string)from[ i ]->short() ) +
                          check_string( 0 - (to_ac[ j + 1 ][ k + 1 ][ 0 ] +
                              to_ac[ j + 1 ][ k + 1 ][ 1 ] +
                              to_ac[ j + 1 ][ k + 1 ][ 2 ]) / 3,
                            arm_lvl ) +
                          to_ac[ j ]->short() + " at protecting from " +
                          to_ac[ j + 1 ][ k ] + ".\n" );

                    } else {
                        write( capitalize( (string)from[ i ]->short() ) +
                          check_string( (rat[ l + 1 ][ 0 ] + rat[ l + 1 ][ 1 ] +
                              rat[ l + 1 ][ 2 ]) / 3 -
                            (to_ac[ j + 1 ][ k + 1 ][ 0 ] +
                              to_ac[ j + 1 ][ k + 1 ][ 1 ] +
                              to_ac[ j + 1 ][ k + 1 ][ 2 ]) / 3,
                            arm_lvl ) +
                          to_ac[ j ]->short() + " at protecting from " +
                          to_ac[ j + 1 ][ k ] + ".\n" );
                    }

                    zip += ({ to_ac[ j + 1 ][ k ] });
                }
                for( k = 0; k < sizeof( rat ); k += 2 ) {
                    if( member_array( rat[ 0 ], zip ) ) {
                        write( capitalize( (string)from[ i ]->short() ) +
                          check_string( 0 - (rat[ j + 1 ][ 0 ] + rat[ j + 1 ][ 1 ] +
                              rat[ j + 1 ][ 2 ]) / 3, arm_lvl ) +
                          to_ac[ j ]->short() + " at " + rat[ j ] + ".\n" );
                    }
                }
            }
            if(member_array(from[i], ok) == -1) {
                ok += ({ from[ i ] });
            }
        } else {
            if(member_array(from[i], fail) == -1) {
                fail += ({ from[ i ] });
            }
        }
    }
    if( sizeof( fail ) ) {
        add_failed_mess( "Failed to compare " + query_multiple_short( fail ) +
          " against " + query_multiple_short( to ) + ".\n" );
        return 0;
    }
    if( sizeof( ok ) ) {
        say( this_player()->query_cap_name() + " looks closely at " +
          query_multiple_short( ok + to ) + ".\n" );
    }
    return 1;
} /* cmd_against() */

int cmd_normal( object* from ) {
    int i, j;
    object *ok, *fail;
    mixed *rat, bing;
    string type, *types, *zones;

    ok = ({ });
    fail = ({ });
    for( i = 0; i < sizeof( from ); i++ ) {
        if( from[ i ]->query_armour() ) {
            rat = calc_ac( from[ i ] );
            for( j = 0; j < sizeof( rat ); j += 2 ) {
                bing = (rat[ j + 1 ][ 0 ] + rat[ j + 1 ][ 1 ] + rat[ j + 1 ][ 2 ]) / 3;
                bing /= 5;
                if( bing >= 10 ) {
                    bing = 9;
                }
                if( bing < 0 ) {
                    bing = 0;
                }
                write( from[ i ]->the_short() + ({ " is terrible",
                    " is amazingly poor",
                    " is pretty poor",
                    " is poor",
                    " is ok",
                    " is average",
                    " is good",
                    " is very good",
                    " is extremely good",
                    " is excellent", })[ bing ] +
                  " at stopping " + rat[ j ] +
                  " attacks.\n" );

                ok += ({ from[ i ] });
            }
            if(!arrayp(from[i]->query_type())) {
                types = ({ from[i]->query_type() });
            } else {
                types = from[i]->query_type();
            }
            zones = ({ });
            foreach(type in types) {
                if(CLOTHING_HANDLER->query_equivilant_type(type)) {
                    zones += CLOTHING_HANDLER->query_zone_names(CLOTHING_HANDLER->query_equivilant_type(type));
                } else {
                    zones += CLOTHING_HANDLER->query_zone_names(type);
                }
            }

            if(!sizeof(zones)) {
                write(from[i]->the_short() +
                  " does not protect any parts of your body.\n");
            } else {
                write(from[i]->the_short() + " protects your " +
                  query_multiple_short(zones, "poss") + ".\n");
            }
            continue;
        }
        fail += ({ from[ i ] });
    }
    if( !sizeof( ok ) ) {
        notify_fail( "You failed to vurdere " + query_multiple_short( from ) +
          ".\n" );
        return 0;
    }
    say( this_player()->query_cap_name() + " peers carefully at " +
      query_multiple_short( ok ) + ".\n" );
    return 1;
} /* cmd() */

int teach( object ob ) {
    if( this_player()->query_skill( SKILL ) < TEACH_LEVEL )
        return -1;
    if( ob->query_skill( SKILL ) < LEARN_LEVEL )
        return -2;
    ob->add_known_command( "vurdere" );
    return 1;
} /* teach() */

mixed* query_patterns() {
    return ({ "<indirect:object:me'from'> against <indirect:object:me'to'>",
      (: cmd_against($1[0], $1[1]) :),
      "<indirect:object:me'normal'>",
      (: cmd_normal($1) :) });
} /* query_patterns() */