Changes: 2003 circa: First version 2017-08-31: Added relevant code sections 2017-08-31: I should be doing work, but I found 4 new Zork II bugs, including two that let you take the wizard's wand! Found new zork I bug to let you bypass torch/dumbwaiter puzzle 2017-09-02: 2 bugs added. Canary bug in Zork I found 2017-09-03: Bunch of Zork II bugs. The sword can be used as a treasure to give the demon. ====================================================================== ------------------------------------------------------------ ZORK I ------------------------------------------------------------ ====================================================================== -------------------------------------------------------------------------- Throw anything in scope at the Cyclops -------------------------------------------------------------------------- Added 2017-09-02 There's no check for things held when throwing things at the cyclops: Cyclops Room This room has an exit on the northwest, and a staircase leading up. A cyclops, who looks prepared to eat horses (much less mere adventurers), blocks the staircase. From his state of health, and the bloodstains on the walls, you gather that he is not very friendly, though he likes people. >THROW GRUE AT CYCLOPS The cyclops shrugs but otherwise ignores your pitiful attempt. The cyclops seems somewhat agitated. >L Cyclops Room This room has an exit on the northwest, and a staircase leading up. The cyclops is standing in the corner, eyeing you closely. I don't think he likes you very much. He looks extremely hungry, even for a cyclops. There is a lurking grue here. The cyclops appears to be getting more agitated. Relevant code: if (action == ##Kill or ##Poke or ##Attack or ##Throw) { Queue(I_Cyclops,65535)-->0 = true; if (action == ##Poke) { "'Do you think I'm as stupid as my father was?', he says, dodging."; } print "The cyclops shrugs but otherwise ignores your pitiful attempt."; new_line; if (action ~= ##Throw) rfalse; move noun to location; rtrue; } -------------------------------------------------------------------------- Aquire a broken canary AND a working canary (all releases) -------------------------------------------------------------------------- Added 2017-09-02 After getting the thief to open the jeweled egg, when you've got the Canary, climb back up the tree, put the egg in the nest, and drop the nest. It will crash to the ground, and you can go down and get a broken canary from the egg. It will exist alongside the working canary. >L AT CASE Your collection of treasures consists of: A torch A broken jewel-encrusted egg A broken clockwork canary A golden clockwork canary Relevant code: if (noun == birds_nest && jeweled_egg in birds_nest) { print "The nest falls to the ground, and the egg spills out of it, seriously damaged."; new_line; remove jeweled_egg; move broken_egg to Forest_Path; rtrue; } For other parts of the code that break the egg, there's a function to remove the broken canary if the working canary is not in the egg. But this section doesn't check that! -------------------------------------------------------------------------- Bypass torch/dumbwaiter puzzle (all releases except 119 [which was never released to public]) -------------------------------------------------------------------------- Added: 2017-08-31 To get in the drafty room, you can only carry items of size equal or less than 4. The brown sack from the kitchen is size 3 (through release 88). Put the candles in them and light them and you can walk into the drafty room and have light. (You have to extinguish them first (in versions 75 on). Relevant code: [ Drafty_Room_action rarg itm ; if (rarg ~= M_BEG) rfalse; itm = child(player); Empty_handed = true; .labelXXX; if (~~itm) { ! no code } else if (QueryWeight(itm) > 4) { Empty_handed = false; } else { itm = sibling(itm); jump labelXXX; } Object -> -> -> brown_sack "brown sack" with capacity 15, initial "On the table is an elongated brown sack, smelling of hot peppers.", size 3, -------------------------------------------------------------------------- Painting destruction (All versions) -------------------------------------------------------------------------- After you destroy the painting, it has no more points for putting it in the trophy case, but you still get 4 points for taking it. If you haven't taken the painting yet, it still displays the message about 'On the far wall is a painting of unparalleled beauty' Also, it can be destroyed multiple times. Relevant code: [ Painting_action ; if (action ~= ##Poke) rfalse; noun.trophy_value = 0; noun.description = "There is a worthless piece of canvas here."; "Congratulations! Unlike the other vandals, who merely stole the artist's masterpieces, you have destroyed one."; ]; (It doesn't change the "initial" property of the painting, or the take_value. -------------------------------------------------------------------------- Reservoir jump inconsistency (all releases) -------------------------------------------------------------------------- Jumping in the reservoir kills you, saying it was an unsafe place to jump. This is because the death-after-jumping is based on the hacky fact of whether the room's down property has a length of 2 or 4 bytes. The reservoir is the only room that doesn't have a dangerous place to fall that has such a down property. Relevant code: prop = location.&d_to; if (prop) { propsize = get_prop_len(prop); if (propsize ~= X_STRING) { if (propsize ~= X_VARIABLE) jump labelXXX; @load (prop->1) -> SP; @jz SP ?~labelXXX; } print "This was not a very safe place to try jumping."; new_line; return JigsUp(ComplexPickOne(Dive_msg)); -------------------------------------------------------------------------- Grating drop bug (all releases) -------------------------------------------------------------------------- In the grating room, if you 'put object in grating', it prints, for instance: The skeleton key goes through the grating into the darkness below. And of course just moves it into the room you're in. The slide in the cellar behaves the same way. Relevant code: if (noun.size > 20) { "It won't fit through the grating."; } move noun to Grating_Room; "The ", (name) noun, " goes through the grating into the darkness below."; (no check for where you are) -------------------------------------------------------------------------- Grating open bug (all releases) -------------------------------------------------------------------------- Opening the grating from the clearing side, it says: >LOOK Clearing You are in a clearing, with a forest surrounding you on all sides. A path leads south. There is a grating securely fastened into the ground. >OPEN GRATING The grating opens to reveal trees above you. Relevant code (a typo!): if (Grate_unlocked) { OpenOrClose(grating,((location == Clearing2) ? "The grating opens." : "The grating opens to reveal trees above you."),"The grating is closed."); ! not popped This would fix it, but they got the wrong room. The grating is in Clearing1. Clearing2 is the clearing 2 east of the kitchen! -------------------------------------------------------------------------- Compressing machine bug (all releases) -------------------------------------------------------------------------- If you put things in the compressing machine besides the coal, and turn it on, then a diamond will be formed, and everything else undamaged: >PUT COAL, GARLIC IN MACHINE small pile of coal: Done. clove of garlic: Done. >CLOSE MACHINE The lid closes. >TURN ON MACHINE WITH SCREWDRIVER The machine comes to life (figuratively) with a dazzling display of colored lights and bizarre noises. After a few moments, the excitement abates. >OPEN MACHINE The lid opens, revealing a huge diamond, and a clove of garlic. Relevant code: if (pile_of_coal in machine) { Remove_Carefully(pile_of_coal); ! not popped move huge_diamond to machine; rtrue; } .labelXXX; if ((obj = child(machine)) ~= nothing) { Remove_Carefully(obj); ! not popped jump labelXXX; } move vitreous_slag to machine; rtrue; (note the rtrue, return true statement after the diamond) -------------------------------------------------------------------------- Teeth/Overboard bug (all releases) -------------------------------------------------------------------------- There's a special object named 'overboard', that exists solely for the action 'throw [object] overboard'. There is no checking at all in the action routine to see if the player has the item in checking. Thus anything in scope is fair game: >THROW GRUE OVERBOARD Ahoy -- lurking grue overboard! >THROW ME OVERBOARD Ahoy -- you overboard! >LOOK Dam Base, in the magic boat You are at the base of Flood Control Dam #3, which looms above you and to the north. The river Frigid is flowing by here. Along the river are the White Cliffswhich seem to form giant walls stretching from north to south along the shores of the river as it winds its way downstream. There is a you here. (outside the magic boat) There is a lurking grue here. (outside the magic boat) The magic boat contains: A tan label Relevant code: Object -> set_of_teeth "set of teeth" with action Teeth_action, name 'overboard' 'teeth', has scenery; [ ThrowToSub env ; if (second == set_of_teeth) { env = parent(player); if (env has vehicle) { move noun to parent(env); "Ahoy -- ", (name) noun, " overboard!"; } "You're not in anything!"; } "Huh?"; ]; -- -------------------------------------------------------------------------- Take workaround (releases 2 through 30) -------------------------------------------------------------------------- You can overcome the maximum limit on items held by using a verb other than take: >GET PUMP You're holding too many things already! >READ PUMP (Taken) How does one read a hand-held air pump? The code that tests the 'holding too many things' depends on the verb being 'take'. Relevant code: This is semi-fixed in release 75+ (it still works for readable objects): [ ReadSub ; if (noun hasnt readable) { "How does one read a ", (name) noun, "?"; } Note the "take when read" property works in many other games -------------------------------------------------------------------------- Reservoir fill bug (all releases) -------------------------------------------------------------------------- If you leave stuff in the reservoir while the lake is down, then turn the bolt to close the damn, only the trunk of jewels will disappear. Launching the boat onto the lake will show everything you left in the mud: >LOOK Reservoir, in the magic boat You are on the lake. Beaches can be seen north and south. Upstream a small stream enters the lake through a narrow cleft in the rocks. The dam can be seen downstream. There is a sword here. (outside the magic boat) There is an object which looks like a tube of toothpaste here. (outside the magic boat) There is a screwdriver here. (outside the magic boat) Relevant code: (this is the timer daemon after the sluice gates are filled): [ I_Res_Fill ; give Reservoir water_room; give Reservoir ~dry_land; give Deep_Canyon ~visited; give Loud_Room ~visited; if (trunk_of_jewels in Reservoir) { give trunk_of_jewels concealed; } -------------------------------------------------------------------------- Unextinguishable candles (all releases) -------------------------------------------------------------------------- If you extinguish the candles by pouring water on them, and then relight them with a match, they'll no longer have a flame: >POUR WATER ON CANDLE The pair of candles is extinguished. >LIGHT MATCH One of the matches starts to burn. >LIGHT CANDLE (with the match) The candles are lit. The match has gone out. >BURN SACK WITH CANDLE With a pair of candles??!? or, if you try to pour water on it in the future: >POUR WATER ON CANDLE The water spills over the pair of candles, to the floor, and evaporates. >EXAMINE CANDLE The candles are burning. (the normal response is: >BURN SACK WITH CANDLE The brown sack catches fire and is consumed. ) (Trying to burn something with the candles, or pouring water over them, are the only inconsistancies. The gas room checks if the candles have light, as does the exorcism in the land of dead. Normally, when you extinguish the candles, it removes the light property, but not the flame property. This itself presents no bugs because everything else seems to check for both the light and flame property before doing anything.) Relevant code: if (noun == quantity_of_water) { Remove_Carefully(noun); ! not popped if (second has flame && second has light) { print "The ", (name) second, " is extinguished."; new_line; give second ~light; give second ~flame; rtrue; } "The water spills over the ", (name) second, ", to the floor, and evaporates."; } [ Candle_action ; if (pair_of_candles hasnt visited) { QueueInterrupt(I_Candles)-->0 = true; } if (pair_of_candles == second) rfalse; if (action == ##Burn or ##SwitchOn) { [* code omitted *] if (second == matchbook && matchbook has light) { print "The candles are "; if (pair_of_candles has light) { "already lit."; } give pair_of_candles light; print "lit."; new_line; QueueInterrupt(I_Candles)-->0 = true; rtrue; } -------------------------------------------------------------------------- Buggy shake code (release 2, 5, 15) (Also in Zork II through release 15) -------------------------------------------------------------------------- Zork 1, releases 2, 5, and 15: Shaking an open container with contents will lock up the game. The relevant code is, in the action routine for the verb 'shake'   .label5;      if( ~~(itm = child(noun)) ) ?label4;      move itm to noun;      jump label5;   .label4;      print_ret "All of the objects spill onto the floor."; Obviously, they meant to do 'move itm to location' instead of back into the object itself. As it is, it gets stuck in an infinite loop. -------------------------------------------------------------------------- Take the Troll's axe (releases 2 and 5 only) -------------------------------------------------------------------------- Also in early versions: You can take the axe away from the troll by using an indirect means of Take, like 'Read', which forces a Take first: >N The Troll Room This is a small room with passages to the east and south and a forbidding hole leading west. Bloodstains and deep scratches (perhaps made by an axe) mar the walls. A nasty-looking troll, brandishing a bloody axe, blocks all passages out of the room. Your sword has begun to glow very brightly. >READ AXE (Taken) How can I read a bloody axe? The troll, disarmed, cowers in terror, pleading for his life in the guttural tongue of the trolls. In later versions, this was fixed by giving the axe the TRYTAKEBIT, and later, by removing the TAKEBIT when the troll has the axe, and adding it when it's dropped. -------------------------------------------------------------------------- Take the Troll's axe (releases 2 and 5 only) -------------------------------------------------------------------------- In Zork 1, release 2 only, when you throw the sword or nasty knife at the troll, it says he catches it and being momentarily sated, drops it to the ground. However, the sword or knife is not actually moved. You still have it in your possession after the throw: >throw sword (at the troll) The troll, who is remarkably coordinated, catches the sword and, being for the moment sated, throws it back. Fortunately, the troll has poor control, and the sword falls to the floor. He does not look pleased. The troll's axe barely misses your ear. >i You are carrying: A sword Relevant code: if (noun == nasty_knife or sword) { new_line; print "and, being for the moment sated, throws it back. Fortunately, the troll has poor control, and the ", (name) noun, " falls to the floor. He does not look pleased."; new_line; give troll fightbit; rtrue; } print "and not having the most discriminating tastes, gleefully eats it."; new_line; remove noun; rtrue; Fix: if (noun == nasty_knife or sword) { move noun to location; print "and, being for the moment sated, throws it back. Fortunately, the troll has poor control, and the ", (name) noun, " falls to the floor. He does not look pleased."; new_line; give troll fightbit; rtrue; } -------------------------------------------------------------------------- Banish spirits endlessly (all releases before 23) -------------------------------------------------------------------------- Until version 23, when banishing the spirits from the Entrance to Hades, you can repeatedly read the prayer and the message: Each word of the prayer reverberates through the hall in a deafening confusion. As the last word fades, a voice, loud and commanding, speaks: 'Begone, fiends!'. A heart-stopping scream fills the cavern, and the spirits, sensing a greater power, flee through the walls. will be printed over and over. -------------------------------------------------------------------------- Screw up the timer daemons (all releases, plus many other Infocom games) -------------------------------------------------------------------------- In all versions of Zork 1, if you wait 32768 turns, the thief will quit moving, and neither the thief nor the troll will fight any more. You can walk around and attack them repeatedly and they won't fight back. Furthermore, the sword uses the trophy value property to keep track of whether its glowing lightly (a value of 1) or glowing brightly (a value of 2). If you go near the troll or thief after holding the sword 32767 turns, and wait one turn, the sword will glow permanently, and will have the trophy value of either 1 or 2. This means you can deposit it in the trophy case and win the game with 351 or 352 points. The reason this works is because of the way Infocom implemented daemons. Daemons were queued for an integer length of time. If the integer was positive, it would act as a count down, calling the named routine when the count reached zero. If negative, then the routine was called every turn. However, the count was still decremented, so that by waiting 32768 turns, the number overflowed to positive and the daemon became a timer. Every infocom game seemed to use the same bit of code, so similar bugs probably exist in other Infocom games (though note with games with hunger daemons or similar mechanisms, it's impossible to wait that many turns). --- ====================================================================== ------------------------------------------------------------ ZORK II ------------------------------------------------------------ ====================================================================== -------------------------------------------------------------------------- Volcano gnome crushes anything in scope (all releases) -------------------------------------------------------------------------- Added 2017-09-02 The common problem of not checking if something is held, especially when the verb "Throw" is used: >WAIT Time passes... A volcano gnome seems to walk straight out of the wall and says "I have a very busy appointment schedule and little time to waste on trespassers, but for a small fee, I'll show you the way out." You notice the gnome nervously glancing at his watch. >THROW GNOME AT GNOME "That wasn't quite what I had in mind," he says, crunching the Volcano Gnome in his rock-hard hands. Relevant code: [ VGnomeAction ; if (action == ##ThrowAt or ##Give && second == Volcano_Gnome) { ... Remove_Carefully(noun); "~That wasn't quite what I had in mind,~ he says, crunching the ", (name) noun, " in his rock-hard hands."; -------------------------------------------------------------------------- Use the glowing sword as a treasure (release 48 only) -------------------------------------------------------------------------- Added 2017-09-02 >give sword to demon "This will do for my fee. 'Tis a paltry hoard, but as you have done me a small service by loosing me from this wizard, it will suffice." >i You are carrying: A matchbook A stack of zorkmid bills A lamp (providing light) Why this works: The Demon checks if the value property exists in an object, to see if it's a treasure. In Zork I (and Zork II before release 48), the the value was used for how brightly the sword was glowing. It was removed in Zork II, but the value property still exists and is set to 0. So the Demon accepts it as a treasure. Side effect: You can give the last treasure to the Demon and win with 402 points. Relevant code: From the demon: if (noun.&value) { Remove_Carefully(noun); ++Demon_treasures; ScoreUPD(2); tcnt = Demon_treasures + TrophyCount(); if (tcnt >= 10) { Demon_paid = true; Wizard.description = "A dejected and fearful Wizard watches from the corner."; "~This will do for my fee. 'Tis a paltry hoard, but as you have done me a small service by loosing me from this wizard, it will suffice.~"; } This was changed from release 23, where the code was: if (noun has treasure) { Remove_Carefully(noun); ++Demon_treasures; ScoreUPD(2); The sword: Object -> -> sword "sword" with value 0, initial "A sword of Elvish workmanship is on the ground.", -------------------------------------------------------------------------- Unicorn in the guarded room: -------------------------------------------------------------------------- Zork 2: Go to the room with the lizard on the door, and try to unlock it with anything (for instance 'unlock door with lamp'). There is a 1 in 5 chance that the game will print "But you drop the key" (when the lizard snaps at you). At this point, the game will move the delicate gold key to the room, regardless of what you tried to lock it with. - >LOOK Guarded Room This room is cobwebby and musty, but there are tracks in the dust that show it has seen visitors recently. At the south end of the room is a stained and battered (but very strong-looking) door. To the north, a corridor exits. Imbedded in the door is a nasty-looking lizard head, with sharp teeth and beady eyes. The eyes move to watch you approach. >UNLOCK DOOR WITH SWORD The lizard door keeper comes awake and bites at your hand. You jerk away just in time. You drop the key, though. >GET KEY The unicorn, unsurprised by this evidence that you are indeed the uncouth sort of vagabond it suspected you were, melts into the hedges and is gone. - Relevant code: [ CobwebDoorAction ; if (~~Lizard_asleep) { if (action == ##Open) { "The lizard comes to life and snaps at you as you reach for the handle."; } if (action ~= ##Unlock) rfalse; print "The lizard door keeper comes awake and bites at your hand. You jerk away just in time."; if (second == delicate_gold_key && 5 > random(100)) { remove delicate_gold_key; " The guardian does get the key, though. It grins maniacally."; } if (20 > random(100)) { move delicate_gold_key to location; " You drop the key, though."; } new_line; rtrue; } -------------------------------------------------------------------------- Drop water anywhere (through release 17, fixed in 18) -------------------------------------------------------------------------- Added: 2017-08-31 Little inconsistency: >LOOK Shallow Ford You are at the southern edge of a great cavern. To the south across a shallow ford, is a dark tunnel which looks as though it was once enlarged and smoothed. To the north a narrow path winds among stalagmites. Dim light illuminates the cavern. >EXAMINE WATER I see nothing special about the quantity of water. >DROP WATER The water spills to the floor and evaporates immediately. Relevant code (they added the held check): if (action == ##Give or ##Drop) { if (noun == quantity_of_water && (~~ThingInPlayer(quantity_of_water))) { "You don't have any water."; } remove quantity_of_water; if (av) { return WetVehicle(av); } print "The water spills to the floor and evaporates immediately."; new_line; remove quantity_of_water; rtrue; } -------------------------------------------------------------------------- Drop anything in scope while FLOATing -------------------------------------------------------------------------- Added 2017-09-02 The Wizard's spell "Float" has no checks to see if you have the object in question, so you can do things like "drop grue" while floating in the air. It moves the object to your location. Relevant code: if (PlayerStatus == S_FLOAT) { if (action == ##Wait or ##Diagnose) rfalse; if (action == ##Go) { "I suppose you plan to do that by flapping your arms?"; } if (action == ##Drop) { move noun to location; "The ", (name) noun, " drops to the ground."; } -------------------------------------------------------------------------- Throw anything thru the curtain of light (through release 17, fixed in 18) or Steal the Wizard's wand! -------------------------------------------------------------------------- Added: 2017-08-31 >LOOK Safety Depository This is a large rectangular room. The east and west walls here were used for storing safety deposit boxes. As might be expected, all have been carefully removed by evil persons. To the east, west, and south of the room are large doorways. The northern "wall" of the room is a shimmering curtain of light. In the center of the room is a large stone cube, about 10 feet on a side. Engraved on the side of the cube is some lettering. On the ground is a small, worn piece of paper. >THROW GRUE AT CURTAIN The curtain dims slightly as the lurking grue passes through. - You can also get the Wizard's wand: A strange little man in a long cloak appears suddenly in the room. He is wearing a high pointed hat embroidered with astrological signs. He has a long, stringy, and unkempt beard. The Wizard draws forth his wand and waves it in your direction. It begins to glow with a faint blue glow. The Wizard seems about to say something, but thinks better of it, and peers at you from under his bushy eyebrows. >THROW WAND AT CURTAIN The curtain dims slightly as the Wizard's magic wand passes through. >W Safety Depository On the ground is a small, worn piece of paper. >WALK THROUGH CURTAIN You feel somewhat disoriented as you pass through... West Viewing Room This room was used by holders of safety deposit boxes to view their contents. On the north side of the room is a sign which says "Remain here while the teller retrieves your safety deposit box. When you are finished, leave the box, and exit to the south. Safety deposit boxes cannot be removed from this room! Thank You for Banking at the Zork!" >L AT WAND I see nothing special about the Wizard's magic wand. >GET WAND Taken. Relevant code (r17): [ CurtainAction obj ; ... if (action ~= ##ThrowAt || second ~= curtain_of_light or obj) rfalse; return EnterObjSub(noun); ]; Fix: (r18) [ CurtainAction obj ; ... if (noun in actor) { return EnterObjSub(noun); } "You don't have that!"; ]; -------------------------------------------------------------------------- Use the robot to take the wizard's wand (through release 15) -------------------------------------------------------------------------- Added: 2017-08-31 Relevant code (diff between 15 and 17) 9173,9174c9192,9197 < if (action == ##Give or ##Insert or ##Take && actor == cretin && Magic_wand in Wizard) { < "The Wizard snatches it away."; --- > if (action == ##Give or ##Insert or ##Take && Magic_wand in Wizard) { > if (actor == cretin) { > "The Wizard snatches it away."; > } > if (actor ~= robot) rfalse; > return JigsUp("The Wizard snatches the wand away, muttering the word > ~Float~ at the robot. Unfortunately he has no floating point > processor and dies in a vain attempt to divide 4.85 by 3.62, > expiring with a pitiful ~Click, click, click.~"); -------------------------------------------------------------------------- Fall to death in Circular room or Posts Room with volcano message (fixed release 23) -------------------------------------------------------------------------- Added: 2017-08-31 You can die with a volcano message while you're shrunk if the wizard casts "FLOAT", or if you're in the bottom of the well. Relevant code (first for shrinking only): [ GreenCakeAction obj sib ; if (action == ##Eat && noun == green_cake && location == Tea_Room) { print "Suddenly, the room appears to have become very large (although everything you are carrying seems to be its normal size)."; ... if (obj ~= cretin && obj has takeable) { give obj air_room; /* note: this is the spell wears off timer */ [ WizardDaemon chance cnt itm env ; ... if (PlayerStatus == S_FLOAT) { if (location has air_room) { JigsUp("As the spell wears off, you find yourself making a half-gainer towards the bottom of the volcano."); ! not popped } else if (location == Top_of_Well) { JigsUp("You plunge to the bottom of the shaft as the spell wears off."); ! not popped } Fixed in r48: if (location hasnt air_room || location == Circular_Room or Volcano_Bottom) jump labelXXX; JigsUp("As the spell wears off, you find yourself making a half-gainer towards the bottom of the volcano."); ! not popped rtrue; ====================================================================== ------------------------------------------------------------ ZORK III ------------------------------------------------------------ ====================================================================== -------------------------------------------------------------------------- Throw bug -------------------------------------------------------------------------- >THROW GUARDIANS AT GUARDIANS The Guardians of Zork falls in front of the guardians, who destroy it in perfect unison. Satisfied, they resume their posts. Anything in scope can be thrown at them for the same effect. Similarly: >THROW BOAT AT OCEAN The Viking Ship falls into the ocean and is lost forever. Relevant code (no check on the noun): if (action == ##ThrowAt && second == Guardians_of_Zork) { print "The ", (name) noun, " flies within sight of the guardians, who, in perfect unison, destroy it utterly. Satisfied, they resume their posts."; new_line; remove noun; rtrue; } ... if (action ~= ##ThrowAt or ##Insert || second ~= Flathead_Ocean1) rfalse; print "The ", (name) noun, " falls into the ocean and is lost forever."; new_line; remove noun; rtrue; ... if (location == Parapet or North_Corridor) { if (noun == you) { "It would be a pity to end your life so near the end of your quest!"; } print "You cast the ", (name) noun, " into the pit, where it is lost forever."; new_line; remove noun; rtrue; } --- The game uses an array to store objects that you drop in a particular 'room' in the maze. The entire maze is actually represented by just one object, and anything you drop is removed from the game when you "move" in the maze. Then when you go back to that part of the maze, it moves the objects stored in that part of the array back to the maze. The problem is, the double-dimensional array only has 8 slots for each maze room. If you drop more than 8 objects, it messes up the array. You can go east and find some of the objects. If you drop them and there's a wall to the east, you can lose the items forever.