'     THE WONDERFUL WORLD OF EAMON DELUXE (v2)
'           BY FRANK BLACK 1996-1999
'
'   A COMPUTERIZED FANTASY ROLE-PLAYING SYSTEM
' BASED UPON THE APPLE II VERSION BY DONALD BROWN,
'    JOHN NELSON, TOM ZUCHOWSKI, & FRANK BLACK
'
'              BASE DUNGEON PROGRAM v1.0
'
' Assault on the Clone Master
'   By Donald Brown
'
' Update: 16 MAY 1999 (v2 conversion)
'
TYPE DESC
  TEXT AS STRING * 253
END TYPE
DIM DS AS DESC

TYPE ROOM
  RNAME AS STRING * 79: D1 AS INTEGER: d2 AS INTEGER: D3 AS INTEGER
  D4 AS INTEGER: D5 AS INTEGER: D6 AS INTEGER: D7 AS INTEGER: D8 AS INTEGER
  D9 AS INTEGER: D10 AS INTEGER: Light AS INTEGER
END TYPE
DIM rm AS ROOM

TYPE ARTIFACT
  aname AS STRING * 35: AD1 AS INTEGER: AD2 AS INTEGER: AD3 AS INTEGER:
  AD4 AS INTEGER: AD5 AS INTEGER: AD6 AS INTEGER: AD7 AS INTEGER:
  AD8 AS INTEGER
END TYPE
DIM art AS ARTIFACT

TYPE MONSTER
  MNAME AS STRING * 35: MD1 AS INTEGER: MD2 AS INTEGER: MD3 AS INTEGER:
  MD4 AS INTEGER: MD5 AS INTEGER: MD6 AS INTEGER: MD7 AS INTEGER:
  MD8 AS INTEGER: MD9 AS INTEGER: MD10 AS INTEGER: MD11 AS INTEGER
  MD12 AS INTEGER: MD13 AS INTEGER
END TYPE
DIM mon AS MONSTER

TYPE RECORD
  CNAME AS STRING * 40: Status AS INTEGER: A1 AS INTEGER: a2 AS INTEGER
  a3 AS INTEGER: SP1 AS INTEGER: SP2 AS INTEGER: SP3 AS INTEGER
  SP4 AS INTEGER: WA1 AS INTEGER: WA2 AS INTEGER: WA3 AS INTEGER
  WA4 AS INTEGER: WA5 AS INTEGER: ae AS INTEGER: sex AS INTEGER: gold AS LONG
  bank AS LONG: ac AS INTEGER: WN1 AS STRING * 20: WN2 AS STRING * 20
  WN3 AS STRING * 20: WN4 AS STRING * 20: WCOMPLX1 AS INTEGER
  WCOMPLX2 AS INTEGER: WCOMPLX3 AS INTEGER: WCOMPLX4 AS INTEGER
  WTYPE1 AS INTEGER: WTYPE2 AS INTEGER: WTYPE3 AS INTEGER: WTYPE4 AS INTEGER
  WDICE1 AS INTEGER: WDICE2 AS INTEGER: WDICE3 AS INTEGER: WDICE4 AS INTEGER
  WSIDES1 AS INTEGER: WSIDES2 AS INTEGER: WSIDES3 AS INTEGER
  WSIDES4 AS INTEGER
END TYPE
DIM z AS RECORD
'---------------------------------------------------------------------------
'  Set up variable table
'
OPEN "NAME.DAT  " FOR INPUT AS #1
INPUT #1, nr, naf, ne, nm, aname$, nd, ver
CLOSE
'============================================================================
' Re-set variables
'
nr = 30: naf = 25: ne = 4: nm = 21
'
' Dead body flag & pointer
'
db = 0
'
' Adjustment to locations in DSC & DAT files
'
' 1 is rooms, 2 artifacts, 3 monsters
adj1 = 255: adj2 = 128: adj3 = 52
'============================================================================

a = 0: m = a: ro = m: na = naf + 6
OPEN "HINTDIR.DAT" FOR INPUT AS #1
INPUT #1, nh
DIM h$(nh), h%(nh, 2)
FOR r = 1 TO nh
   INPUT #1, h$(r), h%(r, 1), h%(r, 2)
NEXT: CLOSE

DIM a$(na), a%(na, 8), d%(100), m$(nm), m%(nm, 15), r$(nr), r%(nr, 11)
DIM sa%(4), sp%(4), sm$(3), bv$(5, 2), rb$(5, 1), wp$(5), wa%(5), wp%(na)
READ nc: DIM c$(nc), gm$(5), sp$(4), sa$(4), sex$(2)

GOTO Init

'---------------------------------------------------------------------------
' Main Loop
'
Main0:
  GOSUB Lp4
Main:
  IF die = 1 THEN GOTO EndGame
  COLOR 12
  GOSUB Lp1: IF ls = 0 THEN GOTO Main2A
  IF a%(ls, 5) = -1 THEN GOTO Main2A
  a%(ls, 5) = a%(ls, 5) - 1: m = a%(ls, 5)
  IF m = 0 THEN
    COLOR 2: PRINT "Your "; a$(ls); " has gone out!": COLOR 12
    ls = 0: lt = nl: GOTO Main0
  END IF
Main1A:
  IF m < 10 THEN
    PRINT "Your "; a$(ls); " is almost out!": GOSUB Lp4: GOTO Main2A
  END IF
Main1B:
  IF m < 20 THEN
    PRINT "Your "; a$(ls); " grows dim!": GOSUB Lp4
  END IF
Main2A:
  IF Speed > 0 THEN
    Speed = Speed - 1
    IF Speed = 0 THEN
      m%(0, 2) = m%(0, 2) / 2
      PRINT "Your speed spell has just expired!": GOSUB Lp4
    END IF
  END IF
Main2B:
  FOR a = 1 TO 4
     IF sa%(a) < sp%(a) THEN sa%(a) = sa%(a) * 1.1
     IF sa%(a) > sp%(a) THEN sa%(a) = sp%(a)
  NEXT
Main3A:
  IF lt = 0 THEN
    PRINT "It's too dark to see.": GOSUB Lp4: GOTO Com1
  END IF
'
' Give room name and desc
'
Main3B:
  PRINT "You are "; r$(ro): GOSUB Lp4
  IF r%(ro, 0) = 0 THEN
    r%(ro, 0) = 1: r = ro: GOSUB DiskRead
  END IF
'
' List monsters in room
'
Main4A:
  M2 = 0
  FOR m = 1 TO nm
     IF m%(m, 5) = ro THEN
       IF m%(m, 0) = 0 THEN
	 IF M2 = 3 THEN GOSUB Lp1
	 m%(m, 0) = 1: r = m + 800: GOSUB DiskRead: PRINT "("; : M2 = 1
       END IF
       IF m%(m, 3) = 1 THEN
	 PRINT m$(m); " is here."; MID$(" )", M2 + 1, 1);
	 GOSUB Lp1
       END IF
       IF m%(m, 3) > 1 THEN
	 PRINT LTRIM$(STR$(m%(m, 3))); " "; m$(m); "s are here.";
	 PRINT MID$(" )", M2 + 1, 1); : GOSUB Lp1
       END IF
       IF M2 = 1 THEN GOSUB Lp1
       IF M2 = 0 THEN M2 = 3
     END IF
  NEXT
'
' List artifacts in room
'
Main5A:
  FOR a = 1 TO na
     IF a%(a, 4) <> ro THEN GOTO Main5B
     IF a > naf THEN
       PRINT "Your "; a$(a); " is here.": GOSUB Lp2: GOTO Main5B
     END IF
     IF M2 = 1 THEN M2 = 0
     IF a%(a, 0) = 0 THEN
       IF M2 = 3 THEN GOSUB Lp1
       a%(a, 0) = 1: r = a + 400: GOSUB DiskRead: M2 = 1
     END IF
     PRINT "You see "; a$(a); ".": GOSUB Lp2
     IF a%(a, 2) = 4 AND a%(a, 6) = 1 THEN GOSUB Inv4
     IF M2 = 1 THEN GOSUB Lp1
     IF M2 = 0 THEN M2 = 3
Main5B:
  NEXT
' Get command
'
Com0:
  GOSUB Lp1
Com1:
  LINE INPUT "Your command?->"; a$: a$ = RTRIM$(LTRIM$(LCASE$(a$)))
  L = 0: GOSUB Lp1
  IF a$ = "" THEN
    a$ = CZ$: LOCATE CSRLIN - 2, 16: PRINT a$: PRINT
  END IF
'---------------------------------------------------------------------------
' Parse command
'
  v$ = "": s$ = "": s2$ = "": s3$ = ""
  IF a$ = "" THEN GOTO Err0
  CZ$ = a$
  FOR a = 2 TO LEN(a$)
     IF MID$(a$, a, 1) = " " THEN
       v$ = LTRIM$(RTRIM$(LEFT$(a$, a - 1)))
       s$ = LTRIM$(RTRIM$(MID$(a$, a + 1))): a = LEN(a$)
     END IF
  NEXT a
  IF v$ = "" THEN v$ = a$: GOTO Com2
  s3$ = s$
'
  FOR a = 1 TO LEN(s$)
     IF MID$(s$, a, 1) = " " THEN
       s2$ = LTRIM$(RTRIM$(MID$(s$, a + 1)))
       s$ = LTRIM$(RTRIM$(LEFT$(s$, a - 1))): a = LEN(s$)
     END IF
  NEXT
  IF s2$ = "" THEN GOTO Com2
'
  zz$ = LEFT$(s2$, 3)
  IF zz$ = "to " OR zz$ = "on " OR zz$ = "in " THEN
    s2$ = LTRIM$(RTRIM$(MID$(s2$, 4))): GOTO Com2
  END IF
  zz$ = LEFT$(s2$, 5)
  IF zz$ = "from " OR zz$ = "with " THEN
    s2$ = LTRIM$(RTRIM$(MID$(s2$, 6)))
  END IF
Com2:
'
  a = LEN(v$): c = 0
  FOR k = 1 TO nc
     IF v$ = LEFT$(c$(k), a) OR v$ = RIGHT$(c$(k), a) THEN
       c = k: k = nc
     END IF
  NEXT k
  IF c = 0 THEN GOTO Err0
  COLOR 3
  IF c <> 20 AND c <> 23 AND c <> 29 AND c <> 31 THEN s$ = s3$
Com3:
ON c GOTO Move, Move, Move, Move, Move, Move, Move, Move, Move, Move, Flee
ON c - 11 GOTO ItemClose, Destroy, Drink, Drop, Drink, examine, ITEMGET, Light, ItemOpen
ON c - 20 GOTO ItemPut, ItemRead, Ready, Remove, Use, Wear
ON c - 26 GOTO Attack, Blast, Free, Give, Heal, Request, Smile
ON c - 33 GOTO Inventory, Look, Say, Speed, Power, Status, Hints
ON c - 40 GOTO GameSave, GameRestore, Quit
'---------------------------------------------------------------------------
'  Pick foes
'
Pfoe:
  IF die = 1 THEN GOTO EndGame
  IF t(1) < 0 THEN t(1) = 0
  IF t(1) = 0 THEN GOTO Pfoe3
  GOSUB Lp1: m = 0: m9 = 1
Pfoe0:
  m = m + 1
  IF m%(m, 5) <> ro THEN GOTO Pfoe2A
  IF m%(m, 11) = 2 THEN GOTO Pfoe2A
