aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bullets.lua32
-rw-r--r--enemies.lua234
-rw-r--r--particles.lua21
-rw-r--r--players.lua33
-rw-r--r--waves.lua88
5 files changed, 298 insertions, 110 deletions
diff --git a/bullets.lua b/bullets.lua
index c7a47b0..c287da1 100644
--- a/bullets.lua
+++ b/bullets.lua
@@ -1,12 +1,12 @@
function addbullet(x, y, velx, vely, evil, sprite)
- local bullet = {}
-
- bullet.sprite = sprite
- bullet.evil = evil
- bullet.x = x
- bullet.y = y
- bullet.velx = velx
- bullet.vely = vely
+ local bullet = {
+ sprite = sprite or 2,
+ evil = evil,
+ x = x,
+ y = y,
+ velx = velx,
+ vely = vely,
+ }
function bullet.draw(bullet)
spr(bullet.sprite, bullet.x, bullet.y)
@@ -48,14 +48,14 @@ function addbullet(x, y, velx, vely, evil, sprite)
end
function addlaser(x, y, r)
- local laser = {}
-
- --lasers!!!!!!!!!!!!!!!
- laser.x = x
- laser.y = y
- laser.r = r
- laser.timer = 0
- laser.playingsound = false
+ local laser = {
+ --lasers!!!!!!!!!!!!!!!
+ x = x,
+ y = y,
+ r = r,
+ timer = 0,
+ playingsound = false
+ }
function laser.draw(laser)
if laser.timer > 1.5 then
diff --git a/enemies.lua b/enemies.lua
index 0168e1c..4aafa16 100644
--- a/enemies.lua
+++ b/enemies.lua
@@ -2,13 +2,12 @@ enemies = {}
--universal functions:
function enemyshot(enemy)
- --explode
- explosion(enemy.x+rnd(enemy.w), enemy.y+rnd(enemy.h))
enemy.inv = 0.5
- --and reduce health
+ --reduce health
enemy.health -= 1
if enemy.health > 0 then
- sfx(16, 2)
+ sfx(16, 2)
+ explosion(enemy.x+rnd(enemy.w), enemy.y+rnd(enemy.h)) --explode!!!!!!
end
end
@@ -31,6 +30,7 @@ function enemydie(enemy, sound)
shake = enemy.h/2
end
sfx(sound, 2)
+ explosion(enemy.x, enemy.y, enemy.w, enemy.h)
del(enemies, enemy)
end
@@ -55,7 +55,9 @@ function addbasicenemy(x, y, speed) --basic small weak enemy
sprite = rnd({14, 30, 46, 62}), --these are all possible 8x8 basic enemy sprites
health = 1,
shootcooldown = rnd(2)+1,
- speed = speed
+ speed = speed,
+ shot = enemyshot,
+ collide = enemycollide
}
function enemy.draw(enemy)
@@ -68,10 +70,6 @@ function addbasicenemy(x, y, speed) --basic small weak enemy
end
end
- enemy.shot = enemyshot
-
- enemy.collide = enemycollide
-
function enemy.update()
enemy.x -= speed
enemy.y += sin(time()*speed)*speed
@@ -107,6 +105,8 @@ function addwallshooter(x, shootup, health, speed, offset, bulletspeed)
speed = speed,
shoottoggle = true,
bulletspeed = bulletspeed or 1,
+ shot = enemyshot,
+ collide = enemycollide
}
if shootup then
enemy.y = 1
@@ -119,10 +119,6 @@ function addwallshooter(x, shootup, health, speed, offset, bulletspeed)
end
end
- enemy.shot = enemyshot
-
- enemy.collide = enemycollide
-
function enemy.update()
enemy.x -= speed
if enemy.shootcooldown < 0 then
@@ -152,7 +148,7 @@ end
--Big ol fella that shoots CIRCLES of BULLETS!!!!!!
-function addballshooter(x, y, health, speed)
+function addballshooter(x, y, speed)
local enemy = {
x = x,
y = y,
@@ -160,29 +156,27 @@ function addballshooter(x, y, health, speed)
w = 8*3,
h = 8*2,
inv = -1,
- health = health,
+ health = 12,
shootcooldown = 0,
- speed = speed
+ speed = speed,
+ shot = enemyshot,
+ collide = enemycollide
}
function enemy.draw(enemy)
if enemy.inv < 0 or ceil(enemy.inv*10%2) == 1 then
- local sprite = 27
- if health < 7 then sprite = 11 end
+ local sprite = 11
+ if enemy.health < 7 then sprite = 27 end
spr(sprite, enemy.x, enemy.y, 3, 1, false, true)
spr(sprite, enemy.x, enemy.y+8, 3, 1)
end
end
- enemy.shot = enemyshot
-
- enemy.collide = enemycollide
-
function enemy.update()
enemy.x -= speed
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 2
- if enemy.x < 129 then
+ if enemy.x < 128 then
for i = 1, 48, 1 do --shoot ring of bullets if on screen
if sin(i/48) < 0.3 and sin((i+currentwavetime)/8) < 0.4 then
addbullet(enemy.x+4, enemy.y+4, sin(i/48)/2, cos(i/48)/2, true, 2)
@@ -203,17 +197,19 @@ function addballshooter(x, y, health, speed)
add(enemies, enemy)
end
-function addtargetingenemy(x, y, health, speed)
+function addtargetingenemy(x, y, speed)
local enemy = {
x = x,
y = y,
w = 16,
h = 8,
inv = -1,
- health = health,
+ health = 3,
shootcooldown = rnd(0.4)+0.2,
speed = speed,
- bulletcounter = 0
+ bulletcounter = 0,
+ shot = enemyshot,
+ collide = enemycollide
}
function enemy.draw(enemy)
@@ -222,10 +218,6 @@ function addtargetingenemy(x, y, health, speed)
end
end
- enemy.shot = enemyshot
-
- enemy.collide = enemycollide
-
function enemy.update()
enemy.x -= speed
if enemy.shootcooldown < 0 and currentwavetime%1.5>1.2 then
@@ -263,7 +255,9 @@ function addlasershooter(x, y, speed, stay)
firedlaser = false,
shootcooldown = 0,
moveoffset = 0,
- sinspeed = 4
+ sinspeed = 4,
+ shot = enemyshot,
+ collide = enemycollide
}
if stay then enemy.y = 64-20 end
@@ -276,10 +270,6 @@ function addlasershooter(x, y, speed, stay)
end
end
- enemy.shot = enemyshot
-
- enemy.collide = enemycollide
-
function enemy.update()
if enemy.x > 90 or (not stay and enemy.lasertimer > 4) then --enemy lerps into place when first added, and if they leave they speed up
enemy.x -= enemy.speed/2
@@ -347,6 +337,8 @@ function addwallboss(x, y, length, speed, stay, move)
shootcooldown = 3,
speed = speed,
bulletfired = {},
+ shot = enemyshot,
+ collide = enemycollide
}
for i = 1, length, 1 do
@@ -355,7 +347,7 @@ function addwallboss(x, y, length, speed, stay, move)
function enemy.draw(enemy)
local dmg = 0
- if enemy.health < length * 4 * #players then
+ if enemy.health < length * 4 then
dmg = 16
end
if enemy.inv < 0 or ceil(enemy.inv*10%2) == 1 then
@@ -373,10 +365,6 @@ function addwallboss(x, y, length, speed, stay, move)
end
end
- enemy.shot = enemyshot
-
- enemy.collide = enemycollide
-
function enemy.update()
if not enemy.stay then
enemy.x -= speed
@@ -397,24 +385,26 @@ function addwallboss(x, y, length, speed, stay, move)
return true
end
end
- elseif move == 2 and i == ceil(rnd(length*1.3)) then -- this one is just random ones
+ elseif move == 2 and i == ceil(rnd(length)) then -- this one is just random ones
return true
elseif move == 3 then --this one is that neat weaving pattern, shout out to don't get a virus fans!
if i > length/3 and i < length/3*2 then
- if currentwavetime%1.5 < 0.15 then
+ if everysecondtimer < 0.1 then
return true
end
- elseif currentwavetime%1.5 > 0.7 and currentwavetime%1.5 < 0.85 then
+ elseif everysecondtimer > 0.5 and everysecondtimer < 0.6 then
return true
end
- elseif move == 5 and (i < length/3+sin(t()/3)*3 or i > length/3*2+sin(t()/3)*3 or ceil(rnd(length*7)) == i) then -- this one is a wavy bullet corridor
+ elseif move == 4 and (i < length/3+sin(t()/2)*3 or i > length/3*2+sin(t()/2)*3) then -- this one is a wavy bullet corridor
return true
end
end
for i = 1, length, 1 do
if attack(i, enemy.move) then
- addbullet(enemy.x, -4+i*8, -1, 0, true, 2)
+ local bulletspeed = -1-rnd(0.2)
+ if enemy.move > 2 then bulletspeed = -1 end
+ addbullet(enemy.x, enemy.y-8+i*8, bulletspeed, 0, true, 2)
enemy.bulletfired[i] = 1
else
enemy.bulletfired[i] = 0
@@ -425,6 +415,160 @@ function addwallboss(x, y, length, speed, stay, move)
enemymisc(enemy)
if enemy.health <= 0 then -- die!!!!!
enemydie(enemy,17)
+ addpickup(enemy.x+rnd(32), enemy.y+rnd(32), "health")
+ addpickup(enemy.x+rnd(32), enemy.y+rnd(32))
+ addpickup(enemy.x+rnd(32), enemy.y+rnd(32))
+ end
+ end
+
+ add(enemies, enemy)
+end
+
+function addbomb(x, y, delay) --BIG BOMB!!!! KILL IIT QUICKLY!!!!
+ local enemy = {
+ x = x,
+ y = y,
+ w = 32,
+ h = 32,
+ inv = -1,
+ health = 12,
+ shootcooldown = 0+delay,
+ shot = enemyshot,
+ collide = enemycollide
+ }
+
+ function enemy.draw(enemy)
+ local sprite = 73
+ if everysecondtimer > 0.5 then sprite = 75 end
+ if enemy.health < 6 then sprite += 32 end
+ if enemy.inv < 0 or ceil(enemy.inv*10%2) == 1 then
+ circfill(enemy.x+16, enemy.y+16, sin(enemy.shootcooldown^2)*3-enemy.shootcooldown, 7)
+ local offset = mid(0, -enemy.shootcooldown-2, 3)
+ spr(sprite, enemy.x, enemy.y-offset, 2, 2)
+ spr(sprite, enemy.x, enemy.y+16+offset, 2, 2, false, true)
+ spr(sprite, enemy.x+16, enemy.y-offset, 2, 2, true)
+ spr(sprite, enemy.x+16, enemy.y+16+offset, 2, 2, true, true)
+ end
+ end
+
+ function enemy.update()
+ if enemy.shootcooldown < 0 then
+ enemy.x = enemy.x + 0.02 * (80 - enemy.x);
+ end
+ enemy.y += sin(time()/3)/8
+ if enemy.shootcooldown < -8 then
+ for i = 1, 60, 1 do
+ addbullet(enemy.x+16, enemy.y+16, sin(i/60), cos(i/60), true, 2)
+ enemy.health = 0
+ end
+ end
+ enemymisc(enemy)
+ if enemy.health <= 0 then -- die!!!!!
+ enemydie(enemy,17)
+ end
+ end
+
+ add(enemies, enemy)
+end
+
+function addmissile(x, y, target) --basic small weak enemy
+ local enemy = {
+ target = target,
+ x = x,
+ y = y,
+ w = 16,
+ h = 8,
+ inv = -1,
+ health = 3,
+ speed = 0.3,
+ shootcooldown = 0,
+ shot = enemyshot,
+ collide = enemycollide
+ }
+
+ function enemy.draw(enemy)
+ if enemy.inv < 0 or ceil(enemy.inv*10%2) == 1 then
+ spr(42, enemy.x, enemy.y, 2, 1)
+ end
+ end
+
+ function enemy.update()
+ enemy.x -= enemy.speed
+ enemy.speed += 0.015
+ enemy.y += (players[enemy.target].y - enemy.y)/30
+ addcircle(enemy.x+12, enemy.y+rnd(8), 0, rnd()/8, 2.1, 0.6, rnd({9,5}), 0)
+ enemymisc(enemy)
+ if enemy.health <= 0 then -- die!!!!!
+ enemydie(enemy,17)
+ end
+ end
+
+ add(enemies, enemy, 1)
+end
+
+function addmissileboss(x, y) --boss that shoots missiles!!!
+ local enemy = {
+ x = x,
+ y = y,
+ targetx = 90,
+ targety = 48,
+ targetchangetimer = 2,
+ w = 32,
+ h = 32,
+ inv = -1,
+ health = 40*#players,
+ shootcooldown = 1.8,
+ speed = 0.04,
+ shot = enemyshot,
+ collide = enemycollide
+ }
+
+ function enemy.draw(enemy)
+ local sprite = 68
+ if enemy.health < 15 then sprite = 100 end
+ if enemy.inv < 0 or ceil(enemy.inv*10%2) == 1 then
+ spr(sprite, enemy.x, enemy.y, 4, 2)
+ spr(sprite, enemy.x, enemy.y+16, 4, 2, false, true)
+ end
+ end
+
+ function enemy.update()
+ local playertarget = ceil((t()/2.4)%#players)
+ enemy.targetchangetimer -= 1/60
+ --some cool different moves, shout out to dont get a virus fans!
+ if currentwavetime%18 > 8 and currentwavetime%20 < 12 then
+ enemy.targety = flr(everysecondtimer*1.99)*96
+ elseif currentwavetime%18 > 17.3 then --INTIMIDATION TACTICS!!!!!
+ enemy.targety = players[playertarget].y
+ enemy.targetx = players[playertarget].x+24
+ enemy.shootcooldown = 0.4
+ end
+ enemy.x = enemy.x + enemy.speed * (enemy.targetx - enemy.x);
+ enemy.y = enemy.y + enemy.speed * (enemy.targety - enemy.y);
+ if enemy.targetchangetimer < 0 then
+ enemy.targetchangetimer = rnd(0.3)+0.5
+ enemy.targetx = 80+rnd(16)
+ enemy.targety = rnd(96)
+ end
+ if enemy.shootcooldown < 0 then
+ enemy.shootcooldown = 0.3 + rnd(1.2)
+ if enemy.x < 129 then
+ local offset = 2
+ if currentwavetime%2 > 1 then offset = 30 end
+ addmissile(enemy.x, enemy.y+offset, playertarget)
+ if enemy.health < 12 then
+ addbullet(enemy.x,enemy.y+16,(players[playertarget].x-enemy.x)/70,(players[playertarget].y-enemy.y-16)/70,true)
+ end
+ enemy.speed += 0.001
+ sfx(15, 2) -- play shoot sound if on screen
+ end
+ end
+ enemymisc(enemy)
+ if enemy.health <= 0 then -- die!!!!!
+ enemydie(enemy,17)
+ addpickup(enemy.x+rnd(32), enemy.y+rnd(32), "health")
+ addpickup(enemy.x+rnd(32), enemy.y+rnd(32))
+ addpickup(enemy.x+rnd(32), enemy.y+rnd(32))
end
end
diff --git a/particles.lua b/particles.lua
index 8f4e92c..3d28184 100644
--- a/particles.lua
+++ b/particles.lua
@@ -1,15 +1,16 @@
shake = 0
function addcircle(x, y, velx, vely, r, time, color, grav)
- local circle = {}
- circle.x = x
- circle.y = y
- circle.velx = velx
- circle.vely = vely
- circle.r = r
- circle.time = time
- circle.t = time
- circle.col = color
- circle.grav = grav
+ local circle = {
+ x = x,
+ y = y,
+ velx = velx,
+ vely = vely,
+ r = r,
+ time = time,
+ t = time,
+ col = color,
+ grav = grav
+ }
function circle.draw(circle)
circfill(circle.x, circle.y, circle.r*sin(circle.time/circle.t), circle.col)
diff --git a/players.lua b/players.lua
index 117a518..39dae69 100644
--- a/players.lua
+++ b/players.lua
@@ -2,21 +2,22 @@ alwaysfire = false
players = {}
function addplayer(x, y, sprite, bulletsprite)
- local player = {}
- player.health = 3
- player.x = x
- player.y = y
- player.w = 8
- player.h = 8
- player.sprite = sprite
- player.bulletsprite = bulletsprite
- player.ymov = 0
- player.inv = 2
- player.id = #players
- player.shootcooldown = 0.0
- player.particlecooldown = 0.0
- player.shootspeed = 0.25
- player.shoot3 = false
+ local player = {
+ health = 3,
+ x = x,
+ y = y,
+ w = 8,
+ h = 8,
+ sprite = sprite,
+ bulletsprite = bulletsprite,
+ ymov = 0,
+ inv = 2,
+ id = #players,
+ shootcooldown = 0.0,
+ particlecooldown = 0.0,
+ shootspeed = 0.25,
+ shoot3 = false
+ }
function player.draw(player)
-- print(player.health)
@@ -138,7 +139,7 @@ end
function isgameover()
for i = 1, #players, 1 do
if players[i].health > 0 then
- return false
+ return
end
end
return true
diff --git a/waves.lua b/waves.lua
index ca441c2..5c46c0d 100644
--- a/waves.lua
+++ b/waves.lua
@@ -13,7 +13,7 @@ wave[1] = {
everysecond = function()
end,
conditions = function()
- if #enemies < 1 then return true else return false
+ if #enemies < 1 then return true
end
end
}
@@ -22,13 +22,13 @@ wave[2] = {
delay = 2,
start = function()
addbasicenemy(128, 30, 0.4)
- addtargetingenemy(128, 60, 3, 0.1)
+ addtargetingenemy(128, 60, 0.1)
addbasicenemy(128, 90, 0.4)
end,
everysecond = function()
end,
conditions = function()
- if #enemies < 2 then return true else return false
+ if #enemies < 2 then return true
end
end
}
@@ -44,7 +44,7 @@ wave[3] = {
everysecond = function()
end,
conditions = function()
- if #enemies < 5 then return true else return false
+ if #enemies < 5 then return true
end
end
}
@@ -54,13 +54,13 @@ wave[4] = {
start = function()
addwallshooter(140, true, 10, 0.4)
addbasicenemy(128, 30, 0.5)
- addtargetingenemy(155, 60, 3, 0.15)
+ addtargetingenemy(155, 60, 0.15)
addbasicenemy(128, 90, 0.5)
end,
everysecond = function()
end,
conditions = function()
- if #enemies < 2 then return true else return false
+ if #enemies < 2 then return true
end
end
}
@@ -81,7 +81,7 @@ wave[5] = {
end
end,
conditions = function()
- if #enemies < 2 and currentwavetime > 12 then return true else return false
+ if #enemies < 2 and currentwavetime > 12 then return true
end
end
}
@@ -89,14 +89,14 @@ wave[5] = {
wave[6] = {
delay = 0,
start = function()
- addballshooter(128, 56, 12, 0.1)
- addballshooter(160, 14, 12, 0.1)
- addballshooter(160, 100, 12, 0.1)
+ addballshooter(128, 56, 0.1)
+ addballshooter(160, 14, 0.1)
+ addballshooter(160, 100, 0.1)
end,
everysecond = function()
end,
conditions = function()
- if #enemies < 1 then return true else return false
+ if #enemies < 1 then return true
end
end
}
@@ -104,7 +104,7 @@ wave[6] = {
wave[7] = {
delay = 1,
start = function()
- addballshooter(140, 56, 12, 0.2)
+ addballshooter(140, 56, 0.2)
addwallshooter(120, true, 10, 0.3)
addwallshooter(220, true, 10, 0.3)
addbasicenemy(128, 30, 0.5)
@@ -115,7 +115,7 @@ wave[7] = {
everysecond = function()
end,
conditions = function()
- if #enemies < 1 then return true else return false
+ if #enemies < 1 then return true
end
end
}
@@ -137,7 +137,7 @@ wave[8] = {
end
end,
conditions = function()
- if #enemies < 1 then checkpoint = currentwave+1 return true else return false
+ if #enemies < 1 then checkpoint = currentwave+1 return true
end
end
}
@@ -145,18 +145,18 @@ wave[8] = {
wave[9] = {
delay = 5,
start = function()
- addtargetingenemy(128,1,3,0.1)
- addtargetingenemy(262,60,3,0.2)
+ addtargetingenemy(128,1,0.1)
+ addtargetingenemy(262,60,0.2)
addwallshooter(138, true, 10, 0.4, 0)
addwallshooter(144, true, 10, 0.4, 0)
addwallshooter(185, false, 10, 0.4, 0)
addwallshooter(230, true, 10, 0.4)
- addballshooter(230, 56, 12, 0.2)
+ addballshooter(230, 56, 0.2)
end,
everysecond = function()
end,
conditions = function()
- if #enemies < 2 then return true else return false
+ if #enemies < 2 then return true
end
end
}
@@ -165,13 +165,13 @@ wave[10] = {
delay = 3,
start = function()
for i = 1, 7, 1 do
- addtargetingenemy(128, i*16-4, 3, 0.1)
+ addtargetingenemy(128, i*16-4, 0.1)
end
end,
everysecond = function()
end,
conditions = function()
- if #enemies < 2 then return true else return false
+ if #enemies < 2 then return true
end
end
}
@@ -183,12 +183,12 @@ wave[11] = {
addwallshooter(128+i*65, true, 10, 0.4, 0, 0.68)
addwallshooter(133+i*65, false, 10, 0.4, 0, 0.68)
end
- addballshooter(200, 56, 12, 0.2)
+ addballshooter(200, 56, 0.2)
end,
everysecond = function()
end,
conditions = function()
- if #enemies < 1 then return true else return false
+ if #enemies < 1 then return true
end
end
}
@@ -198,10 +198,52 @@ wave[12] = {
start = function()
addwallboss(128,4,15,0.05,true)
end,
+ everysecond = wave[8].everysecond,
+ conditions = wave[8].conditions
+}
+
+wave[13] = {
+ delay = 5,
+ start = function()
+ addbasicenemy(130, 58, 0.6)
+ addbasicenemy(130, 68, 0.5)
+ addbasicenemy(130, 63, 0.7)
+ addlasershooter(128, -2, 0.1, false)
+ addbomb(128,46, 0)
+ addlasershooter(128, 128-38, 0.1, false)
+ end,
+ everysecond = wave[8].everysecond,
+ conditions = function()
+ if #enemies < 1 then return true
+ end
+ end
+}
+
+wave[14] = {
+ delay = 0,
+ start = function()
+ addbomb(140,46, 4)
+ addtargetingenemy(140, 60-8, 0.2)
+ addtargetingenemy(140, 60+8, 0.2)
+ addballshooter(128, 14, 0.03)
+ addballshooter(128, 100, 0.03)
+ end,
everysecond = function()
end,
conditions = function()
- if #enemies < 1 then return true else return false
+ if #enemies < 1 then return true
+ end
+ end
+}
+
+wave[15] = {
+ delay = 0,
+ start = function()
+ addmissileboss(128, 60)
+ end,
+ everysecond = wave[8].everysecond,
+ conditions = function()
+ if #enemies < 1 then return true
end
end
}