! -*-mode: Fundamental; tab-width: 4; -*- Constant Story "Bane of the Builders"; Constant Headline "^An Interactive Short Story^ Copyright (c) 2001 by Bogdan Baliuc^"; Release 6; Constant MAX_SCORE = 100; Constant OBJECT_SCORE = 10; Constant ROOM_SCORE = 10; Include "Parser"; Include "VerbLib"; ! Properties Property left_to; Property right_to; Property forward_to; Property back_to; ! Globals Global fMazeCreated; Array maze --> 25; Array cellstack --> 25; Array nblist --> 4; Array cellvisited --> 25; Global mazedir; Global cityState; Array MyName --> 50; Array MySurname --> 50; Array name_array -> 53; Array parse_array -> 14; ! Classes Class IrisDoor with name 'iris' 'door', description [; print "An iris shaped door, large enough for two people to pass through."; if(self has open) " The iris is open and there's a small slot to its side on the wall."; " The iris is closed and there's a small slot to its side on the wall."; ], before [; Open: if(self has open) "The iris door is already open."; else "You push, pull and kick the door, but you fail to open it."; Close: if(self has open) { give labdoor ~open; give prisondoor ~open; "You insert the card into the slot and the iris door closes."; } else "The iris door is already closed."; ], has door openable scenery static; Class MazeRoom(25) with openings (-1) (-1) (-1) (-1), short_name "Sewer", description [i d nbptr; print "You are in a small, almost cubical compartment, whose corners and edges have been rounded. Round hatches, made from some sort of plastic are placed on all four walls"; if (self.u_to == CityE) print " and faint light filters down from an opening above"; print ". "; nbptr = 0; for(i = 0: i < 4: ++i) if((self.&openings)-->i ~= -1) nblist-->(nbptr++) = i; if(nbptr == 1) print "The hatch "; else print "Hatches "; for(i=0: i < nbptr-1: ++i) { d = ((nblist-->i) - mazedir + 4)%4; if(i>0) print ", "; switch(d) { 0: print "forward"; 1: print "to your right"; 2: print "to your back"; 3: print "to your left"; } } if(nbptr>1) print " and "; d = ((nblist-->(nbptr-1)) - mazedir + 4)%4; switch(d) { 0: print "forward"; 1: print "to your right"; 2: print "to your back"; 3: print "to your left"; } if(nbptr == 1) print " is "; else print " are "; "open."; ], d_to "You can't go that way.", u_to "You can't go that way.", left_to [d o; d = (mazedir+3)%4; o = (self.&openings)-->d; if(o > -1) { mazedir = d; give self ~visited; return(maze-->o); } else "That hatch is closed."; ], right_to [d o; d = (mazedir+1)%4; o = (self.&openings)-->d; if(o > -1) { mazedir = d; give self ~visited; return(maze-->o); } else "That hatch is closed."; ], back_to [d o; d = (mazedir+2)%4; o = (self.&openings)-->d; if(o > -1) { mazedir = d; give self ~visited; return(maze-->o); } else "That hatch is closed."; ], forward_to [d o; d = mazedir; o = (self.&openings)-->d; if(o > -1) { mazedir = d; give self ~visited; return(maze-->o); } else "That hatch is closed."; ], cant_go "You don't know which direction is which in this maze of pipes. You can only try to go 'left', 'right', 'back' and 'forward'."; Class Slot with number 0, description [; print "It's small square slot, "; if(child(self) == nothing) "currently empty."; print "containing a "; if(child(self).square) print "black"; else print "white"; " square."; ], before [; Receive: if(child(self) ~= nothing) "There's already something in ", (the) self, "."; if(noun provides square) rfalse; print_ret (The) noun, " doesn't fit in the slot."; Shoot: blaster.charges--; remove panel; move melted_panel to real_location; "You shoot at the panel, melting all the circuitry."; ], has static container open; Class WhiteSquare with name 'white' 'square' 'squares//p', short_name "white square", plural "white squares", square 0, description "A small white square, made from an unknown metal.", before [; Shoot: remove self; blaster.charges--; "You shoot the small square, melting it."; ]; Class BlackSquare with name 'black' 'square' 'squares//p', short_name "black square", plural "black squares", square 1, description "A small black square, made from an unknown metal.", before [; Shoot: remove self; blaster.charges--; "You shoot the small square, melting it."; ]; Class ElevatorButton with contact [a b c; a = panel.slots(self.number*2); b = panel.slots(self.number*2+1); c = 0; if(child(a) == nothing || child(b) == nothing) return(-1); if(child(b).square) c++; if(child(a).square) c = c + 2; return(c); ], description [; print "A circular light, resembling a button. It's glowing "; if(self.contact() == Elevator.number) "dimly."; "brightly."; ], before [x; Shoot: blaster.charges--; remove panel; move melted_panel to real_location; "You shoot at the panel, melting all the circuitry."; Push, Touch: x = self.contact() - 1; if(x < 0) "You touch the button, but nothing happens."; print "As you touch the button, you feel a slight tingle in the tip of your finger. "; if(x == Elevator.number) "Nothing else happens."; print "The circular wall suddenly grows, covering the opening"; if(Elevator.number == 1) print "s as if they"; else print " as if it"; print " never existed. You feel like you're "; if(x > Elevator.number) print "descending"; else print "ascending"; Elevator.number = x; print " with great speed. Finally you lurch to a halt and "; switch(x) { 0: Elevator.n_to = Cave; Elevator.s_to = nothing; Elevator.e_to = nothing; Elevator.w_to = nothing; "a portion of the wall dissolves, revealing an opening to the north."; 1: Elevator.n_to = nothing; Elevator.s_to = nothing; Elevator.w_to = CityW; Elevator.e_to = CityE; "portions of the wall dissolve, revealing openings to the east and west."; 2: Elevator.n_to = nothing; Elevator.s_to = nothing; Elevator.w_to = ControlRoom; Elevator.e_to = nothing; "a portion of the wall dissolves, revealing an opening to the west."; } ], has scenery; ! Compass CompassDirection left_obj "left hatch" compass with name 'left' 'hatch' 'wall', parse_name [n; if ((real_location provides openings) || (real_location == Ship)) { while(NextWord() == 'left' or 'hatch' or 'wall') n++; return(n); } return(0); ], description [; return(HatchDesc(3)); ], before [; Close: if(real_location == Ship) "There's no need to close the hatch now."; return(HatchClose(3)); Open: if(real_location == Ship) "The exit hatch is already open."; return(HatchOpen(3)); Shoot: return(ShootWall(3)); ], door_dir left_to; CompassDirection right_obj "right hatch" compass with name 'right' 'hatch' 'wall', parse_name [n; if (real_location provides openings) { while(NextWord() == 'right' or 'hatch' or 'wall') n++; return(n); } return(0); ], description [; return(HatchDesc(1)); ], before [; Open: return(HatchOpen(1)); Close: return(HatchClose(1)); Shoot: return(ShootWall(1)); ], door_dir right_to; CompassDirection back_obj "back hatch" compass with name 'back' 'aft' 'hatch' 'wall', parse_name [n; if (real_location provides openings) { while(NextWord() == 'back' or 'aft' or 'hatch' or 'wall') n++; return(n); } return(0); ], description [; return(HatchDesc(2)); ], before [; Open: return(HatchOpen(2)); Close: return(HatchClose(2)); Shoot: return(ShootWall(2)); ], door_dir back_to; CompassDirection forward_obj "forward hatch" compass with name 'forward' 'fore' 'ahead' 'hatch' 'wall', parse_name [n; if (real_location provides openings) { while(NextWord() == 'forward' or 'fore' or 'ahead' or 'hatch' or 'wall') n++; return(n); } return(0); ], description [; return(HatchDesc(0)); ], before [; Open: return(HatchOpen(0)); Close: return(HatchClose(0)); Shoot: return(ShootWall(0)); ], door_dir forward_to; ! Object tree Object City "City Daemon Object" with number 0, daemon [; if(cityState < 4) { if(self.number > 4) { self.number = 0; ChangeCity(); } } else StopDaemon(self); ]; Object goggles "pair of goggles" with name 'pair' 'goggles' 'glasses', description "A pair of goggles, with dark lenses.", has clothing; Object bluecloth "blue cloth" with name 'blue' 'cloth', initial "A piece of worn blue cloth is laying on the bottom of the pipe.", description "It's a piece of blue cloth, the color faded by time.", after [; Examine, Search: if(keycard in self) { move keycard to real_location; "As you search the blue cloth, something shiny drops from it."; } Shoot: remove self; blaster.charges--; "You quickly reduce the piece of cloth to ashes."; Wear: give bluecloth worn; "You wrap the piece of cloth around your hand."; ], has clothing; Object -> keycard "metal rectangle" with name 'metal' 'rectangle' 'card' 'keycard', initial "A shiny metal rectangle has fallen from the cloth.", description "It's a small metal rectangle, resembling a credit card. It has various indentations on both sides.", has scored; Object Crater "Bottom of Crater" with description "While from orbit it looked like a meteor crater, once you've landed it became clear it's artificial in origin. Time and weather had left their imprints, but the crater still looks like a perfect bowl, the flat bottom curving smoothly upwards until it becomes almost vertical. The small shuttle that brought you here from orbit is standing in the middle of the crater, waiting for you.^To the south, a black rectangle marks the entrance to the tunnel the Professor vanished in hours ago.", in_to Ship, n_to Ship, s_to entrance, d_to entrance, out_to "You are already outside!", cant_go "The walls of the crater are too smooth to climb.", after [; Go: ! Create the maze here, instead of Initialise, ! giving the player a chance to type 'random' first if(~~fMazeCreated) { fMazeCreated = 1; CreateMaze(); } ], has light; Object -> shuttleView "shuttle" with name 'shuttle' 'ship' 'spaceship', description "It's your shuttle. You know every dent on the hull and circuit inside her by heart.", has scenery static; Object -> entrance "entrance" with name 'entrance' 'black' 'rectangle' 'dark' 'doorway', description "It's a dark doorway cut into the smooth stone of the crater. Sensors scan from orbit show that behind it is a tunnel that descends steeply.", door_to Tunnel, door_dir d_to, has scenery static door open; Object Ship "Shuttle" with name 'array' 'controls' 'hatch', description "It's a standard G-12 model shuttle, able to carry two people and their equipment from orbit to the surface of a planet and back. On the left side, the pilot seat in front and the passenger behind it take up most of the space. On the right side, a storage bin leaves only a narrow lane on the center, allowing access to the seats. The exit hatch is to your left, facing south.", out_to Crater, s_to Crater, left_to Crater, has light; Object -> pilotseat "pilot seat" with name 'pilot' 'front' 'seat' 'seats' 'chair' 'chairs', description "That's the place where you spent endless hours during the flight. An array of controls is lined up in front of it.", before [; Shoot: "Careful, you don't want to start a fire in the shuttle"; ], has scenery static supporter enterable; Object -> passengerseat "passenger seat" with name 'passenger' 'back' 'rear' 'seat' 'seats' 'chair' 'chairs', description "This is where your cargo usually sits. In this case, the Professor, if you manage to find him in one piece.", before [; Shoot: "Careful, you don't want to start a fire in the shuttle"; ], after [; Examine: if (blaster has concealed) { print "The professor seems to have forgotten his blaster."; give blaster ~concealed; } Enter: if (blaster has concealed) { print "You hit something hard as you sit. The Professor has forgotten his blaster."; give blaster ~concealed; rtrue; } ], has scenery static supporter enterable; Object -> blaster "blaster" with name 'gun' 'plasma' 'blaster', charges 25, setting 1, initial "A blaster lies on the passenger seat.", description [; print "It's a military blaster, a gun that shoots a thin stream of hot plasma. While not powerful enough to melt metal, it's still a devastating weapon at close range. The blaster is currently set to "; if(self.setting) print "kill"; else print "stun"; print " and the power meter is "; if(self.charges>10) "green."; if(self.charges>3) "yellow."; if(self.charges>0) "red."; "dark."; ], before [; Shoot: "That's an interesting idea..."; SetTo: switch(second) { 'stun': self.setting = 0; "You adjust the blaster power level to ~stun~."; 'kill': self.setting = 1; "You adjust the blaster power level to ~kill~."; default: "You can only set your blaster to ~stun~ or ~kill~."; } ], has concealed scored; Object -> storagebin "storage bin" with name 'storage' 'bin' 'container', description [; print "This is where you store everything that's not bolted down during the flight. The Professor removed all the scientific equipment before he left. The bin is "; if(self has open) "open."; "closed."; ], before [; Shoot: "You don't really want to start a fire in the shuttle."; ], has scenery container openable; Object -> -> flashlight "atomic flashlight" with name 'flashlight' 'atomic', description "A standard issue atomic flashlight. It will still provide light long after you've turned to dust.", before [; Shoot: print "The flashlight is Navy issue. The blaster can't melt it"; if(flashlight in player) { move flashlight to real_location; move blaster to real_location; ", but it burns your hand and you drop both."; } print "."; rfalse; ], after [; SwitchOn: give self light; SwitchOff: give self ~light; Take: give self ~concealed; ], has switchable; Object Tunnel "Tunnel" with description "You're in a dark tunnel that steadily descends for several hundred meters in a straight line. The walls are made from the same grayish smooth stone as the crater. To the north, you can see a faint light marking the exit to the surface. The tunnel continues toward the south and deeper into the ground.", n_to Crater, s_to Tunnel2, u_to Crater, d_to Tunnel2; Object -> walls "walls" with name 'wall' 'walls' 'floor' 'ceiling', description "The tunnel is made from the same gray stone as the crater.", before [; Shoot: blaster.charges--; "You shoot randomly at the tunnel walls but nothing happens."; ], has scenery static; Object Tunnel2 "Window" with description "The tunnel continues its steep descent, but it's no longer dark. The west wall is made from some sort of transparent material that lets in a glow from the cave beyond. The cave is huge, its walls stretching out of sight. Three disks seem suspended in the center, stacked one above the other, each a few hundred meters in diameter.", n_to Tunnel, u_to Tunnel, s_to Cave, d_to Cave, cant_go "The tunnel stretches in a north-south direction.", has light; Object -> window "window" with name 'west' 'wall' 'window' 'cave' 'disk' 'disks' 'top' 'bottom' 'middle', description "Through the window you can see three disks of the same size suspended in the middle of a huge cave. A metallic bridge leads away from the topmost disk, out of sight and you can see some colors shifting on the top of the second one. The third disk is almost entirely covered by the second, so you can't make out anything about it.", before [; Attack: "You hit the window until you get tired, but you can't even see a scratch on it after your efforts."; Shoot: blaster.charges--; "As the plasma arc touches the window, it reflects, sizzling on the wall near you. That was close!"; ], has scenery static; Object Cave "Cave" with description "The tunnel ends abruptly here, leaving you on a narrow metal bridge that extends south above the topmost disk toward a shiny cylinder at its center. Bright white light escapes from under the disk, giving the cave an eerie glow.", n_to Tunnel2, u_to Tunnel2, s_to Elevator, d_to Elevator, has light; Object -> bridge "bridge" with name 'metal' 'bridge' 'railing' 'railings', description "It's a narrow bridge, just wide enough for you to walk unhindered. It's made from some sort of metal and despite its apparent fragility it feels rock solid under your feet. Safety railings run across its length, on both sides, reaching up to your chest in height.", before [; Shoot: blaster.charges--; if(blaster.setting) { deadflag = 1; "You aim at the bridge under your feet and squeeze the trigger. Nothing happens at first, but then the metal turns slowly red and with a terrible noise it breaks, dropping you into the darkness below."; } "You aim at the bridge under your feet and squeeze the trigger. The metal turns slightly red, where the discharge hits the metal, but it has no other effect."; ], has scenery static; Object -> disk2 with name 'disk' 'top' 'topmost' 'cave', description "Looking down is not a good a idea, although the railings on the bridge prevent you from falling. The top disk obscures the others and is surrounded by a thin halo of light.", has scenery static; Object Elevator "Cylinder" with number 0, description [; print "You're in a metallic cylinder, about ten meters tall and thirty in diameter. "; if(panel in Elevator) { if(panel has open) print "A small panel on the wall is open and "; else print "A small panel with three lighted buttons is on the wall and "; switch(self.number) { 0: "a rectangular opening to the north reveals a metallic bridge."; 1: "rectangular openings to the east and west lead to well-lighted areas."; 2: "a rectangular opening to the west leads into darkness."; default: "you just found a bug!"; } } rtrue; ], n_to Cave, s_to nothing, e_to nothing, w_to nothing, has light; Object -> buttons "buttons" with name 'lights' 'buttons', description "Three yellow glowing buttons, placed vertically.", has scenery static; Object -> panel "panel" with name 'panel' 'controls' 'circuitry' 'slots', slots [nr; switch(nr) { 0: return(slot1); 1: return(slot2); 2: return(slot3); 3: return(slot4); 4: return(slot5); } return(slot6); ], description [i haveblack havewhite; if(self has open) { print "Behind the panel you can see three contacts, corresponding to the position of the three buttons. Each contact leads to two slots to the right, in an array of six slots. The slots "; haveblack = 0; havewhite = 0; for(i = 0: i < 6: ++i) if(child(self.slots(i)) ~= nothing) if(child(self.slots(i)).square) haveblack = 1; else havewhite = 1; if((~~haveblack) && (~~havewhite)) print "are empty."; else if(haveblack && havewhite) print "contain white and black metal squares."; else if(haveblack) print "contain some black squares."; else print "contain some white squares."; font off; print "^^ +---+^"; for(i = 0: i < 6: ++i) { if(child(self.slots(i)) == nothing) print " ! !^"; else if(child(self.slots(i)).square) print " ! B !^"; else print " ! W !^"; if(i % 2) print " +---+^"; } font on; rtrue; } "It's a rectangular panel, etched in the surface of the cylinder. Three lights, resembling buttons, are placed vertically on it."; ], before [; Pull: <>; Push: <>; Shoot: blaster.charges--; remove panel; remove elButton1; remove elButton2; remove elButton3; move melted_panel to location; "You shoot at the panel, melting all the circuitry."; Receive: "In which slot do you want to insert ", (the) noun, "?"; ], after [; Open: give self transparent; remove elButton1; remove elButton2; remove elButton3; remove buttons; "You grip the edge of the panel firmly with your fingers and pull. It opens to one side, revealing the circuitry behind."; Close: give self ~transparent; move buttons to location; move elButton3 to location; move elButton2 to location; move elButton1 to location; "You push the panel back in its place."; ], has scenery container openable; Slot -> -> slot1 "first slot" with name 'first' 'slot' '1//' 'row' 'top'; WhiteSquare -> -> ->; Slot -> -> slot2 "second slot" with name 'second' 'slot' '2//' 'row'; BlackSquare -> -> ->; Slot -> -> slot3 "third slot" with name 'third' 'slot' '3//' 'row'; BlackSquare -> -> ->; Slot -> -> slot4 "fourth slot" with name 'fourth' 'slot' '4//' 'row'; WhiteSquare -> -> ->; Slot -> -> slot5 "fifth slot" with name 'fifth' 'slot' '5//' 'row'; Slot -> -> slot6 "sixth slot" with name 'sixth' 'slot' '6//' 'row'; BlackSquare -> -> ->; ElevatorButton -> elButton1 "top button" with name 'first' 'top' 'topmost' 'button' 'light' '1//', number 0; ElevatorButton -> elButton2 "middle button" with name 'second' 'middle' 'button' 'light' '2//', number 1; ElevatorButton -> elButton3 "bottom button" with name 'third' 'bottom' 'button' 'light' '3//', number 2; Object melted_panel "panel" with name 'panel' 'controls' 'circuitry' 'slots', initial "The melted remains of a control panel are on the wall.", description "It once was a control panel, but it's now melted beyond recognition.", before [; Open: "That's not something you can open anymore."; Close: "That's not something you can close anymore."; Shoot: "You've already caused enough damage to the panel."; ], has static; Object alien "alien" with name 'being' 'beings' 'alien' 'aliens' 'image' 'images' 'humanoid' 'humanoids', found_in CityN CityE CityS CityW Lab Library School, parse_name [ n; if(cityState == 0 or 1 or 2) { while(NextWord() == 'alien' or 'aliens' or 'being' or 'beings' or 'image' or 'images' or 'humanoid' or 'humanoids') n++; return(n); } return(0); ], description "Those must be the Builders! Humanoid in shape, their skin has a translucent quality and they have big black eyes without a visible iris. As you take a better look at them you realize that they are half-transparent.", before [; Push, Pull, Touch, Attack, Take, Search: "You try to grab one of the passerby but your hand passes through it as if it was just an illusion. The alien ignores you."; Taste, Kiss: "Spotting a particularly good looking alien you step in front of it and open your mouth for a kiss. The alien passes through you, unabashed."; Wave, WaveHands, Ask, Order: "Despite your efforts to be noticed, the aliens completely ignore you."; Shoot: blaster.charges--; "You point your blaster at an alien and shoot. The plasma arc passes through it without any noticeable effect."; ], has scenery animate; Object bodies "bodies" with name 'alien' 'aliens' 'being' 'beings' 'body' 'bodies', found_in CityW CityN CityE Library Lab School, parse_name [ n; if(cityState ~= 3) return(0); if(real_location == CityE) while(NextWord() == 'alien' or 'being' or 'body') n++; else while(NextWord() == 'alien' or 'aliens' or 'being' or 'beings' or 'body' or 'bodies') n++; return(n); ], description [; if(real_location == CityE) "The alien look dead."; "The alien bodies look dead."; ], before [; Push, Pull, Touch, Attack, Take, Search: print "You kneel by "; if(real_location == CityE) print "the"; else print "an"; " alien body and try to grab something, but your hand passes through it."; Taste, Kiss: "A dead alien body?"; Wave, WaveHands, Ask, Order: "Nobody alive seems to be here."; Shoot: blaster.charges--; "You point your blaster at a body and shoot. The plasma arc passes through it without any noticeable effect."; ], has scenery static; Object vehicle "vehicle" with name 'vehicle' 'vehicles' 'car' 'cars', found_in CityN CityS CityW, parse_name [n; if(cityState < 3) { while(NextWord() == 'vehicle' or 'vehicles' or 'car' or 'cars') n++; return(n); } if((cityState == 4) && (real_location == CityW)) { while(NextWord() == 'vehicle' or 'car' or 'wreckage') n++; return(n); } return(0); ], description [; if(cityState < 3) "The alien vehicles resemble small parallelepipeds, floating above the ground."; "The vehicle might have once been parallelepipedical in shape, but it's now deformed and charred beyond recognition."; ], before [; Wave, WaveHands, Ask, Order: "Despite your efforts to be noticed, the aliens completely ignore you."; Shoot: blaster.charges--; "You point your blaster at a vehicle and shoot. The plasma arc passes through it without any noticeable effect."; ], has scenery static; Object archbridge "metal bridge" with name 'metal' 'bridge' 'bridges', found_in CityN CityE CityS CityW, description "Two wide metal bridges are leading toward other sections.", has scenery static; Object bigscreen "big screen" with name 'big' 'screen' 'display' 'tv', found_in CityE CityS CityW, parse_name [n; if(cityState == 1) { while(NextWord() == 'big' or 'screen' or 'display' or 'tv') n++; return(n); } return(0); ], description "On the big screen you can see a scene from a laboratory. Aliens dressed in blue suits, wearing protection goggles are scrambling in panic as a black mist pours out from a broken bell shaped transparent case. The scene is replayed again and again.", has scenery static; Object cylinder "metallic cylinder" with name 'metallic' 'cylinder' 'elevator', found_in CityN CityE CityS CityW, description [; print "A smooth metallic cylinder raises from floor straight up into the light above"; if(location == CityN or CityS) ", but there's no opening in it."; ". There's an opening in it."; ], has scenery static; Object CityW "Square" with description [; switch(cityState) { 0: print "The scene in front of you vaguely resembles a busy square on Earth at noon. You're sitting in a large triangular area, bustling with activity. Tall, thin beings, dressed in all the colors of the rainbow walk around leisurely or in small floating vehicles. Pastel pink, bright yellow, light green; there are as many colors as people, shining brightly in the light that comes from the disk above, giving the impression that you're in a city on the surface of the planet, not deep underground. The people walk, or run or stand, they come and go from the building to the west, they go over the bridges to northeast and southeast, all without paying any attention to you."; 1: print "The scene in front of you vaguely resembles a busy square on Earth at noon. You're sitting in a large triangular area, delimited by a low building to the west and bridges to northeast and southeast. Tall, thin beings, dressed in a mix of bright colors are walking on foot or traveling in small floating vehicles. Most of them, though, are gathered outside the building where some sort of screen or giant TV has been placed, watching intently. As usual, nobody pays you any attention."; 2: print "The street in front of you is almost deserted. A few tall, vaguely humanoid creatures are entering or leaving a building to the west and a couple of small vehicles speed by. Bridges are leaving this area to the northeast and southeast. As you are watching, one of the aliens, dressed in the same bright colors as the rest, but surrounded by strange black aura starts hitting another until the second drops to the ground."; ChangeCity(); rtrue; 3: print "A few alien bodies are lining the floor in front of a low building to the west. Their colorful clothes are torn and covered with a green fluid that seems spread everywhere. A blackened vehicle lies crushed against a pillar of the northeast bridge. Nothing moves."; default: print "You're standing on a metal platform, triangular in shape, extending to the edge of the disk in west. Just at the edge is a low white building and metal bridges link it to other platforms, to northeast and southeast."; } "^To the east, there is a metallic cylinder, raising up out of sight into the light. There's an opening in it."; ], ne_to CityN, se_to CityS, e_to Elevator, w_to Library, has light; Object -> buildingW "low building" with name 'low' 'building' 'entrance', description [; print "A long, low building occupies the western part of this section. It has no visible windows or other openings that you can see, except for an entrance in the middle that seems to be open."; if(cityState < 3) print " Alien beings come and go, ignoring you."; rtrue; ], before [; Shoot: "Shooting at the building won't accomplish anything."; Enter: PlayerTo(Library); rtrue; ], has scenery static; Object CityE "Park" with description [; switch(cityState) { 0: print "A few steps away from you, the metal floor of this large triangular platform becomes covered with grass. Tall, thin beings, dressed in all the colors of the rainbow, walk leisurely or sit around what looks like a round pool. A couple of smaller aliens (children?) stand in front of each other, throwing and catching some colored disks. Metal bridges arch gracefully to other areas to northwest and southwest. Nobody is paying any attention to you."; 1: print "A few steps away from you, the metal floor of this large triangular platform becomes covered with grass. Tall, thin beings, dressed in a mix of colors are sitting by a round pool watching intently a big screen that has been erected on the other side of it. As usual, you are completely ignored."; 2: print "A few steps away from you, the metal floor of this large triangular platform becomes covered with grass. A couple of small aliens seem to be playing by a round pool and a bigger one is watching them. Suddenly, one of the smaller beings is surrounded by a black aura, like a mist and it rushes at the other, throwing it into the pool."; ChangeCity(); rtrue; 3: print "A few steps away from you, the metal floor of this large triangular platform becomes covered with grass. A single alien body lies face down by a round pool, with green fluid pouring from a torn limb. Everything is still."; default: print "A few steps away from you, the metal floor of this large triangular platform is lowered a few steps, then continues toward the edge of the disk. The only features are a round hole in the middle of the platform and metal bridges to northwest and southwest, leading to other platforms."; } "^To the west, there is a metallic cylinder, raising up out of sight into the light. There's an opening in it."; ], nw_to CityN, sw_to CityS, w_to Elevator, has light; Object -> grass "grass" with name 'grass', description "Looks just like ordinary grass.", before [; Touch, Take, Eat: "You bend down and try to pick a handful, but your hand passes right through it."; Shoot: blaster.charges--; "You shoot at the grass, but it doesn't burn, it doesn't sizzle. In fact, nothing happens to it"; ], has scenery static; Object -> pool "round pool" with name 'round' 'pool' 'water', description "It's a circular pool of water, about 20 meters across, in the middle of the park. When you look at it closer, the water shimmers oddly.", before [; Touch, Drink, Take: "As you try to touch the water surface, it doesn't feel wet at all. You cup your hand, but when you remove it from the pool, it's empty. The pool is just an illusion."; Shoot: blaster.charges--; "You shoot at the pool, but, oddly, the water doesn't boil. In fact, nothing happens."; Enter: <>; ], has scenery static; Object hole "round hole" with name 'round' 'hole', description "It's a circular hole, about 20 meters in diameter and 2 meters deep. It's walls are slightly inclined, which would allow you to climb in or out with some difficulty.", before [; Enter: print "You lower yourself down into the hole and carefully advance to the middle. Suddenly, the floor gives way under your feet and you fall...^^"; PlayerTo(maze-->14); rtrue; ], has scenery static; Object CityN "Guarded Area" with description [; switch(cityState) { 0: print "Tall, thin, almost human, alien beings dressed in all the colors of the rainbow walk from a bridge to the southeast to another one to southwest or viceversa. Small floating vehicles zip by. Nobody stops here, except a group of four aliens, dressed in white, who seem to guard the entrance into a building to the north. Everyone is ignoring you."; 1: print "In front of a building at the north end of this triangular area, alien beings have gathered. There are two groups and they seem to be arguing. One group is completely dressed in white and apparently tries to prevent the other from entering the building. Nobody pays you any attention."; 2: print "A group of alien beings dressed in white are guarding the entrance to a building to the north. They are carrying what look like hand weapons and are shooting at another alien surrounded by a black aura. As the alien falls to the ground, the black aura rises and wraps itself around one of the guardians, who immediately starts shooting at its colleagues."; ChangeCity(); rtrue; 3: print "White clad alien bodies are laying near the entrance of a building to the north. Metal bridges leave this triangular area to southwest and southeast. Everything is still."; default: print "You are in a large triangular area, delimited by metal bridges to the southeast and southwest and a low gray building to the north."; } "^To the south, there is a metallic cylinder, raising up out of sight into the light, but you can't see any opening in it."; ], se_to CityE, sw_to CityW, n_to Lab, has light; Object -> buildingN "low building" with name 'low' 'building' 'house', description "The building fills almost entirely the north side of the triangle. It has no windows, only a wide open doorway.", before [; Shoot: "Shooting at the building won't accomplish anything."; Enter: PlayerTo(Lab); rtrue; ], has scenery static; Object CityS "Quiet Area" with name 'pole', description [; switch(cityState) { 0: print "You are in a quiet triangular area, with metal bridges leading to other triangles to the northeast and northwest. Tall and thin, alien beings dressed in all the colors of the rainbow lead smaller aliens, presumably children toward a low building to the south. Nobody pays you any attention."; 1: print "You are in a quiet triangular area, with metal bridges leading to other triangles to the northeast and northwest. Tall and thin, alien beings dressed in all the colors of the rainbow are gathered around a big screen affixed on a pole, discussing in low, musical tones. You are completely ignored."; 2: print "Small alien beings are hurriedly leaving a low building to the south, joining taller aliens that are waiting for them. Large vehicles come and go and many wounded aliens are carried inside a building to the south."; ChangeCity(); rtrue; 3: print "You are in a quiet triangular area, with metal bridges leading to other triangles to the northeast and northwest. A long, low building lines the south side. Alien bodies are scattered on the ground and everything is still."; default: print "You are in a quiet triangular area, with metal bridges leading to other triangles to the northeast and northwest. A long, low building lines the south side."; } "^To the north, there is a metallic cylinder, raising up out of sight into the light, but you can't see any opening in it."; ], nw_to CityW, ne_to CityE, s_to School, has light; Object -> buildingS "low building" with name 'low' 'building' 'house', description "The building fills almost entirely the south side of the triangle. It has no windows, only a wide open doorway.", before [; Shoot: "Shooting at the building won't accomplish anything."; Enter: PlayerTo(School); rtrue; ], has scenery static; Object Library "Library" with description [; switch(cityState) { 0: print "This large room is divided into two sections. The northern section contains countless rows of shelves, delimiting aisles. Machines glide quietly in front of the shelves, retrieving or returning small cartridges. Alien beings are seated in the south section, manipulating devices with small screens. Everybody seems to ignore your presence."; 1: print "This large room is divided into two sections. The northern section countless rows of shelves, delimiting aisles. Machines glide quietly in front of the shelves, retrieving or returning small cartridges. Alien beings are seated in the south section, talking excitedly. Everybody ignores you."; 2: print "This large room is divided into two sections. A few aliens sit in the south side, intently studying the small screens in front of them. From between two shelves in the north area, another alien, surrounded by a black aura, throws an object toward the others and rushes by you toward the exit. A powerful explosion takes place in the south area, covering it from your view."; ChangeCity(); rtrue; 3: print "Wrecked machinery and alien bodies are lining the southern part of this room. In the northern part you can see a lot of collapsed shelves."; default: print "Wrecked machinery and alien bodies are lining the southern part of this room. In the north part you can see a lot of collapsed shelves."; } " You can leave the building through a door to the east."; ], e_to CityW, has light; Object -> shelves with name 'shelf' 'shelves', description [; if(cityState <= 2) "The shelves contain many cartridges, that are retrieved and replaced by some machines."; else "Most of the shelves have collapsed, burying some machinery under them. They look very unstable."; ], before [; Shoot: "Your blaster isn't nearly powerful enough to melt all that metal."; ], has scenery static; Object -> device "device" with name 'machinery' 'device' 'machine' 'machines' 'reader' 'slot' 'display' 'screen', description [; switch(cityState) { 0,1,2: "The devices in the southern part of the room are some sort of readers. Aliens insert small cartridges into them then watch the attached display. One of the devices seems unoccupied, its display dark."; default: "Most of the devices have been torn apart. Only one appears unharmed. It has a slot and a display. The display is dark."; } ], before [; Shoot: "And destroy a priceless piece of alien technology?"; Receive: if(noun == cartridge) { PlayMovie(); rtrue; } print_ret (The) noun, " doesn't fit in the machine."; SwitchOn: "There's no obvious way to turn the device on."; SwitchOff: "Looks like it's already off. At least, the screen is dark."; ], has scenery static; Object Lab "Lab" with description [; switch(cityState) { 0: print "Metal tables line the east and west walls of this room. Aliens dressed in blue tunics swarm back and forth, taking, showing things to each other, but mostly examining a tall glass case in the center of the room, that contains a black swirling mist. Two white-clad aliens are guarding a door to the north. You are completely ignored."; 1: print "Metal tables line the east and west walls of this room. Aliens dressed in blue tunics run back and forth in panic as a black swirling mist spreads forth from a broken glass case in the center of the room. Two white-clad aliens are guarding a door to the north. Nobody is paying you any attention."; 2: print "Metal tables line the east and west walls of this room. Aliens dressed in blue tunics run in panic around a broken glass case in the middle of the room. As you watch, a black shadow engulfs one of the two white clad aliens that were guarding a door to the north. Immediately, it starts shooting at the other aliens."; ChangeCity(); rtrue; 3: print "Metal tables and alien bodies line the walls of this room. Most of the bodies have blue tunics, but one, lying in front of a door to the north, is dressed in white. A broken glass case sits in the middle of the room."; default: print "Metal tables line the walls of this room. A broken glass case sits in the middle and a door leads north."; } " The exit is to the south."; ], after [; Go: if(Prison.number==2) "The Professor runs after you, catching up after a few steps."; ], s_to CityN, n_to labdoor, has light; Object -> mist "black mist" with parse_name [n; if(cityState == 1) { while(NextWord() == 'black' or 'mist' or 'shadow') n++; return(n); } return(0); ], description "A black mist pours out of the broken case. The aliens seem to be desperate not to be touched by it.", has scenery static; IrisDoor -> labdoor "door" with door_to Prison, door_dir n_to; Object -> case "glass case" with name 'glass' 'case' 'box' 'bell', description [; if(~~cityState) "It's a bell-shaped, transparent case, almost as tall as you. It contains some sort of black gas or mist that swirls inside."; else "Originally, it was probably bell-shaped, but the case is now broken. Almost as tall as you, is made from a transparent material."; ], before [; Shoot: blaster.charges--; "You shoot the case and the beam reflects back, missing you by an inch. That was close!"; ], has scenery static; Object -> doorslot "small slot" with name 'small' 'slot', description "Judging by its dimensions you could insert in it something about the size of a credit card.", found_in Lab Prison, before [; Receive: if(noun == keycard) { print "As you insert the small rectangle into the slot, the iris door "; if(labdoor has open) { give labdoor ~open; give prisondoor ~open; "closes silently."; } else { give labdoor open; give prisondoor open; "opens silently."; } } print_ret (The) noun, " doesn't fit in the slot."; ], has container open scenery static; Object -> cartridge "cylindrical cartridge" with name 'cylinder' 'cylindrical' 'cartridge', initial "A small cylindrical cartridge glitters under a table.", description "It's a metallic cylinder, about two inches long. It has a small inset at one end, but you can't see any way of opening it."; Object Prison "Small Room" with number 0, description [; print "You're in a small room, divided in two by a transparent partition, made from the same material as the case in the lab. On your side of the partition, a switch is on the side wall and an iris shaped door leads back south. "; switch(self.number) { 0: "On the other side of the partition, you can see the Professor sitting on the floor, with his head propped on his knees."; 1: "On the other side of the partition, you can see the Professor, looking at you hopefully."; default: "A rectangular opening is in the middle of the partition."; } ], daemon [; switch(self.number) { 0,1: if(prisonwall has open) { self.number = 2; if(goggles has worn) print "You see the black shadow crawling up the Professor's leg and wrapping around him. "; "As the wall slides open, the Professor pulls a long, gleaming knife out of somewhere and runs straight for you!"; } 2: if(~~Professor.status) { deadflag = 1; self.number = 4; "^^With a shout of triumph, the Professor plunges his knife deep in your chest. As you fall down, the last thing you notice is the black aura shifting around him.^The Bane that possesses him is finally free to destroy the mankind just as it destroyed the Builders."; } move shadow to location; print "As the Professor falls, you can "; if(goggles has worn) print "see a black mist"; else print "feel an alien presence"; print " raising from his body and wrapping itself around you. "; if(belt has worn) { self.number = 3; "Your belt suddenly radiates a bright white light and the alien presence recoils away from you."; } return(TakeOverMe()); 3: if((belt has worn) && (--belt.charges > 0)) { if(prisondoor has open) { self.number = 6; deadflag = 3; if(goggles has worn) print "You can see the black shadow seeping out through the open iris door."; else print "You feel the alien presence leaving."; if(Professor.status == 1) print "You wait until the Professor recovers"; else print "You gather the Professor's body"; " and then proceed back to the surface. When you approach the mothership, nobody answers your hails. ^You dock, open the airlock and manage to get a glimpse of the docking bay covered in blood before a shot kills you. The Bane eventually conquers the ship and finds its way to Earth."; } if(shadow.position && (prisonwall hasnt open)) { print "^You have trapped the Bane!^^^"; score = score + 20; deadflag = 2; self.number = 7; WinBlurb(Professor.status); rtrue; } if(goggles has worn) { print "^The black shadow recoils, moving "; if(prisonwall has open) shadow.position = ~~shadow.position; if(shadow.position) "to the far side of the transparent wall."; "in circles by the iris door."; } "^You can feel the alien presence moving around you, but you can't locate it."; } if(goggles has worn) print "The alien presence"; else print "The black shadow"; print " wraps around you once again"; if(belt has worn) print " but this time the belt fails to create its protective shield."; else print " and you no longer have the protection of the white belt."; return(TakeOverMe()); } ], s_to prisondoor, has light scored; IrisDoor -> prisondoor "door" with door_dir s_to, door_to Lab; Object -> prisonwall "transparent wall" with name 'transparent' 'wall' 'partition', description [; print "A transparent wall divides the room in two halves"; if(self has open) print ". It's currently open"; "."; ], before [; Shoot: blaster.charges--; "You shoot at the wall and the discharge is reflected back, passing you by a hair. That was close!"; ], has scenery static; Object -> switch "switch" with name 'switch' 'lever' 'button', description "A small switch is embedded into the wall, on your side of the transparent partition.", before [; Pull: if(prisonwall has open) "That's as far as it would go."; give prisonwall open; "You flip the switch and a portion of the transparent wall slides to one side."; Push: if(prisonwall has open) { give prisonwall ~open; "You flip the switch and the transparent wall slides back, covering the opening."; } "That's as far as it would go."; SwitchOn, SwitchOff: if(prisonwall has open) { give prisonwall ~open; "You flip the switch and the transparent wall slides back, covering the opening."; } else { give prisonwall open; "You flip the switch and a portion of the transparent wall slides to one side."; } ], has scenery static; Object -> Professor "Professor" with name 'prof' 'professor', status 0, spoken 0, description [; print "The Professor is a short, plump man, with white hair and bright blue eyes. He looks like he could use a good night's sleep, but otherwise unharmed"; if(goggles has worn) print ". Some sort of black mist or shadow is coiling by his feet"; "."; ], before [; Attack, Give, Kiss, Touch, Take: if(Prison.number == 0 or 1) "You can't reach the Professor."; if(~~self.status) "The Professor overpowers you with ease. You never thought he was that strong."; "The Professor is already down. Don't bother with him."; Shoot: if(Prison.number == 0 or 1) { blaster.charges--; "You shoot at the wall and the discharge is reflected back, missing you by a hair. That was close!"; } if(self.status) "He's no danger to you at the moment."; blaster.charges--; print "Quick as lightning, you reach for your blaster and shoot at the Professor. "; if(bluecloth has worn) "Unfortunately, your aim is not as sure as usual due to the cloth you have wrapped around your hand and you miss him."; if(blaster.setting) { self.status = 2; "The blaster burns a gaping hole in his chest and he crumples to the ground."; } self.status = 1; score = score + 10; "The discharge hits him squarely in the chest and knocks him unconscious."; ], life [; Show: if(self.status == 1) "The Professor is out cold."; if(self.status == 2) "The Professor is dead."; if(~~Prison.number) "The Professor seems unaware of your presence."; if(Prison.number ~= 1) rfalse; if(noun == blaster) "The Professor shakes his head. ~I don't think shooting it down is a good idea. I might end up dead.~"; if(noun == keycard) "~Hmm... if I can read the markings right, this is the Builder equivalent of an access card.~"; if(noun == flashlight) "~It's a flashlight. What about it?~"; if(noun provides square) "~It's an electronic component of some sort. If you open the wall, I'll gladly analyse it.~"; return(self.sayHurry()); WakeOther: switch(self.status) { 1: "Better get the situation under control before risking to wake him up."; 2: "He'll never wake up again."; default: if(~~Prison.number) { print "You knock on the wall. "; return(self.sayOpening()); } "He seems alert enough."; } Ask, Answer, Order, Tell: if(self.status == 1) "The Professor is out cold."; if(self.status == 2) "The Professor is dead."; switch(Prison.number) { 0: return(self.sayOpening()); 1: return(self.sayHurry()); default: "The Professor ignores you."; } Give: switch(self.status) { 1: "The Professor is out cold."; 2: "The Professor is dead."; default: if(Prison.number == 0 or 1) "You can't give him anything through the wall."; "He only seems interested in giving /you/ that knife!"; } ], sayOpening [; Prison.number = 1; "The Professor raises his head. ~", (NameArray) MyName, ", thank Space you're here~. His voice is faint, but it carries through the wall. ~I got locked behind this transparent wall. Get me out of here, will you? We have to get back to the ship.~"; ], sayHurry [; if(self.spoken) "The Professor doesn't say anything, just taps his foot impatiently, pointing at the switch on the wall."; self.spoken = 1; "The Professor waves his hand impatiently. ~We'll talk about this later, ", (NameArray) MyName, ". Now, please get me out of here. For one thing, I really need to find a bathroom.~"; ], has scenery animate; Object shadow "black shadow" with name 'black' 'mist' 'shadow' 'alien' 'presence', position 0, description [; if(goggles has worn) "A black mist is curling above the floor, sending shivers down your spine every time you look at it."; "You can feel an alien presence nearby, so cold that it makes your hair stand on end, but you can't see a thing."; ], before [; Attack, Take, Kiss, Touch, Shoot: "The alien presence is not exactly solid."; ], has scenery static; Object School with name 'screen' 'display', short_name "School", description [; switch(cityState) { 0: print "Twenty small alien beings are sitting on chairs, watching a larger one in front of the room. The larger alien is displaying some strange symbols on a screen behind it, pointing to some of then, then turning toward the smaller ones and apparently explaining something, then returns to the screen and starts over. Everybody ignores you."; 1: print "Twenty small alien beings are gathered in a circle around a larger one, watching it with utmost attention. The large alien seems to be explaining something, frequently pointing toward the exit. As usual, you are completely ignored."; 2: print "Rows upon rows of beds line this room. Alien beings, with their clothes torn, dirty and wounded, are on the beds, twitching restlessly. An alien dressed in blue is moving from bed to bed, talking with the others, wiping their heads and wounds. Nobody takes any notice of your presence."; ChangeCity(); rtrue; 3: print "Rows upon rows of beds line this room. Alien beings, with their clothes torn, dirty and wounded are on the beds, laying still."; default: print "This room resembles a hospital or an army barracks. Rows of beds fill the room, but they are all empty."; } " The exit is to the north."; ], n_to CityS, has light; Object -> bed "beds" with name 'bed' 'beds' 'bunk' 'bunks' 'table' 'tables', description "Flat metal surfaces propped on four legs. You could call them tables as well, but they're just the size and height that would allow you to lie down on one and rest.", before [; Enter: "It doesn't look especially comfortable and you have work to do."; Shoot: "The blaster won't melt the metal."; Search, LookUnder: if(parent(goggles) == nothing) { move goggles to player; score = score + 10; "You kneel on the floor and look under all beds. In a corner you find a pair of goggles, which you take in your hand."; } ], has scenery static supporter; Object ControlRoom "Control Room" with description "You're in a small room, whose walls are filled with multicolored lights. In the center there is a box, made from a transparent glass-like material. Near the box is a lever.", e_to Elevator, has scored; Object -> lights "lights" with name 'light' 'lights' 'control' 'controls', description "The walls are covered with lights of all colors, but you can't figure out their meanings.", has scenery static; Object -> glassbox "glass box" with name 'glass' 'transparent' 'box', description [; print "It's a transparent cube, made from a glass-like material"; if(belt in glassbox) print ". Inside the cube is a white belt"; "."; ], before [; Open: "You don't know how to open the box."; ], has scenery static container transparent; Object -> -> belt "white belt" with name 'white' 'belt', charges 5, description "A white belt, made from some rubbery material with a metallic white clasp.", after [; Wear: "As you close the metal clasp, you suddenly feel very alert."; Remove: "As you remove the belt, you feel weak and dizzy for a short moment."; ], has clothing scored; Object -> lever "lever" with name 'lever' 'switch', description "A metal lever, sticking out of the floor.", before [; Touch: if(~~(bluecloth has worn)) "As you touch the lever you feel an electric discharge. That hurt!"; Push: if(~~(bluecloth has worn)) <>; if(glassbox has open) "The lever won't budge."; "The lever is pushed as far as it would go."; Pull: if(~~(bluecloth has worn)) <>; if(glassbox has open) "The lever won't go any further."; give glassbox open; "With your hand wrapped in the cloth, you pull the lever toward you and the top of the box suddenly disappears."; ], has scenery static; ! Library entry points [ Initialise i; location = Ship; print "Do you want to restore a saved game? "; if(YesOrNo()) <>; print "New players can use the LICENSE or WARRANTY commands to see information about this program. At any point, type HELP for hints regarding your present location.^"; for(i = 0: ~~i:) { print "Enter your name ( ) [John Doe]: "; name_array->0 = 50; parse_array->0 = 3; read name_array parse_array; if(parse_array->1 == 2) i = 1; if(name_array->1 == 0) break; } if(i == 1) { MyName->0 = parse_array->4; for(i=0: i4: ++i) MyName->(i+1)=name_array->(parse_array->5 + i); MySurname->0 = parse_array->8; for(i=0: i8: ++i) MySurname->(i+1)=name_array->(parse_array->9 + i); } else { MyName->0=4; MyName->1='j'; MyName->2='o'; MyName->3='h'; MyName->4='n'; MySurname->0=3; MySurname->1='d'; MySurname->2='o'; MySurname->3='e'; } player.description = MyDesc; thedark.description = DarkDesc; notify_mode = 0; StartDaemon(Prison); StartDaemon(City); "^^^^^After years and years of moving from one lifeless planet to another, the Professor had finally seen his dream come true. The mysterious race known as the Builders had left many traces and artifacts throughout the galaxy, but mankind had never managed to find out why or how could a civilization that was spacefaring when we were still hiding in caves disappear. Now, on this planet, scans made from orbit detected the presence of an energy source.^ The foremost expert on the Builders civilization, the Professor, had descended to investigate. Since you are the only officer aboard who became quite friendly with him during your long voyage, he had asked you to fly him down. Your Captain couldn't have been happier. ^^But the Professor has been gone for almost 24 standard hours now and you lost radio contact the moment he had entered that tunnel in the face of the mountain. It might be time for the Navy to come to rescue...^^^"; ]; [ PrintRank; print ", earning you the rank of "; PrintRankName(); "."; ]; [ DeathMessage; print "You have failed"; ]; [ NewRoom; if(location == CityN or CityE or CityS or CityW or Lab or Library or School) { City.number = City.number + 1; } ]; [ DarkToDark l; l = random(25) - 1; real_location= maze-->l; mazedir = random(4) - 1; "You wander for a while in darkness."; ]; ! Local functions [ toupper c; if(c >= 'a' && c <= 'z') return(c - 'a' + 'A'); return(c); ]; [ NameArray str_array i; if(~~str_array->0) rtrue; print (char) toupper(str_array->1); for(i = 2: i<=str_array->0: ++i) print (char) str_array->i; ]; [ MyDesc; print "The one you see every morning in the mirror. You're wearing a blue Navy jumpsuit, with rank pips on your collar and a golden tag above your left breast: "; PrintRankName(); " ", (NameArray)MySurname, "."; ]; [ DarkDesc; if(real_location == Tunnel) "It is dark, the only light coming faintly from an opening to the north."; else if(real_location == maze-->14) "It is pitch dark, the only trace of light coming from an opening above."; "It is pitch dark and you can't see a thing."; ]; [ HatchDesc w d; if(real_location provides openings) { print "A round plastic hatch fixed in a metal frame on the wall. It looks just big enough for you to crawl through. The hatch is "; d = (mazedir+w)%4; if((real_location.&openings)-->d == -1) "closed."; "open."; } if(location == Ship) "Your way in and out of the shuttle."; "You don't see any such thing here."; ]; [ HatchOpen w d; d = (mazedir+w)%4; if((real_location.&openings)-->d == -1) "The hatch doesn't budge."; "It's already open."; ]; [ HatchClose w d; d = (mazedir+w)%4; if((real_location.&openings)-->d == -1) "The hatch is already closed."; "There's no need to close it."; ]; [ PrintRankName; if(score == 100) print "Captain"; else if(score >= 80) print "Commander"; else if(score >= 60) print "Lieutenant Commander"; else if(score >= 40) print "Lieutenant"; else if(score >= 20) print "Lieutenant junior"; else if(score >= 0) print "Ensign"; else print "Bane of Mankind"; ]; [ CreateMaze i ccell ncell nb cellptr nbptr total; for(i = 0: i < 25: ++i) { maze-->i = MazeRoom.create(); cellvisited-->i = 0; } ccell = random(25) - 1; cellvisited-->ccell = 1; cellptr = 0; total = 1; while(total < 25) { ! find neighbours nbptr = 0; if(ccell>=5 && ~~(cellvisited-->(ccell-5))) nblist-->(nbptr++) = ccell-5; if(ccell%5 < 4 && ~~(cellvisited-->(ccell+1))) nblist-->(nbptr++) = ccell+1; if(ccell<20 && ~~(cellvisited-->(ccell+5))) nblist-->(nbptr++) = ccell+5; if(ccell%5 > 0 && ~~(cellvisited-->(ccell-1))) nblist-->(nbptr++) = ccell-1; if(nbptr > 0) { nb = random(nbptr) - 1; ncell = nblist-->nb; if(ncell == ccell - 5) { ((maze-->ccell).&openings)-->0 = ncell; ((maze-->ncell).&openings)-->2 = ccell; } else if(ncell == ccell + 5) { ((maze-->ccell).&openings)-->2 = ncell; ((maze-->ncell).&openings)-->0 = ccell; } else if(ncell == ccell + 1) { ((maze-->ccell).&openings)-->1 = ncell; ((maze-->ncell).&openings)-->3 = ccell; } else { ((maze-->ccell).&openings)-->3 = ncell; ((maze-->ncell).&openings)-->1 = ccell; } cellvisited-->ncell = 1; cellstack-->(cellptr++) = ccell; ccell = ncell; total++; } else if(cellptr>0) ccell = cellstack-->(--cellptr); else total = 100; } mazedir = random(4) - 1; (maze-->14).u_to = CityE; move bluecloth to maze-->2; give maze-->2 scored; ]; [ ChangeCity; if(cityState<4) { give cityN ~visited; give cityS ~visited; give cityW ~visited; give cityE ~visited; give Lab ~visited; give School ~visited; give Library ~visited; if(++cityState == 4) { remove pool; move hole to CityE; } if(cityState > 1) School.short_name = "Hospital"; print "^The world around you suddenly shimmers and changes...^^"; PlayerTo(location); } ]; [ ShootWall w d i nc; for(i=0: i<25: ++i) if(real_location == maze-->i) break; if(i >= 25) rfalse; d = (mazedir+w)%4; if((real_location.&openings)-->d == -1) { w = 1; switch(d) { 0: nc = i - 5; if(i<5) w = 0; 1: nc = i + 1; if(i%5 == 4) w = 0; 2: nc = i + 5; if(i>=20) w = 0; 3: nc = i - 1; if(i%5 == 0) w = 0; } blaster.charges--; if(w && blaster.setting) { (real_location.&openings)-->d = nc; ((maze-->nc).&openings)-->((d+2)%4) = i; "You aim at the hatch and squeeze the trigger. Suddenly, the hatch melts away, leaving an opening."; } else "You aim at the hatch and squeeze the trigger. Stubbornly, the hatch doesn't bulge."; } else "That hatch is already open."; ]; [ TakeOverMe; deadflag = 3; Prison.number = 5; score = -10; print "^^Something takes over your body, leaving only your mind free to watch. Through a haze you can see yourself "; if(Professor.status == 1) print "torching the Professor with your blaster, "; "leaving the underground complex and boarding your shuttle, returning to the mothership. Then the slaughter starts. You shoot your colleagues, destroy the communications equipment. When, mercifully, one of your comrades shoots you down, before you die you can see a black shadow raising from your body and engulfing his."; ]; [ PlayMovie; "The cartridge fits easily into the slot and the display lights up.^^^ You see an alien, dressed in a blue tunic with a white belt, wearing a pair of goggles sitting in this very room in front of a machine. The alien stands and leaves the building, entering a desolate area, a large metal triangle with bridges leading away.^ The scene changes, shows the alien carrying a transparent case filled with a black swirling mist. He enters a building that resembles a laboratory, unlocking an iris door in front of him with a keycard. He disappears through the door, returning a few moments later.^ The scene changes again, showing the alien in some sort of a hospital, holding the hand of another alien who is lying on a bed. It removes its goggles and puts them on the bed, by the wounded alien.^ The scene changes once more, again showing the desolate triangular area. The alien enters into a cylindrical elevator and the door closes after it. For a couple of minutes everything is still, then half-transparent images appear, become more solid and real, making the triangle look like a busy square.^^^ The cartridge ejects and the display becomes black again."; ]; [ WinBlurb st; if(st == 1) "You wait until the Professor recovers from the stun and head together back to the mothership. A larger expedition heads down to study the black mist and discovers that it's an intelligent entity bent on destruction. More films are discovered in the city, proving without a doubt that the mist, named ~The Bane~ by the Builders was responsible for wiping out entire planets.^ The city on this planet was a colony dedicated to finding means of protection against the Bane and they had in the end fulfilled their mission, but only one survivor ever made it out. What happened to it or the Builder planets that received the cure in time remains a mystery.^ All in all, you managed to save the Professor, the Earth and help uncover part of the Builders' mystery. Not bad for a day's work."; "You carry the Professor's body back to the shuttle, then up to your ship. A larger expedition heads down to study the black mist and discovers that it's an intelligent entity bent on destruction. More films are discovered in the city, proving without a doubt that the mist, named ~The Bane~ by the Builders was responsible for wiping out entire planets.^ The city on this planet was a colony dedicated to finding means of protection against the Bane and they had in the end fulfilled their mission, but only one survivor ever made it out. What happened to it or the Builder planets that received the cure in time remains a mystery.^ All in all, you managed to save the Earth from the same fate and uncover part of the Builders' mystery. Too bad the Professor didn't make it. He would have been proud of you."; ]; Include "Grammar"; ! Extra verbs & their stuff [ ShootSub; if(noun == player) "You shoot yourself in the foot."; else "Shooting ", (the) noun, " won't help you."; ]; [ IsGun; if(blaster in player && noun == blaster) if(blaster.charges) rtrue; else { print "Your blaster is discharged.^"; } rfalse; ]; Verb 'shoot' * noun 'with' noun=IsGun -> Shoot * 'at' noun 'with' noun=IsGun -> Shoot * 'with' noun=IsGun 'at' noun -> Shoot reverse; [ DiveSub; if(pool in location) { print "You step into the pool, but it doesn't feel wet. In fact, it doesn't feel like you're in water at all. One more step, and the floor suddenly gives way, sending you down...^^"; PlayerTo(maze-->14); } else "There's not enough water nearby."; ]; Extend 'swim' replace * -> Dive; Extend 'wave' * 'to' noun -> Wave; [ HelpSub; if((location == Ship) && ~~(blaster in player)) "The passenger seat looks comfy."; else if((location == Elevator) && (panel hasnt open)) "When a car doesn't start, you look under the hood."; else if(location == Lab) "Did you check what's behind the iris door?"; else if((location == School) && (cityState > 2)) "Look under the bed."; else if((location == CityE) && (cityState < 4)) "Nice weather for a swim."; else if(location provides openings) "How does a rat go through a maze? Taking only left (or only right) turns."; else if(location == ControlRoom) "Wrapping your hand in something might help here."; else if(location == thedark) "Are you sure you didn't forget anything in the shuttle?"; "Try examining things."; ]; Verb 'help' * -> Help; [ WrapSub; if(noun == bluecloth) { give bluecloth worn; "You wrap your hand in the blue cloth."; } "You can't wrap ", (the) noun, "."; ]; Verb 'wrap' 'bandage' * held 'on' 'hand' -> Wrap * 'hand' 'with' held -> Wrap * 'hand' 'in' held -> Wrap; Verb 'flip' * noun -> SwitchOn; [ LicenseSub; "~Bane of the Builders~ is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.^^ ~Bane of the Builders~ is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.^^ You can find a copy of the GNU General Public License at http://www.gnu.org/licenses/gpl.txt; if you can not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"; ]; Verb meta 'license' 'warranty' * -> License; #ifndef DEBUG; [ RandomizeSub n; n=random(-100); "[Randomized.]"; ]; Verb meta 'random' * -> Randomize; #endif;