energyrifle.lua 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. local EnergyRifle = extend(app.logic.spell)
  2. EnergyRifle.code = 'energyrifle'
  3. EnergyRifle.image = data.media.graphics.effects.pulse
  4. EnergyRifle.scale = 2
  5. EnergyRifle.anchorx = 20
  6. EnergyRifle.anchory = 2
  7. EnergyRifle.speed = 1600
  8. function EnergyRifle:activate()
  9. self:mirrorOwner()
  10. self:lerpInit()
  11. self.ded = false
  12. local dx, dy = self.owner.class.handx * self.owner.class.scale, self.owner.class.handy * self.owner.class.scale
  13. self.x = self.x + math.dx(dx, self.angle) - math.dy(dy, self.angle)
  14. self.y = self.y + math.dy(dx, self.angle) + math.dx(dy, self.angle)
  15. dx, dy = data.weapon.energyrifle.tipx * data.weapon.energyrifle.scale, data.weapon.energyrifle.tipy * data.weapon.energyrifle.scale
  16. self.x = self.x + math.dx(dx, self.angle) - math.dy(dy, self.angle)
  17. self.y = self.y + math.dy(dx, self.angle) + math.dx(dy, self.angle)
  18. for _ = 1, 4 do
  19. ctx.event:emit('particle.create', {
  20. kind = 'spark',
  21. vars = {
  22. x = self.x,
  23. y = self.y,
  24. angle = self.angle + love.math.random() * 1.56 - .78
  25. }
  26. })
  27. end
  28. ctx.event:emit('particle.create', {
  29. kind = 'muzzleFlash',
  30. vars = {
  31. owner = self.owner.id,
  32. weapon = 'energyrifle'
  33. }
  34. })
  35. self:playSound('pulse')
  36. if ctx.collision:lineTest(self.owner.x, self.owner.y, self.x, self.y, {tag = 'wall'}) then
  37. ctx.spells:deactivate(self)
  38. end
  39. end
  40. function EnergyRifle:update()
  41. self:lerpUpdate()
  42. local distance = self.speed * tickRate
  43. local wallDistance = self:wallDistance(distance)
  44. local enemy = self:enemiesInLine(wallDistance)
  45. if enemy then
  46. ctx.buffs:add(enemy, 'plasmasickness')
  47. self:damage(enemy, data.weapon.energyrifle.damage)
  48. end
  49. self:move(wallDistance)
  50. if wallDistance < distance or enemy then self:die() end
  51. end
  52. function EnergyRifle:draw()
  53. local x, y = self:lerpGet()
  54. local function doDraw()
  55. love.graphics.setColor(255, 255, 255)
  56. self:drawImage({x = x, y = y})
  57. end
  58. doDraw()
  59. ctx.effects:get('bloom'):render(doDraw)
  60. end
  61. return EnergyRifle