'===========================================================================
' Subject: SPECTRA (LIKE GORILLAS)            Date: 07-11-97 (14:11)       
'  Author: Kevin Weber                        Code: QB, QBasic, PDS        
'  Origin: microhof@marshallnet.com         Packet: GAMES.ABC
'===========================================================================
' Spectra   v1.0
' --------------
'    This game was programmed by Kevin Weber, of Marshalltown, Iowa.
' MicroHof Programming posseses distribution and claim rights.
'    Spectra is a simple game in which the object is to hit your opponent
' (computer or 2nd player) with a projectile after inputting an angle
' and a velocity.
'    Kevin included several new twists on the game, including a computer
' opponent as well as simultaneous firing, allowing ties in the game.
'
'    This program is available at MicroHof WebQuarters, located at :
'                      http://microhof.home.ml.org
'                                  OR
'              http://www.geocities.com/CapeCanaveral/6769
'
'    E-mail all comments to : microhof@marshallnet.com
'
' To run this program, hold down Shift and press F5
















DIM bullet(11)
bullet(0) = 4
bullet(1) = 6
bullet(2) = 12
bullet(3) = 14
bullet(4) = 10
bullet(5) = 2
bullet(6) = 1
bullet(7) = 9
bullet(8) = 5
bullet(9) = 13


SCREEN 12
RANDOMIZE TIMER
COLOR 15
PRINT "Player 1, enter your name"
INPUT pan$
pan$ = LEFT$(pan$, 8)
fan$ = pan$ + ".ply"
OPEN fan$ FOR APPEND AS #1
FOR yu = 1 TO 3
q = 0
WRITE #1, q
NEXT yu
CLOSE #1
OPEN fan$ FOR INPUT AS #1
INPUT #1, a
winsa = a
INPUT #1, a
lossesa = a
INPUT #1, a
tiesa = a
CLOSE #1
computer = 0
PRINT "Player 2, enter your name"
COLOR 8
PRINT "     If you want a computer opponent, type"
PRINT "     compute and then a number.  The lower the"
PRINT "     number, the higher the skill. (Max of 9)"
COLOR 15
INPUT pbn$
pbn$ = LEFT$(pbn$, 8)
IF UCASE$(LEFT$(pbn$, 7)) = "COMPUTE" THEN computer = 1
skill = 5
g = VAL(RIGHT$(pbn$, 1))
IF g > 0 THEN skill = g
fbn$ = pbn$ + ".ply"
OPEN fbn$ FOR APPEND AS #1
q = 0
FOR yu = 1 TO 3
WRITE #1, q
NEXT yu
CLOSE #1
OPEN fbn$ FOR INPUT AS #1
INPUT #1, a
winsb = a
INPUT #1, a
lossesb = a
INPUT #1, a
tiesb = a
CLOSE #1
PRINT "OK. How many matches do you want to play?"
INPUT games
CLS
ties = 0
total = 0

sa = 0
sb = 0
detail = 5000
size = 15
guntrail = 20
10  'new level
shots = 0
amount = (skill ^ 1.5) ^ (.75 ^ shots)
hillloc = INT(RND(1) * 100) + 270
b = RND * 2 / 25 + .02
h = INT(RND(1) * 300) + 100
wind = INT(RND(1) * 100) - 50
IF wind = 0 THEN wind = 1
wn = (wind / ABS(wind)) * 4
neg = INT(RND(1) * 2) * 2 - 1
FOR x = 1 TO 640
y = h / (2 + (1 + b * neg) ^ (x - hillloc)) + 400 - h / 2
LINE (x, y)-(x, 480), 2
LINE (x, y)-(x, y + 1), 10
NEXT x
LINE (320, 460)-(320 + wind, 460)
LINE (320 + wind, 460)-(320 - wn + wind, 456)
LINE (320 + wind, 460)-(320 - wn + wind, 464)

