10 'AA Sprite Editor
20 'By Pay McDonald
30 'Public Domain - Amstrad Action April 1989
40 SYMBOL AFTER 32:MEMORY (HIMEM-4113)
50 DEFINT a-n:DIM inkno(16):noinks=16:stepno=4:spstart=HIMEM+1:inkno(1)=26:DIM pix(63,31)
60 WHILE aafolded=0
70 GOSUB 1300
80 LOCATE 13,1:PRINT "AA Sprite Editor"
90 RESTORE 110
100 FOR n=1 TO 9:READ a$:LOCATE 7,2+(n*2):PRINT n;")  ";a$:NEXT
110 DATA Draw Sprite,Edit Sprite,Save Sprite,Load Sprite,Change Mode,Change Inks,Save Mode/Inks,Load Mode/Inks,Return to BASIC
120 LOCATE 3,22:INPUT "Please enter your selection:";n
130 ON n GOSUB 150,670,840,890,940,1100,1420,1470,1410
140 WEND
150 IF inkselect=0 THEN LOCATE 1,25:PRINT "INKS NOT INPUT";CHR$(7):CALL &BB18:RETURN
160 MODE modeno:GOSUB 1340:IF editselect=1 THEN GOSUB 680:editselect=0
170 LOCATE (80/stepno)/2,2:PRINT "Editing"
180 LOCATE 2,21:PRINT "Cursor keys to move"
190 LOCATE 2,22:PRINT "C=Change pen"
200 LOCATE 2,23:PRINT "SPACE=Finish"
210 LOCATE 2,24:PRINT "COPY=Paint pixel"
220 FOR n=0 TO noinks-1:LOCATE 1,(5+n):PEN n:PRINT CHR$(143);:LOCATE (80/stepno),(5+n):PRINT CHR$(143);:NEXT:FOR n=0 TO noinks-1:INK n,inkno(n):NEXT
230 littlex=0:littley=398:bigx=192:bigy=350:paint=1:PEN 1
240 GOSUB 500:GOSUB 1330
250 WHILE INKEY(47)<>0:decisx=0:decisy=0
260 IF INKEY(9) = 0 THEN GOSUB 370
270 IF INKEY(8) = 0 AND bigx >192 THEN decisx=-1
280 IF INKEY(2) = 0 AND bigy >102 THEN decisy=-1
290 IF INKEY(1) = 0 AND bigx <(448-(stepno*4)) THEN decisx=+1
300 IF INKEY(0) = 0 AND bigy <350 THEN decisy=+1
310 GOSUB 420
320 IF INKEY(62) = 0 THEN GOSUB 470
330 WEND:CALL &BB18:CALL &BB00:CALL &BB18
340 INPUT #1,"Sprite number ?",n
350 IF n>=0 AND n<=15 THEN GOSUB 550
360 RETURN
370 GOSUB 1330
380 PLOT littlex,littley,paint
390 GOSUB 810
400 GOSUB 1330
410 RETURN
420 GOSUB 1330
430 littlex=littlex+(stepno*decisx):littley=littley+(decisy*2)
440 bigx=bigx+4*(stepno*decisx):bigy=bigy+(8*decisy)
450 GOSUB 1330
460 RETURN
470 CALL &BB18:CALL &BB00:CALL &BB18:INPUT#1,"Which ink",n
480 IF n>=0 AND n<noinks THEN paint=n:GOSUB 500
490 CLS#1:RETURN
500 FOR n=0 TO noinks-1
510 LOCATE 2,5+n:PRINT " ";:LOCATE (80/stepno)-1,5+n:PRINT " ";
520 NEXT
530 LOCATE 2,5+paint:PRINT CHR$(242);:LOCATE (80/stepno)-1,5+paint:PRINT  CHR$(243);
540 RETURN
550 puthere=spstart+(n*256):RESTORE 660
560 FOR k=1 TO 8
570 READ scanfrom
580 FOR l=1 TO 4
590 FOR m=0 TO 7
600 POKE (puthere),PEEK(scanfrom+m)
610 puthere=puthere+1:NEXT m
620 scanfrom=scanfrom+80
630 NEXT l
640 NEXT k
650 RETURN
660 DATA &c000,&c800,&d000,&d800,&e000,&e800,&f000,&f800
670 editselect=1:GOSUB 150:RETURN
680 INPUT #1,"Sprite No. :",n:CLS#1
690 IF n>=0 AND n<15 THEN GOSUB 710
700 RETURN
710 scanfrom=spstart+(n*256):RESTORE 660
720 FOR k=1 TO 8
730 READ puthere
740 FOR l=1 TO 4
750 FOR m=0 TO 7
760 POKE (puthere+m),PEEK(scanfrom)
770 scanfrom=scanfrom+1:NEXT m
780 puthere=puthere+80:NEXT l
790 NEXT k
792 bigx=192:FOR x=0 TO 63 STEP stepno:littlex=x:littley=400:bigy=358
794 FOR y=0 TO 63 STEP 2:littley=littley-2:paint=TEST(littlex,littley):bigy=bigy-8
796 IF paint>0 THEN GOSUB 810
798 NEXT y:bigx=bigx+stepno*4:NEXT x
800 RETURN
810 FOR n=0 TO 3:FOR m=0 TO -3 STEP -1
820 PLOT bigx+(n*stepno),bigy+(m*2),paint
830 NEXT:NEXT:PEN 1:RETURN
840 GOSUB 1300:GOSUB 1340
850 GOSUB 1350
860 IF (a>=0 AND a<=15) AND (b>=0 AND b<=15) AND a<=b THEN GOSUB 880
870 RETURN
880 SAVE a$,b,start,zlength:RETURN
890 GOSUB 1300:GOSUB 1340
900 GOSUB 1350
910 IF (a>=0 AND a<=15) AND (b>=0 AND b<=15) AND a<=b THEN GOSUB 930
920 RETURN
930 LOAD a$,start:RETURN
940 modeselect=1:GOSUB 1300:option=0
950 WHILE option=0
960 LOCATE 13,3:PRINT "Mode Select"
970 LOCATE 4,7:PRINT "Which of the three screen modes do"
980 LOCATE 4,9:PRINT "you wish to edit sprites in."
990 LOCATE 4,11:PRINT "Current selection is ";modeno
1000 LOCATE 4,15:INPUT "What do you want:";modeno
1010 ON (modeno+1) GOSUB 1030,1050,1070:WEND
1020 RETURN
1030 option=1:stepno=4:noinks=16
1040 RETURN
1050 option=1:stepno=2:noinks=4
1060 RETURN
1070 option=1:stepno=1:noinks=2
1080 RETURN
1090 END
1100 inkselect=1:GOSUB 1300:option=0
1110 LOCATE 13,3:PRINT " Ink Select"
1120 LOCATE 4,7:PRINT "Current screen mode is";modeno
1130 LOCATE 4,9:PRINT "so you have a maximum of";noinks;"colours."
1140 LOCATE 4,11:PRINT "Enter an invalid ink number to abort."
1150 LOCATE 4,15:PRINT "Press any key to begin."
1160 CALL &BB18:a=0:a1=0
1170 WHILE option < noinks
1180 MODE modeno
1190 IF a1>=0 AND a1<=26 THEN inkno(a)=a1:INK a,inkno(a)
1200 FOR n=0 TO noinks-1
1210 PEN n:INK n,inkno(n):PRINT CHR$(143)
1220 NEXT:PEN 1
1230 WINDOW#1,2,(80/stepno)-1,1,25:CLS #1
1240 LOCATE #1,(80/stepno)/2,3:PRINT #1,"Colours"
1250 LOCATE#1,3,6:INPUT#1,"Colour to change";a:option=a
1260 LOCATE#1,3,9:INPUT#1,"Change to";a1
1270 WEND
1280 RETURN
1290 END
1300 MODE 1:INK 0,0:INK 1,26:PEN 1:RETURN
1310 LOCATE (80/stepno)/2,1:PRINT CHR$(23);CHR$(1);:RETURN
1320 PRINT CHR$(23);CHR$(0);:RETURN
1330 GOSUB 1310:TAG:PLOT littlex,littley,1:MOVE (bigx+(stepno*2)),bigy+4:PRINT CHR$(202);:TAGOFF:GOSUB 1320:RETURN
1340 WINDOW #1,1,(80/stepno),25,25:RETURN
1350 INPUT#1,"Start sprite :",a:CLS#1
1360 INPUT#1,"End sprite :",b:CLS#1
1370 GOSUB 1400
1380 start=spstart+(a*256):zlength=((b-a)*256)+255
1390 RETURN
1400 INPUT #1,"Filename :",a$:CLS #1:RETURN
1410 END
1420 GOSUB 1300:GOSUB 1340:GOSUB 1400:IF LEN(a$)=0 OR LEN(a$)>8 THEN RETURN
1430 POKE (spstart+4096),modeno:FOR n=1 TO noinks
1440 POKE (spstart+4096+n),inkno(n-1)
1450 NEXT
1460 SAVE a$,b,spstart+4096,17:RETURN
1470 GOSUB 1300:GOSUB 1340:GOSUB 1400:IF LEN(a$)=0 OR LEN(a$)>8 THEN RETURN
1480 LOAD a$,spstart+4096
1490 modeno=PEEK(spstart+4096):FOR n=1 TO noinks
1500 inkno(n-1)=peen(spstart+4096+n)
1510 NEXT:inkselect=1:RETURN