!       NewLock         A replacement for Lock and Unlock to implement multiple
!                       keys and key-side definition.  By L. Ross Raszewski
!
! Ever wanted to have multiple keys for the same lockable object?  Instead of
! using "with_key" on the lock, use "key_to" on the key.  "key_to" can hold
! a single value or an array, and works just as well as "with_key"
!
! Before inclusion of "verblib.h", insert these two lines:
!       Replace LockSub;
!       Replace UnlockSub;
! Include this file shortly after Verblib.
!
! Example: Create a stone door which can be opened by a stone key or a skeleton
! key, which also unlocks a wood door.
!
! Object stonedoor "Stone Door"
!       has openable closed lockable door static;
!
! Object stone_key "Stone key"
!       with  key_to stonedoor;
!
! Object s_key "Skeleton Key"
!       with  key_to stonedoor wood_door;
!

property key_to $ffff;
[ TestforKey obj pkey j;
       if (obj.with_key==pkey) rtrue;
       for (j=0:j<=(pkey.#key_to):j++)
               if ((pkey.&key_to)-->j==noun) rtrue;
rfalse;
];
[ UnlockSub;
 if (noun hasnt lockable) return L__M(##Unlock,1);
 if (noun hasnt locked)   return L__M(##Unlock,2);
 if (TestForKey(noun,second)~=1) return L__M(##Unlock,3);
 give noun ~locked;
 if (AfterRoutines()==1) rtrue;
 if (keep_silent==1) rtrue;
 L__M(##Unlock,4,noun);
];
[ LockSub;
 if (noun hasnt lockable) return L__M(##Lock,1);
 if (noun has locked)     return L__M(##Lock,2);
 if (noun has open)       return L__M(##Lock,3);
 if (TestForKey(noun,second)~=1) return L__M(##Lock,4);
 give noun locked;
 if (AfterRoutines()==1) rtrue;
 if (keep_silent==1) rtrue;
 L__M(##Lock,5,noun);
];