Advertisement
aka_zaratustra

crop_stats1.1.2.lua

Oct 18th, 2020
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 34.91 KB | None | 0 0
  1. --Скрипт для робота, для поднятия статов у кропсов или разведения дубликатов (режим задается константой mode)
  2. --Автор: aka_zaratustra осень 2020
  3. local ver = "1.1.2" -- версия программы
  4.  
  5. -- схема грядки
  6. --|C1|M1|C2
  7. --|M2|C3|M3
  8. --|C4|M4|C5
  9. --|CH|P0|BR
  10.  
  11. -- P0 - исходное положение робота. Робот находится на 1 блок выше кропсов (чтобы мог летать над ними), смотрит на север (в сторону грядок). В руках у робота должна быть лопатка Spade. В первом слоте инвентори робота или должны быть палки или он должен быть пустой (робот сам возьмет и положет туда палки)
  12. -- С[n] - дочерние (разводимые) растения
  13. -- M[n] - материнские растения
  14. -- СН - chest, сундук, куда будут помещаться мешочки с семечками и урожай
  15. -- BR - барель с кропсами(палками)
  16.  
  17. -- В начале работы материнские кропсы должны быть высажены на грядку. Дочерние (разводимые) могут быть высажены, а может быть голая земля.
  18. -- У робота должны в обязательном порядке присутстовать компоненты: Geolyzer, Inventory Upgrade, Inventory Controller Upgrade
  19. -- Рекомендуется для удобства поместить файл с этим скриптом в папку /home/ , а имя файла скрипта добавить в файл /home/.shrc - тогда скрипт будет запускаться при включении робота автоматически
  20. -- Если в бочке кончаются кропсы(палки), робот сломает пустые палки, если они есть на поле и завершит свою работу с ошибкой (чтобы всё поле не сожрали сорняки)
  21. -- Максимальные статы кропсов, выше которых робот поднимать статы выводимых кропсов не будет, задаются константами max_grow и max_gain
  22. -- Стат resistans робот не поднимает, а при возможости опускает до 0
  23. -- Аглоритм движений робота заскриптован и уязвим к коллизиям. НЕ СТОЙТЕ НА ПУТИ ДВИЖЕНИЯ РОБОТА, это собьет его с пути и дальнейшее поведение будет непредсказуемым!
  24. -- Механизм оценки приемлемости (качества) полученного растения менять в функции howInterestingIsThisCrop(с)
  25.  
  26. -- mode:
  27. -- 1 - режим поднятия статов кропсов
  28. -- 2 - режим разведения дубликатов кропсов (НЕ ТЕСТИРОВАЛСЯ! НЕ ИСПОЛЬЗОВАТЬ!)
  29. local mode = 1
  30. -- выше заданных здесь значений робот понимать статы не будет
  31. local max_grow = 20 -- если больше 23, то кроп начинает вести себя как сорняк
  32. local max_gain = 28
  33. local grow_kill = 24 -- значение стата grow, при котором и выше которого робот будет убивать растение на корню
  34.  
  35. local robot = require("robot")
  36. local computer = require("computer")
  37. local component = require("component")
  38. local geo = component.geolyzer
  39. local cropname
  40.  
  41. local c_cropname = {} --имена дочерних кропов
  42. --статы дочерних кропов
  43. local c_gain = {}
  44. local c_grow = {}
  45. local c_resistans = {}
  46. local c_size = {}
  47. local c_maxSize = {}
  48.  
  49. -- статус может принимать значения:
  50. -- "unknown" - неисследованный. назначается при старте, дальше не используется
  51. -- "double crop" - жердочки
  52. -- "growing" - растущий кроп, у которого статы или дошли до целевых или лучше материнских. после вырастания или отправится в сундук или может заменить собой материнский кроп
  53. local c_status = {"unknown", "unknown", "unknown", "unknown", "unknown"} -- "unknown" для всех пяти дочерних кропов
  54.  
  55.  
  56. local m_gain = {}
  57. local m_grow = {}
  58. local m_resistans = {}
  59.  
  60. local error_string
  61. local bestSeedsSlot --слот в инвентори робота с семенами с лучшими статами
  62. local robotLocation -- текущее местонаходение робота. значение из списка: {"С1", "С2", ... , "С5", "M1", "M2", "M3", "M4", "P0"}
  63.  
  64.  
  65. function robot_error(msg)
  66.     print("Ошибка: ", msg)
  67.     computer.beep(1000,0.3)
  68.     computer.beep(1000,0.3)
  69.     computer.beep(1000,0.3)
  70.     os.exit()
  71. end
  72. --------------------------------------
  73. function get_crop_stat(analyze_result, stat_name) --функция - просматривает таблицу скана блока и возвращает значение поля, имя которого передано в stat_name. если не находит, то возвращает nil
  74.  
  75.     --file = io.open("log.txt", "a") --файл для лога
  76.  
  77.     found = false
  78.     for name, v in pairs(analyze_result) do --просмотрим таблицу реультата анализа кропса
  79.        
  80.         pos = string.find(name, stat_name)
  81.         --print(pos)
  82.         if pos ~=  nil then -- если строку в метадате нашли
  83.             found = true
  84.             --print(v)
  85.             return v
  86.         end
  87.     end
  88.  
  89. end
  90.  
  91. function robotMove_P0_M1()
  92.     --исходное положение P0 смотрит вверх
  93.     robot.forward()
  94.     robot.forward()
  95.     robot.forward()
  96.     --конечное положение M1 смотрит вверх
  97. end
  98. function robotMove_M1_M2()
  99.     --начальное положение M1 смотрит вверх
  100.     robot.turnLeft()
  101.     robot.forward()
  102.     robot.turnLeft()
  103.     robot.forward()
  104.     --конечное положение M2 смотрит вниз
  105. end
  106. function robotMove_M2_M3()
  107.     --начальное положение M2 смотрит вниз
  108.     robot.turnLeft()
  109.     robot.forward()
  110.     robot.forward()
  111.     --конечное положение M3 смотрит вправо
  112. end
  113. function robotMove_M3_M4()
  114.     --начальное положение M3 смотрит вправо
  115.     robot.turnRight()
  116.     robot.forward()
  117.     robot.turnRight()
  118.     robot.forward()
  119.     --конечное положение M4 смотрит влево
  120. end
  121. function robotMove_M4_P0()
  122.     --начальное положение M4 смотрит влево
  123.     robot.turnLeft()
  124.     robot.forward()
  125.     robot.turnAround()
  126.     --конечное положение P0 смотрит вверх
  127. end
  128. function robotMove_P0_C1()
  129.     --начальное положение P0 смотрит вверх
  130.     robot.forward()
  131.     robot.forward()
  132.     robot.forward()
  133.     robot.turnLeft()
  134.     robot.forward()
  135.     --конечное положение C1 смотрит влево
  136. end
  137. function robotMove_C1_C4()
  138.     --начальное положение C1 смотрит влево
  139.     robot.turnLeft()
  140.     robot.forward()
  141.     robot.forward()
  142.     --конечное положение C4 смотрит вниз
  143. end
  144. function robotMove_C4_C5()
  145.     --начальное положение C4 смотрит вниз
  146.     robot.turnLeft()
  147.     robot.forward()
  148.     robot.forward()
  149.     --конечное положение C5 смотрит вправо
  150. end
  151. function robotMove_C5_C2()
  152.     --начальное положение C5 смотрит вправо
  153.     robot.turnLeft()
  154.     robot.forward()
  155.     robot.forward()
  156.     --конечное положение C2 смотрит вверх
  157. end
  158. function robotMove_C2_C3()
  159.     --начальное положение C2 смотрит вверх
  160.     robot.turnLeft()
  161.     robot.forward()
  162.     robot.turnLeft()
  163.     robot.forward()
  164.     --конечное положение C3 смотрит вниз
  165. end
  166. function robotMove_C3_P0()
  167.     --начальное положение C3 смотрит вниз
  168.     robot.forward()
  169.     robot.forward()
  170.     robot.turnAround()
  171.     --конечное положение P0 смотрит вверх
  172. end
  173. function robotGoToParkFrom_M_Crop(m) --едем на парковку. "m" - номер материнского кропа с которого мы едем
  174.     if m == 1 then
  175.         --начальное положение M1 смотрит вверх
  176.         robot.turnAround()
  177.         robot.forward()
  178.         robot.forward()
  179.         robot.forward()
  180.         robot.turnAround()
  181.         --конечное положение P0 смотрит вверх
  182.     end
  183.     if m == 2 then
  184.         --начальное положение M2 смотрит влево
  185.         robot.turnAround()
  186.         robot.forward()
  187.         robot.turnRight()
  188.         robot.forward()
  189.         robot.forward()
  190.         robot.turnAround()
  191.         --конечное положение P0 смотрит вверх
  192.     end
  193.     if m == 3 then
  194.         --начальное положение M3 смотрит вправо
  195.         robot.turnAround()
  196.         robot.forward()
  197.         robot.turnLeft()
  198.         robot.forward()
  199.         robot.forward()
  200.         robot.turnAround()
  201.         --конечное положение P0 смотрит вверх
  202.     end
  203.     if m == 4 then
  204.         --начальное положение M4 смотрит влево
  205.         robot.turnLeft()
  206.         robot.forward()
  207.         robot.turnAround()
  208.         --конечное положение P0 смотрит вверх 
  209.     end
  210. end
  211. function robotGoToPark(c) --едем на парковку. "с" - номер дочернего кропа с которого мы едем
  212.     if c == 1 then
  213.         --начальное положение C1 смотрит влево
  214.         robot.turnAround()
  215.         robot.forward()
  216.         robot.turnRight()
  217.         robot.forward()
  218.         robot.forward()
  219.         robot.forward()
  220.         robot.turnAround()
  221.         --конечное положение P0 смотрим вверх
  222.     end
  223.     if c == 2 then
  224.         --начальное положение C2 смотрит вверх
  225.         robot.turnLeft()
  226.         robot.forward()
  227.         robot.turnLeft()
  228.         robot.forward()
  229.         robot.forward()
  230.         robot.forward()
  231.         robot.turnAround()
  232.         --конечное положение P0 смотрим вверх
  233.     end
  234.     if c == 3 then
  235.         --начальное положение C3 смотрит вниз
  236.         robot.forward()
  237.         robot.forward()
  238.         robot.turnAround()
  239.         --конечное положение P0 смотрим вверх
  240.     end
  241.     if c == 4 then
  242.         --начальное положение C4 смотрит вниз
  243.         robot.turnLeft()
  244.         robot.forward()
  245.         robot.turnRight()
  246.         robot.forward()
  247.         robot.turnAround()
  248.         --конечное положение P0 смотрим вверх
  249.     end
  250.     if c == 5 then
  251.         --начальное положение C5 смотрит вправо
  252.         robot.turnAround()
  253.         robot.forward()
  254.         robot.turnLeft()
  255.         robot.forward()
  256.         robot.turnAround()
  257.         --конечное положение P0 смотрим вверх
  258.     end
  259.  
  260. end
  261. function robotGoTo_M_Crop_FromPark(m) --едем с парковки P0 к материнскому кропу. "m" - номер кропа к которому мы едем
  262.     if m==1 then
  263.         --исходное положение P0 смотрит вверх
  264.         robot.forward()
  265.         robot.forward()
  266.         robot.forward()
  267.         --конечное положение M1 смотрит вверх
  268.     end
  269.     if m==2 then
  270.         --начальное положение P0 смотрит вверх
  271.         robot.forward()
  272.         robot.forward()
  273.         robot.turnLeft()
  274.         robot.forward()
  275.         --конечное положение M2 смотрит влево
  276.     end
  277.     if m==3 then
  278.         --начальное положение P0 смотрит вверх
  279.         robot.forward()
  280.         robot.forward()
  281.         robot.turnRight()
  282.         robot.forward()
  283.         --конечное положение M3 смотрит вправо
  284.     end
  285.     if m==4 then
  286.         --начальное положение P0 смотрит вверх
  287.         robot.forward()
  288.         robot.turnLeft()       
  289.         --конечное положение M4 смотрит влево
  290.     end
  291. end
  292. function robotGoTo_C_Crop_FromPark(c) --едем с парковки P0 к дочернему кропу. "с" - номер кропа к которому мы едем
  293.     if c == 1 then
  294.         --начальное положение P0 смотрим вверх
  295.         robot.forward()
  296.         robot.forward()
  297.         robot.forward()
  298.         robot.turnLeft()
  299.         robot.forward()
  300.         --конечное положение C1 смотрит влево
  301.     end
  302.     if c == 2 then
  303.         --начальное положение P0 смотрим вверх
  304.         robot.forward()
  305.         robot.forward()
  306.         robot.forward()
  307.         robot.turnRight()
  308.         robot.forward()
  309.         robot.turnLeft()
  310.         --конечное положение C2 смотрит вверх
  311.     end
  312.     if c == 3 then
  313.         --начальное положение P0 смотрим вверх
  314.         robot.forward()
  315.         robot.forward()
  316.         robot.turnAround()
  317.         --конечное положение C3 смотрит вниз
  318.     end
  319.     if c == 4 then
  320.         --начальное положение P0 смотрим вверх
  321.         robot.forward()
  322.         robot.turnLeft()
  323.         robot.forward()
  324.         robot.turnLeft()
  325.         --конечное положение C4 смотрит вниз
  326.     end
  327.     if c == 5 then
  328.         --начальное положение P0 смотрим вверх
  329.         robot.forward()
  330.         robot.turnRight()
  331.         robot.forward()
  332.         --конечное положение C5 смотрит вправо
  333.     end
  334.  
  335. end
  336. function grabCropsFromBarrel() --пополняем запас палок в роботе из бочки.
  337.     --возвращает true если после попытки взять палки, есть хотя бы одна палка в роботе
  338.     --возвращает false если палки в роботе и в бочке кончились
  339.     cropsStackSize = 62 --размер стака палок, который робот возит с собой. 62 потому что при уничтожения кропса робот выдерает из земли и палки, и они могут попасть в нецелевой слот
  340.    
  341.     --палки лежат в первом слоте
  342.     returnValue = true
  343.     itemCount = robot.count(1)
  344.     if itemCount < cropsStackSize then --если палок неполный стак, до доберем из бочки
  345.         robot.select(1) --активизируем слот, в котором лежат палки
  346.         robot.turnRight() --повернемся к бочке
  347.         --добираем палок до полного стака
  348.         robot.suck(cropsStackSize-itemCount)
  349.         itemCount = robot.count(1) --смотрим сколько палок в роботе
  350.         if itemCount == 0 then --если палки в роботе кончились
  351.             returnValue = false --возвращаем признак, что ПАЛКИ В РОБОТЕ И БОЧКЕ КОНЧИЛИСЬ
  352.         elseif itemCount < cropsStackSize then --если после попытки взять палки из бочки, мы имеем меньше стака палок в роботе
  353.             print("В бочке закончились палки!")
  354.             computer.beep(1000,1)
  355.             returnValue = true
  356.         else
  357.             returnValue = true
  358.         end
  359.         robot.turnLeft() --повернемся обратно к кропсам
  360.     end
  361.     return returnValue
  362. end
  363. function dropToChest() --все что есть в инвентори, скидываем в сундук
  364.     --начальная позиция - P0 смотрим вверх
  365.     robot.turnLeft()
  366.     for i=2,16 do
  367.         item = component.inventory_controller.getStackInInternalSlot(i)
  368.         if item then --если в слоте что-то есть
  369.             robot.select(i)
  370.             robot.drop() --сдаем все из текущего слота в сундук
  371.         end
  372.     end
  373.     robot.turnRight() --поворачиваемся к с0
  374.     robot.select(1)
  375. end
  376. function destroyAllDoubleCrops() --уничтожим все двойные кропсы
  377.     --пройдемся по массиву статусов кропсов и у всех кропсов, у которых статус = "жердочки", съездим к ним и сломаем их
  378.     for c=1,5 do
  379.         if c_status[c] == "double crop" then
  380.             robotGoTo_C_Crop_FromPark(c)
  381.             robot.swingDown() --ломаем кропсы
  382.             robotGoToPark(c)
  383.         end
  384.     end
  385.    
  386. end
  387. function howInterestingIsThisCrop(c) --оценивает полезность нового растения сравнивая статы дочернего ростения [с] со статами материнский растений . тип растения во внимание не принимается
  388. --возвращает: 0 - негодное
  389. --            -1 - годно для сохранения
  390. --            m - превосходит материнское, где 1<m<4 - номер материнского кропа, который нужно заменить новым растением
  391.  
  392.     if c_grow[c] >= grow_kill then --если grow у дочернего растения достигло опасного значения, то это растение считаем негодным
  393.         return 0
  394.     end
  395.    
  396.     --если статы нового растения больше максимально разрешенных
  397.     if (c_gain[c] > max_gain) or (c_grow[c] > max_grow) then
  398.         --то считаем это растение приемлемым
  399.         print("Полученое растение, превышает максимальные статы.")
  400.         return -1
  401.     end
  402.  
  403.     --сравним статы нового растения со статами материнских растений
  404.     maxDifference = 0 --самая лучшая разница в качестве
  405.     m_crop_maxDifference = 0 --материнский кроп с самой лучшей разницей в качестве
  406.     for m = 1, 4 do
  407.         --сравниваем статы полученного растения со статами материнских растений
  408.         difference = (c_gain[c] + c_grow[c] - c_resistans[c]) - (m_gain[m] + m_grow[m] - m_resistans[m])
  409.         if (difference > 0) and (difference > maxDifference) then --если растение лучше и это лучшая разница в качестве
  410.             maxDifference = difference --обновим лучшую разницу в качестве
  411.             m_crop_maxDifference = m --материнский кроп с самой лучшей разницей в качестве
  412.         end
  413.     end
  414.     if maxDifference>0 then
  415.         --полученное растение лучше чем одно из материнских, а значит нужно пересадить (на самый слабый материнский кроп)
  416.         return m_crop_maxDifference --возвращаем материнский кроп с самой лучшей разницей в качестве
  417.     end
  418.    
  419.     --если мы здесь, значит новое растение не привысило максимальные статы и не лучше чем материнские растения
  420.     --а занчит   РАСТЕНИЕ ПЛОХОЕ
  421.     return 0
  422.  
  423. end
  424. function placeDoubleCrops() --ставит новые палки
  425.     component.inventory_controller.equip() --экипируем кропсы(палки)
  426.     robot.useDown() --ставим палку на землю
  427.     robot.useDown() --ставим палку (получаются жердочки для скрещивания)
  428.     component.inventory_controller.equip() --возвращаем в руки лопатку
  429. end
  430. function findSeedsInRobotInventory() --возвращает номер слота в инвентори робота с семечками, если нет семечек, то возвращает 0, а если вообще ничего нет, то возвращает -1
  431.     foundAnything = false
  432.     for i=2,16 do
  433.         item = component.inventory_controller.getStackInInternalSlot(i)
  434.         if item then --если в слоте что-то есть
  435.             foundAnything = true
  436.             if item.name == "IC2:itemCropSeed" then --если в слоте семена
  437.                 return i --возвращаем номер слота, в котором семена
  438.             end
  439.         end
  440.     end
  441.     if foundAnything then --если что-то нашли (обычно это урожай), но семян не было
  442.         return 0
  443.     end
  444.     return -1 --вообще ничего нет
  445. end
  446. function analizeAndProceed(c) --функция анализа и обработки кропа. с - номер кропа.
  447.  
  448.    
  449.     analyze_result = geo.analyze(0) --анализируем блок под роботом
  450.     c_cropname[c] = get_crop_stat(analyze_result, "crop:name")
  451.     if c_cropname[c] ~= nil then -- если перед нами что-то вывелось, а не пустые палки
  452.        
  453.        
  454.         --получаем остальные статы кропа
  455.         c_gain[c] = get_crop_stat(analyze_result, "crop:gain")
  456.         c_grow[c] = get_crop_stat(analyze_result, "crop:grow")
  457.         c_resistans[c] = get_crop_stat(analyze_result, "crop:resistance")
  458.         c_size[c] = get_crop_stat(analyze_result, "crop:size")
  459.         c_maxSize[c] = get_crop_stat(analyze_result, "crop:maxSize")
  460.  
  461.         if c_status[c] == "double crop" or c_status[c] == "unknown" then  --если статус растения был двойные палки, значит появилось новое растение
  462.             print("Новый кроп С"..c..": "..c_cropname[c].."  "..c_grow[c].."  "..c_gain[c].."  "..c_resistans[c]) -- "Новый кроп С1:    reed"
  463.             --print(c_grow[c], c_gain[c], c_resistans[c], "size: "..c_size[c].."/"..c_maxSize[c]) --"23   31   0   size: 2/3"
  464.         end
  465.        
  466.         --если прокнуло растение другого вида, выкапываем его лопаткой и отвозим в сундук
  467.         if c_cropname[c] ~= cropname then
  468.             robot.useDown()--по умолчанию у нас в руках лопатка, юзаем ее
  469.             component.inventory_controller.equip() --экипируем кропсы(палки)
  470.             robot.useDown() --ставим палку (получаются жердочки для скрещивания)
  471.             component.inventory_controller.equip() --возвращаем в руки лопатку
  472.             c_status[c] = "double crop" --устанавливаем статус растения - жердочки
  473.            
  474.             --после копки проверим инвентори робота
  475.             foundAnything = false
  476.             for i=2,16 do
  477.                 item = component.inventory_controller.getStackInInternalSlot(i)
  478.                 if item then --если в слоте что-то есть
  479.                     foundAnything = true
  480.                 end
  481.             end
  482.            
  483.             if foundAnything or robot.count(1) == 0 then --если что-то выкопалось от этого непрофильного растения или закончились палки
  484.                 robotGoToPark(c) --едем на парковку  
  485.                 if foundAnything then --если есть в инветори что-то выкопанное, сдаем в сундук
  486.                     dropToChest()
  487.                 end
  488.                 --пополняем запас палок в роботе
  489.                 if grabCropsFromBarrel() then
  490.                 else --если палки кончились
  491.                     destroyAllDoubleCrops() --уничтожим все двойные кропсы
  492.                     robot_error("ПАЛКИ КОНЧИЛИСЬ!") --заканчиваем работу с ошибкой
  493.                 end
  494.                 robotGoTo_C_Crop_FromPark(c)
  495.             end
  496.         else--если растение нужного типа
  497.             if c_status[c] == "double crop" or c_status[c] == "unknown" then  --если статус растения был двойные палки, значит появилось новое растение
  498.                 --оценим полезность нового растения
  499.                 interest = howInterestingIsThisCrop(c)
  500.                
  501.                 --выведем инфу о новом кропе
  502.                 interestString = ""
  503.                 if interest == 0 then
  504.                     interestString = "негодное"
  505.                 elseif interest == -1 then
  506.                     interestString = "годное, статы дошли до целевых"
  507.                 else
  508.                     interestString = "превосходит материнское М"..interest
  509.                 end
  510.                 print("Полезность:"..interestString)
  511.                
  512.                 if interest == 0 then -- растение с плохими статами
  513.                     --уничтожаем растение
  514.                     robot.swingDown() --ломаем кропсы
  515.                     placeDoubleCrops() --ставим новые палки
  516.                     c_status[c] = "double crop" --устанавливаем статус растения - жердочки
  517.                     --посмотрим, попали ли семечки в инвентори
  518.                     seedSlot = findSeedsInRobotInventory() --находим слот с семечками
  519.                     if seedSlot > 0 then --если семечки есть
  520.                         --отвезем эти семечки домой
  521.                         robotGoToPark(c) --едем на парковку
  522.                         dropToChest() --сбрасываем всё в сундук
  523.                         grabCropsFromBarrel() --добираем палок из бочки
  524.                         robotGoTo_C_Crop_FromPark(c) --возвращаемся на кроп
  525.                     end
  526.                 else --растение со статами превышающими материнские или статы дошли до целевых
  527.                     c_status[c] = "growing" --устанавливаем статус растущего кропа
  528.                     --оставляем его в покое, пусть растет
  529.                 end
  530.            
  531.             else -- c_status[c] == "growing" --растение уже ранее сканировалось
  532.                
  533.                 if c_size[c] == c_maxSize[c] then --если растение доросло
  534.                     robot.swingDown() --ломаем кропсы, собираем урожай
  535.                     placeDoubleCrops() --ставим новые палки
  536.                     c_status[c] = "double crop" --устанавливаем статус растения - жердочки
  537.                    
  538.                     --посмотрим, попали ли семечки в инвентори
  539.                     seedSlot = findSeedsInRobotInventory() --находим слот с семечками
  540.                     if seedSlot > 0 then --если семечки есть
  541.                         --делаем повторную оценку полезности
  542.                         interest = howInterestingIsThisCrop(c)
  543.                         if interest == -1 then --годное, статы дошли до целевых
  544.                             --везем в сундук
  545.                             robotGoToPark(c) --едем на парковку
  546.                             dropToChest() --сбрасываем всё в сундук
  547.                             grabCropsFromBarrel() --добираем палок из бочки
  548.                             robotGoTo_C_Crop_FromPark(c) --возвращаемся на кроп
  549.                            
  550.                         elseif interest > 0 then --превосходит материнское
  551.                             --меняем материнское ростение на текущее дочернее
  552.                             print("Заменяем кроп М"..interest..":  "..m_grow[interest].."  "..m_gain[interest].."  "..m_resistans[interest].." -> "..c_grow[c].."  "..c_gain[c].."  "..c_resistans[c])
  553.                             --обновляем статы материнского растения
  554.                             m_grow[interest] = c_grow[c]
  555.                             m_gain[interest] = c_gain[c]
  556.                             m_resistans[interest] = c_resistans[c]
  557.                             --едем менять материнское растение
  558.                             robotGoToPark(c) --едем через паркинг. прямых маршрутов от С до M робот не знает
  559.                             robotGoTo_M_Crop_FromPark(interest) --едем на материнский кропс, который будем менять
  560.                             robot.swingDown() --ломаем кропсы, собираем урожай
  561.                             component.inventory_controller.equip() --экипируем кропсы(палки)
  562.                             robot.useDown() --ставим палку на землю
  563.                             component.inventory_controller.equip() --возвращаем в руки лопатку
  564.                             robot.select(seedSlot) --делаем активным слот с семенами, которые мы собираемся сажать
  565.                             component.inventory_controller.equip() -- берем семена в руки
  566.                             robot.useDown() --сажаем
  567.                             component.inventory_controller.equip() -- берем обратно лопатку в руки
  568.                             robot.select(1)
  569.                             robotGoToParkFrom_M_Crop(interest) --едем на паркинг
  570.                             dropToChest() --сбрасываем всё в сундук
  571.                             grabCropsFromBarrel() --добираем палок из бочки
  572.                             robotGoTo_C_Crop_FromPark(c) --возвращаемся на кроп
  573.                         end
  574.                     end
  575.                    
  576.                    
  577.                 end
  578.             end
  579.        
  580.        
  581.         end
  582.        
  583.        
  584.            
  585.        
  586.        
  587.  
  588.    
  589.     else -- если перед нами или пустые палки или воздух
  590.         if c_status[c] == "unknown" then -- если мы сканируем этот кроп впервые
  591.             if get_crop_stat(analyze_result, "name") == "IC2:blockCrop" then --если перед нами двойные палки
  592.                 c_status[c] = "double crop"
  593.             else --перед нами не растение и не двойные палки. значит перед нами воздух
  594.                 --ставим палки
  595.                 component.inventory_controller.equip() --экипируем кропсы(палки)
  596.                 robot.useDown() --ставим палку на землю
  597.                 robot.useDown() --ставим палку (получаются жердочки для скрещивания)
  598.                 component.inventory_controller.equip() --возвращаем в руки лопатку
  599.                 c_status[c] = "double crop" --устанавливаем статус растения - жердочки
  600.             end
  601.            
  602.         end
  603.        
  604.     end
  605.  
  606. end
  607.  
  608.  
  609.  
  610. ----------------------------------------------------
  611. --Шаг 1
  612. --Начинаем работать
  613. print("--------------------------------------"); --выводим приветствие
  614. print("Скрипт для робота, для поднятия статов у кропсов или разведения дубликатов запущен.");
  615. print("Версия: "..ver)
  616. if mode == 1 then -- 1 - режим поднятия статов кропсов
  617.     print("Выбран режим поднятия статов кропсов.");
  618. else -- 2 - режим разведения дубликатов кропсов
  619.     print("Выбран режим разведения дубликатов кропсов.");
  620. end
  621. print("Шаг 1. Проверка входящих условий.");
  622.  
  623. -- проверяем правильность входящий условий
  624.  
  625. --В руках должна быть лопатка
  626. robot.select(1) --выбираем первый слот инвентори, на случай если при начале работы был выбран другой слот
  627. component.inventory_controller.equip() --убираем лопатку к себе в инвентори и смотрим, лопатка ли это?
  628. item = component.inventory_controller.getStackInInternalSlot(1)
  629. if item == nil then --если в слоте ничего нет
  630.     robot_error("Нет лопатки в слоте для инструмента!")
  631. end
  632. if item.name ~= "berriespp:itemSpade" then --если в слоте что-то есть, но это не лопатка
  633.     robot_error("Нет лопатки в слоте для инструмента!")
  634. end
  635. component.inventory_controller.equip() --лопатку возвращаем в слот для инструмента
  636.  
  637. --print("Входящие условия соблюдены.")
  638.  
  639. ----------------------------------------------------
  640. --Шаг 2
  641. if mode == 1 then -- 1 - режим поднятия статов кропсов
  642.     print("Шаг 2. Сканируем материнские кропсы и запоминаем их статы.")
  643.  
  644.     --Сканируем материнские кропсы и запоминаем их статы
  645.     --Исходная позиция - робот стоит на P0
  646.  
  647.     -- кроп M1
  648.     robotMove_P0_M1()
  649.     analyze_result = geo.analyze(0)
  650.     cropname = get_crop_stat(analyze_result, "crop:name")
  651.     m_gain[1] = get_crop_stat(analyze_result, "crop:gain")
  652.     m_grow[1] = get_crop_stat(analyze_result, "crop:grow")
  653.     m_resistans[1] = get_crop_stat(analyze_result, "crop:resistance")
  654.     print("M1:", cropname, m_grow[1], m_gain[1], m_resistans[1])
  655.  
  656.     -- кроп M2
  657.     robotMove_M1_M2()
  658.     analyze_result = geo.analyze(0)
  659.     cropname = get_crop_stat(analyze_result, "crop:name")
  660.     m_gain[2] = get_crop_stat(analyze_result, "crop:gain")
  661.     m_grow[2] = get_crop_stat(analyze_result, "crop:grow")
  662.     m_resistans[2] = get_crop_stat(analyze_result, "crop:resistance")
  663.     print("M2:", cropname, m_grow[2], m_gain[2], m_resistans[2])
  664.    
  665.     -- кроп M3
  666.     robotMove_M2_M3()
  667.     analyze_result = geo.analyze(0)
  668.     cropname = get_crop_stat(analyze_result, "crop:name")
  669.     m_gain[3] = get_crop_stat(analyze_result, "crop:gain")
  670.     m_grow[3] = get_crop_stat(analyze_result, "crop:grow")
  671.     m_resistans[3] = get_crop_stat(analyze_result, "crop:resistance")
  672.     print("M3:", cropname, m_grow[3], m_gain[3], m_resistans[3])
  673.  
  674.     -- кроп M4
  675.     robotMove_M3_M4()
  676.     analyze_result = geo.analyze(0)
  677.     cropname = get_crop_stat(analyze_result, "crop:name")
  678.     m_gain[4] = get_crop_stat(analyze_result, "crop:gain")
  679.     m_grow[4] = get_crop_stat(analyze_result, "crop:grow")
  680.     m_resistans[4] = get_crop_stat(analyze_result, "crop:resistance")
  681.     print("M4:", cropname, m_grow[4], m_gain[4], m_resistans[4])
  682.  
  683.    
  684.     robotMove_M4_P0() --возвращаем робота в исходное положение
  685.  
  686. end
  687. ----------------------------------------------------
  688. --Шаг 3
  689. if mode == 1 then -- 1 - режим поднятия статов кропсов
  690.     print("Шаг 3. Приступаем к поднятию статов.");
  691. else -- 2 - режим разведения дубликатов кропсов
  692.     print("Шаг 2. Приступаем к разведению дубликатов кропсов.");
  693. end
  694.  
  695. while true do --главный цикл
  696.    
  697.     --пополняем запас палок в роботе
  698.     if grabCropsFromBarrel() then
  699.     else --если палки кончились
  700.         destroyAllDoubleCrops() --уничтожим все двойные кропсы
  701.         robot_error("ПАЛКИ КОНЧИЛИСЬ!")
  702.     end
  703.    
  704.     --едем сканить дочерние кропсы
  705.     robotMove_P0_C1()
  706.     analizeAndProceed(1)
  707.     robotMove_C1_C4()
  708.     analizeAndProceed(4)
  709.     robotMove_C4_C5()
  710.     analizeAndProceed(5)
  711.     robotMove_C5_C2()
  712.     analizeAndProceed(2)
  713.     robotMove_C2_C3()
  714.     analizeAndProceed(3)
  715.     robotMove_C3_P0() --конечное положение P0 смотрим вверх
  716.    
  717.     --os.exit()
  718.    
  719.  
  720.     os.sleep(15)
  721. end
  722.  
  723. os.exit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement