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