Advertisement
MoonlightOwl

GriefDrone 2: Tablet

Feb 17th, 2015
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.18 KB | None | 0 0
  1. local event = require('event')
  2. local term = require('term')
  3. local com = require('component')
  4. local modem = com.modem
  5. local gpu = com.gpu
  6.  
  7. --local args = {...}
  8. local width, height = gpu.getResolution()
  9. local hw, hh = math.ceil(width/2), math.ceil(height/2)
  10. local WALL = 1
  11. local EMPTY = 0
  12. local side = {}
  13. side[101] = 0
  14. side[113] = 1
  15. side[119] = 2
  16. side[115] = 3
  17. side[100] = 4
  18. side[97]  = 5
  19.  
  20. local loc = {x=0, y=0, z=0}
  21. local map = {}
  22. function set(x, y, z, value)
  23.   if map[x] == nil then map[x] = {} end
  24.   if map[x][y] == nil then map[x][y] = {} end
  25.   map[x][y][z] = value
  26. end
  27. function get(x, y, z)
  28.   if map[x] ~= nil and map[x][y] ~= nil then
  29.     return map[x][y][z]
  30.   else
  31.     return nil
  32.   end
  33. end
  34.  
  35. function step(x, y, z)
  36.   modem.broadcast(27, 'step', x, y, z)
  37.   name, add, _, _, _, message = event.pull(10, 'modem_message')
  38.   if name ~= nil then
  39.     if message then
  40.       loc.x = loc.x+x
  41.       loc.y = loc.y+y
  42.       loc.z = loc.z+z
  43.       set(loc.x, loc.y, loc.z, EMPTY)
  44.     else
  45.       set(loc.x+x, loc.y+y, loc.z+z, WALL)
  46.     end
  47.     draw(map, loc.y)
  48.   end
  49. end
  50.  
  51. function draw(map, y)
  52.   term.clear()
  53.   for x, a in pairs(map) do
  54.     if a[y] ~= nil then
  55.       for z, c in pairs(a[y]) do
  56.         local dx = x - loc.x + hw
  57.         local dz = z - loc.z + hh
  58.         if dx < 0 or dx > width then
  59.           set(x, y, z, nil)
  60.         elseif dz < 0 or dz > height then
  61.           set(x, y, z, nil)
  62.         else
  63.           if c == WALL then
  64.             gpu.set(dx,dz, '#')
  65.           else
  66.             gpu.set(dx,dz, '.')
  67.           end
  68.         end
  69.       end
  70.     end
  71.   end
  72.   gpu.setForeground(0xff0000)
  73.   gpu.set(hw,hh, '@')
  74.   gpu.setForeground(0xffffff)
  75. end
  76.  
  77. function status(text)
  78.   term.setCursor(1, height)
  79.   term.clearLine()
  80.   io.write(" "..text)
  81. end
  82.  
  83. function grab()
  84.   status("Введите направление: [W], [A], [S], [D], [Q] или [E]")
  85.   gpu.setForeground(0xffff00)
  86.   gpu.set(hw,hh, '@')
  87.  
  88.   name, add, char, code = event.pull(10, 'key_down')
  89.   if name == 'key_down' then
  90.     local s = side[char]
  91.     if s ~= nil then
  92.       modem.broadcast(27, 'suck', s)
  93.       modem.broadcast(27, 'drain', s)
  94.     end
  95.   end
  96.  
  97.   gpu.setForeground(0xff0000)
  98.   gpu.set(hw,hh, '@')
  99.   gpu.setForeground(0xffffff)
  100.   status("...")
  101. end
  102. function trow()
  103.   status("Введите направление: [W], [A], [S], [D], [Q] или [E]")
  104.   gpu.setForeground(0x00ffff)
  105.   gpu.set(hw,hh, '@')
  106.  
  107.   name, add, char, code = event.pull(10, 'key_down')
  108.   if name == 'key_down' then
  109.     local s = side[char]
  110.     if s ~= nil then
  111.       modem.broadcast(27, 'drop', s)
  112.       modem.broadcast(27, 'fill', s)
  113.     end
  114.   end
  115.  
  116.   gpu.setForeground(0xff0000)
  117.   gpu.set(hw,hh, '@')
  118.   gpu.setForeground(0xffffff)
  119.   status("...")
  120. end
  121.  
  122. function clearmap()
  123.   map = {}
  124.   loc = {x=0, y=0, z=0}
  125.   set(0, 0, 0, EMPTY)
  126.   draw(map)
  127. end
  128.  
  129. modem.open(27)
  130.  
  131. print("Программа активирована.")
  132. print("Для ввода команд - нажмите любую кнопку.")
  133. print("Выход - команда exit")
  134. print("Справка - команда help")
  135.  
  136. while true do
  137.   name, add, _, _, _, message = event.pull()
  138.   if name == 'key_down' then
  139.     data = {}
  140.     io.write("> ")
  141.     line = io.read()
  142.     for w in line:gmatch("%S+") do table.insert(data, w) end
  143.     if data[1] == 'exit' then break
  144.     elseif data[1] == 'help' then
  145.       print("Команды:")
  146.       print("direct            -  переключиться в ружим ручного управления")
  147.       print("move <x> <y> <z>  -  двигаться по координатам (x,y,z) относительно текущей позиции")
  148.       print("suck <side>       -  забрать предметы из сундука")
  149.       print("drop <side>       -  выбросить/положить предметы")
  150.       print("drain <side>      -  захват жидкости (если есть свободное место, и цистерна  содержит ту же жидкость)")
  151.       print("fill <side>       -  вылить жидкость")
  152.       print("help              -  справка")
  153.       print("exit              -  покинуть программу\n")
  154.     elseif data[1] == 'direct' then
  155.       print("ВНИМАНИЕ! Переход в режим ручного управления.")
  156.       print("[W], [A], [S], [D] - движение в стороны (ориентирование по сторонам света)")
  157.       print("[Q], [E] - движение вверх/вниз")
  158.       print("[G]+[СТОРОНА] - захват предмета/жидкости")
  159.       print("[T]+[СТОРОНА] - сброс предмета/жидкости")
  160.       print("[F]+[СТОРОНА] - ломать блок")
  161.       print("[R]+[СТОРОНА] - поставить блок")
  162.       print("[C] - очистить карту")
  163.       print("[Z] - покинуть режим прямого управления")
  164.       print("Нажмите любую кнопку для продолжения.")
  165.       event.pull("key_down")
  166.  
  167.       clearmap()
  168.       while true do
  169.         name, add, char, code, _, message = event.pull()
  170.         if name == 'key_down' then
  171.           if char == 113 then -- Q
  172.             step(0, 1, 0)
  173.           elseif char == 101 then -- E
  174.             step(0, -1, 0)
  175.           elseif char == 119 then -- W
  176.             step(0, 0, -1)
  177.           elseif char == 115 then -- S
  178.             step(0, 0, 1)
  179.           elseif char == 97 then  -- A
  180.             step(-1, 0, 0)
  181.           elseif char == 100 then -- D
  182.             step(1, 0, 0)
  183.           elseif char == 103 then -- G
  184.             grab()
  185.           elseif char == 116 then -- T
  186.             trow()
  187.           elseif char == 99 then  -- C
  188.             clearmap()
  189.           elseif char == 122 then -- Z
  190.             break
  191.           end
  192.         elseif name == 'modem_message' then
  193.           status(message)
  194.         end
  195.       end
  196.  
  197.       term.clear()
  198.       print("Вы покинули режим ручного управления.")
  199.     else
  200.       modem.broadcast(27, table.unpack(data))
  201.     end
  202.   elseif name == 'modem_message' then
  203.     print(message)
  204.   end
  205. end
  206.  
  207. modem.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement