final_realms_fluffos_v1/
final_realms_fluffos_v1/bin/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/ChangeLog.old/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/Win32/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/compat/simuls/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/clone/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/command/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/data/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/etc/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/include/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/inherit/master/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/log/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/compiler/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/efuns/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/single/tests/operators/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/testsuite/u/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/tmp/
final_realms_fluffos_v1/fluffos-2.9-ds2.11/windows/
final_realms_fluffos_v1/lib/baseobs/guilds/
final_realms_fluffos_v1/lib/baseobs/misc/
final_realms_fluffos_v1/lib/baseobs/races/shadows/
final_realms_fluffos_v1/lib/cmds/god/
final_realms_fluffos_v1/lib/cmds/handlers/
final_realms_fluffos_v1/lib/cmds/handlers/cmds/
final_realms_fluffos_v1/lib/d/heaven/
final_realms_fluffos_v1/lib/d/heaven/heaven/ave/
final_realms_fluffos_v1/lib/d/mudlib/
final_realms_fluffos_v1/lib/d/newbie/
final_realms_fluffos_v1/lib/d/newbie/docs/
final_realms_fluffos_v1/lib/d/newbie/drow/armour/
final_realms_fluffos_v1/lib/d/newbie/drow/items/
final_realms_fluffos_v1/lib/d/newbie/drow/mobs/
final_realms_fluffos_v1/lib/d/newbie/drow/oldmobs/
final_realms_fluffos_v1/lib/d/newbie/drow/weapons/
final_realms_fluffos_v1/lib/d/newbie/duergar/weapons/
final_realms_fluffos_v1/lib/d/newbie/dwarf/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/cafe/
final_realms_fluffos_v1/lib/d/newbie/elf/chars/equip/
final_realms_fluffos_v1/lib/d/newbie/elf/items/armours/
final_realms_fluffos_v1/lib/d/newbie/elf/items/obj/
final_realms_fluffos_v1/lib/d/newbie/elf/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/elf/quick_fix/
final_realms_fluffos_v1/lib/d/newbie/gnome/armour/
final_realms_fluffos_v1/lib/d/newbie/gnome/buildings/
final_realms_fluffos_v1/lib/d/newbie/gnome/items/
final_realms_fluffos_v1/lib/d/newbie/gnome/npcs/clones/
final_realms_fluffos_v1/lib/d/newbie/gnome/rooms/northrooms/
final_realms_fluffos_v1/lib/d/newbie/gnome/weapons/
final_realms_fluffos_v1/lib/d/newbie/goblin/armour/
final_realms_fluffos_v1/lib/d/newbie/goblin/items/
final_realms_fluffos_v1/lib/d/newbie/grads/log/
final_realms_fluffos_v1/lib/d/newbie/grads/npcs/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/
final_realms_fluffos_v1/lib/d/newbie/grads/rooms/cave1/
final_realms_fluffos_v1/lib/d/newbie/grads/temp/
final_realms_fluffos_v1/lib/d/newbie/guests/weapons/
final_realms_fluffos_v1/lib/d/newbie/half-elf/items/
final_realms_fluffos_v1/lib/d/newbie/half-elf/newroomss/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/castle/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/drows/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/savannah/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/secret/
final_realms_fluffos_v1/lib/d/newbie/half-elf/rooms/town/
final_realms_fluffos_v1/lib/d/newbie/halfling/
final_realms_fluffos_v1/lib/d/newbie/halfling/misc/
final_realms_fluffos_v1/lib/d/newbie/halfling/rooms/cave/
final_realms_fluffos_v1/lib/d/newbie/human/
final_realms_fluffos_v1/lib/d/newbie/human/armour/
final_realms_fluffos_v1/lib/d/newbie/human/monsters/
final_realms_fluffos_v1/lib/d/newbie/human/obj/
final_realms_fluffos_v1/lib/d/newbie/human/weapons/
final_realms_fluffos_v1/lib/d/newbie/lizard/armour/
final_realms_fluffos_v1/lib/d/newbie/lizard/items/
final_realms_fluffos_v1/lib/d/newbie/lizard/underwater/
final_realms_fluffos_v1/lib/d/newbie/lizard/weapons/
final_realms_fluffos_v1/lib/d/newbie/logs/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/
final_realms_fluffos_v1/lib/d/newbie/new_halfelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/npcs/
final_realms_fluffos_v1/lib/d/newbie/newdrow/rooms/
final_realms_fluffos_v1/lib/d/newbie/newelf/
final_realms_fluffos_v1/lib/d/newbie/newelf/chars/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/
final_realms_fluffos_v1/lib/d/newbie/newelf/npcs/recopied/
final_realms_fluffos_v1/lib/d/newbie/newelf/obj/
final_realms_fluffos_v1/lib/d/newbie/newelf/quest_docs./
final_realms_fluffos_v1/lib/d/newbie/newken/
final_realms_fluffos_v1/lib/d/newbie/newken/chars/
final_realms_fluffos_v1/lib/d/newbie/newken/misc/
final_realms_fluffos_v1/lib/d/newbie/newken/npcs/
final_realms_fluffos_v1/lib/d/newbie/newken/obj/
final_realms_fluffos_v1/lib/d/newbie/newliz/
final_realms_fluffos_v1/lib/d/newbie/newliz/cave/
final_realms_fluffos_v1/lib/d/newbie/newliz/npcs/
final_realms_fluffos_v1/lib/d/newbie/orc/items/misc/
final_realms_fluffos_v1/lib/d/newbie/orc/items/weapons/
final_realms_fluffos_v1/lib/d/newbie/orc/tower/
final_realms_fluffos_v1/lib/d/vehicle/
final_realms_fluffos_v1/lib/doc/
final_realms_fluffos_v1/lib/doc/driver/
final_realms_fluffos_v1/lib/doc/driver/concepts/
final_realms_fluffos_v1/lib/doc/driver/driver/
final_realms_fluffos_v1/lib/doc/driver/efuns/arrays/
final_realms_fluffos_v1/lib/doc/driver/efuns/bitstrings/
final_realms_fluffos_v1/lib/doc/driver/efuns/communication/
final_realms_fluffos_v1/lib/doc/driver/efuns/core/
final_realms_fluffos_v1/lib/doc/driver/efuns/debugging/
final_realms_fluffos_v1/lib/doc/driver/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/driver/efuns/interactive/
final_realms_fluffos_v1/lib/doc/driver/efuns/mappings/
final_realms_fluffos_v1/lib/doc/driver/efuns/objects/
final_realms_fluffos_v1/lib/doc/driver/efuns/security/
final_realms_fluffos_v1/lib/doc/driver/efuns/strings/
final_realms_fluffos_v1/lib/doc/driver/efuns/system/
final_realms_fluffos_v1/lib/doc/driver/efuns/types/
final_realms_fluffos_v1/lib/doc/driver/lpc/constructs/
final_realms_fluffos_v1/lib/doc/driver/lpc/types/
final_realms_fluffos_v1/lib/doc/driver/platforms/
final_realms_fluffos_v1/lib/doc/lpc/
final_realms_fluffos_v1/lib/doc/mail/
final_realms_fluffos_v1/lib/doc/man/
final_realms_fluffos_v1/lib/doc/man/html/
final_realms_fluffos_v1/lib/doc/man/html/applies/
final_realms_fluffos_v1/lib/doc/man/html/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/html/driver/
final_realms_fluffos_v1/lib/doc/man/html/efuns/
final_realms_fluffos_v1/lib/doc/man/html/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/html/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/html/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/html/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/html/efuns/general/
final_realms_fluffos_v1/lib/doc/man/html/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/html/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/
final_realms_fluffos_v1/lib/doc/man/local/applies/
final_realms_fluffos_v1/lib/doc/man/local/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/local/applies/master/
final_realms_fluffos_v1/lib/doc/man/local/concepts/
final_realms_fluffos_v1/lib/doc/man/local/defines/
final_realms_fluffos_v1/lib/doc/man/local/driver/
final_realms_fluffos_v1/lib/doc/man/local/efuns/
final_realms_fluffos_v1/lib/doc/man/local/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/local/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/local/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/local/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/local/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/local/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/local/efuns/general/
final_realms_fluffos_v1/lib/doc/man/local/efuns/interactive/
final_realms_fluffos_v1/lib/doc/man/local/efuns/internals/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/local/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/local/efuns/objects/
final_realms_fluffos_v1/lib/doc/man/local/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/local/efuns/sockets/
final_realms_fluffos_v1/lib/doc/man/local/efuns/strings/
final_realms_fluffos_v1/lib/doc/man/local/efuns/system/
final_realms_fluffos_v1/lib/doc/man/local/historical/
final_realms_fluffos_v1/lib/doc/man/local/lfun/QC/
final_realms_fluffos_v1/lib/doc/man/local/lfun/events/
final_realms_fluffos_v1/lib/doc/man/local/lfun/monster/
final_realms_fluffos_v1/lib/doc/man/local/lfun/properties/
final_realms_fluffos_v1/lib/doc/man/local/lpc/
final_realms_fluffos_v1/lib/doc/man/local/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/local/lpc/types/
final_realms_fluffos_v1/lib/doc/man/local/standards/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/basic/
final_realms_fluffos_v1/lib/doc/man/local/tutorials/intermediate/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/interactive/
final_realms_fluffos_v1/lib/doc/man/mudos/applies/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/concepts/
final_realms_fluffos_v1/lib/doc/man/mudos/driver/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/arrays/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/buffers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/calls/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/compile/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/filesystem/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/floats/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/functions/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/general/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mappings/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mixed/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/mudlib/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/numbers/
final_realms_fluffos_v1/lib/doc/man/mudos/efuns/parsing/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/constructs/
final_realms_fluffos_v1/lib/doc/man/mudos/lpc/types/
final_realms_fluffos_v1/lib/doc/races/
final_realms_fluffos_v1/lib/doc/races/old_race/
final_realms_fluffos_v1/lib/global/virtual/
final_realms_fluffos_v1/lib/global/wiz_backup/
final_realms_fluffos_v1/lib/net/config/
final_realms_fluffos_v1/lib/net/daemon/chars/
final_realms_fluffos_v1/lib/net/inherit/
final_realms_fluffos_v1/lib/net/intermud3/
final_realms_fluffos_v1/lib/net/intermud3/cmds/
final_realms_fluffos_v1/lib/net/intermud3/save/
final_realms_fluffos_v1/lib/net/intermud3/services/
final_realms_fluffos_v1/lib/net/obj/
final_realms_fluffos_v1/lib/net/old/
final_realms_fluffos_v1/lib/net/old/intermud/
final_realms_fluffos_v1/lib/net/old/intermud/adm/
final_realms_fluffos_v1/lib/net/old/intermud/services/
final_realms_fluffos_v1/lib/net/old/intermud/udp/
final_realms_fluffos_v1/lib/net/virtual/
final_realms_fluffos_v1/lib/obj/b_day/
final_realms_fluffos_v1/lib/obj/chars/
final_realms_fluffos_v1/lib/obj/handlers/lists/
final_realms_fluffos_v1/lib/obj/handlers/useless/
final_realms_fluffos_v1/lib/obj/monsters/
final_realms_fluffos_v1/lib/obj/roomgen/
final_realms_fluffos_v1/lib/obj/soul/
final_realms_fluffos_v1/lib/obj/vegetation/
final_realms_fluffos_v1/lib/obj/weapons/oldsys/
final_realms_fluffos_v1/lib/open/
final_realms_fluffos_v1/lib/players/g/
final_realms_fluffos_v1/lib/releasefiles/d/heaven/
final_realms_fluffos_v1/lib/releasefiles/d/mudlib/
final_realms_fluffos_v1/lib/releasefiles/d/newbie/
final_realms_fluffos_v1/lib/releasefiles/doc/
final_realms_fluffos_v1/lib/releasefiles/players/g/
final_realms_fluffos_v1/lib/releasefiles/save/
final_realms_fluffos_v1/lib/releasefiles/save/environ/
final_realms_fluffos_v1/lib/releasefiles/save/roomgen/
final_realms_fluffos_v1/lib/releasefiles/secure/
final_realms_fluffos_v1/lib/releasefiles/w/
final_realms_fluffos_v1/lib/releasefiles/w/god/
final_realms_fluffos_v1/lib/room/
final_realms_fluffos_v1/lib/save/
final_realms_fluffos_v1/lib/save/environ/
final_realms_fluffos_v1/lib/save/roomgen/
final_realms_fluffos_v1/lib/scripts/
final_realms_fluffos_v1/lib/secure/crerem/
final_realms_fluffos_v1/lib/secure/dom/
final_realms_fluffos_v1/lib/secure/log/
final_realms_fluffos_v1/lib/secure/misc/
final_realms_fluffos_v1/lib/std/adnd/
final_realms_fluffos_v1/lib/std/commands/shadows/
final_realms_fluffos_v1/lib/std/creator/
final_realms_fluffos_v1/lib/std/curses/
final_realms_fluffos_v1/lib/std/curses/old_sys/
final_realms_fluffos_v1/lib/std/curses/shadows/
final_realms_fluffos_v1/lib/std/dom/
final_realms_fluffos_v1/lib/std/effects/
final_realms_fluffos_v1/lib/std/effects/healing/
final_realms_fluffos_v1/lib/std/effects/other/
final_realms_fluffos_v1/lib/std/effects/poisons/
final_realms_fluffos_v1/lib/std/environ/
final_realms_fluffos_v1/lib/std/guilds/
final_realms_fluffos_v1/lib/std/guilds/priests/samples/
final_realms_fluffos_v1/lib/std/guilds/wizards/
final_realms_fluffos_v1/lib/std/living/baldy/
final_realms_fluffos_v1/lib/std/living/divstuff/
final_realms_fluffos_v1/lib/std/paran/
final_realms_fluffos_v1/lib/std/poisons/
final_realms_fluffos_v1/lib/std/poisons/shadows/
final_realms_fluffos_v1/lib/std/poisons/weapons/
final_realms_fluffos_v1/lib/std/race_groups/
final_realms_fluffos_v1/lib/std/room/
final_realms_fluffos_v1/lib/std/room/old/
final_realms_fluffos_v1/lib/std/rooms/
final_realms_fluffos_v1/lib/std/shadows/
final_realms_fluffos_v1/lib/std/shadows/test_shad/
final_realms_fluffos_v1/lib/std/socket/
final_realms_fluffos_v1/lib/std/spells/
final_realms_fluffos_v1/lib/std/vaults/
final_realms_fluffos_v1/lib/tmp/
final_realms_fluffos_v1/lib/w/
final_realms_fluffos_v1/lib/w/god/
final_realms_fluffos_v1/old/
final_realms_fluffos_v1/win32/
/***************************************************************************
*                                                                          *
*        Ranged weapon code ... should include _all_ thrown weapons        *
*              Before do any read the RANGED_DOC.TXT                       *
*                     Radix - March 3, 1996                                *
*                     Khelben - July 23, 1996                              *
*                     Cailet - October 19, 1996                            *
*                                                                          *
***************************************************************************/
 