'
'  Will monster flee?
'
  GOSUB RollDice: mr% = ABS(m%(m, 13) / m%(m, 1) * RND * 100 > m%(m, 4))
  IF m%(m, 3) > 1 THEN
    mr% = ABS(m%(m, 12) - m%(m, 3) / m%(m, 12) * RND * 100 > m%(m, 4))
  END IF
  IF m%(m, 4) > 99 THEN mr% = 0
  IF mr% <> 1 THEN GOTO SkipFlee
'
  IF m%(m, 3) = 2 THEN GOTO SkipFlee
  mr% = RND * m%(m, 3) + 1
  IF mr% = m%(m, 3) THEN mr% = mr% - 1
  IF m%(m, 3) = 1 THEN mr% = 1
  IF mr% > 1 THEN
    IF nx = 0 THEN GOTO SkipFlee
    PRINT LTRIM$(STR$(mr%)); " "; m$(m); "s flee!": GOSUB Lp4
    m%(m, 3) = m%(m, 3) - mr%
    IF m%(m, 3) = 0 THEN
      m%(m, 3) = m%(m, 12): m%(m, 5) = 0
    END IF
  END IF
  IF mr% = 1 THEN
    PRINT m$(m); " flees!": GOSUB Lp4
    IF nx = 0 THEN
      PRINT "But can't find an exit!": GOSUB Lp4: GOTO Pfoe2A
    END IF
    GOSUB Flee1: m%(m, 5) = r2
  END IF
  r3 = ro: GOSUB EnemyCheck
  IF m%(m, 5) <> ro THEN GOTO Pfoe2A
'
'  Find an enemy to attack
'
SkipFlee:
  mc = 0: XMC = 1: IF m%(m, 3) > 1 THEN XMC = m%(m, 3)
  of = m: df = 0: IF XMC > 8 THEN XMC = 8
Pfoe0A:
  mc = mc + 1: df = 0
  IF mc > XMC THEN GOTO Pfoe2A
  IF m%(m, 11) = 3 THEN GOTO Pfoe1
'
' Unfriendly monsters find an enemy to attack
'
  IF t(3) = m%(0, 1) THEN GOTO Pfoe2
  FOR M2 = 1 TO nm
     IF m%(M2, 5) = ro AND m%(M2, 11) = 3 AND RND < .45 THEN
       df = M2: M2 = nm
     END IF
  NEXT M2: GOTO Pfoe2
'
' Friendly monsters pick an enemy
'
Pfoe1:
  FOR M2 = 1 TO nm
     IF m%(M2, 5) = ro AND m%(M2, 11) = 1 THEN
       df = M2
       IF df = nm OR RND(1) < .45 THEN M2 = nm
     END IF
  NEXT M2
  IF df = 0 THEN GOTO Pfoe2A
'
'  Send em' off to war
'
Pfoe2:
  GOSUB Battle
  IF die = 1 THEN GOTO EndGame
  IF t(1) > 0 THEN GOTO Pfoe0A
Pfoe2A:
  IF m < nm THEN GOTO Pfoe0
'
'  Every-round events
'
Pfoe3:
  m9 = 0
  FOR of = 1 TO nm
     IF m%(of, 5) = ro AND m%(of, 8) < 0 THEN GOSUB GetWep
  NEXT of
'
' Add your own special stuff here
'
  GOTO Main
'---------------------------------------------------------------------------
' ****  Move commands ****
'
Move:
  r2 = r%(ro, c)
  IF t(1) AND (nl > 0 OR lt > 0) THEN
    PRINT "You can't do that with unfriendlies about!": GOTO Main0
  END IF
MoveCheck:
  IF r2 > 1000 THEN GOTO Move1
  IF r2 > 0 AND r2 <= nr THEN GOTO Move2
'
' Add special (negative) moves here
'
  IF r2 = -999 THEN
    IF m%(21, 5) > 0 OR a%(10, 4) > 0 THEN
      r = 1: GOSUB Effect: GOTO Main
    END IF
    r = 2: GOSUB Effect: DI = 0: GOTO EndGame
  END IF
  PRINT "You can't go that way!": GOTO Main0
'
' Doors/Gates
'
Move1:
  a = r2 - 1000
  IF a%(a, 6) = 0 AND a%(a, 0) = 1 THEN
    r2 = a%(a, 5): GOTO MoveCheck
  END IF
  IF a%(a, 8) = 1 AND a%(a, 0) = 0 THEN
    PRINT "You can't go that way!": GOTO Main0
  END IF
  PRINT "The "; a$(a); " blocks the way!": GOTO Main0
'
' Go to another room
'
Move2:
  IF ls > 0 AND ls <= na THEN
    IF a%(ls, 4) <> -1 THEN ls = 0
  END IF
  r3 = ro: ro = r2: GOSUB EnemyCheck
  nl = r%(ro, 11): lt = ABS(nl OR ls): nx = 0
  FOR a = 1 TO nd
     nx = nx + ABS(r%(ro, a) > 0 AND r%(ro, a) <= nr)
  NEXT
  GOTO Main
'---------------------------------------------------------------------------
' **** Flee command ****
'
Flee:
  IF t(1) = 0 THEN
    PRINT "Calm down.": GOTO Main0
  END IF
  IF nx = 0 THEN
    PRINT "There's no place to run!": GOTO Main0
  END IF
  IF s$ <> "" THEN GOTO Flee2
Flee0:
  GOSUB Flee1: GOTO Move2
Flee1:
  r2 = r%(ro, nd * RND + 1)
  IF r2 < 1 OR r2 > nr THEN GOTO Flee1
  RETURN
Flee2:
  r2 = 0
  FOR a = 1 TO nd
     IF LEFT$(c$(a), LEN(s$)) = s$ THEN r2 = r%(ro, a)
  NEXT
  IF r2 = 0 THEN GOTO Flee0
  GOTO MoveCheck
'---------------------------------------------------------------------------
' **** Close command ****
'
ItemClose:
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  IF a%(a, 2) <> 4 THEN PRINT "You can't close it.": GOTO Main0
  IF a%(a, 6) = 0 THEN
    PRINT "It's not open.": GOTO Main0
  END IF
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " closed."
  a%(a, 6) = 0: GOTO Lp12

'===========================================================================
' **** Destroy command ****
'
Destroy:
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  IF a < 10 OR a > 11 THEN
    PRINT "Relax.": GOTO Main0
  END IF
  IF a = 11 THEN
    PRINT "What more could you do to it?": GOTO Main0
  END IF
  PRINT "You destroy the "; a$(a); "!": GOSUB Lp4
  a%(a, 4) = 0: a%(11, 4) = ro: GOTO Pfoe
'===========================================================================

'---------------------------------------------------------------------------
' **** Drink & Eat commands ****
'
Drink:
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err3
  IF a%(a, 2) <> 6 AND a%(a, 2) <> 9 THEN
    s$ = "that": GOTO Err3
  END IF
  IF a%(a, 7) = 0 THEN GOTO Err2
  IF a%(a, 6) < 1 THEN
    PRINT "There's none left.": GOTO Lp12
  END IF
  a%(a, 6) = a%(a, 6) - 1
  IF a%(a, 6) = 0 AND a%(a, 2) = 9 THEN
    PRINT "You eat it all up.": GOSUB Lp4
    wt = wt - a%(a, 3) * (a%(a, 4) = -1): a%(a, 4) = 0
  END IF
  m%(0, 13) = m%(0, 13) - a%(a, 5): IF m%(0, 13) < 0 THEN m%(0, 13) = 0
  PRINT "You feel "; MID$("betterworse", (a%(a, 5) < 0) * 6 + 1, 6); "!"
  GOSUB Lp4: df = 0: d2 = 0: GOSUB Mstatus: GOTO Pfoe
'---------------------------------------------------------------------------
'  **** Drop command ****
'
Drop:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: IF s$ = "all" THEN GOTO Drop1
  GOSUB Asearch
  IF F = 0 THEN
      HA = -999: WH = HA: EM = HA: GOSUB Asearch2: IF F = 0 THEN GOTO Err1
      GOTO Give
  END IF
  GOSUB Drop2: GOTO Pfoe
Drop1:
  FOR a = 1 TO na
     IF a%(a, 4) = -1 THEN GOSUB Drop2
  NEXT a
  wt = 0: m%(0, 8) = -1: GOSUB Lp4: GOTO Pfoe
Drop2:
  IF a = m%(0, 8) THEN m%(0, 8) = -1
  wt = wt - a%(a, 3): a%(a, 4) = ro
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " dropped.": GOSUB Lp2
  IF a = ls THEN
    ls = 0: lt = nl: GOSUB Lp1
    PRINT "The "; a$(a); " goes out.": GOTO Lp4
  END IF
  RETURN
'---------------------------------------------------------------------------
'  **** Examine command ****
'
examine:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Examine1
'
' Examine artifact
'
  IF a%(a, 4) = EM THEN a%(a, 4) = ro
  IF a%(a, 2) = 8 THEN a%(a, 8) = 0
  IF a > naf THEN
    PRINT "This is your "; a$(a); ".": GOTO Lp12
  END IF
  IF a%(a, 2) = 12 THEN GOSUB ItemGet3: GOTO Main
  r = a + 400: GOSUB DiskRead: a%(a, 0) = 1
  IF a%(a, 2) = 6 OR a%(a, 2) = 9 THEN
    PRINT "There "; MID$("are is ", ABS(a%(a, 6) = 1) * 4 + 1, 4);
    PRINT LTRIM$(RTRIM$(STR$(a%(a, 6)))); " ";
    PRINT MID$("swallowbite", ABS(a%(a, 2) = 9) * 7 + 1, 7);
    PRINT MID$("s", ABS(a%(a, 6) = 1) * 1 + 1, 1);
    PRINT " left.": GOSUB Lp4
  END IF
  GOTO Pfoe
'
' Examine monster
'
Examine1:
  GOSUB Msearch
  IF F = 0 THEN
    HA = -999: WH = HA: EM = HA: GOSUB Asearch2
    IF F = 0 THEN
      PRINT "You see nothing special.": GOTO Lp12
    END IF
    PRINT "This is your "; a$(a); ".": GOTO Lp12
  END IF
  r = m + 800: GOSUB DiskRead: df = m: d2 = 0
  IF m%(m, 3) > 1 AND m%(m, 13) = 0 THEN
    PRINT "They are "; : GOSUB Ms1: GOTO Pfoe
  END IF
  GOSUB Mstatus: GOTO Pfoe
'---------------------------------------------------------------------------
'  **** Get command ****
'
ITEMGET:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: IF s$ = "all" THEN GOTO ItemGet2
  HA = ro: GOSUB Asearch2: IF F = 0 THEN GOTO Err3
  IF db > 0 AND a >= db AND a <= naf THEN
    PRINT "Dead bodies are best if left alone.": GOTO Main0
  END IF
  GOSUB ItemGet3: GOSUB Lp4: GOTO Pfoe
'
' Get all possible items in room
'
ItemGet2:
  FOR a = 1 TO na
     IF a%(a, 4) = ro THEN
       IF db > 0 AND a >= db AND a <= naf THEN GOTO ItemGet2A
       IF a%(a, 3) > 900 THEN
	 PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); ": ";
       END IF
       IF a%(a, 3) <> -999 THEN GOSUB ItemGet3
     END IF
ItemGet2A:
  NEXT a: GOTO Pfoe
ItemGet3:
  IF a%(a, 2) = 12 THEN
    PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " is alive!": GOSUB Lp4
    IF a%(a, 6) > 0 THEN
      FOR x = 1 TO a%(a, 7)
	 r = a%(a, 6) + 1199 + x: GOSUB DiskRead
     NEXT
     END IF
     a%(a, 4) = 0: m%(a%(a, 5), 5) = ro: r3 = ro: GOTO EnemyCheck
  END IF
  IF a%(a, 3) > 900 THEN
    PRINT "Don't be absurd.": GOTO Lp2
  END IF
  IF a%(a, 3) = -999 THEN
    PRINT "You can't get that.": GOTO Lp2
  END IF
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " ";
  IF wt + a%(a, 3) > 10 * m%(0, 1) THEN
    PRINT "is too heavy.": GOTO Lp2
  END IF
  IF a%(a, 2) = 10 THEN
    PRINT "must be freed.": GOTO Lp2
  END IF
  PRINT "taken.": a%(a, 4) = -1: wt = wt + a%(a, 3)
  IF m%(0, 8) < 1 THEN
    IF a%(a, 2) = 2 OR a%(a, 2) = 3 THEN
      m%(0, 8) = a: GOSUB Lp2: PRINT a$(a); " readied."
    END IF
  END IF
  GOTO Lp2
'---------------------------------------------------------------------------
' **** Light command ****
'
Light:
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  IF a%(a, 2) <> 5 OR a%(a, 5) = 0 THEN
    PRINT "It won't light!": GOTO Lp12
  END IF
  lt = 1: ls = a: PRINT "You've lit the "; a$(a); ".": GOTO Lp12
'---------------------------------------------------------------------------
' **** Open command ****
'
ItemOpen:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  m = a%(a, 2): IF m = 8 THEN GOTO DoorOpen
  IF m = 12 THEN GOSUB ItemGet3: GOTO Pfoe
  IF m <> 4 AND m <> 6 AND m <> 7 AND m <> 9 THEN
    s$ = a$(a): GOTO Err3
  END IF
  IF a%(a, 4) = EM THEN a%(a, 4) = ro
  k = a%(a, 5): r = a%(a, 7): IF m = 4 THEN r = a%(a, 6)
  IF r = 1 THEN PRINT "It's already open.": GOTO Lp12
'
  IF m = 6 OR m = 7 OR m = 9 THEN
    a%(a, 7) = 1: a$ = "You've opened the " + a$(a) + ".": GOTO Lp9
  END IF
'
  IF k > 0 AND k <= naf THEN
    IF a%(k, 4) <> -1 AND a%(k, 4) <> ro THEN
      PRINT "It's locked.": GOTO Lp12
    END IF
  END IF
  IF a%(a, 6) > 1 THEN
    PRINT "It's locked.": GOTO Lp12
  END IF
  a%(a, 5) = 0: a%(a, 6) = 1
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " opened.": GOSUB Lp2
  GOSUB Inv4: GOTO Pfoe
'
DoorOpen:
  a%(a, 4) = ro: k = a%(a, 6)
'
  IF k > 0 AND k <= naf THEN
    IF a%(k, 4) <> -1 AND a%(k, 4) <> ro THEN
      PRINT "It's locked.": GOTO Lp12
    END IF
    a$ = "You open it with the " + a$(k) + ".": GOTO DoorOpen1
  END IF
'
  IF a%(a, 7) > 0 THEN
    PRINT "You'll have to force it open.": GOTO Lp12
  END IF
  a$ = "You've opened the " + a$(a) + "."
DoorOpen1:
  FOR r = 1 TO nd
     IF r%(ro, r) = 1000 + a THEN r%(ro, r) = a%(a, 5)
  NEXT r
  a%(a, 6) = 0: a%(a, 7) = 0: GOTO Lp9
'---------------------------------------------------------------------------
' **** Put command ****
'
ItemPut:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  a$ = "Put it in what": GOSUB CheckSub2: s$ = s2$
  GOSUB ItemTake: IF a%(a, 4) <> -1 THEN GOTO Main
  m = a: GOSUB Asearch0: s$ = "that": IF F = 0 THEN GOTO Err1
  IF a = m OR a%(a, 2) <> 4 THEN GOTO Err3
  IF a%(a, 6) = 0 THEN GOTO Err2
  IF a%(a, 8) = 0 THEN
    PRINT "You don't need to.": GOTO Lp12
  END IF
  IF a%(a, 7) >= a%(a, 8) THEN
    PRINT "It's full.": GOTO Lp12
  END IF
  wt = wt - ABS(a%(m, 4) <> -1) * a%(m, 3)
  IF m = m%(0, 8) THEN m%(0, 8) = -1
  a%(m, 4) = a + 1000: a%(a, 7) = a%(a, 7) + 1
  IF m = ls THEN
    ls = 0: lt = nl: GOSUB Lp1
    PRINT "(The "; a$(m); " goes out.)": GOSUB Lp4
  END IF
  PRINT "Done.": GOTO Lp12
'---------------------------------------------------------------------------
' **** Read command ****
'
ItemRead:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: GOSUB Asearch0
  IF F = 0 THEN
    s$ = "that": GOTO Err3
  END IF
  IF a%(a, 2) <> 7 THEN
    s$ = a$(a): GOTO Err3
  END IF
  IF a%(a, 7) = 0 THEN GOTO Err2
  COLOR 2
  FOR x = 1 TO a%(a, 6)
     r = a%(a, 5) + 1199 + x: GOSUB DiskRead
  NEXT x: COLOR 3: GOTO Pfoe
'---------------------------------------------------------------------------
' **** Ready command ****
'
Ready:
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  IF a%(a, 2) <> 2 AND a%(a, 2) <> 3 THEN
    PRINT "That isn't a weapon!": GOSUB Lp2: GOTO Main
  END IF
  GOSUB ItemTake: IF a%(a, 4) <> -1 THEN GOTO Main
  m%(0, 8) = a: w2 = a%(a, 6)
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " readied.": GOSUB Lp2
  GOTO Pfoe
'---------------------------------------------------------------------------
' **** Remove command ****
'
'    Remove armor
'
Remove:
  GOSUB CheckSub: HA = -999: WH = HA: EM = HA: GOSUB Asearch2
  IF F = 0 THEN GOTO Remove1
  IF a = sh THEN
    m%(0, 7) = m%(0, 7) - 1: sh = 0
  END IF
  IF a = ar THEN
    m%(0, 7) = m%(0, 7) - a%(a, 5) / 2: ar = 0
  END IF
  a%(a, 4) = -1
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " removed."
  GOTO Pfoe
'
' Remove items from a container
'
Remove1:
  IF lt = 0 THEN GOTO Main
  a$ = "From what": GOSUB CheckSub2: a$ = s$: s$ = s2$
  GOSUB Asearch0: IF F = 0 THEN GOTO Err1
  m = a: s$ = a$: WH = a + 1000: HA = WH: EM = WH: GOSUB Asearch2
  IF F = 0 THEN
    PRINT "I don't follow you.": GOTO Main0
  END IF
  IF a%(m, 6) = 0 THEN GOTO Err2
  a%(a, 4) = ro: a%(m, 7) = a%(m, 7) - 1: PRINT "Okay."
  IF a%(m, 7) = -1 THEN
    IF a%(a, 0) > 0 THEN wt = wt - a%(a, 3)
  END IF
  GOTO Pfoe
'---------------------------------------------------------------------------
' **** Use command ****
'
' Put your own special stuff here
'
Use:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: PRINT "Try another command.": GOTO Lp12
'---------------------------------------------------------------------------
' **** Wear command ****
'
Wear:
  GOSUB CheckSub: HA = -1: WH = ro: EM = -999: GOSUB Asearch2
  IF F = 0 THEN GOTO Err1
  IF a%(a, 4) = ro THEN
    GOSUB ItemTake: IF a%(a, 4) <> -1 THEN GOTO Main
  END IF
  IF a%(a, 2) <> 11 THEN
    s$ = "that": GOTO Err3
  END IF
  IF a%(a, 4) = EM THEN GOTO Wear2
  IF a%(a, 5) = 0 THEN GOTO Wear1
  IF a%(a, 5) = 1 AND sh > 0 THEN GOTO Wear2
  IF a%(a, 5) = 1 THEN
    sh = a: m%(0, 7) = m%(0, 7) + 1: GOTO Wear1
  END IF
  IF ar <> 0 THEN GOTO Wear2
  ar = a: m%(0, 7) = m%(0, 7) + a%(a, 5) / 2
Wear1:
  a%(a, 4) = -999
  PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2); " worn."
  GOTO Pfoe
Wear2:
  PRINT "You're already wearing armor of that type!": GOTO Main0
'---------------------------------------------------------------------------
'  **** Attack command ****
'
Attack:
  IF m%(0, 8) < 1 THEN
    PRINT "You must first ready a weapon!": GOTO Main0
  END IF
  GOSUB CheckSub:  GOSUB Msearch: ta = 0: IF F THEN GOTO AttackMon
'
'  Attack/blast open a door or container
'
AttackItem:
  IF lt = 0 THEN GOTO Main
  HA = ro: GOSUB Asearch1: IF F = 0 THEN GOTO Err4
  IF db > 0 AND a >= db AND a <= naf THEN
    PRINT "You hack the body to bits!": a%(a, 4) = 0: GOTO Pfoe
  END IF
  m = a%(a, 2)
  IF m = 12 THEN
    GOSUB ItemGet3: m = a%(a, 5): GOTO AttackMon
  END IF
  IF m <> 4 AND m <> 8 THEN
    a$ = "Why would you attack a " + a$(a) + "?": GOSUB Lp0: GOTO Main
  END IF
  IF m = 8 AND a%(a, 7) = 0 THEN
    PRINT "Nothing happens.": GOTO Lp12
  END IF
  w = m%(0, 8): d = a%(w, 7): s = a%(w, 8): x = 7: k = 6: d2 = 0
  IF ta = 1 THEN
    d = 2: s = 5
  END IF
  IF m = 4 THEN
    x = 6: k = 5
  END IF
  FOR a2 = 1 TO d
     d2 = d2 + INT(RND * s - 1)
  NEXT
  a%(a, x) = a%(a, x) - d2
  IF a%(a, x) < 100 THEN
    a%(a, x) = 1: a%(a, k) = 0: a$ = "The " + a$(a) + " shatters open!"
    IF m = 8 THEN
      a%(a, 6) = 0: a%(a, 7) = 0
    END IF
    GOSUB Lp0: GOTO Pfoe
  END IF
  a$ = "Wham!  You " + MID$("hitblast", ta * 3 + 1, 3 + ta * 2)
  a$ = a$ + " the " + a$(a) + "!": GOTO Lp9
'
' Attack a monster
'
AttackMon:
  IF m%(m, 11) <> 1 THEN GOSUB AtFr: IF s$ <> "y" THEN GOTO Main
  IF m%(m, 11) = 2 THEN
    a$ = m$(m) + " get's angry!": GOSUB Lp10
  END IF
  of = 0: df = m: up = 0: GOSUB Battle
  IF die = 1 THEN GOTO EndGame
  IF hi = 1 AND up = 1 THEN
    w2 = a%(m%(0, 8), 6)
    a$ = m$(0) + MID$("'s'", ABS(LCASE$(RIGHT$(m$(0), 1)) = "s") * 2 + 1, 2)
    a$ = a$ + " " + wp$(w2) + " ability just increased!"
    wa%(w2) = wa%(w2) + 1: GOSUB Lp0: GOSUB Lp1
  END IF
  IF m%(df, 11) = 1 OR df = 0 THEN GOTO Pfoe
  m%(df, 11) = m%(df, 11) - 1
  r3 = ro: GOSUB EnemyCheck: GOTO Pfoe
