Poojan

Developer(s): Jerry Cohler
Date: 198x
Type: Program
Platform(s): TS 2068
Tags: Arcade

Poojan is a multi-stage arcade-style shoot-em-up in which the player controls a cannon that fires projectiles at descending enemy characters (wolves) across three distinct gameplay modes. The program uses 21 user-defined graphics (UDGs A through U), loaded via a POKE loop at line 9500 that writes 168 bytes of bitmap data covering a balloon, rope, arrow, walking wolf, falling wolf, and additional animation frames. Stage progression modifies difficulty variables such as enemy descent speed (dis) and the number of enemies (w), with bonus pigs awarded at score thresholds. A Hall of Fame with on-screen name entry (lines 9000–9397) uses a cursor navigated across a three-row alphabetic grid using the same up/down/fire controls as the main game. The background scenery is drawn with PLOT/DRAW loops reading 136–152 data values to render a mountainous silhouette in INK 4.


Program Structure

The program is divided into several major functional blocks:

  1. Lines 1–45: Title/intro sequence with scrolling text and a musical fanfare using BEEP.
  2. Lines 50–165: Animated logo sequence — six columns of UDG sprites rise from the bottom of the screen, followed by vector-drawn letters (PLOT/DRAW) spelling out the game title using arcs and curves.
  3. Lines 175–250: Control instructions screen with character-by-character scrolling text, then game initialization.
  4. Lines 255–1060: Stage 1 — a horizontal scrolling shooter where the player shoots at enemies that traverse the screen row by row.
  5. Lines 2400–2890: Stage 2 — two simultaneous enemies descend at different speeds; the player must shoot each with a correctly colored projectile.
  6. Lines 3000–5575: Stage 3 — a single enemy descends from above; if it reaches the bottom it is “caged” and the cage count decrements.
  7. Lines 8500–8525: Shared mountain background drawing subroutine (PLOT/DRAW using READ/DATA).
  8. Lines 9000–9397: Hall of Fame name-entry keyboard, using a navigable on-screen alphabet grid.
  9. Lines 9500–9565: UDG loader — POKEs 168 bytes of bitmap data into UDG slots A through U.
  10. Lines 9600–9840: Game over, high score table insertion, and Hall of Fame display.

UDG System

Line 9500 runs a FOR x=0 TO 167 loop reading values from DATA lines 9505–9565 and POKEing them into USR "\a"+x, loading all 21 UDGs (A–U) in one pass. The REM comments embedded in the DATA lines document each sprite’s purpose:

UDGsPurpose
\a \b \c \dBalloon (2×2 block)
\eRope
\f \gArrow (left/right halves)
\h \iWalking wolf
\j \kFalling wolf
\l \m \n \o \p \qPlayer cannon (3×2 block, 6 UDGs)
\r \s \t \uExplosion/hit flash (2×2 block)

Sprite Animation and Enemy Drawing

Enemy sprites use a four-character tall 2-column layout: UDGs \a\b (top row, colored with INK i), \c\d (second row), \j\k (bottom two rows in INK 7). Stage 1 uses a computed GO TO at line 100 — GO TO 100+(x*10) — to dispatch to one of six subroutines (lines 110–160) that draw the individual title letters using PLOT, DRAW (including arc parameters), and CIRCLE commands. This is a clean jump-table idiom in BASIC.

Enemy descent in Stage 1 is driven by the loop variable t across lines 550–1060. Hit detection at line 1020 uses ATTR (x2,y)=64+i, comparing the screen attribute of the bullet’s current cell against the expected ink color of the enemy. Stage 2 adds a second simultaneous enemy with independent descent counters y21 and y22 advancing at different rates (0.8 and 0.5 per iteration).

Stage Progression and Difficulty Scaling

Variables governing difficulty are modified between stages:

  • dis — minimum horizontal column for enemies; decremented by 2 each stage, floored at 6.
  • w and w1 — remaining enemies/wave size; w1 incremented by 5 each new cycle through GO SUB 8500/GO TO 255.
  • mnow — number of cage slots in Stage 3; decremented after each Stage 3 completion, floored at 3.
  • bon — bonus pig threshold, starting at 10,000 and increasing by 20,000 each time it is reached.

Bullet and Projectile Mechanics

The projectile is represented by UDGs \f\g (arrow). When SPACE is pressed and no bullet is in flight (y=22), x2 is set to x+1 (the row just below the gun), a$ is set to empty, and y begins decrementing. The bullet moves 2 rows per frame (LET y=y-2). If it exits the top of the play area (y<=2), it resets. Hit detection in Stage 3 at line 3670 also triggers a falling animation loop using PRINT AT with INK 2 to show the wolf tumbling down to row 20.

Player Movement

The player cannon occupies three rows (UDGs \l\m, \n\o, \p\q) at column 23 and moves vertically. Key “a” moves up (decrement x), “z” moves down (increment x). Upper and lower bounds differ per stage: rows 7–19 in Stage 1, 5–19 in Stages 2 and 3. The gun barrel graphic (\e) is printed one row above at column 23. A shadow character is erased at AT x+2,23 when moving up, and at AT x,23 when moving down, to clean up the sprite trail.

Hall of Fame Name Entry

Lines 9000–9397 implement an on-screen keyboard. Three rows of letters (lines 2, 4, 6 of the DIM’d m$(6,30)) are displayed, and a cursor ("_" printed with OVER 1) is navigated using “a” (right), “z” (left), and SPACE (select). The rows contain:

  • Row 2: A–K
  • Row 4: L–V
  • Row 6: W–Z, period, question mark, END, RUB