inherit "/obj/weapon.c";
 
#include "path.h"
#define RANGE "/obj/handlers/range.c"
// info[] 0- range 1- speed 2- accuracy 3-container 4-ammo 5-hands  
 
mixed info,tmp;
string wtype;
object me, him, env;
int round;
string firemess, readymess;
string roomfire, roomready; 

private int *ranged_damage;
object shadow;
string ammo;                     
 

int do_hit(object me, object him);
void do_random_target(object me, object him);
void missed_shot(object me, object him);

void lose_concentration();
 
void set_readymess(string arg) { readymess = arg; }
void set_firemess(string arg)  { firemess = arg;  }
void set_roomready(string arg) { roomready = arg; }
void set_roomfire(string arg)  { roomfire = arg;  }


int do_ranged_weapon_damage(object archer, object enemy, mixed tmp);
 
void anger_npc(object a, object e, mixed tmp);   // Will make NPCs attack 
                                                 // players. 


int *query_weapon_damage() { return ranged_damage; }
 
int query_ranged_weapon_ammo() { return 1; }
int query_ranged_ammo() { return 1; }

 
create()
{
   ::create();
   info = allocate(6);
   if(wtype)
      info = TABLE->get_info(wtype);
   me, him = ({ });
   round = 0;
   if ( !readymess )
      readymess = "Skillfully, you draw the bow ready and aim at";
   if ( !firemess )
      firemess = "Finishing your aim, you shoot off an arrow at";
   if ( !roomready )
      roomready = "$shooter_name$ skillfully draws a bow and aims.\n\n";
   if ( !roomfire )
      roomfire = "$shooter_name$ shoots an arrow.\n\n";

// Why this?  Doesn't need to be in base object - Radix
// add_property("guild","ranger");   This must be put in every weapon.
   set_holdable(1);
   if ( (int)info[5] == 2 )
   {   set_twohanded(1); }
}


