( INDEXER AND VISABLE MONSTER WRITER )                                                                                          SUBR VM-W ( VISABLE MONSTER WRITER )                              VBNOERASE VLOGICSTAT Y BITX, 0=, IF,                            VOPATH Y A LDX, VOPAT Y ORAX, 0<>, IF,                          VERASE CALL, THEN, ( don't erase if no pattern )                ELSE, VBNOERASE VLOGICSTAT Y RESX, THEN,                        VBNOWRITE VLOGICSTAT Y BITX, 0=, IF, INTCPT IN, VWRITE CALL,  INTCPT IN, A ANA, 0<>, IF, 1 A MVI, THEN,                       1 XRI, VPERINX Y CMPX, 0<>, IF, A VPERINX Y STX,                1 VANIMTIMER Y MVIX, 0 VANIMINX Y MVIX, THEN,                     ELSE, VBNOWRITE VLOGICSTAT Y RESX, THEN,                        transition JMP, -->                                                                                                                                                                                                                                           ( USEFULL MONSTER STUFF )                                       ( MONSTER CLASSIFY ROUTINE )                                    BTABLE CLSTB 1 B, 0 B, 0 B, 0 B, 2 B,                           : CLASS? SELF MON#? CLSTB B@ ;                                  HEX                                                             : IMP SELF MON#? MZP @ 4 + + B@                                 DUP 0F AND SWAP SWAN 0F AND ;                                   : SPOTMONS H-P-D DISPF VB!                                      CLASS? IF Src                                                   ELSE IMP THEN                                                   DUP INTC VB! NOWC VB!                                           DUP INTR VB! NOWR VB! ESTPOS ;                                                                                                  DECIMAL -->                                                                                                                                                                                     ( MONSTER VECTOR ROUTINE )                                      ( FREEZE IF PLAYER DEAD OR MAGIC ACTIVE )                       F= Mfz                                                          SUBR MON-VR <ASSEMBLE PSW PUSH, MAFLG LDA, A ANA, Mfz JRNZ,     P-S LDA, PLDOA CPI, 0=, IF,                                     Y PUSHX, H POP, MONV1 D LXI, A ANA, D DSBC,                     Mfz JRNZ, OBJSV Y A LDX, MSSNA CPI, Mfz JRNZ, THEN,             DISTVECT CALL,                                                  OBJSV Y A LDX, MSSNA CPI, LKBUN CZ,                             PSW POP, RET,                                                   LABEL Mfz B PUSH, CALCXY CALL, B POP,                           PSW POP, RET, ASSEMBLE>                                         : MVECT-ON MON-VR CV-ON ;                                       CODE EXX RET, NEXT                                              -->                                                                                                                             ( HOOK ROUTINE TO FUDGE MONSTERS VELOCITY IF IN REVEALED ZONE ) F= Mfs                                                          SUBR MONSPD <ASSEMBLE EXX,                                      NOWD Y C LDX, NOWC Y E LDX, NOWR Y D LDX,                       noder^ CALL, M A MOV, DISTANCE Y 1+ CMPX, Mfs JRNC,             move:node CALL, C A MOV, CMA, 3 ANI, A C MOV, noder^ CALL,      A B MOV, noded^ CALL, M A MOV, B SUB, DISTANCE 1+ Y CMPX,       CY~, IF, LABEL Mfs MSPDS Y E LDX, MSPDS 1+ Y D LDX, ELSE,       MSPDF Y E LDX, MSPDF 1+ Y D LDX, THEN,                          E DELTADIST Y STX, D DELTADIST 1+ Y STX, EXX, RET,              ASSEMBLE> HEX                                                   : MVSET SMARTS B@ 7 MIN 30 * MMSV VB@ MMSCU = IF 80 + THEN      CLASS? 40 * + GA# B@ IF 180 ELSE 100 THEN + DUP MSPDS V!        40 + MSPDF V! MONSPD HOOK!-ON ;                                 DECIMAL -->                                                                                                                     ( SUBROUTINE TO CHECK FOR VALID BANISHMENT POINT )              F= AARF F= NULRET                                               SUBR OKBAN <ASSEMBLE B PUSH,                                    D A MOV, A ANA, AARF JRZ, NROWS 1- CPI, AARF JRZ,               START-ROW CPI, E A MOV, 0=, IF, START-COL CPI,                  AARF JRZ, THEN, A ANA, AARF JRZ, NCOLS 1- CPI, AARF JRZ,        X PUSHX, XCHG, ( HL= COORDS )                                   EXX, PCONFT H LXI, NEARBYLIST CALL, X POPX, AARF JRNZ,          Y PUSHX, MON-LS H LXI, TRC X B LDX, B A MOV, 15 ANI, A C MOV,   B A MOV, RRC, RRC, RRC, RRC, 15 ANI, A B MOV, BEGIN,            M E MOV, H INX, M D MOV, H INX, D A MOV, E ORA, 0<>, WHILE,     D PUSH, Y POPX, OBJSV Y A LDX, MSSNA CPI,                       0=, IF, INTR Y A LDX, B CMP,                                    0=, IF, INTC Y A LDX, C CMP,                                    0=, IF, Y POPX, AARF JMPR, THEN, THEN, THEN, REPEAT,            -->                                                             Y POPX, ( WE PASS ) B INTR Y STX, C INTC Y STX,                 X PUSHX, D POP, E FNDPTR Y STX, D FNDPTR 1+ Y STX,              LABEL AARF B POP, LABEL NULRET RET, ASSEMBLE>                                                                                   ( FIND NEAT PLACE OF BANISHMENT AT LEAST N MOVES AWAY )         : B:M   NULRET FPSS SYNC LAH SYNC                               LAH SYNC GA# B@ 3 > IF LAH SYNC THEN OKBAN TREECK V!            BEGIN SYNC LAH END TRACKPTR V!                                  DIVG COGO ;                                                     -->                                                                                                                                                                                                                                                                                                                                                                                                                                                             ( MORE MONSTER STUFF )                                          ( COMPARE POSITION IN D AND E WITH POSITION IN VECTOR )         SUBR compos D A MOV, NOWR Y CMPX, RNZ,                          E A MOV, NOWC Y CMPX, RET,                                      CODE CHASEPLAYER <ASSEMBLE EXX, X PUSHX, Y PUSHX,               PLYRV X LXIX, vaddr LIYD,                                       NOWR X D LDX, NOWC X E LDX, NOWD X C LDX,                       move:node CALL, movecheck CALL, CY, IF,                         NODMSK C MVI, node^ CALL, NMEXS M BIT, 0<>, IF,                 compos CALL, 0=, IF, ( IF AT PLAYERS DEST, GRAB HIS SOURCE )    NOWR X D LDX, NOWC X E LDX, THEN,                               D INTR Y STX, E INTC Y STX,                                     THEN, THEN, EXX, Y POPX, X POPX, NEXT ASSEMBLE> DECIMAL         : EXV? OBJSV VB@ MSRIP = IF 1535 ELSE 1024 THEN ;               -->                                                                                                                             ( ROUTE MONSTER TO TARGET ) DECIMAL                             : rmon                                                          4 TIMEBMAX!                                                     PMOD VB@ IF FOLLOWTRACK NOWD VB@ <> IF ( REVERSE WANTED )       R:D THEN                                                        EXV? DELTADIST V!                                               BEGIN MVECT-ON                                                  VM-W ZGO DIVG DEST? END ARRIVE:NODE                             THEN                                                            BEGIN ESTPOS                                                    ON:TARGET? NOT IF FOLLOWTRACK NOWD VB!                          DEPART:NODE EXV? DELTADIST V!                                   BEGIN MVECT-ON VM-W ZGO DIVG DEST? END ARRIVE:NODE              0 ELSE 1 THEN END 0 TIMEBMAX! COGO ;                            : RMON ' rmon SETCO ;                                           -->                                                             CODE CLOSE? EXX, B POP, XTIX, Y PUSHX, vaddr LIYD,              0 H LXI,                                                        NOWR Y A LDX, NOWR X SUBX, BABS CALL, C CMP, CY, IF,            NOWC Y A LDX, NOWC X SUBX, BABS CALL, C CMP, CY, IF,            1 H LXI, THEN, THEN,                                            Y POPX, X POPX, H PUSH, EXX, NEXT                               CODE RANMOVE EXX, Y PUSHX,                                      vaddr LIYD, LDAR, 3 ANI, A C MOV,                               NOWR Y D LDX, NOWC Y E LDX,                                     BEGIN, noder^ CALL, M A MOV, A ANA, 0=, WHILE,                  C A MOV, A INR, 3 ANI, A C MOV, REPEAT,                         move:node CALL, E INTC Y STX, D INTR Y STX, Y POPX, EXX, NEXT   -->                                                                                                                                                                                                                                                             ( SPIDERS MOVE ROUTINE )                                        HEX DATA B2DP 00 B, 02 B, 22 B, 23 B, 33 B, 13 B, 11 B, 01 B,   DECIMAL F= Sm0 F= Sm1 F= Sm2 F= Sm3                             CODE SPDMOV <ASSEMBLE EXX, Y PUSHX, X PUSHX, vaddr LIYD,        RMctr Y A LDX, A ANA, Sm0 JRNZ, ( RANDOMLY MOVING )             LDAR, 7 ANI, 3 CPI, Sm0 JRZ, ( RANDOM BREAK )                   ( SPIDER CHASE PLAYER ROUTINE )                                 PLYRV X LXIX, BEARV CALL,                                       A E MOV, 0 D MVI, B2DP H LXI, D DAD,                            LDAR, 1 ANI, M A MOV, 0<>, IF, RRC, RRC, RRC, RRC, THEN,        A B MOV, NOWR Y D LDX, NOWC Y E LDX,                            3 ANI, A C MOV, noded^ CALL, M A MOV, A ANA, Sm3 JRNZ,          B A MOV, RRC, RRC, RRC, RRC, 3 ANI, A C MOV, noded^ CALL,       M A MOV, A ANA, Sm3 JRNZ,                                       LDAR, RRC, RRC, RRC, 3 ANI, 1 ADI, ( SET RANDOM MOVE COUNTER )  -->                                                             ( SPIDERS MOVE ROUTINE )                                        LABEL Sm0 A DCR, A RMctr Y STX,                                 LDAR, 3 ANI, A C MOV, 0 B MVI,                                  NOWR Y D LDX, NOWC Y E LDX,                                     LABEL Sm1 noder^ CALL, M A MOV, A ANA, Sm2 JRZ,                 B A MOV, 5 CPI, Sm3 JRNC,                                       NOWD Y A LDX, CMA, 3 ANI, C CMP, Sm3 JRNZ,                      LABEL Sm2 C A MOV, A INR, 3 ANI, A C MOV, B INR, Sm1 JMPR,      LABEL Sm3 C NOWD Y STX, X POPX, Y POPX, EXX, NEXT ASSEMBLE>     -->                                                                                                                                                                                                                                                                                                                                                                                                                                                             