| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- local SMG = extend(app.logic.spell)
- SMG.code = 'smg'
- SMG.duration = .12
- SMG.activate = function(self)
- self.timer = self.duration
- self.x = self.owner.x
- self.y = self.owner.y
- local dir = self.owner.angle
- local dx, dy = self.owner.class.handx * self.owner.class.scale, self.owner.class.handy * self.owner.class.scale
- self.x = self.x + math.dx(dx, dir) - math.dy(dy, dir)
- self.y = self.y + math.dy(dx, dir) + math.dx(dy, dir)
- dx, dy = data.weapon.smg.tipx * data.weapon.smg.scale, data.weapon.smg.tipy * data.weapon.smg.scale
- self.x = self.x + math.dx(dx, dir) - math.dy(dy, dir)
- self.y = self.y + math.dy(dx, dir) + math.dx(dy, dir)
- self.angle = self.owner.angle
- love.math.setRandomSeed(tick * 123456789 % (2 ^ 50), tick * 987654321 % (2 ^ 50))
- self.angle = self.angle - (data.weapon.smg.spread / 2) + (love.math.random() * data.weapon.smg.spread)
- self.len = 0
- local target = nil
- if not ctx.collision:lineTest(self.owner.x, self.owner.y, self.x, self.y, {tag = 'wall'}) then
- 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})
- self.len = hit and dis or 900
- target = ctx.collision:lineTest(self.x, self.y, self.x + math.dx(self.len, self.angle), self.y + math.dy(self.len, self.angle), {
- tag = 'player',
- fn = function(p)
- return p.team ~= self.owner.team
- end,
- first = true
- })
- end
- if target then
- self.len = math.distance(self.x, self.y, target.x, target.y)
- ctx.net:emit(app.net.events.damage, {id = target.id, amount = data.weapon.smg.damage, from = self.owner.id, tick = tick})
- end
- for _ = 1, 4 do
- ctx.event:emit('particle.create', {
- kind = 'spark',
- vars = {
- x = self.x,
- y = self.y,
- angle = self.angle + love.math.random() * 1.56 - .78
- }
- })
- end
- if not target and self.len < 900 then
- for _ = 1, 4 do
- ctx.event:emit('particle.create', {
- kind = 'spark',
- vars = {
- x = self.x + math.dx(self.len, self.angle),
- y = self.y + math.dy(self.len, self.angle),
- angle = self.angle + math.pi + love.math.random() * 2.08 - 1.04
- }
- })
- end
- end
- if target then
- for _ = 1, 4 do
- ctx.event:emit('particle.create', {
- kind = 'blood',
- vars = {
- x = target.x - 10 + love.math.random() * 20,
- y = target.y - 10 + love.math.random() * 20
- }
- })
- end
- end
- ctx.event:emit('particle.create', {
- kind = 'muzzleFlash',
- vars = {
- owner = self.owner.id,
- weapon = 'smg'
- }
- })
- ctx.event:emit('particle.create', {
- kind = 'shell',
- vars = {
- x = self.x,
- y = self.y,
- direction = self.owner.angle + love.math.random() * .8 - .4
- }
- })
- self:playSound('smg')
- end
- SMG.update = function(self)
- self:rot()
- end
- SMG.draw = function(self)
- local function doDraw()
- local alpha = self.timer / self.duration
- love.graphics.setColor(255, 255, 255, alpha * 255)
- love.graphics.line(self.x, self.y, self.x + math.cos(self.angle) * self.len, self.y + math.sin(self.angle) * self.len)
- end
- doDraw()
- ctx.effects:get('bloom'):render(doDraw)
- end
- return SMG
|