'===========================================================================
' Subject: NANO-MAN (GAMEBASE)                Date: 01-15-97 (00:00)       
'  Author: Kurt Kuzba                         Code: QB, QBasic, PDS        
'  Origin: FidoNet QUIK_BAS Echo            Packet: DEMOS.ABC
'===========================================================================
'_|_|_|   GAMEBASE.BAS
'_|_|_|   Simple routines usable for game design.
'_|_|_|   No guarantee or warrantee given or implied.
'_|_|_|   Released   PUBLIC DOMAIN   by Kurt Kuzba.  (1/15/97)
'$DYNAMIC
TYPE spritedata: y AS INTEGER: x AS INTEGER: w AS INTEGER: h AS INTEGER
   sprite AS STRING * 100: buffer AS STRING * 100: END TYPE
TYPE setupdata: y AS INTEGER: x AS INTEGER: objdef AS INTEGER: END TYPE
DECLARE SUB levelssetup (S() AS setupdata, N%)
DECLARE SUB qbblitsprite (S AS spritedata)
DECLARE SUB qbgetsprite (S AS spritedata)
DECLARE SUB qbputsprite (S AS spritedata)
DECLARE SUB backgrounddata (S$, N%)
DECLARE SUB monsterdata (S$, N%)
DECLARE SUB playerdata (S$, N%)
DECLARE SUB levelsdata (S$, N%)
DECLARE SUB prizedata (S$, N%)
DECLARE SUB spritecolors (S$)
DECLARE SUB showlevel (L%)
DIM Lft AS INTEGER, Rgt AS INTEGER, Clm AS INTEGER, Wpn AS INTEGER
DIM player(15) AS STRING * 100, weapon(4) AS STRING * 100
DIM monster(6) AS STRING * 100, prize(6) AS STRING * 100
DIM sprite(11) AS spritedata, blast AS spritedata
DIM SHARED levdat AS STRING * 640, background(16000) AS LONG
DIM objects(10) AS setupdata
CONST front = 0: CONST back = 1: CONST climb = 2
CONST runright = 5: CONST runleft = 8
CONST standright = 11: CONST standleft = 12
CONST jumpright = 13: CONST jumpleft = 14
CONST shootright = 0: CONST shootleft = 2
FOR t% = 0 TO 14: playerdata player(t%), t%: NEXT
FOR t% = 0 TO 3: playerdata weapon(t%), t% + 15: NEXT
FOR t% = 0 TO 5: prizedata prize(t%), t%
   monsterdata monster(t%), t%: NEXT: sprite(0).w = 10
sprite(0).h = 10: FOR t% = 1 TO 10: sprite(t%) = sprite(0): NEXT
DEF SEG = &H40: POKE &H17, PEEK(&H17) AND 223: DEF SEG
SCREEN 13: GOSUB CreateLevel: Lft = 0: Rgt = 0: Clm = 0: Wpn = 0
GameOver% = 10: sprite(0).x = 180: sprite(0).y = 10: figure = front
sprite(0).sprite = player(figure): qbblitsprite sprite(0)
FOR t% = 1 TO 5: sprite(t%).y = objects(t% - 1).y
   sprite(t%).x = objects(t% - 1).x: qbgetsprite sprite(t%): NEXT
FOR t% = 6 TO 10
   sprite(t%).y = objects(t% - 1).y: sprite(t%).x = objects(t% - 1).x
   sprite(t%).sprite = prize(objects(t% - 1).objdef)
   qbblitsprite sprite(t%): NEXT
FOR Fstart% = 0 TO 100
   K$ = INKEY$: x% = sprite(0).x: y% = sprite(0).y: falling = 0
   nx% = x%: ny% = y%: Fstart% = 0: IF K$ = CHR$(27) THEN EXIT FOR
   xy% = (x% \ 10) * 32 + (y% + 3) \ 10 + 1: Feet% = xy% + 32
   IF x% < 180 THEN
      SELECT CASE ASC(MID$(levdat, Feet%))
         CASE 0, 2: falling = -1
         CASE 1, 4: falling = 0
         CASE 5: falling = ((x% MOD 10) > 0)
         CASE ELSE: falling = ((x% MOD 10) > 2)
      END SELECT
   END IF
   SELECT CASE INP(96)
      CASE 75: move$ = "RL"
      CASE 203: move$ = "SL"
      CASE 77: move$ = "RR"
      CASE 205: move$ = "SR"
      CASE 72: move$ = "CU"
      CASE 200: move$ = "SB"
      CASE 80: move$ = "CD"
      CASE 208: move$ = "SB"
      CASE 82: move$ = "SF"
   END SELECT
   SELECT CASE move$
      CASE "RL"
         w% = -1: IF y% > 9 THEN w% = (ASC(MID$(levdat, xy% - 1)) = 6)
         IF ((y% MOD 10) <> 0) OR (NOT w%) THEN
            IF falling THEN nx% = nx% + 1
            ny% = ny% - 1: figure = runleft + lr% \ 4
            lr% = (lr% + 1) MOD 12: GOSUB blitplayer
         ELSE
            IF figure <> standleft THEN
               figure = standleft: GOSUB blitplayer
            END IF: move$ = "SL"
         END IF
      CASE "SL"
         IF figure <> standleft THEN
            figure = standleft: IF falling THEN nx% = nx% + 1
            GOSUB blitplayer
         ELSE
            IF falling THEN nx% = nx% + 1: GOSUB blitplayer
         END IF
      CASE "RR"
         w% = -1: IF y% < 310 THEN w% = (ASC(MID$(levdat, xy% + 1)) = 6)
         IF ((y% MOD 10) <> 0) OR (NOT w%) THEN
            IF falling THEN nx% = nx% + 1
            ny% = ny% + 1: figure = runright + RR% \ 4
            RR% = (RR% + 1) MOD 12: GOSUB blitplayer
         ELSE
            IF figure <> standright THEN
               figure = standright: GOSUB blitplayer
            END IF: move$ = "SR"
         END IF
      CASE "SR"
         IF figure <> standright THEN
            figure = standright: IF falling THEN nx% = nx% + 1
            GOSUB blitplayer
         ELSE
            IF falling THEN nx% = nx% + 1: GOSUB blitplayer
         END IF
      CASE "CU"
         IF x% > 0 THEN
            O% = ASC(MID$(levdat, xy%)): O% = (O% = 4) + (O% = 1)
         END IF
         IF x% < 608 THEN
            b% = ASC(MID$(levdat, xy% + 32)): b% = (b% = 1) + (b% = 4)
         END IF: L% = b% + O%
         IF L% THEN
            figure = climb + CL% \ 5: CL% = (CL% + 1) MOD 15
            nx% = nx% + (nx% > 0)
            ny% = ny% + 3 - ((ny% + 3) MOD 10): GOSUB blitplayer
         ELSE
            move$ = "SB"
            IF figure <> back THEN figure = back: GOSUB blitplayer
         END IF
      CASE "CD"
         IF (x% MOD 10) <> 0 THEN
            b% = ASC(MID$(levdat, xy% + 32)): O% = ASC(MID$(levdat, xy%))
            IF (O% = 4) OR (O% = 5) OR (b% = 4) OR (b% = 5) THEN
               figure = climb + CL% \ 5: CL% = (CL% + 14) MOD 15
               nx% = nx% + 1: ny% = (ny% + 3) - ((ny% + 3) MOD 10)
               GOSUB blitplayer
            END IF
         ELSE
            b% = ASC(MID$(levdat, xy% + 32))
            IF ((b% = 2) OR (b% = 4) OR (b% = 5)) AND (x% < 180) THEN
               figure = climb + CL% \ 5: CL% = (CL% + 14) MOD 15
               nx% = nx% + 1: ny% = (ny% + 3) - ((ny% + 3) MOD 10)
               GOSUB blitplayer
            END IF
         END IF
      CASE "SB": IF falling THEN nx% = nx% + 1: figure = front
         IF figure <> back THEN figure = back: GOSUB blitplayer
      CASE "SF": IF falling THEN nx% = nx% + 1: figure = back
         IF figure <> front THEN figure = front: GOSUB blitplayer
   END SELECT: DEF SEG = &H40: sh% = PEEK(&H17): DEF SEG
   IF ((sh% AND 8) = 8) AND (INSTR("SLSR", move$) > 0) THEN
      blast = sprite(0): Yloc% = 10: fire% = shootright
      IF move$ = "SL" THEN Yloc% = -10: fire% = shootleft
      blast.y = blast.y + Yloc%: wave% = (wave% + 1) AND 1
      WAIT &H3DA, 8: WAIT &H3DA, 8, 8: SOUND RND * 1000 + 100, .3
      blast.sprite = weapon(fire% + wave%): qbblitsprite blast
      WAIT &H3DA, 8: WAIT &H3DA, 8, 8: SOUND RND * 1000 + 999, .3
      blast.sprite = blast.buffer: qbputsprite blast
   END IF
   FOR sp% = 1 TO 5: qbputsprite sprite(sp%)
      sprite(sp%).sprite = monster(objects(sp% - 1).objdef)
      qbblitsprite sprite(sp%)
      sprite(sp%).sprite = sprite(sp%).buffer: NEXT
NEXT: DEF SEG = &H40: POKE &H17, PEEK(&H17) OR 32: DEF SEG
SCREEN 0: WIDTH 80, 25: SYSTEM
CreateLevel: : showlevel 1: levelssetup objects(), 1
   FOR t% = 0 TO 4: sprite(t% + 1).h = 10: sprite(t% + 1).w = 10
      sprite(t% + 1).y = objects(t%).y
      sprite(t% + 1).x = objects(t%).x
      sprite(t% + 6).h = 10: sprite(t% + 6).w = 10
      sprite(t% + 6).y = objects(t% + 5).y
      sprite(t% + 1).x = objects(t% + 5).x: NEXT: RETURN
blitplayer: : sprite(0).sprite = sprite(0).buffer
   qbputsprite sprite(0): sprite(0).x = nx%: sprite(0).y = ny%
   sprite(0).sprite = player(figure): qbblitsprite sprite(0): RETURN
'_|_|_|   end   GAMEBASE.BAS

SUB backgrounddata (S$, N%)
   '  " " = clear   "0" = black    "1" = blue      "2" = green
   '  "3" = cyan    "4" = red      "5" = magenta   "6" = brown
   '  "7" = tan     "8" = yellow   "9" = white
   '  These colors are used with all graphics object in this prg.
   sp$ = ""
   SELECT CASE N%
      CASE 0: S$ = STRING$(100, 0): EXIT SUB
      CASE 1: sp$ = sp$ + "0665506606"  'This format is for ease
              sp$ = sp$ + " 006066550"  'of design only
              sp$ = sp$ + "  05666060"  'It is obviously more
              sp$ = sp$ + "666665560 "  'compact without having
              sp$ = sp$ + "06566600  "  'it in a visually
              sp$ = sp$ + " 065566666"  'recognizable format
              sp$ = sp$ + "  06606550"
              sp$ = sp$ + "660666560 "
              sp$ = sp$ + "65566060  "
              sp$ = sp$ + "6666560556"
      CASE 2: sp$ = sp$ + "  111111  " + "  911911  " + "  111111  "
              sp$ = sp$ + "  191191  " + "  111111  " + "  119119  "
              sp$ = sp$ + "  111111  " + "  911911  " + "  111111  "
              sp$ = sp$ + "  191191  "
      CASE 3: sp$ = sp$ + "6660666666" + "6666066660" + "6666606666"
              sp$ = sp$ + "          " + "          " + "          "
              sp$ = sp$ + "          " + "          " + "          "
              sp$ = sp$ + "          "
      CASE 4: sp$ = sp$ + "6666666666" + "6666666666" + "6000000006"
              sp$ = sp$ + "6000000006" + "6666666666" + "6000000006"
              sp$ = sp$ + "6000000006" + "6666666666" + "6000000006"
              sp$ = sp$ + "6000000006"
      CASE 5: sp$ = sp$ + "6666666666" + "  911911  " + "  111111  "
              sp$ = sp$ + "  191191  " + "  111111  " + "  119119  "
              sp$ = sp$ + "  111111  " + "  911911  " + "  111111  "
              sp$ = sp$ + "  191191  "
      CASE 6: sp$ = sp$ + "6066666606" + "6660666666" + "6666606666"
              sp$ = sp$ + "0666666066" + "6606666660" + "6666066666"
              sp$ = sp$ + "6666660666" + "6066666606" + "6660666666"
              sp$ = sp$ + "6666606666"
   END SELECT: spritecolors sp$: S$ = sp$
END SUB

SUB levelsdata (S$, N%)
   '   " " = space   "/" = up only   ";" = slide
   '   "-" = floor   "=" = ladder    "\" = trapdoor
   '   "[" = wall
   SC$ = "": S$ = STRING$(640, 0)
   SELECT CASE N%
      CASE 1        '==================================
         SC$ = SC$ + "                                "
         SC$ = SC$ + "     /----------------[=        "
         SC$ = SC$ + "-----/                [---------"
         SC$ = SC$ + "     /                          "
         SC$ = SC$ + "-----/  -----------------------/"
         SC$ = SC$ + "     /                         /"
         SC$ = SC$ + "-----/          =---------------"
         SC$ = SC$ + "     /          =               "
         SC$ = SC$ + "/-----------------------------\-"
         SC$ = SC$ + "/                             ; "
         SC$ = SC$ + "/----------        --------\----"
         SC$ = SC$ + "/                       [  ;    "
         SC$ = SC$ + "/-----------------------[  ;    "
         SC$ = SC$ + "/                       [  -----"
         SC$ = SC$ + "-------------=                  "
         SC$ = SC$ + "             =          [=      "
         SC$ = SC$ + "             =          [=      "
         SC$ = SC$ + "  ---------  =------------------"
         SC$ = SC$ + "             =                  "
         SC$ = SC$ + "--------------------------------"
   END SELECT
   FOR t% = 1 TO 640
      MID$(S$, t%) = CHR$(INSTR("/;-=\[", MID$(SC$, t%, 1))): NEXT
END SUB

SUB levelssetup (S() AS setupdata, N%)
   SELECT CASE N%
      CASE 1
         S(0).y = 150: S(0).x = 0: S(0).objdef = 1
         S(1).y = 100: S(1).x = 70: S(1).objdef = 2
         S(2).y = 200: S(2).x = 90: S(2).objdef = 3
         S(3).y = 130: S(3).x = 110: S(3).objdef = 4
         S(4).y = 270: S(4).x = 180: S(4).objdef = 5
         S(5).y = 310: S(5).x = 10: S(5).objdef = 1
         S(6).y = 140: S(6).x = 30: S(6).objdef = 2
         S(7).y = 310: S(7).x = 160: S(7).objdef = 3
         S(8).y = 0: S(8).x = 10: S(8).objdef = 4
         S(9).y = 70: S(9).x = 160: S(9).objdef = 5
   END SELECT
END SUB

SUB monsterdata (S$, N%)
   sp$ = ""
   SELECT CASE N%
      CASE 0: S$ = STRING$(100, 0): EXIT SUB
      CASE 1: sp$ = sp$ + "          " + " 8      8 " + "  8    8  "
              sp$ = sp$ + "   2222   " + " 22222222 " + "2200220022"
              sp$ = sp$ + "2222222222" + " 22200222 " + "   2222   "
              sp$ = sp$ + " 222  222 "
      CASE 2: sp$ = sp$ + "          " + "  22252   " + " 22222222 "
              sp$ = sp$ + " 2222  9  " + " 2222     " + "  22222   "
              sp$ = sp$ + "2   22222 " + "22    2222" + " 22222222 "
              sp$ = sp$ + "  222222  "
      CASE 3: sp$ = sp$ + "          " + " 9 9  9 9 " + "  955559  "
              sp$ = sp$ + "9 555555 9" + " 95855859 " + "9 555555 9"
              sp$ = sp$ + " 95888859 " + "   5555   " + "   5  5   "
              sp$ = sp$ + "  55  55  "
      CASE 4: sp$ = sp$ + "          " + "    66    " + "   666    "
              sp$ = sp$ + "   6666   " + "  60606   " + "  666666  "
              sp$ = sp$ + " 6999996  " + " 66666666 " + "   8  8   "
              sp$ = sp$ + "  88  88  "
      CASE 5: sp$ = sp$ + "          " + "   6666   " + "  617716  "
              sp$ = sp$ + "  777777  " + "   7447   " + "5555555555"
              sp$ = sp$ + "5  5555  5" + "   5555   " + "  55  55  "
              sp$ = sp$ + "555    555"
   END SELECT: spritecolors sp$: S$ = sp$
END SUB

SUB playerdata (S$, N%)
   sp$ = ""
   SELECT CASE N%
      CASE 0: sp$ = sp$ + "          " + "   4444   " + "  433334  "
              sp$ = sp$ + "  433334  " + "  444444  " + "985888858 "
              sp$ = sp$ + "9 555555 7" + "   8888   " + "   8  8   "
              sp$ = sp$ + "  88  88  "
      CASE 1: sp$ = sp$ + "          " + "   4444   " + "  444444  "
              sp$ = sp$ + "  444444  " + "  588885  " + "985588558 "
              sp$ = sp$ + "9 585585 7" + "   8888   " + "   8  8   "
              sp$ = sp$ + "  88  88  "
      CASE 2: sp$ = sp$ + "77        " + "8  4444   " + "8 444444 7"
              sp$ = sp$ + "8 444444 8" + "8858888588" + "  558855  "
              sp$ = sp$ + "  585585  " + "   888888 " + "   8    88"
              sp$ = sp$ + "  88      "
      CASE 3: sp$ = sp$ + "          " + "   4444   " + "7 444444  "
              sp$ = sp$ + "8 444444  " + "8 588885 7" + "8855885588"
              sp$ = sp$ + "  585585  " + "  888888  " + "88     8  "
              sp$ = sp$ + "        88"
      CASE 4: sp$ = sp$ + "        77" + "   4444  8" + "  444444 8"
              sp$ = sp$ + "7 444444 8" + "8 588885 8" + "8855885588"
              sp$ = sp$ + "  585585  " + " 888888   " + "88   8    "
              sp$ = sp$ + "     88   "
      CASE 5: sp$ = sp$ + "          " + "    4444  " + "   44443  "
              sp$ = sp$ + "   44443  " + "   5885   " + "   888859 "
              sp$ = sp$ + "   5558899" + "   8888   " + "888    8  "
              sp$ = sp$ + "8       88"
      CASE 6: sp$ = sp$ + "          " + "    4444  " + "   44443  "
              sp$ = sp$ + "   44443  " + "   5885   " + "   888859 "
              sp$ = sp$ + "   5558899" + "888888888 " + "8       88"
              sp$ = sp$ + "          "
      CASE 7: sp$ = sp$ + "          " + "    4444  " + "   44443  "
              sp$ = sp$ + "   44443  " + "   5885   " + "   888859 "
              sp$ = sp$ + "   5558899" + "    8888  " + "    8  8  "
              sp$ = sp$ + "    88 88 "
      CASE 8: sp$ = sp$ + "          " + "  4444    " + "  34444   "
              sp$ = sp$ + "  34444   " + "   5885   " + " 958888   "
              sp$ = sp$ + "9988555   " + "   8888   " + "  8    888"
              sp$ = sp$ + "88       8"
      CASE 9: sp$ = sp$ + "          " + "  4444    " + "  34444   "
              sp$ = sp$ + "  34444   " + "   5885   " + " 958888   "
              sp$ = sp$ + "9988555   " + " 888888888" + "88       8"
              sp$ = sp$ + "          "
     CASE 10: sp$ = sp$ + "          " + "  4444    " + "  34444   "
              sp$ = sp$ + "  34444   " + "   5885   " + " 958888   "
              sp$ = sp$ + "9988555   " + "   8888   " + "   8  8   "
              sp$ = sp$ + "  88 88   "
     CASE 11: sp$ = sp$ + "          " + "    4444  " + "   44443  "
              sp$ = sp$ + "   44443  " + "   5885   " + "   888859 "
              sp$ = sp$ + "   5558899" + "   8888   " + "    88    "
              sp$ = sp$ + "    888   "
     CASE 12: sp$ = sp$ + "          " + "  4444    " + "  34444   "
              sp$ = sp$ + "  34444   " + "   5885   " + " 958888   "
              sp$ = sp$ + "9988555   " + "    88    " + "    88    "
              sp$ = sp$ + "   888    "
     CASE 13: sp$ = sp$ + "          " + "    4444  " + "   44443  "
              sp$ = sp$ + "   44443  " + "   5885  7" + "8888888888"
              sp$ = sp$ + "7  5558   " + "   888888 " + " 8888   88"
              sp$ = sp$ + " 8        "
     CASE 14: sp$ = sp$ + "          " + "  4444    " + "  34444   "
              sp$ = sp$ + "  34444   " + "7  5885   " + "8888888888"
              sp$ = sp$ + "   8555  7" + " 888888   " + "88   8888 "
              sp$ = sp$ + "        8 "
     CASE 15: sp$ = sp$ + "        8 " + "       9 8" + "      4  9"
              sp$ = sp$ + "    8   9 " + "   9 4 4  " + "  4  9 98 "
              sp$ = sp$ + "9   4 4 8 " + "   98  8 4" + "      9  8"
              sp$ = sp$ + "        9 "
     CASE 16: sp$ = sp$ + "          " + "       9  " + "     9  4 "
              sp$ = sp$ + "   9  4  8" + "  4    8  " + " 9  4 8  8"
              sp$ = sp$ + "   9  4 8 " + "     9  4 " + "       9  "
              sp$ = sp$ + "          "
     CASE 17: sp$ = sp$ + " 8        " + "8 9       " + "9  4      "
              sp$ = sp$ + " 9   8    " + "  4 4  9  " + " 89 9  4  "
              sp$ = sp$ + " 8 4 4   9" + "4 8  89   " + "8  9      "
              sp$ = sp$ + " 9        "
     CASE 18: sp$ = sp$ + "          " + "  9       " + " 4  9     "
              sp$ = sp$ + "8  4  9   " + "  8    4  " + " 8  8 4  9"
              sp$ = sp$ + "8  4  9   " + " 4  9     " + "  9       "
              sp$ = sp$ + "          "
   END SELECT: spritecolors sp$: S$ = sp$
END SUB

SUB prizedata (S$, N%)
   sp$ = ""
   SELECT CASE N%
      CASE 0: S$ = STRING$(100, 0): EXIT SUB
      CASE 1: sp$ = sp$ + "          " + "          " + "          "
              sp$ = sp$ + "          " + " 444  444 " + "4444444444"
              sp$ = sp$ + "4444444444" + " 44444444 " + "   4444   "
              sp$ = sp$ + "    44    "
      CASE 2: sp$ = sp$ + "          " + "   8888   " + "    88    "
              sp$ = sp$ + "88  88  88" + " 88888888 " + "88  88  88"
              sp$ = sp$ + "    88    " + "    88    " + "   8888   "
              sp$ = sp$ + "    88    "
      CASE 3: sp$ = sp$ + "          " + "   2222   " + "    22    "
              sp$ = sp$ + "   2222   " + "   2222   " + "  222222  "
              sp$ = sp$ + "2222222222" + "2222222222" + " 22222222 "
              sp$ = sp$ + "   2222   "
      CASE 4: sp$ = sp$ + "          " + "    11    " + "   1111   "
              sp$ = sp$ + "  111111  " + " 11111111 " + "  111111  "
              sp$ = sp$ + "   1111   " + "    11    " + "          "
              sp$ = sp$ + "          "
      CASE 5: sp$ = sp$ + "          " + "          " + "   8888   "
              sp$ = sp$ + " 88788788 " + "8788888788" + "8788888878"
              sp$ = sp$ + "8878888788" + " 88788788 " + "   8888   "
              sp$ = sp$ + "          "
   END SELECT: spritecolors sp$: S$ = sp$
END SUB

SUB qbblitsprite (S AS spritedata)
   SC& = &HA000: SG& = VARSEG(S.sprite): Of& = VARPTR(S.sprite)
   BG& = VARSEG(S.buffer): BF& = VARPTR(S.buffer)
   wide& = S.y + S.w - 1: high& = S.x + S.h - 1: sp& = 0
   FOR x& = S.x TO high&
      IF (x& > -1) AND (x& < 200) THEN
         vert& = x& * 320: FOR y& = S.y TO wide&
            IF (y& > -1) AND (y& < 320) THEN
               DEF SEG = SG&: sd% = PEEK(Of& + sp&)
               DEF SEG = SC&: bd% = PEEK(BO& + vert& + y&)
               IF sd% <> 0 THEN POKE vert& + y&, sd%
               DEF SEG = BG&: POKE (BF& + sp&), bd%
            END IF: sp& = sp& + 1: NEXT
      ELSE : sp& = sp& + S.w
      END IF: NEXT: DEF SEG
END SUB

SUB qbgetsprite (S AS spritedata)
   SC& = &HA000: SG& = VARSEG(S.sprite): Of& = VARPTR(S.sprite)
   wide& = S.y + S.w - 1: high& = S.x + S.h - 1: sp& = 0
   FOR x& = S.x TO high&
      IF (x& > -1) AND (x& < 200) THEN
         vert& = x& * 320: FOR y& = S.y TO wide&
            IF (y& > -1) AND (y& < 320) THEN
               DEF SEG = SC&: sd% = PEEK(vert& + y&)
               DEF SEG = SG&: POKE Of& + sp&, sd%
            END IF: sp& = sp& + 1: NEXT
      ELSE : sp& = sp& + S.w
      END IF: NEXT: DEF SEG
END SUB

SUB qbputsprite (S AS spritedata)
   SC& = &HA000: SG& = VARSEG(S.sprite): Of& = VARPTR(S.sprite)
   wide& = S.y + S.w - 1: high& = S.x + S.h - 1: sp& = 0
   FOR x& = S.x TO high&
      IF (x& > -1) AND (x& < 200) THEN
         vert& = x& * 320: FOR y& = S.y TO wide&
            IF (y& > -1) AND (y& < 320) THEN
               DEF SEG = SG&: sd% = PEEK(Of& + sp&)
               DEF SEG = SC&: POKE vert& + y&, sd%
            END IF: sp& = sp& + 1: NEXT
      ELSE : sp& = sp& + S.w
      END IF: NEXT: DEF SEG
END SUB

SUB showlevel (L%)
   DIM SC(7) AS STRING * 100, b AS spritedata
   FOR t% = 0 TO 6: backgrounddata SC(t%), t%: NEXT
   b.w = 10: b.h = 10: levelsdata levdat, L%
   FOR t% = 0 TO 639: b.y = (t% MOD 32) * 10: b.x = (t% \ 32) * 10
      b.sprite = SC(ASC(MID$(levdat, t% + 1))): qbputsprite b: NEXT
   GET (0, 0)-(319, 199), background
END SUB

SUB spritecolors (S$)
   REDIM SC(1 TO 11) AS INTEGER: SC(1) = 0: SC(2) = 177: sp$ = ""
   SC(3) = 9: SC(4) = 10: SC(5) = 11: SC(6) = 4: SC(7) = 5
   SC(8) = 6: SC(9) = 89: SC(10) = 14: SC(11) = 15: L% = LEN(S$)
   FOR t% = 1 TO L%
      MID$(S$, t%, 1) = CHR$(SC(INSTR(" 0123456789", MID$(S$, t%, 1))))
   NEXT: ERASE SC
END SUB
