' ** SPACE.BAS VERS 2.3 APR16/98 by: NICK K. VAN VLIET
' ** SPACE IS BEAUTIFUL FULL OF RED, BLUE ABD GREEN GIANT STARS; TRAILING
' ** TAILS OF COMET ICE AND SOLAR WINDS..
' ** SPACE CAN BE NASTY WITH METEORITES AND SPACE JUNK
' ** YOUR A CARRIER GOING AT LIGHT SPEED
' ** YELLOW BLIPS ARE ALIEN /FRIENDLY SHIPS WAITING TO TRANSPORT SUPLIES AND
' ** MAIL IN RETURN FOR Fuel TO KEEP GOING, YOU ALSO HAVE SOLAR CELLS TO OP-
' ** PERATE A FRONT Laser CANNON TO GET RID OF RED SPACE JUNK AND GREEN
' ** COMETS. YELLOW BLIPS DISAPPEAR AS SHIPS ENTER HYPERSPACE AFTER FUELING
' ** YOUR CARRIER BUT IT IS SOMETIMES SITTING ON AN OLD JUNK PILE WHILE
' ** WAITING FOR YOUR SHIP! OR A RED JUNK MIGHT SPLIT INTO A GREEN METEOR.
' ** SOME METEORS REQUIRE VISUAL AIMING BECAUSE OF MAGNETIC DISTURBANCES.
' ** LOOKOUT FOR METEORS CROSSING YOUR PATH: THEY COME AND GO!
' ** NOTE: -ARROW KEYS GUIDE THE SHIP IN APROPREATE DIRECTIONS WITH OUTER
' ** RETRO JETS. REMEMBER SHIPS ARE ALWAYS MOVING AT AN ANGLE.
' ** -'F' KEY INCREAES SPEED.
' ** -'S' KEY SLOWS CRAFT DOWN.
' ** -'SPACE' KEY FIRES CANON DIRECTLY IN FRONT ON CROSS HAIRS.
' ** -LEFT VERT VINDOW IS TOP OF PATH FROM SATALLITE ZUES IN LIBRA.
' ** -RIGT VERT WINDOW IS SIDE VIEW OF PATH FROM LYRA IN ORION.
' ** -RIGHT MOST WINDOW IS A HUBBLE LIKE CAMERA VIEW OF SPACE IN FRONT.
' ** -TOPR RIGHT CROSS-HAIRS ARE AIMED DIRECTLY IN FRONT.
' ** -RIGHT BOTTOM CROSS-HAIRS IS A MONITOR OF THE FIRST 2 OBJECTS IN
' ** DIRECTLY IN FRONT OF PATH.
' ** -LOWEST RED TRIANGLE IS Fuel AVAILABLE : REPLENISHED BY OTHER SHIPS
' ** IT SERVICES INDICATED BY YELLOW
' ** -CYAN TRIANGLE ABOVE THAT IS THE ENERGY AVAILABLE: SUPPLIED BY SOLAR
' ** CELLS.
' ** -AREA BETWEEN Fuel AND SOLAR IS COMMUNICATION WINDOW TO OTHER SHIPS.
' ** -ABOVE THIS IS THE DISTANCE TRAVELED INDICATOR IN LIGHT YEARS
' ** -sometimes a ufo turns into a darelic so be careful there may be
' ** people on board!
' ** -Laser SHOOTS AUTO AT ANYTHING SOLID DIRECTLY INFRONT.
' ** -ARROW KEYS OR Pad WILL MOVE CROSSHAIRS TOWARD SHIP IN TARGET.
' ** -HIT A UFO AND YOU MUST PICK UP PASSENGERS - END OF GAME
' ** -GAME ENDS WHEN OUT OF Fuel AND ENERGY
' ** -GANE ENDS WITH A DIRECT HIT
' ** -YOUR SPACE SHIP IS CALLED SPARTA EMESARY FROM EARTH HEADING FOR
' ** THE NEAREST HABITABLE PLANET WILLING TO TRADE.
' ** -DONT HIT UFO'S AND RESIGN WHEN WHEN YOU SEE IT'S OVER!
' ** -SOME TIMES A UFO WAS SITTING ON AN ASRERIOD!
' ** RUNNING INTO ASTERIODS COST 30 UNITS SHOTS 10 UNITS EACH
' ** AT START IN SUB ENERGYLOSS USE u(2, 1) = 50 FOR DISPLAY 9 FOR GAME.
DEFDBL M-Z 'double
DEFINT A-O 'integers
TYPE HUES 'XYZpoint 'define the type for hues
red AS INTEGER 'red component
green AS INTEGER 'green component
blue AS INTEGER 'blue component
END TYPE
TYPE coord
x AS DOUBLE
Y AS DOUBLE
z AS DOUBLE
END TYPE
DECLARE FUNCTION lngth% ()
DECLARE SUB PaletteChng ()
DECLARE SUB SHIPLOCTN ()
DECLARE SUB TEST ()
DECLARE SUB MASK ()
DECLARE SUB SHIPS ()
DECLARE SUB LRVIEW ()
DECLARE SUB DOT ()
DECLARE SUB KeyAngle (ak, ap)
DECLARE SUB Arrws (e, an)
DECLARE SUB Pad (e, an)
DECLARE SUB LN ()
DECLARE SUB Laser (in, Y0)
DECLARE SUB EnergyLoss ()
DECLARE SUB Meteor (xb, YC, ad) 'red/green/yellow dsply
DECLARE SUB Fuel ()
DECLARE SUB Sort (a0, b0) '%
DECLARE SUB TargetSymb ()
DECLARE SUB Views (an)
DECLARE SUB EraseBorder ()
DECLARE SUB init (ANG) 'reset Meteor values
DECLARE SUB TARGT2 ()
DECLARE SUB TARGET () 'SCREEN TARGET
DECLARE SUB MeteoRay (a) 'METEOR RAY
DECLARE SUB DrawCircle (radi%, X0%, Y0%, Z0%) 'line %
DECLARE FUNCTION KeyOn% () '
DECLARE FUNCTION KeyVal% () '
COMMON SHARED a, B, c, d, aa, BB, cc, dd, strike$, ch, HITS, NoComet
COMMON SHARED r, W, x, Y, z, e, pal() AS HUES, MY, game
COMMON SHARED WW, XX, YY, zz, eE, X0, Y0, X1, y1, an, clr, display
CONST TRUE = -1
CONST FALSE = NOT TRUE
CONST METNUM = 6.5 '1/(METNUM)==># OF METEORS 7MAX
CONST NN = 20 'DATA ARRAY SIZE
CONST STP = 5 'STEP 360 DEGREES
CONST MAXX = 640 * 2 / 3 'half width 640 319+319/2
CONST MAXY = 480 / 2 - 40 'half height 200
CONST pi = 3.141592654# 'PI /7 = 0.44880 4 * ATN(1#) SEE LAST LINE
CONST XL = 319 / 2 + 50 'left boundary of viewport 209.5
CONST XH = XL / 2 'line between left/right window
CONST XM = XH / 2 - 1 'center of left vert window
CONST XC = XM + XH - 1 'center of right vert window
CONST yb = 480 * 3 / 4 'bottom boundary of viewport 360
CONST MD = 400 'FRONT OF SHIP
CONST YD = MD + 5 '460 'Meteor limit/REAR OF SHIP
CONST ST = 55 'METEOR START IN WINDOW
CONST FULL = 245 'energy level
REDIM SHARED x(360, NN + 1)
REDIM SHARED Y(2, NN + 6) '5 Sort
REDIM SHARED U(2, 1) 'FUEL/PWR
REDIM SHARED pal(256) AS HUES 'array for palette hues
U(1, 1) = FULL: U(2, 1) = FULL
CLS
COLOR 15
LOCATE 10, 10: PRINT "WOULD YOU LIKE DISPLAY OR GAME /G "; : INPUT U$
IF U$ = "G" OR U$ = "g" THEN game = TRUE ELSE game = FALSE
SCREEN 12 'high resolution graphics mode '640x480
RANDOMIZE TIMER 'seed random number generator
PaletteChng 'border trim
RANDOMIZE TIMER 'seed random number generator
DIM SHARED m(4 * 4): DIM SHARED B(4 * 4): DIM SHARED c(2 * 6 * 6)
DIM SHARED d(8 * 8): DIM SHARED e(10 * 10)
DOT 'METEORS/UFO
REDIM SHARED TOP(60 * 30) 'TOP VIEW
REDIM SHARED SIDE(60 * 30) 'SIDE VIEW
LRVIEW 'TOP/SIDE VIEW LETTERING
REDIM SHARED SHIP(23 * 48) 'SHIP
SHIPS
REDIM SHARED TARGT(50 * 50) 'TARGET
TARGET
FOR I = 0 TO 359
init I 'init metteor variables
NEXT I
x(0, 0) = 11: x(0, NN) = 2 'INIT A FEW METEORS
x(STP, 0) = 11: x(STP, NN) = 6
x(STP, 11) = 4 'angle x
x(STP, 12) = -4 'angle y
SHIPLOCTN
N = 0: HITS = 0
DO '<<<<<<<>>>>>>>
N = N + 1: 'distance inc lightyear
MY = FALSE
EnergyLoss 'regular energy losses/gains
LINE (0, 0)-(XH, 479), 11, B 'left window
LINE (1, 1)-(XH - 1, 478), 11, B 'left window
LINE (2, 2)-(XH - 2, 477), 11, B
LINE (XH, 0)-(XL - 1, 479), 9, B 'middle window
LINE (XH + 1, 1)-(XL - 2, 478), 9, B
LINE (XH + 2, 2)-(XL - 3, 477), 9, B
LINE (XL, yb + 1)-(639, 479), 14, B 'bottom window
LINE (XL + 1, yb + 2)-(638, 478), 14, B
LINE (XL + 2, yb + 2)-(637, 477), 14, B
LINE (500, yb + 1)-(502, 479), 14, BF 'VERT L
LINE (XL + 3, yb + 30)-(500, yb + 32), 14, BF 'HORZ LY
k$ = TIME$
hr = VAL(MID$(k$, 1, 2)): 'PRINT hr
MN = VAL(MID$(k$, 4, 2)): 'PRINT mn
SC = VAL(MID$(k$, 7, 2)): 'PRINT sc: INPUT u$
'seed random number generator
IF MN = FIX(10 * min / 10) THEN RANDOMIZE 60000
MASK
LINE (XM, YD)-(XM, 50), 7 'ship's path
LINE (XC, YD)-(XC, 50), 7
PUT (XM - 11, 15), TOP(0), OR
PUT (XC - 11, 15), SIDE(0), OR
LOCATE 24, 28: PRINT "DIST: LGHT YRS:"; N; " HITS:"; HITS
SHIPLOCTN
aa = FALSE
FOR I = 0 TO 359 STEP STP
MeteoRay (I)
NEXT I
PUT (MAXX - 50, MAXY - 50), TARGT, OR
EraseBorder
Sort 570, 420
LOOP WHILE KeyVal 'QUIT == escape pressed
END 'QUIT = CNTRL-C
SUB DOT
DrawCircle 2, 2, 2, 15 'w
GET (0, 0)-(4, 4), m
CLS
DrawCircle 2, 2, 2, 10 'grn
GET (0, 0)-(4, 4), B
CLS
DrawCircle 3, 3, 3, 12 'red
GET (0, 0)-(6, 6), c
CLS
DrawCircle 4, 4, 4, 14 'yel
GET (0, 0)-(8, 8), d
CLS
DrawCircle 5, 5, 5, 0 'wht
GET (0, 0)-(10, 10), e
END SUB
DEFINT P-Z
SUB DrawCircle (radi, XX, YY, zz)
X1 = 0: y1 = 0: X0 = radi * COS(0): Y0 = radi * SIN(0)
FOR ii = 0 TO 90 '60=6 90=4 180=2 360=1 720=.5
X2 = radi * COS(4 * ii / 180 * pi)
Y2 = radi * SIN(4 * ii / 180 * pi)
LINE (X1 + XX, y1 + YY)-(X2 + XX, Y2 + YY), zz
X3 = (X0 + X2) / 2: Y3 = (Y0 + Y2) / 2: X0 = X2: Y0 = Y2
LINE (X1 + XX, y1 + YY)-(X3 + XX, Y3 + YY), zz
NEXT ii
END SUB
DEFDBL P-Z
SUB EnergyLoss
U(1, 1) = U(1, 1) - 10 '10 'Fuel loss
U(2, 1) = U(2, 1) + ((1 + game) * 50 - game * 9)'50/9
Fuel ''GAME==9/DISPLAY==50 U(2,1)
END SUB
SUB EraseBorder 'SPACE BORDER
z = 0: zz = .5 'z=1 'ok
FOR I = 0 TO 31 '12 TO 0 STEP -1
z = z + zz
LINE (210 + I, 1 + I)-(639 - I, yb - I), z, B 'BORDER
IF z > 7 THEN zz = -.5
NEXT I
END SUB
SUB Fuel
IF MY THEN U(2, 1) = U(2, 1) - 30: MY = FALSE 'SHIP SHIELD COST ENERGY
U(2, 1) = (U(2, 1) + U(1, 1)) / 2: 'SOLAR
U(1, 1) = U(2, 1) 'Fuel CONVERSION
IF U(2, 1) > FULL THEN U(2, 1) = FULL 'solar
IF U(1, 1) > FULL THEN U(1, 1) = FULL 'Fuel
''IF U(1, 1) < 10 THEN END 'STOP GAME: NO Fuel
LOCATE 26, 28: PRINT "Fuel";
LOCATE 26, 58: PRINT "Laser": LN
LINE (XL + 3, yb + 62)-(500, 477), 14, B 'GAS/POWER BRDR YEL OUTER
LINE (XL + 8, yb + 67)-(495, 472), 14, B 'GAS/POWER YEL INNER
PAINT (XL + 5, yb + 64), 9, 14 'BRDR '9,14'13,14 'OK
LINE (480 - U(2, 1), yb + 68)-(494, yb + 82), 11 'Laser DIAG
LINE (480 - U(2, 1), yb + 68)-(494, yb + 68), 11 'HORZ
LINE (494, yb + 68)-(494, yb + 83), 11 'VERT LCYAN
PAINT (475, yb + 70), 11
LINE (480 - U(2, 1), yb + 68)-(494, yb + 82), 14 'Laser DIAG
PAINT (XL + 18, 430), 0, 14 'BLANK
LINE (480 - U(2, 1), yb + 68)-(494, yb + 82), 11 'Laser DIAG
LINE (XL + 8, yb + 98)-(230 + U(1, 1), 471), 12 'Fuel DIAG
LINE (XL + 8, 471)-(230 + U(1, 1), 471), 12 'HORZ
LINE (XL + 8, yb + 98)-(XL + 8, 471), 12 'VERT LRED:12
PAINT (XL + 10, 468), 12 'LGRN:10
LINE (XL + 8, yb + 98)-(230 + U(1, 1), 471), 14 'Fuel DIAG
PAINT (490, yb + 104), 0, 14 'BLANK
LINE (XL + 8, yb + 90 + 8)-(230 + U(1, 1), 471), 12 'Fuel DIAG
LINE (XL + 7, yb + 90)-(496, yb + 90), 14 'VERT TICS
FOR I = XL TO 490 STEP 20
LINE (I + 6, yb + 90 - 7)-(I + 8, yb + 90 + 7), 14, BF 'VERT TICS
NEXT I
IF U(1, 1) < 10 AND U(2, 1) < 10 THEN
LOCATE 26, 35: : INPUT "<< OUT OF FUEL! >>", U$: END
END IF
END SUB
SUB init (angl)
RANDOMIZE 1000
'''LOCATE 26, 28: PRINT "GAS POWER"
x(angl, 5) = MAXX: x(angl, 6) = MAXY 'INIT LOCT'N
x(angl, 7) = MAXX: x(angl, 8) = MAXY 'store erase va
x(angl, 9) = MAXX: x(angl, 10) = MAXY
x(angl, 0) = 0 'SPEED RADAR
x(angl, 1) = 36 'LOCTN window
x(angl, 2) = RND * 9 + 1 'SPEED WINDOW
x(angl, 3) = 0 'COUNT
x(angl, NN) = 0 'size Meteor INIT
x(angl, 11) = 0
x(angl, 12) = 0
IF x(angl, 2) <= 5 AND RND > .8 THEN 'speed =>NO OF METEORS
x(angl, 11) = CDBL(RND * 10 - 5) 'angle x
x(angl, 12) = CDBL(RND * 10 - 5) 'angle y
x(angl, 0) = 7 * RND + 8 'speed Meteor IN WINDOW
x(angl, NN) = RND * METNUM 'size Meteor 2< / =4 / <+
END IF
x(angl, 4) = RND * 8 + 7 '14 + 1 'COLOR 1-15
DO
x(angl, 11) = -x(angl, 11)
LOOP WHILE RND > METNUM / 10
FOR I = 17 TO NN - 2 '14-16 PRESERVED
x(angl, I) = 0
NEXT I
IF FIX(x(angl, NN)) = 4 THEN x(angl, NN) = 4
ch = FALSE
END SUB
SUB KeyAngle (ak, ap) 'i, +/-, +/-
ratio = .9
FOR I = 0 TO 359 STEP STP
IF x(I, 0) > 0 THEN
x(I, 11) = x(I, 11) + ak * ratio
x(I, 12) = x(I, 12) + ap * ratio
END IF
NEXT I
END SUB
DEFINT P-Z
FUNCTION KeyOn 'take finger off keys
strike$ = INKEY$ 'get keystrike
IF LEN(strike$) THEN KeyOn = TRUE ELSE KeyOn = FALSE
'convert to an integer
END FUNCTION
FUNCTION KeyVal 'press ESC key
KeyVal = TRUE
strike$ = INKEY$: G = 0 'get keystrike
IF LEN(strike$) THEN
IF LEN(strike$) = 2 THEN 'arrows
G = ASC(MID$(strike$, 2, 1)) 'convert to an integer
h = (G = 72) - (G = 80): G = (G = 75) - (G = 77)
''' H-U P-D K-L M-R
'' 'i -1/+1 -1/+1
KeyAngle G, h
ELSEIF LEN(strike$) = 1 THEN 'num keypad
G = ASC(strike$) 'convert to an integer
SELECT CASE G
CASE 55 '7 LU
KeyAngle -3, -3: 'PRINT "CASE7 -1 / -1";
CASE 57 '9 RU
KeyAngle 3, -3: 'PRINT "CASE9 +1 / -1";
CASE 49 '1 LD
KeyAngle -3, 3: 'PRINT "CASE1 -1 / +1";
CASE 51 '3 RD
KeyAngle 3, 3: 'PRINT "CASE3 +1 / +1";
CASE ELSE '4/8/6/2
h = 3 * ((G = 56) - (G = 50)): G = 3 * ((G = 52) - (G = 54))
'' 8 2 4 6
KeyAngle G, h
END SELECT
END IF
END IF
DO
LOOP WHILE KeyOn 'TAKE FINGER OFF KEY
IF G = 27 THEN KeyVal = FALSE
END FUNCTION
DEFDBL P-Z
SUB Laser (in, Y0)
U(2, 1) = U(2, 1) - 0 '*(MD-LNGTH)/(MD-ST) 'NO cost Laser energy
IF x(in, 16) > MD THEN GOTO JMP 'SPACE DUST==ENERGY
HITS = HITS + 1
IF x(in, NN) > 4 THEN LOCATE 26, 35: : PRINT "<>": END
IF x(in, NN) = 4 THEN LOCATE 26, 35: : PRINT "<>"
IF x(in, NN) < 4 THEN LOCATE 26, 35: : PRINT "<>"
FOR h = 0 TO 10 '12RED TURN THIS LINE INTO 1000 TO CHECK YOUT AIM
LINE (XM + 1, Y0)-(XM - 1, MD), 14, BF 'LIMITS on
LINE (XC + 1, Y0)-(XC - 1, MD), 14, BF
FOR T = 0 TO 2
SOUND T * 100, 1.3 'noise LONGER
SOUND T * 100, .2 'noise
NEXT T
' SOUND h * 100, .3 'noise SHORT
' SOUND h * 100, .2 'noise
LINE (XM - 1, MD)-(XM + 2, Y0), 0, BF ' off
LINE (XC - 1, MD)-(XC + 1, Y0), 0, BF
NEXT h
JMP:
init in 'get rid of meteor
END SUB
SUB LN
LINE (XL + 45, yb + 34)-(450, yb + 59), 9, BF 'communication window
END SUB
FUNCTION lngth 'SOLAR PWR
lngth = MD - (MD - ST) * U(2, 1) / FULL * 2 / 3
END FUNCTION
SUB LRVIEW
LOCATE 1, 1: PRINT "TOP";
LOCATE 2, 1: PRINT "VIEW";
'LOCATE 3, 1: PRINT "LIBRA";
GET (0, 0)-(38, 45), TOP
LOCATE 1, 1: PRINT "SIDE";
LOCATE 2, 1: PRINT "VIEW";
'LOCATE 3, 1: PRINT "ORION";
GET (0, 0)-(38, 45), SIDE
LOCATE 1, 1: PRINT " ";
LOCATE 2, 1: PRINT " ";
LOCATE 3, 1: PRINT " ";
END SUB
SUB MASK
LINE (4, ST - 10)-(XH - 4, MD + 20), 0, BF 'ERASE L-WIND +20 SHIELD
LINE (XH + 4, ST - 10)-(XL - 5, MD + 20), 0, BF 'ERASE R-WIND
LINE (4, MD)-(XM - 13, 460 + 5), 0, BF 'ERASE L-WIND SHIP LSIDE
LINE (XM + 13, MD)-(XH - 4, 460 + 5), 0, BF 'ERASE L/R-SIDE 460=YD
LINE (XH + 4, MD)-(XC - 13, 460 + 5), 0, BF 'ERASE R-WIND SHIP LSIDE
LINE (XC + 13, MD)-(XL - 5, 460 + 5), 0, BF 'ERASE R/R-SIDE
END SUB
SUB Meteor (xb, YC, ad) 'color 'x1/y1/angl
IF xb > 2 AND YC > 2 THEN
IF x(ad, NN) < 4 THEN
PUT (xb - 2, YC - 2), B(0), OR
ELSEIF FIX(x(ad, NN)) = 4 THEN
PUT (xb - 3, YC - 3), c(0), OR
ELSE
PUT (xb - 4, YC - 4), d(0), OR: aa = TRUE
END IF
END IF
END SUB
SUB MeteoRay (a) 'RAYS OF METEIRITES IN TOP RIGHT WINDOW
z = FIX(a): m = .5 'delta ANGLE for erasing path
V = COS(a / 180 * pi): W = SIN(a / 180 * pi) 'angle EACH Meteor
VV = COS((a + m) / 180 * pi): WW = SIN((a + m) / 180 * pi) 'erase angle
VW = COS((a - m) / 180 * pi): WV = SIN((a - m) / 180 * pi)
'' x0 loc ang speed count ang
X1 = MAXX + x(a, 1) * V + x(a, 2) * x(a, 3) * V 'coord's Meteor
y1 = MAXY + x(a, 1) * W + x(a, 2) * x(a, 3) * W
X3 = MAXX + x(a, 1) * VV + x(a, 2) * x(a, 3) * VV 'erase coords
Y3 = MAXY + x(a, 1) * WW + x(a, 2) * x(a, 3) * WW
X4 = MAXX + x(a, 1) * VW + x(a, 2) * x(a, 3) * VW
Y4 = MAXY + x(a, 1) * WV + x(a, 2) * x(a, 3) * WV
X2 = FIX(X1 + 3 * V): X1 = FIX(X1) 'SIZE OF BLIP
Y2 = FIX(y1 + 3 * W): y1 = FIX(y1)
LINE (X1, y1)-(X2, Y2), x(a, 4) 'BLIP
LINE (MAXX + 18 * V, MAXY + 18 * W)-(x(a, 5), x(a, 6)), 0 'ERASE OLD LINE
LINE (MAXX + 18 * V, MAXY + 18 * W)-(x(a, 7), x(a, 8)), 0 'ERASE OLD LINE
LINE (MAXX + 18 * V, MAXY + 18 * W)-(x(a, 9), x(a, 10)), 0 'ERASE OLD LINE
InitTrue = FALSE
'0 12 '480
IF X1 > 600 OR X1 < XL + 40 OR y1 < 40 OR y1 > yb - 40 THEN
LINE (X1, y1)-(X2, Y2), 0 'BLIP erased
IF x(a, 0) = 0 THEN InitTrue = TRUE: GOTO jmpi 'space ray done init
END IF
x(a, 5) = X1: x(a, 6) = y1 'store erase val
x(a, 7) = X3: x(a, 8) = Y3
x(a, 9) = X4: x(a, 10) = Y4
IF x(a, 0) > 0 THEN Views a 'display top/side views
jmpi:
IF x(a, 0) = 0 AND InitTrue THEN init a 'ray done init
x(a, 3) = x(a, 3) + 1 'time inc
END SUB
SUB PaletteChng
FOR ii = 1 TO 8 'do colors 1 to 6
red = 28 + 3 * ii 'red intensity value (0-63)
green = 28 + 3 * ii
blue = 28 + 3 * ii
PALETTE ii, 65536 * blue + 256 * green + red
'set each color to random intensities
NEXT
END SUB
SUB SHIPLOCTN
PUT (XM - 12, 415), SHIP(0), PSET 'DON'T DESTROY THESE SHIPS OR
PUT (XC - 12, 415), SHIP(0), PSET 'OR GAME OVER - RESIGN
PUT (XM - 12, 415), SHIP(0), OR 'DON'T DESTROY THESE SHIPS OR
PUT (XC - 12, 415), SHIP(0), OR 'OR GAME OVER - RESIGN
END SUB
SUB SHIPS
LOCATE 1, 1: PRINT " ^ ";
LOCATE 2, 1: PRINT "< >";
LOCATE 3, 1: PRINT "/^\";
LINE (6, 6)-(16, 15), 9, BF 'dblu 1,9
LINE (8, 15)-(14, 35), 15, BF 'wht
LINE (9, 35)-(13, 43), 12, BF 'dred 4.12
GET (0, 0)-(23, 48), SHIP
END SUB
SUB Sort (a0, b0)
'print 1st 2 meteors on magnification
FOR I = 1 TO 2
IF Y(I, NN + 2) - 5 >= 0 AND Y(I, NN + 3) - 5 >= 0 THEN
PUT (Y(I, NN + 2) - 5, Y(I, NN + 3) - 5), e(0), PSET 'erase meteor
END IF
NEXT I
PUT (a0 - 5, b0 - 5), e(0), PSET
FOR k = 0 TO NN 'CLEAR VAL 0 AND x(I, NN) < 5 THEN 'only red/green in target
' SPEED TIME ;SEE SORT FOR 2 PLOTS WHITE 1ST
WDIST = CDBL(x(I, 0) * x(I, 3)) 'WINDOW DIST LY
IF WDIST > Y(1, NN + 1) AND WDIST > Y(2, NN + 1) THEN
NoComet = FALSE
FOR k = 0 TO NN + 1
Y(2, k) = Y(1, k)
NEXT k
Y(1, NN + 1) = WDIST
FOR k = 0 TO NN
Y(1, k) = x(I, k)
NEXT k
ELSEIF WDIST > Y(2, NN + 1) THEN
NoComet = FALSE: Y(2, NN + 1) = WDIST
FOR k = 0 TO NN
Y(2, k) = x(I, k)
NEXT k
END IF
END IF
NEXT I
LOCATE 24, 64: PRINT FIX(MD - ST - 10 - Y(1, NN + 1)); 'dist nearest
LOCATE 24, 75: PRINT FIX(MD - ST - 10 - Y(2, NN + 1)); 'next
IF Y(2, NN + 1) = 0 THEN 'only one meteor in window?
FOR k = 0 TO NN + 1 'duplicate data
Y(2, k) = Y(1, k)
BB = FIX(RND * 340 / STP) * STP
IF Y(1, 17) = BB THEN BB = 360 - STP
x(BB, k) = Y(1, k)
NEXT k
Y(2, 0) = 2 * Y(1, 0): x(BB, 3) = Y(2, 0) 'SPEED RADAR
x(BB, 1) = RND * 10 + 10 'LOCTN
Y(2, 2) = 1: x(BB, 2) = 1 'SPEED WIND
Y(2, 3) = RND * .2 + .8: x(BB, 3) = RND * .2 + .8 'COUNT
Y(2, NN) = 2: x(BB, NN) = 2 'GREEN SIZE
END IF
IF NoComet THEN
x(0, NN) = 2 'GREEN
x(0, 2) = 1 'SPACE SPEED
x(0, 3) = RND * .2 + .8 'TIME
x(0, 11) = CDBL(RND * 10 - 5) 'angle x
x(0, 12) = CDBL(RND * 10 - 5) 'angle y
x(0, 0) = 7 'RADAR SPEED
x(0, 17) = 0 'ANGL
x(STP, NN) = 4 'GREEN
x(STP, 2) = 1 'SPACE SPEED
x(STP, 3) = RND * .2 + .8 'SPACE SPEED
x(STP, 11) = CDBL(RND * 10 - 5) 'angle x
x(STP, 12) = CDBL(RND * 10 - 5) 'angle y
x(STP, 0) = 20 'RADAR SPEED
x(STP, 17) = STP 'ANGL
END IF
FOR I = 2 TO 1 STEP -1
IF Y(1, NN + 1) > 0 THEN 'dist
'window angle x
V = CDBL(COS((Y(I, 11) + 90) / 180 * pi)): ' PRINT v
'loctn 'speed 'time
X1 = CDBL(a0 + Y(I, 1) * V + Y(I, 0) * Y(I, 3) * V)
V = CDBL(COS((Y(I, 12) + 90) / 180 * pi)): ' PRINT v
y1 = CDBL(b0 + Y(I, 1) * V + Y(I, 0) * Y(I, 3) * V)
IF FIX(Y(I, NN)) = 4 THEN
PUT (X1 - 3, y1 - 3), c(0), OR 'TWO TARGET IN WINDOW!
ELSEIF FIX(Y(I, NN)) < 4 THEN
PUT (X1 - 2, y1 - 2), B(0), OR
END IF
IF I = 1 THEN PUT (X1 - 2, y1 - 2), m(0), OR 'nearest white rt targt
Y(I, NN + 2) = X1: Y(I, NN + 3) = y1: Y(I, NN + 4) = y1
END IF
NEXT I
PUT (570 - 49, 420 - 49), TARGT, OR
Fuel
END SUB
SUB TARGET ''(rad, ang, XR, YR)
CLS
FOR I = 0 TO 270 STEP 90
LINE (50 - 5, 50)-(50 - 9, 50), 14 'CROSS_HAIR
LINE (50 + 5, 50)-(50 + 9, 50), 14 'CROSS_HAIR
LINE (50, 50 - 5)-(50, 50 - 9), 14 'CROSS_HAIR
LINE (50, 50 + 5)-(50, 50 + 9), 14 'CROSS_HAIR
angoff = 20
x10 = 50 * COS((I - angoff) / 180 * pi) 'ini var
y10 = 50 * SIN((I - angoff) / 180 * pi)
FOR k = -angoff TO angoff - 1 '40' arc
x11 = 50 * COS((I + 1 + k) / 180 * pi)
y11 = 50 * SIN((I + 1 + k) / 180 * pi)
LINE (50 + x10, 50 + y10)-(50 + x11, 50 + y11), 14
x10 = x11: y10 = y11
NEXT k
NEXT I
GET (0, 0)-(100, 100), TARGT
CLS
END SUB
SUB Views (an)
IF x(an, 0) > 0 THEN 'angle meteor/space junk
IF aa AND x(an, NN) > 4 THEN x(an, NN) = 4
x = CDBL(an)
x(an, 2) = 0 'space SPEED ZERO
V = CDBL(COS((x(an, 11) + 90) / 180 * pi)): ' PRINT v
W = CDBL(SIN((x(an, 11) + 90) / 180 * pi)): 'PRINT ww
'speed 'time
X1 = CDBL(XM + x(an, 0) * x(an, 3) * V): 'PRINT x1'coord's Meteor
y1 = CDBL(ST + x(an, 0) * x(an, 3) * W): 'PRINT y1
XX1 = X1: yy1 = y1
ch = FALSE 'left window 'right real display
IF X1 <= 10 OR X1 > XH - 10 OR y1 > YD OR ch THEN
ch = TRUE: x(an, 2) = 0 'speed
IF y1 > MD THEN MY = TRUE 'SHIP SHIELD COST ENERGY FIX(X(an, 14)
ELSE
Meteor XX1, yy1, an
END IF
x(an, 13) = X1: x(an, 14) = y1 'erase coord
''right window
V = CDBL(COS((x(an, 12) + 90) / 180 * pi)): ' PRINT v
W = CDBL(SIN((x(an, 12) + 90) / 180 * pi)): 'PRINT ww
X1 = CDBL(XC + x(an, 0) * x(an, 3) * V): 'PRINT x1'coord's Meteor
'' Y1 = CDBL(ST + X(an, 0) * X(an, 3) * w): 'PRINT y1
'right window 'right real display
IF X1 < XH + 10 OR X1 > XL - 10 OR y1 > YD OR y1 < 5 OR ch THEN
ch = TRUE: x(an, 2) = 0 'SPEED
IF y1 > MD THEN MY = TRUE 'SHIP SHIELD COST ENERGY
ELSE
Meteor X1, y1, an
'size
END IF
x(an, 15) = X1: x(an, 16) = y1 'erase coord
IF x(an, NN) > 4 AND RND > .8 AND (y1 > MAXY OR yy1 > MAXY) THEN
za = RND
LOCATE 26, 35:
PRINT "BYE! DEST: "; : IF za > .9 THEN PRINT "ALPHA" ELSE PRINT "LYRA"
U(1, 1) = U(1, 1) + FULL '/ 2 'REFUELING
x(an, 2) = 1: x(angl, 3) = 0 'WIND-SPEED OR DISAPPEAR
FOR h = 0 TO 50 '100
LINE (x(an, 15), x(an, 16))-(XC, 420), 11 'RW radio waves
LINE (x(an, 15), x(an, 16))-(XC, 420), 0
PUT (x(an, 15) - 5, x(an, 16) - 5), e(0), PSET
PUT (x(an, 15) - 4, x(an, 16) - 4), d(0), OR
FOR T = 0 TO 3
SOUND T * 100, .3 'noise
NEXT T
FOR T = 0 TO 3
SOUND T * 100, .2 'noise
NEXT T
LINE (x(an, 13), x(an, 14))-(XM, 420), 11 'OK LW radio waves
LINE (x(an, 13), x(an, 14))-(XM, 420), 0
PUT (x(an, 13) - 5, x(an, 14) - 5), e(0), PSET
PUT (x(an, 13) - 4, x(an, 14) - 4), d(0), OR
NEXT h
aa = TRUE
PUT (x(an, 15) - 5, x(an, 16) - 5), e(0), PSET
PUT (x(an, 13) - 5, x(an, 14) - 5), e(0), PSET
LN 'BLU MSSG WIND
LINE (XL + 8, yb + 68)-(494, yb + 90 - 10), 0, BF 'BLANK SCRN PWR DIAG
LINE (XL + 8, yb + 90 + 8)-(494, 471), 0, BF 'BLANK SCRN GAS DIAG
Fuel
IF RND > .7 THEN
x(an, 13) = 0: x(an, 15) = 0 'UFO GONE
init an
ELSE
x(an, NN) = 4 'WATCHOUT IT WAS RIDING ON SPACE JUNK!
END IF
ELSEIF x(an, 14) > 450 OR x(an, 16) > 450 THEN
init an 'all meteorites are destroyed
ELSE
Meteor XX1, yy1, an ' printed
END IF
IF y1 > MD - 5 AND (XX1 >= XM - 20 AND XX1 <= XM + 20) OR (X1 >= XC - 20 AND X1 <= XC + 20) THEN
FLG = TRUE
IF y1 > MD AND (XX1 >= XM - 3 AND XX1 <= XM + 3) AND (X1 >= XC - 3 AND X1 <= XC + 3) THEN
FLG = FALSE
LOCATE 26, 35: : PRINT "<< MINOR DAMAGE! >>":
FOR I = 0 TO 3000:
NEXT
IF y1 > MD AND XX1 = XM AND X1 = XC THEN
LOCATE 26, 35: : PRINT "<< MAJOR DAMAGE! >>": END
END IF
IF FLG THEN
SHIPLOCTN
END IF
END IF
END IF
FLAG = FALSE:
IF x(an, NN) > 4 AND (XX1 >= XM - 3 AND XX1 <= XM + 3) AND (X1 >= XC - 3 AND X1 <= XC + 3) AND y1 >= yb THEN FLAG = TRUE
IF (x(an, NN) <= 4 AND (XX1 >= XM - 3 AND XX1 <= XM + 3) AND (X1 >= XC - 3 AND X1 <= XC + 3) AND (y1 >= lngth OR yy1 >= lngth)) OR FLAG THEN
Laser an, y1
END IF
IF ch THEN init an
END IF
END SUB
RETURN TO TOP
RETURN TO PMC MENU
HOME PAGE