!----------------------------------------------------- ! Models locks and keys ! ! Verbs: ! New: DefaultLock, DefaultUnlock. (From the player's point of view, no difference.) ! Replaced: None ! ! Features: ! Key class which makes it easier for the parser to choose objects for lock and ! unlock, and which also remembers (once it's been used) what it opens. ! Debugging verb UnlockAll unlocks everything in the game. ! ! Resource cost: ! No attributes. ! ! Special Instructions: ! After including grammar, insert the following two lines into your code: ! ! Extend 'lock' first * noun=DefaultLockTest -> DefaultLock; ! Extend 'unlock' first * noun=DefaultLockTest -> DefaultUnlock; ! !----------------------------------------------------- Global assumed_instrument; Class Key, with invent [ ; if (inventory_stage == 2 && self.key_to ~= 0) { print " (which opens ", (the) self.key_to, ")"; } ], react_after [; lock, unlock: if ((self == second) && (self.key_to==0)) self.key_to = noun; ], name "key" "keys//p", list_together "keys", plural "keys", key_to 0; [ DefaultLockSub leftplace; if (assumed_instrument == 0) { leftplace = parent(noun.with_key); if (leftplace == nothing or 0) { print "You seem to have lost the key.^"; rtrue; } else { print "But you left the key to ", (the) noun, " in ", (the) leftplace, ".^"; rtrue; } } print "(with ", (the) assumed_instrument, ")^"; <>; ]; [ DefaultUnlockSub leftplace; if (assumed_instrument == 0) { leftplace = parent(noun.with_key); if (leftplace == nothing or 0) { print "You seem to have lost the key.^"; rtrue;} else { print "But you left the key to ", (the) noun, " in ", (the) leftplace, ".^"; rtrue; } } print "(with ", (the) assumed_instrument, ")^"; <>; ]; [ DefaultLockTest i count; if (noun hasnt lockable) rfalse; if (noun provides with_key && noun.with_key.key_to == noun) { if (noun.with_key notin player) { assumed_instrument = 0; rtrue; } else { assumed_instrument = noun.with_key; rtrue; } } objectloop (i in player && i ofclass Key) { if (i.key_to == 0) { count++; assumed_instrument = i; } } if (count==1) rtrue; rfalse; ]; #ifdef DEBUG; Verb 'unlockall' * -> UnlockAll; [ UnlockAllSub obj; objectloop(obj has locked) give obj ~locked; "All locks unlocked."; ]; #endif;