'---------------------------------------------------------------------------
' **** Free command ****
'
Free:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: GOSUB Asearch0: IF F = 0 THEN GOTO Err4
  IF a%(a, 2) <> 10 THEN GOTO Err3
  m = a%(a, 5): k = a%(a, 6): w = a%(a, 7)
  IF w > 0 AND w <= nm THEN
    IF m%(w, 5) = ro THEN
      PRINT m$(w); " won't let you!": GOTO Lp12
    END IF
  END IF
  IF k > 0 AND k <= naf THEN
    IF a%(k, 4) <> -1 AND a%(k, 4) <> ro THEN
      PRINT "You don't have the key.": GOTO Lp12
    END IF
  END IF
  a$ = "You have freed " + m$(m)
  IF k > 0 AND k <= naf THEN a$ = a$ + " with the " + a$(k)
  a$ = a$ + ".": GOSUB Lp0
  m%(m, 5) = ro: a%(a, 4) = 0: r3 = ro
  GOSUB EnemyCheck: GOTO Pfoe
'---------------------------------------------------------------------------
' **** Give command ****
'
Give:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: k = ABS(INT(VAL(s$)))
  IF k = 0 THEN
    GOSUB Asearch0
    IF F = 0 THEN
      HA = -999: WH = HA: EM = HA: GOSUB Asearch2: IF F = 0 THEN GOTO Err1
      PRINT "You're wearing it.  "; Q$; "REMOVE"; Q$; " it first.": GOTO Main0
    END IF
    GOSUB ItemTake: IF a%(a, 4) <> -1 THEN GOTO Main
  END IF
  a$ = "To whom": GOSUB CheckSub2
  s$ = s2$: GOSUB Msearch: IF F = 0 THEN GOTO Err4
  IF k = 0 THEN GOTO Give1
'
' Give money
'
GiveMoney:
  s2$ = "": a$ = "Give " + LTRIM$(STR$(k)) + "GP to "
  a$ = a$ + m$(m) + " (Y/N)": GOSUB CheckSub2
  s2$ = LEFT$(s2$, 1): IF s2$ <> "y" AND s2$ <> "n" THEN GOTO GiveMoney
  IF s2$ = "n" THEN GOTO Main
  IF gold < k THEN PRINT "You only have"; gold; "gold pieces.": GOTO Main0
  gold = gold - k: a$ = m$(m) + " takes the money...": GOSUB Lp0
  IF m%(m, 11) = 2 AND k >= 5000 THEN
    m%(m, 11) = 3: GOSUB Lp1: GOSUB Smile1
  END IF
  GOTO Give2
'
' Give an item
'
Give1:
  a$ = "You give " + a$(a) + " to " + m$(m) + "...": GOSUB Lp0: GOSUB Lp1
  IF a = m%(0, 8) THEN m%(0, 8) = -1
  IF a%(a, 2) = 6 THEN
    IF m%(m, 13) > 0 AND a%(a, 6) > 0 THEN GOTO GiveDrink
  END IF
  wt = wt - a%(a, 3) * (a%(a, 4) = -1)
  a%(a, 4) = -m - 1
  IF m%(m, 8) < 0 THEN
    IF a%(a, 2) = 2 OR a%(a, 2) = 3 THEN
      m%(m, 8) = a: a$ = m$(m) + " readies " + a$(a) + ".": GOSUB Lp0
    END IF
  END IF
  IF m%(m, 11) < 3 THEN m%(m, 11) = 100 + m%(m, 11) * (30 + a%(a, 1) / 100)
Give2:
  r3 = ro: GOSUB EnemyCheck: GOTO Pfoe
'
' Give something drinkable
'
GiveDrink:
  a$ = m$(m) + " takes a drink and hands it back to you.": GOSUB Lp0
  GOSUB Lp1: a%(a, 6) = a%(a, 6) - 1
  IF m%(m, 11) < 3 THEN m%(m, 11) = 140 + 60 * m%(m, 13) / m%(m, 1)
  m%(m, 13) = m%(m, 13) - a%(a, 5): IF m%(m, 13) < 0 THEN m%(m, 13) = 0
  df = m: d2 = 0: GOSUB Mstatus: GOTO Give2
'---------------------------------------------------------------------------
' **** Request command ****
'
Request:
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: a$ = "From whom": GOSUB CheckSub2
  a$ = s$: s$ = s2$: GOSUB Msearch: IF F = 0 THEN GOTO Err4
  s$ = a$: WH = -m - 1: HA = WH: EM = WH: GOSUB Asearch2
  IF F = 0 THEN
    PRINT m$(m); " doesn't have it.": GOTO Main0
  END IF
  IF m%(m, 11) < 3 THEN
    GOSUB Smile1: GOTO Pfoe
  END IF
  PRINT "Okay.": GOSUB Lp4
  GOSUB ItemGet3
  IF a%(a, 4) = -1 THEN
    IF a = m%(m, 8) THEN m%(m, 8) = -1
    IF a%(a, 0) = 0 THEN
      a%(a, 0) = 1: GOSUB Lp1: r = a + 400: GOSUB DiskRead
    END IF
  END IF
  GOTO Pfoe
'---------------------------------------------------------------------------
' **** Smile command ****
'
Smile:
  IF lt = 0 THEN GOTO Main
  FOR m = 1 TO nm
     IF m%(m, 5) = ro THEN GOSUB Smile1
  NEXT: GOTO Pfoe
Smile1:
  PRINT m$(m); : IF m%(m, 3) > 1 THEN PRINT "s";
  IF m%(m, 11) = 2 THEN
    PRINT " "; sm$(2); : IF m%(m, 3) > 1 THEN PRINT " you."
    IF m%(m, 3) = 1 THEN PRINT "s you."
    GOSUB Lp2: RETURN
  END IF
  PRINT " "; sm$(m%(m, 11)); : IF m%(m, 3) = 1 THEN PRINT "s";
  PRINT " at you.": GOSUB Lp2: RETURN
'---------------------------------------------------------------------------
' **** Inventory command ****
'
Inventory:
  IF s$ = "" THEN GOTO Inv1
  IF lt = 0 THEN GOTO Main
  GOSUB CheckSub: GOSUB Msearch: IF F = 0 THEN GOTO Err4
  IF m%(m, 11) = 3 THEN GOTO Inv2
  GOSUB Smile1: GOTO Pfoe
Inv1:
  m = 0: M2 = 0: PRINT m$(m); " is wearing:": GOSUB Lp4
  FOR a = 1 TO na
     IF a%(a, 4) = -999 THEN
       PRINT " "; UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2)
       M2 = 1: GOSUB Lp2
     END IF
  NEXT
  IF M2 = 0 THEN PRINT " (No armor)": GOSUB Lp2
  GOSUB Lp1
Inv2:
  M2 = 0: PRINT m$(m); " is carrying:": GOSUB Lp4
  FOR a = 1 TO na
     IF a%(a, 4) = -m - 1 THEN
       PRINT " "; UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2);
       IF a = m%(m, 8) THEN PRINT "  [Ready Weapon]";
       IF a = ls THEN PRINT "  (Providing light)";
       IF a%(a, 2) = 4 THEN GOSUB Inv3
       M2 = 1: GOSUB Lp1
     END IF
  NEXT
  IF M2 = 0 THEN
    PRINT " (Nothing)": GOSUB Lp4
  END IF
  IF m = 0 THEN
    PRINT LTRIM$(STR$(gold)); " gold pieces": GOSUB Lp4
  END IF
  df = m: d2 = 0: GOSUB Mstatus: GOTO Pfoe
'
' Show items inside of container
'
Inv3:
  IF a%(a, 6) <> 1 THEN
    PRINT " (Closed)"; : RETURN
  END IF
  GOSUB Lp1
Inv4:
  PRINT "(This contains:)": GOSUB Lp2: of = 0
  FOR a2 = 1 TO na
     IF a%(a2, 4) = a + 1000 THEN
       PRINT " --- "; UCASE$(LEFT$(a$(a2), 1)); MID$(a$(a2), 2)
       GOSUB Lp2: of = 1
     END IF
  NEXT
  IF of = 0 THEN
    PRINT " --- (Nothing)": GOSUB Lp2
  END IF
  RETURN
'---------------------------------------------------------------------------
' **** Status command ****
'
Status:
  CLS : L = 0
  FOR a = 1 TO 4
     sa$(a) = LTRIM$(STR$(sa%(a))) + "%": sp$(a) = LTRIM$(STR$(sp%(a))) + "%"
  NEXT
  IF sex < 0 OR sex > 1 THEN sex = 0
  PRINT "Name: "; LEFT$(m$(0), 32); : LOCATE CSRLIN, 40
  PRINT "Sex: "; sex$(sex); : LOCATE CSRLIN, 55
  a$ = STR$(m%(0, 13)) + "/" + LTRIM$(STR$(m%(0, 1)))
  PRINT "Damage Taken:"; a$: PRINT
  PRINT "Hardiness: "; m%(0, 1): LOCATE 3, 20: PRINT "Agility: "; m%(0, 2)
  LOCATE 3, 37: PRINT "Charisma: "; ch;
  PRINT "   (Charm Mon:"; : a = (ch - 10) * 2: a$ = LTRIM$(STR$(a)) + "%)"
  PRINT MID$("+", ABS((a < 1)) * 1 + 1, 1); a$: PRINT
  PRINT "Weapon Abilities:"; : LOCATE 5, 41: PRINT "Spell Abilities:"
  PRINT "1. Axe:  "; wa%(1);
  LOCATE 6, 42: PRINT "Blast.."; : a = 1: GOSUB Status1
  PRINT "2. Bow:  "; wa%(2);
  LOCATE 7, 42: PRINT "Heal..."; : a = 2: GOSUB Status1
  PRINT "3. Mace: "; wa%(3);
  LOCATE 8, 42: PRINT "Speed.."; : a = 3: GOSUB Status1
  PRINT "4. Spear:"; wa%(4);
  LOCATE 9, 42: PRINT "Power.."; : a = 4: GOSUB Status1
  PRINT "5. Sword:"; wa%(5); : LOCATE 10, 24: PRINT "Gold:"; gold
  LOCATE 10, 56: PRINT "In bank:"; bank: PRINT
  PRINT "Armor: ";
  IF ar > 1 AND ar <= na THEN PRINT UCASE$(LEFT$(a$(ar), 1)); MID$(a$(ar), 2);
  IF sh > 1 AND sh <= na AND ar > 1 AND ar <= na THEN PRINT " & ";
  IF sh > 1 AND sh <= na THEN PRINT UCASE$(LEFT$(a$(sh), 1)); MID$(a$(sh), 2);
  a$ = RTRIM$(STR$(ae)) + "%"
  PRINT : LOCATE 12, 41: PRINT "  Armor Expertise: "; a$
  PRINT : PRINT "Weight Carryable:"; m%(0, 1) * 10; "Gronds  (";
  a$ = LTRIM$(RTRIM$(STR$(a * 10))): PRINT a$; " Dos)": PRINT
  s$ = LTRIM$(RTRIM$(STR$(wt))): PRINT "Weight carried:"; wt; "Gronds": PRINT
  LOCATE 22: GOSUB Lp6: CLS : LOCATE 24: GOTO Main
