First step finished: The Map Editor.
Spoiler
DECIMAL : CREATE2 ( -- ) <BUILDS DOES> ; : CELLS ( n -- n ) 2 * ; -1 CONSTANT TRUE 0 CONSTANT FALSE 33657 CONSTANT TIMER 33728 CONSTANT SEED 0 VARIABLE V1 0 VARIABLE V2 0 VARIABLE V3 : CHAR ( n addr -- ) SWAP 8 * 2048 + 8 VMBW ; : PUTCHAR ( char col row -- ) 32 * + C!VDP ; : COLOR ( color charset -- ) 896 + C!VDP ; : SPRITE ( color char n -- ) 4 * 770 + SWAP 128 + OVER C!VDP 1+ C!VDP ; : LOCATE ( col row n -- ) 4 * 768 + SWAP OVER SWAP 1- SWAP C!VDP 1+ C!VDP ; : PATTERN ( n addr -- ) SWAP 8 * 1024 + 8 VMBW ; : RAND ( n -- n ) SEED @ 28645 U* DROP 31417 + DUP SEED ! U* SWAP DROP ; : CHAR-DEF ( w4..w1 addr -- ) 4 0 DO SWAP OVER ! 2 + LOOP DROP ; : DELAY ( n -- ) 0 TIMER ! BEGIN DUP TIMER @ < UNTIL DROP ; : ALIGN HERE =CELLS DP ! ; : ," 34 WORD HERE C@ 1+ ALLOT ALIGN ; IMMEDIATE : (S") R> DUP DUP C@ + >R 1+ DUP 1+ SWAP C@ ; : S" ( -- addr count ) STATE @ IF COMPILE (S") HERE 1 DP +! 34 WORD HERE C@ 2 + =CELLS DUP 1- ALLOT SWAP C! ELSE 17 MESSAGE ENDIF ; IMMEDIATE : INPUT-STRING ( -- ) 0 V1 ! QUERY BEGIN V1 @ TIB @ + C@ DUP DUP 0= 0= IF PAD V1 @ + 1+ C! 1 V1 +! ELSE DROP ENDIF 0= UNTIL V1 @ PAD C! 0 TIB @ ! ; : INPUT-NUMBER ( -- n ) INPUT-STRING 1 V1 ! 0 V2 ! 0 PAD C@ DO PAD I + C@ 10 DIGIT IF V1 @ SWAP OVER * V2 +! 10 * V1 ! ELSE 54 GPLLNK DROP -1 V2 ! LEAVE ENDIF -1 +LOOP V2 @ ; ( *************************** MAIN ) : RED ( -- ) ; : BLUE ( n -- n ) 24 + ; : GREY ( n -- n ) 48 + ; 128 CONSTANT INFANTRY 129 CONSTANT TANK 130 CONSTANT CITY 131 CONSTANT BASE2 132 CONSTANT HQ 133 CONSTANT PORT 134 CONSTANT AIRPORT 200 CONSTANT PLAIN 201 CONSTANT WOOD 202 CONSTANT MOUNTAIN 208 CONSTANT ROAD-H 209 CONSTANT ROAD-V 210 CONSTANT ROAD-TL 211 CONSTANT ROAD-TR 212 CONSTANT ROAD-BL 213 CONSTANT ROAD-BR 216 CONSTANT SEA 217 CONSTANT BRIDGE-H 218 CONSTANT BRIDGE-V 224 CONSTANT REEF 225 CONSTANT SHOAL-L 226 CONSTANT SHOAL-R 227 CONSTANT SHOAL-T 228 CONSTANT SHOAL-B 229 CONSTANT SHOAL-TL 230 CONSTANT SHOAL-TR 231 CONSTANT SHOAL-BL 232 CONSTANT SHOAL-BR CREATE2 PAT 8 ALLOT 19 CONSTANT MAP-DISP-W-MAX 24 CONSTANT MAP-DISP-H-MAX CREATE2 MAP 1022 ALLOT 18 VARIABLE MAP-WIDTH 22 VARIABLE MAP-HEIGHT 0 VARIABLE IN-OFFX 0 VARIABLE IN-OFFY 9 VARIABLE CURSX 9 VARIABLE CURSY 0 VARIABLE EXIT 1 VARIABLE BLOCK# 0 VARIABLE OUT-OFFX 0 VARIABLE OUT-OFFY 0 VARIABLE MAP-DISP-W 0 VARIABLE MAP-DISP-H 0 CONSTANT SELECT-MODE 1 CONSTANT PAINT-MODE SELECT-MODE VARIABLE MODE 0 VARIABLE SELECT-X 0 VARIABLE SELECT-Y 20 CONSTANT PALETTE-X 8 CONSTANT PALETTE-Y 11 CONSTANT PALETTE-W 4 CONSTANT PALETTE-H CREATE2 BUF 1022 ALLOT 0 VARIABLE MEM-WIDTH 0 VARIABLE MEM-HEIGHT : UNIT-DEF ( unit w4..w1 -- ) PAT CHAR-DEF DUP RED PAT CHAR BLUE PAT CHAR ; : BUILDING-DEF ( building w4..w1 -- ) PAT CHAR-DEF DUP RED PAT CHAR DUP BLUE PAT CHAR GREY PAT CHAR ; : TERRAIN-DEF ( terrain w4..w1 -- ) PAT CHAR-DEF PAT CHAR ; HEX : PATTERNS&COLORS ( -- ) 0 81FF 8181 8181 FF81 PAT CHAR-DEF PAT PATTERN F 0 0 SPRITE B 0 1 SPRITE 1C 7 C!REG 1C 0 COLOR 10 4 DO 1E I COLOR LOOP INFANTRY 2828 1C10 1810 0018 UNIT-DEF TANK 7E00 7E81 1E24 0000 UNIT-DEF CITY 557F 577D 577D 0070 BUILDING-DEF BASE2 4A7E 7E4A 1010 0008 BUILDING-DEF HQ 4454 447C 447C 007C BUILDING-DEF PORT 3901 1155 1111 FF01 BUILDING-DEF AIRPORT 1020 FF04 0A04 000E BUILDING-DEF 19 10 COLOR 19 11 COLOR 19 12 COLOR 17 13 COLOR 17 14 COLOR 17 15 COLOR 1E 16 COLOR 1E 17 COLOR 1E 18 COLOR PLAIN 0000 0000 0000 0000 TERRAIN-DEF WOOD 4A40 FFEA 5FFF 000A TERRAIN-DEF MOUNTAIN BF00 DFBF 74EE 0020 TERRAIN-DEF C3 19 COLOR ROAD-H FF00 FFFF FFFF 00FF TERRAIN-DEF ROAD-V 7E7E 7E7E 7E7E 7E7E TERRAIN-DEF ROAD-TL 7F7E 7F7F 7F7F 003F TERRAIN-DEF ROAD-TR FE7E FEFE FEFE 00FC TERRAIN-DEF ROAD-BL 3F00 7F7F 7F7F 7E7F TERRAIN-DEF ROAD-BR FC00 FEFE FEFE 7EFE TERRAIN-DEF E3 1A COLOR SEA 0000 0000 0000 0000 TERRAIN-DEF BRIDGE-H FF00 FFFF FFFF 00FF TERRAIN-DEF BRIDGE-V 7E7E 7E7E 7E7E 7E7E TERRAIN-DEF E5 1B COLOR REEF 6200 0207 7020 0022 TERRAIN-DEF SHOAL-L F0F0 F0F0 F0F0 F0F0 TERRAIN-DEF SHOAL-R 0F0F 0F0F 0F0F 0F0F TERRAIN-DEF SHOAL-T 0000 0000 FFFF FFFF TERRAIN-DEF SHOAL-B FFFF FFFF 0000 0000 TERRAIN-DEF SHOAL-TL F0F0 F8F0 FFFF FFFF TERRAIN-DEF SHOAL-TR 0F0F 1F0F FFFF FFFF TERRAIN-DEF SHOAL-BL FFFF FFFF F0F8 F0F0 TERRAIN-DEF SHOAL-BR FFFF FFFF 0F1F 0F0F TERRAIN-DEF A5 1C COLOR A5 1D COLOR ; DECIMAL : SAVE-MAP ( -- ) MAP MAP-WIDTH @ MAP-HEIGHT @ * BLOCK# @ DUP SCR ! BLOCK DUP MAP-WIDTH @ SWAP ! 2 + DUP MAP-HEIGHT @ SWAP ! 2 + SWAP CMOVE UPDATE FLUSH ; : LOAD-MAP ( -- ) BLOCK# @ BLOCK DUP @ MAP-WIDTH ! 2 + DUP @ MAP-HEIGHT ! 2 + MAP MAP-WIDTH @ MAP-HEIGHT @ * CMOVE ; : SHOW-MAP MAP-DISP-H @ 0 DO I IN-OFFY @ + MAP-WIDTH @ * IN-OFFX @ + MAP + I OUT-OFFY @ + 32 * OUT-OFFX @ + MAP-DISP-W @ VMBW LOOP ; : BACKGROUND MAP-DISP-H-MAX 0 DO I 32 * MAP-DISP-W-MAX 0 FILLVDP LOOP ; : MOVE ( x y -- ) CURSY @ + DUP DUP 0< 0= SWAP MAP-DISP-H @ < AND IF CURSY ! ELSE DROP ENDIF CURSX @ + DUP DUP 0< 0= SWAP MAP-DISP-W @ < AND IF CURSX ! ELSE DROP ENDIF CURSX @ OUT-OFFX @ + 8 * CURSY @ OUT-OFFY @ + 8 * 0 LOCATE SELECT-X @ PALETTE-X + 8 * SELECT-Y @ PALETTE-Y + 8 * 1 LOCATE PAINT-MODE MODE ! ; : MAP-INIT BACKGROUND MAP-WIDTH @ MAP-DISP-W-MAX > IF 0 OUT-OFFX ! MAP-DISP-W-MAX MAP-DISP-W ! ELSE MAP-DISP-W-MAX MAP-WIDTH @ - 2 / OUT-OFFX ! MAP-WIDTH @ MAP-DISP-W ! ENDIF MAP-HEIGHT @ MAP-DISP-H-MAX > IF 0 OUT-OFFY ! MAP-DISP-H-MAX MAP-DISP-H ! ELSE MAP-DISP-H-MAX MAP-HEIGHT @ - 2 / OUT-OFFY ! MAP-HEIGHT @ MAP-DISP-H ! ENDIF CURSX @ MAP-WIDTH @ 1- > IF MAP-WIDTH @ 2 / CURSX ! ENDIF CURSY @ MAP-HEIGHT @ 1- > IF MAP-HEIGHT @ 2 / CURSY ! ENDIF 0 IN-OFFX ! 0 IN-OFFY ! 0 0 MOVE ; : SHOW-PARAMS 4 1 DO I 32 * 28 + 4 BL FILLVDP LOOP 28 C-COL ! 1 C-ROW ! BLOCK# @ . 28 C-COL ! 2 C-ROW ! MAP-WIDTH @ . 28 C-COL ! 3 C-ROW ! MAP-HEIGHT @ . ; : SHOW-DIALOG 24 0 DO I 32 * 19 + 13 BL FILLVDP LOOP 20 C-COL ! 1 C-ROW ! ." File: " 20 C-COL ! 2 C-ROW ! ." Width: " 20 C-COL ! 3 C-ROW ! ." hEight: " 20 C-COL ! 5 C-ROW ! ." Load" 20 C-COL ! 6 C-ROW ! ." Save" 20 C-COL ! 19 C-ROW ! ." seleCt" 20 C-COL ! 20 C-ROW ! ." Paint" 20 C-COL ! 21 C-ROW ! ." cleAr" 20 C-COL ! 22 C-ROW ! ." Quit" SHOW-PARAMS PALETTE-Y 32 * PALETTE-X + PLAIN OVER C!VDP 1+ WOOD OVER C!VDP 1+ MOUNTAIN OVER C!VDP 1+ ROAD-H OVER C!VDP 1+ ROAD-V OVER C!VDP 1+ ROAD-TL OVER C!VDP 1+ ROAD-TR OVER C!VDP 1+ ROAD-BL OVER C!VDP 1+ ROAD-BR OVER C!VDP 1+ SEA OVER C!VDP 1+ SHOAL-L OVER C!VDP 22 + SHOAL-R OVER C!VDP 1+ SHOAL-T OVER C!VDP 1+ SHOAL-B OVER C!VDP 1+ SHOAL-TL OVER C!VDP 1+ SHOAL-TR OVER C!VDP 1+ SHOAL-BL OVER C!VDP 1+ SHOAL-BR OVER C!VDP 1+ BRIDGE-H OVER C!VDP 1+ BRIDGE-V OVER C!VDP 1+ REEF OVER C!VDP 1+ CITY RED OVER C!VDP 22 + CITY BLUE OVER C!VDP 1+ CITY GREY OVER C!VDP 1+ HQ RED OVER C!VDP 1+ HQ BLUE OVER C!VDP 1+ BASE2 RED OVER C!VDP 1+ BASE2 BLUE OVER C!VDP 1+ BASE2 GREY OVER C!VDP 1+ PORT RED OVER C!VDP 1+ PORT BLUE OVER C!VDP 1+ PORT GREY OVER C!VDP 1+ AIRPORT RED OVER C!VDP 22 + AIRPORT BLUE OVER C!VDP 1+ AIRPORT GREY OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP 1+ PLAIN OVER C!VDP DROP ; : INPUT-PARAM ( addr col row -- ) 2DUP 32 * + 4 BL FILLVDP 2DUP C-ROW ! C-COL ! ROT DUP INPUT-NUMBER DUP -1 = 0= IF SWAP ! ELSE DROP DROP ENDIF ROT ROT C-ROW ! C-COL ! @ . ; : SELECT ( x y -- ) SELECT-Y @ + DUP DUP 0< 0= SWAP PALETTE-H < AND IF SELECT-Y ! ELSE DROP ENDIF SELECT-X @ + DUP DUP 0< 0= SWAP PALETTE-W < AND IF SELECT-X ! ELSE DROP ENDIF SELECT-X @ PALETTE-X + 8 * SELECT-Y @ PALETTE-Y + 8 * 0 LOCATE CURSX @ OUT-OFFX @ + 8 * CURSY @ OUT-OFFY @ + 8 * 1 LOCATE SELECT-MODE MODE ! ; : CLEAR MAP MAP-WIDTH @ MAP-HEIGHT @ * PLAIN FILL SHOW-MAP ; : SAVE-DIMS MAP-WIDTH @ MEM-WIDTH ! MAP-HEIGHT @ MEM-HEIGHT ! ; : SHOW-ERROR ( addr count -- ) 54 GPLLNK DROP 32 22 * V1 ! V1 @ MAP-DISP-W-MAX + 1- V2 ! 22 32 * MAP-DISP-W-MAX BL FILLVDP 23 32 * MAP-DISP-W-MAX BL FILLVDP 0 DO DUP I + C@ V1 @ C!VDP 1 V1 +! V1 @ V2 @ > IF 32 23 * V1 ! 32 V2 +! ENDIF LOOP DROP ; : RESIZE FALSE V3 ! MAP-WIDTH @ 255 > IF S" WIDTH BIGGER THAN 255" SHOW-ERROR TRUE V3 ! ENDIF MAP-HEIGHT @ 255 > IF S" HEIGHT BIGGER THAN 255" SHOW-ERROR TRUE V3 ! ENDIF MAP-WIDTH @ MAP-HEIGHT @ * 1022 > IF S" SURFACE BIGGER THAN 1022" SHOW-ERROR TRUE V3 ! ENDIF V3 @ IF MEM-WIDTH @ MAP-WIDTH ! MEM-HEIGHT @ MAP-HEIGHT ! SHOW-PARAMS ELSE MAP BUF 1022 CMOVE MAP 1022 PLAIN FILL MAP-HEIGHT @ MEM-HEIGHT @ MIN V1 ! MAP-WIDTH @ MEM-WIDTH @ MIN V2 ! V1 @ 0 DO BUF I MEM-WIDTH @ * + MAP I MAP-WIDTH @ * + V2 @ CMOVE LOOP MAP-INIT SHOW-MAP ENDIF ; : SCROLL ( x y -- ) IN-OFFX @ V1 ! IN-OFFY @ V2 ! IN-OFFY @ + DUP DUP 0< 0= SWAP MAP-HEIGHT @ MAP-DISP-H-MAX - 1+ < AND IF IN-OFFY ! ELSE DROP ENDIF IN-OFFX @ + DUP DUP 0< 0= SWAP MAP-WIDTH @ MAP-DISP-W-MAX - 1+ < AND IF IN-OFFX ! ELSE DROP ENDIF IN-OFFX @ V1 @ = 0= IN-OFFY @ V2 @ = 0= OR IF SHOW-MAP ENDIF ; 0 VARIABLE MOVE-VEC : KEY-ACTION ( c -- ) DUP 72 = IF ( H : SCROLL LEFT ) -1 0 SCROLL ENDIF DUP 75 = IF ( K: SCROLL RIGHT ) 1 0 SCROLL ENDIF DUP 74 = IF ( J: SCROLL DOWN ) 0 1 SCROLL ENDIF DUP 85 = IF ( U: SCROLL UP ) 0 -1 SCROLL ENDIF DUP 81 = IF ( Q: QUIT ) TRUE EXIT ! ENDIF MODE @ PAINT-MODE = IF ' MOVE CFA MOVE-VEC ! ELSE ' SELECT CFA MOVE-VEC ! ENDIF DUP 8 = IF ( CURSOR LEFT ) -1 0 MOVE-VEC @ EXECUTE ENDIF DUP 9 = IF ( CURSOR RIGHT ) 1 0 MOVE-VEC @ EXECUTE ENDIF DUP 10 = IF ( CURSOR DOWN ) 0 1 MOVE-VEC @ EXECUTE ENDIF DUP 11 = IF ( CURSOR UP ) 0 -1 MOVE-VEC @ EXECUTE ENDIF DUP 70 = IF ( F: File ) BLOCK# 28 1 INPUT-PARAM ENDIF DUP 87 = IF ( W: Width ) SAVE-DIMS MAP-WIDTH 28 2 INPUT-PARAM RESIZE ENDIF DUP 69 = IF ( E: Height ) SAVE-DIMS MAP-HEIGHT 28 3 INPUT-PARAM RESIZE ENDIF DUP 67 = IF ( C: Select ) 0 0 SELECT ENDIF DUP 80 = IF ( P: Paint ) MODE @ SELECT-MODE = IF 0 0 MOVE ELSE SELECT-Y @ PALETTE-Y + 32 * SELECT-X @ + PALETTE-X + C@VDP DUP CURSY @ OUT-OFFY @ + 32 * CURSX @ + OUT-OFFX @ + C!VDP CURSY @ IN-OFFY @ + MAP-WIDTH @ * CURSX @ IN-OFFX @ + + MAP + C! ENDIF ENDIF DUP 65 = IF ( A: Clear ) CLEAR ENDIF DUP 76 = IF ( L: Load ) LOAD-MAP MAP-INIT SHOW-MAP SHOW-PARAMS ENDIF DUP 83 = IF ( S: Save ) SAVE-MAP ENDIF DROP ; 0 VARIABLE KEY-DELAY : RUN FALSE EXIT ! CLS GMODE 0 PAGE ! 32 B/LINE ! PATTERNS&COLORS MAP-INIT CLEAR SHOW-DIALOG 10 DELAY BEGIN 0 ?KEY DUP IF 1 = IF 0 TIMER ! 10 KEY-DELAY ! TRUE ELSE TIMER @ KEY-DELAY @ > DUP IF 0 TIMER ! 2 KEY-DELAY ! ENDIF ENDIF IF KEY-ACTION ELSE DROP ENDIF ELSE DROP DROP ENDIF EXIT @ UNTIL CLS TMODE ;
MAP-EDITOR.zip 3.46K
9 downloads














