For Monster version 1.06
Monster, a multiplayer adventure game where the players create the world and make the rules. Command: MONSTER/qualifiers [dump_file]
Additional information available:
dump_file Only with /DUMP or /BUILD -qualifiers. This parameter specifies the text form equivalent of a database. Default extension is .DMP. This parameter is required with the qualifiers /DUMP and /BUILD.
/VERSION Shows the version text. The /VERSION qualifier shows the same text when playing Monster. Incompatible with /WHO.
/START /NOSTART Prevents or enables the start of playing after handling of other qualifiers. Useful with /VERSION. Incompatible with /WHO, /DUMP and /BUILD.
/OUTPUT[=output-file-spec] /NOOUTPUT Redirects Monster's output to a file. Useful with /VERSION or management qualifiers. Incompatible with /FIX, /WHO, /DUMP and /BUILD.
These qualifiers are only for Monster Manager.
/REBUILD Builds a new database for Monster. Checks first the entries of MONSTER.INIT -file. Incompatible with /FIX, /REAL_USERID, /USERID, /BATCH, /WHO, /DUMP and /BUILD.
/FIX Activates the fixing system in the interactive mode. With it Monster Manager can fix errors of database. Incompatible with /OUTPUT, /REBUILD, /REAL_USERID, /USERID, /BATCH, /WHO, /DUMP and /BUILD. See also Fixing_Database.
/DEBUG /NODEBUG (D) Switches the debug mode on or off. Equivalent to the DEBUG command when playing Monster. Incompatible with /WHO.
/REAL_USERID Enables playing with another player's name. Incompatible with /REBUILD, /FIX, /USERID, /BATCH, /WHO, /DUMP and /BUILD.
/BATCH=command-file-spec Runs the fixing system in the batch mode. Incompatible with /REBUILD, /FIX, /REAL_USERID, /USERID, /BATCH, /WHO, /DUMP and /BUILD.
/BUILD Nearly the same as /REBUILD: reads the database from a special text file. The dump_file parameter is required with this qualifier. See also /DUMP. Incompatible with /REBUILD, /FIX, /REAL_USERID, /USERID, /BATCH, /BUILD, /OUTPUT and /START.
/DUMP Creates a text form copy of the database for /BUILDing. The dump_file parameter is required with this qualifier. Incompatible with /REBUILD, /FIX, /REAL_USERID, /USERID, /BATCH, /DUMP, /OUTPUT and /START.
/USERID=virtual_userid Enables playing with a virtual userid. Virtual userids are independent of real userids. They are protected with passwords. Incompatible with /REBUILD, /FIX, /REAL_USERID, /BATCH, /WHO, /DUMP and /BUILD.
/WHO Shows players currently playing Monster, but not those starting it. Ideal for LOGIN.COM. Incompatible with other qualifiers.
Monster reads a file named MONSTER.INIT from the directory where the executable Monster program is. Monster finds out the directory from the process image_name entry. There are the following entries:
Additional information available:
This entry includes the userid of Monster Manager. The userid must be written in lowercase. The MM, who should also be the game administrator, has the most power.
MM_userid: leino
Tells whether everyone may use the debug command. You must be able to disable it because it gives away players too much information on monsters. On the other hand,you also must be able to enable it if we want to do test runs under an unprivileged userid.
gen_debug: false
If true, the Monster Manager can blow away ( exterminate, demolish ) and reformat the entire universe. It is preferable to set this to false. It must be true when the MM wants to use the /REBUILD option.
REBUILD_OK: false
The home of the Monster database. The root directory protection must be set to world:e and the datafiles Monster creates in it must be set to world:rw for people to be able to play.
root: games_disk:<monster.database.db>
The codefiles for monsters are situated in the coderoot directory. The directory must additionally have an ACL default world:rw for files and ACL rw for the managers.
coderoot:games_disk:<monster.database.c>
The leveltable tells the levels of Monster. Certain privileges are associated with levels. The highest level is Monster Manager ( not shown in the leveltable ).
Value Name Meaning 32 Monster Can create monsters that can modify players' context. 16 Special Can make special items 256 Spell Can create spells that can modify players' context. 4 Global Can modify global descriptions and flags. 8 Owner Can customize other players' item like the owner. 64 Experience Can write MDL code that changes player scores. 1 Manager Can execute the SYSTEM command.
LEVELTABLE: ! name exp priv health h.fac pow hidden Beginner, 0, 0, 10, 40, 0, nohidden Novice, 1, 0, 10, 40, 2, nohidden Ranger, 500, 0, 15, 50, 3, nohidden Adventurer, 1000, 0, 20, 60, 5, nohidden Hero, 2000, 32, 30, 60, 10, nohidden Champion, 6000, 0, 40, 70, 10, nohidden Conjurer, 12000, 16, 50, 70, 12, nohidden Magician, 20000, 0, 60, 70, 15, nohidden Enchanter, 40000, 2, 80, 75, 20, nohidden Sorcerer, 70000, 256, 100, 80, 20, nohidden Warlock, 120000, 4, 120, 85, 35, nohidden Apprentice wizard, 300000, 8, 150, 85, 50, nohidden Wizard, 700000, 64, 300, 90, 80, nohidden Almost Dead, 1000100, 0, 10, 40, 2, hidden Manager, 2000000, 1, 500, 100, 500, hidden Druid, 2001000, 0, 500, 100, 500, hidden Charlatan, 2008000, 0, 500, 100, 500, hidden Wanderer, 2009000, 0, 500, 100, 500, hidden Chief Architect, 3000000, 0, 500, 100, 500, hidden Bug Hunter, 5000000, 0, 500, 100, 500, hidden END OF LEVELTABLE
The experience entry for the Monster Manager. The level of the MM is not in the leveltable.
Archpriv: 0
The health entry for the Monster Manager.
Archhealth: 800
The hit factor for the Monster Manager.
Archfactor: 100
The power entry for the Monster Manager.
Archpower: 1000
The maximum experience that players can reach. Notice that the experience of the Monster Manager is MAXINT.
maxexperience: 1000000
When players reach this experience level they become immortal.
protect_exp: 700000
Shows time when Monster is playable during workdays. The '+' mark means that Monster is playable and the '-' mark means that it is not. The marks denote time from 00-01 until 23-24 ( 11pm-12pm ).
Playtime: +++++++++--------+++++++
How many rooms players are allowed to make by default.
default_allow: 20
How many rooms players are allowed to make without an exit request.
min_room: 5
How many accepts must players make.
min_accept: 5
Monster's default character set is (Dec) Multinational character set. This modify that table. Lines in this table have forms: char <quoted character> <character type> <case modifier> char <character number> <character type> <case modifier> There can also be one line with form: charset <charset name>
Additional information available:
quoted_character | character_number | type | case_modifier | charset_name |
Example |
Quoted character is enclosed to quote characters ("). This argument tells what character is modified.
Number is decimal number of character (0-255). This argument tells what character is modified.
Character types have: none, letter, special and space. none: This is for non-printable characters (Monster usually skips these characters) letter: This is letter special: This is character what possible some special meaning in monster (for example numbers). space: This character is treated as space
Case modifier have forms: upper <character number> upper <quoted character> lower <character number> lower <quoted character> This modifier tells correspond upper or lower case letter for that character what is modified.
This tells name of caharacter set, which is described in that chartable. Charset name can be on word. If it have more than one word, it must close to quotaion marks(").
CHARTABLE: charset ISO646-FI char "{" letter upper "[" char "|" letter upper "\" char "}" letter upeer "]" char "]" letter lower "}" char "\" letter lower "|" char "[" letter lower "}" END OF CHARTABLE
How often database is polled for interprocess communication. This value is VMS Delta-time format.
database_poltime: 0 ::1 This is 1 second (0 days, 0 hours, 0 minutes and 1 second).
This message is printed, when Playtime: -entry disallows playing.
CLOSED MESSAGE: Welcome to the game Monster! But what now? Goodgulf the Grey appears in a puff of orange smoke! He is very angry... "What are you doing here? The Dungeon is now closed!" He waves his Iron Staff and yells "Begone!" You disappear in a burst of multicolored light... On wall you see announcement: ********************************************************************** * * * Dungeon is closed on weekdays * * between 09.00-17.00 * * * ********************************************************************** END OF MESSAGE
How many MDL code is kept in memory.
mdl_buffers: 20
If this is true, then command 'dcl' is available.
In order to install Monster your must create several directories, compile it, copy files to right directories, edit configuration files and build a database for it.
Additional information available:
Directories | Compilation | Editing | Protection | Database |
Publishing | Questions |
Create four directories: Directory for sources, from now on it is called the SOURCES directory. Directory for MONSTER.EXE, MONSTER_DUMP.EXE, MONSTER_REBUILD.EXE and MONSTER_WHO.EXE, from now on it is called the IMAGE directory. Directory for *.MON files, from now on it is called the DATABASE_MON directory. Directory for CODE*.MON files, from now on it is called the DATABASE_CODE directory.
Additional information available:
SOURCES | IMAGE | DATABASE_MON | DATABASE_CODE |
Files: CLI.PAS, CONVERT.BATCH, CUSTOM.PAS, DATABASE.PAS, FIX.BATCH, GLOBAL.PAS, GUTS.PAS, INTERPRETER.PAS, KEYS.PAS, MAKEFILE. MON.PAS, MONSTER_WHO.PAS, PARSER.PAS, PRIVUSERS.PAS, QUEUE.PAS, MONSTER_E.HLP, MONSTER_DUMP.PAS, MONSTER_REBUILD.PAS, ALLOC.PAS and VERSION.PAS.
Files: MONSTER.CLD, MONSTER.INIT. Compiled files: MON.EXE, MONSTER_WHO.EXE, MONSTER_E.HLB, MONSTER_DUMP.EXE and MONSTER_REBUILD.EXE.
Files: COMMANDS.PAPER, MONSTER.HELP. Files created by /REBUILD: DESC.MON, EVENTS.MON, HEADER.MON, INDEX.MON, INTFILE.MON, LINE.MON, NAMS.MON, OBJECTS.MON, ROOMS.MON, SPELLS.MON.
Files created by /REBUILD: CODE1.MON, CODE2.MON, CODE3.MON, CODE4.MON, CODE5.MON. Command H (Add header blocks) in the System menu adds a number of files in this directory!
First: Edit KEYS.PAS (change gryp-keys !!) Commands for compilation: $ LIBRARIAN/CREATE/HELP MONSTER_E MONSTER_E $ PASCAL /CHECK=ALL GLOBAL $ PASCAL /CHECK=ALL GUTS $ PASCAL /CHECK=ALL DATABASE $ PASCAL /CHECK=ALL CLI $ PASCAL /CHECK=ALL PRIVUSERS $ PASCAL /CHECK=ALL PARSER $ PASCAL /CHECK=ALL INTERPRETER $ PASCAL /CHECK=ALL QUEUE $ PASCAL /CHECK=ALL ALLOC $ PASCAL /CHECK=ALL CUSTOM $ PASCAL /CHECK=ALL MON $ PASCAL /CHECK=ALL KEYS $ PASCAL /CHECK=ALL VERSION $ LINK MON,GUTS,INTERPRETER,KEYS,PRIVUSERS,QUEUE,PARSER,CLI,GLOBAL, - DATABASE,CUSTOM,ALLOC,VERSION $ PASCAL /CHECK=ALL MONSTER_DUMP $ LINK MONSTER_DUMP, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER, VERSION $ PASCAL /CHECK=ALL MONSTER_REBUILD $ LINK MONSTER_REBUILD, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER, - ALLOC, KEYS, VERSION $ PASCAL /CHECK=ALL MONSTER_WHO $ LINK MONSTER_WHO, DATABASE, GUTS, GLOBAL, PRIVUSERS, PARSER You can also produce these files with command $ MMS ALL if you have MMS (and MAKEFILE in that directory) Copy MON.EXE, MONSTER_WHO.EXE, MONSTER_DUMP.EXE, MONSTER_REBUILD.EXE and MONSTER_E.HLB to the "IMAGE" directory.
Edit the following files: KEYS.PAS, MONSTER.CLD, MONSTER.INIT. Edit KEYS.PAS before compiling Monster !
Additional information available:
KEYS.PAS | MONSTER.CLD | MONSTER.INIT | ILMOITUS.TXT |
Edit the keys array. You can change the number of lines of keys array but you cannot change the length of lines of keys -array. Assign the number of lines to the "maxkeys" constant.
Insert the full specification of the IMAGE directory to the following places: define syntax MONSTER_WHO image <IMAGE -directory>monster_who noqualifiers define syntax MONSTER_DUMP image <IMAGE -directory>monster_dump parameter P1 label = DUMP_FILE prompt = "Dump file" value(type=$file,required) define syntax MONSTER_REBUILD image <IMAGE -directory>monster_rebuild define verb MONSTER image <IMAGE -directory>mon qualifier WHO nonnegatable syntax = MONSTER_WHO
Edit places marked with the "<>" marks: MM_userid: <your userid in lowcase> gen_debug: false REBUILD_OK: <set this to true before /REBUILD, afterwards to false> root: <full specification of the DATABASE_MON directory> coderoot: <full specification of the DATABASE_CODE direcory> LEVELTABLE: * Leveltable removed: see examples from the "initialization_file" part of this help * END OF LEVELTABLE Archpriv: 0 Archhealth: 800 Archfactor: 100 Archpower: 1000 maxexperience: 1000000 protect_exp: 700000 Playtime: <insert the right time into this: look examples from the "initialization_file" part of this help> default_allow: 20 min_room: 5 min_accept: 5 CHARTABLE: END OF CHARTABLE database_poltime: 0 ::1 CLOSED MESSAGE: Monster is now closed !! END OF MESSAGE mdl_buffers: 20
This file is no longer needed. Use instead 'CLOSED MESSAGE' -entry in MONSTER.INIT.
Insert the following ACls into the DATABASE_MON and the DATABASE_CODE directories (to *.DIR file). (IDENTIFIER=<your name>, ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL) (IDENTIFIER=<your name>,OPTIONS=DEFAULT, ACCESS=READ+WRITE+EXECUTE+DELETE+CONTROL) (DEFAULT_PROTECTION,SYSTEM:RWED,OWNER:RWED,GROUP,WORLD:RW) Insert similar ACLs for all other managers (of monster) into the DATABASE_CODE directory. Put protection (world:execute) or (world:read+execute) to IMAGE, DATABASE_MON and DATABASE_CODE directory Put protection (world:read) to ILMOITUS.TXT, MONSTER.CLD, MONSTER.INIT, MONSTER_E.HLB, and MONSTER.HELP files. Put protection (world:execute) to MON.EXE and MONSTER_WHO.EXE files MONSTER_DUMP.EXE and MONSTER_REBUILD.EXE do not need to be executable by the world. After building the database put protection (world:read+write) to *.MON files in DATABASE_MON and DATABASE_CODE directories.
Define the monster command by: SET COMMAND MONSTER (in IMAGE directory) Build the monster universe with the MONSTER/REBUILD command. or copy your old ( Rich Skrenta's ) monster database to the DATABASE_MON directory and try: MONSTER/BATCH=CONVERT (No warranty!) or MONSTER/BUILD CASTLE.DMP ( CASTLE.DMP contains the distributed starter's castle ) Change protection (world:read+write) to *.MON files in the DATABASE_MON and the DATABASE_CODE directories.
Tells anybody that he can play Monster after command SET COMMAND Your_Disk:<Your IMAGE directory>MONSTER with MONSTER command
Questions to Kristallipallo@com.cc.Helsinki.FI Kari.Hurtta@Helsinki.FI hurtta@cc.Helsinki.FI HURTTA@FINUH.BITNET Antti.Leino@Helsinki.FI leino@cc.Helsinki.FI LEINO@FINUH.BITNET Juha.Laiho@Helsinki.FI jlaiho@cc.Helsinki.FI JLAIHO@FINUH.BITNET
This text is from the release of the original Monster by Rich Skrenta.
Additional information available:
Files | Game | Technical_Aspects | Appendixs |
Monster was written in VMS Pascal under VMS 4.6. It uses file sharing and record locking for communication. Outside of that, it doesn't do anything tricky. However, after playing around with a VMS 4.2 system, I have doubts if it will work on a system that old. If you've got a reasonably recent version of VMS and a Pascal compiler, you shouldn't have any problems. The Monster source is in two files: a short one, approx 300 lines, called guts.pas, and a big one, mon.pas, approx 13,000 lines. The compiled program contains everything necessary to create and maintain the Monster universe. There is no separate maintenance program. Instead, specific people in the game have priviledges, and are known as the "Monster Managers". The MMs can do system maintenance while playing, and other players can even observe their work. After reading the document, if you would still like to obtain Monster, send me a letter reaffirming your interest. Thanks!
Monster is a text-oriented computer adventure game. Like other traditional adventure games such as Zork and Adventure, Monster players issue simple commands to direct a "puppet" through an artificial world. Players can explore the world, pick up and make use of objects, and solve puzzles. However, Monster is quite different from other computer adventures in two respects: first, Monster is a multiplayer game. In addition to the normal actions a player can effect on the simulated environment, players can also interact with one another. Player characters can fight, talk, trade items and explore territory together. Monster is similar in this respect to some multiplayer games available on computer networks such as the Source and Compuserve. However, Monster allows players to do something that very few, if any, other games allow: the players themselves create the fantasy world as part of the game. Players can create objects, make locations, and set up puzzles for other players to solve. Game mechanisms allow players to: o Create and describe new objects and locations o Specify how game objects function o Provide text descriptions for events that may happen For example, a player in Monster could create a room named "Great Hall", provide a textual description for it (which other players would see upon entering the rooms), and describe special features of the room (for instance, a brass plaque on the wall). Here's what another player who walked into the room described above would see (lines beginning with > are the player's input): > look You're in Great Hall You're in the middle of a vast hall stretching out of sight to the east and west. Strange shadows play across the high vaulted ceiling. The floor is set with smooth rectangular stones. The walls feel slightly cold to the touch, and damp with condensation. A copper plaque, slightly green with age, is set into one wall. > look plaque The plaque looks very old and corroded. However, you can still make out the writing: " Monster, created by Rich Skrenta, 1988. Play at your own risk. " Now the creator of the rooms could add a secret passage, perhaps hidden underneath some stones in the floor. To do this, first the player would describe what the stones looked like, then make a hidden exit to another location with a special command which would activate it. Here's what the player would see after making these changes: > show details Details here that you may inspect: stones plaque > look stones The stones are rough and black, and cold to the touch. Although the mortar work appears to have been expertly done, it has decayed with time. Many stones are cracked, and narrow spaces fracture the carefully laid pattern. Some of the stones are quite loose. You might be able to lift one of them with some effort. > lift With great effort, you manage to lift the stone enough to fit inside. Once below the stone, it falls back into place, sealing out the light from above. You squirm down the narrow tunnel . . . This example only hints at the details that actually go into the creation of a realistic game puzzle. To set up a rich game location, a player would have to specify: o A textual description of the room, as well as separate descriptions for various rooms details (in the example above, the plaque and the stones are room details) o A description of each of the possible exits from the rooms (there might be no description if the exit is hidden) o What happens when an object is dropped at the location (for example, if a player is swimming and he drops something, the object should sink) as well as a message describing what happened to the object o For each exit, a set of messages and parameters including: - the name of the exit - whether the exit requires a special object to pass (for example, a door key or some magic object) - a message displayed to the player if he can't successfully leave through the exit (if he doesn't have the key, for instance) - an optional message that the player sees when he goes through an exit (in the example above, the text "Once below the stone, it falls back into place...." is such a message) - a message that players inside the room see when someone leaves through the exit - a message that players inside the room see when another player enters the room through the exit - special features specific to this exit - miscellaneous other parameters
Each player who plays the Monster game runs a separate copy of the game. Each individual Monster process shares a database containing all of the information about the simulated world, including: o Records describing all of the rooms, interconnections between rooms, objects, and descriptions for the above o The locations of every player and object o A special shared file used for interprocess communication Each of the Monster database files are organized as a linear collection of fixed-length records. Monster uses the following files: roomfile: file of records containing data on Monster locations namfile: file containing names for objects, rooms and people descfile: file of text description blocks (10 lines maximum) linefile: file of short (one line) descriptions intfile: file of various integer parameters objfile: file of records containing data on Monster objects indexfile: file of bitmaps for the other files; used to mark free/inuse records for dynamic allocation eventfile: file of records used for interprocess communication spellfile: contains player's spell information
Additional information available:
Record_Locking | Interprocess_Communication | Maintaining_a_Player's_Existence_in_the_Database | Reflections_on_the_Project |
When Monster tries to access a record in one of the shared data files, it first makes a read attempt on the record. If the record is available (no other Monster process is reading or writing it) VMS will lock and read the record and return successfully. If another process has locked the record, VMS will return an error condition. In this case the Monster process will wait a small random amount of time and attempt to read the record again. Then if the Monster program cannot successfully read and lock the record after a certain number of retries, it prints an error message and aborts. In initial versions of Monster a count was kept of how many times two processes would "collide" when both wanted to read one record. The random wait dramatically reduced this hit count. Monster's response time using this scheme is acceptable when the load on the VAX is not too high. However, it does have some drawbacks. The first is that a data record being read by a Monster process is locked for a short time, even if the process has no intention of writing to it. Also, the collide-and-wait approach is somewhat crude considering VMS has extensive record locking facilities which are capable not only of allowing multiple-read access to a record but also of queueing processes desiring to write-lock a record. Unfortunately, the use of these facilities requires special VMS priviliges not available to ordinary users. During testing on a VAX 8800 running VMS 5.1 with over 50 interactive users and 14 players response time was fast enough for most picky users.
Monster processes communicate through a shared file. A communication from one process to another is referred to as an event; the shared file for communication is called the event file. Two player processes will only need to communicate if both players are in the same location, since actions in one room won't affect gamers elsewhere. However, when two or more players are in the same location, quite a lot of events may happen: o Notification of entry and exit -- players in the room must see when other players come and go o Notification of various actions -- such as picking up and dropping objects, taking inventory and closely examining things o Messages when players talk to each other in the game o Primary, target and third-party events for fighting -- the player throwing the punch sees one thing, the person being hit another, and somone else watching sees a third message. Because only player processes in the same Monster game location need to communicate, each room has an associated event file record. Each event file record contains a circular list of events with a pointer to the most recent event. When a player enters a new room, either by moving or joining the game, the Monster process reads the event file record for the room and makes a local copy of the current event pointer. At periodic intervals, the Monster process will reread the event file record and compare its local pointer to the one in the event file. If they are different, other player processes have logged events to the event record, and the Monster process will pull them off the list, handle them, and update its own local pointer. When a process needs to log an event, it write-locks the event file record, writes a new event, and updates the event file pointer. There are over sixty different events that a Monster process can initiate or handle; each event can be interpreted differently according to circumstances. For example, player A may whisper something to player B. Suppose player C is also in the room. Player A's process logs an event containing the message, the event type ("whisper") and the target of the whisper (player B) to the event file record associated with their current location. > whisper b >> Hey b, this is something I whispered to you. Player B's process will receive and handle the event: A whispers, "Hey b, this is something I whispered to you." Player C's process will also receive and handle the event. Usually C will only see A and B whispering together: A is whispering to B. However, there is a small chance that C will overhear the message: You overhear A whispering to B: "Hey b, this is something I whispered to you." This method of interprocess communication requires that all Monster processes frequently read the event file to see if any events have occured. This might seem less efficient than another scheme possibly using VMS mailboxes or shared memory. Lack of sufficient VMS privileges prevented me from using shared memory. Mailboxes might be more efficient, especially if used with the Vax's interrupt system. However, several problems would be present: o In order to allow any process to communicate with any other, full interconnection would be necessary. In addition, since VMS mailboxes only transmit data in one direction, n Monster processes would require 2n mailboxes. A scheme using mailboxes would quickly exhaust process quota limits. o It is somewhat awkward to set up mailboxes and even more difficult to inform other processes of their presence. Once again, I believe that special VMS privileges might be necessary to do this. The event file scheme of communication has proven flexible and is fast enough when the VAX load is not high.
When a user runs Monster, it first checks a playerlog to see if he has ever played before. If so, the player is restored to the state he was in when he last played, just before issuing the QUIT command. In the user is not found in the playerlog, he is started out at an initial location, somewhat in the center of the world. To place a player into a location, Monster scans the room record for a free "person" slot to put the player's index into. Once the player is part of the room record, he will be visible to other players who are also in that room (providing he hasn't hidden himself), and they will be able to interact with him. A dangerous situation occurs when a player process dies or becomes disconnected for some reason. In this case, the room record shows that a certain player is in a location, but in fact there is no controlling Monster process for that player. There will be no process to handle events directed at that player. This is a bad situation because they player is not obviously "dead" to the other Monster programs, as interprocess communication only involves sending an event, and does not provide for receipt acknowledgement. These "zombie" players were a serious nuisance in an early version of Monster. The Monster world appeared to be full of players, when in fact they were just ghosts left from players typing the VAX interrupt character or becoming disconnected from modems (Monster now inhibits the interrupt character to help prevent the casual creation of zombies). There are two cases where a zombie game character may be detected: when another player suspects that a game character is not being controlled by a real user (either from a lack of response from the game character or by checking the VAX user list); or when the player who created the zombie character attempts to play Monster again (only one player per account is allow to play Monster at a time, so if a player tries to enter Monster and also appears to be currently playing the game, either 1) two players on one account are trying to play Monster at the same time, or 2) the player character that appears to be currently playing Monster is really a zombie). To handle the first case, when one player suspects another of being a zombie, the player can issue the PING command. PING sends repeated events directed at the suspected zombie, with short pauses between the sends. If PING does not receive a response within a certain amount of time (currently about three seconds) it attempts to smoothly return the zombie character to the "inactive" (not playing) state. This involves taking every object the player character was holding and dropping them on the ground, updating the "time of last play" record and modifying the playerlog to show that the player is not currently playing. In the second case, when no other player has PINGed away the zombie and the original player (the one responsible for the zombie character) attempts to reenter Monster, Monster will inform him: There may have been some trouble the last time you played. Trying to fix it . . . At this point, Monster itself attempts to PING the player's character. If two people on the same account are trying to play Monster at the same time the PING will be answered and Monster will not let the second player into the game. Otherwise, the player will enter Monster normally after a short pause: All should be fixed now. Welcome back, Faust. Your last play was on 13-MAY-1988 at 8:31pm. Even with this solution, there are still situations where trouble can arise with zombie characters. For example, suppose a player is on a modem playing Monster and becomes disconnected. Another player PINGs away the zombie character. The dialup player calls up the VAX again, and reconnects to his disconnected process. Now his Monster process still thinks the player character is alive in the room (it has no knowledge of the disconnect) but the database shows that the player is inactive. If only a few events have been logged in the associated event file record, the reconnnected Monster process will notice the fatal PING to itself (lingering in the event file record) and will abort. However, if many events have occured while the process was disconnected, it will not be aware of the change to the database. This will leave the database in an inconsistent state until the player QUITs the game. Fortunately, when the player quits the database will be fixed. Since this problem will eventually correct itself (when the player quits) and because checking for this very rare situation would slow response time considerably (Monster would have to verify its existence in the database continuously) I decided to ignore this exception. I had originally hoped for a smoother solution to the "disconnected player" problem. In a system where a central process drives all of the player terminals, this is possible. However, because control in Monster is shared between many identical processes, the problem is much harder.
How the "Installed Base" Stagnated New Development: During the development of Monster I would periodically change the records that held the Monster database. Once changed in the program, this would render the existing database unusable, as the new program could no longer open the old files. Thus, I would have to destroy the existing world if I wanted to add any fields to the records that comprised the shared files. In order to provide a stable environment for players who did not want to see their hard work making Monster rooms destroyed every time I made a change to the structure of the database, I installed a version with a separate set of data files than the copy I worked on for development. Players created rooms and tested the installed version, while I continued to develop my own copy. Eventually, the world in the first release of Monster had about 60 rooms. About a month after installing the original Monster I replaced it with the new, greatly enhanced version I had been working on (the executable was about 4 times the size of the original) and started over with an empty world. I had provided expansion fields in the data records for the new release of Monster so I could continue to develop the game without having to work on my own private copy. The second release of Monster was very popular. I continued to add features to the program, and made use of the expansion fields when possible. However, I felt more and more constrained by the limits of my database. I needed to change more about the data records than the expansion fields would allow. I wanted to erase the world a second time; however, players had put much work into creating over 100 rooms, and became quite angry when I suggested that I might throw away the current world to make a new one. Some suggested that I write a program which would convert the existing database to a new format. However, I felt that the work to do this would be much greater than the work I was planning to spend to make enhancements to the game. Also, the style of my changes during development called for small frequent changes. I abandoned the idea of trying to write a translation program, and instead attempted to work around the limitations of the database structure. Eventually, however, my work stagnated, and new development on Monster ceased. I never anticipated the work of my playtesters holding back further development. If I were to rewrite Monster, I would use a more flexible storage approach, one probably involving a form of dynamic typing which would let me add new parameters to the database without actually changing the record structure or size.
Additional information available:
A | B | C | D | E |
Appendix A: Specifyable Parameters for Monster Locations and Objects Rooms: ------ nicename: the name of the room nameprint: formatting control for the nicename primary, secondary: textual descriptions of the room which: control for which room description prints: 0 - only print primary room description 1 - only print secondary room description 2 - print both primary and secondary room descriptions 3 - print primary description; then print secondary description if the player is holding the specified magic object for the room magicobj: the magic object for the room trapto, trapchance: allows a player to semi-randomly be thrust through an exit rndmsg: eerie message that randomly prints details: details that may be looked at in the room Exits: ------ toloc: where the exit goes kind: type of the exit: 0 - no exit; always fails 1 - open exit; always succeeds 2 - exits succeeds if player has key object 3 - exit fails if player has key object 4 - exit randomly fails 5 - potential exit; doesn't exist yet 7 - exit cycles between being open and closed exitdesc: short textual descrption of the exit fail: description if player fails to go through exit success: description if player succeeds to go through exit goin: what other players see when someone goes into the exit comeout: what others see when a player comes out of the exit hidden: what the player sees when he finds the exit (if it's hidden) objreq: key object for exit alias: name of the exit reqverb: requires the player to use the alias only (without "go") to use the exit reqalias: requires the player to know the exit alias; can't use the compass point autolook: surpresses the automatic "look" done upon entering the new room Objects: -------- oname: the name of the object kind: type parameter for the object linedesc: short description of the object (the "on the floor" description) examine: close inspection description for the object numexist: how many copies of the object exist sticky: inhibits players from being able to pick up the object getobjreq: requires the player to be holding another object before he can pick up this one getfail: message printed if a player fails to get an object getsuccess: message printed when an object is successfully picked up useobjreq: object player must be holding to use this object uselocreq: place player must be in to use this object usefail: message printed if player fails in use of the object usesuccess: message printed if object is successfully used usealias: alias word to "use" reqalias: require player to know the alias to use the object article: whether "a", "an", "some", "the" should precede the object name
Appendix B: Monster Command List Accept/Refuse # Allow others to Link an exit here at direction # | Undo Accept Brief Toggle printing of room descriptions Customize [#] Customize this room | Customize exit # | Customize object # Describe [#] Describe this room | Describe a feature (#) in detail Destroy # Destroy an instance of object # (you must be holding it) Duplicate # Make a duplicate of an already-created object. Form/Zap # Form a new room with name # | Destroy room named # Get/Drop # Get/Drop an object #,Go # Go towards # (Some: N/North S/South E/East W/West U/Up D/Down) Health Show how healthy you are Hide/Reveal [#] Hide/Reveal yoursef | Hide object (#) I,Inventory See what you or someone else is carrying Link/Unlink # Link/Unlink this room to/from another via exit at direction # Look,L [#] Look here | Look at something or someone (#) closely Make # Make a new object named # Name # Set your game name to # Players List people who have played Monster Punch # Punch person # Quit Leave the game Relink Move an exit Rooms Show information about rooms you have made Say, ' (quote) Say line of text following command to others in the room Search Look around the room for anything hidden Self # Edit a description of yourself | View #'s self-description Show # Show option # (type SHOW ? for a list) Unmake # Remove the form definition of object # Use # Use object # Wear # Wear the object # Wield # Wield the weapon #; you must be holding it first Whisper # Whisper something (prompted for) to person # Who List of people playing Monster now Whois # What is a player's username ?,Help This list . (period) Repeat last command
Appendix C: Customization Subsystem Menus Room Customization: ------------------- Custom> ? D Alter the way the room description prints N Change how the room Name prints P Edit the Primary room description [the default one] (same as desc) S Edit the Secondary room description X Define a mystery message G Set the location that a dropped object really Goes to O Edit the object drop description (for drop effects) B Edit the target room (G) "bounced in" description T Set the direction that the Trapdoor goes to C Set the Chance of the trapdoor functioning M Define the magic object for this room R Rename the room V View settings on this room E Exit (same as quit) Q Quit (same as exit) ? This list Exit customization: ------------------- Custom [direction]> ? A Set an Alias for the exit C Conceal an exit D Edit the exit's main Description E EXIT custom (saves changes) F Edit the exit's failure line I Edit the line that others see when a player goes Into an exit K Set the object that is the Key to this exit L Automatically look [default] / don't look on exit O Edit the line that people see when a player comes Out of an exit Q QUIT Custom (saves changes) R Require/don't require alias for exit; ignore direction S Edit the success line T Alter Type of exit (passage, door, etc) V View exit information X Require/don't require exit name to be a verb ? This list Object Customization: --------------------- Custom object> ? A "a", "an", "some", etc. D Edit a Description of the object F Edit the GET failure message G Set the object required to pick up this object 1 Set the get success message K Set the Kind of object this is L Edit the label description ("There is a ... here.") P Program the object based on the kind it is R Rename the object S Toggle the sticky bit U Set the object required for use 2 Set the place required for use 3 Edit the use failure description 4 Edit the use success description V View attributes of this object X Edit the extra description 5 Edit extra desc #2 E Exit (same as Quit) Q Quit (same as Exit) ? This list
Appendix D: Monster Playerlist as of June 5, 1988 dolpher ! Monster Manager 5-JUN-1988 1:48pm * great baths dasun_c ! Iceman 4-JUN-1988 10:30pm * the transporter room kirsten ! Kirsten 4-JUN-1988 11:20pm * ffoirefirma isakson ! Satan 3-JUN-1988 10:13am * satan's private hell tlb05405 ! Tlb05405 3-JUN-1988 11:59am * east hall nate ! Smaug 3-JUN-1988 7:41pm * platform 1 skrenta ! Faust 3-JUN-1988 8:37pm * tower room gary ! Monster Vice Manager 2-JUN-1988 9:50pm * inner office laura ! Laura 2-JUN-1988 10:36pm * turbolift chamber james ! James 1-JUN-1988 7:54pm * chuk's elevator chuk ! SoulStorm 1-JUN-1988 9:57pm * east hall peter_t ! Peter_t 31-MAY-1988 8:33pm * pine forest cary ! Cary 31-MAY-1988 11:20pm * maelstrom francisco ! Prof. Anthrax 30-MAY-1988 3:54pm * waterbed sundeep ! Sundeep 29-MAY-1988 2:21pm * mta office bkc04916 ! Cheekster 28-MAY-1988 10:51am * the 'ell stop ktl04905 ! Corwin 28-MAY-1988 11:44am * west hall perry ! Bufu Master!!! 28-MAY-1988 8:40pm * pinkie's place maryahn ! pinkie 27-MAY-1988 12:39pm * the sewer tunnel immell ! hurricane eye 26-MAY-1988 2:25am * post office 3 robert ! Hungry Wolf 26-MAY-1988 2:26am * roll6 linda ! linlop 26-MAY-1988 10:47am * terminal room jeff ! Pringle 25-MAY-1988 7:12pm * ic mic00229 ! Mic00229 22-MAY-1988 8:33pm * great hall jeffoire ! Ffoire Zen Salad 20-MAY-1988 1:41pm * bar schroder ! Schroder 19-MAY-1988 10:09am * burrow lunde ! Purple Peril 18-MAY-1988 12:55pm * cloud 9.5 pib ! Great Pib 17-MAY-1988 11:51pm * great pib's lair ahrens ! it 15-MAY-1988 4:56pm * landing mborsetti ! Mborsetti 12-MAY-1988 10:20pm * sewer crossroads brian ! Mr. Raven 11-MAY-1988 11:24am * a damp and dark hole wen05563 ! Gary 11-MAY-1988 9:00pm * great hall jimbo ! Jimbo 8-MAY-1988 10:02pm * great hall lentz ! Lentz 7-MAY-1988 8:24am * front of isp noyes miller ! Mungus 5-MAY-1988 1:14pm * starbase otto ! Otto 4-MAY-1988 8:45pm * heidi's nightmare chris ! House Manager 3-MAY-1988 3:54am * home base liao ! Liao 30-APR-1988 1:21pm * white house chaz ! Chaz 29-APR-1988 4:05pm * post office 2 jmc ! Run JMC 29-APR-1988 4:37pm * isp heaven rod ! Rod 29-APR-1988 9:00pm * great hall choi ! Choi 28-APR-1988 8:25pm * east hall bo ! God 26-APR-1988 1:58pm * great hall jonathan ! Jonathan 26-APR-1988 5:26pm * eye of the hurricane swift ! Swift 26-APR-1988 8:53pm * post office hall ric05787 ! Deadhead 26-APR-1988 10:57pm * nightmarish room mccoy ! The Scribe 26-APR-1988 11:41pm * scribe home g_wenslow ! Gary II 24-APR-1988 11:58pm * east hall kri04333 ! Kri04333 18-APR-1988 12:11am * great hall dissett ! Kronos 18-APR-1988 10:13pm * kronos' room wantz ! Wantz 17-APR-1988 2:51pm * great hall cheezer ! Cheezer 16-APR-1988 7:55pm * the pine forest ahr04465 ! Ivo 16-APR-1988 7:56pm * sewer transport joey ! geek 15-APR-1988 8:03pm * forest crossroads wargaski ! Wargaski 14-APR-1988 4:01pm * toxicated eric ! Eric 13-APR-1988 3:51pm * the hall of chuk rwc00220 ! Rwc00220 12-APR-1988 1:32pm * great hall kstull ! Kstull 12-APR-1988 5:01pm * post office 3 tim ! Tim 11-APR-1988 8:26pm * great hall sean ! Sean 10-APR-1988 4:27pm * great hall sam ! Sam 10-APR-1988 12:54pm * great hall dean ! Artagel 9-APR-1988 8:21am * turbolift chamber supercom ! Cursor 8-APR-1988 12:00am * forest paths anne ! Anne 7-APR-1988 6:55pm * great hall lisa ! Lisa 7-APR-1988 6:56pm * great hall mouse ! Mouse 3-APR-1988 11:26pm * west hall mca04477 ! Mca04477 2-APR-1988 8:56pm * burrow sajiv ! Sajiv 30-MAR-1988 6:06pm * great hall chad ! Chad 30-MAR-1988 6:37pm * chuk's elevator jennifer ! Jennifer 30-MAR-1988 7:22pm * east hall lasonia ! Lasonia 29-MAR-1988 11:22am * west hall brian_t ! Brian_t 29-MAR-1988 11:59am * maelstrom mikk ! Random 29-MAR-1988 11:19pm * ledge topher ! Topher 28-MAR-1988 1:19pm * great hall spectre ! Ghost in the machine 28-MAR-1988 11:43pm * ghost's mailroom dave ! Dave 18-MAR-1988 10:14am * post office hall penguins ! Penguins Amok 18-MAR-1988 11:52pm * chuk's elevator lawson ! Space Cowboy 18-MAR-1988 12:23pm * great hall heidi ! Heidi 17-MAR-1988 1:11am * digital purgatory bueno ! Bueno 17-MAR-1988 7:49pm * post office hall dan ! Grando 16-MAR-1988 8:18am * eye of the hurricane eric_yue ! Samsok 16-MAR-1988 9:29pm * the yueguy's joint cra01453 ! Cra01453 15-MAR-1988 3:01am * great hall adam ! Adam 14-MAR-1988 6:45pm * round room was04906 ! Milt 14-MAR-1988 9:48pm * great hall watson ! Watson 14-MAR-1988 10:22pm * chuk's elevator brianw ! Brianw 12-MAR-1988 * ffoirefirma mike ! Mike 12-MAR-1988 * toxicated predator ! Predator 12-MAR-1988 * east hall daniel ! Daniel 11-MAR-1988 * west hall dav08345 ! Dav08345 11-MAR-1988 * great hall vlahos ! otis 11-MAR-1988 * post office ginter ! Ginter 10-MAR-1988 * living room rob09549 ! Rob09549 9-MAR-1988 * great hall dora ! Dora 8-MAR-1988 * toxicated kim ! kim 8-MAR-1988 * post office 2 michael ! Prabdib 7-MAR-1988 * tunnel of love bradley ! Bradley 29-FEB-1988 * eye of the hurricane john ! Raunchmeister 29-FEB-1988 * underhall melvin ! Killer Melvin 27-FEB-1988 * chuk's elevator cliff ! Cliff 26-FEB-1988 * east hall
Appendix E: An Actual Monster Game Log $ monster Welcome to Monster! Hit return to start: Welcome back, Faust. Your last play was on 1-JUN-1988 at 10:47pm. You're in Great Hall You're in the middle of a vast hall stretching out of sight to the east and west. Strange shadows play across the high vaulted ceiling. The floor is set with smooth rectangular stones. The walls feel slightly cold to the touch, and damp with condensation. A copper plaque, slightly green with age, is set into one wall. Monster Manager is here. > Monster Manager vanishes in a brilliant burst of multicolored light. > l You're in Great Hall You're in the middle of a vast hall stretching out of sight to the east and west. Strange shadows play across the high vaulted ceiling. The floor is set with smooth rectangular stones. The walls feel slightly cold to the touch, and damp with condensation. A copper plaque, slightly green with age, is set into one wall. > Monster Manager appears in a brilliant burst of multicolored light. > who Monster Status 1-JUN-1988 10:48pm Username Game Name Where dolpher Monster Manager great hall skrenta Faust great hall > look plaque The plaque looks very old and corroded. However, you can still make out the writing: " Monster, created by Rich Skrenta, 1988. Play at your own risk. " > show details Details here that you may inspect: stones plaque > look stones The stones are rough and black, and cold to the touch. Although the mortar work appears to have been expertly done, it has decayed with time. Many stones are cracked, and narrow spaces fracture the carefully laid pattern. Some of the stones are quite loose. You might be able to lift one of them with some effort. > Monster Manager is looking at the stones. > Monster Manager is looking at the plaque. > Monster Manager says, "Hey Faust, let's go down to the Underhall." > Monster Manager manages to lift a stone in the floor and descends. > lift With great effort, you manage to lift the stone enought to fit inside. Once below the stone, it falls back into place, sealing out the light from above. You squirm down the narrow tunnel . . . You're in UnderHall This is a cramped, humid room beneath the Great Hall. The walls are dripping with water condensed from mist rising from the baths. Some of the mist follows the ceiling and dissappears up the narrow tunnel. Stairs lead north down to the Great Baths. A neon sign flashes "Great PIB's Lair" over a door to the South. You could manage a crawl through a narrow tunnel leading upwards. Monster Manager is here. > look Monster Manager Monster Manager is the stereotype of a computer hacker. He is wearing a flannel shirt with several snickers bars in the breast pocket. On his belt is an ASCII-HEX conversion chart. On his feet are a scuffed pair of hiking boots so he can tackle those dangerous mountains that crop up in operations. Also dangling from his belt is a battered box with many buttons on the front and wires with sockets on the ends protruding from the back. The switches seem to have been placed haphazardly, but the object is unmistakably one of great power nonetheless. Monster Manager is in perfect health. Monster Manager is empty handed. > Monster Manager is looking at you. > Monster Manager swings at you but misses. > You duck in time to avoid Monster Manager's punch. > You see stars as Monster Manager bashes you in the face. > You parry Monster Manager's attack. > punch Monster Manager You can't punch the Monster Manager. > l You're in UnderHall This is a cramped, humid room beneath the Great Hall. The walls are dripping with water condensed from mist rising from the baths. Some of the mist follows the ceiling and dissappears up the narrow tunnel. Stairs lead north down to the Great Baths. A neon sign flashes "Great PIB's Lair" over a door to the South. You could manage a crawl through a narrow tunnel leading upwards. Monster Manager is here. > n You're in Great Baths These are the luxurious Great Baths where tired adventurers may come to relax and try to regain their health and youth from the mineral waters. From where you stand at the entrance, you can see below you the bubbling soapy pools of water churning violently in tile-lined pits. The pools are fed by hot springs from deep in the rock beneath you. Steam and huge soapy bubbles rise out of the hot pools of water. The bubbles dance through the air, climbing higher and higher, until they either burst on the sharp walls of the cave or are lost in the mist above you. Shallow tiled steps, wet and slick from the hot soapy waters of the springs, lead down to the pools. Rough stone stairs lead up to the south. > In an explosion of orange smoke Monster Vice Manager poofs into the room. > Monster Manager has come down the stairs from the Underhall. > Monster Vice Manager produces a "who" list and reads it. > system System> v used free total Block file 1008 92 1100 Line file 1501 109 1610 Room file 283 27 310 Object file 139 41 180 Integer file 6 0 6 System> Monster Vice Manager is in system maintenance mode. System> exit > Monster Vice Manager is no longer in system maintenance mode. > 'Hey Gary > Monster Vice Manager says, "Hi, Faust." > look Monster Vice Manager The Monster Vice Manager is dressed in a conservative three piece suit. The stern expression on his face is just a facade, he really is a warm and sensitive guy underneath. He is willing to answer any questions and help out with any problems. He can best be described by the phrase: "Do what thou wilt, so mete it be." He returns your gaze with a hint of understanding and amusement. Monster Vice Manager is in perfect health. Monster Vice Manager is empty handed. > Monster Vice Manager is looking at you. > punch Monster Vice Manager You swing wild and miss. > . Monster Vice Manager ducks and avoids your punch. > . A quick punch, but it only grazes Monster Vice Manager. > You only feel the breeze as Monster Vice Manager swings wildly. > . You swing wild and miss. > You see stars as Monster Vice Manager bashes you in the face. > You only feel the breeze as Monster Vice Manager swings wildly. > . You deliver a quick jab to Monster Vice Manager's jaw. > Monster Vice Manager's swing misses you by a yard. > . Your roundhouse blow sends Monster Vice Manager reeling. > You double over after Monster Vice Manager lands a mean jab to your stomach! Monster Vice Manager looks a little dazed. > Monster Vice Manager vanishes from the room in a cloud of orange smoke. > who Monster Status 1-JUN-1988 10:56pm Username Game Name Where dolpher Monster Manager great baths skrenta Faust great baths gary Monster Vice Manager inner office > poof inner office This rooms is a conservatively decorated office. A large desk dominates the room. Several pictures hang on the walls and a silver service is on a stand off to the left. Two plush chairs beckon for you to sit down. There are stairs leading down. Monster Vice Manager is here. Monster Vice Manager looks a little dazed. > sh det Details here that you may inspect: bin plaque pictures stand > look bin The bin has a sign on it saying, "Leave mail for the Monster Vice Manager here. Thank you." > look plaque The plaque reads: Gary Wenslow, Monster Vice Manager > look pictures These are very nice pictures of landscapes. They look expensive. > look stand The silver service on this stand is of fine workmanship. There are also crystal goblets and flasks containing very fine wine, brandy, and whiskey. > l This rooms is a conservatively decorated office. A large desk dominates the room. Several pictures hang on the walls and a silver service is on a stand off to the left. Two plush chairs beckon for you to sit down. There are stairs leading down. Monster Vice Manager is here. Monster Vice Manager looks a little dazed. > rooms gary gary: tunnel of love more tunnel of love end of tunnel hot dog stand picnic window mvm office inner office hall1 hall2 hall3 hall4 hall5 hall6 hall7 hall8 hall9 concession roll1 roll2 roll3 roll4 roll5 roll6 roll7 roll8 roll9 roll10 worker's ledge railing rope mvm mail room > rooms dolpher dolpher: void pit of fire underhall great baths pools in the pool in the bubble higher bubble highest bubble ledge tower ledge circular staircase behind house kitchen living room bottom of stairs manager's mailbox tower room on the scaffolding round room mountain pass roof of tower west passageway castle entrance center hall outside the gate east passageway narrow passage > poof behind house You're at Behind House The back door of the house is boarded up, but the windows have not been blocked. One window at ground level leads into what appears to be the kitchen. All of the other windows are too far above the ground for you to reach. A path leads west to the front of the house. > form Study > poof studty There is no room named studty. > poof study You're in Study A note on the east wall says "Your exit here." > refuse east Exits east will be refused. > l You're in Study > desc [ Editing the primary room description ] Enter text. Terminate with ** at the beginning of a line. You have 10 lines maximum. 1: This is a luxurious study walled with fine oak paneling. A window 2: looks out of the east wall. It is surrounded by purple curtains. 3: There is a small sign on the wall. 4: ** * e > l You're in Study This is a luxurious study walled with fine oak paneling. A window looks out of the east wall. It is surrounded by purple curtains. There is a small sign on the wall. > desc sign [ Editing detail "sign" of this room ] Enter text. Terminate with ** at the beginning of a line. You have 10 lines maximum. 1: The note seems to have been hurriedly scrawled. It reads: 2: 3: " This room for demonstration purposes only! " 4: 5: ** * ? A Append text to end C Check text for correct length with parameter substitution (#) D # Delete line # E Exit & save changes I # Insert lines before line # P Print out description Q Quit: THROWS AWAY CHANGES R # Replace text of line # Z Zap all text @ Throw away text & exit with the default description ? This list * p 1: The note seems to have been hurriedly scrawled. It reads: 2: 3: " This room for demonstration purposes only! " 4: * e > sh det Details here that you may isspect: sign > look sign The note seems to have been hurriedly scrawled. It reads: " This room for demonstration purposes only! " > l You're in Study This is a luxurious study walled with fine oak paneling. A window looks out of the east wall. It is surrounded by purple curtains. There is a small sign on the wall. > desc sign [ Editing detail "sign" of this room ] * i 1 1: 2: ** * p 1: 2: The note seems to have been hurriedly scrawled. It reads: 3: 4: " This room for demonstration purposes only! " 5: * e > look sign The note seems to have been hurriedly scrawled. It reads: " This room for demonstration purposes only! " > l You're in Study This is a luxurious study walled with fine oak paneling. A window looks out of the east wall. It is surrounded by purple curtains. There is a small sign on the wall. > form Behind the Curtains > link west Hit return alone at any prompt to terminate exit creation. Room to link to? behind the curtains Exit comes out in target room from what direction? east Exit created. Use CUSTOM west to customize your exit. > l You're in Study This is a luxurious study walled with fine oak paneling. A window looks out of the east wall. It is surrounded by purple curtains. There is a small sign on the wall. There is a passage leading west. > custom west Customizing west exit If you would rather be customizing this room, type CUSTOM with no arguments If you would rather be customizing an object, type CUSTOM <object name> Type ** for any line to leave it unchanged. Type return for any line to select the default. Custom west> ? A Set an Alias for the exit C Conceal an exit D Edit the exit's main Description E EXIT custom (saves changes) F Edit the exit's failure line I Edit the line that others see when a player goes Into an exit K Set the object that is the Key to this exit L Automatically look [default] / don't look on exit O Edit the line that people see when a player comes Out of an exit Q QUIT Custom (saves changes) R Require/don't require alias for exit; ignore direction S Edit the success line T Alter Type of exit (passage, door, etc) V View exit information X Require/don't require exit name to be a verb ? This list Custom west> a Alternate name for the exit? curtains Custom west> r The alias for this exit will be required to reference it. Custom west> d Enter a one line description of the exit. Type ** to leave line unchanged, * to make [no line] * Custom west> exit > l You're in Study This is a luxurious study walled with fine oak paneling. A window looks out of the east wall. It is surrounded by purple curtains. There is a small sign on the wall. > go curtains You're in Behind the Curtains There is a passage leading east. A note on the floor says "Your exit here." > e You're in Study This is a luxurious study walled with fine oak paneling. A window looks out of the east wall. It is surrounded by purple curtains. There is a small sign on the wall. > desc window [ Editing detail "window" of this room ] Enter text. Terminate with ** at the beginning of a line. You have 10 lines maximum. 1 You see a green lawn shaded by tall trees and bordered with sculptured 2: shrubbery. A small rabbit is nibbling at some grass. The entire 3: scene has an artificial look, as if it were some cartoon rendering. 4: ** * exit > sh det Details here that you may inspect: sign window > look window You see a green lawn shaded by tall trees and bordered with sculptured shrubbery. A small rabbit is nibbling at some grass. The entire scene has an artificial look, as if it were some cartoon rendering. > quit You vanish in a brilliant burst of multicolored light. $
You get help of these commands in monster by typing command and questionmark. For example: accept ?
Additional information available:
Syntax: Accept <direction> Description: Allows others to link exits here at <direction> Requirements: You are the owner of this room or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Atmosphere <your action> Shortcut: :<your action> Description: Prints other players and you a text <your player name> <your action>
Syntax: Brief Description: Toggles brief printing of room description off or on
Syntax: Claim Claim <object> Claim <monster> Claim <spell> Description: Sets the ownership of <object> or <monster> or <spell> or this room to you Requirements: Current ownership of target is Disowned or you have the Manager -privilege
Syntax: Customize Customize <direction> Customize <object> Customize <monster> Customize room Customize object <object> Customize monster <monster> Description: Customizes <object> or <monster> or <direction> or this room Requirements: You are the owner of the target or you have the Owner -privilege, or you have the Manager -privilege, if owner of target is System Bugs: Following non-existed commands is recognized: Customize player <...> Customize spell <...>
Additional information available:
Exit-menu | Room-menu | Object-menu | Monster-menu |
A Set an Alias for the exit C Conceal an exit D Edit the exit's main Description E EXIT custom (saves changes) F Edit the exit''s failure line I Edit the line that others see when a player goes Into an exit K Set the object that is the Key to this exit L Automatically look [default] / don't look on exit O Edit the line that people see when a player comes Out of an exit Q QUIT Custom (saves changes) R Require/don't require alias for exit; ignore direction S Edit the success line T Alter Type of exit (passage, door, etc) V View exit information X Require/don't require exit name to be a verb ? This list
A Define an alternate mystery message block B Edit the target room (G) "bounced in" description C Define action code (hook) for room D Alter the way the room description prints E Exit (same as quit) F Set the chance of the trapdoor functioning G Set the location that a dropped object really goes to H This list I Edit the default exit failure message M Define the magic object for this room N Change how the room Name prints O Edit the object drop description (for drop effects) P Edit the Primary room description <the default one> (same as desc) Q Quit (same as exit) R Rename the room S Edit the Secondary room description T Set the direction that the Trapdoor goes to V View settings on this room X Define a mystery message 1 Set the primary visual link for this room 2 Set the secondary visual link for this room ? This list
B Block hook code. C Type COMMANDS.PAPER. D Delete hook. E Exit customizing hook. F Free hook code. G Get program file, default extension is .MDL. H This list. L List hook code. M Run manually hook code. O List hook code to file. P Change hook privilege. Q Exit customizing hook. V View hook. ? This list.
- <privilege> Remove privilege + <privilege> Add privilege E Exit L List possible privileges. Q Quit (do not save changes) V View current privileges ? This list
A "a", "an", "some", etc. C Customizing hook D Edit a Description of the object F Edit the GET failure message G Set the object required to pick up this object 1 Set the get success message K Set the Kind of object this is L Edit the label description ("There is a ... here.") P Program the object based on the kind it is R Rename the object S Toggle the sticky bit U Set the object required for use 2 Set the place required for use 3 Edit the use failure description 4 Edit the use success description V View attributes of this object X Edit the extra description 5 Edit extra desc #2 E Exit (same as Quit) Q Quit (same as Exit) ? This list 6 Set home description 7 Set home of object
B Block the hook code. C Type COMMANDS.PAPER. D Delete the hook. E Exit customizing the hook. F Free the hook code. G Get a program file, default extension is .MDL. H This list. L List the hook code. M Run manually the hook code. O List the hook code to a file. P Change the hook privilege. Q Exit customizing the hook. V View the hook. ? This list.
- <privilege> Remove a privilege + <privilege> Add a privilege E Exit L List possible privileges. Q Quit (do not save changes) V View current privileges ? This list
A Give monster's level and heal monster. B Block monster C Type COMMANDS.PAPER D Customize the monster's privilege set. E Exit customizing the monster F Free the monster G Get a program file, the default extension is .MDL H This list I Give the monster's health. J Disable/Enable control access. L List the monster code. M Run manuallytthe monster code N Change the monster name O List the monster code to a file. P Change the monster's privilege Q Exit customizing the monster S Write the monster's self description V View the monster. ? This list
- <privilege> Remove a privilege + <privilege> Add a privilege E Exit L List possible privileges. Q Quit (do not save changes) V View current privileges ? This list
Syntax: Dcl Dcl <command> Description: Starts a subprocess for shell and leaves Monster running Executes <command>, if given
Syntax: Describe Describe <detail> Description: Writes a description of <detail> or this room Requirements: You are the owner of this room or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Destroy <object> Destroy all Destroy <object,...> Description: Destroys an instance of object(s) Requirements: You are the owner of the object or you have the Owner -privilege or you have the Manager -privilege, if the owner of object is System And you are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Disown Disown <object> Disown <monster> Disown <spell> Description: Sets the ownership of <object> or <monster> or <spell> this room to Disowned Requirements: You are the owner of the target or you have the Owner -privilege, if target is this room or you have the Owner -privilege, if the target is object or monster or you have the Manager -privilege, if the owner of the target is System
Syntax: Drop <object> Drop all Drop <object,...> Description: Drops an object
Syntax: Duplicate <object> Duplicate all Duplicate <object,...> Description: Creates an instance of object(s) Requirements: You are the owner of the particular object or you have the Owner -privilege or you have the Manager -privilege, if the owner of object is System And you are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Erase <monster> Description: Destroys <monster> Requirements: You are the owner of the monster or you have the Owner -privilege or you have the Manager -privilege, if the owner of monster is System
Syntax: Form <room> Description: Creates a new room with the name: <room> Requirements: You are the owner of this room or this room has some kind of exit with Accept or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Get <object> Get all Get <object,...> Description: Gets an object
Syntax: Go <direction> Shorcut: <direction>
Syntax: Health Description: Shows your health
Syntax: Hide Hide <object> Hide all Hide <object,...> Description: Hides an object or you
Syntax: Inventory Inventory <player> Inventory all Inventory <player,...> Description: Gives the inventory of <player> or your own inventory
Syntax: Link <direction> Description: Creates a new exit from this room to <direction> Requirements: You are the owner of this room or <direction> is Accepted or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Look Look <object> Look <monster> Look <player> Look <detail> Look all Look <object,...> Look <monster,...> Look <player,...> Description: Looks something. (Gives its description)
Syntax: Make <object> Description: Creates a new object with the name: <object> Requirements: You are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Bear <monster> Description: Creates a new monster with the name <object> Requirements: You are the owner of this room or the room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Name <nicename> Description: Changes yoy player name to <nicename>
Syntax: Monsters Monsters <player> Monsters all Monsters public Monsters disowned Monsters system Description: Shows the objects of <player> or your objects Requirements: You, Public or Disowned have target or you have the Owner -privilege
Syntax: Objects Objects <player> Objects all Objects public Objects disowned Objects system Description: Types objects of <player> or your objects Requirements: You, Public or Disowned have target or you have the Owner -privilege
Syntax: Spells Spells <player> Spells all Spells public Spells disowned Spells system Description: Types the spells of <player> or your own spells Requirements: You, Public or Disowned have target or you have the Owner -privilege
Syntax: Players Players all Players monster Players player Description: Lists players or monsters
Syntax: Poof <room> Poof <player> Poof <monster> Description: Moves you to <room> or moves <player> or <monster> Requirements: You are the owner of this room and <room> or You have the Poof -privilege
Syntax: Punch <player> Description: Punches <player> Requirements: Experience of <player> is lower than 700000
Syntax: Quit Shortcut: <F10> Ctrl-Z Description: Ends playing
Syntax: Relink <direction> Description: Reroutes an exit to <direction> Requirements: You are the owner of this room You have the Owner -privilege You have the Manager -privilege, if the owner of this room is System
Syntax: Refuse <direction> Description: Hinders other players to link to <direction> Requirements: You are the owner of this room You have the Owner -privilege You have the Manager -privilege, if the owner of this room is System
Syntax: Reveal Description: Reveals yourself
Syntax: Rooms Rooms <player> Rooms all Rooms public Rooms disowned Rooms system Description: Types all the rooms of <player> or your own rooms Requirements: the target is either owned by you or public, or is disowned. or you have the Owner -privilege
Syntax: Say <message> Shortcut: "<message> Description: Says a message to other players in this room
Syntax: Scan <object> Scan all Scan <object,...> Description: Lists all the locations of an object Requirements: You are the owner of this very object or you have the Owner -privilege or you have the Manager -privilege, if the owner of the object is System And you are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Reset <object> Reset all Reset <object,...> Description: Erases all instances of an object from public and your rooms - and from public and your monsters Creates one instance of the object to its home location Doesn't affect objects that players are carrying Requirements: There is at least one instance of object in public or your room or carrying by public or your monster You are the owner of object or you have the Owner -privilege or you have the Manager -privilege, if the owner of this object is System And you are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Score Score <player> Score <level> Score all Description: Prints your score and level or prints score and level of <player> or prints players, whose level is <level>
Syntax: Search Description: Searches hidden objects and players
Syntax: Self Self <player> Self <monster> Self all Self <player,...> Self <monster,..> Description: Creates your own self-description or types the self-description of <player>
Syntax: Set <option> Options: Password Change your password War Allow violance in Monster Peace Forbid any violance in Monster Spell Make new spell or customizing spell NewPlayer Set new player's welcome text Welcome Set welcome text Privilege Change your privileges
A Toggle spell mode B Block spell code. C Type COMMANDS.PAPER. D Delete spell. E Exit customizing spell. F Free hook code. G Get program file, default extension is .MDL. H This list. I Change your own level of this hook L List spell code. M Run manually spell code. O List spell code to file. P Change spell privilege. Q Exit customizing spell. V View hook. ? This list.
- <privilege> Remove privilege + <privilege> Add privilege E Exit L List possible privileges. Q Quit (do not save changes) V View current privileges ? This list
Syntax: Show <option> Options: Exits Lists exits you can inspect here Object Shows internals of an object Details Shows all the details you can look at this room Monster Shows the owner of a monster Privileges Shows your privileges Time Shows time and date Room Shows the owner of a room Commands.paper Lists COMMANDS.PAPER Levels Shows all the experience levels Quotas Show your quotas Spell Show your spell level or what spells you know
Syntax: Summon <spell name> <victim name> (type to prompt)
Syntax: Unlink <direction> Description: Removes exit to <direction> Requirements: You are the owner of this room or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Unmake <object> Description: Removes description of <object> Requirements: You are the owner of object or you have the Owner -privilege or you have the Manager -privilege, if the owner of object is System And you are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if the owner of this room is System
Syntax: Use <object>
Syntax: Wear Wear <armour>
Syntax: Wield Wield <weapon>
Syntax: Whisper <player>
Syntax: Who Who all Who player Who monster Description: Lists active players or monsters
Syntax: Whois <player> Whois all Whois <player,...> Description: Types the username of <player>
Syntax: Zap <room> Description: Removes <room> Requirements: You are the owner of <room> or you have the Owner -privilege or you have the Manager -privilege, if the owner of <room> is System And you are the owner of this room or this room is public or you have the Owner -privilege or you have the Manager -privilege, if owner of this room is System
Syntax: Help
Syntax: System Description: Manages Monster Requirements: You have the Manager -privilege (which is rare)
1 Customize player database. A Alter player privileges B Add description blocks C Subsystem D Disown <user> E Exit (same as quit) H Add header blocks K Kill <user> L Add one liner records M Move a player who is asleep (not playing now) O Add object records P Write a distribution list of players Q Quit (same as exit) R Add rooms T Throw player out from Monster V View current sizes/usage W List of players ? This list
- <privilege> Remove privilege + <privilege> Add privilege E Exit L List possible privileges. Q Quit (do not save changes) V View current privileges ? This list
A Change player''s health. E,Q for quit. L Change player's level/experience. N Change player's personal name. P Change player's password. R Change player's room quota. V View player''s data. H,? for help.
A Block monster''s code. B Block object''s code. C Block room''s code. D Shutdown Monster. E Leave subsystem. F Open Monster for playing. G Block spell's code. H This text. I Customize global MDL code M Claim monster to System. O Claim object to System. W Announce over Monster Universe. Q Leave subsystem. R Claim room to System. S Claim spell to System V View global flags. ? This text.
Syntax: Public Public <room> Public <object> Public <monster> Public <spell> Description: Sets the ownership of room or object or monster or spell or this room to Public Requirements: You have the Manager -privilege
Editing of block desciptions uses simple line editor. Editor executes automatic A(ppend text to end) -command. Give ** alone in in line to get follow menu. A Append text to end C Check text for correct length with parameter substitution (#) D # Delete line # E Exit & save changes I # Insert lines before line # P Print out description Q Quit: THROWS AWAY CHANGES R # Replace text of line # Z Zap all text @ Throw away text & exit with the default description ? This list
MDL is language for programming of monsters, objects, rooms and spells. Look COMMANDS.PAPER for more info.
Additional information available:
Syntax | Parameters | Labels | Command_Extension_System | Funktiot (suomenkielinen) |
Functions |
function -> name (p) / name (p,p) / name (p,p,p) / name (p,...) name -> fname / GOSUB label / DEFINE variable / SET variable / LABEL label / SUBMIT label / FOR variable label -> list of words p -> function / const / variable const -> "some text" / "some text"& const fname -> + / = / == / === / inv / pinv / players / objects / get / pget / drop / pdrop / and / or / move / pmove / pprint / print / oprint / if / where / null / attack / not / random / strip / experience / set experience / pluss / difference / times / quotient / set state / get state / less / number / health / all objects / all players / all rooms / control / include / exclude / get remote state / set remote state / remote objects / remote players / heal / duplicate / pduplicate / destroy / pdestroy / string head / string tail / head / tail / lookup object / lookup player / lookup room / parse object / parse player / parse room / privilege / userid / pprint raw / print raw / oprint raw / print null / mheal / mattack / list / lookup direction / get global flag / spell level / set spell level program -> sentence + sentence -> function / - function Comments start with ! and end to end of line. ! isn't comment character inside const.
+ (<line 1>,...,<line n>) = (<line 1>,<line 2>) == (<line 1>,<line 2>) === (<line 1>,<line 2>) inv () pinv () players () objects () get (<object list>) pget (<object list>) drop (<object list>) pdrop (<object list>) and (<item list 1>,<item list 2>,...,<item list n>) or (<item list 1>,...,<item list n>) move (<room's name>) pmove (<room's name>) pprint (<message part 1>,...,<message part n>) print (<message part 1>,...,<message part n>) oprint (<message part 1>,...,<message part n>) pprint raw (<message part 1>,...,<message part n>) print raw (<message part 1>,...,<message part n>) oprint raw (<message part 1>,...,<message part n>) print null (<message part 1>,...,<message part n>) if (<p1>,<action 1>,<action 2>) where (<monster's or player's name>) null (<action 1>,<action 2>,<action 3>,...,<action n>) attack (<attack force: nr>) not (<p1>) random (<item list>) strip (<string>) experience (<player's name>) set experience (<player's new experience>) plus (<p1: nr>,<p2: nr>) difference (<p1: nr>,<p2: nr>) times (<p1: nr>,<p2: nr>) quotient (<p1: nr>,<p2: nr>) get state () set state (<string>) get global flag (<flag list>) less (<p1: nr>,<p2: nr>) number (<p1: nr>) health (<player's name>) all players () all objects () all rooms () control (<monster's name>,<action>) include (<string>,<substring>) exclude (<item list>,<sub item list>) remote object (<room name>) remote players (<room name>) heal (<healing amount: nr>) duplicate (<object list>) pduplicate (<object list>) destroy (<object list>) pdestroy (<object list>) string head (<string>) string tail (<string>) head (<item list>) tail (<item list>) lookup object (<object list>) lookup player (<player list>) lookup room (<room list>) lookup direction (<direction list>) parse object (<parameter>) parse player (<parameter>) parse room (<parameter>) experience (<player name>,<privilege list>) userid (<player list>) mheal (<monster name>,<heal amount: nr>) mattack (<monster name>,<attck amont>: nr>) list (<item list 1>,...,<item list n>) spell level () set spell level (level number) LABEL <label> (<action 1>,...,<action n>) GOSUB <label> (<param 1>,...,<param n>) DEFINE <variable> (<action>) SET <variable> (<value>) SUBMIT <label> (<delta time>,<player's name>) FOR <variable> (<list>,<action>)
When player do something corresponding labels of monsters and hooks are executed. Default variables in all cases: player name Player's personal name monster name Monster's name (when hook, value of this variable is "") (as the control function changes the controlled monster, the value of this variable is also changed)
Additional information available:
Monster | Room | Object | Spell | Global_Code |
Labels and default variables for Monster: enter - entering room, start game or poof to room leave target leaving room, quit game or poof from room say speech say something attack - attacking the monster look - look something in room look you - look the monster command command for Command Extension System
Labels and default variables for hook of rooms: start - start game enter - entering room escaped - leaving room or poof from room activated when player is really leave room leave target leaving room poof in - poof to room poof out target poof from room say speech say something look detail detail look detail in room look around - look around in room command command for Command Extension System wrong dir direction when user gives go <unmatched direction>
Labels and default variables for hook of objects: get fail - failing to get object get succeed - getting object drop succeed - dropping object ( by drop -command ) drop you - dropping object ( other reason ) use succeed - using object look you - look object command command for Command Extension System start - start game enter - entering room leave target leaving room
Labels and default variables for spell's code: summon - the victim executes this when summoner attacks him learn book name when a player reads a spell book (that code must use to set spell level for this). Spell codes have the default variables "spell name" and "summoner name."
Labels and default variables for global code: start - start games quit - quit games
When a user types an invalid command, the following will happen: 1) form of command is: <something> to hook of room, run label command the value of variable command is <something> 2) form of command is: <something> <object name> to hook of object, run label command the value of variable command is <something> 3) form of command is: <something> <monster name> to monster's code run label command the value of variable command is <something>
Tämä dokumentaatio ei ole ajan tasalla. Tiedostossa COMMANDS.PAPER on (toivottavasti) ajan tasalla oleva dokumentaatio.
Additional information available:
Funktio: + (p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa arvonnaan p1:n ja p2:n arvot yhdistettynä yhdeksi merkkijonoksi siten, että niiden välillä on yksi välilyönti. Virhetilanteet: - yhdistetty merkkijono pitempi kuin 1000 merkkiä > Tulos: Parametrin p1 arvo Tulkinta: p1 - merkkijono p2 - merkkijono tulos - merkkijono
Funktio: =(p1, p2) Funktio: ==(p1,p2) Funktio: ===(p1,p2) Laskee parametrien p1 ja p2 arvon. Funktiot =, == ja === palauttavat ensimmäisen parametrin arvon, kun parametrit ovat samat, muutoin tyhjän. Funktioiden tulkinta, siintä mitkä merkkijonot ovat samoja vaihtelee: = -funktion on tiukin ja === -funktion tulkinta on löysin. = vaatii täsmällisen vastaavuuden, jossa välilyönnit huomioidaan. == ei huomioi lo- pussa olevia välilyöntejä. === tiivistää ennen vertailua välilyön- nit ja muuttaa isot kirjiamet pieniksi. Tulkinta: p1 - merkkijono p2 - merkkijono tulos - merkkijono (totuusarvo?) Huomautus: - Aiempi = -funktio on nyt nimellä ==. Siis = toimii nyt eri- lailla kuin aiemmin. Tosin se nyt toimii niin kuin se oli aiemmin dokumentoitu.
Funktio: inv () Palauttaa arvonaan monsterin mukana olevien esineiden lista. Virhetilanteet: - Suorituksessa oleva koodi ei ohjaa monsteria > Tulos: Tyhjä merkkijono Tulkinta: tulos - lista
Funktio: pinv () Palauttaa arvonaan (toiminnan laukaisseen) pelaajan mukana olevien esineiden listan. Tulkinta: tulos - lista
Funktio: players () Palauttaa arvonaan niiden pelaajien listan, jotka ovat samas- sa huoneessa kuin monster. Virhetilanteet: - Suorituksessa oleva koodi ei ohjaa monsteria > Tulos: niiden pelaajien lista, jotka ovat samassa huone- essa kuin (toiminnan laukaissut) pelaaja. Tulkinta: tulos - lista
Funktio: objects () Palauttaa arvonaan niiden esineden listan, jotka ovat samassa huoneessa kuin monster. Virhetilanteet: - Suorituksessa oleva koodi ei ohjaa monsteria > Tulos: Niiden esineiden lista, jota ovat samassa huone- essa kuin (toiminnan laukaissut) pelaaja. Tulkinta: tulos - lista
Funktio: get (p1) Laskee parametrin p1 arvon. Ottaa maasta monsterin mukaan p1:n ilmoittamat esineet. Palauttaa arvonaan niiden esineiden lista, jotka todella saa- tiin otettua. Virhetilanteet: - Suorituksessa oleva koodi ei ohjaa monsteria > Ei toimintaa, tulos: Tyhjä merkkijono/lista Tulkinta: p1 - lista tulos - lista
Funktio: drop (p1) Laskee parametrin p1 arvon. Pudottaa maahan monsterilta p1:n ilmoittamat esineet. Palauttaa arvonaan listan niistä esineistä, jotka todella saatiin pudotettua. Virhetilanteet: - Suorituksessa oleva koodi ei ohjaa monsteria > Ei toimintaa, tulos: Tyhj{ merkkijono/lista Tulkinta: p1 - lista tulos - lista
Funktio: and (p1,p2,...,pn) Laskee parametrien p1 arvon. Palauttaa listan, jossa on ne alkiot, jotka ovat sekä p1:ssä että p2:ssa. Jokainen alkio esiintyy tuloksessa vain kerran. Tulkinta: p1 - lista p2 - lista ... pn - lista tulos - lista Huomautus: Parametreja pitää vähintään olla kaksi.
Funktio: and then (p1,p2,...,pn) Laskee parametrien arvoja kunnes jonkun parametrin arvo on tyhjä merkkijono (tai kaikki parametrit tuli lasketuksi). Palauttaa viimeisen lasketun paramatrin arvon. Tulkinta: pN - totuusarvo / merkkijono tulos - totuusarvo / merkkijono
Funktio: or else (p1,p2,...,pn) Laskee parametrien arvoja kunnes joku parametri palauttaa ei-tyhjän merkkijonon (tai kunnes kaikki paramatrit tuli lasketuksi). Palauttaa viimeisen lasketun paramaterin arvon. Tulkinta: pN - totuusarvo / merkkijono tulos - totuusarvo / merkkijono
Funktio: get global flag (p1) Laskee parametrin p1 arvon. Palauttaa argumentin p1 luettelemista globaaleista lipuista ne, jotka ovat epätosia. Globaalit liput ovat: "Active", "Valid" ja "Wartime". Virhetilanteet: - p1:n listassa oleva alkio ei ole globaali lippu => kyseinen alkio tulkitaan globaaliksi lipuksi, joka on epätosi Tulkinta: p1 - lista tulos - lista Huomautus: - Funktion toiminta on muuttunut. Aiemmein funktio palautti jokaista globaalia lippua kohti, joka oli tosi, yhden "TRUE" -arvon listassa.
Funktio: boolean and(p1,...,pn) Laskee parametrien arvon. Palautaa "TRUE", jos kaikkien pametrien arvo oli ei tyhjä, muutoin palauttaa "". Tulkinta: p1 - totuusarvo . . . pn - totuusarvo tulos - totuusarvo
Funktio: boolean or(p1,...,pn) Laskee parametrien arvon. Palautaa "TRUE", jos vähintään yhden parametrien arvo oli ei tyhjä, muutoin palauttaa "". Tulkinta: p1 - totuusarvo . . . pn - totuusarvo tulos - totuusarvo
Funktio: move (p1) Laskee parametrin p1 arvon. Siirtää monsterin p1:n ilmoittamaan huoneeseen. Palauttaa huoneen nimen, jonne siirsi monsterin. Vaatimukset: - Jos kohde huone ei ole julkinen eikä monsterin omistajan omistuksessa, niin monsterilla pitää olla poof -privile- gio. Virhetilanteet: - Kohde ei ole huone > Tulos: tyhj{ nimi/merkkijono - Siirto ei onnistu jostain syystä (esim. poof privilegio- ta olisi tarvittu) > Tulos: tyhjä nimi/merkkijono - Suoritettava koodi ei ohjaa monsteria > Tulos: tyhjä nimi/merkkijono Tulkinta: p1 - nimi tulos - nimi
Funktio: pmove (p1) Laskee parametrin p1 arvon. Siirtää (toiminnan laukaisseen) pelaajan p1:n ilmoittamaan huoneeseen. Palauttaa huoneen nimen, jonne siirsi pelaajan. Vaatimukset: - Jos kohde huone ei ole julkinen eikä monsterin omistajan omistuksessa, niin monsterilla pitää olla poof -privilegio. - Koodi pitää olla privileged moodissa. Virhetilanteet: - Kohde ei ole huone > Tulos: tyhjä nimi/merkkijono - Siirto ei onnistu jostain syystä (esim. poof privilegio- ta olisi tarvittu) > Tulos: tyhjä nimi/merkkijono - Suoritettava koodi ei ohjaa monsteria ja poof privile- giota olisi tarvittu > Tulos: tyhjä nimi/merkkijono - Koodi ei ole privileged-moodissa > Tulos: tyhjä nimi/merkkijono Tulkinta: p1 - nimi tulos - nimi
Funktio: if (p1,p2,p3) Laskee parametrin p1 arvon. Laskee parametrin p2 arvon, jos p1 ei ollut tyhjä, muutoin laskee parametrin p3 arvon. Palauttaa p2 tai p3, riippuen siitä kumman arvon laski. Tulkinta: p1 - merkkijono p2 - merkkijono p3 - merkkijono tulos - merkkijono Huomautus: - Puuttuvat parametrit tulkitaan tyhjiksi (tämä koskee myös muita funktiota). - Koodin ei siis tarvitse ohjata monsteria, jos poof privilegiota ei tarvita.
Funktio: where (p1) Laskee parametrin p1 arvon. Palauttaa huoneen, jossa pelaaja p1 on. Virhetilanteet: - p1 ei ole pelajan nimi > tulos: tyhjä nimi/merkkijono - Pelaaja p1 ei pelaa funktion kutsuhetkellä > tulos: huone, johon pelaaja lopetti pelaamisen Tulkinta: p1 - nimi tulos - nimi
Funktio: null (p1,p2,p3,...) Laskee parametrien p1, p2 ja p3 arvon. Palautaa tyhjän merkkijonon. Tulkinta: p1 - merkkijono p2 - merkkijono p3 - merkkijono Huomautus: - Sopii peräkkäisen toiminnan toteuttamiseen.
Funktio: prog (p1, p2, p3, ...) Palauttaa viimeisen parameterin arvon. Tulkinta: p1 - merkkijono p2 - merkkijono . . . Huomautus: - Sopii peräkkäisen toiminnan toteuttamiseen.
Funktio: not (p1) Laskee parametrin p1 arvon. Palauttaa "TRUE", jos p1 on "", muutoiin palauttaa "". Tulkinta: p1 - merkkijono tulos - merkkijono (?) / totuusarvo
Funktio: random (p1) Laskee parametrin p1 arvon. Palauttaa yhden satunnaisesti valitun alkion p1:n listasta. Virhetilanteet: - p1 on tyhjä > Tulos: tyhjä nimi/merkkijono Tulkinta: p1 - lista tulos - nimi
Funktio: strip (p1) Laskee parametrin p1 arvon. Palauttaa p1:n muutettuna isot kirjaimet muutettuina pieniksi kirjaimiksi, numerot sellaisinaan ja muut merkit korvattuna välilyönnillä.Monsterin merkkitau- lukko määrää mitkä merkit ovat kirjaimia - katso kohta CHARTABLE alustustiedostossa MONSTER.INIT. Tulkinta: p1 - merkkijono tulos - merkkijono Huomatus: - Useiden välilyöntien sarja (kuten kaikissa muissakin funktiossa) korvaatuu yhdellä välilynillä. - Funktio on käyttökelpoinen poistettaessa välimerkke- jä pelaajan puheesta. - Merkit joiden tyyppi on "none" merkkitaulukossa pois- tetaan kokonaan (ei korvata välilyönnillä).
Funktio: experience (p1) Laskee parametrin p1 arvon. Palauttaa pelaajan p1 pisteet. Virhetilanteet: - p1 ei ole pelaajan nimi > Tulos: Tyhjä merkkijono Tulkinta: p1 - nimi tulos - luku
Funktio: set experience (p1) Laskee parametrin p1 arvon. Asettaa (toiminnnan laukaisseen) pelaajan kokemukseksi p1:n. Palauttaa p1:n. Vaatimukset: - Monserilla pitää olla experience -privilegio. - Pelaaja ei voi olla monsterin omistaja tai se, joka on ladannut koodin. Virhetilanteet: - Koodi ei ohjaa monsteria > Ei toimintaa, tulos: tyhjä merkkijono - Monsterilla ei experience privilegiota > Ei toimintaa, tulos: tyhjä merkkijono - (Toiminnan laukaissut) pelaaja on monsterin omistaja tai koodin lataaja. > Ei toimintaa, tulos: tyhjä merkkijono Tulkinta: p1 - luku tulos - luku Huomautus: - Funktiolla ei voi muuttaa omaa kokemusta.
Funktio: plus (p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa lukujen p1 ja p2 summan. Virhetilanteet: - p1 tai p2 ei ole luku > Tulos: tyhjä merkkijono - Lukualueen ylivuoto > Tulos: tyhjä merkkijono Tulkinta: p1 - luku p2 - luku tulos - luku
Funktio: difference(p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa erotuksen p1 miinus p2. Virhetilanteet: - p1 tai p2 ei ole luku > Tulos: Tyhjä merkkijono - Lukualueen ylivuoto > Tulos: Tyhjä merkkijono Tulkinta: p1 - luku p2 - luku tulos - luku
Funktio: times(p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa parametrien p1 ja p2 tulon. Virhetilanteet: - Lukualueen ylivuoto > Tulos: Tyhjä merkkijono - p1 tai p2 eiv{t ole lukuja > Tulos: Tyhjä merkkijono Tulkinta: p1 - luku p2 - luku tulos - luku
Funktio: quotient(p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa p1 jaettuna p2:lla (kokonaislukujako). Virhetilanteet; - p1 tai p2 ei ole luku > Tulos: Tyhjä merkkijono - p2 on nolla > Tulos: Tyhjä merkkijono Tulkinta: p1 - luku p2 - luku tulos - luku
Funktio: set state(p1) Laskee parametrin p1 arvon. Sijoittaa p1 koodikohtaiseen pysyv{{n muuttujaan. Palauttaa p1:n. Tulkinta: p1 - merkkijono tulos - merkkijono Huomatus: - Muuttuja on koodikohtainen eli jokaisella monsterilla, ja huoneen ja esineen hookilla on oma muuttuja. - control -funktio ei vaikuta siihen, ett{ mihin muuttu- jaan set state vaikuttaa.
Funktio: get state(p1) Lukee koodikohtaisen pysyvän muuttujan arvon. Palauttaa muuttujan arvon. Tulkinta: tulos - merkkijono Huomatus: - Muuttuja on koodikohtainen eli jokaisella monsterilla, ja huoneen ja esineen hookilla on oma muuttuja. Saman esineen eri ilmentymillä on sama koodi, joten muuttu- jakin on yhteinen. - control -funktio ei vaikuta siihen, että mistä muuttu- jasta get state lukee arvon.
Funktio: less(p1,p2) Laskee parametrien p1 ja p2 arvon. Jos p1 on pienempi kuin p2 palauttaa "TRUE", muutoin tyhjän merkkijonon. Virhetilanteet: - p1 tai p2 ei ole luku > Tulos: Tyhjä merkkijono Tulkinta: p1 - luku p2 - luku tulos - merkkijono, totuusarvo (?)
Funktio: number(p1) Laskee parametrin p1 arvon. Palauttaa p1, jos p1 on luku, muutoin palauttaa tyhjän merkki- jonon. Tulkinta: p1 - luku (?) tulos - luku (?)
Funktio: health(p1) Laskee parametrin p1 arvon. Palauttaa pelaajan tai monsterin p1 voiman lukuarvon. Virhetilanteet: - p1 ei ole palaajan tai monsterin nimi > Tulos: Tyhjä merkkijono Tulkinta: p1 - nimi tulos - luku
Funktio: all objects() Funktio palauttaa listan kaikkista esineist{. Virhetilanteet: - Esineitä on enemmän kuin mahtuu 1000 merkin listaan > Tulos: Niin monen ensimm{isen esineen lista, jotka mah- tuivat 1000 merkkiin. Tulkinta: - tulos: lista Huomautus: - Jokainen määritelty esine esiintyy listassa kerran riip- pumatta siitä kuinka monta kappaletta sitä on olemassa (vaikka sitä olisi olemassa 0 kappaletta).
Funktio: all players() Funktio palauttaa listan kaikkista pelaajista ja hirviäistä. Virhetilanteet: - Pelaajia on enemmän kuin mahtuu 1000 merkin listaan > Tulos: Niin monen ensimmäisen pelaajan lista, jotka mahtuivat 1000 merkkiin. Tulkinta: - tulos: lista
Funktio: all rooms() Funktio palauttaa listan kaikkista huoneista. Virhetilanteet: - Huoneita on enemmän kuin mahtuu 1000 merkin listaan > Tulos: Niin monen ensimm{isen huoneen lista, jotka mah- tuivat 1000 merkkiin. Tulkinta: - tulos: lista
Funktio: control(p1,p2) Funktio laskee parametrin p1 arvon. Funktio asettaa parametrin p2 laskemisen ajaksi ohjattavaksi monsteriksi p1:n. Suoritettavalla koodilla ja monsterilla pitää olla sama omistaja. Palauttaa p2:n. Virhetilanteet: - p1 ei ole monsterin nimi > Funktio ei laske paramerin p2 arvoa - Tulos: Tyhjä merk- kijono - Suoritettavalla koodilla ja p1 määräämmällä monsterilla ei ole sama omistaja > Funktio ei laske parametrin p2 arvoa - Tulos: Tyhjä merk- kijono Tulkinta: p1 - nimi p2 - merkkijono tulos - merkkijono Huomautus: - Vaadittavat privilegiot katsotaan ohjattavalta monseril- ta, joten funktio vaikuttaa niihin - Funktio ei vaikuta privileged -moodiin - p2:n suorituksen ajaksi funktio sijoittaa muuttujaan monster name ohjattavan monserin nimen eli p1:n
Funktio: include(p1,p2) Funktio laskee parametrien p1 ja p2 arvon. Palauttaa p2:n, jos p1 sisältää p2:n, muutoin tyhj{n merkki- jonon. Virhetilanteet: - p2 on tyhjä merkkijono > Tulos: Tyhjä merkkijono - p1 on tyhj{ merkkijono > Tulos: tyhjä merkkijono Tulkinta: p1 - merkkijono p2 - merkkijono tulos - merkkijono Huomautus: - Nuo 'virhetilanteet' sopivat kyllä funktion normaalikäy- töksen puitteisiin eli kyseessä ei ole todellisia virhe- tilanteita - mutta tilanteet ovat sen verran erikoisia, että ne oli syytä mainita erikseen.
Funktio: exclude (p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa arvonaan ne alkiot listasta p1, joita ei ole listas- sa p2. Tulkinta: p1 - lista p2 - lista tulos - lista
Funktio: get remote state (p1) Laskee parametrin p1 arvon. Palauttaa arvonaan p1 ilmoittaman monsterin pysyvän muuttujan arvon (eli state kentän arvon). Monsterilla pitää olla sama omistaja kuin suoritettavalla koodilla tai monsteri pitää olla julkinen ja koodin ohjaamalla monsterilla pitää olla object -privilegio. Virhetilanteet: - p1 ei ole monsterin nimi > Tulos: Tyhjä merkkijono - p1:llä on eri omistaja kuin suoritettavalla koodilla > Tulos: Tyhjä merkkijono - p1 on julkinen ja koodi ei ohjaa monsteria > Tulos: Tyhjä merkkijono - p1 on julkinen ja koodin ohjaamalla monsterilla ei ole object -privilegiota > Tulos: Tyhjä merkkijono Tulkinta: p1 - nimi tulos - merkkijono
Funktio: set remote state (p1,p2) Laskee parametrien p1 ja p2 arvon. Sijoittaa p1 ilmoittaman monsterin pysyvän muuttujaan p2:n arvon (eli state kentään). Monsterilla pitää olla sama omista- ja kuin suoritettavalla koodilla tai monsteri pitää olla jul- kinen ja koodin ohjaamalla monsterilla pitää olla object -pri- vilegio. Palauttaa p2:n arvon. Virhetilanteet: - p1 ei ole monsterin nimi > Ei toimintaa - tulos: Tyhjä merkkijono - p1:llä on eri omistaja kuin suoritettavalla koodilla > Ei toimintaa - tulos: Tyhjä merkkijono - p1 on julkinen ja koodi ei ohjaa monsteria > Ei toimintaa - tulos: Tyhjä merkkijono - p1 on julkinen ja koodin ohjaamalla monsterilla ei ole object -privilegiota > Ei toimintaa - tulos: Tyhjä merkkijono Tulkinta: p1 - nimi p2 - merkkijono tulos - merkkijono
Funktio: remote objects (p1) Laskee parametrin p1 arvon. Palauttaa huoneessa p1 (maassa) olevien esineiden nimet. Virhetilanteet: - p1 ei ole huoneen nimi > Tulos: Tyhj{ merkkijono Tulkinta: p1 - nimi tulos - lista
Funktio: remote players (p1) Laskee parametrin p1 arvon. Palauttaa huoneessa p1 olevien pelaajien nimet. Virhetilanteet: - p1 ei ole huoneen nimi > Tulos: Tyhjä merkkijono Tulkinta: p1 - nimi tulos - lista Huomautus: - Pelaajien listaan ei sis{lly monstereita toisin kuin all players(), lookup player() ja parse player() funktioiden kohdalla - Funktio toimii vastaavasti kuin players() funktio - pait- si, että huone valitaan parametrin avulla
Funktio: heal (p1) Laskee parametrin p1 arvon. Nostaa toiminnan laukaiseen pelaajan terveyttä (voimia) para- metrin ilmoittmalla määrällä. Palauttaa p1:n. Virhetilanteet: - p1 ei ole luku > Ei toimintaa - tulos: Tyhjä merkkijono - p1 on negatiivinen > Ei toimintaa - tulos: Tyhjä merkkijono Tulkinta: ˙ p1 - luku tulos - luku Huomautus: - Mikäli (toiminnan laukaisseen) pelaajan nykyisen ter- veyden ja lisäyksen summa on suurempi kuin pelaajan tason maksimiterveys, funktio asettaa pelaajalle tämän tason maksimiterveyden - tämä ei kuitenkaan vaikuta funktion palauttamaan arvoon.
Funktio: duplicate (p1) Laskee parametrin p1 arvon. Tekee niistä esineistä, jotka on mainittu listassa p1 monste- rin mukaan uuden kappaleen. Esineillä ja monsterilla pitää ol- la sama omistaja tai monsterilla pitää olla object -privilegio. Palauttaa listan niistä esineistä, jotka todella sai tehtyä. Virhetilanteet: - Koodi ei ohjaa monsteria > Ei toimintaa: tulos: Tyhjä merkkijono - Esineellä ei ole sama omistaja kuin monsterilla ja monsterilla ei ole object -privilegiota > Esinettä ei tule palautettavaan listaan eikä mons- terin mukaan. - Esine ei mahdu mukaan > Esinettä ei tule palautettavaan listaan eikä mons- terin mukaan. Tulkinta: p1 - lista tulos - lista
Funktio: pprint (p1,p2,p3,...) Funktio: pprint raw (p1,p2,p3,...) Laskee parametrin p1,p2 ja p3 arvon. Tulostaa (toiminnan laukaiseelle) pelaajalle parametrien teks- tin. Edellisen parametrin perään funktio lisää välilyönnin, jos seuraava alkaa kirjaimella tai numerolla. Tekstin perään funktio lisää pisteen, jos se loppuu kirjaimeen tai numeroon. Funktio aloittaa virkeen isolla kirjaimella. raw -versio ei muokkaa tekstiä. Palauttaa tulostamansa tekstin. Virhetilanteet: - Teksti on pitempi kuin 1000 merkkiä > Osa tekstistä jää pois (sekä tuloksesta, että tulosteesta). Tulkinta: p1 - merkkijono p2 - merkkijono p3 - merkkijono tulos - merkkijono Huomautus: - Rivijakoon ei ole mahdollista vaikuttaa. Funktio päättää rivijaon itse.
Funktio: print (p1,p2,p3,...) Funktio: print raw (p1,p2,p3,...) Laskee parametrin p1,p2 ja p3 arvon. Tulostaa monsterin kanssa samassa huoneessa oleville pelaa- jille parametrin tekstin. Edellisen parametrin perään funktio lisää välilyönnin, jos seuraava alkaa kirjaimella tai numerol- la. Tekstin perään funktio lisää pisteen, jos se loppuu kir- jaimeen tai numeroon. Funktio aloittaa virkkeen isolla kirjai- mella. raw -versio ei muokkaa tekstiä. Palauttaa tulostamansa tekstin. Virhetilanteet: - Suoritettava koodi ei ohjaa monsteria > Tulostaa toiminnan laukaisseen pelaajan kanssa samas- sa huoneessa oleville pelaajille parametrien tekstin, tulos: parametrien teksti - Teksti on pitempi kuin 1000 merkkiä > Osa tekstistä jää pois (sekä tuloksesta, että tulostees- ta). Tulkinta: p1 - merkkijono p2 - merkkijono p3 - merkkijono tulos - merkkijono Huomautus: - Jos (toiminan laukaissut) pelaaja on siis samassa huo- neessa kuin monster, niin teksti tulostuu myös hänelle. - Erittäin monirivisillä viesteillä on mahdollista yli kuormittaa Monsterin tapahtumienvälitysjärjestelmä (jo- kainen rivi on yksi tapahtuma), jolloin osaa tapahtumis- ta on mahdollista hukkua. - Rivijakoon ei ole mahdollista vaikuttaa. Funktio päättää rivijaon itse.
Funktio: oprint (p1,p2,p3,...) Funktio: oprint raw (p1,p2,p3,...) Laskee parametrin p1,p2 ja p3 arvon. Tulostaa monsterin kanssa samassa huoneessa oleville pelaajil- le parametrien tekstin, paitsi toiminnan laukaiseelle pelaajal- le. Edellisen parametrin perään funktio lisää välilyönnin, jos seuraava alkaa kirjaimella tai numerolla. Tekstin perään funk- tio lisää pisteen, jos se loppuu kirjaimeen tai numeroon. Funk- tio aloittaa virkkeen isolla kirjaimella. raw -versio ei muok- kaa tekstiä. Palauttaa tulostamansa tekstin. Virhetilanteet: - Suoritettava koodi ei ohjaa monsteria > Tulostaa toiminnan laukaisseen pelaajan kanssa samas- sa huoneessa oleville pelaajille parametrien tekstin (paitsi toiminnan laukaiseelle pelaajalle), tulos: tulostettava teksti - Teksti on pitempi kuin 1000 merkkiä > Osa tekstistä jää pois (sekä tuloksesta, että tulos- teesta). Tulkinta: p1 - merkkijono p2 - merkkijono p3 - merkkijono tulos - merkkijono Huomautus: - Erittäin monirivisillä viesteillä on mahdollista yli- kuormittaa Monsterin tapahtumienvälitysjärjestys (jo- kainen rivi on yksi tapahtuma), jolloin osan tapahtu- mista on mahdollista hukkua. - Rivijakoon ei ole mahdollista vaikuttaa. Funktio päät- tää rivijaon itse.
Funktio: pget (p1) Laskee parametrin p1 arvon. Ottaa maasta (toiminnan laukaisseen) pelaajan mukaan p1:n il- moittamat esineet. Palauttaa arvonaan listan niistä esineistä, jotka todella saa- tiin otettua. Vaatimukset: - koodi pitää olla privileged-moodissa Virhetilanteet: - koodi ei ole privileged moodissa > Ei toimintaa, funktio ei laske parametrin p1 arvoa, tulos: Tyhjä merkkijono/lista Tulkinta: p1 - lista tulos - lista
Funktio: pdrop (p1) Laskee parametrin p1 arvon. Pudottaa (toiminnan laukaisseen) pelaajalta maahan p1:n il- moittamat esineet. Palauttaa arvonaan lista esineistä, jotka todella saatiin pu- dotettua. Vaatimukset: - koodi pitää olla privileged-moodissa Virhetilanteet: - koodi ei ole privileged moodissa > Ei toimintaa. Funktio ei laske parametrin p1 arvoa - tulos: Tyhjä merkkijono/lista Tulkinta: p1 - lista tulos - lista Huomautus: Ilmoittaa (toiminnan laukaisseelle) pelaajalle ja muille pelaajille, jos esineen pudottaminen aiheutti esineen riisumisen (vertaa: wear ja wield komennot.)
Funktio: pduplicate (p1) Laskee parametrin p1 arvon. Tekee niistä esineistä, jotka on mainittu listassa p1 pelaajan mukaan uuden kappaleen. Esineillä ja koodilla pitää olla sama omistaja tai monsterilla pitää olla object -privilegio. Palauttaa listan niistä esineistä, jotka todella sai tehtyä. Vaatimukset: - koodi pitää olla privileged -moodissa. Virhetilanteet: - Koodi ei ole privileged tilassa > Ei toimintaa. Funktio ei laske parametrin p1 arvoa, tulos: Tyhjä merkkijono - Esineellä ei ole sama omistaja kuin koodilla ja koodi ei ohjaa monsteria > Esinettä ei tule palautettavaan listaan eikä pelaa- jan mukaan. - Esineellä ei ole sama omistaja kuin koodilla ja mons- terilla ei ole object -privilegiota. > Esinettä ei tule palautettavaan listaan eikä pelaa- jan mukaan. - Esine ei mahdu mukaan > Esinettä ei tule palautettavaan listaan eikä pelaajan mukaan. Tulkinta: p1 - lista tulos - lista
Funktio: destroy (p1) Laskee parametrin p1 arvon. Tuhoaa monsterilta ne esineet jotka on mainittu listassa p1. Esineillä ja monsterilla pitää olla sama omistaja tai monste- rilla pitää olla object -privilegio. Palauttaa listan niistä esineistä, jotka todella sai tuhottua. Virhetilanteet: - Koodi ei ohjaa monsteria > Ei toimintaa: tulos: Tyhjä merkkijono - Esineellä ei ole sama omistaja kuin monsterilla ja monsterilla ei ole object -privilegiota > Esinettä ei tule palautettavaan listaan eikä esine tuhoudu. Tulkinta: p1 - lista tulos - lista
Funktio: pdestroy (p1) Laskee parametrin p1 arvon. Tuhoaa pelaajalta ne esineet jotka on mainittu listassa p1. Esineillä ja monsterilla pitää olla sama omistaja tai monste- rilla pitää olla object -privilegio. Palauttaa listan niistä esineistä, jotka todella sai tuhottua. Vaatimukset: - koodi pitää olla privileged -moodissa. Virhetilanteet: - Koodi ei ole privileged tilassa > Ei toimintaa. Funktio ei laske parametrin p1 arvoa, tulos: Tyhjä merkkijono - Esineellä ei ole sama omistaja kuin koodilla ja koodi ei ohjaa monsteria > Esinettä ei tule palautettavaan listaan eikä esine tuhoudu. - Esineellä ei ole sama omistaja kuin koodilla ja mons- terilla ei ole object -privilegiota. > Esinettä ei tule palautettavaan listaan eikä esine tuhoudu. Tulkinta: p1 - lista tulos - lista
Funktio: or (p1,p2,p3,...) Laskee parametrien p1,p2,p3,... arvon. Palauttaa listan, jossa on ne alkiot, jotka ovat p1:ssä, p2:ssa tai p3:ssa (jne). Jokainen alkio esiintyy tuloksessa vain kerran. Virhetilanteet: - Tuloksena syntyvä lista on pitempi kuin 1000 merkkiä > Tulos: lista, jossa on vain niin monta alkiota, että ne mahtuvat 1000 merkkiin. Tulkinta: p1 - lista ... p<n> - lista ˙ tulos - lista
Funktio: string head (p1) Laskee parametrin p1 arvon. Palauttaa merkkijonosta p1 ensimmäisen sanan (merkkijonon ekaan välilyöntiin saakka). Virhetilanteet: - p1 on tyhjä merkkijono > Tulos: Tyhjä merkkijono Tulkinta: p1 - merkkijono tulos - merkkijono
Funktio: string tail (p1) Laskee parametrin p1 arvon. Palauttaa merkkijonon p1 ensimmäistä sanaa lukuunottamatta (merkkijonon ekasta välilyännistä alkaen). Virhetilanteet: - p1 on tyhjä merkkijono > Tulos: Tyhjä merkkijono - p1:ssä vain yksi sana > Tulos: Tyhjä merkkijono Tulkinta: p1 - merkkijono tulos - merkkijono
Funktio: tail (p1) Laskee parametrin p1 arvon. Palauttaa listan p1 ensimmäistä alkiota lukuunottamatta. Virhetilanteet: - p1 on tyhjä lista > Tulos: Tyhjä lista/merkkijono - p1:ssä vain yksi alkio > Tulos: Tyhjä lista/merkkijono Tulkinta: p1 - lista tulos - lista
Funktio: head (p1) Laskee parametrin p1 arvon. Palauttaa listan p1 ensimmäisen alkion. Virhetilanteet: - p1 on tyhjä lista > Tulos: Tyhjä merkkijono Tulkinta: p1 - lista tulos - alkio
Funktio: lookup room (p1) Laskee parametrin p1 arvon. Täydentää listan p1 alkiot huoneiden nimiksi. Jos jonkin alki- on täydennys ei onnistu, kyseinen alkio jää pois tuloslistasta. Tulkinta: p1 - lista tulos - lista
Funktio: lookup player (p1) Laskee parametrin p1 arvon. Täydentää listan p1 alkiot pelaajien ja monsterien nimiksi. Jos jonkin alkion täydennys ei onnistu, kyseinen alkio jää pois tuloslistasta. Tulkinta: p1 - lista tulos - lista
Funktio: lookup object (p1) Laskee parametrin p1 arvon. Täydentää listan p1 alkiot esineiden nimiksi. Jos jonkin alki- on täydennys ei onnistu, kyseinen alkio jää pois tuloslistasta. Tulkinta: p1 - lista tulos - lista
Funktio: parse player (p1) Laskee parametrin p1 arvon. Funktio tarjoaa samanlaisen parametrin tulkintapalvelun kuin on käytössä monsterin komennoissa, joissa voi käyttää jokeri- merkkiä. Palauttaa parametria p1 vastaavan pelaaja ja monster -listan. Virhetilanteet: - p1 on tyhjä merkkijono > Tulos: Tyhjä merkkijono - parametrin tulkinnassa tapahtuu virhe > Tulos: Tyhjä merkkijono Tulkinta: p1 - merkkijono tulos - lista
Funktio: parse object (p1) Laskee parametrin p1 arvon. Funktio tarjoaa samanlaisen parametrin tulkintapalvelun kuin on käytössä monsterin komennoissa, joissa voi käyttää jokeri- merkkiä. Palauttaa parametria p1 vastaavan esinelistan. Virhetilanteet: - p1 on tyhjä merkkijono > Tulos: Tyhjä merkkijono - parametrin tulkinnassa tapahtuu virhe > Tulos: Tyhjä merkkijono Tulkinta: p1 - merkkijono tulos - lista
Funktio: parse room (p1) Laskee parametrin p1 arvon. Funktio tarjoaa samanlaisen parametrin tulkintapalvelun kuin on käytössä monsterin komennoissa, joissa voi k{yttää jokeri- merkkiä. Palauttaa parametria p1 vastaavan huonelistan. Virhetilanteet: - p1 on tyhjä merkkijono > Tulos: Tyhjä merkkijono - parametrin tulkinnassa tapahtuu virhe > Tulos: Tyhjä merkkijono Tulkinta: p1 - merkkijono tulos - lista
Funktio: privilege (p1,p2) Laskee parametrien p1 ja p2 arvon. Palauttaa listan niistä pelaajan (taikka monsterin) p1 pri- vilegeista, jotka ovat mainittu listassa p2. Mahdolliset pri- vileget: wizard, manager, experience, quota, object, poof, special ja monster. wizard -privilege tarkoittaa, ett{ pelaaja on Monster Manager. Virhetilanteet: - p1 ei ole pelaajan tai monsterin nimi > Tulos: Tyhjä merkkijono/lista - p2:ssa on mainittu privilege, jota ei ole olemassa > Tulos: Kyseinen privilege ei tule tulokseen mukaan Tulkinta: p1 - nimi p2 - lista tulos - lista
Funktio: userid (p1) Funktio laskee parametrin p1 arvon. Funktio vaatii toimiakseen, että ohjattavalla monsterilla on experience -privilegio. Palauttaa listan, jossa p1:n pelaajien nimet on vaihdettu vas- taaviksi käyttäjätunnuksiksi. Virhetilanteet: - koodi ei ohjaa monsteri taikka ohjattavalla monsteril- la ei ole experience -privilegiota > Funktio ei laske parametrin p1 arvoa, Tulos: Tyhjä merkkijono - Listassa p1 on nimi, joka ei ole pelaajan taikka mons- terin nimi > Ei tule mukaan tulokseen - listssa on nimi, joka on monsterin nimi > Tulle mukaan tulokseen, userid -käyttää monsterien käyttäjätunnuksina ohjelman sisäistä esitysmuotoa (monster id), joka on yksik{sitteinen Tulkinta: p1 - lista tulos - lista
Funktio: attack (p1) Laskee parametrin p1 arvon. Vähentää (toiminnan laukaisseen) pelaajan voimina p1:n ilmoit- taman määrän, kuitenkaan ei enemm{n kuin monsterin kokemus an- taa myötä. Peräkkäisten hyökkäysten summa ei saa ylittää mons- terin kokemuksen määrääm{{ rajaa. Palauttaa millä voimalla hyökättiin. Vaatimukset: - Monsteri ei saa olla hyökännyt jo kokemuksen m{{r{{n rajan verran - Pelaaja ei saa olla suojattu. - Hookeilla vaatii privileged -moodin Virhetilanteet: - Monsteri on hyökännyt jo kokemuksen määräämän rajan verran > Ei toimintaa - Tulos: tyhjä merkkijono - pelaaja on suojattu > Ei toimintaa - Tulos: tyhjä merkkijono - p1 ei ole luku > Ei toimintaa - Tulos: tyhjä merkkijono - p1 on suurempi kuin kokemus antaa my|t{ > Hyökätään voimalla jonka kokemus antaa my|ten, Tulos: voima jolla hyökättiin - koodi ei ohjaa monsteria ja privileged -moodi päällä > ei rajaa hyökkäyksen voimakkuudella - koodi ei ohjaa monsteria ja ei privileged -moodia > Ei toimintaa - Tulos: tyhjä merkkijono Tulkinta: p1 - luku tulos - luku Huomautus: - Funktio ei kerro, kuinka hyvin hyökkäys todelisuudessa onnistui. (On mahdollista saada selville funktion health avulla.) - Funktio ei vaadi en{{n privileged moodia monsterilta
Funktio: spell level() Palauttaa taian käyttäjän kyseisen tain taitotason. Toimii vain suoritettaessa tain koodissa (labelit summon ja learn). Virhetilanteet: - Käytetään muualla kuin taissa > Tulos: Tyhjä (merkkijono) Tulkinta: tulos - luku Huomaa: - Taian käyttäjä (muutujassa summoner name) on eri kuin koodin suorittaja (poikkeus: learn -label)
Funktio: set spell level(p1) Laskee parametrin p1 arvon. Asettaa taian käyttäjän kyseisen tain taitotason. Toimii vain suoritettaessa tain koodissa (labelit summon ja learn). Taso 0 merkitsee, ett{ pelaaja ei osa taikaa, positiivinen luku merkit- see, ett{ pelaaja osaa taian. Palautaa asetetun taian tason. Virhetilanteet: - Käytetään muualla kuin taissa > Tulos: Tyhjä (merkkijono) - p1 ei luku > Tulos: Tyhjä (merkkijono) - p1 < 0 > Tulos: Tyhjä (merkkijono) Tulkinta: p1 - luku tulos - luku Huomaa: - Taian käyttäjä (muuttujassa summoner name) on eri kuin koodin suorittaja (poikkeus: learn -label) - Tämä funktio on tarkoitettu taian opettamiseen pelajalle (learn -labelissa) - Muuttujasta book name voi tarkistaa mikä kirja (magic book) on käynistänyt taian learn -labelin.
This documentation is not up-to-date. Especially, the number of function parameters is not restricted to three even if this document says so. The file COMMANDS.PAPER contains the up-to-date documentation. N.B: In this documentation, "result" means the return value.
Additional information available:
Function: + (p1,p2) Evaluates p1 and p2. Returns p1 " " p2 ( p1, a space, and p2 concatenated ). Errors: - the result string is over 1000 characters long => the result is p1 Interpretation: p1, p2, result: strings
Function: =(p1, p2) Function: ==(p1,p2) Function: ===(p1,p2) Evaluates parameters p1 and p2. Functions =, == ja === return p1 when the evaluated parameters are equal; otherwise an empty string is returned. The functions range from "=", which is the strictest, to "===", which is a general purpose predicate. Name Description ---------------------------------------------------------------- = Are two argument values exactly the same string ? == Are two argument values -- excluding spaces -- the same string ? === Are two argument values -- excluding spaces and the case -- the same string ? ---------------------------------------------------------------- Interpretation: p1, p2 : string result : string ( boolean ) N.B: - the previous function "=" is currently named "==".
Function: inv () Returns the list of items the monster is carrying. Errors: - The code is not monster code ( e.g. the code is for a room ) => the result is an empty string Interpretation: result : list
Function: pinv () Returns the list of items of the player who triggered the action. Interpretation: result : list
Function: players () Returns the list of those players currently in the same room with the monster. Errors: - The code is not monster code. => the result is the list of those players currently in the same room with the player who triggered the action Interpretation: result : list
Function: objects () Returns the list of the items currently in the same room with the monster. Errors: - the code is not monster code => the result is the list of those players currently in the same room with the player who triggered the action Interpretation: result : list
Function: get (p1) Evaluates p1. Tries to pick up the items found in the list p1. Returns the list of the items successfully picked up. Errors: - The code is not monster code => No actions, an empty string/list is returned Interpretation: p1 : list result : list
Function: drop (p1) Evaluates p1. Forces the monster drop the items found in the list p1. Returns the list of the items that were dropped. Errors: - The code is not monster code. => No action, an empty string is returned Interpretation: p1 : list result : list
Function: and (p1,p2,...) Evaluates p1, p2, ..., pn. Returns a list of the items found in both p1 and p2. Every item is included only once. Interpretation: pN, result : list N.B. There must be at least two parameters.
Function: move (p1) Evaluates p1. The value of p1 is the room the monster is moved. Returns the name of the room the monster was transferred. Requirements: - If the target room is not public or owned by the monster owner, the monster must have the "poof" privilege. Errors: - The target is not a room. or - Moving is unsuccessful ( e.g. the "poof" privilege would have been needed ) or - The code is not monster code. => result is an empty string/name Interpretation: p1, result : name
Function: pmove (p1) Evaluates p1. The player that triggered the action is moved to the room found in p1. Returns the name of the room the player was moved. Requirements: - If the target room is not public, or owned by the monster owner, the monster must have the "poof" privilege. - The code must be in the "privileged" mode. Errors: - The target is not a room. or - The moving is unsuccessful or - The code is not monster code and the "poof" privilege would have been needed. or - The code is not in the "privileged" mode. => the result is an empty string/name Interpretation: p1, result : name
Function: if (p1,p2,p3) Evaluates p1. Evaluates p2 if p1 was non-empty, otherwise evaluates p3. Returns either p2 or p3, depending on which one was evaluated. Interpretation: p1, p2, p3, result : string Requirements: - missing parameters are thought to be empty ( applicable to all the other functions ) - The code does NOT have to be a monster code, if the "poof" privilege is not needed.
Function: where (p1) Evaluates p1. Returns the name of the room the player p1 currently is. Errors: - p1 is not a player name. => the result is an empty string/name - Player p1 is currently not playing. => the result is the room where the player quitted. Interpretation: p1, result : name
Function: null (p1,p2,p3,...) Evaluates parameters p1, p2, p3, ... Returns an empty string. Interpretation: p1, p2, p3, ... : string N.B: - Ideal for a sequential action
Function: prog (p1, p2, p3, ...) Evaluates all parameters. Return the value of the last parameter. Interpretation: p1, p2, ... : string N.B: - Good for a sequential action
Function: not (p1) Evaluates p1. Returns "TRUE" if p1 is empty; otherwise an empty string is returned. Interpretation: p1 : string result : string ( ? ) / boolean
Function: random (p1) Evaluates p1. Returns one randomly chosen item from the list p1. Errors: - p1 is empty => the result is an empty string/name Interpretation: p1 : list result : name
Function: strip (p1) Evaluates p1. Changes alphabets A-Z into lowercase and all other characters into spaces. Returns the converted string. Interpretation: p1, result : string N.B: - Subsequent spaces are compressed into one ( applicable to all the other functions, too ) - This function is useful for removing punctuation marks from a player speech ( unfortunately some non-standard alphabets, e.g. a-umlaut, are lost )
Function: experience (p1) Evaluates p1. Returns the score of player p1. Errors: - p1 is not a player name => the result is an empty string/name Interpretation: p1 : name result : number
Function: set experience (p1) Evaluates parameter p1. Sets p1 to be the experience of the player who triggered the action. Returns p1. Requirements: - The monster must have the "experience" privilege - The player cannot be the monster owner or the person who loaded the monster code Errors: - The code is not for a monster => no action, an empty string is returned - The monster does not have the "experience" privilege => no action, an empty string is returned - The player who triggered the action owns the monster or loaded the code => no action, an empty string is returned Interpretation: p1, result : number N.B: - The function cannot be used to change the monster's own experience
Function: plus (p1,p2) Evaluates p1 and p2. Returns the sum of p1 and p2. Errors: - p1 or p2 is not a number or - Overflow => the result is an empty string Interpretation: p1, p2, result : number
Function: difference(p1,p2) Evaluates p1 and p2. Returns p1 minus p2. Errors: - p1 or p2 is not a number or - Overflow => the result is an empty string Interpretation: p1, p2, result : number
Function: times(p1,p2) Evaluates p1 and p2. Returns p1 multiplied with p2. Errors: - p1 or p2 is not a number or - Overflow => the result is an empty string Interpretation: p1, p2, result : number
Function: quotient(p1,p2) Evaluates p1 and p2. Returns p1 divided by p2 ( integer division, all fractions dropped ) Errors: - p1 or p2 is not a number or - Overflow => the result is an empty string Interpretation: p1, p2, result : number
Function: set state(p1) Evaluates p1. Assigns the value of p1 to the code dependent ( static ) variable ( one per a code ). Returns the value of p1. Interpretation: p1, result : string N.B: - The variable is code dependent, that is, every monster, and hook has its own variable ( state variable ). - The function "control" does not affect the variable "set state" uses.
! Example for using set state ! and get state ! and control ! ! MDL code for the object "demo object" ! ! There is also a monster called "demo monster" ! it has no MDL code ! but has the "experience" privilege ! ! When player picks up this object first time, he gets 100 points ! ! ! This is called when failed to get the object. - LABEL get fail() ! ! This is called when getting succeeded. - LABEL get succeed( if(and(get state(),player name), ! Is player name in the state var ? "", ! Aye: Do not give points GOSUB give point() ! Nay: Give points ) ) ! ! This is called when dropping succeeded - LABEL drop succeed() ! ! This is called when the object is dropped unintentionally - LABEL drop you() ! ! This is called when the object is used successfully - LABEL use succeed() ! ! This is called when a player looks at the object - LABEL look you() ! ! This is called when a player commands 'something demo object' - LABEL command(pprint("You can't ",command," demo object.")) ! ! This is called when a player starts a game session in the same ! room with the object. - LABEL start() ! ! This is called when a player enters the room where the object is. - LABEL enter() ! ! This is called when a player leaves the room (or game) where object is. - LABEL leave() ! ! ! The following labels are the code's very own. ! - LABEL give point( control("demo monster", ! For gaining the "experience" privilege ! from "demo monster" prog(set experience( ! Set player's new experience plus( ! + experience( ! get player experience player name), "100" ! Number 100, quotes are compulsory ) ), set state( ! Set code's new state or(player name, ! add player name to the state list get state() ! old state list ) ) ) ) )
Function: get state(p1) Reads the value of the code dependent variable. Returns the value. Interpretation: result : string N.B: - see set_state for more information
Function: less(p1,p2) Evaluates p1 and p2. If the value of p1 is less than the value of p1, "TRUE" is returnes; otherwise an empty string is returned. Errors: - p1 or p2 is not a number => the result is an empty string Interpretation: p1, p2 : number result : string / boolean
Function: number(p1) Evaluates p1. Returns the value of p1 if p1 is a number, otherwise an empty string is returned. Interpretation: p1, result : number
Function: health(p1) Evaluates p1. Returns the health of p1 ( player or monster ). Errors: - p1 is not a player or monster name => the result is an empty string Interpretation: p1 : name result : number
Function: all objects() Returns the list of all objects. Errors: - All the objects do not fit into a 1000-character list => only those objects that fit into a 1000-character list are returned Interpretation: - result: list Huomautus: - Every ( defined ) object is included only once ( even if there exists 0 or multiple copies of it )
Function: all players() Returns the list of all players and monsters. Errors: - All the players and monsters do not fit into a 1000-character list => only those players and monsters who fit into a 1000-character list are returned Interpretation: result : list
Function: all rooms() Returns the room list. Errors: - The room list does not fit into a 1000-character list => only those rooms that fit into a 1000-character list ( in order of appearance ) are included Interpretation: result : list
Function: control(p1,p2) Evaluates p1. While p2 is evaluated the function controls the monster called p1. The code and the monster ( p1 ) must have the same owner. Returns p2. Errors: - p1 is not a monster name or - The code and the monster ( p1 ) do not have the same owner => p2 is not evaluated; the result is an empty string Interpretation: p1 : name p2, result : string N.B: - Any required privilege is checked from the monster that is controlled; the function may affect them. - The function does not affect the privileged mode. - While p2 is executed the "monster name" variable is temporarily assigned the monster to be controlled, that is, p1.
Function: include(p1,p2) Evaluates p1 and p2. Returns p2 if p1 includes p2; otherwise an empty string is returned. Errors: - p1 or p2 ( or both ) is an empty string => the result is an empty string Interpretation: p1, p2, result : string N.B: - The errors do actually fit into the normal behaviour, they are not real errors, but those situations are that special that they are worth mentioning
Function: exclude (p1,p2) Evaluates p1 and p2. Returns a list of those items in p1 not found in p2. Interpretation: p1, p2, result : list
Function: get remote state (p1) Evaluates p1. Returns the value of the static variable ( the "state" field ) of the monster named p1. The monster ( p1 ) must have the same owner as the code, or the monster must be public and the ( other ) monster executing the code must have the object privilege. Errors: - p1 is not a monster name or - p1 and the code have a different owner or - p1 is public and the code is not monster code or - p1 is public and the code ( that is monster code ) does not have the object privilege => the result is an empty string Interpretation: p1 : name result : string
Function: set remote state (p1,p2) Evaluates p1 and p2. Assign the value of p2 to the static variable of the monster p1. The monster p1 must have the same owner as the code, or it must be public and the code ( or, to be precise, the monster whose code it is ) must have the "object" privilege. Return p2. Errors: - p1 is not a monster name or - p1 and the code have a different owner or - p1 is public and the code is not monster code or - p1 is public and the code ( that is monster code ) does not have the object privilege => the result is an empty string Interpretation: p1 : name p2, result : string
Function: remote objects (p1) Evaluates p1. Returns a list of objects lying on the ground in the room p1. Errors: - p1 is not a room => an empty string is returned Interpretation: p1 : name result : list
Function: remote players (p1) Evaluates p1. Returns a list of players in the room p1. Errors: - p1 is not a room => an empty string is returned Interpretation: p1 : name result : list N.B: - Monsters are excluded, making the behaviour a wee bit different from the functions players(), lookup players(), and parse players(). - The behaviour is similar to players(), except that the room is chosen with a parameter.
Function: heal (p1) Evaluates p1. Increases the health ( strength ) of the player who triggered the action by p1 points. Returns p1. Errors: - p1 is not a number or p1 is negative => the result is an empty string Interpretation: ˙ p1, result : number N.B: - If the present strength of a player added with the increase is greater than his maximum strength only the maximum health is set. However, the return value is not affected.
Function: duplicate (p1) Evaluates p1. One extra copy is created from the objects included in the list p1. The copies are automatically picked up by the monster. The objects and the monster must have the same owner, or the monster must have the "object" privilege. Return a list of items the were successfully duplicated. Errors: - The code is not monster code => no action; an empty string is returned - An object does not have the same owner as the monster and the monster does not have the "object" privilege, or the object does not fit in ( the monster carries too many objects ) => The object is neither copied nor ( naturally ) picked up by the monster. Interpretation: p1, result : lista
Function: pprint (p1,p2,p3,...) Function: pprint raw (p1,p2,p3,...) Evaluates p1, p2, p3, ... Parameter text is printed to the player who triggered the action. One space is inserted after a parameter if the following parameter starts with an alphanumeric. A colon (".") is inserted in the very end if text ends with an alphanumeric. A sentence is capitalised. Pprint raw does not format text. Returns the printed text. Errors: - Text is longer than 1000 chars => it is truncated ( somehow ) Interpretation: pN, result : string N.B: - The function decides by itself how to split the text into lines.
Function: print (p1,p2,p3,...) Function: print raw (p1,p2,p3,...) Evaluates parameters. Parameter text is printed to all the players currently in the same room with the monster. One space is inserted after a parameter if the following parameter starts with an alphanumeric. A colon (".") is inserted in the very end if text ends with an alphanumeric. A sentence is capitalised. Print raw does not format text. Returns the printed text. Errors: - Text is longer than 1000 chars => it is truncated ( somehow ) - The code is not monster code => text is printed to all the players ( but not to the player who triggered the action ) in the room Interpretation: pN, result : string N.B: - The function decides by itself how to split the text - If the player ( who triggered the action ) is in the same room with the monster the text is also printed to him. - Very long messages ( many lines ) may overload the Monster event transmission system the result of which may be the loss of some events.
Function: oprint (p1,p2,p3,...) Function: oprint raw (p1,p2,p3,...) Evaluates parameters. Parameter text is printed to all the players currently in the same room with the monster ( but not to the player who triggered the action ). One space is inserted after a parameter if the following parameter starts with an alphanumeric. A colon (".") is inserted in the very end if text ends with an alphanumeric. A sentence is capitalised. Oprint raw does not format text. Return the printed text. Errors: - Text is longer than 1000 chars => it is truncated ( somehow ) Interpretation: pN, result : string N.B: - The function decides by itself how to split the text - If the player ( who triggered the action ) is in the same room with the monster the text is also printed to him. - Very long messages ( many lines ) may overload the Monster event transmission system the result of which may be the loss of some events. Errors: - The code is not monster code => text is printed to all the players ( but not to the player who triggered the action ) in the room - The text is longer than 1000 chars => it is truncated ( somehow ) Interpretation: pN, result : string
Function: pget (p1) Evaluates p1. Picks up the objects found in the list p1 and gives them to the player who triggered the action. Returns a list of the objects which were successfully picked up. Requirements: - The code must be in the "privileged" mode. Errors: - The code is not in the "privileged" mode => no action; p1 is not evaluated (!); the result is an empty string Interpretation: p1, result : list
Function: pdrop (p1) Evaluates p1. The player who triggered the action is dropped all the objects found in the list p1. Returns a list of the objects which were successfully dropped. Requirements: - The code must be in the "privileged" mode. Errors: - The code is not in the "privileged" mode => no action; p1 is not evaluated (!); the result is an empty string Interpretation: p1, result : list N.B: - Informs everybody ( in the same room ) if the action resulted in stripping off an object ( compare: wear and wield )
Function: pduplicate (p1) Evaluates p1. The objects found in the list p1 are duplicated and given to the player ( who, again, triggered the action ). The objects and the code must have the same owner or the monster must have the "object" privilege. Returns a list of objects that were duplicated. Requirements: - the code must be in the "privileged" mode Errors: - the code is not in the "privileged" mode => no action; p1 is not evaluated; the result is an empty string - an object does not have the same onowner as the code and the code is not monster code or - an object does not have the same owner as the code and the code does not have the "object" privilege or - the player cannot take any more objects => the object is not duplicated Interpretation: p1, result : list
Function: destroy (p1) Evaluates p1. Destroys all the objects found in the list p1. The objects and the monster must have the same owner oror the monster must have the "object" privilege. Returns a list of the destroyed objects. Errors: - the code is not monster code => no action; an empty string is returned - an object and the monster does not have the same owner and the monster does not have the "object" privilege => the object is not destroyed Interpretation: p1, result : list
Function: pdestroy (p1) Evaluates p1. Destroys all the objects found in the list p1 from the player. The objects and the monster must have the same owner or the monster must have the "object" privilege. Returns a list of destroyed objects. Requirements: - the code must be in the "privileged" mode Errors: - the code is not in the "privileged" mode => no action; an empty string is returned - an object and the code does not have the same owner and te code is not mosnter code or - an object and the monster does not have the same owner and the monster does not have the "object" privilege => the object is not destroyed Interpretation: p1, result : list
Function: or (p1,p2,p3,...) Evaluates p1, p2, p3,... Returns a list of items found in pN. Every item is included only once. Errors: - the result list is longer than 1000 characters => the result is a list containing only so many items that fit into 1000 chars. Interpretation: pN, result : list
Function: string head (p1) Evaluates p1. Returns the first word of the string p1. Errors: - p1 is an empty string => Ran emprty string is returned Interpretation: p1, result : string
Function: string tail (p1) Evaluates p1. Returns the tail of string p1 ( all except the first word ). Errors: - p1 is an empty string or - p1 contains only one word => an empty string is returned Interpretation: p1, result : string
Function: tail (p1) Evaluates p1. Returns the list p1 excluding the first item. Errors: - p1 is an epmty list or - p1 has only one item => an empty list/string is returned Interpretation: p1, result : list
Function: head (p1) Evaluates p1. Returns the first item of the list p1. Errors: - p1 is an empty list => an empty string is returned Interpretation: p1 : list result : item
Function: lookup room (p1) Evaluates p1. Parses the items found in the list p1 to room names. If a parsing is unsuccessfull that item is exculded from the result list. Interpretation: p1, result : list
Function: lookup player (p1) Evaluates p1. Parses ( completes ) the items in the p1 list to player and monster names. If the completion of an item fails that item is removed from the result list. Interpretation: p1, result : list
Function: lookup object (p1) Evaluates p1. Parses ( completes ) the items in the list p1 to object names. If the completion of an item fails that item is removed from the result list. Interpretation: p1, result : list
Function: parse player (p1) Evaluates p1. The function offers an equivalent parameter interpretation service as used in those monster functions where wild cards are allowed. Return a list of players and monsters. The list is equivalent to parameter p1. ( whatever that implies, then ) Errors: - p1 is empty or - an error occurs while interpreting p1 => the result is an empty string Interpretation: p1 : string result : list
Function: parse object (p1) Evaluates p1. Offers an equivalent parameter interpretation service as is used in those monster functions where wild cards are allowed. Returns a list of objects equivalent to p1. Errors: - p1 is empty or - there is an error while interpreting p1 => the result is an empty string/list Interpretation: p1 : string result : list
Function: parse room (p1) Evaluates p1. The function offers an equivalent parameter interpretation service as used in those monster functions where wild cards are allowed. Returns a list of rooms equivalent to p1. Errors: - p1 is empty or - An error occurs while interpreting p1 => the result is an empty string Interpretation: p1 : string result : list
Function: privilege (p1,p2) Evaluates p1 and p2. All the player ( or monster ) p1 privileges found in the list p2 are returned. Possible privileges are : wizard, manager, experience, quota, object, poof, special and monster. The "wizard" privilege means that the player is the Monster Manager. Errors: - p1 is not a player or monster name => the result is an empty string/list - p2 has a non-existent privilege => the privilege is excluded from the result list Interpretation: p1 : name p2 : list result : list
Function: userid (p1) Evaluates p1. The function requires the "experience" privilege from the monster. Returns a list where the player names in p1 have been substituted for their respective userids. Errors: - the code is not monster code or the monster does not have the "experience" privilege => the function does not evaluate p1; an empty string is returned - an invalid player ( monster ) name is found => the respective userid is excluded from the result - a monster name is found => is included, the userid uses internal format Interpretation: p1, result : list
Function: attack (p1) Evaluates p1. Substracts p1 units from the player ( who triggered the action ) health. However, the monster experience dictates the maximum damage allowed ( p1 can be greater than what is allowed in which case p1 is decreased ). The total sum of subsequent attacks may not exceed the maximum damage allowed. Returns the attack strength. Requirements: - Monster cannot have attacked to its limit already. - Player must not be protected - Hooks must be in the "privileged" mode Errors: - The monster has already attacked to its limit or - The player is protected or - p1 is not a number or - the code is not monster code and the "privileged" mode is off => no action; an empty string/number is returned - p1 is greater than the maximum attack strength allowed => The attack strength is the maximum allowed ( it is also returned ) - the code is not monster code and privileged mode is on => no limits in attack strength Interpretation: p1, result : number N.B: - The function does not tell how the attack succeeded ( can be found out be the function "health" ) - The function does not require monsters to be in the "privileged" mode anymore
Function: spell level() Returns the user's experience level of a spell. Can only be used while executing spell code ( labels summon and learn ). Errors: - As in other spell functions => an empty string is returned Interpretation: result : number N.B: - The spell user ( in the variable "summoner name" ) is different from the user executing the code ( exception: the label "learn" )
Function: set spell level(p1) Evaluates p1. Sets the spell user's experience level ( of a spell ). Can only be used when executing spell code ( the labels "summon" and "learn" ). Level 0 - the player does not know the spell a positive number - the player knows the spell Returns the new experience level. Errors: - As in other spell functions or - p1 is not a number or - p1 < 0 =>an empty string/number is returned Interpretation: p1 , result : number N.B: - The spell user ( in the variable "summoner name" ) is different from the user executing the code ( exception: the label "learn" ) - This function is for teaching spells to players ( in the label "learn" ) - The variable "book name" has the name of the book ( magic book ) that triggered the label "learn" of the spell
Start monster with MONSTER/FIX -command. The fixing subsystem uses file level locks to prevent other players from playing Monster while you are fixing the database. If someone is playing, and you want to fix the database, it's better to shut Monster down with the command "D" in the subsystem menu (in system-menu).
Additional information available:
Menu | Partial_rebuild | Fix_commands |
By typing "?" you get the following menu in /FIX -system: A Clear/create privileges database. B Clear/create health database. C Create event file. D Reallocate describtins E (Exit subsystem) Start monster playing. F Clear/create experience database. G Calculate objects' number in existence. GL Clear/create global database. GS Mark moster shutdown to global database. GU Mark monster active to global database. GV Show global database. G- Mark monster database as invalid. G+ Mark monster database as valid. H This list I Repair index file. J Repair paths. K Reallocate MDL codes. L Repair monsters' location. M Clear/create MDL database. N Clear/create and recount quota database. O Clear/create object database. OW Check owners of objects, rooms and monsters. P Clear/create player database. Q (Quit) Leave monster. R Clear/create room database. S Clear/create password database. SP Clear/create spell database. V View database capacity. ? This list
The following commands make partial rebuild of the Monster database. After these command use the fixing commands to fix pointers in the database. A Clear/create privileges database. B Clear/create health database. C Create event file. F Clear/create experience database. M Clear/create MDL database. N Clear/create and recount quota database. O Clear/create object database. P Clear/create player database. GL Clear/create global database. R Clear/create room database. S Clear/create password database. SP Clear/create spell database. Recommended order: GL R O P M C F N S SP You can use only one of these: R, O and P. Should you need more, use /REBUILD instead.
The following commands can fix small errors in the database without disaster: C Create event file. D Reallocate descriptions G Calculate objects' number in existence. I Repair index file. J Repair paths. K Reallocate MDL codes. L Repair monsters' location. N Clear/create and recount quota database. OW Check owners of objects, rooms and monsters. Recommended order: C I N G J K L D OW