Constant Story "RUINS";
Constant Headline "^An Interactive Worked Example^
                   Copyright (c) 1999 by Angela M. Horns.^";

! ---------------------------------------------------------------------------- !
!       This version recreated by Roger Firth in May 2001, using the simple
!       (albeit time-consuming) process of combining the various fragments
!       of "Ruins" quoted in Edition 4/1 of the Inform Designer's Manual.
!
!                       PLAYER
!                             lamp,dictionary,map
!                       GREAT PLAZA
!                           | mushroom,packing-case,camera,newspaper,steps
!                           |
!                           |
!                       SQUARE CHAMBER -------------------- WORMCAST
!                           | inscriptions,sunlight,(key)         eggsac
!                           |
!                           |
!                       STOOPED CORRIDOR
!                           | statuette,door
!                           |
!                           |
!   UPPER CANYON        SHRINE
!       | ball           /     \ paintings,altar,mask,(priest)
!       |     ----------         ----------
!       |   /                               \
!   XIBALBA                                 ANTECHAMBER
!       | stela                                 | cage,skeletons,(warthog)
!       |                                       |
!       |                                       |
!   LOWER CANYON                            BURIAL SHAFT
!       | chasm                                   honeycomb
!       |
!       |
!   PUMICE LEDGE
!         bone
!
! ---------------------------------------------------------------------------- !

Constant MAX_CARRIED = 7;       ! Defined in DM4 $22
Constant MAX_SCORE = 30;        ! Defined in DM4 $22

Include "Parser";
Include "VerbLib";

! ---------------------------------------------------------------------------- !
!       The TREASURE class definition.
!
!       Defined in DM4 $5, modified in $23
Class   Treasure
 with  before [;
           Take, Remove:
               if (self in packing_case)
                   "Unpacking such a priceless artifact had best wait until
                    the Carnegie Institution can do it.";
               if (self.photographed_in_situ == false)
                   "This is the 1930s, not the bad old days. Taking an
                    artifact without recording its context is simply looting.";
           Photograph:
               if (self has moved) "What, and fake the archaeological record?";
               if (self.photographed_in_situ) "Not again.";
           ],
       after [;
           Insert:
               if (second == packing_case) {
                   score = score + self.cultural_value;
                   if (score == MAX_SCORE) {
                       deadflag = 2;
                       print_ret "As you carefully pack away ",
                                 (the) noun,
                                 " a red-tailed macaw flutters down from the
                                  tree-tops, feathers heavy in the recent rain,
                                  the sound of its beating wings almost
                                  deafening, stone falling against stone...
                                  As the skies clear, a crescent moon rises
                                  above a peaceful jungle. It is the end of
                                  March, 1938, and it is time to go home.";
                       }
                   "Safely packed away.";
                   }
           Photograph:
               self.photographed_in_situ = true;
           ],
       cultural_value 5,
       photographed_in_situ false;

! ---------------------------------------------------------------------------- !
!       The game beings in the GRAND PLAZA.
!
!       Defined in DM4 $4, modified in $8, $9 and $23
Object  Forest "~Great Plaza~"
 with  description
           "Or so your notes call this low escarpment of limestone, but the
            rainforest has claimed it back. Dark olive trees crowd in on all
            sides, the air steams with the mist of a warm recent rain, midges
            hang in the air. ~Structure 10~ is a shambles of masonry which
            might once have been a burial pyramid, and little survives
            except stone-cut steps leading down into darkness below.",
       d_to steps,
       in_to steps,
       u_to
           "The trees are spiny and you'd cut your hands to ribbons
            trying to climb them.",
       cant_go
           "The rainforest is dense, and you haven't hacked through it for days
            to abandon your discovery now. Really, you need a good few
            artifacts to take back to civilization before you can justify
            giving up the expedition.",
       before [; Listen: "Howler monkeys, bats, parrots, macaw."; ],
 has   light;

!       Defined in DM4 $4, modified in Exercise 1 and $23
Object  -> mushroom "speckled mushroom"
 with  name 'speckled' 'mushroom' 'fungus' 'toadstool',
       initial
           "A speckled mushroom grows out of the sodden earth, on
            a long stalk.",
       description
           "The mushroom is capped with blotches, and you aren't
            at all sure it's not a toadstool.",
       after [;
           Take:
               if (self.mushroom_picked)
                   "You pick up the slowly-disintegrating mushroom.";
               self.mushroom_picked = true;
               "You pick the mushroom, neatly cleaving its thin stalk.";
           Drop:
               "The mushroom drops to the ground, battered slightly.";
           Eat:
               steps.rubble_filled = false;
               "You nibble at one corner, unable to trace the source of an
                acrid taste, distracted by the flight of a macaw overhead
                which seems to burst out of the sun, the sound of the beating
                of its wings almost deafening, stone falling against stone.";
           ],
       mushroom_picked false,
 has   edible;

!       Defined in DM4 $12
Object  -> packing_case "packing case"
 with  name 'packing' 'case' 'box' 'strongbox',
       initial
           "Your packing case rests here, ready to hold any important
            cultural finds you might make, for shipping back to civilisation.",
       before [;
           Take, Remove, PushDir:
               "The case is too heavy to bother moving, as long as your
                expedition is still incomplete.";
           ],
 has   static container open openable;

!       Defined in DM4 $6
Object  -> -> camera "wet-plate camera"
 with  name 'wet-plate' 'plate' 'wet' 'camera',
       description
           "A cumbersome, sturdy, stubborn wooden-framed wet plate
            model: like all archaeologists, you have a love-hate
            relationship with your camera.";

!       Defined in DM4 $23
Object  -> -> newspaper "month-old newspaper"
 with  name 'times' 'newspaper' 'paper' 'month-old' 'old',
       description
           "~The Times~ for 26 February, 1938, at once damp and brittle
            after a month's exposure to the climate, which is much the way you
            feel yourself. Perhaps there is fog in London.
            Perhaps there are bombs.";

!       Defined in DM4 $4, modified in $5 and $23
Object  -> steps "stone-cut steps"
 with  name 'steps' 'stone' 'stairs' 'stone-cut' 'pyramid' 'burial'
            'structure' 'ten' '10',
       description [;
           if (self.rubble_filled)
               "Rubble blocks the way after only a few steps.";
           print "The cracked and worn steps descend into a dim
                  chamber. Yours might ";
           if (Square_Chamber hasnt visited)
               print "be the first feet to tread";
           else
               print "have been the first feet to have trodden";
           " them for five hundred years. On the top step is
            inscribed the glyph Q1.";
           ],
       door_to [;
           if (self.rubble_filled)
               "Rubble blocks the way after only a few steps.";
           return Square_Chamber;
           ],
       door_dir d_to,
       rubble_filled true,
 has   scenery door open;

! ---------------------------------------------------------------------------- !
!       The SQUARE CHAMBER.
!
!       Defined in DM4 Exercise 2, modified in $8 and $9
Object  Square_Chamber "Square Chamber"
 with  name 'lintelled' 'lintel' 'lintels' 'east' 'south' 'doorways',
       description
           "A sunken, gloomy stone chamber, ten yards across. A shaft of
            sunlight cuts in from the steps above, giving the chamber a
            diffuse light, but in the shadows low lintelled doorways to
            east and south lead into the deeper darkness of the Temple.",
       u_to Forest,
       e_to Wormcast,
       s_to Corridor,
       before [;
           Insert:
               if (noun == eggsac && second == sunlight) {
                   remove eggsac;
                   move stone_key to self;
                   "You drop the eggsac into the glare of the shaft of
                    sunlight. It bubbles obscenely, distends and then bursts
                    into a hundred tiny insects which run in all directions
                    into the darkness. Only spatters of slime and a curious
                    yellow-stone key remain on the chamber floor.";
                   }
           ],
 has   light;

!       Defined in DM4 $8
Object  -> "carved inscriptions"
 with  name 'carved' 'inscriptions' 'carvings' 'marks' 'markings' 'symbols'
            'moving' 'scuttling' 'crowd' 'of',
       initial
           "Carved inscriptions crowd the walls, floor and ceiling.",
       description
           "Each time you look at the carvings closely, they seem to be still.
            But you have the uneasy feeling when you look away that they're
            scuttling, moving about.
            Two glyphs are prominent: Arrow and Circle.",
 has   static pluralname;

!       Defined in DM4 $8
Object  -> sunlight "shaft of sunlight"
 with  name 'shaft' 'of' 'sunlight' 'sun' 'light' 'beam' 'sunbeam'
            'ray' 'rays' 'sun^s' 'sunlit' 'air' 'motes' 'dust',
       description
           "Motes of dust glimmer in the shaft of sunlit air, so that it seems
            almost solid.",
       before [;
           Examine, Search:
               ;
           default:
               "It's only an insubstantial shaft of sunlight.";
           ],
 has   scenery;

