| ! ---------------------------------------------------------------------------- | |
| ! Museum 961111 One of the standard Inform 6 example games | |
| ! | |
| ! created: 20.12.95 | |
| ! translated to Inform 6: 11.11.96 | |
| ! | |
| ! This "game" is a compendium of solved exercises from the Designer's | |
| ! Manual. Room numbers are section numbers within the Third Edition. | |
| ! Many of these exercises are difficult, and so is some of the code below. | |
| ! ---------------------------------------------------------------------------- | |
| Constant Story "MUSEUM OF INFORM"; | |
| Constant Headline | |
| "^An Interactive Companion to the Designer's Manual (Third Edition)^"; | |
| ! The game is meant to be experimented with, so we always define: | |
| Constant DEBUG; | |
| Release 2; | |
| Serial "961111"; | |
| Replace DrawStatusLine; | |
| Include "Parser"; | |
| ! -------------------------------------------------------------------------- | |
| Object samples_bag "samples bag" | |
| with description "A capacious SACK_OBJECT (see section 20).", | |
| name "samples" "bag", article "your", | |
| when_closed "Your samples bag lies on the floor.", | |
| when_open "Your samples bag lies open on the floor.", | |
| has container open openable; | |
| Constant SACK_OBJECT = samples_bag; | |
| Include "VerbLib"; | |
| ! -------------------------------------------------------------------------- | |
| Attribute crewmember; | |
| Property weight 10; | |
| Class Key with name "key"; | |
| ! -------------------------------------------------------------------------- | |
| Object Foyer "Foyer" | |
| has light | |
| with description | |
| "The foyer of the magnificent Museum of Inform. A flight of | |
| stairs sweeps upward to Chapters V and VI, and corridors | |
| fan out on this level into Chapter IV. These run:^ | |
| ^ north into Room 10 (the Halls of Sense and Direction), | |
| ^ south along Corridor 12 (doors) to Room 13 (switches), | |
| ^ @00 to Room 11 (the Wonderful World of Containers) | |
| ^ and @01 to Room 14 (which houses larger exhibits).^^ | |
| (And a plain ladder descends into the basement; you can also | |
| step out onto a balcony.)", | |
| e_to Room11, u_to Second_Floor, n_to Room10, | |
| s_to Corridor12, w_to Room14, | |
| d_to basement, out_to balcony; | |
| Object -> "map" | |
| with name "map" "ground" "floor", | |
| initial "A map of the ground floor is embossed in one wall.", | |
| description | |
| [; font off; | |
| "^+------------------------------------------+ | |
| ^| (mirror) | | |
| ^| Weights Room 10 --- Room 10a | | |
| ^| Room senses directions | | |
| ^| | | | | |
| ^| Room 14 --- Foyer --- Room 11 | | |
| ^| (changing (you are here) containers | | |
| ^| character) | | | |
| ^| | | | |
| ^| Room 15 --- Corridor 12 | | |
| ^| (MS room) (door, curator) | | |
| ^| (Bible) | | | |
| ^| Switches Hall 13 | | |
| ^| (chasm) | | |
| ^| | | | |
| ^| Far Side of Room 13 | | |
| ^+------------------------------------------+^"; | |
| font on; | |
| ], | |
| has static; | |
| ! -------------------------------------------------------------------------- | |
| Object basement "Museum Basement" | |
| with u_to Foyer, | |
| description | |
| "Once Room 17, this space has been abandoned by the curators, | |
| who have simply sprayed its walls with moth-repellent and | |
| abandoned it.", | |
| before | |
| [; Smell: "Napthalene."; | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Object Room10 "Hall of Senses" | |
| with description | |
| "This is Room 10, north of the foyer. If you try going further | |
| north, a string will be printed instead. The exit to the @00 | |
| has a routine attached, and randomly leads either to the | |
| Directions Room or back to the foyer.", | |
| s_to Foyer, | |
| n_to "This string is the ~n_to~ value for this room.", | |
| e_to | |
| [; if (random(2)==1) return Foyer; return Room10a; ], | |
| has light; | |
| Object -> "TRAP lever" | |
| with name "trap" "lever", | |
| before | |
| [; Pull, Push: | |
| if (self has on) <<SwitchOff self>>; | |
| <<SwitchOn self>>; | |
| ], | |
| after | |
| [; SwitchOn: move orange_cloud to location; | |
| "Clunk! An orange cloud suddenly descends upon you."; | |
| SwitchOff: remove orange_cloud; | |
| "Click! The orange cloud vanishes."; | |
| ], | |
| has switchable static; | |
| Object -> "gold watch" | |
| with name "gold" "watch", | |
| description "The watch has no hands, oddly.", | |
| react_before | |
| [; Listen: if (noun==0 or self) "The watch ticks loudly."; ]; | |
| Object -> "sprig of lavender" | |
| with name "sprig" "of" "lavender", | |
| react_before | |
| [; Smell: if (noun==0 or self) "Lavender-perfume. Ahh!"; ]; | |
| Object orange_cloud "orange cloud" | |
| with name "orange" "cloud", | |
| react_before | |
| [; Look: "You can't see for the orange cloud surrounding you."; | |
| Go, Exit: "You wander round in circles, choking."; | |
| Smell: if (noun==0 or self) "Cinnamon? No, nutmeg."; | |
| ], | |
| has scenery; | |
| ! -------------------------------------------------------------------------- | |
| ! For east-west reflection | |
| ! -------------------------------------------------------------------------- | |
| Lowstring east_str "east"; Lowstring west_str "west"; | |
| [ NormalWorld; string 0 east_str; string 1 west_str; | |
| e_obj.door_dir = e_to; w_obj.door_dir = w_to; | |
| ]; | |
| [ ReversedWorld; string 0 west_str; string 1 east_str; | |
| w_obj.door_dir = e_to; e_obj.door_dir = w_to; | |
| ]; | |
| Object Room10a "Hall of Directions" | |
| with name "mirror", | |
| description | |
| "An annexe to Room 10: the main exit is back @01, and there's a | |
| curiously misty mirror on the north wall. Also, there's an exit | |
| in the fourth, ~hyper~ dimension (which is only visible in the | |
| weird geometry of this room).", | |
| initial | |
| [; move hyper to compass; StartDaemon(hyper); | |
| ], | |
| w_to Room10, | |
| n_to | |
| [; print "Walking through the mirror is confusing...^"; | |
| if (self has general) NormalWorld(); else ReversedWorld(); | |
| if (self has general) give self ~general; else give self general; | |
| <<Look>>; | |
| ], | |
| in_to [; print "Amazing! Your body corkscrews as you pass.^"; | |
| return Room11; ], | |
| has light; | |
| Object hyper "hyper-dimensional direction" | |
| with name "hyper" "fourth" "dimension", article "the", door_dir in_to, | |
| daemon | |
| [; if (location ~= Room10a) { remove self; StopDaemon(self); } | |
| ], | |
| has scenery; | |
| ! -------------------------------------------------------------------------- | |
| Object Room11 "Wonderful World of Containers" | |
| with description | |
| "This is Room 11, @00 of the foyer. You notice a typical piece | |
| of scenery which turns out to be a supporter: a mantelpiece.", | |
| w_to Foyer, | |
| has light; | |
| Object -> "bearded psychiatrist" | |
| with name "bearded" "doctor" "psychiatrist" "psychologist" "shrink", | |
| initial "A bearded psychiatrist has you under observation.", | |
| life | |
| [; "He is fascinated by your behaviour, but makes no attempt to | |
| interfere with it."; | |
| ], | |
| react_after | |
| [; Insert: print "~Subject puts ", (a) noun, " in ", (the) second, | |
| ". Interesting.~^"; | |
| PutOn: print "~Subject puts ", (a) noun, " in ", (the) second, | |
| ". Interesting.~^"; | |
| ], | |
| react_before | |
| [; Take, Remove: print "~Subject feels lack of ", (the) noun, | |
| ". Suppressed Oedipal complex? Mmm.~^"; | |
| ], | |
| has animate; | |
| Object -> "mantelpiece" | |
| with name "mantel" "mantle" "piece" "mantelpiece" | |
| has scenery supporter; | |
| Object -> "green ball" with name "green" "ball"; | |
| Object -> "red cone" with name "red" "cone"; | |
| Object -> "blue pyramid" with name "blue" "pyramid"; | |
| Object -> "plain shopping bag (which can only hold 2 things)" | |
| with name "plain" "shopping" "bag", capacity 2, | |
| has container open; | |
| Object -> "glass box with a lid" with name "glass" "box" "with" "lid" | |
| has container transparent openable open; | |
| Object -> "steel box with a lid" with name "steel" "box" "with" "lid" | |
| has container openable open; | |
| Key -> bolted_key "bolted key" with name "bolted"; | |
| Object -> "toothed bag" | |
| with name "toothed" "bag", | |
| description "A capacious bag with a toothed mouth.", | |
| before | |
| [; LetGo: "The bag defiantly bites itself | |
| shut on your hand until you desist."; | |
| Close: "The bag resists all attempts to close it."; | |
| ], | |
| after | |
| [; Receive: | |
| "The bag wriggles hideously as it swallows ", | |
| (the) noun, "."; | |
| ], | |
| has container open; | |
| Object -> "bolted cupboard" | |
| with name "bolted" "cupboard", | |
| describe | |
| [; if (self hasnt open) | |
| "^A pretty typical shut cupboard is bolted to one wall."; | |
| "^Bolted up on one wall is an open cupboard."; | |
| ], | |
| with_key bolted_key | |
| has locked container openable lockable static; | |
| Object -> "portable television set" | |
| with name "tv" "television" "set" "portable", | |
| initial "A portable television set has two sub-objects attached: | |
| a power button and a screen.", | |
| before | |
| [; SwitchOn: <<SwitchOn power_button>>; | |
| SwitchOff: <<SwitchOff power_button>>; | |
| Examine: <<Examine screen>>; | |
| ], | |
| has transparent; | |
| Object -> -> power_button "power button" | |
| with name "power" "button" "switch", | |
| after | |
| [; SwitchOn, SwitchOff: <<Examine screen>>; | |
| ], | |
| has switchable; | |
| Object -> -> screen "television screen" | |
| with name "screen", | |
| before | |
| [; Examine: if (power_button hasnt on) "The screen is black."; | |
| "The screen writhes with a strange Japanese cartoon."; | |
| ]; | |
| Object -> "macrame bag" | |
| with name "macrame" "bag" "string" "net" "sack", | |
| react_before | |
| [; Examine, Search, Listen, Smell: ; | |
| default: | |
| if (inp1>1 && inp1 in self) | |
| print_ret (The) inp1, " is tucked away in the bag."; | |
| if (inp2>1 && inp2 in self) | |
| print_ret (The) inp2, " is tucked away in the bag."; | |
| ], | |
| describe | |
| [; print "^A macrame bag hangs from the ceiling, shut tight"; | |
| if (child(self)==0) "."; | |
| print ". Inside you can make out "; | |
| WriteListFrom(child(self), ENGLISH_BIT); "."; | |
| ], | |
| has container transparent static; | |
| Object -> -> "music box" | |
| with name "music" "box" "musical", | |
| description "Attractively lacquered.", | |
| react_before | |
| [; Listen: if (noun==0 or self) | |
| "The musical box chimes some Tchaikovsky."; ]; | |
| ! -------------------------------------------------------------------------- | |
| Object Corridor12 "Corridor 12" | |
| with description | |
| "Runs south of the foyer. A side exit leads @01 to Room 15, | |
| the manuscripts room.", | |
| n_to Foyer, s_to Oak_Door, w_to Room15, | |
| has light; | |
| Object -> "sinister curator" | |
| with name "sinister" "curator", | |
| initial | |
| [; if (self hasnt general) | |
| "A sinister curator leans against the wall, asleep."; | |
| "The curator is here, casting menacing looks."; | |
| ], | |
| daemon | |
| [ i p j n k; | |
| if (random(3)~=1 || self hasnt general) rfalse; | |
| p=parent(self); | |
| objectloop (i in compass) | |
| { j=p.(i.door_dir); | |
| if (ZRegion(j)==1 && j hasnt door) n++; | |
| } | |
| if (n==0) rfalse; | |
| k=random(n); n=0; | |
| objectloop (i in compass) | |
| { j=p.(i.door_dir); | |
| if (ZRegion(j)==1 && j hasnt door) n++; | |
| if (n==k) | |
| { move self to j; | |
| if (p==location) "^The curator stalks away."; | |
| if (j==location) "^The curator stalks in."; | |
| rfalse; | |
| } | |
| } | |
| ], | |
| orders | |
| [; if (self hasnt general) "The curator only snores."; | |
| "He raises a skeletal finger to his lips. ~Shh!~"; | |
| ], | |
| life | |
| [; WakeOther: | |
| if (self hasnt general) | |
| { give self general; move self to Foyer; | |
| "He wakes and rouses to his feet, pushes past you | |
| and stalks away."; | |
| } | |
| default: "He rears back with disdain."; | |
| ], | |
| has animate; | |
| Object Oak_Door "oaken door" | |
| with name "oak" "door" "oaken", | |
| description "Despite appearances, there is no key to this door.", | |
| door_dir | |
| [; if (location==Corridor12) return s_to; return n_to; ], | |
| door_to | |
| [; if (location==Corridor12) return Room13; return Corridor12; ], | |
| describe | |
| [; if (self has open) "^The oaken door stands open."; | |
| if (self hasnt locked) "^The corridor ends in an oaken door."; | |
| ], | |
| found_in Corridor12 Room13 | |
| has static door openable lockable; | |
| ! -------------------------------------------------------------------------- | |
| Object Room15 "Manuscripts Room" | |
| with description | |
| "This is Room 15, adjoining a corridor to the @00.", | |
| e_to Corridor12, | |
| has light; | |
| Object -> "black Tyndale Bible" | |
| with name "bible" "black" "book", | |
| initial "A black Bible rests on a spread-eagle lectern.", | |
| description "A splendid foot-high Bible, which must have survived | |
| the burnings of 1520.", | |
| before | |
| [ w x; Consult: | |
| wn = consult_from; w = NextWord(); | |
| switch(w) | |
| { 'matthew': x="Gospel of St Matthew"; | |
| 'mark': x="Gospel of St Mark"; | |
| 'luke': x="Gospel of St Luke"; | |
| 'john': x="Gospel of St John"; | |
| default: "There are only the four Gospels."; | |
| } | |
| if (consult_words==1) | |
| "You read the ", (string) x, " right through."; | |
| w = TryNumber(wn); | |
| if (w==-1000) | |
| "I was expecting a chapter number in the ", | |
| (string) x, "."; | |
| "Chapter ", (number) w, " of the ", (string) x, | |
| " is too sacred for you to understand now."; | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Object Room13 "Switches Hall" | |
| with description | |
| "This is Room 13, at the south end of a long corridor leading | |
| north. Progress further south is blocked by a chasm.", | |
| n_to Oak_Door, s_to PlankBridge, | |
| has light; | |
| Object -> "Gotham City searchlight" | |
| with name "gotham" "city" "search" "light" "template" "searchlight", | |
| article "the", | |
| description "It has some kind of template on it.", | |
| when_on "The old city searchlight shines out a bat against | |
| the alabaster ceiling of the Museum.", | |
| when_off "The old Gotham city searchlight has been lovingly | |
| restored and housed here." | |
| has switchable static; | |
| Object -> "basement light switch" | |
| with name "basement" "light" "switch", | |
| after | |
| [; SwitchOn: give basement light; "Click!"; | |
| SwitchOff: give basement ~light; "Click!"; | |
| ], | |
| has switchable static; | |
| Object -> PlankBridge "plank bridge" | |
| with description "Extremely fragile and precarious.", | |
| name "precarious" "fragile" "wooden" "plank" "bridge", | |
| when_open | |
| "A precarious plank bridge spans the chasm.", | |
| door_to | |
| [; if (children(player)~=0) | |
| { deadflag=1; | |
| "You step gingerly across the plank, which bows under | |
| your weight. But your meagre possessions are the straw | |
| which breaks the camel's back! There is a horrid crack..."; | |
| } | |
| print "You step gingerly across the plank, grateful that | |
| you're not burdened.^"; | |
| if (location==Room13) return FarSide; return Room13; | |
| ], | |
| door_dir | |
| [; if (location==Room13) return s_to; return n_to; | |
| ], | |
| found_in Room13 FarSide, | |
| has static door open; | |
| Object FarSide "Far Side of Chasm in Room 13" | |
| with description | |
| "This side of the chasm is dull and dusty after all.", | |
| n_to PlankBridge, | |
| has light; | |
| ! -------------------------------------------------------------------------- | |
| Object Room14 "Large Exhibits Room" | |
| with description | |
| "This is Room 14, @01 of the foyer, which gives onto the Weights | |
| Room to the north.", | |
| e_to Foyer, n_to Weights_Room, | |
| has light; | |
| Object -> "hypnotic portrait" | |
| with name "hypnotic" "portrait" "warthog" "picture" "of" "hog", | |
| initial "A somewhat hypnotic full-length portrait of a warthog hangs | |
| on the wall.", | |
| before | |
| [; Examine: <Examine hog>; print "^...and somehow, so do you...^"; | |
| ChangePlayer(hog); <<Look>>; | |
| ], | |
| has static; | |
| Object -> "Louis XV chair" | |
| with name "louis" "xv" "quinze" "chair", | |
| initial "A valuable Louis XV chair takes pride of place.", | |
| has enterable supporter; | |
| Object -> car "little red car" | |
| with name "little" "red" "car" "kar1", | |
| description "Large enough to sit inside. Among the controls is a | |
| prominent on/off switch. The numberplate is KAR 1.", | |
| when_on "The red car sits here, its engine still running.", | |
| when_off "A little red car is parked here.", | |
| before | |
| [; PushDir: AllowPushDir(); rtrue; | |
| Go: if (car has on) { Achieved(1); "Brmm! Brmm!"; } | |
| print "(The ignition is off at the moment.)^"; | |
| ], | |
| after | |
| [; PushDir: "The car rolls very slowly as you push it."; | |
| ], | |
| has switchable enterable static container open; | |
| Object -> -> "small note" | |
| with name "small" "note", | |
| description | |
| " !!!! FROBOZZ MAGIC CAR COMPANY !!!!^ | |
| ^Hello, Driver!^ | |
| ^Instructions for use:^ | |
| ^Switch on the ignition and off you go!^ | |
| ^Warranty:^ | |
| ^This car is guaranteed against all defects for a period of | |
| 76 milliseconds from date of purchase or until used, | |
| whichever comes first.^ | |
| ^Good Luck!"; | |
| Object -> "Giant" | |
| with name "giant", | |
| initial "A Giant is here. (And you know the old legend... push a | |
| Giant, become a Giant!)", | |
| before | |
| [; Push: ChangePlayer(self); <<Look>>; | |
| Take: rtrue; | |
| ], | |
| number 0, | |
| orders | |
| [; if (player==self) | |
| { if (actor~=self) | |
| "You only become tongue-tied and gabble."; | |
| if (action==##Push && noun==selfobj) | |
| { ChangePlayer(selfobj); <<Look>>; } | |
| rfalse; | |
| } | |
| Attack: "The Giant looks at you with doleful eyes. | |
| ~Me not be so bad!~"; | |
| default: "The Giant is unable to comprehend your instructions."; | |
| ], | |
| has animate; | |
| ! -------------------------------------------------------------------------- | |
| Object "Caldera" | |
| with description | |
| "An old volcanic crater of mud and ash, from which there is | |
| nowhere to go.", | |
| has light; | |
| Object -> hog "Warthog" | |
| with name "wart" "hog" "warthog", | |
| description "Muddy, sniffing and grunting.", | |
| number, | |
| orders | |
| [; if (player~=self || actor~=self) rfalse; | |
| ! So now we have just the case where the player | |
| ! is currently the warthog, ordering himself about: | |
| Go, Look, Examine, Eat, Smell, Taste, Touch: rfalse; | |
| default: "Warthogs can't do anything as tricky as that!"; | |
| ], | |
| has animate proper; | |
| Object -> "red berry" | |
| with name "red" "berry" "magic", | |
| initial "A magic red berry is half-uncovered in the mud.", | |
| before | |
| [; Smell, Taste, Touch: | |
| print "The blood-smell of the berry brings you back, | |
| back...^"; | |
| ChangePlayer(selfobj); <<Look>>; | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Constant CARRYING_STRENGTH = 500; | |
| Constant HEAVINESS_THRESHOLD = 100; | |
| Object Weights_Room "Weights Room" | |
| with description | |
| "This is an annexe, south of Room 14. In here (though nowhere | |
| else) objects have given weights, and | |
| you can carry only a limited total weight. (Items from elsewhere | |
| in the museum all weigh 10 zobs, regardless of what they are.) | |
| The longer you carry heavy objects, the more tired you become, | |
| until you're forced to drop them; your strength recovers once | |
| you're carrying only a light load.", | |
| initial [; weight_monitor.activate(); ], | |
| s_to Room14, | |
| has light; | |
| Object -> "feather" with name "feather", weight 1; | |
| Object -> "iron anvil" with name "iron" "anvil", article "an", weight 300; | |
| Object -> "five-zob weight" with name "five" "zob" "weight", weight 5; | |
| Object -> "ten-zob weight" with name "ten" "zob" "weight", weight 10; | |
| Object -> "twenty-zob weight" with name "twenty" "zob" "weight", weight 20; | |
| Object -> "fifty-zob weight" with name "fifty" "zob" "weight", weight 50; | |
| Object -> "hundred-zob weight" with name "hundred" "zob" "weight", weight 100; | |
| [ WeightOf obj t i; | |
| t = obj.weight; | |
| objectloop (i in obj) t = t + WeightOf(i); | |
| return t; | |
| ]; | |
| Object weight_monitor | |
| with | |
| players_strength, | |
| warning_level 5, | |
| activate | |
| [; self.players_strength = CARRYING_STRENGTH; StartDaemon(self); | |
| ], | |
| daemon | |
| [ w s b bw; | |
| if (location ~= Weights_Room) { StopDaemon(self); return; } | |
| s = self.players_strength | |
| - WeightOf(player) + HEAVINESS_THRESHOLD; | |
| if (s<0) s=0; if (s>CARRYING_STRENGTH) s=CARRYING_STRENGTH; | |
| self.players_strength = s; | |
| if (s==0) | |
| { bw=-1; | |
| objectloop(b in player) | |
| if (WeightOf(b) > bw) { bw = WeightOf(b); w=b; } | |
| self.players_strength = self.players_strength + bw; | |
| print "^Exhausted with carrying so much, you decide | |
| to discard ", (the) w, ": "; <<Drop w>>; | |
| } | |
| w=s/100; if (w==self.warning_level) return; | |
| self.warning_level = w; | |
| switch(w) | |
| { 3: "^You are feeling a little tired."; | |
| 2: "^You possessions are weighing you down."; | |
| 1: "^Carrying so much weight is wearing you out."; | |
| 0: "^You're nearly exhausted enough to drop everything | |
| at an inconvenient moment."; | |
| } | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Constant SUNRISE 360; ! i.e., 6 am | |
| Constant SUNSET 1140; ! i.e., 7 pm | |
| Global day_state = 2; | |
| Object balcony "Balcony" | |
| with description | |
| [; print "An open-air balcony on the cliffside wall of the | |
| cathedral-like Museum, hundreds of feet above "; | |
| if (day_state==1) "sunlit plains of farms and settlements."; | |
| "a darkling plain. Dim light from the walls above is | |
| the only beacon in this vast night."; | |
| ], | |
| in_to Foyer, | |
| cant_go "The only way is back inside.", | |
| each_turn | |
| [ f; | |
| if (the_time >= SUNRISE && the_time < SUNSET) f=1; | |
| if (day_state == f) return; | |
| if (day_state==2) { day_state = f; return; } | |
| day_state = f; | |
| if (f==1) "^The sun rises, illuminating the landscape!"; | |
| "^As the sun sets, the landscape is plunged into darkness."; | |
| ], | |
| has light; | |
| Object -> "giant clock" | |
| with name "giant" "clock" "face" "clockface" "clock-face", | |
| before | |
| [; Examine: "According to the giant clockface on the wall | |
| above, it is now ", the_time/60, ":", (the_time%60)/10, | |
| the_time%10, "."; | |
| default: "The giant clock-face is too high above you."; | |
| ], | |
| react_after [; Look: new_line; <Examine self>; ], | |
| has static concealed; | |
| Object -> moth "moth" | |
| with name "moth", | |
| initial "A catchable moth flits about."; | |
| [ GoMothGo; | |
| if (moth in player) | |
| { remove moth; | |
| "As your eyes try to adjust, you feel a ticklish sensation | |
| and hear a tiny fluttering sound."; | |
| } | |
| ]; | |
| Object -> "Commander Data" | |
| with name "data" "commander", | |
| orders | |
| [; "~I regret that I am only here to make an example work elsewhere. | |
| Please proceed upstairs to 10 Forward to see.~"; | |
| ], | |
| has proper animate crewmember; | |
| ! ========================================================================== | |
| Object Second_Floor "Mezzanine" | |
| with description | |
| "Halfway up the marble staircase of the building, a second floor | |
| mezzanine which leads south into Grammar Hall (an extension | |
| purpose-built for the Room 16 exhibition).", | |
| d_to Foyer, | |
| s_to Grammar_Hall, | |
| u_to Third_Floor, | |
| has light; | |
| Object -> "map" | |
| with name "map" "mezzanine" "level", | |
| initial "A map of the mezzanine level is embossed in one wall.", | |
| description | |
| [; font off; | |
| "^+------------------------------------------+ | |
| ^| | | |
| ^| | | |
| ^| | | |
| ^| | | |
| ^| Mezzanine | | |
| ^| (you are here) | | |
| ^| | | | |
| ^| | | | |
| ^| Grammar Hall 16 | | |
| ^| (telepathy, clock) | | |
| ^| (Charlotte, Dan) --- Ten Forward | | |
| ^| | (replicator) | | |
| ^| Liberator (computer) | | |
| ^| Bridge (tricorder) | | |
| ^| (Zen) | | |
| ^+------------------------------------------+^"; | |
| font on; | |
| ], | |
| has static; | |
| Object -> "Room 16 exhibition leaflet" | |
| with name "leaflet" "exhibition" "guide" "room" "sixteen", | |
| initial "An exhibition leaflet has fallen to the floor.", | |
| description | |
| "Among the rare & fascinating exhibits in Room 16 are:...^^ | |
| Telekinetic (and telepathic) Martha. In the telepathy | |
| booth, you can speak to her as though she were in Room 16 | |
| with you -- but she's not, she is far away. Tell her to | |
| ~look~ to find out where, and you can also ask her to give | |
| you things (by telekinesis).^^ | |
| Charlotte, who is playing Simon Says. She'll obey | |
| instructions you give as long as you preface it with | |
| ~simon says~. (Though she only knows how to wave, or how to | |
| clap many times (just tell her a number).)^^ | |
| Dyslexic Dan knows how to take and drop things and how to | |
| perform an inventory, but unfortunately confuses Take and | |
| Drop orders.^^ | |
| The alarm clock can be told ~on~, ~off~ or a time of day | |
| (to set its alarm to)."; | |
| ! -------------------------------------------------------------------------- | |
| Object Grammar_Hall "Grammar Hall" | |
| has light, | |
| with description | |
| "The main exhibit on the second floor: Room 16, south of the | |
| mezzanine. A Jeffreys Tube runs @00 into a Star Trek: The | |
| Next Generation room, while a hexagonal corridor to the south | |
| leads to the bridge of the spaceship ~Liberator~.", | |
| n_to Second_Floor, e_to Star_Trek, s_to Blakes_Seven; | |
| Object -> booth "telepathy booth" | |
| with name "booth" "telepathy", | |
| initial | |
| "A telepathy booth stands invitingly open: | |
| ~Talk To Telekinetic Martha~.", | |
| has enterable static; | |
| Object -> "Charlotte" | |
| with name "charlotte" "charlie" "chas", | |
| number 0, | |
| grammar | |
| [; give self ~general; | |
| wn=verb_wordnum; | |
| if (NextWord()=='simon' && NextWord()=='says') | |
| { give self general; | |
| verb_wordnum=verb_wordnum+2; | |
| } | |
| self.number=TryNumber(verb_wordnum); | |
| if (self.number~=-1000) | |
| { action=##Clap; noun=0; second=0; rtrue; } | |
| ], | |
| orders | |
| [ i; if (self hasnt general) "Charlotte sticks her tongue out."; | |
| WaveHands: "Charlotte waves energetically."; | |
| Clap: if (self.number==0) "Charlotte folds her arms."; | |
| for (i=0:i<self.number:i++) | |
| { print "Clap! "; | |
| if (i==100) | |
| print "(You must be regretting this by now.) "; | |
| if (i==200) | |
| print "(What a determined girl she is.) "; | |
| } | |
| if (self.number>100) | |
| "^^Charlotte's a bit out of breath now."; | |
| "^^~Easy!~ says Charlotte."; | |
| default: "~Don't know how,~ says Charlotte."; | |
| ], | |
| initial "Charlotte wants to play Simon Says.", | |
| has animate female proper crewmember; | |
| Object -> "Dyslexic Dan" | |
| with name "dan" "dyslexic", | |
| grammar | |
| [; if (verb_word == 'take') { verb_wordnum++; return 'drop'; } | |
| if (verb_word == 'drop') { verb_wordnum++; return 'take'; } | |
| ], | |
| orders | |
| [; | |
| Take: "~What,~ says Dan, ~ you want me to take ", | |
| (the) noun, "?~"; | |
| Drop: "~What,~ says Dan, ~ you want me to drop ", | |
| (the) noun, "?~"; | |
| Inv: "~That I can do,~ says Dan. ~I'm empty-handed.~"; | |
| default: "~Don't know how,~ says Dan."; | |
| ], | |
| initial "Dyslexic Dan is here.", | |
| has animate proper crewmember; | |
| [ PrintTime x; | |
| print (x/60), ":", (x%60)/10, (x%60)%10; | |
| ]; | |
| Object -> "alarm clock" | |
| with name "alarm" "clock", article "an", | |
| number 480, | |
| description | |
| [; print "The alarm is "; | |
| if (self has general) print "on, "; else print "off, but "; | |
| "the clock reads ", (PrintTime) the_time, | |
| " and the alarm is set for ", (PrintTime) self.number, "."; | |
| ], | |
| react_after | |
| [; Inv: if (self in player) { new_line; <<Examine self>>; } | |
| Look: if (self in location) { new_line; <<Examine self>>; } | |
| ], | |
| daemon | |
| [; if (the_time >= self.number && the_time <= self.number+3 | |
| && self has general) "^Beep! Beep! The alarm goes off."; | |
| ], | |
| grammar | |
| [; return 'alarm,'; | |
| ], | |
| orders | |
| [; SwitchOn: give self general; StartDaemon(self); "~Alarm set.~"; | |
| SwitchOff: give self ~general; StopDaemon(self); | |
| "~Alarm cancelled.~"; | |
| SetTo: self.number=noun; <<Examine self>>; | |
| default: "~Commands are on, off or a time of day only, pliz.~"; | |
| ], | |
| life | |
| [; Ask, Answer, Tell: | |
| "[Try ~clock, something~ to address the clock.]"; | |
| ], | |
| has talkable; | |
| ! -------------------------------------------------------------------------- | |
| Object Blakes_Seven "Spaceship Liberator: Bridge" | |
| has light, | |
| with description | |
| "The great serried bridge of the alien spaceship Liberator, | |
| captured by Blake's group of revolutionary criminals on the | |
| run from the oppressive Earth Federation. (Don't worry -- | |
| it's just a convincing replica, and the museum still lies | |
| back north.)", | |
| n_to Grammar_Hall; | |
| Object -> "informative plaque" | |
| with name "informative" "plaque", | |
| article "an", | |
| description | |
| "[Among the commands which Zen was often given by the hard-pressed | |
| Liberator crew were:^^ | |
| zen, scan 360 orbital^ | |
| zen, speed standard by six^ | |
| zen, clear the neutron blasters for firing^ | |
| zen, raise the force wall^ | |
| zen, set course for centauro]", | |
| has static; | |
| Object -> "Zen" | |
| with name "zen" "flight" "computer", | |
| initial | |
| "Square lights flicker unpredictably across a hexagonal fascia | |
| on one wall, indicating that the flight computer Zen is on-line.", | |
| grammar | |
| [; return -'zen,'; | |
| ], | |
| orders | |
| [; Show: "The main screen shows a starfield, | |
| turning through ", noun, " degrees."; | |
| Go: "~Confirmed.~ The ship turns to a new bearing."; | |
| SetTo: if (noun==0) "~Confirmed.~ The ship comes to a stop."; | |
| if (noun>12) "~Standard by ", (number) noun, | |
| " exceeds design tolerances.~"; | |
| "~Confirmed.~ The ship's engines step to | |
| standard by ", (number) noun, "."; | |
| Take: if (noun~=force_wall) "~Please clarify.~"; | |
| "~Force wall raised.~"; | |
| Drop: if (noun~=blasters) "~Please clarify.~"; | |
| "~Battle-computers on line. | |
| Neutron blasters cleared for firing.~"; | |
| NotUnderstood: "~Language banks unable to decode.~"; | |
| default: "~Information. That function is unavailable.~"; | |
| ], | |
| has talkable proper static; | |
| Object -> -> force_wall "force wall" with name "force" "wall" "shields"; | |
| Object -> -> blasters "neutron blasters" with name "neutron" "blasters"; | |
| ! -------------------------------------------------------------------------- | |
| Object "Captain Picard" | |
| with name "captain" "picard", | |
| has proper animate crewmember; | |
| Object Star_Trek "10 Forward" | |
| has light, | |
| with description | |
| "The starswept observation lounge forward of deck 10 | |
| of the Starship Enterprise, where many milkshakes have | |
| been consumed in crisis situations. (It's only a replica, | |
| of course, and the museum lies back @01.)", | |
| w_to Grammar_Hall; | |
| Object -> "informative plaque" | |
| with name "informative" "plaque", | |
| article "an", | |
| description | |
| "[The computer, called just ~computer~, is useful for locating | |
| crew-members: try ~computer, where is commander data~, or | |
| ~...captain picard~, or any of the other people who can be | |
| found in the Museum.^^ | |
| The tricorder will scan something if you tell it the name of | |
| whom or what you wish to scan.^^ | |
| The replicator is a superior drinks machine: for instance, | |
| Captain Picard is fond of saying ~replicator, tea earl grey~. | |
| There's also brandy and distilled water.]", | |
| has static; | |
| Object -> "computer" | |
| with name "computer", | |
| initial "The computer, of course, always responds to your voice here.", | |
| grammar | |
| [; return 'stc,'; | |
| ], | |
| orders | |
| [; Examine: | |
| if (parent(noun)==0) | |
| "~", (name) noun, | |
| " is no longer aboard this demonstration game.~"; | |
| "~", (name) noun, " is in ", (name) parent(noun), ".~"; | |
| default: "The computer's only really good for locating the crew."; | |
| ], | |
| life | |
| [; Ask, Answer, Tell: "The computer is too simple."; | |
| ], | |
| has talkable static; | |
| Object -> "tricorder" | |
| with name "tricorder", | |
| grammar | |
| [; return 'tc,'; | |
| ], | |
| orders | |
| [; Examine: if (noun==player) "~You radiate life signs.~"; | |
| print "~", (The) noun, " radiates "; | |
| if (noun hasnt animate) print "no "; | |
| "life signs.~"; | |
| default: "The tricorder bleeps. It can only accept commands | |
| ~tricorder, <something>~."; | |
| ], | |
| life | |
| [; Ask, Answer, Tell: "The tricorder is too simple."; | |
| ], | |
| has talkable; | |
| Object -> "replicator" | |
| with name "replicator", | |
| initial | |
| "A replicator (i.e. Star Trek drinks machine) occupies a niche | |
| in one wall.", | |
| grammar | |
| [; return 'rc,'; | |
| ], | |
| orders | |
| [; Give: | |
| "The replicator serves up a cup of ", | |
| (name) noun, " which you drink eagerly."; | |
| default: "The replicator is unable to oblige. You must give | |
| it the name of a drink it knows about."; | |
| ], | |
| life | |
| [; Ask, Answer, Tell: "The replicator has no conversation skill."; | |
| ], | |
| has talkable static; | |
| Object -> -> "Earl Grey tea" with name "earl" "grey" "tea"; | |
| Object -> -> "Aldebaran brandy" with name "aldebaran" "brandy"; | |
| Object -> -> "distilled water" with name "distilled" "water"; | |
| ! -------------------------------------------------------------------------- | |
| Object "Sealed Room" | |
| with description | |
| "I'm in a sealed room, like a squash court without a door, | |
| maybe six or seven yards across", | |
| has light; | |
| Object -> "fish" with name "fish"; | |
| Key -> "cadmium key" | |
| with name "cadmium", | |
| after | |
| [; Drop: remove self; "The key smashes into smithereens!"; | |
| ]; | |
| Object -> martha "Martha" | |
| has animate female concealed proper crewmember | |
| with name "martha", | |
| orders | |
| [ r; r=parent(self); | |
| Give: | |
| if (noun notin r) "~That's beyond my telekinesis.~"; | |
| if (noun==self) "~Teleportation's too hard for me.~"; | |
| move noun to player; | |
| "~Here goes...~ and Martha's telekinetic talents | |
| magically bring ", (the) noun, " to your hands."; | |
| Look: | |
| print "~", (string) r.description; | |
| if (children(r)==1) ". There's nothing here but me.~"; | |
| print ". I can see "; | |
| WriteListFrom(child(r),CONCEAL_BIT+ENGLISH_BIT); | |
| ".~"; | |
| default: "~Afraid I can't help you there.~"; | |
| ], | |
| life | |
| [; Ask: "~You're on your own this time.~"; | |
| Tell: "Martha clucks sympathetically."; | |
| Answer: "~I'll be darned,~ Martha replies."; | |
| ]; | |
| ! ========================================================================== | |
| Object Third_Floor "Third Floor" | |
| with name "trapdoor", | |
| description | |
| "Atop the marble staircase, this third floor | |
| foyer fans out into Rooms from Chapter V. These run:^ | |
| ^ south to Corridor 22 (inventories) | |
| and the List Property Office, | |
| ^ @00 to Room 24 (Curious Names), | |
| ^ @01 to Room 28, which is divided by a glass window.^ | |
| ^Only a very rickety | |
| ladder goes further up, through an open trapdoor to the roof.", | |
| d_to Second_Floor, u_to roof, | |
| e_to Room24, w_to window_w, s_to Corridor22, | |
| has light; | |
| Object -> "map" | |
| with name "map" "third" "floor", | |
| initial "A map of the third floor is embossed in one wall.", | |
| description | |
| [; font off; | |
| "^+------------------------------------------+ | |
| ^| | | |
| ^| (glass | | |
| ^| window) | | |
| ^| ! | | |
| ^| Room ! 28 --- Stairs --- Room 24 | | |
| ^| ! (you are here) Names | | |
| ^| | | | | |
| ^| | Museum Cafe | | |
| ^| Corridor 22 | | |
| ^| (Inventories) | | |
| ^| / | @@92 | | |
| ^| / | @@92 | | |
| ^| Room 23 W --- Room 23 --- Room 23 E | | |
| ^| (listing List Property (I Ching) | | |
| ^| machine) Office | | |
| ^+------------------------------------------+^"; | |
| font on; | |
| ], | |
| has static; | |
| Object -> "Lexicon" | |
| with name "lexicon", | |
| initial | |
| "On the top step is a discarded Lexicon of verbs.", | |
| description | |
| "(The lexicon has the number 27 written on the spine.)^^ | |
| Inside are many familiar verbs that you regularly use | |
| when navigating through Inform games. There are also | |
| some special ones, only available in the Museum...^^ | |
| ~megalook~ : like ~look~ but much fuller;^ | |
| ~threefold <noun> <noun> <noun>~ : this doesn't | |
| actually do anything, but it shows how a verb can | |
| be parsed which has three objects, not just 0 to 2 | |
| as usual;^ | |
| ~time <time of day>~ : sets the current time of day | |
| (go out onto the Balcony to see sunrise at 6 AM);^ | |
| ~fp <floating-point number>~ : shows how floating-point | |
| numbers can be parsed;^ | |
| ~dial <phone-style number>~ : likewise phone numbers.^^ | |
| Also, in the Museum, ~lock~ and ~unlock~ are cunningly | |
| able to presume keys as their second objects."; | |
| ! -------------------------------------------------------------------------- | |
| Object Corridor22 "Corridor 22" | |
| with description | |
| "Runs south of the top floor foyer, and leads to Room 23, | |
| such a long room that you can enter it to southwest, south | |
| or southeast.^^ | |
| In the floor is a curious solid quartz window.", | |
| n_to Third_Floor, | |
| s_to Room23, se_to Room23b, sw_to Room23a, | |
| d_to "Solid quartz.", | |
| has light; | |
| Object -> "quartz window" | |
| with name "quartz" "window", | |
| before | |
| [; Examine, Search, LookUnder: | |
| print "Through the window you can hazily make out the contents | |
| of the Grammar Hall below...^"; | |
| if (Locale(Grammar_Hall, "You can see", | |
| "You can also see")~=0) | |
| " on the floor below."; | |
| rtrue; | |
| ], | |
| has scenery; | |
| Object -> "Geoffrey's book" | |
| with name "book" "old" "harmless" "lethal" "of" "geoffrey^s", | |
| invent "that harmless old book of Geoffrey's", | |
| before | |
| [; Examine: | |
| self.invent = "that lethal old book of Geoffrey's"; | |
| "The apparently harmless book turns fiery hot in your hands, | |
| and your eyes are dragged toward the hideous sigils | |
| inscribed within it... Just in time, you break the gorgon | |
| gaze and look away.^^ | |
| [From this moment, its inventory entry changes.]"; | |
| ], | |
| has proper; | |
| Object -> "platinum pyramid" | |
| with name "platinum" "pyramid", | |
| description "No matter how many times you pick this up and put it | |
| down again, it never becomes an ~ordinary~ object for room | |
| description purposes -- it always has a line to itself.", | |
| describe | |
| [; "^The platinum pyramid catches the light beautifully."; | |
| ]; | |
| Object -> "ornate box" | |
| with name "decorated" "ornate" "box", | |
| invent | |
| [; if (inventory_stage==1) give self general; | |
| else give self ~general; | |
| ], | |
| short_name | |
| [; if (self has general) { print "box"; rtrue; } ], | |
| article | |
| [; if (self has general) | |
| { print "that most remarkably decorated"; rtrue; | |
| } | |
| else print "an"; ], | |
| description | |
| "[What's interesting about the ornate box is that its | |
| inventory listing overrides its short name entirely, | |
| and yet its contents will still be inventoried.]", | |
| has open openable container; | |
| Object -> -> "pearl" | |
| with name "pearl", | |
| description "Don't look at me - I'm irrelevant."; | |
| ! -------------------------------------------------------------------------- | |
| Object Room23a "Room 23 @01: Inventory Annexe" | |
| with description | |
| "The @01ern end of Room 23 is a housing for the Listing Machine.", | |
| e_to Room23, ne_to Corridor22, | |
| has light; | |
| Object -> list_machine "listing machine" | |
| with name "listing" "list" "machine", | |
| describe | |
| [ i; print "The listing machine has a go button and a number of | |
| switches, whose current settings are as follows:^"; | |
| objectloop (i in self) | |
| { if (i~=list_go) | |
| { print (address) (i.&name)-->0, " "; | |
| if (i has on) print "(on)^"; else print "(off)^"; | |
| } | |
| } | |
| rtrue; | |
| ], | |
| has transparent static; | |
| Object -> -> list_go "go button" | |
| with name "go" "button" "control", | |
| before | |
| [ i j; Push: | |
| objectloop (i in list_machine) | |
| if (i~=self && i has on) j=j+i.number; | |
| print "~In this style, your inventory is listed as | |
| follows...^"; | |
| WriteListFrom(child(player), j, 1); | |
| "...~"; | |
| ], | |
| has static; | |
| Class BitSwitch | |
| with name "switch" "control", | |
| has switchable static; | |
| BitSwitch -> -> "newline switch" | |
| with name "newline", number NEWLINE_BIT; | |
| BitSwitch -> -> "indent switch" | |
| with name "indent", number INDENT_BIT; | |
| BitSwitch -> -> "fullinv switch" | |
| with name "fullinv", number FULLINV_BIT, has on; | |
| BitSwitch -> -> "english switch" | |
| with name "english", number ENGLISH_BIT, has on; | |
| BitSwitch -> -> "recurse switch" | |
| with name "recurse", number RECURSE_BIT, has on; | |
| BitSwitch -> -> "always switch" | |
| with name "always", number ALWAYS_BIT; | |
| BitSwitch -> -> "terse switch" | |
| with name "terse", number TERSE_BIT; | |
| BitSwitch -> -> "partinv switch" | |
| with name "partinv", number PARTINV_BIT; | |
| BitSwitch -> -> "defart switch" | |
| with name "defart", number DEFART_BIT; | |
| BitSwitch -> -> "workflag switch" | |
| with name "workflag", number WORKFLAG_BIT; | |
| BitSwitch -> -> "isare switch" | |
| with name "isare", number ISARE_BIT; | |
| BitSwitch -> -> "conceal switch" | |
| with name "conceal", number CONCEAL_BIT; | |
| ! -------------------------------------------------------------------------- | |
| [ CoinsTogether cla i x y; | |
| objectloop (i ofclass cla) | |
| { x=parent(i); | |
| if (y==0) y=x; else { if (x~=y) return 0; } | |
| } | |
| return y; | |
| ]; | |
| [ Face x; if (x.number==1) print "Heads"; else print "Tails"; ]; | |
| Array gold_trigrams --> "fortune" "change" "river flowing" "chance" | |
| "immutability" "six stones in a circle" | |
| "grace" "divine assistance"; | |
| Array silver_trigrams --> "happiness" "sadness" "ambition" "grief" | |
| "glory" "charm" "sweetness of nature" | |
| "the countenance of the Hooded Man"; | |
| [ Trigram cla i k state; | |
| objectloop (i ofclass cla) | |
| { print (Face) i; if (k++<2) print ","; print " "; | |
| state=state*2 + (i.number-1); | |
| } | |
| if (cla == GoldCoin) i=gold_trigrams; else i=silver_trigrams; | |
| print "(", (string) i-->state, ")"; | |
| ]; | |
| [ CoinsLT cla k i c; | |
| if (inventory_stage==1) | |
| { if (cla == GoldCoin) print "the gold"; else print "the silver"; | |
| print " coins "; | |
| k=CoinsTogether(cla); | |
| if (k==location || k has supporter) | |
| { objectloop (i ofclass cla) | |
| { print (name) i; | |
| switch(++c) | |
| { 1: print ", "; 2: print " and "; | |
| 3: print " (showing the trigram ", (Trigram) cla, ")"; | |
| } | |
| } | |
| rtrue; | |
| } | |
| c_style = c_style | (ENGLISH_BIT+NOARTICLE_BIT); | |
| if (c_style & NEWLINE_BIT ~= 0) c_style = c_style - NEWLINE_BIT; | |
| if (c_style & INDENT_BIT ~= 0) c_style = c_style - INDENT_BIT; | |
| } | |
| rfalse; | |
| ]; | |
| Class Coin | |
| with number 1, article "the", | |
| parse_name | |
| [ i j w; | |
| if (parser_action==##TheSame) return -2; | |
| w='gold'; if (self ofclass SilverCoin) w='silver'; | |
| for (::i++) | |
| { j=NextWord(); | |
| if (j=='coins') parser_action=##PluralFound; | |
| else if (j~='coin' or w or self.name) return i; | |
| } | |
| ], | |
| after | |
| [ j; | |
| Drop, PutOn: | |
| self.number=random(2); print (Face) self, ". "; | |
| if (self ofclass GoldCoin) j=GoldCoin; else j=SilverCoin; | |
| if (CoinsTogether(j)~=0) | |
| { print "The "; | |
| if (j == GoldCoin) print "gold"; else print "silver"; | |
| " trigram is now ", (Trigram) j, "."; | |
| } | |
| new_line; rtrue; | |
| ]; | |
| Class GoldCoin class Coin | |
| with list_together [; return CoinsLT(GoldCoin); ]; | |
| Class SilverCoin class Coin | |
| with list_together [; return CoinsLT(SilverCoin); ]; | |
| Object Room23b "Room 23 @00: Chinese Room" | |
| with description "A small, well-composed Chinese room for meditation, | |
| through which ~a wind can blow~. (But only if it blows from | |
| @01 back to north@01, because they're the only exits.) | |
| From each cornice of the ceiling, a cherub looks down.", | |
| w_to Room23, nw_to Corridor22, | |
| has light; | |
| Object -> "Chinese scroll" | |
| with name "chinese" "scroll" "instructions", | |
| initial "A scroll hangs on one wall.", | |
| description | |
| "Instructing you in the arts of the I Ching, the scroll advises | |
| you to throw the two trigrams of gold and silver coins, that | |
| you may find wisdom in the result."; | |
| GoldCoin -> "goat" with name "goat"; | |
| GoldCoin -> "deer" with name "deer"; | |
| GoldCoin -> "chicken" with name "chicken"; | |
| SilverCoin -> "robin" with name "robin"; | |
| SilverCoin -> "snake" with name "snake"; | |
| SilverCoin -> "bison" with name "bison"; | |
| Global cherub_warning_given; | |
| Class Cherub | |
| with parse_name | |
| [ i j flag; | |
| for (flag=1:flag==1:) | |
| { flag=0; | |
| j=NextWord(); | |
| if (j=='cherub' || j==self.name) flag=1; | |
| if (j=='cherubs') | |
| { parser_action=##PluralFound; flag=1; | |
| if (cherub_warning_given==0) | |
| print "(I'll let this go, | |
| but the plural of ~cherub~ is ~cherubim~.)^"; | |
| cherub_warning_given = true; | |
| } | |
| if (j=='cherubim') | |
| { parser_action=##PluralFound; flag=1; } | |
| i++; | |
| } | |
| return i-1; | |
| ], | |
| has scenery; | |
| Cherub -> "northeast cherub" with name "northeast"; | |
| Cherub -> "southeast cherub" with name "southeast"; | |
| Cherub -> "northwest cherub" with name "northwest"; | |
| Cherub -> "southwest cherub" with name "southwest"; | |
| ! -------------------------------------------------------------------------- | |
| Object Room23 "Room 23: List Property Office" | |
| with description | |
| "This the List Property Office (it seems that an ~O~ | |
| was lost some time ago), at the southern end of the top floor; | |
| the management have kindly provided a green baize table, while | |
| the rest is presumably the work of patrons.^^ | |
| Room 23 continues @00 to @01.", | |
| n_to Corridor22, | |
| e_to Room23b, | |
| w_to Room23a | |
| has light; | |
| Object -> "green baize table" | |
| with name "green" "baize" "table" | |
| has scenery supporter; | |
| Class PlasticCutlery | |
| with name "plastic" "cutlery", article "a plastic", | |
| list_together | |
| [; if (inventory_stage==1) | |
| { if (c_style & NOARTICLE_BIT == 0) c_style=c_style+NOARTICLE_BIT; | |
| if (c_style & ENGLISH_BIT == 0) c_style=c_style+ENGLISH_BIT; | |
| if (c_style & NEWLINE_BIT ~= 0) c_style=c_style-NEWLINE_BIT; | |
| if (c_style & INDENT_BIT ~= 0) c_style=c_style-INDENT_BIT; | |
| print "a plastic "; | |
| } | |
| ]; | |
| PlasticCutlery -> "fork" with name "fork"; | |
| PlasticCutlery -> "knife" with name "knife"; | |
| PlasticCutlery -> "spoon" with name "spoon"; | |
| Class Hat with list_together "hats", name "hat" "hats", has clothing; | |
| Hat -> "fez" with name "fez"; | |
| Hat -> "Panama" with name "panama"; | |
| Hat -> "sombrero" with name "sombrero"; | |
| Class Letter | |
| with list_together | |
| [; if (inventory_stage==1) | |
| { print "the letters "; | |
| c_style = c_style | (ENGLISH_BIT+NOARTICLE_BIT); | |
| if (c_style & NEWLINE_BIT ~= 0) c_style = c_style - NEWLINE_BIT; | |
| if (c_style & INDENT_BIT ~= 0) c_style = c_style - INDENT_BIT; | |
| } | |
| else print " from a Scrabble set"; | |
| ], | |
| short_name | |
| [; if (listing_together ofclass Letter) rfalse; | |
| print "letter ", (object) self, " from a Scrabble set"; rtrue; | |
| ], | |
| article "the"; | |
| Letter -> "X" with name "x"; | |
| Letter -> "Y" with name "y"; | |
| Letter -> "Z" with name "z"; | |
| Letter -> "P" with name "p"; | |
| Letter -> "Q" with name "q"; | |
| Letter -> "R" with name "r"; | |
| Object -> "defrosting Black Forest gateau" | |
| with name "black" "forest" "gateau" "cake", | |
| has edible; | |
| Object -> "Punch magazine" | |
| with name "punch" "magazine", | |
| description | |
| "Five years out of date by the cover, a hundred by the contents.", | |
| list_together 1, | |
| has proper; | |
| Object -> "issue of the Spectator" | |
| with name "spectator" "issue" "magazine", article "a recent", | |
| description | |
| "Up to date by the cover, a nightmare view of the future within.", | |
| list_together 1; | |
| Object -> "die" | |
| with name "die" "dice", | |
| after [; Drop: print "It comes up ", random(6); "!"; ]; | |
| Class Star | |
| with name "star", | |
| description | |
| "A little star of precious-metal, perhaps exotic currency.", | |
| parse_name | |
| [ i j w; | |
| if (parser_action==##TheSame) | |
| { if ((parser_one.&name)-->0 == (parser_two.&name)-->0) return -1; | |
| return -2; | |
| } | |
| w=(self.&name)-->0; | |
| for (::i++) | |
| { j=NextWord(); | |
| if (j=='stars') parser_action=##PluralFound; | |
| else if (j~='star' or w) return i; | |
| } | |
| ], | |
| list_together "stars", | |
| plural | |
| [; print (address) (self.&name)-->0; | |
| if (~~(listing_together ofclass Star)) print " stars"; | |
| ], | |
| short_name | |
| [; if (listing_together ofclass Star) | |
| { print (address) (self.&name)-->0; rtrue; } | |
| ], | |
| article | |
| [; if (listing_together ofclass Star) print "one"; else print "a"; | |
| ]; | |
| Class GoldStar class Star with name "gold"; | |
| Class SilverStar class Star with name "silver"; | |
| Class BronzeStar class Star with name "bronze"; | |
| SilverStar -> "silver star"; | |
| SilverStar -> "silver star"; | |
| SilverStar -> "silver star"; | |
| SilverStar -> "silver star"; | |
| BronzeStar -> "bronze star"; | |
| GoldStar -> "gold star"; | |
| GoldStar -> "gold star"; | |
| GoldStar -> "gold star"; | |
| ! -------------------------------------------------------------------------- | |
| Object Room24 "Curious Names" | |
| with description | |
| "This is Room 24, @00 of the mezzanine. The exhibits are | |
| packed in here, but fortunately there's a plaque making | |
| some sense of it all.", | |
| w_to Third_Floor, s_to Museum_Cafe, | |
| has light; | |
| Object -> plaque "plaque" | |
| with name "plaque", | |
| description | |
| "Room 24 Plaque^^ | |
| Princess is capable of a startling change of name when kissed.^^ | |
| The genie's lamp, when rubbed, may make alarming things | |
| happen to your ability to refer to the colours ~black~ and | |
| ~white~. The stones may help you to experiment with this.^^ | |
| Carrying the magnifying glass allows you to ~magnify~ things.^^ | |
| The game's parser has been specially programmed for the | |
| fly in amber object, so that ~put the fly in amber in box~ | |
| will work correctly (and not be interpreted as ~put (the fly) in | |
| (amber in box)~).", | |
| has scenery; | |
| Object -> genies_lamp "genie's lamp" | |
| with name "lamp", | |
| before | |
| [; Rub: | |
| if (self hasnt general) give self general; | |
| else give self ~general; | |
| "A genie appears from the lamp, declaring:^^ | |
| ~Mischief is my sole delight:^ | |
| If white means black, black means white!~"; | |
| ]; | |
| Object -> "white stone" with name "white" "stone"; | |
| Object -> "black stone" with name "black" "stone"; | |
| Object -> "fly in amber" with name "fly" "amber"; | |
| Object -> magnifier "magnifying glass" | |
| with name "glass" "magnifying" "magnifier" "lense", | |
| description "Using this, you can ~magnify~ things."; | |
| [ MagnifySub; | |
| if (magnifier notin player) | |
| "You're not holding a magnifying glass."; | |
| if (noun==magnifier) "Light is not so flexible as that."; | |
| print "You can just make out that ", (the) noun, | |
| " is inscribed as being ~object ", noun, "~.^"; | |
| if (magnifier hasnt general) | |
| { give magnifier general; | |
| "^(When you're carrying the magnifier, you can refer to | |
| things by their numbers like this; and you can even use | |
| # to mean ~any single object~ and * to mean ~all objects~.)"; | |
| } | |
| ]; | |
| [ ParseNoun obj; | |
| if (magnifier notin player) return -1; | |
| if (NextWord() == 'object' && TryNumber(wn) == obj) return 2; | |
| wn--; | |
| if (WordLength(wn)==1 && WordAddress(wn)->0 == '#') return 1; | |
| if (WordLength(wn)==1 && WordAddress(wn)->0 == '*') | |
| { parser_action = ##PluralFound; return 1; } | |
| return -1; | |
| ]; | |
| Object -> "/?%?/ (the artiste formally known as Princess)" | |
| with name "princess" "artiste" "formally" "known" "as", | |
| description "You somehow feel it would be appropriate | |
| to kiss Princess.", | |
| short_name | |
| [; if (self hasnt general) { print "Princess"; rtrue; } | |
| ], | |
| react_before | |
| [; Listen: print_ret (name) self, " sings a soft siren song."; | |
| ], | |
| initial | |
| [; print_ret (name) self, " is singing softly."; | |
| ], | |
| parse_name | |
| [ x n; if (self hasnt general) | |
| { if (NextWord()=='princess') return 1; | |
| return 0; | |
| } | |
| x=WordAddress(wn); | |
| if ( x->0 == '/' && x->1 == '?' && x->2 == '%' | |
| && x->3 == '?' && x->4 == '/') | |
| { while (wn<=parse->1 && WordAddress(wn++)<x+5) n++; | |
| return n; | |
| } | |
| return -1; | |
| ], | |
| life | |
| [; Kiss: give self general; self.life = NULL; | |
| "In a fairy-tale transformation, the Princess | |
| steps back and astonishes the world by announcing | |
| that she will henceforth be known as ~/?%?/~."; | |
| ], | |
| has animate proper female; | |
| ! -------------------------------------------------------------------------- | |
| Object Museum_Cafe "Room 24 Annexe: The Museum Cafe" | |
| with description | |
| "Very much a self-service refreshments area, which | |
| somehow cunningly continues the exhibition from the north.", | |
| n_to Room24, | |
| has light; | |
| Object -> "upright fridge" | |
| with name "upright" "fridge", | |
| initial "There is an upright fridge in one corner.", | |
| after | |
| [; Open: | |
| "On the inside of the door is a note to the effect | |
| that the pepper is a standardly-named Inform object | |
| and can be called ~green~, ~pepper~, ~green pepper~, | |
| ~pepper green~, etc.; | |
| whereas, in the case of the red tomato, ~red~ and | |
| ~tomato fried red~, etc., will not be allowed.^^"; | |
| <<Search self>>; | |
| ], | |
| has openable container static; | |
| Object -> -> "green pepper" | |
| with name "green" "pepper", | |
| has edible; | |
| Object -> -> "red fried tomato" | |
| with name "red" "pepper", | |
| parse_name | |
| [ i w; w=NextWord(); | |
| while (w=='red' or 'fried') | |
| { w=NextWord(); i++; | |
| } | |
| if (w=='tomato') return i+1; | |
| return 0; | |
| ], | |
| has edible; | |
| Object -> "drinks machine" | |
| with name "drinks" "machine", | |
| initial | |
| "Next to the fridge is a drinks machine with buttons | |
| for Cola, Coffee and Tea.", | |
| has static transparent; | |
| Object -> -> "drinks machine button" | |
| has scenery | |
| with parse_name | |
| [ i flag type; | |
| for (: flag == 0: i++) | |
| { flag = 1; | |
| switch(NextWord()) | |
| { 'button', 'for': flag = 0; | |
| 'coffee': if (type == 0) { flag = 0; type = 1; } | |
| 'tea': if (type == 0) { flag = 0; type = 2; } | |
| 'cola': if (type == 0) { flag = 0; type = 3; } | |
| } | |
| } | |
| if (type==drink.number && i==2 && type~=0 && drink in player) | |
| return 0; | |
| self.number=type; return i-1; | |
| ], | |
| number 0, | |
| before | |
| [; Push, SwitchOn: | |
| if (self.number == 0) | |
| "You'll have to say which button to press."; | |
| if (parent(drink) ~= 0) "The machine's broken down."; | |
| drink.number = self.number; move drink to player; itobj = drink; | |
| "Whirr! The machine puts ", (a) drink, " into your | |
| glad hands."; | |
| Attack: "The machine shudders and squirts cola at you."; | |
| Drink: "You can't drink until you've worked the machine."; | |
| ]; | |
| Object drink "drink" | |
| with parse_name | |
| [ i flag type; | |
| for (: flag == 0: i++) | |
| { flag = 1; | |
| switch(NextWord()) | |
| { 'drink', 'cup', 'of': flag = 0; | |
| 'coffee': if (type == 0) { flag = 0; type = 1; } | |
| 'tea': if (type == 0) { flag = 0; type = 2; } | |
| 'cola': if (type == 0) { flag = 0; type = 3; } | |
| } | |
| } | |
| if (type ~= 0 && type ~= self.number) return 0; | |
| return i-1; | |
| ], | |
| short_name | |
| [; print "cup of "; | |
| switch (self.number) | |
| { 1: print "coffee"; 2: print "tea"; 3: print "cola"; } | |
| rtrue; | |
| ], | |
| number 0, | |
| before | |
| [; Drink: remove self; | |
| "Ugh, that was awful. You crumple the cup and responsibly | |
| dispose of it."; | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Class WindowRoom | |
| with description | |
| [; print "This is one end of a long east/west room. "; | |
| if (self==window_w) "An exit leads back @00."; | |
| "There appears to be no way in or out at this end."; | |
| ], | |
| before | |
| [; Examine, Search: ; | |
| default: | |
| if (inp1~=1 && noun~=0 && noun in self.far_side) | |
| print_ret (The) noun, " is on the far side of | |
| the glass."; | |
| if (inp2~=1 && second~=0 && second in self.far_side) | |
| print_ret (The) second, " is on the far side of | |
| the glass."; | |
| ], | |
| after | |
| [; Look: | |
| if (ggw has general) rfalse; | |
| print "^The room is divided by a great glass window"; | |
| if (location.far_side hasnt light) " onto darkness."; | |
| print ", stretching from floor to ceiling.^"; | |
| if (Locale(location.far_side, | |
| "Beyond the glass you can see", | |
| "Beyond the glass you can also see")~=0) "."; | |
| ], | |
| has light; | |
| WindowRoom window_w "Room 28: @01 of Window" | |
| with e_to Third_Floor, w_to "The window is in your way.", | |
| far_side window_e; | |
| Object -> "plastic cup" | |
| with name "plastic" "cup"; | |
| WindowRoom window_e "Room 28: @00 of Window" | |
| with far_side window_w; | |
| Key -> "bronze key" | |
| with name "bronze"; | |
| Object -> "golden chalice" | |
| with name "golden" "chalice" "cup" "grail" "holy"; | |
| Object ggw "great glass window" | |
| with name "great" "glass" "window", | |
| before | |
| [ place; Examine, Search: place=location; | |
| if (place.far_side hasnt light) | |
| "The other side is dark."; | |
| print "The view through the window:^"; | |
| give self general; | |
| PlayerTo(place.far_side,1); <Look>; PlayerTo(place,1); | |
| give self ~general; | |
| give place.far_side ~visited; rtrue; | |
| ], | |
| found_in window_w window_e, | |
| has scenery; | |
| ! ========================================================================== | |
| Object roof "Museum Roof: area 33" | |
| with name "trapdoor", | |
| description | |
| "A small trapdoor leads down from this tiled roof into the | |
| museum. The view is indescribable, which saves me some typing | |
| and you some reading, right? Yes -- this is one of those | |
| post-modern room descriptions, the kind that makes you aware | |
| you're only playing a game.", | |
| d_to Third_Floor, | |
| has light; | |
| Global status_style = 3; | |
| Object -> "dial" | |
| with name "dial", | |
| initial | |
| "A dial here has four settings, which control the appearance | |
| of the status line drawn by the computer to indicate the | |
| state of play. Settings are: 1 - invisible; 2 - centred | |
| place name only; 3 -�standard Score/Turns display; | |
| 4 - a compass rose of possible directions to go in.", | |
| before | |
| [; SetTo: | |
| if (second<1 || second>4) "There are only four settings."; | |
| status_style = second; "Set."; | |
| ], | |
| has static; | |
| ! -------------------------------------------------------------------------- | |
| [ Initialise; | |
| location = Foyer; move samples_bag to player; | |
| thedark.short_name = "An odd-smelling darkness"; | |
| thedark.initial = GoMothGo; | |
| NormalWorld(); lookmode=2; | |
| SetTime(SUNRISE-10,1); | |
| "^^^^^Welcome indeed to the...^"; | |
| ]; | |
| [ InScope actor; | |
| if (actor==martha) PlaceInScope(player); | |
| if (actor==player && scope_reason==TALKING_REASON && player in booth) | |
| PlaceInScope(martha); | |
| if (location==window_w && window_e has light) | |
| ScopeWithin(window_e); | |
| if (location==window_e && window_w has light) | |
| ScopeWithin(window_w); | |
| rfalse; | |
| ]; | |
| [ BeforeParsing i j; | |
| for (i=parse->1,j=2:j<i:j++) | |
| { wn=j-1; | |
| if (NextWord()=='fly' && NextWord()=='in' && NextWord()=='amber') | |
| parse-->(j*2-1) = 'fly'; | |
| } | |
| if (genies_lamp hasnt general) return; | |
| for (wn=1::) | |
| { switch(NextWordStopped()) | |
| { 'white': parse-->(wn*2-3) = 'black'; | |
| 'black': parse-->(wn*2-3) = 'white'; | |
| -1: return; | |
| } | |
| } | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Constant U_POS 28; Constant W_POS 30; Constant C_POS 31; | |
| Constant E_POS 32; Constant IN_POS 34; | |
| Array printed_text table 64; | |
| [ DrawStatusLine j posa posb width; | |
| if (location==0) rfalse; | |
| width = 0->33; if (width==0) width=80; | |
| switch(status_style) | |
| { 1: @split_window 0; | |
| 2: font off; | |
| @split_window 1; @buffer_mode 0; @set_window 1; | |
| style reverse; @set_cursor 1 1; spaces width; | |
| printed_text-->0 = 64; | |
| @output_stream 3 printed_text; | |
| print (name) location; | |
| @output_stream -3; | |
| j=(width-(printed_text-->0))/2; | |
| @set_cursor 1 j; print (name) location; spaces(j-1); | |
| style roman; | |
| @buffer_mode 1; @set_window 0; font on; | |
| 3: @split_window 1; @set_window 1; @set_cursor 1 1; style reverse; | |
| posa = width-26; posb = width-13; | |
| spaces width; | |
| @set_cursor 1 2; print (name) location; | |
| if (width > 76) | |
| { @set_cursor 1 posa; print "Score: ", 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; | |
| 4: if (e_obj.door_dir~=e_to) | |
| { @split_window 1; @set_window 1; style reverse; font off; | |
| @set_cursor; spaces width; | |
| print "You're very disoriented in this reflected world"; | |
| @set_cursor 1 1; style roman; @set_window 0; font on; | |
| rfalse; | |
| } | |
| @split_window 3; @set_window 1; style reverse; font off; | |
| @set_cursor 1 1; spaces width; | |
| @set_cursor 2 1; spaces width; | |
| @set_cursor 3 1; spaces width; | |
| @set_cursor 1 2; print (name) location; | |
| @set_cursor 1 51; print "Score: ", sline1; | |
| @set_cursor 1 64; print "Moves: ", sline2; | |
| if (location ~= thedark) | |
| { ! First line | |
| if (location.u_to ~= 0) { @set_cursor 1 U_POS; print "U"; } | |
| if (location.nw_to ~= 0) { @set_cursor 1 W_POS; print "@@92"; } | |
| if (location.n_to ~= 0) { @set_cursor 1 C_POS; print "@@124"; } | |
| if (location.ne_to ~= 0) { @set_cursor 1 E_POS; print "/"; } | |
| if (location.in_to ~= 0) { @set_cursor 1 IN_POS; print "I"; } | |
| ! Second line | |
| if (location.w_to ~= 0) { @set_cursor 2 W_POS; print "-"; } | |
| @set_cursor 2 C_POS; print "o"; | |
| if (location.e_to ~= 0) { @set_cursor 2 E_POS; print "-"; } | |
| ! Third line | |
| if (location.d_to ~= 0) { @set_cursor 3 U_POS; print "D"; } | |
| if (location.sw_to ~= 0) { @set_cursor 3 W_POS; print "/"; } | |
| if (location.s_to ~= 0) { @set_cursor 3 C_POS; print "@@124"; } | |
| if (location.se_to ~= 0) { @set_cursor 3 E_POS; print "@@92"; } | |
| if (location.out_to ~= 0){ @set_cursor 3 IN_POS; print "O"; } | |
| } | |
| @set_cursor 1 1; style roman; @set_window 0; font on; | |
| } | |
| ]; | |
| ! -------------------------------------------------------------------------- | |
| Include "Grammar"; | |
| ! -------------------------------------------------------------------------- | |
| [ FPXSub; | |
| "You typed the floating point number ", noun/100, ".", | |
| (noun%100)/10, noun%10, " (rounded off to 2 decimal places.)"; | |
| ]; | |
| [ DigitNumber n type x; | |
| x = NextWordStopped(); if (x==-1) return -1; wn--; | |
| if (type==0) | |
| { x = WordAddress(wn); | |
| if (x->n>='0' && x->n<='9') return (x->n) - '0'; | |
| return -1; | |
| } | |
| if (x=='nought' or 'oh') { wn++; return 0; } | |
| x = TryNumber(wn++); if (x==-1000 || x>=10) x=-1; return x; | |
| ]; | |
| [ FloatingPoint a x b w d1 d2 d3 type; | |
| a = TryNumber(wn++); | |
| if (a==-1000) return -1; | |
| w = NextWordStopped(wn); if (w==-1) return a*100; | |
| x = NextWordStopped(wn); if (x==-1) return -1; wn--; | |
| if (w=='point') type=1; | |
| else | |
| { if (WordAddress(wn-1)->0~='.' || WordLength(wn-1)~=1) | |
| return -1; | |
| } | |
| d1 = DigitNumber(0,type); | |
| if (d1==-1) return -1; | |
| d2 = DigitNumber(1,type); d3 = DigitNumber(2,type); | |
| b=d1*10; if (d2>=0) b=b+d2; else d3=0; | |
| if (type==1) | |
| { x=1; while (DigitNumber(x,type)>=0) x++; wn--; | |
| } | |
| else wn++; | |
| parsed_number = a*100 + b; | |
| if (d3>=5) parsed_number++; | |
| return 1; | |
| ]; | |
| Verb "fp" * FloatingPoint -> FPX; | |
| ! -------------------------------------------------------------------------- | |
| Constant MAX_PHONE_LENGTH 30; | |
| Array dialled_number string MAX_PHONE_LENGTH; | |
| [ PhoneNumber f a l ch pp i; | |
| pp=1; if (NextWordStopped()==-1) return 0; | |
| do | |
| { a=WordAddress(wn-1); l=WordLength(wn-1); | |
| for (i=0:i<l:i++) | |
| { ch=a->i; | |
| if (ch<'0' || ch>'9') | |
| { if (ch~='-') { f=1; if (i~=0) return -1; } } | |
| else | |
| { if (pp<MAX_PHONE_LENGTH) | |
| dialled_number->(pp++)=ch-'0'; | |
| } | |
| } | |
| } until (f==1 || NextWordStopped()==-1); | |
| if (pp==1) return -1; | |
| dialled_number->0 = pp-1; | |
| return 0; | |
| ]; | |
| [ DialPhoneSub i; | |
| print "You dialled <"; | |
| for (i=1:i<=dialled_number->0:i++) print dialled_number->i; | |
| ">"; | |
| ]; | |
| Verb "dial" * PhoneNumber -> DialPhone; | |
| ! -------------------------------------------------------------------------- | |
| Global assumed_key; | |
| [ DefaultLockSub; | |
| print "(with ", (the) assumed_key, ")^"; <<Lock noun assumed_key>>; | |
| ]; | |
| [ DefaultUnlockSub; | |
| print "(with ", (the) assumed_key, ")^"; <<Unlock noun assumed_key>>; | |
| ]; | |
| [ DefaultKeyTest i count; | |
| if (noun hasnt lockable) rfalse; | |
| objectloop (i in player && i ofclass Key) | |
| { count++; assumed_key = i; } | |
| if (count==1) rtrue; rfalse; | |
| ]; | |
| Extend "lock" first * noun = DefaultKeyTest -> DefaultLock; | |
| Extend "unlock" first * noun = DefaultKeyTest -> DefaultUnlock; | |
| ! -------------------------------------------------------------------------- | |
| Constant TWELVE_HOURS 720; | |
| [ NumericTime hr mn word x; | |
| if (hr>=24) return -1; | |
| if (mn>=60) return -1; | |
| x=hr*60+mn; if (hr>=13) return x; | |
| x=x%TWELVE_HOURS; if (word=='pm') x=x+TWELVE_HOURS; | |
| if (word~='am' or 'pm' && hr==12) x=x+TWELVE_HOURS; | |
| return x; | |
| ]; | |
| [ MyTryNumber wordnum i j; | |
| i=wn; wn=wordnum; j=NextWordStopped(); wn=i; | |
| switch(j) | |
| { 'twenty-five': return 25; | |
| 'thirty': return 30; | |
| default: return TryNumber(wordnum); | |
| } | |
| ]; | |
| [ TimeOfDay i j k x flag loop ch hr mn; | |
| i=NextWord(); | |
| if (i=='midnight') { parsed_number=0; return 1; } | |
| if (i=='midday' or 'noon') { parsed_number=TWELVE_HOURS; return 1; } | |
| ! Next try the format 12:02 | |
| j=WordAddress(wn-1); k=WordLength(wn-1); | |
| flag=0; | |
| for (loop=0:loop<k:loop++) | |
| { ch=j->loop; | |
| if (ch==':' && flag==0 && loop~=0 && loop~=k-1) flag=1; | |
| else { if (ch<'0' || ch>'9') flag=-1; } | |
| } | |
| if (k<3 || k>5) flag=0; | |
| if (flag==1) | |
| { for (loop=0:j->loop~=':':loop++, hr=hr*10) | |
| hr=hr+j->loop-'0'; | |
| hr=hr/10; | |
| for (loop++:loop<k:loop++, mn=mn*10) | |
| mn=mn+j->loop-'0'; | |
| mn=mn/10; | |
| j=NextWordStopped(); | |
| parsed_number=NumericTime(hr, mn, j); | |
| if (parsed_number<0) return -1; | |
| if (j~='pm' or 'am') wn--; | |
| return 1; | |
| } | |
| ! Next the format "half past 12" | |
| j=-1; if (i=='half') j=30; if (i=='quarter') j=15; | |
| if (j<0) j=MyTryNumber(wn-1); if (j<0) return -1; | |
| if (j>=60) return -1; | |
| k=NextWordStopped(); | |
| if ((k=='o^clock' or 'am' or 'pm')||(k==-1)) | |
| { hr=j; if (hr>12) return -1; jump TimeFound; } | |
| if (k=='to' or 'past') | |
| { mn=j; hr=MyTryNumber(wn); | |
| if (hr<=0) | |
| { x=NextWordStopped(); | |
| if (x=='noon' or 'midday') hr=12; | |
| if (x=='midnight') hr=0; | |
| if (hr<0) return -1; | |
| } | |
| if (hr>=13) return -1; | |
| if (k=='to') { mn=60-mn; hr=hr-1; if (hr==-1) hr=23; } | |
| wn++; k=NextWordStopped(); | |
| jump TimeFound; | |
| } | |
| hr=j; mn=MyTryNumber(--wn); | |
| if (mn<0 || mn>=60) return -1; | |
| wn++; k=NextWordStopped(); | |
| .TimeFound; | |
| parsed_number = NumericTime(hr, mn, k); | |
| if (parsed_number<0) return -1; | |
| if (k~='pm' or 'am' or 'o^clock') wn--; | |
| return 1; | |
| ]; | |
| [ SetTheTimeSub; | |
| SetTime(noun,1); | |
| "The time is set to ", (PrintTime) noun, "."; | |
| ]; | |
| Verb "time" * TimeOfDay -> SetTheTime; | |
| ! -------------------------------------------------------------------------- | |
| Global third; | |
| [ ThreefoldSub; "You do something involving ", (the) noun, ", ", | |
| (the) second, " and ", (the) third, "."; | |
| ]; | |
| [ GhostObject x; | |
| x=NounDomain(player,location,0); | |
| if (x==REPARSE_CODE) return x; | |
| if (x==0 or 1) return -1; | |
| third = x; | |
| return 0; | |
| ]; | |
| Verb "threefold" * noun noun GhostObject -> Threefold; | |
| ! -------------------------------------------------------------------------- | |
| [ MegaExam obj; print (a) obj, ": "; <Examine obj>; ]; | |
| [ MegaLookSub; <Look>; LoopOverScope(MegaExam); ]; | |
| Verb meta "megalook" * -> MegaLook; | |
| ! -------------------------------------------------------------------------- | |
| [ ClapSub; "You clap."; ]; | |
| Verb "clap" * -> Clap; | |
| ! -------------------------------------------------------------------------- | |
| Verb "magnify" * noun -> Magnify; | |
| ! -------------------------------------------------------------------------- | |
| Verb "alarm," * "on" -> SwitchOn | |
| * "off" -> SwitchOff | |
| * TimeOfDay -> SetTo | |
| * ConTopic -> Inv; | |
| Verb "tc," * noun -> Examine | |
| * ConTopic -> Inv; | |
| [ Crew i; | |
| switch(scope_stage) | |
| { 1: rfalse; | |
| 2: objectloop (i has crewmember) PlaceInScope(i); rtrue; | |
| } | |
| ]; | |
| Verb "stc," * "where" "is" scope=Crew -> Examine | |
| * "locate" scope=Crew -> Examine; | |
| Verb "rc," * held -> Give | |
| * ConTopic -> Inv; | |
| [ Planet; | |
| switch(NextWord()) | |
| { 'centauro', 'earth': return 1; | |
| default: return -1; | |
| } | |
| ]; | |
| Verb "zen," * "scan" number "orbital" -> Show | |
| * "set" "course" "for" Planet -> Go | |
| * "speed" "standard" "by" number -> SetTo | |
| * "raise" held -> Take | |
| * "clear" held "for" "firing" -> Drop; | |
| ! ---------------------------------------------------------------------------- | |
Xet Storage Details
- Size:
- 76.8 kB
- Xet hash:
- ef5c031f07d3ebe568f7d7048fc2393bd063767fa07c2675d0509ee400821ff6
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.