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_ fired weapons
      Radix - March 3, 1996
         Khelben - Juny 23, 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 ammo, me, him, env;
int round;
string firemess, readymess; 
 
object get_ammo();
int do_hit(object me, object him, object ammo);
void do_random_target(object me, object him, object ammo);
void missed_shot(object me, object him, object ammo);
void lose_concentration();
 
void set_readymess(string arg) { readymess = arg; }
void set_firemess(string arg) { firemess = arg; }
 
create()
{
   ::create();
   info = allocate(6);
   if(wtype)
      info = TABLE->get_info(wtype);
   ammo, 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";
// 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()
{
    ::init();

      add_action("ranged_shot","shoot");
}
 
void set_ranged_weapon(string t) 
{
    wtype = TABLE->look_up(t);
    info = TABLE->get_info(wtype);
}
 
int ranged_shot(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());
    if(info[4] != "itself" && sizeof(me->query_attacker_list()))
    {
       write("You cannot load your "+query_short()+
          " while in combat!\n");
       return 1;
    }
    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;
    }

    ammo = get_ammo();
    if(!ammo)
    {
       write("Could not find "+info[4]+" in "+info[3]+".\n");
       return 1;
    }
    if(!round)
       write(readymess+" "+him->query_cap_name()+".\n");
    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, ammo = 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 low 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, ammo = 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, ammo = 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), me->query_cap_name()+" holds a "+query_short()+
                " and shoot off a projectile.\n", ({me}));
      if(!do_hit(me,him,ammo))
         missed_shot(me,him,ammo);   // Wrong the shot. 
      
      me, him, ammo = 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;
}
 
// May give this a number arg to return *objs.. fire more than one arrow?
object get_ammo()
{
   object *all;
   int i;
   
 
   // missiles from containers...
   all = find_match(info[4], find_match(info[3], me)); 
   for(i=0; i<sizeof(all); i++) 
      if(all[i]->query_ranged_ammo()) 
         return all[i];
 
   return 0;
}
 
int check_accuracy(object archer, object enemy, object proj, int tmp)
{
   int bonus, malus, ac, thac0, acc, distance, dex;
   int needed, shoot;

   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();
   acc = info[2];
   distance = tmp*2;   // Will be hardest if the target is far 
   distance *= 10;
   dex = (int)archer->query_dex()-16;
   dex *= 10;   
   bonus = acc + dex - distance;
   needed = thac0 - bonus - acc;
   shoot = random(200);
   if ( shoot >= needed )
       return 1;   
   else
       return 0;
}
 
 
void missed_shot(object me, object him, object proj)
{
   int bad;

    if(!ammo)
   {  
      return;
   }
   
   tell_object(me,"You missed "+him->query_cap_name()+"!\n"); 
   bad = random(200);
   
   switch (bad)
   {
      case 0..10:
            ammo->move(environment(him));
            break;

      case 11..198: 
                  ammo->dest_me();
                  break;
   
      default:     // 199 
               do_random_target(me,him,proj);     // Now we can hit 
                                      // another target 
               break;        
    }               
}
 
int do_hit(object archer, object enemy, object proj)
{
   int damage,i, dest;
   int shoot;
   
   tmp = RANGE->get_direction_delta(enemy, archer);
   
   if(!proj)
   {  
      return 1;
   }
   
   shoot = check_accuracy(archer, enemy, proj, tmp[1]);
   
   if ( shoot == -1)
   {
      tell_object(me,"You missed "+enemy->query_cap_name()+"!\n"); 
      proj->dest_me();
      return 1;     // In this way We'll avod the miss_shoot function.
   }
      
   if(shoot == 1)
   {
      damage = proj->do_ranged_weapon_damage(archer,enemy,tmp,info[4]);
      tell_object(archer,"You hit "+enemy->query_cap_name()+" with your "+
                  proj->query_short()+" doing "+damage+"!\n");
 
      tell_object(enemy,"You have been struck by a flying "+proj->query_short()+
                  " from the "+tmp[0]+" doing "+damage+"!\n");
      tell_room(ENV(enemy), enemy->query_cap_name()+" is hited by a "
                "projectile from the "+tmp[0]+".\n", ({archer,enemy}));
                
      if ( !userp(enemy) )   
      {
         switch((string)proj->query_proj_name())
         {
            case "arrow":
                        dest = ARROW_BREAK; break;
                        
            case "bolt":
                        dest = BOLT_BREAK; break;
                        
            case "needle":
                    dest = NEEDLE_BREAK; break;
         
            default:
                        dest=200; break;
         }                    
         if ( random(100) <= dest )
         {
            proj->dest_me();
         }
         else
            proj->move(enemy); 
      }
      return 1;
   }
   else if( shoot == 0)
       return 0;    // Wrong the shoot 
}

void do_random_target(object archer, object enemy, object proj)
{ 
   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 
          
          proj->dest_me();
   }
   
   else if ( j == 2 && ENV(archer) == ENV(enemy) )    
   {   
        // Only our target and the archer are in the room 
          
          proj->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 = proj->do_ranged_weapon_damage(archer,all[i],tmp,info[4]);
      tell_object(archer,"Opps...you wrong the shot and you now "+
                  "hit "+all[i]->query_cap_name()+" with your "+
                proj->query_short()+" doing "+damage+"!\n");
      tell_object(all[i],"You have been struck by a flying "+proj->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 hited by a "
                "projectile from the "+tmp[0]+".\n", ({archer,enemy}));
   }
   
   else
      proj->dest_me();
      
   if ( !userp(all[i]) )
   {
      switch((string)proj->query_proj_name())
      {
         case "arrow":
                     dest = ARROW_BREAK; break;
                        
         case "bolt":
                        dest = BOLT_BREAK; break;
                        
         case "needle":
                    dest = NEEDLE_BREAK; break;
      }
      if ( random(100) <= dest )
      {
         proj->dest_me();
      }
      else
         proj->move(enemy); 
   }
}