# Attributes

Attributes are a set of qualities that an item either has or hasnt. An item can have none of the possible attributes, all of the possible attributes, or any combination in between. Initial attributes are given to an object in its definition using the keyword has (see the chapter Definitions in Detail), while they are given and taken away during the course of the game using the ensure command. Many of the attributes do not have any pre-determined purpose and may be used by the author at will. The best way to determine the full effect of any given attribute is to search for it in the verbs.library file.

## The ENSURE Command

The ensure command is used to change which attributes an item has and uses the following syntax:

    ensure Item has/hasnt Attribute

There is nothing really tricky about the ensure command. You are either giving an item an attribute with a command like:

    ensure dungeon has DARK

or taking an attribute away from an item with a command like:

    ensure lantern hasnt LUMINOUS

## Object Attributes

Below is a list of the attributes that can be given to an object, and some brief notes on each.

Attribute | Description
--- | ---
CLOSED | If an object has the attribute CLOSED, its contents will not be accessible to the player.
LOCKED | If an object has the attribute LOCKED, it cannot be opened or closed by the player.
DEAD | An object that has the attribute DEAD must also have the attribute ANIMATE. A DEAD object may not be killed, talked to, shown things or given things.
IGNITABLE | An object that has the attribute IGNITABLE may be used to light an object that has the object FLAMMABLE.
WORN | An object that has the attribute WORN will not burden the player with its mass. In order to wear an object it must also have the attribute WEARABLE. While an object has the WORN attribute, the player will not be able to drop it or give it away.
CONCEALING | An object that has the attribute CONCEALING must also have the attribute ANIMATE. This attribute indicates that when the object is examined, the objects that it is carrying should not be listed.
LUMINOUS | When it is present, an object that has the attribute LUMINOUS will allow the player to enter a location that has the attribute DARK.
WEARABLE | The player may wear an object that has the attribute WEARABLE.
CLOSABLE | An object that has the attribute CLOSABLE may be opened and closed by the player.
LOCKABLE | An object that has the attribute LOCKABLE may be locked and unlocked by the player.
ANIMATE | An object that has the attribute ANIMATE may be killed, talked to, shown things or given things.
LIQUID | An object that has the attribute LIQUID must be carried within an object that has the attribute CONTAINER and may be drunk or poured by the player.
CONTAINER | An object that has the attribute CONTAINER may have other objects put inside it. If it also has CLOSABLE it must not have CLOSED for the player to put things in it. A container may hold as many mass units as its capacity element is set to.
SURFACE | An object that has the attribute SURFACE may have things placed on top of it. A surface may hold as many mass units as its capacity element is set to.
PLURAL | If an object is defined with a plural name, it should be given the attribute PLURAL so the library will avoid printing sentences such as "The boulders is too heavy to go throwing around."
FLAMMABLE | An object that has the attribute FLAMMABLE may be lit using an object that has the attribute IGNITABLE.
BURNING | When an object that has the attribute FLAMMABLE is lit, it will be given the attributes BURNING and LUMINOUS.
ON | Free for use by the author.
DAMAGED | Free for use by the author.
FEMALE | This attribute should be given to any object that has the attribute ANIMATE and represents a female character. This will enable the library to refer to the character correctly.
POSSESSIVE | If an object has the attributes ANIMATE and POSSESSIVE the player will not be able to take objects from them or ask them for objects unless specifically coded for.
OUT_OF_REACH | An object that has the attribute OUT_OF_REACH cannot be touched, even when it is in the same location as the player.
TOUCHED | An object that has the attribute TOUCHED has been moved from its starting position by the player. If the object's long property is set to function, this attribute can be tested to give an appropriate description.
SCORED | Free for use by the author.
SITTING | If the player is currently sitting, this attribute should be given, as the function +movement will check if it is set before moving the player.
NO_TAB | This attribute indicates that the object's names should not be included during tab completion. Tab completion is only used by the console interpreter.
NOT_IMPORTANT | This attribute is given to an object that is of no consequence game. It is usually used to implement nouns that are referred to in a location description but are not part of the game world the player needs to interact with. Verbs in the library will respond with You don't need to worry about that. when the player attempts to interact with an object that has this attribute.

## Location Attributes

Below is a list of the attributes that can be given to a location, and some brief notes on each.

Attribute | Description
--- | ---

VISITED
MAPPED

When the player enters a location, it is automatically given the attributes VISITED and MAPPED after the lookfunction is run. These attributes may be tested for to provide a shorter description on subsequent visits. When the JACL interpreter is set to verbose mode (the DISPLAY_MODE variable is set to 1), locations will have the attribute VISITED taken away from them before the look function is executed.

DARK | If a location has the attribute DARK, the player must be carrying an object that has the attribute LUMINOUS in order to enter it.
DARKNESS | If the player's current location has the attribute DARK and no object with the attribute LUMINOUS is present, the location will be given the attribute DARKNESS and the player will be prevented from performing any actions that require the ability to see. You should never manually give or take the attribute DARKNESS to or from a location, only the attribute DARK.
ON_WATER | If a location has the attribute ON_WATER, any object dropped will sink out of sight and end up in limbo.
UNDER_WATER | If a location has the attribute UNDER_WATER, nothing may be lit, exposed liquids will dissipate and no talking is possible.
WITHOUT_AIR | If a location has the attribute WITHOUT_AIR, the OXYGEN_LEFT variable will be decremented each turn until it reaches zero and suffocation occurs.
OUTDOORS | If a location has the attribute OUTDOORS, any desired effects of weather should be applied.
MID_AIR | If a location has the attribute MID_AIR, any object dropped will fall out of sight and end up in limbo. Actions such as jumping will not be allowed either.
MID_WATER | If a location has the attribute MID_WATER any object dropped will sink out of sight and end up in limbo.
TIGHT_ROPE | If a location has the attribute TIGHT_ROPE, any object dropped will fall out of sight and end up in limbo.
POLLUTED | Free for use by the author.
SOLVED | Free for use by the author.
LOCATION | All locations have the attribute LOCATION. If this is taken away the location will become an object.
SCORED | Free for use by the author.
NO_TAB | This attribute indicates that the location's names should not be included during tab completion. Tab completion is only used by the console interpreter.
NOT_IMPORTANT | This attribute is given to a location that is of no consequence game. It is usually used to implement nouns that are referred to in a location description but are not part of the game world the player needs to interact with. Verbs in the library will respond with You don't need to worry about that. when the player attempts to interact with an object that has this attribute.

## User Attributes

A common use of attributes is to check if an action has already been performed. This may be useful if it is not logically possible to perform the action twice, or each subsequent attempt would result in a different outcome. Another possibility is that you would like to give a lengthy response the first time, then a short response on all subsequent times. To help facilitate this, and many other types of game-specific behaviour, JACL allows you to define up to 32 user attributes. User attributes are defined using the attribute directive followed by one or more attribute names. Below is a rather minimal example of using user attributes:

    attribute DOOR_OPENED

    {open_override
    ensure door hasnt CLOSED
    if door hasnt DOOR_OPENED
       write "You hold your breath as the door slowly "
       write "creaks open.^"
       ensure door has DOOR_OPENED
       return
    endif
    write "You open the door again.^"
    }

The above code creates a user attributes called DOOR_OPENED and gives the object door that attribute when it is first opened. It also tests whether the door already has this attribute before deciding which message to display.

Back to Contents