Status1:
  m = sa%(a)
  PRINT LEFT$("...", ABS(m < 1000) + ABS(m < 100) + ABS(m < 10));
  IF m <> sp%(a) THEN COLOR 2
  PRINT sa$(a); : COLOR 3: PRINT " / "; sp$(a)
  RETURN
'---------------------------------------------------------------------------
'  **** Look command ****
'
Look:
  IF lt = 0 THEN GOTO Main
  r = ro: GOSUB DiskRead: GOTO Pfoe
'---------------------------------------------------------------------------
' **** Say command ****
'
Say:
  GOSUB CheckSub: s$ = LTRIM$(RTRIM$(LEFT$(s$, 60)))
  s$ = UCASE$(LEFT$(s$, 1)) + LCASE$(MID$(s$, 2))
  a$ = "Okay, " + Q$ + LEFT$(s$, 60) + Q$ + ".": GOSUB Lp0
  GOTO Pfoe
'---------------------------------------------------------------------------
' **** Blast command ****
'
Blast:
  s = 1: GOSUB SpellCast: IF SUC = 0 THEN GOTO Pfoe
  GOSUB CheckSub: GOSUB Msearch: ta = 1: IF F = 0 THEN GOTO AttackItem
  IF m%(m, 11) <> 1 THEN
    GOSUB AtFr: IF s$ <> "y" THEN GOTO Main
    m%(m, 11) = m%(m, 11) - 1
    IF m%(m, 11) = 1 THEN
      a$ = m$(m) + " get's angry!": GOSUB Lp10
    END IF
    r3 = ro: GOSUB EnemyCheck
  END IF
  PRINT "ZAP!  Direct hit!": GOSUB Lp4
  s = 5: d = 2: df = m: a = 0: GOSUB Damage0: GOTO Pfoe
'---------------------------------------------------------------------------
' **** Heal command ****
'
Heal:
  s = 2: GOSUB SpellCast: m = 0: IF SUC = 0 THEN GOTO Pfoe
  IF s$ <> "" THEN GOSUB Msearch: IF F = 0 THEN GOTO Err4
  IF m%(m, 13) > 0 THEN
    a$ = m$(m) + MID$("'s'", ABS(LCASE$(RIGHT$(m$(0), 1)) = "s") * 2 + 1, 2)
    a$ = a$ + " health improves!": GOSUB Lp0
    m%(m, 13) = m%(m, 13) - 3 - 10 * RND
    IF m%(m, 13) < 0 THEN m%(m, 13) = 0
  END IF
  df = m: d2 = 0: GOSUB Mstatus: GOTO Pfoe
'---------------------------------------------------------------------------
' **** Speed command ****
'
Speed:
  s = 3: GOSUB SpellCast: IF SUC = 0 THEN GOTO Pfoe
  IF Speed <> 0 THEN PRINT "Nothing happened.": GOTO Lp12
  m%(0, 2) = m%(0, 2) * 2: Speed = INT(RND * 10 + 26)
  PRINT "Your agility temporarily increases!"
  GOTO Lp12
'---------------------------------------------------------------------------
' **** Power command ****
'
Power:
  s = 4: GOSUB SpellCast: IF SUC = 0 THEN GOTO Pfoe
'
' Add your own power spell effects here
'
'===========================================================================
  GOSUB RollDice: F = 0
'
'  35% chance of deadly ray
'
  IF rl < 36 THEN
    IF t(1) = 0 AND t(2) = 0 AND t(3) = m%(0, 1) THEN GOTO PowerFail
    r = 3: GOSUB Effect
    FOR df = 1 TO nm
       IF m%(df, 5) = ro THEN
	 FOR mc = 1 TO m%(df, 3)
	    d2 = 2: GOSUB Mstatus
	 NEXT
       END IF
    NEXT
    r3 = ro: GOSUB EnemyCheck: GOTO Pfoe
  END IF
'
'  25% chance of teleportation
'
  IF rl < 61 THEN
    rl = 25: GOSUB RollDice2: IF rl = ro THEN rl = rl + 1
    PRINT "The scene shifts and you find yourself teleported.": GOSUB Lp4
    r2 = rl: GOTO Move2
  END IF
'
'  30% chance of harmless gas
'
  IF rl < 91 THEN
    PRINT "A bluish gas fills the room.": GOTO Lp12
  END IF
'
'  10% chance of dropping weapons
'
   FOR a = 1 TO na
      IF a%(a, 4) = -1 AND (a%(a, 2) = 2 OR a%(a, 2) = 3) THEN
	F = 1: a%(a, 4) = ro: m%(0, 8) = 0
      END IF
   NEXT
   IF F = 1 THEN
     PRINT "All of your weapons fall to the ground!": GOTO Lp12
   END IF
PowerFail:
  PRINT "Energy flows through you, but nothing happens.": GOTO Lp12
'===========================================================================

'---------------------------------------------------------------------------
' **** Hints command ****
'
Hints:
  PRINT "Your question?": GOSUB Lp4
  FOR r = 1 TO nh
     PRINT r; "- "; h$(r): GOSUB Lp2
  NEXT
  GOSUB Lp1: LINE INPUT "Your choice?:"; a$: L = 0
  r = INT(VAL(a$)): IF r < 1 OR r > nh THEN GOTO Main
  GOSUB Lp1: PRINT h$(r): GOSUB Lp4
  OPEN "HINTS.DSC" FOR RANDOM AS #2 LEN = 255
  a = h%(r, 1) + h%(r, 2) - 1: s$ = ""
  FOR m = h%(r, 1) TO a
     GET #2, m, DS: a$ = RTRIM$(DS.TEXT): GOSUB Lp10
     IF m < a THEN
       PRINT "Another? (Y/N):";
       DO
       s$ = LCASE$(INKEY$)
       LOOP UNTIL s$ <> ""
       LOCATE CSRLIN, 1: PRINT "               "; : LOCATE CSRLIN, 1: L = 0
       IF s$ <> "y" THEN m = a
     END IF
  NEXT
  CLOSE #2: GOTO Main0
'---------------------------------------------------------------------------
' **** Save game ****
'
GameSave:
  OPEN "GAMEDIR.DAT" FOR INPUT AS #2
  INPUT #2, a
  IF a < 0 THEN a = 0
  FOR m = 1 TO 5
     LINE INPUT #2, gm$(m)
  NEXT: CLOSE #2
  PRINT "Saved games:": GOSUB Lp4
  FOR m = 1 TO 5
     PRINT m; " - "; gm$(m): GOSUB Lp2
  NEXT: PRINT 6; " - (Don't save, return to game)": GOSUB Lp2: GOSUB Lp1
  INPUT "Enter 1-6 for saved position:"; a$
  m = INT(VAL(a$))
  IF m < 1 OR m > 6 THEN GOTO GameSave
  IF m = 6 THEN GOTO Main
  IF m > a + 1 THEN
    PRINT "Use #"; a + 1; "first.": GOSUB Lp4: GOTO GameSave
  END IF
  IF m = a + 1 THEN a = a + 1
  IF gm$(m) <> "(none)" THEN
    PRINT "Enter a new description for save?"; : GOSUB AtFr1
    IF s$ <> "y" THEN GOTO GameSave1
  END IF
  PRINT "Enter new description:": GOSUB Lp4
  LINE INPUT "-->"; gm$(m): L = 1
GameSave1:
  OPEN "GAMEDIR.DAT" FOR OUTPUT AS #2
  PRINT #2, a
  FOR k = 1 TO 5
     PRINT #2, gm$(k)
  NEXT: CLOSE #2
  a$ = "GAME" + LTRIM$(RTRIM$(STR$(m))) + ".SAV"
  OPEN a$ FOR OUTPUT AS #2
  FOR a = 1 TO na
     FOR m = 0 TO 8
	PRINT #2, a%(a, m)
     NEXT
  NEXT
  FOR m = 0 TO nm
     FOR a = 0 TO 15
	PRINT #2, m%(m, a)
     NEXT
  NEXT
  FOR r = 1 TO nr
     FOR m = 0 TO 11
	PRINT #2, r%(r, m)
     NEXT
  NEXT
  FOR a = 1 TO 4
     PRINT #2, F(a), t(a), sa%(a), sp%(a)
  NEXT
  FOR a = 1 TO 5
     PRINT #2, wa%(a)
  NEXT
  FOR a = 1 TO 100
     PRINT #2, d%(a)
  NEXT
  PRINT #2, ac, ae, ar, bank, ch, die, ea, gold, ls, lt, nl, r3, ro, SE, sh
  PRINT #2, Speed, wt
  CLOSE #2
  PRINT "Game saved.": GOSUB Lp4
  GOTO Main
'---------------------------------------------------------------------------
' **** Restore saved game ****
'
GameRestore:
  OPEN "GAMEDIR.DAT" FOR INPUT AS #2
  INPUT #2, a
  FOR m = 1 TO 5
     LINE INPUT #2, gm$(m)
  NEXT: CLOSE #2
  PRINT "Saved games:": GOSUB Lp4
  FOR m = 1 TO 5
     PRINT m; " - "; gm$(m): GOSUB Lp2
  NEXT: PRINT 6; " - (Don't restore, return to game)": GOSUB Lp2: GOSUB Lp1
  INPUT "Enter 1-6 to restore a position:"; a$
  m = INT(VAL(a$))
  IF m < 1 OR m > 6 THEN GOTO GameRestore
  IF m = 6 THEN
    IF die = 1 THEN GOTO Dead
    GOTO Main
  END IF
  IF m > a THEN
    PRINT "There is no saved game there.": GOSUB Lp4: GOTO GameRestore
  END IF
  a$ = "GAME" + LTRIM$(RTRIM$(STR$(m))) + ".SAV"
  OPEN a$ FOR INPUT AS #2
  FOR a = 1 TO na
     FOR m = 0 TO 8
	INPUT #2, a%(a, m)
     NEXT
  NEXT
  FOR m = 0 TO nm
     FOR a = 0 TO 15
	INPUT #2, m%(m, a)
     NEXT
  NEXT
  FOR r = 1 TO nr
     FOR m = 0 TO 11
	INPUT #2, r%(r, m)
     NEXT
  NEXT
  FOR a = 1 TO 4
     INPUT #2, F(a), t(a), sa%(a), sp%(a)
  NEXT
  FOR a = 1 TO 5
     INPUT #2, wa%(a)
  NEXT
  FOR a = 1 TO 100
     INPUT #2, d%(a)
  NEXT
  INPUT #2, ac, ae, ar, bank, ch, die, ea, gold, ls, lt, nl, r3, ro, SE, sh
  INPUT #2, Speed, wt
  CLOSE #2
  CZ$ = "": r2 = ro: GOTO Move2
'---------------------------------------------------------------------------
' **** Quit, leave the Eamon system ****
'
Quit:
  OPEN "GAMEDIR.DAT" FOR INPUT AS #2: INPUT #2, a: CLOSE #2
  IF a < 1 THEN
    COLOR 2: L = 0
    a$ = "!! WARNING !!  You haven't saved a game yet, any progress that you "
    a$ = a$ + "have made will be lost and you'll have to start back at the "
    a$ = a$ + "beginning when you return.": GOSUB Lp10: COLOR 3
  END IF
  PRINT "Are you sure you want to quit?"; : GOSUB AtFr1
  IF s$ <> "y" THEN GOTO Main
  CLS : CHDIR "..": RUN "STARTUP.BAS"
  END