pax = INT(RND(1) * 50) + 50
pay = h / (2 + (1 + b * neg) ^ (pax - hillloc)) + 400 - h / 2 - size
pbx = INT(RND(1) * 50) + 540
pby = h / (2 + (1 + b * neg) ^ (pbx - hillloc)) + 400 - h / 2 - size
LINE (pax - size, pay - size)-(pax + size, pay + size), 15, BF
LINE (pax - size + 2, pay - size + 2)-(pax + size - 2, pay + size), 12, BF
LINE (pax - size + 4, pay - size + 4)-(pax + size - 4, pay + size), 4, BF
LINE (pbx - size, pby - size)-(pbx + size, pby + size), 15, BF
LINE (pbx - size + 2, pby - size + 2)-(pbx + size - 2, pby + size), 9, BF
LINE (pbx - size + 4, pby - size + 4)-(pbx + size - 4, pby + size), 1, BF
GOSUB 20
33 'shot a
LOCATE 1, 1
PRINT "Player 1, your angle"
INPUT paa#
IF paa# > 360 OR paa# < 0 THEN GOSUB 20: GOTO 33
21 'a2
LOCATE 3, 1
PRINT "Player 1, your velocity"
INPUT pab
IF pab > 360 OR pab < 0 THEN GOSUB 20: GOTO 21
22 'player 2 shot redo
LOCATE 5, 1
IF computer = 0 THEN
        PRINT "Player 2, your angle"
        INPUT pba#
        IF pba# > 360 OR pba# < 0 THEN GOSUB 20: GOTO 22
23                 'b2
        LOCATE 7, 1
        PRINT "Player 2, your velocity"
        INPUT pbb
        IF pbb > 360 OR pbb < 0 THEN GOSUB 20: GOTO 23
END IF
IF computer = 1 THEN
vv = 70
distvert = (pay - pby)
time = (70 + (4900 + 20 * distvert) ^ .5) / 10

windtake = .03 * wind * time ^ 2

dist = pax - pbx - windtake + size

hv = dist / time

