Safari Sam

Safari Sam is a platform game I developed for the Sam Coupé, sometime in 1994 — I didn’t have the optional system clock for the Coupé so there are no timestamps on all except one file, but the copyright message says a year earlier — The game is a standard platformer where you control ‘Sam’ as he makes his way home through the tropics after an untimely plane crash. It was built using the Sam Coupé Arcade Development System (SCADS) and written in Basic with the SCADS extensions.

The following files are available for Safari Sam —

If you don’t have an actual Sam Coupé you can download Sim Coupé.

Disk Image

Story

The story of Safari Sam. I can’t remember whether it was deliberately awful.

Sam woke at about 12 o’clock, he was supposed to be going to the Bermudas for his holidays and so he got himself packed and set off in the general direction of the airport.

After taking a few ‘short-cuts’ and arriving 3 hours late he expected to be prodded away and be made to buy a new ticket. But as he walked into the terminal he heard over the intercom that his plane was just arriving, and was late due to engine trouble.

He was rushed through the security gates and then put on the plane. As far as luxury goes this plane wasn’t what you’d call very good, but it flew, for a while anyway.

Last Chance Airlines’ had always had a bad reputation but Sam being the sort of trusting (stupid) person he was decided he would put his life in their hands.

The engine roared and rattled into action then cut out with a bang. A few hours passed and then the engine started going again.

Sam was sat next to a small child of about three who insisted on showing Sam his dead beetle collection, but they were all the same which made it that bit more depressing.

As they flew over the sea the child started to count the waves and insisted that Sam should help…

….10232…..10233…” the counting went on, and on, and on, until the child went to sleep. Sam took to reading the In-Flight magazine…

Arts, Crafts, Explosives’ was the rather ingenious title….Inside were things that had been designed to tranquilise any scared people who were on their first flight, using a special technique known as boredom..

…Then came the bang, the engine stopped and the plane began to slow down, then stop, then fall extremely fast towards the floor.

The floor grew closer and closer and closer and then the small child woke up..Totally oblivious to what was happening he started to count the trees that they were about hit..

Sam being a rational person began to scream, clutch his head, and beg for mercy and things…

Then as the plane his the first bunch of trees the plane disintigrated and Sam was left there falling in his chair…

Crunch! Sam (and his chair) hit a branch, the chair continued plummeting downwards while Sam sort of sprung up & down & up & down constantly…

Sam then began to fall towards the floor and he hit it with a whimpering sound that sounded sort of like “Awooouhahooow”.

When Sam came round it was night time, he knew his time had come, his time to fight for justice to lay down his life to save those of others, to find a gun…

Aha” he said as a gun materialised in a sort of Star-Trekky manner.

He took the gun and set off on his Journey Home.

The story has no bearing on any of the gameplay, except for the enemies that you face on the way — which include monkeys, parrots, tribesmen and hunters. Being an ecological fellow, you lose points if you kill any animals. The instructions are reproduced from the game below, and are also available from the main menu.

Instructions

Controls

To have even the slightest chance of completing this game you should know the following things. As you know you can set the keys from the Options menu, but also at any point in the game you can also change your keys:

  • F1 - Joystick 1
  • F2 - Cursors, SYMBOL
  • F3 - Joystick 2
  • F4 - Q,A,O,P, SPACE

Also during the game pressing F0 will display the Quick-Guide help which shows:

  • Points Scored for killing things.
  • The damage taken from certain objects.
  • The key changing F keys.

How to die

There are 2 ways to die:

  • Running out of energy. As soon as your energy level reaches 0 you will die.
  • Falling Off The Bottom Of the Screen. By doing this you will die instantly.

In both cases you will return to the first level of the game.

Completing the Game

When you finish the 3rd level you will have completed the game, you may get a chance to enter your name in the scoreboard and the you will restart on level one at a higher difficulty setting.

Sam has a great deal of respect and stuff to animals and so if you kill one you will lose points. Shooting your food is alright - It cannot be destroyed. On each level there is a key that needs to be collected to exit the level. If you miss it you will have to go all the way back to get it.



Walkthrough

The game starts with a short credit roll mostly featuring me. There are also credits for Derek Morgan, who ran the Sam Public Domain Library, and came up with the concept for the game; and Rik Moore who wrote the music. The software is released under “Metropolis Software” which was the name I was giving myself back in 1994.

The main menu follows the credit roll, which offers options to Start Game or change Options. The game options allow sound and music to be turned on/off, controls to be changed (4 alternatives) and the difficulty to be set (changing the damage done by enemies). The instructions, credits and story are all reproduced in this page.

Main Menu Main Menu

The pre-game splash screen, showing Sam in a suit perched on a branch. These screens were generated using freely available clipart (probably from an early version of Microsoft Works), with adjusted colours and addition of the background/text. I’m not sure what this clipart would be used for other than a game about a businessman in the jungle.

Level 1 Splash

The gameplay involves moving right while shooting things. Ammo is limited and must be collected through the game and there is health to pick up in the form of pizza and cupcakes. There is also some kind of diamond that gets you extra points.

Level 1 Screen 1

All the other characters in the game are trying to kill you, and you can kill them by shooting them. However, shooting animals is not nice and you lose points.

Level 1 Screen 2

Rolling barrels and cupcakes. I’ve never been on safari.

Level 1 Screen 3

Reaching the end of level with the key turns the flag green and completes the level. Here I’ve not picked up the key (the zero in the top right), not sure if that’s a bug.

Level 1 Screen Final Level 1 Complete

Unfortunately, a bug in the version I was able to recover makes loading of level 2 fail. After some fiddling — and head scratching trying to remember Sam BASIC — I got it going.

Level 2 Splash

But not quite. The following screenshot is supposed to be from the beginning of level 2, but shows the level 1 platform placement. The sprites are landing in the right place, and then falling to the bottom of the screen. Something to debug on a rainy day.

Level 2 Broken

The complete set of splash screens are shown below. The PNG files were extracted as screenshots from running within Sim Coupé, as I’ve not found a reliable way to convert the images directly from the original files.

Level 1 StartLevel 1 CompleteLevel 2 Start Level 2 CompleteLevel 3 StartLevel 3 Complete New High ScoreCompleteGame Over

Code

The source for the game is shown below, as extracted from the disk — LLIST to file, using Sim Coupé. The code requires the SCADS system files and the game data files to actually run. Note that SCADS extensions to BASIC are shown with a tilde (~) in front of the keyword.

autoSAM

    1>POKE SVAR 321,1: DPOKE SVAR 224,0
   10 OPEN TO 6: CLEAR 98304
   20 CLEAR : MERGE "vars": MERGE "mvars": LOAD "font" CODE UDG " "
   30 SCREEN 1: MODE 4: CLS :palblack: CSIZE 8,10: LET yos=0,xrg=256: FOR a=2 TO
       15: CLOSE SCREEN a: NEXT a
   40 OPEN SCREEN 2,4:palblack
   50 SCREEN 2: DISPLAY 2
   60 LOAD "menu" CODE 114688
   65 LOAD "story" CODE 179000
   66 LOAD "credits" CODE 155000
   67 LOAD "help" CODE 173000
   70 setup_int
   80 LOAD "musik"CODE 16384*(PAGE+1): POKE &5100+PAGE,32
   90 REM ****GRAFIX SETUP****
  100 RESTORE 
  110 DIM col(30)
  120 FOR a=1 TO 30
  130 READ col(a)
  140 NEXT a
  150 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,12,12,64,66,72,68,74,70,76,79,116,1
      24,127
  160 DIM cu(7)
  170 FOR a=1 TO 7
  180 READ cu(a)
  190 NEXT a
  200 DATA 13,11,9,7,5,3,1
  210 SCREEN 1: DISPLAY : CLS :palblack:muson
  220 PUT 0,100,met$:fade 1: PAUSE 50:fade 2
  230 PUT 0,100,pre$:fade 1: PAUSE 50:fade 2
  240 PUT 0,100,aga$:fade 1: PAUSE 50:fade 2
  250 PUT 0,100,des$:fade 1: PAUSE 50:fade 2
  260 PUT 0,100,gra$:fade 1: PAUSE 50:fade 2
  270 PUT 0,100,mus$:fade 1: PAUSE 50:fade 2
  280 LET sfx=1,diff=10,con=4
  290 LET mb$="": GRAB mb$,60,130,90,132: GRAB bitb$,160,170,20,8
  295 CALL 114688:palblack
  300 PUT 84,84,main$:fadem 1
  310 REM ***MENU***
  320 DEF PROC pointie sel,my,xpp,ms,mms,st
  330 LET osel=sel
  340 LET d$=""
  350 PUT xpp,my,poin$: REM fadem 1
  360 DO 
  370 LET ke=CODE INKEY$
  380 IF ke=11 OR ke=113 THEN LET sel=sel-1
  390 IF ke=10 OR ke=97 THEN LET sel=sel+1
  400 IF sel=mms-1 THEN LET sel=mms
  410 IF sel=ms+1 THEN LET sel=ms
  420 IF sel<osel THEN FOR a=0 TO st : PUT xpp,my+a,poin$: NEXT a: LET my=my+st
  430 IF sel>osel THEN FOR a=0 TO st: PUT xpp,my-a,poin$: NEXT a: LET my=my-st
  440 LET osel=sel
  450 LOOP UNTIL ke=32 OR ke=13
  460 LET select=sel
  470 END PROC 
  480 pointie 1,84,60,2,1,18
  490 IF select=1 THEN fadem 2:musoff: POKE 458753,sfx: POKE 458752,diff: POKE 4
      58754,con: POKE 20748,0: FOR a=1 TO 4: POKE 458747+a,0: NEXT a: LOAD "load
      er"
  500 fadem 2,0
  510 PUT 60,124,mb$: PUT 150,124,mb$: PUT 10,124,mb$
  520 PUT 84,124,opt$
  530 fadem 1
  540 pointie 1,126,60,7,1,19
  550 fadem 2,0: PUT 60,124,mb$: PUT 140,124,mb$
  560 LET dch=0
  570 IF select=7 THEN GO TO 300
  580 IF select=1 THEN PUT 110,90,yno$:fadem 1:pointie sfx,108-(18*sfx),90,2,1,1
      8: LET sfx=select: GO TO 500
  585 IF select=3 THEN PUT 80,100,cont$:fadem 1:pointie con,119-(19*con),58,4,1,
      19: LET con=select: GO TO 500
  586 IF select=6 THEN PEN 14: FOR x=0 TO 12: FOR c=1 TO 10: LET z=(x*10)+c: PRI
      NT AT c+5,3;MEM$(179000+(z*64) TO 179025+(z*64)): NEXT c:fadem 1: PAUSE :f
      adem 2,0: NEXT x: GO TO 505
  587 IF select=5 THEN PEN 14: FOR x=0 TO 7: FOR c=1 TO 11: LET z=(x*11)+c: PRIN
      T AT c+5,3;MEM$(155000+(z*64) TO 155025+(z*64)): NEXT c:fadem 1: PAUSE :fa
      dem 2,0: NEXT x: GO TO 505
  588 IF select=4 THEN PEN 14: FOR x=0 TO 7: FOR c=1 TO 10: LET z=(x*10)+c: PRIN
      T AT c+5,3;MEM$(173000+(z*64) TO 173025+(z*64)): NEXT c:fadem 1: PAUSE :fa
      dem 2,0: NEXT x: GO TO 505
  590 IF select=2 THEN LET d=diff: PUT 110,124,high$: PUT 110,24,low$:fadem 1: F
      OR a=1 TO diff: PUT 125,29+(a*7),bit$: NEXT a:pointie 11-diff,36+(7*diff),
      90,10,1,7: LET diff=11-select,dch=1
  600 IF dch=0 THEN GO TO 603
  601 IF d<diff THEN FOR a=d TO diff: PUT 125,29+(a*7),bit$: PAUSE 1: NEXT a
  602 IF d>diff THEN FOR a=d TO diff+1 STEP -1: PUT 125,29+(a*7),bitb$: PAUSE 1:
       NEXT a
  610 GO TO 500
  620 REM ****FADE ROUTINE****
  630 DEF PROC fade f
  640 DEFAULT s=1
  650 IF f=1 THEN FOR a=1 TO 15 STEP 2
  660 IF f=2 THEN FOR a=15 TO 1 STEP -2
  670 FOR b=7 TO 1 STEP -1
  680 LET c=cu(b)
  690 PALETTE c,col(a+c)
  700 NEXT b
  710 NEXT a
  720 IF f=2 THEN palblack: CLS 
  730 END PROC 
  740 REM ****PALBLACK****
  750 DEF PROC palblack: FOR a=1 TO 15: PALETTE a,0,0: NEXT a: END PROC 
  760 DEF PROC fadem f,s
  770 DEFAULT s=1
  780 IF f=1 THEN FOR a=1 TO 15 STEP 2
  790 IF f=2 THEN FOR a=15 TO 1 STEP -2
  800 FOR b=15 TO 0 STEP -1
  810 PALETTE b,col(a+b)
  820 NEXT b
  830 NEXT a
  840 IF f=2 THEN palblack: IF s=1 THEN CLS 
  850 END PROC 
  860 DEF PROC Muson: CALL 16384: END PROC 
  870 DEF PROC Musoff: CALL 16386: END PROC 
  880 DEF PROC Setup_Int page,addr
  890 REM Interrupt E-Tune driver from Bunj Wobl (Fred 33)
  900 DEFAULT page=12,addr=16384
  910 REM Page for E-Tune, address for driver code
  920 RESTORE int_code
  930 DO : READ a: EXIT IF a<0
  940 POKE addr,A: LET addr=addr+1: LOOP 
  950 LABEL int_code: DATA 195,6,64,195,32,64,243,42,112,91
  960 DATA 34,34,64,33,52,64,34,112,91,62
  970 DATA PAGE,211,251,205,0,128,62,1,211,251
  980 DATA 251,201,243,33,0,0,34,112,91,62
  990 DATA PAGE,211,251,205,0,128,62,1,211,251
 1000 DATA 251,201,203,89,40,3,195,73,0,197
 1010 DATA 213,221,229,253,229,8,217,245,197,213
 1020 DATA 229,205,89,64,225,209,193,241,8,217
 1030 DATA 253,225,221,225,209,193,195,73,0,219
 1040 DATA 251,50,109,64,237,115,113,64,49,0
 1050 DATA 192,62,PAGE,211,251,205,6,128,62,0
 1060 DATA 211,251,49,0,0,201,-1
 1070 END PROC 
 1080 DEF PROC palblack: FOR l1=0 TO 15: PALETTE l1,0,0: NEXT l1: BEEP .0001,0: 
      END PROC 
 1090 DEF PROC fadet d
 1100 IF d=1 THEN FOR a=1 TO 15
 1105 IF d=2 THEN FOR a=15 TO 1 STEP -1
 1110 PALETTE 3,col(a+15)
 1111 PAUSE 2
 1120 NEXT a
 1130 END PROC

loader

   10 REM BASIC INTERPRETOR,  GLENCO SOFTWARE 1992
   20 SCREEN 1: FOR a=2 TO 15: CLOSE SCREEN a: NEXT a
   30 CLEAR 65535: OPEN TO 3: LET MCODE=&14000: LET SCR2=&23000: MODE 4: DEF KEY
      CODE 193,"MODE 3:CLS#": DEF KEYCODE 192,"~:": LET A=UDG "~": FOR I=A TO A+
      7: READ B: POKE I,B: NEXT I: DATA 62,62,62,62,62,62,62,0: IF PEEK (&511F)=
      192 THEN GO TO MEM512: ELSE GO TO MEM256
   40 LABEL MEM512
   50 LET FLAG=0: LET SCR1=&83000: LET ms=30: FOR I=&5103 TO &511C: IF PEEK (I)<
      >0 THEN LET FLAG=99
   60 NEXT I: FOR I=&5108 TO &511C: POKE I,&F0: NEXT I: GO TO NEXT_PART
   70 LABEL MEM256
   80 LET FLAG=0: LET SCR1=&43000: LET ms=14: FOR I=&5103 TO &510C: IF PEEK (I)<
      >0 THEN LET FLAG=99
   90 NEXT I: IF FLAG=99 THEN GO TO MEM_ERROR: ELSE FOR I=&5108 TO &510C: POKE I
      ,&F0: NEXT I: GO TO NEXT_PART
  100 LABEL MEM_ERROR
  110 PRINT "NOT ENOUGH FREE MEMORY": STOP 
  120 LABEL NEXT_PART
  130 OPEN SCREEN 2,4: POKE &5103,&F0,&F0,&F0: PEN 1: CSIZE 8,16: PRINT AT 9,4;"
      Supervisor Version 1.00": CSIZE 8,8: LOAD "SCAD.S1" CODE MCODE: POKE MCODE
      +3,MS: LOAD "SCAD.S2" CODE SCR1: LOAD "SCAD.S2" CODE SCR2: CALL MCODE
  140 ~INIT
  150 LOAD "level1"

