'FANESIA: A GENESIA (ULTIMATE DOMAIN) DEMAKE FOR LOWRESNX 'BY MARTIN "MOECHOFE" MAUCHAUFFEE 2021.. 'MADE ON IPAD MINI 4 VERSION$="R22" 'TODO: '================================= 'DONE UNPACK MAP 'TODO REPLACE THE SEPARATOR THAT COVERING OTHER BIOME, BY A 3RD NORMAL SEPARATOR, AND MOVE OTHER CHARAS 'TODO FIND A WAY TO QUICLY DECIDE WHICH PLOT CELL CHARA TO CHOOSE ACCORDING TO THE SITUTATION 'DONE DISPLAY THE BIOME MAP 'TODO ONLY UPDATE THE MAP BORDER INSTEAD OF THE FULL MAP 'TODO APPLY LIMIT TO MAP SCROLL 'TODO IMPLEMENT A 8X7 CELL EFFECT 'TODO PLACE SEPARATOR UNDER COVERING TILE, NOT FULL BIOME 'LEXICAL: '================================= 'MAP CELL = SAME AS BG CELL, 2X2 CELL ARE CALLED PLOTS 'MAP PLOT = 2X2 MAP CELL, ALL PLOT ARE SEPERATED BY 1 ROW AND 1 COL OF MAP CELL, 7X7 PLOT ARE CALLED PARCELS 'MAP PARCEL = 7X7 MAP PLOT, THEY CAN BE OWNED BY A PLAYER 'TECH DOC: '================================= 'EVEN IF THERE IS 4 BIOMES, WHEN THERE IS ONE THAT COVER AN OTHER ONE, THERE IS NO ALL COMBINAISON POSSIBLE: 'MOUNTAIN CAN COVER PLAIN 'PLAIN CAN COVER BEACH 'BEACH CAN COVER SEA 'SO THE PATTERN IS THE SAME AND THE RENDERING TECHNIC CAN BE DONE ONE TIMES AND REPEAT FOR EACH COMBINAISON 'BASE BIOME CELL WILL BE ALWAYS ON BG1 'COVERING BIOME SEPARATOR CELL WILL BE ALWAYS ON BG0 'FOR ONE PLOT OF 3X3 CELL: 'FF| 'FF| '--+ 'THERE IS A COUPLE OF DIFFERENTS COMBINAISON: 'THE PLOTS AT THE RIGHT, AT THE BOTTOM-RIGHT CORNER, CAN BE THE SAME OR DIFFERENT. 'IDEA: '================================= 'ATTRIBUTES RESPAWN AT A SPECIFIC SEASON. 'NOT ALL RESPAWN AT THE SAME TIMES. 'BUILDING WITH 2X2 PLOTS, SO CANNOT BE PLACED EVERYWHERE ON THE MAP. 'ASSETS: '================================= 'SOME TOOLS FOR CHARAS QUICK ACCESS 'CHARA#1..18 MOUNTAIN ROCK ASSETS 'CHARA#19..36 PLAIN GRASS ASSETS 'CHARA#37..54 BEACH SAND ASSETS 'CHARA#55.. SEA WATER ASSETS DATA 55,37,19,1 '(0) SEA '(1) BEACH '(2) GRASS '(3) MOUNTAIN DIM GLOBAL BIOME1STCHARA(3) FOR I=0 TO 3 READ BIOME1STCHARA(I) NEXT I 'PALETTE#0 SEA 'PALETTE#1 BEACH 'PALETTE#2 PLAIN 'PALETTE#3 MOUNTAIN DATA 0,1,2,3 DIM GLOBAL BIOMEPALETTE(3) FOR I=0 TO 3 READ BIOMEPALETTE(I) NEXT I 'HEXASTRING: '================================= 'IT'S A TECHNIC TO STORE A HUGE AMOUNT A DATA AS HEXADECIMAL STRING INTO 2 LOWRESNX TOKENS. FOUND BY ERICISONIT, SAUCE: HTTPS://LOWRESNX.INUTILIS.COM/TOPIC.PHP?ID=2162#POST-15391 DATA 0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,10,11,12,13,14,15 DIM GLOBAL ASC2DEC(22) FOR I=0 TO 22 READ ASC2DEC(I) NEXT I '(IN) H$ THE HEXASTRING SOURCE '(IN) I THE CHAR INDEX TO READ '(OUT) V THE READ VALUE SUB READHEXASTR(H$,I,V) V=ASC2DEC(ASC(MID$(H$,I,1))-48)*16+ASC2DEC(ASC(MID$(H$,I+1,1))-48) END SUB 'ARRAY: '================================= 'SOME TOOLS FOR ARRAY VALUE MANIPULATION '(INOUT) X,Y ARRAY CURSOR IN 1ST AND 2ND DIMENSION '(IN) A() AN 2 DIMENSION ARRAY SUB NEXTARRAY2(X,Y,A()) IF X=UBOUND(A) THEN X=0 ADD Y,1 ELSE ADD X,1 END IF END SUB 'MATH: '================================= 'CLAMP A VALUE TO A MIN AND MAX '(INOUT) V THE VALUE TO CLAMP '(IN) I MINIMAL VALUE '(IN) A MAXIMAL VALUE SUB CLAMP(V,I,A) V=MAX(I,MIN(A,V)) END SUB 'MAP DATA: '================================= 'MAP DATA CONTAINS THE BIOME TYPE AND ATTRIBUTE FLAG. 'BIOME TYPE ARE: '=0 SEA '=1 BEACH '=2 PLAIN '=3 MOUNTAIN 'ATTRIBUTE (WHEN FLAGGED-ON) ON TOP OF BIOME ARE: '=1 CHEST ON SAND '=2 TREE ON GRASS '=3 BOULDER ON ROCK 'PACKED MAP DATA ARE CONSISTS IN TWO STRINGS OF HEXADECIMAL DATA. 'THE EDITOR WILL PUT THOSE DATA INTO FILES #4 AND #5. 'THE BIOME USE THE FOLLOWING FORMAT: 'EACH BYTE USE THIS BIT FORMAT %CCCCCCTT, WITH T FOR THE BIOME TYPE, C FOR NUMBER OF TIMES THIS BIOME IS REPEATED BY BROWSING THE MAP CELLS FROM LEFT TO RIGHT, TOP TO BOTTOM. 'THE PROP USE THE FOLLOWING FORMAT: 'EACH BYTE CONTAINS 8 FLAGS, THAT REPRESENT IF ATTRIBUTES ARE PRESENT ON EACH CONSECUTIVE MAP CELLS FROM LEFT TO RIGHT, TOP TO BOTTOM. 'UNPACKED BIOME MAP DATA CONSISTS ON A SET OF ARRAYS OF 39X39 REPRESENTING EACH MAP CELLS. DIM GLOBAL BIOME(38,38) DIM GLOBAL ATTRI(38,38) 'TODO: MOVE THIS DOC WHERE THE PERSISTANT CODE IS 'THE STATUS OF A BIOME ATTRIBUTE (ON,OFF) ARE STORED AND PACKED IN PERSISTANT RAM#E000, 8 MAP CELLS ARE STORED IN EACH MEM BYTE, TAKING 35X35=154 BYTES 'NEXT PERSISTANT RAM#E09A '(IN) M THE MAP NUMBER (0..) '(LOCAL) H$ THE SOURCE HEXASTRING SUB UNPACKMAP(M) 'POINT TO THE RIGHT DATA RESTORE PACKEDMAPSDATA WHILE M>0 READ H$ READ H$ DEC M WEND 'READ HEXASTRING AND UNPACK THE BIOME TYPE '(LOCAL) H$ THE SOURCE HEXASTRING '(LOCAL) X,Y MAP CURSOR: BIOME(X,Y) '(LOCAL) I HEXASTRING CHAR CURSOR '(LOCAL) P THE READ PACKED BYTE '(LOCAL) B THE BIOME TYPE '(LOCAL) C THE BIOME REPEAT COUNTER '(LOCAL) J THE REPEAT COUNTER CURSOR READ H$ X=0 Y=0 P=0 FOR I=1 TO LEN(H$) STEP 2 CALL READHEXASTR(H$,I,P) B=P AND %11 C=(P AND %11111100)\4 FOR J=0 TO C BIOME(X,Y)=B CALL NEXTARRAY2(X,Y,BIOME()) NEXT J NEXT I 'DEVELOPER IF X<>0 OR Y<>39 THEN PAUSE 'READ HEXASTRING AND UNPACK THE ATTRIBUTE FLAG '(LOCAL) H$ THE SOURCE HEXASTRING '(LOCAL) P THE READ PACKED BYTE '(LOCAL) X,Y MAP CURSOR: BIOME(X,Y) '(LOCAL) I HEXASTRING CHAR CURSOR '(LOCAL) J THE PACKED BIT CURSOR READ H$ X=0 Y=0 FOR I=1 TO LEN(H$) STEP 2 CALL READHEXASTR(H$,I,P) FOR J=0 TO 7 ATTRI(X,Y)=P AND %1 CALL NEXTARRAY2(X,Y,ATTRI()) P=P\2 NEXT J NEXT I 'DEVELOPER IF X<>38 OR Y<>38 THEN PAUSE 'THE LAST IS MISSING BUT IT'S OK END SUB 'RENDERER: '================================= 'SHOW THE MAP WITH THE 2X2 PLOT SIZE SEPARATED BY ROWS AND COLUMNS OF SIZE 1 'BG1 FOR BIOME TYPE 'BG0 FOR SEPARATOR THAT COVER THE BIOME AT BG1 '(IN) X,Y BG CELL CURSOR '(LOCAL) M,N PLOT COL,ROW LIMITED CURSOR (0..2) '(LOCAL) E,F PLOT CURSOR (0..38) '(LOCAL) TB THIS CELL BIOME TYPE (0,1,2,3) '(LOCAL) OB OTHER CELL BIOME TYPE DIFF (-1,0,1) SUB RENDERCELL(X,Y) RANDOMIZE X*7+Y*21 M=X MOD 3 N=Y MOD 3 E=X\3 F=Y\3 BG 1 TB=BIOME(E,F) FLIP 0,0 PAL BIOMEPALETTE(TB) IF M<2 AND N<2 THEN 'FOR FULL BIOME CELL X,Y,BIOME1STCHARA(TB)+RND(3) BG 0 CELL X,Y,0 ELSE IF M=2 AND N<2 THEN 'FOR VERTICAL SEPARATOR RB=BIOME(E+1,F)-TB IF RB=0 THEN CELL X,Y,BIOME1STCHARA(TB)+4+RND(1) BG 0 CELL X,Y,0 ELSE IF RB<0 THEN BG 0 FLIP 0,RND(1) CELL X,Y,BIOME1STCHARA(TB)+6+RND(2) BG 1 FLIP 0,0 PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+4+RND(1) ELSE PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+4+RND(1) BG 0 FLIP 1,RND(1) PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+6+RND(2) END IF ELSE IF M<2 AND N=2 THEN 'FOR HORIZONTAL SEPARATOR BB=BIOME(E,F+1)-TB IF BB=0 THEN CELL X,Y,BIOME1STCHARA(TB)+9+RND(1) BG 0 CELL X,Y,0 ELSE IF BB<0 THEN PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+BB)+9+RND(1) BG 0 FLIP RND(1),0 PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+11+RND(2) ELSE PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+9+RND(1) BG 0 FLIP RND(1),1 PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+BB)+11+RND(1) END IF ELSE 'FOR CROSS SEPARATOR RB=BIOME(E+1,F)-TB BB=BIOME(E,F+1)-TB CB=BIOME(E+1,F+1)-TB IF RB=0 AND BB=0 AND CB=0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 CELL X,Y,0 ELSE IF RB<0 AND BB=0 AND CB<0 THEN PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+14 BG 0 PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+6+RND(2) ELSE IF RB=0 AND BB<0 AND CB<0 THEN PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+BB)+14 BG 0 FLIP RND(1),0 PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+11+RND(2) ELSE IF RB<0 AND BB<0 AND CB<0 THEN BG 0 CELL X,Y,BIOME1STCHARA(TB)+15 BG 1 PAL BIOMEPALETTE(TB+CB) CELL X,Y,BIOME1STCHARA(TB+CB)+14 ELSE IF RB<0 AND BB<0 AND CB=0 THEN BG 0 CELL X,Y,BIOME1STCHARA(TB)+16 BG 1 PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+RB)+12 ELSE IF RB>0 AND BB=0 AND CB>0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 FLIP 1,0 PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+6+RND(2) ELSE IF RB=0 AND BB>0 AND CB>0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 FLIP 0,1 PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+BB)+11+RND(2) ELSE IF RB>0 AND BB>0 AND CB>0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 FLIP 1,1 PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+17 ELSE IF RB=0 AND BB=0 AND CB>0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 FLIP 1,1 PAL BIOMEPALETTE(TB+CB) CELL X,Y,BIOME1STCHARA(TB+CB)+15 ELSE IF RB<0 AND BB=0 AND CB=0 THEN PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+14 BG 0 FLIP 0,1 PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+17 ELSE IF RB=0 AND BB>0 AND CB=0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 FLIP 0,1 PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+BB)+15 ELSE IF RB=0 AND BB<0 AND CB=0 THEN PAL BIOMEPALETTE(TB+BB) CELL X,Y,BIOME1STCHARA(TB+BB)+14 BG 0 FLIP 1,0 PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+17 ELSE IF RB>0 AND BB=0 AND CB=0 THEN CELL X,Y,BIOME1STCHARA(TB)+14 BG 0 FLIP 1,0 PAL BIOMEPALETTE(TB+RB) CELL X,Y,BIOME1STCHARA(TB+RB)+15 ELSE IF RB=0 AND BB=0 AND CB<0 THEN PAL BIOMEPALETTE(TB+CB) CELL X,Y,BIOME1STCHARA(TB+CB)+14 BG 0 PAL BIOMEPALETTE(TB) CELL X,Y,BIOME1STCHARA(TB)+17 END IF END IF END SUB 'MAP SCENE '================================= '(GLOBAL) MX,MY MAP POSITION MX=0 MY=0 'TEMP SPRITE 2,2*8,2*8,81 SPRITE 2 PAL 4 SPRITE 3,17*8,13*8,81 SPRITE 3 FLIP 1,1 PAL 4 SPRITE 4,2*8,13*8,81 SPRITE 4 FLIP 0,1 PAL 4 SPRITE 5,17*8,2*8,81 SPRITE 5 FLIP 1,0 PAL 4 GLOBAL MX,MY '(LOCAL) TD TOUCH TIME DURATION '(LOCAL) BX,BY TOUCH BEGIN COORDS IN PIXEL '(LOCAL) DX,DY MOVED DISTANCE THIS FRAME IN PIXEL '(LOCAL) CT,CL,CB,CR REDRAW RECT IN MAP CELL '(LOCAL) PT,PL,PB,PR PREVIOUS REDRAW RECT IN MAP CELL SUB MAPSCENE GOSUB MAPUPDRECT GOSUB MAPDRAWFULL 'DETECT TOUCH INPUT MAPINPUT: TD=15 DO IF TAP THEN TD=0 BX=TOUCH.X BY=TOUCH.Y ELSE IF TOUCH THEN ADD TD,1 IF ABS(TOUCH.X-BX)>2 OR ABS(TOUCH.Y-BY)>2 THEN GOTO MAPPAN IF TD>=15 THEN GOTO MAPPAN ELSE IF TD<15 THEN TD=15 GOTO MAPTAP END IF WAIT VBL LOOP MAPTAP: TRACE "TAP" GOTO MAPINPUT '(W) DX,DY MOVED DISTANCE THIS FRAME IN PIXEL MAPPAN: DO DX=BX-TOUCH.X DY=BY-TOUCH.Y IF DX<>0 OR DY<>0 THEN ADD MX,DX ADD MY,DY CALL CLAMP(MX,0,768) CALL CLAMP(MY,0,800) SCROLL 1,MX,MY SCROLL 0,MX,MY BX=TOUCH.X BY=TOUCH.Y GOSUB MAPUPDATE END IF WAIT VBL IF NOT TOUCH THEN GOTO MAPINPUT LOOP '(RW) CT,CL,CB,CR REDRAW COORDS IN MAP CELL TOP,LEFT,BOTTOM,RIGHT) '(W) PT,PL,PB,PR PREVIOUS REDRAW RECT IN MAP CELL '(W) X,Y MAP CELL ITERATOR MAPUPDATE: GOSUB MAPUPDRECT 'RENDER NEW CELLS AT THE RIGHT IF CR>PR THEN ADD PR,1 ADD PL,1 FOR Y=CT TO CB CALL RENDERCELL(PR,Y) NEXT Y 'RENDER NEW CELLS AT THE LEFT ELSE IF CLPB THEN ADD PB,1 ADD PT,1 FOR X=CL TO CR CALL RENDERCELL(X,PB) NEXT X 'RENDER NEW CELLS AT THE TOO ELSE IF CT