3115 lines
143 KiB
QBasic
3115 lines
143 KiB
QBasic
'Electric v1.0:0015
|
||
|
||
_TITLE "Electric"
|
||
DIM SHARED ignore`, ignorethrot`, swidth, sheight, xoffset%, yoffset%, graphsetting, gamepad, screenanchorx%, screenanchory%
|
||
OPEN "electricsettings.cfg" FOR RANDOM AS #1 LEN = LEN(swidth)
|
||
GET #1, 1, swidth
|
||
GET #1, 2, sheight
|
||
GET #1, 3, fs
|
||
GET #1, 4, graphsetting
|
||
GET #1, 9, gamepad
|
||
GET #1, 19, vol
|
||
IF swidth > 0 AND sheight > 0 THEN
|
||
SCREEN _NEWIMAGE(swidth, sheight, 32)
|
||
ELSE
|
||
desktop& = _SCREENIMAGE
|
||
IF desktop& THEN
|
||
swidth = _WIDTH(desktop&)
|
||
sheight = _HEIGHT(desktop&)
|
||
ELSE
|
||
swidth = 800
|
||
sheight = 600
|
||
END IF
|
||
SCREEN _NEWIMAGE(swidth, sheight, 32)
|
||
IF desktop& THEN _FREEIMAGE desktop&
|
||
fs = 1
|
||
blue = 255
|
||
steering = 1
|
||
throttle = 3
|
||
primary = 1
|
||
secondary = 2
|
||
team = 1
|
||
scrdown = 5
|
||
scrup = 4
|
||
pick = 3
|
||
vol = 0.8
|
||
PUT #1, 1, swidth
|
||
PUT #1, 2, sheight
|
||
PUT #1, 3, fs
|
||
PUT #1, 7, blue
|
||
PUT #1, 10, steering
|
||
PUT #1, 11, throttle
|
||
PUT #1, 12, primary
|
||
PUT #1, 13, secondary
|
||
PUT #1, 15, team
|
||
PUT #1, 16, scrdown
|
||
PUT #1, 17, scrup
|
||
PUT #1, 18, pick
|
||
PUT #1, 19, vol
|
||
END IF
|
||
CLOSE #1
|
||
electricicon& = _LOADIMAGE("electricicon.png")
|
||
premetal& = _LOADIMAGE("electricplane2.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
IF electricicon& THEN
|
||
_CLEARCOLOR _RGB(0, 0, 0), electricicon&
|
||
_ICON electricicon&
|
||
_FREEIMAGE electricicon&
|
||
END IF
|
||
IF fs = 1 THEN _FULLSCREEN
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
_PRINTMODE _KEEPBACKGROUND
|
||
RANDOMIZE TIMER
|
||
TYPE control
|
||
number AS SINGLE
|
||
axis AS SINGLE '1 if axis, 0 if button
|
||
END TYPE
|
||
TYPE score
|
||
points AS INTEGER
|
||
losses AS INTEGER
|
||
total AS INTEGER
|
||
END TYPE
|
||
TYPE res
|
||
x AS INTEGER
|
||
y AS INTEGER
|
||
caption AS STRING * 64
|
||
END TYPE
|
||
TYPE airplane
|
||
team AS INTEGER
|
||
x AS SINGLE
|
||
y AS SINGLE
|
||
dir AS SINGLE 'in degrees
|
||
force AS SINGLE
|
||
speed AS SINGLE
|
||
battery AS SINGLE
|
||
generator AS SINGLE
|
||
armor AS SINGLE
|
||
lasthit AS INTEGER
|
||
credits AS INTEGER
|
||
yaw AS SINGLE
|
||
market AS INTEGER
|
||
markettime AS INTEGER
|
||
waittime AS INTEGER
|
||
ammo AS INTEGER
|
||
ai AS INTEGER
|
||
maxbatt AS SINGLE
|
||
maxarm AS SINGLE
|
||
respawntime AS INTEGER
|
||
image AS LONG
|
||
blip AS LONG
|
||
END TYPE
|
||
TYPE aug
|
||
kind AS INTEGER
|
||
ifon AS INTEGER
|
||
energy AS SINGLE
|
||
fuel AS INTEGER 'only used for SRBs
|
||
ammo AS INTEGER 'only used for stackable mods
|
||
END TYPE
|
||
TYPE weapon
|
||
wep AS INTEGER
|
||
ifon AS INTEGER
|
||
firing AS INTEGER
|
||
remaining AS INTEGER
|
||
total AS INTEGER
|
||
ammo AS INTEGER
|
||
energy AS SINGLE
|
||
kind AS INTEGER
|
||
END TYPE
|
||
TYPE shot
|
||
x AS SINGLE
|
||
y AS SINGLE
|
||
dir AS SINGLE
|
||
fired AS INTEGER
|
||
kind AS INTEGER
|
||
speed AS INTEGER
|
||
damage AS SINGLE
|
||
shape AS INTEGER
|
||
color AS LONG
|
||
target AS INTEGER 'only used in Homing Plasma
|
||
charge AS INTEGER 'only used in charging weapons
|
||
END TYPE
|
||
TYPE missile
|
||
x AS SINGLE
|
||
y AS SINGLE
|
||
dir AS SINGLE
|
||
fired AS INTEGER
|
||
duration AS INTEGER
|
||
target AS INTEGER
|
||
kind AS INTEGER
|
||
END TYPE
|
||
TYPE debris
|
||
x AS SINGLE
|
||
y AS SINGLE
|
||
life AS INTEGER
|
||
dir AS SINGLE
|
||
speed AS SINGLE
|
||
image AS LONG
|
||
angle AS SINGLE
|
||
rotation AS SINGLE
|
||
END TYPE
|
||
|
||
menumusic& = _SNDOPEN("not-from-this-world_z1Fsz8Su.ogg", "sync,vol")
|
||
_SNDVOL menumusic&, vol
|
||
IF menumusic& THEN _SNDPLAY menumusic&
|
||
DO
|
||
_LIMIT 60
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
_FONT quartz&
|
||
COLOR _RGB(255, 200, 0)
|
||
center "ELECTRIC", 1
|
||
_FONT cyberbit&
|
||
COLOR _RGB(255, 255, 255)
|
||
center "Play", 4
|
||
center "Options", 5
|
||
center "Credits", 6
|
||
center "Exit", 7
|
||
IF specialstring$ = "funfact" THEN
|
||
center "Tell me a fun fact!", 8
|
||
wot funfact$, 0, 9 * _FONTHEIGHT, swidth
|
||
END IF
|
||
_PRINTSTRING (0, sheight - _FONTHEIGHT), "v.1.0:0015"
|
||
IF menu(4) THEN
|
||
IF _SNDPLAYING(menumusic&) THEN _SNDSTOP menumusic&
|
||
env
|
||
IF menumusic& THEN _SNDPLAY menumusic&
|
||
END IF
|
||
IF menu(5) THEN
|
||
options
|
||
OPEN "electricsettings.cfg" FOR RANDOM AS #1 LEN = LEN(swidth)
|
||
GET #1, 19, vol
|
||
CLOSE #1
|
||
IF menumusic& THEN _SNDVOL menumusic&, vol
|
||
premetal& = _LOADIMAGE("electricplane2.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
_FONT 16
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
END IF
|
||
IF menu(6) THEN credit
|
||
IF menu(7) THEN
|
||
CLS
|
||
_FONT 16
|
||
IF quartz& > 0 THEN _FREEFONT (quartz&)
|
||
IF cyberbit& > 0 THEN _FREEFONT (cyberbit&)
|
||
IF brushedmetal& < -1 THEN _FREEIMAGE brushedmetal&
|
||
IF _SNDPLAYING(menumusic&) THEN _SNDSTOP menumusic&
|
||
_SNDCLOSE menumusic&
|
||
SYSTEM
|
||
END IF
|
||
IF specialstring$ = "funfact" THEN
|
||
IF menu(8) THEN funfact$ = getfact$
|
||
ELSE
|
||
special$ = INKEY$
|
||
IF special$ <> "" THEN specialstring$ = specialstring$ + special$
|
||
IF LEN(specialstring$) >= 8 THEN specialstring$ = ""
|
||
END IF
|
||
clickonce
|
||
cursor
|
||
_DISPLAY
|
||
LOOP
|
||
_FREEFONT quartz&
|
||
|
||
SUB credit
|
||
premetal& = _LOADIMAGE("electricplane2.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
_FONT 16
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
_FONT quartz&
|
||
center "CREDITS", 1
|
||
_FONT cyberbit&
|
||
center "Programmer:", 4
|
||
center "Patrick 'Cheese-Water' Marsee", 5
|
||
center "In-Game Music:", 7
|
||
center "N/A", 8
|
||
center "Title Music:", 10
|
||
center "Neil Cross", 11
|
||
center "Other Stuff:", 13
|
||
center "QB64 - IDE", 14
|
||
center "GIMP - Graphics", 15
|
||
center "sfxr - Sound Effects", 16
|
||
center "Press any key to return.", 18
|
||
_FONT 16
|
||
_FREEFONT quartz&
|
||
_FREEFONT cyberbit&
|
||
_FREEIMAGE brushedmetal&
|
||
_DISPLAY
|
||
SLEEP
|
||
END SUB
|
||
|
||
SUB center (text$, row%) 'centers text "text$" on row "row"
|
||
lentext% = _PRINTWIDTH(text$)
|
||
textheight% = _FONTHEIGHT
|
||
_PRINTSTRING ((swidth - lentext%) / 2, row% * textheight%), text$
|
||
END SUB
|
||
|
||
FUNCTION menu (choice%) 'draws the box around menu item if the mouse is over it, returns -1 if clicked. "choice" is the 16-pixel tall row, starting with 0.
|
||
DO
|
||
mousey% = _MOUSEY
|
||
click% = _MOUSEBUTTON(1)
|
||
LOOP WHILE _MOUSEINPUT
|
||
textheight% = _FONTHEIGHT
|
||
IF textheight% * choice% <= mousey% AND mousey% <= textheight% * choice% + textheight% - 1 THEN
|
||
LINE (0, textheight% * choice%)-(swidth - 1, textheight% * choice% + textheight% - 1), _RGB(255, 255, 255), B
|
||
IF ignore` = 0 AND click% THEN menu = -1: ignore` = -1
|
||
END IF
|
||
END FUNCTION
|
||
|
||
SUB wot (text$, startx%, starty%, endx%) 'Makes a small text box between "startx%" and "endx%" (pixels), and starting on "starty%" (pixels) that prints "text$".
|
||
changetext$ = text$
|
||
textlen% = LEN(text$)
|
||
textwidth% = _PRINTWIDTH(text$)
|
||
textheight% = _FONTHEIGHT
|
||
linewidth% = endx% - startx%
|
||
numline% = 0
|
||
DO WHILE textwidth% > linewidth%
|
||
a% = a% + 1
|
||
IF _PRINTWIDTH(LEFT$(changetext$, a%)) > linewidth% THEN
|
||
FOR k% = a% TO 1 STEP -1
|
||
IF MID$(changetext$, k%, 1) = " " THEN
|
||
textlen% = textlen% - k%
|
||
_PRINTSTRING (startx%, starty% + textheight% * numline%), LEFT$(changetext$, k%)
|
||
changetext$ = RIGHT$(changetext$, textlen%)
|
||
textwidth% = _PRINTWIDTH(changetext$)
|
||
numline% = numline% + 1
|
||
a% = 0
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
LOOP
|
||
_PRINTSTRING (startx%, starty% + textheight% * numline%), changetext$
|
||
END SUB
|
||
|
||
FUNCTION controllerparse$ (part%, num%)
|
||
numdevice% = _DEVICES
|
||
IF num% <= numdevice% AND num% >= 1 THEN
|
||
DIM stringparts$(8)
|
||
numpart% = 0
|
||
devicestring$ = _DEVICE$(num%)
|
||
FOR a% = 1 TO LEN(devicestring$)
|
||
b$ = MID$(devicestring$, a%, 1)
|
||
IF b$ = "[" THEN numpart% = numpart% + 1
|
||
IF b$ <> "[" AND b$ <> "]" THEN stringparts$(numpart%) = stringparts$(numpart%) + b$
|
||
NEXT
|
||
controllerparse$ = stringparts$(part%)
|
||
ELSE
|
||
controllerparse$ = "ERROR: No such controller!"
|
||
END IF
|
||
END FUNCTION
|
||
|
||
SUB clickonce 'Placed at the end of a loop that uses mouse inputs to make sure it doesn't click multiple times while the mousebutton is held.
|
||
DO
|
||
click% = _MOUSEBUTTON(1)
|
||
LOOP WHILE _MOUSEINPUT
|
||
IF ignore` = -1 AND click% = 0 AND _KEYDOWN(27) = 0 THEN ignore` = 0
|
||
END SUB
|
||
|
||
FUNCTION trigger (x1%, y1%, x2%, y2%, x3%, y3%) 'Generates output if coordinates("x3", "y3") fall within ("x1", "y1")-("x2", "y2").
|
||
IF x1% <= x3% AND x3% <= x2% AND y1% <= y3% AND y3% <= y2% THEN trigger = -1
|
||
END FUNCTION
|
||
|
||
FUNCTION pi 'It's pi.
|
||
pi = 4 * ATN(1)
|
||
END FUNCTION
|
||
|
||
FUNCTION rad (degrees) 'Converts degrees to radians.
|
||
rad = degrees * pi / 180
|
||
END FUNCTION
|
||
|
||
FUNCTION deg (radians) 'Converts radians to degrees.
|
||
deg = radians / pi * 180
|
||
END FUNCTION
|
||
|
||
'FUNCTION mousedir (x, y) 'returns the angle of the mouse relative to coordinates("x", "y"). Not used in this program, but I keep it around in case that changes.
|
||
'DO
|
||
' mousex = _MOUSEX
|
||
' mousey = _MOUSEY
|
||
'LOOP WHILE _MOUSEINPUT
|
||
'distx = mousex - x
|
||
'disty = mousey - y
|
||
'angle = ATN(disty / distx)
|
||
'IF distx < 0 THEN angle = angle + rad(180)
|
||
'mousedir = angle
|
||
'END FUNCTION
|
||
|
||
FUNCTION recolor& (image&, old~&, new~&) 'requires an image, the color to change, and the new color.
|
||
redo& = _COPYIMAGE(image&) 'makes a copy of the image so that it doesn't mess up the original one
|
||
_SOURCE image& 'set the source as the original image
|
||
_DEST redo& 'set the destination as the new image
|
||
FOR x% = 0 TO _WIDTH(image&) - 1 'loop all x values
|
||
FOR y% = 0 TO _HEIGHT(image&) - 1 'loop all y values
|
||
IF POINT(x%, y%) = old~& THEN PSET (x%, y%), new~& 'if the color at coordinates ("x", "y") = the old color, then make it the new color on the new image
|
||
NEXT 'close the y loop
|
||
NEXT 'close the x loop
|
||
recolor& = _COPYIMAGE(redo&) 'return the new image
|
||
_SOURCE 0 'set the source back to the main window
|
||
_DEST 0 'set the destination back to the main window
|
||
_FREEIMAGE redo& 'free the new image because we already returned it and this saves memory
|
||
END FUNCTION
|
||
|
||
FUNCTION colorgreyspectrum& (image&, new~&) 'the secondary livery
|
||
change& = _COPYIMAGE(image&)
|
||
_SOURCE image&
|
||
_DEST change&
|
||
FOR x% = 0 TO _WIDTH(image&) - 1
|
||
FOR y% = 0 TO _HEIGHT(image&) - 1
|
||
FOR grey% = 0 TO 127
|
||
IF POINT(x%, y%) = _RGB(grey%, grey%, grey%) THEN
|
||
red% = _RED32(new~&) * (grey% / 127)
|
||
green% = _GREEN32(new~&) * (grey% / 127)
|
||
blue% = _BLUE32(new~&) * (grey% / 127)
|
||
PSET (x%, y%), _RGB(red%, green%, blue%)
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
FOR grey% = 128 TO 255
|
||
IF POINT(x%, y%) = _RGB(grey%, grey%, grey%) THEN
|
||
red% = _RED32(new~&) + (255 - _RED32(new~&)) / 128 * (grey% - 127)
|
||
green% = _GREEN32(new~&) + (255 - _GREEN32(new~&)) / 128 * (grey% - 127)
|
||
blue% = _BLUE32(new~&) + (255 - _BLUE32(new~&)) / 128 * (grey% - 127)
|
||
PSET (x%, y%), _RGB(red%, green%, blue%)
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
NEXT
|
||
_DEST 0
|
||
_SOURCE 0
|
||
colorgreyspectrum& = _COPYIMAGE(change&)
|
||
_FREEIMAGE change&
|
||
END FUNCTION
|
||
|
||
'FUNCTION darken& (image&, amount) 'Darkens image "image&" by "amount" amount
|
||
'redo& = _COPYIMAGE(image&)
|
||
'_SOURCE image&
|
||
'_DEST redo&
|
||
'FOR x% = 0 TO _WIDTH(image&) - 1
|
||
' FOR y% = 0 TO _HEIGHT(image&) - 1
|
||
' PSET (x%, y%), _RGB(_RED32(POINT(x, y)) / amount, _GREEN32(POINT(x, y)) / amount, _BLUE32(POINT(x, y)) \ amount)
|
||
' NEXT
|
||
'NEXT
|
||
'darken& = _COPYIMAGE(redo&)
|
||
'_SOURCE 0
|
||
'_DEST 0
|
||
'_FREEIMAGE redo&
|
||
'END FUNCTION
|
||
|
||
FUNCTION shadow& (image&) 'Creates a shadow that looks like "image&", excluding black.
|
||
redo& = _NEWIMAGE(_WIDTH(image), _HEIGHT(image), 32)
|
||
_SOURCE image&
|
||
_DEST redo&
|
||
FOR x% = 0 TO _WIDTH(image&) - 1
|
||
FOR y% = 0 TO _HEIGHT(image&) - 1
|
||
oldcolor& = _RGB(_RED32(POINT(x%, y%)), _GREEN32(POINT(x%, y%)), _BLUE32(POINT(x%, y%)))
|
||
IF oldcolor& = _RGB(0, 0, 0) THEN PSET (x%, y%), _RGB(255, 255, 255)
|
||
IF oldcolor& <> _RGB(0, 0, 0) THEN PSET (x%, y%), _RGBA(0, 0, 0, 127)
|
||
NEXT
|
||
NEXT
|
||
_CLEARCOLOR _RGB(255, 255, 255), redo&
|
||
shadow& = _COPYIMAGE(redo&)
|
||
_SOURCE 0
|
||
_DEST 0
|
||
_FREEIMAGE redo&
|
||
END FUNCTION
|
||
|
||
FUNCTION sinecolor% (outer AS INTEGER, inner AS INTEGER, x AS INTEGER, y AS INTEGER, sinx AS INTEGER, siny AS INTEGER)
|
||
IF outer = inner THEN
|
||
sinecolor% = outer
|
||
ELSE
|
||
IF inner > outer THEN
|
||
sinecolor% = (SIN(pi / x * sinx) + (SIN(pi / y * siny) - 1)) * (inner - outer) + outer
|
||
ELSE sinecolor% = (1 - (SIN(pi / x * sinx) + (SIN(pi / y * siny) - 1))) * (outer - inner) + inner
|
||
END IF
|
||
END IF
|
||
END FUNCTION
|
||
|
||
FUNCTION blob& (x%, y%, outer~&, inner~&) 'generates the round sprites for explosions and the like
|
||
effect& = _NEWIMAGE(x%, y%, 32)
|
||
_DEST effect&
|
||
FOR sinx% = 0 TO x% - 1
|
||
FOR siny% = 0 TO y% - 1
|
||
PSET (sinx%, siny%), _RGBA(sinecolor%(_RED32(outer~&), _RED32(inner~&), x%, y%, sinx%, siny%), sinecolor%(_GREEN32(outer~&), _GREEN32(inner~&), x%, y%, sinx%, siny%), sinecolor%(_BLUE32(outer~&), _BLUE32(inner~&), x%, y%, sinx%, siny%), (SIN(pi / x% * sinx%) + (SIN(pi / y% * siny%) - 1)) * 255)
|
||
NEXT
|
||
NEXT
|
||
blob& = _COPYIMAGE(effect&)
|
||
_FREEIMAGE effect&
|
||
END FUNCTION
|
||
|
||
SUB aimer (planes() AS airplane, plane%, numplanes%) 'The aimer mod.
|
||
angle = planes(plane%).dir
|
||
FOR a% = 1 TO numplanes%
|
||
IF planes(a%).team <> planes(plane%).team THEN
|
||
distx% = planes(a%).x - planes(plane%).x
|
||
disty% = planes(a%).y - planes(plane%).y
|
||
totaldist = SQR(distx% ^ 2 + disty% ^ 2)
|
||
newposx% = totaldist / 16 * planes(a%).speed * COS(planes(a%).dir)
|
||
newposy% = totaldist / 16 * planes(a%).speed * SIN(planes(a%).dir)
|
||
distx% = distx% + newposx%
|
||
disty% = disty% + newposy%
|
||
CIRCLE (distx% + planes(plane%).x + xoffset%, disty% + planes(plane%).y + yoffset%), 16, _RGB(255, 0, 0)
|
||
END IF
|
||
NEXT
|
||
LINE (planes(plane%).x + xoffset%, planes(plane%).y + yoffset%)-(planes(plane%).x + COS(planes(plane%).dir) * (swidth / 2 - 100) + xoffset%, planes(plane%).y + SIN(planes(plane%).dir) * (swidth / 2 - 100) + yoffset%), _RGB(255, 0, 0)
|
||
LINE (planes(plane%).x + xoffset%, planes(plane%).y + yoffset%)-(planes(plane%).x + COS(planes(plane%).dir - pi / 6) * (swidth / 2 - 100) + xoffset%, planes(plane%).y + SIN(planes(plane%).dir - pi / 6) * (swidth / 2 - 100) + yoffset%), _RGB(255, 0, 0)
|
||
LINE (planes(plane%).x + xoffset%, planes(plane%).y + yoffset%)-(planes(plane%).x + COS(planes(plane%).dir + pi / 6) * (swidth / 2 - 100) + xoffset%, planes(plane%).y + SIN(planes(plane%).dir + pi / 6) * (swidth / 2 - 100) + yoffset%), _RGB(255, 0, 0)
|
||
END SUB
|
||
|
||
SUB converter (plane AS airplane, ifon%) 'The energy ==> armor mod.
|
||
IF plane.armor < plane.maxarm THEN
|
||
plane.armor = plane.armor + .01 * plane.maxarm / 10
|
||
ELSE
|
||
ifon% = 0
|
||
END IF
|
||
END SUB
|
||
|
||
SUB srb (plane AS airplane, contrails%(), numcontrail%, booster AS aug) 'The solid rocket booster mod.
|
||
makecontrail plane.x, plane.y, contrails%(), numcontrail%
|
||
IF booster.fuel > 0 THEN
|
||
plane.speed = plane.speed + 0.05
|
||
booster.fuel = booster.fuel - 1
|
||
ELSE
|
||
booster.ammo = booster.ammo - 1
|
||
IF booster.ammo > 0 THEN
|
||
booster.fuel = 180
|
||
booster.ifon = 0
|
||
ELSE
|
||
DIM blankspace AS aug
|
||
booster = blankspace
|
||
END IF
|
||
END IF
|
||
END SUB
|
||
|
||
'SUB scope (plane AS airplane) The defunct scope mod, preserved for old times sake.
|
||
'screenanchorx% = plane.x + COS(plane.dir) * (sheight / 2 - 16)
|
||
'screenanchory% = plane.y + SIN(plane.dir) * (sheight / 2 - 16)
|
||
'xoffset% = -screenanchorx% + swidth / 2 - 100
|
||
'yoffset% = -screenanchory% + sheight / 2
|
||
'END SUB
|
||
|
||
SUB flare (plane%, planes AS airplane, missiles() AS missile, nummissile%, flr AS aug, flares(), numflare%) 'The flare mod.
|
||
IF flr.ammo > 0 THEN
|
||
flr.ammo = flr.ammo - 1
|
||
IF numflare% < 125 THEN
|
||
FOR j = 0 TO 3
|
||
numflare% = numflare% + 1
|
||
flares(numflare%, 0) = planes.x 'x position
|
||
flares(numflare%, 1) = planes.y 'y position
|
||
flares(numflare%, 2) = 0 'time
|
||
flaredirx = RND * 4 - 2
|
||
flarediry = RND * 4 - 2
|
||
flares(numflare%, 3) = ATN((SIN(planes.dir) * planes.speed + flarediry) / (COS(planes.dir) * planes.speed + flaredirx)) 'direction
|
||
IF COS(planes.dir) * planes.speed + flaredirx < 0 THEN flares(numflare%, 3) = flares(numflare%, 3) + pi
|
||
flares(numflare%, 4) = SQR((SIN(planes.dir) * planes.speed + flarediry) ^ 2 + (COS(planes.dir) * planes.speed + flaredirx) ^ 2) 'speed
|
||
NEXT
|
||
END IF
|
||
IF nummissile% > 0 THEN
|
||
FOR i = 1 TO nummissile%
|
||
IF missiles(i).target = plane% THEN
|
||
chance% = INT(RND * 5)
|
||
IF chance% <> 0 THEN missiles(i).target = -1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
flr.ifon = 0
|
||
IF flr.ammo <= 0 THEN
|
||
DIM blankspace AS aug
|
||
flr = blankspace
|
||
END IF
|
||
END IF
|
||
END SUB
|
||
|
||
SUB makeshot (lazers() AS shot, numlazer%, plane AS airplane, fired%, shot%, position%, inmarket AS INTEGER) 'makes the specified "shot" in front of plane "plane", and makes the firing sound.
|
||
STATIC vulcansound%
|
||
IF numlazer% < 4999 THEN
|
||
SELECT CASE position%
|
||
CASE 1
|
||
x = plane.x + COS(plane.dir) * 32
|
||
y = plane.y + SIN(plane.dir) * 32
|
||
CASE 2
|
||
x = plane.x + COS(plane.dir) * 28 + COS(plane.dir + pi / 2) * 4
|
||
y = plane.y + SIN(plane.dir) * 28 + SIN(plane.dir + pi / 2) * 4
|
||
makeshot lazers(), numlazer%, plane, fired%, shot%, 6, inmarket
|
||
CASE 3
|
||
x = plane.x + COS(plane.dir) * 24 + COS(plane.dir + pi / 2) * 8
|
||
y = plane.y + SIN(plane.dir) * 24 + SIN(plane.dir + pi / 2) * 8
|
||
makeshot lazers(), numlazer%, plane, fired%, shot%, 7, inmarket
|
||
CASE 6
|
||
x = plane.x + COS(plane.dir) * 28 + COS(plane.dir - pi / 2) * 4
|
||
y = plane.y + SIN(plane.dir) * 28 + SIN(plane.dir - pi / 2) * 4
|
||
CASE 7
|
||
x = plane.x + COS(plane.dir) * 24 + COS(plane.dir - pi / 2) * 8
|
||
y = plane.y + SIN(plane.dir) * 24 + SIN(plane.dir - pi / 2) * 8
|
||
END SELECT
|
||
numlazer% = numlazer% + 1
|
||
lazers(numlazer%).x = x
|
||
lazers(numlazer%).y = y
|
||
lazers(numlazer%).dir = plane.dir
|
||
lazers(numlazer%).fired = fired%
|
||
lazers(numlazer%).kind = shot%
|
||
SELECT CASE shot%
|
||
CASE 1
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight AND inmarket = 0 THEN
|
||
zap& = _SNDOPEN("laser.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
END IF
|
||
lazers(numlazer%).speed = 16
|
||
lazers(numlazer%).damage = .5
|
||
lazers(numlazer%).shape = 0
|
||
lazers(numlazer%).color = _RGB(255, 0, 0)
|
||
CASE 2
|
||
lazers(numlazer%).dir = lazers(numlazer%).dir + rad(RND * 4 - 2)
|
||
vulcansound% = vulcansound% + 1
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight AND inmarket = 0 AND vulcansound% >= 5 THEN
|
||
zap& = _SNDOPEN("shoot.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
vulcansound% = vulcansound% - 5
|
||
END IF
|
||
lazers(numlazer%).speed = 20
|
||
lazers(numlazer%).damage = .05
|
||
lazers(numlazer%).shape = 1
|
||
lazers(numlazer%).color = _RGB(0, 0, 0)
|
||
CASE 3
|
||
lazers(numlazer%).speed = 16
|
||
lazers(numlazer%).damage = .25
|
||
lazers(numlazer%).shape = 2
|
||
lazers(numlazer%).color = _RGB(0, 100, 200)
|
||
FOR spread% = 0 TO 1
|
||
numlazer% = numlazer% + 1
|
||
lazers(numlazer%).x = x
|
||
lazers(numlazer%).y = y
|
||
lazers(numlazer%).dir = plane.dir - pi / 6 + spread% * pi / 3
|
||
lazers(numlazer%).fired = fired%
|
||
lazers(numlazer%).kind = 3
|
||
lazers(numlazer%).speed = 16
|
||
lazers(numlazer%).damage = .25
|
||
lazers(numlazer%).shape = 2
|
||
lazers(numlazer%).color = _RGB(0, 100, 200)
|
||
NEXT
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight AND inmarket = 0 THEN
|
||
zap& = _SNDOPEN("laser.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
END IF
|
||
CASE 4
|
||
lazers(numlazer%).speed = 18
|
||
lazers(numlazer%).damage = 1
|
||
lazers(numlazer%).shape = 3
|
||
lazers(numlazer%).color = _RGB(0, 255, 0)
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight AND inmarket = 0 THEN
|
||
zap& = _SNDOPEN("plasma.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
END IF
|
||
CASE 5
|
||
lazers(numlazer%).dir = lazers(numlazer%).dir + rad(RND * 4 - 2)
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight AND inmarket = 0 THEN
|
||
zap& = _SNDOPEN("gauss.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
END IF
|
||
lazers(numlazer%).speed = 20
|
||
lazers(numlazer%).damage = .05
|
||
lazers(numlazer%).shape = 1
|
||
lazers(numlazer5).color = _RGB(0, 0, 0)
|
||
FOR spread% = 0 TO 6
|
||
numlazer% = numlazer% + 1
|
||
lazers(numlazer%).x = x
|
||
lazers(numlazer%).y = y
|
||
lazers(numlazer%).dir = plane.dir + rad(RND * 4 - 2)
|
||
lazers(numlazer%).fired = fired%
|
||
lazers(numlazer%).kind = 5
|
||
lazers(numlazer%).speed = 20
|
||
lazers(numlazer%).damage = .05
|
||
lazers(numlazer%).shape = 1
|
||
lazers(numlazer%).color = _RGB(0, 0, 0)
|
||
NEXT
|
||
CASE 6
|
||
lazers(numlazer%).dir = lazers(numlazer%).dir + rad(RND * 4 - 2)
|
||
vulcansound% = vulcansound% + 1
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight AND inmarket = 0 AND vulcansound% >= 5 THEN
|
||
zap& = _SNDOPEN("shoot.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
vulcansound% = vulcansound% - 5
|
||
END IF
|
||
lazers(numlazer%).speed = 20
|
||
lazers(numlazer%).damage = .1
|
||
lazers(numlazer%).shape = 1
|
||
lazers(numlazer%).color = _RGB(0, 0, 0)
|
||
plane.speed = plane.speed - .01
|
||
END SELECT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB makecharge (lazers() AS shot, numlazer%, plane%, planes() AS airplane, shot%, power, position%, numplanes%) 'basically makeshot for charging weapons
|
||
IF numlazer% < 4999 THEN
|
||
SELECT CASE position%
|
||
CASE 1
|
||
x = planes(plane%).x + COS(planes(plane%).dir) * 16
|
||
y = planes(plane%).y + SIN(planes(plane%).dir) * 16
|
||
CASE 2
|
||
x = planes(plane%).x + COS(planes(plane%).dir) * 12 + COS(planes(plane%).dir + pi / 2) * 4
|
||
y = planes(plane%).y + SIN(planes(plane%).dir) * 12 + SIN(planes(plane%).dir + pi / 2) * 4
|
||
makecharge lazers(), numlazer%, plane%, planes(), shot%, power, 6, numplanes%
|
||
CASE 3
|
||
x = planes(plane%).x + COS(planes(plane%).dir) * 8 + COS(planes(plane%).dir + pi / 2) * 8
|
||
y = planes(plane%).y + SIN(planes(plane%).dir) * 8 + SIN(planes(plane%).dir + pi / 2) * 8
|
||
makecharge lazers(), numlazer%, plane%, planes(), shot%, power, 7, numplanes%
|
||
CASE 6
|
||
x = planes(plane%).x + COS(planes(plane%).dir) * 12 + COS(planes(plane%).dir - pi / 2) * 4
|
||
y = planes(plane%).y + SIN(planes(plane%).dir) * 12 + SIN(planes(plane%).dir - pi / 2) * 4
|
||
CASE 7
|
||
x = planes(plane%).x + COS(planes(plane%).dir) * 8 + COS(planes(plane%).dir - pi / 2) * 8
|
||
y = planes(plane%).y + SIN(planes(plane%).dir) * 8 + SIN(planes(plane%).dir - pi / 2) * 8
|
||
END SELECT
|
||
numlazer% = numlazer% + 1
|
||
lazers(numlazer%).x = x
|
||
lazers(numlazer%).y = y
|
||
lazers(numlazer%).dir = planes(plane%).dir
|
||
lazers(numlazer%).fired = plane%
|
||
lazers(numlazer%).kind = shot%
|
||
lazers(numlazer%).charge = power * 5
|
||
SELECT CASE shot%
|
||
CASE 7
|
||
lazers(numlazer%).speed = 12
|
||
lazers(numlazer%).shape = 3
|
||
lazers(numlazer%).color = _RGB(0, 255, 0)
|
||
lazers(numlazer%).target = -1
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight THEN
|
||
zap& = _SNDOPEN("bolt.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
END IF
|
||
smallangle = pi / 4
|
||
FOR k% = 0 TO numplanes%
|
||
IF planes(k%).team <> planes(plane%).team OR planes(k%).armor <> 0 THEN
|
||
distx% = planes(k%).x - lazers(numlazer%).x
|
||
disty% = planes(k%).y - lazers(numlazer%).y
|
||
dist = SQR(distx% ^ 2 + disty% ^ 2)
|
||
angle2 = ATN(disty% / distx%)
|
||
IF distx% < 0 THEN angle2 = angle2 + pi
|
||
IF angle2 < 0 THEN angle2 = angle2 + 2 * pi
|
||
angledist = ABS(lazers(numlazer%).dir - angle2)
|
||
IF angledist <= pi / 6 AND dist > 48 AND angledist < smallangle THEN
|
||
smallangle = angledist
|
||
lazers(numlazer%).target = k%
|
||
END IF
|
||
END IF
|
||
NEXT
|
||
CASE 8
|
||
lazers(numlazer%).speed = 16
|
||
lazers(numlazer%).shape = 4
|
||
lazers(numlazer%).color = _RGB(127, 0, 255)
|
||
IF x + xoffset% > 0 AND x + xoffset% < swidth - 200 AND y + yoffset% > 0 AND y + yoffset% < sheight THEN
|
||
zap& = _SNDOPEN("bolt.wav", "sync")
|
||
IF zap& THEN _SNDPLAY zap&
|
||
_SNDCLOSE zap&
|
||
END IF
|
||
END SELECT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB makemissile (missiles() AS missile, nummissile%, plane%, planes() AS airplane, shot%, numplanes%) 'makes the specified missile "shot" in front of plane "plane", makes the firing sound, and chooses its target.
|
||
IF nummissile% < 49 THEN
|
||
nummissile% = nummissile% + 1
|
||
missiles(nummissile%).x = planes(plane%).x
|
||
missiles(nummissile%).y = planes(plane%).y
|
||
IF missiles(nummissile%).x + xoffset% > 0 AND missiles(nummissile%).x + xoffset% < swidth - 200 AND missiles(nummissile%).y + yoffset% > 0 AND missiles(nummissile%).y + yoffset% < sheight THEN
|
||
whoosh& = _SNDOPEN("missile.wav", "sync")
|
||
IF whoosh& THEN _SNDPLAY whoosh&
|
||
_SNDCLOSE whoosh&
|
||
END IF
|
||
missiles(nummissile%).dir = planes(plane%).dir
|
||
missiles(nummissile%).fired = plane%
|
||
missiles(nummissile%).duration = 0
|
||
missiles(nummissile%).target = -1
|
||
missiles(nummissile%).kind = shot%
|
||
smallangle = pi / 4
|
||
FOR k% = 0 TO numplanes%
|
||
IF planes(k%).team <> planes(plane%).team OR planes(k%).armor > 0 THEN
|
||
distx% = planes(k%).x - missiles(nummissile%).x
|
||
disty% = planes(k%).y - missiles(nummissile%).y
|
||
dist = SQR(distx% ^ 2 + disty% ^ 2)
|
||
angle2 = ATN(disty% / distx%) ' In this case, there is no angle1. angle2 is the angle between the missile and its target.
|
||
IF distx% < 0 THEN angle2 = angle2 + pi
|
||
IF angle2 < 0 AND missiles(nummissile%).dir >= pi / 6 AND missiles(nummissile%).dir <= 11 * pi / 6 THEN 'When I refer to "fixing" an angle, I mean to add 2 * pi if it's negative.
|
||
angle2 = angle2 + 2 * pi ' only fix angle2 if the missile isn't pinting east.
|
||
ELSE IF missiles(nummissile%).dir > 11 * pi / 6 THEN missiles(nummissile%).dir = missiles(nummissile%).dir - 2 * pi 'if it is pointing east, un-fix the missile's angle instead.
|
||
END IF
|
||
angledist = ABS(missiles(nummissile%).dir - angle2)
|
||
IF angledist <= pi / 6 AND dist > 48 AND angledist < smallangle THEN
|
||
smallangle = angledist
|
||
missiles(nummissile%).target = k%
|
||
END IF
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB lazer (lazers() AS shot, planes() AS airplane, points() AS score, numlazer%, explosions%(), numexplosion%, numplanes%, difficulty, plas&, spread&, pulse&, mods() AS aug, debriss() AS debris, numdebris%) 'Handles all of the bullets and their collisions. Note: When I discovered that it should be spelled "laser," it was already too late. It would have taken hours to change all the references to "lazer," "makelazer," "numlazer," and "lazers()."
|
||
IF numlazer% > 0 THEN
|
||
FOR k% = 1 TO numlazer%
|
||
lazers(k%).x = lazers(k%).x + COS(lazers(k%).dir) * lazers(k%).speed
|
||
lazers(k%).y = lazers(k%).y + SIN(lazers(k%).dir) * lazers(k%).speed
|
||
SELECT CASE lazers(k%).shape
|
||
CASE 0: LINE (lazers(k%).x + xoffset%, lazers(k%).y + yoffset%)-(lazers(k%).x - COS(lazers(k%).dir) * 16 + xoffset%, lazers(k%).y - SIN(lazers(k%).dir) * 16 + yoffset%), lazers(k%).color
|
||
CASE 1: LINE (lazers(k%).x + xoffset%, lazers(k%).y + yoffset%)-(lazers(k%).x + xoffset% + 1, lazers(k%).y + yoffset% + 1), lazers(k%).color, BF
|
||
CASE 2: _PUTIMAGE (lazers(k%).x - 4 + xoffset%, lazers(k%).y - 4 + yoffset%), spread&
|
||
CASE 3: _PUTIMAGE (lazers(k%).x - 4 + xoffset%, lazers(k%).y - 4 + yoffset%), plas&
|
||
CASE 4: _PUTIMAGE (lazers(k%).x - 4 + xoffset%, lazers(k%).y - 4 + yoffset%), pulse&
|
||
END SELECT
|
||
FOR p% = 0 TO numplanes%
|
||
IF trigger(planes(p%).x - 16, planes(p%).y - 16, planes(p%).x + 15, planes(p%).y + 15, lazers(k%).x, lazers(k%).y) AND planes(p%).armor > 0 AND p% <> lazers(k%).fired THEN
|
||
IF lazers(k%).x + xoffset% > 0 AND lazers(k%).x + xoffset% < swidth - 200 AND lazers(k%).y + yoffset% > 0 AND lazers(k%).y + yoffset% < sheight THEN
|
||
hit& = _SNDOPEN("hit.wav", "sync")
|
||
IF hit& <> 0 THEN _SNDPLAY hit&
|
||
_SNDCLOSE hit&
|
||
END IF
|
||
IF planes(p%).team <> planes(lazers(k%).fired).team THEN
|
||
planes(p%).lasthit = lazers(k%).fired
|
||
ELSE
|
||
IF planes(p%).team = 0 AND lazers(k%).fired = 0 THEN PRINT "Hey, Einstein! I'm on your side!"
|
||
END IF
|
||
planes(p%).armor = planes(p%).armor - lazers(k%).damage
|
||
makeexplosion lazers(k%).x, lazers(k%).y, explosions%(), numexplosion%, 15, 0
|
||
IF lazers(k%).kind <> 8 THEN removeshot lazers(), k%, numlazer%
|
||
IF lazers(k%).kind = 8 THEN lazers(k%).charge = lazers(k%).charge * 2
|
||
crash planes(), explosions%(), points(), numexplosion%, numplanes%, difficulty, mods(), debriss(), numdebris%
|
||
END IF
|
||
NEXT
|
||
IF lazers(k%).x < 0 OR lazers(k%).x > 4095 OR lazers(k%).y < 0 OR lazers(k%).y > 4095 THEN removeshot lazers(), k%, numlazer%
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB charge (lazers() AS shot, planes() AS airplane, numlazer%) 'Like lazer, but for charged shots
|
||
IF numlazer% > 0 THEN
|
||
FOR k% = 1 TO numlazer%
|
||
IF lazers(k%).kind = 7 OR lazers(k%).kind = 8 THEN
|
||
lazers(k%).damage = lazers(k%).charge / 100
|
||
IF lazers(k%).kind = 7 THEN
|
||
IF lazers(k%).target <> -1 THEN
|
||
angle = lazers(k%).dir
|
||
distx% = planes(lazers(k%).target).x - lazers(k%).x
|
||
disty% = planes(lazers(k%).target).y - lazers(k%).y
|
||
angle2 = ATN(disty% / distx%)
|
||
IF distx% < 0 THEN angle2 = angle2 + pi
|
||
IF angle2 < 0 THEN angle2 = angle2 + 2 * pi
|
||
IF ABS(angle - angle2) > rad(3) THEN
|
||
IF angle >= pi THEN
|
||
IF angle - angle2 < pi AND angle - angle2 > 0 THEN lazers(k%).dir = lazers(k%).dir - rad(1.5) ELSE lazers(k%).dir = lazers(k%).dir + rad(1.5)
|
||
END IF
|
||
IF angle < pi THEN
|
||
IF angle2 - angle < pi AND angle2 - angle > 0 THEN lazers(k%).dir = lazers(k%).dir + rad(1.5) ELSE lazers(k%).dir = lazers(k%).dir - rad(1.5)
|
||
END IF
|
||
END IF
|
||
IF lazers(k%).dir >= 2 * pi THEN lazers(k%).dir = 0
|
||
IF lazers(k%).dir < 0 THEN lazers(k%).dir = lazers(k%).dir + 2 * pi
|
||
END IF
|
||
END IF
|
||
IF lazers(k%).charge <= 0 THEN removeshot lazers(), k%, numlazer%
|
||
lazers(k%).charge = lazers(k%).charge - 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB removeshot (lazers() AS shot, k%, numlazer%) 'removes bullets after they hit stuff
|
||
FOR a% = k% TO numlazer%
|
||
lazers(a%) = lazers(a% + 1)
|
||
NEXT
|
||
numlazer% = numlazer% - 1
|
||
END SUB
|
||
|
||
SUB missile (missiles() AS missile, planes() AS airplane, points() AS score, nummissile%, contrails%(), numcontrail%, image&, explosions%(), numexplosion%, numplanes%, difficulty, mods() AS aug, debriss() AS debris, numdebris%) 'Handles missiles and their collisions.
|
||
IF nummissile% > 0 THEN
|
||
FOR k% = 1 TO nummissile%
|
||
IF graphsetting = 1 THEN makecontrail missiles(k%).x, missiles(k%).y, contrails%(), numcontrail%
|
||
missiles(k%).x = missiles(k%).x + COS(missiles(k%).dir) * 16
|
||
missiles(k%).y = missiles(k%).y + SIN(missiles(k%).dir) * 16
|
||
makecontrail missiles(k%).x, missiles(k%).y, contrails%(), numcontrail%
|
||
IF missiles(k%).target <> -1 THEN
|
||
angle = missiles(k%).dir
|
||
distx% = planes(missiles(k%).target).x - missiles(k%).x
|
||
disty% = planes(missiles(k%).target).y - missiles(k%).y
|
||
IF missiles(k%).kind = 10 THEN
|
||
totaldist = SQR(distx% ^ 2 + disty% ^ 2)
|
||
newposx% = totaldist / 16 * planes(missiles(k%).target).speed * COS(planes(missiles(k%).target).dir)
|
||
newposy% = totaldist / 16 * planes(missiles(k%).target).speed * SIN(planes(missiles(k%).target).dir)
|
||
distx% = distx% + newposx%
|
||
disty% = disty% + newposy%
|
||
END IF
|
||
CIRCLE (distx% + missiles(k%).x + xoffset%, disty% + missiles(k%).y + yoffset%), 16, _RGB(255, 0, 0)
|
||
IF missiles(k%).target = 0 THEN _PRINTSTRING (swidth / 2 - 100 - _PRINTWIDTH("MISSILE INCOMING!"), sheight / 2 - 32), "MISSILE INCOMING!"
|
||
angle2 = ATN(disty% / distx%)
|
||
IF distx% < 0 THEN angle2 = angle2 + pi
|
||
IF angle2 < 0 THEN angle2 = angle2 + 2 * pi
|
||
IF missiles(k%).kind = 11 THEN turn = .5 ELSE turn = 1.5
|
||
IF ABS(angle - angle2) > rad(3) THEN
|
||
IF angle >= pi THEN
|
||
IF angle - angle2 < pi AND angle - angle2 > 0 THEN missiles(k%).dir = missiles(k%).dir - rad(turn) ELSE missiles(k%).dir = missiles(k%).dir + rad(turn)
|
||
END IF
|
||
IF angle < pi THEN
|
||
IF angle2 - angle < pi AND angle2 - angle > 0 THEN missiles(k%).dir = missiles(k%).dir + rad(turn) ELSE missiles(k%).dir = missiles(k%).dir - rad(turn)
|
||
END IF
|
||
END IF
|
||
IF missiles(k%).dir >= 2 * pi THEN missiles(k%).dir = 0
|
||
IF missiles(k%).dir < 0 THEN missiles(k%).dir = missiles(k%).dir + 2 * pi
|
||
END IF
|
||
rotator missiles(k%).x + xoffset%, missiles(k%).y + yoffset%, missiles(k%).dir, image&, 0, 0, 15, 15, 16
|
||
IF missiles(k%).kind <> 11 THEN
|
||
FOR p% = 0 TO numplanes%
|
||
IF trigger(planes(p%).x - 16, planes(p%).y - 16, planes(p%).x + 15, planes(p%).y + 15, missiles(k%).x, missiles(k%).y) AND planes(p%).armor > 0 AND p% <> missiles(k%).fired THEN
|
||
IF missiles(k%).x + xoffset% > 0 AND missiles(k%).x + xoffset% < swidth - 200 AND missiles(k%).y + yoffset% > 0 AND missiles(k%).y + yoffset% < sheight THEN
|
||
hit& = _SNDOPEN("missilehit.wav", "sync")
|
||
IF hit& <> 0 THEN _SNDPLAY hit&
|
||
_SNDCLOSE hit&
|
||
END IF
|
||
IF planes(p%).team <> planes(missiles(k%).fired).team THEN
|
||
planes(p%).lasthit = missiles(k%).fired
|
||
ELSE
|
||
IF planes(p%).team = 0 AND missiles(k%).fired = 0 THEN PRINT "Hey, Einstein! I'm on your side!"
|
||
END IF
|
||
planes(p%).armor = planes(p%).armor - 5
|
||
makeexplosion missiles(k%).x, missiles(k%).y, explosions%(), numexplosion%, 30, 0
|
||
removemissile missiles(), k%, nummissile%
|
||
crash planes(), explosions%(), points(), numexplosion%, numplanes%, difficulty, mods(), debriss(), numdebris%
|
||
END IF
|
||
NEXT
|
||
ELSE
|
||
IF missiles(k%).target <> -1 THEN
|
||
angle = angle + 180
|
||
angle2 = angle2 + 180
|
||
IF ABS(angle - angle2) >= pi / 2 THEN
|
||
FOR p% = 0 TO numplanes%
|
||
distx% = planes(p%).x - missiles(k%).x
|
||
disty% = planes(p%).y - missiles(k%).y
|
||
totaldist = SQR(distx% ^ 2 + disty% ^ 2)
|
||
IF totaldist < 300 THEN
|
||
hit& = _SNDOPEN("cruze.wav", "sync")
|
||
IF hit& <> 0 THEN _SNDPLAY hit&
|
||
_SNDCLOSE hit&
|
||
planes(p%).armor = planes(p%).armor - (30 - totaldist / 10)
|
||
IF planes(p%).team <> planes(missiles(k%).fired).team THEN
|
||
planes(p%).lasthit = missiles(k%).fired
|
||
ELSE
|
||
IF planes(p%).team = 0 AND missiles(k%).fired = 0 THEN PRINT "Hey, Einstein! I'm on your side!"
|
||
END IF
|
||
END IF
|
||
NEXT
|
||
makeexplosion missiles(k%).x, missiles(k%).y, explosions%(), numexplosion%, 120, 1
|
||
removemissile missiles(), k%, nummissile%
|
||
crash planes(), explosions%(), points(), numexplosion%, numplanes%, difficulty, mods(), debriss(), numdebris%
|
||
END IF
|
||
END IF
|
||
END IF
|
||
missiles(k%).duration = missiles(k%).duration + 1
|
||
IF missiles(k%).x < 0 OR missiles(k%).x > 4095 OR missiles(k%).y < 0 OR missiles(k%).y > 4095 THEN removemissile missiles(), k%, nummissile%
|
||
IF missiles(k%).kind = 9 THEN IF missiles(k%).duration >= 180 THEN removemissile missiles(), k%, nummissile%
|
||
IF missiles(k%).kind = 10 THEN IF missiles(k%).duration >= 360 THEN removemissile missiles(), k%, nummissile%
|
||
IF missiles(k%).kind = 11 THEN IF missiles(k%).duration >= 540 THEN removemissile missiles(), k%, nummissile%
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB removemissile (missiles() AS missile, k%, nummissile%) 'Removes missiles.
|
||
FOR a% = k% TO nummissile%
|
||
missiles(a%) = missiles(a% + 1)
|
||
NEXT
|
||
missiles(nummissile%).target = -1
|
||
nummissile% = nummissile% - 1
|
||
END SUB
|
||
|
||
SUB makecontrail (x%, y%, contrails%(), numcontrail%) 'Makes smoke puffs.
|
||
IF numcontrail% < 4999 THEN
|
||
numcontrail% = numcontrail% + 1
|
||
contrails%(numcontrail%, 0) = x%
|
||
contrails%(numcontrail%, 1) = y%
|
||
contrails%(numcontrail%, 2) = 0
|
||
END IF
|
||
END SUB
|
||
|
||
SUB makeexplosion (x%, y%, explosions%(), numexplosion%, duration%, kind%) 'Makes the explosions.
|
||
IF numexplosion% < 199 THEN
|
||
numexplosion% = numexplosion% + 1
|
||
explosions%(numexplosion%, 0) = x% ' x position
|
||
explosions%(numexplosion%, 1) = y% ' y position
|
||
explosions%(numexplosion%, 2) = 0 ' time in existence
|
||
explosions%(numexplosion%, 3) = duration% ' end of life
|
||
explosions%(numexplosion%, 4) = kind% ' kind of explostion
|
||
END IF
|
||
END SUB
|
||
|
||
SUB maketrail (x%, y%, trails%(), numtrail%, wing%)
|
||
IF numtrail% < 999 THEN
|
||
numtrail% = numtrail% + 1
|
||
trails%(numtrail%, 0) = x% ' x position
|
||
trails%(numtrail%, 1) = y% ' y position
|
||
trails%(numtrail%, 2) = 0 ' time in existence
|
||
trails%(numtrail%, 3) = wing% ' wing to follow
|
||
END IF
|
||
END SUB
|
||
|
||
SUB makedebris (plane AS airplane, debriss() AS debris, numdebris%)
|
||
IF numdebris% <= 252 THEN
|
||
FOR k = 0 TO 3
|
||
numdebris% = numdebris% + 1
|
||
debriss(numdebris%).x = plane.x
|
||
debriss(numdebris%).y = plane.y
|
||
debriss(numdebris%).life = 0 'time in existence
|
||
debrisdirx = RND * 4 - 2
|
||
debrisdiry = RND * 4 - 2
|
||
debriss(numdebris%).dir = ATN((SIN(plane.dir) * plane.speed + debrisdiry) / (COS(plane.dir) * plane.speed + debrisdirx)) 'direction
|
||
IF COS(plane.dir) * plane.speed + debrisdirx < 0 THEN debriss(numdebris%).dir = debriss(numdebris%).dir + pi
|
||
debriss(numdebris%).speed = SQR((SIN(plane.dir) * plane.speed + debrisdiry) ^ 2 + (COS(plane.dir) * plane.speed + debrisdirx) ^ 2) 'speed
|
||
debriss(numdebris%).image = _NEWIMAGE(_HEIGHT(plane.image) / 2, _HEIGHT(plane.image) / 2, 32) 'use height for both since we want a square
|
||
SELECT CASE k
|
||
'remember that the image of the plane that we want is a square in the center of plane.image, not the whole thing
|
||
CASE 0: _PUTIMAGE , plane.image, debriss(numdebris%).image, (64, 0)-STEP(15, 15)
|
||
CASE 1: _PUTIMAGE , plane.image, debriss(numdebris%).image, (64 + _HEIGHT(plane.image) / 2, 0)-STEP(15, 15)
|
||
CASE 2: _PUTIMAGE , plane.image, debriss(numdebris%).image, (64, _HEIGHT(plane.image) / 2)-STEP(15, 15)
|
||
CASE 3: _PUTIMAGE , plane.image, debriss(numdebris%).image, (64 + _HEIGHT(plane.image) / 2, _HEIGHT(plane.image) / 2)-STEP(15, 15)
|
||
END SELECT
|
||
debriss(numdebris%).angle = debriss(numdebriss%).dir
|
||
debriss(numdebris%).rotation = RND * 4 - 2
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB contrail (contrails%(), numcontrail%, contraileffect&) 'makes the smoke puffs wiggle, and removes them when it's time.
|
||
IF numcontrail% > 0 THEN
|
||
FOR k% = 1 TO numcontrail%
|
||
contrails%(k%, 0) = contrails%(k%, 0) + INT(RND * 3) - 1
|
||
contrails%(k%, 1) = contrails%(k%, 1) + INT(RND * 3) - 1
|
||
contrails%(k%, 2) = contrails%(k%, 2) + 1
|
||
IF graphsetting = 0 AND contrails%(k%, 2) >= 60 THEN remove contrails%(), k%, numcontrail%, 2
|
||
IF contrails%(k%, 2) >= 180 THEN remove contrails%(), k%, numcontrail%, 2
|
||
IF contrails%(k%, 0) + xoffset% > 0 AND contrails%(k%, 0) + xoffset% < swidth - 200 AND contrails%(k%, 1) + yoffset% > 0 AND contrails%(k%, 1) + yoffset% < sheight THEN
|
||
_PUTIMAGE (contrails%(k%, 0) + xoffset% - 8, contrails%(k%, 1) + yoffset% - 8), contraileffect&
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB explosion (explosions%(), numexplosion%, explosioneffect&) 'Makes the explosions animate, and removes them when it's time.
|
||
IF numexplosion% > 0 THEN
|
||
FOR k% = 1 TO numexplosion%
|
||
IF explosions%(k%, 0) + xoffset% > 0 AND explosions%(k%, 0) + xoffset% < swidth - 200 AND explosions%(k%, 1) + yoffset% > 0 AND explosions%(k%, 1) + yoffset% < sheight THEN
|
||
IF explosions%(k%, 4) = 0 THEN
|
||
_PUTIMAGE (explosions%(k%, 0) + xoffset% - explosions%(k%, 2), explosions%(k%, 1) + yoffset% - explosions%(k%, 2))-(explosions%(k%, 0) + xoffset% + explosions%(k%, 2) - 1, explosions%(k%, 1) + yoffset% + explosions%(k%, 2) - 1), explosioneffect&
|
||
END IF
|
||
IF explosions%(k%, 4) = 1 THEN
|
||
LINE (0, 0)-(swidth - 201, sheight - 1), _RGBA(0, 0, 0, 127 - (explosions%(k%, 2) / explosions%(k%, 3) * 127)), BF
|
||
IF explosions%(k%, 2) <= 30 THEN LINE (0, 0)-(swidth - 201, sheight - 1), _RGBA(255, 255, 255, 255 - (explosions%(k%, 2) / 30 * 255)), BF
|
||
END IF
|
||
END IF
|
||
explosions%(k%, 2) = explosions%(k%, 2) + 1
|
||
IF explosions%(k%, 2) >= explosions%(k%, 3) THEN remove explosions%(), k%, numexplosion%, 4
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB trail (trails%(), numtrail%, numplanes%)
|
||
DIM traillinks(32, 32) AS INTEGER
|
||
IF numtrail% > 0 THEN
|
||
FOR p% = 0 TO numplanes% * 2 + 1 '# of wings
|
||
numlink% = 0
|
||
FOR k% = 1 TO numtrail%
|
||
IF trails%(k%, 3) = p% THEN
|
||
traillinks(p%, numlink%) = k%
|
||
numlink% = numlink% + 1
|
||
IF numlink% >= 30 THEN numlink% = 30
|
||
END IF
|
||
NEXT
|
||
IF numlink% > 0 THEN
|
||
FOR l% = 1 TO numlink% - 1
|
||
IF trails%(traillinks(p%, l%), 0) + xoffset% > 0 AND trails%(traillinks(p%, l%), 0) + xoffset% < swidth - 200 AND trails%(traillinks(p%, l%), 1) + yoffset% > 0 AND trails%(traillinks(p%, l%), 1) + yoffset% < sheight THEN
|
||
IF trails%(traillinks(p%, l%), 2) >= trails%(traillinks(p%, l% - 1), 2) - 2 THEN LINE (trails%(traillinks(p%, l%), 0) + xoffset%, trails%(traillinks(p%, l%), 1) + yoffset%)-(trails%(traillinks(p%, l% - 1), 0) + xoffset%, trails%(traillinks(p%, l% - 1), 1) + yoffset%), _RGB(191, 191, 191)
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
NEXT
|
||
FOR a% = 1 TO numtrail%
|
||
trails%(a%, 2) = trails%(a%, 2) + 1
|
||
IF trails%(a%, 2) >= 30 THEN remove trails%(), a%, numtrail%, 3
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB flareeffect (flares(), numflare%, contrails%(), numcontrail%, flareimage&)
|
||
IF numflare% > 0 THEN
|
||
FOR i = 1 TO numflare%
|
||
flares(i, 0) = flares(i, 0) + COS(flares(i, 3)) * flares(i, 4)
|
||
flares(i, 1) = flares(i, 1) + SIN(flares(i, 3)) * flares(i, 4)
|
||
_PUTIMAGE (flares(i, 0) - 4 + xoffset%, flares(i, 1) - 4 + yoffset%), flareimage&
|
||
makecontrail flares(i, 0), flares(i, 1), contrails%(), numcontrail%
|
||
flares(i, 2) = flares(i, 2) + 1
|
||
IF flares(i, 2) >= 60 THEN
|
||
FOR b = i TO numflare%
|
||
FOR a = 0 TO 4
|
||
flares(b, a) = flares(b + 1, a)
|
||
NEXT
|
||
NEXT
|
||
numflare% = numflare% - 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB debriseffect (debriss() AS debris, numdebris%, explosions%(), numexplosion%)
|
||
IF numdebris% > 0 THEN
|
||
FOR i = 1 TO numdebris%
|
||
debriss(i).x = debriss(i).x + COS(debriss(i).dir) * debriss(i).speed
|
||
debriss(i).y = debriss(i).y + SIN(debriss(i).dir) * debriss(i).speed
|
||
debriss(i).angle = debriss(i).angle + (debriss(i).rotation / 60)
|
||
rotator debriss(i).x + xoffset%, debriss(i).y + yoffset%, debriss(i).angle, debriss(i).image, 0, 0, 15, 15, 16
|
||
IF debriss(i).life / 5 = debriss(i).life \ 5 THEN makeexplosion debriss(i).x, debriss(i).y, explosions%(), numexplosion%, 15, 0
|
||
IF debriss(i).life >= 60 THEN
|
||
FOR a = i TO numdebris%
|
||
debriss(i) = debriss(i + 1)
|
||
NEXT
|
||
numdebris% = numdebris% - 1
|
||
END IF
|
||
debriss(i).life = debriss(i).life + 1
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB remove (object%(), num%, maxnum%, dims%) 'removes things
|
||
FOR b% = 0 TO dims%
|
||
FOR a% = num% TO maxnum%
|
||
object%(a%, b%) = object%(a% + 1, b%)
|
||
NEXT
|
||
NEXT
|
||
maxnum% = maxnum% - 1
|
||
END SUB
|
||
|
||
SUB cursor 'makes the little circle mouse pointer.
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
LOOP WHILE _MOUSEINPUT
|
||
CIRCLE (mousex%, mousey%), 2, _RGB(255, 255, 255)
|
||
END SUB
|
||
|
||
SUB env 'the main body of the game.
|
||
CLS
|
||
center "Loading...", 4
|
||
_DISPLAY
|
||
DIM topo%(15, 15)
|
||
DIM ground&(43)
|
||
ground&(0) = _LOADIMAGE("grass03.png")
|
||
ground&(1) = _LOADIMAGE("woods02.png")
|
||
'ground&(2) = _LOADIMAGE("water.png")
|
||
ground&(3) = _LOADIMAGE("blendgrasswoodsbottomright.png")
|
||
ground&(4) = _LOADIMAGE("blendgrasswoodsbottomleft.png")
|
||
ground&(5) = _LOADIMAGE("blendgrasswoodstopright.png")
|
||
ground&(6) = _LOADIMAGE("blendgrasswoodstopleft.png")
|
||
ground&(7) = _LOADIMAGE("blendgrasswoodsbottom.png")
|
||
ground&(8) = _LOADIMAGE("blendgrasswoodsleft.png")
|
||
ground&(9) = _LOADIMAGE("blendgrasswoodstop.png")
|
||
ground&(10) = _LOADIMAGE("blendgrasswoodsright.png")
|
||
ground&(11) = _LOADIMAGE("blendgrasswoodstopright2.png")
|
||
ground&(12) = _LOADIMAGE("blendgrasswoodsbottomright2.png")
|
||
ground&(13) = _LOADIMAGE("blendgrasswoodsbottomleft2.png")
|
||
ground&(14) = _LOADIMAGE("blendgrasswoodstopleft2.png")
|
||
ground&(15) = _LOADIMAGE("blendgrasswoodsubottom.png")
|
||
ground&(16) = _LOADIMAGE("blendgrasswoodsuleft.png")
|
||
ground&(17) = _LOADIMAGE("blendgrasswoodsutop.png")
|
||
ground&(18) = _LOADIMAGE("blendgrasswoodsuright.png")
|
||
ground&(19) = _LOADIMAGE("blendgrasswoodscornerstop.png")
|
||
ground&(20) = _LOADIMAGE("blendgrasswoodscornersright.png")
|
||
ground&(21) = _LOADIMAGE("blendgrasswoodscornersbottom.png")
|
||
ground&(22) = _LOADIMAGE("blendgrasswoodscornersleft.png")
|
||
ground&(23) = _LOADIMAGE("blendgrasswoodsclearing.png")
|
||
ground&(24) = _LOADIMAGE("blendgrasswoodstopbottomright.png")
|
||
ground&(25) = _LOADIMAGE("blendgrasswoodstopbottomleft.png")
|
||
ground&(26) = _LOADIMAGE("blendgrasswoodsbottomtopright.png")
|
||
ground&(27) = _LOADIMAGE("blendgrasswoodsbottomtopleft.png")
|
||
ground&(28) = _LOADIMAGE("blendgrasswoodsrightbottomleft.png")
|
||
ground&(29) = _LOADIMAGE("blendgrasswoodsrighttopleft.png")
|
||
ground&(30) = _LOADIMAGE("blendgrasswoodsleftbottomright.png")
|
||
ground&(31) = _LOADIMAGE("blendgrasswoodslefttopright.png")
|
||
ground&(32) = _LOADIMAGE("blendgrasswoodshoriz.png")
|
||
ground&(33) = _LOADIMAGE("blendgrasswoodsvert.png")
|
||
ground&(34) = _LOADIMAGE("blendgrasswoodstopwithcorners.png")
|
||
ground&(35) = _LOADIMAGE("blendgrasswoodsrightwithcorners.png")
|
||
ground&(36) = _LOADIMAGE("blendgrasswoodsbottomwithcorners.png")
|
||
ground&(37) = _LOADIMAGE("blendgrasswoodsleftwithcorners.png")
|
||
ground&(38) = _LOADIMAGE("blendgrasswoodstoprightcurve.png")
|
||
ground&(39) = _LOADIMAGE("blendgrasswoodsbottomrightcurve.png")
|
||
ground&(40) = _LOADIMAGE("blendgrasswoodsbottomleftcurve.png")
|
||
ground&(41) = _LOADIMAGE("blendgrasswoodstopleftcurve.png")
|
||
ground&(42) = _LOADIMAGE("blendgrasswoodsforwardslash.png")
|
||
ground&(43) = _LOADIMAGE("blendgrasswoodsbackslash.png")
|
||
pointx% = INT(RND * 16)
|
||
pointy% = INT(RND * 16)
|
||
topo%(pointx%, pointy%) = 1
|
||
size% = 64
|
||
DO UNTIL size% = 0
|
||
pointx% = pointx% + INT(RND * 3) - 1
|
||
IF pointx% > 15 THEN pointx% = 14: size% = size% + 1
|
||
IF pointx% < 0 THEN pointx% = 1: size% = size% + 1
|
||
pointy% = pointy% + INT(RND * 3) - 1
|
||
IF pointy% > 15 THEN pointy% = 14: size% = size% + 1
|
||
IF pointy% < 0 THEN pointy% = 1: size% = size% + 1
|
||
topo%(pointx%, pointy%) = 1
|
||
size% = size% - 1
|
||
LOOP
|
||
'pointx% = INT(RND * 16)
|
||
'pointy% = INT(RND * 16)
|
||
'topo%(pointx%, pointy%) = 2
|
||
'dir% = INT(RND * 8)
|
||
'DO UNTIL pointx% <= 0 OR pointx% >= 15 OR pointy% <= 0 OR pointy% >= 15
|
||
' IF pointx% >= 0 AND pointx% <= 15 AND pointy% >= 0 AND pointy% <= 15 THEN
|
||
' IF COS(pi / 4 * dir%) > -.1 THEN pointx% = pointx% + INT(1.5 * COS(pi / 4 * dir%))
|
||
' IF SIN(pi / 4 * dir%) > -.1 THEN pointy% = pointy% + INT(1.5 * SIN(pi / 4 * dir%))
|
||
' IF COS(pi / 4 * dir%) < -.1 THEN pointx% = pointx% + INT(.5 * COS(pi / 4 * dir%))
|
||
' IF SIN(pi / 4 * dir%) < -.1 THEN pointy% = pointy% + INT(.5 * SIN(pi / 4 * dir%))
|
||
' dir% = dir% + INT(RND * 3) - 1
|
||
' IF dir% < 0 THEN dir% = 7
|
||
' IF dir% > 7 THEN dir% = 0
|
||
' topo%(pointx%, pointy%) = 2
|
||
' END IF
|
||
'LOOP
|
||
genground topo%()
|
||
allground& = _NEWIMAGE(4096 + swidth, 4096 + sheight, 32)
|
||
_DEST allground&: CLS: _DEST 0
|
||
FOR y = 0 TO 15
|
||
FOR x = 0 TO 15
|
||
_PUTIMAGE (x * 256 + (swidth / 2 - 100), y * 256 + sheight / 2), ground&(topo%(x, y)), allground&
|
||
NEXT
|
||
NEXT
|
||
_FREEIMAGE ground&(0)
|
||
_FREEIMAGE ground&(1)
|
||
FOR freeground% = 3 TO 43
|
||
IF ground&(freeground%) THEN _FREEIMAGE ground&(freeground%)
|
||
NEXT
|
||
player& = _LOADIMAGE("player.png")
|
||
plane& = _LOADIMAGE("plane.png")
|
||
missileimage& = _LOADIMAGE("missile.png")
|
||
weapon& = _LOADIMAGE("electricweapons.png")
|
||
aug& = _LOADIMAGE("electricmods.png")
|
||
stat& = _LOADIMAGE("electricstats.png")
|
||
premetal& = _LOADIMAGE("brushedmetal.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
explosioneffect& = _COPYIMAGE(blob(128, 128, _RGB(255, 0, 0), _RGB(255, 255, 0)))
|
||
contraileffect& = _COPYIMAGE(blob(16, 16, _RGB(127, 127, 127), _RGB(127, 127, 127)))
|
||
plasshot& = _COPYIMAGE(blob(8, 8, _RGB(0, 255, 0), _RGB(127, 255, 0)))
|
||
spreadshot& = _COPYIMAGE(blob(8, 8, _RGB(0, 0, 255), _RGB(0, 127, 255)))
|
||
pulseshot& = _COPYIMAGE(blob(8, 8, _RGB(127, 0, 255), _RGB(255, 0, 255)))
|
||
flareimage& = _COPYIMAGE(blob(8, 8, _RGB(255, 0, 0), _RGB(255, 255, 255)))
|
||
_DEST 0
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
_CLEARCOLOR _RGB(0, 0, 0), player&
|
||
_CLEARCOLOR _RGB(0, 0, 0), plane&
|
||
_CLEARCOLOR _RGB(0, 0, 0), missileimage&
|
||
_CLEARCOLOR _RGB(0, 0, 0), weapon&
|
||
_CLEARCOLOR _RGB(0, 0, 0), aug&
|
||
_CLEARCOLOR _RGB(0, 0, 0), stat&
|
||
DIM wepimage&(11)
|
||
DIM modimage&(4)
|
||
DIM statimage&(4)
|
||
DIM tooltips&(4)
|
||
_SOURCE weapon&
|
||
FOR wep% = 1 TO 8
|
||
wepimage&(wep%) = _NEWIMAGE(32, 32, 32)
|
||
_DEST wepimage&(wep%)
|
||
FOR y% = 0 TO 31
|
||
FOR x% = 0 TO 31
|
||
PSET (x%, y%), POINT(x% + (wep% - 1) * 32, y%)
|
||
NEXT
|
||
NEXT
|
||
NEXT
|
||
blankmissile& = _NEWIMAGE(32, 32, 32)
|
||
_DEST blankmissile&
|
||
FOR y% = 0 TO 31
|
||
FOR x% = 0 TO 31
|
||
PSET (x%, y%), POINT(x%, y% + 32)
|
||
NEXT
|
||
NEXT
|
||
FOR wep% = 1 TO 4
|
||
modimage&(wep%) = _NEWIMAGE(32, 32, 32)
|
||
statimage&(wep%) = _NEWIMAGE(32, 32, 32)
|
||
_SOURCE aug&
|
||
_DEST modimage&(wep%)
|
||
FOR y% = 0 TO 31
|
||
FOR x% = 0 TO 31
|
||
PSET (x%, y%), POINT(x% + (wep% - 1) * 32, y%)
|
||
NEXT
|
||
NEXT
|
||
_SOURCE stat&
|
||
_DEST statimage&(wep%)
|
||
FOR y% = 0 TO 31
|
||
FOR x% = 0 TO 31
|
||
PSET (x%, y%), POINT(x% + (wep% - 1) * 32, y%)
|
||
NEXT
|
||
NEXT
|
||
NEXT
|
||
_SOURCE 0
|
||
_DEST 0
|
||
wepimage&(9) = recolor&(blankmissile&, _RGB(255, 255, 255), _RGB(0, 0, 255))
|
||
wepimage&(10) = recolor&(blankmissile&, _RGB(255, 255, 255), _RGB(0, 127, 0))
|
||
wepimage&(11) = _NEWIMAGE(32, 32, 32)
|
||
_PUTIMAGE (0, 0), weapon&, wepimage&(11), (32, 32)-(63, 63)
|
||
_FREEIMAGE blankmissile&
|
||
_FREEIMAGE weapon&
|
||
_FREEIMAGE aug&
|
||
_FREEIMAGE stat&
|
||
wepimage&(0) = _NEWIMAGE(32, 32, 32)
|
||
modimage&(0) = _NEWIMAGE(32, 32, 32)
|
||
_CLEARCOLOR _RGB(0, 0, 0), wepimage&(0)
|
||
_CLEARCOLOR _RGB(0, 0, 0), modimage&(0)
|
||
tooltips&(1) = _LOADIMAGE("aimer_tooltip.png")
|
||
tooltips&(2) = _LOADIMAGE("energy_armor_tooltip.png")
|
||
tooltips&(3) = _LOADIMAGE("srb_tooltip.png")
|
||
tooltips&(4) = _LOADIMAGE("flare_tooltip.png")
|
||
OPEN "electricsettings.cfg" FOR RANDOM AS #1 LEN = LEN(swidth)
|
||
GET #1, 5, red
|
||
GET #1, 6, green
|
||
GET #1, 7, blue
|
||
GET #1, 8, difficulty
|
||
IF gamepad <> 0 THEN
|
||
DIM steering AS control, throttle AS control, primary AS control, secondary AS control, scrdown AS control, scrup AS control, pick AS control
|
||
GET #1, 10, steering.number
|
||
GET #1, 11, throttle.number
|
||
GET #1, 12, primary.number
|
||
GET #1, 13, secondary.number
|
||
GET #1, 16, scrdown.number
|
||
GET #1, 17, scrup.number
|
||
GET #1, 18, pick.number
|
||
GET #1, 20, steering.axis
|
||
GET #1, 21, throttle.axis
|
||
GET #1, 22, primary.axis
|
||
GET #1, 23, secondary.axis
|
||
GET #1, 24, scrdown.axis
|
||
GET #1, 25, scrup.axis
|
||
GET #1, 26, pick.axis
|
||
picked% = 1
|
||
numdevice% = _DEVICES
|
||
buttons% = _LASTBUTTON(gamepad)
|
||
DO WHILE _DEVICEINPUT(gamepad)
|
||
LOOP
|
||
END IF
|
||
GET #1, 14, livery
|
||
GET #1, 15, team
|
||
GET #1, 19, vol
|
||
CLOSE #1
|
||
_DEST allground& 'we need the player's color to do this
|
||
LINE (0, sheight / 2)-(swidth / 2 - 100, 4095 + sheight / 2), _RGB(red, green, blue), BF
|
||
LINE (4096 + swidth / 2 - 100, sheight / 2)-(4096 + swidth - 200, 4095 + sheight / 2), _RGB(255, 0, 0), BF
|
||
LINE (swidth / 2 - 100, 0)-(4095 + swidth / 2 - 100, sheight / 2), _RGB(0, 255, 0), BF
|
||
LINE (swidth / 2 - 100, 4096 + sheight / 2)-(4095 + swidth / 2 - 100, 4096 + sheight), _RGB(255, 255, 0), BF
|
||
_DEST 0
|
||
IF team < 1 THEN team = 1
|
||
IF team > 4 THEN team = 4
|
||
planeshadow& = shadow&(plane&)
|
||
quartz& = _LOADFONT("segment14.otf", 16)
|
||
bigquartz& = _LOADFONT("segment14.otf", 32)
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", 24, "")
|
||
numplanes% = team * 4 - 1
|
||
DIM points(3) AS score
|
||
DIM planes(15) AS airplane
|
||
DIM mods(15, 4) AS aug
|
||
DIM weapons(15, 5) AS weapon
|
||
DIM lazers(5000) AS shot
|
||
DIM missiles(50) AS missile
|
||
DIM contrails%(5000, 2)
|
||
DIM explosions%(200, 4)
|
||
DIM trails%(1000, 3)
|
||
DIM flares(130, 4)
|
||
DIM wepstorage(15, 15) AS weapon
|
||
DIM modstorage(15, 15) AS aug
|
||
DIM controller(30)
|
||
DIM debriss(260) AS debris
|
||
FOR teammates = 0 TO team - 1
|
||
planes(0 + 4 * teammates).blip = recolor&(player&, _RGB(255, 255, 255), _RGB(red, green, blue))
|
||
planes(1 + 4 * teammates).blip = recolor&(player&, _RGB(255, 255, 255), _RGB(255, 0, 0))
|
||
planes(2 + 4 * teammates).blip = recolor&(player&, _RGB(255, 255, 255), _RGB(0, 255, 0))
|
||
planes(3 + 4 * teammates).blip = recolor&(player&, _RGB(255, 255, 255), _RGB(255, 255, 0))
|
||
IF livery = 0 THEN
|
||
planes(0 + 4 * teammates).image = recolor&(plane&, _RGB(255, 255, 255), _RGB(red, green, blue))
|
||
planes(1 + 4 * teammates).image = recolor&(plane&, _RGB(255, 255, 255), _RGB(255, 0, 0))
|
||
planes(2 + 4 * teammates).image = recolor&(plane&, _RGB(255, 255, 255), _RGB(0, 255, 0))
|
||
planes(3 + 4 * teammates).image = recolor&(plane&, _RGB(255, 255, 255), _RGB(255, 255, 0))
|
||
ELSE
|
||
planes(0 + 4 * teammates).image = colorgreyspectrum&(plane&, _RGB(red, green, blue))
|
||
planes(1 + 4 * teammates).image = colorgreyspectrum&(plane&, _RGB(255, 0, 0))
|
||
planes(2 + 4 * teammates).image = colorgreyspectrum&(plane&, _RGB(0, 255, 0))
|
||
planes(3 + 4 * teammates).image = colorgreyspectrum&(plane&, _RGB(255, 255, 0))
|
||
END IF
|
||
planes(0 + 4 * teammates).team = 0
|
||
planes(0 + 4 * teammates).x = 300
|
||
planes(0 + 4 * teammates).y = 300
|
||
planes(0 + 4 * teammates).lasthit = 2
|
||
planes(0 + 4 * teammates).ai = 1
|
||
planes(1 + 4 * teammates).team = 1
|
||
planes(1 + 4 * teammates).x = 3796
|
||
planes(1 + 4 * teammates).y = 3796
|
||
planes(1 + 4 * teammates).dir = pi
|
||
planes(1 + 4 * teammates).lasthit = 3
|
||
planes(1 + 4 * teammates).ai = 1
|
||
planes(2 + 4 * teammates).team = 2
|
||
planes(2 + 4 * teammates).x = 3796
|
||
planes(2 + 4 * teammates).y = 300
|
||
planes(2 + 4 * teammates).dir = pi / 2
|
||
planes(2 + 4 * teammates).lasthit = 1
|
||
planes(2 + 4 * teammates).ai = 1
|
||
planes(3 + 4 * teammates).team = 3
|
||
planes(3 + 4 * teammates).x = 300
|
||
planes(3 + 4 * teammates).y = 3796
|
||
planes(3 + 4 * teammates).dir = 3 / 2 * pi
|
||
planes(3 + 4 * teammates).lasthit = 0
|
||
planes(3 + 4 * teammates).ai = 1
|
||
NEXT
|
||
planes(0).ai = 0
|
||
'un-comment the next line for practically unlimited credits
|
||
'planes(0).credits = 9999
|
||
'uncomment the next four lines for practically unlimited radar-guided missiles
|
||
'weapons(0, 5).wep = 10
|
||
'weapons(0, 5).ifon = -1
|
||
'weapons(0, 5).total = 60
|
||
'weapons(0, 5).ammo = 9999
|
||
fcont% = 1
|
||
numlazer% = 0
|
||
DIM wepmouse AS weapon
|
||
DIM modmouse AS aug
|
||
DIM blankspace AS weapon
|
||
FOR k% = 0 TO numplanes%
|
||
planes(k%).force = 3
|
||
planes(k%).speed = 3
|
||
planes(k%).battery = 100
|
||
planes(k%).generator = 1
|
||
planes(k%).armor = 10
|
||
planes(k%).ammo = 1000
|
||
planes(k%).maxbatt = 100
|
||
planes(k%).maxarm = 10
|
||
weapons(k%, 2).wep = 1
|
||
weapons(k%, 2).ifon = -1
|
||
weapons(k%, 2).total = 12
|
||
weapons(k%, 2).energy = .25
|
||
NEXT
|
||
music& = _SNDOPEN("electric_game.ogg", "sync,vol")
|
||
IF music& <> 0 THEN
|
||
_SNDVOL music&, vol * .8
|
||
_SNDLOOP music&
|
||
END IF
|
||
DO
|
||
_LIMIT 61
|
||
DO
|
||
lclick% = _MOUSEBUTTON(1)
|
||
LOOP WHILE _MOUSEINPUT
|
||
'CLS
|
||
IF planes(0).market = 0 THEN scrollground allground&
|
||
IF xoffset% > 0 THEN
|
||
LINE (0, yoffset%)-(xoffset% - 1, 4095 + yoffset%), _RGB(red, green, blue), BF
|
||
COLOR _RGB(255 - red, 255 - green, 255 - blue)
|
||
_PRINTSTRING (-152 + xoffset%, sheight / 2 - 16), "Market"
|
||
IF planes(0).waittime > 0 THEN _PRINTSTRING (-152 + xoffset%, sheight / 2), "Closed" ELSE _PRINTSTRING (-148 + xoffset%, sheight / 2), "Open!"
|
||
COLOR _RGB(255, 255, 255)
|
||
END IF
|
||
IF gamepad <> 0 THEN
|
||
IF gamepad <= numdevice% THEN
|
||
DO WHILE _DEVICEINPUT(gamepad)
|
||
FOR a% = 1 TO buttons%
|
||
controller(a%) = _BUTTON(a%)
|
||
NEXT
|
||
FOR b% = 1 TO _LASTAXIS
|
||
controller(b% + buttons%) = _AXIS(b%)
|
||
NEXT
|
||
LOOP
|
||
IF controller(buttons% * scrdown.axis + scrdown.number) AND ignoretog% = 0 THEN picked% = picked% - 1: ignoretog% = -1
|
||
IF controller(buttons% * scrup.axis + scrup.number) AND ignoretog% = 0 THEN picked% = picked% + 1: ignoretog% = -1
|
||
IF picked% <= 0 THEN picked% = 9
|
||
IF picked% >= 10 THEN picked% = 1
|
||
END IF
|
||
END IF
|
||
IF planes(0).armor > 0 THEN
|
||
IF gamepad = 0 THEN
|
||
playercontrol planes(0).dir, planes(0).force, planes(0).yaw, 0, 0
|
||
IF planes(0).market = 0 THEN playerfire planes(), 0, weapons(), 0, 0
|
||
ELSE
|
||
playercontrol planes(0).dir, planes(0).force, planes(0).yaw, controller(buttons% * steering.axis + steering.number), controller(buttons% * throttle.axis + throttle.number)
|
||
IF planes(0).market = 0 THEN playerfire planes(), 0, weapons(), ABS(controller(buttons% * primary.axis + primary.number)) + .5, ABS(controller(buttons% * secondary.axis + secondary.number)) + .5
|
||
END IF
|
||
END IF
|
||
IF planes(0).x <= 0 AND planes(0).waittime <= 0 THEN planes(0).x = -128: planes(0).force = 0: planes(0).speed = 0: planes(0).market = 1
|
||
IF planes(0).speed < 2.5 AND planes(0).force < 2 AND planes(0).armor > 0 THEN COLOR _RGB(255, 0, 0): _PRINTSTRING ((swidth - _PRINTWIDTH("STALL WARNING!")) / 2, sheight / 2 + 32), "STALL WARNING!": COLOR _RGB(255, 255, 255)
|
||
screenanchorx% = INT(planes(0).x)
|
||
screenanchory% = INT(planes(0).y)
|
||
xoffset% = -screenanchorx% + swidth / 2 - 100
|
||
yoffset% = -screenanchory% + sheight / 2
|
||
FOR k% = 0 TO numplanes%
|
||
FOR wepn% = 1 TO 3
|
||
IF weapons(k%, wepn%).kind = 0 THEN
|
||
IF weapons(k%, wepn%).remaining < weapons(k%, wepn%).total THEN weapons(k%, wepn%).remaining = weapons(k%, wepn%).remaining + 1
|
||
IF weapons(k%, wepn%).firing = 1 THEN
|
||
weapons(k%, wepn%).firing = 0
|
||
makeshot lazers(), numlazer%, planes(k%), k%, weapons(k%, wepn%).wep, wepn%, planes(0).market
|
||
planes(k%).battery = planes(k%).battery - weapons(k%, wepn%).energy
|
||
planes(k%).ammo = planes(k%).ammo - weapons(k%, wepn%).ammo
|
||
IF wepn% = 2 OR wepn% = 3 THEN
|
||
planes(k%).battery = planes(k%).battery - weapons(k%, wepn%).energy
|
||
planes(k%).ammo = planes(k%).ammo - weapons(k%, wepn%).ammo
|
||
END IF
|
||
END IF
|
||
END IF
|
||
IF weapons(k%, wepn%).kind = 1 THEN
|
||
IF weapons(k%, wepn%).firing >= 1 AND NOT _KEYDOWN(32) AND NOT lclick AND NOT controller(1) THEN
|
||
makecharge lazers(), numlazer%, k%, planes(), weapons(k%, wepn%).wep, weapons(k%, wepn%).firing, wepn%, numplanes%
|
||
planes(k%).battery = planes(k%).battery - weapons(k%, wepn%).firing / 6
|
||
IF wepn% = 2 OR wepn% = 3 THEN planes(k%).battery = planes(k%).battery - weapons(k%, wepn%).firing / 6
|
||
weapons(k%, wepn%).firing = 0
|
||
END IF
|
||
END IF
|
||
NEXT
|
||
FOR wepn% = 4 TO 5
|
||
IF weapons(k%, wepn%).remaining < weapons(k%, wepn%).total THEN weapons(k%, wepn%).remaining = weapons(k%, wepn%).remaining + 1
|
||
IF weapons(k%, wepn%).firing = 1 THEN
|
||
weapons(k%, wepn%).firing = 0
|
||
makemissile missiles(), nummissile%, k%, planes(), weapons(k%, wepn%).wep, numplanes%
|
||
weapons(k%, wepn%).ammo = weapons(k%, wepn%).ammo - 1
|
||
END IF
|
||
IF weapons(k%, wepn%).ammo <= 0 THEN weapons(k%, wepn%) = blankspace
|
||
NEXT
|
||
IF planes(k%).battery >= 1 THEN
|
||
FOR augm% = 1 TO 4
|
||
IF mods(k%, augm%).ifon = -1 THEN
|
||
IF mods(k%, augm%).kind = 1 THEN aimer planes(), k%, numplanes%
|
||
IF mods(k%, augm%).kind = 2 THEN converter planes(k%), mods(k%, augm%).ifon
|
||
IF mods(k%, augm%).kind = 3 THEN srb planes(k%), contrails%(), numcontrail%, mods(k%, augm%)
|
||
IF mods(k%, augm%).kind = 4 THEN flare k%, planes(k%), missiles(), nummissile%, mods(k%, augm%), flares(), numflare%
|
||
planes(k%).battery = planes(k%).battery - mods(k%, augm%).energy / 60
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
IF planes(k%).armor <= 0 THEN respawn planes(k%)
|
||
IF planes(k%).ai = 1 AND planes(k%).armor > 0 THEN
|
||
aiplane k%, planes(), weapons(), difficulty
|
||
SELECT CASE planes(k%).team
|
||
CASE 0: IF planes(k%).x <= 0 THEN aimarket planes(k%), k%, weapons(), wepstorage()
|
||
CASE 1: IF planes(k%).x >= 4095 THEN aimarket planes(k%), k%, weapons(), wepstorage()
|
||
CASE 2: IF planes(k%).y <= 0 THEN aimarket planes(k%), k%, weapons(), wepstorage()
|
||
CASE 3: IF planes(k%).y >= 4095 THEN aimarket planes(k%), k%, weapons(), wepstorage()
|
||
END SELECT
|
||
END IF
|
||
planes(k%).dir = planes(k%).dir + rad(1.5 * planes(k%).yaw)
|
||
togglecontrol k%, weapons(), mods(), ignoretog%, picked%, controller(pick.number)
|
||
IF planes(k%).speed < 2 AND planes(k%).market = 0 THEN
|
||
planes(k%).armor = 0
|
||
crash planes(), explosions%(), points(), numexplosion%, numplanes%, difficulty, mods(), debriss(), numdebris%
|
||
END IF
|
||
planes(k%).x = planes(k%).x + COS(planes(k%).dir) * planes(k%).speed
|
||
planes(k%).y = planes(k%).y + SIN(planes(k%).dir) * planes(k%).speed
|
||
IF planes(k%).market = 0 AND planes(k%).x < 0 THEN planes(k%).x = 0
|
||
IF planes(k%).x > 4095 THEN planes(k%).x = 4095
|
||
IF planes(k%).y < 0 THEN planes(k%).y = 0
|
||
IF planes(k%).y > 4095 THEN planes(k%).y = 4095
|
||
planes(k%).battery = planes(k%).battery + planes(k%).generator / 30 - planes(k%).force * 1 / 150
|
||
IF planes(k%).battery < 0 THEN planes(k%).battery = 0: IF planes(k%).force > planes(k%).generator * 5 THEN planes(k%).force = planes(k%).generator * 5
|
||
fakephysics planes(k%).force, planes(k%).speed
|
||
IF planes(k%).battery > planes(k%).maxbatt THEN planes(k%).battery = planes(k%).maxbatt
|
||
IF planes(0).market = 0 THEN
|
||
IF planes(k%).x + xoffset% > 0 AND planes(k%).x + xoffset% < swidth - 200 AND planes(k%).y + yoffset% > 0 AND planes(k%).y + yoffset% < sheight AND planes(k%).armor > 0 THEN
|
||
IF planes(k%).yaw <= -.7 THEN
|
||
IF graphsetting = 1 THEN
|
||
rotator planes(k%).x + 16 + xoffset%, planes(k%).y + 16 + yoffset%, planes(k%).dir, planeshadow&, 0, 0, 31, 31, 32
|
||
maketrail planes(k%).x + COS(planes(k%).dir - pi / 2) * 8, planes(k%).y + SIN(planes(k%).dir - pi / 2) * 8, trails%(), numtrail%, k%
|
||
maketrail planes(k%).x + COS(planes(k%).dir + pi / 2) * 8, planes(k%).y + SIN(planes(k%).dir + pi / 2) * 8, trails%(), numtrail%, k% + numplanes% + 1
|
||
END IF
|
||
rotator planes(k%).x + xoffset%, planes(k%).y + yoffset%, planes(k%).dir, planes(k%).image, 0, 0, 31, 31, 32
|
||
END IF
|
||
IF planes(k%).yaw > -.7 AND planes(k%).yaw < -.3 THEN
|
||
IF graphsetting = 1 THEN rotator planes(k%).x + 16 + xoffset%, planes(k%).y + 16 + yoffset%, planes(k%).dir, planeshadow&, 32, 0, 63, 31, 32
|
||
rotator planes(k%).x + xoffset%, planes(k%).y + yoffset%, planes(k%).dir, planes(k%).image, 32, 0, 63, 31, 32
|
||
END IF
|
||
IF planes(k%).yaw >= -.3 AND planes(k%).yaw <= .3 THEN
|
||
IF graphsetting = 1 THEN rotator planes(k%).x + 16 + xoffset%, planes(k%).y + 16 + yoffset%, planes(k%).dir, planeshadow&, 64, 0, 95, 31, 32
|
||
rotator planes(k%).x + xoffset%, planes(k%).y + yoffset%, planes(k%).dir, planes(k%).image, 64, 0, 95, 31, 32
|
||
END IF
|
||
IF planes(k%).yaw > .3 AND planes(k%).yaw < .7 THEN
|
||
IF graphsetting = 1 THEN rotator planes(k%).x + 16 + xoffset%, planes(k%).y + 16 + yoffset%, planes(k%).dir, planeshadow&, 96, 0, 127, 31, 32
|
||
rotator planes(k%).x + xoffset%, planes(k%).y + yoffset%, planes(k%).dir, planes(k%).image, 96, 0, 127, 31, 32
|
||
END IF
|
||
IF planes(k%).yaw >= .7 THEN
|
||
IF graphsetting = 1 THEN
|
||
rotator planes(k%).x + 16 + xoffset%, planes(k%).y + 16 + yoffset%, planes(k%).dir, planeshadow&, 128, 0, 159, 31, 32
|
||
maketrail planes(k%).x + COS(planes(k%).dir - pi / 2) * 8, planes(k%).y + SIN(planes(k%).dir - pi / 2) * 8, trails%(), numtrail%, k%
|
||
maketrail planes(k%).x + COS(planes(k%).dir + pi / 2) * 8, planes(k%).y + SIN(planes(k%).dir + pi / 2) * 8, trails%(), numtrail%, k% + numplanes% + 1
|
||
END IF
|
||
rotator planes(k%).x + xoffset%, planes(k%).y + yoffset%, planes(k%).dir, planes(k%).image, 128, 0, 159, 31, 32
|
||
END IF
|
||
'_PRINTSTRING (planes(k%).x + xoffset%, planes(k%).y + yoffset%), whatever you need
|
||
END IF
|
||
IF planes(k%).waittime > 0 THEN planes(k%).waittime = planes(k%).waittime - 1
|
||
END IF
|
||
NEXT
|
||
debriseffect debriss(), numdebris%, explosions%(), numexplosion%
|
||
lazer lazers(), planes(), points(), numlazer%, explosions%(), numexplosion%, numplanes%, difficulty, plasshot&, spreadshot&, pulseshot&, mods(), debriss(), numdebris%
|
||
charge lazers(), planes(), numlazer%
|
||
missile missiles(), planes(), points(), nummissile%, contrails%(), numcontrail%, missileimage&, explosions%(), numexplosion%, numplanes%, difficulty, mods(), debriss(), numdebris%
|
||
contrail contrails%(), numcontrail%, contraileffect&
|
||
flareeffect flares(), numflare%, contrails%(), numcontrail%, flareimage&
|
||
explosion explosions%(), numexplosion%, explosioneffect&
|
||
IF graphsetting = 1 THEN trail trails%(), numtrail%, numplanes%
|
||
IF planes(0).market = 0 THEN
|
||
_PUTIMAGE (swidth - 200, 0)-(swidth - 1, sheight - 1), brushedmetal&, 0, (swidth - 200, 0)-(swidth - 1, sheight - 1)
|
||
hudbar 0, "PWR", planes(0).force / 10 * 100, 100, _RGB(127, 0, 0), "%", quartz&
|
||
hudbar 1, "GEN", planes(0).generator / 2 * 100, 100, _RGB(0, 127, 0), "%", quartz&
|
||
hudbar 2, "BAT", planes(0).battery / planes(0).maxbatt * 100, 100, _RGB(127, 127, 0), "%", quartz&
|
||
hudbar 3, "SPD", planes(0).speed / 10 * 645.6, 645.6, _RGB(0, 127, 127), "mph", quartz&
|
||
hudbar 4, "ARM", planes(0).armor / planes(0).maxarm * 100, 100, _RGB(0, 0, 127), "%", quartz&
|
||
hudbar 5, "AMO", planes(0).ammo / 100, 100, _RGB(31, 31, 31), "%", quartz&
|
||
_FONT quartz&
|
||
_PRINTSTRING (swidth - 200, 208), "PTS " + LTRIM$(STR$(points(0).points))
|
||
_PRINTSTRING (swidth - 200, 240), "CR. " + LTRIM$(STR$(planes(0).credits))
|
||
_FONT 16
|
||
weaponhud swidth - 180, sheight / 2, weapons(), 0, wepimage&(), picked%
|
||
modhud swidth - 164, sheight / 2 + 80, mods(), 0, modimage&(), picked%
|
||
LINE (swidth - 180, sheight - 180)-(swidth - 21, sheight - 21), _RGB(0, 63, 0), BF
|
||
FOR blip% = 0 TO numplanes%
|
||
rotator swidth - 180 + planes(blip%).x \ 25.6, sheight - 180 + planes(blip%).y \ 25.6, planes(blip%).dir, planes(blip%).blip, 0, 0, 16, 16, 8
|
||
NEXT
|
||
LINE (swidth - 180 - ((swidth - 200) \ 51.2) + planes(0).x \ 25.6, sheight - 180 - (sheight \ 51.2) + planes(0).y \ 25.6)-(swidth - 180 + ((swidth - 200) \ 51.2) + planes(0).x \ 25.6, sheight - 180 + (sheight \ 51.2) + planes(0).y \ 25.6), _RGB(255, 255, 255), B
|
||
END IF
|
||
IF planes(0).market = 1 THEN market planes(0), 0, weapons(), mods(), wepimage&(), modimage&(), statimage&(), wepstorage(), modstorage(), wepmouse, modmouse, whichstore%, bigquartz&, quartz&, cyberbit&, brushedmetal&, tooltips&(), difficulty
|
||
IF _KEYDOWN(112) THEN
|
||
leaderboard planes(), points(), numplanes%
|
||
_DISPLAY
|
||
SLEEP
|
||
END IF
|
||
IF _KEYDOWN(9) THEN leaderboard planes(), points(), numplanes%
|
||
_DISPLAY
|
||
IF ignoretog% <> 0 AND _KEYDOWN(49) = 0 AND _KEYDOWN(50) = 0 AND _KEYDOWN(51) = 0 AND _KEYDOWN(52) = 0 AND _KEYDOWN(53) = 0 AND _KEYDOWN(54) = 0 AND _KEYDOWN(55) = 0 AND _KEYDOWN(56) = 0 AND _KEYDOWN(57) = 0 THEN
|
||
IF gamepad = 0 THEN
|
||
ignoretog% = 0
|
||
ELSE
|
||
IF controller(scrdown.number) = 0 AND controller(scrup.number) = 0 AND controller(pick.number) = 0 THEN ignoretog% = 0
|
||
END IF
|
||
END IF
|
||
IF _KEYDOWN(27) AND ignore` = 0 THEN EXIT DO
|
||
clickonce
|
||
LOOP
|
||
_FONT cyberbit&
|
||
CLS
|
||
_PUTIMAGE , brushedmetal&
|
||
leaderboard planes(), points(), numplanes%
|
||
_PRINTSTRING (swidth / 2 - 256, 320), "Press any key to go back to the Main Menu."
|
||
_DISPLAY
|
||
IF music& THEN
|
||
DO UNTIL vol = 0
|
||
_LIMIT 30
|
||
vol = vol - .02
|
||
IF vol < 0 THEN vol = 0
|
||
_SNDVOL music&, vol
|
||
LOOP
|
||
_SNDSTOP music&
|
||
_SNDCLOSE music&
|
||
END IF
|
||
SLEEP
|
||
_FREEIMAGE player&
|
||
_FREEIMAGE plane&
|
||
_FREEIMAGE planeshadow&
|
||
_FREEIMAGE missileimage&
|
||
_FREEIMAGE brushedmetal&
|
||
_FREEIMAGE explosioneffect&
|
||
_FREEIMAGE contraileffect&
|
||
_FREEIMAGE allground&
|
||
_FREEIMAGE plasshot&
|
||
_FREEIMAGE spreadshot&
|
||
_FREEIMAGE pulseshot&
|
||
FOR freee% = 0 TO 3
|
||
FOR teammates% = 0 TO team - 1
|
||
_FREEIMAGE planes(freee% + 4 * teammates%).image
|
||
_FREEIMAGE planes(freee% + 4 * teammates%).blip
|
||
NEXT
|
||
NEXT
|
||
FOR free8% = 0 TO 11
|
||
_FREEIMAGE wepimage&(free8%)
|
||
NEXT
|
||
FOR free4% = 1 TO 4
|
||
_FREEIMAGE modimage&(free4%)
|
||
_FREEIMAGE statimage&(free4%)
|
||
NEXT
|
||
_FONT 16
|
||
IF quartz& <> 0 THEN _FREEFONT (quartz&)
|
||
IF bigquartz& <> 0 THEN _FREEFONT (bigquartz&)
|
||
IF cyberbit& <> 0 THEN _FREEFONT (cyberbit&)
|
||
END SUB
|
||
|
||
SUB crash (planes() AS airplane, explosions%(), points() AS score, numexplosions%, numplanes%, difficulty, mods() AS aug, debriss() AS debris, numdebris%) 'Resets planes after they crash, and makes the crash sound
|
||
boom& = _SNDOPEN("factory_destroyed.wav", "sync")
|
||
FOR a% = 0 TO numplanes%
|
||
IF planes(a%).armor <= 0 AND planes(a%).respawntime <= 0 THEN
|
||
IF boom& THEN _SNDPLAY boom&
|
||
makeexplosion planes(a%).x, planes(a%).y, explosions%(), numexplosion%, 60, 0
|
||
makedebris planes(a%), debriss(), numdebris%
|
||
planes(a%).respawntime = 60
|
||
planes(a%).force = 0
|
||
planes(a%).speed = 0
|
||
FOR m = 1 TO 4
|
||
mods(a%, m).ifon = 0
|
||
NEXT
|
||
team% = planes(planes(a%).lasthit).team
|
||
points(team%).points = points(team%).points + 1
|
||
points(team%).total = points(team%).points - points(team%).losses
|
||
points(planes(a%).team).losses = points(planes(a%).team).losses + 1
|
||
points(planes(a%).team).total = points(planes(a%).team).points - points(planes(a%).team).losses
|
||
planes(planes(a%).lasthit).credits = planes(planes(a%).lasthit).credits + 1
|
||
IF planes(planes(a%).lasthit).ai = 1 AND difficulty = 1 THEN
|
||
marketchance% = INT(RND * 12) 'originally, 12 was (13 - planes(planes(a%).lasthit).credits)
|
||
IF marketchance% = 0 THEN planes(planes(a%).lasthit).market = 1
|
||
END IF
|
||
END IF
|
||
NEXT
|
||
_SNDCLOSE boom&
|
||
END SUB
|
||
|
||
SUB respawn (plane AS airplane)
|
||
IF plane.respawntime > 0 THEN plane.respawntime = plane.respawntime - 1
|
||
IF plane.respawntime <= 0 THEN
|
||
plane.x = INT(RND * 4090) + 3
|
||
plane.y = INT(RND * 4090) + 3
|
||
plane.dir = RND * 2 * pi
|
||
plane.force = 3
|
||
plane.speed = 3
|
||
plane.battery = plane.maxbatt
|
||
plane.armor = plane.maxarm
|
||
END IF
|
||
END SUB
|
||
|
||
SUB leaderboard (planes() AS airplane, points() AS score, numplanes%)
|
||
DIM order(3) AS INTEGER
|
||
FOR find = 0 TO 3
|
||
IF points% > points(find).total THEN points% = points(find).total
|
||
NEXT
|
||
DO
|
||
FOR rank% = 0 TO 3
|
||
IF points(rank%).total = points% THEN order(3 - checked%) = rank%: checked% = checked% + 1
|
||
NEXT
|
||
points% = points% + 1
|
||
LOOP UNTIL checked% = 4
|
||
FOR thelasttime% = 0 TO 3
|
||
_PUTIMAGE (swidth / 2 - 224, 64 + 64 * thelasttime%), planes(order(thelasttime%)).image, , (64, 0)-(95, 31)
|
||
_PRINTSTRING (swidth / 2 - 256, 64 + 64 * thelasttime%), LTRIM$(STR$(thelasttime% + 1)) + "."
|
||
_PRINTSTRING (swidth / 2 - 176, 64 + 64 * thelasttime%), LTRIM$(STR$(points(planes(order(thelasttime%)).team).points)) + " Points | " + LTRIM$(STR$(points(planes(order(thelasttime%)).team).losses)) + " Losses | " + LTRIM$(STR$(points(planes(order(thelasttime%)).team).total)) + " Total"
|
||
IF order(thelasttime%) = 0 THEN _PRINTSTRING (swidth / 2 - 328, 64 + 64 * thelasttime%), "Player"
|
||
NEXT
|
||
END SUB
|
||
|
||
SUB options 'The options menu
|
||
DIM steering AS control, throttle AS control, primary AS control, secondary AS control, scrdown AS control, scrup AS control, pick AS control
|
||
OPEN "electricsettings.cfg" FOR RANDOM AS #1 LEN = LEN(swidth)
|
||
GET #1, 1, swidth
|
||
GET #1, 2, sheight
|
||
GET #1, 3, fs
|
||
GET #1, 4, graphsetting
|
||
GET #1, 5, red
|
||
GET #1, 6, green
|
||
GET #1, 7, blue
|
||
GET #1, 8, difficulty
|
||
GET #1, 9, gamepad
|
||
GET #1, 10, steering.number
|
||
GET #1, 11, throttle.number
|
||
GET #1, 12, primary.number
|
||
GET #1, 13, secondary.number
|
||
GET #1, 14, livery
|
||
GET #1, 15, team
|
||
GET #1, 16, scrdown.number
|
||
GET #1, 17, scrup.number
|
||
GET #1, 18, pick.number
|
||
GET #1, 19, vol
|
||
GET #1, 20, steering.axis
|
||
GET #1, 21, throttle.axis
|
||
GET #1, 22, primary.axis
|
||
GET #1, 23, secondary.axis
|
||
GET #1, 24, scrdown.axis
|
||
GET #1, 25, scrup.axis
|
||
GET #1, 26, pick.axis
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
premetal& = _LOADIMAGE("electricplane2.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
numcontroller% = _DEVICES
|
||
DO
|
||
_LIMIT 60
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
_FONT quartz&
|
||
COLOR _RGB(255, 200, 0)
|
||
center "OPTIONS", 1
|
||
_FONT cyberbit&
|
||
COLOR _RGB(255, 255, 255)
|
||
center "Set Screen Resolution (" + LTRIM$(STR$(swidth)) + " x " + LTRIM$(STR$(sheight)) + ")", 4
|
||
IF fs = 0 THEN center "Toggle Fullscreen (off)", 5 ELSE center "Toggle Fulscreen (on)", 5
|
||
IF graphsetting = 0 THEN center "Fancyness (Low)", 6 ELSE center "Fancyness (High)", 6
|
||
center "Plane color (" + LTRIM$(STR$(red)) + ", " + LTRIM$(STR$(green)) + ", " + LTRIM$(STR$(blue)) + ") -- " + colorhint$(red, green, blue), 7
|
||
IF difficulty = 0 THEN center "Enemy AI (good)", 8 ELSE center "Enemy AI (really good)", 8
|
||
IF gamepad = 0 THEN center "Input Device: Mouse & Keyboard Only", 9 ELSE center "Input Device: " + controllerparse$(4, gamepad), 9
|
||
center "Controls (If you're using a controller)", 10
|
||
center "Planes per team: (" + LTRIM$(STR$(team)) + ")", 11
|
||
center "Music volume: (" + LTRIM$(STR$(INT(vol * 100))) + "%)", 12
|
||
center "Restore Defaults", 13
|
||
center "Back", 14
|
||
IF menu(4) THEN
|
||
pickres
|
||
premetal& = _LOADIMAGE("electricplane2.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
PUT #1, 1, swidth
|
||
PUT #1, 2, sheight
|
||
_PRINTMODE _KEEPBACKGROUND
|
||
_FONT 16
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
END IF
|
||
IF menu(5) THEN
|
||
IF fs = 0 THEN fs = 1 ELSE fs = 0
|
||
IF fs = 0 THEN _FULLSCREEN _OFF ELSE _FULLSCREEN
|
||
PUT #1, 3, fs
|
||
END IF
|
||
IF menu(6) THEN
|
||
IF graphsetting = 0 THEN graphsetting = 1 ELSE graphsetting = 0
|
||
PUT #1, 4, graphsetting
|
||
END IF
|
||
IF menu(7) THEN
|
||
colorslider red, green, blue, livery
|
||
PUT #1, 5, red
|
||
PUT #1, 6, green
|
||
PUT #1, 7, blue
|
||
PUT #1, 14, livery
|
||
END IF
|
||
IF menu(8) THEN
|
||
IF difficulty = 0 THEN difficulty = 1 ELSE difficulty = 0
|
||
PUT #1, 8, difficulty
|
||
END IF
|
||
IF menu(9) THEN
|
||
DO
|
||
gamepad = gamepad + 1
|
||
IF gamepad > numcontroller% THEN gamepad = 0
|
||
LOOP UNTIL controllerparse$(1, gamepad) = "CONTROLLER" OR gamepad = 0
|
||
PUT #1, 9, gamepad
|
||
END IF
|
||
IF menu(10) THEN
|
||
keybind gamepad, steering, throttle, primary, secondary, scrdown, scrup, pick
|
||
PUT #1, 10, steering.number
|
||
PUT #1, 11, throttle.number
|
||
PUT #1, 12, primary.number
|
||
PUT #1, 13, secondary.number
|
||
PUT #1, 16, scrdown.number
|
||
PUT #1, 17, scrup.number
|
||
PUT #1, 18, pick.number
|
||
PUT #1, 20, steering.axis
|
||
PUT #1, 21, throttle.axis
|
||
PUT #1, 22, primary.axis
|
||
PUT #1, 23, secondary.axis
|
||
PUT #1, 24, scrdown.axis
|
||
PUT #1, 25, scrup.axis
|
||
PUT #1, 26, pick.axis
|
||
END IF
|
||
IF menu(11) THEN
|
||
team = team + 1
|
||
IF team > 4 THEN team = 1
|
||
PUT #1, 15, team
|
||
END IF
|
||
IF menu(12) THEN volumeslider vol
|
||
PUT #1, 19, vol
|
||
IF menu(13) THEN
|
||
fs = 1
|
||
graphsetting = 0
|
||
red = 0
|
||
green = 0
|
||
blue = 255
|
||
difficulty = 0
|
||
gamepad = 0
|
||
steering.number = 1
|
||
throttle.number = 3
|
||
primary.number = 1
|
||
secondary.number = 2
|
||
livery = 0
|
||
team = 1
|
||
scrdown.number = 4
|
||
scrup.number = 5
|
||
pick.number = 3
|
||
vol = 0.8
|
||
steering.axis = 1
|
||
throttle.axis = 1
|
||
primary.axis = 0
|
||
secondary.axis = 0
|
||
scrdown.axis = 0
|
||
scrup.axis = 0
|
||
pick.axis = 0
|
||
PUT #1, 3, fs
|
||
PUT #1, 4, graphsetting
|
||
PUT #1, 5, red
|
||
PUT #1, 6, green
|
||
PUT #1, 7, blue
|
||
PUT #1, 8, difficulty
|
||
PUT #1, 9, gamepad
|
||
PUT #1, 10, steering.number
|
||
PUT #1, 11, throttle.number
|
||
PUT #1, 12, primary.number
|
||
PUT #1, 13, secondary.number
|
||
PUT #1, 14, livery
|
||
PUT #1, 15, team
|
||
PUT #1, 16, scrdown.number
|
||
PUT #1, 17, scrup.number
|
||
PUT #1, 18, pick.number
|
||
PUT #1, 19, vol
|
||
PUT #1, 20, steering.axis
|
||
PUT #1, 21, throttle.axis
|
||
PUT #1, 22, primary.axis
|
||
PUT #1, 23, secondary.axis
|
||
PUT #1, 24, scrdown.axis
|
||
PUT #1, 25, scrup.axis
|
||
PUT #1, 26, pick.axis
|
||
END IF
|
||
IF menu(14) THEN
|
||
EXIT DO
|
||
END IF
|
||
clickonce
|
||
cursor
|
||
_DISPLAY
|
||
LOOP
|
||
CLOSE #1
|
||
_FONT 16
|
||
IF quartz& <> 0 AND quartz& <> -1 THEN _FREEFONT (quartz&)
|
||
IF cyberbit& <> 0 AND cyberbit& <> -1 THEN _FREEFONT (cyberbit&)
|
||
_FREEIMAGE brushedmetal&
|
||
END SUB
|
||
|
||
SUB pickres 'screen resolution picking dialogue
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 16, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
premetal& = _LOADIMAGE("brushedmetal.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
DIM resarray(16) AS res
|
||
RESTORE resolutions
|
||
FOR a% = 1 TO 16
|
||
READ resarray(a%).x, resarray(a%).y, resarray(a%).caption
|
||
NEXT
|
||
DO
|
||
_LIMIT 60
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
_FONT quartz&
|
||
COLOR _RGB(255, 200, 0)
|
||
center "SCREEN RESOLUTION", 1
|
||
_FONT cyberbit&
|
||
COLOR _RGB(255, 255, 255)
|
||
FOR a% = 1 TO 16
|
||
center LTRIM$(STR$(resarray(a%).x)) + " x " + LTRIM$(STR$(resarray(a%).y)) + " " + RTRIM$(resarray(a%).caption), a% + 3
|
||
NEXT
|
||
center "Back", 21
|
||
FOR a% = 1 TO 16
|
||
IF menu(3 + a%) THEN
|
||
swidth = resarray(a%).x
|
||
sheight = resarray(a%).y
|
||
SCREEN _NEWIMAGE(swidth, sheight, 32)
|
||
_PRINTMODE _KEEPBACKGROUND
|
||
premetal& = _LOADIMAGE("brushedmetal.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
_FONT 16
|
||
quartz& = _LOADFONT("segment14.otf", sheight / 16, "")
|
||
cyberbit& = _LOADFONT("cyberbit.ttf", sheight / 32, "")
|
||
END IF
|
||
NEXT
|
||
IF menu(21) THEN
|
||
_FONT 16
|
||
EXIT DO
|
||
END IF
|
||
cursor
|
||
clickonce
|
||
_DISPLAY
|
||
LOOP
|
||
IF quartz& <> 0 THEN _FREEFONT (quartz&)
|
||
'IF cyberbit& <> 0 THEN _FREEFONT (cyberbit&)
|
||
_FREEIMAGE brushedmetal&
|
||
|
||
resolutions:
|
||
DATA 800,600,"(Smallest supported resolution, SVGA)"
|
||
DATA 1024,600,"(Most netbooks)"
|
||
DATA 1024,768,"(XGA, Many older 4:3 LCD monitors)"
|
||
DATA 1280,720,"(720p)"
|
||
DATA 1280,768,"(Wide XGA 5:3)"
|
||
DATA 1280,800,"(Wide XGA 16:10)"
|
||
DATA 1280,960,"(SXGA-)"
|
||
DATA 1280,1024,"(SXGA)"
|
||
DATA 1366,768,"(Many consumer laptops)"
|
||
DATA 1440,900,"(Wide SXGA)"
|
||
DATA 1600,900,"(900p, many modern 16:9 monitors)"
|
||
DATA 1600,1200,"(UXGA)"
|
||
DATA 1680,1050,"(Common widescreen 16:10 monitors)"
|
||
DATA 1920,1080,"(Full HD)"
|
||
DATA 1920,1200,"(Common 23''-25'' monitor resolution)"
|
||
DATA 2560,1600,"(High-end gaming monitors)"
|
||
|
||
END SUB
|
||
|
||
FUNCTION colorhint$ (red, green, blue) 'The 64 color names
|
||
colorint% = red \ 64 + 4 * (green \ 64) + 16 * (blue \ 64)
|
||
SELECT CASE colorint%
|
||
CASE 0: colorhint$ = "Black"
|
||
CASE 1: colorhint$ = "Dark Red"
|
||
CASE 2: colorhint$ = "Crimson"
|
||
CASE 3: colorhint$ = "Red"
|
||
CASE 4: colorhint$ = "Forest Green"
|
||
CASE 5: colorhint$ = "Dark yellow"
|
||
CASE 6: colorhint$ = "Brown"
|
||
CASE 7: colorhint$ = "Orange"
|
||
CASE 8: colorhint$ = "Green"
|
||
CASE 9: colorhint$ = "Dark Olive"
|
||
CASE 10: colorhint$ = "Deep Yellow"
|
||
CASE 11: colorhint$ = "Yellow Orange"
|
||
CASE 12: colorhint$ = "Bright Green"
|
||
CASE 13: colorhint$ = "Grass Green"
|
||
CASE 14: colorhint$ = "Yellow Green"
|
||
CASE 15: colorhint$ = "Yellow"
|
||
CASE 16: colorhint$ = "Dark Blue"
|
||
CASE 17: colorhint$ = "Dark Purple"
|
||
CASE 18: colorhint$ = "Maroon"
|
||
CASE 19: colorhint$ = "Hot Pink"
|
||
CASE 20: colorhint$ = "Dark Teal"
|
||
CASE 21: colorhint$ = "Dark Grey"
|
||
CASE 22: colorhint$ = "Rose"
|
||
CASE 23: colorhint$ = "Light Red"
|
||
CASE 24: colorhint$ = "Dark Blue Green"
|
||
CASE 25: colorhint$ = "Drab Green"
|
||
CASE 26: colorhint$ = "Drab Yellow"
|
||
CASE 27: colorhint$ = "Salmon"
|
||
CASE 28: colorhint$ = "Mint"
|
||
CASE 29: colorhint$ = "Sage"
|
||
CASE 30: colorhint$ = "Lime"
|
||
CASE 31: colorhint$ = "Dusty Yellow"
|
||
CASE 32: colorhint$ = "Indigo"
|
||
CASE 33: colorhint$ = "Purple"
|
||
CASE 34: colorhint$ = "Violet"
|
||
CASE 35: colorhint$ = "Bright Purple"
|
||
CASE 36: colorhint$ = "8 Blue"
|
||
CASE 37: colorhint$ = "Navy"
|
||
CASE 38: colorhint$ = "Lavender"
|
||
CASE 39: colorhint$ = "Pink"
|
||
CASE 40: colorhint$ = "That color that looks bad on cars"
|
||
CASE 41: colorhint$ = "Seafoam Blue"
|
||
CASE 42: colorhint$ = "Light Grey"
|
||
CASE 43: colorhint$ = "Light Pink"
|
||
CASE 44: colorhint$ = "Light Teal"
|
||
CASE 45: colorhint$ = "Seafoam Green"
|
||
CASE 46: colorhint$ = "Light Green"
|
||
CASE 47: colorhint$ = "Pale Yellow"
|
||
CASE 48: colorhint$ = "Electric Blue"
|
||
CASE 49: colorhint$ = "Light Indigo"
|
||
CASE 50: colorhint$ = "Light Purple"
|
||
CASE 51: colorhint$ = "Magenta"
|
||
CASE 52: colorhint$ = "Blue"
|
||
CASE 53: colorhint$ = "Light Blue"
|
||
CASE 54: colorhint$ = "Light Lavender"
|
||
CASE 55: colorhint$ = "Light Magenta"
|
||
CASE 56: colorhint$ = "Sky Blue"
|
||
CASE 57: colorhint$ = "Cornfield"
|
||
CASE 58: colorhint$ = "Pale Blue"
|
||
CASE 59: colorhint$ = "Pale Magenta"
|
||
CASE 60: colorhint$ = "Cyan"
|
||
CASE 61: colorhint$ = "Light Cyan"
|
||
CASE 62: colorhint$ = "Pale Cyan"
|
||
CASE 63: colorhint$ = "White"
|
||
END SELECT
|
||
END FUNCTION
|
||
|
||
SUB buttonbind (gamepad, button AS control)
|
||
numdevice% = _DEVICES
|
||
done% = 0
|
||
center "?", 9
|
||
_DISPLAY
|
||
DO WHILE _DEVICEINPUT(gamepad)
|
||
LOOP
|
||
DO
|
||
IF _DEVICEINPUT(gamepad) THEN
|
||
FOR a% = 1 TO _LASTBUTTON(gamepad)
|
||
IF _BUTTONCHANGE(a%) THEN
|
||
button.number = a%
|
||
button.axis = 0
|
||
done% = 1
|
||
END IF
|
||
NEXT
|
||
FOR a% = 1 TO _LASTAXIS(gamepad)
|
||
IF ABS(_AXIS(a%)) >= .5 THEN
|
||
button.number = a%
|
||
button.axis = 1
|
||
done% = 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
LOOP UNTIL done% = 1
|
||
END SUB
|
||
|
||
SUB keybind (gamepad, steering AS control, throttle AS control, primary AS control, secondary AS control, scrdown AS control, scrup AS control, pick AS control)
|
||
premetal& = _LOADIMAGE("brushedmetal.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
numdevice% = _DEVICES
|
||
IF gamepad <= numdevice% AND gamepad <> 0 THEN
|
||
DO
|
||
_LIMIT 60
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
IF steering.axis THEN steerstring$ = "Steering: Axis " + LTRIM$(STR$(steering.number)) ELSE steerstring$ = "Steering: Button " + LTRIM$(STR$(steering.number))
|
||
center steerstring$, 1
|
||
IF throttle.axis THEN throtstring$ = "Throttle: Axis " + LTRIM$(STR$(throttle.number)) ELSE throtstring$ = "Throttle: Button " + LTRIM$(STR$(throttle.number))
|
||
center throtstring$, 2
|
||
IF primary.axis THEN primstring$ = "Fire Primary: Axis " + LTRIM$(STR$(primary.number)) ELSE primstring$ = "Fire Primary: Button " + LTRIM$(STR$(primary.number))
|
||
center primstring$, 3
|
||
IF secondary.axis THEN secondstring$ = "Fire Secondary: Axis " + LTRIM$(STR$(secondary.number)) ELSE secondstring$ = "Fire Secondary: Button " + LTRIM$(STR$(secondary.number))
|
||
center secondstring$, 4
|
||
IF scrup.axis THEN upstring$ = "Next Weapon/Mod: Axis " + LTRIM$(STR$(scrup.number)) ELSE upstring$ = "Next Weapon/Mod: Button " + LTRIM$(STR$(scrup.number))
|
||
center upstring$, 5
|
||
IF scrdown.axis THEN downstring$ = "Last Weapon/Mod: Axis " + LTRIM$(STR$(scrdown.number)) ELSE downstring$ = "Last Weapon/Mod: Button " + LTRIM$(STR$(scrdown.number))
|
||
center downstring$, 6
|
||
IF pick.axis THEN pickstring$ = "Toggle Weapon/Mod: Axis " + LTRIM$(STR$(pick.number)) ELSE pickstring$ = "Toggle Weapon/Mod: Button " + LTRIM$(STR$(pick.number))
|
||
center pickstring$, 7
|
||
center "Back", 8
|
||
IF menu(1) THEN buttonbind gamepad, steering
|
||
IF menu(2) THEN buttonbind gamepad, throttle
|
||
IF menu(3) THEN buttonbind gamepad, primary
|
||
IF menu(4) THEN buttonbind gamepad, secondary
|
||
IF menu(5) THEN buttonbind gamepad, scrup
|
||
IF menu(6) THEN buttonbind gamepad, scrdown
|
||
IF menu(7) THEN buttonbind gamepad, pick
|
||
testaxis = 0
|
||
IF menu(8) THEN EXIT DO
|
||
cursor
|
||
clickonce
|
||
_DISPLAY
|
||
LOOP
|
||
END IF
|
||
_FREEIMAGE brushedmetal&
|
||
CLOSE #2
|
||
END SUB
|
||
|
||
SUB colorslider (red, green, blue, livery) 'The RGB color sliders to choose plane colors
|
||
DIM colory(2)
|
||
plane& = _LOADIMAGE("plane.png")
|
||
_CLEARCOLOR _RGB(0, 0, 0), plane&
|
||
premetal& = _LOADIMAGE("brushedmetal.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
liv1& = recolor&(plane&, _RGB(255, 255, 255), _RGB(red, green, blue))
|
||
liv2& = colorgreyspectrum(plane&, _RGB(red, green, blue))
|
||
DO
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
lclick% = _MOUSEBUTTON(1)
|
||
LOOP WHILE _MOUSEINPUT
|
||
_LIMIT 60
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
PRINT "Press 'Esc' to go back."
|
||
colory(0) = 279 - red
|
||
colory(1) = 279 - green
|
||
colory(2) = 279 - blue
|
||
LINE (swidth / 2 - 33, 24)-(swidth / 2 - 32, 279), _RGB(127, 0, 0), B
|
||
LINE (swidth / 2 - 1, 24)-(swidth / 2, 279), _RGB(0, 127, 0), B
|
||
LINE (swidth / 2 + 31, 24)-(swidth / 2 + 32, 279), _RGB(0, 0, 127), B
|
||
IF trigger(swidth / 2 - 40, 16, swidth / 2 - 25, 287, mousex%, mousey%) AND lclick% THEN colory(0) = mousey%: liv1& = recolor&(plane&, _RGB(255, 255, 255), _RGB(red, green, blue)): liv2& = colorgreyspectrum(plane&, _RGB(red, green, blue))
|
||
IF trigger(swidth / 2 - 8, 16, swidth / 2 + 7, 287, mousex%, mousey%) AND lclick% THEN colory(1) = mousey%: liv1& = recolor&(plane&, _RGB(255, 255, 255), _RGB(red, green, blue)): liv2& = colorgreyspectrum(plane&, _RGB(red, green, blue))
|
||
IF trigger(swidth / 2 + 24, 16, swidth / 2 + 39, 287, mousex%, mousey%) AND lclick% THEN colory(2) = mousey%: liv1& = recolor&(plane&, _RGB(255, 255, 255), _RGB(red, green, blue)): liv2& = colorgreyspectrum(plane&, _RGB(red, green, blue))
|
||
FOR a% = 0 TO 2
|
||
IF colory(a%) < 24 THEN colory(a%) = 24
|
||
IF colory(a%) > 279 THEN colory(a%) = 279
|
||
NEXT
|
||
LINE (swidth / 2 - 40, colory(0) - 8)-(swidth / 2 - 25, colory(0) + 7), _RGB(255, 0, 0), BF
|
||
LINE (swidth / 2 - 8, colory(1) - 8)-(swidth / 2 + 7, colory(1) + 7), _RGB(0, 255, 0), BF
|
||
LINE (swidth / 2 + 24, colory(2) - 8)-(swidth / 2 + 39, colory(2) + 7), _RGB(0, 0, 255), BF
|
||
red = 279 - colory(0)
|
||
green = 279 - colory(1)
|
||
blue = 279 - colory(2)
|
||
center LTRIM$(STR$(red)) + ", " + LTRIM$(STR$(green)) + ", " + LTRIM$(STR$(blue)), 16
|
||
_PUTIMAGE (swidth / 2 - 32, 310), liv1&, , (64, 0)-(95, 31)
|
||
_PUTIMAGE (swidth / 2, 310), liv2&, , (64, 0)-(95, 31)
|
||
IF trigger(swidth / 2 - 32, 310, swidth / 2 - 1, 341, mousex%, mousey%) AND lclick% THEN livery = 0
|
||
IF trigger(swidth / 2, 310, swidth / 2 + 31, 341, mousex%, mousey%) AND lclick% THEN livery = 1
|
||
IF livery = 0 THEN LINE (swidth / 2 - 32, 310)-(swidth / 2 - 1, 341), _RGB(255, 255, 255), B
|
||
IF livery = 1 THEN LINE (swidth / 2, 310)-(swidth / 2 + 31, 341), _RGB(255, 255, 255), B
|
||
cursor
|
||
_DISPLAY
|
||
LOOP UNTIL _KEYDOWN(27)
|
||
_FREEIMAGE plane&
|
||
_FREEIMAGE brushedmetal&
|
||
END SUB
|
||
|
||
SUB volumeslider (vol)
|
||
premetal& = _LOADIMAGE("brushedmetal.png")
|
||
brushedmetal& = _NEWIMAGE(swidth, sheight, 32)
|
||
_PUTIMAGE (0, 0)-(swidth - 1, sheight - 1), premetal&, brushedmetal&
|
||
_FREEIMAGE premetal&
|
||
DO
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
lclick% = _MOUSEBUTTON(1)
|
||
LOOP WHILE _MOUSEINPUT
|
||
_LIMIT 60
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
PRINT "Press 'Esc' to go back."
|
||
LINE (swidth / 2 - 1, 24)-(swidth / 2, 279), _RGB(255, 255, 255), B
|
||
IF trigger(swidth / 2 - 8, 16, swidth / 2 + 7, 287, mousex%, mousey%) AND lclick% THEN vol = INT((279 - mousey%) / 2.55) / 100
|
||
IF vol > 1 THEN vol = 1
|
||
IF vol < 0 THEN vol = 0
|
||
LINE (swidth / 2 - 8, 279 - vol * 255 - 8)-(swidth / 2 + 7, 279 - vol * 255 + 7), _RGB(255, 255, 255), BF
|
||
center LTRIM$(STR$(INT(vol * 100))) + "%", 16
|
||
cursor
|
||
_DISPLAY
|
||
LOOP UNTIL _KEYDOWN(27)
|
||
_FREEIMAGE brushedmetal&
|
||
END SUB
|
||
|
||
SUB genground (topo%())
|
||
FOR y% = 0 TO 15
|
||
FOR x% = 0 TO 15
|
||
IF topo%(x%, y%) = 0 THEN
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 THEN IF topo%(x% - 1, y% - 1) = 1 THEN topo%(x%, y%) = 3
|
||
IF x% + 1 <= 15 AND y% - 1 >= 0 THEN IF topo%(x% + 1, y% - 1) = 1 THEN topo%(x%, y%) = 4
|
||
IF x% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% + 1) = 1 THEN topo%(x%, y%) = 5
|
||
IF x% + 1 <= 15 AND y% + 1 <= 15 THEN IF topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 6
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND x% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x% + 1, y% - 1) = 1 THEN topo%(x%, y%) = 19
|
||
IF x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% + 1, y% - 1) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 20
|
||
IF x% - 1 >= 0 AND y% + 1 <= 15 AND x% + 1 <= 15 THEN IF topo%(x% - 1, y% + 1) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 21
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x% - 1, y% + 1) = 1 THEN topo%(x%, y%) = 22
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% + 1) = 1 AND topo%(x% + 1, y% - 1) = 1 THEN topo%(x%, y%) = 42
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 43
|
||
IF y% - 1 >= 0 THEN IF topo%(x%, y% - 1) = 1 THEN topo%(x%, y%) = 7
|
||
IF x% + 1 <= 15 THEN IF topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 8
|
||
IF y% + 1 <= 15 THEN IF topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 9
|
||
IF x% - 1 >= 0 THEN IF topo%(x% - 1, y%) = 1 THEN topo%(x%, y%) = 10
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 24
|
||
IF x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% + 1, y% - 1) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 25
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x%, y% - 1) = 1 AND topo%(x% - 1, y% + 1) = 1 THEN topo%(x%, y%) = 26
|
||
IF x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 27
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x% + 1, y% - 1) = 1 THEN topo%(x%, y%) = 28
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 29
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 30
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% + 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 31
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x% + 1, y% - 1) = 1 AND topo%(x, y% + 1) = 1 THEN topo%(x%, y%) = 34
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x% + 1, y% - 1) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 35
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% + 1) = 1 AND topo%(x% + 1, y% + 1) = 1 AND topo%(x%, y% - 1) = 1 THEN topo%(x%, y%) = 36
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x% - 1, y% + 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 37
|
||
IF x% + 1 <= 15 AND y% - 1 >= 0 THEN IF topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 11
|
||
IF x% + 1 <= 15 AND y% + 1 <= 15 THEN IF topo%(x% + 1, y%) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 12
|
||
IF x% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 13
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 THEN IF topo%(x%, y% - 1) = 1 AND topo%(x% - 1, y%) = 1 THEN topo%(x%, y%) = 14
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% + 1) = 1 AND topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 38
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y% - 1) = 1 AND topo%(x%, y% + 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 39
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% + 1) = 1 AND topo%(x% + 1, y% - 1) = 1 THEN topo%(x%, y%) = 40
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y% + 1) = 1 THEN topo%(x%, y%) = 41
|
||
IF y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x%, y% - 1) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 32
|
||
IF x% - 1 >= 0 AND x% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 33
|
||
IF x% - 1 >= 0 AND y% + 1 <= 15 AND x% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% + 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 15
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% - 1) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 16
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND x% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y%) = 1 THEN topo%(x%, y%) = 17
|
||
IF x% + 1 <= 15 AND y% - 1 >= 0 AND y% + 1 <= 15 THEN IF topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y%) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 18
|
||
IF x% - 1 >= 0 AND y% - 1 >= 0 AND x% + 1 <= 15 AND y% + 1 <= 15 THEN IF topo%(x% - 1, y%) = 1 AND topo%(x%, y% - 1) = 1 AND topo%(x% + 1, y%) = 1 AND topo%(x%, y% + 1) = 1 THEN topo%(x%, y%) = 23
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
END SUB
|
||
|
||
SUB scrollground (allground&) 'Makes the scrolling background with all the grass -- rivers are planned for the future. Demensions are 4096 + screen width - 200 x 4096 + screen height.
|
||
IF allground& THEN
|
||
_PUTIMAGE (0, 0)-(swidth - 200, sheight), allground&, 0, (screenanchorx%, screenanchory%)-(screenanchorx% + swidth - 200, screenanchory% + sheight)
|
||
END IF
|
||
END SUB
|
||
|
||
SUB aimarket (player AS airplane, plane%, weapons() AS weapon, wepstorage() AS weapon)
|
||
DIM switchvar AS weapon
|
||
FOR k% = 0 TO 15
|
||
FOR l% = 1 TO 5
|
||
IF wepstorage(plane%, k%).wep = 0 AND weapons(plane%, l%).wep <> 0 THEN
|
||
switchvar = weapons(plane%, l%)
|
||
weapons(plane%, l%) = wepstorage(plane%, k%)
|
||
wepstorage(plane%, k%) = switchvar
|
||
IF l% = 2 OR l% = 3 THEN
|
||
FOR look% = 0 TO 15
|
||
IF wepstorage(plane%, look%).wep = 0 THEN wepstorage(plane%, look%) = switchvar: EXIT FOR
|
||
NEXT
|
||
END IF
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
choice% = INT(RND * 14) + 1
|
||
SELECT CASE choice%
|
||
CASE 1: IF player.credits >= 3 THEN selectweapon 1, plane%, wepstorage(): player.credits = player.credits - 3
|
||
CASE 2: IF player.credits >= 3 THEN selectweapon 2, plane%, wepstorage(): player.credits = player.credits - 3
|
||
CASE 3: IF player.credits >= 3 THEN selectweapon 3, plane%, wepstorage(): player.credits = player.credits - 3
|
||
CASE 4: IF player.credits >= 3 THEN selectweapon 4, plane%, wepstorage(): player.credits = player.credits - 3
|
||
CASE 5: IF player.credits >= 3 THEN selectweapon 5, plane%, wepstorage(): player.credits = player.credits - 3
|
||
CASE 6: IF player.credits >= 5 THEN selectweapon 6, plane%, wepstorage(): player.credits = player.credits - 5
|
||
CASE 9: IF player.credits >= 4 THEN selectmissile 1, plane%, wepstorage(): player.credits = player.credits - 4
|
||
CASE 10: IF player.credits >= 5 THEN selectmissile 2, plane%, wepstorage(): player.credits = player.credits - 5
|
||
CASE 11: IF player.credits >= 6 THEN selectmissile 3, plane%, wepstorage(): player.credits = player.credits - 6
|
||
CASE 12: IF player.credits >= 5 AND player.generator < 1 THEN player.generator = player.generator + .1: player.credits = player.credits - 5
|
||
CASE 13: IF player.credits >= 5 AND player.maxbatt < 200 THEN player.maxbatt = player.maxbatt + 10: player.credits = player.credits - 5
|
||
CASE 14: IF player.credits >= 5 AND player.maxarm < 20 THEN player.maxarm = player.maxarm + 1: player.credits = player.credits - 5
|
||
CASE 15: IF player.credits >= 1 AND player.ammo < 10000 THEN player.ammo = player.ammo + 1000: player.credits = player.credits - 1
|
||
END SELECT
|
||
FOR a% = 2 TO 3
|
||
FOR k% = 0 TO 15
|
||
IF wepstorage(plane%, k%).wep <> 0 AND wepstorage(plane%, k%).wep <= 8 THEN
|
||
FOR look% = 0 TO 15
|
||
IF wepstorage(plane%, look%).wep = wepstorage(plane%, k%).wep AND look% <> k% THEN
|
||
switchvar = weapons(plane%, a%)
|
||
weapons(plane%, a%) = wepstorage(plane%, k%)
|
||
wepstorage(plane%, k%) = switchvar
|
||
wepstorage(plane%, look%) = switchvar
|
||
EXIT FOR: EXIT FOR
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
FOR k% = 0 TO 15
|
||
IF wepstorage(plane%, k%).wep <> 0 AND wepstorage(plane%, k%).wep <= 8 THEN
|
||
switchvar = weapons(plane%, 1)
|
||
weapons(plane%, 1) = wepstorage(plane%, k%)
|
||
wepstorage(plane%, k%) = switchvar
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
FOR a% = 4 TO 5
|
||
FOR k% = 0 TO 15
|
||
IF wepstorage(plane%, k%).wep >= 9 THEN
|
||
switchvar = weapons(plane%, a%)
|
||
weapons(plane%, a%) = wepstorage(plane%, k%)
|
||
wepstorage(plane%, k%) = switchvar
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
player.market = 0
|
||
player.force = 3
|
||
player.speed = 3
|
||
player.battery = player.maxbatt
|
||
SELECT CASE player.team
|
||
CASE 0
|
||
player.x = 32
|
||
player.dir = 0
|
||
CASE 1
|
||
player.x = 4063
|
||
player.dir = pi
|
||
CASE 2
|
||
player.y = 32
|
||
player.dir = pi / 2
|
||
CASE 3
|
||
player.y = 4063
|
||
player.dir = 3 * pi / 2
|
||
END SELECT
|
||
END SUB
|
||
|
||
SUB market (player AS airplane, plane%, weapons() AS weapon, mods() AS aug, wepimage&(), modimage&(), statimage&(), wepstorage() AS weapon, modstorage() AS aug, wepmouse AS weapon, modmouse AS aug, whichstore%, quartz&, quartz2&, cyberbit&, brushedmetal&, tooltips&(), difficulty)
|
||
'Handles the markets
|
||
_FONT cyberbit&
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
lclick% = _MOUSEBUTTON(1)
|
||
LOOP WHILE _MOUSEINPUT
|
||
CLS
|
||
_PUTIMAGE (0, 0), brushedmetal&
|
||
IF trigger(0, 0, 191, 31, mousex%, mousey%) AND lclick% THEN whichstore% = 0
|
||
IF trigger(192, 0, 383, 31, mousex%, mousey%) AND lclick% THEN whichstore% = 1
|
||
IF trigger(384, 0, 575, 31, mousex%, mousey%) AND lclick% THEN whichstore% = 2
|
||
SELECT CASE whichstore%
|
||
CASE 0: wepmarket player.credits, plane%, weapons(), wepimage&(), wepstorage(), wepmouse, quartz2&
|
||
CASE 1: modmarket player.credits, plane%, mods(), modimage&(), modstorage(), modmouse, tooltips&()
|
||
CASE 2: statmarket player, statimage&(), quartz2&
|
||
END SELECT
|
||
_FONT quartz&
|
||
PRINT " WEAPONS | MODS | STATS |"
|
||
_FONT cyberbit&
|
||
IF difficulty <> 0 THEN _PRINTSTRING (swidth - _PRINTWIDTH("Time: " + LTRIM$(STR$(60 - player.markettime \ 60))), sheight - 72), "Time: " + LTRIM$(STR$(60 - player.markettime \ 60))
|
||
_PRINTSTRING (swidth - _PRINTWIDTH("Cr. " + LTRIM$(STR$(player.credits))), sheight - 48), "Cr. " + LTRIM$(STR$(player.credits))
|
||
_PRINTSTRING (swidth - _PRINTWIDTH("EXIT"), sheight - 24), "EXIT"
|
||
IF trigger(swidth - _PRINTWIDTH("EXIT"), sheight - 24, swidth - 1, sheight - 1, mousex%, mousey%) AND lclick% = -1 AND ignore` = 0 OR player.markettime >= 3600 AND difficulty <> 0 OR _KEYDOWN(27) THEN
|
||
player.market = 0
|
||
player.x = 32
|
||
player.dir = 0
|
||
player.force = 3
|
||
player.speed = 3
|
||
player.battery = player.maxbatt
|
||
player.waittime = player.waittime + player.markettime * 2
|
||
player.markettime = 0
|
||
_FONT 16
|
||
ignore` = -1
|
||
END IF
|
||
player.markettime = player.markettime + 1
|
||
cursor
|
||
clickonce
|
||
END SUB
|
||
|
||
SUB wepmarket (credits%, plane%, weapons() AS weapon, wepimage&(), storage() AS weapon, inmouse AS weapon, quartz&) 'The market with the weapons in it
|
||
DIM switchvar AS weapon
|
||
DIM blankspace AS weapon
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
lclick% = _MOUSEBUTTON(1)
|
||
rclick% = _MOUSEBUTTON(2)
|
||
LOOP WHILE _MOUSEINPUT
|
||
LINE (0, 0)-(191, 31), _RGB(127, 0, 0), BF
|
||
FOR wep% = 1 TO 11
|
||
_PUTIMAGE (0, wep% * 32), wepimage&(wep%)
|
||
NEXT
|
||
_PRINTSTRING (32, 32), "Laser - Cr.3"
|
||
_PRINTSTRING (32, 64), "Vulcan - Cr.3"
|
||
_PRINTSTRING (32, 96), "Spread - Cr.3"
|
||
_PRINTSTRING (32, 128), "Plasma - Cr.3"
|
||
_PRINTSTRING (32, 160), "Gauss - Cr.3"
|
||
_PRINTSTRING (32, 192), "Avenger - Cr.5"
|
||
_PRINTSTRING (32, 224), "Homing Plasma - Cr.5"
|
||
_PRINTSTRING (32, 256), "Pulse - Cr.5"
|
||
_PRINTSTRING (32, 288), "10 Heat-Seeker Missiles - Cr.4"
|
||
_PRINTSTRING (32, 320), "10 Radar-Guided Missiles - Cr.5"
|
||
_PRINTSTRING (32, 352), "4 Cruise Missiles - Cr.6"
|
||
weaponhud swidth - 180, 20, weapons(), plane%, wepimage&(), 0
|
||
_PRINTSTRING (swidth - 180, 104), "STORAGE"
|
||
grid swidth - 164, 128
|
||
FOR y% = 0 TO 3
|
||
FOR x% = 0 TO 3
|
||
_PUTIMAGE (swidth - 164 + x% * 32, 128 + y% * 32), wepimage&(storage(0, x% + 4 * y%).wep)
|
||
IF storage(0, x% + 4 * y%).wep >= 9 THEN _PRINTSTRING (swidth - 133 - _PRINTWIDTH(LTRIM$(STR$(storage(0, x% + 4 * y%).ammo))) + x% * 32, 159 - _FONTHEIGHT + y% * 32), LTRIM$(STR$(storage(0, x% + 4 * y%).ammo))
|
||
IF trigger(swidth - 164 + x% * 32, 128 + y% * 32, swidth - 133 + x% * 32, 159 + y% * 32, mousex%, mousey%) AND lclick% AND ignore` = 0 THEN
|
||
IF storage(0, x% + 4 * y%).wep >= 9 THEN
|
||
IF storage(0, x% + 4 * y%).wep = inmouse.wep THEN
|
||
storage(0, x% + 4 * y%).ammo = storage(0, x% + 4 * y%).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
END IF
|
||
END IF
|
||
switchvar = inmouse
|
||
inmouse = storage(0, x% + 4 * y%)
|
||
storage(0, x% + 4 * y%) = switchvar
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(swidth - 164 + x% * 32, 128 + y% * 32, swidth - 133 + x% * 32, 159 + y% * 32, mousex%, mousey%) AND rclick% AND ignore` = 0 THEN
|
||
storage(0, x% + 4 * y%) = blankspace
|
||
ignore` = -1
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
changeweapons swidth - 180, 20, mousex%, mousey%, lclick%, plane%, inmouse, weapons(), storage()
|
||
_PUTIMAGE (mousex% - 16, mousey% - 16), wepimage&(inmouse.wep)
|
||
IF trigger(0, 32, swidth - 200, 63, mousex%, mousey%) THEN
|
||
nrg = 1.25: dam = 25: rpm = 300: spd = 16: amo = 0
|
||
specattr1$ = "None"
|
||
'wot "A standard laser cannon, with medium rate of fire, medium power, and medium energy consumption.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectweapon 1, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 64, swidth - 200, 95, mousex%, mousey%) THEN
|
||
nrg = 0: dam = 30: rpm = 3600: spd = 20: amo = 60
|
||
specattr1$ = "Spread angle = 3" + CHR$(248)
|
||
'wot "A heavy machine gun with a high fire rate. Since it's a balistic weapon, it uses bullets rather than energy.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectweapon 2, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 96, swidth - 200, 127, mousex%, mousey%) THEN
|
||
nrg = 2.25: dam = 56.25: rpm = 450: spd = 16: amo = 0
|
||
specattr1$ = "Bullets/shot = 3"
|
||
specattr2$ = "Spread angle = 60" + CHR$(248)
|
||
'wot "A unique energy weapon that fires three shots at even angles -- one strait forward, and one on each side.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectweapon 3, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 128, swidth - 200, 159, mousex%, mousey%) THEN
|
||
nrg = 5: dam = 100: rpm = 600: spd = 18: amo = 0
|
||
specattr1$ = "None"
|
||
'wot "A high-power blaster. It has a high firing rate and energy consumption, so watch your battery.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectweapon 4, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 160, swidth - 200, 191, mousex%, mousey%) THEN
|
||
nrg = 0: dam = 30: rpm = 450: spd = 20: amo = 60
|
||
specattr1$ = "Bullets/shot = 8"
|
||
specattr2$ = "Spread angle = 3" + CHR$(248)
|
||
'wot "A machine gun that, instead of firing individual bullets consecutively, loads all barrels and fires them all at once.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectweapon 5, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 192, swidth - 200, 223, mousex%, mousey%) THEN
|
||
nrg = 0: dam = 60: rpm = 3600: spd = 20: amo = 60
|
||
specattr1$ = "Recoil effect"
|
||
specattr2$ = "Spread angle = 3" + CHR$(248)
|
||
'wot "This powerful machine gun's recoil is more powerful than your engine, so throttle up.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 5 AND ignore` = 0 THEN selectweapon 6, 0, storage(): credits% = credits% - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 224, swidth - 200, 255, mousex%, mousey%) THEN
|
||
nrg = 10: dam = 60: rpm = 3600: spd = 12: amo = 0
|
||
specattr1$ = "Charged"
|
||
specattr2$ = "Homing"
|
||
'wot "A charging weapon that fires a slow homing shot. Good to have when you run out of missiles.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 5 AND ignore` = 0 THEN selectweapon 7, 0, storage(): credits% = credits% - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 256, swidth - 200, 287, mousex%, mousey%) THEN
|
||
nrg = 10: dam = 60: rpm = 3600: spd = 16: amo = 0
|
||
specattr1$ = "Charged"
|
||
specattr2$ = "Ghost"
|
||
'wot "A charging weapon who'se shots continue after hitting something.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 5 AND ignore` = 0 THEN selectweapon 8, 0, storage(): credits% = credits% - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 288, swidth - 200, 319, mousex%, mousey%) THEN
|
||
nrg = 0: dam = 50: rpm = 60: spd = 16: amo = 1
|
||
specattr1$ = "Homing"
|
||
'wot "Missiles that home in on whatever they see first.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 4 AND ignore` = 0 THEN selectmissile 1, 0, storage(): credits% = credits% - 4: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 320, swidth - 200, 351, mousex%, mousey%) THEN
|
||
nrg = 0: dam = 50: rpm = 60: spd = 16: amo = 1
|
||
specattr1$ = "Homing (Leads)"
|
||
'wot "Homes more accurately than a heat-seeker, and has longer range as well.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 5 AND ignore` = 0 THEN selectmissile 2, 0, storage(): credits% = credits% - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 352, swidth - 200, 383, mousex%, mousey%) THEN
|
||
nrg = 0: dam = 300: rpm = 60: spd = 16: amo = 1
|
||
specattr1$ = "Splash range = 300"
|
||
specattr2$ = "Homing (weak)"
|
||
'wot "It doesn't home very tightly, but it flies for a long time and has a very, very big explosion. It also doesn't require a direct hit.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 6 AND ignore` = 0 THEN selectmissile 3, 0, storage(): credits% = credits% - 6: ignore` = -1
|
||
END IF
|
||
hudbar 8, "NRG", nrg, 10, _RGB(127, 127, 0), "/sec", quartz&
|
||
hudbar 9, "DAM", dam, 100, _RGB(0, 0, 127), "/sec", quartz&
|
||
hudbar 10, "RPM", rpm, 3600, _RGB(0, 127, 0), "", quartz&
|
||
hudbar 11, "SPD", spd, 20, _RGB(0, 127, 127), "", quartz&
|
||
hudbar 12, "AMO", amo, 60, _RGB(31, 31, 31), "/sec", quartz&
|
||
_PRINTSTRING (swidth - 200, 416), specattr1$
|
||
_PRINTSTRING (swidth - 200, 448), specattr2$
|
||
END SUB
|
||
|
||
SUB modmarket (credits%, plane%, mods() AS aug, modimage&(), storage() AS aug, inmouse AS aug, tooltips&()) 'The market with the mods in it
|
||
DIM switchvar AS aug
|
||
DIM blankspace AS aug
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
lclick% = _MOUSEBUTTON(1)
|
||
rclick% = _MOUSEBUTTON(2)
|
||
LOOP WHILE _MOUSEINPUT
|
||
LINE (192, 0)-(383, 31), _RGB(0, 127, 0), BF
|
||
FOR wep% = 1 TO 4
|
||
_PUTIMAGE (0, wep% * 32), modimage&(wep%)
|
||
NEXT
|
||
_PRINTSTRING (32, 32), "Aimer - Cr.3"
|
||
_PRINTSTRING (32, 64), "Energy ==> Armor - Cr.3"
|
||
_PRINTSTRING (32, 96), "Solid Rocket Booster - Cr.3"
|
||
_PRINTSTRING (32, 128), "Flare Pack - Cr.3"
|
||
modhud swidth - 180, 20, mods(), plane%, modimage&(), 0
|
||
_PRINTSTRING (swidth - 180, 104), "STORAGE"
|
||
grid swidth - 164, 128
|
||
FOR y% = 0 TO 3
|
||
FOR x% = 0 TO 3
|
||
_PUTIMAGE (swidth - 164 + x% * 32, 128 + y% * 32), modimage&(storage(0, x% + 4 * y%).kind)
|
||
IF storage(0, x% + 4 * y%).ammo > 0 THEN _PRINTSTRING (swidth - 133 - _PRINTWIDTH(LTRIM$(STR$(storage(0, x% + 4 * y%).ammo))) + x% * 32, 159 - _FONTHEIGHT + y% * 32), LTRIM$(STR$(storage(0, x% + 4 * y%).ammo))
|
||
IF trigger(swidth - 164 + x% * 32, 128 + y% * 32, swidth - 133 + x% * 32, 159 + y% * 32, mousex%, mousey%) AND lclick% AND ignore` = 0 THEN
|
||
IF storage(0, x% + 4 * y%).ammo > 0 THEN
|
||
IF storage(0, x% + 4 * y%).kind = inmouse.kind THEN
|
||
storage(0, x% + 4 * y%).ammo = storage(0, x% + 4 * y%).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
END IF
|
||
END IF
|
||
switchvar = inmouse
|
||
inmouse = storage(0, x% + 4 * y%)
|
||
storage(0, x% + 4 * y%) = switchvar
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(swidth - 164 + x% * 32, 128 + y% * 32, swidth - 133 + x% * 32, 159 + y% * 32, mousex%, mousey%) AND rclick% AND ignore` = 0 THEN
|
||
storage(0, x% + 4 * y%) = blankspace
|
||
ignore` = -1
|
||
END IF
|
||
NEXT
|
||
NEXT
|
||
changemods swidth - 180, 20, mousex%, mousey%, lclick%, plane%, inmouse, mods()
|
||
_PUTIMAGE (mousex% - 16, mousey% - 16), modimage&(inmouse.kind)
|
||
IF trigger(0, 32, swidth - 200, 63, mousex%, mousey%) THEN
|
||
_PUTIMAGE (mousex%, mousey%), tooltips&(1)
|
||
'wot "This device displays an estimate of where enemy planes will be when your shots get there, as well as a line to help you aim. Fire when the line crosses a circle. Calibrated for lasers.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectmod 1, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 64, swidth - 200, 95, mousex%, mousey%) THEN
|
||
_PUTIMAGE (mousex%, mousey%), tooltips&(2)
|
||
'wot "This device slowly regenerates armor at the cost of electricity. Watch your battery.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectmod 2, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 96, swidth - 200, 127, mousex%, mousey%) THEN
|
||
_PUTIMAGE (mousex%, mousey%), tooltips&(3)
|
||
'wot "Simple, but effective, SRBs are used to provide a short boost of speed in case the need for a quick escape arises. It takes no energy, but runs out of fuel after only one use.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectmod 3, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 128, swidth - 200, 159, mousex%, mousey%) THEN
|
||
_PUTIMAGE (mousex%, mousey%), tooltips&(4)
|
||
'wot "Using one of these fires four flares that can trick all kinds of missiles. It works 4 out of 5 times.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND credits% >= 3 AND ignore` = 0 THEN selectmod 4, 0, storage(): credits% = credits% - 3: ignore` = -1
|
||
END IF
|
||
END SUB
|
||
|
||
SUB statmarket (player AS airplane, statimage&(), quartz&) 'The market with the stats in it
|
||
DO
|
||
mousex% = _MOUSEX
|
||
mousey% = _MOUSEY
|
||
lclick% = _MOUSEBUTTON(1)
|
||
rclick% = _MOUSEBUTTON(2)
|
||
LOOP WHILE _MOUSEINPUT
|
||
LINE (384, 0)-(575, 31), _RGB(0, 0, 127), BF
|
||
FOR wep% = 1 TO 4
|
||
_PUTIMAGE (0, wep% * 32), statimage&(wep%)
|
||
NEXT
|
||
_PRINTSTRING (32, 32), "+ 5% Generator - Cr. 5 (Currently " + LTRIM$(STR$(INT(player.generator * 50))) + ")"
|
||
_PRINTSTRING (32, 64), "+ 10% Battery life - Cr.5 (Currently " + LTRIM$(STR$(player.maxbatt)) + ")"
|
||
_PRINTSTRING (32, 96), "+ 10% Armor - Cr.5 (Currently " + LTRIM$(STR$(player.maxarm * 10)) + ")"
|
||
_PRINTSTRING (32, 128), "1000 Bullets - Cr.1 (currently " + LTRIM$(STR$(player.ammo)) + ")"
|
||
IF trigger(0, 32, swidth - 200, 63, mousex%, mousey%) THEN
|
||
'wot "A generator upgrade that increases its effectiveness.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND player.credits >= 5 AND ignore` = 0 AND player.generator < 2 THEN player.generator = player.generator + .1: player.credits = player.credits - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 64, swidth - 200, 95, mousex%, mousey%) THEN
|
||
'wot "Increases battery storage capacity. Note that the meter on your dashboard displays % of total battery charge.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND player.credits >= 5 AND ignore` = 0 AND player.maxbatt < 200 THEN player.maxbatt = player.maxbatt + 10: player.credits = player.credits - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 96, swidth - 200, 127, mousex%, mousey%) THEN
|
||
'wot "Increases the strength of your armor. Note that the meter on your dashboard displays % of total armor.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND player.credits >= 5 AND ignore` = 0 AND player.maxarm < 20 THEN player.maxarm = player.maxarm + 1: player.credits = player.credits - 5: ignore` = -1
|
||
END IF
|
||
IF trigger(0, 128, swidth - 200, 159, mousex%, mousey%) THEN
|
||
'wot "Machine gun ammunition.", mousex%, mousey%, mousex% + 256
|
||
IF lclick% = -1 AND player.credits >= 1 AND ignore` = 0 AND player.ammo < 10000 THEN player.ammo = player.ammo + 1000: player.credits = player.credits - 1: ignore` = -1
|
||
END IF
|
||
hudbar 8, "GEN", player.generator / 2 * 100, 100, _RGB(0, 127, 0), "/100", quartz&
|
||
hudbar 9, "BAT", player.maxbatt, 200, _RGB(127, 127, 0), "/200", quartz&
|
||
hudbar 10, "ARM", player.maxarm * 10, 200, _RGB(0, 0, 127), "/200", quartz&
|
||
hudbar 11, "AMO", player.ammo, 10000, _RGB(31, 31, 31), "/10000", quartz&
|
||
END SUB
|
||
|
||
SUB grid (x AS INTEGER, y AS INTEGER) 'Makes the storage grid at coordinates ("x", "y")
|
||
FOR y2% = 0 TO 4
|
||
LINE (x, y + y2% * 32)-(x + 128, y + y2% * 32), _RGB(255, 255, 255)
|
||
NEXT
|
||
FOR x2% = 0 TO 4
|
||
LINE (x + x2% * 32, y)-(x + x2% * 32, y + 128), _RGB(255, 255, 255)
|
||
NEXT
|
||
END SUB
|
||
|
||
SUB selectweapon (num AS INTEGER, plane AS INTEGER, storage() AS weapon) 'Gives the player weapons that pchk buys, and puts them in storage.
|
||
DIM selection(8) AS weapon
|
||
selection(1).wep = 1
|
||
selection(1).ifon = -1
|
||
selection(1).total = 12
|
||
selection(1).energy = .25
|
||
selection(2).wep = 2
|
||
selection(2).ifon = -1
|
||
selection(2).total = 1
|
||
selection(2).ammo = 1
|
||
selection(3).wep = 3
|
||
selection(3).ifon = -1
|
||
selection(3).total = 8
|
||
selection(3).energy = .3
|
||
selection(4).wep = 4
|
||
selection(4).ifon = -1
|
||
selection(4).total = 6
|
||
selection(4).energy = .5
|
||
selection(5).wep = 5
|
||
selection(5).ifon = -1
|
||
selection(5).total = 8
|
||
selection(5).ammo = 8
|
||
selection(6).wep = 6
|
||
selection(6).ifon = -1
|
||
selection(6).total = 1
|
||
selection(6).ammo = 1
|
||
selection(7).wep = 7
|
||
selection(7).ifon = -1
|
||
selection(7).kind = 1
|
||
selection(8).wep = 8
|
||
selection(8).ifon = -1
|
||
selection(8).kind = 1
|
||
FOR stor% = 0 TO 15
|
||
IF storage(plane, stor%).wep = 0 THEN storage(plane, stor%) = selection(num): EXIT FOR
|
||
NEXT
|
||
END SUB
|
||
|
||
SUB selectmissile (num AS INTEGER, plane AS INTEGER, storage() AS weapon) 'Gives the player missiles that pchk buys, and puts them in storage.
|
||
DIM selection(3) AS weapon
|
||
selection(1).wep = 9
|
||
selection(1).ifon = -1
|
||
selection(1).total = 60
|
||
selection(1).ammo = 10
|
||
selection(2).wep = 10
|
||
selection(2).ifon = -1
|
||
selection(2).total = 60
|
||
selection(2).ammo = 10
|
||
selection(3).wep = 11
|
||
selection(3).ammo = 4
|
||
selection(3).ifon = -1
|
||
selection(3).total = 60
|
||
FOR stor% = 0 TO 15
|
||
IF storage(plane, stor%).wep = selection(num).wep THEN storage(plane, stor%).ammo = storage(plane, stor%).ammo + selection(num).ammo: skip` = -1: EXIT FOR
|
||
NEXT
|
||
IF skip` = 0 THEN
|
||
FOR stor% = 0 TO 15
|
||
IF storage(plane, stor%).wep = 0 THEN storage(plane, stor%) = selection(num): EXIT FOR
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB selectmod (num AS INTEGER, plane AS INTEGER, storage() AS aug) 'Gives the player mods that pchk buys, and puts them in storage.
|
||
DIM selection(4) AS aug
|
||
selection(1).kind = 1
|
||
selection(1).energy = .5
|
||
selection(2).kind = 2
|
||
selection(2).energy = 9
|
||
selection(3).kind = 3
|
||
selection(3).fuel = 180
|
||
selection(3).ammo = 1
|
||
selection(4).kind = 4
|
||
selection(4).ammo = 3
|
||
FOR stor% = 0 TO 15
|
||
IF storage(plane, stor%).kind = selection(num).kind AND selection(num).ammo > 0 THEN storage(plane, stor%).ammo = storage(plane, stor%).ammo + selection(num).ammo: skip% = -1: EXIT FOR
|
||
NEXT
|
||
IF skip% = 0 THEN
|
||
FOR stor% = 0 TO 15
|
||
IF storage(plane, stor%).kind = 0 THEN storage(plane, stor%) = selection(num): EXIT FOR
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB weaponhud (x AS INTEGER, y AS INTEGER, weapons() AS weapon, plane AS INTEGER, wepimage&(), picked%) 'The HUD for the weapons.
|
||
LINE (x + 64, y)-(x + 95, y + 31), _RGB(255, 0, 0), B
|
||
IF picked% = 1 THEN LINE (x + 65, y + 1)-(x + 94, y + 30), _RGB(255, 255, 255), B
|
||
IF weapons(plane, 1).ifon = -1 THEN LINE (x + 66, y + 2)-(x + 93, y + 29), _RGB(127, 0, 0), BF
|
||
_PUTIMAGE (x + 64, y), wepimage&(weapons(plane, 1).wep)
|
||
_PRINTSTRING (x + 64, y), "1"
|
||
LINE (x + 32, y + 16)-(x + 63, y + 47), _RGB(255, 0, 0), B: LINE (x + 96, y + 16)-(x + 127, y + 47), _RGB(255, 0, 0), B
|
||
IF picked% = 2 THEN LINE (x + 33, y + 17)-(x + 62, y + 46), _RGB(255, 255, 255), B: LINE (x + 97, y + 17)-(x + 126, y + 46), _RGB(255, 255, 255), B
|
||
IF weapons(plane, 2).ifon = -1 THEN LINE (x + 34, y + 18)-(x + 61, y + 45), _RGB(127, 0, 0), BF: LINE (x + 98, y + 18)-(x + 125, y + 45), _RGB(127, 0, 0), BF
|
||
_PUTIMAGE (x + 32, y + 16), wepimage&(weapons(plane, 2).wep): _PUTIMAGE (x + 96, y + 16), wepimage&(weapons(plane, 2).wep)
|
||
_PRINTSTRING (x + 32, y + 16), "2": _PRINTSTRING (x + 96, y + 16), "2"
|
||
LINE (x, y + 32)-(x + 31, y + 63), _RGB(255, 0, 0), B: LINE (x + 128, y + 32)-(x + 159, y + 63), _RGB(255, 0, 0), B
|
||
IF picked% = 3 THEN LINE (x + 1, y + 33)-(x + 30, y + 62), _RGB(255, 255, 255), B: LINE (x + 129, y + 33)-(x + 158, y + 62), _RGB(255, 255, 255), B
|
||
IF weapons(plane, 3).ifon = -1 THEN LINE (x + 2, y + 34)-(x + 29, y + 61), _RGB(127, 0, 0), BF: LINE (x + 130, y + 34)-(x + 157, y + 61), _RGB(127, 0, 0), BF
|
||
_PUTIMAGE (x, y + 32), wepimage&(weapons(plane, 3).wep): _PUTIMAGE (x + 128, y + 32), wepimage&(weapons(plane, 3).wep)
|
||
_PRINTSTRING (x, y + 32), "3": _PRINTSTRING (x + 128, y + 32), "3"
|
||
LINE (x + 64, y + 32)-(x + 95, y + 63), _RGB(0, 0, 255), B
|
||
IF picked% = 4 THEN LINE (x + 65, y + 33)-(x + 94, y + 62), _RGB(255, 255, 255), B
|
||
IF weapons(plane, 4).ifon = -1 THEN LINE (x + 66, y + 34)-(x + 93, y + 61), _RGB(0, 0, 127), BF
|
||
_PUTIMAGE (x + 64, y + 32), wepimage&(weapons(plane, 4).wep)
|
||
_PRINTSTRING (x + 64, y + 32), "4"
|
||
_PRINTSTRING (x + 95 - _PRINTWIDTH(LTRIM$(STR$(weapons(plane, 4).ammo))), y + 63 - _FONTHEIGHT), LTRIM$(STR$(weapons(plane, 4).ammo))
|
||
LINE (x + 32, y + 48)-(x + 63, y + 79), _RGB(0, 0, 255), B: LINE (x + 96, y + 48)-(x + 127, y + 79), _RGB(0, 0, 255), B
|
||
IF picked% = 5 THEN LINE (x + 33, y + 49)-(x + 62, y + 78), _RGB(255, 255, 255), B: LINE (x + 97, y + 49)-(x + 126, y + 78), _RGB(255, 255, 255), B
|
||
IF weapons(plane, 5).ifon = -1 THEN LINE (x + 34, y + 50)-(x + 61, y + 77), _RGB(0, 0, 127), BF: LINE (x + 98, y + 50)-(x + 125, y + 77), _RGB(0, 0, 127), BF
|
||
_PUTIMAGE (x + 32, y + 48), wepimage&(weapons(plane, 5).wep): _PUTIMAGE (x + 96, y + 48), wepimage&(weapons(plane, 5).wep)
|
||
_PRINTSTRING (x + 32, y + 48), "5": _PRINTSTRING (x + 96, y + 48), "5"
|
||
_PRINTSTRING (x + 63 - _PRINTWIDTH(LTRIM$(STR$(weapons(plane, 5).ammo))), y + 79 - _FONTHEIGHT), LTRIM$(STR$(weapons(plane, 5).ammo)): _PRINTSTRING (x + 127 - _PRINTWIDTH(LTRIM$(STR$(weapons(plane, 5).ammo))), y + 79 - _FONTHEIGHT), LTRIM$(STR$(weapons(plane, 5).ammo))
|
||
END SUB
|
||
|
||
SUB modhud (x AS INTEGER, y AS INTEGER, mods() AS aug, plane AS INTEGER, modimage&(), picked%) 'The HUD for the mods.
|
||
LINE (x, y)-(x + 31, y + 31), _RGB(0, 255, 0), B
|
||
IF picked% = 6 THEN LINE (x + 1, y + 1)-(x + 30, y + 30), _RGB(255, 255, 255), B
|
||
IF mods(plane, 1).ifon = -1 THEN LINE (x + 2, y + 2)-(x + 29, y + 29), _RGB(0, 127, 0), BF
|
||
_PUTIMAGE (x, y), modimage&(mods(plane, 1).kind)
|
||
_PRINTSTRING (x, y), "6"
|
||
IF mods(plane, 1).ammo > 0 THEN _PRINTSTRING (x + 31 - _PRINTWIDTH(LTRIM$(STR$(mods(plane, 1).ammo))), y + 31 - _FONTHEIGHT), LTRIM$(STR$(mods(plane, 1).ammo))
|
||
LINE (x + 32, y)-(x + 63, y + 31), _RGB(0, 255, 0), B
|
||
IF picked% = 7 THEN LINE (x + 33, y + 1)-(x + 62, y + 30), _RGB(255, 255, 255), B
|
||
IF mods(plane, 2).ifon = -1 THEN LINE (x + 34, y + 2)-(x + 61, y + 29), _RGB(0, 127, 0), BF
|
||
_PUTIMAGE (x + 32, y), modimage&(mods(plane, 2).kind)
|
||
_PRINTSTRING (x + 32, y), "7"
|
||
IF mods(plane, 2).ammo > 0 THEN _PRINTSTRING (x + 63 - _PRINTWIDTH(LTRIM$(STR$(mods(plane, 1).ammo))), y + 31 - _FONTHEIGHT), LTRIM$(STR$(mods(plane, 2).ammo))
|
||
LINE (x + 64, y)-(x + 95, y + 31), _RGB(0, 255, 0), B
|
||
IF picked% = 8 THEN LINE (x + 65, y + 1)-(x + 94, y + 30), _RGB(255, 255, 255), B
|
||
IF mods(plane, 3).ifon = -1 THEN LINE (x + 66, y + 2)-(x + 93, y + 29), _RGB(0, 127, 0), BF
|
||
_PUTIMAGE (x + 64, y), modimage&(mods(plane, 3).kind)
|
||
_PRINTSTRING (x + 64, y), "8"
|
||
IF mods(plane, 3).ammo > 0 THEN _PRINTSTRING (x + 95 - _PRINTWIDTH(LTRIM$(STR$(mods(plane, 1).ammo))), y + 31 - _FONTHEIGHT), LTRIM$(STR$(mods(plane, 3).ammo))
|
||
LINE (x + 96, y)-(x + 127, y + 31), _RGB(0, 255, 0), B
|
||
IF picked% = 9 THEN LINE (x + 97, y + 1)-(x + 126, y + 30), _RGB(255, 255, 255), B
|
||
IF mods(plane, 4).ifon = -1 THEN LINE (x + 98, y + 2)-(x + 125, y + 29), _RGB(0, 127, 0), BF
|
||
_PUTIMAGE (x + 96, y), modimage&(mods(plane, 4).kind)
|
||
_PRINTSTRING (x + 96, y), "9"
|
||
IF mods(plane, 4).ammo > 0 THEN _PRINTSTRING (x + 127 - _PRINTWIDTH(LTRIM$(STR$(mods(plane, 1).ammo))), y + 31 - _FONTHEIGHT), LTRIM$(STR$(mods(plane, 4).ammo))
|
||
END SUB
|
||
|
||
SUB changeweapons (x AS INTEGER, y AS INTEGER, mousex AS INTEGER, mousey AS INTEGER, lclick AS INTEGER, plane AS INTEGER, inmouse AS weapon, weapons() AS weapon, storage() AS weapon) 'Allows the player to change the weapons on board
|
||
DIM switchvar AS weapon
|
||
DIM blankspace AS weapon
|
||
SELECT CASE inmouse.wep
|
||
CASE 0
|
||
IF trigger(x + 64, y, x + 95, y + 31, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 1)
|
||
weapons(plane, 1) = switchvar
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 32, y + 16, x + 63, y + 47, mousex, mousey) OR trigger(x + 96, y + 16, x + 127, y + 47, mousex, mousey) THEN
|
||
IF lclick = -1 AND ignore` = 0 THEN
|
||
FOR look = 0 TO 15
|
||
IF storage(0, look).wep = inmouse.wep THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 2)
|
||
storage(0, look) = weapons(plane, 2)
|
||
weapons(plane, 2) = switchvar
|
||
ignore` = -1
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END IF
|
||
IF trigger(x, y + 32, x + 31, y + 63, mousex, mousey) OR trigger(x + 128, y + 32, x + 159, y + 63, mousex, mousey) THEN
|
||
IF lclick = -1 AND ignore` = 0 THEN
|
||
FOR look = 0 TO 15
|
||
IF storage(0, look).wep = inmouse.wep THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 3)
|
||
storage(0, look) = weapons(plane, 3)
|
||
weapons(plane, 3) = switchvar
|
||
ignore` = -1
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END IF
|
||
IF trigger(x + 64, y + 32, x + 95, y + 63, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 4)
|
||
weapons(plane, 4) = switchvar
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 32, y + 48, x + 63, y + 79, mousex, mousey) OR trigger(x + 96, y + 48, x + 127, y + 79, mousex, mousey) THEN
|
||
IF lclick = -1 AND ignore` = 0 THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 5)
|
||
weapons(plane, 5) = switchvar
|
||
ignore` = -1
|
||
END IF
|
||
END IF
|
||
CASE 1, 2, 3, 4, 5, 6, 7, 8
|
||
IF trigger(x + 64, y, x + 95, y + 31, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 1)
|
||
weapons(plane, 1) = switchvar
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 32, y + 16, x + 63, y + 47, mousex, mousey) OR trigger(x + 96, y + 16, x + 127, y + 47, mousex, mousey) THEN
|
||
IF lclick = -1 AND ignore` = 0 THEN
|
||
FOR look% = 0 TO 15
|
||
IF storage(0, look%).wep = inmouse.wep THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 2)
|
||
storage(0, look%) = weapons(plane, 2)
|
||
weapons(plane, 2) = switchvar
|
||
ignore` = -1
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END IF
|
||
IF trigger(x, y + 32, x + 31, y + 63, mousex, mousey) OR trigger(x + 128, y + 32, x + 159, y + 63, mousex, mousey) THEN
|
||
IF lclick = -1 AND ignore` = 0 THEN
|
||
FOR look% = 0 TO 15
|
||
IF storage(0, look%).wep = inmouse.wep THEN
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 3)
|
||
storage(0, look%) = weapons(plane, 3)
|
||
weapons(plane, 3) = switchvar
|
||
ignore` = -1
|
||
EXIT FOR
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END IF
|
||
CASE 9, 10, 11
|
||
IF trigger(x + 64, y + 32, x + 95, y + 63, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
IF weapons(plane, 4).wep = inmouse.wep THEN
|
||
weapons(plane, 4).ammo = weapons(plane, 4).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
ELSE
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 4)
|
||
weapons(plane, 4) = switchvar
|
||
END IF
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 32, y + 48, x + 63, y + 79, mousex, mousey) OR trigger(x + 96, y + 48, x + 127, y + 79, mousex, mousey) THEN
|
||
IF lclick = -1 AND ignore` = 0 THEN
|
||
IF weapons(plane, 5).wep = inmouse.wep THEN
|
||
weapons(plane, 5).ammo = weapons(plane, 5).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
ELSE
|
||
switchvar = inmouse
|
||
inmouse = weapons(plane, 5)
|
||
weapons(plane, 5) = switchvar
|
||
END IF
|
||
ignore` = -1
|
||
END IF
|
||
END IF
|
||
END SELECT
|
||
END SUB
|
||
|
||
SUB changemods (x AS INTEGER, y AS INTEGER, mousex AS INTEGER, mousey AS INTEGER, lclick AS INTEGER, plane AS INTEGER, inmouse AS aug, mods() AS aug) 'Allows the player to change mods on board.
|
||
DIM switchvar AS aug
|
||
DIM blankspace AS aug
|
||
IF trigger(x, y, x + 31, y + 31, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
IF mods(plane, 1).kind = inmouse.kind AND mods(plane, 1).ammo > 0 THEN
|
||
mods(plane, 1).ammo = mods(plane, 1).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
ELSE
|
||
switchvar = inmouse
|
||
inmouse = mods(plane, 1)
|
||
mods(plane, 1) = switchvar
|
||
END IF
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 32, y, x + 63, y + 31, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
IF mods(plane, 2).kind = inmouse.kind AND mods(plane, 2).ammo > 0 THEN
|
||
mods(plane, 2).ammo = mods(plane, 2).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
ELSE
|
||
switchvar = inmouse
|
||
inmouse = mods(plane, 2)
|
||
mods(plane, 2) = switchvar
|
||
END IF
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 64, y, x + 95, y + 31, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
IF mods(plane, 3).kind = inmouse.kind AND mods(plane, 3).ammo > 0 THEN
|
||
mods(plane, 3).ammo = mods(plane, 3).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
ELSE
|
||
switchvar = inmouse
|
||
inmouse = mods(plane, 3)
|
||
mods(plane, 3) = switchvar
|
||
END IF
|
||
ignore` = -1
|
||
END IF
|
||
IF trigger(x + 96, y, x + 127, y + 31, mousex, mousey) AND lclick = -1 AND ignore` = 0 THEN
|
||
IF mods(plane, 4).kind = inmouse.kind AND mods(plane, 4).ammo > 0 THEN
|
||
mods(plane, 4).ammo = mods(plane, 4).ammo + inmouse.ammo
|
||
inmouse = blankspace
|
||
ELSE
|
||
switchvar = inmouse
|
||
inmouse = mods(plane, 4)
|
||
mods(plane, 4) = switchvar
|
||
END IF
|
||
ignore` = -1
|
||
END IF
|
||
END SUB
|
||
|
||
SUB aiplane (plane AS INTEGER, planes() AS airplane, weapons() AS weapon, difficulty) 'The other planes' AI
|
||
angle = planes(plane).dir
|
||
IF planes(plane).market = 0 THEN
|
||
distx% = planes(planes(plane).lasthit).x - planes(plane).x
|
||
disty% = planes(planes(plane).lasthit).y - planes(plane).y
|
||
totaldist = SQR(distx% ^ 2 + disty% ^ 2)
|
||
IF difficulty = 1 THEN
|
||
newposx% = totaldist / 16 * planes(planes(plane).lasthit).speed * COS(planes(planes(plane).lasthit).dir)
|
||
newposy% = totaldist / 16 * planes(planes(plane).lasthit).speed * SIN(planes(planes(plane).lasthit).dir)
|
||
distx% = distx% + newposx%
|
||
disty% = disty% + newposy%
|
||
planes(plane).force = planes(planes(plane).lasthit).speed + 1 / 256 * (totaldist - 256)
|
||
IF planes(plane).force > 10 THEN planes(plane).force = 10
|
||
IF planes(plane).force < 2 THEN planes(plane).force = 2
|
||
END IF
|
||
IF distx% <> 0 THEN angle2 = ATN(disty% / distx%) ELSE angle2 = 0
|
||
IF distx% < 0 THEN angle2 = angle2 + pi
|
||
IF angle2 < 0 THEN angle2 = angle2 + 2 * pi
|
||
ELSE
|
||
SELECT CASE planes(plane).team
|
||
CASE 0: angle2 = pi
|
||
CASE 1: angle2 = 0
|
||
CASE 2: angle2 = 3 * pi / 2
|
||
CASE 3: angle2 = pi / 2
|
||
END SELECT
|
||
END IF
|
||
IF ABS(angle - angle2) > rad(2) THEN
|
||
IF angle >= pi THEN
|
||
IF angle - angle2 < pi AND angle - angle2 > 0 THEN planes(plane).yaw = planes(plane).yaw - .1 ELSE planes(plane).yaw = planes(plane).yaw + .1
|
||
END IF
|
||
IF angle < pi THEN
|
||
IF angle2 - angle < pi AND angle2 - angle > 0 THEN planes(plane).yaw = planes(plane).yaw + .1 ELSE planes(plane).yaw = planes(plane).yaw - .1
|
||
END IF
|
||
ELSE
|
||
IF planes(plane).market = 0 THEN
|
||
IF totaldist <= swidth / 2 - 100 THEN
|
||
FOR fire% = 1 TO 3
|
||
IF weapons(plane, fire%).ifon = -1 THEN
|
||
IF weapons(plane, fire%).kind = 0 AND weapons(plane, fire%).remaining >= weapons(plane, fire%).total THEN
|
||
IF weapons(plane, fire%).energy > 0 THEN IF planes(plane).battery > weapons(plane, fire%).energy THEN weapons(plane, fire%).firing = 1: weapons(plane, fire%).remaining = 0
|
||
IF weapons(plane, fire%).ammo > 0 THEN IF planes(plane).ammo > 0 THEN weapons(plane, fire%).firing = 1: weapons(plane, fire%).remaining = 0
|
||
END IF
|
||
IF weapons(plane, fire%).kind = 1 AND planes(plane).battery > 1 THEN weapons(plane, fire%).firing = weapons(plane, fire%).firing + 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
IF INT(RND * 180) = 0 THEN
|
||
FOR fire% = 4 TO 5
|
||
IF weapons(plane, fire%).ifon = -1 THEN
|
||
IF weapons(plane, fire%).remaining >= weapons(plane, fire%).total THEN weapons(plane, fire%).firing = 1: weapons(plane, fire%).remaining = 0
|
||
IF fire% = 5 THEN IF weapons(plane, fire%).remaining = weapons(plane, fire%).total / 2 THEN weapons(plane, fire%).firing = 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END IF
|
||
END IF
|
||
IF planes(plane).yaw > ABS(deg(angle - angle2)) / 3 THEN planes(plane).yaw = ABS(deg(angle - angle2)) / 3
|
||
IF planes(plane).yaw < -(ABS(deg(angle - angle2)) / 3) THEN planes(plane).yaw = -(ABS(deg(angle - angle2)) / 3)
|
||
IF planes(plane).yaw > 1 THEN planes(plane).yaw = 1
|
||
IF planes(plane).yaw < -1 THEN planes(plane).yaw = -1
|
||
IF deg(planes(plane).dir) > 359 THEN planes(plane).dir = planes(plane).dir - 2 * pi
|
||
IF deg(planes(plane).dir) < 0 THEN planes(plane).dir = planes(plane).dir + 2 * pi
|
||
END SUB
|
||
|
||
SUB fakephysics (force, speed) '"speed"'s relationship to "force"
|
||
net = force - speed
|
||
speed = speed + net / 500
|
||
END SUB
|
||
|
||
SUB playercontrol (angle, force, yaw, yawcontrol, forcecontrol) 'Allows the player to control pchk's own plane.
|
||
IF gamepad = 0 THEN
|
||
IF ignorethrot` = 0 THEN
|
||
IF _KEYDOWN(119) THEN force = INT(force) + 1: ignorethrot` = -1
|
||
IF _KEYDOWN(115) THEN force = INT(force + .9) - 1: ignorethrot` = -1
|
||
END IF
|
||
IF ignorethrot` = -1 AND NOT _KEYDOWN(119) AND NOT _KEYDOWN(115) THEN ignorethrot` = 0
|
||
IF _KEYDOWN(97) THEN
|
||
yaw = -1
|
||
ELSEIF _KEYDOWN(100) THEN
|
||
yaw = 1
|
||
ELSE
|
||
yaw = 0
|
||
END IF
|
||
ELSE
|
||
force = (-forcecontrol + 1) * 5
|
||
IF force < .5 THEN force = 0
|
||
IF force > 9.5 THEN force = 10
|
||
IF force > 4.5 AND force < 5.5 THEN force = 5
|
||
yaw = yawcontrol
|
||
IF yaw < -.95 THEN yaw = -1
|
||
IF yaw > .95 THEN yaw = 1
|
||
IF yaw > -.05 AND yaw < .05 THEN yaw = 0
|
||
END IF
|
||
IF force < 0 THEN force = 0
|
||
IF force > 10 THEN force = 10
|
||
IF deg(angle) > 359 THEN angle = angle - rad(360)
|
||
IF deg(angle) < 0 THEN angle = angle + rad(360)
|
||
END SUB
|
||
|
||
SUB playerfire (planes() AS airplane, plane AS INTEGER, weapons() AS weapon, primary AS INTEGER, secondary AS INTEGER) 'Allows the player to fire pchk's own weapons.
|
||
IF gamepad = 0 THEN
|
||
DO
|
||
fire1% = _MOUSEBUTTON(1)
|
||
fire2% = _MOUSEBUTTON(2)
|
||
LOOP WHILE _MOUSEINPUT
|
||
ELSE
|
||
fire1% = primary
|
||
fire2% = secondary
|
||
END IF
|
||
IF _KEYDOWN(32) OR fire1% AND ignore` = 0 THEN
|
||
FOR fire% = 1 TO 3
|
||
IF weapons(plane, fire%).ifon = -1 THEN
|
||
IF weapons(plane, fire%).kind = 0 AND weapons(plane, fire%).remaining >= weapons(plane, fire%).total THEN
|
||
IF weapons(plane, fire%).energy > 0 THEN IF planes(plane).battery > 1 THEN weapons(plane, fire%).firing = 1: weapons(plane, fire%).remaining = 0
|
||
IF weapons(plane, fire%).ammo > 0 THEN IF planes(plane).ammo > 0 THEN weapons(plane, fire%).firing = 1: weapons(plane, fire%).remaining = 0
|
||
END IF
|
||
IF weapons(plane, fire%).kind = 1 AND planes(plane).battery > 1 THEN weapons(plane, fire%).firing = weapons(plane, fire%).firing + 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
IF _KEYDOWN(102) OR fire2% THEN
|
||
FOR fire% = 4 TO 5
|
||
IF weapons(plane, fire%).ifon = -1 THEN
|
||
IF weapons(plane, fire%).remaining >= weapons(plane, fire%).total THEN weapons(plane, fire%).firing = 1: weapons(plane, fire%).remaining = 0
|
||
IF fire% = 5 THEN IF weapons(plane, fire%).remaining = weapons(plane, fire%).total / 2 THEN weapons(plane, fire%).firing = 1
|
||
END IF
|
||
NEXT
|
||
END IF
|
||
END SUB
|
||
|
||
SUB toggle (num%, change%, ignoretog%) 'Toggles weapons and mods. "num" is the weapon/mod's place (1-3 for primary weapons, 4-5 for missiles, 6-9 for mods). "change" is "*.ifon". "ignoretog" is like clickonce for toggling.
|
||
IF _KEYDOWN(num% + 48) AND ignoretog% = 0 THEN
|
||
IF change% = 0 THEN change% = -1 ELSE change% = 0
|
||
ignoretog% = -1
|
||
END IF
|
||
END SUB
|
||
|
||
SUB togglecontrol (plane AS INTEGER, weapons() AS weapon, mods() AS aug, ignoretog%, picked%, pick) 'Allows the player to toggle things.
|
||
FOR k% = 1 TO 5
|
||
toggle k%, weapons(plane, k%).ifon, ignoretog%
|
||
NEXT
|
||
FOR l% = 6 TO 9
|
||
toggle l%, mods(plane, l% - 5).ifon, ignoretog%
|
||
NEXT
|
||
IF gamepad <> 0 THEN
|
||
IF picked% >= 1 AND picked% <= 5 AND ABS(pick) >= .5 AND ignoretog% = 0 THEN
|
||
IF weapons(plane, picked%).ifon = 0 THEN weapons(plane, picked%).ifon = -1 ELSE weapons(plane, picked%).ifon = 0
|
||
ignoretog% = -1
|
||
END IF
|
||
IF picked% >= 6 AND picked% <= 9 AND ABS(pick) >= .5 AND ignoretog% = 0 THEN
|
||
IF mods(plane, picked% - 5).ifon = 0 THEN mods(plane, picked% - 5).ifon = -1 ELSE mods(plane, picked% - 5).ifon = 0
|
||
ignoretog% = -1
|
||
END IF
|
||
END IF
|
||
END SUB
|
||
|
||
SUB hudbar (slot AS INTEGER, title$, display, limit, barcolor~&, suffix$, quartz&) 'The simple meter, used for PWR, GEN, etc.
|
||
'slot: distance from the top (16 + 32 * slot)
|
||
'title: three char title
|
||
'display: amount of whatever you are measuring
|
||
'limit: the upper limit of whatever you are measuring should be
|
||
'barcolor: the color of the meter (dark color recomended)
|
||
'suffix: the unit you are using (usually "%")
|
||
'quartz: the font
|
||
IF display < limit THEN LINE (swidth - 167, 16 + 32 * slot + 1)-(swidth - 167 + display / limit * 100, 16 + 32 * slot + 14), barcolor~&, BF ELSE LINE (swidth - 167, 16 + 32 * slot + 1)-(swidth - 67, 16 + 32 * slot + 14), barcolor~&, BF
|
||
LINE (swidth - 168, 16 + 32 * slot)-(swidth - 66, 16 + 32 * slot + 15), _RGB(255, 255, 255), B
|
||
IF LEN(title$) > 3 THEN title$ = LEFT$(title$, 3)
|
||
_FONT quartz&
|
||
IF display >= limit + 1 THEN COLOR _RGB(255, 127, 0)
|
||
_PRINTSTRING (swidth - 200, 16 + 32 * slot), title$ + " " + LTRIM$(STR$(INT(display + .5))) + suffix$
|
||
COLOR _RGB(255, 255, 255)
|
||
_FONT 16
|
||
END SUB
|
||
|
||
SUB rotator (originx AS INTEGER, originy AS INTEGER, angle, image&, minx%, miny%, maxx%, maxy%, size) 'Makes images that can rotate.
|
||
DIM rotx(3), roty(3)
|
||
dist = SQR(((size / 2) ^ 2) + ((size / 2) ^ 2))
|
||
rotx(0) = originx + COS(angle + rad(45)) * dist - 1: rotx(1) = originx + COS(angle + rad(135)) * dist - 1: rotx(2) = originx + COS(angle + rad(225)) * dist: rotx(3) = originx + COS(angle + rad(315)) * dist
|
||
roty(0) = originy + SIN(angle + rad(45)) * dist: roty(1) = originy + SIN(angle + rad(135)) * dist - 1: roty(2) = originy + SIN(angle + rad(225)) * dist - 1: roty(3) = originy + SIN(angle + rad(315)) * dist
|
||
_MAPTRIANGLE (minx%, miny%)-(minx%, maxy%)-(maxx%, maxy%), image& TO(rotx(3), roty(3))-(rotx(2), roty(2))-(rotx(1), roty(1))
|
||
_MAPTRIANGLE _SEAMLESS(minx%, miny%)-(maxx%, miny%)-(maxx%, maxy%), image& TO(rotx(3), roty(3))-(rotx(0), roty(0))-(rotx(1), roty(1))
|
||
END SUB
|
||
|
||
FUNCTION getfact$
|
||
DIM facts$(7)
|
||
'facts$(0) = "The airplane in this game is losely based on the Lockheed-Martin F-35 Lightning II and the General Dynamics F-16 Fighting Falcon, the major difference being the means of propultion."
|
||
'facts$(1) = "The premise for 'Electric' was conceived when I discovered this tidbit of information about Lt. Surge from 'Pokemon: Fire Red': 'Lt. Surge is rumored to have been a pilot while home in America. He used the electricity generated by Pok<6F>mon to power his plane.' Having said that, the generators in 'Electric' are just normal generators."
|
||
'facts$(2) = "'Descent II' by Parallax had a significant influence on 'Electric', which is ironic because 'Electric' has nothing to do with space."
|
||
facts$(0) = "In most of the code, " + CHR$(34) + "laser" + CHR$(34) + " is misspelled " + CHR$(34) + "lazer." + CHR$(34)
|
||
facts$(1) = "Change 'Planes per Team' to 2 or more. Shoot your AI helper. Look in the top left corner of the screen. It only appears for 1/60 of a second."
|
||
facts$(2) = "'Electric v0.1:0001' was just a white triangle that pointed toward the mouse in the center of an 800x600 window."
|
||
facts$(3) = "There are only 4 fun facts, including this one."
|
||
'facts$(6) = "Some of these facts won't make it into the final product due to issues with using the words 'pokemon' and 'Descent II'."
|
||
getfact$ = facts$(INT(RND * 4))
|
||
END FUNCTION
|