Advertisement
Rosevelt

crops

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