! ---------------------------------------------------------------------------- !
!       The STOOPED CORRIDOR.
!
!       Defined in DM4 $13
Object  Corridor "Stooped Corridor"
 with  description
           "A low, square-cut corridor, running north to south,
            stooping you over.",
       n_to Square_Chamber,
       s_to StoneDoor;

!       Defined in DM4 $5
Treasure -> statuette "pygmy statuette"
 with  name 'snake' 'mayan' 'pygmy' 'spirit' 'precious' 'statuette',
       initial
           "A precious Mayan statuette rests here!",
       description
           "A menacing, almost cartoon-like statuette of a pygmy spirit
            with a snake around its neck.";

!       Defined in DM4 $13
Object  -> StoneDoor "stone door"
 with  name 'door' 'massive' 'big' 'stone' 'yellow',
       description
           "It's just a big stone door.",
       when_closed
           "The passage is barred by a massive door of yellow stone.",
       when_open
           "The great yellow stone door is open.",
       door_to [; if (self in Corridor) return Shrine; return Corridor; ],
       door_dir [; if (self in Shrine) return n_to; return s_to; ],
       with_key stone_key,
       found_in Corridor Shrine,
 has   static door openable lockable locked;

! ---------------------------------------------------------------------------- !
!       The SHRINE.
!
!       Defined in DM4 $23
Object  Shrine "Shrine"
 with  description
           "This magnificent Shrine shows signs of being hollowed out from
            already-existing limestone caves, especially in the western of the
            two long eaves to the south.",
       n_to StoneDoor,
       se_to Antechamber,
       sw_to
           "The eaves taper out into a crevice which would wind further if it
            weren't jammed tight with icicles. The glyph of the Crescent is
            not quite obscured by ice.";

!       Defined in DM4 $23
Object  -> paintings "paintings"
 with  name 'painting' 'paintings' 'lord' 'captive',
       initial
           "Vividly busy paintings, of the armoured Lord trampling on a
            captive, are almost too bright to look at, the graffiti of an
            organised mob.",
       description
           "The flesh on the bodies is blood-red. The markers of the Long Count
            date the event to 10 baktun 4 katun 0 tun 0 uinal 0 kin, the sort
            of anniversary when one Lord would finally decapitate a captured
            rival who had been ritually tortured over a period of some years,
            in the Balkanised insanity of the Maya city states.",
 has   static;

!       Defined in DM4 $12 and $15
Object  -> stone_table "slab altar"
 with  name 'stone' 'table' 'slab' 'altar' 'great',
       initial
           "A great stone slab of a table, or altar, dominates the Shrine.",
 has   enterable supporter static;

!       Defined in DM4 $11
Treasure -> -> mask "jade mosaic face-mask"
 with  name 'jade' 'mosaic' 'face-mask' 'mask' 'face',
       initial
           "Resting on the altar is a jade mosaic face-mask.",
       description
           "How exquisite it would look in the Museum.",
       after [;
           Wear:
               move priest to Shrine;
               if (location == Shrine)
                   "Looking through the obsidian eyeslits of the mosaic mask,
                    a ghostly presence reveals itself: a mummified calendrical
                    priest, attending your word.";
           Disrobe:
               remove priest;
           ],
       cultural_value 10,
 has   clothing;

! ---------------------------------------------------------------------------- !
!       The UPPER/NORTH CANYON.
!
!       Defined in DM4 $23
Object  Canyon_N "Upper End of Canyon"
 with  description
           "The higher, broader northern end of the canyon rises only to an
            uneven wall of volcanic karst.",
       s_to Junction,
       d_to Junction,
 has   light;

!       Defined in DM4 $15, modified in Exercise 24 and $23
Object  -> huge_ball "huge pumice-stone ball"
 with  name 'huge' 'pumice' 'pumice-stone' 'stone' 'ball',
       initial
           "A huge pumice-stone ball rests here, eight feet wide.",
       description
           "A good eight feet across, though fairly lightweight.",
       before [;
           PushDir:
               if (location == Junction && second == ne_obj)
                   "The Shrine entrance is far less than eight feet wide.";
               AllowPushDir();
               rtrue;
           Pull, Push, Turn:
               "It wouldn't be so very hard to get rolling.";
           Take, Remove:
               "There's a lot of stone in an eight-foot sphere.";
           ],
       after [;
           PushDir:
               if (second == n_obj) "You strain to push the ball uphill.";
               if (second == u_obj) <<PushDir self n_obj>>;
               if (second == s_obj) "The ball is hard to stop once underway.";
               if (second == d_obj) <<PushDir self s_obj>>;
           ],
 has   static;

! ---------------------------------------------------------------------------- !
!       The XIBALBA/JUNCTION.

!       Defined in DM4 $23
Object  Junction "Xibalb@'a"
 with  description
           "Fifty metres beneath rainforest, and the sound of water is
            everywhere: these deep, eroded limestone caves extend like
            taproots. A slither northeast by a broad collapsed column of
            ice-covered rock leads back to the Shrine, while a kind of canyon
            floor extends uphill to the north and downwards to south,
            pale white like shark's teeth in the diffused light from the
            sodium lamp above.",
       ne_to Shrine,
       n_to Canyon_N,
       u_to Canyon_N,
       s_to Canyon_S,
       d_to Canyon_S,
has    light;

!       Defined in DM4 $23
Treasure -> stela "stela"
 with  name 'stela' 'boundary' 'stone' 'marker',
       initial
           "A modest-sized stela, or boundary stone, rests on a ledge
            at head height.",
       description
           "The carvings appear to warn that the boundary of Xibalb@'a,
            Place of Fright, is near. The Bird glyph is prominent.";

! ---------------------------------------------------------------------------- !
!       The LOWER/SOUTH CANYON.
!
!       Defined in DM4 $23
Object  Canyon_S "Lower End of Canyon"
 with  description
           "At the lower, and narrower, southern end, the canyon stops dead at
            a chasm of vertiginous blackness. Nothing can be seen or heard
            from below.",
       n_to Junction,
       u_to Junction,
       s_to "Into the chasm?",
       d_to nothing,
 has   light;

!       Defined in DM4 $12, modified in $21 and $23
Object  -> chasm "horrifying chasm"
 with  name 'blackness' 'chasm' 'pit' 'horrifying' 'bottomless',
       before [;
           Enter:
               deadflag = 3;
               "You plummet through the silent void of darkness, cracking
                your skull against an outcrop of rock. Amidst the pain and
                redness, you dimly make out the God with the Owl-Headdress...";
           JumpOver:
               "It's far too wide.";
           ],
       after [;
           Receive:
               remove noun;
               print_ret (The) noun,
                         " tumbles silently into the darkness of the chasm.";
           Search:
               "The chasm is deep and murky.";
           ],
       react_before [;
           Jump:
               <<Enter self>>;
           Go:
               if (noun == d_obj) <<Enter self>>;
           ],
       each_turn [;
           if (huge_ball in parent(self)) {
               remove huge_ball;
               Canyon_S.s_to = On_Ball;
               Canyon_S.description =
                   "The southern end of the canyon now continues onto the
                    pumice-stone ball, wedged into the chasm.";
               "^The pumice-stone ball rolls out of control down the last few
                feet of the canyon before shuddering into the jaws of the
                chasm, bouncing back a little and catching you a blow on the
                side of the forehead. You slump forward, bleeding, and...
                the pumice-stone shrinks, or else your hand grows, because you
                seem now to be holding it, staring at Alligator, son of
                seven-Macaw, across the ball-court of the Plaza, the heads of
                his last opponents impaled on spikes, a congregation baying
                for your blood, and there is nothing to do but to throw anyway,
                and... but this is all nonsense,
                and you have a splitting headache.";
               }
           ],
 has   scenery open container;

! ---------------------------------------------------------------------------- !
!       The PUMICE LEDGE.
!
!       Defined in DM4 $23
Object  On_Ball "Pumice-Stone Ledge"
 with  description
           "An impromptu ledge formed by the pumice-stone ball, wedged into
            place in the chasm. The canyon nevertheless ends here.",
       n_to Canyon_S,
       d_to Canyon_S,
       u_to Canyon_S,
 has   light;

!       Defined in DM4 $23
Treasure -> "incised bone"
 with  name 'incised' 'carved' 'bone',
       initial
           "Of all the sacrificial goods thrown into the chasm, perhaps
            nothing will be reclaimed: nothing but an incised bone, lighter
            than it looks, which projects from a pocket of wet silt in the
            canyon wall.",
       description
           "A hand holding a brush pen appears from the jaws of Itzamn@'a,
            inventor of writing, in his serpent form.";

! ---------------------------------------------------------------------------- !
!       The ANTECHAMBER.
!
!       Defined in DM4 $23
Object  Antechamber "Antechamber"
 with  description
           "The southeastern eaves of the Shrine make a curious antechamber.",
       nw_to Shrine;

!       Defined in DM4 Exercise 22, modified in Exercise 55
Object  -> cage "iron cage"
 with  name 'iron' 'cage' 'bars' 'barred' 'frame' 'glyphs',
       description
           "The glyphs read: Bird Arrow Warthog.",
       inside_description [;
           if (self.floor_open)
               "From the floor of the cage, an open earthen pit cuts
                down into the burial chamber.";
           "The bars of the cage surround you.";
           ],
       when_open
           "An iron-barred cage, large enough to stoop over inside, looms
            ominously here, its door open. There are some glyphs on the
            frame.",
       when_closed
           "The iron cage is closed.",
       after [;
           Enter:
               print "The skeletons inhabiting the cage come alive, locking
                      bony hands about you, crushing and pummelling. You lose
                      consciousness, and when you recover something grotesque
                      and impossible has occurred...^";
               move warthog to Antechamber;
               remove skeletons;
               give self ~open;
               give warthog light;
               self.after = 0;
               ChangePlayer(warthog, 1);
               <<Look>>;
           ],
       react_before [;
           Go:
               if (noun == d_obj && self.floor_open) {
                   PlayerTo(Burial_Shaft);
                   rtrue;
                   }
           ],
       floor_open false,
 has   enterable transparent container openable open static;

!       Defined in Exercise 55
Object  -> -> skeletons "skeletons"
 with  name 'skeletons' 'skeleton' 'bone' 'skull' 'bones' 'skulls',
       article "deranged",
 has   pluralname static;

! ---------------------------------------------------------------------------- !
!       The BURIAL SHAFT.
!
!       Defined in Exercise 55
Object  Burial_Shaft "Burial Shaft"
 with  description
           "In your eventual field notes, this will read:
            ~A corbel-vaulted crypt with an impacted earthen plug as seal
            above, and painted figures conjecturally representing the Nine
            Lords of the Night. Dispersed bones appear to be those of one
            elderly man and several child sacrifices, while other funerary
            remains include jaguar paws.~ (In field notes, it is essential
            not to give any sense of when you are scared witless.)",
       n_to Wormcast,
       u_to [;
           cage.floor_open = true;
           self.u_to = self.opened_u_to;
           move selfobj to self;
           print "Making a mighty warthog-leap, you butt at the earthen-plug
                  seal above the chamber, collapsing your world in ashes and
                  earth. Something lifeless and terribly heavy falls on top of
                  you: you lose consciousness, and when you recover, something
                  impossible and grotesque has happened...^";
           ChangePlayer(selfobj);
           give warthog ~light;
           <<Look>>;
           ],
       cant_go
           "The architects of this chamber were less than generous in
            providing exits. Some warthog seems to have burrowed in from the
            north, though.",
       before [; Jump: <<Go u_obj>>; ],
       opened_u_to [; PlayerTo(cage); rtrue; ],
 has   light;

!       Defined in DM4 $5
Treasure -> honeycomb "ancient honeycomb"
 with  name 'ancient' 'old' 'honey' 'honeycomb',
       article "an",
       initial
           "An exquisitely preserved, ancient honeycomb rests here!",
       description
           "Perhaps some kind of funerary votive offering.",
       after [;
           Eat:
               "Perhaps the most expensive meal of your life. The honey tastes
                odd, perhaps because it was used to store the entrails of the
                Lord buried here, but still like honey.";
           ],
 has   edible;

