smg.lua 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. local SMG = extend(app.logic.spell)
  2. SMG.code = 'smg'
  3. SMG.duration = .12
  4. SMG.activate = function(self)
  5. self.timer = self.duration
  6. self.x = self.owner.x
  7. self.y = self.owner.y
  8. local dir = self.owner.angle
  9. local dx, dy = self.owner.class.handx * self.owner.class.scale, self.owner.class.handy * self.owner.class.scale
  10. self.x = self.x + math.dx(dx, dir) - math.dy(dy, dir)
  11. self.y = self.y + math.dy(dx, dir) + math.dx(dy, dir)
  12. dx, dy = data.weapon.smg.tipx * data.weapon.smg.scale, data.weapon.smg.tipy * data.weapon.smg.scale
  13. self.x = self.x + math.dx(dx, dir) - math.dy(dy, dir)
  14. self.y = self.y + math.dy(dx, dir) + math.dx(dy, dir)
  15. self.angle = self.owner.angle
  16. love.math.setRandomSeed(tick * 123456789 % (2 ^ 50), tick * 987654321 % (2 ^ 50))
  17. self.angle = self.angle - (data.weapon.smg.spread / 2) + (love.math.random() * data.weapon.smg.spread)
  18. self.len = 0
  19. local target = nil
  20. if not ctx.collision:lineTest(self.owner.x, self.owner.y, self.x, self.y, {tag = 'wall'}) then
  21. local hit, dis = ctx.collision:lineTest(self.x, self.y, self.x + math.dx(900, self.angle), self.y + math.dy(900, self.angle), {tag = 'wall', first = true})
  22. self.len = hit and dis or 900
  23. target = ctx.collision:lineTest(self.x, self.y, self.x + math.dx(self.len, self.angle), self.y + math.dy(self.len, self.angle), {
  24. tag = 'player',
  25. fn = function(p)
  26. return p.team ~= self.owner.team
  27. end,
  28. first = true
  29. })
  30. end
  31. if target then
  32. self.len = math.distance(self.x, self.y, target.x, target.y)
  33. ctx.net:emit(app.net.events.damage, {id = target.id, amount = data.weapon.smg.damage, from = self.owner.id, tick = tick})
  34. end
  35. for _ = 1, 4 do
  36. ctx.event:emit('particle.create', {
  37. kind = 'spark',
  38. vars = {
  39. x = self.x,
  40. y = self.y,
  41. angle = self.angle + love.math.random() * 1.56 - .78
  42. }
  43. })
  44. end
  45. if not target and self.len < 900 then
  46. for _ = 1, 4 do
  47. ctx.event:emit('particle.create', {
  48. kind = 'spark',
  49. vars = {
  50. x = self.x + math.dx(self.len, self.angle),
  51. y = self.y + math.dy(self.len, self.angle),
  52. angle = self.angle + math.pi + love.math.random() * 2.08 - 1.04
  53. }
  54. })
  55. end
  56. end
  57. if target then
  58. for _ = 1, 4 do
  59. ctx.event:emit('particle.create', {
  60. kind = 'blood',
  61. vars = {
  62. x = target.x - 10 + love.math.random() * 20,
  63. y = target.y - 10 + love.math.random() * 20
  64. }
  65. })
  66. end
  67. end
  68. ctx.event:emit('particle.create', {
  69. kind = 'muzzleFlash',
  70. vars = {
  71. owner = self.owner.id,
  72. weapon = 'smg'
  73. }
  74. })
  75. ctx.event:emit('particle.create', {
  76. kind = 'shell',
  77. vars = {
  78. x = self.x,
  79. y = self.y,
  80. direction = self.owner.angle + love.math.random() * .8 - .4
  81. }
  82. })
  83. self:playSound('smg')
  84. end
  85. SMG.update = function(self)
  86. self:rot()
  87. end
  88. SMG.draw = function(self)
  89. local function doDraw()
  90. local alpha = self.timer / self.duration
  91. love.graphics.setColor(255, 255, 255, alpha * 255)
  92. love.graphics.line(self.x, self.y, self.x + math.cos(self.angle) * self.len, self.y + math.sin(self.angle) * self.len)
  93. end
  94. doDraw()
  95. ctx.effects:get('bloom'):render(doDraw)
  96. end
  97. return SMG