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