;
; InitSystem: Loads all screens, sounds and songs into memory.  This
; subroutine will NOT terminate normally if a disk/memory error occurs;
; the system will instead print an error message and then shut down.
;
SUB InitSystem
 $filename := "Walls.PIC"
T @$filename ...
 LOAD SCREEN 0, $filename	; SCREEN BUFFER 0 = WALLS
 CALL CheckForError

 $filename := "Floors.PIC"
T @$filename ...
 LOAD SCREEN 1, $filename	; SCREEN BUFFER 1 = FLOORS
 Call CheckForError

 $filename := "BackWall.PIC"
T @$filename ...
 LOAD SCREEN 2, $filename	; SCREEN BUFFER 2 = BACKWALLS
 Call CheckForError

 $filename := "GameScreen.PIC"
T @$filename ...
 LOAD SCREEN 3, $filename	; SCREEN BUFFER 3 = GAMESCREEN (DBUF 1)
 Call CheckForError

 $filename := "Brushes.PIC"
T @$filename ...
 LOAD SCREEN 4, $filename	; SCREEN BUFFER 4 = BRUSHES, MAZE
 Call CheckForError

 $filename := "GameScreen.PIC"
T @$filename  (for second buffer)...
 LOAD SCREEN 5, $filename	; SCREEN BUFFER 5 = GAMESCREEN (DBUF 2)
 Call CheckForError

 $filename := "About.PIC"
T @$filename ...
 LOAD SCREEN 6, $filename	; SCREEN BUFFER 6 = ABOUT
 Call CheckForError

 $filename := "Monster.1"
T @$filename ...
 LOAD SCREEN 7, $filename	; SCREEN BUFFER 7 = MONSTER 1 (EYE)
 Call CheckForError

 $filename := "Monster.2"
T @$filename ...
 LOAD SCREEN 8, $filename	; SCREEN BUFFER 8 = MONSTER 2 (SNAKE)
 Call CheckForError

 $filename := "MASK Buffer Screen"
 CREATE SCREEN 9, 150,120,5, LORES NOLACE	; BUFFER 9 = MASK BUFFER
 MASK 9
 Call CheckForError

 cbuf := 5;	; current work buffer
 dbuf := 3;	; current display buffer
 exit := 0;
 MENUS ON
; nullify scrollbar, menus, text colors here

 $filename := "hit.SND"
T @$filename
 LOAD SOUND 0, $filename	; SOUND BUFFER 0 = hit monster

 $filename := "miss.SND"
T @$filename
 LOAD SOUND 1, $filename	; SOUND BUFFER 1 = miss

 $filename := "playerhit.SND"
T @$filename
 LOAD SOUND 2, $filename	; SOUND BUFFER 2 = player hit

 $filename := "die.SND"
T @$filename
 LOAD SOUND 3, $filename	; SOUND BUFFER 3 = die

 $filename := "spell.SND"
T @$filename
 LOAD SOUND 4, $filename	; SOUND BUFFER 4 = spell

 $filename := "teleport.SND"
T @$filename
 LOAD SOUND 5, $filename	; SOUND BUFFER 5 = teleport

 $filename := "AncientDreams.MUS"	; SONG BUFFER 0 = AncientDreams
T @$filename
 LOAD SONG 0, $filename

 
T clicks...
 CLICK 0, 22, 2, 34,12, UpButton	;setup all onscreen buttons
 CLICK 1, 22,15, 34,25, DownButton
 CLICK 2,  6,15, 18,25, LeftButton
 CLICK 3, 38,15, 50,25, RightButton
 CLICK 4, 158,3,189,12, DoQuit
 CLICK 5, 158,15,189,24, Hit
 CLICK 6, 282,3,313,12, Cast
 CLICK 7, 282,15,313,24, About

 CLICK 8, 143,169, 172,188, GrabItem	; button for picking up item

 CLICK 46, 0,30,78,199, 	LeftButton	;setup implied buttons
 CLICK 47, 243,30,319,199,	RightButton
 CLICK 48, 78,49,242,150,	UpButton
 CLICK 49, 0,194,319,199,	DownButton
T DONE
ENDSUB
;--------------------------------------------------------------
;
; InitGame: Resets the maze,starts the game anew, and puts up screens
;
SUB InitGame
 MODE 4, DRAW
 COPY 4,75,0,150,44, 4,0,0 ; Copy maze grid to work area for this game

 x := 4		; set initial position
 y := 3
 face := 2	; face SOUTH

  str := 30	; set players attributes
   hp := 40
  mag := 20
   ac := 1
  exp := 0
 gold := 0
 weapon := 1
 lhitx := -1
 lhity := -1
 cbuf := 5
 dbuf := 3

 spell := 0
 potion := RAND / 1000 + 1

 magicreset := 30
 strengthreset := 15
 hitpointreset := 20
; REMOVE 8

 CALL DisplayIcons
 COLOR dbuf, 19
 MODE dbuf, DRAW
 TEXT dbuf,127,17, "   "	; clear out experience points
 TEXT dbuf,127,26, "   "	; clear out experience points

 CALL ShowStats		; Initiate display
 SCREENMODE GRAPHICS
 SHOW SCREEN dbuf
 DISABLEMUSIC
ENDSUB
;--------------------------------------------------------------
;
; PlayGame: Performs the main game loop
;
SUB PlayGame
 GETCHAR $ch
 UPCASE $ch
 VALUE $ch, tmp
 IF    tmp = 128 THEN	; up arrow
  CALL UpButton
 ELSIF tmp = 129 THEN	; down arrow
  CALL DownButton
 ELSIF tmp = 131 THEN	; left arrow
  CALL LeftButton
 ELSIF tmp = 132 THEN	; right arrow
  CALL RightButton
 ELSIF tmp = 80	THEN	; "P"
  CALL DoQuit
 ELSIF tmp = 72	THEN	; "H"
  CALL Hit
 ELSIF tmp = 67	THEN	; "C"
  CALL Cast
 ELSIF tmp = 65	THEN	; "A"
  CALL About
 ELSIF tmp = 84 THEN	; "T"
  CALL GrabItem
 ELSIF tmp = 27 THEN
  exit := 1;
  QUIT	; end the game totally
 ENDIF

 READBUTTONS		; process mouse clicks
; READBUTTONS EMPTY 	; clear out queued-up clicks

 CALL BuildView

 CALL CheckForCombat

 IF mag < 30 THEN	; allow mana to slowly build up
  magicreset := magicreset - 1
  IF magicreset < 1 THEN
   magicreset := 30
   mag := mag + 1
  ENDIF
  CALL ShowStats
 ENDIF

 IF str < 40 THEN	; allow mana to slowly build up
  strengthreset := strengthreset - 1
  IF strengthreset < 1 THEN
   strengthreset := 15
   str := str + 1
  ENDIF
  CALL ShowStats
 ENDIF

 IF hp < 50 THEN	; allow mana to slowly build up
  hitpointreset := hitpointreset - 1
  IF hitpointreset < 1 THEN
   hitpointreset := 20
   hp := hp + 1
  ENDIF
  CALL ShowStats
 ENDIF

 PAUSE 1	; allow multitasking a chance
ENDSUB

;-----------------------MAINTENENCE SUBROUTINES-----------------------

; Handle disk/memory errors by aborting if they occur
SUB CheckForError
 IF Error THEN
  SCREENMODE TEXT
  T Error loading file "@$filename " or no memory.  Press RETURN to ABORT.
  GETSTRING $filename
  QUIT
 ENDIF
ENDSUB
;--------------------------------------------------------------
; Clears out queued up keypresses
SUB ClearKeyQueue
 tmp := 1
 WHILE tmp # 0 DO
  GETCHAR $ch
  VALUE $ch, tmp
 ENDWHILE  
ENDSUB
;--------------------------------------------------------------
; Draw the player's statistics into the display
SUB ShowStats
 COLOR dbuf, 19
 TEXT dbuf, 78, 8, "@str  "	; the extra space erases the [last digit] when # goes down
 TEXT dbuf, 78,17, "@hp  "
 TEXT dbuf, 78,26, "@mag  "
 TEXT dbuf,127, 8, "@ac  "
 TEXT dbuf,127,17, "@exp "
 TEXT dbuf,127,26, "@gold "
ENDSUB
;--------------------------------------------------------------
; reads blocks surrounding the player into a heading-corrected matrix
SUB LoadPosition
 MODE 4, DRAW		; render map to hidden screen

 IF face = 0 THEN	; load NORTH-facing position 
  sy := y - 3
  dy := 44
  WHILE dy < 50 DO
   sx := x - 2
   dx := 0
   WHILE dx < 5 DO
    PIXEL 4,sx,sy, tmp
    COLOR 4, tmp
    LINE 4,dx,dy, dx,dy
    dx := dx + 1
    sx := sx + 1
   ENDWHILE
   dy := dy + 1
   sy := sy + 1
  ENDWHILE

 ELSIF face = 1 THEN	; load EAST-facing position
  sx := x + 3
  dy := 44;
  WHILE dy < 50 DO
   dx := 0
   sy := y - 2
   WHILE dx < 5 DO
    PIXEL 4, sx,sy, tmp
    COLOR 4,tmp
    LINE 4, dx,dy, dx,dy
    sy := sy + 1
    dx := dx + 1
   ENDWHILE
   sx := sx - 1
   dy := dy + 1
  ENDWHILE

 ELSIF face = 2 THEN	; load SOUTH-facing position
  sy := y + 3
  dy := 44;
  WHILE dy < 50 DO
   dx := 0
   sx := x + 2
   WHILE dx < 5 DO
    PIXEL 4,sx,sy, tmp
    COLOR 4,tmp
    LINE 4,dx,dy, dx,dy
    sx := sx - 1
    dx := dx + 1
   ENDWHILE
   sy := sy - 1
   dy := dy + 1
  ENDWHILE

 ELSIF face = 3 THEN
  sx := x - 3
  dy := 44;
  WHILE dy < 50 DO
   dx := 0
   sy := y + 2
   WHILE dx < 5 DO
    PIXEL 4, sx,sy, tmp
    COLOR 4,tmp
    LINE 4, dx,dy, dx,dy
    sy := sy - 1
    dx := dx + 1
   ENDWHILE
   sx := sx + 1
   dy := dy + 1
  ENDWHILE
 ENDIF

; COPY	4, 0,44,10,53, dbuf,38,4	; TEMPORARY!
; COLOR	dbuf,19			; TEMPORARY!
; LINE	dbuf,40,7,40,7		; TEMPORARY!

ENDSUB
;--------------------------------------------------------------
; Process LEFT Arrow selection

SUB LeftButton
 MODE 4,DRAW
 COPY 4,235,0,249,11, dbuf,6,15	; pop button in

 face := face - 1	;rotate left!
 IF face = -1 THEN
  face := 3
 ENDIF

 CALL LoadPosition

 COPY 4,169,0,183,11, dbuf,6,15	; pop button out
 CALL ClearKeyQueue
ENDSUB
;--------------------------------------------------------------
; Process RIGHT Arrow selection
SUB RightButton
 MODE 4,DRAW
 COPY 4,267,0,281,11, dbuf,38,15	; pop button in

 face := (face + 1) MOD 4	;rotate left!

 CALL LoadPosition

 COPY 4,201,0,215,11, dbuf,38,15	; pop button out
 CALL ClearKeyQueue
ENDSUB
;--------------------------------------------------------------
; Process UP Arrow selection
SUB UpButton
 MODE 4,DRAW
 COPY 4,219,0,233,11, dbuf,22,2	; pop button in

 IF face = 0 THEN	; try to move north
  PIXEL 4,x,y - 1, tmp
  IF tmp > 15 THEN
   y := y - 1
   CALL LoadPosition
  ENDIF
 
 ELSIF face = 1 THEN	; try to move east
  PIXEL 4,x + 1,y, tmp
  IF tmp > 15 THEN
   x := x + 1
   CALL LoadPosition
  ENDIF

 ELSIF face = 2 THEN	; try to move south
  PIXEL 4,x,y + 1, tmp
  IF tmp > 15 THEN
   y := y + 1
   CALL LoadPosition
  ENDIF

 ELSIF face = 3 THEN	; try to move west
  PIXEL 4,x - 1,y, tmp
  IF tmp > 15 THEN
   x := x - 1
   CALL LoadPosition
  ENDIF
 ENDIF

 COPY 4,153,0,167,11, dbuf,22,2	; pop button out
 CALL ClearKeyQueue
ENDSUB
;--------------------------------------------------------------
; Process DOWN Arrow selection
SUB DownButton
 MODE 4,DRAW
 COPY 4,251,0,265,11, dbuf,22,15	; pop button in

 IF face = 2 THEN	; try to move north (backward)
  PIXEL 4,x,y - 1, tmp
  IF tmp > 15 THEN
   y := y - 1
   CALL LoadPosition
  ENDIF
 
 ELSIF face = 3 THEN	; try to move east (backward)
  PIXEL 4,x + 1,y, tmp
  IF tmp > 15 THEN
   x := x + 1
   CALL LoadPosition
  ENDIF

 ELSIF face = 0 THEN	; try to move south (backward)
  PIXEL 4,x,y + 1, tmp
  IF tmp > 15 THEN
   y := y + 1
   CALL LoadPosition
  ENDIF

 ELSIF face = 1 THEN	; try to move west (backward)
  PIXEL 4,x - 1,y, tmp
  IF tmp > 15 THEN
   x := x - 1
   CALL LoadPosition
  ENDIF
 ENDIF

 COPY 4,185,0,199,11, dbuf,22,15	; pop button out
 CALL ClearKeyQueue
ENDSUB
;--------------------------------------------------------------
; Process DoQuit selection
SUB DoQuit
 MODE 4,DRAW
 COPY 4,192,18,226,29, dbuf,157,3	; pop button in

 exit := 1;
 QUIT	; end the game totally

 COPY 4,155,18,189,29, dbuf,157,3	; pop button out
 CALL ClearKeyQueue
ENDSUB
;--------------------------------------------------------------
; Process HIT selection
SUB Hit
 MODE 4,DRAW
 COPY 4,192,30,226,41, dbuf,157,15	; pop button in

 PIXEL 4,2,46, tmp
 IF tmp > 4 AND tmp < 16 THEN	; there's a monster here!
  IF lhitx = x AND lhity = y THEN
   hits := hits + 1
  ELSE
   lhitx := x
   lhity := y
   hits  := 0
   mhpts := (RAND / 1000) + 10	; monster gets 10...20 hit points
  ENDIF

  tmp := mhpts
; The following equation decrements the monster's hitpoints by a random
; amount, depending on the current weapon, scaled by the % of the player's
; current strength.  No strength = no hit, full strength = max hit.
; It also randomizes a 50/50 chance of hitting or missing.
  mhpts := mhpts - (((RAND / 1000) + weapon) * (RAND / 5000) * str) / 40
  IF mhpts = tmp THEN	; player MISSED monster
   PLAY SOUND 1, 0, 1, 63, 600	; whoosh
  ELSE
   PLAY SOUND 0, 0, 1, 63,0	; clang
  ENDIF
  hits := hits + 1
  IF mhpts < 1 THEN
   tmp := 17		; drop a bit of gold
   tmp2 := 0
   CALL InsertObject
   tmp :=  16		; erase the monster 
   tmp2 := 1
   CALL InsertObject
   CALL LoadPosition
   exp := exp + hits * ((RAND / 5000) + 1)
   CALL ShowStats
  ELSE
   PAUSE 10
  ENDIF
 ENDIF

 COPY 4,155,30,189,41, dbuf,157,15	; pop button out
 CALL ClearKeyQueue
ENDSUB
;--------------------------------------------------------------
; Process CAST selection
SUB Cast
 MODE 4,DRAW
 COPY 4,192,42,226,53, dbuf,282,3	; pop button in

 tmp := spell + potion		; since you can't have both
 IF mag < 10 THEN		; abort the cast
  tmp := -1
 ENDIF
 IF tmp > 0 THEN
  PLAY SOUND 4, 1, 1,64,0	; magic sound
 ENDIF
 IF tmp = 1 THEN		; bless weapon
  weapon := weapon + 4
  mag := mag - 10
 ELSIF tmp = 2 THEN		; bless armor
  IF ac < 0 THEN
   ac := -ac
  ELSE
   ac := ac + 4
  ENDIF
  mag := mag - 10
 ELSIF tmp = 3 THEN		; better health
  hp := hp + RAND / 1000
  mag := mag - 10
 ELSIF tmp = 4 THEN		; better strength
  str :=  str + RAND / 500
  mag := mag - 10
 ELSIF tmp = 5 THEN		; better magic
  mag := mag + RAND / 1000 + 10
 ELSIF tmp = 6 THEN		; teleport
; the following randomizes the player's position 'til he lands in an open hallway
  x := -1
  y := -1
  tmp2 := -1
  WHILE x < 0 OR x > 78 OR y < 0 OR y > 42 OR tmp2 < 16 DO
   x := RAND / 130
   y := RAND / 239
   PIXEL 4, x,y, tmp2
  ENDWHILE
  PLAY SOUND 5, 1,1,64,0	; teleport sound
  CALL LoadPosition
  mag := mag - 10
 ELSIF tmp > 6 THEN	; some magic combat spell-- they're really all the same!
  str := str * 3	; magic is like a 3x hit
  weapon := weapon * 3
  CALL Hit
  str := str / 3
  weapon := weapon / 3
  mag := mag - 10
 ENDIF

 potion := 0
 spell := 0
 CALL ShowStats
 CALL DisplayIcons

 PAUSE 10
 CALL ClearKeyQueue
 MODE dbuf, DRAW
 COPY 4,155,42,189,53, dbuf,282,3	; pop button out
ENDSUB
;--------------------------------------------------------------
; Process ABOUT selection
SUB About
 MODE 4,DRAW
 COPY 4,192,54,226,65, dbuf,282,15	; pop button in

 COLOR 6, 1
 MODE 6, DRAW
 IF spell = 0 THEN			; show current scroll
  TEXT 6, 103,159, "(none)        "
 ELSIF spell = 1 THEN
  TEXT 6, 103,159, "Bless Weapon  "
 ELSIF spell = 2 THEN
  TEXT 6, 103,159, "Bless Armor   "
 ELSIF spell = 3 THEN
  TEXT 6, 103,159, "Heal Wounds   "
 ELSIF spell = 4 THEN
  TEXT 6, 103,159, "Super Strength"
 ELSIF spell = 5 THEN
  TEXT 6, 103,159, "Higher Mana   "
 ELSIF spell = 6 THEN
  TEXT 6, 103,159, "Teleport      "
 ELSIF spell = 7 THEN
  TEXT 6, 103,159, "Power Zap     "
 ELSIF spell = 8 THEN
  TEXT 6, 103,159, "Fireburst     "
 ELSIF spell = 9 THEN
  TEXT 6, 103,159, "Magic Bullet  "
 ELSIF spell = 10 THEN
  TEXT 6, 103,159, "Hammer Hand   "
 ENDIF
 IF potion = 0 THEN				; show current potion
  TEXT 6, 103,147, "(none)        "
 ELSIF potion = 1 THEN
  TEXT 6, 103,147, "Bless Weapon  "
 ELSIF potion = 2 THEN
  TEXT 6, 103,147, "Bless Armor   "
 ELSIF potion = 3 THEN
  TEXT 6, 103,147, "Better Health "
 ELSIF potion = 4 THEN
  TEXT 6, 103,147, "Mega Strength "
 ELSIF potion = 5 THEN
  TEXT 6, 103,147, "Mana Boost    "
 ELSIF potion = 6 THEN
  TEXT 6, 103,147, "Teleport      "
 ELSIF potion = 7 THEN
  TEXT 6, 103,147, "Devil Scream  "
 ELSIF potion = 8 THEN
  TEXT 6, 103,147, "Incinerate    "
 ELSIF potion = 9 THEN
  TEXT 6, 103,147, "Monster Mash  "
 ELSIF potion = 10 THEN
  TEXT 6, 103,147, "Super Stomp   "
 ENDIF 
 IF ac MOD 4 = 1 THEN				; show current armor
  TEXT 6, 103,171, "Cloth     "
 ELSIF ac MOD 4 = 2 THEN
  TEXT 6, 103,171, "Chain Mail"
 ELSIF ac MOD 4 = 3 THEN
  TEXT 6, 103,171, "Plate Mail"
 ENDIF
 IF weapon MOD 4 = 1 THEN			; show current weapon
  TEXT 6, 103,183, "Dagger     "
 ELSIF weapon MOD 4 = 2 THEN
  TEXT 6, 103,183, "Long Sword "
 ELSIF weapon MOD 4 = 3 THEN
  TEXT 6, 103,183, "Broad Sword"
 ENDIF 

 FADETO dbuf, 0,0,0, 1	; fade visible screen
 FADETO 6, 0,0,0, 0	; fade hidden ABOUT screen
 SHOW SCREEN 6
 ENABLEMUSIC
 IF songstarted THEN
  CONTINUE SONG 0
 ELSE
  PLAY SONG 0
  songstarted := 1
 ENDIF

 FADEFROM 6, 0,0,0, 1	; fade up from ABOUT
 WHILE leftbutton DO	; wait for button letup
  PAUSE 1
 ENDWHILE
 tmp := 0;
 WHILE 1-leftbutton AND 1-tmp DO	; wait for button down or keypress
  GETCHAR $ch
  LENGTH $ch, tmp
  PAUSE 1
 ENDWHILE
 WHILE leftbutton DO	; wait for button letup
  PAUSE 1
 ENDWHILE
 FADETO 6, 0,0,0, 1	; fade ABOUT away

 STOP SONG
 DISABLEMUSIC

 SHOW SCREEN dbuf
 FADEFROM dbuf, 0,0,0, 1 ; fade game screen back up
 FADEFROM 6, 0,0,0, 0	; restore ABOUT's palette

 COPY 4,155,54,189,65, dbuf,282,15	; pop button out
 CALL ClearKeyQueue
 READBUTTONS EMPTY
ENDSUB
;--------------------------------------------------------------
; This reads a value out of the monster position arrays
SUB GetArrayValue
 PIXEL mbuf, mtemp,0, mtemp2
 mtemp := mtemp + 1
 PIXEL mbuf, mtemp,0, mtemp3
 mtemp := mtemp + 1
 mtemp2 := mtemp2 + mtemp3 * 32
ENDSUB
;--------------------------------------------------------------
; This reads the position array to find the coords for this monster image
SUB GetMonsterCoords
 mtemp := mimg * 8	; index to the right monster position
 CALL GetArrayValue
 mx1 := mtemp2
 CALL GetArrayValue
 my1 := mtemp2
 CALL GetArrayValue
 mx2 := mtemp2
 CALL GetArrayValue
 my2 := mtemp2
ENDSUB
;--------------------------------------------------------------
; This creates the perspective view for the player
SUB BuildView
 MODE cbuf, DRAW
 COPY 1,0,00,319,199, cbuf,0,0	; copy FLOOR/CEILING into work area

; draw back wall
 PIXEL 4,1,44, tmp
 IF tmp < 5 THEN	; draw a far left wall
  COPY 2, 0,153, 136,177, cbuf, 0, 85
 ENDIF
 PIXEL 4,2,44, tmp
 IF tmp < 5 THEN	; draw a far middle wall
  COPY 2, 137,153, 183,177, cbuf, 137, 85
  IF tmp = 4 THEN
   COPY 4,132,46,138,51, cbuf,152,92	; draw shackle block
  ENDIF
 ELSIF tmp < 16 THEN
  mbuf := tmp + 2		; set buffer for monster
  mimg := 4 + (RAND MOD 2)
  CALL GetMonsterCoords
  MODE cbuf, OVERLAY
  COPY mbuf,mx1,my1,mx2,my2, cbuf,137 + (47 - mx2 - mx1) / 2,119 - (my2 - my1)
  MODE cbuf, DRAW
 ENDIF
 PIXEL 4,3,44, tmp
 IF tmp < 5 THEN	; draw a far right wall
  COPY 2, 184,153, 319,177, cbuf, 184, 85
 ENDIF

; draw far perpective walls
 PIXEL 4,1,45, tmp
 IF tmp < 5 THEN	; draw a far left perspective wall
  COPY 0, 117,72, 136,120, cbuf, 117, 72
  IF tmp = 4 THEN
   COPY 4,22,68,24,72, cbuf,127,93	; draw shackle block
  ENDIF
 ENDIF
 PIXEL 4,3,45, tmp
 IF tmp < 5 THEN	; draw a far right perspective wall
  COPY 0, 184,72, 202,120, cbuf, 184, 72
  IF tmp = 4 THEN
   COPY 4,26,68,28,72, cbuf,189,92	; draw shackle block
  ENDIF
 ENDIF

; draw middle wall
 PIXEL 4,1,45, tmp
 IF tmp < 5 THEN	; draw a middle left wall
  COPY 2, 0,102, 117,151, cbuf, 0, 71
 ENDIF
 PIXEL 4,2,45, tmp
 IF tmp < 5 THEN	; draw a middle middle wall
  COPY 2, 118,102, 202,151, cbuf, 118, 71
  IF tmp = 4 THEN
   COPY 4,118,46,130,57, cbuf,151,81	; draw shackle block
  ENDIF
 ELSIF tmp < 16 THEN
  mbuf := tmp + 2		; set buffer for monster
  mimg := 2 + (RAND MOD 2)
  CALL GetMonsterCoords
  MODE cbuf, OVERLAY
  COPY mbuf,mx1,my1,mx2,my2, cbuf,118 + (87 - mx2 - mx1) / 2,140 - (my2 - my1)
  MODE cbuf, DRAW
 ENDIF
 PIXEL 4,3,45, tmp
 IF tmp < 5 THEN	; draw a middle right wall
  COPY 2, 203,102, 319,151, cbuf, 203, 71
 ENDIF

; draw middle perpective walls
 PIXEL 4,1,46, tmp
 IF tmp < 5 THEN	; draw a middle left perspective wall
  COPY 0, 75,46, 117,148, cbuf, 75, 46
  IF tmp = 4 THEN
   COPY 4,14,68,20,78, cbuf,98,86	; draw shackle block
  ENDIF
 ENDIF
 PIXEL 4,3,46, tmp
 IF tmp < 5 THEN	; draw a middle right perspective wall
  COPY 0, 203,46, 241,148, cbuf, 203, 46
  IF tmp = 4 THEN
   COPY 4,30,68,36,78, cbuf,216,86	; draw shackle block
  ENDIF
 ENDIF

; draw near wall
 PIXEL 4,1,46, tmp
 IF tmp < 5 THEN	; draw a near left wall
  COPY 2, 0,0, 78,100, cbuf, 0,49
 ENDIF
 PIXEL 4,2,46, tmp
 IF tmp < 5 THEN	; draw a near middle wall
  COPY 2, 79,0, 241,100, cbuf, 79,49
  IF tmp = 4 THEN
   COPY 4,97,46,116,66, cbuf,146,73	; draw shackle block
  ENDIF
 ELSIF tmp < 16 THEN
  mbuf := tmp + 2		; set buffer for monster
  mimg := RAND MOD 2
  CALL GetMonsterCoords
  MODE cbuf, OVERLAY
  COPY mbuf,mx1,my1,mx2,my2, cbuf,79 + (165 - mx2 - mx1)/2,179 - (my2 - my1)
  MODE cbuf, DRAW
 ENDIF
 PIXEL 4,3,46, tmp
 IF tmp < 5 THEN	; draw a near right wall
  COPY 2, 242,0, 319,100, cbuf, 242,49
 ENDIF

; draw near perpective walls
 PIXEL 4,1,47, tmp
 IF tmp < 5 THEN	; draw a near left perspective wall
  COPY 0, 0,0, 78,199, cbuf, 0,0
  IF tmp = 4 THEN
   COPY 4,0,68,13,89, cbuf,35,65	; draw shackle block
  ENDIF
 ENDIF
 PIXEL 4,3,47, tmp
 IF tmp < 5 THEN	; draw a near right perspective wall
  COPY 0, 242,0, 319,199, cbuf, 242,0
  IF tmp = 4 THEN
   COPY 4,37,68,50,89, cbuf,273,66	; draw shackle block
  ENDIF
 ENDIF

 CALL ShowItem	; was commented out!

 COPY dbuf,0,0,319,29, cbuf,0,0	; copy header onto screen
 SHOW SCREEN cbuf	; display the new image
 tmp := cbuf		; swap buffers
 cbuf := dbuf
 dbuf := tmp
ENDSUB
;--------------------------------------------------------------
; This checks to see if a monster(s) is adjecent to the player
SUB CheckForCombat
 PIXEL 4,2,46, tmp		; check for monster in front
 IF tmp > 4 AND tmp < 16 THEN
  CALL MonsterHit
 ENDIF

 PIXEL 4,1,47, tmp		; check for monster to left
 IF tmp > 4 AND tmp < 16 THEN
  CALL MonsterHit
 ENDIF

 PIXEL 4,3,47, tmp		; check for monster to right
 IF tmp > 4 AND tmp < 16 THEN
  CALL MonsterHit
 ENDIF

 PIXEL 4,2,48, tmp		; check for monster behind
 IF tmp > 4 AND tmp < 16 THEN
  CALL MonsterHit
 ENDIF
ENDSUB
;--------------------------------------------------------------
; This allows the monster(s) surrounding player to hit
SUB MonsterHit
 IF RAND / 5000 = 1 THEN ; hit, not missed
  tmp := RAND / 1000 - ac
  IF tmp < 0 THEN
   tmp := 0
  ENDIF
  tmp2 := tmp
  str := str - tmp / 2	; decrement strength by a bit

  tmp := RAND / 1000 - ac
  IF tmp < 0 THEN
   tmp := 0
  ENDIF
  tmp2 := tmp2 + tmp
  IF tmp2 # 0 THEN
   PLAY SOUND 2, 1, 1, 64, 400 + RAND / 20	; uggh!!!
  ELSE
   PLAY SOUND 1, 1, 1, 64, 600	; whoosh
  ENDIF
  hp := hp - tmp	; decrement hit points by a bit
  IF str < 0 THEN
   str := 0
  ENDIF
  IF hp < 0 THEN
   hp := 0
  ENDIF
  CALL ShowStats

  FADETO   dbuf, 15,0,0, 0	; flash screen red
  FADEFROM dbuf, 15,0,0, 0

  IF hp = 0 THEN		; KILL PLAYER
   PLAY SOUND 3,0,1,64,0	; scream
   PLAY SOUND 3,1,1,64,0	; (on both channels)
   MODE dbuf, DRAW
   COPY 4, 129,79,317,121, dbuf, 67,88
   SHOW SCREEN dbuf
   PAUSE 100		; wait for 2 secs
   ENABLEMUSIC
   IF songstarted THEN
    CONTINUE SONG 0
   ELSE
    PLAY SONG 0
    songstarted := 1
   ENDIF
   CALL ClearKeyQueue
   WHILE leftbutton DO
    PAUSE 1
   ENDWHILE
   tmp := 0;
   WHILE 1-leftbutton AND 1-tmp DO	; wait for button down or keypress
    GETCHAR $ch
    LENGTH $ch, tmp
    PAUSE 1
   ENDWHILE
   WHILE leftbutton DO
    PAUSE 1
   ENDWHILE
   STOP SONG
   DISABLEMUSIC
   CALL InitGame
   CALL LeftButton
  ENDIF
 ELSE
  PLAY SOUND 1, 1, 1, 64, 600	; whoosh
 ENDIF
ENDSUB
;--------------------------------------------------------------
; This draws the iconic images of armor, weapon, and scroll/potion
SUB DisplayIcons
 MODE dbuf, DRAW
 COPY 4, 74,45,95,64, dbuf, 198,4	; clear out old images
 COPY 4, 74,45,95,64, dbuf, 227,4
 COPY 4, 74,45,95,64, dbuf, 256,4
 MODE dbuf, OVERLAY			; draw new images
 IF ac MOD 4 = 1 THEN	 ; draw cloth armor
  COPY 4, 229,16,250,35, dbuf, 198,4
 ELSIF ac MOD 4 = 2 THEN ; draw chain armor
  COPY 4, 229,37,250,56, dbuf, 198,4
 ELSIF ac MOD 4 = 3 THEN ; draw plate armor
  COPY 4, 229,58,250,77, dbuf, 198,4
 ENDIF
 IF weapon MOD 4 = 1 THEN ; draw dagger
  COPY 4, 251,16,272,35, dbuf, 227,4
 ELSIF weapon MOD 4 = 2 THEN ; draw long sword
  COPY 4, 251,36,272,56, dbuf, 227,4
 ELSIF weapon MOD 4 = 3 THEN ; draw broad sword
  COPY 4, 251,58,272,77, dbuf, 227,4
 ENDIF
 IF spell # 0 THEN
  COPY 4, 276,57,297,78, dbuf, 256,4
 ELSIF potion # 0 THEN
  COPY 4, 274,15,295,35, dbuf, 256,4
 ENDIF
ENDSUB
;--------------------------------------------------------------
; This displays an object in the maze in front of the player (if present)
SUB ShowItem
 PIXEL 4, 2,47, tmp
 IF tmp > 16 THEN	; an item is present!
  MODE cbuf, OVERLAY
  IF tmp = 17 THEN			; draw coins
   COPY 4,38,50,67,61, cbuf, 143,171
  ELSIF tmp >= 18 AND tmp <= 20 THEN	; draw armor
   tmp := tmp - 18
   COPY 4, 229,16 + tmp * 21,252,35 + tmp * 21, cbuf, 147,169
  ELSIF tmp >= 21 AND tmp <= 23 THEN	; draw weapon
   tmp := tmp - 21
   COPY 4, 251,16 + tmp * 21,272,35 + tmp * 21, cbuf, 147,169
  ELSIF tmp = 24 THEN			; draw potion
   COPY 4, 274,15,295,35, cbuf, 147,169
  ELSIF tmp = 25 THEN			; draw scroll
   COPY 4, 275,57,296,78, cbuf, 147,169
  ENDIF
  MODE cbuf, DRAW
 ELSE
 ENDIF
ENDSUB
;--------------------------------------------------------------
; This routine allows the player to pick up the requested item
SUB GrabItem
 PIXEL 4, 2,47, tmp
 IF tmp > 16 THEN	; an item is present!
;T Grabbing Item # @tmp
  IF tmp = 17 THEN			; grab coins
   gold := gold + RAND / 200	; give player + 0...50 gold pieces
   CALL ShowStats
   tmp := 16
  ELSIF tmp >= 18 AND tmp <= 20 THEN	; grab armor
   tmp2 := (ac MOD 4) + 17
   ac := tmp - 17
   tmp := tmp2
   CALL DisplayIcons
  ELSIF tmp >= 21 AND tmp <= 23 THEN	; grab weapon
   tmp2 := (weapon MOD 4) + 20
   weapon := tmp - 20
   tmp := tmp2
   CALL DisplayIcons
  ELSIF tmp = 24 THEN			; grab potion
   IF potion+spell = 0 THEN	; but only if carrying none
    potion := RAND / 1000 + 1
    CALL DisplayIcons
    tmp := 16
   ENDIF
  ELSIF tmp = 25 THEN			; grab scroll
  IF potion+spell = 0 THEN	; but only if carrying none
    spell := RAND / 1000 + 1
    CALL DisplayIcons
    tmp := 16
   ENDIF
  ENDIF
  tmp2 := 0;
  CALL InsertObject	; insert whatever new object in the maze    
 ENDIF
ENDSUB
;--------------------------------------------------------------
; This routine inserts (or removes) an object from the maze
SUB InsertObject
 MODE 4, DRAW
 COLOR 4, tmp
 IF face = 0 THEN
  RECT 4, x,y - tmp2,x,y - tmp2
 ELSIF face = 1 THEN
  RECT 4, x + tmp2,y,x + tmp2,y
 ELSIF face = 2 THEN
  RECT 4, x,y + tmp2,x,y + tmp2
 ELSIF face = 3 THEN
  RECT 4, x - tmp2,y,x - tmp2,y
 ENDIF
 CALL LoadPosition
ENDSUB
