-- TODO: rewrite ---@class Mouse ---@field x integer ---@field y integer ---@field pressed boolean ---@field lastPressed boolean ---@field startX integer ---@field startY integer ---@field dragged boolean ---@field lastLine Line? ---@field lastPoint GridPoint? ---@field point GridPoint Mouse = { x = 0, y = 0, pressed = false, lastPressed = false, startX = -1, startY = -1, dragged = false, lastLine = nil, lastPoint = nil, point = GridPoint:new( 0, 0 ) } -- TODO: fix collision with other line's endpoint function Mouse:update() Mouse.x, Mouse.y = love.mouse.getPosition() Mouse.x = Mouse.x + 1 Mouse.y = Mouse.y + 1 Mouse.lastPoint = Mouse.point Mouse.lastPressed = Mouse.pressed Mouse.pressed = love.mouse.isDown( 1 ) if InMenu then return end Mouse.point = GridPoint.snapCoords( Point:new( Mouse.x, Mouse.y ) ) if Mouse.lastLine ~= nil then local pointsLen = #Mouse.lastLine.points local lastLinePoint = Mouse.lastLine.points[pointsLen] if Mouse.point:distanceTo( lastLinePoint ) == 1 and GameGrid:inBounds( Mouse.point ) and GameGrid:matchesLine( Mouse.point, true ) == nil and not lastLinePoint:equals( Mouse.lastLine.endpoint ) and not GameGrid:isOtherEndpoint( Mouse.lastLine, Mouse.point ) then Mouse.lastLine:push( Mouse.point ) elseif Mouse.lastLine:has( Mouse.point ) and not Mouse.point:equals( lastLinePoint ) then while not Mouse.lastLine.points[#Mouse.lastLine.points]:equals( Mouse.point ) do Mouse.lastLine:pop() end end end Mouse.dragged = Mouse.pressed and Mouse.startX > 0 and Point.distanceTo ( Point:new( Mouse.x, Mouse.y ), Point:new( Mouse.startX, Mouse.startY ) ) > Config.dragSensivity if not Mouse.pressed and Mouse.startX > 0 then Mouse.startX = -1 Mouse.startY = -1 Mouse.lastLine = nil end if not Mouse.lastPressed and Mouse.pressed and Mouse.startX < 0 then Mouse.startX = Mouse.x Mouse.startY = Mouse.y Mouse.lastLine = GameGrid:matchesLine( Mouse.point, false ) end end