! _Shade_ ! Special source-code edition ! Copyright 2000-2002 Andrew Plotkin ! http://www.eblong.com/zarf/if.html ! This source code is provided for personal, educational use only. ! See README file for details. Class Sink with name 'sink' 'tap' 'faucet', short_name [; print (string) self.self_name, " sink"; rtrue; ], parse_name [ wd firstwd num; wd = NextWord(); firstwd = wd; while (WordInProperty(wd, self, name)) { num++; wd = NextWord(); } if (num == 1 && firstwd == self.self_word) return 0; return num; ], before [ ix; Enter: if (verb_word == 'run') <>; Examine: if (OIU(self)) rtrue; Receive: "That sort of juggling is unlikely to help."; EmptyT: ix = self.self_obj; <>; SwitchOff: if (OIU(self)) rtrue; "The ", (string) self.self_name, " sink isn't running."; ], receive_water [; if (GoalClosed(self)) "You pour the water into the sink, where it soaks into the sand."; "You pour the water down the drain."; ], receive_sand [; if (GoalClosed(self)) "You add your sand to the sink's burden."; ], has scenery transparent; Class GeneralWater with name 'water' 'from' 'tap' 'faucet', is_sink false, short_name [; print "water from the ", (string) self.self_name; if (self.is_sink) print " sink"; rtrue; ], self_name "BUG", parse_name [ wd gotwater num; wd = NextWord(); while (WordInProperty(wd, self, name)) { if (wd == 'water') gotwater = true; num++; wd = NextWord(); } if (~~gotwater) return 0; return num; ], before [; Enter: if (verb_word == 'run') <>; Find: "Try the ", (string) self.self_name, "."; Take: if (OIU(self)) rtrue; if (glass notin player) "You have nothing in which to carry water."; <>; Drink, Taste: "You broke that habit of drinking from the faucet when you were eleven."; default: print "The ", (string) self.self_name; if (self.is_sink) print " sink"; " isn't running right now."; ], has scenery; Class SinkWater class GeneralWater, with is_sink true, name 'sink'; Zone kitchen "kitchen nook" with name 'kitchen' 'nook' 'alcove', description [ num; print "The kitchen alcove has a refrigerator, a sink, a stove, and barely enough space to stand between them."; if (cupboard in self) print " One wall projects out to form a counter, with a cupboard beneath it."; new_line; DescribeParagraph(self); num = Locale(self, "You see", "You also see"); if (num) { print " lying"; if (player in self) print " here"; else print " on the kitchen floor"; print ".^"; } rtrue; ], nolocifin true, before [; Examine: if (OIU(self)) rtrue; rfalse; Search: <>; ], prereqs cupboard; Sink -> kitchensink with name 'kitchen', self_word 'kitchen', self_name "kitchen", self_obj kitchensinkwater, description [; if (GoalClosed(self)) "The kitchen sink is full of sand."; "The kitchen sink is spotless. Not through any virtue of yours, mind you, except for your inability to cook."; ], before [; SwitchOn, Turn: if (OIU(self)) rtrue; if (GoalClosed(self)) "More sand pours from the kitchen sink's faucet."; if (GoalOpen(self)) { Goaled(self); remove self.self_obj; self.self_obj = kitchensinksand; move self.self_obj to self; BumpSand(kitchen); "With an eerie hiss, dry white sand boils from the faucet. You yank at the tap, but the kitchen sink is already full, and sand spilling on the floor."; } "Nothing comes from the tap but an eerie distant howling. The kitchen sink hasn't worked since you moved in."; ], imp [; closet.startup(); return -1; ], prereqs pbutter crackers; SinkWater -> -> kitchensinkwater with name 'kitchen', self_word 'kitchen', self_name "kitchen", before [; Insert: if (OIU(self)) rtrue; if (second ~= glass) "That won't hold water."; if (glass notin player) "You're not holding the glass."; if (water in glass) "The glass is already full."; <>; SwitchOn: <>; ]; Object -> counter "counter" with name 'counter', short_name [; if (FindZone(player) ~= kitchen) print "kitchen "; print "counter"; rtrue; ], description [; self.subdescribe(); new_line; rtrue; ], nosupportlist true, nosubdescribe [; return (child(self) == 0); ], subdescribe [ ix; ix = child(self); if (~~ix) { print (The) self, " is bare."; } else { print "On ", (the) self; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); print "."; } rtrue; ], before [; Search: <>; Attack, Touch, Push, Pull, Receive, LetGo: if (GoalOpen(cupboard)) <>; ], has scenery supporter; Object -> stove "stove" with name 'stove' 'stovetop' 'electric' 'range' 'burner', seenonce false, description [; if (GoalClosed(self)) "Nothing is left of the stovetop but a corroded metal sheet, dusted with sand."; print "The usual electric range arrangement."; if (~~self.seenonce) { self.seenonce = true; print " Weirdly, there is no oven in your kitchen. You don't know what lurks in the space beneath the stove. You've been afraid to pry -- the stove might turn out to be powered by radioactive decay, or something."; } if (self has on) { print " The stove is on"; if (self.heat >= 4) print " and the burner is glowing red"; print "."; } else { if (self.heat >= 4) print " The burner is still red, though dimming."; } new_line; rtrue; ], before [; Receive: if (OIU(self)) rtrue; "What, after all these years you're going to take up cooking?"; SwitchOn: if (OIU(self)) rtrue; if (GoalClosed(self)) "Click. Nothing happens. Nor will it ever again, not with this stove."; if (GoalOpen(self)) { Goaled(self); give self ~on; self.heat = 0; StopDaemon(self); BumpSand(kitchensand); "You turn the knob -- click. Then the stove emits a loud crackle. The burner frosts white, although you can feel the heat radiating from it; bits of its substance seem to be flaking away. Thermal shock? you have time to think. And then the entire burner arrangement slumps into white sand, which runs down off the stove."; } if (self has on) "The stove is already on."; give self on; StartDaemon(self); "Click."; SwitchOff: if (OIU(self)) rtrue; if (GoalClosed(self)) "The stove is about as off as you could possibly hope for."; if (self hasnt on) "The stove is already off."; give self ~on; "Click."; Touch: if (OIU(self)) rtrue; switch (self.heat) { 0: rfalse; 1: "The burner is warm."; 2: "The burner is very warm."; default: "The burner is too hot to touch."; } ], heat 0, daemon [; if (self has on && GoalOpen(self)) { give self ~on; print "^The stove emits a peculiar crackle.^"; } if (self has on) { self.heat++; if (self.heat > 5) self.heat = 5; if (FindZone(player) == kitchen) { switch (self.heat) { 2: print "^Warmth begins to radiate from the stove.^"; 4: print "^The stove burner is glowing red now.^"; } } } else { self.heat--; if (self.heat < 0) { self.heat = 0; StopDaemon(self); } if (FindZone(player) == kitchen) { switch (self.heat) { 3: print "^The burner's glow fades.^"; } } } ], prereqs [; return (GoalClosed(bathsink) || GoalClosed(kitchensink)); ], has scenery ~on; Object -> cupboard "cupboard" with name 'cupboard' 'cabinet', description [; print "Your only kitchen cupboard is a small space beneath the counter, shelved in warped pressboard."; if (self has open) { print " "; self.subdescribe(); if (GoalOpen(self)) print " At the very back, sand falls from an upper corner, a few grains at a time."; } else { print " The cupboard is closed."; } new_line; rtrue; ], nosubdescribe [; return (self hasnt open); ], subdescribe [ ix; print "The cupboard is open"; ix = child(self); if (~~ix) { print " and bare"; } else { print "; inside"; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); } print "."; rtrue; ], before [; Enter: if (self has open) "You don't fit."; else return L__M(##Insert,3,self); Touch: if (GoalOpen(self)) { RescueContents(self, kitchen); RescueContents(counter, kitchen); remove self; remove counter; BumpSand(kitchen); plant.startup(2); Goaled(self); print "The cabinet and counter start to groan as soon as you touch them. You"; if (self hasnt open) print " yank the cabinet open, and slam it"; else print " slam the cabinet"; " for good measure; and the stained pressboard crackles white, shivers, and explodes into sand. All right!"; } Open: if (self hasnt open && GoalOpen(self)) { <>; } Close: if (self has open && GoalOpen(self)) { <>; } Attack, Push, Pull, Receive, LetGo: if (GoalOpen(self)) <>; ], prereqs stove fridge, opentime 0, imp [; self.opentime++; switch (self.opentime) { 1: if (player in kitchen) print "^A faint creaking comes from the kitchen ceiling.^"; else print "^A faint creaking comes from the direction of the kitchen.^"; 2: print "^With a muffled ", (emph) "crack", " the kitchen ceiling gives way. Broken plaster and rotten lath tumble down as you"; if (player in kitchen) print " leap aside"; else print " stare"; print ". And they, of course, are followed by sand, white sand, rivers of sand. In moments the kitchen alcove is lost to your sight.^"; BumpSand(livingsand); RescueContents(kitchen); remove kitchen; Goaled(kitchen); return -1; } ], has scenery container openable ~open; Object -> -> crackers "box of crackers" with name 'box' 'of' 'cracker' 'crackers' 'substrate', short_name [; if (self has open) { print "box of sand"; rtrue; } rfalse; ], seenonce false, description [; if (self has open) { "The box is open, but it contains no crackers. Instead, it is packed with sand."; } "You buy this species of bland starchy substrate to put underneath your peanut butter."; ], before [ ix; Smell: if (OIU(self)) rtrue; if (self hasnt open) { "It's not a particularly odiferous variety of cracker."; } rfalse; Eat, Taste, Drink: if (OIU(self)) rtrue; if (self hasnt open) <>; "You can't eat sand."; Open: if (OIU(self)) rtrue; if (self has open) "The box is already open."; if (~~GoalEverOpen(self)) "You have no appetite this early in the morning."; give self open; move boxsand to self; Goaled(self); ix = FindFloorZone(player); if (ix) BumpSand(ix); print "You pull on the box top. It's stuck, somehow. You yank --^^The top tears away, and white sand sprays out of the box.^"; if (GoalClosed(pbutter)) print "^This is getting to be too much. You consider which of your friends might have snuck in here and set all of this up. No... mmm... nobody, really.^"; rtrue; Close: if (OIU(self)) rtrue; if (self hasnt open) "The box is already closed."; "The top is gone."; Receive: if (OIU(self)) rtrue; if (self hasnt open) "The box is closed."; "You wouldn't want to jam anything into a cracker box. Especially not one full of sand."; Search: if (OIU(self)) rtrue; if (self hasnt open) "The box is closed."; <>; Wave: if (OIU(self)) rtrue; if (self has open) <>; if (GoalEverOpen(self)) "Something shifts around in the box, but it doesn't sound like crackers. Strange."; "Some crackers rattle around."; Empty, EmptyT: if (OIU(self)) rtrue; if (self hasnt open) "The box is closed."; <>; ], prereqs vacuum, has rescuable ~open transparent; Object -> fridge "refrigerator" with name 'fridge' 'refrigerator', description [; if (GoalClosed(self)) { "The fridge hangs open. An unmoving torrent of sand pours down onto the floor."; } print "It's yellow. Beyond that, it looks like every other refrigerator in the United States."; if (self has open) { print " "; self.subdescribe(); } new_line; rtrue; ], nosubdescribe [; return (self hasnt open); ], subdescribe [ ix; if (GoalClosed(self)) { print "Sand spills from the open refrigerator."; rtrue; } print "The fridge is open"; ix = child(self); if (~~ix) { print " but empty"; } else { print "; inside"; WriteListFrom(ix, TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT); } print "."; rtrue; ], opentime 0, before [; Search: if (GoalClosed(self)) { "The fridge is full of sand."; } self.opentime = 0; rfalse; Receive: if (GoalClosed(self)) { "The fridge is clogged with sand."; } self.opentime = 0; rfalse; LetGo: self.opentime = 0; rfalse; Open: if (OIU(self)) rtrue; if (GoalOpen(self)) { StopDaemon(self); give self open; RescueContents(self, kitchen); BumpSand(kitchensand); Goaled(self); "You pull open the refrigerator, and try not to flinch as a wall of sand rushes out and buries your feet."; } if (self hasnt open) { StartDaemon(self); self.opentime = 0; } rfalse; Close: if (GoalClosed(self)) { if (OIU(self)) rtrue; "The door is jammed open."; } rfalse; Enter: if (GoalClosed(self)) "The fridge is clogged with sand. You couldn't even stuff a loaf of bread in there, much less yourself."; if (self has open) "Sixty years ago, you could suffocate yourself by locking yourself in the fridge. The miracles of modern technology, however, have removed this as a viable option."; else return L__M(##Insert,3,self); ], daemon [; if (self hasnt open || parent(self) == 0 || GoalClosed(self)) { StopDaemon(self); return; } self.opentime++; if (self.opentime >= 4) { StopDaemon(self); give self ~open; if (player in kitchen or Apartment or futon or desk) print "^The fridge door swings shut.^"; } ], prereqs crate closet, startup [; if (GoalOpen(self)) { self.opentime = 10; } ], has scenery container openable ~open; Object -> -> pbutter "jar of peanut butter" with name 'jar' 'of' 'peanut' 'butter', short_name [; if (self has open) { print "jar of sand"; rtrue; } rfalse; ], seenonce false, description [; if (self has open) { "The jar is open, but it contains no peanut butter. Instead, it is packed with sand."; } print "Partially hydrogenated. Nutritive, reliable. Brandless and brown."; if (~~self.seenonce) { self.seenonce = true; !print " Please don't ask why you keep the peanut butter in the ! fridge; the story is long, involute, and beyond the scope ! of this game."; } new_line; rtrue; ], before [ ix; Smell: if (OIU(self)) rtrue; if (self hasnt open) { print "You can't smell anything with the jar closed."; if (~~GoalEverOpen(self)) print " You wouldn't find it that appetizing right now, anyway."; new_line; rtrue; } rfalse; Eat, Taste, Drink: if (OIU(self)) rtrue; if (self hasnt open) <>; "You can't eat sand."; Open: if (OIU(self)) rtrue; if (self has open) "The jar is already open."; if (~~GoalEverOpen(self)) "You have no appetite this early in the morning."; give self open; move jarsand to self; Goaled(self); ix = FindFloorZone(player); if (ix) BumpSand(ix); print "You unscrew the lid... with an unexpected grating sound. Something sifts to the floor.^^The peanut butter jar is full of sand.^"; if (GoalClosed(crackers)) print "^This is getting to be too much. You consider which of your friends might have snuck in here and set all of this up. No... mmm... nobody, really.^"; rtrue; Close: if (OIU(self)) rtrue; if (self hasnt open) "The jar is already closed."; "The lid is gone."; Receive: if (OIU(self)) rtrue; if (self hasnt open) "The jar is closed."; "You wouldn't want to jam anything into a peanut butter jar. Especially not one full of sand."; Search: if (OIU(self)) rtrue; if (self hasnt open) "The jar is closed."; <>; Wave: if (OIU(self)) rtrue; if (self has open) <>; if (GoalEverOpen(self)) "Strange. Something shifts inside the jar when you shake it, and cold peanut butter certainly shouldn't."; rfalse; Empty, EmptyT: if (OIU(self)) rtrue; if (self hasnt open) "The jar is closed."; <>; ], prereqs vacuum, imp [; if (~~GoalClosed(crackers)) return; KillImp(vacuum); plant.startup(1); return -1; ], has rescuable ~open transparent; Zone bathroom "bathroom nook" with name 'bathroom' 'nook' 'alcove', description [ num; print "The bathroom alcove"; if (toilet in self) print " has a toilet, a sink"; else print " has a sink"; if (shower in self) { print ", and a shower stall that manages to make the rest of the place look roomy."; print " Not much else; most of your accoutrements have been packed."; } else { print ", and a drift of sand where the shower stall used to be."; } new_line; num = Locale(self, "You see", "You also see"); if (num) { print " lying"; if (player in self) print " here"; else print " on the bathroom floor"; print ".^"; } rtrue; ], nolocifin true, locseealso shower, before [; Examine: if (OIU(self)) rtrue; rfalse; Search: <>; ], prereqs toilet shower; Object -> toilet "toilet" with name 'toilet' 'commode' 'wc', description "Surely you know what a toilet looks like.", before [; Enter: if (verb_word == 'run') <>; "You feel no such need at the moment."; Search: if (OIU(self)) rtrue; "Porcelain and mildew glitter damply at you. You're glad you looked."; Empty: if (OIU(self)) rtrue; if (GoalOpen(self)) { Goaled(self); remove self; BumpSand(bathroomsand); plant.startup(2); "The toilet? Yes, it's the toilet's turn! You press the handle, grinning maniacally. And indeed, the sand rushes down the sides of the bowl; the shining porcelain itself crazes, cracks, and veils to the bathroom floor. The toilet is a pedestal, a stump, a mere pile of sand. Gone."; } "The result is predictable: the murky water in the toilet is replaced by different murky water."; ! In all adventure games that implement a bathroom, surely ! there shall be implemented a humorous ~flush~ command. ! So it is now. SwitchOn: <>; EmptyT: if (OIU(self)) rtrue; "No, thanks. The toilet really isn't all that clean."; Open: if (OIU(self)) rtrue; "It already is."; Close: if (OIU(self)) rtrue; "You're a lid-up sort of person."; ], receive_water "You empty the glass into the toilet. Glug.", receive_sand [; print "Do you want to clog the toilet again? No, you do not.^"; return 2; ], prereqs crate luggage, opentime 0, imp [; if (~~GoalClosed(shower)) return; self.opentime++; switch (self.opentime) { 1: if (player in bathroom) print "^A faint creaking comes from the bathroom ceiling.^"; else print "^A faint creaking comes from the direction of the bathroom.^"; 2: print "^With a muffled ", (emph) "crack", " the bathroom ceiling gives way. Broken plaster and rusty pipes tumble down as you"; if (player in bathroom) print " leap aside"; else print " stare"; print ". And down comes the sand, a dry white rushing river, hissing, shrieking. In moments the bathroom is lost to your sight.^"; BumpSand(livingsand); RescueContents(bathroom); remove bathroom; Goaled(bathroom); return -1; } ], has scenery; Sink -> bathsink with name 'bathroom', self_word 'bathroom', self_name "bathroom", self_obj bathsinkwater, seenonce false, description [; if (GoalClosed(self)) "The bathroom sink is full of sand."; print "The bathroom sink is small and just a bit scummy."; if (~~self.seenonce) { self.seenonce = true; print " (You never quite understood how bathroom sinks acquire grunge. After all, most of what passes through them is soap and water... It's a mysterious world sometimes.)"; } new_line; rtrue; ], before [; SwitchOn, Turn: if (OIU(self)) rtrue; if (GoalClosed(self)) "More sand pours from the bathroom sink's faucet."; if (GoalOpen(self)) { Goaled(self); remove self.self_obj; self.self_obj = bathsinksand; move self.self_obj to self; BumpSand(bathroom); "With an eerie hiss, dry white sand boils from the faucet. You yank at the tap, but the bathroom sink is already full, and sand spilling on the floor."; } "You spin the tap. The pipes sound like an indigestive mammoth, but water does dribble out of the faucet. Reassured, you turn the tap back off."; ], imp [; closet.startup(); return -1; ], prereqs pbutter crackers; SinkWater -> -> bathsinkwater with name 'bathroom', self_word 'bathroom', self_name "bathroom", before [; Insert: if (OIU(self)) rtrue; if (second ~= glass) "That won't hold water."; if (glass notin player) "You're not holding the glass."; if (water in glass) "The glass is already full."; if (GoalOpen(bathsink)) { <>; } if (sand in glass) "Water dribbles into the glass, soaking into the sand. After a few moments, you realize the sand is as dry as when you started. Strange."; move water to glass; PronounNotice(water); "The faucet rattles, and water dribbles into the glass."; SwitchOn: <>; ]; Zone -> shower "shower" with name 'shower' 'stall' 'curtain', leave_fragment " get out of the shower", enter_fragment " squeeze into the shower", description [ num; print "The shower stall is a familiar symphony in pinkish-grey tile and grunge. Well, more of a solo. A short solo"; if (player in self) print "; you reflexively crane your neck to keep from smacking the showerhead"; print ".^"; num = Locale(self, "You see", "You also see"); if (num) { print " lying"; if (player in self) print " here"; else print " in the shower stall"; print ".^"; } rtrue; ], nolocifin true, ! locseealso bathroom, before [; Examine: if (OIU(self)) rtrue; rfalse; Search: <>; Take: <>; Open, Close, Push, Pull: if (OIU(self)) rtrue; "The shower curtain has become a daily ritual of annoyance. It's too small. It cannot, no matter how you tug at it, actually cover the shower stall. You've managed to arrange the curtain so that the minimal amount of water splashes onto the bathroom floor when you shower, and that's where you leave it."; SwitchOn: <>; SwitchOff: <>; Enter: if (verb_word == 'run') <>; EmptyT: <>; ], prereqs crate stove; Object -> -> showerhead "showerhead" with name 'showerhead' 'shower' 'head' 'tap' 'faucet', parse_name [ wd firstwd num; wd = NextWord(); firstwd = wd; while (WordInProperty(wd, self, name)) { num++; wd = NextWord(); } if (num == 1 && firstwd == 'shower') return 0; return num; ], before [; EmptyT: <>; SwitchOn: if (OIU(shower)) rtrue; if (GoalOpen(shower)) { RescueContents(shower, bathroom); remove shower; BumpSand(bathroom); Goaled(shower); "You turn the tap, and -- no surprise now -- dry sand floods from the showerhead. Shielding your eyes from the spray, you reach to turn the tap back off.^^A creaking from above warns you. You leap back as the plaster cracks overhead, and whiteness roars down.^^When silence returns, the entire far end of the bathroom is a blank slope of sand."; } "You turn the tap... and nothing happens. Hmm. The shower was working last night. You knew the pipes in your apartment were unreliable, but this is worse than usual."; SwitchOff: if (OIU(shower)) rtrue; "The shower isn't running."; Enter: if (verb_word == 'run') <>; ], has scenery; GeneralWater -> -> showerheadwater with name 'shower', self_word 'shower', self_name "shower", before [; Insert: if (OIU(shower)) rtrue; if (second ~= glass) "That won't hold water."; if (glass notin player) "You're not holding the glass."; if (water in glass) "The glass is already full."; <>; SwitchOn: <>; Enter: if (verb_word == 'run') <>; ]; Object glass "glass" with name 'glass', invent [; if (inventory_stage == 1) rfalse; if (water in self) print " of water"; if (sand in self) print " of sand"; rtrue; ], partinvent [; return self.invent(); ], description [; print "An ordinary drinking glass"; if (water in self) print ", full of water"; if (sand in self) print ", full of sand"; "."; ], before [ ix; Search: if (water in self) "The glass contains water."; if (sand in self) "The glass contains sand."; "The glass is empty."; Fill: if (self notin player) "You're not holding the glass."; ix = 0; if (TestScope(bathsinkwater)) ix = bathsinkwater; if (ix == 0 && TestScope(bathsinksand)) ix = bathsinksand; if (ix == 0) "You'll have to say what to fill the glass with."; if (OIU(ix)) rtrue; <>; Receive: "That sort of juggling is unlikely to help."; Empty: if (OIU(self)) rtrue; ix = child(self); if (ix) <>; "The glass is already empty."; EmptyT: if (OIU(self)) rtrue; ix = child(self); if (ix) <>; "The glass is already empty."; Drink: if (OIU(self)) rtrue; ix = child(self); if (~~ix) "The glass is empty."; <>; BlowOn: if (OIU(self)) rtrue; ix = child(self); if (ix) <>; ], receive_water [; print "The glass is already full.^"; return 2; ], receive_sand [; print "The glass is already full.^"; return 2; ], has rescuable container open; Object water "glassful of water" with name 'glassful' 'of' 'water', description "The water glints like a mirage.", seenonce 0, before [ ix; Take: "With your bare hands?"; BlowOn: if (OIU(self)) rtrue; "The water ripples gently."; Drop: if (~~IndirectlyContains(player, self)) "You haven't got that."; remove self; ix = FindFloorZone(player); if (ix) ix = ix.sand_obj; print "The water splashes"; if (ix == 0 || ix.number <= 1) print " onto the floor"; else { if (ix.number <= 4) print " onto the sand on the floor"; else print " into the sand"; } print ", leaving a wet spot that dries in seconds"; self.seenonce++; if (self.seenonce == 2) print ". Hmm"; "."; EmptyT: <>; Insert, PutOn: if (~~IndirectlyContains(player, self)) "You haven't got that."; if (second provides receive_water) { if (OIU(second)) rtrue; ix = second.receive_water(); if (ix) { if (ix ~= 2) remove self; rtrue; } } if (second == d_obj) <>; "Water will do that no good."; Taste: if (OIU(self)) rtrue; "The water is warm and flat-tasting."; Drink: if (OIU(self)) rtrue; remove self; print "You gulp the water. It feels vaguely astringent in your mouth, unsatisfying."; if (GoalOpen(self)) { print " Well, no doubt thirst will be more real after you fly to California --"; print ""; Goaled(self); KillImp(firstgoal); ! thirst imp } new_line; rtrue; ], opentime 0, imp [; self.opentime++; switch (self.opentime) { 2: print "^-- Fly? Where did you leave your plane tickets?^"; 3: print "^You hate this feeling. It happens ", (emph) "all the time.", " Something safely accomplished, and then pow, you have to worry about it again. Unfair! The tickets must be here somewhere.^"; return -1; 4: print "^[BUG] water imp^"; } ], prereqs firstgoal, has scenery;