# en_us.h | documentation

    #charset "us-ascii"

    /*
     *   Copyright (c) 2000, 2006 Michael J. Roberts.  All Rights Reserved.
     *
     *   TADS 3 Library - US English header
     *
     *   This file defines common properties, macros, and other identifiers used
     *   throughout the US English modules of the TADS 3 library.
     */

    /* ------------------------------------------------------------------------ */
    /*
     *   Vocabulary properties for parts of speech we use in the English parser.
     *
     *   These properties are defined in the English-specific header because
     *   other languages might classify their parts of speech differently; for
     *   example, a French parser might distinguish nouns according to gender,
     *   and thus require masculineNoun and feminineNoun properties instead of a
     *   single noun property.
     *
     *   adjApostS is a special adjective form for adjectives that are
     *   explicitly defined in vocabulary with a "'s" suffix.  In most cases,
     *   it's not necessary to explicitly define possessive words explicitly in
     *   an object's vocabulary, because the parser's possessive qualifier
     *   phrase grammar allows any valid noun phrase to be used in a 's
     *   possessive form to indicate ownership.  However, this only works when
     *   ownership is actually modeled in the game; that is, this only works
     *   when one object has an ownership relation with another object, using
     *   the owner/isOwnedBy mechanism in Thing.  Sometimes, a possessive word
     *   is just a literal part of an object's name, and the nominal owner
     *   doesn't actually exist as an object in the game: "Mom's Old-Fashioned
     *   Robot Oil," for example.  In these cases, the object can include the
     *   possessive word *without* the 's suffix ("Mom") as a vocabulary word
     *   for the object, using the adjApostS property.
     *
     *   A literalAdjective is like an adjective, but behaves a little
     *   differently in the grammar.  A literal adjective can be optionally
     *   enclosed in quotes (for example, we could refer to an elevator button
     *   labeled "G" as "'G' button" or simply "G button").  In addition, a
     *   literal adjective can be placed after the noun it modifies (hence
     *   "button 'G'" or "button G").
     */
    dictionary property noun, adjective, plural, adjApostS, literalAdjective;

    /*
     *   Numeric parts of speech:
     *
     *   digitWord - a name for a digit (zero through nine)
     *
     *   teenWord - a name for a 'teen' (ten through nineteen) - we distinguish
     *   these because there's no general grammatical rule for constructing
     *   names for these numbers out of smaller lexical units.  We include ten
     *   in this set, rather than in the teenWord set, because ten cannot be
     *   combined with digit words to form other numbers.
     *
     *   tensWord - a name for a multiple of ten (twenty, thirty, ..., ninety).
     *   The words in this set can be used to construct the numbers from 20 to
     *   99 by combining them with digit words using a hyphen (as in
     *   "twenty-two").
     *
     *   ordinalWord - an ordinal, such as '1st' or 'first'.
     */
    dictionary property digitWord, teenWord, tensWord;
    dictionary property ordinalWord;

    /* ------------------------------------------------------------------------ */
    /*
     *   Templates for the basic vocabulary object
     */
    VocabObject template 'vocabWords';

    /*
     *   Define some templates that apply to ordinary objects (descendants of
     *   Thing).
     */
    Thing template 'vocabWords' 'name' @location? "desc"?;

    /*
     *   For rooms, we normally have no vocabulary words, but we do have a name
     *   and description, and optionally a "destination name" to use to describe
     *   connectors from adjoining rooms.
     */
    Room template 'roomName' 'destName'? 'name'? "desc"?;

    /*
     *   For actors, we generally override the npcDesc or pcDesc rather than the
     *   base desc.  For the standard templates, set the npcDesc, since most
     *   actors are NPC's rather than the player character.
     */
    Actor template 'vocabWords' 'name' @location? "npcDesc";

    /*
     *   For passages, allow special syntax to point to the master side of the
     *   passage.
     */
    Passage template ->masterObject inherited;

    /*
     *   For one-way room connectors, provide special syntax to point to the
     *   destination room.
     */
    OneWayRoomConnector template ->destination;

    /*
     *   For enterables, allow special syntax to point to the connector which an
     *   actor uses to traverse into the enterable.
     */
    Enterable template ->connector inherited;
    Exitable template ->connector inherited;

    /*
     *   For TravelMessage connectors, provide special syntax to specify the
     *   message and point to the destination.
     */
    TravelMessage template ->destination "travelDesc" | [eventList];

    /*
     *   For connectors that don't go anywhere but do show a message on a travel
     *   attempt, we just need to specify the travel message.
     */
    NoTravelMessage template "travelDesc" | [eventList];
    DeadEndConnector template 'apparentDestName'? "travelDesc" | [eventList];

    /*
     *   Unthings are defined pretty much like Things, except they have no use
     *   for a desc, and frequently want a custom notHereMsg.
     */
    Unthing template 'vocabWords' 'name' @location? 'notHereMsg'?;

    /* ThingState objects */
    ThingState template 'listName_' +listingOrder?;

    /* ------------------------------------------------------------------------ */
    /*
     *   Convenience macros for defining command grammar.
     *
     *   A command's grammar is defined via a 'grammar' rule definition for the
     *   'predicate' production; the VerbRule macro can be used for better
     *   readability.
     *
     *   Within a command grammar rule, there are several commonly-used object
     *   roles assigned to single-noun or noun-list phrases.  We provide the
     *   singleDobj, dobjList, singleIobj, and iobjList macros to make these
     *   assignments more readable.  In addition, number, topic, literal, and
     *   direction phrases can be assigned with singleNumber, singleTopic,
     *   singleLiteral, and singleDir, respectively.
     */

    #define VerbRule(tag)  grammar predicate(tag):
    #define singleDobj     singleNoun->dobjMatch
    #define singleIobj     singleNoun->iobjMatch
    #define dobjList       nounList->dobjMatch
    #define iobjList       nounList->iobjMatch
    #define singleNumber   numberPhrase->numMatch
    #define singleTopic    topicPhrase->topicMatch
    #define singleLiteral  literalPhrase->literalMatch
    #define singleDir      directionName->dirMatch

    /* ------------------------------------------------------------------------ */
    /*
     *   Convenience macros for controlling the narrative tense.
     */

    /*
     *   Set the current narrative tense.  Use val = true for past and
     *   val = nil for present.
     */
    #define setPastTense(val) (gameMain.usePastTense = (val))

    /*
     *   Shorthand macro for selecting one of two values depending on the
     *   current narrative tense.
     */
    #define tSel(presVal, pastVal) \
        (gameMain.usePastTense ? (pastVal) : (presVal))

    /*
     *   Temporarily override the current narrative tense and invoke a callback
     *   function.
     */
    #define withPresent(callback) (withTense(nil, (callback)))
    #define withPast(callback)    (withTense(true, (callback)))

TADS 3 Library Manual
Generated on 5/16/2013 from TADS version 3.1.3