Selecting “RUB” (y=24, x=6) deletes the last character; selecting “END” (y=20, x=6) exits to the Hall of Fame display. Navigation wraps around: going past column 25 on row 2 drops to row 4, then row 6, and looping back. There are several special-case corrections (lines 9062–9065, 9080–9095) to handle the irregular spacing of END and RUB in the third row. Note a minor bug at line 9012: PRINT AT 18,z+3;z$; prints the entire z$ string on each iteration rather than z$(z) — the scrolling reveal effect is broken for this line only.

Background Drawing

The mountain silhouette is drawn by a PLOT/DRAW loop reading a DATA table of horizontal segment lengths. Lines 300–316 handle Stage 1’s 136-entry table (rows 0–135), while GO SUB 8500 uses a 152-entry table. The last 8 values in the 316/8515 DATA blocks (156, 161, 163…) are larger numbers representing the flat top of the mountain ridge at upper-screen rows, creating a plateau effect.

Notable Anomalies

  • Line 2025 contains a bare coordinate u+2,t2 without a preceding AT keyword, which would cause a syntax error or unexpected behavior when that branch is reached.
  • Line 9600 has a double semicolon in PRINT AT 11,11,;"gameover" — the comma after the second coordinate is extraneous but may be silently ignored.
  • Line 9610: IF sc<(j) compares sc to the numeric value of j (1–10) rather than s(j), meaning the score table insertion logic is effectively broken — all scores ≥ 10 will always be inserted at position j=10.
  • Line 9300 is referenced by a GO TO from line 9042, but the actual label in the listing is 9305 — line 9300 does not exist, so this is a GO TO to a non-existent line (a recognized BASIC technique that simply falls through to the next available line, 9305).

Content

Appears On

Related Products

Related Articles

Related Content

Image Gallery

