10 REM ------- Diamond  Trap -------
20 REM          By  J.Pugh
30 REM (c)Computing with the Amstrad
40 REM ------------ CPC ------------
50 ENV 1,1,0,10,1,0,10,1,0,5:ENT 2,5,1,1,1,0,10,5,-1,3:ENV 2,1,0,5,1,0,5,1,0,5
60 GOSUB 1510 :REM machine code
70 DEFINT a-z:k1=19:k2=22:k3=71:k4=63:k5=47
80 CLS:INPUT"Joystick or keyboard? (j/k)",kc$
90 kc$=UPPER$(kc$):IF kc$="J" THEN k1=72:k2=73:k3=74:k4=75:k5=76 ELSE IF kc$<>"K" THEN 80
100 SYMBOL 255,96,144,144,159,149,149,144,96
110 BORDER 0:RESTORE 110:FOR t=0 TO 12:READ a:INK t,a:NEXT
120 DATA 0,26,1,2,18,9,14,3,6,24,13,0,8
130 FOR t=1 TO 6:hi(t)=100:READ hi$(t):NEXT
140 DATA AMSTRAD,NEMESIS,DIAMOND,RAYMOND,E.T. OK,ARNOLDS
150 MODE 0:WINDOW#1,1,20,1,20:WINDOW#2,1,20,21,25:WINDOW#3,2,19,22,24
160 WINDOW#4,3,9,23,23:WINDOW#5,10,12,22,22:PEN#5,9:PEN#3,1
170 PAPER#2,1:PEN#2,12:FOR t=1 TO 100:PRINT#2,CHR$(207);:NEXT
180 CLS#3:GOTO 1390
190 REM --------- New Game ---------
200 sc=0:li=3:le=1:keys=0:runn=1:dc=0
210 PEN#3,4:CLS#3:PRINT#3,"  SCORE     HIGH":PRINT#3,SPC(11);
220 PEN#3,6:PRINT#3,USING"#######";hi(1);:PEN#3,8
230 PRINT#3,"LIVES";USING"###";li;:PRINT#3," LEVEL";USING"###";le;
240 CLS#5:FOR t=1 TO keys:PRINT#5,CHR$(255);:NEXT
250 GOTO 330
260 REM ------- Place Sprite -------
270 k=x:l=y:x=(x*4)-4:y=(y*4)-4:CALL 29940,x,y,z
280 grid(k,l)=z:x=k:y=l:RETURN
290 REM -- Generate Random Square --
300 q=INT(RND(1)*10+1):w=INT(RND(1)*10+1):IF grid(q,w)<>1 THEN 300
310 IF z=0 AND q=2 AND w=1 THEN 300
320 grid(q,w)=z:x=q:y=w:GOSUB 260:RETURN
330 REM ------- Set Up Screen ------
340 z=1:FOR x=1 TO 10:FOR y=1 TO 10
350 grid (x,y)=1:GOSUB 260
360 NEXT:NEXT:grid(1,1)=7:grid(10,10)=8
370 z=2:FOR t=1 TO 4+runn:GOSUB 290:NEXT
380 z=3:FOR t=1 TO 5+le:GOSUB 290:NEXT
390 z=0:FOR t=1 TO 6+runn:GOSUB 290:NEXT
400 IF runn<4 THEN z=4:GOSUB 290
410 IF runn=4 THEN z=5:FOR t=1 TO 3:GOSUB 290:NEXT
420 IF runn=5 THEN z=6:GOSUB 290
430 px=1:py=1:mx=10:my=10:mm=2:tr=0:dc=0
440 CLS#4:PRINT#4,USING"#######";sc;
450 x=px:y=py:z=7:GOSUB 260
460 x=mx:y=my:z=0:GOSUB 260:z=8:GOSUB 260
470 IF px=mx AND py=my THEN 1080
480 REM --------- Keycheck ---------
490 q=(INKEY(k2))-(INKEY(k1))
500 w=(INKEY(k4))-(INKEY(k3))
510 WHILE INKEY(k5)=0:WEND
520 IF ABS(q)+ABS(w)=2 THEN q=0:w=0
530 IF q+w=0 THEN FOR t=1 TO 70:NEXT:GOTO 740
540 REM --------- Move Eye ---------
550 w=px+w:q=py+q:IF w=0 OR w=11 OR q=0 OR q=11 THEN w=0:q=0:GOTO 530
560 cu=grid(w,q):ON cu+1 GOTO 1040,570,590,640,600,670,700,1080,1040
570 z=0:x=px:y=py:GOSUB 260:px=w:py=q
580 GOTO 740
590 sc=sc+5:SOUND 3,60,-1,15,1,2:CLS#4:PRINT#4,USING"#######";sc;:GOTO 570
600 IF keys=3 THEN 570
610 keys=keys+1:CLS#5:FOR t=1 TO keys:PRINT#5,CHR$(255);:NEXT
620 SOUND 3,60,-1,15,2,2:SOUND 3,40,-1,15,2,2
630 GOTO 570
640 sc=sc+(10*le):CLS#4:PRINT#4,USING"#######";sc;
650 dc=dc+1:IF dc=le+5 THEN 1180
660 SOUND 3,60,-1,15,2,2:SOUND 3,40,-1,15,2,2:GOTO 570
670 IF keys=0 THEN 570
680 SOUND 3,71,-1,15,1,2:sc=sc+500:CLS#4:PRINT#4,USING"#######";sc;
690 keys=keys-1:CLS#5:FOR t=1 TO keys:PRINT#5,CHR$(255);:NEXT:GOTO 570
700 li=li+1
710 SOUND 3,119,-1,15,2,2:SOUND 3,80,-1,15,2,2:PEN#3,8:LOCATE#3,1,3
720 PRINT#3,"LIVES";USING"###";li;:PRINT#3," LEVEL";USING"###";le;
730 SOUND 3,60,-1,15,2,2:GOTO 570
740 REM ------- Move Monster -------
750 tr=0:grid(px,py)=1
760 REM Random Path Change?
770 IF INT(RND(1)*10)+1 >2 THEN 810
780 GOTO 990
790 IF RND<0.5 THEN mm=mm-1:ELSE mm=mm+1
800 IF mm=5 THEN mm=1:ELSE IF mm=0 THEN mm=4
810 ON mm GOTO 840,880,930,960
820 x=mx:y=my:z=8:GOSUB 260
830 GOTO 450
840 q=my-1:IF q=0 THEN 790
850 IF grid(mx,q)<2 THEN 870
860 IF mx=10 AND my=10 THEN tr=tr+1:GOTO 920:ELSE 790
870 x=mx:y=my:z=1:GOSUB 260:my=q:GOTO 820
880 w=mx-1:IF w=0 THEN 790
890 IF grid(w,my)<3 THEN 910
900 IF mx=10 AND my=10 THEN tr=tr+1:GOTO 920:ELSE 790
910 x=mx:y=my:z=1:GOSUB 260:mx=w:GOTO 820
920 IF tr>1 THEN 450:ELSE 790
930 q=my+1:IF q=11 THEN 790
940 IF grid(mx,q)>2 THEN 790
950 x=mx:y=my:z=1:GOSUB 260:my=q:GOTO 820
960 w=mx+1:IF w=11 THEN 790
970 IF grid(w,my)>2 THEN 790
980 x=mx:y=my:z=1:GOSUB 260:mx=w:GOTO 820
990 IF py=my THEN 1020
1000 IF py<my THEN mm=1 ELSE mm=3
1010 GOTO 810
1020 IF px<mx THEN mm=2 ELSE IF px>mx THEN mm=4
1030 GOTO 810
1040 x=px:y=py:z=0:GOSUB 260
1050 x=w:y=q:z=7
1060 IF x<1 OR x>10 OR y<1 OR y>10 THEN 1080
1070 GOSUB 260
1080 REM ------- Lose a Life -------
1090 RESTORE 1120
1100 GOSUB 1150
1110 GOTO 1130
1120 DATA 379,-2,402,-1,379,-3,253,-4,268,-1,253,-2,338,-2,319,-2,338,-2,379,-5,255
1130 li=li-1:IF li=0 THEN 1270
1140 GOTO 210
1150 REM -------- Play Tune --------
1160 READ tn:IF tn=255 THEN RETURN:ELSE READ lg:SOUND 7,tn,lg,15,2,2
1170 GOTO 1160
1180 REM ----- Complete Screen -----
1190 x=px:y=py:z=0:GOSUB 260
1200 x=w:y=q:z=7:GOSUB 260
1210 RESTORE 1240
1220 GOSUB 1150
1230 GOTO 1250
1240 DATA 338,-2,268,-1,358,-1,268,-2,213,-1,268,-1,213,-2,179,-6,358,-1,268,-4,255
1250 le=le+1:sc=sc+le*100:runn=runn+1:IF runn=6 THEN runn=1
1260 GOTO 210
1270 REM -------- Game Over --------
1280 LOCATE 6,8:PEN 9:PRINT"GAME  OVER"
1290 PRINT CHR$(22)+CHR$(0)
1300 FOR t=1 TO 600:NEXT
1310 CLS#1:PEN 1
1320 IF sc<=hi(6) THEN 1390:ELSE t=10
1330 IF t=0 THEN t=1:GOTO 1350
1340 IF sc<=hi(t) THEN t=t+1:GOTO 1350:ELSE t=t-1:GOTO 1330
1350 FOR r=6 TO t STEP -1:hi(r)=hi(r-1):hi$(r)=hi$(r-1):NEXT
1360 LOCATE 5,1:PRINT"High Score!!":WHILE INKEY$<>"":WEND
1370 PEN 3:PRINT:PRINT"Enter your name....":PEN 1:INPUT d$:IF LEN(d$)>10 THEN PRINT:PRINT"Up to 10 chars":GOTO 1370
1380 hi(t)=sc:hi$(t)=d$
1390 REM Hall Of Fame
1400 CLS#1:LOCATE 1,1:PEN 6:PRINT"    HIGH SCORERS"
1410 PEN 8:PRINT"    ============"
1420 FOR t=1 TO 6:PRINT:PEN t+2:LOCATE 2,3+(t*2):PRINT hi(t)
1430 LOCATE 10,3+(t*2):s$=hi$(t)
1440 IF LEN(s$)< 10 THEN FOR q=1 TO 10-LEN(s$):s$=" "+s$:NEXT
1450 PRINT s$:NEXT
1460 PEN 1:LOCATE 1,20:PRINT"PRESS ";:IF kc$="J" THEN PRINT"FIRE"; ELSE PRINT"SPACE";
1470 PRINT" TO PLAY"
1480 WHILE INKEY(k5)<0:WEND
1490 GOTO 190
1500 REM --------------------------
1510 REM M/Code + Sprite Data Loader
1520 IF PEEK(&160)=255 THEN RETURN
1530 MODE 2:PRINT"Poking machine code, please wait"
1540 RESTORE 1640:MEMORY 29800:ln=1640
1550 FOR adr=&747C TO &79B8 STEP 13
1560 READ byte$:chk=0
1570 FOR i=0 TO 12
1580 v=VAL("&"+MID$(byte$,i*2+1,2))
1590 POKE adr+i,v:chk=chk+v
1600 NEXT
1610 IF chk<>VAL("&"+RIGHT$(byte$,3)) THEN PRINT"ERROR in LINE";ln:STOP
1620 ln=ln+10:NEXT
1630 POKE &160,255:RETURN
1640 DATA 3E00F5D650ED444F26001E3016463
1650 DATA 7906082E04F1E5F5D5110000F555F
1660 DATA 7CFE303802D630CB3F3002162045C
1670 DATA 6F2600F1D529292929E5D12929507
1680 DATA 19D11916C05F19D13E04F5C5E5603
1690 DATA 1AFE00280C7EFE0028033DC6013F7
1700 DATA 1AE6FF7713230D2008D5AF11504C6
1710 DATA 00ED52D110E0E101000809C1F15A5
1720 DATA 3D20D3F1E1242D20A2C90000004DE
1730 DATA 000000DD7E00DD6E02DD6604E54D4
1740 DATA 26006F2929292929292911307526A
1750 DATA 19E5D1E1F57C8767F17C327D7479F
1760 DATA 7D3285747A3289747B328774C35BC
1770 DATA 7C74C92C322C332C342C35CFCF4D5
1780 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1790 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1800 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1810 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1820 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1830 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1840 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1850 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1860 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1870 DATA CFCFCFCFCFCFCFCFCFCFCFCFCFA83
1880 DATA CFCFCF8FCAC0C0C0C0C0C085CA995
1890 DATA C0C0C0C0C0C085CAC0C0C0C0C098F
1900 DATA C085CAC0C0C0C0C0C085CAC0C095E
1910 DATA C0C0C0C085CAC0C0C0C0C0C085954
1920 DATA CAC0C0C0C0C0C085CAC0C0C0C0999
1930 DATA C0C085CAC0C0C0C0C0C085CAC095E
1940 DATA C0C0C0C0C085CAC0C0C0C0C0C098F
1950 DATA 85CAC0C0C0C0C0C085CAC0C0C095E
1960 DATA C0C0C085CAC0C0C0C0C0C0850F8A3
1970 DATA 0F0F0F0F0F0F0FCFCFCFCFCFCF543
1980 DATA CFDE8B030303030303568B03C03EE
1990 DATA C0C00303568B034A0F0F8103563AC
2000 DATA 8B034203034A03568B0342030324F
2010 DATA 4203568B034203038503568B032DD
2020 DATA 42C0C00B03568B0342C0C0030347C
2030 DATA 568B03420F0F8103568B0342032F1
2040 DATA 034A03568B034203034203568B2A2
2050 DATA 034203038503568B03C0C0C00B402
2060 DATA 03568B030F0F0F030356FCFCFC464
2070 DATA FCFCFCFCFCCFCFCFCFCFCFCF8EB23
2080 DATA CECCCCC8C4CCCC8CCECCCC94C89D8
2090 DATA CCCC8CCECCC868C4C4CC8CCECC968
2100 DATA 9494C8C8CC8CCEC86868C484C4882
2110 DATA 8CCE949494C848488CCA6868686FC
2120 DATA 2C848484CA68682C84848484CE65C
2130 DATA C4C4C4C848488CCEC8C8C8848485E
2140 DATA C48CCECCC4C4C848CC8CCECCC893C
2150 DATA C884C4CC8CCECCCCC4C8CCCC8C97E
2160 DATA CECCCCC8C4CCCC8C0C0C0C0C0C652
2170 DATA 0C0C0CCFC3CFCFCFCFCFCFCBC381E
2180 DATA C7CFCFCFCFCFC3C3C3CFCFCFCFA57
2190 DATA CFC3CFC3CFCFCFCFCFC3CFC3CFA53
2200 DATA CFCFCFCFC3CFC3CFCFCFCFCFC3A5F
2210 DATA CFC3C3C3C3C3C7C3CFC3C3C3C3A03
2220 DATA C3C3C3CFC3C3C3C3C3C3C3CFC39FF
2230 DATA CBC7C3CBC3C3CFC3CBCFC3CFC3A27
2240 DATA C3CFC3CBCBC3C7C3C3CFC3CBCFA27
2250 DATA CFCFC3C3C3C3CBCFCFCFC3CBC3A33
2260 DATA C7CBC7CFCFC3CFC3CFCFCFCFCBA53
2270 DATA C3000000000000000000000041104
2280 DATA 82000000000041966982000000244
2290 DATA 41966C8C49820000966CCCCC8C5C0
2300 DATA 4900416CCCCCCCCC8C82C3C3C377D
2310 DATA 96C9C3C3C396CCCC96C96CCC498B6
2320 DATA 96CCCC96C96CCC4996CCCC96C989B
2330 DATA 6CCC4996CCCCC3C36CCC4996CC818
2340 DATA CC3C3C6CCC4996CCCCCCCCCCCC823
2350 DATA 4996CCCCCCCCCCCC49960C0C0C6AA
2360 DATA 0C0C0C49C3C3C3C3C3C3C3C3CF754
2370 DATA 0303CFCF0303CF8BC003478BC0559
2380 DATA 03474203030342030303420303128
2390 DATA 03810303030303030381030303123
2400 DATA 03030303810303038B0303030312D
2410 DATA 0303478B030303030356478B03212
2420 DATA 035603035647CF0303A90303A9329
2430 DATA CFCF8B0303035647CFCFCF0303542
2440 DATA 03A9CFCFCFCF8B030347CFCFCF72D
2450 DATA CFCF0303CFCFCFCFCFCF8B47CF81F
2460 DATA CFCFCFCFCF8B47CFCFCF00004478E
2470 DATA CCCC88000000449C3CCCCC880055C
2480 DATA 009C3C6CCCCCCC00443C6CCCCC62C
2490 DATA CCCC88146CC8C5CAC4CC889CCC877
2500 DATA C0CFCFC0CCCCCCC8C5CFCFCAC4A3B
2510 DATA CCCCC0C5CFCFCAC0CCCCC0C5CFA31
2520 DATA CFCAC0CCCCC8C5C5CFCAC4CCCCA38
2530 DATA CCC0CACFC0CC4C44CCC8C5CAC4928
2540 DATA 8C0844CCCCCCCCCC0C8800CCCC700
2550 DATA CCCC0C4C000044CCCC0C4C88004AC
2560 DATA 000044CCCC880000CF3065CFCF566
2570 DATA 9A30CF9AC590CFCF60CA6560CF7E4
2580 DATA CA659AC5CF9060CACA659AC5C586A
2590 DATA 909AC590659A60CA65CF30303066C
2600 DATA 303030CFCFCFCF6030CFCFCFCF798
2610 DATA CF60903030CFCFCF9AC0303030676
2620 DATA 65CFCF302103031230CF9A3003438
2630 DATA 8B470330659A2142CAC58112654EE
2640 DATA 9A3003428103F065CF3030030341D
2650 DATA 70B0CFCFCF30303030CFCFCFCF789
2660 DATA CF3030CFCFCFCFCFCFCFCFCFCF945
2670 DATA DE0000000000000000000000000DE