CALYX2.ADL calyx2.adl is a file that contains many useful default definitions and routines. To use calyx2.adl, simply put 'INCLUDE "calyx2.adl"' before the rest of your program. Calyx2.adl is widely based on Ross Cunniff's standard.adl (as is this documentation), but removed some of its errors and offers a lot more predefined standards. It is unfortunately NOT compatible to standard.adl. See section 6 for further information concerning this. Calyx2.adl defines six things: object properties, constants, global variables, useful words, some normal verbs and their actions, and some utility routines. 1. Object properties The following object properties are defined in calyx2.adl. The ADL programmer using calyx2.adl is advised not to re-use these properties with different meanings, as strange and unusual things will happen. SEEN = 16; OPENS = 15; OPENED = 14; TRANS = 13; INCAP = 12; ONCAP = 11; LIGHT = 10; FLAME = 9; NOTAKE = 8; ACTIVE = 7; AllLink = 29; SAVESENT = 28; This leaves boolean properties 1 through 6 and integer properties 17 through 27 free for the programmer's definition and use. The above properties are used as follows: SEEN The standard looking daemon sets this property of a room to TRUE whenever the player visits the room. OPENS This property should be set to TRUE if it is possible to open or close the object (a treasure chest would be an example of this). OPENED This property is set to TRUE if the object is already opened and FALSE if the object is closed. This is meaningful only if OPENS is TRUE. INCAP This property is set to TRUE if an object has an "in" capacity, but cannot be opened or closed. A sink or a cup are good examples for this. ONCAP This property is set to TRUE if the referred-to object has an "on" capacity, i.e. you can put other things on top of it. IMPORTANT: At this time of standard, an object may only have EITHER an INCAP, OR an ONCAP! TRANS This property should be set to TRUE if the object is transparent (a glass box or a bottle would be a good example of this). LIGHT This property should be set to TRUE if the object gives off light (in the case of a transportable object like a flashlight) or if the object is intrinsically lit (like an outdoor location). FLAME This property should be set to TRUE if the object is on fire. NOTAKE This property should be set to TRUE if it is desired that "take" and "drop" ignore the object when "take all" or "drop all" are requested. ACTIVE This property marks that an object is "active." This can mean that it is currently switched on, locked, or used in some other way. AllLink This property is used by the PREACT and ACTION routines of the verbs "take" and "drop" and should not be used by anything else. SAVESENT This property is used to hold the starting number of a block of six global variables in which to store a sentence for use with ActAction, below. 2. Constants For convenience and readability, calyx2.adl defines the following constants: TRUE = 1; FALSE = 0; NULL = 0; ON = 1; OFF = 0; In addition, the following constants are defined for use as arguments to the $spec routine: DEBUG = 1; RESTART = 2; QUIT = 3; SAVE = 4; RESTORE = 5; EXEC = 6; PRESERVE = 7; SCRIPT = 8; HEADER = 9; MARGIN = 10; The following constants are defined for use as arguments to the Expect routine (described in section 10.6): NO_OBJ = 1; ONE_OBJ = 2; MULT_OBJ = 4; PLAIN_OBJ = 8; STR_OBJ = 16; The following global variables are declared by calyx2.adl for use by the ADL programmer: First, AllSeen, MultList, MyConj, NumSeen, IobjSave, Skip, Scripting, Cloak, Conts, Indent, LastVerb, LastNumd, LastConj, LastDobj, LastPrep, LastIobj, Dark, MyLoc, Verbose; The above globals are used as follows: First is TRUE if the current Dobj is the first in the Dobj list. It is set to TRUE at the beginning of the game. AllSeen is TRUE if the player typed "all" in his sentence. MultList This is the head pointer of the multiple object list. MyConj records where "but" has been seen. NumSeen NumSeen contains the number of Dobj's seen by "take" or "drop" so far. IobjSave The Iobj is stored in IobjSave by the "take" and "drop" routines. If you want to mess around with these you should know exactly what you are doing. In most of the cases this makes sense only if you plan to (re)define something in calyx2.adl. Skip Skip is used in preference to ($exit 1) or ($exit 2) inside Object ACTIONs if it is desired that the rest of the Object list be processed by the Verb ACTION of "take" or "drop" (see the discussion on TakeAct and DropAct below). Scripting Set to TRUE while scripting to a file. Cloak This is a flag that is used when you desire an object not to print the "xyz: taken" line when it is taken, or the appropriate lines when dropping or putting. This is particularly useful if you intend to print a special message when taking this object. If you wish to program similar verbs, make sure that Cloak is set to FALSE by your verb ACTION. Conts Conts is TRUE if the "You can see:" message has been printed. You should set it to TRUE if you desire this message not to be printed to the screen. Indent Indent should be set to TRUE if object descriptions are to be indented by two spaces before being printed. It works, as opposite to standard.adl's Indent. Dark Dark is TRUE if it is currently dark. This variable is set by the Looker routine if there is no light in the current location of .ME, and may also be set as the result of some other action. MyLoc MyLoc is the location of the player at the outset of the previous turn. The routine Looker checks to see whether MyLoc is the same as the location of the player. If so, the room description is printed. If not, no action is performed by Looker. MyLoc is initialized to -1 to force the printing of a room description at the beginning of the game. Verbose Verbose should be set to TRUE if the player wishes that all room descriptions be verbose ones (i.e. long descriptions of the room and its contents). If Verbose is false and the room has been visited previously, a short description will be printed. LastVerb LastVerb, LastNumd, LastDobj, LastPrep, and LastIobj contain the values present in the sentence prior to the current sentence. These values are set in the standard looking daemon. The routine SaveSentence is provided for this purpose. 3. Words The following words are defined to be a standard part of the ADL vocabulary: PREP with, to, into, at, under, from, off, on; in = into; ARTICLE the, a, an; NOUN all, it; 4. Verbs and their actions Calyx2.adl declares the following verbs, and initializes their PREACT and ACTION routines to (usually) fairly simply-minded defaults. n, s, e, w, ne, se, nw, sw, up, down, enter, exit, get, put, take, drop, wear, remove, verbose, terse, open, close, lock, unlock, move, break, rub, touch, throw, read, burn, examine, look, inventory, quit, restart, save, restore, script, turn, douse, light, wait, again, go; The following verbs have special semantics and redefinition of their PREACT or ACTION routines should be avoided: NOVERB NOVERB (which is predeclared by ADL) is the verb returned by the parser if the player's sentence contained no verb. Calyx2.adl initializes the PREACT of NOVERB so that appropriate requests for more information are generated. put "Put" transforms itself into "drop" then calls the PREACT of "drop". get "Get" transforms itself into "take" then calls the PREACT of "take". take "Take" determines whether the sentence is one like "Take all but the sword and the shield". If it is then a list of objects is built up which are then taken. If not, the normal semantics apply. If the programmer wants an action to be performed by the "take" ACTION, the routine TakeAct should be defined. drop "drop" may be used in sentences like "Drop all but the book." If it is so used, a list of objects is created which are then dropped. If the programmer wants an action to be performed by the "drop" ACTION, the routine DropAct should be defined. go If "go" is used in a sentence like "Go north", the Verb is changed to "north" and the Dobj and Iobj are set to NULL. This only applies to the direction verbs "north", "south", "east", "west", "northeast", "southeast", "northwest", "southwest", "up", and "down". again If the standard actor action is in effect, the Verb "again" will never be called or seen by Objects since it is replaced by the previous sentence. In addition, there are some remarks to be made on the following verbs: enter, As opposite to the standard.adl verbs of the same name, exit these two now actually DO something. It is checked if the referred-to object is actually available, and then a "Silly" (see there) message is printed out. lock, The predefined ACTION prints out a message like "You can't unlock do that." If the programmer desire that an object can actually be locked, he has to define this in the appropriate object ACTION. The predefined property ACTIVE can be used as a flag. In addition to declaring the preceding verbs, calyx2.adl declares the following equivalencies: g = again; z = wait; x = examine; i = inventory; l = look; u = up; d = down; north = n; south = s; east = e; west = w; northeast = ne; northwest = nw; southeast = se; southwest = sw; brief = terse; put on = wear; take off = remove; turn on = light; turn off = douse; look at = examine; 5. Routines Calyx2.adl declares and defines the following Routines for use by the ADL programmer: StdInit, Reach, See, Lit, Avail, CheckAvail, Expect, Preact, Looker, Prompter, TakeAct, DropAct, ActAction, SaveSentence, Dwimmer, ClS, ObjCont, Silly; Their use is defined as follows: StdInit (StdInit actor) should be executed in START if the programmer desires that ALL of the default routines be used. Actor should be the name of the primary interactive Actor in the scenario. Reach (Reach object container) is TRUE if object is contained in container and if the player can reach the object. It is FALSE otherwise. Note that this also checks whether object is contained in something which is contained in container and so on. See (See object container) is TRUE if object is contained in container and the player can see the object. It is FALSE otherwise. This also checks containers inside containers. Lit (Lit) is TRUE if something is lighting the player's location and FALSE otherwise. Avail (Avail object) is TRUE if the player can see object (either in the room or in the player's inventory) and can reach the object. It is FALSE otherwise. CheckAvail (CheckAvail) checks to see whether the Dobj and Iobj typed by the player are available. If not, an appropriate message is printed and ($exit 1) is performed. Expect Expect is typically called by the PREACT of a Verb. It looks at the current sentence to see whether it is of acceptable form. The two parameters to Expect define criteria for acceptability. The first parameter indicates what types of direct objects are acceptable and the second indicates what types of indirect objects are acceptable. Each parameter consists of one or more of the Expect flags $or'd together. The flag NO_OBJ indicates that it is acceptable that no object be present; ONE_OBJ indicates that it is acceptable that one object be present; MULT_OBJ indicates that it is acceptable that multiple objects be present; STR_OBJ indicates that it's OK for the object(s) to be strings; and PLAIN_OBJ indicates that it's OK for the object(s) to be normal ADL objects. Example: { "take" needs 1 to N Dobjs and 0 or 1 Iobjs } take(PREACT) = (Expect ($or MULT_OBJ PLAIN_OBJ) ($or NO_OBJ ONE_OBJ PLAIN_OBJ)) ; { "quit" can accept no objects } quit(PREACT) = (Expect NO_OBJ NO_OBJ) ; { "unlock" needs exactly one Dobj and Iobj } unlock(PREACT) = (Expect ($or ONE_OBJ PLAIN_OBJ) ($or ONE_OBJ PLAIN_OBJ) ) ; { "say" needs a string to say and possibly someone to whom to say it } say(PREACT) = (Expect ($or ONE_OBJ STR_OBJ) ($or NO_OBJ ONE_OBJ PLAIN_OBJ)) ; Preact Preact is the standard PREACT for Verbs. It checks to make sure that exactly one plain Direct Object was typed and that the Indirect Object is not a string. It also checks to see whether all of the named objects are available. Looker Looker is the standard looking daemon. It is intended to be executed every turn. To enable this, either of the statements ($sdem Looker) or (StdInit actor) must be executed (where actor) is the primary actor). Prompter Prompter is the standard prompting routine. To use it, either of the statements ($prompt Prompter) or (StdInit actor) must be executed. ActAction ActAction is the standard Actor action. It checks to see whether the Verb "again" or the Object "it" was used and modifies the sentences appropriately. To use it, either of the statements ($setp .ME ACTION ActAction) or (StdInit actor) must be executed. TakeAct TakeAct is called by the default action routine of the Verb "take" after the ACTION routines of all of the Direct Objects have been executed. DropAct DropAct is similar to TakeAct, except that it is called by the ACTION routine of "drop". SaveSentence SaveSentence should be called by the ADL programmer if it is desired that the Verb "again" and the Object "it" work as in ActAction above. Looker calls SaveSentence every turn. Dwimmer Dwimmer is the standard DWIMming routine. It checks to see whether an ambiguous object could possibly be the one the player meant. To use Dwimmer, include the statement (IF (Dwimmer %1) THEN ($return 1)) in DWIMI and/or DWIMD. ClS Prints out 26 blank lines, which to my experience is enough for most screen formats to be utterly cleared. If this should not be the case, at least there'll be a proper spacing between texts. ObjCont Called in an object ACTION, this routine checks if the current Dobj is openable, or has an in- or oncapacity and prints out its contents, if available. Everything is checked for that cause, so the programmer just has to call the routine. If an object doesn't define its own reaction to "examine", ObjCont is automatically called by the examine ACTION. Silly Randomly prints out one of five messages equivalent to "That's silly." 6. Converting standard.adl files to calyx2.adl files. To convert files, you have to reassign some object properties. LOCKS and LOCKED cannot be used now (they didn't make sense if you also want to check for a key; you'd have to define the appropriate verb ACTION anyway), so you have to reprogram objects using these (you can alternatively use ACTIVE). If you have objects that seem suitable for the new INCAP or ONCAP properties, feel free to add these. The internal program structure will not change. If you want old containers to show their contents when examined, you can simply put the ObjCont routine to their ($eq @Verb examine) part. You MUST do this if there are any objects that don't have a special routine for ($eq @Verb examine) implemented, because else the continuity will be seriously disturbed, as calyx2.adl assumes ObjCont to be executed in the predefined examine verb ACTION. Note that several routines that didn't work correctly with standard.adl (e.g."put cup into cup," or putting something into a closed container) will now work properly without you having to change anything there. 7. Contacting the author and legal stuff. It's been a while since I have written calyx2.adl. Since I don't intend to work further on it, it is placed in the public domain. Please mention the original file, along with its version number, if you change the standard. If you have questions, you can contact me (as of this writing, 1996/JAN/23) as: Miron Schmidt Eibischstr.9, 12357 Berlin, GERMANY Tel.: (+49 30) 661 79 25 email: s590501@tfh-berlin.de (until at least 1998) I wrote all this for the Amiga version of ADL, and I don't know if there exist any differences to other ports. As I haven't coded ADL for a while, I cannot guarantee that I'll be able to help you, but you're invited to contact me anyway. :) Don't ask me about Calyx Corp. I founded Calyx in my late childhood, when I wanted to publish games for the C-64, and out of habit I keep using the name for my IF publications. Finally, I hope anybody can do anything with this. Taking the time of its writing into consideration, ADL is a fine piece of work, so I wouldn't be surprised if there were still any programmers using it out there.