!******************************************************************************* !** 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 !** Dennis_Matheson@compuserve.com !** !** 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) <>; 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; <>; 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 <>; 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.^"; <>;} 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: <>;], 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: <>;], 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 <>;], 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: ; ; Attack: if (random(2) == 1) <>; else <>;], 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: <>; Pull: if (location == Steeple_Chamber) "You hear a metallic from somewhere overhead."; else "The bell moves slightly in its mount and emits a metallic .";], 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; <>;]; [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;