! ---------------------------------------------------------------------------- ! Adventureland 961111 One of the standard Inform 6 example games ! ! Designed by Scott Adams: c. 1979 ! Ported to Inform: 16.10.94 ! Slightly corrected: 11.5.96 ! Modernised to Inform 6 and library 6/1 or later: 11.11.96 ! ---------------------------------------------------------------------------- Constant Story "ADVENTURELAND"; Constant Headline "^An Interactive Classic by Scott Adams (circa 1979/80)^"; Release 1; Serial "961111"; Constant MAX_CARRIED = 6; Constant MAX_SCORE = 100; Replace BurnSub; Include "Parser"; Include "VerbLib"; Global genie_gifts; Global dark_warning; Class Treasure with depositpoints 7, after [; Take: if (location==Inside_Stump) "Taken!"; Drop: if (location==Inside_Stump) "Safely deposited."; ]; Class Sign with name "sign", short_name [; print "sign reads- ", (object) self; rtrue; ], has static; Class ScottRoom with initial [; give self ~visited; ], describe [ i c d; print (string) self.description; print "^^Obvious exits: "; for (i=n_to: i<=d_to: i++) if (self.i ~= 0) c++; if (c==0) print "none!"; else { for (i=n_to: i<=d_to: i++) if (self.i ~= 0) { if (d++>0) print ", "; if (i==n_to) print "North"; if (i==s_to) print "South"; if (i==e_to) print "East"; if (i==w_to) print "West"; if (i==u_to) print "Up"; if (i==d_to) print "Down"; } print "."; } new_line; c=0; d=0; objectloop (i in self) if (i ~= player) { c++; give i concealed; } if (c==0) rtrue; print "^You can also see: "; objectloop (i in self) if (i ~= player) { if (d++>0) print " - "; PrintShortName(i); } new_line; rtrue; ]; [ GamePreRoutine i c d; if (action~=##Inv) rfalse; c=0; d=0; objectloop (i in player) c++; if (c==0) "You're carrying nothing."; print "You're carrying:^"; objectloop (i in player) { if (d++>0) print " - "; PrintShortName(i); } new_line; rtrue; ]; [ GamePostRoutine i; if (action==##Look) objectloop (i in location) if (i ~= player && i has concealed) give i ~concealed; rfalse; ]; ! ---------------------------------------------------------------------------- ! Into Adventureland... ! ---------------------------------------------------------------------------- ScottRoom Lake_Shore "Lakeside" with description "You're on the shore of a lake.", n_to Forest, s_to Lake_Shore, w_to Dismal_Swamp, d_to Quicksand, before [; Swim: "Below you and before the lake is quicksand."; ], has light; Object -> water "water" with name "water", article "some", before [; Drink: "Boy, that really hit the spot."; Take: if (bottle notin player) "You have nothing in which to carry the water."; <>; Insert: if (second == bottle) <>; "You have nothing in which to carry the water."; Receive: if (noun == bottle) <>; remove noun; CDefArt(noun); " washes away into the lake."; ], has scenery; Treasure -> "*GOLDEN FISH*" with name "gold" "golden" "fish", each_turn [; if (self notin player) rfalse; if (net notin player && random(100) <= 75) { move self to Lake_Shore; "^The fish escape back to the lake."; } if ((water_in_the_bottle notin bottle || bottle notin player) && random(100)<=50) { remove self; move dead_fish to player; "^Too dry. Fish die."; } ]; Object -> axe "rusty axe (magic word- BUNYON -on it)" with name "rusty" "axe", description "The magic word BUNYON is written on the haft."; Sign -> "NO SWIMMING ALLOWED"; Object dead_fish "dead fish" with name "dead" "fish" has edible; ScottRoom Quicksand "Bog" with description "You're in a quick-sand bog.", before [; Swim: if (child(player)==nothing) { PlayerTo(Lake_Shore); rtrue; } "Something's too heavy."; ], has light; Treasure -> ox "*SMALL STATUE OF A BLUE OX*" with name "ox" "blue" "small" "statue"; ScottRoom Forest "Forest" with description "You're in a forest.", n_to Forest, s_to Forest, e_to Sunny_Meadow, w_to Forest, u_to trees has light; Object -> trees "trees" with name "tree" "trees", before [; Climb: <>; ], door_to Up_Oak, door_dir u_to has open door static; ScottRoom Up_Oak "Branch" with description "You're in a branch on the top of an old oak tree.^ To the east you see a meadow beyond a lake.", d_to Forest, has light; ScottRoom Sunny_Meadow "Meadow" with description "You're in a sunny meadow.", n_to Lake_Shore, s_to Dismal_Swamp, e_to Lake_Shore, w_to Forest, has light; Object -> dragon "sleeping Dragon" with name "dragon" "sleeping" "sleepy", before [; WakeOther: deadflag=1; "The dragon wakes!"; ], life [; Order, Answer, Ask: "Shh! You don't want to wake the dragon."; Give: "The dragon is too drowsy to notice."; ThrowAt: if (noun==axe) { move axe to location; "The dragon isn't bothered."; } ], each_turn [; if (mud in location && random(100)<=50) { deadflag=1; "Dragon smells something - awakens - attacks you!"; } ], has animate; Sign -> "IN SOME CASES MUD IS GOOD, IN OTHERS..."; Treasure eggs "*DRAGON EGGS* (very rare)" with name "dragon" "eggs" "very" "rare", depositpoints 12; Object gore "smoking hole - pieces of dragon and gore" with name "gore" "hole" "dragon" "smoking" has static; ScottRoom Hidden_Grove "Grove" with description "You're in a hidden grove.", n_to Forest, e_to Dismal_Swamp, w_to Forest, has light; Treasure -> "*JEWELLED FRUIT*" with name "jewelled" "jewel" "fruit", after [; Eat: "Boy that really hit the spot!"; ], has edible; Sign -> "PAUL'S PLACE"; ScottRoom Dismal_Swamp "Dismal Swamp" with description "You're in a dismal swamp.", n_to Sunny_Meadow, s_to Dismal_Swamp, e_to Dismal_Swamp, w_to Hidden_Grove, in_to 0, u_to cypress_tree has light; Object -> cypress_tree "cypress tree" with name "cypress" "tree", before [; Climb: <>; Cut: if (axe notin player) rfalse; remove self; move tree_remains to Dismal_Swamp; Dismal_Swamp.in_to = tree_remains; Dismal_Swamp.u_to = 0; print "TIMBER.."; if (keys in Tree_Top) { remove keys; ". Something fell from the treetop and vanished!"; } "."; ], door_to Tree_Top, door_dir u_to has open door static; Object -> mud "evil smelling mud" with name "evil" "smelling" "mud", article "some", after [ f; Take: if (infected_bites in player) { remove infected_bites; f=1; } if (chigger_bites in player) { remove chigger_bites; f=1; } if (f==1) "Boy that really hit the spot!"; ], each_turn [; if (self notin player) rtrue; if (random(100)<=5 && (bottle notin player || water_in_the_bottle notin bottle)) { move self to Dismal_Swamp; "The mud dried up and fell off."; } ]; Object -> gas "swamp gas" with name "swamp" "gas", article "some", before [; Take: if (distended_bladder in player) "Bladder full already."; if (wine_bladder notin player) "You have nothing suitable."; <>; Insert: if (second == distended_bladder) "The bladder's full."; if (second ~= wine_bladder) "That won't hold gas."; move distended_bladder to player; remove wine_bladder; itobj = distended_bladder; "The bladder distends with swamp gas."; ], has static; Object -> slime "floating patch of oily slime" with name "patch" "oil" "slime" "oily", before [; Take: brass_lantern.time_left=125; give brass_lantern general; remove self; move brass_lantern to player; "Magic oil attracts magic lamp. Lamp is now full."; ], has static; Object -> chiggers "chiggers" with name "chiggers", article "a swarm of", daemon [; if (chigger_bites in player && mud notin player && random(100)<=10) { remove chigger_bites; move infected_bites to player; "^Your chigger bites are now infected."; } if (infected_bites in player && random(100)<=8) { deadflag=1; "^The bites have rotted your whole body."; } if (infected_bites notin player && chigger_bites notin player && slime in location && mud notin player && random(100)<=5) { move chigger_bites to player; "^You're bitten by chiggers."; } if (infected_bites notin player && chigger_bites notin player && chiggers in player && random(100)<=30) { move chigger_bites to player; "^You're bitten by chiggers."; } ]; Object chigger_bites "chigger bites" with name "chigger" "bites", article "some", before [; "The bites are annoying. Perhaps medicine would help?"; ]; Object infected_bites "infected chigger bites" with name "chigger" "bites" "infected", article "some", before [; "The bites are frightening. Get medicine!"; ]; Object tree_remains "hollow stump and remains of a felled tree" with name "tree" "stump" "hollow" "remains", door_to Inside_Stump, door_dir in_to has open door static; ScottRoom Tree_Top "Tree Top" with description "You're in the top of a tall cypress tree.", d_to Dismal_Swamp, has light; Object -> "spider web with writing on it" with name "spider" "web" "writing", description "~CHOP IT DOWN!~", before [; Take: deadflag=1; "You're bitten by a spider."; ]; Object -> keys "ring of skeleton keys" with name "keys" "ring" "skeleton" "keyring"; ScottRoom Inside_Stump "Inside Stump" with description "You're in a large hollow damp stump in the swamp.", n_to Dismal_Swamp, s_to Dismal_Swamp, e_to Dismal_Swamp, w_to Dismal_Swamp, u_to Dismal_Swamp, d_to Root_Chamber, has light; Sign -> "LEAVE TREASURE HERE - (say 'SCORE')"; Object -> bottle "the bottle" with name "bottle" "jar" "flask", short_name [; if (water_in_the_bottle in self) { print "bottle of water"; rtrue; } if (bees in self) { print "bottle of bees"; rtrue; } print "empty bottle"; rtrue; ], before [ x; LetGo: if (noun in bottle) "You're holding that already (in the bottle)."; Receive: if (noun==water or bees) <>; "That won't go in the bottle."; Fill: if (child(bottle)~=0) "The bottle is full already."; if (water in location) { move water_in_the_bottle to bottle; "The bottle is now full of water."; } if (bees in location) { move bees to bottle; "The bottle is now full of bees."; } "There is nothing here with which to fill the bottle."; Empty: if (child(bottle)==0) "The bottle is already empty!"; x=child(bottle); remove x; if (x==bees) { move x to location; "You release the bees."; } "Your bottle is now empty and the ground is now wet."; ], has container open; Object -> brass_lantern "old fashioned lamp" with name "lamp" "fashioned" "lamp", article "an", power 125, time_left 0, daemon [ t; if (self hasnt on) { StopDaemon(self); rtrue; } t=--(self.power); if (t==0) give self ~on ~light; if (self in player or location) { if (t==0) "Your lamp has run out of power."; if (t==30) "Your lamp is getting dim."; } ], before [; Examine: print "It is a shiny brass lamp"; if (self hasnt on) ". It is not currently lit."; if (self.power < 30) ", glowing dimly."; ", glowing brightly."; Burn: <>; Rub: if (self has on) "No! It's too hot."; if (self hasnt general) "Nothing happens."; switch(++genie_gifts) { 1: move ring to location; "A glowing genie appears - drops something - then vanishes."; 2: move bracelet to location; "A glowing genie appears - drops something - then vanishes."; 3: if (ring in Inside_Stump) score=score-ring.depositpoints; remove ring; move player to Misty_Room; "A genie appears - says ~boy you're selfish~ - takes something - then vanishes!"; 4: if (bracelet in Inside_Stump) score=score-bracelet.depositpoints; remove bracelet; move player to Misty_Room; "A genie appears - says ~boy you're selfish~ - takes something - then vanishes!"; default: "Nothing happens."; } SwitchOn: if (self.power <= 0) "It's run out."; Receive, Open: "You can't put things in the lamp."; ], after [; SwitchOn: give self light; StartDaemon(self); "Flameless lamp now on."; SwitchOff: give self ~light; ], has switchable; Treasure ring "*DIAMOND RING*" with name "diamond" "ring"; Treasure bracelet "*DIAMOND BRACELET*" with name "diamond" "bracelet"; Object water_in_the_bottle "bottled water" bottle with name "bottled" "water" "h2o", article "some", before [; Drink: remove water_in_the_bottle; <>; ], description "It looks like ordinary water to me."; ScottRoom Root_Chamber "Root Chamber" with description "You're in a root chamber under the stump.", u_to Inside_Stump, d_to dark_hole, has light; Object -> dark_hole "dark hole" with description "Leading below.", door_dir d_to, door_to Semidark_Hole has open door static; Treasure -> "*POT OF RUBIES*" with name "pot" "of" "rubies"; ScottRoom Semidark_Hole "Hole" with description "You're in a semi-dark hole by the root chamber.", u_to Root_Chamber, d_to root_door has light; Object -> root_door "the door" with name "door", short_name [; if (self has locked) { print "locked door"; rtrue; } if (self has open) { print "open door with a hallway beyond"; rtrue; } print "closed door"; rtrue; ], before [; ThrowAt: if (second==axe) { give self ~locked ~lockable ~openable open; "Lock shatters!"; } ], door_to Long_Hall, door_dir d_to, with_key keys has static door openable lockable locked; ScottRoom Long_Hall "Hall" with description "You're in a long down-sloping hall.", u_to Semidark_Hole, d_to Large_Cavern; ScottRoom Large_Cavern "Cavern" with description "You're in a large cavern.", n_to Hive, s_to Royal_Anteroom, w_to Memory_RAM, u_to Long_Hall, d_to Maze1; ScottRoom Hive "Octagonal Hive" with description "You're in a large 8-sided room.", s_to Large_Cavern; Treasure -> "*ROYAL HONEY*" with name "royal" "honey", article "some", before [; Take: if (bees in location && mud notin player) { deadflag=1; "Bees sting you."; } Drop: if (bear in location) { remove self; give bear general; "The bear eats the honey and falls asleep."; } ], has edible; Object -> bees "large African bees" with name "large" "african" "bees", article "a swarm of", before [; Take: if (mud notin player) { deadflag=1; "Bees sting you."; } if (bottle in player) <>; "You have nothing to carry the bees in."; Drop: if (self in bottle && dragon in location) { move self to location; move eggs to location; remove dragon; "The bees attack the dragon which gets up and flies away..."; } if (self in bottle && bear in location) { move self to location; give bear ~general; deadflag=1; "Bees madden the bear. Bear then attacks you!"; } ], each_turn [; #IFNDEF DEBUG; ! A completely unfair rule! And in the original the bees are lost. if (self in bottle && random(100)<=8) { move self to Hive; "^The bees in the bottle all suffocated."; } #ENDIF; if (self in bottle) rfalse; if (self in location && mud notin player && mud notin location && random(100)<=8) { deadflag=1; "Bees sting you."; } ]; ScottRoom Royal_Anteroom "Anteroom" with description "You're in a royal anteroom.", n_to Large_Cavern, u_to Royal_Chamber; Object -> wine_bladder "empty wine bladder" with name "empty" "wine" "bladder", before [; Fill: if (gas notin location) "The bladder could only just hold a vapour nowadays."; <>; ]; Object distended_bladder "distended gas bladder" with name "distended" "gas" "bladder", before [; Open: move wine_bladder to parent(self); remove self; "Gas dissipates!"; ]; ScottRoom Maze1 "Maze" with description "You're in a maze of pits.", n_to Maze2, s_to Maze4, e_to Maze4, d_to Maze2; ScottRoom Maze2 "Maze" with description "You're in a maze of pits.", w_to Maze3, u_to Maze1; Object -> flint_and_steel "flint and steel" with name "flint" "steel"; ScottRoom Maze3 "Maze" with description "You're in a maze of pits.", n_to Maze6, s_to Maze1, e_to Maze2, w_to Maze5, u_to Maze5, d_to Maze6; Object -> "scratchings" with name "scratchings", article "strange", short_name "strange scratchings on rock reveals- ALADDIN WAS HERE", has static; ScottRoom Maze4 "Maze" with description "You're in a maze of pits.", n_to Maze1, e_to Maze2, w_to Maze1, u_to Maze2; ScottRoom Maze5 "Maze" with description "You're in a maze of pits.", s_to Maze6, u_to Maze3, d_to Maze6; ScottRoom Maze6 "Maze" with description "You're in a maze of pits.", n_to Maze6, s_to Maze1, e_to Maze1, w_to Maze4, u_to Maze3, d_to Chasm_Bottom; Treasure -> rug "*THICK PERSIAN RUG*" with name "thick" "persian" "rug" "carpet"; Object -> "arrow pointing down" with name "arrow" has static; ScottRoom Chasm_Bottom "Chasm" with description "You're in a bottom of a chasm. Above 2 ledges. One has a bricked up window.", u_to Maze6; Treasure -> net "*GOLDEN NET*" with name "gold" "golden" "net"; Sign -> "MAGIC WORD IS AWAY. X LA -(rest of sign is missing)"; Object -> lava "the lava" with name "stream" "of" "lava", short_name [; print "stream of lava"; if (self has general) print " with a brick dam"; rtrue; ], description [; if (self hasnt general) "There's something there all right! Maybe you should go there?"; "Just more dammed lava."; ], before [; Enter, Push, Pull, Take: "NO! It's too hot."; ], has static; Treasure firestone "*FIRESTONE* (cold now)" with name "firestone", depositpoints 11; ScottRoom Narrow_Ledge_1 "Ledge" with description "You're on a narrow ledge by a chasm. Across the chasm is a throne room.", before [; Jump: if (firebricks in player) { deadflag=1; "Oh no! Something was too heavy!"; } print "You leap across the chasm...^"; PlayerTo(Narrow_Ledge_2); rtrue; ], w_to Royal_Chamber; ScottRoom Royal_Chamber "Royal Chamber" with description "You're in the Royal Chamber.", d_to Royal_Anteroom, e_to 0; Object -> bricked_window "bricked-up window" with name "window" "bricked" "brick" "bricks" has static; Object holed_window "bricked up window with a hole in it - beyond is a ledge" with name "window" "bricked" "hole" "ledge", door_dir e_to, door_to Narrow_Ledge_1 has static door open; Object firebricks "loose fire bricks" with name "loose" "fire" "bricks", article "some", after [; Take: "Taken. (Heavy!)"; Drop: if (location~=Chasm_Bottom) rfalse; remove self; give lava general; move firestone to location; "The bricks dam the lava, revealing a *FIRESTONE*!"; ]; ScottRoom Narrow_Ledge_2 "Ledge" with description "You're on a narrow ledge by the throne room-across chasm-ledge.", before [; Sing: if (bear in location && bear hasnt general) { move dead_bear to Chasm_Bottom; remove bear; "The bear got startled and fell off the ledge!"; } Jump: print "You leap across the chasm...^"; PlayerTo(Narrow_Ledge_1); rtrue; ], e_to [; if (bear in location && bear hasnt general) "The bear won't let you!"; return Throne_Room; ]; Treasure -> mirror "*MAGIC MIRROR*" with name "magic" "mirror", side_up 0, before [; Take: if (bear in location && bear hasnt general) "The bear won't let you!"; ], after [; Drop: if (rug in location) { print "Mirror lands softly on the rug - lights up and says:^"; self.side_up++; if (self.side_up % 2 == 1) "*DRAGON STINGS* and fades. I don't get it - hope you do."; "Don't waste *HONEY*. Get mad instead. Dam lava!"; } remove self; move broken_glass to location; "The mirror hits the floor and shatters into a million pieces!"; ]; Object -> bear "the bear" with name "thin" "black" "bear", short_name [; if (self has general) { print "sleeping bear"; rtrue; } print "thin black bear"; rtrue; ], before [; WakeOther: give self ~general; "The bear rouses!^"; ], life [; Ask, Order, Answer: <>; Attack, ThrowAt: if (self has general) ; remove mirror; move broken_glass to location; "Oh no...Bear dodges...CRASH!"; ], has animate; Object broken_glass "broken glass" with name "broken" "glass" "jagged" "fragments", article "some"; Object dead_bear "dead bear" with name "dead" "bear" "black" "thin" has static; ScottRoom Throne_Room "Throne Room" with description "You're in a throne room.", w_to Narrow_Ledge_2; Treasure -> "*GOLD CROWN*" with name "gold" "golden" "crown"; ScottRoom Real_Trouble "Trouble!" with description "I think you're in real trouble. Here's a guy with a pitchfork!^^ You lost *ALL* treasures.", initial [; deadflag=3; ], has light; ScottRoom Memory_RAM "Ugly Place" with description "You're in the memory RAM of an IBM-PC. You took a wrong turn!", e_to Large_Cavern, has light; Sign -> "To the Architects - TSURRIS"; ScottRoom Misty_Room "Misty Room" with description "You're in a large misty room with strange letters over the exits.", s_to Real_Trouble, e_to Forest, w_to Real_Trouble, u_to Up_Oak, d_to Real_Trouble, has light; Sign -> "LIMBO. FIND RIGHT EXIT AND LIVE AGAIN!"; ! ---------------------------------------------------------------------------- ! A soupcon of code ! ---------------------------------------------------------------------------- [ Initialise; location=Forest; score = 0; StartDaemon(chiggers); "^^^^^A voice booms out ...^ Treasures have an * in their name. Say 'SCORE'^ If you need a hint on something, try 'HELP'.^"; ]; [ TimePasses i; if (location ~= Inside_Stump) rfalse; score=0; objectloop (i in Inside_Stump && i ofclass Treasure) score = score + i.depositpoints; if (score ~= 100) rfalse; deadflag=2; "Congratulations! By finding and depositing all 13 *TREASURES*, you have solved Scott Adams's ~Adventureland~ and it remains only to say that..."; ]; [ AfterLife; if (deadflag==3) { deadflag=1; rfalse; } remove chigger_bites; remove infected_bites; deadflag=0; PlayerTo(Misty_Room); ]; [ PrintRank; "."; ]; [ DarkToDark; if (dark_warning==0) { dark_warning=1; "It is now pitch dark. If you proceed you will likely fall into a pit."; } if (random(4) == 1) { deadflag=1; "You fell into a pit and broke every bone in your body!"; } rfalse; ]; [ BunyonSub; if (axe notin player) "Nothing happens."; if (ox in player or location) { move ox to Hidden_Grove; move axe to Hidden_Grove; "Something you're holding vibrated and..."; } if (player notin Quicksand) { move axe to Hidden_Grove; print "Something you're holding vibrated and..."; <>; } "Nothing happens."; ]; [ TsurrisSub; if (location ~= Memory_RAM) "Nothing happens."; "A voice booms out...^ May all your teeth but one fall out, and may that one give you toothache.^ (You can't help feeling you have stumbled on a private quarrel which is nothing to do with your game.)"; ]; [ BurnSub; if (flint_and_steel notin player) "You have nothing to strike a light with."; if (noun==gas) "Gas needs to be contained before it will burn."; if (noun==distended_bladder) { if (noun in player) { remove noun; deadflag=1; "Gas bladder blew up in your hands!"; } remove noun; print "Gas bladder blew up!^"; if (dragon in location) { remove dragon; move gore to location; "The dragon has been blown to bits!"; } if (bricked_window in location) { remove bricked_window; move holed_window to location; move firebricks to location; Royal_Chamber.e_to = holed_window; "The bricked window has been blown to bits!"; } rtrue; } "That won't ignite."; ]; [ HelpSub; print "A voice booms out...^"; print "Try: LOOK,JUMP,SWIM,CLIMB,THROW,FIND,GO,TAKE,INVENTORY,SCORE.^"; if (chigger_bites in player || infected_bites in player) "Medicine is good for bites."; if (location == Quicksand) "You may need magic words here."; if (location == Sunny_Meadow) "Only 3 things will wake the dragon. One of them is dangerous!"; if (location == Hive) "Read the sign in the meadow!"; if (location == Maze1 or Maze2 or Maze3 || location == Maze4 or Maze5 or Maze6) "You may need magic words here."; if (location == Royal_Chamber) "Blow it up. Try the swamp."; ]; [ AwaySub; if (rug notin player || location~=Maze3) "Nothing happens."; print "Something you're holding vibrates, and...^"; PlayerTo(Sunny_Meadow); ]; [ FindSub; "A voice booms out...^Find it yourself."; ]; ! ---------------------------------------------------------------------------- ! Grammar: the usual grammar and some extensions ! ---------------------------------------------------------------------------- Include "Grammar"; Extend "cut" * "up" noun -> Cut * "down" noun -> Cut; Verb "bunyon" * -> Bunyon; Verb "away" * -> Away; Verb "tsurris" * -> Tsurris; Verb "help" * -> Help; Verb "find" * special -> Find; ! ----------------------------------------------------------------------------