Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Initialize variables
- args = {...}
- termW, termH = term.getSize()
- if not size then
- if args[2] then
- size = tonumber(args[2])
- else
- size = 17
- end
- end
- if not level then
- if args[1] then
- level = tonumber(args[1])
- else
- level = 0
- end
- end
- -- Data validation
- checkVars = function()
- -- Make size odd
- size = (math.floor(size / 2) * 2) + 1
- -- Limit size
- if size > 17 then
- size = 17
- elseif size < 1 then
- size = 1
- end
- -- Limit level
- if level < -8 then
- level = -8
- elseif level > 8 then
- level = 8
- end
- end
- -- Create map table
- getMap = function()
- map = {}
- for row = 1, 17 do
- local rows = {}
- for col = 1, 17 do
- table.insert(rows, {tile = "#", selected = false})
- end
- table.insert(map, rows)
- end
- end
- drawMap = function()
- -- Ensure map fits
- trim = 0
- offset = math.floor((17-size)/2) - math.floor((termH-size)/2)
- if termH > 17 then
- trim = 0
- offset = 0
- elseif termH < size + 1 then
- trim = math.ceil((size - termH) / 2)
- offset = math.floor((17 - size) / 2)
- end
- -- Draw map
- term.clear()
- for row = 9 - ((size-1)/2) + trim, 9 + ((size-1)/2) - trim do
- for col = 9 - (size-1)/2, 9 + (size-1)/2 do
- termX = (2 * col) - 1
- termY = row - trim - offset
- map[row][col].tPos = termX .. ":" .. termY
- map[row][col].pos = row .. ":" .. col
- term.setCursorPos(termX, termY)
- if map[row][col].selected then
- write("X")
- else write(map[row][col].tile) end
- end
- end
- -- Display useless information
- if size > 9 then
- disSize = "S:" .. size
- else
- disSize = "S: " .. size
- end
- if level < 0 then
- disLevel = "Y:" .. level
- else
- disLevel = "Y: " .. level
- end
- term.setCursorPos(termW - #disSize + 1, 1)
- write(disSize)
- term.setCursorPos(termW - #disLevel + 1, 2)
- write(disLevel)
- term.setCursorPos(1, termH)
- term.clearLine()
- countS = 0
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].selected then
- countS = countS + 1
- selected = map[r][c].pos
- end
- end
- end
- if countS > 1 then
- write(countS .. " Selected")
- elseif countS == 1 then
- write(selected .. " Selected")
- end
- end
- -- Main loop
- getMap()
- while true do
- checkVars()
- drawMap()
- evt, e1, e2, e3 = os.pullEvent()
- if evt == "key" then
- -- Spacebar to clear selection
- if e1 == keys.space then
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].selected then
- map[r][c].selected = false
- end
- end
- end
- -- Arrows to change level and size
- elseif e1 == keys.up then
- level = level+1
- elseif e1 == keys.down then
- level = level-1
- elseif e1 == keys.left then
- size = size-2
- elseif e1 == keys.right then
- size = size+2
- -- Hold Left Ctrl to Multi-select
- elseif e1 == keys.leftCtrl then
- selecting = true
- while selecting == true do
- sEvt,eA,eB,eC = os.pullEvent()
- if sEvt == "mouse_click" and eA == 1 then
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].tPos == eB..":"..eC then
- if map[r][c].selected then
- map[r][c].selected = false
- else
- map[r][c].selected = true
- end
- drawMap()
- end
- end
- end
- elseif eA == keys.leftCtrl and sEvt == "key_up" then
- selecting = false end
- end
- end
- elseif evt == "mouse_click" then
- -- Left click to single select
- if e1 == 1 then
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].tPos == e2..":"..e3 then
- if not map[r][c].selected then
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].selected then
- map[r][c].selected = false
- end
- end
- end
- map[r][c].selected = true
- end
- end
- end
- end
- -- Right click to mass-select
- elseif e1 == 2 then
- startX = nil
- startY = nil
- endX = nil
- endY = nil
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].tPos == e2..":"..e3 then
- pos = map[r][c].pos
- startX = pos:sub(1,string.find(pos,":")-1)
- startY = pos:sub(string.find(pos,":")+1,#pos)
- term.setCursorPos(1,termH)
- term.clearLine()
- write("Mass-selecting from "..pos)
- pos = map[r][c].tPos
- xPos = pos:sub(1,string.find(pos,":")-1)
- yPos = pos:sub(string.find(pos,":")+1,#pos)
- term.setCursorPos(tonumber(xPos),tonumber(yPos))
- write("x")
- end
- end
- end
- sEvt, eA, eB, eC = os.pullEvent("mouse_click")
- if eA == 2 then
- for r = 1,#map do
- for c = 1,#map[r] do
- if map[r][c].tPos == eB..":"..eC then
- pos = map[r][c].pos
- endX = pos:sub(1,string.find(pos,":")-1)
- endY = pos:sub(string.find(pos,":")+1,#pos)
- end
- end
- end
- if startX and endX and startY and endY then
- if startX > endX then
- tmp = startX
- startX = endX
- endX = tmp
- end
- if startY > endY then
- tmp = startY
- startY = endY
- endY = tmp
- end
- for r = startX,endX do
- for c = startY,endY do
- if not map[r][c].selected then
- map[r][c].selected = true
- end
- end
- end
- end
- end
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment