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/
/**
 * This is the health handler.
 * Spits out health strings for livings and a bit fancier
 * strings for the health command.  Also deals with
 * attacking checks and prints the monitor.
 * @author Sandoz
 */

#include <player.h>

#define RED  "%^RED%^"
#define CYAN "%^CYAN%^"
#define YELL "%^YELLOW%^"
#define RES  "%^RESET%^"

#define H_NAME "$who$ "

private mapping monitor_queue;
private int flush_id;

private void flush_monitor_queue();

/** @ignore yes */
void create() {
    monitor_queue = ([ ]);
} /* create() */

/** @ignore yes */
void dest_me() {
    destruct(TO);
} /* dest_me() */

/**
 * This method does all the checks required for any
 * aggressive commands.  If the attack argument is 0,
 * then combat will not be initiated, if 1, then the
 * targets will be attacked.
 * @param things the things to test
 * @param attack if this is 0, then combat will not be
 * initiated, if 1, then the things that pass the checks
 * will be attacked
 */
object *do_attack_checks( object *things, int attack ) {
    object thing;
    int dark;

    if( !ENV(TP) ) {
        add_failed_mess("You are in limbo...\n");
        return 0;
    }

    if( TP->no_offense() ) {
        add_failed_mess("You cannot attack anyone at the moment.\n");
        return 0;
    }

    things -= ({ TP });

    if( !sizeof( things ) ) {
        add_failed_mess("You cannot attack yourself!\n");
        return 0;
    }

    dark = TP->check_dark( ENV(TP)->query_light() );

    if( dark > 1 ) {
        add_failed_mess("It is way too bright to attack anyone.\n");
        return 0;
    }

    if( dark < -1 ) {
        add_failed_mess("It is way too dark to attack anyone.\n");
        return 0;
    }

    foreach( thing in things ) {
        if( thing->query_property( PASSED_OUT ) ) {
            write("You cannot attack "+thing->the_short()+" since "+
                thing->HE+" is passed out.\n");
            things -= ({ thing });
            continue;
        }

        if( !userp( thing ) ) {
            if( userp( TP ) || !thing->query_property("no attack") ) {
                switch( dark ) {
                  case -1:
                    if( !random( 2 ) ) {
                        write("You peer into the darkness, but fail to "
                            "find "+thing->the_short()+".\n");
                        things -= ({ thing });
                        continue;
                    }
                    write("You just manage to make out "+
                        thing->the_short()+".\n");
                  break;
                  case 1:
                    if( !random(2) ) {
                        write("You squint as hard as you can, but fail to "
                            "find "+thing->the_short() +".\n");
                        things -= ({ thing });
                        continue;
                    }
                    write("You just manage to make out "+
                        thing->the_short()+".\n");
                  default:
                }
                if( attack ){
                    TP->attack_ob( thing );
                }
            }
            continue;
        }

        if( !interactive( thing ) ) {
            write( thing->the_short()+" is net-dead.\n");
            things -= ({ thing });
            continue;
        }

        if( thing->query_property( "guest" ) ) {
            write("You cannot attack "+thing->the_short()+" since "+
                thing->HE+" is a guest.\n");
            things -= ({ thing });
            continue;
        }

        if( thing->query_auto_loading() ) {
            write("Be sporting; "+thing->the_short()+" doesn't have "+
                thing->HIS+" equipment yet.\n");
            things -= ({ thing });
            continue;
        }

        if( userp( TP ) && !TP->query_property( PKER ) ) {
            write("You cannot summon the courage to attack "+
                thing->the_short() +".\n");
            things -= ({ thing });
            continue;
        }

        if( userp( TP ) && pk_check( TP, thing ) ) {
            write("Something tells you that it would be wrong to attack "+
                thing->the_short() +".\n");
            things -= ({ thing });
            continue;
        }

        switch( dark ) {
          case -1:
            if( !random( 2 ) ) {
                write("You peer into the darkness, but fail to "
                    "find "+thing->the_short()+".\n");
                things -= ({ thing });
                continue;
            }
            write("You just manage to make out "+thing->the_short()+".\n");
          break;
          case 1:
            if( !random( 2 ) ) {
                write("You squint as hard as you can, but fail to "
                    "find "+thing->the_short()+".\n");
                things -= ({ thing });
                continue;
            }
            write("You just manage to make out "+thing->the_short()+".\n");
          default:
        }
        if( attack ){
            TP->attack_ob( thing );
        }
    }

    return things;

} /* do_attack_checks() */

/**
 * This method returns the health string of the creature.
 * It is used in extra_look in living creatures and in the 'health' command.
 * @param who the creature to get the health string for
 * @param full whether or not to returns the full (coloured) health string
 * @return the health string
 */
varargs string health_string( object who, int full ) {
    int per, current;
    string msg;

    if( !objectp(who) )
        return 0;

    if( who->query_property( "dead" ) ) {
        msg = "appears to be dead";
        return ( full ? H_NAME+msg+"." : msg );
    }

    current = ( who->query_name() == "death" ? 1 : who->query_hp() );
    per = 100 * current / ( who->query_max_hp() || 1 );

    switch( per ) {
      case -100..10:
           msg = "is in very bad shape";
           return ( full ? RED+H_NAME+msg+"."+RES : msg );
      case 11..30:
           msg = "is in bad shape";
           return ( full ? RED+H_NAME+msg+"."+RES : msg );
      case 31..60:
           msg = "is not in good shape";
           return ( full ? YELL+H_NAME+msg+"."+RES : msg );
      case 61..95:
           msg = "is slightly hurt";
           return ( full ? CYAN+H_NAME+msg+"."+RES : msg );
      case 96..100:
           msg = "is in good shape";
           return ( full ? H_NAME+msg+"." : msg );
      default:
           msg = "is rather buggy and you should probably contact a creator";
           return ( full ? H_NAME+msg+"." : msg );
    }

} /* health_string() */

/**
 * This method prints out the health and gp points during combat,
 * if the player so desires. Moved to here from the combat effect.
 * @param player the object recieving the monitor message
 * @param charge non-zero to charge the player gp points for the message
 * @see query_monitor
 */
void monitor_points( object player, int charge ) {
   int hp, max;
   string colour;

   if( charge && player->adjust_gp( -1 ) < 0 )
       return;

   hp = player->query_hp();
   max = player->query_max_hp();

   switch( ( hp * 100 ) / max ) {
     case 61..100:
       colour = "%^GREEN%^";
     break;
     case 31..60:
       colour = "%^YELLOW%^";
     break;
     default :
       colour = "%^RED%^";
   }

   tell_object( player, colour + "Hp: " + hp + " (" + max + ") "
       "Ep: "+player->query_gp()+" ("+player->query_max_gp()+") "
       "Xp: "+player->query_xp()+"%^RESET%^\n");

} /* monitor_points() */

/**
 * This method is used by combat to display the monitor after
 * all heartbeats have finished.
 * @param ob the object to print the monitor to
 * @param charge non-zero to charge the player gp points for the message
 */
void register_monitor( object ob, int charge ) {
    if( !userp(ob) )
        return;

    if( undefinedp( monitor_queue[ob] ) || charge )
        monitor_queue[ob] = charge;

    if( !flush_id )
        flush_id = call_out( (: flush_monitor_queue :), 1 );

} /* register_monitor() */

/** @ignore yes */
private void flush_monitor_queue() {
    flush_id = 0;

    foreach( object ob, int charge in monitor_queue ) {
        if( ob )
            monitor_points( ob, charge );
    }

    monitor_queue = ([ ]);

} /* flush_monitor_queue() */