diff options
| -rw-r--r-- | background.lua | 68 | ||||
| -rw-r--r-- | draw.lua | 99 | ||||
| -rw-r--r-- | enemies.lua | 6 | ||||
| -rw-r--r-- | objects.lua | 11 | ||||
| -rw-r--r-- | pickups.lua | 4 | ||||
| -rw-r--r-- | players.lua | 77 | ||||
| -rw-r--r-- | ui.lua | 85 | ||||
| -rw-r--r-- | update.lua | 39 | ||||
| -rw-r--r-- | waves.lua | 15 |
9 files changed, 259 insertions, 145 deletions
diff --git a/background.lua b/background.lua index c989107..bd1febe 100644 --- a/background.lua +++ b/background.lua @@ -1,49 +1,49 @@ -bgcircles = {} +-- bgcircles = {} function scrollingcircles(y, speed, spacing, radius, color) for i = 1, 256, spacing do - circfill((i-(t()*speed))%256-radius*2, y, radius, color) + circfill((i-(gt*speed))%256-radius*2, y, radius, color) end end function scrollingcirclelines(y, speed, spacing, radius, color) for i = 1, 256, spacing do - circ((i-(t()*speed))%256-radius*2, y, radius, color) + circ((i-(gt*speed))%256-radius*2, y, radius, color) end end function scrollingsprite(sprite,x,y,w,h,speed,flip) flip = flip or false - spr(sprite, (-t()*speed+x+w*8)%(128+w*8)-w*8, y, w, h, flip) + spr(sprite, (-gt*speed+x+w*8)%(128+w*8)-w*8, y, w, h, flip) end -function addbgcircle(x, y, velx, r, color, pos) - local circle = {} - circle.x = x - circle.y = y - circle.velx = velx - circle.r = r - circle.color = color +-- function addbgcircle(x, y, velx, r, color, pos) +-- local circle = {} +-- circle.x = x +-- circle.y = y +-- circle.velx = velx +-- circle.r = r +-- circle.color = color - function circle.draw(circle) - circle.x += circle.velx +-- function circle.draw(circle) +-- circle.x += circle.velx - if circle.x < 0 - circle.r * 2 then - del(bgcircles, circle) - end - circfill(circle.x,circle.y,circle.r,circle.color) - end - add(bgcircles,circle, pos) -end +-- if circle.x < 0 - circle.r * 2 then +-- del(bgcircles, circle) +-- end +-- circfill(circle.x,circle.y,circle.r,circle.color) +-- end +-- add(bgcircles,circle, pos) +-- end function drawbg() cls(0) - camera((sin(shake+t())*shake)/3, (sin(shake+t()/2.1)*shake)/3) + camera((sin(shake+t())*shake)/3, (sin(shake+gt/2.1)*shake)/3) --stars for i = 1, 64, 1 do - pset((((-t()*0.1)+i*4.3824)*(i/32))%128, sin(i*0.536382)*64+64, 4) + pset((((-gt*0.1)+i*4.3824)*(i/32))%128, sin(i*0.536382)*64+64, 4) end --galaxies @@ -53,15 +53,15 @@ function drawbg() --ringed planet palt(0,false) - spr(194,160-t(),50,4,2) - spr(199,200-t(),50,2,2) - spr(214,192-t(),58,1,1) - spr(201,160-t(),66,6,2) - spr(207,208-t(),66,1,1) - spr(234,152-t(),82,1,1) - spr(236,168-t(),82,3,1) - spr(250,152-t(),90,4,1) - spr(223,192-t(),82,1,1) + spr(194,160-gt,50,4,2) + spr(199,200-gt,50,2,2) + spr(214,192-gt,58,1,1) + spr(201,160-gt,66,6,2) + spr(207,208-gt,66,1,1) + spr(234,152-gt,82,1,1) + spr(236,168-gt,82,3,1) + spr(250,152-gt,90,4,1) + spr(223,192-gt,82,1,1) palt(0,true) --clouds @@ -88,7 +88,7 @@ function drawbg() scrollingcircles(-12, 40, 25, 20, 4) - camera((sin(shake+t())*shake)/2, (sin(shake+t()/2.1)*shake)/2) + camera((sin(shake+t())*shake)/2, (sin(shake+gt/2.1)*shake)/2) --landscape scrollingcirclelines(125, 72, 25, 20, 8) scrollingcircles(126, 72, 25, 20, 2) @@ -99,7 +99,7 @@ function drawbg() line(0, 117, 128, 117, 8) rectfill(0,119,128,128,8) for i = 1, 32, 1 do - line(((-t()+i*2.5)*80)%128, 111, ((-t()+i*2.5)*80)%128*1.2-12.8, 125, 2) + line(((-gt+i*2.5)*80)%128, 111, ((-gt+i*2.5)*80)%128*1.2-12.8, 125, 2) end --pine trees scrollingsprite(231,10,78+16,1,2,72,true) @@ -132,7 +132,7 @@ function drawbg() scrollingsprite(192,102,90,2,4,90) scrollingsprite(192,137,92,2,4,90) - camera(sin(shake+t())*shake, sin(shake+t()/2.1)*shake) + camera(sin(shake+t())*shake, sin(shake+gt/2.1)*shake) scrollingcirclelines(150, 100, 30, 32, 8) scrollingcircles(151, 100, 30, 32, 2) end
\ No newline at end of file @@ -13,83 +13,30 @@ pal(0,130,1) drawbg() drawobjs() --- print(#obj) -function drawlogo(x,y) - --default values - -- x = 24 - -- y = 26 - - --this is a horrible way to draw the logo, but I'm doing it anyways. x3 - -- muahahahahahahaha!!!!!! - sspr(0,24,16,8,x-1,y+2,32,16) --to - sspr(16,24,8,8,x+53,y+2,16,16) --ic - sspr(0,24,16,8,x-1,y+1,32,16) --to - sspr(16,24,8,8,x+53,y+1,16,16) --ic - --X - sspr(24,24,8,8,x+26,y-6,16,16) - sspr(24,24,8,8,x+42,y-6,16,16,true) - sspr(32,24,8,8,x+26,y+10,16,16, true) - sspr(32,24,8,8,x+42,y+10,16,16) - --X - sspr(24,24,8,8,x+26,y-8,16,16) - sspr(24,24,8,8,x+42,y-8,16,16,true) - sspr(32,24,8,8,x+26,y+8,16,16, true) - sspr(32,24,8,8,x+42,y+8,16,16) - --font - local text = "i n v a d e r s" - print(text, x+10, y+21, 3) - print(text, x+10, y+19, 3) - print(text, x+11, y+20, 3) - print(text, x+9, y+20, 3) - print(text, x+9, y+21, 3) - print(text, x+11, y+21, 3) - print(text, x+9, y+19, 3) - print(text, x+11, y+19, 3) - print(text, x+11, y+21, 3) - print(text, x+9, y+22, 3) - print(text, x+11, y+22, 3) - print(text, x+10, y+22, 3) - print(text, x+10, y+20, 14) - clip(x+10, y+20, 60, 3) - print(text, x+10, y+20, 11) - clip() +if gamerunning then + if gameover then --gameover timer, it does a cute spinny! + print(ceil(respawntimer), 62+sin(t())*3,61+cos(t())*3, 4) + print(ceil(respawntimer), 62+sin(t())*3,60+cos(t())*3, 7) + elseif players[1].health <=0 then + print(ceil(players[1].inv), players[1].x+sin(t())*3, players[1].y+cos(t())*3+1, 4) + print(ceil(players[1].inv), players[1].x+sin(t())*3, players[1].y+cos(t())*3, 12) + elseif #players > 1 and players[2].health <=0 then + print(ceil(players[2].inv), players[2].x+sin(t())*3, players[2].y+cos(t())*3+1, 4) + print(ceil(players[2].inv), players[2].x+sin(t())*3, players[2].y+cos(t())*3, 9) + end end - -function mainmenutext(x,y) - -- default values - -- x = 24 - -- y = 62 - - spr(17,x+2,y+4,1,1) --blue ship - spr(33,x+2,y+16,1,1) --orange ship - print("(A) - Lone Wolf", x+15,y+7,5) - print("(A) - Lone Wolf", x+15,y+6,6) - print("(B) - Companion", x+15,y+18,5) - print("(B) - Companion", x+15,y+17,6) +if not gamerunning or gt < 1 then + for i = 1, 3, 1 do + spr(basicenemysprites[i%#basicenemysprites+1], (-t()*(i*20)+(sin(i/3+t()/100)*128)+1*8)%(128+1*8)-1*8-gt*180, i*36+sin(t()*i/3)*i*2-20,1,1) + end + if t() < 0.68 then + drawlogo(24-gt*120,sin(0.25+t()*0.75)*26) + else + drawlogo(24-gt*120,26) + end + mainmenutext(24-gt*150,62) + credits(10-gt*140,100) end -function credits(x,y) - -- default vaues - -- x = 10 - -- y = 100 - - palt(2,true) - palt(0,false) - spr(53,x-5,y+6,1,1) --duck - pset(x+3,y+10,13) --extra dot for glasses - spr(54,x+104,y+6,1,1) --bot - palt(2,false) - palt(0,true) - print("1029chris ribboncable", x+9,y+6,0) - print("1029chris ribboncable", x+9,y+5,9) - print("code/tunes art/sounds", x+8,y+13,0) - print("code/tunes art/sounds", x+8,y+12,9) - print("made in vancouver - 2022", x+6,y+22,0) - print("made in vancouver - 2022", x+6,y+21,4) -end - - --- drawlogo(24,26) --- mainmenutext(24,62) --- credits(10,100)
\ No newline at end of file +-- print(#obj)
\ No newline at end of file diff --git a/enemies.lua b/enemies.lua index f7936c5..420146b 100644 --- a/enemies.lua +++ b/enemies.lua @@ -13,7 +13,7 @@ function addbasicenemy(x, y, sprite, health, speed) enemy.inv = -1 enemy.sprite = sprite enemy.health = health - enemy.shootcooldown = rnd(1)+2 + enemy.shootcooldown = rnd(2)+1 enemy.speed = speed function enemy.draw(enemy) @@ -203,7 +203,7 @@ function addballshooter(x, y, health, speed) addbullet(enemy.x+4, enemy.y+4, sin(i/48)/2, cos(i/48)/2, true, 2) end end - sfx(15) + sfx(19) end if enemy.x < -32 then del(enemies, enemy) @@ -221,7 +221,7 @@ function addballshooter(x, y, health, speed) if shake < 3 then shake = 12 end - sfx(17) + sfx(20) explosion(enemy.x+4, enemy.y+4, 8*4, 8*2) del(enemies, enemy) end diff --git a/objects.lua b/objects.lua index fa04ee8..4990280 100644 --- a/objects.lua +++ b/objects.lua @@ -1,4 +1,15 @@ obj = {} +gt = 0 -- game time +scrollspeed = 0 +respawntimer = 0 +gameover = false +gamerunning = false + +function startgame() + wave[currentwave].start() + music(0, 0, 3) + gamerunning = true +end function updateobjs() foreach(players, function(obj) obj:update() end) diff --git a/pickups.lua b/pickups.lua index b8e0a6b..400917c 100644 --- a/pickups.lua +++ b/pickups.lua @@ -2,9 +2,9 @@ local randompickups = {} pickuptimer = 10 function randompickups.update() pickuptimer -= 1/60 - if (pickuptimer < 0) then + if pickuptimer < 0 then pickuptimer = 10 - if rnd(100) > 93 then + if rnd(100) > 90 then addpickup(128, rnd(80)+20) end end diff --git a/players.lua b/players.lua index f7a8cc8..c7ea70d 100644 --- a/players.lua +++ b/players.lua @@ -1,18 +1,19 @@ playercount = -1 +alwaysfire = false players = {} -function addplayer(sprite, bulletsprite) +function addplayer(x, y, sprite, bulletsprite) playercount += 1 local player = {} player.health = 3 - player.x = 18 - player.y = 60 + player.x = x + player.y = y player.w = 8 player.h = 8 player.sprite = sprite player.bulletsprite = bulletsprite player.ymov = 0 - player.inv = -1 + player.inv = 2 player.id = playercount player.shootcooldown = 0.0 player.particlecooldown = 0.0 @@ -23,7 +24,7 @@ function addplayer(sprite, bulletsprite) -- print(player.health) --draw a different sprite when moving, and blink when hurt - if player.inv < 0 or ceil(player.inv*10%2) == 1 then + if (player.inv < 0 or ceil(player.inv*10%2) == 1) and player.health > 0 then if (player.ymov == 0) then spr(player.sprite, player.x, player.y) elseif (player.ymov == 1) then @@ -44,30 +45,50 @@ function addplayer(sprite, bulletsprite) shake = 9 sfx(10) explosion(player.x, player.y) + if isgameover() then --FUCK, GAME OVER YOU DIED! + gameover = true -- gameover set to true + respawntimer = 5 --respawns all players in 5 seconds + player.inv = 20 + for i = 1, #enemies, 1 do + enemies[i].health = -1 + end + elseif player.health <= 0 then + player.inv = 5 + end + end + + function player.respawn(player) + player.health = 3 + player.inv = 3 + for i = 1, 8, 1 do + addcircle(player.x+4, player.y+4, sin(i/8), cos(i/8), 2, 0.6, 7, 0) + end end function player.update(player) --movement - if btn(0, player.id) then - player.x -= 1 - elseif btn(1, player.id) then - player.x += 1 - end - if btn(2, player.id) then - player.y -= 1 - player.ymov = 1 - elseif btn(3, player.id) then - player.y += 1 - player.ymov = -1 - else - player.ymov = 0 + if player.health > 0 then -- can only input if alive!!! + if btn(0, player.id) then + player.x -= 1 + elseif btn(1, player.id) then + player.x += 1 + end + if btn(2, player.id) then + player.y -= 1 + player.ymov = 1 + elseif btn(3, player.id) then + player.y += 1 + player.ymov = -1 + else + player.ymov = 0 + end end player.x = mid(0, player.x, 120) player.y = mid(0, player.y, 120) --particles from rockets, and smoke/sparks from damage player.particlecooldown -= 1/60 - if player.particlecooldown < 0 then + if player.particlecooldown < 0 and player.health > 0 then addcircle(player.x-1, player.y, -0.5, 0, 1.5, 0.5, 9, 0) addcircle(player.x-1, player.y+7, -0.5, 0, 1.5, 0.5, 9, 0) if player.health < 3 then @@ -85,7 +106,7 @@ function addplayer(sprite, bulletsprite) --shooting after cooldown player.shootcooldown -= 1/60 player.inv -= 1/60 - if btn(4, player.id) and player.shootcooldown < 0 then + if (btn(4, player.id) or alwaysfire) and player.shootcooldown < 0 and player.health > 0 then --for i = 1, 4, 1 do --addcircle(player.x+3, player.y+4, rnd(1)+0.5, rnd(1)-0.5, 1.5, rnd(0.4), 12) --end @@ -97,9 +118,21 @@ function addplayer(sprite, bulletsprite) end player.shootcooldown = player.shootspeed end + --reusing the inv timer as a respawn timer when killed + if player.health <= 0 and player.inv < 0 and not gameover then + player:respawn() + end end - add(players, player) end -addplayer(16, 18)
\ No newline at end of file +function isgameover() + for i = 1, #players, 1 do + if players[i].health > 0 then + return false + end + end + return true +end + +-- addplayer(16, 18)
\ No newline at end of file @@ -0,0 +1,85 @@ +function drawlogo(x,y) + --default values + -- x = 24 + -- y = 26 + + --this is a horrible way to draw the logo, but I'm doing it anyways. x3 + -- muahahahahahahaha!!!!!! + sspr(0,24,16,8,x-1,y+2,32,16) --to shadow + sspr(16,24,8,8,x+53,y+2,16,16) --ic shadow + sspr(0,24,16,8,x-1,y+1,32,16) --to + sspr(16,24,8,8,x+53,y+1,16,16) --ic + --X shadow + sspr(24,24,8,8,x+26,y-6,16,16) + sspr(24,24,8,8,x+42,y-6,16,16,true) + sspr(32,24,8,8,x+26,y+10,16,16, true) + sspr(32,24,8,8,x+42,y+10,16,16) + --X + sspr(24,24,8,8,x+26,y-8,16,16) + sspr(24,24,8,8,x+42,y-8,16,16,true) + sspr(32,24,8,8,x+26,y+8,16,16, true) + sspr(32,24,8,8,x+42,y+8,16,16) + --font + local text = "i n v a d e r s" + print(text, x+10, y+21, 3) + print(text, x+10, y+19, 3) + print(text, x+11, y+20, 3) + print(text, x+9, y+20, 3) + print(text, x+9, y+21, 3) + print(text, x+11, y+21, 3) + print(text, x+9, y+19, 3) + print(text, x+11, y+19, 3) + print(text, x+11, y+21, 3) + print(text, x+9, y+22, 3) + print(text, x+11, y+22, 3) + print(text, x+10, y+22, 3) + print(text, x+10, y+20, 14) + clip(x+10, y+20, 60, 3) + print(text, x+10, y+20, 11) + clip() +end + +function mainmenutext(x,y) + -- default values + -- x = 24 + -- y = 62 + x -= 1 + if not gamerunning then + spr(17,x+2,y+4+sin(t()*0.7)*2,1,1) --blue ship + spr(33,x+2,y+16+sin(t()*0.7)*2,1,1) --orange ship + end + print("(\142) - Lone Wolf", x+15,y+7,5) + print("(\142) - Lone Wolf", x+15,y+6,6) + print("(\151) - Companion", x+15,y+18,5) + print("(\151) - Companion", x+15,y+17,6) +end + +function credits(x,y) + -- default vaues + -- x = 10 + -- y = 100 + + palt(2,true) + palt(0,false) + spr(53,x-4,y+6+sin(t())*2,1,1,(t()%2<1)) --duck + --pset(x+3,y+10+sin(t())*2,13) --extra dot for glasses + spr(54,x+104,y+6+cos(t())*2,1,1,(t()%2<1)) --bot + palt(2,false) + palt(0,true) + print("1029chris ribboncable", x+9,y+6,0) + print("1029chris ribboncable", x+9,y+5,9) + print("code/tunes art/sounds", x+8,y+13,0) + print("code/tunes art/sounds", x+8,y+12,9) + print("made in vancouver - 2022", x+6,y+22,0) + print("made in vancouver - 2022", x+6,y+21,4) +end + + +-- drawlogo(24,26) +-- mainmenutext(24,62) +-- credits(10,100) + +--this creates menu items that allow players to turn off screenshake, or always fire the ships gun. +doshake = true +menuitem(1, "toggle shaking", function() doshake = not doshake end) +menuitem(2, "always fire", function() alwaysfire = not alwaysfire end)
\ No newline at end of file @@ -1,11 +1,40 @@ -updatewaves() -updateobjs() +--scrolling and respawn stuff +respawntimer -= 1/60 +if gameover then + scrollspeed = mid(-1/60,scrollspeed-1/6000,1/60) + if respawntimer < 0 then + gameover = false + foreach(players, function(obj) obj:respawn() end) + setwave(mid(1,currentwave-2,#wave)) + end +elseif gamerunning then + updatewaves() + updateobjs() + scrollspeed = mid(0,scrollspeed+1/2000,1/60) +end +gt += scrollspeed + +if not gamerunning then + if btn(4) then + addplayer(18, 60, 16, 18) + startgame() + elseif btn(5) then + addplayer(18, 45, 16, 18) + addplayer(18, 75, 32, 34) + startgame() + end +end + --screenshake math shake = shake + 0.11 * (0 - shake); if shake < 1 then shake = 0 end + +if not doshake then + shake = 0 +end --add another player if they fire -if btn(4, 1) and playercount == 0 then - addplayer(32, 34) -end
\ No newline at end of file +-- if btn(4, 1) and playercount == 0 then +-- addplayer(32, 34) +-- end
\ No newline at end of file @@ -7,7 +7,7 @@ everysecondtimer = 0 wave[1] = { delay = 2, start = function() - addbasicenemy(130, 60, rnd(basicenemysprites), 1, 0.15) + addbasicenemy(150, 60, rnd(basicenemysprites), 1, 0.15) end, everysecond = function() end, @@ -119,8 +119,8 @@ wave[7] = { end } -wave[currentwave].start() -music(0, 0, 3) +--wave[currentwave].start() +--music(0, 0, 3) function updatewaves() currentwavetime += 1/60 @@ -132,6 +132,7 @@ function updatewaves() if wave[currentwave].conditions() then delaytimer += 1/60 if delaytimer > wave[currentwave].delay then + everysecondtimer = 0 currentwave += 1 currentwavetime = 0 delaytimer = 0 @@ -139,4 +140,12 @@ function updatewaves() wave[currentwave].start() end end +end + +function setwave(num) + everysecondtimer = 0 + currentwave = num + currentwavetime = 0 + delaytimer = 0 + wave[currentwave].start() end
\ No newline at end of file |