! ---------------------------------------------------------------------------- !
!       The WORMCAST.
!
!       Defined in DM4 Exercises 7 and 8, modified in Exercise 54
Object  Wormcast "Wormcast"
 with  description
           "A disturbed place of hollows carved like a spider's web, strands of
            empty space hanging in stone. The only burrows wide enough to crawl
            through begin by running northeast, south and upwards.",
       w_to Square_Chamber,
       s_to [;
           print "The wormcast becomes slippery around you, as though your
                  body-heat is melting long hardened resins, and you shut your
                  eyes tightly as you burrow through darkness.^";
           if (eggsac in player) return Square_Chamber;
           return random(Square_Chamber, Corridor, Forest);
           ],
       ne_to [; return self.s_to(); ],
       u_to [; return self.s_to(); ],
       cant_go [;
           if (player ~= warthog)
               "Though you begin to feel certain that something lies behind
                and through the wormcast, this way must be an animal-run at
                best: it's far too narrow for your armchair-archaeologist's
                paunch.";
           print "The wormcast becomes slippery around your warthog body, and
                  you squeal involuntarily as you burrow through the darkness,
                  falling finally southwards to...^";
           PlayerTo(Burial_Shaft);
           rtrue;
           ],
       after [;
           Drop:
               move noun to Square_Chamber;
               print_ret (The) noun,
                         " slips through one of the burrows and is quickly
                          lost from sight.";
           ],
 has   light;

!       Defined in DM4 $23
Object  -> eggsac "glistening white eggsac",
 with  name 'egg' 'sac' 'eggs' 'eggsac',
       initial
           "A glistening white eggsac, like a clump of frogspawn the size of a
            beach ball, has adhered itself to something in a crevice in one
            wall.",
       after [; Take: "Oh my."; ],
       react_before [;
           Go:
               if (location == Square_Chamber && noun == u_obj) {
                   deadflag = true;
                   "The moment that natural light falls upon the eggsac, it
                    bubbles obscenely and distends. Before you can throw it
                    away, it bursts into a hundred tiny, birth-hungry
                    insects...";
                   }
           ];

! ---------------------------------------------------------------------------- !
!       These objects are moved into place as the game proceeds.
!
!       Defined in DM4 $14, modified in $23
Object  sodium_lamp "sodium lamp"
 with  name 'sodium' 'lamp' 'heavy',
       describe [;
           if (self has on)
               "^The sodium lamp squats on the ground, burning away.";
           "^The sodium lamp squats heavily on the ground.";
           ],
       before [;
           Examine:
               print "It is a heavy-duty archaeologist's lamp, ";
               if (self hasnt on) "currently off.";
               if (self.battery_power < 10) "glowing a dim yellow.";
               "blazing with brilliant yellow light.";
           Burn:
               <<SwitchOn self>>;
           SwitchOn:
               if (self.battery_power <= 0)
                   "Unfortunately, the battery seems to be dead.";
               if (parent(self) hasnt supporter && self notin location)
                   "The lamp must be securely placed before being lit.";
           Take, Remove:
               if (self has on)
                   "The bulb's too delicate and the metal handle's too hot
                    to lift the lamp while it's switched on.";
           PushDir:
               if (location == Shrine && second == sw_obj)
                   "The nearest you can do is to push the sodium lamp to the
                    very lip of the Shrine, where the cave floor falls away.";
               AllowPushDir();
               rtrue;
           ],
       after [;
           SwitchOn:
               give self light;
           SwitchOff:
               give self ~light;
           ],
       daemon [;
           if (self hasnt on) return;
           if (--self.battery_power == 0) give self ~light ~on;
           if (self in location) {
               switch (self.battery_power) {
                   10: "^The sodium lamp is getting dimmer!";
                   5:  "^The sodium lamp can't last much longer.";
                   0:  "^The sodium lamp fades and suddenly dies.";
                   }
               }
           ],
       battery_power 100,
 has   switchable;

!       Defined in DM4 $16
Object  dictionary "Waldeck's Mayan dictionary"
 with  name 'dictionary' 'local' 'guide' 'book' 'mayan' 'waldeck'
            'waldeck^s',
       description
           "Compiled from the unreliable lithographs of the legendary raconteur
            and explorer ~Count~ Jean Frederic Maximilien Waldeck
            (1766??-1875), this guide contains what little is known of the
            glyphs used in the local ancient dialect.",
       before [ w1 w2 glyph;
           Consult:
               wn = consult_from;
               w1 = NextWord(); ! First word of subject
               w2 = NextWord(); ! Second word (if any) of subject
               if (consult_words==1 && w1~='glyph' or 'glyphs') glyph = w1;
               else if (consult_words==2 && w1=='glyph') glyph = w2;
               else if (consult_words==2 && w2=='glyph') glyph = w1;
               else "Try ~look up <name of glyph> in book~.";
               switch (glyph) {
                   'q1':       "(This is one glyph you have memorised!)^^
                                Q1: ~sacred site~.";
                   'crescent': "Crescent: believed pronounced ~xibalba~,
                                though its meaning is unknown.";
                   'arrow':    "Arrow: ~journey; becoming~.";
                   'skull':    "Skull: ~death, doom; fate (not nec. bad)~.";
                   'circle':   "Circle: ~the Sun; also life, lifetime~.";
                   'jaguar':   "Jaguar: ~lord~.";
                   'monkey':   "Monkey: ~priest?~.";
                   'bird':     if (self.correct) "Bird: ~dead as a stone~.";
                               "Bird: ~rich, affluent?~.";
                   default:    "That glyph is so far unrecorded.";
               }
           ],
       correct false,
 has   proper;