'---------------------------------------------------------------------------
' **** End of game routines ****
'
EndGame:
  GOSUB Lp1: GOSUB Lp6
  IF die = 0 THEN
    PRINT "Leave this adventure?"; : GOSUB AtFr1
    IF s$ <> "y" THEN GOTO Main
  END IF
  a = 0: m = 0: w = 0: IF Speed THEN m%(0, 2) = m%(0, 2) / 2
  IF die = 1 THEN GOTO Dead
  IF ar > 1 AND ar <= na THEN
    a%(ar, 4) = 0: a = a%(ar, 5)
  END IF
  IF sh > 1 AND sh <= na THEN
    a%(sh, 4) = 0: m = 1
  END IF
  IF ac < 7 THEN ac = a + m
  FOR a = 1 TO na
     wp%(a) = 0
     IF a%(a, 4) = -999 THEN a%(a, 4) = -1
     IF a%(a, 4) > 1000 AND a%(a, 4) < 2001 THEN
       k = a%(a, 4) - 1000
       IF a%(k, 4) = -1 AND a%(a, 0) > 0 THEN a%(a, 4) = -1
     END IF
     IF a%(a, 4) = -1 AND (a%(a, 2) = 2 OR a%(a, 2) = 3) THEN
       w = w + 1: wp%(w) = a: a%(a, 4) = 0
     END IF
  NEXT
  IF w < 5 THEN GOTO EndGame1
  s$ = "Lord William Missilefire"
  GOSUB Lp7: a$ = "As you enter the Main Hall, " + s$ + " approaches you "
  a$ = a$ + "and says, " + Q$ + "You have too many weapons -- 4 is the "
  a$ = a$ + "legal limit." + Q$: GOSUB Lp0: GOSUB Lp6
SellWep:
  GOSUB Lp7: PRINT "Your weapons are:": GOSUB Lp4
  s$ = "......................"
  FOR a = 1 TO w
     m = wp%(a)
     PRINT SPC(ABS(a < 10) + ABS(a < 100) + 5); a; ": ";
     a$ = LEFT$(a$(m), 20): PRINT a$;
     PRINT LEFT$(s$, 22 - LEN(a$)); "("; LTRIM$(RTRIM$(STR$(a%(m, 7))));
     PRINT "D"; LTRIM$(RTRIM$(STR$(a%(m, 8)))); ")": GOSUB Lp2
  NEXT: GOSUB Lp1
  INPUT "Enter the number of the weapon to sell:"; a$
  m = INT(VAL(a$)): IF m < 1 OR m > w THEN GOTO SellWep
  a%(wp%(m), 4) = -1: w = w - 1: IF m = w + 1 AND w > 4 THEN GOTO SellWep
  wp%(m) = wp%(w + 1): IF w > 4 THEN GOTO SellWep
EndGame1:
  GOSUB Lp7: a$ = "You deliver your goods to Sam Slicker, the local buyer of "
  a$ = a$ + "treasure.  He looks them over and pays you what they are worth..."
  GOSUB Lp0: GOSUB Lp1: tp = 0
  FOR a = 1 TO naf
     IF a%(a, 4) = -1 THEN
       x = 0
       IF a%(a, 2) > 0 THEN IF ch > 15 THEN x = .05: IF ch > 20 THEN x = .1
       m = CINT(a%(a, 1) + a%(a, 1) * x): tp = tp + m
       PRINT UCASE$(LEFT$(a$(a), 1)); MID$(a$(a), 2);
       IF RIGHT$(a$(a), 1) = "s" THEN PRINT " are";
       IF RIGHT$(a$(a), 1) <> "s" THEN PRINT " is";
       PRINT " worth "; m; " gold pieces.": GOSUB Lp4
     END IF
  NEXT
  GOSUB Lp1: PRINT "He pays you "; tp; " gold pieces total."
  GOSUB Lp4: gold = INT(gold + tp): IF gold < 0 THEN gold = 0
  GOSUB Lp6
'
'  Kill player files and return to Main Hall
'
ExitRtn:
  CLOSE
  OPEN "GAMEDIR.DAT" FOR OUTPUT AS #1
  PRINT #1, -1
  FOR m = 1 TO 5
     PRINT #1, "(none)"
  NEXT: CLOSE
  FOR m = 1 TO 5
     a$ = "GAME" + LTRIM$(RTRIM$(STR$(m))) + ".SAV"
     OPEN a$ FOR OUTPUT AS #1: PRINT #1, 1: CLOSE : KILL a$
  NEXT
  KILL "NEW-MEAT"
'
' Update player record data
'
r = z.Status
z.CNAME = m$(0): z.Status = 1: z.A1 = m%(0, 1): z.a2 = m%(0, 2)
IF die = 1 THEN z.Status = 2
z.a3 = ch: z.SP1 = sp%(1): z.SP2 = sp%(2): z.SP3 = sp%(3): z.SP4 = sp%(4)
z.WA1 = wa%(1): z.WA2 = wa%(2): z.WA3 = wa%(3): z.WA4 = wa%(4): z.WA5 = wa%(5)
z.ae = ae: z.sex = sex: z.gold = gold: z.bank = bank: z.ac = ac
a = wp%(1): m = wp%(2): k = wp%(3): w = wp%(4)
z.WN1 = a$(a): z.WN2 = a$(m): z.WN3 = a$(k): z.WN4 = a$(w)
z.WCOMPLX1 = a%(a, 5): z.WCOMPLX2 = a%(m, 5): z.WCOMPLX3 = a%(k, 5)
z.WCOMPLX4 = a%(w, 5): z.WTYPE1 = a%(a, 6): z.WTYPE2 = a%(m, 6)
z.WTYPE3 = a%(k, 6): z.WTYPE4 = a%(w, 6): z.WDICE1 = a%(a, 7)
z.WDICE2 = a%(m, 7): z.WDICE3 = a%(k, 7): z.WDICE4 = a%(w, 7)
z.WSIDES1 = a%(a, 8): z.WSIDES2 = a%(m, 8): z.WSIDES3 = a%(k, 8)
z.WSIDES4 = a%(w, 8)
CLOSE
'
' Return to Test Bench
'
IF r < 1 THEN
  CHDIR "..": CHDIR "DD": RUN "DDMENU.BAS"
END IF
'
' Return to Main Hall
'
CHDIR "..": CHDIR "MAIN"
OPEN "PLAYERS.DAT" FOR RANDOM AS #1 LEN = 200
PUT #1, r, z
CLOSE
OPEN "PLAYER" FOR OUTPUT AS #2: WRITE #2, r: CLOSE
IF die <> 1 THEN RUN "MAINHALL.BAS"
CHDIR "..": RUN "STARTUP.BAS"
'
' Player died
'
Dead:
  CLS
  PRINT "You have perished.  Now what?"
  PRINT "1. Restore a saved game"
  PRINT "2. Start over"
  PRINT "3. Give up, accept death": PRINT
  LINE INPUT "Your choice?"; a$: a = INT(VAL(a$))
  IF a < 1 OR a > 3 THEN GOTO Dead
  IF a = 3 THEN GOTO ExitRtn
  IF a = 2 THEN RUN
  GOTO GameRestore
'---------------------------------------------------------------------------
' Most-useful and main subroutines
'
' Read text from DESC file
'
Effect:
  r = r + 1230
DiskRead:
IF r < 401 THEN GET #10, r + adj1, DS
IF r > 400 AND r < 801 THEN GET #11, r - 400 + adj2, DS
IF r > 800 AND r < 1201 THEN GET #12, r - 800 + adj3, DS
IF r > 1200 THEN GET #13, r - 1200, DS
a$ = RTRIM$(DS.TEXT): GOSUB Lp0: GOTO Lp1
'
' Print a$ without wrap-around
'
Lp0:
  a$ = LTRIM$(a$)
  IF LEN(a$) <= 79 THEN PRINT a$:  GOTO Lp2
  FOR k = 79 TO 1 STEP -1
     IF MID$(a$, k, 1) = " " THEN
       PRINT LEFT$(a$, k - 1): a$ = RIGHT$(a$, LEN(a$) - k)
       GOSUB Lp2: k = 1
     END IF
  NEXT: GOTO Lp0
'
' Line counter & pause routines
'
Lp1:
  PRINT
Lp2:
  L = L + 1: GOTO Lp5
Lp3:
  L = L + 1
Lp4:
  L = L + 2: PRINT
Lp5:
  IF L < 20 THEN RETURN
Lp6:
  PRINT "[MORE]";
  DO
  LOOP UNTIL INKEY$ > ""
  LOCATE CSRLIN, 1: PRINT "      "; : LOCATE CSRLIN, 1: L = 0: RETURN
Lp7:
  CLS : L = 0: RETURN
Lp8:
  GOSUB Lp0: GOTO Main
Lp9:
  GOSUB Lp0: GOTO Pfoe
Lp10:
  GOSUB Lp0: GOTO Lp1
Lp11:
  GOSUB DiskRead: L = L - 1: LOCATE CSRLIN - 1, 1: RETURN
Lp12:
  GOSUB Lp4: GOTO Pfoe
'---------------------------------------------------------------------------
' Player input error messages
'
Err0:
  PRINT "Movement commands:"
  FOR c = 1 TO nd
     PRINT UCASE$(c$(c)),
  NEXT: PRINT UCASE$(c$(11)): PRINT
  PRINT "Artifact manipulation:"
  FOR c = 12 TO 26
     PRINT UCASE$(c$(c)),
  NEXT: PRINT : PRINT
  PRINT "Interactive:"
  FOR c = 27 TO 33
     PRINT UCASE$(c$(c)),
  NEXT: PRINT : PRINT
  PRINT "Miscelaneous:"
  FOR c = 34 TO 43
     PRINT UCASE$(c$(c)),
  NEXT: PRINT : PRINT
  L = 99: GOTO Main0
Err1:
  PRINT "You aren't carrying that and you can't see it here.": GOTO Main0
Err2:
  PRINT "You must first open it.": GOTO Main0
Err3:
  a$ = "You can't " + c$(c) + " " + s$ + ".": GOTO Lp8
Err4:
  PRINT "Nobody here by that name!": GOTO Main0
'---------------------------------------------------------------------------
' Attack friend
'
AtFr:
  PRINT "Attack non-enemy?";
AtFr1:
  LINE INPUT "  (Y/N):"; s$: s$ = LTRIM$(RTRIM$(LCASE$(s$)))
  s$ = LEFT$(s$, 1)
  IF s$ = "" OR (s$ <> "y" AND s$ <> "n") THEN GOTO AtFr1
  L = 1: PRINT : RETURN
'---------------------------------------------------------------------------
' Synonym checker
'
Synonym:
  SL = LEN(s$): sy$ = "": sy = 0
  IF ro = 26 THEN
    sy$ = "drapes": sy = 25: GOSUB Synonym1
  END IF
  IF ro = 26 AND s$ <> a$(25) THEN
    sy$ = "wall": sy = 25: GOSUB Synonym1
  END IF
  RETURN
Synonym1:
  IF LEFT$(sy$, SL) = s$ OR RIGHT$(sy$, SL) = s$ THEN s$ = a$(sy)
  RETURN
'---------------------------------------------------------------------------
'
' Set up enemy factor and see who folows player
'
EnemyCheck:
  t(1) = 0: t(2) = 0: t(3) = m%(0, 1)
  FOR xm = 1 TO nm
     IF m%(xm, 5) = r3 THEN
       IF m%(xm, 11) > 100 THEN
	 rl = m%(xm, 11) - 100 + (ch - 10) * 2
	 x = 1 + ABS(rl > RND * 100) + ABS(x = 2 AND rl > RND * 200)
	 m%(xm, 11) = x
       END IF
       IF m%(xm, 11) = 3 THEN m%(xm, 5) = ro
       IF m%(xm, 11) = 1 THEN
	 IF INT(RND * 100) + 1 <= m%(xm, 4) THEN m%(xm, 5) = ro
       END IF
     END IF
  NEXT xm