Source Code

    1 REM ***********************         *Underlined characters*         *are entered in       *         *GRAPHICS mode.       *         ***********************     
   20 CLS :PRINT AT 10,0;"READING GRAPHICS;PLEASE WAIT."
   30 GO SUB 9500
   40 INK 7:PAPER 0:BORDER 0:BRIGHT 1:CLS 
   45 LET z$="J.C.PRODUCTIONS PRESENTS":FOR z=1 TO LEN z$:PRINT AT 3,z+3;z$(z):PAUSE 5:NEXT z:RESTORE 45:FOR n=1 TO 3:READ t:BEEP .15,t:NEXT n:DATA 0,2,4:BEEP .35,7:BEEP .20,4:BEEP .3,7
   50 RESTORE 50:DIM a(6):FOR t=1 TO 6:READ a(t):NEXT t:DATA 10,12,14,16,18,20:FOR x=1 TO 6:FOR y=20 TO 10 STEP -1:PRINT AT y,a(x); INK x+1;"\c\d"; AT y-1,a(x); INK x+1;"\a\b":BEEP .025,y/x::PRINT AT y,a(x);"  ":NEXT y:PRINT AT y+1,a(x); INK x+1;"\c\d":PRINT AT 3,4; INK x+1; BRIGHT 1;"J.C.PRODUCTIONS PRESENTS":NEXT x
   60 INK 6:BRIGHT 1:FOR x=1 TO 6:PRINT AT 9,a(x);"\r\s"; AT 10,a(x);"\t\u":BEEP .01,0:BEEP .01,5:BEEP .01,10:PRINT AT 9,a(x);"  "; AT 10,a(x);"  ":GO SUB 100:NEXT x
   70 GO TO 165
  100 GO TO 100+(x*10)
  110 PLOT 84,90:DRAW 0,10:DRAW 10,-1,-1.5:DRAW -7,-5,-1.5:DRAW 0,2:DRAW 3,3,.5:RETURN  
  120 CIRCLE 102,95,6:CIRCLE 102,95,4:RETURN 
  130 CIRCLE 118,95,6:CIRCLE 118,95,4:RETURN 
  140 PLOT 128,88:DRAW 5,0:DRAW 5,13,1.5:DRAW -7,0:DRAW 0,-2:DRAW 5,0:DRAW -5,-9,-2.5:DRAW -3,0:DRAW 0,-2:RETURN 
  150 PLOT 144,90:DRAW 0,8:DRAW 14,0,-2:DRAW 0,-8:DRAW -3,0,-2:DRAW 0,4:DRAW -8,0:DRAW 0,-4:DRAW -2,0,-2:PLOT 147,97:DRAW 6,0:DRAW -6,0,1:RETURN 
  160 PLOT 163,92:DRAW 0,10:DRAW 3,0,-1:DRAW 10,-10,2:DRAW 0,10:DRAW 3,0,-1:DRAW 0,-13:DRAW -3,0:DRAW -10,5,-2:DRAW 0,-5:DRAW -3,0,-2:DRAW 0,3:RETURN 
  165 FOR t=1 TO 2:FOR y=0 TO 1:FOR x=1 TO 7:PLOT INK x; BRIGHT y;56,72:DRAW INK x; BRIGHT y;150,0:BEEP .02,0:DRAW INK x; BRIGHT y;0,48:BEEP .02,7:DRAW INK x; BRIGHT y;-150,0:BEEP .02,9:DRAW INK x; BRIGHT y;0,-48:BEEP .02,5:NEXT x:NEXT y:NEXT t
  170 BEEP 1,0:BEEP 1,-12
  175 DIM s(10):DIM n$(10,20):FOR t=1 TO 10:LET n$(t)=" ?????????????????? ":NEXT t
  180 INK 6:BRIGHT 1:CLS 
  185 LET z$="CONTROL":FOR z=1 TO LEN z$:PRINT AT 2,z+12;z$(z);:PAUSE 2:NEXT z
  187 LET z$="UP    ..........KEY A":FOR z=1 TO LEN z$:PRINT AT 6,z+5;z$(z);:PAUSE 2:NEXT z
  189 LET z$="DOWN ........... KEYZ":FOR z=1 TO LEN z$:PRINT AT 8,z+5;z$(z);:NEXT z
  191 LET z$="FIRE............ SPACE":FOR z=1 TO LEN z$:PRINT AT 10,z+5;z$(z);:PAUSE 2:NEXT z
  193 LET z$=  " 2 BONUS PIGS AT 10,000 AND ":FOR z=1 TO LEN z$:PRINT AT 19,z+1;z$(z);:PAUSE 2:NEXT z
  195 LET z$="EVERY 20,000":FOR z=1 TO LEN z$:PRINT AT 21,z+9;z$(z);:PAUSE 2:NEXT z
  199 PAUSE 50:LET z$="Press any key to play.":FOR z=1 TO LEN z$:PRINT #1; AT 1,z+5;z$(z);:PAUSE 2:NEXT z
  200 FOR k=0 TO 800:IF INKEY$="" THEN NEXT k:GO TO 9800
  250 LET bon=10000:LET mnow=5:LET dis=12:LET cag=2:LET now=19:LET pig=10:LET sc=0:LET w=10:LET stage=1:LET w1=5
  255 INK 5:BORDER 0:BRIGHT 1:PAPER 0:CLS 
  280 LET w1=w1+5
  285 LET w=w1+5:IF w>40 THEN LET w=40
  290 LET dis=dis-2
  295 IF dis <=6 THEN LET dis=6
  297 LET z$= "STAGE ":FOR z=1 TO LEN z$:PRINT AT 10,11+z;z$(z);:PAUSE 3:NEXT z:PRINT stage 
  300 RESTORE 301:FOR x=0 TO 135:READ a:PLOT INK 4; BRIGHT 1;0,x:DRAW INK 4; BRIGHT 1;a,0:NEXT x
  301 DATA 36,34,32,30,28,26,25,24
  302 DATA 23,23,23,22,22,21,21,21
  303 DATA 21,21,22,22,22,22,22,23
  304 DATA 23,23,23,23,22,22,22,21
  305 DATA 21,21,21,20,20,20,20,20
  306 DATA 20,20,20,20,20,20,20,20
  307 DATA 20,20,21,21,21,21,21,21
  308 DATA 21,22,22,22,22,22,22,23
  309 DATA 23,23,23,23,23,23,23,22
  310 DATA 22,21,21,22,22,23,23,23
  311 DATA 23,23,22,22,22,22,21,21
  312 DATA 21,21,22,23,22,21,21,21
  313 DATA 20,20,20,19,19,19,19,19
  314 DATA 19,19,19,19,19,19,20,20
  315 DATA 20,20,21,21,21,21,21,22
  316 DATA 156,161,163,166,171,173,175,176
  317 DATA 176,176,175,174,173,172,172,173
  325 PRINT AT 0,0;"\:'\''\''\''\: "; AT 1,0;"\:    \: "; AT 2,0;"\:.\..\..\..\: "
  330 PRINT AT 0,8;"SCORE:";sc
  335 PRINT AT 12,25; INK 2; PAPER 0;"   \::"; AT 13,25;" \..\::\::\.."; AT 14,25;"\..\::\::\::\::\.."; AT 15,25;"\..\::\::\::\::\.."; AT 16,25; PAPER 1; INK 4; BRIGHT 0;"\::\::\::\::\::\::\::"; AT 17,25;"\::  \::\::\::\::"; AT 18,25;"\::\::\::\::\::\::\::"; AT 19,25;"\::\::\::  \::\::"; AT 20,25;"\::\::\:: \. \::\::"; AT 21,25;"\::\::\::  \::\::"
  340 FOR x=0 TO 7:PRINT AT x,23; INK 6;"\e":NEXT x
  345 PLOT 229,165:DRAW 26,0:DRAW 0,10:DRAW -26,0:DRAW 0,-10:PRINT AT 0,29; INVERSE 1; PAPER 1;"   "
  350 LET stage=stage+1:LET u=0:LET a$="\f\g":LET x2=2:LET y=22:LET x=7
  400 LET z$="READY ?":FOR z=1 TO LEN z$:PRINT AT 12,z+11;z$(z):PAUSE 3:NEXT z
  410 RESTORE 410:FOR n=1 TO 12:READ t:BEEP .30,t:NEXT n:DATA 12,10,9,7,5,2,0,0,2,5,4,7:BEEP .70,5:BEEP .30,5
  420 PRINT AT 10,12;"         "; AT 12,12;"      "
  500 LET i= INT (RND*5+1.5)
  501 IF i=5 THEN GO TO 500
  502 LET x3= INT ((dis+ RND*4)+.5)
  503 PRINT AT 1,1; INVERSE 1; PAPER 1;w;" "
  505 IF sc >=bon THEN LET pig=pig+2:LET bon=bon+20000
  510 PRINT AT 0,14;sc; AT 0,29; INVERSE 1;pig;" "
  515 IF pig=0 THEN GO TO 9600
  520 IF w=0 THEN PAUSE 50:GO TO 2400
  550 FOR t=1 TO x3
  552 LET t2=t-1
  555 IF t <>x3 THEN GO TO 750
  575 LET u=u+1
  578 IF u >=1 AND u <=7  THEN   GO TO 2000+u*5
  580 IF u >=19 THEN LET pig=pig-1:PRINT AT 16,26; INK 0; PAPER 4; BRIGHT 0;"MAMA!":BEEP .05,12:BEEP .05,6:BEEP .05,0:PRINT AT U-1,T2; PAPER 0;"  "; AT U,T2; PAPER 0;"  "; AT U+1,T2; PAPER 0;" "; AT U+2,T2; PAPER 0;" ":LET u=0:LET w=w-1:GO TO 500
  600 PRINT AT 16,25; INK 4; BRIGHT 0;"\::\::\::\::\::\::":PRINT AT u,t2; INK i;"\a\b"; AT u+1,t2; INK i;"\c\d"; AT u+2,t2; INK 7;"\j"; AT u+3,t2; INK 7;"\k"; AT u-1,t2; INK 0;"\::\::":GO TO 760
  750 PRINT AT 3,t; INK 7;"\h"; AT 4,t; INK 7;"\i"; AT 3,t-1;" "; AT 4,t-1;" "
  755 IF INKEY$= "" THEN GO TO 850
  765 IF INKEY$ = "a" THEN PRINT AT x+2,23;" "; AT x+1,21; "  ":LET x=x-1
  770 IF x <=7 THEN LET x=7
  780 IF INKEY$ ="z" THEN PRINT AT x,23;"\e"; AT  x+1,21;" ":LET x=x+1
  785 IF x >=19 THEN LET x=19
  810 IF y <>22 THEN GO TO 850
  820 IF INKEY$ =" " THEN LET x2=x+1:LET y=y-1:LET  a$=""
  850 PRINT AT x,23; INK 6;"\l\m"; AT x+1,23; INK 6;"\n\o"; AT x+2,23; INK 6;"\p\q"; AT x-1,23; INK 6;"\e"; AT x+1,21; INK 5;a$
  860 IF t=x3 AND y <>22 THEN GO TO 890
  870 IF t=x3 THEN  GO TO  575
  880 IF y=22   THEN NEXT t
  900 LET y=y-2
 1000 IF y <=2 THEN PRINT AT x2,3;"   ":LET y=22:LET x2=2:LET a$="\f\g":GO TO 1050
 1010 PRINT AT x2,y+2;"  "
 1020 IF ATTR (x2,y)=64+i THEN  PRINT AT u,t2;"\r\s"; AT u+1,t2;"\t\u":BEEP .01,0:BEEP .01,5:BEEP .01,10:LET w=w-1:LET sc=sc+(20-u)*10:PRINT AT 0,14;sc:PRINT AT u,t2;"   "; AT u+1,t2;"   ":FOR z=u+2  TO 20:PRINT AT z,t2; INK 2; BRIGHT 1;"\j"; AT z+1,t2; INK 2; BRIGHT 1;"\k"; AT z-1,t2; INK 0;"\::":NEXT z:PRINT AT z-1,t2;""; AT z,t2; " ":BEEP .01,-1:LET a$="\f\g":LET y=22:LET u=0:GO TO 500
 1030 IF ATTR (x2,y)=71  THEN  LET sc=sc+10:PRINT AT 0,14;sc:PRINT AT u+2,y;"  "; AT u+3,y;"  ":BEEP .01,6:BEEP .01,12:LET a$="\f\g": LET y=22:GO TO 575 
 1045 PRINT AT x2,y; INK 5;"\f\g"
 1050 IF t=x3 THEN GO TO 575
 1060 NEXT t
 2005 PRINT AT u,t2; INK i;"\a\b"; AT u+1,t2; INK i;"\c\d"; AT u+2,t2; INK 7;"\j"; AT u+3,t2; INK 7;"\k"; AT 0,5; INK 5;"   SCORE:";sc;"  ":GO TO 760
 2010 PRINT AT u,t2; INK i;"\a\b"; AT u+1,t2; INK i;"\c\d"; AT u+2,t2; INK 7;"\j"; AT u+3,t2; INK 7; PAPER 4;"\k"; AT u-1,t2; PAPER 0;"  ":GO TO 760 
 2015 PRINT AT u,t2; INK i;"\a\b"; AT u+1,t2; INK i; "\c\d"; AT u+2,t2; INK 7; PAPER 4;"\j"; AT u+3,t2; INK 7; PAPER 4;"\k"; AT u-1,t2; PAPER 0;"  ": GO TO 760
 2020 PRINT AT u,t2; INK i;"\a\b"; AT u+1,t2; INK i; PAPER 4;"\c\d"; AT u+2,t2; INK 7; PAPER 4;"\{18}\{1}\j"; AT u+3,t2; INK 7; PAPER 0;"\k"; AT u-1,t2; PAPER 0;"  ":GO TO 760 
 2025 PRINT AT u,t2; INK i; PAPER 4;"\a\b"; AT u+1,t2; INK i; PAPER 4;"\c\d";u+2,t2; INK 7; PAPER 0;"\j"; AT u+3,t2; INK 7; PAPER 0;"\k"; AT u-1,t2; PAPER 0;"  ":GO TO 760
 2030 PRINT AT u,t2; INK i; PAPER 4;"\a\b"; AT u+1,t2; INK i; PAPER 0;"\c\d"; AT u+2,t2; INK 7; PAPER 0;"\j"; AT u+3,t2; INK 7; PAPER 0;"\k"; AT u-1,t2; PAPER 4;"  ": GO TO 760
 2035 PRINT AT u,t2; INK i; PAPER 0;"\a\b"; AT u+1,t2; INK i; PAPER 0;"\c\d"; AT u+2,t2; INK 7; PAPER 0;"\j"; AT u+3,t2; INK 7; PAPER 0;"\k"; AT u-1,t2; PAPER 4;"  ": GO TO 760
 2400 INK 5:PAPER 0:BORDER 0:BRIGHT 1:CLS :LET z$="CHANGE STAGE":FOR z=1 TO LEN z$:PRINT AT 10,z+8;z$(z);:PAUSE 3:NEXT z:GO SUB 8500
 2403 DIM b(10,2)
 2405 FOR t=1 TO 10
 2410 FOR r=1 TO 2
 2415 LET b(t,r)= INT ((dis+ RND*4)+.5)
 2420 NEXT r
 2425 IF b(t,1)=b(t,2) THEN  GO TO 2410
 2430 NEXT t
 2506 PRINT AT 0,0;"\:'\''\''\''\: "; AT 1,0;"\:    \: "; AT 2,0;"\:.\..\..\..\.:" 
 2507 FOR x=0 TO 7:PRINT AT x,23; INK 6;"\e":NEXT x
 2510 PRINT AT 12,25; INK 2; PAPER 0;"   \::"; AT 13,25;" \..\::\::\.."; AT 14,25;" \.:\:: \::\:."; AT 15,25;"\.:\::\::\::\::\::\:."; AT 16,25; PAPER 1; INK 4; BRIGHT 0;"\::\::\::\::\::\::\::"; AT 17,25;"\::  \::\::\::\::"; AT 18,25;"\::\::\::\::\::\::\::"; AT 19,25;"\::\::\::  \::\::"; AT 20,25;"\::\::\:: \. \::\::"; AT 21,25;"\::\::\::  \::\::"
 2515 PRINT AT 0,8;"SCORE:";sc
 2517 LET z$="READY ?":FOR z=1  TO LEN z$:PRINT AT 12,11+z;z$(z);:PAUSE 3:NEXT z:LET stage=stage+1
 2518 RESTORE 2518:FOR n=1 TO 13:READ t:BEEP .30,t:NEXT n: DATA 0,4,0,5,0,7,5,4,4,5,2,0,-1: BEEP .45,0:PRINT AT 10,8;"             "; AT 12,12;"       " 
 2520 LET hit=0:LET r=0: LET count=10: LET x2=2: LET y=22: LET x=5:LET a$="\f\g"
 2525 LET r=r+1: LET vv=1: LET v=1: LET y21=20.6: LET y22=20.3
 2526  LET i1= INT (RND*6+1.5):IF i1=5 THEN  GO TO 2526 
 2527  LET  i2= INT (RND*6+1.5):IF i2=5 THEN GO TO  2526
 2528 IF i1=i2 THEN GO TO 2527
 2530 IF r=11 THEN GO TO 2850
 2532 IF sc >=bon  THEN LET pig=pig+2:  LET bon=bon+20000
 2535 PRINT AT 1,1; INVERSE 1; INK 5;11-r;" "
 2555 IF v=0  AND vv=0  THEN GO TO  2525
 2557 IF v=0  THEN GO TO 2575
 2560 LET y21=y21-.8
 2565 IF INT (y21+.5) <=5  THEN  PRINT AT 5,b(r,1);"\r\s"; AT 6,b(r,1);"\t\u":BEEP .01,0:BEEP .01,5:BEEP .01,10:PRINT AT 5,b(r,1);"  "; AT 6,b(r,1);"  ":LET v=0: GO TO 2572
 2570 PRINT AT y21,b(r,1); INK i1;"\c\d"; AT y21-1,b(r,1); INK i1;"\a\b"; AT y21+1,b(r,1); INK 0;"\::\::"
 2572 IF vv=0  THEN  GO TO 2600
 2575 LET y22=y22-.5
 2580 PRINT AT y22,b(r,2); INK i2;"\c\d"; AT y22-1,b(r,2); INK i2;"\a\b"; AT y22+1,b(r,2); INK 0;"\::\::"
 2585 IF INT (y22+ 5) <=6  THEN  PRINT AT 5,b(r,2);"\r\s"; AT 6,b(r,2);"\t\u": BEEP .01,0: BEEP .01,5: BEEP .01,10:PRINT AT 5,b(r,2);"  "; AT 6,b(r,2);"  ": LET y21=20: LET y22=20: GO TO 2525
 2590 IF INKEY$=""  THEN  GO TO 2700
 2600  IF INKEY$="a"  THEN  PRINT AT x+2,23;"  "; AT x+1,21;"  ": LET x=x-1
 2605   IF x <=5  THEN  LET x=5
 2610  IF INKEY$="z"  THEN PRINT  AT x,23;"  "; AT x+1,21;" ":LET  x=x+1 
 2615 IF  x >=19  THEN LET x=19
 2617 IF  y <>22  THEN GO TO 2700
 2620 IF INKEY$ =" " THEN LET x2=x+1:LET a$="" :LET y=y-1
 2700 PRINT AT x,23; INK 6;"\l\m"; AT x+1,23; INK 6;"\n\o"; AT x+2,23; INK 6;"\p\q" ; AT x-1,23; INK 6;"\e"; AT x+1,21; INK 5;a$ 
 2800  IF y=22  THEN  GO TO 2550
 2802  LET y=y-2
 2803 IF y <=2 THEN PRINT  AT x2,3;"  ":LET a$="\f\g":LET y=22: GO TO 2550
 2804  PRINT AT x2,y+2;"  "
 2807 IF ATTR  (x2,y)=64+i2  THEN PRINT AT y22-1, b(r,2);"\r\s"; AT y22,b(r,2);"\t\u"; AT x2,y+2;"   ":BEEP .01,0:BEEP .01,5:BEEP .01,10:PRINT AT y22-1,b(r,2);"  "; AT y22,b(r,2);"  ":LET y=22:LET a$="\f\g":LET vv=0:LET sc=sc+b(r,2)*15:PRINT AT 0,14;sc:LET hit=hit+1: GO TO 2555 
 2810 IF ATTR (x2,y)=64+i1 THEN  PRINT AT y21-1, b(r,1);"\r\s"; AT y21,b(r,1);"\t\u"; AT x2,y+2;"  ":BEEP .01,0:BEEP .01,5:BEEP .01,10:PRINT AT y21-1,b(r,1);"  "; AT y21,b(r,1);"  ":LET y=22:LET a$="\f\g":LET v=0:LET sc=sc+b(r,2)*25:PRINT AT 0,14;sc:LET hit=hit+1: GO TO 2555
 2815 PRINT AT x2,y; INK 5;"\f\g"
 2825 GO TO 2550
 2850 FOR g=0 TO 100:CLS 
 2855 LET z$="NUMBER OF HITS:":  FOR g=1 TO LEN z$:PRINT AT 8,g+6;z$(g):PAUSE 3:NEXT g:PRINT   INK 7;hit
 2869 LET z$="BONUS :100X": FOR g=1 TO LEN z$: PRINT AT 10,g+5;z$(g);:PAUSE 3:NEXT g:PRINT ;hit;"= "; INK 7;100*hit
 2870 IF hit=20 THEN  LET z$="EXTRA BONUS: 25,000 ":FOR g=1  TO LEN z$: PRINT AT 13,g+5; INK 6;z$(g):BEEP .07, CODE z$(g)-60:NEXT g: LET sc=sc+25000
 2880 LET sc=sc+hit*100
 2890 RESTORE 2890:FOR n=1  TO 8:READ t:BEEP .35,t:NEXT n: DATA 12,9,7,9,12,9,7,9:BEEP .5,5                    
 3000 INK 5:CLS :LET z$="STAGE":FOR z=1  TO LEN z$:PRINT AT 10,11+z;z$(z);:PAUSE 3:NEXT z:PRINT stage:LET stage=stage+1:  GO SUB 8500
 3010 LET now=19:LET w=w1+5:LET x2=2:LET x=5
 3100 PRINT AT 0,0;"\:'\''\''\''\: "; AT 1,0;"\:    \: "; AT 2,0;"\:.\..\..\.:"
 3105 FOR X=0 TO 7:PRINT AT X,23; INK 6;"\e":NEXT X
 3110  PRINT AT 12,25; INK 2; PAPER 0;"   \::"; AT 13,25;" \.:\::\:. "; AT 14,25;" \.:\:: \::\:."; AT 15,25;"\.:\::\::\::\::\::\:."; AT 16,25; PAPER 1; INK 4; BRIGHT 0;"\::\::\::\::\::\::\::"; AT 17,25;"\::  \::\::\::\::"; AT 18,25;"\::\::\::\::\::\::\::"; AT 19,25;"\::\::\::  \::\::"; AT 20,25;"\::\::\:: \. \::\::"; AT 21,25;"\::\::\::  \::\::"
 3115 PRINT AT 0,8;"SCORE:";sc
 3120 PRINT AT 1,19; INK 6;"\.:\''\:."; AT 2,19; INK 6;"\. \.:\:' "
 3130 PLOT 229,165:DRAW 26,0:DRAW 0,10:DRAW -26,0:DRAW 0,-10:PRINT AT 0,29; INVERSE 1; PAPER 1;"   "
 3140 LET z$="READY ?":FOR z=1  TO LEN z$:PRINT AT 12,11+z;z$(z);:PAUSE 3:NEXT z:FOR t=0 TO 80:NEXT t:PRINT AT 12,12;"       "; AT 10,12;"         "
 3150 LET y2=21:LET a$="\f\g": LET y=22
 3152 LET x3= INT ((dis+ RND*4)+.5)
 3155 LET i= INT (RND*5+1.5):IF i=5 THEN GO TO 3155
 3157 IF sc >=bon THEN  LET pig=pig+2:LET bon=bon+20000
 3160 PRINT AT 1,1; INVERSE 1; PAPER 1;w;" "; AT 0,29;mnow-(19-now)
 3165 IF 19-now=mnow  THEN  GO TO 5500
 3170 IF w=0  THEN  GO TO 5557
 3180 PRINT AT y2-1,x3; INK 7;"\j"; AT y2,x3; INK 7;"\k":GO TO 3500
 3200 LET y2=y2-1
 3210 IF y2 <=7  THEN GO TO 5000+y2 *5
 3220 PRINT AT y2-3,x3; INK i;"\a\b"; AT y2-2,x3; INK i;"\c\d"; AT y2-1,x3; INK 7;"\j"; AT y2,x3; INK 7;"\k"; AT y2+1,x3; INK 0;"\::"; AT y2-1,x3+1;"\::"
 3400 IF INKEY$="" THEN GO TO  3600
 3500 IF INKEY$="a"  THEN PRINT  AT x+2,23;"  "; AT x+1,21;"  ":LET x=x-1
 3505 IF x <=5  THEN  LET x=5
 3510 IF INKEY$="z"  THEN PRINT  AT x,23;"  "; AT x+1,21;" ":LET  x=x+1
 3515 IF x >=19  THEN  LET x=19
 3520 IF y <>22  THEN GO TO 3600
 3530 IF INKEY$=" "  THEN LET x2= x+1: LET a$="": LET y=y-1
 3600 PRINT AT x,23; INK 6;"\l\m"; AT x+1,23; INK 6;"\n\o"; AT x+2,23; INK 6;"\p\q"; AT x-1,23; INK 6;"\e"; AT x+1,21; INK 5;a$
 3610 IF y=22  THEN  GO TO 3200
 3650 LET y=y-2
 3655 IF y <=2  THEN PRINT AT x2,3;"   ": LET a$="\f\g":LET y=22:GO TO 3200
 3660 PRINT AT x2,y+2;"  "
 3670 IF ATTR (x2,y)=64+i  THEN  PRINT AT y2-3,x3;"\r\s"; AT y2-2,x3;"\t\u":BEEP .01,0:BEEP .01,5: BEEP .01,10:PRINT AT y2-3,x3; INK 0;"\::\::"; AT y2-2,x3;"\::\::": FOR t=y2  TO 20: PRINT AT t,x3; INK 2;"\j"; AT t+1,x3; INK 2;"\k"; AT t-1,x3; INK 0;"\::":NEXT t:BEEP .01,-1:PRINT AT 20,x3; INK 0;"\::"; AT 21,x3;"\::":LET w=w-1: LET sc=sc+y2*10: PRINT AT 0,14;sc: GO TO 3150
 3680 IF ATTR (x2,y)=71  THEN  BEEP .01,6:BEEP .01,12: PRINT AT y2,x3; INK 0;"\::\::": LET sc=sc+10:LET a$="\f\g": LET y=22: GO TO 3200
 3900 PRINT AT x2,y; INK 5;"\f\g"
 4000 GO TO 3200
 5010 PRINT AT 1,x3; INK 7;"\j"; AT 2,x3;"\k"; AT 3,x3; INK 4;"\::"; AT 1,x3+1; INK 0;"\::"; AT 1,x3; INK 0;"\::"; AT 2,x3; INK 0;"\::": LET now=now-1:LET w=w-1: FOR t=now  TO 18:PRINT AT 1,t;"\m"; AT 2,t;"\i":NEXT t:LET y2=21: GO TO 3152
 5015 PRINT AT 1,x3; INK i;"\c\d"; AT 2,x3; INK 7;"\j"; AT 3,x3; PAPER 4;"\k"; AT 4,x3; INK 4;"\::"; AT 2,x3+1; INK 0;"\::":GO TO 3500
 5020 PRINT AT 1,x3; INK i;"\a\b"; AT 2,x3;"\c\d"; AT 3,x3; PAPER 4; INK 7;"\j"; AT 4,x3;"\k"; AT 5,x3; INK 0;"\::"; AT 3,x3+1; INK 4;"\::":  GO TO 3500
 5025 PRINT AT 2,x3; INK i;"\a\b"; AT 3,x3; PAPER 4;"\c\d"; AT 4,x3; INK 7;"\j"; AT 5,x3; PAPER 0;"\k"; AT 6,x3; INK 0;"\::"; AT 4,x3+1; INK 4;"\::":GO TO 3500
 5030 PRINT AT 3,x3; PAPER 4; INK i;"\a\b"; AT 4,x3;"\c\d"; AT 5,x3; PAPER 0; INK 7;"\j"; AT 6,x3;"\k"; AT 7,x3; INK 0;"\::"; AT 5,x3+1;"\::":GO TO 3500 
 5035 PRINT AT 4,x3; PAPER 4; INK i;"\a\b"; AT 5,x3; PAPER 0;"\c\d"; AT 6,x3; INK 7;"\j"; AT 7,x3;"\k"; AT 8,x3; INK 0;"\::"; AT 6,x3+1;"\::":GO TO 3500
 5500 PRINT AT 1,19;"   "; AT 2,19;"   "
 5510 FOR t=1  TO x-2:PRINT AT t,22; INK 6;"\.'\'." ; AT t+1,22; INK 6;"\. \.:\''"; AT t-1,22;" \e ":BEEP .01,0:BEEP .01,t:NEXT t
 5512 PRINT AT t-1,22;"\r:\s"; AT t,22;"\t:\t":PAUSE 5
 5515 PRINT AT t-1,22;"   "; AT t,22;"   "
 5517 PRINT AT x+1,21;"  "
 5520 FOR t=x+2  TO 21
 5540 PRINT AT t-2,23; INK 6;"\l\m"; AT t-1,23; INK 6;"\n\o"; AT t,23; INK 6;"\p\q"; AT t-3,23;"  ":BEEP .01,6:BEEP .01,2*t
 5545 NEXT t
 5550 PRINT AT 19,23;"\r\s"; AT 20,23;"_"; AT 21,23;"\t\u":BEEP .01,0:BEEP .01,5:BEEP .01,0
 5555 PRINT AT 19,23;"  "; AT 20,23;"  "; AT 21,23;"  ":PAUSE 5:LET cag=cag-1
 5557 CLS :PRINT AT 0,10;"SCORE:";sc:LET z$="PIGS LEFT : ":\{20}\{0} FOR t=1 TO LEN z$:PRINT AT 10,t+9;z$(t);:PAUSE 5:NEXT t:PRINT pig
 5565 LET z$="CAGES LEFT : ":FOR z=1 TO LEN z$:PRINT AT 12,z+8;z$(z);:PAUSE 5:NEXT z:PRINT cag
 5567 IF cag <=0 THEN PAUSE 200:  GO TO 9600
 5570 PAUSE 100
 5575 LET mnow=mnow-1:IF mnow <=3 THEN LET mnow=3
 8499 GO TO 255
 8500 RESTORE 8505:FOR x=0  TO 151: READ a: PLOT  INK 4; BRIGHT 1;0,x:DRAW  INK 4; BRIGHT 1;a,0:NEXT x
 8505 DATA 36,34,32,30,28,26,25,23,23,23,23,22,22,21,21,21,21,21,22,22,22,22,22,23,23,23,23,23,22,22,22,21,21,21,21,20,20,20,20,20,21,21,21,21,21,21,22,22,22,23,23,23,22,23,22,21
 8510 DATA 20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,22,22,22,22,22,22,23,23,23,23,23,23,23,22,22,23,23,23,23,22,23,23,23,23,23,22,22,22,22,21,21,21,21,22,23,22,21,21,21,20,20,20,19,19,19,19,19
 8515 DATA 19,19,19,19,19,19,20,20,20,20,21,21,21,21,21,21,156,161,163,166,171,173,175,176,176,176,175,174,173,172,172,173
 8525 RETURN 
 9000 DIM m$(6,30): LET m$(2)="    A B C D E F G H I J K": LET M$(4)="    L M N O P Q R S T U V":LET M$(6)="    W X Y Z . ?   END RUB": LET n=1: INK 6: BRIGHT 1: CLS 
 9010 FOR a=2 TO 6 STEP 2:FOR b=1 TO 25:PRINT AT a,b;m$(a,b):NEXT b:NEXT a
 9012 LET z$="YOU MAY ENTER YOUR NAME.":FOR z=1  TO LEN z$:PRINT AT 18,z+3;z$;:PAUSE 2:NEXT z:LET z$="( USE UP/DOWN & FIRE   )":FOR z=1  TO LEN z$:PRINT AT 20,z+4;z$(z);:PAUSE 2:NEXT z
 9015 PLOT 48,78:DRAW INK 7;160,0:
 9020 LET x=2:LET y=5
 9030 PRINT AT x,y; OVER 1;"_"
 9037 PAUSE 0
 9040 IF INKEY$ <>"a" AND INKEY$ <>"z"  AND INKEY$ <>" " THEN GO TO  9037
 9042 IF INKEY$=" "  THEN BEEP .0 5,25: GO TO 9300
 9050 IF INKEY$="a"  THEN LET y=y +2
 9052 IF INKEY$="z"  THEN LET y=y -2: GO TO 9075
 9055 IF y>25  AND x=2  THEN PRINT AT 2,25; "\k": LET x=4: LET y=5: GO TO 9030 
 9060  IF y>25  AND x=4  THEN PRINT  AT 4,25;"V": LET x=6: LET y=5: GO TO 9030
 9062  IF x=6  AND y=19  THEN PRINT  AT 6,17;" ": LET x=6: LET y=20:GO TO 9030
 9064 IF x=6 AND y=22  THEN  PRINT AT 6,20;"N": LET x=6:LET y=24: GO TO 9030 
 9065  IF y=26  AND x=6  THEN  PRINT AT 6,24;"U": LET x=2: LET y=5: GO TO 9030 
 9070 PRINT AT x,y-2; OVER 0;m$(x,y-2):GO TO 9030
 9075 IF y<5  AND x=2  THEN  PRINT AT 2,5;"A": LET y=24: LET x=6:GO TO 9030
 9080 IF x=6  AND y=22  THEN  PRINT AT 6,24;"U": LET x=6: LET y=20
 9085  IF x=6 AND y=18 THEN  PRINT AT 6,20;"N": LET x=6: LET y=17
 9090 IF x=6  AND y<5  THEN  PRINT AT 6,5;"W": LET x=4: LET y=25
 9095 IF x=4  AND y<5  THEN  PRINT AT 4,5;"L": LET x=2:LET y=25
 9285 PRINT AT x,y+2;m$(x,y+2)
 9290 GO TO 9030
 9305  IF x=6  AND y=20  THEN  GO TO 9800
 9310  IF x <>6  OR y <>24  THEN  GO TO 9385
 9311 LET n$(j,n)="  ": PRINT AT 11,5+n;n$(j,n)
 9312 LET n=n-1:IF n<1  THEN  BEEP  .5,-5:BEEP .5,-12:LET n=1
 9315 GO TO 9037
 9385 LET n=n+1
 9390 IF n>19 THEN  GO TO 9800
 9395 LET n$(j,n)=M$(x,y)
 9397 PRINT AT 11,5+n;n$(j,n): GO TO 9037
 9400 GO TO 9030
 9499 STOP 
 9500 RESTORE 9505: FOR x=0 TO 167: READ v:POKE USR "\a"+x,v: NEXT x
 9505 DATA 3,15,19,55,103,111,127,127:REM 9505 TO 9520 > balloon(A,B,C,D)
 9510 DATA 192,240,248,252,254,254,254,254
 9515 DATA 127,127,63,15,3,1,1,1
 9520 DATA 254,254,252,240,192,178,128,128
 9525 DATA 1,1,1,1,1,1,1: REM >   rope (E)
 9530 DATA 0,8,24,48,127,48,24,8: REM 9530  TO 9535 > arrow (F,G)
 9535 DATA 0,1,2,4,255,4,2,1
 9540 DATA 160,224,176,255,245,250,127,112,112,252,200,208,208,200,254,254: REM > walking wolfe (H,I)
 9545 DATA 41,109,255,215,255,199,109,125,71,252,184,184,184,56,108,238:REM > falling wolve (J,K)
 9550 DATA 1,3,15,30,56,112,255,8,0,128,224,240,60,30,255,115,24,53,100,199,255,199,100,53,251,187,251,115,123,251,251,251,24,8,0,0,3,7,255,255,251,251,243,243,243,243,255,255,255
 9560 DATA 0,8,24,24,56,104,0,0,24,28,30,59,58,48,0,0,248,240,97,67,7,15,14,14,0,0,24,15,7,3,1,1
 9565 RETURN 
 9600 CLS :PRINT AT 11,11,;"gameover":PAUSE 150
 9602 IF sc<s(10)  THEN  GO TO 9800
 9605 FOR j=1 TO 10
 9610 IF sc<(j)  THEN  NEXT j
 9615 FOR c=9  TO j  STEP -1
 9620  LET n$(c+1)=n$(c): LET s(c+1)=s(c):NEXT c
 9625 LET s(j)=sc
 9627 LET n$(j)=""
 9638 GO TO 9000
 9800 CLS 
 9805 PRINT AT 3,10;"HALL OF FAME"
 9810 FOR z=1  TO 10: PRINT AT z+7,0;n$(z);" -  ";s(z): NEXT z
 9815 PLOT 0,0: DRAW INK 5;255, 0: DRAW INK 6;0,175:DRAW INK  7 ;-255,0: DRAW  INK 6;0,-175
 9820 PAUSE 50: LET z$="Press any key to play.": FOR z=1 TO LEN z$: PRINT #1; AT 1,z+5;z$(z);: NEXT z
 9830 FOR k=1 TO 5: FOR c=1 TO 7: PLOT INK c;0,0: DRAW  INK c;255,0:DRAW INK c;0,175: DRAW  INK c;-255,0: DRAW INK c;0,-175
 9835 IF INKEY$ <>""  THEN GO TO  9840
 9837  NEXT c:NEXT k:GO TO 180
 9840 GO TO 230

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

Scroll to Top