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:
- Lines 1–45: Title/intro sequence with scrolling text and a musical fanfare using BEEP.
- 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.
- Lines 175–250: Control instructions screen with character-by-character scrolling text, then game initialization.
- Lines 255–1060: Stage 1 — a horizontal scrolling shooter where the player shoots at enemies that traverse the screen row by row.
- Lines 2400–2890: Stage 2 — two simultaneous enemies descend at different speeds; the player must shoot each with a correctly colored projectile.
- Lines 3000–5575: Stage 3 — a single enemy descends from above; if it reaches the bottom it is “caged” and the cage count decrements.
- Lines 8500–8525: Shared mountain background drawing subroutine (PLOT/DRAW using READ/DATA).
- Lines 9000–9397: Hall of Fame name-entry keyboard, using a navigable on-screen alphabet grid.
- Lines 9500–9565: UDG loader — POKEs 168 bytes of bitmap data into UDG slots A through U.
- 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:
| UDGs | Purpose |
|---|---|
| \a \b \c \d | Balloon (2×2 block) |
| \e | Rope |
| \f \g | Arrow (left/right halves) |
| \h \i | Walking wolf |
| \j \k | Falling wolf |
| \l \m \n \o \p \q | Player cannon (3×2 block, 6 UDGs) |
| \r \s \t \u | Explosion/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.wandw1— remaining enemies/wave size;w1incremented by 5 each new cycle throughGO 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,t2without a precedingATkeyword, 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)comparesscto the numeric value ofj(1–10) rather thans(j), meaning the score table insertion logic is effectively broken — all scores ≥ 10 will always be inserted at positionj=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
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.