level1

   10 GO TO 30
   20 ~FILE "draw2"
   30 ~INIT
   40 palBLACK: PAUSE 2:~PANEL "s8"
   50 fade 1
   60 LET control=PEEK 458754
   70 LET sfx=PEEK 458753
   80 LET diff=10-(PEEK 458752)
   90 LET x=14,y=113,rm=0,rom=rm+1,hit=0,energy=100,ammo=50,miss=0,keys=0
  100 LET score$="0000"
  110 FOR a=1 TO 4: LET score$(a)=STR$ PEEK (458747+a): NEXT a
  120 LET score=VAL score$
  130 RESTORE 280
  140 DIM roomst(9)
  150 DIM deadp(50)
  160 FOR a=1 TO 5: LET deadp(a)=-25: NEXT a
  170 FOR a=6 TO 10: LET deadp(a)=10: NEXT a
  180 FOR a=11 TO 15: LET deadp(a)=25: NEXT a
  190 FOR a=16 TO 20: LET deadp(a)=-15: NEXT a
  200 FOR a=21 TO 25: LET deadp(a)=10: NEXT a
  210 FOR a=26 TO 30: LET deadp(a)=10: NEXT a
  220 FOR a=31 TO 32: LET deadp(a)=5: NEXT a
  230 LET deadp(33)=100
  240 FOR a=34 TO 37: LET deadp(a)=5: NEXT a
  250 FOR a=1 TO 9
  260 READ roomst(a)
  270 NEXT a
  280 DATA rm0,rm1,rm2,rm3,rm4,rm5,rm6,rm7,rm8
  290 DIM dead(50,9): FOR a=1 TO 50: FOR b=1 TO 9: LET dead(a,b)=5: NEXT b: NEXT
       a
  300 ~LINK 0,0:~ANIMATE 0,1:~SETINP 0,control,2,0,68,"11122310":~FEET 0,2,2
  310 FOR a=1 TO 5:~LINK a,9:~ANIMATE a,4:~DROP a,0,1: NEXT a
  320 FOR a=6 TO 10:~LINK a,28:~ANIMATE a,2:~DROP a,0,1: NEXT a
  330 IF sfx=1 THEN FOR a=6 TO 10:~AUTOSOUND a,0,12: NEXT a
  340 FOR a=11 TO 15:~LINK a,56:~ANIMATE a,3:~DROP a,0,1: NEXT a
  350 IF sfx=1 THEN FOR a=11 TO 15:~AUTOSOUND a,0,13: NEXT a
  360 FOR a=16 TO 20:~LINK a,37:~ANIMATE a,5: NEXT a
  370 FOR a=21 TO 25:~LINK a,79:~ANIMATE a,10:~DROP a,0,1:~YEDGE a,3,3: NEXT a
  380 FOR a=26 TO 29:~LINK a,135+(a-26): NEXT a
  390 ~LINK 30,159:~ANIMATE 30,14
  400 FOR a=31 TO 37:~LINK a,249+(a-31): NEXT a
  410 FOR a=38 TO 40:~LINK a,126: NEXT a
  420 FOR a=42 TO 45:~LINK a,23:~PLATFORM a: NEXT a
  430 ~LINK 41,84:~ANIMATE 41,6
  440 ~LINK 46,84:~ANIMATE 46,6
  450 ~LINK 47,89:~ANIMATE 47,7
  460 ~LINK 48,98:~ANIMATE 48,8
  470 ~LINK 49,103:~ANIMATE 49,9
  480 IF sfx=2 THEN GO TO 520
  490 ~AUTOSOUND 0,0,13
  500 ~AUTOSOUND 0,3,10
  510 ~AUTOSOUND 0,2,9
  520 ~MISSRANGE 50,63
  530 ~MISSILE 0,255,5,50,63,128,254,62:~AMMO 0,ammo
  540 FOR a=1 TO 5:~MISSILE a,255,2*diff,50,63,128,254,63:~AMMO a,255: NEXT a
  550 FOR a=6 TO 10:~MISSILE a,255,2*diff,50,63,128,254,62:~AMMO a,255: NEXT a
  560 FOR a=11 TO 15:~MISSILE a,255,2*diff,50,63,128,254,62:~AMMO a,255: NEXT a
  570 FOR a=16 TO 20:~MISSILE a,255,2*diff,50,63,128,254,64:~AMMO a,255: NEXT a
  580 LET spr=0
  590 IF sfx=1 THEN ~MISSOUND 15
  600 fade 2
  610 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
  620 GO SUB room:~VIEW
  630 ~COLOUR
  640 LABEL start
  650 DO 
  660 FOR outl=1 TO 25
  670 LET i=CODE INKEY$: IF i>192 AND i<197 THEN LET control=i-192:~SETINP 0,con
      trol,2,0,255,"11122310":SCOM 5
  680 IF i=192 THEN GO TO help
  690 REM [Level 2]~FIRE 1+RND(24)
  700 ~MOVEALL:~VIEW
  710 REM [Level 2]~FIRE 1+RND(24)
  720 ~HIT 0,LENGTH(0,hit): IF hit>0 THEN ~NEXTHIT LENGTH(0,hit): GO SUB hitit
  730 ~MISSHIT LENGTH(0,miss): IF miss<>255 THEN GO SUB misshit
  740 ~RAMMO 0,LENGTH(0,ammo):~PNUMA 88,168,3,48,ammo
  750 FOR spdup=1 TO 2
  760 ~MISSHIT LENGTH(0,miss): IF miss<>255 THEN GO SUB misshit
  770 ~MOVEALL:~VIEW
  780 REM [Level 1]~FIRE 1+RND(24)
  790 ~FIRE 1+RND(24)
  800 ~FIRE 1+RND(24)
  810 ~SXPOS 0,LENGTH(0,x)
  820 ~SYPOS 0,LENGTH(0,y)
  830 IF y=17 THEN ugh
  840 IF rm=0 THEN GO TO 870
  850 IF x<4 THEN LET x=236 THEN LET rm=rm-1,rom=rom-1: GO SUB room
  860 IF rm=11 THEN GO TO 880
  870 IF x>236 THEN LET x=4 THEN LET rm=rm+1,rom=rom+1: GO SUB room
  880 NEXT spdup
  890 NEXT outl
  900 LOOP 
  910 LABEL room
  920 ~INKBLACK
  930 ~ROOM rm
  940 ~DJCLEAR 0,1
  950 ~SPUT 0,x,y,128
  960 RESTORE roomst(rom)
  970 FOR a=1 TO 256
  980 READ r,sp,sx,sy,xs,ys
  990 IF r>rm THEN GO TO 1040
 1000 IF r<>rm THEN GO TO 1030
 1010 IF sp<41 THEN LET pl=128: ELSE LET pl=1
 1020 IF dead(sp,rom)>0 THEN ~SPUT sp,sx,sy,pl:~SPEED sp,xs,ys:~NODEON sp
 1030 NEXT a
 1040 ~PNUMA 26,168,3,48,energy
 1050 ~PNUMA 222,168,1,48,keys
 1060 ~PNUMA 146,168,4,48,score
 1070 ~PNUMA 88,168,3,48,ammo
 1080 ~MOVEALL:~VIEW
 1090 ~VIEW:~COLOUR
 1100 RETURN 
 1110 LABEL rm0
 1120 DATA 0,46,36,113,0,0
 1130 DATA 0,41,114,65,0,0
 1140 DATA 0,1,140,52,0,0
 1150 DATA 0,6,170,65,-2,0
 1160 DATA 0,11,100,129,-2,0
 1170 DATA 0,7,100,65,2,0
 1180 DATA 0,16,100,160,2,0
 1190 LABEL rm1
 1200 DATA 1,46,100,65,0,0
 1210 DATA 1,6,236,65,-2,0
 1220 DATA 1,11,68,65,-2,0
 1230 DATA 1,7,160,129,2,0
 1240 DATA 1,16,100,160,2,0
 1250 DATA 1,34,218,60,0,0
 1260 DATA 1,8,56,129,-2,0
 1270 DATA 1,1,146,34,0,0
 1280 LABEL rm2
 1290 DATA 2,45,46,97,0,-2
 1300 DATA 2,11,82,145,-2,0
 1310 DATA 2,31,236,81,0,0
 1320 DATA 2,16,100,160,2,0
 1330 DATA 2,9,222,65,-2,0
 1340 DATA 2,14,126,65,-2,0
 1350 DATA 2,12,66,65,-2,0
 1360 DATA 2,1,226,135,0,0
 1370 LABEL rm3
 1380 DATA 3,16,100,160,2,0
 1390 DATA 3,6,98,145,-2,0
 1400 DATA 3,1,122,89,0,0
 1410 DATA 3,21,236,63,-2,0
 1420 DATA 3,8,178,65,-2,0
 1430 DATA 3,7,98,65,-2,0
 1440 DATA 3,11,178,129,-2,0
 1450 DATA 3,37,214,75,0,0
 1460 LABEL rm4
 1470 DATA 4,41,98,65,0,0
 1480 DATA 4,46,132,97,0,0
 1490 DATA 4,21,236,127,-1,0
 1500 DATA 4,6,83,65,-2,0
 1510 DATA 4,11,52,145,2,0
 1520 DATA 4,7,230,129,-2,0
 1530 DATA 4,1,134,135,0,0
 1540 DATA 4,35,98,145,0,0
 1550 DATA 4,16,100,160,2,0
 1560 DATA 4,32,204,149,0,0
 1570 LABEL rm5
 1580 DATA 5,1,212,113,0,0
 1590 DATA 5,2,206,103,0,0
 1600 DATA 5,11,236,129,-2,0
 1610 DATA 5,6,178,97,-2,0
 1620 DATA 5,7,98,113,-2,0
 1630 DATA 5,36,216,151,0,0
 1640 DATA 5,16,100,160,2,0
 1650 LABEL rm6
 1660 DATA 6,16,100,160,2,0
 1670 DATA 6,6,96,129,-2,0
 1680 DATA 6,7,220,129,-2,0
 1690 DATA 6,1,136,119,0,0
 1700 DATA 6,27,20,80,0,0
 1710 DATA 6,11,124,81,-2,0
 1720 DATA 6,12,200,81,-2,0
 1730 DATA 6,35,204,89,0,0
 1740 LABEL rm7
 1750 DATA 7,6,236,81,-2,0
 1760 DATA 7,7,138,81,-2,0
 1770 DATA 7,1,90,71,0,0
 1780 DATA 7,31,44,93,0,0
 1790 DATA 7,2,90,119,0,0
 1800 DATA 7,11,130,129,-2,0
 1810 DATA 7,12,200,129,-2,0
 1820 DATA 7,3,154,119,0,0
 1830 DATA 7,37,206,124,0,0
 1840 LABEL rm8
 1850 DATA 8,30,218,83,0,0
 1860 DATA 8,11,82,81,-2,0
 1870 DATA 8,12,176,81,-2,0
 1880 DATA 8,1,114,71,0,0
 1890 DATA 8,42,160,100,0,2
 1900 DATA 8,6,146,129,-2,0
 1910 DATA 8,2,42,119,0,0
 1920 DATA 8,33,164,112,0,0
 1930 DATA 8,37,68,101,0,0
 1940 DATA 256,0,0,0,0,0
 1950 LABEL hitit
 1960 IF hit=30 THEN SCOM 2:~SMERGE 30,154:~ANIMATE 30,13:~XEDGE 0,3,3:~SPEED 0,
      1,0: FOR elp=1 TO 100::~MOVEALL:~VIEW: PAUSE 2: NEXT elp:yipee
 1970 IF hit=21 THEN LET energy=energy-10: GO TO 2090
 1980 IF hit>37 AND hit<41 THEN LET energy=energy-10:~ANIMOFF hit,12,9,1: LET de
      ad(hit,rom)=0: GO TO 2090
 1990 IF hit=31 THEN ~AMMADD 0,50: LET score=score+5,dead(hit,rom)=0:~ANIMOFF hi
      t,64,9,1: GO TO 2090
 2000 IF hit=32 THEN ~AMMADD 0,25: LET dead(hit,rom)=0,score=score+5:~ANIMOFF hi
      t,64,9,1: GO TO 2090
 2010 IF hit=33 THEN LET dead(hit,rom)=0,score=score+10:~ANIMOFF hit,64,9,1: GO 
      TO 2090
 2020 IF hit>33 AND hit<38 THEN LET energy=energy+25,score=score+5,dead(hit,rom)
      =0:~ANIMOFF hit,64,9,1: GO TO 2090
 2030 IF hit>25 AND hit<30 THEN LET keys=keys+1:~ANIMOFF hit,64,9,1: LET dead(hi
      t,rom)=0:SCOM 5: GO TO 2090
 2040 IF hit<26 THEN LET dead(hit,rm+1)=dead(hit,rm+1)-0.2: LET energy=energy-1
 2050 IF dead(hit,rom)<=0 THEN LET ded=hit : GO SUB ammoff: LET score=score+dead
      p(hit): GO TO 2090
 2060 IF hit=46 OR hit=41 THEN ~JUMP 0,6:SCOM 7: GO TO 2090
 2070 IF hit=48 THEN ~JUMP 0,7:SCOM 7: GO TO 2090
 2080 IF hit=49 OR hit=40 THEN ~JUMP 0,7:SCOM 7
 2090 IF energy<=0 THEN ugh
 2100 IF score<0 THEN LET score=0
 2110 ~PNUMA 26,168,3,48,energy
 2120 ~PNUMA 222,168,1,48,keys
 2125 ~PNUMA 146,168,4,48,score
 2130 RETURN 
 2140 LABEL misshit
 2150 IF miss<>0 THEN ~FIRE miss
 2160 IF miss=0 THEN LET energy=energy-5: GO TO 2200
 2170 IF miss>25 THEN RETURN 
 2180 LET dead(miss,rm+1)=dead(miss,rm+1)-1
 2190 IF dead(miss,rm+1)<=0 THEN LET ded=miss: GO SUB ammoff: LET score=score+de
      adp(miss)
 2200 IF energy<=0 THEN ugh
 2210 IF score<0 THEN LET score=0
 2220 ~PNUMA 26,168,3,48,energy
 2230 ~PNUMA 146,168,4,48,score
 2240 RETURN 
 2250 LABEL scom
 2260 FOR a=1 TO 15
 2270 ~SCOM a
 2280 PAUSE 0
 2290 NEXT a
 2300 LABEL HELP
 2310 RESTORE 2660
 2320 FOR loopit=1 TO 5
 2330 LABEL hel
 2340 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2350 ~TEXTA 66,180,"QUICK GUIDE HELP"
 2360 FOR hy=1 TO 5
 2370 READ spr,text$,po$
 2380 ~SPUT spr,20,160-(hy*25),128
 2390 ~TEXTA 50,152-(hy*25),text$
 2400 ~TEXTA 200,152-(hy*25),po$
 2410 IF hy=4 AND loopit=5 THEN GO TO 2430
 2420 NEXT hy
 2430 ~COLOUR:~VIEW
 2440 PAUSE 
 2450 NEXT loopit
 2460 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2470 ~TEXTA 68,180,"QUICK GUIDE HELP"
 2480 ~TEXTA 78,160,"INJURY LISTING"
 2490 FOR a=1 TO 5
 2500 READ text$,num
 2510 ~TEXTA 10,140-(a*10),text$
 2520 ~PNUMA 238,140-(a*10),2,48,num
 2530 NEXT a
 2540 ~VIEW:~COLOUR: PAUSE 
 2550 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2560 ~TEXTA 66,180,"QUICK GUIDE HELP"
 2570 ~TEXTA 76,160,"CONTROL METHOD"
 2580 FOR a=1 TO 4
 2590 READ text$
 2600 ~TEXTA 56,140-(a*10),text$
 2610 NEXT a
 2620 ~VIEW:~COLOUR: PAUSE 
 2630 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2640 GO SUB room
 2650 GO TO start
 2660 DATA 0,"SAFARI SAM","   0"
 2670 DATA 1,"MONKEY"," -25"
 2680 DATA 6,"TRIBESMAN","  10"
 2690 DATA 11,"HUNTER","  25"
 2700 DATA 16,"PARROT"," -15"
 2710 DATA 38,"ANIMAL TRAP","   0"
 2720 DATA 21,"BARREL","   5"
 2730 DATA 26,"GOLD KEY","  10"
 2740 DATA 27,"SILVER KEY","  10"
 2750 DATA 28,"BLUE KEY","  10"
 2760 DATA 29,"RED KEY","  10"
 2770 DATA 30,"GREEN KEY","  10"
 2780 DATA 31,"50 AMMO","   5"
 2790 DATA 32,"25 AMMO","   5"
 2800 DATA 33,"TOKEN","  10"
 2810 DATA 34,"PIZZA 25 ENERGY","  5"
 2820 DATA 35,"LOLLY 25 ENERGY","  5"
 2830 DATA 36,"APPLE 25 ENERGY","  5"
 2840 DATA 37,"CAKE 25 ENERGY","  5"
 2850 DATA 42,"PLATFORM","  0"
 2860 DATA 46,"SPRING UP","  0"
 2870 DATA 47,"SPRING DOWN","  0"
 2880 DATA 48,"SPRING LEFT","  0"
 2890 DATA 49,"SPRING RIGHT","  0"
 2900 DATA "BULLET",5
 2910 DATA "SPEAR",5
 2920 DATA "NUT",5
 2930 DATA "BARREL",10
 2940 DATA "CONTACT",1
 2950 DATA "F1....JOYSTICK 1"
 2960 DATA "F2....CURSORS,SPACE"
 2970 DATA "F3....JOYSTICK 2"
 2980 DATA "F4....Q,A,O,P,SPACE"
 2990 LABEL ammoff
 3000 ~RIMAGE ded,LENGTH(0,a)
 3010 ~SXSPD ded,LENGTH(0,sx)
 3020 LET d=3
 3030 IF sx>0 THEN LET d=3
 3040 IF sx<0 THEN LET d=7
 3050 IF sx=0 THEN IF ded>0 THEN IF ded<6 OR ded>25 THEN LET d=9
 3060 FOR a=0 TO 4: LET md=ded+a: IF (md/5)<>INT (md/5) THEN NEXT a
 3070 IF md<21 THEN ~ANIMOFF ded,((md/5))+20,d,1: ELSE ~ANIMOFF ded,64,d,1
 3080 RETURN 
 3090 DEF PROC scom s
 3100 IF sfx=1 THEN ~SCOM s
 3110 END PROC 
 3120 DEF PROC fade d
 3130 RESTORE 3229+d
 3140 IF d=1 THEN FOR a=0 TO 15
 3150 IF d=2 THEN FOR a=15 TO 0 STEP -1
 3160 READ col
 3170 PAUSE d
 3180 FOR b=a TO 15
 3190 PALETTE b,col
 3200 NEXT b
 3210 NEXT a
 3220 END PROC 
 3230 DATA 0,0,8,5,7,13,15,82,112,90,120,117,119,125,127,127
 3240 DATA 127,127,125,119,117,120,90,112,82,15,13,7,5,8,0,0
 3250 DEF PROC palblack: FOR a=1 TO 15: PALETTE a,0: NEXT a: END PROC 
 3260 DEF PROC yipee
 3270 ~INIT:palblack: PAUSE 2
 3280 ~PANEL "s7" 
 3290 fade 1
 3300 LET score$=STR$ score
 3310 LET s$="0000"
 3320 LET s$(5-LEN score$ TO 4)=score$
 3330 FOR a=1 TO 4: POKE (458747+a),VAL s$(a): NEXT a
 3340 PAUSE :fade 2
 3350 LOAD "level2"
 3360 END PROC 
 3370 DEF PROC ugh
 3380 ~INIT:palblack: PAUSE 2
 3390 ~PANEL "s9"
 3400 fade 1: PAUSE :fade 2
 3401 LET score$=STR$ score
 3402 LET s$="0000"
 3403 LET s$(5-LEN score$ TO 4)=score$
 3404 FOR a=1 TO 4: POKE (458747+a),VAL s$(a): NEXT a
 3410 POKE 458755,1: LOAD "endit"
 3420 END PROC

