xspeed = 0; yspeed = 0; maxSpeed = 50; friction = 3; mode = 0; function regulateSpeed() if (xspeed > maxSpeed) then xspeed = maxSpeed; elseif (xspeed < (-1)*maxSpeed) then xspeed = (-1)*maxSpeed; end if (yspeed > maxSpeed) then yspeed = maxSpeed; elseif (yspeed < (-1)*maxSpeed) then yspeed = (-1)*maxSpeed; end end function moveLaserTo(line, p, delta) local geom = line:getGeom(); local dir = point.angleTo(geom[2], p) - (math.pi/6) + (math.random()*math.pi*2/6); local speedAdd = point.new(friction*math.cos(dir), friction*math.sin(dir)); xspeed = xspeed + speedAdd.x; yspeed = yspeed + speedAdd.y; regulateSpeed(); geom[2] = geom[2] + point.new(xspeed, yspeed); line:setGeom(geom); end function onNexusOpened() mode = 1; end function onNexusClosed() mode = 0; local line = bf:findObjectById(1); local geom = line:getGeom(); geom[2] = geom[1]; line:setGeom(geom); xspeed = 0; yspeed = 0; end function onTick(delta) if (mode == 1) then local line = bf:findObjectById(1); local ships = {}; local closest = nil; local dist = 0; bf:findAllObjects(ships, ObjType.Ship, ObjType.Robot); --logprint(ships[1]); for i,ship in ipairs(ships) do local currDist = point.distSquared(ship:getPos(), line:getGeom()[2]); if (currDist < dist or dist == 0) then closest = ship; dist = currDist; end end if (closest ~= nil) then moveLaserTo(line, closest:getPos(), delta); local tip = line:getGeom()[2]; local item = Burst.new(); item:setPos(tip); bf:addItem(item); else xspeed = 0; yspeed = 0; end end end function main() subscribe(Event.Tick); subscribe(Event.NexusOpened); subscribe(Event.NexusClosed); --subscribe(Event.ShipEnteredZone); for i=0, 50 do logprint(""); end end