Update pain2.lua

This commit is contained in:
LDDestroier 2019-04-09 18:45:53 -04:00 committed by GitHub
parent c28a77d79e
commit eee5c5445c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 280 additions and 176 deletions

456
pain2.lua
View File

@ -1,10 +1,13 @@
-- pain2 -- pain2
local scr_x, scr_y = term.getSize() local scr_x, scr_y = term.getSize()
local mx, my = scr_x/2, scr_y/2 local mx, my = scr_x/2, scr_y/2 -- midpoint of screen
local keysDown = {} local keysDown = {} -- list of all pushed keys
local miceDown = {} local miceDown = {} -- list of all clicked mice buttons
local dragPoses = {{{},{}}, {{},{}}, {{},{}}} local dragPoses = {{{},{}}, {{},{}}, {{},{}}} -- records initial and current mouse position per button while scrolling
local TICKNO = 0 -- iterates every time main() loops
local flashPaletteOnBar = false -- whether or not to flash the dot palette numbers on the bottom bar
-- debug renderer is slower, but the normal one isn't functional yet -- debug renderer is slower, but the normal one isn't functional yet
local useDebugRenderer = false local useDebugRenderer = false
@ -124,17 +127,23 @@ local control = {
moveMod = { moveMod = {
key = keys.leftShift, key = keys.leftShift,
holdDown = true, holdDown = true,
modifiers = {}, modifiers = {
[keys.leftShift] = true
},
}, },
creepMod = { creepMod = {
key = keys.leftAlt, key = keys.leftAlt,
holdDown = true, holdDown = true,
modifiers = {}, modifiers = {
[keys.leftAlt] = true
},
}, },
toolSelect = { toolMod = {
key = keys.leftShift, key = keys.leftShift,
holdDown = true, holdDown = true,
modifiers = {}, modifiers = {
[keys.leftShift] = true
},
}, },
pencilTool = { pencilTool = {
key = keys.p, key = keys.p,
@ -164,6 +173,76 @@ local control = {
[keys.leftShift] = true [keys.leftShift] = true
}, },
}, },
selectPalette_0 = {
key = keys.zero,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_1 = {
key = keys.one,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_2 = {
key = keys.two,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_3 = {
key = keys.three,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_4 = {
key = keys.four,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_5 = {
key = keys.five,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_6 = {
key = keys.six,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_7 = {
key = keys.seven,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_8 = {
key = keys.eight,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
selectPalette_9 = {
key = keys.nine,
holdDown = false,
modifiers = {
[keys.leftShift] = true
},
},
} }
local checkControl = function(name) local checkControl = function(name)
@ -275,6 +354,7 @@ end
-- deletes a dot on the canvas, fool -- deletes a dot on the canvas, fool
local deleteDot = function(x, y, frame) local deleteDot = function(x, y, frame)
x, y = 1 + x - pain.size.x, 1 + y - pain.size.y
if canvas[frame][1][y] then if canvas[frame][1][y] then
if canvas[frame][1][y][x] then if canvas[frame][1][y][x] then
canvas[frame][1][y][x] = nil canvas[frame][1][y][x] = nil
@ -286,6 +366,7 @@ end
-- places a dot on the canvas, predictably enough -- places a dot on the canvas, predictably enough
local placeDot = function(x, y, frame, dot) local placeDot = function(x, y, frame, dot)
x, y = 1 - pain.size.x + x, 1 - pain.size.y + y
if not canvas[frame][1][y] then if not canvas[frame][1][y] then
canvas[frame][1][y] = {} canvas[frame][1][y] = {}
canvas[frame][2][y] = {} canvas[frame][2][y] = {}
@ -347,20 +428,28 @@ local render = function(x, y, width, height)
else else
local gChar, gText, gBack local gChar, gText, gBack
for yy = y, height do for yy = 1, -1 + height + y do
buffer[1][yy] = "" buffer[1][yy] = ""
buffer[2][yy] = "" buffer[2][yy] = ""
buffer[3][yy] = "" buffer[3][yy] = ""
if pain.showBar and yy == height then if pain.showBar and yy == height then
buffer[2][yy] = ("f"):rep(width) term.setTextColor(colors.black)
buffer[3][yy] = ("8"):rep(width) term.setBackgroundColor(colors.lightGray)
buffer[1][yy] = (( term.setCursorPos(pain.size.x, -1 + pain.size.y + pain.size.height)
term.write("[" .. pain.scrollX .. "," .. pain.scrollY .. "] ")
"["..pain.scrollX..","..pain.scrollY.."] "..pain.barmsg for i = 1, #pain.dots do
if flashPaletteOnBar then
) .. (" "):rep(width)):sub(1, width) term.blit(table.unpack(pain.dots[i]))
else
term.blit(tostring(i), "7", pain.dots[i][3])
end
end
if pain.barlife > 0 then
term.write(" " .. pain.barmsg)
end
term.write((" "):rep(x + width - term.getCursorPos()))
else else
for xx = x, width do for xx = 1, width do
cx = xx + pain.scrollX cx = xx + pain.scrollX
cy = yy + pain.scrollY cy = yy + pain.scrollY
if canvas[frame][1][cy] then if canvas[frame][1][cy] then
@ -384,7 +473,7 @@ local render = function(x, y, width, height)
end end
end end
for yy = 0, height - 1 do for yy = 0, height - 1 do
term.setCursorPos(1, y + yy) term.setCursorPos(x, y + yy)
term.blit(buffer[1][yy+1], buffer[2][yy+1], buffer[3][yy+1]) term.blit(buffer[1][yy+1], buffer[2][yy+1], buffer[3][yy+1])
end end
@ -393,64 +482,80 @@ end
-- every tool at your disposal -- every tool at your disposal
local tools = { local tools = {
pencil = function(arg) pencil = {
if arg.event == "mouse_click" then info = {
if arg.button == 1 then name = "Pencil",
placeDot(arg.sx, arg.sy, frame, arg.dot) swapTool = "line", -- if swap button is held, will turn into this tool
elseif arg.button == 2 then swapArg = { -- any values in this table will overwrite those in 'arg'
deleteDot(arg.sx, arg.sy, frame) size = 1
end },
dragPos = {arg.sx, arg.sy} },
else run = function(arg)
if #dragPos == 0 then if arg.event == "mouse_click" then
dragPos = {arg.sx, arg.sy}
end
local poses = getDotsInLine(arg.sx, arg.sy, dragPos[1], dragPos[2])
for i = 1, #poses do
if arg.button == 1 then if arg.button == 1 then
placeDot(poses[i].x, poses[i].y, frame, arg.dot) placeDot(arg.sx, arg.sy, frame, arg.dot)
elseif arg.button == 2 then elseif arg.button == 2 then
deleteDot(poses[i].x, poses[i].y, frame) deleteDot(arg.sx, arg.sy, frame)
end end
end dragPos = {arg.sx, arg.sy}
dragPos = {arg.sx, arg.sy} else
end if #dragPos == 0 then
end, dragPos = {arg.sx, arg.sy}
brush = function(arg) end
if arg.event == "mouse_click" then local poses = getDotsInLine(arg.sx, arg.sy, dragPos[1], dragPos[2])
for y = -arg.size, arg.size do for i = 1, #poses do
for x = -arg.size, arg.size do if arg.button == 1 then
if math.sqrt(x^2 + y^2) <= arg.size / 2 then placeDot(poses[i].x, poses[i].y, frame, arg.dot)
if arg.button == 1 then elseif arg.button == 2 then
placeDot(arg.sx + x, arg.sy + y, frame, arg.dot) deleteDot(poses[i].x, poses[i].y, frame)
elseif arg.button == 2 then
deleteDot(arg.sx + x, arg.sy + y, frame)
end
end end
end end
end
dragPos = {arg.sx, arg.sy}
else
if #dragPos == 0 then
dragPos = {arg.sx, arg.sy} dragPos = {arg.sx, arg.sy}
end end
local poses = getDotsInLine(arg.sx, arg.sy, dragPos[1], dragPos[2]) end
for i = 1, #poses do },
brush = {
info = {
name = "Brush",
swapTool = "line",
swapArg = {},
},
run = function(arg)
if arg.event == "mouse_click" then
for y = -arg.size, arg.size do for y = -arg.size, arg.size do
for x = -arg.size, arg.size do for x = -arg.size, arg.size do
if math.sqrt(x^2 + y^2) <= arg.size / 2 then if math.sqrt(x^2 + y^2) <= arg.size / 2 then
if arg.button == 1 then if arg.button == 1 then
placeDot(poses[i].x + x, poses[i].y + y, frame, arg.dot) placeDot(arg.sx + x, arg.sy + y, frame, arg.dot)
elseif arg.button == 2 then elseif arg.button == 2 then
deleteDot(poses[i].x + x, poses[i].y + y, frame) deleteDot(arg.sx + x, arg.sy + y, frame)
end end
end end
end end
end end
dragPos = {arg.sx, arg.sy}
else
if #dragPos == 0 then
dragPos = {arg.sx, arg.sy}
end
local poses = getDotsInLine(arg.sx, arg.sy, dragPos[1], dragPos[2])
for i = 1, #poses do
for y = -arg.size, arg.size do
for x = -arg.size, arg.size do
if math.sqrt(x^2 + y^2) <= arg.size / 2 then
if arg.button == 1 then
placeDot(poses[i].x + x, poses[i].y + y, frame, arg.dot)
elseif arg.button == 2 then
deleteDot(poses[i].x + x, poses[i].y + y, frame)
end
end
end
end
end
dragPos = {arg.sx, arg.sy}
end end
dragPos = {arg.sx, arg.sy}
end end
end, },
text = function(arg) text = function(arg)
pain.paused = true pain.paused = true
pain.barmsg = "Type text to add to canvas." pain.barmsg = "Type text to add to canvas."
@ -468,66 +573,82 @@ local tools = {
keysDown = {} keysDown = {}
miceDown = {} miceDown = {}
end, end,
line = function(arg) line = {
local dots info = {
while miceDown[arg.button] do name = "Line",
dots = getDotsInLine( swapTool = "pencil",
dragPoses[arg.button][1].x + (arg.scrollX - pain.scrollX), },
dragPoses[arg.button][1].y + (arg.scrollY - pain.scrollY), run = function(arg)
dragPoses[arg.button][2].x, local dots
dragPoses[arg.button][2].y while miceDown[arg.button] do
) dots = getDotsInLine(
render() dragPoses[arg.button][1].x + (arg.scrollX - pain.scrollX),
for i = 1, #dots do dragPoses[arg.button][1].y + (arg.scrollY - pain.scrollY),
if dots[i].x >= 1 and dots[i].x <= scr_x then dragPoses[arg.button][2].x,
for y = -arg.size, arg.size do dragPoses[arg.button][2].y
for x = -arg.size, arg.size do )
if math.sqrt(x^2 + y^2) <= arg.size / 2 then render()
term.setCursorPos(dots[i].x + x, dots[i].y + y) for i = 1, #dots do
if arg.button == 1 then if dots[i].x >= pain.size.x and dots[i].x < pain.size.x + pain.size.width then
term.blit(table.unpack(arg.dot)) for y = -arg.size, arg.size do
elseif arg.button == 2 then for x = -arg.size, arg.size do
term.blit(getGridAtPos(dots[i].x + pain.scrollX, dots[i].y + pain.scrollY)) if math.sqrt(x^2 + y^2) <= arg.size / 2 then
if (not pain.showBar) or dots[i].y + y < -1 + pain.size.y + pain.size.height then
term.setCursorPos(dots[i].x + x, dots[i].y + y)
if arg.button == 1 then
term.blit(table.unpack(arg.dot))
elseif arg.button == 2 then
term.blit(getGridAtPos(dots[i].x + pain.scrollX, dots[i].y + pain.scrollY))
end
end
end end
end end
end end
end end
end end
end
os.pullEvent() os.pullEvent()
end end
for i = 1, #dots do -- write dots to canvas
for y = -arg.size, arg.size do for i = 1, #dots do
for x = -arg.size, arg.size do for y = -arg.size, arg.size do
if math.sqrt(x^2 + y^2) <= arg.size / 2 then for x = -arg.size, arg.size do
if arg.button == 1 then if math.sqrt(x^2 + y^2) <= arg.size / 2 then
placeDot(dots[i].x + x + pain.scrollX, dots[i].y + y + pain.scrollY, frame, arg.dot) if arg.button == 1 then
elseif arg.button == 2 then placeDot(dots[i].x + x + pain.scrollX, dots[i].y + y + pain.scrollY, frame, arg.dot)
deleteDot(dots[i].x + x + pain.scrollX, dots[i].y + y + pain.scrollY, frame) elseif arg.button == 2 then
deleteDot(dots[i].x + x + pain.scrollX, dots[i].y + y + pain.scrollY, frame)
end
end end
end end
end end
end end
end end
end, },
} }
local tryTool = function() local tryTool = function()
local swapArg, t = {}
if checkControl("toolMod") then
t = tools[tools[pain.tool].info.swapTool]
swapArg = tools[pain.tool].info.swapArg or {}
else
t = tools[pain.tool]
end
for butt = 1, 3 do for butt = 1, 3 do
if miceDown[butt] and tools[pain.tool] then if miceDown[butt] and t then
tools[pain.tool]({ t.run({
x = miceDown[butt].x, x = swapArg.x or miceDown[butt].x,
y = miceDown[butt].y, y = swapArg.y or miceDown[butt].y,
sx = miceDown[butt].x + pain.scrollX, sx = swapArg.sx or ((swapArg.x or miceDown[butt].x) + pain.scrollX),
sy = miceDown[butt].y + pain.scrollY, sy = swapArg.sy or ((swapArg.y or miceDown[butt].y) + pain.scrollY),
scrollX = pain.scrollX, scrollX = swapArg.scrollX or pain.scrollX,
scrollY = pain.scrollY, scrollY = swapArg.scrollY or pain.scrollY,
frame = frame, frame = swapArg.frame or frame,
dot = pain.dots[dot], dot = swapArg.dot or pain.dots[dot],
size = pain.brushSize, size = swapArg.size or pain.brushSize,
button = butt, button = swapArg.button or butt,
event = miceDown[butt].event event = swapArg.event or miceDown[butt].event
}) })
pain.doRender = true pain.doRender = true
break break
@ -540,22 +661,28 @@ local getInput = function()
while true do while true do
evt = {os.pullEvent()} evt = {os.pullEvent()}
if evt[1] == "mouse_click" or evt[1] == "mouse_drag" then if evt[1] == "mouse_click" or evt[1] == "mouse_drag" then
dragPoses[evt[2]] = { if evt[3] >= pain.size.x and evt[3] <= -1 + pain.size.x + pain.size.width and evt[4] >= pain.size.y and evt[4] <= -1 + pain.size.y + pain.size.height then
{ if evt[4] == -1 + pain.size.y + pain.size.height then
x = dragPoses[evt[2]][1].x or evt[3], -- openBarMenu()
y = dragPoses[evt[2]][1].y or evt[4] else
}, dragPoses[evt[2]] = {
{ {
x = evt[3], x = dragPoses[evt[2]][1].x or evt[3],
y = evt[4] y = dragPoses[evt[2]][1].y or evt[4]
} },
} {
miceDown[evt[2]] = { x = evt[3],
event = evt[1], y = evt[4]
button = evt[2], }
x = evt[3], }
y = evt[4], miceDown[evt[2]] = {
} event = evt[1],
button = evt[2],
x = evt[3],
y = evt[4],
}
end
end
elseif evt[1] == "key" then elseif evt[1] == "key" then
keysDown[evt[2]] = true keysDown[evt[2]] = true
elseif evt[1] == "mouse_up" then elseif evt[1] == "mouse_up" then
@ -572,6 +699,15 @@ main = function()
while true do while true do
if not pain.paused then if not pain.paused then
if TICKNO % 30 <= 20 then
flashPaletteOnBar = true
pain.doRender = true
elseif (TICKNO + 3) % 30 <= 20 then
flashPaletteOnBar = false
pain.doRender = true
end
if pain.doRender then if pain.doRender then
render() render()
pain.doRender = false pain.doRender = false
@ -610,65 +746,31 @@ main = function()
pain.doRender = true pain.doRender = true
end end
end end
for i = 0, 9 do
if checkControl("toolSelect") then if checkControl("selectPalette_" .. i) then
-- dot palette selection if pain.dots[i] then
if keysDown[keys.one] and pain.dots[1] then dot = i
dot = 1 setBarMsg("Selected palette " .. dot .. ".")
setBarMsg("Selected palette " .. dot .. ".") break
pain.doRender = true else
elseif keysDown[keys.two] and pain.dots[2] then setBarMsg("There is no palette " .. i .. ".")
dot = 2 break
setBarMsg("Selected palette " .. dot .. ".") end
pain.doRender = true
elseif keysDown[keys.three] and pain.dots[3] then
dot = 3
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.four] and pain.dots[4] then
dot = 4
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.five] and pain.dots[5] then
dot = 5
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.six] and pain.dots[6] then
dot = 6
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.seven] and pain.dots[7] then
dot = 7
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.eight] and pain.dots[8] then
dot = 8
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.nine] and pain.dots[9] then
dot = 9
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
elseif keysDown[keys.zero] and pain.dots[0] then
dot = 0
setBarMsg("Selected palette " .. dot .. ".")
pain.doRender = true
end
else
if checkControl("pencilTool") then
pain.tool = "pencil"
setBarMsg("Selected pencil tool.")
elseif checkControl("textTool") then
pain.tool = "text"
setBarMsg("Selected text tool.")
elseif checkControl("brushTool") then
pain.tool = "brush"
setBarMsg("Selected brush tool.")
elseif checkControl("lineTool") then
pain.tool = "line"
setBarMsg("Selected line tool.")
end end
end end
if checkControl("pencilTool") then
pain.tool = "pencil"
setBarMsg("Selected pencil tool.")
elseif checkControl("textTool") then
pain.tool = "text"
setBarMsg("Selected text tool.")
elseif checkControl("brushTool") then
pain.tool = "brush"
setBarMsg("Selected brush tool.")
elseif checkControl("lineTool") then
pain.tool = "line"
setBarMsg("Selected line tool.")
end
pain.barlife = math.max(pain.barlife - 1, 0) pain.barlife = math.max(pain.barlife - 1, 0)
if pain.barlife == 0 and pain.barmsg ~= "" then if pain.barlife == 0 and pain.barmsg ~= "" then
@ -678,7 +780,9 @@ main = function()
end end
TICKNO = TICKNO + 1
sleep(0.05) sleep(0.05)
end end
end end