10 !  MASK800.GAM 20 !  Kan inte k|ra |ver sig sj{lv. 30 !  Efter MASKEN. LYSATOR. Link|pings tekniska h|gskola 40 ! Anpassad till ABC 800 M. P] ABC 806 fungerar inte ljudeffekterna. 50 ! av Bertil M}rtensson Word & Music Lund 1983. 60 ! Jag k|rde ABC-80-masken genom konverteringsprogrammet 80/800 70 ! med tveksamt resultat. Tv} n{tter med programmet och diverse 80 ! till{gg gav denna version, som i alla fall barn brukar tycka 90 ! {r skojig en stund. 91 ! 92 ! Tv} funktioner visar ett enkelt s{tt att f} l}guppl|sningsgrafik 93 ! p} ABC800M, genom att simulera setdot och cleardot. 100 ! 110 ! Variablerna W,Z betecknar ramkollision. 120 ! X,Y {r variabler f|r var "maten" ska placeras. 130 ! 140 SINGLE : INTEGER 150 EXTEND : DIM Cell(80,80),T(400),D(400) : OPTION BASE 0 : DIGITS 6 160 ! 170 DATA "Snart kommer masken.", "V{nta ett slag!", "Olidlig sp{nning..." 180 DATA "[r masken inte fin?","V}gar du det?","Ska bara ladda...", "SLUT" 190 DEF FNIp(U) LOCAL I 200 IF U=56 I=PEEK(65506) OR PEEK(65507) : POKE 65506,0 : RETURN I 210 RETURN INP(U) 220 FNEND 230 DEF FNPk(U) LOCAL N$=20,O$=20,U1 240 IF U>-1 RETURN U 250 IF U>-257 RETURN U-256 260 O$=CHR$(10,11,28,29,30,31,32,33,39,40,41,42,43,50,51) 270 N$=CHR$(123,124,12,13,8,9,10,11,14,15,56,57,52,64,65) 280 IF U>-513 U1=INSTR(1,O$,CHR$(U)) : IF U1 RETURN 65280+ASCII(MID$(N$,U1,1)) ELSE RETURN U 290 IF U=65011 RETURN 65363 ELSE IF U=65012 RETURN 65362 ELSE IF U=65013 RETURN 65506 ELSE RETURN U 300 FNEND 310 DEF FNIr(U,U$,U1$) 320 IF LEN(U1$)=0 RETURN 0 ELSE RETURN INSTR(U,U$,U1$) 330 FNEND 340 DEF FNFi$(U$) LOCAL U1$=120 350 FOR Slask=1 TO LEN(U$) 360 IF MID$(U$,Slask,1)<>' ' U1$=U1$+MID$(U$,Slask,1) 370 NEXT Slask : RETURN U1$ 380 FNEND 390 DEF FNUt(U)=U 400 DEF FNEnd$ 410 END 420 FNEND 430 DIM In$=120,Ut$=120 440 DEF FNIn$(U) 450 IF LEN(In$)>0 RETURN FNId$ 460 INPUT LINE #U,In$ : IF U=0 ; #U 470 In$=LEFT$(In$,LEN(In$)-2) 480 RETURN FNId$ 490 FNEND 500 DEF FNId$ LOCAL Ut$=120,Kp,De 510 Kp=ASCII(In$) : IF Kp=34 OR Kp=39 De=Kp ELSE De=44 520 Kp=INSTR(2+(De=44),In$,CHR$(De)) 530 IF Kp=0 Ut$=In$ : In$='' : RETURN FNFi$(Ut$) 540 Ut$=MID$(In$,1-(De<>44),Kp+(De<>44)-1) : IF De<>44 AND LEN(In$)>Kp+1 In$=RIGHT$(In$,Kp+2) ELSE In$=RIGHT$(In$,Kp+1) 550 RETURN Ut$ 560 FNEND 570 ; CHR$(12); 580 ; " MASKEN.800 "; : ; TAB(79) "" 590 ; STRING$(80,61) 600 ; : ; : ; TAB(25) "A N V I S N I N G A R :" 610 ; : ; 620 ; TAB(18) "Du styr med 'A' och '['! Caps Lock p}!" 630 ; CUR(13,25) '[r du klar? '; : GET A$ 640 X=26 : Y=15 650 DIM M1(500),M2(500),B$=30 660 F9=65 ! H\J TALET F\R L[GRE FART ---------- 670 T3=0 : P=0 : R=0 680 FOR I=65081 TO 65085 690 S(I-65081)=PEEK(FNPk(I)) : NEXT I 700 ; CHR$(12) 710 FOR I=0 TO 78 : Z=FNSetdot(0,I) : Z=FNSetdot(22,I) : NEXT I 720 READ Txt$ : IF Txt$="SLUT" THEN RESTORE 730 ; CUR(13,25) Txt$ 740 FOR I=0 TO 22 : Z=FNSetdot(I,0) : Z=FNSetdot(I,78) : NEXT I 750 FOR Rad=1 TO 21 ! RADERA INUTI F[LTET 760 FOR Kol=1 TO 77 770 Cell(Rad,Kol)=0 780 NEXT Kol 790 NEXT Rad 800 ; CUR(13,25) SPACE$(25) 810 ; CUR(11,5);"OOOO\" 820 FOR I=1 TO 5 : M1(I+250)=11 : M2(256-I)=4+I : NEXT I 830 B=251 : E=255 : F=0 840 FOR D=-2000*R TO 2000 : NEXT D 850 T2=-1 : Flag=1 : GOSUB 1120 860 T3=1+T3 870 IF T3=T7 T7=0 : R=0 : GOSUB 1600 880 IF NOT R THEN 920 890 IF T3<>T(P) THEN GOTO 970 900 A=D(P) : P=1+P 910 GOTO 960 920 A=PEEK(FNPk(65013)) !  TANGENT 930 IF A=0 THEN 970 940 A=FNIp(56) AND 127 : POKE FNPk(65013),0 950 T(P)=T3 : D(P)=A : P=1+P 960 F=(F+(A=91)-(A=65)) AND 3 970 M1(B-1)=M1(B)+(F=1)-(F=3) 980 M2(B-1)=M2(B)+(F=2)-(F=0) 990 W=M1(B-1) : Z=M2(B-1) 1000 IF (W=Y OR W=Y+1) AND (Z=X OR Z=X+1) THEN GOSUB 1120 : GOTO 1000 1010 IF Cell(W*1,Z*1)=-1 GOTO 1250 1020 IF W<0 OR W>22 OR Z<0 OR Z>78 THEN 1250 1030 ; CUR(M1(B),M2(B));"O"; : Cell(M1(B),M2(B))=-1 !  1040 IF Cell(M1(B-1),M2(B-1))<>-1 ; CUR(M1(B-1),M2(B-1));"\"; !  1050 IF RND>.1 ; CUR(M1(E),M2(E));" " : Cell(M1(E),M2(E))=0 : E=E-1 1060 IF E=-1 E=499 1070 B=B-1 1080 IF B=0 THEN M1(500)=M1(0) : M2(500)=M2(0) : B=500 1090 FOR D=-F9*R TO F9 : NEXT D 1100 GOTO 860 1110 !  TR[FF 1120 A=0 : T2=T2+1 1130 IF Flag=2 ; CUR(Y,X) "" : ; CUR(Y+1,X) "" : FOR I.=1. TO 45. : Z.=INP(5.) : NEXT I. 1140 IF Flag=2 ; CUR(Y,X) " " : ; CUR(Y+1,X) " " 1150 IF Flag=1 ; CUR(Y,X) " " : ; CUR(Y+1,X) " " : FOR I.=1. TO 75. : Z.=INP(5.) : NEXT I. : Flag=2 1160 X=RND*70+2 : Y=RND*19+1 1170 FOR G=X*1 TO X*1+2 : FOR T=Y*2 TO Y*2+3 : IF Cell(T,G)=-1 GOTO 1160 1180 NEXT T : NEXT G 1190 IF Cell(Y,X)<>-1 ; CUR(Y,X);"<>" ELSE GOTO 1160 1200 IF RND<.4 ; CUR(Y,X) "><" 1210 ; CUR(Y+1,X);"<>" 1220 IF RND<.4 ; CUR(Y+1,X) "><" 1230 RETURN 1240 ! 1250 FOR D.=1. TO 350. : Z.=INP(5.) : NEXT D. : ; CHR$(7.) 1260 FOR D=1 TO 1000 : NEXT D 1270 ; CHR$(12) : ; : ; 1280 IF Flag2=1 GOTO 1410 1290 ; "Du tr{ffade" T2 " m}l." 1300 B$="URKASST..." 1310 IF T2>0 B$="Inte riktigt bra." 1320 IF T2>5 B$="Bravo..." 1330 IF T2>10 B$="Mycket bra..." 1340 IF T2>25 B$="Fenomenalt..." 1350 IF T2>50 B$="Du {r ju PROFFS..." 1360 IF T2>100 B$="*** SUPERBRA ***" 1370 ; : ; B$ 1380 IF T2>30 ; "Du borde bli maskf|rare p} heltid." 1390 IF A8 THEN 1490 1400 IF R THEN 1520 1410 ; : ; "Vill du ha repris av din bana? "; : POKE FNPk(65013),0 : A$=FNIn$(0) : In$="" : IF A$="J" THEN Flag2=1 ELSE Flag2=0 1420 T7=0 1430 ON ERROR GOTO 1450 1440 T7=T3-VAL(A$) 1450 ON ERROR GOTO 1460 IF T7 1490 1470 IF FNIr(1.,"Jj",CHR$(ASCII(A$))) 1490 1480 GOTO 1520 1490 FOR I=65081 TO 65085 1500 POKE FNPk(I),S(I-65081) : NEXT I 1510 R=-1 : T3=0 : P=0 : A$="" : GOTO 700 1520 ; : ; "Vill du {ndra fart? "; : POKE FNPk(65013),0 : A$=FNIn$(0) : In$="" 1530 IF FNIr(1.,"Jj",CHR$(ASCII(A$))) 1570 1540 ; : ; "Vill du f|rs|ka en g}ng till? "; : POKE FNPk(65013),0 : A$=FNIn$(0) : In$="" 1550 IF FNIr(1.,"Nn",CHR$(ASCII(A$))) GOTO 10000 1560 GOTO 670 1570 ; "V{lj ny fart: 1 - 2 - 3 - 4 ? " : A9=VAL(FNIn$(0)) : In$="" 1580 IF A9<5 AND A9>0 THEN F9=(5-A9)*15 : GOTO 670 1590 A8=-1 : GOTO 1490 1600 POKE FNPk(65013),0. 1610 IF PEEK(FNPk(65013))=0 GOTO 1610 1620 RETURN 1650 DEF FNSetdot(X,Y) 1660 ; CUR(X,Y) "" 1670 Cell(X,Y)=-1 ! OMTALAR ATT PUNKTEN [R T[ND. 1680 RETURN Inget 1690 FNEND 1700 DEF FNClrdot(X,Y) 1710 ; CUR(X,Y) " " 1720 Cell(X,Y)=0 1730 RETURN Inget 1740 FNEND 10000 END