10 REM Save Santa!
20 REM by Tiffany Wood 30 REM (with a bit of help) 40 REM (c) Computing with the Amstrad 50 REM ------------ CPC ------------- 60 GOSUB 810 :REM intialise 70 WHILE NOT asleep 80 GOSUB 190 :REM titlescreen 90 GOSUB 270 :REM waitkey 100 WHILE lives>=0 AND screen<11 110 GOSUB 310 :REM setupscreen 120 WHILE sn(osx,osy)=11 AND iv 130 GOSUB 490:IF sn(osx,osy)<>11 THEN 140 ELSE GOSUB 580:GOSUB 660 140 WEND 150 IF iv THEN GOSUB 530 ELSE screen=screen+1:IF screen=11 THEN screen=1 160 WEND 170 GOSUB 700 :REM hiscore 180 WEND 190 REM -------- title screen ------ 200 MODE 0:LOCATE 5,2:PEN 1:PAPER 8:PRINT" Mega Heros ":PAPER 0 210 LOCATE 1,6:FOR i=1 TO 5:SOUND 130,90-i*15,0,15,1:PEN 7-i:PRINT " "hiscore$(i,1) TAB(15) hiscore$(i,2):PRINT:NEXT 220 PEN 11:PAPER 12:LOCATE 5,24:PRINT"Hit a button":PAPER 0 230 RESTORE 260:FOR i=1 TO 4:READ bx,by,bw,bh,bc:GOSUB 980:NEXT 240 PLOT 440,350:DRAWR 6,24:DRAWR 6,-24:TAG:MOVE 430,400:PRINT"e";:TAGOFF 250 sc=0:lives=5:screen=1:RETURN 260 DATA 0,10,638,378,1,120,362,396,26,2,22,154,590,180,3,120,10,396,26,4 270 REM ------- wait for key ------- 280 WHILE INKEY$<>"":WEND 290 c$="":WHILE c$="":c$=UPPER$(INKEY$):WEND 300 RETURN 310 REM ---- initialise screen ---- 320 MODE 0:ON screen GOSUB 1010,1120,1230,1340,1450,1560,1670,1780,1890,2000 330 ERASE sn:DIM sn(19,22):osx=9:osy=11:sx=9:sy=11:sdx=1:sdy=1:iv=1:sbf=0:sbxv=1:sbyv=0 340 FOR i=0 TO 19:sn(i,0)=18:sn(i,22)=18:sn(i,1)=11:sn(i,21)=11:NEXT 350 FOR i=1 TO 21:sn(0,i)=18:sn(19,i)=18:sn(1,i)=11:sn(18,i)=11:NEXT 360 FOR j=2 TO 11:READ a$:FOR i=2 TO 9 370 zz=11+VAL(MID$(a$,i-1,1)):sn(i,j)=zz:sn(i,22-j)=zz:sn(19-i,j)=zz:sn(19-i,22-j)=zz 380 zz=zz-11:CALL &8034,i,j,zz:CALL &8034,i,22-j,zz:CALL &8034,19-i,j,zz:CALL &8034,19-i,22-j,zz 390 NEXT i,j 400 CALL &8034,osx,osy,1 410 FOR i=1 TO 10:in(i,0)=1:in(i,3)=3+RND*2:in(i,4)=ROUND(RND*2)-1:in(i,5)=ROUND(RND*2)-1 420 in(i,1)=1+RND*5+ROUND(RND)*12:in(i,2)=1+RND*5+ROUND(RND)*13:IF sn(in(i,1),in(i,2))<>11 THEN 420 ELSE sn(in(i,1),in(i,2))=i:CALL &8034,in(i,1),in(i,2),in(i,3) 430 NEXT 440 PEN 5:PRINT"score:" sc TAB(12) "lives:" lives 450 LOCATE 1,25:PRINT"hi:" hiscore$(1,2) TAB(10) "screen:" screen; 460 PLOT 0,20,1:DRAWR 636,0:DRAWR 0,360:DRAWR -636,0:DRAWR 0,-360 470 RETURN 480 REM ---------- santa ----------- 490 sx=osx+(INKEY(kl)=0)-(INKEY(kr)=0):sy=osy+(INKEY(ku)=0)-(INKEY(kd)=0) 500 IF sn(sx,sy)=18 OR sx=osx AND sy=osy THEN RETURN ELSE CALL &8034,osx,osy,0,sx,sy,1:sdx=sx-osx:sdy=sy-osy:osx=sx:osy=sy:SOUND 2,100,5,15,,1 510 IF sn(sx,sy)=19 THEN sc=sc+1:sn(sx,sy)=11:LOCATE 7,1:PRINT sc 520 RETURN 530 REM ------- santa slayed ------- 540 CALL &8034,osx,osy,9:FOR i=1 TO 1000 STEP 20:SOUND 135,i+RND*100,50,15:NEXT 550 lives=lives-1:LOCATE 18,1:PRINT lives 560 RETURN 570 REM -------- snow ball --------- 580 IF INKEY(f) AND sbf=0 THEN RETURN 590 IF sbf=0 THEN sbxv=SGN(sdx):sbyv=SGN(sdy):osbx=osx+sbxv:osby=osy+sbyv:IF sn(osbx,osby)>11 THEN RETURN ELSE sbf=1:CALL &8034,osbx,osby,2:SOUND 4,60,5,15,,2 600 IF sn(osbx,osby)<11 THEN 630 ELSE sbx=osbx+sbxv:sby=osby+sbyv 610 IF sn(sbx,sby)>11 THEN sbf=0:CALL &8034,osbx,osby,0:RETURN 620 CALL &8034,osbx,osby,0,sbx,sby,2:osbx=sbx:osby=sby 630 IF sn(osbx,osby)<11 THEN in(sn(osbx,osby),0)=0:sn(osbx,osby)=11:sbf=0:CALL &8034,osbx,osby,0:SOUND 2,500,0,15,1 640 RETURN 650 REM -------- invaders ---------- 660 iv=0:FOR i=0 TO 10:IF in(i,0) THEN iv=1 ELSE 690 670 tx=in(i,1):ty=in(i,2):ix=tx+in(i,4):iy=ty+in(i,5):IF sn(ix,iy)<>11 THEN in(i,4)=SGN(osx-tx):in(i,5)=SGN(osy-ty):GOTO 690 680 CALL &8034,tx,ty,0,ix,iy,in(i,3):sn(tx,ty)=11:sn(ix,iy)=i:in(i,1)=ix:in(i,2)=iy:SOUND 1,1000,2,15 690 NEXT:RETURN 700 REM --------- hiscore ---------- 710 WHILE INKEY$<>"":WEND:CLS 720 FOR i=1 TO 5:IF sc<VAL(hiscore$(i,2)) THEN NEXT 730 IF i=6 THEN RETURN ELSE FOR j=5 TO i+1 STEP -1:hiscore$(j,1)=hiscore$(j-1,1):hiscore$(j,2)=hiscore$(j-1,2):NEXT 740 hiscore$(i,2)=STR$(sc):hiscore$(i,1)="" 750 PEN 2:PAPER 14:LOCATE 3,1:PAPER 3:PRINT"Congratulations!!":PAPER 5:LOCATE 6,3:PRINT"A Hi-Score" 760 PAPER 8:LOCATE 4,5:PRINT"Type your name" 770 LOCATE 5,15:PRINT STRING$(12,"."):LOCATE 5,15 780 c$=INKEY$:IF c$=CHR$(13) THEN RETURN ELSE lh=LEN(hiscore$(i,1)):IF c$=CHR$(&7F) THEN IF lh>0 THEN hiscore$(i,1)=LEFT$(hiscore$(i,1),lh-1):PRINT CHR$(8) "." CHR$(8);:GOTO 800 ELSE 800 790 IF lh<12 THEN hiscore$(i,1)=hiscore$(i,1)+c$:PRINT c$; 800 GOTO 780 810 REM -------- intialise --------- 820 GOSUB 2110 :REM machine code 830 DEFINT a-z 840 DIM sn(19,22),in(10,5),hiscore$(5,2) 850 MODE 0:PEN 2:LOCATE 1,12:PRINT"STICK or KEYS? (s/k)" 860 GOSUB 270:IF c$="S" THEN RESTORE 880 ELSE IF c$="K" THEN RESTORE 890 ELSE 860 870 READ ku,kd,kl,kr,f 880 DATA 72,73,74,75,76 890 DATA 0,2,8,1,47 900 MODE 0 910 BORDER 0:RESTORE 920:FOR i=0 TO 15:READ j,k:INK i,j,k:NEXT:SPEED INK 30,15 920 DATA 0,0,18,18,26,26,15,15,11,11,5,5,0,25,25,25,7,7,16,16,13,13,15,0,0,15,6,0,6,6,0,6 930 FOR i=1 TO 5:READ hiscore$(i,1):hiscore$(i,2)=STR$((6-i)*40):NEXT 940 DATA Ronny Raygun,Arfur Brian,Dan Dire,Min L Adam,Cap'n Hand 950 ENT 1,5,10,1:ENT 2,5,-10,1 960 ENV 1,1,0,5,10,-1,5 970 RETURN 980 REM --- box bx,by,bh,bw,bc ---- 990 PLOT bx,by,bc:DRAWR bw,0:DRAWR 0,bh:DRAWR -bw,0:DRAWR 0,-bh 1000 RETURN 1010 RESTORE 1010:RETURN :REM screen 1 1020 DATA 00777770 1030 DATA 00000000 1040 DATA 70088888 1050 DATA 70000000 1060 DATA 70077777 1070 DATA 70080000 1080 DATA 70077000 1090 DATA 76078006 1100 DATA 80070000 1110 DATA 80070000 1120 RESTORE 1120:RETURN :REM screen 2 1130 DATA 00000000 1140 DATA 00008888 1150 DATA 00000888 1160 DATA 00700000 1170 DATA 00070088 1180 DATA 00007008 1190 DATA 00000708 1200 DATA 00600070 1210 DATA 88688880 1220 DATA 00000000 1230 RESTORE 1230:RETURN :REM screen 3 1240 DATA 00000000 1250 DATA 00000000 1260 DATA 66000007 1270 DATA 60000078 1280 DATA 60000780 1290 DATA 00007800 1300 DATA 00078000 1310 DATA 07780066 1320 DATA 78000000 1330 DATA 88000000 1340 RESTORE 1340:RETURN :REM screen 4 1350 DATA 00000666 1360 DATA 00000000 1370 DATA 00878888 1380 DATA 00870006 1390 DATA 00807006 1400 DATA 00800706 1410 DATA 00800706 1420 DATA 00800700 1430 DATA 00800700 1440 DATA 00888600 1450 RESTORE 1450:RETURN :REM screen 5 1460 DATA 88800000 1470 DATA 80000000 1480 DATA 80000766 1490 DATA 80007800 1500 DATA 80078800 1510 DATA 80078800 1520 DATA 80078800 1530 DATA 00007800 1540 DATA 08800700 1550 DATA 08600000 1560 RESTORE 1560:RETURN :REM screen 6 1570 DATA 00000008 1580 DATA 00000008 1590 DATA 00000008 1600 DATA 00000000 1610 DATA 77007770 1620 DATA 08088000 1630 DATA 00808800 1640 DATA 77007770 1650 DATA 00000000 1660 DATA 88888800 1670 RESTORE 1670:RETURN :REM screen 7 1680 DATA 00000000 1690 DATA 00800088 1700 DATA 00800088 1710 DATA 00800088 1720 DATA 00880088 1730 DATA 00080088 1740 DATA 00088008 1750 DATA 88008808 1760 DATA 00880808 1770 DATA 00000000 1780 RESTORE 1780:RETURN :REM screen 8 1790 DATA 00060000 1800 DATA 00006000 1810 DATA 08000600 1820 DATA 08800060 1830 DATA 08800600 1840 DATA 08806080 1850 DATA 08060808 1860 DATA 00608080 1870 DATA 06080800 1880 DATA 60808000 1890 RESTORE 1890:RETURN :REM screen 9 1900 DATA 00000000 1910 DATA 00000006 1920 DATA 00078080 1930 DATA 00087006 1940 DATA 00078000 1950 DATA 00087006 1960 DATA 00078000 1970 DATA 00087006 1980 DATA 00078000 1990 DATA 00087000 2000 RESTORE 2000:RETURN :REM screen 10 2010 DATA 00007777 2020 DATA 00000886 2030 DATA 70600800 2040 DATA 70007770 2050 DATA 70000000 2060 DATA 70607770 2070 DATA 70000800 2080 DATA 86060886 2090 DATA 86007777 2100 DATA 86000000 2110 REM ------ machine code ------ 2120 IF PEEK(350)=255 THEN RETURN 2130 MODE 2:PRINT"Wait a mo', I'm initialising" 2140 ln=2210:RESTORE 2210:FOR adr=&8000 TO &81DD STEP 13 2150 READ byte$:chk=0:FOR i=0 TO 12 2160 v=VAL("&"+MID$(byte$,i*2+1,2)) 2170 POKE adr+i,v:chk=chk+v:NEXT 2180 IF chk<>VAL("&"+RIGHT$(byte$,3)) THEN PRINT"error in line";ln:LIST 2210- 2190 ln=ln+10:NEXT 2200 MODE 0:CALL &8000:MODE 1:POKE 350,255:RETURN 2210 DATA 0616210100117E80DD21DE81FD4A7 2220 DATA 210A82E5C5CD1ABCDD7500DD7469D 2230 DATA 0121200019FD7500FD7401EBFD527 2240 DATA 23FD23DD23DD23C1E12C10DDC96C7 2250 DATA F5CD5080F1E5D5FE03CA4B80117E4 2260 DATA 0600DD19CD5080CD8C80D1E1C36E7 2270 DATA 8C80DD5E00CB231600FD210A824F5 2280 DATA FD19FD6E00FD6601FD21DE81DD73F 2290 DATA 5E02DD5603CB23CB12FD19FD5E5D2 2300 DATA 00FD5601E5DD6E04DD6605CB255C0 2310 DATA CB14CB25CB1C19EBE1C90608C5637 2320 DATA D5010400EDB0D17AC60857C1105B8 2330 DATA F1C900000000000000000000001BA 2340 DATA 00000000000000000000000000000 2350 DATA 000000000000000000153F0000054 2360 DATA 6B972A00414104774986BB9F0C45E 2370 DATA 0C6F512E1DA2002B1700B7AA553B1 2380 DATA 7B0000000000000C0000040E00099 2390 DATA 00050C08000C0D08000E0C0A0005E 2400 DATA 040C0000050D00001020000030082 2410 DATA 300050B070A0103030203075BA42F 2420 DATA 30B0FBF77050FFFFA000F0F000810 2430 DATA 000000000054FC0000ADADA800352 2440 DATA DCDCA80088AA88006FCF2A15145AB 2450 DATA 3C151500001500030300010000082 2460 DATA 0202281401A1000052500201A0227 2470 DATA 00F0F000500000A0030201034531E 2480 DATA 9B220000CC000000CC000011CC332 2490 DATA 8A0011CC8A0011DC8A0011FC8A4FF 2500 DATA 0055FCA2000F0D0E0D0E0C0E0D25F 2510 DATA 0D0D0E0E0F0F0D0C0E0C0C0D0C0AC 2520 DATA 0C0F0D0E0F0E0E0E0D0C0F003F0D6 2530 DATA 1D2A003F1D2A003F0C2A000C0F15D 2540 DATA 08000F0F08002E1F2A003F1D2A12B 2550 DATA 003F1F2A4100441041009D3A01236 2560 DATA 002A7A01FC6E7A83A82A7A03D452F 2570 DATA 00F0038000F003C000F0000000416 |