Now ignoring electricconfig.cfg because it needs to be unique for everyone Moved config to its own folder Moved fonts to thier own folder More similar changes are to come. 1.1 is intended to be built with QB64 1.1. Signed-off-by: Daniel Marsee <rdmarsee@gmail.com>
3115 lines
143 KiB
QBasic
3115 lines
143 KiB
QBasic
CONST versionvrsn = "v1.1:0002-indev" 'Update this each build!
|
||
|
||
_TITLE "Electric"
|
||
DIM SHARED ignore`, ignorethrot`, swidth, sheight, xoffset%, yoffset%, graphsetting, gamepad, screenanchorx%, screenanchory%
|
||
OPEN "cfg\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("fonts\segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("fonts\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("menu_music.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), versionvrsn
|
||
IF menu(4) THEN
|
||
IF _SNDPLAYING(menumusic&) THEN _SNDSTOP menumusic&
|
||
env
|
||
IF menumusic& THEN _SNDPLAY menumusic&
|
||
END IF
|
||
IF menu(5) THEN
|
||
options
|
||
OPEN "cfg\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("fonts\segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("fonts\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("fonts\segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("fonts\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 "N/A", 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 "cfg\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("fonts\segment14.otf", 16)
|
||
bigquartz& = _LOADFONT("fonts\segment14.otf", 32)
|
||
cyberbit& = _LOADFONT("fonts\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 "cfg\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("fonts\segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("fonts\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("fonts\segment14.otf", sheight / 24, "")
|
||
cyberbit& = _LOADFONT("fonts\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("fonsts\segment14.otf", sheight / 16, "")
|
||
cyberbit& = _LOADFONT("fonts\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("fonts\segment14.otf", sheight / 16, "")
|
||
cyberbit& = _LOADFONT("fonts\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
|