void init()
{
   add_action("extract_proj","extract");
   add_action("ranged_throw","throw");
   ::init();
}
 
string room_messages(string message)  {

object shooter = environment(this_object());
string shooter_name = shooter->query_cap_name();

string *room_msg;

   message = replace(message,"$shooter_name$",shooter_name);
return message;
}

void set_ranged_weapon(string t) 
{
    wtype = TABLE->look_up(t);
    info = TABLE->get_info(wtype);
}
 
int ranged_throw(string victim)
{
    object old = him;
    if(!this_object()->query_in_use())
    {
       write("You must be holding this weapon to use it!\n");
       return 1;
    }
    if(!victim || !stringp(victim))
    {
       write("Syntax: "+query_verb()+" <target>\n");
       return 1;
    }
    if(environment()) me = environment(this_object());
    victim = me->expand_nickname(victim);
    him = find_living(victim);
    if(!me || !him)
    {
       write(capitalize(victim)+" does not exist or is a ghost.\n");
       return 1;
    }
    if(him && him == me)
    {
       write("Suicide is not possible, try to kill something else.\n");
       return 1;
    }
    if(him->query_property("dead"))
    {
       write(him->query_cap_name()+" is a ghost.\n");
       return 1;
    }
    if(!RANGE->check_line_of_sight(me,him,info[0]) && ENV(me) != ENV(him))
    {
       write("Could not find "+him->query_cap_name()+" in range.\n");
       return 1;
    }
    if(him->query_hidden()||him->query_invis()||him->query_hide_shadow())
    {
       write("Could not find "+him->query_cap_name()+" in range.\n");
       return 1;
    }
    
    if(!round)  {
       write(readymess+" "+him->query_cap_name()+".\n");      
   write(replace(roomready,"$shooter_name$",TP->query_cap_name()));
                }
    else
                {
       if(him == old)
          write("You hesitate and aim at "+him->query_cap_name()+
             " again.\n");
       else
          write("You change aim from "+old->query_cap_name()+" to "+
             him->query_cap_name()+".\n");
                }
    env = environment(me);
    round = 0;
    set_heart_beat(1);
    return 1;
}
 
heart_beat()
{
   int hit;

   if(!him || !me)
   {
      if(!me)
      {
          // die in horror
          dest_me();
          return;
      }
      tell_object(me,"You lost sight of "+him->query_cap_name()+".\n");
      me, him = 0;
      round = 0;
      set_heart_beat(0);
      return;
   }   
   if(env != environment(me))
      lose_concentration();
      
   if(!this_object()->query_in_use())
   {
     tell_object(me,"As you lower your weapon you lose your target.\n");
     set_heart_beat(0);
     return;
   }
   if(him->query_property("dead"))
   {
      write(him->query_cap_name()+" is a ghost.\n");
      set_heart_beat(0);
      return;
   }
   if(!RANGE->check_line_of_sight(me,him,info[0])&& env != environment(him))
   {
      tell_object(me,him->query_cap_name()+" is out of range!\n");
      me, him = 0;
      round = 0;
      set_heart_beat(0);
      return;
   }
   if(him->query_hidden() || him->query_invis() || him->query_hide_shadow())
   {
      tell_object(me,"Could not find "+him->query_cap_name()+" in range.\n");
      me, him = 0;
      round = 0;
      set_heart_beat(0);
      return;
   }
 
   if(round == info[1])
   {
      tell_object(me,firemess+" "+him->query_cap_name()+".\n");
      tell_room(ENV(me),replace(roomfire,"$shooter_name$",me->query_cap_name()),me);

      if(!do_hit(me,him))
      {
         missed_shot(me,him);   // Wrong the shot. 
      }
      me, him = 0; 
      round = 0;
      set_heart_beat(0);
      return;
   }
   
   round++;
   tell_object(me,"You continue your aim at "+him->query_cap_name()+".\n");
}
 
void lose_concetration()
{
   tell_object(me,"Moving, you lose your concentration and begin "
      "again aiming at "+him->query_cap_name()+".\n");
   env = environment(me);
   round = 0;
}

int check_accuracy(object archer, object enemy, int tmp)
{
   int bonus, malus, ac, thac0, accuracy, distance, dex;
   int needed, shoot;
   int prop;

   if( enemy->query_property("NOBUDGE") ||
        environment(enemy)->query_static_property("noguild") ||
        environment(enemy)->query_static_property("nocast") )
    {
        return -1;    // We'll do them lose ammo.
    }
    if( environment(archer)->query_static_property("noguild") ||
        environment(archer)->query_static_property("nocast") )
    {
        return -1;    // We'll do them lose ammo.
    }
   ac = enemy->query_total_ac();
   thac0 = archer->query_thac0();
   accuracy = info[2];
   distance = tmp*2;   // Will be hardest if the target is far 
   distance *= 10;
   dex = (int)archer->query_dex()-16;
   dex *= 10;   
   dex /= 2;
   
   needed = thac0 - ac + distance - accuracy - dex;

       // The following was added as petition from Cailet and Verkho.

   if(!archer->query_property(wtype))
      needed = needed + 40;
   else
   {
      prop = (int)archer->query_property(wtype);
      prop *= 25;   // 10 * 2.5 
      needed = needed - prop;
   } 
   shoot = random(200);
   if ( shoot >= needed )
        return 1;   
   else
        return 0;
}
 
void missed_shot(object me, object him)
{
   int bad;

   tell_object(me,"You missed "+him->query_cap_name()+"!\n"); 
   bad = random(200);
   
   switch (bad)
   {
      case 0..198:
                    this_object()->move(environment(him));
                    break;
   
      default:     // 199 
                    do_random_target(me,him);     // Now we can hit 
                                                       // another target 
                    break;              
    }                       
}
 
int do_hit(object archer, object enemy)
{
   int damage,i, dest;
   int shoot;
   
   tmp = RANGE->get_direction_delta(enemy, archer);
   
   
   shoot = check_accuracy(archer, enemy, tmp[1]);
   
   if ( shoot == -1)
   {
      tell_object(me,"You missed "+enemy->query_cap_name()+"!\n"); 
      this_object()->dest_me();
      return 1;     // In this way We'll avoid the miss_shoot function.
   }
      
   if(shoot == 1)
   {
      damage = do_ranged_weapon_damage(archer,enemy,tmp);
      tell_object(archer,"You hit "+enemy->query_cap_name()+" with your "+
                  this_object()->query_short()+" doing "+damage+" points "
                  "of damage!\n");
 
      tell_object(enemy,"You have been struck by a flying "
                  +this_object()->query_short()+
                  " from the "+tmp[0]+" doing "+damage+"points of damage!\n");

      tell_room(ENV(enemy), enemy->query_cap_name()+" is hit by a "
                "flying "+this_object()->query_short()+
                " from the "+tmp[0]+".\n", ({archer,enemy}));
                
      if ( !userp(enemy) )  
      {  
         if( wtype == "throwing knife" )
            this_object()->move(enemy); 
         else
            this_object()->move(environment(enemy));
      } 
      return 1;
   }
   else if( shoot == 0)
        return 0;    // Wrong the shoot 
}

