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