THE ADVENTURE GAME TOOLKIT By David R. Malmberg and Mark J. Welch Distributed by Softworks 43064 Via Moraga Mission San Jose, California 94539 (415) 659-0533 The Adventure Game Toolkit (AGT), including all source code, object code, and manuals on paper or on disk, is copyright 1987 and 1988 by Mark J. Welch and David R. Malmberg. Portions originally copyright 1985 and 1986 by Mark J. Welch. COPYRIGHT, TRADEMARKS AND WARRANTY COPYRIGHT: The Adventure Game Toolkit is a copyrighted work, just like a book. It is protected by United States copyright law and by applicable international treaty provisions. All text, program, and source code files on disk(s) are copyright 1987 and 1988 by Mark J. Welch and David R. Malmberg. Portions of the manual and source code are copyright 1985 and 1986 by Mark J. Welch. TRADEMARKS: "Adventure Game Toolkit" and "AGT" are trademarks of Mark J. Welch and David R. Malmberg. WARRANTY: The program disk(s) and printed manual are warranted to be free from defects in materials and workmanship for a period of 90 days from the date of purchase. In the event of a defect, registered users of AGT may obtain a replacement copy of the program disk(s) and/or manual from Softworks. The remedy for any breach of warranty shall be limited to replacement or refund and shall not encompass any other damages, including but not limited to loss of profit, special, incidental, consequential, or other similar claims. DISCLAIMER: THE ADVENTURE GAME TOOLKIT (AGT) COMES WITH NO OTHER WARRANTIES OF ANY KIND, INCLUDING WARRANTY OF MERCHANTABILITY OR OF FITNESS FOR A PARTICULAR PURPOSE. THE ADVENTURE GAME TOOLKIT (AGT) IS AVAILABLE AS IS. IN NO EVENT WILL THE AUTHORS BE LIABLE FOR DAMAGES, INCLUDING ANY LOST PROFITS OR INCIDENTAL AND CONSEQUENTIAL DAMAGES, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. i LICENSE TERMS (Shareware Rules) The Adventure Game Toolkit (AGT) is NOT public domain or free software, but is being distributed as "Shareware". This means that if you are a regular user of AGT, you should pay for your copy and become a registered user. Only from the income from your registration fees can the authors continue to provide product support, make enhancements to AGT, and stay in business. Non-registered users of this software are granted a limited license to make an evaluation copy for trial use on a private non-commercial basis, for the express purpose of determining whether AGT is suitable for their needs. At the end of this trial period, the user should either register his/her copy of AGT or discontinue using it. Registered users of AGT may use AGT on any computer, provided that AGT is used on only one computer at a time, and that the copy is not routinely used on that computer by other people. If other people use the copy of AGT routinely, they should become registered users themselves. Registered AGT users may make archival and working copies of the AGT program disk(s) to back up their software and protect their investment. They may also make evaluation copies of AGT for trial use by non-registered users, subject to the terms outlined above. Operators of electronic bulletin boards (Sysops) are encouraged to post the Adventure Game Toolkit and related Adventure Game files for downloading by their users. However, if these bulletin boards also offer AGT-based games for "On-Line" or "Doors" play, these Sysops should register their copy of AGT because they are using AGT on a routine basis. Such registration will entitle these Sysops to receive a version of AGT especially tailored for use on bulletin boards, plus copies of all of the latest AGT games. This license to use AGT does NOT include the right to distribute or sell AGT. Distribution terms are detailed below. AGT may be uploaded to and downloaded from commercial systems such as CompuServe, the Source, and BIX, so long as the only charge paid by the subscriber is for on-line time and there is no charge for the program. Those copying, sharing, and/or electronically transmitting the program are required not to delete or modify the copyright notice and restrictive notices from the program or documentation; anyone doing so will be treated as a contributory copyright violator. The Adventure Game Toolkit documentation may not be modified by users. The program may not be separated from the documentation when distributed. Printed or "Xeroxed" copies of the AGT documentation (i.e., this manual) may not be distributed or sold without the written permission of Softworks. Distribution of AGT by game authors: Authors of AGT games may distribute the AGT "driver" program, RUN.EXE, with their games for the purpose of playing games written using the Adventure Game Toolkit. If the game will be widely distributed, we ask that you request written permission and send us a copy of your game so we can notify you of updates or changes to AGT, especially changes that may affect your game. If your game will be commercially distributed, you must obtain a written license to distribute RUN.EXE; there is a one-time fee of $10 for this license for commercial distribution. Distribution of AGT by disk vendors and computer dealers: Distributors of "public domain" or user-supported software libraries must obtain written permission to distribute copies of AGT and related adventure game files. No one may use AGT as a promotion for any commercial venture or ii as an enticement for the user to pay for any program, product, or service unless they have received the express written permission of the program's authors. In order to distribute AGT, a dealer or disk vendor must comply with the following conditions: (1) You must obtain written permission from Softworks to distribute AGT. If you receive no reply, write again: our silence does NOT constitute permission, and you may not distribute "pending" receipt of permission. (2) A fee of not more than $7 may be charged for each disk sold. This includes "multi-disk" volumes: AGT may not be included on any disk sold for more than $7, including CD-ROM or optical disks, without express written permission from Softworks. (3) Vendors may not modify or delete ANY files on the disk. Vendors may add a "GO" program, and/or a reasonable number of small text files designed to assist or provide a service to the user, but these added files must be easily identifiable and end-users must be allowed to delete the added files. (4) Vendors must make a reasonable effort to distribute only the most recent versions of AGT. All vendors who have requested and received written permission to distribute AGT will be notified of updates as they are released. (5) All disk vendors must comply with any and all vendor guidelines or vendor requirements set forth by the Association of Shareware Professionals (ASP); for more information about ASP, contact its chairman, Jim Button, at Buttonware in Seattle. Violation of any ASP guideline or requirement automatically revokes permission to distribute AGT. Until formal requirements are adopted by the ASP, you must comply with the following guidelines: Vendors must make an attempt to educate users on the nature of Shareware. Catalogs, advertisements, order forms, and all disks sold should contain ASP-approved or recommended wording describing the nature of shareware, and should explicitly state that no part of disk sale revenues are paid to the programs' authors. Vendors may not advertise under the heading "Public Domain Software", "Free Software," or the equivalent. When vendor catalogs or advertisements carry both Shareware and PD programs, the Shareware programs must be differentiated from the public domain programs in some way (in the description, with an asterisk, by listing the registration fee, etc.). iii ADVENTURE GAME TOOLKIT (AGT) REGISTRATION/ORDER FORM Remit to: Softworks 43064 Via Moraga Mission San Jose, California 94539 You can also order by phone using your Mastercard or VISA by dialing (415) 659-0533, 12:00 Noon to 9:00 PM., PST ONLY, Monday to Friday. ___ AGT Registration ................................. @ $ 20.00 ea $ ______ includes: (1) Notice of all future AGT upgrades, new AGT Adventures and related AGT products. (2) Latest version of the program, sample Adventure game source files (CAVE, CRUSADE, UNDERGND, ALICE and others), and summary documentation on disk. Over one megabyte of program and data files -- ARCed on two disks. Normally, these disks will not be sent until the next AGT upgrade. If you wish these disks sent immediately, put a check mark here -------------------------> ______ (3) Telephone support from 7:00 to 9:00 PST (M-F). (4) A warm glow from having supported at least one of the many Shareware products you probably use. (5) The AGT authors' eternal gratitude. ___ Above with printed AGT manual .................... @ $ 35.00 ea $ ______ includes: Above items plus printed manual about 150 pages long with numerous detailed examples on how to use the Adventure Game Toolkit to create very professional and very clever Adventure games. The printed AGT manual has approximately 150% the amount of information as contained in the summary disk documentation. ___ Printed AGT manual (Only) ........................ @ $ 20.00 ea $ ______ ___ UPGRADE to the newest AGT version (Only) ......... @ $ 12.00 ea $ ______ includes: Latest version of the program, sample Adventure game source files (CAVE, CRUSADE, UNDERGND, ALICE and others), and summary documentation on disk. Over one megabyte of program and data files -- ARCed on two disks. ___ AGT Turbo Pascal 4.0 source code ................. @ $ 50.00 ea $ ______ includes: Turbo Pascal 4.0 source code for AGT's COMPILE and RUN programs. Over 10,000 lines of Turbo Pascal source code. YOU MUST BE A REGISTERED AGT USER TO ORDER THE SOURCE CODE! Orders are normally shipped by US mail at no additional charge. For UPS shipment, please add $3.00..................@ $ 3.00 ea $ ______ For shipments outside the United States, please add @ $ 5.00 ea $ ______ Subtotal ______ (California residents please add 7% sales tax) Tax ______ Total $ ______ Payment by: ( ) Check ( ) MasterCard ( ) VISA ( ) Cash iv ADVENTURE GAME TOOLKIT (AGT) REGISTRATION/ORDER FORM -- PAGE 2 Name: ____________________________________________________________ Company: ____________________________________________________________ Address: ____________________________________________________________ : ____________________________________________________________ State: ___________________________ Zip:____________________________ Day Phone: _________________________ Eve: ___________________________ Card #: _________________________________ Exp. Date: _______________ Signature of cardholder: ____________________________________________ ------------------------ User comments ------------------------------ I acquired the Adventure Game Toolkit (AGT) from [ ] - Friend [ ] - Disk Vendor [ ] - Computer Club [ ] - Computer Store [ ] - CompuServe [ ] - BIX [ ] - GEnie [ ] - The Source [ ] - Electronic Bulletin Board [ ] - Other - Please Specify ________________________________ We would also appreciate any input you would care to give concerning AGT. If you have any ideas or comments that would make AGT a better system, then please let us know. We value your comments and/or suggestions: ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ ____________________________________________________________________ v ADVENTURE GAME TOOLKIT PRODUCT/TECHNICAL SUPPORT Softworks will make every reasonable effort to fix AGT bugs, and help registered users by answering technical and other AGT related questions. This Product/Technical support for AGT is available to registered users (only) in several forms: (1) By leaving a message in the 'Softworks' forum on BIX (the BYTE Information Exchange). (2) By telephone to David Malmberg at Softworks, Monday through Friday from 7:00 PM to 9:00 PM (Pacific Coast Time) at (415) 659-0533. Please respect these hours! (3) By CompuServe E-Mail to David Malmberg, CompuServe ID 73435,1277. (4) By letter to: Softworks 43064 Via Moraga Mission San Jose, California 94539 If you send disks or listings that you wish returned, be sure to enclosed a self-addressed, stamped envelope (SASE) with sufficient postage. If you do not enclose a SASE, your material will not be returned. Regardless of the method you use to solicit AGT support, if you are having a problem and you can not get AGT to do what you think it should do, please provide background information on the following: (1) The version of AGT you are using. (2) The computer system you are using. (3) Your system's configuration, i.e., amount of RAM, number and type of disk drives, the type of monitor you are using. (4) Any memory resident programs you have installed at the same time you are using AGT and a "rough idea" of what they do and how much memory they take. (5) Your problem, i.e., what is happening vs. what you think should be happening. vi TABLE OF CONTENTS COPYRIGHT, TRADEMARKS AND WARRANTY . . . . . . . . . . . . . . . . . . . . i LICENSE TERMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii ADVENTURE GAME TOOLKIT (AGT) REGISTRATION/ORDER FORM . . . . . . . . . . . iv ADVENTURE GAME TOOLKIT PRODUCT/TECHNICAL SUPPORT . . . . . . . . . . . . . vi PART 1: INTRODUCTION . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 FEATURES OF THE ADVENTURE GAME TOOLKIT . . . . . . . . . . . . . . . 1 STRUCTURE OF THIS MANUAL . . . . . . . . . . . . . . . . . . . . . . 2 HARDWARE REQUIREMENTS FOR AGT . . . . . . . . . . . . . . . . . . . 3 QUICK START FOR PLAYING ONE OF THE AGT GAMES . . . . . . . . . . . . 3 ADVENTURE GAME TOOLKIT FILES . . . . . . . . . . . . . . . . . . . . 4 FILES NEEDED TO COMPILE AN AGT ADVENTURE . . . . . . . . . . . . 4 COMPILED OR FINAL VERSION FILES . . . . . . . . . . . . . . . . 5 SAMPLE AGT ADVENTURE GAME FILES . . . . . . . . . . . . . . . . 6 HOW TO PLAY THE ADVENTURE GAME(S) PROVIDED WITH AGT . . . . . . . . . 7 VOCABULARY . . . . . . . . . . . . . . . . . . . . . . . . 7 STANDARD LEVEL VERBS . . . . . . . . . . . . . . . . . . . . . . 8 SOME GENERAL COMMENTS ABOUT COMMANDS . . . . . . . . . . . . . 10 ABBREVIATIONS AND FUNCTION KEYS . . . . . . . . . . . . . . . . 10 SPECIAL WORDS . . . . . . . . . . . . . . . . . . . . . . . . . 10 NOUNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 NOISE WORDS . . . . . . . . . . . . . . . . . . . . . . . . . . 11 PREPOSITIONAL PHRASES . . . . . . . . . . . . . . . . . . . . . 11 COMMAND LINE OPTIONS . . . . . . . . . . . . . . . . . . . . . . 11 PART 2: HOW TO WRITE AN ADVENTURE GAME . . . . . . . . . . . . . . . . 13 INTRODUCTION: WHY SHOULD I WRITE MY OWN ADVENTURE GAME? . . . . . . 13 HOW AN AGT ADVENTURE GAME WORKS . . . . . . . . . . . . . . . . . . 13 AN OVERVIEW . . . . . . . . . . . . . . . . . . . . . . . . . . 13 STANDARD LEVEL GAME FILES . . . . . . . . . . . . . . . . . . . 15 TITLE FILES . . . . . . . . . . . . . . . . . . . . . . . . . . 15 SETTING SCREEN COLORS . . . . . . . . . . . . . . . . . . . . . 15 INSTRUCTIONS FILES . . . . . . . . . . . . . . . . . . . . . . . 16 THE WORK-HORSE .DAT FILE . . . . . . . . . . . . . . . . . . . . 17 ROOMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 HELP MESSAGES . . . . . . . . . . . . . . . . . . . . . . . . . 18 NOUNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 TEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 MULTIPLE NOUNS WITH THE SAME NAME . . . . . . . . . . . . . . . 21 PUSH, PULL, TURN, AND PLAY DESCRIPTIONS . . . . . . . . . . . . 22 EATING, DRINKING, AND DYING . . . . . . . . . . . . . . . . . . 23 WEIGHT AND SIZE . . . . . . . . . . . . . . . . . . . . . . . . 23 LIGHT AND DARKNESS . . . . . . . . . . . . . . . . . . . . . . . 23 CREATURES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 GROUPS OF CREATURES . . . . . . . . . . . . . . . . . . . . . . 26 SPECIALS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 "SPECIAL" SPECIALS . . . . . . . . . . . . . . . . . . . . . . . 27 CREATING A TYPICAL ROOM . . . . . . . . . . . . . . . . . . . . . . 29 SCORING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 OTHER DATA ITEMS IN THE .DAT FILE . . . . . . . . . . . . . . . . . 32 INTRODUCTION or INTRO TEXT . . . . . . . . . . . . . . . . . . . 32 vii STARTING ROOM . . . . . . . . . . . . . . . . . . . . . . . . . 32 TREASURE ROOM . . . . . . . . . . . . . . . . . . . . . . . . . 32 VERB SYNONYMS . . . . . . . . . . . . . . . . . . . . . . . . . 32 WARNING . . . . . . . . . . . . . . . . . . . . . . . . . . 33 GAME_WIN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 GAME_END . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 PAGE PAUSES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 ORDER OF DEFINITIONS . . . . . . . . . . . . . . . . . . . . . . . . 34 HOW TO INCLUDE COMMENTS IN YOUR AGT DATA FILES . . . . . . . . . . . 34 CREATING YOUR SOURCE DATA FILES WITH WORD PROCESSORS . . . . . . . . 35 PART 3: USING META-COMMANDS IN PROFESSIONAL LEVEL ADVENTURE GAMES . . . . 36 CUSTOM USER-DEFINED VERBS . . . . . . . . . . . . . . . . . . . . . . 36 MAXIMUM_SCORE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 .MSG -- MESSAGE FILES . . . . . . . . . . . . . . . . . . . . . . . 38 A TYPICAL GAME TURN FOR PROFESSIONAL LEVEL GAMES . . . . . . . . . . 38 INTRODUCTION TO META-COMMANDS . . . . . . . . . . . . . . . . . . . . 41 THE FORMAT OF META-COMMANDS . . . . . . . . . . . . . . . . . . . . . 42 META-COMMANDS CONDITIONAL TESTS . . . . . . . . . . . . . . . . . . . 44 PLAYER CONDITIONS . . . . . . . . . . . . . . . . . . . . . . . 44 ITEM(S) CONDITIONS . . . . . . . . . . . . . . . . . . . . . . . 45 NOUN CONDITIONS . . . . . . . . . . . . . . . . . . . . . . . . 46 MISCELLANEOUS CONDITIONS . . . . . . . . . . . . . . . . . . . . 47 META-COMMANDS ACTION TOKENS . . . . . . . . . . . . . . . . . . . . . 48 PLAYER ACTION TOKENS . . . . . . . . . . . . . . . . . . . . . . 48 A WORD OF WARNING . . . . . . . . . . . . . . . . . . . . . . . 49 ITEM/NOUN/LOCATION ACTION TOKENS . . . . . . . . . . . . . . . . 49 MISCELLANEOUS ACTION TOKENS . . . . . . . . . . . . . . . . . . 50 SPECIAL META-COMMAND SITUATIONS . . . . . . . . . . . . . . . . . . . 51 FLAGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 DEBUG FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 COUNTERS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 VARIABLES . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 NUMBER INPUT . . . . . . . . . . . . . . . . . . . . . . . . . . 54 ASKING AND ANSWERING QUESTIONS . . . . . . . . . . . . . . . . . 55 OPENING AND CLOSING PASSAGEWAYS BETWEEN ROOMS . . . . . . . . . 56 META-COMMAND REDIRECTION . . . . . . . . . . . . . . . . . . . . . . 57 PART 4: SAMPLE AGT META-COMMAND SCENARIOS . . . . . . . . . . . . . . . 61 SCENARIO 1: "FIND" VERB ACTIONS . . . . . . . . . . . . . . . . . . 61 SCENARIO 2: RANDOM ACTIVITIES BY GUARD . . . . . . . . . . . . . . . 63 SCENARIO 3: INTERACTION WITH CHARACTERS . . . . . . . . . . . . . . . 69 APPENDIX A: STANDARD LEVEL VERBS UNDERSTOOD BY AGT . . . . . . . . . . . 77 APPENDIX B: META-COMMANDS CONDITIONAL TESTS . . . . . . . . . . . . . . 79 PLAYER CONDITIONS . . . . . . . . . . . . . . . . . . . . . . . . . . 79 ITEM(S) CONDITIONS . . . . . . . . . . . . . . . . . . . . . . . . . 79 NOUN CONDITIONS . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 MISCELLANEOUS CONDITIONS . . . . . . . . . . . . . . . . . . . . . . 81 APPENDIX C: META-COMMANDS ACTION TOKENS . . . . . . . . . . . . . . . . 82 PLAYER ACTION TOKENS . . . . . . . . . . . . . . . . . . . . . . . . 82 ITEM/NOUN/LOCATION ACTION TOKENS . . . . . . . . . . . . . . . . . . 82 MISCELLANEOUS ACTION TOKENS . . . . . . . . . . . . . . . . . . . . . 83 APPENDIX D: AGT ERROR MESSAGES . . . . . . . . . . . . . . . . . . . . . 84 ERRORS DURING GAME COMPILATION . . . . . . . . . . . . . . . . . . . 84 viii ERRORS DURING RESTORING GAME . . . . . . . . . . . . . . . . . . . . 84 ERRORS DURING GAME PLAY . . . . . . . . . . . . . . . . . . . . . . 84 APPENDIX E: VALUE RANGES FOR GAME DEFINITIONS . . . . . . . . . . . . . . 86 APPENDIX F: ABOUT THE AUTHORS . . . . . . . . . . . . . . . . . . . . . . 87 ix PART 1: INTRODUCTION The Adventure Game Toolkit is designed to allow you to create and play your own text adventure games. Once created, your adventure games can be shared with and enjoyed by others -- even if they do not have a copy of the Adventure Game Toolkit themselves. The Adventure Game Toolkit (AGT) began life as a program by Mark Welch called the Generic Adventure Game System (GAGS). Using GAGS it was possible for the non-programmer to develop complete adventure games using a fixed (but relatively large) vocabulary of action verbs. David Malmberg took GAGS and made a number of enhancements including the ability to customize the vocabulary and to program complex conditional tests and a rich assortment of actions and messages using a special meta-language (designed specifically for adventure games). The current Adventure Game Toolkit combines the best features of both approaches to enable the user to create two distinct levels of adventure games: (1) Standard Level games that require no programming experience (honestly!), only a fertile imagination. These Standard Level games follow the original GAGS format and only require that the user generate the game using a word processor or text editor to describe the various locations, objects and results of actions that collectively make up the game. (2) Professional Level games that also make use of the special adventure game meta-language to create games as complex and rich as the game designer's imagination and prose style will allow. These games should be technically comparable with the published text adventure games from firms like Infocom. FEATURES OF THE ADVENTURE GAME TOOLKIT AGT has a number of features that make it a very comprehensive adventure product. These features make AGT more powerful, more professional and easier to use than any previously available Adventure Game development system. Some of these key features are: POWERFUL * Big, complex games with up to 200 locations, 100 inanimate objects (e.g., treasures, swords, lakes, trees, books, etc.) and 100 animate objects (e.g., people, animals or creatures). * Large standard vocabulary with potential to define many more words unique to a specific adventure. Typical games can have a vocabulary of 400 words or more. * Sophisticated parser that can understand (1) complex input commands including pronouns (IT, HIM, HER, THEM, MY and ITS), and (2) compound commands separated by AND or THEN or punctuation symbols, and (3) commands addressed to characters within the game. Here are a few examples of commands AGT can handle with ease: 1 GET THE FLASH LIGHT AND THEN SWITCH IT ON DROP THE FOOD, THE KEY AND THE BOTTLE THEN UNLOCK THE DOOR WITH THE BRASS KEY AND THEN LEAVE PUT ON THE CLOAK, THEN EXAMINE IT; READ ITS LABEL PLACE THE GREEN ROCK AND THE SMALL PEBBLE BEHIND THE TREE ENTER THE HOUSE; GET ALL; EXIT; SOUTH; SOUTH THEN DOWN SULU, SET A COURSE FOR ALPHA 14 SCOTTY, BEAM DOWN A TRICORDER AND THE QWERTY MODULE * Special, English-like meta-language (especially developed for writing Adventure games) that gives the game designer total control and flexibility in the development of his/her games. * Source code available to Registered Users. Over 10,000 lines of Turbo Pascal 4.0 that may be customized to fit the game designer's unique needs. PROFESSIONAL * "Look and feel" of Infocom adventure games with similar screen layout and standard vocabulary and routines. * Automatic screen adaptation to use either a color or a monochrome monitor. Color combinations may be specified by the game designer or by the player during the game. * Predefined function and cursor keys to input frequently used commands and move directions. * SCRIPT and UNSCRIPT commands to echo game output to printer. EASY-TO-USE * Large library of completed games that can be enjoyed simply as great entertainment or used as a platform by the game designer to build upon and/or learn from. * Professionally written documentation totalling about 150 pages. Has numerous examples that unveil the "secrets" of great adventure writers. * Total compatibility with GAGS. STRUCTURE OF THIS MANUAL PART 1 (the section you are reading) gives an overview of the Adventure Game Toolkit, the various files on the disk(s), and explains how to play the adventure games created by the AGT. PART 2 gives a number of pointers on how to create a good adventure game. It also explains the way AGT defines an adventure game in terms of files and game data elements like Rooms, Nouns, and Creatures and gives several examples of each. PART 3 explains the use of AGT's unique meta-language and how it can be used to create Professional Level adventure games. Numerous examples are given. 2 PART 4 presents several detailed scenarios where meta-language commands have been used to create typical adventure games situations, like: (1) random attacks by a villain, (2) how to expand the game's vocabulary to include new verbs and actions, and (3) how to allow for interaction between the player and various characters in the game. The final part of the manual is a series of Appendices that give detailed information on a number of specific AGT topics for easy reference. HARDWARE REQUIREMENTS FOR AGT The games created by the Adventure Game Toolkit requires an IBM-compatible computer with at least 384K of memory, MS-DOS 2.1, and at least one disk drive. You may use any kind of monitor and AGT will automatically adjust its output to best suit your monitor. QUICK START FOR PLAYING ONE OF THE AGT GAMES If you've never played an adventure game before, the best way to start to understand how an adventure game works is to play one. Before you can do that, however, there are a few things you should do first to protect your disk(s) and to create the final version of the game from the source files on the disk(s). Let's make a playable copy of CAVE (the AGT version of the famous "Colossal Cave" adventure game). 1. First, make a copy of the original disk(s) and put them in a safe place. That way, if you accidentally damage the disk(s) you're playing with, you can still re-copy the original(s). Check your DOS manual for the correct form of the COPY or DISKCOPY command that is appropriate for your particular system. 2. If there is a file on the disk(s) called READ.ME or README.AGT, read that file before going further. These files will have information on changes and/or features that have been made after the documentation was created. 3. Copy the following files to a new, formatted disk: COMPILE.EXE CAVE.DAT CAVE.CMD CAVE.MSG These are the "source" files for the CAVE adventure. Put this disk in the A: drive and make that drive the default drive by entering "A:". Then enter "COMPILE CAVE". AGT will then take 3 to 5 minutes to produce a finished version of the CAVE adventure on the same disk, by creating the following new files: CAVE.D$$ CAVE.DA1 CAVE.DA2 CAVE.DA3 CAVE.DA5 These are the "compiled" or final files for CAVE that AGT has created. 3 4. Next, copy the following files to a new (different) formatted disk: RUN.EXE CAVE.TTL CAVE.INS CAVE.BAT CAVE.D$$ CAVE.DA1 CAVE.DA2 CAVE.DA3 CAVE.DA5 ORDERFRM.AGT Then type "CAVE" at the DOS prompt to play the finished version of the "Colossal Cave" adventure created by AGT. ADVENTURE GAME TOOLKIT FILES FILES NEEDED TO COMPILE AN AGT ADVENTURE Included on the disk(s) are numerous files. If there is a file on the disk(s) called READ.ME or README.AGT, read that file before going further. In order to compile or create a finished adventure from your source files, you will need to put the following files on a new, formatted disk: - COMPILE.EXE The file COMPILE.EXE is the AGT program that converts your AGT "source" files into the "compiled" or final files needed to play the adventure. - *.DAT e.g., CRUSADE.DAT. Files with the extension (suffix) .DAT are source data files read by the COMPILE.EXE program when it is running. - *.CMD e.g., CRUSADE.CMD. Each file with the extension .CMD is a source data file containing a set of special meta-language commands for a corresponding game in a .DAT file. The use of a *.CMD file is unique to Professional Level adventure games. Games that do not use these Professional Level features (such as, the original GAGS games) would not have a *.CMD file. - *.MSG e.g., CRUSADE.MSG. Each file with the extension .MSG is a source data file containing a set of special messages for a corresponding game in a .DAT file. The use of a *.MSG file is unique to Professional Level adventure games. Games that do not use these Professional Level features (such as, the original GAGS games) would not have a *.MSG file. After these are on a new, formatted disk, you should enter the command "COMPILE GameName", e.g., "COMPILE CRUSADE". After a few minutes, AGT will pause and give you a message about how much space there is on your disk compared to how much space you need for the "final" or "compiled" version files. If you don't have enough space, the program will suggest you put in a clean (already formatted) disk, before it writes the final files. 4 COMPILED OR FINAL VERSION FILES After the game has been compiled, you can create a final, playable disk for the game. This disk will have the following files: RUN.EXE This is the program "engine" that runs your compiled adventure game. RUN.EXE must be on the disk in order to play any compiled, final AGT game. All of the information that is unique to the adventure will be contained in compiled data files, described below: - *.BAT e.g., CRUSADE.BAT. Each file with the extension .BAT is used to start the final version of the game, i.e., it contains the DOS batch instruction "RUN GameName", e.g., "RUN CRUSADE". *.BAT files are optional. - *.TTL e.g., CRUSADE.TTL. Each file with the extension .TTL contains the title file for a corresponding game file. (*.TTL files are optional) - *.INS e.g., CRUSADE.INS. Each file with the extension .INS contains a set of instructions for a corresponding game. (*.INS files are optional) If the game disk contains a *.INS file (i.e., CRUSADE.INS), the game will ask the player "Do you wish to see the instructions?" If the player answers with a YES or Y, the instruction file will be displayed. If the game disk does not contain a *.INS file, play begins normally at the starting location. - *.D$$ e.g., CRUSADE.D$$. Each file with the extension .D$$ contains all the encrypted messages for the game. *.D$$ files are NOT optional. - *.DA1 e.g., CRUSADE.DA1. Each file with the extension .DA1 contains general data about the game. *.DA1 files are NOT optional. - *.DA2 e.g., CRUSADE.DA2. Each file with the extension .DA2 contains encrypted data about the ROOMS in the game. *.DA2 files are NOT optional. - *.DA3 e.g., CRUSADE.DA3. Each file with the extension .DA3 contains encrypted data about the NOUNS in the game. *.DA3 files are NOT optional. - *.DA4 e.g., CRUSADE.DA4. Each file with the extension .DA4 contains encrypted data about the CREATURES in the game. *.DA4 files are NOT optional if you have CREATURES in the game. If there are no CREATURES, then no *.DA4 file will be created. - *.DA5 e.g., CRUSADE.DA5. Each file with the extension .DA5 contains encrypted meta-language commands for the game. *.DA5 files are NOT optional if you have meta-language commands in the game. If there are no meta-language commands, then no *.DA5 file will be created. 5 The final or compiled files of an adventure game take up less disk space than the source files and are encrypted. These files are not only safe from "peeking" and "prying" eyes, but have the advantage of loading very fast. Even the largest AGT game will load in about 15 seconds -- just long enough to read the title screen. SAMPLE AGT ADVENTURE GAME FILES Included with the other AGT files are three sample adventure games that use all the power of AGT including the special meta-language. The reader is encouraged to study these games for examples of how AGT can be used to accomplish a wide variety of Professional Level adventure game tasks and tricks. These games are: CAVE.* An AGT version of the original Crowther and Woods "Colossal Cave" Adventure Game. CRUSADE.* Rescue the princess from the evil Baron's dungeon. QUEST.* Recover your magic spells and amulets from Blackwing's Pit. In addition there are a number of Standard Level games that could have been created totally without any programming knowledge or experience: UNDERGND.* A game of survival after World War III. Uses all of the tricks of the original GAGS (Standard Level) adventures. ALICE.* An adventure using the characters from Alice In Wonderland. This game was the winning entry in the first annual GAGS game writing contest. DEENA.* A woman warrior's struggle to escape from the lecherous Gendi tribe. (R-rated) DRAGONS.* An adventure in the Sultan's palace with side trips to his dungeon, the torture chamber and the harem. (R-rated) FABLE.* An allegorical quest for meaning and understanding in life. GHOSTTWN.* Find and rescue the rancher's daughter from the mysterious ghost town. (R-rated) LOTTERY.* An adventure in San Francisco with emphasize on the "red light" district. (R-rated) CTA.* An allegorical adventure where you battle figures like "Unbelief", "Greed" and "Lust" using such weapons as the "Sword of the Spirit" and the "Staff of Righteousness". LASAR.* Seek out and destroy the threats to peace and prosperity in the Kingdom of Ellasal. 6 HOW TO PLAY THE ADVENTURE GAME(S) PROVIDED WITH AGT VOCABULARY The Adventure Game Toolkit creates adventure games that understand a wide variety of commands. A typical AGT game might have a vocabulary totalling 400 words or more. Your game's commands should generally be in the format: <(multiple) noun phrase(s)> Verb phrases can consist of a simple verb like EAT, SHOOT, READ or a verb followed by a preposition such as CLIMB UP, JUMP THROUGH, or SWIM IN. Noun (or object) phrases can consist of a single word noun like TREE, ROCK, LAKE or a noun and its adjective such as RED ROCK, SMALL BOWL or UGLY MUTANT. Several nouns may be connected with AND's or commas. Articles like A, AN or THE are optional. The personal pronouns MY and ITS are also optional. The pronouns IT, THEM, HIM and HER may be used to refer to a previously mentioned noun. Here are some (hypothetical) examples of valid commands: PLACE A RED ROCK IN THE SMALL BOWL PUT THE GREEN ROCK AND THE SMALL PEBBLE BEHIND THE OAK TREE READ MY POETRY BOOK SWIM IN THE SWIMMING POOL EXAMINE THE GOLD RING, THE DWARF AND THE SILVER NECKLACE EAT THE CELERY, THE TUNA, THE APPLE AND THE ONION THROW THE BATTLE AXE AND THE LARGE ROCK AT THE WEREWOLF SHOOT THE BURGLAR WITH THE REVOLVER ATTACK HIM ("HIM" will refer to last noun mentioned, e.g., the burglar) FIRE THE LASER PISTOL AT THE ALIEN MUTANT GET THE BOOK (also: TAKE THE BOOK) READ IT ("IT" will refer to last noun mentioned, e.g., the book) GET ALL (will get everything movable at the current location) GET THE KEYS, BOTTLE, FOOD AND THE CLOAK EXAMINE THE KEYS, BOTTLE, FOOD AND CLOAK PUSH THE RED BUTTON AND THE GREEN BUTTON UNLOCK THE FILE CABINET WITH THE STEEL KEY JUMP THROUGH THE OPENING JUMP OVER THE LOG NORTH SOUTHWEST PLACE AN AXE AND THE SHIELD NEXT TO THE BIG TREE PUT THE FOOD ON THE KITCHEN TABLE TURN ON THE FLASHLIGHT LIGHT THE TORCH WITH THE WOODEN MATCHES SCREAM AT THE UGLY TROLL CLIMB UP THE LADDER EXTINGUISH THE FIRE (or PUT OUT THE FIRE) DRINK THE WHITE WINE THROW THE FIRE WOOD IN THE STOVE PULL THE BELL CORD WEAR THE STUPID HAT (also: PUT ON THE STUPID HAT) 7 TAKE OFF THE HAT (also: REMOVE THE HAT) NE (for NORTHEAST) DROP THE KEY AND THE BOTTLE ENTER THE CAVE XYZZY (i.e., a "magic" word) TURN THE DOORKNOB PLAY WITH THE DOG TALK TO (or TALK WITH) THE OLD MAN (ABOUT THE WEATHER) TELL JEFF ABOUT THE SWORD ASK JODIE ABOUT THE CRIME Compound commands can be created by connecting single commands (like those above) with "AND", "THEN" or the punctuation symbols "," or ";" to connect two or more separate commands. However, "end-of-sentence" punctuation symbols like ".", "!" and "?" should not be used. Below are a few examples of valid compound commands: TURN THE DOORKNOB; OPEN THE DOOR THEN ENTER THE ROOM CLIMB DOWN THE LADDER THEN SOUTH, WEST AND NORTHWEST GET THE CLOAK AND THEN EXAMINE IT; READ THE LABEL DROP THE FOOD AND THE BOTTLE THEN UNLOCK THE DOOR AND THEN LEAVE GET THE TORCH, LIGHT IT WITH THE WOODEN MATCHES THEN EXAMINE IT AGT's parser also allows you to give commands to other characters in the game like these: SULU, SET A COURSE FOR ALPHA 14 SCOTTY, BEAM DOWN A TRICORDER AND THE QWERTY MODULE HELMSMAN, RAISE THE DEFLECTOR SHIELDS BONES, COME TO THE BRIDGE The comma after the character's name is optional. One point of advice about command structure is in order. Your commands should be structured to follow the most "natural" sequence of words when two or more sequences are possible. For example, THROW THE GOLDEN EGGS TO THE TROLL will be understood by the AGT parser, whereas THROW TROLL THE EGGS will not be understood -- even though it is understandable to most humans as equivalent. Similarly, you should avoid the verb "USE", such as USE THE KEY TO UNLOCK THE DOOR. This command should be entered simply as UNLOCK THE DOOR WITH THE KEY. NOTE: Player's input commands will be shown in all caps throughout this document. STANDARD LEVEL VERBS Standard level games have a fixed set of verbs -- although these may all be supplemented by additional synonyms. Professional level games have all of the standard level verbs plus they can have additional verbs that are defined uniquely for each game. The standard level verbs and the form of their commands are shown below: Meanings of notation: [required word] {optional word} | (means OR, i.e., alternative words) 8 Verbs that do not require nouns =============================== N,S,E,W,NE,NW,SE,SW,U,D, NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST,UP,DOWN ENTER | GO [IN | INTO] EXIT | LEAVE (* directions *) SCORE (* display score and status *) QUIT | Q (* end game *) INVENTORY | I (* list things player is carrying and wearing *) SCREAM | SHOUT | YELL (* make noise but seldom accomplish anything *) WAIT (* waste a turn *) BRIEF | VERBOSE (* change description mode *) L | LOOK (* repeat full description *) SAVE | RESTORE {GAME} (* save and restore game status *) HELP | H (* ask for help *) SCRIPT (* Echo all output to both printer (LP1:) and screen *) UNSCRIPT (* Send all output to screen only *) Verbs that require nouns (and perhaps objects) ============================================== LIST | SHOW [EXITS] (* list visible exits *) THROW | CAST | DUMP [noun] {[AT | TO | IN | INTO | ACROSS | INSIDE] [noun]} ATTACK | KILL | FIGHT | HIT [creature] {[WITH] [noun]} DROP | PUT DOWN [noun | ALL] GET | TAKE | PICK UP [noun | ALL] OPEN [noun] {[WITH] [noun]} CLOSE | SHUT [noun] LOCK [noun] {[WITH] [noun]} UNLOCK [noun] {[WITH] [noun]} EXAMINE | CHECK | INSPECT | LOOK AT | LOOK IN [noun] (* synonym is "." or "EX" *) READ [noun] EAT [noun] DRINK [noun] PUT | PLACE [noun] [IN | WITH | INSIDE | INTO | NEAR | BEHIND | BESIDE | ON | UNDER] [noun] PUSH | TOUCH [noun] {[WITH] [noun]} TURN [noun] {ON | OFF} TURN {ON | OFF} [noun] PULL [noun] PLAY {WITH} [noun] LIGHT [noun] EXTINGUISH | PUT OUT [noun] (* synonym is "EXT" *) SHOOT | FIRE [noun] [AT] [creature] SHOOT | FIRE [creature] [WITH] [noun] PUT ON | WEAR [noun | ALL] TAKE OFF | REMOVE [noun | ALL] ASK [creature] [ABOUT] [noun] TALK [TO | WITH] [creature] {[ABOUT] [noun]} TELL [creature] [ABOUT] [noun] 9 SOME GENERAL COMMENTS ABOUT COMMANDS Figuring out what words work in a game is part of the "challenge" of some adventure games. The usual directions are understood by AGT games (N, S, E, W, NE, NW, SE, SW, UP, and DOWN; in some cases, ENTER or EXIT might also be appropriate). Other events might also cause you to change location: if you detonate a nuclear warhead, for example, you'll likely be immediately transported somewhere far, far away. You can try to TAKE or GET most things that are in a room with you; you should EXAMINE or LOOK AT most visible nouns as well, whether or not you are carrying them. You can DROP or THROW anything you're carrying. Eating and drinking are often permitted, but eating strange things is usually dangerous. If something seems to be closed or locked, you can try to open or unlock it -- but it may require some special kind of key. There's no penalty for incorrect words: if the game doesn't understand a word, it gives you another chance and doesn't count the invalid input as a turn. If you try to do something foolish like EAT CHAIR or GET THE BUILDING, the game will give you an appropriate response like "It is impossible to eat the chair" or "The building can not be taken". ABBREVIATIONS AND FUNCTION KEYS To look more closely at something, EXAMINE it. The period character ('.') is a synonym for EXAMINE, so typing ". BOOK" is the same as "EXAMINE BOOK". You can also abbreviate EXAMINE as EX (e.g., EX BOOK). The exclamation point ('!') is a synonym for ATTACK. To turn out a light, you can EXTINGUISH it, and EXTINGUISH can be abbreviated as EXT (e.g., EXT LAMP). It is also possible to use the function and cursor keys in lieu of many frequently used commands and directions as follows: F1 -- GET Up Arrow -- NORTH F2 -- DROP Down Arrow -- SOUTH F3 -- EXAMINE Right Arrow -- EAST F4 -- READ Left Arrow -- WEST F5 -- OPEN Home -- NORTHWEST F6 -- CLOSE End -- SOUTHWEST F7 -- INVENTORY Pg Up -- NORTHEAST F8 -- LOOK Pg Dn -- SOUTHEAST F9 -- SCORE Gray "-" Key -- UP F10 -- HELP Gray "+" Key -- DOWN Ins -- ENTER Del -- EXIT If at any time during the game the player needs to be reminded of what the function and cursor keys stand for, hitting the ? key followed by will produce a diagram of what each cursor and function key means. SPECIAL WORDS Certain words have special meanings to AGT games. SCORE will let you see how much progress you've made and will give you an idea how much of the game 10 you've seen so far. QUIT will permit you to stop the game and return to DOS. SAVE will allow you to save the current game status, and RESTORE will restore a previously-saved game. In addition, AGT also allows the use of SCRIPT to echo all of the game's output to your printer (as well as the screen). UNSCRIPT may be used to turn off the printer output. As you move around through the game, you'll notice that the game provides a long text description of each room only when you first enter the room. To see the full description again, type LOOK or L or hit the F8 function key. The game doesn't keep these long text descriptions in memory, but instead reads them from disk each time it needs them. If you don't like this delay, you can suppress the long text by using the BRIEF command. VERBOSE will bring them back. Further, in AGT it is possible to issue commands for HELP or alternatively hit the F10 key. Be warned, however, that some game designer might feel that the situation does not deserve any help or, worse yet, some deviate designer might actually give the player a hint that is a little misleading. NOUNS While the list of verbs is generally similar from game to game, all the nouns change every time. One game might be filled with weapons and creatures, while another might contain many keys and locks. Most nouns are unique: you probably won't find more than one "gold key," but you might find a "brass key," an "access card," and an "entry pass." The game only understands an adjective if it is correctly followed by the matching noun: if TAKE RED FLUTE is valid, the game will not try to guess what you meant by TAKE RED or TAKE RED INSTRUMENT or TAKE THE RED ONE. It will accept TAKE FLUTE, but not TAKE BLUE FLUTE. With some verbs, nouns are optional. For example, NORTH is quite clear by itself, and any "valid" words following it will be ignored completely. EAT needs a noun of some kind, preferably an edible one. And some things may not be possible unless you specify a tool: UNLOCK PADLOCK may not be acceptable, while UNLOCK THE PADLOCK WITH THE BRASS KEY may work fine. NOISE WORDS The words "THE", "MY", "ITS", "A" and "AN" are ignored; so are friendly words like "PLEASE" and "NOW." This way, PLEASE PUT A RED ROSE AND MY NOTE ON THE SMALL TABLE NOW can be understood, while the game may be quite confused by PLEASE YOUR MOTHER. PREPOSITIONAL PHRASES In some cases, the preposition need not be followed by an object (TURN THE GAS STOVE ON is fine), but often the game will be puzzled unless you provide one. For example, UNLOCK THE PADLOCK WITH or PLACE THE BOOK BESIDE just won't do. COMMAND LINE OPTIONS 11 In order to accommodate as many hardware systems as possible, it is possible to enter a "/B" option on the command line that invokes your adventure game. This causes the game to use the BIOS for all output, rather than writing directly to the screen memory locations (which is considerably faster and AGT's default mode of operation). Some clones may require this option. Also, some multi-tasking environments (specifically, DesqView) need this option to allow an AGT game to run in its own "window". If you find that an AGT game causes strange behavior on your screen, you should try this option. For example, to play the game QUEST using this option, you would start the game from the DOS prompt with "RUN QUEST /B". There is one additional command line option available. If you wish the player's input to be in lower case, rather than AGT's default mode of upper case, use the option "/L". For example, to play CAVE with lower case player input, start the game from the DOS prompt with "RUN CAVE /L". 12 PART 2: HOW TO WRITE AN ADVENTURE GAME INTRODUCTION: WHY SHOULD I WRITE MY OWN ADVENTURE GAME? Here are a few good reasons: - Imagine your office as an adventure game. Imagine the wonderful descriptions you could provide for your co-workers' offices, the analogies you could make for the delivery people, and the thinly-veiled insults of your boss you could include. If such an adventure game scenario were written in reasonable taste, it could serve as a well-deserved diversion on a Friday afternoon. Of course, if it's written in poor taste, and your insults aren't veiled enough, it could be your last Friday. - Maybe you are trying to teach someone something. Perhaps you want them to learn about computers. Maybe you want to guide them through many screens of tutorials. If you could write the text as an adventure game, and make learning a game, the game players might learn faster and even have fun doing it. An excellent example of this is a series of spreadsheet templates called Templates of Doom which has introduced Lotus 1-2-3 (in the guise of an adventure game) to thousands of new spreadsheet users. Another excellent example is a game entitled Brainscape which teaches the anatomy of the human brain by letting the player (who has been reduced to microscopic size) explore the various "locations" of the brain in search of human growth hormone and other "treasures" -- so the he can be restored to normal size. - Or maybe you're well-equipped with a great imagination and you want to develop a game that will rival the ones you've bought in stores or played with friends. Perhaps this is your chance to prove your fiction-writing abilities. - Or last, but not least, because writing adventures is even more fun than playing them. HOW AN AGT ADVENTURE GAME WORKS AN OVERVIEW When a player begins to play an AGT game, the first thing the program does is look on the disk for a title file (indicated by a .TTL file extension), which should contain the name of the game, the author's name, and perhaps a copyright statement. Each line in the file is displayed centered on the screen. AGT also posts its copyright notice just below the game writer's title information. If, for some reason, there is no file with a .TTL extension, the AGT copyright information is displayed by itself. The title screen, with the author's information and AGT's, stays on the screen while the program initializes all its data arrays and records and reads the various compiled data file. If the game's .DAT file contains some text preceded by the keywords INTRO or INTRODUCTION and ended with the keyword END_INTRO, that text is displayed at the beginning of the game. It cannot be re-read during the game. In addition to the INTRO section of the .DAT file, there can also be an 13 instruction file with a .INS extension. If such a file exists for the adventure being played, before actual play begins AGT will ask the player if he/she would like instructions. If the answer if yes, this file will be displayed. Once all the data has been read and the player has had an opportunity to read the game's instructions (if any), the program puts the player into room 2 of the game (or another room if the author has specified an alternative starting location). There is no room 1; a location of 1 indicates the player's pockets. AGT then prints the long text description for room 2, (or the alternative starting location) and the player is asked what to do. Each time the player types in a command and , the program sends the input line to the "parse" module. The parser take the input line, breaks it into separate words, and tries to locate an addressee (if the command is being directed to another character), a verb, a noun, a preposition, and another noun as the object of the preposition. It does this by eliminating extra words like "THE" and "PLEASE"; and by checking and then eliminating adjectives. It returns up to five words: addressee, verb, noun, preposition, and an object of the preposition. (If any of these elements is missing, the "empty string" ('') is returned in its place.) If an invalid word is found by the parser, it informs the user, indicating what part of speech AGT expected and which specific input command word it didn't recognize. Otherwise, the program then calls the execute module; this section selects a procedure to call based on the verb (THROW, TAKE, EAT, MOVE, etc.). Depending on the procedure's own checking, the noun, preposition and object might be rejected as invalid or, in some cases, ignored partly or completely and an appropriate "error" message will be given For example, "EAT CASTLE" would typically cause the "error" message: "It is impossible to eat the castle." There are two ways a player can be moved to a new room. One is by specifically trying to do so. Moving east is generally accomplished by typing EAST or E or hitting the Right Arrow cursor key. If the player tries to move in a direction that is not allowed, AGT will inform him that such a move is impossible. The other way to move is by meeting a set of special requirements that the game's author has defined as a "special." The special might be defined, in plain language, as "if the player is in the sauna, and he turns the faucet, then move him to another room X." That other room X might be anything. One possibility is that it may be a room with a similar or identical description, but with a new exit or without an old one. It might even be the same room, but by executing the "special," the program displays several lines of text. In this case, the special text might be "You turn on the faucet, and scalding hot water pours onto your feet. You scream in agony and kick the faucet, which is turned off." If the author was cruel, the "special" here might move the player to a new room called "hell" and be told "As you turn the faucet, scalding hot water pours out onto your legs. You scream in agony, but the faucet won't shut off. In minutes, you are scalded to death. You awaken in purgatory, where Satan tells you that your punishment for killing the lizard [something the player did earlier to get here] will be boiling in oil for eternity." The new room description would describe a vat of boiling oil, provide no exits, and include the keyword GAME_END to end the game. For relatively simple adventure games (i.e., Standard Level games), "Specials" 14 are the way you do almost anything unusual. Of course, a special can be used to move a player to a new room (i.e., TOUCH MIRROR might cause the player to fall through the looking-glass and into a new room). But specials also allow a room to be "changed" in the player's view -- this is accomplished by actually moving the player to a new, but similar room. If you want an airlock to close one door and open another, you use a "special" which moves the player to a 'new' airlock with a different exit. If you want a player to 'teleport,' you use a special. If you want to player to be surprised by some action but not moved (i.e., PLAY STEREO could lead to "Beethoven's Fifth plays loudly, awakening the neighbors. Someone pounds loudly on the ceiling"), use a special. More examples of "Specials" will be given later. STANDARD LEVEL GAME FILES Each Standard Level games can have up to three files: A title file (e.g., ALICE.TTL), an instruction file (e.g., ALICE.INS), and a data file (ALICE.DAT). Each of these file types will be explained in separate sections to follow. TITLE FILES If there is a file with a .TTL extension, that file is displayed first before the actual game play begins. The contents of this file will be displayed centered on a cleared screen. For example, the title file for the ALICE IN WONDERLAND game contained in the ALICE.TTL file is: The Adventures of Alice Who Went Through the Looking-Glass And Came Back Though Not Much Changed Based on characters created by Lewis Carroll Game and Text Copyright 1986 D.A. Asherman This would actually be centered on the screen as follows: The Adventures of Alice Who Went Through the Looking-Glass And Came Back Though Not Much Changed Based on characters created by Lewis Carroll Game and Text Copyright 1986 D.A. Asherman SETTING SCREEN COLORS AGT sets the screen colors to be used during the adventure automatically. If the game is being played on a color monitor, the screen output is quite colorful. Specifically, the default screen colors will be: Normal text color is Cyan High lighted text color is Yellow Background color is Black 15 Reverse text color is Red Reverse background color is Light Gray These colors cause the normal screen output to be shown as "Cyan on Black", while the player's input is shown as "Yellow on Black", and the status line at the top of the screen is shown as "Red on Light Gray". These default colors can be changed to specific different colors in the first line of the .TTL file. For example, if you wanted to change the color combinations to normal output of "White on Blue", and player input of "Yellow on Blue", and the status line of "Black on Cyan", then you are specifying: Normal text color is White High lighted text color is Yellow Background color is Blue Reverse text color is Black Reverse background color is Cyan This could be accomplished by putting the following line as the first line of the .TTL file: COLORS WHITE YELLOW BLUE BLACK CYAN If you are playing the game on a monochrome monitor, most of the screen output will be "White on Black", i.e., the normal monochrome output for your monitor. The only exceptions will be the player input which will be shown high-lighted and the status line on the top of the screen which will be shown in reverse, i.e., "Black on White". On monochrome monitors, this basic monochrome color combination will be used automatically regardless of what may have been specified in the COLORS command in the first line of the .TTL file. It is also possible for the player to change the screen color combination by giving input during the game. For example, if the player inputs: COLORS YELLOW GREEN CYAN BLACK LIGHTGRAY during the game, the screen will immediately change to "Yellow on Cyan", with the player's input shown as "Green on Cyan", and the status line displayed as "Black on Light Gray" -- if the game is being played on a color monitor. If the game is being played on a monochrome monitor, the above player input would have no effect. Other player color commands allowed are: COLORS MONO which changes the screen to a monochrome color combination - even on a color monitor, and: COLORS DEFAULT which will return the screen to AGT's default color combination -- depending upon the type of monitor the game is currently being played upon. INSTRUCTIONS FILES If there is a file with the correct filename and the suffix .INS, then AGT will ask the player if he wished to read the instructions for the game. If the response is Y or YES, the filename.INS file will be displayed a screen at 16 a time with a pause between screens. If the player responds with N or NO, then the instructions will be skipped and the game will begin normally in the starting room location. If there is no .INS file, then the instruction prompt will not appear and play will begin without any instructions. THE WORK-HORSE .DAT FILE Adventure games are really just a special kind of data base application. The game driver (for AGT, this is RUN.EXE) just accesses the adventure data base to retrieve data based on the player's commands. This is much like how a "standard" data base application might display all employees in the marketing department with salaries over a certain amount after getting a query from the data base user. For Standard Level AGT games, the data base is contained in the .DAT file. This file is the real work-horse file for AGT adventure games. The most important data elements in an AGT game are three large data arrays: the game's rooms, nouns, and creatures. Each of these data types will be explained in separate sections that follow. ROOMS The room specification in the .DAT data file is quite simple: Required: |<-----significant----->|<------ignored------------------------>| | ROOM nnn <-- nnn is a number from 2 to 199 Room Name <-- short room name (up to 30 characters), that will be shown on the status line (do not include comments!) {optional characteristics} END_ROOM Optional characteristics: <-- optional but at least one is strongly recommended |<---significant--->|<------ignored------------------------>| | {direction} nnn <-- nnn is a number from 2 to 199 (default is 0) {any one of 12 directions can be specified, from the list: NORTH NORTHEAST UP SOUTH SOUTHEAST DOWN EAST NORTHWEST ENTER WEST SOUTHWEST EXIT} SPECIAL nnn <-- optional, nnn is a room number.{If present, the current definition must include KEY xxx and there must be a SPECIAL nnn definition} KEY xxx <-- xxx is a noun number (200-299) {activates special nnn} 17 LIGHT xxx <-- xxx is a noun number (200-299) OR the value 1 ("any light") {default is 0} POINTS xxx <-- xxx is number of points player is awarded just for getting here. Default is 0. LOCKED_DOOR <-- default is FALSE. If TRUE, AGT will act as if there is a locked door that cannot be opened in the room and give various appropriate messages if player tries to do something to the door. GAME_END <-- if this line is in the definition, the game ends as soon as the player enters the room (the room_descr is displayed, then the score). (Player loses game here.) GAME_WIN <-- if this line is in the definition, the game ends as soon as the player enters the room (the room_descr is displayed, then the score). (Player wins game here.) ROOM_SYNONYMS <-- default is NONE. Room synonyms are indicated in the .DAT file as: ROOM_SYNONYMS MAGIC_WORD XYZZY SESAME ROOM_SYNONYMS CHANGE_LOCATIONS CLIMB ROOM_SYNONYMS PLAY SHOW DISPLAY FLASH These cause the first word (which must be a valid verb) to be substituted whenever the player enters one of the words following the first word in that room. For example, if the player entered SHOW, DISPLAY, or FLASH (above), AGT would act as if the word PLAY (which is a "special") was entered and react accordingly. There can only be one room synonym specification in each room. It is recommended that at a minimum, one exit from each room be provided; otherwise the player will be stuck in the room until he quits. Of course, that direction might be a special -- which will be explained in a later section. A room description should also be provided in .DAT file: ROOM_DESCR Some text, any number of lines, about the room. END_ROOM_DESCR This room description will be what is printed whenever the player enters the room or gives the command to LOOK. HELP MESSAGES An optional HELP message may also be provided for each room: 18 HELP Some text, any number of lines, gives a HELP message for this room. END_HELP_DESCR If you don't enter a specific HELP message for a room, the default message if the player asks for HELP is "Sorry, but you are on your own here." Here is a more complete example of how a room might be specified in the .DAT file: ROOM 32 Top of Cliff NORTH 33 SOUTH 34 WEST 35 END_ROOM ROOM_DESCR 32 You are standing near the edge on the top of a tall cliff. To the east is a sheer drop of several thousand feet. To the north, west and south are paths that lead down the side of the mountain. END_ROOM_DESCR HELP 32 Be careful, don't go too near the edge! END_HELP_DESCR NOUNS Nouns are necessarily more complex than rooms. They are specified in the following format, listed with the possible values (and defaults): |<-----significant----->|<------ignored------------------------>| | NOUN nnn <-- nn is a number from 200 to 299 Name <-- one-word name of the noun Adjective <-- one-word adjective Short one-line description of the noun {other characteristics go here}- END_NOUN Other characteristics (optional): SIZE nn <-- nn is a number from 1 to 99+ Default is 1. WEIGHT nn <-- nn is a number from 1 to 99+ Default is 1. UNMOVABLE <-- default is movable (carryable) LOCATION nn <-- nn is a "room" number (1-299, 1000) 1 - if being carried 2-199 - in room 2, etc. 200-299 - inside another noun 1000 - if being worn 19 READABLE <-- default is "not readable" {if READABLE then must also be defined} CLOSABLE <-- default is "not closable" CLOSED <-- default is "open" {if open then it can hold something} LOCKABLE <-- default is not lockable LOCKED <-- default is unlocked KEY nn <-- default is 0 {noun nn unlocks this noun if it's lockable} EDIBLE <-- default is inedible DRINKABLE <-- default is undrinkable/solid POISONOUS <-- default is nonpoisonous {predictable effect if poisonous edible/drinkable noun is eaten} ON <-- default is 'off' PUSHABLE <-- default is not pushable {PUSH_DESCR nn recommended but not required if it is pushable} PULLABLE <-- (ditto, PULL_DESCR nn) PLAYABLE <-- (ditto, PLAY_DESCR nn) TURNABLE <-- (ditto, TURN_DESCR nn) IS_LIGHT <-- default is NOT is_light (IS_LIGHT -> illuminates any room defined as LIGHT 1 or LIGHT nnn where nnn is the noun number) POINTS <-- default is 0 (points awarded to player if object is being carried, present or in the "treasure" room at game_end) GAME_WIN <-- default is FALSE. Player wins game if TRUE when he get this noun. CAN_SHOOT <-- default is can't shoot (can the weapon be used to shoot a creature? if not, it must be thrown) NUM_SHOTS <-- default is 0 (how many bullets/ charges are there initially? decremented each time the noun is fired.) WEARABLE <-- default is not wearable POSITION <-- default in NONE. If the game designer wishes to have a noun's original position as "(behind the tree)" he would have: POSITION behind the tree in the .DAT file. The verbs PUT/PLACE and GET/TAKE change the noun's position. SINGULAR <-- default is SINGULAR. The only alternative is PLURAL. AGT verbs/pronouns will be singular or plural depending upon this value. 20 NOUN_SYNONYMS <-- default is NONE. If the .DAT file had NOUN_SYNONYMS GOLD COIN COINS then all of these words would be accepted as valid synonyms for this noun. Of course, the "official" NAME will also work. Note: To 'spice' up the game, you might want to put things inside other things initially, so the player has to open everything to be sure s/he doesn't miss anything important. Be logical, though: a refrigerator seems likely to be open-able, but a crabapple probably ought to be 'closed' and 'unclosable' and thus unable to contain something else. Similar to the complete room descriptions, there is a way to specify a lengthy description of a noun by using a NOUN_DESCR in the .DAT file. When the player gives the command to EXAMINE the noun, this description will be displayed on the screen. TEXT If a noun is readable, the description that is printed whenever the player gives the command to READ it is contained in a TEXT description in the .DAT file. Thus, the following would be a valid set of definitions: NOUN 232 Book Red There is a small red book here. WEIGHT 1 SIZE 3 LOCATION 32 READABLE NOUN_SYNONYMS Cover Title END_NOUN NOUN_DESCR 232 The red book is quite thin, and has a hard cover. There is writing on the book's cover. END_NOUN_DESCR TEXT 232 The title of the book is "The Wisdom of Ronald Reagan." The pages are all blank. END_TEXT MULTIPLE NOUNS WITH THE SAME NAME AGT allows multiple nouns with the same name. The parser examines the current room and player environment and assumes that if only one noun with a particular name is in the room then that must be the noun that the player meant as the NOUN or OBJECT of his command. If there is more than one noun with the same name in the room, the parser gives an "error" message and asks the player to be more specific about which NOUN (or OBJECT) he means. For example, if there are three kinds of trees in the "room" and the player had entered the command to EXAMINE TREES, the parser would ask for the clarification: "Which 'TREES', the OLIVE TREES or the OAK TREES or the PINE 21 TREES?" The player could then enter any response with one of the proper adjectives to specify which trees were meant, i.e., any of these responses would tell the parser that the OAK trees were correct: THE OAK TREES EXAMINE THE OAKS OAK THE OAKS, YOU OAF!! If the player still doesn't enter a response with one of the proper adjectives, a message is given that asks the player to re-enter his command using the NOUN's adjective to clarify which NOUN is meant. This means that if there are two or more nouns with the same name, their adjectives must be unique, i.e., you can have a RED BOWL and a GREEN BOWL, but the game should not contain two RED BOWLs (at least it should not have two of them if they can be together in the same room.) PUSH, PULL, TURN, AND PLAY DESCRIPTIONS Similar to TEXT descriptions if a noun is readable, you may also give unique descriptions if a noun is described as being pushable, playable, turnable, or pullable and the player takes one of those actions with the noun. These descriptions are included in the .DAT file as a PUSH_DESCR, PULL_DESCR, TURN_DESCR and PLAY_DESCR. They will be displayed only if the player takes the specified action AND that action does not activate a SPECIAL for the current room. If there is no description provided, a standard ("nothing happens" or something equally appropriate) message is provided. For example, if you want to generate messages whenever the player gives the commands to PLAY RADIO or to TURN ON RADIO or TURN DIAL, you could set up the following in the .DAT file: NOUN 218 Radio Portable There is a large "ghetto blaster" portable radio here. MOVABLE WEIGHT 10 SIZE 10 NOUN_SYNONYMS GHETTO BLASTER DIAL DIALS KNOB KNOBS PLAYABLE TURNABLE END_NOUN NOUN_DESCR 218 The radio is barely portable. It weighs about 47 pounds and must be carried with both hands. It has many dials and knobs. END_NOUN_DESCR PLAY_DESCR 218 As you turn on the radio, you hear a song by "Duran Duran." After a few moments, you become bored with the music and you turn the radio off. END_PLAY_DESCR 22 TURN_DESCR 218 As you turn the dial on the radio, you hear the Beatles singing "Yesterday". This sounds like a good station and you stop turning the dial. The music sounds nice and you sing along softly. END_TURN_DESCR EATING, DRINKING, AND DYING Any object defined as EDIBLE can be eaten. Any object defined as DRINKABLE can be drunk. And any object defined as POISONOUS will kill the player if s/he eats or drinks it. POISONOUS has no effect if the noun is neither edible nor drinkable. In most situations, it is considered poor sport to make completely non-threatening and logically edible things poisonous; it is likewise questionable to make packages of rat poison edible but non-poisonous. When a noun is eaten or drunk it normally disappears (into the player's stomach -- naturally). The only exception to this is when the noun is unmovable. This makes it possible for the player to drink from a lake without having all the water (or the lake itself) disappear. WEIGHT AND SIZE Those values are there for a reason. No player can lift an object heavier than 100, even if it's defined as MOVABLE. Likewise, objects whose size is more than 100 are too awkward to be carried. The total weight the player can carry is 100, so the player cannot carry two 60-weight objects at once. Total size limit is also 100. It is considered poor sport to assign large weight values to feathers and low values to large slabs of steel, but cruel game writers are able to do so. Likewise, a game will be less baffling if small objects (pens, tin cans) have small size values and large ones (desks, cars) are larger. (Remember, of course, that if your scenario puts the player in the role of King Kong or Godzilla, you'd want to scale everything down so s/he might be able to easily carry six cars and a bus but have difficulty with more than one fully-loaded semi or house.) LIGHT AND DARKNESS If a room has a LIGHT value other than 0 (the default), the room will appear pitch black if the player wanders in empty-handed. There are two "types" of lights and two types of darkness. A noun may be defined as being a light by specifying the word IS_LIGHT in its definition; in this case, it will light any dark room defined as LIGHT 1. The light value of 1 in a room definition means that any light will make the room visible. Of course, these "general-purpose" lights must be turned on to light the room, and thus all LIGHTs can be TURNed ON and OFF (or LIGHTed and EXTINGUISHed.). (EXT is an acceptable abbreviation for EXTINGUISH; EX is the abbreviation for EXAMINE.) If the LIGHT value is other than 1 (i.e., LIGHT 218), only the noun with the matching number will make the room's contents visible. This is useful if the darkness comes from something other than an absence of light: for example, a fan might be the only object that makes a smokey room clear enough to see in. A special-purpose light need not be defined as a light (i.e., it doesn't have to be defined IS_LIGHT), nor does it have to be on, to work as a light in a room with that noun as a LIGHT. A noun can function as a special-purpose 23 light for more than one room, but each room can only be lit by one special-purpose light. (A room with a LIGHT value of 1 will be lit by ANY noun defined as IS_LIGHT.) CREATURES Any living thing is identified as a 'creature', and can be either 'friendly' or 'hostile'. Friendly creatures are quite passive; hostile creatures are not quite as friendly. It is recommended that provisions be made for a weapon to kill any hostile creatures. For fairness, that weapon should be accessible by the player before s/he meets the hostile creature. Players should be discouraged from wild and unwarranted killing: i.e., they ought not kill friendly creatures. If no weapon will kill the creature (i.e., if you leave or specify WEAPON as the default value 0), the player cannot kill it. For friendly creatures, you should not lead the player on by making the weapon something unexpected: if the player kindly offers a jelly bean to the friendly creature, it ought not be fatal. Only one weapon can kill any given creature, but the same weapon might be used to kill many creatures. The format in the .DAT file for Creatures, like rooms, are relatively simple: |<-----significant----->|<------ignored------------------------>| | Required: CREATURE nnn <-- nnn is a number from 300 to 399 Name <-- one word name Adjective <-- one word adjective Short one-line description of creature. {optional characteristics} END_CREATURE Optional: LOCATION nn <-- nn is a room number from 1 to 199. {default is 0} WEAPON nn <-- nn is a noun number from 200 to 299 {default is 0} {noun nnn kills this creature} HOSTILE <-- default is friendly THRESHOLD n <-- {n is number of times a hostile creature can be unsuccessfully attacked before it kills the player - default 3} TIME_THRESH n <-- {n is number of turns player can be in the same room with the creature before it kills the player - default value is infinite, or disabled} POINTS nn <-- nn is the number of points player gets for having this creature in the current room, i.e., for "capturing" or "rescuing" the creature. {default is 0} 24 GROUPMEMBER <-- default is NOT a GroupMember. If a creature is specified as a GROUPMEMBER then it will automatically follow the player from location to location once they meet. GENDER <-- default is THING. GENDER may also be specified as MAN or WOMAN. GENDER causes pronouns and verbs to be used that are appropriate to the specific creature. THINGs are ferocious and referred to as "IT". MANs are less ferocious and are referred to as "HE" and "HIM". WOMANs are "SHE" and "HER". CREATURE_SYNONYMS <-- default is NONE. If the .DAT file had CREATURE_SYNONYMS BOB BILLY then all of these names would be accepted as valid synonyms for the creature. Of course, the "official" NAME will also work. NOTE: A player cannot exit a room containing a hostile creature. When killed, creatures are relocated to LOCATION 0. Friendly/non-hostile creatures have no effect on the (Standard Level) game's outcome -- they just add a little "spice" to the game. For example, to define a female Froobious Bandersnatch in room 9, which can be killed with noun 205, we could use the following specifications in the .DAT file: CREATURE 301 BANDERSNATCH FROOBIOUS There is a mommy froobious bandersnatch, looking for her cubs. LOCATION 9 WEAPON 205 THRESHOLD 2 TIME_THRESH 5 WOMAN HOSTILE CREATURE_SYNONYMS BEAST END_CREATURE The thresholds specify that you can try to attack the bandersnatch twice (unsuccessfully) or be in the room with the bandersnatch for 5 turns, before the beast kills you. The player will not be able to leave the room if the Bandersnatch is present, because she is hostile, until the creature has been killed (with weapon 205). To use the weapon to kill the creature, the player would FIRE THE GUN AT THE BANDERSNATCH or SHOOT THE BEAST WITH THE GUN, if the weapon is a gun, or THROW the weapon AT the creature or KILL the creature WITH the weapon, if the weapon is not a gun. The complete EXAMINE description might be contained in the .DAT file as: 25 CREATURE_DESCR 301 The bandersnatch is snorting and drooling. It is a large female and she appears to have misplaced her cubs, which makes her very unpleasant and very dangerous. She seems to harbor few honorable intentions towards you. END_CREATURE_DESCR GROUPS OF CREATURES Creatures can be designated as a member of the "Group" by using the GROUPMEMBER specification. All group members in the current location will automatically move with the player when he/she moves to another location. However, their group status will not effect other aspects of their behavior during the game, i.e., they can still be talked to or killed as individuals. Probably the best known example of an adventure creature following the player once they meet is the Robot Floyd who is the player's constant companion in the Infocom adventure games Planetfall and its sequel Stationfall. The group can have several members, so this feature could be used to beam down a "landing party" consisting of the player, Spock, Sulu, McCoy and Scotty and have them explore the planet as a group in a Star Trek adventure. Part 3 of this manual introduces a variety of meta-commands that enable the game designer to test the status of the group and to manipulate the group in many ways, i.e., add or subtract members, disband the group, send the group off to another location, etc. SPECIALS To 'activate' the special, the player must 'do something' to the noun specified as the room's KEY. This can include turning it, pushing it, pulling it, or playing it (depending on what can be done to the noun as defined). If the proper action is taken on the noun while in the room, the player will be relocated to the room specified in the SPECIAL line and the SPECIAL nn text will be displayed. (If the Special points to the current room, the only effect apparent to the reader will be the display of the SPECIAL text.) For example, to enter the house (by going to the entry hall -- ROOM 14) by pushing the door bell on the porch (ROOM 13) could be done with the following special: ROOM 13 Front Porch . . . SPECIAL 14 (* Entry Hall *) KEY 222 (* Door Bell *) END_ROOM ROOM_DESCR 13 You are standing on the front porch of a large mansion. The doors are about 10 feet high. END_ROOM_DESCR 26 NOUN 222 Bell Door Beside the door in a door bell. . . PUSHABLE UNMOVABLE LOCATION 13 (* Front Porch *) NOUN_SYNONYMS doorbell END_NOUN SPECIAL 14 You boldly push the door bell. Deep inside the house, you hear some chimes that sound vaguely like Big Ben. After a few minutes, the door is opened by a butler dressed in a black morning coat. He says "Good morning, Sir. I will tell the Master that you have arrived." With that, he disappears down the hall. You are left alone in the entry hall of the house. END_SPECIAL ROOM 14 Entry Hall . NORTH 15 . . END_ROOM ROOM_DESCR 14 The entry hall is long and narrow. You can see open doors at the end of the hall to the north. The front doors are behind you to the south. END_ROOM_DESCR "SPECIAL" SPECIALS AGT has two "special" specials: the verbs MAGIC_WORD and CHANGE_LOCATION. These words are used in conjunction with a room synonym declaration to create a "special" for any words the game designer may wish to use (i.e., you are not restricted to PULL, PUSH, TURN and PLAY). For example, the designer may specify that XYZZY and MAGIC_WORD are synonyms in a particular room -- so that if the player gives the command XYZZY in that room, it causes a "special" for that room which might send the player to another room with an appropriate "special" messages being written. CHANGE_LOCATION works the same way except it requires a specific NOUN that is the "key" to the "special" to be present in the room. For example, the game designer might make SHOW a synonym for CHANGE_LOCATION in particular room and make the noun PASS the "key" to the "special" in that room, then whenever the player gives the command SHOW THE PASS TO THE GUARD (in the particular room), the "special" would be executed and a message like "The guard examines your security pass and finds it in order. He opens the steel door and allows you to enter the vault, where you find...." NOTE: In AGT, each room may have only one special. So, you will not be able to have a Magic_Word and another special in the same room. For example, in order to be able to define a special for CLIMB TREE or SCALE TREE to cause the player to go from room 10 to room 15 with a special message, 27 the game designer could use the following specifications in his data file: ROOM 10 Dark Forest . . SPECIAL 15 (* Top of Tree *) KEY 221 (* Oak Tree *) ROOM_SYNONYMS CHANGE_LOCATION CLIMB SCALE END_ROOM NOUN 221 tree oak There is a large oak tree at the edge of the clearing. . . UNMOVABLE LOCATION 10 (* in Dark Forest *) END_NOUN SPECIAL 15 You manage to climb up to the top of the oak tree. END_SPECIAL ROOM 15 Top of Oak Tree . . DOWN 10 (* going DOWN puts you back in the dark forest *) END_ROOM MAGIC_WORD works the same way except, the KEY for the room MUST be zero. For example, if you wish to allow the player to go from room 23 to room 44 when he gives the commands SESAME, SHAZAM or ABRACADABRA you would do it as follows: ROOM 23 Emperor's Tomb . . SPECIAL 44 KEY 0 ROOM_SYNONYMS MAGIC_WORD SESAME SHAZAM ABRACADABRA END_ROOM SPECIAL 44 By saying the magic word $VERB$, you are suddenly transported to the outside of the Emperor's Tomb. You are very lucky to have escaped, because the air in the tomb was almost gone. END_SPECIAL ROOM 44 Outside Tomb Entrance . . END_ROOM 28 In this example, the SPECIAL message uses a very convenient and helpful feature of AGT, namely $VERB$. This causes the original verb to be repeated back in the message, i.e., if the command was SHAZAM, then the special message would be "By saying the magic word shazam, you are suddenly transported..." Similarly, in AGT, the game designer may also have the NOUN, the noun's ADJECTIVE, the PREPOSITION and the OBJECT of the commands repeated back in messages by specifying $NOUN$, $ADJECTIVE$, $PREPOSITION$ and $OBJECT$ within the message text. If a command is being addressed to a character in the adventure, e.g., SCOTTY, BEAM ME UP, the character's name may also be echoed back in a message by using $NAME$. CREATING A TYPICAL ROOM Let's suppose that your game contains a bedroom, connected to a closet, a bathroom, and a hallway. In the bedroom are a lamp, a bed, a dresser, a mirror, and a werewolf. First, you want to define the room itself: ROOM 34 Master Bedroom WEST 33 (33 is the hallway) EAST 35 (35 is the bathroom) NORTHEAST 36 (36 is the closet) END_ROOM A description of the room is appropriate here: ROOM_DESCR 34 This is the master bedroom, where Mommy and Daddy usually sleep. Plainly visible in the room are a bed, a dresser, a lamp, and a large wall mirror. The room smells horrible, as if a large, unclean animal had been here recently. END_ROOM_DESCR Note that this description mentions the nouns that are initially in the room. This is OK, since all of the nouns are UNMOVABLE, but if they could be taken by the player, they should not be described in the room description since they may not be there if the player should return. That werewolf is begging to be described, too: CREATURE 315 Werewolf Black There is a menacing black werewolf here. LOCATION 34 WEAPON 217 <-- Noun 217 will kill it HOSTILE <-- ever met a friendly werewolf? END_CREATURE CREATURE_DESCR 315 The werewolf is about the size of a small horse. Its matted fur stinks, and a sickening smell emerges from its open mouth, through which you can see sharp, large teeth. END_CREATURE_DESCR 29 A HELP message might be given as follows: HELP 34 The werewolf looks dangerous. Perhaps, you should get out of here as fast as you can. END_HELP Finally, each noun within the room ought to be defined and described: NOUN 220 Bed Large There is a large (king-size) bed here. LOCATION 34 UNMOVABLE END_NOUN NOUN_DESCR 220 The bed is quite ordinary. END_NOUN_DESCR NOUN 221 Dresser Wooden There is a large wooden dresser here. LOCATION 34 CLOSABLE CLOSED UNMOVABLE END_NOUN NOUN_DESCR 221 The wooden dresser looks pretty much like most wooden dressers. END_NOUN_DESCR NOUN 222 Lamp Small There is a lamp on the dresser. LOCATION 34 UNMOVABLE END_NOUN NOUN_DESCR 222 The small table lamp is pink and has a green shade. END_NOUN_DESCR NOUN 223 Mirror Strange There is a wall-size mirror here. LOCATION 34 UNMOVABLE END_NOUN 30 NOUN_DESCR 223 As you gaze into the mirror, you sense something unusual about it. It seems to shimmer, and your reflection seems somehow unreal, as if the mirror weren't really there at all. END_NOUN_DESCR Hmm. That mirror seems rather interesting. Maybe you could make a "special" out of it. For example: when the player touches it, s/he is sent to room 50, the mystic cavern of the Wizardess. To do so, you need to add a "special" to room 34 and specify the mirror as its key, and you need to make the mirror touchable. (Note: "touch" and "push" are synonyms -- but, you should use the word "push," not the word "touch," in your definitions.) ROOM 34 Master Bedroom WEST 33 (33 is the hallway) EAST 35 (35 is the bathroom) NORTHEAST 36 (36 is the closet) SPECIAL 50 <-- Special goes to room 50 (cavern) KEY 223 <-- Special activated by touching mirror END_ROOM NOUN 223 Mirror Strange There is a wall-size mirror here. LOCATION 34 UNMOVABLE PUSHABLE <-- Here's how we'll activate the special END_NOUN The player will see room 50's description when s/he gets there, but the SPECIAL text for room 50 will be displayed first: SPECIAL 50 You reach out to touch the mirror, and are shocked to find that your fingers vanish through the surface. Before you can react, you feel yourself drawn forward through the mirror, and into a black nothingness. You look back to try to see the mirror, but everything is black. You are falling, but not very quickly -- it's almost as if you are floating. As you fall, your eyes begin to adjust to the darkness. Then, suddenly, you land on a soft cushion of some sort. As you rest on the cushion, your eyes adjust to the very dim light of this new room. END_SPECIAL (Note that usually, you'd want to have a PUSH_DESCR prepared for when the player touches a noun when it doesn't activate a special, but the mirror can't be moved so it will always activate a special when touched.) SCORING The player's progress in the game is reported in two ways: the number of rooms visited, and the number of points currently held. The player receives the defined number of points for visiting each room (default point value is 0), and for possessing (i.e., carrying, wearing or in the current room or in the treasure room) each noun (or creature with points) when scoring is done. The 31 point defaults for both nouns and creatures are zero. Players get no points for having eaten something, since objects which are eaten or drunk are removed from the game. For best results, it is best to assign a point value to each room which the player arrives at after solving some puzzle. It's also wise to award a few points for out-of-the-way rooms. Objects should only have point values if they can reasonably be expected to be carried at the end of game -- if an object is too heavy to be lifted or moved, it's not logical to assign it a point value. OTHER DATA ITEMS IN THE .DAT FILE INTRODUCTION or INTRO TEXT In the .DAT file, you can include some introductory remarks by using the header INTRO or INTRODUCTION and ending these remarks with END_INTRO. These kinds of remarks are particularly useful for telling the player what has happened prior to his arrival in the game's starting room. The introductory text is displayed during the game's initialization and cannot be re-read later. It also cannot be skipped over. STARTING ROOM A AGT adventure normally starts in room number 2. This location can be over-ridden by specifying an alternative location in the .DAT file. For example, if the .DAT file had: STARTING_ROOM 23 then the game would start in room 23. TREASURE ROOM Normally, the player only gets points for visiting rooms and for possessing treasures (i.e., nouns or creatures with value). However, many classic adventure games use a convention that required the player to bring his various treasures to a "Treasure Room". Probably, the best example of this is the Well House in the original "Colossal Cave" adventure. AGT adds this feature by allowing the game designer to specify a treasure room in the .DAT file as: TREASURE_ROOM 41 (or wherever) Normally, there is no treasure room. This option is only activated if a statement like the above appears in the .DAT file. VERB SYNONYMS To specify verb synonyms, simply create a AGT definition starting with VERB (alone on a line) and ending with END_VERB (alone on a line). For example: 32 VERB KILL STAB CHOP ATTACK STRANGLE CHOKE THROTTLE UP CLIMB ASCEND END_VERB In the above example, if the player types STAB THE DWARF WITH THE KNIFE, AGT will translate the sentence to KILL THE DWARF WITH THE KNIFE and attempt to do so. Synonyms do not replace the original verb, e.g., the verb KILL would also work. Likewise, if the player types CLIMB the game will execute the sentence as if the player had typed UP -- which means that CLIMB DOWN would be translated to UP DOWN which would, of course, confuse the game somewhat and generate an error message which might, in turn, confuse the player. Because the verb synonyms are not actually user-defined verbs, you should think carefully about the possible uses of words you add, to make sure the player won't be confused by the meaning of a word. WARNING: It is NOT possible to define a synonym for a synonym. For example, the following entry would generate an error message: VERB ATTACK CHOKE CHOKE STRANGLE <-- "Verb not recognized - Line ignored" END_VERB Verb synonyms defined as those above are "global" in that they apply in each room of the game. On the other hand, room synonyms apply only in the particular room for which they are defined. Room synonyms take precedence over global synonyms. For example, you could define CHOKE to be a synonym for ATTACK globally (as above), then define CHOKE to be a synonym for PULL in a particular room. If you were in that room, CHOKE would be treated like the verb PULL; outside of that room CHOKE would be treated as if you had input the verb ATTACK. GAME_WIN Acquiring all the points defined in the game doesn't let the player "win," and winning isn't even related to points. If you define a room as GAME_WIN, then the player wins the game upon entering the room, and the game ends and the final score is displayed. It is usually desirable to make that room very difficult to enter and not let the player get there unless he or she has done everything else there is to do. The room description is displayed, so you should put your congratulatory description there. For example: ROOM 21 End of the Rainbow GAME_WIN POINTS 50 END_ROOM ROOM_DESCR 21 At long last, you have reached the end of the rainbow. The pot of gold lies at your feet. You have won the game!! END_ROOM_DESCR 33 Note that is also possible to win the game when a specific Noun is acquired. This is done be putting a GAME_WIN in the Noun's specification. GAME_END If you desire to have the game end, without having the player win, you can use a GAME_END in the room definition. When this is done, the game will end when the player enters the room and the final score is displayed. The room description is also displayed, so you should put any final comments to the player in the room description. For example: ROOM 26 End of the trail GAME_END END_ROOM ROOM_DESCR 26 You have reached the end of the trail. There is no turning back. Sorry, but your adventure is OVER! END_ROOM_DESCR PAGE PAUSES Normally, the game pauses after every 22 lines of text (so that the player can read it), and the player then hits to read more. As you play-test your game, you might try to adjust your paragraph or line spacing so that the page breaks don't come at awkward spots and confuse the player. This is probably most important in the title screen and the INSTRUCTION and INTRO texts; it is less controllable in the individual room descriptions. ORDER OF DEFINITIONS AGT doesn't require that the definitions be in any specific order within the data files. Definitions can be freely mixed throughout your data files. You'll probably want to group items together that logically belong together. That's how the sample games were written. The order of definitions in the file has no effect on game performance, as long as each definition is properly structured. HOW TO INCLUDE COMMENTS IN YOUR AGT DATA FILES Within your data file, you'll probably want to include comments which won't be processed by the game itself, so you'll be able to understand why you did certain things. In general, AGT treats anything it doesn't understand as a comment. Thus, if you have a paragraph of text in between definitions, AGT will usually ignore it. BEWARE: If one of the lines in the paragraph begins with a keyword like "noun" or "text," AGT will probably decide that it's the beginning of a definition and get confused. 34 To avoid this, you can use a nonsense word to start each line of a comment: words like "REM" (for remark) are useful since they also clearly state what the line is. AGT ignores most punctuation completely, so using "comment" indicators like "(*" and "*)" or { and } at the beginning of a line won't help. However, using these kinds of comment indicators will make your game files easier to read. AGT usually only sees alphabetic characters ('a'..'z' and 'A'..'Z') or the digits ('0'..'9'). CREATING YOUR SOURCE DATA FILES WITH WORD PROCESSORS When creating your source data files for your AGT game, you must use a word processor which creates plain ASCII/DOS text files with a true carriage return at the end of each line. Lines longer than 80 characters, and WordStar document files, will cause AGT to abort! The best rule-of-thumb is to use the MS-DOS "TYPE" command to view the file. If it looks normal, it's probably OK for AGT. If words split at the end of the line and strange characters appear, it's probably not OK for AGT. 35 PART 3: USING META-COMMANDS IN PROFESSIONAL LEVEL ADVENTURE GAMES Before discussing meta-commands in detail, it is convenient to present a quick overview of other changes in Professional Level games. The principal changes are the addition of custom user-defined verbs and Maximum_Score to the .DAT file (NOTE: everything else about the .DAT files as previously presented still applies in Professional Level games), the addition of a .MSG file to hold your unique output messages, and the addition of a .CMD file to hold your game's meta-commands. Each of this will be presented below in separate sections. CUSTOM USER-DEFINED VERBS Custom user-defined verbs are defined very much like "Verb Synonyms". For example, the following lines in the .DAT file will define several new verbs (and synonyms): VERB Dummy_Verb1 KISS HUG LOVE CARESS Dummy_Verb2 GO CLIMB CROSS Dummy_Verb3 CUT CHOP BREAK CRACK BUST Dummy_Verb4 JUMP LEAP Dummy_Verb5 SEARCH FIND END_VERB AGT adds 50 "dummy verbs" (Dummy_Verb1 ... Dummy_Verb50) to the list of valid verbs. These dummy verbs are then redefined as if they had synonyms in statements like the ones above. These user-defined verbs are then used in meta-commands to specify new conditional tests and appropriate actions. For example, the following meta-commands (in the .CMD file) would allow the player to CLIMB a tree and to CROSS a bridge: COMMAND CLIMB TREE InRoom 208 (* sturdy oak tree *) GoToRoom 36 (* in branches at top of oak tree *) PrintMessage 43 (* You climb up to the top of the tree. *) DoneWithTurn END_COMMAND COMMAND CROSS BRIDGE AtLocation 23 (* West side of bridge *) GoToRoom 24 (* East side of bridge *) PrintMessage 44 (* You walk across the bridge to the other side. *) DoneWithTurn END_COMMAND COMMAND CROSS BRIDGE AtLocation 24 (* East side of bridge *) GoToRoom 23 (* West side of bridge *) PrintMessage 44 (* You walk across the bridge to the other side. *) DoneWithTurn END_COMMAND The above meta-commands could also have been done by CHANGE_LOCATION specials. However, custom verbs and meta-commands can also be used to create more unusual situations, like these meta-commands for processing the user's input to KISS or HUG something: 36 COMMAND KISS PRINCESS InRoom 305 (* Princess *) AtLocation 99 (* Bridal Suite of palace *) PrintMessage 45 (* The princess melts into your strong arms, etc. *) PlusScore 25 (* Bonus for Kiss *) WinGame (* Win the game *) DoneWithTurn END_COMMAND COMMAND KISS PRINCESS InRoom 305 (* Princess *) NOT AtLocation 99 (* Not in Bridal Suite of palace *) PrintMessage 46 (* The princess pushes you away coyly, "Not here!" *) DoneWithTurn END_COMMAND COMMAND KISS TROLL InRoom 307 (* Ugly Troll *) PrintMessage 47 (* The troll kills you! *) KillPlayer (* That will teach you to KISS THE TROLL!! *) DoneWithTurn END_COMMAND COMMAND KISS ANY NOUNpresent (* NOUN (whatever it is) is here *) PrintMessage 48 (* You try to $VERB$ the $NOUN$ for awhile. *) MinusScore 10 (* penalty for sick mind *) DoneWithTurn END_COMMAND COMMAND KISS ANY PrintMessage 49 (* The $ADJECTIVE$ $NOUN$ isn't here! *) MinusScore 10 (* penalty for sick mind *) DoneWithTurn END_COMMAND Meta-commands are processed in the order encountered in the .CMD file, so the last two KISS ANY commands represent "default" commands and would be activated only if you weren't trying to KISS, HUG, etc. the PRINCESS or the TROLL. For example, if you gave the input "KISS THE BLARNEY STONE", the game would respond with "You try to kiss the stone for a while" (Message number 48 in the .MSG file) or "The blarney stone isn't here!" (Message number 49) depending upon if the Blarney stone is present at your current location or not. MAXIMUM_SCORE AGT allows the score to be manipulated via meta-language commands. For example, using meta-language commands, one could adjust the score whenever the player: -- Accepts a hint -- Solves a particularly difficult puzzle -- Gives the correct answer to a riddle -- Performs a daring and/or noble act The score can be manipulated either positively or negatively in this way. 37 Since in AGT you may add (or subtract) points from your score via your deeds, the maximum score for the game will often be different from the sum of the scores for visiting rooms and possessing objects. In this situation, you will need to specify a maximum score for the game in the .DAT file. For example, to have a maximum score of 350 points for the game you would put the following statement in the game's .DAT file: MAXIMUM_SCORE 350 .MSG -- MESSAGE FILES A file with the suffix of .MSG can contain up to 250 messages that are used by various meta-language commands. The format for each message is straight- forward text as follows: MESSAGE 4 "Oh, NNOOO!! Not the dog!", he cried hysterically. END_MESSAGE . . MESSAGE 87 As you say $VERB$ into the microphone, the security door slides open noiselessly. You hurry into the vault. The door closes behind you. END_MESSAGE The messages need not be in numerical order, but it helps for debugging. In any message, the game designer can use $VERB$, $NOUN$, $ADJECTIVE$, $PREPOSITION$, $OBJECT$ and $NAME$ wherever he wants to have the original verb, the noun, the noun's adjective, the preposition, the objective of the preposition or the name of the person the command is addressed to (if any) echoed back in a message. $VERB$ uses the original verb which is input by the player, not the verb for which it may be a synonym, e.g., if SPEAK is a synonym for TALK and you input the verb SPEAK, the above MESSAGE 87 would output "As you speak into the microphone..." A TYPICAL GAME TURN FOR PROFESSIONAL LEVEL GAMES Before launching into a detailed discussion of meta-commands, it will be helpful to review what happens during a typical turn in a AGT game. This is illustrated in the following diagram: 38 > Get Player's Input Command < V Parse into Addressee's Name (if any), then Noun, Verb, Prep, Obj V Any YES Give Errors > Error ? Message NO V Any Meta- NO Language Commands ? YES V Do meta-commands for ANY Words V YES All < Done ? NO V Do meta-commands for Input Words V YES All < Done ? NO V Do Standard AGT routine for Verb < The meta-command boxes shown above are for Professional Level AGT games only. 39 Now for a brief description of what these meta-command boxes do in an AGT game. The first meta box represents the process of testing for conditions and performing various actions that do not depend on the player having given a specific Addressee-Verb-Noun-Object combination, i.e., conditions and actions for ANY words. These kinds of situations are typically "random" events, such as, (1) having a dwarf appear in the room and throw an axe at the player, or (2) having a bear (that the player has befriended) follow him into a new room, or (3) having a voice boom out an announcement that "The Cave will close in 25 turns", or (4) having the player die because of some random event (e.g., falling into a pit). During each turn, these ANY-words meta-commands are checked to see if the commands' conditions are true and (if true) the meta-commands' designated actions are taken. This ANY-words process occurs before any specific vocabulary-dependent meta-commands are executed. Often, the results of these ANY-words events will make subsequent actions unnecessary and/or inappropriate. For example, if a player dies a horrible death by a random dwarf attack, finishing the player's specific command like GET GOLD or EXAMINE BOOK is certainly inappropriate. Here are a few examples of typical ANY Meta-Commands: COMMAND ANY Present 210 (* Blazing torch is here *) CounterGT 2 75 (* Torch has been lit for at least 75 turns *) PrintMessage 21 (* Your torch is flickering and growing weaker *) CounterEquals 2 100 (* Torch has been lit for 100 turns *) PrintMessage 22 (* The torch finally goes out! *) TurnCounterOFF 2 (* Torch has gone out, so turn torch counter OFF *) SwapLocations 210 211 (* swap blazing torch for unlit torch *) END_COMMAND COMMAND ANY NOT Present 312 (* Angry guard is not in room (yet) *) Chance 10 (* 10 % chance of guard appearing *) PutInCurrentRoom 312 (* put guard in room *) PrintMessage 23 (* An angry guard suddenly storms into the room! *) END_COMMAND COMMAND ANY FlagON 5 (* Flag 5 is ON if player has befriended parrot *) PutInCurrentRoom 306 (* Once befriended, parrot stays with player *) VerbIsDirection (* Player is going to new room *) PrintMessage 24 (* The parrot flies after you and lands nearby. *) END_COMMAND COMMAND ANY InRoom 306 (* The parrot is here *) FlagOFF 4 (* Parrot is thirsty if Flag 4 is OFF *) Chance 5 (* 5 % chance of parrot talking *) PrintMessage 25 (* The parrot squawks "Polly wants a beer!" *) END_COMMAND COMMAND ANY InRoom 308 (* A vampire bat is here *) Chance 5 (* 5 % chance of being bitten *) PrintMessage 26 (* The vampire bat bites you on the neck!! *) KillPlayer (* Too bad, but vampire bat bites are fatal! *) DoneWithTurn (* No further process for this turn *) END_COMMAND 40 If the ANY-words meta-commands have not drastically changed the player's status in the game, then specific Addressee-Verb-Noun-Object combination meta-commands are tested and (if the conditions are true) the designated actions are taken. Using these meta-commands is the way that the game designer can use unique verbs (that are not predefined in AGT). For example, the game designer could specify a meta-command for KISS PRINCESS that would first check that the princess was in the room, and (if she was) print a message like "The princess rudely pushes you away, straightens her crown and loudly says, 'Stop the hanky-panky, buzzard breath!'" The word ANY may be substituted for the Verb, or the Noun, or the Object in a meta-command. For example, a meta-command for ATTACK ANY might be used to specify a "default" response for the verb ATTACK, such as, printing a message like "Don't be ridiculous, $VERB$ing the $NOUN$ is really sick!" If the player entered the command ATTACK THE DOOR, the response would be "Don't be ridiculous, attacking the door is really sick!" Meta-commands can also be used to supplement or replace standard verb processing. For example, a meta-command could be used for verbs like READ, GET, EAST, etc. This type of substitution of meta-commands for standard verbs could be used to (1) cause a key to fall out of a book the first time the player gave the command to GET BOOK, (2) cause a player to go into a hallucinatory state (i.e., a new room) whenever he gives the command DRINK THE STRANGE LIQUID, or (3) cause a player to fall to his death on the rocks far below if he gives the command NORTH (where there is a cliff to the north in the current room). If after doing both the ANY-words and the specific vocabulary meta-command processing for a specific game turn, the player is still alive and further AGT command processing is still appropriate, then the usual routine for the player's verb is executed (if the input VERB is a standard AGT verb). This will be the way that the most of the player's inputs will be handled! Remember, most player commands in a typical adventure game deal with manipulating items (GET, DROP, EXAMINE, READ, etc.) and traveling from room to room (NORTH, SOUTH, UP, EXIT, etc). Standard Level AGT handles these types of commands quite nicely, and there will seldom be a need for meta-commands for this type of typical player input. INTRODUCTION TO META-COMMANDS Meta-commands are specified in the .CMD file. The .CMD file can hold up to 400 meta-commands. This capacity will enable the game designer to develop some very sophisticated adventure games -- especially since the a majority of a player's input will not require any meta-commands at all. 41 THE FORMAT OF META-COMMANDS A typical meta-command in the .CMD file might look like this: COMMAND BREAK LOCK InRoom 208 (* Oak door with iron lock *) NOT InRoom 307 (* Evil Wizard is not in room *) IsCarrying 223 (* Battle Axe *) OR Present 246 (* Large Two-handed Sword *) VariableGT 7 90 (* Player has enough strength to swing sword *) FlagON 3 (* Sword has been pulled free from stone *) OR IsCarrying 221 (* Iron Mace *) VariableGT 7 50 (* Player has enough strength to swing mace *) SwapLocations 208 209 (* Swap locked oak door with open doorway *) PrintMessage 86 (* Your blows break the lock and door swings open *) ChangePassageway 1 25 (* open passage North (Dir 1) to room 25 *) DoneWithTurn (* No further process for this turn *) END_COMMAND Each meta-command begins on a separate line with the keyword COMMAND. Following this is the input phrase for which this meta-command applies. The input phrase will be parsed, so you can use extra words for clarity. After being parsed, AGT will only remember the ADDRESSEE (if there is one), the VERB, the NOUN and the OBJECT of the COMMAND. If one of these is missing, there is an implied ANY for the missing item. For example, the "BREAK LOCK" above is missing an OBJECT (and a preposition), so an implied OBJECT of ANY is recorded for this COMMAND. Because of this implied object of ANY, this meta-COMMAND would be considered for any of the following player inputs: BREAK LOCK BREAK THE LOCK WITH MACE BREAK LOCK WITH THE LARGE SWORD BREAK LOCK WITH AXE BREAK LOCK WITH ROCK (will not produced desired result) BREAK LOCK WITH DWARF'S HEAD (will not produced desired result) If the COMMAND is an ANY meta-command, the word ANY will be the only word follow the word COMMAND. The end of the meta-command is signalled by END_COMMAND on a separate line. Between COMMAND and END_COMMAND are a series of conditional tests and actions to be performed. Each condition or action appears on a separate line. The first word of the action or condition line is the "Token", or abbreviation for the action or condition. AGT allows 155 such tokens. These tokens are a short-hand description of what condition is being tested or what action is to be performed. The tokens are normally shown with each of the separate words of the short-hand description capitalized, e.g. PrintMessage. This is only for better readability. Internally, AGT does not distinguish between upper and lower case in tokens. There may be some numerical parameters on the line following the token. The number of parameters varies from none to two depending upon the specific token. For example, the token "KillPlayer" has no numerical parameters; the token "PrintMessage" requires one numerical parameter (i.e., the number of the message to be printed); the token "SwapLocations" requires two numerical parameters (i.e., the two item numbers of the items to have their locations 42 switched). Following the parameters (if any) on the line is space for comments. It is recommended that meta-commends be very well commented and that the comments be written as the meta-commands are first written. Don't try to document them afterwards -- because you'll never get around to really doing it! For added clarity, comments should be set off by some type of delimiter, such as, "(*", "*)" or "{", "}" or a preceding ";". If a conditional token is preceded on the line with the word "NOT", the sense of the conditional test is reversed, i.e., NOT InRoom 307 tests that creature number 307 (the evil wizard) is NOT in the current room. The token OR may be used to connect two or more separate conditional tests within a meta-command. The overall test will be TRUE if any of the individual OR conditions is TRUE. In the above example, the sequence IsCarrying 223 (* Battle Axe *) OR Present 246 (* Large Two-handed Sword *) VariableGT 7 90 (* Player has enough strength to swing sword *) FlagON 3 (* Sword has been pulled free from stone *) OR IsCarrying 221 (* Iron Mace *) VariableGT 7 50 (* Player has enough strength to swing mace *) tests if the player is carrying or has access to one (or more) of the heavy weapons which is capable of breaking the lock on the door. If there isn't an OR token between two conditions, there is an implied AND condition between successive conditions. The end of the series of OR's is determined when AGT encounters the first Action token following the first OR. For example, the above meta-command might be rewritten in pseudo-PASCAL as: IF (Verb = 'BREAK') AND (Noun = 'LOCK') THEN (* "BREAK LOCK" *) IF InRoom(208) THEN (* Locked oak door is here *) IF (NOT InRoom(307)) THEN (* Wizard not here *) IF IsCarrying(223) (* Player has means to break door *) OR (Present(246) AND (Variable[7] > 90) AND FlagON[3]) OR (IsCarrying(221) AND (Variable[7] > 50)) THEN BEGIN SwapLocations(208,209); (* Swap open doorway for locked door *) PrintMessage(86); (* Print appropriate message *) ChangePassageway(1,25); (Open passage north to room 25 *) DoneWithTurn := TRUE; (* Nothing more for this turn *) END; When processing a meta-command, AGT starts at the first action or condition and continues to process each token until one of the conditions within the meta-command is not met, i.e., it is FALSE, then AGT skips to the next meta-command within the .CMD file. For example, consider the following: 43 COMMAND ANY Present 210 (* Blazing torch is here *) CounterGT 2 75 (* Torch has been lit for at least 75 turns *) PrintMessage 21 (* Your torch is flickering and growing weaker *) CounterEquals 2 100 (* Torch has been lit for 100 turns *) PrintMessage 22 (* The torch finally goes out! *) TurnCounterOFF 2 (* Torch has gone out, so turn torch counter OFF *) SwapLocations 210 211 (* swap blazing torch for unlit torch *) END_COMMAND In this meta-command, Counter number 2 is used to keep track of the number of turns that the torch has been blazing. If the blazing torch isn't being carried by the player or in the current room, the very first condition is FALSE and AGT would skip ahead to the next meta-command -- i.e., no further tokens in this meta-command would be considered. However, if the blazing torch was present in the room, AGT would consider the second condition, specifically, if the torch has been blazing for more than 75 turns. If it has, then the next token would cause message 21 to be printed. Then the next token would test if the torch has been blazing for exactly 100 turns. If it hasn't, then AGT skips ahead to the next meta-command in the .CMD file. If the torch has been blazing for exactly 100 turns, then the last three tokens (all action tokens) are processed and message 22 is printed, the blazing torch counter is turned OFF, and an unlit torch (noun number 211) is swapped for the blazing torch (noun number 210). For example, the above meta-command might be rewritten in pseudo-PASCAL: IF (Verb = 'ANY') THEN (* ANY and ALL commands *) IF Present(210) THEN (* Blazing torch *) IF (Counter[2] > 75) THEN (* Torch burning for more than 75 turns *) BEGIN PrintMessage(21); (* The torch is growing weaker. *) IF (Counter[2] = 100) THEN (* Torch burning exactly 100 turns *) BEGIN PrintMessage(22); (* The torch goes out. *) TurnCounterOFF(2); (* Turn burn counter off *) SwapLocations(210,211); (* Swap for unlit torch *) END; END; META-COMMANDS CONDITIONAL TESTS The are a total of 84 separate condition tokens in AGT. Since each of this conditions may be prefaced by a NOT condition, there are actually a total of 168 conditional tests possible within a meta-command. These conditional tests divide into several logical groups: - Tests about the player's status and/or condition - Tests about the status/condition of specific item(s) - Tests about the status/condition of the current NOUN - Other miscellaneous tests Let's consider each of these logical groups in order. First, tests about the player's status and/or condition: *********************** PLAYER CONDITIONS ****************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= 44 AtLocation 1 Location# Player is located at room Location# AtLocationGT 1 Location# Player is in room greater than Location# AtLocationLT 1 location# Player is in room less than Location# FirstVisitToRoom 0 None First visit to current room IsCarryingSomething 0 None Player is carrying something IsCarryingNothing 0 None Player is carrying nothing IsCarryingTreasure 1 Points# Player is carrying at least one item that is worth at least Points# IsWearingSomething 0 None Player is wearing something IsWearingNothing 0 None Player is wearing nothing LoadWeightEquals 1 Number Player's load weighs equals Number LoadWeightGT 1 Number Player's load weighs more than Number LoadWeightLT 1 Number Player's load weighs less than Number NewLife 0 None Player has just been resurrected or it is the start of the game All these tokens test conditions about the player current status, i.e., where he is/isn't located, if he is/isn't wearing or carrying something, and if his current load weighs a certain amount. All these conditions are obvious except for IsCarryingTreasure 10 (* Has something worth at least 10 points *) which might be used to test whether it is appropriate to have some type of thief (randomly) rob the player of his valuables. The second group of conditions test the status of various items or nouns: *********************** ITEM(S) CONDITIONS ***************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= Present 1 Item# Item# is in room, carried or worn IsWearing 1 Item# Item# is being worn IsCarrying 1 Item# Item# is being carried IsNowhere 1 Item# Item# is located NOWHERE (room 0) IsSomewhere 1 Item# Item# is located somewhere (not in 0) InRoom 1 Item# Item# is located in current room IsLocated 2 Item# Loc# Item# is located in room Location# Together 2 Itm1# Itm2# Itm1# and Itm2# are in same place IsON 1 Item# Item# is ON IsOFF 1 Item# Item# is OFF IsOpen 1 Item# Item# is Open IsClosed 1 Item# Item# is Closed IsLocked 1 Item# Item# is Locked IsUnLocked 1 Item# Item# is UnLocked IsEdible 1 Item# Item# is Edible IsDrinkable 1 Item# Item# is Drinkable IsPoisonous 1 Item# Item# is Poisonous IsMovable 1 Item# Item# is Movable IsGroupMember 1 Item# Item# is a member of the group All but two of the above tokens require one parameter: the number of the item for which the conditional test is being considered. Examples of these two exceptions are: IsLocated 205 34 (* Tests if Noun number 205 is in Room 34 *) Together 256 257 (* Tests if Nouns 256 and 257 are together *) 45 The next group of conditional tokens is similar to the above except that they are tests for the current NOUN which has been input, not a specific item: ************************ NOUN CONDITIONS ******************************* Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= NOUNPresent 0 None NOUN is in room, carried or worn NOUNIsWearing 0 None NOUN is being worn NOUNIsCarrying 0 None NOUN is being carried NOUNIsNowhere 0 None NOUN is located NOWHERE (room 0) NOUNIsSomewhere 0 None NOUN is located somewhere (not in room 0) NOUNInRoom 0 None NOUN is located in current room NOUNIsLocated 1 Location# NOUN is located in room Location# NOUNIsON 0 None NOUN is ON NOUNIsOFF 0 None NOUN is OFF NOUNIsOpen 0 None NOUN is Open NOUNIsClosed 0 None NOUN is Closed NOUNIsLocked 0 None NOUN is Locked NOUNIsUnLocked 0 None NOUN is UnLocked NOUNIsEdible 0 None NOUN is Edible NOUNIsDrinkable 0 None NOUN is Drinkable NOUNIsPoisonous 0 None NOUN is Poisonous NOUNIsMovable 0 None NOUN is Movable NOUNpointsEquals 1 Number NOUN's points equal Number NOUNpointsGT 1 Number NOUN's points are greater than Number NOUNpointsLT 1 Number NOUN's points are less than Number NOUNweightEquals 1 Number NOUN's weight equals Number NOUNweightGT 1 Number NOUN's weight is greater than Number NOUNweightLT 1 Number NOUN's weight is less than Number The above tokens are especially useful if the game designer wants to create his own unique standard default responses to situations, rather than relying on the normal AGT responses. For example, below are new default responses for the verb GET: COMMAND GET ANY NOUNInRoom (* NOUN is in current room *) NOUNIsMovable (* NOUN can be moved *) LoadWeightLT 90 (* carrying less than 90 pounds *) NOUNweightLT 11 (* NOUN is less than 11 pounds *) GetNOUN (* Add NOUN to items being carried *) PrintMessage 1 (* You add the $NOUN$ to your load. *) DoneWithTurn (* Nothing more required for this turn *) END_COMMAND COMMAND GET ANY NOUNIsCarrying (* NOUN is currently being carried *) PrintMessage 2 (* You already have it, Stupid! *) DoneWithTurn (* Nothing more required for this turn *) END_COMMAND COMMAND GET ANY NOT NOUNPresent (* NOUN is NOT present *) PrintMessage 3 (* The $NOUN$ isn't here, you oaf! *) DoneWithTurn (* Nothing more required for this turn *) END_COMMAND 46 COMMAND GET ANY NOT NOUNIsMovable (* NOUN cannot be moved *) PrintMessage 4 (* Sorry, but the $NOUN$ cannot be moved! *) DoneWithTurn (* Nothing more required for this turn *) END_COMMAND COMMAND GET ANY NOUNIsMovable (* NOUN can be moved *) LoadWeightGT 89 (* carrying 90 pounds or more already *) PrintMessage 5 (* Your load is too heavy to carry the $NOUN$. *) DoneWithTurn (* Nothing more required for this turn *) END_COMMAND A series of COMMANDS like these is processed sequentially by their order of appearance in the .CMD file. As a result, the COMMAND's order is very important! For example, if the player gave the input GET STATUE and the statue was not in the room and was also not movable, the error message "The statue isn't here, you oaf!" would be printed rather than "Sorry, but the statue cannot be moved!" because of the order of their respective COMMANDS above (or in the .CMD file). The last group of conditional tokens is a catch-all: ******************** MISCELLANEOUS CONDITIONS ************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= NamePresent 0 None Addressee is present in current room NameIsNumber 1 Number Addressee is Creature or Noun number LightPresent 0 None Current room has necessary light RoomNeedsLight 0 None Current room needs a light FlagON 1 Flag# Flag# is ON FlagOFF 1 Flag# Flag# is OFF ScoreEquals 1 Number Current score is equal to Number ScoreGT 1 Number Score is greater than Number ScoreLT 1 Number Score is less than Number NumberEquals 1 Number Number input is equal to Number NumberGT 1 Number Number is greater than Number NumberLT 1 Number Number is less than Number AnswerIsCorrect 0 None Last answer was correct AnswerIsWrong 0 None Last answer was wrong TurnsEquals 1 Number Number of turns is equal to Number TurnsGT 1 Number Number of turns is greater than Number TurnsLT 1 Number Number of turns is less than Number CounterEquals 2 Ctr# Number Counter# is equal to Number CounterGT 2 Ctr# Number Counter# is greater than Number CounterLT 2 Ctr# Number Counter# is less than Number VariableEquals 2 Var# Number Variable# is equal to Number VariableGT 2 Var# Number Variable# is greater than Number VariableLT 2 Var# Number Variable# is less than Number CompareVariables 2 Var#1 Var#2 Variable#1 is less than Variable#2 VariableChance 2 Var# Number Variable# is less than a random number from 1 to Number Chance 1 Percent Odds percent, i.e., 10 % chance of TRUE PromptForYES 0 None Prompts for Y or N -- TRUE if Yes PromptForNO 0 None Prompts for Y or N -- TRUE if No 47 VerbIsDirection 0 None Verb is movement or direction Just a few words of explanation about a couple of these. PromptForYES and PromptForNO cause the player to be queried and to respond by entering a YES (or Y) or NO (or N) on the keyboard. These conditions are then TRUE or FALSE depending upon the what is entered. These tokens are particular useful when you want to ask the player a question that requires a YES or NO answer like whether he would like a hint. AnswerIsCorrect and AnswerIsWrong are similar tokens for asking questions which do not have YES and NO answers like asking a riddle. An example of how to ask a trivia question will be given later in this document. The number referenced by the NumberEquals, NumberGT and NumberLT is a number that the player inputs via the keyboard in response to a GetNumberInput action token. An example of this sequence of events will be given later. The game designer has 255 Flags (1 to 255) which can be tested for being ON or OFF respectively by the FlagON and FlagOFF tokens. There are 9 Counters (1 to 9) and 9 Variables (1 to 9) which can also be tested by various tokens described above. How to set these Flags, Counters and Variables will be described in the section on ACTION tokens below. META-COMMANDS ACTION TOKENS There are a total of 71 separate action tokens in AGT. These actions divide into several logical groups: - Actions involving the player - Actions involving specific item(s), the NOUN or locations - Other miscellaneous actions Let's consider each of these logical groups in order. First, actions involving the player: ********************** PLAYER ACTION TOKENS ******************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= GoToRoom 1 Location# Send player to Location# GoToRandomRoom 2 Loc#1 Loc#2 Randomly pick a room between Loc#1 and Loc#2 and send player to it GetIt 1 Item# Item# is now being carried WearIt 1 Item# Item# is now being worn DropIt 1 Item# Drop Item# into current room RemoveIt 1 Item# Remove Item# and drop into room GetNOUN 0 None NOUN is now being carried WearNOUN 0 None NOUN is now being worn DropNOUN 0 None Drop NOUN into current room RemoveNOUN 0 None Remove NOUN and drop into room DropEverything 0 None Drop all items being carried RemoveEverything 0 None Remove all items being worn KillPlayer 0 None Make player dead at end of turn These actions are all straight-forward. 48 A WORD OF WARNING: When AGT encounters and processes an action token, it is done without fanfare or logical checking. For example, if the actions DropIt 204 (* Put the Rubber Ducky in the room *) WearNOUN (* Put on or Wear NOUN *) are encountered, they are done without checking whether the player is carrying the Rubber Ducky currently or if the NOUN is something that might be logically worn. The game designer is warned that this kind of logical checking before taking actions is his responsibility -- not AGT's! The second group of actions involve items, nouns and locations: ******************* ITEM/NOUN/LOCATION ACTION TOKENS *********************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= PutInCurrentRoom 1 Item# Put Item# in current room PutNOUNInCurrentRoom 0 None Put NOUN in current room SendToRoom 2 Item# Loc# Put Item# in room Location# SendNOUNToRoom 1 Location# Put NOUN in room Location# SendAllToRoom 1 Location# Send all carried items to Location# SendTreasuresToRoom 2 Loc# Point# Send all carried items whose points > Point# to Loc# Destroy 1 Item# Item# is now NOWHERE (in room 0) DestroyNOUN 0 None NOUN is now NOWHERE (in room 0) SwapLocations 2 Itm#1 Itm#2 Swap locations of Item#1 & Item#2 SendToItem 2 Itm#1 Itm#2 Put Itm#1 in location of Itm#2 SendNOUNToItem 1 Item# Put NOUN in location of Item# OpenIt 1 Item# Item# is now open CloseIt 1 Item# Item# is now closed LockIt 1 Item# Item# is now locked UnlockIt 1 Item# Item# is now unlocked OpenNOUN 0 None NOUN is now open CloseNOUN 0 None NOUN is now closed LockNOUN 0 None NOUN is now locked UnlockNOUN 0 None NOUN is now unlocked AddToGroup 1 Item# Adds Item# to group RemoveFromGroup 1 Item# Removes Item# from group MoveGroup 1 Location# Move group to Location# Several of these deserve some explanation. SendTreasureToRoom is useful when the game designer wishes to have the player's current treasures or valuables stolen or disappear. For example: SendTreasureToRoom 28 9 (* send valuables to room 28 *) would cause any items that were being currently carried and had point values of 10 or more to be sent to room 28. Items being carried with values of 9 or less would continue to be carried. The conditional token IsCarryingTreasure can be used to test whether such a "theft" is appropriate. The SwapLocations action token is very useful whenever the game designer wishes to change the status or condition of an item. For example, this action can be used to replace a closed door with an open door, or to replace an egg with egg shell pieces (when the player gives the input BREAK EGG), or to 49 replace a small plant with a larger plant (when the player inputs the command WATER PLANT), or to replace a frog with a handsome prince (when the player inputs KISS FROG). A very useful and powerful token! The last group of actions do a variety of tasks: ******************* MISCELLANEOUS ACTION TOKENS **************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= ShowScore 0 None Show current SCORE PlusScore 1 Number Add Number to current SCORE MinusScore 1 Number Subtract Number from current SCORE ShowInventory 0 None Show current INVENTORY WaitForReturn 0 None Print 'Hit RETURN' message and wait TimePasses 0 None Show 'Time passes...' message Delay 1 Number Delay for Number seconds ClearScreen 0 None Clear screen DescribeThing 1 Number Describe thing Number (whatever) LookAtRoom 0 None Cause a VERBOSE look at room Tone 2 Hz Ms Makes a tone on speaker of Hz Hertz (440 Hertz = A on piano) for Ms milliseconds PrintMessage 1 Number Print message Number in .MSG file RandomMessage 2 Num1 Num2 Randomly picks a message from Num1 to Num2 in .MSG file and prints it BlankLine 0 None Print a blank line GetNumberInput 2 Num1 Num2 Prompt for player to input a Number where Num1 <= Number <= Num2. If Num1=Num2, then no range will be given in prompt. AskQuestion 1 Question# Ask and get answer to question# ChangePassageway 2 Dir# Loc# Create or close a passageway from current_room to Loc# via Dir#. Dir# = 1 = north ... Dir # = 12 = exit. If Loc# = 0 then closes passageway. If Loc# <> 0 then opens passageway to room Loc# via direction Dir#. Passageways are opened or closed at both ends simultaneously! TurnFlagON 1 Flag# Turn Flag# ON TurnFlagOFF 1 Flag# Turn Flag# OFF ToggleFlag 1 Flag# Toggle Flag# TurnCounterON 1 Counter# Turn Counter# ON -- sets to 1 TurnCounterOFF 1 Counter# Turn Counter# OFF -- sets to 0 SetVariableTo 2 Var# Number Set Variable Var# to Number AddToVariable 2 Var# Number Add Number to Var# SubtractFromVariable 2 Var# Number Subtract Number from Var# AddVariables 2 Var#1 Var#2 Add Var#2 and Var#1 and put answer into Var#1 SubtractVariables 2 Var#1 Var#2 Subtract Var#2 from Var#1 and put answer into Var#1 RandomVariable 2 Var# Number Set Var# to a random number between 1 and Number NounToVariable 1 Var# Set Var# to value of noun ObjectToVariable 1 Var# Set Var# to value of object WinGame 0 None Player wins game at end of turn EndGame 0 None Game ends at end of turn QuitThisCMD 0 None Quit evaluating this CMD 50 QuitAllCMDs 0 None Finished with all meta-commands DoneWithTurn 0 None All Done this turn -- get input next ReDirectTo 0 None See explanation that follows below. SPECIAL META-COMMAND SITUATIONS There are some very powerful (and potentially confusing) actions above! Some words of explanation and some examples are in order. Specific topics to be covered below are Flags, Counters, Variables, Number Input, Asking and Answering Questions, Opening and Closing Passageways Between Rooms, and Meta- command Redirection. FLAGS The game designer has 255 Flags at his disposal. They are turned on with the TurnFlagON token, turned off with the TurnFlagOFF token and toggled with the ToggleFlag token. They are tested with the FlagON and FlagOFF condition tokens. The game designer should take great care in selecting and documenting his use of Flags. Always, explain what each Flag stands for and what the ON and OFF conditions mean in comments at the beginning of the .CMD file! Whenever you change the condition of a Flag explain what this new condition stands for in the game! When the game starts, all Flags are OFF. This fact can be used to test if certain initial actions should be taken, such as, making sure the flashlight's batteries are fresh. When the game is SAVEd and RESTOREd the condition of the Flags, Counters and Variables is also SAVEd and RESTOREd. DEBUG FLAG There is a Flag number 0 which is used by AGT to toggle the debugging mode of meta-commands. When Flag 0 is ON then each meta-command being considered will be output to the screen. By giving the input command SCRIPT you can also route this information to the printer. This capability can be invaluable when you are trying to fathom a complex meta-command "bug". The best way to use this capability in your game is to define a custom verb like DEBUG in the verb synonym section of the .DAT file and then define a meta-command like: COMMAND DEBUG ToggleFlag 0 (* Toggles meta-command Debug mode *) DoneWithTurn (* Finished with this turn *) END_COMMAND Both the sample games CAVE and CRUSADE have this capability. Try it in one of those games to see how it works. COUNTERS There are 9 Counters (1 to 9) in AGT that can be turned ON with the TurnCounterON token and turned OFF with the TurnCounterOFF token. When a counter is ON, it is automatically incremented at each turn of the game. When a counter is OFF, it is set to zero and is not incremented. The condition of these counters can be tested using the CounterEquals, CounterGT and CounterLT conditional tokens. Using counters is very useful for such things as keeping 51 track of the number of turns (1) a torch is lit, (2) a player has been underwater using an aqua-lung, or (3) a time-bomb has been ticking. The value of a counter can be printed in a message by using #CTR5# (to print counter number 5). The game designer's use of Counters should be very carefully commented in the .CMD file! VARIABLES There are 9 Variables (1 to 9) in AGT that can be set to a specific value with the SetVariableTo token and added to with the AddToVariable token and subtract from with SubtractFromVariable token. These variables can also be set to a random value with the RandomVariable token, and variables can be added together with the AddVariables, and subtracted from one another using the SubtractVariables token. The condition of these variables can be tested using the VariableEquals, VariableGT and VariableLT and VariableChance conditional tokens. Using variables is very useful for such things as keeping track of the number of times (1) a player has asked for HELP, (2) a player has crossed a certain rickety bridge, or (3) until a specific event happens (like the cave closes or the lamp's batteries go out). Other excellent uses of variables are to keep track of various attributes the player may have such as Strength, Health, Charisma, etc. The value of a variable can be printed in a message by using #VAR3# (to print variable number 3). As an example, the following meta-commands in the .CMD file will (1) initialize the flash batteries to last a total of 100 turns, (2) decrement a variable for every turn the light is ON, (3) issue warnings when the battery will last 20 turns or less, (4) "kill" the flashlight when the batteries finally go out, (5) turn the flashlight ON and OFF with the input commands LIGHT and EXTINGUISH. ; Comments ; Flag 1 is OFF at start of game and ON otherwise ; Flag 2 is OFF if the flashlight is OFF and ON if it is ON ; Variable 5 will count down the life of the battery ; Noun 200 is FlashLight in OFF condition ; Noun 201 is FlashLight in ON condition ; Noun 202 is FlashLight in DEAD condition ; ANY meta-command -- tried at each turn of game COMMAND ANY FlagOFF 1 (* First turn of game -- initialize Battery life *) SetVariableTo 5 100 (* Battery life set to 100 turns *) TurnFlagON 1 (* Initialization process is now over *) END_COMMAND COMMAND ANY FlagON 2 (* Flashlight is turned ON *) SubtractFromVariable 5 1 (* Decrement Battery life count *) END_COMMAND 52 COMMAND ANY FlagON 2 (* Flashlight is turned ON *) Present 201 (* No reason to give warning unless Flashlight here *) VariableGT 5 0 (* At least one more turn left in batteries *) VariableLT 5 21 (* Only a few more turns left in batteries *) PrintMessage 22 (* Flashlight will last only #VAR5# more turns! *) VariableEquals 5 20 (* Only print next message once *) PrintMessage 23 (* You had better save your batteries! *) END_COMMAND COMMAND ANY FlagON 2 (* Flashlight is turned ON *) VariableEquals 5 0 (* The batteries are finally dead! *) TurnFlagOFF 2 (* Turn it off for the last time! *) SwapLocations 201 202 (* Swap ON Flashlight for DEAD one *) Present 202 (* No reason to give message unless Flashlight here *) PrintMessage 24 (* The Flashlight's batteries are dead!! *) END_COMMAND etc... for other ANY meta-commands ; Specific Vocabulary meta-command -- tried only if WORDS match COMMAND LIGHT FLASHLIGHT Present 200 (* OFF flashlight is present *) TurnFlagON 2 (* Flashlight is turned ON *) SwapLocations 200 201 (* Swap OFF Flashlight for ON one *) PrintMessage 25 (* The flashlight is ON and shining brightly! *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND LIGHT FLASHLIGHT Present 201 (* ON flashlight is present *) PrintMessage 26 (* The flashlight is already ON, dummy! *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND LIGHT FLASHLIGHT Present 202 (* DEAD flashlight is present *) PrintMessage 27 (* Sorry, but the batteries are dead! *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND EXTINGUISH FLASHLIGHT Present 201 (* ON flashlight is present *) TurnFlagOFF 2 (* Flashlight is turned OFF *) SwapLocations 200 201 (* Swap OFF Flashlight for ON one *) PrintMessage 28 (* The flashlight is now off! *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND EXTINGUISH FLASHLIGHT Present 200 (* OFF flashlight is present *) OR Present 202 (* DEAD flashlight is present *) PrintMessage 29 (* The flashlight is already OFF! *) DoneWithTurn (* Finished with this turn *) END_COMMAND 53 Needless to say, the game designer's use of Variables should be very carefully commented in your .CMD file! NUMBER INPUT By using meta-commands it is possible to accept number input from the player during the course of the game and to test the number he has input. An example of where such a capability might be appropriate is having the player open a combination safe. An example of use, GetNumberInput 4 20 would cause the player to be prompted as follows: "What number (from 4 to 20) ? " This prompt would be repeated until the player entered a number in the correct range (i.e., an integer from 4 to 20). If the game designer didn't want to limit the input number to a specific range, both parameters should be equal. For example, GetNumberInput 0 0 would cause the prompt to be "What number ? " Once input, the number can be tested by using the NumberEquals, NumberGT, and NumberLT conditional tokens. Another way that AGT will allow number input is as the Noun or Object within an input command. For example, let's say the player is in an elevator and he needs to push a button corresponding to a floor. Commands like "PUSH 3" will be accepted by the AGT parser. The Noun "3" can then be assigned to a variable using the NounToVariable token, tested using the VariableEquals token, then the player would be sent to the appropriate floor. For example, the following series of meta-commands will enable the player to go to any one of four floors by giving the correct command. COMMAND PUSH ANY SetVariableTo 2 0 (* Set Variable #2 to 0 *) AtLocation 14 (* In Elevator *) NounToVariable 2 (* Set Variable #2 to floor number {if any} *) VariableEquals 2 1 (* Did player push 1? *) GoToRoom 21 (* Move player to 1st floor *) PrintMessage 121 (* The Elevator glides to #VAR2# and you exit. *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND PUSH ANY AtLocation 14 (* In Elevator *) VariableEquals 2 2 (* Did player push 2? *) GoToRoom 22 (* Move player to 2nd floor *) PrintMessage 121 (* The Elevator glides to #VAR2# and you exit. *) DoneWithTurn (* Finished with this turn *) END_COMMAND 54 COMMAND PUSH ANY AtLocation 14 (* In Elevator *) VariableEquals 2 3 (* Did player push 3? *) GoToRoom 23 (* Move player to 3rd floor *) PrintMessage 121 (* The Elevator glides to #VAR2# and you exit. *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND PUSH ANY AtLocation 14 (* In Elevator *) VariableEquals 2 4 (* Did player push 4? *) GoToRoom 24 (* Move player to 4th floor *) PrintMessage 121 (* The Elevator glides to #VAR2# and you exit. *) DoneWithTurn (* Finished with this turn *) END_COMMAND COMMAND PUSH ANY AtLocation 14 (* In Elevator *) NOT VariableEquals 2 0 (* Did player push a number? *) PrintMessage 34 (* This Elevator only has four floors. *) DoneWithTurn (* Finished with this turn *) END_COMMAND ASKING AND ANSWERING QUESTIONS Asking and answering questions can be handled by using several meta-commands. For example, let's assume we want to ask the trivia question "What is the largest human organ?" to which the correct answer is "skin". We would specify the question and answer in the .DAT file as follows: QUESTION 3 WHAT IS THE LARGEST HUMAN ORGAN? ANSWER 3 SKIN Then the following meta-commands would ask the question and give an appropriate response based on whether the answer given was right or wrong: COMMAND Verb Noun or ANY various conditions AskQuestion 3 (* ask it and get answer *) TurnFlagON 255 (* temporary flag to test correctness of answer *) AnswerIsCorrect (* tests if answer is correct *) TurnFlagOFF 255 (* turn temporary flag off because answer right *) PrintMessage 29 (* Fantastic, you got it right!! *) PlusScore 10 (* Give player 10 points for correct answer *) DoneWithTurn END_COMMAND COMMAND Same Verb Noun or ANY FlagON 255 (* temporary flag not turned off in previous COMMAND *) TurnFlagOFF 255 (* turn temporary flag off now *) PrintMessage 30 (* Sorry, you got it wrong!! *) DoneWithTurn END_COMMAND When a question is asked and a response is given, the correct answer is matched against the response by looking for the answer anywhere in the response. This means that any of the following responses would be considered 55 correct by AGT: SKIN I THINK THE ANSWER IS SKIN THE CORRECT RESPONSE IS "SKIN" ANYONE KNOWS IT IS SKIN, YOU TURKEY COMPUTER! The game designer can have up to 9 sets of questions and answers (1 to 9) in the .DAT file. They could form the basis for a series of riddles that must be answered during the course of the adventure in order to get all the points and win the game. OPENING AND CLOSING PASSAGEWAYS BETWEEN ROOMS The ChangePassageway token can be used in a meta-command to open or close passageways between rooms during the game. For example, to open a secret passage between room 3 and room 7 when the command SESAME is given could be done with the following: COMMAND SESAME AtLocation 3 (* Player is at location 3 *) InRoom 203 (* Solid stone wall *) ChangePassageway 2 7 (* open passage South(2) to room 7 *) SwapLocations 203 204 (* Swap solid wall for wall with door in it *) SwapLocations 227 228 (* Swap for wall with door in room 7 also *) PrintMessage 21 (* At the sound of your voice, a large doorway *) (* magically appears where a stone wall once was. *) DoneWithTurn END_COMMAND Once this meta-command has opened the passageway between these rooms, the player could go to room 7 from room 3 by giving the SOUTH, or conversely go to room 3 from room 7 by giving the command NORTH. The passageway is opened in both rooms in opposite directions. The same token can be used to close a passageway as well. For example, if the statue in the treasure room was "booby-trapped", a command of GET STATUE might cause an avalanche of rocks to close the west exit from the treasure room as follows: COMMAND GET STATUE AtLocation 23 (* Player is in the Treasure room *) InRoom 245 (* statue *) FlagOFF 3 (* Booby trap has not been tripped (yet) if OFF *) TurnFlagON 3 (* It has now been tripped *) ChangePassageway 4 0 (* close(0) passageway to the West(4) *) SwapLocations 211 212 (* Swap doorway with jumble of rocks *) SwapLocations 213 214 (* Put jumble of rocks in other room also *) PrintMessage 25 (* As you pick up the statue, a lever underneath *) (* pops up. There is a terrible crash and an *) (* avalanche of rocks buries the doorway!! *) GetIt 245 (* You wanted it -- You got it!! *) DoneWithTurn END_COMMAND The numbers corresponding to the various directions are as follows: 56 1 - North 5 - NorthEast 9 - Up 2 - South 6 - NorthWest 10 - Down 3 - East 7 - SouthEast 11 - Enter 4 - West 8 - SouthWest 12 - Exit META-COMMAND REDIRECTION Meta-commands can be redirected to other meta-commands. The principal use of this capability is when there are several player input commands which should be handled by the game in the same way. For example, in the CAVE adventure, we want the same series of meta-commands to be used if the player enters "WATER THE PLANT" or "POUR WATER ON THE PLANT". With meta-command redirection, the series of meta-commands we wish to use needs to be given only once in the .CMD file. The second use can be simply redirected to the first. For example, let's assume that all of the necessary meta-commands are given completely for POUR WATER ON PLANT, then the appropriate redirection for WATER PLANT could be accomplished by the following lines in the .CMD file: COMMAND WATER PLANT ReDirectTo POUR WATER ON PLANT END_COMMAND Notice in the above example that we redirected the meta-command for a fixed input command (WATER PLANT) to another fixed command (POUR WATER ON PLANT). It is also possible to redirect meta-commands for ANY words. For example, if we wished to redirect the meta-command WATER ANY we could do it with the following: COMMAND WATER ANY ReDirectTo POUR WATER ON $NOUN$ END_COMMAND Notice that by using $NOUN$ in the "redirected" command, we can "map" the original command's noun (from WATER PLANT or WATER TREE, or WATER whatever) to the new command's object. This redirected command causes the game to convert a command to "WATER THING" to act as if the player had actually typed in "POUR WATER ON THING". In addition to $NOUN$, it is also possible to use $VERB$, $NAME$ and $OBJECT$ whenever we wish to "map" these words into another use within a redirected command. You should not use ANY in the redirected command, i.e., ReDirectTo POUR WATER ON ANY would make AGT think the player had actually typed in "POUR WATER ON ANY". ORGANIZATION OF THE .CMD FILE Meta-commands like those described above are processed sequentially by their order of appearance in the .CMD file. As a result, the COMMAND's order is very important! For example, let's consider a series of meta-commands to define a new verb FILL. We want to be able to fill a bottle with water or oil depending upon where we are. We want to break a vase, whenever we try to fill the vase. Finally, we want to print several default messages, such as "The bottle is already full.", or "The $NOUN$ isn't here, so you can't $VERB$ it!", or "There is nothing here to put in the $NOUN$." or "You have to be kidding! You can't $VERB$ a $NOUN$!!" This can be done with the following seven meta-commands for the verb FILL: 57 ; COMMENTS ; ; FLAGS: ; 2 Bottle is full if ON, empty if OFF ; ; NOUNS: ; 225 bottle filled with water ; 226 empty bottle ; 227 bottle filled with oil ; 265 broken vase -- pottery shards ; 263 Ming vase (1) COMMAND FILL ANY NOT NOUNPresent PrintMessage 29 ;The $NOUN$ isn't here, so you can't $VERB$ it! DoneWithTurn END_COMMAND (2) COMMAND FILL BOTTLE FlagON 2 ;bottle is already full PrintMessage 105 ;The bottle is already full. DoneWithTurn END_COMMAND (3) COMMAND FILL BOTTLE AtLocation 3 ;inside building OR AtLocation 4 ;valley by stream OR AtLocation 38 ;bottom of pit with stream OR AtLocation 95 ;cavern with waterfall OR AtLocation 113 ;reservoir OR AtLocation 141 ;by building PrintMessage 107 ;bottle is now full of water SwapLocations 226 225 ;swap empty bottle for water-filled TurnFlagON 2 ;bottle is now full DoneWithTurn END_COMMAND (4) COMMAND FILL BOTTLE AtLocation 24 ;east pit of two-pit room PrintMessage 108 ;bottle is now full of oil SwapLocations 226 227 ;swap empty bottle for oil-filled TurnFlagON 2 ;bottle is now full DoneWithTurn END_COMMAND (5) COMMAND FILL BOTTLE PrintMessage 106 ;There is nothing here to put in the $NOUN$. DoneWithTurn END_COMMAND 58 (6) COMMAND FILL VASE Destroy 263 ;Ming vase PutInCurrentRoom 265 ;broken vase pottery shards PrintMessage 145 ;You clumsy oaf! You broke the vase. DoneWithTurn END_COMMAND (7) COMMAND FILL ANY PrintMessage 109 ;You must be kidding! You can't $VERB$ a $NOUN$! DoneWithTurn END_COMMAND The numbers shown in front of each of the COMMAND's are just for ease of this discussion. Numbers like these should NEVER actually be included in a .CMD file, because they would lead to serious bugs! If these COMMAND's were in the .CMD file in the order shown, when the player entered a command to "FILL something", AGT would first try COMMAND (1) which would test whether the "something" was present. If it was not present, COMMAND (1) would print the default message "The something isn't here, so you can't fill it!" and the DoneWithTurn would cause all AGT process to cease for this turn. Only if the something was present, would AGT try COMMANDS (2), (3), etc. COMMAND (2) to (5) will only be tried in the "something" was the BOTTLE. COMMAND (2) would be tried first, and it would test if the bottle was already full and give an appropriate message if it was full. COMMAND (3), which would only be tried if the bottle was empty, would test if the player was located in places where it was possible to get water, and fills the bottle with water if possible. COMMAND (4), which would only be tried if there was no water at the current location, would test if the player was at location 24, where there is oil, and fill the bottle with oil, if possible. COMMAND (5) would only be tired if the player was not located near a source of water or a source of oil and it would print a message that "There is nothing here to put in the bottle". COMMAND (6) only works if the player's input is FILL VASE. Because AGT got past COMMAND (1), we know that the vase is present (other wise COMMAND (1) would have caused an "error" message to be printed). COMMAND (6) causes the broken pottery shards to be switched with the vase and an appropriate message to be printed. COMMAND (7) is the "default" condition for the verb FILL. It is activated only if the player gave the input "FILL something" and the "something" is present, but it is not the BOTTLE or the VASE. For example, if the player entered FILL THE ROCK, COMMAND (7) would cause "You must be kidding! You can't fill a rock!" to be printed. The order of these COMMAND's is very important! Specifically, COMMAND (1) must be first and COMMAND (7) must be last in order for AGT to give the "correct" and logical default responses to the verb FILL. Further, COMMAND (2) must precede and COMMAND (5) must follow COMMAND's (3) and (4) in order for the input "FILL BOTTLE" to work logically. It is important to understand why the above sequence is critical. Study the sequence again, if necessary. Besides, the order of COMMAND's for a specific verb (like FILL), it is also important to arrange the verbs within the .CMD file in a reasonable manner. 59 Specifically, all the meta-commands for each verb should be grouped together in the .CMD file. For example: ; ANY Commands (1) COMMAND ANY . . (37) COMMAND ANY ; READ Commands (38) COMMAND READ BOOK . . (46) COMMAND READ ANY ; SEARCH Commands (47) COMMAND SEARCH CLOSET . . (54) COMMAND SEARCH ANY ; CLIMB Commands (55) COMMAND CLIMB ROPE . . (69) COMMAND CLIMB ANY ; SQUEEZE Commands (70) COMMAND SQUEEZE LEMON . . (82) COMMAND SQUEEZE ANY . . All the ANY meta-commands are grouped together; all the READ meta-commands are together, etc. Not only is this easier to follow and debug, but it is faster for AGT to process. This is because, AGT processes these meta-commands using a variation of a technique called "Indexed Sequential Access Method" (also called ISAM). What this means is: AGT keeps track of the first and last meta-commands for each verb. For example, if the verb was CLIMB, AGT would only consider meta-commands with indices from 55 to 69. But within this group, AGT considers them sequentially. 60 PART 4: SAMPLE AGT META-COMMAND SCENARIOS This Part of the manual presents several scenarios where meta-language commands have been used to create typical game situations. These scenarios are presented in detail by showing how ROOMs, NOUNs and CREATUREs data are used in the .DAT file, how messages are put in the .MSG file, and finally how the meta-commands are written to accomplish the desired effects in the .CMD file. The specific scenarios to be presented include: (1) defining the actions for the new verb FILL, (2) a variety of random activities by a castle guard, and (3) interaction with characters in a Star Trek adventure. SCENARIO 1: "FIND" VERB ACTIONS This scenario comes from the COLOSSAL CAVE adventure. In this scenario, we want to define several actions/responses to the player's input using the custom user-defined verb "FIND". Pay particular attention to how the player is offered a hint (for 5 points) if he inputs "FIND CAVE". In the CAVE.DAT file we would define a custom verb as: VERB Dummy_Verb1 FIND END_VERB Several messages are needed in the CAVE.MSG file as follows: MESSAGE 24 You are already carrying the $NOUN$, dummy! END_MESSAGE MESSAGE 57 I don't know where the cave is, but hereabouts no stream can run on the surface for very long. I would try the stream. END_MESSAGE MESSAGE 59 I can only tell you what you see as you move about and manipulate things. I cannot tell you where remote things are. END_MESSAGE MESSAGE 86 Okay, If you're so smart, do it yourself! END_MESSAGE MESSAGE 94 I believe what you want is right here with you. END_MESSAGE MESSAGE 116 The Dwarf's knife vanished as it struck the wall of the cave. END_MESSAGE MESSAGE 138 I daresay whatever you want is around here somewhere. END_MESSAGE 61 MESSAGE 143 The hint will cost you 5 points. END_MESSAGE MESSAGE 175 Do you want the hint? END_MESSAGE The meta-commands for FIND in the CAVE.CMD file would be as follows: (Be sure and understand the importance of the order of these COMMANDs.) ;FLAGS ;Flag 3 Cave is closed if ON and player is in a room with many sleeping ; dwarves -- who should not be awakened! ;Flag 9 Temporary flag ;Flag 10 A Dwarf is in the room if ON ;Flag 12 Hint about how to find cave has been offered if ON ; FIND meta-commands COMMAND FIND KNIFE PrintMessage 116 ;The dwarf's knife vanished. DoneWithTurn END_COMMAND COMMAND FIND ANY NOUNIsCarrying PrintMessage 24 ;You already have it, dummy! DoneWithTurn END_COMMAND COMMAND FIND ANY FlagON 3 ;cave is closed OR NOUNPresent ;NOUN is here already PrintMessage 138 ;It must be around here somewhere. DoneWithTurn END_COMMAND COMMAND FIND DWARF FlagON 10 ;dwarf in room PrintMessage 94 ;It is here with you. DoneWithTurn END_COMMAND 62 COMMAND FIND CAVE FlagOFF 12 ;The Cave hint has not been offered yet. TurnFlagON 12 ;Now Cave hint has been offered PrintMessage 175 ;Do you want a hint? PromptForYes TurnFlagON 9 ;hint has been rejected - so far (Turn Temporary Flag ON) PrintMessage 143 ;The hint will cost your 5 points PrintMessage 1 ;Is that OK? PromptForYes TurnFlagOFF 9 ;Offer of hint has been accepted (Turn Temporary Flag OFF) PrintMessage 57 ;Follow the stream to find the cave. MinusScore 5 ;hint costs 5 points DoneWithTurn END_COMMAND COMMAND FIND CAVE FlagON 9 ;Offer of hint was rejected ;(Temporary Flag was not turned OFF in last COMMAND) TurnFlagOFF 9 ;Turn temporary Flag OFF now PrintMessage 86 ;OK, if you're so smart - do it yourself! DoneWithTurn END_COMMAND COMMAND FIND ANY PrintMessage 59 ;Sorry, I can't tell you where remote things are. ; Default message for FIND DoneWithTurn END_COMMAND SCENARIO 2: RANDOM ACTIVITIES BY GUARD This is a modification of a scenario from CRUSADE adventure. In this scenario we want to create a number of encounters with guards in various rooms of the Baron's castle. We will use only one CREATURE (Guard -- 301) and move him around from room to room randomly. The player can fight the guard, and will be thrown into a dungeon cell if he loses, and will cause the guard to be replaced with an unconscious guard if he wins. The player can wear a disguise by wearing the Baron's armor. If the guard encounters the player wearing the armor, the guard will mistake the player for the Baron and leave the room. If the player attempts to talk to the guard without giving the proper password, the guard will capture the player and throw him into the dungeon. If the player angers the guard in Room 11 (a small room -- high up in the sheer wall of the cavern), the guard will throw the player down to the cavern floor far below where the player will lose consciousness and later awake with a broken leg. The leg will take a random number of turns to heal. Before it heals, the player will be unable to move around. To give as complete a picture as possible, the needed data for this scenario will be shown from all three necessary CRUSADE.* files: i.e., CRUSADE.DAT, CRUSADE.MSG and CRUSADE.CMD. In CRUSADE.DAT we would define the CREATURE, ROOMs and the various NOUNs needed as: CREATURE 301 guard Baron's You see one of the Baron's guards. He looks very angry. LOCATION 11 63 HOSTILE MAN END_CREATURE CREATURE_DESCR 301 The guard is about 6 foot 8 inches tall, but he appears even bigger as he looms over you. He looks mean and is rather ugly. END_CREATURE_DESCR ROOM 10 Large cavern EAST 9 LIGHT 210 (* Blazing torch *) END_ROOM ROOM_DESCR 10 You are in a very large cavern with high sheer walls. A passage leads off to the east. END_ROOM_DESCR NOUN 269 walls cavern The cavern walls are quite steep. You can't see any way to climb them. LOCATION 10 UNMOVABLE NOUN_SYNONYMS WALL PLURAL END_NOUN NOUN_DESCR 269 The walls are very steep and quite smooth. You can't see any hand or foot holds. END_NOUN_DESCR NOUN 219 opening small There is an opening in the wall -- high up near the roof of the cavern. LOCATION 10 UNMOVABLE END_NOUN NOUN_DESCR 219 You see a dim light shining out of the opening, but it is too high and far to see more. It looks impossible to get up to the opening from your location at the bottom of the cavern. END_NOUN_DESCR ROOM 11 Small room SOUTH 42 LIGHT 210 (* Blazing torch *) END_ROOM ROOM_DESCR 11 You are in a small room carved into the sheer cavern wall. The south part of the room is totally open and looks out 64 on to the cavern floor far below. Be careful not to go south! There is a doorway to the north. END_ROOM_DESCR NOUN 215 leg broken You have a broken leg and are unable to move. LOCATION 0 UNMOVABLE END_NOUN NOUN_DESCR 215 Your leg hurts like the dickens! You are quite discouraged because you will need two good legs to rescue the princess and solve this adventure! END_NOUN_DESCR NOUN 230 armor silver The Baron's silver suit of armor stands nearby. LOCATION 24 WEIGHT 25 SIZE 25 WEARABLE POINTS 10 END_NOUN NOUN_DESCR 230 The armor is quite fancy, but it still looks like it would be useful in a fight. It would cover its occupant from head to foot. END_NOUN_DESCR NOUN 259 guard unconscious An unconscious guard lies at your feet. LOCATION 0 WEIGHT 200 END_NOUN NOUN_DESCR 259 The guard's unconscious body lies in a heap at your feet. You have to step over him as you move about the passageway. He looks like he will be out of action for a long time. END_NOUN_DESCR ROOM 17 Guard's quarters EAST 16 END_ROOM ROOM_DESCR 17 You are in the guard's quarters. It looks like a pig sty -- it is so messy. The door is to the east. END_ROOM_DESCR HELP 17 65 Leave quickly. It is very dangerous to linger here! END_HELP ROOM 41 Cell (* No obvious exits *) END_ROOM ROOM_DESCR 41 You are in a dingy dungeon cell. There is straw on the floor. The cell is cold and damp. You are very depressed by just being here. END_ROOM_DESCR In the CRUSADE.MSG file we would define these needed messages: MESSAGE 3 The guard looks at you suspiciously because you neglected to identify yourself by using the proper password. He knows you shouldn't be here and decides that he should take you to the Baron for questioning. He rushes toward you. END_MESSAGE MESSAGE 8 What a great idea! You must have played this game before, but unfortunately you can't do that now. It is still a good idea and you may wish to try it some other time. But now it is impossible END_MESSAGE MESSAGE 25 because the guard simply won't let you $VERB$ the $NOUN$. END_MESSAGE MESSAGE 33 An angry-looking guard suddenly enters the room. He eyes you suspiciously and begins to move quickly and carefully toward you. He reaches for his sword, but pauses as if he is waiting for you to make the first move. END_MESSAGE MESSAGE 42 The guard gets mad at you because he knows you aren't allowed here. He picks you up and throws you over the edge to the cavern floor far below. He stands at the edge looking down at you and laughingly cries, "Stay out! If you know what is good for you. Next time, I will get rough!" He laughs again and that is the last thing you remember as you drift off into unconsciousness. When you awake, you find... END_MESSAGE MESSAGE 43 with a broken leg. END_MESSAGE MESSAGE 44 Your leg has finally healed. You are now free to resume your quest. END_MESSAGE 66 MESSAGE 45 The guard looks you over very carefully, but because you are wearing the Baron's armor, the guard mistakes you for the Baron. "Sorry to disturb you, my Lord!", he says as he quickly leaves the room. END_MESSAGE MESSAGE 49 The guard grabs your throat with his big hands. He squeezes until you can barely breathe. You struggle and try to pull his hands away. END_MESSAGE MESSAGE 50 Finally, you slip into unconsciousness. When you awake you find yourself in a strange and ugly little room. END_MESSAGE MESSAGE 51 At last, you pry his fingers off your wind pipe. Now able to breathe, you get enough strength to slam your elbow into his gut. He lets go of you and doubles over. You kick him in a very vulnerable part of his anatomy and he crumples in a pile on the floor. END_MESSAGE In the CRUSADE.CMD we would have several COMMANDs. First, the meta-commands that cause the random events related to the guard: COMMAND ANY NOT InRoom 301 (* Guard *) NOT InRoom 259 (* Unconscious Guard *) Destroy 301 (* Guard disappears from room after player leaves room *) Destroy 259 (* Unconscious Guard's body disappears from room *) END_COMMAND COMMAND ANY Chance 5 (* 5 % chance of guard appearing *) AtLocationGT 10 (* Baron's castle area *) NOT InRoom 301 (* Guard *) NOT InRoom 259 (* Unconscious Guard *) PutInCurrentRoom 301 (* Put guard in room *) PrintMessage 33 (* Guard suddenly appears *) BlankLine END_COMMAND COMMAND ANY Chance 50 (* 50 % chance of guard appearing in his own quarters *) AtLocation 17 (* Guard's quarters *) NOT InRoom 301 (* Guard *) NOT InRoom 259 (* Unconscious Guard *) PutInCurrentRoom 301 (* Put guard in room *) PrintMessage 33 (* Guard suddenly appears *) BlankLine END_COMMAND 67 COMMAND ANY InRoom 301 (* guard *) IsWearing 230 (* Baron's Armor *) PrintMessage 45 (* Guard thinks you are the Baron and leaves *) Destroy 301 (* Guard disappears *) END_COMMAND COMMAND ANY Chance 25 AtLocation 11 (* room in wall *) InRoom 301 (* Guard *) GetIt 215 (* give broken leg to player *) GoToRoom 10 (* guard throws you into room 10 *) PrintMessage 42 DoneWithTurn (* no further action -- get next input *) END_COMMAND Now the meta-commands dealing with the broken leg: COMMAND ANY IsCarrying 215 (* Broken leg *) VerbIsDirection (* Trying to move *) PrintMessage 8 (* Sorry, but you can't *) PrintMessage 43 (* with a broken leg *) DoneWithTurn (* no further action -- get next input *) END_COMMAND COMMAND ANY Chance 20 IsCarrying 215 (* Broken leg *) PrintMessage 44 (* Leg is healed *) BlankLine Destroy 215 (* get rid of broken leg *) END_COMMAND Now the meta-commands corresponding to specific input from the player: COMMAND GET ANY InRoom 301 (* angry guard *) PrintMessage 8 (* Sorry, you can't *) PrintMessage 25 (* Guard won't allow it *) DoneWithTurn (* no further action -- get next input *) END_COMMAND COMMAND GET ANY IsCarrying 215 (* Broken leg *) PrintMessage 8 (* Sorry, you can't *) PrintMessage 43 (* with broken leg *) DoneWithTurn (* no further action -- get next input *) END_COMMAND COMMAND OPEN ANY InRoom 301 (* angry guard *) PrintMessage 8 (* Sorry, you can't *) PrintMessage 25 (* Guard won't allow it *) DoneWithTurn (* no further action -- get next input *) END_COMMAND 68 COMMAND ATTACK GUARD InRoom 301 (* angry guard *) PrintMessage 49 (* It was a fierce fight *) TurnFlagON 255 (* Set Temporary Flag to ON *) Chance 25 (* 25 % chance of winning fight *) PrintMessage 51 (* but you won! *) TurnFlagOFF 255 (* Turn Temporary Flag OFF now *) SwapLocations 259 301 (* put unconscious guard in room *) DoneWithTurn (* no further action -- get next input *) END_COMMAND COMMAND ATTACK GUARD InRoom 301 (* angry guard *) FlagON 255 (* Temporary Flag was not turned OFF in last COMMAND *) TurnFlagOFF 255 (* Turn Temporary Flag OFF now *) PrintMessage 50 (* but you lost! *) SendAllToRoom 17 (* Guard's takes stuff to his quarters *) GoToRoom 41 (* Guard puts you in dungeon cell *) SendToRoom 202 41 (* Put torch in dungeon with you *) DoneWithTurn (* no further action -- get next input *) END_COMMAND COMMAND TALK TO GUARD PrintMessage 3 (* chat with guard -- without using password *) PrintMessage 49 (* It was a fierce fight *) PrintMessage 50 (* but you lost! *) SendAllToRoom 17 (* Guard's takes stuff to his quarters *) GoToRoom 41 (* Guard puts you in dungeon cell *) SendToRoom 202 41 (* Put torch in dungeon with you *) DoneWithTurn (* no further action -- get next input *) END_COMMAND COMMAND ASK GUARD ABOUT ANY ReDirectTo TALK TO GUARD END_COMMAND SCENARIO 3: INTERACTION WITH CHARACTERS Let's develop an example of communicating with other characters in an adventure game. Specifically, let's consider a situation in a Star Trek adventure game were we wish to be able to experience the following interchange between several of the standard Star Trek characters and the player, who is playing the role of Captain James T. Kirk: You are on the Bridge, the circular room at the top of the Enterprise's disk. The walls are decked with crew members seated or standing at their posts. In the center of the room is your command chair. Along one side of the room is a large viewscreen. The only exit, via turbolift, is aft. The viewscreen shows the emptiness and vastness of space. Spock stands alert but relaxed, with his arms folded behind his back. Chekov sits behind the weapons control console. Lieutenant Uhura listens intently to her earphones. At the navigator's station, Sulu sits behind a console of controls. What now? AFT 69 You are in the TurboLift, a small closet-like room. The Bridge is to your west. Spock stands alert but relaxed, with his arms folded behind his back. What now? WARP 10 Spock: Jim, surely you realize that you are not on the Enterprise's Bridge. The command "warp 10" is quite inappropriate here. What now? WEST You are on the Bridge, the circular room at the top of the Enterprise's disk. The walls are decked with crew members seated or standing at their posts. In the center of the room is your command chair. Along one side of the room is a large viewscreen. The only exit, via turbolift, is aft. The viewscreen shows the emptiness and vastness of space. Spock stands alert but relaxed, with his arms folded behind his back. Chekov sits behind the weapons control console. Lieutenant Uhura listens intently to her earphones. At the navigator's station, Sulu sits behind a console of controls. What now? SCOTTY, WARP 10 Spock: Captain, should you have Doctor McCoy check your eye sight? Surely, you can see that Scotty isn't here. What now? CHEKOV, WARP 10 Spock: Your extensive command experience should have convinced you that better results can be obtained when the appropriate member of the crew performs this operation. Permit me to redirection your command to the proper crew member. Spock: Sulu, warp 10 Sulu: What course should I plot first, Captain?. What now? PLOT A COURSE FOR QWERTY Sulu: Plotting a course for the planet Qwerty, Captain. What now? WARP 16 Spock: Captain, surely you realize that the Enterprise is only capable of Warp 1 through Warp 12, plus Impulse power, of course. What now? WARP 10 Sulu: Going to warp factor 10. To see how this scene is achieved, first let's examine the relevant entries in the .DAT file. There are only two Rooms in the scene, the Bridge and the TurboLift; their descriptions are as follows: 70 ROOM 114 Bridge EAST 2 ENTER 2 EXIT 2 END_ROOM ROOM_DESCR 114 You are on the Bridge, the circular room at the top of the Enterprise's disk. The walls are decked with crew members seated or standing at their posts. In the center of the room is your command chair. Along one side of the room is a large viewscreen. The only exit, via turbolift, is aft. END_ROOM_DESCR ROOM 2 Turbolift: Deck 1 WEST 114 (* Bridge *) ENTER 114 (* Bridge *) EXIT 114 (* Bridge *) END_ROOM ROOM_DESCR 2 You are in the TurboLift, a small closet-like room. The Bridge is to your west. END_ROOM_DESCR Next, let's see how the Nouns are described in the .DAT file: NOUN 201 course ship's You see the course plotted on the navigator's console. LOCATION 0 NOUN_SYNONYMS CONSOLE END_NOUN NOUN_DESCR 201 The navigator's console shows the ship's course plotted in light blue. The Enterprise (shown as a red circle) is on course. END_NOUN_DESCR NOUN 243 Viewscreen Big The viewscreen shows the emptiness and vastness of space. LOCATION 114 (* Bridge *) UNMOVABLE NOUN_SYNONYMS SCREEN END_NOUN NOUN 246 Qwerty First You notice on the viewscreen: The planet Qwerty below. LOCATION 0 UNMOVABLE NOUN_SYNONYMS PLANET END_NOUN 71 Notice that only the Viewscreen, Noun 243, is in the Bridge, Room 114, at the beginning of the scene. The other Nouns are initially "nowhere", Room 0, and will be put in Room 114, the Bridge, when appropriate. Specifically, The Ship's Course, Noun 201, will be put in Room 114 as soon as a command is given to plot a course. Similarly, Noun 246, the planet Qwerty -- shown in the Viewscreen, will replace the empty Viewscreen when the Enterprise gets close to the planet and assumes orbit. There are a number of Creatures in the scene. Their descriptions might be given in the .DAT file as follows: CREATURE 300 Spock Commander Spock stands alert but relaxed, with his arms folded behind his back. LOCATION 114 (* Bridge *) GROUPMEMBER (* Have Spock automatically follow player *) END_CREATURE CREATURE_DESCR 300 Spock is the only Vulcan member of your crew. He wears a blue shirt with a gold Star Fleet insignia. END_CREATURE_DESCR CREATURE 301 Chekov Lieutenant Chekov sits behind the weapons control console. LOCATION 114 (* Bridge *) END_CREATURE CREATURE_DESCR 301 Chekov is sitting at his assigned station pressing keys on the weapons control panel and monitoring the screen in front of him. END_CREATURE_DESCR CREATURE 302 Uhura Lieutenant Lieutenant Uhura listens intently to her earphones. LOCATION 114 (* Bridge *) UNMOVABLE END_CREATURE CREATURE_DESCR 302 Uhura is sitting in her communications station listening to her earphones and monitoring all of the known hailing frequencies. END_CREATURE_DESCR CREATURE 303 Sulu Commander At the navigator's station, Sulu sits behind a console of controls. LOCATION 114 (* Bridge *) UNMOVABLE END_CREATURE 72 CREATURE_DESCR 303 Sulu is sitting next to Chekov, monitoring lit navigation console. END_CREATURE_DESCR CREATURE 305 Scott Commander Commander Scott sits at his console, monitoring the ship's engines. LOCATION 52 (* Engine Room *) UNMOVABLE CREATURE_SYNONYMS SCOTTY END_CREATURE CREATURE_DESCR 305 Scott is the best Engineering Officer in the Federation. END_CREATURE_DESCR All of these Creatures are initially in the Bridge, Room 114, except for Commander Scott, who is in the Engine Room, naturally. Only one other entry from the .DAT file needs to be specified in order for the scene to work as show, and that is the definition of verbs: VERB EAST AFT Dummy_Verb1 WARP Dummy_Verb2 PLOT SET CHART END_VERB Notice that AFT is defined as a synonym for EAST. WARP is defined as a "custom" verb so that commands like WARP 9 will be understood by the parser and the rest of the AGT driver program (RUN.EXE). Integer numbers like 9, 12, etc., are always acceptable "Nouns" to the parser; however, you must use meta-commands to deal with numbers as Nouns properly. PLOT, SET and CHART are all synonyms so that the player can enter PLOT A COURSE, or SET A COURSE or CHART A COURSE and they will all be treated the same by AGT. The messages needed for the scene are contained in the .MSG file and are shown below: MESSAGE 105 Spock: Captain, should you have Doctor McCoy check your eye sight? Surely, you can see that $NAME$ isn't here. END_MESSAGE MESSAGE 106 Spock: Your extensive command experience should have convinced you that better results can be obtained when the appropriate member of the crew performs this operation. Permit me to redirection your command to the proper crew member. END_MESSAGE MESSAGE 107 Spock: Sulu, $VERB$ $NOUN$. END_MESSAGE 73 MESSAGE 108 Spock: Jim, surely you realize that you are not on the Enterprise's Bridge. The command "$VERB$ $NOUN$" is quite inappropriate here. END_MESSAGE MESSAGE 109 Spock: Captain, surely you realize that the Enterprise is only capable of Warp 1 through Warp 12, plus Impulse power, of course. END_MESSAGE MESSAGE 110 Sulu: What course should I plot first, Captain?. END_MESSAGE MESSAGE 111 Sulu: Going to warp factor $NOUN$. END_MESSAGE MESSAGE 112 Sulu: Plotting a course for the planet $OBJECT$, Captain. END_MESSAGE Now for the heart of the scene's interaction, the .CMD file meta-commands. First, any input command that the player addresses to a valid Creature in the game will first be tried against a group of meta-commands that are addressed to ANYBODY. This will happen automatically. For example, consider the following ANYBODY meta-commands: COMMAND ANYBODY, ANY NOT NamePresent (* Addressee isn't here. *) PrintMessage 105 (* Sorry, but $NAME$ doesn't seem to be here. *) DoneWithTurn END_COMMAND COMMAND ANYBODY, WARP ANY AtLocation 114 (* On Enterprise's Bridge *) NOT NameIsNumber 303 (* Command isn't being addressed to Sulu *) PrintMessage 106 (* Spock: You should address appropriate person. *) PrintMessage 107 (* Spock redirects command to Sulu for you. *) RedirectTo WARP $NOUN$ END_COMMAND COMMAND ANYBODY, WARP ANY RedirectTo WARP $NOUN$ END_COMMAND The first of the above will be tried for any player command that has been addressed to a Creature, no matter what the command is. For example, this command will be tried if the player enters SPOCK, FOLLOW ME or SULU, WARP 12. However, it would not be tried if the player did not direct his command to anyone, i.e., it would not be tried if the player simply inputs WARP 12 without addressing it to a specific creature. This first meta-command simply tests that the Creature being addressed in the command is at the current location and prints a "error" message if the creature isn't there. The second and third meta-commands above are tried whenever a player addresses his command to a Creature (any Creature, however) and the command is to WARP something. The second meta-command checks if the creature being addressed is 74 Sulu, and if it isn't -- gives an "error" message and redirects the command to Sulu. The third meta-command would only be tried if the player input SULU, WARP Something. This meta-command simply redirects the command to WARP Something, as if the command had not been addressed to anyone. These WARP Something meta-commands would be defined in the .CMD file as follows: COMMAND WARP ANY NOT AtLocation 114 (* NOT On Enterprise's Bridge *) PrintMessage 108 (* Spock: "$VERB$ $NOUN$" is inappropriate here. *) DoneWithTurn END_COMMAND COMMAND WARP ANY NounToVariable 1 (* Convert Noun to Variable number 1 *) VariableGT 1 12 OR VariableLT 1 1 PrintMessage 109 (* The Enterprise can only travel at warp 1 to 12. *) DoneWithTurn END_COMMAND COMMAND WARP ANY FlagOFF 1 (* Course has not been plotted yet *) PrintMessage 110 (* Sulu: What course to plot first, Captain?. *) DoneWithTurn END_COMMAND COMMAND WARP ANY FlagON 1 (* Course has been plotted already *) PrintMessage 111 (* Sulu: Going to warp factor $NOUN$. *) DoneWithTurn END_COMMAND The first three of the above meta-commands check for various "error" conditions and give "error" messages if appropriate. Specifically, the first meta-command tests if the player is not on the Bridge; the second tests if the warp speed is outside the acceptable range; and the third tests that a course has already been plotted. Only if none of these "error" conditions are met, would the fourth meta-command tell that player that the Enterprise was going to the indicated warp speed. There are only two more meta-commands required in order for the scene to work as shown at the start of this section. These meta-commands are both for the situation where the play enters a command to PLOT A COURSE TO Somewhere: COMMAND PLOT COURSE FOR ANY NOT AtLocation 114 (* NOT On Enterprise's Bridge *) PrintMessage 108 (* Spock: "$VERB$ $NOUN$" is inappropriate here. *) DoneWithTurn END_COMMAND 75 COMMAND PLOT COURSE FOR ANY TurnFlagON 1 (* Course has now been plotted *) DropIt 201 (* Put plotted course on Navigator's console *) PrintMessage 112 (* Sulu: Plotting course for $OBJECT$. *) DoneWithTurn END_COMMAND 76 APPENDIX A: STANDARD LEVEL VERBS UNDERSTOOD BY AGT Meanings of notation: [required word] {optional word} | (means OR, i.e., alternative words) Verbs that do not require nouns =============================== N,S,E,W,NE,NW,SE,SW,U,D, NORTH,SOUTH,EAST,WEST,NORTHEAST,NORTHWEST,SOUTHEAST,SOUTHWEST,UP,DOWN ENTER | GO [IN | INTO] EXIT | LEAVE (* directions *) SCORE (* display score and status *) QUIT | Q (* end game *) INVENTORY | I (* list things player is carrying and wearing *) SCREAM | SHOUT | YELL (* make noise but seldom accomplish anything *) WAIT (* waste a turn *) BRIEF | VERBOSE (* change description mode *) L | LOOK (* repeat full description *) SAVE | RESTORE {GAME} (* save and restore game status *) HELP | H (* ask for help *) SCRIPT (* Echo all output to both printer (LP1:) and screen *) UNSCRIPT (* Send all output to screen only *) Verbs that do require nouns (and perhaps objects) ================================================= LIST | SHOW [EXITS] (* list visible exits *) THROW | CAST | DUMP [noun] {[AT | TO | IN | INTO | ACROSS | INSIDE] [noun]} ATTACK | KILL | FIGHT | HIT [creature] {[WITH] [noun]} DROP | PUT DOWN [noun | ALL] GET | TAKE | PICK UP [noun | ALL] OPEN [noun] {[WITH] [noun]} CLOSE | SHUT [noun] LOCK [noun] {[WITH] [noun]} UNLOCK [noun] {[WITH] [noun]} EXAMINE | CHECK | INSPECT | LOOK AT | LOOK IN [noun] (* synonym is "." or "EX" *) READ [noun] EAT [noun] DRINK [noun] PUT | PLACE [noun] [IN | WITH | INSIDE | INTO | NEAR | BEHIND | BESIDE | ON | UNDER] [noun] PUSH | TOUCH [noun] {[WITH] [noun]} TURN [noun] {ON | OFF} TURN {ON | OFF} [noun] PULL [noun] PLAY {WITH} [noun] LIGHT [noun] EXTINGUISH | PUT OUT [noun] (* synonym is "EXT" *) SHOOT | FIRE [noun] [AT] [creature] SHOOT | FIRE [creature] [WITH] [noun] PUT ON | WEAR [noun | ALL] 77 TAKE OFF | REMOVE [noun | ALL] ASK [creature] [ABOUT] [noun] TALK [TO | WITH] [creature] {[ABOUT] [noun]} TELL [creature] [ABOUT] [noun] 78 APPENDIX B: META-COMMANDS CONDITIONAL TESTS *********************** PLAYER CONDITIONS ****************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= AtLocation 1 Location# Player is located at room Location# AtLocationGT 1 Location# Player is in room greater than Location# AtLocationLT 1 location# Player is in room less than Location# FirstVisitToRoom 0 None First visit to current room IsCarryingSomething 0 None Player is carrying something IsCarryingNothing 0 None Player is carrying nothing IsCarryingTreasure 1 Points# Player is carrying at least one item that is worth at least Points# IsWearingSomething 0 None Player is wearing something IsWearingNothing 0 None Player is wearing nothing LoadWeightEquals 1 Number Player's load weighs equals Number LoadWeightGT 1 Number Player's load weighs more than Number LoadWeightLT 1 Number Player's load weighs less than Number NewLife 0 None Player has just been resurrected or start of game *********************** ITEM(S) CONDITIONS ***************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= Present 1 Item# Item# is in room, carried or worn IsWearing 1 Item# Item# is being worn IsCarrying 1 Item# Item# is being carried IsNowhere 1 Item# Item# is located NOWHERE (room 0) IsSomewhere 1 Item# Item# is located somewhere (not in 0) InRoom 1 Item# Item# is located in current room IsLocated 2 Item# Loc# Item# is located in room Location# Together 2 Itm1# Itm2# Itm1# and Itm2# are in same place IsON 1 Item# Item# is ON IsOFF 1 Item# Item# is OFF IsOpen 1 Item# Item# is Open IsClosed 1 Item# Item# is Closed IsLocked 1 Item# Item# is Locked IsUnLocked 1 Item# Item# is UnLocked IsEdible 1 Item# Item# is Edible IsDrinkable 1 Item# Item# is Drinkable IsPoisonous 1 Item# Item# is Poisonous IsMovable 1 Item# Item# is Movable IsGroupMember 1 Item# Item# is a member of the group 79 ************************ NOUN CONDITIONS ******************************* Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= NOUNPresent 0 None NOUN is in room, carried or worn NOUNIsWearing 0 None NOUN is being worn NOUNIsCarrying 0 None NOUN is being carried NOUNIsNowhere 0 None NOUN is located NOWHERE (room 0) NOUNIsSomewhere 0 None NOUN is located somewhere (not in room 0) NOUNInRoom 0 None NOUN is located in current room NOUNIsLocated 1 Location# NOUN is located in room Location# NOUNIsON 0 None NOUN is ON NOUNIsOFF 0 None NOUN is OFF NOUNIsOpen 0 None NOUN is Open NOUNIsClosed 0 None NOUN is Closed NOUNIsLocked 0 None NOUN is Locked NOUNIsUnLocked 0 None NOUN is UnLocked NOUNIsEdible 0 None NOUN is Edible NOUNIsDrinkable 0 None NOUN is Drinkable NOUNIsPoisonous 0 None NOUN is Poisonous NOUNIsMovable 0 None NOUN is Movable NOUNpointsEquals 1 Number NOUN's points equal Number NOUNpointsGT 1 Number NOUN's points are greater than Number NOUNpointsLT 1 Number NOUN's points are less than Number NOUNweightEquals 1 Number NOUN's weight equals Number NOUNweightGT 1 Number NOUN's weight is greater than Number NOUNweightLT 1 Number NOUN's weight is less than Number 80 ******************** MISCELLANEOUS CONDITIONS ************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= NamePresent 0 None Addressee is present in current room NameIsNumber 1 Number Addressee is Creature or Noun number LightPresent 0 None Current room has necessary light RoomNeedsLight 0 None Current room needs a light FlagON 1 Flag# Flag# is ON FlagOFF 1 Flag# Flag# is OFF ScoreEquals 1 Number Current score is equal to Number ScoreGT 1 Number Score is greater than Number ScoreLT 1 Number Score is less than Number NumberEquals 1 Number Number input is equal to Number NumberGT 1 Number Number is greater than Number NumberLT 1 Number Number is less than Number AnswerIsCorrect 0 None Last answer was correct AnswerIsWrong 0 None Last answer was wrong TurnsEquals 1 Number Number of turns is equal to Number TurnsGT 1 Number Number of turns is greater than Number TurnsLT 1 Number Number of turns is less than Number CounterEquals 2 Ctr# Number Counter# is equal to Number CounterGT 2 Ctr# Number Counter# is greater than Number CounterLT 2 Ctr# Number Counter# is less than Number VariableEquals 2 Var# Number Variable# is equal to Number VariableGT 2 Var# Number Variable# is greater than Number VariableLT 2 Var# Number Variable# is less than Number CompareVariables 2 Var#1 Var#2 Variable#1 is less than Variable#2 VariableChance 2 Var# Number Variable# is less than a random number from 1 to Number Chance 1 Percent Odds percent, i.e., 10 % chance of TRUE PromptForYES 0 None Prompts for Y or N -- TRUE if Yes PromptForNO 0 None Prompts for Y or N -- TRUE if No VerbIsDirection 0 None Verb is movement or direction 81 APPENDIX C: META-COMMANDS ACTION TOKENS ********************** PLAYER ACTION TOKENS ******************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= GoToRoom 1 Location# Send player to Location# GoToRandomRoom 2 Loc#1 Loc#2 Randomly pick a room between Loc#1 and Loc#2 and send player to it GetIt 1 Item# Item# is now being carried WearIt 1 Item# Item# is now being worn DropIt 1 Item# Drop Item# into current room RemoveIt 1 Item# Remove Item# and drop into room GetNOUN 0 None NOUN is now being carried WearNOUN 0 None NOUN is now being worn DropNOUN 0 None Drop NOUN into current room RemoveNOUN 0 None Remove NOUN and drop into room DropEverything 0 None Drop all items being carried RemoveEverything 0 None Remove all items being worn KillPlayer 0 None Make player dead at end of turn ******************* ITEM/NOUN/LOCATION ACTION TOKENS *********************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= PutInCurrentRoom 1 Item# Put Item# in current room PutNOUNInCurrentRoom 0 None Put NOUN in current room SendToRoom 2 Item# Loc# Put Item# in room Location# SendNOUNToRoom 1 Location# Put NOUN in room Location# SendAllToRoom 1 Location# Send all carried items to Location# SendTreasuresToRoom 2 Loc# Point# Send all carried items whose points > Point# to Loc# Destroy 1 Item# Item# is now NOWHERE (in room 0) DestroyNOUN 0 None NOUN is now NOWHERE (in room 0) SwapLocations 2 Itm#1 Itm#2 Swap locations of Item#1 & Item#2 SendToItem 2 Itm#1 Itm#2 Put Itm#1 in location of Itm#2 SendNOUNToItem 1 Item# Put NOUN in location of Item# OpenIt 1 Item# Item# is now open CloseIt 1 Item# Item# is now closed LockIt 1 Item# Item# is now locked UnlockIt 1 Item# Item# is now unlocked OpenNOUN 0 None NOUN is now open CloseNOUN 0 None NOUN is now closed LockNOUN 0 None NOUN is now locked UnlockNOUN 0 None NOUN is now unlocked AddToGroup 1 Item# Adds Item# to group RemoveFromGroup 1 Item# Removes Item# from group MoveGroup 1 Location# Move group to Location# 82 ******************* MISCELLANEOUS ACTION TOKENS **************************** Number/Types TOKEN NAME Of Parameters Explanation ==================== ============= ========================================= ShowScore 0 None Show current SCORE PlusScore 1 Number Add Number to current SCORE MinusScore 1 Number Subtract Number from current SCORE ShowInventory 0 None Show current INVENTORY WaitForReturn 0 None Print 'Hit RETURN' message and wait TimePasses 0 None Show 'Time passes...' message Delay 1 Number Delay for Number seconds ClearScreen 0 None Clear screen DescribeThing 1 Number Describe thing Number (whatever) LookAtRoom 0 None Cause a VERBOSE look at room Tone 2 Hz Ms Makes a tone on speaker of Hz Hertz (440 Hertz = A on piano) for Ms milliseconds PrintMessage 1 Number Print message Number in .MSG file RandomMessage 2 Num1 Num2 Randomly picks a message from Num1 to Num2 in .MSG file and prints it BlankLine 0 None Print a blank line GetNumberInput 2 Num1 Num2 Prompt for player to input a Number where Num1 <= Number <= Num2. If Num1=Num2, then no range will be given in prompt. AskQuestion 1 Question# Ask and get answer to question# ChangePassageway 2 Dir# Loc# Create or close a passageway from current_room to Loc# via Dir#. Dir# = 1 = north ... Dir # = 12 = exit. If Loc# = 0 then closes passageway. If Loc# <> 0 then opens passageway to room Loc# via direction Dir#. Passageways are opened or closed at both ends simultaneously! TurnFlagON 1 Flag# Turn Flag# ON TurnFlagOFF 1 Flag# Turn Flag# OFF ToggleFlag 1 Flag# Toggle Flag# TurnCounterON 1 Counter# Turn Counter# ON -- sets to 1 TurnCounterOFF 1 Counter# Turn Counter# OFF -- sets to 0 SetVariableTo 2 Var# Number Set Variable Var# to Number AddToVariable 2 Var# Number Add Number to Var# SubtractFromVariable 2 Var# Number Subtract Number from Var# AddVariables 2 Var#1 Var#2 Add Var#2 and Var#1 and put answer into Var#1 SubtractVariables 2 Var#1 Var#2 Subtract Var#2 from Var#1 and put answer into Var#1 RandomVariable 2 Var# Number Set Var# to a random value between 1 and Number NounToVariable 1 Var# Set Var# to value of noun ObjectToVariable 1 Var# Set Var# to value of object WinGame 0 None Player wins game at end of turn EndGame 0 None Game ends at end of turn QuitThisCMD 0 None Quit evaluating this CMD QuitAllCMDs 0 None Finished with all meta-commands DoneWithTurn 0 None All Done this turn -- get input next ReDirectTo 0 None See explanation in manual. 83 APPENDIX D: AGT ERROR MESSAGES ERRORS DURING GAME COMPILATION ------------------------------ Error: "VERB is not a valid verb" -- VERB is not a standard AGT verb, nor has it been defined (so far) as a synonym for another verb. This error is in the *.DAT file. Error: ">>> Ignored: ASCII text" -- ASCII text encountered during reading of *.DAT file. Text does not correspond to anything normally expected in this file. Probably, just a comment by the game designer. Error: "FOR COMMAND VERB NOUN OBJECT -- MAXIMUM DATA SIZE" -- This meta-command is too big. i.e., too many conditions and actions. Break into two separate commands for VERB NOUN OBJECT. One COMMAND right after the other. This is a game designer error. Error: "Too many commands -- Processing halted" -- AGT only allows 400 meta-commands. The current meta-command being read from the *.CMD file would have been number 401. This is a game designer error. Error: "FOR COMMAND VERB NOUN OBJECT -- ILLEGAL VERB" -- This meta-command has a VERB which the parser does not recognize as a standard AGT verb, a custom verb or a synonym for a valid verb. This is a game designer error. Error: "FOR COMMAND VERB NOUN OBJECT -- ILLEGAL NOUN or OBJECT" -- This meta-command has a NOUN or OBJECT which the parser does not recognize as a standard AGT noun or a synonym for a valid noun. This is a game designer error. Error: "FOR COMMAND VERB NOUN OBJECT -- ILLEGAL TOKEN" -- This meta-command has something in it that the program does not recognize as a token. Probably, a game designer comment or a spelling mistake. ERRORS DURING RESTORING GAME ------------------------- Error: "File not found, can't restore FileName" -- FileName is not on disk. ERRORS DURING GAME PLAY ----------------------- Error: "I don't understand VERB as a verb." -- Try another VERB. Probably a spelling mistake. Error: "I don't understand NOUN as a noun." -- Try another word to identify this noun. May be a noun that does not really play a significant part in the game, i.e., something described in general in the room description, but not a separate object in the room. May also be a spelling mistake. Error: "I don't understand PREP as a preposition." -- Try another preposition. May be a spelling mistake. Error: "I don't understand OBJECT as the object of a preposition." -- Try another word to identify this noun. May be a noun that does not really play a significant part in the game, i.e., something described in general in the room 84 description, but not a separate object in the room. May also be a spelling mistake. Error: "Which NOUN do you mean, the ADJ1 NOUN or the ADJ2 NOUN?" -- Two or more nouns with the same name are present in the current room. Specify the one you mean by some phrase that includes the appropriate NOUN's adjective. Error :"I don't understand WORD as either a verb or a noun". Try another word to convey what you mean. May be a spelling mistake. Error: "You need a preposition and an object whenever you try to VERB a NOUN." Some verbs require prepositions and objects in order to work properly. For example, PLACE BOOK ON THE TABLE is fine, but PLACE BOOK by itself will generate this error. Error: "Too many words in command". AGT allows for a maximum of 12 words in each part of a compound command (i.e., between AND's and THEN's). Re-phrase your command to be more succinct. 85 APPENDIX E: VALUE RANGES FOR GAME DEFINITIONS The following are the valid ranges of numbers for nouns, rooms, and creatures. DO NOT assign improper numbers to any category, or you will experience unpredictable (but consistently erroneous) results. Player Carrying: 1 Player Wearing: 1000 ROOMS: 2 to 199 NOUNS: 200 to 299 CREATURES: 300 to 399 In addition, if the game designer is also using meta-commands, then the following valid ranges are appropriate: FLAGS 1 to 255 COUNTERS 1 to 9 VARIABLES 1 to 9 QUESTIONS 1 to 9 MESSAGES 1 to 250 META-COMMANDS 1 to 400 86 APPENDIX F: ABOUT THE AUTHORS Mark J. Welch is a 1983 graduate of the University of Massachusetts at Amherst [journalism/interdisciplinary (computer science)]. He worked as an editor, writer, and reporter for BYTE and InfoWorld until August 1986, when he began studies at the Boalt Hall School of Law of the University of California in Berkeley. He is co-author of a syndicated column of computer reviews for lawyers, published weekly in legal newspapers across the nation. He also continues to write reviews and other articles for several publications. In addition to games of all types, he is interested in law, programming languages, politics, applications software, and technology in general. He is just skilled enough at darts and juggling to embarrass (and possibly injure) himself and those nearby. David Malmberg has been active in the world of personal computer since 1977. He is the author or co-author of five published software products. His most successful products were the Turtle Graphics series published by HESware. These two programs have sold over 80,000 copies world-wide, been translated into Spanish, and won two Consumer Electronic Software Showcase awards as some of the best software of 1983. These programs are widely used in schools to teach computer literacy to children and other computer novices. Dave has also published numerous articles and programs in a computer magazines. He has been a Contributing Editor of both COMPUTE!'s HOME & EDUCATIONAL COMPUTING and MICRO magazines. He was one of the principal authors of COMPUTE!'s FIRST BOOK OF VIC, the best selling computer book of 1983. He has written regular columns on educational uses of computers and on LOGO for COMMODORE and POWER/PLAY magazines. 87