!*******************************************************************************
!** The Awakening - Copyright (c) 1998 by Dennis Matheson
!**
!** Distribution: ~The Awakening~ may be distributed freely by any means
!** so long as a) This notice remains intact and b) no charge other than a nominal
!** fee to cover the cost of distribution is made. It may be included as part of
!** a commercial distribution provided that my permission is given first.
!**
!** Derivative Works: ~The Awakening~ is distributed with its source code.
!** Derivative works are permitted of ~The Awakening~ so long as a) They are clearly
!** identified as such and reference is made back to this original version and b)
!** such works must freely redistributable under the same terms as stated above.
!**
!** Support: ~The Awakening~ is distributed without any support of any
!** kind. Feel free to contact me at the address given, but I make no guarantee that
!** I will respond.
!**
!** Warranty: ~The Awakening~ is distributed totally without any warranty of any
!** kind. The entire risk of using this program is totally assumed by the user.
!**
!** As of July 1998
!** Dennis Matheson
!** [email protected]
!**
!** 4068 Maxanne Dr.
!** Kennesaw, GA  30144
!*******************************************************************************

Constant Story "The Awakening";
Constant Headline "^Copyright (c) 1998 by Dennis Matheson^
                  (For more information type ~HELP~, for hints type ~HINTS~)^^";

Constant DEATH_MENTION_UNDO;
Constant TASKS_PROVIDED;

Global hint_menu = Hint_Top;
Global help_menu = Help_Top;

Replace DoMenu;
Replace LowKey_Menu;

Include "Parser";

Constant NUMBER_TASKS = 7;
Array    task_scores  -> 10 5 5 5 10 5 10;
Constant MAX_SCORE = 50;

