Romanok2805

beer.lua

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