!========================================================================= ! IDENTITY Copyright 2004 by David Bernazzani ! ! 52k was the starting size with 1 object. ! This game was started with INFORM 6.21 and Library 6/10 ! but was finished with INFORM 6.30 and Library 6/11 ! It was intended to be compiled as a .Z5 file ! ! Release History: ! Release 0-5 are all beta testing releases. ! Release 6 was the IF-2004 Comp release. ! Release 7 is the post-competition release with known fixes. !========================================================================= Constant Story "^** IDENTITY **"; Constant Headline "^An Interactive Science Fiction Short Story^Copyright 2004 by Dave Bernazzani^^"; Release 7; Constant MAX_SCORE = 100; ! We use a % complete instead. Constant MAX_CARRIED = 100; ! No player inventory limit. !======== A few globals for our game... ============ Global HintsHaveBeenActivated = 0; Global invisible_status = 0; Global firstTimeTakeFromCloset = 0; Global firstTimeWorkRadio = 0; !======== Used for stats in the SCORE and at the end of the game ============ Global turns_inSpaceShip = 0; Global turns_inEscapePod = 0; Global turns_atCrashSite = 0; Global turns_withyak = 0; Global turns_inVillage = 0; Global turns_nearRadio = 0; Global turns_atSacredGrounds = 0; !======== These are added to make the add-on library pname.h work! ============ Replace MakeMatch; Replace Identical; Replace NounDomain; Replace TryGivenObject; Replace DrawStatusLine; Include "Parser"; Include "pname.h"; ! Better parsing of object names. Thanks to Neil Cerutti for this. !========================================================================= !A few replacement Library messages. !========================================================================= Object LibraryMessages with before [; Think: return (RememberSub()); Jump: "Nothing fruitful can be accomplished by jumping here."; Sing: "Your singing is, quite frankly, not good."; Pray: "It won't help."; Score: return (PrintScore()); Strong: switch (random(3)) { 1: "That's certainly one way to try and get past your problems..."; 2: "Getting upset won't solve your current dilemma."; 3: "If you are really stuck and frustrated, you can always try HINTS."; }; Yes: return(YesParser()); No: return(NoParser()); ]; !========================================================================= !Standard verb processing plus menus and doors as add-on libraries. !========================================================================= Include "VerbLib"; Include "Menus.h"; ! Thanks to Graham Nelson for this... Include "Doors.h"; ! Thanks to L. Ross Raszewski for this... !========================================================================= !Object Classes - used throughout the game. !========================================================================= Class Room has light scenery; Class Prop with before [; Examine: return false; Look: ; default: print_ret "You don't need to perform that action with ", (the) self, "."; ], has scenery; Class Furniture with before [; Take, Pull, Push, PushDir: print_ret (The) self, " is too heavy for that."; ], has static supporter; Class NPC with life [; Answer, Ask, Order, Tell: print_ret "Just use TALK TO ", (the) self, "^"; ], has animate talkable; Class Wire with connected_str "nothing", with before [; Tie, Connect: if (RadioPanel hasnt open) { print "You cannot jumper the wire connections with the radio panel closed.^"; return true; } if (second ofclass Jumper) { print "You connect ", (name) noun, " to ", (the) second, ".^"; noun.connected_to = second.connection; noun.connected_str = second.connected_name; return true; } else { if (second == nothing) print "I can't figure out what you are trying to connect here.^"; else print "You can't connect ", (name) noun, " to ", (the) second, "!^"; return true; } ], has concealed static proper; Class Jumper with before [; ], has concealed static proper; Class Gas(2) with name 'gas' 'toxic' 'fumes', short_name "gas", article "some", infinite false, ! is this an inexhaustible source of Gas? before [; Drink: "You can't drink gas!"; Take: "[Use FILL and the name of a suitable container.]"; Insert,Transfer: if (parent(self) ofclass Bucket) <>; if (second ofclass Bucket) <>; "I'm not sure that's a suitable container."; Drop,Empty,EmptyT: if (parent(self) ofclass Bucket) <<(action) (parent(self)) second>>; ], react_before [; Fill: if (noun ofclass Bucket) rfalse; "I'm not sure that's a suitable container."; ], has ; Class Bucket with before [ x y; x = child(self); Empty: if (~~x ofclass Gas) rfalse; ! follow standard action Gas.destroy(x); print "You open the container and allow ", (the) x, " to escape into the air.^"; if (yak in location) { print "The yak nearby is unable to avoid inhaling some of the fumes.^"; <>; } return true; EmptyT: if (~~x ofclass Gas) rfalse; ! follow standard action if (second ofclass Bucket) { y = child(second); if (~~y) { ! second is empty move x to second; "You transfer ", (the) x, " into ", (the) second, "."; } if (y ofclass Gas) print_ret (The) second, " is already full of ", (name) y, "."; else print_ret (The) second, " has other stuff in it."; } else { if (second == d_obj) <>; "I'm not sure that's a suitable container."; } Fill: if (~~x) { ! is there a Gas source in scope? objectloop (x ofclass Gas && x.infinite && TestScope(x)) { x = Gas.create(); move x to self; print "You fill ", (the) self, " with ", (name) x, " and close the lid."; give self ~open; ! Gas must be in a closed container! return true; } rfalse; ! no Gas available } if (x ofclass Gas) print_ret (The) self, " is already full of ", (name) x, "."; else print_ret (The) self, " has other stuff in it."; Receive: if (x ofclass Gas) print_ret (The) self, " is already full of ", (name) x, "."; ], has container open; !========================================================================= !Object Chooser - help the parser out in some situations. !========================================================================= [ ChooseObjects obj code; if (code == 2 && obj ofclass Gas) { if (obj.infinite) return 1; else return 2; } if (code < 2) { if (obj has scenery) return 2; rfalse; } if (location == EscapePod && action_to_be == ##Exit && obj == EscapePodProp) return 5; if (location == EscapePod && action_to_be == ##Exit && obj == EscapePodChair) return 3; if (location == EscapePod && action_to_be == ##Connect && obj == EscapePodChair) return 3; if (location == EscapePod && action_to_be == ##Disconnect && obj == EscapePodChair) return 3; if (location == EscapePod && action_to_be == ##Insert && obj == EscapePodChair) return 3; if (location == EscapePod && action_to_be == ##Remove && obj == EscapePodChair) return 3; if (action_to_be == ##Eat && obj has edible) return 3; if (action_to_be == ##Dig && obj == shovel) return 4; if (action_to_be == ##DigWithShovel && obj == shovel) return 4; if (action_to_be == ##DigWithShovel && obj has static or scenery) return 0; if (action_to_be == ##Exit && obj has enterable) return 4; if (action_to_be == ##Exit && obj has supporter) return 3; if (action_to_be == ##Enter && obj has enterable) return 4; if (action_to_be == ##Enter && obj has supporter) return 3; if (obj hasnt scenery) return 2; return 1; ]; !========================================================================= !The Game Objects !========================================================================= !============= spacecraft ============== Room spacecraft "Inside Spacecraft" with name 'spacecraft' 'space' 'craft' 'ship' 'crashed' 'vehicle' 'spaceship', initial [; if (location hasnt visited) { HintReady(Hint_Fire); HintReady(Hint_Emergencies); HintReady(Hint_EscapePod); ScoreUp(10,"Exiting the cryotube and entering the main compartment of the spacecraft has caused some memories to surface. The spacecraft looks familiar - even in its current damaged state. You remember being part of a crew assigned to this spacecraft.^"); } ], with description [; if (Player notin cryotube) { print "You are standing in the main compartment of a spacecraft. The area around you is burned and heavily damaged. It would be inappropriate to say that you were standing on the floor since the craft has seemingly come to a catastrophic landing and is now resting, unnaturally, on its side. As best you can determine, you are standing on the port side bulkhead of the doomed craft. At your feet is a large bulkhead door. Nearby is a small hatch (currently closed). Several emergency lights are glowing dimly at various junctions along one wall. To one side of the craft are four firmly anchored cryotubes protruding at right-angles from what is now the wall. These tubes include the one that you emerged from ("; CheckTubeContents(); print " and "; if (cryotube.cryo_tube_opened == 1) print "open"; else print "closed"; print "), two that are closed, cracked and damaged both containing what appears to be humanoid figures and a fourth tube that is closed and apparently empty. You can also see a large instrument control panel to one end of this area. The front viewshield of the craft is also visible from here. "; if (fire.fireRaging == 0) { print "An upper hatch, similar to the one on the floor, is directly above you and "; if (EscapePodDoor has open) print "is currently open"; else print "is currently closed"; } else { print "There is a small electrical fire here and the top of the cabin you are standing in is filled with smoke"; } print ".^"; } return true; ], before [; Jump: if (fire.fireRaging == 0) "You manage a mighty jump, but even at your maximum apex you still can't quite reach the escape pod."; else "You jump up into a cloud of smoke from the billowing fire and then land."; ], u_to [; if (fire.fireRaging == 0) "Try as you might, the upper hatch is just slightly out of reach even at your furthest reach."; else "You jump up into a cloud of smoke from the billowing fire and then land."; ], cant_go "Sorry, you can't go that way.", has ; Prop "spacecraft" spacecraft with name 'spacecraft' 'space' 'craft' 'ship' 'crashed' 'vehicle' 'spaceship' 'compartment', with before [; Examine: <>; ], has ; Prop "cracked cryotubes" spacecraft with pname '.x' 'broken' '.x' 'cracked' '.x' 'damaged' '.or' '.x' 'cryo' '.x' 'tube' '.x' 'cryotube' '.x' 'tubes' '.x' 'cryotubes', description "The broken and cracked cryotubes are designed much the same as the one you were in. In one of the cracked tubes is a woman. In the other tube is a man. Both are dressed much the same as you are.", before [; Repair: "The broken cryotubes are well beyond your repair skills at this point."; Open: "The cryotubes, although cracked, are still locked and cannot be opened."; Interface: "The broken cryotube is unresponsive."; Jump,Climb: print "With a fair bit of difficulty and careful balance, you manage to climb onto the cryotube.^"; PlayerTo(Oncryotube); return true; Unlock: "The broken cryotubes are damaged beyond repair and cannot be unlocked or interfaced."; ], has ; Prop "woman in cryotube" spacecraft with name 'woman' 'lady' 'patrolwoman' 'corpse' 'humanoid' 'figures' 'figure', description "Through the broken cryotube you can see a woman of maybe 40 years of age. She is dressed in the same clothes as you. It appears this person is dead.", before [; ], has ; Prop "man in cryotube" spacecraft with name 'man' 'gentleman' 'patrolman' 'guy' 'corpse' 'humanoid' 'figures' 'figure' 'insignia', description "Through the broken cryotube you can see a man of maybe 30 years of age. He is dressed in the same clothes as you with the addition of a golden insignia on his shirt. It appears this person is dead.", before [; ], has ; Prop BulkheadDoor "main bulkhead door" spacecraft with name 'main' 'door' 'bulkhead', description [; print "The bulkhead door is rectangular and rather large - roughly two meters across by three meters tall. The bulkhead door is currently "; if (self.door_opened == 1) print "open."; else print "closed."; print "^"; return true; ], door_opened 0, before [; Open: if (self.door_opened == 0) { self.door_opened = 1; "With great effort, the bulkhead door opens inwards revealing a small pile of dirt, rock and rubble."; } else { "The bulkhead door is already open."; } Close: self.door_opened = 0; "You close the bulkhead door."; Enter: "Unfortunately, the nearly infinite mound of dirt, rock and rubble blocks you way."; ], has ; Prop "rubble" spacecraft with name 'rubble' 'dirt' 'rock' 'pile', description "The dirt, rock and rubble fills the area around and beyond the bulkhead door.", before [; Examine, Look: if (BulkheadDoor.door_opened == 0) "You can't see that here."; DigWithShovel, Dig: "It would take months to dig your way out that way."; ], has ; Prop "lower hatch" spacecraft with name 'small' 'hatch' 'lower' 'bottom' 'floor', description "The round hatch sits at your feet. It is roughly one meter in diameter and is currently closed. There is a small metal tag embedded into the hatch.", before [; Open: "You are unable to open ", (the) self, " door. It appears the hatch mechanism has been damaged during the crash."; ], has openable ~open; Prop "hatch tag" spacecraft with pname 'tag' '.x' 'hatch', description "The tag reads ~Escape Pod 1~.", before [; ], has openable ~open; Prop "upper hatch" spacecraft with pname 'upper' 'up' 'ceiling' 'cieling' '.x' 'hatch', description "This hatch above you is very similar to the hatch below you. It is a bit too far up to make out any clear detail, however.", before [; Open: "The upper hatch is several meters above you. You can't reach the Upper Hatch."; Look,Examine: if (fire.fireRaging == 1) "You can't see any hatch up there, just smoke above you."; Climb: if (fire.fireRaging == 0) "Try as you might, the upper hatch is just too far to reach from where you are standing."; ], has ; Prop ShipControlPanel "main instrument control panel" spacecraft with name 'control' 'panel' 'instrumentation' 'console' 'instrument' 'buttons' 'computer' 'ring', description "The main control panel of the craft is badly damaged. A number of exposed wires are visible - mostly charred and occasionally sparking to life with a crackle. Otherwise, the control panel appears lifeless and non-functional.", before [; Repair: "The control panel is well beyond your repair skills at this point."; ], has ; Prop "cryotube" spacecraft with name 'your' 'cryo' 'tube' 'cryotube' 'cylinder', with description [; print "The cryotube you were in is roughly two meters long and made of a thick black metal. There is a small window on one end of the tube. "; if (cryotube.cryo_tube_opened == 1) print "The cryotube is currently open "; else print "The cryotube is currently closed "; PrintTubeObjects(); return true; ], before [; Unlock: "You cannot get at the recessed lock mechanism."; Take: "The cryotube is part of the spacecraft and is far too large to be portable."; Jump,Climb: print "With a fair bit of difficulty and careful balance, you manage to climb onto the cryotube.^"; PlayerTo(Oncryotube); return true; Open: if (cryotube.cryo_tube_opened == 0) { cryotube.cryo_tube_opened = 1; print "You open ", (the) self, ".^"; return true; } else { print (The) self, " is already opened.^"; return true; } Close: if (cryotube.cryo_tube_opened == 1) { cryotube.cryo_tube_opened = 0; print "You close ", (the) self, "."; return true; } else { print (The) self, " is already closed.^"; return true; } Enter, Go: return(EnterTubeSub()); ], has ; Prop "front viewshield" spacecraft with name 'front' 'viewshield' 'view' 'window' 'sheild' 'sunlight', description "The main viewshield is largely covered with dirt and rocks on the outside, with only the slightest hint of sunlight filtering through in one corner. The spacecraft appears to be burrowed into the ground on the port side with debris covering most of the front section.", before [; ], has ; Prop "guidance system" spacecraft with name 'guidance' 'system', description "The Guidance System is destroyed.", has ; Prop "empty cryotube" spacecraft with pname 'fourth' 'empty' '.x' 'cryo' '.x' 'cryotube' '.x' 'tube', description "The empty cryotube is much the same as the other cryotubes in this area. The tube appears undamaged and is closed.", before [; Open: "The empty cryotube is closed and locked."; Interface: "The empty cryotube is unresponsive."; ], has ; Object spacecraftSuplyCloset "supply closet" spacecraft with name 'closet' 'supply' 'cabinet' 'storage', description [; print (The) self, " is anchored firmly to the side of the spacecraft and has a double set of latched doors to securely stow emergency equipment. "; if (self has open) { print (The) self, " is open "; print "and contains "; PrintClosetContents(); } else print (The) self, " is closed."; print "^"; return true; ], before [; Climb: "The closet is too small and unstable to stand on."; ], has container openable ~open static ; Object extinguisher "fire extinguisher" spacecraftSuplyCloset with pname '.x' 'fire' 'extinguisher', description "The Fire Extinguisher is small and red. You see nothing else unusual about the Fire Extinguisher.", before [; Use: <>; ], has ; Object firstaidkit "first aid kit" spacecraftSuplyCloset with name 'first' 'aid' 'kit' 'medical', with description [; print (The) self, " is made of white plastic with a red cross emblazoned across the top. "; print (The) self, " is "; if (firstaidkit has open) { print "opened and contains "; if (child(firstaidkit)) { WriteListFrom(child(firstaidkit), ENGLISH_BIT + RECURSE_BIT + CONCEAL_BIT); print "."; } else { print "nothing."; } } else print "closed."; print "^"; return true; ], before [; Receive: if (noun == tweezers or bandages) { return false; ! Allow insert. } else { print "That object doesn't belong in ", (the) firstaidkit, ".^"; return true; } ], after [; Take: return (TakeFromClosetMessage()); ], has container openable ~open; Object shovel "shovel" spacecraftSuplyCloset with name 'collapsible' 'shovel', with description [; print (The) self, " is a small collapsible shovel.^"; return true; ], after [; Take: return (TakeFromClosetMessage()); ], has ; Bucket SpecimenJar "specimen jar" spacecraftSuplyCloset with name 'specimen' 'jar' 'container', with description [; print "A small plastic jar with an air tight lid. "; if (self has open) print (The) self, " is open "; else print (The) self, " is closed "; print "and contains "; PrintJarObjects(); print "^"; return true; ], before [x ; x=child(self); Open: if (x ofclass Gas) { give self open; <>; } else { rfalse; !Let the parser handle open normally. } ], has openable transparent; Object schematic "parchment" with name 'schematic' 'parchment' 'paper' 'diagram', with short_name "parchment", with has_read 0, with invent [; if (inventory_stage == 2) { if (schematic.has_read == 1) { print " (written on a parchment)"; return true; } } ], with description [; if (schematic notin player) { print "(first taking ", (the) schematic, ")^"; move schematic to player; } schematic.has_read = 1; print "The parchment opens up to reveal a schematic.^"; font off; print "+=======================================================+^"; print "| RADIO-TRANSMITTER |^"; print "| INTERFACE BOARD SCHEMATIC |^"; print "| REV J |^"; print "| |^"; print "| +-------------------+ |^"; print "| A1 ----------- +Power Ground+ --------- A4 |^"; print "| A2 ----------- +XMit Rcvr+ --------- A5 |^"; print "| A3 ----------- +Gain Line Lvl+ --------- A6 |^"; print "| +Unused Signal+ --------- A7 |^"; print "| +--------- +Fuse Unused+ |^"; print "| | +-------------------+ |^"; print "| | |^"; print "| | |^"; print "| +---- Ensure external FUSE is in circuit. |^"; print "| |^"; print "+=======================================================+^"; font on; print "^"; schematic.short_name = "schematic"; return true; ], before [; ], has ; Object tweezers "tweezers" firstaidkit with name 'pair' 'tweezers' 'tweezer' 'pullers', with description "You see nothing special about the tweezers.", before [; ], has pluralname proper; Object bandages "bandages" firstaidkit with description "You see nothing special about the bandages.", with name 'bandage' 'bandages' 'bandaid', before [; ], has pluralname proper; Prop "emergency lights" spacecraft with name 'emergency' 'lights' 'light', description "The lights are glowing dimly, but still bright enough that you can see the interior of the spacecraft reasonably well.", before [; ], has ; Prop "electrical wires" spacecraft with pname 'electrical' 'wires' '.x' 'wire' 'wiring', description "The electrical system is a mess of tangled wires partially fused and melted from extreme heat. Most of the wiring appears beyond repair.", before [; Take: if (second == nothing) "You try to take ", (the) self, " with your bare hands, but the wires are too strong to do this bare-handed."; else "You try to take ", (the) self, " with ", (the) second, ", but the wires are too strong."; ], has ; !============= cryotube ============== Room cryotube "Cryotube" with initial[; HintReady(Hint_cryotube); ], with description [; print "You are lying prone on the inside of an all black cylinder. This area is cramped with only a minimum of room to move about. You see a small sensor panel located on the inside of the cylinder. "; if (cryotube.cryo_tube_opened == 1) { print "The cryotube is currently open and you can see a bit into the main part of the spacecraft. You would be able to see more if you could manage to get out of the tube."; } else { print "Directly above you is a small window set into the frame of the tube. The cryotube is currently closed."; } print "^"; return true; ], cryo_tube_opened 0, cryo_tube_unlocked 0, before [; Go: print "You can't manage to move in such tight quarters. Better get out of the tube first.^"; return 2; Exit,VagueGo: return (LeaveTubeSub()); ], after [; Exit: <>; ], cant_go "Sorry, you can't go that way.", has ; Prop fireWithinTube "fire and smoke" cryotube with pname '.x' 'electrical' 'fire' 'smoke' 'fires', description "The electrical fire is causing a slow but steady stream of smoke to fill the main part of the spacecraft.", before [; default: "There isn't much you can do about the fire and smoke from within the cryotube."; ], smoke_accumulating 0, each_turn [; if (fire.fireRaging == 1) { self.smoke_accumulating++; if ((self.smoke_accumulating % 5) == 0) { print "^The smoke continues to accumulate in the main part of the spacecraft.^"; } } ], has ; Prop "lock" cryotube with name 'lock' 'latch', with description "The lock mechanism is built into the tube and is not directly accessible.", has ; Prop cryotubeSelfDesc "cryotube" cryotube with name 'cryotube' 'cryo' 'tube' 'cylinder' 'door', description "The cryotube is roughly two meters long and made of a thick black metal. There is a small window on one end of the tube and an illuminated control panel to one side of the tube.", before [; Unlock: if (second == compucom) { "The COMPUCOM isn't a standard key. For help with that device, type COMPUCOM, HELP."; } else { "You cannot get at the recessed lock mechanism."; } Examine, Look: if (player notin cryotube) <>; Take: if (player in cryotube) "Pretty much impossible while your in it."; else "The cryotube is part of the spacecraft and is far too large to be portable."; Exit, VagueGo: return(LeaveTubeSub()); Open: if (cryotube.cryo_tube_unlocked == 1) { if (cryotube.cryo_tube_opened == 0) { cryotube.cryo_tube_opened = 1; "You open ", (the) self, "."; } else { print (The) self, " is already opened.^"; return true; } } else { "As hard as you push against the tube, it doesn't budge. It appears to be securely latched and locked."; } Close: if (cryotube.cryo_tube_opened == 1) { cryotube.cryo_tube_opened = 0; print "You close ", (the) self, ".^"; return true; } else { print (The) self, " is already closed.^"; return true; } ], has ; Prop "cryotube window" cryotube with pname 'window' '.x' 'cryotube' '.x' 'tube' 'ship' 'spacecraft' 'craft' 'spaceship' 'frame', with description [; print "The window of the cryotube, though small, does let you see some of the main part of the spacecraft. "; if (fire.fireRaging == 1) { print "There is a small electrical fire and some smoke which fills the upper part of the spacecraft."; } print "^"; return true; ], before [; Search: <>; Enter: "You'll need to get out of the cryotube."; Open,Push: "You try to push the window, but it won't budge."; Pull: "You tug at the window, but it won't budge."; Attack: "You try to break the window, but it won't shatter."; ], has ; Prop cryotubeControlPanel "sensor panel" cryotube with name 'panel' 'control' 'sensor' 'instrumentation' 'red' 'light' 'lights' 'rings' 'instrument' 'buttons' 'computer' 'ring', description "The main sensor of the cryotube is a largely featureless slate of raised black steel with three concentric rings of red light. The light illuminates in a cyclic pattern of ~waves~ with the inner most ring being illuminated first, followed by the middle ring and finally the outer ring. This lighted pattern repeats.", before [; Push,Touch: "Nothing happens when you touch the sensor panel on the cryotube."; ], has ; Prop fire "fire and smoke" spacecraft with name 'electrical' 'fire' 'flames' 'smoke' 'fires', found_in spacecraft Oncryotube, with description [; if (self.fireRaging) { print "The electrical fire is causing a slow but steady stream of smoke to fill the main part of the spacecraft.^"; } else { print "The fire crisis has already passed."; } return true; ], fireRaging 1, before [; Remove: "It is not possible to take ", (the) self, "."; Take: if (self.fireRaging == 1) "Your lungs are getting enough of it already. Maybe you might try putting it out!"; else "The fire has already been put out."; Extinguish: if (self.fireRaging == 1) { if (second ~= extinguisher) { if (second ~= nothing) { if (second notin player) { print "You can't put the fire out with that.^"; } else { print "You try to put out the fire with ", (the) second, " but that doesn't seem to do the trick.^"; } } else { print "You try to put out the fire with your hands, but the fire is too hot.^"; } } else { if (extinguisher notin player) { print "You don't have a fire extinguisher.^" ; } else { print "The fire extinguisher makes quick work of the fire. The smoke begins to clear in the compartment around you.^"; self.fireRaging = 0; } } return true; } else { print "The fire has already been put out.^"; return true; } ], smoke_accumulating 0, each_turn [; if (self.fireRaging == 1) { self.smoke_accumulating++; if ((self.smoke_accumulating % 5) == 0) { print "^The smoke continues to accumulate in the main part of the spacecraft.^"; } } ], has ; !============= ON TOP OF cryotube ============== Room Oncryotube "On Top Of Cryotube" with name 'tube' 'cryo' 'cryotube' 'top', initial [; ], with description [; print "You are now balancing precariously on the top of the cryotube. "; if (fire.fireRaging == 1) { print "There is a pool of smoke hovering above you"; } else { print "Directly above you is a hatch "; if (EscapePodDoor has open) print "(which is currently open)"; else print "(which is currently closed)"; } print " and below you is the rest of the spacecraft.^"; return true; ], before [; ], d_to [; print "You jump down to the spacecraft floor below you.^"; return spacecraft; ], u_to [; if (fire.fireRaging == 1) { print "There is simply too much smoke to try going in that direction from your current position.^"; return true; } else { if (EscapePodDoor has open) { print "With considerable effort, you manage to jump from the top of the cryotube to the escapePod hatch above you.^"; if (EscapePod.pod_is_jettisoned == 0) { return EscapePod; } else { print "You climb through the hatch into an area where the escape pod would normally be docked... but the escape pod has already been jettisoned and so you soon find yourself outside the spacecraft again.^"; return CrashSiteCentral; } } else { print "Sorry, the escape pod hatch above you is currently closed.^"; return true; } } ], cant_go "Sorry, you can't go that way.", has ; Connector EscapePodDoor "escape pod hatch" with parse_name [i j; i=0; j=0; if (NextWord()=='escape') j++; else wn--; if (NextWord()=='pod') j++; else wn--; if (NextWord()=='upper') i++; else wn--; if (NextWord()=='hatch') i++; else wn--; if (i > 0) { return i+j; } else { return 0; } ], with description [; print "The round hatch is roughly one meter in diameter and is currently "; if (EscapePodDoor has open) print "open."; else print "closed."; print " There is a small metal tag embedded into the hatch.^"; ], before [; Open: if (fire.fireRaging == 1) "You can't see any hatch here, just smoke above you."; if (Player in EscapePodChair) "You can't reach the hatch while seated."; Look,Examine: if (fire.fireRaging == 1) "You can't see any hatch here, just smoke above you."; Close: if (Player in EscapePodChair) "You can't reach the hatch while seated."; ], u_to EscapePod, d_to Oncryotube, when_open "", when_closed "", has openable concealed transparent; Prop EscapePodDoorTag "hatch tag" EscapePodDoor with name 'tag' 'sign', description "The tag reads ~Escape Pod 2~.", before [; ], has ; !============= Escape Pod ============== Room EscapePod "Escape Pod" with initial [; if (location hasnt visited) { HintReady(Hint_EscapePodUse); ScoreUp(10, "^More memories surface as you enter the escape pod for the first time. You seem to remember that you helped test the escape pod for the place you work.^"); } ], with pod_is_jettisoned 0, with description [; print "You are in an escape pod. The pod is scarcely large enough to allow you to crouch somewhat awkwardly. In the middle is a wide seat. Above the seat is a small control panel."; if (EscapePodDoor has open) print " The escape pod hatch is directly below you and is opened."; else print " The escape pod hatch is directly below you and is closed."; print "^"; return true; ], with before [; Exit, VagueGo: if (player notin EscapePodChair) <>; ], d_to [; if (EscapePodDoor has open) { if (self.pod_is_jettisoned == 0) return Oncryotube; else return CrashSiteCentral; } else { print "Sorry, the escape pod hatch is closed.^"; return true; } ], cant_go "Sorry, you can't go that way."; Prop EscapePodProp "escape pod" EscapePod with name 'escape' 'pod', with before [; Examine: <>; ], has ; Furniture EscapePodChair "pod chair" EscapePod with parse_name [i j; i=0; j=0; if (NextWord()=='escape') j++; else wn--; if (NextWord()=='pod') j++; else wn--; if (NextWord()=='chair' or 'seat') i++; else wn--; if (i > 0) { return i+j; } else { return 0; } ], with react_before [; GetOff, Exit: if (Straps.buckleup == 1) { print "You cannot get up from the chair while being strapped in.^"; rtrue; } rfalse; ], with before [; ], with description "The escape pod Chair is actually two full bucket seats side-by-side with strong reinforced backing and a set of safety straps to secure the people inside with a matching set of strap receptacles on the chair.", has supporter enterable concealed; Prop "backing" EscapePod with name 'backing' has ; Prop Straps "straps" EscapePod with name 'straps' 'safety' 'strap' 'buckle', with description "The straps look very strong. There is a buckle on the end of the straps that appears to attach to a matching receptacle on the escape pod chair.", with before [; Disconnect, RemoveStraps: if (second == Receptacle or EscapePodChair) { if (Straps.buckleup == 1) { print "You remove the strap buckle from the receptacle.^"; Straps.buckleup = 0; } else { print "The straps are not currently buckled into the receptacle.^"; } return true; } SecureStraps, Insert, Connect, Tie: if (second == Receptacle or EscapePodChair) { if (Player notin EscapePodChair) { print "You can only strap yourself in while in the chair.^"; } else { print "You connect the strap buckle to the receptacle. You are now securely strapped into the seat.^"; Straps.buckleup = 1; } } else { print "I don't understand what you are trying to connect here. You'll need to be more specific about what you want to attach the straps to.^"; } return true; ], with buckleup 0, has ; Prop Receptacle "receptacle" EscapePod with name 'receptacle', with description "The receptacle is located on the escape pod chair.", has ; Prop EscapePodControls "escape pod control panel" EscapePod with name 'control' 'panel' 'controls', with description "The escape pod control panel has a single red handle and nearby a small sign is mounted.", has ; Prop EscapePodHandle "escape pod handle" EscapePod with name 'handle' 'lever', before [; Pull: return(PullEscapePodHandle()); ], has ; Prop EscapePodSign "escape pod sign" EscapePod with name 'warning' 'sign' 'message' 'note' 'mounted', with description "**EMERGENCY INSTRUCTIONS**^^1. Pull Handle.^^*WARNING*^escape pod hatch must be closed and occupants must be secure prior to ejection due to excessive force during separation from the spacecraft.", has ; !============= CRASH SITE CENTRAL ============== Room CrashSiteCentral "Crash Site" with initial [; if (location hasnt visited) { HintReady(Hint_CrashSite); } ], with description [; print "You are in a large clearing with a few sparse bushes and a scattering of thin trees nearby. To one side of this clearing sits the spacecraft, resting on its side and burrowed partially underground. The spacecraft has separated into two distinct pieces. In this area you can see the main fuselage section of the craft. To the south lies the engine section of the craft. To the north, the clearing continues. A short distance away the escape pod rests quietly."; print "^"; if (location hasnt visited) { ScoreUp(5, "^From this vantage point you can see most of the spacecraft which you now remember boarding prior to insertion into the cryotube.^"); } return true; ], n_to CrashSiteNorth, s_to CrashSiteSouth, e_to [;return(CantGoOutside());], w_to [;return(CantGoOutside());], u_to [;print "You climb up the side of the ship. At the top, you spot the opening where the escape pod was attached. The hatch appears damaged but you manage to squeeze through the opening and drop into the spaceship.^"; return spacecraft;], cant_go "Sorry, you can't go that way."; Prop "escape pod" CrashSiteCentral with name 'escape' 'pod' 'legs' 'telescoping', description "The escape pod is resting quietly on 3 telescoping legs. A small hatch underneath is just visible.", before [; Go, Enter: if (EscapePodDoor has open) { PlayerTo(EscapePod); return true; } else { print "Sorry, the escape pod hatch is closed.^"; return true; } ], has ; Prop "spaceship" CrashSiteCentral with name 'ship' 'spaceship' 'space' 'spacecraft' 'craft', description "The spaceship is heavily damaged. From this vantage point, you can see an opening up on top of the ship where the escape pod was jettisoned from.", before [; Climb, Go, Enter: <>; ], has ; Prop "fuselage" CrashSiteCentral with name 'fuselage', has ; Prop "opening" CrashSiteCentral with name 'opening', has ; Prop "engine" CrashSiteCentral with name 'engine', description "The engine lies to the south.", has ; Prop "bushes" CrashSiteCentral with name 'bush' 'bushes' 'foliage' 'trees', description "The bushes in this area are sparse but seem to grow thicker to the north.", has ; !============= CRASH SITE SOUTH ============== Room CrashSiteSouth "spacecraft Engine" with initial [; if (location hasnt visited) { HintReady(Hint_Engine); } CrashSiteSouth.turnsHere = 0; ], with description [; print "The main engines of the craft has separated from the main section is resting here. A single crack is visible on the side of the engine bulkhead from which a steady plume of light green gas rises."; print "^"; return true; ], each_turn [; ProcessCrashSiteGas(); CrashSiteSouth.turnsHere = CrashSiteSouth.turnsHere + 1; ], turnsHere 0, n_to CrashSiteCentral, cant_go "Sorry, you can't go that way."; Prop Engine "engine" CrashSiteSouth with name 'engine', description "The engine bulkhead has cracked. Green gas rises from the engine.", before [; EmptyT: if (second ofclass Bucket) { give SpecimenJar ~open; <>; } else "I'm not sure that's a suitable container."; ], has ; Prop "spacecraft" CrashSiteSouth with name 'space' 'craft' 'spacecraft', with description "The main part of the spacecraft lies to the north.", has ; Gas GasAtCrashSite "gas" CrashSiteSouth with description "The gas is thick, green and swirling.", with infinite true, with before [; Smell: "The gas has a strong pungent smell."; Block, Close: if (location == CrashSiteSouth) "You cannot seal up the crack as it is too large."; ], has concealed; Prop "crack" CrashSiteSouth with name 'crack' 'cracks', with description "There is a steady stream of gas leaking from the crack.", with before [; Block, Close: "You cannot seal up the crack as it is too large."; ], has concealed; !============= CRASH SITE NORTH ============== Room CrashSiteNorth "North of Crash Site" with initial [; if (location hasnt visited) { HintReady(Hint_Vegetation); } ], with description [; print "You are standing in a clearing north of the crashed spacecraft. There are several varieties of vine-covered bushes nearby. In the distance to the east a small mountain range can be seen. A lightly worn path exits this clearing to the east."; print "^"; return true; ], e_to MountainPath, s_to CrashSiteCentral, w_to [;return(CantGoOutside());], n_to [;return(CantGoOutside());], cant_go "Sorry, you can't go that way."; Object BlueBerries "blue berries" CrashSiteNorth, with name 'blue' 'berries' 'berry', description "These Berries are small, round and blue.", before [; Give: if (second provides Feed) return (second.Feed(self)); Eat: "You take a cautious nibble on one of the blue berries and you begin to feel very sleepy... You stop before you get too drowsy."; Take: give self ~concealed; rfalse; ], has edible pluralname concealed; Object RedBerries "red berries" CrashSiteNorth, with name 'red' 'berries' 'berry', description "These Berries are small, oval and red.", before [; Give: if (second provides Feed) return (second.Feed(self)); Eat: "You take a cautious nibble on one of the Red berries and start to feel very sick. Suspecting they are not good for your health, you stop eating them."; Take: give self ~concealed; rfalse; ], has edible pluralname concealed; Prop "bushes" CrashSiteNorth, with name 'bush' 'bushes' 'vine' 'vines' 'covered' 'vine-covered', description "The bushes are covered with a thin series of vines containing two types of berries: blue and red.", before [; ], has ; Prop "mountains" CrashSiteNorth with name 'mountain' 'mountains' 'range', with description "Tall, magnificent and foreboding.", has ; !============= MOUNTAIN PATH ============== Room MountainPath "Mountain Path" with name 'mountain' 'path', with initial [; if (location hasnt visited) { HintReady(Hint_Mountain); HintReady(Hint_yak); } ], with description [; print "You are on a rocky mountain path which winds its way east into the mountain range. Around you are several small outcroppings of wispy grass surrounded by large groupings of rocks. To the west the path slopes downwards onto more gentle terrain."; print "^"; return true; ], w_to CrashSiteNorth, e_to [;return(CheckMountainCrossing(Valley));], s_to [;return(CantGoOutside());], n_to [;return(CantGoOutside());], cant_go "Sorry, you can't go that way."; Prop "rocks" MountainPath, with name 'grouping' 'rock' 'rocks//p', before [; ], has ; Prop "grass" MountainPath, with name 'grass' 'grasses' 'ground', before [; Receive, Insert, Transfer: <>; ], has ; Prop "mountains" MountainPath, with name 'mountain' 'range' 'mountains', before [; Enter: <>; ], has ; NPC yak "mountain yak" MountainPath, with pname 'mountain' 'yak' 'animal' 'beast', description [; print "The mountain yak is a massive animal, with a thick coat of long, grayish-brown hair. The back of the yak is humped at the shoulders. The beast sports horns which are spread outward and curved slightly upward, and the tail is long-haired and bushy. "; if (yak.has_splinter == 1) { print "The yak appears to have something wrong with its front foot as it struggles to maintain balance."; } print "^"; return true; ], before [; Talk: "The mountain yak looks at you inquisitively."; Thank: "Although it hardly seems possible, you swear that the yak just winked at you."; Pet: "The mountain yak makes what could only be described as a purring sound."; Receive: "The yak is unable hold equipment, only a rider."; PutToSleep: yak.sleepy = 4; return true; Climb: <>; Ride: <>; Enter: return(AttemptToRideyak()); Go: if ((noun == e_obj) && (location == MountainPath)) return 1; if ((noun == w_obj) && (location == Valley)) return 1; print "The yak is unwilling to venture far from its mountain home. You cannot travel in that direction while riding the yak.^"; return 2; ], Feed[food_source; if (food_source == BlueBerries) { print "The yak sniffs at the blue berries but doesn't eat them.^"; } if (food_source == RedBerries) { print "The yak sniffs at the red berries and issues a high pitched groan. The yak does not eat the red berries.^"; } return true; ], ridden 0, fed 1, has_splinter 1, sleepy 0, each_turn[; if ((Player notin yak) && (yak.sleepy == 0)) { switch (random(5)) { 1: "^The yak shuffles uneasily nearby."; 2: "^The yak utters a low guttural sound."; 3: "^The yak nibbles at a few bits of grass on the ground."; default: return false; } } else if (yak.sleepy > 0) { switch (yak.sleepy) { 1: print "^The yak is nearly fully awake again.^"; 2: print "^The yak is starting to wake up.^"; default: print "^The yak looks sleepy.^"; } yak.sleepy--; return true; } ], with life [; Answer, Ask, Order, Tell: print_ret "The yak doesn't understand your talking."; ], with orders [; default:"The yak is either unable to understand you or unwilling to do as you ask."; ], has supporter enterable; Prop yakFoot "yak's Foot" yak with name 'yak^s' 'front' 'right' 'foot' 'feet' 'leg', with description [; if (yak.has_splinter) { "There is a wooden splinter wedged into the side of the yak's foot."; } else { "The yak's foot looks in reasonably good condition to you."; } ], has ; Object splinter "splinter" yak, with name 'splinter' 'wood' 'prickly', with description [; if (yak.has_splinter == 0) { "The splinter has been removed and is no longer causing the yak discomfort."; } else { "The splinter appears to be causing the yak some discomfort."; } ], before [; Remove: if (yak.has_splinter == 0) { "The yak no longer has a splinter that needs removing."; } if (yak.sleepy == 0) { print "The yak bucks and does not allow you to take the Splinter out. Perhaps if it were less awake and alert.^"; return true; } if (second == nothing or tweezers or yak) { if ((tweezers in player) || (firstaidkit in player && tweezers in firstaidkit && firstaidkit has open)) { if (second == nothing or tweezers or yak) { yak.has_splinter = 0; print "You remove the splinter from the yak using the tweezers. The yak utters a long melodic guttural sound.^"; return true; } else { print "That's not an appropriate instrument to take the splinter with.^"; return true; } } else { print "You try to remove the splinter with your hands, but you can't get a good grip on it. Perhaps if you had a more appropriate instrument.^"; return true; } } else { print "That's not an appropriate instrument to take the splinter with.^"; return true; } Take: <>; TakeWith: if (second == tweezers) <>; else return false; ], has concealed; !============= VALLEY = OTHER SIDE OF MOUNTAIN ============== Room Valley "Valley" with name 'mountain' 'path', with initial [; if (location hasnt visited) { ! No hints in this location. ScoreUp(15, ""); } ], with description [; print "You are in a long green valley with mountains to the west. A path forks here - going east and sloping somewhat upwards and another heading south, sloping downwards further into the valley. You can see small trails of smoke wisping into the sky to the south."; print "^"; return true; ], w_to [;return(CheckMountainCrossing(MountainPath));], s_to VillageMain, n_to [;return(CantGoOutside());], e_to Cliff, cant_go "Sorry, you can't go that way."; Prop "mountains" Valley, with name 'mountain' 'range' 'mountains', before [; Enter: <>; ], has ; Prop "valley" Valley, with name 'valley' with before [; Examine: <>; ], has ; Prop "path" Valley, with name 'path' has ; Prop "smoke" Valley, with name 'smoke' has ; !============= CLIFF EDGE ============== Room Cliff "Cliff Edge" with initial [; if (location hasnt visited) { HintReady(Hint_Radio); HintReady(Hint_Kanera); } ], with description [; print "You are standing on the edge of a cliff. To the east you can see across a vast ocean stretching towards the horizon where sky eventually meets water. There is a path sloping downwards to the west away from the cliff edge heading back towards the mountains. Near the cliff edge and lying dangerously close to the drop off point is a man who appears to be dead."; print "^^"; return true; ], w_to Valley, s_to [;return(CantGoOutside());], n_to [;return(CantGoOutside());], d_to "It's a long way down and you decide better of it.", e_to "The cliff ledge lies East! It's a long way down and you decide better of it.", cant_go "Sorry, you can't go that way.", has ; Object Radio "radio-transmitter" Cliff, with name 'radio' 'transmitter' 'radio-transmitter' 'antenna', with describe "There is a radio-transmitter set up near the cliff ledge.", with description [; if (Radio has on) { print (The) self, " appears to be in working condition. The service panel to this unit is closed. "; } else if (RadioPanel has open) { print "The radio appears to be in a non-functional condition. The service panel to this unit is open and a new interface board is mounted in place. There are numerous wires that look like they would attach to the interface board. "; } else { print "The service panel on the radio is closed. "; } print "A burnt out interface board lies discarded on the ground nearby.^^"; print "[To learn about the interface with ", (the) self, " use the command RADIO, HELP]^"; print "The radio frequency is current set to ", self.frequency,".^"; return true; ], before [; Listen: if (Radio has on) "You hear static."; else "You hear nothing from the radio."; Use,Talk: "You cannot talk to the radio-transmitter."; Take: "The radio-transmitter is simply too bulky."; SwitchOn: return (RadioSwitchOnSub()); Set, SetTo, SetToSpecial: "[To learn about the interface with ", (the) self, " use the command RADIO, HELP]"; ], with life [; Answer, Ask, Order, Tell: print_ret "[To learn about the interface with ", (the) self, " use the command RADIO, HELP]"; ], with frequency 0, with orders [; Help: return (RadioTransmitterHelpSub()); Dial: return (RadioDialSub()); Transmit: return (RadioTransmitSub()); NotUnderstood: "Invalid RADIO command. ", (The) self, " must have a valid command and object to work properly. [To learn about the interface with ", (the) self, " use the command RADIO, HELP]"; default: "Invalid RADIO command. ", (The) self, " must have a valid command and object to work properly. [To learn about the interface with ", (the) self, " use the command RADIO, HELP]"; ], has neuter talkable static transparent switchable ~on; Prop "new interface board" Radio with name 'new' 'interface' 'board', with description [; <>; ], has ; Prop "burnt out radio interface board" Radio with pname 'burnt' 'out' '.x' 'interface' '.x' 'board', with description "The burnt-out radio interface board lies discarded to the side. It is a tangled mess of wires and jumpers - fused and twisted almost beyond recognition. There is a new interface board mounted on the radio.", has ; Prop Dial "dial" Radio with name 'dial', with description [; print "The dial is attached to the radio and has a frequency range of 0-10000.^ The radio frequency is current set to ", Radio.frequency,".^"; return true; ], has ; Object RadioPanel "panel" Radio with pname '.x' 'radio' 'panel' 'sticker' 'door' , description [; if (RadioPanel has open) { print "The radio service panel is open and affixed to the inside of the panel is a sticker. The sticker reads:^^"; font off; print "+=======================================================+^"; print "| USE REV K WIRING SCHEMATIC ONLY |^"; print "| Additional lines may be added to future schematics. |^"; print "| |^"; print "| J114 -- Signal J239 -- Rcvr |^"; print "| J115 -- Ground J242 -- Power |^"; print "| J116 -- Delay J243 -- Unused |^"; print "| J121 -- Line Lvl J244 -- Gain |^"; print "| J235 -- Select J251 -- Unused |^"; print "| J236 -- Unused J252 -- Unused |^"; print "| J238 -- XMit J253 -- Fuse |^"; print "+=======================================================+^"; font on; print "^"; print "A fuse is mounted on the inside edge of the open panel.^"; } else { print "The radio panel is closed."; print "^"; } return true; ], before [; ], has concealed static openable open; Prop "fuse" Radio with name 'fuse', description [; if (RadioPanel hasnt open) { print "The fuse is located behind the panel which is currently closed."; } else { print "The fuse is currently not in circuit and looks like it is not blown. There is a small label attached just below the fuse.^"; } return true; ], before [; ], has; Prop "fuse label" Radio with pname '.x' 'fuse' 'label', description [; if (RadioPanel hasnt open) { print "The fuse label is located behind the panel which is currently closed."; } else { print "The fuse label says ~Note to service technician: Fuse is out of circuit when service panel door is open.~"; } print "^"; return true; ], before [; ], has ; Object RadioWiring "radio wiring" Radio, with pname '.x' 'radio' 'wires' 'wire' 'wiring' 'interface' 'plate' 'jumpers', with description [; if (RadioPanel has open) { print "The radio-transmitter interface board is mounted in place and the wiring is exposed. On the open panel there is a sticker.^^"; print "There are 9 sets of wires labeled A1-A9 which originate from the radio itself. There are 13 sets of jumpers that are located on the interface board labeled as follows: J114, J115, J116, J121, J235, J236, J238, J239, J242, J243, J244, J251, J252^^"; print "The current wiring for this device is as follows:^^"; print (name) wireA1, " is connected to ", (string)wireA1.connected_str,".^"; print (name) wireA2, " is connected to ", (string)wireA2.connected_str,".^"; print (name) wireA3, " is connected to ", (string)wireA3.connected_str,".^"; print (name) wireA4, " is connected to ", (string)wireA4.connected_str,".^"; print (name) wireA5, " is connected to ", (string)wireA5.connected_str,".^"; print (name) wireA6, " is connected to ", (string)wireA6.connected_str,".^"; print (name) wireA7, " is connected to ", (string)wireA7.connected_str,".^"; print (name) wireA8, " is connected to ", (string)wireA8.connected_str,".^"; print (name) wireA9, " is connected to ", (string)wireA9.connected_str,".^"; } else { print "The radio panel door is currently closed.^"; } return true; ], before [; ], has concealed static ; Wire wireA1 "wire A1" Radio, with pname '.x' 'wire' 'a1', with connected_to 0, before [; ], has ; Wire wireA2 "wire A2" Radio, with pname '.x' 'wire' 'a2', with connected_to 0, before [; ], has ; Wire wireA3 "wire A3" Radio, with pname '.x' 'wire' 'a3', with connected_to 0, before [; ], has ; Wire wireA4 "wire A4" Radio, with pname '.x' 'wire' 'a4', with connected_to 0, before [; ], has ; Wire wireA5 "wire A5" Radio, with pname '.x' 'wire' 'a5', with connected_to 0, before [; ], has ; Wire wireA6 "wire A6" Radio, with pname '.x' 'wire' 'a6', with connected_to 0, before [; ], has ; Wire wireA7 "wire A7" Radio, with pname '.x' 'wire' 'a7', with connected_to 0, before [; ], has ; Wire wireA8 "wire A8" Radio, with pname '.x' 'wire' 'a8', with connected_to 0, before [; ], has ; Wire wireA9 "wire A9" Radio, with pname '.x' 'wire' 'a9', with connected_to 0, before [; ], has ; Jumper "jumper J114" Radio, with pname '.x' 'jumper' 'j114', with connection 114, with connected_name "Jumper 114", before [; ], has ; Jumper "jumper J115" Radio, with pname '.x' 'jumper' 'j115', with connection 115, with connected_name "Jumper 115", before [; ], has ; Jumper "jumper J116" Radio, with pname '.x' 'jumper' 'j116', with connection 116, with connected_name "Jumper 116", before [; ], has ; Jumper "jumper J121" Radio, with pname '.x' 'jumper' 'j121', with connection 121, with connected_name "Jumper 121", before [; ], has ; Jumper "jumper J235" Radio, with pname '.x' 'jumper' 'j235', with connection 235, with connected_name "Jumper 235", before [; ], has ; Jumper "jumper J238" Radio, with pname '.x' 'jumper' 'j238', with connection 238, with connected_name "Jumper 238", before [; ], has ; Jumper "jumper J239" Radio, with pname '.x' 'jumper' 'j239', with connection 239, with connected_name "Jumper 239", before [; ], has ; Jumper "jumper J242" Radio, with pname '.x' 'jumper' 'j242', with connection 242, with connected_name "Jumper 242", before [; ], has ; Jumper "jumper J244" Radio, with pname '.x' 'jumper' 'j244', with connection 244, with connected_name "Jumper 244", before [; ], has ; Jumper "jumper J236" Radio, with pname '.x' 'jumper' 'j236', with connection 236, with connected_name "Jumper 236", before [; ], has ; Jumper "jumper J243" Radio, with pname '.x' 'jumper' 'j243', with connection 243, with connected_name "Jumper 243", before [; ], has ; Jumper "jumper J251" Radio, with pname '.x' 'jumper' 'j251', with connection 251, with connected_name "Jumper 251", before [; ], has ; Jumper "jumper J252" Radio, with pname '.x' 'jumper' 'j252', with connection 252, with connected_name "Jumper 252", before [; ], has ; Prop DeadMan "dead man" Cliff with name 'dead' 'man' 'corpse' 'kanera' 'patrolman', with short_name "dead man", description [; print "This man is dead, but you recognise him. His name was Kanera and you worked together as patrolmen for the Stellar Patrol. Memories surface - you and he were assigned to deep space patrol and were both aboard the spacecraft together along with two additional crewmembers. There are small bits of red berries in Kanera's mouth. "; if (self.examined == 0) { ScoreUp(10, "Memories you had forgotten on crash impact have been jarred to life again."); self.examined = 1; self.short_name = "Kanera"; give self proper; } print "^"; return true; ], with examined 0, before [; Search: "You find nothing after searching Kanera's body."; ], has ; Prop "water" Cliff with name 'water', has ; Prop "red berries" Cliff with name 'red' 'berries' 'berry', has ; Prop "mountains" Cliff with name 'mountain' 'mountains', with description "Tall, magnificent and foreboding.", has ; Prop "cliff edge" Cliff with name 'cliff' 'edge', has ; Prop "ocean" Cliff with name 'ocean' 'sea', with description "The ocean stretches off into the distance as far as you can see. The color is generally a deep green with just a hint of shimmering blue where the sun strikes the surface.", has ; Prop "sun" Cliff with name 'sun', with description "The sun is bright.", has ; !============= VILLAGE MAIN ============== Room VillageMain "Village Center" with name 'village' 'center', with initial [; if (location hasnt visited) { HintReady(Hint_Village); } ], with description [; print "You are standing at the center of a quaint village with several thatch huts nearby. To the south, you can see the rest of the village stretching off into the distance. A main path runs to the north back towards the mountains and also curves here to the east into a thicket of trees. The path through the thicket to the east is lined with torches. There are no people to be seen anywhere, but from this central point, you can clearly see a small hut, a medium hut and a large hut."; print "^"; return true; ], w_to [;return(CantGoOutside());], s_to "You don't want to disturb the rest of the village.", n_to Valley, e_to [;return(CheckGoSacredGrounds());], cant_go "Sorry, you can't go that way."; Prop "torches" VillageMain with name 'torch' 'torches' with description "The torches are lit and burning. They illuminate the path to the east which is shrouded by trees.", with before [; Take: "The torches are clearly set here with care. You decide not to touch them."; ], has ; Prop "trees" VillageMain with name 'tree' 'trees' 'thicket' has ; Prop "small village hut" VillageMain with name 'small' 'village' 'hut' 'huts' 'shelter', description "There is nothing unusual about the small village hut... other than it is small compared to the other huts.", before [; Go, Enter: PlayerTo(SmallHut); return true; ], has ; Prop "medium village hut" VillageMain with name 'medium' 'village' 'hut' 'huts' 'shelter', description "There is nothing unusual about the medium village hut... other than it is a medium sized hut compared to the other huts.", before [; Go, Enter: PlayerTo(MediumHut); return true; ], has ; Prop "big village hut" VillageMain with name 'large' 'big' 'village' 'hut' 'huts' 'shelter', description "There is nothing unusual about the big village hut... other than it is big as compared to the other huts.", before [; Go, Enter: PlayerTo(BigHut); return true; ], has ; Prop "path" VillageMain with name 'path', with description "The path runs back to the north (towards the mountains) and goes to the east into a thicket of trees.", has ; Prop "mountains" VillageMain with name 'mountain' 'mountains', has ; !====================================== ! Small Village Hut !====================================== Room SmallHut "Small Village Hut" with name 'small' 'village' 'hut', with initial [; if (location hasnt visited) { HintReady(Hint_Boy); } ], with description [; print "You are standing in a small village hut. The thatched roof is slanted in at odd angles that require you to crouch down a bit in spots. There is a small village boy here painting the walls and humming to himself."; return true; ], with before [; Exit,VagueGo: PlayerTo(VillageMain); rtrue; ], out_to VillageMain, cant_go "Sorry, you can't go that way."; Prop "small village hut" SmallHut with name 'small' 'village' 'hut', has ; NPC VillageBoy "village boy" SmallHut, with name 'village' 'boy' 'child' 'kid', with initial [; return true; ], with description [; print "The village boy is but a child. He is painting one of the interior walls of this hut and doesn't appear to happy about it.^"; return true; ], with do_chores 0, each_turn [; self.do_chores++; if (self.do_chores % 3 == 0) { print "^The village boy goes about his chores of painting the wall.^"; } return true; ], before [; Talk: print_ret "To talk with someone, address the person such as ~SAY HELLO TO BOY~ or ~ASK BOY ABOUT ITEM~."; Listen: "The tune he is humming is unfamiliar to you but strangely soothing."; Thank: "The boy responds, ~You are quite welcome!~"; ], with life [; Order: print_ret "The village boy kindly responds, ~I'm sorry, but I am very busy and cannot help you with that.~"; Tell: "The boy does not seem interested in what you have to tell him."; Show: if (noun==VillageSeal) "The boy's eyes widen as he sees the seal. ~You have obtained the village seal!~"; Give: if (noun==VillageSeal) "The boy shakes his head and says, ~I wouldn't feel right. The elder gave that to you.~"; Ask: switch (second) { 'family': "The boy responds, ~My family lives here in the village.~"; 'gift', 'spacecraft': "The boy smiles and says, ~It woke me up last night. At first I heard the noise and then when I looked out my window I could see the light in the sky. It is a gift given to us by the twin moons. Nobody is allowed to see it unless under permission from the village elder. The gift lies to the east of our village.~"; 'chores', 'paint', 'painting', 'walls': "The boy responds, ~I wish I didn't have to paint these walls. I'd much rather go up and see the 'gift' at the Sacred Grounds!~"; 'guard', 'guards': "The boy responds, ~It's easy to get past the 2 sentry guards - you just need the village seal.~"; 'sacred', 'grounds', 'pod', 'crash': "The village boy says... ~I've had to paint these walls all day. But when I get a chance, I will obtain a village seal and get up to see the 'gift' that has been left for our people. I heard the noise last night when the gift was delivered. A larger flash of light to the west and a smaller one to the east - where the Sacred Grounds lie.~"; 'village', 'elder', 'chief': "The boy smiles, ~The village elder is like a father to all of us. But he is so busy these days with running the village and tending to the Harvest.~"; 'harvest', 'crop': "The boy responds, ~The harvest is our busiest time of the year.~"; 'seal', 'village seal': "The boy responds, ~The village seal lets you do all sorts of neat things around the village. Only the village elder can provide one.~"; 'sun': "The boy responds, ~One of our three principal gods.~"; 'moon', 'moons': "The boy responds, ~The twin moons are two of our three principal gods.~"; 'gods': "The boy responds, ~The Heavenly Sun and the Twin Moons guide us.~"; 'yak': "The boy responds, ~There are many such beasts in the mountains.~"; 'mountain', 'range', 'mountains': "The boy responds, ~I was lost there once when I was younger, but the elder came and rescued me.~"; 'red', 'blue', 'berry', 'berries': "The boy responds, ~There are two kinds of berries that grow here. The red ones are highly posionous and I know enough not to eat one. My mother uses the blue ones to put me to sleep when I'm not feeling well.~"; default: switch (random(3)) { 1: "The village boy starts to speak, ponders for a second and then smiles but does not answer."; 2: "The boy says, ~I can't think of anything meaningful to say about that.~"; 3: "With a child-like voice, the boy responds, ~You seem nice and I would love to help but I cannot help you with that.~"; } }; Answer: switch(noun) { 'hello', 'hallo', 'hi', 'greetings': "The boy thinks for a few seconds, smiles and says, ~Hello.~"; 'goodbye', 'bye', 'good': "~Be well and go in peace.~"; 'thanks', 'thank', 'you': "The boy responds, ~You are quite welcome.~"; 'yes': "The village boy smiles and says, ~I'm glad you agree.~"; default: "The village boy looks intrigued and then says, ~I'm not really sure what to say to that.~"; } Give: print "The village boy examines your gift, laughs and says, ~This is very kind of you, but I have no need for such an item.~^"; return true; ], with orders [; return false; ], has ; Prop "paint" SmallHut with name 'paint' 'painting', has ; Prop "walls" SmallHut with name 'wall' 'walls', has ; Prop "roof" SmallHut with name 'roof' 'ceiling' 'cieling', has ; !====================================== ! Medium Village Hut !====================================== Room MediumHut "Medium Village Hut" with name 'medium' 'village' 'hut', with initial [; if (location hasnt visited) { HintReady(Hint_Woman); } ], with description [; print "You are standing in a medium village hut with sparse furnishings. While the hut wouldn't be considered a luxurious place to live, it is clean, sturdy and provides adequate shelter.^"; return true; ], with before [; Exit,VagueGo: PlayerTo(VillageMain); rtrue; ], out_to VillageMain, cant_go "Sorry, you can't go that way."; Prop "sparse furnishings" MediumHut with name 'sparse' 'furnishings' 'furnishing' 'furniature' 'small' 'table', has; Object silverPitcher "Silver Pitcher" MediumHut with name 'silver' 'pitcher' 'water' 'drink' 'cup', with invent [; print (a) self; if (self.filled_with_water && self.blue_berry_in_water) { print " (filled with water with a hint of blue berry)"; } else if (self.filled_with_water) { print " (filled with water)"; } return true; ], with description [; print "A beautiful silver pitcher that is "; if (self.filled_with_water == 0) { print "currently empty."; } else { if (self.blue_berry_in_water) print "filled with water with a hint of blue berry."; else print "filled with water."; } print "^"; return true; ], filled_with_water 1, blue_berry_in_water 0, before [; Receive: if (noun == BlueBerries) { if (self.filled_with_water == 0) { "There is no water in the pitcher to dissolve the berries in."; } if (BlueBerries in player) { self.blue_berry_in_water = 1; "You grind up some of the blue berries and dissolve them in the water."; } } if (noun == RedBerries) { if (self.filled_with_water == 0) { "There is no water in the pitcher to dissolve the berries into."; } if (RedBerries in player) { "The red berries do not dissolve in the water, instead they float. After a bit, you decide that you cannot mix the red berries with water."; } } Take: if (VillageWoman in location) { print "As you pick up ", (the) self, ", the woman says ~Yes, please help yourself - the water in that pitcher is quite refreshing.~^"; return false; } Refill, Fill: if (self.filled_with_water == 1) { "The pitcher is already full of water."; } else { "You can't fill the pitcher yourself as you have no water."; } Drink: if (self.filled_with_water == 0) { "You don't see any water here that you can drink."; } else { silverPitcher.filled_with_water = 0; silverPitcher.blue_berry_in_water = 0; "You drink the water. It was quite refreshing."; } Empty: if (self.filled_with_water == 0) { "There is no water to empty."; } else { silverPitcher.filled_with_water = 0; "You pour the water on the ground."; } ], has ; Prop "medium village hut" MediumHut with name 'medium' 'village' 'hut', has ; NPC VillageWoman "village woman" MediumHut, with name 'stout' 'person' 'woman' 'village' 'lady' 'figure', with initial [; print "You see a short, stout village woman standing here.^"; return true; ], with description [; print "The village woman is a short, squat figure with a pleasant face and long black hair. She seems to be busy cleaning the hut.^"; return true; ], with clean_hut 0, each_turn [; self.clean_hut++; if (self.clean_hut % 3 == 0) { print "^The village woman goes about her chores of cleaning the hut.^"; } return true; ], before [; Talk: print_ret "To talk with someone, address the person such as ~SAY HELLO TO WOMAN~ or ~ASK WOMAN ABOUT ITEM~."; Thank: "The woman responds, ~You are quite welcome!~"; ], with life [; Order: print_ret "The village woman kindly responds, ~I'm sorry, but I am very busy and cannot help you with that.~"; Tell: "The woman does not seem interested in what you have to tell her."; Ask: switch (second) { 'boy': "She says, ~So you've met the boy? He works hard, like most of the people here.~"; 'her', 'self': "The woman ponders for a bit and says, ~I am what you see.~"; 'hut', 'chores', 'clean', 'cleaning': "She says, ~I'm not so fond of the cleaning, but the hut needs to be kept in order and there are no men in the village who can do it as well as I can.~"; 'sacred', 'grounds', 'pod', 'crash': "The village woman says... ~Unfortunately, I have not yet had the opportunity to visit the Sacred Grounds today but I have been told that a gift has been bestowed upon our people by the gods. If you are interested in seeing it, you will need permission from the village elder~"; 'village', 'elder', 'chief': "The woman responds, ~The village elder is our chief and has never led us astray. He leads a busy life, running the village but he also has his hands full with the harvest.~"; 'harvest', 'crop': "The woman responds, ~The harvest is our busiest time of the year.~"; 'seal', 'village seal': "The woman responds, ~The village seal represents a combination of the Heavenly Sun and the Twin Moons. All friends of the village are given this seal - and all who possess it may roam freely about our lands. Only the village elder may grant the village seal.~"; 'sun': "The woman responds, ~One of our three principal gods.~"; 'moon', 'moons': "The woman responds, ~The twin moons are two of our three principal gods.~"; 'gods': "The woman responds, ~The Heavenly Sun and the Twin Moons guide us.~"; 'red', 'blue', 'berry', 'berries': "The woman responds, ~There are 2 kinds of berries that grow here. The red berry is highly poisonous. The blue berries are used when you are having difficulty falling asleep.~"; 'silver', 'pitcher', 'water': if (silverPitcher.filled_with_water == 1) "The woman looks at the pitcher and says, ~The silver pitcher is filled with water. It is yours to do with as you please.~"; else "The woman responds, ~I would be more than happy to fill the pitcher with water for you.~"; default: switch (random(3)) { 1: "The village woman starts to speak, ponders for a second and then smiles but does not answer."; 2: "The woman says, ~I can't think of anything meaningful to say about that.~"; 3: "With a clear and strong voice, the woman responds, ~You seem kindhearted and I would love to help you but I cannot help you with that.~"; } }; Answer: switch(noun) { 'hello', 'hallo', 'hi', 'greetings': "The woman thinks for a few seconds, smiles and says, ~Hello.~"; 'goodbye', 'bye', 'good': "~Be well and go in peace.~"; 'thanks', 'thank', 'you': "The woman responds, ~You are quite welcome.~"; 'yes': "The village woman smiles and says, ~I'm glad you agree.~"; default: "The village woman looks intrigued and then says, ~I'm not really sure what to say to that.~"; } Show: if (noun == silverPitcher) { print "The village woman's eyes widen and she says, ~You brought back the pitcher. I hope the water it contained quenched your thirst. If you want more water, just ask.~^"; } else { print "The woman is only mildly interested in what you have to show her.^"; } return true; Give: print "The village woman examines your gift, laughs a bit and says, ~This is very kind of you, but I have no need for such an item.~^"; return true; ], with orders [; Fill: if ((noun == silverPitcher) || (second == silverPitcher)) { if (silverPitcher.filled_with_water == 0) { silverPitcher.filled_with_water = 1; "She looks at you and says, ~Of course, I will gladly fill the silver pitcher for you!~"; } else { "The pitcher is already filled with water."; } } else { "The woman responds, ~I don't quite see how to fill that for you.~"; } Give: if (noun == silverPitcher) { if (silverPitcher notin player) { if (silverPitcher notin location) { "The woman looks around and says, ~I'm sorry, the silver pitcher doesn't appear to be here.~"; } if (silverPitcher.filled_with_water == 1) "The woman says, ~Please help yourself - the water in that pitcher is quite refreshing.~"; else { silverPitcher.filled_with_water = 1; "The woman says, ~The pitcher is yours to do with as you please. Oh, I see that it's empty. Allow me to fill it for you.~ The woman fills the pitcher with water."; } } else { if (silverPitcher.filled_with_water == 0) { silverPitcher.filled_with_water = 1; "She looks at you and says, ~Please, let me fill that pitcher with water for you.~ The woman fills the pitcher with water."; } else { "The woman says, ~The pitcher is yours to do with as you please.~"; } } } default: return false; ], has female; !====================================== ! Big Village Hut !====================================== Room BigHut "Big Village Hut" with name 'big' 'village' 'hut', with initial [; if (location hasnt visited) { HintReady(Hint_VillageElder); } ], with description [; print "You are standing at the center of a big village hut. The hut is made of twigs and straw but appears rather sturdy. Near one end of the hut is a large table. "; if (location hasnt visited) { "Seated at this table is the village elder who is scribbling some lines in a journal of sorts. He stops writing in his journal, looks up at you and says, ~Welcome stranger, is there anything I can do for you?~"; } else { "Seated at this table is the village elder who is scribbling some lines in a journal of sorts. He pauses every so often to look up at you inquisitively."; } return true; ], with before [; Exit,VagueGo: PlayerTo(VillageMain); rtrue; ], out_to VillageMain, cant_go "Sorry, you can't go that way."; Prop elder_journal "journal" BigHut with name 'journal' 'book' 'scribbling' 'writing', with description "The journal is written in a language you can't understand.", with before [; Take: "The Elder slides the journal closer to himself. ~This is my journal, son.~"; ], has ; Prop "big village hut" BigHut with name 'large' 'big' 'village' 'hut', has ; NPC VillageElder "village elder" BigHut, with name 'man' 'elder' 'village' 'chief', with initial [; rtrue; ], with description [; print "village elder is a tall, slender figure with almost white hair and beard. His eyes convey both wisdom and kindness. He seems to be very engrossed in writing in his journal."; if (shovel in self) { print " However, he stops writing in his journal every so often to admire his shiny new shovel."; } print "^"; return true; ], with do_chores 0, each_turn [; self.do_chores++; if (self.do_chores % 3 == 0) { if (shovel in self) { } else { "^Though mildly interested in you, the elder continues to write in his journal."; } } ], before [; Talk: print_ret "To talk with someone, address the person such as ~SAY HELLO TO ELDER~ or ~ASK ELDER ABOUT ITEM~."; Thank: "The elder responds, ~You are quite welcome!~"; ], with life [; Order: print_ret "The village elder kindly responds, ~I'm sorry, but I cannot do as you ask at this time.~"; Tell: "The elder does not seem interested in what you have to tell him."; Ask: switch (second) { 'boy': "The elder laughs and says, ~He is a good boy, though sometimes he avoids doing his chores.~"; 'woman': "The elder says, ~All the women of this village are hard working.~"; 'yak': "The elder smiles and says, ~We are thankful for the yak, for it is a good animal during harvest.~"; 'sacred', 'grounds', 'pod', 'crash': "The village elder begins... ~The sacred grounds have always been special to our village. In fact, on this morning we were left a gift that was descended upon by the heavens! This is clearly a gift from the gods - and as such needs to be protected from those outside the village that may seek to steal it.~"; 'shovel', 'harvest': "The elder responds, ~The harvest is always time consuming and many of my tools have gotten worn over time.~"; 'gift': "The elder responds, ~Our people believe in the exchange of gifts.~"; 'seal', 'village seal': "The elder responds, ~This village has existed since before recorded history. It has always been a sacred place. The village seal represents a combination of the Heavenly Sun and the Twin Moons. All friends of the village are given this seal - and all who possess it may roam freely about our lands.~"; 'journal': "The elder responds, ~I have always kept a journal since I can remember.~"; 'sun': "The elder responds, ~One of our three principal gods.~"; 'moon', 'moons': "The elder responds, ~The twin moons are two of our three principal gods.~"; 'gods': "The elder responds, ~The Heavenly Sun and the Twin Moons guide us.~"; 'friends', 'friend', 'worthy': "The elder responds, ~Friends share with the village and help the village.~"; default: switch (random(3)) { 1: "The village elder starts to speak, ponders for a second and then smiles but does not answer."; 2: "The elder says, ~I can't think of anything meaningful to say about that.~"; 3: "The kind-eyed elder responds, ~You are young, and have much to learn... but I cannot help you there.~"; } }; Answer: switch(noun) { 'hello', 'hallo', 'hi', 'greetings': "The village elder thinks for a few seconds, smiles and says, ~Hello.~"; 'goodbye', 'bye', 'good': "~Be well and go in peace.~"; 'thanks', 'thank', 'you': "The village elder responds, ~You are quite welcome, young man.~"; 'yes': "The village elder smiles and says, ~I'm glad you agree.~"; default: "The village elder looks intrigued and then says, ~I'm not really sure what to say to that.~"; } Show: if (noun == shovel) { print "The village elder's eyes widen! ~That, my young friend, is a marvelous tool! So shiny and new... the harvest would be all that much quicker with such an instrument.^"; } else { print "The village elder is only mildly interested in what you have to show him.^"; } return true; Give: if (noun == shovel) { print "~You, kind stranger, would give me such a tool? This is a wonderful gift! All that I can offer in return here is this seal of our village.~ The village elder hands you the village seal which is now in your possession.^"; move villageSeal to player; move shovel to VillageElder; } else { print "The village elder examines your gift, shakes his head and smiles while saying, ~This is very kind of you, but I have no need for such an item.~^"; } return true; ], with orders [; Give: if (noun == villageSeal) { if (villageSeal in player) { "But you are already in possession of the village seal."; } else { "The elder responds, ~The village seal is only given to village members and worthy friends.~"; } } else { "The elder responds, ~It is beyond my power to give you that.~"; } default: return false; ], has concealed transparent; Object villageSeal "village seal" VillageElder with pname '.x' 'village' 'seal', with description "A beautiful wooden village seal in the shape of a brilliant yellow sun with two ivory-colored inlays representing twin moons.", before [; ], has pluralname proper concealed; [CheckGoSacredGrounds; if (villageSeal in Player) { print "You make your way west through the thicket of trees. Along the path you encounter two guards. Neither looks happy to see you. The smaller one says, ~Do you have permission to enter the sacred grounds?~^^ You raise the village seal that you acquired from the village elder.^ The larger one says, ~You may pass, stranger. Blessed are those that enter the Sacred Grounds.~^"; return SacredGrounds; } else { print "You make your way west through the thicket of trees. Along the path you encounter two guards. Neither looks happy to see you. The smaller one says, ~Do you have permission to enter the sacred grounds?~^ You fumble a bit, not knowing what to say or do.^ The larger one pipes up and shouts, ~No visitors except on village elder business... begone!~.^^ You return to the village.^"; return true; } ]; !============= Sacred Grounds ============== Room SacredGrounds "Sacred Grounds" with name 'sacred' 'grounds', with initial [; if (location hasnt visited) { ScoreUp(15, ""); HintReady(Hint_SacredGrounds); return true; } ], with description [; print "You are standing at the Sacred Grounds. There is a guard "; if (Guard.Sleepy > 0) { print "(sleeping) "; } print "nearby. An escape pod that looks suspiciously familiar rests to the east. The path back to the village lies to the west."; if (Guard.Sleepy == 0) { print " The guard is positioned between you and the escape pod."; } return true; ], e_to [;return(CheckEnterEscapePod());], s_to [;return(CantGoOutside());], n_to [;return(CantGoOutside());], w_to VillageMain, cant_go "Sorry, you can't go that way."; Prop "escape pod" SacredGrounds with name 'escape' 'pod' 'char' 'marks' with description "This pod looks very similar to the pod you used to escape from the spacecraft. However, this one has some char marks on the bottom that seem to indicate it has gone through atmosphere reentry.", with before [; Go, VagueGo, Enter: <>; ], has ; NPC Guard "Guard" SacredGrounds, with name 'guard' 'man' 'sentry', with initial [; return true; ], description [; if (self.Sleepy > 0) { print "The nearby guard is currently sleeping.^"; } else { print "There is a guard nearby who has positioned himself directly between you and the escape pod.^"; } ], before [; Talk: print_ret "To talk with someone, address the person such as ~SAY HELLO TO GUARD~ or ~ASK GUARD ABOUT ITEM~."; ], with guard_pacing 0, with thirsty 0, each_turn [; self.guard_pacing++; if (self.guard_pacing % 3 == 0) { if (self.Sleepy == 0) { if (self.thirsty == 0) { print "^The Guard continues to pace back and forth. He occasionally mutters something to himself about his water jug.^"; } else { self.thirsty--; } } } return true; ], with life [; Show: if (noun==SilverPitcher) "The guard eyes the silver pitcher and says, ~All this standing around in the hot sun has got me thirsty.~"; Give: if (self.Sleepy > 0) "The guard is currently asleep."; if ((noun == silverPitcher) && (self.thirsty > 0)) "The guard is not quite thirsty anymore."; if (noun == silverPitcher) { if (silverPitcher.filled_with_water == 0) { "The guard looks at the pitcher and sees that it is empty. ~You mock my thirst.~ He hands you back the Silver Pitcher."; } else { print "The guard looks at you and smiles! ~Thank you, kind stranger, for bringing me water. I have been parched all day and had forgotten my water jug at home.~ He drinks all of the water and gives you back the empty pitcher.^"; if (silverPitcher.blue_berry_in_water == 1) { print "^And the guard falls asleep!^"; self.sleepy = 5; } silverPitcher.filled_with_water = 0; silverPitcher.blue_berry_in_water = 0; self.thirsty = 3; return true; } } if (noun == RedBerries) { "The guard, quite startled by your offer, jumps back and says, ~Those, stranger, are poison. Even children in the village know that!~"; } if (noun == BlueBerries) { "The guard looks at your offering and responds, ~Ah... I see you've discovered the blue berries. They will make you sleepy. I can't eat them now since I'm on duty and musn't fall asleep while guarding the Sacred Grounds.~"; } Ask: if (self.Sleepy > 0) "The guard is currently asleep."; switch (second) { 'water', 'pitcher', 'jug', 'drink': "The Guard responds, ~I am extremely thirsty and I left my jug of water back home.~"; 'sacred', 'grounds', 'pod', 'crash': "The Guard says... ~I have been charged with guarding the Sacred Grounds. This (he points to the escape pod) is a gift from the gods. Nobody can go near it while I'm on watch.~"; 'village', 'elder', 'chief': "The Guard responds, ~The village elder is our chief and has never led us astray. He has charged me with guarding this gift and I won't let him down.~"; 'harvest', 'crop': "The Guard responds, ~The harvest is our busiest time of the year.~"; 'sun': "The Guard responds, ~One of our three principal gods.~"; 'moon', 'moons': "The Guard responds, ~The twin moons are two of our three principal gods.~"; 'gods': "The Guard responds, ~The Heavenly Sun and the Twin Moons guide us.~"; default: switch (random(3)) { 1: "The Guard starts to speak, ponders for a second and then smiles but does not answer."; 2: "The Guard says, ~I can't think of anything meaningful to say about that.~"; 3: "The Guard responds, ~You are a stranger, but seem a decent sort. I would love to help you but I cannot help you with that.~"; } }; Answer: if (self.Sleepy > 0) "The guard is currently asleep."; switch(noun) { 'hello', 'hallo', 'hi', 'greetings': "The Guard thinks for a few seconds, smiles and says, ~Hello.~"; 'goodbye', 'bye', 'good': "~Be well and go in peace.~"; 'thanks', 'thank', 'you': "The Guard responds, ~You are quite welcome.~"; 'yes': "The Guard smiles and says, ~I'm glad you agree.~"; default: "The Guard looks intrigued and then says, ~I'm not really sure what to say to that.~"; } ], with orders [; default: if (self.Sleepy > 0) "The guard is currently asleep."; "The Guard looks at you but says nothing..."; ], sleepy 0, has ; [CheckEnterEscapePod; if (Guard.sleepy > 0) { print "With the guard sleeping, you quickly make your way to the escape pod. You manage to open the hatch and enter the pod."; print "^"; return GuardedEscapePod; } else { print "The guard won't let you near the escape pod. Every time you get close to it, he pushes you back saying, ~This is a gift from the gods! No person shall disturb it under my watch.~"; print "^"; return true; } ]; !============= Guarded escape pod ============== Room GuardedEscapePod "Escape Pod" with name 'escape' 'pod', with initial [; if (location hasnt visited) { HintReady(Hint_Journal); HintReady(Hint_RadioForHelp); move journal to self; } ], with description [; print "You are standing inside an escape pod. This one looks very much like the one you used to escape from the crashed spacecraft. There is a hatch below you that leads back to the Sacred Grounds."; print "^"; return true; ], with before [; Exit, VagueGo: <>; ], d_to SacredGrounds, cant_go "Sorry, you can't go that way."; Prop "escape pod" GuardedEscapePod with name 'escape' 'pod', with description "This one looks very much like the one you used to escape from the crashed spacecraft.", with before [; Exit, VagueGo: <>; ], has ; Prop "escape pod Hatch" GuardedEscapePod with name 'hatch', with before [; Go: <>; ], has ; Prop "escape pod Seat" GuardedEscapePod with name 'seat', has ; Object journal "journal" GuardedEscapePod, with name 'journal' 'diary' 'book' 'paper', with description [; print "The journal is small and externally featureless except for a name inscribed on the cover - ~Kanera~. As you open the journal you begin to see that this is a diary of sorts. It talks about how Kanera had grown tired of his commitment with the Stellar Patrol and planned on ditching his commitment with the organization. The entire plan of sabotaging the spacecraft is well laid out - and was nearly perfectly executed. Except that Kanera didn't count on the fact that the radio would be damaged and need repair. The journal ends with an entry that indicates Kanera was trying to locate the crashed spacecraft and attempt to retrieve the radio schematic and fix the radio.^^ In the back of the journal there is a small table scribbled in with the title of ~Frequencies~. Some of the frequencies have been crossed out beyond recognition. The two that remain readable say:^ - 2125 pickup^ - 8142 emergency only^"; if (self.has_read == 0) { ScoreUp(10, ""); self.has_read = 1; } return true; ], with has_read 0, has ; !========================================================================= !The Player's Possessions !========================================================================= Object compucom "COMPUCOM", with pname 'compucom' 'comp' 'wrist' 'watch' 'lcd' 'interface', with description [; print "The COMPUCOM measures almost 15cm in length and is designed to fit snugly around your arm above the wrist and below the elbow. With a single touch of your finger on the LCD, the device springs to life. The display is highly reflective - giving a clear readout even in poor lighting conditions. One end of the COMPUCOM has three small concentric circles of red light - with the innermost ring being illuminated first, followed by the middle ring and finally the outer ring. This pattern repeats. Although you continue to struggle to with your memory, this instrument does seem somewhat familiar as if it has always been an ally for you in your past.^^ [To learn about the interface with ", (the) self, " use the command COMPUCOM, HELP]^"; return true; ], before [; Use,Talk: print_ret "[To learn about the interface with ", (the) self, " use the command COMPUCOM, HELP]^"; Take: print "Taken - the only logical place for it is back where it belongs (worn on your wrist).^"; move compucom to player; give compucom worn; return true; Wear: print "The only logical place for it is back where it belongs (worn on your wrist).^"; move compucom to player; give compucom worn; return true; ], with life [; Answer, Ask, Order, Tell: print_ret "[To learn about the interface with ", (the) self, " use the command COMPUCOM, HELP]"; ], with orders [; Help: return (CompucomHelpSub()); Scan: return (CompucomScanSub()); Laser: return (CompucomLaserSub()); Interface: return (CompucomInterfaceSub()); NotUnderstood: "Invalid COMPUCOM command. ", (The) self, " must have a valid command and object to work properly. [To learn about the interface with ", (the) self, " use the command COMPUCOM, HELP]"; default: "Invalid COMPUCOM command. ", (The) self, " must have a valid command and object to work properly. [To learn about the interface with ", (the) self, " use the command COMPUCOM, HELP]"; ], has neuter talkable worn; Prop "laser" compucom with name 'laser' 'lazer', with description "The laser appears to be damaged.", has ; !========================================================================= !Subroutines !========================================================================= [CantGoOutside; print "You set off in that direction but soon find that the terrain is too difficult to cross. You return to your original location.^"; return true; ]; [ProcessCrashSiteGas; switch (CrashSiteSouth.turnsHere) { 0: print "^As you approach this area you begin to feel lightheaded.^"; 1,2: print "^You feel more and more drowsy as you continue to remain in this area.^"; 3: print "^You are extremely drowsy now... and in a swoon you collapse. A short time later you wake up. Apparently you managed to roll away from the engine area and are now recovering at the main crash site.^"; PlayerTo(CrashSiteCentral, 2); } return true; ]; [PullEscapePodHandle; print "You pull the escape pod handle and "; if ((Player notin EscapePodChair) || (Straps.buckleup == 0)) { print "The force of separation from the spacecraft bears down on you heavily and tosses you about the cabin. The subsequent impact of the Pod onto the ground is more than your body can tolerate. The last breath you take is a painful one before it all goes dark...^"; deadflag = 4; } else { if (EscapePodDoor has open) { print "Although you were securely seated in the pod chair, the escape pod hatch was left open and upon separation from the escape pod it is jarred loose and smacks into you."; deadflag = 4; } else { print "a sharp jolt of pressure hits your body as the pod separates from the spacecraft, knocking you unconscious... Sometime later you awaken, still strapped into the escape pod chair.^"; EscapePodDoor.d_to = CrashSiteCentral; EscapePodDoor.u_to = EscapePod; EscapePod.pod_is_jettisoned = 1; InitDoors(); ! Reposition the hatch in the grand scheme of things... } } return true; ]; [AttemptToRideyak; if (yak.fed == 0) { print "The yak stays distant - looking hungry."; return true; } else { if (yak.has_splinter == 1) { print "You attempt to mount the yak but as you do the yak winces and bucks you off. There appears to be something wrong with the stability of this yak.^"; return true; } else { return false; } } ]; [CheckMountainCrossing to_location; if (Player in yak) { print "The yak skillfully navigates the twists and turns of the mountain paths. Before long, you arrive out the other side of the mountain range.^"; return (to_location); } else { print "You enter the mountain range and soon find yourself overwhelmed with all of the twists and turns of the paths you encounter. A short time after you enter the mountain range you find a way out! Unfortunately, you are still on the same side of the mountain you started on.^"; return true; } ]; [Gaseous; if (noun ofclass Gas) rtrue; rfalse; ]; [ReceptacleThingy; if (noun == Straps) rtrue; if (noun == Receptacle) rtrue; if (noun == EscapePodChair) rtrue; rfalse; ]; [MountableItem; if (noun == Yak) rtrue; rfalse; ]; [SplinterObj; if (noun == Splinter) rtrue; rfalse; ]; [LeaveTubeSub; if (player in cryotube) { if (cryotube.cryo_tube_opened == 1) { print "You climb out of the cryotube into the main part of the spacecraft.^"; PlayerTo(spacecraft); } else { print "The cryotube is currently closed.^"; } } else { print "You are not in the cryotube at the moment.^"; } return true; ]; [EnterTubeSub; if (player notin cryotube) { if (cryotube.cryo_tube_opened == 1) { print "You climb into the cryotube.^^"; PlayerTo(cryotube); } else { print "The cryotube is currently closed.^"; } } else { print "You are already in the cryotube at the moment.^"; } return true; ]; [ScoreUp x scoreStr; Score = Score + x; print (string) scoreStr; return true; ]; [CheckTubeContents itemCount x; itemCount = 0; objectloop (x in cryotube) if ((x hasnt concealed) && (x hasnt scenery)) itemCount = itemCount+1; if (itemCount == 0) { print "currently empty"; } else { print "currently containing ", itemCount; if (itemCount == 1) print " item "; else print " items "; } ]; [PrintTubeObjects itemCount x; print "and contains: "; itemCount = 0; objectloop (x in cryotube) if ((x hasnt concealed) && (x hasnt scenery)) itemCount = itemCount+1; if (itemCount == 0) { print "nothing."; } else { WriteListFrom(child(cryotube), ENGLISH_BIT + RECURSE_BIT + CONCEAL_BIT); print "."; } print "^"; return true; ]; [PrintJarObjects; if (child(SpecimenJar)) { WriteListFrom(child(SpecimenJar), ENGLISH_BIT + RECURSE_BIT); print "."; } else { print "nothing."; } return true; ]; [PrintClosetContents; if (child(spacecraftSuplyCloset)) { WriteListFrom(child(spacecraftSuplyCloset), ENGLISH_BIT + RECURSE_BIT); print "."; } else { print "nothing."; } return true; ]; [CompucomInterfaceSub; if (compucom notin player) { print "You need to be in possession of the COMPUCOM to use it."; return true; } switch (noun) { ShipControlPanel: "The COMPUCOM flashes to life and attempts to interface with the spacecraft's control panel. After a few seconds, the COMPUCOM display shows:^^ **ERROR 47**^ Uplink Interface Damaged^ Partial Download Of spacecraft Log....... Complete.^^ Ship Designation: SP-2903-01^ Ship Class: Stellar Patrol - Mark I (4 Man Crew)^ Ship Crew:^ * Lieutenant Jake Rodriguez^ * Lieutenant Kimberly Atonni^ * Lieutenant Commander Kanera Nikkoli^ * Captain Mark Drager^^ Time Index Log:^ 12889.2 Trajectory Anomaly^ 12889.0 Hull Temperature Critical^ 12887.9 cryotube Activation^ 12887.6 Emergency Systems Online^ 12854.3 escape pod I Jettison^ 12851.5 Navigation Override Confirmed.^ ** Time Index Damaged **"; cryotubeControlPanel, cryotubeSelfDesc: if (cryotube.cryo_tube_unlocked == 0) { cryotube.cryo_tube_unlocked = 1; print "You move the COMPUCOM close to the sensor panel and activate the INTERFACE command. The cryotube control panel is successfully interfaced and the override for the cryotube door look has been activated.^^"; ScoreUp(5, "Using the COMPUCOM has caused a slight triggering of your memory. You can now remember that this device was issued to you by the people you work for.^"); return true; } else { "The cryotube sensor panel has already been interfaced."; } default: if (noun == nothing) { "Compucom INTERFACE attempt on unknown object."; } else { "Trying to interface with ", (the) noun, " does not produce any noticeable result."; } } return true; ]; [InterfaceSub; "You will need to use the COMPUCOM to do any sort of interfacing."; ]; [CompucomScanSub; if (compucom notin player) { print "You need to be in possession of the COMPUCOM to use it."; return true; } if (noun ofclass Gas) "Scanning...^Status: The fumes contains a natural toxin and should not be inhaled."; switch (noun) { EscapePodDoor: "The escape pod Door is non-organic and comprised of several dense metals.^ The object does not have a standard infrared interface."; cryotube, cryotubeSelfDesc, cryotubeControlPanel: print "Scanning...^ Status: The object is non-organic and comprised of several dense metals.^ The object uses a standard infrared interface.^"; DeadMan: print "Scanning...^ Status: The object is organic and currently dead.^"; yak, yakFoot: print "Scanning...^ Status: The object is organic and currently alive.^"; if (yak.has_splinter == 1) { print "A foreign object has been detected in the right front foot of this animal.^"; } else { print "A small wound (currently healing) has been detected in the right front foot of this animal.^"; } BlueBerries: "Scanning...^Status: The object is organic and contains a natural sleep agent."; RedBerries: "Scanning...^Status: The object is organic and contains a natural toxin and is extremely poisonous."; default: if (noun == nothing) { "Compucom SCAN attempt on unknown object."; } else { "Scanning ", (the) noun, "... Nothing found."; } } return true; ]; [ScanSub; "You will need to use the COMPUCOM to do your scanning."; ]; [CompucomLaserSub; if (compucom notin player) { print "You need to be in possession of the COMPUCOM to use it.^"; } else { print "You attempt to activate the laser but you only see a hint of a spark and a faint fizzle.^"; } return true; ]; [LaserSub; "You will need to use the COMPUCOM to activate the laser.^"; ]; [RadioSwitchOnSub; if (RadioPanel has open) { print "The switch makes a clicking noise but the radio does not turn on.^"; return true; } else { ! check if the wiring is correct... if (wireA1.connected_to == 242 && wireA2.connected_to == 238 && wireA3.connected_to == 244 && wireA4.connected_to == 115 && wireA5.connected_to == 239 && wireA6.connected_to == 121 && wireA7.connected_to == 114 && wireA8.connected_to == 116 && wireA9.connected_to == 235) { print "With a click and a hum, the radio springs to life!^"; give Radio on; if (firstTimeWorkRadio == 0) { firstTimeWorkRadio = 1; ScoreUp(10, ""); HintReady(Hint_Radio2); } return true; } else { print "The switch makes a clicking noise but the radio does not turn on.^"; return true; } } ]; [RadioDialSub; print "You set the radio dial to a frequency of ", noun, ".^"; radio.frequency = noun; return true; ]; [DialSub; "You will need to use a radio to do any sort of frequency dialing."; ]; [RadioTransmitSub; if (Radio hasnt on) { print "Transmission is not possible with the radio off.^"; return true; } else { if (Radio.frequency == 8142) { print "You fire up the transmitter and within a few seconds a signal rises above the static noise...^^ ~THIS IS STELLAR PATROL 3... STELLAR PATROL 3... DO YOU COPY?~^^ You answer the call and relay your position. Not long after, a spacecraft arrives to take you home. After arriving back at the Stellar Patrol headquarters, you brief them on what you have learned about your adventure and the betrayal of Kanera...^"; ScoreUp(10, ""); deadflag = 2; } else if (Radio.frequency == 2125) { print "You fire up the transmitter and within a few seconds a signal rises above the static noise...^^ ~Kanera... Kanera... is that you? The signal is very weak... difficult to hear... We've been waiting for your signal for... Please radio us your position and we'll arrange...~. The voice trails off and once again the static and noise overpowers the signal.^"; } else { print "You send a transmission using the radio, but there is only static for a reply.^"; } } return true; ]; [TransmitSub; "You will need to use a radio to do any sort of transmitting."; ]; [ HelpSub; "Welcome to **IDENTITY** - An Interactive Science Fiction Short Story^^ This is my first published IF work and was created specifically for the 2004 IF Competition. The job of creating an interactive story was a bit more work than I originally imagined. This game took approximately 80 hours of actual code writing with countless more hours reading the IF guides, playing competition entries from the past few years and generally reading up on what has taken place in the IF community in recent years. I grew up with the Infocom games and was pleased to see that the community is alive and well. I'd like to thank the IF community for their help and contributions. I would especially like to thank my beta testers: Chris Cenotti, Jessica Knoch, Vivienne Dunstan and Al. My game grew almost half again in size (not so much in terms of rooms but in terms of interactive objects and extended verbs) thanks to their comments and suggestions. Their efforts in testing are greatly appreciated (though all errors that remain are my own).^^ If you are stuck, type HINTS to get clues ranging from a gentle nudge to a nearly complete walkthrough. If you want to contact the author regarding this game, feel free to do so at daveber@@64gis.net. I hope that you enjoyed this adventure and would encourage new authors to enter into the competition for next year!^^ Post Competition: Well... the IF-Comp has come and gone. Identity placed 15th out of 36 entries. Not bad, but I had hoped to do better. I fixed the known technical issues that were uncovered during the competition - fortunately there were not many. I ended up with a lot of good constructive feedback and will continue to work towards better IF. Thanks to everyone that participated in the review process! The source code to this game can be found at www.ifarchive.org or one of the mirrors."; ]; [ CompucomHelpSub; "To use the Compucom you issue the following commands:^^ COMPUCOM, SCAN ^ COMPUCOM, LASER ^ COMPUCOM, INTERFACE "; ]; [ RadioTransmitterHelpSub; "To use the radio-transmitter you issue the following commands:^^ RADIO, DIAL - to dial a specific frequency^ RADIO, TRANSMIT - to transmit a text message"; ]; [ HintsSub; if (HintsHaveBeenActivated == 0) { print "Since part of the fun of Interactive Fiction is the puzzles and the obstacles that must be overcome to advance the story, getting a hint may take some of that fun out of it for you. However, if you are truly stuck (or pressed for time), it makes sense to get a little help in the form of a hint. This hint system tries to only show hints for puzzles and areas that have been encountered (so that you don't end up seeing a question that might give away some future event) and will show hints from a gentle nudge to a near-walkthrough.^^ Please type Yes if you want to enter the hint system (Y/N): "; if (YesOrNo()) { HintsHaveBeenActivated = 1; } else return false; } Hints.select(); return true; ]; [ AfterLife; if (deadflag == 4) { print "^^This story has come to an grisly ending. Do you want to back up to the decision point that caused these events to unfold (Y/N)?"; if (YesOrNo()) { deadflag = 0; PlayerTo(EscapePod, 2); } else { deadflag = 2; } } ]; [ DeathMessage; if (deadflag == 3) { print "Congratulations!!"; return true; } else { print_ret "Unknown death... End of the Adventure..."; } ]; [ PrintScore x; print "You have completed ", Score, "% of this adventure in ", sline2, " moves."; print "^^"; print "Some additional Statistics: ^"; x = 0; if (turns_inSpaceShip > 0) { x = ((turns_inSpaceShip*100)/sline2); print "You spent ", turns_inSpaceShip, " turns in the spacecraft. This accounts for ", x, "% of your time.^"; } if (turns_inEscapePod > 0) { x = ((turns_inEscapePod*100)/sline2); print "You spent ", turns_inEscapePod, " turns in the escape pod. This accounts for ", x, "% of your time.^"; } if (turns_atCrashSite > 0) { x = ((turns_atCrashSite*100)/sline2); print "You spent ", turns_atCrashSite, " turns in and around the spacecraft crash site (outside). This accounts for ", x, "% of your time.^"; } if (turns_withyak > 0) { x = ((turns_withyak*100)/sline2); print "You spent ", turns_withyak, " turns dealing with the yak. This accounts for ", x, "% of your time.^"; } if (turns_inVillage > 0) { x = ((turns_inVillage*100)/sline2); print "You spent ", turns_inVillage, " turns in and around the village. This accounts for ", x, "% of your time.^"; } if (turns_nearRadio > 0) { x = ((turns_nearRadio*100)/sline2); print "You spent ", turns_nearRadio, " turns dealing with the radio. This accounts for ", x, "% of your time.^"; } if (turns_atSacredGrounds > 0) { x = ((turns_atSacredGrounds*100)/sline2); print "You spent ", turns_atSacredGrounds, " in and around the sacred grounds. This accounts for ", x, "% of your time.^"; } return true; ]; [ PrintRank; return true; ]; [TimePasses; if (location == cryotube or spacecraft or Oncryotube) { turns_inSpaceShip++; } if (location == EscapePod) { turns_inEscapePod++; } if (location == CrashSiteCentral or CrashSiteSouth or CrashSiteNorth) { turns_atCrashSite++; } if (location == VillageMain or SmallHut or BigHut or MediumHut) { turns_inVillage++; } if (yak in location) { turns_withyak++; } if (location == Cliff) { turns_nearRadio++; } if (location == SacredGrounds or GuardedEscapePod) { turns_atSacredGrounds ++; } ]; [ TalkSub; "The proper way of talking to someone is like this: ~SAY TO ~. For example, ~SAY HELLO TO MAN~. More importantly, to ask a person about something (which is NEEDED in this game) requires you to type in something like ~ASK ABOUT ~. Try to keep the words short and simple - and do not be too verbose since it is hard for the game to interpret too many words. For example, try typing ~ASK PILOT ABOUT WEATHER~."; ]; [ BugSub; "Noted. Thanks for reporting it!"; ]; [ YesParser; return false; ! let the library do it's normal things... ]; [ NoParser; return false; ! let the library do it's normal things... ]; [RepairSub; "That's not something you can repair."; ]; [UseSub; "That's not something you can use here."; ]; [RideSub; "That's not something you can ride."; ]; [ConnectSub; "That's not something that can be connected to."; ]; [DisconnectSub; "That's not something that can be disconnected from."; ]; [PutToSleepWithSub; if ((noun == yak) && (second ofclass Gas)) { if (yak in location) { if ((SpecimenJar in Player)) { <>; } } } "I don't see how to do that."; ]; [PutToSleepSub; "I don't know how to accomplish that."; ]; [PutToSleepHelpSub; if (noun == yak) { "Hmmm... Perhaps is you had something that would make the yak sleepy..."; } else { "That's not something you can try to put to sleep."; } ]; [ ComplimentSub; "Thank you!"; ]; [IdentitySub; "You don't yet know who you are."; ]; [ExtinguishSub; "That's not something you can extinguish."; ]; [TakeFromClosetMessage; if (firstTimeTakeFromCloset == 0) { firstTimeTakeFromCloset = 1; print "As you take ", (the) self, " from the closet, you realize that a small parchment of paper that was stuck to the bottom has come loose and is now resting inside the closet.^"; move schematic to spacecraftSuplyCloset; return true; } else { return false; } ]; [ExamineUniformSub; ExamineShirtSub(); ExaminePantsSub(); ExamineBeltSub(); ExamineBootsSub(); ]; [ExamineBootsSub; "Your boots are made of a durable all-black material."; ]; [ExamineBeltSub; "Your belt is slim, long and made of a pliable all-black material. This belt appears a bit too long for you as it sits on your waist loosely."; ]; [ExaminePantsSub; "Your pants are made of a fairly comfortable all-black material."; ]; [ExamineShirtSub; "Your shirt is made of a fairly comfortable all-black material with a single gray stripe across the midsection."; ]; [RemoveBeltSub; "You cannot remove your belt."; ]; [RemoveBootsSub; "You cannot remove your boots."; ]; [RemoveShirtSub; "You cannot remove your shirt."; ]; [RemovePantsSub; "You cannot remove your pants."; ]; [RememberSub; "You've been trying hard to remember more about your past, but nothing seems to quicken the slow triggering of your memory."; ]; [TakeWithSub; "You can't take ", (the) noun, " with ", (the) second, "."; ]; SwitchOption "SomeDummySwitch" ! To remove warning from library extention menus.h with name 'somedummyswitch', has ; [DigWithShovelSub; "Digging here would not achieve any productive results. The ground in this area is simply too hard."; ]; [PetSub; "That's probably not an appropriate thing to pet."; ]; [HumSub; print "You hum a simple tune."; if (VillageBoy in location) { print " The boy smiles."; } print "^"; return true; ]; [SetToSpecialSub; "I'm not sure what you are trying to Set."; ]; [SecureStrapsSub; "I'm not sure what you are trying to secure."; ]; [RemoveStrapsSub; "I'm not sure what you are trying to remove."; ]; [RefillSub; "I'm not sure what you are trying to refill."; ]; [BlockSub; "I'm not sure what you are trying to block."; ]; [ThankSub; "I'm not sure who you are trying to thank."; ]; !========================================================================= !Entry Point Routines !========================================================================= [ Initialise; location = cryotube; move compucom to player; lookmode = 2; notify_mode = false; player.description = "You are dressed in what appears to be a nearly all-black uniform. Black pants, black boots, black belt, and a mostly black shirt with a single thin gray stripe across both sleeves (just above the elbows) and a larger gray stripe around the entire shirt at your midsection."; InitDoors(); print "^^ ~I'm sorry, Mother. I know this isn't the career you wanted for me. But it's something I believe in. I consider it a great opportunity and one I can't pass up.~^^ A silver-haired woman in her later years stands before you with her hands shaking and her eyes in tears. ~I know, Jake. I know. You've always made good decisions, and I'm proud of you no matter what. It's just... so very dangerous. I'm worried. Why did you have to sign on with... with...~^^ You reach out in a feeble attempt to comfort your mother, but the vision fades as it always does in this dream. Never a second opportunity, never another chance to make things right before...^^ ~Breeeeet... Breeeeet... Level 5 Emergency... Level 5 Emergency. Cryogenic pods activated. Hull Temperature now at critical. Guidance System damaged. Main Deflectors destroyed. Descent proceeding on last known trajectory...~^^ Your hearing is always the first to respond after waking from cryogenic hibernation. A few seconds later the other senses begin to thaw and your eyes regain some level of focus. Normally the first thing you would see is the soft glow of the overhead cabin lights. This time, however, your senses are greeted by unfamiliar and harsh stimuli. The tremendous light and heat, bearing down with the intensity of a hundred suns, don't allow your eyes to open for more than an instant. The grating noise all around you builds to a fevered pitch as it drowns out the automated warnings.^^ A few seconds later comes a thunderous boom, followed by darkness, and finally silence.^^ When you regain consciousness you are in possession of the single worst headache you can remember. Granted, this is the "; style bold; print "only"; style roman; print" headache you can remember having. Other than the bump on your head, you can vaguely remember a dream of your mother... and very little else...^"; return true; ]; !========================================================================= ! HINT SECTION STARTS HERE !========================================================================= class Hintobj with hints_seen 0, hint_done 0, the_hints "Hints go Here", description [; self.showhints(); rtrue; ], showhints [ max i k; max = (self.#the_hints / 2); for (i = 1: (i <= max): i++) { if ((i==1) && ((max > 1) && (self.hints_seen < max))) print "There are ", (LanguageNumber) max, " increasingly clear \ hints. Press H for another hint, any other key to quit.^^^"; print "(", i, "/", max, ") "; print (string) (self.&the_hints-->(i-1)); new_line; new_line; ! How many times through this loop? That is the number of the current ! hint. Starting with 1 = 0 hints_seen. if (self.hints_seen == (i-1)) self.hints_seen = self.hints_seen + 1; ! Only call read_char if currently on the last hint seen and ! skip on the very last hint. if ((i < max) && (i == self.hints_seen)) { @read_char 1 0 0 k; if (k ~= 'H' or 'h') return; } } ]; [ HintReady h; h.hints_seen = 0; if ((h.hint_done == 0) && (h hasnt general)) { give h general; move h to Hints; } ]; !Removes old hints. This never need be called. Depends how sensitive one wants one's hint system. Old hints can remain on the help screen. Would also be called in game code for each hint. ![ HintDone h; ! if (~~(h.hint_done)) ! { h.hint_done = 1; ! if (h in Hints) remove h; ! } !]; Menu -> Hints "IDENTITY - Hint System"; Option Hint_cryotube "How do I get out of the cryotube?" class Hintobj with the_hints "Be sure to examine everything in the tube..." "... including yourself." "You will need to use the COMPUCOM to get out of the tube." "Use the COMPUCOM to interface to the control panel within the cryotube." "The command is COMPUCOM, INTERFACE TUBE"; Option Hint_Fire "What's the deal with the fire and smoke?" class Hintobj with the_hints "You should really put the fire out!" "There is a device you need to put it out." "Check the emergency supplies cabinet." "After the smoke clears, better have a look around."; Option Hint_Emergencies "What's with all the stuff in the emergency supply cabinet?" class Hintobj with the_hints "Some of it may be useful, some of it may not." "Better take it all just to be sure!"; Option Hint_EscapePod "How do I get out of the main cabin of the spacecraft?" class Hintobj with the_hints "You have looked carefully at the room after you put the fire out, right?" "There is an upper hatch which is different than the lower hatch (this one is now on the ceiling)." "The upper hatch is too far up to jump." "You will need to stand on something." "There must be something in the room that you can climb on." "Try climbing onto the cryotubes - you can reach the upper hatch from there." "The upper hatch leads to Escape Pod 2"; Option Hint_EscapePodUse "How do I use the escape pod?" class Hintobj with the_hints "Enter the escape pod and read the emergency instructions found there." "Follow the instructions carefully." "Close the hatch. Sit in the chair. Insert the strap into the receptacle. Pull handle."; Option Hint_Vegetation "Is there anything special about the Vegetation outside the spacecraft?" class Hintobj with the_hints "Perhaps you should examine it." "Delicious Berries! Maybe..." "Better SCAN the berries with the COMPUCOM" "The blue berries contain a natural sleep agent, the red berries are poisionous."; Option Hint_CrashSite "Can I get back into the spacecraft once I'm outside?" class Hintobj with the_hints "Yes." "You can climb the spacecraft, go Up or simply try to ENTER spacecraft."; Option Hint_Engine "What do I do about the toxic gas?" class Hintobj with the_hints "Better not breathe it!" "The gas has the effect of rendering humans or animals unconcious." "Try taking it with a container." "You will need the specimen jar to take the gas (found in the supply closet of the spacecraft)."; Option Hint_Mountain "How do I get across the mountains?" class Hintobj with the_hints "You will need to make use of the mountain yak." "In order to use the yak to travel, you will need to ride it." "Once you are riding the yak, you can enter the mountain range."; Option Hint_yak "What do I do with the mountain yak?" class Hintobj with the_hints "First of all, the mountain yak is not hungry. Feeding won't help." "But there is something wrong with the yak. You get a clue by trying to ride it." "Try to examine the mountain yak." "You will need to examine the yak's foot." "And remove the splinter you found there." "Using the Tweezers (first aid kit)." "But first you must put the yak to sleep." "Unfortunately, the yak won't eat the natural-sleep-inducing blue berries." "By using the gas found south of the crashed spacecraft (near the engine) you can put the yak to sleep." "Take some gas in the specimen jar and open it near the yak - then remove the splinter and ride the yak across the mountains."; Option Hint_Radio "How do I work the radio-transmitter?" class Hintobj with the_hints "The wiring is shot and the interface board damaged. But the interface board has already been replaced." "The new interface board needs to have wires hooked up. Try CONNECT Ax TO Jxxx to connect wires to jumpers." "You will need a Schematic." "The Schematic was on the parchment that was stowed in the cabinet in the spacecraft you crashed in." "Unfortunately, the Schematic you have is ~Rev J~ and the new interface board is ~Rev K~." "But there are only 2 extra connections on the ~Rev K~ board. Try the combinations." "Keep in mind that there are only 2 extra jumper connections shown on the interface panel ~Delay~ and ~Select~." "The extra 2 connections that you need to make (beyond those shown on the ~Rev J~ Schematic) are wire A8 to jumper J116 (Delay) and wire A9 to jumper J235 (Select)." "Once you get the radio connections, you need to close the panel to put the fuse in circuit." "And then you can set your frequency and transmit a message."; Option Hint_Radio2 "Once I have the radio working, what frequency do I use to transmit?" class Hintobj with the_hints "Kanera had some frequencies written down in his journal." "Which he left back in his escape pod." "You'll need to go to the sacred grounds near the village to find it."; Option Hint_Kanera "What do I do with the dead man on the cliff?" class Hintobj with the_hints "Examine him." "You knew this man once. Your memories continue to surface after looking at him. But otherwise you don't need to bother with him."; Option Hint_Village "What do I do at the village?" class Hintobj with the_hints "Look around the village, there might be something useful here." "Enter each of the three huts and ask some questions to the people you meet." "There is also the mysterious path to the east that leads off into the forest thicket." "But you can't get by without the village seal."; Option Hint_VillageElder "What do I do with the village elder?" class Hintobj with the_hints "He is wise. Try asking him some questions." "He has the ability to grant you access to the Sacred Grounds." "He has the Sacred Seal that you need to grant access to the Sacred Grounds." "You will need to give him something in exchange for the Seal." "He is still a villager and is in need of tools for the Harvest." "Give the Elder the shovel (found in the emergency closet of the spacecraft)."; Option Hint_Woman "What do I do with the village woman?" class Hintobj with the_hints "She is helpful. Ask her some questions." "Take the Silver Pitcher (she will gladly let you have it) and if you need more water, come back to see her for a refill."; Option Hint_Boy "What do I do with the village boy?" class Hintobj with the_hints "He is truthful. Ask him some questions." "Ask him about the village elder, the village seal, the sacred grounds and about the guards."; Option Hint_SacredGrounds "How do I get by the guard at the sacred grounds?" class Hintobj with the_hints "He is very alert and will not let you pass unless you can immobilize him." "He is very thirsty..." "You will need the pitcher of water that you can obtain from the woman in the medium village hut." "But quenching his thirst is not enough to get by, you must put him to sleep." "Put some of the blue berries (that you found near the yak) into the water. He will drink and soon fall asleep. Then enter the escape pod."; Option Hint_Journal "What do I do with the journal?" class Hintobj with the_hints "This journal was owned by Kanera - it may have some valuable information in it." "The frequency you need to work the radio and call for help is found in the journal." "One of the frequencies is for the Stellar Patrol (SP). That's the one you need to get off this planet."; Option Hint_RadioForHelp "How do I use the radio to get off this planet?" class Hintobj with the_hints "You must have the radio fixed and working." "Once working, you can dial in a frequency and try the transmit command with the radio." "The frequency you need is in the escape pod that landed at the Sacred Grounds." "Check the Journal for the correct frequency." "There are two frequencies listed. One of them won't get you off the planet." "The frequency you need to set is 8142 (SP=Stellar Patrol). Then use the RADIO, TRANSMIT command."; !========== End of Hints Section ========================================= !========================================================================= !Replacement Functions for Standard Library !We use a % complete in the status line. !========================================================================= [ DrawStatusLine width posa posb; if (invisible_status) { @split_window 0; return; } @split_window 1; @set_window 1; @set_cursor 1 1; style reverse; width = 0->33; posa = width-36; posb = width-13; spaces (width); @set_cursor 1 2; PrintShortName(location); if (width > 76) { @set_cursor 1 posa; print "Complete: ", sline1, "%"; @set_cursor 1 posb; print "Moves: ", sline2; } if (width > 63 && width <= 76) { @set_cursor 1 posb; print sline1, "/", sline2; } @set_cursor 1 1; style roman; @set_window 0; ]; !========================================================================= !Standard and extended Grammar !========================================================================= Include "Grammar"; verb meta 'info' 'information' 'credits' 'about' * -> Help * noun -> Help; verb 'help' * -> Help * noun -> Help; Verb 'talk' * 'to' animate -> Talk; Verb meta 'bug' * -> Bug * topic -> Bug; Verb 'compliment' * -> Compliment * animate -> Compliment; Verb meta 'hint' 'hints' 'clue' 'invisiclue' 'walkthru' 'walkthrough' * -> Hints; Verb 'identity' * -> Identity; Verb 'extinguish' * noun -> Extinguish * noun 'with' noun -> Extinguish; Verb 'scan' * noun -> Scan * topic -> Scan; Verb 'laser' 'lazer' * noun -> Laser * topic -> Laser; Verb 'interface' * 'with' noun -> Interface * noun -> Interface * topic -> Interface; Verb 'dial' * number -> Dial; Verb 'frequency' * number -> Dial; Verb 'transmit' * -> Transmit * topic -> Transmit; Verb 'remember' 'recall' * -> Remember; Extend 'put' first * noun 'to' 'sleep' 'using'/'with' noun=Gaseous ->PutToSleepWith * noun 'to' 'sleep' ->PutToSleepHelp * 'out' noun -> Extinguish * 'out' noun 'using' noun -> Extinguish * 'out' noun 'with' noun -> Extinguish; Extend 'stand' replace * -> Exit * 'up' -> Exit * 'on'/'upon' noun -> Climb; Extend 'jump' * noun -> Climb * 'to'/'down' 'to' noun -> Climb * 'to' noun -> Climb * 'on'/'upon' noun -> Climb * 'up' 'to' -> Climb; Extend 'get' first * 'on'/'onto' noun -> Climb * 'out' -> Exit * 'out' 'of' noun -> Exit * 'up' -> Exit * 'up' 'from' noun -> Exit; Extend 'get' * noun 'with'/'using' noun -> Remove; Extend 'sit' * 'down' 'on' noun -> Enter * 'down' 'in' noun -> Enter; !Extend 'exit' first ! * noun -> Exit; Extend 'climb' first * 'up'/'on'/'onto' noun -> Climb * 'to' noun -> Climb * 'up' 'to' noun -> Climb; Verb 'mount' * noun -> Climb; Verb 'dismount' * noun=MountableItem -> Exit; Extend 'remove' first * noun=SplinterObj -> Remove * noun=SplinterObj 'with'/'using' noun -> Remove; Extend 'remove' first * 'belt' -> RemoveBelt * 'boots' -> RemoveBoots * 'boot' -> RemoveBoots * 'shirt' -> RemoveShirt * 'pants' -> RemovePants; Extend 'take' * noun 'with'/'using' noun -> Take; Extend 'take' first * 'off' 'belt' -> RemoveBelt * 'off' 'boots' -> RemoveBoots * 'off' 'boot' -> RemoveBoots * 'off' 'shirt' -> RemoveShirt * 'off' 'pants' -> RemovePants; Extend 'take' * noun 'using' noun -> TakeWith * noun 'with' noun -> TakeWith; Extend 'look' * 'at' 'uniform' ->ExamineUniform * 'at' 'boots' -> ExamineBoots * 'at' 'boot' -> ExamineBoots * 'at' 'belt' -> ExamineBelt * 'at' 'shirt' -> ExamineShirt * 'at' 'pants' -> ExaminePants; Extend 'examine' * 'uniform' -> ExamineUniform * 'boots' -> ExamineBoots * 'boot' -> ExamineBoots * 'belt' -> ExamineBelt * 'shirt' -> ExamineShirt * 'stripe' -> ExamineShirt * 'pants' -> ExaminePants; Extend 'cut' * noun 'using' noun -> TakeWith * noun 'with' noun -> TakeWith; Verb 'pour' * noun -> Empty * noun 'from'/'using' noun -> Empty; Extend 'fill' * noun 'with' noun=Gaseous -> Fill * noun 'with' noun -> Fill * noun 'at'/'from' noun -> EmptyT reverse; Extend only 'fix' replace * noun -> Repair; Verb 'repair' * noun -> Repair; Verb 'use' * noun -> Use; Extend 'unlock' first * noun -> Unlock; Verb 'ride' * noun -> Ride; Verb 'anesthetize' * noun -> PutToSleepHelp * noun 'with'/'using' noun=Gaseous -> PutToSleepWith; Verb 'connect' 'route' 'jumper' * noun 'to' noun -> Connect; Verb 'disconnect' 'unbuckle' 'unattach' 'unhook' * noun 'from' noun -> Disconnect; Extend 'dig' first * 'with'/'using' noun -> DigWithShovel * noun 'with'/'using' noun -> DigWithShovel; Extend 'open' * noun 'under' noun -> Open * noun 'near' noun -> Open; Verb 'pet' * noun -> Pet; Verb 'hum' * -> Hum; Extend 'set' * noun topic -> SetToSpecial; Extend 'remove' first * noun=ReceptacleThingy 'from' noun=ReceptacleThingy -> RemoveStraps; Verb 'release' 'untie' * noun=Gaseous -> Empty * noun=ReceptacleThingy 'from' noun=ReceptacleThingy -> RemoveStraps * -> RemoveStraps; Verb 'secure' 'buckle' * noun=ReceptacleThingy 'to' noun=ReceptacleThingy -> SecureStraps * -> SecureStraps; Verb 'refill' * noun -> Refill * noun 'with' noun -> Fill; Extend 'cover' * noun 'with'/'using' noun -> Close; Verb 'block' * noun -> Block * noun 'with'/'using' noun -> Block; Extend 'pick' * noun -> Take; Verb 'thank' * noun -> Thank; !========================================================================= !End of Adventure !=========================================================================