the-infocom-files/zork1

The thief never picks up objects in the maze (unless you are in the same room)

Opened this issue · 0 comments

The standard trick for mapping mazes is, of course, to drop an object in every room. The thief is probably supposed to make that harder, because he can pick things up in any room you've previously visited. This is usually done by the STEAL-JUNK routine, but if both you and the thief are in the maze at the time it instead calls ROB-MAZE.

Presumably to make it less punishing, the game tells you whenever the thief does this in the maze, by printing a message like:

You hear, off in the distance, someone saying "My, I wonder what this fine rusty
knife is doing here."

So that you'll know that you can no longer trust your notes on which maze room that object was in. Except... that never actually happens in the game. The thief doesn't rob the maze rooms, and that's probably because of this bit in DESCRIBE-ROOM:

         <COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
                <FSET ,HERE ,TOUCHBIT>
                <SET V? T>)>
         %<COND (<==? ,ZORK-NUMBER 1>
                 '<COND (<FSET? ,HERE ,MAZEBIT>
                         <FCLEAR ,HERE ,TOUCHBIT>)>)
                (T
                 '<NULL-F>)>

If you haven't been in the room before, the game sets TOUCHBIT on it to mark it as visited, and sets V? to indicate that it should print the full room description (it may already be set to true for other reasons).

But then, if it's Zork I, it clears TOUCHBIT if you're in a maze room. I don't know if this was done to make the maze harder to map since you can no longer count on brief mode telling you which rooms you've already been in. But it also makes the maze easier to map, because the thief never robs the maze rooms.

If the purpose is just to print full room descriptions in the maze, we can probably just set V? to true. Indeed, that's what the Solid Gold version does:

         <COND (<NOT <FSET? ,HERE ,TOUCHBIT>>
                <FSET ,HERE ,TOUCHBIT>
                <SET V? T>)>
         %<COND (<==? ,ZORK-NUMBER 1>
                 '<COND (<FSET? ,HERE ,MAZEBIT>
                         <SET V? T>)>)
                (T
                 '<NULL-F>)>

And in that version, the thief does rob the maze rooms.