!------------------------------------------------------------------------------
! demonstration of 'scenery description' implementation
!
! change log
!
! 950118  r1  first version
! 960215  r2  second version;  after examining a scenery object, `it' now
!             appears to refer to the object;  also the `that's just
!             scenery' message (RDB_SCENERY_PE) has the same priority as
!             `that's not something you need to refer to ...' (SCENERY_PE)
!             when complaining.
!------------------------------------------------------------------------------

Switches dexv5;

Constant Story "A SCENIC VIEW";
Constant Headline "^A demo of object-less `scenery descriptions'^\
             by Richard Barnett.^";
Release 2;

Global  specWord;

Replace CantSee;
Constant RDB_SCENERY_PE 100;    ! to indicate reference to a scenery non-obj

#include "Parser";
#include "VerbLib";

Property  sceneDesc $ffff;

!==============================================================================
! action routines
!==============================================================================

Object  ScDescDummyObj "scDescDummy",
  with  description 
        [;  ! print description of the scenery
            print (string) self.number; new_line; rtrue;
        ],
        short_name
        [;  ! print correct name for the rare cases (pronouns, (taking the
            ! ... first)) when we need the short name
            if (self.n_to ~= 0) { print (address) self.n_to; rtrue; }
        ],
        before
        [;  ! allow Examine actions to pass, but stop all other actions &
            ! print an appropriate message
            Examine: rfalse;
            default: "That's just scenery.";
        ],
        n_to 0,     ! stores addr of dict word naming scenery last examined
        number 0,   ! stores addr of string describing scenery last examined
        found_in
        [; rtrue; ],    ! found everywhere so always in scope (if it's light)
   has  concealed;

[ GetScDescAddr loc spWord addr len i;
    addr = loc.&sceneDesc;
    len = loc.#sceneDesc;
    if (addr-->0 == $ffff)
        ! no sceneDesc property, so return 0
        return 0;
    for (i = 0 : i < (len / 2) : i = i + 2)
        if (spWord == addr-->i)
            ! found spWord, so return addr of its description string
            return addr-->(i + 1);
    ! not found;  return 0
    return 0;
];

[ AnyWord w;
    w = NextWord();
    if (w ~= -1)
    {
        specWord = w;
        return 0;
    }
    return -1;
];

[ SceneDescSub addr;
    addr = GetScDescAddr(location, specWord);
    if (addr == 0)
    {
      if ((location has visited)
             && Refers(location, specWord)==1)
        "That's not something you need to refer to in the course of \
         this game.";
      "You can't see any such thing.";
    }
    ! set itobj so that `x it' or `get it' etc now work
    itobj = ScDescDummyObj;
    ! store addrs of dict word naming scenery & string describing it in
    ! ScDescDummyObj 
    itobj.number = addr;
    itobj.n_to = specWord;
    ! print the description
    print (string) addr;
    new_line;
    return 0;
];

[ CantSee  i w e;
    saved_oops=oops_from;

    if (scope_token~=0) { scope_error = scope_token; return ASKSCOPE_PE; }

    wn--; w=NextWord();
    e=CANTSEE_PE;
    if (w==vague_word) e=ITGONE_PE;
    i=parent(actor);
    if (i has visited && Refers(i,w)==1) e=SCENERY_PE;
    ! is it an attempt to refer to a scenery non-obj?
    if (GetScDescAddr(i,w) ~= 0) e=RDB_SCENERY_PE;
    if (etype>e) return etype;
    ! RDB_SCENERY_PE should have the same priority as SCENERY_PE; since
    ! it's numerically greater, use this test.
    if ((e == RDB_SCENERY_PE) && (etype > SCENERY_PE)) return etype;
    return e;
];

[ ParserError eType;
    if (eType == RDB_SCENERY_PE)
      "That's just scenery.";
    return 0;
];

!==============================================================================
! objects
!==============================================================================

Object  outerSwamp "Swamp"
  with  description "Swathes of rushes grow at the edge of the swamp;  behind \
                     them rise the tall trees which form the verdant canopy \
                     over the marsh's mud.",
        name "swamp" "bog" "marsh",
        found_in sRockOutcrop nRockOutcrop,
   has  scenery;

!==============================================================================

Object  sRockOutcrop "South end of rock outcrop"
  with  description "You stand at the lower end of a bare rock outcrop \
                     situated where a dismal region of swamp meets the sea;  \
                     it rises to a flat peak to the northeast.  The stone \
                     underfoot is pale and unweathered, supporting no plant \
                     life, but there's a dark shape some way up the slope.  \
                     The ocean and a small beach are to the south, while the \
                     swamp thins a bit at the north end of the crag.",
        n_to nRockOutcrop,
        s_to rockBeach,
        ne_to caveMouth,
        u_to caveMouth,
        sceneDesc 'tree'    "Straight-trunked and inaccessible."
                  'mud'     "It's slimy, dark and malodorous."
                  'rushes'  "They're home to insects and swamp birds.",
        name "peak",
   has  light;

!==============================================================================

Object  rockBeach "Rock beach"
  with  description "The ridge to the north forms a rock beach here as it \
                     slopes gently down into the peaceful ocean.",
        n_to sRockOutcrop,
        sceneDesc 'ocean' "Currently calm, it reflects the overcast sky."
                  'water' "It's clear, except where the gentle waves stir up \
                           some silt.",
   has  light;

!==============================================================================

Object  nRockOutcrop "North end of rock outcrop"
  with  description "The rock ridge thrusts out of the vaporous swamp, with \
                     sheer drops of several meters down to the semi-solid \
                     surface.  To the northwest, the swamp is somewhat \
                     thinner and there appears to be some solid ground:  a \
                     path winds into the trees, and you could climb down to \
                     it without much difficulty.  You can still see the dark \
                     shape upslope and to the southeast, and wonder whether \
                     it's a cave.",
        s_to sRockOutcrop,
        se_to caveMouth,
        u_to caveMouth,
        nw_to "The humidity and heat in the swamp would play havoc with your \
	       chest condition.",
        d_to "The humidity and heat in the swamp would play havoc with your \
	       chest condition.",
   has  light;

!==============================================================================

Object  caveMouth "Near a cave mouth"
  with  description "The ridge rises another ten metres or so above you, but \
                     there are no obvious foot- or handholds for the first \
                     five;  you can't really get much higher.  Nevertheless, \
                     the view is expansive if not very impressive:  a dark \
                     spire pokes out of the swamp to the north;  a wide river \
                     flows through the swamps and joins the sea to the east, \
                     and there are a few rocky islands to be seen in the \
                     ocean.  The dark shape you saw earlier is, as has been \
                     evident for some time, a small cave mouth.  The best \
                     routes back down are to the north- and southwest.",
        nw_to nRockOutcrop,
        d_to nRockOutcrop,
        sw_to sRockOutcrop,
        in_to "Claustrophobia is a cruel affliction;  perhaps someday a cure \
	       will come to light.",
	sceneDesc 'spire' "Tall and slender; at its tip is something which \
			   catches the sunlight."
		  'river' "Its waters are a bilious yellow."
		  'ocean' "The yellow taint of the river's flow extends out \
			   towards one of the islands:  evidence of a strong \
			   current."
		  'islands' "Wind and wave have carved them into uncanny \
			     configurations.",
   has  light;

!==============================================================================

[ Initialise;
    location = sRockOutcrop;
    print "^^You awaken, and find yourself somewhere scenic...^^";
];

!==============================================================================

#include "Grammar";

Extend "examine" last
                 * AnyWord                 -> SceneDesc;
Extend "look" last
              * "at" AnyWord               -> SceneDesc;

end;
