Skip to content

Dynamic Room Descriptions

ThePix edited this page Jun 24, 2022 · 3 revisions

As the player moves through your game world, she is going to change it, and your room descriptions should change to reflect that.

Scenery Objects

The simplest example is when the player picks up an item flagged as scenery. And the simplest way to handle that is with a text processor directive that tests the scenery flag. Let us suppose a clock.

"The lounge is very fancy with an impressive fire. On the mantelpiece you can see {if:clock:scenery:a carriage clock and }two silver candlesticks."

When the clock is picked up, the scenery flag is automatically turned off, and so the clock disappears from the room description. If the clock is put down, it will be handled as a normal item, in the list of items here.

Objects that could be anywhere

Suppose the player can open a magic portal; this could be in any room, but obviously needs to be part of the description. How can we handle that without having to modify every room description?

The trick is to modify the room template is settings.js. Here is an example. The new bit is {roomDescExtra} in the third line.

settings.roomTemplate = [
  "#{cap:{hereName}}",
  "{terse:{hereDesc}{roomDescExtra}}",
  "{objectsHere:You can see {objects} here.}",
  "{ifNot:settings:playMode:play:{ifExists:currentLocation:todo:{class:todo:{show:currentLocation:todo}}}}",
]

Now every room description will have the roomDescExtra directive appended. We just need to create that; it should go in code.js.

tp.addDirective("roomDescExtra", function(arr, params) {
  let s = ''
  if (w.magic_portal.loc === currentLocation.name) {
    s += " There is a magic portal here."
  }
  return s
})

This can be readily extended to allow for all sorts of changes to your locations.

Global changes

If you want your game to reflect changes across the world, you can change settings.getLocationDescriptionAttName. By default, Quest uses the locations "desc" attribute to give the description, however the built-in settings.getLocationDescriptionAttName first checks if game.dark is true, and if it is tells Quest to use "darkDesc" instead.

You can include your custom version to tell Quest to use different descriptions, depending on the game state. This example checks to see if player.apocalypse is true. If it is - and the location has the right attribute - it tells Quest to use "apocDesc" for the desciption.

settings.getLocationDescriptionAttName = function() {
  return player.apocalypse && currentLocation.apocDesc ? "apocDesc" : "desc"
}

As for a normal "desc" attribute, the "apocDesc" on your locations could be either a string or a function that returns a string, and is optional; it will just use the normal "desc" attribute if there is no "apocDesc".

createRoom("back_room", {
  desc:'A large room with straw scattered across the floor. The only exit is west',
  apocDesc:'A large room with writhing worms all across the floor, and ichor dropping from the walls. The only exit is west',
  west:new Exit('great_hall'),
})

You could have several different alternative descriptions, perhaps reflecting the weather or time of day day or something else. Bear in mind that if you use "darkDesc" you also need to allow for that.

Tutorial

QuestJS Basics

The Text Processor

Commands

Templates for Items

See also:

Handing NPCs

The User Experience (UI)

The main screen

The Side Panes

Multi-media (sounds, images, maps, etc.)

Dialogue boxes

Other Elements

Role-playing Games

Web Basics

How-to

Time

Items

Locations

Exits

Meta

Meta: About The Whole Game

Releasing Your Game

Reference

Clone this wiki locally