!!! Fixes applied afer submission: !!! cooking_turns only increases when the kettle actually contains kernels !!! terminus_buildings.react_before no longer stops action !!! added test_scope to popcorn sounds !!! removed extra newline in lever's 'before' routine !!! ...and I put it back, because it needed to be there. However, I !!! removed extraneous newlines from later in the daemon process. -Rob !!! vagrant now only eats popcorn in kettle if it's actually there !!! lever's react_before for Jump now doesn't apply in transport_tunnel !!! moved deserted_station's initial text to lever's react_before jump !!! (so it doesn't get printed when you arrive by other means) ! IF-Whispers 1 ! Segment 5 ! by Alexandre Owen Muniz ! Started: 07-24-05 - Finished: 07-28-05 ! Notes to the next author: If you could put something vital or at least ! useful in the deserted_station room, then I won't feel like I wasted so ! much time on a puzzle with no payoff. ! The main hook for the game to continue is monorail_terminus.open_the_east(). ! Set that to a function that sets monorail_terminus.e_to and does any ! other setup you need, and you should be good to go. Extend 'shoot' * 'at' noun 'with' shootable_weapon -> ShootAt; !Just so I can affect actions involving the last author's objects Object invisible_object transport_platform has scenery, with author "two-star", react_before[; Eat: if (noun == quantity_of_kernels) "The corn is too hard and dry to eat without preparing it first."; Search: if (noun == metal_crate && metal_crate has open) <>; ShootAt: if (noun == quantity_of_kernels && second == ray_gun) "That might be an effective way to scorch the kernels, but if you want to cook them in a manner that could leave them in an edible state, you'll have to try something less direct."; ]; HiddenInCorn leaflet "leaflet" with name 'leaflet', author "two-star", description "The leaflet reads:^^ STOP GENETICALLY MODIFIED FOODS^ Genetically modified maize contaminates seed stocks, destroys small farms, and poisons our bodies and the environment.^ Say NO to GMO! / Dites NON aux OGM!^^ It appears to be printed on recycled paper."; Constant GUN_HEATING 18; Constant COOKING_TEMPERATURE 12; Constant HOT_TEMPERATURE 9; Constant TURNS_TO_COOK 5; Object kettle "kettle" shed has container open transparent, ! has general when it has kernels with name 'kettle' 'black', author "two-star", temperature 0, cooking_turns 0, describe [; if (self hasnt moved) "^A large black kettle sits conspicuously in the back corner."; ], description [; print "It is made out of solid black cast iron. "; if (popcorn in self) "The kettle is nearly filled with fluffy white popcorn."; if (self.temperature > COOKING_TEMPERATURE) if (self has general) if (self.cooking_turns < TURNS_TO_COOK) "Within the kettle, kernels of corn are popping into fluffy white puffs as you watch."; else "A few stragglers are popping with long gaps between them. You hope the kettle cools fairly soon so that the popcorn doesn't burn."; ! Oops. This can't be reachable. Oh well. else "The kettle is glowing a dull red, and the oil inside is crackling."; else if (self has general) "There are some corn kernels in the oil at the bottom. "; else "There is an oily substance at the bottom. "; ], react_before [; Insert: if (second == self) if (noun == quantity_of_kernels) { give self general; "You take a handful of kernels from the crate and toss them into the kettle."; } else "The oil in the bottom of the kettle would probably be bad for ", (the) noun, "."; ], before [; Push, Pull, Take: if (self.temperature > HOT_TEMPERATURE) <>; Empty: "That could get messy."; Smell: if (popcorn in self) <>; else if (self has general && self.temperature > COOKING_TEMPERATURE) "It smells like popcorn cooking"; else "It smells like vegetable oil."; Touch: if (self.temperature > COOKING_TEMPERATURE) "The kettle is extremely hot. It would be unwise to touch it."; if (self.temperature > HOT_TEMPERATURE) "It still looks much too hot to touch."; if (self.temperature > 0) "It's a little warm still, but not unbearably."; ShootAt: if (self.temperature > HOT_TEMPERATURE) "The kettle is still quite hot from your previous shot. You don't want to melt the metal."; if (second ~= ray_gun) "It would seem that only a thermal weapon could have a useful effect on the kettle."; StartDaemon(self); self.temperature = self.temperature + GUN_HEATING; if (IndirectlyContains(player, self)) { move self to parent(player); print "You set the kettle down, since you want to be a safe distance away first. Then y"; } else print "Y"; "ou shoot a steady beam at the kettle for about ten seconds, until it begins to glow a dull red."; ], daemon [; if (self.temperature > 0) self.temperature--; else StopDaemon(self); ! if (self.temperature > COOKING_TEMPERATURE) if (self has general && self.temperature > COOKING_TEMPERATURE) self.cooking_turns++; if (self has general && self.temperature > COOKING_TEMPERATURE && self.cooking_turns < TURNS_TO_COOK) if (TestScope(self, player)) "^You hear popping sounds coming out of the kettle at random intervals."; if (self has general && (~~popcorn in kettle) && self.cooking_turns == TURNS_TO_COOK) { move popcorn to kettle; if (TestScope(self, player)) "^The popping coming out of the kettle has slowed down considerably. After a few last pops, it seems that the popcorn is done."; } ]; Object Popcorn "popcorn" has edible, with name 'popcorn', author "two-star", article "some", description "A pile of fluffy popped kernels sitting in the bottom of the kettle.", react_before [; PutOn, Insert: if (noun == milky_poison && second == self) { if (self has general) "One drop ought to be enough. The poison seems to be incredibly potent."; give self general; "You open the cap of the vial, and let a drop fall on the popcorn. Then you carefully shake the kettle to distribute the poison without letting any poisoned kernels fall out."; } ], before [; Smell: "The popcorn smells so delicious, it's almost intoxicating."; Take: "It looks like the only reasonable way to carry the popcorn around is to keep it in the kettle."; Eat: if (self has general) "Not now that you've poisoned it."; else if (self hasnt on) { give self on; "You nibble on a piece of popcorn. You can't taste anything wrong with it, so you eat a few more pieces, then a handful. A feeling of euphoria washes over you as the popcorn hits your stomach, and you begin to automatically grab another handful when you realize that this popcorn is much more than normally addictive, and that continuing to eat it could have deleterious effects on your health."; } else "No. This stuff is highly addictive. Withdrawal is not fun. Neither is overdosing, which seems the more likely possibility, considering you have a crate full of the stuff on hand."; ]; Object mechanical_arm "mechanical claw" monorail_load_station has scenery, with name 'mechanical' 'arm' 'claw' 'grip', author "two-star", description "It's the biggest damned mechanical claw you've seen in your life.", each_turn [; monorail_load_station.initial = 0; self.each_turn = 0; ]; [ abs a; if (a < 0) a = -a; return a; ]; Constant STATION_MINIMUM 9; Constant STATION_MAXIMUM 14; Constant LOADING_POSITION 0; Constant TERMINUS_POSITION 20; Object control_lever "lever" flatbed_control_post has light, with name 'lever', author "two-star", position LOADING_POSITION, velocity 0, acceleration [; if ((self.velocity == 3 && self has general) || (self.velocity == -3 && self hasnt general)) return 0; if (self has general) return 1; else return -1; ], within_station [; return self.position > STATION_MINIMUM && self.position < STATION_MAXIMUM; ], description [; print "The lever has two settings, one marked with a heptagram symbol, the other with a diamond. It is currently set to the "; if (self has general) "heptagram."; else "diamond."; ], before [; Pull, Push: if (self hasnt general) { give self general; StartDaemon(self); print "You flip the lever so that it points to the heptagram."; if (self.position == LOADING_POSITION) { move flatbed_car to transport_tunnel; location = transport_tunnel; " The car lurches forward, and accelerates northward into the tunnel."; } ""; } else { give self ~general; StartDaemon(self); print "You flip the lever so that it points to the diamond."; if (self.position == TERMINUS_POSITION) { move flatbed_car to transport_tunnel; location = transport_tunnel; " The car lurches forward, and accelerates southward into the tunnel."; } ""; } ], daemon [ old_velocity was_within; old_velocity = self.velocity; was_within = self.within_station(); if (abs(self.velocity + self.acceleration()) <= 3) self.velocity = self.velocity + self.acceleration(); self.position = self.position + self.velocity; if (self.position <= LOADING_POSITION) { self.position = LOADING_POSITION; self.velocity = 0; StopDaemon(self); move flatbed_car to monorail_load_station; print "^The flatbed car slows to a stop at the loading station.^"; PlayerTo(flatbed_car); } if (self.position >= TERMINUS_POSITION) { self.position = TERMINUS_POSITION; self.velocity = 0; StopDaemon(self); move flatbed_car to monorail_terminus; if (monorail_terminus has visited) print "^The flatbed car slows to a stop at the monorail terminus.^"; else print "^The car slows as it approaches the end of the line; you can tell that you are in an urban tunnel system now, with buildings where people from all walks of life once lived and shopped and worked and worshipped.^"; PlayerTo(flatbed_car); } switch (abs(self.velocity)) { !!! I added ^s to print statements and changed the last line of the routine !!! from "" to rtrue, in order to make new_lines consistent and tidy. -Rob 0: if (abs(old_velocity) == 1) "^The car stops, and starts to accelerate in the opposite direction."; 1: if (abs(old_velocity) == 2) print "^The car slows to the speed of a brisk jog.^"; 2: switch (abs(old_velocity)) { 1: print "^The car continues to accelerate. The lights of the tunnel fly past, and begin to blur together.^"; 3: print "^The car slows to a more comfortable speed, but it is still moving pretty quickly.^"; } 3: if (abs(old_velocity) == 2) print "^The air is rushing by you so quickly now that you have to crouch on the bed of the car to keep your balance.^"; } if (self.within_station() && ~~was_within) "^A light ahead grows brighter, and the car starts to pass by the platform of a deserted station."; if (was_within && ~~self.within_station()) !!! I added the word "deserted" in here, just for maximum clarity. - Rob "^The car reaches the end of the platform, and the lights of the deserted station recede from view."; rtrue; ], react_before [; Exit: if (location == transport_tunnel) <>; Jump: if (location ~= transport_tunnel) <>; if (~~self.within_station()) "There's no safe place to jump to; The tunnel is barely wider than the car you are on, and the next car to come through would smash you to a pulp if you were standing in the tunnel."; switch (abs(self.velocity)) { 3: "The car is moving far too quickly. If you jumped off now, you'd probably kill yourself."; 2: "The car is moving too quickly. You could hurt yourself quite badly if you tried to jump off."; 0, 1: switch (control_lever.velocity) { 0: print "You hop gracefully onto the platform from the flatbed car."; -1, 1: print "You jump from the moving car onto the platform, and stumble forward for a few steps, but you manage to regain your balance."; } print " Behind you, the flatbed car keeps moving without you, and disappears down the tunnel.^"; PlayerTo(deserted_station); StopDaemon(control_lever); rtrue; } ], add_to_scope [; if (self.within_station()) AddToScope(station_from_tunnel); ]; Object transport_tunnel "Transport Tunnel" has light, with short_name [; print "Transport Tunnel"; if (control_lever.within_station()) print " (At Deserted Station)"; rtrue; ], author "two-star", description [; "The monorail line passes through a narrow tunnel."; ]; Object station_from_tunnel "deserted station" has scenery supporter, with name 'deserted' 'station' 'platform', author "two-star", description "The platform is clean and well lit, but it is completely deserted. There are some decorations on the walls of the station, but you can't make them out well from here.", before [; Enter: <>; ]; Object deserted_station "Deserted Station" has light, with author "two-star", description "This was once a mass transit station, but it hasn't been used in some time. Along the walls are clear tubes with stone inside them. Next to these is an elevator.", initial [; ]; Object rock_core "rock core" deserted_station has scenery, with name 'rock' 'stone' 'core' 'cores' 'sample' 'tube' 'tubes' 'clear', author "two-star", description [; print "The stone was a core sample taken by the engineers who built this station. Above the core, elegant inscriptions in the wall label the various sediments and basalt flows that formed the layers of rock above you, with notations describing magnetic field reversals and the evolution of organisms found in fossil bearing strata."; if (charred_notes has moved) " Your eyes catch upon a thin black layer in the stone labeled ~Karaktus Event.~ Could this be what the notebook was referring to?"; else ""; ], before [; Search: <>; ]; Object karaktus_event "Karaktus Event line" deserted_station has scenery, with name 'karaktus' 'event' 'black' 'line' 'layer', author "two-star", description "There is an inscription over a black layer in the stone core with these words:^^ Karaktus Event -- Global ashfall during the Oligocene epoch caused the extinction of a number of large mammals. The cause of the Karaktus Event is unknown; isotopic analysis is not consistent with either volcanic ash or meteoritic impact debris."; Object station_elevator "elevator" deserted_station has scenery door openable locked, with name 'elevator', author "two-star", description "The elevator set in the north wall probably goes directly to the surface, which is the least safe place for you to be. Next to the elevator there is a panel with buttons and lights.", door_dir n_to, door_to 0; Object station_panel "panel" deserted_station has scenery, with name 'panel', author "two-star", description "The panel has a load of buttons and lights and other panelly goodness. A big red button labeled ~Emergency Train Recall~ looks especially promising."; Object station_button "big red button" deserted_station has scenery, with name 'big' 'red' 'button' 'emergency' 'train' 'recall', author "two-star", description "It is big, and it is red, and it is the button you should be pushing if you haven't already.", before [; Push: move flatbed_car to deserted_station; control_lever.position = (STATION_MINIMUM + STATION_MAXIMUM) / 2; control_lever.velocity = 0; "Nothing seems to happen immediately, but within a few minutes you hear the whooshing of a train in the tunnel, and the freight car comes out of the tunnel and stops right at the center of the platform."; ]; Object monorail_terminus "Monorail Terminus" has light, with description "The area surrounding the terminus was part of an underground city, with apartments and storefronts. All are boarded up now. Occasionally you can catch a glimpse of somebody walking along one of the tunnels that cross the ones opening into the square around the terminus, so you know the area isn't completely deserted, but it is nearly so.", author "two-star", cant_go "The city is a maze of abandoned tunnels. Without some notion of where you need to go, you could get quite lost.", open_the_east 0, e_to 0; Object terminus_buildings "buildings around the terminus" monorail_terminus has scenery, with name 'apartment' 'storefron' 'building' 'buildings' 'minichape' 'chapel', author "two-star", description "The buildings are all securely boarded up. Whoever lived here had time to evacuate in an orderly fashion, and they expected to be able to come back.", react_before [; Exit: if (player in flatbed_car && self hasnt general) { give self general; move sick_vagrant to monorail_terminus; print "As you step off the car, you see a vagrant man standing near the edge of the square. You wave to get his attention, then you ask whether he had seen the woman who shot at you in the complex. But he only coughs and mutters something incoherent; the only word you manage to catch is ~popcorn~."; } ]; Object sick_vagrant "vagrant" has animate male transparent, with name 'sick' 'ill' 'vagrant' 'man', author "two-star", describe "^A vagrant man stands outside of a boarded up minichapel.", description [; print "The vagrant is wearing an old plaid shirt and torn jeans with a corner of something paper sticking out of the back pocket. He looks neither young nor old, but you'd guess that he's led the kind of life that makes one look older than one is."; if (self has general) " He looks a lot happier now that he's had his popcorn dose."; else " He is constantly coughing, and hacking and spitting on the concrete floor."; ], react_before [; Give, Show: !this doesn't work. I give up. if (noun == popcorn && second == self) <>; ], life [; Give, Show: if (noun == kettle && popcorn in kettle) { print "The vagrant grabs at the popcorn and greedily stuffs it into his mouth."; if (popcorn has general) { move dead_vagrant to parent(self); remove self; " After a few seconds, his eyes start to bulge, then he coughs once and falls backward. As you watch, his skin begins to wrinkle and turn grey. Soon, the flesh of his face looks like a desiccated prune, as though he aged fifty years in a minute.^^ He's dead. You killed him. On the positive side, at least now you know how the poison works."; } else { move kettle to sick_vagrant; monorail_terminus.open_the_east(); give self general; " After he finishes gorging himself on the popcorn, he seems a little more calm and lucid, so you ask him again, ~There was a woman, in a dark uniform, with a gun. Did you see where she went?~^^ He closes his eyes for a moment. ~Yeah.~ He opens his eyes again, and an expression of drug-induced bliss covers his face. ~She went that way.~ He points down a tunnel leading east."; } } else "The vagrant pushes ", (ItorThem) noun, " away. ~Don't want that. I want popcorn, you little shit. Popcorn.~"; ], before [; ShootAt: "Perhaps you should find some way of dealing with him that wouldn't draw so much attention."; ], number 0, each_turn [; if (self hasnt general) switch (random(6)) { 1: "^~Please,~ the vagrant rasps piteously, ~I need -- popcorn.~"; 2: "^The vagrant coughs repeatedly, each cough sounding worse and worse, ending in a sickly rattle."; 3,4: self.number++; switch (self.number) { 1: "^A burst of manic energy overtakes the vagrant, and he begins to sing. His singing is so abominable that at first you have difficulty placing the tune. Then you recognize it; it is the Quick-Pop advertising jingle. ~We all love Quick-Pop. / Once we start, we can't stop...~"; 2: "^The vagrant starts to sing again. ~When we need a snack / we just nuke a paaack...~"; default: print "^~We all love Quick-"; style underline; print "POP!"; style roman; print " Once we start, we can't "; style underline; print "STOP!"; style roman; "~"; } } ]; Object dead_vagrant "dead vagrant" with name 'dead' 'vagrant' 'body', author "two-star", descibe "^The shriveled up body of the vagrant is lying on its side next to a minichapel.", description "The body's skin is wrinkled and desiccated. There's a corner of paper sticking out of his back pocket.", before [; Take: "Since there don't seem to have been any witnesses, carrying around a body would seem to be your best chance of being caught."; Push, Pull, Touch: "You don't know if that poison can be transmitted by contact, and you don't want to find out."; Search: if (city_map hasnt moved) <>; ]; Object city_map "hand drawn map" monorail_terminus has concealed, with name 'paper' 'map' 'hand' 'drawn' 'corner' 'back' 'pocket', author "two-star", description [; if (self hasnt moved) "All you can see is a folded corner of paper sticking out of the vagrant's back pocket."; else monorail_terminus.open_the_east(); "Some of the tunnels of the city are drawn in pen on the sheet. The monorail terminus is marked with a heptagram, and the nearest point of interest to it that is shown is the Bitterenders' Community Center, a few blocks to the east. It sounds like a good place to start looking for answers. "; ], before [; Take: if (TestScope(sick_vagrant)) "You try to sneak up behind the man and take the corner of paper out of his pocket, but he notices. ~What the hell are you trying to do, man? Get away from me, you freak.~"; ], after [; Take: if (self hasnt moved) "You pull the corner of paper out of the dead vagrant's back pocket, taking care to avoid touching his skin anywhere. It appears to be a hand drawn map."; ];