PAW TECHNICAL GUIDE A Technical guide to: The Professional Adventure Writer A graphic adventure writing system for the Sinclair Spectrum computers Converted to Word Format by Pablo Contreras If Gilsoft want to sue me for this, please don't because: a) I'm a great fan of your product and want to encourage its use b) Nobody would buy it now anyway c) I did buy PAW when it came out d) I'm very skint Although I've tried to keep errors out, I am only human so please e-mail me any corrections you may find - my e-mail address is pablo@patrol.i-way.co.uk. ¸ 1986 Gilsoft International Ltd. Program: T.J. Gilberts, G.Yeandle and P.Wade Graphics: D.Peeke, K.Maddocks and A.Williams Manuals: T.J. Gilberts All Rights reserved. No part of this publication may be copied, loaned, hired or reproduced in any form whatsoever including electronic retrieval systems without the prior written consent of the authors and Gilsoft International Ltd. The above notice does not apply to the 'run time' routines appended to, and which form a part of, a saved game which you are free to distribute any way you wish in that form. All we would request is that you credit the use of the Professional Adventure Writer somewhere within the game. Acknowledgement Thanks to Howard and Pam for their forbearance. Phil for his 'comments', Greame for his ideas, Dicon et al for the graphics and all our customers for their support and suggestions. Overview PAW can be divided into three main functional areas thus: 1/ The Database The database is the collection of tables organised in a logical manner, which contain all the information to define an adventure game. This database is initially set up to contain a minimum of entries which will probably be needed in every game. There is usually one entry in a table to simplify the operations of the system. The database may utilise the additional sideways RAM pages of a 128K Spectrum. 2/ The Editor This consists of a two level menu system i.e. most functions on the main menu present a sub-menu from which all facilities can be selected. All facilities are set either from a command line as part of the sub- menu option or in response to a prompt. This combination of menu and command line has been found to be the most efficient both for the beginner and the more experienced user. 3/ The Interpreter The real heart of PAW is contained in this section of the program. The next chapter deals with the operation of the interpreter in detail, but it essentially fetches commands from the player and uses the information contained in the database to decode and respond to those commands. The sheer size of PAW precludes it being held entirely within the main memory area. On a 128K Spectrum the majority of the code is held as overlays on a sideways RAM page and transferred into the main area whenever required. A similar system is used on a 48K Spectrum by holdin three of the overlays in free memory until the area of memory used is overwritten. If the sideways RAM page is initialised on a 128K or the memory area overwritten on a 48K, an attempt to select an option not in the current overlay will result in PAW attempting to lead the requisite overlay from cassette (or disc). The main menu and overlay system gives an overhead of approximately 4K which is unavailable to PAW for the database. About 10K is consumed by the interpreter and its workspace (e.g. Ramsave buffer, input and wordwrap buffers etc.) This leaves approximately 27K for the database, plus 5 pages of 16K each, on a 128K Spectrum (a total of about 117K). This is maximised by the inclusion of a text compressor which introduces an overhead of 222 bytes (for an expansion dictionary) this giving about 40% effective text compression. On an average text only game on the 48K Spectrum this provides an effective addition of 8K of database space (i.e. a total of 35K). The Interpreter The following description of the interpreter should be read in conjunction with the flowcharts provided overleaf. Initialise The background colours and character set are selected - the screen isn't cleared as this always occurs upon describing location zero. The flags are all zeroed except for; flag 37, the number of objects conveyable, which is set to 4; flag 52, the maximum weight of objects conveyable, which is set to 10; flags 46 & 47, the current pronoun ("IT" usually), which are set to 255 (no pronoun) and glag 1 which is set to be the number of objects carried but not worn. Note that clearing the flags has the effect that the game always starts at location zero. This is because flag 38, the current location of the player, is now zero. Describe Current Location If flag 2 is non zero it is decremented (reduced by 1). If it is dark (flag 0 is non zero) and flag 3 is non zero then flag 3 is decremented. If it is dark, flag 4 is non zero and object 0 (the source of light) is absent, then flag 4 is decremented. The screen is cleared if the current screen mode (contents of flag 40) is not 1. If it is dark, and Object 0 is absent, then System message 0 (referred to as SM0 - "It's too dark to see anything") is displayed. Otherwise any picture present for the location is drawn and the location description displayed without a NEWLINE. Search Process Table 1 Flowchart 2 and the next section describe the scanning of a process table. Process table 1 is used mainly to contain the entries to add extra information to the current location description. E.g. details of open doors, objects present etc. It will also contain a PROTECT action, when using screen mode 4, to set the screen line for text to scroll under. We now enter the main loop of the interpreter which deals with teach time fame (i.e. each phrase extracted or each timeout on input which occurs) and the response to players commands. Search Process Table 2 This contains the main control for PAW's turn at the game. It is used to implement the movements and actions of PSI's, the uncontrolled events such as bridges collapsing, and so on. Get Phrase If flags 5 to 8 are non zero they are decremented. If it is dark (Flag 0 is non zero) and flag 9 is non zero then it is decremented. If it is dark and flag 10 is non zero is is decremented if object 0 is absent. The parser is called to extract a phrase and convert it into a logical sentence - LS. If the input buffer is empty, a new input line is obtained from the player by printing a prompt and making a call to the input routine. The prompt will be the system message whose number is contained in flag 42 - a value of 0 will select one of the system messages 2,3,4 or 5 in the ration 30:30:30:10 respectively. If the timeout option is selected, by making flag 48 contain a value greater than zero, then the input routine might time out. In this case SM35 ("Time passes.") is displayed and a return made to scan process 2 again. A phrase is extracted and converted into the logical sentence; by converting any words present, that are in the vocabulary, into their word value and placing them in the required flags. If no valid phrase can be found then SM6 ("I couldn't understand any of that") is displayed, and a return made to scan process 2. Search Response Table Turns (flag 31 and 32), which is the number of valid phrases extracted by the parser, is increased by one. Two flags area used to allow 256 lots of 256 turns (i.e. 65536). The Response table is then scanned, for an entry which matches the Verb and Noun1 of the current LS, using the process table routines detailed below. If it is successful in carrying out an action (i.e. If PAW executes at least one action other than NOTDONE) then a return is made to scan process table 2. Search the Connections Table A search is made of the connections table entry for the current location, for a word which matches the current LS Verb. If one is found then the players current location (flag 38) is set to be the number associated with the word. Then a return is made to describe the current location. Otherwise PAW prints SM8 ("I can't go in that direction") if the current LS Verb has a word value less than 14 or SM7 ("I can't do that") if it does not. In both cases a return is made to scan process table 2. Flowchart 1 /-------\ | Start | \-------/ | +----------+ |Initialise| +----------+ | +---\ | |D >------------+---------------------------------------+ +---/ | | +-----------+ | |Describe | | |Location | | |Process 1 | | +-----------+ | | | +-------------------------| | | | | | +-----------+ | | |Process 2 | | | |Get Phrase | | | +-----------+ | | | | | /-\ | | No /---- ----\ Yes | ^ +------< Found? >-------+ | | | \----\-/----/ | ^ | | | | | /-\ +-----------+ | | No /---- ----\ Yes |TURNS+1 | | | +-< Timeout? >----+ |Search | | | | \---- ----/ | |Response | | | | \-/ | +-----------+ | | | | | | | /------------/ /----------/ | | | |SM6 | |SM35 | | | | |"I don't | |"Time | | | | |"Understand"| |Passes.." | | | | /------------/ /----------/ /-\ | | | | Yes /---- ----\ No | +------+----------------+--<------< Done? >-----+ ^ | \----\-/----/ | | | | | | +-----------+ | | |Search | | | |Connection | | | |Table | | | +-----------+ | | | | | /-\ | | No /---- ----\ Yes | | +-----------------------< Found? >----+ | | \----\-/----/ | /-\ | /---- ----\ | +--------< Verb<14? >-----------+ | | \----\-/----/ | | | | | /----------/ /-----------/ | |SM8 | |SM7 | | |"Can't | |"Can't go | | |do that" | |that way" | | /----------/ /-----------/ | | | +------+---------------<------------------+ Flowchart 2 /-------\ | Start | \-------/ | +-------------------------------------+ | | /-\ | No /---- ----\ | +------------------ | | \----\-/----/ ^ | | Yes | | /----/-\----\ Yes | | ----------------+ | | \----\-/----/ | ^ | | No /----/-\----\ No | | | < Verb Match? >------+ | | \----\-/----/ | | | | Yes ^ | | /----/-\----\ No | | | < Noun Match? >------+ | | \----\-/----/ | | | | Yes ^ | +-----------------------+----<--------+-+ | | | | | /----/-\-----\ No | | | -----------------------------+ | | \----\-/-----/ ^ | | | Yes | | | | | ^ | No /----/-\-----\ Yes | | | +---------< Condition? >---------------+ | | | | \----\-/-----/ | ^ | | | | | | | +-----------+ /----/-\----\ No | | | | Do Action | < Succeed? >------+ | | +-----------+ \----\-/----/ | | | | Yes | | /----/-\----\ Yes +---\ | | | < DESC? >-------+ D > | | | \----\-/----/ +---/ | | | | No | | | /----/-\----\ No | | +-< Exit? >---------------------------------+---------------+ | \----\-/----/ | +--------+ | /-------\ | End | \-------/ Scan a Process Table Response is a process table (Note that any sub-processes which are called from within Response exhibit the same features), so it will also be scanned by this section of PAW> The difference of course is that PAW tries to match the Verb and Noun1 of the logical sentence in a Response table. Essentially PAW will look at each entry in the table until it is exhausted - the table of entries, not PAW! Assuming there is an entry, it will, if in Response, ensure the Verb and Noun match those of the LS. The use of the words "*" and "_", as either the Verb or the Noun, will cause a match with any word in that part of the logical sentence. Thus entries in Response of "* *", "_ _", and combinations of same, will cause a trigger of the entry no matter what the LS. This feature must be used in any table which will be called by both a Response and a Process table. If in a Process the Verb and Noun will match anyway, no matter what the logical sentence. PAW will then look at each CondAct in turn; if it is a condition, which succeeds, then PAW will look at the next condact. Otherwise it will drop out of the current condact list and look at the next entry, if present, in the table - an exception to this is the CondAct QUIT which, if it fails, will drop out of the table completely - this is not shown in flowchart 2 for clarity. If it is an action it will be carried out. Actions can be divided into five main groups: 1/ Desc; which will completely exit the execution of all tables (i.e. even if in a 10th level sub-process) and jump to describe the current location. 2/ END: (a group on its own) which will completely exit the execution of all tables and jump to initialise a new game. 3/ Exit; any action which will stop processing of the current table and exit to the calling table (or back to the main loop if in Response, Process 1 or 2). E.g. INVEN, DONE etc. 4/ Conditional Exit; any action which will stop processing of the current table and exit to the calling table (or back to the main loop if in Response, Process 1 or 2) if it fails to do its required function. E.g. GET, PUTIN etc. Otherwise it will continue with the next CondAct. 5/ Normal; any action which carries out its function, and allows PAW to continue looking at the next CondAct in the current entry. E.g. COPYFF, PLUS etc. It may be seen that QUIT acts like a type 4 action, but is still a condition, so its a CondAct! The summary of CondActs at the end of this book shows which type each Action is. The CondActs There now follows a detailed description of each CondAct. They are divided into groups according to the subject they deal with in PAW; such as flags, objects etc and give some hints as to a possible use. Several abbreviations are used in the descriptions as follows. locno. Is a valid location number. locno+ is a valid location number or; 252 (not-created), 253 (worn), 254 (carried) and 255 which is converted into the current location of the player. mesno. is a valid message. sysno. is a valid system message flagno. is any flag (0 to 255). procno. is a valid sub-process number. word is word of the required type, which is present in the vocabulary, or "_" which ensures no-word - not an anymatch as normal. value is a value from 0 to 255. Conditions There are four conditions which deal with testing the location of the player as follows; AT locno. Succeeds if the current location is the same as locno. NOTAT locno. Succeeds if the current location is different to locno. ACGT locno. Succeeds if the current location is greater than locno. ATLT locno. Succeeds if the current location is less than locno. There are eight conditions which deal with the current location of an object; PRESENT objno. Succeeds if Object objno. is carried, worn, or at the current location. ABSENT objno. Succeeds if Object objno. is not carried, not worn and not at the current location. WORN objno. Succeeds if object objno. is worn. NOTWORN objno. Succeeds if Object objno. is carried. CARRIED objno. Succeeds if Object objno. is carried. NOTCARR objno. Succeeds if Object objno. is not carried. ISAT objno. locno+ Succeeds if Object objno. is not at Location locno. ISNOTAT objno. locno+ Succeeds if Object objno. is not at Location locno. There are eight conditions which deal with the value and comparison of flags; ZERO flagno. Succeeds if Flag flagno. is set to zero. NOTZERO flagno. Succeeds if Flag flagno. is not set to zero. EQ flagno. value Succeeds if Flag flagno. is equal to value. NOTEQ flagno. value Succeeds if Flag flagno. is not equal to value. GT flagno. value Succeeds if Flag flagno. is greater than value. LT flagno. value Succeeds if Flag flagno. is set to less than value. SAME flagno1 flagno2 Succeeds if Flag flagno1 has the same value as Flag flagno2. NOTSAME flagno1 flagno2 Succeeds if Flag flagno1 does not have the same value as Flag flagno2. There are five conditions to check for an extended logical sentence. It is best to use these conditions only if the specific word (or absence of word using "_") is needed to differentiate a situation. This allows greater flexibility in the commands understod by the entry. ADJECT1 word Succeeds if the first noun's adjective in the current LS is word. ADVERB word Succeeds if the adverb in the current LS is word. PREP word Succeeds if the preposition in the current LS is word. NOUN2 word Succeeds if the second noun in the current LS is word. ADJECT2 word Succeeds if the second noun's adjective in the current LS is word. The following condition is for random occurrences. You could use it to provide a chance of a tree falling on the player during a lightning strike or a bridge collapsing etc. Do not abuse this facility, always allow a player a way of preventing a problem; such as rubber boots for the lightning, or similar. CHANCE percent Succeeds if percent is less than or equal to a random number in the range 1-100 (inclusive). This a CHANCE 50 condition would allow PAW to look at the next CondAct only if the random number generated was between 1 and 50, a 50% chance of success. A single condition to test for a timeout; TIMEOUT Will succeed if the last request for input from the player was allowed to timeout. For example an entry in Process table 2 of; TIMEOUT MESSAGE 0 (where message 0 read "Come on sleepy") could be created, perhaps with a CHANCE or a count of time outs to make it less monotonous! The true CondAct; QUIT SM12 ("Are you sure") is printed and the input routine called. Will succeed if the player replies with the first letter of SM30 ("Y") to the prompt. If not then Actions NEWTEXT and DONE are performed. Actions There are nineteen actions to deal with the manipulation of object positions; GET objno. If Object objno. is worn or carried, SM25 ("I already have the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not at the current location, SM26 ("There isn't one of those here.") is printed and actions NEWTEXT DONE are performed. If the total weight of the objects carried and worn by the player plus Object objno. would exceed the maximum conveyable weight (Flag 52) then SM43 ("The _ weighs too much for me.") is printed and actions NEWTEXT DONE are performed. If the maximum number of objects is being carried (Flag 1 is greater than, or the same as, Flag 37) ("I can't carry any more things.") is printed and actions NEWTEXT DONE are performed. In addition any current DOALL loop is cancelled. Otherwise the position of Object objno. is changed to carried, Flag 1 is incremented and SM36 ("I now have the _.") is printed. DROP objno. If Object objno. is worn then SM24 ("I can't. I'm wearing the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is at the current location (but neither worn nor carried), SM49 ("I don't have the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not at the current location then SM28 ("I don't have one of those.") is printed and actions NEWTEXT DONE are performed. Otherwise the position of Object objno. is changed to the current location, Flag 1 is decremented and SM39 ("I've dropped the _.") is printed. WEAR objno. If Object objno. is at the current location (but not carried or worn) SM49 ("I don't have the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is worn, SM29 ("I'm already wearing the _.") is printed and action NEWTEXT DONE are performed. If Object objno. is worn, SM29 ("I'm already wearing the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not carried, SM28 ("I don't have one of those.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not flagged as Wearable (WR option in the object weight menu) then SM40 ("I can't wear the _.") is printed. Otherwise the position of Object objno. is changed to worn, Flag 1 is decremented and SM37 ("I'm now wearing the _.") is printed. REMOVE objno If Object objno. is carried or at the current location (but not worn) then SM50 ("I'm not wearing the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not worn, SM23 ("I'm not wearing one of those.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not flagged as wearable (and thus removable) then SM41 ("I can't remove the _.") is printed and actions NEWTEXT DONE are performed. If the maximum number of objects is being carried (Flag 1 is greater than, or the same as, Flag 37), SM42 ("I can't remove the _. My hands are full.") is printed and actions NEWTEXT DONE are performed. Otherwise the position of Object objno. is changed to carried. Flag 1 is incremented and SM38 ("I've removed the _.") printed. CREATE objno The position of Object objno. is changed to the current location and Flag 1 is decremented if the object was carried. DESTROY objno. The position of Object objno. is changed to not-created and Flag 1 is decremented if the object was carried. SWAP objno1 objno2 The positions of the two objects are exchanged. Flag 1 is not adjusted. The currently referenced object is set to be Object objno2. PLACE objno. locno+ The position of Object objno. is changed to Location locno. Flag 1 is decremented if the object was carried. It is incremented if the object is placed at location 254 (carried). PUTO locno+ The position of the currently referenced object (i.e. that object whose number is in flag 51), is changed to be Location locno. Flag 54 remains its old location. Flag 1 is decremented if the object was carried. It is incremented if the object is placed at location 254 (carried). PUTIN objno. locno. If Object locno. does not exist or is not flagged as a container (option C on the object weight menu) then a run time error is generated of "Illegal Argument". If Object objno. is worn then SM24 ("I can't. I'm wearing the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is at the current location (but neither worn nor carried), SM49 ("I don't have the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is not at the current location, but not carried, then SM28 ("I don't have one of those.") is printed and actions NEWTEXT DONE are performed. Otherwise the position of Object objno. is changed to Location locno. Flag 1 is decremented and SM44 ("The _ is in the"), a description of Object locno. and SM51 (".") is printed. TAKEOUT objno. locno. If Object locno. does not exist or is not flagged as a container (option C on the object weight menu) then a run time error is generated "Illegal Argument". If Object objno. is worn or carried, SM25 ("I already have the _.") is printed and actions NEWTEXT DONE are performed. If Object objno. is at the current location, SM45 ("The _ isn't in the"), a description of Object locno. and SM51 (".")is printed and actions NEWTEXT DONE are performed. If Object objno. is not at the current location and not at Location locno. then SM52 ("There isn't one of those in the"), a description of Object locno. and SM51 (".")is printed and actions NEWTEXT DONE are performed. If Object locno. is not carried or worn, and the total weight of the objects carried and worn by the player plus Object objno. would exceed the maximum converyable weight (Flag 52) then SM43 ("The _ weighs too much for me.") is printed and actions NEWTEXT DONE are performed. If the maximum number of objects is being carried (Flag 1 is greater than, or the same as, Flag 37), SM27 ("I can't carry any more things.") is printed and actions NEWTEXT DONE are performed. In addition any current DOALL loop is cancelled. Otherwise the position of Object objno. is changed to carried, Flag 1 is incremented and SM36 ("I now have the _.") is printed. Note: No check is made, by either PUTIN or TAKEOUT, that Object locno. is actually present. This must be carried out by you if required. DROPALL All objects which are carried or worn are created at the current location (i.e. all objects are dopped) and Flag 1 is set to 0. This is included for compatibility with older writing systems. Note that DOALL 254 will carry out a true DROP ALL, taking care of any special actions included. The next six actions are automatic versions of GET, DROP, WEAR, REMOVE, PUTIN and TAKEOUT. They are automatic in that instead of needing to specify the object number, they each convert Noun (Adjective)1 into the currently referenced object - by searching the object word table. The search is for an object which is at one of several locations in descending order of priority - see individual descriptions. This search against priority allows PAW to 'know' which object is implied if more than one object with the same Noun description (when the player has not specified an adjective) exists; at the current location, carried or worn - and in the container in the case of TAKEOUT. AUTOG A search for the object number represented by Noun (Adjective)1 is made in object word order of location priority; here, carried, worn. i.e. The player is more likely to be trying to GET an object that is at the current location than one that is carried or worn. If an object is found its number is passed to GET action. Otherwise if there is an object in existence anywhere in the game if Noun1 was not in the vocabulary then SM26 ("There isn't one of those here.") is printed. Else SM8 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the game). Either way actions NEWTEXT DONE are performed. AUTOD A search for the object number represented by Noun (Adjective)1 is made in object word in order of location priority; carried, worn, here. i.e. The player is more likely to be trying to DROP a carried object than one that is worn or here. If an object is found its number is passed to the DROP action. Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary then SM28 ("I don't have one of those.") is printed. Else SM8 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the game). Either way actions NEWTEXT DONE are performed. AUTOW A search for the object number represented by Noun (Adjective)1 is made in object word in order of location priority; carried, worn, here. i.e. The player is more likely to be trying to WEAR a carried object than one that is worn or here. If an object is found its number is passed to WEAR action. Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary then SM28 ("I don't have one of those.") is printed. Else SM8 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the game). Either way actions NEWTEXT DONE are performed. AUTOR A search for the object number represented by Noun (Adjective)1 is made in object word in order of location priority; worn, carried, here. i.e. The Player is more likely to be trying to REMOVE a worn object than one that is carried or here. If an object is found its number is passed to the REMOVE action. Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary then SM23 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the game). Either way actions NEWTEXT DONE are performed. AUTOP locno. A search for the object number represented by Noun (Adjective)1 is made in object word in order of location priority; carried, worn, here. i.e. The plyaer is more likely to be trying to PUT a carried object inside another than one that is worn or here. If an object is found its number is passed to the PUTIN action. Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary then SM28 ("I don't have one of those.") is printed. Else SM8 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the game). Either way actions NEWTEXT DONE are performed. AUTOT locno. A search for the object number represented by Noun (Adjective)1 is made in object word in order of location priority; in container, carried, worn, here. i.e. The player is more likely to be trying to get an object out of a container which is actually in there than one that is carried, worn or here. If an object is found its number is passed to the TAKEOUT action. Otherwise if there is an object in existence anywhere in the game or if Noun1 was not in the vocabulary then SM52 ("There isn't one of those in the "), a description of Object locno. and SM51 (".") is printed. Else SM8 ("I can't do that.") is printed (i.e. It is not a valid object but does exist in the game). Either way actions NEWTEXT DONE are performed. Note: No check is made, by either AUTOP or AUTOT, that Object locno. is actually present. This must be carried out by you - if required. COPYOO objno1 objno2 The position of Object objno2 is set to be the same as the position of Object Objno1. The currently referenced object is et to be Object objno2. There ae four actions which allow various parameters of objects to be; placed in flags, set fro flags - for comparison or manipulation. COPYOF objno. flagno. The position of Object objno. is copied into Flag flagno. This could be used to examine the location of an object in a comparison with another flag value. e.g. COPYOF 1 11 SAME 11 38 could be used to check that object 1 was at the same location as the player - although ISAT 1 255 would be better! COPYFO flagno. objno. The position of Object objno. is set to be the contents of Flag flagno. An attempt to copy from a flag containing 255 will result in a run time error of "Invalid Argument". Setting an object to an invalid location will still be accepted as it presents no danger to the operation of PAW. WHATO A search for the object number represented by Noun (Adjective)1 is made in object word in order of location priority; carried, worn, here. This is because it is assumed any use of WHATO will be related to carried objects rather than any that are worn or here. If an object is found its number is placed in flag 51, along with the standard current object parameters in flags 54-57. This allows you to create other auto actions (the tutorial gives an example of this for dropping objects in the tree). WEIGH objno. flagno. The true weight of Object objno. is calculated (i.e. if it is a container, any objects inside have their weight added - don't forget that nested containers stop adding their contents after ten levels) and the value is placed in Flag flagno. This will have a maximum value of 255 which will not be exceeded. If Object objno. is a container of zero weight, Flag flagno. will be cleared as objects in zero weight containers, also weigh zero! Now ten actions to manipulate the flags; SET flagno. Flag flagno. is set to 255. CLEAR flagno. Flag flagno. is cleared to 0. LET flagno. value Flag flagno. is set to value. PLUS flagno. value Flag flagno. is increased by value. If the result exceeds 255 the flag is set to 255. MINUS flagno. value Flag flano. is decreased by value. If the result is negative the flag is set to 0. ADD flagno1 flagno2 Flag flagno2 has the contents of Flag flagno1 added to it. If the result exceeds 255 the flag is set to 255. SUB flagno1 flagno2 Flag flagno2 has the contents of Flag flagno1 subtracted from it. If the result is negative the flag is set to 0. COPYFF flagno1 flagno2 The contents of Flag flagno1 is copied to Flag flagno2. RANDOM flagno. Flag flagno. is set to a number from the Pseudo-random sequence from 1 to 100. This could be useful to allow random decisions to be made in a more flexible way than with the CHANCE condition. MOVE flagno This is a very powerful action designed to manipulate PSI's. It allows the current LS Verb to be used to scan connections table for the location given in Flag flagno. If the Verb is found then Flag flagno. is changed to be the location number associated with it, and the next condact is considered. If the verb is not found, or the original location number was invalid, then PAW considers the next entry in the table - if present. This you could consider that PAW carries out the following imaginary entries on exit from Response if no action has been done; _ _ MOVE 38 ; Attempt to move player DESC ; Describe this new loc. _ _ LT 33 14 ; Movement word? SYSMESS 7 ; "Can't go that way.." DONE _ _ SYSMESS 8 ; "I can't do that" This feature could be used to provide characters with Random movement in valid directions; by setting the LS Verb to a random movement word and allowing MOVE to decide if the character can go that way. Note that any special movements which are dealt with in the Response for the player, must be dealt with separately for a PSI as well. Three actions to manipulate the flags dealing with the player; GOTO locno. Changes the current location to locno. This effectively sets flag 38 to the value locno. WEIGHT flagno. Calculates the true weight of all objects carried and worn by the player (i.e. any containers will have the weight of their contents added upto a maximum of 255) this value is then placed in Flag flagno. This would be useful to ensure the player was not carrying too much weight to cross a bridge without it collapsing etc. ABILITY value1 value2 This sets Flag 37, the maximum number of objects conveyable, to value1 and Flag 52, the maximum weight of objects the player may carry and wear at any one time (or their strength), to be value2. No checks are made to ensure that the player is not already carrying more than the maximum. GET and so on, which check the values, will still work correctly and prevent the player carrying any more objects, even if you set the value lower than that which is already carried! There are seven actions which deal with the manipulation of the flags for the screen mode, format and input etc; MODE mode option There are five screen modes each controlled by Flag 40 and set using the MODE action thus:- Mode 0 If a picture (other than 'subroutine') is present in the database, the screen is cleared to the default colours and the picture drawn. Once a key is pressed the original colours are restored, and the location is described. Mode 1 Text Only. Full screen scroll. Text is output to the screen continuously. CLS is not active on describe. Mode 2. If a picture (other than 'subroutine') is present in the database, the screen is cleared to the default colours and the picture drawn. The original colours are restored, the area below the line given in Flag 41 is cleared and text printed from the same line. Mode 3 As Mode 2 above but the picture does not scroll away. Mode 4 A text only mode which protects the location description as if it were a picture, all other text scrols under. You will probably need a PROTECT action at a suitable point in Process 1 (e.g. after LISTOBJ?) as otherwise only as far as the last but one line of text will be protected. In all graphic modes above; option 2 forces the border NOT to be set to the Paper colour - it's best to select this in modes 2 & 3 as the border is reset as soon as the picture is fully drawn causing an annoying flicker. Option 1 makes SM32 ("More.") appear when the screen area fils (unlike "Scroll?" you cannot breakout - will, in the editor you can!). Option 3 of course provides both options and option 0 neither! e.g. MODE 4 1 will select a fixed text window with a "More." prompt. LINE lineno. This sets the line that text should be printed from in the split screen graphic modes, and in the case of mode 2 the top line of the area to be cleared. Be careful when using a lower screen input (see INPUT action) to allow at least four spare lines in the upper screen (not forgetting to account for the number of lines used by the prompt and marker) or a runtime error will occur if a full input line is entered. GRAPHIC option This allows the way in which pictures are dealt with by PAW to be modified, there are three valid options; 0 - Normal, any picture present for a location is drawn when the player first visits that location, and then only if pictures are turned ON or a temporary redraw is requested. 1 - OFF, any pictures are completely ignored by PAW, even if a temporary redraw is requested. 2 - ON, any picture present for a location is drawn every time the player visits that location. There is an option 3 (option = 2+1) but pictures OFF takes priority anyway, so it is redundant. The current picture for a location can be redrawn by adding 128 to flag 29, this is a temporary redraw, which can be used for when the player requests the picture in Normal mode. i.e. PLUS 29 128 DESC would be required entry in Response. PROMPT sysno. Causes System message sysno. to be displayed whenever PAW obtains a command line from the player. A value of 0 (default) will cause PAW to select one of SM2, SM3, SM4 or SM5 in the ratio 30:30:30:10 respectively. Note this does not affect the prompts displayed by the END or QUIT condacts. TIME duration option Allows input to be set to 'time-out' after a specific duration in 1.28 secon intervals, i.e. the Process 2 table will be called again if the player types nothing for the specified period. 'option' allows this to also occur on ANYKEY and "More." prompt. In order to calculate the number to use for the option just add the numbers hown next to each item to achieve the required combination; 1 - While waiting for the first character of Input only. 2 - While waiting for the key on the "More." prompt. 4 - While waiting for the key on the ANYKEY action. e.g. TIME 5 6 (option = 2+4) will allow 6.4 seconds of inactivity on behalf of the player on input, ANYKEY or "More." and between each keypress. Whereas TIME 5 3 (option = 1+2) allows it only on the first character of input and on "More.". Time 0 0 will stop timeouts (default). INPUT options This action allows the way the input routine operates to be changed by selecting options. Some combinations are of no use but are a by product of the way PAW works. To calculate the number to use for the option just add the numbers shown next to each item to achieve the required combination; 1 - Will cause the input prompt, marker and cursor to be displayed in the lower screen area. This is the preferred input mode for time out games, where timeout can occur between keypresses, as the input line is not left partially printed if timeout occurs part way through. 2 - will cause PAW to print a copy of the input line when ENTER is pressed, this is for use mainly with item 1 to allow the final input line to be displayed on screen so that the player knows what has been typed. 4 - This will cause the reprint of any text input so far, when input is resumed after a timeout. Again mainly for use with item 1 when timeout can occur between keypresses. A default of INPUT 0 (no options) is assumed by PAW. PROTECT Used in conjunction with MODE 4 mainly. This action sets the current print line as the top of the scrolling text window. It should only be used within Process 1 (it will be allowed elsewhere but has no meaning) after any text you want protected has been printed. This is usually before / after a LISTOBJ action as objects are usually the last thing printed. It also has uses in other modes to allow say a picture and part of the location description to be protected, with the remainder of the text scrolling underneath! Three actions to deal with the printing of flag values on the screen; PRINT flagno. The decimal contents of Flag flagno. are displayed in the current temporary colours without leading or trailing spaces. This is a very useful action. Say flag 100 contained the number of coins carried by the player, then an entry in a process table of MES 10 ("You have ") PRINT 100 MESSAGE 11 (" gold coins."), could be used to display this to the player. TURNS SM17-20 "You have taken x turn(s)." is printed where x is Flag 31 + 256 * Flag 32. SCORE SM21-22 "You have scored x%" is printed where x is Flag 30. Thirteen (!) actions to deal with screen output and control; CLS Clears the screen to current background colours. Also clears the current print position and SAVEAT position to 0,0. NEWLINE Prints spaces to the end of the current line and then resets the colours & character set to the current background colours. MES msno. Prints Message mesno. in the current temporary colours, then carries out a NEWLINE action. SYSMESS sysno. Prints System Message sysno. in the current temporary colours. PICTURE locno. Draws graphics picture locno. regardless of whether it is a subroutine or main picture. Note: the screen and colours are not cleared first as with describe location. This could be used to add (or take away if you PRINTAT and MES to remove with spaces) parts of a picture. The sample game TEWK uses this feature several times. Note that a picture will be drawn from the last point used by the previous picture drawn! PAPER n Where n ranges from 0 to 9. Changes background paper colour. INK n Where n ranges from 0 to 9. Changes background ink colour. BORDER n Where n ranges from 0 to 7. Changes screen border colour. CHARSET value Changes main character set to value given if valid, otherwise no action is taken. The next three screen control actions allow a section of text to be printed on the screen away from the current print position. This could be used to provide an information line on top of the current picture, or a section of text in a small window on the picture etc etc. TEWK uses this facility to provide its drop down window inventory in response to the STATUS command. SAVEAT Flushes the current wordwrap buffer thus restoring the current background colours. Then saves the current print position, overwriting any previously saved position. BACKAT Flushes the current wordwrap buffer thus restoring the current background colours. Then restores the print position last saved by SAVEAT. PRINTAT lineno. colno. The current print position is changed to the specified value. note this will also flush the wordwrap buffer and restore the temporary colours to the background colours. Three actions dealing with listing objects on the screen. The first two are controlled by / set the value of Flag 53 as desribed in the chapter on objects. LISTOBJ If any objects are present then SM1 ("I can also see:") is printed, followed by a list of all objects present at the current location. If there are no objects then nothing (as in null, not the word!) is printed. LISTAT locno+ If any objects are present then they are listed. Otherwise SM53 ("nothing.") is printed - note that you will usually have to precede this action with a message along the lines of "In the bag is;" etc. It would be possible to create an alternative to the INVEN action described next by using 254 & 254 as parameters for LISTAT. INVEN This action is not affected by the continuous object list flag for compatibility with older writing systems. SM9 ("I have with me:") is printed. If no objects are carried or worn SM11 ("Nothing at all.") is printed. Otherwise the object text for each object that is carried or worn is printed on a separate line. If an object is worn its object text is followed by SM10 (" (worn)"), right aligned on the next line if it will not fit on the same one. Action DONE is then performed. The two actions which completely exit Response / Process execution; DESC Will cancel any DOALL loop, any sub-process calls and make a jump to describe the current location. END SM13 ("Would you like to play again?") is printed and the input routine called. Any DOALL loop an sub-process calls are concelled. If the reply does not start with the first character of SM31 a jump is made to Initialise. Otherwise a jump is made to the Editor (if it is present) or to the BASIC NEW command. Three exit table actions; DONE This action jumps to the end of the process table and flags to PAW that an action has been carried out. i.e. no more condacts or entries are considered. A return will this be made to the previous calling process table, or to the start point of any active DOALL loop. NOTDONE This action jumps to the end of the process table and flags to PAW that no action has been carried out. i.e. no more condacts or entries are considered. A return will this be made to the previous calling process table or to the start point of any active DOALL loop. This will cause PAW to print one of the "I can't" messages if needed. i.e. if no other action is carried out and no entry is present in connections for the current Verb. OK SM15 ("OK") is printed and action DONE is performed. Four actions to allow the current state of the game to be saved and restored; SAVE The standard start tape message for the spectrum is printed at the bottom of the screen. When a key is pressed the game position is saved to tape, then action DESC is performed. If BREAK is pressed during the save a jump is made to Initialise. The save includes all information required to allow the restoration of the game to the exact same as it was before the save, including the values of flags, positions of objects, picture drawn flags etc. LOAD Loads data (which should be a game position) from tape, then action DESC is performed. If BREAK is pressed during the load or a tape error is detected a jump is made to Initialise. If data is loaded which is not a game position, a tape error will normally be detected. RAMSAVE In a similar way to SAVE this action saves all the information relevant to the game in progress not onto tape but into a memory buffer. This buffer is of course volatile and will be destroyed when the machine is turned off which should be made clear to the player. In addition it will also be cleared when you return to the editor section of PAW - in case you then change the design of the game! RAMLOAD flagno. This action is the counterpart of RAMSAVE and allows the saved buffer to be restored. The parameter specifies the last flag to be reloaded which can be used to preserve values over a restore, for example an entry of: RAMLO _ COPYFF 30 255 RAMLOAD 254 COPYFF 255 30 DESC could be used to maintain the current score, so that the player can not use RAMSAVE / LOAD as an easy option for achieving 100%. Note: unlike SAVE and LOAD the RAM actions allow the next Condact to be carried out. They should normally always be followed by a DESC in order that the game state is restored to an identical position. The actions could be used to implement an OOPS command that is common on other systems to take back the previous move; by creating an entry in Process 2 (or Response) which does an automatic RAMSAVE every time the player enters a move. Two actions to allow the game to be paused to a time or until a key is pressed; ANYKEY SM16 ("Press any key to continue") is printed at the bottom of the screen and the keyboard is scanned until a key is pressed or until the timeout duration has elapsed if enabled. PAUSE value Pauses for value / 50 secs. However, if value is zero then the pause is for 256/50 secs. Note that the keyboard is disabled for the duration of the pause. Two actions to deal with control of the parser; PARSE This action was designed to deal with speech to PSIs. Any string (i.e. a further phrase enclosed in quotes [" "]) that was present in the players current phrase is converted into a LS - overwriting the existing LS formed originally for that phrase. If no phrase is present or it is invalid, then PAWW will look at the next condact. Otherwise the next entry is considered with the new LS of the speech made to the PSI. Because it overwrites the current LS it must be used only in a sub-response table, the table will have form of: * * PARSE ; Always do this entry MESSAGE x ; "They don't understand" DONE word word CondAct list ; Any phrase PSI understands _ _ MESSAGE x ; as above or different message there will be two or more calling entries which will be similar to: SAY name SAME pos 38 ; Are they here? PROCESS y ; Decode speech.. DONE ; LS destroyed so always DONE. SAY name MESSAGE x ; "They are not here!" DONE NEWTEXT Forces the loss of any remaining phrases on the current input line. You would use this to prevent the player continuing without a fresh input should something go badly for his situation. e.g. the GET action carries out a NEWTEXT if it fails to get the required object for any reason, to prevent disaster with a sentence such as: GET SWORD AND KILL ORC WITH IT as attacking the ORC without the sword may be dangerous! One action to deal with sound BEEP duration pitch Both duration and pitch may range from 0 to 255. Duration is in units of one hundredth of a second. The value of itch is obtained by taking the value you would use in a BASIC BEEP command, adding 60 then dividing by 2. Several actions which are more difficult to classify; PROCESS procno. This powerful action transfers the attention of PAW to the specified Process table number. This sub- process will exhibit the same features as the table which called it. i.e. if called by Response, PAW will match the Verb and Noun1 of the LS against the word entries as with the main table. Note that it is a true subroutine call and any exit from the new table (e.g. DONE, OK etc) will return control to the condact which follows the calling PROCESS action. A sub-process can call (nest) further process' to a depth of 10 at which point a run time error of "Limit reached" will be generated. DOALL locno+ Another powerful action allows the implementation of an 'ALL' type command. 1 - An attempt is made to find an object at Location locno. If this is unsuccessful the DOALL is cancelled and action DONE is performed. 2 - The object number is converted into the LS Nound1 (and Adjective1 if present) by reference to the object word table. If Noun (Adjective)1 matches Noun (Adjective)2 then a return is made to step 1. This implements the "Verb ALL EXCEPT object" facility of the parser. 3 - The next condact and / or entry in the table is then considered. This effectively converts a phrase of "Verb All" into "Verb object" which is then processed by the table as if the player had typed it in. 4 - When an attempt is made to exit the current table, if the DOALL is still active (i.e. has not been cancelled by an action) then the attention of PAW is returned to the DOALL as from step 1; with the object search continuing from the next highest object number to that just considered. The main ramification of the search method through the object word table is; objects which have the Same Noun (Adjective) description (where the game works out which object is referred to by its presence) must be checked for in ascending order of object number, or one of them may be missed. Use of DOALL to implement things like OPEN ALL must account for the fact that doors are often flags only and would have to be made into objects if they were to be included in a DOALL. RESET locno+ This action is designed to allow the implementation of multi-part games where the objects which are not carried forward are reset to their starting location. All objects which can be carried between parts must be present (with the same description) in each part. Any others may be reused within each part at will. Any objects which are present at the current location are moved to Location locno. And the current location is set to be locno. Any other objects are set to the locations given by the Initially At table. No effect on flags. Action DESC is performed when complete. The suggested method of its use is given in the chapter on multi-part games. EXTERN value Calls external routine with parameter value. There is a special chapter dealing with this subject. Detailed Description of the Database The database consists of a number of inter-related tables and also contains an area of miscellaneous information e.g. values of background colours, number of objects conveyable, character sets etc. On a 128K machine the main data areas and pointers are present for each RAM page. Effectively each page is an independent database. The tables present (in the order they appear in memory) are: UDG's This table, which is 152 bytes long, contains the User Defined Graphics. The UDG's can be changed with the character editor described later. Codes 144-162. Shades This table is 128 bytes long and contains the graphics Shade patterns. These can be changed with the character editor as described later. Codes 0-15. The above two tables are saved / loaded as a pair and are termed character set 0. (although the ROM set provides codes 32-127). Miscellaneous Several small tables and values, 50 bytes in total. Character Sets This table is empty until a character set is inserted using the character editor. 768 bytes are used then by each character set inserted. Dictionary This table contains only one byte until the compressor is used for the first time on the database. After that it contains 222 bytes of expansion dictionary to allow the tokens 165-255 to be converted into the letter groupings they represent. The Process tables These tables form the heart of the database providing the main game control. The Response Table Each entry contains the word values of the Verb and Noun for the LS the entry is to deal with followed by any number of condacts. When the adventure is played, if there is an entry in the table which matches the Verb and Noun1 of the LS entered then the condacts are performed. The condacts that may be present and the effect that they have is fully specified in the description of the Interpreter. The order of entries in the table is in ascending order of the Verb value. Entries which have the same Verb value are held in ascending order of the Noun value. Entries with the same Verb and Noun value are held in the order they were inserted into the database. The word "_" has a word of value 255 while the word "*" has a word value of 1. An example of the order of the table, with word value shown in brackets, is as follows: * (1) * (1) LOOK (30) UP (10) LOOK (30) DOWN (11) LOOK (30) _ (255) GET (100) * (1) GET (100) KEY (16) GET (100) LAMP (26) GET (100) LAMP (26) _ (255) _ 255 The other process tables are held in the same format, but the words are ignored by PAW when they are scanned, unless the process is called from within Response using a PROCESS action. Process 1 Is canned by PAW after a location is described, to allow any additional information which forms a part of the location description to be displayed. Process 2 Is scanned by PAW after every time frame. That is after every phrase extracted from the player's input, or after every time-out on input. Any further sub-processes follow the initial three when begun on the Process option of the main menu. The Verb and Noun used for each entry in Process 1 and 2 (and any sub-processes called from them) have no meaning as they are ignored but can be used to provide a note as to the function of that entry within the table. Every process table has an overhead of seven bytes (21 are used in a null database as three - including Response - are already present.) Each entry subsequently uses 5 bytes and each condact uses 1, 2 or 3 bytes depending on the number of parameters. Note: If a word is deleted from the vocabulary, and no synonyms of it are present, then all entries in the process tables (including Response) which contain that word, are also deleted. The Object Text table This table, which has an entry for each object, contains the text which is printed when an object is described. Each entry uses 3 bytes plus the length of the text. An object is anything in the adventure which may be manipulated and objects are numbered from 0 upwards. Object 0 is assumed by the Interpreter to be a source of light. Whenever a new object text is inserted an entry of not-created is made for that object in the Initially at table, an entry of "_ _" in object word and a weight of 1 unit without a container or wear / remove attribute is inserted into the object weight table. The Location Text table This table, which has an entry for each location, contains the text which is printed when a location is described. Each entry uses 3 bytes plus the length of the text. The entries are numbered from 0 upwards and location 0 is the location at which the adventure starts. Whenever a new location is inserted a null entry for that location is also made in the connections table. The Message Text table This table contains the text of any messages which are needed for the adventure. The messages are numbered form 0 upwards and each one uses 3 bytes plus the length of the text. The System Messages This table contains the messages used by the Interpreter. Each entry uses 3 bytes plus the length of the text. The description of the Interpreter shows when these messages are used. In addition extra messages can be inserted by the writer to provide messages for the game if so required. The Connections table This table has an entry for each location and each entry may either be empty (null) or contain a number of 'movement pairs'. A movement pair consists of a word value of a Verb (or conversion Noun) from the vocabulary followed by a location number. This means that any Verb (or conversion Noun) with that word value causes movement to that location. A typical entry could be SOUTH 6 EAST 7 LEAVE 6 NORTH 5 which means that SOUTH or LEAVE or their synonyms cause movement to location 6, EAST or its synonyms to location 7 and NORTH or its synonyms to location 5. Each entry uses 3 bytes plus 2 bytes for each movement pair. Note 1. The movement pairs contain the word value not the actual word. If a word value is deleted from the vocabulary then all movement pairs which contain that word value are also deleted. Note 2. When the adventure is being played it is only the LS Verb which will cause movement. Note 3. If a movement is performed by an entry in the Response table using the GOTO action, then it may not be needed in the Connections table, unless that entry is required for a PSI who can move unconditionally. The Vocabulary Each entry in the table uses 7 bytes and contains a word (or the first five characters, if the word is longer than five characters) a word type from 0 to 6 and a word value in the range 2-254. The types are: 0 - Verb 1 - Adverb 2 - Noun 3 - Adjective 4 - Preposition 5 - Conjugation 6 - Pronoun Words with the same word value are called synonyms. The entries are held in ascending order of word value and within each word value, entries with more spaces come first e.g. U UP CLIMB ASCEN(D) where entries with the same word value also have the same number of spaces the entry inserted first comes earlier e.g. CLIMB was inserted before ASCEN(D). Note 1. Whenever the editor has to convert from a word value to a word it takes the first word with that value of the required type. Note 2. Verbs and Conversion Nouns with values less than 14 should be reserved for movement words. The Object Initially At table This table has a 1 byte entry for each object, which specifies the location at which the object is situated at the beginning of the adventure. An object can also start the adventure being worn, carried or not- created. The Object Word table This table has a 2 byte entry for each object, which holds the Noun and Adjective word values associated with that object. The Object Weight and Attribute table This table has a one byte entry for each word. Bit 7 is used to show if the object can be Worn / Removed (i.e. the WR option). Bit 6 is used to show that the object is a container (the C option) and Bits 0 to 5 define the weight of the object (giving a range from 0-63). The graphics area of the database grows DOWN from the top of memory: The Location Flags This table has a 1 byte entry for each picture; Bit 7 specifies if the picture can be drawn when that location is reached (i.e. if the location is not a 'subroutine'), bits 0 to 5 describe the start PAPER & INK for the picture while bite 6 is unused. The Picture Table Each entry in the table uses 3 bytes plus the length of the Drawstring. There are always the same number of entries as locations in the adventure. The Drawstring is encoded as a variety of various length commands which minimise the amount of memory needed to produce the drawing. The Pointers The main database pointers. Detailed Description of the Editor Each menu option is described in the order it appears; Vocabulary Insert I word No. Type No. is in the range 2-254 and Type is in the range 0-6. If word is not already present in the vocabulary it is inserted with a word value of No. and a type of Type. Delete D word If word is present in the vocabulary, it, its type and its word value are deleted. If synonyms of the word deleted are present in the vocabulary no further action is taken. However, if no synonyms are present, then: a) all entries in the process tables which use this word value (in respect of type also) are also deleted. b) b) if the word value is less than 14 then all movements in the connection table which use this word value are also deleted. c) c) all entries in the Object Word Table which use this word value (in respect of type also) are set to null. Show synonyms S word If word is present in the vocabulary, it and all other words with the same word value and type are displayed. (Note that for Conversion Nouns - those less than 20 - any synonymous Verbs will also be shown and vice-versa). Print P (Type) or L (Type) Printing is either to the screen using P or to the printer using L. If Type is specified only words of that type are listed. Note 1. Be careful using delete as it can also affect the process, connections and object word tables. It can also take a long time (minutes) if the database is large. Note 2. Verbs and Nouns with a word value of less than 14 are assumed to be movement words by the Interpreter and cause SM7 (I can't go in that direction.") to be printed instead of SM8 ("I can't do that"). Note 3. Word values from 2 to 254 can be used for each word type. The words will not be synonymous because they are of a different type. This allows over 250 words of each type - even without synonums - to exist in the vocabulary! Location Text Insert I If the maximum number of locations has been inserted then the error "Limit Reached" is generated. Otherwise the next available location number on the highest used RAM page (shown on the Free Memory option) is allocated and a null entry is made for it in the graphic location text table. Processing then continues with an automatic call to the amend routine to allow the writer to amend the null text entry already set up in the location text table. Begin new Page B If all RAM pages have been used or the maximum number of locations have been inserted the error "Limit Reached" is generated. Otherwise the next available RAM page has a null database created on it an the next available location number is assigned. Processing then continues with an automatic call to the amend routine to allow the writer to amend the null text entry in the new page. Amend A locno. The existing text for Location locno. is copied to the input buffer and displayed at the bottom of the screen for amending. When ENTER is pressed the existing entry is replaced with the contents of the input buffer. Print P (locno.) or L (locno.) Printing is either to the screen using P or to the printer using L. Printing starts with the text for Location locno. or at the beginning if locno. is not specified. Note 1. The start of an adventure is always at Location 0. Note 2. There is a limit of 252 locations. Note 3. You will be unable to begin a new page if all available location numbers have been previously allocated. Connections Amend A locno. The existing entry for Location locno. is decoded, copied to the input buffer and displayed at the bottom of the screen for amending. When ENTER is pressed the input buffer is vetted to be empty or to contain word locno. repeated any number of times. word must be a Verb (or Conversion Noun) which is present in the vocabulary and locno must be present in the location text table. If there are no syntax errors the existing entry is replaced with an encoded copy of the input buffer (i.e. words changed to word values). Print P (locno.) or L locno. Printing is either to the screen using P or to the printer using L. Printing starts with the entry for Location locno. or at the beginning if locno. is not specified. Note 1. A location text must be present for a Location before connections can be present. Note 2. Any Verbs (or conversion Nouns) in the Vocabulary may be used in the Connections table not only movement words. Note 3. When an entry is decoded (for Amend or Print) the word value is changed into the first Verb (or conversion Noun) in the Vocabulary with that word value. Graphics Amend A picno. The graphic database is expanded to provide a gap at the end of the reruired picture. The main loop of the Graphics Editor described below is then entered. When return is pressed any gap still remaining is removed. n.b. unlike editing text the database itself is changed, this you cannot abandon an edit with CAPS SHIFT & 6 (it does a NEXT command for a start!). Size S The number of bytes between the start of the drawstring and the start of the next is calculated and printed on the screen. Print, Copy and Dump. P picno., C picno. and D picno. picno. must be specified. If D was selected a filename is requested. The required picture is drawn on the screen. If C was selected the printer COPY is called (see printer section for details). If D was selected a SCREEN$ file is saved with the filename given (i.e. a code block of the screen 16384,6912), this file could then be used as a loading screen for the game or edited using another art package. Note 1. You cannot reload a SCREEN$ file into the database. Default Colours Amend A picno (Paper Ink) A flag is set to indicate that picture picno. is a subroutine unless PAPER and INK valued are specified, in which case they are stored as the default colours for the picture. All locations in the adventure which do not require a picture should be Amended as a subroutine. Print P or L Printing is either to the screen using P or the printer using L. If the location is not a subroutine the colours are printed. Messages Insert I The next available message number is allocated and a null entry is made for it in the mesage text table on the highest used RAM page (shown on the Free Memory option). An automatic call to the amend routine is then made to allow the user to amend the null entry. Begin new Page B The next available message number is allocated to the null message on the next RAM page if it has ben initialised on the location text menu. Otherwise the error "Page not initialised" is generated. Processing countinues with an automatic call to the amend routine to allow the user to amend the null entry. Amend A mesno. The existing text for message mesno. is copied to the input buffer and displayed at the bottom of the screen for amending. When ENTER is pressed the existing text is replaced with the contents of the input buffer. Print P (mesno.) or L (mesno.) Printing is either to the screen using P or to the printer using L. Printing starts with the text for message mesno. or at the beginning if mesno. is not specified. Note 1. There is a limit of 255 messages, but as system messages can be inserted and printed they can also be used in the game providing 510 messages (although some are used!) Note 2. You cannot begin a new page of messages without first initialising the page by inserting a location on it. System Messages Insert The next available system message number is allocated and a null entry made for it in the system messaeg table on RAM page 0. An automatic call is then made to the amnd routine to allow the writer to amend the null entry. Amend A mesno. The existing text for system message mesno. is copied to the input buffer and displayed at the bottom of the screen for amending. When ENTER is pressed, the existing text is replaced with the contents of the input buffer. Print P (mesno.) or L (mesno.) Print is either to the screen using P or to the printer using L. Printing starts with the text for system message mesno. or at the beginning if mesno. is not specified. Note 1. The description of the Interpreter shows where these messages are used. They may be changed to use "You" instead of "I" if you prefer, i.e. "You're not wearing it", or even into different languages, but be careful to maintain their meaning. Note 2. Messages 30 and 31 are not really messages but contain the positive and negative replies used in the QUIT and END condacts. Therefore be very careful changing these as action END is the main way back to the Editor from the Interpreter. You shoudn't make them more than one character in length, or the compressor may tokenise them! Note 3. SM10 (" (worn") has its length calculated by INVEN. This means it should not include any control codes, and must be re-entered if the compressor is used to remove any tokens. In addition, for the calculation of screen position to work, it should start with a space. Note 4. SM34 (the cursor) may contain any number of control characters, but, must not move the print position more than one character space or input will become confused. Any input character will be in the temporary colours in force at the end of this message. Note 5. A further 202 messages may be inserted for your own use, but as there is no equivalent of the MESSAGE action a NEWLINE action must be carried out explicitly if needed. Note 6. CPM PAW uses messages 54 to 60. This should be borne in mind if you intend transferring a game to another system. Object Text Insert I The next available object number is allocated and a null entry is made for it in the object text atble. An entry of not-created is made for it in the object initially at table, an entry of "_ _" in the object word table and a weight of 1 unit without any attributes in the object weight table. Processing then continues with an automatic call to the amend routine to allow the user to amend the null text entry already set up in the object text table. Amend A objno. The existing text for Object objno. is copied to the input buffer and displayed at the bottom of the screen for amending. When ENTER is pressed the existing text is replaced with the contents of the input buffer. Print P (objno.) or L (objno.) Printing is either to the screen using P or to the printer using L. Printing starts with the text for Object objno. or at the beginning if objno. is not specified. note 1. Object 0 is considered by the Interpreter to be a source of light. Note 2. There is a limit of 255 objects. Object Initially At table Specifies the location at which an object is situated at the start of the adventure. Amend A objno. locno. The existing entry for Object objno. is replaced with locno. which must either be present in the location text table or be one of the special locnos. 252 not-created, 253 worn or 254 carried. Print P or L Printing is to the screen using P or to the printer using L. Note 1. An object text must be present for an object before a start location can be present. The Object Word table Amend A objno. Noun Adjective The existing entry for Object objno. is replaced with the values of Noun and Adjective which must be present in the Vocabulary (or be an underline to set the entry to null). Print P or L Printing is to the screen using P or to the printer using L. The Object Weight table Amend A objno. Weight Option The existing entry of Object objno, is replaced with the weight and option specified. The weight may range from 0 to 64. The option specifies the object attributes and may take the values: 0 - No attributes 1 - The object is a container. 2 - The object is wearable / removable 3 - The object is a wearable / removable container! Print P or L Printing is to the screen using P or to the printer using L. The weight can be followed by "C" to indicate a container an / or "WR" to indicate wearable / removable. Note 1. You may only select the container attribute for an object, if a location with the same number exists. This is because PAW trets this location as the "inside"! Note 2. A container of weight 0 will not have the weight of its contents added to any calculation. This could be used to create a magic sack or a levitation transporter etc. The Process (including Response) tables Two options are available only on the main Process sub-menu: Begin new Table B The next available process number is allocated and null table is created. Processing continues with a call to the Select table option with the new table number. Select table S No. The specified table is made the currently selected table and the sub-menu is redisplayed. The other options are available on both the Response and Process sub-menus: Amend A Verb Noun (n) If an entry number n is not specified the first entry in the table of Verb and Noun is copied to the input buffer and displayed at the bottom of the screen for amending. Otherwise the entry number specified is used (ranging from 0 to the number of entries inserted - 1). When ENTER is pressed the input buffer is vetted to be empty, in which case the existing entry is deleted, or to contain any number of valid condacts. If there are no syntax errors the existing entry is replaced with the contents of the input buffer. Any following entries in the table with the same word values (i.e. Verb and Noun) are then displayed in turn for amending in the same way. Insert I Verb Noun (n) Verb and Noun must be underline characters, asterisk characters or words which are in the vocabulary. The word values of Verb and Noun (underline has a word value of 255, asterisk a word value of 1) are used to find the correct place in the table for the new entry to be created. If any entries already exist for Verb Noun and no entry number n is specified then the new entry will be created after the existing entries. Otherwise the new entry will be created before the entry number specified. A null entry is created at the appropriate place and an automatic call made to the amend routine to allow the user to amend the null entry. The condacts that may be used are shown in the description of the Interpreter and in the summary at the end of this guide. Print P (Verb (Noun)) or L (Verb (Noun)) Printing is either to the screen using P or to the printer using L. Printing starts at the first entry with word values of Verb Noun. If Verb or Noun are not specified then a word value of 0 is assumed. This P or L by itself starts at the beginning of the table. Note 1. To delete an entry; amend it, so that no conditions or actions remain. Note 2. There is a limit of 255 process tables. Calls can be nested to maximum of 10, after which an error occurs. Extra Options Selects the other display for the main menu. Test Adventure "Do you require disgnistics?" is printed and any reply that doesn't start with "Y" is assumed to be negative. A jump is then made to the Interpreter. If diagnostics were requested then whenever the Interpreter's input routine is used, pressing ENTER without typing anything will result in the value of a flag being displayed in the lower screen along with an input prompt. You can at this point type in the number of another flag to display that flag's value or an "=" folowed by a number to set the flag displayed to that value. Pressing ENTER returns to the input. The main way back to the Editor from the Interpreter is by performing the action END in a process table. Free Memory The number of unused bytes on each page are printed. Pages which have not yet been initialised are shown as "unused" and if Page 7 currently contains the overlays this fact is also displayed. Following the unused memory list will be lists of the last message and last location used on each page to allow you to monitor them. Note that on a 48K spectrum only page 0 will be displayed - as that's all there is! Background Colours The BORDER, PAPER & INK colours may be set to any valid values. INK 9 (i.e. contrast) is recommended but please note that INK 9 behaves differently in the bottom part of the screen. In addition if any character sets have been inserted into the database you will be able to select them as the primary set. Characters Characters consist of an 8 by 8 pixel grid and define the way letters, numbers, punctuation, UDG's and shades look on the screen. Initially only one character set is present, the one that is contained within the spectrum ROM. This set is also considered to contain the 16 shade patterns (codes 0 to 15) and 19 UDG's (codes 144 to 162) and is termed Set 0. Insert I If the maximum number of character sets has not been reached the next available set number is allocated. A 768 byte entry is inserted in the character table and a copy of the designs for 96 characters (codes 32 to 127) in the ROM are copied into the entry. Otherwise an error of "Limit Reached" is generated. Amed A set character The character specified from the set specified is presented on screen for possible amending. Only characters 0 to 15 and 144 to 162 may be amended from set 0, whereas only characters 32 to 127 may be amended from any other set. The editor provides three areas of screen: 1/ The Grid The bit patterns of a particular character are shown on a much enlarged (x8) grid of yellow and white squares, any set bits being shown by a black square. Also present on the grid is a flashing red square showing the current cursor position. 2/ The Test Patterns To the right of the Grid are two test patterns of the current character as if it was a shade in both normal & Inverted forms. This does not change as you change the Grid but it can be updated by pressing R for Redraw. 3/ Status Area This shows the current character, set and a summary of the commands available. In order to modify the pattern use the cursor keys (CAPS SHIFT 5 to 8 on a 48K spectrum) to move the flashing cursor. The state of the bit under the cursor can be changed at any time using the SPACE key. ENTER will store the amended character back in the database. Q will abandon the edit leaving the character unchanged. Print and Copy sets P or C The currently defined UDG's, Shades and inserted character sets are printed on the screen. If C was selected then the printer COPY is called - see printer section for details. Load and Save sets L set or S set If set has been inserted a prompt is printed for a filename, the tenth letter is converted to a (c) sign and the required set loaded or saved as specified. Saving / Loading set 0 acts on the 286 bytes of UDG's and Shades. Note 1. You cannot amend a character from a set or load a set until it has been inserted. Note 2. The files for sets other than 0 are a standard 768 bytes spectrum character set. They could thus be loaded into / defined with, a different designer as long as the filename ends in position 10 with a (c) symbol. Compress Text "Compress database (Y/N)?" is displayed and any reply which dosn't start with "Y" is assumed to be negative and causes a return to the main menu. Otherwise a 222 byte dictionary is inserted into the databse. The database is then scanned for occurences of each of 90 common letter groupings which are replaced with a signle byte token in the range 154 to 255. This method of compression reduces any text in the game by approximately 40%. This could on a text only 128K game provide an equivalent of 160K of memory for the game! Note 1. When editing text after compression the cursor will skip 2, 3, 4, or 5 characters due to the tokenisation. Corrections should be typed in full as they will be re-compressed the next time the compressor is used. Save Database The database area is saved to tape as a sequence of files, two per page. Then tenth position of the filename is set by PAW as the latters A to L is sequence for each file. Verify Database The files for a databse previously saved to tape are checked for differences against the database curently in memory. Load Database The files for a database previously saved to tape are loaded overwriting any database currently in memory. Very Important If BREAK is pressed or a tape error is detected during a load then the database held in memory will be corrupt and should not be used as it may corrupt the Editor and Interpreter. Under these curcusmtances the only Editor option which may be used safely is Load Database and this should be used until a database is loaded successfully. Save Adventure The Interpreter and database are saved to tape as a sequenceof files using the filename specified. They are saved in such a way that the Adventure will auto run when loaded from BASIC using LOAD "" - without the PAW Editor being present. Verify Adventure Verifies that an Adventure has been saved correctly. Detailed description of the Graphic Editor This section of PAW allows a variety of operations to be carried out on the drawstring for a location. When editing, the string is laid out in memory as follows; +----------+ | END | The end of string marker +----------| | | | NEXT | Any commands still undrawn +----------+ | | | | | SPARE | Available memory | | | | +----------+ | END | Temporary end marker +----------+ | | | | | | | DRAW | The main drawstring +----------+ A rubber banded line is used for drawstring; in the base point of the line (Known as 'point') shows the last point plotted, moved to etc, the rubber banded end of line shows the next position of point or the start point for a fill / shade etc. The Editor provides four groups of commands. Any which insert a command into the drawstring require a SYMBOL SHIFT key to be held down; 1) Drawstring Commands ABS MOVE A Moves point to the x,y position of end of the line setting only the attributes. This is coded as a PLOT with Inverse and Over set on. PLOT P Sets the pixel at the end of the line according to Inverse and Over, then moves point to that position. REL MOVE R Moves point to the end of the line without affecting the screen. This is coded as a relative offset from the old point. LINE L Draws (or fixes) a straight line from point to the end of line according to Inverse and Over, then moves point to end of the line. The line is coded as a relative offset from the old point. FILL F The area from the end of line (relative) is filled using solid pixels. Fill works by passing a pattern to the SHADE routine so the notes on SHADE apply also. All the above use 3 bytes in the database. SHADE S The area from the end of lne (relative) is shaded with one of a large number of patterns. The database contains 16 patterns (0-15) which can be changed using the Character Editor. The pattern used for shading is determined as follows: a) You are asked for 2 pattern numbers in the range 0 to 15. If you only want the one pattern then specify the same number for both patterns. b) b) The 2 patterns specified are OR'd together i.e. they are placed on top of each other. c) c) If INVERSE was 'on' the resultant pattern is inverted, i.e. SET / RESET pixels are swapped. Note 1. The shade first works in a downward direction and then in an upward direction. For speed, when it is going down it doesn't look up and vice versa. Any areas the shade misses must be shaded separetely, although careful choice of the start position for the shade will minimise this. Note 2. If the area to be shaded is too complex, then the shade will be abandoned. It has to do this to enable it to detect when it comes across an area which has already been shaded. This an area can only be shaded once as an already shaded area will be too complex to shade again. You should not shade an area then try to fill in the background with a fill command, use the Inverse option! TEXT T If any character sets have been inserted in the database, a set number is requested. Then a character code in the range 32 to 162 is requested. This character is placed on screen in the character square (as shown by the Grid command) that the tip of line is contained within. It is mainly designed to allow "the fiddly bits" of a picture to be drawn using the character editor - thus using less memory than lots of lines! Text and Shade use 4 bytes in the database each. BLOCK B Causes a block of the currently selected colours to fill the rectangle of attribute squares which the line defines the diagonal of. Block uses 5 bytes in the database. 2) Colour Commands INK X The current ink is set to the value selected. INK 8 as in BASIC causes all ink to be taken from the existing screen attributes. PAPER C Sets the current paper to the value selected. PAPER 8 as in BASIC. FLASH V The new value of Flash is requested (0,1 or 8) BRIGHT Z The new value of Bright is requested (0,1, or 8) all the above use one byte in the databse. INVERSE I The state of Inverse (on/off) is toggled. OVER O The state of Over (on/off) is toggled. Neither Inverse nor Over use any memory but their state is encoded as part of each future instruction which is affected by them 3) Subroutine Command GOSUB G A picture number is requested which must be in the range 0 to locno. A scale value for the picture is then requested. This can be from 0 to 7 where the number indicates the size of the picture in eighths - 0 means 'no scale' (i.e. 8/8). Please note; a) Scale only affects certain commands, these are MOVE RELATIVE, LINE, FILL and SHADE. MOVE ABSOLUTE, PLOT, BLOCK and TEXT commands will note be scaled or relocated and should generally not be used in subroutines (although they will work and can be used usefully sometimes). b) You may only nest subroutine calls to a level of ten. (nesting means calling a subroutine from within a subroutine). c) Scale does not affect GOSUB commands, i.e. if a GOSUB is used within a subroutine the string drawn will be a fixed size and not scaled. d) Calling the same routine you are drawing will cause a "Limit Reached" error as the limit of 10 subroutine levels will have been reached. Gosub uses two bytes in the database. 4) Editing commands START > Puts the Drawstring pointer at the start of the drawstring. NEXT \/ Executes next available drawstring command: if there isn't one the command is ignored. PREVIOUS /\ Moves the drawstring pointer back one command and updates the screen. DELETE (CAPS SHIFT & 0 ON 48K) deletes the previous command in the drawstring and updates the screen. DELETE NEXT GRAPH(ICS) (CAPS SHIFT & 9 on 48K) deletes the next command if there is one. GRID Y Has a toggle action for a character grid of INK 0, PAPER 7 and PAPER 6. This allows exact positions of colour boundaries to be taken into account while drawing. JOYSTICK J Toggles the Kempston (tm) joystick option on and off. The keys around S move the end of line around one pixel at a time (this can be accelerated to eight pixels a time by holding down the CAPS SHIFT key) thus: Q W E A S Z X C The joystick should be plugged into Port 2 of Interface 2 or the Spectrum Plus 2. Alternatively it can be plugged into a Kempston (tm) interface in which case SYMBOL SHIFT & J should be used to enable PAW to read it. CAPS SHIFT will also accelerate the rate of movement on the joystick. The Fire button will act like SYMBOL SHIFT and L to draw a line. Editor Error Messages and their meanings Due to the complex nature of PAW many features can generate errors. Whenever an error is discovered a message describing the error is printed in the lower section of the screen. PAW then waits for a key to be pressed before returning to the menu on which that error occurred. There are two exceptions to this: 1/ After an error during editing a drawstring; the Drawstring pointer is positioned just before the command which caused the error (i.e. a NEXT command will cause the error again). If you are unable to correct the problem then DELETE NEXT can be used to delete the erroneous command. Note that this may still leave further commands undrawn (which may cause another error). 2/ While an adventure is running; If the PAW editor is not present then a jump is made to initialise a new game after the error report. Otherwise a diagnostic line is printed on the bottom line of the screen. This displays the Process table, Verb and Noun of the entry and the condact in which the error occurred. You are then provided with the flag diagnostics to help confirm where the error occurred. When ENTER is pressed the normal error report is printed and a return made to the main menu of PAW. When using your own programs in conjunction with the EXTERN command any of the standard BASIC errors can occur. Note though that the line and statement number are not printed - so test your program thoroughly without the adventure present! PAW also generates several errors of its own which are: BREAK BREAK was pressed during a peripheral operation or while a game was running. STOP in INPUT CAPS SHIFT & 6 pressed. Tape loading error as BASIC. Note that a tape error during a load database means that the database is corrupt and only reloads should be attempted. Database full There is not enough room in the database for what you were attempting. Limit reached The maximum number of locations, messages, objects, process tables or RAM pages are already present. Alternatively the maximum subroutine or sub-process depth has been reached - 10. This can also occur if an attempt is made to DOAL while a DOALL loop is active. Integer our of range While drawing a picture a LINE command has gone out of range. This is usually due to a change of position of the starting point while editing. Out of memory This indicates that the entry for a process or connection entry was to large for the buffer (unliketoly to occur). Also occurs when attempting to start a new RAM page on a 48K spectrum, loading a 128K game on a 48K spectrum or if insufficient workspace has been left e.g. by setting up fixed channels before loading or by writing too big a program for use with EXTERN. Invalid Argument This error is printed when a condact discovers an illegal value. e.g. An attempt to set flag 38 to an illegal location, an attempt to PUTIN / TAKEOUT on a non container object or to set an object at location 255 (COPYFO only). But see point 2 above for diagnostic information. Note 1. During input the Spectrum will emit a RASP if the screen and / or input buffer is full. Note 2. If an entry is present in the database which is too big to fir on one screen, the Spectrum will give out a RASP when the entry is displayed at the bottom of the screen for amending. Note 3. If an abnormally large entry is inserted in the connections table using abbreviations e.g. N 1 W 6 S 4 etc and the abbreviations are deleted from the vocabulary, the movement entry (when decoded) i.e. NORTH 1 WEST 6 SOUTH 4 etc could be too big for the input buffer. If this happens an out of memory message will be produced. The remedy is to reinsert the abbreviations in the vocabulary. PAW and printers PAW prints to the printer using channel #3 (usually "P"). Should this be a ZX thermal printer (or the Alphacom equivalent) then all printout is directed to the required ROM routines. The Thermal printers only work in 48k mode on a 128K spectrum and will print exactly what is on screen including new character sets and so on. The "C" option on the characters and graphics menus will COPY the screen as normal. On a 128K spectrum the printer channel defaults to the RS232 port and again PAW will sense this. All printout is directed through the port having filtered the character set thus: 0 - 31 are surpressed except for 7 & 13 which print a CR (13) and 6 (TAB) which prints as a space 32 - 127 are printed as a space. 128 - 162 are printed as a question mark ("?") 163 and 164 are expanded to be the keywords PLAY & SPECTRUM. 165 - 255 are expanded either to the standard keywords in an uncompressed database, or to the correct letter groupings in a compressed one. If you have Interface 1, it is possible to use the RS232 to print to a printer by opeding the "t" channel with the command: OPEN #3, "t" before loading the PAW program. The channel will then operate as described above for the 128K RS232. In general it should be possible to use any printer interface which redirects channel #3 correctly - with one proviso; it does not mind having its output address redirected. Failing that if you are nifty with the old m/c you can write a specific printer driver. PAW prints an address when it loads called PRTADD. This gives the address of the vectors within PAW for the printer system defined as follows (character is in A): PRTADD DEFW PRTRET ; Address of character output COPVEC JP DOCOPY ; Make this your screen copy PRTRET RET ; Put your driver here. There is free memory up to 29504 decimal for this to be expanded into. Save your driver code from the correct address with a filename with character position 10 set to "A" along with a file of no bytes with the same name ending in "B". You must redirect channel #3 (to anything) to fool PAW that there is a non thermal printer connected before you load it. Then use the Load database option from the main menu to load your driver (PAW thinks it's a database an loads both files, one of which is your driver). The Essays There now follows a discussion of nine topics which rely on several features of PAW in combination and are thus not so easy to describe under any one heading: 128K Considerations for those lucky 128K spectrum owners. Colour Boundaries deals with the spikey problem of attributes. The parser gives a little English lesson. Screen Output starts a newline in descriptions. Objects will be more flexible after reading this. Multi-part games for when memory just isn't big enough. Light & Dark throws some light on the matter? EXTERN and SCREEN$ are just made for each other. PSIs add a bit of character to your games! Enough of the frivolity there are pages to fill... 128K Considerations When loaded, only page 0 is in use and has about 25500 bytes spare. Pages 1, 3, 4, 6 & 7 are unused but can hold 16K each. Message & Location text, Connections, Graphics & Default Colours can use pages 1-7, all the other tables only use page 0. All table entries for a location will be held within the same page. When a location text is inserted null entries are made in the Connection, Graphics & Default Colour tables for that location. The I option on the Location Text menu always inserts in the highest used page. Option B on that menuis used to begin a new page i.e. it inserts on the next page. You have to decide when to use B to start a new page but we would suggest that you use the compressor to gain all memory available before starting another page as you cannot insert extra messages etc onto a page once a new one has been started - only amend existing entries. The start database supplied has location 0 on page 0 and youy will need to consider whether location 1 should be on a new page bearing in mind that ll the other tables can only use page 0. We would advise all messages and locations are on pages 1 and up, as page 0 can soon become filled with vocabulary etc. A similar thing applies to the message text table; I inserts on the highest selected page, B begins another page if it has been initialised by putting a location on it! If you want your game to run on a 48K spectrum then you must not use any page other than 0. Colour Boundaries Probably one of the most difficult aspects of using graphics on the Spectrum is the problem of the attribute colour system. This essentially means that only two colours can be used in any one 8x8 pixel group. The areas are shown by the GRID option in the graphics editor. The two colours are the PAPER and INK, the colours of reset and set pixels respectively. Both Paper and Ink can be any of eight values for each 8x8 pixel group. The fill and shade routines fill in a defined area with a pattern of set and reset pixels. So if you use different INK and / or PAPER colours for two adjacent fills or shades, you will get a coarse stepping effect. This is due to the colours for the second fill affecting pixels in the groups which were set by the first. This effect can be overcome in one of four main ways: 1 / Ignore it! This system is used on some pictures in the TEWK game. The effect is minimised by not having shaded or filled areas directly adjacent to each other. 2 / Use shade fully. The shade system can be used along with just two colours to create very effective pictures using varying densities of shade. 3 / Careful positioning as used in the tutorial manual. All areas are defined on exact attribute boundaries. This has the effect of creating very cubist pictures. 4 / Alternate colour. This allows two areas of solid colour (not shades) to be adjacent to each other. It sounds complicated but in principle is fairly straightforward: the diagram shows this far more simply than reams of text. [See separate graphic file, either COLBOUND.GIF or COLBOUND.BMP] The outlines of area A and B are drawn. Area A is filled using an INK of the first colour required. Area B is filled using an INK of the second colour required. The block command is used on the rectangle (C) with the PAPER set to be the second colour required and an INK of 8. This leaves area A and B unchanged. The colouring of the PAPER makes the join look continuous. The Parser The parser works by scanning an input line (up to 125 characters) for words which are in the vocabulary, extracting 'Phrases' which it can turn into Logical sentences. When a phrase has been extracted, the Response and Connections tables are scanned to see if the Logical Sentence is recognised. If not then system message 8 ("I can't do that") or system message 7 ("I can't go in that direction") will be displayed depending on the Verb value (i.e. if less than 14 then system message 7 will be used) and a new text input is requested. A new text input will also be requested if an action fails in some way (e.g. an object too heavy) or if the writer forces it with a NEWTEXT action. The results might otherwise be catastrophic for the player. e.g. GET AXE AND ATTACK TROLL, if you don't have the axe you wouldn't really want to tackle the Troll! If the LS is successfully executed then another phrase is extracted or new text requested if there is no more text in the buffer. Phrases are separated by conjugation ("AND" & "THEN" usually) and by any punctuation. A Pronoun ("IT" usually) can be used to refer to the Noun/Adjective used in the previous Phrase - even if this was a separate input. Nouns with word values less than 50 are Proper Nouns and will not affect the Pronoun. The Logical Sentence format is as follows: (Adverb) Verb (Adjective1 (Noun1)) (preposition) (Adjective2 (Noun2)) where bracketed types are optional, i.e. the minimum phrase is a Verb (or a Conversion Noun - which is a Noun with a word value < 20 - which if no Verb is found in a phrase will be converted into a Verb e.g. NORTH). If the verb is omitted then the LS will assume the previously used verb is required. i.e. GET SWORD AND SHIELF will work correctly! - the pronoun will be the first object in a list like this, SWORD in the example. Note that the phrase does not strictly have to be typed in by the player in this format. As an example: GET THE SMALL SWORD QUICKLY QUICKLY GET THE SMALL SWORD QUICKLY THE SMALL SWORD GET are all equivalent phrases producing the same LS. Although the third version is rather dubious English. A true sentence could be: GET ALL. OPEN THE DOOR AND GO SOUTH THEN GET THE BUCKET AND LOOK IN IT. which will become five LS's: GET ALL OPEN DOOR (because THE is not in the vocabulary) SOUTH (because GO is not in the vocabulary) GET BUCKET LOOK BUCKET (from IT) IN (preposition) Note that DOALL will not generate the object described by Noun(Adjective)2 of the Logical sentence. This provides a simple method of implementing EXCEPT. e.g. GET ALL EXCEPT THE FISH, it has the side effect of not allowing PUT ALL EXCEPT THE FISH IN THE BUCKET, as this has three nouns! Screen Output Character sets are selected in text by selecting a colour 0-5 then a single DELETE to generate ESCCs 0- 5, and will only take effect if a corresponding set has been inserted. ESCC 7 is a true newline (but does not reset colours as it is part of a message). ESCC 6 works as a TAB but should be used with care as it will often be suppressed by the text formatter when printing. Colours and character sets selected within text will stay in force until a NEWLINE action. e.g. To print the number of coins carried by the player (held in flag 100 say); If message 1 contains a RED PAPER control code then an entry in Response (or a Process table) of: COINS MES 1 ; "You are carrying" _ PRINT 100 MESSAGE 2 ; " coins." DONE will result in the entire message being printed in red. This is called a compound message and can be used successfully to create neat displays. Objects Underlines in text will be converted during gameplay into a description of the last object referenced by GET, DROP, DESTROY etc. This is mainly to deal with the fact that GET, DROP etc report their success (or failure!) but can be used usefully for examining objects and other automatic reports. Flag 53 is used to control the way objects are displayed when the LISTOBJ and LISTAT actions are used. If the flag is set to 64 (i.e. Bit 6 is set) then objects will be listed without newlines between them, forming a valid English sentence - compound listing. The formats are as follows: SM53 ("nothing") - can only occur with LISTAT object SM48(".") object SM47(" and ") object SM48(".") object SM46(", ") object SM47 (" and ") object SM48(".") In addition, Bit 7 of flag 53 will be set (i.e. flag will be grater than 127) if any objects were printed. This allows you to determine whether or nor a NEWLINE is required to reset colours. A LISTAT action will usually be preceded by a message. The description of object is constructed from the full description given in the object text table. The preferred format for an object description is: indefinite.article (adjective) noun . extra text where; the indefinite article is "A" or adjectives "An" or "Some". The Adjective and the Noun should have a lower case letter e.g. "A small key", "Some sand" or "An orange. Rather mouldy'. PAW extracts a description of the object in two ways: 1/ For GET, DROP etc (i.e. "_") the indefinite article is skipped and the description printed upto (but not including) the first full stop, e.g. "I now have the small key." 2/ For a compount list of objects the indefinite article is forced to start with a lower case letter and the description printed upto (but not including) the first full stop. e.g. "In the bag is a small key.". Obviously if you don't use underline or compound listings, then you are free to describe objects any way you like. Important: If an object is to be a container; there must be an unused location with the same number for PAW to use as the "inside"! i.e. Object objno. 1 would need Location locno. 1 - Not forgetting to mark it as a container ("C") on object weight! Creating Multi-Part Adventures In order to create a larger (and thus more interesting) play area in an adventure, without sacrificing the quality of the description, you can split the game into smaller sections. It is best to do this with a game that lends itself to having several areas, with only one join between each, this is called a bottleneck. e.g. a game where setting sail on a boat is the final task in the first part. To allow the score, turns taken and other information to be carried forward into the next game you must use the LOAD / SAVE game position actions. In order to load a game position into a different game to ahat which it was saved from, you need the same number of locations and objects in each part. In addition, all objects which may possibly be carried forward by the player, must have the same description in all parts. Let's take a game with 120 locations, that is to be split in half, thus requiring 60 locations in each part. Actually location 60 will exist in both games as the transition location (where the player starts and finishes) and a spare flag (say 26) will be used to indicate which part of the game a position is from. So when the player completes part 1 they are moved to location 60 and flag 26 is set to 1 to show it. The setup for part 1 would be: Location 60 End of Part 1 - Prepare a tape to save your position. (You may save more than one copy if you like). Please LOAD part 2 and follow the onscreen prompts. Process 1 END _ AT 60 ; End of game? _ LET 25 1 ; Valid position from part 1. SAVE And in part 2: Location 0 Part 2 - Prepare to load tape with saved position Location 60 Any introduction wanted for Part 2. Process 1 START _ AT 0 ; Just starting? LOAD ; Will then be at another location START _ NOTEQ 26 ; Not a valid position from part 1 GOTO 0 ; So request another load DESC START _ AT 60 ; Just loaded a valid position ANYKEY ; Wait until introduction read RESET 1 ; Start game properly at location 1 The RESET action does a DESC of the new start location automatically, after setting all objects that aren't carried, worn or at location 60 to their starting position. Note that you should insert any CLEAR actions for flags between the ANYKEY and the RESET as the flags are not affected by the RESET. Light and Dark Darkness is becoming something of a cliche in adventures these days, but used correctly it can add to the sense of realism considerably. Within PAW, darkness is created by setting flag 0 to a value other than 0. This must be done whenever the player moves into and out of darkness, i.e. the move must be done with a GOTO in the Response table, to allow the SET or CLEAR action to occur. If the player is being provided with a source of light then object 0 is the easiest way of implementing it. A source of light does not have to be a torch or candle, with a little imagination it can be infra-red glasses or a wide beam laser! Take for example the creation of a night and day cycle, over 24 time frames which we will assume are equivalent to 1 hour. The entries required in Process 2 are: _ CYCLE EQ 5 0 ; End of cycle LET 5 24 ; Start the counter again _ NIGHT EQ 5 18 ; Nightfall SET 0 MESSAGE X _ DAY EQ 5 6 ; Daybreak CLEAR 0 MESSAGE y Importantly if part of the game is underground, or inside a building, don't forget to determine if the player can actually see nightfall and daybreak from where they are, before printing the messages. EXTERN and Loading screens The EXTERN command can be used to call either your own machine language programs or a section of a BASIC program. This feature can be utilised only in a final game, as the 4K of memory previously occupied by the main menu becomes available (the other 2K is PAW's workspace so hands off!) The important address is the value printed when PAW loads called EXTVEC. You must use the value given on the copy of PAW you save the final game from, or chaos will ensue. For machine coders only: In order that EXTERN can execute machine code routines you must POKE the three bytes at EXTVEC with a JP to our start address. Register IX must be preserved as it points at Flag 0. All others may be destroyed, but SP must be balanced. Register A on entry contains the parameters to the EXTERN command. If you save the two bytes at EXTVEC+1 they point to the routine which calls a BASIC program - the line number must be in A. For BASIC users: a POKE extvec,195 - after loading the interpreter file - will enable any EXTERN actions to execute the BASIC line (100+parameter) e.g. EXTERN 10 will goto line 110 in BASIC. To return to the next condact a STOP command in BASIC is required. You cannot use CLS in BASIC (or m/c), but address EXTVEC+3 contains a routine to do this. i.e. RANDOMIZE USR EXTVEC+3 will clear the screen. In addition EXTVEC+12 contains the line number to print the filenames of the database files on and EXTVEC+9 is the load database and start game entry point. As an example the following program (without the REM's) must be saved to a fresh tape with SAVE "gamename" LINE 10: 10 REM load game 15 BORDER 0: PAPER 0: INK 0: REM so filenames are invisible 20 CLEAR 29856: REM this is maximum value for RAMTOP. 25 LET extvec=?????: REM whatever it is... 30 LOAD ""SCREEN$: PRINT AT 19,0;: REM stops damage to pic! 40 LOAD ""CODE: REM load interpreter file 50 POKE extvec,195: REM enable EXTERN 60 POKE extvec+12,20: REM filenames on line 20 70 RANDOMIZE USR (extvec+9): REM load database and start game 100 REM line that is called by EXTERN 0 110 PRINT "hello from BASIC": STOP 355 REM line that is called by EXTERN 255! Lines 100-355 could contain GOTO statements if required. Save your SCREEN$ immediately after the program on the tape. Then from within PAW save the Adventure (using option A) after that. Important there must be at least 2000 bytes spare for PAW's workspace or your BASIC program will start to disappear! RAMTOP may be lowered to contain your machine code but 2K must be spare! Pseudo-Intelligence The main thing to remember is that a character (or PSI) is a word in the Vocabulary (usually a Noun with a value less than 50 so as to be a Proper Noun). Some flags, a series of messages and some entries in one or more Process tables. One flag shows where they are, the messages provide information about their actions and the process table entries tie it all together. So imagine a character called Sanec who can walk around independently. He is described in the vocabulary as SANEC (word value 25, Noun). Flag number 20 is used to give his location. Process table 3 will deal with speech to him. While Process table 4 will deal with his movements and actions. The following entries allow him to move around when you ask him to. After a short time he will get "bored" and vanish in a puff of smoke! Message 1 Sanec did not seem to understand what you said. Message 2 No one of that name here! Message 3 Sanec replies "hello" in a gruff voice. Message 4 Sanec wanders that way as he has nothing bettern to do. Message 5 Sanec the wizard is here. Message 6 Sanec 'politely' ignores what you say. Message 7 Sanec turns to face you and in his gruff voice announces; "I'm bored with all this, I'm off to a bigger game" and promptly vanishes in a puff of green smoke! First; Sanec's presence at a location must be announced. So in Process 1 (which is called after every describe of a location) we check if he is here i.e. flag 20 (his location) is the same as flag 38 (our location). Note that we ensure we are not at location 0 as this is always an introduction screen. SANEC _ SAME 20 38 ; Ensure Sanec is here _ NOTAT 0 ; Player is not in location 0 MESSAGE 5 ; Say Sanec is here To deal with speech to Sanec, we need entries in Response as follows: SAY SANEC PREP TO ; This could be imitted to allow ; Short Verb Noun sentences ; to be understood SAME 20 38 ; Make sure Sanec is here PROCESS 3 ; Deal with any speech DONE SAY _ PREP TO MESSAGE 2 ; no one of that name here! DONE The following entries in Process 3: * * PARSE ; This entry always carried out ; convert the input string to a ; LS MESSAGE 1 ; PARSE comes here if it fails ; to find a valid phrase DONE ; Note that the LS is corrupt ; and no further table entries ; must be executed HELLO MESSAGE 3 ; Assuming HELLO is a verb in ; vocab DONE ; so that SAY TO SANEC ; "HELLO" works _ _ LT 34 14 ; A movement word said to ; Sanec? MOVE 20 ; See if a connection for that ; way MESSAGE 4 ; Come here and tell player if ; so _ _ MESSAGE 6 ; He ignores you (i.e. nothing ; else) Obviously many more entries would be required to give Sanec an appearance of understanding speech, but with a few clever entries he can give a wide variety of responses. Finally; to give Sanec a chance of disappearing when bored, we need an entry in Process 4 of: SANEC _ EQ 20 2 ; At location two? CHANCE 10 ; 10% chance SET 20 ; Location 255 does not exist AT 2 ; are we where he was? MESSAGE 7 ; POOFF! - tell player he ; disappears And an entry in Process 2 to call table 4 regularly: SANEC _ PROCESS 4 In this way a very convincing character can be built up. They add a great deal to the sense of relism in games. Especially if interaction with them is required as part of the solution. Graphic Editor Commands Occasionally when moving the line at speed it will disappear, this is due to a beat frequency of update with screen flyback. Moving the end of the rubber banded line is achieved with: Q W E A D Z X C at 1 pixel per move. Alternatively use Interface 2 / Plus 2 joystick port 2 or Kempston(tm) interface (SYMBOL SHIFT & J). Hold down the CAPS SHIFT key to accelerate to eight pixels per move. The drawstring editing commands: Cursor Right (CAPS SHIFT & 8) - Start of drawstring Cursor Down (CAPS SHIFT & 6) - Next command Cursor Up (CAPS SHIFT & 7) - Previous command DELETE (CAPS SHIFT & 0) - Delete previous command GRAPHICS (CAPS SHIFT & 9) - Delete next command All the following commands require SYMBOL SHIFT to be held down unless otherwise specified. The toggles: I Inverse Toggle O Over Toggle Y Grid Toggle J Kempston(tm) joystick toggle The next commands all insert into the database: A Absolute Move (a PLOT with I and O selected) B Block in rectangle attribute area. Diagonal defined by line. F Fill area from end of line. (See footnote) G Gosub to location number with scale X Ink (produces prompt for Ink selection) L Line fix (draws rubber banded line) C Paper Select P Plot point at end of line R Relative Move point to end of line S Shade an area of screen from end of line with pattern V Flash Select Z Bright Select T Text character on screen, selects character and set no. Note: Fill and Shade are not completely re-entrant. Fill is a shade with all pixels in pattern set. ENTER on its own to finish editing session. The System Messages The majority of system messages contain ESCC 7's to allow correct spacing on the screen. SM0 - is used instead of the location description when it is dark. SM1 - is printed by LISTOBJ if at least one object is present. SM2 to SM5 - are the four input prompts which are selected randomly unless flag 42 is set to be a valid message number. SM6 - is produced by the parser when no further phrase can be understood. SM7 - is produced if no action was carried out (or NOTDONE was) in Response when the Verb is < 14 SM8 - is produced if no action was carried out (or NOTDONE was) in Response when the Verb is > 13 SM9 to SM11 - are printed by the END action. SM12 - printed by QUIT SM13 and 14 - are printed by the END action SM15 - the OK action message. SM16 - the ANYKEY action message. SM17 to SM20 - are the TURNS action messages. SM21 and SM22 - are the SCORE action messages. SM23 and SM29 - are the first of many messages produced by the object manipulating actions. SM30 - the positive response expected by END and QUIT. SM31 - the negative response expected by END and QUIT. SM32 - produced when a screen full of text has appeared. SM33 - the input marker. SM34 - the cursor. SM35 - displayed when a timeout occurs SM36 to SM45 - are more messages produced by the object manipulating actions. SM46 - the link between objects when listing continuously SM47 - the final link between the last two objects when listing SM48 - the termination of a list of objects (printed by both LISTOBJ and LISTAT, so take care.) SM49 and SM50 - yet more object messages SM51 - the termination for a compound sentence on PUTIN / TAKEOUT (and AUTOP / AUTOT) SM52 - a final object message SM53 - message for LISTAT action if no objects found. SM54 onwards are free to be inserted for your own use. PAW on other machines may use more messages, so bear this in mind if you intend transferring the adventure to another version. E.g. PAW under CPM uses messages 54 to 60! Function of PAW Flags The normal flags are free for use in any way in games. The auto decrement flags (2 to 10) are also free for use, but be sure you know in which situations they are reduced before using them. Other flags should mostly only be set using the appropriate action, but useful tests can be carried out on their contents. Flag 0 - When non zero indicates game is dark (see also object 0) Flag 1 - Holds quantity of objects player is carrying (but not wearing) The following flags are decremented if non zero by PAW: Flag 2 - When a location is described Flag 3 - When a location is described and it's dark (Flag 0 not 0) Flag 4 - When a location is described, it's dark and object 0 is absent. Flag 5 to 8 - Every time frame (i.e. every phrase / timeout) Flag 9 - Every time frame that it's dark Flag 10 - Every time frame that it's dark and object 0 is absent Flag 11 to 28 are free for use in your own games Flag 29 holds Picture Control flags Bit 7 - Set this to force picture to be drawn (LOOK) Bit 6 - Set this to always draw picture (PICS ON) Bit 5 - Set this to never draw picture (PICS OFF) this is set by using the GRAPHIC action Flag 30 - Score flag Flag 31 / 32 (LSB/MSB) holds number of turns player has taken (actually this is the number of phrases extracted from the player's input). Flag 33 - holds the Verb for the current logical sentence Flag 34 - holds the first Noun in the current logical sentence Flag 35 - holds the Adjective for the first Noun Flag 36 - holds the Adverb for the current logical sentence Flag 37 - holds maximum number of objects conveyable (initially 4). Set using ABILITY action. Flag 38 - holds current location of player. Flag 39 - holds current top line of screen Flag 40 - holds screen mode (range 0 to 4..) set with MODE action. Also bit 7 - Forces no change of Border, Bit 6 Produces "More.." when screen fills. Flag 41 - holds line number for split (if not in range 4-24 then 12 used) this is set by the PROTECT action to be the current screen line. Flag 42 - holds prompt to use (a system message number - 0 selects one of four randomly. Set by the PROMPT action). Flag 43 - holds the Preposition in the current logical sentence. Flag 44 - holds the second Noun in the current logical sentence. Flag 45 - holds the Adjective for the second Noun Flag 46 - holds the current pronoun ("IT" usually) Noun Flag 47 - holds the current pronoun ("IT" usually) Adjective Flag 48 holds Timeout duration required Flag 49 holds Timeout Control flags Bit 7 - Set if timeout occurred last frame Bit 6 - Set if data available for recall (not of use to writer) Bit 5 - Set this to cause auto recall of input buffer on timeout Bit 4 - Set this to print buffer on exit, (for use with Bit 3) Bit 3 - Set this to take input from lower screen Bit 2 - Set this so timeout can occur on ANYKEY Bit 1 - Set this so timeout can occur on "More..." Bit 0 - Set this so timeout can occur at start of input only Set using INPUT and TIME (as is flag 48), TIMEOUT tests bit 7 of this flag. Flag 50 - holds locno. for DOALL loop. i.e. value following DOALL Flag 51 - holds last object referenced by GET / DROP / WEAR / WHATO etc. This is the number of the currently referenced object as printed in place of any underlines in text. Flag 52 - holds player's strengths (maximum weight of objects carried and worn - initially 10) Flag 53 - holds object print flags Bit 7 - Set if any object printed as part of LISTOBJ or LISTAT Bit 6 - Set this to cause continuous object listing i.e. LET 53 64 will make PAW list objects on the same line forming a valid sentence. Flag 54 - holds the present location of the currently referenced object Flag 55 - holds the weight of the currently referenced object Flag 56 is 128 if the currently referenced object is a container Flag 57 is 128 if the currently referenced object is wearable Flag 58 & 59 should be avoided as they will be used for expansion. Flag 60 to 255 are available for your own use. The Condacts Conditions: AT locno ; ensure player at specific location NOTAT locno ATGT locno ; higher location than specified ATLT locno ; lower... PRESENT objno ABSENT objno WORN objno NOTWORN objno CARRIED objno NOTCARR objno ISAT objno locno+ ISNOTAT objno locno+ ZERO flagno NOTZERO flagno EQ flagno 0-255 NOTEQ flagno 0-255 GT flagno 0-255 LT flagno 0-255 SAME flagno flagno NOTSAME flagno flagno ADJECT1 word ADVERB word PREP word NOUN2 word ADJECT2 word CHANCE 0-99 ; random possibility of success TIMEOUT QUIT Actions (Those marked 4 are type 4, 3 are type 3, 1 are type 1) GET 4 objno DROP 4 objno WEAR 4 objno REMOVE 4 objno CREATE objno DESTROY objno SWAP objno objno PLACE objno locno+ PUTO locno+ PUTIN 4 objno locno. TAKEOUT 4 objno locno. DROPALL AUTOG 4 AUTOD 4 AUTOW 4 AUTOR 4 AUTOP 4 locno COPYOO objno objno COPYOF objno flagno ; copy position of object to flag COPYFO flagno objno WHATO ; convert Noun1(Adjective1) to ; current object WEIGH flagno objno ; weight of object is put in flag SET flagno CLEAR flagno PLUS flagno 0-255 ; add value to flag MINUS flagno 0-255 LET flagno 0-255 ADD flagno1 flagno2 ; contents of flagno1 added to flagno2 SUB flagno1 flagno2 COPYFF flagno1 flagno2 RANDOM flagno ; set to random number from 0-99 MOVE flagno ; adjust contents of flag according to ; the LS Verb and the Connection ; table entry for location, that the ; contents specify. (Allows movement ; of PSI's) GOTO locno WEIGHT flagno ; Weight of objects carried & worn ; are put in flag ABILITY 0-255 0-255 ; Set conveyable objects and strength MODE 0-4 0-3 LINE 0-20 ; Set screen line to split picture GRAPHIC 0-3 PROMPT sysno ; Prompt on input. 0 is random INPUT 0-7 TIME 0-255 0-7 PROTECT PRINT flagno ; display contents of flag on screen TURNS SCORE CLS NEWLINE MES mesno ; message without a newline MESSAGE mesno ; message with a newline SYSMESS sysno ; system message without newline PICTURE locno ; Display picture (without CLS) PAPER 0-9 INK 0-9 BORDER 0-7 CHARSET 0-255 ; Select character set (if inserted) SAVEAT ; Save current print position BACKAT ; return to it PRINTAT 0-20 0-31 ; Set a new print position LISTOBJ ; List objects at current location LISTAT locno+ ; List objects at specified location INVEN 3 DESC 1 END ; Type 2, Exits table to restart game DONE 3 NOTDONE 3 OK 3 SAVE 1 LOAD 1 RAMSAVE RAMLOAD flagno ANYKEY PAUSE 0-255 ; Delay program for n/50 of a second PARSE ; Convert input string to valid LS NEWTEXT ; Force the loss of remaining phrases BEEP 0-255 0-255 PROCESS procno DOALL locno+ ; Generate Noun(Adjective)1 for each ; object at Location locno. RESET 1 locno ; Move player and present objects, ; reset others to initially at - used ; to chain games with LOAD EXTERN 0-255 ; Call external program Where: locno. is a valid location number. locno+ also allows the use of; 252 (not created), 253 (worn), 254 (carried) and 255 which is converted into the current location of the player. mesno. is a valid message. sysno. is a valid system message. flagno. is any flag (0 to 255) procno. is a valid sub-process number. word; is a word of the required type, which is present in the vocabulary, or "_" which ensures no-word - not an anymatch as normal.