Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local c = require('component')
- local gpu = c.gpu
- local event = require('event')
- local term = require('term')
- local math = require('math')
- local oldXRes, oldYRes = gpu.getResolution()
- local newXRes,newYRes = 120,40 -- Разрешение экрана
- local sb = gpu.setBackground
- local sf = gpu.setForeground
- local craftItemTab = {}
- local oldBckCol = gpu.getBackground()
- local oldForCol = gpu.getForeground()
- local borderColor = 0xf742df -- цвет основной рамки
- local butCol = 0x888888 -- не нажатой кнопки
- local butTxtCol = 0x00ff00 -- текста внутри кнопки
- local addCol = 0x21effe -- для номера элемента при добавлении
- local butActive = 0xcccccc -- анимация активной кнопки
- local calcCol = 0xcccccc -- Фон для ввода предметов
- local NIPath = "/home/nameItem" -- путь к библиотеке
- local craftPath = '/home/craftItem' -- путь к файлу с предметами для автокрафта
- local gX, gY = 1,1 -- глобальные координаты клика мыши
- local exit = false -- глобальная переменная для выхода из программы
- local butSleep = 0.2 -- задержка для анимации нажатия кнопки
- -- Проверяет существование файла и создаёт при отсутствии, возвращает количество строк в файле.
- --
- function verFile(path)
- local size = 0
- local f = io.open(path,"r")
- if(f == nil) then
- f = io.open(path,"w") f:close() f = io.open(path, "r")
- end
- for line in f:lines() do
- size = size + 1
- end
- f:close()
- return size
- end -- end func
- -- Рисует рамку от начальных координат с шириной и высотой внутренней области и заданным цветом
- --
- function border(x0,y0,w,h,col)
- sf(col)
- gpu.fill(x0+1,y0,w,1,'─')
- gpu.fill(x0+1,y0+h+1,w,1,'─')
- gpu.fill(x0,y0+1,1,h,'│')
- gpu.fill(x0+w+1,y0+1,1,h,'│')
- gpu.set(x0,y0,'┌')
- gpu.set(x0+w+1,y0,'┐')
- gpu.set(x0,y0+h+1,'└')
- gpu.set(x0+w+1,y0+h+1,'┘')
- sf(oldForCol)
- end -- end func
- -- Вставляет по начальным координатам строку с заданым цветом текста и фона в HEX
- --
- function setStr(x0,y0,str,colFg,colBck)
- str = tostring(str)
- colFg = colFg or 0xffffff
- colBck = colBck or 0
- sf(colFg)
- sb(colBck)
- gpu.set(x0,y0,str)
- sf(oldForCol)
- sb(oldBckCol)
- end -- end func
- --******* Главная функция(здесь начинается вся программа)
- --**
- function main()
- craftItemTab = readFile(craftPath)
- --[[
- for k,v in pairs(craftItemTab) do
- --print(k,v)
- for ka, ve in pairs(v) do print(ka,ve) end
- end
- os.sleep(1)
- --]]
- --print(#craftItemTab) io.read()
- mainWin()
- eventMainWin()
- writeToFile(craftPath)
- end -- end func
- -- Читает в таблицу файл с предметам автокрафта, возвращает таблицу
- --
- function readFile(path)
- local fSize = verFile(path)
- local f = io.open(path,'r')
- local tab = {}
- if(fSize ~= 0) then
- for i = 1,fSize,4 do
- tab[math.ceil(i/4)] = {name = f:read(), id = f:read(), dmg = f:read(), size = tonumber(f:read())}
- end
- end
- f:close()
- return tab
- end -- end func
- -- Проверяет совпадение выбарнного предмета и предмета в файле автокрафта, если предмет уже есть return true
- --
- function coincidenceItem(name)
- for i = 1,#craftItemTab do
- if(name == craftItemTab[i].name) then
- return true
- end
- end
- return false
- end -- end func
- -- Открывает диалоговое окно для задания количества предметов
- --
- function calcWin(x0,y0)
- sb(calcCol)
- gpu.fill(x0,y0,31,11,' ')
- setStr(x0+2,y0+1,'Введите количество предметов', 0,butActive)
- sb(calcCol)
- border(x0+5,y0+7,6,1,butCol)
- setStr(x0+8,y0+8,'Ок',0,butActive)
- sb(calcCol)
- border(x0+17,y0+7,6,1,butCol)
- setStr(x0+18,y0+8,'Отмена',0,butActive)
- setStr(x0+10,y0+4,'0 0 0 0 0 0',0,butActive)
- setStr(x0+10,y0+3,'+ + + + + +',0,butActive)
- setStr(x0+10,y0+5,'- - - - - -',0,butActive)
- border(x0,y0,30,9,butActive)
- return eventCalcWin(x0,y0)
- end --end func
- -- Обрабатывает клики в окне ввода количества предметов
- --
- function eventCalcWin(x0,y0)
- local exitCalc = false
- local op1,op2 = nil,nil
- local num = 0
- local arr = {}
- while(not(exitCalc)) do
- _,_,gX,gY = event.pull('touch')
- op1 = scanRow(x0+10,y0+3,6,1)
- op2 = scanRow(x0+10,y0+5,6,1)
- num = toInt(op1,op2,num)
- arr = parseStr(num,6)
- for i = 1,6 do
- setStr(x0+(i-1)*2+10,y0+4,tostring(math.floor(arr[i])),0,butActive)
- end
- if(isCl(x0+5,y0+7,8,3)) then -- Кнопка "Ок"
- --print(num)
- exitCalc = true
- return num
- elseif(isCl(x0+17,y0+7,8,3)) then -- Кнопка "Отмена"
- exitCalc = true
- end
- end
- return 0
- end -- end func
- -- Вставляет новое число предметов
- --
- function toInt(op1,op2,num)
- if(op1) then
- num = num + math.pow(10,op1)
- return num
- elseif(op2) then
- num = num - math.pow(10,op2)
- if(num < 0) then return 0
- else return num
- end
- end
- return num
- end --end func
- -- Извлекает в массив цифры n-значного числа
- --
- function parseStr(num,n)
- local arr = {}
- for i = 1,n do
- arr[n-i+1] = num%10
- num = math.floor(num/10)
- end
- return arr
- end -- end func
- -- Сканирует на попадание клика в ячейку из ряда
- --
- function scanRow(x0,y0,num,space)
- for i = num,1,-1 do
- if(isCl((x0+(i-1)*(space+1)),y0,1,1)) then
- return (num-i)
- end
- end
- return nil
- end -- end func
- -- Добавляет предмет в таблицу предметов автокрафта, если его ещё нет
- --
- function addToTable(tab,sizeItem)
- -- for k,v in pairs(tab) do print(k,v) end io.read()
- if(not(coincidenceItem(tab.name))) then
- if(sizeItem ~= 0) then
- craftItemTab[#craftItemTab+1] = {name = tab.name, id = tab.id, dmg = tab.dmg, size = sizeItem}
- end
- end
- end -- end func
- -- Перезаписывает файл
- --
- function writeToFile(path)
- local f = io.open(path,'w')
- for i = 1,#craftItemTab do
- f:write(craftItemTab[i].name..'\n'..craftItemTab[i].id..'\n'..craftItemTab[i].dmg..'\n'..craftItemTab[i].size..'\n')
- end
- f:close()
- end -- end func
- -- Рисует главное окно
- function mainWin()
- setStr(newXRes-15,2,'AutoCraft v1.1',0xfefe22)
- border(1,1,newXRes-2,newYRes-2,borderColor)
- border(2,2,8,1,butCol)
- setStr(3,3,'Добавить',butTxtCol)
- border(12,2,8,1,butCol)
- setStr(13,3,'Изменить',butTxtCol)
- border(22,2,8,1,butCol)
- setStr(23,3,'Инфо',butTxtCol)
- border(32,2,8,1,butCol)
- setStr(33,3,'Выход',butTxtCol)
- end -- end func
- -- Проверяет область на клик мыши, вовзращает 1, если клик внутри области
- --
- function isCl(x0, y0, width, height)
- if(gX >= x0 and gX <= x0+width-1 and gY >= y0 and gY <= y0+height-1) then
- return true
- end
- end -- end func
- -- Регистрирует нажатие мыши на определённом пункте на главном окне
- --
- function eventMainWin()
- while(exit ~= true) do
- _,_,gX,gY = event.pull('touch')
- if(isCl(2,2,10,3)) then -- "Добавить"
- border(2,2,8,1,butActive)
- os.sleep(butSleep)
- addWin()
- term.clear()
- mainWin()
- elseif(isCl(12,2,10,3)) then -- "Изменить"
- border(12,2,8,1,butActive)
- os.sleep(butSleep)
- print('Изменить')
- term.clear()
- mainWin()
- elseif(isCl(22,2,10,3)) then -- "Инфо"
- border(22,2,8,1,butActive)
- os.sleep(butSleep)
- print('Инфо')
- term.clear()
- mainWin()
- elseif(isCl(32,2,10,3)) then -- "Выход"
- border(32,2,8,1,butActive)
- os.sleep(butSleep)
- exit = true
- end
- end
- end -- end func
- -- Рисует окно добавления предметов
- function addWin()
- term.clear()
- border(1,1,newXRes-2,newYRes-2,borderColor)
- setStr(2,2,'Добавление предметов а автокрафт',butTxtCol)
- border(2,newYRes-1-2,5,1,butCol)
- setStr(3,newYRes-1-1,'Назад',butTxtCol)
- eventAddWin()
- -- Вывести на экран с учётом листа
- -- Обработать клик
- -- Занести в базу
- end -- end func
- -- Регистрирует нажатие мыши на кнопках и элементах
- --
- function eventAddWin()
- local itemTab = getNameItem()
- local page = 1
- local itemOnPage = 25
- local itemSize
- local maxPage = math.ceil(#itemTab/itemOnPage)
- local exitAdd = false -- Выход из подменю
- local numItem = nil -- номер элемента массива
- printToPage(page,itemOnPage,itemTab)
- listNow(page,maxPage)
- while(not(exitAdd)) do
- _,_,gX,gY = event.pull('touch')
- numItem = getItemNum(3,4,page,itemOnPage)
- if(itemTab[numItem]) then
- setStr(7,numItem-(page-1)*itemOnPage+3,itemTab[numItem].name,butTxtCol)
- os.sleep(butSleep)
- itemSize = calcWin(29,12)
- addToTable(itemTab[numItem],itemSize)
- gpu.fill(2,3,60,26,' ')
- gpu.fill(12,newYRes-1-2,9,3,' ')
- printToPage(page,itemOnPage,itemTab)
- listNow(page,maxPage)
- elseif(isCl(2,newYRes-1-2,7,3)) then -- нажата кнопка "назад"
- exitAdd = true
- border(2,newYRes-1-2,5,1,butActive)
- os.sleep(butSleep)
- elseif(page ~= 1 and isCl(12,newYRes-1-2,3,3)) then -- нажата кнопка "<"
- page = page - 1
- border(12,newYRes-1-2,1,1,butActive)
- os.sleep(butSleep)
- gpu.fill(2,3,40,26,' ')
- gpu.fill(12,newYRes-1-2,9,3,' ')
- printToPage(page,itemOnPage,itemTab)
- listNow(page,maxPage)
- elseif(page ~= maxPage and isCl(18,newYRes-1-2,3,3)) then -- нажата кнопка ">"
- page = page + 1
- border(18,newYRes-1-2,1,1,butActive)
- os.sleep(butSleep)
- gpu.fill(2,3,40,26,' ')
- gpu.fill(12,newYRes-1-2,9,3,' ')
- printToPage(page,itemOnPage,itemTab)
- listNow(page,maxPage)
- end
- end
- end -- end func
- -- Печатает на страницу до itemOnPage элементов массива arr, если они существуют
- --
- function printToPage(page,itemOnPage,itemTab)
- for i =1,itemOnPage do
- if(itemTab[i+(page-1)*itemOnPage]) then
- if(i+(page-1)*itemOnPage < 10) then
- setStr(5,i+3,i+(page-1)*itemOnPage..'.',addCol)
- elseif(i+(page-1)*itemOnPage < 100) then
- setStr(4,i+3,i+(page-1)*itemOnPage..'.',addCol)
- elseif(i+(page-1)*itemOnPage < 1000) then
- setStr(3,i+3,i+(page-1)*itemOnPage..'.',addCol)
- end
- setStr(7,i+3,itemTab[i+(page-1)*itemOnPage].name)
- end
- end
- setStr(3,31,'Всего: ',0xfefe22)
- setStr(10,31,#itemTab)
- end -- end func
- -- Отображает текущий лист, и кнопки перелистывания
- --
- function listNow(page, maxPage)
- if(page ~= 1) then
- border(12,newYRes-1-2,1,1,butCol)
- setStr(13,newYRes-2,'<',butTxtCol)
- end
- border(15,newYRes-1-2,1,1,butCol)
- setStr(16,newYRes-2,page)
- if(page ~= maxPage) then
- border(18,newYRes-1-2,1,1,butCol)
- setStr(19,newYRes-2,'>',butTxtCol)
- end
- end -- end func
- -- Определяет номер элемента массива по клику на название с учётом страницы
- -- Возвращает номер элемента массива
- function getItemNum(x0,y0,page,itemOnPage)
- local num = nil
- for i = y0, itemOnPage+y0-1 do
- if(isCl(x0,i,40,1)) then
- num = i-y0+1+(page-1)*itemOnPage
- end
- end
- return num
- end -- end func
- -- Читает из файла библиотеки данные и записывает в массив, который возвращает
- --
- function getNameItem()
- local cntLine,cntItem = 0,0 -- счётчик линии и предмета файла
- local nameItem, idItem, dmgItem = "","",0 -- навзание, полный идентификатор(id + dmg)
- local verTab = {}
- local fSize = verFile(NIPath)
- -- Формируем табилцу из библиотеки
- local f = io.open(NIPath,"r")
- while(cntLine ~= fSize) do
- cntItem = cntItem + 1
- nameItem = f:read()
- idItem = f:read()
- dmgItem = f:read()
- cntLine = cntLine + 3
- verTab[cntItem] = {name = nameItem, id = idItem, dmg = dmgItem}
- end
- f:close()
- return verTab
- end -- end func
- -- Выводит на экран предметы для автокрафта
- --
- function outCraftItem()
- end -- end func
- ---------------------------------------------------------------------------
- gpu.setResolution(newXRes,newYRes)
- main()
- --for k,v in pairs(parseStr(123456,6)) do print(k,v) io.read() end
- term.clear()
- gpu.setResolution(oldXRes,oldYRes)
- --------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement