! ------ Dry world #ifndef SKIP_DRY; Global dryposx; Global dryposy; Global DryHiding; ! drycamp.number: 0: dance is occurring. 1: after dance, quiet. 2: chasing you. 3: gone [ DryEnter; DryHiding = 0; dryposx = 0; dryposy = 0; give drygrass ~absent; give drytreefar ~absent; if (drycamp.number == 0) { StartDaemon(thedance); give thedance ~absent; give thedancesound ~absent; } if (drycamp.number < 3) { give drycamp ~absent; } else { remove dryguard; remove dryguardpocket; } ]; [ DryExit; give drygrass absent; remove drygrass; give drytreefar absent; remove drytreefar; remove drytreeshadowfar; give drycamp absent; remove drycamp; if (drycamp.number == 0) { StopDaemon(thedance); give thedance absent; give thedancesound absent; remove thedance; remove thedancesound; } if (drycamp.number == 2) { StopDaemon(drymob); give drymob absent; remove drymob; } if (thedance hasnt absent) { print "^The dancers form a conga line behind you. [BUG]^"; } if (thedancesound hasnt absent) { print "^The dancers are singing drinking songs. [BUG]^"; } if (drymob hasnt absent) { print "^The spearmen form a tango line behind you. [BUG]^"; } ! if they chase you out, they then vanish. if (drycamp.number == 2) { drycamp.number = 3; } ]; [ DryArouseCamp; if (drycamp.number == 3) { "The tribe leaps out at you, realizes it doesn't exist, and leaves. [BUG]"; } if (drycamp.number == 2) { "The tribe gets even more pissed off! [BUG]"; } if (drycamp.number == 0) { print "^The music cuts off instantly.^"; StopDaemon(thedance); give thedance absent; give thedancesound absent; remove thedance; remove thedancesound; } if (dryguard in DryGuardPost) { remove dryguard; if (location == DryGuardPost) print "^The sleeping man rolls to his feet, instantly alert. He \ stares blankly at you for a moment, and then dashes away to the \ southwest.^"; } if (dryguardpocket in DryGuardPost) { give dryguardpocket general; } drycamp.number = 2; give drymob ~absent; move drymob to location; StartDaemon(drymob); ]; Class grassplace with n_to [; return MoveInGrass(0, -1); ], ne_to [; return MoveInGrass(1, -1); ], e_to [; return MoveInGrass(1, 0); ], se_to [; return MoveInGrass(1, 1); ], s_to [; return MoveInGrass(0, 1); ], sw_to [; return MoveInGrass(-1, 1); ], w_to [; return MoveInGrass(-1, 0); ], nw_to [; return MoveInGrass(-1, -1); ], out_to [; if (DryHiding ~= 0) { DryHiding = 0; "You stand up again."; } "But you aren't in anything at the moment."; ], u_to [; if (DryHiding ~= 0) { DryHiding = 0; "You stand up again."; } ], before [; Look: if (DryHiding ~= 0) print "You raise your head carefully, peering over the grass that hides you.^"; ], has light outdoors; Object DryEntry "Grassy Hilltop" class grassplace, with name "path" "hill" "leaf" "leaves" "foliage", description "Not a flat tame greensward, mind you; you are surrounded by wild, \ waist-high, reed-yellow growth that hisses and rattles in the dry breeze. \ The grasses roll to every cloudless horizon. Above you towers an immense \ tree -- the only one visible anywhere in this prairie world -- and its shadow \ slices blackness past your feet. A path of flat, trampled grass cuts south \ down the hill.", u_to [; print "You stand on the roots, grasp at a convenient burl, and drag yourself \ up onto the lowest limb.^"; return DryTreeTop; ], d_to "From the top of the hill, everywhere is down.", s_to [; return MoveOnPath(0, 1); ]; Nearby drytree "tree" with name "immense" "limb" "limbs" "branch" "branches" "tree" "trunk", description "It must be visible for miles. The burly trunk is broader than your shoulders; \ limbs splay out over most of the hilltop. Dense foliage shrouds its branches. \ The tree's shadow is a line of utter black, thrown far across the grass \ by the setting sun.", before [; Climb: <>; Touch: "The bark is warm."; LookUnder: "The path of trampled grass leads up to the tree, widening to a circle \ around its trunk. Strange -- you see no fallen leaves, not even decayed \ fragments."; LookBehind: <>; ReceiveBehind: <>; ], has scenery; Nearby drytreeshadow "shadow behind the tree" class shadowclass, with description [; "The shadow is familiarly black. It stretches east into the distance, so \ tall is the tree."; ], door_to SilAlley, door_world world_Silent, before [; Smell: "You smell a hint of sweat, food, dung, hay. City-smell."; Receive: print (The) noun, " slides into blackness and is gone.^"; rfalse; Enter: print "The shadow ", (emphstring) "flares", " with a claustrophobic \ sensation, as if the tree is falling towards you, or on you, while \ the ground falls up and the black sky falls down --^^"; PauseClear(); print "-- You slump against cool brick.^^"; rfalse; ]; Object drytreeshadowfar "shadow of the tree" class shadowclass, with name "bar", describe [; "^A bar of blackness falls across the grass, lying east-west."; ], description [; "The shadow is familiarly black. It stretches from where the tree stands in \ the west, past you, and east into the distance."; ], door_to SilAlley, door_world world_Silent, before [; Smell: <>; Receive: print (The) noun, " slides into blackness and is gone.^"; rfalse; Enter: print "The shadow ", (emphstring) "flares", " with a claustrophobic \ sensation, as if the tree is falling towards you, or on you, while \ the ground falls up and the black sky falls down --^^"; PauseClear(); print "-- You slump against cool brick.^^"; rfalse; ], has static ~scenery; Object DryTreeTop "Up the Tree" with name "hill" "grass" "grassland" "leaf" "leaves" "crown" "foliage", description "You are sitting on a thick branch under the tree's dense green crown. \ The hill and grasslands spread below you and off into the distance, for there \ are no other branches nearby to block your view.", out_to [; <>; ], d_to [; print "You swing down.^"; return DryEntry; ], u_to "There isn't another limb within reach.", cant_go "You're not agile enough to go clambering out on limbs.", before [; Jump: "You're a little too high to jump safely."; ], after [; Drop: print "You balance ", (the) noun, " on the limb.^"; rtrue; ], has light outdoors; Nearby drytreetophalf "tree" with name "immense" "limb" "limbs" "branch" "branches" "tree" "trunk", description "The tree is just as large when you're perched on it as it was \ from below. Unfortunately, there are no higher limbs within reach.", before [; Climb: <>; Touch: "The bark is warm."; LookUnder: "The path of trampled grass leads up to the tree, widening to a circle \ around its trunk."; ], has scenery; Nearby drytreeshadowtop "shadow" with name "dark" "darkness" "black" "blackness" "shadow" "shade", description "The shadow runs from the tree's roots, far into the east.", before [; Examine: rfalse; Receive: print "You hold ", (the) noun, " in the tree's shadow; but nothing happens. \ The shadow isn't abnormally dark up here -- only on the ground. (No, \ that doesn't make any sense.)^"; rtrue; Touch, Enter: print "You hold your hand in the tree's shadow; but nothing happens. \ The shadow isn't abnormally dark up here -- only on the ground. (No, \ that doesn't make any sense.)^"; rtrue; default: "The shadow is on the ground, down below."; ], has scenery container; Object DryHillS "Hill, South Side" class grassplace, with description "You are on the south flank of the grassy hill. The flattened path \ runs up the hill to the north, towards the towering tree, and also leads west. The \ unconstrained grass spreads everywhere else.", n_to [; return MoveOnPath(0, -1); ], w_to [; return MoveOnPath(-1, 0); ]; Object DryHillSW "Hill, Southwest Side" class grassplace, with description "You are on the southwest edge of the grassy hill. The path \ hugs the base of the hill, running east and north from here. A tiny clear \ rivulet burbles from a crack in the earth, just off the path; it trickles \ away through the grass to the west.", e_to [; return MoveOnPath(1, 0); ], n_to [; return MoveOnPath(0, -1); ]; Nearby dryspring "tiny spring" with name "tiny" "rivulet" "water" "clear" "crack" "spring" "stream", description "The spring is barely a handspan wide, just a thread of water \ which flows across the dry earth and is lost in the grass. \ The crack it comes from is narrower than your finger.", before [; Take: if (jar in player) { <>; } "You have nothing in which to carry water."; Drink, Taste: "The water is searingly cold in your hands. It tastes of hidden stone."; Touch: "The water is searingly cold."; Search: "There is nothing in the water. You cannot see into the crack."; Empty, EmptyT: "The spring has probably been flowing for centuries. You won't empty it."; Listen: "The spring is nearly silent."; Insert: <>; Receive: if (IsOilPod(noun) ~= 0) { remove noun; "You crush the pod. Oil splashes into the water, and spreads into bright \ queasy rainbows. It's rather more disturbing than pretty, but \ the swirling film of color is rapidly carried away."; } switch (noun) { jar: <>; jarwater: remove noun; "You empty the jar into the rivulet."; jaroil: remove noun; "You empty the jar. Oil splashes into the water, and spreads into bright \ queasy rainbows. It's rather more disturbing than pretty, but \ the swirling film of color is rapidly carried away."; default: print "Water eddies around ", (the) noun, ", but nothing else \ happens, so you retrieve it.^"; rtrue; } ], has scenery container open; Object DryHillW "Hill, West Side" class grassplace, with description "You are on the western face of the hill. It leans serenely above you, \ with the sunlit tree alert at its crest. The flattened path runs \ north and south.", n_to [; return MoveOnPath(0, -1); ], s_to [; return MoveOnPath(0, 1); ]; Object DryHillNW "Hill, Northwest Side" class grassplace, with description "You are on the northwest side of the hill. The path runs south along \ the hillside, but continues north into the open grassland.", n_to [; return MoveOnPath(0, -1); ], s_to [; return MoveOnPath(0, 1); ]; Object DryHillN "Hill, North Side" class grassplace with description [; print "You are on the slope of the hill. "; ; rtrue; ]; Object DryHillNE "Hill, Northeast Side" class grassplace with description [; print "You are on the side of the hill. "; ; rtrue; ]; Object DryHillE "Hill, East Side" class grassplace with description [; print "You are on the slope of the hill. "; ; rtrue; ]; Object DryHillSE "Hill, Southeast Side" class grassplace with description [; print "You are on the slope of the hill. "; ; rtrue; ]; Object DryCampgroundN "Flattened Area, North End" class grassplace with description [; print "This is the north end of the flattened strip. "; ; rtrue; ], s_to [; return MoveOnPath(0, 1); ]; Object DryCampgroundNC "Flattened Area, Northish" class grassplace with description [; print "You are in a wide area of trampled-flat grass. The strip extends north, \ and a circle of bare dirt lies south; a smaller path runs northeast. "; ; rtrue; ], n_to [; return MoveOnPath(0, -1); ], ne_to [; return MoveOnPath(1, -1); ], s_to [; return MoveOnPath(0, 1); ]; Object DryCampgroundSC "Bare Circle" class grassplace with name "circle" "bare" "dirt" "earth", description [; print "This is a wide circle of dry earth, carefully cleared and packed. The \ tall grass stands on either side, but to the north and south, the grass is \ crushed down to the soft texture of the paths. "; ; rtrue; ], n_to [; return MoveOnPath(0, -1); ], s_to [; return MoveOnPath(0, 1); ]; Object DryCampgroundS "Flattened Area, South End" class grassplace with description [; print "You are at the south end of a wide area of trampled-flat grass. \ A circle of bare dirt lies north. "; ; rtrue; ], n_to [; return MoveOnPath(0, -1); ]; Object DryInTheGrass "In the Grass" class grassplace, with description [; print "You are waist-deep in the thick yellow grass, an unremarkable spot. "; ; rtrue; ], before [; Drop: "Best not. You'd never find it again in this unmarked, dry ocean."; ]; Object DryGuardPost "Small Clearing" class grassplace, with description [; print "The grass is trampled down in a circle here, a few yards wide. A flattened \ path runs towards the hillside to the south, and another leads southwest"; if (drycamp.number < 3) print " to the encampment"; else print " to a large flattened area"; "."; ], sw_to [; if (dryguard in self) { print "You begin to circle around the sleeping man. He shifts as you take \ another step... and another... and he is on his feet, seemingly without \ transition. A blow with the haft of his spear leaves you gasping, and \ he disappears to the southwest.^"; remove dryguard; DryArouseCamp(); rtrue; } return MoveOnPath(-1, 1); ], s_to [; return MoveOnPath(0, 1); ]; Nearby dryguard "sleeping man" with name "young" "youngish" "man", describe [; "^A youngish man is sitting in the circle's center, slumped sideways, clearly \ asleep. A spear rests laxly in his hand."; ], description "The man has pale hair, nearly white, and red lines are painted across \ the corners of his eyes. \ He sits knee-bent; he'd be facing south, watching the path, if he wasn't \ leaning blissfully sideways with his head propped on his forearm. His other hand \ rests open on the ground, with the spear lying across it.", life [; Attack, ThrowAt: deadflag = 1; "The man comes awake like a cat, instantly alert. Unlike a cat, he \ doesn't give you a chance to run away before he kills you."; Show: "The man doesn't react, probably because his eyes are closed."; Give: "The man appears quite content with his situation as it is."; default: print "The man rolls to his feet, instantly alert, steadying his spear. He \ gives a great shout and dashes off to the southwest.^"; remove self; DryArouseCamp(); rtrue; ], before [; Listen: "You hear quiet breathing."; ], has static animate transparent; Nearby dryguardpocket "ground" with short_name [; if (self hasnt general) print "ground by the man"; else print "ground in the circle"; rtrue; ], describe [; if (children(self) == 0) rtrue; if (self hasnt general) print "^Lying very near the man"; else print "^Lying in the center of the circle"; WriteListFrom(child(self), TERSE_BIT | ENGLISH_BIT | RECURSE_BIT | ISARE_BIT); "."; ], number 0, before [; Receive: "You can't put anything there. In fact, I'm really \ impressed that you got this message. Consider yourself rewarded.^^\ [Your score has just gone up by one point.]^"; LetGo: if (self has general) rfalse; if (dryguard notin DryGuardPost) "You can't take something from him when he's not here! [BUG]"; rfalse; ], after [; LetGo: if (self has general) rfalse; self.number = self.number + 1; multi_interrupt = "^Startled, you stop what you were doing."; print "You gently lift ", (the) noun, " from the ground. The man snorfles \ slightly"; if (self.number < 2) { print ", but does not stir.^"; } else { print ", blinks sleepily at you... and then snatches at his spear and dashes \ off to the southwest.^"; remove dryguard; DryArouseCamp(); } rtrue; ], has static supporter; ! general means that the guard is gone Object dryguardspear "spear" dryguard with name "spear" "weapon" "glass" "wood" "point" "leaf", description "It's a handsome weapon, a four-foot length of some polished \ red wood. The point is a fluted leaf of black glass -- a smooth shape, \ not chipped into shape. The spear is lying loosely in the man's hand.", before [; Take, Push, Pull, Turn, Touch: deadflag = 1; "The hand snaps shut on the spear, possibly an instant before you touch \ it. The man jerks the spear furiously away from you, \ rolls to his feet, and skewers you without hesitation."; ], has scenery; Object knife "steel knife" dryguardpocket with name "steel" "knife" "blade", description "The knife is a simple slim blade in a handle of reddish wood. The \ blade is the length of your hand.", before [; Touch: "Very sharp."; Aim: if (second == player) "Oh, don't."; if (second ~= nothing && second has animate) { "Such a gesture might be taken badly."; } ]; Constant DryOozingRightThrough "The jar isn't tilted, or cracked; the trickle seems to be \ oozing straight from the clay, just above the smudge."; ! This contains one object at most, unless it's jarwater or jaroil, in which case ! there will be a trickle too. Object jar "clay jar" dryguardpocket with name "pale" "ceramic" "smudge" "lip" "clay" "jar" "bottle" "jug" "vase" "pot", describe [; if (child(self) == 0) print_ret "^A ", (name) self, " sits nearby."; if (jarwater in self) { if (jarwater.number >= 6) print "^A ", (name) self, " full of freezing water sits nearby."; else print "^A ", (name) self, " full of water sits nearby."; if (tricklewater in self) { print " A small trickle of water drips down its side to"; if (world == world_Frozen) print " freeze on the ground beneath."; else print " dampen the ground beneath."; } new_line; rtrue; } if (jaroil in self) { print "^A ", (name) self, " full of oil sits nearby."; if (trickleoil in self) { if (trickleoil has light) print " A tiny trickle of oil burns steadily on the side of the \ jar, not quite reaching the ground."; else print " A small trickle of oil drips down its side to smear the \ ground beneath."; } new_line; rtrue; } print_ret "^A ", (name) self, " sits nearby; inside it is ", (a) child(self), "."; ], invent [; if (inventory_stage == 1) { rfalse; } else { if (child(self) == 0) rtrue; if (jarwater in self) { if (jarwater.number >= 6) print " full of freezing water"; else print " full of water"; rtrue; } if (jaroil in self) { print " full of oil"; if (trickleoil in self && trickleoil has light) print " (and alight)"; rtrue; } print " (containing ", (a) child(self), ")"; rtrue; } ], description [; print "The jar is small -- it"; if (self in player) print " balances"; else print " would balance"; print " neatly on your palm. \ The sides are straight; the lip is only slightly tapered. \ The jar is made of pale, unornamented ceramic, marked only by a \ dark smudge a bit below the lip."; if (jarwater in self || jaroil in self) { if (jarwater in self) { if (jarwater.number >= 6) print " The jar is full of water and ice."; else print " The jar is full of water."; if (tricklewater in self) print " A steady trickle of water drips down its side, below \ the smudge."; } else { print " The jar is full of oil."; if (trickleoil in self) { if (trickleoil has light) print " A small steady trickle of oil burns on the outside \ of the jar."; else print " A steady trickle of oil drips down its side, below \ the smudge."; } } } else { if (child(self) ~= 0) { print " The jar contains ", (a) child(self), "."; } } new_line; rtrue; ], number 0, ! countdown for trickle starting. Always 0 unless there's a fluid ! counting down to trickledom. daemon [; if (jarwater in self) { if (tricklewater notin self) { self.number = self.number + 1; if (self.number == 3) { if (jar in player) print "^A drop of water falls on your leg.^"; else { if (TestScope(self)~=0) { print "^A drop of water rolls down the side of the jar.^"; } } } if (self.number >= 5) { self.number = 0; move tricklewater to self; if (jar in player) print "^Water is trickling across your fingers. You glance down. ", (string) DryOozingRightThrough, "^"; else { if (TestScope(self)~=0) { print "^Water is trickling down the side of the jar. \ You bend closer. ", (string) DryOozingRightThrough, "^"; } } } } } else { if (jaroil in self) { if (trickleoil notin self) { self.number = self.number + 1; if (self.number == 3) { if (jar in player) print "^A drop of oil falls on your leg.^"; else { if (TestScope(self)~=0) { print "^A drop of oil rolls down the side of the jar.^"; } } } if (self.number >= 5) { self.number = 0; move trickleoil to self; give trickleoil ~light; if (jar in player) print "^Oil is trickling across your fingers. You glance down. ", (string) DryOozingRightThrough, "^"; else { if (TestScope(self)~=0) { print "^Oil is trickling down the side of the jar. \ You bend closer. ", (string) DryOozingRightThrough, "^"; } } } } } else { ! no fluid in jar self.number = 0; if (tricklewater in self) { remove tricklewater; !print "^The jar no longer drips water.^"; } if (trickleoil in self) { remove trickleoil; if (trickleoil has light) { give trickleoil ~light; print "^The tiny flame on the jar gutters out.^"; } else { !print "^The jar no longer drips water.^"; } } } } ], before [; AddFluid: ! second is 1 for water (from source), or the number of an oil-pod. if (child(self) ~= 0) { if (jarwater in jar) "The jar is already full of water."; if (jaroil in jar) "The jar is already full of oil."; print_ret "You'd just soak ", (the) child(self), "."; } if (second == 1) { move jarwater to jar; jarwater.number = 0; if (world == world_Silent) give jarwater general; else give jarwater ~general; "You dunk the jar and let water bubble in."; } else { remove second; move jaroil to jar; "The pod ruptures easily, and an acrid oil splashes into the jar."; } Receive: if (IsOilPod(noun) ~= 0) { <>; } if (noun == blanket || noun == voicebox || noun == lump) { ! ### others too big too? print_ret (The) noun, " won't fit in the clay jar."; } if (child(self) ~= 0) { if (jarwater in jar) print_ret "The jar is full of water; you'd just soak ", (the) noun, "."; if (jaroil in jar) print_ret "The jar is full of oil; you'd just soak ", (the) noun, "."; print_ret "You can't; the jar already contains ", (a) child(self), "."; } rfalse; Empty: if (jarwater in self) { <>; } if (jaroil in self) { <>; } rfalse; EmptyT: if (jarwater in self) { <>; } if (jaroil in self) { <>; } rfalse; Rub, Touch: "The smudge on the jar smears, a bit, leaving your fingertip black."; ], has container open; Object brokenjar "heap of clay shards" with name "pale" "heap" "clay" "shard" "shards" "potsherds", description "All that's left of the jar is this scattering of pale potsherds.", before [; Tie: ! really fix "You have no way to attach the shards together. Even if you did, \ much as you love jigsaws, it would take hours to sort them all out."; ]; Global candysize = 7; ! licks to get to the center of a spicy pop Object candy "green crystal rod" dryguardpocket with name "cloudy" "green" "crystal" "glass" "rod", description [; print "It's a small rod of cloudy greenish glass, or perhaps crystal. "; switch (candysize) { 7, 6: "One end is cut cleanly, but the other is slightly worn and rounded."; 5: "One end is cut cleanly, but the other is worn and rounded."; 4: "One end is cut cleanly, but the other is worn and rounded. The rod \ seems shorter than when you found it."; 3: "One end is cut cleanly, but much of the other end is eroded away."; 2: "One end is cut cleanly, and there's not much left beyond that."; 1: "The rod is just a worn stub."; default: "A Golden Ticket protrudes from the rod. [BUG]"; } ], number 0, ! used by taste daemon. before [; Touch: "Most of the surface is polished, but the worn end is slightly rough, \ almost sticky."; Smell: if (self hasnt general) { give self general; "The rod has a powerful odor, somewhere between spicy and cool. And, mmm, \ fruity? And... blue?"; } "You take another sniff. It definitely smells cool, and fruity, and blue. \ And spicy. Whatever spicy blue smells like, this is it. Your sinuses \ buzz faintly."; Taste: <>; Eat: if (self notin player) "You're not holding the green crystal rod."; if (candysize == 7) print "You take a tentative lick"; else { if (candysize == 1) { remove self; print "The last bit of the rod dissolves on your tongue"; } else print "You lick again"; } candysize--; print ", and a strong fruity flavor fills your mouth.^"; self.number = 0; StartDaemon(self); rtrue; ], daemon [; self.number = self.number+1; switch (self.number) { 1: rtrue; 2: "^The taste in your mouth becomes cool and vaguely metallic."; 3: "^Your tongue begins to burn with a sweetish, spicy aftertaste."; 4: StopDaemon(self); "^Your sinuses burn as the spicy flavor fades."; } ]; ! general means you've smelled it before Object jarwater "quantity of water", with name "quantity" "of" "water", short_name [; if (self.number >= 6) print "quantity of freezing water"; else print "quantity of water"; rtrue; ], parse_name [ num wd; num = 0; wd = NextWord(); while ((wd == 'quantity' or 'of' or 'water') || ((self.number >= 6) && (wd == 'freezing' or 'ice' or 'layer'))) { num++; wd = NextWord(); } return num; ], describe [; "^A cube of water is floating here. [BUG]"; ], description [; switch (self.number) { 0, 1, 2: if (self has general) print "It's water, slightly muddy and greenish."; else print "It's water, starlight-clear."; 3, 4, 5: print "It's water, with a few shards of ice floating in it."; 6, 7, 8: print "It's water, although a skin of ice covers it."; 9, 10, 11: print "The water is heavily crusted with ice."; 12: print "The water has a thick, cracked layer of ice."; default: print "It's yogurt. [BUG]"; } new_line; rtrue; ], number 0, ! how frozen is it? before [; Take: print_ret (The) self, " is already in the jar."; Drink: if (self.number >= 6) print "You crack away the layer of ice. "; remove self; if (self has general) "You empty the jar, wincing slightly at the stagnant aftertaste."; "You drain the jar. The water still has a distant mineral taste."; Taste: if (self has general) "It tastes stagnant."; "It tastes fresh."; Smell: if (self has general) "It smells stagnant."; Attack, Touch, Push: if (self.number >= 6) { self.number = self.number - 2; "You crack away some of the ice in the jar."; } Drop: <>; Empty: if (self.number >= 6) print "You crack away the layer of ice, and upend the jar. "; remove self; "The water splashes away."; EmptyT: <>; PutOn, Insert: if (second == 0) <>; receive_action=##PutOn; action=##Receive; if (RunRoutines(second,before)~=0) { action=##PutOn; rtrue; } action=##PutOn; if (second has animate) "That would probably be considered rude."; if (self.number >= 6) print "You crack away the layer of ice, and upend the jar. "; remove self; print_ret "The water splashes over ", (the) second, " and is gone."; ]; ! general means murky Object jaroil "quantity of oil", with name "quantity" "of" "oil", describe [; "^A cube of oil is floating here. [BUG]"; ], description "It's a clear liquid, just slightly thicker than water.", before [; Take: print_ret (The) self, " is already in the jar."; Smell: "The oil has a powerful, sweet-acrid odor; it stings your eyes."; Taste, Drink: "You gingerly touch your tongue to the oil -- and spit. \ It's awful; a bitter flavor that burns your tongue."; Touch: "A bit slippery."; Drop: <>; Empty: remove self; "The oil splashes out, and evaporates with unnatural speed."; EmptyT: <>; PutOn, Insert: if (second == 0) <>; receive_action=##PutOn; action=##Receive; if (RunRoutines(second,before)~=0) { action=##PutOn; rtrue; } action=##PutOn; if (second has animate) "That would probably be considered rude."; remove self; print_ret "The oil splashes over ", (the) second, ". It evaporates almost \ immediately, leaving no trace."; Ignite: if (second == trickleoil) { "The fiery trickle is outside the jar. The rest of the oil is inside the jar. \ You really can't get the one to the other."; } print "You angle the flame into the jar's mouth. Gingerly... Ah! \ A single white flare roars out of the jar, all the oil burning nearly \ at once. You squint \ away just as the jar bursts into hot shards"; if (jar in player) { print " in your hands."; } else { print "."; } move brokenjar to parent(jar); remove self; remove jar; new_line; rtrue; ]; Object tricklewater "trickle of water" with name "steady" "trickle" "of" "water", description "A trickle of water oozes from the jar, apparently straight from the clay, \ just below the lip. It drips down the side and falls steadily.", before [; Take: "I don't see how."; Taste, Drink: <>; Smell: <>; ]; Object trickleoil "trickle of oil" with name "steady" "trickle" "of" "oil", description [; print "A trickle of oil oozes from the jar, apparently straight from the clay, \ just below the lip."; if (self has light) " It feeds a tiny flame that burns on the side of the jar."; " It drips down the side and falls steadily."; ], before [; Take: "I don't see how."; Taste, Drink: if (self has light) "You have no desire to drink flaming oil."; <>; Smell: if (self has light) "The oil has a powerful, sweet-acrid odor. Its flame gives off no \ smoke."; <>; Touch: if (self has light) "You don't need experiment to tell what would happen if you put \ your finger in the fire."; <>; Ignite: if (self has light) "The trickle of oil is already burning."; give self light; "The trickle of oil flares, then settles to a tiny flame dancing just below \ the jar's lip. There is just enough oil flowing to burn, it seems, for \ nothing drips farther down the side."; ]; ! light means burning [ MaintainWaterPhase curnum; curnum = locationof(jarwater); if (curnum hasnt winter) { if (jarwater.number > 0) { jarwater.number = jarwater.number - 1; switch (jarwater.number) { 11: if (TestScope(jarwater)~=0) { print "^The layer of ice in the jar is beginning to melt.^"; } 8: if (TestScope(jarwater)~=0) { print "^The layer of ice in the jar is breaking up.^"; } 5: if (TestScope(jarwater)~=0) { print "^Only a few bits of ice are left floating in the jar.^"; } 2: if (TestScope(jarwater)~=0) { print "^The last of the ice in the jar is gone.^"; } } } } else { jarwater.number = jarwater.number + 1; switch (jarwater.number) { 3: if (TestScope(jarwater)~=0) { print "^Needles of ice are forming in the jar of water.^"; } 6: if (TestScope(jarwater)~=0) { print "^The water in the jar has a thin skin of ice on it.^"; } 9: if (TestScope(jarwater)~=0) { print "^The ice in the jar is thicker.^"; } 12: if (TestScope(jarwater)~=0) { print "^There is a faint pop from within the jar.^"; } 13: if (TestScope(jarwater)~=0) { print "^There is a loud pop from what was just the clay jar."; if (jar in player) { print " Ceramic shards spill to the ground, leaving a lump of \ ice in your hands.^"; } else { print " Ceramic shards spray across the ground, leaving a lump of \ ice.^"; } } move icelump to parent(jar); icelump.number = 0; move brokenjar to curnum; remove jarwater; remove jar; } } ]; Object icelump "lump of ice" with name "lump" "of" "ice", description [; switch (self.number) { 7, 6: "It's just a tiny lump of cloudy ice."; 5, 4: "It's a small lump of veined ice."; default: "It's a vaguely jar-shaped lump of veined, cracked ice."; } ], number 0, ! how melted? before [; Eat: remove self; "You crunch on the ice for a while, finally reducing it to a mouthful of \ splinters. Brrr."; Rub, Squeeze, Touch: print "The ice burns your fingers, but water drips from it."; self.number = self.number + 1; if (self.number == 8) { print " When you open your hand, there is nothing left."; remove self; } new_line; rtrue; ]; [ MaintainIcePhase curnum; curnum = locationof(icelump); if (curnum hasnt winter) { icelump.number = icelump.number + 1; switch (icelump.number) { 3: if (TestScope(icelump) ~= 0) { print "^The lump of ice is beginning to melt.^"; } 5, 7: if (TestScope(icelump) ~= 0) { print "^Water drips from the lump of ice.^"; } 8: if (TestScope(icelump) ~= 0) { print "^The last bit of ice melts away.^"; } remove icelump; } } ]; Object drygrass "grass" with name "grass" "grasses" "stalk" "stalks" "blades", found_in [; if (world ~= world_Dry) { print "The grass runs away and hides. [BUG]^"; rfalse; } if (location == DryTreeTop) rfalse; else rtrue; ], description "The grass is an unending reach of tall, broad blades. \ Each is creased lengthwise into a V. The stalks are \ dry and somewhat yellowed, and the wind changes them to infinite rippling waves, \ and a sound like a distant rainstorm.", before [; Ignite: deadflag = 1; print "You hold the flame to a stalk of grass, and it catches easily. So does \ another. And, and, oh, ", (emphstring) "sh--", "^"; rtrue; Take, Pull: "The grass is quite tough."; Touch: "The grass is saw-edged and rough. The blades rattle slightly as you touch them."; Attack: "I think the grass has you outnumbered."; Smell: "The dry grass has no particular odor."; Listen: "The grasses rattle gently, with a sound like distant rain."; Search, LookUnder, LookBehind: "You part the stalks and peer at the roots. There's nothing there but arid \ earth. Of course, all Muo's diamonds and Awas's pearls could be scattered \ in the grass, and you'd never see one until you stepped on it."; Enter: if ((location == DryHillSE or DryHillE or DryHillNE) || (location == DryHillN or DryInTheGrass)) { if (DryHiding ~= 0) "You are already hunched down in the grass."; DryHiding = 1; "You crouch, ducking your head below the tops of the stalks."; } else { "Which way? The grass rises in almost every direction."; } ], has scenery absent; ! absent switched by MoveToWorld Object drytreefar "tree" with name "tree" "hill", found_in [; if (world ~= world_Dry) { print "The tree runs away and hides. [BUG]^"; rfalse; } if (location == DryTreeTop || location == DryEntry) rfalse; else rtrue; ], description [ dist; if (dryposx >= 0) dist = dryposx; else dist = -dryposx; if (dryposy >= 0) { if (dryposy > dist) dist = dryposy; } else { if (-dryposy > dist) dist = -dryposy; } !print "[DEBUG] tree is dist ", dist, " at offset (", -dryposx, ",", -dryposy, "). "; if (dist <= 1) print "The tree stands on the hilltop, immediately to the "; else { if (dist <= 2) print "The tree-crowned hill slopes up to the "; else { if (dist <= 4) print "The tree rises from the top of the hill, not far "; else { if (dist <= 6) print "You can make out the distant hill and its tree, far to the "; else { print "The tree is a splinter on the horizon, "; } } } } CoordToDir(-dryposx, -dryposy); if (dryposy == 0 && dryposx > 0) print "; the sun hovers low behind the branches and turns them to \ white fire"; "."; ], before [; Examine: rfalse; default: "You are too far away."; ], has scenery absent; ! absent switched by MoveToWorld Object drycamp "encampment" with name "camp" "encampment" "people" "figures" "tent" "tents" "muddle" "cleared" "area", found_in DryEntry DryTreeTop DryHillSW DryHillW DryHillNW DryGuardPost, describe [; if (location == DryEntry) { "^You can see a muddle of tents down at the base of the hill, \ spreading around most of the west side."; } print "^A disorderly cluster of tents runs along the west side of the hill. \ Twenty yards or so of tall grass separate the path from the encampment. \ There is a large cleared area among the tents,"; switch (location) { DryTreeTop: print " some way west"; DryHillSW: print " some way north"; DryHillW: print " directly across from you"; default: print " some way south"; } if (self.number == 0) { print "; it is surrounded by motionless figures."; indirect(thedance.description, 1); } else { print ".^"; } rtrue; ], description [; if (location == DryEntry) "The tents are mostly hidden by the curve of the hill. You haven't a good \ view."; print "The tents are low, slanting affairs, made from some sort of animal skin. You \ see palest grey, golds, browns, blacks, and several with wavery stripes. A few \ figures move from tent to tent; they are short, fair people, mostly in leather \ themselves, although with not a few scarves and ribbons in bright color.^"; if (self.number == 0) { new_line; ; } ], number 0, ! 0: dance is occurring. 1: after dance, quiet. 2: chasing you. 3: gone before [; Examine: rfalse; Enter: if (location == DryEntry || location == DryTreeTop) "The encampment is quite a distance away, to the west."; <>; default: if (location == DryEntry || location == DryTreeTop) "The encampment is quite a distance away."; "You're not in the encampment."; ], has static absent; ! absent switched by MoveToWorld Object thedance "performance" with name "play" "performance" "dance", found_in DryTreeTop DryHillSW DryHillW DryHillNW DryGuardPost, description [ flag; if (flag == 0) { print "The cleared area is surrounded by motionless figures. At one end, \ several people are carrying oddly-proportioned wooden boxes; they hold \ the boxes near their open mouths, eyes closed in concentration, fingers tapping, \ and it is from these that the music arises."; } switch (thedance.number) { 5, 6: print "^^A man and woman circle each other in an intense dance, \ in the cleared area to the west. His eyes are painted across a \ black stripe; hers with white.^"; 7, 8: print "^^A man and woman circle each other in an intense dance, \ in the cleared area to the west. His eyes are painted across a \ black stripe; hers with grey. The woman's shape is swollen in \ pregnancy.^"; 9: print "^^A man and woman circle each other in an intense dance, \ in the cleared area to the west. Her eyes are painted across a \ grey stripe; his face bears jagged violet and black lines. \ The woman's shape is swollen in pregnancy.^"; 10: print "^^A man circles in an intense dance, \ in the cleared area to the west. \ His face bears jagged violet and black lines.^"; 11: print "^^A man kneels in the cleared area to the west, \ face upturned. His face and hands are smeared with violet and \ black paint.^"; default: new_line; } rtrue; ], number 0, daemon [; self.number = self.number + 1; ! audio component -- can always hear. switch (self.number) { 1: print "^You hear the sound of dripping water, from somewhere to the west.^"; 2: print "^The sound continues, precise... you're not sure \ it's water now. The sound is too rich; it almost echoes.^"; 3: print "^A second tapping noise begins, off-stepped from the first, at \ an odd angle of harmony.^"; 4: print "^The rhythms speed, glancing up and down an unfamiliar chord. \ Under-steps and syncopations are creeping in.^"; 5: print "^A deep wail splits the wind; the harmonic rhythms fall into support. \ The wail is unearthly, a powerful resonance that nonetheless has the \ shape of a human voice.^"; ! dancers enter here 6: print "^More voices join, higher and lower, all with that shimmering strength. \ The beating rhythms surge.^"; 7: print "^The wailing harmonies rise and fall.^"; 8: print "^The rhythms catch and redouble.^"; 9: print "^The choir splits into an eerie progression of chords.^"; 10: print "^The rhythms and wailing notes flare, everywhere, in your mind.^"; 11: print "^The rhythmic beating ceases abruptly; the voices contract \ into a single rising note.^"; 12: print "^The voices rise to a shriek, and plummet into reverberating \ silence.^"; } ! component exchange -- always do. switch (self.number) { 5: move drydancerman1 to self; move drydancerwoman1 to self; 7: remove drydancerwoman1; move drydancerwoman2 to self; 9: remove drydancerman1; move drydancerman2 to self; 10: remove drydancerwoman2; 12: remove drydancerman2; } ! visible component if (self in location) { switch (self.number) { 5: print "^A man leaps into the cleared area, whirling in dance. \ His face is painted with a narrow black mask; and as \ he turns, a woman spins in, balancing his movements from \ behind white mask-paint.^"; 6: print "^The dancers leap into an intricate series of turns, \ forward and backward around each other's motion.^"; 7: print "^The man \ drops forward; the woman takes one final leap towards him, \ and is borne upwards, as he extends and launches her out of \ the circle entirely. But without a pause, another woman whirls \ into view. Her garb is identical to the first woman's; but her \ mask-paint is grey, and \ she is roundly pregnant (or so her costume's shape suggests).^"; 8: print "^The dance has widened. The woman shifts back and forth; \ now in the man's circle of movement; now in a gentle \ pirouette by herself, with her arms circled around her rounded \ abdomen.^"; 9: print "^The man's dance becomes more agitated; his turns are sharper, \ his leaps higher and more tense. Finally he leaps out of the \ cleared area and vanishes. Immediately, another man spins into \ the empty space in the motion. His face is painted in fierce \ jagged lines of black and violet, and his dance rages.^"; 10: print "^The woman looks up, finally, from the slow simple head-lowered \ turn she has been absorbed in. She recoils, and is driven back by \ the force of the man's motion. They poise like that for a moment: \ the man advancing, the woman sliding sideways and away from him. \ Then she covers her grey-painted eyes with her hands, bows, \ and falls backwards out of the dance.^"; 11: print "^The man, alone now in the circle, goes into a furious spin. \ His hands are over his face, and he turns and turns on one spot \ until the whole world is wrapped around him -- and then it tears, \ and he collapses to his knees. His upturned face is just smears \ of black and color, now, and his hands seem to bleed violet.^"; 12: print "^The crowd melts away into the encampment, and the area is \ left empty.^"; } } ! shut down if necessary if (self.number == 12) { StopDaemon(self); give self absent; remove self; give thedancesound absent; remove thedancesound; drycamp.number = 1; } ], before [; Examine: rfalse; Search: <>; LookBehind: "Interpret it yourself. I'm just the author."; Listen: <>; default: <>; ! for a "too far away" message. ], has scenery transparent absent; ! absent switched by MoveToWorld Object thedancesound "sound" with name "tapping" "sound" "sounds" "noise" "noises" "music" "dripping" "rhythm" "rhythms" "wail" "voice" "voices" "chord" "chords" "choir", found_in [; rtrue; ! everywhere ], react_before [; Listen: if (noun == nothing) <>; ], before [; Examine: if (parent(thedance) == parent(self)) <>; "You cannot see the source of the sounds."; Follow: if (parent(thedance) == parent(self)) "The sounds come from the west, from the figures holding their wooden boxes."; "The sounds come from somewhere to the west."; Listen: switch (thedance.number) { 1, 2: "Something taps rhythmically, off to the west."; 3, 4: "A complex pattern beats rhythmically in the air."; 5: "A complex pattern taps over a single human voice."; 11: "Voices resonate together, rising."; default: "The music fills everything, rhythm and shimmering voice."; } default: "Rich as it is, it's just sound."; ], has scenery absent; Object dryboxes "odd wooden boxes" thedance with name "odd" "oddly" "proportioned" "oddly-proportioned" "wood" "wooden" "boxes", description [; if (voicebox has moved) print "You can't make out much detail from here, but the boxes seem \ similar to the one you found in the theater."; else print "You can't make out much detail from here, but the boxes seem \ strange."; print " They're somewhat trapezoidal, no two faces parallel. The players hold \ their boxes just in front of the lips, or below the chin; their mouths are open, \ singing long notes that resonate inhumanly. Several are also striking the \ boxes rhythmically.^"; rtrue; ], before [; Examine: rfalse; default: <>; ! for a "too far away" message. ], has scenery; Class drydancerclass with name "dancer", life [; <>; ], before [; Examine: rfalse; default: <>; ! for a "too far away" message. ], has animate scenery; Object drydancerman1 "black-masked man" class drydancerclass, with name "man" "black" "mask" "masked", description "He is not tall, but his limbs are wiry and long. He wears a tight \ brown garment that leaves him free to move. His face is intense, with golden \ hair above the black bar of paint that masks his eyes."; Object drydancerwoman1 "white-masked woman" class drydancerclass, with name "woman" "white" "mask" "masked", description "She wears a tight brown garment that does not cover her arms and \ legs, and she dances with abandon. Her white hair is bound into a queue, and \ a stripe of white paint crosses her eyes.", has female; Object drydancerman2 "jagged-masked man" class drydancerclass, with name "man" "jagged" "stripes" "black" "violet" "mask" "masked", description "He is tall and thin, and dances with tight energy. He wears a tight \ brown garment that leaves him free to move. His hair is sparse and grey, \ and his face is covered with jagged crossing stripes of black and violet."; Object drydancerwoman2 "grey-masked woman" class drydancerclass, with name "woman" "grey" "mask" "masked" "round" "pregnant", description "She is tall, wearing a tight brown garment that does not cover her arms and \ legs. Her shape is that of large pregnancy, but her movements suggest that \ this is costuming, light padding. \ A stripe of grey paint crosses her eyes.", has female; Object drymob "mob of warriors" with name "people" "mob" "warriors" "crashing" "crackling" "noise" "sound", short_name [; if (dryposx - self.number <= 1) print "mob of warriors"; else print "cracking noise"; rtrue; ], found_in [; rtrue; ], description [; if (dryposx - self.number <= 1) "There are lots of them; they look very grim; and they're not waiting around \ while you weigh the situation."; "You can't make out the source of the noise. But it sounds like you won't have \ to wait too long."; ], react_before [; Listen: if (noun == nothing) <>; ], before [ diff; diff = dryposx - self.number; switch (action) { ##Examine: rfalse; ##Listen: "It sounds like a great many people running through the grass."; default: if (diff > 1) "You're too far from whatever's making the noise."; rfalse; } ], life [ diff; diff = dryposx - self.number; if (diff > 1) "You're too far from whatever is making the noise."; switch (action) { ##Attack: deadflag = 1; "You manage to seriously injure the foremost spearman."; ##Kiss: "There is something very wrong with your judgement of character."; ##Ask, ##Order, ##Tell, ##Answer: "Light conversation does not divert the mob."; ##Give, ##Show: "Apparently, they don't care."; ##ThrowAt: "That'll help a lot."; default: rfalse; } ], number -3, ! X position counter for chasing you. daemon [ diff campdir; self.number = self.number + 1; diff = dryposx - self.number; campdir = "west"; if (diff == 1) { if (self hasnt general) { give self general; if (self.number == -2) print "^A wave of people -- men and women -- \ pour out of the tents to the "; else print "^A wave of people -- men and women -- \ takes shape to the "; print (string) campdir, ". They are all holding spears or knives. Holding, \ not brandishing or waving them; they look very businesslike. \ They are running through the grass towards you, needless to say.^"; } else { print "^A few shouts ring over the noise of the mob, which is crashing \ through the grass towards you, from the ", (string) campdir, ".^"; } rtrue; } if (diff < 0) { deadflag = 1; "^The mob runs past you, turns around, and begins performing selected scenes \ from ~Rosenkrantz and Guildenstern Are Dead.~ [BUG]"; } if (diff == 0) { deadflag = 1; if (location == DryTreeTop) "^A stampede of spearmen pours around the base of the tree. You look down \ at them. They look up at you. Maybe, you think, they don't know \ how to climb trees?^^Or throw those spears?"; if (DryHiding == 0) print "^A stampede of spearmen pours over you."; else print "^A stampede of spearmen pours towards you. Straight towards you; \ they don't even seem to notice that you're supposed to be invisible..."; " Your last hope is that they'll \ suffer fiercely from the disappointment of having killed you so easily."; } if (self hasnt general2) { give self general2; print "^You hear a sudden crackling and rattling of grass to the ", (string) campdir, ". You can't make out much, but there's a lot of it -- \ getting louder.^"; } else { print "^Whatever is crashing through the grass to the ", (string) campdir, " is getting closer.^"; } rtrue; ], has scenery animate absent; ! general means been seen. general2 means been heard. [ CoordToRoom xp yp; if (xp < -1 || xp > 1 || yp < -1 || yp > 1) { if (xp == -1 && yp == -2) return DryGuardPost; if (xp == -2) { switch (yp) { -2: return DryCampgroundN; -1: return DryCampgroundNC; 0: return DryCampgroundSC; 1: return DryCampgroundS; default: return DryInTheGrass; } } else { return DryInTheGrass; } } switch (xp) { -1: switch (yp) { -1: return DryHillNW; 0: return DryHillW; 1: return DryHillSW; } 0: switch (yp) { -1: return DryHillN; 0: return DryEntry; 1: return DryHillS; } 1: switch (yp) { -1: return DryHillNE; 0: return DryHillE; 1: return DryHillSE; } } print "You trip over the Edge. [BUG]^"; rfalse; ]; [ CoordToDir xp yp res; res = 0; if (xp*2 > yp) res = res | 1; if (xp*2 > -yp) res = res | 2; if (yp*2 > xp) res = res | 4; if (yp*2 > -xp) res = res | 8; switch (res) { 0: print "northwest"; 1: print "north"; 3: print "northeast"; 11: print "east"; 15: print "southeast"; 14: print "south"; 12: print "southwest"; 4: print "west"; default: print "[BUG (", res, ")]"; } ]; [ MoveOnPath xoff yoff res; if (drycamp.number == 2 && dryposx+xoff <= drymob.number) { "You plunge straight into the teeth of the mob."; } give DryInTheGrass ~visited; dryposx = dryposx + xoff; dryposy = dryposy + yoff; print "The crushed grass muffles your footsteps.^"; res = CoordToRoom(dryposx, dryposy); if (dryposy == 0 && dryposx > 0) move drytreeshadowfar to res; else remove drytreeshadowfar; return res; ]; [ MoveInGrass xoff yoff res; if (drycamp.number < 2) { print "You take a step off the path. There is a dry rattle as you \ wade into the grass... and a sudden shout that freezes you.^"; DryArouseCamp(); rtrue; } if (DryHiding ~= 0) { if (drycamp.number == 2) "You crawl desperately, but the sharp grass is slicing your hands and face, \ and you make almost no progress. And the mob is quickly approaching."; else "Crawling through this stuff would slice your hands and face to ribbons. Best to \ stand up first."; } if (drycamp.number == 2 && dryposx+xoff <= drymob.number) { "You plunge straight into the teeth of the mob."; } give DryInTheGrass ~visited; dryposx = dryposx + xoff; dryposy = dryposy + yoff; if (random(41) <= 20) print "The grass crunches and crackles as you wade through it.^"; else print "You wade through the tall crackling grass.^"; res = CoordToRoom(dryposx, dryposy); if (dryposy == 0 && dryposx > 0) move drytreeshadowfar to res; else remove drytreeshadowfar; return res; ]; #ifnot; ! SKIP_DRY; Object DryEntry "Hilltop" with description "Fourth room.", has light outdoors; Nearby knife "knife" with name "knife"; Constant icelump knife; Nearby jar "jar" with name "jar", has container open; Nearby jaroil "quantity of oil" with name "quantity" "oil"; Nearby jarwater "quantity of water" with name "quantity" "water"; Nearby trickleoil "trickle of oil" with name "trickle" "oil"; Nearby tricklewater "trickle of water" with name "trickle" "water"; Nearby dryspring "spring" with name "spring", has static; [ MaintainIcePhase; ]; [ MaintainWaterPhase; ]; [ DryEnter; ]; [ DryExit; ]; #endif; ! SKIP_DRY;