+static int lock(token_t verb, token_t obj)
+/* Lock, unlock, no object given. Assume various things if present. */
+{
+ int k;
+ if (obj == INTRANSITIVE) {
+ SPK=28;
+ if(HERE(CLAM))obj=CLAM;
+ if(HERE(OYSTER))obj=OYSTER;
+ if(AT(DOOR))obj=DOOR;
+ if(AT(GRATE))obj=GRATE;
+ if(obj != 0 && HERE(CHAIN)) return(8000);
+ if(HERE(CHAIN))obj=CHAIN;
+ if(obj == 0) return(2011);
+ }
+
+ /* Lock, unlock object. Special stuff for opening clam/oyster
+ * and for chain. */
+ if(obj == CLAM || obj == OYSTER)
+ return bivalve(verb, obj);
+ if(obj == DOOR)SPK=111;
+ if(obj == DOOR && game.prop[DOOR] == 1)SPK=54;
+ if(obj == CAGE)SPK=32;
+ if(obj == KEYS)SPK=55;
+ if(obj == GRATE || obj == CHAIN)SPK=31;
+ if(SPK != 31 || !HERE(KEYS)) return(2011);
+ if(obj == CHAIN)
+ return chain(verb);
+ if (game.closng) {
+ SPK=130;
+ if(!game.panic)game.clock2=15;
+ game.panic=true;
+ return(2011);
+ }
+ SPK=34+game.prop[GRATE];
+ game.prop[GRATE]=1;
+ if(verb == LOCK)game.prop[GRATE]=0;
+ SPK=SPK+2*game.prop[GRATE];
+ return(2011);
+}
+