pbh = hv
pbv = vv
xoff = RND * amount * 2 - amount
yoff = RND * amount * 2 - amount
PRINT xoff, yoff
pbh = pbh + xoff
pbv = pbv + yoff
END IF
pba# = 180 - pba#
pah = pab * COS(paa# / 57.3)
pav = pab * SIN(paa# / 57.3)
IF computer = 0 THEN
        pbh = pbb * COS(pba# / 57.3)
        pbv = pbb * SIN(pba# / 57.3)
END IF
t = 0
pha = 0
phb = 0
sha = 0
shb = 0
shga = 0
shgb = 0
tstep = .04
gobacka = 1
gobackb = 1
 PLAY "MFO0L32EFGEFDC"
100 'shot retry
ot = t - tstep * guntrail
sax = pah * t + wind * .03 * t ^ 2 + pax + size
say = 5 * t ^ 2 - pav * t + pay - size
sbx = pbh * t + wind * .03 * t ^ 2 + pbx - size
sby = 5 * t ^ 2 - pbv * t + pby - size
osax = pah * ot + wind * .03 * ot ^ 2 + pax + size
osay = 5 * ot ^ 2 - pav * ot + pay - size
osbx = pbh * ot + wind * .03 * ot ^ 2 + pbx - size
osby = 5 * ot ^ 2 - pbv * ot + pby - size
col = bullet(((t / 4) / tstep) MOD 10)
IF sha = 0 THEN PSET (sax, say), col
IF shb = 0 THEN PSET (sbx, sby), col
IF sha = 0 AND t / tstep > guntrail THEN PSET (osax, osay), 0
IF shb = 0 AND t / tstep > guntrail THEN PSET (osbx, osby), 0
t = t + tstep
IF ABS(pax - sax) < size AND ABS(pay - say) < size THEN
        sha = 1
        pha = 1
        IF gobacka = 1 THEN bx = pax: by = pay: gobacka = 0: GOSUB 2000
END IF
IF ABS(pax - sbx) < size AND ABS(pay - sby) < size THEN
        shb = 1
        pha = 1
        IF gobacka = 1 THEN bx = pax: by = pay: gobacka = 0: GOSUB 2000
END IF
IF ABS(pbx - sax) < size AND ABS(pby - say) < size THEN
        sha = 1
        phb = 1
        IF gobackb = 1 THEN bx = pbx: by = pby: gobackb = 0: GOSUB 2000
END IF
IF ABS(pbx - sbx) < size AND ABS(pby - sby) < size THEN
        shb = 1
        phb = 1
        IF gobackb = 1 THEN bx = pbx: by = pby: gobackb = 0: GOSUB 2000
END IF

ga = h / (2 + (1 + b * neg) ^ (sax - hillloc)) + 400 - h / 2
gb = h / (2 + (1 + b * neg) ^ (sbx - hillloc)) + 400 - h / 2
IF say > ga THEN sha = 1
IF sby > gb THEN shb = 1
IF sha = 1 AND shga = 0 THEN
        FOR hg = 1 TO guntrail
                osax = pah * ot + wind * .03 * ot ^ 2 + pax + size
                osay = 5 * ot ^ 2 - pav * ot + pay - size
                PSET (osax, osay), 0
                shga = 1
                ot = ot + tstep
        NEXT hg
END IF
IF shb = 1 AND shgb = 0 THEN
        FOR hg = 1 TO guntrail
                osbx = pbh * ot + wind * .03 * ot ^ 2 + pbx - size
                osby = 5 * ot ^ 2 - pbv * ot + pby - size
                PSET (osbx, osby), 0
                shgb = 1
                ot = ot + tstep
        NEXT hg
END IF

IF sha + shb < 2 THEN GOTO 100
GOSUB 20
IF pha + phb < 1 THEN GOTO 33
total = total + 1
sa = sa + phb
sb = sb + pha
IF pha + phb = 2 THEN ties = ties + 1
IF total < games THEN CLS : GOTO 10
GOTO 1000
20 'erase
LINE (0, 0)-(300, 150), 0, BF
COLOR 15
RETURN

1000 'end of game
winsa = winsa + sa - ties
winsb = winsb + sb - ties
lossesa = lossesa + sb - ties
lossesb = lossesb + sa - ties
tiesa = tiesa + ties
tiesb = tiesb + ties
CLS
totala = winsa + lossesa + tiesa
totalb = winsb + lossesb + tiesb
IF sa > sb THEN PRINT pan$; " wins"
IF sb > sa THEN PRINT pbn$; " wins"
IF sa = sb THEN PRINT "It's a stalemate!"
PRINT sa; " to "; sb
PRINT
PRINT "-------------------------"
PRINT
PRINT "Stats for "; pan$
PRINT
PRINT "Wins : "; winsa
PRINT "Losses : "; lossesa
PRINT "Ties : "; tiesa
PRINT "Skill Level : "; INT((winsa + tiesa / 2) / totala ^ .8 * 50)
PRINT
PRINT
PRINT "Stats for "; pbn$
PRINT
PRINT "Wins : "; winsb
PRINT "Losses : "; lossesb
PRINT "Ties : "; tiesb
PRINT "Skill Level : "; INT((winsb + tiesb / 2) / totala ^ .8 * 50)
IF UCASE$(LEFT$(pbn$, 7)) = "COMPUTE" THEN GOTO 1432
OPEN fan$ FOR OUTPUT AS #1
WRITE #1, winsa
WRITE #1, lossesa
WRITE #1, tiesa
CLOSE #1
1432 'We skipped ya, player 1
OPEN fbn$ FOR OUTPUT AS #1
WRITE #1, winsb
WRITE #1, lossesb
WRITE #1, tiesb
CLOSE #1
END

2000 'blowup
PLAY "MBO0L32EFGEFDC"
FOR rad# = 1 TO size * 1.5
COLOR ((rad# MOD 2) * 2 + 4)
CIRCLE (bx, by), rad#
CIRCLE (bx + 1, by), rad#
CIRCLE (bx + 1, by), rad#
IF rad# < size * 1.5 THEN
FOR y = 1 TO 600
NEXT y
END IF
NEXT rad#
COLOR 15
RETURN
