games@tekred.TEK.COM (12/01/88)
Submitted by: Richard Skrenta <skrenta@nuacc.acns.nwu.edu> Comp.sources.games: Volume 5, Issue 88 Archive-name: monster/Part01 [As you can see from the subject line, this game is for VMS systems only. I split the source and doc files into smaller parts for distribution. They will automatically be catted together when all 6 parts are unpacked. I was unable to test this game, so you're on your own. -br] #! /bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 1 (of 6)." # Contents: README MANIFEST fixup.sh mon1.doc mon5.pas # Wrapped by billr@saab on Wed Nov 30 11:28:55 1988 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'README' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README'\" else echo shar: Extracting \"'README'\" \(1476 characters\) sed "s/^X//" >'README' <<'END_OF_FILE' XThis is README.TXT for Monster, a multiplayer adventure game for VMS. XMonster was written by Rich Skrenta at Northwestern University. X XYou may freely copy, distribute and change Monster as you wish. Let me Xknow if you get it up and running, and if you change it, just because I'm Xinterested. Send mail to X X skrenta@nuacc.acns.nwu.edu or X skrenta@nuacc.bitnet X XMonster was written in VMS Pascal under VMS 4.6. It uses file sharing and Xrecord locking for communication. Outside of that, it doesn't do anything Xtricky. However, after playing around with a VMS 4.2 system, I have Xdoubts if it will work on a system that old. If you've got a reasonably Xrecent version of VMS and a Pascal compiler, you shouldn't have any problems. X XThe Monster source is in two files: a short one, approx 300 lines, called Xguts.pas, and a big one, mon.pas, approx 10,000 lines. The compiled program Xcontains everything necessary to create and maintain the Monster universe. XThere is no separate maintenance program. Instead, a specific person in Xthe game has privileges, and is known as the "Monster Manager". The MM Xcan do system maintenance while playing, and other players can even observe Xhis work. X XCredit for the work to convert GUTS.PAS to a more portable form goes to X X Michael "the spide" Young MCY1580@RITVAX.BITNET X Chris "siouxane" Meck CLM4346@RITVAX.BITNET X XMany thanks to them for solving this sticky problem! X XRich Skrenta XNovember, 1988. END_OF_FILE if test 1476 -ne `wc -c <'README'`; then echo shar: \"'README'\" unpacked with wrong size! fi # end of 'README' fi if test -f 'MANIFEST' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'MANIFEST'\" else echo shar: Extracting \"'MANIFEST'\" \(610 characters\) sed "s/^X//" >'MANIFEST' <<'END_OF_FILE' X File Name Archive # Description X----------------------------------------------------------- X MANIFEST 1 This shipping list X README 1 X announce.txt 6 X fixup.sh 1 X guts.pas 6 X install.txt 4 X manifest.txt 2 X mon1.doc 1 X mon1.pas 4 X mon2.doc 6 X mon2.pas 3 X mon3.pas 5 X mon4.pas 2 X mon5.pas 1 X privusers.pas 5 X readme.txt 3 END_OF_FILE if test 610 -ne `wc -c <'MANIFEST'`; then echo shar: \"'MANIFEST'\" unpacked with wrong size! fi # end of 'MANIFEST' fi if test -f 'fixup.sh' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'fixup.sh'\" else echo shar: Extracting \"'fixup.sh'\" \(460 characters\) sed "s/^X//" >'fixup.sh' <<'END_OF_FILE' X#! /bin/sh Xecho "concatenating source and doc files" Xcat mon1.pas mon2.pas mon3.pas mon4.pas mon5.pas >mon.pas Xif test 223441 -eq `wc -c <'mon.pas'`; then X rm mon1.pas mon2.pas mon3.pas mon4.pas mon5.pas X echo "mon.pas complete" Xelse echo 'mon.pas incomplete (wrong size)' Xfi Xcat mon1.doc mon2.doc >monster.doc Xif test 74937 -eq `wc -c <'monster.doc'`; then X rm mon1.doc mon2.doc X echo "monster.doc complete" Xelse echo 'monster.doc incomplete (wrong size)' Xfi END_OF_FILE if test 460 -ne `wc -c <'fixup.sh'`; then echo shar: \"'fixup.sh'\" unpacked with wrong size! fi chmod +x 'fixup.sh' # end of 'fixup.sh' fi if test -f 'mon1.doc' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mon1.doc'\" else echo shar: Extracting \"'mon1.doc'\" \(48710 characters\) sed "s/^X//" >'mon1.doc' <<'END_OF_FILE' XMonster is a text-oriented computer adventure game. Like other traditional Xadventure games such as Zork and Adventure, Monster players issue simple Xcommands to direct a "puppet" through an artificial world. Players can Xexplore the world, pick up and make use of objects, and solve puzzles. X XHowever, Monster is quite different from other computer adventures in two Xrespects: first, Monster is a multiplayer game. In addition to the normal Xactions a player can effect on the simulated environment, players can also Xinteract with one another. Player characters can fight, talk, trade items Xand explore territory together. Monster is similar in this respect to some Xmultiplayer games available on computer networks such as the Source and XCompuserve. X XHowever, Monster allows players to do something that very few, if any, other Xgames allow: the players themselves create the fantasy world as part of the Xgame. Players can create objects, make locations, and set up puzzles for other Xplayers to solve. Game mechanisms allow players to: X X o Create and describe new objects and locations X o Specify how game objects function X o Provide text descriptions for events that may happen X XFor example, a player in Monster could create a room named "Great Hall", Xprovide a textual description for it (which other players would see upon Xentering the rooms), and describe special features of the room (for instance, Xa brass plaque on the wall). X XHere's what another player who walked into the room described above would see X(lines beginning with > are the player's input): X X > look X You're in Great Hall X You're in the middle of a vast hall stretching out of sight to the X east and west. Strange shadows play across the high vaulted ceiling. X The floor is set with smooth rectangular stones. The walls feel slightly X cold to the touch, and damp with condensation. A copper plaque, slightly X green with age, is set into one wall. X X > look plaque X X The plaque looks very old and corroded. However, you can still make out X the writing: X X " Monster, created by Rich Skrenta, 1988. Play at your own risk. " X XNow the creator of the rooms could add a secret passage, perhaps hidden Xunderneath some stones in the floor. To do this, first the player would Xdescribe what the stones looked like, then make a hidden exit to another Xlocation with a special command which would activate it. Here's what the player Xwould see after making these changes: X X > show details X Details here that you may inspect: X stones X plaque X > look stones X The stones are rough and black, and cold to the touch. Although the X mortar work appears to have been expertly done, it has decayed with time. X Many stones are cracked, and narrow spaces fracture the carefully laid X pattern. Some of the stones are quite loose. You might be able to lift X one of them with some effort. X > lift X With great effort, you manage to lift the stone enough to fit inside. X X Once below the stone, it falls back into place, sealing out the light X from above. You squirm down the narrow tunnel . . . X XThis example only hints at the details that actually go into the creation of a Xrealistic game puzzle. To set up a rich game location, a player would have to Xspecify: X X o A textual description of the room, as well as separate descriptions X for various rooms details (in the example above, the plaque and X the stones are room details) X o A description of each of the possible exits from the rooms (there X might be no description if the exit is hidden) X o What happens when an object is dropped at the location (for example, X if a player is swimming and he drops something, the object should X sink) as well as a message describing what happened to the object X o For each exit, a set of messages and parameters including: X - the name of the exit X - whether the exit requires a special object to pass (for X example, a door key or some magic object) X - a message displayed to the player if he can't successfully X leave through the exit (if he doesn't have the key, for X instance) X - an optional message that the player sees when he goes X through an exit (in the example above, the text "Once below X the stone, it falls back into place...." is such a message) X - a message that players inside the room see when someone X leaves through the exit X - a message that players inside the room see when another X player enters the room through the exit X - miscellaneous other parameters X X X XTechnical Aspects of Monster: X----------------------------- X XEach player who plays the Monster game runs a separate copy of the game. Each Xindividual Monster process shares a database containing all of the information Xabout the simulated world, including: X X o Records describing all of the rooms, interconnections between rooms, X objects, and descriptions for the above X o The locations of every player and object X o A special shared file used for interprocess communication X XEach of the Monster database files are organized as a linear collection Xof fixed-length records. Monster uses the following files: X X roomfile: file of records containing data on Monster locations X namfile: file containing names for objects, rooms and people X descfile: file of text description blocks (10 lines maximum) X linefile: file of short (one line) descriptions X intfile: file of various integer parameters X objfile: file of records containing data on Monster objects X indexfile: file of bitmaps for the other files; used to mark X free/inuse records for dynamic allocation X eventfile: file of records used for interprocess communication X X XRecord Locking: X--------------- X XWhen Monster tries to access a record in one of the shared data files, it first Xmakes a read attempt on the record. If the record is available (no other XMonster process is reading or writing it) VMS will lock and read the record and Xreturn successfully. If another process has locked the record, VMS will return Xan error condition. In this case the Monster process will wait a small random Xamount of time and attempt to read the record again. Then if the Monster Xprogram cannot successfully read and lock the record after a certain number of Xretries, it prints an error message and aborts. X XIn initial versions of Monster a count was kept of how many times two processes Xwould "collide" when both wanted to read one record. The random wait Xdramatically reduced this hit count. X XMonster's response time using this scheme is acceptable when the load on the VAX Xis not too high. However, it does have some drawbacks. The first is that a Xdata record being read by a Monster process is locked for a short time, even if Xthe process has no intention of writing to it. Also, the collide-and-wait Xapproach is somewhat crude considering VMS has extensive record locking Xfacilities which are capable not only of allowing multiple-read access to a Xrecord but also of queueing processes desiring to write-lock a record. XUnfortunately, the use of these facilities requires special VMS priviliges not Xavailable to ordinary users. X X XInterprocess Communication: X--------------------------- X XMonster processes communicate through a shared file. A communication from one Xprocess to another is referred to as an event; the shared file for communication Xis called the event file. Two player processes will only need to communicate Xif both players are in the same location, since actions in one room won't Xaffect gamers elsewhere. However, when two or more players are in the Xsame location, quite a lot of events may happen: X X o Notification of entry and exit -- players in the room must see when X other players come and go X o Notification of various actions -- such as picking up and dropping X objects, taking inventory and closely examining things X o Messages when players talk to each other in the game X o Primary, target and third-party events for fighting -- the player X throwing the punch sees one thing, the person being hit another, X and somone else watching sees a third message. X XBecause only player processes in the same Monster game location need to Xcommunicate, each room has an associated event file record. Each event file Xrecord contains a circular list of events with a pointer to the most recent Xevent. When a player enters a new room, either by moving or joining the game, Xthe Monster process reads the event file record for the room and makes a local Xcopy of the current event pointer. At periodic intervals, the Monster process Xwill reread the event file record and compare its local pointer to the one in Xthe event file. If they are different, other player processes have logged Xevents to the event record, and the Monster process will pull them off the list, Xhandle them, and update its own local pointer. When a process needs to log an Xevent, it write-locks the event file record, writes a new event, and updates the Xevent file pointer. X XThere are over sixty different events that a Monster process can initiate Xor handle; each event can be interpreted differently according to circumstances. XFor example, player A may whisper something to player B. Suppose player C is Xalso in the room. Player A's process logs an event containing the message, Xthe event type ("whisper") and the target of the whisper (player B) to the Xevent file record associated with their current location. X X > whisper b X >> Hey b, this is something I whispered to you. X XPlayer B's process will receive and handle the event: X X A whispers, "Hey b, this is something I whispered to you." X XPlayer C's process will also receive and handle the event. Usually C will only Xsee A and B whispering together: X X A is whispering to B. X XHowever, there is a small chance that C will overhear the message: X X You overhear A whispering to B: X "Hey b, this is something I whispered to you." X XThis method of interprocess communication requires that all Monster processes Xfrequently read the event file to see if any events have occured. This might Xseem less efficient than another scheme possibly using VMS mailboxes or shared Xmemory. Lack of sufficient VMS privileges prevented me from using shared Xmemory. Mailboxes might be more efficient, especially if used with the Vax's Xinterrupt system. However, several problems would be present: X X o In order to allow any process to communicate with any other, X full interconnection would be necessary. In addition, since VMS X mailboxes only transmit data in one direction, n Monster processes X would require 2n mailboxes. A scheme using mailboxes would quickly X exhaust process quota limits. X X o It is somewhat awkward to set up mailboxes and even more difficult X to inform other processes of their presence. Once again, I believe X that special VMS privileges might be necessary to do this. X XThe event file scheme of communication has proven flexible and is fast enough Xwhen the VAX load is not high. X X XMaintaining a Player's Existence in the Database: X------------------------------------------------- X XWhen a user runs Monster, it first checks a playerlog to see if he has ever Xplayed before. If so, the player is restored to the state he was in when he Xlast played, just before issuing the QUIT command. In the user is not found in Xthe playerlog, he is started out at an initial location, somewhat in the center Xof the world. X XTo place a player into a location, Monster scans the room record for a free X"person" slot to put the player's index into. Once the player is part of Xthe room record, he will be visible to other players who are also in that Xroom (providing he hasn't hidden himself), and they will be able to interact Xwith him. X XA dangerous situation occurs when a player process dies or becomes disconnected Xfor some reason. In this case, the room record shows that a certain player is Xin a location, but in fact there is no controlling Monster process for that Xplayer. There will be no process to handle events directed at that player. XThis is a bad situation because they player is not obviously "dead" to the Xother Monster programs, as interprocess communication only involves sending Xan event, and does not provide for receipt acknowledgement. X XThese "zombie" players were a serious nuisance in an early version of Monster. XThe Monster world appeared to be full of players, when in fact they were just Xghosts left from players typing the VAX interrupt character or becoming Xdisconnected from modems (Monster now inhibits the interrupt character to help Xprevent the casual creation of zombies). X XThere are two cases where a zombie game character may be detected: when Xanother player suspects that a game character is not being controlled by a real Xuser (either from a lack of response from the game character or by checking Xthe VAX user list); or when the player who created the zombie character attempts Xto play Monster again (only one player per account is allow to play Monster Xat a time, so if a player tries to enter Monster and also appears to be Xcurrently playing the game, either 1) two players on one account are trying Xto play Monster at the same time, or 2) the player character that appears Xto be currently playing Monster is really a zombie). X XTo handle the first case, when one player suspects another of being a zombie, Xthe player can issue the PING command. PING sends repeated events directed at Xthe suspected zombie, with short pauses between the sends. If PING does not Xreceive a response within a certain amount of time (currently about three Xseconds) it attempts to smoothly return the zombie character to the "inactive" X(not playing) state. This involves taking every object the player character was Xholding and dropping them on the ground, updating the "time of last play" record Xand modifying the playerlog to show that the player is not currently playing. X XIn the second case, when no other player has PINGed away the zombie and the Xoriginal player (the one responsible for the zombie character) attempts to Xreenter Monster, Monster will inform him: X X There may have been some trouble the last time you played. X Trying to fix it . . . X XAt this point, Monster itself attempts to PING the player's character. If Xtwo people on the same account are trying to play Monster at the same time Xthe PING will be answered and Monster will not let the second player into Xthe game. Otherwise, the player will enter Monster normally after a short Xpause: X X All should be fixed now. X X Welcome back, Faust. Your last play was on 13-MAY-1988 at 8:31pm. X XEven with this solution, there are still situations where trouble can arise with Xzombie characters. For example, suppose a player is on a modem playing Monster Xand becomes disconnected. Another player PINGs away the zombie character. The Xdialup player calls up the VAX again, and reconnects to his disconnected Xprocess. Now his Monster process still thinks the player character is alive in Xthe room (it has no knowledge of the disconnect) but the database shows that the Xplayer is inactive. X XIf only a few events have been logged in the associated event file record, the Xreconnnected Monster process will notice the fatal PING to itself (lingering in Xthe event file record) and will abort. However, if many events have occured Xwhile the process was disconnected, it will not be aware of the change to the Xdatabase. This will leave the database in an inconsistent state until the player XQUITs the game. Fortunately, when the player quits the database will be fixed. X XSince this problem will eventually correct itself (when the player quits) and Xbecause checking for this very rare situation would slow response time Xconsiderably (Monster would have to verify its existence in the database Xcontinuously) I decided to ignore this exception. X XI had originally hoped for a smoother solution to the "disconnected player" Xproblem. In a system where a central process drives all of the player Xterminals, this is possible. However, because control in Monster is shared Xbetween many identical processes, the problem is much harder. X X XReflections on the Project: X--------------------------- X XHow the "Installed Base" Stagnated New Development: X--------------------------------------------------- X XDuring the development of Monster I would periodically change the records Xthat held the Monster database. Once changed in the program, this would render Xthe existing database unusable, as the new program could no longer open the old Xfiles. Thus, I would have to destroy the existing world if I wanted to add Xany fields to the records that comprised the shared files. X XIn order to provide a stable environment for players who did not want to see Xtheir hard work making Monster rooms destroyed every time I made a change to the Xstructure of the database, I installed a version with a separate set of data Xfiles than the copy I worked on for development. Players created rooms and Xtested the installed version, while I continued to develop my own copy. XEventually, the world in the first release of Monster had about 60 rooms. X XAbout a month after installing the original Monster I replaced it with the new, Xgreatly enhanced version I had been working on (the executable was about 4 times Xthe size of the original) and started over with an empty world. I had provided Xexpansion fields in the data records for the new release of Monster so I could Xcontinue to develop the game without having to work on my own private copy. X XThe second release of Monster was very popular. I continued to add features to Xthe program, and made use of the expansion fields when possible. However, I Xfelt more and more constrained by the limits of my database. I needed to Xchange more about the data records than the expansion fields would allow. XI wanted to erase the world a second time; however, players had put much work Xinto creating over 100 rooms, and became quite angry when I suggested that I Xmight throw away the current world to make a new one. X XSome suggested that I write a program which would convert the existing database Xto a new format. However, I felt that the work to do this would be much greater Xthan the work I was planning to spend to make enhancements to the game. Also, Xthe style of my changes during development called for small frequent changes. I Xabandoned the idea of trying to write a translation program, and instead Xattempted to work around the limitations of the database structure. Eventually, Xhowever, my work stagnated, and new development on Monster ceased. X XI never anticipated the work of my playtesters holding back further development. XIf I were to rewrite Monster, I would use a more flexible storage approach, one Xprobably involving a form of dynamic typing which would let me add new Xparameters to the database without actually changing the record structure or Xsize. X X X X X X X X X X X X X XAppendix A: Specifyable Parameters for Monster Locations and Objects X--------------------------------------------------------------------- X XRooms: X------ X Xnicename: the name of the room Xnameprint: formatting control for the nicename Xprimary, Xsecondary: textual descriptions of the room Xwhich: control for which room description prints: X 0 - only print primary room description X 1 - only print secondary room description X 2 - print both primary and secondary room descriptions X 3 - print primary description; then print secondary X description if the player is holding the specified X magic object for the room Xmagicobj: the magic object for the room Xtrapto, Xtrapchance: allows a player to semi-randomly be thrust through an exit Xrndmsg: eerie message that randomly prints Xdetails: details that may be looked at in the room X X XExits: X------ X Xtoloc: where the exit goes Xkind: type of the exit: X 0 - no exit; always fails X 1 - open exit; always succeeds X 2 - exits succeeds if player has key object X 3 - exit fails if player has key object X 4 - exit randomly fails X 5 - potential exit; doesn't exist yet X 7 - exit cycles between being open and closed Xexitdesc: short textual descrption of the exit Xfail: description if player fails to go through exit Xsuccess: description if player succeeds to go through exit Xgoin: what other players see when someone goes into the exit Xcomeout: what others see when a player comes out of the exit Xhidden: what the player sees when he finds the exit (if it's hidden) Xobjreq: key object for exit Xalias: name of the exit Xreqverb: requires the player to use the alias only (without "go") to X use the exit Xreqalias: requires the player to know the exit alias; can't use the X compass point Xautolook: surpresses the automatic "look" done upon entering the X new room X XObjects: X-------- X Xoname: the name of the object Xkind: type parameter for the object Xlinedesc: short description of the object (the "on the floor" description) Xexamine: close inspection description for the object Xnumexist: how many copies of the object exist Xsticky: inhibits players from being able to pick up the object Xgetobjreq: requires the player to be holding another object before X he can pick up this one Xgetfail: message printed if a player fails to get an object Xgetsuccess: message printed when an object is successfully picked up Xuseobjreq: object player must be holding to use this object Xuselocreq: place player must be in to use this object Xusefail: message printed if player fails in use of the object Xusesuccess: message printed if object is successfully used Xusealias: alias word to "use" Xreqalias: require player to know the alias to use the object Xarticle: whether "a", "an", "some", "the" should precede the object name X X XAppendix B: Monster Command List X--------------------------------- X XAccept/Refuse # Allow others to Link an exit here at direction # | Undo Accept XBrief Toggle printing of room descriptions XCustomize [#] Customize this room | Customize exit # | Customize object # XDescribe [#] Describe this room | Describe a feature (#) in detail XDestroy # Destroy an instance of object # (you must be holding it) XDuplicate # Make a duplicate of an already-created object. XForm/Zap # Form a new room with name # | Destroy room named # XGet/Drop # Get/Drop an object X#,Go # Go towards # (Some: N/North S/South E/East W/West U/Up D/Down) XHealth Show how healthy you are XHide/Reveal [#] Hide/Reveal yoursef | Hide object (#) XI,Inventory See what you or someone else is carrying XLink/Unlink # Link/Unlink this room to/from another via exit at direction # XLook,L [#] Look here | Look at something or someone (#) closely XMake # Make a new object named # XName # Set your game name to # XPlayers List people who have played Monster XPunch # Punch person # XQuit Leave the game XRelink Move an exit XRooms Show information about rooms you have made XSay, ' (quote) Say line of text following command to others in the room XSearch Look around the room for anything hidden XSelf # Edit a description of yourself | View #'s self-description XShow # Show option # (type SHOW ? for a list) XUnmake # Remove the form definition of object # XUse # Use object # XWear # Wear the object # XWield # Wield the weapon #; you must be holding it first XWhisper # Whisper something (prompted for) to person # XWho List of people playing Monster now XWhois # What is a player's username X?,Help This list X. (period) Repeat last command X X XAppendix C: Customization Subsystem Menus X------------------------------------------ X XRoom Customization: X------------------- X XCustom> ? X XD Alter the way the room description prints XN Change how the room Name prints XP Edit the Primary room description [the default one] (same as desc) XS Edit the Secondary room description XX Define a mystery message X XG Set the location that a dropped object really Goes to XO Edit the object drop description (for drop effects) XB Edit the target room (G) "bounced in" description X XT Set the direction that the Trapdoor goes to XC Set the Chance of the trapdoor functioning X XM Define the magic object for this room XR Rename the room X XV View settings on this room XE Exit (same as quit) XQ Quit (same as exit) X? This list X X XExit customization: X------------------- X XCustom [direction]> ? X XA Set an Alias for the exit XC Conceal an exit XD Edit the exit's main Description XE EXIT custom (saves changes) XF Edit the exit's failure line XI Edit the line that others see when a player goes Into an exit XK Set the object that is the Key to this exit XL Automatically look [default] / don't look on exit XO Edit the line that people see when a player comes Out of an exit XQ QUIT Custom (saves changes) XR Require/don't require alias for exit; ignore direction XS Edit the success line XT Alter Type of exit (passage, door, etc) XV View exit information XX Require/don't require exit name to be a verb X? This list X X XObject Customization: X--------------------- X XCustom object> ? X XA "a", "an", "some", etc. XD Edit a Description of the object XF Edit the GET failure message XG Set the object required to pick up this object X1 Set the get success message XK Set the Kind of object this is XL Edit the label description ("There is a ... here.") XP Program the object based on the kind it is XR Rename the object XS Toggle the sticky bit X XU Set the object required for use X2 Set the place required for use X3 Edit the use failure description X4 Edit the use success description XV View attributes of this object X XX Edit the extra description X5 Edit extra desc #2 XE Exit (same as Quit) XQ Quit (same as Exit) X? This list X X XAppendix D: Monster Playerlist as of June 5, 1988 X-------------------------------------------------- X Xdolpher ! Monster Manager 5-JUN-1988 1:48pm * great baths Xdasun_c ! Iceman 4-JUN-1988 10:30pm * the transporter room Xkirsten ! Kirsten 4-JUN-1988 11:20pm * ffoirefirma Xisakson ! Satan 3-JUN-1988 10:13am * satan's private hell Xtlb05405 ! Tlb05405 3-JUN-1988 11:59am * east hall Xnate ! Smaug 3-JUN-1988 7:41pm * platform 1 Xskrenta ! Faust 3-JUN-1988 8:37pm * tower room Xgary ! Monster Vice Manager 2-JUN-1988 9:50pm * inner office Xlaura ! Laura 2-JUN-1988 10:36pm * turbolift chamber Xjames ! James 1-JUN-1988 7:54pm * chuk's elevator Xchuk ! SoulStorm 1-JUN-1988 9:57pm * east hall Xpeter_t ! Peter_t 31-MAY-1988 8:33pm * pine forest Xcary ! Cary 31-MAY-1988 11:20pm * maelstrom Xfrancisco ! Prof. Anthrax 30-MAY-1988 3:54pm * waterbed Xsundeep ! Sundeep 29-MAY-1988 2:21pm * mta office Xbkc04916 ! Cheekster 28-MAY-1988 10:51am * the 'ell stop Xktl04905 ! Corwin 28-MAY-1988 11:44am * west hall Xperry ! Bufu Master!!! 28-MAY-1988 8:40pm * pinkie's place Xmaryahn ! pinkie 27-MAY-1988 12:39pm * the sewer tunnel Ximmell ! hurricane eye 26-MAY-1988 2:25am * post office 3 Xrobert ! Hungry Wolf 26-MAY-1988 2:26am * roll6 Xlinda ! linlop 26-MAY-1988 10:47am * terminal room Xjeff ! Pringle 25-MAY-1988 7:12pm * ic Xmic00229 ! Mic00229 22-MAY-1988 8:33pm * great hall Xjeffoire ! Ffoire Zen Salad 20-MAY-1988 1:41pm * bar Xschroder ! Schroder 19-MAY-1988 10:09am * burrow Xlunde ! Purple Peril 18-MAY-1988 12:55pm * cloud 9.5 Xpib ! Great Pib 17-MAY-1988 11:51pm * great pib's lair Xahrens ! it 15-MAY-1988 4:56pm * landing Xmborsetti ! Mborsetti 12-MAY-1988 10:20pm * sewer crossroads Xbrian ! Mr. Raven 11-MAY-1988 11:24am * a damp and dark hole Xwen05563 ! Gary 11-MAY-1988 9:00pm * great hall Xjimbo ! Jimbo 8-MAY-1988 10:02pm * great hall Xlentz ! Lentz 7-MAY-1988 8:24am * front of isp noyes Xmiller ! Mungus 5-MAY-1988 1:14pm * starbase Xotto ! Otto 4-MAY-1988 8:45pm * heidi's nightmare Xchris ! House Manager 3-MAY-1988 3:54am * home base Xliao ! Liao 30-APR-1988 1:21pm * white house Xchaz ! Chaz 29-APR-1988 4:05pm * post office 2 Xjmc ! Run JMC 29-APR-1988 4:37pm * isp heaven Xrod ! Rod 29-APR-1988 9:00pm * great hall Xchoi ! Choi 28-APR-1988 8:25pm * east hall Xbo ! God 26-APR-1988 1:58pm * great hall Xjonathan ! Jonathan 26-APR-1988 5:26pm * eye of the hurricane Xswift ! Swift 26-APR-1988 8:53pm * post office hall Xric05787 ! Deadhead 26-APR-1988 10:57pm * nightmarish room Xmccoy ! The Scribe 26-APR-1988 11:41pm * scribe home Xg_wenslow ! Gary II 24-APR-1988 11:58pm * east hall Xkri04333 ! Kri04333 18-APR-1988 12:11am * great hall Xdissett ! Kronos 18-APR-1988 10:13pm * kronos' room Xwantz ! Wantz 17-APR-1988 2:51pm * great hall Xcheezer ! Cheezer 16-APR-1988 7:55pm * the pine forest Xahr04465 ! Ivo 16-APR-1988 7:56pm * sewer transport Xjoey ! geek 15-APR-1988 8:03pm * forest crossroads Xwargaski ! Wargaski 14-APR-1988 4:01pm * toxicated Xeric ! Eric 13-APR-1988 3:51pm * the hall of chuk Xrwc00220 ! Rwc00220 12-APR-1988 1:32pm * great hall Xkstull ! Kstull 12-APR-1988 5:01pm * post office 3 Xtim ! Tim 11-APR-1988 8:26pm * great hall Xsean ! Sean 10-APR-1988 4:27pm * great hall Xsam ! Sam 10-APR-1988 12:54pm * great hall Xdean ! Artagel 9-APR-1988 8:21am * turbolift chamber Xsupercom ! Cursor 8-APR-1988 12:00am * forest paths Xanne ! Anne 7-APR-1988 6:55pm * great hall Xlisa ! Lisa 7-APR-1988 6:56pm * great hall Xmouse ! Mouse 3-APR-1988 11:26pm * west hall Xmca04477 ! Mca04477 2-APR-1988 8:56pm * burrow Xsajiv ! Sajiv 30-MAR-1988 6:06pm * great hall Xchad ! Chad 30-MAR-1988 6:37pm * chuk's elevator Xjennifer ! Jennifer 30-MAR-1988 7:22pm * east hall Xlasonia ! Lasonia 29-MAR-1988 11:22am * west hall Xbrian_t ! Brian_t 29-MAR-1988 11:59am * maelstrom Xmikk ! Random 29-MAR-1988 11:19pm * ledge Xtopher ! Topher 28-MAR-1988 1:19pm * great hall Xspectre ! Ghost in the machine 28-MAR-1988 11:43pm * ghost's mailroom Xdave ! Dave 18-MAR-1988 10:14am * post office hall Xpenguins ! Penguins Amok 18-MAR-1988 11:52pm * chuk's elevator Xlawson ! Space Cowboy 18-MAR-1988 12:23pm * great hall Xheidi ! Heidi 17-MAR-1988 1:11am * digital purgatory Xbueno ! Bueno 17-MAR-1988 7:49pm * post office hall Xdan ! Grando 16-MAR-1988 8:18am * eye of the hurricane Xeric_yue ! Samsok 16-MAR-1988 9:29pm * the yueguy's joint Xcra01453 ! Cra01453 15-MAR-1988 3:01am * great hall Xadam ! Adam 14-MAR-1988 6:45pm * round room Xwas04906 ! Milt 14-MAR-1988 9:48pm * great hall Xwatson ! Watson 14-MAR-1988 10:22pm * chuk's elevator Xbrianw ! Brianw 12-MAR-1988 * ffoirefirma Xmike ! Mike 12-MAR-1988 * toxicated Xpredator ! Predator 12-MAR-1988 * east hall Xdaniel ! Daniel 11-MAR-1988 * west hall Xdav08345 ! Dav08345 11-MAR-1988 * great hall Xvlahos ! otis 11-MAR-1988 * post office Xginter ! Ginter 10-MAR-1988 * living room Xrob09549 ! Rob09549 9-MAR-1988 * great hall Xdora ! Dora 8-MAR-1988 * toxicated Xkim ! kim 8-MAR-1988 * post office 2 Xmichael ! Prabdib 7-MAR-1988 * tunnel of love Xbradley ! Bradley 29-FEB-1988 * eye of the hurricane Xjohn ! Raunchmeister 29-FEB-1988 * underhall Xmelvin ! Killer Melvin 27-FEB-1988 * chuk's elevator Xcliff ! Cliff 26-FEB-1988 * east hall X X XAppendix E: An Actual Monster Game Log X--------------------------------------- X X$ monster XWelcome to Monster! Hit return to start: X XWelcome back, Faust. Your last play was on 1-JUN-1988 at 10:47pm. X XYou're in Great Hall XYou're in the middle of a vast hall stretching out of sight to the Xeast and west. Strange shadows play across the high vaulted ceiling. XThe floor is set with smooth rectangular stones. The walls feel slightly Xcold to the touch, and damp with condensation. A copper plaque, slightly Xgreen with age, is set into one wall. X XMonster Manager is here. X> XMonster Manager vanishes in a brilliant burst of multicolored light. X> l XYou're in Great Hall XYou're in the middle of a vast hall stretching out of sight to the Xeast and west. Strange shadows play across the high vaulted ceiling. XThe floor is set with smooth rectangular stones. The walls feel slightly Xcold to the touch, and damp with condensation. A copper plaque, slightly Xgreen with age, is set into one wall. X X> XMonster Manager appears in a brilliant burst of multicolored light. X> who X Monster Status X 1-JUN-1988 10:48pm X XUsername Game Name Where Xdolpher Monster Manager great hall Xskrenta Faust great hall X> look plaque X XThe plaque looks very old and corroded. However, you can still make out Xthe writing: X X " Monster, created by Rich Skrenta, 1988. Play at your own risk. " X X> show details XDetails here that you may inspect: X stones X plaque X> look stones XThe stones are rough and black, and cold to the touch. Although the Xmortar work appears to have been expertly done, it has decayed with time. XMany stones are cracked, and narrow spaces fracture the carefully laid Xpattern. Some of the stones are quite loose. You might be able to lift Xone of them with some effort. X> XMonster Manager is looking at the stones. X> XMonster Manager is looking at the plaque. X> XMonster Manager says, "Hey Faust, let's go down to the Underhall." X> XMonster Manager manages to lift a stone in the floor and descends. X> lift XWith great effort, you manage to lift the stone enought to fit inside. X XOnce below the stone, it falls back into place, sealing out the light Xfrom above. You squirm down the narrow tunnel . . . X XYou're in UnderHall XThis is a cramped, humid room beneath the Great Hall. The walls are Xdripping with water condensed from mist rising from the baths. Some Xof the mist follows the ceiling and dissappears up the narrow tunnel. X XStairs lead north down to the Great Baths. XA neon sign flashes "Great PIB's Lair" over a door to the South. XYou could manage a crawl through a narrow tunnel leading upwards. X XMonster Manager is here. X> look Monster Manager XMonster Manager is the stereotype of a computer hacker. He is wearing Xa flannel shirt with several snickers bars in the breast pocket. On Xhis belt is an ASCII-HEX conversion chart. On his feet are a scuffed Xpair of hiking boots so he can tackle those dangerous mountains that Xcrop up in operations. Also dangling from his belt is a battered box Xwith many buttons on the front and wires with sockets on the ends protruding Xfrom the back. The switches seem to have been placed haphazardly, but Xthe object is unmistakably one of great power nonetheless. X XMonster Manager is in perfect health. XMonster Manager is empty handed. X> XMonster Manager is looking at you. X> XMonster Manager swings at you but misses. X> XYou duck in time to avoid Monster Manager's punch. X> XYou see stars as Monster Manager bashes you in the face. X> XYou parry Monster Manager's attack. X> punch Monster Manager XYou can't punch the Monster Manager. X> l XYou're in UnderHall XThis is a cramped, humid room beneath the Great Hall. The walls are Xdripping with water condensed from mist rising from the baths. Some Xof the mist follows the ceiling and dissappears up the narrow tunnel. X XStairs lead north down to the Great Baths. XA neon sign flashes "Great PIB's Lair" over a door to the South. XYou could manage a crawl through a narrow tunnel leading upwards. X XMonster Manager is here. X> n XYou're in Great Baths XThese are the luxurious Great Baths where tired adventurers may come Xto relax and try to regain their health and youth from the mineral waters. XFrom where you stand at the entrance, you can see below you the bubbling Xsoapy pools of water churning violently in tile-lined pits. The pools Xare fed by hot springs from deep in the rock beneath you. Steam and Xhuge soapy bubbles rise out of the hot pools of water. The bubbles Xdance through the air, climbing higher and higher, until they either Xburst on the sharp walls of the cave or are lost in the mist above you. X XShallow tiled steps, wet and slick from the hot soapy waters of the Xsprings, lead down to the pools. X XRough stone stairs lead up to the south. X X> XIn an explosion of orange smoke Monster Vice Manager poofs into the room. X> XMonster Manager has come down the stairs from the Underhall. X> XMonster Vice Manager produces a "who" list and reads it. X> system XSystem> v X X used free total XBlock file 1008 92 1100 XLine file 1501 109 1610 XRoom file 283 27 310 XObject file 139 41 180 XInteger file 6 0 6 X XSystem> XMonster Vice Manager is in system maintenance mode. XSystem> exit X> XMonster Vice Manager is no longer in system maintenance mode. X> 'Hey Gary X> XMonster Vice Manager says, "Hi, Faust." X> look Monster Vice Manager XThe Monster Vice Manager is dressed in a conservative three piece Xsuit. The stern expression on his face is just a facade, he really Xis a warm and sensitive guy underneath. He is willing to answer Xany questions and help out with any problems. He can best be Xdescribed by the phrase: X X "Do what thou wilt, so mete it be." X XHe returns your gaze with a hint of understanding and amusement. X XMonster Vice Manager is in perfect health. XMonster Vice Manager is empty handed. X> XMonster Vice Manager is looking at you. X> punch Monster Vice Manager XYou swing wild and miss. X> . XMonster Vice Manager ducks and avoids your punch. X> . XA quick punch, but it only grazes Monster Vice Manager. X> XYou only feel the breeze as Monster Vice Manager swings wildly. X> . XYou swing wild and miss. X> XYou see stars as Monster Vice Manager bashes you in the face. X> XYou only feel the breeze as Monster Vice Manager swings wildly. X> . XYou deliver a quick jab to Monster Vice Manager's jaw. X> XMonster Vice Manager's swing misses you by a yard. X> . XYour roundhouse blow sends Monster Vice Manager reeling. X> XYou double over after Monster Vice Manager lands a mean jab to your stomach! XMonster Vice Manager looks a little dazed. X> XMonster Vice Manager vanishes from the room in a cloud of orange smoke. X> who X Monster Status X 1-JUN-1988 10:56pm X XUsername Game Name Where Xdolpher Monster Manager great baths Xskrenta Faust great baths Xgary Monster Vice Manager inner office X> poof inner office X XThis rooms is a conservatively decorated office. A large Xdesk dominates the room. Several pictures hang on the walls Xand a silver service is on a stand off to the left. Two plush Xchairs beckon for you to sit down. X XThere are stairs leading down. X XMonster Vice Manager is here. XMonster Vice Manager looks a little dazed. X> sh det XDetails here that you may inspect: X bin X plaque X pictures X stand X> look bin X XThe bin has a sign on it saying, "Leave mail for the Monster XVice Manager here. Thank you." X X> look plaque X XThe plaque reads: X X Gary Wenslow, Monster Vice Manager X X> look pictures X XThese are very nice pictures of landscapes. They look expensive. X X> look stand X XThe silver service on this stand is of fine workmanship. XThere are also crystal goblets and flasks containing very Xfine wine, brandy, and whiskey. X X> l X XThis rooms is a conservatively decorated office. A large Xdesk dominates the room. Several pictures hang on the walls Xand a silver service is on a stand off to the left. Two plush Xchairs beckon for you to sit down. X XThere are stairs leading down. X XMonster Vice Manager is here. XMonster Vice Manager looks a little dazed. X> rooms gary Xgary: X tunnel of love more tunnel of love end of tunnel X hot dog stand picnic window X mvm office inner office hall1 X hall2 hall3 hall4 X hall5 hall6 hall7 X hall8 hall9 concession X roll1 roll2 roll3 X roll4 roll5 roll6 X roll7 roll8 roll9 X roll10 worker's ledge railing X rope mvm mail room X X> rooms dolpher Xdolpher: X void pit of fire underhall X great baths pools in the pool X in the bubble higher bubble highest bubble X ledge tower ledge circular staircase X behind house kitchen living room X bottom of stairs manager's mailbox tower room X on the scaffolding round room mountain pass X roof of tower west passageway castle entrance X center hall outside the gate east passageway X narrow passage X X> poof behind house XYou're at Behind House XThe back door of the house is boarded up, but the windows have not been Xblocked. One window at ground level leads into what appears to be the Xkitchen. All of the other windows are too far above the ground for you Xto reach. X XA path leads west to the front of the house. X X> form Study X> poof studty XThere is no room named studty. X> poof study XYou're in Study X XA note on the east wall says "Your exit here." X X> refuse east XExits east will be refused. X> l XYou're in Study X X> desc X[ Editing the primary room description ] XEnter text. Terminate with ** at the beginning of a line. XYou have 10 lines maximum. X X 1: This is a luxurious study walled with fine oak paneling. A window X 2: looks out of the east wall. It is surrounded by purple curtains. X 3: There is a small sign on the wall. X 4: ** X X* e X> l XYou're in Study XThis is a luxurious study walled with fine oak paneling. A window Xlooks out of the east wall. It is surrounded by purple curtains. XThere is a small sign on the wall. X X> desc sign X[ Editing detail "sign" of this room ] XEnter text. Terminate with ** at the beginning of a line. XYou have 10 lines maximum. X X 1: The note seems to have been hurriedly scrawled. It reads: X 2: X 3: " This room for demonstration purposes only! " X 4: X 5: ** X X* ? X XA Append text to end XC Check text for correct length with parameter substitution (#) XD # Delete line # XE Exit & save changes XI # Insert lines before line # XP Print out description XQ Quit: THROWS AWAY CHANGES XR # Replace text of line # XZ Zap all text X@ Throw away text & exit with the default description X? This list X X X* p X X 1: The note seems to have been hurriedly scrawled. It reads: X 2: X 3: " This room for demonstration purposes only! " X 4: X X* e X> sh det XDetails here that you may isspect: X sign X> look sign XThe note seems to have been hurriedly scrawled. It reads: X X " This room for demonstration purposes only! " X X> l XYou're in Study XThis is a luxurious study walled with fine oak paneling. A window Xlooks out of the east wall. It is surrounded by purple curtains. XThere is a small sign on the wall. X X> desc sign X[ Editing detail "sign" of this room ] X X* i 1 X1: X2: ** X X* p X X 1: X 2: The note seems to have been hurriedly scrawled. It reads: X 3: X 4: " This room for demonstration purposes only! " X 5: X X* e X> look sign X XThe note seems to have been hurriedly scrawled. It reads: X X " This room for demonstration purposes only! " X X> l XYou're in Study XThis is a luxurious study walled with fine oak paneling. A window Xlooks out of the east wall. It is surrounded by purple curtains. XThere is a small sign on the wall. X X> form Behind the Curtains X> link west XHit return alone at any prompt to terminate exit creation. X XRoom to link to? behind the curtains XExit comes out in target room Xfrom what direction? east XExit created. Use CUSTOM west to customize your exit. X> l XYou're in Study XThis is a luxurious study walled with fine oak paneling. A window Xlooks out of the east wall. It is surrounded by purple curtains. XThere is a small sign on the wall. X XThere is a passage leading west. X X> custom west XCustomizing west exit XIf you would rather be customizing this room, type CUSTOM with no arguments XIf you would rather be customizing an object, type CUSTOM <object name> X XType ** for any line to leave it unchanged. XType return for any line to select the default. X XCustom west> ? X XA Set an Alias for the exit XC Conceal an exit XD Edit the exit's main Description XE EXIT custom (saves changes) XF Edit the exit's failure line XI Edit the line that others see when a player goes Into an exit XK Set the object that is the Key to this exit XL Automatically look [default] / don't look on exit XO Edit the line that people see when a player comes Out of an exit XQ QUIT Custom (saves changes) XR Require/don't require alias for exit; ignore direction XS Edit the success line XT Alter Type of exit (passage, door, etc) XV View exit information XX Require/don't require exit name to be a verb X? This list X XCustom west> a XAlternate name for the exit? curtains XCustom west> r XThe alias for this exit will be required to reference it. XCustom west> d XEnter a one line description of the exit. X XType ** to leave line unchanged, * to make [no line] X* XCustom west> exit X> l XYou're in Study XThis is a luxurious study walled with fine oak paneling. A window Xlooks out of the east wall. It is surrounded by purple curtains. XThere is a small sign on the wall. X X> go curtains XYou're in Behind the Curtains X XThere is a passage leading east. XA note on the floor says "Your exit here." X X> e XYou're in Study XThis is a luxurious study walled with fine oak paneling. A window Xlooks out of the east wall. It is surrounded by purple curtains. XThere is a small sign on the wall. X X> desc window X[ Editing detail "window" of this room ] XEnter text. Terminate with ** at the beginning of a line. XYou have 10 lines maximum. X X 1 You see a green lawn shaded by tall trees and bordered with sculptured X 2: shrubbery. A small rabbit is nibbling at some grass. The entire X 3: scene has an artificial look, as if it were some cartoon rendering. X 4: ** X X* exit X> sh det XDetails here that you may inspect: X sign X window X> look window XYou see a green lawn shaded by tall trees and bordered with sculptured Xshrubbery. A small rabbit is nibbling at some grass. The entire Xscene has an artificial look, as if it were some cartoon rendering. X> quit XYou vanish in a brilliant burst of multicolored light. X$ END_OF_FILE if test 48710 -ne `wc -c <'mon1.doc'`; then echo shar: \"'mon1.doc'\" unpacked with wrong size! fi # end of 'mon1.doc' fi if test -f 'mon5.pas' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'mon5.pas'\" else echo shar: Extracting \"'mon5.pas'\" \(4189 characters\) sed "s/^X//" >'mon5.pas' <<'END_OF_FILE' X X X{ Notes to other who may inherit this program: X X Change all occurances in this file of dolpher to the account which X you will use for maintenance of this program. That account will X have special administrative powers. X X This program uses several data files. These files are in a directory X specified by the variable root in procedure init. In my implementation, X I have a default ACL on the directory allowing everyone READ and WRITE X access to the files created in that directory. Whoever plays the game X must be able to write to these data files. X X XWritten by Rich Skrenta, 1988. X X X X XBrief program organization overview: X------------------------------------ X XMonster's Shared Files: X XMonster uses several shared files for communication. XEach shared file is accessed within Monster by a group of 3 procedures of the Xform: getX(), freeX and putX. X XgetX takes an integer and attempts to get and lock that record from the Xappropriate data file. If it encounters a "collision", it waits a short Xrandom amount of time and tries again. After maxerr collisions it prints Xa deadlock warning message. X XIf data is to be read but not changed, a freeX should immediately follow Xthe getX so that other Monster processes can access the record. If the Xrecord is to be written then a putX must eventually follow the getX. X X XMonster's Record Allocation: X XMonster dynamically allocates some resources such as description blocks and Xlines and player log entries. The allocation is from a bitmap. I chose a Xbitmap over a linked list to make the multiuser access to the database Xmore stable. A particular resource (such as log entries) will have a Xparticular bitmap in the file INDEXFILE. A getindex(I_LOG) will retrieve Xthe bitmap for it. X XActually allocation and deallocation is done through the group of functions Xalloc_X and delete_X. If alloc_X returns true, the allocation was successful, Xand the integer parameter is the number of the block allocated. X XThe top available record in each group is stored in indexrec. To increase Xthe top, the new records must be initially written so that garbage data is Xnot in them and the getX routines can locate them. This can be done with Xthe addX(n) group of routines, which add capacity to resources. X X X XParsing in Monster: X XThe main parser(s) use a first-unique-characters method to lookup command Xkeywords and parameters. The format of these functions is lookup_x(n,s). XIf it returns true, it successfully found an unambiguous match to string s. XThe integer index will be in n. X XIf an unambiguating match is needed (for example, if someone makes a new room, Xthe match to see if the name exists shouldn't disambiguate), the group of Xroutines exact_X(n,s) are called. They function similarly to lookup_x(n,s). X XThe customization subsystems and the editor use very primitive parsers Xwhich only use first character match and integer arguments. X X X XAsynchronous events in Monster: X XWhen someone comes into a room, the other players in that room need Xto be notified, even if they might be typing a command on their terminal. X XThis is done in a two part process (producer/consumer problem): X XWhen an event takes place, the player's Monster that caused the event Xmakes a call to log_event. Parameters include the slot of the sender (which Xperson in the room caused the event), the actual event that occurred X(E_something) and parameters. Log_event works by sticking the event Xinto a circular buffer associated with the room (room may be specified on Xlog_event). X XNote: there is not an event record for every room; instead, the event X record used is ROOM # mod ACTUAL NUMBER of EVENT RECORDS X XThe other half of the process occurrs when a player's Monster calls Xgrab_line to get some input. Grab line looks for keystrokes, and if Xthere are none, it calls checkevent and then sleeps for a short time X(.1 - .2 seconds). Checkevent loads the event record associated with this Xroom and compare's the player's buffer pointer with the record's buffer Xpointer. If they are different, checkevent bites off events and sends them Xto handle_event until there are no more events to be processed. Checkevent Xignores events logged by it's own player. X X X} END_OF_FILE if test 4189 -ne `wc -c <'mon5.pas'`; then echo shar: \"'mon5.pas'\" unpacked with wrong size! fi # end of 'mon5.pas' fi echo shar: End of archive 1 \(of 6\). cp /dev/null ark1isdone MISSING="" for I in 1 2 3 4 5 6 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 6 archives. rm -f ark[1-9]isdone ./fixup.sh else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0