Ec1:
  FOR xm = 1 TO nm
     IF m%(xm, 5) = ro THEN
       IF m%(xm, 11) > 3 THEN
	 rl = m%(xm, 11) - 100 + (ch - 10) * 2
	 k = 1 + ABS(rl > INT(RND * 100 + 1))
	 k = k + ABS(k = 2 AND rl > INT(RND * 200 + 1))
	 m%(xm, 11) = k
       END IF
       t(m%(xm, 11)) = t(m%(xm, 11)) + m%(xm, 1) * m%(xm, 3)
     END IF
  NEXT xm
  RETURN
'---------------------------------------------------------------------------
' Monster tries to get a weapon
'
GetWep:
  IF m%(of, 6) = -2 THEN RETURN
  w = ABS(m%(of, 8)) - 1
  IF w > 0 AND w <= na THEN
    IF a%(w, 0) = 1 AND (a%(w, 2) = 2 OR a%(w, 2) = 3) AND a%(w, 4) = ro THEN GOTO GetWep1
  END IF
  w = 0
  FOR x = 1 TO na
     IF a%(x, 4) = ro THEN
       IF (a%(x, 2) = 2 OR a%(x, 2) = 3) THEN
	 IF a%(x, 0) = 1 AND a%(x, 7) * a%(x, 8) > a%(w, 7) * a%(w, 8) THEN w = x
       END IF
     END IF
  NEXT
GetWep1:
  IF w > 0 THEN
    a$ = m$(of) + " picks up " + a$(w) + ".": GOSUB Lp0
    a%(w, 4) = -of - 1: m%(of, 8) = w: GOTO Lp4
  END IF
  FOR x = 1 TO na
     IF a%(x, 4) = -of - 1 THEN
       IF (a%(x, 2) = 2 OR a%(x, 2) = 3) THEN
	 IF a%(x, 7) * a%(x, 8) > a%(w, 7) * a%(w, 8) THEN w = x
       END IF
     END IF
  NEXT
  IF w > 0 THEN
    a$ = m$(of) + " readies " + a$(w) + ".": GOSUB Lp0
    m%(of, 8) = w: GOTO Lp4
  END IF
  IF m%(of, 6) = -1 AND m9 = 1 THEN GOTO Battle0
  RETURN
'---------------------------------------------------------------------------
'  Combat routine
'
Battle:
  IF m%(of, 6) = -2 THEN RETURN
  w2 = 0: IF m%(0, 8) > 1 AND m%(0, 8) >= na THEN w2 = a%(m%(0, 8), 6)
  hi = 0: w = m%(of, 8)
  IF w < 0 THEN GOTO GetWep
Battle0:
' Compute players armor factor
'
  a3 = 0: IF ar > 1 AND ar <= na THEN a3 = a%(ar, 5)
  IF sh > 1 AND sh <= na THEN a3 = a3 + 1
  IF a2 > 7 THEN a3 = 7
  ea = 0: IF ae < a3 * a3 THEN ea = ae - ac * ac
'
'  Compute odds to hit
'
  wm = 50 + 2 * (m%(of, 2) - m%(df, 2) - m%(of, 7) + m%(df, 7))
  IF w > 0 THEN wm = wm + a%(w, 5) / 2
  IF of = 0 THEN wm = wm + wa%(w2) / 4 + ea
  a = a%(w, 6) * ABS(w > 0)
  a$ = m$(of) + " " + bv$(a, INT(RND * 3)) + " at " + m$(df) + "..."
  GOSUB Lp0: GOSUB RollDice
  IF (rl < 5 OR rl < wm) AND rl < 97 THEN
    hi = 1: GOTO Battle1
  END IF
  a2 = 0
  IF m%(df, 8) > 0 THEN a2 = a%(m%(df, 8), 6)
  IF rl < 97 OR w = 0 THEN
    PRINT " --- "; rb$(a2, INT(RND * 2)); "!": GOTO Lp4
  END IF
  PRINT "...A fumble!": GOSUB Lp2: r = INT(RND * 100 + 1)
  IF r < 41 THEN
    PRINT "    Recovered.": GOTO Lp4
  END IF
  IF r < 81 THEN
    a$ = m$(of) + " drops " + a$(w) + "!": GOSUB Lp0
    wt = wt - (ABS(of = 0) * a%(w, 3)): a%(w, 4) = ro
    m%(of, 8) = -w - 1:  GOTO Lp1
  END IF
  IF a%(w, 2) = 3 THEN
    a$ = "Sparks fly from " + a$(w) + "!": GOTO Lp9
  END IF
  IF r > 95 THEN
    PRINT " Weapon hits user!": GOSUB Lp4: df = of
    ON ABS(r = 100) + 1 GOTO Battle2, Battle3
  END IF
  IF r < 91 THEN
    a%(w, 8) = a%(w, 8) - 1
    IF a%(w, 8) > 0 THEN
      PRINT " Weapon damaged!": GOTO Lp4
    END IF
  END IF
  PRINT " Weapon broken!": wt = wt - (ABS(of = 0) * a%(w, 3))
  a%(w, 4) = 0: m%(of, 8) = -1
  IF RND > .5 THEN GOTO Lp4
  PRINT " Broken weapon hits user!": GOSUB Lp4: df = of
  ON ABS(r = 100) + 1 GOTO Battle2, Battle3
Battle1:
  IF of = 0 THEN
    up = ABS(INT(RND * 100) + 1 > wm + wa%(w2))
    IF INT(RND * 100) + 1 < wa%(w2) THEN
      IF ABS(ea) > INT(RND * 10) + 1 AND ae < a3 * a3 AND ae < 65 THEN
	ae = ae + 2
	s$ = MID$("'s'", ABS(LCASE$(RIGHT$(m$(0), 1)) = "s") * 2 + 1, 2)
	a$ = m$(0) + s$ + " armor expertise just increased!": GOSUB Lp10
      END IF
    END IF
  END IF
Battle2:
  d = m%(of, 9): s = m%(of, 10)
  IF w > 0 THEN
    d = a%(w, 7): s = a%(w, 8)
  END IF
  a = 1: PRINT MID$(" ***  +++ ", ABS((df > 0)) * 5 + 1, 5);
  IF rl > 5 THEN
    PRINT "A hit!": GOSUB Lp2: GOTO Damage0
  END IF
Battle3:
  PRINT "Well struck!": GOSUB Lp2: r2 = INT(RND * 100) + 1
  IF r2 < 51 THEN
    a = 0: GOTO Damage0
  END IF
  rl = 1.5
  IF r2 > 85 THEN
    rl = 2: GOTO Damage0
  END IF
  IF r2 > 95 THEN
    rl = 3: GOTO Damage0
  END IF
  IF r2 = 100 THEN rl = m%(df, 1)
  s = rl * s
Damage0:
  d2 = 0
  FOR k = 1 TO d
     d2 = d2 + INT(RND * s) + 1
  NEXT
  d2 = INT(d2 - a * m%(df, 7))
  IF d2 < 1 AND m%(df, 7) = 0 THEN
    PRINT "  Blow turned!": GOTO Lp4
  END IF
Damage1:
  IF d2 < 1 THEN
    PRINT "  Armor absorbs damage!": GOTO Lp4
  END IF
'---------------------------------------------------------------------------
' Add damage/report monster's health
'
Mstatus:
  IF m%(df, 3) > 1 THEN PRINT "One ";
  PRINT m$(df); " is ";
  m%(df, 13) = m%(df, 13) + d2
  IF m%(df, 13) >= m%(df, 1) THEN GOTO Mdead
  IF m%(df, 13) = 0 THEN GOTO Ms1
  xm% = m%(df, 13) * 5 / m%(df, 1) + 1
  ON xm% GOTO Ms2, Ms3, Ms4, Ms5, Ms6, Ms6
  PRINT xm%: END
Ms1:
  PRINT "in perfect health.": GOTO Lp4
Ms2:
  PRINT "still in good shape.": GOTO Lp4
Ms3:
  PRINT "hurting.": GOTO Lp4
Ms4:
  PRINT "in pain.": GOTO Lp4
Ms5:
  PRINT "badly injured.": GOTO Lp4
Ms6:
  PRINT "at death's door, knocking loudly.": GOTO Lp4
'---------------------------------------------------------------------------
' Monster dies
'
Mdead:
  PRINT "dead!"
  IF m%(df, 3) > 1 THEN
    m%(df, 3) = m%(df, 3) - 1: m%(df, 13) = 0: GOTO Mdead2
  END IF
  IF df = 0 THEN die = 1: GOTO Lp4
  m%(df, 8) = -1 * ABS(m%(df, 8) <> 0): m%(df, 5) = 0
  m%(df, 3) = m%(df, 12): m%(df, 13) = 0
  FOR a2 = 1 TO na
     IF a%(a2, 4) = -df - 1 THEN a%(a2, 4) = ro
  NEXT a2
Mdead0:
'
' Add special effects of a monsters death here
'
'===========================================================================
Clone:
  rl = nr: GOSUB RollDice2: IF rl = ro OR rl = 27 OR rl = 28 THEN GOTO Clone
  IF a%(10, 4) <> 0 AND df > 12 AND df < 21 THEN
    GOSUB Lp4: COLOR 2
    PRINT "You hear a loud humming sound from all directions.": COLOR 3
    m%(df, 5) = rl: m%(df, 3) = INT(RND * 4) + 1: GOSUB Lp2
'    PRINT m%(df, 3); m$(df); "s in room"; m%(df, 5): GOSUB Lp2
  END IF
'===========================================================================
Mdead2:
  w = m%(df, 11): t(w) = t(w) - m%(df, 1)
  GOTO Lp4
'---------------------------------------------------------------------------
' Was player's spell successful?
'
SpellCast:
  SUC = 0: GOSUB RollDice: rl = rl * ABS(sp%(s) > 0)
  IF (rl < sa%(s) OR rl < 5) AND rl < 100 AND rl > 0 THEN SUC = 1
  IF rl = 100 THEN
    a$ = "Spell backlash!!  Your ability to cast the " + c$(c) + " spell "
    a$ = a$ + "temporarily diminishes!": GOSUB Lp0
    sa%(s) = sa%(s) / 10
  END IF
  IF SUC = 0 THEN
    PRINT "Nothing happened.": GOSUB Lp2
  END IF
  IF SUC = 1 THEN
    GOSUB RollDice
    IF rl > sp%(s) THEN
      sp%(s) = sp%(s) + 2: sa%(s) = sa%(s) + 2
      a$ = m$(0) + MID$("'s'", (LCASE$(RIGHT$(m$(0), 1)) = "s") * 2 + 1, 2)
      a$ = a$ + " ability to cast " + c$(c) + " just increased by 2!"
      GOSUB Lp0: GOSUB Lp1
    END IF
    IF sa%(s) > 9 THEN sa%(s) = sa%(s) / 2
  END IF
  RETURN
'---------------------------------------------------------------------------
' Get a random roll between 1 and RL
'
RollDice:
  rl = 100
RollDice2:
  rl = INT(RND * rl + 1)
  RETURN
'---------------------------------------------------------------------------
' Get an item before doing something with it (Ready/Wear/Etc.)
'
ItemTake:
  IF a%(a, 4) = -1 THEN RETURN
  PRINT "(Taking it first.)"
  IF wt + a%(a, 3) > m%(0, 1) * 10 THEN
    PRINT "It's too heavy.": GOSUB Lp2: RETURN
  END IF
  a%(a, 4) = -1: wt = wt + a%(a, 3): RETURN
'---------------------------------------------------------------------------
' Monster search routine
'
Msearch:
  WH = ro: HA = WH
Msearch0:
  F = 0: SL = LEN(s$): m = 0
  FOR x = 1 TO nm
     IF s$ = LCASE$(m$(x)) THEN
       IF m%(x, 5) = WH OR m%(x, 5) = HA THEN
	 m = x: F = F + 1:  x = nm:  GOTO Msearch1
       END IF
     END IF
     IF s$ = LEFT$(LCASE$(m$(x)), SL) OR s$ = RIGHT$(LCASE$(m$(x)), SL) THEN
       IF m%(x, 5) = WH OR m%(x, 5) = HA THEN
	 m = x: F = F + 1
       END IF
     END IF
Msearch1:
  NEXT
  IF F = 0 THEN
    IF RIGHT$(s$, 1) = "s" AND SL > 1 THEN
      s$ = LEFT$(s$, SL - 1): GOTO Msearch0
    END IF
  END IF
  RETURN
'---------------------------------------------------------------------------
' Artifact search routine
'
Asearch:
  HA = -1: WH = HA: EM = HA: GOTO Asearch2
Asearch0:
  HA = -1
Asearch1:
  WH = ro: EM = ro + 2000
Asearch2:
  GOSUB Synonym: F = 0
  FOR x = 1 TO na
     IF s$ = LCASE$(a$(x)) THEN
       a2 = a%(x, 4)
       IF a2 = HA OR a2 = WH OR a2 = EM THEN
	 a = x: F = F + 1: a = x: x = na: F = 1: GOTO Asearch3
       END IF
     END IF
     IF s$ = LEFT$(LCASE$(a$(x)), SL) OR s$ = RIGHT$(LCASE$(a$(x)), SL) THEN
       a2 = a%(x, 4)
       IF a2 = HA OR a2 = WH OR a2 = EM THEN
	 a = x: F = F + 1
       END IF
     END IF
Asearch3:
  NEXT
  IF F > 1 THEN
    F = 0: a$ = "(Which " + Q$ + s$ + Q$ + " do you mean?)": GOSUB Lp0
  END IF
  RETURN
'---------------------------------------------------------------------------
' Check/get s$
'
CheckSub:
  IF s$ <> "" THEN RETURN
CheckSub1:
  PRINT UCASE$(LEFT$(c$(c), 1)); MID$(c$(c), 2);
  LINE INPUT " who or what?", s$: s$ = LCASE$(LTRIM$(RTRIM$(s$)))
  PRINT : L = 1: GOTO CheckSub
'---------------------------------------------------------------------------
' Check/get s2$
'
CheckSub2:
  IF s2$ <> "" THEN RETURN
  PRINT a$; : LINE INPUT "?"; s2$: s2$ = LTRIM$(RTRIM$(LCASE$(s2$)))
  L = 1: PRINT : GOTO CheckSub2

'---------------------------------------------------------------------------
'  Input data from files
'
Init:
OPEN "ROOMS.DAT" FOR RANDOM AS #1 LEN = 101
OPEN "ARTIFACT.DAT" FOR RANDOM AS #2 LEN = 51
OPEN "MONSTERS.DAT" FOR RANDOM AS #3 LEN = 61
OPEN "NEW-MEAT" FOR RANDOM AS #4 LEN = 200
FOR c = 1 TO nc
   READ c$(c)
NEXT
'
'   Rooms
'
FOR r = 1 TO nr
   GET #1, r + adj1, rm
   r$(r) = RTRIM$(rm.RNAME)
   r%(r, 1) = rm.D1: r%(r, 2) = rm.d2: r%(r, 3) = rm.D3: r%(r, 4) = rm.D4
   r%(r, 5) = rm.D5: r%(r, 6) = rm.D6: r%(r, 7) = rm.D7: r%(r, 8) = rm.D8
   r%(r, 9) = rm.D9: r%(r, 10) = rm.D10: r%(r, 11) = rm.Light
NEXT
'
'   Artifacts
'
FOR a = 1 TO naf
   GET #2, a + adj2, art
   a$(a) = RTRIM$(art.aname): a%(a, 1) = art.AD1: a%(a, 2) = art.AD2
   a%(a, 3) = art.AD3: a%(a, 4) = art.AD4: a%(a, 5) = art.AD5
   a%(a, 6) = art.AD6: a%(a, 7) = art.AD7: a%(a, 8) = art.AD8
NEXT
'
'   Monsters
'
FOR m = 1 TO nm
   GET #3, m + adj3, mon
   m$(m) = RTRIM$(mon.MNAME): m%(m, 1) = mon.MD1: m%(m, 2) = mon.MD2
   m%(m, 3) = mon.MD3: m%(m, 4) = mon.MD4: m%(m, 5) = mon.MD5
   m%(m, 6) = mon.MD6: m%(m, 7) = mon.MD7: m%(m, 8) = mon.MD8
   m%(m, 9) = mon.MD9: m%(m, 10) = mon.MD10: m%(m, 11) = mon.MD11
   m%(m, 12) = m%(m, 3): m%(m, 14) = mon.MD12: m%(m, 15) = mon.MD13
NEXT
'
'   PLAYER
'
a = 1
GET #4, a, z
m$(0) = RTRIM$(z.CNAME): stat = z.Status: m%(0, 1) = z.A1: m%(0, 2) = z.a2
ch = z.a3: sp%(1) = z.SP1: sp%(2) = z.SP2: sp%(3) = z.SP3: sp%(4) = z.SP4
wa%(1) = z.WA1: wa%(2) = z.WA2: wa%(3) = z.WA3: wa%(4) = z.WA4: wa%(5) = z.WA5
ae = z.ae: sex = z.sex: gold = z.gold: bank = z.bank: ac = z.ac
a = naf + 1: m = a + 1: k = a + 2: w = a + 3
a$(a) = RTRIM$(z.WN1): a$(m) = RTRIM$(z.WN2): a$(k) = RTRIM$(z.WN3)
a$(w) = RTRIM$(z.WN4): a%(a, 5) = z.WCOMPLX1: a%(m, 5) = z.WCOMPLX2
a%(k, 5) = z.WCOMPLX3: a%(w, 5) = z.WCOMPLX4: a%(a, 6) = z.WTYPE1
a%(m, 6) = z.WTYPE2: a%(k, 6) = z.WTYPE3: a%(w, 6) = z.WTYPE4
a%(a, 7) = z.WDICE1: a%(m, 7) = z.WDICE2: a%(k, 7) = z.WDICE3
a%(w, 7) = z.WDICE4: a%(a, 8) = z.WSIDES1: a%(m, 8) = z.WSIDES2
a%(k, 8) = z.WSIDES3: a%(w, 8) = z.WSIDES4
CLOSE
FOR a = 1 TO 4
   sa%(a) = sp%(a)
NEXT
'
na = naf
FOR a = 1 TO 4
   a$ = UCASE$(LEFT$(a$(naf + a), 4))
   IF a$ <> "NONE" AND a$ <> "" THEN na = na + 1
NEXT
FOR a = naf + 1 TO na
   a%(a, 2) = 2 + ABS((a%(a, 7) * a%(a, 8) > 25))
   a%(a, 3) = 2: wt = wt + 2: : a%(a, 4) = -1
NEXT
m%(0, 7) = ac / 2 + ABS((sh > 0)): m%(0, 11) = 3
m%(0, 8) = -1: IF na > naf THEN m%(0, 8) = naf + 1
IF ae < ac * ac THEN ea = ae - ac * ac
'
'   Make players armor artifacts
'
FOR a = 1 TO 4
   READ wp$(a)
NEXT
a = INT(ac / 2)
IF a > 4 THEN a = 4
IF a THEN
  na = na + 1: a$(na) = wp$(a) + " armor": a%(na, 2) = 11: a%(na, 3) = a * 7
  a%(na, 4) = -999: wt = wt + a%(na, 3): ar = na
  a%(na, 5) = ac - ABS(ac / 2 <> INT(ac / 2))
END IF
a = ABS((INT(ac / 2) <> ac / 2))
IF a THEN
  na = na + 1: sh = na: a$(na) = "shield": a%(na, 2) = 11: a%(na, 3) = 10
  a%(na, 4) = -999: wt = wt + 10: a%(na, 5) = 1
END IF
'
'   Check for duplicate Art. names
'
CheckDup:
r = 0
FOR a = 1 TO na
   a$(a) = LTRIM$(RTRIM$(a$(a)))
   FOR m = a + 1 TO na
      IF LCASE$(a$(m)) = LCASE$(a$(a)) THEN
	a$(m) = a$(m) + "#": r = 1
      END IF
   NEXT
NEXT
IF r = 1 THEN GOTO CheckDup
'
'    Set starting variable values
'
ro = 1: r2 = 1: r3 = 1: Q$ = CHR$(34)
IF m%(0, 8) <> -1 THEN w2 = a%(m%(0, 8), 5)
FOR a = 0 TO 5
   FOR a2 = 0 TO 2
      READ bv$(a, a2)
   NEXT
NEXT
FOR a = 0 TO 5
   FOR a2 = 0 TO 1
      READ rb$(a, a2)
   NEXT
NEXT
FOR a = 1 TO 3
   READ sm$(a)
NEXT
FOR a = 1 TO 5
   READ wp$(a)
NEXT
sex$(0) = "Male": sex$(1) = "Female"
IF nd = 6 THEN
  FOR c = 7 TO 10: c$(c) = "": NEXT
END IF
FOR a = naf + 1 TO na
   a%(a, 0) = 1
NEXT
OPEN "ROOMS.DSC" FOR RANDOM AS #10 LEN = 255
OPEN "ARTIFACT.DSC" FOR RANDOM AS #11 LEN = 255
OPEN "MONSTERS.DSC" FOR RANDOM AS #12 LEN = 255
OPEN "EFFECT.DSC" FOR RANDOM AS #13 LEN = 255

'===========================================================================
FOR a = 5 TO 8: a%(a, 0) = 1: NEXT

'===========================================================================
'
' Ranomize the RND seed
'
CLS : LOCATE 12
PRINT "Welcome to the Eamon Deluxe fantasy gaming system! (MAINPGM v1.0)"
PRINT : PRINT "Hit any key to begin."
a$ = INKEY$
DO
  a = RND
LOOP UNTIL INKEY$ <> ""
CLS : LOCATE 24: GOTO Move2

DATA 43,north,south,east,west,up,down,ne,nw,se,sw,flee,close,destroy,drink
DATA drop,eat,examine,get,light,open,put,read,ready,remove,use,wear,attack
DATA blast,free,give,heal,request,smile,inventory,look,say,speed,power,status
DATA hints,save,restore,quit

'
DATA leather,chain,plate,magic
'
DATA lunges,tears,claws,swings,chops,swings,shoots,shoots,shoots
DATA swings,swings,swings,stabs,lunges,jabs,swings,chops,stabs
'
DATA Missed,Missed,Parried,Missed,Missed,Missed,Parried,Missed,Parried,Missed
DATA Parried,Missed
'
DATA growl,ignore,smile
'
DATA axe,missile weapon,club,spear,sword

