jac@yoko.rutgers.edu (Jonathan A. Chandross) (06/01/91)
Submitted-by: Phil Goetz (goetz@cs.buffalo.EDU) Posting-number: Volume 1, Source:51 Archive-name: util/parser/inmate/part01 Architecture: ANY_2 Version-number: 1.00 This is the ATN-based parser for Phil Goetz's text adventure "Inmate". It isn't a stand-alone piece of code, and will likely require some judicious study before it can be used. Enjoy. =Document - - - - - - - Inmate Parser - - - - - ENGLISH COMMAND PARSING - - Inmate is an adventure game. Its parser handles objects, - sources, destinations, adjectives, prepositions, adverbs, and adver- - bial phrases.[1] - - - The Inmate parser runs on an Apple ][+ in 6502 machine language - and currently occupies about 4K of memory, and is an augmented transi- - tion network (ATN). It is supported by an input routine, a lexical - analysis routine with 700-word dictionary, 50 verbs, 150 objects, 15 - adjectives, and about 300 edges indicating properties of objects or - relationships between objects. It has 4 phases: lexical analysis, - pre-ATN grammatical transformations, the ATN, and command handlers to - manipulate the game world. - - - If you aren't familiar with ATNs, a good tutorial can be found - in: - - - Author: Madeleine Bates - Title: "The Theory And Practice of Augmented Transition - Network Grammars" - Book Title: Natural Language Communications With Computers - Series: Lecture Notes In Computer Science - Number: 63 - Publisher: Springer-Verlag - City: New York, NY - Date: 1987 - Editor: Leonard Bole - - - Lexical Analysis - - Every word in the dictionary has at least 1 type, and often 2 or - 3. Some types have a number associated with them: nouns, for - instance, have an object number. Analysis produces one word number - and 1 to 3 word types for each word, stored in parallel arrays. There - are 3 special types: synonyms, transformationals, and nulls. Synonyms - take the types AND word number of another word in the dictionary. - This is so a word and all its synonyms can be identified by the same - _________________________ - - [1] Note: I removed the adverbial phrases and adverbs - because they seemed to have no purpose in an adven- - ture.] The files in this distribution contain every- - thing needed for the parser except for some of the se- - mantic network. - - - - - - - - - - - 2 - - - - word number. Transformationals are marked for pre-ATN transformation - (see below). Nulls are deleted. Articles (a, the), demonstratives - (i.e. these, those) and intensifiers (i.e. very, extremely) are - currently classified as nulls. - - - Pre-ATN Grammatical Transformation - - - The transformer scans the parallel arrays of word number and word - type for patterns which should be transformed to simpler forms using - the basic transformational operations of movement, copying, insertion, - and deletion. These include specific quirks of the language as well - as general grammatical transformations. For instance, you would want - to transform VT NP1 NP2 to VT NP2 "TO" NP1 so the ATN can pick up NP2 - as the object. - - - Note that the transformer will make a transformation if each word - in the input matches sequential words in the pattern using ANY of the - 3 possible types. So it is possible that a transformation could be - made with a mistaken type assumption. In practice, this has not been - a problem. - - - Each transformation has a priority level assigned to it. So - high-level priority transforms are tried first. This prevents an - uncommon transformation from taking effect where a common one should - have been used. - - - ATN - - - A transition network is a set of transitions from one state, or - node, to another based on the section of input currently being exam- - ineid. In a nondeterministic net such as this one, there is more than - one possible choice at some nodes. If the program takes the wrong - transition and winds up at a dead end, it must be able to trace back - to its last decision branch and try another path. If the input is - unparsable, the proram will trace all possible nodes of the network - and eventually back out of the original node. The only other way to - leave a transition network is to succeed in parsing the input. Suc- - cess is achieved by reaching the end of the input while in an "accept- - ing" node. - - - A recursive transition network is one that can call entire net- - works, including itself, as a node. An augmented transition network - (ATN) is one which can perform special actions during each transition - and have special (i.e. semantic) requirements for a transition. For - example, the transition from node 7 to node 8 in my network is invoked - if the current word is a preposition of instrument such as "with" or - "using". The transition checks the verb's case frame to see if it - - - - - - - - - - - 3 - - - - allows an instrument (verbs which do include "hit" and "wash"). If - so, it stores the current word in the Prep of Instrument slot, goes on - to the next word, and enters node 8. If not, it returns to node 7. - Some transitions leave flags to be checked/used later. The word "his" - in "Get his book" (if Ed is the only man in the room) should be used - when finding objects to remove all books from the object list that are - not either owned by or presently "in" (carried by) Ed. It doesn't - now. - - This network is not truly recursive in that it cannot normally - call independent networks as a node. It fakes recursive calling of - noun phrases (NPs) through tricky manipulations when entering and - leaving NPs and by using a special stack to keep track of NP calls. - The difficulty of implementing this in machine language is just one of - many reasons not to write your parser in machine language. - - Backtracking is handled by associating a node and a transition - index with each word. When a node is entered, its number is stored in - an array parallel to the word arrays. When it is left by a successful - transition, the index pointing to the next branch that would have been - examined from that node is saved in another parallel array. If the - program fails at the next node, it decrements the word counter, - reenters the node it came from, loads the index, and resumes where it - left off. - - One great difficulty with this is that ALL data created/changed - by the unsuccessful link of transitions must be undone. This might be - one reason to write your parser in ProLog. It would be better to have - registers which are associated with a particular parse path through - the network which are then copied into global registers, than to use - the same global registers throughout (which I did). - - Jumps are special cases because they involve a transition, yet - are not associated with a word. However, since jumps are always the - last transition tested within a node, the node jumped from can be - removed from the backtracking list and thus the parallel arrays are - not thrown out of sync. - - The purpose of this ATN is to fill in certain slots for the com- - mand handler. These slots contain the verb, object list, preposition - of instrument, instrument, prep of destination (ie into, onto), desti- - nation, and place (ie "north", "bed" when used in ungrammatical but - popular sentence "go bed"). - - Say you enter - PUT THE BAG IN THE BACKPACK IN THE BIG BLUE BOX - The first word is always the verb. Lexical analysis deletes the THEs: - PUT BAG IN BACKPACK IN BIG BLUE BOX - Now, a listing of the ATN looks like this (X! means that node X is an - accepting node; that is, if the sentence ends when it reaches that - node, it is accepted): - - - - - - - - - - - - - - 4 - - - - - Current node Input Next node - _________________________________________________ - 0 Verb of place 1 - Transitive verb 2 - Intransitive verb 7 - 1 Preposition of motion 6 - Place 7 - 2 Noun Phrase (object) 3 - 3! Exclusionary 4 - Jump 5 - 4 NP (excluded from obj) 5 - 5! Preposition of motion 6 - Jump 7 - 6 NP (destination) 7 - 7! Prep of instrument 8 - - - The noun phrase network looks like this: - - 9 Noun group 10 - 10! Prep of no motion 11 - 11 Noun group 12 - 12! Conjunction ("and") 9 - - - The noun group network looks (I think) like this: - - 13 Possessive (ie "his") 14 - Jump 14 - 14 Number ("7", "all") 15 - Jump 15 - 15 Adjective 15 - Classifier 16 - Noun 17 - 16 Classifier 16 - Noun 17 - 17! Conjunction 14 - - - - (A classifier is very similar to an adjective, i.e. "sleeping" is - a classifier for "sleeping bag". The only difference to the program - is that adjectives are handled using edges, and classifiers modifying - an object never change.) - - - PUT is a transitive verb, and so the ATN enters node 2 and looks - for a noun phrase. The noun phrase network identifies BAG IN BACKPACK - IN BOX as a noun phrase in 3 recursive passes. On the first pass, it - identifies BAG as a noun and tries to put it in the object list. It - sees that BAG is a superset containing BAG1 (the plastic bag) and BAG2 - (the sleeping bag), so it puts both in the object list. IN tells the - NP to call itself using the next NP as a source for the last NP. When - it finds BACKPACK, it removes any bags that are not IN the backpack - - - - - - - - - - 5 - - - - from the object list. Again, IN instructs the program to reenter the - NP network and look for a source for BAG. (This should really look - for a source for BACKPACK, but if a BOX contains the proper BAG and - the BACKPACK contains the proper BAG, the BACKPACK is probably in the - BOX. I haven't tried GET BACK IN BOX IN BACKPACK yet; my computer is - dismantled.) The NP network places BIG and BLUE in the adjective list. - (The adjective list is not used after parsing.) When it reaches BOX, - it puts all boxes in the known world in the object list, then removes - all boxes that are not BIG and BLUE. Then it removes all bags from - the object list that are not in the big blue box, and finds it has no - objects left. It concludes that IN BOX must specify the destination - of the bag in the object list, and so puts the bags back in the object - list and puts BOX1 (big and blue) in the destination slot and IN in - the preposition of destination slot (used by the command handler). - - - Errors, Ellipsis: - - - If the network is unable to parse a sentence, it tries to inter- - pret the sentence as a sentence fragment by inserting it into the last - sentence parsed. So if you say "Take the book" and them "examine", it - replaces "take" in "Take the book" with "examine" and tries (success- - fully) to parse that. - - - Pronouns: - - - The only pronoun with any meaning is "it". "It" refers to the - last single object referenced. I might also have a "them" for the - last group of objects referred to, but I forget. - - - Post-ATN Processing - - - I thought of having a post-ATN processor create conceptual depen- - dency representations from the information passed on by the ATN, using - something like Wilks' semantic primitives or Schanks' primitive ACTS - and inferences. Instead of writing a command handler for each verb, - more general handlers could deal with similar verbs (i.e. give, take, - sell, buy; eat, drink). Ideally, this construction should be used - during ATN analysis for semantic interpretation and disambiguation of - the sentence, but commands in adventures are almost always unambiguous - and simple enough for correct parsing by the ATN. - - - Using semantic primitives is something I think IF requires, but - it is not practical until we can write IF which does not depend on - ad-hoc rules that are applied to individual verb-object-etc. combina- - tions. It would be, I think, difficult to apply such ad-hoc rules to - a conceptual dependency representation of a sentence - not for the - computer, but for the human who would have to translate all his ad-hoc - - - - - - - - - - - 6 - - - - situations into conceptual dependency representations while program- - ming. - - - Command Handlers - - - The command handlers might be designed for use with a processor - as mentioned above. Currently, however, they are verb-specific com- - mand handlers as in most adventure games. They manipulate the game - world by adding and/or deleting edges in the database. They can also - trigger actions/messages/etc under certain conditions. - - - If a list of more than one object is provided with an action, the - action is repeated once for each object. - - - Source Code - - - To read the source, first read "inmate" . That is the root file, - which is assembled, and includes all the other files. The comments in - it explain what each file does. So you can just read the files you're - interested in. - - - The list of files is: - - File Contents - __________________________________________________________________ - atn Augmented transition network (parser) - caseframe Verb case frames - cndact Defines interpreted adventrue language used by verb - handlers and other routines. - display30 Print location & happenings each turn - edges Routines for altering - handler Verb handler jumped to after parse completed - gennum ??? - inmate the game; glues together all the modules - io Save - lex Lexical analysis: Examine raw string & find words - macros macro definitions - monitor2 Call monitor routines in other RAM bank - print22 Print messages, strings; including compression routine - start Initialization - transform Grammatical transformations - transit Transitions for the ATN - tsub Subroutines called by the transitions - verbs Verb execution routines - voca Vocabulary, A-I - vocj Vocabulary, J-Z - - - - - - - - - - - - - 7 - - - - The Inmate parser source is for the S-C Macro Assembler. It - includes a lot of assembly directives. The VOCab files have lines - like: - .AS -/ORT/ - which probably means "negative (hi-bit set) ASCII for "ORT". I think - .AT is for terminated ASCII (last character has hi-bit reversed). - More directives: - - .DA Data - .OR Set object code origin address - .TF Set target file name - .IN Include - .BS Data block of certain size - .US User-defined directive, in this case meaning - "write out the compressed version of the ASCII text - given, using my text-compression algorithm". - .HS Hexadecimal string. - #SYMBOL Low byte of symbol's value - SYMBOL - - - - - Phil Goetz - 4023 Huckleberry Row - Ellicott City, MD 21043 - - goetz@cs.buffalo.EDU - - =Manifest -Document -atn -caseframe -cndact -display30 -edges -gennum -handler -inmate -io -lex -macros -monitor2 -print22 -start -transform -transit -tsub -verbs -voca -vocj =atn -* -SAVEATN16.1,S6,D1 -*-------------------------------- -* AUGMENTED TRANSITION NETWORK -*-------------------------------- -* ON ENTRY: WORDS=# OF WORDS -TNPNT .EQ $C -ATN JSR CHKEY - BIT DBGFLG ? "ATN:"? - BPL .4 - JSR FD8E - LDX #0 -.1 LDA WTYPE,X NUM IS ALWAYS 1ST TYPE - CMP #NUM - BNE .2 - LDA WNOUN,X - JSR FDDA - JMP .3 -.2 LDA WLO,X - LDY WHI,X - JSR PRWRD -.3 LDA #$A0 - JSR FDF0 - INX - CPX WORDS - BCC .1 - LDY /ATNS - LDA #ATNS - JSR PS -.4 LDX #33 - LDA #0 - STA UCONJ CONJ NOT USED YET - STA JUCONJ -.5 STA SDEST-1,X ZERO SLOTS & OBJLIST - DEX - BNE .5 - STX WORDNODE - STX CURWORD - STX NPSP - STX PFND - LDA #NODE0 - STA TNPNT - LDA /NODE0 - STA TNPNT+1 -A1 LDY #0 -A2 LDA (TNPNT),Y - BEQ A4 END OF NODE - STA TEMP SAVE IN CASE IT'S A JMP - BMI A61 JMP - CMP WTYPE,X - BEQ A6 - CMP WTYPE2,X - BEQ A6 - CMP WTYPE3,X - BEQ A6 - INY - INY - INY -A3 INY - BNE A2 ALWAYS -A4 DEX FAIL,BACK TO LAST NODE - DEC CURWORD - BMI ASSUME NO NODES LEFT=ALL OPTIONS EXPLORED - LDA WORDNODE,X CONTINUE WI NODE X - JSR INTONP IF GOING INTO MIDDLE OF NP, NPSP=NPSP+2 - JSR GETNODE - LDY WORDINDEX,X - JMP A2 -A6 STA WTFIN,X SUCCESS -A61 INY - LDA (TNPNT),Y - STA .7+1 - INY - LDA (TNPNT),Y - STA .7+2 - INY - LDA (TNPNT),Y NEXT NODE - CMP #EN ENDNODE - BNE .65 - BIT DBGFLG PRINT "E"? - BPL .63 - LDA #$A0 - JSR FDF0 - LDA #"E - JSR FDF0 -.63 INX - CPX WORDS - DEX - BCC A3 - JMP CHECKSENT ENDNODE ALWAYS ACCEPTS -.65 BIT TEMP - BMI .67 IF A JMP, SAVE NEXT NODE IN CURRENT NODE - PHA - INY - TYA - STA WORDINDEX,X LIKEWISE SAVE CURRENT INDEX - PLA - INC CURWORD - INX -.67 STA WORDNODE,X SAVE NEXT NODE IN CASE YOU MUST COME BACK LATER - JSR GETNODE -.7 JSR 0 -A8 LDX CURWORD - CPX WORDS DONE? - BCS .9 - JMP A1 -.9 LDA WORDNODE,X - TAX - LDA ACCEPT,X DOES THIS NODE ACCEPT EOL? - PHP - LDX CURWORD - PLP - BEQ A4 NO,BACK UP - JMP CHECKSENT YES,PARSED! -* ASSUME: TRY TO FIND OBJ,PLACE,OR INSTR FROM ROOM -ASTRIED .BS 1 1=ALREADY TRIED -RETRY .BS 1 1-FF=TRY ATN AGAIN -ASSUME LDA DQ IN QUOTES? - BEQ .0 NO - LDA #0 NOT COMMAND, CHAR NOW DOES THINGS OF OWN WILL - STA DQ - JMP SPEAK -.0 LDY ASTRIED - BNE .12 ALREADY TRIED - LDA LIGHT - BEQ .12 NO LIGHT, NO ASSUME - STY RETRY - STY TNPNT FOR VT OBJ - INC ASTRIED MARK AS TRIED - BIT DBGFLG - BPL .8 - LDY /AS - LDA #AS - JSR PS -.8 LDA WTFIN VERB TYPE - CMP #VT+1 VERB? - BCC .11 YES -.12 JMP ELLIPSIS -.11 CMP #VP - BNE .4 - LDA SDEST - BNE .39 AS5 -*VP GIVEN BUT NO PLACE - LDA LOC - LDX #HOLDS - JSR GETOBJ -.1 DEX - BMI .2 - PLA - CMP #LP+1 IS IT A PLACE? - BCS .1 NO - LDY SDEST - BEQ .15 - JMP .47 MORE THAN 1 PLACE IN THIS LOC,FAILURE -.15 STA SDEST - BEQ .1 ALWAYS -.2 LDA SDEST - BEQ .12 NO PLACE FOUND - JMP .48 -.39 JMP AS5 -.4 CMP #VT - BNE .39 - LDX OBJLIST -.41 BNE .39 - STX TNPNT X MUST BE 0 IF GETOBJ ISN'T CALLED - STX OBJS DON'T RETURN FROM ELIM USING STEMP - TXA - LDX #20 -.98 STA NOUNLIST-1,X - DEX - BNE .98 -*VT GIVEN BUT NO OBJ - LDA CASEFRAME - AND #$20 - BEQ .42 CAN'T BE IN INVEN - LDA WVERB - CMP #GET GET ALLOWS PICKING UP OBJS IN INVEN - BEQ .42 - LDA #ME - LDX #HOLDS - JSR GETOBJ INVEN - STX TNPNT -.42 BIT CASEFRAME - BVC .44 OBJS IN LOC NOT ALLOWED - LDA LOC - LDX #HOLDS - JSR GETOBJ - TXA - CLC - ADC TNPNT - TAX -.44 CPX #20 MAX - BCC .45 - PLA - DEX - BNE .44 -.45 DEX - BMI .46 - PLA - JSR FF4A - LDA $45 - JSR PNTOBJ - LDY #5 - LDA (MISC),Y - PHP WORKS SINCE N IS N-BIT - JSR FF3F - PLP PLA WOULD DESTROY # - BMI .45 CAN'T ASSUME OBJS WHICH ARE INVISIBLE - STA NOUNLIST,X - JMP .45 -.46 STX NMSG DON'T PRINT - JSR COMP CHL ALSO JSRs COMP (AT END) - JSR CHL-2 - INC NMSG - LDA NOUNLIST+1 MORE THAN 1 OBJ LEFT? -.47 BNE ELLIPSIS YES - LDA NOUNLIST - BEQ ELLIPSIS -* BNE .48 -* BIT CASEFRAME -* BVC ELLIPSIS OBJS IN LOC FORBIDDEN -* LDA #ME ADD ME IF NOTHING ELSE IN LOC -.48 JSR INSWRD - LDA #CN -*CHANGE TO #PROPER IF HUMAN/ANIMATE - STA WTYPE+1 - STA RETRY -*AS5 LDA CASEFRAME+1 -* AND #4 -* BEQ .9 NO INSTR REQD -* LDA SINSTR -* BNE .9 -** INSTR REQD,NOT GIVEN -* CURRENTLY HANDLED BY CHECKSENT -*.9 -AS5 LDA RETRY - BEQ ELLIPSIS NO SUCCESS - JMP ATN -* ELLIPSIS -* IF UNABLE TO PARSE LINE, TAKE EACH WORD AND SUBSTITUTE IT FOR A WORD -* OF THE SAME TYPE IN THE LAST SENTENCE, THEN RETRY ATN. -* NOUN PHRASES CAUSE TROUBLE: MUST SUBSTITUTE ONE NOUN PHRASE OF LENGTH X -* FOR OLD NOUN PHRASE OF LENGTH Y -ELTRIED .BS 1 1=ELLIPSIS ALREADY TRIED ON THIS INPUT - .MA PN - SEC - SBC #NUM - CMP #EXC+1-NUM C=0 IF TYPE IN A IS PART OF A NOUN - .EM -SF JMP SENTFAIL -ELLIPSIS LDY ELTRIED - BNE SF ALREADY TRIED ELLIPSIS - BIT DBGFLG - BPL .1 - LDY /EL - LDA #EL - JSR PS - LDY #0 -.1 LDX #0 -E1 LDA WTYPE,X - >PN - BCC .3 - LDA WTYPE2,X - >PN - BCC .2 - LDA WTYPE3,X - >PN - BCC .2 - JMP NOTNT -.2 ADC #NUM RESTORE TYPE - STA WTYPE,X -.3 LDA LWTFIN,Y - >PN - BCC .35 - INY - CPY LWORDS - BCC .3 - BCS SF NT NOT FOUND -.35 STY MISC POINTS TO 1ST NT -.4 INY - CPY LWORDS - BCS .5 - LDA LWTFIN,Y - >PN - BCC .4 -.5 TYA POINTS TO 1ST NON-NT OLD WORD - DEY - STY TNPNT+1 - SBC MISC A=LENGTH OF OLD NT GROUP - STA TNPNT - STX MISC+1 POINTS TO 1ST NEW NT -.6 INX - CPX WORDS - BCS .7 - LDA WTYPE,X - >PN - BCC .6 - LDA WTYPE2,X - >PN - BCC .65 - LDA WTYPE3,X - >PN - BCS .7 -.65 ADC #NUM RESTORE - STA WTYPE,X - BCC .6 ALWAYS -* X POINTS TO 1ST NON-NT NEW WORD -.7 TXA - SBC MISC+1 A=LEN OF NEW NT GROUP - SEC - SBC TNPNT - PHP - PHA - CLC - ADC LWORDS + OR - - STA LWORDS ADJUST #OLD WORDS - PLA - PLP - BEQ EMOVED - BCS .9 -* OLD NTG > NEW NTG - SBC #0 SUBTRACTS 1 - EOR #$FF CHANGE A FROM - TO + - CLC - ADC MISC POINTER TO OLD NT - TAY - LDX MISC X POINTS TO 1ST NT -.8 JSR EMOVE - INX - INY - CPX LWORDS LWORDS HAS BEEN DECREASED - BCC .8 - BCS EMOVED -* NEW NTG > OLD NTG -.9 CLC - ADC LWORDS - TAX - DEX - DEX - LDY LWORDS - DEY - DEY -.10 JSR EMOVE - DEX - DEY - CPY TNPNT+1 - BCS .10 -EMOVED LDX MISC+1 - LDY MISC -.1 LDA WTYPE,X - STA LWTFIN,Y - JSR NW.OW - INX - CPX WORDS - BCS DONE - INY - LDA WTYPE,X - >PN - BCC .1 -NOTNT LDA LWTFIN,Y - CMP WTYPE,X - BEQ .2 - CMP WTYPE2,X - BEQ .2 - CMP WTYPE3,X - BNE .3 -.2 CPY LWORDS - BCS SENTFAIL - JSR NW.OW - INX - CPX WORDS DONE? - BCS DONE -.3 INY NEXT OLD WORD - CPY LWORDS - BCS SENTFAIL - JMP E1 -DONE LDY #30*4+1 DON'T COPY LWTFIN -.5 LDA LWLO-1,Y - STA WLO-1,Y - DEY - BNE .5 - LDX #29 -.6 LDA LWTFIN,X - STA WTYPE,X - TYA 0 - STA WTYPE2,X - STA WTYPE3,X - DEX - BPL .6 - DEC ELTRIED MARK ELLIPSIS AS ALREADY TRIED - JMP ATN -SENTFAIL LDA #0 - STA WORDS DON'T TRY FAILED SENTENCE IN ELLIPSIS - BIT DBGFLG - BPL .1 - JSR FD8E DON'T PRINT ON SAME LINE AS DEBUGGING MESSAGES -.1 LDY /.2 - LDA #.2 - JSR PS - JMP PARSE -.2 .US /I DON'T UNDERSTAND THAT SENTENCE.@=/ -AS .US /@ASSUMPTION=/ -EL .US /@ELLIPSIS=/ -INSWRD PHA - LDA #"( - JSR FDF0 - LDA WORDS - TAX - TAY - DEY - BEQ .3 1 WORD:VP -.25 JSR TMOVE MOVE SENT. UP - DEX - DEY - BNE .25 DON'T MOVE VERB -.3 STY SDEST - STY WVERB+1 - STY WTYPE2+1 - STY WTYPE3+1 - PLA - STA WNOUN+1 PLACE AFTER VERB - DEY - STY WHI+1 #$FF - INC WORDS - JSR PROBJ - LDA #") - JSR FDF0 - JMP FD8E -NW.OW LDA WLO,X NEW WORD->OLD SENTENCE - STA LWLO,Y - LDA WHI,X - STA LWHI,Y - LDA WVERB,X - STA LWVERB,Y - LDA WNOUN,X - STA LWNOUN,Y - RTS -EMOVE LDA LWLO,Y - STA LWLO,X - LDA LWHI,Y - STA LWHI,X - LDA LWVERB,Y - STA LWVERB,X - LDA LWNOUN,Y - STA LWNOUN,X - LDA LWTFIN,Y - STA LWTFIN,X - RTS -GETNODE BIT DBGFLG PRINT NODE? - BPL .1 - PHA - LDA #$A0 - JSR FDF0 - PLA - PHA - JSR FDDA - PLA -.1 STA CURNODE - ASL - TAY - LDA NODETAB,Y - STA TNPNT - LDA NODETAB+1,Y - STA TNPNT+1 - JMP CHKEY -CURNODE .BS 1 ONLY USED BY INTONP -INTONP CMP #NP - BCC .5 - CMP #15 - BCS .5 - LDY CURNODE ONLY USE OF CURNODE - CPY #NP - BCC .45 - CPY #15 - BCC .5 UNLESS ALREADY IN NP -.45 INC NPSP IF GOING BACK INTO NP, - INC NPSP GIVE IT AN EXIT ROUTINE -.5 RTS -*-------------------------------- -ATNS .US /@A%T%N:=/ -*------------------------------- -WTYPE .BS 30 -WTYPE2 .BS 30 -WTYPE3 .BS 30 -OLO .BS 30 ORIGINAL WORD#: USED FOR STRING SUBST -OHI .BS 30 WHEN A CHARACTER REPEATS STRING -* NEXT 6 MUST BE TOGETHER -WLO .BS 30 UP TO 30 WORDS -WHI .BS 30 -WVERB .BS 30 -WNOUN .BS 30 -WORDS .BS 1 # OF WORDS -WTFIN .BS 30 -WORDNODE .BS 30 -WORDINDEX .BS 30 -* LAST SENTENCE PARSED, USED IN ELLIPSIS -LWLO .BS 30 -LWHI .BS 30 -LWVERB .BS 30 -LWNOUN .BS 30 -LWORDS .BS 1 -LWTFIN .BS 30 -* SLOTS FILLED BY ATN & PASSED TO VERB HANDLERS -* MODIFY ATN ENTRY IF YOU CHANGE THESE -SDEST .BS 1 -SINSTR .BS 1 -SPLACE .BS 1 -SNUM .BS 1 -SADV .BS 1 -STIME .BS 2 -SPI .BS 2 -SPT .BS 2 -SPM .BS 1 USED BY HANDLER -SPN .BS 1 USED BY ATN -OBJLIST .BS 21 1 EXTRA FOR BUFFER -NOUNLIST .BS 20 -LNL .BS 20 -SOURCELIST .BS 20 -LOCLIST .BS 20 -CASEFRAME .BS 6 -NPSP .BS 1 POINTER INTO NP STACK -NPSTACK .BS 20 -ADJLIST .BS 8 -* -* ACCEPT:00=LINE CAN'T END IN THIS NODE -ACCEPT .HS 000000FF00FF00FF00FF0000000000FF00 -* -* .DA #PART OF SPEECH REQD FOR TRANSITION,TRANSITION SUBROUTINE,#DEST NODE -JMP .EQ $80 -NODE0 .DA #VI,TV,#7 - .DA #VP,TV,#1 - .DA #VT,TV,#2 - .DA #VI,TV,16 -NP .EQ 11 -NODETAB .DA NODE0,.1,.2,.3,.4,.5,.6,.7,.8,.9,0,.11,.12,.13,.14,.15,.16 -.1 .DA #PLACE,TPLACE,#7 - .DA #PM,TPM,#6 - .DA #PRT,TPRT,#1 - .DA #JMP,TPOBJ,NP -.2 .DA #PRT,TPRT,#2 - .DA #JMP,TOBJ,NP NP OBJ & SOURCE -.3 .DA #EXC,TRTS,#4 - .DA #JMP,TRTS,5 -.4 .DA #JMP,TEXC,NP NP.EXC -.5 .DA #PM,TPM,#6 - .DA #PRT,TPRT,#5 - .DA #JMP,TRTS,7 -.6 .DA #JMP,T6.7,NP NP.DEST -*7 .DA #ADJ,TADV,#9 -.7 .DA #PI,T7.8,8 -* .DA #JMP,TRTS,9 -.8 .DA #JMP,TINSTR,NP NP.INSTRUMENT -.9 .DA #0 -*9 .DA #PT,T9.10,#10 -* .DA #TB,T9.E,EN -*10 .DA #TIME,T9.E,EN -.11 .DA #POS,TRTS,#12 POSSESSIVE IGNORED - .DA #JMP,TRTS,12 -.12 .DA #NUM,TNUM,#13 - .DA #JMP,TRTS,13 -.13 .DA #ADJ,TADJ,#13 - .DA #CN,TNOUN,#14 - .DA #CNP,TNOUN,#14 - .DA #PRN,TPRN,#14 - .DA #PROPER,TNOUN,14 -.14 .DA #PN,TPN,#NP - .DA #CONJ,TCONJ,#NP - .DA #JMP,TLEAVENP,15 -.15 .DA #0 FAKE NODE FOR NP TO END AT -.16 .DA #PRT,TPRT,7 ACTUALLY RESTARTS ATN -EN .EQ 17 =caseframe -* -SAVECASEFRAME -* .DA CASEFRAME,DATA TABLE -* CASEFRAME: -* 7=OBJ MAY BE ABSENT -* 6=OBJ MAY BE ROOM/IN ROOM -* 5=OBJ MAY BE IN/ON PERSON -* 4=PERMISSIBLE OBJLIST GIVEN -* 3=FORBIDDEN OBJLIST GIVEN -* 2=HUMAN OBJ ALLOWED -* 1=ANIMATE OBJ ALLOWED -* 0=INANIMATE OBJ ALLOWED -* 7=SIZE MUST BE <X -* 6=SIZE MUST BE >=Y -* 5=OBJ MUST HAVE PROPERTIES F -* 4=CAN HAVE BURNT/BROKEN OBJ -* 3=INSTR ALLOWED,LIST GIVEN -* 2=INSTR REQUIRED -* 1=DEST ALLOWED -* 0=DEST REQ'D -* 7=DEST LIST GIVEN -* 6=PREP LIST GIVEN -* 5=VERB PART PERMITTED -* 4=VERB PART REQUIRED -* 3=CHAR WILL DO VERB IF TOLD -* 0=FAILURE IF OBJ NOT GOTTEN -* 7=GET OBJ IF POSSIBLE AND NOT CARRIED -* 6=SPECIAL ACTIONS -* 5=JSR -* 4=ADD EDGE -* 3=DELETE EDGE -* 2=REPLACE EDGE -* 1=ZERO OBJ BITS -* 0=SET OBJ BITS -* -* FOR VP SUBST PLACE FOR OBJ -* WHEN PLACE IS NOUN (NOT NSEW..) -* VP WON'T PARSE IF NO DEST -* GIVEN, SO DON'T REQUIRE DEST -* FOR VP WHICH PERMIT SPLACE -* -* PARTS -* DON'T REUSE # ANOTHER PART MAY HAVE IN DATA, IE ON=4 -FOR .EQ 40 -OFF .EQ 41 -OUT .EQ 42 -AWAY .EQ 43 -* UP prt# = UV -* -VERBS -ATT .EQ 0 - .DA $371,$4C8,TATT -BRE .EQ 1 - .DA $BC61,$4500,TBRE -BRU .EQ 2 - .DA $C71,$4000,TBRU -BUR .EQ 3 - .DA $3C61,$500,TBUR -CHEC .EQ 4 - .DA $1071,$C030,TCHEC -CHEOUT .EQ 5 - .DA $1071,$C100,TCHEOUT -CHEW .EQ 6 - .DA $2061,$4000,TCHEW -CLE .EQ 7 - .DA $8C71,$400,TCLE -CLI .EQ 8 - .DA $300,$4440,TCLI -CLOS .EQ 9 - .DA $2061,$2208,TCLOS -CLOT .EQ 10 - .DA $C66,$4000,TCLOT -COM .EQ 11 - .DA $C66,$4000,TCOM -CUT .EQ 12 - .DA $C71,$500,TCUT -DV .EQ 13 - .DA 0,$2000,TD -DAM .EQ 14 - .DA $1077,$4000,TDAM -DEB .EQ 15 - .DA 0,$2000,TDEB -DEV .EQ 16 - .DA $71,$4000,TDEV -DIE .EQ 17 - .DA 0,$4000,TDIE -DRIB .EQ 18 - .DA $71,$8008,TDRIB -DRI .EQ 19 - .DA $2061,$6000,TDRI -DRO .EQ 20 - .DA $1227,$4000,TDRO -DRY .EQ 21 - .DA $9C6F,$4800,TDRY -DUM .EQ 22 - .DA $8061,$4000,TDUM -DUN .EQ 23 - .DA $8271,$40C8,TDUN -EV .EQ 24 - .DA 0,$2000,TE -EAT .EQ 25 - .DA $2061,$E001,TEAT -ELL .EQ 26 - .DA 0,$4000,TELL -END .EQ 27 - .DA $F1,$4000,TEND -ERA .EQ 28 - .DA $1071,$4008,TERA -EXA .EQ 29 - .DA $1067,$E008,TEXA -EXI .EQ 30 - .DA $1041,$2000,TEXI -EXT .EQ 31 - .DA $1861,$4000,TEXT -FAS .EQ 32 - .DA 0,$2000,TFAS -FIL .EQ 33 - .DA $2C67,$408,TFIL -FIN .EQ 34 - .DA $10E7,$4008,TFIN -FLU .EQ 35 - .DA $71,$4200,TFLU -FOL .EQ 36 - .DA $46,$4008,TFOL -GET .EQ 37 GET, TAKE OFF - .DA $9063,$C221,TGET SPECIAL ACTION ELIMINATES OBJS IN ME -GIV .EQ 38 - .DA $9321,$C40,TGIV -GO .EQ 39 - .DA $4041,$2440,TGO -HEA .EQ 40 - .DA $67,$6000,THEA -HEL .EQ 41 - .DA $1856,$2008,THEL -HIT .EQ 42 - .DA #%01100111,%00011100,#$40,THIT -IV .EQ 43 - .DA 0,$2000,TI -JUM .EQ 44 - .DA 0,$4000,TJUM -KIL .EQ 45 - .DA #%01000110,#%00001100,#0,#$40,TKIL -LIG .EQ 46 - .DA $2061,$C500,TLIG -LOA .EQ 47 - .DA #%11110111,#$10,#0,#$20,TLOA -LOCV .EQ 48 SYMBOL LOC TAKEN - .DA $2C69,$4208,TLOC -LOI .EQ 49 - .DA 0,0,0 -LOO .EQ 50 - .DA $12E7,$2048,TLOO LOOK NORTH? -LOW .EQ 51 - .DA 0,$4000,TLOW -MOV .EQ 52 - .DA $9263,$4000,TMOV -NV .EQ 53 - .DA 0,$2000,TN -NOD .EQ 54 - .DA 0,$2000,TNOD -NOE .EQ 55 - .DA 0,$4000,TNOE -OPE .EQ 56 - .DA $3861,$6100,TOPE -PIC .EQ 57 PICK UP - .DA #$E7,#$10,#%00111000,#0,TPIC -PLA .EQ 58 - .DA $A71,$40C8,TPLA -PHO .EQ 59 - .DA $C67,$4000,TPHO -POK .EQ 60 - .DA $1866,$4000,TPOK -POU .EQ 61 - .DA #%01100001,#%00110010,$4048,TPOU -PRY .EQ 62 - .DA #$71,#$1C,#$20,#$A,TPRY -* PULL=MOVE -PUS .EQ 63 - .DA $9061,$4000,TPUS -PUT .EQ 64 - .DA $9363,$C428,TPUT PUT,PUT DOWN,PUT OUT -REA .EQ 65 - .DA $2061,$C001,TREA -REC .EQ 66 - .DA $300,$40C8,TREC -REM .EQ 67 - .DA $8067,$C400,TREM DOESN'T GET IN GET ROUTINE, JUST CHECKS FOR SPCACT -RET .EQ 68 - .DA #$71,$100,#%11000010,TRET -REW .EQ 69 - .DA $C71,$4100,TREW -RIP .EQ 70 - .DA $71,$820,TRIP -SV .EQ 71 - .DA 0,$2000,TS -SAL .EQ 72 - .DA $1C71,$8,TSAL -SAU .EQ 73 - .DA 0,$4000,TSAU -SAV .EQ 74 - .DA #%11110111,#$10,#0,#$20,TSAV -SAY .EQ 75 - .DA $3F7,$6040,TSAY -SCO .EQ 76 - .DA 0,$2000,TSCO -SCR .EQ 77 SCREW - .DA $F71,#$C0,#%01010101,TSCR -SHOO .EQ 78 - .DA #%01000111,#%10011100,$4000,TSHOO -SHOW .EQ 79 - .DA $200,$4CC0,TSHO -SIT .EQ 80 - .DA $300,$4C0,TSIT -SLE .EQ 81 - .DA 0,$4400,TSLE -SLOW .EQ 82 - .DA 0,$2000,TSLO -SME .EQ 83 - .DA $67,$E008,TSME -SPR .EQ 84 - .DA 0,8,0 -STA .EQ 85 - .DA #$71,0,#$40,TSTA -STI .EQ 86 - .DA #$71,#$13,#$C1,#$84,TSTI -STO .EQ 87 - .DA $77,$4008,TSTO -SWA .EQ 88 - .DA $A061,$6000,TSWA -SWI .EQ 89 - .DA $200,$2000,TSWI -THR .EQ 90 - .DA $9221,$4060,TTHR -TAW .EQ 91 THROW AWAY - .DA $9221,$40C0,TTAW -TIC .EQ 92 - .DA $66,$4000,TTIC -TUR .EQ 93 - .DA #$61,#0,#%00110000,#0,TTUR -TUROFF .EQ 94 - .DA #$61,0,#$40,TOF -TURNON .EQ 95 - .DA #$61,0,#$40,TON -TYP .EQ 96 - .DA $13F1,$40C8,TTYP -UV .EQ 97 - .DA 0,$2000,TU -UNLI .EQ 98 - .DA $2061,$4A00,TUNLI -UNLO .EQ 99 - .DA $2C69,$4100,TUNLO -UNS .EQ 100 - .DA $C71,#0,#%01001000,TUNS -USE .EQ 101 - .DA $71,$4000,TUSE -VOC .EQ 102 - .DA 0,$2000,TVOC -WV .EQ 103 - .DA 0,$2000,TW -WEA .EQ 104 - .DA $2061,$D00,TWEA -WIN .EQ 105 - .DA $F1,$4000,TWIN -WIND .EQ 106 - .DA $71,$4000,TWIND -YEL .EQ 107 - .DA 0,$4000,TYEL -PV .EQ 108 FAKE VERB FOR PUTTING INTO VENT - .DA $63,$4000,TPV -SCRI .EQ 109 SCRIPT - .DA 0,$4000,TSCRI -NOSC .EQ 110 - .DA 0,$2000,TNOSC -*-------------------------------- -* IN MOST ADVENTURES,SOME VERBS SHOULD SPECIFY THAT THE SCREEN NOT BE -* UPDATED AFTER THEM. NOT SO HERE,BECAUSE OBJS CAN WANDER AROUND -* INDEPENDENT OF THE PLAYER. =cndact -* -SAVECNDACT26 -* CONDITION#,COND PARMS,[AND,COND,CP]/[ACTION#,ACT PARMS,0(/,#$80,CND,..)] -* CONDITIONS AND ACTIONS -* OBJWASIN,ISEDG,ITIN CAN BIND VAR IN FINAL BYTE -NULL .EQ 1 -OBJIS .EQ 2 -LOCIS .EQ 3 -PEEK .EQ 4 -SLOTIS .EQ 5 -INROOM .EQ 6 -OBJIN .EQ 7 -OBJWASIN .EQ 8 -PRIMED .EQ 9 -ZERO .EQ 10 -BITSET .EQ 11 -JSR .EQ 12 -ISEDG .EQ 13 -ITIN .EQ 14 -ACTME .EQ 15 -CZ .EQ 16 -INME .EQ 17 -CNDTAB .DA .0,.5,.10,.15,.20,.25,.30,.35,.40,.45,.50,.55,.60,.65,.70,CA75,CA80 -* CONDITIONS ENTERED WI 1ST PARM IN A -* ON EXIT:Z=1 IF SUCCESS -* NO CONDITION -.0 LDA VDAT+1 - BNE .1 - DEC VDAT+2 -.1 DEC VDAT+1 NO PARMS - LDA #0 SUCCESS - RTS -* OBJ=X -.5 JSR GEDGE+3 - CMP CUROBJ - RTS -* ACLOC=X -.10 CMP ACLOC - RTS -* MEMLOC=X -.15 JSR RDADR+3 - JSR VDAT - CMP (MISC),Y - RTS -* SLOT=X -.20 JSR GEDGE+3 - STA MISC - JSR VDAT - CMP MISC - RTS -* ITEM IN ROOM -.25 JSR GEDGE+3 - LDX #0 - STX ILOC - JSR CHECKLOC - LDA ILOC - CMP ACLOC - RTS -* OBJ IN X -.30 JSR GEDGE+3 - STA $1A - LDA CUROBJ - LDX #IN - JSR GETOBJ - DEX - BMI .31 - PLA - CMP $1A -.31 RTS -* OBJ WAS IN X BEFORE GOTTEN -.35 JSR GEDGE+3 - CMP #$FF UNBOUND VAR - BNE .37 - LDA OLDLOC - JSR BIND -.37 CMP OLDLOC - RTS -* OBJ PRIMED -.40 JSR .0 DEC VDAT - LDA CUROBJ - JSR PNTOBJ - LDY #4 - LDA (MISC),Y - AND #$10 - EOR #$10 - RTS -* PEEK (X) = 0 -.45 JSR RDADR+3 - LDA (MISC),Y - RTS -* ITEM BIT SET -.50 JSR GEDGE+3 - JSR PNTOBJ - JMP TBIT -* MACHINE-LANGUAGE SUB WHICH DETERMINES Z -.55 JSR RDADR+3 - JMP (MISC) -* EDGE V V _ V EXISTS -.60 JSR GEDGE+3 - PHA - JSR GEDGE - TAX - JSR GEDGE - STA TEMP+1 - PLA - JSR GETOBJ -.61 DEX - BMI .64 FAIL - PLA - CMP TEMP+1 - BEQ .63 SUCCEED - LDY TEMP+1 - CPY #$FF UNBOUND VAR - BNE .61 - JSR BIND BIND,SUCCEED - .HS A9 (LDA #$68) PULL REST OFF STACK -.62 PLA -.63 DEX - BPL .62 - INX Z=1 -.64 RTS -* ITEM IN X -.65 JSR GEDGE+3 - LDX #IN - JSR GETOBJ - JSR GEDGE DOESN'T CHANGE X - DEX - BMI .67 NOT IN ANYTHING,FAIL - STA TEMP+1 - PLA - STA MISC - LDA TEMP+1 - CMP #$FF UNBOUND VAR - BNE .66 NO - LDA MISC - JSR BIND BIND,SUCCEED -.66 CMP MISC -.67 RTS -* I'M ACTOR -.70 JSR .0 - LDA ACTOR - CMP #ME - RTS -* ITEM COUNTER 0 -CA75 JSR GEDGE+3 - JSR PNTOBJ - LDY #4 - LDA (MISC),Y - AND #7 - RTS -* ITEM IN ME -CA80 JSR GEDGE+3 -CINME LDX #IN - JSR GETOBJ - DEX - BMI .1 - PLA - CMP #ME - BNE CINME -.1 RTS -OLDLOC .BS 1 -RDADR JSR VDAT - STA MISC - JSR VDAT - STA MISC+1 - LDY #0 - RTS -AMSG .EQ 1 -ARPL .EQ 2 -AJSR .EQ 3 -SKIP .EQ 4 -POKE .EQ 5 -AINC .EQ 6 -NOTH .EQ 7 -GOTO .EQ 8 -MAKVIS .EQ 9 -ASBIT .EQ 10 -AZBIT .EQ 11 -MOVETO .EQ 12 -ADEC .EQ 13 -DECC .EQ 14 -DO .EQ 15 -CHMAP .EQ 16 -AREP .EQ 17 -AMAK .EQ 18 -ADEL .EQ 19 -SPAWN .EQ 20 -TRANS .EQ 21 -ADIE .EQ 22 -DELIT .EQ 23 -UPSCR .EQ 24 -DESTR .EQ 25 -ASWI .EQ 26 -UNBIND .EQ 27 -CGO .EQ 28 CONVERSATION GOTO -ACTLEN .DA #1,#1,#2,#0,#3,#2,#0,#2,#1,#4,#4,#1,#2,#1,#7,#3,#3,#3,#3,#3,#3,#0,#1,#1,#1,#2,#0,#1 -ACTTAB .DA .0,.3,.5,.10,.15,.20,.25,.30,.35,.40,.45,.50,.55,.60,.65,CA1,DOREP,MAK,DEL,SPW,TRN,ADI,DLO,UPS,DES,SW,UB,CG -* PRINT MESSAGE -.0 JSR NOK - JSR VDAT - JMP PMSG -* PRINT REPLY -.3 JSR NOK - JSR VDAT - JMP PRPL -* JSR -.5 JSR RDADR - JMP (MISC) -* SKIP OBJECT -* WHEN CALLED FROM INLINE, SKIPS THE REST OF THE AL CODE INLINE -* & RETURNS TO THE GIVEN INLINE ADDRESS (IE DRT) -.10 PLA POP SPCACT - PLA - PLA POP ROUTINE WITH JSR SPCACT - PLA - RTS -* POKE -.15 JSR RDADR - JSR GEDGE NOTE YOU CAN'T POKE A VALUE = A VAR# - LDY #0 - STA (MISC),Y - RTS -* INC -.20 JSR VDAT - STA .21+1 - JSR VDAT - STA .21+2 -.21 INC $FFF -* NOTHING:NORMALLY FOLLOWED BY AN ELSE -.25 RTS -* GOTO -.30 JSR RDADR - LDA MISC - STA VDAT+1 - LDA MISC+1 - STA VDAT+2 - RTS -* MAKE OBJ VISIBLE -.35 JSR GEDGE - JSR PNTOBJ - LDY #5 - LDA (MISC),Y - AND #$7F - STA (MISC),Y - RTS -* SET BITS OF ITEM -.40 JSR GEDGE - JMP SBIT -* ZERO BITS -.45 JSR GEDGE - JMP ZBIT -* MOVE ME INTO X -.50 JSR GEDGE - TAY - LDA #ME - LDX #IN - JMP REPEDG -* DEC BYTE -.55 JSR VDAT - STA .57+1 - JSR VDAT - STA .57+2 -.57 DEC $FFF - RTS -* DEC ITEM COUNTER -.60 JSR GEDGE - JSR PNTOBJ - LDY #4 - LDA (MISC),Y - SEC - SBC #1 - STA (MISC),Y - RTS -* EXECUTE SENTENCE AFTER THIS EXECUTION IS DONE -* WON'T WORK IF OBJ IS SKIPd -.65 LDX #6 -.67 JSR GEDGE - >PHA DOSTK,DOPNT - DEX - BPL .67 -NOK LDY /.1 - LDA #.1 - JMP OMSG DON'T PRINT OK -.1 .AS -/=/ -* VERB,OBJ,PM,DEST,INSTR,PLACE -DOSTK .BS 6*8 -DOPNT .BS 1 -* CHANGE MAP: LOC DIR->LOC -CA1 JSR VDAT - PHA - JSR VDAT - TAY - JSR VDAT - TAX - PLA -* CHANGE MAP:A Y X = LOC DIR->LOC -CHM STA ALOC - TXA - PHA - LDA ALOC - JSR PNTALOC - PLA - STA (TEMP),Y - RTS -* REPLACE EDGE -DOREP JSR GEDGE - PHA - JSR GEDGE - TAX - JSR GEDGE - TAY - PLA - JMP REPEDG -* MAKE EDGE (FOR WHEN AREP WOULD COVER DIFFERENT EDGE, IE OWNING -MAK JSR GEDGE - PHA - JSR GEDGE - PHA - TAX - JSR CLCPNT - PHA - JSR GEDGE - PHA - JSR MAKEDG CAN'T JMP - RTS -* DELETE EDGE -DEL LDX #3 -.1 JSR GEDGE - PHA - DEX - BNE .1 - STX GCALLD FOR GETEDG - TAX DEF Z - BNE DE2 - PLA - PLA - TAX - PLA -* DELETE LAST EDGE A X _ _ -DELAX STA EDGCMP+1 - JSR JG - BCS DE3 NO EDGE - LDA #DE3 - STA MISC RETURN TO .3 FROM DEL EXIT - LDA /DE3 - STA MISC+1 - JMP DELEXT -DE2 JSR DELEDG DON'T JMP SINCE DATA IS ON STACK -DE3 RTS -* SPAWN PLAN -SPW >CRL NXTPLN,#2 USE PNTR FOR ACTOR - LDA #1 - STA SPWD CALLED BY SPAWN -SP1 JSR GEDGE ACTOR - PHA - LDY #$FE - STA (TEMP),Y - JSR GEDGE PLAN# - LDY #$FD GEDGE WIPES Y - STA (TEMP),Y - JSR GEDGE OBJ - LDY #$FC - STA (TEMP),Y - PLA - LDY SPWD - BEQ .4 TRANS WORKS EVEN IF PERSON BUSY -* SPWD HOLDS 1, SO DOES Y -.2 CMP PATBUS,Y - BEQ .5 BUSY - DEY - BPL .2 -.4 JSR PNTOBJ WIPES TEMP - LDY #5 - LDA (MISC),Y - AND #$10 ANIMATE (ALIVE)? - BEQ .5 NO - JSR FNPN FANCY INC NXTPLN - CLC - RTS -.5 LDA NXTPLN PLAN MADE - JSR DELLST - SEC - RTS -SPWD .BS 1 1=SP1 CALLED BY SPAWN -* TRANSFER CONTROL TO NEW PLAN -TRN >CRL NXTPLN,#3 - LDA #0 - STA SPWD CALLED BY TRN - LDY #$FB - LDA CURPLN RETURN TO PLAN# - ORA #$40 WILL BE SUSPENDED - STA (TEMP),Y - JSR SP1 - BCS .5 CHAR DEAD - LDA CURPLN RETURN TO PLAN# - PHA - JSR LL SETS Y - PLA - ORA #$40 SUSPEND CURRENT PLAN - STA EDGETOP,Y -.5 RTS -* KILL CURPLN -ADI LDA CURPLN - PHA - JSR LLL - CMP #3 LEN - BCC .3 SPAWNED; NO PLAN TO REACTIVATE - LDY #$FB - LDA (TEMP),Y PLAN TO REACTIVATE - JSR LL - LDA EDGETOP,Y - AND #%10111111 REACTIVATE - STA EDGETOP,Y -.3 PLA - JMP DELLST -* DELETE ITEM: DELETE ALL EDGES INVOLVING IT -* DELETE ALL ITEMS PART OF IT -* CAN'T DELETE EVERY EDGE WI. OBJ#, -* SINCE OBJ#S ARE ALSO ADJ#S. -DLO LDA CUROBJ - PHA - JSR GEDGE - STA CUROBJ - JSR INLINE - .DA .5,#NULL,#ADEL,#VOBJ,IN,#ADEL,#VOBJ,ON,#ADEL,#VOBJ,PARTOF -.1 .DA #$80,#ISEDG,#VOBJ,#HOLDS,#VX,#$80,#ISEDG,#VOBJ,#PART,#VX,#DELIT,#VX,#GOTO,.1 -.2 .DA #$80,#ISEDG,#VOBJ,#UNDER,#VX,#ADEL,#VX,#ON,#VOBJ,#GOTO,.2,#0 -.5 PLA - STA CUROBJ - RTS -UPS JSR VDAT SCORE #:0-255 -UP2 TAY - LDA #$FF - EOR KSC,Y - BEQ .3 POINTS ALREADY GIVEN - STA KSC,Y MARK AS GIVEN - LDA .7,Y - CLC - ADC SCORE - STA SCORE -.3 RTS -.7 .DA #2,#5,#1,#1,#5,#4,#5,#5,#4,#4,#5,#5,#5,#5,#4,#5,#5,#10,#5,#5 -* SCREAM,GUARD DRINK,BRUSH TEETH,CLIMB SHELF,PUSH PANEL,REMOVE BAR,PHOT MARK,PLAY TAPE2,TYPE "SESAME",REMOVE VENT,READ ID,SHOOT BULB,BURN OUT BATTERY,LEAVE,REMOVE HINGE,PUT SUGAR IN PAIL,KILL PROF,LEAVE WI PROF,OPEN TC,TOWEL -* DESTROY AN OBJECT: DON'T REMOVE FROM ROOM, -* BUT SET & ZERO A BUNCH OF BITS, ADD ADJEC DEAD/BROKEN -* LIQUID SPILLS OUT IF IN IT -DES JSR GEDGE - STA CUROBJ NOTE!! CHANGES VOBJ - JSR INLINE - .DA TRTS,#BITSET+$40,#VOBJ,#$80,0,#SKIP,#$80,#OBJIS,#ME,#AINC,GAMOVR,#$80,#OBJIS,#PROF,#$80,#OBJIS,#INT,#UPSCR,#16,#$80,#BITSET,#VOBJ,0,#$10,#AREP,#VOBJ,#ADJEC,#DEAD,#ELSE,#AREP,#VOBJ,#ADJEC,#BROKEN - .DA #$80,#NULL,#ASBIT,VOBJ,$4000,#AZBIT,#VOBJ,#$FF,#%10110111,%11100110 -* SWITCH OBJ X WITH Y: MAKE Y LIKE X: BROKEN, CONTENTS, ETC, & AREP IT IN LOCATION -SW JSR GEDGE - STA .3+1 - JSR PNTOBJ - LDY #5 -.0 LDA (MISC),Y - STA .8,Y - DEY - BPL .0 - JSR GEDGE - STA .5+1 - JSR PNTOBJ - LDY #5 - LDA (MISC),Y SAVE ONLY Y's NOUN TYPE - AND #6 - STA .9 -.1 LDA .8,Y - STA (MISC),Y - DEY - BPL .1 - LDY #5 - LDA (MISC),Y - AND #%11111001 - ORA .9 - STA (MISC),Y -* REPLACE ALL X WITH Y IN EDGES - LDA #2 - STA .9 COUNTER - LDA #EDGES - LDY /EDGES -.2 STA MISC - STY MISC+1 - LDY #0 -.3 LDA #1 X - CMP (MISC),Y - BNE .6 -.5 LDA #2 Y - STA (MISC),Y REP X WITH Y -.6 JSR IM NOT INY FOR COMPARE TO (VB) - JSR IM - JSR IM - JSR IM - LDA MISC - CMP VB - LDA MISC+1 - SBC VB+1 - BCC .3 (MISC)<(VB) - DEC .9 - BEQ .7 DONE BOTH PASSES - LDA #EDGES+3 2ND PASS, GET OTHER END OF EDGES - LDY /EDGES+3 - BNE .2 -.7 RTS -.8 .BS 6 TEMP STORAGE OF OBJ X ATTRIBUTES -.9 .BS 1 -* UNBIND X -UB LDA #$FF - STA VAR - RTS -* CONVERSATION GOTO: SET DEFAULT STARTING PATTERN FOR CHAR Y TO A -CG JSR GEDGE - TAY - JSR VDAT -CGO2 STA MME+1 COUNTER USED IN FKN - PHA - STY LISNR - JSR FCN - JSR FKN FIND KEY # - JSR INY POINT TO BEG OF PATTERN - TYA - CLC - ADC MISC - BCC .5 - INC MISC+1 -.5 PHA - LDA CHRNUM - TAX - ASL - TAY - PLA - STA KEYSTRT,Y - LDA MISC+1 - STA KEYSTRT+1,Y - PLA - STA RNSTRT,X - LDA #$FF - STA CHRNUM DON'T FALSELY THINK WE'VE LOADED XXX.RPL - RTS -*-------------------------------- -* BIND 1ST UNBOUND VAR -* ONLY CALLED IF AT LEAST 1 VAR IS UNBOUND -BIND LDY VAR - INY - BEQ .1 1ST VAR UNBOUND - LDY #1 BIND 2ND VAR -.1 STA VAR,Y BIND APPROPRIATE VAR - RTS + END OF ARCHIVE