level2

   10 GO TO 30
   20 ~FILE "draw3"
   30 ~INIT
   40 palblack: PAUSE 2:~PANEL "s2":fade 1
   60 LET x=14,y=129,rm=0,rom=rm+1,hit=0,energy=100,ammo=50,miss=0,keys=0
   70 LET control=PEEK 458754
   80 LET sfx=PEEK 458753
   90 LET diff=10-(PEEK 458752)
   95 LET score$="0000": FOR a=1 TO 4: LET score$(a)=STR$ PEEK (458747+a): NEXT 
      a: LET score=VAL score$
  100 RESTORE 250
  110 DIM roomst(10)
  120 DIM deadp(50)
  130 FOR a=1 TO 5: LET deadp(a)=-25: NEXT a
  140 FOR a=6 TO 10: LET deadp(a)=10: NEXT a
  150 FOR a=11 TO 15: LET deadp(a)=25: NEXT a
  160 FOR a=16 TO 20: LET deadp(a)=-15: NEXT a
  170 FOR a=21 TO 25: LET deadp(a)=10: NEXT a
  180 FOR a=26 TO 30: LET deadp(a)=10: NEXT a
  190 FOR a=31 TO 32: LET deadp(a)=5: NEXT a
  200 LET deadp(33)=100
  210 FOR a=34 TO 37: LET deadp(a)=5: NEXT a
  220 FOR a=1 TO 10
  230 READ roomst(a)
  240 NEXT a
  250 DATA rm0,rm1,rm2,rm3,rm4,rm5,rm6,rm7,rm8,rm9
  260 DIM dead(50,10): FOR a=1 TO 50: FOR b=1 TO 10: LET dead(a,b)=5: NEXT b: NE
      XT a
  270 ~LINK 0,0:~ANIMATE 0,1:~SETINP 0,control,2,0,68,"11122310":~FEET 0,2,2
  280 FOR a=1 TO 5:~LINK a,9:~ANIMATE a,4:~DROP a,0,1: NEXT a
  290 FOR a=6 TO 10:~LINK a,28:~ANIMATE a,2:~DROP a,0,1: NEXT a
  300 IF sfx=1 THEN FOR a=6 TO 10:~AUTOSOUND a,0,12: NEXT a
  310 FOR a=11 TO 15:~LINK a,56:~ANIMATE a,3:~DROP a,0,1: NEXT a
  320 IF sfx=1 THEN FOR a=11 TO 15:~AUTOSOUND a,0,13: NEXT a
  330 FOR a=16 TO 20:~LINK a,37:~ANIMATE a,5: NEXT a
  340 FOR a=21 TO 25:~LINK a,79:~ANIMATE a,10:~DROP a,0,1:~YEDGE a,3,3: NEXT a
  350 FOR a=26 TO 29:~LINK a,135+(a-26): NEXT a
  360 ~LINK 30,159:~ANIMATE 30,14
  370 FOR a=31 TO 37:~LINK a,249+(a-31): NEXT a
  380 FOR a=38 TO 40:~LINK a,126: NEXT a
  390 FOR a=42 TO 45:~LINK a,23:~PLATFORM a: NEXT a
  400 ~LINK 41,84:~ANIMATE 41,6
  410 ~LINK 46,84:~ANIMATE 46,6
  420 ~LINK 47,89:~ANIMATE 47,7
  430 ~LINK 48,98:~ANIMATE 48,8
  440 ~LINK 49,103:~ANIMATE 49,9
  450 IF sfx=2 THEN GO TO 490
  460 ~AUTOSOUND 0,0,13
  470 ~AUTOSOUND 0,3,10
  480 ~AUTOSOUND 0,2,9
  490 ~MISSRANGE 50,63
  500 ~MISSILE 0,255,5,50,63,128,254,62:~AMMO 0,ammo
  510 FOR a=1 TO 5:~MISSILE a,255,diff*2,50,63,128,254,63:~AMMO a,255: NEXT a
  520 FOR a=6 TO 10:~MISSILE a,255,2*diff,50,63,128,254,62:~AMMO a,255: NEXT a
  530 FOR a=11 TO 15:~MISSILE a,255,2*diff,50,63,128,254,62:~AMMO a,255: NEXT a
  540 FOR a=16 TO 20:~MISSILE a,255,2*diff,50,63,128,254,64:~AMMO a,255: NEXT a
  550 LET spr=0
  560 IF sfx=1 THEN ~MISSOUND 15
  565 fade 2
  570 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
  580 REM ~PANEL "panel"
  590 GO SUB room:~VIEW
  600 ~COLOUR
  610 LABEL start
  620 DO 
  630 FOR outl=1 TO 25
  640 LET i=CODE INKEY$: IF i>192 AND i<197 THEN LET control=i-192:~SETINP 0,con
      trol,2,0,255,"11122310":SCOM 5
  650 IF i=192 THEN GO TO help
  660 REM [Level 2]~FIRE 1+RND(24)
  670 ~MOVEALL:~VIEW
  680 REM [Level 2]~FIRE 1+RND(24)
  690 ~HIT 0,LENGTH(0,hit): IF hit>0 THEN ~NEXTHIT LENGTH(0,hit): GO SUB hitit
  700 ~MISSHIT LENGTH(0,miss): IF miss<>255 THEN GO SUB misshit
  710 ~RAMMO 0,LENGTH(0,ammo):~PNUMA 88,168,3,48,ammo
  720 FOR spdup=1 TO 2
  730 ~MISSHIT LENGTH(0,miss): IF miss<>255 THEN GO SUB misshit
  740 ~MOVEALL:~VIEW
  750 REM [Level 1]~FIRE 1+RND(24)
  760 ~FIRE 1+RND(24)
  770 ~FIRE 1+RND(24)
  780 ~SXPOS 0,LENGTH(0,x)
  790 ~SYPOS 0,LENGTH(0,y)
  800 IF y=17 THEN ugh
  810 IF rm=0 THEN GO TO 840
  820 IF x<4 THEN LET x=236 THEN LET rm=rm-1,rom=rom-1: GO SUB room
  830 IF rm=11 THEN GO TO 850
  840 IF x>236 THEN LET x=4 THEN LET rm=rm+1,rom=rom+1: GO SUB room
  850 NEXT spdup
  860 NEXT outl
  870 LOOP 
  880 LABEL room
  890 ~INKBLACK
  900 ~ROOM rm
  910 ~DJCLEAR 0,1
  920 ~SPUT 0,x,y,128
  930 RESTORE roomst(rom)
  940 FOR a=1 TO 256
  950 READ r,sp,sx,sy,xs,ys
  960 IF r>rm THEN GO TO 1010
  970 IF r<>rm THEN GO TO 1000
  980 IF sp<41 THEN LET pl=128: ELSE LET pl=1
  990 IF dead(sp,rom)>0 THEN ~SPUT sp,sx,sy,pl:~SPEED sp,xs,ys:~NODEON sp
 1000 NEXT a
 1010 ~PNUMA 26,168,3,48,energy
 1020 ~PNUMA 222,168,1,48,keys
 1030 ~PNUMA 146,168,4,48,score
 1040 ~PNUMA 88,168,3,48,ammo
 1050 ~MOVEALL:~VIEW
 1060 ~VIEW:~COLOUR
 1070 RETURN 
 1080 LABEL rm0
 1090 DATA 0,46,68,129,0,0
 1100 DATA 0,42,90,96,0,-2
 1110 DATA 0,11,148,129,-2,0
 1120 DATA 0,6,8,82,2,0
 1130 DATA 0,12,222,129,-2,0
 1140 DATA 0,7,100,65,2,0
 1150 DATA 0,16,100,160,2,0
 1160 DATA 0,1,146,55,0,0
 1170 LABEL rm1
 1180 DATA 1,46,22,65,0,0
 1190 DATA 1,6,236,65,-2,0
 1200 DATA 1,12,82,113,-2,0
 1210 DATA 1,7,160,129,2,0
 1220 DATA 1,16,100,160,2,0
 1230 DATA 1,8,130,129,-2,0
 1240 DATA 1,1,148,55,0,0
 1250 DATA 1,42,144,111,0,-2
 1260 DATA 1,35,148,85,0,0
 1270 LABEL rm2
 1280 DATA 2,45,54,97,0,-2
 1290 DATA 2,44,116,48,-2,0
 1300 DATA 2,46,114,33,0,0
 1310 DATA 2,43,192,112,0,-2
 1320 DATA 2,11,196,65,-2,0
 1330 DATA 2,2,70,91,0,0
 1340 DATA 2,31,114,113,0,0
 1350 DATA 2,16,100,160,2,0
 1360 DATA 2,9,166,129,-2,0
 1370 DATA 2,14,126,33,-2,0
 1380 DATA 2,12,66,65,-2,0
 1390 DATA 2,1,226,119,0,0
 1400 LABEL rm3
 1410 DATA 3,42,48,48,0,-2
 1420 DATA 3,43,112,48,0,-2
 1430 DATA 3,44,230,16,-2,0
 1440 DATA 3,45,100,112,-2,0
 1450 DATA 3,6,162,129,-2,0
 1460 DATA 3,11,68,129,-2,0
 1470 DATA 3,12,98,65,-2,0
 1480 DATA 3,7,164,65,-2,0
 1490 DATA 3,1,196,39,0,0
 1500 DATA 3,41,98,65,0,0
 1510 DATA 3,13,236,129,-2,0
 1520 DATA 3,2,68,119,0,0
 1530 DATA 3,37,222,57,0,0
 1540 DATA 3,16,100,160,2,0
 1550 LABEL rm4
 1560 DATA 4,42,0,16,2,0
 1570 DATA 4,11,192,65,-2,0
 1580 DATA 4,1,98,39,0,0
 1590 DATA 4,43,210,48,2,0
 1600 DATA 4,12,100,97,-2,0
 1610 DATA 4,2,50,103,0,0
 1620 DATA 4,6,226,129,-2,0
 1630 DATA 4,3,238,55,0,0
 1640 DATA 4,41,194,65,0,0
 1650 DATA 4,36,150,129,0,0
 1660 DATA 4,16,100,160,2,0
 1670 LABEL rm5
 1680 DATA 5,42,80,96,0,-2
 1690 DATA 5,6,228,97,-2,0
 1700 DATA 5,7,150,81,-2,0
 1710 DATA 5,1,51,71,0,0
 1720 DATA 5,11,68,129,-2,0
 1730 DATA 5,12,162,145,-2,0
 1740 DATA 5,43,238,128,2,0
 1750 DATA 5,2,162,87,0,0
 1760 DATA 5,3,242,103,0,0
 1770 DATA 5,29,154,149,0,0
 1780 DATA 5,16,100,160,2,0
 1790 LABEL rm6
 1800 DATA 6,16,100,160,2,0
 1810 DATA 6,42,80,96,0,-2
 1820 DATA 6,43,112,96,0,2
 1830 DATA 6,11,236,97,-2,0
 1840 DATA 6,12,146,65,-2,0
 1850 DATA 6,6,64,113,-2,0
 1860 DATA 6,7,164,145,-2,0
 1870 DATA 6,8,230,145,-2,0
 1880 DATA 6,44,176,128,0,-2
 1890 DATA 6,1,50,70,0,0
 1900 DATA 6,45,0,128,2,0
 1910 DATA 6,34,104,80,0,0
 1920 LABEL rm7
 1930 DATA 7,42,98,64,2,0
 1940 DATA 7,13,68,81,-2,0
 1950 DATA 7,43,144,112,0,-2
 1960 DATA 7,7,138,81,-2,0
 1970 DATA 7,8,194,65,-2,0
 1980 DATA 7,31,50,110,0,0
 1990 DATA 7,2,92,23,0,0
 2000 DATA 7,11,130,129,-2,0
 2010 DATA 7,12,200,129,-2,0
 2020 DATA 7,3,226,55,0,0
 2030 DATA 7,37,206,124,0,0
 2040 LABEL rm8
 2050 DATA 8,6,66,129,-2,0
 2060 DATA 8,1,66,119,0,0
 2070 DATA 8,2,98,103,0,0
 2080 DATA 8,3,129,119,0,0
 2090 DATA 8,42,112,100,0,2
 2100 DATA 8,43,80,100,0,2
 2110 DATA 8,44,80,48,-2,0
 2120 DATA 8,7,130,65,-2,0
 2130 DATA 8,11,194,65,-2,0
 2140 DATA 8,12,48,65,-2,0
 2150 LABEL rm9
 2160 DATA 9,6,114,97,-2,0
 2170 DATA 9,1,50,71,0,0
 2180 DATA 9,42,80,128,0,-2
 2190 DATA 9,43,80,128,2,0
 2200 DATA 9,11,116,49,2,0
 2210 DATA 9,2,66,23,0,0
 2220 DATA 9,44,190,16,2,0
 2230 DATA 9,12,44,145,2,0
 2240 DATA 9,13,162,145,2,0
 2250 DATA 9,37,134,160,0,0
 2260 DATA 9,32,190,85,0,0
 2270 DATA 9,33,114,51,0,0
 2280 DATA 9,30,210,39,0,0
 2290 DATA 256,0,0,0,0,0
 2300 LABEL hitit
 2310 IF hit=30 THEN SCOM 2:~SMERGE 30,154:~ANIMATE 30,13:~XEDGE 0,3,3:~SPEED 0,
      1,0: DO :~MOVEALL:~VIEW: PAUSE 2: LOOP :yipee
 2320 IF hit=21 THEN LET energy=energy-10: GO TO 2440
 2330 IF hit>37 AND hit<41 THEN LET energy=energy-10:~ANIMOFF hit,12,9,1: LET de
      ad(hit,rom)=0: GO TO 2440
 2340 IF hit=31 THEN ~AMMADD 0,50: LET score=score+5,dead(hit,rom)=0:~ANIMOFF hi
      t,64,9,1: GO TO 2440
 2350 IF hit=32 THEN ~AMMADD 0,25: LET dead(hit,rom)=0,score=score+5:~ANIMOFF hi
      t,64,9,1: GO TO 2440
 2360 IF hit=33 THEN LET dead(hit,rom)=0,score=score+10:~ANIMOFF hit,64,9,1: GO 
      TO 2440
 2370 IF hit>33 AND hit<38 THEN LET energy=energy+25,score=score+5,dead(hit,rom)
      =0:~ANIMOFF hit,64,9,1: GO TO 2440
 2380 IF hit>25 AND hit<30 THEN LET keys=keys+1:~ANIMOFF hit,64,9,1: LET dead(hi
      t,rom)=0:SCOM 5: GO TO 2440
 2390 IF hit<26 THEN LET dead(hit,rom)=dead(hit,rom)-0.2: LET energy=energy-1
 2400 IF dead(hit,rom)<=0 THEN LET ded=hit : GO SUB ammoff: LET score=score+dead
      p(hit): GO TO 2440
 2410 IF hit=46 OR hit=41 THEN ~JUMP 0,6:SCOM 7: GO TO 2440
 2420 IF hit=48 THEN ~JUMP 0,7:SCOM 7: GO TO 2440
 2430 IF hit=49 OR hit=40 THEN ~JUMP 0,7:SCOM 7
 2440 IF energy<=0 THEN ugh
 2450 IF score<0 THEN LET score=0
 2460 ~PNUMA 26,168,3,48,energy
 2470 ~PNUMA 222,168,1,48,keys
 2475 ~PNUMA 146,168,4,48,score
 2480 RETURN 
 2490 LABEL misshit
 2500 IF miss<>0 THEN ~FIRE miss
 2510 IF miss=0 THEN LET energy=energy-5: GO TO 2550
 2520 IF miss>25 THEN RETURN 
 2530 LET dead(miss,rm+1)=dead(miss,rm+1)-1
 2540 IF dead(miss,rm+1)<=0 THEN LET ded=miss: GO SUB ammoff: LET score=score+de
      adp(miss)
 2550 IF energy<=0 THEN ugh
 2560 IF score<0 THEN LET score=0
 2570 ~PNUMA 26,168,3,48,energy
 2580 ~PNUMA 146,168,4,48,score
 2590 RETURN 
 2600 LABEL scom
 2610 FOR a=1 TO 15
 2620 ~SCOM a
 2630 PAUSE 0
 2640 NEXT a
 2650 LABEL HELP
 2660 RESTORE 3010
 2670 FOR loopit=1 TO 5
 2680 LABEL hel
 2690 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2700 ~TEXTA 66,180,"QUICK GUIDE HELP"
 2710 FOR hy=1 TO 5
 2720 READ spr,text$,po$
 2730 ~SPUT spr,20,160-(hy*25),128
 2740 ~TEXTA 50,152-(hy*25),text$
 2750 ~TEXTA 200,152-(hy*25),po$
 2760 IF hy=4 AND loopit=5 THEN GO TO 2780
 2770 NEXT hy
 2780 ~COLOUR:~VIEW
 2790 PAUSE 
 2800 NEXT loopit
 2810 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2820 ~TEXTA 68,180,"QUICK GUIDE HELP"
 2830 ~TEXTA 78,160,"INJURY LISTING"
 2840 FOR a=1 TO 5
 2850 READ text$,num
 2860 ~TEXTA 10,140-(a*10),text$
 2870 ~PNUMA 238,140-(a*10),2,48,num
 2880 NEXT a
 2890 ~VIEW:~COLOUR: PAUSE 
 2900 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2910 ~TEXTA 66,180,"QUICK GUIDE HELP"
 2920 ~TEXTA 76,160,"CONTROL METHOD"
 2930 FOR a=1 TO 4
 2940 READ text$
 2950 ~TEXTA 56,140-(a*10),text$
 2960 NEXT a
 2970 ~VIEW:~COLOUR: PAUSE 
 2980 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 2990 GO SUB room
 3000 GO TO start
 3010 DATA 0,"SAFARI SAM","   0"
 3020 DATA 1,"MONKEY"," -25"
 3030 DATA 6,"TRIBESMAN","  10"
 3040 DATA 11,"HUNTER","  25"
 3050 DATA 16,"PARROT"," -15"
 3060 DATA 38,"ANIMAL TRAP","   0"
 3070 DATA 21,"BARREL","   5"
 3080 DATA 26,"GOLD KEY","  10"
 3090 DATA 27,"SILVER KEY","  10"
 3100 DATA 28,"BLUE KEY","  10"
 3110 DATA 29,"RED KEY","  10"
 3120 DATA 30,"GREEN KEY","  10"
 3130 DATA 31,"50 AMMO","   5"
 3140 DATA 32,"25 AMMO","   5"
 3150 DATA 33,"TOKEN","  10"
 3160 DATA 34,"PIZZA 25 ENERGY","  5"
 3170 DATA 35,"LOLLY 25 ENERGY","  5"
 3180 DATA 36,"APPLE 25 ENERGY","  5"
 3190 DATA 37,"CAKE 25 ENERGY","  5"
 3200 DATA 42,"PLATFORM","  0"
 3210 DATA 46,"SPRING UP","  0"
 3220 DATA 47,"SPRING DOWN","  0"
 3230 DATA 48,"SPRING LEFT","  0"
 3240 DATA 49,"SPRING RIGHT","  0"
 3250 DATA "BULLET",5
 3260 DATA "SPEAR",5
 3270 DATA "NUT",5
 3280 DATA "BARREL",10
 3290 DATA "CONTACT",1
 3300 DATA "F1....JOYSTICK 1"
 3310 DATA "F2....CURSORS,SPACE"
 3320 DATA "F3....JOYSTICK 2"
 3330 DATA "F4....Q,A,O,P,SPACE"
 3340 LABEL ammoff
 3350 ~RIMAGE ded,LENGTH(0,a)
 3360 ~SXSPD ded,LENGTH(0,sx)
 3370 LET d=3
 3380 IF sx>0 THEN LET d=3
 3390 IF sx<0 THEN LET d=7
 3400 IF sx=0 THEN IF ded>0 THEN IF ded<6 OR ded>25 THEN LET d=9
 3410 FOR a=0 TO 4: LET md=ded+a: IF (md/5)<>INT (md/5) THEN NEXT a
 3420 IF md<21 THEN ~ANIMOFF ded,((md/5))+20,d,1: ELSE ~ANIMOFF ded,64,d,1
 3430 RETURN 
 3440 DEF PROC scom s
 3450 IF sfx=1 THEN ~SCOM s
 3460 END PROC 
 3470 DEF PROC fade d
 3480 RESTORE 3579+d
 3490 IF d=1 THEN FOR a=0 TO 15
 3500 IF d=2 THEN FOR a=15 TO 0 STEP -1
 3510 READ col
 3520 PAUSE d
 3530 FOR b=a TO 15
 3540 PALETTE b,col
 3550 NEXT b
 3560 NEXT a
 3570 END PROC 
 3580 DATA 0,0,8,5,7,13,15,82,112,90,120,117,119,125,127,127
 3590 DATA 127,127,125,119,117,120,90,112,82,15,13,7,5,8,0,0
 3600 DEF PROC palblack: FOR a=1 TO 15: PALETTE a,0: NEXT a: END PROC 
 3610 DEF PROC yipee
 3635 ~INIT:palblack: PAUSE 2
 3640 ~PANEL "s3" 
 3650 fade 1
 3660 LET score$=STR$ score
 3670 LET s$="0000"
 3680 LET s$(5-LEN score$ TO 4)=score$
 3690 FOR a=1 TO 4: POKE (458747+a),VAL s$(a): NEXT a
 3700 PAUSE :fade 2
 3710 LOAD "level3"
 3720 END PROC 
10000 DEF PROC ugh
10010 ~INIT:palblack: PAUSE 2
10020 ~PANEL "s9"
10030 fade 1: PAUSE :fade 2
10031 LET score$=STR$ score
10032 LET s$="0000"
10033 LET s$(5-LEN score$ TO 4)=score$
10034 FOR a=1 TO 4: POKE (458747+a),VAL s$(a): NEXT a
10040 POKE 458755,1: LOAD "endit"
10050 END PROC

level3

   10 GO TO 30
   20 ~FILE "draw1"
   30 ~INIT
   40 palblack: PAUSE 2:~PANEL "s1":fade 1
   50 LET x=24,y=145,rm=0,rom=rm+1,hit=0,energy=100,ammo=50,miss=0,keys=0
   60 LET control=PEEK 458754
   70 LET sfx=PEEK 458753
   80 LET diff=10-(PEEK 458752)
   90 LET score$="0000": FOR a=1 TO 4: LET score$(a)=STR$ PEEK (458747+a): NEXT 
      a: LET score=VAL score$
  100 RESTORE 250
  110 DIM roomst(12)
  120 DIM deadp(50)
  130 FOR a=1 TO 5: LET deadp(a)=-25: NEXT a
  140 FOR a=6 TO 10: LET deadp(a)=10: NEXT a
  150 FOR a=11 TO 15: LET deadp(a)=25: NEXT a
  160 FOR a=16 TO 20: LET deadp(a)=-15: NEXT a
  170 FOR a=21 TO 25: LET deadp(a)=10: NEXT a
  180 FOR a=26 TO 30: LET deadp(a)=10: NEXT a
  190 FOR a=31 TO 32: LET deadp(a)=5: NEXT a
  200 LET deadp(33)=100
  210 FOR a=34 TO 37: LET deadp(a)=5: NEXT a
  220 FOR a=1 TO 12
  230 READ roomst(a)
  240 NEXT a
  250 DATA rm0,rm1,rm2,rm3,rm4,rm5,rm6,rm7,rm8,rm9,rm10,rm11
  260 DIM dead(50,13): FOR a=1 TO 50: FOR b=1 TO 13: LET dead(a,b)=5: NEXT b: NE
      XT a
  270 ~LINK 0,0:~ANIMATE 0,1:~SETINP 0,control,2,0,68,"11122310":~FEET 0,2,2
  280 FOR a=1 TO 5:~LINK a,9:~ANIMATE a,4:~DROP a,0,1: NEXT a
  290 FOR a=6 TO 10:~LINK a,28:~ANIMATE a,2:~DROP a,0,1: NEXT a
  300 IF sfx=1 THEN FOR a=6 TO 10:~AUTOSOUND a,0,12: NEXT a
  310 FOR a=11 TO 15:~LINK a,56:~ANIMATE a,3:~DROP a,0,1: NEXT a
  320 IF sfx=1 THEN FOR a=11 TO 15:~AUTOSOUND a,0,13: NEXT a
  330 FOR a=16 TO 20:~LINK a,37:~ANIMATE a,5: NEXT a
  340 FOR a=21 TO 25:~LINK a,79:~ANIMATE a,10:~DROP a,0,1:~YEDGE a,3,3: NEXT a
  350 FOR a=26 TO 29:~LINK a,135+(a-26): NEXT a
  360 ~LINK 30,159:~ANIMATE 30,14
  370 FOR a=31 TO 37:~LINK a,249+(a-31): NEXT a
  380 FOR a=38 TO 40:~LINK a,126: NEXT a
  390 FOR a=42 TO 45:~LINK a,23:~PLATFORM a: NEXT a
  400 ~LINK 41,84:~ANIMATE 41,6
  410 ~LINK 46,84:~ANIMATE 46,6
  420 ~LINK 47,89:~ANIMATE 47,7
  430 ~LINK 48,98:~ANIMATE 48,8
  440 ~LINK 49,103:~ANIMATE 49,9
  450 IF sfx=2 THEN GO TO 490
  460 ~AUTOSOUND 0,0,13
  470 ~AUTOSOUND 0,3,10
  480 ~AUTOSOUND 0,2,9
  490 ~MISSRANGE 50,63
  500 ~MISSILE 0,255,5,50,63,128,254,62:~AMMO 0,ammo
  510 FOR a=1 TO 5:~MISSILE a,255,diff*2,50,63,128,254,63:~AMMO a,255: NEXT a
  520 FOR a=6 TO 10:~MISSILE a,255,diff*2,50,63,128,254,62:~AMMO a,255: NEXT a
  530 FOR a=11 TO 15:~MISSILE a,255,diff*2,50,63,128,254,62:~AMMO a,255: NEXT a
  540 FOR a=16 TO 20:~MISSILE a,255,diff*2,50,63,128,254,64:~AMMO a,255: NEXT a
  550 LET spr=0
  560 IF sfx=1 THEN ~MISSOUND 15
  570 fade 2
  580 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
  590 REM ~PANEL "panel"
  600 GO SUB room:~VIEW
  610 ~COLOUR
  620 LABEL start
  630 DO 
  640 FOR outl=1 TO 25
  650 LET i=CODE INKEY$: IF i>192 AND i<197 THEN LET control=i-192:~SETINP 0,con
      trol,2,0,255,"11122310":SCOM 5
  660 IF i=192 THEN GO TO help
  670 ~FIRE 1+RND(24)
  680 ~MOVEALL:~VIEW
  690 ~FIRE 1+RND(24)
  700 ~HIT 0,LENGTH(0,hit): IF hit>0 THEN ~NEXTHIT LENGTH(0,hit): GO SUB hitit
  710 ~MISSHIT LENGTH(0,miss): IF miss<>255 THEN GO SUB misshit
  720 ~RAMMO 0,LENGTH(0,ammo):~PNUMA 88,168,3,48,ammo
  730 FOR spdup=1 TO 2
  740 ~MISSHIT LENGTH(0,miss): IF miss<>255 THEN GO SUB misshit
  750 ~MOVEALL:~VIEW
  760 ~FIRE 1+RND(24)
  770 ~FIRE 1+RND(24)
  780 ~FIRE 1+RND(24)
  790 ~SXPOS 0,LENGTH(0,x)
  800 ~SYPOS 0,LENGTH(0,y)
  810 IF y=17 THEN ugh
  820 IF rm=0 THEN GO TO 850
  830 IF x<4 THEN LET x=236 THEN LET rm=rm-1,rom=rom-1: GO SUB room
  840 IF rm=11 THEN GO TO 860
  850 IF x>236 THEN LET x=4 THEN LET rm=rm+1,rom=rom+1: GO SUB room
  860 NEXT spdup
  870 NEXT outl
  880 LOOP 
  890 LABEL room
  900 ~INKBLACK
  910 ~ROOM rm
  920 ~DJCLEAR 0,1
  930 ~SPUT 0,x,y,128
  940 RESTORE roomst(rom)
  950 FOR a=1 TO 256
  960 READ r,sp,sx,sy,xs,ys
  970 IF r>rm THEN GO TO 1020
  980 IF r<>rm THEN GO TO 1010
  990 IF sp<41 THEN LET pl=128: ELSE LET pl=1
 1000 IF dead(sp,rom)>0 THEN ~SPUT sp,sx,sy,pl:~SPEED sp,xs,ys:~NODEON sp
 1010 NEXT a
 1020 ~PNUMA 26,168,3,48,energy
 1030 ~PNUMA 222,168,1,48,keys
 1040 ~PNUMA 146,168,4,48,score
 1050 ~PNUMA 88,168,3,48,ammo
 1060 ~MOVEALL:~VIEW
 1070 ~VIEW:~COLOUR
 1080 RETURN 
 1090 LABEL rm0
 1100 DATA 0,45,128,31,2,0
 1110 DATA 0,44,150,97,0,2
 1120 DATA 0,46,114,111,0,0
 1130 DATA 0,41,114,50,0,0
 1140 DATA 0,1,68,104,0,0
 1150 DATA 0,6,34,33,2,0
 1160 DATA 0,11,226,145,-2,0
 1170 DATA 0,7,236,33,-2,0
 1180 DATA 0,16,100,160,2,0
 1190 DATA 0,26,4,48,0,0
 1200 LABEL rm1
 1210 DATA 1,44,48,31,0,2
 1220 DATA 1,42,64,127,2,0
 1230 DATA 1,45,128,97,0,2
 1240 DATA 1,46,48,33,0,0
 1250 DATA 1,6,82,33,-2,0
 1260 DATA 1,11,116,97,-2,0
 1270 DATA 1,7,228,145,-2,0
 1280 DATA 1,16,100,160,2,0
 1290 DATA 1,1,242,71,0,0
 1300 DATA 1,34,218,60,0,0
 1310 DATA 1,21,1,144,4,0
 1320 DATA 1,8,56,144,-2,0
 1330 DATA 1,2,161,71,0,0
 1340 LABEL rm2
 1350 DATA 2,44,102,97,0,2
 1360 DATA 2,45,128,97,0,-2
 1370 DATA 2,42,50,15,2,0
 1380 DATA 2,43,239,15,-2,0
 1390 DATA 2,46,116,34,0,0
 1400 DATA 2,49,160,114,0,0
 1410 DATA 2,41,223,82,0,0
 1420 DATA 2,6,146,33,-2,0
 1430 DATA 2,11,82,145,-2,0
 1440 DATA 2,1,36,71,0,0
 1450 DATA 2,38,190,111,0,0
 1460 DATA 2,32,236,81,0,0
 1470 DATA 2,16,100,160,2,0
 1480 LABEL rm3
 1490 DATA 3,42,0,15,2,0
 1500 DATA 3,43,239,15,-2,0
 1510 DATA 3,44,96,47,0,2
 1520 DATA 3,46,66,98,0,0
 1530 DATA 3,41,130,34,0,0
 1540 DATA 3,38,36,78,0,0
 1550 DATA 3,6,53,81,-2,0
 1560 DATA 3,11,204,97,-2,0
 1570 DATA 3,7,204,145,-2,0
 1580 DATA 3,1,100,22,0,0
 1590 DATA 3,16,100,160,2,0
 1600 DATA 3,37,206,58,0,0
 1610 LABEL rm4
 1620 DATA 4,42,0,15,2,0
 1630 DATA 4,43,160,47,0,2
 1640 DATA 4,44,128,127,-2,0
 1650 DATA 4,46,82,98,0,0
 1660 DATA 4,11,146,81,-2,0
 1670 DATA 4,6,68,145,-2,0
 1680 DATA 4,7,212,145,-2,0
 1690 DATA 4,21,235,144,-4,0
 1700 DATA 4,12,236,33,-2,0
 1710 DATA 4,1,148,71,0,0
 1720 DATA 4,2,98,23,0,0
 1730 DATA 4,16,100,160,2,0
 1740 DATA 4,36,192,98,0,0
 1750 LABEL rm5
 1760 DATA 5,46,64,34,0,0
 1770 DATA 5,43,88,31,0,2
 1780 DATA 5,44,160,95,0,-2
 1790 DATA 5,45,88,15,2,0
 1800 DATA 5,41,240,66,0,0
 1810 DATA 5,11,66,33,-2,0
 1820 DATA 5,12,178,97,-2,0
 1830 DATA 5,1,240,55,0,0
 1840 DATA 5,7,236,145,-2,0
 1850 DATA 5,8,4,145,2,0
 1860 DATA 5,2,178,135,0,0
 1870 DATA 5,3,66,135,0,0
 1880 DATA 5,35,224,48,0,0
 1890 DATA 5,16,100,160,2,0
 1900 DATA 5,31,60,98,0,0
 1910 LABEL rm6
 1920 DATA 6,43,239,127,-2,0
 1930 DATA 6,44,80,111,0,-2
 1940 DATA 6,45,128,111,0,-2
 1950 DATA 6,46,104,50,0,0
 1960 DATA 6,41,144,113,0,0
 1970 DATA 6,6,68,145,-2,0
 1980 DATA 6,11,146,49,-2,0
 1990 DATA 6,1,236,103,0,0
 2000 DATA 6,7,210,113,-2,0
 2010 DATA 6,21,235,111,-4,0
 2020 DATA 6,2,68,55,0,0
 2030 DATA 6,16,100,160,2,0
 2040 DATA 6,37,112,112,0,0
 2050 LABEL rm7
 2060 DATA 7,42,82,95,0,2
 2070 DATA 7,43,112,95,0,2
 2080 DATA 7,11,66,113,-2,0
 2090 DATA 7,44,0,127,2,0
 2100 DATA 7,45,148,63,0,2
 2110 DATA 7,1,130,24,0,0
 2120 DATA 7,6,52,65,2,0
 2130 DATA 7,2,240,24,0,0
 2140 DATA 7,7,212,145,-2,0
 2150 DATA 7,21,235,144,-4,0
 2160 DATA 7,16,100,160,2,0
 2170 DATA 7,31,186,54,0,0
 2180 LABEL rm8
 2190 DATA 8,11,82,145,-2,0
 2200 DATA 8,43,78,100,0,2
 2210 DATA 8,12,226,145,-2,0
 2220 DATA 8,42,120,127,-2,0
 2230 DATA 8,6,162,97,-2,0
 2240 DATA 8,7,84,33,-2,0
 2250 DATA 8,8,120,33,-2,0
 2260 DATA 8,1,122,23,0,0
 2270 DATA 8,41,78,33,0,0
 2280 DATA 8,44,142,100,0,-2
 2290 DATA 8,16,100,160,2,0
 2300 DATA 8,35,183,75,0,0
 2310 LABEL rm9
 2320 DATA 9,42,128,62,0,2
 2330 DATA 9,43,176,62,0,2
 2340 DATA 9,1,154,72,0,0
 2350 DATA 9,6,114,49,-2,0
 2360 DATA 9,11,114,129,-2,0
 2370 DATA 9,7,196,49,-2,0
 2380 DATA 9,8,236,129,-2,0
 2390 DATA 9,12,50,145,2,0
 2400 DATA 9,41,114,49,0,0
 2410 DATA 9,46,194,49,0,0
 2420 DATA 9,13,50,33,-2,0
 2430 DATA 9,35,50,49,0,0
 2440 DATA 9,16,100,160,2,0
 2450 LABEL rm10
 2460 DATA 10,42,192,100,0,2
 2470 DATA 10,43,100,32,-2,0
 2480 DATA 10,44,80,100,0,2
 2490 DATA 10,45,150,128,2,0
 2500 DATA 10,11,48,49,-2,0
 2510 DATA 10,6,114,145,-2,0
 2520 DATA 10,7,50,129,-2,0
 2530 DATA 10,8,178,97,-2,0
 2540 DATA 10,12,194,49,-2,0
 2550 DATA 10,41,178,97,0,0
 2560 DATA 10,46,195,47,0,0
 2570 DATA 10,1,209,135,0,0
 2580 DATA 10,31,232,53,0,0
 2590 DATA 10,16,100,160,2,0
 2600 LABEL rm11
 2610 DATA 11,6,98,145,-2,0
 2620 DATA 11,42,120,100,0,2
 2630 DATA 11,1,146,88,0,0
 2640 DATA 11,2,166,22,0,0
 2650 DATA 11,11,230,97,-2,0
 2660 DATA 11,43,160,128,-2,0
 2670 DATA 11,44,200,16,-2,0
 2680 DATA 11,45,120,100,0,-2
 2690 DATA 11,12,104,33,-2,0
 2700 DATA 11,16,140,160,-2,0
 2710 DATA 11,21,235,97,-2,0
 2720 DATA 11,38,50,32,0,0
 2730 DATA 11,41,122,33,0,0
 2740 DATA 11,35,188,146,0,0
 2750 DATA 11,31,124,84,0,0
 2760 DATA 11,30,226,97,0,0
 2770 DATA 256,0,0,0,0,0
 2780 LABEL hitit
 2790 IF hit=30 THEN SCOM 2:~SMERGE 30,154:~ANIMATE 30,13:~XEDGE 0,3,3:~SPEED 0,
      1,0: DO :~MOVEALL:~VIEW: PAUSE 2: LOOP :yipee
 2800 IF hit=21 THEN LET energy=energy-10: GO TO 2920
 2810 IF hit>37 AND hit<41 THEN LET energy=energy-10:~ANIMOFF hit,12,9,1: LET de
      ad(hit,rom)=0: GO TO 2920
 2820 IF hit=31 THEN ~AMMADD 0,50: LET score=score+5,dead(hit,rom)=0:~ANIMOFF hi
      t,64,9,1: GO TO 2920
 2830 IF hit=32 THEN ~AMMADD 0,25: LET dead(hit,rom)=0,score=score+5:~ANIMOFF hi
      t,64,9,1: GO TO 2920
 2840 IF hit=33 THEN LET dead(hit,rom)=0,score=score+10:~ANIMOFF hit,64,9,1: GO 
      TO 2920
 2850 IF hit>33 AND hit<38 THEN LET energy=energy+25,score=score+5,dead(hit,rom)
      =0:~ANIMOFF hit,64,9,1: GO TO 2920
 2860 IF hit>25 AND hit<30 THEN LET keys=keys+1:~ANIMOFF hit,64,9,1: LET dead(hi
      t,rom)=0:SCOM 5: GO TO 2920
 2870 IF hit<26 THEN LET dead(hit,rm+1)=dead(hit,rm+1)-0.2: LET energy=energy-1
 2880 IF dead(hit,rom)<=0 THEN LET ded=hit : GO SUB ammoff: LET score=score+dead
      p(hit): GO TO 2920
 2890 IF hit=46 OR hit=41 THEN ~JUMP 0,6:SCOM 7: GO TO 2920
 2900 IF hit=48 THEN ~JUMP 0,7:SCOM 7: GO TO 2920
 2910 IF hit=49 OR hit=40 THEN ~JUMP 0,7:SCOM 7
 2920 IF energy<=0 THEN ugh
 2930 IF score<0 THEN LET score=0
 2940 ~PNUMA 26,168,3,48,energy
 2950 ~PNUMA 222,168,1,48,keys
 2955 ~PNUMA 146,168,4,48,score
 2960 RETURN 
 2970 LABEL misshit
 2980 IF miss<>0 THEN ~FIRE miss
 2990 IF miss=0 THEN LET energy=energy-5: GO TO 3030
 3000 IF miss>25 THEN RETURN 
 3010 LET dead(miss,rm+1)=dead(miss,rm+1)-1
 3020 IF dead(miss,rm+1)<=0 THEN LET ded=miss: GO SUB ammoff: LET score=score+de
      adp(miss)
 3030 IF energy<=0 THEN ugh
 3040 IF score<0 THEN LET score=0
 3050 ~PNUMA 26,168,3,48,energy
 3060 ~PNUMA 146,168,4,48,score
 3070 RETURN 
 3080 LABEL scom
 3090 FOR a=1 TO 15
 3100 ~SCOM a
 3110 PAUSE 0
 3120 NEXT a
 3130 LABEL HELP
 3140 RESTORE 3490
 3150 FOR loopit=1 TO 5
 3160 LABEL hel
 3170 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 3180 ~TEXTA 66,180,"QUICK GUIDE HELP"
 3190 FOR hy=1 TO 5
 3200 READ spr,text$,po$
 3210 ~SPUT spr,20,160-(hy*25),128
 3220 ~TEXTA 50,152-(hy*25),text$
 3230 ~TEXTA 200,152-(hy*25),po$
 3240 IF hy=4 AND loopit=5 THEN GO TO 3260
 3250 NEXT hy
 3260 ~COLOUR:~VIEW
 3270 PAUSE 
 3280 NEXT loopit
 3290 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 3300 ~TEXTA 68,180,"QUICK GUIDE HELP"
 3310 ~TEXTA 78,160,"INJURY LISTING"
 3320 FOR a=1 TO 5
 3330 READ text$,num
 3340 ~TEXTA 10,140-(a*10),text$
 3350 ~PNUMA 238,140-(a*10),2,48,num
 3360 NEXT a
 3370 ~VIEW:~COLOUR: PAUSE 
 3380 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 3390 ~TEXTA 66,180,"QUICK GUIDE HELP"
 3400 ~TEXTA 76,160,"CONTROL METHOD"
 3410 FOR a=1 TO 4
 3420 READ text$
 3430 ~TEXTA 56,140-(a*10),text$
 3440 NEXT a
 3450 ~VIEW:~COLOUR: PAUSE 
 3460 ~INKBLACK:~FULLCLEAR:~CTEXT:~VIEW
 3470 GO SUB room
 3480 GO TO start
 3490 DATA 0,"SAFARI SAM","   0"
 3500 DATA 1,"MONKEY"," -25"
 3510 DATA 6,"TRIBESMAN","  10"
 3520 DATA 11,"HUNTER","  25"
 3530 DATA 16,"PARROT"," -15"
 3540 DATA 38,"ANIMAL TRAP","   0"
 3550 DATA 21,"BARREL","   5"
 3560 DATA 26,"GOLD KEY","  10"
 3570 DATA 27,"SILVER KEY","  10"
 3580 DATA 28,"BLUE KEY","  10"
 3590 DATA 29,"RED KEY","  10"
 3600 DATA 30,"GREEN KEY","  10"
 3610 DATA 31,"50 AMMO","   5"
 3620 DATA 32,"25 AMMO","   5"
 3630 DATA 33,"TOKEN","  10"
 3640 DATA 34,"PIZZA 25 ENERGY","  5"
 3650 DATA 35,"LOLLY 25 ENERGY","  5"
 3660 DATA 36,"APPLE 25 ENERGY","  5"
 3670 DATA 37,"CAKE 25 ENERGY","  5"
 3680 DATA 42,"PLATFORM","  0"
 3690 DATA 46,"SPRING UP","  0"
 3700 DATA 47,"SPRING DOWN","  0"
 3710 DATA 48,"SPRING LEFT","  0"
 3720 DATA 49,"SPRING RIGHT","  0"
 3730 DATA "BULLET",5
 3740 DATA "SPEAR",5
 3750 DATA "NUT",5
 3760 DATA "BARREL",10
 3770 DATA "CONTACT",1
 3780 DATA "F1....JOYSTICK 1"
 3790 DATA "F2....CURSORS,SPACE"
 3800 DATA "F3....JOYSTICK 2"
 3810 DATA "F4....Q,A,O,P,SPACE"
 3820 LABEL ammoff
 3830 ~RIMAGE ded,LENGTH(0,a)
 3840 ~SXSPD ded,LENGTH(0,sx)
 3850 LET d=3
 3860 IF sx>0 THEN LET d=3
 3870 IF sx<0 THEN LET d=7
 3880 IF sx=0 THEN IF ded>0 THEN IF ded<6 OR ded>25 THEN LET d=9
 3890 FOR a=0 TO 4: LET md=ded+a: IF (md/5)<>INT (md/5) THEN NEXT a
 3900 IF md<21 THEN ~ANIMOFF ded,((md/5))+20,d,1: ELSE ~ANIMOFF ded,64,d,1
 3910 RETURN 
 3920 DEF PROC scom s
 3930 IF sfx=1 THEN ~SCOM s
 3940 END PROC 
 3950 DEF PROC fade d
 3960 RESTORE 4059+d
 3970 IF d=1 THEN FOR a=0 TO 15
 3980 IF d=2 THEN FOR a=15 TO 0 STEP -1
 3990 READ col
 4000 PAUSE d
 4010 FOR b=a TO 15
 4020 PALETTE b,col
 4030 NEXT b
 4040 NEXT a
 4050 END PROC 
 4060 DATA 0,0,8,5,7,13,15,82,112,90,120,117,119,125,127,127
 4070 DATA 127,127,125,119,117,120,90,112,82,15,13,7,5,8,0,0
 4080 DEF PROC palblack: FOR a=1 TO 15: PALETTE a,0: NEXT a: END PROC 
 4090 DEF PROC yipee
 4100 ~INIT:palblack: PAUSE 2
 4110 ~PANEL "s3" 
 4120 fade 1
 4130 LET score$=STR$ score
 4140 LET s$="0000"
 4150 LET s$(5-LEN score$ TO 4)=score$
 4160 FOR a=1 TO 4: POKE (548747+a),VAL s$(a): NEXT a
 4170 PAUSE :fade 2
 4175 POKE 458755,0
 4180 LOAD "endit"
 4190 END PROC 
 4200 DEF PROC ugh
 4210 ~INIT:palblack: PAUSE 2
 4220 ~PANEL "s9"
 4230 fade 1: PAUSE :fade 2
 4231 LET score$=STR$ score
 4232 LET s$="0000"
 4233 LET s$(5-LEN score$ TO 4)=score$
 4234 FOR a=1 TO 4: POKE (548747+a),VAL s$(a): NEXT a
 4240 POKE 458755,1: LOAD "endit"
 4250 END PROC

endit

   10 LET diff=PEEK 458752
   15 LET dead=PEEK 458755
   20 LOAD "high" DATA high$
   30 palblack:~INIT: PAUSE 2
   35 IF dead=1 THEN palblack:~INIT: GO TO 80
   40 ~PANEL "s4"
   50 fade 1: PAUSE :fade 2:palblack:~INIT
   55 IF diff=10 THEN GO TO 80
   60 LET diff=diff+1
   70 POKE 458752,diff
   80 LET score$=""
   90 FOR a=1 TO 4: LET score$=score$+STR$ PEEK (458747+a): NEXT a
  100 LET score=VAL score$
  110 LET high=VAL high$(31-3 TO 31)
  112 IF high>score THEN GO TO 218
  113 ~MAINSCR:fade 1:~VIEW:fade 1: PAUSE 2
  115 ~PANEL "s6":fade 1
  120 LET name$=""
  121 ~TEXTA 10,110,high$
  125 ~TEXTA 10,100,"                          "+score$:~VIEW
  130 DO 
  140 GET a$
  145 IF CODE a$=13 THEN GO TO 215
  150 IF CODE a$=12 AND LEN name$>0 THEN LET name$=name$(1 TO LEN name$-1): GO T
      O 180
  155 IF LEN name$=25 THEN GO TO 180
  160 LET f=CODE a$: IF f>96 AND f<123 THEN LET f=f-32,a$=CHR$ f
  170 LET name$=name$+a$
  180 ~TEXTA 10,100,"                          "+score$
  190 IF LEN name$>0 THEN ~TEXTA 10,100,name$
  200 ~VIEW
  210 LOOP 
  215 IF LEN name$=0 THEN GO TO 218
  216 LET high$(1 TO LEN name$)=name$: LET high$(31-3 TO 31)=score$
  217 SAVE "high" DATA high$
  218 IF dead=1 THEN FOR a=1 TO 4: POKE (458747+a),0: NEXT a
  219 fade 2: LOAD "level1"
  220 DEF PROC fade d
  230 RESTORE 329+d
  240 IF d=1 THEN FOR a=0 TO 15
  250 IF d=2 THEN FOR a=15 TO 0 STEP -1
  260 READ col
  270 PAUSE d
  280 FOR b=a TO 15
  290 PALETTE b,col
  300 NEXT b
  310 NEXT a
  320 END PROC 
  330 DATA 0,0,8,5,7,13,15,82,112,90,120,117,119,125,127,127
  340 DATA 127,127,125,119,117,120,90,112,82,15,13,7,5,8,0,0
  350 DEF PROC palblack: FOR a=1 TO 15: PALETTE a,0: NEXT a: END PROC

Acknowledgements

The following acknowledgements are taken from the game, and list contributors to the game itself and other tools/systems used in its creation.

Credits

  • Programming - Martin Fitzpatrick
  • Graphics - Martin Fitzpatrick
  • Sound FX - Martin Fitzpatrick
  • Game Design - Martin Fitzpatrick & Derek Morgan
  • Main Idea - Derek Morgan
  • Music - Rik Moore

Thanks

  • Geoff Winkless For the KEDisk Screen Compresser
  • GLENCO Software For creating SCADS
  • FRED For E-Tracker
  • Rik Moore For managing to write such good music at such short notice
  • Derek Morgan For designing Safari Sam when I was in a period of hopelessness as far as ideas went.
  • Whoever It Was For the untimely power cuts at all stages in making this game
  • And lastly, You… ..For buying this game and supporting my work.

Thanks once again for buying Safari Sam, hope you enjoy it! .


Discussion

Get my latest Python projects, tips & tutorials direct to your Inbox.