10 'ron
40 REM
50 MODE 1:CALL &BC02:MEMORY &9FFF
60 d=18:e=19:f=22:g=71:h=63
70 GOSUB 820:REM initialise
80 GOSUB 440:REM data
90 GOSUB 1900:REM title screen
100 GOSUB 2050
110 MODE 0
120 GOSUB 2600:REM speed selection
130 MODE 0
140 GOSUB 260:REM menu
150 GOSUB 2050
160 MODE 0
170 GOSUB 880:REM set variables
180 GOSUB 910:REM wipe
190 GOSUB 640:REM set screen
200 GOSUB 1390:REM move monster
210 GOSUB 930:REM push/crush
220 IF m=0 THEN GOSUB 1510:MODE 0:FOR s=1 TO 200:NEXT:GOTO 180
230 IF dead=1 THEN GOSUB 1560:MODE 0:FOR s=1 TO 200:NEXT:GOTO 180
240 GOTO 200
250 REM -------- start screen ------
260 MODE 0:CALL &BB4E:CALL &BC02:DRAW 0,398,4:DRAW 638,398:DRAW 638,0:DRAW 0,0:PEN 1:LOCATE 9,2:PRINT "MENU"
270 PEN 2:BORDER 6: INK 2,24
280 LOCATE 5,7:PRINT"   up - ";:k=e:GOSUB 400
290 LOCATE 5,9:PRINT" down - ";:k=f:GOSUB 400
300 LOCATE 5,11:PRINT" left - ";:k=g:GOSUB 400
310 LOCATE 5,13:PRINT"right - ";:k=h:GOSUB 400
320 LOCATE 5,15:PRINT" push - ";:k=d:GOSUB 400
330 PEN 4
340 LOCATE 4,19:PRINT"Space or Fire":LOCATE 7,20:PRINT"to play"
350 LOCATE 2,22:PRINT"O for options menu"
360 IF INKEY(76)>-1 THEN d1=76:e1=72:f1=73:g1=74:h1=75:ky=0:RETURN              
370 IF INKEY(47)>-1 THEN d1=d:e1=e:f1=f:g1=g:h1=h:ky=1:RETURN
380 IF INKEY(34)>-1 OR INKEY(32)>-1 THEN GOTO 1150
390 GOTO 360
400 RESTORE 2440:FOR a=1 TO 71:READ t
410 IF t=k THEN PRINT ke$(a):a=71
420 NEXT:RETURN
430 REM -------- data --------
440 RESTORE 470:FOR i=0 TO 98
450 READ a$:POKE &A000+i,VAL("&"+a$)
460 NEXT
470 DATA dd,7e,00,87,87,87,87,87,32,47,a0,26,c0,dd,7e,04,3d,87,87,6f,11,50,00,dd,46,02,05,19,10,fd,e5,26,c0,dd,7e,08,3d,87,87,6f,11,50,00,dd,46,06,05,19,10,fd,11,fd,07,06,08,36,00,23,36,00,23,36,00,23,36,00
480 DATA 19,10,f2,e1,11,00,a1,06,08,1a,77,13,23,1a,77,13,23,1a,77,13,23,1a,77,13,78,01,fd,07,09,47,10,e9,c9
490 FOR i=0 TO 127:READ j:POKE &A100+i,j:NEXT
500 DATA 0,65,130,0,0,65,130,0,0,0,0,0,0,211,227,0,65,81,162,130,0,85,170,0,0,170,85,0,68,136,68,136
510 DATA 0,240,240,0,80,60,60,160,180,51,51,120,180,102,153,120,180,102,153,120,180,51,51,120,80,60,60,160,0,240,240,0
520 DATA 0,15,15,0,5,15,15,10,15,173,94,15,94,173,94,47,31,173,15,15,15,15,15,15,15,15,10,5,10
530 DATA 0,0,0,0,0,3,252,0,1,86,252,168,1,86,252,168,1,87,252,168,1,86,252,168,1,86,252,168,243,243,243,243
540 RETURN
550 REM -------- move man --------
560 i=x+(INKEY(g1)>-1)-(INKEY(h1)>-1)
570 j=y+(INKEY(e1)>-1)-(INKEY(f1)>-1)
580 IF a(i,j)>1 THEN RETURN
590 CALL &A000,x,y,i,j,0
600 x=i:y=j
610 FOR t=0 TO sped:NEXT
620 RETURN
630 REM -------- screen --------
640 BORDER 0:FOR t= 1 TO 19:a(t,4)=3:a(t,24)=3:NEXT:FOR t=4 TO 24:a(1,t)=3:a(19,t)=3:NEXT
650 RESTORE 650:FOR i=0 TO 15:READ j:INK i,j:NEXT:DATA 0,18,6,24,2,8,20,26,15,16,7,9,13,22,2,26
660 PAPER 4:PEN 3
670 LOCATE 1,4
680 PRINT STRING$(19,207)
700 FOR t=5 TO 23
710 LOCATE 1,t:PRINT CHR$(207):LOCATE 19,t:PRINT CHR$(207)
720 NEXT
730 LOCATE 1,24
740 PRINT STRING$(19,207):PAPER 0
750 LOCATE 1,1:PEN 7:PRINT "SCORE MEN ACT TOP":GOSUB 1310:GOSUB 1330:GOSUB 1350:GOSUB 1370
760 FOR t=1 TO 40:rx=RND(1):ry=RND(1):rx=(rx*16)+2:ry=(ry*18)+5
770 CALL &A000,10,12,rx,ry,1:a(rx,ry)=4:NEXT
780 FOR t=0 TO 2:rx=RND(1):ry=RND(1):rx=(rx*16)+2:ry=(ry*18)+5
790 CALL &A000,10,12,rx,ry,2:a(rx,ry)=5:r(t,0)=rx:r(t,1)=ry:NEXT
800 a(x,y)=0:RETURN
810 REM -------- initialise --------
820 DIM a(20,25),r(20,1),n$(9),hi(9):FOR t= 1 TO 9:n$(t)="Computing with the Amstrad":hi(t)=500:NEXT
830 ENV 1,20,1,5:ENT -6,3,1,1:ENV 2,15,-1,5
840 DIM ke$(71):RESTORE 850:FOR t=1 TO 71:READ ke$(t):NEXT
850 DATA 1,2,3,4,5,6,7,8,9,0,-, ,clr,del,tab,q,w,e,r,t,y,u,i,o,p,,[,enter,caps,a,s,d,f,g,h,j,k,l,*,+,],shft,z,x,c,v,b,n,m,<,>,/,,ctrl,copy,space,enter,f7,f8.f9,f4,f5,f6,f1,f2,f3,f0,csr-up,f-stop,csr-lft,csr-dwn,csr-rt
860 RETURN
870 REM ------ set variables ------
880 x=10:y=12:a(x,y)=0:score=0:men=3:act=1:m=3:dead=0
890 RETURN
900 REM -------- wipe --------
910 ERASE a:DIM a(20,25):RETURN
920 REM -------- push/crush --------
930 IF INKEY(d1)<0 THEN RETURN
940 IF INKEY(g1)>-1 THEN p=x-1:q=y:a=-1:b=0
950 IF INKEY(hi)>-1 THEN p=x+1:q=y:a=1:b=0
960 IF INKEY(e1)>-1 THEN p=x:q=y-1:a=0:b=-1
970 IF INKEY(f1)>-1 THEN p=x:q=y+1:a=0:b=1
980 IF p<0 OR p>20 OR q<0 OR q>25 THEN RETURN ELSE IF a(p,q)<>4 THEN RETURN
990 IF a(p+a,q+b)=4 THEN GOSUB 1030:RETURN
1000 SOUND 1,142,90,10,,6:GOSUB 1060
1010 RETURN
1020 REM -------- crush --------
1030 LOCATE p,q:PRINT CHR$(32):a(p,q)=0
1040 RETURN
1050 REM -------- push --------
1060 a(p,q)=0
1070 p1=p+a:q1=q+b
1080 IF a(p1,q1)=5 THEN a(p,q)=0:score=score+50:SOUND 131,0:SOUND 2,1095,125,15,2,,5:GOSUB 1310:GOTO 1100
1090 IF a(p1,q1)>0 THEN a(p,q)=4:SOUND 129,0:SOUND 1,4095,50,15,2,,31:RETURN
1100 CALL &A000,p,q,p1,q1,1
1110 p=p1:q=q1
1120 CALL &BD19
1130 GOTO 1060
1140 REM ------ options menu ------
1150 MODE 0:CALL &BB4E:CALL &BC02:DRAW 0,398,4:DRAW 638,398:DRAW 638,0:DRAW 0,0:PEN 1:LOCATE 4,2:PRINT "options menu"
1160 RESTORE 1210:PEN 2:FOR t= 1 TO 4
1170 READ a$
1180 LOCATE 3,(t*2)+4
1190 PRINT t;" ";a$
1200 NEXT
1210 DATA "High Scores","Redefine Keys","Instructions","Main Menu"
1220 PEN 3:LOCATE 4,20:PRINT "Select Option"
1230 ky=1
1240 a$=INKEY$
1250 IF a$="1" THEN GOSUB 2050:GOSUB 1640:GOTO 1150
1260 IF a$="2" THEN GOSUB 2050:GOSUB 2220:GOTO 1150
1270 IF a$="3" THEN GOSUB 2050:GOSUB 2450:GOTO 1150
1280 IF a$="4" THEN GOTO 260
1290 GOTO 1240
1300 REM ------- print score -------
1310 s$=STR$(score):LOCATE 6-LEN(s$),2:PRINT score:RETURN
1330 s$=STR$(hi(1)):LOCATE 20-LEN(s$),2:PRINT hi(1):RETURN
1340 REM -------- print men --------
1350 s$=STR$(men):LOCATE 9-LEN(s$),2:PRINT men:RETURN
1360 REM -------- print act --------
1370 s$=STR$(act):LOCATE 13-LEN(s$),2:PRINT act:RETURN
1380 REM ------ move monsters ------
1390 FOR n=0 TO 2
1400 IF dead=0 THEN GOSUB 560:REM move mn
1410 i=r(n,0):j=r(n,1)
1420 IF j=0 THEN 1480
1430 IF a(i,j)<>5 THEN b=0:r(n,1)=b:LOCATE i,j:PRINT " ":a(i,j)=0:m=m-1:GOTO 1480
1440 i=i-(i<x)+(i>x)
1450 j=j+(j>y)-(j<y)
1460 IF a(x,y)<>0 THEN dead=1
1470 IF a(i,j)=0 THEN CALL&A000,r(n,0),r(n,1),i,j,2:a(r(n,0),r(n,1))=0:a(i,j)=5:r(n,0)=i:r(n,1)=j
1480 NEXT
1490 RETURN
1500 REM -------- finished --------
1510 act=act+1:m=3:score=score+100
1520 FOR t=1 TO 16
1530 FOR s=1 TO 50:NEXT:BORDER t:SOUND 129,242,10,15,,,20:NEXT
1540 BORDER 1:RETURN
1550 REM -------- dead --------
1560 SOUND 129,1500,100,15,2,0,15
1570 men=men-1:dead=0:m=3
1580 CALL &A000,x,y,x,y,3
1590 FOR t=1 TO 100:BORDER RND*26:INK 0,RND*26:NEXT:CALL &BC02
1600 IF men>0 THEN RETURN
1610 IF score>= hi(9) THEN GOSUB 1720
1620 GOTO 130
1630 REM ------ high scores ------
1640 MODE 1:GOSUB 2200
1650 DRAW 0,398,1:DRAW 638,398:DRAW 638,0:DRAW 0,0
1660 PAPER 3:PEN 1:LOCATE 14,2:PRINT"Bloch Busters":PAPER 0
1670 FOR t=1 TO 9
1680 LOCATE 4,4+t*2:PEN 1:PRINT t;:PEN 3:PRINT " ";n$(t);" ";:PEN 2:WHILE POS(#0)<31:PRINT ",";:WEND:PEN 1:PRINT hi(t)
1690 NEXT:PAPER 1:PEN 0:LOCATE 14,24:PRINT "Space for Menu":PAPER 0
1700 GOSUB 2150
1710 a$=INKEY$:IF a$<>" " THEN 1710 ELSE MODE 0:RETURN
1720 REM -------- new high --------
1730 MODE 1:CALL &BB4E:CALL &BC02
1740 DRAW 0,398,1:DRAW 638,398:DRAW 638,0:DRAW 0,0:PAPER 2
1750 PEN 3:LOCATE 13,4:PRINT" New High Score "
1760 PAPER 0:PEN 1:LOCATE 10,10:PRINT"Please enter your name"
1770 PAPER 1:PEN 3
1780 LOCATE 10,15:PRINT"-------------------------"
1790 LOCATE 10,15:k$="":n$(9)=""
1800 WHILE INKEY$<>"":WEND
1810 WHILE k$<>CHR$(13)
1820 IF k$>CHR$(31) AND k$<"z" AND LEN(n$(9))<23 THEN n$(9)=n$(9)+k$:PRINT k$;
1830 IF k$=CHR$(127) AND LEN(n$(9)) THEN n$(9)=LEFT$(n$(9),LEN(n$(9))-1):PRINT CHR$(8);CHR$(16);
1840 k$=INKEY$
1850 WEND:IF n$(9)="" THEN n$(9)="ANON,(don't blme you)"
1860 hi(9)=score:FOR i=9 TO 2 STEP-1
1870 IF hi(i)>hi(i-1) THEN k$=n$(i):n$(i)=n$(i-1):n$(i-1)=k$:hi(i)=hi(i-1):hi(i-1)=score
1880 NEXT:RETURN
1890 REM ------- title screen -------
1900 MODE 1:CALL &BB4E:CALL &BC02
1910 RESTORE 2040
1920 PAPER 3:PEN 1:LOCATE 1,4
1930 FOR t=1 TO 5
1940 READ a$
1950 PRINT TAB(3);
1960 FOR p=1 TO 37
1970 IF MID$(a$,p,1)="1" THEN PRINT CHR$(207); ELSE PRINT CHR$(32);
1980 NEXT
1990 PRINT
2000 NEXT
2010 PAPER 0:PEN 1:LOCATE 9,15:PRINT"MEETS THE ICE MONSTERS!"
2020 FOR t=1 TO 3000:NEXT
2030 RETURN
2040 DATA 1100111011001110111000011001110100100,1010101010101010010000010101010110100,1100101011001010010000011001010111100,1010101010101010010000010101010101100,1010111010001110010000010101110100100
2050 REM ------- clear screen -------
2060 FOR t=40 TO 0 STEP-1
2070 OUT &BC00,1
2080 OUT &BD00,t
2090 FOR p=1 TO 25:NEXT
2100 NEXT
2110 CLS
2120 OUT &BC00,1
2130 OUT &BD00,40
2140 RETURN
2150 FOR t=0 TO 40
2160 OUT &BC00,1
2170 OUT &BD00,t
2180 FOR p=1 TO 25:NEXT
2190 NEXT:RETURN
2200 OUT &BC00,1:OUT &BD00,0:RETURN
2210 REM ------- redefine keys -------
2220 MODE 0:CALL &BB4E:CALL &BC02
2230 BORDER 14:DRAW 0,398,1:DRAW 638,398:DRAW 638,0:DRAW 0,0:PEN 7:PAPER 4
2240 LOCATE 4,2:PRINT" Redefine Keys "
2250 PAPER 0:PEN 9
2260 LOCATE 3,7:PRINT"   up  -  ";
2270 e=0:k=-1:WHILE k=-1:GOSUB 2400:WEND:e=k
2280 LOCATE 3,9:PRINT" down  -  ";
2290 f=0:k=-1:WHILE k=1:GOSUB 2400:WEND:f=k
2300 LOCATE 3,11:PRINT" left  -  ";
2310 g=0:k=-1:WHILE k=-1:GOSUB 2400:WEND:g=k
2320 LOCATE 3,13:PRINT"right  -  ";
2330 h=0:k=-1:WHILE k=-1:GOSUB 2400:WEND:h=k
2340 LOCATE 3,15:PRINT" push  -  ";
2350 d=0:k=-1:WHILE k=-1:GOSUB 2400:WEND:d=k
2360 PEN 3:LOCATE 5,20:PRINT "Correct?"
2370 IF INKEY(43)>-1 THEN RETURN
2380 IF INKEY(46)>-1 THEN 2220
2390 GOTO 2370
2400 RESTORE 2440:FOR a=1 TO 71
2410 READ t
2420 IF INKEY(t)>-1 THEN k=t:PRINT ke$(a):a=71:WHILE INKEY(t)>-1:WEND
2430 NEXT:RETURN
2440 DATA 64,65,57,56,49,48,41,40,33,32,25,24,16,79,68,67,59,58,50,51,43,42,35,34,27,26,17,18,70,69,60,61,53,52,44,45,37,36,29,28,19,21,71,63,62,55,54,46,38,39,31,30,22,23,9,47,6,10,11,3,20,12,4,13,14,5,0,7,8,2,1
2450 REM ------- instructions -------
2460 MODE 1:CALL &BB4E:CALL &BC02
2470 GOSUB 2200
2480 BORDER 14:PAPER 3:PEN 2
2490 LOCATE 15,2:PRINT" Robot Ron "
2500 PAPER 0:PEN 1
2510 PRINT:PRINT:PRINT:PRINT:PRINT " Robot Ron has defeated all his previous"
2520 PRINT"opponents but now he has met his match.":PRINT
2530 PRINT" Ice Monsters are the most feared beasts"
2540 PRINT"in the galaxy.And they are extremely":PRINT:PRINT"difficult to kill.":PRINT
2550 PRINT"The only way this can be achieved is to":PRINT"crush them by pushing an ice cube over":PRINT
2560 PRINT"them. GOOD LUCK!":PRINT
2570 PAPER 1:PEN 3:LOCATE 14,24:PRINT"Space for Menu"
2580 GOSUB 2150
2590 a$=INKEY$:IF a$<>" " THEN 2590 ELSE RETURN
2600 REM ------- speed selection -------
2610 PEN 3:LOCATE 3,2:PRINT"Speed  Selection"
2620 RESTORE 2640:FOR t=1 TO 5
2630 READ a$:LOCATE 3,(2*t)+5:PEN t+5:PRINT a$:NEXT
2640 DATA "1.Hand Breaking","2. Breath Taking","3. Mr Average","4. Slowwwwww.","5. The A Team's"
2650 a$=INKEY$
2660 IF VAL(a$)>5 OR VAL(a$)<1 THEN 2650
2670 zp=VAL(a$):zp=zp-1:sped=zp*100
2680 RETURN