BSD 4_2 development
[unix-history] / usr / doc / rogue
CommitLineData
34e3bd11
C
1.ds E \s-2<ESCAPE>\s0
2.ds R \s-2<RETURN>\s0
3.ds U \s-2UNIX\s0
4.ie t .ds _ \d\(mi\u
5.el .ds _ _
6.de Cs
7\&\\$3\*(lq\\$1\*(rq\\$2
8..
9.sp 5
10.ce 1000
11.ps +4
12.vs +4p
13.b
14A Guide to the Dungeons of Doom
15.r
16.vs
17.ps
18.sp 2
19.i
20Michael C. Toy
21Kenneth C. R. C. Arnold
22.r
23.sp 2
24Computer Systems Research Group
25Department of Electrical Engineering and Computer Science
26University of California
27Berkeley, California 94720
28.sp 4
29.i ABSTRACT
30.ce 0
31.(b I F
32.bi Rogue
33is a visual CRT based fantasy game
34which runs under the \*U\(dg timesharing system.
35.(f
36\fR\(dg\*U is a trademark of Bell Laboratories\fP
37.)f
38This paper describes how to play rogue,
39and gives a few hints
40for those who might otherwise get lost in the Dungeons of Doom.
41.)b
42.he '''\fBA Guide to the Dungeons of Doom\fP'
43.fo ''- % -''
44.bp 1
45.sh 1 Introduction
46.pp
47You have just finished your years as a student at the local fighter's guild.
48After much practice and sweat you have finally completed your training
49and are ready to embark upon a perilous adventure.
50As a test of your skills,
51the local guildmasters have sent you into the Dungeons of Doom.
52Your task is to return with the Amulet of Yendor.
53Your reward for the completion of this task
54will be a full membership in the local guild.
55In addition,
56you are allowed to keep all the loot you bring back from the dungeons.
57.pp
58In preparation for your journey,
59you are given an enchanted mace,
60a bow, and a quiver of arrows
61taken from a dragon's hoard in the far off Dark Mountains.
62You are also outfitted with elf-crafted armor
63and given enough food to reach the dungeons.
64You say goodbye to family and friends for what may be the last time
65and head up the road.
66.pp
67You set out on your way to the dungeons
68and after several days of uneventful travel,
69you see the ancient ruins
70that mark the entrance to the Dungeons of Doom.
71It is late at night,
72so you make camp at the entrance
73and spend the night sleeping under the open skies.
74In the morning you gather your weapons,
75put on your armor,
76eat what is almost your last food,
77and enter the dungeons.
78.sh 1 "What is going on here?"
79.pp
80You have just begun a game of rogue.
81Your goal is to grab as much treasure as you can,
82find the Amulet of Yendor,
83and get out of the Dungeons of Doom alive.
84On the screen,
85a map of where you have been
86and what you have seen on the current dungeon level is kept.
87As you explore more of the level,
88it appears on the screen in front of you.
89.pp
90Rogue differs from most computer fantasy games in that it is screen oriented.
91Commands are all one or two keystrokes\**
92.(f
93\** As opposed to pseudo English sentences.
94.)f
95and the results of your commands
96are displayed graphically on the screen rather
97than being explained in words.\**
98.(f
99\** A minimum screen size of 24 lines by 80 columns is required.
100If the screen is larger, only the 24x80 section will be used
101for the map.
102.)f
103.pp
104Another major difference between rogue and other computer fantasy games
105is that once you have solved all the puzzles in a standard fantasy game,
106it has lost most of its excitement and it ceases to be fun.
107Rogue,
108on the other hand,
109generates a new dungeon every time you play it
110and even the author finds it an entertaining and exciting game.
111.sh 1 "What do all those things on the screen mean?"
112.pp
113In order to understand what is going on in rogue
114you have to first get some grasp of what rogue is doing with the screen.
115The rogue screen is intended
116to replace the \*(lqYou can see ...\*(rq descriptions
117of standard fantasy games.
118Figure 1 is a sample of what a rogue screen might look like.
119.(z
120.hl
121.nf
122.TS
123center;
124ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce0 ce.
125- - - - - - - - - - - -
126| . . . . . . . . . . +
127| . . @ . . . . ] . . |
128| . . . . B . . . . . |
129| . . . . . . . . . . |
130- - - - - + - - - - - -
131.TE
132
133
134.ce 1000
135Level: 1 Gold: 0 Hp: 12(12) Str: 16(16) Ac: 6 Exp: 1/0
136
137Figure 1
138.ce
139.hl
140.)z
141.sh 2 "The bottom line"
142.pp
143At the bottom line of the screen
144are a few pieces of cryptic information
145describing your current status.
146Here is an explanation of what these things mean:
147.ip Level \w'Level\ \ 'u
148This number indicates how deep you have gone in the dungeon.
149It starts at one and goes up as you go deeper into the dungeon.
150.ip Gold \w'Level\ \ 'u
151The number of gold pieces you have managed to find
152and keep with you so far.
153.ip Hp \w'Level\ \ 'u
154Your current and maximum hit points.
155Hit points indicate how much damage you can take before you die.
156The more you get hit in a fight,
157the lower they get.
158You can regain hit points by resting.
159The number in parentheses
160is the maximum number your hit points can reach.
161.ip Str \w'Level\ \ 'u
162Your current strength and maximum ever strength.
163This can be any integer less than or equal to 31,
164or greater than or equal to three.
165The higher the number,
166the stronger you are.
167The number in the parentheses
168is the maximum strength you have attained so far this game.
169.ip Ac \w'Level\ \ 'u
170Your current armor class.
171This number indicates how effective your armor is
172in stopping blows from unfriendly creatures.
173The lower this number is,
174the more effective the armor.
175.ip Exp \w'Level\ \ 'u
176These two numbers give your current experience level
177and experience points.
178As you do things,
179you gain experience points.
180At certain experience point totals,
181you gain an experience level.
182The more experienced you are,
183the better you are able to fight and to withstand magical attacks.
184.sh 2 "The top line"
185.pp
186The top line of the screen is reserved
187for printing messages that describe things
188that are impossible to represent visually.
189If you see a \*(lq--More--\*(rq on the top line,
190this means that rogue wants to print another message on the screen,
191but it wants to make certain
192that you have read the one that is there first.
193To read the next message,
194just type a space.
195.sh 2 "The rest of the screen"
196.pp
197The rest of the screen is the map of the level
198as you have explored it so far.
199Each symbol on the screen represents something.
200Here is a list of what the various symbols mean:
201.ip @
202This symbol represents you, the adventurer.
203.ip "-\^|"
204These symbols represent the walls of rooms.
205.ip +
206A door to/from a room.
207.ip .
208The floor of a room.
209.ip #
210The floor of a passage between rooms.
211.ip *
212A pile or pot of gold.
213.ip )
214A weapon of some sort.
215.ip ]
216A piece of armor.
217.ip !
218A flask containing a magic potion.
219.ip ?
220A piece of paper, usually a magic scroll.
221.ip =
222A ring with magic properties
223.ip /
224A magical staff or wand
225.ip ^
226A trap, watch out for these.
227.ip %
228A staircase to other levels
229.ip :
230A piece of food.
231.ip A-Z
232The uppercase letters
233represent the various inhabitants of the Dungeons of Doom.
234Watch out, they can be nasty and vicious.
235.sh 1 Commands
236.pp
237Commands are given to rogue by typing one or two characters.
238Most commands can be preceded by a count to repeat them
239(e.g. typing
240.Cs 10s
241will do ten searches).
242Commands for which counts make no sense
243have the count ignored.
244To cancel a count or a prefix,
245type \*E.
246The list of commands is rather long,
247but it can be read at any time during the game with the
248.Cs ?
249command.
250Here it is for reference,
251with a short explanation of each command.
252.ip ?
253The help command.
254Asks for a character to give help on.
255If you type a
256.Cs * ,
257it will list all the commands,
258otherwise it will explain what the character you typed does.
259.ip /
260This is the \*(lqWhat is that on the screen?\*(rq command.
261A
262.Cs /
263followed by any character that you see on the level,
264will tell you what that character is.
265For instance,
266typing
267.Cs /@
268will tell you that the
269.Cs @
270symbol represents you, the player.
271.ip "h, H, ^H"
272Move left.
273You move one space to the left.
274If you use upper case
275.Cs h ,
276you will continue to move left until you run into something.
277This works for all movement commands
278(e.g.
279.Cs L
280means run in direction
281.Cs l )
282If you use the \*(lqcontrol\*(rq
283.Cs h ,
284you will continue moving in the specified direction
285until you pass something interesting or run into a wall.
286You should experiment with this,
287since it is a very useful command,
288but very difficult to describe.
289This also works for all movement commands.
290.ip j
291Move down.
292.ip k
293Move up.
294.ip l
295Move right.
296.ip y
297Move diagonally up and left.
298.ip u
299Move diagonally up and right.
300.ip b
301Move diagonally down and left.
302.ip n
303Move diagonally down and right.
304.ip t
305Throw an object.
306This is a prefix command.
307When followed with a direction
308it throws an object in the specified direction.
309(e.g. type
310.Cs th
311to throw
312something to the left.)
313.ip f
314Fight until someone dies.
315When followed with a direction
316this will force you to fight the creature in that direction
317until either you or it bites the big one.
318.ip m
319Move onto something without picking it up.
320This will move you one space in the direction you specify and,
321if there is an object there you can pick up,
322it won't do it.
323.ip z
324Zap prefix.
325Point a staff or wand in a given direction
326and fire it.
327Even non-directional staves must be pointed in some direction
328to be used.
329.ip ^
330Identify trap command.
331If a trap is on your map
332and you can't remember what type it is,
333you can get rogue to remind you
334by getting next to it and typing
335.Cs ^
336followed by the direction that would move you on top of it.
337.ip s
338Search for traps and secret doors.
339Examine each space immediately adjacent to you
340for the existence of a trap or secret door.
341There is a large chance that even if there is something there,
342you won't find it,
343so you might have to search a while before you find something.
344.ip >
345Climb down a staircase to the next level.
346Not surprisingly, this can only be done if you are standing on staircase.
347.ip <
348Climb up a staircase to the level above.
349This can't be done without the Amulet of Yendor in your possession.
350.ip "."
351Rest.
352This is the \*(lqdo nothing\*(rq command.
353This is good for waiting and healing.
354.ip *
355Inventory.
356List what you are carrying in your pack.
357.ip I
358Selective inventory.
359Tells you what a single item in your pack is.
360.ip q
361Quaff one of the potions you are carrying.
362.ip r
363Read one of the scrolls in your pack.
364.ip e
365Eat food from your pack.
366.ip w
367Wield a weapon.
368Take a weapon out of your pack and carry it for use in combat,
369replacing the one you are currently using (if any).
370.ip W
371Wear armor.
372You can only wear one suit of armor at a time.
373This takes extra time.
374.ip T
375Take armor off.
376You can't remove armor that is cursed.
377This takes extra time.
378.ip P
379Put on a ring.
380You can wear only two rings at a time
381(one on each hand).
382If you aren't wearing any rings,
383this command will ask you which hand you want to wear it on,
384otherwise, it will place it on the unused hand.
385The program assumes that you wield your sword in your right hand.
386.ip R
387Remove a ring.
388If you are only wearing one ring,
389this command takes it off.
390If you are wearing two,
391it will ask you which one you wish to remove,
392.ip d
393Drop an object.
394Take something out of your pack and leave it lying on the floor.
395Only one object can occupy each space.
396You cannot drop a cursed object at all
397if you are wielding or wearing it.
398.ip c
399Call an object something.
400If you have a type of object in your pack
401which you wish to remember something about,
402you can use the call command to give a name to that type of object.
403This is usually used when you figure out what a
404potion, scroll, ring, or staff is
405after you pick it up,
406or when you want to remember
407which of those swords in your pack you were wielding.
408.ip D
409Print out which things you've discovered something about.
410This command will ask you what type of thing you are interested in.
411If you type the character for a given type of object
412(\fIe.g.\fP
413.Cs !
414for potion)
415it will tell you which kinds of that type of object you've discovered
416(\fIi.e.\fP, figured out what they are).
417This command works for potions, scrolls, rings, and staves and wands.
418.ip o
419Examine and set options.
420This command is further explained in the section on options.
421.ip ^R
422Redraws the screen.
423Useful if spurious messages or transmission errors
424have messed up the display.
425.ip ^P
426Print last message.
427Useful when a message disappears before you can read it.
428This only repeats the last message
429that was not a mistyped command
430so that you don't loose anything by accidentally typing
431the wrong character instead of ^P.
432.ip \*E
433Cancel a command, prefix, or count.
434.ip !
435Escape to a shell for some commands.
436.ip Q
437Quit.
438Leave the game.
439.ip S
440Save the current game in a file.
441It will ask you whether you wish to use the default save file.
442.i Caveat :
443Rogue won't let you start up a copy of a saved game,
444and it removes the save file as soon as you start up a restored game.
445This is to prevent people from saving a game just before a dangerous position
446and then restarting it if they die.
447To restore a saved game,
448give the file name as an argument to rogue.
449As in
450.ti +1i
451.nf
452% rogue \fIsave\*_file\fP
453.ip
454To restart from the default save file (see below),
455run
456.ti +1i
457.nf
458% rogue \-r
459.ip v
460Prints the program version number.
461.ip )
462Print the weapon you are currently wielding
463.ip ]
464Print the armor you are currently wearing
465.ip =
466Print the rings you are currently wearing
467.ip @
468Reprint the status line on the message line
469.sh 1 Rooms
470.pp
471Rooms in the dungeons are either lit or dark.
472If you walk into a lit room,
473the entire room will be drawn on the screen as soon as you enter.
474If you walk into a dark room,
475it will only be displayed as you explore it.
476Upon leaving a room,
477all monsters inside the room
478are erased from the screen.
479In the darkness you can only see one space
480in all directions around you.
481A corridor is always dark.
482.sh 1 Fighting
483.pp
484If you see a monster and you wish to fight it,
485just attempt to run into it.
486Many times a monster you find will mind its own business
487unless you attack it.
488It is often the case that discretion is the better part of valor.
489.sh 1 "Objects you can find"
490.pp
491When you find something in the dungeon,
492it is common to want to pick the object up.
493This is accomplished in rogue by walking over the object
494(unless you use the
495.Cs m
496prefix, see above).
497If you are carrying too many things,
498the program will tell you and it won't pick up the object,
499otherwise it will add it to your pack
500and tell you what you just picked up.
501.pp
502Many of the commands that operate on objects must prompt you
503to find out which object you want to use.
504If you change your mind and don't want to do that command after all,
505just type an \*E and the command will be aborted.
506.pp
507Some objects, like armor and weapons,
508are easily differentiated.
509Others, like scrolls and potions,
510are given labels which vary according to type.
511During a game,
512any two of the same kind of object
513with the same label
514are the same type.
515However,
516the labels will vary from game to game.
517.pp
518When you use one of these labeled objects,
519if its effect is obvious,
520rogue will remember what it is for you.
521If it's effect isn't extremely obvious
522you will be asked what you want to scribble on it
523so you will recognize it later,
524or you can use the
525.Cs call
526command
527(see above).
528.sh 2 Weapons
529.pp
530Some weapons,
531like arrows,
532come in bunches,
533but most come one at a time.
534In order to use a weapon,
535you must wield it.
536To fire an arrow out of a bow,
537you must first wield the bow,
538then throw the arrow.
539You can only wield one weapon at a time,
540but you can't change weapons if the one
541you are currently wielding is cursed.
542The commands to use weapons are
543.Cs w
544(wield)
545and
546.Cs t
547(throw).
548.sh 2 Armor
549.pp
550There are various sorts of armor lying around in the dungeon.
551Some of it is enchanted,
552some is cursed,
553and some is just normal.
554Different armor types have different armor classes.
555The lower the armor class,
556the more protection the armor affords against the blows of monsters.
557Here is a list of the various armor types and their normal armor class:
558.(b
559.TS
560box center;
561l r.
562\ \ \fIType Class\fP
563None 10
564Leather armor 8
565Studded leather / Ring mail 7
566Scale mail 6
567Chain mail 5
568Banded mail / Splint mail 4
569Plate mail 3
570.TE
571.)b
572.lp
573If a piece of armor is enchanted,
574its armor class will be lower than normal.
575If a suit of armor is cursed,
576its armor class will be higher,
577and you will not be able to remove it.
578However, not all armor with a class that is higher than normal is cursed.
579.pp
580The commands to use weapons are
581.Cs W
582(wear)
583and
584.Cs T
585(take off).
586.sh 2 Scrolls
587.pp
588Scrolls come with titles in an unknown tongue\**.
589.(f
590\** Actually, it's a dialect spoken only by the twenty-seven members
591of a tribe in Outer Mongolia,
592but you're not supposed to
593.i know
594that.
595.)f
596After you read a scroll,
597it disappears from your pack.
598The command to use a scroll is
599.Cs r
600(read).
601.sh 2 Potions
602.pp
603Potions are labeled by the color of the liquid inside the flask.
604They disappear after being quaffed.
605The command to use a scroll is
606.Cs q
607(quaff).
608.sh 2 "Staves and Wands"
609.pp
610Staves and wands do the same kinds of things.
611Staves are identified by a type of wood;
612wands by a type of metal or bone.
613They are generally things you want to do to something
614over a long distance,
615so you must point them at what you wish to affect
616to use them.
617Some staves are not affected by the direction they are pointed, though.
618Staves come with multiple magic charges,
619the number being random,
620and when they are used up,
621the staff is just a piece of wood or metal.
622.pp
623The command to use a wand or staff is
624.Cs z
625(zap)
626.sh 2 Rings
627.pp
628Rings are very useful items,
629since they are relatively permanent magic,
630unlike the usually fleeting effects of potions, scrolls, and staves.
631Of course,
632the bad rings are also more powerful.
633Most rings also cause you to use up food more rapidly,
634the rate varying with the type of ring.
635Rings are differentiated by their stone settings.
636The commands to use rings are
637.Cs P
638(put on)
639and
640.Cs R
641(remove).
642.sh 2 Food
643.pp
644Food is necessary to keep you going.
645If you go too long without eating you will faint,
646and eventually die of starvation.
647The command to use food is
648.Cs e
649(eat).
650.sh 1 Options
651.pp
652Due to variations in personal tastes
653and conceptions of the way rogue should do things,
654there are a set of options you can set
655that cause rogue to behave in various different ways.
656.sh 2 "Setting the options"
657.pp
658There are two ways to set the options.
659The first is with the
660.Cs o
661command of rogue;
662the second is with the
663.Cs ROGUEOPTS
664environment variable\**.
665.(f
666\** On Version 6 systems,
667there is no equivalent of the ROGUEOPTS feature.
668.br
669.)f
670.br
671.sh 3 "Using the `o' command"
672.pp
673When you type
674.Cs o
675in rogue,
676it clears the screen
677and displays the current settings for all the options.
678It then places the cursor by the value of the first option
679and waits for you to type.
680You can type a \*R
681which means to go to the next option,
682a
683.Cs \-
684which means to go to the previous option,
685an \*E
686which means to return to the game,
687or you can give the option a value.
688For boolean options this merely involves typing
689.Cs t
690for true or
691.Cs f
692for false.
693For string options,
694type the new value followed by a \*R.
695.sh 3 "Using the ROGUEOPTS variable"
696.pp
697The ROGUEOPTS variable is a string
698containing a comma separated list of initial values
699for the various options.
700Boolean variables can be turned on by listing their name
701or turned off by putting a
702.Cs no
703in front of the name.
704Thus to set up an environment variable so that
705.b jump
706is on,
707.b terse
708is off,
709and the
710.b name
711is set to \*(lqBlue Meanie\*(rq,
712use the command
713.nf
714.ti +3n
715% setenv ROGUEOPTS "jump,noterse,name=Blue Meanie"\**
716.fi
717.(f
718\**
719For those of you who use the bourne shell, the commands would be
720.in +3
721.nf
722$ ROGUEOPTS="jump,noterse,name=Blue Meanie"
723$ export ROGUEOPTS
724.fi
725.in +0
726.)f
727.sh 2 "Option list"
728.pp
729Here is a list of the options
730and an explanation of what each one is for.
731The default value for each is enclosed in square brackets.
732For character string options,
733input over fifty characters will be ignored.
734.ip "\fBterse\fP [\fI\^noterse\^\fP]"
735Useful for those who are tired of the sometimes lengthy messages of rogue.
736This is a useful option for playing on slow terminals,
737so this option defaults to
738.i terse
739if you
740are on a slow (1200 baud or under) terminal.
741.ip "\fBjump\fP [\fI\^nojump\^\fP]"
742If this option is set,
743running moves will not be displayed
744until you reach the end of the move.
745This saves considerable cpu and display time.
746This option defaults to
747.i jump
748if you are using a slow terminal.
749.ip "\fBflush\fP [\fI\^noflush\^\fP]"
750All typeahead is thrown away after each round of battle.
751This is useful for those who type far ahead
752and then watch in dismay as a Bat kills them.
753.ip "\fBseefloor\fP [\fI\^seefloor\^\fP]"
754Display the floor around you on the screen
755as you move through dark rooms.
756Due to the amount of characters generated,
757this option defaults to
758.i noseefloor
759if you are using a slow terminal.
760.ip "\fBpassgo\fP [\fI\^nopassgo\^\fP]"
761Follow turnings in passageways.
762If you run in a passage
763and you run into stone or a wall,
764rogue will see if it can turn to the right or left.
765If it can only turn one way,
766it will turn that way.
767If it can turn either or neither,
768it will stop.
769This is followed strictly,
770which can sometimes lead to slightly confusing occurrences
771(which is why it defaults to
772.i nopassgo ).
773.ip "\fBtombstone\fP [\fI\^tombstone\^\fP]"
774Print out the tombstone at the end if you get killed.
775This is nice but slow, so you can turn it off if you like.
776.ip "\fBinven\fP [\fI\^overwrite\^\fP]"
777Inventory type.
778This can have one of three values:
779.i overwrite ,
780.i slow ,
781or
782.i clear .
783With
784.i overwrite
785the top lines of the map are overwritten
786with the list
787when inventory is requested
788or when
789\*(lqWhich item do you wish to \fB. . .\fP? \*(rq questions
790are answered with a
791.Cs * .
792However, if the list is longer than a screenful,
793the screen is cleared.
794With
795.i slow ,
796lists are displayed one item at a time on the top of the screen,
797and with
798.i clear ,
799the screen is cleared,
800the list is displayed,
801and then the dungeon level is re-displayed.
802Due to speed considerations,
803.i clear
804is the default for terminals without
805clear-to-end-of-line capabilities.
806.ip "\fBname\fP [account name]"
807This is the name of your character.
808It is used if you get on the top ten scorer's list.
809.ip "\fBfruit\fP [\fI\^slime-mold\^\fP]"
810This should hold the name of a fruit that you enjoy eating.
811It is basically a whimsey that rogue uses in a couple of places.
812.ip "\fBfile\fP [\fI\^~/rogue.save\^\fP]"
813The default file name for saving the game.
814If your phone is hung up by accident,
815rogue will automatically save the game in this file.
816The file name may start with the special character
817.Cs ~
818which expands to be your home directory.
819.sh 1 Scoring
820.pp
821Rogue usually maintains a list
822of the top scoring people or scores on your machine.
823Depending on how it is set up,
824it can post either the top scores
825or the top players.
826In the latter case,
827each account on the machine
828can post only one non-winning score on this list.
829If you score higher than someone else on this list,
830or better your previous score on the list,
831you will be inserted in the proper place
832under your current name.
833How many scores are kept
834can also be set up by whoever installs it on your machine.
835.pp
836If you quit the game, you get out with all of your gold intact.
837If, however, you get killed in the Dungeons of Doom,
838your body is forwarded to your next-of-kin,
839along with 90% of your gold;
840ten percent of your gold is kept by the Dungeons' wizard as a fee\**.
841.(f
842\** The Dungeon's wizard is named Wally the Wonder Badger.
843Invocations should be accompanied by a sizable donative.
844.)f
845This should make you consider whether you want to take one last hit
846at that monster and possibly live,
847or quit and thus stop with whatever you have.
848If you quit, you do get all your gold,
849but if you swing and live, you might find more.
850.pp
851If you just want to see what the current top players/games list is,
852you can type
853.ti +1i
854.nf
855% rogue \-s
856.br
857.sh 1 Acknowledgements
858.pp
859Rogue was originally conceived of by Glenn Wichman and Michael Toy.
860Ken Arnold and Michael Toy then smoothed out the user interface,
861and added jillions of new features.
862We would like to thank
863Bob Arnold,
864Michelle Busch,
865Andy Hatcher,
866Kipp Hickman,
867Mark Horton,
868Daniel Jensen,
869Bill Joy,
870Joe Kalash,
871Steve Maurer,
872Marty McNary,
873Jan Miller,
874and
875Scott Nelson
876for their ideas and assistance;
877and also the teeming multitudes
878who graciously ignored work, school, and social life to play rogue
879and send us bugs, complaints, suggestions, and just plain flames.
880And also Mom.