'MAPPING BETWEEN CHARACTER NUM USED TO DRAW THE MAP (ROM#4) AND BG SOURCE COORDS FOR META TILES (ROM#3)
'ALL META TILES ARE 2X2

'    ROW COUNT
DATA 21

'    NUM, X, Y (NUM= CHARACTER NUM, X,Y= BG SOURCE ROM#3)
DATA 0,   0, 0
DATA 2,   2, 0
DATA 3,   4, 0
DATA 4,   6, 0
DATA 5,   8, 0
DATA 6,   10,0
DATA 7,   12,0
DATA 8,   14,0
DATA 9,   16,0
DATA 10,  18,0
DATA 11,  20,0
DATA 12,  22,0
DATA 13,  24,0
DATA 14,  26,0
DATA 15,  28,0
DATA 63,  30,0
DATA 79,  32,0
DATA 80,  34,0
DATA 81,  36,0
DATA 82,  38,0
DATA 83,  40,0

DIM GLOBAL METAX(83),METAY(UBOUND(METAX))

READ COUNT
FOR I=0 TO COUNT-1
  READ NUM
  READ METAX(NUM),METAY(NUM)
NEXT I



'USER'S FUNCTION THAT ACTUALLY DRAW CELLS OF THE WORLD
'(IN) L,T = LEFT AND TOP POSITION IN WORLD-CELL-COORDS
'(IN) (W,H) = WITH AND HEIGHT DIMENSION IN WORLD-CELL-COORDS
'IT WILL ASK TO DRAW HORIZONTAL OR VERTICAL LINES FROM THE WORLD
SUB INF_WORLD(L,T,W,H)
  IF W=0 OR H=0 THEN EXIT SUB

  BG 1
  PAL 0
  
  'DRAWING AN HORIZONTAL LINE
  IF W>H THEN
    WORLD_Y=T
    FOR I=0 TO W-1
      WORLD_X=L+I
      GOSUB INF_WORLD_DRAW
    NEXT I
    EXIT SUB

  'DRAWING A VERTICAL LINE
  ELSE
    WORLD_X=L
    FOR I=0 TO H-1
      WORLD_Y=T+I
      GOSUB INF_WORLD_DRAW
    NEXT I
    EXIT SUB
  END IF

INF_WORLD_DRAW:

  'READ META TILE ID
  BG SOURCE ROM(4)
  WORLD_TILE=MCELL.C(WORLD_X,WORLD_Y)
  
  'DRAW META TILE, ONE AT A TIME
  BG SOURCE ROM(3)
  BG COPY METAX(WORLD_TILE),METAY(WORLD_TILE),2,2 TO WORLD_X*2,WORLD_Y*2
  
  RETURN
END SUB

'USER'S FUNCTION TO SCROLL THE BACKGROUND
SUB INF_SCROLL(X,Y)
  SCROLL 1,X,Y
END SUB

'RECTANGLE OF THE WHOLE WORLD MAP
'A.K.A.: WORLD BOUNDARIES IN WORLD-META-CELL-COORDS
'/!\ THIS IS NOT BG-LAYER-CELL-COORD
INFL=0
INFT=0
INFR=20-1
INFB=40-1

'CAMERA DIMENSION, A.K.A.: VIEW DIMENSION IN PIXEL-COORDS
'CAMERA VIEW START OF THE TOP-LEFT CORNER OF THE DEVICE, IF YOU WANT TO CHANGE IT, DO IT YOURSELF.
INFW=160
INFH=128

'WORLD CELL SIZE IN PIXEL-COORD, A.K.A.: PIXEL TO CELL CONVERSION
INFS=16

'CONVERT BG LAYER SIZE 64X64 TO WORLD-META-CELL-COORD
INFG=32/(INFS\8)

'NUMBER OF CELLS TO DRAW OUT OF THE VIEW TO MAKE THEN ALREADY DRAWN WHEN THE CAMERA IS PANNED.
'NOTE IF THE NUMBER IS TOO BIG IT CAN LEAD TO OVERWRITE WRAPPED CELLS THE ARE VISIBLE.
'MAX VALUE=7 WITH INFS=8
INFCO=0

'COMPUTE SPACE OCCUPIED BY THE WHOLE WORLD IN PIXEL-COORDS
INFPW=(INFR-INFL+1)*INFS
INFPH=(INFB-INFT+1)*INFS

'CAMERA POSITION IN THE WORLD IN PIXEL-COORDS
'INITIAL POSITION POINT TO THE CENTER OF THE WORLD
INFX=-(INFW-INFPW)/2
INFY=-(INFH-INFPH)/2

GOSUB INF_PREPARE

'RECTANGLE OF WHAT PORTION OF THE WORLD IS DRAWN
'A.K.A.: VIEW DRAWING CURSOR IN WORLD-CELL-COORDS
'INITIAL RECTANGEL START FROM THE CENTER OF THE VIEW
INFCL=(INFPL+INFPR)\2
INFCT=(INFPT+INFPB)\2
INFCR=INFCL-1
INFCB=INFCT-1

'NEED RECOMPUTE POSITION
INFNL=-1

TOUCHSCREEN

DO
  IF TAP THEN
    'SAVE ORIGINAL PAN POSITION OF THE WORLD
    INFXS=INFX
    INFYS=INFY
    INFTX=TOUCH.X
    INFTY=TOUCH.Y
  ELSE IF TOUCH THEN
    'PAN THE CAMERA VIEW ONTO THE WORLD
    INFX=INFXS-(TOUCH.X-INFTX)
    INFY=INFYS-(TOUCH.Y-INFTY)
    INFNL=-1
  END IF

  IF INFNL THEN GOSUB INF_POSITION

  GOSUB INF_DRAW
  'IF YOU WANT TO DRAW FASTER
  ' GOSUB INF_DRAW
  ' GOSUB INF_DRAW

  BG 0
  PAL 1
  NUMBER 1,1,INFPL,4
  NUMBER 1,2,INFPT,4
  NUMBER 1,3,INFPR,4
  NUMBER 1,4,INFPB,4

  WAIT VBL
LOOP

'MAKE SURE THE CAMERA POSITION ALLOW TO SEE THE WORLD AND SOME OF THE OUT-OF-BOUND CHARACTERS AROUND IT.
INF_POSITION:
  INFNL=0

  'IN X AXIS
  IF INFPW>INFW THEN
    'WORLD IS BIGGER THAN THE VIEW
    L=INFL*INFS
    R=(INFR+1)*INFS-INFW
    'PREVENT TO PAST BEYOND
    IF INFX<L THEN INFX=L
    IF INFX>R THEN INFX=R
  ELSE
    'WORLD IS SMALL THAN THE VIEW, CENTER IT
    INFX=-(INFW-INFPW)/2
  END IF
  'IN Y AXIS
  IF INFPH>INFH THEN
    'WORLD IS BIGGER THAN THE VIEW
    T=INFT*INFS
    B=(INFB+1)*INFS-INFH
    IF INFY<T THEN INFY=T
    IF INFY>B THEN INFY=B
  ELSE
    'WORLD IS SMALL THAN THE VIEW, CENTER IT
    INFY=-(INFH-INFPH)/2
  END IF
  CALL INF_SCROLL(INFX,INFY)
  GOTO INF_PREPARE

INF_PREPARE:
  'RECTANGLE OF THE VIEW, THE PORTION OF THE VISIBLE WORLD
  'A.K.A.: VIEW POSITION IN WORLD-CELL-COORDS
  INFPL=INT(INFX/INFS)-INFCO
  INFPT=INT(INFY/INFS)-INFCO
  INFPR=INT((INFX+INFW)/INFS)+INFCO
  INFPB=INT((INFY+INFH)/INFS)+INFCO
  RETURN

INF_DRAW:
  'RENDER MISSING WORLD CELLS AT LEFT
  IF INFPL<INFCL AND INFCL>INFL THEN
    DEC INFCL
    IF INFCR-INFCL>=INFG THEN DEC INFCR
    CALL INF_WORLD(INFCL,INFCT,1,INFCB-INFCT+1)
  END IF

  'RENDER MISSING CELLS AT RIGHT
  IF INFPR>INFCR AND INFCR<INFR THEN
    INC INFCR
    IF INFCR-INFCL>=INFG THEN INC INFCL
    CALL INF_WORLD(INFCR,INFCT,1,INFCB-INFCT+1)
  END IF

  'RENDER MISSING CELLS AT TOP
  IF INFPT<INFCT AND INFCT>INFT THEN
    DEC INFCT
    IF INFCB-INFCT>=INFG THEN DEC INFCB
    CALL INF_WORLD(INFCL,INFCT,INFCR-INFCL+1,1)
  END IF

  'RENDER MISSING CELLS AT BOTTOM
  IF INFPB>INFCB AND INFCB<INFB THEN
    INC INFCB
    IF INFCB-INFCT>=INFG THEN INC INFCT
    CALL INF_WORLD(INFCL,INFCB,INFCR-INFCL+1,1)
  END IF

  RETURN

#1:MAIN PALETTES
1B292510003F3F000000000000000000
00000000000000000000000000000000

#2:DEFAULT CHARACTERS
00000000000000000000000000000000
FFFFFFFFFFFFFFFF0000000000000000
00003F3F3037343400003F202F2F2C2C
0000FFFF81FF00000000FF81FFFF0000
0000FCF414F434340000FC0CECEC2C2C
3434343C343434342C2C2C3C2C2C2C2C
0000003C343434340000003C2C2C2C2C
343434343C0000002C2C2C2C3C000000
00001F1F101F000000001F101F1F0000
3434F7FF10F734342C2CEF00EFEF2C2C
007EFFFF42C37E00007EC342FFFF7E00
3434373F203F00002C2C2F203F3F0000
3434F4F404FC00002C2CEC0CFCFC0000
34343434343434342C2C2C2C2C2C2C2C
0000FFFF10F734340000FF00EFEF2C2C
3434F7F700FF00002C2CEF08FFFF0000
00000003070F1F180000000304081017
000007FFFBFBFB3B000007FC040404E4
0000E0FFDFDFDFDF0000E03F20202020
000003FFFDFDFDFD000003FE02020202
0000E0FFDFDFDFD80000E03F20202027
000000C020908868000000C0E07078F8
1F1F1F1F1F1F1F181010101010101017
888888888888886878787878787878F8
00000000000000070000000000000007
00000000000000E000000000000000E0
18171F3F3834232717181020272B3C3B
68D8C8C42434FCFCF838383CFCDC3CDC
000003070D0D0D09000003060E0A0A0E
1817E8F7CFCFC0C71718F73830303F38
088807EFF1F121D1F878FF1E0E0EFE3E
0000C0FFB0B0B0B00000C07F50505050
171F3F38372F2F2F1810202728303030
D7CCC464148F8C8C3C3F3FFFFF7F7C7C
E02020203FE000003FFFFFFFFFE00000
03020202FE030000FEFFFFFFFF030000
EF3F3F3837EF2F2F38F0E0E7E8F03030
D8C8C464148C8C8C38383CFCFC7C7C7C
171F3F38372F2F2F1810202728303030
D8C8C464148C8C8C38383CFCFC7C7C7C
0F1F3F38372F2F2F0810202728303030
D0C8C464148C8C8C30383CFCFC7C7C7C
36160B07000000002B1B0C0700000000
3438F0E000000000DCD830E000000000
0F0A0A0E060300000A0F0F0F07030000
DF3F38372FEF2F1F30E0E7E8F0F03010
CBC666168E8F8C883E3FFFFF7F7F7C78
F77040407FC0000048FFFFFFFFC00000
1F1F1F1F1F1F1713101010101010181C
88888BCFFDFDFDFD78787B3E02020202
1F1FFFFFDFDFDFDE1010F03020202021
8888888888880808787878787878F8F8
1F1F1F1F1F1F1F1F1010101010101010
88888888888888887878787878787878
0000E0FFCFCFC0C70000E03F30303F38
000003FFF1F121D1000003FE0E0EFE3E
1817E8F7CFCFCFCC1718F73830303033
088807EFF1F1F131F878FF1E0E0E0ECE
181738372F3F38371718272830202728
088807EFF1F121D1F878FF1E0E0EFE3E
1817E8F7CFCFC0C71718F73830303F38
088804ECF4F424D4F878FC1C0C0CFC3C
000000FFFFFFFFFF000000FF00000000
3434373F303734342C2C2F202F2F2C2C
08080403000000000F0F070300000000
03020202FE030000FEFFFFFFFF030000
E02020203FE000003FFFFFFFFFE00000
101020C000000000F0F0E0C000000000
000000000F0F0205000000000F000F0F
00000000F0F0F0F000000000F000F0F0
DF3F38372FEF2F1F30E0E7E8F0F03010
CBC666168E8F8C883E3FFFFF7F7F7C78
E02020203FE000003FFFFFFFFFE00000
03020202FE030000FEFFFFFFFF030000
2F3F38372F2F2F1F3020272830303010
CBC666168E8F8C883E3FFFFF7F7F7C78
DF3F38372FEF2F1F30E0E7E8F0F03010
CCC464148C8C8C883C3CFCFC7C7C7C78
00000000FF000000FFFFFFFFFF000000
3434F4F414F434342C2CEC0CECEC2C2C
0000FFFF00FF00000000FF00FFFF0000
0000FFFF80FF00000000FF80FFFF0000
0000FFFF01FF00000000FF01FFFF0000
0000F8F808F800000000F808F8F80000

#3:META TILES DB
00002A02000000001000110012001300
1400150016001700180019001A001B00
00001C001D001E001F001F0830003100
32003300340035003600370038003900
3A003B003C003D003E003E0012003E00
3E0013001C0800000000000020002100
22002300240025002600270028002900
2A002B0000002C002D002E002F002F08
40004100420043003400350046004700
480049004A004B004C004D004E004E00
22004E004E0023002C080000

#4:MAP
00001428010001000100010001000100
01000100010001000100010001000100
01000100010001000100010001000200
5100500052000E000E00040000000000
00000800040000000000020003000400
0000010052000C000000000008000C00
0D000B00510050005000040005000000
00000B00040005000000010001000000
00000000080052000C00000000000000
00003F000C000000000000000D000D00
00000100010000000000000000000000
000000000000000000000D0000000000
000000000D000D000000010001000000
00000000000000000000000000000000
00000B0051005000500052000C000B00
04000100010000000000000000000000
00000000000000000000020051005000
50005000500052004F00010001000000
00000000000000000000000000000000
06000D00000000000000000000000000
07000100010000000200510050005000
50005000500052004F000B0004000000
00000000000000000000010001000000
05000600060000000000000000000000
0B0003000C0000000000000000000000
00000100010000000B000F0009005300
00000000000000000000000000000000
00000000000000000000010001000000
00000000050000000000000000000000
00000000000000000000000008000400
0000010001000000000000000B005100
50005000500050005000520004000000
00000000000005000000010001000000
00000000000000000000000000000000
000000000B0051005000500052004F00
00000100010000000000000000000000
00000000000000000000000000000000
0000000000000D000000010001000000
00000000000000000000000000000000
00000000000000000000020003000C00
00000100010000000000000000000000
00000000000000000000000000000000
08000900530000000000010001000000
00000000000000000000000000000000
00000000000000000000050000000000
00000100010000000000000000000000
02005100500050005000500052000400
02000C00000000000000010001000000
00000000000000000D00000000000000
0000000002000F000C00000000000000
00000100010000000000000000000000
0D00000000000000000000000B005100
50005000500050005300010001000000
00000000000000000D00000000000000
00000000000000000000000000000000
00000100010000000000000000000000
05000000000000000000000000000000
00000000000000000000010001000000
00000000000000000D00000000000000
00000000000000000000000000000000
00000100010000000000000000000000
0D000000000000000000000000000000
00000000000000000000010001000000
00000200030004000D00000000000000
00000000000000000000000000000000
000001000100000000003F0053000B00
0C000000000000000000000000000000
00000000000000000000010001000000
00000B00510050005200040000000000
00000000000000000000000000000000
00000100010000000000000000000000
00000500000000000000000000000000
00000000000000000000010001000000
000000000000000000000B0051005200
04000000000000000000000000000000
00000100010000000000000008000300
04000000000000000500000000000000
00000000000000000000010001000000
00000000000000000B00510050005200
4F000000000000000000000000000000
00000100010000000000000000000000
00000000000000000D00000000000000
00000000000000000000010001000000
00000000000000000000000000000000
0D000000060000000000000000000000
00000100010000000000000000000000
0000000000000000050002000C000000
00000000000000000000010001000000
00000000000000000000000000000000
0B004F00000000000000000000000000
00000100010000000000000000000000
000000000000000000000D0000000000
00000000000002005100500001000000
00000000000000000000000000000000
00000D00020051005000500052000C00
00000100010000000000000000000000
000000000000000000000B000C000000
00000000000000000000010001000100
01000100010001000100010001000100
01000100010001000100010001000100
01000100

