Advertisement
Guest User

ac

a guest
Feb 21st, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 13.09 KB | None | 0 0
  1. local c = require('component')
  2. local gpu = c.gpu  
  3. local event = require('event')
  4. local term = require('term')
  5. local math = require('math')
  6.  
  7. local oldXRes, oldYRes = gpu.getResolution()
  8. local newXRes,newYRes = 120,40      -- Разрешение экрана
  9.  
  10. local sb = gpu.setBackground
  11. local sf = gpu.setForeground
  12.  
  13. local craftItemTab = {}
  14.  
  15. local oldBckCol = gpu.getBackground()
  16. local oldForCol = gpu.getForeground()
  17.  
  18. local borderColor = 0xf742df  -- цвет основной рамки
  19. local butCol = 0x888888   -- не нажатой кнопки
  20. local butTxtCol = 0x00ff00      -- текста внутри кнопки
  21. local addCol = 0x21effe         -- для номера элемента при добавлении
  22. local butActive = 0xcccccc  -- анимация активной кнопки
  23. local calcCol = 0xcccccc -- Фон для ввода предметов
  24.  
  25. local NIPath = "/home/nameItem" -- путь к библиотеке
  26. local craftPath = '/home/craftItem' -- путь к файлу с предметами для автокрафта
  27.  
  28. local gX, gY = 1,1   -- глобальные координаты клика мыши
  29. local exit = false   -- глобальная переменная для выхода из программы
  30. local butSleep = 0.2 -- задержка для анимации нажатия кнопки
  31.  
  32.  
  33. -- Проверяет существование файла и создаёт при отсутствии, возвращает количество строк в файле.
  34. --
  35. function verFile(path)
  36.   local size = 0
  37.   local f = io.open(path,"r")
  38.   if(f == nil) then
  39.     f = io.open(path,"w") f:close() f = io.open(path, "r")
  40.   end
  41.   for line in f:lines() do
  42.     size = size + 1
  43.   end
  44.   f:close()
  45.   return size
  46. end -- end func
  47.  
  48. --  Рисует рамку от начальных координат с шириной и высотой внутренней области и заданным цветом
  49. --
  50. function border(x0,y0,w,h,col)
  51.  
  52.   sf(col)
  53.   gpu.fill(x0+1,y0,w,1,'─')
  54.   gpu.fill(x0+1,y0+h+1,w,1,'─')
  55.   gpu.fill(x0,y0+1,1,h,'│')
  56.   gpu.fill(x0+w+1,y0+1,1,h,'│')
  57.   gpu.set(x0,y0,'┌')
  58.   gpu.set(x0+w+1,y0,'┐')
  59.   gpu.set(x0,y0+h+1,'└')
  60.   gpu.set(x0+w+1,y0+h+1,'┘')
  61.   sf(oldForCol)
  62.  
  63. end -- end func
  64.  
  65.  
  66.  
  67. -- Вставляет по начальным координатам строку с заданым цветом текста и фона в HEX
  68. --
  69. function setStr(x0,y0,str,colFg,colBck)
  70.  
  71.   str = tostring(str)
  72.   colFg = colFg or 0xffffff
  73.   colBck = colBck or 0
  74.   sf(colFg)
  75.   sb(colBck)
  76.   gpu.set(x0,y0,str)
  77.   sf(oldForCol)
  78.   sb(oldBckCol)
  79.  
  80. end -- end func
  81.  
  82. --******* Главная функция(здесь начинается вся программа)
  83. --**
  84. function main()
  85.   craftItemTab = readFile(craftPath)
  86. --[[
  87.   for k,v in pairs(craftItemTab) do
  88.     --print(k,v)
  89.     for ka, ve in pairs(v) do print(ka,ve) end
  90.   end
  91.   os.sleep(1)
  92. --]]
  93. --print(#craftItemTab) io.read()
  94.   mainWin()
  95.   eventMainWin()
  96.   writeToFile(craftPath)
  97. end -- end func
  98.  
  99. -- Читает в таблицу файл с предметам автокрафта, возвращает таблицу
  100. --
  101. function readFile(path)
  102.   local fSize = verFile(path)
  103.   local f = io.open(path,'r')
  104.   local tab = {}
  105.   if(fSize ~= 0) then  
  106.     for i = 1,fSize,4 do
  107.       tab[math.ceil(i/4)] = {name = f:read(), id = f:read(), dmg = f:read(), size = tonumber(f:read())}
  108.     end
  109.   end
  110.   f:close()
  111.   return tab
  112. end -- end func
  113.  
  114.  
  115. -- Проверяет совпадение выбарнного предмета и предмета в файле автокрафта, если предмет уже есть return true
  116. --
  117. function coincidenceItem(name)
  118.   for i = 1,#craftItemTab do
  119.     if(name == craftItemTab[i].name) then
  120.       return true
  121.     end
  122.   end
  123.   return false
  124. end -- end func
  125.  
  126.  
  127. -- Открывает диалоговое окно для задания количества предметов
  128. --
  129. function calcWin(x0,y0)
  130.   sb(calcCol)
  131.   gpu.fill(x0,y0,31,11,' ')
  132.   setStr(x0+2,y0+1,'Введите количество предметов', 0,butActive)
  133.  
  134.  
  135.   sb(calcCol)
  136.   border(x0+5,y0+7,6,1,butCol)
  137.   setStr(x0+8,y0+8,'Ок',0,butActive)
  138.   sb(calcCol)
  139.   border(x0+17,y0+7,6,1,butCol)
  140.   setStr(x0+18,y0+8,'Отмена',0,butActive)
  141.  
  142.   setStr(x0+10,y0+4,'0 0 0 0 0 0',0,butActive)
  143.   setStr(x0+10,y0+3,'+ + + + + +',0,butActive)
  144.   setStr(x0+10,y0+5,'- - - - - -',0,butActive)
  145.  
  146.   border(x0,y0,30,9,butActive)
  147.   return eventCalcWin(x0,y0)
  148. end --end func
  149.  
  150.  
  151. -- Обрабатывает клики в окне ввода количества предметов
  152. --
  153. function eventCalcWin(x0,y0)
  154.   local exitCalc = false
  155.   local op1,op2 = nil,nil
  156.   local num = 0
  157.   local arr = {}
  158.  
  159.   while(not(exitCalc)) do
  160.     _,_,gX,gY = event.pull('touch')
  161.     op1 = scanRow(x0+10,y0+3,6,1)
  162.     op2 = scanRow(x0+10,y0+5,6,1)
  163.     num = toInt(op1,op2,num)
  164.     arr = parseStr(num,6)
  165.     for i = 1,6 do
  166.       setStr(x0+(i-1)*2+10,y0+4,tostring(math.floor(arr[i])),0,butActive)
  167.     end
  168.  
  169.     if(isCl(x0+5,y0+7,8,3)) then -- Кнопка "Ок"
  170.       --print(num)
  171.       exitCalc = true
  172.       return num
  173.     elseif(isCl(x0+17,y0+7,8,3)) then -- Кнопка "Отмена"
  174.       exitCalc = true
  175.     end
  176.   end
  177.   return 0
  178. end -- end func
  179.  
  180. -- Вставляет новое число предметов
  181. --
  182. function toInt(op1,op2,num)
  183.   if(op1) then
  184.     num = num + math.pow(10,op1)
  185.     return num
  186.   elseif(op2) then
  187.     num = num - math.pow(10,op2)
  188.     if(num < 0) then return 0
  189.     else return num
  190.     end
  191.   end
  192.   return num  
  193.  
  194. end --end func
  195.  
  196.  
  197. -- Извлекает в массив цифры n-значного числа
  198. --
  199. function parseStr(num,n)
  200.   local arr = {}
  201.   for i = 1,n do
  202.     arr[n-i+1] = num%10
  203.     num = math.floor(num/10)
  204.   end
  205.   return arr
  206. end -- end func
  207.  
  208. -- Сканирует на попадание клика в ячейку из ряда
  209. --
  210. function scanRow(x0,y0,num,space)
  211.   for i = num,1,-1 do
  212.     if(isCl((x0+(i-1)*(space+1)),y0,1,1)) then
  213.       return (num-i)
  214.     end
  215.   end
  216.   return nil
  217. end -- end func
  218.  
  219.  
  220. -- Добавляет предмет в таблицу предметов автокрафта, если его ещё нет
  221. --
  222. function addToTable(tab,sizeItem)
  223. --  for k,v in pairs(tab) do print(k,v) end io.read()
  224.   if(not(coincidenceItem(tab.name))) then
  225.     if(sizeItem ~= 0) then
  226.       craftItemTab[#craftItemTab+1] = {name = tab.name, id = tab.id, dmg = tab.dmg, size = sizeItem}
  227.     end
  228.   end
  229. end -- end func
  230.  
  231.  
  232. -- Перезаписывает файл
  233. --
  234. function writeToFile(path)
  235.   local f = io.open(path,'w')
  236.   for i = 1,#craftItemTab do
  237.     f:write(craftItemTab[i].name..'\n'..craftItemTab[i].id..'\n'..craftItemTab[i].dmg..'\n'..craftItemTab[i].size..'\n')
  238.   end
  239.   f:close()
  240. end -- end func
  241.  
  242.  
  243. -- Рисует главное окно
  244. function mainWin()
  245.  
  246.   setStr(newXRes-15,2,'AutoCraft v1.1',0xfefe22)
  247.  
  248.   border(1,1,newXRes-2,newYRes-2,borderColor)
  249.   border(2,2,8,1,butCol)
  250.   setStr(3,3,'Добавить',butTxtCol)
  251.  
  252.   border(12,2,8,1,butCol)
  253.   setStr(13,3,'Изменить',butTxtCol)
  254.  
  255.   border(22,2,8,1,butCol)
  256.   setStr(23,3,'Инфо',butTxtCol)
  257.  
  258.   border(32,2,8,1,butCol)
  259.   setStr(33,3,'Выход',butTxtCol)
  260.  
  261. end -- end func
  262.  
  263. -- Проверяет область на клик мыши, вовзращает 1, если клик внутри области
  264. --
  265. function isCl(x0, y0, width, height)
  266.   if(gX >= x0 and gX <= x0+width-1 and gY >= y0 and gY <= y0+height-1) then
  267.     return true
  268.   end
  269. end -- end func
  270.  
  271.  
  272.  
  273. -- Регистрирует нажатие мыши на определённом пункте на главном окне
  274. --
  275. function eventMainWin()
  276.  
  277.   while(exit ~= true) do
  278.     _,_,gX,gY = event.pull('touch')
  279.     if(isCl(2,2,10,3)) then  -- "Добавить"
  280.       border(2,2,8,1,butActive)
  281.       os.sleep(butSleep)
  282.       addWin()
  283.       term.clear()
  284.       mainWin()
  285.     elseif(isCl(12,2,10,3)) then  -- "Изменить"
  286.       border(12,2,8,1,butActive)
  287.       os.sleep(butSleep)
  288.       print('Изменить')
  289.       term.clear()
  290.       mainWin()
  291.     elseif(isCl(22,2,10,3)) then   -- "Инфо"
  292.       border(22,2,8,1,butActive)
  293.       os.sleep(butSleep)
  294.       print('Инфо')
  295.       term.clear()
  296.       mainWin()
  297.     elseif(isCl(32,2,10,3)) then  -- "Выход"
  298.       border(32,2,8,1,butActive)
  299.       os.sleep(butSleep)
  300.       exit = true
  301.     end
  302.   end
  303.  
  304.  
  305. end -- end func
  306.  
  307.  
  308.  
  309. -- Рисует окно добавления предметов
  310. function addWin()
  311.  
  312.   term.clear()
  313.   border(1,1,newXRes-2,newYRes-2,borderColor)
  314.   setStr(2,2,'Добавление предметов а автокрафт',butTxtCol)
  315.   border(2,newYRes-1-2,5,1,butCol)
  316.   setStr(3,newYRes-1-1,'Назад',butTxtCol)
  317.  
  318.   eventAddWin()
  319.  
  320.  -- Вывести на экран с учётом листа
  321.  -- Обработать клик
  322. --  Занести в базу
  323. end -- end func
  324.  
  325. -- Регистрирует нажатие мыши на кнопках и элементах
  326. --
  327. function eventAddWin()
  328.  
  329.   local itemTab = getNameItem()
  330.   local page = 1
  331.   local itemOnPage = 25
  332.   local itemSize
  333.   local maxPage = math.ceil(#itemTab/itemOnPage)
  334.   local exitAdd = false -- Выход из подменю
  335.   local numItem = nil -- номер элемента массива
  336.  
  337.   printToPage(page,itemOnPage,itemTab)
  338.   listNow(page,maxPage)
  339.  
  340.   while(not(exitAdd)) do
  341.     _,_,gX,gY = event.pull('touch')
  342.     numItem = getItemNum(3,4,page,itemOnPage)
  343.     if(itemTab[numItem]) then
  344.       setStr(7,numItem-(page-1)*itemOnPage+3,itemTab[numItem].name,butTxtCol)
  345.       os.sleep(butSleep)
  346.       itemSize = calcWin(29,12)
  347.       addToTable(itemTab[numItem],itemSize)
  348.  
  349.       gpu.fill(2,3,60,26,' ')
  350.       gpu.fill(12,newYRes-1-2,9,3,' ')
  351.       printToPage(page,itemOnPage,itemTab)
  352.       listNow(page,maxPage)
  353.     elseif(isCl(2,newYRes-1-2,7,3)) then -- нажата кнопка "назад"
  354.       exitAdd = true
  355.       border(2,newYRes-1-2,5,1,butActive)
  356.       os.sleep(butSleep)
  357.     elseif(page ~= 1 and isCl(12,newYRes-1-2,3,3)) then -- нажата кнопка "<"
  358.       page = page - 1
  359.       border(12,newYRes-1-2,1,1,butActive)
  360.       os.sleep(butSleep)
  361.       gpu.fill(2,3,40,26,' ')
  362.       gpu.fill(12,newYRes-1-2,9,3,' ')
  363.       printToPage(page,itemOnPage,itemTab)
  364.       listNow(page,maxPage)
  365.     elseif(page ~= maxPage and isCl(18,newYRes-1-2,3,3)) then -- нажата кнопка ">"
  366.       page = page + 1
  367.       border(18,newYRes-1-2,1,1,butActive)
  368.       os.sleep(butSleep)
  369.       gpu.fill(2,3,40,26,' ')
  370.       gpu.fill(12,newYRes-1-2,9,3,' ')
  371.       printToPage(page,itemOnPage,itemTab)
  372.       listNow(page,maxPage)
  373.     end
  374.   end
  375.  
  376. end -- end func
  377.  
  378.  
  379. -- Печатает на страницу до itemOnPage элементов массива arr, если они существуют
  380. --
  381. function printToPage(page,itemOnPage,itemTab)
  382.  
  383.   for i =1,itemOnPage do
  384.     if(itemTab[i+(page-1)*itemOnPage]) then  
  385.       if(i+(page-1)*itemOnPage < 10) then
  386.         setStr(5,i+3,i+(page-1)*itemOnPage..'.',addCol)
  387.       elseif(i+(page-1)*itemOnPage < 100) then
  388.         setStr(4,i+3,i+(page-1)*itemOnPage..'.',addCol)
  389.       elseif(i+(page-1)*itemOnPage < 1000) then
  390.         setStr(3,i+3,i+(page-1)*itemOnPage..'.',addCol)
  391.       end
  392.       setStr(7,i+3,itemTab[i+(page-1)*itemOnPage].name)
  393.     end
  394.   end
  395.   setStr(3,31,'Всего: ',0xfefe22)
  396.   setStr(10,31,#itemTab)
  397.  
  398. end -- end func
  399.  
  400.  
  401. -- Отображает текущий лист, и кнопки перелистывания
  402. --
  403. function listNow(page, maxPage)
  404.  
  405.   if(page ~= 1) then
  406.     border(12,newYRes-1-2,1,1,butCol)
  407.     setStr(13,newYRes-2,'<',butTxtCol)
  408.   end
  409.   border(15,newYRes-1-2,1,1,butCol)
  410.   setStr(16,newYRes-2,page)
  411.   if(page ~= maxPage) then
  412.     border(18,newYRes-1-2,1,1,butCol)
  413.     setStr(19,newYRes-2,'>',butTxtCol)
  414.   end
  415.  
  416. end -- end func
  417.  
  418.  
  419.  
  420. -- Определяет номер элемента массива по клику на название с учётом страницы
  421. -- Возвращает номер элемента массива
  422. function getItemNum(x0,y0,page,itemOnPage)
  423.   local num = nil
  424.   for i = y0, itemOnPage+y0-1 do
  425.     if(isCl(x0,i,40,1)) then
  426.       num = i-y0+1+(page-1)*itemOnPage
  427.     end
  428.   end
  429.   return num
  430. end -- end func
  431.  
  432.  
  433.  
  434. -- Читает из файла библиотеки данные и записывает в массив, который возвращает
  435. --
  436. function getNameItem()
  437.  
  438.   local cntLine,cntItem = 0,0 -- счётчик линии и предмета файла
  439.   local nameItem, idItem, dmgItem = "","",0 -- навзание, полный идентификатор(id + dmg)
  440.   local verTab = {}
  441.   local fSize = verFile(NIPath)
  442.  
  443.   -- Формируем табилцу из библиотеки
  444.   local f = io.open(NIPath,"r")
  445.   while(cntLine ~= fSize) do
  446.     cntItem = cntItem + 1
  447.     nameItem = f:read()
  448.     idItem = f:read()
  449.     dmgItem = f:read()
  450.     cntLine = cntLine + 3
  451.     verTab[cntItem] = {name = nameItem, id = idItem, dmg = dmgItem}  
  452.   end
  453.   f:close()
  454.   return verTab
  455.  
  456. end -- end func
  457.  
  458. -- Выводит на экран предметы для автокрафта
  459. --
  460. function  outCraftItem()
  461.  
  462. end -- end func
  463. ---------------------------------------------------------------------------
  464. gpu.setResolution(newXRes,newYRes)
  465. main()
  466. --for k,v in pairs(parseStr(123456,6)) do print(k,v) io.read() end
  467. term.clear()
  468. gpu.setResolution(oldXRes,oldYRes)
  469. --------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement