10 REM Helicopter Holocaust 20 REM By Steven Flintham 30 PROCSteven:PROCFlintham 40 PROCSteven_Flintham(255) 50 REPEAT 60 MODE 5:VDU 23;8202;0;0;0; 70 VDU 19,0,4,0,0,0,19,2,6,0,0,0,19,3,0,0,0,0:PROCinfo 80 PROCkeys 90 MODE 5:VDU 23;8202;0;0;0; 100 PROCSteven_Flintham(0):PROCinfo 110 PROCbackground 120 PROCprint_sprite(heli_pos(1),4,19,heli(1)) 130 PROCprint_sprite(heli_pos(2),4,19,heli(2)) 140 REPEAT 150 PROCmove_heli1 160 PROCmove_heli2 170 PROCmove_fire 180 PROCmove_fuel_hel 190 PROCmove_fuel 200 count%=count%-1 210 IF count%=0 THEN FOR heli%=1 TO 2:fuel%(heli%)=fuel%(heli%)-5:NEXT:count%=rcount%:PROCfuel_update 220 IF hcount%>0 THEN hcount%=hcount%-1 230 IF hcount%<=0 OR (FNfuel_short AND hcount%<=0) THEN PROCheli_Flintham 240 UNTIL FNdead(1,TRUE) OR FNdead(2,TRUE) 250 SOUND &10,0,0,0:PROCSteven_Flintham(255) 260 MODE 5:VDU 23;8202;0;0;0; 270 VDU 19,0,4,0,0,0,19,2,6,0,0,0,19,3,0,0,0,0:PROCinfo 280 PROCwinner 290 UNTIL FALSE 300 END 310 DEF PROCenable 320 *FX229,0 330 *FX4,0 340 ENDPROC 350 DEF PROCSteven 360 *FX229,1 370 *FX4,2 380 ENDPROC 390 DEF PROCFlintham 400 ON ERROR MODE 7:REPORT:PRINT " at line ";ERL:PROCenable:END 410 DIM fire%(2),dir%(2),lives%(2),fuel%(2),old_heli(2),heli(2),heli_pos(2),old_heli_pos(2) 420 start%=&70 430 start2%=&72 440 cols%=&74 450 rows%=&76 460 data%=&78 470 flag%=&7F 480 ENDPROC 490 DEF PROCmove_heli1 500 IF FNcollision(heli_pos(1),4,19,heli(1)) THEN PROCdetect(1) 510 move%=FALSE 520 IF INKEY(-67) THEN PROCheli_left(1) 530 IF INKEY(-83) THEN PROCheli_right(1) 540 IF INKEY(-66) THEN PROCheli_up(1) 550 IF INKEY(-98) THEN PROCheli_down(1) 560 IF move% THEN PROCprint_sprite(old_heli_pos(1),4,19,old_heli(1)):PROCprint_sprite(heli_pos(1),4,19,heli(1)):old_heli(1)=heli(1):old_heli_pos(1)=heli_pos(1) 570 IF FNcollision(heli_pos(1),4,19,heli(1)) THEN PROCdetect(1) 580 IF INKEY(-2) THEN PROCfire(1) 590 ENDPROC 600 DEF PROCmove_heli2 610 IF FNcollision(heli_pos(2),4,19,heli(2)) THEN PROCdetect(2) 620 move%=FALSE 630 IF INKEY(-103) THEN PROCheli_left(2) 640 IF INKEY(-104) THEN PROCheli_right(2) 650 IF INKEY(-73) THEN PROCheli_up(2) 660 IF INKEY(-105) THEN PROCheli_down(2) 670 IF move% THEN PROCprint_sprite(old_heli_pos(2),4,19,old_heli(2)):PROCprint_sprite(heli_pos(2),4,19,heli(2)):old_heli(2)=heli(2):old_heli_pos(2)=heli_pos(2) 680 IF FNcollision(heli_pos(2),4,19,heli(2)) THEN PROCdetect(2) 690 IF INKEY(-74) THEN PROCfire(2) 700 ENDPROC 710 DEF PROCprint_sprite(at%,col%,row%,add%) 720 ?start%=at% MOD 256 730 start%?1=at% DIV 256 740 ?cols%=col% 750 ?rows%=row% 760 ?data%=add% MOD 256 770 data%?1=add% DIV 256 780 CALL &4F00 790 ENDPROC 800 DEF FNcollision(at%,col%,row%,add%) 810 ?start%=at% MOD 256 820 start%?1=at% DIV 256 830 ?cols%=col% 840 ?rows%=row% 850 ?data%=add% MOD 256 860 data%?1=add% DIV 256 870 CALL &4F69 880 =(?flag%=255) 890 DEF PROCheli_left(heli%) 900 IF heli%=1 THEN IF heli(1)=&C00 THEN heli(1)=&C50:move%=TRUE:ENDPROC 910 IF heli%=2 THEN IF heli(2)=&CA0 THEN heli(2)=&A00:move%=TRUE:ENDPROC 920 IF (heli_pos(heli%)-&5800) MOD &140>0 THEN heli_pos(heli%)=heli_pos(heli%)-8 930 move%=TRUE 940 ENDPROC 950 DEF PROCheli_right(heli%) 960 IF heli%=1 THEN IF heli(1)=&C50 THEN heli(1)=&C00:move%=TRUE:ENDPROC 970 IF heli%=2 THEN IF heli(2)=&A00 THEN heli(2)=&CA0:move%=TRUE:ENDPROC 980 IF (heli_pos(heli%)-&5920) MOD &140>0 THEN heli_pos(heli%)=heli_pos(heli%)+8 990 move%=TRUE 1000 ENDPROC 1010 DEF PROCheli_up(heli%) 1020 IF (heli_pos(heli%)-&5800)>=(&140*6) THEN heli_pos(heli%)=heli_pos(heli%)-&140 1030 move%=TRUE 1040 fuel%(heli%)=fuel%(heli%)-2 1050 PROCfuel_update 1060 ENDPROC 1070 DEF PROCheli_down(heli%) 1080 IF (heli_pos(heli%)-&5800)<&2440 THEN heli_pos(heli%)=heli_pos(heli%)+&140 1090 move%=TRUE 1100 ENDPROC 1110 DEF PROCSteven_Flintham(heli%) 1120 fheli%=0:hcount%=300:shcount%=hcount% 1130 efuel%=0:fuelc%=3:mfuelc%=fuelc% 1140 fire%(1)=0:fire%(2)=0 1150 fuel%(1)=496:fuel%(2)=496:mfuel%=fuel%(1) 1160 lives%(1)=3:lives%(2)=3 1170 count%=10:rcount%=count% 1180 VDU 19,2,6,0,0,0,19,0,4,0,0,0 1190 VDU 19,3,0,0,0,0 1200 PROClife_Flintham(heli%) 1210 ENDPROC 1220 DEF PROClife_Flintham(heli%) 1230 IF heli%=2 THEN GOTO 1260 1240 old_heli(1)=&C00:heli(1)=&C00 1250 heli_pos(1)=&6100:old_heli_pos(1)=&6100 1260 IF heli%=1 THEN GOTO 1290 1270 old_heli(2)=&A00:heli(2)=&A00 1280 heli_pos(2)=&61A0:old_heli_pos(2)=&61A0 1290 IF heli%<>255 THEN SOUND &10,0,0,0:SOUND 0,-15,3,255 1300 ENDPROC 1310 DEF FNdead(heli%,crash%) 1320 IF lives%(heli%)<=0 THEN =TRUE 1330 IF fuel%(heli%)>0 THEN =FALSE 1340 IF NOT crash% THEN =TRUE 1350 PROCcrash(heli%) 1360 =TRUE 1370 DEF PROCinfo 1380 GCOL 0,3:MOVE 0,896:DRAW 1280,896 1390 MOVE 640,896:DRAW 640,1024 1400 PROCprint_sprite(&5800,4,19,&C00) 1410 PROCfuel_update 1420 PRINTTAB(2,0);"Lives:";lives%(1) 1430 PROCprint_sprite(&5920,4,19,&A00) 1440 PRINTTAB(11,0);"Lives:";lives%(2) 1450 ENDPROC 1460 DEF PROCfuel_update 1470 PRINTTAB(2,1);"Fuel:";FNbar(1) 1480 PRINTTAB(11,1);"Fuel:";FNbar(2) 1490 ENDPROC 1500 =num$ 1510 DEF FNbar(heli%) 1520 IF fuel%(heli%)>mfuel% THEN fuel%(heli%)=mfuel% 1530 GCOL 0,2 1540 IF heli%=1 THEN sx%=132 ELSE sx%=708 1550 MOVE sx%+((436/mfuel%)*fuel%(heli%)),928:PLOT 0,(((436/mfuel%)*500)-((436/mfuel%)*fuel%(heli%))),0:PLOT 81,0,28:PLOT 0,-(((436/mfuel%)*500)-((436/mfuel%)*fuel%(heli%))),0:PLOT 81,0,-28 1560 GCOL 0,1 1570 MOVE sx%,928:PLOT 0,(436/mfuel%)*fuel%(heli%),0:PLOT 81,0,28:PLOT 0,-((436/mfuel%)*fuel%(heli%)),0:PLOT 81,0,-28 1580 GCOL 0,3 1590 =CHR$(0) 1600 DEF PROCfire(heli%) 1610 IF fire%(heli%)<>0 THEN ENDPROC 1620 IF heli(heli%)=&C50 OR heli(heli%)=&A00 THEN IF (heli_pos(heli%)-&5800) MOD &140<40 THEN ENDPROC 1630 IF heli(heli%)=&C00 OR heli(heli%)=&CA0 THEN IF ((heli_pos(heli%)-&5920) MOD &140)>280 THEN ENDPROC 1640 SOUND &10,0,0,0:SOUND 0,1,52,255 1650 IF heli(heli%)=&C00 OR heli(heli%)=&CA0 THEN dir%(heli%)=32 ELSE dir%(heli%)=-32 1660 fire%(heli%)=heli_pos(heli%)+dir%(heli%) 1670 PROCprint_sprite(fire%(heli%)+&140,4,2,&A50) 1680 fuel%(heli%)=fuel%(heli%)-5 1690 PROCfuel_update 1700 ENDPROC 1710 DEF PROCmove_fire 1720 FOR heli%=1 TO 2 1730 IF fire%(heli%)<>0 THEN PROCm_fire(heli%) 1740 NEXT 1750 ENDPROC 1760 DEF PROCm_fire(heli%) 1770 PROCprint_sprite(fire%(heli%)+&140,4,2,&A50) 1780 fire%(heli%)=fire%(heli%)+(dir%(heli%)/4) 1790 IF (fire%(heli%)-&5800+&140) MOD &140=0 THEN fire%(heli%)=0:SOUND &10,0,0,0:PROCnoise(heli%):ENDPROC 1800 IF (fire%(heli%)-&5920+&140) MOD &140=0 THEN fire%(heli%)=0:SOUND &10,0,0,0:PROCnoise(heli%):ENDPROC 1810 PROCprint_sprite(fire%(heli%)+&140,4,2,&A50) 1820 ENDPROC 1830 DEF PROCnoise(heli%) 1840 IF heli%=1 THEN other%=2 ELSE other%=1 1850 IF fire%(other%)=0 THEN SOUND 0,-15,3,255 ELSE SOUND 0,1,52,255 1860 ENDPROC 1870 DEF PROClose_life(heli%) 1880 lives%(heli%)=lives%(heli%)-1 1890 kill%=heli% 1900 IF heli%=1 THEN PRINTTAB(2,0); ELSE PRINTTAB(11,0); 1910 1920 IF lives%(heli%)>=0 THEN PRINT "Lives:";STR$(lives%(heli%)) 1930 FOR heli%=1 TO 2 1940 IF heli%=kill% THEN PROCexplode(heli%) 1950 PROCprint_sprite(heli_pos(heli%),4,19,heli(heli%)) 1960 IF fire%(heli%)<>0 THEN PROCprint_sprite(fire%(heli%)+&140,4,2,&A50):fire%(heli%)=0 1970 PROClife_Flintham(heli%) 1980 PROCprint_sprite(heli_pos(heli%),4,19,heli(heli%)) 1990 NEXT 2000 IF fheli%<>0 THEN PROCprint_sprite(fheli%,4,19,&5000):fheli%=0 2010 IF efuel%<>0 THEN PROCprint_sprite(efuel%,4,12,&AA0):efuel%=0:drop%=0 2020 ENDPROC 2030 DEF PROCdetect(heli%) 2040 temp%=heli_pos(heli%) 2050 IF heli%=1 THEN other%=2 ELSE other%=1 2060 hit%=FALSE 2070 FOR x%=-48 TO 48 STEP 8 2080 FOR y%=-(&140*3) TO &140*3 STEP &140 2090 IF heli_pos(other%)=temp%+x%+y% THEN PROClose_life(heli%):x%=999999:y%=999999:hit%=TRUE 2100 IF fire%(other%)=temp%+x%+y% THEN PROCprint_sprite(fire%(other%)+&140,4,2,&A50):fire%(other%)=0:SOUND &10,0,0,0:SOUND 0,-15,3,255:PROClose_life(heli%):x%=999999:y%=999999:hit%=TRUE 2110 IF efuel%=temp%+x%+y% THEN SOUND &10,0,0,0:SOUND &11,0,0,0:SOUND 1,1,52,255:PROCprint_sprite(efuel%,4,12,&AA0):efuel%=0:drop%=0:fuel%(heli%)=fuel%(heli%)+200:PROCfuel_update:hit%=TRUE:SOUND &11,0,0,0:SOUND &10,0,0,0:PROCsound(heli%) 2120 NEXT 2130 NEXT 2140 IF NOT hit% THEN PROClose_life(heli%):x%=999999:y%=999999 2150 ENDPROC 2160 DEF PROCsound(heli%) 2170 IF heli%=1 THEN other%=2 ELSE other%=1 2180 IF fire%(other%)=0 AND fire%(heli%)=0 THEN SOUND 0,-15,3,255 ELSE SOUND 0,1,52,255 2190 ENDPROC 2200 DEF PROCbackground 2210 x%=0:y%=200:MOVE x%,y%:REPEAT 2220 x%=x%+RND(50) 2230 y%=y%+(RND(100)-50) 2240 IF y%<100 THEN y%=100 2250 IF y%>500 THEN y%=500 2260 DRAW x%,y% 2270 UNTIL x%>=1280 2280 ENDPROC 2290 DEF PROCexplode(heli%) 2300 SOUND &10,0,0,0:SOUND 0,-15,4,255 2310 explode%=RND(30000)+32768 2320 rep%=30+RND(20) 2330 FOR repeat%=1 TO rep% 2340 PROCprint_sprite(heli_pos(heli%),4,19,explode%) 2350 explode%=explode%+1 2360 NEXT 2370 FOR repeat%=rep% TO 1 STEP -1 2380 explode%=explode%-1 2390 PROCprint_sprite(heli_pos(heli%),4,19,explode%) 2400 NEXT 2410 SOUND &10,0,0,0:SOUND 0,-15,3,255 2420 ENDPROC 2430 DEF PROCcrash(heli%) 2440 REPEAT 2450 PROCprint_sprite(heli_pos(heli%),4,19,heli(heli%)) 2460 heli_pos(heli%)=heli_pos(heli%)+&140 2470 PROCprint_sprite(heli_pos(heli%),4,19,heli(heli%)) 2480 UNTIL FNcollision(heli_pos(heli%),4,19,heli(heli%)) 2490 PROCdetect(heli%) 2500 ENDPROC 2510 DEF FNfuel_short 2520 IF fuel%(1)>100 AND fuel%(2)>100 THEN =FALSE 2530 IF fuel%(1)>=50 AND fuel%(1)<=100 THEN IF hcount%>100 THEN hcount%=100 2540 IF fuel%(2)>=50 AND fuel%(2)<=100 THEN IF hcount%>100 THEN hcount%=100 2550 IF fuel%(1)<50 OR fuel%(2)<50 THEN IF hcount%>50 THEN hcount%=50 2560 =TRUE 2570 DEF PROCheli_Flintham 2580 IF fheli%<>0 THEN ENDPROC 2590 fheli%=&5D00 2600 drop%=RND(37)+1 2610 PROCprint_sprite(fheli%,4,19,&5000) 2620 ENDPROC 2630 DEF PROCmove_fuel_hel 2640 IF fheli%=0 THEN ENDPROC 2650 hcount%=shcount% 2660 PROCprint_sprite(fheli%,4,19,&5000) 2670 IF fheli%>=&5E20 THEN fheli%=0:hcount%=shcount%:ENDPROC 2680 fheli%=fheli%+8 2690 PROCprint_sprite(fheli%,4,19,&5000) 2700 IF (fheli%-&5D00)/8=drop% THEN efuel%=fheli%+&3C0:PROCprint_sprite(efuel%,4,12,&AA0) 2710 ENDPROC 2720 DEF PROCmove_fuel 2730 IF efuel%=0 THEN ENDPROC 2740 fuelc%=fuelc%-1 2750 IF fuelc%>0 THEN ENDPROC 2760 IF fuelc%=0 THEN fuelc%=mfuelc% 2770 PROCprint_sprite(efuel%,4,12,&AA0) 2780 efuel%=efuel%+&140 2790 IF efuel%>=&8000 THEN efuel%=0:drop%=0:ENDPROC 2800 PROCprint_sprite(efuel%,4,12,&AA0) 2810 ENDPROC 2820 DEF PROCkeys 2830 PROCprint_sprite(&6730,4,19,&C00) 2840 PRINTTAB(5,5);"HELICOPTER" 2850 VDU 5 2860 MOVE 352,831:PRINT "HOLOCAUST" 2870 MOVE 224,687:PRINT "A" 2880 MOVE 224,543:PRINT "Z" 2890 MOVE 96,607:PRINT "X" 2900 MOVE 352,607:PRINT "C" 2910 MOVE 128,479:PRINT "CTRL" 2920 MOVE 32,447:PRINT "to fire" 2930 PROCprint_sprite(&67F0,4,19,&A00) 2940 MOVE 992,687:PRINT "*" 2950 MOVE 992,543:PRINT "?" 2960 MOVE 864,607:PRINT "<" 2970 MOVE 1120,607:PRINT ">" 2980 MOVE 832,479:PRINT "RETURN" 2990 MOVE 800,447:PRINT "to fire" 3000 MOVE 288,63:PRINT "Press SPACE" 3010 VDU 4:*FX15,0 3020 REPEAT UNTIL GET=32 3030 ENDPROC 3040 DEF PROCSteven_Flintham 3050 VDU 5:MOVE 352,64:PRINT "Game Over":VDU 4 3060 time%=TIME 3070 REPEAT UNTIL TIME-time%>=1000 3080 ENDPROC 3090 DEF PROCwinner 3100 PRINTTAB(0,10);"The winner is player" 3110 VDU 5:MOVE 608,671 3120 IF FNdead(1,FALSE) THEN PRINT "2" ELSE PRINT "1" 3130 VDU 4 3140 IF FNdead(1,FALSE) THEN heli%=&A00 ELSE heli%=&C00 3150 PROCprint_sprite(&68D0,4,19,heli%) 3160 VDU 5:MOVE 288,63:PRINT "Press SPACE":VDU 4 3170 *FX15,0 3180 REPEAT UNTIL GET=32 3190 ENDPROC