!       Defined in DM4 $23
Object  map "sketch-map of Quintana Roo"
 with  name 'map' 'sketch' 'sketch-map' 'quintana' 'roo',
       description
           "This map marks little more than the creek which brought you
            here, off the south-east edge of Mexico and into deepest
            rainforest, broken only by this raised plateau.";

!       Defined in DM4 $23
Object  stone_key "stone key"
 with  name 'stone' 'key';

!       Defined in DM4 $17, modified in $18 and $23
Object  priest "mummified priest"
 with  name 'mummified' 'priest',
       initial
           "Behind the slab, a mummified priest stands waiting,
            barely alive at best, impossibly venerable.",
       description
           "He is desiccated and hangs together only by will-power. Though his
            first language is presumably local Mayan, you have the curious
            instinct that he will understand your speech.",
       life [;
           Answer:
               "The priest coughs, and almost falls apart.";
           Ask: switch (second) {
               'dictionary', 'book':
                   if (dictionary.correct == false)
                       "~The ~bird~ glyph... very funny.~";
                   "~A dictionary? Really?~";
               'glyph', 'glyphs', 'mayan', 'dialect':
                   "~In our culture, the Priests are ever literate.~";
               'lord', 'tomb', 'shrine', 'temple':
                   "~This is a private matter.~";
               'paintings':
                   "The calendrical priest frowns. ~10 baktun, 4 katun,
                    that makes 1,468,800 days since the beginning of time:
                    in your calendar 19 January 909.~";
               'ruins':
                   "~The ruins will ever defeat thieves. In the underworld,
                    looters are tortured throughout eternity.~ A pause.
                    ~As are archaeologists.~";
               'web', 'wormcast':
                   "~No man can pass the Wormcast.~";
               'xibalba':
                   if (Shrine.sw_to == Junction)
                       "The priest shakes his bony finger.";
                   Shrine.sw_to = Junction;
                   "The priest extends one bony finger southwest toward the
                    icicles, which vanish like frost as he speaks. ~Xibalb@'a,
                    the Underworld.~";
                   }
               "~You must find your own answer.~";
           Tell:
               "The priest has no interest in your sordid life.";
           Attack, Kiss:
               remove self;
               "The priest desiccates away into dust until nothing remains,
                not a breeze nor a bone.";
           ThrowAt:
               move noun to location; <<Attack self>>;
           Show, Give:
               if (noun == dictionary && dictionary.correct == false) {
                   dictionary.correct = true;
                   "The priest reads a little of the book, laughing in a
                    hollow, whispering way. Unable to restrain his mirth,
                    he scratches in a correction somewhere before returning
                    the book.";
                   }
               if (noun == newspaper)
                   "He looks at the date. ~12 baktun 16 katun 4 tun 1 uinal
                    12 kin~, he declares before browsing the front page.
                    ~Ah. Progress, I see.~";
               "The priest is not interested in earthly things.";
           ],
       orders [;
           Go:
               "~I must not leave the Shrine.~";
           NotUnderstood:
               "~You speak in riddles.~";
           default:
               "~It is not your orders I serve.~";
           ],
 has   animate;

!       Defined in DM4 Exercise 53
Object  warthog "Warthog"
 with  name 'wart' 'hog' 'warthog',
       initial
           "A warthog snuffles and grunts about in the ashes.",
       description
           "Muddy and grunting.",
       orders [;
           Go, Look, Examine, Smell, Taste, Touch, Search,Jump, Enter:
               rfalse;
           Eat:
               "You haven't the knack of snuffling up to food yet.";
           default:
               "Warthogs can't do anything so involved. If it weren't for the
                nocturnal eyesight and the lost weight, they'd be worse off
                all round than people.";
           ],
 has   animate proper;

