Advertisement
Romanok2805

beer.lua

May 24th, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 7.10 KB | None | 0 0
  1.  
  2. local r = require("robot") --Привычнее на r вместо robot
  3. local component = require("component")
  4. local inventory = component.inventory_controller
  5.  
  6. local inventorySize = r.inventorySize()
  7. local myPosition = {x = 1, y = 1}
  8. local positionForReturn = {x = 1, y = 1}
  9. local slot = 0
  10. local barrel = {hop = 0, wheat = 0, capsules = 30, timeInHours = 0, x = 1, y = 1, quantity = 0, remainingQuantity = 0}
  11. local firstStart = true
  12. --Функции
  13. local function errorAndPrint(reason)
  14.     print("Произошла ошибка: "..reason.."\nПозиции робота:\nX: "..myPosition.x.."\nY: "..myPosition.y)
  15.     --debug
  16.     print(positionForReturn.x, positionForReturn.y)
  17.     print(barrel.x, barrel.y)
  18.     os.exit()
  19. end
  20.  
  21. local function putInABarrel()
  22.     for i = 1 + slot, 9 + slot, 4 do -- Будет брать 1, 5, 9 слоты, потом 2, 6, 10 и т.д.
  23.         r.select(i)
  24.         inventory.equip()
  25.         if r.use() ~= nil then
  26.             errorAndPrint("Не удалось положить ингредиенты\nв бочку.")
  27.         end
  28.     end
  29.     if slot ~= 3 then
  30.         slot = slot + 1
  31.     else
  32.         slot = 0
  33.     end
  34. end
  35.  
  36. local function suckUpAndCheck(quantity, slot)
  37.     r.select(slot)
  38.     while quantity ~= r.count() do
  39.         if not r.suckUp(quantity - r.count()) then
  40.             errorAndPrint("Недостаточно предметов.")
  41.         end
  42.     end
  43. end
  44.  
  45. local function goForward(steps) -- Ходить сколько нужно, больше одного раза.
  46.     for i = 1, steps do
  47.         r.forward()
  48.         print("Идём вперёд "..i)
  49.     end
  50. end
  51.  
  52. local function goBack(steps)
  53.     for i = 1, steps do
  54.         r.back()
  55.     end
  56. end
  57.  
  58. local function getItemsOnBase(quantityStacks) --От 1 до 4
  59.     for i = 1, quantityStacks do
  60.         suckUpAndCheck(barrel.hop, i)
  61.     end
  62.     r.turnLeft()
  63.     r.forward()
  64.     for i = 5, quantityStacks + 4 do
  65.         suckUpAndCheck(barrel.wheat, i)
  66.     end
  67.     r.forward()
  68.     for i = 9, quantityStacks + 8 do
  69.         suckUpAndCheck(barrel.capsules, i)
  70.     end
  71.     goBack(2)
  72.     r.turnRight()
  73.     r.forward()
  74. end
  75.  
  76. local function moveToX1()
  77.     if myPosition.x ~= 1 then
  78.         r.turnRight()
  79.         goForward(myPosition.x - 1)
  80.         r.turnLeft()
  81.         myPosition.x = 1
  82.     end
  83. end
  84.  
  85. local function GoToBase()
  86.     print(myPosition.x, myPosition.y)
  87.     positionForReturn.x, positionForReturn.y = nextFreeBarrel()
  88.     moveToX1()
  89.     for i = 1, myPosition.y - 1 do
  90.         r.down()
  91.     end
  92.     myPosition.y = 1
  93.     r.back()
  94. end
  95.  
  96. local function GoBackToBarrel()
  97.     for i = 1, positionForReturn.y - 1 do
  98.         r.up()
  99.     end
  100.     if positionForReturn.x ~= 1 then
  101.         r.turnLeft()
  102.         goForward(positionForReturn.x - 1)
  103.         r.turnRight()
  104.     end
  105.     myPosition.x, myPosition.y = positionForReturn.x, positionForReturn.y
  106. end
  107.  
  108. local function goLeft()
  109.     r.turnLeft()
  110.     r.forward()
  111.     r.turnRight()
  112.     myPosition.x = myPosition.x + 1
  113. end
  114.  
  115. local function goUp()
  116.     r.up()
  117.     myPosition.y = myPosition.y + 1
  118. end
  119.  
  120. local function dropUpAll()
  121.     for i = 1, inventorySize do
  122.         r.select(i)
  123.         if not r.dropUp() then
  124.             break
  125.         end
  126.     end
  127. end
  128.  
  129. local function nextFreeBarrel()
  130.     if myPosition.x == barrel.x then
  131.         return 1, myPosition.y + 1
  132.     else
  133.         return myPosition.x + 1, myPosition.y
  134.     end
  135. end
  136. --Спрашиваем про сорт
  137. print([[Выберите сорт пива:
  138. 1 - Soup (Похлёбка)
  139. 2 - White (Белое)
  140. 3 - Без префикса
  141. 4 - Dark (Тёмноё)
  142. 5 - Black (Чёрное)
  143. 6 - Black Stuff]])
  144.  
  145. local sort = {0, 3, 5, 7, 8, 10}
  146. barrel.hop = sort[tonumber(io.read())]
  147. barrel.wheat = 10 - barrel.hop
  148. sort = nil
  149. if barrel.hop == nil then
  150.     errorAndPrint("введены не правильные данные.")
  151. end
  152.  
  153. print([[Введите соотношение пшеницы + хмеля/капсулы воды
  154. 1 - Black Stuff
  155. 2 - Thick
  156. 3 - Strong (плохо работает)
  157. 4 - Без названия
  158. 5 - Lite
  159. 6 - Stodge]])
  160.  
  161. local temp = tonumber(io.read())
  162. local koff = {9, 6, 4.5, 3, 2, 1}
  163. if koff[temp] ~= nil then
  164.     barrel.hop = math.min(math.ceil(barrel.hop * koff[temp]), 64)
  165.     barrel.wheat = math.min(math.ceil(barrel.wheat * koff[temp]), 64)
  166.     koff = nil
  167. else
  168.     koff = nil
  169.     errorAndPrint("введены не правильные данные.")
  170. end
  171.  
  172. print([[Введите время настаивания.
  173. 1 - Brew 0 часов
  174. 2 - Youngster 0.5 часа
  175. 3 - Beer 2 часа
  176. 4 - Ale 12 часов
  177. 5 - Dragonblood 24 часа]])
  178.  
  179. local time = {0, 0.5, 2, 12, 24}
  180. barrel.timeInHours = time[tonumber(io.read())]
  181. time = nil
  182. if barrel.timeInHours == nil then
  183.     errorAndPrint("введены неправильные данные.")
  184. end
  185.  
  186. print([[Введите кол-во бочек:
  187. Точка отсчёта начинается с нижнего правого угла
  188. С права на лево - x
  189. С низу на вверх - y
  190. Пример:
  191. ######
  192. ######
  193. ######
  194. Будет записыватся как x = 6, y = 3
  195. Так же если ввести x = 1, y = 1,
  196. то робот будет работать только
  197. с одной бочкой спереди его
  198. Если вы не разобрались то напишите
  199. об этом в чат]])
  200.  
  201. io.write("x = ")
  202. barrel.x = tonumber(io.read())
  203. io.write("y = ")
  204. barrel.y = tonumber(io.read())
  205.  
  206. if barrel.x == nil or barrel.y == nil then
  207.     errorAndPrint("введены не правильные данные.")
  208. end
  209.  
  210. barrel.quantity = barrel.x * barrel.y
  211. barrel.remainingQuantity = barrel.quantity
  212.  
  213. print("Итого на одну бочку:"..
  214. "\nХмеля: "..barrel.hop..
  215. "\nПшеницы: "..barrel.wheat..
  216. "\nКапсул: 30"..
  217. "\nИтого:"..
  218. "\nБочек: "..barrel.quantity..
  219. "\nХмеля: "..barrel.quantity * barrel.hop..
  220. "\nПшеницы: "..barrel.quantity * barrel.wheat..
  221. "\nКапсул: "..barrel.x * barrel.y * 30 ..
  222. "\nВремя: "..barrel.timeInHours.." часов"..
  223. "\nУбедитесь в наличии всех ресурсов."..
  224. "Начать? (введите 0 для выхода)")
  225.  
  226. if io.read() == "0" then os.exit() end
  227.  
  228. repeat
  229.     local numberOfWork = math.min(barrel.remainingQuantity, 4)
  230.     getItemsOnBase(numberOfWork)
  231.     GoBackToBarrel()
  232.     for i = 1, numberOfWork do
  233.         putInABarrel()
  234.         if i ~= numberOfWork then
  235.             if myPosition.x ~= barrel.x then
  236.                 goLeft()
  237.             else
  238.                 moveToX1()
  239.                 if myPosition.y ~= barrel.y then
  240.                     goUp()
  241.                 end
  242.             end
  243.         end
  244.     end
  245.     GoToBase()
  246.     barrel.remainingQuantity = barrel.remainingQuantity - numberOfWork
  247. until barrel.remainingQuantity == 0
  248.  
  249. print("Игридиенты загружены, ждите "..barrel.timeInHours.." часов")
  250. os.sleep(barrel.timeInHours * 3600 + 300)
  251.  
  252. barrel.remainingQuantity = barrel.quantity
  253.  
  254. repeat
  255.     local numberOfWork = math.min(barrel.remainingQuantity, inventorySize - 1)
  256.     GoBackToBarrel()
  257.     for i = 1, numberOfWork do
  258.         r.swing()
  259.         if i ~= numberOfWork then
  260.             if myPosition.x ~= barrel.x then
  261.                 goLeft()
  262.             else
  263.                 moveToX1()
  264.                 if myPosition.y ~= barrel.y then
  265.                     goUp()
  266.                 end
  267.             end
  268.         end
  269.     end
  270.     GoToBase()
  271.     r.turnLeft()
  272.     goForward(3)
  273.     dropUpAll()
  274.     goBack(3)
  275.     r.turnRight()
  276.     barrel.remainingQuantity = barrel.remainingQuantity - numberOfWork
  277. until barrel.remainingQuantity == 0
  278.  
  279. print("Пиво сварено и положено в сундук!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement