100 REM Zombie Island 11/9/84 B. & D. Lewis
110 RANDOMIZE TIME:MODE 1:DEFINT a-z 120 PAPER 0:PAPER #2,0:ON BREAK GOSUB 1740 130 DIM screen(24,14),zpos(9,2),xoff(9),yoff(9) 140 WINDOW #1,1,40,16,16:WINDOW #2,1,40,18,25 150 pit=1:human=2:zombie=3:space=4:home=5 160 zom=248:level=3:play=0:flag=0:pass=0:pitch=1 170 man$=CHR$(22)+CHR$(1)+CHR$(253)+CHR$(8)+CHR$(15)+CHR$(1)+CHR$(254)+CHR$(8)+CHR$(15)+CHR$(3)+CHR$(255)+CHR$(22)+CHR$(0) 180 SYMBOL AFTER 253 190 SYMBOL 253,&10,&28,&92,&7C,&10,&28,&28,0 200 SYMBOL 254,0,&10,0,0,&38,0,0,&6C 210 SYMBOL 255,&28,0,&28,0,&44,&D6,&D6,0 220 REM Initialize move & screen arrays 230 RESTORE 1570:FOR n=1 TO 9:READ xoff(n),yoff(n),direction$(n):NEXT n 240 RESTORE:SQ(2) GOSUB 1340 250 GOSUB 1590 260 FOR n=1 TO 24:screen(n,1)=pit:screen(n,14)=pit:NEXT n 270 FOR n=2 TO 13:screen(1,n)=pit:screen(24,n)=pit:NEXT n 280 dummy=REMAIN(0) 290 FOR n=2 TO 23:FOR m=2 TO 13 300 screen(n,m)=space 310 NEXT m,n 320 REM Set up potholes & zombie positions 330 FOR n=1 TO 5+RND*9 340 screen(2+RND*21,2+RND*11)=pit 350 NEXT n 360 FOR znum=1 TO level 370 zpos(znum,1)=2+RND*21 380 zpos(znum,2)=2+RND*11 390 screen(zpos(znum,1),zpos(znum,2))=zombie 400 NEXT znum:znum=level 410 REM Compute landing position 420 x=4+INT(RND*17) 430 y=4+INT(RND*7) 440 IF screen(x,y)<>space THEN 420 450 screen(x,y)=human 460 IF play=0 THEN a$=LOWER$(INKEY$):IF a$<>" " AND a$<>"d" THEN 460 ELSE demo=0:IF a$="d" THEN demo=1 470 CLS:BORDER 0:INK 0,0:INK 1,21:INK 2,20:INK 3,15:play=1:moff=0 480 TAG:FOR n=1 TO 6:m=n+moff:IF n=3 THEN moff=1 490 PLOT 470-n*n,300+(30*demo)-n*n,m:PRINT "ZOMBIES";:NEXT n:TAGOFF 500 IF demo THEN PEN 1:LOCATE 27,10:PRINT "Demo Mode":PEN 3:LOCATE 27,11:PRINT "ESC ESC":PEN 2:LOCATE 27,12:PRINT "to continue" 510 REM Print the state of play 520 FOR n=1 TO 14:FOR m=1 TO 24 530 man=screen(m,n):IF man=space THEN 580 540 PEN man:LOCATE m,n 550 IF man=pit THEN PRINT "O";:GOTO 580 560 IF man=zombie THEN PRINT CHR$(zom);:GOTO 580 570 IF man=human THEN PRINT man$; 580 NEXT m:PRINT :NEXT n 590 IF RND>0.5 THEN n1=1+RND*13:IF RND<0.5 THEN m1=1 ELSE m1=24 ELSE m1=1+RND*23:IF RND<0.5 THEN n1=1 ELSE n1= 14 600 LOCATE m1,n1:PEN human:PRINT "O" 610 screen(m1,n1)=home:dummy=SQ(2) 620 REM I/p move & check position 630 EVERY 30 GOSUB 1700:PEN #1,human:LOCATE #1,1,1:PRINT #1,"Your move ";:CLS #2 640 IF demo THEN a=CINT(1+RND*8):PRINT #1,direction$(a):GOTO 670 650 a$=INKEY$:IF a$<"1" OR a$>"9" THEN 650 ELSE WHILE INKEY$<>"":WEND 660 a=ASC(a$)-48:PRINT #1,direction$(a) 670 screen(x,y)=space:dummy=REMAIN(0) 680 PEN human:LOCATE x,y:PRINT" "; 690 x=x+xoff(a):y=y+yoff(a):GOSUB 1010 700 IF screen(x,y)=home THEN PEN human:PRINT #2,"YOU HAVE ESCAPED TO ANOTHER ISLAND !!":level=level+1:GOSUB 1130:GOTO 890 710 IF screen(x,y)=space THEN screen(x,y)=human:LOCATE x,y:PRINT man$;:GOTO 750 720 IF screen(x,y)=zombie THEN PEN #2,zombie:PRINT #2,"STRAIGHT INTO THE ZOMBIES MOUTH":GOSUB 1250:GOTO 890 730 IF screen(x,y)=pit THEN PEN #2,pit:PRINT #2,"HEAD FIRST INTO THE PIT":GOSUB 1190:GOTO 890 740 REM Move all zombies towards target 750 z2=1 760 zxold=zpos(z2,1):zyold=zpos(z2,2) 770 screen(zxold,zyold)=space:PEN zombie:LOCATE zxold,zyold:PRINT " "; 780 zx=zxold+SGN(x-zxold):zy=zyold+SGN(y-zyold):GOSUB 1050 790 IF screen(zx,zy)=human THEN PEN #2,zombie:PRINT #2,"YOU'RE ZAPPED BY A ZOMBIE":LOCATE zx,zy:PRINT CHR$(zom);:screen(zx,zy)=zombie:zpos(z2,1)=zx:zpos(z2,2)=zy:GOSUB 1250:GOTO 890 800 IF screen(zx,zy)=zombie THEN PEN #2,pit:PRINT #2,"BOINK-----> HERE COME THE ZOMBIES":screen(zxold,zyold)=zombie:LOCATE zxold,zyold:PRINT CHR$(zom);:GOSUB 1090:GOTO 830 810 IF screen(zx,zy)=pit THEN PEN #2,2:PRINT #2,"SPLASH GOES A ZOMBIE":GOSUB 1190:FOR z3=z2 TO znum:zpos(z3,1)=zpos(z3+1,1):zpos(z3,2)=zpos(z3+1,2):NEXT z3:znum=znum-1:GOTO 840 820 IF screen(zx,zy)=space THEN screen(zx,zy)=zombie:zpos(z2,1)=zx:zpos(z2,2)=zy:LOCATE zx,zy:PRINT CHR$(zom); 830 z2=z2+1 840 IF z2<=znum THEN 760 850 REM Are there any more zombies? 860 PEN #1,zombie:LOCATE #1,27,1:PRINT #1,znum;"zombies":IF znum>=1 THEN 630 870 PEN #2,human:PRINT #2:PRINT #2,"WELL DONE --- THE ZOMBIES ARE EXTINCT" 880 PRINT #2,"YOU ESCAPED --- ";:level=level+2:IF level>9 THEN 940 890 PRINT #2,"ANOTHER GAME (y/n) ? ";:level=level-1:IF level<1 THEN level=1 900 EVERY 30 GOSUB 1700:screen(m1,n1)=pit:IF demo THEN a$="yes":GOTO 930 910 IF INKEY$<>"" THEN 910 920 a$=LOWER$(INKEY$):IF a$<>"n" AND a$<>"y" THEN 920 930 IF a$="n" THEN PEN #2,zombie:PRINT #2,"NO";:PEN pit:LOCATE 1,24:END ELSE PEN #2,human:PRINT #2,"YES";:SQ(2) GOSUB 1340:GOTO 280 940 INK zombie,0,26:PAPER #2,1:PEN #2,zombie:PRINT #2:PRINT #2:PRINT #2,"YIPPEE !! YOU'VE KILLED THEM ALL !! "; 950 FOR n=0 TO 26:INK 0,n:BORDER 26-n:SOUND 7,RND*n*99,25,7:NEXT n:PAPER #2,2 960 INK 0,3:BORDER 3:PRINT #2:PRINT #2:PRINT #2,,"GOODBYE (for now !!)" 970 RESTORE:SQ(2) GOSUB 1340 980 GOTO 980 990 REM SOUND SUBROUTINES 1000 REM Human running 1010 steps=ABS((x<9)-2*(x>8 AND x<17)-4*(x>16)) 1020 SOUND steps,200,4,7:SOUND 7,0,2,0 1030 RETURN 1040 REM Zombie running 1050 steps=ABS((zx<9)-2*(zx>8 AND zx<17)-4*(zx>16)) 1060 SOUND steps,700,4,6:SOUND 7,0,2,0 1070 RETURN 1080 REM Boink !! 1090 steps=ABS((zx<9)-2*(zx>8 AND zx<17)-4*(zx>16)) 1100 FOR boink=1 TO 4000 STEP 25:SOUND steps,boink,1,7-boink/1500,0,0,2 1110 NEXT boink 1120 RETURN 1130 REM Escape to next island 1140 FOR n=1000 TO 1 STEP -9 1150 SOUND 1,n,4,(1000-n)/145:SOUND 4,1000-n,4,(1000-n)/145:SOUND 2,RND*999,2,1,0,0,15 1160 NEXT n 1170 RETURN 1180 REM Fall into pit 1190 FOR drop=0 TO 50 STEP 2:SOUND 5,drop*40,10,7-(drop/10) 1200 NEXT drop 1210 FOR splash=800 TO 250 STEP -15 1220 SOUND 5,splash,3,splash/200,0,0,15+splash/50 1230 NEXT splash 1240 RETURN 1250 REM Caught by Zombies 1260 FOR n=7 TO 2 STEP -1:FOR eat=1 TO 4000 STEP 90 1270 SOUND 5,RND*eat,2,n,0,0,7-n 1280 NEXT eat,n 1290 FOR n=7 TO 1 STEP -1:FOR tear=999 TO 1 STEP -30 1300 SOUND 5,tear,1,n,0,0,1 1310 NEXT tear,n 1320 RETURN 1330 REM Real-time music routine 1340 note1=note:READ note 1350 IF note=1 THEN pass=pass+1:IF pass=2 THEN RESTORE 1460:GOTO 1340 1360 IF (flag=1 AND pass=3) THEN pitch=pitch+1:IF pitch>3 THEN pass=0:pitch=1:flag=0:SOUND 7,0,49,0:RESTORE 1450:GOTO 1340 ELSE pass=0:flag=0:RESTORE 1460:GOTO 1340 1370 IF note=2 THEN flag=flag+1:RESTORE 1460:GOTO 1340 1380 IF note<5 THEN 1340 1390 IF note=0 THEN 1420 1400 IF note<>note1 THEN SOUND 7,0,6,0 1410 SOUND 1,note/pitch-1,9,4:SOUND 2,note/pitch,9,5:SOUND 4,note/pitch+1,9,4 1420 SQ(2) GOSUB 1340 1430 RETURN 1440 REM Data for music - PEER GYNT In the hall of the mountain king (1st part) by E. GRIEG 1450 DATA 758,758,758,758,758,758,758,758,758,758,758,758 1460 DATA 1136,1136,1012,1012,956,956,851,851,758,758,956,956,758,758,758,758 1470 DATA 804,804,1012,1012,851,851,851,851,0,851,851,1012,1012,851,851,851,851 1480 DATA 1136,1136,1012,1012,956,956,851,851,758,758,956,956,758,758,568,568 1490 DATA 638,638,758,758,956,956,758,758,638,638,638,638,638,638,638,638 1500 DATA 1 1510 DATA 758,758,676,676,602,602,568,568,506,506,638,638,506,506,506,506 1520 DATA 478,478,602,602,478,478,478,478,506,506,638,638,506,506,506,505 1530 DATA 758,758,676,676,602,602,568,568,506,506,638,638,506,506,506,506 1540 DATA 478,478,602,602,478,478,478,478,506,506,506,506,506,506,506,506 1550 DATA 2 1560 REM Data for numeric keypad 1570 DATA -1,1,"SOUTH-WEST",0,1,"SOUTH ",1,1,"SOUTH-EAST",-1,0,"WEST ",0,0,"STOPPED ",1,0,"EAST ",-1,-1,"NORTH-WEST",0,-1,"NORTH ",1,-1,"NORTH-EAST" 1580 REM Instructions 1590 BORDER 3:INK 0,3:INK 1,26:INK 2,16:INK 3,19 1600 PEN 2:LOCATE 14,1:PRINT "COUNT DRACULA",," ON",,,"ZOMBIE ISLAND" 1610 PEN 1:LOCATE 1,6:PRINT "One foggy night whilst out for a bite, you take a short-cut over Haiti (eat-e) and disaster strikes !!" 1620 PRINT "Your bat hits a passing voodoo shaman & you find yourself on ZOMBIE ISLAND !!" 1630 PRINT "You must lure the hapless creatures intothe bottomless pits scattered about the" 1640 PRINT "Island (they are attracted by your cape,"; 1650 PRINT "and cannot see the pits)." 1660 PEN 3:PRINT :PRINT "To move, use the numeric keypad (1 to 9)as follows :-" 1670 LOCATE 14,18:PRINT "NW N NE":LOCATE 15,20:PRINT "W STILL E":LOCATE 14,22:PRINT "SW S SE" 1680 PEN 2:LOCATE 2,25:PRINT "Press D for demo, or SPACE BAR to play"; 1690 RETURN 1700 PEN zombie:FOR zdance=1 TO znum 1710 zom=248+CINT(RND*3):LOCATE zpos(zdance,1),zpos(zdance,2):PRINT CHR$(zom); 1720 NEXT zdance 1730 RETURN 1740 RUN |