10 REM             Cube Wars
20 REM             By J.Pugh
30 REM (c) Computing with the Amstrad
40 REM -------------- CPC -------------
50 ON BREAK GOSUB 2490:KEY 0,"PEN 1:PAPER 0"+CHR$(13)
60 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
70 GOSUB 1570:MODE 0:BORDER 0:INK 14,23,2:INK 11,0:INK 12,24:INK 13,16:DEFINT a-z:mus=1:DIM block(45),blx(45),bly(45)
80 FOR t=1 TO 3:READ ded$(t):NEXT
90 DATA " STAY ON THE BLOCKS ","   WATCH THE GAPS   ","  DODGE THE THINGY  "
100 FOR t=1 TO 10:hi(t)=1000:hi$(t)="AMSTRAD":NEXT
110 FOR t=0 TO 10:READ pink(t):INK t,pink(t):NEXT:DATA 0,26,1,2,6,9,11,18,11,3,25
120 FOR t=1 TO 45:READ blx(t),bly(t):NEXT
130 DATA 18,2,16,6,20,6,14,10,18,10,22,10,12,14,16,14,20,14,24,14,10,18,14,18,18,18,22,18,26,18,8,22,12,22,16,22,20,22,24,22,28,22,6,26,10,26,14,26,18,26,22,26,26,26,30,26
140 DATA 4,30,8,30,12,30,16,30,20,30,24,30,28,30,32,30,2,34,6,34,10,34,14,34,18,34,22,34,26,34,30,34,34,34
150 FOR t=1 TO 9:READ limit(t):NEXT:DATA 1,2,4,7,11,16,22,29,37
160 FOR t=1 TO 9:READ rimit(t):NEXT:DATA 1,3,6,10,15,21,28,36,45
170 GOTO 1440
180 REM new game
190 sc=0:li=3:le=1:screen=1
200 REM New Screen
210 FOR t=1 TO 11:INK t,0:NEXT
220 MODE 0:PAPER 11:CLS:BORDER 0:cau=0:sn=screen
230 IF sn=1 THEN RESTORE 290:ELSE IF sn=2 THEN RESTORE 300:ELSE IF sn=3 THEN RESTORE 310
240 IF sn=4 THEN RESTORE 320:ELSE IF sn=5 THEN RESTORE 330
250 FOR t=1 TO 45
260 READ a:IF a=0 THEN 280
270 x=blx(t):y=bly(t):CALL 29800,x,y,a:y=y+2:CALL 29800,x,y,3
280 block(t)=a:NEXT:READ nob
290 DATA 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,45
300 DATA 2,2,2,2,2,2,2,0,0,2,2,0,0,0,2,2,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,36
310 DATA 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,0,0,0,2,2,2,0,0,0,0,0,2,2,0,0,0,0,0,0,0,2,0,0,0,0,25
320 DATA 2,2,2,2,2,2,2,0,0,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,2,0,0,2,2,36
330 DATA 2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,0,2,2,2,2,0,0,2,2,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,39
340 nob=nob-1:block(1)=4:CALL 29800,18,2,4
350 FOR t=1 TO 10:INK t,pink(t):NEXT
360 qx=18:qy=0:qb=1:qv=1:CALL 29900,qx,qy,39:z=29600:POKE z,qx:POKE z+1,qy
370 mx=18:my=32:mb=41:mv=9:CALL 29900,mx,my,40:POKE z+2,mx:POKE z+3,my
380 CALL 29800,qx,qy,1:CALL 29800,mx,my,0
390 LOCATE 1,1:PEN 6:PRINT"LEVEL":LOCATE 16,1:PRINT"LIVES";
400 LOCATE 3,22:PEN 7:PRINT"SCORE"SPC(6)sc:LOCATE 4,24:PEN 10:PRINT"HIGH"SPC(6);hi(1)
410 LOCATE 2,3:PEN 4:PRINT le;:LOCATE 17,3:PEN 3:PRINT li;
420 LOCATE 8,25:PEN 12:PRINT"READY!";:FOR t=1 TO 2000:NEXT:LOCATE 8,25:PRINT SPACE$(6);
430 IF mus=1 THEN PEN 12:LOCATE 20,25:PRINT CHR$(237);
440 REM New Man's Position
450 qmot=0
460 IF INKEY(67)=0 OR INKEY(74)=0 THEN 570
470 IF INKEY(50)=0 OR INKEY(72)=0 THEN 590
480 IF INKEY(71)=0 OR INKEY(73)=0 THEN 610
490 IF INKEY(62)=0 OR INKEY(75)=0 THEN 630
500 IF INKEY(27)<>0 THEN 530
510 PEN 14:LOCATE 5,25:PRINT"PRESS  SPACE";
520 WHILE INKEY$<>CHR$(32):WEND:LOCATE 5,25:PRINT SPACE$(12);
530 IF INKEY(38)<>0 THEN 560
540 IF mus=0 THEN mus=1:LOCATE 20,25:PEN 12:PRINT CHR$(237);:GOTO 560
550 mus=0:LOCATE 20,25:PEN 12:PRINT CHR$(32);
560 FOR t=1 TO 50:NEXT:GOTO 650
570 IF qb=limit(qv) THEN cau=1:GOTO 1190
580 qb=qb-qv:qv=qv-1:qmot=1:GOTO 650
590 IF qb=rimit(qv) THEN cau=1:GOTO 1190
600 qb=qb-qv+1:qv=qv-1:qmot=2:GOTO 650
610 IF qv=9 THEN cau=1:GOTO 1190
620 qb=qb+qv:qv=qv+1:qmot=3:GOTO 650
630 IF qv=9 THEN cau=1:GOTO 1190
640 qb=qb+qv+1:qv=qv+1:qmot=4:GOTO 650
650 REM Thingy's New Position
660 mturn=mturn+1:IF mturn=3 THEN mturn=0
670 w=29600:qx=PEEK(w):qy=PEEK(w+1):mx=PEEK(w+2):my=PEEK(w+3)
680 ch=0:IF INT(RND(1)*10)+1>(9-le) THEN ch=1
690 IF mturn<>0 THEN 900
700 IF mx<qx THEN 730:ELSE IF my>qy AND ch=1 THEN mom=1:GOTO 770
710 IF my<qy AND ch=1 THEN mom=3:GOTO 770
720 GOTO 770
730 IF my>qy AND ch=1 THEN mom=2:GOTO 770
740 IF my<qy AND ch=1 THEN mom=4:GOTO 770
750 GOTO 770
760 mom=mom+1:IF mom=5 THEN mom=1
770 ON mom GOTO 780,800,820,840
780 IF mb=limit(mv) THEN 760:ELSE IF block(mb-mv)=0 THEN 760
790 mb=mb-mv:mv=mv-1:GOTO 900
800 IF mb=rimit(mv) THEN 760:ELSE IF block(mb-mv+1)=0 THEN 760
810 mb=mb-mv+1:mv=mv-1:GOTO 900
820 IF mv=9 THEN 760:ELSE IF block(mb+mv)=0 THEN 760
830 mb=mb+mv:mv=mv+1:GOTO 900
840 IF mv=9 THEN 760:ELSE IF block(mb+mv+1)=0 THEN 760
850 mb=mb+mv+1:mv=mv+1:GOTO 900
860 REM Play Tune
870 READ tn:IF tn=255 THEN RETURN
880 READ lg:SOUND 7,tn,lg,15,2,2
890 GOTO 860
900 REM Move Man and Thingy
910 dead=0:fin=0:ad=0:col=0
920 IF qmot=0 THEN 990
930 IF block(qb)=0 THEN dead=1:cau=2:GOTO 990
940 IF block(qb)=2 THEN nob=nob-1:ad=1
950 x=PEEK(z):y=PEEK(z+1):CALL &BD19:CALL 29800,x,y,39:block(qb)=4
960 q=PEEK(z+2):w=PEEK(z+3):IF ABS(q-x)<8 AND ABS(w-y)<9 THEN col=1:CALL 29800,q,w,40
970 CALL 29800,blx(qb),bly(qb),4:CALL 29900,x,y,39
980 IF col=1 THEN CALL 29900,q,w,40:CALL 29800,q,w,0
990 t=0
1000 IF qmot=0 THEN 1060
1010 ON qmot GOTO 1020,1030,1040,1050
1020 CALL 29700,1:CALL 29700,3:CALL 29700,3:GOTO 1060
1030 CALL 29700,2:CALL 29700,3:CALL 29700,3:GOTO 1060
1040 CALL 29700,1:CALL 29700,4:CALL 29700,4:GOTO 1060
1050 CALL 29700,2:CALL 29700,4:CALL 29700,4
1060 IF ABS(PEEK(z)-PEEK(z+2))<4 AND ABS(PEEK(z+1)-PEEK(z+3))<4 THEN cau=3:GOTO 1190
1070 IF mturn<>0 THEN 1120:ELSE ON mom GOTO 1080,1090,1100,1110
1080 CALL 29620,1:CALL 29620,3:CALL 29620,3:GOTO 1120
1090 CALL 29620,2:CALL 29620,3:CALL 29620,3:GOTO 1120
1100 CALL 29620,1:CALL 29620,4:CALL 29620,4:GOTO 1120
1110 CALL 29620,2:CALL 29620,4:CALL 29620,4
1120 IF ABS(PEEK(z)-PEEK(z+2))<4 AND ABS(PEEK(z+1)-PEEK(z+3))<4 THEN cau=3:GOTO 1190
1130 IF dead=1 THEN 1190
1140 IF ad=0 THEN 1170
1150 IF mus=1 THEN SOUND 7,142,5,15
1160 sc=sc+le*10:LOCATE 14,22:PEN 7:PRINT sc;:IF nob=0 THEN 1500
1170 t=t+1:IF t=2 THEN 440
1180 GOTO 1000
1190 REM Lose life
1200 CALL 29800,PEEK(29602),PEEK(29603),0
1210 ck=PEEK(29600)-PEEK(29602):IF ck=3 THEN CALL 29620,2:ELSE IF ck=-3 THEN CALL 29620,1
1220 IF cau<3 THEN CALL 29800,PEEK(29600),PEEK(29601),39
1230 LOCATE 1,25:PEN 14:PRINT ded$(cau);
1240 RESTORE 1250:GOSUB 860:GOTO 1260
1250 DATA 478,-3,358,-3,284,-3,268,-2,284,-2,358,-2,478,-4,478,-2,268,-3,284,-2,268,-2,239,-6,255
1260 FOR t=1 TO 1000:NEXT
1270 li=li-1:IF li=0 THEN 1290
1280 GOTO 200
1290 REM Game Over
1300 PEN 13:LOCATE 1,1:PRINT CHR$(22)+CHR$(1);:LOCATE 6,11:PRINT"GAME  OVER"
1310 RESTORE 1320:GOSUB 860:GOTO 1330
1320 DATA 213,-2,213,-2,213,-1,213,-3,179,-2,190,-2,190,-3,213,-2,213,-2,225,-3,213,-4,255
1330 FOR t=1 TO 3000:NEXT:PRINT CHR$(22)+CHR$(0);
1340 CLS:IF sc<hi(10) THEN 1440
1350 po=10:FOR t=10 TO 1 STEP -1
1360 IF sc>=hi(t) THEN po=t
1370 NEXT
1380 FOR t=10 TO po STEP -1:hi(t)=hi(t-1):hi$(t)=hi$(t-1):NEXT
1390 PEN 3:PRINT"  Congratulations!":PRINT:PRINT TAB(3)"You have a new"
1400 PRINT:PRINT TAB(4)"High Score!!":PEN 10:PRINT:PRINT
1410 WHILE INKEY$<>"":WEND
1420 PRINT"Enter your name":INPUT z$:IF LEN(z$)>9 THEN PRINT"Up to 9 Chars.":FOR t=1 TO 3000:NEXT:GOTO 1420
1430 hi(po)=sc:hi$(po)=z$
1440 CLS:PEN 10:PRINT"  HIGH SCORE TABLE":PEN 4:PRINT"  ================"
1450 FOR t=1 TO 10:z$=hi$(t)
1460 IF LEN(z$)<9 THEN FOR y=1 TO 9-LEN(z$):z$=" "+z$:NEXT
1470 PEN t:LOCATE 1,(t*2)+2:PRINT z$:LOCATE 11,(t*2)+2:PRINT hi(t);:NEXT
1480 PEN 14:LOCATE 1,25:PRINT"Press Space To Play";
1490 WHILE INKEY$<>" ":WEND:GOTO 180
1500 REM Complete Screen
1510 PEN 14:LOCATE 8,25:PRINT"YAHOO!"
1520 RESTORE 1530:GOSUB 860:GOTO 1540
1530 DATA 358,-2,319,-2,284,-2,268,-3,358,-3,268,-2,284,-2,268,-2,239,-3,319,-3,319,-2,284,-2,268,-2,213,-3,239,-1,239,-2,268,-1,268,-2,284,-2,319,-2,284,-2,358,-4,255
1540 FOR t=1 TO 1000:NEXT
1550 le=le+1:screen=screen+1:IF screen=6 THEN screen=1
1560 sc=sc+100*le:GOTO 200
1570 REM Machine Code/Sprite Data
1580 MODE 2:DEFINT i,c,l,v:PRINT"Initialising..."
1590 MEMORY 19999:RESTORE 1680:ln=1680
1600 FOR adr=&7397 TO &77B0 STEP 13
1610 READ byte$:chk=0
1620 FOR i=0 TO 12
1630 v=VAL("&"+MID$(byte$,i*2+1,2)) :REM If this line or then next stops with an error report but it look OK, type PRINT LN and look at the line indicated.
1640 POKE adr+i,v:chk=chk+v
1650 NEXT
1660 IF chk<>VAL("&"+RIGHT$(byte$,3)) THEN PRINT"ERROR in LINE";ln:STOP
1670 ln=ln+10:NEXT:RESTORE:RETURN
1680 DATA 0000000000000000001200120802C
1690 DATA 00FF0C0405003030323937343027A
1700 DATA FF0000DD7E00F53AA273673AA35E2
1710 DATA 736F3E28E5CD7174E1E5C1F1FE855
1720 DATA 01280BFE02280AFE0328090C182BC
1730 DATA 070518040418010D3E28E5C5C5327
1740 DATA E1CDD574C1E1C5E13E00E5CD718A0
1750 DATA 74E17C32A2737D32A373C900005A6
1760 DATA 0000000000DD7E00F53AA07367404
1770 DATA 3AA1736F3E27E5CD7174E1E5C1740
1780 DATA F1FE01280BFE02280AFE032809487
1790 DATA 0C18070518040418010D3E27E51C0
1800 DATA C5C5E1CDD574C1E1C5E13E01E58ED
1810 DATA CD7174E17C32A0737D32A173C96E0
1820 DATA 00000000000000000000000000000
1830 DATA 00000000000000000000000000000
1840 DATA 00DD6604DD6E02DD7E00E56F26569
1850 DATA 002929292929292901307509E52B3
1860 DATA D1E1D516007DCB3F300216206F4FB
1870 DATA 7C872600D529292929E5D129294AA
1880 DATA 19D15F19D10100C0090100001A318
1890 DATA FE00280177043E08B8201406002DA
1900 DATA 0C3E10B9C8C501F907093004013DF
1910 DATA 50C009C12B2313C3A574DD660455E
1920 DATA DD6E02DD7E00E56F260029292949D
1930 DATA 2929292901307509E5D1E1D5164D5
1940 DATA 007DCB3F300216206F7C872600387
1950 DATA D529292929E5D1292919D15F194E3
1960 DATA D10100C0090100007EFE002800340
1970 DATA 12043E08B8201406000C3E10B9261
1980 DATA C8C501F9070930040150C009C14A6
1990 DATA 2B2313C30B75000000000000001A4
2000 DATA 00000000D4FC0000000000C0FC38C
2010 DATA FCFC000000C0FCFCFCFCFC00FC8A0
2020 DATA FCE8D4E8D4FCFCFCFCE8D4E8D4BDC
2030 DATA FCFC00FCEDD4EDD4FC0000FCED95B
2040 DATA D4EDD4FC0000FCFCFCFCFCF800975
2050 DATA 00FCFCFCFCFCF0000000FCFCFC8D0
2060 DATA F800000000FCCFCFF80000000048A
2070 DATA FCEDDEF00000000000FCF800005AB
2080 DATA 00000000FCF8000000000000FC2F0
2090 DATA F00000000000000000000000000F0
2100 DATA 3C3CCCCCCCCC000068C0C4C8C071C
2110 DATA C4000068C0C4C8C0C40000C8C0684
2120 DATA C4C8C0C40000C8C0C4C8C0C4007A8
2130 DATA 00C8CFC4C8CFC40000C8CFC4C87D9
2140 DATA CFC40000C86DC4C86DC40000CC651
2150 DATA CCCCCCCCCC0000CCCCCCCCCCCC8C4
2160 DATA 000000CCFCFC8C00000000CCDC4F8
2170 DATA AC0C0000000000DCAC00000000240
2180 DATA 0000CC0C0000000000000000000D8
2190 DATA 00000000000102000000000000003
2200 DATA 0303000000000001030302000000F
2210 DATA 00000303030300000001030303016
2220 DATA 0302000003030303030300010301B
2230 DATA 03030303030203030303030303026
2240 DATA 038303030303030312C3030303176
2250 DATA 03030330C383030303031230C3290
2260 DATA C3030303033030C3C383030312350
2270 DATA 3030C3C3C30303303030C3C3C3588
2280 DATA 8312303030C3C3C3C3303030304F1
2290 DATA 00000000000000000000000000000
2300 DATA 00000000000000000000000000000
2310 DATA 00000000000000000000000000000
2320 DATA 00000000000000000000000000000
2330 DATA 000000000000000000000000C30C3
2340 DATA C3C3C33030303041C3C3C330305F3
2350 DATA 302000C3C3C3303030000041C342D
2360 DATA C3303020000000C3C330300000329
2370 DATA 000041C330200000000000C330247
2380 DATA 00000000000041200000000000061
2390 DATA 00050A0000000000000F0F000002D
2400 DATA 000000050F0F0A000000000F0F04B
2410 DATA 0F0F000000050F0F0F0F0A0000069
2420 DATA 0F0F0F0F0F0F00050F0F0F0F0F0AA
2430 DATA 0F0A0F0F0F0F0F0F0F0F870F0F136
2440 DATA 0F0F0F0F1AC30F0F0F0F0F0F301A3
2450 DATA C3870F0F0F0F1A30C3C30F0F0F383
2460 DATA 0F3030C3C3870F0F1A3030C3C349A
2470 DATA C30F0F303030C3C3C3871A30304BB
2480 DATA 30C3C3C3C330303030000000003FC
2490 INK 1,26:INK 0,1:PEN 1:PAPER 0:MODE 2