tmi2_fluffos_v2/
tmi2_fluffos_v2/bin/
tmi2_fluffos_v2/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/ChangeLog.old/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/Win32/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/compat/simuls/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/clone/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/command/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/data/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/etc/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/include/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/inherit/master/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/log/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/compiler/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/efuns/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/single/tests/operators/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/testsuite/u/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/tmp/
tmi2_fluffos_v2/fluffos-2.7-ds2.018/windows/
tmi2_fluffos_v2/lib/
tmi2_fluffos_v2/lib/adm/
tmi2_fluffos_v2/lib/adm/daemons/languages/
tmi2_fluffos_v2/lib/adm/daemons/network/I3/
tmi2_fluffos_v2/lib/adm/daemons/virtual/
tmi2_fluffos_v2/lib/adm/daemons/virtual/template/
tmi2_fluffos_v2/lib/adm/news/
tmi2_fluffos_v2/lib/adm/obj/
tmi2_fluffos_v2/lib/adm/obj/master/
tmi2_fluffos_v2/lib/adm/priv/
tmi2_fluffos_v2/lib/adm/shell/
tmi2_fluffos_v2/lib/adm/tmp/
tmi2_fluffos_v2/lib/cmds/
tmi2_fluffos_v2/lib/d/
tmi2_fluffos_v2/lib/d/Conf/
tmi2_fluffos_v2/lib/d/Conf/adm/
tmi2_fluffos_v2/lib/d/Conf/boards/
tmi2_fluffos_v2/lib/d/Conf/cmds/
tmi2_fluffos_v2/lib/d/Conf/data/
tmi2_fluffos_v2/lib/d/Conf/logs/
tmi2_fluffos_v2/lib/d/Conf/obj/
tmi2_fluffos_v2/lib/d/Conf/text/help/
tmi2_fluffos_v2/lib/d/Fooland/adm/
tmi2_fluffos_v2/lib/d/Fooland/data/
tmi2_fluffos_v2/lib/d/Fooland/data/attic/
tmi2_fluffos_v2/lib/d/Fooland/items/
tmi2_fluffos_v2/lib/d/TMI/
tmi2_fluffos_v2/lib/d/TMI/adm/
tmi2_fluffos_v2/lib/d/TMI/boards/
tmi2_fluffos_v2/lib/d/TMI/data/
tmi2_fluffos_v2/lib/d/TMI/rooms/
tmi2_fluffos_v2/lib/d/grid/
tmi2_fluffos_v2/lib/d/grid/adm/
tmi2_fluffos_v2/lib/d/grid/data/
tmi2_fluffos_v2/lib/d/std/
tmi2_fluffos_v2/lib/d/std/adm/
tmi2_fluffos_v2/lib/data/adm/
tmi2_fluffos_v2/lib/data/adm/daemons/
tmi2_fluffos_v2/lib/data/adm/daemons/doc_d/
tmi2_fluffos_v2/lib/data/adm/daemons/emoted/
tmi2_fluffos_v2/lib/data/adm/daemons/network/http/
tmi2_fluffos_v2/lib/data/adm/daemons/network/services/mail_q/
tmi2_fluffos_v2/lib/data/adm/daemons/network/smtp/
tmi2_fluffos_v2/lib/data/adm/daemons/news/archives/
tmi2_fluffos_v2/lib/data/attic/connection/
tmi2_fluffos_v2/lib/data/attic/user/
tmi2_fluffos_v2/lib/data/std/connection/b/
tmi2_fluffos_v2/lib/data/std/connection/l/
tmi2_fluffos_v2/lib/data/std/user/a/
tmi2_fluffos_v2/lib/data/std/user/b/
tmi2_fluffos_v2/lib/data/std/user/d/
tmi2_fluffos_v2/lib/data/std/user/f/
tmi2_fluffos_v2/lib/data/std/user/l/
tmi2_fluffos_v2/lib/data/std/user/x/
tmi2_fluffos_v2/lib/data/u/d/dm/working/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/doc_d/
tmi2_fluffos_v2/lib/data/u/l/leto/smtp/
tmi2_fluffos_v2/lib/doc/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/
tmi2_fluffos_v2/lib/doc/driverdoc/applies/interactive/
tmi2_fluffos_v2/lib/doc/driverdoc/concepts/
tmi2_fluffos_v2/lib/doc/driverdoc/driver/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/arrays/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/buffers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/compile/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/ed/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/filesystem/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/floats/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/functions/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/general/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/mappings/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/numbers/
tmi2_fluffos_v2/lib/doc/driverdoc/efuns/parsing/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/constructs/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/preprocessor/
tmi2_fluffos_v2/lib/doc/driverdoc/lpc/types/
tmi2_fluffos_v2/lib/doc/driverdoc/platforms/
tmi2_fluffos_v2/lib/doc/mudlib/
tmi2_fluffos_v2/lib/ftp/
tmi2_fluffos_v2/lib/include/driver/
tmi2_fluffos_v2/lib/log/
tmi2_fluffos_v2/lib/log/driver/
tmi2_fluffos_v2/lib/obj/net/
tmi2_fluffos_v2/lib/obj/shells/
tmi2_fluffos_v2/lib/obj/tools/
tmi2_fluffos_v2/lib/std/adt/
tmi2_fluffos_v2/lib/std/board/
tmi2_fluffos_v2/lib/std/body/
tmi2_fluffos_v2/lib/std/fun/
tmi2_fluffos_v2/lib/std/living/
tmi2_fluffos_v2/lib/std/object/
tmi2_fluffos_v2/lib/std/shop/
tmi2_fluffos_v2/lib/std/socket/
tmi2_fluffos_v2/lib/std/user/
tmi2_fluffos_v2/lib/std/virtual/
tmi2_fluffos_v2/lib/student/
tmi2_fluffos_v2/lib/student/kalypso/
tmi2_fluffos_v2/lib/student/kalypso/armor/
tmi2_fluffos_v2/lib/student/kalypso/rooms/
tmi2_fluffos_v2/lib/student/kalypso/weapons/
tmi2_fluffos_v2/lib/u/l/leto/
tmi2_fluffos_v2/lib/u/l/leto/cmds/
tmi2_fluffos_v2/lib/www/errors/
tmi2_fluffos_v2/lib/www/gateways/
tmi2_fluffos_v2/lib/www/images/
tmi2_fluffos_v2/old/
tmi2_fluffos_v2/win32/
// _pick.c
// Written by Deathknight,  12-10-92.
// Mobydick added support for picking door locks, 1-21-92.
// Part of the TMI mudlib. Please leave this header here if you use it.
// This file was largely based on _steal.c, written by Mobydick
// See _steal.c for more comments.
// Moby appreciates the credit :)
// Watcher updated the door check code a bit, 03-28-93.