void do_random_target(object archer, object enemy)
{ 
   int damage, j, i, dest;
   int deb=0, di;
   object *all;
   
   all = all_inventory(environment(enemy));
   j = sizeof(all); 
   if ( j == 1 && ENV(archer) != ENV(enemy) )  
   {
        // Only our target is in the room 
        
        this_object()->dest_me();
   }
   
   else if ( j == 2 && ENV(archer) == ENV(enemy) )    
   {   
        // Only our target and the archer are in the room 
        
        this_object()->dest_me();
   }
   
   else
   {
        for(di=0; di<sizeof(all); di++)
        i = random(sizeof(all));
        while ( all[i] == enemy  || all[i] == archer ) 
        {
           i = random(sizeof(all));  
           deb++;
        }   
   }
   
   if ( userp(all[i]) || all[i]->query_npc() )
   {
      damage = do_ranged_weapon_damage(archer,all[i],tmp);
      tell_object(archer,"Oops...you mess up the shot and you now "+
                  "hit "+all[i]->query_cap_name()+" with your "+
                  this_object()->query_short()+" doing "+damage+"!\n");
      tell_object(all[i],"You have been struck by a flying "
                  +this_object()->query_short()+
                  " from the "+tmp[0]+" doing "+damage+"!\n");
      tell_object(all[i],"Ahora se te clona una flecha clavada.\n");
      tell_room(ENV(enemy), enemy->query_cap_name()+" is hit by a "
                "projectile from the "+tmp[0]+".\n", ({archer,enemy}));
   }
   
   else
      this_object()->dest_me();
      
   if ( !userp(all[i]) )
   {  
      if( wtype == "throwing knife" )
         this_object()->move(enemy); 
      else
         this_object()->move(environment(enemy));
   }
}


void set_weapon_damage(int *dam) 
{ 
   if(!dam || !sizeof(dam)) return;
   ranged_damage = dam;
   return;
}

int do_ranged_weapon_damage(object archer, object enemy, mixed tmp)
{
   int dam;

   if(!archer || !enemy) return 0;
   if ( sizeof(ranged_damage) != 3 )   /* Not necessary. Can be erased */
      ranged_damage = ({ 1, 5, 0 });
    
   dam = roll(ranged_damage[0],ranged_damage[1])+ranged_damage[2];
   dam = dam + this_object()->query_enchant();
   dam = dam + archer->query_damage_bonus();
 
   if(dam < 0) dam = 1;
   if(dam > 20) dam = 20;
 
   if(environment(enemy) == environment(archer)) 
   {
      if(archer->query_hidden_shadow() || archer->query_hidden())
      {
         dam *= 2;
         archer->destruct_hide_shadow();
         archer->set_hidden(0);
      }
      else
         dam *= 1.3;
   }
   else
   {
      if(tmp[0] == "down") dam *= 2;
      if(tmp[0] == "up") dam /= 2;
   }
      
   enemy->adjust_hp(-dam,archer);
   if(!userp(enemy))                      // If he is a NPC will move him. 
         anger_npc(archer, enemy, tmp);
   enemy->attack_by(archer);                 
   if (userp(enemy) && wtype=="throwing knife")   
   {                          // We'll not slay NPCs because they are fools 
      this_object()->add_property("stiked",enemy->query_cap_name());      
      shadow = clone_object(SHOOT_SHADOW);
      shadow->setup_shadow(enemy , this_object());
      enemy->add_extra_look(shadow);
   }
   if ( userp(enemy) )
   {  
      if( wtype == "throwing knife" )
         this_object()->move(enemy); 
      else
         this_object()->move(environment(enemy));
   }
   dam = (dam * (100 - (int)enemy->query_property("missile")))/100; 
   return dam;
}
 
void anger_npc(object archer, object enemy, mixed tmp)
{
   if ( enemy->query_hp() >= 0 )
   {
      while(environment(archer) != environment(enemy))
         enemy->do_command(tmp[0]);
   }
}

int extract_proj(string str)
{
   object dagger;

   
   if ( ( 
          str == "dagger" || str == "knife" ||
          str == (string)this_object()->query_proj_name() ||
          str == (string)this_object()->query_name() ||    
          str == (string)this_object()->query_cap_name() ||    
          str == (string)this_object()->query_short() ) &&
    1 )
   {
      if ( random(100) > ((int)this_player()->query_dex() * 5) )
      {
         // The player cannot extract the arrow because he is clumsy  
         
              tell_object(this_player(), "You try to extract the "
                     +this_object()->query_name()+" "+
                     "but you only move it deeper into your flesh.\n");
         this_player()->adjust_hp(-1,this_object());         
         return 1;
      }
      shadow->destruct_me();
           tell_object(this_player(), "As you extract the "
                  +this_object()->query_name()+" you feel a "
                  "deep pain shoot through your body, but now you "
                  "feel strangely better.\n");
      return 1;
   }
   else
      return 0;
}