Object LibraryMessages
  with before [;
     Miscellany:
        if (lm_n == 19)
           "You find you cannot look down at yourself. It is almost as if you
           know what you might find and are afraid to have your fears
           confirmed.";];

Include "VerbLib";

Include "Center";
Include "DoMenu";
Include "AltMenu";
Include "Hints";

!*******************************************************************************
!*** Class Descriptions
!*******************************************************************************
Class Fake_Object
  has static;

Class Bottle
  with
     color "colorless",
  name
     "heavy" "glass" "bottle" "lead" "leaded" "stopper" "stoppered" "cork",
  description [;
     "The bottle is made of a heavy, leaded glass and closed with a cork
     stopper sealed with wax. Inside the bottle, an oddly shaped lead weight
     hangs like a pendulum from a string. The bottle glows with a ",
     (string) self.color, " light.";],
  before [;
     Take:
        move self to player;
        if (self hasnt general) {
           move Bottles to Limbo;
           give Blue_Bottle ~concealed;
           give Green_Bottle ~concealed;}
        if (self == Blue_Bottle) {
           if (self hasnt general) {
              give self general;
              "The blue bottle is warm to your touch as you pick it up. The
              warmth seems to travel up your arm and into the center of your
              being. It is almost as if you have found a missing part of
              yourself.";}
           else
              "You savor the warmth of the blue bottle as you pick it up.";}
        else {
           if (self hasnt general) {
              give self general;
              "The green bottle has a sickly feel which matches its color. It
              feels like ice, cold and burning at the same time. It is all you
              can do to keep from throwing it down."; }
           else
              "You gingerly pick up the green bottle again.";}
     ThrownAt:
        move noun to location;
        print (The) noun, " shatters ", (the) self, ".  ";
        self.open_bottle();
        rtrue;
     Open:
        print "You peel the wax away from the mouth of the bottle and pull out
        the cork.  ";
        self.open_bottle();
        rtrue;
     Attack:
        print "You shatter ", (the) self, ".  ";
        self.open_bottle();
        rtrue;],
  has light;

!*******************************************************************************
!*** Hidden Game Locations and Things That Don't Start Anywhere
!*******************************************************************************
Object Limbo "Limbo";

!*******************************************************************************
!*** The start
!*******************************************************************************
Object Grave "In the Mud"
  with description
     "Rain and muddy water are pouring down on you, making it difficult to
     see or even breathe. Sodden earth and mud surrounds you on all sides
     except overhead, where flashes of lightning illuminate a storm tossed
     sky.",
  before [;
     Listen:
        "Howling winds and the crashing of thunder assault your senses.";],
  u_to [;print "As you scramble out of the hole the mud collapses downward,
     filling in the hole behind you.^"; return Graveyard;],
  cant_go "You claw helplessly at the mud.",
  has light;

Object Muddy_Water "muddy water" Grave
  with name
     "muddy" "water",
  description
     "Torrents of muddy water are pouring in from the opening overhead onto
     you.",
  before [;
     Take:
        "The muddy water trickles through your fingers.";],
  has scenery;

Object Mud "mud" Grave
  with name
     "mud" "earth" "sodden",
  description
     "The sides of the hole are made of dark, rich earth, now soaked through
     by the torrential downpour.  As you watch, more and more mud is washed
     away and into the hole with you.",
  before [;
     Take:
        "You take a handful of muddy soil, but the rain washes it away.";],
  has scenery;

!*******************************************************************************
!*** The outside
!*******************************************************************************
Class Outside
  with
  before [;
     Smell:
        "You would expect the storm to have cleared the air, but over the whole
        area hangs a fetid odor of decay.";],
  u_to "It is not yet that time...",
  d_to "That is no longer your place.",
  cant_go "You feel that you are unable to.  Some force on you increases
     as you try to leave the area.",
  each_turn [;
     if (random(5) == 1) {
        switch (random(5)) {
           1: "^A blast of thunder rattles the ground.";
           2: "^With a loud CRACK, a bolt of lightning strikes the steeple of
              the church.";
           3: "^Momentarily, the wind and rain slacken then return with renewed
              force.";
           4: "^Lightning arcs overhead, followed instantly by a blast of
              thunder.";
           5: "^For a brief moment, hail pounds against you then subsides.";}}],
  has light;

Outside Graveyard "Graveyard"
  with description
     "Dozens of stone markers stand here, oblivious to the wind and the rain.
     Huge, twisted oaks, their limbs tossed by the wind, draw an unmentionable
     sustenance from the moss-covered, moldy ground. An odor of decay, which
     even the storm cannot dissipate, hangs over everything. An iron barred
     fence surrounds the graveyard, an ivy-covered barrier separating it from
     the world of the living. The only exit is through the gate to the east.",
  before [;
     Smell:
        "You smell the odors of wet earth, the wild scent of the storm, and,
        under it all, the lingering charnel odor of decay.";],
  e_to West_Church,
  cant_go "The graveyard is surrounded on all sides by an iron-barred fence.
     The only exit is through the gate to the east.";

Object Graves "stone markers" Graveyard
  with name
     "stone" "markers" "graves" "slabs" "graveyard",
  description
     "Dozens of stone slabs mark the final resting places of those who have
     departed. All are old, the inscriptions worn away and covered with moss
     and mold, they tilt at odd angles. Many have fallen and are now half
     buried in the mud.",
  before [;
     Read:
        "Few of the inscriptions are legible. Those that remain contain only
        those sentiments that are placed there for the benefit of those who
        gaze upon the stones, not those buried beneath them.";
     Push, Pull:
        "The stone topples over into the mud.";
     Take:
        "You strain and lift the stone slightly from the mud, then it slips and
        falls over with a splash.";],
  has static scenery pluralname;

Object Branch "oak branch" Graveyard
  with name
     "oak" "branch",
  description [;
     print "This large branch has broken off from one of the trees and fallen
     on one of the graves, shattering it's marker.";
     if ((Limb hasnt moved) && (self has general))
        " A smaller limb has broken off of the branch and is lying nearby.";
     else
        new_line;rtrue;],
  describe [;
     print "^A large branch has been broken from one of the trees and has
     crushed the grave marker below it.";
     if ((Limb hasnt moved) && (self has general)) {
        " A smaller limb has broken off of the branch and is lying nearby.";}
     else
        new_line;rtrue;],
  before [;
     Take:
        if (Limb hasnt moved) {
           give self general;
           "The branch is too large to move, but a smaller limb has broken off
           and is lying nearby."; }
        else
           "The branch is too large to take.";
     Push, Pull:
        "You shove the branch around, to no real effect.";],
  has static;

Object Limb "broken limb" Graveyard
  with name
     "broken" "limb",
  description
     "A stout oak limb, about as long as you are tall.",
  before [;
     Take:
        give self ~concealed;],
  has concealed;

Object Disturbed_Grave "disturbed grave" Graveyard
  with name
     "broken" "shattered" "marker" "grave",
  description
     "The marker for this grave has been shattered by the fall of a large
     branch from the overhanging tree. The grave itself has been disturbed;
     the soil has fallen in to form a shallow pit.",
  before [;
     Take:
        "There is no need to collect the shattered remains of the marker.";
     Read:
        "The inscription is no longer legible.";],
  has scenery;

Object Moss_Mold "moss and mold" Graveyard
  with name
     "moss" "mold" "mould",
  description
     "Mosses and molds cover the ground and the grave markers. There is
     something sickly looking about them, as if they are the physical
     manifestations of some kind of poisons in the soil. At any rate, they
     are alone in the graveyard, as no grasses or weeds grow within its
     boundaries.",
  before [;
     Take:
        "You pull up a handful and examine it briefly before tossing it
        back down. You see no use in carrying it with you.";
     Burn:
        "The moss and mold is far too wet to burn.";],
  has scenery;

Outside West_Church "West Side of the Church"
  with description
     "This side of the church is untended and grasses and weeds have run
     rampant. A muddy trail leads back to the graveyard to the west and on to
     the southeast and a faint path continues around the church to the
     northeast.",
  w_to Graveyard,
  e_to "There is no entrance into the church on this side.",
  ne_to North_Church,
  n_to North_Church,
  se_to Front_Church,
  s_to Front_Church;

Object Trail "muddy trail" West_Church
  with name
     "muddy" "trail" "faint" "path",
  description
     "Simply a worn trail through the grass, it leads around the church
     to the northeast and southeast and west to the graveyard.",
  has scenery;

Outside North_Church "North Side of the Church"
  with description
     "The trees close in here, their storm-tossed branches seeming to reach
     clawing limbs towards the back of the church. The weeds have run wild
     here and ivy climbs its way up the back of the building.  A faint path
     continues around the church to the southeast and the southwest.",
  se_to East_Church,
  e_to East_Church,
  sw_to West_Church,
  w_to West_Church,
  s_to "There is no entrance into the church on this side.";

Object Path "faint path" North_Church
  with name
     "faint" "path" "trail",
  description
     "A barely visible rut in the grass leads around the church to the
     southeast and southwest.",
  has scenery;

Outside East_Church "East Side of the Church"
  with description
     "This wide, graveled clearing may have once been where the worshippers at
     the church left their vehicles while attending services inside. If so, it
     seems that the last service was held long ago. Weeds and grasses grow up
     through the gravel, which is littered with debris. Dark, looming trees
     surround the clearing except for the driveway, which leads to the
     southwest, and for a narrow opening to the northwest.",
  sw_to Front_Church,
  s_to Front_Church,
  nw_to North_Church,
  n_to North_Church,
  w_to "There is no entrance into the church on this side.";

Object Parking_Lot "graveled clearing" East_Church
  with name
     "gravel" "graveled" "clearing" "parking" "lot",
  description
     "Dirty chunks of rock mix with mud to create a more or less level
     surface.",
  before [;
     Take:
        if (Gravel notin player) {
           move Gravel to player;
           "You pick up a handful of gravel.";}
        else
           "You already have a handful of gravel.";
     Dig:
        "You dig a small hole in the gravel which the storm immediately
        fills in with rain and mud.";],
  has scenery;

Object Gravel "handful of gravel" Limbo
  with name
     "handful" "of" "gravel",
  description
     "A handful of loose, muddy gravel.",
  before [;
     Drop:
        move self to Limbo;
        if (location ofclass Outside)
           "You toss down the gravel which scatters across the ground.";
        else
           "You toss down the gravel which scatters among the debris on the
           floor.";],
  after [;
     ThrowAt:
        move self to Limbo;
        "The gravel scatters across the ground and is lost.";];

Object Lot_Debris "debris" East_Church
  with name
     "debris" "sticks" "leaves" "trash",
  description
     "Scattered sticks, leaves and bits of trash cover the gravel clearing.",
  before [;
     Take:
        "You see no need to carry the trash around with you.";],
  has scenery pluralname;

Outside Front_Church "Front of the Church"
  with description
     "Two massive oak trees which flank the cracked sidewalk dominate the front
     of the church. The facade of the church itself rises beyond them, its
     steeple silhouetted against the sky. The storm lashes at its faded white
     facade, almost as if the storm is trying to wash the church clean;
     something you somehow realize will take more than mere water to accomplish.
     To the north, a sidewalk leads to the front of the church. A weed-choked
     driveway runs to the northeast and down a hill to the south, and a muddy
     path leads around the church to the northwest.",
  e_to  East_Church,
  ne_to East_Church,
  w_to  West_Church,
  nw_to West_Church,
  n_to [;if (Dog hasnt general)
            "Bristling and growling, the dog blocks your path";
         else {
            Achieved(0);
            return Porch;}],
  u_to [;if (Railing_Section.is_under ~= Top_Of_Tree)
            "The tree trunks are too slick with rain to climb.";
         else
            return Railing_Section;];

Object Oak_Trees "oak trees" Front_Church
  with name
     "massive" "oak" "trees" "tree",
  description
     "These massive trees are easily hundreds of years old. They tower over
     the front of the church, climbing almost as high as the steeple. Unlike
     the forest surrounding other parts of the grounds they are almost
     unnaturally healthy, their branches clean and straight and their leaves
     a deep rich green.",
  before [;
     Climb:
        if (Railing_Section.is_under == Top_Of_Tree)
           <<Go Railing_Section>>;
        else
           "The trunk is too rain-slick to climb.";],
  has pluralname static scenery;

Object Dog "guard dog" Front_Church
  with
     is_mad false,
     is_following false,
     temper 0,
     chain_length 0,
  name
     "guard" "dog" "fido" "rover",
  description [;
     if (self.is_mad)
        "The dog is slavering and barking wildly as it throws itself at you
        again and again.";
     else
        "This large, solid black dog is chained to one of the oak trees. There
        is something disturbing about the shape of it's head; it seems to be
        too large and slightly misshapen and an unnatural intelligence can
        be seen behind its red eyes.";],
  describe
     "A formidable looking guard dog stands here.",
  orders [;
     "The dog growls threateningly.";],
  before [;
     Touch:
        "^The dog snarls and snaps at you as you reach for it and you draw
        your hand back hurriedly.";],
  life [;
     Attack:
        self.is_mad = true;
        "^Angered at your attack, the dog charges at you!";
     ThrownAt:
        move noun to location;
        <<Attack self>>;
     default:
        "The dog snarls and barks at you.";],
  daemon [d p x;
     d = parent(self);
     p = location;
     if (p == d) {
        give self ~general;
        self.is_following = true;
        if (self.is_mad) {
           switch(self.temper++) {
              0: "^The dog growls and snarls angrily, snapping at your legs.";
              1: "^The dog leaps at you, raking your chest with its claws and
                 leaving a trail of red.";
              2: "^You feel a flash of searing pain as the dog latches onto
                 your side with its teeth.";
              3: deadflag = 1;
                 "^The dog finally manages to latch onto your throat. Your
                 last sight is of your blood splattering onto its face.";}}
        "^The dog growls at you threateningly.";}
     else {
        if (self.temper > 0) self.temper--;
        if (self.is_following) {
           if ((self.is_mad) ||
               (p == Front_Church or East_Church or West_Church)) {
              switch(d) {
                 Front_Church:
                    if (p == West_Church) x =  1;
                    if (p == East_Church) x = -1;
                 West_Church:
                    if (p == North_Church) x =  1;
                    if (p == Front_Church) x = -1;
                 North_Church:
                    if (p == East_Church) x =  1;
                    if (p == West_Church) x = -1;
                 East_Church:
                    if (p == Front_Church) x = 1;
                    if (p == North_Church) x = -1;
                 default:
                    x = 0;}
              self.chain_length = self.chain_length + x;
              if ((self.chain_length > -4) && (self.chain_length < 4)) {
                 move self to p;
                 if (self.is_mad)
                    "^The dog chases madly after you!";
                 "^Growling faintly, the dog follows you to ", (the) p,
                 ", dragging its chain behind it.";}
              else {
                 if (self hasnt general) {
                    give self general;
                    self.is_following = false;
                    self.chain_length = self.chain_length - x;
                    "^The dog lunges after you, but is suddenly jerked to
                    a stop with a yelp.  The dog has been brought up short
                    by it's chain, which is now completely wrapped around
                    the church.  It barks wildly but ineffectually at you
                    as you continue on around the corner.";}}}
           else {
              self.is_following = false;
              move self to Front_Church;
              self.chain_length = 0;
              "^Satisfied, the dog wanders off back to the Front of the
              Church.";}}}
     rtrue;],
  has male animate;

Fake_Object Chain "chain"
  with name
     "chain",
  description
     "A heavy steel chain.  It has rusted slightly but is still more than
     sturdy enough to hold the dog.",
  describe [;
     if (Dog has general) {
        switch (location) {
           Front_Church:
              if (Dog notin location) {
                 print "^The heavy chain stretches from one of the oak trees and around
                 the corner of the church to the ";
                 if (Dog.chain_length > 0) "northwest."; "northeast.";}
           East_Church:
              if (Dog notin location)
                 "^A heavy chain stretches around the church to the northwest
                 and southwest.";
           West_Church:
              if (Dog notin location)
                 "^A heavy chain is wrapped around the church, disappearing to
                 the northeast and southeast.";
           North_Church:
              "^A heavy chain disappears around the east and west corners.";}}
     rtrue;],
     before [;
        Take, Pull:
           "The dog probably wouldn't like you to be pulling on its chain.";],
     found_in Front_Church East_Church West_Church North_Church,
     has static;

Outside Top_Of_Tree "Top of Oak Tree"
  with description
     "The limbs of the tree are swaying violently from the storm, but near the
     trunk it is a little more stable. You have an excellent view from here
     of the church grounds and surrounding area. The church seems to be in
     a clearing on a hill surrounded by a forest. At the base of the hill a
     small town can be seen, its lights glimmering faintly through the storm.
     ^^One of the branches of the tree reaches out to the north towards the
     steeple of the church. An open frame can be seen in the steeple near
     where the branch ends.",
  before [;
     Jump:
        deadflag = 1;
        "Throwing caution to the winds, you leap out of the tree and into
        space. The wind howls around you as you plummet to the ground. Your
        last sight is the church steeple, silhouetted by the lightning against
        the sky.";
     Climb:
        if (noun == Railing_Top) rfalse;
        if (noun == Tree_Branch) rfalse;
        if (Railing_Top.is_over ~= Front_Church)
           "You cannot climb any further up and the trunk of the tree is
           too slick to climb down.";
        else
           <<Climb Railing_Top>>;
     Drop:
        move noun to Front_Church;
        print_ret (The) noun, " tumbles through the branches to the
        ground.";],
  n_to Belfry,
  d_to [;if (Railing_Top.is_over ~= Front_Church)
            "The drop to the ground below is too far for you to jump safely,
            and the trunk of the tree is too slick to climb.";
         else
            return Front_Church;];

Object Tree_Branch "tree branch"
  with name
     "oak" "tree" "branch",
  description
     "The tree branch sways alarmingly in the wind but seems quite sturdy. It
     passes very close to the open window frame in the steeple.",
  before [;
     Take:
        "The branch is securely attached to the tree.";
     Climb:
        PlayerTo(Belfry,2);],
  found_in Top_Of_Tree Belfry,
  has scenery;

Object Sidewalk "sidewalk" Front_Church
  with name
     "walk" "sidewalk" "path" "flagstone" "flagstones",
  description
     "A wide flagstone path leads between the two oak trees to the front of
     the church. The earth has shifted, causing the stones to tilt at odd
     angles, and weeds and grass grow in the cracks between the flagstones.",
  before [;
     Take:
        "You attempt to lift one of the flagstones, but it slips and falls
        back with a squishing splash.";],
  has scenery;

Object Driveway "driveway"
  with name
     "drive" "driveway",
  description
     "A rutted, gravel covered path.",
  found_in East_Church Front_Church,
  has scenery;

Object Ivy "ivy"
  with name
     "ivy" "vine" "creepers",
  description [;
     if (location == Graveyard)
        "The ivy is thick and luxuriant and somehow disturbing. The shapes
        of the leaves are not quite wholesome and you wonder what strange
        sustenance it is drawing from beneath the moldering ground.";
     else
        "The ivy is sick and yellowed looking but somehow clings to the side
        of the church as if it is trying to distance itself from the rocky
        soil.";],
  before [;
     Climb:
        "The rain-soaked vines tear loose in your hands, covering you with
        wet leaves and sticky sap.";
     Take:
        "The vines pull away easily enough, but maintain a tenacious hold on
        the ground that you are unable to break.";
     Burn:
        "The vines are too wet to burn.";],
  found_in Graveyard North_Church,
  has scenery;

Object Forest "oak trees"
  with name
     "oak" "oaks" "tree" "trees" "forest" "limbs" "twisted" "ancient",
  description [;
     if (location == Graveyard)
        "These ancient, twisted trees surround and even invade the graveyard.
        Now tossed wildly by the storm, their branches reach skyward while
        their roots suck unholy nourishment from between the broken slabs.";
     else
        "The trees wave wildly in the wind, their twisted limbs seeming to
        reach out to claw at the side of the church. No birds or forest
        animals inhabit their branches; a repellent air surrounds them that
        seems inimical to any such invasion.";],
  before [;
     Climb:
        "The trunk is too wet and rain-slick to do that safely.";],
  found_in Graveyard North_Church East_Church Top_Of_Tree Belfry,
  has scenery pluralname;

Object Outside_Storm "storm"
  with name
     "storm" "clouds" "sky" "wind" "thunder" "lightning",
  description
     "The howling wind sends the clouds racing across the sky. The almost
     constant flashing of lightning illuminates the landscape in stark black
     and white contrast, while the barrage of thunder joins with the wind in
     a mad concaphony.",
  before [;
     Take:
        "You can't take the wind!";],
  found_in [; if ((location ofclass Outside) || (location == Grave) ||
                  (location == Belfry)) rtrue;],
  has scenery;

Object Rain "rain"
  with name
     "rain",
  description
     "The rain pours downward, pelting you painfully and almost blinding you
     with its intensity.",
  before [;
     Take:
        "You are already soaked.";],
  found_in [; if ((location ofclass Outside) || (location == Grave)) rtrue;],
  has scenery;

Object Muddy_Ground "mud"
  with name
     "mud" "muddy" "earth" "sodden" "ground",
  description
     "A thin layer of mud covers the rocky soil.",
  before [;
     Take:
        "You take a handful of muddy soil, but the rain washes it away.";
     Dig:
        "You are only able to dig a few inches before striking rock, and the
        rain rapidly washes more mud in to fill up the hole you make.";],
  found_in [; if (location ofclass Outside) rtrue;],
  has scenery;

Object Grass_Weed "grasses and weeds"
  with name
     "grass" "grasses" "weed" "weeds",
  description
     "Diseased looking grasses and weeds surround the church.  In clumps it
     rises to your knees, while in other places it has been beaten to the
     ground by the force of the storm.",
  before [;
     Take:
        "You pull up a handful and examine it briefly before tossing it
        back down. You see no use in carrying it with you.";
     Burn:
        "The grass and weeds are far too wet to burn.";],
  found_in [; if ((location ofclass Outside) && (location ~= Graveyard))
     rtrue;],
  has scenery;

Fake_Object Church "church"
  with name
     "church" "building",
  description
     "The old church has seen better days. Formerly painted white, the boards
     are now faded, peeling and rotted. Most of the windows are boarded up,
     and those that aren't have long since been broken out. The shingles have
     fallen from the roof, which sags alarmingly. A broken-tipped steeple rises
     from one end of the building, and a faint miasma of decay seems to rise
     from the structure.",
  describe [;
     switch (location) {
        Graveyard:
           "^A church rises to the east, its boarded up windows giving the
           impression that it is covering its eyes from the sight of the
           graveyard.";
        West_Church:
           "^To the east, the wall of the church breaks some of the force of
           the wind.";
        North_Church:
           "^The south wall of the church looms blankly overhead.";
        East_Church:
           "^To the west, the church stares out over the clearing.";
        Front_Church:
           "^The church and steeple loom to the north, the open window frames
           seeming to stare with judgment upon anyone standing before it.";
        Top_Of_Tree:
           "^The steeple of the church looms to the north.";}],
  found_in [; if ((location ofclass Outside) && (location ~= Porch)) rtrue;],
  has static;

Object Steeple "steeple"
  with name
     "steeple",
  description
     "Pointing heavenward like some broken, accusing finger, the steeple rises
     from the front of the church. The steeple ends in a ragged, blunt tip;
     whatever decoration may have once surmounted it is long gone.",
  found_in [;if (location ofclass Outside) rtrue;],
  has scenery;

Object Windows "windows"
  with name
     "stained" "glass" "broken" "window" "windows" "board" "boards" "frame",
  description
     "Once, the windows were probably told stories of hope and redemption
     in brightly colored stained glass. Now, they are boarded up as if the
     church has closed it's eyes to the world outside.",
  before [;
     Take, Push, Pull, Open, Close:
        "The boards are nailed firmly in place.";],
  found_in [;if (location ofclass Outside) rtrue;],
  has scenery pluralname;

!*******************************************************************************
!*** The Porch
!*******************************************************************************
Outside Porch "Church Porch"
  with name
     "wide" "covered" "porch",
  description
     "This wide, covered porch spans the width of the church front. A white
     picket railing surrounds the porch on three sides, except to the south
     where a short flight of steps leads down to the sidewalk. Two large
     windows have been boarded up but the main doors stand slightly ajar.",
  n_to Vestibule,
  s_to Front_Church,
  d_to "The floor here is old, but still pretty solid.",
  u_to "The railing is too rickety to climb.",
  cant_go "There is no way off the porch in that direction.";

Object Railing "white picket railing" Porch
  with name
     "white" "picket" "railing" "rail",
  description [;
     print "The railing consists of two parallel lengths of wood about an
     arm's span apart connected by wooden pickets.  ";
     if (self hasnt general)
        "One section of the railing seems fairly unsteady.";
     else
        "One section of the railing is missing.";],
  before [;
     Take, Push, Pull:
        if (self hasnt general) {
           give self general;
           if (action == ##Take)
              move Railing_Section to player;
           else
              move Railing_Section to location;
           "With a jerk, you tear free the loose section of railing.";}
        else
           "The rest of the railing seems fairly steady.";],
  has static scenery;

Object Railing_Section "broken length of railing" Limbo
  with
     is_under 0,
  name
     "broken" "section" "of" "white" "picket" "railing" "ladder" "rail",
  description
     "The railing consists of two parallel lengths of wood about an arm's span
     apart connected by wooden pickets. If stood on end, the rail would be
     about twice your height.",
  describe [;
     switch (self.is_under) {
        Steeple_Chamber:
           "^The broken length of railing is propped up under the trap door";
        Top_Of_Tree:
           "^The broken length of railing is propped up against the side of the
           oak tree.";
        Near_Painting:
           "^The broken length of railing is propped against the wall near the
           painting.";
        default:
           "The broken length of porch railing is lying here.";}],
  before [;
     PutUnder:
        if (self notin player)
           "You don't have ", (the) self, ".";
        move self to location;
        if ((location == Vestibule) && (second == Trap_Door)) {
           give self door;
           self.is_under = Steeple_Chamber;
           move Railing_Top to Steeple_Chamber;
           Railing_Top.is_over = Vestibule;
           "You carefully place the length of railing under the trap door in
           the ceiling.";}
        if ((location == Front_Church) && (second == Oak_Trees)) {
           give self door;
           self.is_under = Top_Of_Tree;
           move Railing_Top to Top_Of_Tree;
           Railing_Top.is_over = Front_Church;
           "You lean the length of railing against the side of the oak tree.";}
        if ((location == Sanctuary) && (second == Painting)) {
           give self door;
           self.is_under = Near_Painting;
           move Railing_Top to Near_Painting;
           Railing_Top.is_over = Sanctuary;
           "You lean the length of railing against the wall near the
           painting.";}
        "You put ", (the) self, " under ", (the) second, ".";
     Take:
        give self ~door;
        self.is_under = 0;
        move Railing_Top to Limbo;
        Railing_Top.is_over = 0;
     Climb:
        if (self.is_under ~= 0) {
           print "You carefully climb up the length of railing, using the
           pickets like a ladder.^";
           <<Go self>>;}
        else
           "The railing doesn't lead anywhere.";],
  door_dir u_to,
  door_to [;
     if (self.is_under ~= 0) {
        if (self.is_under == Steeple_Chamber) Achieved(1);
        return self.is_under;}
     "The railing doesn't lead anywhere.";],
  has open;

Object Railing_Top "top of railing" Limbo
  with
     is_over 0,
  name
     "top" "broken" "section" "of" "white" "picket" "railing" "ladder" "rail",
  description
     "The railing consists of two parallel lengths of wood about an arm's span
     apart connected by wooden pickets. If stood on end, the rail would be
     about twice your height.",
  describe [;
     switch (self.is_over) {
        Vestibule:
           "^The top of the broken section of railing is visible sticking up
           through the trap door in the floor.";
        Front_Church:
           "^The broken length of railing is propped up against a nearby
           branch.";
        Sanctuary:
           "^You are precariously balanced on the top of the broken section of
           railing.";
        default:
           "You are standing on a bug!";}],
  before [;
     Take:
        "You attempt to pull the railing up after you, but you cannot get
        enough leverage to do so.";
     Climb:
        <<Go self>>;],
  door_dir d_to,
  door_to [; return self.is_over;],
  has open door;

!*******************************************************************************
!*** The inside
!*******************************************************************************
Class Inside
  with
  u_to "It is not yet that time...",
  d_to "That is no longer your place.",
  cant_go "There is no passage in that direction.",
  each_turn [;
     if (random(5) == 1) {
        switch (random(5)) {
           1: "^A blast of thunder rattles the building.";
           2: "^You hear a loud crash and see a flash of light through the
              cracks in the boards covering the windows.";
           3: "^The building shudders under a sudden gust of wind.";
           4: "^A flash of lightning can be seen through the cracks between
              the boards, followed by a sudden blast of thunder.";
           5: "^There is a brief rattle of hail on the roof.";}}],
  has light;

Inside Vestibule "Vestibule"
  with description
     "This small room is the entryway for the church. The years of neglect
     are obvious; the floorboards are rotten and warped and what were probably
     once stained glass windows are shattered and boarded up. Dirt and debris
     covers the floor. A set of double doors leads south back to the outside
     while a large archway leads north into the sanctuary. Overhead, there is
     an open trap door in the ceiling at about twice your height.",
  n_to Sanctuary,
  s_to Porch,
  u_to [;if (Railing_Section.is_under ~= Steeple_Chamber)
            "The opening in the ceiling is too far up for you to reach.";
         else
            return Railing_Section;];

Object Trap_Door "trap door" Vestibule
  with name
     "trap" "door" "hole" "ceiling" "opening",
  description
     "The opening in the ceiling seems to lead to another room overhead, but
     there doesn't seem to be any way to get to it.",
  has scenery;

Inside Sanctuary "Sanctuary"
  with description
     "Once the heart of the church this room is now cold, dark and empty.
     Debris is scattered among the sagging pews and only shards of broken
     glass remain of the stained glass windows. Most of the interior
     fixtures have been removed, but a large portrait of Christ stares down
     at you from above the archway to the south. The pulpit still stands to
     the north.",
  before [;
     Pray:
        "You pray, with no result. You sense somehow that your prayers are not
        so much being unheard as they are ignored.";],
  n_to Pulpit,
  s_to Vestibule,
  u_to [;if (Railing_Section.is_under == Near_Painting)
            return Railing_Section;];

Fake_Object Distant_Pulpit "pulpit"
  with name
     "pulpit" "podium",
  description
     "A simple raised platform at the front of the church, it supports a simple
     wooden podium.",
  found_in Sanctuary Near_Painting,
  has static scenery;

Object Pews "pews" Sanctuary
  with name
     "sagging" "pews" "seats",
  description
     "Once, these rows would have been filled with worshippers. Now, they
     only contain dust and debris.",
  after [;
     Enter:
        "You sit in the pew. For a moment, the storm seems to retreat and
        you are blessed with a brief moment of peace.";],
  has static scenery enterable open transparent pluralname;

Inside Near_Painting "Near Painting"
  with description
     "You are standing on top of the railing section near the large painting
     of Christ. From this location, you notice that the eyes in the painting
     are cut out and there are holes behind them.",
  before [;
     Drop:
        move noun to Sanctuary;
        print_ret (The) noun, " falls to the floor below.";],
  d_to Railing_Top,
  cant_go "~Down~ is really your only option.";

Object Eyes "eyes of painting" Near_Painting
  with name
     "eye" "eyes" "hole" "holes",
  description
     "The eyes of the painting are cutouts. There are holes and an open space
     behind the eyes.",
  before [;
     Search:
        if (Curtain has general)
           "You are looking into the small room in the steeple. You can see
           past a faded purple curtain to a small table which is holding
           two heavy glass bottles.";
        else
           "You find yourself looking into a small enclosed space covered
           with a faded purple curtain.";],
  has pluralname scenery;

Fake_Object Distant_Bottles Near_Painting
  with name
     "heavy" "glass" "bottles",
  description
     "The two bottles of heavy glass are sitting on the table. One glows with
     a vivid green light and the other with a pale blue light.",
  has scenery;

Bottle Distant_Green_Bottle "green bottle" Near_Painting
  with
     color "vivid green",
  name
     "vivid" "green",
  before [;
     Take, Attack, Open, ThrownAt:
        "You can't do anything to the green bottle from here.";],
  has scenery;

Bottle Distant_Blue_Bottle "blue bottle" Near_Painting
  with
     color "pale blue",
  name
     "pale" "blue",
  before [;
     Take, Attack, Open, ThrownAt:
        "You can't do anything to the blue bottle from here.";],
  has scenery;

Inside Pulpit "Pulpit"
  with name
     "pulpit",
  description
     "From this raised platform you can see the entire inside of the church.
     The pulpit is empty except for the podium which rises from the center.
     A small door is visible behind the podium to the north.",
  before [;
     Pray:
        "You pray, with no result. You sense somehow that your prayers are not
        so much being unheard as they are ignored.";],
  s_to Sanctuary,
  n_to Office;

Object Podium "podium" Pulpit
  with name
     "podium" "stand" "lectern" "carved" "wooden",
  description [;
     print "This carved wooden podium is where the leader of this church would
     have addressed his or her followers. Now, from the podium, you can only
     see rows of empty pews and a lone painting of Christ, staring blankly down
     from the south wall.";
     if (parent(Book) == self)
        " A large black book is resting open on the podium.";
     else
        new_line; rtrue;],
  has supporter static scenery;

Object Book "large black book" Podium
  with name
     "large" "black" "book",
  description
     "At first you thought this book was a Bible, but now you realize that you
     were mistaken. The large, black, leather-bound tome contains passages
     you find disturbing, and uncomfortably familiar.",
  before [;
     Read:
        "Much of the book has been damaged by moisture and rats, but some of
        the passages are still legible. One in particular sticks in your
        mind... ~The way to understand another is through their eyes, because
        the eyes are the windows of the soul.  Through the eyes the soul may
        seen by those who are sensitive, and through the eyes the soul my be
        taken by those who have pledged themselves to the ones who wait
        beyond.~";
     Take:
        give self ~concealed;],
  has concealed;

Object Painting "painting"
  with name
     "painting" "portrait" "of" "Christ",
  description
     "As you look at the painting, a memory seems to float to the surface of
     your mind.  You remember standing in this church and looking at that
     painting. And you remember it staring back at you, with malevolent,
     vivid green eyes...",
  before [;
     Take:
        "The painting is too high up on the wall to do anything with.";],
  found_in Sanctuary Pulpit Near_Painting,
  has scenery;

Object Distant_Eyes "eyes in painting"
  with name
     "eyes",
  description
     "There is something unusual about the eyes of the painting, but it is
     too far away to see clearly.",
  found_in Sanctuary Pulpit,
  has scenery;

Inside Office "Small Office"
  with description
     "This small office has the same run-down appearance of the rest of the
     church. Debris covers the floor and a trickle of water comes in around
     the boards covering a broken window. A desk stands in the middle of the
     room and an empty bookshelf sits against one wall. A pile of ashes marks
     where a fire once burned in the middle of the floor. A door to the south
     leads back to the sanctuary.",
  s_to Pulpit;

Object Desk "desk" Office
  with name
     "old" "wooden" "desk",
  description
     "An old wooden desk. Scarred and water-damaged, it has been here for
     some time.",
  has supporter static scenery transparent;

Object Bookshelf "bookshelf" Office
  with name
     "bookshelf" "shelf" "shelves" "bookcase",
  description
     "A warped, wooden bookshelf.",
  before [;
     Push, Pull:
        if (self hasnt general) {
           move Grimoire to location;
           give self general;
           "You push the bookshelf to one side, revealing an old book bound
           in a strange reddish cover.";}
     Search:
        if (self hasnt general)
           "There seems to be something between the bookshelf and the
           wall.";],
  has container static scenery transparent;

Object Grimoire "old grimoire"
  with name
     "book" "volume" "grimoire" "old" "red" "reddish" "spellbook",
  description
     "A very old volume, bound in some strange reddish material. At first you
     thought it was leather but it seems to be more closely akin to
     snakeskin. The book seems to be a weird grimoire or spellbook and mostly
     concerns the soul or spirit.",
  before [;
     Read:
        "The book contains several rituals and procedures all involving the
        soul or spirit.  The first describes a ritual through which the soul
        can be removed from a person's body and placed in a specially prepared
        container. The soul remains in the container even if the person's
        body dies.^^A second ritual can be employed to use the stored soul as
        a receptacle for the sin of another person.  This allows the possessor
        of another's soul to perform any acts they wish without having to answer
        for those acts in the next world.";],
  has;

Object Journal "journal" Desk
  with name
     "old" "book" "journal" "diary" "page" "pages",
  initial
     "An old book lies on the desk.",
  description [;
     if (self hasnt general)
        "A book of blank pages, the kind that would be used to keep a ledger
        or a journal. Unfortunately, someone has torn out most of the
        pages and only blank sheets remain.";
     else
        "A book of blank pages, the kind that would be used to keep a ledger
        or a journal. Someone has torn out most of the pages, but the ashes
        have made the indentations from the last entry legible.";],
  before [;
     Search:
        "Looking carefully at the book you notice that the last entry must
        have been made with great force. The entry has left indentations on
        the first blank page in the book.";
     Read:
        if (self hasnt general)
           "But, the pages are all blank!";
        else
           Achieved(3);
           "You read the last entry from the journal... ~I cannot continue.
           The more I come to know her the more I realize that I cannot
           continue to corrupt her.  She was pure and innocent before I took
           her, and that innocence allows her to continue to trust me even
           after what I have done.  I only hope that the taint of that which
           I have done has not stained her irrevocably and that she will go
           to her proper place after I release her... and that I shall go to
           mine.~";],
  has;

Object Pile_of_Ash "pile of ash" Office
  with name
     "pile" "of" "ash" "ashes" "fire",
  description
     "It seems as if a good sized fire once burned here; it is amazing that the
     entire room did not catch fire. From the occasional bit of unburned
     material it seems as if whoever built the fire was burning books,
     probably from the now empty bookcase. Mixed in with the ashes you find
     a number of jagged shards of glass.",
  before [;
     Take:
        if (Ash notin player) {
           move Ash to player;
           "You pick up a handful of ashes.";}
        else
           "You already have a handful of ashes.";
     Search:
        <<Examine Broken_Bottle>>;],
  has scenery;

Object Ash "handful of ashes" Limbo
  with name
     "handful" "of" "ashes" "ash",
  description
     "A handful of old ashes.",
  before [;
     Drop, ThrowAt:
        move self to Limbo;
        if (location ofclass Outside)
           "You toss down the ashes, which scatter in the wind.";
        else
           "You toss down the ashes, which scatter among the debris on the
           floor.";
     Rub, Insert, PutOn:
        if (second == Journal) {
           give Journal general;
           "As you rub the ashes against the page, the indentations fill in
           and the last entry becomes visible.";}];

Object Broken_Bottle "broken shards of glass" Office
  with name
     "broken" "jagged" "bottle" "shards" "glass",
  description [;
     print "A number of shards of broken glass lies mixed in with the ashes.
     From the look of the fragments, it was some kind of thick walled bottle
     that was smashed into the floor.";
     if (Stopper hasnt moved)
        print " A curious object lies in with the shards of glass. It looks like
        a heavy rubber stopper with a chain hanging from it.";
     new_line; rtrue;],
  before [;
     Take:
        "You cut your finger on the glass as you attempt to pick it up.";],
  has pluralname scenery;

Object Stopper "heavy stopper" Office
  with name
     "heavy" "stopper" "rubber" "chain" "object" "lead" "weight",
  description
     "A heavy rubber stopper, such as would be used to close a bottle. Bits of
     wax still cling to the edge showing where the bottle was sealed with the
     stopper in place. A fine chain hangs from the stopper and ends in an oddly
     carved lead weight.",
  before [;
     Take:
        give self ~concealed;],
  has concealed;

Object Robe "embroidered robe" Office
  with name
     "embroidered" "red" "robe" "robes",
  initial
     "A richly embroidered robe hangs beside the door.",
  description
     "Richly embroidered red robes, such as might be worn for ceremonial
     purposes.",
  has clothing;

Inside Steeple_Chamber "Steeple Chamber"
  with description
     "This small chamber is about halfway up the steeple of the church. Rain
     and wind from the storm outside blows in through an open window frame and
     water collects in puddles on the warped floor, mixing with the droppings
     of the birds, or perhaps bats, which can be heard fluttering around
     overhead. Looking up, you can see a maze of beams and supports that form
     the interior of the steeple. Rain pours in from an opening higher in the
     steeple and trickles out through a trap door in the floor.",
  n_to Steeple_Door,
  u_to [;if (parent(Rope) ~= location)
            "There is no good way to climb upwards from here.";
         else
            return Rope;],
  d_to [;if (Railing_Top.is_over ~= Vestibule)
            "The drop to the floor of the vestibule below is too far for you
            to jump safely.";
         else
            return Vestibule;];

Inside Inner_Chamber "Inner Chamber"
  with description
     "Even with the door open and the wind from the storm blowing in this room
     is rank with a fetid odor. The floor is piled high with trash and half
     eaten scraps of food. There are no windows, only the broken door frame
     to the south. An old sofa is pushed against one wall and a heavy table
     sits in the middle of the room. A curtained archway is to the north.",
  before [;
     Smell:
        "The room smells of urine, sweat and rotting food.";],
  s_to Steeple_Door,
  n_to Curtain;

Object Steeple_Door
  with name
     "heavy" "wooden" "door" "barred" "handle" "knob" "splintered",
  short_name [;
     if (self hasnt open)
        print "heavy wooden door";
     else
        print "splintered frame";
     rtrue;],
  description [;
     if (self hasnt open)
        "This heavy wooden door looks to be newer and of more sturdy
        construction than the rest of the church. A large, heavy handle is
        set into the door.";
     else
        "The door has been wrenched from its opening.  Only the splintered
        remains of the frame remain.";],
  when_open [;
     print "A gaping splintered opening lies to the ";
     if (location == Steeple_Chamber)
        "north.";
     else
        "south.";],
  when_closed
     "The heavy wooden door to the north is closed.",
  door_to [; if (location == Steeple_Chamber) {
                Achieved(2);
                return Inner_Chamber;}
             else
                return Steeple_Chamber;],
  door_dir [; if (location == Steeple_Chamber) return n_to;
              return s_to;],
  found_in Steeple_Chamber Inner_Chamber,
  has door static openable ~open locked;

Object Curtain "curtain" Inner_Chamber
  with name
     "curtain" "curtained" "archway" "cloth" "purple",
  description [;
     if (self hasnt general)
        "The curtain is an old and faded purple. It looks as if it may have
        been a tablecloth initially.";
     else
        <<Examine Mirror>>;],
  describe
     "^A curtain of purple cloth hangs in the archway.",
  door_to [;
     if (self hasnt general) {
        give self general;
        move Mirror to location;
        Achieved(5);
        "You push the curtain aside and pause. On the other side of the
        curtain is a room much like the one you are in. A figure stands in
        the archway, apparently about to enter your room, and it is the sight
        of this figure which has brought you up short. It is, or was, human... once.
        Now, it is a withered mass of decaying flesh. It's clothing hangs
        in tatters and it is caked in mud and grave mold. Patches of hair
        hang from it's scalp and bones are visible in places through it's skin.
        The only thing that remains intact are it's eyes; pale blue and now
        wide open and staring.^^The creature raises its hand to you, and you
        find yourself doing the same. You reach out your arm and touch...
        ^^^^...a cold unyielding surface of polished glass.^^^^Suddenly, the
        realization of what you are seeing comes home to you, and you step back
        from the mirror with a cry.";}
     else
        "You glance towards the mirror but realize that there is no need to
        enter its reality, for the reality in the mirror is your own.";],
  door_dir n_to,
  has door static open;

Object Mirror "mirror" Limbo
  with name
     "mirror" "glass" "frame",
  description [;
     if (self hasnt open)
        "A highly polished mirror in a plain wooden frame. The mirror reflects
        the contents of the room you are in and you find yourself averting
        your gaze from what you see there. You note that the mirror frame
        is hinged on one side.";
     else
        "A highly polished mirror in a plain wooden frame. The mirror has
        been swung away from the wall, revealing two holes at about eye
        level.";],
  before [;
     Open, Pull:
        if (self has open)
           "The mirror doesn't swing any further from the wall.";
        move Inner_Holes to location;
        give self open;
        "You swing the mirror away from the wall, revealing a pair of holes
        cut in the wall behind it.";
     Close, Push:
        if (self hasnt open)
           "The mirror is firmly against the wall.";
        move Inner_Holes to Limbo;
        give self ~open;
        "You swing the mirror back against the wall.";],
  has static scenery;

Object Inner_Holes "holes in the wall" Limbo
  with name
     "eye" "hole" "holes",
  description
     "The holes are small, about the size of your thumb, and are at about eye
     level.",
  before [;
     Search:
        if (Sanctuary has visited)
           "You look through the holes and find yourself looking down into the
           sanctuary of the church with a clear view of the pulpit. From the
           angle, you realize that you are looking down through the eyes of the
           painting of Christ.";
        else
           "You find yourself looking down into the sanctuary of a church.
           Rows of dust covered benches face a raised pulpit and podium.";],
  has pluralname scenery;

Object Table "heavy wooden table" Inner_Chamber
  with name
     "heavy" "wooden" "table",
  description
     "A heavy table of rough cut wooden planks.  Curious symbols are carved
     into the wood and the top is oddly stained.",
  before [;
     Take, Push, Pull:
        "The table is too heavy for you to move.";
     Turn:
        "A sudden desire to rearrange the furniture?";],
  has static supporter;

Object Lamp "oil lantern" Table
  with name
     "flickering" "oil" "lantern" "lamp",
  description
     "A old oil-burning lantern. Possibly brass, but very tarnished.  The
     glass chimney is almost opaque with soot and grime.",
  has light;

Fake_Object Bottles "pair of glass bottles" Table
  with name
     "pair" "of" "bottles",
  initial
     "A pair of heavy glass bottles sit on the table.",
  description
     "The bottles are made of a heavy, leaded glass and closed with a cork
     stopper sealed with wax. Inside the bottles, an oddly shaped lead weight
     hangs like a pendulum from a string. The bottles glow faintly.",
  before [;
     Take:
        <Take Blue_Bottle>;
        <Take Green_Bottle>;
     Attack:
        if (random(2) == 1)
           <<Attack Blue_Bottle>>;
        else
           <<Attack Green_Bottle>>;],
  has static;

Bottle Blue_Bottle "blue bottle" Table
  with name
     "pale" "blue",
  color "pale blue",
  open_bottle [;
     deadflag = 1;
     "A cloud of faintly glowing blue mist rises from the bottle and hangs in
     the air before you. You feel a brief moment of freedom, of release.^^
     Then, you realize that ", (the) Old_Man, " has started chuckling to
     himself. The first jolt of pain hits. The cloud suddenly jerks and
     starts moving downward, as if drawn by a strong suction. The pain
     intensifies and you drop first to your knees, then flat onto the ground
     as if trying to follow the mist, which is now soaking into the earth.
     The pain becomes excruciating. The last thing you see, as everything
     fades to black, is ", (the) Old_Man, " standing over you, laughing...";],
  has concealed;

Bottle Green_Bottle "green bottle" Table
  with name
     "vivid" "green",
  color "vivid green",
  open_bottle [;
     deadflag = 2;
     Achieved(6);
     print (The) Old_Man, " suddenly realizes what you are doing.  With a
     scream of ~Noooo!~, he throws himself towards you";
     if (((location == Inner_Chamber) && (parent(Lamp) == Table)) ||
         ((location ofclass Inside) && (parent(Lamp) == location))) {
        give Lamp general;
        print " knocking over the lantern in the process";}
     if ((location ofclass Inside) && (parent(Lamp) == Player)) {
        give Lamp general;
        print " knocking the lantern from your hands in the process";}
     print ". As he collapses at your feet, a glowing green mist rises from
     the bottle and hangs before him. ~No!~, he whispers.^^Then, the mist
     starts moving slowly downward as he doubles over and screams in agony.
     As the mist soaks into the ground, he looks up at you and screams,
     ~I'll get my revenge~  I'll see you in hell.  I'LL SEE YOU IN HELL!
     Ia! Ia! Fthagn...  Aaaaagh...!~^^His body collapses to the ground.  As
     you watch the body blackens and decays until, within only a few moments,
     what is left appears to be a many-months old corpse.^^";
     if (Lamp has general)
        print "You hear a sudden *Whumph!* and look around. The spilled oil
        from the broken lantern has ignited.  ";
     else
        print "With a loud *CRAK*, lightning strikes the steeple of the
        church.  With a roar, the wooden structure catches fire.  ";
     if ((parent(Blue_Bottle) == player) && (location ofclass Inside))
        print "Clutching the second bottle to you, you race outside.  ";
     if ((parent(Blue_Bottle) == Table) && (location == Inner_Chamber))
        print "You grab the blue bottle from the table and race outside.  ";
     if ((parent(Blue_Bottle) == location) && (location ofclass Inside))
     if (parent(Blue_Bottle) ~= player)
        print "Responding to an urge you cannot explain, you run to ",
        (the) parent(Blue_Bottle), ", grab it, and then run away from the
        church. ";
     "You watch for a moment as flames consume the church. With a crackling
     roar, the steeple collapses inward and a plume of flame shoots skyward.^^
     Clutching the bottle to you, you make your way down the hill.";],
  has concealed;

Object Sofa "old sofa" Inner_Chamber
  with name
     "old" "sofa" "furniture" "lounge" "bed",
  description
     "An old sofa, so patched, faded and stained that its original color can no
     longer be determined. An unidentifiable odor rises from it.",
  has static scenery supporter enterable;

Object Old_Man Sofa
  with
     is_following false,
  name
     "old" "man" "silas" "wingate",
  short_name [;
     if (self hasnt general)
        print "old man";
     else
        print "Silas";
     rtrue;],
  description [;
     "An old, extremely gaunt man. ", (The) self, " is drawn and pale, his
     hair long and wild and his clothing filthy, torn and unkempt. But, an
     active intelligence burns behind the vivid green eyes with which he
     watches you; eyes which also contain a taint of madness.";],
  react_before [;
     if ((action == ##Tie) && (second == self))
        print_ret (The) self, " draws back as you approach. ~Don't be
        foolish!~ he hisses.";],
  life [;
     Answer, Tell:
        print_ret (The) self, " laughs softly. ~Do you think your opinions
        matter to me anymore?~";
     Ask:
        switch(second) {
           'church', 'here', 'home':
              print_ret (The) self, " looks around. ~Yes.. I knew you would
              return here. This is your home... only one you have left. The
              villagers would not have welcomed you before; they certainly
              will not now. And besides, the bottle will keep you here. *I*
              will keep you here.~";
           'village', 'villagers':
              "~Fools!  Pathetic weaklings! They cannot understand. *Will*
              not understand.  They would rather stay with their pathetic,
              safe god than open their eyes to the true masters of the
              universe. You understood. You saw. Then, they caused you to
              doubt yourself. Caused you to doubt your decision.~";
           'decision', 'happened', 'result':
              "~Why, to become immortal, of course! But, you changed your
              mind. You freed her; freed her soul. But she had already
              absorbed too much of your sin, hadn't she? She went to
              eternal punishment, for *your* sins. And so, you tried to
              to kill yourself. But, you forgot about this, didn't you?
              You forgot where *your* soul was.";
           'she', 'her', 'woman':
              "~I still don't know what your fascination with her was.
              Certainly the other villagers never approved of your
              'relationship'.~";
           'me', 'myself', 'i':
              print_ret (The) self, " laughs. ~What did you expect? After you
              saw what happened to *her* and realized that *you* were the one
              responsible you went, shall we say, mad? You always were weak.
              There was only one thing to be done, wasn't there?~";
           'bottle', 'bottles':
              "~Beautiful, aren't they? That's what *you* used to say. I
              remember how you used to stare at them for hours. How you
              used to try to understand them...";
           'blue':
              "~Yes. That is you. Or, should I say, *was* you. It's *mine*
              now. The receptacle for *my* sin.";
           'green':
              "~You see, I am safe now... I have transferred my sin to your
              soul. *If* I ever decide to release it, I will go to *your*
              reward, while you will go to *my* punishment.~";
           'soul':
              "Safe, I promise you. They are safe.";
           'book': "You never had the stomach to read it before. Why the
               interest now?";
           'dog':
              "A useful creature. Quite intelligent, you know.";
           'man', 'him', 'himself':
              give self general;
              give self proper;
              "What?  You've forgotten me? How could you forget Silas?
              Your servant... your colleague... your... teacher...?";}
        print_ret (The) self, " giggles uncontrollably.";
     Attack:
        print_ret (The) self, " easily avoids your blows. He stares at you
        with his vivid green eyes. ~You were no match for me before... You
        are certainly no match for me now!~";
     ThrownAt:
        move noun to location;
        print_ret (The) self, " easily avoids ", (the) noun, ". ~Pathetic!~
        he says.";
     Show, Give:
        print_ret (The) self, " isn't interested.";],
  daemon [d p;
     d = parent(self);
     p = location;
     if ((location == Inner_Chamber) || (p == d)) {
        self.is_following = true;}
     else {
        if (self.is_following) {
           move self to p;
           "^Babbling to himself, ", (the) self, " wanders after you.";}}
     rtrue;],
  has male animate;

Inside Belfry "Belfry"
  with description
     "The belfry of the church, high up inside the steeple. You are hanging
     from a maze of support beams and trusses with the nearest solid floor
     far below you. Large open frames give a view of the surrounding forest
     and of the town at the base of the hill. They also allow the fury of the
     storm to pass in unimpeded. You can see the branch of an oak tree just
     outside the southern frame.",
  before [;
     Jump:
        deadflag = 1;
        "You leap off of the support and plummet to the floor below. The last
        thing you hear is the peal of thunder outside.";
     Climb:
        if (noun ~= Rope)
           "You climb around on the supports a bit, but are unable to move much
           further up or down the steeple.";
     Drop:
        if (noun ~= Rope) {
           move noun to Steeple_Chamber;
           print_ret (The) noun, " tumbles through the beams to the floor
           below.";}
        else {
           move Rope to location;
           "The rope swings freely from the bell again.";}],
  s_to Top_Of_Tree,
  u_to "There doesn't seem to be any way to climb higher into the steeple.",
  d_to [; if (Rope in location)
             return Rope;
          else
             "The drop to the floor below is too far for you to climb
             safely.";],
  cant_go "You climb around on the supports a bit, but are unable to make much
          progress in that direction.";

Object Bell "bell" Belfry
  with name
     "bell",
  description [;
     if (self hasnt general)
        "This massive bell once summoned worshippers to the church. Now, it
        only serves as the home for birds and rodents. The mount for the bell
        has broken on one side, and the other is barely holding on. You are
        surprised that it has not broken free and plummeted from the steeple
        before this.";
     else
        "The bell lies half buried in the mud. The fall has cracked and dented
        it to the point where it will obviously never ring again.";],
  describe [;
     if (self hasnt general) {
        print "^A massive bell hangs here, from a damaged mount.";
        print "^A heavy rope is attached to the bell and ";
        if ((Rope.is_tied_to ~= 0) && (Rope.is_tied_to in location))
           print "tied to ", (the) Rope.is_tied_to, ".";
        else
           print "hangs through the beams to the room below.";
        new_line; rtrue;}
     else
        "^A broken bell lies half-buried in the mud.";],
  before [;
     Take:
        "The bell is far too heavy to move.";
     Push, Pull:
        if (Rope.is_tied_to == Steeple_Door) {
           Achieved(4);
           give self general;
           give Steeple_Door open ~openable;
           move Bell to Front_Church;
           move Rope to Limbo;
           Rope.is_tied_to = 0;
           give Rope absent;
           "You shove against the bell. For a few seconds, the support takes
           the strain. Then, with a loud cracking noise, the bell tears loose
           from the beam and falls from the steeple. You hear the sound of
           splintering wood from below and then duck aside as the splintered
           remains of the door are pulled past you and out the open window. A
           metallic crash is heard from the ground outside."; }
        else {
           if (self hasnt general)
              "A good shove would probably cause the bell to plummet from the
              steeple. Of course, if it did, you would never be able to get it
              back up here again so you decide against it for now.";
           else
              "The bell has buried itself too far in the mud to move.";}
     Ring:
        if (self hasnt general)
           "The bell makes a muted ~CLANK~.";
        else
           "This bell will never ring again.";],
  has static;

Object Rope "heavy rope"
  with
     is_tied_to 0,
  name
     "heavy" "worn" "frayed" "hanging" "sturdy" "rope",
  describe [;
     if (location == Steeple_Chamber) {
        print "^A frayed but heavy rope hangs from somewhere overhead.";
        if (self.is_tied_to ~= 0) {
           if (self.is_tied_to ~= Steeple_Door)
              print " There is ", (a) self.is_tied_to, " hanging from the end
              of the rope.";
           else
              print " The rope is tied to the handle of the door.";}
        new_line;}
     rtrue;],
  description [;
     print "A frayed but heavy section of rope.";
     if (self.is_tied_to ~= 0)
        print " ", (The) self.is_tied_to, " is tied to the rope.";
     new_line; rtrue;],
  before [;
     Tie:
        if (second == player)
           "Trust me, suicide is *not* the answer here...";
        if (second == self)
           "Practicing your knot tying?";
        if (second == Bell)
           "The rope is already securely attached to the bell.";
        self.is_tied_to = second;
        if (parent(second) ~= player) move Rope to parent(second);
        "You tie the rope securely to ", (the) second, ".";
     UnTie:
        if (self.is_tied_to == 0)
           "But, the rope isn't tied to anything!";
        if (second ~= 0) {
           if (second == Bell)
              "You are unable to loosen the rope from where it is attached to
              the bell.";
           if (second ~= self.is_tied_to)
              "But, the rope isn't tied to ", (the) second, ".";}
        print "You untie the rope from ", (the) self.is_tied_to, ".";
        self.is_tied_to = 0;
        new_line; rtrue;
     Drop:
        if (parent(self.is_tied_to) == player)
           "You release the rope, but it remains attached to ",
           (the) self.is_tied_to, " which you are holding and doesn't fall
           very far.";
     Climb:
        <<Go self>>;
     Pull:
        if (location == Steeple_Chamber)
           "You hear a metallic <CLANK> from somewhere overhead.";
        else
           "The bell moves slightly in its mount and emits a metallic
           <CLANK>.";],
  react_before [;
     if (action == ##Go) {
        if (self in player) {
           "The rope is securely attached and you can't go very far while
           holding it.";}
        if (self.is_tied_to in player) {
           print_ret (The) self.is_tied_to, ", which you are holding, is tied
           to the rope which prevents you from moving very far.";}}],
  react_after [;
     if (noun == self.is_tied_to) {
        if ((action == ##Drop) || (action == ##Insert) ||
            (action == ##ThrowAt) || (action == ##PutOn) ||
            (action == ##PutUnder)) {
           move self to parent(self.is_tied_to);
           if (location == Belfry) move self to Belfry;}
        if ((action == ##Take) || (action == ##Remove)) {
           move self to player;}}],
  door_to [; if (location == Steeple_Chamber) return Belfry;
             return Steeple_Chamber;],
  door_dir [; if (location == Steeple_Chamber) return u_to;
              return d_to;],
  found_in Steeple_Chamber Belfry,
  has door ~openable open;

Object Beams "beams" Belfry
  with name
     "support" "supports" "beam" "beams" "truss" "trusses",
  description
     "Rough hewn from wood, the beams and trusses are dirty and covered with
     bird and animal droppings which make footing treacherous.",
  has pluralname static scenery;

Object Town "town"
  with name
     "town" "village" "city" "base" "hill" "lights",
  description
     "The small town huddles at the base of the hill. A few lights shine
     defiantly against the storm but for the most part it seems quiet, as if
     its inhabitants are waiting inside their homes for the fury to pass them
     by.",
  found_in Top_Of_Tree Belfry,
  has scenery;

Object Debris "debris"
  with name
     "trash" "debris" "junk" "stuff" "litter" "dirt",
  description
     "Sticks, leaves, unidentifiable trash and scraps of paper litter the
     floor.  Some of it looks as if it has been here for years and none of
     it appears useful.",
  before [;
     Take:
        "You have no use for any of the trash.";],
  found_in [; if (location ofclass Inside) rtrue;],
  has scenery;

Object Inside_Windows "broken windows"
  with name
     "stained" "glass" "broken" "window" "windows" "board" "boards" "frame",
  description
     "Once these frames may have contained magnificent stained glass windows,
     each showing in imagery some tale of religious significance. Now, only
     fragments of colored glass remain. The frames are boarded up and the
     wind whistles mournfully through the cracks.",
  before [;
     Take, Push, Pull, Open, Close:
        "The boards are nailed firmly in place.";],
  found_in Vestibule Sanctuary Pulpit,
  has scenery pluralname;

!*******************************************************************************
!*** Menus
!*******************************************************************************
Menu Help_Top "The Awakening";
!**   with description
!**      "Make a selection...";

Option -> "For new players"
  with description [;
     print "~The Awakening~ is a text adventure game. You interact with the game by
     typing phrases like EXAMINE CHAIR or OPEN DOOR and the game responds by
     describing the world around you and the results of your actions.^^";

     print "There are certain commands which are common to all adventure games. You
     move around by giving the compass direction in which you want to go; for example
     NORTH or SOUTHEAST. All directions can be shortened to one or two letters; in
     this case N or SE. You can also go UP or DOWN (U or D). In some locations IN or
     OUT work. You can also ENTER or CLIMB things.^^";

     print "When you first enter a location, the game will describe the location to
     you. After that, it will only tell you the name of the location. You can see the
     full description at any time by typing LOOK (or L). You can tell the game to
     always give the full description by entering VERBOSE.^^";

     print "You interact with the environment in many ways. You GET items to pick them
     up and DROP items to put them down. You can also PUT items IN things or GET items
     FROM others. Fairly complex sentences are possible, for example GET THE RED BRICK
     AND THE BLUE BALL FROM THE METAL BOX THEN THROW THE BRICK AT THE WINDOW is a valid
     input.^^";

     print "You may encounter people or other creatures while exploring the world of
     the game. You can ask these people questions by typing ASK person ABOUT topic and
     tell them things by saying TELL person ABOUT topic. You can also SHOW them things.
     You can ask them to do things with PERSON, COMMAND. For example, to ask Bob to pick
     up the book, type BOB, GET THE BOOK.^^";

     print "To look at an item more closely, EXAMINE it. (EXAMINE can be abbreviated
     as X) To get a list of everything you are carrying type INVENTORY (or I). Some
     other useful commands you can try are PUSH, SEARCH, SHAKE, THROW, RUB, KICK, CLIMB
     or READ. A part of any text adventure is learning what words the game knows. ~The
     Awakening~ knows hundreds of words, so feel free to try anything.^^";

     "If you get really stuck, you can access a hint menu at any time by typing HINTS.
     If you would rather not be tempted, you can turn the hint feature off by entering
     HINTS OFF.";];

Option -> "About this game"
  with description [;
     print "~The Awakening~ is my first piece of interactive fiction. It is based
     (very) loosely on several stories by H.P. Lovecraft, most notably ~The Outsider~,
     ~The Terrible Old Man~ and ~The Two Black Bottles~.^^";

     print "I mainly wrote ~The Awakening~ as a learning exercise. I had started several
     other games, but they were all too big and I found myself becoming overwhelmed by
     the scope of the game along with learning the language. I was inspired to try a
     smaller game by the Textfire games which came out in April of 1998. ~The Awakening~
     became much larger than any Textfire, but the inspiration was there.^^";

     print "It took longer to finish the game than I expected. My main problem involved
     the rope that is encountered in the game. Originally, it was far more complex than
     what is now implemented. Even what is there now doesn't work quite as well as I
     would have liked.^^";

     "I hope you enjoy the game. Since it is my first game, feedback is especially
     welcome. At this time (July 1998) my most stable e-mail address is:^^
     Dennis_Matheson@@64compuserve.com^^
     or, you can reach me by snail mail at:^^
     Dennis Matheson^
     4068 Maxanne Dr.^
     Kennesaw, GA  30144^^
     Enjoy!";];

Option -> "Credits and Acknowledgments"
  with description [;
     print "This game would not exist without the help and efforts of several people^^";

     print "First, credit must be given to Graham Nelson for developing the Inform
     compiler without which this game would not have been possible. Inform, a language
     for developing interactive fiction games, is available via ftp from:^^
     ftp.gmd.de/if-archive/inform^^";

     print "Second, the menus used in this game (including this one) are developed
     using L. Ross Raszewski's menu libraries.  These libraries (AltMenu.h, DoMenu.h and
     Hints.h) are also available from ftp.gmd.de.^^";

     "And finally, thanks must be given to the many fine people on
     rec.arts.int-fiction who have answered so many of my questions. Thanks go to
     Andrew Plotkin, L. Ross Raszewski, Joe Mason, Joyce Haslam, Mary Kuhner,
     Michael Gentry, ~FemaleDeer/Doeadeer3~ and all the others whose names I have
     misplaced. Thanks, all of you.";];

Option -> "License and Copyright info"
  with description [;
     print "1) Copyright: ~The Awakening~ is copyright 1998 by Dennis Matheson.^^";

     print "2) Distribution: ~The Awakening~ may be distributed freely by any means
     so long as a) This notice remains intact and b) no charge other than a nominal
     fee to cover the cost of distribution is made. It may be included as part of
     a commercial distribution provided that my permission is given first.^^";

     print "3) Derivative Works: ~The Awakening~ is distributed with its source code.
     Derivative works are permitted of ~The Awakening~ so long as a) They are clearly
     identified as such and reference is made back to this original version and b)
     such works must freely redistributable under the same terms as stated above.^^";

     print "4) Support: ~The Awakening~ is distributed without any support of any
     kind. Feel free to contact me at the address given, but I make no guarantee that
     I will respond.^^";

     "5) Warranty: ~The Awakening~ is distributed totally without any warranty of any
     kind. The entire risk of using this program is totally assumed by the user.";];

Option -> "Hints..."
  with description [;hint_menu.select();return 2;];

Option -> "Walkthru"
  with description [;
     print "Well, things could be starting off better here. Let's start by
     going UP to get out of this hole. Now, let's take a look around. Hmmm...
     Not much here. Maybe the church to the east has something. So, let's go
     EAST.^^";

     print "Not much here either. The main path seems to go to the southeast
     so let's follow it to the SOUTHEAST.^^";

     print "Nice doggie! Head NORTH to the front door. Oops! Guess that won't
     work. How can we get past this dog? Maybe if we ATTACK THE DOG it will
     leave.^^";

     print "That wasn't our best idea, was it? Better get out of here! Head off
     to the NORTHEAST. The dog is still following us so let's go on around the
     church to the NORTHWEST, SOUTHWEST and SOUTHEAST.^^";

     print "Hey, that worked pretty well! While the dog is tangled up let's
     take the opportunity and go NORTH.^^";

     print "All right! Our first points! Let's look around here a bit then
     go NORTH again. Not much better inside than out, is it? What's that trap
     door in the ceiling for? Doesn't seem to be any way to get up there so
     let's explore down here some more. Go on NORTH into the sanctuary.^^";

     print "What a dump. Not much left except a painting so let's EXAMINE THE
     PAINTING. That's interesting; apparently we've been here before. Head on
     to the NORTH some more and let's see what else we can remember.^^";

     print "EXAMINE THE PODIUM. Ah, a book. READ THE BOOK and see what else we
     can discover. I don't know about you, but I'm getting the impression that
     this is an unusual church. Let's head NORTH and check out the rest of the
     ground floor.^^";

     print "This room looks interesting. EXAMINE THE JOURNAL on the desk then try
     to READ THE JOURNAL. Well, somebody didn't like something they had written.
     SEARCH THE JOURNAL and see if we can find out anything. Indentations... Well,
     I've seen enough detective movies to know what to do next. EXAMINE THE ASHES
     then GET THE ASHES. OK, now RUB THE ASHES ON THE JOURNAL. Now we're getting
     somewhere! READ THE JOURNAL again.^^";

     print "Starting to get a bad feeling about this? Too bad those books were
     burned, they might have told us something. Think they (whoever ~they~ were)
     missed anything? SEARCH THE BOOKCASE. Ah ha! PUSH THE BOOKCASE then READ
     THE BOOK we have found.^^";

     print "I'm starting to get a feel for what is happening here. EXAMINE THE
     GLASS on the floor. Wonder what that was for? Well, there doesn't seem to
     be much more to do here so let's go back SOUTH a few times until we reach
     the Vestibule again. That trap door still looks inviting but we haven't
     found a ladder. Or have we?^^";

     print "Go SOUTH again to the Porch. EXAMINE THE RAILING. Well, it looks kind
     of ladder-like, doesn't it? GET THE RAILING. Good thing this church is in
     such bad shape. Now, go back NORTH and PUT THE RAILING UNDER THE TRAP
     DOOR. Now, CLIMB THE RAILING.^^";

     print "Hey, that worked! Let's see what we have here. Another door, let's
     try and OPEN THE DOOR. Locked? Now what? Not much here except for this rope.
     I guess it's a bell rope. PULL THE ROPE. Yep, a bell. I wonder if there's
     anything else up there? CLIMB THE ROPE and find out.^^";

     print "EXAMINE THE BELL. Well, maybe climbing that rope wasn't the best
     idea. I mean, the rope seem sturdy enough but this bell seems ready to fall
     at any point. PUSH THE BELL. Yes, fairly unstable. And that gives me an
     idea.^^";

     print "First we need another way out of here. Let's check to the SOUTH. OK,
     we're out on a limb. We can't get down from here without a ladder but we
     know where one of those is, don't we?^^";

     print "Let's go back NORTH then CLIMB THE ROPE again. Now, TIE THE ROPE
     TO THE DOOR. Good idea, huh? Go DOWN then GET THE RAILING. Now, go SOUTH
     twice and PUT THE LADDER AGAINST THE TREE. CLIMB THE LADDER and go NORTH.^^";

     print "Now, PUSH THE BELL and duck. That worked better than I had hoped! Go
     back SOUTH then DOWN. GET THE LADDER, go NORTH twice and PUT THE LADDER UNDER
     THE TRAP DOOR again. Now go back UP. Looks like we can go NORTH now.^^";

     print "Well, *this* is an interesting room, isn't it? Let's talk to the man in
     here for a while. ASK THE MAN ABOUT... a few things. Doesn't seem too helpful,
     does he? Well, let's do some more exploring on our own. Let's start by going
     NORTH.^^^^";

     print "Let's stop and reflect on this latest discovery a bit. Things are
     apparently a little worse than we thought. Let's EXAMINE THE MIRROR again then
     OPEN THE MIRROR. Now, LOOK THROUGH THE HOLES. Well, we know what was going on
     with that painting now.^^";

     print "OK, now let's EXAMINE THE BOTTLES on the table. EXAMINE THE BLUE BOTTLE
     and EXAMINE THE GREEN BOTTLE. Now, think about what we've read, the broken
     bottle we found, our ~condition~ and the distinctive feature of our ~friend~
     on the sofa. Well, there seems to be only one thing to do; OPEN THE GREEN
     BOTTLE or BREAK THE GREEN BOTTLE.^^";

     "Guess he wasn't expecting *that*! Now, what do we do about *our* situation?
     Looks like that will have to wait for the next game for that...^^";];

Menu Hint_Top "Hints"
  with description
     "Select a hint...",
  title_bar
     "The Awakening";

Menu -> "In the Mud";

HintTopic -> -> "How do I get out of here?";
Hint -> -> -> "Try going up.";

Menu -> "Outside the Church";

HintTopic -> -> "What can I do in the graveyard?";
Hint -> -> -> "Not much...";
Hint -> -> -> "Look around some.";
Hint -> -> -> "You could pick up the broken limb.";
Hint -> -> -> "But there really isn't anything to do here.";

HintTopic -> -> "How do I get past the dog?";
Hint -> -> -> "You could try leading it away.";
Hint -> -> -> "But it doesn't seem to want to follow you very far.";
Hint -> -> -> "Maybe if you gave it a reason to follow you?";
Hint -> -> -> "You could feed it something.";
Hint -> -> -> "If you had any food, that is.";
Hint -> -> -> "Maybe if you did something to make it mad?";
Hint -> -> -> "Try attacking the dog.";
Hint -> -> -> "OK, it's following you.  Now what?";
Hint -> -> -> "It's dragging that chain.  Maybe you can tangle it up somewhere.";
Hint -> -> -> "With the dog following you, walk completely around the church.";

HintTopic -> -> "How do I get into the hearse?";
Hint -> -> -> "You'll need the keys.";
Hint -> -> -> "And a ward to get past the spirit.";
Hint -> -> -> "Can't find a ward?  Some garlic might work.";
Hint -> -> -> "Oh yes, you will need a game that actually has a hearse in it!";

HintTopic -> -> "Is there anything special about the oak trees?";
Hint -> -> -> "Yes.";
Hint -> -> -> "Try climbing them.";
Hint -> -> -> "Too slippery?  Maybe you need something like a ladder.";
Hint -> -> -> "Can't find a ladder?  Is there something that looks like
             a ladder that might work instead?";
Hint -> -> -> "Look around on the Porch.";
Hint -> -> -> "Examine the porch railing.";
Hint -> -> -> "GET THE RAILING then PUT RAILING AGAINST TREE then CLIMB
             RAILING.";

Menu -> "Inside the Church";

HintTopic -> -> "How do I get into the trap door?";
Hint -> -> -> "Well, you can't fly up there.";
Hint -> -> -> "So you will have to climb.";
Hint -> -> -> "There is nothing here to climb, so you need to find a ladder.";
Hint -> -> -> "No ladder?  Is there something that looks like a ladder that
             might work instead?";
Hint -> -> -> "Look around on the Porch.";
Hint -> -> -> "Examine the porch railing.";
Hint -> -> -> "GET THE RAILING then PUT RAILING UNDER TRAP DOOR then CLIMB
             RAILING.";

HintTopic -> -> "How do I get past the locked door?";
Hint -> -> -> "Well, it would be polite to knock first.";
Hint -> -> -> "Well, that doesn't help.  Look for a key maybe?.";
Hint -> -> -> "OK, so no key.  How about breaking it down.";
Hint -> -> -> "Tough door!  I guess we need something heavy.";
Hint -> -> -> "Have you been to the belfry yet?";
Hint -> -> -> "That bell sure looks heavy.  I bet it could damage the door.";
Hint -> -> -> "Or, better yet, it could be used to pull the door from it's
             frame.";
Hint -> -> -> "Go to the Steeple Chamber and TIE THE ROPE TO THE DOOR.  Then,
             go to the Belfry and PUSH BELL.";
Hint -> -> -> "Oh yeah, make sure you have another way to climb down from the
             Belfry before you do...";

HintTopic -> -> "What's with the eyes of this painting?";
Hint -> -> -> "The painting is too far away to get a good look at.";
Hint -> -> -> "So you need to get closer.";
Hint -> -> -> "Have you found your ~ladder~ yet?";
Hint -> -> -> "PUT RAILING UNDER PAINTING then CLIMB RAILING.  Now, take a
             better look at the painting.";

HintTopic -> -> "What's that thing in the belfry.";
Hint -> -> -> "Uhh.. A bell?";

!*******************************************************************************
!*** And awaaay we go!
!*******************************************************************************
[Initialise;
  location = Grave;

  StartDaemon(Dog);
  StartDaemon(Old_Man);

  "^^You remember darkness. And the cold. Cold and darkness. And silence.
  Those memories are all that you have. That, and a feeling that something
  you never knew you possessed has been lost.^^Suddenly, oblivion is split
  by a blinding light and a crash of sound. You awaken to the roar of a
  storm and a deluge of rain and mud.^";];

[ChooseObjects obj code prty;
  if (code < 2)
     {if ((obj ofclass Fake_Object) || (obj has scenery))
        return 2;
     else
        rfalse;}
  else
     {prty = 2;
     if (obj has scenery) prty = prty - 1;
     if (parent(player) == parent(obj)) prty = prty + 1;
     if (parent(obj) == player) prty = prty + 2;
     if ((action_to_be == ##SwitchOn) && (parent(player) == obj))
        prty = prty + 1;
     return prty;}];

[PrintTaskName achievement;
  switch(achievement)
     {0: "for getting past the guard dog";
      1: "for entering the steeple";
      2: "for entering the sealed room";
      3: "for reading the journal";
      4: "for opening the door";
      5: "for discovering the truth";
      6: "for extracting your revenge";}];

Include "Grammar";

[ReadSub;
  <<Examine noun>>;];

[PutUnderSub;
  move noun to location;
  "You put ", (the) noun, " under ", (the) second, ".";];

[UnTieSub;
  print_ret (The) noun, " isn't attached to anything.";];

[RingSub;
  "You don't know how to ring ", (a) noun, ".";];

[XyzzySub;
  "A word comes to you, and you shout it out...  ~XYXXY!~. The storm responds
  with a roar and a crash of thunder. It is a word of power. Once, you
  feel, you knew many such words. Now, only this one remains.";];

[HelpSub;
  help_menu.select();];

Verb "pet" = "touch";
Verb "kick" = "attack";

Extend "read" first
    * noun                          -> Read;

Extend "put" first
    * noun "under"/"below"/"beneath"/"against" noun
                                    -> PutUnder;

Extend "rub"
    * noun "with" noun              -> Rub reverse
    * noun "on" noun                -> Rub;

Verb "untie" "detach"
    * noun                          -> UnTie
    * noun "from" noun              -> UnTie;

Verb "ring"
    * noun                          -> Ring;

Verb "xyzzy"
    *                               -> Xyzzy;

Verb meta "help" "about"
    *                               -> Help;