Switches xv5; Constant NO_PLACES; Constant NO_CHATTER; Constant ALLOW_NEUTER; Constant NO_STOP_DELAY; Constant TRANSFER_DIRECTION; ! Constant ZDEBUG; Constant NO_BOGLE; Constant Story "A CHANGE IN THE WEATHER"; Constant Headline "^An Interactive Short Story^\ Copyright 1995-6 by Andrew Plotkin. Please copy and play freely.^\ (First-time players should type ~about~.)^"; Release 6; Replace DrawStatusLine; Replace ScoreSub; Replace FullScoreSub; Replace DigSub; ! Replace WaitSub; Include "Parser"; Object LibraryMessages "lib_messages" with before [; Miscellany: if (lm_n == 9) "^It is dark."; Examine: if (lm_n == 1) "It's too dark to see."; Drop: if (lm_n == 1) "Already on the ground."; if (lm_n == 4) { if (verb_word == 'throw') "Thrown."; "Dropped."; } Blow: "You can't usefully blow on that."; ]; Include "VerbLib"; Property InitObject $ffff; Property dam 0; ! number of turns it can block water. If this is defined, number ! must be too. Attribute indoors; Attribute heavy; Fake_Action ThrownOver; Constant phAfternoon 1; Constant phSunsetClear 2; Constant phSunsetClouding 3; Constant phLight 4; Constant phTwilight 5; Constant phEveningMisty 6; Constant phEveningDrizzly 7; Constant phNightRainy 8; Constant phNightRain 9; Constant phCollapse 10; Constant phDream 11; Constant phDawn 12; Constant bdamFirstCollapse 3; Constant bdamPropped 10; Constant bdamCollapse 16; global phase = 0; global phasename = "Big Bang [BUG]"; global clock; ! turns since phase started global clocklimit; ! when phase will end, or 0 for no limit global interrupt; ! used by long-wait. Set to 1 to ask for an abort, 2 to definitely ! abort. (Setting deadflag counts as 2.) global foxboredom; ! counter for how long the fox has been hanging around you. Set ! to 0 to make it stay a little longer. global foxsummon; ! set to make the fox appear at the end of this turn. global foxfetch; ! the number of times the fox has fetched. global waterticking = 0; ! on if the water is flowing ! ----------------- Object newplay "yourself" with description "As good-looking as ever.", number thedark, after $ffff, life $ffff, each_turn $ffff, time_out $ffff, describe $ffff, capacity 100, parse_name 0, short_name 0, before [ ix ; Enter: if (verb_word == 'sit') "Sitting around won't speed matters."; Smell: if (noun == 0) { ! "smell", no argument if (location == Cave) "You smell old dirt and, perhaps, things that once lived in here."; <>; } else { rfalse; } Wake: { if (phase ~= phDream) "You're not asleep."; "You're certain you're not asleep."; }; Listen: if (noun == 0) { if (voices in sky) <>; if (people in location) <>; if (endpeople in location) <>; if (location == Bank) "You hear the rushing of the stream."; if (location == Outlook || location == Wildflowers) "You hear the rushing of the unseen stream."; } Sleep: { if (phase < phTwilight) "It's not even dark yet!"; if (phase < phNightRainy) "You're not feeling tired yet."; if (phase == phDawn) "You just woke up!"; if (phase >= phDream) "You feel no need for sleep."; if (phase < phNightRain && location hasnt indoors) "Sleeping out in the rain would be miserable."; if (blanket in player) ix = 2; else { if (ancestor(blanket) == ancestor(player)) ix = 1; else ix = 0; } if (location hasnt indoors) { print "Sleeping out in the rain will be miserable, but you're \ tired enough to do it."; if (ix==1) { move blanket to player; print " You take the wet blanket (much good it will \ do.) Wrapping yourself soggily, you curl up in the mud,"; } if (ix==2) print " Wrapping yourself soggily in the wet blanket \ (much good it will do you), you curl up in the mud,"; if (ix==0) print " You curl up in the mud"; print " and grimly close \ your eyes...^^^^"; PauseClear(); new_line; BadDream(); print "You awaken, soaked and feverish, bathed in the listless light \ of an overcast dawn. It takes some time to drag yourself down the hill -- \ and then you find that the bridge has been washed out by the storm. \ By the time you flounder across it, your pneumonia is well set in."; deadflag = 3; rtrue; }; if (ix==0 || blanket has general) { ! no blanket or soggy blanket print "You curl yourself up as best you can."; if (ix==0) print " It's dry in here, but you're still cold. You even wish \ you still had that ratty blanket."; else print " It's dry in here, but you're still cold. (The soggy \ blanket is worse than useless.)"; print " Nonetheless, you try to close your eyes...^^^^"; PauseClear(); new_line; BadDream(); print "You awaken sore and cold, bathed in the listless light \ of an overcast dawn. It takes some time to drag yourself down the hill -- \ and then you find that the bridge has been washed out by the storm. \ By the time you wade across the swollen stream, you're as soaked and \ miserable as if you'd slept out in the rain after all. You reach \ civilization exhausted and with what promises to be a lovely cough."; deadflag = 3; rtrue; }; { ! else if (ix==1) { move blanket to player; print "You take the blanket, wrap yourself snugly in it, and"; } else print "You wrap yourself snugly in the blanket and"; print " curl up on the floor. It's hard, but you're dry and warm. What \ else could you ask for? Your eyes close and the cave drifts \ away...^^^^"; PauseClear(); SetPhase(phDream); interrupt = 2; new_line; GoodDream(); print "Something awakens you.^"; <>; }; } ], has concealed animate proper transparent; Object sky "sky" with name "sky" "weather" "sun" "light" "air" "horizon", found_in [; rtrue; ], description [; if (location has indoors) { print "You poke your head outside. "; } if (phase == phAfternoon) "The sun is sinking slowly in a clear blue sky. It's the end of a long, \ long summer afternoon."; if (phase == phSunsetClear) "The sun is an orange orb hanging near the horizon."; if (phase == phSunsetClouding) "A few bands of cloud are visible on the western horizon, lit by the \ reddening sun."; if (phase == phLight) "Clouds are rolling in from the west. The sun is on the horizon, turning \ them to a silent miracle of light."; if (phase == phTwilight) "The sun is gone; the sky shades smoothly from light blue to deep blue, \ broken by tangles of cloud."; if (phase == phEveningMisty) "The sky is dim and misty."; if (phase == phEveningDrizzly) "The sky is cloudy and nearly dark. It's starting to rain."; if (phase == phNightRainy || phase == phNightRain) "It's quite dark, and you can see little through the rain."; if (phase == phDream) "You can see nothing through the rain except for distant flickers \ of lightning."; if (phase == phDawn) "The bright clarity of the sky lifts your spirits."; "The sky is glowing purple and green with orange spots! [BUG]"; ], before [; Smell: if (location has indoors) print "You stick your head out for a breath of fresh air. "; if (phase <= phLight) "The air is fragrant with summer."; if (phase <= phTwilight) "The air is fragrant, with a breath of cool damp coming in."; if (phase <= phEveningMisty) "The air is cooling, with the damp scent of rain in it."; if (phase <= phNightRain) "Everything smells of rain, and wet growing things."; if (phase == phDream) "The air is thick with rain and electricity."; if (phase == phDawn) "The dawn air is indescribable."; "The air smells of a combination of cream cheese and A-1 Steak Sauce. \ You are unnerved to find it appetizing. [BUG]"; Touch: "Metaphorically appealing, but hopeless in practice."; Examine: ! even if it's dark indirect(self.description); rtrue; ], daemon [; ! This is the time daemon; it's called every turn throughout the whole game. clock = clock+1; if (clocklimit ~= 0 && clock >= clocklimit) { SetPhase(phase+1); return; }; if (phase == phEveningDrizzly && clock == 3) { WaterTick(1); return; } if (phase == phDream) { if ((clock == 4 or 9 or 11) || (clock == 19 or 24 or 28)) { print "^A no-time, eternal instant of light lances through you, \ snapping your mind to silence."; if (clock == 11) print " Simultaneously"; else print " A moment later"; print " the silence is broken by a^^"; style underline; print "Crack!"; style roman; print "^^"; if (location hasnt indoors) print "of thunder."; else print "of thunder from outside."; if (clock == 11) { WhackTree(); } new_line; indirect(afterimages.InitObject); } } if ((phase == phNightRainy && clock == 3) || (phase == phNightRain && clock == 3)) { if (interrupt < 2) interrupt = 1; print "^You are getting tired.^"; }; if (phase == phNightRain && clock > 6 && (clock % 2) == 1) { if (interrupt < 2) interrupt = 1; print "^You are very tired.^"; }; if (phase == phDawn && clock == 1) { }; if (waterticking ~= 0) WaterTick(); if (afterimages in location && deadflag == 0) ImageTick(); ], has scenery transparent; [ SetPhase newphase initstr; phase = newphase; clock = 0; if (interrupt < 2) interrupt = 1; if (location has indoors) { initstr = "^You glance outside. "; } else { initstr = "^"; } if (phase==phAfternoon) { phasename = "Sunny Afternoon"; clocklimit = 6; return; } if (phase==phSunsetClear) { phasename = "Clear Sunset"; clocklimit = 6; print_paddr initstr; "The sun is lazily approaching the horizon."; } if (phase==phSunsetClouding) { phasename = "Clouding Sunset"; clocklimit = 6; print_paddr initstr; print "The sun is settling to the horizon, amid a scattering of clouds which have \ begun to drift in.^"; if (location == MeadowEdge) { deadflag = 3; print "^People seem to be be packing up to leave. Since they seem as \ likely as not to leave you behind, you hurry back to the group. \ Eventually some people ask you \ where you've been; you shrug them off irritably, and they leave you alone."; rtrue; } rtrue; } if (phase==phLight) { phasename = "A Moment of Light"; clocklimit = 2; print_paddr initstr; "The western horizon has become a surging sea of gold and scarlet waves. \ The light is magical -- a cool bronze radiance that somehow makes the grass \ and foliage more intensely green than ever."; } if (phase==phTwilight) { phasename = "Cloudy Twilight"; clocklimit = 6; print_paddr initstr; "The moment is gone. The sun has set, although the clouds are still well-lit."; } if (phase==phEveningMisty) { phasename = "Misty Evening"; clocklimit = 6; print_paddr initstr; "The sky is dimming, and a mist is rolling in, under the clouds."; } if (phase==phEveningDrizzly) { phasename = "Drizzly Evening"; clocklimit = 6; print_paddr initstr; "The mist is turning to a drizzle of rain."; } if (phase==phNightRainy) { phasename = "Rainy Night"; clocklimit = 6; give mud general; print_paddr initstr; print "It's dark and it's raining.^"; rtrue; } if (phase==phNightRain) { phasename = "Night, Heavy Rain"; clocklimit = 12; print_paddr initstr; "It's dark and it's raining. Hard."; } if (phase==phCollapse) { phasename = "Night, Heavy Rain"; clocklimit = 0; print "^You can remain awake no longer. "; ! no newline. interrupt = 2; <>; } if (phase==phDream) { phasename = "Night, a Thunderstorm"; clocklimit = 0; give mud general; ! may have slept through phNightRainy move voices to sky; remove fox; if (waterticking == 0) WaterTick(1); interrupt = 2; return; } if (phase==phDawn) { phasename = "Sunny Dawn"; clocklimit = 0; WaterTick(2); remove sand; remove handsand; remove voices; remove afterimages; remove fox; remove people; move endpeople to MeadowEdge; { give MeadowEdge ~visited; give Bank ~visited; give Cave ~visited; give Outlook ~visited; give Shed ~visited; give Hilltop ~visited; give SteepFace ~visited; give WildFlowers ~visited; give Bluff ~visited; } give sheddoor locked; give sheddoor ~open; move blanket to player; give blanket ~general; ! move blade to Hilltop; ! ## really not sure of this StartDaemon(blanket); tornbag.number = 0; dirtybag.number = 0; interrupt = 2; return; } phasename = "Time Has Broken BUG"; clocklimit = 0; print_paddr initstr; "The earth has spun off its tracks and dropped into the violet void. [BUG]"; ]; [ WaterTick act; ! act == 0 for run, 1 for start, 2 for stop if (act==2) { waterticking = 0; remove flow_sf; remove flow_o; remove flow_f; remove flow_b; rtrue; } if (act==1) { waterticking = 1; rtrue; } ! check flow_o if (flow_o notin Outlook) { if (flow_sf in SteepFace && flow_sf hasnt general) { ! start move flow_o to Outlook; if (location == Outlook) { print "^The trickle of runoff coming down the southeast path \ gains strength. Rapidly it becomes a small torrent, \ pouring by you, out along the trench, and down to the stream \ below.^"; } } } else { if (flow_sf notin SteepFace || flow_sf has general) { ! stop remove flow_o; if (location == Outlook) { print "^The torrent of runoff slackens sharply; in moments there \ is only a trickle left.^"; } } } ! check flow_b (general means it's hitting the bridge?) if (flow_b notin Bank) { if (flow_f in Wildflowers && flow_f has general) { ! start move flow_b to Bank; if (location == Bank) { print "^The trickle of runoff coming down the south path \ gains strength. Rapidly it becomes a small torrent.^"; } } } else { if (flow_f notin Wildflowers || flow_f hasnt general) { ! stop remove flow_b; if (location == Bank) { print "^The torrent of runoff slackens sharply; in moments there \ is only a trickle left.^"; } } } if (flow_b in Bank) { give flow_b general; if (flow_b has general && boulder in Bank && boulder.number < boulder.dam) { boulder.number = boulder.number + 1; give flow_b ~general; if (location == Bank) { print "^The runoff water is backing up behind the boulder.^"; } } if (flow_b has general && boulder in Bank && boulder.number == boulder.dam) { boulder.number = boulder.number + 1; if (location == Bank) { print "^The runoff water begins to spill out from behind the boulder.^"; } } if (tornbag in Bank && dirtybag in Bank) { ! somewhat ugly code that assumes that both bags have the same dam number if (flow_b has general && (tornbag.number < tornbag.dam || dirtybag.number < dirtybag.dam)) { give flow_b ~general; if (tornbag.number <= dirtybag.number) tornbag.number = tornbag.number + 1; else dirtybag.number = dirtybag.number + 1; ! print "## both backing: torn ", tornbag.number, ", dirty ", dirtybag.number, ".^"; if (flaw notin Bank && tornbag.number >= 2 && dirtybag.number >= 2) { move flaw to Bank; } if (location == Bank) { if (flaw notin Bank) print "^The runoff water is backing up behind the sandbags.^"; else print "^The runoff water is backing up behind the sandbags. \ It's up to a curve in the path that comes quite close to the \ stream.^"; } } if (flow_b has general && (tornbag.number == tornbag.dam || dirtybag.number == dirtybag.dam)) { tornbag.number = tornbag.number + 1; dirtybag.number = dirtybag.number + 1; ! print "## both spill: torn ", tornbag.number, ", dirty ", dirtybag.number, ".^"; if (location == Bank) { if (flaw notin Bank) print "^The runoff water begins to spill out from behind \ the sandbags.^"; else print "^The runoff water begins to spill out from behind \ the sandbags. \ The pool runs up to a curve in the path that comes quite close to the \ stream.^"; } } } else { if (flow_b has general && tornbag in Bank && tornbag.number < tornbag.dam) { tornbag.number = tornbag.number + 1; give flow_b ~general; if (location == Bank) { print "^The runoff water is backing up behind the torn sandbag.^"; } } if (flow_b has general && tornbag in Bank && tornbag.number == tornbag.dam) { tornbag.number = tornbag.number + 1; if (location == Bank) { print "^The runoff water begins to spill out from behind the torn sandbag.^"; } } if (flow_b has general && dirtybag in Bank && dirtybag.number < dirtybag.dam) { dirtybag.number = dirtybag.number + 1; give flow_b ~general; if (location == Bank) { print "^The runoff water is backing up behind the dirty sandbag.^"; } } if (flow_b has general && dirtybag in Bank && dirtybag.number == dirtybag.dam) { dirtybag.number = dirtybag.number + 1; if (location == Bank) { print "^The runoff water begins to spill out from behind the dirty sandbag.^"; } } } if (flow_b has general) { bridge.number = bridge.number+1; ! print "^## the bridge is at ", bridge.number, " damage! ##^"; if (bridge.number == bdamFirstCollapse || bridge.number == bdamCollapse) { ! no prop, collapse if (bridge in location) { new_line; if (fox in Bank) { print "Sparing you only an unreadable glance, \ the fox leaps for shore and vanishes into the night. "; } print "The side of the bridge sags further, beams bending.^^"; style underline; print "Crack!"; style roman; print "^^You stretch your hands helplessly towards the bridge, \ but the timbers are falling, slower and slower, silent \ behind a freezing roar that rises in your mind...^"; } else { print "^From somewhere below, you hear a terrible^^"; style underline; print "Crack!"; style roman; print "^^You know \ without seeing that the bridge has been destroyed. You begin \ to rush downhill, but the trail seems to stretch and time takes on \ the weight of nightmare...^"; } PauseBridgeDown(); return; } if (bridge in location) { if (bridge.number < bdamFirstCollapse) { print "^The runoff water is pouring down to the stream, right \ over the bridge pilings. The muddy earth below the bridge is \ wearing away.^"; } if (bridge.number == bdamFirstCollapse-1) { print "^A beam below the bridge suddenly slips from its \ mooring in the earth! It vanishes into the raging current. One \ side of the bridge begins to sag, bowing almost gracefully \ towards the water.^"; } if (bridge.number >= bdamPropped) { print "^The runoff water is pouring down to the stream, right \ over the bridge pilings and your makeshift support. \ The earth below the bridge continues to \ wear away.^"; } if (bridge.number == bdamCollapse-1) { print "^The bank has melted from under the branch; \ it slips into the stream and is whirled away. The \ bridge begins to bend once again.^"; } } } } ! check flow_f. (general means it's outflowing this turn) if (flow_f notin Wildflowers) { if (flow_sf in SteepFace && flow_sf has general) { ! start move flow_f to Wildflowers; give flow_f ~general; if (location == Wildflowers) { print "^The trickle of rainwater coming down the east path \ gains strength. Rapidly it becomes a small torrent.^"; } } } else { if (flow_sf notin SteepFace || flow_sf hasnt general) { ! stop remove flow_f; if (location == Wildflowers) { print "^The torrent of runoff slackens sharply; in moments there \ is only a trickle left.^"; } } } if (flow_f in Wildflowers) { give flow_f general; if (flow_f has general && boulder in Wildflowers && boulder.number < boulder.dam) { boulder.number = boulder.number + 1; give flow_f ~general; if (location == Wildflowers) { print "^The runoff water is backing up behind the boulder.^"; } } if (flow_f has general && boulder in Wildflowers && boulder.number == boulder.dam) { boulder.number = boulder.number + 1; if (location == Wildflowers) { print "^The runoff water begins to spill out from behind the boulder.^"; } } if (tornbag in Wildflowers && dirtybag in Wildflowers) { ! somewhat ugly code that assumes that both bags have the same dam number if (flow_f has general && (tornbag.number < tornbag.dam || dirtybag.number < dirtybag.dam)) { give flow_f ~general; if (tornbag.number < dirtybag.number) tornbag.number = tornbag.number + 1; else dirtybag.number = dirtybag.number + 1; ! print "## both backing: torn ", tornbag.number, ", dirty ", dirtybag.number, ".^"; if (location == Wildflowers) { print "^The runoff water is backing up behind the sandbags."; if (tornbag.number >= 2 && dirtybag.number >= 2) print " The pool runs several feet up the path, penned in by \ the rise."; new_line; } } if (flow_f has general && (tornbag.number == tornbag.dam || dirtybag.number == dirtybag.dam)) { tornbag.number = tornbag.number + 1; dirtybag.number = dirtybag.number + 1; ! print "## both spill: torn ", tornbag.number, ", dirty ", dirtybag.number, ".^"; if (location == Wildflowers) { print "^The runoff water begins to spill out from behind the \ sandbags.^"; } } } else { if (flow_f has general && tornbag in Wildflowers && tornbag.number < tornbag.dam) { tornbag.number = tornbag.number + 1; give flow_f ~general; if (location == Wildflowers) { print "^The runoff water is backing up behind the torn sandbag.^"; } } if (flow_f has general && tornbag in Wildflowers && tornbag.number == tornbag.dam) { tornbag.number = tornbag.number + 1; if (location == Wildflowers) { print "^The runoff water begins to spill out from behind the torn sandbag.^"; } } if (flow_f has general && dirtybag in Wildflowers && dirtybag.number < dirtybag.dam) { dirtybag.number = dirtybag.number + 1; give flow_f ~general; if (location == Wildflowers) { print "^The runoff water is backing up behind the dirty sandbag.^"; } } if (flow_f has general && dirtybag in Wildflowers && dirtybag.number == dirtybag.dam) { dirtybag.number = dirtybag.number + 1; if (location == Wildflowers) { print "^The runoff water begins to spill out from behind the dirty sandbag.^"; } } } } ! check at flow_sf (general means flowing south) if (flow_sf notin SteepFace) { ! start move flow_sf to SteepFace; if (tree hasnt general) { give flow_sf ~general; if (location == SteepFace) { print "^Runoff water is trickling down the hill, concentrated here \ by some twist of geography. It puddles on the ledge, then begins \ pouring down the path to the northwest.^"; } } else { give flow_sf general; if (location == SteepFace) { print "^Runoff water is trickling down the hill, concentrated here \ by some twist of geography. It puddles on the ledge, behind the \ fallen tree, then flows southwest. [BUG]^"; } } } if (flow_sf hasnt general && tree has general) { if (tree.number < tree.dam) { tree.number = tree.number+1; if (location == SteepFace) { print "^The runoff water is backing up behind the fallen tree.^"; } } else { give flow_sf general; if (location == SteepFace) { print "^The runoff water begins to spill out from behind the tree, \ down the southwest path.^"; } } } ]; Object afterimages "afterimages" with name "afterimage" "image" "afterimages" "images", InitObject [; if (afterimages.number ~= 0) { print "^You are seeing afterimages on your afterimages"; print ". Your eyes explode. [BUG].^"; rtrue; } afterimages.number = 2; if (location == thedark) { move afterimages to real_location; AdjustLight(1); print "^The pure white fades into a greenish glare. \ Flat colored shadows show the outlines of everything around you; \ you hold your head still to focus on the afterimages.^"; <>; } else { move afterimages to location; print "^Afterimages hang around you in a greenish glare. You blink \ furiously, trying to sort out the shadows from what's really there.^"; rtrue; } ], number 0, ! 0 for gone, 2 for just arrived, 1 for still there found_in [; if (afterimages.number ~= 0) rtrue; else rfalse; ], description [; if (afterimages.number == 1) { print "The afterimages of what you saw float around you.^"; rtrue; } if (afterimages.number == 2) { "You see only a bright glare of hexadecimal opcodes. [BUG]"; } "The afterimages are gone, and I don't know how the hell you're \ seeing them. [BUG]"; ], has scenery light; ! call only if afterimages is visible [ ImageTick; if (phase == phDawn) { afterimages.number = 0; remove afterimages; return; } if (afterimages.number == 0) { remove afterimages; "^The afterimages are standing around, chatting idly and smoking \ cigarettes. They see you and hastily leave. [BUG]"; }; afterimages.number = afterimages.number - 1; if (afterimages.number == 0) { remove afterimages; "^The afterimages evaporate into a black dazzle."; } ]; #IFDEF ZDEBUG; Object wand "magic wand" with name "magic" "wand", description "The wand says ~Property of the Implementors.~ [BUG]."; #ENDIF; Object voices "voices" with name "sound" "sounds" "voice" "voices" "chorus" "sussurus", description [ dir; if (phase ~= phDream) "Voices? You hear voices? I don't hear voices. [BUG]"; dir = "Poughkeepsie [BUG]"; if (location == thedark) dir = "somewhere outside"; if (location == Bank) dir = "across the bridge"; if (location == Outlook) dir = "the southwest"; if (location == Wildflowers) dir = "the northwest"; if (location == Bluff) dir = "the northwest"; if (location == Shed) dir = "the northwest"; if (location == Hilltop) dir = "the west"; if (location == Cave) dir = "the west"; if (location == SteepFace) dir = "the northwest"; if (self hasnt general) { print "A sussurus of voices comes from "; print_paddr dir; print ", too faint to make out but too loud to ignore. You are \ almost certain you hear your name, though, and something \ in you moves to respond.^"; } else { print "A sussurus of voices comes from "; print_paddr dir; print ", too faint to make out but too loud to ignore. You do not know \ what they say, but something inside is terrified that they are calling \ for you.^"; } rtrue; ], before [; Listen: <>; Examine: ! even if it's dark indirect(self.description); rtrue; ], each_turn [; if (clock <= 1) "^The voices are still audible. They surge and swell, on the edge \ of audibility, somewhere to the west. You are almost certain you \ hear your name being called."; if (location == Bank) { if (self hasnt general) { give self general; "^The voices surge, and you realize the sounds comes from the \ west, from the other side of the stream. And they are coming \ closer. You are very sure, suddenly, that you do not want them \ to reach you."; } else { if (bridge.number >= bdamPropped+1) { if (clock % 2 == 0) { if (flaw in Bank && flaw.number <= 3) print "^The voices seem nearly at the bridge."; else print "^The voices across the bridge seem very close now."; if (fox in Bank) { if (random(2) == 1) print " The fox is staring west with the intensity of ice."; else print " The fox is staring west, tail twitching."; } new_line; } } else { if (clock % 3 == 0) "^The distant murmur of voices, across the bridge, \ seems closer now."; } } rtrue; } if (clock % 3 == 0) { if (random(2) == 0) "^The voices seem to be gaining in strength."; else "^The voices surge, then fade."; } rtrue; ], has scenery; ! general means you're scared of them now Object fox "fox" with name "small" "orange" "fox", describe [; if (phase == phDream) "^The fox is crouched on the bridge, staring out to the west with \ impenetrable intensity."; "^A small orange fox is perched nearby, staring at you with undisguised \ interest."; ], description [; "The fox's eyes gleam darkly."; ], InitObject [; StartDaemon(fox); foxsummon = 0; foxboredom = 0; foxfetch = 0; ], life [; Kiss: if (phase == phDream) "The fox spares you no attention."; "Without seeming to move, the fox is out of your way."; Answer: if (special_word == 'fetch') { if (stick in player) { if (phase < phEveningDrizzly || phase == phDawn) { foxboredom = 0; "The fox wags its tail merrily, then crouches down expectantly \ and waits."; } else "An ear perks up; but then the fox shakes off a spatter of \ water and sneezes. Truth be told, you feel rather the same \ way yourself."; } if (stick in location) { foxboredom = 0; "The fox looks at the spade shaft lying on the ground, then \ back at you with some perplexity."; } "The fox looks around, then back at you with some perplexity."; } Order: if (phase == phDream) "The fox spares you no attention."; if (action == ##Take && noun == stick) { if (phase < phEveningDrizzly || phase == phDawn) { foxboredom = 0; "The fox wags its tail merrily, then crouches down expectantly \ and waits."; } else "An ear perks up; but then the fox shakes off a spatter of \ water and sneezes. Truth be told, you feel rather the same \ way yourself."; } "The fox is attentive."; Ask: if (phase == phDream) "The fox spares you no attention."; "The fox looks inquisitive."; Tell: if (phase == phDream) "The fox spares you no attention."; if (second == stick) { if (phase < phEveningDrizzly || phase == phDawn) { foxboredom = 0; "The fox wags its tail merrily, then crouches down expectantly \ and waits."; } else "An ear perks up; but then the fox shakes off a spatter of \ water and sneezes. Truth be told, you feel rather the same \ way yourself."; } "The fox is attentive."; Show: if (phase == phDream) "The fox spares you no attention."; if (noun==stick) { if (phase < phEveningDrizzly || phase == phDawn) { foxboredom = 0; "The fox's ears perk up and its tail wags, a perfect \ picture of puppyish enthusiasm. Its eyes laugh at you \ as it gathers itself expectantly."; } else "An ear perks up; but then the fox shakes off a spatter of \ water and sneezes. Truth be told, you feel rather the same \ way yourself."; } print "The fox looks at "; DefArt(noun); ", and then back at you."; ThrowAt: if (phase == phDream) { remove noun; print "The fox spares you no attention. "; CDefArt(noun); if (noun == blanket) print " slides"; else print " clatters"; " across the planks and drops into the stream."; } print "The fox dodges in a blink, and then spears you with a disappointed \ stare. It vanishes into the undergrowth.^"; remove fox; keep_silent = 1; ; keep_silent = 0; rtrue; ], before [; Touch: <>; ], daemon [ ix wascalled; if (phase == phDream) { if (voices has general && fox notin Bank && location == Bank) { move fox to Bank; "^You jerk as a shape darts past you. Wild orange fury -- it's \ the fox, hurtling up onto the bridge like an avenging spirit. \ The fox crouches on the wet planks and stares fiercely out to \ the west."; } if (location == Bank && self in Bank) { ! do something? } rtrue; } if (phase == phDawn) { rtrue; } ! else, not in dream or dawn if (self notin location) { wascalled = foxsummon; foxsummon = 0; if (location == MeadowEdge || location has indoors) rtrue; ! fox is never seen there. ix = random(13); if (ix <= 1 || (stick in player && ix <= 4) || wascalled ~= 0) { move self to location; foxboredom = 1; if (self has moved) { if (location == Hilltop && random(2) == 1) { if (boulder in location) "^The fox appears from behind the boulder."; else "^The fox appears from inside the cave."; } ix = random(3); if (ix==1) "^The fox appears under a nearby bush."; if (ix==2) "^The fox appears on a nearby rock."; if (ix==3) "^The fox appears beside a clump of weeds."; "^The fox crawls out of a trap-door. [BUG]"; } else { give self moved; "^From within some tall grass, you notice a pair of dark \ eyes. The grass blinks, and then it is a small, \ orange fox who watches you solemnly."; } } if (ix <= 2) { "^You catch a pair of dark eyes in the edge of your vision; \ then they are gone."; } rtrue; } else { foxboredom++; if (foxboredom > 2 && random(10) <= 5) { remove self; if (location == Hilltop && random(2) == 1) { if (boulder in location) "^The fox slips behind the boulder and vanishes."; else "^The fox slips into the cave and vanishes."; } ix = random(3); if (ix==1) "^The fox vanishes."; if (ix==2) "^The fox disappears in a flash of orange fur."; if (ix==3) "^The fox has slipped away."; } } ], each_turn [ ix ; if (deadflag ~= 0) return; if (phase == phDream) { if (bridge.number == bdamFirstCollapse-1) { "^The bridge continues to sag. \ The fox tenses, but does not move from its unsteady perch."; } if (bridge.number == bdamCollapse-1) { "^The bridge continues to sag. \ The fox tenses, but does not move from its unsteady perch."; } ix = random(7); if (ix==1) "^The fox's ears twitch tensely."; if (ix==2) "^The fox hunches itself lower to the bridge."; rtrue; } if (stick in player && random(9) <= 2) { if (phase < phEveningDrizzly || phase == phDawn) "^The fox chases around your feet for a moment. It seems to be watching \ something you hold."; else "^The fox glances at you, or perhaps something you hold."; } if (stick in location && random(9) <= 2) { if (phase < phEveningDrizzly || phase == phDawn) "^The fox chases around the spade shaft for a moment, then stops and stares \ at you to make sure you didn't see."; } ix = random(13); if (ix==1) "^The fox blinks."; if (ix==2) { if (phase < phEveningDrizzly || phase == phDawn) "^The fox chases its tail furiously for a moment, then stops and stares \ at you to make sure you didn't see."; else "^The fox suddenly shakes a shower of droplets off itself."; } if (ix==3) "^The fox darts at something in the undergrowth."; rtrue; ], has animate neuter; Object flaw "weak spot in the bank" with name "thin" "narrow" "weak" "spot" "ridge" "mud" "bank" "channel", description [; if (phase == phDawn) "A channel has been cut from the path down through the bank. \ The earth is deeply eroded, as if something had worn it away."; print "There's a narrow spot in the bank, a thin ridge of \ earth between the inundated path and the stream below. \ The pool of water behind your pile of sandbags just reaches the thin \ spot."; new_line; return; ], before [ ix; Dig, Attack: if (second ~= 0) { CDefArt(second); ix = 0; if (second == key) { print " is too small to dig with effectively"; ix = 1; } if (second == stick || second == branch) { print " is too clumsy to dig with effectively"; ix = 1; } if (second == bucket) { print " is too wide to dig with effectively"; ix = 1; } if (ix == 0) { print " is unsuitable for digging"; } print "; scraping with your bare hands works as well. "; } self.number = self.number - 1; if (self.number == 0) { print "You tear at the earth, heedless of your burning \ fingers. A stone yields, and then another; and then a third is \ sucked from beneath your hands, pulled by the current that is \ rushing along your channel. You lean back, choked breaths lost \ in the rain that drums on your face. The standing pool on \ the path is rapidly subsiding.^^"; print "A flash of movement draws your eye. The fox is still on the \ bridge, but no longer crouched in readiness. It stands tall, \ looking at you with \ a wide-jawed fox grin; and then faces west, into the voices that \ have gone high with triumph. They come closer, closer, along the \ bridge that you have labored to save.^^"; print "They "; style underline; print "are"; style roman; print " calling your name, after all.^^^^"; PauseClear(); new_line; print "^You awaken, blinking in light.^"; SetPhase(phDawn); PlayerTo(Cave); return; } ix = random(3); if (ix==1) print "You scrabble"; if (ix==2) print "You claw"; if (ix==3) print "You scratch"; if (self.number <= 3) print " desperately"; print " at the the narrow spot."; if (self.number == 5) print " You make only a shallow channel in the bank."; if (self.number == 4) print " The channel becomes deeper."; if (self.number == 3) print " The gap has nearly reached the level of the water standing \ on the path."; if (self.number == 2) print " A thread of water begins to trickle out along your channel."; if (self.number == 1) print " Your fingernails are torn and bleeding. The channel is \ nearly a handspan wide, and water is pouring out of it, down to \ the greater channel that roars below the bank."; ! print " ##(Now ", self.number, ".)"; new_line; return; ], each_turn [; if (deadflag ~= 0) return; if (self hasnt general && fox in Bank) { give self general; new_line; style underline; print "Yip!"; style roman; print " Your eyes snap to the fox, to find it staring as urgently back \ at you. It tilts its head towards the path. \ What? "; style underline; print "There,"; style roman; print " at the curve of the path, where the water has backed up behind \ your pile of sandbags. There's a narrow spot in the bank -- a thin ridge of \ earth between the inundated path and the stream below."; new_line; return; } ], number 6, has scenery; ! general means the fox has seen it (and thus you have too) ! number is how dug it is [ DarkDescription; "It is too dark to see."; ]; ! ----------------- Object MeadowEdge "Edge Of Meadow" with name "edge" "meadow", description [; if (phase <= phSunsetClear) "The grasses are fragrant under the sunshine of a late, late \ summer afternoon. A stream chatters by at your feet, and a weathered old \ wooden bridge stretches across it to the east. Beyond the stream, a scrubby \ hillside stretches upward."; if (phase == phDawn) "The grasses are fragrant under the sunshine of a brilliant \ summer morning. A stream chatters by at your feet, and a weathered old \ wooden bridge stretches across it to the east. Beyond the stream, your \ hillside stretches upward."; "You see hordes of gnomes busily rolling up the scenery, so that it doesn't \ get wet. [BUG]"; ], e_to [; if (phase == phDawn) "But you've come so far."; print "The bridge creaks as you cross it, and sways a bit.^"; return Bank; ], ne_to [; print "The stream is that way. "; <>; ], se_to [; print "The stream is that way. "; <>; ], d_to [; print "The stream is that way. "; <>; ], w_to [; if (phase == phAfternoon && clock <= 3) { deadflag = 4; print "You turn your back on the hill, and consider the distant shapes \ of your companions. One of them waves hugely to you. You shrug, \ and begin jogging towards them."; return -1; }; if (phase == phDawn) { deadflag = 4; print "You turn your back on the hill, and consider the distant shapes \ of your companions. One of them turns and calls your name. \ Others point, and wave, and laughter and shouts precede them flowing across \ the meadows."; print "^^You smile to yourself, and begin jogging towards them."; return -1; }; "You'd rather not rejoin the group at this point. For one thing, \ you have no desire to explain what you were doing wandering off by \ yourself."; ], cant_go "You can't see anything particularly interesting in that direction.", has light; Nearby people "picnickers" with name "picnickers" "people" "players" "party" "picnic" "cookout" "cook-out", initial "The shouts of the volleyball players and the boom-box thump are \ pleasantly far off to the west.", description "You hear yells, laughter, music. People are having a good time. You \ just want to get away.", before [; Listen: <>; ], has static; Nearby hillside "hillside" with name "hill" "side" "hillside", description "Trails snake up the side of the hill, to the summit, \ an angle of sunlit stone against the unbounded blue.", before [; Touch: "The hill exceeds your grasp."; ! or what's a story for? ], has scenery; Object endpeople "picnickers" with name "picnickers" "people" "players" "party" "picnic" "cookout" "cook-out", describe [; if (self hasnt moved) { give self moved; "^You hear the noise of your group off to the west! Half of them seem to \ be setting up for the volleyball finals; the others are building the \ campfires that will burn tonight."; } else { "^The shouts of the volleyball players and the boom-box thump are \ not quite audible to the west." } ], description "You hear yells, laughter, music. People are having a good time.", before [; Listen: <>; ], has static; ! ----------------- Object Bank "Stream Bank" with name "bank" "fish" "moss" "stones" "hill", description [; print "A slope descends to the noisy stream to the west. \ The old wooden bridge which spans it leans "; if (phase < phEveningDrizzly || phase == phDawn) print "comfortably"; else print "uncertainly"; print " against the bank at your feet. To the east rises the flank of the hill, "; if (phase < phLight) print "shining in the afternoon sunlight;"; if (phase == phLight) print "lambent green and brown in the light;"; if (phase > phLight && phase <= phEveningDrizzly) print "a dark shape in the twilight;"; if (phase > phEveningDrizzly && phase < phDawn) print "a black shape made of night and rain;"; if (phase == phDawn) print "shining in the morning;"; print " two usable trails lead up around it, to the south and the northeast."; new_line; rtrue; ], w_to [; if (phase == phDawn) { print "The bridge creaks as you cross it, but it's solid.^"; return MeadowEdge; } if (phase == phDream) { "The thought of crossing into that darkness, with its inhabitants, \ is beyond bearing."; } if (phase < phSunsetClouding) { "You'd rather not rejoin the group at this point. For one thing, \ you have no desire to explain what you were doing wandering off by \ yourself. For another, you're not so sure you trust the bridge."; } "You'd rather not go look for the group at this point. For one thing, \ you have no desire to explain what you were doing wandering off by \ yourself. For another, you're not so sure you trust the bridge."; ], ne_to Outlook, e_to "The hillside is bare rock in that direction, and much too steep \ to climb.", s_to Wildflowers, nw_to [; print "The stream is that way. "; <>; ], sw_to [; print "The stream is that way. "; <>; ], d_to [; print "The stream is that way. "; <>; ], u_to "Two trails lead up from here; you can go northeast or south.", cant_go "The underbrush is too dense in that direction.", has light; Nearby bridge "wooden bridge" with name "weathered" "wood" "wooden" "bridge" "footbridge" "support" "supports" "beam" "beams", description [; if (phase == phDream) { if (bridge.number == bdamFirstCollapse-1 || bridge.number == bdamCollapse-1) { print "A narrow span of weathered wood crosses the stream here. \ A major beam has fallen away, leaving a dangerous gap \ in the row of supports, and the bridge sags crazily as you watch."; new_line; rtrue; } else { print "A narrow span of weathered wood crosses the stream here. The boards \ are vaguely warped, and the whole has an air of uncertainty about it."; } if (bridge.number >= bdamPropped && bridge.number < bdamCollapse-1) { print " A sturdy branch has been jammed under the bridge, filling a gap \ in the row of supports."; } if (bridge.number ~= 0) { print " The earth that supports the bridge is eroded"; if (flow_b in Bank && flow_b has general) { print "; the torrent of runoff wears it further as \ you watch."; } else { print "."; } } new_line; rtrue; } if (location == MeadowEdge || phase == phDawn) { "A narrow span of weathered wood crosses the stream here. The boards \ are vaguely warped, and the handrails aren't quite connected each to \ the next, but it's held this long and you expect it will probably support \ you."; } "A narrow span of weathered wood crosses the stream here. The boards \ are vaguely warped, and the handrails aren't quite connected each to \ the next. You're not sure you want to trust it."; ], before [; GoUnder: if (phase >= phNightRainy && phase <= phDream) { "The bridge isn't very high. Between the bridge supports and the \ high bank, your feet would be in the stream, and the rest of you \ in the mud."; } "You're no troll."; LookUnder: if (phase < phDream) { "You see only the bridge pilings, sunk into the earth."; } if (phase == phDawn) { "You see only the bridge pilings, and the branch you jammed \ there."; } if (phase ~= phDream) { "You see a troll! [BUG]"; } print "You see the bridge pilings."; if (bridge.number == bdamFirstCollapse-1 || bridge.number == bdamCollapse-1) { print " A major beam has fallen away, leaving a dangerous gap \ in the row of supports."; } if (bridge.number >= bdamPropped && bridge.number < bdamCollapse-1) { print " A sturdy branch has been jammed among them, filling a gap \ in the row of supports."; } if (bridge.number ~= 0) { print " The earth they are sunk in is eroded"; if (flow_b in Bank && flow_b has general) { print "; the torrent of runoff wears it further as \ you watch."; } else { print "."; } } new_line; rtrue; Tie: if (second == branch) { <>; } if (second == 0 && (bridge.number == bdamFirstCollapse-1 || bridge.number == bdamCollapse-1)) { "A good idea, but how to implement it?"; } Receive: if (receive_action ~= ##Insert) { "Putting things on the bridge isn't useful."; } if (noun notin player) { "You're not holding that."; } if (noun == stick || noun == spade) { CDefArt(noun); " is too short to wedge under the bridge."; } if (noun ~= branch) { print "It won't help to put "; DefArt(noun); " under the bridge."; } if (bridge.number ~= bdamFirstCollapse-1) { "There's no place under the bridge to wedge the branch."; } move branch to bridge; bridge.number = bdamPropped; if (branch.number > 0) branch.number = 1; ! put it out "You wedge the branch under the bridge, in the gap left by the \ missing support beam. It seems to be holding."; LetGo: print "It would be certain disaster to remove "; DefArt(noun); " now."; Enter: if (location == MeadowEdge) <>; if (location == Bank) <>; ], found_in Bank MeadowEdge, number 0, has scenery; ! number is HP of damage taken Nearby stream "stream" with name "stream" "river" "water" "current", description [; if (phase <= phSunsetClouding || phase == phDawn) "It's not particularly deep, but it's spectacularly clear. Streaks of \ green trail along the stones at the stream's bottom, and you see the rare \ glint of a fish in the sunlight."; if (phase <= phLight) "It's not particularly deep, but it's spectacularly clear, and the rich \ light turns the river-stones to copper, brass, and gold. Finned gems \ dart among strands of moss too vibrant to be jade."; if (phase <= phEveningMisty) "It's not particularly deep, but it's spectacularly clear, although the \ dimming light is turning the bottom to shadow."; if (phase <= phEveningDrizzly) "The stream's surface is broken and broken again with the raindrops that \ are striking it. You can make out nothing beneath."; if (phase <= phNightRain) "The stream has turned to rushing blackness in the night. You can't even \ make out the rough nap that you can hear raindrops making on the surface."; if (phase == phDream) "The stream has turned to rushing blackness in the night. Every few moments \ a distant flicker of lightning shines roughly off the surface."; "Oops! It's actually just a strip of canvas with ~Stream~ painted on it. [BUG]"; ], found_in Bank MeadowEdge, before [ ; Enter: { if (phase <= phEveningMisty) "You're interested in exploring, not getting yourself soaked and \ miserable."; if (phase <= phEveningDrizzly) "You're getting wet enough as it is."; if (phase < phDream) "It's storm-swollen and rapid, and certainly dangerous."; if (phase == phDream) { print "Recklessly, you leap into the swollen stream. Though the water is \ less than hip-deep, it knocks you immediately from your feet. The \ rest is a nightmare of darkness, cold, and numbing impacts.^^^^"; PauseClear(); print "^You awaken in a hospital bed, and spend some weeks recovering from \ hypothermia, exposure, near-drowning, and three broken ribs."; deadflag = 3; rtrue; } if (phase == phDawn) "It's hardly necessary now, is it?"; "You uncork your halo and dance on the surface of the water. [BUG]"; }; Take: if (bucket notin player) "You have nothing in which to carry water."; <>; Drink: <>; ! that's the quantity of water Insert: if (second == bucket) <>; "You can't put water in "; InDefArt(second); "."; Receive: if (noun == bucket) <>; ! and exit remove noun; if (phase <= phEveningDrizzly) print "The current must be faster than it looks. "; else print "The stream is storm-swollen. "; CDefArt(noun); " is carried rapidly away."; ], has scenery; Object flow_b "runoff water" with name "flowing" "runoff" "water", describe [; new_line; indirect(self.description); rtrue; ], description [; if (self hasnt general) { "A torrent of runoff water is flowing down from the south, and backing \ up on the path here."; } else { "A torrent of runoff water is flowing down from the south. It pours \ down to the stream, over the bridge pilings."; } ], article "some", has static; ! ----------------- Object Outlook "Rocky Outlook" with name "rocky" "outlook" "tongue" "woods" "meadow" "meadows" "meadowland" "hill" "hillside", description [ finstr; print "A wide angular tongue juts out from the hillside. "; finstr = "^^A trail leads southwest down the hill, towards the bridge. From where \ you stand, it turns southeast and continues upward, deeply cut into the \ hillside. A narrower trail leads more steeply up to the east.^"; if (phase <= phAfternoon) { print "The park stretches off to the north and west, a vast expanse of \ bright meadowland, patched with dark woods and stitched with streams that \ glitter in the sunlight. In the distance, a lake reflects white fire from \ the setting sun."; print_paddr finstr; rtrue; } if (phase <= phSunsetClear) { print "The park stretches off to the north and west, a vast expanse of \ bright meadowland, patched with dark woods and stitched with streams that \ glitter in the sunlight. In the distance, a lake reflects orange fire from \ the setting sun."; print_paddr finstr; rtrue; } if (phase <= phSunsetClouding) { print "The park stretches off to the north and west, a vast expanse of \ bright meadowland, patched with dark woods and stitched with streams that \ glitter ruby in the sunlight. In the distance, a lake reflects red fire from \ the setting sun."; print_paddr finstr; rtrue; } if (phase <= phLight) { print "The park stretches off to the north and west, a vast expanse of \ luminous meadowland, patched with the dark emerald of forest. \ The streams are already shadowed in their beds. \ In the distance, a lake reflects red fire, beneath \ the greater fire that leaps silently on the horizon."; print_paddr finstr; rtrue; } if (phase <= phTwilight) { print "The park stretches off to the north and west, a vast expanse of \ dimming meadowland, patched with dark woods and stitched with dark streams. \ In the distance, a lake glows pale in the last light of the sky."; print_paddr finstr; rtrue; } if (phase <= phEveningMisty) { print "The park stretches off to the north and west, a vast expanse of \ dim meadowland, patched with dark woods and stitched with dark streams. \ A layer of mist is rolling across the landscape."; print_paddr finstr; rtrue; } if (phase <= phEveningDrizzly) { print "The park stretches off to the north and west, a vast expanse of \ dark meadowland, barely visible in the thickening mist."; print_paddr finstr; rtrue; } if (phase <= phNightRain) { print "A dark expanse stretches to the north and west, impenetrable with \ rain."; print_paddr finstr; rtrue; } if (phase <= phDream) { print "A black expanse stretches to the north and west, impenetrable with \ rain. Every few moments, a directionless flicker of lightning tries to \ pull detail from the darkness; but there is only mist."; print_paddr finstr; rtrue; } if (phase == phDawn) { print "The park stretches off to the north and west, a vast expanse of \ bright meadowland, patched with dark woods and stitched with streams that \ glitter in the sunlight."; print_paddr finstr; rtrue; } print "The part is a sloppy set of pen-strokes on a piece of graph paper that \ stretches into the distance. [BUG]"; print_paddr finstr; rtrue; ], sw_to Bank, d_to Bank, e_to [; print "The trail turns southeast as it climbs.^"; return Hilltop; ], se_to SteepFace, u_to "Two trails lead up from here; you can go southeast or east.", w_to "The hillside drops straight off to the stream in that direction.", nw_to "The hillside drops straight off to the stream in that direction.", n_to "The hillside drops straight down in that direction.", cant_go "The underbrush is too dense in that direction.", has light; Nearby widetrail "wide trail" with name "wide" "trail", description "The wide trail leads down to the southwest, and up across the hill to \ the southeast. The upward half seems deeply cut into the hillside; \ it's as if something had worn the rocky earth away.", has scenery; Nearby narrowtrail "narrow trail" with name "narrow" "trail", description "The narrow trail leads straight up the hillside to the east.", has scenery; Nearby lake "distant lake" with name "distant" "lake", found_in Outlook Bluff, description [; if (phase <= phAfternoon) "The lake is a line of distant white fire."; if (phase <= phSunsetClear) "The lake is a line of distant orange fire."; if (phase <= phSunsetClouding) "The lake is a line of distant red fire."; if (phase <= phLight) "The lake is a line of red fire beneath a greater golden and \ scarlet conflagration."; if (phase <= phTwilight) "The lake is a distant, pale glowing line."; if (phase <= phEveningMisty) "The lake is hidden in the mist."; if (phase <= phEveningDrizzly) "The lake is hidden in the mist and rain."; if (phase == phDawn) "The lake is a distant glitter."; "The lake is hidden in the black rain."; ], before [; if (sw__var ~= ##Examine) "It's miles away."; ], has scenery; Nearby trench "trench" with name "trench", description "The trench is a foot deep or so, and maybe a yard wide. \ It starts where the wide trail turns, and leads west over the \ bank.", before [; Dig: if (second == 0) { "You scrape some more dirt from the trench. Aside from getting \ your hands dirty, it accomplishes little."; } if (second == blanket) { CDefArt(second); " is not a very good digging tool."; } print "You scrape some more dirt from the trench. Aside from getting "; DefArt(second); " dirty, it accomplishes little."; ], has scenery; Nearby mud "mud" with name "dried" "mud", when_open [; ! for compactness, the "look" description of the trench and the mud ! are consolidated here. That's why the trench is scenery. print "Someone has dug a trench here, from the path out over the bank."; if (children(self) ~= 0) { if (children(self) == 1 && child(self) == spade) { print " Abandoned in the mud near it is a spade. You \ figure someone was using the spade to dig the trench, and you can also \ figure why "; if (random(13)==7) print "she"; else print "he"; print " stopped; the shaft is broken off about two feet \ up from the blade. The handle end is nowhere in sight."; } else { print " Stuck in the mud near it"; WriteListFrom(child(self), ISARE_BIT + FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print "."; } } new_line(); ], description [; if (self hasnt general) print "The excavation has left rather a lot of dirt and dried mud \ near the path."; else { if (phase >= phNightRainy) print "The excavation has left rather a lot of dirt and mud \ near the path. It's all been soaked by the rain, and it's pretty messy."; else print "The excavation has left rather a lot of dirt and dried mud \ near the path. Some of it has been wetted down."; } if (children(self) ~= 0) { print " Stuck in the mud"; WriteListFrom(child(self), ISARE_BIT + FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print "."; } new_line(); ], before [; LetGo: if (self hasnt general) { if (noun == spade) { CDefArt(noun); " is stuck in the dried mud. The shaft bends \ slightly; perhaps you can pull it free."; } CDefArt(noun); " is stuck in the dried mud."; } rfalse; Receive: if (self hasnt general) { "The mud is dry and quite hard."; } rfalse; Dig: if (self hasnt general) { "The mud is dry and quite hard."; } else { if (second == 0) { "You scrape some mud away. Aside from getting \ your hands dirty, it accomplishes little."; } if (second == blanket) { CDefArt(second); " is not a very good digging tool, even for mud."; } print "You scrape some mud away. Aside from getting "; DefArt(second); " dirty, it accomplishes little."; } ], after [; LetGo: CDefArt(noun); print " slides free of the mud.^"; rtrue; Receive: print "You drop "; DefArt(noun); print " into the mud.^"; if (noun == blanket && blanket hasnt general) { give blanket general; StopDaemon(blanket); } rtrue; ], has static container open; ! general means it's wet. Object spade "broken spade" mud with name "broken" "spade" "stick" "shaft" "blade", description [; print "It's a small spade; at least, the blade and about two feet of the \ shaft of one."; if (self in mud) { " The blade is buried in the mud."; } new_line; ], before [ ix; Tie: if (second == 0) "It's not fixable. Not by you, anyway."; Pull: if (self in mud) { if (mud hasnt general) <>; else <>; }; if (self in crack) { <>; } rfalse; Push: if (self in mud) { if (mud hasnt general) <>; else <>; }; if (self in crack) { <>; } rfalse; Attack: ix = 0; if (self in location) { print "You put one foot on the blade and get a good grip \ on what's left of the shaft.^^"; style underline; print "Crack!"; style roman; print "^^The shaft has snapped off right where it joins the blade.^"; ix = 1; } if (self in mud) { print "You get a good grip \ on what's left of the shaft.^^"; style underline; print "Crack!"; style roman; print "^^The shaft has snapped off right where it joins the blade. \ The blade is left buried in the mud.^"; ix = 1; } if (self in crack) { print "You get a good grip \ on what's left of the shaft.^^"; style underline; print "Crack!"; style roman; print "^^The shaft has snapped off right where it joins the blade. \ The blade is left wedged in the crack.^"; ix = 1; } if (self in player) { print "You get a good grip \ on what's left of the shaft, and raise the spade over \ your knee.^^"; style underline; print "Crack!"; style roman; print "^^The shaft has snapped off right where it joins the blade.^"; ix = 1; } if (ix==0) { "You're not holding the spade."; ! and abort. } move blade to parent(self); move stick to player; remove self; rtrue; ], has heavy; Object blade "spade blade" with name "spade" "blade", description "It's the blade of a small spade. There's nothing left of the shaft.", before [; PutOn: if (second == stick) "You have no way to reattach the blade to the shaft."; Tie: if (second == stick) "You have no way to reattach the blade to the shaft."; if (second == 0) "It's not fixable. Not by you, anyway."; Attack: "There's no way you can damage such a hefty chunk of metal."; Pull: if (self in mud || self in boulder) { <>; }; rfalse; Push: if (self in mud || self in boulder) { <>; }; rfalse; ]; Object stick "broken spade shaft" with name "spade" "shaft" "stick" "fizzgig", description "At this point, it's just a two-foot-long stick, broken at both ends.", before [; PutOn: if (second == blade) "You have no way to reattach the blade to the shaft."; Tie: if (second == blade) "You have no way to reattach the blade to the shaft."; if (second == 0) "It's not fixable. Not by you, anyway."; Attack: "It's too short to break any further."; Drop: if (verb_word == 'throw' && fox in location) { if (phase < phEveningDrizzly || phase == phDawn) { print "The fox cocks its head as you wind up; it tenses to spring, \ and you hurl the stick far back into the undergrowth. With a \ yip the fox streaks after it.^^"; foxboredom = 0; foxfetch = foxfetch+1; if (foxfetch ~= 2) { print "A moment later it's back, bushy tail high. It drops \ its prize at your feet."; move stick to location; } else { print "A moment later it's back, bushy tail high. It drops \ its prize at your feet with an unexpected "; style underline; print "clink."; style roman; remove stick; move key to location; } new_line; rtrue; } if (phase < phDream) { remove stick; "You wind up and hurl the stick into the undergrowth. The fox \ turn to watch it fly, and then looks back at you. Its expression \ is quite clear: if you want the stick lost in cold, dripping-wet \ vegetation, that's entirely a matter between you and the stick."; } if (phase == phDream) { remove stick; "You wind up and hurl the stick into the undergrowth. The fox \ doesn't even turn; its attention is focussed on something out \ in the darkness."; } } ], after [; Drop: if (fox in location) { if (phase < phEveningDrizzly) "Dropped. The fox watches it fall, then \ looks up at you with some disappointment."; if (phase < phDream) "Dropped. The fox watches it fall with vague, sodden interest."; } ]; [ KeyTransform; give key general; key.each_turn = $ffff; print "^That's odd. The steel key doesn't seem as rusty as you first thought.^"; ]; Object key "rusty key" with name "small" "rusty" "steel" "key", describe [; if (phase == phDream && key hasnt general) { key.each_turn = #r$KeyTransform; } "^A rusty steel key is lying on the ground."; ], description [; if (phase == phDream && key hasnt general) { key.each_turn = #r$KeyTransform; } if (phase ~= phDream) { "It's a small steel key, rather cheap-looking. It's also heavily worn and \ pitted with rust."; } else { "It's a small steel key, rather cheap-looking. It's slightly rusty."; }; ], invent [; if (phase == phDream && key hasnt general) { key.each_turn = #r$KeyTransform; } rfalse; ], before [; Drop: if (verb_word == 'throw' && fox in location) { if (phase < phEveningDrizzly || phase == phDawn) { print "The fox cocks its head as you wind up -- with curiosity, \ but willing to go along with it. \ It tenses to spring, \ and you hurl the key far back into the undergrowth. With a \ yip the fox streaks after it.^^"; foxboredom = 0; foxfetch = foxfetch+1; print "A moment later it's back, bushy tail high. It drops \ its prize at your feet."; remove key; move stick to location; new_line; rtrue; } if (phase < phDream) { remove key; "You wind up and hurl the key into the undergrowth. The fox \ turn to watch it fly, and then looks back at you. Its expression \ is quite clear: if you want the key lost in cold, dripping-wet \ vegetation, after all the trouble the fox went to to find it, \ that's entirely a matter between you and the key."; } if (phase == phDream) { remove key; "You wind up and hurl the key into the undergrowth. The fox \ doesn't even turn; its attention is focussed on something out \ in the darkness."; } } ], each_turn $ffff; ! this is so that the transformation routine can be enqueued. ! general means the player has noticed the transformation Object flow_o "runoff water" with name "stream" "flowing" "runoff" "water", describe [; new_line; indirect(self.description); rtrue; ], description [; "A stream of runoff water is flowing down from the southeast, and pouring \ down the trench to the unseen stream below."; ], article "some", has static; ! ----------------- Object Hilltop "Near Top of Hill" with name "hill" "top" "lump" "hilltop" "meadow" "meadows", description [; print "You are high on the hill; it rolls downward and off to the \ west. "; if (phase <= phAfternoon) print "Beyond the trees and brush, meadows glow in the sunlight. "; if (phase > phAfternoon && phase <= phSunsetClear) print "Beyond the trees and brush, meadows glow in the thickening sunlight. "; if (phase > phSunsetClear && phase <= phSunsetClouding) print "Beyond the trees and brush, meadows glow in the sunlight, \ sweeping to the ribbons of color on the horizon. "; if (phase > phSunsetClouding && phase <= phLight) { print "Beyond the trees and brush, the meadows burn \ in the incredible light. The crimson gold above the horizon is \ met and matched by a green which burns as bright, a living furnace \ of trees reaching in solemn exaltation to the clouds. \ The last breeze of the day flicks across your face, still warm with \ the scents of stone and soil, cool with the flavor of growing things.^^"; }; if (phase > phLight && phase <= phTwilight) print "Beyond the trees and brush, meadows fade in the last light. "; if (phase > phTwilight && phase <= phEveningMisty) print "Beyond the trees and brush, meadows fade in the mist. "; if (phase > phEveningMisty && phase <= phEveningDrizzly) print "Beyond the trees and brush, meadows fade in the mist and rain. "; if (phase > phEveningDrizzly && phase <= phNightRainy) print "Beyond the trees and brush, the world is cloaked in rain. "; if (phase > phNightRainy && phase <= phNightRain) print "Beyond the trees and brush, the world is cloaked in dark rain. "; if (phase > phNightRain && phase <= phDream) print "Beyond the trees and brush, the world is cloaked in dark rain, \ and scarred with distant lightning. "; if (phase == phDawn) print "Beyond the trees and brush, meadows glow in the dawn. "; "Behind you stands the last stony lump of hill. A narrow trail curves \ away to the northwest."; ], nw_to [; print "The trail turns west as it descends.^"; return Outlook; ], d_to [; print "The trail turns west as it descends.^"; return Outlook; ], w_to "The ground drops off, dangerously steeply, in that direction.", sw_to "The ground drops off, dangerously steeply, in that direction.", u_to "Unfortunately for your ambitions, the hilltop is too steep to scrabble up.", e_to [; if (cavemouth notin self) "Unfortunately for your ambitions, the hilltop is too steep to scrabble up."; if (boulder in self && boulder hasnt general) "There are only a few inches of space between the boulder and the cave \ mouth. You can't possibly squeeze through."; if (boulder in self) print "You squeeze behind the boulder and crawl inside.^"; else print "You crawl inside.^"; return Cave; ], in_to [; if (cavemouth notin self) "Unfortunately for your ambitions, the hilltop is too steep to scrabble up."; if (boulder in self && boulder hasnt general) "There are only a few inches of space between the boulder and the cave \ mouth. You can't possibly squeeze through."; return Cave; ], cant_go "The underbrush is too dense in that direction.", has light; Nearby narrowtrail2 "narrow trail" with name "narrow" "trail", description "The narrow trail curves down the hillside to the northwest.", has scenery; Nearby boulder "boulder" with name "boulder" "rock" "lump", initial [; if (self in Hilltop) { if (cavemouth notin Hilltop) "A boulder is half-buried at the base of the hilltop."; if (self hasnt general) "A boulder is half-buried at the base of the hilltop. The mouth of \ a small cave is just visible behind it."; print "A boulder is lying at the base of the hilltop, prised up out of the \ hole it was in. "; if (children(self) ~= 0) { print "The boulder is resting on "; WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print ". "; }; print "There's just enough room to squeeze into the cave behind it."; new_line; rtrue; } if (self in Outlook) { "The boulder is lying near here, wedged against a hummock."; } if (self in Wildflowers) { "The boulder is lying near here, on the path, wedged against the rise."; } "A boulder is bouncing up and down here, screaming ~Look at \ me!~ [BUG]"; ], description [; print "It's a roundish lump of rock -- about what you thought. \ Maybe two or two-and-a-half feet across."; if (children(self) ~= 0) { print " It's resting on "; WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print "."; } new_line; if (self in Hilltop && cavemouth notin Hilltop) { move cavemouth to Hilltop; print "^In the shadow behind the boulder, you notice an edge of \ deeper blackness. It's a cave of some sort.^"; } return; ], before [ dir; Search, LookUnder: indirect(self.description); rtrue; Dig: if (second == 0) "You'll just tear up your fingers, trying to scrape away under \ the boulder."; if (second == spade) { <>; } if (second == blade) { "The blade is thin enough to work under the boulder, but \ it's too short to give you any leverage."; } print "You can't work "; DefArt(second); " under the boulder."; LetGo: print "The boulder is resting full on "; DefArt(noun); "."; Receive: if (receive_action ~= ##Insert) "Putting things on the boulder would achieve nothing."; if (noun == spade) { <>; } if (noun == blade) { "The blade is thin enough to work under the boulder, but \ it's too short to give you any leverage."; } print "You can't work "; DefArt(noun); " under the boulder."; Take: "The boulder is too heavy to lift."; MoveWith: if (self in Hilltop && self hasnt general) { if (cavemouth notin Hilltop) { move cavemouth to Hilltop; print "You notice a cave of some sort behind the boulder. (Who \ would have guessed?)^^"; } if (second == spade) { give self general; remove spade; move blade to boulder; move stick to player; print "You push the spade under the boulder, kick the blade to settle \ it, and lean on the shaft. Nothing happens for a moment, and \ you're leaning harder, and the boulder starts to move, and^^"; style underline; print "Crack!"; style roman; "^^The spade's shaft has broken off in your hands, right above the \ blade, \ which is now caught under the boulder. \ On the other hand, you've moved the boulder up out of its \ hole; it's balanced on the rim."; } if (second == blade) { "The blade isn't long enough to give you any leverage."; } if (second == stick) { "The shaft is too thick to wedge under the boulder."; } rfalse; } if (self in Hilltop) { print "There's no need to use "; DefArt(second); ". The boulder is off-balance enough that you could probably move it \ by hand."; } if (second == blade) { "The blade isn't long enough to give you any leverage."; } if (second == stick) { "The shaft is too thick to wedge under the boulder."; } rfalse; Push, PushDir: if (self notin Hilltop) "You heave at the boulder a few times, but it's clearly not going \ anywhere."; if (self hasnt general) { if (cavemouth notin Hilltop) { move cavemouth to Hilltop; print "As you lean over the boulder, \ you notice a cave of some sort behind it.^^"; } "You grasp the boulder as best you can and heave -- fruitlessly. \ It's well sunk into the ground."; } if (action == ##PushDir) { dir = second; } else { dir = w_obj; } if (dir == u_obj || dir == d_obj) { "That's unclear. Try a compass direction."; } if (dir == e_obj) { BoulderOff(HillTop); give self ~general; "You grasp the boulder as best you can and heave. \ The boulder thumps neatly back into the hole it came from."; } if (dir == ne_obj || dir == se_obj) { "You heave at the boulder, but it's obviously not going to roll uphill."; } if (dir == n_obj || dir == nw_obj) { BoulderOff(HillTop); move self to Outlook; "You grasp the boulder as best you can and heave. \ It goes tumbling down the northwest path, out of sight."; } if (dir == s_obj || dir == sw_obj) { BoulderOff(HillTop); move self to Wildflowers; remove bush; print "You grasp the boulder as best you can and heave. \ It goes tumbling down the hill to the south, curving west \ with the slope. A few moments later you hear a small "; style underline; print "snap."; style roman; new_line; rtrue; } if (dir == w_obj) { BoulderOff(HillTop); remove self; print "You grasp the boulder as best you can and heave. \ It goes tumbling straight down the hill to the west, out of sight. \ A few moments later you hear a rending^^"; style underline; print "Crack!"; style roman; print "^^"; if (phase == phDream) { print "You feel a freezing rush down your back, and you know \ without seeing that the bridge below has been destroyed. You begin \ to rush downhill, but the trail seems to stretch and time takes on \ the weight of nightmare...^"; PauseBridgeDown(); } else { print "A sudden wave of nerves pulls you downhill after it....^^\ You were right; the bridge has been neatly demolished, and the boulder \ sits innocently in the stream, in the wreckage. \ So much for your little exploration. You go off, resigned, to tell \ the park rangers what you've done."; deadflag = 3; } rtrue; } return L__M(##PushDir,2); ! it's not a direction ], number 0, dam 13, has static container open; ! general means it's shifted away from the cave. (If location is not Hilltop, general ! is meaningless.) ! silently empty the boulder [ BoulderOff dest; if (dest == 0) { "Everything under the boulder seems stuck to it. [BUG]."; } while (child(boulder) ~= 0) { move child(boulder) to dest; } ]; Object cavemouth "cave mouth" with name "cave" "mouth" "cavemouth", description [; if (boulder in Hilltop) { if (boulder hasnt general) "You can only see a few inches of dark emptiness behind the boulder."; "It's a dark hole in the hillside. The boulder has been shifted far enough \ away that you could crawl in."; }; "It's a dark hole in the hillside, big enough to crawl into."; ], door_dir e_to, door_to Cave, before [; Search: "You can't see far into the cave."; ], has scenery door; ! This should be moved to Hilltop when you discover it (by looking behind the boulder or ! moving it or whatever) ! ----------------- Object Cave "Small Cave" with name "small" "cave" "crack", description [; print "You are in a dark pocket, a stony crack below the summit of the \ hill. It is not quite high enough to stand in, but surprisingly long, \ narrowing only slowly towards the back. The entrance is a "; if (phase <= phAfternoon || phase == phDawn) print "circle of brilliant blue"; if (phase > phAfternoon && phase < phLight) print "circle of scarlet and gold"; if (phase == phLight) print "circle of blinding crimson"; if (phase > phLight && phase <= phTwilight) print "circle of bright sky"; if (phase > phTwilight && phase <= phEveningDrizzly) print "lit circle of grey"; if (phase > phEveningDrizzly && phase <= phDream) print "dim circle of grey"; print " to the west"; if (boulder in Hilltop) print ", partially obscured by the boulder"; print ".^"; ], w_to [; print "You crawl out."; if (phase >= phNightRainy && phase <= phDream) print " The rain lashes your face."; if (phase == phDawn) print " The brilliant sky burns gently in your eyes."; new_line; return Hilltop; ], out_to [; print "You crawl out."; if (phase >= phNightRainy && phase <= phDream) print " The rain lashes your face."; if (phase == phDawn) print " The brilliant sky burns gently in your eyes."; new_line; return Hilltop; ], e_to "The cave narrows to a crack in back; you really can't go very far.", in_to "The cave narrows to a crack in back; you really can't go very far.", cant_go "The only way out is to the west.", has light indoors; Nearby blanket "blanket" with name "old" "ratty" "ancient" "filthy" "blanket", initial "An ancient and filthy blanket is crumpled against one wall of the cave.", description [; print "It's a ratty old blanket, torn and mouse-chewed, \ tangled with bits of twig and old leaves. "; if (self hasnt general) print "Nonetheless, it looks warm.^"; else print "It's thoroughly soaked.^"; rtrue; ], before [; Wave: if (self hasnt general) "The blanket flaps nicely."; else "The blanket flaps heavily. A few drops of water fly off."; Turn, Squeeze: if (self has general) "You squeeze a trickle of water out, but the blanket is still \ nothing like dry."; ], daemon [ ix; if (self has general) { StopDaemon(self); "^A daemon crawls out of the blanket and shouts ~Hey! Who \ soaked my blanket?!~ [BUG]"; } if (phase < phEveningDrizzly || phase >= phDawn) return; ix = ancestor(self); if (ix has indoors) return; if (phase == phEveningDrizzly) { if (clock % 2 == 0 && ix == ancestor(player)) "^The blanket is getting damp."; ! in either case... return; } give self general; StopDaemon(self); ! remember to restart it if the blanket gets dry (which it won't in this game) if (ix == ancestor(player)) "^The blanket has gotten quite soaked."; ]; ! general means wet. Nearby caveboulder "boulder" with name "boulder" "rock" "lump", description [; "The boulder lies in the cave's mouth, but there's enough space to \ squeeze out past it."; ], before [; if (boulder notin Hilltop) { "The boulder is gone!"; } Push: <>; PushDir: if (second == out_obj) second = w_obj; if (second ~= w_obj) "From inside the cave, you can't get enough leverage to push \ any direction but straight out."; <>; ], has scenery; ! ----------------- Object Wildflowers "Wildflowers" with name "flower" "flowers" "wild" "vine" "vines", description [; if (phase <= phSunsetClouding) print "Elsewhere in the park, flowers lie in hollows and peek out from under \ the brush. Here you have found a profusion of them. Sprays of white and \ blue lie everywhere; the vines ripple yellow."; if (phase > phSunsetClouding && phase <= phLight) print "Elsewhere in the park, flowers lie in hollows and peek out from under \ the brush. Here you have found a profusion of them. Sprays of white and \ blue lie everywhere; the vines ripple yellow in the bronze light. Behind \ it all is the wild, ecstatic greenery, bright against the dimming sky."; if (phase > phLight && phase <= phEveningMisty) print "Elsewhere in the park, flowers lie in hollows and peek out from under \ the brush. Here you have found a profusion of them. Sprays of white and \ blue lie everywhere; the vines ripple yellow, although the blooms are closing \ for the night."; if (phase > phEveningMisty && phase <= phEveningDrizzly) print "A profusion of flowers lie here, mostly furled against the rain. Edges \ of white and blue and yellow show in the dim light."; if (phase > phEveningDrizzly && phase <= phDream) print "A profusion of flowers lie here, mostly furled against the rain. Edges \ of white and blue and yellow barely show in the darkness."; if (phase == phDawn) print "Elsewhere in the park, flowers lie in hollows and peek out from under \ the brush. Here you have found a profusion of them. Sprays of white and \ blue lie everywhere; the vines ripple yellow. A glorious array of reds \ and purples have opened their eyes to the morning."; print "^^Beyond a slight rise to the \ west, the ground drops precipitously to the stream. \ A trail leads northward towards the bridge; another heads steeply \ up to the east, and a third curves around the hill to the southeast."; new_line; return; ], n_to Bank, d_to Bank, e_to [; print "The trail turns northeast as it climbs.^"; return SteepFace; ], u_to "Two trails lead up from here; you can go east or southeast.", ne_to "The hill is too steep in that direction.", se_to [; print "You have barely left sight of the wildflowers when the trail ends. \ It looks like it was washed out; and the scree that covers the hill face \ is much too unstable to venture across. You have no choice but to return.^"; return (-1); ], w_to "Beyond the rise, the hill drops almost straight down to the stream.", sw_to "Beyond the rise, the hill drops almost straight down to the stream.", cant_go "The underbrush is too dense in that direction.", has light; Nearby bucket "battered tin bucket" with name "battered" "tin" "bucket" "glint" "metal" "metallic", short_name [; if (self hasnt moved) { print "metallic glint"; rtrue; } rfalse; ], describe [; if (self hasnt moved) "^A glint in a nearby bush looks more metallic than floral."; if (children(self)==0) "^A battered tin bucket stands nearby."; print "^A battered tin bucket stands nearby; in it"; WriteListFrom(child(self), ISARE_BIT + FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); "."; ], invent [; if (inventory_stage==2) { if (children(self) == 0) rtrue; print " (which holds "; WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print ")"; rtrue; }; ], description [; print "A grey lump, with a surface like a tin prune. But it's still \ bucket-shaped."; if (children(self) ~= 0) { print " It contains "; WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print "."; } new_line; ], after [; Receive: if (water in self) { print "You put "; DefArt(noun); print " into "; DefArt(self); print ". Unsurprisingly, it gets wet.^"; if (noun == blanket && blanket hasnt general) { give blanket general; StopDaemon(blanket); } rtrue; } ], before [; Examine: if (self hasnt moved) { give self moved; "It's a battered old tin bucket."; } rfalse; Receive: if (self hasnt moved) { give self moved; print "Huh? Into the glint? ...Oh, gosh, it's a bucket. \ (Fancy that.) "; } if (noun == dirtybag || noun == tornbag) { "The sandbag is much larger than the bucket."; } if (noun == branch) { "The branch is much larger than the bucket."; } if (noun == stream) <>; rfalse; Take: if (self hasnt moved) { give self moved; print "(It turns out to be a battered old tin bucket.) "; } rfalse; Fill: if (stream in location || flow_f in location || flow_sf in location || flow_o in location || flow_b in location) { if (water in self) "The bucket is already full of water."; print "You fill the bucket with water."; if (children(self) ~= 0) { print " Unsurprisingly, "; WriteListFrom(child(self), DEFART_BIT + FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); if (children(self) == 1) print " gets wet."; else print " get wet."; if (phase > phEveningDrizzly && phase <= phDream) print " (Or wetter.)"; }; new_line(); move water to self; if (blanket in self && blanket hasnt general) { give blanket general; StopDaemon(blanket); } rtrue; }; "There is nothing here to fill it with."; EmptyT: if (water in self) { <>; } rfalse; ], has container open ~heavy; Nearby rise "rise" with name "rise" "ridge", description "It's just a stony ridge; the ground slopes up a few feet \ before dropping off to the stream.", before [; Dig, Attack: "You don't make much impression in the stony earth."; ], has scenery; Object water "quantity of water" with name "bucketful" "quantity" "of" "water", describe "A glob of water is pulsating on the ground here. [BUG]", description "It's water. It's in the bucket.", before [ ix; Drink: "You taste the water. \ It's cool -- with not the antiseptic bite of city tap water, \ but an indefinable vitality."; Drop: remove self; "The water splashes on the ground and dribbles away."; PutOn: remove self; ix = 0; if (second == blanket) { ix = 1; print "The water splashes onto the blanket"; if (blanket has general) { print ", which would be soaked if it wasn't already."; } else { print ", which is quite soaked."; give blanket general; StopDaemon(blanket); } } if (second == mud || (second == spade && spade in mud && mud hasnt general) || (second == blade && blade in mud && mud hasnt general)) { ix = 1; if (mud hasnt general) { if (spade in mud) { print "You splash the water around the spade. The mud \ absorbs it greedily."; } else { if (blade in mud) { print "You splash the water around the blade. The mud \ absorbs it greedily."; } else { print "The mud curses you foully. [BUG]"; } } give mud general; } else { if (phase >= phNightRainy && phase <= phDream) print "You splash the water into the mud. In this \ rain, it's an impressively useless maneuver."; else print "You splash the water into the mud, which gets wetter."; } } if (second == stream) { ix = 1; print "You pour the water back."; } if (second == flow_f || second == flow_sf || second == flow_o || second == flow_b) { ix = 1; print "You empty the bucket onto the trail."; } if (second == trench) { ix = 1; print "The water splashes into the trench and down it. \ You hear it dribble into the stream below."; } if (second == widetrail) { ix = 1; print "The water splashes onto the wide trail and down the trench. \ You hear it dribble into the stream below."; } if (second == fox) { ix = 1; if (phase == phDream) { print "You fling the bucketful of water up at the fox. It jerks \ as if shot, and snaps a glare at you that sends a chill down "; style underline; print "your"; style roman; print " spine; but then it returns to its vigil."; } else print "You empty the bucket onto a spot where the fox suddenly \ isn't any more. The water dribbles away, and the fox looks up \ at you piercingly, as if having second thoughts."; } if (ix == 0) { print "The water splashes over "; DefArt(second); print " and dribbles away."; } new_line; rtrue; Take: "Having it in the bucket isn't good enough?"; ]; Object flow_f "runoff water" with name "stream" "flowing" "runoff" "water", describe [; new_line; indirect(self.description); rtrue; ], description [; if (self hasnt general) { "A stream of runoff water is flowing down from the east, and backing \ up on the path here."; } else { "A stream of runoff water is flowing down from the east, angling off \ the rise, and vanishing down the path to the north."; } ], article "some", has static; ! ----------------- Object SteepFace "Steep Face" with name "face" "brush", description [ tdesc; tdesc = "Trails angle down to the northwest and southwest. Another crosses the \ hill to the south, but a chunk is washed out, too wide to jump across.^"; if (phase <= phSunsetClear || phase == phDawn) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Greenery hides the stream below and the hilltop above, but the meadows and \ sky beyond sweep away endlessly to the west.^^"; print_paddr tdesc; rtrue; } if (phase <= phSunsetClouding) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Greenery hides the stream below and the hilltop above, but the meadows and \ sky beyond sweep away to the clouds in the west.^^"; print_paddr tdesc; rtrue; } if (phase <= phLight) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Greenery hides the stream below and the hilltop above, and the meadows and \ sky beyond sweep away into the incandescent west.^^"; print_paddr tdesc; rtrue; } if (phase <= phTwilight) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Greenery hides the stream below and the hilltop above, but the meadows and \ sky beyond sweep away into the west.^^"; print_paddr tdesc; rtrue; } if (phase <= phEveningDrizzly) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Mist hides the stream below and the hilltop above, but the meadows and \ clouds beyond sweep away into the west.^^"; print_paddr tdesc; rtrue; } if (phase <= phNightRain) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Rain hides the stream below and the hilltop above, and to the west is \ only dark.^^"; print_paddr tdesc; rtrue; } if (phase <= phDream) { print "You're standing on a ledge, on a rather steep, overgrown hillface. \ Rain hides the stream below and the hilltop above, and to the west is \ only dark.^^"; print_paddr tdesc; rtrue; } print "The hillside is being unbolted and hauled away by teams of swearing \ daemons. [BUG].^"; rtrue; ], nw_to Outlook, sw_to [; print "The trail turns west as it descends.^"; return Wildflowers; ], s_to [ res; res = TestGap(Bluff); return res; ], u_to "The hill is too steep and overgrown to climb.", ne_to "The hill is too steep and overgrown to climb.", e_to "The hill is too steep and overgrown to climb.", se_to "The hill is too steep and overgrown to climb.", d_to "Two trails lead down from here; you can go northwest or southwest.", w_to "The hill is too steep and overgrown to descend.", cant_go "The underbrush is too dense in that direction.", has light; Nearby crack "crack in the hillside" with name "crack" "in" "hillside", found_in SteepFace Bluff, describe [ gapdir; if (self in SteepFace) gapdir = "south"; else gapdir = "north"; if (bush in self) { print "^A bush is growing out of a crack in the hillside, to the "; print_paddr gapdir; print ". It's right in the gap in the "; print_paddr gapdir; print "ern path."; if (bush hasnt general) { give bush general; print " You could probably use it to get across. \ (One of those little coincidences that makes your life \ a little nicer.)"; } new_line; rtrue; } if (children(self) ~= 0) { new_line; CDefArt(child(self)); print " is jammed into a crack in the hillside, to the "; print_paddr gapdir; print ". It's right in the gap in the "; print_paddr gapdir; print "ern path.^"; rtrue; } if (bush hasnt general) { ! we've never seen the bush print "^There's a crack in the hillside, to the "; print_paddr gapdir; print ". It's right in the gap in the "; print_paddr gapdir; print "ern path. A few splinters jut out, evidence of something \ demolished by the falling boulder."; new_line; rtrue; } print "^The bush seems to have been utterly demolished by the falling boulder. \ Nothing is left in the crack but a couple of splinters."; if (crack hasnt general) { give crack general; print " (One of those little coincidences that makes your life \ a little stranger.)"; } new_line; rtrue; ], description [; if (bush in self) { "The crack is only about as long as your hand, and too narrow to jam even a \ finger into. A small bush is rooted in the crack, apparently by sheer \ will."; } if (blade in self) { print "The crack is only about as long as your hand. "; CDefArt(child(self)); " is wedged into it, and there's enough sticking out to make a decent \ foothold -- for one foot, at least."; } if (spade in self) { print "The crack is only about as long as your hand. "; CDefArt(child(self)); " is wedged into it."; } "The crack is only about as long as your hand, and too narrow to jam even a \ finger into."; ], before [; Search: if (bush in self) { "A small bush is rooted in the crack, apparently by sheer \ will."; } if (blade in self) { CDefArt(child(self)); " is wedged into the crack, and there's enough sticking out to make a decent \ foothold -- for one foot, at least."; } if (spade in self) { CDefArt(child(self)); " is wedged into the crack."; } "The crack is empty."; Receive: if (noun == water) { "The water dribbles over the crack and down the hillside."; } if (children(self) ~= 0) { CDefArt(child(self)); " already fills the crack."; } if (noun == blanket || noun == key || noun == handsand) { print "You can't get "; DefArt(noun); " to stay in the crack."; } if (noun ~= blade && noun ~= spade) { CDefArt(noun); " is too wide to go into the crack."; } move noun to self; CDefArt(noun); " slips into the crack. You stretch and give it a couple of whacks, to wedge \ it in place."; LetGo: if (noun == spade) { CDefArt(noun); " is too tightly wedged into the crack. \ The shaft bends slightly; perhaps you can pull it free."; } CDefArt(noun); " is too tightly wedged into the crack."; ThrownOver: print "Tossing things over "; DefArt(self); print " would achieve nothing. Perhaps you want to throw it \ over the gap in the trail?^"; rtrue; ], has static container open; ! general means the smartass message has been displayed. Nearby tree "tall tree" with name "tall" "lone" "tree", short_name [; if (self has general) { print "shattered tree"; rtrue; } rfalse; ], describe [; if (tree hasnt general) { print "^Among the hill's brush and scraggly trees, the tree that \ stands here stands \ alone. You might be able to get your arms around it, and you might \ not; it must reach nearly as high as the hilltop itself."; } else { print "^The lone tree has been laid low. About ten feet still sticks up from \ the ground; the rest lies across the path and \ downslope, splintered and scorched."; } new_line; rtrue; ], description [; if (self hasnt general) { "It's certainly the tallest thing you can see in any direction. \ You have no hope of figuring out what species it is."; } else { "The tree has fallen downslope, across the path, \ and is lying awkwardly in the undergrowth. \ The upper end -- which is to say, the lower end -- is blackened and split."; } ], before [; Climb: if (self hasnt general) { "The trunk is smooth and the lowest branch is at least twenty feet \ in the air."; } else { if (phase == phDream) { "You look at the blackened remains of the tree. Perhaps it's true \ that lightning never strikes in the same place. And perhaps \ you'd be quick-roasted. Either way, there's not that much left to \ climb."; } else { "There's not that much left to climb."; } }; GoUnder: if (self has general) { "There's not enough left for a fox to shelter under."; } print "You already are under the tree."; if (phase == phEveningDrizzly) { print " It's too tall to keep the drizzle off much."; } if (phase >= phNightRainy && phase < phDream) { print " It's too tall to keep the rain off."; } if (phase == phDream) { print " You're not sure it's the best place to be, either."; } new_line; rtrue; ], dam 1, number 0, has static; ! general means it's fallen Nearby gaptrail "washed-out trail" with name "washed" "out" "washed-out" "trail", found_in SteepFace Bluff, description [; if (location == SteepFace) print "The trail leads south across the hillface, \ a level ledge worn into the soil. \ Just south of you a large chunk has been washed away. A small crack is visible \ by the middle of the gap, about even with the ledge. "; else print "The trail leads north across the hillface, \ a level ledge worn into the soil. \ Just north of you a large chunk has been washed away. A small crack is visible \ by the middle of the gap, about even with the ledge. "; <>; ], before [; ThrownAt: <>; Receive: <>; ], has scenery; Nearby gap "gap in the trail" with name "gap" "chunk" "hole" "pit" "space", found_in SteepFace Bluff, description [; if (location == SteepFace) print "Just south of you a large chunk of the trail \ has been washed away. A small crack is visible \ by the middle of the gap, about even with the ledge. "; else print "Just north of you a large chunk of the trail \ has been washed away. A small crack is visible \ by the middle of the gap, about even with the ledge. "; <>; ], before [ dest; JumpOver: "The gap is too wide to jump across."; ThrownOver: if (location == SteepFace) dest = Bluff; else dest = SteepFace; if (noun == tornbag) { move noun to dest; TearBag(); print "You heave "; DefArt(noun); " across the gap. It thuds onto the trail on the other side, tearing \ wide open. Sand spills out onto the ground."; } if (noun == dirtybag) { move noun to dest; print "You heave "; DefArt(noun); " across the gap; it thuds onto the trail on the other side."; } if (noun == bucket && water in bucket) { move noun to dest; remove water; print "You toss "; DefArt(noun); " across the gap; it lands on the trail, but tips, and the water \ spills out."; } move noun to dest; print "You toss "; DefArt(noun); " across the gap; it lands easily on the trail on the other side."; ], has scenery; Object bush "bush" crack, with name "bush", before [; Enter: if (bush in crack) { if (location == SteepFace) <>; if (location == Bluff) <>; } ], has scenery; ! general means the smartass message has been displayed. Object branch "heavy branch" with name "heavy" "branch", describe [; if (self hasnt moved) { if (self has light) { "^A heavy branch seems to have been blown from the tree. It lies on \ the ground nearby. One end is still burning."; } else { "^A heavy branch seems to have been blown from the tree. It lies on \ the ground nearby, blackened but no longer burning."; } } else { if (self has light) { "^A heavy branch lies on \ the ground nearby. One end is still burning."; } else { "^A heavy branch lies on \ the ground nearby, blackened but no longer burning."; } } ], InitObject [; give branch light; branch.number = 14; StartDaemon(branch); ], description [; if (self has light) { "It's a little off true but sturdy -- perhaps a yard long, and thicker \ than your wrist. One end is \ on fire."; } else { "It's a little off true but sturdy -- perhaps a yard long, and thicker \ than your wrist. One end is \ blackened."; } ], before [; Attack: "You can't even bend it."; Wave, Swing, Blow: if (self hasnt light) { "It's too late; the flame is out."; } if (self.number <= 5) self.number = self.number + 3; else self.number = self.number + 1; if (action == ##Blow) print "You blow on"; else print "You wave"; " the branch vigorously, and the flame brightens a bit."; ], invent [; if (inventory_stage==2) { if (self has light) print " (which is burning)"; rtrue; }; ], after [; Take: if (self has light) { "Taken. The flame brightens a bit as you swing it up."; } ], daemon [; if (self.number <= 0 || parent(self) == 0) { give self ~light; StopDaemon(self); rtrue; }; if (ancestor(self) hasnt indoors) { self.number = self.number - 2; } else { self.number = self.number - 1; } if (self.number <= 0) { give self ~light; StopDaemon(self); if (ancestor(self) == location) { "^The branch's flame hisses out."; } } ], each_turn [; if (self has light) { if (location hasnt indoors && self.number < 6) { "^The branch's flame flickers and smokes in the rain."; } if (self.number < 3) { "^The branch's flame is slowly dying."; } } ], number 0, has heavy; ! has light if its burning. To silently shut it down, just set branch.number to 0 or ! remove it. Object flow_sf "runoff water" with name "flowing" "runoff" "water", describe [; new_line; indirect(self.description); rtrue; ], description [; if (self hasnt general) { if (tree hasnt general) { "Runoff water is flowing down the hillside here. It puddles on \ the ledge, and streams down the northwest path."; } else { "Runoff water is flowing down the hillside here. It puddles on \ the ledge, behind the fallen tree."; } } else { print "Runoff water is flowing down the hillside here. It puddles on \ the ledge, behind the fallen tree, and streams down the southwest path."; if (dirtybag in SteepFace && tornbag in SteepFace) { print " The sandbags are lying in the torrent, but the path is too \ wide here; the water pours around them."; } else { if (dirtybag in SteepFace || tornbag in SteepFace) { print " The sandbag is lying in the torrent, but the path is too \ wide here; the water pours around it."; } } new_line; rtrue; } ], article "some", has static; ! returns a destination (a room number, or 1 for can't-go) [ TestGap dest burden; if (dest==0) { "You stretch a foot towards the gap, then stop as the stars of the Sea \ glitter beyond it. [BUG]."; } if (children(crack) == 0) { "The gap is too wide to jump, and you'll never get a foothold in that crack."; } burden = FindBurden(); if (burden == 1) { print "You heft your burden, considering the balance. "; } else { if (burden ~= 0) { print "You heft "; DefArt(burden); print ", considering your balance. "; } } if (bush in crack) { print "You stretch a foot towards the bush, shift your weight, and \ take two quick steps. The bush trembles but holds.^"; return dest; } if (blade in crack || spade in crack) { if (burden ~= 0) { print "You realize that you'll never make it across. \ The blade only sticks out a few inches from the hillside"; if (spade in crack) { print ", and the shaft won't hold you"; } print "; you'd be \ off-balance enough by yourself, never mind what you're carrying.^"; rtrue; } if (spade in crack) { print "The shaft will never hold your weight. "; } print "You flatten your body against the hillside, and stretch a foot \ towards the spade blade, off-center though you'll be. \ One quick step; you manage to fall forward \ onto the trail rather than sideways.^"; return dest; } print "You go to cross, but "; DefArt(child(crack)); " bites you on the foot. [BUG]"; ]; [ WhackTree ix; if (tree has general) { print " The tree screams ~I'm down, I'm down, don't hit me again!~ [BUG]"; rtrue; } give tree general; ix = parent(tree); remove tree; move branch to ix; move tree to ix; indirect(branch.InitObject); if (location == SteepFace) { print " It is echoed by a splintering concussion right above \ your head, or, from the feel of it, just inside.^^You \ watch the tree topple through blobs of dull color."; player.each_turn = #r$FellDown; rtrue; } print " It is echoed by a splintering crash from "; if (location == thedark) print "somewhere outside."; if (location == Bank) print "the southeast."; if (location == Outlook) print "the southeast."; if (location == Wildflowers) print "the northeast."; if (location == Bluff) print "the north."; if (location == Shed) print "the north."; if (location == Hilltop) print "the southwest."; if (location == Cave) print "the southwest."; ]; [ FellDown; player.each_turn = $ffff; "^You pick yourself up shakily, although you can't quite remember falling. \ The air is full of smoke."; ]; ! ----------------- Object Bluff "Edge of Bluff" with name "bluff" "meadow" "meadows" "tree" "trees", description [; if (phase <= phSunsetClouding || phase == phDawn) print "You are in a dense tangle of bushes and small trees. The ground falls \ away to the southeast, to the meadows below; you can see a lake far to the \ west."; if (phase > phSunsetClouding && phase <= phLight) print "You are in a dense tangle of bushes, small trees, and shadow. \ The ground falls \ away to the southeast, to the green meadows below; you can see a lake far to the \ west."; if (phase > phLight && phase <= phEveningMisty) print "You are in a dense tangle of shadow, bushes, and small trees. \ The ground falls \ away to the southeast, to the darkening meadows below."; if (phase > phEveningMisty && phase <= phEveningDrizzly) print "You are in a dense tangle of shadow, bushes, and small trees. \ The ground falls \ away to the southeast, to the misty meadows below."; if (phase > phEveningDrizzly && phase <= phDream) print "You are in a dense tangle of shadow, bushes, and small trees. \ The ground falls \ away to the southeast, into darkness and rain."; print "^^A trail curves down to the southwest. \ Another cuts along the hill to the north, but a chunk is washed out, \ too wide to jump across.^"; ], n_to [ res; res = TestGap(SteepFace); return res; ], e_to sheddoor, in_to sheddoor, sw_to [; print "You have barely left sight of the shed when the trail ends. \ It looks like it was washed out; and the scree that covers the hill face \ is much too unstable to venture across. You have no choice but to return.^"; return (-1); ], s_to "The ground drops almost straight down in that direction.", ne_to "The hill is too steep and overgrown to climb.", d_to "Jumping off the bluff wouldn't work well. Perhaps the trail to the \ southwest.", u_to "No trails go up the hill from here, and the undergrowth is too heavy \ to push through.", cant_go "The undergrowth is too dense in that direction.", before [; Go: if (noun == e_obj || noun == in_obj || noun == sheddoor) { if (sheddoor hasnt open) { print "The door to the shed is closed. You tug on it and rattle the \ latch, but it's locked"; if (phase ~= phDream) ", and the lock looks hopelessly rusted."; else "."; } print "You step hesitantly into the darkness.^"; rfalse; } ], has light; Nearby sheddoor "old shed" with name "old" "shed" "door" "lock", describe [; print "^An old shed stands just to the east. "; print "It's weathered but sturdy, \ still wearing the tatters of a coat of white paint. "; if (self has open) "The door is open to the unrelieved darkness within."; else "The door is closed."; ], description [; print "The shed is weathered but sturdy, \ still wearing the tatters of a coat of white paint. "; if (self has open) "The door is open to the unrelieved darkness within."; else { if (phase ~= phDream) "The door is closed. The lock looks badly rusted."; else "The door is closed. The lock looks rusty."; } ], before [; Attack: "It may be weathered, but it's not weakened. You can't even \ shake it."; Search: if (self hasnt open) "The door is closed."; "It's dark in there, and you can't see a thing."; ], after [; Unlock: if (phase ~= phDream) { ! ok, this is a goofy way to do it. It works, though. give self locked; "The lock is rusted tight. You can barely get the key in, and it \ has no faint hope of turning." } give self open; if (phase == phDream && key hasnt general) { key.each_turn = #r$KeyTransform; } "The lock is stiff. You give the key a jerk; the latch scrapes, \ and the door swings open."; Close: give self locked; "You push the door shut, and the latch snaps to."; Lock: "A daemon pops out of the lock. ~Hey! How'd you close this without \ locking it?~ He snaps the latch closed and vanishes. [BUG]"; Open: "A daemon pops out of the lock. ~Hey! How'd you unlock this without \ opening it?~ He yanks the door open and vanishes. [BUG]"; ], with_key key, door_to Shed, door_dir e_to, has static door openable lockable locked; ! ----------------- Object Shed "In a Small Shed" with name "small" "shed", description [; if (location == thedark) { "You feel the hollow darkness of an enclosed space. To the west, \ an oblong of flat \ grey half-light betrays the doorway. Nothing else is visible."; } if (phase ~= phDream) { "A team of daemons is hurriedly painting the shed dark. [BUG]"; } "The shed is only a few paces long, and nearly empty. The door is \ to the west."; ], out_to sheddoor2, w_to sheddoor2, cant_go [; if (location == thedark) "The only exit you can make out is to the west."; "The only exit is to the west."; ], has indoors; Nearby sheddoor2 "shed door" with name "old" "shed" "door", door_to Bluff, door_dir w_to, before [; Close, Push, Pull: "The door latches from the outside. Closing it would be less than clever."; ], has scenery door open lockable; Nearby dirtybag "dirty sandbag" with name "dirty" "untorn" "whole" "canvas" "sand" "sandbag" "bag" "sandbags" "bags", describe [; if (parent(dirtybag) == parent(tornbag)) { if (dirtybag in Bank || dirtybag in Wildflowers) { "^A pair of large canvas bags lie at a narrow point on the path. \ One is rather dirty; \ the other has a tear along one seam, from which sand dribbles onto the \ ground."; } "^A pair of large canvas bags is piled untidily here. One is rather dirty; \ the other has a tear along one seam, from which sand dribbles onto the \ ground."; } if (dirtybag in Bank || dirtybag in Wildflowers) { "^A dirty sandbag is lying in a narrow part of the path."; } "^A dirty sandbag is lying on the ground."; ], description [; print "It's a canvas bag, more than two feet long. The surface is liberally \ smeared with mud."; if (self.number ~= 0) { print " Water is backed up behind it."; } new_line; return; ], before [; Take: if (phase == phDawn) "After all you've done to get it there?"; if (tornbag in player) "One of these things, you can barely carry. Two, never."; if (self.number > 0) { print "There is water backed up behind "; DefArt(self); ". Releasing it in a surge would probably be a mistake."; } Open: "It's sewn shut."; Attack: "You give the canvas a vicious yank, but it doesn't give way."; Insert: if (second == flow_sf || second == flow_o || second == flow_f || second == flow_b) { <>; } ], after [; Take: "You heave the dirty sandbag, awkwardly, up into your arms."; Drop: if (location == SteepFace && flow_sf in SteepFace) "You drop the dirty sandbag, but the path is too wide here; \ the water pours around it."; rfalse; ], dam 4, number 0, has heavy; Nearby tornbag "torn sandbag" with name "torn" "ripped" "canvas" "sand" "sandbag" "bag" "sandbags" "bags", describe [; if (parent(dirtybag) == parent(tornbag)) { rtrue; } if (tornbag in Bank || tornbag in Wildflowers) { "^A torn sandbag is lying in a narrow part of the path."; } "^A torn sandbag is lying on the ground."; ], description [; print "It's a canvas bag, more than two feet long. A palm-length tear along a seam \ leaks sand."; if (self.number ~= 0) { print " Water is backed up behind it."; } new_line; return; ], before [; Take: if (phase == phDawn) "After all you've done to get it there?"; if (dirtybag in player) "One of these things, you can barely carry. Two, never."; if (self.number > 0) { print "There is water backed up behind "; DefArt(self); ". Releasing it in a surge would probably be a mistake."; } Open: "It's sewn shut."; Attack: if (phase == phDawn) "After all you've done to get it there?"; print "You give the canvas a vicious yank. It tears more easily than you \ thought, and you're left staring at a canvas rag and a pile of sand that's \ gone "; style underline; print "floomph"; style roman; print " over your feet.^"; TearBag(); rtrue; Insert: if (second == flow_sf || second == flow_o || second == flow_f || second == flow_b) { <>; } ], after [; Take: "You heave the torn sandbag, awkwardly, up into your arms. You manage \ to do it without straining the torn cloth further."; Drop: if (location == SteepFace && flow_sf in SteepFace) "You drop the torn sandbag, but the path is too wide here; \ the water pours around it."; "You lower the torn sandbag to the ground, trying not to strain it."; rfalse; ], dam 4, number 0, has heavy; [ TearBag; if (parent(tornbag) == nothing) { "The bag tears apart, and sand floats out into the Void. [BUG]"; } move sand to ancestor(tornbag); move canvas to parent(tornbag); if (parent(sand) has indoors) { sand.number = 0; } else { sand.number = 8; StartDaemon(sand); } remove tornbag; ]; Object canvas "torn piece of canvas" with name "torn" "ripped" "rag" "piece" "of" "canvas", describe [; "^A canvas rag, the remnant of the torn sandbag, is lying here."; ], description "It's a forlorn, sodden scrap of canvas.", before [; Tie: if (second == 0) "It's not fixable. Not by you, anyway."; Receive: "The torn sandbag will never hold anything again."; Attack: "Tearing it further wouldn't help matters."; ], invent [; if (inventory_stage==2) { if (children(self) == 0) rtrue; print " (which holds "; WriteListFrom(child(self), FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT); print " [BUG])"; rtrue; }; ], has container open; Object sand "pile of sand", with name "pile" "of" "sand", describe [; if (self.number == 0) "^A small pile of sand is spilled across the ground."; else "^A pathetic pile of sand is slowly washing away in the rain."; ], number 0, ! positive if washing away, zero otherwise before [; Take: if (parent(handsand) ~= 0) { "You already have some sand."; } move handsand to player; print "You scoop up a handful of sand.^"; rtrue; ], daemon [; self.number = self.number - 1; if (self.number == 1) { StopDaemon(self); if (self in location) { print "^The last of the sand has washed away.^"; } remove self; } ], has static; Object handsand "handful of sand", with name "handful" "hand" "of" "sand", before [; Drop: remove self; "The handful of sand is immediately lost in the stony ground."; ]; ! ----------------- [ Initialise oldplayer; oldplayer = player; location = MeadowEdge; move newplay to MeadowEdge; ChangePlayer(newplay); remove oldplayer; #IFDEF ZDEBUG; move wand to player; #ENDIF; inventory_style = FULLINV_BIT + ENGLISH_BIT + RECURSE_BIT; SetPhase(phAfternoon); StartDaemon(sky); StartDaemon(blanket); indirect(fox.InitObject); give thedark indoors; ! so that in-shed weather messages look right. thedark.description = #r$DarkDescription; #ifdef NO_BOGLE; style bold; print "^^^Waiting on the shore; sand yields beneath my feet^\ The water shouts and roars and rushes^\ And breaks on the rocks, and^\ Never comes near to where I wait.^"; style roman; print "^^^^"; #ifnot; style bold; print "^^^Like a river my life hurries by^\ If I jump in perhaps I might drown^\ But if I don't then my spirit could die^\ Before that change in the weather comes 'round^"; style roman; print "^ -- Eric Bogle^^^^"; #endif; DrawStatusTitle(); PauseClear(); print "^^The picnic is going full blast, which is exactly why you've \ wandered away from it. It's not that you don't like your new companions; \ it's just that after weeks of spending each day around them, \ a noisy weekend cook-out \ isn't the way to relax. Some exploration -- on your own -- is an appealing \ thought.^^\ None of them noticed you drifting away, anyhow.^^^"; ! style underline; print "In Development -- Full of Bugs^^"; style roman; ! ### #IFDEF ZDEBUG; style bold; print "Debugging Commands On!^^"; style roman; #ENDIF; ]; ! Why do I always dream of home when rain comes tumbling down? ! Maybe 'cause the rain on the roof makes a lonely sound. ! Why do I always feel this way every time it rains? ! Like I'm just marking time and waiting for the weather to change. ! And why do I always feel the call of the far side of the hill? ! I never stayed in one place too long; I guess I never will. ! And why do I always turn away from the offer of a loving heart? ! Maybe loving's too painful to stop and too easy to start. [ PauseClear dummy; print "[Hit any key.] "; new_line; ! new_line; @read_char 1 dummy; @erase_window $ffff; ]; [ DrawStatusLine; @split_window 1; @set_window 1; @set_cursor 1 1; style reverse; spaces (0->33)-1; if (deadflag == 0) { @set_cursor 1 2; PrintShortName(location); if (location ~= thedark) { @set_cursor 1 55; print_paddr phasename; } } @set_cursor 1 1; style roman; @set_window 0; ]; ! This could be the game title, but I prefer just a blank bar. [ DrawStatusTitle ; @split_window 1; @set_window 1; @set_cursor 1 1; style reverse; spaces (0->33)-1; ! ix = (((0->33) - 23) / 2); ! @set_cursor 1 ix; ! print_paddr #Story; @set_cursor 1 1; style roman; @set_window 0; ]; [ ScoreSub; if (deadflag == 0) "That's not how life works."; ! otherwise, the game is over; no score. if (deadflag==2 && phase == phDawn) { #ifdef NO_BOGLE; style bold; print "This one night will not end, not under this sky^\ Of stars and embers and hot tea and song^\ And stories remembered not a moment too long^\ And laughter, darkness, fire, the circle, and I.^"; style roman; #ifnot; style bold; ! print "And you to whom adversity has deal the final blow,^\ ! With smiling bastards lying to you everywhere you go,^\ ! Turn to, and put out all your strength, of arm and heart and brain,^\ ! And like the Mary Ellen Carter, rise again!^^"; print "I know you would have loved it, Kate, beneath these Southern stars;^\ As the night was filled with music, sweet sounds, and soft guitars.^\ And faces in the firelight of those we dearly love,^\ With the Dreamtime land beneath my feet, and infinity above.^"; style roman; print " -- Eric Bogle^"; #endif; rtrue; } rtrue; ]; [ AboutSub; print_paddr #Story; #ifdef NO_BOGLE; print " is copyright 1995-6 by Andrew Plotkin. It may be copied, distributed, \ and played freely.^^"; print "The original version of this game contained brief quotations from the songs \ of Eric Bogle, given with credit but without permission. A small sin, perhaps, but one \ I have decided to repair. This version contains nothing that is \ not my own. However, if you wish to enhance the mood, find Eric \ Bogle's album entitled "; style underline; print "Something Of Value"; style roman; print " (Rounder Records, Philo C-PH-1125). \ Listen to ~A Change in the Weather~ as you begin \ playing the game, and ~Katie and the Dreamtime Land~ when you finish.^^"; #ifnot; print " is copyright 1995-6 by Andrew Plotkin. It may be copied, distributed, \ and played freely. Brief excerpts from the songs of Eric Bogle are used; \ they are copyrighted by him, and I use them without \ permission, under what I hope is fair use. \ Buy his albums. The excerpts are from "; style underline; print "Something Of Value,"; style roman; print " Rounder Records, Philo C-PH-1125.^^"; #endif; print_paddr #Story; print " is a "; style underline; print "cruel"; style roman; print " game, by the Zarfian Interactive Fiction Rating System. \ Any choice you make may be a wrong choice, and you may not discover \ it was wrong until later; and not choosing is always a choice. Timing \ may be critical. \ Save often and keep your old saved games."; print "^^"; print "This game was created using the Inform adventure development system, \ which was created by Graham Nelson. You can get Inform, as well as other text \ adventures, from the Interactive Fiction archive:^"; font off; print " ftp://ftp.gmd.de/if-archive/"; font on; print "^^"; print "Beta-testing and other helpful comments: Chad Anderson, \ Richard Barnett, Laurel Halbany, Galen Hazelwood, Walker Andrew John, \ Michael Kinyon, Gareth Rees, Markku Yli-Pentila.^"; rtrue; ]; [ WhistleSub; foxsummon = 1; print "You let out a long whistle.^"; if (fox in location) { print "^The fox's ears poke up, and then it cocks its head reproachfully.^"; }; ]; [ ThrowDirSub; if (second <= 1) { print "You throw "; DefArt(noun); " at nothingness. It hits, tearing open the space-time continuum. \ Hideous elder things look out, scowl at you, and zip the hole shut \ again. [BUG]"; } if (second notin compass) { print "I only understood you as far as wanting to throw "; DefArt(noun); "."; } if ((location == SteepFace && second == s_obj) || (location == Bluff && second == n_obj)) { <>; } ! "Throwing things in that direction is unlikely to help."; ! verb_word = 'throw'; <>; ]; [ ThrowOverSub; if (second>1) { action=##ThrownOver; if (RunRoutines(second,before)~=0) { action=##ThrowOver; rtrue; } action=##ThrowOver; } print "Throwing things over "; DefArt(second); " is unlikely to help."; ]; [ MoveWithSub; CDefArt(second); " won't help you do that."; ]; [ DigSub; if (second == 0) "You won't get far without something to dig with."; "You can't dig in that."; ]; [ DeathMessage; if (deadflag == 3) { print "Things could have turned out better."; return; } if (deadflag == 4) { print "You have a good time after all."; deadflag = 2; ! so that the end-game options look like you won return; } print "You have become God. [BUG] -- pity, though."; return; ]; [ FullScoreSub; <>; ]; [ PourOnSub; if (noun ~= water) { "That isn't pourable."; } <>; ]; [ GoUnderSub; "There's hardly room."; ]; [ ChooseObjects obj code; ! see changes doc #57 if (code < 2) { if (obj has scenery) return 2; rfalse; } rfalse; ]; [ ancestor obj; while (parent(obj) ~= nothing) { obj = parent(obj); }; return obj; ]; ! Find the object you're holding which has heavy, and return it. ! If none, return 0; ! If more than 1, return 1. [ FindBurden ix burden; burden = 0; objectloop (ix in player) { if (ix has heavy) { if (burden == 0) { burden = ix; } else { return 1; } } } return burden; ]; [ BadDream; style underline; print "Stone hangs around you, unyielding grey veils in a dim grey light. \ The light comes from far away: "; if (boulder in Hilltop) { if (boulder hasnt general) print "a knife-thin crack, "; else print "a crescent gap, "; } else print "a wide opening, "; print "a cold breath, and something roaring its anger beyond. "; if (location == Cave) { ! must not have blanket. print "The noise runs up your bones and through your blood, chilling, \ sinking and sinking into a rumble that is never quite gone, until \ there is nothing left of you but a thread --^"; } else { print "The noise stretches and stretches, leaving you gasping for air, \ and then an eye opens into the heart of soundless fury --^"; } style roman; new_line; new_line; ]; [ GoodDream; style underline; print "Stone dissolves around you as move up and forwards, into a grainy \ grey light. A mindless roar stretches in all directions; but it is troubled \ by a distant murmur. The new sound swells, whispering, pounding, then shouting \ at you, and you cannot make it out and you cannot make it go --^"; style roman; new_line; new_line; ]; [ PauseBridgeDown; print "^^^"; PauseClear(); print "^You awaken in the cave, \ sore and cold, bathed in the listless light \ of an overcast dawn. \ By the time you wade across the swollen stream, you're as soaked and \ miserable as if you'd slept out in the rain after all. You reach \ civilization exhausted and with what promises to be a lovely cough."; deadflag = 3; ]; #IFDEF NOTDEF; [ WaitSub sofar; meta = 1; ! so that we don't get an extra Time() call interrupt = 0; sofar = 10; ! how many turns to wait while (sofar > 0 && interrupt == 0) { sofar--; Time(); if (deadflag ~= 0) interrupt = 2; if (interrupt == 1 && sofar > 0) { ! notice that we don't bother if this is the last turn print "^Do you wish to continue waiting? "; interrupt = YesOrNo(); if (interrupt == 0) interrupt = 2; else interrupt = 0; } } ]; #ENDIF; Include "Grammar"; Verb meta "help" "hint" * -> Score; Verb meta "about" "rating" "info" * -> About; Verb "inhale" "breathe" * -> Smell * noun -> Smell; Verb "pour" * multiexcept "on" noun -> PourOn * multiexcept "in" noun -> PourOn * multiexcept "onto" noun -> PourOn * multiexcept "into" noun -> PourOn; Verb "whistle" * -> Whistle; Verb "tear" * noun -> Attack; Extend "swing" replace * held -> Swing; Extend "blow" replace * "on" noun -> Blow; Extend "wave" replace * -> WaveHands * held -> Wave; Extend "dig" first * "in" noun -> Dig * "in" noun "with" held -> Dig * "under" noun -> Dig * "under" noun "with" held -> Dig; Extend "throw" * held "over" noun -> ThrowOver * held "beyond" noun -> ThrowOver * held "across" noun -> ThrowOver * held "past" noun -> ThrowOver * held "to" noun -> ThrowDir * held noun -> ThrowDir; Extend "tie" * noun "with" noun -> Tie; Extend "put" * multiexcept "under" noun -> Insert * held "over" noun -> ThrowOver * held "beyond" noun -> ThrowOver * held "across" noun -> ThrowOver * held "past" noun -> ThrowOver; Extend "climb" * "under" noun -> GoUnder; Extend "take" * "under" noun -> GoUnder; Extend "go" * "under" noun -> GoUnder; Extend "stand" * "under" noun -> GoUnder; Extend "move" * noun "with" held -> MoveWith; Verb "pry" "lever" * noun -> Push * noun noun -> PushDir * noun "to" noun -> Transfer * noun "with" held -> MoveWith; Verb "wedge" "jam" * multiexcept "in" noun -> Insert * multiexcept "under" noun -> Insert * multiexcept "into" noun -> Insert; Verb "pat" "pet" "stroke" * creature -> Kiss; #IFDEF ZDEBUG; [ ZapSub; if (noun==mud) { give mud general; "The mud is soggified."; } if (noun==boulder) { give boulder general; move cavemouth to Hilltop; "The boulder is shifted."; } if (noun==player) { SetPhase(phDawn); "^Then the sun comes up."; } if (noun==sheddoor) { give sheddoor open; give sheddoor ~locked; "The shed door pops open."; } if (noun==wand) { if (wand has light) { give wand ~light; "The wand stops glowing."; } else { give wand light; "The wand starts glowing."; } } if (noun==bush) { remove bush; "The bush explodes."; } if (noun==sky) { WhackTree(); new_line; rtrue; } if (noun==bridge) { bridge.number = bdamPropped; "Hypothetically, you put the branch under the bridge."; } "You can't zap that."; ]; [ SuperWaitSub; clock = 99; ]; [ PurloinSub; move noun to player; print "You now have "; DefArt(noun); "."; ]; [ Anything i; if (scope_stage==1) rfalse; if (scope_stage==2) { for ( i=1: i <= top_object: i++) PlaceInScope(i); rtrue; } "That isn't a game object."; ]; Verb "zz" * -> SuperWait; Verb "zap" * noun -> Zap; Verb "snarf" * scope=Anything -> Purloin; #ENDIF; end;