#include <mudlib.h>
inherit DAEMON ;

// Number of seconds to wait after failure until they can try the lock again.
#define NEXT_PICK  120

string help();

int cmd_pick(string str) {

   mixed *locks ;
   object env ;
   mapping exits, doors ;
   mixed ob ;
   int myskill, vskill, pick_chance, i, *lock_time;
   int doordum ;   // 1 if picking a door lock, 0 if a container lock.
   string dir ;
   
   if (!str) {
      return notify_fail(help());
   }

   //	Check to see if the user can see what they are doing.
 
   if(!this_player()->query("vision")) {
   write("Pick what?  You can't see anything!\n");
   return 1; }
 
   env = environment(this_player());
 
   if (!env) {
      notify_fail("There aren't any doors in the void to pick!\n");
      return 0;
   } 
   if(str == "lock" && sizeof(env->query("doors")))
	str = "door";
 
   ob = present(str, environment(this_player())) ;
   if (!ob) {
       ob = present (str, this_player());
   }
   if(ob && (int)ob->query("prevent_get")) {
   notify_fail("You can't get that object.\n");
   return 0; }
 
   if (!ob || living(ob)) {
// We didn't find a container, must be a door we're trying to pick.
 
      if(str != "door" && sscanf(str, "%s door", dir) != 1) {
         notify_fail ("There's nothing here by that name.\n") ;
         return 0 ;
      }
      env = environment(this_player()) ;
      exits = env->query("exits") ;
 
      doors = env->query("doors") ;
 
      if(!dir) {
        if(sizeof(doors) > 1) {
        notify_fail("Which door do you wish to pick?\n");
        return 0; }

        dir = keys(doors)[0];
      }
 
      if (member_array(dir,keys(doors))==-1) {
	 notify_fail ("There is no door in that direction.\n") ;
	 return 0 ;
      }
      if (doors[dir]["status"] != "locked") {
	 notify_fail("The door is not locked.\n") ;
	 return 0 ;
      }
// All door locks have skill of 5.
      vskill = 5 ;
      doordum = 1 ;

      ob = dir+env->query("short") ;
   } else {
      vskill = ob->query("lock");
      doordum = 0 ;
   }
   this_player()->block_attack(2) ;
   myskill = this_player()->query_skill("Theft") ;
   if (!vskill) {
       write ("No lock to pick on that object!!!\n");
       return 1;
   }
   if (vskill == -1) {
       write ("Already unlocked!\n");
       return 1;
   }

// Make sure they haven't tried recently...

   locks = (mixed *)this_player()->query("locks_failed");
   if (!locks)  locks = ({ });
   lock_time = (int *)this_player()->query("locks_timed");
   if (!lock_time)  lock_time = ({ });
   for(i=0; i<sizeof(locks); i++) {
       if (locks[i] == ob && lock_time[i] > time()) {
           write ("You can't pick that particular lock again so soon!\n");
           return 1;
       }
   }
   
// This is the chance of success formula.

    pick_chance = 20 +myskill*3 - vskill*2 ;

   if (random(100)>pick_chance) {
	this_player()->improve_skill("Theft", 5) ;
	write ("You attempt to pick the lock, but are unsuccessful.\n") ;

       for(i=0; i<sizeof(locks); i++) {
           if (lock_time[i] <= time()) {
               locks[i] = ob;
               lock_time[i] = time() + NEXT_PICK;
               this_player()->set("locks_failed", locks);
               this_player()->set("locks_timed", lock_time);
               return 1;
           }
       }
       locks += ({ ob });
       lock_time += ({ time() + NEXT_PICK });
       this_player()->set("locks_failed", locks);
       this_player()->set("locks_timed", lock_time);
       return 1;
	}

// Success!
   this_player()->improve_skill("Theft", 10);
   if (doordum) {
      write ("You hear an audible \"Click!\" as the lock opens.\n") ;
      say (this_player()->query("cap_name")+" unlocks the "+dir+" door.\n") ;
      env->set_status(dir,"closed") ;
      env->update_link(dir) ;
      return 1 ;
   } else {
      ob->pick_lock(-1);
      if (ob->query("lock") > 0) {
          write ("The lock clicks, but it still doesn't look open to you...\n");
          return 1;
      }
      write ("You hear an audible 'click' as the lock opens!\n");
      return 1;
   }
}

string help() {
   return("Syntax: pick [lock on|in] <object>\n\n"+
   "This command will have your character try to pick the lock on\n"+
   "the object specified. You may or may not succeed. If you fail,\n"+
   "you won't be able to pick that particular lock again until\n"+
   "two minutes have passed.\n"+
  "\nSee also: lock, unlock, open, close\n");
}
/* EOF */