Tutorial 7: Locks - ThePix/QuestJS GitHub Wiki

... Continued from More items.

So we have that locked door from the kitchen to the garage. Let us say that there is a charger for the torch there, if the player can find the key.

You cannot lock or unlock an exit during the game because the exit is not really a thing; it is not a location or item in the game world. The user is going to type UNLOCK DOOR, so it needs to be the door that gets unlocked. Also, exits are not saved, so their state has to be changed in a room or item.

Quest 6 has a LOCKED_WITH template we can use with the door, however, locked doors are tricky things, as they can be accessed from either side - they straddle two room and have to control the exits from both. So let us look at locking a container first.

Locked Cabinet

We will start with a locked container; the glass cabinet we put n the lounge earlier. The cabinet is openable, so CONTAINER is sent true. We also give it the LOCKED_WITH template. This requires the name of the key (or an array of names if more than one). I have also flagged it as transparent, so the player can see what is inside even when it is closed.

createItem("glass_cabinet", CONTAINER(true), LOCKED_WITH("cabinet_key"), {
  examine:"A cabinet with a glass front.",
  loc:"lounge",
  transparent:true,
})

You can use the KEY template for the key, though behind the scenes it does nothing more than the TAKEABLE template except give the item a key icon.

createItem("cabinet_key", KEY(), { 
  loc:"garage",
  examine: "A small brass key."
})

Locked door

So now, about that door... We need an object that is in two rooms, and when locked or unlocked it changes exits in both rooms. Fortunately, Quest 6 has a template that does all that for us.

So here is a key and a door:

createItem("garage_door", LOCKED_DOOR("garage_key", "kitchen", "garage"), {
  examine: "The door to the garage.",
})

createItem("garage_key", KEY(), {
  loc:"lounge",
  examine: "A big key.",
})

Behind the scenes, the door has both the OPENABLE and LOCKED_WITH templates, plus more inside the LOCKED_DOOR template. This requires the name of the key (or an array of names), followed by the name of the two locations. You can also give two aliases (one from each room) if you choose.

The door object must be after the rooms in your file (and obviously you need exits from the rooms to each other). By default the door is scenery.

Continued in Commands...