Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local event = require('event')
- local term = require('term')
- local com = require('component')
- local modem = com.modem
- local gpu = com.gpu
- --local args = {...}
- local width, height = gpu.getResolution()
- local hw, hh = math.ceil(width/2), math.ceil(height/2)
- local WALL = 1
- local EMPTY = 0
- local side = {}
- side[101] = 0
- side[113] = 1
- side[119] = 2
- side[115] = 3
- side[100] = 4
- side[97] = 5
- local loc = {x=0, y=0, z=0}
- local map = {}
- function set(x, y, z, value)
- if map[x] == nil then map[x] = {} end
- if map[x][y] == nil then map[x][y] = {} end
- map[x][y][z] = value
- end
- function get(x, y, z)
- if map[x] ~= nil and map[x][y] ~= nil then
- return map[x][y][z]
- else
- return nil
- end
- end
- function step(x, y, z)
- modem.broadcast(27, 'step', x, y, z)
- name, add, _, _, _, message = event.pull(10, 'modem_message')
- if name ~= nil then
- if message then
- loc.x = loc.x+x
- loc.y = loc.y+y
- loc.z = loc.z+z
- set(loc.x, loc.y, loc.z, EMPTY)
- else
- set(loc.x+x, loc.y+y, loc.z+z, WALL)
- end
- draw(map, loc.y)
- end
- end
- function draw(map, y)
- term.clear()
- for x, a in pairs(map) do
- if a[y] ~= nil then
- for z, c in pairs(a[y]) do
- local dx = x - loc.x + hw
- local dz = z - loc.z + hh
- if dx < 0 or dx > width then
- set(x, y, z, nil)
- elseif dz < 0 or dz > height then
- set(x, y, z, nil)
- else
- if c == WALL then
- gpu.set(dx,dz, '#')
- else
- gpu.set(dx,dz, '.')
- end
- end
- end
- end
- end
- gpu.setForeground(0xff0000)
- gpu.set(hw,hh, '@')
- gpu.setForeground(0xffffff)
- end
- function status(text)
- term.setCursor(1, height)
- term.clearLine()
- io.write(" "..text)
- end
- function grab()
- status("Введите направление: [W], [A], [S], [D], [Q] или [E]")
- gpu.setForeground(0xffff00)
- gpu.set(hw,hh, '@')
- name, add, char, code = event.pull(10, 'key_down')
- if name == 'key_down' then
- local s = side[char]
- if s ~= nil then
- modem.broadcast(27, 'suck', s)
- modem.broadcast(27, 'drain', s)
- end
- end
- gpu.setForeground(0xff0000)
- gpu.set(hw,hh, '@')
- gpu.setForeground(0xffffff)
- status("...")
- end
- function trow()
- status("Введите направление: [W], [A], [S], [D], [Q] или [E]")
- gpu.setForeground(0x00ffff)
- gpu.set(hw,hh, '@')
- name, add, char, code = event.pull(10, 'key_down')
- if name == 'key_down' then
- local s = side[char]
- if s ~= nil then
- modem.broadcast(27, 'drop', s)
- modem.broadcast(27, 'fill', s)
- end
- end
- gpu.setForeground(0xff0000)
- gpu.set(hw,hh, '@')
- gpu.setForeground(0xffffff)
- status("...")
- end
- function clearmap()
- map = {}
- loc = {x=0, y=0, z=0}
- set(0, 0, 0, EMPTY)
- draw(map)
- end
- modem.open(27)
- print("Программа активирована.")
- print("Для ввода команд - нажмите любую кнопку.")
- print("Выход - команда exit")
- print("Справка - команда help")
- while true do
- name, add, _, _, _, message = event.pull()
- if name == 'key_down' then
- data = {}
- io.write("> ")
- line = io.read()
- for w in line:gmatch("%S+") do table.insert(data, w) end
- if data[1] == 'exit' then break
- elseif data[1] == 'help' then
- print("Команды:")
- print("direct - переключиться в ружим ручного управления")
- print("move <x> <y> <z> - двигаться по координатам (x,y,z) относительно текущей позиции")
- print("suck <side> - забрать предметы из сундука")
- print("drop <side> - выбросить/положить предметы")
- print("drain <side> - захват жидкости (если есть свободное место, и цистерна содержит ту же жидкость)")
- print("fill <side> - вылить жидкость")
- print("help - справка")
- print("exit - покинуть программу\n")
- elseif data[1] == 'direct' then
- print("ВНИМАНИЕ! Переход в режим ручного управления.")
- print("[W], [A], [S], [D] - движение в стороны (ориентирование по сторонам света)")
- print("[Q], [E] - движение вверх/вниз")
- print("[G]+[СТОРОНА] - захват предмета/жидкости")
- print("[T]+[СТОРОНА] - сброс предмета/жидкости")
- print("[F]+[СТОРОНА] - ломать блок")
- print("[R]+[СТОРОНА] - поставить блок")
- print("[C] - очистить карту")
- print("[Z] - покинуть режим прямого управления")
- print("Нажмите любую кнопку для продолжения.")
- event.pull("key_down")
- clearmap()
- while true do
- name, add, char, code, _, message = event.pull()
- if name == 'key_down' then
- if char == 113 then -- Q
- step(0, 1, 0)
- elseif char == 101 then -- E
- step(0, -1, 0)
- elseif char == 119 then -- W
- step(0, 0, -1)
- elseif char == 115 then -- S
- step(0, 0, 1)
- elseif char == 97 then -- A
- step(-1, 0, 0)
- elseif char == 100 then -- D
- step(1, 0, 0)
- elseif char == 103 then -- G
- grab()
- elseif char == 116 then -- T
- trow()
- elseif char == 99 then -- C
- clearmap()
- elseif char == 122 then -- Z
- break
- end
- elseif name == 'modem_message' then
- status(message)
- end
- end
- term.clear()
- print("Вы покинули режим ручного управления.")
- else
- modem.broadcast(27, table.unpack(data))
- end
- elseif name == 'modem_message' then
- print(message)
- end
- end
- modem.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement