'LAST DRAWN MAP POSITION IN CELL COLUMNS GLOBAL MAPX MAPX=-32 'PLAYER POSITION IN PIXELS POSX=8 POSY=8 'CAMERA POSITION IN PIXELS CAMX=0 CAMY=0 'PLAYER SCREEN BORDER 'FOR SCROLLING BORDER=40 'GET MAP SIZE IN PIXELS MAPWIDTH=PEEK(ROM(3)+2)*8 MAPHEIGHT=PEEK(ROM(3)+3)*8 'COPY MAP TO RAM TO ALLOW 'CHANGING CELLS COPY ROM(3),SIZE(3) TO $A000 BG SOURCE $A000 GAMEPAD 1 SPRITE 0,POSX-CAMX,POSY-CAMY,16 SPRITE.A 0,(2) SCROLL 0,CAMX,CAMY 'SUB RESULTS R=0 DO 'MOVE PLAYER IF LEFT(0) THEN CALL CHECKCOLL(POSX-1,POSY,R) IF R THEN POSX=POSX-1 END IF IF RIGHT(0) THEN CALL CHECKCOLL(POSX+1,POSY,R) IF R THEN POSX=POSX+1 END IF IF UP(0) THEN CALL CHECKCOLL(POSX,POSY-1,R) IF R THEN POSY=POSY-1 END IF IF DOWN(0) THEN CALL CHECKCOLL(POSX,POSY+1,R) IF R THEN POSY=POSY+1 END IF 'ADJUST CAMERA IF POSX-BORDERCAMX+160 THEN CAMX=MIN(POSX+BORDER+8,MAPWIDTH)-160 IF POSY-BORDERCAMY+128 THEN CAMY=MIN(POSY+BORDER+8,MAPHEIGHT)-128 CALL DRAWMAP(CAMX,CAMY) SPRITE 0,POSX-CAMX,POSY-CAMY, SCROLL 0,CAMX,CAMY WAIT VBL LOOP 'X,Y: PLAYER POSITION IN PIXELS 'R IS SET TO TRUE IF NO COLLISION WITH MAP SUB CHECKCOLL(X,Y,R) 'CHECK ALL CORNERS R=-1 CALL CHECKCELL(X/8,Y/8,R) CALL CHECKCELL((X+7)/8,Y/8,R) CALL CHECKCELL(X/8,(Y+7)/8,R) CALL CHECKCELL((X+7)/8,(Y+7)/8,R) END SUB SUB CHECKCELL(X,Y,R) C=MCELL.C(X,Y) IF C=4 THEN 'CLEAR RING FROM SOURCE MCELL X,Y,0 'CLEAR FROM BG CELL X,Y,0 ELSE IF C<>0 THEN R=0 END IF END SUB 'X,Y: CAMERA POSITION IN PIXELS SUB DRAWMAP(X,Y) 'GET CELL COLUMN MX=X\8 'COMPARE NEW POSITION TO LAST IF ABS(MX-MAPX)>1 THEN 'DRAW COMPLETE SCREEN 'IF SCROLL DISTANCE IS BIG BG COPY MX,0,21,32 TO MX,0 ELSE IF MX>MAPX THEN 'DRAW ONLY ONE COLUMN ON RIGHT SIDE 'WHEN SCROLLING TO RIGHT BG COPY MX+20,0,1,32 TO MX+20,0 ELSE IF MX