10 REM Tilemap demo - Original concept, graphics and map by tr1p1ea.
   20 REM =============================================================
   30 :
   40 REM Error handler.
   50 ON ERROR CLS : MODE 0 : IF ERR=17 END ELSE REPORT : PRINT " at line ";ERL : END
   60 REM Initialise VDU.
   70 MODE 4
   80 VDU 20,26,23,1,0;0;0;0;
   90 COLOUR 0 : COLOUR 255
  100 REM Load map.
  110 DIM map$(15)
  120 FOR y%=0 TO 15 : map$(y%)=STRING$(16,".") : NEXT y%
  130 FOR y%=0 TO 15
  140   map$(y%)=""
  150   FOR x%=0 TO 15
  160     READ m% : map$(y%)=map$(y%)+CHR$(128+m%)
  170   NEXT x%
  180 NEXT y%
  190 REM Load sprites.
  200 DIM d% 7
  210 FOR s%=0 TO 23
  220   READ a%,b% : d%!0=a% : d%!4=b%
  230   VDU 23,s%+128
  240   FOR i%=0 TO 7 : VDU d%?i% : NEXT i%
  250 NEXT s%
  260 REM Player/Camera variables.
  270 pX%=1 : pY%=1
  280 camX%=0 : camY%=0
  290 REM Last key value and time.
  300 lastGK%=0 : lastGKT%=TIME
  310 :
  320 REM Main loop.
  330 REPEAT
  340   REM Draw the map onto the screen.
  350   FOR r%=0 TO 7 : PRINTTAB(0,r%)MID$(map$(r%+camY%),camX%+1,12); : NEXT r%
  360   REM Get the player's key.
  370   k%=FALSE : REPEAT : k%=FN_getKey : UNTIL k%
  380   REM We have a key to handle.
  390   newX%=pX% : newY%=pY%
  400   IF k%=1 AND newY%>0 : newY%=newY%-1
  410   IF k%=2 AND newY%<15 : newY%=newY%+1
  420   IF k%=4 AND newX%>0 : newX%=newX%-1
  430   IF k%=8 AND newX%<15 : newX%=newX%+1
  440   REM Is it walkable?
  450   IF MID$(map$(newY%),newX%+1,1)<>CHR$(128) THEN newX%=pX% : newY%=pY%
  460   REM Move man within map strings.
  470   map$(pY%)=MID$(map$(pY%),1,pX%)+CHR$(128)+MID$(map$(pY%),pX%+2,16)
  480   map$(newY%)=MID$(map$(newY%),1,newX%)+CHR$(129)+MID$(map$(newY%),newX%+2,16)
  490   REM Scroll map around.
  500   IF newX%>pX% AND newX%-camX%=11 AND camX%<4 THEN camX%=camX%+1
  510   IF newX%<pX% AND newX%-camX%=1 AND camX%>0 THEN camX%=camX%-1
  520   IF newY%>pY% AND newY%-camY%=7 AND camY%<8 THEN camY%=camY%+1
  530   IF newY%<pY% AND newY%-camY%=1 AND camY%>0 THEN camY%=camY%-1
  540   pX%=newX% : pY%=newY%
  550 UNTIL FALSE
  560 END
  570 :
  580 REM Gets the key.
  590 DEF FN_getKey : LOCAL r%
  600 r%=0
  610 IF INKEY-58:r%=r% OR 1
  620 IF INKEY-42:r%=r% OR 2
  630 IF INKEY-26:r%=r% OR 4
  640 IF INKEY-122:r%=r% OR 8
  650 IF r%<>lastGK% OR TIME>lastGKT%+10 THEN lastGK%=r% : lastGKT%=TIME : =r%
  660 =0
  670 REM Map.
  680 DATA 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  690 DATA 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4
  700 DATA 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4
  710 DATA 3, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 4
  720 DATA 3, 0, 3,11,12,13, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4
  730 DATA 3, 0, 3, 8, 9,10, 0,14,14, 4, 0, 0, 0, 0, 0, 4
  740 DATA 3, 0, 3, 5, 6, 7, 0,14,14, 4, 0, 0, 0, 0, 0, 4
  750 DATA 3, 0, 3, 0, 0, 0, 0,14,14, 4, 0, 0, 0, 0, 0, 4
  760 DATA 3, 0, 3, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 4
  770 DATA 3, 0, 2, 2, 0, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 4
  780 DATA 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4
  790 DATA 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,16,17,17,17,18, 4
  800 DATA 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,22,15,15,15,23, 4
  810 DATA 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,19,20,20,20,21, 4
  820 DATA 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4
  830 DATA 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2
  840 REM Sprite data.
  850 DATA &00205000,&00040A00
  860 DATA &99A5FF7E,&7EBDA57E
  870 DATA &00FFAA55,&00FFAAFF
  880 DATA &C0A0A0C0,&C0A4AAC0
  890 DATA &03255503,&03050503
  900 DATA &80C09ED6,&7FFFFFC0
  910 DATA &42424A42,&FFFFFF42
  920 DATA &0103795B,&FEFFFF03
  930 DATA &FFFFD5A0,&92DA9EC0
  940 DATA &FFFF5500,&423C0000
  950 DATA &FFFF5705,&496B7903
  960 DATA &7C3A1F07,&D0EFF8EA
  970 DATA &44AAFFFF,&00FF0010
  980 DATA &5EBCF8E0,&0BF71F97
  990 DATA &1A6C3400,&002C3658
 1000 DATA &20000000,&00040810
 1010 DATA &40AA5500,&41824480
 1020 DATA &00AA5500,&01020400
 1030 DATA &04AA5400,&04020402
 1040 DATA &42844080,&55AA4081
 1050 DATA &02040000,&55AA0001
 1060 DATA &04020402,&54AA0402
 1070 DATA &40804080,&40804080
 1080 DATA &04020402,&04020402