!       Defined in DM4 $8
Object  low_mist "low mist"
 with  name 'low' 'swirling' 'mist',
       description "The mist has an aroma reminiscent of tortilla.",
       before [;
           Examine, Search:
               ;
           Smell:
               <<Examine self>>;
           default:
               "The mist is too insubstantial.";
           ],
       react_before [; Smell: if (noun == nothing) <<Smell self>>; ],
       found_in Square_Chamber Forest,
 has   scenery;

!       Defined in DM4 Exercise 46
Object  tiny_claws "sound of tiny claws" thedark
 with  name 'tiny' 'claws' 'sound' 'of' 'scuttling' 'scuttle' 'things'
            'creatures' 'monsters' 'insects',
       article "the",
       initial
           "Somewhere, tiny claws are scuttling.",
       before [;
           Listen:
               "How intelligent they sound, for mere insects.";
           Touch, Taste:
               "You wouldn't want to. Really.";
           Smell:
               "You can only smell your own fear.";
           Attack:
               "They easily evade your flailing about.";
           default:
               "The creatures evade you, chittering.";
           ],
       each_turn [; StartDaemon(self); ],
       daemon [;
           if (location ~= thedark) {
               self.turns_active = 0;
               StopDaemon(self);
               rtrue;
               }
           switch (++(self.turns_active)) {
               1:  "^The scuttling draws a little nearer, and your breathing
                    grows loud and hoarse.";
               2:  "^The perspiration of terror runs off your brow. The
                    creatures are almost here!";
               3:  "^You feel a tickling at your extremities and kick outward,
                    shaking something chitinous off. Their sound alone is a
                    menacing rasp.";
               4:  deadflag = true;
                   "^Suddenly there is a tiny pain, of a hypodermic-sharp fang
                    at your calf. Almost at once your limbs go into spasm, your
                    shoulders and knee-joints lock, your tongue swells...";
               }
           ],
       turns_active 0;

! ---------------------------------------------------------------------------- !
!       Utility routines.

!       Defined in DM4 $4, modified in $21 and $23
[ Initialise;
       TitlePage();
       location = Forest;
       move map to player;
       move sodium_lamp to player;
       move dictionary to player;
       StartDaemon(sodium_lamp);
       thedark.description =
           "The darkness of ages presses in on you, and you feel
            claustrophobic.";
       "^^^Days of searching, days of thirsty hacking through the briars of
        the forest, but at last your patience was rewarded. A discovery!^";
       ];

!       Defined in DM4 Exercise 123
[ TitlePage i;
       @erase_window -1; print "^^^^^^^^^^^^^";
       i = 0->33; if (i > 30) i = (i-30)/2;
       style bold; font off; spaces(i);
       print " RUINS^";
       style roman; print "^^"; spaces(i);
       print "[Please press SPACE to begin.]^";
       font on;
       box "But Alligator was not digging the bottom of the hole"
           "Which was to be his grave,"
           "But rather he was digging his own hole"
           "As a shelter for himself."
           ""
           "-- from the Popol Vuh";
       @read_char 1 -> i;
       @erase_window -1;
       ];

!       Defined in DM4 $22
[ PrintRank;
       print ", earning you the rank of ";
       if (score == 30) "Director of the Carnegie Institution.";
       if (score >= 20) "Archaeologist.";
       if (score >= 10) "Curiosity-seeker.";
       if (score >= 5) "Explorer.";
       "Tourist.";
       ];

!       Defined in DM4 $21
[ DeathMessage;
       if (deadflag == 3) print "You have been captured";
       ];

! ---------------------------------------------------------------------------- !

Include "Grammar";

!       Defined in DM4 $6
[ PhotographSub;
       if (camera notin player) "Not without the use of your camera.";
       if (noun == player) "Best not. You haven't shaved since Mexico.";
       if (children(player) > 1)
           "Photography is a cumbersome business, needing the use of both
            hands. You'll have to put everything else down.";
       if (location == Forest) "In this rain-soaked forest, best not.";
       if (location == thedark) "It is far too dark.";
       if (AfterRoutines()) return;
       print_ret "You set up the elephantine, large-format, wet-plate camera,
                  adjust the sodium lamp and make a patient exposure of ",
                  (the) noun, ".";
       ];

Verb 'photograph'
       * noun          -> Photograph;

! ---------------------------------------------------------------------------- !