     2   1    1:D     1 (*$L PRINTER: *)
     3   1    1:D     1 (* "$S++" OPTION BEFORE "$L" *)
     4   1    1:D     1 (*$R-*)
     5   1    1:D     1 (*$I-*)
     6   1    1:D     1 (*$V-*)
     7   1    1:D     1 
     8   1    1:D     1 (*
     9   1    1:D     1   WIZARDRY 3, WIZARDRY.CODE
    10   1    1:D     1   REVERSE ENGINEERED BY:  THOMAS WILLIAM EWERS, 2012
    11   1    1:D     1 *)
    12   1    1:D     1 
    13   1    1:D     1 
    14   1    1:D     1 PROGRAM WIZARDRY;
    15   1    1:D     3 
    16   1    1:D     3   CONST
    17   1    1:D     3         BLOCKSZ = 512;
    18   1    1:D     3         DRIVE1  = 4;
    19   1    1:D     3         CRETURN = 13;
    20   1    1:D     3         
    21   1    1:D     3   TYPE
    22   1    1:D     3         TXGOTO = (XDONE,    XTRAININ, XCASTLE,  XGILGAMS, XINSPECT, XBOLTAC, 
    23   1    1:D     3                   XCANT,    XRUNNER,  XCOMBAT,  XNEWMAZE, XCHK4WIN, XREWARD1, 
    24   1    1:D     3                   XINSPCT2, XEQUIP6,  XEQPDSP,  XREORDER, XCEMETRY, XINSPCT3,
    25   1    1:D     3                   XBCK2CMP, XBCK2ROL, XCMP2EQ6, XUNUSED,  XREWARD2, XSCNMSG,
    26   1    1:D     3                   XCAMPSTF, XEDGTOWN, XINSAREA, XBK2CMP2);
    27   1    1:D     3         
    28   1    1:D     3         TWIZLONG = RECORD
    29   1    1:D     3             LOW  : INTEGER;
    30   1    1:D     3             MID  : INTEGER;
    31   1    1:D     3             HIGH : INTEGER;
    32   1    1:D     3           END;
    33   1    1:D     3                    
    34   1    1:D     3         
    35   1    1:D     3         TRACE = (NORACE, HUMAN, ELF, DWARF, GNOME, HOBBIT);
    36   1    1:D     3         
    37   1    1:D     3         TCLASS = (FIGHTER, MAGE, PRIEST, THIEF,
    38   1    1:D     3                   BISHOP, SAMURAI, LORD, NINJA);
    39   1    1:D     3           
    40   1    1:D     3         TALIGN = (UNALIGN, GOOD, NEUTRAL, EVIL);
    41   1    1:D     3           
    42   1    1:D     3         TSTATUS = (OK, AFRAID, ASLEEP, PLYZE, 
    43   1    1:D     3                    STONED, DEAD, ASHES, LOST);
    44   1    1:D     3         
    45   1    1:D     3         TATTRIB = (STRENGTH, IQ, PIETY, VITALITY, AGILITY, LUCK);
    46   1    1:D     3         
    47   1    1:D     3         TSPELL7G = ARRAY[ 1..7] OF INTEGER;
    48   1    1:D     3         
    49   1    1:D     3         THPREC = RECORD
    50   1    1:D     3             LEVEL   : INTEGER;
    51   1    1:D     3             HPFAC   : INTEGER;
    52   1    1:D     3             HPMINAD : INTEGER;
    53   1    1:D     3           END;
    54   1    1:D     3                  
    55   1    1:D     3         TCHAR = RECORD
    56   1    1:D     3             NAME     : STRING[ 15];
    57   1    1:D     3             PASSWORD : STRING[ 15];
    58   1    1:D     3             INMAZE   : BOOLEAN;
    59   1    1:D     3             RACE     : TRACE;
    60   1    1:D     3             CLASS    : TCLASS;
    61   1    1:D     3             AGE      : INTEGER;
    62   1    1:D     3             STATUS   : TSTATUS;
    63   1    1:D     3             ALIGN    : TALIGN;
    64   1    1:D     3             ATTRIB   : PACKED ARRAY[ STRENGTH..LUCK] OF 0..18;
    65   1    1:D     3             LUCKSKIL : PACKED ARRAY[ 0..4] OF 0..31;
    66   1    1:D     3             GOLD     : TWIZLONG;
    67   1    1:D     3             POSS     : RECORD
    68   1    1:D     3                 POSSCNT : INTEGER;
    69   1    1:D     3                 POSSESS : ARRAY[ 1..8] OF RECORD
    70   1    1:D     3                     EQUIPED : BOOLEAN;
    71   1    1:D     3                     CURSED  : BOOLEAN;
    72   1    1:D     3                     IDENTIF : BOOLEAN;
    73   1    1:D     3                     EQINDEX : INTEGER;
    74   1    1:D     3                   END;
    75   1    1:D     3               END;
    76   1    1:D     3             EXP      : TWIZLONG;
    77   1    1:D     3             MAXLEVAC : INTEGER;
    78   1    1:D     3             CHARLEV  : INTEGER;
    79   1    1:D     3             HPLEFT   : INTEGER;
    80   1    1:D     3             HPMAX    : INTEGER;
    81   1    1:D     3             SPELLSKN : PACKED ARRAY[ 0..49] OF BOOLEAN;
    82   1    1:D     3             MAGESP   : TSPELL7G;
    83   1    1:D     3             PRIESTSP : TSPELL7G;
    84   1    1:D     3             HPCALCMD : INTEGER;
    85   1    1:D     3             ARMORCL  : INTEGER;
    86   1    1:D     3             HEALPTS  : INTEGER;
    87   1    1:D     3             CRITHITM : BOOLEAN;
    88   1    1:D     3             SWINGCNT : INTEGER;
    89   1    1:D     3             HPDAMRC  : THPREC;
    90   1    1:D     3             WEPVSTY2 : PACKED ARRAY[ 0..1, 0..13] OF BOOLEAN;
    91   1    1:D     3             WEPVSTY3 : PACKED ARRAY[ 0..1, 0..6] OF BOOLEAN;
    92   1    1:D     3             WEPVSTYP : PACKED ARRAY[ 0..13] OF BOOLEAN;
    93   1    1:D     3             LOSTXYL  : RECORD CASE INTEGER OF
    94   1    1:D     3                 1:  (LOCATION : ARRAY[ 1..4] OF INTEGER);
    95   1    1:D     3                 2:  (POISNAMT : ARRAY[ 1..4] OF INTEGER);
    96   1    1:D     3                 3:  (AWARDS   : ARRAY[ 1..4] OF INTEGER);
    97   1    1:D     3               END;
    98   1    1:D     3           END;
    99   1    1:D     3               
   100   1    1:D     3         TOBJTYPE = (WEAPON, ARMOR, SHIELD, HELMET, GAUNTLET,
   101   1    1:D     3                     SPECIAL, MISC);
   102   1    1:D     3                           
   103   1    1:D     3         TOBJREC = RECORD
   104   1    1:D     3             NAME     : STRING[ 15];
   105   1    1:D     3             NAMEUNK  : STRING[ 15];
   106   1    1:D     3             OBJTYPE  : TOBJTYPE;
   107   1    1:D     3             ALIGN    : TALIGN;
   108   1    1:D     3             CURSED   : BOOLEAN;
   109   1    1:D     3             SPECIAL  : INTEGER;
   110   1    1:D     3             CHANGETO : INTEGER;
   111   1    1:D     3             CHGCHANC : INTEGER;
   112   1    1:D     3             PRICE    : TWIZLONG;
   113   1    1:D     3             BOLTACXX : INTEGER;
   114   1    1:D     3             SPELLPWR : INTEGER;
   115   1    1:D     3             CLASSUSE : PACKED ARRAY[ TCLASS] OF BOOLEAN;
   116   1    1:D     3             HEALPTS  : INTEGER;
   117   1    1:D     3             WEPVSTY2 : PACKED ARRAY[ 0..15] OF BOOLEAN;
   118   1    1:D     3             WEPVSTY3 : PACKED ARRAY[ 0..15] OF BOOLEAN;
   119   1    1:D     3             ARMORMOD : INTEGER;
   120   1    1:D     3             WEPHITMD : INTEGER;
   121   1    1:D     3             WEPHPDAM : THPREC;
   122   1    1:D     3             XTRASWNG : INTEGER;
   123   1    1:D     3             CRITHITM : BOOLEAN;
   124   1    1:D     3             WEPVSTYP : PACKED ARRAY[ 0..13] OF BOOLEAN;
   125   1    1:D     3           END;
   126   1    1:D     3 
   127   1    1:D     3         TWALL = (OPEN, WALL, DOOR, HIDEDOOR);
   128   1    1:D     3    
   129   1    1:D     3         TSQUARE = (NORMAL, STAIRS, PIT, CHUTE, SPINNER, DARK, TRANSFER,
   130   1    1:D     3                    OUCHY, BUTTONZ, ROCKWATE, FIZZLE, SCNMSG, ENCOUNTE);
   131   1    1:D     3    
   132   1    1:D     3         TMAZE = RECORD
   133   1    1:D     3             W : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF TWALL;
   134   1    1:D     3             S : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF TWALL;
   135   1    1:D     3             E : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF TWALL;
   136   1    1:D     3             N : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF TWALL;
   137   1    1:D     3             
   138   1    1:D     3             FIGHTS : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF 0..1;
   139   1    1:D     3                        
   140   1    1:D     3             SQREXTRA : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF 0..15;
   141   1    1:D     3                        
   142   1    1:D     3             SQRETYPE : PACKED ARRAY[ 0..15] OF TSQUARE;
   143   1    1:D     3             
   144   1    1:D     3             AUX0   : PACKED ARRAY[ 0..15] OF INTEGER;
   145   1    1:D     3             AUX1   : PACKED ARRAY[ 0..15] OF INTEGER;
   146   1    1:D     3             AUX2   : PACKED ARRAY[ 0..15] OF INTEGER;
   147   1    1:D     3                        
   148   1    1:D     3             ENMYCALC : PACKED ARRAY[ 1..3] OF RECORD
   149   1    1:D     3                          MINENEMY : INTEGER;
   150   1    1:D     3                          MULTWORS : INTEGER;
   151   1    1:D     3                          WORSE01  : INTEGER;
   152   1    1:D     3                          RANGE0N  : INTEGER;
   153   1    1:D     3                          PERCWORS : INTEGER;
   154   1    1:D     3                        END;
   155   1    1:D     3           END;
   156   1    1:D     3         
   157   1    1:D     3         TENEMY = RECORD
   158   1    1:D     3             NAMEUNK  : STRING[ 15];
   159   1    1:D     3             NAMEUNKS : STRING[ 15];
   160   1    1:D     3             NAME     : STRING[ 15];
   161   1    1:D     3             NAMES    : STRING[ 15];
   162   1    1:D     3             PIC      : INTEGER;
   163   1    1:D     3             CALC1    : TWIZLONG;
   164   1    1:D     3             HPREC    : THPREC;
   165   1    1:D     3             CLASS    : INTEGER;
   166   1    1:D     3             AC       : INTEGER;
   167   1    1:D     3             RECSN    : INTEGER;
   168   1    1:D     3             RECS     : ARRAY[ 1..7] OF THPREC;
   169   1    1:D     3             EXPAMT   : TWIZLONG;
   170   1    1:D     3             DRAINAMT : INTEGER;
   171   1    1:D     3             HEALPTS  : INTEGER;
   172   1    1:D     3             REWARD1  : INTEGER;
   173   1    1:D     3             REWARD2  : INTEGER;
   174   1    1:D     3             ENMYTEAM : INTEGER;
   175   1    1:D     3             TEAMPERC : INTEGER;
   176   1    1:D     3             MAGSPELS : INTEGER;
   177   1    1:D     3             PRISPELS : INTEGER;
   178   1    1:D     3             UNUSEDXX : INTEGER;
   179   1    1:D     3             BREATHE  : INTEGER;
   180   1    1:D     3             UNAFFCT  : INTEGER;
   181   1    1:D     3             WEPVSTY3 : PACKED ARRAY[ 0..15] OF BOOLEAN;
   182   1    1:D     3             SPPC     : PACKED ARRAY[ 0..15] OF BOOLEAN;
   183   1    1:D     3           END;
   184   1    1:D     3                  
   185   1    1:D     3         TENEMY2 = RECORD
   186   1    1:D     3             A : RECORD
   187   1    1:D     3                     IDENTIFI : BOOLEAN;
   188   1    1:D     3                     ALIVECNT : INTEGER;
   189   1    1:D     3                     ENMYCNT  : INTEGER;
   190   1    1:D     3                     ENEMYID  : INTEGER;
   191   1    1:D     3                     TEMP04   : ARRAY[ 0..8] OF RECORD
   192   1    1:D     3                         VICTIM   : INTEGER;
   193   1    1:D     3                         SPELLHSH : INTEGER;
   194   1    1:D     3                         AGILITY  : INTEGER;
   195   1    1:D     3                         HPLEFT   : INTEGER;
   196   1    1:D     3                         ARMORCL  : INTEGER;
   197   1    1:D     3                         INAUDCNT : INTEGER;
   198   1    1:D     3                         DRAIN2LV : INTEGER;
   199   1    1:D     3                         STATUS   : TSTATUS;
   200   1    1:D     3                       END;
   201   1    1:D     3                   END;
   202   1    1:D     3                 
   203   1    1:D     3             B : TENEMY;
   204   1    1:D     3           END;
   205   1    1:D     3                    
   206   1    1:D     3         TEXP = ARRAY[ FIGHTER..NINJA] OF ARRAY[ 0..12] OF TWIZLONG;
   207   1    1:D     3       
   208   1    1:D     3         TBGSTRNG = STRING[ 255];
   209   1    1:D     3   
   210   1    1:D     3         TMEMORYP = ^TMEMORY;
   211   1    1:D     3         
   212   1    1:D     3         TMEMORY = PACKED RECORD
   213   1    1:D     3             NEXT  : TMEMORYP;
   214   1    1:D     3             SIZE  : 0..32767;
   215   1    1:D     3             INUSE : BOOLEAN;
   216   1    1:D     3           END;
   217   1    1:D     3         
   218   1    1:D     3         TWINDOWP = ^TWINDOW;
   219   1    1:D     3         
   220   1    1:D     3         TMEMOVER = RECORD CASE INTEGER OF
   221   1    1:D     3             1: (I:    INTEGER);
   222   1    1:D     3             2: (PWIN: TWINDOWP);
   223   1    1:D     3             3: (PMEM: TMEMORYP);
   224   1    1:D     3           END;
   225   1    1:D     3 
   226   1    1:D     3         TWINHEAD = PACKED RECORD
   227   1    1:D     3             NEXTW   : TWINDOWP;
   228   1    1:D     3             HPOS    : 0..255;
   229   1    1:D     3             VPOS    : 0..255;
   230   1    1:D     3             HSIZE   : 0..255;
   231   1    1:D     3             VSIZE   : 0..255;
   232   1    1:D     3             HCURSOR : 0..255;
   233   1    1:D     3             VCURSOR : 0..255;
   234   1    1:D     3             PRIORITY: 0..255;
   235   1    1:D     3             TEMP    : 0..255;
   236   1    1:D     3           END;
   237   1    1:D     3         
   238   1    1:D     3         TWINDOW = PACKED RECORD
   239   1    1:D     3             HEAD : TWINHEAD;
   240   1    1:D     3             DATA : PACKED ARRAY[ 0..719] OF CHAR;
   241   1    1:D     3           END;
   242   1    1:D     3         
   243   1    1:D     3         TBCD = ARRAY[ 0..13] OF INTEGER;
   244   1    1:D     3                    
   245   1    1:D     3         TSPEL012 = (GENERIC, PERSON, GROUP);
   246   1    1:D     3         
   247   1    1:D     3         TZSCN = (ZZERO, ZMAZE, ZENEMY, ZREWARD, ZOBJECT,
   248   1    1:D     3                         ZCHAR, ZSPCCHRS, ZEXP);
   249   1    1:D     3                    
   250   1    1:D     3         TSCNTOC = RECORD
   251   1    1:D     3             GAMENAME : STRING[ 40];
   252   1    1:D     3             RECPER2B : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   253   1    1:D     3             RECPERDK : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   254   1    1:D     3             UNUSEDXX : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   255   1    1:D     3             BLOFF    : ARRAY[ ZZERO..ZEXP] OF INTEGER;
   256   1    1:D     3             RACE     : ARRAY[ NORACE..HOBBIT]         OF STRING[ 9];
   257   1    1:D     3             CLASS    : PACKED ARRAY[ FIGHTER..NINJA]  OF STRING[ 9];
   258   1    1:D     3             STATUS   : ARRAY[ OK..LOST]               OF STRING[ 8];
   259   1    1:D     3             ALIGN    : PACKED ARRAY[ UNALIGN..EVIL]   OF STRING[ 9];
   260   1    1:D     3             SPELLHSH : PACKED ARRAY[ 0..50] OF INTEGER;
   261   1    1:D     3             SPELLGRP : PACKED ARRAY[ 0..50] OF 0..7;
   262   1    1:D     3             SPELL012 : PACKED ARRAY[ 0..50] OF TSPEL012;
   263   1    1:D     3           END;
   264   1    1:D     3     
   265   1    1:D     3         TBATRSLT = RECORD
   266   1    1:D     3             ENMYCNT : ARRAY[ 1..4] OF INTEGER;
   267   1    1:D     3             ENMYID  : ARRAY[ 1..4] OF INTEGER;
   268   1    1:D     3             DRAINED : ARRAY[ 0..5] OF BOOLEAN;
   269   1    1:D     3           END;
   270   1    1:D     3           
   271   1    1:D     3   VAR
   272   1    1:D     3        PARTYCNT : INTEGER;
   273   1    1:D     4        BASE04   : INTEGER;
   274   1    1:D     5        DIRECTIO : INTEGER;
   275   1    1:D     6        MAZELEV  : INTEGER;
   276   1    1:D     7        MAZEY    : INTEGER;
   277   1    1:D     8        MAZEX    : INTEGER;
   278   1    1:D     9        INCHAR   : CHAR;
   279   1    1:D    10        CHARACTR : ARRAY[ 0..5] OF TCHAR;
   280   1    1:D   634        
   281   1    1:D   634        CHARSWIN : TWINDOWP;
   282   1    1:D   635        TEMPWIN  : TWINDOWP;
   283   1    1:D   636        CAMPTIT  : TWINDOWP;
   284   1    1:D   637        TRAINTIT : TWINDOWP;
   285   1    1:D   638        CASTTIT  : TWINDOWP;
   286   1    1:D   639        MAINWIN  : TWINDOWP;
   287   1    1:D   640        WINCHAIN : TWINDOWP;
   288   1    1:D   641        CAMPWIN  : TWINDOWP;
   289   1    1:D   642        
   290   1    1:D   642        MEMHEAD  : TMEMORYP;
   291   1    1:D   643        DOGARBMM : BOOLEAN;
   292   1    1:D   644        
   293   1    1:D   644        CACHEBL  : INTEGER;
   294   1    1:D   645        SCNTOCBL : INTEGER;
   295   1    1:D   646        TIMEDLAY : INTEGER;
   296   1    1:D   647        CACHEWRI : BOOLEAN;
   297   1    1:D   648        
   298   1    1:D   648        XGOTO    : TXGOTO;
   299   1    1:D   649        XGOTO2   : TXGOTO;
   300   1    1:D   650        
   301   1    1:D   650        ATTK012  : INTEGER;
   302   1    1:D   651        
   303   1    1:D   651        FIZZLES  : INTEGER;
   304   1    1:D   652        CHSTALRM : INTEGER;
   305   1    1:D   653        IDMONSTR : INTEGER;
   306   1    1:D   654        LIGHT    : INTEGER;
   307   1    1:D   655        ACMOD2   : INTEGER;
   308   1    1:D   656        ENSTRENG : INTEGER;
   309   1    1:D   657        BASE291  : RECORD CASE INTEGER OF
   310   1    1:D   657                     1: (MYSTRENG : INTEGER);
   311   1    1:D   657                     2: (GOTOX    : INTEGER);
   312   1    1:D   657                   END;
   313   1    1:D   658        ENEMYINX : INTEGER;
   314   1    1:D   659        
   315   1    1:D   659        SAVELEV  : INTEGER;
   316   1    1:D   660        SAVEY    : INTEGER;
   317   1    1:D   661        SAVEX    : INTEGER;
   318   1    1:D   662        
   319   1    1:D   662        ENCB4RUN : BOOLEAN;
   320   1    1:D   663        
   321   1    1:D   663        BORBEART : BOOLEAN;
   322   1    1:D   664        BCRYSNEU : BOOLEAN;
   323   1    1:D   665        BCRYSEVI : BOOLEAN;
   324   1    1:D   666        BCRYSGOO : BOOLEAN;
   325   1    1:D   667        BSHIPBOT : BOOLEAN;
   326   1    1:D   668        
   327   1    1:D   668        ORBEARTH : INTEGER;
   328   1    1:D   669        CRYSNEUT : INTEGER;
   329   1    1:D   670        CRYSEVIL : INTEGER;
   330   1    1:D   671        CRYSGOOD : INTEGER;
   331   1    1:D   672        SHIPBOTT : INTEGER;
   332   1    1:D   673        
   333   1    1:D   673        FIGHTMAP : PACKED ARRAY[ 0..19, 0..19] OF BOOLEAN;
   334   1    1:D   713        CHARDISK : ARRAY[ 0..5] OF INTEGER;
   335   1    1:D   719        SCNTOC   : TSCNTOC;
   336   1    1:D   971        IOCACHE  : PACKED ARRAY[ 0..1023] OF CHAR;
   337   1    1:D  1483        BASE5CB  : TMEMOVER; 
   338   1    1:D  1484        INFOWOFF : BOOLEAN;
   339   1    1:D  1485        UNUSEDXX : INTEGER;
   340   1    1:D  1486        BOOTSER  : STRING[ 8];
   341   1    1:D  1491 
   342   1    1:D  1491 
   343   1    1:D  1491 (* ---------- BEGIN FORWARD DECLARATIONS ---------- *)
   344   1    1:D  1491 
   345   1    2:D     1 PROCEDURE PRINTBEL; FORWARD;                   (* P010002 *)
   346   1    2:D     1 
   347   1    3:D     3 FUNCTION GETREC( DATATYPE: TZSCN;              (* P010003 *)
   348   1    3:D     4                  DATAINDX: INTEGER;
   349   1    3:D     5                  DATASIZE: INTEGER) : INTEGER; FORWARD;
   350   1    3:D     6                  
   351   1    4:D     3 FUNCTION GETRECW( DATATYPE: TZSCN;             (* P010004 *)
   352   1    4:D     4                   DATAINDX: INTEGER;
   353   1    4:D     5                   DATASIZE: INTEGER) : INTEGER; FORWARD;
   354   1    4:D     6                   
   355   1    5:D     1 PROCEDURE ADDLONGS( VAR FIRST:  TWIZLONG;      (* P010005 *)
   356   1    5:D     2                     VAR SECOND: TWIZLONG); FORWARD;
   357   1    5:D     3                     
   358   1    6:D     1 PROCEDURE SUBLONGS( VAR FIRST:  TWIZLONG;      (* P010006 *)
   359   1    6:D     2                     VAR SECOND: TWIZLONG); FORWARD;
   360   1    6:D     3                     
   361   1    7:D     1 PROCEDURE BCD2LONG( VAR LONGNUM: TWIZLONG;     (* P010007 *)
   362   1    7:D     2                     VAR BCDNUM:  TBCD); FORWARD;
   363   1    7:D     3                     
   364   1    8:D     1 PROCEDURE LONG2BCD( VAR LONGNUM: TWIZLONG;     (* P010008 *)
   365   1    8:D     2                     VAR BCDNUM:  TBCD); FORWARD;
   366   1    8:D     3                    
   367   1    9:D     1 PROCEDURE MULTLONG( VAR LONGNUM: TWIZLONG;     (* P010009 *)
   368   1    9:D     2                     VAR INTNUM:  INTEGER); FORWARD;
   369   1    9:D     3 
   370   1   10:D     1 PROCEDURE DIVLONG( VAR LONGNUM: TWIZLONG;      (* P01000A *)
   371   1   10:D     2                    VAR INTNUM:  INTEGER); FORWARD;
   372   1   10:D     3 
   373   1   11:D     3 FUNCTION TESTLONG(  FIRST:  TWIZLONG;          (* P01000B *)
   374   1   11:D     4                     SECOND: TWIZLONG) : INTEGER; FORWARD;
   375   1   11:D    11 
   376   1   12:D     1 PROCEDURE PRNTLONG( PRNTWIN: TWINDOWP;         (* P01000C *)
   377   1   12:D     2                     LONGNUM: TWIZLONG); FORWARD;
   378   1   12:D     6                          
   379   1   13:D     1 PROCEDURE GETKEY; FORWARD;                     (* P01000D *)
   380   1   13:D     1 
   381   1   14:D     1 PROCEDURE GETCR; FORWARD;                      (* P01000E *)
   382   1   14:D     1 
   383   1   15:D     1 PROCEDURE CENTSTR( CENTWIN: TWINDOWP;          (* P01000F *)
   384   1   15:D     2                    ASTRING: STRING); FORWARD;
   385   1   15:D    44 
   386   1   16:D     1 PROCEDURE PAUSE1; FORWARD;                     (* P010010 *)
   387   1   16:D     1 
   388   1   17:D     1 PROCEDURE PAUSE2; FORWARD;                     (* P010011 *)
   389   1   17:D     1 
   390   1   18:D     3 FUNCTION GETWIN( HPOS:     INTEGER;            (* P010012 *)
   391   1   18:D     4                  VPOS:     INTEGER;
   392   1   18:D     5                  HSIZE:    INTEGER;
   393   1   18:D     6                  VSIZE:    INTEGER;
   394   1   18:D     7                  PRIORITY: INTEGER;
   395   1   18:D     8                  SHOW:     BOOLEAN) : TWINDOWP; FORWARD;
   396   1   18:D     9 
   397   1   19:D     1 PROCEDURE DELWIN( VAR WIN2DEL: TWINDOWP;       (* P010013 *)
   398   1   19:D     2                       REDRAW:  BOOLEAN); FORWARD;
   399   1   19:D     3 
   400   1   20:D     1 PROCEDURE SETWNPRI( PRIWIN:   TWINDOWP;        (* P010014 *)
   401   1   20:D     2                     PRIORITY: INTEGER;
   402   1   20:D     3                     REDRAW:   BOOLEAN); FORWARD;
   403   1   20:D     4 
   404   1   21:D     1 PROCEDURE MVCURSOR( MVWIN: TWINDOWP;           (* P010015 *)
   405   1   21:D     2                     HPOS:  INTEGER;
   406   1   21:D     3                     VPOS:  INTEGER); FORWARD;
   407   1   21:D     4                     
   408   1   22:D     1 PROCEDURE PRINTCHR( PRWIN: TWINDOWP;           (* P010016 *)
   409   1   22:D     2                     ACHAR: CHAR); FORWARD;
   410   1   22:D     3                    
   411   1   23:D     1 PROCEDURE PRINTSTR( PRWIN:   TWINDOWP;         (* P010017 *)
   412   1   23:D     2                     ASTRING: STRING); FORWARD;
   413   1   23:D    44                    
   414   1   24:D     1 PROCEDURE PRINTNUM( PRWIN:   TWINDOWP;         (* P010018 *)
   415   1   24:D     2                     ANUM:    INTEGER;
   416   1   24:D     3                     FIELDSZ: INTEGER); FORWARD;
   417   1   24:D     4 
   418   1   25:D     1 PROCEDURE PRINTCR( PRWIN: TWINDOWP); FORWARD;  (* P010019 *)
   419   1   25:D     2 
   420   1   26:D     1 PROCEDURE CLEARWIN( CLRWIN: TWINDOWP;          (* P01001A *)
   421   1   26:D     2                     REDRAW: BOOLEAN); FORWARD;
   422   1   26:D     3 
   423   1   27:D     1 PROCEDURE CLRRECT( CLRWIN: TWINDOWP;           (* P01001B *)
   424   1   27:D     2                    HOR1:   INTEGER;
   425   1   27:D     3                    VER1:   INTEGER;
   426   1   27:D     4                    HOR2:   INTEGER;
   427   1   27:D     5                    VER2:   INTEGER); FORWARD;
   428   1   27:D     6 
   429   1   28:D     1 PROCEDURE PROTWIN( PROTWIN: TWINDOWP;          (* P01001C *)
   430   1   28:D     2                    REDRAW:  BOOLEAN); FORWARD;
   431   1   28:D     3                    
   432   1   29:D     1 PROCEDURE UNPROWIN( UNPROWIN: TWINDOWP;        (* P01001D *)
   433   1   29:D     2                     REDRAW:   BOOLEAN); FORWARD;
   434   1   29:D     3 
   435   1   30:D     1 PROCEDURE RINGBELL; FORWARD;                   (* P01001E *)
   436   1   30:D     1 
   437   1   31:D     1 PROCEDURE GETSTR(     GSWIN:   TWINDOWP;       (* P01001F *)
   438   1   31:D     2                   VAR ASTRING: STRING;
   439   1   31:D     3                       STRLEN:  INTEGER); FORWARD;
   440   1   31:D     4 
   441   1   32:D     3 FUNCTION MENU( MENUWIN: TWINDOWP;              (* P010020 *)
   442   1   32:D     4                MENUSTR: TBGSTRNG) : INTEGER; FORWARD;
   443   1   32:D   133 
   444   1   33:D     3 FUNCTION GETMEM( MEMSIZE: INTEGER              (* P010021 *)
   445   1   33:D     3                                 ) : INTEGER; FORWARD;
   446   1   33:D     4 
   447   1   34:D     1 PROCEDURE GARBMEM; FORWARD;                    (* P010022 *)
   448   1   34:D     1 
   449   1   35:D     1 PROCEDURE RELMEM( RELWIN: TWINDOWP); FORWARD;  (* P010023 *)
   450   1   35:D     2 
   451   1   35:D     2 (* ---------- END FORWARD DECLARATIONS ---------- *)
   452   1   35:D     2 
   453   1   35:D     2 (* ---------- BEGIN EXTERNALS ------------------- *)
   454   1   35:D     2 
   455   1   36:D     1 PROCEDURE PRPICCH( PICWIN: TWINDOWP;             (* P010024 *)
   456   1   36:D     2                    PICCH:  CHAR  ); EXTERNAL;
   457   1   36:D     3 
   458   1   37:D     1 PROCEDURE DRAWSCR( DRAWWIN: TWINDOWP); EXTERNAL; (* P010025 *)
   459   1   37:D     2 
   460   1   38:D     1 PROCEDURE DRAWLINE( DRAWWIN: TWINDOWP;           (* P010026 *)
   461   1   38:D     2                     MINDR:   INTEGER;
   462   1   38:D     3                     MAXDR:   INTEGER;
   463   1   38:D     4                     HORST:   INTEGER;
   464   1   38:D     5                     LINST:   INTEGER;
   465   1   38:D     6                     HOR:     INTEGER;
   466   1   38:D     7                     VER:     INTEGER;
   467   1   38:D     8                     LEN:     INTEGER;
   468   1   38:D     9                     STOR:    INTEGER); EXTERNAL;
   469   1   38:D    10 
   470   1   39:D     3 FUNCTION RANDOM : INTEGER; EXTERNAL;             (* P010027 *)
   471   1   39:D     3 
   472   1   40:D     3 FUNCTION CHKKEYBD : BOOLEAN; EXTERNAL;           (* P010028 *)
   473   1   40:D     3 
   474   1   40:D     3 
   475   1   40:D     3 (* SCRNDATA (P010030) FOLLOWS THE 'SEGMENTS' *)
   476   1   40:D     3 
   477   1   40:D     3 
   478   1   40:D     3 (* ---------- END EXTERNALS --------------------- *)
   479   1   40:D     3 
   480   1   40:D     3 (* ---------- BEGIN SEGMENTS -------------------- *)
   481   1   40:D     3 
   481   1   40:D     3 (*$I WIZ3C:UTILITIE  *)
   482   1   40:D     3 
   483   7    1:D     1 SEGMENT PROCEDURE UTILITIE;  (* P010101 *)
   484   7    1:D     1 
   485   7    1:D     1   VAR
   486   7    1:D     1        PARTYXXX : INTEGER;
   487   7    1:D     2        SAVECAST : INTEGER;
   488   7    1:D     3        EQUIPALL : BOOLEAN;
   489   7    1:D     4 
   490   7    1:D     4 
   491   7    2:D     1   PROCEDURE MALOR;    (* P010102 *)
   492   7    2:D     1   
   493   7    2:D     1     VAR
   494   7    2:D     1          DELTAUD  : INTEGER;
   495   7    2:D     2          DELTANS  : INTEGER;
   496   7    2:D     3          DELTAEW  : INTEGER;
   497   7    2:D     4          NSEWUD   : INTEGER;
   498   7    2:D     5          MALORWIN : TWINDOWP;
   499   7    2:D     6   
   500   7    2:D     6   
   501   7    3:D     1     PROCEDURE TELEPORT;  (* P010103 *)
   502   7    3:D     1     
   503   7    4:D     1       PROCEDURE ROCK;  (* P010104 *)
   504   7    4:D     1       
   505   7    4:D     1         VAR
   506   7    4:D     1              X : INTEGER;
   507   7    4:D     2       
   508   7    4:0     0         BEGIN
   509   7    4:1     0           CENTSTR( TEMPWIN, 'YOU TELEPORTED INTO ROCK!');
   510   7    4:1    34           FOR X := 0 TO PARTYCNT - 1 DO
   511   7    4:2    47             BEGIN
   512   7    4:3    47               CHARACTR[ X].INMAZE := FALSE;
   513   7    4:3    56               CHARACTR[ X].STATUS := LOST
   514   7    4:2    63             END;
   515   7    4:1    72           DELWIN( TEMPWIN, FALSE);
   516   7    4:1    79           XGOTO := XCEMETRY;
   517   7    4:1    83           EXIT( UTILITIE)
   518   7    4:0    87         END;
   519   7    4:0   102               
   520   7    4:0   102         
   521   7    5:D     1       PROCEDURE VOLCANO;  (* P010105 *)
   522   7    5:D     1       
   523   7    5:D     1         VAR
   524   7    5:D     1              X : INTEGER;
   525   7    5:D     2       
   526   7    5:0     0         BEGIN
   527   7    5:1     0           CENTSTR( TEMPWIN, 'YOU MATERIALIZED IN MID-AIR ABOVE');
   528   7    5:1    42           CENTSTR( TEMPWIN, 'THE MOUTH OF THE VOLCANO AND FELL');
   529   7    5:1    84           CENTSTR( TEMPWIN, 'TO YOUR DEATH IN THE MOLTEN LAVA!');
   530   7    5:1   126           FOR X := 0 TO PARTYCNT - 1 DO
   531   7    5:2   139             CHARACTR[ X].STATUS := LOST;
   532   7    5:1   155           DELWIN( TEMPWIN, FALSE);
   533   7    5:1   162           MAZELEV := 0;
   534   7    5:1   165           XGOTO := XCHK4WIN;
   535   7    5:1   169           EXIT( UTILITIE)
   536   7    5:0   173         END;
   537   7    5:0   188         
   538   7    5:0   188         
   539   7    6:D     1       PROCEDURE MOAT;   (* P010106 *)
   540   7    6:D     1       
   541   7    6:D     1         VAR
   542   7    6:D     1              X : INTEGER;
   543   7    6:D     2       
   544   7    6:0     0         BEGIN
   545   7    6:1     0           CENTSTR( TEMPWIN, 'YOU APPEARED IN THE CASTLE MOAT AND');
   546   7    6:1    44           CENTSTR( TEMPWIN, 'PROBABLY DROWNED!');
   547   7    6:1    70           FOR X := 0 TO PARTYCNT - 1 DO
   548   7    6:2    83             IF CHARACTR[ X].STATUS < DEAD THEN
   549   7    6:3    94               IF (RANDOM MOD 25) > CHARACTR[ X].ATTRIB[ AGILITY] THEN
   550   7    6:4   116                 CHARACTR[ X].STATUS := DEAD;
   551   7    6:1   132           DELWIN( TEMPWIN, FALSE);
   552   7    6:1   139           MAZELEV := 0;
   553   7    6:1   142           XGOTO := XCHK4WIN;
   554   7    6:1   146           EXIT( UTILITIE)
   555   7    6:0   150         END;
   556   7    6:0   164     
   557   7    6:0   164     
   558   7    7:D     1       PROCEDURE TOSHOPS;  (* P010107 *)
   559   7    7:D     1       
   560   7    7:0     0         BEGIN
   561   7    7:1     0           DELWIN( TEMPWIN, TRUE);
   562   7    7:1     7           XGOTO := XCHK4WIN;
   563   7    7:1    11           EXIT( UTILITIE)
   564   7    7:0    15         END;
   565   7    7:0    28     
   566   7    7:0    28     
   567   7    8:D     1       PROCEDURE BOUNCE;  (* P010108 *)
   568   7    8:D     1       
   569   7    8:0     0         BEGIN
   570   7    8:1     0           CENTSTR( TEMPWIN, 'YOU BOUNCED BACK TO WHERE YOU WERE!');
   571   7    8:1    44           DELWIN( TEMPWIN, TRUE);
   572   7    8:1    51           EXIT( UTILITIE)
   573   7    8:0    55         END;
   574   7    8:0    68     
   575   7    8:0    68     
   576   7    3:0     0       BEGIN (* TELEPORT *)
   577   7    3:1     0         DELWIN( MALORWIN, FALSE);
   578   7    3:1     7         DELWIN( CAMPWIN, FALSE);
   579   7    3:1    14         DELWIN( CAMPTIT, FALSE);
   580   7    3:1    21         CLEARWIN( TEMPWIN, TRUE);
   581   7    3:1    28         XGOTO := XNEWMAZE;
   582   7    3:1    32         IF MAZELEV + DELTAUD = SCNTOC.RECPERDK[ ZMAZE] THEN
   583   7    3:2    47           BOUNCE;
   584   7    3:1    49         MAZEX := MAZEX + DELTAEW;
   585   7    3:1    56         MAZEY := MAZEY + DELTANS;
   586   7    3:1    63         MAZELEV := MAZELEV + DELTAUD;
   587   7    3:1    70         IF ( (MAZEX < 0) OR (MAZEX > 19) OR
   588   7    3:1    77              (MAZEY < 0) OR (MAZEY > 19) OR
   589   7    3:1    85              (MAZELEV > SCNTOC.RECPERDK[ ZMAZE]))
   590   7    3:1    95            AND
   591   7    3:1    95            (MAZELEV > 0) THEN
   592   7    3:1   101            
   593   7    3:2   101           IF MAZELEV > SCNTOC.RECPERDK[ ZMAZE] + 4 THEN
   594   7    3:3   114             VOLCANO
   595   7    3:2   114           ELSE
   596   7    3:3   118             ROCK
   597   7    3:1   118         ELSE
   598   7    3:2   122           BEGIN
   599   7    3:3   122             IF MAZELEV < 0 THEN
   600   7    3:4   127               ROCK
   601   7    3:3   127             ELSE
   602   7    3:4   131               IF MAZELEV = 0 THEN
   603   7    3:5   136                 IF (MAZEX = 0) AND (MAZEY = 0) THEN
   604   7    3:6   145                   TOSHOPS
   605   7    3:5   145                 ELSE
   606   7    3:6   149                   MOAT
   607   7    3:2   149           END;
   608   7    3:1   151         DELWIN( TEMPWIN, TRUE);
   609   7    3:1   158         EXIT( UTILITIE)
   610   7    3:0   162       END;
   611   7    3:0   174   
   612   7    3:0   174   
   613   7    2:0     0     BEGIN (* MALOR *)
   614   7    2:1     0       SAVECAST := BASE04;
   615   7    2:1     4       TEMPWIN := GETWIN( 0, 7, 40, 6, 16, TRUE);
   616   7    2:1    18       CENTSTR( TEMPWIN, 'PARTY TELEPORT:');
   617   7    2:1    42       PRINTCR( TEMPWIN);
   618   7    2:1    48       PRINTSTR( TEMPWIN, ' EAST =    0  NORTH =    0  UP =    0');
   619   7    2:1    94       MALORWIN := GETWIN( 5, 12, 12, 10, 17, TRUE);
   620   7    2:1   107       DELTAEW := 0;
   621   7    2:1   110       DELTANS := 0;
   622   7    2:1   113       DELTAUD := 0;
   623   7    2:1   116       REPEAT
   624   7    2:2   116         MVCURSOR( TEMPWIN, 8, 2);
   625   7    2:2   124         PRINTNUM( TEMPWIN, DELTAEW, 4);
   626   7    2:2   132         MVCURSOR( TEMPWIN, 22, 2);
   627   7    2:2   140         PRINTNUM( TEMPWIN, DELTANS, 4);
   628   7    2:2   148         MVCURSOR( TEMPWIN, 33, 2);
   629   7    2:2   156         PRINTNUM( TEMPWIN, DELTAUD, 4);
   630   7    2:2   164         MVCURSOR( MALORWIN, 0, 0);
   631   7    2:2   170         NSEWUD := MENU( MALORWIN,
   632   7    2:2   171                     'E)AST/W)EST/N)ORTH/S)OUTH/U)P/D)OWN/T)ELEPORT/Q)UIT');
   633   7    2:2   232         CASE NSEWUD OF
   634   7    2:2   235            2: DELTANS := DELTANS + 1;
   635   7    2:2   242            3: DELTANS := DELTANS - 1;
   636   7    2:2   249            0: DELTAEW := DELTAEW + 1;
   637   7    2:2   256            1: DELTAEW := DELTAEW - 1;
   638   7    2:2   263            5: DELTAUD := DELTAUD - 1;
   639   7    2:2   270            4: DELTAUD := DELTAUD + 1;
   640   7    2:2   277            6: TELEPORT;
   641   7    2:2   281         END
   642   7    2:1   302       UNTIL NSEWUD > 5;
   643   7    2:1   307       DELWIN( MALORWIN, FALSE);
   644   7    2:1   313       DELWIN( TEMPWIN, TRUE);
   645   7    2:1   320       XGOTO := XBK2CMP2;
   646   7    2:1   324       BASE04 := SAVECAST;
   647   7    2:1   329       EXIT( UTILITIE)
   648   7    2:0   333     END;
   649   7    2:0   348     
   650   7    2:0   348     
   651   7    9:D     1   PROCEDURE NEWMAZE;  (* P010109 *)
   652   7    9:D     1   
   653   7    9:D     1     VAR
   654   7    9:D     1          UNUSEDXX : INTEGER;
   655   7    9:D     2          UNUSEDYY : INTEGER;
   656   7    9:D     3          UNUDEDZZ : INTEGER;
   657   7    9:D     4          DONE     : BOOLEAN;
   658   7    9:D     5          NEWMZWIN : TWINDOWP;
   659   7    9:D     6          FIGHTAAA : PACKED ARRAY[ 0..19, 0..19] OF BOOLEAN;
   660   7    9:D    46          MAZEMAP  : TMAZE;
   661   7    9:D   493          
   662   7    9:D   493   
   663   7   10:D     1     PROCEDURE FIGHTS;  (* P01010A *)
   664   7   10:D     1     
   665   7   10:D     1       VAR
   666   7   10:D     1            FIGHTY : INTEGER;
   667   7   10:D     2            FIGHTX : INTEGER;
   668   7   10:D     3            Y      : INTEGER;
   669   7   10:D     4            X      : INTEGER;
   670   7   10:D     5     
   671   7   10:D     5     
   672   7   11:D     1       PROCEDURE FINDSPOT;  (* P01010B *)
   673   7   11:D     1       
   674   7   11:D     1         VAR
   675   7   11:D     1             Y1 : INTEGER;
   676   7   11:D     2             X1 : INTEGER;
   677   7   11:D     3       
   678   7   11:0     0         BEGIN (* FINDSPOT *)
   679   7   11:1     0           X1 := RANDOM MOD 20;
   680   7   11:1     9           Y1 := RANDOM MOD 20;
   681   7   11:1    18           FIGHTX := X1;
   682   7   11:1    22           FIGHTY := Y1;
   683   7   11:1    26           REPEAT
   684   7   11:2    26             IF MAZEMAP.FIGHTS[ FIGHTX][ FIGHTY] = 1 THEN
   685   7   11:3    46               IF NOT (FIGHTAAA[ FIGHTX][ FIGHTY]) THEN
   686   7   11:4    64                 BEGIN
   687   7   11:5    64                   FIGHTAAA[ FIGHTX][ FIGHTY] := TRUE;
   688   7   11:5    80                   DONE := FALSE;
   689   7   11:5    84                   EXIT( FINDSPOT)
   690   7   11:4    88                 END;
   691   7   11:2    88             FIGHTX := FIGHTX + 1;
   692   7   11:2    96             IF FIGHTX > 19 THEN
   693   7   11:3   103               BEGIN
   694   7   11:4   103                 FIGHTX := 0;
   695   7   11:4   107                 FIGHTY := FIGHTY + 1;
   696   7   11:4   115                 IF FIGHTY > 19 THEN
   697   7   11:5   122                   FIGHTY := 0
   698   7   11:3   122               END;
   699   7   11:1   126           UNTIL (FIGHTX = X1) AND (FIGHTY = Y1);
   700   7   11:1   139           DONE := TRUE;
   701   7   11:0   143         END;   (* FINDSPOT *)
   702   7   11:0   158         
   703   7   11:0   158         
   704   7   12:D     1       PROCEDURE FILLROOM;  (* P01010C *)
   705   7   12:D     1         
   706   7   12:D     1         VAR
   707   7   12:D     1              Y    : INTEGER;
   708   7   12:D     2              X    : INTEGER;
   709   7   12:D     3       
   710   7   13:D     1         PROCEDURE CHECKLOC( NEWX     : INTEGER;   (* P01010D *)
   711   7   13:D     2                             NEWY     : INTEGER;
   712   7   13:D     3                             WALLDOOR : TWALL);
   713   7   13:D     4         
   714   7   13:0     0           BEGIN (* CHECKLOC *)
   715   7   13:1     0             IF WALLDOOR <> OPEN THEN
   716   7   13:2     5               EXIT( CHECKLOC);
   717   7   13:1     9             NEWX := (NEWX + 20) MOD 20;
   718   7   13:1    16             NEWY := (NEWY + 20) MOD 20;
   719   7   13:1    23             IF (MAZEMAP.FIGHTS[ NEWX][ NEWY] <> 1) OR
   720   7   13:1    37                (FIGHTAAA[ NEWX][ NEWY]) THEN
   721   7   13:2    51               EXIT( CHECKLOC);
   722   7   13:1    55             DONE := FALSE;
   723   7   13:1    59             FIGHTAAA[ NEWX][ NEWY] := TRUE;
   724   7   13:0    71           END;  (* CHECKLOC *)
   725   7   13:0    84           
   726   7   13:0    84           
   727   7   12:0     0         BEGIN  (* FILLROOM *)
   728   7   12:1     0           FILLCHAR( FIGHTMAP, 80, 0);
   729   7   12:1     8           REPEAT
   730   7   12:2     8             DONE := TRUE;
   731   7   12:2    12             FOR X := 0 TO 19 DO
   732   7   12:3    23               FOR Y := 0 TO 19 DO
   733   7   12:4    34                 IF FIGHTAAA[ X][ Y] THEN
   734   7   12:5    47                   IF NOT (FIGHTMAP[ X][ Y]) THEN
   735   7   12:6    61                     BEGIN
   736   7   12:7    61                       CHECKLOC( X + 1,
   737   7   12:7    64                                 Y,
   738   7   12:7    65                                 MAZEMAP.E[ X][ Y]);
   739   7   12:7    79                       CHECKLOC( X - 1,
   740   7   12:7    82                                 Y,
   741   7   12:7    83                                 MAZEMAP.W[ X][ Y]);
   742   7   12:7    96                       CHECKLOC( X,
   743   7   12:7    97                                 Y - 1,
   744   7   12:7   100                                 MAZEMAP.S[ X][ Y]);
   745   7   12:7   113                       CHECKLOC( X,
   746   7   12:7   114                                 Y + 1,
   747   7   12:7   117                                 MAZEMAP.N[ X][ Y]);
   748   7   12:7   131                       FIGHTMAP[ X][ Y] := TRUE
   749   7   12:6   141                     END
   750   7   12:1   143           UNTIL DONE;
   751   7   12:0   162         END;   (* FILLROOM *)
   752   7   12:0   182     
   753   7   12:0   182     
   754   7   10:0     0       BEGIN (* FIGHTS *)
   755   7   10:1     0         FIZZLES := 0;
   756   7   10:1     4         FILLCHAR( FIGHTAAA, 80, 0);
   757   7   10:1    12         NEWMZWIN := GETWIN( 14, 8, 12, 3, 15, TRUE);
   758   7   10:1    26         PRINTSTR( NEWMZWIN, 'ONE MOMENT');
   759   7   10:1    45         DELWIN( NEWMZWIN, FALSE);
   760   7   10:1    52         FOR X := 1 TO 19 DO
   761   7   10:2    63           IF NOT DONE THEN
   762   7   10:3    69             FINDSPOT;
   763   7   10:1    78         FOR X := 0 TO 19 DO
   764   7   10:2    89           FOR Y := 0 TO 19 DO
   765   7   10:3   100             IF MAZEMAP.SQRETYPE[ MAZEMAP.SQREXTRA[ X][ Y]] = ENCOUNTE THEN
   766   7   10:4   124               FIGHTAAA[ X][ Y] := TRUE;
   767   7   10:1   150         FILLROOM
   768   7   10:0   150       END;  (* FIGHTS *)
   769   7   10:0   170   
   770   7   10:0   170   
   771   7   14:D     1     PROCEDURE TOSHOPS;  (* P01010E *)
   772   7   14:D     1     
   773   7   14:0     0       BEGIN
   774   7   14:1     0         XGOTO := XCHK4WIN;
   775   7   14:1     4         EXIT( UTILITIE)
   776   7   14:0     8       END;
   777   7   14:0    20       
   778   7   14:0    20       
   779   7   15:D     1     PROCEDURE CHSERIAL;  (* P01010F *)
   780   7   15:D     1     
   781   7   15:D     1       TYPE
   782   7   15:D     1            BYTE = PACKED ARRAY[ 0..1] OF CHAR;
   783   7   15:D     1            
   784   7   15:D     1            MAGIC = RECORD CASE BOOLEAN OF
   785   7   15:D     1                      FALSE : (I : INTEGER);
   786   7   15:D     1                      TRUE  : (P : ^BYTE);
   787   7   15:D     1                    END;
   788   7   15:D     1     
   789   7   15:D     1       VAR
   790   7   15:D     1            SERNUM : STRING[ 8];
   791   7   15:D     6            X      : INTEGER;
   792   7   15:D     7            SL7SCR : MAGIC;
   793   7   15:D     8            
   794   7   15:0     0       BEGIN
   795   7   15:1     0         IF MAZELEV < 2 THEN
   796   7   15:2     5           EXIT ( CHSERIAL);
   797   7   15:1     9         SL7SCR.I := 4 * 256 + 7 * 16 + 15;  (* $47F *)
   798   7   15:1    22         FOR X := 0 TO 7 DO
   799   7   15:2    33           BEGIN
   800   7   15:3    33             SERNUM[ X] := SL7SCR.P^[0];
   801   7   15:3    40             SL7SCR.I := SL7SCR.I + 128
   802   7   15:2    41           END;
   803   7   15:1    54         IF BOOTSER = SERNUM THEN
   804   7   15:2    63           EXIT( CHSERIAL);
   805   7   15:1    67         NEWMZWIN := GETWIN( 0, 7, 40, 4, 16, TRUE);
   806   7   15:1    81         CENTSTR( NEWMZWIN, 'ONLY THE RIGHTEOUS MAY ASCEND!');
   807   7   15:1   120         CENTSTR( NEWMZWIN, 'BEGONE, YOU UNHOLY DEFILER!!');
   808   7   15:1   157         DELWIN( NEWMZWIN, FALSE);
   809   7   15:1   164         TOSHOPS
   810   7   15:0   164       END;
   811   7   15:0   180       
   812   7   15:0   180       
   813   7   16:D     1     PROCEDURE CHALIGN;  (* P010110 *)
   814   7   16:D     1     
   815   7   16:D     1       VAR
   816   7   16:D     1            ALIGNMNT : TALIGN;
   817   7   16:D     2     
   818   7   17:D     1       PROCEDURE BEGONE;  (* P010111 *)
   819   7   17:D     1       
   820   7   17:0     0         BEGIN
   821   7   17:1     0           NEWMZWIN := GETWIN( 0, 7, 40, 4, 16, TRUE);
   822   7   17:1    14           CENTSTR( NEWMZWIN, 'YOU ARE FORBIDDEN TO ENTER HERE!');
   823   7   17:1    55           CENTSTR( NEWMZWIN, 'BEGONE!!');
   824   7   17:1    72           DELWIN( NEWMZWIN, FALSE);
   825   7   17:1    79           TOSHOPS
   826   7   17:0    79         END;
   827   7   17:0    94         
   828   7   17:0    94         
   829   7   16:0     0       BEGIN
   830   7   16:1     0         ALIGNMNT := NEUTRAL;
   831   7   16:1     3         FOR BASE04 := 0 TO PARTYCNT - 1 DO
   832   7   16:2    16           IF CHARACTR[ BASE04].ALIGN <> NEUTRAL THEN
   833   7   16:3    27             ALIGNMNT := CHARACTR[ BASE04].ALIGN;
   834   7   16:1    43         CASE MAZELEV OF
   835   7   16:1    46           3, 5 :
   836   7   16:2    46                  IF ALIGNMNT = GOOD THEN
   837   7   16:3    51                    BEGONE;
   838   7   16:1    55           2, 4 : IF ALIGNMNT = EVIL THEN
   839   7   16:3    60                    BEGONE;
   840   7   16:1    64              6 : IF (ALIGNMNT = NEUTRAL) OR
   841   7   16:2    67                     NOT (BCRYSGOO OR BCRYSNEU OR BCRYSEVI OR BORBEART) THEN
   842   7   16:3    86                    BEGONE
   843   7   16:1    86         END
   844   7   16:0   108       END;
   845   7   16:0   122       
   846   7   16:0   122       
   847   7   18:D     1     PROCEDURE PARTY5SP;  (* P010112 *)
   848   7   18:D     1     
   849   7   18:D     1       VAR
   850   7   18:D     1            EQINDEX  : INTEGER;
   851   7   18:D     2            POSSI    : INTEGER;
   852   7   18:D     3            PARTYI   : INTEGER;
   853   7   18:D     4     
   854   7   18:0     0       BEGIN
   855   7   18:1     0         BORBEART := FALSE;
   856   7   18:1     4         BCRYSGOO := FALSE;
   857   7   18:1     8         BCRYSEVI := FALSE;
   858   7   18:1    12         BCRYSNEU := FALSE;
   859   7   18:1    16         BSHIPBOT := FALSE;
   860   7   18:1    20         FOR PARTYI := 0 TO PARTYCNT - 1 DO
   861   7   18:2    33           FOR POSSI := 1 TO CHARACTR[ PARTYI].POSS.POSSCNT DO
   862   7   18:3    50             BEGIN
   863   7   18:4    50               EQINDEX := CHARACTR[ PARTYI].POSS.POSSESS[ POSSI].EQINDEX;
   864   7   18:4    65               BORBEART := BORBEART OR (EQINDEX = ORBEARTH);
   865   7   18:4    77               BCRYSGOO := BCRYSGOO OR (EQINDEX = CRYSGOOD);
   866   7   18:4    89               BCRYSEVI := BCRYSEVI OR (EQINDEX = CRYSEVIL);
   867   7   18:4   101               BCRYSNEU := BCRYSNEU OR (EQINDEX = CRYSNEUT);
   868   7   18:4   113               BSHIPBOT := BSHIPBOT OR (EQINDEX = SHIPBOTT)
   869   7   18:3   121             END
   870   7   18:0   125       END;
   871   7   18:0   156       
   872   7   18:0   156       
   873   7    9:0     0     BEGIN (* NEWMAZE *)
   874   7    9:1     0       CHSERIAL;
   875   7    9:1     2       IF MAZELEV = 0 THEN
   876   7    9:2     7         TOSHOPS;
   877   7    9:1     9       PARTY5SP;
   878   7    9:1    11       IF MAZELEV < 0 THEN
   879   7    9:2    16         BEGIN
   880   7    9:3    16           MAZELEV := 1;
   881   7    9:3    19           XGOTO := XEQUIP6
   882   7    9:2    19         END
   883   7    9:1    23       ELSE
   884   7    9:2    25         BEGIN
   885   7    9:3    25           CHALIGN;
   886   7    9:3    27           XGOTO := XRUNNER
   887   7    9:2    27         END;
   888   7    9:1    31       MOVELEFT( IOCACHE[ GETREC( ZMAZE, MAZELEV - 1, SIZEOF( TMAZE))],
   889   7    9:1    46                 MAZEMAP,
   890   7    9:1    49                 SIZEOF( TMAZE));
   891   7    9:1    54       FIGHTS;
   892   7    9:1    56       EXIT( UTILITIE)
   893   7    9:0    60     END;  (* NEWMAZE *)
   894   7    9:0    72     
   895   7    9:0    72 (*$I WIZ3C:UTILITIE  *)
   895   7    9:0    72 (*$I WIZ3B:UTILITIE2 *)
   896   7   19:D     1   PROCEDURE EQUIPCHR( CHARI : INTEGER);  (* P010113 *)
   897   7   19:D     2     
   898   7   19:D     2     VAR
   899   7   19:D     2          UNUSEDXX : INTEGER;
   900   7   19:D     3          UNARMED  : BOOLEAN;
   901   7   19:D     4          UNUSEDYY : INTEGER;
   902   7   19:D     5          TEMPX    : INTEGER; (* MULTIPLE USES *)
   903   7   19:D     6          POSSI    : INTEGER;
   904   7   19:D     7          POSSCNT  : INTEGER;
   905   7   19:D     8          CANUSE   : ARRAY[ TOBJTYPE] OF BOOLEAN;
   906   7   19:D    15          LUCKI    : INTEGER;
   907   7   19:D    16          OBJI     : TOBJTYPE;
   908   7   19:D    17          OBJECT   : TOBJREC;
   909   7   19:D    56          OBJLIST  : ARRAY[ 1..8] OF INTEGER;
   910   7   19:D    64          
   911   7   19:D    64     
   912   7   20:D     1     PROCEDURE CHSPCPOW;  (* P010114 *)
   913   7   20:D     1       
   914   7   20:D     1       VAR
   915   7   20:D     1            CHSPCWIN : TWINDOWP;
   916   7   20:D     2       
   917   7   20:D     2       
   918   7   21:D     1         PROCEDURE SPCPOWER;  (* P010115 *)
   919   7   21:D     1         
   920   7   21:D     1           VAR
   921   7   21:D     1                SPCX     : INTEGER;
   922   7   21:D     2                SPCTEMP  : INTEGER;
   923   7   21:D     3                GOLD50K  : TWIZLONG;
   924   7   21:D     6         
   925   7   21:D     6         
   926   7   22:D     1           PROCEDURE SPC1TO12( ATTR2MOD: INTEGER;  (* P010116 *)
   927   7   22:D     2                               MODAMT:   INTEGER);
   928   7   22:D     3           
   929   7   22:D     3             VAR
   930   7   22:D     3                  ATTRX : TATTRIB;
   931   7   22:D     4           
   932   7   22:0     0             BEGIN
   933   7   22:1     0               ATTRX := STRENGTH;
   934   7   22:1     3               WHILE ATTR2MOD > 1 DO
   935   7   22:2     8                 BEGIN
   936   7   22:3     8                   ATTRX := SUCC( ATTRX);
   937   7   22:3    13                   ATTR2MOD := ATTR2MOD - 1
   938   7   22:2    14                 END;
   939   7   22:1    20               SPCTEMP := CHARACTR[ CHARI].ATTRIB[ ATTRX] + MODAMT;
   940   7   22:1    39               IF (SPCTEMP > 2) AND (SPCTEMP < 19) THEN
   941   7   22:2    52                 CHARACTR[ CHARI].ATTRIB[ ATTRX] := SPCTEMP;
   942   7   22:0    69             END;
   943   7   22:0    84             
   944   7   22:0    84             
   945   7   23:D     1           PROCEDURE SPELL999;  (* P010117 *)
   946   7   23:D     1           
   947   7   23:0     0             BEGIN
   948   7   23:1     0               FOR BASE04 := 1 TO 7 DO
   949   7   23:2    11                 BEGIN
   950   7   23:3    11                   CHARACTR[ CHARI].MAGESP  [ BASE04] := 9;
   951   7   23:3    27                   CHARACTR[ CHARI].PRIESTSP[ BASE04] := 9
   952   7   23:2    41                 END
   953   7   23:0    43             END;
   954   7   23:0    64             
   955   7   23:0    64             
   956   7   24:D     1           PROCEDURE SPELLUNK;  (* P010118 *)
   957   7   24:D     1           
   958   7   24:D     1             VAR
   959   7   24:D     1                  X : INTEGER;
   960   7   24:D     2           
   961   7   24:0     0             BEGIN
   962   7   24:1     0               SPELL999;
   963   7   24:1     2               FOR X := 1 TO 50 DO
   964   7   24:2    13                 CHARACTR[ CHARI].SPELLSKN[ X] := FALSE
   965   7   24:0    26             END;
   966   7   24:0    50             
   967   7   24:0    50             
   968   7   25:D     1           PROCEDURE PRESSRET;  (* P010119 *)
   969   7   25:D     1           
   970   7   25:0     0             BEGIN
   971   7   25:1     0               MVCURSOR( CHSPCWIN, 0, CHSPCWIN^.HEAD.VSIZE - 3);
   972   7   25:1    17               CENTSTR( CHSPCWIN, 'PRESS (RETURN)');
   973   7   25:1    40               GETCR
   974   7   25:0    40             END;
   975   7   25:0    56             
   976   7   25:0    56             
   977   7   26:D     1           PROCEDURE DOCRYST( CRYALGN:  TALIGN;  (* P01011A *)
   978   7   26:D     2                              NOTCRYAL: TALIGN;
   979   7   26:D     3                              CASTALGN: TALIGN);
   980   7   26:D     4           
   981   7   26:D     4             VAR
   982   7   26:D     4                  PARTYX : INTEGER;
   983   7   26:D     5           
   984   7   26:D     5           
   985   7   27:D     1             PROCEDURE BRKCRYST;  (* P01011B *)
   986   7   27:D     1             
   987   7   27:D     1               VAR
   988   7   27:D     1                    TWOCRY : INTEGER;
   989   7   27:D     2                    POSSX  : INTEGER;
   990   7   27:D     3                    CHARX  : INTEGER;
   991   7   27:D     4             
   992   7   27:0     0               BEGIN
   993   7   27:1     0                 BCRYSGOO := FALSE;
   994   7   27:1     4                 BCRYSEVI := FALSE;
   995   7   27:1     8                 FOR TWOCRY := 0 TO 1 DO
   996   7   27:2    19                   FOR CHARX := 0 TO (PARTYCNT - 1) DO
   997   7   27:3    32                     FOR POSSX := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
   998   7   27:4    49                       IF (CHARACTR[ CHARX].POSS.POSSESS[ POSSX].EQINDEX =
   999   7   27:4    62                                                                       CRYSGOOD)
  1000   7   27:4    66                                    OR
  1001   7   27:4    66                          (CHARACTR[ CHARX].POSS.POSSESS[ POSSX].EQINDEX =
  1002   7   27:4    79                                                                       CRYSEVIL)
  1003   7   27:4    83                       THEN
  1004   7   27:5    86                           CHARACTR[ CHARX].POSS.POSSESS[ POSSX].EQINDEX := 1000
  1005   7   27:0   100               END;
  1006   7   27:0   144               
  1007   7   27:0   144               
  1008   7   28:D     1             PROCEDURE BROK2NEU;  (* P01011C *)
  1009   7   28:D     1             
  1010   7   28:D     1               VAR
  1011   7   28:D     1                    X : INTEGER;
  1012   7   28:D     2             
  1013   7   28:0     0               BEGIN
  1014   7   28:1     0                 X := 1;
  1015   7   28:1     3                 WHILE CHARACTR[ CHARI].POSS.POSSESS[ X].EQINDEX <> 1000 DO
  1016   7   28:2    24                   X := X + 1;
  1017   7   28:1    31                 CHARACTR[ CHARI].POSS.POSSESS[ X].EQINDEX := CRYSNEUT;
  1018   7   28:1    51                 CHARACTR[ CHARI].POSS.POSSESS[ X].IDENTIF := FALSE;
  1019   7   28:1    69                 CHARACTR[ CHARI].POSS.POSSESS[ X].EQUIPED := FALSE;
  1020   7   28:1    85                 CHARACTR[ CHARI].POSS.POSSESS[ X].CURSED  := FALSE
  1021   7   28:0   101               END;
  1022   7   28:0   118               
  1023   7   28:0   118               
  1024   7   29:D     1             PROCEDURE DECMAXHP( CHARX:  INTEGER;  (* P01011D *)
  1025   7   29:D     2                                 FACTOR: INTEGER);
  1026   7   29:D     3             
  1027   7   29:0     0               BEGIN
  1028   7   29:1     0                 IF CHARACTR[ CHARX].MAXLEVAC > 0 THEN
  1029   7   29:2    11                   CHARACTR[ CHARX].HPMAX := CHARACTR[ CHARX].HPMAX -
  1030   7   29:2    25                     (FACTOR * CHARACTR[ CHARX].HPMAX) DIV
  1031   7   29:2    34                     CHARACTR[ CHARX].MAXLEVAC;
  1032   7   29:2    44                   
  1033   7   29:1    44                 IF CHARACTR[ CHARX].HPLEFT > CHARACTR[ CHARX].HPMAX THEN
  1034   7   29:2    61                   CHARACTR[ CHARX].HPLEFT := CHARACTR[ CHARX].HPMAX;
  1035   7   29:2    76                   
  1036   7   29:1    76                 IF CHARACTR[ CHARX].HPLEFT <= 0 THEN
  1037   7   29:2    87                   CHARACTR[ CHARX].STATUS := ASHES
  1038   7   29:0    94               END;  (* DECMAXHP *)
  1039   7   29:0   108               
  1040   7   29:0   108               
  1041   7   30:D     1             PROCEDURE SET5FLGS;  (* P01011E *)
  1042   7   30:D     1             
  1043   7   30:D     1               VAR
  1044   7   30:D     1                    EQX   : INTEGER;
  1045   7   30:D     2                    POSSX : INTEGER;
  1046   7   30:D     3                    CHARX : INTEGER;
  1047   7   30:D     4             
  1048   7   30:0     0               BEGIN
  1049   7   30:1     0                 BORBEART := FALSE;
  1050   7   30:1     4                 BCRYSGOO := FALSE;
  1051   7   30:1     8                 BCRYSEVI := FALSE;
  1052   7   30:1    12                 BCRYSNEU := FALSE;
  1053   7   30:1    16                 BSHIPBOT := FALSE;
  1054   7   30:1    20                 
  1055   7   30:1    20                 FOR CHARX := 0 TO PARTYCNT - 1 DO
  1056   7   30:2    33                   FOR POSSX := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
  1057   7   30:3    50                     BEGIN
  1058   7   30:4    50                       EQX := CHARACTR[ CHARX].POSS.POSSESS[ POSSX].EQINDEX;
  1059   7   30:4    65                       BORBEART := BORBEART OR (EQX = ORBEARTH);
  1060   7   30:4    77                       BCRYSGOO := BCRYSGOO OR (EQX = CRYSGOOD);
  1061   7   30:4    89                       BCRYSEVI := BCRYSEVI OR (EQX = CRYSEVIL);
  1062   7   30:4   101                       BCRYSNEU := BCRYSNEU OR (EQX = CRYSNEUT);
  1063   7   30:4   113                       BSHIPBOT := BSHIPBOT OR (EQX = SHIPBOTT)
  1064   7   30:3   121                     END
  1065   7   30:0   125               END;  (* SET5FLGS *)
  1066   7   30:0   156           
  1067   7   30:0   156           
  1068   7   26:0     0             BEGIN (* DOCRYST *)
  1069   7   26:1     0               CLEARWIN( CHSPCWIN, TRUE);
  1070   7   26:1     7               SET5FLGS;
  1071   7   26:1     9               IF CRYALGN = CASTALGN THEN
  1072   7   26:2    14                 IF BCRYSEVI AND BCRYSGOO THEN
  1073   7   26:3    23                   BEGIN
  1074   7   26:4    23                     BRKCRYST;
  1075   7   26:4    25                     BROK2NEU
  1076   7   26:3    25                   END
  1077   7   26:2    27                 ELSE
  1078   7   26:3    29                   BEGIN
  1079   7   26:4    29                     BRKCRYST;
  1080   7   26:4    31                     CENTSTR( CHSPCWIN, '"NOR GOOD NOR EVIL ALONE,');
  1081   7   26:4    65                     CENTSTR( CHSPCWIN, 'THE BALANCE SHALL REMAIN.');
  1082   7   26:4    99                     CENTSTR( CHSPCWIN, 'ALONE EACH ONE SHALL FAIL,');
  1083   7   26:4   134                     CENTSTR( CHSPCWIN, 'TO TRIUMPH, HAVE THE TWAIN."');
  1084   7   26:4   171                     PRESSRET
  1085   7   26:3   171                   END
  1086   7   26:1   173               ELSE
  1087   7   26:2   175                 IF NOTCRYAL = CASTALGN THEN
  1088   7   26:2   180                    (* CRYGOOD & EVIL CASTER
  1089   7   26:2   180                       CRYEVIL & GOOD CASTER *)
  1090   7   26:3   180                   BEGIN
  1091   7   26:4   180                     BRKCRYST;
  1092   7   26:4   182                     FOR PARTYX := 0 TO (PARTYCNT - 1) DO
  1093   7   26:5   195                       DECMAXHP( PARTYX, 1);
  1094   7   26:4   206                     DECMAXHP( CHARI, 3);
  1095   7   26:4   212                     IF CHARACTR[ CHARI].STATUS < LOST THEN
  1096   7   26:5   225                       BEGIN
  1097   7   26:6   225                         IF CHARACTR[ CHARI].CHARLEV > 4 THEN
  1098   7   26:7   238                           CHARACTR[ CHARI].STATUS := ASHES
  1099   7   26:6   247                         ELSE
  1100   7   26:7   251                           CHARACTR[ CHARI].STATUS := LOST
  1101   7   26:5   260                       END;
  1102   7   26:4   262                     CENTSTR( CHSPCWIN, '"POWERS THERE BE WHICH THE');
  1103   7   26:4   297                     CENTSTR( CHSPCWIN, 'WISE MAY USE.  FOOLS WHO');
  1104   7   26:4   330                     CENTSTR( CHSPCWIN, 'PLAY WITH THOSE POWERS');
  1105   7   26:4   361                     CENTSTR( CHSPCWIN, 'SHALL PERISH IN FLAME!"');
  1106   7   26:4   393                     PRESSRET
  1107   7   26:3   393                   END
  1108   7   26:2   395                 ELSE
  1109   7   26:3   397                   BEGIN
  1110   7   26:4   397                     BRKCRYST;
  1111   7   26:4   399                     DECMAXHP( CHARI, 1);
  1112   7   26:4   405                     CENTSTR( CHSPCWIN, '"POWER SPRINGS FROM BOTH');
  1113   7   26:4   438                     CENTSTR( CHSPCWIN, 'EXTREMES, FROM EXTREMES');
  1114   7   26:4   470                     CENTSTR( CHSPCWIN, 'MUST BE EMPLOYED.');
  1115   7   26:4   496                     PRESSRET
  1116   7   26:3   496                   END
  1117   7   26:0   498             END;  (* DOCRYST *)
  1118   7   26:0   520             
  1119   7   26:0   520             
  1120   7   31:D     1           PROCEDURE DOEARTH;  (* P01011F *)
  1121   7   31:D     1           
  1122   7   31:D     1             VAR
  1123   7   31:D     1                  X : INTEGER;
  1124   7   31:D     2           
  1125   7   31:0     0             BEGIN
  1126   7   31:1     0               CLEARWIN( CHSPCWIN, TRUE);
  1127   7   31:1     7               IF MAZELEV >= 1 THEN
  1128   7   31:2    12                 BEGIN
  1129   7   31:3    12                   PRINTSTR( CHSPCWIN, 'SCRYING');
  1130   7   31:3    28                   FOR X := 0 TO 6 DO
  1131   7   31:4    39                     BEGIN
  1132   7   31:5    39                       PAUSE2;
  1133   7   31:5    42                       PRINTCHR( CHSPCWIN, '.')
  1134   7   31:4    46                     END
  1135   7   31:2    49                 END;
  1136   7   31:1    56               MVCURSOR( CHSPCWIN, 0, 2);
  1137   7   31:1    64               IF MAZELEV < 1 THEN
  1138   7   31:2    69                 CENTSTR( CHSPCWIN, '* NO POWER IN CASTLE *')
  1139   7   31:1    97               ELSE
  1140   7   31:2   102                 CENTSTR( CHSPCWIN, '*** FOUND NOTHING! ***');
  1141   7   31:1   133               PRESSRET
  1142   7   31:0   133             END; (* DOEARTH *)
  1143   7   31:0   150         
  1144   7   31:0   150         
  1145   7   21:0     0           BEGIN  (* SPCPOWER *)
  1146   7   21:1     0             FILLCHAR( GOLD50K, 6, 0);
  1147   7   21:1     7             GOLD50K.MID := 5;
  1148   7   21:1    10             CHSPCWIN := GETWIN( 4, 12, 32, 8, 18, TRUE);
  1149   7   21:1    24             CENTSTR( CHSPCWIN, 'WILL YOU INVOKE THE');
  1150   7   21:1    52             CENTSTR( CHSPCWIN, 'SPECIAL POWER OF YOUR');
  1151   7   21:1    82             IF CHARACTR[ CHARI].POSS.POSSESS[ POSSI].IDENTIF THEN
  1152   7   21:2   101               CENTSTR( CHSPCWIN, OBJECT.NAME)
  1153   7   21:1   107             ELSE
  1154   7   21:2   112               CENTSTR( CHSPCWIN, OBJECT.NAMEUNK);
  1155   7   21:1   121             PRINTCR( CHSPCWIN);
  1156   7   21:1   127             CENTSTR( CHSPCWIN, '(Y/N) ?');
  1157   7   21:1   143             REPEAT
  1158   7   21:2   143               GETKEY
  1159   7   21:1   143             UNTIL (INCHAR = 'Y') OR (INCHAR = 'N');
  1160   7   21:1   155             IF INCHAR = 'Y' THEN
  1161   7   21:2   160               BEGIN
  1162   7   21:3   160                 IF (RANDOM MOD 100) < OBJECT.CHGCHANC THEN
  1163   7   21:4   173                   CHARACTR[ CHARI].POSS.POSSESS[ POSSI].EQINDEX :=
  1164   7   21:4   191                     OBJECT.CHANGETO + 1000;
  1165   7   21:3   199                 IF OBJECT.SPECIAL < 7 THEN
  1166   7   21:4   206                   BEGIN
  1167   7   21:5   206                     SPC1TO12( OBJECT.SPECIAL, 1)
  1168   7   21:4   210                   END
  1169   7   21:3   212                 ELSE
  1170   7   21:4   214                   BEGIN
  1171   7   21:5   214                     IF OBJECT.SPECIAL < 13 THEN
  1172   7   21:6   221                       SPC1TO12( OBJECT.SPECIAL - 6, - 1)
  1173   7   21:5   228                     ELSE 
  1174   7   21:6   232                       BEGIN
  1175   7   21:7   232                         WITH CHARACTR[ CHARI] DO
  1176   7   21:8   241                           BEGIN
  1177   7   21:9   241                             CASE OBJECT.SPECIAL OF
  1178   7   21:9   246                               13: IF AGE > 1040 THEN
  1179   7   21:1   255                                     AGE := AGE - 52;
  1180   7   21:9   266                               14: AGE := AGE + 52;
  1181   7   21:9   277                               15: CLASS := SAMURAI;
  1182   7   21:9   284                               16: CLASS := LORD;
  1183   7   21:9   291                               17: CLASS := NINJA;
  1184   7   21:9   298                               18: ADDLONGS( GOLD, GOLD50K);
  1185   7   21:9   308                               19: ADDLONGS( EXP, GOLD50K);
  1186   7   21:9   318                               20: STATUS := LOST;
  1187   7   21:9   325                               21: BEGIN
  1188   7   21:1   325                                     STATUS := OK;
  1189   7   21:1   330                                     HPLEFT := HPMAX;
  1190   7   21:1   337                                     LOSTXYL.POISNAMT[ 1] := 0
  1191   7   21:0   345                                   END;
  1192   7   21:9   349                               22: HPMAX := HPMAX + 1;
  1193   7   21:9   360                               23: BEGIN
  1194   7   21:1   360                                     FOR SPCTEMP := 0 TO (PARTYCNT - 1) DO
  1195   7   21:2   373                                         CHARACTR[ SPCTEMP].HPLEFT :=
  1196   7   21:2   380                                           CHARACTR[ SPCTEMP].HPMAX
  1197   7   21:0   385                                   END;
  1198   7   21:9   397                               24: BEGIN
  1199   7   21:1   397                                     CLASS := SAMURAI;
  1200   7   21:1   402                                     SPCTEMP := RANDOM MOD 3;
  1201   7   21:1   411                                     FOR SPCX := 1 TO SPCTEMP DO
  1202   7   21:2   422                                       CLASS := SUCC( CLASS)
  1203   7   21:0   430                                   END;
  1204   7   21:9   440                               25: BEGIN
  1205   7   21:1   440                                     CLASS := FIGHTER;
  1206   7   21:1   445                                     SPCTEMP := RANDOM MOD 5;
  1207   7   21:1   454                                     FOR SPCX := 1 TO SPCTEMP DO
  1208   7   21:2   465                                       CLASS := SUCC( CLASS);
  1209   7   21:1   481                                     STATUS := DEAD;
  1210   7   21:1   486                                     HPLEFT := 0
  1211   7   21:0   489                                   END;
  1212   7   21:9   493                               26: SPELL999;
  1213   7   21:9   497                               27: SPELLUNK;
  1214   7   21:9   501                               28: DOCRYST( GOOD, EVIL, ALIGN);
  1215   7   21:9   510                               29: DOCRYST( EVIL, GOOD, ALIGN);
  1216   7   21:9   519                               30: DOEARTH;
  1217   7   21:9   523                             END
  1218   7   21:8   566                         END
  1219   7   21:6   566                       END
  1220   7   21:4   566                   END
  1221   7   21:2   566               END;
  1222   7   21:1   566             DELWIN( CHSPCWIN, TRUE)
  1223   7   21:0   570           END;  (* SPCPOWER *)
  1224   7   21:0   604       
  1225   7   21:0   604       
  1226   7   20:0     0         BEGIN (* CHSPCPOW *)
  1227   7   20:1     0           FOR POSSI := 1 TO CHARACTR[ CHARI].POSS.POSSCNT DO
  1228   7   20:2    22             IF CHARACTR[ CHARI].POSS.POSSESS[ POSSI].EQINDEX > (0 + 1000) THEN
  1229   7   20:3    47               BEGIN
  1230   7   20:4    47                 MOVELEFT( IOCACHE[ GETREC( 
  1231   7   20:4    50                             ZOBJECT,
  1232   7   20:4    51                             CHARACTR[ CHARI].POSS.POSSESS[ POSSI].EQINDEX -
  1233   7   20:4    68                                                                           1000,
  1234   7   20:4    72                             SIZEOF( TOBJREC))],
  1235   7   20:4    78                           OBJECT,
  1236   7   20:4    82                           SIZEOF( TOBJREC));
  1237   7   20:4    85                 IF OBJECT.SPECIAL > 0 THEN
  1238   7   20:5    92                   IF OBJECT.CLASSUSE[ CHARACTR[ CHARI].CLASS] THEN
  1239   7   20:6   110                     SPCPOWER
  1240   7   20:3   110               END;
  1241   7   20:0   122         END;
  1242   7   20:0   136     
  1243   7   20:0   136     
  1244   7   32:D     1       PROCEDURE NORMPOW;  (* P010120 *)
  1245   7   32:D     1       
  1246   7   32:D     1         VAR
  1247   7   32:D     1              TEMPX : INTEGER;
  1248   7   32:D     2              TEMPY : INTEGER;
  1249   7   32:D     3              POSSX : INTEGER;
  1250   7   32:D     4       
  1251   7   32:0     0         BEGIN
  1252   7   32:1     0           FILLCHAR( CANUSE, 14, 0);
  1253   7   32:1     8           FOR POSSX := 1 TO CHARACTR[ CHARI].POSS.POSSCNT DO
  1254   7   32:2    27             BEGIN
  1255   7   32:3    27               MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  1256   7   32:3    31                                          CHARACTR[ CHARI].
  1257   7   32:3    38                                            POSS.POSSESS[ POSSX].EQINDEX - 1000,
  1258   7   32:3    50                                          SIZEOF( TOBJREC))],
  1259   7   32:3    56                         OBJECT,
  1260   7   32:3    60                         SIZEOF( TOBJREC));
  1261   7   32:3    63               IF OBJECT.CLASSUSE[ CHARACTR[ CHARI].CLASS] THEN
  1262   7   32:4    81                 CANUSE[ OBJECT.OBJTYPE] := TRUE;
  1263   7   32:3    91               IF CHARACTR[ CHARI].HEALPTS < OBJECT.HEALPTS THEN
  1264   7   32:4   106                 CHARACTR[ CHARI].HEALPTS := OBJECT.HEALPTS;
  1265   7   32:3   119               FOR TEMPX := 0 TO 13 DO
  1266   7   32:4   130                 CHARACTR[ CHARI].WEPVSTY2[ 0][ TEMPX] :=
  1267   7   32:4   146                 CHARACTR[ CHARI].WEPVSTY2[ 0][ TEMPX] OR OBJECT.WEPVSTY2[ TEMPX];
  1268   7   32:3   180               FOR TEMPY := 0 TO 6 DO
  1269   7   32:4   191                 CHARACTR[ CHARI].WEPVSTY3[ 0][ TEMPY] :=
  1270   7   32:4   207                 CHARACTR[ CHARI].WEPVSTY3[ 0][ TEMPY] OR OBJECT.WEPVSTY3[ TEMPY]
  1271   7   32:2   231             END
  1272   7   32:0   241         END;  (* NORMPOW *)
  1273   7   32:0   268         
  1274   7   32:0   268         
  1275   7   33:D     1       PROCEDURE ARMORPOW( CHARX: INTEGER;  (* P010121 *)
  1276   7   33:D     2                           POSSX: INTEGER;
  1277   7   33:D     3                           OBJID: INTEGER);
  1278   7   33:D     4       
  1279   7   33:D     4         VAR
  1280   7   33:D     4              MP04XX : INTEGER;  (* UNUSED *)
  1281   7   33:D     5       
  1282   7   33:0     0         BEGIN
  1283   7   33:1     0           UNARMED := FALSE;
  1284   7   33:1     4           MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  1285   7   33:1     8                                      OBJID - 1000,
  1286   7   33:1    13                                      SIZEOF( TOBJREC))],
  1287   7   33:1    19                     OBJECT,
  1288   7   33:1    23                     SIZEOF( TOBJREC));
  1289   7   33:1    26           WITH CHARACTR[ CHARX] DO
  1290   7   33:2    33             BEGIN
  1291   7   33:3    33               POSS.POSSESS[ POSSX].CURSED := OBJECT.CURSED;
  1292   7   33:3    47               IF (OBJECT.ALIGN = UNALIGN) OR (OBJECT.ALIGN = ALIGN) THEN
  1293   7   33:4    62                 BEGIN
  1294   7   33:5    62                   IF OBJECT.XTRASWNG > SWINGCNT THEN
  1295   7   33:6    71                     SWINGCNT := OBJECT.XTRASWNG;
  1296   7   33:5    78                   ARMORCL := ARMORCL - OBJECT.ARMORMOD;
  1297   7   33:5    89                   HPCALCMD := HPCALCMD + OBJECT.WEPHITMD;
  1298   7   33:5   100                   IF OBJECT.OBJTYPE = WEAPON THEN
  1299   7   33:6   107                     BEGIN
  1300   7   33:7   107                       BASE04 := HPDAMRC.HPMINAD;
  1301   7   33:7   112                       HPDAMRC := OBJECT.WEPHPDAM;
  1302   7   33:7   120                       HPDAMRC.HPMINAD := HPDAMRC.HPMINAD + BASE04;
  1303   7   33:7   129                       CRITHITM := CRITHITM OR OBJECT.CRITHITM;
  1304   7   33:7   140                       WEPVSTYP := OBJECT.WEPVSTYP
  1305   7   33:6   143                     END
  1306   7   33:4   148                 END
  1307   7   33:3   148               ELSE
  1308   7   33:4   150                 BEGIN
  1309   7   33:5   150                   HPCALCMD := HPCALCMD - 1;
  1310   7   33:5   159                   ARMORCL := ARMORCL + 1;
  1311   7   33:5   168                   CRITHITM := FALSE;
  1312   7   33:5   173                   POSS.POSSESS[ POSSX].CURSED := TRUE
  1313   7   33:4   183                 END
  1314   7   33:2   185             END;
  1315   7   33:0   185         END;  (* ARMORPOW *)
  1316   7   33:0   198         
  1317   7   33:0   198         
  1318   7   34:D     1       PROCEDURE ARM4CHAR;  (* P010122 *)
  1319   7   34:D     1       
  1320   7   34:D     1       VAR
  1321   7   34:D     1            POSSX : INTEGER;
  1322   7   34:D     2       
  1323   7   34:0     0         BEGIN
  1324   7   34:1     0           FOR POSSX := 1 TO CHARACTR[ CHARI].POSS.POSSCNT DO
  1325   7   34:2    19             IF CHARACTR[ CHARI].POSS.POSSESS[ POSSX].EQUIPED THEN
  1326   7   34:3    36               ARMORPOW( CHARI, POSSX,
  1327   7   34:3    40                                  CHARACTR[ CHARI].POSS.POSSESS[ POSSX].EQINDEX)
  1328   7   34:0    55         END;
  1329   7   34:0    78         
  1330   7   34:0    78         
  1331   7   35:D     1       PROCEDURE DOEQUIP;  (* P010123 *)
  1332   7   35:D     1       
  1333   7   35:D     1         VAR
  1334   7   35:D     1              DOEQWIN : TWINDOWP;
  1335   7   35:D     2       
  1336   7   35:D     2       
  1337   7   36:D     1         PROCEDURE EQUIPONE;  (* P010124 *)
  1338   7   36:D     1         
  1339   7   36:D     1           VAR
  1340   7   36:D     1                VCURS : INTEGER;
  1341   7   36:D     2         
  1342   7   36:0     0           BEGIN
  1343   7   36:1     0             VCURS := DOEQWIN^.HEAD.VCURSOR + 1;
  1344   7   36:1    12             REPEAT
  1345   7   36:2    12               MVCURSOR( DOEQWIN, 0, VCURS);
  1346   7   36:2    20               CENTSTR( DOEQWIN, 'EQUIP WHICH (NUM)');
  1347   7   36:2    46               CENTSTR( DOEQWIN, '(RET) FOR NONE');
  1348   7   36:2    69               GETKEY;
  1349   7   36:2    72               IF INCHAR = CHR( CRETURN) THEN
  1350   7   36:3    77                 EXIT( EQUIPONE);
  1351   7   36:2    81               POSSI := ORD( INCHAR) - ORD( '0')
  1352   7   36:1    83             UNTIL (POSSI > 0) AND (POSSI <= POSSCNT);
  1353   7   36:1   102             CHARACTR[ CHARI].POSS.POSSESS[ OBJLIST[ POSSI]].EQUIPED := TRUE;
  1354   7   36:1   128             ARMORPOW( CHARI,
  1355   7   36:1   131                       OBJLIST[ POSSI],
  1356   7   36:1   142                       CHARACTR[ CHARI].POSS.POSSESS[ OBJLIST[ POSSI]].EQINDEX)
  1357   7   36:0   167           END;  (* EQUIPONE *)
  1358   7   36:0   184       
  1359   7   36:0   184       
  1360   7   35:0     0         BEGIN (* DOEQUIP *)
  1361   7   35:1     0           IF NOT CANUSE[ OBJI] THEN
  1362   7   35:2    12             EXIT (DOEQUIP);
  1363   7   35:1    16           DOEQWIN := GETWIN( 8, 8, 24, 15, 16, TRUE);
  1364   7   35:1    29           PRINTSTR( DOEQWIN, 'SELECT ');
  1365   7   35:1    43           CASE OBJI OF
  1366   7   35:1    48               WEAPON : PRINTSTR( DOEQWIN, 'WEAPON');
  1367   7   35:1    63                ARMOR : PRINTSTR( DOEQWIN, 'ARMOR');
  1368   7   35:1    77               SHIELD : PRINTSTR( DOEQWIN, 'SHIELD');
  1369   7   35:1    92               HELMET : PRINTSTR( DOEQWIN, 'HELMET');
  1370   7   35:1   107             GAUNTLET : PRINTSTR( DOEQWIN, 'GAUNTLETS');
  1371   7   35:1   125                 MISC : PRINTSTR( DOEQWIN, 'MISC. ITEM');
  1372   7   35:1   144           END;
  1373   7   35:1   166           PRINTCR( DOEQWIN);
  1374   7   35:1   170           PRINTCR( DOEQWIN);
  1375   7   35:1   174           POSSCNT := 0;
  1376   7   35:1   178           FOR POSSI := 1 TO CHARACTR[ CHARI].POSS.POSSCNT DO
  1377   7   35:2   200             BEGIN
  1378   7   35:3   200               IF CHARACTR[ CHARI].POSS.POSSESS[ POSSI].EQINDEX > (0 + 1000) THEN
  1379   7   35:4   225                 BEGIN
  1380   7   35:5   225                   MOVELEFT( IOCACHE[ GETREC(
  1381   7   35:5   228                                 ZOBJECT,
  1382   7   35:5   229                                 CHARACTR[ CHARI].POSS.POSSESS[ POSSI].EQINDEX -
  1383   7   35:5   246                                                                           1000,
  1384   7   35:5   250                                 SIZEOF( TOBJREC))],
  1385   7   35:5   256                             OBJECT,
  1386   7   35:5   260                             SIZEOF( TOBJREC));
  1387   7   35:5   263                   IF (OBJECT.OBJTYPE = OBJI) AND
  1388   7   35:5   270                      (OBJECT.CLASSUSE[ CHARACTR[ CHARI].CLASS]) THEN
  1389   7   35:6   289                     BEGIN
  1390   7   35:7   289                       POSSCNT := POSSCNT + 1;
  1391   7   35:7   297                       OBJLIST[ POSSCNT] := POSSI;
  1392   7   35:7   311                       PRINTNUM( DOEQWIN, POSSCNT, 1);
  1393   7   35:7   319                       PRINTCHR( DOEQWIN, ')');
  1394   7   35:7   324                       IF CHARACTR[ CHARI].POSS.POSSESS[ POSSI].CURSED THEN
  1395   7   35:8   343                         PRINTCHR( DOEQWIN, '-')
  1396   7   35:7   345                       ELSE
  1397   7   35:8   350                         IF CHARACTR[ CHARI].POSS.POSSESS[ POSSI].IDENTIF THEN
  1398   7   35:9   369                           PRINTCHR( DOEQWIN, ' ')
  1399   7   35:8   371                         ELSE
  1400   7   35:9   376                           PRINTCHR( DOEQWIN, '?');
  1401   7   35:7   381                       IF CHARACTR[ CHARI].POSS.POSSESS[ POSSI].IDENTIF THEN
  1402   7   35:8   400                         PRINTSTR( DOEQWIN, OBJECT.NAME)
  1403   7   35:7   404                       ELSE
  1404   7   35:8   409                         PRINTSTR( DOEQWIN, OBJECT.NAMEUNK);
  1405   7   35:7   416                       PRINTCR( DOEQWIN)
  1406   7   35:6   417                     END
  1407   7   35:4   420                 END
  1408   7   35:2   420             END;
  1409   7   35:2   430             
  1410   7   35:1   430             TEMPX := 0;
  1411   7   35:1   434             FOR POSSI := 1 TO POSSCNT DO
  1412   7   35:2   450               IF CHARACTR[ CHARI].POSS.POSSESS[ OBJLIST[ POSSI]].CURSED THEN
  1413   7   35:3   477                 TEMPX := POSSI;
  1414   7   35:1   493             IF TEMPX = 0 THEN
  1415   7   35:2   500               EQUIPONE;
  1416   7   35:2   502               
  1417   7   35:1   502             TEMPX := 0;
  1418   7   35:1   506             FOR POSSI := 1 TO POSSCNT DO
  1419   7   35:2   522               IF CHARACTR[ CHARI].POSS.POSSESS[ OBJLIST[ POSSI]].CURSED THEN
  1420   7   35:3   549                 TEMPX := POSSI;
  1421   7   35:1   565             IF TEMPX > 0 THEN
  1422   7   35:2   572               BEGIN
  1423   7   35:3   572                 MVCURSOR( DOEQWIN, 0, DOEQWIN^.HEAD.VCURSOR - 3);
  1424   7   35:3   585                 CENTSTR( DOEQWIN, '** CURSED **');
  1425   7   35:3   604                 RINGBELL;
  1426   7   35:3   607                 RINGBELL;
  1427   7   35:3   610                 RINGBELL;
  1428   7   35:3   613                 CHARACTR[ CHARI].POSS.POSSESS[ OBJLIST[ TEMPX]].EQUIPED :=
  1429   7   35:3   637                                                                           TRUE;
  1430   7   35:3   639                 ARMORPOW( CHARI,
  1431   7   35:3   642                           OBJLIST[ TEMPX],
  1432   7   35:3   653                        CHARACTR[ CHARI].POSS.POSSESS[ OBJLIST[ TEMPX]].EQINDEX)
  1433   7   35:2   678               END;
  1434   7   35:1   680             DELWIN( DOEQWIN, FALSE)
  1435   7   35:0   683         END;  (* DOEQUIP *)
  1436   7   35:0   710         
  1437   7   35:0   710         
  1438   7   37:D     1       PROCEDURE UPLCKSKL( LSSUB:    INTEGER;  (* P010125 *)
  1439   7   37:D     2                           LSMODAMT: INTEGER);
  1440   7   37:D     3       
  1441   7   37:0     0         BEGIN
  1442   7   37:1     0           LSMODAMT := CHARACTR[ CHARI].LUCKSKIL[ LSSUB] - LSMODAMT;
  1443   7   37:1    18           IF LSMODAMT < 1 THEN
  1444   7   37:2    23             LSMODAMT := 1;
  1445   7   37:1    26           CHARACTR[ CHARI].LUCKSKIL[ LSSUB] := LSMODAMT
  1446   7   37:0    39         END;
  1447   7   37:0    54         
  1448   7   37:0    54         
  1449   7   38:D     1       PROCEDURE INITSTUF;  (* P010126 *)
  1450   7   38:D     1       
  1451   7   38:D     1         VAR
  1452   7   38:D     1              X : INTEGER;
  1453   7   38:D     2              Y : INTEGER;
  1454   7   38:D     3       
  1455   7   38:0     0         BEGIN
  1456   7   38:1     0           WITH CHARACTR[ CHARI] DO
  1457   7   38:2     9             BEGIN
  1458   7   38:3     9               FOR X := 0 TO 13 DO
  1459   7   38:4    20                 BEGIN
  1460   7   38:5    20                   WEPVSTY2[ 0][ X] := FALSE;
  1461   7   38:5    32                   WEPVSTY2[ 1][ X] := FALSE;
  1462   7   38:5    44                   WEPVSTYP[ X] := FALSE
  1463   7   38:4    51                 END;
  1464   7   38:3    60               FOR Y := 0 TO 6 DO
  1465   7   38:4    71                 BEGIN
  1466   7   38:5    71                   WEPVSTY3[ 0][ Y] := FALSE;
  1467   7   38:5    83                   WEPVSTY3[ 1][ Y] := FALSE
  1468   7   38:4    93                 END
  1469   7   38:2    95             END
  1470   7   38:0   102         END;
  1471   7   38:0   118         
  1472   7   38:0   118         
  1473   7   19:0     0       BEGIN  (* EQUIPCHR *)
  1474   7   19:1     0         WITH CHARACTR[ CHARI] DO
  1475   7   19:2     7           BEGIN
  1476   7   19:3     7             TEMPX := (20 - CHARLEV DIV 5) - (ATTRIB[ LUCK] DIV 6);
  1477   7   19:3    29             IF TEMPX < 1 THEN
  1478   7   19:4    34               TEMPX := 1;
  1479   7   19:3    37             FOR LUCKI := 0 TO 4 DO
  1480   7   19:4    49               LUCKSKIL[ LUCKI] := TEMPX;
  1481   7   19:4    66               
  1482   7   19:3    66             CASE CLASS OF
  1483   7   19:3    72             
  1484   7   19:3    72               FIGHTER :   UPLCKSKL( 0, 3);
  1485   7   19:3    78                  MAGE :   UPLCKSKL( 4, 3);
  1486   7   19:3    84                PRIEST :   UPLCKSKL( 1, 3);
  1487   7   19:3    90                 THIEF :   UPLCKSKL( 3, 3);
  1488   7   19:3    96                 
  1489   7   19:3    96                BISHOP : BEGIN
  1490   7   19:5    96                           UPLCKSKL( 2, 2);
  1491   7   19:5   100                           UPLCKSKL( 4, 2);
  1492   7   19:5   104                           UPLCKSKL( 1, 2);
  1493   7   19:4   108                         END;
  1494   7   19:4   110                         
  1495   7   19:3   110               SAMURAI : BEGIN
  1496   7   19:5   110                           UPLCKSKL( 0, 2);
  1497   7   19:5   114                           UPLCKSKL( 4, 2);
  1498   7   19:4   118                         END;
  1499   7   19:4   120                         
  1500   7   19:3   120                  LORD : BEGIN
  1501   7   19:5   120                           UPLCKSKL( 0, 2);
  1502   7   19:5   124                           UPLCKSKL( 1, 2);
  1503   7   19:4   128                         END;
  1504   7   19:4   130                           
  1505   7   19:3   130                 NINJA : BEGIN
  1506   7   19:5   130                           UPLCKSKL( 0, 3);
  1507   7   19:5   134                           UPLCKSKL( 1, 2);
  1508   7   19:5   138                           UPLCKSKL( 2, 4);
  1509   7   19:5   142                           UPLCKSKL( 3, 3);
  1510   7   19:5   146                           UPLCKSKL( 4, 2);
  1511   7   19:4   150                         END;
  1512   7   19:4   152                
  1513   7   19:3   152             END;
  1514   7   19:3   176             
  1515   7   19:3   176             CASE RACE OF
  1516   7   19:3   182                HUMAN:  UPLCKSKL( 0, 1);
  1517   7   19:3   188                  ELF:  UPLCKSKL( 2, 2);
  1518   7   19:3   194                DWARF:  UPLCKSKL( 3, 4);
  1519   7   19:3   200                GNOME:  UPLCKSKL( 1, 2);
  1520   7   19:3   206               HOBBIT:  UPLCKSKL( 4, 3);
  1521   7   19:3   212             END;
  1522   7   19:3   230             
  1523   7   19:3   230             IF NOT EQUIPALL THEN
  1524   7   19:4   236               FOR TEMPX := 1 TO 8 DO
  1525   7   19:5   248                 POSS.POSSESS[ TEMPX].EQUIPED := FALSE;
  1526   7   19:5   266             
  1527   7   19:3   266             IF (CLASS = PRIEST) OR
  1528   7   19:3   272                (CLASS = FIGHTER) OR
  1529   7   19:3   279                (CLASS >= SAMURAI) THEN
  1530   7   19:4   288               HPCALCMD := 2 + CHARLEV DIV 3
  1531   7   19:3   297             ELSE
  1532   7   19:4   303               HPCALCMD := CHARLEV DIV 5;
  1533   7   19:4   314             
  1534   7   19:3   314             HPDAMRC.LEVEL   := 2;
  1535   7   19:3   320             HPDAMRC.HPFAC   := 2;
  1536   7   19:3   326             HPDAMRC.HPMINAD := 0;
  1537   7   19:3   332             
  1538   7   19:3   332             IF ATTRIB[ STRENGTH] > 15 THEN
  1539   7   19:4   345               BEGIN
  1540   7   19:5   345                 HPCALCMD := HPCALCMD + ATTRIB[ STRENGTH] - 15;
  1541   7   19:5   366                 HPDAMRC.HPMINAD := ATTRIB[ STRENGTH] - 15
  1542   7   19:4   379               END
  1543   7   19:3   382             ELSE
  1544   7   19:4   384               IF ATTRIB[ STRENGTH] < 6 THEN
  1545   7   19:5   397                 HPCALCMD := HPCALCMD + ATTRIB[ STRENGTH] - 6;
  1546   7   19:5   418             
  1547   7   19:3   418             HEALPTS := 0;
  1548   7   19:3   424             
  1549   7   19:3   424             CRITHITM := CLASS = NINJA;
  1550   7   19:3   435             
  1551   7   19:3   435             SWINGCNT := 1;
  1552   7   19:3   441             
  1553   7   19:3   441             IF CLASS = NINJA THEN
  1554   7   19:4   449               HPDAMRC.HPFAC := 4;
  1555   7   19:4   455               
  1556   7   19:3   455             ARMORCL := 10;
  1557   7   19:3   461               
  1558   7   19:3   461             IF (CLASS = FIGHTER) OR
  1559   7   19:3   467                (CLASS >= SAMURAI) THEN
  1560   7   19:4   476               SWINGCNT := SWINGCNT + (CHARLEV DIV 5) + ORD( (CLASS = NINJA)); 
  1561   7   19:4   499               
  1562   7   19:3   499             IF SWINGCNT > 10 THEN
  1563   7   19:4   507               SWINGCNT := 10;
  1564   7   19:4   513               
  1565   7   19:3   513             INITSTUF;
  1566   7   19:3   515             NORMPOW;
  1567   7   19:3   517             UNARMED := TRUE
  1568   7   19:2   517           END;
  1569   7   19:2   520             
  1570   7   19:1   520           IF NOT EQUIPALL THEN
  1571   7   19:2   526             BEGIN
  1572   7   19:3   526               FOR OBJI := WEAPON TO GAUNTLET DO
  1573   7   19:4   538                 DOEQUIP;
  1574   7   19:3   547               OBJI := MISC;
  1575   7   19:3   550               DOEQUIP;
  1576   7   19:3   552               CHSPCPOW
  1577   7   19:2   552             END
  1578   7   19:1   554           ELSE
  1579   7   19:2   556             ARM4CHAR;
  1580   7   19:2   558           
  1581   7   19:1   558           IF CHARACTR[ CHARI].CLASS = NINJA THEN
  1582   7   19:2   569             IF UNARMED THEN
  1583   7   19:3   572               CHARACTR[ CHARI].ARMORCL := (CHARACTR[ CHARI].ARMORCL -
  1584   7   19:3   586                 (CHARACTR[ CHARI].CHARLEV DIV 3)) - 2
  1585   7   19:0   596       END;  (* EQUIPCHR *)
  1586   7   19:0   618       
  1587   7   19:0   618 (*$I WIZ3B:UTILITIE2 *)
  1587   7   19:0   618 (*$I WIZ3B:UTILITIE3 *)
  1588   7   39:D     1     PROCEDURE EQUIP6;  (* P010127 *)
  1589   7   39:D     1     
  1590   7   39:D     1       VAR
  1591   7   39:D     1            PARTYX : INTEGER;
  1592   7   39:D     2            
  1593   7   39:0     0       BEGIN
  1594   7   39:1     0         EQUIPALL := TRUE;
  1595   7   39:1     4         FOR PARTYX := 0 TO (PARTYCNT - 1) DO
  1596   7   39:2    17           EQUIPCHR( PARTYX);
  1597   7   39:1    27         IF XGOTO = XEQUIP6 THEN
  1598   7   39:2    34           XGOTO := XINSPCT2
  1599   7   39:1    34         ELSE
  1600   7   39:2    40           XGOTO := XRUNNER
  1601   7   39:0    40       END;
  1602   7   39:0    58       
  1603   7   39:0    58       
  1604   7   40:D     1     PROCEDURE EQUIP1( CHARX : INTEGER);  (* P010128 *)
  1605   7   40:D     2     
  1606   7   40:0     0       BEGIN
  1607   7   40:1     0         EQUIPALL := FALSE;
  1608   7   40:1     4         EQUIPCHR( CHARX);
  1609   7   40:1     7         XGOTO := XBCK2CMP;
  1610   7   40:1    11         BASE04 := CHARX
  1611   7   40:0    11       END;
  1612   7   40:0    26       
  1613   7   40:0    26       
  1614   7   41:D     1     PROCEDURE DSPPARTY;  (* P010129 *)
  1615   7   41:D     1     
  1616   7   41:D     1       VAR
  1617   7   41:D     1            PARTYWIN : TWINDOWP;
  1618   7   41:D     2     
  1619   7   41:0     0       BEGIN
  1620   7   41:1     0         PARTYWIN := GETWIN( 0, 4, 40, 3, 7, TRUE);
  1621   7   41:1    13         FOR PARTYXXX := 0 TO (PARTYCNT - 1) DO
  1622   7   41:2    29           BEGIN
  1623   7   41:3    29             CLEARWIN( PARTYWIN, TRUE);
  1624   7   41:3    34             PRINTSTR( PARTYWIN, CHARACTR[ PARTYXXX].NAME);
  1625   7   41:3    45             WHILE PARTYWIN^.HEAD.HCURSOR <= 15 DO
  1626   7   41:4    55               PRINTCHR( PARTYWIN, ' ');
  1627   7   41:3    62             PRINTCHR( PARTYWIN, 'L');
  1628   7   41:3    67             PRINTNUM( PARTYWIN, CHARACTR[ PARTYXXX].MAXLEVAC, 3);
  1629   7   41:3    81             PRINTCHR( PARTYWIN, ' ');
  1630   7   41:3    86             PRINTSTR( PARTYWIN,
  1631   7   41:3    87                COPY( SCNTOC.ALIGN[ CHARACTR[ PARTYXXX].ALIGN], 1, 1));
  1632   7   41:3   113             PRINTCHR( PARTYWIN, '-');
  1633   7   41:3   118             PRINTSTR( PARTYWIN,
  1634   7   41:3   119                COPY( SCNTOC.CLASS[ CHARACTR[ PARTYXXX].CLASS], 1, 3));
  1635   7   41:3   145             PRINTCHR( PARTYWIN, ' ');
  1636   7   41:3   150             PRINTSTR( PARTYWIN, SCNTOC.RACE[ CHARACTR[ PARTYXXX].RACE]);
  1637   7   41:3   168             EQUIP1( PARTYXXX);
  1638   7   41:2   173           END;
  1639   7   41:1   183         XGOTO := XINSPCT2;
  1640   7   41:1   187         DELWIN( PARTYWIN, TRUE)
  1641   7   41:0   190       END;
  1642   7   41:0   212       
  1643   7   41:0   212 
  1644   7   42:D     1     PROCEDURE REORDER;  (* P01012A *)
  1645   7   42:D     1     
  1646   7   42:D     1       VAR
  1647   7   42:D     1            REORDWIN : TWINDOWP;
  1648   7   42:D     2            SWITCH   : INTEGER;
  1649   7   42:D     3            PARTYNUM : INTEGER;
  1650   7   42:D     4            PARTYX   : INTEGER;
  1651   7   42:D     5            DONE     : BOOLEAN;
  1652   7   42:D     6            LIST     : ARRAY[ 0..5] OF INTEGER;
  1653   7   42:D    12            CHARREC  : TCHAR;
  1654   7   42:D   116            
  1655   7   42:0     0       BEGIN
  1656   7   42:1     0         XGOTO := XINSPCT2;
  1657   7   42:1     4         IF PARTYCNT < 2 THEN
  1658   7   42:2     9           EXIT( REORDER);
  1659   7   42:1    13         REORDWIN := GETWIN( 8, 4, 24, 10, 15, TRUE);
  1660   7   42:1    26         CENTSTR( REORDWIN, 'REORDERING:');
  1661   7   42:1    44         FOR PARTYX := 0 TO PARTYCNT - 1 DO
  1662   7   42:2    58           BEGIN
  1663   7   42:3    58             LIST[ PARTYX] := 99;
  1664   7   42:3    65             MVCURSOR( REORDWIN, 0, PARTYX + 2);
  1665   7   42:3    73             PRINTNUM( REORDWIN, PARTYX + 1, 1);
  1666   7   42:3    81             PRINTCHR( REORDWIN, ')')
  1667   7   42:2    83           END;
  1668   7   42:1    93         FOR PARTYX := 0 TO PARTYCNT - 2 DO
  1669   7   42:2   107           BEGIN
  1670   7   42:3   107             REPEAT
  1671   7   42:4   107               DONE := FALSE;
  1672   7   42:4   110               MVCURSOR( REORDWIN, 1, 2 + PARTYX);
  1673   7   42:4   118               PRINTSTR( REORDWIN, '   ');
  1674   7   42:4   128               MVCURSOR( REORDWIN, 1, 2 + PARTYX);
  1675   7   42:4   136               PRINTSTR( REORDWIN, '>>');
  1676   7   42:4   145               GETKEY;
  1677   7   42:4   148               PARTYNUM := ORD( INCHAR) - ORD( '1');
  1678   7   42:4   153               IF (PARTYNUM >= 0) AND (PARTYNUM < PARTYCNT) THEN
  1679   7   42:5   162                 IF LIST[ PARTYNUM] = 99 THEN
  1680   7   42:6   172                   BEGIN
  1681   7   42:7   172                     LIST[ PARTYNUM] := PARTYX;
  1682   7   42:7   179                     DONE := TRUE
  1683   7   42:6   179                   END
  1684   7   42:3   182             UNTIL DONE;
  1685   7   42:3   185             MVCURSOR( REORDWIN, 1, 2 + PARTYX);
  1686   7   42:3   193             PRINTSTR( REORDWIN, ') ');
  1687   7   42:3   202             PRINTSTR( REORDWIN, CHARACTR[ PARTYNUM].NAME)
  1688   7   42:2   208           END;
  1689   7   42:1   218         FOR PARTYX := 0 TO PARTYCNT - 2 DO
  1690   7   42:2   232           FOR PARTYNUM := PARTYX + 1 TO PARTYCNT - 1 DO
  1691   7   42:3   248             IF LIST[ PARTYNUM] < LIST[ PARTYX] THEN
  1692   7   42:4   263               BEGIN
  1693   7   42:5   263                 CHARREC := CHARACTR[ PARTYX];
  1694   7   42:5   272                 CHARACTR[ PARTYX] := CHARACTR[ PARTYNUM];
  1695   7   42:5   284                 CHARACTR[ PARTYNUM] := CHARREC;
  1696   7   42:5   293                 SWITCH := CHARDISK[ PARTYX];
  1697   7   42:5   302                 CHARDISK[ PARTYX] := CHARDISK[ PARTYNUM];
  1698   7   42:5   316                 CHARDISK[ PARTYNUM] := SWITCH;
  1699   7   42:5   324                 SWITCH := LIST[ PARTYX];
  1700   7   42:5   332                 LIST[ PARTYX] := LIST[ PARTYNUM];
  1701   7   42:5   344                 LIST[ PARTYNUM] := SWITCH
  1702   7   42:4   349               END;
  1703   7   42:1   365         MVCURSOR( REORDWIN, 1, PARTYCNT + 1);
  1704   7   42:1   373         PRINTSTR( REORDWIN, ') ');
  1705   7   42:1   382         PRINTSTR( REORDWIN, CHARACTR[ PARTYCNT - 1].NAME);
  1706   7   42:1   393         DELWIN( REORDWIN, FALSE)
  1707   7   42:0   396       END; (* P01012A *)
  1708   7   42:0   424 
  1709   7   42:0   424 
  1710   7    1:0     0   BEGIN (* UTILITIE *)
  1711   7    1:1     0     CASE XGOTO OF
  1712   7    1:1     5                XCAMPSTF:  MALOR;
  1713   7    1:1     9                XNEWMAZE:  NEWMAZE;
  1714   7    1:1    13       XCMP2EQ6, XEQUIP6:  EQUIP6;
  1715   7    1:1    17                XREORDER:  REORDER;
  1716   7    1:1    21                 XEQPDSP:  BEGIN
  1717   7    1:3    21                             IF BASE04 >= 0 THEN
  1718   7    1:4    26                               EQUIP1( BASE04)
  1719   7    1:3    27                             ELSE
  1720   7    1:4    31                               DSPPARTY
  1721   7    1:2    31                           END;
  1722   7    1:1    35     END
  1723   7    1:0    74   END; (* UTILITIE *)
  1724   7    1:0    86 (*$I WIZ3B:UTILITIE3 *)
  1725   7    1:0    86 
  1725   7    1:0    86 (*$I WIZ3B:SHOPS     *)
  1726   8    1:D     1   SEGMENT PROCEDURE SHOPS;  (* P010201 *)
  1727   8    1:D     1   
  1728   8    2:D     1     PROCEDURE CANT;  (* P010202 *)
  1729   8    2:D     1     
  1730   8    2:D     1       VAR
  1731   8    2:D     1            CANTWIN  : TWINDOWP;
  1732   8    2:D     2            WHOHELP  : INTEGER;
  1733   8    2:D     3            UNUSEDXX : INTEGER;
  1734   8    2:D     4            WHOPAY   : INTEGER;
  1735   8    2:D     5            WHOHELPX : INTEGER;
  1736   8    2:D     6            DISABLED : STRING;
  1737   8    2:D    47            WHO      : TCHAR;
  1738   8    2:D   151     
  1739   8    2:D   151     
  1740   8    3:D     1       PROCEDURE CANTEXIT;  (* P010203 *)
  1741   8    3:D     1       
  1742   8    3:0     0         BEGIN
  1743   8    3:1     0           DELWIN( CANTWIN, FALSE);
  1744   8    3:1     7           EXIT( CANT)
  1745   8    3:0    11         END;
  1746   8    3:0    24         
  1747   8    3:0    24         
  1748   8    4:D     1       PROCEDURE CANTSHOP;  (* P010204 *)
  1749   8    4:D     1       
  1750   8    5:D     1         PROCEDURE DSP2STR( STR1: STRING; STR2: STRING);  (* P010205 *)
  1751   8    5:D    85         
  1752   8    5:0     0           BEGIN
  1753   8    5:1     0             MVCURSOR( CANTWIN, 0, 5);
  1754   8    5:1    18             CENTSTR( CANTWIN, CONCAT('** ', STR1, STR2, ' **') );
  1755   8    5:1    73             PAUSE2;
  1756   8    5:1    76             EXIT( CANTSHOP)
  1757   8    5:0    80           END;
  1758   8    5:0    92           
  1759   8    5:0    92           
  1760   8    6:D     1         PROCEDURE WELCOME;  (* P010206 *)
  1761   8    6:D     1         
  1762   8    6:0     0           BEGIN
  1763   8    6:1     0             CLEARWIN( CANTWIN, TRUE);
  1764   8    6:1     7             CENTSTR(  CANTWIN, 'WELCOME TO THE TEMPLE OF CANT');
  1765   8    6:1    45             PRINTCR(  CANTWIN);
  1766   8    6:1    51             PRINTSTR( CANTWIN, 'WHO SHALL WE HELP ? >');
  1767   8    6:1    81             GETSTR( CANTWIN, DISABLED, 15);
  1768   8    6:1    91             IF DISABLED = '' THEN
  1769   8    6:2   101               CANTEXIT;
  1770   8    6:1   103             WHOHELPX := 0;
  1771   8    6:1   107             MOVELEFT( IOCACHE[ GETREC( ZCHAR, WHOHELPX, SIZEOF( TCHAR))],
  1772   8    6:1   122                       WHO,
  1773   8    6:1   126                       SIZEOF( TCHAR));
  1774   8    6:1   131             WHILE (WHOHELPX < SCNTOC.RECPERDK[ ZCHAR]) AND
  1775   8    6:1   142                   (DISABLED <> WHO.NAME) DO
  1776   8    6:2   153               BEGIN
  1777   8    6:3   153                 WHOHELPX := WHOHELPX + 1;
  1778   8    6:3   161                 MOVELEFT( IOCACHE[ GETREC( ZCHAR, WHOHELPX, SIZEOF( TCHAR))],
  1779   8    6:3   176                           WHO,
  1780   8    6:3   180                           SIZEOF( TCHAR))
  1781   8    6:2   185               END;
  1782   8    6:1   187             IF WHOHELPX = SCNTOC.RECPERDK[ ZCHAR] THEN
  1783   8    6:2   200               DSP2STR( '', 'WHO?');
  1784   8    6:2   212             
  1785   8    6:1   212             IF ((WHO.LOSTXYL.LOCATION[ 1] +
  1786   8    6:1   222                  WHO.LOSTXYL.LOCATION[ 2] +
  1787   8    6:1   233                  WHO.LOSTXYL.LOCATION[ 3] ) <> 0)
  1788   8    6:1   246                      OR
  1789   8    6:1   246                  WHO.INMAZE THEN
  1790   8    6:2   252               DSP2STR( WHO.NAME, ' IS NOT HERE');
  1791   8    6:1   272             IF WHO.STATUS = LOST THEN
  1792   8    6:2   279               DSP2STR( WHO.NAME, ' IS LOST');
  1793   8    6:1   295             IF WHO.STATUS = OK THEN
  1794   8    6:2   302               DSP2STR( WHO.NAME, ' IS OK');
  1795   8    6:1   316             WHOHELP := WHOHELPX
  1796   8    6:0   316           END;
  1797   8    6:0   336           
  1798   8    6:0   336           
  1799   8    7:D     1         PROCEDURE PAYCANT;  (* P010207 *)
  1800   8    7:D     1         
  1801   8    7:D     1           VAR
  1802   8    7:D     1                PAYAMT : TWIZLONG;
  1803   8    7:D     4         
  1804   8    8:D     1           PROCEDURE GETPAYER;  (* P010208 *)
  1805   8    8:D     1           
  1806   8    8:0     0             BEGIN
  1807   8    8:1     0               PAYAMT.HIGH := 0;
  1808   8    8:1     4               PAYAMT.MID := 0;
  1809   8    8:1     8               CASE WHO.STATUS OF
  1810   8    8:1    13                 PLYZE  : PAYAMT.LOW := 100;
  1811   8    8:1    19                 STONED : PAYAMT.LOW := 200;
  1812   8    8:1    27                 DEAD   : PAYAMT.LOW := 250;
  1813   8    8:1    35                 ASHES  : PAYAMT.LOW := 500;
  1814   8    8:1    43               END;
  1815   8    8:1    58               MULTLONG( PAYAMT, WHO.CHARLEV);
  1816   8    8:1    67               CLEARWIN( CANTWIN, TRUE);
  1817   8    8:1    74               PRINTSTR( CANTWIN, 'THE DONATION WILL BE ');
  1818   8    8:1   104               PRNTLONG( CANTWIN, PAYAMT);
  1819   8    8:1   113               PRINTCR(  CANTWIN);
  1820   8    8:1   119               PRINTCR(  CANTWIN);
  1821   8    8:1   125               CENTSTR(  CANTWIN, 'WHO (NUM) WILL TITHE ?');
  1822   8    8:1   156               CENTSTR(  CANTWIN, '(RETURN) EXITS');
  1823   8    8:1   179               REPEAT
  1824   8    8:2   179                 GETKEY;
  1825   8    8:2   182                 IF INCHAR = CHR( CRETURN) THEN
  1826   8    8:3   187                   EXIT( CANTSHOP);
  1827   8    8:2   191                 WHOPAY := ORD( INCHAR) - ORD( '1')
  1828   8    8:1   193               UNTIL (WHOPAY >= 0) AND (WHOPAY < PARTYCNT);
  1829   8    8:1   210               IF TESTLONG( PAYAMT, CHARACTR[ WHOPAY].GOLD) > 0 THEN
  1830   8    8:2   231                 DSP2STR( '', 'CHEAP APOSTATES!');
  1831   8    8:1   255               SUBLONGS( CHARACTR[ WHOPAY].GOLD, PAYAMT)
  1832   8    8:0   267             END;
  1833   8    8:0   284             
  1834   8    8:0   284             
  1835   8    9:D     1           PROCEDURE DOCANT;  (* P010209 *)
  1836   8    9:D     1           
  1837   8   10:D     1             PROCEDURE ASHLOST;  (* P01020A *)
  1838   8   10:D     1             
  1839   8   10:0     0               BEGIN
  1840   8   10:1     0                 IF WHO.STATUS = DEAD THEN
  1841   8   10:2     7                   WHO.STATUS := ASHES
  1842   8   10:1     7                 ELSE
  1843   8   10:2    13                   WHO.STATUS := LOST;
  1844   8   10:1    17                 WHO.INMAZE := FALSE;
  1845   8   10:1    21                 MOVELEFT( WHO,
  1846   8   10:1    25                           IOCACHE[ GETRECW( ZCHAR, WHOHELP, SIZEOF( TCHAR))],
  1847   8   10:1    40                           SIZEOF( TCHAR));
  1848   8   10:1    45                 IF WHO.STATUS = LOST THEN
  1849   8   10:2    52                   DSP2STR( WHO.NAME, ' WILL BE BURIED') 
  1850   8   10:1    73                 ELSE
  1851   8   10:2    77                   DSP2STR( WHO.NAME, ' NEEDS KADORTO NOW')
  1852   8   10:0   101               END; (* ASHLOST *)
  1853   8   10:0   116               
  1854   8   10:0   116               
  1855   8    9:0     0             BEGIN (* DOCANT *)
  1856   8    9:1     0               CLEARWIN( CANTWIN, TRUE);
  1857   8    9:1     7               PRINTSTR( CANTWIN, 'MURMUR - ');
  1858   8    9:1    25               PAUSE2;
  1859   8    9:1    28               PRINTSTR( CANTWIN, 'CHANT - ');
  1860   8    9:1    45               PAUSE2;
  1861   8    9:1    48               PRINTSTR( CANTWIN, 'PRAY - ');
  1862   8    9:1    64               PAUSE2;
  1863   8    9:1    67               PRINTSTR( CANTWIN, 'INVOKE!');
  1864   8    9:1    83               PRINTCR(  CANTWIN);
  1865   8    9:1    89               
  1866   8    9:1    89               IF WHO.STATUS = DEAD THEN
  1867   8    9:2    96                 BEGIN
  1868   8    9:3    96                   IF (RANDOM MOD 100) > (50 + 3 * WHO.ATTRIB[ VITALITY]) THEN
  1869   8    9:4   118                     ASHLOST
  1870   8    9:3   118                   ELSE
  1871   8    9:4   122                     WHO.HPLEFT := 1
  1872   8    9:2   122                 END
  1873   8    9:1   126               ELSE IF WHO.STATUS = ASHES THEN
  1874   8    9:3   135                 BEGIN
  1875   8    9:4   135                   IF (RANDOM MOD 100) > (40 + 3 * WHO.ATTRIB[ VITALITY]) THEN
  1876   8    9:5   157                     ASHLOST
  1877   8    9:4   157                   ELSE
  1878   8    9:5   161                     WHO.HPLEFT := WHO.HPMAX
  1879   8    9:3   161                 END;
  1880   8    9:3   167                 
  1881   8    9:1   167               WHO.AGE := WHO.AGE + (RANDOM MOD 52) + 1;
  1882   8    9:1   183               WHO.STATUS := OK;
  1883   8    9:1   187               MOVELEFT( WHO, 
  1884   8    9:1   191                         IOCACHE[ GETRECW( ZCHAR, WHOHELP, SIZEOF( TCHAR))],
  1885   8    9:1   206                         SIZEOF( TCHAR));
  1886   8    9:1   211               PRINTCR( CANTWIN);
  1887   8    9:1   217               DSP2STR( WHO.NAME, ' IS WELL')
  1888   8    9:0   231             END;
  1889   8    9:0   246             
  1890   8    9:0   246             
  1891   8    7:0     0           BEGIN (* PAYCANT *)
  1892   8    7:1     0             GETPAYER;
  1893   8    7:1     2             DOCANT
  1894   8    7:0     2           END;
  1895   8    7:0    16           
  1896   8    7:0    16           
  1897   8    4:0     0         BEGIN (* CANTSHOP *)
  1898   8    4:1     0           WELCOME;
  1899   8    4:1     2           PAYCANT
  1900   8    4:0     2         END;
  1901   8    4:0    16         
  1902   8    4:0    16         
  1903   8    2:0     0       BEGIN (* CANT *)
  1904   8    2:1     0         XGOTO := XCASTLE;
  1905   8    2:1     4         CANTWIN := GETWIN( 0, 4, 40, 8, 6, TRUE);
  1906   8    2:1    17         REPEAT
  1907   8    2:2    17           CANTSHOP
  1908   8    2:1    17         UNTIL FALSE;
  1909   8    2:1    22         EXIT( SHOPS)
  1910   8    2:0    26       END; (* CANT *)
  1911   8    2:0    40   
  1912   8    2:0    40   
  1913   8   11:D     1     PROCEDURE BOLTAC;  (* P01020B *)
  1914   8   11:D     1     
  1915   8   11:D     1       VAR
  1916   8   11:D     1            BOLTCWIN : TWINDOWP;
  1917   8   11:D     2            INVENTX  : INTEGER;
  1918   8   11:D     3            HALFPRIC : INTEGER;
  1919   8   11:D     4            OBJECT   : TOBJREC;
  1920   8   11:D    43            CHARI    : INTEGER;
  1921   8   11:D    44            UNUSEDXX : ARRAY[ 1..41] OF INTEGER;
  1922   8   11:D    85            
  1923   8   11:D    85            
  1924   8   12:D     1       PROCEDURE DOPLAYER;  (* P01020C *)
  1925   8   12:D     1       
  1926   8   12:D     1         CONST
  1927   8   12:D     1         
  1928   8   12:D     1         (* ACTION *)
  1929   8   12:D     1              SELL     = 0;
  1930   8   12:D     1              UNCURSE  = 1;
  1931   8   12:D     1              IDENTIFY = 2;
  1932   8   12:D     1              BUY      = 3;
  1933   8   12:D     1              POOLGOLD = 4;
  1934   8   12:D     1              LEAVE    = 5;
  1935   8   12:D     1       
  1936   8   12:D     1         VAR
  1937   8   12:D     1             OBJLIST  : ARRAY[ 1..6] OF INTEGER;
  1938   8   12:D     7             UNUSEDXX : INTEGER;
  1939   8   12:D     8             UNUSEDYY : INTEGER;
  1940   8   12:D     9             POSSCNT  : INTEGER;
  1941   8   12:D    10       
  1942   8   12:D    10       
  1943   8   13:D     1         PROCEDURE DOBUY;  (* P01020D *)
  1944   8   13:D     1         
  1945   8   13:D     1           VAR
  1946   8   13:D     1                NOTPURCH : BOOLEAN;
  1947   8   13:D     2                SCROLDIR : INTEGER;
  1948   8   13:D     3                BUYX     : INTEGER;
  1949   8   13:D     4         
  1950   8   13:D     4         
  1951   8   14:D     1           PROCEDURE DSP1OBJ( NUMINDEX: INTEGER;  (* P01020E *)
  1952   8   14:D     2                              INVNTDIR: INTEGER);
  1953   8   14:D     3           
  1954   8   14:0     0             BEGIN
  1955   8   14:1     0               CLRRECT( BOLTCWIN, 0, NUMINDEX - 1, 38, 1);
  1956   8   14:1    12               MVCURSOR( BOLTCWIN, 0, NUMINDEX - 1);
  1957   8   14:1    22               REPEAT
  1958   8   14:2    22                 INVENTX := INVENTX + INVNTDIR;
  1959   8   14:2    30                 IF INVENTX >= SCNTOC.RECPERDK[ ZOBJECT] THEN
  1960   8   14:3    43                   INVENTX := 1
  1961   8   14:2    43                 ELSE IF INVENTX < 1 THEN
  1962   8   14:4    56                   INVENTX := SCNTOC.RECPERDK[ ZOBJECT] - 1;
  1963   8   14:2    68                 MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  1964   8   14:2    72                                            INVENTX,
  1965   8   14:2    75                                            SIZEOF( TOBJREC))],
  1966   8   14:2    81                           OBJECT,
  1967   8   14:2    85                           SIZEOF( TOBJREC))
  1968   8   14:1    88               UNTIL (OBJECT.BOLTACXX > - 2) AND (NOT OBJECT.CURSED) AND
  1969   8   14:1    99                     (OBJECT.BOLTACXX <> 0);
  1970   8   14:1   107                     
  1971   8   14:1   107               OBJLIST[ NUMINDEX] := INVENTX;
  1972   8   14:1   119               PRINTNUM( BOLTCWIN, NUMINDEX, 1);
  1973   8   14:1   127               PRINTCHR( BOLTCWIN, ')');
  1974   8   14:1   134               PRINTSTR( BOLTCWIN, OBJECT.NAME);
  1975   8   14:1   143               MVCURSOR( BOLTCWIN, 15 + 3, NUMINDEX - 1);
  1976   8   14:1   155               PRNTLONG( BOLTCWIN, OBJECT.PRICE);
  1977   8   14:1   164               IF NOT OBJECT.CLASSUSE[ CHARACTR[ CHARI].CLASS] THEN
  1978   8   14:2   183                 PRINTSTR( BOLTCWIN, ' USELESS')
  1979   8   14:0   197             END;
  1980   8   14:0   214             
  1981   8   14:0   214             
  1982   8   15:D     1           PROCEDURE SCROLPOS;  (* P01020F *)
  1983   8   15:D     1           
  1984   8   15:D     1             VAR
  1985   8   15:D     1                  X : INTEGER;
  1986   8   15:D     2           
  1987   8   15:0     0             BEGIN
  1988   8   15:1     0               INVENTX := OBJLIST[ 6] - 1;
  1989   8   15:1    14               FOR X := 1 TO 6 DO
  1990   8   15:2    25                 DSP1OBJ( X, 1);
  1991   8   15:0    36             END;
  1992   8   15:0    50             
  1993   8   15:0    50             
  1994   8   16:D     1           PROCEDURE SCROLNEG;  (* P010210 *)
  1995   8   16:D     1           
  1996   8   16:D     1             VAR
  1997   8   16:D     1                  X : INTEGER;
  1998   8   16:D     2           
  1999   8   16:0     0             BEGIN
  2000   8   16:1     0               INVENTX := OBJLIST[ 1] + 1;
  2001   8   16:1    14               FOR X := 6 DOWNTO 1 DO
  2002   8   16:2    25                 DSP1OBJ( X, -1);
  2003   8   16:0    37             END;
  2004   8   16:0    52           
  2005   8   16:0    52           
  2006   8   17:D     1           PROCEDURE PURCHASE;  (* P010211 *)
  2007   8   17:D     1           
  2008   8   17:D     1             VAR
  2009   8   17:D     1                  INSERTX : INTEGER;
  2010   8   17:D     2           
  2011   8   17:D     2           
  2012   8   18:D     1             PROCEDURE AASTRAA( ASTR: STRING);  (* P010212 *)
  2013   8   18:D    43             
  2014   8   18:0     0               BEGIN
  2015   8   18:1     0                 MVCURSOR( BOLTCWIN, 0, 9);
  2016   8   18:1    13                 CENTSTR( BOLTCWIN, CONCAT( '** ', ASTR, ' **'));
  2017   8   18:1    56                 PAUSE2;
  2018   8   18:1    59                 CLRRECT( BOLTCWIN, 0, 7, 38, 3);
  2019   8   18:1    69                 EXIT( PURCHASE);
  2020   8   18:0    73               END;
  2021   8   18:0    86               
  2022   8   18:0    86               
  2023   8   19:D     1             PROCEDURE ADD2INV( FRSTOBJX: INTEGER);  (* P010213 *)
  2024   8   19:D     2             
  2025   8   19:D     2               VAR
  2026   8   19:D     2                    OBJX : INTEGER;
  2027   8   19:D     3             
  2028   8   19:0     0               BEGIN
  2029   8   19:1     0                 OBJX := FRSTOBJX;
  2030   8   19:1     3                 REPEAT
  2031   8   19:2     3                   OBJX := OBJX + 1;
  2032   8   19:2     8                   IF OBJX = SCNTOC.RECPERDK[ ZOBJECT] THEN
  2033   8   19:3    19                     OBJX := 0;
  2034   8   19:2    22                   MOVELEFT( IOCACHE[ GETREC( ZOBJECT, OBJX, SIZEOF( TOBJREC))],
  2035   8   19:2    33                             OBJECT,
  2036   8   19:2    37                             SIZEOF( TOBJREC));
  2037   8   19:2    40                   IF OBJECT.BOLTACXX < - 1 THEN
  2038   8   19:3    48                     BEGIN
  2039   8   19:4    48                       OBJECT.BOLTACXX := ABS( OBJECT.BOLTACXX);
  2040   8   19:4    55                       MOVELEFT( IOCACHE[ GETRECW( ZOBJECT,
  2041   8   19:4    59                                                   OBJX,
  2042   8   19:4    60                                                   SIZEOF( TOBJREC))],
  2043   8   19:4    66                                 OBJECT,
  2044   8   19:4    70                                 SIZEOF( TOBJREC));
  2045   8   19:4    73                       EXIT( ADD2INV)
  2046   8   19:3    77                     END
  2047   8   19:1    77                 UNTIL OBJX = FRSTOBJX
  2048   8   19:0    78               END;
  2049   8   19:0    96               
  2050   8   19:0    96               
  2051   8   17:0     0             BEGIN (* PURCHASE *)
  2052   8   17:1     0               REPEAT
  2053   8   17:2     0                 NOTPURCH := FALSE;
  2054   8   17:2     4                 MVCURSOR( BOLTCWIN, 0, 7);
  2055   8   17:2    12                 PRINTSTR( BOLTCWIN, 'PURCHASE (NUM) (OR (RETURN)) ? >');
  2056   8   17:2    53                 GETKEY;
  2057   8   17:2    56                 BUYX := ORD( INCHAR) - ORD( '0');
  2058   8   17:2    62                 IF INCHAR = CHR( CRETURN) THEN
  2059   8   17:3    67                   AASTRAA( 'PERHAPS ANOTHER ?')
  2060   8   17:1    87               UNTIL (BUYX > 0) AND (BUYX <= 6);
  2061   8   17:1   102               
  2062   8   17:1   102               MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  2063   8   17:1   106                                          OBJLIST[ BUYX],
  2064   8   17:1   117                                          SIZEOF( TOBJREC))],
  2065   8   17:1   123                         OBJECT,
  2066   8   17:1   127                         SIZEOF( TOBJREC));
  2067   8   17:1   130                         
  2068   8   17:1   130               IF OBJECT.BOLTACXX = 0 THEN
  2069   8   17:2   137                 AASTRAA( 'YOU BOUGHT THE LAST ONE')
  2070   8   17:1   163               ELSE IF CHARACTR[ CHARI].POSS.POSSCNT = 8 THEN
  2071   8   17:3   180                 AASTRAA( 'YOU CANT CARRY ANYTHING MORE')
  2072   8   17:2   211               ELSE IF TESTLONG( CHARACTR[ CHARI].GOLD, OBJECT.PRICE) < 0 THEN
  2073   8   17:4   236                 AASTRAA( 'YOU CANNOT AFFORD IT');
  2074   8   17:4   261                 
  2075   8   17:1   261               IF NOT (OBJECT.CLASSUSE[ CHARACTR[ CHARI].CLASS]) THEN
  2076   8   17:2   280                 BEGIN
  2077   8   17:3   280                   MVCURSOR( BOLTCWIN, 0, 8);
  2078   8   17:3   288                   PRINTSTR( BOLTCWIN,
  2079   8   17:3   291                             'UNUSABLE ITEM - CONFIRM BUY (Y/N) ? >');
  2080   8   17:3   334                   REPEAT
  2081   8   17:4   334                     GETKEY
  2082   8   17:3   334                   UNTIL (INCHAR = 'Y') OR (INCHAR = 'N');
  2083   8   17:3   346                   IF INCHAR = 'N' THEN
  2084   8   17:4   351                     AASTRAA( 'WE ALL MAKE MISTAKES')
  2085   8   17:2   374                 END
  2086   8   17:1   376               ELSE
  2087   8   17:2   378                 INCHAR := ' ';
  2088   8   17:1   381               SUBLONGS( CHARACTR[ CHARI].GOLD, OBJECT.PRICE);
  2089   8   17:1   396               INSERTX := CHARACTR[ CHARI].POSS.POSSCNT + 1;
  2090   8   17:1   409               
  2091   8   17:1   409               WITH CHARACTR[ CHARI].POSS.POSSESS[ INSERTX] DO
  2092   8   17:2   425                 BEGIN
  2093   8   17:3   425                   EQUIPED := FALSE;
  2094   8   17:3   428                   IDENTIF := TRUE;
  2095   8   17:3   433                   CURSED  := FALSE;
  2096   8   17:3   438                   EQINDEX := OBJLIST[ BUYX] + 1000;
  2097   8   17:2   457                 END;
  2098   8   17:1   457               CHARACTR[ CHARI].POSS.POSSCNT := INSERTX;
  2099   8   17:1   468               IF OBJECT.BOLTACXX > 0 THEN
  2100   8   17:2   475                 OBJECT.BOLTACXX := OBJECT.BOLTACXX - 1;
  2101   8   17:1   483               MOVELEFT( OBJECT,
  2102   8   17:1   487                         IOCACHE[ GETRECW( ZOBJECT,
  2103   8   17:1   491                                           OBJLIST[ BUYX],
  2104   8   17:1   502                                           SIZEOF( TOBJREC))],
  2105   8   17:1   508                         SIZEOF( TOBJREC));
  2106   8   17:1   511               IF OBJECT.BOLTACXX = 0 THEN
  2107   8   17:2   518                 ADD2INV( OBJLIST[ BUYX]);
  2108   8   17:1   531               IF ORD( INCHAR) = ORD( 'Y') THEN
  2109   8   17:2   536                 AASTRAA( 'ITS YOUR MONEY')
  2110   8   17:1   553               ELSE
  2111   8   17:2   557                 AASTRAA( 'JUST WHAT YOU NEEDED')
  2112   8   17:0   580             END; (* PURCHASE *)
  2113   8   17:0   598             
  2114   8   17:0   598             
  2115   8   13:0     0           BEGIN (* DOBUY *)
  2116   8   13:1     0             INVENTX := 1;
  2117   8   13:1     4             NOTPURCH := TRUE;
  2118   8   13:1     7             OBJLIST[ 1] := 1;
  2119   8   13:1    17             OBJLIST[ 6] := 1;
  2120   8   13:1    27             SCROLDIR := 1;
  2121   8   13:1    30             CLEARWIN( BOLTCWIN, TRUE);
  2122   8   13:1    37             REPEAT
  2123   8   13:2    37               IF NOTPURCH THEN
  2124   8   13:3    40                 IF SCROLDIR = 1 THEN
  2125   8   13:4    45                   SCROLPOS
  2126   8   13:3    45                 ELSE
  2127   8   13:4    49                   SCROLNEG;
  2128   8   13:2    51               NOTPURCH := TRUE;
  2129   8   13:2    54               SCROLDIR := 1;
  2130   8   13:2    57               CLRRECT( BOLTCWIN, 0, 7, 38, 5);
  2131   8   13:2    67               MVCURSOR( BOLTCWIN, 0, 7);
  2132   8   13:2    75               PRNTLONG( BOLTCWIN, CHARACTR[ CHARI].GOLD);
  2133   8   13:2    90               PRINTSTR( BOLTCWIN, ' GP LEFT');
  2134   8   13:2   107               MVCURSOR( BOLTCWIN, 0, 10);
  2135   8   13:2   115               BASE04 := MENU( BOLTCWIN,
  2136   8   13:2   118                               'P)URCHASE/F)ORWARD/B)ACKWARD/S)TART/L)EAVE');
  2137   8   13:2   170               CLRRECT( BOLTCWIN, 0, 7, 38, 5);
  2138   8   13:2   180               CASE BASE04 OF
  2139   8   13:2   183                 0: PURCHASE;
  2140   8   13:2   187                 3: OBJLIST[ 6] := 1;
  2141   8   13:2   199                 2: SCROLDIR := - 1;
  2142   8   13:2   205               END;
  2143   8   13:1   220             UNTIL BASE04 = 4
  2144   8   13:0   221           END;
  2145   8   13:0   240           
  2146   8   13:0   240           
  2147   8   20:D     1         PROCEDURE SELLIDUN( ACTION: INTEGER);  (* P010214 *)
  2148   8   20:D     2         
  2149   8   20:D     2           VAR
  2150   8   20:D     2                UNUSEDXX : ARRAY[ 1..3] OF INTEGER;
  2151   8   20:D     5                TRANOBJX : INTEGER;
  2152   8   20:D     6         
  2153   8   20:D     6         
  2154   8   21:D     1           PROCEDURE LISTPOSS;  (* P010215 *)
  2155   8   21:D     1           
  2156   8   21:0     0             BEGIN
  2157   8   21:1     0               CLEARWIN( BOLTCWIN, TRUE);
  2158   8   21:1     7               POSSCNT := CHARACTR[ CHARI].POSS.POSSCNT;
  2159   8   21:1    19               FOR TRANOBJX := 1 TO POSSCNT DO
  2160   8   21:2    35                 BEGIN
  2161   8   21:3    35                   OBJLIST[ TRANOBJX] :=
  2162   8   21:3    45                     CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].EQINDEX - 1000;
  2163   8   21:3    67                   MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  2164   8   21:3    71                                              OBJLIST[ TRANOBJX],
  2165   8   21:3    82                                              SIZEOF( TOBJREC))],
  2166   8   21:3    88                             OBJECT,
  2167   8   21:3    92                             SIZEOF( TOBJREC));
  2168   8   21:3    95                   PRINTNUM( BOLTCWIN, TRANOBJX, 1);
  2169   8   21:3   105                   PRINTSTR( BOLTCWIN, ') ');
  2170   8   21:3   116                   IF CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].IDENTIF THEN
  2171   8   21:4   135                     PRINTSTR( BOLTCWIN, OBJECT.NAME)
  2172   8   21:3   141                   ELSE
  2173   8   21:4   146                     PRINTSTR( BOLTCWIN, OBJECT.NAMEUNK);
  2174   8   21:3   155                   MVCURSOR( BOLTCWIN, 15 + 4, BOLTCWIN^.HEAD.VCURSOR);
  2175   8   21:3   172                   DIVLONG( OBJECT.PRICE, HALFPRIC);
  2176   8   21:3   181                   IF ACTION = SELL THEN
  2177   8   21:4   188                     BEGIN
  2178   8   21:5   188                       IF NOT (CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].IDENTIF)
  2179   8   21:5   204                       THEN
  2180   8   21:6   208                         BEGIN
  2181   8   21:7   208                           OBJECT.PRICE.HIGH := 0;
  2182   8   21:7   212                           OBJECT.PRICE.MID  := 0;
  2183   8   21:7   216                           OBJECT.PRICE.LOW  := 0
  2184   8   21:6   216                         END
  2185   8   21:4   220                     END
  2186   8   21:3   220                   ELSE
  2187   8   21:4   222                     IF OBJECT.PRICE.HIGH +
  2188   8   21:4   225                        OBJECT.PRICE.MID +
  2189   8   21:4   229                        OBJECT.PRICE.LOW = 0 THEN
  2190   8   21:5   237                          OBJECT.PRICE.MID := 15;
  2191   8   21:3   241                   PRNTLONG( BOLTCWIN, OBJECT.PRICE);
  2192   8   21:3   250                   PRINTCR( BOLTCWIN)
  2193   8   21:2   253                 END
  2194   8   21:0   256             END;
  2195   8   21:0   282             
  2196   8   21:0   282             
  2197   8   22:D     1           PROCEDURE TRANSACT;  (* P010216 *)
  2198   8   22:D     1           
  2199   8   22:D     1             VAR
  2200   8   22:D     1                  POSSX : INTEGER;
  2201   8   22:D     2           
  2202   8   23:D     1             PROCEDURE AASTRAA( ASTR: STRING);  (* P010217 *)
  2203   8   23:D    43             
  2204   8   23:0     0               BEGIN
  2205   8   23:1     0                 MVCURSOR( BOLTCWIN, 0, 11);
  2206   8   23:1    13                 CENTSTR( BOLTCWIN, CONCAT( '** ', ASTR, ' **'));
  2207   8   23:1    56                 EXIT( TRANSACT)
  2208   8   23:0    60               END;
  2209   8   23:0    72               
  2210   8   23:0    72               
  2211   8   22:0     0             BEGIN (* TRANSACT *)
  2212   8   22:1     0               MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  2213   8   22:1     4                                          OBJLIST[ TRANOBJX],
  2214   8   22:1    15                                          SIZEOF( TOBJREC))],
  2215   8   22:1    21                         OBJECT,
  2216   8   22:1    25                         SIZEOF( TOBJREC));
  2217   8   22:1    28               DIVLONG( OBJECT.PRICE, HALFPRIC);
  2218   8   22:1    37               IF (ACTION = IDENTIFY) OR (ACTION = UNCURSE) THEN
  2219   8   22:2    50                 IF (OBJECT.PRICE.HIGH +
  2220   8   22:2    53                     OBJECT.PRICE.MID +
  2221   8   22:2    57                     OBJECT.PRICE.LOW) = 0 THEN
  2222   8   22:3    65                   OBJECT.PRICE.MID := 15;
  2223   8   22:3    69                   
  2224   8   22:1    69               IF ACTION = SELL THEN
  2225   8   22:2    76                 BEGIN
  2226   8   22:3    76                   IF NOT CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].IDENTIF THEN
  2227   8   22:4    96                     BEGIN
  2228   8   22:5    96                       OBJECT.PRICE.HIGH := 0;
  2229   8   22:5   100                       OBJECT.PRICE.MID  := 0;
  2230   8   22:5   104                       OBJECT.PRICE.LOW  := 0;
  2231   8   22:4   108                     END;
  2232   8   22:3   108                   IF (OBJECT.PRICE.HIGH +
  2233   8   22:3   111                       OBJECT.PRICE.MID +
  2234   8   22:3   115                       OBJECT.PRICE.LOW) = 0 THEN
  2235   8   22:4   123                     AASTRAA( 'NOT INTERESTED IN THAT')
  2236   8   22:3   148                   ELSE
  2237   8   22:4   152                     IF CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].CURSED THEN
  2238   8   22:5   171                       AASTRAA( 'WE DONT BUY CURSED ITEMS')
  2239   8   22:2   198                 END
  2240   8   22:1   200               ELSE
  2241   8   22:2   202                 BEGIN
  2242   8   22:3   202                   IF NOT (CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].CURSED) AND
  2243   8   22:3   220                      (ACTION = UNCURSE) THEN
  2244   8   22:4   228                     AASTRAA( 'THAT IS NOT A CURSED ITEM');
  2245   8   22:4   258                     
  2246   8   22:3   258                   IF CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].IDENTIF AND
  2247   8   22:3   275                       (ACTION = IDENTIFY) THEN
  2248   8   22:4   283                     AASTRAA( 'THAT HAS BEEN IDENTIFIED');
  2249   8   22:4   312                     
  2250   8   22:3   312                   IF TESTLONG( CHARACTR[ CHARI].GOLD, OBJECT.PRICE) < 0 THEN
  2251   8   22:4   333                     AASTRAA( 'YOU CANT AFFORD THE FEE');
  2252   8   22:2   361                 END;
  2253   8   22:2   361               
  2254   8   22:1   361               IF ACTION = SELL THEN
  2255   8   22:2   368                 ADDLONGS( CHARACTR[ CHARI].GOLD, OBJECT.PRICE)
  2256   8   22:1   380               ELSE
  2257   8   22:2   385                 SUBLONGS( CHARACTR[ CHARI].GOLD, OBJECT.PRICE);
  2258   8   22:2   400                 
  2259   8   22:1   400               IF ACTION = IDENTIFY THEN
  2260   8   22:2   407                 CHARACTR[ CHARI].POSS.POSSESS[ TRANOBJX].IDENTIF := TRUE
  2261   8   22:1   425               ELSE
  2262   8   22:2   429                 BEGIN
  2263   8   22:3   429                   IF TRANOBJX < CHARACTR[ CHARI].POSS.POSSCNT THEN
  2264   8   22:4   444                     FOR POSSX := (TRANOBJX + 1) TO
  2265   8   22:4   451                                    CHARACTR[ CHARI].POSS.POSSCNT DO
  2266   8   22:5   467                       CHARACTR[ CHARI].POSS.POSSESS[ POSSX - 1] :=
  2267   8   22:5   483                         CHARACTR[ CHARI].POSS.POSSESS[ POSSX];
  2268   8   22:5   506                         
  2269   8   22:3   506                   CHARACTR[ CHARI].POSS.POSSCNT :=
  2270   8   22:3   515                                              CHARACTR[ CHARI].POSS.POSSCNT - 1;
  2271   8   22:3   527                   MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  2272   8   22:3   531                                              OBJLIST[ TRANOBJX],
  2273   8   22:3   542                                              SIZEOF( TOBJREC))],
  2274   8   22:3   548                             OBJECT,
  2275   8   22:3   552                             SIZEOF( TOBJREC));
  2276   8   22:3   555                   IF ACTION = SELL THEN
  2277   8   22:4   562                     BEGIN
  2278   8   22:5   562                       IF OBJECT.BOLTACXX < - 1 THEN
  2279   8   22:6   570                         OBJECT.BOLTACXX := 1 - OBJECT.BOLTACXX
  2280   8   22:5   571                       ELSE
  2281   8   22:6   580                         IF OBJECT.BOLTACXX > - 1 THEN
  2282   8   22:7   588                           OBJECT.BOLTACXX := OBJECT.BOLTACXX + 1;
  2283   8   22:4   596                     END;
  2284   8   22:4   596                     
  2285   8   22:3   596                   MOVELEFT( OBJECT,
  2286   8   22:3   600                             IOCACHE[ GETRECW( ZOBJECT,
  2287   8   22:3   604                                               OBJLIST[ TRANOBJX],
  2288   8   22:3   615                                               SIZEOF( TOBJREC))],
  2289   8   22:3   621                             SIZEOF( TOBJREC));
  2290   8   22:2   624                 END;
  2291   8   22:2   624                 
  2292   8   22:1   624               MVCURSOR( BOLTCWIN, 0, 11);
  2293   8   22:1   632               CENTSTR( BOLTCWIN, '** ANYTHING ELSE, SIRE? **');
  2294   8   22:1   667               PAUSE2;
  2295   8   22:1   670               LISTPOSS
  2296   8   22:0   670             END; (* TRANSACT *)
  2297   8   22:0   690             
  2298   8   22:0   690             
  2299   8   20:0     0           BEGIN (* SELLIDUN *)
  2300   8   20:1     0             LISTPOSS;
  2301   8   20:1     2             REPEAT
  2302   8   20:2     2               IF POSSCNT = 0 THEN
  2303   8   20:3     9                 EXIT( SELLIDUN);
  2304   8   20:2    13               MVCURSOR( BOLTCWIN, 0, 9);
  2305   8   20:2    21               CLRRECT( BOLTCWIN, 0, 9, 38, 3);
  2306   8   20:2    31               IF ACTION = SELL THEN
  2307   8   20:3    36                 PRINTSTR( BOLTCWIN, 'SELL')
  2308   8   20:2    46               ELSE IF ACTION = UNCURSE THEN
  2309   8   20:4    56                 PRINTSTR( BOLTCWIN, 'UNCURSE')
  2310   8   20:3    69               ELSE
  2311   8   20:4    74                 PRINTSTR( BOLTCWIN, 'INDENTIFY');
  2312   8   20:2    92               PRINTSTR( BOLTCWIN, ' WHICH (NUM) ? >');
  2313   8   20:2   117               GETKEY;
  2314   8   20:2   120               IF ORD( INCHAR) = CRETURN THEN
  2315   8   20:3   125                 EXIT( SELLIDUN);
  2316   8   20:2   129               TRANOBJX := ORD( INCHAR) - ORD( '0');
  2317   8   20:2   134               IF (TRANOBJX > 0) AND (TRANOBJX <= POSSCNT) THEN
  2318   8   20:3   145                 TRANSACT
  2319   8   20:1   145             UNTIL FALSE
  2320   8   20:0   147           END;
  2321   8   20:0   164           
  2322   8   20:0   164           
  2323   8   12:0     0         BEGIN (* DOPLAYER *)
  2324   8   12:1     0           REPEAT
  2325   8   12:2     0             CLEARWIN( BOLTCWIN, TRUE);
  2326   8   12:2     7             PRINTSTR( BOLTCWIN, ' WELCOME ');
  2327   8   12:2    25             PRINTSTR( BOLTCWIN, CHARACTR[ CHARI].NAME);
  2328   8   12:2    38             PRINTCR(  BOLTCWIN);
  2329   8   12:2    44             PRINTSTR( BOLTCWIN, 'YOU HAVE ');
  2330   8   12:2    62             PRNTLONG( BOLTCWIN, CHARACTR[ CHARI].GOLD);
  2331   8   12:2    77             PRINTSTR( BOLTCWIN, ' GP.');
  2332   8   12:2    90             PRINTCR(  BOLTCWIN);
  2333   8   12:2    96             PRINTCR(  BOLTCWIN);
  2334   8   12:2   102             BASE04 := MENU( BOLTCWIN,
  2335   8   12:2   105                            'B)UY/S)ELL/U)NCURSE/I)DENTIFY/P)OOL GOLD/L)EAVE');
  2336   8   12:2   162             CASE BASE04 OF
  2337   8   12:2   165               2: SELLIDUN( UNCURSE);
  2338   8   12:2   170               3: SELLIDUN( IDENTIFY);
  2339   8   12:2   175               1: SELLIDUN( SELL);
  2340   8   12:2   180               0: DOBUY;
  2341   8   12:2   184               4: BEGIN
  2342   8   12:4   184                    FOR BASE04 := 0 TO PARTYCNT - 1 DO 
  2343   8   12:5   197                      IF BASE04 <> CHARI THEN
  2344   8   12:6   204                        BEGIN
  2345   8   12:7   204                          WITH CHARACTR[ BASE04].GOLD DO
  2346   8   12:8   213                            BEGIN
  2347   8   12:9   213                              ADDLONGS( CHARACTR[ CHARI].GOLD,
  2348   8   12:9   222                                        CHARACTR[ BASE04].GOLD);
  2349   8   12:9   232                              HIGH := 0;
  2350   8   12:9   237                              MID  := 0;
  2351   8   12:9   242                              LOW  := 0
  2352   8   12:8   243                            END;
  2353   8   12:6   245                        END;
  2354   8   12:3   252                  END;
  2355   8   12:2   254               5: EXIT( DOPLAYER);
  2356   8   12:2   260             END
  2357   8   12:1   280           UNTIL FALSE
  2358   8   12:0   280         END; (* DOPLAYER *)
  2359   8   12:0   300         
  2360   8   12:0   300         
  2361   8   11:0     0       BEGIN (* BOLTAC *)
  2362   8   11:1     0         HALFPRIC := 2;
  2363   8   11:1     3         XGOTO := XCASTLE;
  2364   8   11:1     7         BOLTCWIN := GETWIN( 0, 2, 40, 14, 8, TRUE);
  2365   8   11:1    20         REPEAT
  2366   8   11:2    20           CLEARWIN( BOLTCWIN, TRUE);
  2367   8   11:2    25           CENTSTR( BOLTCWIN, 'WELCOME TO BOLTAC''S TRADING POST');
  2368   8   11:2    64           PRINTCR( BOLTCWIN);
  2369   8   11:2    68           CENTSTR( BOLTCWIN, 'WHO (NUM) WILL ENTER');
  2370   8   11:2    95           CENTSTR( BOLTCWIN, '(RETURN) EXITS');
  2371   8   11:2   116           REPEAT
  2372   8   11:3   116             GETKEY;
  2373   8   11:3   119             IF INCHAR = CHR( CRETURN) THEN
  2374   8   11:4   124               BEGIN
  2375   8   11:5   124                 DELWIN( BOLTCWIN, FALSE);
  2376   8   11:5   130                 EXIT( SHOPS)
  2377   8   11:4   134               END;
  2378   8   11:3   134             CHARI := ORD( INCHAR) - ORD( '1');
  2379   8   11:2   139           UNTIL (CHARI >= 0) AND (CHARI < PARTYCNT);
  2380   8   11:2   150           DOPLAYER
  2381   8   11:1   150         UNTIL FALSE
  2382   8   11:0   152       END;
  2383   8   11:0   172       
  2384   8   11:0   172 (*$I WIZ3B:SHOPS     *)
  2384   8   11:0   172 (*$I WIZ3A:SHOPS2    *)
  2385   8   24:D     1     PROCEDURE CEMETARY;  (* P010218 *)
  2386   8   24:D     1     
  2387   8   24:D     1       VAR
  2388   8   24:D     1            TWO  : INTEGER;
  2389   8   24:D     2            DUMB : ARRAY[ 1..6] OF INTEGER;
  2390   8   24:D     8            
  2391   8   24:D     8            
  2392   8   25:D     1       PROCEDURE TOMBSTON( CHARI : INTEGER);  (* P010219 *)
  2393   8   25:D     2       
  2394   8   25:D     2         VAR
  2395   8   25:D     2             VPOS : INTEGER;
  2396   8   25:D     3             HPOS : INTEGER;
  2397   8   25:D     4       
  2398   8   25:0     0         BEGIN
  2399   8   25:1     0           HPOS := 18 * (CHARI MOD 2);
  2400   8   25:1     7           VPOS := 4 * (CHARI DIV 2) + 3;
  2401   8   25:1    16           
  2402   8   25:1    16           MVCURSOR( MAINWIN, HPOS, VPOS);
  2403   8   25:1    24           PRINTCHR( MAINWIN, CHR( 174));   (*  AE *)
  2404   8   25:1    33           PRINTCHR( MAINWIN, CHR( 175));   (*  AF *)
  2405   8   25:1    42           
  2406   8   25:1    42           MVCURSOR( MAINWIN, HPOS, VPOS + 1);
  2407   8   25:1    52           PRINTCHR( MAINWIN, CHR( 176));   (*  B0 *)
  2408   8   25:1    61           PRINTCHR( MAINWIN, CHR( 177));   (*  B1 *)
  2409   8   25:1    70           
  2410   8   25:1    70           MVCURSOR( MAINWIN, HPOS, VPOS + 2);
  2411   8   25:1    80           PRINTCHR( MAINWIN, CHR( 178));   (*  B2 *)
  2412   8   25:1    89           PRINTCHR( MAINWIN, CHR( 179));   (*  B3 *)
  2413   8   25:1    98           
  2414   8   25:1    98           MVCURSOR( MAINWIN, HPOS + 2, VPOS + 1);
  2415   8   25:1   110           PRINTSTR( MAINWIN, CHARACTR[ CHARI].NAME)
  2416   8   25:0   118         END;
  2417   8   25:0   134         
  2418   8   25:0   134         
  2419   8   26:D     1       PROCEDURE BADSTUFF;  (* P01021A *)
  2420   8   26:D     1       
  2421   8   26:D     1       
  2422   8   27:D     1         PROCEDURE BREAKPOS;  (* P01021B *)
  2423   8   27:D     1         
  2424   8   27:D     1           VAR
  2425   8   27:D     1                X     : INTEGER;
  2426   8   27:D     2                POSSX : INTEGER;
  2427   8   27:D     3         
  2428   8   27:0     0           BEGIN
  2429   8   27:1     0             WITH CHARACTR[ BASE04] DO
  2430   8   27:2     7               BEGIN
  2431   8   27:3     7                 FOR POSSX := 1 TO POSS.POSSCNT DO
  2432   8   27:4    20                   BEGIN
  2433   8   27:5    20                     IF NOT POSS.POSSESS[ POSSX].CURSED THEN
  2434   8   27:6    32                       IF (RANDOM MOD 21 > ATTRIB[ LUCK]) OR
  2435   8   27:6    48                          (POSS.POSSESS[ POSSX].EQINDEX <= SHIPBOTT) THEN
  2436   8   27:7    64                         POSS.POSSESS[ POSSX].EQINDEX := 1000;
  2437   8   27:4    78                   END;
  2438   8   27:3    85                 X := 0;
  2439   8   27:3    88                 FOR POSSX := 1 TO POSS.POSSCNT DO
  2440   8   27:4   101                   IF POSS.POSSESS[ POSSX].EQINDEX > 1000 THEN
  2441   8   27:5   116                     BEGIN
  2442   8   27:6   116                       X := X + 1;
  2443   8   27:6   121                       POSS.POSSESS[ X] := POSS.POSSESS[ POSSX]
  2444   8   27:5   137                     END;
  2445   8   27:3   146                 POSS.POSSCNT := X
  2446   8   27:2   149             END
  2447   8   27:0   151           END;
  2448   8   27:0   168           
  2449   8   27:0   168           
  2450   8   26:0     0         BEGIN (* BADSTUFF *)
  2451   8   26:1     0           TWO := 2;
  2452   8   26:1     4           FOR BASE04 := 0 TO PARTYCNT - 1 DO
  2453   8   26:2    17             BEGIN
  2454   8   26:3    17               WITH CHARACTR[ BASE04] DO
  2455   8   26:4    24                 BEGIN
  2456   8   26:5    24                   IF STATUS < DEAD THEN
  2457   8   26:6    31                     STATUS := DEAD;
  2458   8   26:5    36                   INMAZE := FALSE;
  2459   8   26:5    41                   DIVLONG( GOLD, TWO);
  2460   8   26:5    50                   BREAKPOS;
  2461   8   26:5    52                   IF (RANDOM MOD 50) < MAZELEV THEN
  2462   8   26:6    63                     STATUS := LOST
  2463   8   26:5    66                   ELSE
  2464   8   26:6    70                     BEGIN
  2465   8   26:7    70                       LOSTXYL.LOCATION[ 1] := MAZEX;
  2466   8   26:7    80                       LOSTXYL.LOCATION[ 2] := MAZEY;
  2467   8   26:7    90                       LOSTXYL.LOCATION[ 3] := MAZELEV
  2468   8   26:6    98                     END;
  2469   8   26:5   100                   MOVELEFT( CHARACTR[ BASE04],
  2470   8   26:5   106                             IOCACHE[ GETRECW( ZCHAR,
  2471   8   26:5   110                                               CHARDISK[ BASE04],
  2472   8   26:5   117                                               SIZEOF( TCHAR))],
  2473   8   26:5   125                             SIZEOF( TCHAR));
  2474   8   26:4   130                 END;
  2475   8   26:2   130             END;
  2476   8   26:1   137             MOVELEFT( IOCACHE[ GETREC(  ZZERO, 0, SIZEOF( TSCNTOC))],
  2477   8   26:1   150                       SCNTOC,
  2478   8   26:1   154                       SIZEOF( TSCNTOC))
  2479   8   26:0   159         END;
  2480   8   26:0   174         
  2481   8   26:0   174         
  2482   8   24:0     0       BEGIN (* CEMETARY *)
  2483   8   24:1     0         BADSTUFF;
  2484   8   24:1     2         DELWIN( CHARSWIN, FALSE);
  2485   8   24:1     9         CLEARWIN( MAINWIN, TRUE);
  2486   8   24:1    16         FILLCHAR( DUMB, 12, 0);
  2487   8   24:1    23         TEMPWIN := GETWIN( 0, 20, 40, 4, 1, TRUE);
  2488   8   24:1    37         PRINTSTR( TEMPWIN, 'YOUR ENTIRE PARTY HAS BEEN SLAUGHTERED');
  2489   8   24:1    84         PRINTSTR( TEMPWIN, ' PRESS (RETURN) TO LEAVE THE CEMETERY');
  2490   8   24:1   130         FOR BASE04 := 0 TO PARTYCNT - 1 DO
  2491   8   24:2   143           TOMBSTON( BASE04);
  2492   8   24:1   153         DELWIN( TEMPWIN, FALSE);
  2493   8   24:1   160         GETCR;
  2494   8   24:1   163         PARTYCNT := 0;
  2495   8   24:1   166         XGOTO := XCASTLE;
  2496   8   24:1   170         EXIT( SHOPS)
  2497   8   24:0   174       END;
  2498   8   24:0   188   
  2499   8   24:0   188   
  2500   8   28:D     1     PROCEDURE EDGETOWN;  (*  P01021C *)
  2501   8   28:D     1     
  2502   8   28:D     1     
  2503   8   29:D     1       PROCEDURE ENTMAZE;  (* P01021D *)
  2504   8   29:D     1       
  2505   8   29:D     1         VAR
  2506   8   29:D     1              UNUSEDXX : ARRAY[ 1..106] OF INTEGER;
  2507   8   29:D   107              X : INTEGER;
  2508   8   29:D   108       
  2509   8   29:0     0         BEGIN
  2510   8   29:1     0           DELWIN( CASTTIT, FALSE);
  2511   8   29:1     7           TEMPWIN := GETWIN( 0, 10, 40, 4, 6, TRUE);
  2512   8   29:1    21           CENTSTR( TEMPWIN, 'ENTERING');
  2513   8   29:1    38           CENTSTR( TEMPWIN, SCNTOC.GAMENAME);
  2514   8   29:1    47           DELWIN( TEMPWIN, FALSE);
  2515   8   29:1    54           XGOTO := XNEWMAZE;
  2516   8   29:1    58           SAVEX   := 0;
  2517   8   29:1    62           SAVEY   := 0;
  2518   8   29:1    66           SAVELEV := 0;
  2519   8   29:1    70           MAZEX   := 0;
  2520   8   29:1    73           MAZEY   := 0;
  2521   8   29:1    76           MAZELEV := -1;
  2522   8   29:1    80           DIRECTIO := 0;
  2523   8   29:1    83           FOR X := 0 TO PARTYCNT - 1 DO
  2524   8   29:2    98             MOVELEFT( CHARACTR[ X],
  2525   8   29:2   105                       IOCACHE[ GETRECW( ZCHAR, CHARDISK[ X], SIZEOF( TCHAR))],
  2526   8   29:2   125                       SIZEOF( TCHAR));
  2527   8   29:1   138           EXIT( SHOPS)
  2528   8   29:0   142         END;
  2529   8   29:0   156         
  2530   8   29:0   156         
  2531   8   30:D     1       PROCEDURE UPDCHARS;  (* P01021E *)
  2532   8   30:D     1       
  2533   8   30:D     1         VAR
  2534   8   30:D     1              X : INTEGER;
  2535   8   30:D     2       
  2536   8   30:0     0         BEGIN
  2537   8   30:1     0           FOR X := 0 TO PARTYCNT - 1 DO
  2538   8   30:2    13             BEGIN
  2539   8   30:3    13               CHARACTR[ X].INMAZE := FALSE;
  2540   8   30:3    22               MOVELEFT( CHARACTR[ X],
  2541   8   30:3    28                         IOCACHE[ GETRECW( ZCHAR,
  2542   8   30:3    32                                           CHARDISK[ X],
  2543   8   30:3    39                                           SIZEOF( TCHAR))],
  2544   8   30:3    47                         SIZEOF( TCHAR));
  2545   8   30:2    52             END;
  2546   8   30:1    59           PARTYCNT := 0;
  2547   8   30:1    62           MOVELEFT( IOCACHE[ GETREC( ZZERO, 0, SIZEOF( TSCNTOC))],
  2548   8   30:1    75                     X,
  2549   8   30:1    78                     2);
  2550   8   30:1    81           EXIT( SHOPS)
  2551   8   30:0    85         END;
  2552   8   30:0   100         
  2553   8   30:0   100         
  2554   8   31:D     1       PROCEDURE DEL2WINS;  (* P01021F *)
  2555   8   31:D     1       
  2556   8   31:0     0         BEGIN
  2557   8   31:1     0           DELWIN( CASTTIT, FALSE);
  2558   8   31:1     7           DELWIN( CHARSWIN, FALSE)
  2559   8   31:0    11         END;
  2560   8   31:0    26         
  2561   8   31:0    26         
  2562   8   28:0     0       BEGIN (* EDGETOWN *)
  2563   8   28:1     0         REPEAT
  2564   8   28:2     0           TEMPWIN := GETWIN( 10, 4, 20, 6, 6, TRUE);
  2565   8   28:2    14           BASE04 := MENU( TEMPWIN,
  2566   8   28:2    17                           'T)RAINING GROUNDS/M)AZE/C)ASTLE/L)EAVE GAME');
  2567   8   28:2    70           DELWIN( TEMPWIN, TRUE);
  2568   8   28:1    77         UNTIL NOT ((BASE04 = 1) AND (PARTYCNT = 0));
  2569   8   28:1    87         CASE BASE04 OF
  2570   8   28:1    90           0:  BEGIN
  2571   8   28:3    90                 DEL2WINS;
  2572   8   28:3    92                 XGOTO := XTRAININ
  2573   8   28:2    92               END;
  2574   8   28:1    98           1:  ENTMAZE;
  2575   8   28:1   102           2:  BEGIN
  2576   8   28:3   102                 XGOTO := XCASTLE;
  2577   8   28:3   106                 EXIT( SHOPS);
  2578   8   28:2   110               END;
  2579   8   28:1   112           3:  BEGIN
  2580   8   28:3   112                 DEL2WINS;
  2581   8   28:3   114                 XGOTO := XDONE
  2582   8   28:2   114               END;
  2583   8   28:1   120         END;
  2584   8   28:1   136         UPDCHARS
  2585   8   28:0   136       END;
  2586   8   28:0   152   
  2587   8   28:0   152   
  2588   8   32:D     1     PROCEDURE CHK4WIN;  (* P010220 *)
  2589   8   32:D     1     
  2590   8   32:D     1       VAR
  2591   8   32:D     1           ORBPOSX  : INTEGER;
  2592   8   32:D     2           POSSI    : INTEGER;   (* MULTIPLE USES *)
  2593   8   32:D     3           CHARX    : INTEGER;
  2594   8   32:D     4           THISCHAR : TCHAR;
  2595   8   32:D   108           BGOTORB  : BOOLEAN;
  2596   8   32:D   109           
  2597   8   32:D   109           
  2598   8   33:D     1       PROCEDURE CONGRATS;  (* P010221 *)
  2599   8   33:D     1       
  2600   8   33:D     1         VAR
  2601   8   33:D     1              EXPBONUS : TWIZLONG;
  2602   8   33:D     4              AWARDOVR : PACKED ARRAY[ 0..15] OF BOOLEAN;
  2603   8   33:D     5       
  2604   8   34:D     1         PROCEDURE GIVSTARS;  (* P010222 *)
  2605   8   34:D     1         
  2606   8   34:D     1           VAR
  2607   8   34:D     1                UNUSEDXX : INTEGER;
  2608   8   34:D     2                UNUSEDYY : INTEGER;
  2609   8   34:D     3                CHARDSKI : INTEGER;
  2610   8   34:D     4                OTHERCNT : INTEGER;
  2611   8   34:D     5                AWARDED  : BOOLEAN;
  2612   8   34:D     6                AWARDBIT : PACKED ARRAY[ 0..15] OF BOOLEAN;
  2613   8   34:D     7                
  2614   8   34:0     0           BEGIN
  2615   8   34:1     0             OTHERCNT := 12 - PARTYCNT;
  2616   8   34:1     5             REPEAT
  2617   8   34:2     5               AWARDED := FALSE;
  2618   8   34:2     8               FOR CHARDSKI := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
  2619   8   34:3    27                 BEGIN
  2620   8   34:4    27                   IF OTHERCNT = 0 THEN
  2621   8   34:5    32                     EXIT( GIVSTARS);
  2622   8   34:4    36                   MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARDSKI, SIZEOF( TCHAR))],
  2623   8   34:4    49                             THISCHAR,
  2624   8   34:4    53                             SIZEOF( TCHAR));
  2625   8   34:4    58                   MOVELEFT( THISCHAR.LOSTXYL.AWARDS[ 4], AWARDBIT, 2);
  2626   8   34:4    73                   IF (THISCHAR.STATUS = OK) AND
  2627   8   34:4    78                      NOT (THISCHAR.INMAZE) AND
  2628   8   34:4    83                      (AWARDBIT[ 13]) AND
  2629   8   34:4    91                      NOT AWARDBIT[ 5]  THEN
  2630   8   34:5   102                     BEGIN
  2631   8   34:6   102                       CLEARWIN( MAINWIN, TRUE);
  2632   8   34:6   109                       PRINTSTR( MAINWIN, 'STARS LEFT : ');
  2633   8   34:6   131                       PRINTNUM( MAINWIN, OTHERCNT, 2);
  2634   8   34:6   139                       PRINTCR(  MAINWIN);
  2635   8   34:6   145                       PRINTCR(  MAINWIN);
  2636   8   34:6   151                       PRINTSTR( MAINWIN, 'GIVE ONE TO ');
  2637   8   34:6   172                       PRINTSTR( MAINWIN, THISCHAR.NAME);
  2638   8   34:6   181                       PRINTSTR( MAINWIN, ' (Y/N)?');
  2639   8   34:6   197                       REPEAT
  2640   8   34:7   197                         GETKEY
  2641   8   34:6   197                       UNTIL (INCHAR =  'Y') OR
  2642   8   34:6   203                             (INCHAR =  'N');
  2643   8   34:6   209                       IF INCHAR =  'Y' THEN
  2644   8   34:7   214                         BEGIN
  2645   8   34:8   214                           OTHERCNT := OTHERCNT - 1;
  2646   8   34:8   219                           THISCHAR.POSS.POSSCNT := 0;
  2647   8   34:8   223                           ADDLONGS( THISCHAR.EXP, EXPBONUS);
  2648   8   34:8   232                           IF THISCHAR.ATTRIB[ PIETY] < 18 THEN
  2649   8   34:9   244                             THISCHAR.ATTRIB[ PIETY] :=
  2650   8   34:9   251                                THISCHAR.ATTRIB[ PIETY] + 1;
  2651   8   34:8   262                           MOVELEFT( THISCHAR.LOSTXYL.AWARDS[ 4],
  2652   8   34:8   271                                     AWARDOVR,
  2653   8   34:8   275                                     2);
  2654   8   34:8   278                           AWARDOVR[ 5] := TRUE;
  2655   8   34:8   287                           MOVELEFT( AWARDOVR, THISCHAR.LOSTXYL.AWARDS[ 4], 2);
  2656   8   34:8   303                           MOVELEFT( THISCHAR,
  2657   8   34:8   307                                     IOCACHE[ GETRECW( ZCHAR,
  2658   8   34:8   311                                                       CHARDSKI,
  2659   8   34:8   312                                                       SIZEOF( TCHAR))],
  2660   8   34:8   320                                     SIZEOF( TCHAR));
  2661   8   34:8   325                           AWARDED := TRUE
  2662   8   34:7   325                         END
  2663   8   34:5   328                     END
  2664   8   34:3   328                 END
  2665   8   34:1   328             UNTIL NOT AWARDED
  2666   8   34:0   335           END;
  2667   8   34:0   362           
  2668   8   34:0   362           
  2669   8   33:0     0         BEGIN (* CONGRATS *)
  2670   8   33:1     0           DELWIN( CHARSWIN, FALSE);
  2671   8   33:1     7           CLEARWIN( MAINWIN, TRUE);
  2672   8   33:1    14           CENTSTR( MAINWIN, 'WILL YOU SURRENDER  THE ORB TO');
  2673   8   33:1    53           CENTSTR( MAINWIN, 'THE SAGES OF LLYLGAMYN (Y/N) ?');
  2674   8   33:1    92           REPEAT
  2675   8   33:2    92             GETKEY
  2676   8   33:1    92           UNTIL (INCHAR = 'Y') OR (INCHAR = 'N');
  2677   8   33:1   104           IF INCHAR = 'N' THEN
  2678   8   33:2   109             EXIT( CONGRATS);
  2679   8   33:1   113           EXPBONUS.HIGH := 0;
  2680   8   33:1   116           EXPBONUS.LOW  := 0;
  2681   8   33:1   119           EXPBONUS.MID  := 15;
  2682   8   33:1   122           FOR CHARX := 0 TO PARTYCNT - 1 DO
  2683   8   33:2   138             BEGIN
  2684   8   33:3   138               ORBPOSX := 0;
  2685   8   33:3   142               FOR POSSI := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
  2686   8   33:4   164                 IF CHARACTR[ CHARX].POSS.POSSESS[ POSSI].EQINDEX =
  2687   8   33:4   181                                                                   ORBEARTH THEN
  2688   8   33:5   187                   ORBPOSX := POSSI;
  2689   8   33:3   203               IF ORBPOSX > 0 THEN
  2690   8   33:4   210                 BEGIN
  2691   8   33:5   210                   FOR POSSI := ORBPOSX TO CHARACTR[ CHARX].POSS.POSSCNT - 1 DO
  2692   8   33:6   236                     CHARACTR[ CHARX].POSS.POSSESS[ POSSI] :=
  2693   8   33:6   252                       CHARACTR[ CHARX].POSS.POSSESS[ POSSI + 1];
  2694   8   33:5   282                   CHARACTR[ CHARX].POSS.POSSCNT :=
  2695   8   33:5   291                                              CHARACTR[ CHARX].POSS.POSSCNT - 1;
  2696   8   33:4   303                 END;
  2697   8   33:3   303               ADDLONGS( CHARACTR[ CHARX].EXP, EXPBONUS);
  2698   8   33:3   317               IF CHARACTR[ CHARX].ATTRIB[ PIETY] < 18 THEN
  2699   8   33:4   335                 CHARACTR[ CHARX].ATTRIB[ PIETY] :=
  2700   8   33:4   348                   CHARACTR[ CHARX].ATTRIB[ PIETY] + 1;
  2701   8   33:3   365               MOVELEFT( CHARACTR[ CHARX].LOSTXYL.AWARDS[ 4], AWARDOVR, 2);
  2702   8   33:3   386               AWARDOVR[ 5] := TRUE;
  2703   8   33:3   394               MOVELEFT( AWARDOVR, CHARACTR[ CHARX].LOSTXYL.AWARDS[ 4], 2);
  2704   8   33:3   415               MOVELEFT( CHARACTR[ CHARX],
  2705   8   33:3   423                         IOCACHE[ GETRECW( ZCHAR,
  2706   8   33:3   427                                           CHARDISK[ CHARX],
  2707   8   33:3   436                                           SIZEOF( TCHAR))],
  2708   8   33:3   444                         SIZEOF( TCHAR))
  2709   8   33:2   449             END;
  2710   8   33:1   459           CLEARWIN( MAINWIN, TRUE);
  2711   8   33:1   466           CENTSTR(  MAINWIN, '*** CONGRATULATIONS! ***');
  2712   8   33:1   499           PRINTCR(  MAINWIN);
  2713   8   33:1   505           PRINTSTR( MAINWIN, 'WITH THE ORB OF EARITHIN,  THE SAGES');
  2714   8   33:1   550           PRINTSTR( MAINWIN, 'OF LLYLGAMYN  WILL BE  ABLE TO  FIND');
  2715   8   33:1   595           PRINTSTR( MAINWIN, 'OUT WHAT  IS  CAUSING THE  DISASTERS');
  2716   8   33:1   640           PRINTSTR( MAINWIN, 'THAT  THREATEN US!  IN  APPRECIATION');
  2717   8   33:1   685           PRINTSTR( MAINWIN, 'OF YOUR VALOR, I, QUEEN BEYKI, GREAT');
  2718   8   33:1   730           PRINTSTR( MAINWIN, 'GRANDDAUGHTER OF QUEEN MARGDA, AWARD');
  2719   8   33:1   775           PRINTSTR( MAINWIN, 'YOUR PARTY THE STAR OF LLYLGAMYN (*)');
  2720   8   33:1   820           PRINTSTR( MAINWIN, 'AND INVITE  YOU  TO SELECT ');
  2721   8   33:1   856           PRINTNUM( MAINWIN, 12 - PARTYCNT, 2);
  2722   8   33:1   866           PRINTSTR( MAINWIN, ' OTHERS');
  2723   8   33:1   882           PRINTSTR( MAINWIN, 'WHO ALSO DESERVE THIS AUGUST TITLE!');
  2724   8   33:1   926           PRINTCR(  MAINWIN);
  2725   8   33:1   932           PRINTCR(  MAINWIN);
  2726   8   33:1   938           CENTSTR(  MAINWIN, 'PRESS (RETURN) TO ASSIGN AWARDS');
  2727   8   33:1   978           GETCR;
  2728   8   33:1   981           GIVSTARS
  2729   8   33:0   981         END;
  2730   8   33:0  1006         
  2731   8   33:0  1006         
  2732   8   32:0     0       BEGIN (* CHK4WIN *)
  2733   8   32:1     0         UNPROWIN( CHARSWIN, FALSE);
  2734   8   32:1     7         BGOTORB := FALSE;
  2735   8   32:1    10         FOR CHARX := 0 TO PARTYCNT - 1 DO
  2736   8   32:2    24           BEGIN
  2737   8   32:3    24             FOR POSSI := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
  2738   8   32:4    42               IF CHARACTR[ CHARX].POSS.POSSESS[ POSSI].EQINDEX = ORBEARTH THEN
  2739   8   32:5    61                 BGOTORB := TRUE;
  2740   8   32:3    71             CHARACTR[ CHARX].LOSTXYL.LOCATION[ 1] := 0;
  2741   8   32:3    85             CHARACTR[ CHARX].LOSTXYL.LOCATION[ 2] := 0;
  2742   8   32:3    99             CHARACTR[ CHARX].LOSTXYL.LOCATION[ 3] := 0
  2743   8   32:2   111           END;
  2744   8   32:1   120         IF BGOTORB THEN
  2745   8   32:2   124           CONGRATS;
  2746   8   32:1   126         FOR CHARX := 0 TO PARTYCNT - 1 DO
  2747   8   32:2   140           BEGIN
  2748   8   32:3   140             CHARACTR[ CHARX].INMAZE :=
  2749   8   32:3   147               CHARACTR[ CHARX].STATUS = OK;
  2750   8   32:3   157             MOVELEFT( CHARACTR[ CHARX],
  2751   8   32:3   163                       IOCACHE[ GETRECW( ZCHAR,
  2752   8   32:3   167                                         CHARDISK[ CHARX],
  2753   8   32:3   174                                         SIZEOF( TCHAR))],
  2754   8   32:3   182                       SIZEOF( TCHAR))
  2755   8   32:2   187           END;
  2756   8   32:1   194         MOVELEFT( IOCACHE[ GETREC( ZZERO, 0, SIZEOF( TSCNTOC))],
  2757   8   32:1   207                   CHARX,
  2758   8   32:1   210                   2);
  2759   8   32:1   213         CHARX := 0;
  2760   8   32:1   216         POSSI := 0;
  2761   8   32:1   219         WHILE CHARX < PARTYCNT DO
  2762   8   32:2   224           BEGIN
  2763   8   32:3   224             CHARACTR[ POSSI] := CHARACTR[ CHARX];
  2764   8   32:3   236             CHARDISK[ POSSI] := CHARDISK[ CHARX];
  2765   8   32:3   250             IF CHARACTR[ POSSI].STATUS = OK THEN
  2766   8   32:4   261               POSSI := POSSI + 1;
  2767   8   32:3   266             CHARX := CHARX + 1
  2768   8   32:2   267           END;
  2769   8   32:1   273         PARTYCNT := POSSI;
  2770   8   32:1   276         XGOTO := XCASTLE;
  2771   8   32:1   280         EXIT( SHOPS)
  2772   8   32:0   284       END;  (* CHK4WIN *)
  2773   8   32:0   304   
  2774   8   32:0   304   
  2775   8    1:0     0     BEGIN (* SHOPS *)
  2776   8    1:1     0       CASE XGOTO OF
  2777   8    1:1     5         XCEMETRY:  CEMETARY;
  2778   8    1:1     9            XCANT:  CANT;
  2779   8    1:1    13          XBOLTAC:  BOLTAC;
  2780   8    1:1    17         XCHK4WIN:  CHK4WIN;
  2781   8    1:1    21         XEDGTOWN:  EDGETOWN;
  2782   8    1:1    25       END;
  2783   8    1:0    74     END;  (* SHOPS *)
  2784   8    1:0    86   
  2785   8    1:0    86 (*$I WIZ3A:SHOPS2    *)
  2786   8    1:0    86 
  2786   8    1:0    86 (*$I WIZ3B:SPECIALS  *)
  2787   9    1:D     1   SEGMENT PROCEDURE SPECIALS;   (* P010301 *)
  2788   9    1:D     1     
  2789   9    1:D     1     CONST
  2790   9    1:D     1           SERIALBL = 5;
  2791   9    1:D     1   
  2792   9    1:D     1     VAR
  2793   9    1:D     1          SPCINDEX : INTEGER;
  2794   9    1:D     2          NUM2000  : INTEGER;
  2795   9    1:D     3   
  2796   9    1:D     3   
  2797   9    2:D     1     PROCEDURE INSPECT;  (* P010302 *)
  2798   9    2:D     1     
  2799   9    2:D     1       VAR
  2800   9    2:D     1            PICKCNT  : INTEGER;
  2801   9    2:D     2            LOOKWIN  : TWINDOWP;
  2802   9    2:D     3            PICKLIST : ARRAY[ 1..6] OF INTEGER;
  2803   9    2:D     9            UNUSEDXX : INTEGER;
  2804   9    2:D    10            PICKCHAR : INTEGER;
  2805   9    2:D    11            PICKREC  : TCHAR;
  2806   9    2:D   115            MAZE     : TMAZE;
  2807   9    2:D   562            INMYROOM : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF BOOLEAN;
  2808   9    2:D   602            CHECKED  : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF BOOLEAN;
  2809   9    2:D   642            
  2810   9    3:D     1       PROCEDURE EXITPICK;  (* P010303 *)
  2811   9    3:D     1       
  2812   9    3:0     0         BEGIN
  2813   9    3:1     0           DELWIN( LOOKWIN, FALSE);
  2814   9    3:1     7           XGOTO := XRUNNER;
  2815   9    3:1    11           EXIT( SPECIALS)
  2816   9    3:0    15         END;
  2817   9    3:0    28         
  2818   9    3:0    28         
  2819   9    4:D     1       PROCEDURE LOOKLOST;  (* P010304 *)
  2820   9    4:D     1       
  2821   9    4:D     1       
  2822   9    5:D     1         PROCEDURE FOUNDLOS;  (* P010305 *)
  2823   9    5:D     1         
  2824   9    5:0     0           BEGIN
  2825   9    5:1     0             IF PICKCNT = 5 THEN
  2826   9    5:2     7               EXIT( LOOKLOST);
  2827   9    5:1    11             PICKCNT := PICKCNT + 1;
  2828   9    5:1    19             PICKLIST[ PICKCNT] := PICKCHAR;
  2829   9    5:1    33             PRINTNUM( LOOKWIN, PICKCNT, 1);
  2830   9    5:1    43             PRINTSTR( LOOKWIN, ' )');
  2831   9    5:1    54             PRINTSTR( LOOKWIN, PICKREC.NAME);
  2832   9    5:1    63             PRINTCR(  LOOKWIN)
  2833   9    5:0    66           END;  (* FOUNDLOS *)
  2834   9    5:0    82           
  2835   9    5:0    82           
  2836   9    4:0     0         BEGIN  (* LOOKLOST *)
  2837   9    4:1     0           PICKCNT := 0;
  2838   9    4:1     4           CLEARWIN( LOOKWIN, TRUE);
  2839   9    4:1    11           PRINTSTR( LOOKWIN, 'FOUND:');
  2840   9    4:1    26           MVCURSOR( LOOKWIN, 0, 2);
  2841   9    4:1    34           FOR PICKCHAR := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
  2842   9    4:2    56             BEGIN
  2843   9    4:3    56               MOVELEFT( IOCACHE[ GETREC( ZCHAR, PICKCHAR, SIZEOF( TCHAR))],
  2844   9    4:3    71                         PICKREC,
  2845   9    4:3    75                         SIZEOF( TCHAR));
  2846   9    4:3    80               IF PICKREC.STATUS <> LOST THEN
  2847   9    4:4    87                 IF NOT PICKREC.INMAZE THEN
  2848   9    4:5    93                   IF PICKREC.LOSTXYL.LOCATION[ 3] = MAZELEV THEN
  2849   9    4:6   106                     IF INMYROOM[ PICKREC.LOSTXYL.LOCATION[ 1],
  2850   9    4:6   121                                  PICKREC.LOSTXYL.LOCATION[ 2] ] THEN
  2851   9    4:7   136                       FOUNDLOS
  2852   9    4:2   136             END;
  2853   9    4:1   148           IF PICKCNT = 0 THEN
  2854   9    4:2   155             PRINTSTR( LOOKWIN, '* NONE *')
  2855   9    4:0   169         END;  (* LOOKLOST *)
  2856   9    4:0   186         
  2857   9    4:0   186         
  2858   9    6:D     1       PROCEDURE PICKUP;  (* P010306 *)
  2859   9    6:D     1       
  2860   9    6:0     0         BEGIN
  2861   9    6:1     0           REPEAT
  2862   9    6:2     0             CLEARWIN( TEMPWIN, TRUE);
  2863   9    6:2     7             PRINTSTR( TEMPWIN, '(0 EXITS)');
  2864   9    6:2    25             PRINTCR(  TEMPWIN);
  2865   9    6:2    31             PRINTSTR( TEMPWIN, 'GET >');
  2866   9    6:2    45             GETKEY;
  2867   9    6:2    48             PICKCHAR := ORD( INCHAR) - ORD( '0');
  2868   9    6:2    54             IF PICKCHAR = 0 THEN
  2869   9    6:3    61               EXIT( PICKUP)
  2870   9    6:1    65           UNTIL (PICKCHAR > 0) AND (PICKCHAR <= PICKCNT);
  2871   9    6:1    80           
  2872   9    6:1    80           IF PICKLIST[ PICKCHAR] = - 1 THEN
  2873   9    6:2    96             EXIT( PICKUP);
  2874   9    6:1   100           MOVELEFT( IOCACHE[ GETREC( ZCHAR,
  2875   9    6:1   104                                      PICKLIST[ PICKCHAR],
  2876   9    6:1   115                                      SIZEOF( TCHAR))],
  2877   9    6:1   123                     CHARACTR[ PARTYCNT],
  2878   9    6:1   129                     SIZEOF( TCHAR));
  2879   9    6:1   134           CHARDISK[ PARTYCNT] := PICKLIST[ PICKCHAR];
  2880   9    6:1   152           CHARACTR[ PARTYCNT].LOSTXYL.LOCATION[ 1] := 0;
  2881   9    6:1   166           CHARACTR[ PARTYCNT].LOSTXYL.LOCATION[ 2] := 0;
  2882   9    6:1   180           CHARACTR[ PARTYCNT].LOSTXYL.LOCATION[ 3] := 0;
  2883   9    6:1   194           CHARACTR[ PARTYCNT].INMAZE := TRUE;
  2884   9    6:1   203           MOVELEFT( CHARACTR[ PARTYCNT],
  2885   9    6:1   209                     IOCACHE[ GETRECW( ZCHAR,
  2886   9    6:1   213                                       PICKLIST[ PICKCHAR],
  2887   9    6:1   224                                       SIZEOF( TCHAR))],
  2888   9    6:1   232                     SIZEOF( TCHAR));
  2889   9    6:1   237           PICKLIST[ PICKCHAR] := - 1;
  2890   9    6:1   250           PARTYCNT := PARTYCNT + 1;
  2891   9    6:1   255           CLRRECT( LOOKWIN, 0, 1 + PICKCHAR, 0, 20)
  2892   9    6:0   266         END;  (* PICKUP *)
  2893   9    6:0   284         
  2894   9    6:0   284         
  2895   9    7:D     1       PROCEDURE EXPLROOM;  (* P010307 *)
  2896   9    7:D     1       
  2897   9    7:D     1         VAR
  2898   9    7:D     1              VERT     : INTEGER;
  2899   9    7:D     2              HORZ     : INTEGER;
  2900   9    7:D     3              DONELOOK : BOOLEAN;
  2901   9    7:D     4       
  2902   9    7:D     4       
  2903   9    8:D     1         PROCEDURE CHECKLOC( X:    INTEGER;    (* P010308 *)
  2904   9    8:D     2                             Y:    INTEGER;
  2905   9    8:D     3                             WALL: TWALL);
  2906   9    8:D     4         
  2907   9    8:0     0           BEGIN
  2908   9    8:1     0             IF WALL <> OPEN THEN
  2909   9    8:2     5               EXIT( CHECKLOC);
  2910   9    8:1     9             X := (X + 20) MOD 20;
  2911   9    8:1    16             Y := (Y + 20) MOD 20;
  2912   9    8:1    23             IF INMYROOM[ X][ Y] THEN
  2913   9    8:2    37               EXIT( CHECKLOC);
  2914   9    8:1    41             DONELOOK := FALSE;
  2915   9    8:1    45             INMYROOM[ X][ Y] := TRUE
  2916   9    8:0    56           END;  (* CHECKLOC *)
  2917   9    8:0    70           
  2918   9    8:0    70           
  2919   9    7:0     0         BEGIN (* EXPLROOM *)
  2920   9    7:1     0           PRINTSTR( LOOKWIN, 'LOOKING.');
  2921   9    7:1    17           MOVELEFT( IOCACHE[ GETREC( ZMAZE, MAZELEV - 1, SIZEOF( TMAZE))],
  2922   9    7:1    32                     MAZE,
  2923   9    7:1    36                     SIZEOF( TMAZE));
  2924   9    7:1    41           FILLCHAR( INMYROOM, 80, 0);
  2925   9    7:1    50           INMYROOM[ MAZEX][ MAZEY] := TRUE;
  2926   9    7:1    63           FILLCHAR( CHECKED, 80, 0);
  2927   9    7:1    72           REPEAT
  2928   9    7:2    72             PRINTCHR( LOOKWIN, '.');
  2929   9    7:2    79             DONELOOK := TRUE;
  2930   9    7:2    82             FOR HORZ := 0 TO 19 DO
  2931   9    7:3    93               FOR VERT := 0 TO 19 DO
  2932   9    7:4   104                 IF INMYROOM[ HORZ][ VERT] THEN
  2933   9    7:5   118                   IF NOT CHECKED[ HORZ][ VERT] THEN
  2934   9    7:6   133                     BEGIN
  2935   9    7:7   133                       CHECKLOC( HORZ + 1, VERT, MAZE.E[ HORZ][ VERT]);
  2936   9    7:7   151                       CHECKLOC( HORZ - 1, VERT, MAZE.W[ HORZ][ VERT]);
  2937   9    7:7   168                       CHECKLOC( HORZ, VERT - 1, MAZE.S[ HORZ][ VERT]);
  2938   9    7:7   186                       CHECKLOC( HORZ, VERT + 1, MAZE.N[ HORZ][ VERT]);
  2939   9    7:7   204                       CHECKED[ HORZ][ VERT] := TRUE
  2940   9    7:6   215                     END
  2941   9    7:1   217           UNTIL DONELOOK
  2942   9    7:0   231         END;  (* EXPLROOM *)
  2943   9    7:0   254         
  2944   9    7:0   254         
  2945   9    2:0     0       BEGIN (* INSPECT *)
  2946   9    2:1     0         LOOKWIN := GETWIN( 0, 0, 22, 24, 7, TRUE);
  2947   9    2:1    13         EXPLROOM;
  2948   9    2:1    15         LOOKLOST;
  2949   9    2:1    17         IF PICKCNT = 0 THEN
  2950   9    2:2    22           EXITPICK;
  2951   9    2:1    24         REPEAT
  2952   9    2:2    24           TEMPWIN := GETWIN( 21, 0, 12, 4, 8, TRUE);
  2953   9    2:2    38           IF MENU( TEMPWIN, 'P)ICK UP/L)EAVE') = 0 THEN
  2954   9    2:3    68             IF (PICKCNT > 0) AND (PARTYCNT < 6) THEN
  2955   9    2:4    77               PICKUP
  2956   9    2:3    77             ELSE
  2957   9    2:4    81               RINGBELL
  2958   9    2:2    81           ELSE
  2959   9    2:3    86             BEGIN
  2960   9    2:4    86               DELWIN( TEMPWIN, FALSE);
  2961   9    2:4    93               EXITPICK
  2962   9    2:3    93             END;
  2963   9    2:2    95           DELWIN( TEMPWIN, FALSE)
  2964   9    2:1    99         UNTIL FALSE
  2965   9    2:0   102       END;  (* INSPECT *)
  2966   9    2:0   120       
  2967   9    2:0   120       
  2968   9    9:D     3     FUNCTION FINDFILE( DRIVE:  INTEGER;  (* P010309 *)
  2969   9    9:D     4                        FILENM: STRING) : INTEGER;
  2970   9    9:D    46                        
  2971   9    9:D    46       TYPE
  2972   9    9:D    46            DIRENTRY = RECORD
  2973   9    9:D    46              FIRSTBLK : INTEGER;
  2974   9    9:D    46              LASTBLK  : INTEGER;
  2975   9    9:D    46              FILEKIND : PACKED RECORD
  2976   9    9:D    46                  FT : (VOLHEAD, BADBLK, MACH6502, TEXT, DEBUG,
  2977   9    9:D    46                        DATA, GRAFFILE, FOTOFILE, SUBDIR);
  2978   9    9:D    46                END;
  2979   9    9:D    46              FILENAME : STRING[ 7];
  2980   9    9:D    46              VOLLB    : INTEGER;
  2981   9    9:D    46              FILECNT  : INTEGER;
  2982   9    9:D    46              LOADTIM  : INTEGER;
  2983   9    9:D    46              BOOTDATE : INTEGER;
  2984   9    9:D    46              RES1     : INTEGER;
  2985   9    9:D    46              RES2     : INTEGER;
  2986   9    9:D    46          END;
  2987   9    9:D    46                
  2988   9    9:D    46       VAR
  2989   9    9:D    46            DIR   : ARRAY[ 0..3] OF DIRENTRY;
  2990   9    9:D    98            FILEI : INTEGER;
  2991   9    9:D    99            FILEX : INTEGER;
  2992   9    9:D   100                        
  2993   9    9:0     0       BEGIN
  2994   9    9:1     0         NUM2000 := 8192;
  2995   9    9:1    11         UNITREAD( DRIVE, DIR, 104, 2, 0);
  2996   9    9:1    20         IF IORESULT <> 0 THEN
  2997   9    9:2    26           FINDFILE := - ABS( IORESULT)
  2998   9    9:1    29         ELSE
  2999   9    9:2    34           BEGIN
  3000   9    9:3    34             FILEI := 0;
  3001   9    9:3    37             FOR FILEX := 1 TO DIR[ 0].FILECNT DO
  3002   9    9:4    56               IF (DIR[ FILEX].FILEKIND.FT >= BADBLK) AND
  3003   9    9:4    69                  (DIR[ FILEX].FILEKIND.FT <= FOTOFILE) THEN
  3004   9    9:5    85                 IF DIR[ FILEX].FILENAME = FILENM THEN
  3005   9    9:6    99                   FILEI := FILEX;
  3006   9    9:3   111             IF FILEI = 0 THEN
  3007   9    9:4   117               FINDFILE := - 9
  3008   9    9:3   117             ELSE
  3009   9    9:4   123               FINDFILE := DIR[ FILEI].FIRSTBLK
  3010   9    9:2   129           END
  3011   9    9:0   132       END;  (* FINDFILE *)
  3012   9    9:0   146       
  3013   9    9:0   146       
  3014   9   10:D     1     PROCEDURE INITGAME;  (* P01030A *)
  3015   9   10:D     1     
  3016   9   10:D     1       VAR
  3017   9   10:D     1            DUPLSER : STRING[ 7];
  3018   9   10:D     5            MASTSER : STRING[ 7];
  3019   9   10:D     9     
  3020   9   10:D     9     
  3021   9   11:D     1       PROCEDURE GETCRSPC;  (* P01030B *)
  3022   9   11:D     1       
  3023   9   11:0     0         BEGIN
  3024   9   11:1     0           REPEAT
  3025   9   11:2     0             GETKEY
  3026   9   11:1     0           UNTIL INCHAR = CHR( CRETURN)
  3027   9   11:0     5         END;
  3028   9   11:0    22         
  3029   9   11:0    22         
  3030   9   12:D     1       PROCEDURE TOCBLSER;  (* P01030C *)
  3031   9   12:D     1       
  3032   9   12:0     0         BEGIN
  3033   9   12:1     0           GETCRSPC;
  3034   9   12:1     2           SCNTOCBL := FINDFILE( DRIVE1, 'SCENARIO.DATA');
  3035   9   12:1    26           UNITREAD( DRIVE1, IOCACHE, BLOCKSZ, SERIALBL, 0)
  3036   9   12:0    38         END;
  3037   9   12:0    50         
  3038   9   12:0    50         
  3039   9   13:D     1       PROCEDURE MMCHARST;  (* P01030D *)
  3040   9   13:D     1       
  3041   9   13:D     1         TYPE
  3042   9   13:D     1              BYTE = PACKED ARRAY[ 0..1] OF 0..255;
  3043   9   13:D     1              
  3044   9   13:D     1         VAR
  3045   9   13:D     1              MEMTEMP  : INTEGER;
  3046   9   13:D     2              MEMLT2K  : TMEMOVER;
  3047   9   13:D     3              CHRSETBL : INTEGER;
  3048   9   13:D     4              CHARSX   : INTEGER;
  3049   9   13:D     5              MEMPTR   : RECORD CASE BOOLEAN OF
  3050   9   13:D     5                           TRUE:  (I: INTEGER);
  3051   9   13:D     5                           FALSE: (P: ^BYTE);
  3052   9   13:D     5                         END;
  3053   9   13:D     6       
  3054   9   13:0     0         BEGIN
  3055   9   13:1     0           UNITREAD( DRIVE1, BOOTSER, 8, SERIALBL, 0);
  3056   9   13:1    10           IF BOOTSER = '' THEN
  3057   9   13:2    20             REPEAT
  3058   9   13:2    20             UNTIL FALSE;
  3059   9   13:1    23           BASE5CB.I := 8192;
  3060   9   13:1    29           FILLCHAR( BASE5CB.PMEM^, 8192, 0);
  3061   9   13:1    39           MEMHEAD := NIL;
  3062   9   13:1    43           DOGARBMM := FALSE;
  3063   9   13:1    47           MARK( BASE5CB.PMEM);
  3064   9   13:1    52           IF BASE5CB.I < 8183 THEN   (* #$1FF7 *)
  3065   9   13:2    61             BEGIN
  3066   9   13:3    61               MEMLT2K.I := GETMEM( 8192 - BASE5CB.I - 8);
  3067   9   13:3    77               MEMTEMP := GETMEM( 8192);
  3068   9   13:3    87               RELMEM( MEMLT2K.PWIN)
  3069   9   13:2    88             END
  3070   9   13:1    91           ELSE
  3071   9   13:2    93             BEGIN
  3072   9   13:3    93               BASE5CB.I := 16384;
  3073   9   13:3    99               RELEASE( BASE5CB.PMEM)
  3074   9   13:2   102             END;
  3075   9   13:2   104             
  3076   9   13:1   104           CHRSETBL := FINDFILE( DRIVE1, 'SYSTEM.CHARSET');
  3077   9   13:1   128           UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE), CHRSETBL);
  3078   9   13:1   140           FOR CHARSX := 0 TO 63 DO
  3079   9   13:2   151             BEGIN
  3080   9   13:3   151               MEMPTR.I := 8192 + 256 * (CHARSX MOD 32) + 120 +
  3081   9   13:3   164                         128 * (CHARSX DIV 32);
  3082   9   13:3   174               MOVELEFT( IOCACHE[ 256 + 8 * CHARSX], MEMPTR.P^, 8)
  3083   9   13:2   189             END;
  3084   9   13:1   196           MEMPTR.I := - 16300;  (* C054 PRIMARY PAGE *)
  3085   9   13:1   202           MEMPTR.P^[ 0] := 0;
  3086   9   13:1   206           MEMPTR.I := - 16297;  (* C057 HI-RES *)
  3087   9   13:1   212           MEMPTR.P^[ 0] := 0;
  3088   9   13:1   216           MEMPTR.I := - 16302;  (* C052 ALL GRAPHICS *)
  3089   9   13:1   222           MEMPTR.P^[ 0] := 0;
  3090   9   13:1   226           MEMPTR.I := - 16304;  (* C050 DISPLAY GRAPHICS *)
  3091   9   13:1   232           MEMPTR.P^[ 0] := 0;
  3092   9   13:1   236           UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE), CHRSETBL + 1, 0);
  3093   9   13:1   250           BASE5CB.I := 2048;    (* 800  *)
  3094   9   13:1   256           MOVELEFT( IOCACHE[ 256], BASE5CB.PMEM^, 768);
  3095   9   13:1   271           UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE), CHRSETBL + 2, 0);
  3096   9   13:1   285           BASE5CB.I := 2048 + 768;
  3097   9   13:1   295           MOVELEFT( IOCACHE, BASE5CB.PMEM^, 256);
  3098   9   13:1   308           
  3099   9   13:1   308           WINCHAIN := NIL;
  3100   9   13:1   312           MAINWIN  := GETWIN( 1, 1, 38, 22, 0, FALSE);
  3101   9   13:1   326           CASTTIT  := NIL;
  3102   9   13:1   330           TRAINTIT := NIL;
  3103   9   13:1   334           CAMPTIT  := NIL;
  3104   9   13:1   338           TEMPWIN  := NIL;
  3105   9   13:1   342           CHARSWIN := NIL;
  3106   9   13:1   346           CAMPWIN  := NIL;
  3107   9   13:1   350           UNUSEDXX := 0;
  3108   9   13:1   354           INFOWOFF := FALSE
  3109   9   13:0   354         END;  (* MMCHARST *)
  3110   9   13:0   374         
  3111   9   13:0   374         
  3112   9   14:D     3       FUNCTION MASTRDUP : BOOLEAN;  (* P01030E *)
  3113   9   14:D     3       
  3114   9   14:0     0         BEGIN
  3115   9   14:1     0           IF DUPLSER = MASTSER THEN
  3116   9   14:2    10             MASTRDUP := TRUE
  3117   9   14:1    10           ELSE
  3118   9   14:2    15             BEGIN
  3119   9   14:3    15               CLEARWIN( MAINWIN, TRUE);
  3120   9   14:3    22               MVCURSOR( MAINWIN, 0, 10);
  3121   9   14:3    30               CENTSTR(  MAINWIN, 'MASTER DID NOT MAKE THIS DUP');
  3122   9   14:3    67               CENTSTR(  MAINWIN, 'DISK - PRESS (RETURN)');
  3123   9   14:3    97               MASTRDUP := FALSE;
  3124   9   14:3   100               GETCRSPC
  3125   9   14:2   100             END
  3126   9   14:0   102         END;  (* MASTRDUP *)
  3127   9   14:0   114         
  3128   9   14:0   114         
  3129   9   15:D     3       FUNCTION SCENDATA : BOOLEAN;  (* P01030F *)
  3130   9   15:D     3       
  3131   9   15:0     0         BEGIN
  3132   9   15:1     0           IF SCNTOCBL > 0 THEN
  3133   9   15:2     7             SCENDATA := TRUE
  3134   9   15:1     7           ELSE
  3135   9   15:2    12             BEGIN
  3136   9   15:3    12               CLEARWIN( MAINWIN, TRUE);
  3137   9   15:3    19               MVCURSOR( MAINWIN, 0, 10);
  3138   9   15:3    27               CENTSTR(  MAINWIN, 'NOT A SCENARIO DISK - PRESS (RETURN)');
  3139   9   15:3    72               SCENDATA := FALSE;
  3140   9   15:3    75               GETCRSPC
  3141   9   15:2    75             END
  3142   9   15:0    77         END;  (* SCENDATA *)
  3143   9   15:0    90         
  3144   9   15:0    90         
  3145   9   16:D     3       FUNCTION WRITEABL : BOOLEAN;  (* P010310 *)
  3146   9   16:D     3       
  3147   9   16:0     0         BEGIN
  3148   9   16:1     0           IF IORESULT = 0 THEN
  3149   9   16:2     6             WRITEABL := TRUE
  3150   9   16:1     6           ELSE
  3151   9   16:2    11             BEGIN
  3152   9   16:3    11               CLEARWIN( MAINWIN, TRUE);
  3153   9   16:3    18               MVCURSOR( MAINWIN, 0, 10);
  3154   9   16:3    26               CENTSTR(  MAINWIN, 'NOT A DUP DISK - PRESS (RETURN)');
  3155   9   16:3    66               WRITEABL := FALSE;
  3156   9   16:3    69               GETCRSPC
  3157   9   16:2    69             END
  3158   9   16:0    71         END;  (* WRITEABLE *)
  3159   9   16:0    84         
  3160   9   16:0    84         
  3161   9   17:D     3       FUNCTION WRITEPRO : BOOLEAN;  (* P010311 *)
  3162   9   17:D     3       
  3163   9   17:0     0         BEGIN
  3164   9   17:1     0           IF IORESULT <> 0 THEN
  3165   9   17:2     6             WRITEPRO := TRUE
  3166   9   17:1     6           ELSE
  3167   9   17:2    11             BEGIN
  3168   9   17:3    11               CLEARWIN( MAINWIN, TRUE);
  3169   9   17:3    18               MVCURSOR( MAINWIN, 0, 10);
  3170   9   17:3    26               CENTSTR(  MAINWIN, 'NOT A MASTER DISK - PRESS (RETURN)');
  3171   9   17:3    69               WRITEPRO := FALSE;
  3172   9   17:3    72               GETCRSPC
  3173   9   17:2    72             END
  3174   9   17:0    74         END;  (* WRITEPRO *)
  3175   9   17:0    86         
  3176   9   17:0    86         
  3177   9   10:0     0       BEGIN (* INITGAME *)
  3178   9   10:1     0         IF BASE04 = -3 THEN
  3179   9   10:2     6           BEGIN
  3180   9   10:3     6             MMCHARST;
  3181   9   10:3     8             REPEAT
  3182   9   10:4     8               REPEAT
  3183   9   10:5     8                 CLEARWIN( MAINWIN, TRUE);
  3184   9   10:5    15                 MVCURSOR( MAINWIN, 0, 10);
  3185   9   10:5    23                 PRINTSTR( MAINWIN, 'SCENARIO MASTER IN DRV 1,  PRESS RET');
  3186   9   10:5    68                 TOCBLSER
  3187   9   10:4    68               UNTIL SCNTOCBL >= 0;
  3188   9   10:4    77               MOVELEFT( IOCACHE, MASTSER, 8);
  3189   9   10:4    87               UNITWRITE( DRIVE1, IOCACHE, BLOCKSZ, SERIALBL, 0)
  3190   9   10:3    99             UNTIL WRITEPRO;
  3191   9   10:3   105             
  3192   9   10:3   105             REPEAT
  3193   9   10:4   105               REPEAT
  3194   9   10:5   105                 REPEAT
  3195   9   10:6   105                   CLEARWIN( MAINWIN, TRUE);
  3196   9   10:6   112                   MVCURSOR( MAINWIN, 0, 10);
  3197   9   10:6   120                   CENTSTR(  MAINWIN, 'PLACE DUPLICATE SCENARIO DISKETTE');
  3198   9   10:6   162                   CENTSTR(  MAINWIN, 'IN DRIVE 1, THEN PRESS (RETURN)');
  3199   9   10:6   202                   TOCBLSER
  3200   9   10:5   202                 UNTIL SCENDATA;
  3201   9   10:5   210                 MOVELEFT( IOCACHE, DUPLSER, 8)
  3202   9   10:4   220               UNTIL MASTRDUP;
  3203   9   10:4   226               UNITWRITE( DRIVE1, IOCACHE, BLOCKSZ, SERIALBL, 0)
  3204   9   10:3   238             UNTIL WRITEABL;
  3205   9   10:3   244             
  3206   9   10:3   244             TIMEDLAY := 2000;
  3207   9   10:3   250             CACHEWRI := FALSE;
  3208   9   10:3   254             CACHEBL := 0;
  3209   9   10:3   258             UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE), SCNTOCBL, 0);
  3210   9   10:3   272             MOVELEFT( IOCACHE, SCNTOC, SIZEOF( TSCNTOC))
  3211   9   10:2   285           END
  3212   9   10:1   285         ELSE
  3213   9   10:2   287           BEGIN
  3214   9   10:3   287             IF BASE04 = -2 THEN
  3215   9   10:4   293               BEGIN
  3216   9   10:5   293                 TEMPWIN := GETWIN( 3, 21, 34, 3, 1, TRUE);
  3217   9   10:5   307                 PRINTSTR( TEMPWIN, 'PRESS (RETURN) FOR MORE WIZARDRY');
  3218   9   10:5   348                 GETCRSPC;
  3219   9   10:5   350                 DELWIN( TEMPWIN, TRUE)
  3220   9   10:4   354               END
  3221   9   10:2   357           END;
  3222   9   10:2   357         
  3223   9   10:1   357         XGOTO := XCASTLE;
  3224   9   10:1   361         MAZEX := 0;
  3225   9   10:1   364         MAZEY := 0;
  3226   9   10:1   367         MAZELEV := 0;
  3227   9   10:1   370         PARTYCNT := 0;
  3228   9   10:1   373         DIRECTIO := 0;
  3229   9   10:1   376         ACMOD2   := 0;
  3230   9   10:1   380         ORBEARTH := 1000 + 1;
  3231   9   10:1   388         CRYSNEUT := ORBEARTH + 1;
  3232   9   10:1   396         CRYSEVIL := ORBEARTH + 2;
  3233   9   10:1   404         CRYSGOOD := ORBEARTH + 3;
  3234   9   10:1   412         SHIPBOTT := ORBEARTH + 4;
  3235   9   10:1   420         EXIT( SPECIALS)
  3236   9   10:0   424       END;
  3237   9   10:0   448       
  3238   9   10:0   448       
  3239   9   18:D     1     PROCEDURE DUMAPIC;  (* P010312 *)
  3240   9   18:D     1     
  3241   9   18:D     1       VAR
  3242   9   18:D     1            SAVBASE4 : INTEGER;
  3243   9   18:D     2            URFACING : STRING;
  3244   9   18:D    43     
  3245   9   18:0     0       BEGIN
  3246   9   18:1     0         XGOTO := XBK2CMP2;
  3247   9   18:1     4         SAVBASE4 := BASE04;
  3248   9   18:1     7         TEMPWIN := GETWIN( 0, 7, 40, 9, 16, TRUE);
  3249   9   18:1    21         CENTSTR( TEMPWIN, 'PARTY LOCATION:');
  3250   9   18:1    45         PRINTCR( TEMPWIN);
  3251   9   18:1    51         URFACING := 'YOU ARE FACING ';
  3252   9   18:1    73         CASE DIRECTIO OF
  3253   9   18:1    76           0:  CENTSTR( TEMPWIN, CONCAT( URFACING, 'NORTH.'));
  3254   9   18:1   112           1:  CENTSTR( TEMPWIN, CONCAT( URFACING, 'EAST.'));
  3255   9   18:1   147           2:  CENTSTR( TEMPWIN, CONCAT( URFACING, 'SOUTH.'));
  3256   9   18:1   183           3:  CENTSTR( TEMPWIN, CONCAT( URFACING, 'WEST.'));
  3257   9   18:1   218         END;
  3258   9   18:1   234         PRINTCR(  TEMPWIN);
  3259   9   18:1   240         PRINTSTR( TEMPWIN, '        ');
  3260   9   18:1   257         PRINTNUM( TEMPWIN, MAZEX, 2);
  3261   9   18:1   265         PRINTSTR( TEMPWIN, ' EAST');
  3262   9   18:1   279         PRINTNUM( TEMPWIN, MAZEY, 3);
  3263   9   18:1   287         PRINTSTR( TEMPWIN, ' NORTH');
  3264   9   18:1   302         PRINTNUM( TEMPWIN, MAZELEV, 3);
  3265   9   18:1   310         PRINTSTR( TEMPWIN, ' UP');
  3266   9   18:1   322         PRINTCR(  TEMPWIN);
  3267   9   18:1   328         PRINTCR(  TEMPWIN);
  3268   9   18:1   334         CENTSTR(  TEMPWIN, 'PRESS (RETURN)');
  3269   9   18:1   357         DELWIN(   TEMPWIN, FALSE);
  3270   9   18:1   364         GETCR;
  3271   9   18:1   367         INCHAR := 'A';
  3272   9   18:1   370         BASE04 := SAVBASE4;
  3273   9   18:1   373         EXIT( SPECIALS)
  3274   9   18:0   377       END;  (* DUMAPIC *)
  3275   9   18:0   392   
  3276   9   18:0   392 (*$I WIZ3B:SPECIALS  *)
  3276   9   18:0   392 (*$I WIZ3B:SPECIALS2 *)
  3277   9   19:D     1   PROCEDURE SPCMISC;  (* P010313 *)
  3278   9   19:D     1   
  3279   9   19:D     1     VAR
  3280   9   19:D     1          MSGSWIN  : TWINDOWP;
  3281   9   19:D     2          LINECNT  : INTEGER;
  3282   9   19:D     3          MSGX     : INTEGER;
  3283   9   19:D     4          MSGBLK   : INTEGER;
  3284   9   19:D     5          CURMSGBL : INTEGER;
  3285   9   19:D     6          MSGBLK0  : INTEGER;
  3286   9   19:D     7          BOUNCEFL : INTEGER; (* MULTIPLE USES;  FIRST CHAR "FEE" 2CG *)
  3287   9   19:D     8          AUX0     : INTEGER; (* MULTIPLE USES:  EQINDEX, RANDOM 0-6, MSG INDEX
  3288   9   19:D     9                                                 AUX0 *)
  3289   9   19:D     9          AUX1     : INTEGER; (* MULTIPLE USES:  AUX1, MSG INDEX, ....*)
  3290   9   19:D    10          AUX2     : INTEGER;
  3291   9   19:D    11          MESSAGE  : PACKED ARRAY[ 0..511] OF CHAR;
  3292   9   19:D   267          STRBUFF  : RECORD
  3293   9   19:D   267                       BUFF: STRING[ 38];
  3294   9   19:D   267                       ENDMSG : BOOLEAN;
  3295   9   19:D   267                     END;
  3296   9   19:D   288          MAZEFLOR : TMAZE;
  3297   9   19:D   735   
  3298   9   19:D   735   
  3299   9   20:D     1     PROCEDURE EXITSPCL;  (* P010314 *)
  3300   9   20:D     1     
  3301   9   20:0     0       BEGIN
  3302   9   20:1     0         DELWIN( MSGSWIN, FALSE);
  3303   9   20:1     7         EXIT( SPCMISC)
  3304   9   20:0    11       END;
  3305   9   20:0    24       
  3306   9   20:0    24       
  3307   9   21:D     1     PROCEDURE GETYN( ASTRING: STRING);  (* P010315 *)
  3308   9   21:D    43     
  3309   9   21:0     0       BEGIN
  3310   9   21:1     0         PRINTCR( MSGSWIN);
  3311   9   21:1    11         CENTSTR( MSGSWIN, CONCAT( ASTRING, ' (Y/N) ?'));
  3312   9   21:1    47         REPEAT
  3313   9   21:2    47           GETKEY
  3314   9   21:1    47         UNTIL (INCHAR = 'Y') OR (INCHAR = 'N')
  3315   9   21:0    56       END;
  3316   9   21:0    74       
  3317   9   21:0    74       
  3318   9   22:D     1     PROCEDURE DECRYPTM( MSGINDEX: INTEGER);  (* P010316 *)
  3319   9   22:D     2     
  3320   9   22:0     0       BEGIN
  3321   9   22:1     0         MSGBLK := MSGINDEX DIV 12;
  3322   9   22:1     6         MSGX := 42 * (MSGINDEX MOD 12);
  3323   9   22:1    14         IF MSGBLK <> CURMSGBL THEN
  3324   9   22:2    23           BEGIN
  3325   9   22:3    23             UNITREAD( DRIVE1, MESSAGE, BLOCKSZ, MSGBLK0 + MSGBLK, 0);
  3326   9   22:3    41             CURMSGBL := MSGBLK
  3327   9   22:2    41           END;
  3328   9   22:1    47         MOVELEFT( MESSAGE[ MSGX], STRBUFF.BUFF, 42);
  3329   9   22:1    61         FOR MSGX := 1 TO LENGTH( STRBUFF.BUFF) DO
  3330   9   22:2    80           STRBUFF.BUFF[ MSGX] := CHR( (ORD( STRBUFF.BUFF[ MSGX]) + 69 +
  3331   9   22:2    97                                        MSGINDEX + 3 * MSGX
  3332   9   22:2   100                                       ) 
  3333   9   22:2   105                                        MOD 256
  3334   9   22:2   105                                     )
  3335   9   22:0   109       END;
  3336   9   22:0   134     
  3337   9   22:0   134     
  3338   9   23:D     1     PROCEDURE DOMSG( MSGLINEX: INTEGER;   (* P010317 *)
  3339   9   23:D     2                      UNUSEDXX: BOOLEAN);
  3340   9   23:D     3     
  3341   9   23:D     3     
  3342   9   24:D     1       PROCEDURE DO1LINE;  (* P010318 *)
  3343   9   24:D     1       
  3344   9   24:0     0         BEGIN
  3345   9   24:1     0           IF LINECNT = 4 THEN
  3346   9   24:2     7             BEGIN
  3347   9   24:3     7               TEMPWIN := GETWIN( 7, 5, 26, 3, 8, TRUE);
  3348   9   24:3    21               CENTSTR( TEMPWIN, 'PRESS (RETURN) FOR MORE');
  3349   9   24:3    53               GETCR;
  3350   9   24:3    56               CLEARWIN( MSGSWIN, FALSE);
  3351   9   24:3    63               DELWIN( TEMPWIN, TRUE);
  3352   9   24:3    70               LINECNT := 0
  3353   9   24:2    70             END;
  3354   9   24:1    74           DECRYPTM( MSGLINEX);
  3355   9   24:1    79           MVCURSOR( MSGSWIN, 0, LINECNT);
  3356   9   24:1    89           PRINTSTR( MSGSWIN, STRBUFF.BUFF);
  3357   9   24:1    99           MSGLINEX := MSGLINEX + 1;
  3358   9   24:1   107           LINECNT := LINECNT + 1
  3359   9   24:0   110         END;  (* DO1LINE *)
  3360   9   24:0   128         
  3361   9   24:0   128         
  3362   9   23:0     0       BEGIN (* DOMSG *)
  3363   9   23:1     0         LINECNT := 0;
  3364   9   23:1     4         REPEAT
  3365   9   23:2     4           DO1LINE
  3366   9   23:1     4         UNTIL STRBUFF.ENDMSG;
  3367   9   23:1    12         TEMPWIN := GETWIN (12, 5, 16, 3, 8, TRUE);
  3368   9   23:1    26         CENTSTR( TEMPWIN, 'PRESS (RETURN)');
  3369   9   23:1    49         GETCR;
  3370   9   23:1    52         DELWIN( TEMPWIN, TRUE)
  3371   9   23:0    56       END;  (* DOMSG *)
  3372   9   23:0    74       
  3373   9   23:0    74       
  3374   9   25:D     3     FUNCTION GOTITEM( CHARX: INTEGER;  (* P010319 *)
  3375   9   25:D     4                       ITEMX: INTEGER) : BOOLEAN;
  3376   9   25:D     5     
  3377   9   25:D     5       VAR
  3378   9   25:D     5            POSSX : INTEGER;
  3379   9   25:D     6            
  3380   9   25:0     0       BEGIN
  3381   9   25:1     0         ITEMX := ITEMX + 1000;
  3382   9   25:1     7         GOTITEM := FALSE;
  3383   9   25:1    10         WITH CHARACTR[ CHARX] DO
  3384   9   25:2    17           BEGIN
  3385   9   25:3    17             IF POSS.POSSCNT = 8 THEN
  3386   9   25:4    24               EXIT( GOTITEM);
  3387   9   25:3    28             FOR POSSX := 1 TO POSS.POSSCNT DO
  3388   9   25:4    41               IF POSS.POSSESS[ POSSX].EQINDEX = ITEMX THEN
  3389   9   25:5    54                 EXIT( GOTITEM);
  3390   9   25:3    65             CLEARWIN( MSGSWIN, TRUE);
  3391   9   25:3    72             CENTSTR( MSGSWIN, CONCAT( CHARACTR[ CHARX].NAME, ' GOT ITEM'));
  3392   9   25:3   112             POSSX := POSS.POSSCNT + 1;
  3393   9   25:3   119             POSS.POSSCNT := POSSX;
  3394   9   25:3   124             POSS.POSSESS[ POSSX].EQINDEX := ITEMX;
  3395   9   25:3   136             POSS.POSSESS[ POSSX].EQUIPED := FALSE;
  3396   9   25:3   146             POSS.POSSESS[ POSSX].CURSED  := FALSE
  3397   9   25:2   156           END;
  3398   9   25:1   158         GOTITEM := TRUE
  3399   9   25:0   158       END;
  3400   9   25:0   176       
  3401   9   25:0   176       
  3402   9   26:D     1     PROCEDURE TRYGET;  (* P01031A *)
  3403   9   26:D     1     
  3404   9   26:D     1       VAR
  3405   9   26:D     1            GOTONE : BOOLEAN;
  3406   9   26:D     2            CHARX  : INTEGER;
  3407   9   26:D     3            
  3408   9   26:0     0       BEGIN
  3409   9   26:1     0         GOTONE := FALSE;
  3410   9   26:1     3         FOR CHARX := 0 TO PARTYCNT - 1 DO
  3411   9   26:2    16           IF NOT GOTONE THEN
  3412   9   26:3    20             GOTONE := GOTITEM( CHARX, AUX0)
  3413   9   26:0    24       END;
  3414   9   26:0    52       
  3415   9   26:0    52       
  3416   9   27:D     1     PROCEDURE WHOWADE;  (* P01031B *)
  3417   9   27:D     1     
  3418   9   27:D     1       VAR
  3419   9   27:D     1            WADEX : INTEGER;
  3420   9   27:D     2            
  3421   9   27:D     2            
  3422   9   28:D     1       PROCEDURE MAKWORSE( THISSTAT: TSTATUS);  (* P01031C *)
  3423   9   28:D     2       
  3424   9   28:0     0         BEGIN
  3425   9   28:1     0           IF THISSTAT > CHARACTR[ WADEX].STATUS THEN
  3426   9   28:2    13             CHARACTR[ WADEX].STATUS := THISSTAT
  3427   9   28:0    22         END;
  3428   9   28:0    36         
  3429   9   28:0    36         
  3430   9   27:0     0       BEGIN (* WHOWADE *)
  3431   9   27:1     0         CLEARWIN( MSGSWIN, TRUE);
  3432   9   27:1     7         CENTSTR( MSGSWIN, 'WHO (NUM) WILL WADE ?');
  3433   9   27:1    37         CENTSTR( MSGSWIN, '(RETURN) EXITS');
  3434   9   27:1    60         REPEAT
  3435   9   27:2    60           GETKEY;
  3436   9   27:2    63           IF INCHAR = CHR( CRETURN) THEN
  3437   9   27:3    68             EXIT( WHOWADE);
  3438   9   27:2    72           WADEX := ORD( INCHAR) - ORD( '1')
  3439   9   27:1    74         UNTIL (WADEX >= 0) AND (WADEX < PARTYCNT);
  3440   9   27:1    86         IF AUX0 = -1 THEN
  3441   9   27:2    94           AUX0 := RANDOM MOD 7;
  3442   9   27:2   104           
  3443   9   27:1   104         CASE AUX0 OF
  3444   9   27:1   109           0:  BEGIN
  3445   9   27:3   109                 IF CHARACTR[ WADEX].STATUS < DEAD THEN
  3446   9   27:4   120                   BEGIN
  3447   9   27:5   120                     CHARACTR[ WADEX].STATUS := OK;
  3448   9   27:5   129                     CHARACTR[ WADEX].HPMAX  := CHARACTR[ WADEX].HPMAX - 8;
  3449   9   27:5   146                     CHARACTR[ WADEX].HPLEFT := CHARACTR[ WADEX].HPMAX;
  3450   9   27:5   161                     IF CHARACTR[ WADEX].HPMAX <= 0 THEN
  3451   9   27:6   172                       MAKWORSE( DEAD);
  3452   9   27:4   175                   END;
  3453   9   27:2   175               END;
  3454   9   27:2   177               
  3455   9   27:1   177           1:  BEGIN
  3456   9   27:3   177                 IF (CHARACTR[ WADEX].ATTRIB[ IQ] = 3) OR
  3457   9   27:3   191                    (CHARACTR[ WADEX].ATTRIB[ PIETY] = 3) THEN
  3458   9   27:4   208                   MAKWORSE( DEAD)
  3459   9   27:3   209                 ELSE
  3460   9   27:4   213                   BEGIN
  3461   9   27:5   213                     CHARACTR[ WADEX].AGE := CHARACTR[ WADEX].AGE - 52;
  3462   9   27:5   230                     CHARACTR[ WADEX].ATTRIB[ IQ] :=
  3463   9   27:5   241                       CHARACTR[ WADEX].ATTRIB[ IQ] - 1;
  3464   9   27:5   256                     CHARACTR[ WADEX].ATTRIB[ PIETY] :=
  3465   9   27:5   267                       CHARACTR[ WADEX].ATTRIB[ PIETY] - 1
  3466   9   27:4   279                   END
  3467   9   27:2   282               END;
  3468   9   27:2   284             
  3469   9   27:1   284           2:  CHARACTR[ WADEX].LOSTXYL.POISNAMT[ 1] := 1;
  3470   9   27:1   300           3:  MAKWORSE( ASLEEP);
  3471   9   27:1   305           4:  MAKWORSE( PLYZE);
  3472   9   27:1   310           5:  MAKWORSE( STONED);
  3473   9   27:1   315           6:  IF CHARACTR[ WADEX].STATUS = DEAD THEN
  3474   9   27:3   326                 IF (RANDOM MOD 10 < 3) THEN
  3475   9   27:4   337                   BEGIN
  3476   9   27:5   337                     CHARACTR[ WADEX].STATUS := OK;
  3477   9   27:5   346                     CHARACTR[ WADEX].HPLEFT := CHARACTR[ WADEX].HPMAX
  3478   9   27:4   358                   END
  3479   9   27:3   361                 ELSE
  3480   9   27:4   363                   CHARACTR[ WADEX].STATUS := ASHES;
  3481   9   27:1   374         END
  3482   9   27:0   396       END;  (* WHOWADE *)
  3483   9   27:0   414       
  3484   9   27:0   414       
  3485   9   29:D     1     PROCEDURE DOSEARCH;  (* P01031D *)
  3486   9   29:D     1     
  3487   9   29:D     1     
  3488   9   30:D     1       PROCEDURE TRYTRADE;  (* P01031E *)
  3489   9   30:D     1       
  3490   9   30:D     1         VAR
  3491   9   30:D     1              TRAD4ITM : INTEGER;
  3492   9   30:D     2              CHARX    : INTEGER;
  3493   9   30:D     3              
  3494   9   30:D     3              
  3495   9   31:D     1         PROCEDURE FND2TRAD( CHARX: INTEGER;  (* P01031F *)
  3496   9   31:D     2                             ITEMX: INTEGER);
  3497   9   31:D     3         
  3498   9   31:D     3           VAR
  3499   9   31:D     3                POSX : INTEGER;
  3500   9   31:D     4                
  3501   9   31:0     0           BEGIN
  3502   9   31:1     0             WITH CHARACTR[ CHARX] DO
  3503   9   31:2     7               BEGIN
  3504   9   31:3     7                 FOR POSX := 1 TO POSS.POSSCNT DO
  3505   9   31:4    20                   BEGIN
  3506   9   31:5    20                     IF POSS.POSSESS[ POSX].EQINDEX = ITEMX THEN
  3507   9   31:6    33                       BEGIN
  3508   9   31:7    33                         AUX0 := AUX0 + 1000;
  3509   9   31:7    43                         POSS.POSSESS[ POSX].EQINDEX := AUX0;
  3510   9   31:7    57                         POSS.POSSESS[ POSX].EQUIPED := FALSE;
  3511   9   31:7    67                         POSS.POSSESS[ POSX].IDENTIF := FALSE;
  3512   9   31:7    79                         CENTSTR( MSGSWIN, CONCAT( CHARACTR[ CHARX].NAME,
  3513   9   31:7    98                                                   ' TRADED AN ITEM.'));
  3514   9   31:7   126                         PAUSE2;
  3515   9   31:7   129                         EXIT( TRYTRADE)
  3516   9   31:6   133                       END
  3517   9   31:4   133                   END
  3518   9   31:2   133               END
  3519   9   31:0   140           END;  (* FND2TRAD *)
  3520   9   31:0   154           
  3521   9   31:0   154           
  3522   9   30:0     0         BEGIN (* TRYTRADE *)
  3523   9   30:1     0           CLEARWIN( MSGSWIN, TRUE);
  3524   9   30:1     7           AUX0 := AUX0 - 20000;
  3525   9   30:1    17           TRAD4ITM := AUX0 DIV 100 + 1000;
  3526   9   30:1    28           AUX0 := AUX0 MOD 100;
  3527   9   30:1    36           FOR CHARX := 0 TO PARTYCNT - 1 DO
  3528   9   30:2    49             FND2TRAD( CHARX, TRAD4ITM);
  3529   9   30:1    60           CENTSTR( MSGSWIN, 'NOT WITHOUT PAYMENT')
  3530   9   30:0    85         END;  (* TRYTRADE *)
  3531   9   30:0   102         
  3532   9   30:0   102         
  3533   9   29:0     0       BEGIN (* DOSEARCH *)
  3534   9   29:1     0         CLEARWIN( MSGSWIN, TRUE);
  3535   9   29:1     7         GETYN( 'SEARCH');
  3536   9   29:1    18         IF INCHAR = 'N' THEN
  3537   9   29:2    23           EXITSPCL;
  3538   9   29:1    25         IF AUX0 > 0 THEN
  3539   9   29:2    32           BEGIN
  3540   9   29:3    32             ATTK012 := 0;
  3541   9   29:3    36             ENEMYINX := AUX0;
  3542   9   29:3    42             ENCB4RUN := FALSE;
  3543   9   29:3    46             XGOTO := XCOMBAT
  3544   9   29:2    46           END
  3545   9   29:1    50         ELSE
  3546   9   29:2    52           BEGIN
  3547   9   29:3    52             AUX0 := - AUX0;
  3548   9   29:3    59             IF AUX0 >= 20000 THEN
  3549   9   29:4    68               TRYTRADE
  3550   9   29:3    68             ELSE
  3551   9   29:4    72               TRYGET
  3552   9   29:2    72           END
  3553   9   29:0    74       END;  (* DOSEARCH *)
  3554   9   29:0    86       
  3555   9   29:0    86       
  3556   9   32:D     1     PROCEDURE BOUNCEBK;  (* P010320 *)
  3557   9   32:D     1     
  3558   9   32:0     0       BEGIN
  3559   9   32:1     0         CASE DIRECTIO OF
  3560   9   32:1     3           0:  MAZEY := MAZEY - 1;
  3561   9   32:1    10           1:  MAZEX := MAZEX - 1;
  3562   9   32:1    17           2:  MAZEY := MAZEY + 1;
  3563   9   32:1    24           3:  MAZEX := MAZEX + 1;
  3564   9   32:1    31         END;
  3565   9   32:1    46         MAZEY := (MAZEY + 20) MOD 20;
  3566   9   32:1    53         MAZEX := (MAZEX + 20) MOD 20;
  3567   9   32:1    60         IF AUX1 >= 0 THEN
  3568   9   32:2    67             DOMSG( AUX1, FALSE)
  3569   9   32:0    71       END;
  3570   9   32:0    86   
  3571   9   32:0    86   
  3572   9   33:D     1     PROCEDURE ITM2PASS;  (* P010321 *)
  3573   9   33:D     1     
  3574   9   33:D     1     VAR
  3575   9   33:D     1          POSX  : INTEGER;
  3576   9   33:D     2          CHARX : INTEGER;
  3577   9   33:D     3          
  3578   9   33:0     0       BEGIN
  3579   9   33:1     0         AUX0 := AUX0 + 1000;
  3580   9   33:1    10         FOR CHARX := 0 TO PARTYCNT - 1 DO
  3581   9   33:2    23           WITH CHARACTR[ CHARX] DO
  3582   9   33:3    30             BEGIN
  3583   9   33:4    30               FOR POSX := 1 TO POSS.POSSCNT DO
  3584   9   33:5    43                 IF POSS.POSSESS[ POSX].EQINDEX = AUX0 THEN
  3585   9   33:6    58                   EXITSPCL
  3586   9   33:3    58             END;
  3587   9   33:1    74         BOUNCEBK
  3588   9   33:0    74       END;
  3589   9   33:0    92       
  3590   9   33:0    92       
  3591   9   34:D     1     PROCEDURE CHKALIGN;  (* P010322 *)
  3592   9   34:D     1     
  3593   9   34:D     1       VAR
  3594   9   34:D     1            CHARX : INTEGER;
  3595   9   34:D     2            
  3596   9   34:0     0       BEGIN
  3597   9   34:1     0         FOR CHARX := 0 TO PARTYCNT - 1 DO
  3598   9   34:2    13           WITH CHARACTR[ CHARX] DO
  3599   9   34:3    20             BEGIN
  3600   9   34:4    20               CASE ALIGN OF
  3601   9   34:4    25               
  3602   9   34:4    25                    GOOD:  IF (AUX0 = 0) OR (AUX0 = 2) OR
  3603   9   34:5    36                              (AUX0 = 4) OR (AUX0 = 6) THEN
  3604   9   34:6    50                             BOUNCEBK;
  3605   9   34:6    54                         
  3606   9   34:4    54                 NEUTRAL:  IF (AUX0 = 0) OR (AUX0 = 1) OR
  3607   9   34:5    65                              (AUX0 = 4) OR (AUX0 = 5) THEN
  3608   9   34:6    79                             BOUNCEBK;
  3609   9   34:6    83                         
  3610   9   34:4    83                    EVIL:  IF (AUX0 < 4) THEN
  3611   9   34:6    90                             BOUNCEBK
  3612   9   34:4    90               END
  3613   9   34:3   108             END
  3614   9   34:0   108       END;  (* CHKALIGN *)
  3615   9   34:0   130       
  3616   9   34:0   130       
  3617   9   35:D     1     PROCEDURE CHKAUX0;  (* P010323 *)
  3618   9   35:D     1     
  3619   9   35:0     0       BEGIN
  3620   9   35:1     0         IF AUX0 = 99 THEN
  3621   9   35:2     7           LIGHT := LIGHT + 50
  3622   9   35:1    10         ELSE IF AUX0 = -99 THEN
  3623   9   35:3    25           LIGHT := 0
  3624   9   35:2    25         ELSE
  3625   9   35:3    31           ACMOD2 := AUX0
  3626   9   35:0    31       END;  (* CHKAUX0 *)
  3627   9   35:0    50       
  3628   9   35:0    50       
  3629   9   36:D     1     PROCEDURE BCK2SHOP;  (* P010324 *)
  3630   9   36:D     1     
  3631   9   36:0     0       BEGIN
  3632   9   36:1     0         MAZELEV := 0;
  3633   9   36:1     3         XGOTO := XNEWMAZE
  3634   9   36:0     3       END;
  3635   9   36:0    20         
  3636   9   36:0    20         
  3637   9   37:D     1     PROCEDURE RIDDLES;  (* P010325 *)
  3638   9   37:D     1     
  3639   9   37:D     1       VAR
  3640   9   37:D     1            ANSWER : STRING[ 40];
  3641   9   37:D    22     
  3642   9   37:0     0       BEGIN
  3643   9   37:1     0         CLEARWIN( MSGSWIN, TRUE);
  3644   9   37:1     7         CENTSTR(  MSGSWIN, 'ANSWER ?');
  3645   9   37:1    24         MVCURSOR( MSGSWIN, 5, 2);
  3646   9   37:1    32         GETSTR(   MSGSWIN, ANSWER, 38);
  3647   9   37:1    41         DECRYPTM( AUX0);
  3648   9   37:1    46         CLEARWIN( MSGSWIN, TRUE);
  3649   9   37:1    53         IF STRBUFF.BUFF <> ANSWER THEN
  3650   9   37:2    63           BEGIN
  3651   9   37:3    63             AUX1 := - 1;
  3652   9   37:3    68             CENTSTR( MSGSWIN, 'WRONG!');
  3653   9   37:3    83             BOUNCEBK
  3654   9   37:2    83           END
  3655   9   37:1    85         ELSE
  3656   9   37:2    87           CENTSTR( MSGSWIN, 'RIGHT!')
  3657   9   37:0    99       END;
  3658   9   37:0   114 
  3659   9   37:0   114 
  3660   9   38:D     1     PROCEDURE FEEIS;  (* P010326 *)
  3661   9   38:D     1     
  3662   9   38:D     1       VAR
  3663   9   38:D     1            GOLDTOT : TWIZLONG;
  3664   9   38:D     4            FEE     : TWIZLONG;
  3665   9   38:D     7     
  3666   9   38:D     7     
  3667   9   39:D     1       PROCEDURE FEE2LONG;  (* P010327 *)
  3668   9   39:D     1       
  3669   9   39:D     1         VAR
  3670   9   39:D     1              MULT10 : INTEGER;
  3671   9   39:D     2              STRX   : INTEGER;
  3672   9   39:D     3       
  3673   9   39:0     0         BEGIN
  3674   9   39:1     0           IF STRBUFF.BUFF[ 1] >= '@' THEN
  3675   9   39:2    10             BEGIN
  3676   9   39:3    10               BOUNCEFL := ORD( STRBUFF.BUFF[ 1]) - ORD( 'A') + 1;
  3677   9   39:3    23               STRBUFF.BUFF := COPY( STRBUFF.BUFF, 2,
  3678   9   39:3    34                                     ORD( STRBUFF.BUFF[ 0]) - 1)
  3679   9   39:2    47             END
  3680   9   39:1    49           ELSE
  3681   9   39:2    51             BOUNCEFL := 0;
  3682   9   39:1    55           FILLCHAR( FEE, 6, 0);
  3683   9   39:1    63           MULT10 := 10;
  3684   9   39:1    66           FOR STRX := 1 TO LENGTH( STRBUFF.BUFF) DO
  3685   9   39:2    82             BEGIN
  3686   9   39:3    82               MULTLONG( FEE, MULT10);
  3687   9   39:3    90               FEE.LOW := FEE.LOW + ORD( STRBUFF.BUFF[ STRX]) - ORD( '0')
  3688   9   39:2   101             END
  3689   9   39:0   105         END;
  3690   9   39:0   126         
  3691   9   39:0   126         
  3692   9   40:D     1       PROCEDURE CHKGOLD;  (* P010328 *)
  3693   9   40:D     1       
  3694   9   40:D     1         VAR
  3695   9   40:D     1              CHARX : INTEGER;
  3696   9   40:D     2       
  3697   9   40:0     0         BEGIN
  3698   9   40:1     0           FILLCHAR( GOLDTOT, 6, 0);
  3699   9   40:1     8           FOR CHARX := 0 TO PARTYCNT - 1 DO
  3700   9   40:2    21             ADDLONGS( GOLDTOT, CHARACTR[ CHARX].GOLD);
  3701   9   40:1    41           IF TESTLONG( GOLDTOT, FEE) <> -1 THEN
  3702   9   40:2    57             EXIT( CHKGOLD);
  3703   9   40:1    61           CENTSTR( MSGSWIN, 'NEED MORE $');
  3704   9   40:1    81           IF BOUNCEFL = 0 THEN
  3705   9   40:2    88             BOUNCEBK;
  3706   9   40:1    90           EXITSPCL
  3707   9   40:0    90         END;
  3708   9   40:0   106         
  3709   9   40:0   106         
  3710   9   41:D     1       PROCEDURE PAYGOLD;  (* P010329 *)
  3711   9   41:D     1       
  3712   9   41:D     1         VAR
  3713   9   41:D     1              CHARX : INTEGER;
  3714   9   41:D     2       
  3715   9   41:0     0         BEGIN
  3716   9   41:1     0           FILLCHAR( GOLDTOT, 6, 0);
  3717   9   41:1     8           FOR CHARX := 0 TO PARTYCNT - 1 DO
  3718   9   41:2    21             BEGIN
  3719   9   41:3    21               IF FEE <> GOLDTOT THEN
  3720   9   41:4    32                 IF TESTLONG( FEE, CHARACTR[ CHARX].GOLD) = 1 THEN
  3721   9   41:5    51                   BEGIN
  3722   9   41:6    51                     SUBLONGS( FEE, CHARACTR[ CHARX].GOLD);
  3723   9   41:6    64                     FILLCHAR( CHARACTR[ CHARX].GOLD, 6, 0)
  3724   9   41:5    76                   END
  3725   9   41:4    76                 ELSE
  3726   9   41:5    78                   BEGIN
  3727   9   41:6    78                     SUBLONGS( CHARACTR[ CHARX].GOLD, FEE);
  3728   9   41:6    91                     FILLCHAR( FEE, 6, 0)
  3729   9   41:5    99                   END
  3730   9   41:2    99             END;
  3731   9   41:1   106           CENTSTR( MSGSWIN, 'THANKS!')
  3732   9   41:0   119         END;
  3733   9   41:0   136         
  3734   9   41:0   136         
  3735   9   38:0     0       BEGIN (* FEEIS *)
  3736   9   38:1     0         DECRYPTM( AUX0);
  3737   9   38:1     5         FEE2LONG;
  3738   9   38:1     7         CLEARWIN( MSGSWIN, TRUE);
  3739   9   38:1    14         CENTSTR( MSGSWIN, CONCAT( 'FEE IS ', STRBUFF.BUFF));
  3740   9   38:1    51         GETYN( 'PAY');
  3741   9   38:1    59         AUX1 := -1;
  3742   9   38:1    64         IF INCHAR = 'N' THEN
  3743   9   38:2    69           BEGIN
  3744   9   38:3    69             IF BOUNCEFL = 0 THEN
  3745   9   38:4    76                BOUNCEBK;
  3746   9   38:3    78             EXITSPCL
  3747   9   38:2    78           END
  3748   9   38:1    80         ELSE
  3749   9   38:2    82           BEGIN
  3750   9   38:3    82             CLEARWIN( MSGSWIN, TRUE);
  3751   9   38:3    89             CHKGOLD;
  3752   9   38:3    91             PAYGOLD;
  3753   9   38:3    93             IF BOUNCEFL > 0 THEN
  3754   9   38:4   100               BEGIN
  3755   9   38:5   100                 MAZEX   := MAZEFLOR.AUX2[ BOUNCEFL];
  3756   9   38:5   112                 MAZEY   := MAZEFLOR.AUX1[ BOUNCEFL];
  3757   9   38:5   124                 MAZELEV := MAZEFLOR.AUX0[ BOUNCEFL];
  3758   9   38:5   136                 XGOTO := XNEWMAZE
  3759   9   38:4   136               END
  3760   9   38:2   140           END
  3761   9   38:0   140       END;
  3762   9   38:0   152       
  3763   9   38:0   152       
  3764   9   42:D     1     PROCEDURE LOOKOUT;  (* P01032A *)
  3765   9   42:D     1     
  3766   9   42:D     1       VAR
  3767   9   42:D     1            Y  : INTEGER;
  3768   9   42:D     2            X  : INTEGER;
  3769   9   42:D     3            Y2 : INTEGER;
  3770   9   42:D     4            X2 : INTEGER;
  3771   9   42:D     5            
  3772   9   42:0     0       BEGIN
  3773   9   42:1     0         FOR X2 := - AUX0 TO AUX0 DO
  3774   9   42:2    16           FOR Y2 := - AUX0 TO AUX0 DO
  3775   9   42:3    32             BEGIN
  3776   9   42:4    32               X := (MAZEX + X2 + 20) MOD 20;
  3777   9   42:4    41               Y := (MAZEY + Y2 + 20) MOD 20;
  3778   9   42:4    50               FIGHTMAP[ X, Y] := TRUE
  3779   9   42:3    60             END;
  3780   9   42:1    76         FIGHTMAP[ MAZEX, MAZEY] := FALSE
  3781   9   42:0    86       END;
  3782   9   42:0   104       
  3783   9   42:0   104       
  3784   9   43:D     1     PROCEDURE SWITCHLOC;  (* P01032B *)
  3785   9   43:D     1     
  3786   9   43:D     1     
  3787   9   44:D     1       PROCEDURE SWITCH( VAR FIRST:  INTEGER;  (* P01032C *)
  3788   9   44:D     2                         VAR SECOND: INTEGER);
  3789   9   44:D     3       
  3790   9   44:D     3         VAR
  3791   9   44:D     3              SAVE : INTEGER;
  3792   9   44:D     4       
  3793   9   44:0     0         BEGIN
  3794   9   44:1     0           SAVE   := FIRST;
  3795   9   44:1     4           FIRST  := SECOND;
  3796   9   44:1     8           SECOND := SAVE
  3797   9   44:0     9         END;
  3798   9   44:0    24         
  3799   9   44:0    24         
  3800   9   43:0     0       BEGIN  (* SWITCHLOC *)
  3801   9   43:1     0         XGOTO2 := XCOMBAT;
  3802   9   43:1     4         IF SAVELEV = MAZELEV THEN
  3803   9   43:2    11           XGOTO := XRUNNER
  3804   9   43:1    11         ELSE
  3805   9   43:2    17           XGOTO := XNEWMAZE;
  3806   9   43:1    21         SWITCH( MAZEX,   SAVEX);
  3807   9   43:1    28         SWITCH( MAZEY,   SAVEY);
  3808   9   43:1    35         SWITCH( MAZELEV, SAVELEV);
  3809   9   43:1    42         EXITSPCL
  3810   9   43:0    42       END;  (* SWITCHLOC *)
  3811   9   43:0    56       
  3812   9   43:0    56       
  3813   9   45:D     1     PROCEDURE PICTMESS;  (* P01032D *)
  3814   9   45:D     1     
  3815   9   45:D     1     
  3816   9   46:D     1       PROCEDURE PICTURE( CACHEADR: INTEGER);  (* P01032E *)
  3817   9   46:D     2       
  3818   9   46:D     2         TYPE
  3819   9   46:D     2              BYTE = PACKED ARRAY [ 0..1] OF 0..255;
  3820   9   46:D     2              
  3821   9   46:D     2         VAR
  3822   9   46:D     2              HIRESC0  : INTEGER;
  3823   9   46:D     3              VERTICAL : INTEGER;
  3824   9   46:D     4              HORIZONT : INTEGER;
  3825   9   46:D     5              MEMA00   : RECORD CASE BOOLEAN OF
  3826   9   46:D     5                           FALSE : (I : INTEGER);
  3827   9   46:D     5                           TRUE  : (P : ^BYTE);
  3828   9   46:D     5                         END;
  3829   9   46:D     6                         
  3830   9   46:0     0         BEGIN
  3831   9   46:1     0           MEMA00.I := 2560;
  3832   9   46:1     5           MOVELEFT( IOCACHE[ CACHEADR], MEMA00.P^, 512);
  3833   9   46:1    16           HIRESC0 := 192;
  3834   9   46:1    21           FOR HORIZONT := 0 TO 5 DO
  3835   9   46:2    32             BEGIN
  3836   9   46:3    32               MVCURSOR( MAINWIN, 13, 7 + HORIZONT);
  3837   9   46:3    42               FOR VERTICAL := 0 TO 9 DO
  3838   9   46:4    53                 BEGIN
  3839   9   46:5    53                   PRPICCH( MAINWIN, CHR( HIRESC0));
  3840   9   46:5    60                   HIRESC0 := HIRESC0 + 1
  3841   9   46:4    61                 END;
  3842   9   46:2    72             END;
  3843   9   46:0    79         END;
  3844   9   46:0    96         
  3845   9   46:0    96         
  3846   9   45:0     0       BEGIN  (* PICTMESS *)
  3847   9   45:1     0         PICTURE( GETREC( ZSPCCHRS, AUX0, 512));
  3848   9   45:1    14         DOMSG( AUX1, TRUE)
  3849   9   45:0    18       END;
  3850   9   45:0    32       
  3851   9   45:0    32       
  3852   9   47:D     1     PROCEDURE ITMORTEL;  (* P01032F *)
  3853   9   47:D     1     
  3854   9   47:D     1       VAR
  3855   9   47:D     1           POSX  : INTEGER;
  3856   9   47:D     2           CHARX : INTEGER;
  3857   9   47:D     3           
  3858   9   47:0     0       BEGIN
  3859   9   47:1     0         AUX1 := AUX1 + 1000;
  3860   9   47:1    10         FOR CHARX := 0 TO PARTYCNT - 1 DO
  3861   9   47:2    23           FOR POSX := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
  3862   9   47:3    40             IF CHARACTR[ CHARX].POSS.POSSESS[ POSX].EQINDEX = AUX1 THEN
  3863   9   47:4    59               EXIT( ITMORTEL);
  3864   9   47:1    77         MAZEX := AUX0 DIV 100;
  3865   9   47:1    84         MAZEY := AUX0 MOD 100;
  3866   9   47:1    91         XGOTO := XNEWMAZE
  3867   9   47:0    91       END;
  3868   9   47:0   112       
  3869   9   47:0   112       
  3870   9   48:D     1     PROCEDURE SPCMONST( CRYSTYPE : INTEGER);  (* P010330 *)
  3871   9   48:D     2     
  3872   9   48:D     2       VAR
  3873   9   48:D     2            CRY2SKIP : BOOLEAN;
  3874   9   48:D     3     
  3875   9   48:D     3     
  3876   9   49:D     1       PROCEDURE SDISK5SP;  (* P010331 *)
  3877   9   49:D     1       
  3878   9   49:D     1         VAR
  3879   9   49:D     1              POSID   : INTEGER;
  3880   9   49:D     2              POSX    : INTEGER;
  3881   9   49:D     3              CHARX   : INTEGER;
  3882   9   49:D     4              CHARREC : TCHAR;
  3883   9   49:D   108       
  3884   9   49:0     0         BEGIN
  3885   9   49:1     0           BORBEART := FALSE;
  3886   9   49:1     4           BCRYSGOO := FALSE;
  3887   9   49:1     8           BCRYSEVI := FALSE;
  3888   9   49:1    12           BCRYSNEU := FALSE;
  3889   9   49:1    16           BSHIPBOT := FALSE;
  3890   9   49:1    20           FOR CHARX := 0 TO PARTYCNT - 1 DO
  3891   9   49:2    34             MOVELEFT( CHARACTR[ CHARX],
  3892   9   49:2    40                       IOCACHE[ GETRECW( ZCHAR,
  3893   9   49:2    44                                         CHARDISK[ CHARX],
  3894   9   49:2    51                                         SIZEOF( TCHAR))],
  3895   9   49:2    59                       SIZEOF( TCHAR));
  3896   9   49:1    71           FOR CHARX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
  3897   9   49:2    91             BEGIN
  3898   9   49:3    91               MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARX, SIZEOF( TCHAR))],
  3899   9   49:3   104                         CHARREC,
  3900   9   49:3   107                         SIZEOF( TCHAR));
  3901   9   49:3   112               IF CHARREC.STATUS <> LOST THEN
  3902   9   49:4   118                 FOR POSX := 1 TO CHARREC.POSS.POSSCNT DO
  3903   9   49:5   131                   BEGIN
  3904   9   49:6   131                     POSID := CHARREC.POSS.POSSESS[ POSX].EQINDEX;
  3905   9   49:6   141                     BORBEART := BORBEART OR (POSID = ORBEARTH);
  3906   9   49:6   153                     BCRYSGOO := BCRYSGOO OR (POSID = CRYSGOOD);
  3907   9   49:6   165                     BCRYSEVI := BCRYSEVI OR (POSID = CRYSEVIL);
  3908   9   49:6   177                     BCRYSNEU := BCRYSNEU OR (POSID = CRYSNEUT);
  3909   9   49:6   189                     BSHIPBOT := BSHIPBOT OR (POSID = SHIPBOTT)
  3910   9   49:5   197                   END
  3911   9   49:2   201             END
  3912   9   49:0   208         END;
  3913   9   49:0   234         
  3914   9   49:0   234         
  3915   9   48:0     0       BEGIN  (* SPCMONST *)
  3916   9   48:1     0         SDISK5SPC;
  3917   9   48:1     2         IF CRYSTYPE = CRYSGOOD THEN
  3918   9   48:2     9           CRY2SKIP := BCRYSGOO
  3919   9   48:1     9         ELSE
  3920   9   48:2    16           CRY2SKIP := BCRYSEVI;
  3921   9   48:1    21         IF BORBEART OR BCRYSNEU OR CRY2SKIP THEN
  3922   9   48:2    32           EXIT( SPCMONST);
  3923   9   48:1    36         TEMPWIN := GETWIN( 13, 10, 16, 3, 255, TRUE);
  3924   9   48:1    52         PRINTSTR( TEMPWIN, 'AN ENCOUNTER');
  3925   9   48:1    73         DELWIN( TEMPWIN, FALSE);
  3926   9   48:1    80         ATTK012 := 0;
  3927   9   48:1    84         ENEMYINX := AUX1;
  3928   9   48:1    90         ENCB4RUN := FALSE;
  3929   9   48:1    94         XGOTO := XCOMBAT
  3930   9   48:0    94       END;  (* SPCMONST *)
  3931   9   48:0   110       
  3932   9   48:0   110       
  3933   9   19:0     0     BEGIN  (* SPCMISC *)
  3934   9   19:1     0       MOVELEFT( IOCACHE[ GETREC( ZMAZE, MAZELEV - 1, SIZEOF( TMAZE))],
  3935   9   19:1    15                 MAZEFLOR,
  3936   9   19:1    19                 SIZEOF( TMAZE));
  3937   9   19:1    24       BOUNCEFL := SPCINDEX;
  3938   9   19:1    29       IF BOUNCEFL = 0 THEN
  3939   9   19:2    34         SWITCHLOC;
  3940   9   19:1    36       XGOTO2 := XSCNMSG;
  3941   9   19:1    40       MSGBLK0 := FINDFILE( DRIVE1, 'SCENARIO.MESGS');
  3942   9   19:1    64       IF MSGBLK0 < 0 THEN
  3943   9   19:2    69         EXIT( SPECIALS);
  3944   9   19:1    73       CURMSGBL := 0;
  3945   9   19:1    76       UNITREAD( DRIVE1, MESSAGE, BLOCKSZ, MSGBLK0, 0);
  3946   9   19:1    87       AUX2 := MAZEFLOR.AUX2[ BOUNCEFL];
  3947   9   19:1    96       AUX1 := MAZEFLOR.AUX1[ BOUNCEFL];
  3948   9   19:1   105       AUX0 := MAZEFLOR.AUX0[ BOUNCEFL];
  3949   9   19:1   114       XGOTO := XRUNNER;
  3950   9   19:1   118       IF AUX2 = 0 THEN
  3951   9   19:2   123         EXIT( SPECIALS);
  3952   9   19:1   127       IF (AUX2 = 1) OR (AUX2 = 4) OR (AUX2 = 8) THEN
  3953   9   19:2   140         BEGIN
  3954   9   19:3   140           IF AUX0 = 0 THEN
  3955   9   19:4   145             EXIT( SPECIALS)
  3956   9   19:3   149           ELSE
  3957   9   19:4   151             BEGIN
  3958   9   19:5   151               IF AUX2 <> 4 THEN
  3959   9   19:6   156                 BEGIN
  3960   9   19:7   156                   IF AUX0 > 0 THEN
  3961   9   19:8   161                     MAZEFLOR.AUX0[ BOUNCEFL] := AUX0 - 1;
  3962   9   19:7   171                   IF AUX0 = 1 THEN
  3963   9   19:8   176                     MAZEFLOR.SQRETYPE[ BOUNCEFL] := NORMAL;
  3964   9   19:6   185                 END
  3965   9   19:5   185               ELSE
  3966   9   19:6   187                 IF AUX0 < 0 THEN
  3967   9   19:7   192                   IF AUX0 > -1000 THEN
  3968   9   19:8   200                     MAZEFLOR.AUX0[ BOUNCEFL] := 0
  3969   9   19:7   206                   ELSE
  3970   9   19:8   210                     IF AUX0 > -20000 THEN
  3971   9   19:9   218                       AUX0 := AUX0 + 1000;
  3972   9   19:5   225               MOVELEFT( MAZEFLOR,
  3973   9   19:5   229                         IOCACHE[ GETRECW( ZMAZE, MAZELEV - 1, SIZEOF( TMAZE))],
  3974   9   19:5   244                         SIZEOF( TMAZE))
  3975   9   19:4   249             END
  3976   9   19:2   249         END;
  3977   9   19:1   249       MSGSWIN := GETWIN( 0, 0, 40, 6, 7, TRUE);
  3978   9   19:1   262       IF NOT ( (AUX2 > 12) OR (AUX2 = 5) OR (AUX2 = 6) ) THEN
  3979   9   19:2   276         DOMSG( AUX1,
  3980   9   19:2   277                  (AUX2 = 2)  OR (AUX2 = 3) OR (AUX2 = 4) OR
  3981   9   19:2   288                  (AUX2 = 10) OR (AUX2 = 11));
  3982   9   19:1   298       CASE AUX2 OF
  3983   9   19:1   301          2: TRYGET;
  3984   9   19:1   305          3: WHOWADE;
  3985   9   19:1   309          4: DOSEARCH;
  3986   9   19:1   313          5: ITM2PASS;
  3987   9   19:1   317          6: CHKALIGN;
  3988   9   19:1   321          7: CHKAUX0;
  3989   9   19:1   325          8: BCK2SHOP;
  3990   9   19:1   329          9: LOOKOUT;
  3991   9   19:1   333         10: RIDDLES;
  3992   9   19:1   337         11: FEEIS;
  3993   9   19:1   341         13: PICTMESS;
  3994   9   19:1   345         14: ITMORTEL;
  3995   9   19:1   349         15: SPCMONST( CRYSEVIL);
  3996   9   19:1   356         16: SPCMONST( CRYSGOOD);
  3997   9   19:1   363       END;
  3998   9   19:1   400       DELWIN( MSGSWIN, FALSE)
  3999   9   19:0   403     END;  (* SPCMISC *)
  4000   9   19:0   418     
  4001   9   19:0   418     
  4002   9    1:0     0   BEGIN  (* SPECIALS *)
  4003   9    1:1     0     IF XGOTO = XINSAREA THEN
  4004   9    1:2     7       INSPECT
  4005   9    1:1     7     ELSE
  4006   9    1:2    11       IF XGOTO = XCAMPSTF THEN
  4007   9    1:3    18         DUMAPIC;
  4008   9    1:1    20     XGOTO := XGOTO2;
  4009   9    1:1    26     SPCINDEX := BASE04;
  4010   9    1:1    29     IF SPCINDEX < 0 THEN
  4011   9    1:2    34       INITGAME
  4012   9    1:1    34     ELSE
  4013   9    1:2    38       SPCMISC
  4014   9    1:0    38   END;  (* SPECIALS *)
  4015   9    1:0    52 (*$I WIZ3B:SPECIALS2 *)
  4016   9    1:0    52 
  4016   9    1:0    52 (*$I WIZ3B:COMBAT    *)
  4017  10    1:D     1   SEGMENT PROCEDURE COMBAT;  (* P010401 *)
  4018  10    1:D     1 
  4019  10    1:D     1     CONST
  4020  10    1:D     1     
  4021  10    1:D     1         HALITO   =  4178;
  4022  10    1:D     1         MOGREF   =  2409;
  4023  10    1:D     1         KATINO   =  3983;
  4024  10    1:D     1         DUMAPIC  =  3245;
  4025  10    1:D     1         
  4026  10    1:D     1         DILTO    =  3340;
  4027  10    1:D     1         SOPIC    =  1953;
  4028  10    1:D     1         
  4029  10    1:D     1         MAHALITO =  6181;
  4030  10    1:D     1         MOLITO   =  4731;
  4031  10    1:D     1         
  4032  10    1:D     1         MORLIS   =  4744;
  4033  10    1:D     1         DALTO    =  3180;
  4034  10    1:D     1         LAHALITO =  6156;
  4035  10    1:D     1         
  4036  10    1:D     1         MAMORLIS =  7525;
  4037  10    1:D     1         MAKANITO =  6612;
  4038  10    1:D     1         MADALTO  =  4925;
  4039  10    1:D     1         
  4040  10    1:D     1         LAKANITO =  6587;
  4041  10    1:D     1         ZILWAN   =  4573;
  4042  10    1:D     1         MASOPIC  =  3990;
  4043  10    1:D     1         HAMAN    =  1562;
  4044  10    1:D     1         
  4045  10    1:D     1         MALOR    =  3128;
  4046  10    1:D     1         MAHAMAN  =  2597;
  4047  10    1:D     1         TILTOWAI = 11157;
  4048  10    1:D     1         
  4049  10    1:D     1         
  4050  10    1:D     1         KALKI    =  1449;
  4051  10    1:D     1         DIOS     =  2301;
  4052  10    1:D     1         BADIOS   =  3675;
  4053  10    1:D     1         MILWA    =  2889;
  4054  10    1:D     1         PORFIC   =  2287;
  4055  10    1:D     1         
  4056  10    1:D     1         MATU     =  3139;
  4057  10    1:D     1         CALFO    =     0; (* 1717 *)
  4058  10    1:D     1         MANIFO   =  2619;
  4059  10    1:D     1         MONTINO  =  5970;
  4060  10    1:D     1         
  4061  10    1:D     1         LOMILWA  =  5333;
  4062  10    1:D     1         DIALKO   =  2718;
  4063  10    1:D     1         LATUMAPI =  6491;
  4064  10    1:D     1         BAMATU   =  5169;
  4065  10    1:D     1         
  4066  10    1:D     1         DIAL     =   761;
  4067  10    1:D     1         BADIAL   =  1253;
  4068  10    1:D     1         LATUMOFI =  9463;
  4069  10    1:D     1         MAPORFIC =  4322;
  4070  10    1:D     1         
  4071  10    1:D     1         DIALMA   =  1614;
  4072  10    1:D     1         BADIALMA =  2446;
  4073  10    1:D     1         LITOKAN  =  4396;
  4074  10    1:D     1         KANDI    =  1185; (* 1885 *)
  4075  10    1:D     1         DI       =   180;
  4076  10    1:D     1         BADI     =   382;
  4077  10    1:D     1         
  4078  10    1:D     1         LORTO    =  4296;
  4079  10    1:D     1         MADI     =   547;
  4080  10    1:D     1         MABADI   =   759;
  4081  10    1:D     1         LOKTOFEI =  8330;
  4082  10    1:D     1         
  4083  10    1:D     1         MALIKTO  =  5514;
  4084  10    1:D     1         KADORTO  =  6673;
  4085  10    1:D     1         
  4086  10    1:D     1     VAR
  4087  10    1:D     1          CINITFL1 : INTEGER;
  4088  10    1:D     2          SURPRISE : INTEGER;
  4089  10    1:D     3          DONEFIGH : BOOLEAN;
  4090  10    1:D     4          COMB1WIN : TWINDOWP;
  4091  10    1:D     5          COMB2WIN : TWINDOWP;
  4092  10    1:D     6          BATTLERC : ARRAY[ 0..4] OF TENEMY2;
  4093  10    1:D   781          PREBATOR : ARRAY[ 0..5] OF INTEGER;
  4094  10    1:D   787          DRAINED  : ARRAY[ 0..5] OF BOOLEAN;
  4095  10    1:D   793          
  4096  10    2:D     1 PROCEDURE EXITCOMB; FORWARD;  (* P010402 *)
  4097  10    2:D     1     
  4098  10    2:D     1     
  4099  10    2:D     1 (* CINIT *)
  4100  10    2:D     1     
  4101  11    1:D     1     SEGMENT PROCEDURE CINIT;  (* P010501 *)
  4102  11    1:D     1     
  4103  11    1:D     1     
  4104  11    2:D     1       PROCEDURE ENATTACK;  (* P010502 *)
  4105  11    2:D     1       
  4106  11    2:D     1         VAR
  4107  11    2:D     1             UNUSEDXX : INTEGER;
  4108  11    2:D     2             ATTCKTYP : INTEGER;
  4109  11    2:D     3             CHARX    : INTEGER;
  4110  11    2:D     4             ENEMYX   : INTEGER;
  4111  11    2:D     5             GROUPI   : INTEGER;
  4112  11    2:D     6       
  4113  11    2:D     6       
  4114  11    3:D     3         FUNCTION CANATTCK : BOOLEAN;  (* P010503 *)
  4115  11    3:D     3         
  4116  11    3:0     0           BEGIN
  4117  11    3:1     0             CANATTCK :=
  4118  11    3:1     0              (NOT CHARACTR[ CHARX].WEPVSTY2[ 1][ BATTLERC[ GROUPI].B.CLASS])
  4119  11    3:1    28                OR
  4120  11    3:1    28              ((RANDOM MOD 100) < 50)
  4121  11    3:0    37           END;
  4122  11    3:0    52           
  4123  11    3:0    52           
  4124  11    4:D     1         PROCEDURE ENEMYSPL;  (* P010504 *)
  4125  11    4:D     1         
  4126  11    5:D     1           PROCEDURE SPELLEZR( VAR SPELLGR: INTEGER);  (* P010505 *)
  4127  11    5:D     2           
  4128  11    5:0     0             BEGIN
  4129  11    5:1     0               IF RANDOM MOD (BATTLERC[ GROUPI].A.ALIVECNT + 2) = 0 THEN
  4130  11    5:2    22                 SPELLGR := SPELLGR - 1
  4131  11    5:0    25             END;
  4132  11    5:0    40             
  4133  11    5:0    40             
  4134  11    6:D     1           PROCEDURE GETMAGSP( SPELLLEV: INTEGER);  (* P010506 *)
  4135  11    6:D     2           
  4136  11    6:D     2             VAR
  4137  11    6:D     2                  SPELLCAS : INTEGER;
  4138  11    6:D     3                  TWOTHIRD : BOOLEAN;
  4139  11    6:D     4           
  4140  11    6:0     0             BEGIN
  4141  11    6:1     0               WHILE (SPELLLEV > 1) AND ( (RANDOM MOD 100) > 70) DO
  4142  11    6:2    15                 SPELLLEV := SPELLLEV - 1;
  4143  11    6:1    22               TWOTHIRD := (RANDOM MOD 100) > 33;
  4144  11    6:1    33               SPELLEZR( BATTLERC[ GROUPI].B.MAGSPELS);
  4145  11    6:1    47               
  4146  11    6:1    47               CASE SPELLLEV OF
  4147  11    6:1    50               
  4148  11    6:1    50                 1:  IF TWOTHIRD THEN
  4149  11    6:3    53                       SPELLCAS := KATINO
  4150  11    6:2    53                     ELSE
  4151  11    6:3    60                       SPELLCAS := HALITO;
  4152  11    6:3    67                       
  4153  11    6:1    67                 2:  IF TWOTHIRD THEN
  4154  11    6:3    70                       SPELLCAS := DILTO
  4155  11    6:2    70                     ELSE
  4156  11    6:3    77                       SPELLCAS := HALITO;
  4157  11    6:3    84                       
  4158  11    6:1    84                 3:  IF TWOTHIRD THEN
  4159  11    6:3    87                       SPELLCAS := MOLITO
  4160  11    6:2    87                     ELSE
  4161  11    6:3    94                       SPELLCAS := MAHALITO;
  4162  11    6:3   101                       
  4163  11    6:1   101                 4:  IF TWOTHIRD THEN
  4164  11    6:3   104                       SPELLCAS := DALTO
  4165  11    6:2   104                     ELSE
  4166  11    6:3   111                       SPELLCAS := LAHALITO;
  4167  11    6:3   118                       
  4168  11    6:1   118                 5:  IF TWOTHIRD THEN
  4169  11    6:3   121                       SPELLCAS := LAHALITO
  4170  11    6:2   121                     ELSE
  4171  11    6:3   128                       SPELLCAS := MADALTO;
  4172  11    6:3   135                       
  4173  11    6:1   135                 6:  IF TWOTHIRD THEN
  4174  11    6:3   138                       SPELLCAS := MADALTO
  4175  11    6:2   138                     ELSE
  4176  11    6:3   145                       SPELLCAS := ZILWAN;
  4177  11    6:3   152                       
  4178  11    6:1   152                 7:  SPELLCAS := TILTOWAI;
  4179  11    6:1   159               END;
  4180  11    6:1   180               
  4181  11    6:1   180               ATTCKTYP := SPELLCAS
  4182  11    6:0   180             END;  (* GETMAGSP *)
  4183  11    6:0   198             
  4184  11    6:0   198             
  4185  11    7:D     1           PROCEDURE GETPRISP( SPELLLEV : INTEGER);  (* P010507 *)
  4186  11    7:D     2           
  4187  11    7:D     2             VAR
  4188  11    7:D     2                  SPELLCAS : INTEGER;
  4189  11    7:D     3                  TWOTHIRD : BOOLEAN;
  4190  11    7:D     4                  
  4191  11    7:0     0             BEGIN
  4192  11    7:1     0               TWOTHIRD := (RANDOM MOD 100) > 33;
  4193  11    7:1    11               SPELLEZR( BATTLERC[ GROUPI].B.PRISPELS);
  4194  11    7:1    25               
  4195  11    7:1    25               CASE SPELLLEV OF
  4196  11    7:1    28               
  4197  11    7:1    28                 1:  SPELLCAS := BADIOS;
  4198  11    7:1    35                 
  4199  11    7:1    35                 2:  SPELLCAS := MONTINO;
  4200  11    7:1    42                 
  4201  11    7:1    42                 3:  IF TWOTHIRD THEN
  4202  11    7:3    45                       SPELLCAS := BADIOS
  4203  11    7:2    45                     ELSE
  4204  11    7:3    52                       SPELLCAS := BADIAL;
  4205  11    7:3    59                       
  4206  11    7:1    59                 4:  SPELLCAS := BADIAL;
  4207  11    7:1    66                 
  4208  11    7:1    66                 5:  IF TWOTHIRD THEN
  4209  11    7:3    69                       SPELLCAS := BADIALMA
  4210  11    7:2    69                     ELSE
  4211  11    7:3    76                       SPELLCAS := BADI;
  4212  11    7:3    83                       
  4213  11    7:1    83                 6:  IF TWOTHIRD THEN
  4214  11    7:3    86                       SPELLCAS := LORTO
  4215  11    7:2    86                     ELSE
  4216  11    7:3    93                       SPELLCAS := MABADI;
  4217  11    7:3   100                       
  4218  11    7:1   100                 7:  SPELLCAS := MABADI;
  4219  11    7:1   107               END;
  4220  11    7:1   128               
  4221  11    7:1   128               ATTCKTYP := SPELLCAS
  4222  11    7:0   128             END;  (* GETPRISP *)
  4223  11    7:0   144             
  4224  11    7:0   144             
  4225  11    4:0     0           BEGIN (* ENEMYSPL *)
  4226  11    4:1     0             IF BATTLERC[ GROUPI].B.MAGSPELS > 0 THEN
  4227  11    4:2    16               IF (RANDOM MOD 100) < 75 THEN
  4228  11    4:3    27                 GETMAGSP( BATTLERC[ GROUPI].B.MAGSPELS);
  4229  11    4:3    41                 
  4230  11    4:1    41             IF ATTCKTYP = 0 THEN
  4231  11    4:2    48               IF BATTLERC[ GROUPI].B.PRISPELS > 0 THEN
  4232  11    4:3    64                 IF (RANDOM MOD 100) < 75 THEN
  4233  11    4:4    75                   GETPRISP( BATTLERC[ GROUPI].B.PRISPELS);
  4234  11    4:0    89           END;  (* ENEMYSPL *)
  4235  11    4:0   102           
  4236  11    4:0   102           
  4237  11    8:D     1         PROCEDURE YELLHELP;  (* P010508 *)
  4238  11    8:D     1         
  4239  11    8:0     0           BEGIN
  4240  11    8:1     0             IF BATTLERC[ GROUPI].B.SPPC[ 6] THEN
  4241  11    8:2    19               IF BATTLERC[ GROUPI].A.ALIVECNT < 8 THEN
  4242  11    8:3    33                 IF (RANDOM MOD 100) < 75 THEN
  4243  11    8:4    44                   ATTCKTYP := -4
  4244  11    8:0    44           END;
  4245  11    8:0    62           
  4246  11    8:0    62           
  4247  11    9:D     1         PROCEDURE RUNENMY;  (* P010509 *)
  4248  11    9:D     1         
  4249  11    9:0     0           BEGIN
  4250  11    9:1     0             IF NOT (BATTLERC[ GROUPI].B.SPPC[ 5]) THEN
  4251  11    9:2    20               EXIT( RUNENMY);
  4252  11    9:1    24             IF BASE291.MYSTRENG > ENSTRENG THEN
  4253  11    9:2    33               IF (RANDOM MOD 100) < 65 THEN
  4254  11    9:3    44                 ATTCKTYP := -2
  4255  11    9:0    44           END;
  4256  11    9:0    62           
  4257  11    9:0    62           
  4258  11   10:D     1         PROCEDURE BREATHES;  (* P01050A *)
  4259  11   10:D     1         
  4260  11   10:0     0           BEGIN
  4261  11   10:1     0             IF BATTLERC[ GROUPI].B.BREATHE > 0 THEN
  4262  11   10:2    16               IF (RANDOM MOD 100) < 60 THEN
  4263  11   10:3    27                 ATTCKTYP := -3
  4264  11   10:0    27           END;
  4265  11   10:0    44           
  4266  11   10:0    44           
  4267  11    2:0     0         BEGIN (* ENATTACK *)
  4268  11    2:1     0           FOR GROUPI := 1 TO 4 DO
  4269  11    2:2    11             BEGIN
  4270  11    2:3    11               IF BATTLERC[ GROUPI].A.ALIVECNT > 0 THEN
  4271  11    2:4    23                 FOR ENEMYX := 0 TO (BATTLERC[ GROUPI].A.ALIVECNT - 1) DO
  4272  11    2:5    43                   WITH BATTLERC[ GROUPI] DO
  4273  11    2:6    52                     BEGIN
  4274  11    2:7    52                     IF (A.TEMP04[ ENEMYX].STATUS = OK) AND
  4275  11    2:7    61                        (SURPRISE <> 1) THEN
  4276  11    2:8    69                       BEGIN
  4277  11    2:9    69                         A.TEMP04[ ENEMYX].AGILITY := (RANDOM MOD 8) + 2;
  4278  11    2:9    87                         IF PARTYCNT = 1 THEN
  4279  11    2:0    92                           CHARX := 0
  4280  11    2:9    92                         ELSE
  4281  11    2:0    97                           BEGIN
  4282  11    2:1    97                             CHARX := PARTYCNT - 1;
  4283  11    2:1   102                             WHILE BATTLERC[ 0].A.TEMP04[ CHARX].STATUS >=
  4284  11    2:1   115                                     DEAD DO 
  4285  11    2:2   119                               CHARX := CHARX - 1;
  4286  11    2:1   126                             CHARX := RANDOM MOD (CHARX + 1)
  4287  11    2:0   134                           END;
  4288  11    2:9   137                         A.TEMP04[ ENEMYX].VICTIM := CHARX;
  4289  11    2:9   145                         A.TEMP04[ ENEMYX].SPELLHSH := 0;
  4290  11    2:9   155                         ATTCKTYP := 0;
  4291  11    2:9   158                         IF CANATTCK THEN
  4292  11    2:0   164                           BEGIN
  4293  11    2:1   164                             IF SURPRISE = 0 THEN
  4294  11    2:2   171                               ENEMYSPL;
  4295  11    2:1   173                             IF ATTCKTYP = 0 THEN
  4296  11    2:2   178                               BREATHES;
  4297  11    2:1   180                             IF ATTCKTYP = 0 THEN
  4298  11    2:2   185                               YELLHELP;
  4299  11    2:1   187                             IF ATTCKTYP = 0 THEN
  4300  11    2:2   192                               RUNENMY;
  4301  11    2:1   194                             IF ATTCKTYP > 0 THEN
  4302  11    2:2   199                               IF CHARACTR[ CHARX].WEPVSTY3[ 1][ 6] THEN
  4303  11    2:3   216                                 A.TEMP04[ ENEMYX].AGILITY := -1;
  4304  11    2:1   227                             IF ATTCKTYP = 0 THEN
  4305  11    2:2   232                               IF (ENEMYX <= 4 - GROUPI) OR
  4306  11    2:2   237                                  ((60 - 10 * GROUPI) <= (RANDOM MOD 100)) THEN
  4307  11    2:3   253                                 BEGIN
  4308  11    2:4   253                                   CHARX := CHARX MOD 3;
  4309  11    2:4   258                                   IF CANATTCK THEN
  4310  11    2:5   264                                     BEGIN
  4311  11    2:6   264                                       ATTCKTYP := -1;
  4312  11    2:6   268                                       A.TEMP04[ ENEMYX].VICTIM := CHARX
  4313  11    2:5   274                                     END
  4314  11    2:4   276                                   ELSE
  4315  11    2:5   278                                     A.TEMP04[ ENEMYX].AGILITY := -1;
  4316  11    2:3   289                                 END
  4317  11    2:0   289                           END;
  4318  11    2:9   289                         A.TEMP04[ ENEMYX].SPELLHSH := ATTCKTYP
  4319  11    2:8   297                       END
  4320  11    2:7   299                     ELSE
  4321  11    2:8   301                       A.TEMP04[ ENEMYX].AGILITY := -1
  4322  11    2:6   309                 END
  4323  11    2:2   312             END;
  4324  11    2:1   326           SURPRISE := 0
  4325  11    2:0   326         END;  (* ENATTACK *)
  4326  11    2:0   356         
  4327  11    2:0   356         
  4328  11   11:D     1       PROCEDURE SVREWARD;  (* P01050B *)
  4329  11   11:D     1       
  4330  11   11:D     1         VAR
  4331  11   11:D     1              BATRESLT : TBATRSLT;
  4332  11   11:D    15              UNUSEDX  : INTEGER;
  4333  11   11:D    16              X        : INTEGER;
  4334  11   11:D    17              
  4335  11   11:0     0         BEGIN
  4336  11   11:1     0           FOR X := 0 TO PARTYCNT - 1 DO
  4337  11   11:2    14             IF (CHARACTR[ X].STATUS = ASLEEP) OR
  4338  11   11:2    23                (CHARACTR[ X].STATUS = AFRAID) THEN
  4339  11   11:3    35               CHARACTR[ X].STATUS := OK;
  4340  11   11:3    51               
  4341  11   11:1    51           MOVELEFT( IOCACHE[ GETREC( ZZERO, 0, SIZEOF( SCNTOC))],
  4342  11   11:1    64                     BASE04,
  4343  11   11:1    67                     2);
  4344  11   11:1    70           MOVELEFT( DRAINED, BATRESLT.DRAINED, 12);
  4345  11   11:1    81           FOR X := 1 TO 4 DO
  4346  11   11:2    93             BEGIN
  4347  11   11:3    93               BATRESLT.ENMYID[ X] := BATTLERC[ X].A.ENEMYID;
  4348  11   11:3   109               BATRESLT.ENMYCNT[ X] := BATTLERC[ X].A.ENMYCNT
  4349  11   11:2   123             END;
  4350  11   11:2   132             
  4351  11   11:1   132           MOVELEFT( BATRESLT, IOCACHE, SIZEOF( TBATRSLT))
  4352  11   11:0   142         END;
  4353  11   11:0   158         
  4354  11   11:0   158         
  4355  11   12:D     1       PROCEDURE INITATTK;  (* P01050C *)
  4356  11   12:D     1       
  4357  11   12:D     1         VAR
  4358  11   12:D     1              UNUSEDWW : INTEGER;
  4359  11   12:D     2              UNUSEDXX : INTEGER;
  4360  11   12:D     3              UNUSEDYY : INTEGER;
  4361  11   12:D     4              UNUSEDZZ : INTEGER;
  4362  11   12:D     5              CHARX    : INTEGER;
  4363  11   12:D     6              GROUPI   : INTEGER;
  4364  11   12:D     7       
  4365  11   12:D     7       
  4366  11   13:D     1         PROCEDURE INITGRUP;  (* P01050D *)
  4367  11   13:D     1         
  4368  11   14:D     1           PROCEDURE ENGROUPS( ENMYI:    INTEGER;     (* P01050E *)
  4369  11   14:D     2                               ENMYGRUP: INTEGER);
  4370  11   14:D     3           
  4371  11   14:0     0             BEGIN
  4372  11   14:1     0               BATTLERC[ ENMYGRUP].A.ENEMYID := ENMYI;
  4373  11   14:1    11               MOVELEFT( IOCACHE[ GETREC( ZENEMY, ENMYI, SIZEOF( TENEMY))],
  4374  11   14:1    24                         BATTLERC[ ENMYGRUP].B,
  4375  11   14:1    34                         SIZEOF( TENEMY));
  4376  11   14:1    39               IF (ENMYGRUP < 4) AND (ENMYGRUP <= MAZELEV) THEN
  4377  11   14:2    48                 IF BATTLERC[ ENMYGRUP].B.ENMYTEAM > 0 THEN
  4378  11   14:3    62                   IF ((RANDOM MOD 100) < BATTLERC[ ENMYGRUP].B.TEAMPERC) OR
  4379  11   14:3    80                      ( (ENMYGRUP = 1) AND (ATTK012 = 2)) THEN
  4380  11   14:4    92                     IF ENMYI <> SCNTOC.RECPERDK[ ZENEMY] - 1 THEN
  4381  11   14:5   105                       ENGROUPS( BATTLERC[ ENMYGRUP].B.ENMYTEAM, ENMYGRUP + 1)
  4382  11   14:0   118             END;
  4383  11   14:0   132             
  4384  11   14:0   132             
  4385  11   15:D     3           FUNCTION ENEMYCNT( HPREC: THPREC) : INTEGER;  (* P01050F *)
  4386  11   15:D     7           
  4387  11   15:0     0             BEGIN
  4388  11   15:1     0               BASE04 := HPREC.HPMINAD;
  4389  11   15:1     8               WHILE HPREC.LEVEL > 0 DO
  4390  11   15:2    13                 BEGIN
  4391  11   15:3    13                   IF HPREC.HPFAC > 0 THEN
  4392  11   15:4    18                     BASE04 := BASE04 + (RANDOM MOD HPREC.HPFAC) + 1;
  4393  11   15:3    31                   HPREC.LEVEL := HPREC.LEVEL - 1
  4394  11   15:2    32                 END;
  4395  11   15:1    38               ENEMYCNT := BASE04
  4396  11   15:0    38             END;
  4397  11   15:0    56             
  4398  11   15:0    56             
  4399  11   16:D     1           PROCEDURE PARTY5SP;  (* P010510 *)
  4400  11   16:D     1           
  4401  11   16:D     1             VAR
  4402  11   16:D     1                  EQINDX : INTEGER;
  4403  11   16:D     2                  POSSX  : INTEGER;
  4404  11   16:D     3                  CHARX  : INTEGER;
  4405  11   16:D     4                  
  4406  11   16:0     0             BEGIN
  4407  11   16:1     0               BORBEART := FALSE;
  4408  11   16:1     4               BCRYSGOO := FALSE;
  4409  11   16:1     8               BCRYSEVI := FALSE;
  4410  11   16:1    12               BCRYSNEU := FALSE;
  4411  11   16:1    16               BSHIPBOT := FALSE;
  4412  11   16:1    20               
  4413  11   16:1    20               FOR CHARX := 0 TO PARTYCNT - 1 DO
  4414  11   16:2    33                 FOR POSSX := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
  4415  11   16:3    50                   BEGIN
  4416  11   16:4    50                     EQINDX := CHARACTR[ CHARX].POSS.POSSESS[ POSSX].EQINDEX;
  4417  11   16:4    65                     BORBEART := BORBEART OR (EQINDX = ORBEARTH);
  4418  11   16:4    77                     BCRYSGOO := BCRYSGOO OR (EQINDX = CRYSGOOD);
  4419  11   16:4    89                     BCRYSEVI := BCRYSEVI OR (EQINDX = CRYSEVIL);
  4420  11   16:4   101                     BCRYSNEU := BCRYSNEU OR (EQINDX = CRYSNEUT);
  4421  11   16:4   113                     BSHIPBOT := BSHIPBOT OR (EQINDX = SHIPBOTT)
  4422  11   16:3   121                   END
  4423  11   16:0   125             END;
  4424  11   16:0   156         
  4425  11   16:0   156         
  4426  11   13:0     0           BEGIN (* INITGRUP *)
  4427  11   13:1     0             FOR GROUPI := 1 TO 4 DO
  4428  11   13:2    14               BEGIN
  4429  11   13:3    14                 BATTLERC[ GROUPI].A.ENMYCNT  := 0;
  4430  11   13:3    27                 BATTLERC[ GROUPI].A.ALIVECNT := 0;
  4431  11   13:3    40                 BATTLERC[ GROUPI].A.ENEMYID  := -1
  4432  11   13:2    51               END;
  4433  11   13:1    64             ENGROUPS( ENEMYINX, 1);
  4434  11   13:1    70             
  4435  11   13:1    70             FOR GROUPI := 1 TO 4 DO
  4436  11   13:2    84               BEGIN
  4437  11   13:3    84                 IF BATTLERC[ GROUPI].A.ENEMYID <> -1 THEN
  4438  11   13:4    99                   BEGIN
  4439  11   13:5    99                     BATTLERC[ GROUPI].A.ENMYCNT := 
  4440  11   13:5   110                       ENEMYCNT( BATTLERC[ GROUPI].B.CALC1);
  4441  11   13:5   126                     IF BATTLERC[ GROUPI].A.ENMYCNT > (4 + MAZELEV) THEN
  4442  11   13:6   142                       BATTLERC[ GROUPI].A.ENMYCNT := 4 + MAZELEV;
  4443  11   13:5   157                     IF BATTLERC[ GROUPI].A.ENMYCNT > 9 THEN
  4444  11   13:6   171                       BATTLERC[ GROUPI].A.ENMYCNT := 9;
  4445  11   13:5   184                     IF BATTLERC[ GROUPI].A.ENMYCNT < 1 THEN
  4446  11   13:6   198                       BATTLERC[ GROUPI].A.ENMYCNT := 1;
  4447  11   13:5   211                     BATTLERC[ GROUPI].A.ALIVECNT :=
  4448  11   13:5   222                       BATTLERC[ GROUPI].A.ENMYCNT;
  4449  11   13:5   233                     BATTLERC[ GROUPI].A.IDENTIFI := (IDMONSTR > 0);
  4450  11   13:5   248                     
  4451  11   13:5   248                     FOR CHARX := 0 TO (BATTLERC[ GROUPI].A.ENMYCNT - 1) DO
  4452  11   13:6   273                       WITH BATTLERC[ GROUPI].A.TEMP04[ CHARX] DO
  4453  11   13:7   291                         BEGIN
  4454  11   13:8   291                           DRAIN2LV := BATTLERC[ GROUPI].B.HPREC.LEVEL;
  4455  11   13:8   306                           ARMORCL  := 0;
  4456  11   13:8   311                           INAUDCNT := 0;
  4457  11   13:8   316                           HPLEFT   :=
  4458  11   13:8   319                                     ENEMYCNT( BATTLERC[ GROUPI].B.HPREC);
  4459  11   13:8   335                           STATUS   := OK
  4460  11   13:7   338                         END
  4461  11   13:4   340                   END
  4462  11   13:2   350                 END;
  4463  11   13:2   360                 
  4464  11   13:1   360               PARTY5SP;
  4465  11   13:1   362               IF BATTLERC[ 1].A.ENEMYID = (SCNTOC.RECPERDK[ ZENEMY] - 1) THEN
  4466  11   13:2   382                 IF BCRYSNEU OR BORBEART THEN
  4467  11   13:3   391                   BEGIN
  4468  11   13:4   391                     CLEARWIN( COMB1WIN, TRUE);
  4469  11   13:4   398                     CENTSTR( COMB1WIN, 'I AM L''KBRETH');
  4470  11   13:4   420                     CENTSTR( COMB1WIN, 'GUARDIAN OF THE BALANCE.');
  4471  11   13:4   453                     CENTSTR( COMB1WIN, 'GO FORWARD IN PEACE, WORTHY ONES.');
  4472  11   13:4   495                     PAUSE2;
  4473  11   13:4   498                     PAUSE2;
  4474  11   13:4   501                     XGOTO2 := XSCNMSG;
  4475  11   13:4   505                     XGOTO := XRUNNER;
  4476  11   13:4   509                     EXITCOMB
  4477  11   13:3   509                   END
  4478  11   13:0   512           END;  (* INITGRUP *)
  4479  11   13:0   536         
  4480  11   13:0   536         
  4481  11   17:D     1         PROCEDURE INTPARTY;  (* P010511 *)
  4482  11   17:D     1         
  4483  11   17:D     1           VAR
  4484  11   17:D     1                X : INTEGER;
  4485  11   17:D     2                Y : INTEGER;
  4486  11   17:D     3                
  4487  11   17:0     0           BEGIN
  4488  11   17:1     0             BATTLERC[ 0].A.ENMYCNT := PARTYCNT;
  4489  11   17:1    11             BATTLERC[ 0].A.ALIVECNT := PARTYCNT;
  4490  11   17:1    22             FOR CHARX := 0 TO (PARTYCNT - 1) DO
  4491  11   17:2    38               BEGIN
  4492  11   17:3    38                 WITH BATTLERC[ 0].A.TEMP04[ CHARX] DO
  4493  11   17:4    54                   BEGIN
  4494  11   17:5    54                     DRAIN2LV := CHARACTR[ CHARX].CHARLEV;
  4495  11   17:5    67                     ARMORCL  := 0;
  4496  11   17:5    72                     INAUDCNT := 0;
  4497  11   17:5    77                     HPLEFT   := CHARACTR[ CHARX].HPLEFT;
  4498  11   17:5    90                     STATUS   := CHARACTR[ CHARX].STATUS;
  4499  11   17:5   103                     FOR X := 0 TO 13 DO
  4500  11   17:6   114                       CHARACTR[ CHARX].WEPVSTY2[ 1][ X] :=
  4501  11   17:6   130                         CHARACTR[ CHARX].WEPVSTY2[ 0][ X];
  4502  11   17:5   155                     FOR Y := 0 TO 6 DO
  4503  11   17:6   166                       CHARACTR[ CHARX].WEPVSTY3[ 1][ Y] :=
  4504  11   17:6   182                         CHARACTR[ CHARX].WEPVSTY3[ 0][ Y]
  4505  11   17:4   198                   END
  4506  11   17:2   207               END
  4507  11   17:0   207           END;
  4508  11   17:0   238           
  4509  11   17:0   238           
  4510  11   18:D     1         PROCEDURE FRIENDLY;  (* P010512 *)
  4511  11   18:D     1         
  4512  11   18:D     1           VAR
  4513  11   18:D     1               GOODLEAV : BOOLEAN; (* MULTIPLE USES *)
  4514  11   18:D     2               EVILFIGH : BOOLEAN; (* MULTIPLE USES *)
  4515  11   18:D     3               UNUSEDXX : INTEGER;
  4516  11   18:D     4               ZERO99   : INTEGER;
  4517  11   18:D     5               MP0512   : INTEGER; (* MULTIPLE USES *)
  4518  11   18:D     6         
  4519  11   18:D     6         
  4520  11   19:D     1           PROCEDURE CHGALIGN;  (* P010513 *)
  4521  11   19:D     1           
  4522  11   19:0     0             BEGIN
  4523  11   19:1     0               FOR MP0512 := 0 TO PARTYCNT - 1 DO
  4524  11   19:2    16                 IF (RANDOM MOD 100) < 5 THEN
  4525  11   19:3    27                   IF (CHARACTR[ MP0512].ALIGN = GOOD) AND EVILFIGH THEN
  4526  11   19:3    44                          (* RESPONSE WAS 'F'IGHT *)
  4527  11   19:4    44                     CHARACTR[ MP0512].ALIGN := EVIL
  4528  11   19:3    53                   ELSE
  4529  11   19:4    57                     IF (CHARACTR[ MP0512].ALIGN = EVIL) AND GOODLEAV THEN
  4530  11   19:4    74                          (* RESPONSE WAS 'L'EAVE *)
  4531  11   19:5    74                       CHARACTR[ MP0512].ALIGN := GOOD
  4532  11   19:0    83             END;
  4533  11   19:0   110             
  4534  11   19:0   110             
  4535  11   18:0     0           BEGIN (* FRIENDLY *)
  4536  11   18:1     0             EVILFIGH := FALSE;
  4537  11   18:1     3             GOODLEAV := FALSE;
  4538  11   18:1     6             IF BATTLERC[ 1].B.WEPVSTY3[ 0] THEN
  4539  11   18:2    23               EXIT( FRIENDLY);
  4540  11   18:1    27             FOR MP0512 := 0 TO PARTYCNT - 1 DO
  4541  11   18:2    40               BEGIN
  4542  11   18:3    40                 EVILFIGH := EVILFIGH OR (CHARACTR[ MP0512].ALIGN = GOOD);
  4543  11   18:3    53                 GOODLEAV := GOODLEAV OR (CHARACTR[ MP0512].ALIGN = EVIL)
  4544  11   18:2    63               END;
  4545  11   18:1    73             IF NOT (EVILFIGH OR GOODLEAV) THEN
  4546  11   18:2    79               EXIT( FRIENDLY);
  4547  11   18:2    83             
  4548  11   18:1    83             ZERO99  := RANDOM MOD 100;
  4549  11   18:1    92             MP0512 := 50;
  4550  11   18:1    95             CASE BATTLERC[ 1].B.CLASS OF
  4551  11   18:1   106               0:  MP0512 := 10;
  4552  11   18:1   111               1:  MP0512 :=  5;
  4553  11   18:1   116               2:  MP0512 := 15;
  4554  11   18:1   121               3:  MP0512 :=  3;
  4555  11   18:1   126               4:  MP0512 := 30;
  4556  11   18:1   131               
  4557  11   18:1   131               7:  MP0512 := 25;
  4558  11   18:1   136             END;
  4559  11   18:1   160             IF ZERO99 > MP0512 THEN
  4560  11   18:2   165               EXIT( FRIENDLY);
  4561  11   18:2   169               
  4562  11   18:1   169             FOR MP0512 := 1 TO 4 DO
  4563  11   18:2   180               BATTLERC[ MP0512].A.IDENTIFI := TRUE;
  4564  11   18:1   196             CLEARWIN( COMB1WIN, TRUE);
  4565  11   18:1   203             CENTSTR( COMB1WIN, 'A FRIENDLY GROUP OF ');
  4566  11   18:1   232             CENTSTR( COMB1WIN, BATTLERC[ 1].B.NAMES);
  4567  11   18:1   247             PRINTCR( COMB1WIN);
  4568  11   18:1   253             CENTSTR( COMB1WIN, 'F)IGHT L)EAVE');
  4569  11   18:1   275             SURPRISE := 0;
  4570  11   18:1   279             REPEAT
  4571  11   18:2   279               GETKEY
  4572  11   18:1   279             UNTIL (INCHAR = 'F') OR (INCHAR = 'L');
  4573  11   18:1   291             GOODLEAV := INCHAR = 'L';
  4574  11   18:1   296             EVILFIGH := INCHAR = 'F';
  4575  11   18:1   301             CHGALIGN;
  4576  11   18:1   303             IF INCHAR = 'L' THEN
  4577  11   18:2   308               BEGIN
  4578  11   18:3   308                 XGOTO := XRUNNER;
  4579  11   18:3   312                 EXITCOMB
  4580  11   18:2   312               END
  4581  11   18:0   315           END;  (* FRIENDLY *)
  4582  11   18:0   334         
  4583  11   18:0   334         
  4584  11   12:0     0         BEGIN (* INITATTK *)
  4585  11   12:1     0           INITGRUP;
  4586  11   12:1     2           INTPARTY;
  4587  11   12:1     4           FILLCHAR( DRAINED, 12, 0);
  4588  11   12:1    13           FOR BASE04 := 0 TO PARTYCNT - 1 DO
  4589  11   12:2    26             PREBATOR[ BASE04] := CHARDISK[ BASE04];
  4590  11   12:1    48           IF (RANDOM MOD 100) > 80 THEN
  4591  11   12:2    59             SURPRISE := 1
  4592  11   12:1    59           ELSE IF (RANDOM MOD 100) > 80 THEN
  4593  11   12:3    76             SURPRISE := 2
  4594  11   12:2    76           ELSE
  4595  11   12:3    82             SURPRISE := 0;
  4596  11   12:1    86           FRIENDLY
  4597  11   12:0    86         END;  (* INITATTK *)
  4598  11   12:0   102         
  4599  11   12:0   102         
  4600  11    1:0     0       BEGIN (* CINIT *)
  4601  11    1:1     0         IF CINITFL1 = -1 THEN
  4602  11    1:2     8           ENATTACK
  4603  11    1:1     8         ELSE IF CINITFL1 = 0 THEN
  4604  11    1:3    19           INITATTK
  4605  11    1:2    19         ELSE
  4606  11    1:3    23           SVREWARD
  4607  11    1:0    23       END;  (* CINIT *)
  4608  11    1:0    38       
  4609  11    1:0    38       
  4610  11    1:0    38   
  4611  11    1:0    38 (*$I WIZ3B:COMBAT    *)
  4611  11    1:0    38 (*$I WIZ3B:COMBAT2   *)
  4612  12    1:D     1     SEGMENT PROCEDURE CUTIL;
  4613  12    1:D     1     
  4614  12    2:D     1       PROCEDURE CACTION;  (* P010602 *)
  4615  12    2:D     1       
  4616  12    2:D     1         VAR
  4617  12    2:D     1              BDISPELL : BOOLEAN;
  4618  12    2:D     2              MYCHARX  : INTEGER;
  4619  12    2:D     3              AGIL1TEN : INTEGER;
  4620  12    2:D     4              CHX      : INTEGER;
  4621  12    2:D     5              FDSUPRT  : STRING[ 10];
  4622  12    2:D    11              FDSUPRT1 : STRING;
  4623  12    2:D    52              
  4624  12    2:D    52              
  4625  12    3:D     1         PROCEDURE AATEXTAA( ASTRING: STRING);  (* P010603 *)
  4626  12    3:D    43         
  4627  12    3:0     0           BEGIN
  4628  12    3:1     0             CLEARWIN( COMB1WIN, TRUE);
  4629  12    3:1    12             PRINTCR(  COMB1WIN);
  4630  12    3:1    18             CENTSTR(  COMB1WIN, CONCAT( '** ', ASTRING, ' **'))
  4631  12    3:0    58           END;
  4632  12    3:0    74           
  4633  12    3:0    74           
  4634  12    4:D     1         PROCEDURE WHICHGRP( SOLICIT:   STRING;   (* P010604 *)
  4635  12    4:D     2                             SPELLHSH : INTEGER);
  4636  12    4:D    44         
  4637  12    4:0     0           BEGIN
  4638  12    4:1     0             IF BATTLERC[ 2].A.ALIVECNT = 0 THEN
  4639  12    4:2    17               BEGIN
  4640  12    4:3    17                 BATTLERC[ 0].A.TEMP04[ MYCHARX].VICTIM := 1;
  4641  12    4:3    33                 BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := SPELLHSH;
  4642  12    4:3    51                 EXIT( WHICHGRP)
  4643  12    4:2    55               END;
  4644  12    4:1    55             CENTSTR( COMB1WIN, SOLICIT);
  4645  12    4:1    63             CENTSTR( COMB1WIN, '(RETURN) EXITS');
  4646  12    4:1    86             REPEAT
  4647  12    4:2    86               GETKEY
  4648  12    4:1    86             UNTIL ((INCHAR >= '1') AND (INCHAR < '5')) OR
  4649  12    4:1    96                    (INCHAR = CHR( CRETURN));
  4650  12    4:1   102             IF INCHAR = CHR( CRETURN) THEN
  4651  12    4:2   107               BEGIN
  4652  12    4:3   107                 BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := -999;
  4653  12    4:3   128                 EXIT( WHICHGRP)
  4654  12    4:2   132               END;
  4655  12    4:1   132             IF BATTLERC[ ORD( INCHAR) - ORD( '0')].A.ALIVECNT = 0 THEN
  4656  12    4:2   146               BEGIN
  4657  12    4:3   146                 BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := -999;
  4658  12    4:3   167                 EXIT( WHICHGRP)
  4659  12    4:2   171               END;
  4660  12    4:1   171             BATTLERC[ 0].A.TEMP04[ MYCHARX].VICTIM := ORD( INCHAR) - ORD( '0');
  4661  12    4:1   189             BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := SPELLHSH
  4662  12    4:0   205           END;
  4663  12    4:0   222           
  4664  12    4:0   222           
  4665  12    5:D     1         PROCEDURE USEITEM;  (* P010605 *)
  4666  12    5:D     1         
  4667  12    5:D     1         VAR
  4668  12    5:D     1              BUSEABLE : ARRAY[ 1..8] OF BOOLEAN;
  4669  12    5:D     9              POSSX    : INTEGER;
  4670  12    5:D    10              OBJECT   : TOBJREC;
  4671  12    5:D    49         
  4672  12    5:D    49         
  4673  12    6:D     1           PROCEDURE READOBJT;  (* P010606 *)
  4674  12    6:D     1           
  4675  12    6:0     0             BEGIN
  4676  12    6:1     0               MOVELEFT( 
  4677  12    6:1     0                 IOCACHE[ GETREC(
  4678  12    6:1     3                         ZOBJECT,
  4679  12    6:1     4                         CHARACTR[ MYCHARX].POSS.POSSESS[ POSSX].EQINDEX - 1000,
  4680  12    6:1    25                         SIZEOF( TOBJREC))],
  4681  12    6:1    31                 OBJECT,
  4682  12    6:1    35                 SIZEOF( TOBJREC))
  4683  12    6:0    38             END;
  4684  12    6:0    50             
  4685  12    6:0    50             
  4686  12    7:D     1           PROCEDURE DSPITEMS;  (* P010607 *)
  4687  12    7:D     1           
  4688  12    7:D     1             VAR
  4689  12    7:D     1                 ITEMCNT : INTEGER;
  4690  12    7:D     2           
  4691  12    7:0     0             BEGIN
  4692  12    7:1     0               TEMPWIN := GETWIN( 9, 14, 22, 10, 31, TRUE);
  4693  12    7:1    14               ITEMCNT := 0;
  4694  12    7:1    17               FOR POSSX := 1 TO CHARACTR[ MYCHARX].POSS.POSSCNT DO
  4695  12    7:2    39                 BEGIN
  4696  12    7:3    39                   BUSEABLE[ POSSX] := FALSE;
  4697  12    7:3    51                   READOBJT;
  4698  12    7:3    53                   IF OBJECT.SPELLPWR > 0 THEN
  4699  12    7:4    60                     IF (OBJECT.OBJTYPE >= SPECIAL) OR
  4700  12    7:4    65                        (CHARACTR[ MYCHARX].POSS.POSSESS[ POSSX].EQUIPED) THEN
  4701  12    7:5    85                       BEGIN
  4702  12    7:6    85                         ITEMCNT := ITEMCNT + 1;
  4703  12    7:6    90                         BUSEABLE[ POSSX] := TRUE;
  4704  12    7:6   102                         PRINTNUM( TEMPWIN, POSSX, 1);
  4705  12    7:6   112                         PRINTSTR( TEMPWIN, ') ');
  4706  12    7:6   123                         IF CHARACTR[ MYCHARX].POSS.POSSESS[ POSSX].IDENTIF THEN
  4707  12    7:7   142                           PRINTSTR( TEMPWIN, OBJECT.NAME)
  4708  12    7:6   148                         ELSE
  4709  12    7:7   153                           PRINTSTR( TEMPWIN, OBJECT.NAMEUNK);
  4710  12    7:6   162                         PRINTCR( TEMPWIN)
  4711  12    7:5   165                       END;
  4712  12    7:2   168                   END;
  4713  12    7:1   178               DELWIN( TEMPWIN, FALSE);
  4714  12    7:1   185               IF ITEMCNT = 0 THEN
  4715  12    7:2   190                 EXIT( USEITEM)
  4716  12    7:0   194             END;
  4717  12    7:0   210             
  4718  12    7:0   210             
  4719  12    8:D     1           PROCEDURE CHGITEM;  (* P010608 *)
  4720  12    8:D     1           
  4721  12    8:0     0             BEGIN
  4722  12    8:1     0               IF (RANDOM MOD 100) >= OBJECT.CHGCHANC THEN
  4723  12    8:2    13                 EXIT( CHGITEM);
  4724  12    8:1    17               WITH CHARACTR[ MYCHARX].POSS.POSSESS[ POSSX] DO
  4725  12    8:2    35                 BEGIN
  4726  12    8:3    35                   EQINDEX := OBJECT.CHANGETO + 1000;
  4727  12    8:3    46                   IDENTIF := FALSE
  4728  12    8:2    49                 END;
  4729  12    8:0    51             END;
  4730  12    8:0    64             
  4731  12    8:0    64             
  4732  12    9:D     1           PROCEDURE UIGENERC( SPELLHSH: INTEGER);  (* P010609 *)
  4733  12    9:D     2           
  4734  12    9:0     0             BEGIN
  4735  12    9:1     0               BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := SPELLHSH;
  4736  12    9:1    18               BATTLERC[ 0].A.TEMP04[ MYCHARX].VICTIM := -1;
  4737  12    9:1    35               CHGITEM
  4738  12    9:0    35             END;
  4739  12    9:0    50             
  4740  12    9:0    50             
  4741  12   10:D     1           PROCEDURE UIPERSON( SPELLHSH: INTEGER);  (* P01060A *)
  4742  12   10:D     2           
  4743  12   10:0     0             BEGIN
  4744  12   10:1     0               AATEXTAA( 'USE ITEM ON PERSON (NUM) ?');
  4745  12   10:1    31               REPEAT
  4746  12   10:2    31                 GETKEY
  4747  12   10:1    31               UNTIL (INCHAR >= '1') AND (INCHAR < CHR( ORD('1') + PARTYCNT));
  4748  12   10:1    45               BATTLERC[ 0].A.TEMP04[ MYCHARX].VICTIM := ORD( INCHAR) -ORD('1');
  4749  12   10:1    63               BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := SPELLHSH;
  4750  12   10:1    81               CHGITEM
  4751  12   10:0    81             END;
  4752  12   10:0    98             
  4753  12   10:0    98             
  4754  12   11:D     1           PROCEDURE UIGROUP( SPELLHSH : INTEGER);  (* P01060B *)
  4755  12   11:D     2           
  4756  12   11:0     0             BEGIN
  4757  12   11:1     0               WHICHGRP( 'USE ITEM ON WHAT GROUP (NUM) ?', SPELLHSH);
  4758  12   11:1    36               CHGITEM
  4759  12   11:0    36             END;
  4760  12   11:0    50             
  4761  12   11:0    50             
  4762  12    5:0     0           BEGIN (* USEITEM *)
  4763  12    5:1     0             IF CHARACTR[ MYCHARX].POSS.POSSCNT = 0 THEN
  4764  12    5:2    13               EXIT( USEITEM);
  4765  12    5:1    17             DSPITEMS;
  4766  12    5:1    19             CENTSTR( COMB1WIN, 'USE WHICH ITEM (NUM) ?');
  4767  12    5:1    50             CENTSTR( COMB1WIN, '(RETURN) EXITS');
  4768  12    5:1    73             REPEAT
  4769  12    5:2    73               GETKEY;
  4770  12    5:2    76               POSSX := ORD( INCHAR) - ORD( '0');
  4771  12    5:2    81               IF INCHAR = CHR( CRETURN) THEN
  4772  12    5:3    86                 EXIT( USEITEM)
  4773  12    5:1    90             UNTIL (POSSX > 0) AND
  4774  12    5:1    93                   (POSSX <= CHARACTR[ MYCHARX].POSS.POSSCNT) AND
  4775  12    5:1   105                   (BUSEABLE[ POSSX]);
  4776  12    5:1   116             CLRRECT(  COMB1WIN, 0, 2, 38, 2);
  4777  12    5:1   126             MVCURSOR( COMB1WIN, 0, 2);
  4778  12    5:1   134             DRAWSCR( WINCHAIN);
  4779  12    5:1   140             READOBJT;
  4780  12    5:1   142             BASE04 := SCNTOC.SPELLHSH[ OBJECT.SPELLPWR];
  4781  12    5:1   152             CASE SCNTOC.SPELL012[ OBJECT.SPELLPWR] OF
  4782  12    5:1   163               GENERIC:  UIGENERC( BASE04);
  4783  12    5:1   168                PERSON:  UIPERSON( BASE04);
  4784  12    5:1   173                 GROUP:  UIGROUP(  BASE04);
  4785  12    5:1   178             END
  4786  12    5:0   192           END; (* USEITEM *)
  4787  12    5:0   206           
  4788  12    5:0   206           
  4789  12   12:D     1         PROCEDURE GETSPELL;  (* P01060C *)
  4790  12   12:D     1         
  4791  12   12:D     1           VAR
  4792  12   12:D     1               SPELLNAM : STRING[ 14];
  4793  12   12:D     9               SPELLCST : INTEGER;
  4794  12   12:D    10               SPELNAML : INTEGER;
  4795  12   12:D    11               SPELCHRA : INTEGER;
  4796  12   12:D    12               SPELNAMI : INTEGER;
  4797  12   12:D    13         
  4798  12   12:D    13         
  4799  12   13:D     1           PROCEDURE DOSPELL;  (* P01060D *)
  4800  12   13:D     1           
  4801  12   13:D     1             VAR
  4802  12   13:D     1                  SPELLX : INTEGER;
  4803  12   13:D     2                  
  4804  12   13:D     2                  
  4805  12   14:D     1             PROCEDURE CASTCHK( SPELLI:  INTEGER;  (* P01060E *)
  4806  12   14:D     2                                SPELLGR: INTEGER);
  4807  12   14:D     3             
  4808  12   14:0     0               BEGIN
  4809  12   14:1     0                 IF CHARACTR[ MYCHARX].SPELLSKN[ SPELLI] THEN
  4810  12   14:2    16                   BEGIN
  4811  12   14:3    16                     IF SPELLI < 22 THEN
  4812  12   14:4    21                       BEGIN
  4813  12   14:5    21                         IF CHARACTR[ MYCHARX].MAGESP[ SPELLGR] > 0 THEN
  4814  12   14:6    40                           BEGIN
  4815  12   14:7    40                             CHARACTR[ MYCHARX].MAGESP[ SPELLGR] :=
  4816  12   14:7    54                               CHARACTR[ MYCHARX].MAGESP[ SPELLGR] - 1;
  4817  12   14:7    72                             EXIT( CASTCHK)
  4818  12   14:6    76                           END
  4819  12   14:5    76                         ELSE
  4820  12   14:4    78                           ;
  4821  12   14:4    78                       END
  4822  12   14:3    78                     ELSE
  4823  12   14:4    80                       BEGIN
  4824  12   14:5    80                         IF CHARACTR[ MYCHARX].PRIESTSP[ SPELLGR] > 0 THEN
  4825  12   14:6    99                           BEGIN
  4826  12   14:7    99                             CHARACTR[ MYCHARX].PRIESTSP[ SPELLGR] :=
  4827  12   14:7   113                               CHARACTR[ MYCHARX].PRIESTSP[ SPELLGR] - 1;
  4828  12   14:7   131                             EXIT( CASTCHK)
  4829  12   14:6   135                           END
  4830  12   14:4   135                       END
  4831  12   14:2   135                   END;
  4832  12   14:1   135                 IF CHARACTR[ MYCHARX].SPELLSKN[ SPELLI] THEN
  4833  12   14:2   151                   AATEXTAA( 'SPELL POINTS EXHAUSTED')
  4834  12   14:1   176                 ELSE
  4835  12   14:2   180                   AATEXTAA( 'YOU DONT KNOW THAT SPELL');
  4836  12   14:1   209                 PAUSE2;
  4837  12   14:1   212                 EXIT( GETSPELL)
  4838  12   14:0   216               END;
  4839  12   14:0   228               
  4840  12   14:0   228               
  4841  12   15:D     1             PROCEDURE SPGENERC( SPELLI:  INTEGER;  (* P01060F *)
  4842  12   15:D     2                                 SPELLGR: INTEGER);
  4843  12   15:D     3             
  4844  12   15:0     0               BEGIN
  4845  12   15:1     0                 CASTCHK( SPELLI, SPELLGR);
  4846  12   15:1     4                 BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := SPELLCST;
  4847  12   15:1    24                 BATTLERC[ 0].A.TEMP04[ MYCHARX].VICTIM := -1
  4848  12   15:0    38               END;
  4849  12   15:0    54               
  4850  12   15:0    54               
  4851  12   16:D     1             PROCEDURE SPPERSON( SPELLI:  INTEGER;  (* P010610 *)
  4852  12   16:D     2                                 SPELLGR: INTEGER);
  4853  12   16:D     3             
  4854  12   16:0     0               BEGIN
  4855  12   16:1     0                 CASTCHK( SPELLI, SPELLGR);
  4856  12   16:1     4                 CENTSTR( COMB1WIN, ' CAST SPELL ON PERSON (NUM) ?');
  4857  12   16:1    42                 REPEAT
  4858  12   16:2    42                   GETKEY
  4859  12   16:1    42                 UNTIL (INCHAR >=  '1') AND
  4860  12   16:1    48                       (ORD (INCHAR) < ( (ORD('1') + PARTYCNT) ));
  4861  12   16:1    56                 BATTLERC[ 0].A.TEMP04[ MYCHARX].VICTIM := 
  4862  12   16:1    70                   ORD( INCHAR) - ORD( '1');
  4863  12   16:1    74                 BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := SPELLCST
  4864  12   16:0    90               END;
  4865  12   16:0   108               
  4866  12   16:0   108               
  4867  12   17:D     1             PROCEDURE SPGROUP( SPELLI:  INTEGER;  (* P010611 *)
  4868  12   17:D     2                                SPELLGR: INTEGER);
  4869  12   17:D     3             
  4870  12   17:0     0               BEGIN
  4871  12   17:1     0                 CASTCHK( SPELLI, SPELLGR);
  4872  12   17:1     4                 WHICHGRP( 'CAST SPELL ON GROUP (NUM) ?', SPELLCST)
  4873  12   17:0    37               END;
  4874  12   17:0    52               
  4875  12   17:0    52               
  4876  12   13:0     0             BEGIN (* DOSPELL *)
  4877  12   13:1     0               FOR SPELLX := 0 TO 50 DO
  4878  12   13:2    11                 IF SPELLCST = SCNTOC.SPELLHSH[ SPELLX] THEN
  4879  12   13:3    24                   CASE SCNTOC.SPELL012[ SPELLX] OF
  4880  12   13:3    34                     GENERIC:  SPGENERC( SPELLX, SCNTOC.SPELLGRP[ SPELLX]);
  4881  12   13:3    47                      PERSON:  SPPERSON( SPELLX, SCNTOC.SPELLGRP[ SPELLX]);
  4882  12   13:3    60                       GROUP:  SPGROUP(  SPELLX, SCNTOC.SPELLGRP[ SPELLX]);
  4883  12   13:3    73                   END
  4884  12   13:0    86             END;  (* DOSPELL *)
  4885  12   13:0   108             
  4886  12   13:0   108             
  4887  12   12:0     0           BEGIN  (* GETSPELL *)
  4888  12   12:1     0             PRINTSTR( COMB1WIN, '    SPELL NAME ? >');
  4889  12   12:1    27             GETSTR(   COMB1WIN, SPELLNAM, 12);
  4890  12   12:1    36             CLRRECT(  COMB1WIN, 0, 2, 38, 2);
  4891  12   12:1    46             MVCURSOR( COMB1WIN, 0, 2);
  4892  12   12:1    54             SPELNAML := LENGTH( SPELLNAM);
  4893  12   12:1    60             IF SPELNAML = 0 THEN
  4894  12   12:2    65               EXIT( GETSPELL);
  4895  12   12:1    69             SPELLCST := SPELNAML;
  4896  12   12:1    72             FOR SPELNAMI := 1 TO SPELNAML DO
  4897  12   12:2    83               BEGIN
  4898  12   12:3    83                 SPELCHRA := ORD( SPELLNAM[ SPELNAMI]) - 64;
  4899  12   12:3    91                 SPELLCST := SPELLCST + (SPELCHRA * SPELCHRA * SPELNAMI)
  4900  12   12:2    97               END;
  4901  12   12:1   107             DOSPELL
  4902  12   12:0   107           END; (* GETSPELL *)
  4903  12   12:0   124           
  4904  12   12:0   124           
  4905  12   18:D     1         PROCEDURE RUNAWAY;  (* P010612 *)
  4906  12   18:D     1         
  4907  12   18:D     1           VAR
  4908  12   18:D     1                TEMP : INTEGER;  (* MULTIPLE USES *)
  4909  12   18:D     2         
  4910  12   18:D     2         
  4911  12   19:D     1           PROCEDURE RUNFAILD;  (* P010613 *)
  4912  12   19:D     1           
  4913  12   19:0     0             BEGIN
  4914  12   19:1     0               FOR TEMP := 0 TO PARTYCNT - 1 DO
  4915  12   19:2    16                 BATTLERC[ 0].A.TEMP04[ TEMP].AGILITY := -1;
  4916  12   19:1    45               EXIT( CACTION)
  4917  12   19:0    49             END;
  4918  12   19:0    64             
  4919  12   19:0    64             
  4920  12   20:D     1           PROCEDURE LKEBRETH;  (* P010614 *)
  4921  12   20:D     1           
  4922  12   20:D     1             VAR
  4923  12   20:D     1                  CHARX : INTEGER;
  4924  12   20:D     2           
  4925  12   20:0     0             BEGIN
  4926  12   20:1     0               XGOTO := XNEWMAZE;
  4927  12   20:1     4               MAZELEV := 0;
  4928  12   20:1     7               MAZEX := 0;
  4929  12   20:1    10               MAZEY := 0;
  4930  12   20:1    13               CHSTALRM := 0;
  4931  12   20:1    17               FOR CHARX := 0 TO PARTYCNT - 1 DO
  4932  12   20:2    30                 IF CHARACTR[ CHARX].ALIGN = EVIL THEN
  4933  12   20:3    41                   BEGIN
  4934  12   20:4    41                     MAZEX := 0;
  4935  12   20:4    44                     MAZEY := 14;
  4936  12   20:4    47                     MAZELEV := 5;
  4937  12   20:4    50                     IF (RANDOM MOD 2) = 0 THEN
  4938  12   20:5    61                       EXITCOMB;
  4939  12   20:3    64                   END
  4940  12   20:2    64                 ELSE
  4941  12   20:3    66                   BEGIN
  4942  12   20:4    66                     IF CHARACTR[ CHARX].ALIGN = GOOD THEN
  4943  12   20:5    77                       BEGIN
  4944  12   20:6    77                         MAZEX := 19;
  4945  12   20:6    80                         MAZEY := 15;
  4946  12   20:6    83                         MAZELEV := 4;
  4947  12   20:6    86                         IF (RANDOM MOD 2) = 0 THEN
  4948  12   20:7    97                           EXITCOMB;
  4949  12   20:5   100                       END;
  4950  12   20:3   100                   END;
  4951  12   20:1   107               EXITCOMB;
  4952  12   20:0   110             END;
  4953  12   20:0   124             
  4954  12   20:0   124             
  4955  12   18:0     0           BEGIN (* RUNAWAY *)
  4956  12   18:1     0             IF BATTLERC[ 1].A.ENEMYID = SCNTOC.RECPERDK[ ZENEMY] - 1 THEN
  4957  12   18:2    20               LKEBRETH;
  4958  12   18:1    22             IF NOT ENCB4RUN THEN
  4959  12   18:2    28               RUNFAILD;
  4960  12   18:1    30             TEMP := 75;
  4961  12   18:1    33             IF PARTYCNT < 4 THEN
  4962  12   18:2    38               TEMP := TEMP + 20 - 5 * PARTYCNT;
  4963  12   18:1    47             IF BASE291.MYSTRENG > ENSTRENG THEN
  4964  12   18:2    56               TEMP := TEMP + 20;
  4965  12   18:1    61             IF (RANDOM MOD 100) > TEMP THEN
  4966  12   18:2    72               RUNFAILD;
  4967  12   18:1    74             FOR TEMP := 1 TO 4 DO
  4968  12   18:2    85               BEGIN
  4969  12   18:3    85                 BATTLERC[ TEMP].A.ALIVECNT := 0;
  4970  12   18:3    96                 BATTLERC[ TEMP].A.ENMYCNT := 0
  4971  12   18:2   105               END;
  4972  12   18:1   114             XGOTO := XREWARD2;
  4973  12   18:1   118             DONEFIGH := TRUE;
  4974  12   18:1   122             EXIT( CUTIL)
  4975  12   18:0   126           END; (* RUNAWAY *)
  4976  12   18:0   140         
  4977  12   18:0   140         
  4978  12   21:D     1         PROCEDURE DOSUPRIS;  (* P010615 *)
  4979  12   21:D     1         
  4980  12   21:0     0           BEGIN
  4981  12   21:1     0             IF SURPRISE = 1 THEN
  4982  12   21:2     7               AATEXTAA( 'YOU SURPRISED THE MONSTERS!')
  4983  12   21:1    37             ELSE
  4984  12   21:2    41               IF SURPRISE = 2 THEN
  4985  12   21:3    48                 AATEXTAA( 'THE MONSTERS SURPRISED YOU!');
  4986  12   21:1    80             IF SURPRISE <> 0 THEN
  4987  12   21:2    87                 FOR BASE04 := 25 DOWNTO 15 DO
  4988  12   21:3    98                   PRINTCHR( COMB1WIN, CHR( BASE04))
  4989  12   21:0   102           END;
  4990  12   21:0   126           
  4991  12   21:0   126           
  4992  12    2:0     0         BEGIN (* CACTION *)
  4993  12    2:1     0           IF SURPRISE <> 2 THEN
  4994  12    2:2     7             UNPROWIN( CHARSWIN, TRUE)
  4995  12    2:1    11           ELSE
  4996  12    2:2    16             PROTWIN( CHARSWIN, TRUE);
  4997  12    2:1    23           DOSUPRIS;
  4998  12    2:1    25           REPEAT
  4999  12    2:2    25             MYCHARX := 0;
  5000  12    2:2    28             WHILE MYCHARX < PARTYCNT DO
  5001  12    2:3    33               BEGIN
  5002  12    2:4    33                 IF (BATTLERC[ 0].A.TEMP04[ MYCHARX].STATUS = OK) AND
  5003  12    2:4    48                    (SURPRISE <> 2) THEN
  5004  12    2:5    56                   BEGIN
  5005  12    2:6    56                     BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := -999;
  5006  12    2:6    75                     REPEAT
  5007  12    2:7    75                       AGIL1TEN := RANDOM MOD 10;
  5008  12    2:7    84                       CASE CHARACTR[ MYCHARX].ATTRIB[ AGILITY] OF
  5009  12    2:7    98                           3:  AGIL1TEN := AGIL1TEN + 3;
  5010  12    2:7   105                         4,5:  AGIL1TEN := AGIL1TEN + 2;
  5011  12    2:7   112                         6,7:  AGIL1TEN := AGIL1TEN + 1;
  5012  12    2:7   119                          15:  AGIL1TEN := AGIL1TEN - 1;
  5013  12    2:7   126                          16:  AGIL1TEN := AGIL1TEN - 2;
  5014  12    2:7   133                          17:  AGIL1TEN := AGIL1TEN - 3;
  5015  12    2:7   140                          18:  AGIL1TEN := AGIL1TEN - 4;
  5016  12    2:7   147                       END;
  5017  12    2:7   186                       IF AGIL1TEN < 1 THEN
  5018  12    2:8   191                         AGIL1TEN := 1
  5019  12    2:7   191                       ELSE
  5020  12    2:8   196                         IF AGIL1TEN > 10 THEN
  5021  12    2:9   201                           AGIL1TEN := 10;
  5022  12    2:7   204                       BATTLERC[ 0].A.TEMP04[ MYCHARX].AGILITY := AGIL1TEN;
  5023  12    2:7   220                       CLEARWIN( COMB1WIN, TRUE);
  5024  12    2:7   227                       CENTSTR( COMB1WIN, CONCAT( CHARACTR[ MYCHARX].NAME,
  5025  12    2:7   246                                                  '''S OPTIONS:'));
  5026  12    2:7   269                       PRINTCR( COMB1WIN);
  5027  12    2:7   275                       BDISPELL := FALSE;
  5028  12    2:7   278                       FDSUPRT1 := '';
  5029  12    2:7   285                       FDSUPRT := '';
  5030  12    2:7   292                       IF MYCHARX < 3 THEN
  5031  12    2:8   297                         BEGIN
  5032  12    2:9   297                           FDSUPRT := 'F';
  5033  12    2:9   302                           FDSUPRT1 := CONCAT( FDSUPRT1, 'F)IGHT/')
  5034  12    2:8   333                         END;
  5035  12    2:7   335                       IF (CHARACTR[ MYCHARX].CLASS = PRIEST) OR
  5036  12    2:7   344                       
  5037  12    2:7   344                          ((CHARACTR[ MYCHARX].CLASS = LORD) AND
  5038  12    2:7   353                           (CHARACTR[ MYCHARX].CHARLEV > 8)      ) OR
  5039  12    2:7   364                           
  5040  12    2:7   364                          ((CHARACTR[ MYCHARX].CLASS = BISHOP) AND
  5041  12    2:7   373                           (CHARACTR[ MYCHARX].CHARLEV > 3)      ) THEN
  5042  12    2:8   386                         BEGIN
  5043  12    2:9   386                           BDISPELL := TRUE;
  5044  12    2:9   389                           FDSUPRT1 := CONCAT( FDSUPRT1, 'D)ISPELL/');
  5045  12    2:9   424                           FDSUPRT := CONCAT( FDSUPRT, 'D')
  5046  12    2:8   449                         END;
  5047  12    2:7   451                       IF SURPRISE = 0 THEN
  5048  12    2:8   458                         BEGIN
  5049  12    2:9   458                           FDSUPRT1 := CONCAT( FDSUPRT1, 'S)PELL/');
  5050  12    2:9   491                           FDSUPRT := CONCAT( FDSUPRT, 'S')
  5051  12    2:8   516                         END;
  5052  12    2:7   518                       FDSUPRT := CONCAT( FDSUPRT, 'UPRT');
  5053  12    2:7   548                       IF CHKKEYBD THEN
  5054  12    2:8   555                         BEGIN
  5055  12    2:9   555                           GETKEY;
  5056  12    2:9   558                           BASE04 := -1;
  5057  12    2:9   562                           FOR CHX := 1 TO LENGTH( FDSUPRT) DO
  5058  12    2:0   577                             IF INCHAR = FDSUPRT[ CHX] THEN
  5059  12    2:1   585                               BASE04 := CHX - 1
  5060  12    2:8   586                         END
  5061  12    2:7   597                       ELSE
  5062  12    2:8   599                         BEGIN
  5063  12    2:9   599                           BASE04 := -1
  5064  12    2:8   599                         END;
  5065  12    2:8   603                       
  5066  12    2:7   603                       IF BASE04 = -1 THEN
  5067  12    2:8   609                         BEGIN
  5068  12    2:9   609                           UNITCLEAR( 1);
  5069  12    2:9   612                           BASE04 := MENU( COMB1WIN,
  5070  12    2:9   615                                 CONCAT( FDSUPRT1, 'U)SE/P)ARRY/R)UN/T)AKE BACK'))
  5071  12    2:8   664                         END;
  5072  12    2:8   671                       
  5073  12    2:7   671                       CLRRECT( COMB1WIN, 0, 2, 38, 2);
  5074  12    2:7   681                       MVCURSOR( COMB1WIN, 0, 2);
  5075  12    2:7   689                       IF MYCHARX > 2 THEN
  5076  12    2:8   694                         BASE04 := BASE04 + 1;
  5077  12    2:7   699                       IF NOT BDISPELL THEN
  5078  12    2:8   703                         IF BASE04 > 0 THEN
  5079  12    2:9   708                           BASE04 := BASE04 + 1;
  5080  12    2:7   713                       IF SURPRISE <> 0 THEN
  5081  12    2:8   720                         IF BASE04 > 1 THEN
  5082  12    2:9   725                           BASE04 := BASE04 + 1;
  5083  12    2:9   730                           
  5084  12    2:7   730                       CASE BASE04 OF
  5085  12    2:7   733                         1:  IF BDISPELL THEN
  5086  12    2:9   736                               WHICHGRP( 'DISPELL WHICH GROUP (NUM) ?', -5);
  5087  12    2:9   772                               
  5088  12    2:7   772                         5:  RUNAWAY;
  5089  12    2:7   776                         
  5090  12    2:7   776                         0:  IF MYCHARX < 3 THEN
  5091  12    2:9   781                               WHICHGRP( 'FIGHT AGAINST GROUP (NUM)  ?', -1);
  5092  12    2:9   818                               
  5093  12    2:7   818                         4:  BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := 0;
  5094  12    2:7   836                         
  5095  12    2:7   836                         2:  IF SURPRISE = 0 THEN
  5096  12    2:9   843                               GETSPELL;
  5097  12    2:9   847                               
  5098  12    2:7   847                         3:  USEITEM;
  5099  12    2:7   851                         
  5100  12    2:7   851                         6:  BEGIN
  5101  12    2:9   851                               BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH := -1;
  5102  12    2:9   868                               MYCHARX := -1
  5103  12    2:8   868                             END;
  5104  12    2:7   874                       END;
  5105  12    2:7   896                       
  5106  12    2:6   896                     UNTIL BATTLERC[ 0].A.TEMP04[ MYCHARX].SPELLHSH <> -999
  5107  12    2:5   909                   END
  5108  12    2:4   916                 ELSE
  5109  12    2:5   918                   BEGIN
  5110  12    2:6   918                     BATTLERC[ 0].A.TEMP04[ MYCHARX].AGILITY := -1
  5111  12    2:5   932                   END;
  5112  12    2:5   935                 
  5113  12    2:4   935                 MYCHARX := MYCHARX + 1
  5114  12    2:3   936               END;
  5115  12    2:3   942               
  5116  12    2:2   942               IF SURPRISE <> 2 THEN
  5117  12    2:3   949                 BEGIN
  5118  12    2:4   949                   CLEARWIN( COMB1WIN, TRUE);
  5119  12    2:4   956                   PRINTCR(  COMB1WIN);
  5120  12    2:4   962                   CENTSTR(  COMB1WIN, 'PRESS (RETURN) TO FIGHT, OR');
  5121  12    2:4   998                   CENTSTR(  COMB1WIN, 'T)AKE BACK ORDERS');
  5122  12    2:4  1024                   REPEAT
  5123  12    2:5  1024                     GETKEY
  5124  12    2:4  1024                   UNTIL (INCHAR = CHR( CRETURN)) OR
  5125  12    2:4  1030                         (INCHAR = 'T')
  5126  12    2:3  1033                 END
  5127  12    2:2  1036               ELSE
  5128  12    2:3  1038                 BEGIN
  5129  12    2:4  1038                   INCHAR := CHR( CRETURN)
  5130  12    2:3  1039                 END
  5131  12    2:1  1041           UNTIL INCHAR = CHR( CRETURN);
  5132  12    2:1  1046           PROTWIN( CHARSWIN, TRUE)
  5133  12    2:0  1050         END;  (* CACTION *)
  5134  12    2:0  1082         
  5135  12    2:0  1082       
  5136  12    2:0  1082 (*$I WIZ3B:COMBAT2   *)
  5136  12    2:0  1082 (*$I WIZ3B:COMBAT3   *)
  5137  12   22:D     1       PROCEDURE HEAL;  (* P010616 *)
  5138  12   22:D     1       
  5139  12   22:D     1         VAR
  5140  12   22:D     1              MVUPLIVE : INTEGER;
  5141  12   22:D     2              T1       : INTEGER; (* MULTIPLE USES *)
  5142  12   22:D     3              T2       : INTEGER; (* MULTIPLE USES *)
  5143  12   22:D     4              
  5144  12   22:D     4       
  5145  12   23:D     1         PROCEDURE TRYHEAL( HEALCHAN: INTEGER);  (* P010617 *)
  5146  12   23:D     2         
  5147  12   23:0     0           BEGIN
  5148  12   23:1     0             IF HEALCHAN > 50 THEN
  5149  12   23:2     5               HEALCHAN := 50;
  5150  12   23:1     8             IF (RANDOM MOD 100) <= HEALCHAN THEN
  5151  12   23:2    19               BATTLERC[ T2].A.TEMP04[ T1].STATUS := OK
  5152  12   23:0    37           END;
  5153  12   23:0    52           
  5154  12   23:0    52           
  5155  12   24:D     1         PROCEDURE HEALENMY;  (* P010618 *)
  5156  12   24:D     1         
  5157  12   24:D     1           VAR
  5158  12   24:D     1                ENEMYRC : TENEMY2;
  5159  12   24:D   156         
  5160  12   24:0     0           BEGIN
  5161  12   24:1     0             FOR T2 := 1 TO 4 DO
  5162  12   24:2    17               BEGIN
  5163  12   24:3    17                 IF BATTLERC[ T2].A.ALIVECNT > 0 THEN
  5164  12   24:4    31                   BEGIN
  5165  12   24:5    31                     T1 := 0;
  5166  12   24:5    35                     MVUPLIVE := 0;
  5167  12   24:5    39                     WHILE MVUPLIVE < BATTLERC[ T2].A.ALIVECNT DO
  5168  12   24:6    55                       BEGIN
  5169  12   24:7    55                         BATTLERC[ T2].A.TEMP04[ T1] :=
  5170  12   24:7    71                           BATTLERC[ T2].A.TEMP04[ MVUPLIVE];
  5171  12   24:7    89                         MVUPLIVE := MVUPLIVE + 1;
  5172  12   24:7    97                         IF BATTLERC[ T2].A.TEMP04[ T1].STATUS < DEAD THEN
  5173  12   24:8   118                           BEGIN
  5174  12   24:9   118                             CASE BATTLERC[ T2].A.TEMP04[ T1].STATUS OF
  5175  12   24:9   137                             
  5176  12   24:9   137                               AFRAID:
  5177  12   24:0   137                                TRYHEAL( 10 * BATTLERC[ T2].B.HPREC.LEVEL);
  5178  12   24:0   154                                
  5179  12   24:9   154                               ASLEEP:
  5180  12   24:0   154                                TRYHEAL( 20 * BATTLERC[ T2].B.HPREC.LEVEL);
  5181  12   24:0   171                                
  5182  12   24:9   171                               PLYZE:
  5183  12   24:0   171                                TRYHEAL(  7 * BATTLERC[ T2].B.HPREC.LEVEL);
  5184  12   24:9   188                             END;
  5185  12   24:9   202                             
  5186  12   24:9   202                             BATTLERC[ T2].A.TEMP04[ T1].HPLEFT :=
  5187  12   24:9   220                               BATTLERC[ T2].A.TEMP04[ T1].HPLEFT +
  5188  12   24:9   237                               BATTLERC[ T2].B.HEALPTS;
  5189  12   24:9   251                             T1 := T1 + 1
  5190  12   24:8   254                           END
  5191  12   24:6   259                       END;
  5192  12   24:5   261                       BATTLERC[ T2].A.ALIVECNT := T1
  5193  12   24:4   272                   END
  5194  12   24:2   276               END;
  5195  12   24:2   286               
  5196  12   24:1   286             FOR T1 := 1 TO 3 DO
  5197  12   24:2   303               BEGIN
  5198  12   24:3   303                 FOR T2 := T1 + 1 TO 4 DO
  5199  12   24:4   324                   IF (BATTLERC[ T1].A.ALIVECNT = 0) AND
  5200  12   24:4   336                      (BATTLERC[ T2].A.ALIVECNT > 0)    THEN
  5201  12   24:5   351                     BEGIN
  5202  12   24:6   351                       ENEMYRC := BATTLERC[ T1];
  5203  12   24:6   365                       BATTLERC[ T1] := BATTLERC[ T2];
  5204  12   24:6   386                       BATTLERC[ T2] := ENEMYRC
  5205  12   24:5   395                     END
  5206  12   24:2   400               END;
  5207  12   24:2   420             
  5208  12   24:1   420             T2 := 0;
  5209  12   24:1   424             FOR T1 := 1 TO 4 DO
  5210  12   24:2   441               IF BATTLERC[ T1].A.ALIVECNT > 0 THEN
  5211  12   24:3   455                 T2 := T1;
  5212  12   24:1   471             DONEFIGH := (T2 = 0)
  5213  12   24:0   476           END;  (* HEALENMY *)
  5214  12   24:0   510           
  5215  12   24:0   510           
  5216  12   25:D     1         PROCEDURE HEALPRTY;  (* P010619 *)
  5217  12   25:D     1         
  5218  12   25:0     0           BEGIN
  5219  12   25:1     0             T2 := 0;
  5220  12   25:1     4             FOR T1 := 0 TO PARTYCNT - 1 DO
  5221  12   25:2    20               BEGIN
  5222  12   25:3    20                 IF BATTLERC[ 0].A.TEMP04[ T1].STATUS < DEAD THEN
  5223  12   25:4    39                   BEGIN
  5224  12   25:5    39                     IF CHARACTR[ T1].LOSTXYL.POISNAMT[ 1] > 0 THEN
  5225  12   25:6    58                       BEGIN
  5226  12   25:7    58                         IF BATTLERC[ 0].A.TEMP04[ T1].HPLEFT > 50 THEN
  5227  12   25:8    77                           BATTLERC[ 0].A.TEMP04[ T1].HPLEFT :=
  5228  12   25:8    93                           BATTLERC[ 0].A.TEMP04[ T1].HPLEFT  -
  5229  12   25:8   108                             (BATTLERC[ 0].A.TEMP04[ T1].HPLEFT DIV 10)
  5230  12   25:7   125                         ELSE
  5231  12   25:8   129                           BEGIN
  5232  12   25:9   129                             BATTLERC[ 0].A.TEMP04[ T1].HPLEFT :=
  5233  12   25:9   145                             BATTLERC[ 0].A.TEMP04[ T1].HPLEFT -
  5234  12   25:9   160                               CHARACTR[ T1].LOSTXYL.POISNAMT[ 1]
  5235  12   25:8   174                           END;
  5236  12   25:6   177                       END;
  5237  12   25:5   177                     BATTLERC[ 0].A.TEMP04[ T1].HPLEFT :=
  5238  12   25:5   193                       BATTLERC[ 0].A.TEMP04[ T1].HPLEFT +
  5239  12   25:5   208                       CHARACTR[ T1].HEALPTS;
  5240  12   25:5   219                     IF BATTLERC[ 0].A.TEMP04[ T1].HPLEFT >
  5241  12   25:5   234                          CHARACTR[ T1].HPMAX THEN
  5242  12   25:6   246                       BATTLERC[ 0].A.TEMP04[ T1].HPLEFT :=
  5243  12   25:6   262                          CHARACTR[ T1].HPMAX;
  5244  12   25:5   272                     IF BATTLERC[ 0].A.TEMP04[ T1].HPLEFT <= 0 THEN
  5245  12   25:6   291                       BEGIN
  5246  12   25:7   291                         BATTLERC[ 0].A.TEMP04[ T1].STATUS := DEAD;
  5247  12   25:7   309                         BATTLERC[ 0].A.TEMP04[ T1].HPLEFT := 0
  5248  12   25:6   325                       END;
  5249  12   25:6   327                     
  5250  12   25:5   327                     CASE BATTLERC[ 0].A.TEMP04[ T1].STATUS OF
  5251  12   25:5   344                       ASLEEP:  TRYHEAL( 10 * CHARACTR[ T1].CHARLEV);
  5252  12   25:5   359                       AFRAID:  TRYHEAL(  5 * CHARACTR[ T1].CHARLEV);
  5253  12   25:5   374                     END
  5254  12   25:4   386                   END
  5255  12   25:2   386                 END;
  5256  12   25:2   396                 
  5257  12   25:1   396               FOR T1 := 0 TO PARTYCNT - 1 DO
  5258  12   25:2   412                 BEGIN
  5259  12   25:3   412                   CHARACTR[ T1].HPLEFT := BATTLERC[ 0].A.TEMP04[ T1].HPLEFT;
  5260  12   25:3   437                   CHARACTR[ T1].STATUS := BATTLERC[ 0].A.TEMP04[ T1].STATUS
  5261  12   25:2   460                 END
  5262  12   25:0   462           END;  (* HEALPRTY *)
  5263  12   25:0   492           
  5264  12   25:0   492           
  5265  12   26:D     1         PROCEDURE HEALHEAR;  (* P01061A *)
  5266  12   26:D     1         
  5267  12   27:D     1           PROCEDURE DECINAUD( GROUPI:   INTEGER;  (* P01061B *)
  5268  12   27:D     2                               ALIVECNT: INTEGER);
  5269  12   27:D     3           
  5270  12   27:D     3             VAR
  5271  12   27:D     3                  X : INTEGER;
  5272  12   27:D     4           
  5273  12   27:0     0             BEGIN
  5274  12   27:1     0               FOR X := 0 TO ALIVECNT - 1 DO
  5275  12   27:2    13                 IF BATTLERC[ GROUPI].A.TEMP04[ ALIVECNT].INAUDCNT > 0 THEN
  5276  12   27:3    30                    BATTLERC[ GROUPI].A.TEMP04[ ALIVECNT].INAUDCNT :=
  5277  12   27:3    44                    BATTLERC[ GROUPI].A.TEMP04[ ALIVECNT].INAUDCNT - 1
  5278  12   27:0    57             END;  (* DECINAUD *)
  5279  12   27:0    82             
  5280  12   27:0    82             
  5281  12   26:0     0           BEGIN (* HEALHEAR *)
  5282  12   26:1     0             DECINAUD( 0, PARTYCNT);
  5283  12   26:1     4             DECINAUD( 1, BATTLERC[ 1].A.ALIVECNT);
  5284  12   26:1    15             DECINAUD( 2, BATTLERC[ 2].A.ALIVECNT);
  5285  12   26:1    26             DECINAUD( 3, BATTLERC[ 3].A.ALIVECNT)
  5286  12   26:0    35           END; (* HEALHEAR *)
  5287  12   26:0    50           
  5288  12   26:0    50           
  5289  12   22:0     0         BEGIN (* HEAL *)
  5290  12   22:1     0           HEALENMY;
  5291  12   22:1     2           HEALPRTY;
  5292  12   22:1     4           HEALHEAR
  5293  12   22:0     4         END;
  5294  12   22:0    18       
  5295  12   22:0    18       
  5296  12   28:D     1       PROCEDURE DSPENEMY;  (* P01061C *)
  5297  12   28:D     1       
  5298  12   28:D     1         VAR
  5299  12   28:D     1              ENMYGROK : INTEGER;
  5300  12   28:D     2              ENMYGRI  : INTEGER;
  5301  12   28:D     3              ENMYIND  : INTEGER;
  5302  12   28:D     4       
  5303  12   28:0     0         BEGIN
  5304  12   28:1     0           ENSTRENG := 0;
  5305  12   28:1     4           CLEARWIN( COMB2WIN, TRUE);
  5306  12   28:1    11           FOR ENMYGRI := 1 TO 4 DO
  5307  12   28:2    22             BEGIN
  5308  12   28:3    22               IF BATTLERC[ ENMYGRI].A.ALIVECNT > 0 THEN
  5309  12   28:4    34                 BEGIN
  5310  12   28:5    34                   ENMYGROK := 0;
  5311  12   28:5    37                   FOR ENMYIND := 0 TO BATTLERC[ ENMYGRI].A.ALIVECNT - 1 DO
  5312  12   28:6    57                     IF BATTLERC[ ENMYGRI].A.TEMP04[ ENMYIND].STATUS = OK THEN
  5313  12   28:7    74                       ENMYGROK := ENMYGROK + 1;
  5314  12   28:5    86                   ENSTRENG := ENSTRENG + ENMYGROK *
  5315  12   28:5    90                                          (BATTLERC[ ENMYGRI].B.HPREC.LEVEL);
  5316  12   28:5   104                   PRINTNUM( COMB2WIN, ENMYGRI, 1);
  5317  12   28:5   112                   PRINTSTR( COMB2WIN, ') ');
  5318  12   28:5   123                   PRINTNUM( COMB2WIN, BATTLERC[ ENMYGRI].A.ALIVECNT, 1);
  5319  12   28:5   138                   PRINTCHR( COMB2WIN, ' ');
  5320  12   28:5   145                   IF BATTLERC[ ENMYGRI].A.IDENTIFI THEN
  5321  12   28:6   155                     IF BATTLERC[ ENMYGRI].A.ALIVECNT > 1 THEN
  5322  12   28:7   167                       PRINTSTR( COMB2WIN, BATTLERC[ ENMYGRI].B.NAMES)
  5323  12   28:6   179                     ELSE
  5324  12   28:7   184                       PRINTSTR( COMB2WIN, BATTLERC[ ENMYGRI].B.NAME)
  5325  12   28:5   196                   ELSE
  5326  12   28:6   201                     IF BATTLERC[ ENMYGRI].A.ALIVECNT > 1 THEN
  5327  12   28:7   213                       PRINTSTR( COMB2WIN, BATTLERC[ ENMYGRI].B.NAMEUNKS)
  5328  12   28:6   225                     ELSE
  5329  12   28:7   230                       PRINTSTR( COMB2WIN, BATTLERC[ ENMYGRI].B.NAMEUNK);
  5330  12   28:5   245                   PRINTSTR( COMB2WIN, ' (');
  5331  12   28:5   256                   PRINTNUM( COMB2WIN, ENMYGROK, 1);
  5332  12   28:5   264                   PRINTCHR( COMB2WIN, ')');
  5333  12   28:5   271                   PRINTCR(  COMB2WIN)
  5334  12   28:4   274                 END
  5335  12   28:2   277             END
  5336  12   28:0   277         END;
  5337  12   28:0   304         
  5338  12   28:0   304         
  5339  12   29:D     1       PROCEDURE DSPPARTY;  (* P01061D *)
  5340  12   29:D     1       
  5341  12   29:D     1         VAR
  5342  12   29:D     1              UNUSEDXX : INTEGER;
  5343  12   29:D     2              TEMPXYZ  : INTEGER;  (* MULTIPLE USES *)
  5344  12   29:D     3              PARTYI   : INTEGER;
  5345  12   29:D     4              STATUSOK : BOOLEAN;
  5346  12   29:D     5       
  5347  12   29:D     5       
  5348  12   30:D     1         PROCEDURE PRSTATUS;  (* P01061E *)
  5349  12   30:D     1         
  5350  12   30:0     0           BEGIN
  5351  12   30:1     0             TEMPXYZ := CHARACTR[ PARTYI].HEALPTS -
  5352  12   30:1     9                          CHARACTR[ PARTYI].LOSTXYL.POISNAMT[ 1];
  5353  12   30:1    28             IF TEMPXYZ = 0 THEN
  5354  12   30:2    35               PRINTCHR( CHARSWIN, ' ')
  5355  12   30:1    39             ELSE IF TEMPXYZ < 0 THEN
  5356  12   30:3    51               PRINTCHR( CHARSWIN, '-')
  5357  12   30:2    55             ELSE
  5358  12   30:3    60               PRINTCHR( CHARSWIN, '+');
  5359  12   30:1    67             IF CHARACTR[ PARTYI].STATUS = OK THEN
  5360  12   30:2    80               BEGIN
  5361  12   30:3    80                 STATUSOK := TRUE;
  5362  12   30:3    84                 IF CHARACTR[ PARTYI].LOSTXYL.POISNAMT[ 1] = 0 THEN
  5363  12   30:4   103                   PRINTNUM( CHARSWIN, CHARACTR[ PARTYI].HPMAX, 4)
  5364  12   30:3   116                 ELSE
  5365  12   30:4   121                   PRINTSTR( CHARSWIN, 'POISON')
  5366  12   30:2   133               END
  5367  12   30:1   136             ELSE
  5368  12   30:2   138               BEGIN
  5369  12   30:3   138                 PRINTSTR( CHARSWIN, SCNTOC.STATUS[ CHARACTR[ PARTYI].STATUS])
  5370  12   30:2   155               END
  5371  12   30:0   158           END; (* PRSTATUS *)
  5372  12   30:0   170           
  5373  12   30:0   170           
  5374  12   31:D     1         PROCEDURE SWAP2CHR( X: INTEGER;  (* P01061F *)
  5375  12   31:D     2                             Y: INTEGER);
  5376  12   31:D     3         
  5377  12   31:D     3           VAR
  5378  12   31:D     3                TEMPCHAR : TCHAR;
  5379  12   31:D   107                TEMPX    : BOOLEAN;
  5380  12   31:D   108         
  5381  12   31:0     0           BEGIN
  5382  12   31:1     0             TEMPCHAR := CHARACTR[ X];
  5383  12   31:1     9             CHARACTR[ X] := CHARACTR[ Y];
  5384  12   31:1    21             CHARACTR[ Y] := TEMPCHAR;
  5385  12   31:1    30             
  5386  12   31:1    30             BASE04 := CHARDISK[ X];
  5387  12   31:1    39             CHARDISK[ X] := CHARDISK[ Y];
  5388  12   31:1    53             CHARDISK[ Y] := BASE04;
  5389  12   31:1    61             
  5390  12   31:1    61             TEMPX := DRAINED[ X];
  5391  12   31:1    71             DRAINED[ X] := DRAINED[ Y];
  5392  12   31:1    87             DRAINED[ Y] := TEMPX;
  5393  12   31:1    97             
  5394  12   31:1    97             BATTLERC[ 0].A.TEMP04[ 6] := BATTLERC[ 0].A.TEMP04[ X];
  5395  12   31:1   123             BATTLERC[ 0].A.TEMP04[ X] := BATTLERC[ 0].A.TEMP04[ Y];
  5396  12   31:1   149             BATTLERC[ 0].A.TEMP04[ Y] := BATTLERC[ 0].A.TEMP04[ 6]
  5397  12   31:1   173           
  5398  12   31:0   173           END; (* SWAP2CHR *)
  5399  12   31:0   188         
  5400  12   31:0   188         
  5401  12   29:0     0         BEGIN (* DSPPARTY *)
  5402  12   29:1     0           FOR PARTYI := 0 TO PARTYCNT - 2 DO
  5403  12   29:2    13             FOR TEMPXYZ := PARTYI + 1 TO PARTYCNT - 1 DO
  5404  12   29:3    28               IF PREBATOR[ PARTYI] = CHARDISK[ TEMPXYZ] THEN
  5405  12   29:4    46                 SWAP2CHR( PARTYI, TEMPXYZ);
  5406  12   29:4    64           
  5407  12   29:1    64           FOR PARTYI := 0 TO PARTYCNT - 2 DO
  5408  12   29:2    77             FOR TEMPXYZ := PARTYI + 1 TO PARTYCNT - 1 DO
  5409  12   29:3    92               IF CHARACTR[ PARTYI].STATUS > CHARACTR[ TEMPXYZ].STATUS THEN
  5410  12   29:4   109                 SWAP2CHR( PARTYI, TEMPXYZ);
  5411  12   29:4   127                 
  5412  12   29:1   127           BASE291.MYSTRENG := 0;
  5413  12   29:1   131           BATTLERC[ 0].A.ALIVECNT := 0;
  5414  12   29:1   142           FOR PARTYI := 0 TO PARTYCNT - 1 DO
  5415  12   29:2   155             BEGIN
  5416  12   29:3   155               IF CHARACTR[ PARTYI].STATUS = OK THEN
  5417  12   29:4   166                 BASE291.MYSTRENG := BASE291.MYSTRENG +
  5418  12   29:4   169                                     CHARACTR[ PARTYI].CHARLEV;
  5419  12   29:3   180               IF CHARACTR[ PARTYI].STATUS < DEAD THEN
  5420  12   29:4   191                 BATTLERC[ 0].A.ALIVECNT := BATTLERC[ 0].A.ALIVECNT + 1
  5421  12   29:2   208             END;
  5422  12   29:2   218           
  5423  12   29:1   218           STATUSOK := FALSE;
  5424  12   29:1   221           FOR PARTYI := 0 TO PARTYCNT - 1 DO
  5425  12   29:2   234             BEGIN
  5426  12   29:3   234               IF (RANDOM MOD 99) < (CHARACTR[ PARTYI].ATTRIB[ IQ] +
  5427  12   29:3   253                                     CHARACTR[ PARTYI].ATTRIB[ PIETY] +
  5428  12   29:3   266                                     CHARACTR[ PARTYI].CHARLEV)  THEN
  5429  12   29:4   277                 BATTLERC[ (RANDOM MOD 4) + 1].A.IDENTIFI := TRUE;
  5430  12   29:3   294               MVCURSOR( CHARSWIN, 0, PARTYI + 1);
  5431  12   29:3   304               PRINTNUM( CHARSWIN, PARTYI + 1, 1);
  5432  12   29:3   314               PRINTCHR( CHARSWIN, ' ');
  5433  12   29:3   321               PRINTSTR( CHARSWIN, CHARACTR[ PARTYI].NAME);
  5434  12   29:3   332               WHILE CHARSWIN^.HEAD.HCURSOR < 18 DO
  5435  12   29:4   344                 PRINTCHR( CHARSWIN, ' ');
  5436  12   29:3   353               PRINTSTR( CHARSWIN,
  5437  12   29:3   356                         COPY( SCNTOC.ALIGN[ CHARACTR[ PARTYI].ALIGN], 1, 1));
  5438  12   29:3   380               PRINTCHR( CHARSWIN, '-');
  5439  12   29:3   387               PRINTSTR( CHARSWIN,
  5440  12   29:3   390                         COPY( SCNTOC.CLASS[ CHARACTR[ PARTYI].CLASS], 1, 3));
  5441  12   29:3   414               PRINTCHR( CHARSWIN, ' ');
  5442  12   29:3   421               BASE04 := CHARACTR[ PARTYI].ARMORCL -
  5443  12   29:3   428                         ACMOD2 -
  5444  12   29:3   432                         BATTLERC[ 0].A.TEMP04[ PARTYI].ARMORCL;
  5445  12   29:3   448               IF BASE04 > - 10 THEN
  5446  12   29:4   454                 PRINTNUM( CHARSWIN, BASE04, 2)
  5447  12   29:3   459               ELSE
  5448  12   29:4   464                 PRINTSTR( CHARSWIN, 'LO');
  5449  12   29:3   475               PRINTNUM( CHARSWIN, CHARACTR[ PARTYI].HPLEFT, 5);
  5450  12   29:3   489               PRSTATUS;
  5451  12   29:3   491               WHILE CHARSWIN^.HEAD.HCURSOR <> 0 DO
  5452  12   29:4   503                 PRINTCHR( CHARSWIN, ' ')
  5453  12   29:2   507             END;
  5454  12   29:1   519             IF NOT STATUSOK THEN
  5455  12   29:2   523               EXITCOMB
  5456  12   29:0   523         END; (* DSPPARTY *)
  5457  12   29:0   556         
  5458  12   29:0   556         
  5459  12    1:0     0       BEGIN (* CUTIL *)
  5460  12    1:1     0         HEAL;
  5461  12    1:1     2         DSPPARTY;
  5462  12    1:1     4         DSPENEMY;
  5463  12    1:1     6         IF DONEFIGH THEN
  5464  12    1:2    11           EXIT( CUTIL);
  5465  12    1:1    15         CACTION
  5466  12    1:0    15       END;  (* CUTIL *)
  5467  12    1:0    30   
  5468  12    1:0    30 (*$I WIZ3B:COMBAT3   *)
  5468  12    1:0    30 (*$I WIZ3B:COMBAT4   *)
  5469  13    1:D     1   SEGMENT PROCEDURE MELEE;  (* P010701 *)
  5470  13    1:D     1   
  5471  13    1:D     1     VAR
  5472  13    1:D     1          VICTIM   : INTEGER;
  5473  13    1:D     2          ATTACKTY : INTEGER;
  5474  13    1:D     3          BATI     : INTEGER;
  5475  13    1:D     4          BATG     : INTEGER;
  5476  13    1:D     5          AGILELEV : INTEGER;
  5477  13    1:D     6   
  5478  13    1:D     6   
  5479  14    1:D     1     SEGMENT PROCEDURE CASTASPE;  (* P010801 *)
  5480  14    1:D     1     
  5481  14    1:D     1       TYPE
  5482  14    1:D     1            THITHEAL = RECORD
  5483  14    1:D     1                HITS     : INTEGER;
  5484  14    1:D     1                HITRANGE : INTEGER;
  5485  14    1:D     1                HITMIN   : INTEGER;
  5486  14    1:D     1              END;
  5487  14    1:D     1                     
  5488  14    1:D     1       VAR
  5489  14    1:D     1            SPELL    : INTEGER;
  5490  14    1:D     2            CASTI    : INTEGER;
  5491  14    1:D     3            CASTGR   : INTEGER;
  5492  14    1:D     4            PRCNTMOD : INTEGER;
  5493  14    1:D     5            
  5494  14    1:D     5            
  5495  14    2:D     1       PROCEDURE DSPNAMES( GROUPI:  INTEGER;  (* P010802 *)
  5496  14    2:D     2                           MYCHARI: INTEGER);
  5497  14    2:D     3       
  5498  14    2:0     0         BEGIN
  5499  14    2:1     0           IF GROUPI = 0 THEN
  5500  14    2:2     5             CENTSTR( COMB1WIN, CHARACTR[ MYCHARI].NAME)
  5501  14    2:1    13           ELSE
  5502  14    2:2    18             IF BATTLERC[ GROUPI].A.IDENTIFI THEN
  5503  14    2:3    28               CENTSTR( COMB1WIN, BATTLERC[ GROUPI].B.NAME)
  5504  14    2:2    40             ELSE
  5505  14    2:3    45               CENTSTR( COMB1WIN, BATTLERC[ GROUPI].B.NAMEUNK)
  5506  14    2:0    57         END;
  5507  14    2:0    72         
  5508  14    2:0    72         
  5509  14    3:D     3       FUNCTION UNAFFECT( GROUPI: INTEGER):  BOOLEAN;  (* P010803 *)
  5510  14    3:D     4       
  5511  14    3:0     0         BEGIN
  5512  14    3:1     0           UNAFFECT := FALSE;
  5513  14    3:1     3           IF GROUPI < 1 THEN
  5514  14    3:2     8             EXIT( UNAFFECT);
  5515  14    3:1    12           IF BATTLERC[ GROUPI].B.UNAFFCT > (RANDOM MOD 100) THEN
  5516  14    3:2    32             BEGIN
  5517  14    3:3    32               DSPNAMES( GROUPI, 1);
  5518  14    3:3    36               CENTSTR( COMB1WIN, 'IS UNAFFECTED!');
  5519  14    3:3    59               PAUSE1;
  5520  14    3:3    62               CLRRECT( COMB1WIN, 0, 2, 38, 2);
  5521  14    3:3    72               MVCURSOR( COMB1WIN, 0, 2);
  5522  14    3:3    80               UNAFFECT := TRUE
  5523  14    3:2    80             END
  5524  14    3:0    83         END;
  5525  14    3:0    96         
  5526  14    3:0    96         
  5527  14    4:D     1       PROCEDURE BREATHDM( GROUPI: INTEGER;     (* P010804 *)
  5528  14    4:D     2                           CHARI:  INTEGER;
  5529  14    4:D     3                           HITDAM: INTEGER);
  5530  14    4:D     4       
  5531  14    4:0     0         BEGIN
  5532  14    4:1     0           IF HITDAM < 0 THEN
  5533  14    4:2     5             HITDAM := 0;
  5534  14    4:1     8           IF BATTLERC[ GROUPI].A.TEMP04[ CHARI].STATUS >= DEAD THEN
  5535  14    4:2    25             EXIT( BREATHDM);
  5536  14    4:1    29           IF UNAFFECT( GROUPI) THEN
  5537  14    4:2    36             EXIT( BREATHDM);
  5538  14    4:1    40           DSPNAMES( GROUPI, CHARI);
  5539  14    4:1    44           MVCURSOR( COMB1WIN, 11, COMB1WIN^.HEAD.VCURSOR);
  5540  14    4:1    59           PRINTSTR( COMB1WIN, 'TAKES ');
  5541  14    4:1    74           PRINTNUM( COMB1WIN, HITDAM, 4);
  5542  14    4:1    82           PRINTSTR( COMB1WIN, ' DAMAGE');
  5543  14    4:1    98           WITH BATTLERC[ GROUPI].A.TEMP04[ CHARI] DO
  5544  14    4:2   112             BEGIN
  5545  14    4:3   112               HPLEFT := HPLEFT - HITDAM;
  5546  14    4:3   120               IF HPLEFT <= 0 THEN
  5547  14    4:4   126                 BEGIN
  5548  14    4:5   126                   HPLEFT := 0;
  5549  14    4:5   131                   STATUS := DEAD;
  5550  14    4:5   136                   PAUSE1;
  5551  14    4:5   139                   CLRRECT(  COMB1WIN, 0, 3, 38, 1);
  5552  14    4:5   149                   MVCURSOR( COMB1WIN, 0, 3);
  5553  14    4:5   157                   CENTSTR(  COMB1WIN, 'DIES!')
  5554  14    4:4   168                 END
  5555  14    4:2   171             END;
  5556  14    4:1   171           PAUSE1;
  5557  14    4:1   174           CLRRECT(  COMB1WIN, 0, 2, 38, 2);
  5558  14    4:1   184           MVCURSOR( COMB1WIN, 0, 2)
  5559  14    4:0   189         END;
  5560  14    4:0   204         
  5561  14    4:0   204         
  5562  14    5:D     1       PROCEDURE ISISNOT( GROUPI:    INTEGER;  (* P010805 *)
  5563  14    5:D     2                          CHARI:     INTEGER;
  5564  14    5:D     3                          ISNOTCHN:  INTEGER;
  5565  14    5:D     4                          SDAMTYPE:  STRING;
  5566  14    5:D     5                          DAMTYPE:   INTEGER);
  5567  14    5:D    47       
  5568  14    5:D    47         VAR
  5569  14    5:D    47             SISISNOT : STRING[ 10];
  5570  14    5:D    53             
  5571  14    5:0     0         BEGIN
  5572  14    5:1     0           IF UNAFFECT( GROUPI) THEN
  5573  14    5:2    12             EXIT( ISISNOT);
  5574  14    5:1    16           IF ISNOTCHN < 5 THEN
  5575  14    5:2    21             ISNOTCHN := 5;
  5576  14    5:1    24           DSPNAMES( GROUPI, CHARI);
  5577  14    5:1    28           IF (RANDOM MOD 100) < ISNOTCHN THEN
  5578  14    5:2    39             SISISNOT := 'IS NOT '
  5579  14    5:1    41           ELSE
  5580  14    5:2    55             BEGIN
  5581  14    5:3    55               SISISNOT := 'IS ';
  5582  14    5:3    65               CASE DAMTYPE OF
  5583  14    5:3    68                 0, 3:  BATTLERC[ GROUPI].A.TEMP04[ CHARI].STATUS := ASLEEP;
  5584  14    5:3    86                    1:  BATTLERC[ GROUPI].A.TEMP04[ CHARI].INAUDCNT :=
  5585  14    5:4   100                          (RANDOM MOD 4) + 2;
  5586  14    5:3   112                    2:  
  5587  14    5:4   112                        BEGIN
  5588  14    5:5   112                          BATTLERC[ GROUPI].A.TEMP04[ CHARI].STATUS := DEAD;
  5589  14    5:5   128                          BATTLERC[ GROUPI].A.TEMP04[ CHARI].HPLEFT := 0
  5590  14    5:4   142                        END;
  5591  14    5:3   146               END
  5592  14    5:2   162             END;
  5593  14    5:1   162           CENTSTR(  COMB1WIN, CONCAT( SISISNOT, SDAMTYPE));
  5594  14    5:1   189           PAUSE1;
  5595  14    5:1   192           CLRRECT(  COMB1WIN, 0, 2, 38, 2);
  5596  14    5:1   202           MVCURSOR( COMB1WIN, 0, 2)
  5597  14    5:0   207         END;
  5598  14    5:0   222         
  5599  14    5:0   222         
  5600  14    6:D     3       FUNCTION CALCPTS( HITHEAL: THITHEAL) : INTEGER;  (* P010806 *)
  5601  14    6:D     7       
  5602  14    6:D     7         VAR
  5603  14    6:D     7              POINTS : INTEGER;
  5604  14    6:D     8              
  5605  14    6:0     0         BEGIN
  5606  14    6:1     0           POINTS := 0;
  5607  14    6:1     8           WHILE HITHEAL.HITS > 0 DO
  5608  14    6:2    13             BEGIN
  5609  14    6:3    13               POINTS := POINTS + (RANDOM MOD HITHEAL.HITRANGE) + 1;
  5610  14    6:3    26               HITHEAL.HITS := HITHEAL.HITS - 1
  5611  14    6:2    27             END;
  5612  14    6:1    33           CALCPTS := POINTS + HITHEAL.HITMIN
  5613  14    6:0    34         END;
  5614  14    6:0    52         
  5615  14    6:0    52         
  5616  14    7:D     1       PROCEDURE MODAC( GROUPI: INTEGER;  (* P010807 *)
  5617  14    7:D     2                        ACMOD:  INTEGER;
  5618  14    7:D     3                        CHARF:  INTEGER;
  5619  14    7:D     4                        CHARL:  INTEGER);
  5620  14    7:D     5                          
  5621  14    7:D     5         VAR
  5622  14    7:D     5              X : INTEGER;
  5623  14    7:D     6       
  5624  14    7:0     0         BEGIN
  5625  14    7:1     0           FOR X := CHARF TO CHARL DO
  5626  14    7:2    11             BATTLERC[ GROUPI].A.TEMP04[ X].ARMORCL :=
  5627  14    7:2    25               BATTLERC[ GROUPI].A.TEMP04[ X].ARMORCL + ACMOD;
  5628  14    7:0    48         END;
  5629  14    7:0    62         
  5630  14    7:0    62         
  5631  14    8:D     1       PROCEDURE DOHEAL( GROUPI:   INTEGER;   (* P010808 *)
  5632  14    8:D     2                         CHARI:    INTEGER;
  5633  14    8:D     3                         HITCNT:   INTEGER;
  5634  14    8:D     4                         HITRANGE: INTEGER);
  5635  14    8:D     5       
  5636  14    8:D     5         VAR
  5637  14    8:D     5              HITHEAL : THITHEAL;
  5638  14    8:D     8              POINTS  : INTEGER;
  5639  14    8:D     9       
  5640  14    8:0     0         BEGIN
  5641  14    8:1     0           HITHEAL.HITS     := HITCNT;
  5642  14    8:1     3           HITHEAL.HITRANGE := HITRANGE;
  5643  14    8:1     6           HITHEAL.HITMIN   := 0;
  5644  14    8:1     9           POINTS := CALCPTS( HITHEAL);
  5645  14    8:1    17           BATTLERC[ GROUPI].A.TEMP04[ CHARI].HPLEFT :=
  5646  14    8:1    31             BATTLERC[ GROUPI].A.TEMP04[ CHARI].HPLEFT + POINTS;
  5647  14    8:1    47           IF CHARACTR[ CHARI].HPMAX < 
  5648  14    8:1    54                BATTLERC[ GROUPI].A.TEMP04[ CHARI].HPLEFT THEN
  5649  14    8:2    70             BATTLERC[ GROUPI].A.TEMP04[ CHARI].HPLEFT :=
  5650  14    8:2    84               CHARACTR[ CHARI].HPMAX;
  5651  14    8:1    92           DSPNAMES( GROUPI, CHARI);
  5652  14    8:1    96           IF CHARACTR[ CHARI].HPMAX =
  5653  14    8:1   103                BATTLERC[ GROUPI].A.TEMP04[ CHARI].HPLEFT THEN
  5654  14    8:2   119             CENTSTR( COMB1WIN, 'IS FULLY HEALED')
  5655  14    8:1   140           ELSE
  5656  14    8:2   145             CENTSTR( COMB1WIN, 'IS PARTIALLY HEALED')
  5657  14    8:0   170         END;
  5658  14    8:0   186         
  5659  14    8:0   186         
  5660  14    9:D     1       PROCEDURE DOHITS( GROUPI:   INTEGER;  (* P010809 *)
  5661  14    9:D     2                         CHARI:    INTEGER;
  5662  14    9:D     3                         HITCNT:   INTEGER;
  5663  14    9:D     4                         HITRANGE: INTEGER);
  5664  14    9:D     5       
  5665  14    9:D     5         VAR
  5666  14    9:D     5             HITHEAL : THITHEAL;
  5667  14    9:D     8             POINTS  : INTEGER;
  5668  14    9:D     9       
  5669  14    9:0     0         BEGIN
  5670  14    9:1     0           HITHEAL.HITS     := HITCNT;
  5671  14    9:1     3           HITHEAL.HITRANGE := HITRANGE;
  5672  14    9:1     6           HITHEAL.HITMIN   := 0;
  5673  14    9:1     9           POINTS := CALCPTS( HITHEAL);
  5674  14    9:1    17           BREATHDM( GROUPI, CHARI, POINTS)
  5675  14    9:0    20         END;
  5676  14    9:0    34         
  5677  14    9:0    34         
  5678  14   10:D     1       PROCEDURE DOHOLD;  (* P01080A *)
  5679  14   10:D     1       
  5680  14   10:D     1         VAR
  5681  14   10:D     1             CHARX : INTEGER;
  5682  14   10:D     2             
  5683  14   10:0     0         BEGIN
  5684  14   10:1     0           FOR CHARX := 0 TO BATTLERC[ CASTGR].A.ALIVECNT - 1 DO
  5685  14   10:2    22             IF BATTLERC[ CASTGR].A.TEMP04[ CHARX].STATUS <= ASLEEP THEN
  5686  14   10:3    41               ISISNOT( CASTGR,
  5687  14   10:3    44                        CHARX,
  5688  14   10:3    45                        50 + 5 * (BATTLERC[ CASTGR].A.TEMP04[ CHARX].DRAIN2LV -
  5689  14   10:3    62                                  PRCNTMOD),
  5690  14   10:3    68                        'HELD',
  5691  14   10:3    75                        0)
  5692  14   10:0    76         END;
  5693  14   10:0   100         
  5694  14   10:0   100         
  5695  14   11:D     1       PROCEDURE DOSILENC;  (* P01080B *)
  5696  14   11:D     1       
  5697  14   11:D     1         VAR
  5698  14   11:D     1              CHARX : INTEGER;
  5699  14   11:D     2       
  5700  14   11:0     0         BEGIN
  5701  14   11:1     0           FOR CHARX := 0 TO BATTLERC[ CASTGR].A.ALIVECNT - 1 DO
  5702  14   11:2    22             ISISNOT( CASTGR,
  5703  14   11:2    25                      CHARX,
  5704  14   11:2    26                      40 + 5 * (BATTLERC[ CASTGR].A.TEMP04[ CHARX].DRAIN2LV -
  5705  14   11:2    43                                PRCNTMOD),
  5706  14   11:2    49                      'SILENCED',
  5707  14   11:2    60                      1)
  5708  14   11:0    61         END;
  5709  14   11:0    84         
  5710  14   11:0    84         
  5711  14   12:D     1       PROCEDURE DODISRUP;  (* P01080C  *)
  5712  14   12:D     1       
  5713  14   12:0     0         BEGIN
  5714  14   12:1     0           CENTSTR( COMB1WIN, 'SPELL DISRUPTED')
  5715  14   12:0    21         END;
  5716  14   12:0    36         
  5717  14   12:0    36         
  5718  14   13:D     1       PROCEDURE DOSLAIN( GROUPI: INTEGER;  (* P01080D *)
  5719  14   13:D     2                          CHARI:  INTEGER);
  5720  14   13:D     3       
  5721  14   13:D     3         VAR
  5722  14   13:D     3              CHNOTSLN : INTEGER;
  5723  14   13:D     4       
  5724  14   13:0     0         BEGIN
  5725  14   13:1     0           CHNOTSLN := 50 + 5 * (BATTLERC[ GROUPI].A.TEMP04[ CHARI].DRAIN2LV -
  5726  14   13:1    15                                 PRCNTMOD);
  5727  14   13:1    23           IF CHNOTSLN < 25 THEN
  5728  14   13:2    28             CHNOTSLN := 25;
  5729  14   13:1    31           ISISNOT( GROUPI, CHARI, CHNOTSLN, 'SLAIN', 2)
  5730  14   13:0    43         END;
  5731  14   13:0    58         
  5732  14   13:0    58         
  5733  14   14:D     1       PROCEDURE DOSLEPT;  (* P01080E *)
  5734  14   14:D     1       
  5735  14   14:D     1         VAR
  5736  14   14:D     1              CHARX : INTEGER;
  5737  14   14:D     2       
  5738  14   14:0     0         BEGIN
  5739  14   14:1     0           FOR CHARX := 0 TO BATTLERC[ CASTGR].A.ALIVECNT - 1 DO
  5740  14   14:2    22             IF BATTLERC[ CASTGR].A.TEMP04[ CHARX].STATUS < ASLEEP THEN
  5741  14   14:3    41               IF CASTGR = 0 THEN
  5742  14   14:4    48                 ISISNOT( 0,
  5743  14   14:4    49                          CHARX, 
  5744  14   14:4    50                          50 + 5 *
  5745  14   14:4    52                                  (BATTLERC[ CASTGR].A.TEMP04[ CHARX].DRAIN2LV
  5746  14   14:4    66                                   - PRCNTMOD),
  5747  14   14:4    73                          'SLEPT',
  5748  14   14:4    81                          3)
  5749  14   14:3    82               ELSE
  5750  14   14:4    86                 ISISNOT( CASTGR,
  5751  14   14:4    89                          CHARX,
  5752  14   14:4    90                          (50 + 5 *
  5753  14   14:4    92                                   (BATTLERC[ CASTGR].A.TEMP04[ CHARX].DRAIN2LV
  5754  14   14:4   106                                    - PRCNTMOD)) +
  5755  14   14:4   113                           (100 * ( ORD( NOT BATTLERC[ CASTGR].B.SPPC[ 4]))),
  5756  14   14:4   134                          'SLEPT',
  5757  14   14:4   142                          3)
  5758  14   14:0   143         END;
  5759  14   14:0   168         
  5760  14   14:0   168         
  5761  14   15:D     1       PROCEDURE HAMMAHAM( MAHAMFLG: INTEGER);  (* P01080F *)
  5762  14   15:D     2       
  5763  14   15:D     2         VAR
  5764  14   15:D     2              HAMCHOIC : INTEGER;
  5765  14   15:D     3              TEMP2    : INTEGER;  (* MULTIPLE USES *)
  5766  14   15:D     4              TEMP1    : INTEGER;  (* MULTIPLE USES *)
  5767  14   15:D     5              HAMTYPES : ARRAY[ 0..6] OF BOOLEAN;
  5768  14   15:D    12       
  5769  14   15:D    12       
  5770  14   16:D     1         PROCEDURE HAMCURE;  (* P010810 *)
  5771  14   16:D     1         
  5772  14   16:0     0           BEGIN
  5773  14   16:1     0             FOR TEMP1 := 0 TO PARTYCNT - 1 DO
  5774  14   16:2    16               IF BATTLERC[ 0].A.TEMP04[ TEMP1].STATUS < DEAD THEN
  5775  14   16:3    35                 BATTLERC[ 0].A.TEMP04[ TEMP1].STATUS := OK
  5776  14   16:0    51           END;
  5777  14   16:0    78           
  5778  14   16:0    78           
  5779  14   17:D     1         PROCEDURE HAMSILEN;  (* P010811 *)
  5780  14   17:D     1         
  5781  14   17:0     0           BEGIN
  5782  14   17:1     0             FOR TEMP1 := 1 TO 3 DO
  5783  14   17:2    14               FOR TEMP2 := 0 TO BATTLERC[ TEMP1].A.ALIVECNT - 1 DO
  5784  14   17:3    39                 BATTLERC[ TEMP1].A.TEMP04[ TEMP2].INAUDCNT :=
  5785  14   17:3    57                   5 + (RANDOM MOD 5)
  5786  14   17:0    65           END;
  5787  14   17:0   104           
  5788  14   17:0   104           
  5789  14   18:D     1         PROCEDURE HAMMAGIC;  (* P010812 *)
  5790  14   18:D     1         
  5791  14   18:0     0           BEGIN
  5792  14   18:1     0             FOR TEMP1 := 1 TO 3 DO
  5793  14   18:2    14               BEGIN
  5794  14   18:3    14                 FOR TEMP2 := 0 TO BATTLERC[ TEMP1].A.ALIVECNT DO
  5795  14   18:4    37                   BATTLERC[ TEMP1].A.TEMP04[ TEMP2].DRAIN2LV := 1;
  5796  14   18:3    67                 BATTLERC[ TEMP1].B.UNAFFCT := 0
  5797  14   18:2    79               END
  5798  14   18:0    81           END;
  5799  14   18:0   108           
  5800  14   18:0   108           
  5801  14   19:D     1         PROCEDURE HAMTELEP;  (* P010813 *)
  5802  14   19:D     1         
  5803  14   19:0     0           BEGIN
  5804  14   19:1     0             FOR TEMP1 := 1 TO 4 DO
  5805  14   19:2    14               FOR TEMP2 := 0 TO BATTLERC[ TEMP1].A.ALIVECNT - 1 DO
  5806  14   19:3    39                 BEGIN
  5807  14   19:4    39                   BATTLERC[ TEMP1].A.TEMP04[ TEMP2].STATUS := DEAD;
  5808  14   19:4    59                   BATTLERC[ TEMP1].A.TEMP04[ TEMP2].HPLEFT := 0
  5809  14   19:3    77                 END
  5810  14   19:0    79           END;
  5811  14   19:0   116           
  5812  14   19:0   116           
  5813  14   20:D     1         PROCEDURE HAMHEAL;  (* P010814 *)
  5814  14   20:D     1         
  5815  14   20:0     0           BEGIN
  5816  14   20:1     0             FOR TEMP1 := 0 TO PARTYCNT - 1 DO
  5817  14   20:2    16               IF BATTLERC[ 0].A.TEMP04[ TEMP1].STATUS < DEAD THEN
  5818  14   20:3    35                   WITH BATTLERC[ 0].A.TEMP04[ TEMP1] DO
  5819  14   20:4    51                     HPLEFT := CHARACTR[ TEMP1].HPMAX
  5820  14   20:0    61           END;
  5821  14   20:0    88           
  5822  14   20:0    88           
  5823  14   21:D     1         PROCEDURE HAMPROT; (* P010815 *)
  5824  14   21:D     1         
  5825  14   21:0     0           BEGIN
  5826  14   21:1     0             FOR TEMP1 := 0 TO PARTYCNT - 1 DO
  5827  14   21:2    16               IF CHARACTR[ TEMP1].ARMORCL > -10 THEN
  5828  14   21:3    30                 CHARACTR[ TEMP1].ARMORCL := -10
  5829  14   21:0    39           END;
  5830  14   21:0    66           
  5831  14   21:0    66           
  5832  14   22:D     1         PROCEDURE HAMALIVE;  (* P010816 *)
  5833  14   22:D     1         
  5834  14   22:0     0           BEGIN
  5835  14   22:1     0             FOR TEMP1 := 0 TO PARTYCNT - 1 DO
  5836  14   22:2    16               IF BATTLERC[ 0].A.TEMP04[ TEMP1].STATUS <> LOST THEN
  5837  14   22:3    35                 BATTLERC[ 0].A.TEMP04[ TEMP1].STATUS := OK;
  5838  14   22:1    63             HAMHEAL
  5839  14   22:0    63           END;
  5840  14   22:0    80       
  5841  14   22:0    80       
  5842  14   15:0     0         BEGIN  (* HAMMAHAM *)
  5843  14   15:1     0           IF MAHAMFLG = 7 THEN
  5844  14   15:2     5             CENTSTR( COMB1WIN, 'MAHAMAN IS INTONED AND...')
  5845  14   15:1    36           ELSE
  5846  14   15:2    41             CENTSTR( COMB1WIN, 'HAMAN IS INTONED AND...');
  5847  14   15:1    73           PAUSE2;
  5848  14   15:1    76           IF CHARACTR[ BATI].CHARLEV < 13 THEN
  5849  14   15:2    89             BEGIN
  5850  14   15:3    89               CENTSTR( COMB1WIN, 'FAILS!');
  5851  14   15:3   104               EXIT( HAMMAHAM)
  5852  14   15:2   108             END;
  5853  14   15:1   108           CHARACTR[ BATI].CHARLEV := CHARACTR[ BATI].CHARLEV - 1;
  5854  14   15:1   129           DRAINED[ BATI] := TRUE;
  5855  14   15:1   140           FILLCHAR( HAMTYPES, 14, 0);
  5856  14   15:1   147           FOR TEMP1 := 1 TO 3 DO
  5857  14   15:2   158             BEGIN
  5858  14   15:3   158               TEMP2 := RANDOM MOD (4 + 3 * (ORD( MAHAMFLG = 7)));
  5859  14   15:3   173               WHILE HAMTYPES[ TEMP2] DO
  5860  14   15:4   181                 TEMP2 := (TEMP2 + 1) MOD 7;
  5861  14   15:3   190               HAMTYPES[ TEMP2] := TRUE
  5862  14   15:2   195             END;
  5863  14   15:1   204           TEMPWIN := GETWIN( 4, 16, 32, 8, 31, TRUE);
  5864  14   15:1   218           CENTSTR( TEMPWIN, 'WHICH BOON WILL YOU INVOKE ?');
  5865  14   15:1   255           PRINTCR( TEMPWIN);
  5866  14   15:1   261           TEMP2 := -1;
  5867  14   15:1   265           FOR TEMP1 := 1 TO 3 DO
  5868  14   15:2   276             BEGIN
  5869  14   15:3   276               TEMP2 := TEMP2 + 1;
  5870  14   15:3   281               WHILE NOT (HAMTYPES[ TEMP2]) DO
  5871  14   15:4   290                 TEMP2 := TEMP2 + 1;
  5872  14   15:3   297               PRINTNUM( TEMPWIN, TEMP1, 1);
  5873  14   15:3   305               PRINTSTR( TEMPWIN, ') ');
  5874  14   15:3   316               CASE TEMP2 OF
  5875  14   15:3   319                 0:  PRINTSTR( TEMPWIN, 'CURE THE PARTY');
  5876  14   15:3   344                 1:  PRINTSTR( TEMPWIN, 'SILENCE THE MONSTERS');
  5877  14   15:3   375                 2:  PRINTSTR( TEMPWIN, 'MAKE MAGIC MORE EFFECTIVE');
  5878  14   15:3   411                 3:  PRINTSTR( TEMPWIN, 'TELEPORT THE MONSTERS');
  5879  14   15:3   443                 4:  PRINTSTR( TEMPWIN, 'HEAL THE PARTY');
  5880  14   15:3   468                 5:  PRINTSTR( TEMPWIN, 'PROTECT THE PARTY');
  5881  14   15:3   496                 6:  PRINTSTR( TEMPWIN, 'REANIMATE CORPSES!');
  5882  14   15:3   525               END;
  5883  14   15:3   546               PRINTCR( TEMPWIN)
  5884  14   15:2   549             END;
  5885  14   15:1   559           REPEAT
  5886  14   15:2   559             GETKEY
  5887  14   15:1   559           UNTIL (INCHAR >= '1') AND (INCHAR <= '3');
  5888  14   15:1   571           DELWIN( TEMPWIN, TRUE);
  5889  14   15:1   578           TEMP1 := ORD( INCHAR) - ORD( '0');
  5890  14   15:1   583           HAMCHOIC := -1;
  5891  14   15:1   587           FOR TEMP2 := 1 TO TEMP1 DO
  5892  14   15:2   598             BEGIN
  5893  14   15:3   598               HAMCHOIC := HAMCHOIC + 1;
  5894  14   15:3   603               WHILE NOT HAMTYPES[ HAMCHOIC] DO
  5895  14   15:4   612                 HAMCHOIC := HAMCHOIC + 1
  5896  14   15:2   613             END;
  5897  14   15:1   626           CASE HAMCHOIC OF
  5898  14   15:1   629             0:  HAMCURE;
  5899  14   15:1   633             1:  HAMSILEN;
  5900  14   15:1   637             2:  HAMMAGIC;
  5901  14   15:1   641             3:  HAMTELEP;
  5902  14   15:1   645             4:  HAMHEAL;
  5903  14   15:1   649             5:  HAMPROT;
  5904  14   15:1   653             6:  HAMALIVE;
  5905  14   15:1   657           END
  5906  14   15:0   678         END;   (* HAMMAHAM *)
  5907  14   15:0   710         
  5908  14   15:0   710         
  5909  14   23:D     1       PROCEDURE HITGROUP( GROUPI:  INTEGER;  (* P010817 *)
  5910  14   23:D     2                           HITSX:   INTEGER;
  5911  14   23:D     3                           HITSR:   INTEGER;
  5912  14   23:D     4                           TEMP99I: INTEGER);
  5913  14   23:D     5       
  5914  14   23:D     5         VAR
  5915  14   23:D     5              CHARI : INTEGER;
  5916  14   23:D     6       
  5917  14   23:0     0         BEGIN
  5918  14   23:1     0           IF BATTLERC[ GROUPI].A.ALIVECNT > 0 THEN
  5919  14   23:2    12             FOR CHARI := 0 TO BATTLERC[ GROUPI].A.ALIVECNT - 1 DO
  5920  14   23:3    32               BEGIN
  5921  14   23:4    32                 IF GROUPI = 0 THEN
  5922  14   23:5    37                   BATTLERC[ 0].B.WEPVSTY3 := CHARACTR[ CHARI].WEPVSTY3[ 1];
  5923  14   23:4    59                 IF BATTLERC[ GROUPI].B.WEPVSTY3[ TEMP99I] THEN
  5924  14   23:5    76                   DOHITS( GROUPI, CHARI, HITSX DIV 2 + 1, HITSR)
  5925  14   23:4    84                 ELSE
  5926  14   23:5    88                   DOHITS( GROUPI, CHARI, HITSX, HITSR)
  5927  14   23:3    92               END
  5928  14   23:0    94         END;
  5929  14   23:0   116         
  5930  14   23:0   116         
  5931  14   24:D     1       PROCEDURE SLOKTOFE;  (* P010818 *)
  5932  14   24:D     1       
  5933  14   24:D     1         VAR
  5934  14   24:D     1              POSSX :  INTEGER;
  5935  14   24:D     2              TEMPXX : INTEGER; (* MULTIPLE USES *)
  5936  14   24:D     3       
  5937  14   24:0     0         BEGIN
  5938  14   24:1     0           TEMPXX := 65 + PRCNTMOD;
  5939  14   24:1     7           IF TEMPXX > 95 THEN
  5940  14   24:2    12             TEMPXX := 95;
  5941  14   24:1    15           IF (RANDOM MOD 100) > TEMPXX THEN
  5942  14   24:2    26             BEGIN
  5943  14   24:3    26               CENTSTR( COMB1WIN, 'LOKTOFEIT FAILS!');
  5944  14   24:3    51               EXIT( SLOKTOFE)
  5945  14   24:2    55             END;
  5946  14   24:1    55           FOR TEMPXX := 0 TO PARTYCNT - 1 DO
  5947  14   24:2    68             BEGIN
  5948  14   24:3    68               FOR POSSX := 1 TO CHARACTR[ TEMPXX].POSS.POSSCNT DO
  5949  14   24:4    85                 WITH CHARACTR[ TEMPXX].POSS.POSSESS[ POSSX] DO
  5950  14   24:5    99                   BEGIN
  5951  14   24:6    99                     EQINDEX := 0;
  5952  14   24:6   104                     IDENTIF := FALSE;
  5953  14   24:6   109                     CURSED  := FALSE;
  5954  14   24:6   114                     EQUIPED := FALSE
  5955  14   24:5   115                   END;
  5956  14   24:3   124               CHARACTR[ TEMPXX].POSS.POSSCNT := 0;
  5957  14   24:3   133               CHARACTR[ TEMPXX].GOLD.HIGH := 0;
  5958  14   24:3   142               CHARACTR[ TEMPXX].GOLD.MID  := 0
  5959  14   24:2   149             END;
  5960  14   24:1   158           XGOTO := XCHK4WIN;
  5961  14   24:1   162           EXITCOMB
  5962  14   24:0   162         END;
  5963  14   24:0   182         
  5964  14   24:0   182         
  5965  14   25:D     1       PROCEDURE SMAKANIT;  (* P010819 *)
  5966  14   25:D     1         
  5967  14   25:D     1         VAR
  5968  14   25:D     1              VERTPOS : INTEGER;
  5969  14   25:D     2              ENEMYX  : INTEGER;
  5970  14   25:D     3              GROUPI  : INTEGER;
  5971  14   25:D     4              
  5972  14   25:D     4              
  5973  14   26:D     1         PROCEDURE PRPLURAL( SSINGLE: STRING;  (* P01081A *)
  5974  14   26:D     2                             SPLURAL: STRING);
  5975  14   26:D    85         
  5976  14   26:0     0           BEGIN
  5977  14   26:1     0             IF BATTLERC[ GROUPI].A.ALIVECNT = 1 THEN
  5978  14   26:2    24               CENTSTR( COMB1WIN, SSINGLE)
  5979  14   26:1    29             ELSE
  5980  14   26:2    34               CENTSTR( COMB1WIN, SPLURAL)
  5981  14   26:0    39           END;
  5982  14   26:0    54           
  5983  14   26:0    54           
  5984  14   25:0     0         BEGIN (* SMAKANIT *)
  5985  14   25:1     0           VERTPOS := COMB1WIN^.HEAD.VCURSOR;
  5986  14   25:1    10           FOR GROUPI := 1 TO 4 DO
  5987  14   25:2    21             BEGIN
  5988  14   25:3    21               MVCURSOR( COMB1WIN, 0, VERTPOS);
  5989  14   25:3    29               CLRRECT(  COMB1WIN, 0, VERTPOS, 38, 1);
  5990  14   25:3    39               IF BATTLERC[ GROUPI].A.ALIVECNT > 0 THEN
  5991  14   25:4    51                 BEGIN
  5992  14   25:5    51                   IF BATTLERC[ GROUPI].A.IDENTIFI THEN
  5993  14   25:6    61                     PRPLURAL( BATTLERC[ GROUPI].B.NAME,
  5994  14   25:6    70                               BATTLERC[ GROUPI].B.NAMES)
  5995  14   25:5    79                   ELSE
  5996  14   25:6    83                     PRPLURAL( BATTLERC[ GROUPI].B.NAMEUNK,
  5997  14   25:6    92                               BATTLERC[ GROUPI].B.NAMEUNKS);
  5998  14   25:6   103                               
  5999  14   25:5   103                   IF BATTLERC[ GROUPI].B.CLASS = 10 THEN
  6000  14   25:6   116                     PRPLURAL( ' IS UNAFFECTED!',
  6001  14   25:6   134                               ' ARE UNAFFECTED!')
  6002  14   25:5   153                   ELSE
  6003  14   25:6   157                     IF BATTLERC[ GROUPI].B.HPREC.LEVEL > 7 THEN
  6004  14   25:7   170                       PRPLURAL( ' SURVIVES!',
  6005  14   25:7   183                                 ' SURVIVE!')
  6006  14   25:6   195                     ELSE
  6007  14   25:7   199                       BEGIN
  6008  14   25:8   199                         PRPLURAL( ' PERISHES!',
  6009  14   25:8   212                                   ' PERISH!');
  6010  14   25:8   225                         FOR ENEMYX := 0 TO BATTLERC[ GROUPI].A.ALIVECNT DO
  6011  14   25:9   243                           BEGIN
  6012  14   25:0   243                             WITH BATTLERC[ GROUPI].A.TEMP04[ ENEMYX] DO
  6013  14   25:1   257                               BEGIN
  6014  14   25:2   257                                 HPLEFT := 0;
  6015  14   25:2   262                                 STATUS := DEAD
  6016  14   25:1   265                               END
  6017  14   25:9   267                           END
  6018  14   25:7   267                       END;
  6019  14   25:5   274                   PAUSE1
  6020  14   25:4   274                 END
  6021  14   25:2   277             END
  6022  14   25:0   277         END;  (* SMAKANIT *)
  6023  14   25:0   304         
  6024  14   25:0   304         
  6025  14   27:D     1       PROCEDURE SMALOR;  (* P01081B *)
  6026  14   27:D     1       
  6027  14   27:D     1         VAR
  6028  14   27:D     1              UNUSEDXX : INTEGER;
  6029  14   27:D     2              UNUSEDYY : INTEGER;
  6030  14   27:D     3              
  6031  14   27:0     0         BEGIN
  6032  14   27:1     0           MAZEX := RANDOM MOD 20;
  6033  14   27:1     9           MAZEY := RANDOM MOD 20;
  6034  14   27:1    18           WHILE (RANDOM MOD 100) < 30 DO
  6035  14   27:2    29             MAZELEV := MAZELEV + 1;
  6036  14   27:1    36           WHILE (RANDOM MOD 100) < 10 DO
  6037  14   27:2    47             MAZELEV := MAZELEV + 1;
  6038  14   27:1    54           IF MAZELEV >= SCNTOC.RECPERDK[ ZMAZE] THEN
  6039  14   27:2    65             MAZELEV := 1;
  6040  14   27:1    68           IF MAZELEV = 0 THEN
  6041  14   27:2    73             XGOTO := XCHK4WIN
  6042  14   27:1    73           ELSE
  6043  14   27:2    79             XGOTO := XNEWMAZE;
  6044  14   27:1    83           EXITCOMB
  6045  14   27:0    83         END;
  6046  14   27:0   102         
  6047  14   27:0   102         
  6048  14   28:D     1       PROCEDURE DOPRIEST;  (* P01081C *)
  6049  14   28:D     1       
  6050  14   28:D     1         VAR
  6051  14   28:D     1              GROUPI : INTEGER;
  6052  14   28:D     2       
  6053  14   28:0     0         BEGIN
  6054  14   28:1     0           IF SPELL = KALKI THEN
  6055  14   28:2     9             MODAC( 0, 1, 0, PARTYCNT - 1);
  6056  14   28:1    17           IF SPELL = DIOS THEN
  6057  14   28:2    26             DOHEAL( 0, CASTGR, 1, 8);
  6058  14   28:1    34           IF SPELL = BADIOS THEN
  6059  14   28:2    43             DOHITS( CASTGR, CASTI, 1, 8);
  6060  14   28:1    53           IF SPELL = MILWA THEN
  6061  14   28:2    62             LIGHT := LIGHT + 15 + (RANDOM MOD 15);
  6062  14   28:1    78           IF SPELL = PORFIC THEN
  6063  14   28:2    87             MODAC( 0, 4, BATI, BATI);
  6064  14   28:1    97           IF SPELL = MATU THEN
  6065  14   28:2   106             MODAC( 0, 2, 0, PARTYCNT - 1);
  6066  14   28:1   114           IF SPELL = MANIFO THEN
  6067  14   28:2   123             DOHOLD;
  6068  14   28:1   125           IF SPELL = MONTINO THEN
  6069  14   28:2   134             DOSILENC;
  6070  14   28:1   136           IF SPELL = LOMILWA THEN
  6071  14   28:2   145             LIGHT := 32000;
  6072  14   28:1   151           IF SPELL = DIALKO THEN
  6073  14   28:2   160             BEGIN
  6074  14   28:3   160               DSPNAMES( 0, CASTGR);
  6075  14   28:3   166               IF (BATTLERC[ 0].A.TEMP04[ CASTGR].STATUS = PLYZE) OR
  6076  14   28:3   183                  (BATTLERC[ 0].A.TEMP04[ CASTGR].STATUS = ASLEEP) THEN
  6077  14   28:4   203                 BEGIN
  6078  14   28:5   203                   BATTLERC[ 0].A.TEMP04[ CASTGR].STATUS := OK;
  6079  14   28:5   221                   CENTSTR( COMB1WIN, 'IS CURED!')
  6080  14   28:4   236                 END
  6081  14   28:3   239               ELSE
  6082  14   28:4   241                 CENTSTR( COMB1WIN, 'IS NOT HELPED!');
  6083  14   28:2   264             END;
  6084  14   28:1   264           IF SPELL = LATUMAPI THEN
  6085  14   28:2   273             BEGIN
  6086  14   28:3   273               FOR GROUPI := 1 TO 4 DO
  6087  14   28:4   284                 BATTLERC[ BASE04].A.IDENTIFI := TRUE;
  6088  14   28:3   300               IDMONSTR := 32767
  6089  14   28:2   300             END;
  6090  14   28:1   306           IF SPELL = BAMATU THEN
  6091  14   28:2   315             MODAC( 0, 4, 0, PARTYCNT - 1);
  6092  14   28:1   323           IF SPELL = DIAL THEN
  6093  14   28:2   332             DOHEAL( 0, CASTGR, 2, 8);
  6094  14   28:1   340           IF SPELL = BADIAL THEN
  6095  14   28:2   349             DOHITS( CASTGR, CASTI, 2, 8);
  6096  14   28:1   359           IF SPELL = LATUMOFI THEN
  6097  14   28:2   368             BEGIN
  6098  14   28:3   368               DSPNAMES( 0, CASTGR);
  6099  14   28:3   374               CENTSTR( COMB1WIN, 'IS UNPOISONED!');
  6100  14   28:3   397               CHARACTR[ CASTGR].LOSTXYL.POISNAMT[ 1] := 0
  6101  14   28:2   411             END;
  6102  14   28:1   413           IF SPELL = MAPORFIC THEN
  6103  14   28:2   422             ACMOD2 := 2;
  6104  14   28:1   426           IF SPELL = DIALMA THEN
  6105  14   28:2   435             DOHEAL( 0, CASTGR, 3, 8);
  6106  14   28:1   443           IF SPELL = BADIALMA THEN
  6107  14   28:2   452             DOHITS( CASTGR, CASTI, 3, 8);
  6108  14   28:1   462           IF SPELL = LITOKAN THEN
  6109  14   28:2   471             HITGROUP( CASTGR, 3, 8, 1);
  6110  14   28:1   479           IF SPELL = KANDI THEN
  6111  14   28:2   488             DODISRUP;
  6112  14   28:1   490           IF SPELL = DI THEN
  6113  14   28:2   499             DODISRUP;
  6114  14   28:1   501           IF SPELL = BADI THEN
  6115  14   28:2   510             DOSLAIN( CASTGR, CASTI);
  6116  14   28:1   518           IF SPELL = LORTO THEN
  6117  14   28:2   527             HITGROUP( CASTGR, 6, 6, 0);
  6118  14   28:1   535           IF SPELL = MADI THEN
  6119  14   28:2   544             BEGIN
  6120  14   28:3   544               BATTLERC[ 0].A.TEMP04[ CASTGR].HPLEFT :=
  6121  14   28:3   560                 CHARACTR[ CASTGR].HPMAX;
  6122  14   28:3   570               IF BATTLERC[ 0].A.TEMP04[ CASTGR].STATUS < DEAD THEN
  6123  14   28:4   589                 BATTLERC[ 0].A.TEMP04[ CASTGR].STATUS := OK;
  6124  14   28:3   607               CHARACTR[ CASTGR].LOSTXYL.POISNAMT[ 1] := 0;
  6125  14   28:3   623               DOHEAL( 0, CASTGR, 1, 1)
  6126  14   28:2   629             END;
  6127  14   28:1   631           IF SPELL = MABADI THEN
  6128  14   28:2   640             BREATHDM( CASTGR, CASTI, 
  6129  14   28:2   646                       BATTLERC[ CASTGR].A.TEMP04[ CASTI].HPLEFT -
  6130  14   28:2   663                        (RANDOM MOD 8) - 1);
  6131  14   28:1   675           IF SPELL = LOKTOFEI THEN
  6132  14   28:2   684             SLOKTOFE;
  6133  14   28:1   686           IF SPELL = MALIKTO THEN
  6134  14   28:2   695             FOR GROUPI := 1 TO 4 DO
  6135  14   28:3   706               HITGROUP( GROUPI, 12, 6, 0);
  6136  14   28:1   719           IF SPELL = KADORTO THEN
  6137  14   28:2   728             DODISRUP
  6138  14   28:0   728         END;
  6139  14   28:0   746         
  6140  14   28:0   746         
  6141  14   29:D     1       PROCEDURE DOMAGE;  (* P01081D *)
  6142  14   29:D     1       
  6143  14   29:D     1         VAR
  6144  14   29:D     1              GROUPI : INTEGER;  (* MULTIPLE USES *)
  6145  14   29:D     2       
  6146  14   29:0     0         BEGIN
  6147  14   29:1     0           IF SPELL = HALITO THEN
  6148  14   29:2     9             DOHITS( CASTGR, CASTI, 1, 8);
  6149  14   29:1    19           IF SPELL = MOGREF THEN
  6150  14   29:2    28             MODAC( 0, 2, BATI, BATI);
  6151  14   29:1    38           IF SPELL = KATINO THEN
  6152  14   29:2    47             DOSLEPT;
  6153  14   29:1    49           IF SPELL = DILTO THEN
  6154  14   29:2    58             MODAC( CASTGR, -2, 0, BATTLERC[ CASTGR].A.ALIVECNT - 1);
  6155  14   29:1    78           IF SPELL = SOPIC THEN
  6156  14   29:2    87             MODAC( 0, 4, BATI, BATI);
  6157  14   29:1    97           IF SPELL = MAHALITO THEN
  6158  14   29:2   106             HITGROUP( CASTGR, 4, 6, 1);
  6159  14   29:1   114           IF SPELL = MOLITO THEN
  6160  14   29:2   123             HITGROUP( CASTGR, 3, 6, 0);
  6161  14   29:1   131           IF SPELL = MORLIS THEN
  6162  14   29:2   140             MODAC( CASTGR, -3, 0, BATTLERC[ CASTGR].A.ALIVECNT - 1);
  6163  14   29:1   160           IF SPELL = DALTO THEN
  6164  14   29:2   169             HITGROUP( CASTGR, 6, 6, 2);
  6165  14   29:1   177           IF SPELL = LAHALITO THEN
  6166  14   29:2   186             HITGROUP( CASTGR, 6, 6, 1);
  6167  14   29:1   194           IF SPELL = MAMORLIS THEN
  6168  14   29:2   203             FOR GROUPI := 1 TO 4 DO
  6169  14   29:3   214               MODAC( GROUPI, -3, 1, BATTLERC[ GROUPI].A.ALIVECNT);
  6170  14   29:1   235           IF SPELL = MAKANITO THEN
  6171  14   29:2   244             SMAKANIT;
  6172  14   29:1   246           IF SPELL = MADALTO THEN
  6173  14   29:2   255             HITGROUP( CASTGR, 8, 8, 2);
  6174  14   29:1   263           IF SPELL = LAKANITO THEN
  6175  14   29:2   272             FOR GROUPI := 0 TO BATTLERC[ CASTGR].A.ALIVECNT - 1 DO
  6176  14   29:3   294               IF BATTLERC[ CASTGR].A.TEMP04[ GROUPI].STATUS < DEAD THEN
  6177  14   29:4   313                 ISISNOT( CASTGR, GROUPI, 6 * BATTLERC[ CASTGR].B.HPREC.LEVEL,
  6178  14   29:4   330                          'SMOTHERED', 2);
  6179  14   29:1   352           IF SPELL = ZILWAN THEN
  6180  14   29:2   361             IF BATTLERC[ CASTGR].B.CLASS = 10 THEN
  6181  14   29:3   376               DOHITS( CASTGR, CASTI, 10, 200);
  6182  14   29:1   388           IF SPELL = MASOPIC THEN
  6183  14   29:2   397             MODAC( 0, 4, 0, PARTYCNT - 1);
  6184  14   29:1   405           IF SPELL = HAMAN THEN
  6185  14   29:2   414             HAMMAHAM( 6);
  6186  14   29:1   417           IF SPELL = MALOR THEN
  6187  14   29:2   426             SMALOR;
  6188  14   29:1   428           IF SPELL = MAHAMAN THEN
  6189  14   29:2   437             HAMMAHAM( 7);
  6190  14   29:1   440           IF SPELL = TILTOWAIT THEN
  6191  14   29:2   449             IF BATG = 0 THEN
  6192  14   29:3   456               FOR GROUPI := 1 TO 4 DO
  6193  14   29:4   467                 HITGROUP( GROUPI, 10, 15, 0)
  6194  14   29:2   471             ELSE
  6195  14   29:3   482               HITGROUP( 0, 10, 15, 0)
  6196  14   29:0   486         END;
  6197  14   29:0   506         
  6198  14   29:0   506         
  6199  14   30:D     1       PROCEDURE EXITCAST( EXITSTR: STRING);  (* P01081E *)
  6200  14   30:D    43       
  6201  14   30:0     0         BEGIN
  6202  14   30:1     0           CENTSTR( COMB1WIN, EXITSTR);
  6203  14   30:1    13           EXIT( CASTASPE)
  6204  14   30:0    17         END;
  6205  14   30:0    30         
  6206  14   30:0    30         
  6207  14   31:D     1       PROCEDURE DOBREATH;  (* P01081F *)
  6208  14   31:D     1       
  6209  14   31:D     1         VAR
  6210  14   31:D     1              MP01 : INTEGER;
  6211  14   31:D     2              MP02 : INTEGER;
  6212  14   31:D     3              MP03 : INTEGER;
  6213  14   31:D     4       
  6214  14   31:0     0         BEGIN
  6215  14   31:1     0           CENTSTR( COMB1WIN, 'BREATHES!');
  6216  14   31:1    18           FOR MP03 := 0 TO PARTYCNT - 1 DO
  6217  14   31:2    31             BEGIN
  6218  14   31:3    31               IF BATTLERC[ 0].A.TEMP04[ MP03].STATUS < DEAD THEN
  6219  14   31:4    48                 BEGIN
  6220  14   31:5    48                   MP02 := BATTLERC[ BATG].A.TEMP04[ BATI].HPLEFT DIV 2;
  6221  14   31:5    69                   IF (RANDOM MOD 20) >= CHARACTR[ MP03].LUCKSKIL[ 3] THEN
  6222  14   31:6    91                     MP02 := (MP02 + 1) DIV 2;
  6223  14   31:5    98                   IF CHARACTR[ MP03].WEPVSTY3[ 1][ BATTLERC[ BATG].B.BREATHE] 
  6224  14   31:5   123                       THEN
  6225  14   31:6   126                     MP02 := (MP02 + 1) DIV 2;
  6226  14   31:5   133                   BREATHDM( 0, MP03, MP02)
  6227  14   31:4   136                 END
  6228  14   31:2   138             END;
  6229  14   31:1   145           EXIT( CASTASPE)
  6230  14   31:0   149         END;
  6231  14   31:0   164     
  6232  14   31:0   164     
  6233  14    1:0     0       BEGIN  (* CASTASPE P010801 *)
  6234  14    1:1     0         CLEARWIN( COMB1WIN, TRUE);
  6235  14    1:1     7         DSPNAMES( BATG, BATI);
  6236  14    1:1    15         IF ATTACKTY = -3 THEN
  6237  14    1:2    23           DOBREATH;
  6238  14    1:1    25         CENTSTR( COMB1WIN, 'CASTS A SPELL');
  6239  14    1:1    47         IF BATTLERC[ BATG].A.TEMP04[ BATI].INAUDCNT > 0 THEN
  6240  14    1:2    68           EXITCAST( 'WHICH FAILS TO BECOME AUDIBLE!');
  6241  14    1:1   103         IF FIZZLES > 0 THEN
  6242  14    1:2   110           EXITCAST( 'WHICH FIZZLES OUT');
  6243  14    1:1   132         IF BATG = 0 THEN
  6244  14    1:2   139           BEGIN
  6245  14    1:3   139             PRCNTMOD := BATTLERC[ 0].A.TEMP04[ BATI].DRAIN2LV;
  6246  14    1:3   156             IF BATTLERC[ 1].A.ENEMYID = SCNTOC.RECPERDK[ ZENEMY] - 1 THEN
  6247  14    1:4   176               EXITCAST( 'WHICH IS NEUTRALIZED!');
  6248  14    1:3   202             CASTGR := BATTLERC[ 0].A.TEMP04[ BATI].VICTIM;
  6249  14    1:3   219             IF (CASTGR > 0) AND (CASTGR < 5) THEN
  6250  14    1:4   228               IF BATTLERC[ CASTGR].A.ALIVECNT > 0 THEN
  6251  14    1:5   240                 CASTI := BATI MOD BATTLERC[ CASTGR].A.ALIVECNT;
  6252  14    1:3   254             SPELL := BATTLERC[ 0].A.TEMP04[ BATI].SPELLHSH;
  6253  14    1:2   271           END
  6254  14    1:1   271         ELSE
  6255  14    1:2   273           BEGIN
  6256  14    1:3   273             PRCNTMOD := BATTLERC[ BATG].A.TEMP04[ BATI].DRAIN2LV;
  6257  14    1:3   292             CASTGR := 0;
  6258  14    1:3   295             CASTI  := BATTLERC[ BATG].A.TEMP04[ BATI].VICTIM;
  6259  14    1:3   314             SPELL  := BATTLERC[ BATG].A.TEMP04[ BATI].SPELLHSH
  6260  14    1:2   330           END;
  6261  14    1:1   333         DOMAGE;
  6262  14    1:1   335         DOPRIEST
  6263  14    1:0   335       END;   (* CASTASPE P010801 *)
  6264  14    1:0   352       
  6265  14    1:0   352       
  6266  14    1:0   352     
  6267  14    1:0   352 (*$I WIZ3B:COMBAT4   *)
  6267  14    1:0   352 (*$I WIZ3B:COMBAT5   *)
  6268  15    1:D     1     SEGMENT PROCEDURE SWINGASW;  (* P010901 *)
  6269  15    1:D     1     
  6270  15    1:D     1       VAR
  6271  15    1:D     1            TEMPSTR : STRING[ 20];
  6272  15    1:D    12     
  6273  15    1:D    12     
  6274  15    2:D     1       PROCEDURE HITSMSGS( HITS:   INTEGER;  (* P010902 *)
  6275  15    2:D     2                           DAMAGE: INTEGER);
  6276  15    2:D     3       
  6277  15    2:0     0         BEGIN
  6278  15    2:1     0           IF DAMAGE = 0 THEN
  6279  15    2:2     5             CENTSTR( COMB1WIN, 'AND MISSES!')
  6280  15    2:1    22           ELSE
  6281  15    2:2    27             BEGIN
  6282  15    2:3    27               PRINTSTR( COMB1WIN, '   AND HITS ');
  6283  15    2:3    48               IF HITS = 1 THEN
  6284  15    2:4    53                 PRINTSTR( COMB1WIN, 'ONLY ONCE')
  6285  15    2:3    68               ELSE
  6286  15    2:4    73                 BEGIN
  6287  15    2:5    73                   PRINTNUM( COMB1WIN, HITS, 3);
  6288  15    2:5    81                   PRINTSTR( COMB1WIN, ' TIMES')
  6289  15    2:4    93                 END;
  6290  15    2:3    96               PRINTSTR( COMB1WIN, ' FOR ');
  6291  15    2:3   110               PRINTNUM( COMB1WIN, DAMAGE, 3);
  6292  15    2:3   118               PRINTSTR( COMB1WIN, ' DAMAGE');
  6293  15    2:3   134               PRINTCR(  COMB1WIN)
  6294  15    2:2   137             END
  6295  15    2:0   140         END;
  6296  15    2:0   152         
  6297  15    2:0   152         
  6298  15    3:D     1       PROCEDURE PRNAMACT( BATGX : INTEGER;  (* P010903 *)
  6299  15    3:D     2                           BATIX : INTEGER;
  6300  15    3:D     3                           ASTR  : STRING);
  6301  15    3:D    45                          
  6302  15    3:D    45         VAR
  6303  15    3:D    45              NAMESTR : STRING;
  6304  15    3:D    86       
  6305  15    3:0     0         BEGIN
  6306  15    3:1     0           IF BATGX = 0 THEN
  6307  15    3:2    10             NAMESTR := CHARACTR[ BATIX].NAME
  6308  15    3:1    17           ELSE IF BATTLERC[ BATGX].A.IDENTIFI THEN
  6309  15    3:3    31             NAMESTR := BATTLERC[ BATGX].B.NAME
  6310  15    3:2    40           ELSE
  6311  15    3:3    46             NAMESTR := BATTLERC[ BATGX].B.NAMEUNK;
  6312  15    3:3    59               
  6313  15    3:1    59           CENTSTR( COMB1WIN, CONCAT( NAMESTR, ' ', TEMPSTR, ' ', ASTR))
  6314  15    3:0   114         END;
  6315  15    3:0   130         
  6316  15    3:0   130         
  6317  15    4:D     1       PROCEDURE ARMATTK;  (* P010904 *)
  6318  15    4:D     1       
  6319  15    4:0     0         BEGIN
  6320  15    4:1     0           CASE (RANDOM MOD 4) OF
  6321  15    4:1     9             0:  TEMPSTR := 'SWINGS';
  6322  15    4:1    25             1:  TEMPSTR := 'THRUSTS';
  6323  15    4:1    42             2:  TEMPSTR := 'STABS';
  6324  15    4:1    57             3:  TEMPSTR := 'SLASHES';
  6325  15    4:1    74           END
  6326  15    4:0    90         END;
  6327  15    4:0   102         
  6328  15    4:0   102         
  6329  15    5:D     1       PROCEDURE PRNAME( GROUPI: INTEGER;  (* P010905 *)
  6330  15    5:D     2                         CHARX:  INTEGER);
  6331  15    5:D     3                          
  6332  15    5:0     0         BEGIN
  6333  15    5:1     0           IF GROUPI = 0 THEN
  6334  15    5:2     5             CENTSTR( COMB1WIN, CHARACTR[ CHARX].NAME)
  6335  15    5:1    13           ELSE IF BATTLERC[ GROUPI].A.IDENTIFI THEN
  6336  15    5:3    28             CENTSTR( COMB1WIN, BATTLERC[ GROUPI].B.NAME)
  6337  15    5:2    40           ELSE
  6338  15    5:3    45             CENTSTR( COMB1WIN, BATTLERC[ GROUPI].B.NAMEUNK)
  6339  15    5:0    57         END;
  6340  15    5:0    72         
  6341  15    5:0    72         
  6342  15    6:D     3       FUNCTION CALCHP( AHPREC: THPREC) : INTEGER;  (* P010906 *)
  6343  15    6:D     7                            
  6344  15    6:D     7         VAR
  6345  15    6:D     7              HITPTS : INTEGER;
  6346  15    6:D     8              
  6347  15    6:0     0         BEGIN
  6348  15    6:1     0           HITPTS := 0;
  6349  15    6:1     8           WHILE AHPREC.LEVEL > 0 DO
  6350  15    6:2    13             BEGIN
  6351  15    6:3    13               HITPTS := HITPTS + (RANDOM MOD AHPREC.HPFAC) + 1;
  6352  15    6:3    26               AHPREC.LEVEL := AHPREC.LEVEL - 1
  6353  15    6:2    27             END;
  6354  15    6:1    33           CALCHP := HITPTS + AHPREC.HPMINAD
  6355  15    6:0    34         END;
  6356  15    6:0    52         
  6357  15    6:0    52         
  6358  15    7:D     1       PROCEDURE DOFIGHT;  (* P010907 *)
  6359  15    7:D     1       
  6360  15    8:D     1         PROCEDURE DAM2ME;  (* P010908 *)
  6361  15    8:D     1         
  6362  15    8:D     1           CONST
  6363  15    8:D     1                LOWTONE = 31;
  6364  15    8:D     1         
  6365  15    8:D     1           VAR
  6366  15    8:D     1                HPCALCPC : INTEGER;
  6367  15    8:D     2                RECSI    : INTEGER;
  6368  15    8:D     3                MYVICTIM : INTEGER;
  6369  15    8:D     4                HPDAMAGE : INTEGER;
  6370  15    8:D     5                HITSCNT  : INTEGER;
  6371  15    8:D     6         
  6372  15    8:D     6         
  6373  15    9:D     1           PROCEDURE CASEDAMG;  (* P010909 *)
  6374  15    9:D     1           
  6375  15   10:D     1             PROCEDURE DRAINLEV;  (* P01090A *)
  6376  15   10:D     1             
  6377  15   10:0     0               BEGIN 
  6378  15   10:1     0                 IF DRAINED[ MYVICTIM] OR
  6379  15   10:1    10                    CHARACTR[ MYVICTIM].WEPVSTY3[ 1][ 4] THEN
  6380  15   10:2    30                   EXIT( DRAINLEV);
  6381  15   10:1    34                 CHARACTR[ MYVICTIM].CHARLEV := CHARACTR[ MYVICTIM].CHARLEV -
  6382  15   10:1    52                   BATTLERC[ BATG].B.DRAINAMT;
  6383  15   10:1    66                 BATTLERC[ 0].A.TEMP04[ MYVICTIM].DRAIN2LV :=
  6384  15   10:1    82                   CHARACTR[ MYVICTIM].CHARLEV;
  6385  15   10:1    92                 CLRRECT(  COMB1WIN, 0, 3, 38, 1);
  6386  15   10:1   102                 MVCURSOR( COMB1WIN, 0, 3);
  6387  15   10:1   110                 PRINTSTR( COMB1WIN, '        ');
  6388  15   10:1   127                 PRINTNUM( COMB1WIN, BATTLERC[ BATG].B.DRAINAMT, 2);
  6389  15   10:1   146                 IF BATTLERC[ BATG].B.DRAINAMT = 1 THEN
  6390  15   10:2   162                   PRINTSTR( COMB1WIN, '  LEVEL  IS')
  6391  15   10:1   179                 ELSE
  6392  15   10:2   184                   PRINTSTR( COMB1WIN, ' LEVELS ARE');
  6393  15   10:1   204                 PRINTSTR( COMB1WIN, ' DRAINED!');
  6394  15   10:1   222                 IF CHARACTR[ MYVICTIM].CHARLEV < 1 THEN
  6395  15   10:2   235                   BEGIN
  6396  15   10:3   235                     CHARACTR[ MYVICTIM].CHARLEV := 0;
  6397  15   10:3   246                     BATTLERC[ 0].A.TEMP04[ MYVICTIM].HPLEFT := 0;
  6398  15   10:3   264                     BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS := LOST
  6399  15   10:2   280                   END
  6400  15   10:1   282                 ELSE
  6401  15   10:2   284                   BEGIN
  6402  15   10:3   284                     CHARACTR[ MYVICTIM].HPMAX := 
  6403  15   10:3   293                       (CHARACTR[ MYVICTIM].HPMAX DIV
  6404  15   10:3   302                        CHARACTR[ MYVICTIM].MAXLEVAC) *
  6405  15   10:3   312                                                    CHARACTR[ MYVICTIM].CHARLEV;
  6406  15   10:3   323                     CHARACTR[ MYVICTIM].MAXLEVAC :=
  6407  15   10:3   332                                                    CHARACTR[ MYVICTIM].CHARLEV;
  6408  15   10:3   342                     IF CHARACTR[ MYVICTIM].HPLEFT >
  6409  15   10:3   351                                                  CHARACTR[ MYVICTIM].HPMAX THEN
  6410  15   10:4   363                       CHARACTR[ MYVICTIM].HPLEFT := CHARACTR[ MYVICTIM].HPMAX;
  6411  15   10:3   382                     DRAINED[ MYVICTIM] := TRUE
  6412  15   10:2   391                   END;
  6413  15   10:1   393                 PAUSE1
  6414  15   10:0   393               END;   (* DRAINLEV *)
  6415  15   10:0   408               
  6416  15   10:0   408               
  6417  15   11:D     1             PROCEDURE RESULT( ATTK0123: INTEGER;  (* P01090B *)
  6418  15   11:D     2                               STONFLAG: INTEGER;
  6419  15   11:D     3                               POISSTON: INTEGER;
  6420  15   11:D     4                               DAMSTR:   STRING);
  6421  15   11:D    46             
  6422  15   11:D    46               VAR
  6423  15   11:D    46                    CHANCBAD : INTEGER;
  6424  15   11:D    47             
  6425  15   11:0     0               BEGIN
  6426  15   11:1     0                 IF (RANDOM MOD 20) >
  6427  15   11:1    12                                   CHARACTR[ MYVICTIM].LUCKSKIL[ STONFLAG] THEN
  6428  15   11:2    29                   EXIT( RESULT);
  6429  15   11:1    33                 IF ATTK0123 = 3 THEN
  6430  15   11:2    38                   BEGIN
  6431  15   11:3    38                     CHANCBAD := BATTLERC[ BATG].B.HPREC.LEVEL * 2;
  6432  15   11:3    53                     IF CHANCBAD > 50 THEN
  6433  15   11:4    59                       CHANCBAD := 50;
  6434  15   11:3    62                     IF (RANDOM MOD 100) > CHANCBAD THEN
  6435  15   11:4    74                       EXIT( RESULT)
  6436  15   11:2    78                   END;
  6437  15   11:1    78                 IF POISSTON > 0 THEN
  6438  15   11:2    83                   IF CHARACTR[ MYVICTIM].WEPVSTY3[ 1][ POISSTON] THEN
  6439  15   11:3   102                     EXIT( RESULT);
  6440  15   11:1   106                 IF CHARACTR[ MYVICTIM].STATUS >= DEAD THEN
  6441  15   11:2   119                   EXIT( RESULT);
  6442  15   11:1   123                 CLRRECT( COMB1WIN, 0, 3, 38, 1);
  6443  15   11:1   133                 MVCURSOR( COMB1WIN, 0, 3);
  6444  15   11:1   141                 TEMPSTR := 'IS ';
  6445  15   11:1   152                 PRNAMACT( 0, MYVICTIM, DAMSTR);
  6446  15   11:1   160                 CASE ATTK0123 OF
  6447  15   11:1   163                 
  6448  15   11:1   163                   0:  IF BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS < STONED THEN
  6449  15   11:3   182                         BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS := STONED;
  6450  15   11:3   202                 
  6451  15   11:1   202                   1:  CHARACTR[ MYVICTIM].LOSTXYL.POISNAMT[ 1] := 1;
  6452  15   11:1   220                      
  6453  15   11:1   220                   2:  IF BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS < PLYZE THEN
  6454  15   11:3   239                         BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS := PLYZE;
  6455  15   11:3   259                        
  6456  15   11:1   259                   3:  BEGIN
  6457  15   11:3   259                         BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS := DEAD;
  6458  15   11:3   277                         BATTLERC[ 0].A.TEMP04[ MYVICTIM].HPLEFT := 0
  6459  15   11:2   293                       END
  6460  15   11:1   295                 END;
  6461  15   11:1   312                 PAUSE1
  6462  15   11:0   312               END;  (* RESULT *)
  6463  15   11:0   330             
  6464  15   11:0   330             
  6465  15    9:0     0             BEGIN  (* CASEDAMG *)
  6466  15    9:1     0               WITH BATTLERC[ BATG].B DO
  6467  15    9:2    13                 BEGIN
  6468  15    9:3    13                   IF SPPC[ 1] THEN
  6469  15    9:4    23                     RESULT( 1, 0, 3, 'POISONED');
  6470  15    9:3    39                   IF SPPC[ 2] THEN
  6471  15    9:4    49                     RESULT( 2, 0, 0, 'PARALYZED');
  6472  15    9:3    66                   IF SPPC[ 0] THEN
  6473  15    9:4    76                     RESULT( 0, 1, 5, 'STONED');
  6474  15    9:4    90                     
  6475  15    9:3    90                   IF DRAINAMT > 0 THEN
  6476  15    9:4    97                     DRAINLEV;
  6477  15    9:4    99                     
  6478  15    9:3    99                   IF SPPC[ 3] THEN
  6479  15    9:4   109                     RESULT( 3, 0, 0, 'CRITICALLY HIT')
  6480  15    9:2   129                 END
  6481  15    9:0   131             END;  (* CASEDAMG *)
  6482  15    9:0   144             
  6483  15    9:0   144             
  6484  15   12:D     1           PROCEDURE ATTKSTRG;  (* P01090C *)
  6485  15   12:D     1           
  6486  15   13:D     1             PROCEDURE RIPBITCL;  (* P01090D *)
  6487  15   13:D     1             
  6488  15   13:0     0               BEGIN
  6489  15   13:1     0                 CASE (RANDOM MOD 3) OF
  6490  15   13:1     9                   0:  TEMPSTR := 'RIPS';
  6491  15   13:1    23                   1:  TEMPSTR := 'BITES';
  6492  15   13:1    38                   2:  TEMPSTR := 'CLAWS';
  6493  15   13:1    53                 END
  6494  15   13:0    66               END;
  6495  15   13:0    78               
  6496  15   13:0    78               
  6497  15   14:D     1             PROCEDURE ARMRIP;  (* P01090E *)
  6498  15   14:D     1             
  6499  15   14:0     0               BEGIN
  6500  15   14:1     0                 IF (RANDOM MOD 2) = 1 THEN
  6501  15   14:2    11                   RIPBITCL
  6502  15   14:1    11                 ELSE
  6503  15   14:2    15                   ARMATTK
  6504  15   14:0    15               END;
  6505  15   14:0    30             
  6506  15   14:0    30             
  6507  15   12:0     0             BEGIN (* ATTKSTRG *)
  6508  15   12:1     0               CASE BATTLERC[ BATG].B.CLASS OF
  6509  15   12:1    13                 0, 1, 2, 3, 4, 5, 10, 11: ARMATTK;
  6510  15   12:1    17                             6, 8, 12, 13: RIPBITCL;
  6511  15   12:1    21                                     7, 9: ARMRIP;
  6512  15   12:1    25               END
  6513  15   12:0    60             END;
  6514  15   12:0    72           
  6515  15   12:0    72           
  6516  15    8:0     0           BEGIN (* DAM2ME *)
  6517  15    8:1     0             IF BATTLERC[ 0].A.TEMP04[ VICTIM].STATUS >= DEAD THEN
  6518  15    8:2    19               EXIT( DAM2ME);
  6519  15    8:1    23             ATTKSTRG;
  6520  15    8:1    25             PRNAMACT( BATG, BATI, 'AT');
  6521  15    8:1    38             CENTSTR( COMB1WIN, CHARACTR[ VICTIM].NAME);
  6522  15    8:1    51             MYVICTIM := VICTIM;
  6523  15    8:1    56             IF BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS < DEAD THEN
  6524  15    8:2    73               BEGIN
  6525  15    8:3    73                 HPCALCPC :=
  6526  15    8:3    73                   20
  6527  15    8:3    73                   - CHARACTR[ MYVICTIM].ARMORCL 
  6528  15    8:3    79                   - BATTLERC[ BATG].B.HPREC.LEVEL
  6529  15    8:3    91                   + ACMOD2
  6530  15    8:3    94                   + BATTLERC[ 0].A.TEMP04[ MYVICTIM].ARMORCL
  6531  15    8:3   110                   + 2 * (ORD( BATTLERC[ BATG].A.TEMP04[ MYVICTIM].SPELLHSH = 0));
  6532  15    8:3   134               
  6533  15    8:3   134                 IF HPCALCPC < 1 THEN
  6534  15    8:4   139                   HPCALCPC := 1
  6535  15    8:3   139                 ELSE
  6536  15    8:4   144                   IF HPCALCPC > 19 THEN
  6537  15    8:5   149                     HPCALCPC := 19;
  6538  15    8:3   152                 HPDAMAGE := 0;
  6539  15    8:3   155                 HITSCNT := 0;
  6540  15    8:3   158                 FOR RECSI := 1 TO BATTLERC[ BATG].B.RECSN DO
  6541  15    8:4   179                   IF (RANDOM MOD 20) >= HPCALCPC THEN
  6542  15    8:5   190                     BEGIN
  6543  15    8:6   190                       HPDAMAGE := HPDAMAGE +
  6544  15    8:6   191                        CALCHP( BATTLERC[ BATG].B.RECS[ RECSI]);
  6545  15    8:6   214                       HITSCNT := HITSCNT + 1
  6546  15    8:5   215                     END;
  6547  15    8:3   226                 IF BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS = ASLEEP THEN
  6548  15    8:4   243                   HPDAMAGE := HPDAMAGE * 2;
  6549  15    8:3   248                 HITSMSGS( HITSCNT, HPDAMAGE);
  6550  15    8:3   252                 IF HPDAMAGE <> 0 THEN
  6551  15    8:4   257                   CASEDAMG;
  6552  15    8:3   259                 BATTLERC[ 0].A.TEMP04[ MYVICTIM].HPLEFT :=
  6553  15    8:3   273                   BATTLERC[ 0].A.TEMP04[ MYVICTIM].HPLEFT - HPDAMAGE;
  6554  15    8:3   289                 IF BATTLERC[ 0].A.TEMP04[ MYVICTIM].HPLEFT <= 0 THEN
  6555  15    8:4   306                   BEGIN
  6556  15    8:5   306                     CLRRECT( COMB1WIN, 0, 3, 38, 1);
  6557  15    8:5   316                     MVCURSOR( COMB1WIN, 0, 3);
  6558  15    8:5   324                     CENTSTR( COMB1WIN, CONCAT( CHARACTR[ MYVICTIM].NAME,
  6559  15    8:5   343                                                ' IS SLAIN!'));
  6560  15    8:5   365                     FOR HITSCNT := 0 TO 10 DO
  6561  15    8:6   376                       PRINTCHR( MAINWIN, CHR( LOWTONE));
  6562  15    8:5   390                     BATTLERC[ 0].A.TEMP04[ MYVICTIM].HPLEFT := 0;
  6563  15    8:5   406                     IF BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS < DEAD THEN
  6564  15    8:6   423                       BATTLERC[ 0].A.TEMP04[ MYVICTIM].STATUS := DEAD
  6565  15    8:4   437                   END
  6566  15    8:2   439               END
  6567  15    8:0   439           END;  (* DAM2ME *)
  6568  15    8:0   460           
  6569  15    8:0   460           
  6570  15   15:D     1         PROCEDURE DAM2ENMY;  (* P01090F *)
  6571  15   15:D     1         
  6572  15   15:D     1           VAR
  6573  15   15:D     1                HPCALCPC : INTEGER;
  6574  15   15:D     2                TEMPX    : INTEGER;  (* MULTIPLE USES *)
  6575  15   15:D     3                SINGLEX  : INTEGER;
  6576  15   15:D     4                HPDAMAGE : INTEGER;
  6577  15   15:D     5                HITSCNT  : INTEGER;
  6578  15   15:D     6         
  6579  15   15:0     0           BEGIN
  6580  15   15:1     0             SINGLEX := BATI MOD BATTLERC[ VICTIM].A.ALIVECNT;
  6581  15   15:1    16             IF BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].STATUS < DEAD THEN
  6582  15   15:2    35               BEGIN
  6583  15   15:3    35                 ARMATTK;
  6584  15   15:3    37                 PRNAMACT( 0, BATI, 'AT A');
  6585  15   15:3    50                 PRNAME( VICTIM, BATI);
  6586  15   15:3    58                 HPCALCPC := 21
  6587  15   15:3    58                               - BATTLERC[ VICTIM].B.AC
  6588  15   15:3    68                               - CHARACTR[ BATI].HPCALCMD
  6589  15   15:3    78                               + BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].ARMORCL
  6590  15   15:3    95                               - 3 * VICTIM;
  6591  15   15:3   105                 IF HPCALCPC < 1 THEN
  6592  15   15:4   110                   HPCALCPC := 1
  6593  15   15:3   110                 ELSE
  6594  15   15:4   115                   IF HPCALCPC > 19 THEN
  6595  15   15:5   120                     HPCALCPC := 19;
  6596  15   15:3   123                 IF BATTLERC[ VICTIM].A.ENEMYID =
  6597  15   15:3   133                      SCNTOC.RECPERDK[ ZENEMY] - 1 THEN
  6598  15   15:4   145                   HPCALCPC := 99;
  6599  15   15:3   148                 HPDAMAGE := 0;
  6600  15   15:3   151                 HITSCNT := 0;
  6601  15   15:3   154                 FOR TEMPX := 1 TO CHARACTR[ BATI].SWINGCNT DO
  6602  15   15:4   173                   IF (RANDOM MOD 20) >= HPCALCPC THEN
  6603  15   15:5   184                     BEGIN
  6604  15   15:6   184                       HPDAMAGE := HPDAMAGE + CALCHP( CHARACTR[ BATI].HPDAMRC);
  6605  15   15:6   201                       HITSCNT := HITSCNT + 1
  6606  15   15:5   202                     END;
  6607  15   15:3   213                 IF BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].STATUS = ASLEEP THEN
  6608  15   15:4   232                   HPDAMAGE := 2 * HPDAMAGE;
  6609  15   15:3   237                 IF CHARACTR[ BATI].WEPVSTYP[ BATTLERC[ VICTIM].B.CLASS] THEN
  6610  15   15:4   263                   HPDAMAGE := 2 * HPDAMAGE;
  6611  15   15:3   268                 HITSMSGS( HITSCNT, HPDAMAGE);
  6612  15   15:3   272                 BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].HPLEFT :=
  6613  15   15:3   288                   BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].HPLEFT - HPDAMAGE;
  6614  15   15:3   306                 IF (CHARACTR[ BATI].CRITHITM) AND (HPDAMAGE > 0) THEN
  6615  15   15:4   321                   BEGIN
  6616  15   15:5   321                     TEMPX := CHARACTR[ BATI].CHARLEV * 2;
  6617  15   15:5   334                     IF TEMPX > 50 THEN
  6618  15   15:6   339                       TEMPX := 50;
  6619  15   15:5   342                     IF (RANDOM MOD 100) < TEMPX THEN
  6620  15   15:6   353                       IF (RANDOM MOD 35) >
  6621  15   15:6   360                          BATTLERC[ VICTIM].B.HPREC.LEVEL + 10 THEN
  6622  15   15:7   376                         BEGIN
  6623  15   15:8   376                           CLRRECT( COMB1WIN, 0, 3, 38, 1);
  6624  15   15:8   386                           MVCURSOR( COMB1WIN, 0, 3);
  6625  15   15:8   394                           CENTSTR( COMB1WIN, 'A CRITICAL HIT');
  6626  15   15:8   417                           FOR TEMPX := 10 TO 15 DO
  6627  15   15:9   428                             PRINTCHR( MAINWIN, CHR( TEMPX));
  6628  15   15:8   442                           BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].HPLEFT := 0;
  6629  15   15:8   460                           PAUSE1
  6630  15   15:7   460                         END;
  6631  15   15:4   463                   END;
  6632  15   15:3   463                 IF BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].HPLEFT <= 0 THEN
  6633  15   15:4   482                   BEGIN
  6634  15   15:5   482                     CLRRECT( COMB1WIN, 0, 3, 38, 1);
  6635  15   15:5   492                     MVCURSOR (COMB1WIN, 0, 3);
  6636  15   15:5   500                     CENTSTR( COMB1WIN, CONCAT( CHARACTR[ BATI].NAME,
  6637  15   15:5   521                                                ' KILLS IT'));
  6638  15   15:5   542                     BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].HPLEFT := 0;
  6639  15   15:5   560                     BATTLERC[ VICTIM].A.TEMP04[ SINGLEX].STATUS := DEAD
  6640  15   15:4   576                   END
  6641  15   15:2   578               END
  6642  15   15:0   578           END;
  6643  15   15:0   598           
  6644  15   15:0   598           
  6645  15    7:0     0         BEGIN  (* DOFIGHT *)
  6646  15    7:1     0           IF BATG = 0 THEN
  6647  15    7:2     7             DAM2ENMY
  6648  15    7:1     7           ELSE
  6649  15    7:2    11             DAM2ME
  6650  15    7:0    11         END;
  6651  15    7:0    26         
  6652  15    7:0    26         
  6653  15   16:D     1       PROCEDURE YELLHELP;  (* P010910 *)
  6654  15   16:D     1       
  6655  15   16:D     1         VAR
  6656  15   16:D     1              YHTEMP1 : INTEGER;
  6657  15   16:D     2              YHTEMP2 : INTEGER;
  6658  15   16:D     3       
  6659  15   16:D     3       
  6660  15   17:D     1         PROCEDURE NONECOME;  (* P010911 *)
  6661  15   17:D     1         
  6662  15   17:0     0           BEGIN
  6663  15   17:1     0             CENTSTR( COMB1WIN, 'BUT NONE COMES!');
  6664  15   17:1    24             EXIT( YELLHELP)
  6665  15   17:0    28           END;
  6666  15   17:0    40         
  6667  15   17:0    40         
  6668  15   16:0     0         BEGIN  (* YELLHELP *)
  6669  15   16:1     0           CENTSTR( COMB1WIN, 'YELLS FOR HELP!');
  6670  15   16:1    24           IF BATTLERC[ BATG].A.ALIVECNT = 9 THEN
  6671  15   16:2    38             NONECOME;
  6672  15   16:1    40           IF (RANDOM MOD 200) > 10 * BATTLERC[ BATG].B.HPREC.LEVEL THEN
  6673  15   16:2    65             NONECOME;
  6674  15   16:1    67           CENTSTR( COMB1WIN, 'AND IS HEARD!');
  6675  15   16:1    89           YHTEMP2 := BATTLERC[ BATG].B.MAGSPELS;
  6676  15   16:1   103           YHTEMP1 := BATTLERC[ BATG].B.PRISPELS;
  6677  15   16:1   117           MOVELEFT( IOCACHE[
  6678  15   16:1   120                       GETREC( ZENEMY,
  6679  15   16:1   121                               BATTLERC[ BATG].A.ENEMYID,
  6680  15   16:1   131                               SIZEOF( TENEMY))],
  6681  15   16:1   139                     BATTLERC[ BATG].B,
  6682  15   16:1   151                     SIZEOF( TENEMY));
  6683  15   16:1   156           IF YHTEMP1 < BATTLERC[ BATG].B.PRISPELS THEN
  6684  15   16:2   172             BATTLERC[ BATG].B.PRISPELS :=
  6685  15   16:2   184               1 + (BATTLERC[ BATG].B.PRISPELS + YHTEMP1) DIV 2;
  6686  15   16:1   203           IF YHTEMP2 < BATTLERC[ BATG].B.MAGSPELS THEN
  6687  15   16:2   219             BATTLERC[ BATG].B.MAGSPELS :=
  6688  15   16:2   231               1 + (BATTLERC[ BATG].B.MAGSPELS + YHTEMP2) DIV 2;
  6689  15   16:1   250           YHTEMP2 := BATTLERC[ BATG].A.ALIVECNT;
  6690  15   16:1   262           BATTLERC[ BATG].A.ALIVECNT := YHTEMP2 + 1;
  6691  15   16:1   277           BATTLERC[ BATG].A.ENMYCNT := BATTLERC[ BATG].A.ENMYCNT + 1;
  6692  15   16:1   301           WITH BATTLERC[ BATG].A.TEMP04[ YHTEMP2] DO
  6693  15   16:2   317             BEGIN
  6694  15   16:3   317               AGILITY  := -1;
  6695  15   16:3   323               SPELLHSH := 0;
  6696  15   16:3   328               INAUDCNT := BATTLERC[ BATG].A.TEMP04[ BATI].INAUDCNT;
  6697  15   16:3   349               ARMORCL  := 0;
  6698  15   16:3   354               HPLEFT   := CALCHP( BATTLERC[ BATG].B.HPREC);
  6699  15   16:3   373               STATUS   := OK;
  6700  15   16:2   378             END
  6701  15   16:0   378         END;  (* YELLHELP *)
  6702  15   16:0   390         
  6703  15   16:0   390         
  6704  15   18:D     1       PROCEDURE DORUN;  (* P010912 *)
  6705  15   18:D     1       
  6706  15   18:0     0         BEGIN
  6707  15   18:1     0           CENTSTR( COMB1WIN, 'RUNS!');
  6708  15   18:1    14           BATTLERC[ BATG].A.ENMYCNT := BATTLERC[ BATG].A.ENMYCNT - 1;
  6709  15   18:1    38           WITH BATTLERC[ BATG].A.TEMP04[ BATI] DO
  6710  15   18:2    56             BEGIN
  6711  15   18:3    56               STATUS := DEAD;
  6712  15   18:3    61               HPLEFT := 0
  6713  15   18:2    64             END
  6714  15   18:0    66         END;
  6715  15   18:0    78         
  6716  15   18:0    78         
  6717  15   19:D     1       PROCEDURE DODISPEL;  (* P010913 *)
  6718  15   19:D     1       
  6719  15   19:D     1         VAR
  6720  15   19:D     1              DISPLCNT : INTEGER;
  6721  15   19:D     2              CHARX    : INTEGER;
  6722  15   19:D     3              DISPCALC : INTEGER;
  6723  15   19:D     4              
  6724  15   19:0     0         BEGIN
  6725  15   19:1     0           CENTSTR( COMB1WIN, 'DISPELLS!');
  6726  15   19:1    18           DISPCALC := 50 + 5 * CHARACTR[ BATI].CHARLEV -
  6727  15   19:1    31                       10 * BATTLERC[ VICTIM].B.HPREC.LEVEL;
  6728  15   19:1    47                       
  6729  15   19:1    47           CASE CHARACTR[ BATI].CLASS OF
  6730  15   19:1    58             LORD:    DISPCALC := DISPCALC - 40;
  6731  15   19:1    65             BISHOP:  DISPCALC := DISPCALC - 20;
  6732  15   19:1    72           END;
  6733  15   19:1    86           
  6734  15   19:1    86           DISPLCNT := 0;
  6735  15   19:1    89           FOR CHARX := 0 TO BATTLERC[ VICTIM].A.ALIVECNT - 1 DO
  6736  15   19:2   111             IF BATTLERC[ VICTIM].A.TEMP04[ CHARX].STATUS = OK THEN
  6737  15   19:3   130               IF (RANDOM MOD 100) < DISPCALC THEN
  6738  15   19:4   141                 IF BATTLERC[ VICTIM].B.CLASS = 10 THEN
  6739  15   19:5   156                   BEGIN
  6740  15   19:6   156                     DISPLCNT := DISPLCNT + 1;
  6741  15   19:6   161                     BATTLERC[ VICTIM].A.ENMYCNT := 
  6742  15   19:6   172                       BATTLERC[ VICTIM].A.ENMYCNT - 1;
  6743  15   19:6   185                     BATTLERC[ VICTIM].A.TEMP04[ CHARX].STATUS := DEAD;
  6744  15   19:6   203                     BATTLERC[ VICTIM].A.TEMP04[ CHARX].HPLEFT := 0
  6745  15   19:5   219                   END;
  6746  15   19:1   228           IF DISPLCNT = 0 THEN
  6747  15   19:2   233             CENTSTR( COMB1WIN, 'TO NO AVAIL!')
  6748  15   19:1   251           ELSE
  6749  15   19:2   256             IF DISPLCNT = 1 THEN
  6750  15   19:3   261               CENTSTR( COMB1WIN, '1 DISSOLVES!')
  6751  15   19:2   279             ELSE
  6752  15   19:3   284               BEGIN
  6753  15   19:4   284                 MVCURSOR( COMB1WIN, 13, COMB1WIN^.HEAD.VCURSOR);
  6754  15   19:4   299                 PRINTNUM( COMB1WIN, DISPLCNT, 1);
  6755  15   19:4   307                 PRINTSTR( COMB1WIN, ' DISSOLVE!')
  6756  15   19:3   323               END
  6757  15   19:0   326         END;
  6758  15   19:0   340         
  6759  15   19:0   340         
  6760  15    1:0     0       BEGIN  (* SWINGASW P010901 *)
  6761  15    1:1     0         CLEARWIN( COMB1WIN, TRUE);
  6762  15    1:1     7         IF ATTACKTY < -1 THEN
  6763  15    1:2    15           PRNAME( BATG, BATI);
  6764  15    1:1    23         CASE ATTACKTY OF
  6765  15    1:1    28           -5:  DODISPEL;
  6766  15    1:1    32           -4:  YELLHELP;
  6767  15    1:1    36           -2:  DORUN;
  6768  15    1:1    40           -1:  DOFIGHT;
  6769  15    1:1    44         END
  6770  15    1:0    62       END;   (* SWINGASW P010901 *)
  6771  15    1:0    74       
  6772  15    1:0    74       
  6773  13    1:0     0     BEGIN (* MELEE *)
  6774  13    1:1     0       FOR AGILELEV := 1 TO 10 DO
  6775  13    1:2    11         FOR BATG := 0 TO 4 DO
  6776  13    1:3    22           FOR BATI := 0 TO BATTLERC[ BATG].A.ALIVECNT - 1 DO
  6777  13    1:4    42             IF BATTLERC[ BATG].A.TEMP04[ BATI].STATUS = OK THEN
  6778  13    1:5    59               IF BATTLERC[ BATG].A.TEMP04[ BATI].AGILITY = AGILELEV THEN
  6779  13    1:6    76                 BEGIN
  6780  13    1:7    76                   VICTIM := BATTLERC[ BATG].A.TEMP04[ BATI].VICTIM;
  6781  13    1:7    91                   ATTACKTY := BATTLERC[ BATG].A.TEMP04[ BATI].SPELLHSH;
  6782  13    1:7   106                   IF (ATTACKTY >= -5) AND
  6783  13    1:7   110                      (ATTACKTY <   0) AND
  6784  13    1:7   114                      (ATTACKTY <> -3) THEN
  6785  13    1:8   121                     SWINGASW                (* -5, -4, -2, -1 *)
  6786  13    1:7   121                   ELSE IF ATTACKTY <> 0 THEN
  6787  13    1:9   131                     CASTASPE;
  6788  13    1:7   134                   IF ATTACKTY <> 0 THEN
  6789  13    1:8   139                     PAUSE1
  6790  13    1:6   139                 END
  6791  13    1:0   142     END;  (* MELEE *)
  6792  13    1:0   186     
  6793  13    1:0   186     
  6794  13    1:0   186 (* COMBAT SEGMENT *)
  6795  13    1:0   186       
  6796  13    1:0   186       
  6797  10    3:D     1     PROCEDURE ENEMYPIC( ENEMYID : INTEGER);  (* P010403 *)
  6798  10    3:D     2     
  6799  10    3:D     2       TYPE
  6800  10    3:D     2            BYTE = PACKED ARRAY[ 0..1] OF 0..255;
  6801  10    3:D     2            
  6802  10    3:D     2       VAR
  6803  10    3:D     2            CHARC0 : INTEGER;
  6804  10    3:D     3            HORZ   : INTEGER;
  6805  10    3:D     4            VERT   : INTEGER;
  6806  10    3:D     5            MEMA00 : RECORD CASE BOOLEAN OF
  6807  10    3:D     5                FALSE : (I : INTEGER);
  6808  10    3:D     5                TRUE  : (P : ^BYTE);
  6809  10    3:D     5              END;
  6810  10    3:D     6                     
  6811  10    3:0     0       BEGIN
  6812  10    3:1     0         MEMA00.I := 2560;
  6813  10    3:1     5         MOVELEFT( IOCACHE[ ENEMYID], MEMA00.P^, BLOCKSZ);
  6814  10    3:1    16         CHARC0 := 192;
  6815  10    3:1    21         FOR VERT := 0 TO 5 DO
  6816  10    3:2    32           BEGIN
  6817  10    3:3    32             MVCURSOR( MAINWIN, 13, 9 + VERT);
  6818  10    3:3    42             FOR HORZ := 0 TO 9 DO
  6819  10    3:4    53               BEGIN
  6820  10    3:5    53                 PRPICCH( MAINWIN, CHR( CHARC0) );
  6821  10    3:5    60                 CHARC0 := CHARC0 + 1
  6822  10    3:4    61               END
  6823  10    3:2    65           END
  6824  10    3:0    72       END;
  6825  10    3:0    96       
  6826  10    3:0    96       
  6827  10    2:D     1     PROCEDURE EXITCOMB;  (* P010402 *)
  6828  10    2:D     1     
  6829  10    2:0     0       BEGIN
  6830  10    2:1     0         DELWIN( COMB2WIN, FALSE);
  6831  10    2:1     7         DELWIN( COMB1WIN, FALSE);
  6832  10    2:1    14         EXIT( COMBAT)
  6833  10    2:0    18       END;
  6834  10    2:0    30       
  6835  10    2:0    30     
  6836  10    1:0     0     BEGIN (* COMBAT P010401 *)
  6837  10    1:1     0       MOVELEFT( IOCACHE[ GETREC( ZENEMY, ENEMYINX, SIZEOF( TENEMY))],
  6838  10    1:1    15                 BATTLERC[ 1].B,
  6839  10    1:1    24                 SIZEOF( TENEMY));
  6840  10    1:1    29       COMB2WIN := GETWIN( 6, 0, 28, 6, 6, FALSE);
  6841  10    1:1    42       COMB1WIN := GETWIN( 0, 5, 40, 6, 7, TRUE);
  6842  10    1:1    55       ENEMYPIC( GETREC( ZSPCCHRS, BATTLERC[ 1].B.PIC, BLOCKSZ) );
  6843  10    1:1    74       DONEFIGH := FALSE;
  6844  10    1:1    77       CINITFL1 := 0;
  6845  10    1:1    80       CINIT;
  6846  10    1:1    83       XGOTO := XREWARD1;
  6847  10    1:1    87       REPEAT
  6848  10    1:2    87         CUTIL;
  6849  10    1:2    90         IF NOT DONEFIGH THEN
  6850  10    1:3    94           BEGIN
  6851  10    1:4    94             CINITFL1 := -1;
  6852  10    1:4    98             CINIT;
  6853  10    1:4   101             MELEE
  6854  10    1:3   101           END
  6855  10    1:1   104       UNTIL DONEFIGH;
  6856  10    1:1   107       CINITFL1 := 2;
  6857  10    1:1   110       CINIT;
  6858  10    1:1   113       EXITCOMB
  6859  10    1:0   113     END;  (* COMBAT *)
  6860  10    1:0   130   
  6861  10    1:0   130 (*$I WIZ3B:COMBAT5   *)
  6862  10    1:0   130 
  6862  10    1:0   130 (*$I WIZ3C:CASTLE    *)
  6863  16    1:D     1   SEGMENT PROCEDURE CASTLE;     (* P010A01 *)
  6864  16    1:D     1   
  6865  16    1:D     1     VAR
  6866  16    1:D     1          UNUSEDXX : INTEGER;
  6867  16    1:D     2       
  6868  16    1:D     2       
  6869  16    2:D     1     PROCEDURE GETPASS(    PASSWIN:  TWINDOWP;  (* P010A02 *)
  6870  16    2:D     2                       VAR PASSWORD: STRING);
  6871  16    2:D     3                         
  6872  16    2:D     3       VAR
  6873  16    2:D     3            UNUSEDXX : INTEGER;
  6874  16    2:D     4            RANDX    : INTEGER;
  6875  16    2:D     5            CHRCNT   : INTEGER;
  6876  16    2:D     6                         
  6877  16    2:0     0       BEGIN
  6878  16    2:1     0         CHRCNT := 0;
  6879  16    2:1     3         REPEAT
  6880  16    2:2     3           GETKEY;
  6881  16    2:2     6           IF INCHAR <> CHR( CRETURN) THEN
  6882  16    2:3    11             IF CHRCNT < 15 THEN
  6883  16    2:4    16               BEGIN
  6884  16    2:5    16                 FOR RANDX := 0 TO (RANDOM MOD 2) DO
  6885  16    2:6    33                   PRINTCHR( PASSWIN, CHR( 88));
  6886  16    2:5    45                 CHRCNT := CHRCNT + 1;
  6887  16    2:5    50                 PASSWORD[ CHRCNT] := INCHAR
  6888  16    2:4    52               END
  6889  16    2:3    54             ELSE
  6890  16    2:4    56               RINGBELL
  6891  16    2:1    56         UNTIL INCHAR = CHR( CRETURN);
  6892  16    2:1    64         PRINTCR( PASSWIN);
  6893  16    2:1    68         PASSWORD[ 0] := CHR( CHRCNT)
  6894  16    2:0    71       END;  (* GETPASS *)
  6895  16    2:0    88       
  6896  16    2:0    88       
  6897  16    3:D     1     PROCEDURE CHARINFO( CHARX: INTEGER);  (* P010A03 *)
  6898  16    3:D     2     
  6899  16    3:0     0       BEGIN
  6900  16    3:1     0         MVCURSOR( CHARSWIN, 0, CHARX + 1);
  6901  16    3:1    10         PRINTNUM( CHARSWIN, CHARX + 1, 1);
  6902  16    3:1    20         PRINTCHR( CHARSWIN, ' ');
  6903  16    3:1    27         PRINTSTR( CHARSWIN, CHARACTR[ CHARX].NAME);
  6904  16    3:1    38         WHILE CHARSWIN^.HEAD.HCURSOR < 18 DO
  6905  16    3:2    50           PRINTCHR( CHARSWIN, ' ');
  6906  16    3:1    59         PRINTSTR( CHARSWIN,
  6907  16    3:1    62                            COPY( SCNTOC.ALIGN[ CHARACTR[ CHARX].ALIGN], 1, 1));
  6908  16    3:1    86         PRINTCHR( CHARSWIN, '-');
  6909  16    3:1    93         PRINTSTR( CHARSWIN,
  6910  16    3:1    96                            COPY( SCNTOC.CLASS[ CHARACTR[ CHARX].CLASS], 1, 3));
  6911  16    3:1   120         PRINTCHR( CHARSWIN, ' ');
  6912  16    3:1   127         IF CHARACTR[ CHARX].ARMORCL > - 10 THEN
  6913  16    3:2   139           PRINTNUM( CHARSWIN, CHARACTR[ CHARX].ARMORCL, 2)
  6914  16    3:1   150         ELSE
  6915  16    3:2   155           PRINTSTR( CHARSWIN, 'LO');
  6916  16    3:1   166         PRINTNUM( CHARSWIN, CHARACTR[ CHARX].HPLEFT, 5);
  6917  16    3:1   180         PRINTCHR( CHARSWIN, ' ');
  6918  16    3:1   187         IF CHARACTR[ CHARX].STATUS = OK THEN
  6919  16    3:2   198           IF CHARACTR[ CHARX].LOSTXYL.POISNAMT[ 1] <> 0 THEN
  6920  16    3:3   215             PRINTSTR( CHARSWIN, 'POISON')
  6921  16    3:2   227           ELSE
  6922  16    3:3   232             PRINTNUM( CHARSWIN, CHARACTR[ CHARX].HPMAX, 4)
  6923  16    3:1   243         ELSE
  6924  16    3:2   248           PRINTSTR( CHARSWIN, SCNTOC.STATUS[ CHARACTR[ CHARX].STATUS]);
  6925  16    3:1   266         WHILE CHARSWIN^.HEAD.HCURSOR <> 0 DO
  6926  16    3:2   278           PRINTCHR( CHARSWIN, ' ')
  6927  16    3:0   282       END;
  6928  16    3:0   304       
  6929  16    3:0   304       
  6930  16    4:D     1     PROCEDURE DSPHEAD;  (* P010A04 *)
  6931  16    4:D     1     
  6932  16    4:0     0       BEGIN
  6933  16    4:1     0         MVCURSOR( CHARSWIN, 0, 0);
  6934  16    4:1     8         PRINTSTR( CHARSWIN, '^ CHARACTER NAME  CLASS AC HITS STATUS')
  6935  16    4:0    52       END;
  6936  16    4:0    68       
  6937  16    4:0    68       
  6938  16    5:D     1     PROCEDURE DSPPARTY;  (* P010A05 *)
  6939  16    5:D     1     
  6940  16    5:D     1       VAR
  6941  16    5:D     1            CHARX : INTEGER;
  6942  16    5:D     2     
  6943  16    5:0     0       BEGIN
  6944  16    5:1     0         DSPHEAD;
  6945  16    5:1     2         FOR CHARX := 0 TO 5 DO
  6946  16    5:2    13           IF CHARX < PARTYCNT THEN
  6947  16    5:3    18             CHARINFO( CHARX)
  6948  16    5:2    19           ELSE
  6949  16    5:3    23             CLRRECT( CHARSWIN, 0, CHARX + 1, 38, 1)
  6950  16    5:0    32       END;  (* DSPPARTY *)
  6951  16    5:0    56       
  6952  16    5:0    56       
  6953  16    6:D     1     PROCEDURE GILGAMSH;  (*  P010A06 *)
  6954  16    6:D     1     
  6955  16    6:D     1       VAR
  6956  16    6:D     1            GILGAWIN : TWINDOWP;
  6957  16    6:D     2            PRTYALGN : TALIGN;
  6958  16    6:D     3     
  6959  16    6:D     3     
  6960  16    7:D     1       PROCEDURE GETALIGN;  (* P010A07 *)
  6961  16    7:D     1       
  6962  16    7:0     0         BEGIN
  6963  16    7:1     0           PRTYALGN := NEUTRAL;
  6964  16    7:1     4           FOR BASE04 := 0 TO PARTYCNT - 1 DO
  6965  16    7:2    17             IF CHARACTR[ BASE04].ALIGN <> NEUTRAL THEN
  6966  16    7:3    28               PRTYALGN := CHARACTR[ BASE04].ALIGN
  6967  16    7:0    33         END;  (* GETALIGN *)
  6968  16    7:0    60         
  6969  16    7:0    60         
  6970  16    8:D     1       PROCEDURE ADDPARTY;  (* P010A08 *)
  6971  16    8:D     1       
  6972  16    8:D     1         VAR
  6973  16    8:D     1              ADDPWIN  : TWINDOWP;
  6974  16    8:D     2              CHARI    : INTEGER;
  6975  16    8:D     3              AWARDSXX : PACKED ARRAY[ 0..15] OF BOOLEAN;
  6976  16    8:D     4              CHARNAME : STRING;  (* MULTIPLE USES *)
  6977  16    8:D    45              
  6978  16    8:D    45              
  6979  16    9:D     1         PROCEDURE EXITADDP( EXITSTR: STRING);  (* P010A09 *)
  6980  16    9:D    43         
  6981  16    9:0     0           BEGIN
  6982  16    9:1     0             IF ADDPWIN <> NIL THEN
  6983  16    9:2    12               DELWIN( ADDPWIN, TRUE);
  6984  16    9:1    19             CLRRECT( TEMPWIN, 0, 3, 38, 1);
  6985  16    9:1    29             MVCURSOR( TEMPWIN, 0, 3);
  6986  16    9:1    37             CENTSTR( TEMPWIN, EXITSTR);
  6987  16    9:1    45             PAUSE2;
  6988  16    9:1    48             DELWIN( TEMPWIN, FALSE);
  6989  16    9:1    55             EXIT( ADDPARTY)
  6990  16    9:0    59           END;  (* EXITADDP *)
  6991  16    9:0    72           
  6992  16    9:0    72           
  6993  16   10:D     1         PROCEDURE DISP20;  (* P010A0A *)
  6994  16   10:D     1         
  6995  16   10:D     1           VAR
  6996  16   10:D     1                CHARCNT : INTEGER;
  6997  16   10:D     2                CHARX   : INTEGER;
  6998  16   10:D     3         
  6999  16   10:0     0           BEGIN
  7000  16   10:1     0             IF ADDPWIN = NIL THEN
  7001  16   10:2     7               ADDPWIN := GETWIN( 1, 11, 38, 12, 31, FALSE);
  7002  16   10:1    21             CLEARWIN( ADDPWIN, TRUE);
  7003  16   10:1    28             CHARCNT := 0;
  7004  16   10:1    31             FOR CHARX := 0 TO SCNTOC.RECPERDK[ ZCHAR] DO
  7005  16   10:2    48               BEGIN
  7006  16   10:3    48                 MVCURSOR( ADDPWIN, 18 * (CHARCNT DIV 10), CHARCNT MOD 10);
  7007  16   10:3    62                 MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARX, SIZEOF( TCHAR))],
  7008  16   10:3    75                           CHARACTR[ PARTYCNT],
  7009  16   10:3    81                           SIZEOF( TCHAR));
  7010  16   10:3    86                 MOVELEFT( CHARACTR[ PARTYCNT].LOSTXYL.AWARDS[ 4], AWARDSXX, 2);
  7011  16   10:3   106                 WITH CHARACTR[ PARTYCNT] DO
  7012  16   10:4   113                   BEGIN
  7013  16   10:5   113                     IF STATUS <> LOST THEN
  7014  16   10:6   120                       IF NOT INMAZE THEN
  7015  16   10:7   126                         IF LOSTXYL.LOCATION[ 3] = 0 THEN
  7016  16   10:8   139                           IF (ALIGN = NEUTRAL) OR
  7017  16   10:8   144                              (PRTYALGN = ALIGN) OR
  7018  16   10:8   152                              (PRTYALGN = NEUTRAL) THEN
  7019  16   10:9   160                             IF AWARDSXX[ 13] THEN
  7020  16   10:0   170                               BEGIN
  7021  16   10:1   170                                 PRINTSTR( ADDPWIN, NAME);
  7022  16   10:1   177                                 CHARCNT := CHARCNT + 1
  7023  16   10:0   178                               END
  7024  16   10:4   182                   END
  7025  16   10:2   182               END
  7026  16   10:0   182           END;   (* DISP20 *)
  7027  16   10:0   206           
  7028  16   10:0   206           
  7029  16    8:0     0         BEGIN (* ADDPARTY *)
  7030  16    8:1     0           ADDPWIN := NIL;
  7031  16    8:1     3           TEMPWIN := GETWIN( 0, 6, 40, 6, 7, FALSE);
  7032  16    8:1    17           REPEAT
  7033  16    8:2    17             CLEARWIN( TEMPWIN, TRUE);
  7034  16    8:2    24             MVCURSOR( TEMPWIN, 0, 3);
  7035  16    8:2    32             PRINTSTR( TEMPWIN, 'ENTER "*" (RETURN) FOR ELIGIBLE NAMES');
  7036  16    8:2    78             MVCURSOR( TEMPWIN, 0, 0);
  7037  16    8:2    86             PRINTSTR( TEMPWIN, 'WHO WILL JOIN ? >');
  7038  16    8:2   112             GETSTR(   TEMPWIN, CHARNAME, 15);
  7039  16    8:2   121             IF CHARNAME = '' THEN
  7040  16    8:3   130               BEGIN
  7041  16    8:4   130                 DELWIN( TEMPWIN, FALSE);
  7042  16    8:4   137                 IF ADDPWIN <> NIL THEN
  7043  16    8:5   142                   DELWIN( ADDPWIN, FALSE);
  7044  16    8:4   148                 EXIT( ADDPARTY)
  7045  16    8:3   152               END
  7046  16    8:2   152             ELSE
  7047  16    8:3   154               IF CHARNAME = '*' THEN
  7048  16    8:4   161                 DISP20
  7049  16    8:1   161           UNTIL CHARNAME <> '*';
  7050  16    8:1   170           CHARI := 0;
  7051  16    8:1   173           MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARI, SIZEOF( TCHAR))],
  7052  16    8:1   186                     CHARACTR[ PARTYCNT],
  7053  16    8:1   192                     SIZEOF( TCHAR));
  7054  16    8:1   197           WHILE (CHARI < SCNTOC.RECPERDK[ ZCHAR]) AND
  7055  16    8:1   206                 ( (CHARNAME <> CHARACTR[ PARTYCNT].NAME) OR
  7056  16    8:1   215                   (CHARACTR[ PARTYCNT].STATUS = LOST) ) DO
  7057  16    8:2   228             BEGIN
  7058  16    8:3   228               CHARI := CHARI + 1;
  7059  16    8:3   233               MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARI, SIZEOF( TCHAR))],
  7060  16    8:3   246                         CHARACTR[ PARTYCNT],
  7061  16    8:3   252                         SIZEOF( TCHAR))
  7062  16    8:2   257             END;
  7063  16    8:1   259           IF CHARI = SCNTOC.RECPERDK[ ZCHAR] THEN
  7064  16    8:2   270             EXITADDP( '** WHO? **')
  7065  16    8:1   283           ELSE
  7066  16    8:2   287             IF CHARACTR[ PARTYCNT].INMAZE OR
  7067  16    8:2   294                (CHARACTR[ PARTYCNT].LOSTXYL.LOCATION[ 3] <> 0) THEN
  7068  16    8:3   312               EXITADDP( '** OUT **')
  7069  16    8:2   324             ELSE
  7070  16    8:3   328               IF (PRTYALGN <> NEUTRAL) THEN
  7071  16    8:4   335                 IF (CHARACTR[ PARTYCNT].ALIGN <> NEUTRAL) THEN
  7072  16    8:5   346                   IF (PRTYALGN <> CHARACTR[ PARTYCNT].ALIGN) THEN
  7073  16    8:6   359                     EXITADDP( '** BAD ALIGNMENT **');
  7074  16    8:1   383           MOVELEFT( CHARACTR[ PARTYCNT].LOSTXYL.AWARDS[ 4], AWARDSXX, 2);
  7075  16    8:1   402           IF AWARDSXX[ 13] = FALSE THEN
  7076  16    8:2   414             EXITADDP( '** ONLY A MEMORY **');
  7077  16    8:1   438           MVCURSOR( TEMPWIN, 0, 1);
  7078  16    8:1   446           PRINTSTR( TEMPWIN, 'ENTER PASSWORD  >');
  7079  16    8:1   472           GETPASS(  TEMPWIN, CHARNAME);
  7080  16    8:1   479           IF CHARNAME <> CHARACTR[ PARTYCNT].PASSWORD THEN
  7081  16    8:2   492             EXITADDP( '** THATS NOT IT **');
  7082  16    8:1   515           CHARDISK[ PARTYCNT] := CHARI;
  7083  16    8:1   523           CHARACTR[ PARTYCNT].INMAZE := TRUE;
  7084  16    8:1   532           MOVELEFT( CHARACTR[ PARTYCNT],
  7085  16    8:1   538                     IOCACHE[ GETRECW( ZCHAR, CHARI, SIZEOF( TCHAR))],
  7086  16    8:1   551                     SIZEOF( TCHAR));
  7087  16    8:1   556           IF IORESULT > 0 THEN
  7088  16    8:2   562             EXITADDP( '** WRITE-PROTECT CHEAT! **');
  7089  16    8:1   593           PARTYCNT := PARTYCNT + 1;
  7090  16    8:1   598           GETALIGN;
  7091  16    8:1   600           MOVELEFT( IOCACHE[ GETREC( ZZERO, 0, SIZEOF( TSCNTOC))],
  7092  16    8:1   613                     SCNTOC,
  7093  16    8:1   617                     SIZEOF( TSCNTOC));
  7094  16    8:1   622           CHARINFO( PARTYCNT - 1);
  7095  16    8:1   627           IF ADDPWIN <> NIL THEN
  7096  16    8:2   632             DELWIN( ADDPWIN, FALSE);
  7097  16    8:1   638           DELWIN( TEMPWIN, TRUE)
  7098  16    8:0   642         END;  (* ADDPARTY *)
  7099  16    8:0   662         
  7100  16    8:0   662         
  7101  16   11:D     1       PROCEDURE REMOVE;  (* P010A0B *)
  7102  16   11:D     1       
  7103  16   11:D     1         VAR
  7104  16   11:D     1              CHARX : INTEGER;
  7105  16   11:D     2              CHARI : INTEGER;
  7106  16   11:D     3       
  7107  16   11:0     0         BEGIN
  7108  16   11:1     0           TEMPWIN := GETWIN( 8, 7, 24, 4, 7, TRUE);
  7109  16   11:1    14           CENTSTR( TEMPWIN, 'REMOVE WHO (NUM) ?');
  7110  16   11:1    41           CENTSTR( TEMPWIN, '(RETURN) EXITS');
  7111  16   11:1    64           GETKEY;
  7112  16   11:1    67           DELWIN( TEMPWIN, FALSE);
  7113  16   11:1    74           CHARI := ORD( INCHAR) - ORD( '1');
  7114  16   11:1    79           IF (CHARI < 0) OR (CHARI >= PARTYCNT) THEN
  7115  16   11:2    88             EXIT( REMOVE);
  7116  16   11:1    92           CHARACTR[ CHARI].INMAZE := FALSE;
  7117  16   11:1   101           MOVELEFT( CHARACTR[ CHARI],
  7118  16   11:1   107                     IOCACHE[ GETRECW( ZCHAR,
  7119  16   11:1   111                                       CHARDISK[ CHARI],
  7120  16   11:1   118                                       SIZEOF( TCHAR))],
  7121  16   11:1   126                     SIZEOF( TCHAR));
  7122  16   11:1   131           IF CHARI <> (PARTYCNT - 1) THEN
  7123  16   11:2   138             FOR CHARX := (CHARI + 1) TO (PARTYCNT - 1) DO
  7124  16   11:3   153               BEGIN
  7125  16   11:4   153                 CHARACTR[ CHARX - 1] := CHARACTR[ CHARX];
  7126  16   11:4   167                 CHARDISK[ CHARX - 1] := CHARDISK[ CHARX]
  7127  16   11:3   181               END;
  7128  16   11:1   190           PARTYCNT := PARTYCNT - 1;
  7129  16   11:1   195           GETALIGN;
  7130  16   11:1   197           DSPPARTY
  7131  16   11:0   197         END;   (* REMOVE *)
  7132  16   11:0   214         
  7133  16   11:0   214         
  7134  16   12:D     1       PROCEDURE EXITCASL;  (* P010A0C *)
  7135  16   12:D     1       
  7136  16   12:D     1         VAR
  7137  16   12:D     1              UNUSEDX : INTEGER;
  7138  16   12:D     2              
  7139  16   12:0     0         BEGIN
  7140  16   12:1     0           BASE04 := BASE04 - 2;
  7141  16   12:1     5           DELWIN( GILGAWIN, FALSE);
  7142  16   12:1    12           MAZELEV := -1;
  7143  16   12:1    16           XGOTO := XINSPECT;
  7144  16   12:1    20           EXIT( CASTLE)
  7145  16   12:0    24         END;
  7146  16   12:0    36         
  7147  16   12:0    36         
  7148  16    6:0     0       BEGIN  (* GILGAMSH *)
  7149  16    6:1     0         GETALIGN;
  7150  16    6:1     2         GILGAWIN := GETWIN( 9, 4, 22, 8, 6, FALSE);
  7151  16    6:1    15         REPEAT
  7152  16    6:2    15           DRAWSCR(  WINCHAIN);
  7153  16    6:2    21           MVCURSOR( GILGAWIN, 0, 0);
  7154  16    6:2    27           CENTSTR(  GILGAWIN, 'GILGAMESH''S TAVERN');
  7155  16    6:2    52           PRINTCR(  GILGAWIN);
  7156  16    6:2    56           BASE04 := MENU( GILGAWIN, 'A)DD/R)EMOVE/^)INSPECT/L)EAVE');
  7157  16    6:2    96           CASE BASE04 OF
  7158  16    6:2    99             0:  IF PARTYCNT < 6 THEN
  7159  16    6:4   104                   ADDPARTY;
  7160  16    6:4   108                    
  7161  16    6:2   108             1:  IF PARTYCNT > 0 THEN
  7162  16    6:4   113                   REMOVE;
  7163  16    6:4   117                    
  7164  16    6:2   117             2, 3, 4, 5, 6, 7:
  7165  16    6:3   117                 IF PARTYCNT > 0 THEN
  7166  16    6:4   122                   EXITCASL;
  7167  16    6:4   126                    
  7168  16    6:2   126             8:  BEGIN
  7169  16    6:4   126                    DELWIN( GILGAWIN, FALSE);
  7170  16    6:4   132                    EXIT( GILGAMSH)
  7171  16    6:3   136                  END
  7172  16    6:2   136           END
  7173  16    6:1   164         UNTIL FALSE
  7174  16    6:0   164       END;   (* GILGAMSH *)
  7175  16    6:0   182       
  7176  16    6:0   182       
  7177  16   13:D     1     PROCEDURE GOBOLTAC;  (* P010A0D *)
  7178  16   13:D     1     
  7179  16   13:0     0       BEGIN
  7180  16   13:1     0         XGOTO := XBOLTAC;
  7181  16   13:1     4         XGOTO2 := XBOLTAC;
  7182  16   13:1     8         EXIT( CASTLE)
  7183  16   13:0    12       END;
  7184  16   13:0    24       
  7185  16   13:0    24       
  7186  16   14:D     1     PROCEDURE GOTEMPLE;  (* P010A0E *)
  7187  16   14:D     1     
  7188  16   14:0     0       BEGIN
  7189  16   14:1     0         XGOTO := XCANT;
  7190  16   14:1     4         XGOTO2 := XBOLTAC;
  7191  16   14:1     8         EXIT( CASTLE)
  7192  16   14:0    12       END;
  7193  16   14:0    24     
  7194  16   14:0    24 (*$I WIZ3C:CASTLE    *)
  7194  16   14:0    24 (*$I WIZ3C:CASTLE2   *)
  7195  16   15:D     1     PROCEDURE ADVNTINN;  (* P010A0F *)
  7196  16   15:D     1     
  7197  16   15:D     1       CONST
  7198  16   15:D     1            STABLES  = 65;
  7199  16   15:D     1            COTS     = 66;
  7200  16   15:D     1            ECONOMY  = 67;
  7201  16   15:D     1            MERCHANT = 68;
  7202  16   15:D     1            ROYAL    = 69;
  7203  16   15:D     1            
  7204  16   15:D     1       VAR
  7205  16   15:D     1            INNWIN : TWINDOWP;
  7206  16   15:D     2            PARTYX : INTEGER;
  7207  16   15:D     3     
  7208  16   15:D     3     
  7209  16   16:D     1       PROCEDURE GETWHO;  (* P010A10 *)
  7210  16   16:D     1       
  7211  16   16:0     0         BEGIN
  7212  16   16:1     0           CLEARWIN( INNWIN, TRUE);
  7213  16   16:1     7           CENTSTR(  INNWIN, 'ADVENTURER''S INN');
  7214  16   16:1    32           PRINTCR(  INNWIN);
  7215  16   16:1    38           CENTSTR(  INNWIN, 'WHO (NUM) WILL STAY ?');
  7216  16   16:1    68           CENTSTR(  INNWIN, '(RETURN) TO LEAVE');
  7217  16   16:1    94           REPEAT
  7218  16   16:2    94             GETKEY;
  7219  16   16:2    97             IF INCHAR = CHR( CRETURN) THEN
  7220  16   16:3   102               BEGIN
  7221  16   16:4   102                 DELWIN( INNWIN, FALSE);
  7222  16   16:4   109                 EXIT( ADVNTINN)
  7223  16   16:3   113               END;
  7224  16   16:2   113             PARTYX := ORD( INCHAR) - ORD( '1')
  7225  16   16:1   115           UNTIL (PARTYX >= 0) AND (PARTYX < PARTYCNT)
  7226  16   16:0   129         END;
  7227  16   16:0   146         
  7228  16   16:0   146         
  7229  16   17:D     1       PROCEDURE INNMENU;  (* P010A11 *)
  7230  16   17:D     1       
  7231  16   17:0     0         BEGIN
  7232  16   17:1     0           CLEARWIN( INNWIN, TRUE);
  7233  16   17:1     7           CENTSTR(  INNWIN, CONCAT( 'WELCOME, ', CHARACTR[ PARTYX].NAME,
  7234  16   17:1    46                                     '. WE HAVE:'));
  7235  16   17:1    68           PRINTCR(  INNWIN);
  7236  16   17:1    74           PRINTSTR( INNWIN, '(A) THE STABLES (FREE!)');
  7237  16   17:1   106           PRINTCR(  INNWIN);
  7238  16   17:1   112           PRINTSTR( INNWIN, '(B) COTS. 10 GP/WEEK.');
  7239  16   17:1   142           PRINTCR(  INNWIN);
  7240  16   17:1   148           PRINTSTR( INNWIN, '(C) ECONOMY ROOMS. 50 GP/WEEK.');
  7241  16   17:1   187           PRINTCR(  INNWIN);
  7242  16   17:1   193           PRINTSTR( INNWIN, '(D) MERCHANT SUITES. 200 GP/WEEK.');
  7243  16   17:1   235           PRINTCR(  INNWIN);
  7244  16   17:1   241           PRINTSTR( INNWIN, '(E) ROYAL SUITES. 500 GP/WEEK.');
  7245  16   17:1   280           PRINTCR(  INNWIN);
  7246  16   17:1   286           PRINTSTR( INNWIN, '    OR (RETURN) TO LEAVE')
  7247  16   17:0   316         END;
  7248  16   17:0   332         
  7249  16   17:0   332         
  7250  16   18:D     1       PROCEDURE SETSPELS;  (* P010A12 *)
  7251  16   18:D     1       
  7252  16   18:D     1       
  7253  16   19:D     1         PROCEDURE SPLPERLV( VAR SPELGRPS: TSPELL7G;  (* P010A13 *)
  7254  16   19:D     2                                 LEVELMOD: INTEGER;
  7255  16   19:D     3                                 LEVMOD2:  INTEGER);
  7256  16   19:D     4                            
  7257  16   19:D     4           VAR
  7258  16   19:D     4                UNUSEDXX : INTEGER;
  7259  16   19:D     5                SPGRPI   : INTEGER;
  7260  16   19:D     6                SPELLCNT : INTEGER;
  7261  16   19:D     7         
  7262  16   19:0     0           BEGIN
  7263  16   19:1     0             SPELLCNT :=  CHARACTR[ PARTYX].CHARLEV - LEVELMOD;
  7264  16   19:1    13             IF SPELLCNT <=0 THEN
  7265  16   19:2    18               EXIT (SPLPERLV);
  7266  16   19:1    22             SPGRPI := 1;
  7267  16   19:1    25             WHILE (SPGRPI >= 1) AND (SPGRPI <= 7) AND (SPELLCNT > 0) DO
  7268  16   19:2    38               BEGIN
  7269  16   19:3    38                 IF SPELLCNT > SPELGRPS[ SPGRPI] THEN
  7270  16   19:4    49                   SPELGRPS[ SPGRPI] := SPELLCNT;
  7271  16   19:3    57                 SPGRPI := SPGRPI + 1;
  7272  16   19:3    62                 SPELLCNT := SPELLCNT - LEVMOD2
  7273  16   19:2    63               END;
  7274  16   19:1    69             FOR SPGRPI := 1 TO 7 DO
  7275  16   19:2    80               IF SPELGRPS[ SPGRPI] > 9 THEN
  7276  16   19:3    91                 SPELGRPS[ SPGRPI] := 9
  7277  16   19:0    97           END;  (* SPLPERLV *)
  7278  16   19:0   122           
  7279  16   19:0   122           
  7280  16   20:D     1         PROCEDURE NWPRIEST( MOD1: INTEGER;  (* P010A14 *)
  7281  16   20:D     2                             MOD2: INTEGER);
  7282  16   20:D     3         
  7283  16   20:0     0           BEGIN
  7284  16   20:1     0             SPLPERLV( CHARACTR[ PARTYX].PRIESTSP, MOD1, MOD2)
  7285  16   20:0    11           END;
  7286  16   20:0    26           
  7287  16   20:0    26           
  7288  16   21:D     1         PROCEDURE NWMAGE( MOD1: INTEGER;  (* P010A15 *)
  7289  16   21:D     2                           MOD2: INTEGER);
  7290  16   21:D     3         
  7291  16   21:0     0           BEGIN
  7292  16   21:1     0             SPLPERLV( CHARACTR[ PARTYX].MAGESP, MOD1, MOD2)
  7293  16   21:0    11           END;
  7294  16   21:0    26           
  7295  16   21:0    26           
  7296  16   22:D     1         PROCEDURE MINSPCNT( VAR SPLGRPS:  TSPELL7G;  (* P010A16 *)
  7297  16   22:D     2                                 GROUPI:   INTEGER;
  7298  16   22:D     3                                 LOWINDX:  INTEGER;
  7299  16   22:D     4                                 HIGHINDX: INTEGER);
  7300  16   22:D     5                            
  7301  16   22:D     5           VAR
  7302  16   22:D     5                SPELLI   : INTEGER;
  7303  16   22:D     6                SPELKNOW : INTEGER;
  7304  16   22:D     7                            
  7305  16   22:0     0           BEGIN
  7306  16   22:1     0             SPELKNOW := 0;
  7307  16   22:1     3             FOR SPELLI := LOWINDX TO HIGHINDX DO
  7308  16   22:2    14               IF CHARACTR[ PARTYX].SPELLSKN[ SPELLI] THEN
  7309  16   22:3    30                 SPELKNOW := SPELKNOW + 1;
  7310  16   22:1    42             SPLGRPS[ GROUPI] := SPELKNOW
  7311  16   22:0    48           END;
  7312  16   22:0    64           
  7313  16   22:0    64           
  7314  16   23:D     1         PROCEDURE MINMAG;  (* P010A17 *)
  7315  16   23:D     1         
  7316  16   23:0     0           BEGIN
  7317  16   23:1     0             WITH CHARACTR[ PARTYX] DO
  7318  16   23:2     9               BEGIN
  7319  16   23:3     9                 MINSPCNT( MAGESP, 1,  1,  4);
  7320  16   23:3    17                 MINSPCNT( MAGESP, 2,  5,  6);
  7321  16   23:3    25                 MINSPCNT( MAGESP, 3,  7,  8);
  7322  16   23:3    33                 MINSPCNT( MAGESP, 4,  9, 11);
  7323  16   23:3    41                 MINSPCNT( MAGESP, 5, 12, 14);
  7324  16   23:3    49                 MINSPCNT( MAGESP, 6, 15, 18);
  7325  16   23:3    57                 MINSPCNT( MAGESP, 7, 19, 21)
  7326  16   23:2    63               END
  7327  16   23:0    65           END;
  7328  16   23:0    78           
  7329  16   23:0    78           
  7330  16   24:D     1         PROCEDURE MINPRI;  (* P010A18 *)
  7331  16   24:D     1         
  7332  16   24:0     0           BEGIN
  7333  16   24:1     0             WITH CHARACTR[ PARTYX] DO
  7334  16   24:2     9               BEGIN
  7335  16   24:3     9                 MINSPCNT( PRIESTSP, 1, 22, 26);
  7336  16   24:3    17                 MINSPCNT( PRIESTSP, 2, 27, 30);
  7337  16   24:3    25                 MINSPCNT( PRIESTSP, 3, 31, 34);
  7338  16   24:3    33                 MINSPCNT( PRIESTSP, 4, 35, 38);
  7339  16   24:3    41                 MINSPCNT( PRIESTSP, 5, 39, 44);
  7340  16   24:3    49                 MINSPCNT( PRIESTSP, 6, 45, 48);
  7341  16   24:3    57                 MINSPCNT( PRIESTSP, 7, 49, 50)
  7342  16   24:2    63               END
  7343  16   24:0    65           END;  (* MINPRI *)
  7344  16   24:0    78       
  7345  16   24:0    78       
  7346  16   18:0     0         BEGIN  (* SETSPELS *)
  7347  16   18:1     0           MINPRI;
  7348  16   18:1     2           MINMAG;
  7349  16   18:1     4           CASE CHARACTR[ PARTYX].CLASS OF
  7350  16   18:1    15              PRIEST:  NWPRIEST( 0, 2);
  7351  16   18:1    21                MAGE:  NWMAGE(   0, 2);
  7352  16   18:1    27              BISHOP:  BEGIN
  7353  16   18:3    27                         NWPRIEST( 3, 4);
  7354  16   18:3    31                         NWMAGE(   0, 4)
  7355  16   18:2    33                       END;
  7356  16   18:1    37                LORD:  NWPRIEST( 3, 2);
  7357  16   18:1    43             SAMURAI:  NWMAGE(   3, 3)
  7358  16   18:1    45           END
  7359  16   18:0    68         END;  (* SETSPELS *)
  7360  16   18:0    80         
  7361  16   18:0    80         
  7362  16   25:D     1       PROCEDURE CHNEWLEV;  (* P010A19 *)
  7363  16   25:D     1       
  7364  16   25:D     1         VAR
  7365  16   25:D     1              EXP2NEXT : TEXP;
  7366  16   25:D   313              UNUSEDXX : TWIZLONG;
  7367  16   25:D   316              BIGLEV   : INTEGER;
  7368  16   25:D   317              EXPNXTLV : TWIZLONG;
  7369  16   25:D   320       
  7370  16   25:D   320       
  7371  16   26:D     1         PROCEDURE MADELEV;  (* P010A1A *)
  7372  16   26:D     1         
  7373  16   26:D     1           VAR
  7374  16   26:D     1                CHARLEV  : INTEGER;
  7375  16   26:D     2                NEWHPMAX : INTEGER;
  7376  16   26:D     3         
  7377  16   26:D     3         
  7378  16   27:D     3           FUNCTION MOREHP : INTEGER;  (* P010A1B *)
  7379  16   27:D     3           
  7380  16   27:D     3             VAR
  7381  16   27:D     3                  HITPTS : INTEGER;
  7382  16   27:D     4           
  7383  16   27:0     0             BEGIN
  7384  16   27:1     0               CASE CHARACTR[ PARTYX].CLASS OF
  7385  16   27:1    11                 FIGHTER, LORD:         HITPTS := RANDOM MOD 10;
  7386  16   27:1    22                 PRIEST, SAMURAI:       HITPTS := RANDOM MOD 8;
  7387  16   27:1    33                 THIEF, BISHOP, NINJA:  HITPTS := RANDOM MOD 6;
  7388  16   27:1    44                 MAGE:                  HITPTS := RANDOM MOD 4;
  7389  16   27:1    55               END;
  7390  16   27:1    78               
  7391  16   27:1    78               HITPTS := HITPTS + 1;
  7392  16   27:1    83               
  7393  16   27:1    83               CASE CHARACTR[ PARTYX].ATTRIB[ VITALITY] OF
  7394  16   27:1    99                 3:     HITPTS := HITPTS - 2;
  7395  16   27:1   106                 4, 5:  HITPTS := HITPTS - 1;
  7396  16   27:1   113                 16:    HITPTS := HITPTS + 1;
  7397  16   27:1   120                 17:    HITPTS := HITPTS + 2;
  7398  16   27:1   127                 18:    HITPTS := HITPTS + 3;
  7399  16   27:1   134               END;
  7400  16   27:1   174               
  7401  16   27:1   174               IF HITPTS < 1 THEN
  7402  16   27:2   179                 HITPTS := 1;
  7403  16   27:1   182               MOREHP := HITPTS
  7404  16   27:0   182             END;  (* MOREHP *)
  7405  16   27:0   198             
  7406  16   27:0   198             
  7407  16   28:D     1           PROCEDURE TRYLEARN;  (* P010A1C *)
  7408  16   28:D     1           
  7409  16   28:D     1             VAR
  7410  16   28:D     1                  IQPIETY : TATTRIB;
  7411  16   28:D     2                  LEARNED : BOOLEAN;
  7412  16   28:D     3           
  7413  16   28:D     3           
  7414  16   29:D     1             PROCEDURE TRY2LRN( LOWINDX:  INTEGER;  (* P010A1D *)
  7415  16   29:D     2                                HIGHINDX: INTEGER);
  7416  16   29:D     3             
  7417  16   29:D     3               VAR
  7418  16   29:D     3                    SPELLI   : INTEGER;
  7419  16   29:D     4                    SPLKNOWN : BOOLEAN;
  7420  16   29:D     5             
  7421  16   29:0     0               BEGIN
  7422  16   29:1     0                 SPLKNOWN := FALSE;
  7423  16   29:1     3                 FOR SPELLI := LOWINDX TO HIGHINDX DO
  7424  16   29:2    14                   SPLKNOWN := SPLKNOWN OR CHARACTR[ PARTYX].SPELLSKN[ SPELLI];
  7425  16   29:1    39                 FOR SPELLI := LOWINDX TO HIGHINDX DO
  7426  16   29:2    50                   IF NOT (CHARACTR[ PARTYX].SPELLSKN[ SPELLI]) THEN
  7427  16   29:3    67                     IF ((RANDOM MOD 30) <
  7428  16   29:3    74                         CHARACTR[ PARTYX].ATTRIB[ IQPIETY]) OR
  7429  16   29:3    91                        (NOT SPLKNOWN) THEN
  7430  16   29:4    96                       BEGIN
  7431  16   29:5    96                         LEARNED := TRUE;
  7432  16   29:5   100                         SPLKNOWN := TRUE;
  7433  16   29:5   103                         CHARACTR[ PARTYX].SPELLSKN[ SPELLI] := TRUE
  7434  16   29:4   116                       END
  7435  16   29:0   118               END;  (* TRY2LRN *)
  7436  16   29:0   142               
  7437  16   29:0   142               
  7438  16   30:D     1             PROCEDURE TRYMAGE;  (* P010A1E *)
  7439  16   30:D     1             
  7440  16   30:0     0               BEGIN
  7441  16   30:1     0                 IQPIETY := IQ;
  7442  16   30:1     4                 WITH CHARACTR[ PARTYX] DO
  7443  16   30:2    13                   BEGIN
  7444  16   30:3    13                     IF MAGESP[ 1] > 0 THEN
  7445  16   30:4    26                       TRY2LRN( 1, 4);
  7446  16   30:3    30                     IF MAGESP[ 2] > 0 THEN
  7447  16   30:4    43                       TRY2LRN( 5, 6);
  7448  16   30:3    47                     IF MAGESP[ 3] > 0 THEN
  7449  16   30:4    60                       TRY2LRN( 7, 8);
  7450  16   30:3    64                     IF MAGESP[ 4] > 0 THEN
  7451  16   30:4    77                       TRY2LRN( 9, 11);
  7452  16   30:3    81                     IF MAGESP[ 5] > 0 THEN
  7453  16   30:4    94                       TRY2LRN( 12, 14);
  7454  16   30:3    98                     IF MAGESP[ 6] > 0 THEN
  7455  16   30:4   111                       TRY2LRN( 15, 18);
  7456  16   30:3   115                     IF MAGESP[ 7] > 0 THEN
  7457  16   30:4   128                       TRY2LRN( 19, 21)
  7458  16   30:2   130                   END
  7459  16   30:0   132               END;  (* TRYMAGE *)
  7460  16   30:0   144               
  7461  16   30:0   144               
  7462  16   31:D     1             PROCEDURE TRYPRI;  (* P010A1F *)
  7463  16   31:D     1             
  7464  16   31:0     0               BEGIN
  7465  16   31:1     0                 IQPIETY := PIETY;
  7466  16   31:1     4                 WITH CHARACTR[ PARTYX] DO
  7467  16   31:2    13                   BEGIN
  7468  16   31:3    13                     IF PRIESTSP[ 1] > 0 THEN
  7469  16   31:4    26                       TRY2LRN( 22, 26);
  7470  16   31:3    30                     IF PRIESTSP[ 2] > 0 THEN
  7471  16   31:4    43                       TRY2LRN( 27, 30);
  7472  16   31:3    47                     IF PRIESTSP[ 3] > 0 THEN
  7473  16   31:4    60                       TRY2LRN( 31, 34);
  7474  16   31:3    64                     IF PRIESTSP[ 4] > 0 THEN
  7475  16   31:4    77                       TRY2LRN( 35, 38);
  7476  16   31:3    81                     IF PRIESTSP[ 5] > 0 THEN
  7477  16   31:4    94                       TRY2LRN( 39, 44);
  7478  16   31:3    98                     IF PRIESTSP[ 6] > 0 THEN
  7479  16   31:4   111                       TRY2LRN( 45, 48);
  7480  16   31:3   115                     IF PRIESTSP[ 7] > 0 THEN
  7481  16   31:4   128                       TRY2LRN( 49, 50)
  7482  16   31:2   130                   END
  7483  16   31:0   132               END;  (* TRYPRI *)
  7484  16   31:0   144               
  7485  16   31:0   144               
  7486  16   28:0     0             BEGIN  (* TRYLEARN *)
  7487  16   28:1     0               LEARNED := FALSE;
  7488  16   28:1     3               TRYMAGE;
  7489  16   28:1     5               TRYPRI;
  7490  16   28:1     7               IF LEARNED THEN
  7491  16   28:2    10                 BEGIN
  7492  16   28:3    10                   PRINTSTR( INNWIN, 'YOU LEARNED NEW SPELLS!!!!');
  7493  16   28:3    45                   PRINTCR(  INNWIN)
  7494  16   28:2    48                 END;
  7495  16   28:1    51               SETSPELS
  7496  16   28:0    51             END;   (* TRYLEARN *)
  7497  16   28:0    66         
  7498  16   28:0    66         
  7499  16   32:D     1           PROCEDURE GAINLOST;  (* P010A20 *)
  7500  16   32:D     1           
  7501  16   32:D     1             VAR
  7502  16   32:D     1                  ATTRVAL : INTEGER;
  7503  16   32:D     2                  ATTRIBX : TATTRIB;
  7504  16   32:D     3           
  7505  16   32:D     3           
  7506  16   33:D     1             PROCEDURE PRATTRIB;  (* P010A21 *)
  7507  16   33:D     1             
  7508  16   33:0     0               BEGIN
  7509  16   33:1     0                 CASE ATTRIBX OF
  7510  16   33:1     5                   STRENGTH:  PRINTSTR( INNWIN, 'STRENGTH');
  7511  16   33:1    24                         IQ:  PRINTSTR( INNWIN, 'I.Q.');
  7512  16   33:1    39                      PIETY:  PRINTSTR( INNWIN, 'PIETY');
  7513  16   33:1    55                   VITALITY:  PRINTSTR( INNWIN, 'VITALITY');
  7514  16   33:1    74                    AGILITY:  PRINTSTR( INNWIN, 'AGILITY');
  7515  16   33:1    92                       LUCK:  PRINTSTR( INNWIN, 'LUCK');
  7516  16   33:1   107                 END;
  7517  16   33:1   126                 PRINTCR( INNWIN)
  7518  16   33:0   129               END;  (* PRATTRIB *)
  7519  16   33:0   144               
  7520  16   33:0   144               
  7521  16   34:D     1             PROCEDURE OLDAGE;  (* P010A22 *)
  7522  16   34:D     1             
  7523  16   34:0     0               BEGIN
  7524  16   34:1     0                 PRINTSTR( INNWIN, '** YOU HAVE DIED OF OLD AGE **');
  7525  16   34:1    39                 PRINTCR(  INNWIN);
  7526  16   34:1    45                 CHARACTR[ PARTYX].STATUS := LOST;
  7527  16   34:1    56                 CHARACTR[ PARTYX].HPLEFT := 0;
  7528  16   34:1    67                 EXIT( GAINLOST)
  7529  16   34:0    71               END;
  7530  16   34:0    84           
  7531  16   34:0    84           
  7532  16   32:0     0             BEGIN (* GAINLOST *)
  7533  16   32:1     0               FOR ATTRIBX := STRENGTH TO LUCK DO
  7534  16   32:2    11                 BEGIN
  7535  16   32:3    11                   IF (RANDOM MOD 4) <> 0 THEN
  7536  16   32:4    22                     BEGIN
  7537  16   32:5    22                       ATTRVAL := CHARACTR[ PARTYX].ATTRIB[ ATTRIBX];
  7538  16   32:5    38                       IF (RANDOM MOD 130) <
  7539  16   32:5    47                          (CHARACTR[ PARTYX].AGE DIV 52) THEN
  7540  16   32:6    61                         IF (ATTRVAL = 18) AND
  7541  16   32:6    64                            ((RANDOM MOD 6) <> 4) THEN
  7542  16   32:6    76                           (* NOTHING *)
  7543  16   32:6    76                         ELSE
  7544  16   32:7    78                           BEGIN
  7545  16   32:8    78                             ATTRVAL := ATTRVAL - 1;
  7546  16   32:8    83                             PRINTSTR( INNWIN, 'YOU LOST ');
  7547  16   32:8   101                             PRATTRIB;
  7548  16   32:8   103                             IF ATTRIBX = VITALITY THEN
  7549  16   32:9   108                               IF ATTRVAL = 2 THEN
  7550  16   32:0   113                                 OLDAGE
  7551  16   32:7   113                           END
  7552  16   32:5   115                       ELSE
  7553  16   32:6   117                         BEGIN
  7554  16   32:7   117                           IF ATTRVAL <> 18 THEN
  7555  16   32:8   122                             BEGIN
  7556  16   32:9   122                               ATTRVAL := ATTRVAL + 1;
  7557  16   32:9   127                               PRINTSTR( INNWIN, 'YOU GAINED ');
  7558  16   32:9   147                               PRATTRIB
  7559  16   32:8   147                             END
  7560  16   32:6   149                         END;
  7561  16   32:5   149                       CHARACTR[ PARTYX].ATTRIB[ ATTRIBX] := ATTRVAL
  7562  16   32:4   162                     END
  7563  16   32:2   164                 END
  7564  16   32:0   164             END;  (* GAINLOST *)
  7565  16   32:0   190         
  7566  16   32:0   190         
  7567  16   26:0     0           BEGIN  (* MADELEV *)
  7568  16   26:1     0             PRINTSTR( INNWIN, 'YOU MADE A LEVEL!');
  7569  16   26:1    26             PRINTCR(  INNWIN);
  7570  16   26:1    32             CHARACTR[ PARTYX].CHARLEV := CHARACTR[ PARTYX].CHARLEV + 1;
  7571  16   26:1    53             IF CHARACTR[ PARTYX].CHARLEV > CHARACTR[ PARTYX].MAXLEVAC THEN
  7572  16   26:2    74               CHARACTR[ PARTYX].MAXLEVAC := CHARACTR[ PARTYX].CHARLEV;
  7573  16   26:1    93             SETSPELS;
  7574  16   26:1    95             TRYLEARN;
  7575  16   26:1    97             GAINLOST;
  7576  16   26:1    99             
  7577  16   26:1    99             NEWHPMAX := 0;
  7578  16   26:1   102             FOR CHARLEV := 1 TO CHARACTR[ PARTYX].CHARLEV DO
  7579  16   26:2   121               NEWHPMAX := NEWHPMAX + MOREHP;
  7580  16   26:1   136             IF CHARACTR[ PARTYX].CLASS = SAMURAI THEN
  7581  16   26:2   149               NEWHPMAX := NEWHPMAX + MOREHP;
  7582  16   26:1   157             IF NEWHPMAX <= CHARACTR[ PARTYX].HPMAX THEN
  7583  16   26:2   170               NEWHPMAX := CHARACTR[ PARTYX].HPMAX + 1;
  7584  16   26:1   183             CHARACTR[ PARTYX].HPMAX := NEWHPMAX
  7585  16   26:0   192         END;  (* MADELEV *)
  7586  16   26:0   208         
  7587  16   26:0   208         
  7588  16   25:0     0         BEGIN (* CHNEWLEV *)
  7589  16   25:1     0           MOVELEFT( IOCACHE[ GETREC( ZEXP, 0, SIZEOF( TEXP))],
  7590  16   25:1    13                     EXP2NEXT,
  7591  16   25:1    16                     SIZEOF( TEXP));
  7592  16   25:1    21           WITH CHARACTR[ PARTYX] DO
  7593  16   25:2    31             BEGIN
  7594  16   25:3    31               IF CHARLEV <= 12 THEN
  7595  16   25:4    40                 EXPNXTLV := EXP2NEXT[ CLASS][ CHARLEV]
  7596  16   25:3    59               ELSE
  7597  16   25:4    63                 BEGIN
  7598  16   25:5    63                   EXPNXTLV := EXP2NEXT[ CLASS][ 12];
  7599  16   25:5    80                   FOR BIGLEV := 13 TO CHARLEV DO
  7600  16   25:6   101                     ADDLONGS( EXPNXTLV, EXP2NEXT[ CLASS][ 0])
  7601  16   25:4   116                 END;
  7602  16   25:4   129                 
  7603  16   25:3   129               IF TESTLONG( EXPNXTLV, EXP) <= 0 THEN
  7604  16   25:4   146                 MADELEV
  7605  16   25:3   146               ELSE
  7606  16   25:4   150                 BEGIN
  7607  16   25:5   150                   PRINTSTR( INNWIN, 'YOU NEED ');
  7608  16   25:5   168                   SUBLONGS( EXPNXTLV, EXP);
  7609  16   25:5   179                   PRNTLONG( INNWIN, EXPNXTLV);
  7610  16   25:5   188                   PRINTSTR( INNWIN, ' MORE');
  7611  16   25:5   202                   PRINTCR(  INNWIN);
  7612  16   25:5   208                   PRINTSTR( INNWIN, 'EXPERIENCE POINTS TO MAKE LEVEL');
  7613  16   25:5   248                   PRINTCR(  INNWIN)
  7614  16   25:4   251                 END
  7615  16   25:2   254             END
  7616  16   25:0   254         END;  (* CHNEWLEV *)
  7617  16   25:0   268         
  7618  16   25:0   268         
  7619  16   35:D     1       PROCEDURE TAKENAP( HPADD:   INTEGER;  (* P010A23 *)
  7620  16   35:D     2                          GOLDAMT: INTEGER);
  7621  16   35:D     3       
  7622  16   35:D     3         VAR
  7623  16   35:D     3              GOLD4NAP : TWIZLONG;
  7624  16   35:D     6              PAUSEX   : INTEGER;
  7625  16   35:D     7       
  7626  16   35:D     7       
  7627  16   36:D     1         PROCEDURE HEALHP;  (* P010A24 *)
  7628  16   36:D     1         
  7629  16   36:0     0           BEGIN
  7630  16   36:1     0             CHARACTR[ PARTYX].HPLEFT := CHARACTR[ PARTYX].HPLEFT + HPADD;
  7631  16   36:1    23             IF CHARACTR[ PARTYX].HPLEFT > CHARACTR[ PARTYX].HPMAX THEN
  7632  16   36:2    44               CHARACTR[ PARTYX].HPLEFT := CHARACTR[ PARTYX].HPMAX;
  7633  16   36:1    63             SUBLONGS( CHARACTR[ PARTYX].GOLD, GOLD4NAP);
  7634  16   36:1    78             MVCURSOR( INNWIN, 0, 0);
  7635  16   36:1    86             CENTSTR(  INNWIN, CONCAT( CHARACTR[ PARTYX].NAME, 
  7636  16   36:1   107                                       ' IS HEALING UP.'));
  7637  16   36:1   134             PRINTCR(  INNWIN);
  7638  16   36:1   140             PRINTCR(  INNWIN);
  7639  16   36:1   146             PRINTSTR( INNWIN, '        HIT POINTS (');
  7640  16   36:1   175             PRINTNUM( INNWIN, CHARACTR[ PARTYX].HPLEFT, 5);
  7641  16   36:1   191             PRINTCHR( INNWIN, '/');
  7642  16   36:1   198             PRINTNUM( INNWIN, CHARACTR[ PARTYX].HPMAX, 5);
  7643  16   36:1   214             PRINTCHR( INNWIN, ')');
  7644  16   36:1   221             PRINTCR(  INNWIN);
  7645  16   36:1   227             PRINTSTR( INNWIN, '              GOLD  ');
  7646  16   36:1   256             PRNTLONG( INNWIN, CHARACTR[ PARTYX].GOLD);
  7647  16   36:1   271             FOR PAUSEX := 1 TO 500 DO
  7648  16   36:0   287               ;
  7649  16   36:0   297             
  7650  16   36:0   297           END;  (* HEALHP *)
  7651  16   36:0   312           
  7652  16   36:0   312           
  7653  16   35:0     0         BEGIN  (* TAKENAP *)
  7654  16   35:1     0           CLEARWIN( INNWIN, TRUE);
  7655  16   35:1     7           GOLD4NAP.HIGH := 0;
  7656  16   35:1    10           GOLD4NAP.MID  := 0;
  7657  16   35:1    13           GOLD4NAP.LOW  := GOLDAMT;
  7658  16   35:1    16           IF GOLDAMT > 0 THEN
  7659  16   35:2    21             WHILE (TESTLONG( CHARACTR[ PARTYX].GOLD, GOLD4NAP) >= 0) AND
  7660  16   35:2    39                   (CHARACTR[ PARTYX].HPLEFT < CHARACTR[ PARTYX].HPMAX) AND
  7661  16   35:2    59                   (NOT CHKKEYBD) DO
  7662  16   35:3    68               HEALHP
  7663  16   35:1    68           ELSE
  7664  16   35:2    74               CENTSTR( INNWIN, CONCAT( CHARACTR[ PARTYX].NAME,
  7665  16   35:2    95                                        ' IS NAPPING.'));
  7666  16   35:1   119           IF CHKKEYBD THEN
  7667  16   35:2   126             GETKEY;
  7668  16   35:1   129           CLEARWIN( INNWIN, TRUE);
  7669  16   35:1   136           CHNEWLEV;
  7670  16   35:1   138           SETSPELS;
  7671  16   35:1   140           MVCURSOR( INNWIN, 0, 9);
  7672  16   35:1   148           CENTSTR(  INNWIN, 'PRESS (RETURN) TO LEAVE');
  7673  16   35:1   180           REPEAT
  7674  16   35:2   180             GETKEY
  7675  16   35:1   180           UNTIL INCHAR = CHR( CRETURN);
  7676  16   35:1   188           INCHAR := CHR( 0)
  7677  16   35:0   189         END;   (* TAKENAP *)
  7678  16   35:0   208         
  7679  16   35:0   208         
  7680  16   15:0     0       BEGIN  (* ADVNTINN *)
  7681  16   15:1     0         INNWIN := GETWIN( 0, 2, 40, 12, 8, TRUE);
  7682  16   15:1    13         REPEAT
  7683  16   15:2    13           GETWHO;
  7684  16   15:2    15           IF CHARACTR[ PARTYX].STATUS = OK THEN
  7685  16   15:3    26             REPEAT
  7686  16   15:4    26               INNMENU;
  7687  16   15:4    28               GETKEY;
  7688  16   15:4    31               CASE ORD( INCHAR) OF
  7689  16   15:4    34                  STABLES:  TAKENAP(  0,   0);
  7690  16   15:4    40                     COTS:  TAKENAP(  1,  10);
  7691  16   15:4    46                  ECONOMY:  TAKENAP(  3,  50);
  7692  16   15:4    52                 MERCHANT:  TAKENAP(  7, 200);
  7693  16   15:4    60                    ROYAL:  TAKENAP( 10, 500);
  7694  16   15:4    68               END;
  7695  16   15:4    86               CHARINFO( PARTYX)
  7696  16   15:3    87             UNTIL (INCHAR = CHR( CRETURN)) OR
  7697  16   15:3    92                   (CHARACTR[ PARTYX].STATUS <> OK)
  7698  16   15:1   101         UNTIL FALSE
  7699  16   15:0   104       END;  (* ADVNTINN *)
  7700  16   15:0   124       
  7701  16   15:0   124       
  7702  16   37:D     1     PROCEDURE EXTCASTL;  (* P010A25 *)
  7703  16   37:D     1     
  7704  16   37:0     0       BEGIN
  7705  16   37:1     0         XGOTO := XEDGTOWN;
  7706  16   37:1     4         EXIT( CASTLE)
  7707  16   37:0     8       END;
  7708  16   37:0    20       
  7709  16   37:0    20       
  7710  16    1:0     0     BEGIN  (* CASTLE  P010A01 *)
  7711  16    1:1     0       CLEARWIN( MAINWIN, FALSE);
  7712  16    1:1     7       IF CHARSWIN = NIL THEN
  7713  16    1:2    14         CHARSWIN := GETWIN( 0, 15, 40, 9, 3, FALSE);
  7714  16    1:1    28       IF CASTTIT = NIL THEN
  7715  16    1:2    35         BEGIN
  7716  16    1:3    35           CASTTIT := GETWIN( 16, 0, 8, 3, 7, TRUE);
  7717  16    1:3    49           PRINTSTR( CASTTIT, 'CASTLE')
  7718  16    1:2    61         END;
  7719  16    1:1    64       DSPHEAD;
  7720  16    1:1    66       IF PARTYCNT > 0 THEN
  7721  16    1:2    71         DSPPARTY;
  7722  16    1:1    73       ACMOD2   := 0;
  7723  16    1:1    77       LIGHT    := 0;
  7724  16    1:1    81       IDMONSTR := 0;
  7725  16    1:1    85       CHSTALRM := 0;
  7726  16    1:1    89       ATTK012  := 0;
  7727  16    1:1    93       FIZZLES  := 0;
  7728  16    1:1    97       IF XGOTO2 <> XBOLTAC THEN
  7729  16    1:2   104         DSPPARTY;
  7730  16    1:1   106       XGOTO2 := XGILGAMS;
  7731  16    1:1   110       IF XGOTO = XGILGAMS THEN
  7732  16    1:2   117         GILGAMSH;
  7733  16    1:1   119       REPEAT
  7734  16    1:2   119         TEMPWIN := GETWIN( 7, 4, 26, 7, 6, TRUE);
  7735  16    1:2   133         BASE04 := MENU( TEMPWIN, CONCAT( 
  7736  16    1:2   136           'G)ILGAMESH''S TAVERN/A)DVENTURER''S INN/T)EMPLE OF CANT/',
  7737  16    1:2   204           'B)OLTAC''S TRADING POST/E)DGE OF TOWN'));
  7738  16    1:2   256         DELWIN( TEMPWIN, FALSE);
  7739  16    1:2   263         CASE BASE04 OF
  7740  16    1:2   266           0:  GILGAMSH;
  7741  16    1:2   270           1:  IF PARTYCNT > 0 THEN
  7742  16    1:4   275                 ADVNTINN;
  7743  16    1:4   279               
  7744  16    1:2   279           2:  IF PARTYCNT > 0 THEN
  7745  16    1:4   284                 GOTEMPLE;
  7746  16    1:4   288               
  7747  16    1:2   288           3:  IF PARTYCNT > 0 THEN
  7748  16    1:4   293                 GOBOLTAC;
  7749  16    1:4   297               
  7750  16    1:2   297           4:  EXTCASTL
  7751  16    1:2   297         END
  7752  16    1:1   318       UNTIL FALSE
  7753  16    1:0   318     END;   (* CASTLE  P010A01 *)
  7754  16    1:0   336   
  7755  16    1:0   336 (*$I WIZ3C:CASTLE2   *)
  7756  16    1:0   336                       
  7756  16    1:0   336 (*$I WIZ3C:ROLLER    *)
  7757  17    1:D     1   SEGMENT PROCEDURE ROLLER;   (* P010B01 *)
  7758  17    1:D     1   
  7759  17    1:D     1     VAR
  7760  17    1:D     1          CHARREC  : TCHAR;
  7761  17    1:D   105          TEMPX    : INTEGER;  (* MULTIPLE USES *)
  7762  17    1:D   106          CHARACX  : INTEGER;
  7763  17    1:D   107          UNUSEDXX : INTEGER;
  7764  17    1:D   108          CHARNAME : STRING[ 30];
  7765  17    1:D   124          UNUSEDYY : ARRAY[ 1..25] OF INTEGER;
  7766  17    1:D   149          CHG2LST  : ARRAY[ FIGHTER..NINJA] OF BOOLEAN;
  7767  17    1:D   157          BASEATTR : ARRAY[ STRENGTH..LUCK] OF INTEGER;
  7768  17    1:D   163          SIXATTR2 : ARRAY[ STRENGTH..LUCK] OF INTEGER;
  7769  17    1:D   169          SVAWARDS : INTEGER;
  7770  17    1:D   170   
  7771  17    1:D   170   
  7772  17    2:D     1     PROCEDURE GETPASS(     PASSWIN:  TWINDOWP;  (* P010B02 *)
  7773  17    2:D     2                        VAR PASSWORD: STRING);
  7774  17    2:D     3     
  7775  17    2:D     3       VAR
  7776  17    2:D     3            UNUSEDXX : INTEGER;
  7777  17    2:D     4            RANDX    : INTEGER;
  7778  17    2:D     5            CHRCNT   : INTEGER;
  7779  17    2:D     6       
  7780  17    2:0     0       BEGIN
  7781  17    2:1     0         CHRCNT := 0;
  7782  17    2:1     3         REPEAT
  7783  17    2:2     3           GETKEY;
  7784  17    2:2     6           IF INCHAR <> CHR( CRETURN) THEN
  7785  17    2:3    11             IF CHRCNT < 15 THEN
  7786  17    2:4    16               BEGIN
  7787  17    2:5    16                 FOR RANDX := 0 TO (RANDOM MOD 2) DO
  7788  17    2:6    33                   PRINTCHR( PASSWIN, CHR( 88));
  7789  17    2:5    45                 CHRCNT := CHRCNT + 1;
  7790  17    2:5    50                 PASSWORD[ CHRCNT] := INCHAR
  7791  17    2:4    52               END
  7792  17    2:3    54             ELSE
  7793  17    2:4    56               RINGBELL
  7794  17    2:1    56         UNTIL INCHAR = CHR( CRETURN);
  7795  17    2:1    64         PRINTCR( PASSWIN);
  7796  17    2:1    68         PASSWORD[ 0] := CHR( CHRCNT)
  7797  17    2:0    71       END;
  7798  17    2:0    88       
  7799  17    2:0    88       
  7800  17    3:D     3     FUNCTION GTCHGLST : BOOLEAN;  (* P010B03 *)
  7801  17    3:D     3     
  7802  17    3:0     0       BEGIN
  7803  17    3:1     0         CHG2LST[ FIGHTER] :=  SIXATTR2[ STRENGTH] >= 11;
  7804  17    3:1    18         
  7805  17    3:1    18         CHG2LST[ MAGE]    :=  SIXATTR2[ IQ] >= 11;
  7806  17    3:1    36         
  7807  17    3:1    36         CHG2LST[ PRIEST]  := (SIXATTR2[ PIETY] >= 11)   AND
  7808  17    3:1    53                              (CHARREC.ALIGN <> NEUTRAL);
  7809  17    3:1    60                              
  7810  17    3:1    60         CHG2LST[ THIEF]   := (SIXATTR2[ AGILITY] >= 11) AND
  7811  17    3:1    77                              (CHARREC.ALIGN <> GOOD);
  7812  17    3:1    84                              
  7813  17    3:1    84         CHG2LST[ BISHOP]  := (SIXATTR2[ IQ] >= 12)      AND
  7814  17    3:1   101                              (SIXATTR2[ PIETY] >= 12)   AND
  7815  17    3:1   112                              (CHARREC.ALIGN <> NEUTRAL);
  7816  17    3:1   119                             
  7817  17    3:1   119         CHG2LST[ SAMURAI] := (SIXATTR2[ STRENGTH] >= 15) AND
  7818  17    3:1   136                              (SIXATTR2[ IQ] >= 11)       AND
  7819  17    3:1   147                              (SIXATTR2[ PIETY] >= 10)    AND
  7820  17    3:1   158                              (SIXATTR2[ VITALITY] >= 14) AND
  7821  17    3:1   169                              (SIXATTR2[ AGILITY] >= 10)  AND
  7822  17    3:1   180                              (CHARREC.ALIGN <> EVIL);
  7823  17    3:1   187                             
  7824  17    3:1   187         CHG2LST[ LORD]    := (SIXATTR2[ STRENGTH] >= 15) AND
  7825  17    3:1   204                              (SIXATTR2[ IQ] >= 12)       AND
  7826  17    3:1   215                              (SIXATTR2[ PIETY] >= 12)    AND
  7827  17    3:1   226                              (SIXATTR2[ VITALITY] >= 15) AND
  7828  17    3:1   237                              (SIXATTR2[ AGILITY] >= 14)  AND
  7829  17    3:1   248                              (SIXATTR2[ LUCK] >= 15)     AND
  7830  17    3:1   259                              (CHARREC.ALIGN = GOOD);
  7831  17    3:1   266                              
  7832  17    3:1   266         CHG2LST[ NINJA]   := (SIXATTR2[ STRENGTH] >= 17) AND
  7833  17    3:1   283                              (SIXATTR2[ IQ] >= 17)       AND
  7834  17    3:1   294                              (SIXATTR2[ PIETY] >= 17)    AND
  7835  17    3:1   305                              (SIXATTR2[ VITALITY] >= 17) AND
  7836  17    3:1   316                              (SIXATTR2[ AGILITY] >= 17)  AND
  7837  17    3:1   327                              (SIXATTR2[ LUCK] >= 17)     AND
  7838  17    3:1   338                              (CHARREC.ALIGN = EVIL);
  7839  17    3:1   345                             
  7840  17    3:1   345         GTCHGLST := CHG2LST[ FIGHTER] OR
  7841  17    3:1   353                     CHG2LST[ MAGE]    OR
  7842  17    3:1   362                     CHG2LST[ PRIEST]  OR
  7843  17    3:1   371                     CHG2LST[ THIEF]   OR
  7844  17    3:1   380                     CHG2LST[ BISHOP]  OR
  7845  17    3:1   389                     CHG2LST[ LORD]    OR
  7846  17    3:1   398                     CHG2LST[ SAMURAI] OR
  7847  17    3:1   407                     CHG2LST[ NINJA]
  7848  17    3:0   414       END;
  7849  17    3:0   430       
  7850  17    3:0   430       
  7851  17    4:D     1     PROCEDURE SETBASE;  (* P010B04 *)
  7852  17    4:D     1     
  7853  17    5:D     1       PROCEDURE SETXBASE( BASESTR: STRING);  (* P010B05 *)
  7854  17    5:D    43       
  7855  17    5:D    43         VAR
  7856  17    5:D    43              ATTRI : INTEGER;
  7857  17    5:D    44              ATTR  : TATTRIB;
  7858  17    5:D    45       
  7859  17    5:0     0         BEGIN
  7860  17    5:1     0           ATTR := STRENGTH;
  7861  17    5:1     8           FOR ATTRI := 1 TO 6 DO
  7862  17    5:2    21             BEGIN
  7863  17    5:3    21               BASEATTR[ ATTR] := ORD( BASESTR[ ATTRI]) - ORD( '0');
  7864  17    5:3    37               ATTR := SUCC( ATTR)
  7865  17    5:2    41             END
  7866  17    5:0    43         END;  (* SETXBASE *)
  7867  17    5:0    66         
  7868  17    5:0    66         
  7869  17    4:0     0       BEGIN  (* SETBASE *)
  7870  17    4:1     0         CASE CHARREC.RACE OF            (*  S, I, P, V, A, L *)
  7871  17    4:1     5            HUMAN:  SETXBASE( '885889'); (*  8  8  5  8  8  9 *)
  7872  17    4:1    18              ELF:  SETXBASE( '7::696'); (*  7 10 10  6  9  6 *)
  7873  17    4:1    31            DWARF:  SETXBASE( ':7::56'); (* 10  7 10 10  5  6 *)
  7874  17    4:1    44            GNOME:  SETXBASE( '77:8:7'); (*  7  7 10  8 10  7 *)
  7875  17    4:1    57           HOBBIT:  SETXBASE( '5776:?')  (*  5  7  7  6 10 15 *)
  7876  17    4:1    66         END
  7877  17    4:0    88       END;  (* SETBASE *)
  7878  17    4:0   100       
  7879  17    4:0   100       
  7880  17    6:D     1     PROCEDURE GETCHARC( VAR BUFFER: TCHAR;  (* P010B06 *)
  7881  17    6:D     2                             CHINDX: INTEGER);
  7882  17    6:D     3     
  7883  17    6:0     0       BEGIN
  7884  17    6:1     0         MOVELEFT( IOCACHE[ GETREC(  ZCHAR, CHINDX, SIZEOF( TCHAR))],
  7885  17    6:1    13                   BUFFER,
  7886  17    6:1    15                   SIZEOF( TCHAR))
  7887  17    6:0    20       END;
  7888  17    6:0    32       
  7889  17    6:0    32       
  7890  17    7:D     1     PROCEDURE PUTCHARC( VAR BUFFER: TCHAR;  (* P010B07 *)
  7891  17    7:D     2                             CHINDX: INTEGER);
  7892  17    7:D     3     
  7893  17    7:0     0       BEGIN
  7894  17    7:1     0         MOVELEFT( BUFFER,
  7895  17    7:1     2                   IOCACHE[ GETRECW( ZCHAR, CHINDX, SIZEOF( TCHAR))],
  7896  17    7:1    15                   SIZEOF( TCHAR))
  7897  17    7:0    20       END;
  7898  17    7:0    32       
  7899  17    7:0    32       
  7900  17    8:D     1     PROCEDURE GTSCNTOC;  (* P010B08 *)
  7901  17    8:D     1     
  7902  17    8:0     0       BEGIN
  7903  17    8:1     0         MOVELEFT( IOCACHE[ GETREC( ZZERO, 0, SIZEOF( SCNTOC))],
  7904  17    8:1    13                   SCNTOC,
  7905  17    8:1    17                   SIZEOF( SCNTOC))
  7906  17    8:0    22       END;
  7907  17    8:0    34       
  7908  17    8:0    34       
  7909  17    9:D     1     PROCEDURE DSP20NM;  (* P010B09 *)
  7910  17    9:D     1     
  7911  17    9:D     1       VAR
  7912  17    9:D     1            TEMPCNT  : INTEGER;
  7913  17    9:D     2            UNUSEDXX : INTEGER;
  7914  17    9:D     3            LINEX    : INTEGER;
  7915  17    9:D     4            CHARI    : INTEGER;
  7916  17    9:D     5     
  7917  17    9:0     0       BEGIN
  7918  17    9:1     0         CLEARWIN( MAINWIN, FALSE);
  7919  17    9:1     7         PROTWIN(  TRAINTIT, TRUE);
  7920  17    9:1    14         TRAINTIT^.HEAD.VPOS := 21;
  7921  17    9:1    23         LINEX := 0;
  7922  17    9:1    26         FOR CHARI := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
  7923  17    9:2    45           BEGIN
  7924  17    9:3    45             GETCHARC( CHARREC, CHARI);
  7925  17    9:3    51             IF CHARREC.STATUS <> LOST THEN
  7926  17    9:4    58               BEGIN
  7927  17    9:5    58                 MVCURSOR( MAINWIN, 0, LINEX);
  7928  17    9:5    66                 LINEX := LINEX + 1;
  7929  17    9:5    71                 PRINTSTR( MAINWIN, CHARREC.NAME);
  7930  17    9:5    80                 WHILE MAINWIN^.HEAD.HCURSOR <= 15 DO
  7931  17    9:6    92                   PRINTCHR( MAINWIN, ' ');
  7932  17    9:5   101                 PRINTCHR( MAINWIN, 'L');
  7933  17    9:5   108                 PRINTNUM( MAINWIN, CHARREC.CHARLEV, 3);
  7934  17    9:5   118                 PRINTCHR( MAINWIN, ' ');
  7935  17    9:5   125                 PRINTSTR( MAINWIN, COPY( SCNTOC.ALIGN[ CHARREC.ALIGN], 1, 1));
  7936  17    9:5   148                 PRINTCHR( MAINWIN, '-');
  7937  17    9:5   155                 PRINTSTR( MAINWIN, COPY( SCNTOC.CLASS[ CHARREC.CLASS], 1, 3));
  7938  17    9:5   178                 PRINTCHR( MAINWIN, ' ');
  7939  17    9:5   185                 PRINTSTR( MAINWIN, COPY( SCNTOC.RACE[  CHARREC.RACE],  1, 3));
  7940  17    9:5   208                 PRINTCHR( MAINWIN, ' ');
  7941  17    9:5   215                 IF CHARREC.STATUS >= DEAD THEN
  7942  17    9:6   222                   IF CHARREC.INMAZE THEN
  7943  17    9:7   227                     PRINTSTR( MAINWIN, 'D/O')
  7944  17    9:6   236                   ELSE
  7945  17    9:7   241                     PRINTSTR( MAINWIN, 'DEAD')
  7946  17    9:5   251                 ELSE
  7947  17    9:6   256                   IF CHARREC.INMAZE THEN
  7948  17    9:7   261                     PRINTSTR( MAINWIN, 'OUT')
  7949  17    9:4   270               END
  7950  17    9:2   273           END;
  7951  17    9:2   280           
  7952  17    9:1   280           MVCURSOR( TRAINTIT, 0, 0);
  7953  17    9:1   288           PRINTSTR( TRAINTIT, ' PRESS (RETURN) ');
  7954  17    9:1   313           
  7955  17    9:1   313           REPEAT
  7956  17    9:2   313             FOR TEMPCNT := 0 TO 3333 DO
  7957  17    9:3   326               IF CHKKEYBD THEN
  7958  17    9:4   333                 BEGIN
  7959  17    9:5   333                   GETKEY;
  7960  17    9:5   336                   INCHAR := CHR( 0);
  7961  17    9:5   339                   DELWIN( TRAINTIT, FALSE);
  7962  17    9:5   346                   EXIT( DSP20NM)
  7963  17    9:4   350                 END;
  7964  17    9:2   357             UNPROWIN( TRAINTIT, TRUE);
  7965  17    9:2   364             PROTWIN(  TRAINTIT, TRUE)
  7966  17    9:1   368           UNTIL FALSE
  7967  17    9:0   371       END;  (* DSP20NM *)
  7968  17    9:0   398       
  7969  17    9:0   398       
  7970  17   10:D     1     PROCEDURE TRAINING;  (* P010B0A *)
  7971  17   10:D     1     
  7972  17   10:D     1     VAR
  7973  17   10:D     1          TRAINWIN : TWINDOWP;
  7974  17   10:D     2          PASSSTR  : STRING;
  7975  17   10:D    43     
  7976  17   10:D    43     
  7977  17   11:D     1       PROCEDURE LOSECHAR;  (* P010B0B *)
  7978  17   11:D     1       
  7979  17   11:0     0         BEGIN
  7980  17   11:1     0           CHARREC.STATUS := LOST;
  7981  17   11:1     4           CHARREC.INMAZE := FALSE;
  7982  17   11:1     8           PUTCHARC( CHARREC, CHARACX);
  7983  17   11:1    16           GTSCNTOC
  7984  17   11:0    16         END;
  7985  17   11:0    30         
  7986  17   11:0    30         
  7987  17   12:D     1       PROCEDURE INSPECT;  (* P010B0C *)
  7988  17   12:D     1       
  7989  17   12:0     0         BEGIN
  7990  17   12:1     0           PARTYCNT := 1;
  7991  17   12:1     3           CHARACTR[ 0] := CHARREC;
  7992  17   12:1    13           CHARDISK[ 0] := CHARACX;
  7993  17   12:1    23           XGOTO := XINSPCT3;
  7994  17   12:1    27           DELWIN( TRAINWIN, FALSE);
  7995  17   12:1    34           EXIT( ROLLER)
  7996  17   12:0    38         END;
  7997  17   12:0    50         
  7998  17   12:0    50         
  7999  17   13:D     1       PROCEDURE RUSUREYN( DELSTR: STRING);  (* P010B0D *)
  8000  17   13:D    43       
  8001  17   13:0     0         BEGIN
  8002  17   13:1     0           CLEARWIN( MAINWIN, TRUE);
  8003  17   13:1    12           MVCURSOR( MAINWIN, 0, 10);
  8004  17   13:1    20           CENTSTR(  MAINWIN, 'ARE YOU SURE YOU WANT TO');
  8005  17   13:1    53           CENTSTR(  MAINWIN, CONCAT( DELSTR, ' (Y/N) ?'));
  8006  17   13:1    89           DRAWSCR( WINCHAIN);
  8007  17   13:1    95           REPEAT
  8008  17   13:2    95             GETKEY
  8009  17   13:1    95           UNTIL (INCHAR = 'Y') OR (INCHAR = 'N')
  8010  17   13:0   104         END;
  8011  17   13:0   122         
  8012  17   13:0   122         
  8013  17   14:D     1       PROCEDURE RITEPASS;  (* P010B0E *)
  8014  17   14:D     1       
  8015  17   14:D     1         VAR
  8016  17   14:D     1              ATTRX    : TATTRIB;
  8017  17   14:D     2              SPELLI   : INTEGER;
  8018  17   14:D     3              SPELLKN  : INTEGER;  (* MULTIPLE USES *)
  8019  17   14:D     4              MAXGOLD  : TWIZLONG;
  8020  17   14:D     7              AWARDSXX : PACKED ARRAY[ 0..15] OF BOOLEAN;
  8021  17   14:D     8              
  8022  17   14:D     8              
  8023  17   15:D     1         PROCEDURE ADJATTR( ATTRIB: TATTRIB;  (* P010B0F *)
  8024  17   15:D     2                            ADJVAL: INTEGER);
  8025  17   15:D     3         
  8026  17   15:0     0           BEGIN
  8027  17   15:1     0             IF ADJVAL < 0 THEN
  8028  17   15:2     5               BEGIN
  8029  17   15:3     5                 ADJVAL := RANDOM MOD (ABS( ADJVAL) + 1);
  8030  17   15:3    17                 IF (RANDOM MOD 100) > 49 THEN
  8031  17   15:4    28                   ADJVAL := - ADJVAL
  8032  17   15:2    28               END;
  8033  17   15:1    32             ADJVAL := CHARREC.ATTRIB[ ATTRIB] + ADJVAL;
  8034  17   15:1    44             IF ADJVAL < 3 THEN
  8035  17   15:2    49               ADJVAL := 3;
  8036  17   15:1    52             IF ADJVAL > 18 THEN
  8037  17   15:2    57               ADJVAL := 18;
  8038  17   15:1    60             CHARREC.ATTRIB[ ATTRIB] := ADJVAL
  8039  17   15:0    67           END;
  8040  17   15:0    82           
  8041  17   15:0    82           
  8042  17   16:D     1         PROCEDURE HALIKATI;  (* P010B10 *)
  8043  17   16:D     1         
  8044  17   16:0     0           BEGIN
  8045  17   16:1     0             CHARREC.SPELLSKN[ 1] := TRUE;
  8046  17   16:1     9             CHARREC.SPELLSKN[ 3] := TRUE;
  8047  17   16:1    18             CHARREC.MAGESP[ 1] := 2
  8048  17   16:0    26           END;
  8049  17   16:0    40           
  8050  17   16:0    40           
  8051  17   17:D     1         PROCEDURE DIOSBADI;  (* P010B11 *)
  8052  17   17:D     1         
  8053  17   17:0     0           BEGIN
  8054  17   17:1     0             CHARREC.SPELLSKN[ 23] := TRUE;
  8055  17   17:1     9             CHARREC.SPELLSKN[ 24] := TRUE;
  8056  17   17:1    18             CHARREC.PRIESTSP[ 1] := 2
  8057  17   17:0    26           END;
  8058  17   17:0    40           
  8059  17   17:0    40           
  8060  17   18:D     1         PROCEDURE CHOSALGN( AGOOD: BOOLEAN;  (* P010B12 *)
  8061  17   18:D     2                             BNEUT: BOOLEAN;
  8062  17   18:D     3                             CEVIL: BOOLEAN);
  8063  17   18:D     4         
  8064  17   18:0     0           BEGIN
  8065  17   18:1     0             CLEARWIN( MAINWIN, TRUE);
  8066  17   18:1     7             MVCURSOR( MAINWIN, 0, 10);
  8067  17   18:1    15             CENTSTR(  MAINWIN, 'CHOOSE ALIGNMENT FOR DESCENDANT:');
  8068  17   18:1    56             PRINTCR(  MAINWIN);
  8069  17   18:1    62             IF AGOOD THEN
  8070  17   18:2    65               CENTSTR( MAINWIN, 'A)    GOOD');
  8071  17   18:1    84             IF BNEUT THEN
  8072  17   18:2    87               CENTSTR( MAINWIN, 'B) NEUTRAL');
  8073  17   18:1   106             IF CEVIL THEN
  8074  17   18:2   109               CENTSTR( MAINWIN, 'C)    EVIL');
  8075  17   18:1   128             PRINTCR( MAINWIN);
  8076  17   18:1   134             CENTSTR( MAINWIN, 'SELECT ALIGNMENT >');
  8077  17   18:1   161             REPEAT
  8078  17   18:2   161               GETKEY
  8079  17   18:1   161             UNTIL  ((INCHAR = 'A') AND (AGOOD) ) OR
  8080  17   18:1   169                    ((INCHAR = 'B') AND (BNEUT) ) OR
  8081  17   18:1   175                    ((INCHAR = 'C') AND (CEVIL) );
  8082  17   18:1   183                    
  8083  17   18:1   183             CASE ORD( INCHAR) OF
  8084  17   18:1   186               65:  CHARREC.ALIGN := GOOD;
  8085  17   18:1   192               66:  CHARREC.ALIGN := NEUTRAL;
  8086  17   18:1   198               67:  CHARREC.ALIGN := EVIL;
  8087  17   18:1   204             END
  8088  17   18:0   218           END;
  8089  17   18:0   232           
  8090  17   18:0   232           
  8091  17   19:D     1         PROCEDURE EXITRITE;  (* P010B13 *)
  8092  17   19:D     1         
  8093  17   19:0     0           BEGIN
  8094  17   19:1     0             PRINTCR( MAINWIN);
  8095  17   19:1     6             CENTSTR( MAINWIN, 'PRESS (RETURN)');
  8096  17   19:1    29             GETCR;
  8097  17   19:1    32             EXIT( RITEPASS)
  8098  17   19:0    36           END;
  8099  17   19:0    48           
  8100  17   19:0    48           
  8101  17   14:0     0         BEGIN  (* RITEPASS *)
  8102  17   14:1     0           CLEARWIN( MAINWIN, TRUE);
  8103  17   14:1     7           MVCURSOR( MAINWIN, 0, 10);
  8104  17   14:1    15           MOVELEFT( CHARREC.LOSTXYL.AWARDS[ 4], AWARDSXX, 2);
  8105  17   14:1    30           IF AWARDSXX[ 13] THEN
  8106  17   14:2    39             BEGIN
  8107  17   14:3    39               CENTSTR( MAINWIN, 'THIS CHARACTER IS ALREADY A LEGACY!');
  8108  17   14:3    83               EXITRITE
  8109  17   14:2    83             END;
  8110  17   14:1    85           IF  CHARREC.INMAZE OR
  8111  17   14:1    88              (CHARREC.LOSTXYL.LOCATION[ 3] <> 0) OR
  8112  17   14:1   100              (CHARREC.STATUS >= DEAD) THEN
  8113  17   14:2   108             BEGIN
  8114  17   14:3   108               CENTSTR( MAINWIN, 'YOUR CHARACTER MUST BE ALIVE');
  8115  17   14:3   145               CENTSTR( MAINWIN, 'AND IN THE CASTLE TO BE ABLE');
  8116  17   14:3   182               CENTSTR( MAINWIN, 'TO GENERATE A LEGACY.');
  8117  17   14:3   212               EXITRITE
  8118  17   14:2   212             END;
  8119  17   14:1   214           CENTSTR( MAINWIN, 'THE RITE OF PASSAGE CEREMONY');
  8120  17   14:1   251           CENTSTR( MAINWIN, 'NOW BEGINS.');
  8121  17   14:1   271           PRINTCR( MAINWIN);
  8122  17   14:1   277           CENTSTR( MAINWIN, 'THE TEMPLE PRIESTS LINK UP THIS');
  8123  17   14:1   317           CENTSTR( MAINWIN, 'ANCESTRAL SPIRIT WITH ITS');
  8124  17   14:1   351           CENTSTR( MAINWIN, 'DESCENDANT...');
  8125  17   14:1   373           PRINTCR( MAINWIN);
  8126  17   14:1   379           CENTSTR( MAINWIN, 'PRESS (RETURN)');
  8127  17   14:1   402           REPEAT
  8128  17   14:2   402             GETKEY
  8129  17   14:1   402           UNTIL INCHAR = CHR( CRETURN);
  8130  17   14:1   410           AWARDSXX[ 13] := TRUE;
  8131  17   14:1   418           MOVELEFT( AWARDSXX, CHARREC.LOSTXYL.AWARDS[ 4], 2);
  8132  17   14:1   433           CHARREC.AGE := 1040;
  8133  17   14:1   439           CHARREC.EXP.HIGH := 0;
  8134  17   14:1   443           CHARREC.EXP.MID  := 0;
  8135  17   14:1   447           CHARREC.EXP.LOW  := 0;
  8136  17   14:1   451           MAXGOLD.HIGH := 0;
  8137  17   14:1   454           MAXGOLD.MID  := 0;
  8138  17   14:1   457           MAXGOLD.LOW  := 500;
  8139  17   14:1   462           IF TESTLONG( MAXGOLD, CHARREC.GOLD) < 0 THEN
  8140  17   14:2   476             CHARREC.GOLD := MAXGOLD;
  8141  17   14:1   483           CHARREC.CHARLEV  := 1;
  8142  17   14:1   487           CHARREC.MAXLEVAC := 1;
  8143  17   14:1   491           CHARREC.POSS.POSSCNT  := 0;
  8144  17   14:1   495           CHARREC.HPCALCMD := 1;
  8145  17   14:1   499           CHARREC.ARMORCL  := 10;
  8146  17   14:1   503           CHARREC.HEALPTS  := 0;
  8147  17   14:1   507           CHARREC.SWINGCNT := 0;
  8148  17   14:1   511           CHARREC.LOSTXYL.LOCATION[ 1] := 0;
  8149  17   14:1   521           CHARREC.LOSTXYL.LOCATION[ 2] := 0;
  8150  17   14:1   531           CHARREC.LOSTXYL.LOCATION[ 3] := 0;
  8151  17   14:1   541           CHARREC.CRITHITM := FALSE;
  8152  17   14:1   545           FOR ATTRX := STRENGTH TO LUCK DO
  8153  17   14:2   556             ADJATTR( ATTRX, -3);
  8154  17   14:1   568           SPELLKN := 0;
  8155  17   14:1   571           FOR SPELLI := 1 TO 21 DO
  8156  17   14:2   582             IF CHARREC.SPELLSKN[ SPELLI] THEN
  8157  17   14:3   592               SPELLKN := SPELLKN + 1;
  8158  17   14:1   604           ADJATTR( IQ, (SPELLKN DIV 7));
  8159  17   14:1   610           SPELLKN := 0;
  8160  17   14:1   613           FOR SPELLI := 22 TO 50 DO
  8161  17   14:2   624             IF CHARREC.SPELLSKN[ SPELLI] THEN
  8162  17   14:3   634               SPELLKN := SPELLKN + 1;
  8163  17   14:1   646           ADJATTR( PIETY, (SPELLKN + 1) DIV 10);
  8164  17   14:1   654           FOR SPELLI := 1 TO 50 DO
  8165  17   14:2   665             CHARREC.SPELLSKN[ SPELLI] := FALSE;
  8166  17   14:1   681           FOR SPELLKN := 1 TO 7 DO
  8167  17   14:2   692             BEGIN
  8168  17   14:3   692               CHARREC.MAGESP[   SPELLKN] := 0;
  8169  17   14:3   702               CHARREC.PRIESTSP[ SPELLKN] := 0
  8170  17   14:2   710             END;
  8171  17   14:2   719             
  8172  17   14:1   719           CASE CHARREC.CLASS OF
  8173  17   14:1   724           
  8174  17   14:1   724              FIGHTER:  BEGIN
  8175  17   14:3   724                          CHOSALGN( TRUE, TRUE, TRUE);
  8176  17   14:3   729                          ADJATTR( STRENGTH, 2);
  8177  17   14:3   733                          CHARREC.HPLEFT := 10
  8178  17   14:2   733                        END;
  8179  17   14:2   739                      
  8180  17   14:1   739                 MAGE:  BEGIN
  8181  17   14:3   739                          CHOSALGN( TRUE, TRUE, TRUE);
  8182  17   14:3   744                          ADJATTR( AGILITY, 2);
  8183  17   14:3   748                          HALIKATI;
  8184  17   14:3   750                          CHARREC.HPLEFT := 4
  8185  17   14:2   750                        END;
  8186  17   14:2   756                      
  8187  17   14:1   756               PRIEST:  BEGIN
  8188  17   14:3   756                          CHOSALGN( TRUE, FALSE, TRUE);
  8189  17   14:3   761                          ADJATTR( VITALITY, 2);
  8190  17   14:3   765                          DIOSBADI;
  8191  17   14:3   767                          CHARREC.HPLEFT := 8
  8192  17   14:2   767                        END;
  8193  17   14:2   773                      
  8194  17   14:1   773                THIEF:  BEGIN
  8195  17   14:3   773                          CHOSALGN( FALSE, TRUE, TRUE);
  8196  17   14:3   778                          ADJATTR( AGILITY, 2);
  8197  17   14:3   782                          CHARREC.HPLEFT := 6
  8198  17   14:2   782                        END;
  8199  17   14:2   788                      
  8200  17   14:1   788               BISHOP:  BEGIN
  8201  17   14:3   788                          CHOSALGN( TRUE, FALSE, TRUE);
  8202  17   14:3   793                          ADJATTR( VITALITY, 2);
  8203  17   14:3   797                          HALIKATI;
  8204  17   14:3   799                          DIOSBADI;
  8205  17   14:3   801                          CHARREC.HPLEFT := 6
  8206  17   14:2   801                        END;
  8207  17   14:2   807                      
  8208  17   14:1   807              SAMURAI:  BEGIN
  8209  17   14:3   807                          CHOSALGN( TRUE, TRUE, FALSE);
  8210  17   14:3   812                          ADJATTR( STRENGTH, 2);
  8211  17   14:3   816                          HALIKATI;
  8212  17   14:3   818                          CHARREC.HPLEFT := 12
  8213  17   14:2   818                        END;
  8214  17   14:2   824                      
  8215  17   14:1   824                 LORD:  BEGIN
  8216  17   14:3   824                          CHARREC.ALIGN := GOOD;
  8217  17   14:3   828                          ADJATTR( STRENGTH, 2);
  8218  17   14:3   832                          DIOSBADI;
  8219  17   14:3   834                          CHARREC.HPLEFT := 12
  8220  17   14:2   834                        END;
  8221  17   14:2   840                      
  8222  17   14:1   840                NINJA:  BEGIN
  8223  17   14:3   840                          CHARREC.ALIGN := EVIL;
  8224  17   14:3   844                          ADJATTR( AGILITY, 2);
  8225  17   14:3   848                          CHARREC.HPLEFT := 7
  8226  17   14:2   848                        END;
  8227  17   14:1   854           END;
  8228  17   14:1   878           
  8229  17   14:1   878           CHARREC.HPMAX := CHARREC.HPLEFT;
  8230  17   14:1   884           PUTCHARC( CHARREC, CHARACX)
  8231  17   14:0   890         END;  (* RITEPASS *)
  8232  17   14:0   920         
  8233  17   14:0   920         
  8234  17   20:D     1       PROCEDURE DELCHAR;  (* P010B14 *)
  8235  17   20:D     1       
  8236  17   20:0     0         BEGIN
  8237  17   20:1     0           RUSUREYN( 'DELETE');
  8238  17   20:1    11           IF INCHAR = 'N' THEN
  8239  17   20:2    16             EXIT( DELCHAR);
  8240  17   20:1    20           LOSECHAR;
  8241  17   20:1    22           DELWIN( TRAINWIN, FALSE);
  8242  17   20:1    29           EXIT( TRAINING)
  8243  17   20:0    33         END;
  8244  17   20:0    46         
  8245  17   20:0    46         
  8246  17   21:D     1       PROCEDURE CHGCLASS;  (* P010B15 *)
  8247  17   21:D     1       
  8248  17   21:D     1         VAR
  8249  17   21:D     1              ATTRIBI  : TATTRIB;
  8250  17   21:D     2              CHGLSTX  : BOOLEAN;  (* NOT USED *)
  8251  17   21:D     3              CLASSX   : TCLASS;
  8252  17   21:D     4              CHGCLWIN : TWINDOWP;
  8253  17   21:D     5       
  8254  17   21:D     5       
  8255  17   22:D     1         PROCEDURE NOCHANGE;  (* P010B16 *)
  8256  17   22:D     1         
  8257  17   22:0     0           BEGIN
  8258  17   22:1     0             CHGCLWIN := GETWIN( 0, 10, 40, 4, 2, TRUE);
  8259  17   22:1    14             CENTSTR( CHGCLWIN, 'YOU DON''T QUALIFY FOR ANY CLASSES');
  8260  17   22:1    56             CENTSTR( CHGCLWIN, 'PRESS (RETURN)');
  8261  17   22:1    79             GETCR;
  8262  17   22:1    82             DELWIN( CHGCLWIN, FALSE);
  8263  17   22:1    89             EXIT( CHGCLASS)
  8264  17   22:0    93           END;  (* NOCHANGE *)
  8265  17   22:0   106           
  8266  17   22:0   106           
  8267  17   21:0     0         BEGIN  (* CHGCLASS *)
  8268  17   21:1     0           FOR ATTRIBI := STRENGTH TO LUCK DO
  8269  17   21:2    11             SIXATTR2[ ATTRIBI] := CHARREC.ATTRIB[ ATTRIBI];
  8270  17   21:1    34           CLEARWIN( MAINWIN, FALSE);
  8271  17   21:1    41           CHGLSTX := GTCHGLST;
  8272  17   21:1    47           IF ORD( CHG2LST[ FIGHTER]) +
  8273  17   21:1    55              ORD( CHG2LST[ MAGE])    +
  8274  17   21:1    64              ORD( CHG2LST[ PRIEST])  +
  8275  17   21:1    73              ORD( CHG2LST[ THIEF])   +
  8276  17   21:1    82              ORD( CHG2LST[ BISHOP])  +
  8277  17   21:1    91              ORD( CHG2LST[ SAMURAI]) +
  8278  17   21:1   100              ORD( CHG2LST[ LORD])    +
  8279  17   21:1   109              ORD( CHG2LST[ NINJA])     < 2 THEN
  8280  17   21:2   122             NOCHANGE;
  8281  17   21:1   124           CHGCLWIN := GETWIN( 13, 11, 14, 10, 2, TRUE);
  8282  17   21:1   137           FOR CLASSX := FIGHTER TO NINJA DO
  8283  17   21:2   148             IF CHG2LST[ CLASSX] AND
  8284  17   21:2   156                NOT ( CLASSX = CHARREC.CLASS) THEN
  8285  17   21:3   165               BEGIN
  8286  17   21:4   165                 PRINTCHR( CHGCLWIN, CHR( ORD('A') + ORD( CLASSX)));
  8287  17   21:4   172                 PRINTSTR( CHGCLWIN, ' )');
  8288  17   21:4   181                 PRINTSTR( CHGCLWIN, SCNTOC.CLASS[ CLASSX]);
  8289  17   21:4   191                 PRINTCR(  CHGCLWIN)
  8290  17   21:3   192               END;
  8291  17   21:1   202           MVCURSOR( MAINWIN, 0, 7);
  8292  17   21:1   210           CENTSTR(  MAINWIN, '(A)-(H) CHANGES, (RETURN) EXITS');
  8293  17   21:1   250           DELWIN( CHGCLWIN, FALSE);
  8294  17   21:1   256           
  8295  17   21:1   256           REPEAT
  8296  17   21:2   256             REPEAT
  8297  17   21:3   256               GETKEY
  8298  17   21:2   256             UNTIL (INCHAR = CHR( CRETURN)) OR
  8299  17   21:2   262                    ((ORD( INCHAR) >= ORD( 'A')) AND
  8300  17   21:2   265                     (ORD( INCHAR) <= ORD( 'H')));
  8301  17   21:2   272             IF INCHAR = CHR( CRETURN) THEN
  8302  17   21:3   277               EXIT( CHGCLASS);
  8303  17   21:2   281             CLASSX := FIGHTER;
  8304  17   21:2   284             WHILE INCHAR > 'A' DO
  8305  17   21:3   289               BEGIN
  8306  17   21:4   289                 CLASSX := SUCC( CLASSX);
  8307  17   21:4   294                 INCHAR := PRED( INCHAR)
  8308  17   21:3   297               END;
  8309  17   21:1   301           UNTIL CHG2LST[ CLASSX] AND ( NOT( CLASSX = CHARREC.CLASS));
  8310  17   21:1   318           
  8311  17   21:1   318           SETBASE;
  8312  17   21:1   320           FOR ATTRIBI := STRENGTH TO LUCK DO
  8313  17   21:2   331             CHARREC.ATTRIB[ ATTRIBI] := BASEATTR[ ATTRIBI];
  8314  17   21:1   354           CHARREC.CLASS := CLASSX;
  8315  17   21:1   358           CHARREC.CHARLEV := 1;
  8316  17   21:1   362           CHARREC.EXP.HIGH := 0;
  8317  17   21:1   366           CHARREC.EXP.MID  := 0;
  8318  17   21:1   370           CHARREC.EXP.LOW  := 0;
  8319  17   21:1   374           CHARREC.AGE := CHARREC.AGE + 52 * (RANDOM MOD 3) + 252;
  8320  17   21:1   394           IF CLASSX = MAGE THEN
  8321  17   21:2   399             CHARREC.SPELLSKN[ 3] := TRUE
  8322  17   21:1   406           ELSE IF CLASSX = PRIEST THEN
  8323  17   21:3   415             CHARREC.SPELLSKN[ 23] := TRUE;
  8324  17   21:1   424           FOR TEMPX := 1 TO 7 DO
  8325  17   21:2   438             BEGIN
  8326  17   21:3   438               CHARREC.MAGESP[   TEMPX] := 0;
  8327  17   21:3   450               CHARREC.PRIESTSP[ TEMPX] := 0
  8328  17   21:2   460             END;
  8329  17   21:1   472           FOR TEMPX := 1 TO CHARREC.POSS.POSSCNT DO
  8330  17   21:2   488             IF NOT CHARREC.POSS.POSSESS[ TEMPX].CURSED THEN
  8331  17   21:3   502               CHARREC.POSS.POSSESS[ TEMPX].EQUIPED := FALSE;
  8332  17   21:1   524           PUTCHARC( CHARREC, CHARACX);
  8333  17   21:1   532           GTSCNTOC
  8334  17   21:0   532         END;  (* CHGCLASS *)
  8335  17   21:0   562         
  8336  17   21:0   562         
  8337  17   23:D     1       PROCEDURE CHGPASS;  (* P010B17 *)
  8338  17   23:D     1       
  8339  17   23:D     1         VAR
  8340  17   23:D     1              NEWPASS2 : STRING[ 40];
  8341  17   23:D    22              NEWPASS1 : STRING[ 40];
  8342  17   23:D    43       
  8343  17   23:0     0         BEGIN;
  8344  17   23:1     0           CLEARWIN( MAINWIN, TRUE);
  8345  17   23:1     7           MVCURSOR( MAINWIN, 0, 8);
  8346  17   23:1    15           CENTSTR(  MAINWIN, 'ENTER NEW PASSWORD');
  8347  17   23:1    42           MVCURSOR( MAINWIN, 10, 10);
  8348  17   23:1    50           GETPASS(  MAINWIN, NEWPASS1);
  8349  17   23:1    57           MVCURSOR( MAINWIN, 0, 12);
  8350  17   23:1    65           CENTSTR(  MAINWIN, 'ENTER AGAIN TO BE SURE');
  8351  17   23:1    96           MVCURSOR( MAINWIN, 10, 14);
  8352  17   23:1   104           GETPASS(  MAINWIN, NEWPASS2);
  8353  17   23:1   111           MVCURSOR( MAINWIN, 0, 16);
  8354  17   23:1   119           IF NEWPASS1 = NEWPASS2 THEN
  8355  17   23:2   127             BEGIN
  8356  17   23:3   127               CHARREC.PASSWORD := NEWPASS1;
  8357  17   23:3   134               PUTCHARC( CHARREC, CHARACX);
  8358  17   23:3   142               GTSCNTOC;
  8359  17   23:3   144               CENTSTR( MAINWIN, 'CHANGED - PRESS (RETURN)')
  8360  17   23:2   174             END
  8361  17   23:1   177           ELSE
  8362  17   23:2   179             BEGIN
  8363  17   23:3   179               PRINTSTR( MAINWIN, 'THEY ARE NOT THE SAME. YOUR PASSWORD');
  8364  17   23:3   224               PRINTSTR( MAINWIN, 'HASN''T BEEN CHANGED - PRESS (RETURN)')
  8365  17   23:2   266             END;
  8366  17   23:1   269           GETCR
  8367  17   23:0   269         END;
  8368  17   23:0   284         
  8369  17   23:0   284         
  8370  17   10:0     0       BEGIN  (* TRAINING *)
  8371  17   10:1     0         PARTYCNT := 0;
  8372  17   10:1     3         IF XGOTO <> XBCK2ROL THEN
  8373  17   10:2    10           BEGIN
  8374  17   10:3    10             MVCURSOR( MAINWIN, 9, 14);
  8375  17   10:3    18             PRINTSTR( MAINWIN, 'PASSWORD >');
  8376  17   10:3    37             GETPASS(  MAINWIN, PASSSTR);
  8377  17   10:3    44             IF PASSSTR <> CHARREC.PASSWORD THEN
  8378  17   10:4    53               EXIT( TRAINING)
  8379  17   10:2    57           END
  8380  17   10:1    57         ELSE
  8381  17   10:2    59           BEGIN
  8382  17   10:3    59             XGOTO := XTRAININ;
  8383  17   10:3    63             CHARREC := CHARACTR[ 0];
  8384  17   10:3    73             CHARACX := CHARDISK[ 0]
  8385  17   10:2    79           END;
  8386  17   10:1    83         TRAINWIN := GETWIN( 0, 4, 40, 3, 7, TRUE);
  8387  17   10:1    96         
  8388  17   10:1    96         REPEAT
  8389  17   10:2    96           MVCURSOR( TRAINWIN, 0, 0);
  8390  17   10:2   102           PRINTSTR( TRAINWIN, CHARREC.NAME);
  8391  17   10:2   109           WHILE TRAINWIN^.HEAD.HCURSOR <= 15 DO
  8392  17   10:3   119             PRINTCHR( TRAINWIN, ' ');
  8393  17   10:2   126           PRINTCHR( TRAINWIN, 'L');
  8394  17   10:2   131           PRINTNUM( TRAINWIN, CHARREC.CHARLEV, 3);
  8395  17   10:2   139           PRINTCHR( TRAINWIN, ' ');
  8396  17   10:2   144           PRINTSTR( TRAINWIN, COPY( SCNTOC.ALIGN[ CHARREC.ALIGN], 1, 1));
  8397  17   10:2   165           PRINTCHR( TRAINWIN, '-');
  8398  17   10:2   170           PRINTSTR( TRAINWIN, COPY( SCNTOC.CLASS[ CHARREC.CLASS], 1, 3));
  8399  17   10:2   191           PRINTCHR( TRAINWIN, ' ');
  8400  17   10:2   196           PRINTSTR( TRAINWIN, SCNTOC.RACE[ CHARREC.RACE]);
  8401  17   10:2   208           CLEARWIN( MAINWIN, FALSE);
  8402  17   10:2   215           MOVELEFT( CHARREC.LOSTXYL.AWARDS[ 4], SVAWARDS, 2);
  8403  17   10:2   232           TEMPWIN := GETWIN( 8, 8, 24, 8, 6, TRUE);
  8404  17   10:2   246           BASE04 := MENU( TEMPWIN,
  8405  17   10:2   249      'R)ITE OF PASSAGE/I)NSPECT/D)ELETE/C)HANGE CLASS/A)LTER PASSWORD/L)EAVE');
  8406  17   10:2   329         
  8407  17   10:2   329           DELWIN( TEMPWIN, FALSE);
  8408  17   10:2   336           
  8409  17   10:2   336           CASE BASE04 OF
  8410  17   10:2   339             1:  INSPECT;
  8411  17   10:2   343             2:  DELCHAR;
  8412  17   10:2   347             3:  CHGCLASS;
  8413  17   10:2   351             0:  RITEPASS;
  8414  17   10:2   355             4:  CHGPASS;
  8415  17   10:2   359             5:  BEGIN
  8416  17   10:4   359                   DELWIN( TRAINWIN, FALSE);
  8417  17   10:4   365                   EXIT( TRAINING)
  8418  17   10:3   369                 END
  8419  17   10:2   369           END
  8420  17   10:1   390         UNTIL FALSE
  8421  17   10:0   390       END;   (* TRAINING *)
  8422  17   10:0   410       
  8423  17   10:0   410       
  8424  17    1:0     0     BEGIN  (* P010B01  ROLLER *)
  8425  17    1:1     0       IF XGOTO = XBCK2ROL THEN
  8426  17    1:2     7         TRAINING;
  8427  17    1:1     9       REPEAT
  8428  17    1:2     9         CLEARWIN( MAINWIN, FALSE);
  8429  17    1:2    16         IF TRAINTIT = NIL THEN
  8430  17    1:3    23           BEGIN
  8431  17    1:4    23             TRAINTIT := GETWIN( 11, 0, 18, 3, 15, TRUE);
  8432  17    1:4    37             PRINTSTR( TRAINTIT, 'TRAINING GROUNDS')
  8433  17    1:3    59           END;
  8434  17    1:2    62         TEMPWIN := GETWIN( 0, 4, 40, 7, 1, TRUE);
  8435  17    1:2    76         PRINTSTR( TEMPWIN, 'ENTER THE NAME OF THE CHARACTER YOU');
  8436  17    1:2   120         PRINTCR(  TEMPWIN);
  8437  17    1:2   126         PRINTSTR( TEMPWIN, 'WANT TO INSPECT, OR');
  8438  17    1:2   154         PRINTCR(  TEMPWIN);
  8439  17    1:2   160         PRINTCR(  TEMPWIN);
  8440  17    1:2   166         PRINTSTR( TEMPWIN, '        "*"  TO SEE THE ROSTER, OR    ');
  8441  17    1:2   213         PRINTSTR( TEMPWIN, '   (RETURN)  TO GO TO LLYLGAMYN.');
  8442  17    1:2   254         CLEARWIN( MAINWIN, TRUE);
  8443  17    1:2   261         MVCURSOR( MAINWIN, 13, 13);
  8444  17    1:2   269         PRINTSTR( MAINWIN, 'NAME >');
  8445  17    1:2   284         GETSTR(   MAINWIN, CHARNAME, 15);
  8446  17    1:2   293         DELWIN( TEMPWIN, FALSE);
  8447  17    1:2   300         IF  CHARNAME = '' THEN
  8448  17    1:3   309           BEGIN
  8449  17    1:4   309             XGOTO := XCASTLE;
  8450  17    1:4   313             DELWIN( TRAINTIT, FALSE);
  8451  17    1:4   320             EXIT( ROLLER)
  8452  17    1:3   324           END
  8453  17    1:2   324         ELSE
  8454  17    1:3   326           BEGIN
  8455  17    1:4   326             IF CHARNAME = '*' THEN
  8456  17    1:5   333               DSP20NM
  8457  17    1:4   333             ELSE
  8458  17    1:5   337               BEGIN
  8459  17    1:6   337                 CHARACX := -1;
  8460  17    1:6   341                 FOR TEMPX := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
  8461  17    1:7   364                   IF CHARACX < 0 THEN
  8462  17    1:8   370                     BEGIN
  8463  17    1:9   370                       GETCHARC( CHARREC, TEMPX);
  8464  17    1:9   376                       IF CHARREC.STATUS <> LOST THEN
  8465  17    1:0   382                         IF CHARREC.NAME = CHARNAME THEN
  8466  17    1:1   390                           CHARACX := TEMPX
  8467  17    1:8   390                     END;
  8468  17    1:6   402                 IF CHARACX >= 0 THEN
  8469  17    1:7   408                   TRAINING
  8470  17    1:5   408               END
  8471  17    1:3   410           END
  8472  17    1:1   410       UNTIL FALSE
  8473  17    1:0   410     END;   (* ROLLER *)
  8474  17    1:0   430   
  8475  17    1:0   430 (*$I WIZ3C:ROLLER    *)
  8476  17    1:0   430 
  8476  17    1:0   430 (*$I WIZ3C:CAMP      *)
  8477  18    1:D     1   SEGMENT PROCEDURE CAMP;  (* P010C01 *)
  8478  18    1:D     1 
  8479  18    1:D     1     VAR
  8480  18    1:D     1          OBJIDS   : ARRAY[ 0..7] OF INTEGER;
  8481  18    1:D     9          OBJNAMES : ARRAY[ 0..7] OF ARRAY[ FALSE..TRUE] OF STRING[ 15];
  8482  18    1:D   137          CURSEDXX : PACKED ARRAY[ 0..7] OF BOOLEAN;
  8483  18    1:D   138          CANUSE   : PACKED ARRAY[ 0..7] OF BOOLEAN;
  8484  18    1:D   139          TEMPX    : INTEGER;
  8485  18    1:D   140          
  8486  18    1:D   140          
  8487  18    2:D     1     PROCEDURE DSP1LINE( CHARX: INTEGER);  (* P010C02 *)
  8488  18    2:D     2     
  8489  18    2:0     0       BEGIN
  8490  18    2:1     0         MVCURSOR( CHARSWIN, 0, CHARX + 1);
  8491  18    2:1    10         PRINTNUM( CHARSWIN, CHARX + 1, 1);
  8492  18    2:1    20         PRINTCHR( CHARSWIN, ' ');
  8493  18    2:1    27         PRINTSTR( CHARSWIN, CHARACTR[ CHARX].NAME);
  8494  18    2:1    38         WHILE CHARSWIN^.HEAD.HCURSOR < 18 DO
  8495  18    2:2    50           PRINTCHR( CHARSWIN, ' ');
  8496  18    2:1    59         PRINTSTR( CHARSWIN, COPY( SCNTOC.ALIGN[ CHARACTR[ CHARX].ALIGN], 1, 1));
  8497  18    2:1    86         PRINTCHR( CHARSWIN, '-');
  8498  18    2:1    93         PRINTSTR( CHARSWIN, COPY( SCNTOC.CLASS[ CHARACTR[ CHARX].CLASS], 1, 3));
  8499  18    2:1   120         PRINTCHR( CHARSWIN, ' ');
  8500  18    2:1   127         IF CHARACTR[ CHARX].ARMORCL - ACMOD2 > -10 THEN
  8501  18    2:2   143           PRINTNUM( CHARSWIN, CHARACTR[ CHARX].ARMORCL - ACMOD2, 2)
  8502  18    2:1   158         ELSE
  8503  18    2:2   163           PRINTSTR( CHARSWIN, 'LO');
  8504  18    2:1   174         PRINTNUM( CHARSWIN, CHARACTR[ CHARX].HPLEFT, 5);
  8505  18    2:1   188         PRINTCHR( CHARSWIN, ' ');
  8506  18    2:1   195         IF CHARACTR[ CHARX].STATUS = OK THEN
  8507  18    2:2   206           IF CHARACTR[ CHARX].LOSTXYL.POISNAMT[ 1] <> 0 THEN
  8508  18    2:3   223             PRINTSTR( CHARSWIN, 'POISON')
  8509  18    2:2   235           ELSE
  8510  18    2:3   240             PRINTNUM( CHARSWIN, CHARACTR[ CHARX].HPMAX,4)
  8511  18    2:1   251         ELSE
  8512  18    2:2   256           PRINTSTR( CHARSWIN, SCNTOC.STATUS[ CHARACTR[ CHARX].STATUS]);
  8513  18    2:1   274         WHILE CHARSWIN^.HEAD.HCURSOR <> 0 DO
  8514  18    2:2   286           PRINTCHR( CHARSWIN, ' ')
  8515  18    2:0   290       END;
  8516  18    2:0   312       
  8517  18    2:0   312       
  8518  18    3:D     1     PROCEDURE AASTRAA( ASTRA: STRING);  (* P010C03 *)
  8519  18    3:D    43     
  8520  18    3:0     0       BEGIN
  8521  18    3:1     0         CLEARWIN( TEMPWIN, TRUE);
  8522  18    3:1    12         MVCURSOR( TEMPWIN, 0, 1);
  8523  18    3:1    20         CENTSTR(  TEMPWIN, CONCAT( '** ', ASTRA, ' **'));
  8524  18    3:1    63         PAUSE2
  8525  18    3:0    63       END;
  8526  18    3:0    78       
  8527  18    3:0    78       
  8528  18    4:D     1     PROCEDURE INSPECT;  (* P010C04 *)
  8529  18    4:D     1     
  8530  18    4:D     1       VAR
  8531  18    4:D     1            UNUSEDXX : INTEGER;
  8532  18    4:D     2            CAMPCHAR : INTEGER;
  8533  18    4:D     3            MENUX    : INTEGER;
  8534  18    4:D     4          
  8535  18    4:D     4          
  8536  18    5:D     1       PROCEDURE DSPSPELS;  (* P010C05 *)
  8537  18    5:D     1       
  8538  18    5:D     1         VAR
  8539  18    5:D     1              INDX : INTEGER;
  8540  18    5:D     2       
  8541  18    5:0     0         BEGIN
  8542  18    5:1     0           WITH CHARACTR[ CAMPCHAR] DO
  8543  18    5:2     9             BEGIN
  8544  18    5:3     9               MVCURSOR( CAMPWIN, 0, 9);
  8545  18    5:3    17               PRINTSTR( CAMPWIN, 'MAGE ');
  8546  18    5:3    31               FOR INDX := 1 TO 7 DO
  8547  18    5:4    42                 BEGIN
  8548  18    5:5    42                   PRINTNUM( CAMPWIN, MAGESP[ INDX], 1);
  8549  18    5:5    58                   IF INDX < 7 THEN
  8550  18    5:6    63                     PRINTCHR( CAMPWIN, '/')
  8551  18    5:4    67                 END;
  8552  18    5:3    77               PRINTSTR( CAMPWIN, '  PRST ');
  8553  18    5:3    93               FOR INDX := 1 TO 7 DO
  8554  18    5:4   104                 BEGIN
  8555  18    5:5   104                   PRINTNUM( CAMPWIN, PRIESTSP[ INDX], 1);
  8556  18    5:5   120                   IF INDX < 7 THEN
  8557  18    5:6   125                     PRINTCHR( CAMPWIN, '/')
  8558  18    5:4   129                 END
  8559  18    5:2   132             END
  8560  18    5:0   139         END;
  8561  18    5:0   156         
  8562  18    5:0   156         
  8563  18    6:D     1       PROCEDURE DSPITEMS;  (* P010C06 *)
  8564  18    6:D     1       
  8565  18    6:D     1       VAR
  8566  18    6:D     1            ITEMX   : INTEGER;
  8567  18    6:D     2            HPOSNUM : INTEGER;
  8568  18    6:D     3            OBJECT  : TOBJREC;
  8569  18    6:D    42            
  8570  18    6:0     0         BEGIN
  8571  18    6:1     0           WITH CHARACTR[ CAMPCHAR] DO
  8572  18    6:2     9             BEGIN
  8573  18    6:3     9               FOR ITEMX := 1 TO 8 DO
  8574  18    6:4    21                 BEGIN
  8575  18    6:5    21                   HPOSNUM := 18 + 19 * ((ITEMX - 1) MOD 2);
  8576  18    6:5    32                   MVCURSOR( CAMPWIN, HPOSNUM - 19, 11 + (ITEMX - 1) DIV 2);
  8577  18    6:5    48                   IF ITEMX <= POSS.POSSCNT THEN
  8578  18    6:6    56                     BEGIN
  8579  18    6:7    56                       IF POSS.POSSESS[ ITEMX].EQINDEX >= 1000 THEN
  8580  18    6:8    72                         BEGIN
  8581  18    6:9    72                           IF OBJIDS[ ITEMX - 1] <>
  8582  18    6:9    81                                POSS.POSSESS[ ITEMX].EQINDEX  THEN
  8583  18    6:0    94                             BEGIN
  8584  18    6:1    94                               MOVELEFT( IOCACHE[ GETREC(
  8585  18    6:1    97                                            ZOBJECT,
  8586  18    6:1    98                                            POSS.POSSESS[ ITEMX].EQINDEX - 1000,
  8587  18    6:1   112                                            SIZEOF( TOBJREC))],
  8588  18    6:1   118                                         OBJECT,
  8589  18    6:1   121                                         SIZEOF( TOBJREC));
  8590  18    6:1   124                               OBJIDS[ ITEMX - 1] := POSS.POSSESS[ ITEMX].EQINDEX;
  8591  18    6:1   143                               OBJNAMES[ ITEMX - 1][ TRUE]  := OBJECT.NAME;
  8592  18    6:1   160                               OBJNAMES[ ITEMX - 1][ FALSE] := OBJECT.NAMEUNK;
  8593  18    6:1   177                               CANUSE[ ITEMX - 1] := OBJECT.CLASSUSE[ CLASS];
  8594  18    6:1   198                               CURSEDXX[ ITEMX - 1] := OBJECT.CURSED
  8595  18    6:0   208                             END;
  8596  18    6:0   211                             
  8597  18    6:9   211                           PRINTNUM( CAMPWIN, ITEMX, 1);
  8598  18    6:9   219                           PRINTCHR( CAMPWIN, ')');
  8599  18    6:9   226                           IF POSS.POSSESS[ ITEMX].EQUIPED THEN
  8600  18    6:0   238                             IF CURSEDXX[ ITEMX - 1] THEN
  8601  18    6:1   251                               PRINTCHR( CAMPWIN, '-')
  8602  18    6:0   255                             ELSE
  8603  18    6:1   260                               PRINTCHR( CAMPWIN, '*')
  8604  18    6:9   264                           ELSE
  8605  18    6:0   269                             IF POSS.POSSESS[ ITEMX].IDENTIF THEN
  8606  18    6:1   281                               IF CANUSE[ ITEMX - 1] THEN
  8607  18    6:2   294                                 PRINTCHR( CAMPWIN, ' ')
  8608  18    6:1   298                               ELSE
  8609  18    6:2   303                                 PRINTCHR( CAMPWIN, '^')  (* # *)
  8610  18    6:0   307                             ELSE
  8611  18    6:1   312                               PRINTCHR( CAMPWIN, '?');
  8612  18    6:9   319                           PRINTSTR( CAMPWIN, 
  8613  18    6:9   322                               OBJNAMES[ ITEMX - 1]
  8614  18    6:9   330                                       [ POSS.POSSESS[ ITEMX].IDENTIF])
  8615  18    6:9   344                                   
  8616  18    6:8   344                         END
  8617  18    6:6   347                     END;
  8618  18    6:6   347                     
  8619  18    6:5   347                   WHILE CAMPWIN^.HEAD.HCURSOR < HPOSNUM DO
  8620  18    6:6   359                     PRINTCHR( CAMPWIN, ' ')
  8621  18    6:6   363                           
  8622  18    6:4   363                 END
  8623  18    6:2   368             END
  8624  18    6:0   375         END;
  8625  18    6:0   398         
  8626  18    6:0   398         
  8627  18    7:D     1       PROCEDURE DSPSTATS;  (* P010C07 *)
  8628  18    7:D     1       
  8629  18    7:0     0         BEGIN
  8630  18    7:1     0           WITH CHARACTR[ CAMPCHAR] DO
  8631  18    7:2     9             BEGIN
  8632  18    7:3     9               MVCURSOR( CAMPWIN, 0, 2);
  8633  18    7:3    17               PRINTSTR( CAMPWIN, 'STRENGTH');
  8634  18    7:3    34               PRINTNUM( CAMPWIN, ATTRIB[ STRENGTH], 3);
  8635  18    7:3    49               PRINTSTR( CAMPWIN, '  GOLD ');
  8636  18    7:3    65               PRNTLONG( CAMPWIN, GOLD);
  8637  18    7:3    74               PRINTSTR( CAMPWIN, ' LEV');
  8638  18    7:3    87               PRINTNUM( CAMPWIN, CHARLEV, 4);
  8639  18    7:3    97               PRINTSTR( CAMPWIN, '    I.Q.');
  8640  18    7:3   114               PRINTNUM( CAMPWIN, ATTRIB[ IQ], 3);
  8641  18    7:3   129               PRINTSTR( CAMPWIN, '  E.P. ');
  8642  18    7:3   145               PRNTLONG( CAMPWIN, EXP);
  8643  18    7:3   154               PRINTSTR( CAMPWIN, ' AGE');
  8644  18    7:3   167               PRINTNUM( CAMPWIN, AGE DIV 52, 4);
  8645  18    7:3   179               PRINTSTR( CAMPWIN, '   PIETY');
  8646  18    7:3   196               PRINTNUM( CAMPWIN, ATTRIB[ PIETY], 3);
  8647  18    7:3   211               PRINTCR(  CAMPWIN);
  8648  18    7:3   217               PRINTSTR( CAMPWIN, 'VITALITY');
  8649  18    7:3   234               PRINTNUM( CAMPWIN, ATTRIB[ VITALITY], 3);
  8650  18    7:3   249               PRINTSTR( CAMPWIN, '  H.P.');
  8651  18    7:3   264               PRINTNUM( CAMPWIN, HPLEFT, 5);
  8652  18    7:3   274               PRINTCHR( CAMPWIN, '/');
  8653  18    7:3   281               PRINTNUM( CAMPWIN, HPMAX, 4);
  8654  18    7:3   291               PRINTSTR( CAMPWIN, '   A.C. ');
  8655  18    7:3   308               PRINTNUM( CAMPWIN, ARMORCL - ACMOD2, 3);
  8656  18    7:3   322               PRINTSTR( CAMPWIN, ' AGILITY');
  8657  18    7:3   339               PRINTNUM( CAMPWIN, ATTRIB[ AGILITY], 3);
  8658  18    7:3   354               PRINTCR(  CAMPWIN);
  8659  18    7:3   360               PRINTSTR( CAMPWIN, '    LUCK');
  8660  18    7:3   377               PRINTNUM( CAMPWIN, ATTRIB[ LUCK], 3);
  8661  18    7:3   392               PRINTSTR( CAMPWIN, '  STATUS ');
  8662  18    7:3   410               PRINTSTR( CAMPWIN, SCNTOC.STATUS[ STATUS]);
  8663  18    7:3   424               IF LOSTXYL.POISNAMT[ 1] > 0 THEN
  8664  18    7:4   437                 PRINTSTR( CAMPWIN, ' & POISONED');
  8665  18    7:3   457               WHILE CAMPWIN^.HEAD.HCURSOR <> 0 DO
  8666  18    7:4   469                 PRINTCHR( CAMPWIN, ' ')
  8667  18    7:2   473             END
  8668  18    7:0   478         END;
  8669  18    7:0   492         
  8670  18    7:0   492         
  8671  18    8:D     3       FUNCTION WHOINDEX( SOLICIT: STRING;             (* P010C08 *)
  8672  18    8:D     4                          TRADER:  INTEGER) : INTEGER;
  8673  18    8:D    46                         
  8674  18    8:D    46         VAR
  8675  18    8:D    46              WHOWIN : TWINDOWP;
  8676  18    8:D    47              WHOINX : INTEGER;
  8677  18    8:D    48       
  8678  18    8:0     0         BEGIN
  8679  18    8:1     0           WHOWIN := GETWIN( 13, 8, 26, 5, 15, FALSE);
  8680  18    8:1    18           CLEARWIN( WHOWIN, FALSE);
  8681  18    8:1    24           SETWNPRI( CHARSWIN, 30, TRUE);
  8682  18    8:1    32           CENTSTR( WHOWIN, SOLICIT);
  8683  18    8:1    39           CENTSTR( WHOWIN, '(RETURN) EXITS');
  8684  18    8:1    61           REPEAT
  8685  18    8:2    61             GETKEY;
  8686  18    8:2    64             WHOINX := ORD( INCHAR) - ORD( '1');
  8687  18    8:2    69             IF INCHAR = CHR( CRETURN) THEN
  8688  18    8:3    74               WHOINX := -1
  8689  18    8:1    74           UNTIL (WHOINX >= -1) AND
  8690  18    8:1    83                 (WHOINX < PARTYCNT) AND
  8691  18    8:1    88                 (WHOINX <> TRADER);
  8692  18    8:1    95           SETWNPRI( CHARSWIN, 6, FALSE);
  8693  18    8:1   103           DELWIN( WHOWIN, TRUE);
  8694  18    8:1   109           WHOINDEX := WHOINX
  8695  18    8:0   109         END;
  8696  18    8:0   128         
  8697  18    8:0   128         
  8698  18    9:D     1       PROCEDURE CASTSPEL( SPELHASH: INTEGER);  (* P010C09 *)
  8699  18    9:D     2         
  8700  18    9:D     2         CONST
  8701  18    9:D     2 
  8702  18    9:D     2               HALITO   =  4178;
  8703  18    9:D     2               MOGREF   =  2409;
  8704  18    9:D     2               KATINO   =  3983;
  8705  18    9:D     2               DUMAPIC  =  3245;
  8706  18    9:D     2               
  8707  18    9:D     2               DILTO    =  3340;
  8708  18    9:D     2               SOPIC    =  1953;
  8709  18    9:D     2               
  8710  18    9:D     2               MAHALITO =  6181;
  8711  18    9:D     2               MOLITO   =  4731;
  8712  18    9:D     2               
  8713  18    9:D     2               MORLIS   =  4744;
  8714  18    9:D     2               DALTO    =  3180;
  8715  18    9:D     2               LAHALITO =  6156;
  8716  18    9:D     2               
  8717  18    9:D     2               MAMORLIS =  7525;
  8718  18    9:D     2               MAKANITO =  6612;
  8719  18    9:D     2               MADALTO  =  4925;
  8720  18    9:D     2               
  8721  18    9:D     2               LAKANITO =  6587;
  8722  18    9:D     2               ZILWAN   =  4573;
  8723  18    9:D     2               MASOPIC  =  3990;
  8724  18    9:D     2               HAMAN    =  1562;
  8725  18    9:D     2               
  8726  18    9:D     2               MALOR    =  3128;
  8727  18    9:D     2               MAHAMAN  =  2597;
  8728  18    9:D     2               TILTOWAI = 11157;
  8729  18    9:D     2               
  8730  18    9:D     2               
  8731  18    9:D     2               KALKI    =  1449;
  8732  18    9:D     2               DIOS     =  2301;
  8733  18    9:D     2               BADIOS   =  3675;
  8734  18    9:D     2               MILWA    =  2889;
  8735  18    9:D     2               PORFIC   =  2287;
  8736  18    9:D     2               
  8737  18    9:D     2               MATU     =  3139;
  8738  18    9:D     2               CALFO    =     0; (* 1717 *)
  8739  18    9:D     2               MANIFO   =  2619;
  8740  18    9:D     2               MONTINO  =  5970;
  8741  18    9:D     2               
  8742  18    9:D     2               LOMILWA  =  5333;
  8743  18    9:D     2               DIALKO   =  2718;
  8744  18    9:D     2               LATUMAPI =  6491;
  8745  18    9:D     2               BAMATU   =  5169;
  8746  18    9:D     2               
  8747  18    9:D     2               DIAL     =   761;
  8748  18    9:D     2               BADIAL   =  1253;
  8749  18    9:D     2               LATUMOFI =  9463;
  8750  18    9:D     2               MAPORFIC =  4322;
  8751  18    9:D     2               
  8752  18    9:D     2               DIALMA   =  1614;
  8753  18    9:D     2               BADIALMA =  2446;
  8754  18    9:D     2               LITOKAN  =  4396;
  8755  18    9:D     2               KANDI    =  1185; (* 1885 *)
  8756  18    9:D     2               DI       =   180;
  8757  18    9:D     2               BADI     =   382;
  8758  18    9:D     2               
  8759  18    9:D     2               LORTO    =  4296;
  8760  18    9:D     2               MADI     =   547;
  8761  18    9:D     2               MABADI   =   759;
  8762  18    9:D     2               LOKTOFEI =  8330;
  8763  18    9:D     2               
  8764  18    9:D     2               MALIKTO  =  5514;
  8765  18    9:D     2               KADORTO  =  6673;
  8766  18    9:D     2         
  8767  18    9:D     2         VAR
  8768  18    9:D     2              USEITEM  : BOOLEAN;
  8769  18    9:D     3              SPELNAME : STRING;
  8770  18    9:D    44              UNUSEDXX : INTEGER;
  8771  18    9:D    45              HASHCALC : INTEGER;
  8772  18    9:D    46              SPELLI   : INTEGER;
  8773  18    9:D    47              HEALME   : INTEGER;
  8774  18    9:D    48       
  8775  18    9:D    48       
  8776  18   10:D     1         PROCEDURE EXITCAST( EXITSTR: STRING);  (* P010C0A *)
  8777  18   10:D    43         
  8778  18   10:0     0           BEGIN
  8779  18   10:1     0             IF EXITSTR <> '' THEN
  8780  18   10:2    14               AASTRAA( EXITSTR);
  8781  18   10:1    18             DELWIN( TEMPWIN, TRUE);
  8782  18   10:1    25             DSPSPELS;
  8783  18   10:1    27             EXIT( CASTSPEL)
  8784  18   10:0    31           END;
  8785  18   10:0    44           
  8786  18   10:0    44           
  8787  18   11:D     1         PROCEDURE HEALWHO;  (* P010C0B *)
  8788  18   11:D     1         
  8789  18   11:0     0           BEGIN
  8790  18   11:1     0             HEALME := WHOINDEX( 'CAST ON WHO (NUM)', -999);
  8791  18   11:1    31             IF HEALME = -1 THEN
  8792  18   11:2    39               EXITCAST( 'WHOOPS')
  8793  18   11:0    48           END;
  8794  18   11:0    62           
  8795  18   11:0    62           
  8796  18   12:D     1         PROCEDURE CHKSPCNT( PRIESTGR: INTEGER;  (* P010C0C *)
  8797  18   12:D     2                             SPELLIDX: INTEGER);
  8798  18   12:D     3         
  8799  18   12:0     0           BEGIN
  8800  18   12:1     0             IF USEITEM THEN
  8801  18   12:2     5               EXIT( CHKSPCNT);
  8802  18   12:1     9             IF (CHARACTR[ CAMPCHAR].PRIESTSP[ PRIESTGR] <= 0) OR
  8803  18   12:1    26                (NOT CHARACTR[ CAMPCHAR].SPELLSKN[ SPELLIDX]) THEN
  8804  18   12:2    44               EXITCAST( 'YOU CANT CAST IT')
  8805  18   12:0    63           END;
  8806  18   12:0    78           
  8807  18   12:0    78           
  8808  18   13:D     1         PROCEDURE DECPRIEST( PRIESTGR: INTEGER);  (* P010C0D *)
  8809  18   13:D     2         
  8810  18   13:0     0           BEGIN
  8811  18   13:1     0             IF NOT USEITEM THEN
  8812  18   13:2     6               CHARACTR[ CAMPCHAR].PRIESTSP[ PRIESTGR] :=
  8813  18   13:2    20                 CHARACTR[ CAMPCHAR].PRIESTSP[ PRIESTGR] - 1;
  8814  18   13:1    38             IF FIZZLES > 0 THEN
  8815  18   13:2    45               EXITCAST( 'NO EFFECT')
  8816  18   13:0    57           END;
  8817  18   13:0    72           
  8818  18   13:0    72           
  8819  18   14:D     1         PROCEDURE DOHEAL( HPTRIES:  INTEGER;  (* P010C0E *)
  8820  18   14:D     2                           MAXHPTRY: INTEGER;
  8821  18   14:D     3                           PRIESTGR: INTEGER;
  8822  18   14:D     4                           SPELLIDX: INTEGER);
  8823  18   14:D     5         
  8824  18   14:D     5           VAR
  8825  18   14:D     5                HPHEALED : INTEGER;
  8826  18   14:D     6         
  8827  18   14:0     0           BEGIN
  8828  18   14:1     0             CHKSPCNT( PRIESTGR, SPELLIDX);
  8829  18   14:1     4             HEALWHO;
  8830  18   14:1     6             DECPRIEST( PRIESTGR);
  8831  18   14:1     9             HPHEALED := 0;
  8832  18   14:1    12             IF HPTRIES = -1 THEN
  8833  18   14:2    18               BEGIN
  8834  18   14:2    18                   (* MADI *)
  8835  18   14:3    18                 HPHEALED := CHARACTR[ HEALME].HPMAX;
  8836  18   14:3    29                 CHARACTR[ HEALME].LOSTXYL.POISNAMT[ 1] := 0;
  8837  18   14:3    45                 IF CHARACTR[ HEALME].STATUS < DEAD THEN
  8838  18   14:4    58                   CHARACTR[ HEALME].STATUS := OK
  8839  18   14:2    67               END
  8840  18   14:1    69             ELSE
  8841  18   14:2    71               WHILE HPTRIES > 0 DO
  8842  18   14:3    76                 BEGIN
  8843  18   14:4    76                   HPHEALED := HPHEALED + (RANDOM MOD MAXHPTRY) + 1;
  8844  18   14:4    89                   HPTRIES := HPTRIES - 1
  8845  18   14:3    90                 END;
  8846  18   14:1    96             CHARACTR[ HEALME].HPLEFT := CHARACTR[ HEALME].HPLEFT + HPHEALED;
  8847  18   14:1   117             IF CHARACTR[ HEALME].HPLEFT > CHARACTR[ HEALME].HPMAX THEN
  8848  18   14:2   138               CHARACTR[ HEALME].HPLEFT := CHARACTR[ HEALME].HPMAX;
  8849  18   14:1   157             CLEARWIN( TEMPWIN, TRUE);
  8850  18   14:1   164             PRINTSTR( TEMPWIN, 'CURED');
  8851  18   14:1   178             PRINTNUM( TEMPWIN, HPHEALED, 5);
  8852  18   14:1   186             PRINTSTR( TEMPWIN, ' HP');
  8853  18   14:1   198             PRINTCR(  TEMPWIN);
  8854  18   14:1   204             PRINTSTR( TEMPWIN, 'NOW');
  8855  18   14:1   216             PRINTNUM( TEMPWIN, CHARACTR[ HEALME].HPLEFT, 5);
  8856  18   14:1   232             PRINTCHR( TEMPWIN, '/');
  8857  18   14:1   239             PRINTNUM( TEMPWIN, CHARACTR[ HEALME].HPMAX, 4);
  8858  18   14:1   255             PAUSE2;
  8859  18   14:1   258             DSPSPELS;
  8860  18   14:1   260             IF CAMPCHAR = HEALME THEN
  8861  18   14:2   269               DSPSTATS;
  8862  18   14:1   271             DSP1LINE( HEALME);
  8863  18   14:1   276             DELWIN( TEMPWIN, TRUE);
  8864  18   14:1   283             EXIT( CASTSPEL)
  8865  18   14:0   287           END;  (* DOHEAL *)
  8866  18   14:0   302           
  8867  18   14:0   302           
  8868  18   15:D     1         PROCEDURE DOKANDI;  (* P010C0F *)
  8869  18   15:D     1         
  8870  18   15:0     0           BEGIN
  8871  18   15:1     0             CHKSPCNT( 5, 42);
  8872  18   15:1     4             DECPRIEST( 5);
  8873  18   15:1     7             BASE04 := CAMPCHAR;
  8874  18   15:1    12             BASE291.GOTOX := 2;
  8875  18   15:1    16             XGOTO := XCAMPSTF;
  8876  18   15:1    20             DELWIN( TEMPWIN, FALSE);
  8877  18   15:1    27             EXIT( CAMP)
  8878  18   15:0    31           END;
  8879  18   15:0    44           
  8880  18   15:0    44           
  8881  18   16:D     1         PROCEDURE DODIKADO( DIKADOXX: INTEGER);  (* P010C10 *)
  8882  18   16:D     2         
  8883  18   16:D     2         
  8884  18   17:D     1           PROCEDURE DIKADORT;  (* P010C11 *)
  8885  18   17:D     1           
  8886  18   17:0     0             BEGIN
  8887  18   17:1     0               IF (RANDOM MOD 100) <=
  8888  18   17:1     7                  4 * CHARACTR[ HEALME].ATTRIB[ VITALITY] THEN
  8889  18   17:2    26                 BEGIN
  8890  18   17:3    26                   CHARACTR[ HEALME].STATUS := OK;
  8891  18   17:3    37                   IF DIKADOXX = 5 THEN
  8892  18   17:4    44                     CHARACTR[ HEALME].HPLEFT := 1
  8893  18   17:3    53                   ELSE
  8894  18   17:4    57                     CHARACTR[ HEALME].HPLEFT := 
  8895  18   17:4    66                       CHARACTR[ HEALME].HPMAX;
  8896  18   17:3    76                   IF CHARACTR[ HEALME].ATTRIB[ VITALITY] = 3 THEN
  8897  18   17:4    94                     CHARACTR[ HEALME].STATUS := LOST
  8898  18   17:3   103                   ELSE
  8899  18   17:4   107                     CHARACTR[ HEALME].ATTRIB[ VITALITY] :=
  8900  18   17:4   120                       CHARACTR[ HEALME].ATTRIB[ VITALITY] - 1
  8901  18   17:2   134                 END;
  8902  18   17:1   137               IF CHARACTR[ HEALME].STATUS = OK THEN
  8903  18   17:2   150                 EXITCAST( 'OK')
  8904  18   17:1   155               ELSE
  8905  18   17:2   159                 BEGIN
  8906  18   17:3   159                   CHARACTR[ HEALME].STATUS := SUCC( CHARACTR[ HEALME].STATUS);
  8907  18   17:3   180                   EXITCAST( 'OOPPS!')
  8908  18   17:2   189                 END
  8909  18   17:0   191             END;  (* DIKADORT *)
  8910  18   17:0   204             
  8911  18   17:0   204             
  8912  18   16:0     0           BEGIN  (* DODIKADO *)
  8913  18   16:1     0             IF DIKADOXX = 5 THEN
  8914  18   16:2     5               CHKSPCNT( DIKADOXX, 43)
  8915  18   16:1     7             ELSE
  8916  18   16:2    11               CHKSPCNT( DIKADOXX, 50);
  8917  18   16:1    15             HEALWHO;
  8918  18   16:1    17             DECPRIEST( DIKADOXX);
  8919  18   16:1    20             IF DIKADOXX = 5 THEN
  8920  18   16:2    25               BEGIN
  8921  18   16:3    25                 IF CHARACTR[ HEALME].STATUS = DEAD THEN
  8922  18   16:4    38                   DIKADORT
  8923  18   16:3    38                 ELSE
  8924  18   16:4    42                   IF CHARACTR[ HEALME].STATUS = ASHES THEN
  8925  18   16:5    55                     EXITCAST( 'NEEDS KADORTO')
  8926  18   16:2    71               END
  8927  18   16:1    73             ELSE
  8928  18   16:2    75               IF (CHARACTR[ HEALME].STATUS = DEAD) OR
  8929  18   16:2    86                  (CHARACTR[ HEALME].STATUS = ASHES) THEN
  8930  18   16:3   100                 DIKADORT
  8931  18   16:2   100               ELSE
  8932  18   16:3   104                 IF CHARACTR[ HEALME].STATUS = LOST THEN
  8933  18   16:4   117                   EXITCAST( 'LOST');
  8934  18   16:1   126             EXITCAST( 'NOT DEAD')
  8935  18   16:0   137           END;  (* DODIKADO *)
  8936  18   16:0   152           
  8937  18   16:0   152           
  8938  18   18:D     1         PROCEDURE DODUMAPI;  (* P010C12 *)
  8939  18   18:D     1         
  8940  18   18:0     0           BEGIN
  8941  18   18:1     0             IF NOT (USEITEM) THEN
  8942  18   18:2     6               IF (CHARACTR[ CAMPCHAR].MAGESP[ 1] = 0) OR
  8943  18   18:2    23                  NOT CHARACTR[ CAMPCHAR].SPELLSKN[ 4] THEN
  8944  18   18:3    41                 EXITCAST( 'YOU CANT CAST IT');
  8945  18   18:1    62             IF FIZZLES > 0 THEN
  8946  18   18:2    69               EXITCAST( 'SPELL FAILS');
  8947  18   18:1    85             IF NOT USEITEM THEN
  8948  18   18:2    91               CHARACTR[ CAMPCHAR].MAGESP[ 1] :=
  8949  18   18:2   105                 CHARACTR[ CAMPCHAR].MAGESP[ 1] - 1;
  8950  18   18:1   123             BASE04 := CAMPCHAR;
  8951  18   18:1   128             BASE291.GOTOX := 3;
  8952  18   18:1   132             XGOTO := XCAMPSTF;
  8953  18   18:1   136             DELWIN( TEMPWIN, FALSE);
  8954  18   18:1   143             EXIT( CAMP)
  8955  18   18:0   147           END;  (* DODUMAPI *)
  8956  18   18:0   160           
  8957  18   18:0   160           
  8958  18   19:D     1         PROCEDURE DOMALOR;  (* P010C13 *)
  8959  18   19:D     1         
  8960  18   19:0     0           BEGIN
  8961  18   19:1     0             IF NOT USEITEM THEN
  8962  18   19:2     6               IF (CHARACTR[ CAMPCHAR].MAGESP[ 7] = 0) OR
  8963  18   19:2    23                  (NOT CHARACTR[ CAMPCHAR].SPELLSKN[ 19]) THEN
  8964  18   19:3    41                 EXITCAST( 'YOU CANT CAST IT');
  8965  18   19:1    62             IF FIZZLES > 0 THEN
  8966  18   19:2    69               EXITCAST( 'SPELL FAILS');
  8967  18   19:1    85             IF NOT USEITEM THEN
  8968  18   19:2    91               CHARACTR[ CAMPCHAR].MAGESP[ 7] :=
  8969  18   19:2   105                 CHARACTR[ CAMPCHAR].MAGESP[ 7] - 1;
  8970  18   19:1   123             BASE04 := CAMPCHAR;
  8971  18   19:1   128             BASE291.GOTOX := 4;
  8972  18   19:1   132             XGOTO := XCAMPSTF;
  8973  18   19:1   136             DELWIN( TEMPWIN, FALSE);
  8974  18   19:1   143             EXIT( CAMP)
  8975  18   19:0   147           END;  (* DOMALOR *)
  8976  18   19:0   160           
  8977  18   19:0   160           
  8978  18    9:0     0         BEGIN (* CASTSPEL *)
  8979  18    9:1     0           TEMPWIN := GETWIN( 13, 8, 26, 5, 15, TRUE);
  8980  18    9:1    14           USEITEM := SPELHASH > 0;
  8981  18    9:1    19           IF SPELHASH = -1 THEN
  8982  18    9:2    25             BEGIN
  8983  18    9:3    25               CENTSTR(  TEMPWIN, 'CAST WHAT SPELL ?');
  8984  18    9:3    51               CENTSTR(  TEMPWIN, '(RETURN) EXITS');
  8985  18    9:3    74               PRINTSTR( TEMPWIN, '       >');
  8986  18    9:3    91               GETSTR(   TEMPWIN, SPELNAME, 15);
  8987  18    9:3   100               IF SPELNAME = '' THEN
  8988  18    9:4   109                 EXITCAST( '');
  8989  18    9:3   114               SPELHASH := LENGTH( SPELNAME);
  8990  18    9:3   120               FOR SPELLI := 1 TO LENGTH( SPELNAME) DO
  8991  18    9:4   136                 IF SPELHASH < 20000 THEN
  8992  18    9:5   143                   BEGIN
  8993  18    9:6   143                     HASHCALC := ORD( SPELNAME[ SPELLI]) - 64;
  8994  18    9:6   152                     SPELHASH := SPELHASH + HASHCALC * HASHCALC * SPELLI
  8995  18    9:5   158                   END;
  8996  18    9:2   172             END;
  8997  18    9:1   172           IF SPELHASH = LATUMAPI THEN
  8998  18    9:2   179             BEGIN
  8999  18    9:3   179               CHKSPCNT( 3, 33);
  9000  18    9:3   183               DECPRIEST( 3);
  9001  18    9:3   186               IDMONSTR := 10000
  9002  18    9:2   186             END
  9003  18    9:1   192           ELSE IF SPELHASH = DIOS THEN
  9004  18    9:3   201             DOHEAL( 1, 8, 1, 23)
  9005  18    9:2   205           ELSE IF SPELHASH = MILWA THEN
  9006  18    9:4   216             BEGIN
  9007  18    9:5   216               CHKSPCNT( 1, 25);
  9008  18    9:5   220               DECPRIEST( 1);
  9009  18    9:5   223               LIGHT := 30 + (RANDOM MOD 15)
  9010  18    9:4   231             END
  9011  18    9:3   235           ELSE IF SPELHASH = DUMAPIC THEN
  9012  18    9:5   244             DODUMAPI
  9013  18    9:4   244           ELSE IF SPELHASH = KANDI THEN
  9014  18    9:6   255             DOKANDI
  9015  18    9:5   255           ELSE IF SPELHASH = LOMILWA THEN
  9016  18    9:7   266             BEGIN
  9017  18    9:8   266               CHKSPCNT( 3, 31);
  9018  18    9:8   270               DECPRIEST( 3);
  9019  18    9:8   273               LIGHT := 10000
  9020  18    9:7   273             END
  9021  18    9:6   279           ELSE IF SPELHASH = LATUMOFI THEN
  9022  18    9:8   288             BEGIN
  9023  18    9:9   288               CHKSPCNT( 4, 37);
  9024  18    9:9   292               HEALWHO;
  9025  18    9:9   294               DECPRIEST( 4);
  9026  18    9:9   297               CHARACTR[ HEALME].LOSTXYL.POISNAMT[ 1] := 0;
  9027  18    9:9   312               DSP1LINE( HEALME)
  9028  18    9:8   314             END
  9029  18    9:7   316           ELSE IF SPELHASH = DIALKO THEN
  9030  18    9:9   325             BEGIN
  9031  18    9:0   325               CHKSPCNT( 3, 32);
  9032  18    9:0   329               HEALWHO;
  9033  18    9:0   331               DECPRIEST( 3);
  9034  18    9:0   334               IF (CHARACTR[ HEALME].STATUS = PLYZE) OR
  9035  18    9:0   344                  (CHARACTR[ HEALME].STATUS = ASLEEP) THEN
  9036  18    9:1   357                 CHARACTR[ HEALME].STATUS := OK;
  9037  18    9:0   367               DSP1LINE( HEALME)
  9038  18    9:9   369             END
  9039  18    9:8   371           ELSE IF SPELHASH = DIAL THEN
  9040  18    9:0   380             DOHEAL( 2, 8, 4, 35)
  9041  18    9:9   384           ELSE IF SPELHASH = MAPORFIC THEN
  9042  18    9:1   395             BEGIN
  9043  18    9:2   395               CHKSPCNT( 4, 38);
  9044  18    9:2   399               DECPRIEST( 4);
  9045  18    9:2   402               ACMOD2 := 2;
  9046  18    9:2   406               FOR SPELHASH := 0 TO PARTYCNT - 1 DO  (* OVERLOADED *)
  9047  18    9:3   420                 DSP1LINE( SPELHASH)
  9048  18    9:1   421             END
  9049  18    9:0   430           ELSE IF SPELHASH = DIALMA THEN
  9050  18    9:2   439             DOHEAL( 3, 8, 5, 39)
  9051  18    9:1   443           ELSE IF SPELHASH = DI THEN
  9052  18    9:3   454             DODIKADO( 5)
  9053  18    9:2   455           ELSE IF SPELHASH = MADI THEN
  9054  18    9:4   466             DOHEAL( -1, -1, 6, 46)
  9055  18    9:3   472           ELSE IF SPELHASH = KADORTO THEN
  9056  18    9:5   483             DODIKADO( 7)
  9057  18    9:4   484           ELSE IF SPELHASH = MALOR THEN
  9058  18    9:6   495             DOMALOR
  9059  18    9:5   495           ELSE
  9060  18    9:6   499             EXITCAST( 'WHAT?');
  9061  18    9:1   509           EXITCAST( 'DONE!')
  9062  18    9:0   517         END;  (* CASTSPEL *)
  9063  18    9:0   554         
  9064  18    9:0   554         
  9065  18   20:D     1       PROCEDURE USEITEM;  (* P010C14 *)
  9066  18   20:D     1         
  9067  18   20:D     1         VAR
  9068  18   20:D     1              THEITEM  : TOBJREC;
  9069  18   20:D    40              UNUSEDXX : INTEGER;
  9070  18   20:D    41              UNUSEDYY : INTEGER;
  9071  18   20:D    42              UNUSEDZZ : INTEGER;
  9072  18   20:D    43              ITEMX    : INTEGER;
  9073  18   20:D    44              
  9074  18   20:D    44              
  9075  18   21:D     1         PROCEDURE EXITUSE( EXITSTR: STRING);  (* P010C15 *)
  9076  18   21:D    43         
  9077  18   21:0     0           BEGIN
  9078  18   21:1     0             AASTRAA( EXITSTR);
  9079  18   21:1     9             DELWIN( TEMPWIN, TRUE);
  9080  18   21:1    16             EXIT( USEITEM)
  9081  18   21:0    20           END;
  9082  18   21:0    32           
  9083  18   21:0    32           
  9084  18   20:0     0         BEGIN (* USEITEM *)
  9085  18   20:1     0           TEMPWIN := GETWIN( 13, 8, 26, 5, 15, TRUE);
  9086  18   20:1    14           CENTSTR( TEMPWIN, 'USE ITEM (NUM)');
  9087  18   20:1    37           CENTSTR( TEMPWIN, '(RETURN) EXITS');
  9088  18   20:1    60           REPEAT
  9089  18   20:2    60             GETKEY;
  9090  18   20:2    63             ITEMX := ORD( INCHAR) - ORD( '0');
  9091  18   20:2    68             IF INCHAR = CHR( CRETURN) THEN
  9092  18   20:3    73               BEGIN
  9093  18   20:4    73                 DELWIN( TEMPWIN, TRUE);
  9094  18   20:4    80                 EXIT( USEITEM)
  9095  18   20:3    84               END
  9096  18   20:1    84           UNTIL (ITEMX > 0) AND
  9097  18   20:1    88                 (ITEMX <= CHARACTR[ CAMPCHAR].POSS.POSSCNT);
  9098  18   20:1   103           MOVELEFT( IOCACHE[ GETREC(
  9099  18   20:1   106                        ZOBJECT,
  9100  18   20:1   107                        CHARACTR[ CAMPCHAR].POSS.POSSESS[ ITEMX].EQINDEX - 1000,
  9101  18   20:1   127                        SIZEOF( TOBJREC))],
  9102  18   20:1   133                     THEITEM,
  9103  18   20:1   136                     SIZEOF( TOBJREC));
  9104  18   20:1   139           IF THEITEM.SPELLPWR = 0 THEN
  9105  18   20:2   145             EXITUSE( 'POWERLESS');
  9106  18   20:1   159           IF THEITEM.OBJTYPE <> SPECIAL THEN
  9107  18   20:2   165             IF NOT CHARACTR[ CAMPCHAR].POSS.POSSESS[ ITEMX].EQUIPED THEN
  9108  18   20:3   184               EXITUSE( 'NOT EQUIPPED');
  9109  18   20:1   201           IF (RANDOM MOD 100) < THEITEM.CHGCHANC THEN
  9110  18   20:2   213             CHARACTR[ CAMPCHAR].POSS.POSSESS[ ITEMX].EQINDEX := 
  9111  18   20:2   230               THEITEM.CHANGETO + 1000;
  9112  18   20:1   237           DELWIN( TEMPWIN, FALSE);
  9113  18   20:1   244           CASTSPEL( SCNTOC.SPELLHSH[ THEITEM.SPELLPWR])
  9114  18   20:0   252         END;  (* USEITEM *)
  9115  18   20:0   268         
  9116  18   20:0   268         
  9117  18   22:D     1       PROCEDURE DROPITEM;  (* P010C16 *)
  9118  18   22:D     1       
  9119  18   22:D     1       VAR
  9120  18   22:D     1            UNUSEDXX : INTEGER;
  9121  18   22:D     2            UNUSEDYY : INTEGER;
  9122  18   22:D     3            POSSX    : INTEGER;
  9123  18   22:D     4            POSSI    : INTEGER;
  9124  18   22:D     5         
  9125  18   22:D     5         
  9126  18   23:D     1         PROCEDURE EXITDROP( EXITSTR: STRING);  (* P010C17 *)
  9127  18   23:D    43         
  9128  18   23:0     0           BEGIN
  9129  18   23:1     0             AASTRAA( EXITSTR);
  9130  18   23:1     9             DELWIN( TEMPWIN, TRUE);
  9131  18   23:1    16             EXIT( DROPITEM)
  9132  18   23:0    20           END;
  9133  18   23:0    32           
  9134  18   23:0    32           
  9135  18   22:0     0         BEGIN  (* DROPITEM *)
  9136  18   22:1     0           TEMPWIN := GETWIN( 13, 8, 26, 5, 15, TRUE);
  9137  18   22:1    14           CENTSTR( TEMPWIN, 'DROP ITEM (NUM)');
  9138  18   22:1    38           CENTSTR( TEMPWIN, '(RETURN) EXITS');
  9139  18   22:1    61           REPEAT
  9140  18   22:2    61             GETKEY;
  9141  18   22:2    64             POSSI := ORD( INCHAR) - ORD( '0');
  9142  18   22:2    69             IF INCHAR = CHR( CRETURN) THEN
  9143  18   22:3    74               BEGIN
  9144  18   22:4    74                 DELWIN( TEMPWIN, FALSE);
  9145  18   22:4    81                 EXIT( DROPITEM)
  9146  18   22:3    85               END
  9147  18   22:1    85           UNTIL (POSSI > 0) AND
  9148  18   22:1    88                 (POSSI <= CHARACTR[ CAMPCHAR].POSS.POSSCNT);
  9149  18   22:1   102           IF CHARACTR[ CAMPCHAR].POSS.POSSESS[ POSSI].CURSED THEN
  9150  18   22:2   119             EXITDROP( 'CURSED');
  9151  18   22:1   130           IF CHARACTR[ CAMPCHAR].POSS.POSSESS[ POSSI].EQUIPED THEN
  9152  18   22:2   147             EXITDROP( 'EQUIPPED');
  9153  18   22:1   160           FOR POSSX := POSSI + 1 TO CHARACTR[ CAMPCHAR].POSS.POSSCNT DO
  9154  18   22:2   181             CHARACTR[ CAMPCHAR].POSS.POSSESS[ POSSX - 1] :=
  9155  18   22:2   197               CHARACTR[ CAMPCHAR].POSS.POSSESS[ POSSX];
  9156  18   22:1   220           CHARACTR[ CAMPCHAR].POSS.POSSCNT :=
  9157  18   22:1   229                                           CHARACTR[ CAMPCHAR].POSS.POSSCNT - 1;
  9158  18   22:1   241           DSPITEMS;
  9159  18   22:1   243           EXITDROP( 'DROPPED')
  9160  18   22:0   253         END;  (* DROPITEM *)
  9161  18   22:0   272       
  9162  18   22:0   272 (*$I WIZ3C:CAMP      *)
  9162  18   22:0   272 (*$I WIZ3C:CAMP2     *)
  9163  18   24:D     1       PROCEDURE IDENTIFY;  (* P010C18 *)
  9164  18   24:D     1       
  9165  18   24:D     1         VAR
  9166  18   24:D     1              UNUSEDXX : INTEGER;
  9167  18   24:D     2       
  9168  18   24:0     0         BEGIN
  9169  18   24:1     0           IF CHARACTR[ CAMPCHAR].CLASS <> BISHOP THEN
  9170  18   24:2    13             EXIT( IDENTIFY);
  9171  18   24:1    17           BASE04 := CAMPCHAR;
  9172  18   24:1    22           BASE291.GOTOX := 1;
  9173  18   24:1    26           XGOTO := XCAMPSTF;
  9174  18   24:1    30           EXIT( CAMP)
  9175  18   24:0    34         END;
  9176  18   24:0    46         
  9177  18   24:0    46         
  9178  18   25:D     1       PROCEDURE DOTRADE;  (* P010C19 *)
  9179  18   25:D     1       
  9180  18   25:D     1         VAR
  9181  18   25:D     1              GOLD2TRA : TWIZLONG;
  9182  18   25:D     4              TRADETO  : INTEGER;
  9183  18   25:D     5              GOLDSTR  : STRING;
  9184  18   25:D    46              GOLDX    : INTEGER;
  9185  18   25:D    47              TEMP0001 : INTEGER; (* MULTIPLE USES *)
  9186  18   25:D    48              ITEMX    : INTEGER;
  9187  18   25:D    49              
  9188  18   25:D    49              
  9189  18   26:D     1         PROCEDURE EXITTRAD( EXITSTR: STRING);  (* P010C1A *)
  9190  18   26:D    43         
  9191  18   26:0     0           BEGIN
  9192  18   26:1     0             AASTRAA( EXITSTR);
  9193  18   26:1     9             DELWIN( TEMPWIN, TRUE);
  9194  18   26:1    16             DSPSTATS;
  9195  18   26:1    18             EXIT( DOTRADE)
  9196  18   26:0    22           END;
  9197  18   26:0    34           
  9198  18   26:0    34           
  9199  18   27:D     1         PROCEDURE TRADGOLD;  (* P010C1B *)
  9200  18   27:D     1         
  9201  18   27:D     1           VAR
  9202  18   27:D     1                TEMPGOLD : TWIZLONG;
  9203  18   27:D     4                MULT10   : INTEGER;
  9204  18   27:D     5         
  9205  18   27:0     0           BEGIN
  9206  18   27:1     0             CLEARWIN( TEMPWIN, TRUE);
  9207  18   27:1     7             CENTSTR(  TEMPWIN, 'TRADE GOLD (AMT)');
  9208  18   27:1    32             CENTSTR(  TEMPWIN, '(RETURN) EXITS');
  9209  18   27:1    55             PRINTSTR( TEMPWIN, '-->');
  9210  18   27:1    67             GETSTR(   TEMPWIN, GOLDSTR, 12);
  9211  18   27:1    77             IF GOLDSTR = '' THEN
  9212  18   27:2    87               EXIT( TRADGOLD);
  9213  18   27:1    91             FILLCHAR( TEMPGOLD, 6, 0);
  9214  18   27:1    98             FILLCHAR( GOLD2TRA, 6, 0);
  9215  18   27:1   106             TEMP0001 := 0;
  9216  18   27:1   110             MULT10 := 10;
  9217  18   27:1   113             FOR GOLDX := 1 TO LENGTH( GOLDSTR) DO
  9218  18   27:2   131               IF (ORD( GOLDSTR[ GOLDX]) < ORD( '0')) OR
  9219  18   27:2   140                  (ORD( GOLDSTR[ GOLDX]) > ORD( '9')) OR
  9220  18   27:2   150                  (GOLDX > 12) OR
  9221  18   27:2   156                  (TEMP0001 = -1)    THEN
  9222  18   27:3   165                 TEMP0001 := -1
  9223  18   27:2   165               ELSE
  9224  18   27:3   172                 BEGIN
  9225  18   27:4   172                   MULTLONG( GOLD2TRA, MULT10);
  9226  18   27:4   180                   TEMPGOLD.LOW := ORD( GOLDSTR[ GOLDX]) - ORD( '0');
  9227  18   27:4   191                   ADDLONGS( GOLD2TRA, TEMPGOLD)
  9228  18   27:3   196                 END;
  9229  18   27:1   209             IF TEMP0001 = -1 THEN
  9230  18   27:2   217               EXITTRAD( 'BAD AMT');
  9231  18   27:1   229             IF TESTLONG( CHARACTR[ CAMPCHAR].GOLD, GOLD2TRA) < 0 THEN
  9232  18   27:2   250               EXITTRAD( 'TOO MUCH');
  9233  18   27:1   263             ADDLONGS( CHARACTR[ TRADETO].GOLD, GOLD2TRA);
  9234  18   27:1   278             SUBLONGS( CHARACTR[ CAMPCHAR].GOLD, GOLD2TRA)
  9235  18   27:0   290           END;  (* TRADGOLD *)
  9236  18   27:0   308           
  9237  18   27:0   308           
  9238  18   28:D     1         PROCEDURE TRADITEM;  (* P010C1C *)
  9239  18   28:D     1         
  9240  18   28:0     0           BEGIN
  9241  18   28:1     0             REPEAT
  9242  18   28:2     0               REPEAT
  9243  18   28:3     0                 CLEARWIN( TEMPWIN, TRUE);
  9244  18   28:3     7                 CENTSTR(  TEMPWIN, 'TRADE ITEM (NUM)');
  9245  18   28:3    32                 CENTSTR(  TEMPWIN, '(RETURN) EXITS');
  9246  18   28:3    55                 GETKEY;
  9247  18   28:3    58                 ITEMX := ORD( INCHAR) - ORD( '0');
  9248  18   28:3    64                 IF INCHAR = CHR( CRETURN) THEN
  9249  18   28:4    69                   EXIT( TRADITEM)
  9250  18   28:2    73               UNTIL (ITEMX > 0) AND
  9251  18   28:2    78                     (ITEMX <= CHARACTR[ CAMPCHAR].POSS.POSSCNT);
  9252  18   28:2    94               IF CHARACTR[ TRADETO].POSS.POSSCNT = 8 THEN
  9253  18   28:3   107                 EXITTRAD( 'FULL');
  9254  18   28:2   116               IF CHARACTR[ CAMPCHAR].POSS.POSSESS[ ITEMX].CURSED THEN
  9255  18   28:3   135                 EXITTRAD( 'CURSED');
  9256  18   28:2   146               IF CHARACTR[ CAMPCHAR].POSS.POSSESS[ ITEMX].EQUIPED THEN
  9257  18   28:3   165                 EXITTRAD( 'EQUIPPED');
  9258  18   28:2   178               TEMP0001 := CHARACTR[ TRADETO].POSS.POSSCNT + 1;
  9259  18   28:2   192               CHARACTR[ TRADETO].POSS.POSSESS[ TEMP0001] :=
  9260  18   28:2   208                 CHARACTR[ CAMPCHAR].POSS.POSSESS[ ITEMX];
  9261  18   28:2   226               CHARACTR[ TRADETO].POSS.POSSCNT := TEMP0001;
  9262  18   28:2   239               FOR TEMP0001 := ITEMX + 1 TO CHARACTR[ CAMPCHAR].POSS.POSSCNT DO
  9263  18   28:3   265                 CHARACTR[ CAMPCHAR].POSS.POSSESS[ TEMP0001 - 1] :=
  9264  18   28:3   283                   CHARACTR[ CAMPCHAR].POSS.POSSESS[ TEMP0001];
  9265  18   28:2   311               CHARACTR[ CAMPCHAR].POSS.POSSCNT :=
  9266  18   28:2   320                                           CHARACTR[ CAMPCHAR].POSS.POSSCNT - 1;
  9267  18   28:2   332               DSPITEMS
  9268  18   28:1   332             UNTIL FALSE
  9269  18   28:0   334           END;  (* TRADITEM *)
  9270  18   28:0   356       
  9271  18   28:0   356       
  9272  18   25:0     0         BEGIN (* DOTRADE *)
  9273  18   25:1     0           TRADETO := WHOINDEX( 'TRADE WITH', CAMPCHAR);
  9274  18   25:1    22           IF TRADETO = -1 THEN
  9275  18   25:2    28             EXIT( DOTRADE);
  9276  18   25:1    32           TEMPWIN := GETWIN( 13, 8, 26, 5, 15, TRUE);
  9277  18   25:1    46           TRADGOLD;
  9278  18   25:1    48           TRADITEM;
  9279  18   25:1    50           DELWIN( TEMPWIN, TRUE);
  9280  18   25:1    57           DSPSTATS
  9281  18   25:0    57         END;  (* DOTRADE *)
  9282  18   25:0    72         
  9283  18   25:0    72         
  9284  18   29:D     1       PROCEDURE CAMPDO;  (* P010C1D *)
  9285  18   29:D     1       
  9286  18   29:D     1         VAR
  9287  18   29:D     1              MENUTYPE : INTEGER;
  9288  18   29:D     2       
  9289  18   29:D     2       
  9290  18   30:D     1         PROCEDURE CAMPMENU;  (* P010C1E *)
  9291  18   30:D     1         
  9292  18   30:0     0           BEGIN
  9293  18   30:1     0             WITH CHARACTR[ CAMPCHAR] DO
  9294  18   30:2     9               BEGIN
  9295  18   30:3     9                 IF XGOTO = XINSPCT3 THEN
  9296  18   30:4    16                   MENUTYPE := 0
  9297  18   30:3    16                 ELSE IF XGOTO = XINSPECT THEN
  9298  18   30:5    29                   MENUTYPE := 1
  9299  18   30:4    29                 ELSE IF STATUS = OK THEN
  9300  18   30:6    42                   MENUTYPE := 2
  9301  18   30:5    42                 ELSE
  9302  18   30:6    48                   MENUTYPE := 1;
  9303  18   30:6    52                   
  9304  18   30:3    52                 IF MENUTYPE = 2 THEN
  9305  18   30:4    59                   BEGIN
  9306  18   30:5    59                     TEMPWIN := GETWIN( 0, 20, 40, 4, 8, TRUE);
  9307  18   30:5    73                     MENUX := MENU( TEMPWIN, 
  9308  18   30:5    76           'R)EAD/E)QUIP/T)RADE/D)ROP/P)OOL GOLD/I)DENTIFY/S)PELL/U)SE/L)EAVE');
  9309  18   30:5   152                     IF MENUX = 8 THEN
  9310  18   30:6   159                       MENUX := -1
  9311  18   30:4   159                   END
  9312  18   30:3   164                 ELSE IF MENUTYPE = 1 THEN
  9313  18   30:5   173                   BEGIN
  9314  18   30:6   173                     TEMPWIN := GETWIN(0, 20, 40, 4, 8, TRUE);
  9315  18   30:6   187                     MENUX := MENU( TEMPWIN, 
  9316  18   30:6   190                                 'R)EAD/E)QUIP/T)RADE/D)ROP/P)OOL GOLD/L)EAVE');
  9317  18   30:6   244                     IF MENUX = 5 THEN
  9318  18   30:7   251                       MENUX := -1
  9319  18   30:5   251                   END
  9320  18   30:4   256                 ELSE
  9321  18   30:5   258                   BEGIN
  9322  18   30:6   258                     TEMPWIN := GETWIN( 0, 20, 40, 4, 8, TRUE);
  9323  18   30:6   272                     MENUX := MENU( TEMPWIN, 'R)EAD/L)EAVE');
  9324  18   30:6   298                     IF MENUX = 1 THEN
  9325  18   30:7   305                       MENUX := -1
  9326  18   30:5   305                   END;
  9327  18   30:3   310                 DELWIN( TEMPWIN, FALSE)
  9328  18   30:2   314               END
  9329  18   30:0   317           END;  (* CAMPMENU *)
  9330  18   30:0   332           
  9331  18   30:0   332           
  9332  18   29:0     0         BEGIN (* CAMPDO *)
  9333  18   29:1     0           CAMPMENU;
  9334  18   29:1     2           CASE MENUX OF
  9335  18   29:1     7             -1:  EXIT( CAMPDO);
  9336  18   29:1    13              1:  IF MENUTYPE > 0 THEN
  9337  18   29:3    18                    BEGIN
  9338  18   29:4    18                      XGOTO := XEQPDSP;
  9339  18   29:4    22                      BASE04 := CAMPCHAR;
  9340  18   29:4    27                      EXIT( CAMP)
  9341  18   29:3    31                    END;
  9342  18   29:1    33              0:  BEGIN
  9343  18   29:3    33                    XGOTO := XCAMPSTF;
  9344  18   29:3    37                    BASE291.GOTOX := 0;
  9345  18   29:3    41                    BASE04 := CAMPCHAR;
  9346  18   29:3    46                    EXIT( CAMP)
  9347  18   29:2    50                  END;
  9348  18   29:1    52              3:  BEGIN
  9349  18   29:3    52                    IF MENUTYPE > 0 THEN
  9350  18   29:4    57                      DROPITEM
  9351  18   29:2    57                  END;
  9352  18   29:1    61              4:  BEGIN
  9353  18   29:3    61                    FOR BASE04 := 0 TO PARTYCNT - 1 DO
  9354  18   29:4    74                      IF BASE04 <> CAMPCHAR THEN
  9355  18   29:5    81                        BEGIN
  9356  18   29:6    81                          WITH CHARACTR[ BASE04].GOLD DO
  9357  18   29:7    90                            BEGIN
  9358  18   29:8    90                              ADDLONGS( CHARACTR[ CAMPCHAR].GOLD,
  9359  18   29:8    99                                        CHARACTR[ BASE04].GOLD);
  9360  18   29:8   109                              HIGH := 0;
  9361  18   29:8   114                              MID  := 0;
  9362  18   29:8   119                              LOW  := 0
  9363  18   29:7   120                            END
  9364  18   29:5   122                        END;
  9365  18   29:3   129                    DSPSTATS
  9366  18   29:2   129                  END;
  9367  18   29:1   133              5:  IF MENUTYPE = 2 THEN
  9368  18   29:3   138                    IDENTIFY;
  9369  18   29:1   142              6:  IF MENUTYPE = 2 THEN
  9370  18   29:3   147                    CASTSPEL( -1);
  9371  18   29:1   153              7:  IF MENUTYPE = 2 THEN
  9372  18   29:3   158                    USEITEM;
  9373  18   29:1   162              2:  DOTRADE
  9374  18   29:1   162            END
  9375  18   29:0   192         END;  (* CAMPDO *)
  9376  18   29:0   210         
  9377  18   29:0   210         
  9378  18   31:D     1       PROCEDURE CHEVRONS;  (* P010C1F *)
  9379  18   31:D     1       
  9380  18   31:D     1         VAR
  9381  18   31:D     1              INDX     : INTEGER;
  9382  18   31:D     2              LOSTXYL4 : PACKED ARRAY[ 0..15] OF BOOLEAN;
  9383  18   31:D     3       
  9384  18   31:0     0         BEGIN
  9385  18   31:1     0           MOVELEFT( CHARACTR[ CAMPCHAR].LOSTXYL.AWARDS[ 4], LOSTXYL4, 2);
  9386  18   31:1    21           PRINTSTR( CAMPWIN, ' "');
  9387  18   31:1    32           FOR INDX := 0 TO 15 DO
  9388  18   31:2    43             IF LOSTXYL4[ INDX] THEN
  9389  18   31:3    52               PRINTSTR( CAMPWIN, COPY( '>!$#&*<?BCPKODG@', INDX + 1, 1));
  9390  18   31:1    95           PRINTSTR( CAMPWIN, '" ')
  9391  18   31:0   103         END;  (* CHEVRONS *)
  9392  18   31:0   120         
  9393  18   31:0   120         
  9394  18    4:0     0       BEGIN  (* INSPECT *)
  9395  18    4:1     0         CAMPCHAR := BASE04;
  9396  18    4:1     3         IF CAMPWIN = NIL THEN
  9397  18    4:2    10           BEGIN
  9398  18    4:3    10             CAMPWIN := GETWIN( 0, 4, 40, 17, 7, TRUE);
  9399  18    4:3    24             PRINTSTR( CAMPWIN, CHARACTR[ CAMPCHAR].NAME);
  9400  18    4:3    35             WHILE CAMPWIN^.HEAD.HCURSOR <= 15 DO
  9401  18    4:4    47               PRINTCHR( CAMPWIN, ' ');
  9402  18    4:3    56             PRINTCHR( CAMPWIN, 'L');
  9403  18    4:3    63             PRINTNUM( CAMPWIN, CHARACTR[ CAMPCHAR].CHARLEV,3);
  9404  18    4:3    77             PRINTCHR( CAMPWIN, ' ');
  9405  18    4:3    84             PRINTSTR( CAMPWIN,
  9406  18    4:3    87                       COPY( SCNTOC.ALIGN[ CHARACTR[ CAMPCHAR].ALIGN], 1, 1));
  9407  18    4:3   111             PRINTCHR( CAMPWIN, '-');
  9408  18    4:3   118             PRINTSTR( CAMPWIN,
  9409  18    4:3   121                       COPY( SCNTOC.CLASS[ CHARACTR[ CAMPCHAR].CLASS], 1, 3));
  9410  18    4:3   145             PRINTCHR( CAMPWIN, ' ');
  9411  18    4:3   152             PRINTSTR( CAMPWIN,
  9412  18    4:3   155                             SCNTOC.RACE[  CHARACTR[ CAMPCHAR].RACE]); 
  9413  18    4:3   170             CHEVRONS;
  9414  18    4:3   172             DSPSPELS
  9415  18    4:2   172           END;
  9416  18    4:1   174           DSPSTATS;
  9417  18    4:1   176           DSPITEMS;
  9418  18    4:1   178           XGOTO2 := XGOTO;
  9419  18    4:1   184           REPEAT
  9420  18    4:2   184             CAMPDO
  9421  18    4:1   184           UNTIL MENUX = -1;
  9422  18    4:1   192           DELWIN( CAMPWIN, FALSE)
  9423  18    4:0   196       END;   (* INSPECT *)
  9424  18    4:0   218       
  9425  18    4:0   218       
  9426  18    1:0     0     BEGIN  (* CAMP *)
  9427  18    1:1     0       FOR TEMPX := 1 TO 8 DO
  9428  18    1:2    17         OBJIDS[ TEMPX - 1] := -1;
  9429  18    1:1    39       IF (XGOTO = XBCK2CMP) OR
  9430  18    1:1    44          (XGOTO = XBK2CMP2) THEN
  9431  18    1:2    52         BEGIN
  9432  18    1:3    52           XGOTO := XGOTO2;
  9433  18    1:3    58           IF XGOTO = XINSPCT2 THEN
  9434  18    1:4    65             INSPECT
  9435  18    1:2    65         END;
  9436  18    1:1    67       IF XGOTO = XINSPECT THEN
  9437  18    1:2    74         BEGIN
  9438  18    1:3    74           INSPECT;
  9439  18    1:3    76           XGOTO := XGILGAMS;
  9440  18    1:3    80           EXIT( CAMP)
  9441  18    1:2    84         END;
  9442  18    1:1    84       IF XGOTO = XINSPCT3 THEN
  9443  18    1:2    91         BEGIN
  9444  18    1:3    91           BASE04 := 0;
  9445  18    1:3    94           INSPECT;
  9446  18    1:3    96           XGOTO := XBCK2ROL;
  9447  18    1:3   100           EXIT( CAMP)
  9448  18    1:2   104         END;
  9449  18    1:1   104       FOR TEMPX := 0 TO PARTYCNT - 1 DO
  9450  18    1:2   123         DSP1LINE( TEMPX);
  9451  18    1:1   138       REPEAT
  9452  18    1:2   138         IF CAMPTIT = NIL THEN
  9453  18    1:3   145           BEGIN
  9454  18    1:4   145             CAMPTIT := GETWIN( 17, 0, 6, 3, 1, TRUE);
  9455  18    1:4   159             PRINTSTR( CAMPTIT, 'CAMP')
  9456  18    1:3   169           END;
  9457  18    1:2   172         TEMPWIN := GETWIN( 14, 4, 12, 6, 1, TRUE);
  9458  18    1:2   186         BASE04 := MENU( TEMPWIN, '^)INSPECT/R)EORDER/E)QUIP/L)EAVE');
  9459  18    1:2   231         DELWIN( TEMPWIN, FALSE);
  9460  18    1:2   238         CASE BASE04 OF
  9461  18    1:2   241           0, 1, 2, 3, 4, 5:  BEGIN
  9462  18    1:4   241                                FOR TEMPX := 1 TO 8 DO
  9463  18    1:5   258                                  OBJIDS[ TEMPX - 1] := -1;
  9464  18    1:4   280                                INSPECT
  9465  18    1:3   280                              END;
  9466  18    1:3   284                              
  9467  18    1:2   284                          6:  BEGIN
  9468  18    1:4   284                                XGOTO := XREORDER;
  9469  18    1:4   288                                EXIT( CAMP)
  9470  18    1:3   292                              END;
  9471  18    1:3   294                              
  9472  18    1:2   294                          8:  BEGIN
  9473  18    1:4   294                                DELWIN( CAMPTIT, TRUE);
  9474  18    1:4   301                                XGOTO := XCMP2EQ6;
  9475  18    1:4   305                                EXIT( CAMP)
  9476  18    1:3   309                              END;
  9477  18    1:3   311                              
  9478  18    1:2   311                          7:  BEGIN
  9479  18    1:4   311                                XGOTO := XEQPDSP;
  9480  18    1:4   315                                BASE04 := -1;
  9481  18    1:4   319                                EXIT( CAMP)
  9482  18    1:3   323                              END
  9483  18    1:2   323         END
  9484  18    1:1   350       UNTIL FALSE
  9485  18    1:0   350     END;  (* CAMP *)
  9486  18    1:0   374   
  9487  18    1:0   374 (*$I WIZ3C:CAMP2     *)
  9488  18    1:0   374                         
  9488  18    1:0   374 (*$I WIZ3C:REWARDS   *)
  9489  19    1:D     1   SEGMENT PROCEDURE REWARDS;    (* P010D01 *)
  9490  19    1:D     1     
  9491  19    1:D     1     VAR
  9492  19    1:D     1          EXPPERCH : TWIZLONG;
  9493  19    1:D     4          ALIVECNT : INTEGER;
  9494  19    1:D     5          ONEORTWO : INTEGER;
  9495  19    1:D     6          REWARDI  : INTEGER;
  9496  19    1:D     7          TRAP3TYP : INTEGER;
  9497  19    1:D     8   
  9498  19    1:D     8   
  9499  19    2:D     3     FUNCTION WHOWILL( ACTION: STRING) : INTEGER;  (* P010D02 *)
  9500  19    2:D    45     
  9501  19    2:0     0       BEGIN
  9502  19    2:1     0         UNPROWIN( CHARSWIN, TRUE);
  9503  19    2:1    12         CLRRECT(  TEMPWIN, 0, 2, 38, 4);
  9504  19    2:1    22         MVCURSOR( TEMPWIN, 0, 2);
  9505  19    2:1    30         CENTSTR(  TEMPWIN, CONCAT( 'WHO (NUM) WILL ', ACTION, ' ?'));
  9506  19    2:1    84         CENTSTR(  TEMPWIN, '(RETURN) EXITS');
  9507  19    2:1   107         GETKEY;
  9508  19    2:1   110         WHOWILL := ORD( INCHAR) - ORD( '0') - 1;
  9509  19    2:1   117         PROTWIN( CHARSWIN, TRUE) 
  9510  19    2:0   121       END;  (* WHOWILL *)
  9511  19    2:0   136       
  9512  19    2:0   136       
  9513  19    3:D     1     PROCEDURE PIC2SCRN( BUFFERI: INTEGER);  (* P010D03 *)
  9514  19    3:D     2     
  9515  19    3:D     2       TYPE
  9516  19    3:D     2            BYTE = PACKED ARRAY[ 0..1] OF CHAR;
  9517  19    3:D     2     
  9518  19    3:D     2       VAR
  9519  19    3:D     2            CHRVAL : CHAR;
  9520  19    3:D     3            X      : INTEGER;
  9521  19    3:D     4            Y      : INTEGER;
  9522  19    3:D     5            MEMLOC : RECORD CASE BOOLEAN OF
  9523  19    3:D     5                FALSE : (I : INTEGER);
  9524  19    3:D     5                TRUE  : (P : ^BYTE);
  9525  19    3:D     5              END;
  9526  19    3:D     6            
  9527  19    3:0     0       BEGIN
  9528  19    3:1     0         MEMLOC.I := 2560;  (* $0A00 *)
  9529  19    3:1     5         MOVELEFT( IOCACHE[  BUFFERI], MEMLOC.P^, 512);
  9530  19    3:1    16         CHRVAL := CHR( 192);   (* $C0   *)
  9531  19    3:1    21         FOR Y := 0 TO 5 DO
  9532  19    3:2    32           BEGIN
  9533  19    3:3    32             MVCURSOR( MAINWIN, 13, 9 + Y);
  9534  19    3:3    42             FOR X := 0 TO 9 DO
  9535  19    3:4    53               BEGIN
  9536  19    3:5    53                 PRPICCH( MAINWIN, CHRVAL);
  9537  19    3:5    60                 CHRVAL := SUCC( CHRVAL)
  9538  19    3:4    63               END
  9539  19    3:2    65           END
  9540  19    3:0    72       END;  (* PIC2SCRN *)
  9541  19    3:0    96       
  9542  19    3:0    96       
  9543  19    4:D     1     PROCEDURE ENMYREWD;  (* P010D04 *)
  9544  19    4:D     1     
  9545  19    4:D     1       VAR
  9546  19    4:D     1            ENEMY : TENEMY;
  9547  19    4:D    80     
  9548  19    4:0     0       BEGIN
  9549  19    4:1     0         MOVELEFT( IOCACHE[ GETREC( ZENEMY, ENEMYINX, SIZEOF( TENEMY))],
  9550  19    4:1    15                   ENEMY,
  9551  19    4:1    18                   SIZEOF( TENEMY));
  9552  19    4:1    23         IF ENEMY.UNUSEDXX > 0 THEN
  9553  19    4:2    29           BEGIN
  9554  19    4:3    29             ENEMY.UNUSEDXX := ENEMY.UNUSEDXX - 1;
  9555  19    4:3    35             MOVELEFT( ENEMY,
  9556  19    4:3    38                       IOCACHE[ GETRECW( ZENEMY, ENEMYINX, SIZEOF( TENEMY))],
  9557  19    4:3    53                       SIZEOF( TENEMY))
  9558  19    4:2    58           END;
  9559  19    4:1    58         ONEORTWO := 1;
  9560  19    4:1    62         IF ATTK012 = 0 THEN
  9561  19    4:2    69           REWARDI := ENEMY.REWARD1
  9562  19    4:1    69         ELSE IF ATTK012 = 1 THEN
  9563  19    4:3    83           BEGIN
  9564  19    4:4    83             REWARDI := ENEMY.REWARD1;
  9565  19    4:4    88             ONEORTWO := 2
  9566  19    4:3    88           END
  9567  19    4:2    92         ELSE
  9568  19    4:3    94           REWARDI := ENEMY.REWARD2
  9569  19    4:0    94       END;  (* ENMYREWD *)
  9570  19    4:0   112       
  9571  19    4:0   112       
  9572  19    5:D     1     PROCEDURE FOUNDITM( FNDCHARX: INTEGER;  (* P010D05 *)
  9573  19    5:D     2                         ITEMINDX: INTEGER);
  9574  19    5:D     3     
  9575  19    5:D     3       VAR
  9576  19    5:D     3            POSSX    : INTEGER;
  9577  19    5:D     4            UNUSEDXX : ARRAY[ 1..104] OF INTEGER;
  9578  19    5:D   108            OBJECTRC : TOBJREC;
  9579  19    5:D   147     
  9580  19    5:D   147     
  9581  19    6:D     1       PROCEDURE DUMMY( CHARX: INTEGER);  (* P010D06 UNUSED *)
  9582  19    6:D     2       
  9583  19    6:D     2         VAR
  9584  19    6:D     2              POSSX : INTEGER;
  9585  19    6:D     3       
  9586  19    6:0     0         BEGIN
  9587  19    6:1     0           WITH CHARACTR[ CHARX] DO
  9588  19    6:2     7             BEGIN
  9589  19    6:3     7               FOR POSSX := 1 TO POSS.POSSCNT DO
  9590  19    6:4    20                 IF POSS.POSSESS[ POSSX].EQINDEX = ITEMINDX THEN
  9591  19    6:5    35                   EXIT( FOUNDITM)
  9592  19    6:2    39             END
  9593  19    6:0    46         END;
  9594  19    6:0    60         
  9595  19    6:0    60         
  9596  19    5:0     0       BEGIN  (* FOUNDITM *)
  9597  19    5:1     0         ITEMINDX := ITEMINDX + 1000;
  9598  19    5:1     7         MOVELEFT( IOCACHE[ GETREC( ZOBJECT,
  9599  19    5:1    11                                    ITEMINDX - 1000,
  9600  19    5:1    16                                    SIZEOF( TOBJREC))],
  9601  19    5:1    22                   OBJECTRC,
  9602  19    5:1    25                   SIZEOF( TOBJREC));
  9603  19    5:1    28         TEMPWIN := GETWIN( 0, 2, 40, 3, 31, TRUE);
  9604  19    5:1    42         PRINTSTR( TEMPWIN, CHARACTR[ FNDCHARX].NAME);
  9605  19    5:1    53         PRINTSTR( TEMPWIN, ' FOUND : ');
  9606  19    5:1    71         PRINTSTR( TEMPWIN, OBJECTRC.NAMEUNK);
  9607  19    5:1    79         DELWIN(   TEMPWIN, FALSE);
  9608  19    5:1    86         WITH CHARACTR[ FNDCHARX].POSS DO
  9609  19    5:2    96           BEGIN
  9610  19    5:3    96             POSSX := POSSCNT + 1;
  9611  19    5:3   104             POSSESS[ POSSX].EQUIPED := FALSE;
  9612  19    5:3   116             POSSESS[ POSSX].IDENTIF := FALSE;
  9613  19    5:3   130             POSSESS[ POSSX].CURSED  := FALSE;
  9614  19    5:3   144             POSSESS[ POSSX].EQINDEX := ITEMINDX;
  9615  19    5:3   158             POSSCNT := POSSX
  9616  19    5:2   161           END
  9617  19    5:0   163       END;   (* FOUNDITM *)
  9618  19    5:0   176       
  9619  19    5:0   176       
  9620  19    7:D     1     PROCEDURE CHSTGOLD;  (* P010D07 *)
  9621  19    7:D     1 
  9622  19    7:D     1       TYPE
  9623  19    7:D     1       
  9624  19    7:D     1         TREWARDX = RECORD
  9625  19    7:D     1             REWDPERC : INTEGER;
  9626  19    7:D     1             BITEM    : INTEGER;
  9627  19    7:D     1             REWDCALC : RECORD CASE INTEGER OF
  9628  19    7:D     1                 1: (GOLD:  RECORD
  9629  19    7:D     1                       TRIES   : INTEGER;
  9630  19    7:D     1                       AVEAMT  : INTEGER;
  9631  19    7:D     1                       MINADD  : INTEGER;
  9632  19    7:D     1                       MULTX   : INTEGER;
  9633  19    7:D     1                       TRIES2  : INTEGER;
  9634  19    7:D     1                       AVEAMT2 : INTEGER;
  9635  19    7:D     1                       MINADD2 : INTEGER;
  9636  19    7:D     1                     END);
  9637  19    7:D     1                 2: (ITEM:  RECORD
  9638  19    7:D     1                       MININDX  : INTEGER;
  9639  19    7:D     1                       MFACTOR  : INTEGER;
  9640  19    7:D     1                       MAXTIMES : INTEGER;
  9641  19    7:D     1                       RANGE    : INTEGER;
  9642  19    7:D     1                       PERCBIGR : INTEGER;
  9643  19    7:D     1                       UNUSEDXX : INTEGER;
  9644  19    7:D     1                       UNUSEDYY : INTEGER;
  9645  19    7:D     1                     END);
  9646  19    7:D     1               END;
  9647  19    7:D     1           END;
  9648  19    7:D     1           
  9649  19    7:D     1         TREWARD = RECORD
  9650  19    7:D     1             BCHEST   : BOOLEAN;
  9651  19    7:D     1             BTRAPTYP : PACKED ARRAY[ 0..7] OF BOOLEAN;
  9652  19    7:D     1             REWRDCNT : INTEGER;
  9653  19    7:D     1             REWARDXX : ARRAY[ 1..9] OF TREWARDX;
  9654  19    7:D     1           END;
  9655  19    7:D     1       
  9656  19    7:D     1       VAR
  9657  19    7:D     1            CHRXCHST : INTEGER;
  9658  19    7:D     2            INDX     : INTEGER;
  9659  19    7:D     3            GOLD2ONE : TWIZLONG;
  9660  19    7:D     6            REWARDZ  : TREWARD;
  9661  19    7:D    90     
  9662  19    7:D    90     
  9663  19    8:D     1       PROCEDURE RDREWARD;  (* P010D08 *)
  9664  19    8:D     1       
  9665  19    8:0     0         BEGIN
  9666  19    8:1     0           MOVELEFT( IOCACHE[ GETREC( ZREWARD, REWARDI, SIZEOF( TREWARD))],
  9667  19    8:1    15                     REWARDZ,
  9668  19    8:1    19                     SIZEOF( TREWARD))
  9669  19    8:0    24         END;
  9670  19    8:0    36         
  9671  19    8:0    36         
  9672  19    9:D     1       PROCEDURE ACHEST;  (* P010D09 *)
  9673  19    9:D     1       
  9674  19    9:D     1         VAR
  9675  19    9:D     1              WHOTRIED : ARRAY[ 0..5] OF BOOLEAN;
  9676  19    9:D     7              TRAPTYPE : INTEGER;
  9677  19    9:D     8              
  9678  19    9:D     8              
  9679  19   10:D     1         PROCEDURE EXTACHES;  (* P010D0A *)
  9680  19   10:D     1         
  9681  19   10:0     0           BEGIN
  9682  19   10:1     0             DELWIN( TEMPWIN, TRUE);
  9683  19   10:1     7             EXIT( ACHEST)
  9684  19   10:0    11           END;
  9685  19   10:0    24           
  9686  19   10:0    24           
  9687  19   11:D     1         PROCEDURE GTTRAPTY;  (* P010D0B *)
  9688  19   11:D     1         
  9689  19   11:D     1         VAR
  9690  19   11:D     1              BTRAPPED : BOOLEAN;
  9691  19   11:D     2              UNUSEDXX : INTEGER;
  9692  19   11:D     3              UNUSEDYY : INTEGER;
  9693  19   11:D     4              ZERO99   : INTEGER;
  9694  19   11:D     5         
  9695  19   11:0     0           BEGIN
  9696  19   11:1     0             BTRAPPED := FALSE;
  9697  19   11:1     3             FOR TRAPTYPE := 0 TO 7 DO
  9698  19   11:2    17               IF REWARDZ.BTRAPTYP[ TRAPTYPE] THEN
  9699  19   11:3    29                 BTRAPPED := TRUE;
  9700  19   11:1    42             TRAP3TYP := (RANDOM MOD 5);
  9701  19   11:1    52             IF NOT BTRAPPED THEN
  9702  19   11:2    56               TRAPTYPE := 0
  9703  19   11:1    56             ELSE
  9704  19   11:2    62               IF (RANDOM MOD 15) > (11 + MAZELEV) THEN
  9705  19   11:3    75                 TRAPTYPE := 0
  9706  19   11:2    75               ELSE
  9707  19   11:3    81                 BEGIN
  9708  19   11:4    81                   ZERO99 := RANDOM MOD 100;
  9709  19   11:4    90                   TRAPTYPE := 0;
  9710  19   11:4    94                   WHILE ZERO99 > 0 DO
  9711  19   11:4    99                     
  9712  19   11:5    99                     REPEAT
  9713  19   11:6    99                       IF TRAPTYPE < 7 THEN
  9714  19   11:7   106                         BEGIN
  9715  19   11:8   106                           IF TRAPTYPE = 3 THEN
  9716  19   11:9   113                             ZERO99 := ZERO99 - 5
  9717  19   11:8   114                           ELSE
  9718  19   11:9   120                             ZERO99 := ZERO99 - 1;
  9719  19   11:8   125                           TRAPTYPE := TRAPTYPE + 1
  9720  19   11:7   128                         END
  9721  19   11:6   133                       ELSE
  9722  19   11:7   135                         TRAPTYPE := 0 + 1
  9723  19   11:5   136                     UNTIL REWARDZ.BTRAPTYP[ TRAPTYPE]
  9724  19   11:5   150                     
  9725  19   11:3   150                 END
  9726  19   11:0   155           END;  (* GTTRAPTY *)
  9727  19   11:0   174           
  9728  19   11:0   174           
  9729  19   12:D     1         PROCEDURE EXITRWDS;  (* P010D0C *)
  9730  19   12:D     1         
  9731  19   12:0     0           BEGIN
  9732  19   12:1     0             DELWIN( TEMPWIN, TRUE);
  9733  19   12:1     7             EXIT( REWARDS)
  9734  19   12:0    11           END;
  9735  19   12:0    24           
  9736  19   12:0    24           
  9737  19   13:D     1         PROCEDURE PRTRAPTY( TRAPTYPE: INTEGER;  (* P010D0D *)
  9738  19   13:D     2                             TRAP3TY:  INTEGER);
  9739  19   13:D     3           
  9740  19   13:D     3           VAR
  9741  19   13:D     3                UNUSEDXX : INTEGER;
  9742  19   13:D     4         
  9743  19   13:0     0           BEGIN
  9744  19   13:1     0             CASE TRAPTYPE OF
  9745  19   13:1     3               0:  CENTSTR( TEMPWIN, 'TRAPLESS CHEST');
  9746  19   13:1    28               1:  CENTSTR( TEMPWIN, 'POISON NEEDLE');
  9747  19   13:1    52               2:  CENTSTR( TEMPWIN, 'GAS BOMB');
  9748  19   13:1    71               3:  CASE TRAP3TY OF
  9749  19   13:2    74                     0:  CENTSTR( TEMPWIN, 'CROSSBOW BOLT');
  9750  19   13:2    98                     1:  CENTSTR( TEMPWIN, 'EXPLODING BOX');
  9751  19   13:2   122                     2:  CENTSTR( TEMPWIN, 'SPLINTERS');
  9752  19   13:2   142                     3:  CENTSTR( TEMPWIN, 'BLADES');
  9753  19   13:2   159                     4:  CENTSTR( TEMPWIN, 'STUNNER');
  9754  19   13:2   177                   END;
  9755  19   13:1   196               4:  CENTSTR( TEMPWIN, 'TELEPORTER');
  9756  19   13:1   217               5:  CENTSTR( TEMPWIN, 'ANTI-MAGE');
  9757  19   13:1   237               6:  CENTSTR( TEMPWIN, 'ANTI-PRIEST');
  9758  19   13:1   259               7:  CENTSTR( TEMPWIN, 'ALARM');
  9759  19   13:1   275             END;
  9760  19   13:1   298             PAUSE2
  9761  19   13:0   298           END;  (* PRTRAPTY *)
  9762  19   13:0   318           
  9763  19   13:0   318           
  9764  19   14:D     1         PROCEDURE DOTRAPDM;  (* P010D0E *)
  9765  19   14:D     1         
  9766  19   14:D     1           VAR
  9767  19   14:D     1                UNUSEDXX : INTEGER;
  9768  19   14:D     2                UNUSEDYY : INTEGER;
  9769  19   14:D     3                CHARX  : INTEGER;
  9770  19   14:D     4         
  9771  19   14:D     4         
  9772  19   15:D     1           PROCEDURE HPDAMAGE( CHARXHIT: INTEGER;  (* P010D0F *)
  9773  19   15:D     2                               HITCNT:   INTEGER;
  9774  19   15:D     3                               HITDAM:   INTEGER);
  9775  19   15:D     4           
  9776  19   15:D     4             VAR
  9777  19   15:D     4                  TOTDAM : INTEGER;
  9778  19   15:D     5           
  9779  19   15:0     0             BEGIN
  9780  19   15:1     0               TOTDAM := 0;
  9781  19   15:1     3               WHILE HITCNT > 0 DO
  9782  19   15:2     8                 BEGIN
  9783  19   15:3     8                   TOTDAM := TOTDAM + (RANDOM MOD HITDAM) + 1;
  9784  19   15:3    21                   HITCNT := HITCNT - 1
  9785  19   15:2    22                 END;
  9786  19   15:1    28               CHARACTR[ CHARXHIT].HPLEFT := CHARACTR[ CHARXHIT].HPLEFT - TOTDAM;
  9787  19   15:1    45               IF CHARACTR[ CHARXHIT].HPLEFT < 1 THEN
  9788  19   15:2    56                 BEGIN
  9789  19   15:3    56                   CHARACTR[ CHARXHIT].HPLEFT := 0;
  9790  19   15:3    65                   CHARACTR[ CHARXHIT].STATUS := DEAD;
  9791  19   15:3    74                   CENTSTR( TEMPWIN, CONCAT( CHARACTR[ CHARXHIT].NAME, ' DIES!'));
  9792  19   15:3   111                   ALIVECNT := ALIVECNT - 1;
  9793  19   15:3   119                   IF ALIVECNT = 0 THEN
  9794  19   15:4   126                     BEGIN
  9795  19   15:5   126                       XGOTO := XCEMETRY;
  9796  19   15:5   130                       DELWIN( TEMPWIN, TRUE);
  9797  19   15:5   137                       EXIT( REWARDS)
  9798  19   15:4   141                     END
  9799  19   15:2   141                 END
  9800  19   15:0   141             END;  (* HPDAMAGE *)
  9801  19   15:0   156             
  9802  19   15:0   156             
  9803  19   16:D     1           PROCEDURE ANTIPM( BMAGEDAM: BOOLEAN);  (* P010D10 *)
  9804  19   16:D     2           
  9805  19   16:D     2            VAR
  9806  19   16:D     2                 PLYZSTON : BOOLEAN;
  9807  19   16:D     3                 CHARPM   : INTEGER;
  9808  19   16:D     4           
  9809  19   16:D     4           
  9810  19   17:D     1             PROCEDURE ISSTONED;  (* P010D11 *)
  9811  19   17:D     1             
  9812  19   17:0     0               BEGIN
  9813  19   17:1     0                 IF CHARACTR[ CHARPM].STATUS < STONED THEN
  9814  19   17:2    13                   CHARACTR[ CHARPM].STATUS := STONED
  9815  19   17:0    22               END;
  9816  19   17:0    36               
  9817  19   17:0    36               
  9818  19   18:D     1             PROCEDURE ISPLYZE;  (* P010D12 *)
  9819  19   18:D     1             
  9820  19   18:0     0               BEGIN
  9821  19   18:1     0                 IF CHARACTR[ CHARPM].STATUS < PLYZE THEN
  9822  19   18:2    13                   CHARACTR[ CHARPM].STATUS := PLYZE
  9823  19   18:0    22               END;
  9824  19   18:0    36               
  9825  19   18:0    36               
  9826  19   16:0     0             BEGIN  (* ANTIPM *)
  9827  19   16:1     0               FOR CHARPM := 0 TO PARTYCNT - 1 DO
  9828  19   16:2    13                 BEGIN
  9829  19   16:3    13                   PLYZSTON := (RANDOM MOD 20) < CHARACTR[ CHARPM].LUCKSKIL[ 4];
  9830  19   16:3    35                   
  9831  19   16:3    35                   CASE CHARACTR[ CHARPM].CLASS OF
  9832  19   16:3    44                        MAGE:  IF BMAGEDAM THEN
  9833  19   16:5    47                                 IF PLYZSTON THEN
  9834  19   16:6    50                                   ISPLYZE
  9835  19   16:5    50                                 ELSE
  9836  19   16:6    54                                   ISSTONED;
  9837  19   16:6    58                                   
  9838  19   16:3    58                     SAMURAI:  IF BMAGEDAM THEN
  9839  19   16:5    61                                 IF NOT PLYZSTON THEN
  9840  19   16:6    65                                   ISPLYZE;
  9841  19   16:6    69                                  
  9842  19   16:3    69                     PRIEST:   IF NOT BMAGEDAM THEN
  9843  19   16:5    73                                 IF PLYZSTON THEN
  9844  19   16:6    76                                   ISPLYZE
  9845  19   16:5    76                                 ELSE
  9846  19   16:6    80                                   ISSTONED;
  9847  19   16:6    84                                   
  9848  19   16:3    84                     BISHOP:   IF NOT BMAGEDAM THEN
  9849  19   16:5    88                                 IF NOT PLYZSTON THEN  (* IF NOT SET... *)
  9850  19   16:6    92                                   ISPLYZE;
  9851  19   16:3    96                   END
  9852  19   16:2   114                 END
  9853  19   16:0   114             END;   (* ANTIPM *)
  9854  19   16:0   136           
  9855  19   16:0   136           
  9856  19   19:D     1           PROCEDURE TYPE3DAM;  (* P010D13 *)
  9857  19   19:D     1           
  9858  19   20:D     1             PROCEDURE HPDAMALL( CHANCHIT: INTEGER;  (* P010D14 *)
  9859  19   20:D     2                                 HITCNT:   INTEGER;
  9860  19   20:D     3                                 HITDAM:   INTEGER);
  9861  19   20:D     4                                
  9862  19   20:D     4               VAR
  9863  19   20:D     4                    CHARXHIT : INTEGER;
  9864  19   20:D     5             
  9865  19   20:0     0               BEGIN
  9866  19   20:1     0                 FOR CHARXHIT := 0 TO PARTYCNT - 1 DO
  9867  19   20:2    13                   IF (RANDOM MOD 100) < CHANCHIT THEN
  9868  19   20:3    24                     HPDAMAGE( CHARXHIT, HITCNT, HITDAM)
  9869  19   20:2    27                   ELSE
  9870  19   20:3    31                     IF (RANDOM MOD 100) < CHANCHIT THEN
  9871  19   20:4    42                       HPDAMAGE( CHARXHIT, HITCNT, (HITDAM DIV 2) + 1)
  9872  19   20:0    49               END;  (* HPDAMALL *)
  9873  19   20:0    72               
  9874  19   20:0    72               
  9875  19   19:0     0             BEGIN (* TYPE3DAM *)
  9876  19   19:1     0               CASE TRAP3TYP OF
  9877  19   19:1     5                 0:  HPDAMAGE( CHRXCHST, MAZELEV + 7, 8);  (* CROSSBOW BOLT *)
  9878  19   19:1    16                 1:  HPDAMALL(       50, MAZELEV + 7, 8);  (* EXPLODING BOX *)
  9879  19   19:1    25                 2:  HPDAMALL(       70, MAZELEV + 7, 6);  (* SPLINTERS     *)
  9880  19   19:1    34                 3:  HPDAMALL(       30, MAZELEV + 7, 12); (* BLADES        *)
  9881  19   19:1    43                 4:  CHARACTR[ CHRXCHST].STATUS := PLYZE;  (* STUNNER       *)
  9882  19   19:1    56               END
  9883  19   19:0    74             END;  (* TYPE3DAM *)
  9884  19   19:0    86         
  9885  19   19:0    86         
  9886  19   14:0     0           BEGIN (* DOTRAPDM *)
  9887  19   14:1     0             CLRRECT( TEMPWIN, 0, 2, 38, 4);
  9888  19   14:1    10             MVCURSOR( TEMPWIN, 0, 2);
  9889  19   14:1    18             IF TRAPTYPE <> 0 THEN
  9890  19   14:2    25               BEGIN
  9891  19   14:3    25                 CENTSTR( TEMPWIN, 'OOPS!');
  9892  19   14:3    39                 PRTRAPTY( TRAPTYPE, TRAP3TYP)
  9893  19   14:2    45               END
  9894  19   14:1    47             ELSE
  9895  19   14:2    49               CENTSTR( TEMPWIN, 'THE CHEST WAS NOT TRAPPED');
  9896  19   14:1    83             PAUSE2;
  9897  19   14:1    86             CLRRECT( TEMPWIN, 0, 2, 38, 4);
  9898  19   14:1    96             MVCURSOR( TEMPWIN, 0, 2);
  9899  19   14:1   104             
  9900  19   14:1   104             CASE TRAPTYPE OF
  9901  19   14:1   109             
  9902  19   14:1   109               1:  (* POISON *)
  9903  19   14:1   109               
  9904  19   14:2   109                     CHARACTR[ CHRXCHST].LOSTXYL.POISNAMT[ 1] :=
  9905  19   14:2   123                       CHARACTR[ CHRXCHST].LOSTXYL.POISNAMT[ 1] + 1;
  9906  19   14:2   143                    
  9907  19   14:1   143               2:  (* GAS *)
  9908  19   14:1   143               
  9909  19   14:2   143                     FOR CHARX := 0 TO PARTYCNT - 1 DO
  9910  19   14:3   156                       IF (RANDOM MOD 20) < CHARACTR[ CHARX].LUCKSKIL[ 3] THEN
  9911  19   14:4   178                         CHARACTR[ CHARX].LOSTXYL.POISNAMT[ 1] := 1;
  9912  19   14:4   201                         
  9913  19   14:1   201               3:  (* CROSSBOW BOLT *)
  9914  19   14:1   201                   (* EXPLODING     *)
  9915  19   14:1   201                   (* SPLINTERS     *)
  9916  19   14:1   201                   (* BLADES        *)
  9917  19   14:1   201                   (* STUNNER       *)
  9918  19   14:1   201                   
  9919  19   14:2   201                     TYPE3DAM;
  9920  19   14:2   205                 
  9921  19   14:1   205               4:  (* TELEPORTER    *)
  9922  19   14:1   205               
  9923  19   14:2   205                     BEGIN
  9924  19   14:3   205                       MAZEX := RANDOM MOD (19 + 1);
  9925  19   14:3   216                       MAZEY := RANDOM MOD (19 + 1);
  9926  19   14:3   227                       DIRECTIO := RANDOM MOD 4
  9927  19   14:2   232                     END;
  9928  19   14:2   238                     
  9929  19   14:1   238               5:  (* ANTI-MAGE *)
  9930  19   14:1   238                   
  9931  19   14:2   238                     ANTIPM( TRUE);
  9932  19   14:2   243                 
  9933  19   14:1   243               6:  (* ANTI-PRIEST *)
  9934  19   14:1   243               
  9935  19   14:2   243                     ANTIPM( FALSE);
  9936  19   14:2   248                 
  9937  19   14:1   248               7:  (* ALARM *)
  9938  19   14:1   248               
  9939  19   14:2   248                     BEGIN
  9940  19   14:3   248                       CHSTALRM := 1;
  9941  19   14:3   252                       DELWIN( TEMPWIN, TRUE);
  9942  19   14:3   259                       EXIT( REWARDS)
  9943  19   14:2   263                     END;
  9944  19   14:1   265             END;
  9945  19   14:1   286             
  9946  19   14:1   286             EXTACHES
  9947  19   14:0   286           END;  (* DOTRAPDAM *)
  9948  19   14:0   306           
  9949  19   14:0   306           
  9950  19   21:D     1         PROCEDURE PRTRAP;  (* P010D15 *)
  9951  19   21:D     1         
  9952  19   21:0     0           BEGIN
  9953  19   21:1     0             CLRRECT(  TEMPWIN, 0, 2, 38, 4);
  9954  19   21:1    10             MVCURSOR( TEMPWIN, 0, 2);
  9955  19   21:1    18             PRTRAPTY( TRAPTYPE, TRAP3TYP);
  9956  19   21:1    26             PAUSE2
  9957  19   21:0    26           END;
  9958  19   21:0    42           
  9959  19   21:0    42           
  9960  19   22:D     1         PROCEDURE PRRNDTRP;  (* P010D16 *)
  9961  19   22:D     1         
  9962  19   22:D     1           VAR
  9963  19   22:D     1                RNDX   : INTEGER;
  9964  19   22:D     2                LOOPER : INTEGER;
  9965  19   22:D     3                TRAP   : INTEGER;
  9966  19   22:D     4         
  9967  19   22:0     0           BEGIN
  9968  19   22:1     0             TRAP := 0;
  9969  19   22:1     3             RNDX := RANDOM MOD 50;
  9970  19   22:1    12             FOR LOOPER := 1 TO RNDX DO
  9971  19   22:2    23               IF TRAP = 7 THEN
  9972  19   22:3    28                 TRAP := 0
  9973  19   22:2    28               ELSE
  9974  19   22:3    33                 TRAP := TRAP + 1;
  9975  19   22:1    45             CLRRECT( TEMPWIN, 0, 2, 38, 4);
  9976  19   22:1    55             MVCURSOR( TEMPWIN, 0, 2);
  9977  19   22:1    63             PRTRAPTY( TRAP, RANDOM MOD 5);
  9978  19   22:1    73             PAUSE2
  9979  19   22:0    73           END;  (* PRRNDTRP *)
  9980  19   22:0    90           
  9981  19   22:0    90           
  9982  19   23:D     1         PROCEDURE INSPCHST;  (* P010D17 *)
  9983  19   23:D     1         
  9984  19   23:D     1           VAR
  9985  19   23:D     1                UNUSEDXX : INTEGER;
  9986  19   23:D     2                CHNCGOOD : INTEGER;
  9987  19   23:D     3                CHARINSP : INTEGER;
  9988  19   23:D     4                
  9989  19   23:0     0           BEGIN
  9990  19   23:1     0             CHARINSP := WHOWILL( 'INSPECT');
  9991  19   23:1    16             IF (CHARINSP < 0) OR (CHARINSP >= PARTYCNT) THEN
  9992  19   23:2    25               EXIT( INSPCHST);
  9993  19   23:1    29             IF CHARACTR[ CHARINSP].STATUS <> OK THEN
  9994  19   23:2    40               EXIT( INSPCHST);
  9995  19   23:1    44             IF WHOTRIED[ CHARINSP] THEN
  9996  19   23:2    53               BEGIN
  9997  19   23:3    53                 CLRRECT( TEMPWIN, 0, 2, 38, 4);
  9998  19   23:3    63                 MVCURSOR( TEMPWIN, 0, 2);
  9999  19   23:3    71                 CENTSTR( TEMPWIN, 'YOU ALREADY LOOKED!');
 10000  19   23:3    99                 PAUSE2;
 10001  19   23:3   102                 EXIT( INSPCHST)
 10002  19   23:2   106               END;
 10003  19   23:1   106             WHOTRIED[ CHARINSP] := TRUE;
 10004  19   23:1   114             CHNCGOOD := CHARACTR[ CHARINSP].ATTRIB[ AGILITY];
 10005  19   23:1   128             IF CHARACTR[ CHARINSP].CLASS = THIEF THEN
 10006  19   23:2   139               CHNCGOOD := CHNCGOOD * 6
 10007  19   23:1   140             ELSE
 10008  19   23:2   146               IF CHARACTR[ CHARINSP].CLASS = NINJA THEN
 10009  19   23:3   157                 CHNCGOOD := CHNCGOOD * 4;
 10010  19   23:1   162             IF CHNCGOOD > 95 THEN
 10011  19   23:2   167               CHNCGOOD := 95;
 10012  19   23:1   170             CHRXCHST := CHARINSP;
 10013  19   23:1   174             IF (RANDOM MOD 100) < CHNCGOOD THEN
 10014  19   23:2   185               PRTRAP
 10015  19   23:1   185             ELSE
 10016  19   23:2   189               IF (RANDOM MOD 20) > CHARACTR[ CHARINSP].ATTRIB[ AGILITY] THEN
 10017  19   23:3   211                 DOTRAPDM
 10018  19   23:2   211               ELSE
 10019  19   23:3   215                 PRRNDTRP;
 10020  19   23:0   217           END;  (* INSPCHST *)
 10021  19   23:0   230           
 10022  19   23:0   230           
 10023  19   24:D     1         PROCEDURE CALFOCH;  (* P010D18 *)
 10024  19   24:D     1         
 10025  19   24:0     0           BEGIN
 10026  19   24:1     0             CHRXCHST := WHOWILL( 'CAST CALFO');
 10027  19   24:1    20             IF (CHRXCHST < 0) OR (CHRXCHST >= PARTYCNT) THEN
 10028  19   24:2    33               EXIT( CALFOCH);
 10029  19   24:1    37             IF NOT (CHARACTR[ CHRXCHST].SPELLSKN[ 28]) THEN
 10030  19   24:2    54               EXIT( CALFOCH);
 10031  19   24:1    58             IF CHARACTR[ CHRXCHST].PRIESTSP[ 2] = 0 THEN
 10032  19   24:2    77               EXIT( CALFOCH);
 10033  19   24:1    81             IF CHARACTR[ CHRXCHST].STATUS <> OK THEN
 10034  19   24:2    94               EXIT( CALFOCH);
 10035  19   24:1    98             WITH CHARACTR[ CHRXCHST] DO
 10036  19   24:2   107               BEGIN
 10037  19   24:3   107                 PRIESTSP[ 2] := PRIESTSP[ 2] - 1;
 10038  19   24:3   127                 IF (RANDOM MOD 100) < 95 THEN
 10039  19   24:4   138                   PRTRAP
 10040  19   24:3   138                 ELSE
 10041  19   24:4   142                   PRRNDTRP
 10042  19   24:2   142               END
 10043  19   24:0   144           END;  (* CALFOCH *)
 10044  19   24:0   156           
 10045  19   24:0   156           
 10046  19   25:D     1         PROCEDURE DISARMTR;  (* P010D19 *)
 10047  19   25:D     1         
 10048  19   25:D     1           VAR
 10049  19   25:D     1                UNUSEDXX : INTEGER;
 10050  19   25:D     2                UNUSEDYY : INTEGER;
 10051  19   25:D     3                UNUSEDZZ : INTEGER;
 10052  19   25:D     4                TRAPSTR  : STRING;
 10053  19   25:D    45         
 10054  19   25:D    45         
 10055  19   26:D     1           PROCEDURE DISARM;  (* P010D1A *)
 10056  19   26:D     1           
 10057  19   26:0     0             BEGIN
 10058  19   26:1     0               CLRRECT(  TEMPWIN, 0, 2, 38, 4);
 10059  19   26:1    10               MVCURSOR( TEMPWIN, 0, 2);
 10060  19   26:1    18               IF (RANDOM MOD 70) < 
 10061  19   26:1    25                  (  CHARACTR[ CHRXCHST].CHARLEV
 10062  19   26:1    32                   - MAZELEV
 10063  19   26:1    34                   - 7
 10064  19   26:1    36                   + (50 * ORD( ((CHARACTR[ CHRXCHST].CLASS = THIEF) OR
 10065  19   26:1    50                                 (CHARACTR[ CHRXCHST].CLASS = NINJA)))
 10066  19   26:1    62                     )
 10067  19   26:1    63                  ) THEN
 10068  19   26:2    67                 BEGIN
 10069  19   26:3    67                   CENTSTR( TEMPWIN, 'YOU DISARMED IT!');
 10070  19   26:3    92                   PAUSE2;
 10071  19   26:3    95                   EXTACHES
 10072  19   26:2    95                 END
 10073  19   26:1    97               ELSE
 10074  19   26:2    99                 IF (RANDOM MOD 20) < CHARACTR[ CHRXCHST].ATTRIB[ AGILITY] THEN
 10075  19   26:3   123                   BEGIN
 10076  19   26:4   123                     CENTSTR( TEMPWIN, 'DISARM FAILED!!');
 10077  19   26:4   147                     PAUSE2;
 10078  19   26:4   150                     EXIT( DISARMTR)
 10079  19   26:3   154                   END
 10080  19   26:2   154                 ELSE
 10081  19   26:3   156                   BEGIN
 10082  19   26:4   156                     CENTSTR( TEMPWIN, 'YOU SET IT OFF!');
 10083  19   26:4   180                     PAUSE2;
 10084  19   26:4   183                     DOTRAPDM
 10085  19   26:3   183                   END
 10086  19   26:0   185             END;  (* DISARM *)
 10087  19   26:0   198           
 10088  19   26:0   198           
 10089  19   25:0     0           BEGIN  (* DISARMTR *)
 10090  19   25:1     0             CHRXCHST := WHOWILL( 'DISARM');
 10091  19   25:1    16             IF (CHRXCHST < 0) OR (CHRXCHST >= PARTYCNT) THEN
 10092  19   25:2    29               EXIT( DISARMTR);
 10093  19   25:1    33             IF CHARACTR[ CHRXCHST].STATUS <> OK THEN
 10094  19   25:2    46               EXIT( DISARMTR);
 10095  19   25:1    50             CLRRECT( TEMPWIN, 0, 2, 38, 4);
 10096  19   25:1    60             MVCURSOR( TEMPWIN, 12, 2);
 10097  19   25:1    68             PRINTSTR( TEMPWIN, 'TRAP ? >');
 10098  19   25:1    85             GETSTR(   TEMPWIN, TRAPSTR, 13);
 10099  19   25:1    94             IF (TRAPSTR = 'POISON NEEDLE') AND (TRAPTYPE = 1) THEN
 10100  19   25:2   122               DISARM
 10101  19   25:1   122             ELSE IF (TRAPSTR = 'GAS BOMB') AND (TRAPTYPE = 2) THEN
 10102  19   25:3   149               DISARM
 10103  19   25:2   149             ELSE IF TRAPTYPE = 3 THEN
 10104  19   25:4   160               BEGIN
 10105  19   25:5   160                 CASE TRAP3TYP OF
 10106  19   25:5   165                   0:  IF TRAPSTR = 'CROSSBOW BOLT' THEN
 10107  19   25:7   187                         DISARM;
 10108  19   25:7   191                        
 10109  19   25:5   191                   1:  IF TRAPSTR = 'EXPLODING BOX' THEN
 10110  19   25:7   213                         DISARM;
 10111  19   25:7   217                        
 10112  19   25:5   217                   2:  IF TRAPSTR = 'SPLINTERS' THEN
 10113  19   25:7   235                         DISARM;
 10114  19   25:7   239                        
 10115  19   25:5   239                   3:  IF TRAPSTR = 'BLADES' THEN
 10116  19   25:7   254                         DISARM;
 10117  19   25:7   258                        
 10118  19   25:5   258                   4:  IF TRAPSTR = 'STUNNER' THEN
 10119  19   25:7   274                         DISARM;
 10120  19   25:5   278                 END;
 10121  19   25:5   296                 
 10122  19   25:5   296                 DOTRAPDM
 10123  19   25:4   296               END
 10124  19   25:3   298             ELSE IF (TRAPSTR = 'TELEPORTER') AND (TRAPTYPE = 4) THEN
 10125  19   25:5   325               DISARM
 10126  19   25:4   325             ELSE IF (TRAPSTR = 'ANTI-MAGE') AND (TRAPTYPE = 5) THEN
 10127  19   25:6   353               DISARM
 10128  19   25:5   353             ELSE IF (TRAPSTR = 'ANTI-PRIEST') AND (TRAPTYPE = 6) THEN
 10129  19   25:7   383               DISARM
 10130  19   25:6   383             ELSE IF (TRAPSTR = 'ALARM') AND (TRAPTYPE = 7) THEN
 10131  19   25:8   407               DISARM
 10132  19   25:7   407             ELSE
 10133  19   25:8   411               DOTRAPDM
 10134  19   25:0   411           END;   (* DISARMTR *)
 10135  19   25:0   432           
 10136  19   25:0   432           
 10137  19   27:D     1         PROCEDURE OPENCHST;  (* P010D1B *)
 10138  19   27:D     1         
 10139  19   27:0     0           BEGIN
 10140  19   27:1     0             CHRXCHST := WHOWILL( 'OPEN');
 10141  19   27:1    14             IF (CHRXCHST < 0) OR (CHRXCHST >= PARTYCNT) THEN
 10142  19   27:2    27               EXIT( OPENCHST);
 10143  19   27:1    31             IF CHARACTR[ CHRXCHST].STATUS <> OK THEN
 10144  19   27:2    44               EXIT( OPENCHST);
 10145  19   27:1    48             IF TRAPTYPE = 0 THEN
 10146  19   27:2    55               EXTACHES;
 10147  19   27:1    57             IF (RANDOM MOD 1000) < CHARACTR[ CHRXCHST].CHARLEV THEN
 10148  19   27:2    78               EXTACHES;
 10149  19   27:1    80             DOTRAPDM
 10150  19   27:0    80           END;  (* OPENCHST *)
 10151  19   27:0    94           
 10152  19   27:0    94           
 10153  19    9:0     0         BEGIN (* ACHEST *)
 10154  19    9:1     0           PIC2SCRN( GETREC( ZSPCCHRS, 18, 512));
 10155  19    9:1    12           FILLCHAR( WHOTRIED, 12, 0);
 10156  19    9:1    19           GTTRAPTY;
 10157  19    9:1    21           TEMPWIN := GETWIN( 0, 2, 40, 6, 31, TRUE);
 10158  19    9:1    35           CENTSTR( TEMPWIN, 'A CHEST! YOU MAY:');
 10159  19    9:1    61           REPEAT
 10160  19    9:2    61             CLRRECT( TEMPWIN, 0, 2, 38, 4);
 10161  19    9:2    71             MVCURSOR( TEMPWIN, 0, 2);
 10162  19    9:2    79             BASE04 := MENU( TEMPWIN,
 10163  19    9:2    82                             'O)PEN/I)NSPECT/C)ALFO/D)ISARM/L)EAVE ALONE');
 10164  19    9:2   134             CASE BASE04 OF
 10165  19    9:2   137               0:  OPENCHST;
 10166  19    9:2   141               1:  INSPCHST;
 10167  19    9:2   145               2:  CALFOCH;
 10168  19    9:2   149               3:  DISARMTR;
 10169  19    9:2   153               4:  EXITRWDS;
 10170  19    9:2   157             END
 10171  19    9:1   174           UNTIL FALSE
 10172  19    9:0   174         END;  (* ACHEST *)
 10173  19    9:0   192         
 10174  19    9:0   192         
 10175  19   28:D     1       PROCEDURE GETREWRD( REWARDM: TREWARDX);  (* P010D1C *)
 10176  19   28:D    11       
 10177  19   28:D    11         VAR
 10178  19   28:D    11              ITEMINDX : INTEGER;
 10179  19   28:D    12              CHARIIII : INTEGER;
 10180  19   28:D    13              CHARXXXX : INTEGER;  (* MULTIPLE USES *)
 10181  19   28:D    14       
 10182  19   28:D    14       
 10183  19   29:D     3         FUNCTION CALCULAT( TRIES:  INTEGER;  (* P010D1D *)
 10184  19   29:D     4                            AVEAMT: INTEGER;
 10185  19   29:D     5                            MINADD: INTEGER) : INTEGER;
 10186  19   29:D     6         
 10187  19   29:D     6           VAR
 10188  19   29:D     6                TOTAL : INTEGER;
 10189  19   29:D     7                
 10190  19   29:0     0           BEGIN
 10191  19   29:1     0             TOTAL := MINADD;
 10192  19   29:1     3             WHILE TRIES > 0 DO
 10193  19   29:2     8               BEGIN
 10194  19   29:3     8                 TOTAL := TOTAL + (RANDOM MOD AVEAMT) + 1;
 10195  19   29:3    21                 TRIES := TRIES - 1
 10196  19   29:2    22               END;
 10197  19   29:1    28             CALCULAT := TOTAL
 10198  19   29:0    28           END;  (* CALCULAT *)
 10199  19   29:0    46           
 10200  19   29:0    46           
 10201  19   30:D     1         PROCEDURE GOLDREWD;  (* P010D1E *)
 10202  19   30:D     1         
 10203  19   30:D     1         VAR
 10204  19   30:D     1              GOLDAMT : TWIZLONG;
 10205  19   30:D     4         
 10206  19   30:0     0           BEGIN
 10207  19   30:1     0             FILLCHAR( GOLDAMT, 6, 0);
 10208  19   30:1     7             GOLDAMT.LOW := CALCULAT( REWARDM.REWDCALC.GOLD.TRIES,
 10209  19   30:1    10                                      REWARDM.REWDCALC.GOLD.AVEAMT,
 10210  19   30:1    13                                      REWARDM.REWDCALC.GOLD.MINADD);
 10211  19   30:1    22             MULTLONG( GOLDAMT, REWARDM.REWDCALC.GOLD.MULTX);
 10212  19   30:1    30             CHARXXXX := CALCULAT( REWARDM.REWDCALC.GOLD.TRIES2,
 10213  19   30:1    33                                   REWARDM.REWDCALC.GOLD.AVEAMT2,
 10214  19   30:1    36                                   REWARDM.REWDCALC.GOLD.MINADD2);
 10215  19   30:1    46             MULTLONG( GOLDAMT, CHARXXXX);
 10216  19   30:1    54             MULTLONG( GOLDAMT, ONEORTWO);
 10217  19   30:1    62             ADDLONGS( GOLD2ONE, GOLDAMT)
 10218  19   30:0    67           END;  (* GOLDREWD *)
 10219  19   30:0    82           
 10220  19   30:0    82           
 10221  19   31:D     1         PROCEDURE ITEMREWD;  (* P010D1F *)
 10222  19   31:D     1         
 10223  19   31:0     0           BEGIN
 10224  19   31:1     0             CHARXXXX := RANDOM MOD PARTYCNT;
 10225  19   31:1    10             CHARIIII := CHARXXXX;
 10226  19   31:1    16             REPEAT
 10227  19   31:2    16               IF (CHARACTR[ CHARXXXX].STATUS = OK) AND
 10228  19   31:2    27                  (CHARACTR[ CHARXXXX].POSS.POSSCNT <> 8) THEN
 10229  19   31:3    41                 BEGIN
 10230  19   31:4    41                   CHARIIII := 0;
 10231  19   31:4    45                   WHILE (CALCULAT( 01, 100, 0) <=
 10232  19   31:4    52                                            REWARDM.REWDCALC.ITEM.PERCBIGR) AND
 10233  19   31:4    56                         (CHARIIII < REWARDM.REWDCALC.ITEM.MAXTIMES) DO
 10234  19   31:5    66                     CHARIIII := CHARIIII + 1;
 10235  19   31:4    76                   ITEMINDX := REWARDM.REWDCALC.ITEM.MININDX +
 10236  19   31:4    79                                 (RANDOM MOD REWARDM.REWDCALC.ITEM.RANGE) +
 10237  19   31:4    89                                 (REWARDM.REWDCALC.ITEM.MFACTOR * CHARIIII);
 10238  19   31:4   100                   FOUNDITM( CHARXXXX, ITEMINDX);
 10239  19   31:4   108                   PAUSE2;
 10240  19   31:4   111                   EXIT( ITEMREWD)
 10241  19   31:3   115                 END
 10242  19   31:2   115               ELSE
 10243  19   31:3   117                 CHARXXXX := (CHARXXXX + 1) MOD PARTYCNT
 10244  19   31:1   122             UNTIL CHARXXXX = CHARIIII
 10245  19   31:0   130           END;  (* ITEMREWD *)
 10246  19   31:0   152           
 10247  19   31:0   152           
 10248  19   28:0     0         BEGIN  (* GETREWRD *)
 10249  19   28:1     0           IF REWARDM.REWDPERC < (RANDOM MOD 100) THEN
 10250  19   28:2    16             EXIT( GETREWRD);
 10251  19   28:1    20           IF REWARDM.BITEM = 0 THEN
 10252  19   28:2    25             GOLDREWD
 10253  19   28:1    25           ELSE
 10254  19   28:2    29             ITEMREWD
 10255  19   28:0    29         END;   (* GETREWRD *)
 10256  19   28:0    44         
 10257  19   28:0    44         
 10258  19   32:D     1       PROCEDURE GIVEGOLD;  (* P010D20 *)
 10259  19   32:D     1       
 10260  19   32:0     0         BEGIN
 10261  19   32:1     0           DIVLONG( GOLD2ONE, ALIVECNT);
 10262  19   32:1     9           TEMPWIN := GETWIN( 0, 2, 40, 3, 31, TRUE);
 10263  19   32:1    23           PRINTSTR( TEMPWIN, 'EACH SURVIVOR GETS ');
 10264  19   32:1    51           PRNTLONG( TEMPWIN, GOLD2ONE);
 10265  19   32:1    60           PRINTSTR( TEMPWIN, ' G.P.!');
 10266  19   32:1    75           DELWIN( TEMPWIN, FALSE);
 10267  19   32:1    82           FOR INDX := 0 TO PARTYCNT - 1 DO
 10268  19   32:2    98             IF CHARACTR[ INDX].STATUS = OK THEN
 10269  19   32:3   111               ADDLONGS( CHARACTR[ INDX].GOLD, GOLD2ONE);
 10270  19   32:1   136           PAUSE2
 10271  19   32:0   136         END;  (* GIVEGOLD *)
 10272  19   32:0   154         
 10273  19   32:0   154         
 10274  19    7:0     0       BEGIN (* CHSTGOLD *)
 10275  19    7:1     0         PROTWIN( CHARSWIN, FALSE);
 10276  19    7:1     7         FILLCHAR( GOLD2ONE, 6, 0);
 10277  19    7:1    14         ENMYREWD;
 10278  19    7:1    16         RDREWARD;
 10279  19    7:1    18         UNITCLEAR( 1);
 10280  19    7:1    21         IF REWARDZ.BCHEST AND (CHSTALRM <> 1) THEN
 10281  19    7:2    30           ACHEST
 10282  19    7:1    30         ELSE
 10283  19    7:2    34           CHSTALRM := 0;
 10284  19    7:1    38         PIC2SCRN( GETREC( ZSPCCHRS, 19, 512));
 10285  19    7:1    50         FOR INDX := 1 TO REWARDZ.REWRDCNT DO
 10286  19    7:2    62           GETREWRD( REWARDZ.REWARDXX[ INDX]);
 10287  19    7:1    78         GIVEGOLD
 10288  19    7:0    78       END;  (* CHSTGOLD *)
 10289  19    7:0    94     
 10290  19    7:0    94 (*$I WIZ3C:REWARDS   *)
 10290  19    7:0    94 (*$I WIZ3C:REWARDS2  *)
 10291  19   33:D     1   PROCEDURE RDSPELLS;  (* P010D21 *)
 10292  19   33:D     1   
 10293  19   33:D     1     CONST
 10294  19   33:D     1          SCNMAGE = 1;
 10295  19   33:D     1          SCNPRST = 2;
 10296  19   33:D     1   
 10297  19   33:D     1     VAR
 10298  19   33:D     1          SPELLWIN : TWINDOWP;
 10299  19   33:D     2          SPELLGRP : INTEGER;  (* MULTIPLE USES *)
 10300  19   33:D     3          SPLISTX  : INTEGER;
 10301  19   33:D     4          DSKSPLNM : INTEGER;
 10302  19   33:D     5          CHARX    : INTEGER;
 10303  19   33:D     6          SPELLX   : INTEGER;
 10304  19   33:D     7          
 10305  19   33:D     7          
 10306  19   34:D     1     PROCEDURE LISTSPLS;  (* P010D22 *)
 10307  19   34:D     1     
 10308  19   34:D     1       VAR
 10309  19   34:D     1            SPELLNM : STRING;
 10310  19   34:D    42            CHPTR   : INTEGER;
 10311  19   34:D    43            
 10312  19   34:D    43            
 10313  19   35:D     1       PROCEDURE PRSPELL( SPELLNM: STRING);  (* P010D23 *)
 10314  19   35:D    43       
 10315  19   35:0     0         BEGIN
 10316  19   35:1     0           IF SPELLNM[ 1] = '*' THEN
 10317  19   35:2    13             BEGIN
 10318  19   35:3    13               SPELLNM := COPY( SPELLNM, 2, LENGTH( SPELLNM) - 1);
 10319  19   35:3    33               SPLISTX := SPLISTX + 1
 10320  19   35:2    36             END;
 10321  19   35:1    41           MVCURSOR( SPELLWIN, 10 * (SPLISTX DIV 15), SPLISTX MOD 15);
 10322  19   35:1    59           IF CHARACTR[ CHARX].SPELLSKN[ SPELLX] THEN
 10323  19   35:2    77             BEGIN
 10324  19   35:3    77               PRINTSTR( SPELLWIN, SPELLNM);
 10325  19   35:3    85               SPLISTX := SPLISTX + 1
 10326  19   35:2    88             END;
 10327  19   35:1    93           SPELLX := SPELLX + 1
 10328  19   35:0    96         END;  (* PRSPELL *)
 10329  19   35:0   114         
 10330  19   35:0   114         
 10331  19   36:D     1       PROCEDURE SPRETURN;  (* P010D24 *)
 10332  19   36:D     1       
 10333  19   36:0     0         BEGIN
 10334  19   36:1     0           SPLISTX := SPLISTX + 1;
 10335  19   36:1     8           MVCURSOR( SPELLWIN, 10 * (SPLISTX DIV 15), SPLISTX MOD 15);
 10336  19   36:1    26           PRINTSTR( SPELLWIN, '(RETURN)');
 10337  19   36:1    43           GETCR;
 10338  19   36:1    46           INCHAR := CHR( 0)
 10339  19   36:0    47         END;  (* SPRETURN *)
 10340  19   36:0    62       
 10341  19   36:0    62       
 10342  19   34:0     0       BEGIN  (* LISTSPLS *)
 10343  19   34:1     0         MOVELEFT( IOCACHE[ GETREC( ZZERO, 0, SIZEOF( TSCNTOC))],
 10344  19   34:1    13                   SCNTOC,
 10345  19   34:1    17                   SIZEOF( TSCNTOC));
 10346  19   34:1    22         UNITREAD( DRIVE1, IOCACHE, BLOCKSZ, SCNTOCBL + DSKSPLNM, 0);
 10347  19   34:1    40         CHPTR := 0;
 10348  19   34:1    43         SPLISTX := 2;
 10349  19   34:1    47         WHILE IOCACHE[ CHPTR] <> CHR( CRETURN) DO
 10350  19   34:2    57           BEGIN
 10351  19   34:3    57             BASE04 := 0;
 10352  19   34:3    60             WHILE IOCACHE[ CHPTR] <> CHR( CRETURN) DO
 10353  19   34:4    70               BEGIN
 10354  19   34:5    70                 BASE04 := BASE04 + 1;
 10355  19   34:5    75                 SPELLNM[ BASE04] :=  IOCACHE[ CHPTR];
 10356  19   34:5    85                 CHPTR := CHPTR + 1
 10357  19   34:4    87               END;
 10358  19   34:3    93             SPELLNM[ 0] := CHR( BASE04);
 10359  19   34:3    98             PRSPELL( SPELLNM);
 10360  19   34:3   102             CHPTR := CHPTR + 1
 10361  19   34:2   104           END;
 10362  19   34:1   110         UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE), SCNTOCBL, 0);
 10363  19   34:1   124         SPRETURN
 10364  19   34:0   124       END;  (* LISTSPLS *)
 10365  19   34:0   142       
 10366  19   34:0   142       
 10367  19   37:D     1     PROCEDURE PRPRIEST;  (* P010D25 *)
 10368  19   37:D     1     
 10369  19   37:0     0       BEGIN
 10370  19   37:1     0         CLEARWIN( SPELLWIN, TRUE);
 10371  19   37:1     7         PRINTSTR( SPELLWIN, 'PRIEST');
 10372  19   37:1    22         DSKSPLNM := SCNPRST;
 10373  19   37:1    26         SPELLX := 22;
 10374  19   37:1    30         LISTSPLS
 10375  19   37:0    30       END;  (* PRPRIEST *)
 10376  19   37:0    44       
 10377  19   37:0    44       
 10378  19   38:D     1     PROCEDURE PRMAGE;  (* P010D26 *)
 10379  19   38:D     1     
 10380  19   38:0     0       BEGIN
 10381  19   38:1     0         DSKSPLNM := SCNMAGE;
 10382  19   38:1     4         SPELLX := 1;
 10383  19   38:1     8         CLEARWIN( SPELLWIN, TRUE);
 10384  19   38:1    15         PRINTSTR( SPELLWIN, 'MAGE');
 10385  19   38:1    28         LISTSPLS
 10386  19   38:0    28       END;  (* PRMAGE *)
 10387  19   38:0    42       
 10388  19   38:0    42     
 10389  19   33:0     0     BEGIN  (* RDSPELLS *)
 10390  19   33:1     0       SPELLWIN := GETWIN( 0, 7, 40, 17, 15, FALSE);
 10391  19   33:1    13       CHARX := BASE04;
 10392  19   33:1    16       REPEAT
 10393  19   33:2    16         CLEARWIN( SPELLWIN, TRUE);
 10394  19   33:2    21         PRINTSTR( SPELLWIN, 'MAGE   SPELLS LEFT = ');
 10395  19   33:2    49         PRINTNUM( SPELLWIN, CHARACTR[ CHARX].MAGESP[ 1], 1);
 10396  19   33:2    67         SPELLGRP := 1 + 1;
 10397  19   33:2    72         WHILE SPELLGRP <= 7 DO
 10398  19   33:3    77           BEGIN
 10399  19   33:4    77             PRINTCHR( SPELLWIN, '/');
 10400  19   33:4    82             PRINTNUM( SPELLWIN, CHARACTR[ CHARX].MAGESP[ SPELLGRP], 1);
 10401  19   33:4   100             SPELLGRP := SPELLGRP + 1
 10402  19   33:3   101           END;
 10403  19   33:2   107         PRINTCR(  SPELLWIN);
 10404  19   33:2   111         PRINTSTR( SPELLWIN, 'PRIEST SPELLS LEFT = ');
 10405  19   33:2   139         PRINTNUM( SPELLWIN, CHARACTR[ CHARX].PRIESTSP[ 1], 1);
 10406  19   33:2   157         SPELLGRP := 1 + 1;
 10407  19   33:2   162         WHILE SPELLGRP <= 7 DO
 10408  19   33:3   167           BEGIN
 10409  19   33:4   167             PRINTCHR( SPELLWIN, '/');
 10410  19   33:4   172             PRINTNUM( SPELLWIN, CHARACTR[ CHARX].PRIESTSP[ SPELLGRP], 1);
 10411  19   33:4   190             SPELLGRP := SPELLGRP + 1
 10412  19   33:3   191           END;
 10413  19   33:2   197         MVCURSOR( SPELLWIN, 8, 4);
 10414  19   33:2   203         SPELLGRP := MENU( SPELLWIN,
 10415  19   33:2   204                           'M)AGE SPELL BOOKS/P)RIEST SPELL BOOKS/L)EAVE');
 10416  19   33:2   258         CASE SPELLGRP OF
 10417  19   33:2   261           0:  PRMAGE;
 10418  19   33:2   265           1:  PRPRIEST;
 10419  19   33:2   269         END
 10420  19   33:1   280       UNTIL SPELLGRP = 2;
 10421  19   33:1   285       INCHAR := CHR( 0);
 10422  19   33:1   288       DELWIN( SPELLWIN, FALSE);
 10423  19   33:1   294       XGOTO := XBK2CMP2;
 10424  19   33:1   298       BASE04 := CHARX;
 10425  19   33:1   301       EXIT( REWARDS)
 10426  19   33:0   305     END;  (* RDSPELLS *)
 10427  19   33:0   324     
 10428  19   33:0   324     
 10429  19   39:D     1   PROCEDURE KANDIFND;  (* P010D27 *)
 10430  19   39:D     1   
 10431  19   39:D     1     VAR
 10432  19   39:D     1         CHARXDSK  : INTEGER;
 10433  19   39:D     2         SVBASE04  : INTEGER;
 10434  19   39:D     3         LOSTCHAR  : TCHAR;
 10435  19   39:D   107         LOCSTRING : STRING;  (* MULTIPLE USES *)
 10436  19   39:D   148   
 10437  19   39:D   148   
 10438  19   40:D     1     PROCEDURE EXITKAND;  (* P010D28 *)
 10439  19   40:D     1     
 10440  19   40:0     0       BEGIN
 10441  19   40:1     0         MVCURSOR( TEMPWIN, 0, TEMPWIN^.HEAD.VSIZE - 3);
 10442  19   40:1    17         CENTSTR(  TEMPWIN, '(RETURN) TO LEAVE');
 10443  19   40:1    43         DELWIN(   TEMPWIN, FALSE);
 10444  19   40:1    50         GETCR;
 10445  19   40:1    53         INCHAR := 'A';
 10446  19   40:1    56         BASE04 := SVBASE04;
 10447  19   40:1    61         XGOTO := XBK2CMP2;
 10448  19   40:1    65         EXIT( REWARDS)
 10449  19   40:0    69       END;  (* EXITKAND *)
 10450  19   40:0    82       
 10451  19   40:0    82       
 10452  19   41:D     1     PROCEDURE KANDILOC;  (* P010D29 *)
 10453  19   41:D     1     
 10454  19   41:0     0       BEGIN
 10455  19   41:1     0         IF LOSTCHAR.STATUS = LOST THEN
 10456  19   41:2     7           EXIT( KANDILOC);
 10457  19   41:1    11         IF LOSTCHAR.STATUS < DEAD THEN
 10458  19   41:2    18           CENTSTR( TEMPWIN, 'ALIVE!')
 10459  19   41:1    30         ELSE
 10460  19   41:2    35           BEGIN
 10461  19   41:3    35             IF (LOSTCHAR.LOSTXYL.LOCATION[ 1] = 0) AND
 10462  19   41:3    46                (LOSTCHAR.LOSTXYL.LOCATION[ 2] = 0) AND
 10463  19   41:3    58                (LOSTCHAR.LOSTXYL.LOCATION[ 3] = 0)     THEN
 10464  19   41:4    72               CENTSTR( TEMPWIN, 'IN MORGUE')
 10465  19   41:3    87             ELSE
 10466  19   41:4    92               BEGIN
 10467  19   41:5    92                 LOCSTRING := 'IN THE ';
 10468  19   41:5   107                 
 10469  19   41:5   107                 IF LOSTCHAR.LOSTXYL.LOCATION[ 2] > 9 THEN
 10470  19   41:6   120                   LOCSTRING := CONCAT( LOCSTRING, 'NORTH ')
 10471  19   41:5   152                 ELSE
 10472  19   41:6   156                   LOCSTRING := CONCAT( LOCSTRING, 'SOUTH ');
 10473  19   41:6   190                   
 10474  19   41:5   190                 IF LOSTCHAR.LOSTXYL.LOCATION[ 1] > 9 THEN
 10475  19   41:6   203                   LOCSTRING := CONCAT( LOCSTRING, 'EAST')
 10476  19   41:5   233                 ELSE
 10477  19   41:6   237                   LOCSTRING := CONCAT( LOCSTRING, 'WEST');
 10478  19   41:6   269                   
 10479  19   41:5   269                 LOCSTRING := CONCAT( LOCSTRING, ' OF LEVEL  ');
 10480  19   41:5   308                 LOCSTRING[ LENGTH( LOCSTRING)] :=
 10481  19   41:5   316                   CHR( ORD( '0') + ORD( LOSTCHAR.LOSTXYL.LOCATION[ 3]));
 10482  19   41:5   328                 CENTSTR( TEMPWIN, LOCSTRING);
 10483  19   41:4   337               END
 10484  19   41:2   337           END;
 10485  19   41:1   337         EXITKAND
 10486  19   41:0   337       END;  (* KANDILOC *)
 10487  19   41:0   356       
 10488  19   41:0   356       
 10489  19   39:0     0     BEGIN  (* KANDIFND *)
 10490  19   39:1     0       SVBASE04 :=  BASE04;
 10491  19   39:1     3       TEMPWIN := GETWIN( 0, 7, 40, 6, 17, TRUE);
 10492  19   39:1    17       CENTSTR( TEMPWIN, 'LOCATE BODIES');
 10493  19   39:1    39       PRINTCR( TEMPWIN);
 10494  19   39:1    45       PRINTSTR( TEMPWIN, 'FIND WHO ? >');
 10495  19   39:1    66       GETSTR( TEMPWIN, LOCSTRING, 15);
 10496  19   39:1    75       CLEARWIN( TEMPWIN, TRUE);
 10497  19   39:1    82       CENTSTR( TEMPWIN, CONCAT( LOCSTRING, ' IS..'));
 10498  19   39:1   119       FOR CHARXDSK := 0 TO SCNTOC.RECPERDK[ ZCHAR] - 1 DO
 10499  19   39:2   141         BEGIN
 10500  19   39:3   141           MOVELEFT( IOCACHE[ GETREC( ZCHAR, CHARXDSK, SIZEOF( TCHAR))],
 10501  19   39:3   154                     LOSTCHAR,
 10502  19   39:3   157                     SIZEOF( TCHAR));
 10503  19   39:3   162           IF LOSTCHAR.NAME = LOCSTRING THEN
 10504  19   39:4   170             KANDILOC
 10505  19   39:2   170         END;
 10506  19   39:1   179       CENTSTR( TEMPWIN, 'LOST FOREVER!');
 10507  19   39:1   201       EXITKAND
 10508  19   39:0   201     END;   (* KANDIFND *)
 10509  19   39:0   218     
 10510  19   39:0   218     
 10511  19   42:D     1   PROCEDURE IDITEM;  (* P010D2A *)
 10512  19   42:D     1   
 10513  19   42:D     1     VAR
 10514  19   42:D     1          ITEMX    : INTEGER;
 10515  19   42:D     2          CHARX4ID : INTEGER;
 10516  19   42:D     3          OBJECT   : TOBJREC;
 10517  19   42:D    42   
 10518  19   42:D    42   
 10519  19   43:D     1     PROCEDURE EXITIDIT;  (* P010D2B *)
 10520  19   43:D     1     
 10521  19   43:0     0       BEGIN
 10522  19   43:1     0         DELWIN( TEMPWIN, FALSE);
 10523  19   43:1     7         BASE04 := CHARX4ID;
 10524  19   43:1    12         EXIT( REWARDS)
 10525  19   43:0    16       END;  (* EXITIDIT *)
 10526  19   43:0    28     
 10527  19   43:0    28     
 10528  19   42:0     0     BEGIN (* IDITEM *)
 10529  19   42:1     0       CHARX4ID := BASE04;
 10530  19   42:1     3       XGOTO := XBK2CMP2;
 10531  19   42:1     7       TEMPWIN := GETWIN( 13, 8, 26, 5, 15, FALSE);
 10532  19   42:1    21       REPEAT
 10533  19   42:2    21         CLEARWIN( TEMPWIN, TRUE);
 10534  19   42:2    28         CENTSTR(  TEMPWIN, 'IDENTIFY WHAT');
 10535  19   42:2    50         CENTSTR(  TEMPWIN, 'ITEM (NUM)');
 10536  19   42:2    69         CENTSTR(  TEMPWIN, '(RETURN) EXITS');
 10537  19   42:2    92         GETKEY;
 10538  19   42:2    95         ITEMX := ORD( INCHAR) - ORD( '0');
 10539  19   42:2   100         IF INCHAR = CHR( CRETURN) THEN
 10540  19   42:3   105           EXITIDIT
 10541  19   42:1   105       UNTIL (ITEMX > 0) AND (ITEMX <= CHARACTR[ CHARX4ID].POSS.POSSCNT);
 10542  19   42:1   122       CLEARWIN( TEMPWIN, TRUE);
 10543  19   42:1   129       PRINTCR( TEMPWIN);
 10544  19   42:1   135       IF CHARACTR[ CHARX4ID].POSS.POSSESS[ ITEMX].IDENTIF THEN
 10545  19   42:2   150         EXITIDIT;
 10546  19   42:1   152       CHARACTR[ CHARX4ID].POSS.POSSESS[ ITEMX].IDENTIF :=
 10547  19   42:1   166         (RANDOM MOD 100) > (90 - 5 * CHARACTR[ CHARX4ID].CHARLEV);
 10548  19   42:1   186       IF CHARACTR[ CHARX4ID].POSS.POSSESS[ ITEMX].IDENTIF THEN
 10549  19   42:2   201         CENTSTR( TEMPWIN, 'SUCCESS!')
 10550  19   42:1   215       ELSE
 10551  19   42:2   220         CENTSTR( TEMPWIN, 'FAILURE');
 10552  19   42:1   236       IF (RANDOM MOD 100) < (35 - (3 * CHARACTR[ CHARX4ID].CHARLEV)) THEN
 10553  19   42:2   257         BEGIN
 10554  19   42:3   257           MOVELEFT( IOCACHE[ GETREC(
 10555  19   42:3   260                       ZOBJECT,
 10556  19   42:3   261                       CHARACTR[ CHARX4ID].POSS.POSSESS[ ITEMX].EQINDEX - 1000,
 10557  19   42:3   278                       SIZEOF( TOBJREC))],
 10558  19   42:3   284                     OBJECT,
 10559  19   42:3   287                     SIZEOF( TOBJREC));
 10560  19   42:3   290           CHARACTR[ CHARX4ID].POSS.POSSESS[ ITEMX].CURSED := OBJECT.CURSED;
 10561  19   42:3   307           IF OBJECT.CURSED THEN
 10562  19   42:4   311             XGOTO := XEQPDSP
 10563  19   42:2   311         END;
 10564  19   42:1   315       PAUSE2;
 10565  19   42:1   318       EXITIDIT
 10566  19   42:0   318     END;  (* IDITEM *)
 10567  19   42:0   334     
 10568  19   42:0   334     
 10569  19   44:D     1   PROCEDURE GIVEEXP;  (* P010D2C *)
 10570  19   44:D     1   
 10571  19   44:D     1     VAR
 10572  19   44:D     1          UNUSEDXX : INTEGER;
 10573  19   44:D     2          UNUSEDYY : INTEGER;
 10574  19   44:D     3          BATRESLT : TBATRSLT;
 10575  19   44:D    17          CHARXXX  : INTEGER;  (* MULTIPLE USES *)
 10576  19   44:D    18          KILLEXP  : TWIZLONG; (* MULTIPLE USES *)
 10577  19   44:D    21                   
 10578  19   44:D    21                   
 10579  19   45:D     1     PROCEDURE CNTALIVE;  (* P010D2D *)
 10580  19   45:D     1     
 10581  19   45:0     0       BEGIN
 10582  19   45:1     0         ALIVECNT := 0;
 10583  19   45:1     4         FOR BASE04 := 0 TO PARTYCNT - 1 DO
 10584  19   45:2    17           IF CHARACTR[ BASE04].STATUS = OK THEN
 10585  19   45:3    28             ALIVECNT := ALIVECNT + 1;
 10586  19   45:1    43         IF ALIVECNT = 0 THEN
 10587  19   45:2    50           BEGIN
 10588  19   45:3    50             XGOTO := XCEMETRY;
 10589  19   45:3    54             EXIT( REWARDS)
 10590  19   45:2    58           END
 10591  19   45:0    58       END;  (* CNTALIVE *)
 10592  19   45:0    72       
 10593  19   45:0    72       
 10594  19   46:D     1     PROCEDURE CALC1EXP;  (* P010D2E *)
 10595  19   46:D     1     
 10596  19   46:D     1       VAR
 10597  19   46:D     1            UNUSEDXX : INTEGER;
 10598  19   46:D     2     
 10599  19   46:D     2     
 10600  19   47:D     1       PROCEDURE TOTALEXP;  (* P010D2F *)
 10601  19   47:D     1       
 10602  19   47:D     1         VAR
 10603  19   47:D     1              ENEMYREC : TENEMY;
 10604  19   47:D    80       
 10605  19   47:0     0         BEGIN
 10606  19   47:1     0           MOVELEFT( IOCACHE[ GETREC( ZENEMY,
 10607  19   47:1     4                                      BATRESLT.ENMYID[ CHARXXX],
 10608  19   47:1    15                                      SIZEOF( TENEMY))],
 10609  19   47:1    23                     ENEMYREC,
 10610  19   47:1    26                     SIZEOF( TENEMY));
 10611  19   47:1    31           KILLEXP := ENEMYREC.EXPAMT;
 10612  19   47:1    38           MULTLONG( KILLEXP, BATRESLT.ENMYCNT[ CHARXXX]);
 10613  19   47:1    54           ADDLONGS( EXPPERCH, KILLEXP)
 10614  19   47:0    60         END;  (* TOTALEXP *)
 10615  19   47:0    76       
 10616  19   47:0    76       
 10617  19   46:0     0       BEGIN  (* CALC1EXP *)
 10618  19   46:1     0         FILLCHAR( EXPPERCH, 6, 0);
 10619  19   46:1     8         FOR CHARXXX := 1 TO 4 DO
 10620  19   46:2    22           IF BATRESLT.ENMYID[ CHARXXX] >= 0 THEN
 10621  19   46:3    37             TOTALEXP;
 10622  19   46:1    49         DIVLONG( EXPPERCH, ALIVECNT)
 10623  19   46:0    55       END;   (* CALC1EXP *)
 10624  19   46:0    72       
 10625  19   46:0    72       
 10626  19   48:D     1     PROCEDURE CHKDRAIN;  (* P010D30 *)
 10627  19   48:D     1     
 10628  19   48:D     1       VAR
 10629  19   48:D     1            EXPTABLE : TEXP;
 10630  19   48:D   313            
 10631  19   48:D   313            
 10632  19   49:D     1       PROCEDURE DROPLEVL( VAR CHAREXP:  TWIZLONG;  (* P010D31 *)
 10633  19   49:D     2                               CURRLEVL: INTEGER;
 10634  19   49:D     3                               CLASS:    TCLASS);
 10635  19   49:D     4                          
 10636  19   49:D     4         VAR
 10637  19   49:D     4              GTLEV12 : INTEGER;
 10638  19   49:D     5       
 10639  19   49:0     0         BEGIN
 10640  19   49:1     0           CURRLEVL := CURRLEVL - 1;
 10641  19   49:1     5           IF CURRLEVL = 0 THEN
 10642  19   49:2    10             FILLCHAR( CHAREXP, 6, 0)
 10643  19   49:1    16           ELSE
 10644  19   49:2    18             IF CURRLEVL < 13 THEN
 10645  19   49:3    23               CHAREXP := EXPTABLE[ CLASS][ CURRLEVL]
 10646  19   49:2    33             ELSE
 10647  19   49:3    37               BEGIN
 10648  19   49:4    37                 CHAREXP := EXPTABLE[ CLASS][ 12];
 10649  19   49:4    49                 FOR GTLEV12 := 13 TO CURRLEVL DO
 10650  19   49:5    60                   ADDLONGS( CHAREXP, EXPTABLE[ CLASS][ 0])
 10651  19   49:3    70               END;
 10652  19   49:1    80           ADDLONGS( CHAREXP, KILLEXP);
 10653  19   49:1    87           PAUSE2
 10654  19   49:0    87         END;  (* DROPLEVL *)
 10655  19   49:0   104         
 10656  19   49:0   104         
 10657  19   48:0     0       BEGIN (* CHKDRAIN *)
 10658  19   48:1     0         MOVELEFT( IOCACHE[ GETREC( ZEXP, 0, SIZEOF( TEXP))],
 10659  19   48:1    13                   EXPTABLE,
 10660  19   48:1    16                   SIZEOF( TEXP));
 10661  19   48:1    21         KILLEXP.HIGH := 0;
 10662  19   48:1    25         KILLEXP.MID  := 0;
 10663  19   48:1    29         KILLEXP.LOW  := 1;
 10664  19   48:1    33         FOR CHARXXX := 0 TO PARTYCNT - 1 DO
 10665  19   48:2    52           BEGIN
 10666  19   48:3    52             IF  BATRESLT.DRAINED[ CHARXXX] THEN
 10667  19   48:4    63               BEGIN
 10668  19   48:5    63                 TEMPWIN := GETWIN( 0, 2, 40, 3, 31, TRUE);
 10669  19   48:5    77                 CENTSTR( TEMPWIN,
 10670  19   48:5    80                          CONCAT(  CHARACTR[ CHARXXX].NAME, ' WAS DRAINED!'));
 10671  19   48:5   127                 DELWIN( TEMPWIN, FALSE);
 10672  19   48:5   134                 DROPLEVL( CHARACTR[ CHARXXX].EXP,
 10673  19   48:5   143                           CHARACTR[ CHARXXX].CHARLEV,
 10674  19   48:5   152                           CHARACTR[ CHARXXX].CLASS)
 10675  19   48:4   161               END
 10676  19   48:2   163           END;
 10677  19   48:1   173         IF XGOTO = XREWARD2 THEN
 10678  19   48:2   180           EXIT( GIVEEXP);
 10679  19   48:1   184         FOR CHARXXX := 0 TO PARTYCNT - 1 DO
 10680  19   48:2   203           IF CHARACTR[ CHARXXX].STATUS = OK THEN
 10681  19   48:3   216             EXIT( CHKDRAIN);
 10682  19   48:1   230         XGOTO := XCEMETRY;
 10683  19   48:1   234         EXIT( REWARDS)
 10684  19   48:0   238       END;  (* CHKDRAIN *)
 10685  19   48:0   254       
 10686  19   48:0   254       
 10687  19   44:0     0     BEGIN  (* GIVEEXP *)
 10688  19   44:1     0       MOVELEFT( IOCACHE, BATRESLT, SIZEOF( TBATRSLT));
 10689  19   44:1    10       CACHEWRI := FALSE;
 10690  19   44:1    14       CNTALIVE;
 10691  19   44:1    16       CHKDRAIN;
 10692  19   44:1    18       CALC1EXP;
 10693  19   44:1    20       TEMPWIN := GETWIN( 0, 2, 40, 3, 31, TRUE);
 10694  19   44:1    34       CLEARWIN( TEMPWIN, TRUE);
 10695  19   44:1    41       PRINTSTR( TEMPWIN, 'EACH SURVIVOR GETS ');
 10696  19   44:1    69       PRNTLONG( TEMPWIN, EXPPERCH);
 10697  19   44:1    78       PRINTSTR( TEMPWIN, ' EXP.');
 10698  19   44:1    92       DELWIN( TEMPWIN, FALSE);
 10699  19   44:1    99       PAUSE2;
 10700  19   44:1   102       FOR BASE04 := 0 TO PARTYCNT - 1 DO
 10701  19   44:2   116         IF CHARACTR[ BASE04].STATUS = OK THEN
 10702  19   44:3   127           ADDLONGS( CHARACTR[ BASE04].EXP, EXPPERCH)
 10703  19   44:0   137     END;   (* GIVEEXP *)
 10704  19   44:0   162   
 10705  19   44:0   162   
 10706  19    1:0     0   BEGIN  (* REWARDS *)
 10707  19    1:0     0     
 10708  19    1:1     0     CASE XGOTO OF
 10709  19    1:1     5       XCAMPSTF:  IF BASE291.GOTOX = 0 THEN
 10710  19    1:3    12                    RDSPELLS
 10711  19    1:2    12                  ELSE IF BASE291.GOTOX = 2 THEN
 10712  19    1:4    23                    KANDIFND
 10713  19    1:3    23                  ELSE
 10714  19    1:4    27                    IDITEM;
 10715  19    1:4    31              
 10716  19    1:1    31       XREWARD1:  BEGIN
 10717  19    1:3    31                    XGOTO := XRUNNER;
 10718  19    1:3    35                    GIVEEXP;
 10719  19    1:3    37                    CHSTGOLD
 10720  19    1:2    37                  END;
 10721  19    1:2    41                  
 10722  19    1:1    41       XREWARD2:  BEGIN
 10723  19    1:3    41                    GIVEEXP;
 10724  19    1:3    43                    BASE04 := 0;
 10725  19    1:3    46                    XGOTO := XSCNMSG
 10726  19    1:2    46                  END;
 10727  19    1:1    52     END
 10728  19    1:0    88   END;  (* REWARDS *)
 10729  19    1:0   100 (*$I WIZ3C:REWARDS2  *)
 10730  19    1:0   100                       
 10730  19    1:0   100 (*$I WIZ3C:RUNNER    *)
 10731  20    1:D     1   SEGMENT PROCEDURE RUNNER;     (* P010E01 *)
 10732  20    1:D     1   
 10733  20    1:D     1     CONST
 10734  20    1:D     1          NORTH = 0;
 10735  20    1:D     1          EAST  = 1;
 10736  20    1:D     1          SOUTH = 2;
 10737  20    1:D     1          WEST  = 3;
 10738  20    1:D     1   
 10739  20    1:D     1     VAR
 10740  20    1:D     1          INITTURN : BOOLEAN;
 10741  20    1:D     2          NEEDDRMZ : BOOLEAN;
 10742  20    1:D     3          LPIWIN   : TWINDOWP;
 10743  20    1:D     4          CSIOWIN  : TWINDOWP;
 10744  20    1:D     5          BKEYPRES : BOOLEAN;
 10745  20    1:D     6          MAZE     : TMAZE;
 10746  20    1:D   453          
 10747  20    1:D   453          
 10748  20    2:D     1     PROCEDURE DRAWMAZE;  (* P010E02 *)
 10749  20    2:D     1     
 10750  20    2:D     1       VAR
 10751  20    2:D     1            GOTLIGHT : BOOLEAN;
 10752  20    2:D     2            SQREDESC : INTEGER;
 10753  20    2:D     3            MAXDRAW  : INTEGER;
 10754  20    2:D     4            MINDRAW  : INTEGER;
 10755  20    2:D     5            Y4DRAW   : INTEGER;
 10756  20    2:D     6            X4DRAW   : INTEGER;
 10757  20    2:D     7            LIGHTDIS : INTEGER;
 10758  20    2:D     8            
 10759  20    2:D     8            RIGHWALL : TWALL;
 10760  20    2:D     9            FRWDWALL : TWALL;
 10761  20    2:D    10            LEFTWALL : TWALL;
 10762  20    2:D    11            
 10763  20    2:D    11            RIGHBLCK : BOOLEAN;
 10764  20    2:D    12            LEFTBLCK : BOOLEAN;
 10765  20    2:D    13            UNUSEDXX : INTEGER;
 10766  20    2:D    14            NOTDARK  : BOOLEAN;
 10767  20    2:D    15     
 10768  20    2:D    15     
 10769  20    3:D     1       PROCEDURE EXITDRMZ;  (* P010E03 *)
 10770  20    3:D     1       
 10771  20    3:0     0         BEGIN
 10772  20    3:1     0          IF INFOWOFF THEN
 10773  20    3:2     5            PROTWIN( CHARSWIN, FALSE);
 10774  20    3:1    12          PRINTCHR( MAINWIN, CHR( 5 + MAZELEV));
 10775  20    3:1    21          EXIT( DRAWMAZE)
 10776  20    3:0    25         END;
 10777  20    3:0    38         
 10778  20    3:0    38         
 10779  20    4:D     1       PROCEDURE SHFTPOS( VAR X:        INTEGER;  (* P010E04 *)
 10780  20    4:D     2                          VAR Y:        INTEGER;
 10781  20    4:D     3                              RIGHSHFT: INTEGER;
 10782  20    4:D     4                              FRWDSHFT: INTEGER);
 10783  20    4:D     5       
 10784  20    4:0     0         BEGIN
 10785  20    4:1     0           CASE DIRECTIO OF
 10786  20    4:1     3             NORTH:  BEGIN
 10787  20    4:3     3                       X := X + RIGHSHFT;
 10788  20    4:3     9                       Y := Y + FRWDSHFT
 10789  20    4:2    12                     END;
 10790  20    4:2    17                     
 10791  20    4:1    17              EAST:  BEGIN
 10792  20    4:3    17                       X := X + FRWDSHFT;
 10793  20    4:3    23                       Y := Y - RIGHSHFT
 10794  20    4:2    26                     END;
 10795  20    4:2    31                     
 10796  20    4:1    31             SOUTH:  BEGIN
 10797  20    4:3    31                       X := X - RIGHSHFT;
 10798  20    4:3    37                       Y := Y - FRWDSHFT
 10799  20    4:2    40                     END;
 10800  20    4:2    45                     
 10801  20    4:1    45              WEST:  BEGIN
 10802  20    4:3    45                       X := X - FRWDSHFT;
 10803  20    4:3    51                       Y := Y + RIGHSHFT
 10804  20    4:2    54                     END;
 10805  20    4:1    59           END;
 10806  20    4:1    74           X := (X + 20) MOD 20;
 10807  20    4:1    82           Y := (Y + 20) MOD 20
 10808  20    4:0    87         END;  (* SHFTPOS *)
 10809  20    4:0   102         
 10810  20    4:0   102         
 10811  20    5:D     1       PROCEDURE STEPFRWD;  (* P010E05 *)
 10812  20    5:D     1       
 10813  20    6:D     3         FUNCTION FRWDVIEW( DELTAR: INTEGER) : TWALL;  (* P010E06 *)
 10814  20    6:D     4         
 10815  20    6:D     4           VAR
 10816  20    6:D     4                Y : INTEGER;
 10817  20    6:D     5                X : INTEGER;
 10818  20    6:D     6                
 10819  20    6:0     0           BEGIN
 10820  20    6:1     0             X := X4DRAW;
 10821  20    6:1     5             Y := Y4DRAW;
 10822  20    6:1    10             SHFTPOS( X, Y, DELTAR, 0);
 10823  20    6:1    18             CASE DIRECTIO OF
 10824  20    6:1    21               NORTH:  FRWDVIEW := MAZE.N[ X][ Y];
 10825  20    6:1    37                EAST:  FRWDVIEW := MAZE.E[ X][ Y];
 10826  20    6:1    52               SOUTH:  FRWDVIEW := MAZE.S[ X][ Y];
 10827  20    6:1    67                WEST:  FRWDVIEW := MAZE.W[ X][ Y];
 10828  20    6:1    82             END
 10829  20    6:0    98           END;  (* FRWDVIEW *)
 10830  20    6:0   110           
 10831  20    6:0   110           
 10832  20    7:D     3         FUNCTION LEFTVIEW( DELTAR: INTEGER) : TWALL;  (* P010E07 *)
 10833  20    7:D     4         
 10834  20    7:D     4           VAR
 10835  20    7:D     4                Y : INTEGER;
 10836  20    7:D     5                X : INTEGER;
 10837  20    7:D     6                
 10838  20    7:0     0           BEGIN
 10839  20    7:1     0             X := X4DRAW;
 10840  20    7:1     5             Y := Y4DRAW;
 10841  20    7:1    10             SHFTPOS( X, Y, DELTAR, 0);
 10842  20    7:1    18             CASE DIRECTIO OF
 10843  20    7:1    21               NORTH:  LEFTVIEW := MAZE.W[ X][ Y];
 10844  20    7:1    36                EAST:  LEFTVIEW := MAZE.N[ X][ Y];
 10845  20    7:1    52               SOUTH:  LEFTVIEW := MAZE.E[ X][ Y];
 10846  20    7:1    67                WEST:  LEFTVIEW := MAZE.S[ X][ Y];
 10847  20    7:1    82             END
 10848  20    7:0    98           END;  (* LEFTVIEW *)
 10849  20    7:0   110           
 10850  20    7:0   110           
 10851  20    8:D     3         FUNCTION RIGHVIEW( DELTAR: INTEGER) : TWALL;  (* P010E08 *)
 10852  20    8:D     4         
 10853  20    8:D     4           VAR
 10854  20    8:D     4                Y : INTEGER;
 10855  20    8:D     5                X : INTEGER;
 10856  20    8:D     6                
 10857  20    8:0     0           BEGIN
 10858  20    8:1     0             X := X4DRAW;
 10859  20    8:1     5             Y := Y4DRAW;
 10860  20    8:1    10             SHFTPOS( X, Y, DELTAR, 0);
 10861  20    8:1    18             CASE DIRECTIO OF
 10862  20    8:1    21               NORTH:  RIGHVIEW := MAZE.E[ X][ Y];
 10863  20    8:1    36                EAST:  RIGHVIEW := MAZE.S[ X][ Y];
 10864  20    8:1    51               SOUTH:  RIGHVIEW := MAZE.W[ X][ Y];
 10865  20    8:1    66                WEST:  RIGHVIEW := MAZE.N[ X][ Y];
 10866  20    8:1    82             END
 10867  20    8:0    98           END;  (* RIGHVIEW *)
 10868  20    8:0   110           
 10869  20    8:0   110           
 10870  20    9:D     3         FUNCTION CHKHIDEN( WALL2CHK: TWALL) : TWALL;  (* P010E09 *)
 10871  20    9:D     4         
 10872  20    9:0     0           BEGIN
 10873  20    9:1     0             CHKHIDEN := WALL2CHK;
 10874  20    9:1     3             IF WALL2CHK = HIDEDOOR THEN
 10875  20    9:2     8               IF NOTDARK AND
 10876  20    9:2    11                  (GOTLIGHT OR ((RANDOM MOD 6) = 3)) THEN
 10877  20    9:3    27                 CHKHIDEN := DOOR
 10878  20    9:0    27           END;  (* CHKHIDEN *)
 10879  20    9:0    42           
 10880  20    9:0    42           
 10881  20   10:D     1         PROCEDURE SETBLKVW;  (* P010E0A *)
 10882  20   10:D     1         
 10883  20   10:0     0           BEGIN
 10884  20   10:1     0             FRWDWALL := CHKHIDEN( FRWDVIEW( 0) );
 10885  20   10:1    12             LEFTWALL := CHKHIDEN( LEFTVIEW( 0) );
 10886  20   10:1    24             RIGHWALL := CHKHIDEN( RIGHVIEW( 0) );
 10887  20   10:1    36             
 10888  20   10:1    36             IF LEFTWALL = OPEN THEN
 10889  20   10:2    43               BEGIN
 10890  20   10:3    43                 LEFTWALL := CHKHIDEN( FRWDVIEW( -1) );
 10891  20   10:3    56                 LEFTBLCK := FALSE
 10892  20   10:2    56               END
 10893  20   10:1    60             ELSE
 10894  20   10:2    62               LEFTBLCK := TRUE;
 10895  20   10:2    66             
 10896  20   10:1    66             IF RIGHWALL = OPEN THEN
 10897  20   10:2    73               BEGIN
 10898  20   10:3    73                 RIGHWALL := CHKHIDEN( FRWDVIEW( 1) );
 10899  20   10:3    85                 RIGHBLCK := FALSE
 10900  20   10:2    85               END
 10901  20   10:1    89             ELSE
 10902  20   10:2    91               RIGHBLCK := TRUE
 10903  20   10:0    91           END;  (* SETBLKVW *)
 10904  20   10:0   108           
 10905  20   10:0   108           
 10906  20    5:0     0         BEGIN (* STEPFRWD *)
 10907  20    5:1     0           IF LIGHTDIS = 0 THEN
 10908  20    5:2     7             EXITDRMZ
 10909  20    5:1     7           ELSE
 10910  20    5:2    11             LIGHTDIS := LIGHTDIS - 1;
 10911  20    5:1    19           SHFTPOS( X4DRAW, Y4DRAW, 0, 1);
 10912  20    5:1    29           NOTDARK := TRUE;
 10913  20    5:1    33           SQREDESC := MAZE.SQREXTRA[ X4DRAW][ Y4DRAW];
 10914  20    5:1    52           IF MAZE.SQRETYPE[ SQREDESC] = DARK THEN
 10915  20    5:2    67             BEGIN
 10916  20    5:3    67               NOTDARK := MAZE.AUX0[ SQREDESC] = 1;
 10917  20    5:3    82               IF MAZE.AUX2[ SQREDESC] = 0 THEN
 10918  20    5:4    96                 EXITDRMZ
 10919  20    5:2    96             END
 10920  20    5:1    98           ELSE
 10921  20    5:2   100             IF MAZE.SQRETYPE[ SQREDESC] = TRANSFER THEN
 10922  20    5:3   115               IF MAZE.AUX0[ SQREDESC] = MAZELEV THEN
 10923  20    5:4   129                 BEGIN
 10924  20    5:5   129                   X4DRAW := MAZE.AUX2[ SQREDESC];
 10925  20    5:5   142                   Y4DRAW := MAZE.AUX1[ SQREDESC]
 10926  20    5:4   151                 END;
 10927  20    5:1   155           SETBLKVW
 10928  20    5:0   155         END;  (* STEPFRWD *)
 10929  20    5:0   170         
 10930  20    5:0   170         
 10931  20   11:D     1       PROCEDURE MAZELINE( HORSTART: INTEGER;  (* P010E0B *)
 10932  20   11:D     2                           LINSTART: INTEGER;
 10933  20   11:D     3                           STORXXXX: INTEGER);
 10934  20   11:D     4       
 10935  20   11:0     0         BEGIN
 10936  20   11:1     0           DRAWLINE( MAINWIN, MINDRAW, MAXDRAW,
 10937  20   11:1     9                     HORSTART, LINSTART, 0, 0, 1, STORXXXX)
 10938  20   11:0    15         END;
 10939  20   11:0    30         
 10940  20   11:0    30         
 10941  20   12:D     1       PROCEDURE MAZELINB( HORSTART: INTEGER;  (* P010E0C *)
 10942  20   12:D     2                           LINSTART: INTEGER;
 10943  20   12:D     3                           HORT:     INTEGER;
 10944  20   12:D     4                           VERT:     INTEGER;
 10945  20   12:D     5                           LINELEN:  INTEGER;
 10946  20   12:D     6                           STORXXXX: INTEGER);
 10947  20   12:D     7        
 10948  20   12:0     0         BEGIN
 10949  20   12:1     0           DRAWLINE( MAINWIN, MINDRAW, MAXDRAW, HORSTART, LINSTART,
 10950  20   12:1    11                     HORT, VERT, LINELEN, STORXXXX)
 10951  20   12:0    15         END;  (* MAZELINB *)
 10952  20   12:0    30         
 10953  20   12:0    30         
 10954  20   13:D     1       PROCEDURE STEP0;  (* P010E0D *)
 10955  20   13:D     1       
 10956  20   14:D     1         PROCEDURE STEP0L;  (* P010E0E *)
 10957  20   14:D     1         
 10958  20   14:0     0           BEGIN
 10959  20   14:1     0             IF LEFTWALL = OPEN THEN
 10960  20   14:2     7               EXIT( STEP0L);
 10961  20   14:1    11             MAZELINB( 1,  0,  0, 1, 20, 1);
 10962  20   14:1    19             MAZELINB( 8,  0,  1, 1,  2, 0);
 10963  20   14:1    27             MAZELINB( 9,  2,  0, 1, 16, 1);
 10964  20   14:1    35             MAZELINB( 9, 18, -1, 1,  2, 2);
 10965  20   14:1    44             IF LEFTWALL = DOOR THEN
 10966  20   14:2    51               BEGIN
 10967  20   14:3    51                 MAZELINB( 3, 0, 0, 1, 20, 1);
 10968  20   14:3    59                 MAZELINB( 6, 0, 1, 1,  2, 0);
 10969  20   14:3    67                 MAZELINB( 7, 2, 0, 1, 18, 1)
 10970  20   14:2    73               END;
 10971  20   14:1    75             MINDRAW := 10
 10972  20   14:0    75           END;  (* STEP0L *)
 10973  20   14:0    92           
 10974  20   14:0    92           
 10975  20   15:D     1         PROCEDURE STEP0LF;  (* P010E0F *)
 10976  20   15:D     1         
 10977  20   15:0     0           BEGIN
 10978  20   15:1     0             IF LEFTWALL = OPEN THEN
 10979  20   15:2     7               EXIT( STEP0LF);
 10980  20   15:1    11             MAZELINB( 0,  1, 1, 0, 10, 28);
 10981  20   15:1    19             MAZELINB( 0, 18, 1, 0, 10, 29);
 10982  20   15:1    27             MAZELINB( 9,  2, 0, 1, 16,  1);
 10983  20   15:1    35             IF LEFTWALL = DOOR THEN
 10984  20   15:2    42               BEGIN
 10985  20   15:3    42                 MAZELINB( 0, 3, 1, 0,  8, 28);
 10986  20   15:3    50                 MAZELINB( 7, 4, 0, 1, 14,  1)
 10987  20   15:2    56               END;
 10988  20   15:1    58             MINDRAW := 10
 10989  20   15:0    58           END;  (* STEP0LF *)
 10990  20   15:0    74           
 10991  20   15:0    74           
 10992  20   16:D     1         PROCEDURE STEP0R;  (* P010E10 *)
 10993  20   16:D     1         
 10994  20   16:0     0           BEGIN
 10995  20   16:1     0             IF RIGHWALL = OPEN THEN
 10996  20   16:2     7               EXIT( STEP0R);
 10997  20   16:1    11             MAZELINB( 34,  0,  0,  1, 20, 3);
 10998  20   16:1    19             MAZELINB( 27,  0, -1,  1,  2, 2);
 10999  20   16:1    28             MAZELINB( 26,  2,  0,  1, 16, 3);
 11000  20   16:1    36             MAZELINB( 27, 19, -1, -1,  2, 0);
 11001  20   16:1    46             IF RIGHWALL = DOOR THEN
 11002  20   16:2    53               BEGIN
 11003  20   16:3    53                 MAZELINB( 32, 0,  0, 1, 20, 3);
 11004  20   16:3    61                 MAZELINB( 29, 0, -1, 1,  2, 2);
 11005  20   16:3    70                 MAZELINB( 28, 2,  0, 1, 18, 3)
 11006  20   16:2    76               END;
 11007  20   16:1    78             MAXDRAW := 25
 11008  20   16:0    78           END;  (* STEP0R *)
 11009  20   16:0    94           
 11010  20   16:0    94           
 11011  20   17:D     1         PROCEDURE STEP0RF;  (* P010E11 *)
 11012  20   17:D     1         
 11013  20   17:0     0           BEGIN
 11014  20   17:1     0             IF RIGHWALL = OPEN THEN
 11015  20   17:2     7               EXIT( STEP0RF);
 11016  20   17:1    11             MAZELINB( 26,  1, 1, 0, 10, 28);
 11017  20   17:1    19             MAZELINB( 26, 18, 1, 0, 10, 29);
 11018  20   17:1    27             MAZELINB( 26,  2, 0, 1, 16,  3);
 11019  20   17:1    35             IF RIGHWALL = DOOR THEN
 11020  20   17:2    42               BEGIN
 11021  20   17:3    42                 MAZELINB( 28, 3, 1, 0,  8, 28);
 11022  20   17:3    50                 MAZELINB( 28, 4, 0, 1, 14,  3)
 11023  20   17:2    56               END;
 11024  20   17:1    58             MAXDRAW := 25
 11025  20   17:0    58           END;  (* STEP0RF *)
 11026  20   17:0    74           
 11027  20   17:0    74           
 11028  20   18:D     1         PROCEDURE STEP0F;  (* P010E12 *)
 11029  20   18:D     1         
 11030  20   18:0     0           BEGIN
 11031  20   18:1     0             MAZELINB( 10,  1, 1, 0, 16, 28);
 11032  20   18:1     8             MAZELINB(  9,  2, 0, 1, 16,  1);
 11033  20   18:1    16             MAZELINB( 10, 18, 1, 0, 16, 29);
 11034  20   18:1    24             MAZELINB( 26,  2, 0, 1, 16,  3);
 11035  20   18:1    32             IF FRWDWALL = DOOR THEN
 11036  20   18:2    39               BEGIN
 11037  20   18:3    39                 MAZELINB( 12, 3, 1, 0, 12, 28);
 11038  20   18:3    47                 MAZELINB( 11, 4, 0, 1, 14,  1);
 11039  20   18:3    55                 MAZELINB( 24, 4, 0, 1, 14,  3)
 11040  20   18:2    61               END
 11041  20   18:0    63           END;  (* STEP0F *)
 11042  20   18:0    76           
 11043  20   18:0    76           
 11044  20   13:0     0         BEGIN (* STEP0 *)
 11045  20   13:1     0           IF LEFTBLCK THEN
 11046  20   13:2     5             STEP0L
 11047  20   13:1     5           ELSE
 11048  20   13:2     9             STEP0LF;
 11049  20   13:1    11           IF RIGHBLCK THEN
 11050  20   13:2    16             STEP0R
 11051  20   13:1    16           ELSE
 11052  20   13:2    20             STEP0RF;
 11053  20   13:1    22           IF FRWDWALL <> OPEN THEN
 11054  20   13:2    29             BEGIN
 11055  20   13:3    29               STEP0F;
 11056  20   13:3    31               EXITDRMZ
 11057  20   13:2    31             END
 11058  20   13:0    33         END;  (* STEP0 *)
 11059  20   13:0    46         
 11060  20   13:0    46         
 11061  20   19:D     1       PROCEDURE STEP1;  (* P010E13 *)
 11062  20   19:D     1       
 11063  20   20:D     1         PROCEDURE STEP1L;  (* P010E14 *)
 11064  20   20:D     1 
 11065  20   20:0     0           BEGIN
 11066  20   20:1     0             IF LEFTWALL = OPEN THEN
 11067  20   20:2     7               EXIT( STEP1L);
 11068  20   20:1    11             MAZELINB(  9,  2,  0,  1, 16, 1);
 11069  20   20:1    19             MAZELINB( 10,  2,  1,  1,  4, 0);
 11070  20   20:1    27             MAZELINB( 13,  6,  0,  1,  8, 1);
 11071  20   20:1    35             MAZELINB( 10, 17,  1, -1,  4, 2);
 11072  20   20:1    44             IF LEFTWALL = DOOR THEN
 11073  20   20:2    51               BEGIN
 11074  20   20:3    51                 MAZELINB( 10, 4, 0, 1, 13, 1);
 11075  20   20:3    59                 MAZELINB( 11, 4, 1, 1,  2, 0);
 11076  20   20:3    67                 MAZELINB( 12, 6, 0, 1,  9, 1)
 11077  20   20:2    73               END;
 11078  20   20:1    75             MINDRAW := 14
 11079  20   20:0    75           END;  (* STEP1L *)
 11080  20   20:0    92           
 11081  20   20:0    92           
 11082  20   21:D     1         PROCEDURE STEP1LF;  (* P010E15 *)
 11083  20   21:D     1 
 11084  20   21:0     0           BEGIN
 11085  20   21:1     0             IF LEFTWALL = OPEN THEN
 11086  20   21:2     7               EXIT( STEP1LF);
 11087  20   21:1    11             MAZELINB(  6,  5, 1, 0, 8, 28);
 11088  20   21:1    19             MAZELINB(  6, 14, 1, 0, 8, 29);
 11089  20   21:1    27             MAZELINB(  5,  6, 0, 1, 8,  1);
 11090  20   21:1    35             MAZELINB( 13,  6, 0, 1, 8,  1);
 11091  20   21:1    43             IF LEFTWALL = DOOR THEN
 11092  20   21:2    50               BEGIN
 11093  20   21:3    50                 MAZELINB(  7, 6, 1, 0, 6, 28);
 11094  20   21:3    58                 MAZELINB(  6, 7, 0, 1, 7,  1);
 11095  20   21:3    66                 MAZELINB( 12, 7, 0, 1, 7,  1)
 11096  20   21:2    72               END;
 11097  20   21:1    74             MINDRAW := 14
 11098  20   21:0    74           END;  (* STEP1LF *)
 11099  20   21:0    90           
 11100  20   21:0    90           
 11101  20   22:D     1         PROCEDURE STEP1R;  (* P010E16 *)
 11102  20   22:D     1 
 11103  20   22:0     0           BEGIN
 11104  20   22:1     0             IF RIGHWALL = OPEN THEN
 11105  20   22:2     7               EXIT( STEP1R);
 11106  20   22:1    11             MAZELINB( 26,  2,  0,  1, 16, 3);
 11107  20   22:1    19             MAZELINB( 25,  2, -1,  1,  4, 2);
 11108  20   22:1    28             MAZELINB( 22,  6,  0,  1,  8, 3);
 11109  20   22:1    36             MAZELINB( 25, 17, -1, -1,  4, 0);
 11110  20   22:1    46             IF RIGHWALL = DOOR THEN
 11111  20   22:2    53               BEGIN
 11112  20   22:3    53                 MAZELINB( 25, 4,  0, 1, 13, 3);
 11113  20   22:3    61                 MAZELINB( 24, 4, -1, 1,  2, 2);
 11114  20   22:3    70                 MAZELINB( 23, 6,  0, 1,  9, 3)
 11115  20   22:2    76               END;
 11116  20   22:1    78             MAXDRAW := 21
 11117  20   22:0    78           END;  (* STEP1R *)
 11118  20   22:0    94           
 11119  20   22:0    94           
 11120  20   23:D     1         PROCEDURE STEP1RF;  (* P010E17 *)
 11121  20   23:D     1 
 11122  20   23:0     0           BEGIN
 11123  20   23:1     0             IF RIGHWALL = OPEN THEN
 11124  20   23:2     7               EXIT( STEP1RF);
 11125  20   23:1    11             MAZELINB( 22,  5, 1, 0, 8, 28);
 11126  20   23:1    19             MAZELINB( 22, 14, 1, 0, 8, 29);
 11127  20   23:1    27             MAZELINB( 22,  6, 0, 1, 8,  3);
 11128  20   23:1    35             MAZELINB( 30,  6, 0, 1, 8,  3);
 11129  20   23:1    43             IF RIGHWALL = DOOR THEN
 11130  20   23:2    50               BEGIN
 11131  20   23:3    50                 MAZELINB( 23, 6, 1, 0, 6, 28);
 11132  20   23:3    58                 MAZELINB( 23, 7, 0, 1, 7,  3);
 11133  20   23:3    66                 MAZELINB( 29, 7, 0, 1, 7,  3)
 11134  20   23:2    72               END;
 11135  20   23:1    74             MAXDRAW := 21
 11136  20   23:0    74           END;  (* STEP1RF *)
 11137  20   23:0    90           
 11138  20   23:0    90           
 11139  20   24:D     1         PROCEDURE STEP1F;  (* P010E18 *)
 11140  20   24:D     1         
 11141  20   24:0     0           BEGIN
 11142  20   24:1     0             MAZELINB( 14,  5, 1, 0, 8, 28);
 11143  20   24:1     8             MAZELINB( 13,  6, 0, 1, 8,  1);
 11144  20   24:1    16             MAZELINB( 14, 14, 1, 0, 8, 29);
 11145  20   24:1    24             MAZELINB( 22,  6, 0, 1, 8,  3);
 11146  20   24:1    32             IF FRWDWALL = DOOR THEN
 11147  20   24:2    39               BEGIN
 11148  20   24:3    39                 MAZELINB( 15, 6, 1, 0, 6, 28);
 11149  20   24:3    47                 MAZELINB( 14, 7, 0, 1, 7,  1);
 11150  20   24:3    55                 MAZELINB( 21, 7, 0, 1, 7,  3)
 11151  20   24:2    61               END
 11152  20   24:0    63           END;  (* STEP1F *)
 11153  20   24:0    76           
 11154  20   24:0    76           
 11155  20   19:0     0         BEGIN (* STEP1 *)
 11156  20   19:1     0           IF LEFTBLCK THEN
 11157  20   19:2     5             STEP1L
 11158  20   19:1     5           ELSE
 11159  20   19:2     9             STEP1LF;
 11160  20   19:2    11           
 11161  20   19:1    11           IF RIGHBLCK THEN
 11162  20   19:2    16             STEP1R
 11163  20   19:1    16           ELSE
 11164  20   19:2    20             STEP1RF;
 11165  20   19:2    22             
 11166  20   19:1    22           IF FRWDWALL <> OPEN THEN
 11167  20   19:2    29             BEGIN
 11168  20   19:3    29               STEP1F;
 11169  20   19:3    31               EXITDRMZ
 11170  20   19:2    31             END
 11171  20   19:0    33         END;  (* STEP1 *)
 11172  20   19:0    46         
 11173  20   19:0    46         
 11174  20   25:D     1       PROCEDURE STEP2;
 11175  20   25:D     1       
 11176  20   26:D     1         PROCEDURE STEP2L;  (* P010E1A *)
 11177  20   26:D     1         
 11178  20   26:0     0           BEGIN
 11179  20   26:1     0             IF LEFTWALL = OPEN THEN
 11180  20   26:2     7               EXIT( STEP2L);
 11181  20   26:1    11             MAZELINB( 13,  6,  0, 1, 8, 1);
 11182  20   26:1    19             MAZELINB( 14,  6,  1, 1, 2, 0);
 11183  20   26:1    27             MAZELINB( 15,  8,  0, 1, 4, 1);
 11184  20   26:1    35             MAZELINB( 15, 12, -1, 1, 2, 2);
 11185  20   26:1    44             IF LEFTWALL = DOOR THEN
 11186  20   26:2    51               BEGIN
 11187  20   26:3    51                 MAZELINE( 14, 7, 4);
 11188  20   26:3    56                 MAZELINE( 15, 7, 5);
 11189  20   26:3    61                 MAZELINB( 14, 8, 0, 1, 5, 7);
 11190  20   26:3    69                 MAZELINB( 15, 8, 0, 1, 4, 9);
 11191  20   26:3    77                 MAZELINE( 14, 13, 6);
 11192  20   26:3    82                 MAZELINE( 15, 12, 8)
 11193  20   26:2    85               END;
 11194  20   26:1    87             MINDRAW := 16
 11195  20   26:0    87           END;  (* STEP2L *)
 11196  20   26:0   104           
 11197  20   26:0   104           
 11198  20   27:D     1         PROCEDURE STEP2LF;  (* P010E1B *)
 11199  20   27:D     1 
 11200  20   27:0     0           BEGIN
 11201  20   27:1     0             IF LEFTWALL = OPEN THEN
 11202  20   27:2     7               EXIT( STEP2LF);
 11203  20   27:1    11             MAZELINB( 12,  7, 1, 0, 4, 28);
 11204  20   27:1    19             MAZELINB( 12, 12, 1, 0, 4, 29);
 11205  20   27:1    27             MAZELINB( 11,  8, 0, 1, 4,  1);
 11206  20   27:1    35             MAZELINB( 15,  8, 0, 1, 4,  1);
 11207  20   27:1    43             IF LEFTWALL = DOOR THEN
 11208  20   27:2    50               BEGIN
 11209  20   27:3    50                 MAZELINB( 13, 8, 1, 0, 2, 28);
 11210  20   27:3    58                 MAZELINB( 12, 9, 0, 1, 3,  1);
 11211  20   27:3    66                 MAZELINB( 14, 9, 0, 1, 3,  1)
 11212  20   27:2    72               END;
 11213  20   27:1    74             MINDRAW := 16
 11214  20   27:0    74           END;  (* STEP2LF *)
 11215  20   27:0    90           
 11216  20   27:0    90           
 11217  20   28:D     1         PROCEDURE STEP2R;  (* P010E1C *)
 11218  20   28:D     1         
 11219  20   28:0     0           BEGIN
 11220  20   28:1     0             IF RIGHWALL = OPEN THEN
 11221  20   28:2     7               EXIT( STEP2R);
 11222  20   28:1    11             MAZELINB( 22, 6, 0, 1, 8, 3);
 11223  20   28:1    19             MAZELINB( 21, 6, -1, 1, 2, 2);
 11224  20   28:1    28             MAZELINB( 20, 8, 0, 1, 4, 3);
 11225  20   28:1    36             MAZELINB( 21, 13, -1, -1, 2, 0);
 11226  20   28:1    46             IF RIGHWALL = DOOR THEN
 11227  20   28:2    53               BEGIN
 11228  20   28:3    53                 MAZELINE( 20, 7, 11);
 11229  20   28:3    58                 MAZELINE( 21, 7, 10);
 11230  20   28:3    63                 MAZELINB( 20, 8, 0, 1, 4, 15);
 11231  20   28:3    71                 MAZELINB( 21, 8, 0, 1, 5, 13);
 11232  20   28:3    79                 MAZELINE( 20, 12, 14);
 11233  20   28:3    84                 MAZELINE( 21, 13, 12)
 11234  20   28:2    87               END;
 11235  20   28:1    89             MAXDRAW := 19
 11236  20   28:0    89           END;  (* STEP2R *)
 11237  20   28:0   106           
 11238  20   28:0   106           
 11239  20   29:D     1         PROCEDURE STEP2RF;  (* P010E1D *)
 11240  20   29:D     1         
 11241  20   29:0     0           BEGIN
 11242  20   29:1     0             IF RIGHWALL = OPEN THEN
 11243  20   29:2     7               EXIT( STEP2RF);
 11244  20   29:1    11             MAZELINB( 20,  7, 1, 0, 4, 28);
 11245  20   29:1    19             MAZELINB( 20, 12, 1, 0, 4, 29);
 11246  20   29:1    27             MAZELINB( 20,  8, 0, 1, 4,  3);
 11247  20   29:1    35             MAZELINB( 24,  8, 0, 1, 4,  3);
 11248  20   29:1    43             IF RIGHWALL = DOOR THEN
 11249  20   29:2    50               BEGIN
 11250  20   29:3    50                 MAZELINB( 21, 8, 1, 0, 2, 28);
 11251  20   29:3    58                 MAZELINB( 21, 9, 0, 1, 3,  3);
 11252  20   29:3    66                 MAZELINB( 23, 9, 0, 1, 3,  3)
 11253  20   29:2    72               END;
 11254  20   29:1    74             MAXDRAW := 19
 11255  20   29:1    74             
 11256  20   29:0    74           END;  (* STEP2RF *)
 11257  20   29:0    90           
 11258  20   29:0    90           
 11259  20   30:D     1         PROCEDURE STEP2F;  (* P010E1E *)
 11260  20   30:D     1         
 11261  20   30:0     0           BEGIN
 11262  20   30:1     0             MAZELINB( 16, 7, 1, 0, 4, 28);
 11263  20   30:1     8             MAZELINB( 15, 8, 0, 1, 4, 1);
 11264  20   30:1    16             MAZELINB( 16, 12, 1, 0, 4, 29);
 11265  20   30:1    24             MAZELINB( 20, 8, 0, 1, 4, 3);
 11266  20   30:1    32             IF FRWDWALL = DOOR THEN
 11267  20   30:2    39               BEGIN
 11268  20   30:3    39                 MAZELINB( 17, 8, 1, 0, 2, 28);
 11269  20   30:3    47                 MAZELINB( 16, 9, 0, 1, 3, 1);
 11270  20   30:3    55                 MAZELINB( 19, 9, 0, 1, 3, 3)
 11271  20   30:2    61               END
 11272  20   30:0    63           END;  (* STEP2F *)
 11273  20   30:0    76       
 11274  20   30:0    76       
 11275  20   25:0     0         BEGIN  (* STEP2 *)
 11276  20   25:1     0           IF LEFTBLCK THEN
 11277  20   25:2     5             STEP2L
 11278  20   25:1     5           ELSE
 11279  20   25:2     9             STEP2LF;
 11280  20   25:2    11             
 11281  20   25:1    11           IF RIGHBLCK THEN
 11282  20   25:2    16             STEP2R
 11283  20   25:1    16           ELSE
 11284  20   25:2    20             STEP2RF;
 11285  20   25:2    22             
 11286  20   25:1    22           IF FRWDWALL <> OPEN THEN
 11287  20   25:2    29             BEGIN
 11288  20   25:3    29               STEP2F;
 11289  20   25:3    31               EXITDRMZ
 11290  20   25:2    31             END
 11291  20   25:0    33         END;   (* STEP2 *)
 11292  20   25:0    46         
 11293  20   25:0    46         
 11294  20   31:D     1       PROCEDURE STEP3;  (* P010E1F *)
 11295  20   31:D     1       
 11296  20   32:D     1         PROCEDURE STEP3L;
 11297  20   32:D     1         
 11298  20   32:0     0           BEGIN
 11299  20   32:1     0             IF LEFTWALL = OPEN THEN
 11300  20   32:2     7               EXIT( STEP3L);
 11301  20   32:1    11             MAZELINE( 16,  8, 0);
 11302  20   32:1    16             MAZELINE( 16, 11, 2);
 11303  20   32:1    21             MAZELINB( 15,  8, 0, 1, 4, 1);
 11304  20   32:1    29             MAZELINB( 16,  9, 0, 1, 2, 1);
 11305  20   32:1    37             IF LEFTWALL = DOOR THEN
 11306  20   32:2    44               BEGIN
 11307  20   32:3    44                 MAZELINE( 16,  8, 16);
 11308  20   32:3    49                 MAZELINE( 16,  9, 17);
 11309  20   32:3    54                 MAZELINE( 16, 10, 18);
 11310  20   32:3    59                 MAZELINE( 16, 11, 19)
 11311  20   32:2    62               END;
 11312  20   32:1    64             MINDRAW := 17
 11313  20   32:0    64           END;  (* STEP3L *)
 11314  20   32:0    80           
 11315  20   32:0    80           
 11316  20   33:D     1         PROCEDURE STEP3LF;  (* P010E21 *)
 11317  20   33:D     1         
 11318  20   33:0     0           BEGIN
 11319  20   33:1     0             IF LEFTWALL = OPEN THEN
 11320  20   33:2     7               EXIT( STEP3LF);
 11321  20   33:1    11             MAZELINB( 15, 8, 1, 0, 2, 28);
 11322  20   33:1    19             MAZELINB( 15, 11, 1, 0, 2, 29);
 11323  20   33:1    27             MAZELINB( 14, 9, 0, 1, 2, 1);
 11324  20   33:1    35             MAZELINB( 16, 9, 0, 1, 2, 1);
 11325  20   33:1    43             IF LEFTWALL = DOOR THEN
 11326  20   33:2    50               BEGIN
 11327  20   33:3    50                 MAZELINE( 15, 9, 30);
 11328  20   33:3    55                 MAZELINE( 16, 9, 33);
 11329  20   33:3    60                 MAZELINE( 15, 10, 34);
 11330  20   33:3    65                 MAZELINE( 16, 10, 37)
 11331  20   33:2    68               END;
 11332  20   33:1    70             MINDRAW := 17
 11333  20   33:0    70           END;  (* STEP3LF *)
 11334  20   33:0    86           
 11335  20   33:0    86           
 11336  20   34:D     1         PROCEDURE STEP3R;  (* P010E22 *)
 11337  20   34:D     1         
 11338  20   34:0     0           BEGIN
 11339  20   34:1     0             IF RIGHWALL = OPEN THEN
 11340  20   34:2     7               EXIT( STEP3R);
 11341  20   34:1    11             MAZELINE( 19, 8,  2);
 11342  20   34:1    16             MAZELINE( 19, 11, 0);
 11343  20   34:1    21             MAZELINB( 19, 9, 0, 1, 2, 3);
 11344  20   34:1    29             MAZELINB( 20, 8, 0, 1, 4, 3);
 11345  20   34:1    37             IF RIGHWALL = DOOR THEN
 11346  20   34:2    44               BEGIN
 11347  20   34:3    44                 MAZELINE( 19,  8, 20);
 11348  20   34:3    49                 MAZELINE( 19,  9, 21);
 11349  20   34:3    54                 MAZELINE( 19, 10, 22);
 11350  20   34:3    59                 MAZELINE( 19, 11, 23)
 11351  20   34:2    62               END;
 11352  20   34:1    64             MAXDRAW := 18
 11353  20   34:0    64           END;  (* STEP3R *)
 11354  20   34:0    80           
 11355  20   34:0    80           
 11356  20   35:D     1         PROCEDURE STEP3RF;  (* P010E23 *)
 11357  20   35:D     1         
 11358  20   35:0     0           BEGIN
 11359  20   35:1     0             IF RIGHWALL = OPEN THEN
 11360  20   35:2     7               EXIT( STEP3RF);
 11361  20   35:1    11             MAZELINB( 19, 8, 1, 0, 2, 28);
 11362  20   35:1    19             MAZELINB( 19, 11, 1, 0, 2, 29);
 11363  20   35:1    27             MAZELINB( 19, 9, 0, 1, 2, 3);
 11364  20   35:1    35             MAZELINB( 21, 9, 0, 1, 2, 3);
 11365  20   35:1    43             IF RIGHWALL = DOOR THEN
 11366  20   35:2    50               BEGIN
 11367  20   35:3    50                 MAZELINE( 19,  9, 32);
 11368  20   35:3    55                 MAZELINE( 19, 10, 36);
 11369  20   35:3    60                 MAZELINE( 20,  9, 31);
 11370  20   35:3    65                 MAZELINE( 20, 10, 34)
 11371  20   35:2    68               END;
 11372  20   35:1    70             MAXDRAW := 18
 11373  20   35:0    70           END;  (* STEP3RF *)
 11374  20   35:0    86           
 11375  20   35:0    86           
 11376  20   36:D     1         PROCEDURE STEP3F;  (* P010E24 *)
 11377  20   36:D     1         
 11378  20   36:0     0           BEGIN
 11379  20   36:1     0             MAZELINB( 17,  8, 1, 0, 2, 28);
 11380  20   36:1     8             MAZELINB( 17, 11, 1, 0, 2, 29);
 11381  20   36:1    16             MAZELINB( 16,  9, 0, 1, 2,  1);
 11382  20   36:1    24             MAZELINB( 19,  9, 0, 1, 2,  3);
 11383  20   36:1    32             IF FRWDWALL = DOOR THEN
 11384  20   36:2    39               BEGIN
 11385  20   36:3    39                 MAZELINE( 17,  9, 30);
 11386  20   36:3    44                 MAZELINE( 18,  9, 31);
 11387  20   36:3    49                 MAZELINE( 17, 10, 34);
 11388  20   36:3    54                 MAZELINE( 18, 10, 35)
 11389  20   36:2    57               END
 11390  20   36:0    59           END;  (* STEP3F *)
 11391  20   36:0    72           
 11392  20   36:0    72           
 11393  20   31:0     0         BEGIN  (* STEP3 *)
 11394  20   31:1     0           IF LEFTBLCK THEN
 11395  20   31:2     5             STEP3L
 11396  20   31:1     5           ELSE
 11397  20   31:2     9             STEP3LF;
 11398  20   31:2    11             
 11399  20   31:1    11           IF RIGHBLCK THEN
 11400  20   31:2    16             STEP3R
 11401  20   31:1    16           ELSE
 11402  20   31:2    20             STEP3RF;
 11403  20   31:2    22           
 11404  20   31:1    22           IF FRWDWALL <> OPEN THEN
 11405  20   31:2    29             BEGIN
 11406  20   31:3    29               STEP3F;
 11407  20   31:3    31               EXITDRMZ
 11408  20   31:2    31             END
 11409  20   31:0    33         END;   (* STEP3 *)
 11410  20   31:0    46         
 11411  20   31:0    46         
 11412  20   37:D     1       PROCEDURE STEP4;  (* P010E25 *)
 11413  20   37:D     1       
 11414  20   37:0     0         BEGIN
 11415  20   37:1     0           IF LEFTBLCK THEN
 11416  20   37:2     5             IF LEFTWALL <> OPEN THEN
 11417  20   37:3    12               BEGIN
 11418  20   37:4    12                 MAZELINB( 16, 9, 0, 1, 2, 1);
 11419  20   37:4    20                 MAZELINE( 17, 9, 24);
 11420  20   37:4    25                 MAZELINE( 17, 10, 25)
 11421  20   37:3    28               END;
 11422  20   37:1    30           IF RIGHBLCK THEN
 11423  20   37:2    35             IF RIGHWALL <> OPEN THEN
 11424  20   37:3    42               BEGIN
 11425  20   37:4    42                 MAZELINB( 19, 9, 0, 1, 2, 3);
 11426  20   37:4    50                 MAZELINE( 18, 9, 26);
 11427  20   37:4    55                 MAZELINE( 18, 10, 27)
 11428  20   37:3    58               END
 11429  20   37:0    60         END;  (* STEP4 *)
 11430  20   37:0    72         
 11431  20   37:0    72         
 11432  20    2:0     0       BEGIN (* DRAWMAZE *)
 11433  20    2:1     0         X4DRAW := MAZEX;
 11434  20    2:1     3         Y4DRAW := MAZEY;
 11435  20    2:1     6         IF IDMONSTR > 0 THEN
 11436  20    2:2    13           IDMONSTR := IDMONSTR - 1;
 11437  20    2:1    21         GOTLIGHT := LIGHT > 0;
 11438  20    2:1    28         IF GOTLIGHT THEN
 11439  20    2:2    31           BEGIN
 11440  20    2:3    31             LIGHTDIS := 5;
 11441  20    2:3    34             LIGHT := LIGHT - 1
 11442  20    2:2    37           END
 11443  20    2:1    42         ELSE
 11444  20    2:2    44           LIGHTDIS := 2;
 11445  20    2:1    47         BKEYPRES := CHKKEYBD;
 11446  20    2:1    55         IF BKEYPRES THEN
 11447  20    2:2    60           EXITDRMZ;
 11448  20    2:1    62         FILLCHAR( MAINWIN^.DATA, 36 * 20, ORD( '@'));
 11449  20    2:1    74         MINDRAW := 0;
 11450  20    2:1    77         MAXDRAW := 35;
 11451  20    2:1    80         SHFTPOS( X4DRAW, Y4DRAW, 0, -1);
 11452  20    2:1    89         STEPFRWD;
 11453  20    2:1    91         STEP0;
 11454  20    2:1    93         STEPFRWD;
 11455  20    2:1    95         STEP1;
 11456  20    2:1    97         STEPFRWD;
 11457  20    2:1    99         STEP2;
 11458  20    2:1   101         STEPFRWD;
 11459  20    2:1   103         STEP3;
 11460  20    2:1   105         STEPFRWD;
 11461  20    2:1   107         STEP4;
 11462  20    2:1   109         EXITDRMZ
 11463  20    2:0   109       END;  (* DRAWMAZE *)
 11464  20    2:0   124     
 11465  20    2:0   124 (*$I WIZ3C:RUNNER    *)
 11465  20    2:0   124 (*$I WIZ3C:RUNNER2   *)
 11466  20   38:D     1     PROCEDURE FLSHNDRW;  (* P010E26 *)
 11467  20   38:D     1     
 11468  20   38:0     0       BEGIN
 11469  20   38:1     0         REPEAT
 11470  20   38:2     0           UNITCLEAR( 1);
 11471  20   38:2     3           DRAWMAZE
 11472  20   38:1     3         UNTIL NOT BKEYPRES;
 11473  20   38:1    11         DRAWSCR( WINCHAIN)
 11474  20   38:0    14       END;
 11475  20   38:0    32       
 11476  20   38:0    32       
 11477  20   39:D     1     PROCEDURE SPECMSG( AMSG: STRING);  (* P010E27 *)
 11478  20   39:D    43     
 11479  20   39:D    43       VAR
 11480  20   39:D    43            SPECWIN  : TWINDOWP;
 11481  20   39:D    44            HALFMSGL : INTEGER;
 11482  20   39:D    45     
 11483  20   39:0     0       BEGIN
 11484  20   39:1     0         UNITCLEAR( 1);
 11485  20   39:1     8         HALFMSGL := (LENGTH( AMSG) + 1) DIV 2;
 11486  20   39:1    18         SPECWIN := GETWIN( 19 - HALFMSGL, 10, 2 + LENGTH( AMSG), 3, 15, FALSE);
 11487  20   39:1    39         FLSHNDRW;
 11488  20   39:1    41         PRINTSTR( SPECWIN, AMSG);
 11489  20   39:1    48         DELWIN( SPECWIN, FALSE)
 11490  20   39:0    51       END;  (* SPECMSG *)
 11491  20   39:0    66       
 11492  20   39:0    66       
 11493  20   40:D     1     PROCEDURE CLROOMFG( XLOOP: INTEGER;  (* P010E28 *)
 11494  20   40:D     2                         YLOOP: INTEGER);
 11495  20   40:D     3     
 11496  20   40:D     3       VAR
 11497  20   40:D     3            DONECHK  : BOOLEAN;
 11498  20   40:D     4            FIGHTCHK : PACKED ARRAY[ 0..19] OF PACKED ARRAY[ 0..19] OF BOOLEAN;
 11499  20   40:D    44            
 11500  20   40:D    44            
 11501  20   41:D     1       PROCEDURE CHK4FIGH( NEWX:     INTEGER;   (* P010E29 *)
 11502  20   41:D     2                           NEWY:     INTEGER;
 11503  20   41:D     3                           WALL2NEW: TWALL);
 11504  20   41:D     4       
 11505  20   41:0     0         BEGIN
 11506  20   41:1     0           IF WALL2NEW <> OPEN THEN
 11507  20   41:2     5             EXIT( CHK4FIGH);
 11508  20   41:1     9           NEWX := (NEWX + 20) MOD 20;
 11509  20   41:1    16           NEWY := (NEWY + 20) MOD 20;
 11510  20   41:1    23           IF (MAZE.FIGHTS[ NEWX][ NEWY] <> 1) OR
 11511  20   41:1    37              (FIGHTCHK[ NEWX][ NEWY]) THEN
 11512  20   41:2    51             EXIT( CHK4FIGH);
 11513  20   41:1    55           DONECHK := FALSE;
 11514  20   41:1    59           FIGHTCHK[ NEWX][ NEWY] := TRUE
 11515  20   41:0    69         END;  (* CHK4FIGH *)
 11516  20   41:0    84         
 11517  20   41:0    84         
 11518  20   40:0     0       BEGIN  (* CLROOMFG *)
 11519  20   40:1     0         FILLCHAR( FIGHTCHK, 80, 0);
 11520  20   40:1     7         FIGHTCHK[ MAZEX][ MAZEY] := TRUE;
 11521  20   40:1    18         REPEAT
 11522  20   40:2    18           DONECHK := TRUE;
 11523  20   40:2    21           FOR XLOOP := 0 TO 19 DO
 11524  20   40:3    33             FOR YLOOP := 0 TO 19 DO
 11525  20   40:4    45               IF FIGHTCHK[ XLOOP][ YLOOP] THEN
 11526  20   40:5    57                 IF FIGHTMAP[ XLOOP][ YLOOP] THEN
 11527  20   40:6    70                   BEGIN
 11528  20   40:7    70                    CHK4FIGH( XLOOP + 1, YLOOP,     MAZE.E[ XLOOP][ YLOOP]);
 11529  20   40:7    87                    CHK4FIGH( XLOOP - 1, YLOOP,     MAZE.W[ XLOOP][ YLOOP]);
 11530  20   40:7   104                    CHK4FIGH( XLOOP,     YLOOP - 1, MAZE.S[ XLOOP][ YLOOP]);
 11531  20   40:7   121                    CHK4FIGH( XLOOP,     YLOOP + 1, MAZE.N[ XLOOP][ YLOOP]);
 11532  20   40:7   139                    FIGHTMAP[ XLOOP][ YLOOP] := FALSE
 11533  20   40:6   149                   END;
 11534  20   40:1   165         UNTIL DONECHK
 11535  20   40:0   165       END;   (* CLROOMFG *)
 11536  20   40:0   188       
 11537  20   40:0   188       
 11538  20   42:D     1     PROCEDURE DRAWSCRN( UNPROT: BOOLEAN);  (* P010E2A *)
 11539  20   42:D     2     
 11540  20   42:0     0       BEGIN
 11541  20   42:1     0         DELWIN( CSIOWIN, FALSE);
 11542  20   42:1     7         DELWIN( LPIWIN, FALSE);
 11543  20   42:1    14         IF UNPROT THEN
 11544  20   42:2    17           UNPROWIN( CHARSWIN, FALSE);
 11545  20   42:1    24         IF BKEYPRES THEN
 11546  20   42:2    29           FLSHNDRW
 11547  20   42:1    29         ELSE
 11548  20   42:2    33           DRAWSCR( WINCHAIN)
 11549  20   42:0    36       END;  (* DRAWSCRN *)
 11550  20   42:0    52       
 11551  20   42:0    52       
 11552  20   43:D     1     PROCEDURE PRSTATS;  (* P010E2B *)
 11553  20   43:D     1     
 11554  20   43:D     1       VAR
 11555  20   43:D     1           UNUSEDXX : INTEGER;
 11556  20   43:D     2           HPDELTA  : INTEGER;
 11557  20   43:D     3           CHARX    : INTEGER;
 11558  20   43:D     4           UNUSEDYY : ARRAY[ 1..104] OF INTEGER;
 11559  20   43:D   108           ANYALIVE : BOOLEAN;
 11560  20   43:D   109     
 11561  20   43:D   109     
 11562  20   44:D     1       PROCEDURE PRSTATUS;  (* P010E2C *)
 11563  20   44:D     1       
 11564  20   44:0     0         BEGIN
 11565  20   44:1     0           HPDELTA := CHARACTR[ CHARX].HEALPTS -
 11566  20   44:1     9                      CHARACTR[ CHARX].LOSTXYL.POISNAMT[ 1];
 11567  20   44:1    28           IF HPDELTA = 0 THEN
 11568  20   44:2    35             PRINTCHR( CHARSWIN, ' ')
 11569  20   44:1    39           ELSE IF HPDELTA < 0 THEN
 11570  20   44:3    51             PRINTCHR( CHARSWIN, '-')
 11571  20   44:2    55           ELSE
 11572  20   44:3    60             PRINTCHR( CHARSWIN, '+');
 11573  20   44:3    67             
 11574  20   44:1    67           IF CHARACTR[ CHARX].STATUS = OK THEN
 11575  20   44:2    80             BEGIN
 11576  20   44:3    80               ANYALIVE := TRUE;
 11577  20   44:3    84               IF CHARACTR[ CHARX].LOSTXYL.POISNAMT[ 1] = 0 THEN
 11578  20   44:4   103                 PRINTNUM( CHARSWIN, CHARACTR[ CHARX].HPMAX, 4)
 11579  20   44:3   116               ELSE
 11580  20   44:4   121                 PRINTSTR( CHARSWIN, 'POISON')
 11581  20   44:2   133             END
 11582  20   44:1   136           ELSE
 11583  20   44:2   138             PRINTSTR( CHARSWIN, SCNTOC.STATUS[ CHARACTR[ CHARX].STATUS])
 11584  20   44:0   155         END;  (* PRSTATUS *)
 11585  20   44:0   170         
 11586  20   44:0   170         
 11587  20   43:0     0       BEGIN  (* PRSTATS *)
 11588  20   43:1     0         ANYALIVE := FALSE;
 11589  20   43:1     3         IF BKEYPRES THEN
 11590  20   43:2     8           FLSHNDRW;
 11591  20   43:1    10         FOR CHARX := 0 TO PARTYCNT - 1 DO
 11592  20   43:2    24           BEGIN
 11593  20   43:3    24             MVCURSOR( CHARSWIN, 0, CHARX + 1);
 11594  20   43:3    34             PRINTNUM( CHARSWIN, CHARX + 1, 1);
 11595  20   43:3    44             PRINTCHR( CHARSWIN, ' ');
 11596  20   43:3    51             PRINTSTR( CHARSWIN, CHARACTR[ CHARX].NAME);
 11597  20   43:3    62             WHILE CHARSWIN^.HEAD.HCURSOR < 18 DO
 11598  20   43:4    74               PRINTCHR( CHARSWIN, ' ');
 11599  20   43:3    83             PRINTSTR( CHARSWIN,
 11600  20   43:3    86                       COPY( SCNTOC.ALIGN[ CHARACTR[ CHARX].ALIGN], 1, 1));
 11601  20   43:3   110             PRINTCHR( CHARSWIN, '-');
 11602  20   43:3   117             PRINTSTR( CHARSWIN,
 11603  20   43:3   120                       COPY( SCNTOC.CLASS[ CHARACTR[ CHARX].CLASS], 1, 3));
 11604  20   43:3   144             PRINTCHR( CHARSWIN, ' ');
 11605  20   43:3   151             BASE04 := CHARACTR[ CHARX].ARMORCL - ACMOD2;
 11606  20   43:3   164             IF BASE04 > -10 THEN
 11607  20   43:4   170               PRINTNUM( CHARSWIN, BASE04, 2)
 11608  20   43:3   175             ELSE
 11609  20   43:4   180               PRINTSTR( CHARSWIN, 'LO');
 11610  20   43:3   191             PRINTNUM( CHARSWIN, CHARACTR[ CHARX].HPLEFT, 5);
 11611  20   43:3   205             PRSTATUS;
 11612  20   43:3   207             WHILE CHARSWIN^.HEAD.HCURSOR <> 0 DO
 11613  20   43:4   219               PRINTCHR( CHARSWIN, ' ')
 11614  20   43:2   223           END;
 11615  20   43:1   235         UNPROWIN( CHARSWIN, TRUE);
 11616  20   43:1   242         IF NOT ANYALIVE THEN
 11617  20   43:2   247           BEGIN
 11618  20   43:3   247             XGOTO := XCEMETRY;
 11619  20   43:3   251             DRAWSCRN( FALSE);
 11620  20   43:3   254             EXIT( RUNNER)
 11621  20   43:2   258           END
 11622  20   43:0   258       END;   (* PRSTATS *)
 11623  20   43:0   278       
 11624  20   43:0   278       
 11625  20   45:D     1     PROCEDURE UPDATEHP;  (* P010E2D *)
 11626  20   45:D     1     
 11627  20   45:D     1       VAR
 11628  20   45:D     1            UNUSEDXX : INTEGER;
 11629  20   45:D     2            CHARX    : INTEGER;
 11630  20   45:D     3            
 11631  20   45:0     0       BEGIN
 11632  20   45:1     0         FOR CHARX := 0 TO PARTYCNT - 1 DO
 11633  20   45:2    13           WITH CHARACTR[ CHARX] DO
 11634  20   45:3    20             BEGIN
 11635  20   45:4    20               IF LOSTXYL.POISNAMT[ 1] > 0 THEN
 11636  20   45:5    33                 IF HPLEFT > 50 THEN
 11637  20   45:6    40                   HPLEFT := HPLEFT - (HPLEFT DIV 10)
 11638  20   45:5    51                 ELSE
 11639  20   45:6    55                   HPLEFT := HPLEFT - LOSTXYL.POISNAMT[ 1];
 11640  20   45:4    72               HPLEFT := HPLEFT + HEALPTS;
 11641  20   45:4    83               IF HPLEFT <= 0 THEN
 11642  20   45:5    90                 BEGIN
 11643  20   45:6    90                   LOSTXYL.POISNAMT[ 1] := 0;
 11644  20   45:6   100                   IF STATUS < DEAD THEN
 11645  20   45:7   107                     BEGIN
 11646  20   45:8   107                       HPLEFT := 0;
 11647  20   45:8   112                       STATUS := DEAD;
 11648  20   45:8   117                       PRSTATS
 11649  20   45:7   117                     END
 11650  20   45:5   119                 END
 11651  20   45:4   119               ELSE
 11652  20   45:5   121                 IF HPLEFT > HPMAX THEN
 11653  20   45:6   130                   HPLEFT := HPMAX
 11654  20   45:3   133             END
 11655  20   45:0   137       END;  (* UPDATEHP *)
 11656  20   45:0   160       
 11657  20   45:0   160       
 11658  20   46:D     1     PROCEDURE ENCOUNTR;  (* P010E2E *)
 11659  20   46:D     1     
 11660  20   46:D     1       VAR
 11661  20   46:D     1            ENCTYPE  : INTEGER;
 11662  20   46:D     2            ENEMYI   : INTEGER;
 11663  20   46:D     3            ENCCALC  : INTEGER;
 11664  20   46:D     4     
 11665  20   46:0     0       BEGIN
 11666  20   46:1     0         ENCB4RUN := TRUE;
 11667  20   46:1     4         SPECMSG( 'AN ENCOUNTER');
 11668  20   46:1    21         ENCTYPE := 1;
 11669  20   46:1    24         WHILE ((RANDOM MOD 4) = 2) AND (ENCTYPE < 3) DO
 11670  20   46:2    39           ENCTYPE := ENCTYPE + 1;
 11671  20   46:1    46         WITH MAZE.ENMYCALC[ ENCTYPE] DO
 11672  20   46:2    57           BEGIN
 11673  20   46:3    57             ENCCALC := 0;
 11674  20   46:3    60             WHILE ((RANDOM MOD 100) < PERCWORS) AND
 11675  20   46:3    70                    (ENCCALC < WORSE01) DO
 11676  20   46:4    77               ENCCALC := ENCCALC + 1;
 11677  20   46:3    84             ENEMYI := MINENEMY +
 11678  20   46:3    86                         (RANDOM MOD RANGE0N) +
 11679  20   46:3    95                         (MULTWORS * ENCCALC);
 11680  20   46:3   102             IF CHSTALRM = 1 THEN
 11681  20   46:4   109               ATTK012 := 2
 11682  20   46:3   109             ELSE
 11683  20   46:4   115               IF MAZE.FIGHTS[ MAZEX][ MAZEY] = 1 THEN
 11684  20   46:5   131                 IF FIGHTMAP[ MAZEX][ MAZEY] THEN
 11685  20   46:6   144                   ATTK012 := 2
 11686  20   46:5   144                 ELSE
 11687  20   46:6   150                   ATTK012 := 1
 11688  20   46:4   150               ELSE
 11689  20   46:5   156                 ATTK012 := 0;
 11690  20   46:3   160             ENEMYINX := ENEMYI;
 11691  20   46:3   164             XGOTO := XCOMBAT;
 11692  20   46:3   168             DRAWSCRN( FALSE);
 11693  20   46:3   171             EXIT( RUNNER)
 11694  20   46:2   175           END
 11695  20   46:0   175       END;  (* ENCOUNTR *)
 11696  20   46:0   192       
 11697  20   46:0   192       
 11698  20   47:D     1     PROCEDURE RUNMAIN;  (* P010E2F *)
 11699  20   47:D     1     
 11700  20   48:D     1       PROCEDURE EXITRUN( MAZELVL: INTEGER);  (* P010E30 *)
 11701  20   48:D     2       
 11702  20   48:0     0         BEGIN
 11703  20   48:1     0           MAZELEV := MAZELVL;
 11704  20   48:1     3           XGOTO := XNEWMAZE;
 11705  20   48:1     7           DRAWSCRN( FALSE);
 11706  20   48:1    10           EXIT( RUNNER)
 11707  20   48:0    14         END;  (* EXITRUN *)
 11708  20   48:0    26         
 11709  20   48:0    26         
 11710  20   49:D     1       PROCEDURE SPECSQAR;  (* P010E31 *)
 11711  20   49:D     1       
 11712  20   49:D     1         VAR
 11713  20   49:D     1              SQTYPE : INTEGER;
 11714  20   49:D     2       
 11715  20   49:D     2       
 11716  20   50:D     1         PROCEDURE SPINDIR;  (* P010E32 *)
 11717  20   50:D     1         
 11718  20   50:0     0           BEGIN
 11719  20   50:1     0             DIRECTIO := RANDOM MOD 4;
 11720  20   50:1     9             DRAWMAZE
 11721  20   50:0     9           END;
 11722  20   50:0    24           
 11723  20   50:0    24           
 11724  20   51:D     1         PROCEDURE QUIETXFR;  (* P010E33 *)
 11725  20   51:D     1         
 11726  20   51:0     0           BEGIN
 11727  20   51:1     0             MAZEX := MAZE.AUX2[ SQTYPE];
 11728  20   51:1    12             MAZEY := MAZE.AUX1[ SQTYPE];
 11729  20   51:1    24             IF MAZELEV <> MAZE.AUX0[ SQTYPE] THEN
 11730  20   51:2    38               EXITRUN( MAZE.AUX0[ SQTYPE])
 11731  20   51:0    48           END;  (* QUIETXFR *)
 11732  20   51:0    62           
 11733  20   51:0    62           
 11734  20   52:D     1         PROCEDURE ACHUTE;  (* P010E34 *)
 11735  20   52:D     1         
 11736  20   52:0     0           BEGIN
 11737  20   52:1     0             SPECMSG( 'A CHUTE!');
 11738  20   52:1    13             QUIETXFR
 11739  20   52:0    13           END;  (* P010E34 *)
 11740  20   52:0    28           
 11741  20   52:0    28           
 11742  20   53:D     1         PROCEDURE STAIRSYN;  (* P010E35 *)
 11743  20   53:D     1         
 11744  20   53:0     0           BEGIN
 11745  20   53:1     0             TEMPWIN := GETWIN( 9, 10, 22, 4, 15, TRUE);
 11746  20   53:1    14             IF MAZELEV < MAZE.AUX0[ SQTYPE] THEN
 11747  20   53:2    28               CENTSTR( TEMPWIN, 'STAIRS GOING UP.')
 11748  20   53:1    50             ELSE
 11749  20   53:2    55               CENTSTR( TEMPWIN, 'STAIRS GOING DOWN.');
 11750  20   53:1    82             CENTSTR( TEMPWIN, 'TAKE THEM (Y/N) ?');
 11751  20   53:1   108             REPEAT
 11752  20   53:2   108               GETKEY
 11753  20   53:1   108             UNTIL (INCHAR = 'Y') OR (INCHAR = 'N');
 11754  20   53:1   120             DELWIN( TEMPWIN, TRUE);
 11755  20   53:1   127             IF INCHAR = 'Y' THEN
 11756  20   53:2   132               QUIETXFR
 11757  20   53:0   132           END;  (* STAIRSYN *)
 11758  20   53:0   148           
 11759  20   53:0   148           
 11760  20   54:D     1         PROCEDURE VERYDARK;  (* P010E36 *)
 11761  20   54:D     1         
 11762  20   54:0     0           BEGIN
 11763  20   54:1     0             IF MAZE.AUX1[ SQTYPE] = 0 THEN
 11764  20   54:2    14               LIGHT := 0;
 11765  20   54:1    18             IF MAZE.AUX2[ SQTYPE] = 1 THEN
 11766  20   54:2    32               EXIT( VERYDARK);
 11767  20   54:1    36             SPECMSG( 'IT''S VERY DARK HERE');
 11768  20   54:1    60             LIGHT := 0
 11769  20   54:0    60           END;  (* VERYDARK *)
 11770  20   54:0    76           
 11771  20   54:0    76           
 11772  20   55:D     1         PROCEDURE ROCKWATR;  (* P010E37 *)
 11773  20   55:D     1         
 11774  20   55:D     1         
 11775  20   56:D     1           PROCEDURE HAVESHIP;  (* P010E38 *)
 11776  20   56:D     1           
 11777  20   56:D     1             VAR
 11778  20   56:D     1                  POSSI : INTEGER;
 11779  20   56:D     2                  CHARX : INTEGER;
 11780  20   56:D     3           
 11781  20   56:0     0             BEGIN
 11782  20   56:1     0               BSHIPBOT := FALSE;
 11783  20   56:1     4               FOR CHARX := 0 TO PARTYCNT - 1 DO
 11784  20   56:2    17                 FOR POSSI := 1 TO CHARACTR[ CHARX].POSS.POSSCNT DO
 11785  20   56:3    34                   BSHIPBOT := BSHIPBOT OR
 11786  20   56:3    37                     (CHARACTR[ CHARX].POSS.POSSESS[ POSSI].EQINDEX = SHIPBOTT)
 11787  20   56:0    54             END;  (* HAVESHIP *)
 11788  20   56:0    88             
 11789  20   56:0    88             
 11790  20   55:0     0           BEGIN (* ROCKWATR *)
 11791  20   55:1     0             HAVESHIP;
 11792  20   55:1     2             IF MAZELEV <> 1 THEN
 11793  20   55:2     7               BEGIN
 11794  20   55:3     7                 FOR BASE04 := 0 TO PARTYCNT - 1 DO
 11795  20   55:4    20                   CHARACTR[ BASE04].STATUS := LOST;
 11796  20   55:3    36                 SPECMSG( 'YOU ARE IN ROCK!')
 11797  20   55:2    55               END
 11798  20   55:1    57             ELSE
 11799  20   55:2    59               IF BSHIPBOT THEN
 11800  20   55:3    64                 EXIT( ROCKWATR)
 11801  20   55:2    68               ELSE
 11802  20   55:3    70                 BEGIN
 11803  20   55:4    70                   FOR BASE04 := 0 TO PARTYCNT - 1 DO
 11804  20   55:5    83                     CHARACTR[ BASE04].STATUS := DEAD;
 11805  20   55:4    99                   SPECMSG( 'YOU HAVE FALLEN INTO WATER AND DROWN!')
 11806  20   55:3   139                 END;
 11807  20   55:1   141             PRSTATS;
 11808  20   55:1   143             MAZELEV := 0;
 11809  20   55:1   146             XGOTO := XCEMETRY;
 11810  20   55:1   150             DRAWSCRN( FALSE);
 11811  20   55:1   153             EXIT( RUNNER)
 11812  20   55:0   157           END;  (* ROCKWATR *)
 11813  20   55:0   174         
 11814  20   55:0   174         
 11815  20   57:D     1         PROCEDURE PITOUCH;  (* P010E39 *)
 11816  20   57:D     1         
 11817  20   57:D     1           VAR
 11818  20   57:D     1                HPDAM  : INTEGER;
 11819  20   57:D     2                HITCNT : INTEGER;
 11820  20   57:D     3                CHARX  : INTEGER;
 11821  20   57:D     4         
 11822  20   57:0     0           BEGIN
 11823  20   57:1     0             FOR CHARX := 0 TO PARTYCNT - 1 DO
 11824  20   57:2    13               IF CHARACTR[ CHARX].STATUS < DEAD THEN
 11825  20   57:3    24                 IF ((RANDOM MOD 25) + MAZELEV) >
 11826  20   57:3    33                      CHARACTR[ CHARX].ATTRIB[ AGILITY] THEN
 11827  20   57:4    48                   BEGIN
 11828  20   57:5    48                     HPDAM := MAZE.AUX0[ SQTYPE];
 11829  20   57:5    60                     FOR HITCNT := 1 TO MAZE.AUX2[ SQTYPE] DO
 11830  20   57:6    80                       HPDAM := HPDAM + (RANDOM MOD MAZE.AUX1[ SQTYPE]) + 1;
 11831  20   57:5   109                     CHARACTR[ CHARX].HPLEFT := CHARACTR[ CHARX].HPLEFT - HPDAM;
 11832  20   57:5   126                     IF CHARACTR[ CHARX].HPLEFT < 0 THEN
 11833  20   57:6   137                       BEGIN
 11834  20   57:7   137                         CHARACTR[ CHARX].HPLEFT := 0;
 11835  20   57:7   146                         CHARACTR[ CHARX].STATUS := DEAD
 11836  20   57:6   153                       END
 11837  20   57:4   155                   END;
 11838  20   57:1   162             PRSTATS
 11839  20   57:0   162           END;  (* PITOUCH *)
 11840  20   57:0   184           
 11841  20   57:0   184           
 11842  20   58:D     1         PROCEDURE APIT;  (* P010E3A *)
 11843  20   58:D     1         
 11844  20   58:0     0           BEGIN
 11845  20   58:1     0             SPECMSG( 'A PIT!');
 11846  20   58:1    11             PITOUCH
 11847  20   58:0    11           END;
 11848  20   58:0    26           
 11849  20   58:0    26           
 11850  20   59:D     1         PROCEDURE OUCH;  (* P010E3B *)
 11851  20   59:D     1         
 11852  20   59:0     0           BEGIN
 11853  20   59:1     0             SPECMSG( 'OUCH!');
 11854  20   59:1    10             PITOUCH
 11855  20   59:0    10           END;
 11856  20   59:0    24           
 11857  20   59:0    24           
 11858  20   60:D     1         PROCEDURE DOSCNMSG;  (* P010E3C *)
 11859  20   60:D     1         
 11860  20   60:0     0           BEGIN
 11861  20   60:1     0             BASE04 := SQTYPE;
 11862  20   60:1     5             XGOTO := XSCNMSG;
 11863  20   60:1     9             XGOTO2 := XRUNNER;
 11864  20   60:1    13             DRAWSCRN( TRUE);
 11865  20   60:1    16             EXIT( RUNNER)
 11866  20   60:0    20           END;  (* DOSCNMSG *)
 11867  20   60:0    32           
 11868  20   60:0    32           
 11869  20   61:D     1         PROCEDURE CHENCOUN;  (* P010E3D *)
 11870  20   61:D     1         
 11871  20   61:D     1           VAR
 11872  20   61:D     1                UNUSEDXX : INTEGER;
 11873  20   61:D     2                UNUSEDYY : INTEGER;
 11874  20   61:D     3         
 11875  20   61:0     0           BEGIN
 11876  20   61:1     0             IF MAZE.AUX0[ SQTYPE] = 0 THEN
 11877  20   61:2    14               EXIT( CHENCOUN);
 11878  20   61:1    18             IF NOT FIGHTMAP[ MAZEX][ MAZEY] THEN
 11879  20   61:2    32               EXIT( CHENCOUN);
 11880  20   61:1    36             SPECMSG( 'AN ENCOUNTER');
 11881  20   61:1    53             ENEMYINX := MAZE.AUX2[ SQTYPE];
 11882  20   61:1    66             IF MAZE.AUX1[ SQTYPE] > 1 THEN
 11883  20   61:2    80               ENEMYINX := ENEMYINX + (RANDOM MOD MAZE.AUX1[ SQTYPE]);
 11884  20   61:1   103             IF MAZE.AUX0[ SQTYPE] > 0 THEN
 11885  20   61:2   117               BEGIN
 11886  20   61:3   117                 MAZE.AUX0[ SQTYPE] := MAZE.AUX0[ SQTYPE] - 1;
 11887  20   61:3   139                 IF MAZE.AUX0[ SQTYPE] = 0 THEN
 11888  20   61:4   153                   MAZE.SQRETYPE[ SQTYPE] := NORMAL;
 11889  20   61:3   165                 MOVELEFT( MAZE,  
 11890  20   61:3   169                           IOCACHE[ GETRECW( ZMAZE, MAZELEV - 1, SIZEOF( TMAZE))],
 11891  20   61:3   184                           SIZEOF( TMAZE));
 11892  20   61:2   189               END;
 11893  20   61:1   189             ENCB4RUN := FALSE;
 11894  20   61:1   193             ATTK012 := 2;
 11895  20   61:1   197             XGOTO := XCOMBAT;
 11896  20   61:1   201             DRAWSCRN( FALSE);
 11897  20   61:1   204             EXIT( RUNNER)
 11898  20   61:0   208           END;  (* CHENCOUN *)
 11899  20   61:0   220           
 11900  20   61:0   220           
 11901  20   62:D     1         PROCEDURE BUTTONS;  (* P010E3E *)
 11902  20   62:D     1         
 11903  20   62:D     1           VAR
 11904  20   62:D     1                MAXBUT   : INTEGER;
 11905  20   62:D     2                MINBUT   : INTEGER;
 11906  20   62:D     3                UNUSEDXX : INTEGER;
 11907  20   62:D     4                UNUSEDYY : INTEGER;
 11908  20   62:D     5                BUTSTR   : STRING[ 20];
 11909  20   62:D    16                
 11910  20   62:0     0           BEGIN
 11911  20   62:1     0             MINBUT := MAZE.AUX2[ SQTYPE];
 11912  20   62:1    12             MAXBUT := MAZE.AUX1[ SQTYPE];
 11913  20   62:1    24             TEMPWIN := GETWIN( 0, 10, 40, 6, 15, TRUE);
 11914  20   62:1    38             CENTSTR( TEMPWIN, 'THERE ARE BUTTONS ON THE WALL');
 11915  20   62:1    76             BUTSTR := 'MARKED A THROUGH X.';
 11916  20   62:1   102             BUTSTR[ 18] := CHR( ORD('A') + MAXBUT - MINBUT);
 11917  20   62:1   111             CENTSTR( TEMPWIN, BUTSTR);
 11918  20   62:1   119             PRINTCR( TEMPWIN);
 11919  20   62:1   125             CENTSTR( TEMPWIN, 'PRESS ONE (OR RETURN TO LEAVE THEM)');
 11920  20   62:1   169             DELWIN( TEMPWIN, FALSE);
 11921  20   62:1   176             REPEAT
 11922  20   62:2   176               GETKEY
 11923  20   62:1   176             UNTIL (INCHAR = CHR( CRETURN)) OR 
 11924  20   62:1   182                   ( (INCHAR >= 'A') AND 
 11925  20   62:1   185                     (INCHAR <= CHR( ORD('A') + MAXBUT - MINBUT)));
 11926  20   62:1   196             IF INCHAR = CHR( CRETURN) THEN
 11927  20   62:2   201               EXIT( BUTTONS);
 11928  20   62:1   205             IF MAZE.AUX0[ SQTYPE] > 0 THEN
 11929  20   62:2   219               BEGIN
 11930  20   62:3   219                 MAZEX := RANDOM MOD 20;
 11931  20   62:3   228                 MAZEY := RANDOM MOD 20
 11932  20   62:2   233               END;
 11933  20   62:1   237             EXITRUN( MINBUT + ORD( INCHAR) - ORD( 'A'))
 11934  20   62:0   242           END;  (* BUTTONS *)
 11935  20   62:0   258           
 11936  20   62:0   258           
 11937  20   49:0     0         BEGIN  (* SPECSQAR *)
 11938  20   49:1     0           SQTYPE := MAZE.SQREXTRA[ MAZEX][ MAZEY];
 11939  20   49:1    14           CASE MAZE.SQRETYPE[ SQTYPE] OF
 11940  20   49:1    25               FIZZLE:  FIZZLES := 1;
 11941  20   49:1    31             ROCKWATE:  ROCKWATR;
 11942  20   49:1    35              BUTTONZ:  BUTTONS;
 11943  20   49:1    39               STAIRS:  IF INITTURN THEN
 11944  20   49:3    44                          STAIRSYN;
 11945  20   49:1    48                  PIT:  IF INITTURN THEN
 11946  20   49:3    53                          APIT;
 11947  20   49:1    57                OUCHY:  OUCH;
 11948  20   49:1    61                CHUTE:  ACHUTE;
 11949  20   49:1    65              SPINNER:  IF INITTURN THEN
 11950  20   49:3    70                          SPINDIR;
 11951  20   49:1    74             TRANSFER:  QUIETXFR;
 11952  20   49:1    78                 DARK:  VERYDARK;
 11953  20   49:1    82               SCNMSG:  DOSCNMSG;
 11954  20   49:1    86             ENCOUNTE:  CHENCOUN;
 11955  20   49:1    90           END
 11956  20   49:0   122         END;   (* SPECSQAR *)
 11957  20   49:0   134       
 11958  20   49:0   134       
 11959  20   63:D     1       PROCEDURE MOVEFRWD;  (* P010E3F *)
 11960  20   63:D     1       
 11961  20   63:0     0         BEGIN
 11962  20   63:1     0           NEEDDRMZ := TRUE;
 11963  20   63:1     4           INITTURN := TRUE;
 11964  20   63:1     8           SAVEX    := MAZEX;
 11965  20   63:1    12           SAVEY    := MAZEY;
 11966  20   63:1    16           SAVELEV  := MAZELEV;
 11967  20   63:1    20           CASE DIRECTIO OF
 11968  20   63:1    23             NORTH:  MAZEY := MAZEY + 1;
 11969  20   63:1    30              EAST:  MAZEX := MAZEX + 1;
 11970  20   63:1    37             SOUTH:  MAZEY := MAZEY - 1;
 11971  20   63:1    44              WEST:  MAZEX := MAZEX - 1;
 11972  20   63:1    51           END;
 11973  20   63:1    66           MAZEY := (MAZEY + 20) MOD 20;
 11974  20   63:1    73           MAZEX := (MAZEX + 20) MOD 20
 11975  20   63:0    76         END;  (* MOVEFRWD *)
 11976  20   63:0    92         
 11977  20   63:0    92         
 11978  20   64:D     1       PROCEDURE BUMPWALL;  (* P010E40 *)
 11979  20   64:D     1       
 11980  20   64:0     0         BEGIN
 11981  20   64:1     0           SPECMSG( 'OUCH!');
 11982  20   64:1    10           RINGBELL
 11983  20   64:0    10         END;
 11984  20   64:0    26         
 11985  20   64:0    26         
 11986  20   65:D     1       PROCEDURE FORWRD;  (* P010E41 *)
 11987  20   65:D     1       
 11988  20   65:0     0         BEGIN
 11989  20   65:1     0           CASE DIRECTIO OF
 11990  20   65:1     3             NORTH:  IF MAZE.N[ MAZEX][ MAZEY] = OPEN THEN
 11991  20   65:3    19                       MOVEFRWD;
 11992  20   65:3    23                       
 11993  20   65:1    23              EAST:  IF MAZE.E[ MAZEX][ MAZEY] = OPEN THEN
 11994  20   65:3    38                       MOVEFRWD;
 11995  20   65:3    42                       
 11996  20   65:1    42             SOUTH:  IF MAZE.S[ MAZEX][ MAZEY] = OPEN THEN
 11997  20   65:3    57                       MOVEFRWD;
 11998  20   65:3    61                       
 11999  20   65:1    61              WEST:  IF MAZE.W[ MAZEX][ MAZEY] = OPEN THEN
 12000  20   65:3    76                       MOVEFRWD;
 12001  20   65:1    80           END;
 12002  20   65:1    96           IF NOT INITTURN THEN
 12003  20   65:2   102             BUMPWALL
 12004  20   65:0   102         END;  (* FORWRD *)
 12005  20   65:0   116         
 12006  20   65:0   116         
 12007  20   66:D     1       PROCEDURE KICK;  (* P010E42 *)
 12008  20   66:D     1       
 12009  20   66:0     0         BEGIN
 12010  20   66:1     0           CASE DIRECTIO OF
 12011  20   66:1     3             NORTH:  IF MAZE.N[ MAZEX][ MAZEY] <> WALL THEN
 12012  20   66:3    19                       MOVEFRWD;
 12013  20   66:3    23                       
 12014  20   66:1    23              EAST:  IF MAZE.E[ MAZEX][ MAZEY] <> WALL THEN
 12015  20   66:3    38                       MOVEFRWD;
 12016  20   66:3    42                       
 12017  20   66:1    42             SOUTH:  IF MAZE.S[ MAZEX][ MAZEY] <> WALL THEN
 12018  20   66:3    57                       MOVEFRWD;
 12019  20   66:3    61                       
 12020  20   66:1    61              WEST:  IF MAZE.W[ MAZEX][ MAZEY] <> WALL THEN
 12021  20   66:3    76                       MOVEFRWD;
 12022  20   66:1    80           END;
 12023  20   66:1    96           IF NOT INITTURN THEN
 12024  20   66:2   102             BUMPWALL
 12025  20   66:0   102         END;  (* KICK *)
 12026  20   66:0   116         
 12027  20   66:0   116         
 12028  20   67:D     1       PROCEDURE DOTURN( MP01: INTEGER);  (* P010E43 *)
 12029  20   67:D     2       
 12030  20   67:0     0         BEGIN
 12031  20   67:1     0           NEEDDRMZ := TRUE;
 12032  20   67:1     4           DIRECTIO := (DIRECTIO + MP01) MOD 4
 12033  20   67:0     7         END;
 12034  20   67:0    24         
 12035  20   67:0    24         
 12036  20   68:D     1       PROCEDURE SETTIME;  (* P010E44 *)
 12037  20   68:D     1       
 12038  20   68:D     1         VAR
 12039  20   68:D     1              TIMEVAL : INTEGER;
 12040  20   68:D     2              TIMESTR : STRING;
 12041  20   68:D    43       
 12042  20   69:D     1         PROCEDURE EXITTIME;  (* P010E45 *)
 12043  20   69:D     1         
 12044  20   69:0     0           BEGIN
 12045  20   69:1     0             DELWIN( TEMPWIN, TRUE);
 12046  20   69:1     7             EXIT( SETTIME)
 12047  20   69:0    11           END;
 12048  20   69:0    24           
 12049  20   69:0    24           
 12050  20   68:0     0         BEGIN  (* SETTIME *)
 12051  20   68:1     0           UNITCLEAR( 1);
 12052  20   68:1     3           TEMPWIN := GETWIN( 0, 10, 40, 3, 15, TRUE);
 12053  20   68:1    17           PRINTSTR( TEMPWIN, 'NEW DELAY (1-9999) >');
 12054  20   68:1    46           GETSTR( TEMPWIN, TIMESTR, 4);
 12055  20   68:1    55           TIMEVAL := 0;
 12056  20   68:1    58           IF LENGTH( TIMESTR) > 4 THEN
 12057  20   68:2    66             EXITTIME;
 12058  20   68:1    68           FOR BASE04 := 1 TO LENGTH( TIMESTR) DO
 12059  20   68:2    83             IF (TIMESTR[ BASE04] >= '0') AND
 12060  20   68:2    89                (TIMESTR[ BASE04] <= '9') THEN
 12061  20   68:3    98               TIMEVAL := 10 * TIMEVAL + ORD( TIMESTR[ BASE04]) - ORD( '0')
 12062  20   68:2   107             ELSE
 12063  20   68:3   112               EXITTIME;
 12064  20   68:1   121           IF (TIMEVAL > 0) AND
 12065  20   68:1   124              (TIMEVAL <= 9999) THEN
 12066  20   68:2   132                TIMEDLAY := TIMEVAL;
 12067  20   68:1   136           EXITTIME
 12068  20   68:0   136         END;  (* SETTIME *)
 12069  20   68:0   152         
 12070  20   68:0   152         
 12071  20   70:D     1       PROCEDURE RUNINIT;  (* P010E46 *)
 12072  20   70:D     1       
 12073  20   70:0     0         BEGIN
 12074  20   70:1     0           CSIOWIN := GETWIN( 0, 0, 40, 3, 10, FALSE);
 12075  20   70:1    14           LPIWIN := GETWIN( 14, 2, 12, 5, 11, FALSE);
 12076  20   70:1    28           PROTWIN( LPIWIN, FALSE);
 12077  20   70:1    35           IF INFOWOFF THEN
 12078  20   70:2    40             BEGIN
 12079  20   70:3    40               PROTWIN( CSIOWIN, FALSE);
 12080  20   70:3    47               PROTWIN( CHARSWIN, FALSE)
 12081  20   70:2    51             END
 12082  20   70:1    54           ELSE
 12083  20   70:2    56             BEGIN
 12084  20   70:3    56               UNPROWIN( CSIOWIN, FALSE);
 12085  20   70:3    63               UNPROWIN( CHARSWIN, FALSE)
 12086  20   70:2    67             END;
 12087  20   70:1    70           PRINTSTR( CSIOWIN, 'C)AMP S)TATUS I)NSPECT O)FF   A-W-D  K');
 12088  20   70:1   117           PRSTATS;
 12089  20   70:1   119           DRAWSCR( WINCHAIN);
 12090  20   70:1   125           NEEDDRMZ := TRUE;
 12091  20   70:1   129           INITTURN := TRUE;
 12092  20   70:1   133           UNITCLEAR( 1)
 12093  20   70:0   134         END;  (* RUNINIT *)
 12094  20   70:0   148     
 12095  20   70:0   148     
 12096  20   47:0     0       BEGIN (* RUNMAIN *)
 12097  20   47:1     0         RUNINIT;
 12098  20   47:1     2         REPEAT
 12099  20   47:2     2           IF (NOT INFOWOFF) AND
 12100  20   47:2     6              ( (ABS( LIGHT) + ABS( ACMOD2) + ABS( IDMONSTR)) > 0) THEN
 12101  20   47:3    25             BEGIN
 12102  20   47:4    25               UNPROWIN( LPIWIN, FALSE);
 12103  20   47:4    32               MVCURSOR( LPIWIN, 0, 0);
 12104  20   47:4    40               
 12105  20   47:4    40               IF LIGHT > 0 THEN
 12106  20   47:5    47                 CENTSTR( LPIWIN, 'LIGHT')
 12107  20   47:4    58               ELSE
 12108  20   47:5    63                 CENTSTR( LPIWIN, '     ');
 12109  20   47:5    77                 
 12110  20   47:4    77               IF ACMOD2 > 0 THEN
 12111  20   47:5    84                 CENTSTR( LPIWIN, 'PROTECT')
 12112  20   47:4    97               ELSE
 12113  20   47:5   102                 CENTSTR( LPIWIN, '       ');
 12114  20   47:5   118                 
 12115  20   47:4   118               IF IDMONSTR > 0 THEN
 12116  20   47:5   125                 CENTSTR( LPIWIN, 'IDENTIFY')
 12117  20   47:4   139               ELSE
 12118  20   47:5   144                 CENTSTR( LPIWIN, '        ')
 12119  20   47:3   158             END
 12120  20   47:2   161           ELSE
 12121  20   47:3   163             PROTWIN( LPIWIN, FALSE);
 12122  20   47:2   170           IF NEEDDRMZ THEN
 12123  20   47:3   175             DRAWMAZE;
 12124  20   47:2   177           IF MAZE.SQRETYPE[ MAZE.SQREXTRA[ MAZEX][ MAZEY]] <> NORMAL THEN
 12125  20   47:3   201             IF XGOTO2 <> XSCNMSG THEN
 12126  20   47:4   208               IF INITTURN THEN
 12127  20   47:5   213                 SPECSQAR;
 12128  20   47:2   215           XGOTO2 := XRUNNER;
 12129  20   47:2   219           NEEDDRMZ := FALSE;
 12130  20   47:2   223           
 12131  20   47:2   223           IF (((RANDOM MOD 99) = 35)      OR
 12132  20   47:2   232               (CHSTALRM = 1)              OR
 12133  20   47:2   238               (FIGHTMAP[ MAZEX][ MAZEY])) OR
 12134  20   47:2   250              
 12135  20   47:2   250              (INITTURN AND (INCHAR = CHR( 75)) AND
 12136  20   47:2   257              (MAZE.FIGHTS[ MAZEX][ MAZEY] = 1)) AND
 12137  20   47:2   272              ((RANDOM MOD 8) = 3)
 12138  20   47:2   281           THEN
 12139  20   47:3   285             ENCOUNTR;
 12140  20   47:3   287             
 12141  20   47:2   287           IF INITTURN THEN
 12142  20   47:3   292             UPDATEHP;
 12143  20   47:2   294           INITTURN := FALSE;
 12144  20   47:2   298           IF NOT CHKKEYBD THEN
 12145  20   47:3   306             IF BKEYPRES THEN
 12146  20   47:4   311               FLSHNDRW
 12147  20   47:3   311             ELSE
 12148  20   47:4   315               DRAWSCR( WINCHAIN);
 12149  20   47:2   321           IF INFOWOFF THEN
 12150  20   47:3   326             PROTWIN( CHARSWIN, FALSE);
 12151  20   47:2   333           GETKEY;
 12152  20   47:2   336           CASE INCHAR OF
 12153  20   47:2   339           
 12154  20   47:2   339             'O':
 12155  20   47:3   339                        IF INFOWOFF THEN
 12156  20   47:4   344                          BEGIN
 12157  20   47:5   344                            UNPROWIN( CSIOWIN, FALSE);
 12158  20   47:5   351                            UNPROWIN( CHARSWIN, TRUE);
 12159  20   47:5   358                            PRSTATS;
 12160  20   47:5   360                            INFOWOFF := FALSE;
 12161  20   47:5   364                            FLSHNDRW
 12162  20   47:4   364                          END
 12163  20   47:3   366                        ELSE
 12164  20   47:4   368                          BEGIN
 12165  20   47:5   368                            PROTWIN( CSIOWIN, FALSE);
 12166  20   47:5   375                            PROTWIN( CHARSWIN, FALSE);
 12167  20   47:5   382                            INFOWOFF := TRUE;
 12168  20   47:5   386                            FLSHNDRW
 12169  20   47:4   386                          END;
 12170  20   47:4   390                          
 12171  20   47:2   390             'F', 'W':
 12172  20   47:3   390                        FORWRD;
 12173  20   47:2   394             'A', 'L':
 12174  20   47:3   394                        DOTURN( 3);
 12175  20   47:2   399             'D', 'R':
 12176  20   47:3   399                        DOTURN( 1);
 12177  20   47:2   404             'K':
 12178  20   47:3   404                        KICK;
 12179  20   47:2   408             'S':
 12180  20   47:3   408                        PRSTATS;
 12181  20   47:2   412             'T':
 12182  20   47:3   412                        SETTIME;
 12183  20   47:2   416             'C':
 12184  20   47:3   416                        BEGIN
 12185  20   47:4   416                          DRAWSCRN( TRUE);
 12186  20   47:4   419                          XGOTO := XINSPCT2;
 12187  20   47:4   423                          EXIT( RUNNER)
 12188  20   47:3   427                        END;
 12189  20   47:2   429             'I':
 12190  20   47:3   429                        BEGIN
 12191  20   47:4   429                          DRAWSCRN( FALSE);
 12192  20   47:4   432                          XGOTO := XINSAREA;
 12193  20   47:4   436                          EXIT( RUNNER)
 12194  20   47:3   440                        END;
 12195  20   47:2   442           END
 12196  20   47:1   496         UNTIL FALSE
 12197  20   47:0   496       END;  (* RUNMAIN *)
 12198  20   47:0   516       
 12199  20   47:0   516       
 12200  20    1:0     0     BEGIN  (* RUNNER *)
 12201  20    1:1     0       BKEYPRES := FALSE;
 12202  20    1:1     3       MOVELEFT( IOCACHE[ GETREC( ZMAZE, MAZELEV - 1, SIZEOF( TMAZE))],
 12203  20    1:1    18                 MAZE,
 12204  20    1:1    21                 SIZEOF( TMAZE));
 12205  20    1:1    26       CLROOMFG( MAZEX, MAZEY);
 12206  20    1:1    30       UNITCLEAR( 1);
 12207  20    1:1    33       REPEAT
 12208  20    1:2    33         RUNMAIN
 12209  20    1:1    33       UNTIL FALSE
 12210  20    1:0    35     END;
 12211  20    1:0    52   
 12212  20    1:0    52 (*$I WIZ3C:RUNNER2   *)
 12213  20    1:0    52 
 12214  20    1:0    52 (* ---------- END SEGMENTS ---------------------- *)
 12215  20    1:0    52 
 12215  20    1:0    52 (*$I WIZ3A:WIZARDRY2.TEXT *)
 12216  20    1:0    52 
 12217   1    2:D     1   PROCEDURE PRINTBEL;  (* P010002 *)
 12218   1    2:D     1   
 12219   1    2:0     0     BEGIN
 12220   1    2:1     0       PRINTCHR( MAINWIN, CHR( 7))
 12221   1    2:0     4     END;
 12222   1    2:0    18 
 12223   1    2:0    18 
 12224   1    3:D     3   FUNCTION GETREC;  (* P010003 *)
 12225   1    3:D     6   
 12226   1    3:D     6     VAR
 12227   1    3:D     6          BUFFADDR : INTEGER;
 12228   1    3:D     7          DSKBLOCK : INTEGER;
 12229   1    3:D     8                         
 12230   1    3:0     0     BEGIN
 12231   1    3:1     0       DSKBLOCK := SCNTOC.BLOFF[ DATATYPE] +
 12232   1    3:1     7                   2 *  (DATAINDX DIV SCNTOC.RECPER2BL[ DATATYPE]);
 12233   1    3:1    21       BUFFADDR := DATASIZE * (DATAINDX MOD SCNTOC.RECPER2BL[ DATATYPE]);
 12234   1    3:1    34       IF CACHEBL <> DSKBLOCK THEN
 12235   1    3:2    41         BEGIN
 12236   1    3:3    41           IF CACHEWRI THEN
 12237   1    3:4    46             REPEAT
 12238   1    3:5    46               UNITWRITE( DRIVE1, IOCACHE, SIZEOF( IOCACHE),
 12239   1    3:5    54                          (CACHEBL + SCNTOCBL), 0)
 12240   1    3:4    64             UNTIL IORESULT = 0;
 12241   1    3:3    70           CACHEWRI := FALSE;
 12242   1    3:3    74           CACHEBL := DSKBLOCK;
 12243   1    3:3    78           REPEAT
 12244   1    3:4    78             UNITREAD( DRIVE1, IOCACHE, SIZEOF( IOCACHE),
 12245   1    3:4    86                       (CACHEBL + SCNTOCBL), 0)
 12246   1    3:3    96           UNTIL IORESULT = 0
 12247   1    3:2    98         END;
 12248   1    3:1   102       GETREC := BUFFADDR
 12249   1    3:0   102     END;
 12250   1    3:0   122          
 12251   1    3:0   122 
 12252   1    4:D     3   FUNCTION GETRECW;  (* P010004 *)
 12253   1    4:D     6                     
 12254   1    4:0     0     BEGIN
 12255   1    4:1     0       GETRECW := GETREC( DATATYPE, DATAINDX, DATASIZE);
 12256   1    4:1     9       CACHEWRI := TRUE
 12257   1    4:0     9     END;
 12258   1    4:0    26     
 12259   1    4:0    26     
 12260   1   41:D     1   PROCEDURE OVERUNDR( VAR FIRST:   INTEGER;   (* P010029 *)
 12261   1   41:D     2                       VAR SECOND:  INTEGER ); 
 12262   1   41:D     3                    
 12263   1   41:0     0     BEGIN
 12264   1   41:1     0       IF FIRST < 0 THEN
 12265   1   41:2     6         BEGIN
 12266   1   41:3     6           FIRST := FIRST + 10000;
 12267   1   41:3    14           SECOND := SECOND - 1
 12268   1   41:2    17         END
 12269   1   41:1    20       ELSE
 12270   1   41:2    22         IF FIRST >= 10000 THEN
 12271   1   41:3    30           BEGIN
 12272   1   41:4    30             FIRST := FIRST - 10000;
 12273   1   41:4    38             SECOND := SECOND + 1
 12274   1   41:3    41           END
 12275   1   41:0    44     END;
 12276   1   41:0    56 
 12277   1   41:0    56 
 12278   1    5:D     1   PROCEDURE ADDLONGS;  (* P010005 *)
 12279   1    5:D     3   
 12280   1    5:0     0     BEGIN
 12281   1    5:1     0       FIRST.LOW := FIRST.LOW + SECOND.LOW;
 12282   1    5:1     7       OVERUNDR( FIRST.LOW, FIRST.MID);
 12283   1    5:1    13       
 12284   1    5:1    13       FIRST.MID := FIRST.MID + SECOND.MID;
 12285   1    5:1    22       OVERUNDR( FIRST.MID, FIRST.HIGH);
 12286   1    5:1    30       
 12287   1    5:1    30       FIRST.HIGH := FIRST.HIGH + SECOND.HIGH;
 12288   1    5:1    39       IF FIRST.HIGH >= 10000 THEN
 12289   1    5:2    47         BEGIN
 12290   1    5:3    47           FIRST.HIGH := 9999;
 12291   1    5:3    54           FIRST.MID  := 9999;
 12292   1    5:3    61           FIRST.LOW  := 9999
 12293   1    5:2    62         END
 12294   1    5:0    66     END;
 12295   1    5:0    78     
 12296   1    5:0    78     
 12297   1    6:D     1   PROCEDURE SUBLONGS;  (* P010006 *)
 12298   1    6:D     3   
 12299   1    6:0     0     BEGIN
 12300   1    6:1     0       FIRST.LOW := FIRST.LOW - SECOND.LOW;
 12301   1    6:1     7       OVERUNDR( FIRST.LOW, FIRST.MID);
 12302   1    6:1    13       
 12303   1    6:1    13       FIRST.MID := FIRST.MID - SECOND.MID;
 12304   1    6:1    22       OVERUNDR( FIRST.MID, FIRST.HIGH);
 12305   1    6:1    30       
 12306   1    6:1    30       FIRST.HIGH := FIRST.HIGH - SECOND.HIGH;
 12307   1    6:1    39       IF FIRST.HIGH < 0 THEN
 12308   1    6:2    45         BEGIN
 12309   1    6:3    45           FIRST.HIGH := 0;
 12310   1    6:3    50           FIRST.MID  := 0;
 12311   1    6:3    55           FIRST.LOW  := 0
 12312   1    6:2    56         END
 12313   1    6:0    58     END;
 12314   1    6:0    70 
 12315   1    6:0    70 
 12316   1    8:D     1   PROCEDURE LONG2BCD;  (* P010008 *)
 12317   1    8:D     3   
 12318   1    8:D     3     VAR
 12319   1    8:D     3          DIGITX : INTEGER;
 12320   1    8:D     4   
 12321   1    8:D     4   
 12322   1   42:D     1     PROCEDURE INT2BCD( PARTLONG: INTEGER);  (* P01002A *)
 12323   1   42:D     2     
 12324   1   43:D     1       PROCEDURE PUTDIGIT( POWOF10: INTEGER);  (* P01002B *)
 12325   1   43:D     2       
 12326   1   43:0     0         BEGIN
 12327   1   43:1     0           BCDNUM[ DIGITX] := PARTLONG DIV POWOF10;
 12328   1   43:1    14           DIGITX := DIGITX + 1;
 12329   1   43:1    22           PARTLONG := PARTLONG MOD POWOF10
 12330   1   43:0    25         END;
 12331   1   43:0    42     
 12332   1   43:0    42     
 12333   1   42:0     0       BEGIN  (* INT2BCD *)
 12334   1   42:1     0         PUTDIGIT( 1000);
 12335   1   42:1     5         PUTDIGIT(  100);
 12336   1   42:1     8         PUTDIGIT(   10);
 12337   1   42:1    11         PUTDIGIT(    1)
 12338   1   42:0    12       END;   (* INT2BCD *)
 12339   1   42:0    26       
 12340   1   42:0    26       
 12341   1    8:0     0     BEGIN  (* LONG2BCD *)
 12342   1    8:1     0       BCDNUM[ 0] := 0;
 12343   1    8:1     6       DIGITX := 1;
 12344   1    8:1     9       INT2BCD( LONGNUM.HIGH);
 12345   1    8:1    13       INT2BCD( LONGNUM.MID);
 12346   1    8:1    17       INT2BCD( LONGNUM.LOW)
 12347   1    8:0    19     END;  (* LONG2BCD *)
 12348   1    8:0    34 
 12349   1    8:0    34 
 12350   1    7:D     1   PROCEDURE BCD2LONG;  (* P010007 *)
 12351   1    7:D     3   
 12352   1    7:D     3     VAR
 12353   1    7:D     3          DIGITX : INTEGER;
 12354   1    7:D     4   
 12355   1    7:D     4   
 12356   1   44:D     1     PROCEDURE BCD2INT( VAR LONGPART: INTEGER);  (* P01002C *)
 12357   1   44:D     2   
 12358   1   45:D     1       PROCEDURE GETDIGIT;  (* P01002D *)
 12359   1   45:D     1       
 12360   1   45:0     0         BEGIN
 12361   1   45:1     0           LONGPART := (10 * LONGPART) + BCDNUM[ DIGITX];
 12362   1   45:1    20           DIGITX := DIGITX + 1
 12363   1   45:0    23         END;
 12364   1   45:0    40         
 12365   1   45:0    40         
 12366   1   44:0     0       BEGIN  (* BCD2INT *)
 12367   1   44:1     0         LONGPART := 0;
 12368   1   44:1     3         GETDIGIT;
 12369   1   44:1     5         GETDIGIT;
 12370   1   44:1     7         GETDIGIT;
 12371   1   44:1     9         GETDIGIT
 12372   1   44:0     9       END;
 12373   1   44:0    24       
 12374   1   44:0    24       
 12375   1    7:0     0     BEGIN  (* BCD2LONG *)
 12376   1    7:1     0       FILLCHAR( LONGNUM, 6, 0);
 12377   1    7:1     6       DIGITX := 1;
 12378   1    7:1     9       BCD2INT( LONGNUM.HIGH);
 12379   1    7:1    14       BCD2INT( LONGNUM.MID);
 12380   1    7:1    19       BCD2INT( LONGNUM.LOW)
 12381   1    7:0    20     END;  (* BCD2LONG *)
 12382   1    7:0    34 
 12383   1    7:0    34 
 12384   1    9:D     1   PROCEDURE MULTLONG;  (* P010009 *)
 12385   1    9:D     3   
 12386   1    9:D     3     VAR
 12387   1    9:D     3          UNUSEDXX : INTEGER;
 12388   1    9:D     4          UNUSEDYY : INTEGER;
 12389   1    9:D     5          DIGITX   : INTEGER;
 12390   1    9:D     6          BCDNUM   : TBCD;
 12391   1    9:D    20          
 12392   1    9:0     0     BEGIN
 12393   1    9:1     0       LONG2BCD( LONGNUM, BCDNUM);
 12394   1    9:1     5       FOR DIGITX := 12 DOWNTO 1 DO
 12395   1    9:2    17         BCDNUM[ DIGITX] := BCDNUM[ DIGITX] * INTNUM;
 12396   1    9:1    39       FOR DIGITX := 12 DOWNTO 1 DO
 12397   1    9:2    51         IF BCDNUM[ DIGITX] > 9 THEN
 12398   1    9:3    61           BEGIN
 12399   1    9:4    61             BCDNUM[ DIGITX - 1] := BCDNUM[ DIGITX - 1] +
 12400   1    9:4    76                                    BCDNUM[ DIGITX] DIV 10;
 12401   1    9:4    86             BCDNUM[ DIGITX] := BCDNUM[ DIGITX] MOD 10
 12402   1    9:3    97           END;
 12403   1    9:1   107       BCD2LONG( LONGNUM, BCDNUM)
 12404   1    9:0   110     END;  (* MULTLONG *)
 12405   1    9:0   128 
 12406   1    9:0   128 
 12407   1   10:D     1   PROCEDURE DIVLONG;  (* P01000A *)
 12408   1   10:D     3 
 12409   1   10:D     3     VAR
 12410   1   10:D     3          NXTDIGIT : INTEGER;
 12411   1   10:D     4          DIGITX   : INTEGER;
 12412   1   10:D     5          BCDNUM   : TBCD;
 12413   1   10:D    19 
 12414   1   10:0     0     BEGIN
 12415   1   10:1     0       LONG2BCD( LONGNUM, BCDNUM);
 12416   1   10:1     5       FOR DIGITX := 1 TO 12 DO
 12417   1   10:2    17         BEGIN
 12418   1   10:3    17           NXTDIGIT := BCDNUM[ DIGITX] DIV INTNUM;
 12419   1   10:3    28           BCDNUM[ DIGITX + 1] := BCDNUM[ DIGITX + 1] + 
 12420   1   10:3    43                                  (10 * (BCDNUM[ DIGITX] - NXTDIGIT * INTNUM));
 12421   1   10:3    58           BCDNUM[ DIGITX] := NXTDIGIT
 12422   1   10:2    63         END;
 12423   1   10:1    72       BCD2LONG( LONGNUM, BCDNUM)
 12424   1   10:0    75     END;  (* DIVLONG *)
 12425   1   10:0    92 
 12426   1   10:0    92 
 12427   1   11:D     3   FUNCTION TESTLONG;  (* P01000B *)
 12428   1   11:D    11                     
 12429   1   46:D     1     PROCEDURE LTEQGT( FIRSTX:  INTEGER;  (* P01002E *)
 12430   1   46:D     2                       SECONDX: INTEGER);
 12431   1   46:D     3     
 12432   1   46:0     0       BEGIN
 12433   1   46:1     0         IF FIRSTX = SECONDX THEN
 12434   1   46:2     5           EXIT( LTEQGT)
 12435   1   46:1     9         ELSE
 12436   1   46:2    11           BEGIN
 12437   1   46:3    11             IF FIRSTX > SECONDX THEN
 12438   1   46:4    16               TESTLONG := 1
 12439   1   46:3    16             ELSE
 12440   1   46:4    22               TESTLONG := -1
 12441   1   46:2    22           END;
 12442   1   46:1    27         EXIT( TESTLONG)
 12443   1   46:0    31       END; (* LTEQGT *)
 12444   1   46:0    44       
 12445   1   46:0    44   
 12446   1   11:0     0     BEGIN  (* TESTLONG *)
 12447   1   11:1     0       LTEQGT( FIRST.HIGH, SECOND.HIGH);
 12448   1   11:1    14       LTEQGT( FIRST.MID,  SECOND.MID);
 12449   1   11:1    18       LTEQGT( FIRST.LOW,  SECOND.LOW);
 12450   1   11:1    22       TESTLONG := 0
 12451   1   11:0    22     END;
 12452   1   11:0    38 
 12453   1   11:0    38 
 12454   1   12:D     1   PROCEDURE PRNTLONG;  (* P01000C *)
 12455   1   12:D     6                      
 12456   1   12:D     6     VAR
 12457   1   12:D     6          BCDNUM   : TBCD;
 12458   1   12:D    20          NONSPCX  : INTEGER;
 12459   1   12:D    21          LEADSPCX : INTEGER;
 12460   1   12:D    22   
 12461   1   12:0     0     BEGIN
 12462   1   12:1     0       LONG2BCD( LONGNUM, BCDNUM);
 12463   1   12:1    11       LEADSPCX := 1;
 12464   1   12:1    14       WHILE (LEADSPCX < 12) AND (BCDNUM[ LEADSPCX] = 0) DO
 12465   1   12:2    30         BEGIN
 12466   1   12:3    30           LEADSPCX := LEADSPCX + 1;
 12467   1   12:3    36           PRINTCHR( PRNTWIN, ' ')
 12468   1   12:2    38         END;
 12469   1   12:1    42       FOR NONSPCX := LEADSPCX TO 12 DO
 12470   1   12:2    56         PRINTCHR( PRNTWIN, CHR( (ORD( '0') + BCDNUM[ NONSPCX])))
 12471   1   12:0    66     END;  (* PRNTLONG *)
 12472   1   12:0    92 
 12473   1   12:0    92 
 12474   1   13:D     1   PROCEDURE GETKEY;  (* P01000D *)
 12475   1   13:D     1   
 12476   1   13:D     1     CONST
 12477   1   13:D     1          SYSTERM = 2;
 12478   1   13:D     1          
 12479   1   13:D     1     VAR
 12480   1   13:D     1          INBUF : PACKED ARRAY[ 0..1] OF CHAR;
 12481   1   13:D     2          RANDX : INTEGER;
 12482   1   13:D     3   
 12483   1   13:0     0     BEGIN
 12484   1   13:1     0       WHILE  NOT CHKKEYBD DO
 12485   1   13:2     7         RANDX := RANDOM;
 12486   1   13:1    15       UNITREAD( SYSTERM, INBUF, 1, 0, 0);
 12487   1   13:1    24       INCHAR := INBUF[ 0];
 12488   1   13:1    30       WHILE INCHAR > CHR( 95)  DO
 12489   1   13:2    35         INCHAR := CHR ( ORD( INCHAR) - ORD( ' '));
 12490   1   13:1    42       IF EOLN THEN
 12491   1   13:2    52         INCHAR := CHR( CRETURN)
 12492   1   13:0    53     END;
 12493   1   13:0    72 
 12494   1   13:0    72 
 12495   1   14:D     1   PROCEDURE GETCR;  (* P01000E *)
 12496   1   14:D     1   
 12497   1   14:0     0     BEGIN
 12498   1   14:1     0       REPEAT
 12499   1   14:2     0         GETKEY
 12500   1   14:1     0       UNTIL INCHAR = CHR( CRETURN)
 12501   1   14:0     4     END;
 12502   1   14:0    22   
 12503   1   14:0    22   
 12504   1   16:D     1   PROCEDURE PAUSE1;  (* P010010 *)
 12505   1   16:D     1   
 12506   1   16:D     1     VAR
 12507   1   16:D     1          TIMEAMT : INTEGER;
 12508   1   16:D     2   
 12509   1   16:0     0     BEGIN
 12510   1   16:1     0       BASE04 := 0;
 12511   1   16:1     3       TIMEAMT := TIMEDLAY;
 12512   1   16:1     8       WHILE BASE04 <= TIMEAMT DO
 12513   1   16:2    13         BASE04 := BASE04 + 1
 12514   1   16:0    14     END;
 12515   1   16:0    34   
 12516   1   16:0    34   
 12517   1   17:D     1   PROCEDURE PAUSE2;  (* P010011 *)
 12518   1   17:D     1   
 12519   1   17:D     1     VAR
 12520   1   17:D     1          TIMEAMT : INTEGER;
 12521   1   17:D     2        
 12522   1   17:0     0     BEGIN
 12523   1   17:1     0       BASE04 := 0;
 12524   1   17:1     3       TIMEAMT := 3000;
 12525   1   17:1     8       WHILE BASE04 <= TIMEAMT DO
 12526   1   17:2    13         BASE04 := BASE04 + 1
 12527   1   17:0    14     END;
 12528   1   17:0    34 
 12529   1   17:0    34 
 12530   1   15:D     1   PROCEDURE CENTSTR;  (* P01000F *)
 12531   1   15:D    44                           
 12532   1   15:0     0     BEGIN
 12533   1   15:1     0       MVCURSOR( CENTWIN,
 12534   1   15:1     6                 ((CENTWIN^.HEAD.HSIZE - 2) DIV 2) - (LENGTH( ASTRING) DIV 2),
 12535   1   15:1    23                 CENTWIN^.HEAD.VCURSOR);
 12536   1   15:1    31       PRINTSTR( CENTWIN, ASTRING);
 12537   1   15:1    36       PRINTCR( CENTWIN)
 12538   1   15:0    37     END;
 12539   1   15:0    52 
 12540   1   15:0    52 
 12541   1   34:D     1   PROCEDURE GARBMEM;  (* P010022 *)
 12542   1   34:D     1   
 12543   1   34:D     1     VAR
 12544   1   34:D     1          CHAIN2   : ^TMEMORY;
 12545   1   34:D     2          B4NOTINU : ^TMEMORY;
 12546   1   34:D     3          CHAINPTR : ^TMEMORY;
 12547   1   34:D     4   
 12548   1   34:0     0     BEGIN
 12549   1   34:1     0       DOGARBMM := FALSE;
 12550   1   34:1     4       CHAINPTR := MEMHEAD;
 12551   1   34:1     9       B4NOTINU := NIL;
 12552   1   34:1    12       WHILE CHAINPTR <> NIL DO
 12553   1   34:2    17         BEGIN
 12554   1   34:3    17           IF NOT CHAINPTR^.INUSE THEN
 12555   1   34:4    26             BEGIN
 12556   1   34:5    26               IF CHAINPTR^.NEXT <> NIL THEN
 12557   1   34:6    32                 BEGIN
 12558   1   34:7    32                   CHAIN2 := CHAINPTR^.NEXT;
 12559   1   34:7    36                   WHILE (CHAIN2 <> NIL) AND (NOT CHAIN2^.INUSE) DO
 12560   1   34:8    49                     BEGIN
 12561   1   34:9    49                       CHAINPTR^.NEXT := CHAIN2^.NEXT;
 12562   1   34:9    53                       CHAINPTR^.SIZE := CHAINPTR^.SIZE + CHAIN2^.SIZE;
 12563   1   34:9    72                       CHAIN2 := CHAIN2^.NEXT
 12564   1   34:8    73                     END
 12565   1   34:6    76                 END;
 12566   1   34:5    78               IF CHAINPTR^.NEXT = NIL THEN
 12567   1   34:6    84                 BEGIN
 12568   1   34:7    84                   IF B4NOTINU = NIL THEN
 12569   1   34:8    89                     MEMHEAD := NIL
 12570   1   34:7    89                   ELSE
 12571   1   34:8    95                     B4NOTINU^.NEXT := NIL;
 12572   1   34:7    98                   RELEASE( CHAINPTR)
 12573   1   34:6   100                 END
 12574   1   34:4   102             END;
 12575   1   34:3   102           B4NOTINU := CHAINPTR;
 12576   1   34:3   105           CHAINPTR := CHAINPTR^.NEXT
 12577   1   34:2   106         END
 12578   1   34:0   109     END;
 12579   1   34:0   128 
 12580   1   34:0   128 
 12581   1   33:D     3   FUNCTION GETMEM;  (* P010021 *)
 12582   1   33:D     4 
 12583   1   33:D     4     VAR
 12584   1   33:D     4          SPLITBUF : ^TMEMORY;
 12585   1   33:D     5          MEMCHAIN : ^TMEMORY;
 12586   1   33:D     6          PTR2INT  : TMEMOVER;
 12587   1   33:D     7   
 12588   1   33:0     0     BEGIN
 12589   1   33:1     0       IF DOGARBMM THEN
 12590   1   33:2     5         GARBMEM;
 12591   1   33:1     7       MEMSIZE := MEMSIZE + SIZEOF( TMEMORY);
 12592   1   33:1    12       MEMCHAIN := MEMHEAD;
 12593   1   33:1    17       WHILE MEMCHAIN <> NIL DO
 12594   1   33:2    22         BEGIN
 12595   1   33:3    22           IF NOT MEMCHAIN^.INUSE THEN
 12596   1   33:4    31             IF MEMCHAIN^.SIZE >= MEMSIZE THEN
 12597   1   33:5    41               BEGIN
 12598   1   33:6    41                 IF (MEMCHAIN^.SIZE - MEMSIZE) > SIZEOF( TMEMORY) THEN
 12599   1   33:7    53                   BEGIN
 12600   1   33:8    53                     PTR2INT.PMEM := MEMCHAIN;
 12601   1   33:8    56                     PTR2INT.I := PTR2INT.I + MEMSIZE;
 12602   1   33:8    61                     SPLITBUF := PTR2INT.PMEM;
 12603   1   33:8    64                     SPLITBUF^.NEXT := MEMCHAIN^.NEXT;
 12604   1   33:8    68                     SPLITBUF^.SIZE := MEMCHAIN^.SIZE - MEMSIZE;
 12605   1   33:8    82                     SPLITBUF^.INUSE := FALSE;
 12606   1   33:8    89                     MEMCHAIN^.SIZE := MEMSIZE;
 12607   1   33:8    96                     MEMCHAIN^.NEXT := SPLITBUF;
 12608   1   33:7    99                   END;
 12609   1   33:6    99                 MEMCHAIN^.INUSE := TRUE;
 12610   1   33:6   106                 PTR2INT.PMEM := MEMCHAIN;
 12611   1   33:6   109                 BASE5CB.I := PTR2INT.I + SIZEOF( TMEMORY);
 12612   1   33:6   115                 GETMEM := BASE5CB.I;
 12613   1   33:6   120                 EXIT( GETMEM)
 12614   1   33:5   124               END;
 12615   1   33:3   124               SPLITBUF := MEMCHAIN;
 12616   1   33:3   127               MEMCHAIN := MEMCHAIN^.NEXT
 12617   1   33:2   128         END;
 12618   1   33:2   133             
 12619   1   33:1   133       MARK( MEMCHAIN);
 12620   1   33:1   137       IF MEMHEAD = NIL THEN
 12621   1   33:2   144         MEMHEAD := MEMCHAIN
 12622   1   33:1   144       ELSE
 12623   1   33:2   150         SPLITBUF^.NEXT := MEMCHAIN;
 12624   1   33:1   153       MEMCHAIN^.NEXT := NIL;
 12625   1   33:1   156       MEMCHAIN^.SIZE := MEMSIZE;
 12626   1   33:1   163       MEMCHAIN^.INUSE := TRUE;
 12627   1   33:1   170       PTR2INT.PMEM := MEMCHAIN;
 12628   1   33:1   173       BASE5CB.I := PTR2INT.I + SIZEOF( TMEMORY);
 12629   1   33:1   179       GETMEM := BASE5CB.I;
 12630   1   33:1   184       PTR2INT.I := PTR2INT.I + MEMSIZE;
 12631   1   33:1   189       RELEASE( PTR2INT.PMEM);
 12632   1   33:1   193       IF MEMAVAIL < 1000 THEN
 12633   1   33:2   201         RINGBELL
 12634   1   33:0   201   END;
 12635   1   33:0   218 
 12636   1   33:0   218 
 12637   1   35:D     1   PROCEDURE RELMEM;  (* P010023 *)
 12638   1   35:D     2 
 12639   1   35:D     2     VAR
 12640   1   35:D     2          BUFHEAD  : TMEMORYP;
 12641   1   35:D     3          CHAINPTR : TMEMORYP;
 12642   1   35:D     4          PTR2INT  : TMEMOVER;
 12643   1   35:D     5 
 12644   1   35:0     0     BEGIN
 12645   1   35:1     0       IF MEMHEAD = NIL THEN
 12646   1   35:2     7         EXIT( RELMEM);
 12647   1   35:1    11       CHAINPTR := MEMHEAD;
 12648   1   35:1    16       BASE5CB.PWIN := RELWIN;
 12649   1   35:1    20       PTR2INT.I := BASE5CB.I - SIZEOF( TMEMORY);
 12650   1   35:1    27       BUFHEAD := PTR2INT.PMEM;
 12651   1   35:1    30       WHILE CHAINPTR <> BUFHEAD DO
 12652   1   35:2    35         BEGIN
 12653   1   35:3    35           CHAINPTR := CHAINPTR^.NEXT;
 12654   1   35:3    39           IF CHAINPTR = NIL THEN
 12655   1   35:4    44             EXIT( RELMEM)
 12656   1   35:2    48         END;
 12657   1   35:1    50       CHAINPTR^.INUSE := FALSE;
 12658   1   35:1    57       DOGARBMM := TRUE
 12659   1   35:0    57     END;
 12660   1   35:0    76   
 12661   1   35:0    76 
 12662   1   30:D     1   PROCEDURE RINGBELL;
 12663   1   30:D     1 
 12664   1   30:D     1     VAR
 12665   1   30:D     1          UNUSEDXX : INTEGER;
 12666   1   30:D     2   
 12667   1   30:0     0     BEGIN
 12668   1   30:1     0       PRINTCHR( MAINWIN, CHR( 11))
 12669   1   30:0     4     END;
 12670   1   30:0    18     
 12671   1   30:0    18     
 12672   1   18:D     3   FUNCTION GETWIN;  (* P010012 *)
 12673   1   18:D     9 
 12674   1   18:D     9     VAR
 12675   1   18:D     9          NEWWIN  : TMEMOVER;
 12676   1   18:D    10          BUFSIZE : INTEGER;
 12677   1   18:D    11   
 12678   1   18:0     0     BEGIN
 12679   1   18:1     0       BUFSIZE := SIZEOF( TWINHEAD) + (HSIZE - 2) * (VSIZE - 2);
 12680   1   18:1    11       NEWWIN.I := GETMEM( BUFSIZE);
 12681   1   18:1    18       IF NEWWIN.PWIN <> NIL THEN
 12682   1   18:2    23         BEGIN
 12683   1   18:3    23           NEWWIN.PWIN^.HEAD.NEXTW := WINCHAIN;
 12684   1   18:3    28           WINCHAIN := NEWWIN.PWIN;
 12685   1   18:3    32           NEWWIN.PWIN^.HEAD.HPOS := HPOS;
 12686   1   18:3    39           NEWWIN.PWIN^.HEAD.VPOS := VPOS;
 12687   1   18:3    46           NEWWIN.PWIN^.HEAD.HSIZE := HSIZE;
 12688   1   18:3    53           NEWWIN.PWIN^.HEAD.VSIZE := VSIZE;
 12689   1   18:3    60           NEWWIN.PWIN^.HEAD.HCURSOR := 0;
 12690   1   18:3    67           NEWWIN.PWIN^.HEAD.VCURSOR := 0;
 12691   1   18:3    74           NEWWIN.PWIN^.HEAD.PRIORITY := PRIORITY;
 12692   1   18:3    81           FILLCHAR( NEWWIN.PWIN^.DATA, BUFSIZE - SIZEOF( TWINHEAD), '@');
 12693   1   18:3    91           IF SHOW THEN
 12694   1   18:4    94             DRAWSCR( WINCHAIN)
 12695   1   18:2    97         END
 12696   1   18:1    99       ELSE
 12697   1   18:2   101         BEGIN
 12698   1   18:3   101           NEWWIN.PWIN := NIL;
 12699   1   18:3   104           RINGBELL
 12700   1   18:2   104         END;
 12701   1   18:1   106       GETWIN := NEWWIN.PWIN
 12702   1   18:0   106     END;
 12703   1   18:0   122 
 12704   1   18:0   122 
 12705   1   19:D     1   PROCEDURE DELWIN;  (* P010013 *)
 12706   1   19:D     3   
 12707   1   19:D     3     VAR
 12708   1   19:D     3          CHAINPTR : TWINDOWP;
 12709   1   19:D     4   
 12710   1   19:0     0     BEGIN
 12711   1   19:1     0       IF WINCHAIN = NIL THEN
 12712   1   19:2     7         EXIT( DELWIN)
 12713   1   19:1    11       ELSE
 12714   1   19:2    13         IF WIN2DEL = WINCHAIN THEN
 12715   1   19:3    21           WINCHAIN := WINCHAIN^.HEAD.NEXTW
 12716   1   19:2    24         ELSE
 12717   1   19:3    30           BEGIN
 12718   1   19:4    30             CHAINPTR := WINCHAIN;
 12719   1   19:4    35             WHILE CHAINPTR^.HEAD.NEXTW <> WIN2DEL DO
 12720   1   19:5    42               BEGIN
 12721   1   19:6    42                 CHAINPTR := CHAINPTR^.HEAD.NEXTW;
 12722   1   19:6    46                 IF CHAINPTR = NIL THEN
 12723   1   19:7    51                   EXIT( DELWIN)
 12724   1   19:5    55               END;
 12725   1   19:4    57             CHAINPTR^.HEAD.NEXTW := WIN2DEL^.HEAD.NEXTW;
 12726   1   19:3    62           END;
 12727   1   19:1    62       RELMEM( WIN2DEL);
 12728   1   19:1    66       WIN2DEL := NIL;
 12729   1   19:1    69       IF REDRAW THEN
 12730   1   19:2    72         DRAWSCR( WINCHAIN)
 12731   1   19:0    75     END;
 12732   1   19:0    92 
 12733   1   19:0    92 
 12734   1   20:D     1   PROCEDURE SETWNPRI;  (* P010014 *)
 12735   1   20:D     4   
 12736   1   20:0     0     BEGIN
 12737   1   20:1     0       PRIWIN^.HEAD.PRIORITY := PRIORITY;
 12738   1   20:1     7       IF REDRAW THEN
 12739   1   20:2    10         DRAWSCR( WINCHAIN)
 12740   1   20:0    13     END;
 12741   1   20:0    28 
 12742   1   20:0    28   
 12743   1   26:D     1   PROCEDURE CLEARWIN;  (* P01001A *)
 12744   1   26:D     3                            
 12745   1   26:0     0     BEGIN
 12746   1   26:1     0       FILLCHAR( CLRWIN^.DATA,
 12747   1   26:1     4                 (CLRWIN^.HEAD.HSIZE - 2) * (CLRWIN^.HEAD.VSIZE - 2),
 12748   1   26:1    21                 '@');
 12749   1   26:1    24       CLRWIN^.HEAD.HCURSOR := 0;
 12750   1   26:1    31       CLRWIN^.HEAD.VCURSOR := 0;
 12751   1   26:1    38       IF REDRAW THEN
 12752   1   26:2    41         DRAWSCR( WINCHAIN)
 12753   1   26:0    44     END;
 12754   1   26:0    58                            
 12755   1   26:0    58     
 12756   1   27:D     1   PROCEDURE CLRRECT;  (* P01001B *)
 12757   1   27:D     6 
 12758   1   27:D     6     VAR
 12759   1   27:D     6          VCLR    : INTEGER;
 12760   1   27:D     7          HCLR    : INTEGER;
 12761   1   27:D     8          SVVCURS : INTEGER;
 12762   1   27:D     9          SVHCURS : INTEGER;
 12763   1   27:D    10        
 12764   1   27:D    10        
 12765   1   47:D     1     PROCEDURE ADJUSTHV(     ADJWIN: TWINDOWP;
 12766   1   47:D     2                         VAR HPOS:   INTEGER;
 12767   1   47:D     3                         VAR VPOS:   INTEGER);
 12768   1   47:D     4     
 12769   1   47:0     0       BEGIN
 12770   1   47:1     0         IF HPOS < 0 THEN
 12771   1   47:2     6           HPOS := 0
 12772   1   47:1     7         ELSE
 12773   1   47:2    11           IF HPOS > (ADJWIN^.HEAD.HSIZE - 3) THEN
 12774   1   47:3    24             HPOS := ADJWIN^.HEAD.HSIZE - 3;
 12775   1   47:3    34             
 12776   1   47:1    34         IF VPOS < 0 THEN
 12777   1   47:2    40           VPOS := 0
 12778   1   47:1    41         ELSE
 12779   1   47:2    45           IF VPOS > (ADJWIN^.HEAD.VSIZE - 3) THEN
 12780   1   47:3    58             VPOS := ADJWIN^.HEAD.VSIZE - 3
 12781   1   47:0    65       END;  (* ADJUSTHV *)
 12782   1   47:0    80   
 12783   1   47:0    80 
 12784   1   27:0     0     BEGIN (* CLRRECT *)
 12785   1   27:1     0       SVHCURS := CLRWIN^.HEAD.HCURSOR;
 12786   1   27:1     8       SVVCURS := CLRWIN^.HEAD.VCURSOR;
 12787   1   27:1    16       ADJUSTHV( CLRWIN, HOR1, VER1);
 12788   1   27:1    23       HOR2 := HOR1 + HOR2 - 1;
 12789   1   27:1    30       VER2 := VER1 + VER2 - 1;
 12790   1   27:1    37       ADJUSTHV( CLRWIN, HOR2, VER2);
 12791   1   27:1    44       FOR VCLR := VER1 TO VER2 DO
 12792   1   27:2    55         BEGIN
 12793   1   27:3    55           MVCURSOR( CLRWIN, HOR1, VCLR);
 12794   1   27:3    60           FOR HCLR := HOR1 TO HOR2 DO
 12795   1   27:4    71             PRINTCHR( CLRWIN, ' ')
 12796   1   27:2    73         END;
 12797   1   27:1    89       CLRWIN^.HEAD.HCURSOR := SVHCURS;
 12798   1   27:1    96       CLRWIN^.HEAD.VCURSOR := SVVCURS
 12799   1   27:0   101     END; (* CLRRECT *)
 12800   1   27:0   120 
 12801   1   27:0   120 
 12802   1   28:D     1   PROCEDURE PROTWIN;  (* P01001C *)
 12803   1   28:D     3 
 12804   1   28:0     0     BEGIN
 12805   1   28:1     0       PROTWIN^.HEAD.PRIORITY := 128 + (PROTWIN^.HEAD.PRIORITY MOD 128);
 12806   1   28:1    20       IF REDRAW THEN
 12807   1   28:2    23         DRAWSCR( WINCHAIN)
 12808   1   28:0    26     END;
 12809   1   28:0    40 
 12810   1   28:0    40 
 12811   1   29:D     1   PROCEDURE UNPROWIN;  (* P01001D *)
 12812   1   29:D     3 
 12813   1   29:0     0     BEGIN
 12814   1   29:1     0       UNPROWIN^.HEAD.PRIORITY := UNPROWIN^.HEAD.PRIORITY MOD 128;
 12815   1   29:1    16       IF REDRAW THEN
 12816   1   29:2    19         DRAWSCR( WINCHAIN)
 12817   1   29:0    22     END;
 12818   1   29:0    36 
 12819   1   29:0    36 
 12820   1   21:D     1   PROCEDURE MVCURSOR;  (* P010015 *)
 12821   1   21:D     4   
 12822   1   21:0     0     BEGIN
 12823   1   21:1     0       IF HPOS < 0 THEN
 12824   1   21:2     5         HPOS := 0
 12825   1   21:1     5       ELSE
 12826   1   21:2    10         IF HPOS >= MVWIN^.HEAD.HSIZE - 2 THEN
 12827   1   21:3    22           BEGIN
 12828   1   21:4    22             HPOS := 0;
 12829   1   21:4    25             VPOS := VPOS + 1;
 12830   1   21:3    30           END;
 12831   1   21:1    30       IF VPOS < 0 THEN
 12832   1   21:2    35         VPOS := 0
 12833   1   21:1    35       ELSE
 12834   1   21:2    40         IF VPOS >= MVWIN^.HEAD.VSIZE - 2 THEN
 12835   1   21:3    52           VPOS := 0;
 12836   1   21:1    55       MVWIN^.HEAD.HCURSOR := HPOS;
 12837   1   21:1    62       MVWIN^.HEAD.VCURSOR := VPOS
 12838   1   21:0    67     END;
 12839   1   21:0    82     
 12840   1   21:0    82 
 12841   1   22:D     1   PROCEDURE PRINTCHR;  (* P010016 *)
 12842   1   22:D     3   
 12843   1   22:0     0     BEGIN
 12844   1   22:1     0       PRPICCH( PRWIN, ACHAR)
 12845   1   22:0     2     END;
 12846   1   22:0    16 
 12847   1   22:0    16 
 12848   1   23:D     1   PROCEDURE PRINTSTR;  (* P010017 *)
 12849   1   23:D    44   
 12850   1   23:D    44     VAR
 12851   1   23:D    44          X : INTEGER;
 12852   1   23:D    45   
 12853   1   23:0     0     BEGIN
 12854   1   23:1     0       FOR X := 1 TO LENGTH( ASTRING) DO
 12855   1   23:2    21         PRPICCH( PRWIN, ASTRING[ X])
 12856   1   23:0    27     END;
 12857   1   23:0    52 
 12858   1   23:0    52 
 12859   1   24:D     1   PROCEDURE PRINTNUM;  (* P010018 *)
 12860   1   24:D     4                             
 12861   1   24:D     4     VAR
 12862   1   24:D     4          DIGITCNT : INTEGER;
 12863   1   24:D     5          STRNUM   : ARRAY[ 0..39] OF CHAR;
 12864   1   24:D    45                    
 12865   1   24:0     0     BEGIN
 12866   1   24:1     0       IF ANUM < 0 THEN
 12867   1   24:2     5         BEGIN
 12868   1   24:3     5           PRINTCHR( PRWIN, '-');
 12869   1   24:3     9           ANUM := ABS( ANUM);
 12870   1   24:3    13           FIELDSZ := FIELDSZ - 1
 12871   1   24:2    14         END;
 12872   1   24:1    18       FILLCHAR( STRNUM, 40, ' ');
 12873   1   24:1    25       DIGITCNT := 0;
 12874   1   24:1    28       STRNUM[ 0] := '0';
 12875   1   24:1    35       WHILE ANUM <> 0 DO
 12876   1   24:2    40         BEGIN
 12877   1   24:3    40           STRNUM[ DIGITCNT] := CHR( ORD( '0') + (ANUM MOD 10));
 12878   1   24:3    51           ANUM := ANUM DIV 10;
 12879   1   24:3    56           DIGITCNT := DIGITCNT + 1
 12880   1   24:2    57         END;
 12881   1   24:1    63       IF DIGITCNT > FIELDSZ THEN
 12882   1   24:2    68         FOR DIGITCNT := 0 TO FIELDSZ - 1 DO
 12883   1   24:3    82           STRNUM[ DIGITCNT] := '*';
 12884   1   24:1    96       FOR DIGITCNT := FIELDSZ - 1 DOWNTO 0 DO
 12885   1   24:2   110         PRPICCH( PRWIN, STRNUM[ DIGITCNT])
 12886   1   24:0   117     END;
 12887   1   24:0   144 
 12888   1   24:0   144 
 12889   1   25:D     1   PROCEDURE PRINTCR;  (* P010019 *)
 12890   1   25:D     2   
 12891   1   25:0     0     BEGIN
 12892   1   25:1     0       PRWIN^.HEAD.VCURSOR := PRWIN^.HEAD.VCURSOR + 1;
 12893   1   25:1    14       PRWIN^.HEAD.HCURSOR := 0;
 12894   1   25:1    21       MVCURSOR( PRWIN, PRWIN^.HEAD.HCURSOR, PRWIN^.HEAD.VCURSOR)
 12895   1   25:0    34     END;
 12896   1   25:0    48     
 12897   1   25:0    48     
 12898   1   31:D     1   PROCEDURE GETSTR;  (* P01001F *)
 12899   1   31:D     4                      
 12900   1   31:D     4     CONST
 12901   1   31:D     4           BACKSPCE = 8;
 12902   1   31:D     4           PRINTABL = 31;
 12903   1   31:D     4          
 12904   1   31:D     4     VAR
 12905   1   31:D     4          STRX : INTEGER;
 12906   1   31:D     5          VPOS : INTEGER;
 12907   1   31:D     6          HPOS : INTEGER;
 12908   1   31:D     7                      
 12909   1   31:0     0     BEGIN
 12910   1   31:1     0       FILLCHAR( ASTRING, STRLEN + 1, 0);
 12911   1   31:1     8       STRX := 0;
 12912   1   31:1    11       REPEAT
 12913   1   31:2    11         HPOS := GSWIN^.HEAD.HCURSOR;
 12914   1   31:2    19         VPOS := GSWIN^.HEAD.VCURSOR;
 12915   1   31:2    27         PRPICCH( GSWIN, '_');
 12916   1   31:2    31         GETKEY;
 12917   1   31:2    33         MVCURSOR( GSWIN, HPOS, VPOS);
 12918   1   31:2    38         IF (INCHAR = CHR( BACKSPCE)) AND (STRX > 0) THEN
 12919   1   31:3    47           BEGIN
 12920   1   31:4    47             PRPICCH( GSWIN, ' ');
 12921   1   31:4    51             STRX := STRX - 1;
 12922   1   31:4    56             HPOS := HPOS - 1;
 12923   1   31:4    61             MVCURSOR( GSWIN, HPOS, VPOS)
 12924   1   31:3    64           END
 12925   1   31:2    66         ELSE
 12926   1   31:3    68           IF INCHAR = CHR( CRETURN) THEN
 12927   1   31:4    73             BEGIN
 12928   1   31:5    73               PRPICCH( GSWIN, ' ');
 12929   1   31:5    77               ASTRING[ 0] := CHR( STRX);
 12930   1   31:5    81               EXIT( GETSTR)
 12931   1   31:4    85             END
 12932   1   31:3    85           ELSE
 12933   1   31:4    87             IF (INCHAR > CHR( PRINTABL))      AND
 12934   1   31:4    90                (HPOS < GSWIN^.HEAD.HSIZE - 3) AND
 12935   1   31:4   101                (STRX < STRLEN)  THEN
 12936   1   31:4   107                
 12937   1   31:5   107               BEGIN
 12938   1   31:6   107                 STRX := STRX + 1;
 12939   1   31:6   112                 ASTRING[ STRX] := INCHAR;
 12940   1   31:6   116                 PRPICCH( GSWIN, INCHAR)
 12941   1   31:5   118               END
 12942   1   31:4   120             ELSE
 12943   1   31:5   122               RINGBELL
 12944   1   31:1   122       UNTIL FALSE
 12945   1   31:0   124     END;
 12946   1   31:0   142 
 12947   1   31:0   142     
 12948   1   32:D     3   FUNCTION MENU;  (* P010020 *)
 12949   1   32:D   133   
 12950   1   32:D   133     VAR
 12951   1   32:D   133          VPOSMENU : INTEGER;
 12952   1   32:D   134          INDX     : INTEGER;
 12953   1   32:D   135          MXCHOICE : INTEGER;
 12954   1   32:D   136          HPOS     : INTEGER;
 12955   1   32:D   137          HPOSMENU : INTEGER;
 12956   1   32:D   138          CHOICEN  : INTEGER;
 12957   1   32:D   139          GOTSLASH : BOOLEAN;
 12958   1   32:D   140          CHOICES  : ARRAY[ 0..24] OF CHAR;
 12959   1   32:D   165     
 12960   1   32:0     0     BEGIN
 12961   1   32:1     0       MXCHOICE := 0;
 12962   1   32:1     9       HPOSMENU := MENUWIN^.HEAD.HCURSOR;
 12963   1   32:1    18       HPOS := -1;
 12964   1   32:1    23       GOTSLASH := TRUE;
 12965   1   32:1    27       VPOSMENU := MENUWIN^.HEAD.VCURSOR;
 12966   1   32:1    36       FOR INDX := 1 TO LENGTH( MENUSTR) DO
 12967   1   32:2    56         BEGIN
 12968   1   32:3    56           IF MENUSTR[ INDX] = '/' THEN
 12969   1   32:4    66             BEGIN
 12970   1   32:5    66               IF MENUWIN^.HEAD.HCURSOR > HPOS THEN
 12971   1   32:6    78                 HPOS := MENUWIN^.HEAD.HCURSOR;
 12972   1   32:5    87               PRINTCR( MENUWIN);
 12973   1   32:5    90               GOTSLASH := TRUE
 12974   1   32:4    90             END
 12975   1   32:3    94           ELSE
 12976   1   32:4    96             BEGIN
 12977   1   32:5    96               IF GOTSLASH THEN
 12978   1   32:6   101                 BEGIN
 12979   1   32:7   101                   IF MENUWIN^.HEAD.VCURSOR = 0 THEN
 12980   1   32:8   111                     BEGIN
 12981   1   32:9   111                       MENUWIN^.HEAD.VCURSOR := VPOSMENU;
 12982   1   32:9   120                       HPOSMENU := HPOS + 1
 12983   1   32:8   123                     END;
 12984   1   32:7   128                   MVCURSOR( MENUWIN, HPOSMENU, MENUWIN^.HEAD.VCURSOR);
 12985   1   32:7   140                   CHOICES [ MXCHOICE] := MENUSTR[ INDX];
 12986   1   32:7   155                   GOTSLASH := FALSE;
 12987   1   32:7   159                   MXCHOICE := MXCHOICE + 1
 12988   1   32:6   162                 END;
 12989   1   32:5   167               PRPICCH( MENUWIN, MENUSTR[ INDX])
 12990   1   32:4   174             END
 12991   1   32:2   176         END;
 12992   1   32:2   186         
 12993   1   32:1   186       REPEAT
 12994   1   32:2   186         BEGIN
 12995   1   32:3   186           GETKEY;
 12996   1   32:3   188           CHOICEN := 0;
 12997   1   32:3   192           FOR INDX := 0 TO MXCHOICE - 1 DO
 12998   1   32:4   213             BEGIN
 12999   1   32:5   213               IF (CHOICES[ INDX] = INCHAR) AND (INCHAR <> '*') THEN
 13000   1   32:6   230                 BEGIN
 13001   1   32:7   230                   MENU := CHOICEN;
 13002   1   32:7   235                   EXIT( MENU)
 13003   1   32:6   239                 END
 13004   1   32:5   239               ELSE
 13005   1   32:6   241                 BEGIN
 13006   1   32:7   241                   IF CHOICES[ INDX] = '^' THEN
 13007   1   32:8   254                     BEGIN
 13008   1   32:9   254                       IF (INCHAR > '0') AND
 13009   1   32:9   257                          (INCHAR <= CHR( ORD( '0') + PARTYCNT)) THEN
 13010   1   32:0   265                         BEGIN
 13011   1   32:1   265                           MENU := CHOICEN + ORD( INCHAR) - ORD( '1');
 13012   1   32:1   274                           EXIT( MENU)
 13013   1   32:0   278                         END;
 13014   1   32:9   278                       CHOICEN := CHOICEN + 6
 13015   1   32:8   281                     END
 13016   1   32:7   286                   ELSE
 13017   1   32:8   288                     CHOICEN := CHOICEN + 1
 13018   1   32:6   291                 END
 13019   1   32:4   296             END;
 13020   1   32:3   306           RINGBELL
 13021   1   32:2   306         END
 13022   1   32:1   308       UNTIL FALSE
 13023   1   32:0   308     END;
 13024   1   32:0   332     
 13025   1   32:0   332 (*$I WIZ3A:WIZARDRY2.TEXT *)
 13026   1   32:0   332   
 13027   1   32:0   332     
 13028   1   48:D     1   PROCEDURE SCRNDATA; EXTERNAL;  (* P010030 *)
 13029   1   48:D     1 
 13030   1   48:D     1 
 13031   1   48:D     1 (* ----- BEGIN WIZARDRY MAINLINE ----- *)
 13032   1   48:D     1 
 13033   1    1:0     0 BEGIN  (* P010001 *)
 13034   1    1:1     0   BASE04 := -3;
 13035   1    1:1     6   REPEAT
 13036   1    1:2     6     SPECIALS;
 13037   1    1:2     9     REPEAT
 13038   1    1:3     9       CASE XGOTO OF
 13039   1    1:3    14       
 13040   1    1:3    14         XCAMPSTF: CASE BASE291.GOTOX OF
 13041   1    1:4    19                     0, 1, 2: REWARDS;
 13042   1    1:4    24                           4: UTILITIE;
 13043   1    1:4    29                           3: SPECIALS;
 13044   1    1:4    34                   END;
 13045   1    1:4    54                   
 13046   1    1:3    54         XSCNMSG,
 13047   1    1:3    54         XINSAREA: SPECIALS;
 13048   1    1:3    59         
 13049   1    1:3    59         XCASTLE,
 13050   1    1:3    59         XGILGAMS: CASTLE;
 13051   1    1:3    64         
 13052   1    1:3    64         XBOLTAC,
 13053   1    1:3    64         XCANT,
 13054   1    1:3    64         XCHK4WIN,
 13055   1    1:3    64         XCEMETRY,
 13056   1    1:3    64         XEDGTOWN: SHOPS;
 13057   1    1:3    69         
 13058   1    1:3    69         XNEWMAZE,
 13059   1    1:3    69         XEQUIP6,
 13060   1    1:3    69         XEQPDSP,
 13061   1    1:3    69         XREORDER,
 13062   1    1:3    69         XCMP2EQ6: UTILITIE;
 13063   1    1:3    74         
 13064   1    1:3    74         XTRAININ,
 13065   1    1:3    74         XBCK2ROL: ROLLER;
 13066   1    1:3    79         
 13067   1    1:3    79         XRUNNER:  RUNNER;
 13068   1    1:3    84         
 13069   1    1:3    84         XREWARD1,
 13070   1    1:3    84         XREWARD2: REWARDS;
 13071   1    1:3    89         
 13072   1    1:3    89         XCOMBAT,
 13073   1    1:3    89         XUNUSED:  COMBAT;
 13074   1    1:3    94         
 13075   1    1:3    94         XINSPECT,
 13076   1    1:3    94         XINSPCT2,
 13077   1    1:3    94         XINSPCT3,
 13078   1    1:3    94         XBCK2CMP,
 13079   1    1:3    94         XBK2CMP2: CAMP;
 13080   1    1:3    99         
 13081   1    1:3    99       END;
 13082   1    1:2   160     UNTIL XGOTO = XDONE;
 13083   1    1:2   167     BASE04 := -2;
 13084   1    1:1   171   UNTIL FALSE;
 13085   1    1:0   174 END.
