!    LockTest                   An inform library to choose default keys
!                               By L. Ross Raszewski
!
! By giving any key the "is_key" attribute, the commands "Lock" and "Unlock"
! will choose a default key if only one is held.  If more than one key is held,
! it checks the property "key_to".  If only one object has an entry in its
! key_to array matching the object to be unlocked, it will be chosen as the
! default key.  This way, the game can recognise obvious keys, such as a
! "gold key" to a "gold door".  If you think that this will give away a puzzle,
! just don't give that object a key_to value.
!
! This library IS compatible with the improved multi-key locking function by
! the author
!



#IFNDEF key_to;
property key_to $ffff;
#ENDIF;
global assumed_key;
attribute is_key;
[ DefaultUnlockSub;
       print "(with ", (the) assumed_key, ".)^";
       <<Unlock noun assumed_key>>;
];
[ DefaultLockSub;
       print "(with ", (the) assumed_key, ".)^";
       <<Lock noun assumed_key>>;
];
[ DefaultKeyTest i j count;
       if (noun hasnt lockable) rfalse;
       objectloop (i in player)
               if (i has is_key) { count++; assumed_key=i;};
       if (count==1) rtrue;
       if (count>1) {
               count=0;
               objectloop (i in player)
                       { if (i has is_key)
                       { for (j=0:j<=(i.#key_to):j++)
                               if ((i.&key_to)-->j==noun)
                                       {count++; assumed_key=i;};};};};
       if (count==1) rtrue;
       rfalse;
];
Extend "lock" first * noun=DefaultKeyTest         ->DefaultLock;
Extend "unlock" first * noun=DefaultKeyTest       ->DefaultUnlock;