imrskull

crop_1

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