aboutsummaryrefslogtreecommitdiff
path: root/enemies.lua
diff options
context:
space:
mode:
Diffstat (limited to 'enemies.lua')
-rw-r--r--enemies.lua210
1 files changed, 114 insertions, 96 deletions
diff --git a/enemies.lua b/enemies.lua
index d29d826..e7c35b9 100644
--- a/enemies.lua
+++ b/enemies.lua
@@ -1,5 +1,10 @@
enemies = {}
-
+canshootatx = 126
+function killallenemies()
+ for i = 1, #enemies, 1 do
+ enemies[i].health = -1
+ end
+end
--universal functions:
function enemyshot(enemy)
enemy.inv = 0.5
@@ -22,27 +27,33 @@ function enemycollide(enemy, object) --f this enemy collides with something, do
end
function enemydie(enemy, sound, soundchannel, points, isboss)
- 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
- addpickup(x+rnd(enemy.w), y+rnd(enemy.h), "health")
- end
- if isboss and not gameover then
- music(-1, 3000)
- despawnallbullets = true
- addpickup(x+rnd(32), y+rnd(32))
- addpickup(x+rnd(32), y+rnd(32), "health")
- end
- if shake < 3 then
- shake = enemy.h/2
+ 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
+ addpickup(x+rnd(enemy.w), y+rnd(enemy.h), "health")
+ end
+ if isboss then
+ music(-1, 3000)
+ sfx(60,-2) --stop missle sound, less tokens to just have it here.
+ despawnallbullets = true
+ killallenemies()
+ if not gameover then
+ addpickup(x+rnd(32), y+rnd(32))
+ addpickup(x+rnd(32), y+rnd(32), "health")
+ end
+ end
+ if shake < 3 then
+ shake = enemy.h/2
+ end
+ currentscore += points
+ sfx(sound, soundchannel)
+ explosion(x, y, enemy.w, enemy.h)
+ del(enemies, enemy)
+ enemy.x,enemy.y = x,y
end
- currentscore += points
- sfx(sound, soundchannel)
- explosion(x, y, enemy.w, enemy.h)
- del(enemies, enemy)
- enemy.x,enemy.y = x,y
end
function enemymisc(enemy) --misc stuff every enemy needs
@@ -80,7 +91,7 @@ function addbasicenemy(x, y, speed) --basic small weak enemy
if flr(sin(time()*speed)) ~= 0 then --if the ships heading up, change sprite
sprite += 1
end
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
spr(sprite, enemy.x, enemy.y)
end
end
@@ -90,15 +101,13 @@ function addbasicenemy(x, y, speed) --basic small weak enemy
enemy.y += sin(time()*speed)*speed
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 0.5 + rnd(1.5)
- if enemy.x < 124 and enemy.x > 5 then
+ if enemy.x < canshootatx and enemy.x > 5 then
addbullet(enemy.x-3, enemy.y, -1, 0) -- shoot if on screen
sfx(15, 2) -- play shoot sound if on screen
end
end
enemymisc(enemy)
- if enemy.health <= 0 then -- die!!!!!
- enemydie(enemy,17,2,10)
- end
+ enemydie(enemy,17,2,10) --die!!!!
end
add(enemies, enemy)
@@ -132,7 +141,7 @@ function addwallshooter(x, shootup, health, speed, offset, bulletspeed)
if enemy.health < health*0.25 then
damagesmoke(enemy)
end
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
spr(enemy.sprite+t()*10%2, enemy.x, enemy.y)
end
end
@@ -156,9 +165,7 @@ function addwallshooter(x, shootup, health, speed, offset, bulletspeed)
end
end
enemymisc(enemy)
- if enemy.health <= 0 then
- enemydie(enemy,17,2,15)
- end
+ enemydie(enemy,17,2,15)
end
add(enemies, enemy)
@@ -182,7 +189,7 @@ function addballshooter(x, y, speed)
}
function enemy.draw(enemy)
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
local sprite = 11
if enemy.health < 4 then
damagesmoke(enemy)
@@ -197,7 +204,7 @@ function addballshooter(x, y, speed)
enemy.x -= speed
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 2
- if enemy.x < 126 and enemy.x > 0 then
+ if enemy.x < canshootatx and enemy.x > 0 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)
@@ -207,9 +214,7 @@ function addballshooter(x, y, speed)
end
end
enemymisc(enemy)
- if enemy.health <= 0 then
- enemydie(enemy,20,3,40)
- end
+ enemydie(enemy,20,3,40)
end
add(enemies, enemy)
@@ -234,7 +239,7 @@ function addtargetingenemy(x, y, speed)
if enemy.health < 2 then
damagesmoke(enemy)
end
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
spr(58, enemy.x, enemy.y, 2, 1)
end
end
@@ -245,7 +250,7 @@ function addtargetingenemy(x, y, speed)
enemy.shootcooldown = 0.1
enemy.bulletcounter += 1
local p = enemy.bulletcounter%#players+1
- if enemy.x < 126 and players[p].x < enemy.x+30 then --math involving a distance check to get the proper velocity for aiming
+ if enemy.x < canshootatx and players[p].x < enemy.x+30 then --math involving a distance check to get the proper velocity for aiming
local distance = sqrt((players[p].x - enemy.x)^2+(players[p].y - enemy.y)^2)
local velx = (players[p].x - enemy.x)/distance
local vely = (players[p].y - enemy.y)/distance
@@ -254,9 +259,7 @@ function addtargetingenemy(x, y, speed)
end
end
enemymisc(enemy)
- if enemy.health <= 0 then -- die!!!!!
- enemydie(enemy,17,2,20)
- end
+ enemydie(enemy,17,2,20)
end
add(enemies, enemy)
@@ -280,17 +283,17 @@ function addlasershooter(x, y, points, speed, stay, isboss)
shot = enemyshot,
collide = enemycollide
}
- if stay then enemy.y = 44 end
+ if stay then enemy.y = 48 end
function enemy:draw()
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
local sprite = 64
if enemy.health < 10 then
damagesmoke(enemy)
sprite = 96
end
- spr(sprite,enemy.x+0,enemy.y+4,4,2)
- spr(sprite,enemy.x+0,enemy.y+20,4,2,false,true)
+ spr(sprite,enemy.x+0,enemy.y,4,2)
+ spr(sprite,enemy.x+0,enemy.y+16,4,2,false,true)
end
end
@@ -305,7 +308,7 @@ function addlasershooter(x, y, points, speed, stay, isboss)
end
if enemy.lasertimer > 4 and stay then
- enemy.y = 64-20 + sin(enemy.moveoffset+enemy.lasertimer/enemy.sinspeed) * 40
+ enemy.y = 48 + sin(enemy.moveoffset+enemy.lasertimer/enemy.sinspeed) * 40
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 0.18
addbullet(enemy.x+6, enemy.y+20, -1, rnd(2)-1) --shoooot!!!!!
@@ -315,10 +318,10 @@ function addlasershooter(x, y, points, speed, stay, isboss)
if enemy.x <= 90 then
if not enemy.firedlaser then
- addlaser(enemy.x+6, enemy.y+20, 10, enemy)
+ addlaser(enemy.x+6, enemy.y+16, 10, enemy)
enemy.moveoffset = rnd({0,0.5}) --add offset so not moving in same direction each time
- enemy.sinspeed = rnd({4,4,4,4,4,4,4,4,4,4,4,4,1,8,2,2,2,2}) --add differing speeds to sin up and down randomly
- if enemy.health < 15*#players then
+ enemy.sinspeed = rnd({4,4,4,4,4,1,8,2}) --add differing speeds to sin up and down randomly
+ if enemy.health < 20*#players then
enemy.sinspeed /= 2
end
end
@@ -331,10 +334,7 @@ function addlasershooter(x, y, points, speed, stay, isboss)
end
enemymisc(enemy)
-
- if enemy.health <= 0 then -- die!!!!!
- enemydie(enemy,21,3,points,isboss)
- end
+ enemydie(enemy,21,3,points,isboss)
end
add(enemies, enemy)
@@ -360,7 +360,7 @@ function addwallboss(x, y, length, points, speed, stay, move, isboss)
collide = enemycollide
}
enemy.starthealth = enemy.health
- if enemy.isboss then enemy.health *= 3 end -- triple health if the boss
+ if isboss then enemy.health *= 3 end -- triple health if the boss
for i = 1, length, 1 do
enemy.bulletfired[i] = 0
@@ -371,19 +371,19 @@ function addwallboss(x, y, length, points, speed, stay, move, isboss)
local dmg = 0
if enemy.health < enemy.starthealth*0.25 then
damagesmoke(enemy)
- dmg = 16
+ dmg = 32
end
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
for i = 2, length-1, 1 do
spr(93+enemy.bulletfired[i]+dmg, x, -8+y+i*8)
if i < length-2 then
- spr(79+((i%3)%2*16)+dmg*2, x+8, -8+y+i*8, 1, 1, false, (i%3 == 2))
+ spr(79+((i%3)%2*16)+dmg, x+8, -8+y+i*8, 1, 1, false, (i%3 == 2))
end
end
- spr(77+enemy.bulletfired[1]+dmg*2, x, y)
- spr(77+enemy.bulletfired[1]+dmg*2, x, y+length*8-8, 1, 1, false, true)
+ spr(77+enemy.bulletfired[1]+dmg, x, y)
+ spr(77+enemy.bulletfired[1]+dmg, x, y+length*8-8, 1, 1, false, true)
spr(70+dmg,x+8,y,2,2)
- spr(70+dmg*2,x+8,y+length*8-16,2,2,false,true)
+ spr(70+dmg,x+8,y+length*8-16,2,2,false,true)
spr(79+dmg,x+8,y+length*8-24,1,1, false, true)
end
end
@@ -397,7 +397,7 @@ function addwallboss(x, y, length, points, speed, stay, move, isboss)
end
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 0.095
- if enemy.x < 129 then
+ if enemy.x < canshootatx then
local function attack(i, move) -- these are all the conditions to shoot depending on what "move" this guys on
if move == 0 and (flr((t()*4)%length) == i or flr((-t()*4)%length) == i) and i%2 == 1 then --this one shoots lines in a pattern
@@ -435,9 +435,7 @@ function addwallboss(x, y, length, points, speed, stay, move, isboss)
end
end
enemymisc(enemy)
- if enemy.health <= 0 then -- die!!!!!
- enemydie(enemy,21,3,points,isboss)
- end
+ enemydie(enemy,21,3,points,isboss) --die
end
add(enemies, enemy)
@@ -465,7 +463,7 @@ function addbomb(x, y, delay) --BIG BOMB!!!! KILL IIT QUICKLY!!!!
damagesmoke(enemy)
sprite += 32
end
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime then
circfill(x+15, y+16, sin(enemy.shootcooldown^2)*3-enemy.shootcooldown, rnd({7,11,3}))
local offset = mid(0, -enemy.shootcooldown-2, 3)
spr(sprite, x, y-offset, 2, 2)
@@ -489,9 +487,7 @@ function addbomb(x, y, delay) --BIG BOMB!!!! KILL IIT QUICKLY!!!!
enemy.x = lerp(enemy.x, 80, 0.02)
end
enemymisc(enemy)
- if enemy.health <= 0 then -- die!!!!!
- enemydie(enemy,20,3,points)
- end
+ enemydie(enemy,20,3,points) --die bastard!!!!!!
--charge sound
if enemy.x < 120 and everysecondtimer > 0.45 then
if enemy.shootcooldown < -5 then
@@ -530,13 +526,13 @@ function addmissileboss(x, y) --boss that shoots missiles!!!
sprite = 100
damagesmoke(enemy)
end
- if enemy.inv < 0 or flashtime == 1 then
+ if enemy.inv < 0 or flashtime 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(enemy)
+ function enemy.update()
local playertarget = ceil((t()/2.4)%#players)
enemy.targetchangetimer -= ft
--some cool different moves, shout out to dont get a virus fans!
@@ -556,7 +552,7 @@ function addmissileboss(x, y) --boss that shoots missiles!!!
end
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 0.3 + rnd(1.2)
- if enemy.x < 122 and players[playertarget] ~= nil then
+ if enemy.x < canshootatx and players[playertarget] ~= nil then
local offset = 2
if currentwavetime%2 > 1 then offset = 30 end
addmissile(enemy.x, enemy.y+offset, playertarget)
@@ -569,12 +565,7 @@ function addmissileboss(x, y) --boss that shoots missiles!!!
end
end
enemymisc(enemy)
- if enemy.health <= 0 then -- die!!!!!
- music(-1, 3000)
- sfx(60,-2) --stop missle sound
- enemydie(enemy,21,3,300,true)
-
- end
+ enemydie(enemy,21,3,300,true) --death!!!!
end
add(enemies, enemy)
@@ -587,27 +578,33 @@ function addfinalboss() --THE FINAL BOSS!!!!!!! WOOOAAAHHHHHH!!!!!!!!!!!!!!!!!!!
w = 32,
h = 120,
inv = -1,
- health = 150*#players, --150
+ health = 200*#players, --200
shootcooldown = 4,
shot = enemyshot,
collide = enemycollide,
speed = 1.5,
- amount = 3
+ amount = 3,
+ thrustery = {0,0,0,0}
}
--thrusters that each fall off once the portal's health is 1/5th depleated
- function addportalthruster(x,y,isflipped)
+ function addportalthruster(x,y,id,isflipped)
+ if id*40-40 < enemy.health then
local sprite = 128
isflipped = isflipped or 1
- if everysecondtimer%0.1 > 0.05 then sprite = 132 end --animation
+ if flashtime then sprite = 132 end --animation
spr(sprite, x, isflipped*(sin(time()*enemy.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}))
+ end
end
function enemy:draw()
-- portal
- local x,y,speed,amount = enemy.x-8,enemy.y,enemy.speed,enemy.amount
+ 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 = (-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
@@ -615,44 +612,65 @@ function addfinalboss() --THE FINAL BOSS!!!!!!! WOOOAAAHHHHHH!!!!!!!!!!!!!!!!!!!
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)
- addportalthruster(x-19,y-4)
- addportalthruster(x-19,y+97,-1)
+ addportalthruster(x-19,y-4,3)
+ addportalthruster(x-19,y+97,4,-1)
local sprite = 136
+ if enemy.health < 40 then sprite = 140 end
spr(sprite, x, (sin(time()*speed)*amount)+y, 4, 3)
spr(sprite, x, (-sin(time()*speed)*amount)+y+85, 4, 3, false,true)
- addportalthruster(x+6,y-4)
- addportalthruster(x+6,y+97,-1)
- clip(0,0,x+17+circletimex/3,128)
+ addportalthruster(x+6,y-4,1)
+ addportalthruster(x+6,y+97,2,-1)
+ clip(0,0,x+17,128)
end
function enemy.update()
- enemy.y = 10+sin(time()*enemy.speed+0.2)*2 --bouncy!!!!
enemy.x = lerp(enemy.x, 103, 0.025)--lerps into place
if enemy.shootcooldown < 0 then
enemy.shootcooldown = 1
- addbasicenemy(115,rnd(30)+50,0.4+rnd(0.6))
- if flr(currentwavetime%14+8) == 13 then
+ if #enemies < 2 then
+ for i = 1, 10, 1 do
+ addbullet(110,64, rnd(0.5)-1, rnd(2)-1)
+ end
+ if rnd() < 0.4 then
+ addmissile(110, 60, 1)
+ end
+ end
+ if rnd() < 0.4 then
+ addbasicenemy(115,rnd(30)+50,0.4+rnd(0.6))
+ elseif rnd() < 0.02 then
+ addtargetingenemy(115, rnd(30)+50, 0.2)
+ end
+ if flr(currentwavetime%14) == 5 then
local moves = {
function()
- addballshooter(110, 48, 0.08)
- addballshooter(110, 72, 0.08)
+ if currentwavetime < 20 then
+ addballshooter(110, 56, 0.08)
+ else
+ addballshooter(110, 40, 0.08)
+ addballshooter(140, 72, 0.08)
+ end
end,
function()
- addwallboss(110, 35, 7, 30, 0.05, false, 3, false)
+ addwallboss(110, 30, 8, 30, 0.05, false, 3, false)
end,
function()
for i = 1, 7, 1 do
addwallshooter(100 + (54-i)*i, (i%2==1), 10, 0.4)
end
+ addlasershooter(128,48,100,0.2,false,false)
+ addbomb(128, 48, 9)
end,
+ function ()
+ for i = 1, 5, 1 do
+ addtargetingenemy(128, i*10+32, 0.085)
+ end
+ end
}
moves[flr((currentwavetime/14)%#moves+1)]()
end
end
enemymisc(enemy)
- if enemy.health <= 0 then -- die!!!!!
- enemydie(enemy,17,2,1000)
- end
+ enemydie(enemy,17,2,1000,true) --die!!!!!!!
end
add(enemies, enemy)