diff options
| author | Chris Bradley <1029chris@gmail.com> | 2022-02-19 23:38:27 -0800 |
|---|---|---|
| committer | Chris Bradley <1029chris@gmail.com> | 2022-02-19 23:38:27 -0800 |
| commit | 60ad56210bcf4ace33a1474bf57d6091e66e2e79 (patch) | |
| tree | bddf9aa5e90c993e5bbdab716bc744d1f6c7a408 | |
| parent | 395ffd247492b0708b6290824ae61af8fccc1869 (diff) | |
final boss stuff, and token hunting. what else is new? lots of tweaks too
the now constant hunt for tokens continues, good thing we're almost done
| -rw-r--r-- | bullets.lua | 3 | ||||
| -rw-r--r-- | draw.lua | 6 | ||||
| -rw-r--r-- | enemies.lua | 75 | ||||
| -rw-r--r-- | objects.lua | 15 | ||||
| -rw-r--r-- | particles.lua | 5 | ||||
| -rw-r--r-- | pickups.lua | 2 | ||||
| -rw-r--r-- | update.lua | 12 | ||||
| -rw-r--r-- | waves.lua | 51 |
8 files changed, 87 insertions, 82 deletions
diff --git a/bullets.lua b/bullets.lua index 715a1ee..c5cf2c7 100644 --- a/bullets.lua +++ b/bullets.lua @@ -141,6 +141,9 @@ function addmissile(x, y, target) --basic small weak enemy enemymisc(enemy) if enemy.health <= 0 then -- die!!!!! enemydie(enemy,17,2,17) + if currentwave == 19 then + sfx(14,-2) + end end end @@ -39,11 +39,11 @@ if not gamerunning or menuscroll < 1 then for i = 1, 3, 1 do spr(14+i*16, (-menushipscroll*(i*20)+(sin(i/3)*128)+8)%(128+8)-1*8-menuscroll*240, i*36+sin(menushipscroll*i/3)*i*2-20-menuscroll*50,1,1) end - + local x = 24-menuscroll*120 if t() < 1 then - drawlogo(24-menuscroll*120,19.5+sin(0.25+t()*0.5)*6.5) + drawlogo(x,19.5+sin(0.25+t()*0.5)*6.5) else - drawlogo(24-menuscroll*120,26) + drawlogo(x,26) end --main screen items diff --git a/enemies.lua b/enemies.lua index 942ab65..0874647 100644 --- a/enemies.lua +++ b/enemies.lua @@ -1,5 +1,5 @@ enemies = {} -canshootatx = 126 +canshootatx = 126 --the point on screen when they can start shooting. this needs to be a thing for the final boss portal function killallenemies() for i = 1, #enemies, 1 do enemies[i].health = -1 @@ -26,21 +26,22 @@ function enemycollide(enemy, object) --f this enemy collides with something, do end end -function enemydie(enemy, sound, soundchannel, points, isboss) +function enemydie(enemy, sound, soundchannel, points, isboss, drop) + --the drop option is a stupid hack, only the final boss gets to use it. if enemy.health < 1 then --no health? die. local x,y = enemy.x,enemy.y for i = 1, rnd(enemy.h)+6, 1 do addcircle(x+rnd(enemy.w), y+rnd(enemy.h), rnd(4)-2, -rnd(2)-1, 1, 2, rnd({3, 11, 9}), -0.1) end - if rnd(100) < sqrt(enemy.w*enemy.h)/1.5 then --you get a better chance of a randomly dropped health from bigger enemies + if rnd(100) < sqrt(enemy.w*enemy.h)/1.5 and not drop then --you get a better chance of a randomly dropped health from bigger enemies addpickup(x+rnd(enemy.w), y+rnd(enemy.h), "health") end if isboss then - music(-1, 3000) + playsong(-1, 3000) sfx(60,-2) --stop missle sound, less tokens to just have it here. despawnallbullets = true killallenemies() - if not gameover then + if not gameover and not drop then addpickup(x+rnd(32), y+rnd(32)) addpickup(x+rnd(32), y+rnd(32), "health") end @@ -245,10 +246,11 @@ function addtargetingenemy(x, y, speed) enemy.x -= speed if enemy.shootcooldown < 0 and currentwavetime%1.5>1.2 then enemy.shootcooldown = 0.1 - if enemy.x < canshootatx and players[targetplayer].x < enemy.x+30 then --math involving a distance check to get the proper velocity for aiming - local distancetarget = sqrt((players[targetplayer].x - enemy.x)^2+(players[targetplayer].y - enemy.y)^2) - local velxtarget = (players[targetplayer].x - enemy.x)/distancetarget - local velytarget = (players[targetplayer].y - enemy.y)/distancetarget + local player = players[targetplayer] + if enemy.x < canshootatx and player.x < enemy.x+30 then --math involving a distance check to get the proper velocity for aiming + local distancetarget = sqrt((player.x - enemy.x)^2+(player.y - enemy.y)^2) + local velxtarget = (player.x - enemy.x)/distancetarget + local velytarget = (player.y - enemy.y)/distancetarget addbullet(enemy.x-3, enemy.y, velxtarget, velytarget) -- shoot if on screen sfx(15, 2) -- play shoot sound if on screen end @@ -355,7 +357,7 @@ function addwallboss(x, y, length, points, speed, stay, move, isboss) } bulletfired = {} enemy.starthealth = enemy.health - if isboss then enemy.health *= 3 end -- triple health if the boss + if isboss then enemy.health *= 4 end -- triple health if the boss for i = 1, length, 1 do bulletfired[i] = 0 @@ -534,7 +536,7 @@ function addmissileboss(x, y) --boss that shoots missiles!!! elseif currentwavetime%18 > 17.3 then --INTIMIDATION TACTICS!!!!! enemy.targety = players[targetplayer].y enemy.targetx = players[targetplayer].x+24 - enemy.shootcooldown = 0.4 + enemy.shootcooldown = 0.8 end enemy.x = lerp(enemy.x, enemy.targetx, enemy.speed) enemy.y = lerp(enemy.y, enemy.targety, enemy.speed) @@ -544,7 +546,7 @@ function addmissileboss(x, y) --boss that shoots missiles!!! enemy.targety = rnd(96) end if enemy.shootcooldown < 0 then - enemy.shootcooldown = 0.3 + rnd(1.2) + enemy.shootcooldown = 0.6 + rnd(0.5) if enemy.x < canshootatx and players[targetplayer] ~= nil then local offsetmissleboss = 2 if currentwavetime%2 > 1 then offsetmissleboss = 30 end @@ -567,19 +569,20 @@ end function addfinalboss() --THE FINAL BOSS!!!!!!! WOOOAAAHHHHHH!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! local enemy = { x = 150, - y = 10, + y = 30, w = 32, - h = 120, + h = 66, inv = -1, health = 200*#players, --200 shootcooldown = 4, shot = enemyshot, collide = enemycollide, - speed = 1.5, - amount = 3, } dramaticdeathtimer = 6 thrusterexplode = {} + portaldestabilize = 0 + speed = 1.5 + amount = 3 --thrusters that each fall off once the portal's health is 1/5th depleated function addportalthruster(x,y,id,isflipped) @@ -591,32 +594,33 @@ function addfinalboss() --THE FINAL BOSS!!!!!!! WOOOAAAHHHHHH!!!!!!!!!!!!!!!!!!! if thrusterhealth > enemy.health - 20 then spritethruster += 32 end - if (enemy.inv < 0 or flashtime) or thrusterhealth < enemy.health-50 then - spr(spritethruster, x, isflipped*(sin(time()*enemy.speed)*3.5)+y, 4, 2) - end + spr(spritethruster, x, isflipped*(sin(time()*speed)*3.5)+y, 4, 2) elseif rnd() < 0.4 then addcircle(x+20+rnd(4), y+rnd(6), -0.5, rnd(0.5)-0.25, rnd(7), 1.4, rnd({5,9})) if not thrusterexplode[id] then thrusterexplode[id] = true explosion(x+10,y,32) shake = 12 + sfx(21,3) end end end function enemy:draw() - -- portal - local x,y,speed,amount = enemy.x-8,10+sin(time()*enemy.speed+0.2)*2,enemy.speed,enemy.amount - local ovaly1 = (sin(time()*speed-0.12)*amount/2)+y+24 - --local ovaly2 = (-sin(time()*speed-0.12)*amount/2)+y+84 - local ovaly2 = -ovaly1+128 - ovalfill(x+28,ovaly1,x+6,ovaly2,14) - local portalcolors = {11,3} - for i = 1, 260, 1 do --cool swirling portal effect - pset(x+17+sin(i/53.3465+t()/8)*i/24+sin(i/350.23548+t()), y+54+cos(i/53.3465+t()/8)*i/9,portalcolors[(ceil(i/20))%#portalcolors+1]) - end - addcircle(x+17, y+54, rnd(0.5)-0.25, rnd(1)-0.5, 5, 2, 11) - oval(x+28,ovaly1,x+6,ovaly2,11) + local x,y = enemy.x-8,10+sin(time()*speed+0.2)*2 + if flashtime or enemy.inv < 0 or enemy.health == 0 then + -- portal + local ovaly1 = (sin(time()*speed-0.12)*amount/2)+y+24+portaldestabilize + --local ovaly2 = (-sin(time()*speed-0.12)*amount/2)+y+84 + local ovaly2 = -ovaly1+128-portaldestabilize + ovalfill(x+28,ovaly1,x+6,ovaly2,14) + local portalcolors = {11,3} + for i = 1, 260, 1 do --cool swirling portal effect + pset(x+17+sin(i/53.3465+t()/8)*i/24+sin(i/350.23548+t())*portaldestabilize, y+54+cos(i/53.3465+t()/8)*i/9,portalcolors[(ceil(i/20))%#portalcolors+1]) + end + addcircle(x+17, y+54, rnd(0.5)-0.25, rnd(1)-0.5, 5, 2, 11) + oval(x+28,ovaly1,x+6,ovaly2,11) + end addportalthruster(x-19,y-4,3) addportalthruster(x-19,y+97,4,-1) local spriteportal = 136 @@ -637,6 +641,7 @@ function addfinalboss() --THE FINAL BOSS!!!!!!! WOOOAAAHHHHHH!!!!!!!!!!!!!!!!!!! for i = 1, 10, 1 do addbullet(110,64, rnd(0.5)-1, rnd(2)-1) end + sfx(19,3) --sound for barrage of bullets if rnd() < 0.4 then addmissile(110, 60, targetplayer) end @@ -675,12 +680,14 @@ function addfinalboss() --THE FINAL BOSS!!!!!!! WOOOAAAHHHHHH!!!!!!!!!!!!!!!!!!! moves[flr((currentwavetime/14)%#moves+1)]() end end - enemydie(enemy,17,2,1000,true) --die!!!!!!! + enemydie(enemy,17,2,1000,true,1) --die!!!!!!! else - music(-1) + playsong(-1) killallenemies() despawnallbullets = true - enemy.speed += 0.002 + speed += 0.0003 + amount += 0.02 + portaldestabilize += 0.05 dramaticdeathtimer -= ft if enemy.shootcooldown < 0 then enemy.shootcooldown = dramaticdeathtimer/8 diff --git a/objects.lua b/objects.lua index 84c248c..e216b46 100644 --- a/objects.lua +++ b/objects.lua @@ -1,5 +1,5 @@ obj = {} -gt = 0 -- game time +gt = 0 -- game time, but not actually, this is only used by the background for scrolling. ft = 1/60 --frametime scrollspeed = 0 respawntimer = 0 @@ -13,13 +13,12 @@ cartdata("toxicinvaders_bychrisandribbon") highscore0 = dget(0) --scores (0 is solo - 1 is coop) highscore1 = dget(1) currentscore = 0 --used for both gamemodes, but passed into highscore at end of game +currentsong = -1 function startgame() - music(0, 0, 3) - wave[currentwave].start() + setwave(currentwave) gamerunning = true - -- print(gt,10,10) end function updateobjs() @@ -38,4 +37,12 @@ end function lerp(start, destination, amount) return start + amount * (destination - start); +end + +function playsong(song, fade) + fade = fade or 0 + if song ~= currentsong then + music(song, fade, 3) + currentsong = song + end end
\ No newline at end of file diff --git a/particles.lua b/particles.lua index a07f95f..7d88045 100644 --- a/particles.lua +++ b/particles.lua @@ -19,12 +19,11 @@ function addcircle(x, y, velx, vely, r, time, color, grav) end end - add(obj, circle) + add(obj, circle, 1) end function explosion(x,y, w, h) - w = w or 8 - h = h or w + w,h = w or 8,h or w for i = 1, w/2, 1 do addcircle(x+rnd(w), y+rnd(h), -0.5, 0, rnd(8), rnd(1.5)+1, 5) end diff --git a/pickups.lua b/pickups.lua index 0f21f26..40d1b75 100644 --- a/pickups.lua +++ b/pickups.lua @@ -43,7 +43,7 @@ function addpickup(x, y, type) pickupcolor = 12 elseif type == "3shoot" then player.shoot3 = true - player.shootspeed = 0.35 + player.shootspeed = 0.4 pickupcolor = 9 else player.health = 3 @@ -1,4 +1,3 @@ ---scrolling and respawn stuff respawntimer -= ft --similar math elements grouped to lower tokens flashtime = ceil(t()*10%2) == 1 --for flashing elements (ship, score) @@ -7,6 +6,7 @@ circletimey = cos(t())*3 screenshakex = sin(shake+t())*shake screenshakey = sin(shake+gt/2.1)*shake +--stuff for scrolling background and respawning if gameover then scrollspeed = lerp(scrollspeed, -1/22, 0.01) -- scroll backwards currentscore = 0 --depleats score @@ -19,18 +19,21 @@ if gameover then elseif gamerunning then updatewaves() -- update the wave function local targetspeed = ft - if bossmusic then + if currentsong >= 8 then targetspeed /= 2 --half scroll speed when boss + elseif currentwave == 20 then + targetspeed /= 8 end scrollspeed = lerp(scrollspeed, targetspeed, 0.03) end gt += scrollspeed + 1/600 +--stuff for starting or ending the game if currentwave == 20 then --ending screen if btn(4) and btn(5) and not isoutro then --press both buttons to reset cart acidcounter = 2 isoutro = true - music(-1, 2000) --fades music + playsong(-1, 2000) --fades music end elseif not gamerunning and t() > 1 then --main menu if btn(4) then @@ -44,9 +47,10 @@ elseif not gamerunning and t() > 1 then --main menu end end +--updating objects if gamerunning or t() < 1.95 then -- weird if because of freezing bubbles in the menu updateobjs() --update all objects - if currentscore > 9999 then currentscore = 9999 elseif currentscore < 0 then currentscore = 0 end --attempts to avoid hitting the OOM error or being negative + currentscore = mid(0,currentscore,9999) --attempts to avoid hitting the OOM error or being negative end --screenshake math @@ -4,7 +4,6 @@ currentwavetime = 0 delaytimer = 0 everysecondtimer = 0 checkpoint = 1 -bossmusic = false targetplayer = 1 --NOTE - slow BG during boss waves / make bosses their own checkpoint @@ -102,7 +101,7 @@ wave[6] = { if #enemies < 1 then checkpoint = currentwave+1 return true end end, - boss = true + song = 8 } wave[7] = { @@ -170,13 +169,13 @@ wave[11] = { } wave[12] = { - delay = 2, + delay = 3, start = function() addwallboss(128,4,15,225,0.05,true,false,true) end, everysecond = wave[6].everysecond, conditions = wave[6].conditions, - boss = true + song = 8 } wave[13] = { @@ -220,7 +219,7 @@ wave[16] = { addwallboss(128, 70, 7, 30, 0.05, false, 3, false) end, everysecond = function () - if flr(currentwavetime%6) == 5 and currentwavetime < 20 then + if flr(currentwavetime%6) == 5 and currentwavetime < 18 then local ylaserpos = 16 if players[targetplayer].y > 64 then ylaserpos = 80 @@ -237,11 +236,12 @@ wave[17] = { if currentwavetime%5 > 4 and currentwavetime < 20 then addbomb(128,20+currentwavetime*2,0) end - if currentwavetime > 18 and not bossmusic then - music(8, 0, 3) - bossmusic = true + if currentwavetime > 18 then + playsong(8) + end + if rnd() < 0.3 then + addbasicenemy(128,rnd(100)+14,0.4+rnd(0.4)) end - addbasicenemy(128,rnd(100)+14,0.4+rnd(0.4)) end, conditions = function() if currentwavetime > 24 then return true @@ -255,9 +255,8 @@ wave[18] = { killallenemies() addmissileboss(128, 0) end, - everysecond = wave[6].everysecond, conditions = wave[6].conditions, - boss = true + song = 8 } wave[19] = { @@ -266,12 +265,12 @@ wave[19] = { canshootatx = 110 addfinalboss() end, - boss = true + song = 8 } --ending score screen wave[20] = { - delay = 3, + delay = 4, start = function() if not coopmode and highscore0 < currentscore then dset(0, currentscore) --set singleplayer score @@ -296,34 +295,20 @@ function updatewaves() end end if wave[currentwave].conditions() then - if wave[currentwave+1].boss and not bossmusic then - bossmusic = true - music(8,0,3) + if wave[currentwave+1].song then + playsong(wave[currentwave+1].song) end delaytimer += ft if delaytimer > wave[currentwave+1].delay then - everysecondtimer = 0 - currentwave += 1 - if not wave[currentwave].boss and bossmusic then - music(2,0,3) - bossmusic = false - end - currentwavetime = 0 - delaytimer = 0 - -- currentwave = (currentwave - 1) % #wave+1 --temporarily looping the waves - -- if currentwave < checkpoint then - -- checkpoint = 1 - -- end - wave[currentwave].start() + setwave(currentwave+1) end end end function setwave(num) - everysecondtimer = 0 currentwave = num - currentwavetime = 0 - delaytimer = 0 + everysecondtimer,currentwavetime,delaytimer = 0,0,0 wave[currentwave].start() - music(2, 0, 3) + local song = wave[currentwave].song or 0 + playsong(song) end
\ No newline at end of file |
