Перейти к содержимому

Doob

Гуру
  • Публикации

    1 089
  • Зарегистрирован

  • Посещение

  • Победитель дней

    141

Сообщения, опубликованные пользователем Doob


  1. Я думал об этом, но первое, что пришло на ум это копирование заготовок, а это убогий костыль и в 1.7.10 копирования нет.

    Если состояние блока можно задавать одним параметром как для ванильных (ступеньки/таблички), то надо только добавить пару строк в функцию отрисовки.


  2. Ага, но это не граф, а алгоритм, т. к. он постоянно меняется, вследствие имитации многомерности (скорее это просто набор правил для генерации графов). Похожесть комнат на кубы это всего-лишь условность, будто реальность преобразуется в привычный для игрока вид, а все, что игрок не видит, смещено относительно его реальности и недоступно для взаимодействия (хотя весь смысл в наличии косвенного воздействия на лабиринт).

     

    Подобные примеры есть в играх knossu, Antichamber и еще в куче инди-самоделок, там связанные переходы не имитируются, а в майне такого не провернуть, т. к. нет доступа к рендер-движку, для имитации доступен только setblock и tp, поэтому все так хардкорно.


  3. Пробный шарик: http://pastebin.com/0agG1q18
    Имитация магнитной пленки неудачная, но можно оставить так и разбивать голограмму на 4 блока, т. к. можно только жертвовать памятью или указывать позицию вручную (хотя, можно сделать более рациональный алгоритм, я об этом не думал)


  4. Лабиринт уже давно готов, строить его никому не надо, он сам строится. Нету самого главного - единой системы управления ловушками.

    Если накидают идей с ловушками, то остается их реализовать и создать мирок для лабиринта.


  5. Не все так просто, чтобы поставить ступеньку вверх ногами, над ней должен быть блок, т. к. робот проверяет сверху наличие блока для опоры, для других сторон так же. Ангел-апгрейд не поможет.

    • Нравится 1

  6. Что-то типа такого?

     

     

    local component = require('component')
    local gpu = component.gpu
    local event = require('event')
    local term = require('term')
    local reactor
    if component.isAvailable('reactor') then
      reactor = component.reactor
    elseif component.isAvailable('reactor_chamber') then
      reactor = component.reactor_chamber
    end
    
    local tbl = {
      {
        {3, 2},  {9, 2},  {15, 2},
        {3, 5},  {9, 5},  {15, 5},
        {3, 8},  {9, 8},  {15, 8},
        {3, 11}, {9, 11}, {15, 11},
        {3, 14}, {9, 14}, {15, 14},
        {3, 17}, {9, 17}, {15, 17}
      },
      {
        {3, 2},  {9, 2},  {15, 2},  {21, 2},
        {3, 5},  {9, 5},  {15, 5},  {21, 5},
        {3, 8},  {9, 8},  {15, 8},  {21, 8},
        {3, 11}, {9, 11}, {15, 11}, {21, 11},
        {3, 14}, {9, 14}, {15, 14}, {21, 14},
        {3, 17}, {9, 17}, {15, 17}, {21, 17}},
      {
        {3, 2},  {9, 2},  {15, 2},  {21, 2},  {27, 2},
        {3, 5},  {9, 5},  {15, 5},  {21, 5},  {27, 5},
        {3, 8},  {9, 8},  {15, 8},  {21, 8},  {27, 8},
        {3, 11}, {9, 11}, {15, 11}, {21, 11}, {27, 11},
        {3, 14}, {9, 14}, {15, 14}, {21, 14}, {27, 14},
        {3, 17}, {9, 17}, {15, 17}, {21, 17}, {27, 17}},
      {
        {3, 2},  {9, 2},  {15, 2},  {21, 2},  {27, 2},  {33, 2},
        {3, 5},  {9, 5},  {15, 5},  {21, 5},  {27, 5},  {33, 5},
        {3, 8},  {9, 8},  {15, 8},  {21, 8},  {27, 8},  {33, 8},
        {3, 11}, {9, 11}, {15, 11}, {21, 11}, {27, 11}, {33, 11},
        {3, 14}, {9, 14}, {15, 14}, {21, 14}, {27, 14}, {33, 14},
        {3, 17}, {9, 17}, {15, 17}, {21, 17}, {27, 17}, {33, 17}},
      {
        {3, 2},  {9, 2},  {15, 2},  {21, 2},  {27, 2},  {33, 2},  {39, 2},
        {3, 5},  {9, 5},  {15, 5},  {21, 5},  {27, 5},  {33, 5},  {39, 5},
        {3, 8},  {9, 8},  {15, 8},  {21, 8},  {27, 8},  {33, 8},  {39, 8},
        {3, 11}, {9, 11}, {15, 11}, {21, 11}, {27, 11}, {33, 11}, {39, 11},
        {3, 14}, {9, 14}, {15, 14}, {21, 14}, {27, 14}, {33, 14}, {39, 14},
        {3, 17}, {9, 17}, {15, 17}, {21, 17}, {27, 17}, {33, 17}, {39, 17}},
      {
        {3, 2},  {9, 2},  {15, 2},  {21, 2},  {27, 2},  {33, 2},  {39, 2},  {45, 2},
        {3, 5},  {9, 5},  {15, 5},  {21, 5},  {27, 5},  {33, 5},  {39, 5},  {45, 5},
        {3, 8},  {9, 8},  {15, 8},  {21, 8},  {27, 8},  {33, 8},  {39, 8},  {45, 8},
        {3, 11}, {9, 11}, {15, 11}, {21, 11}, {27, 11}, {33, 11}, {39, 11}, {45, 11},
        {3, 14}, {9, 14}, {15, 14}, {21, 14}, {27, 14}, {33, 14}, {39, 14}, {45, 14},
        {3, 17}, {9, 17}, {15, 17}, {21, 17}, {27, 17}, {33, 17}, {39, 17}, {45, 17}},
      {
        {3, 2},  {9, 2},  {15, 2},  {21, 2},  {27, 2},  {33, 2},  {39, 2},  {45, 2},  {51, 2},
        {3, 5},  {9, 5},  {15, 5},  {21, 5},  {27, 5},  {33, 5},  {39, 5},  {45, 5},  {51, 5},
        {3, 8},  {9, 8},  {15, 8},  {21, 8},  {27, 8},  {33, 8},  {39, 8},  {45, 8},  {51, 8},
        {3, 11}, {9, 11}, {15, 11}, {21, 11}, {27, 11}, {33, 11}, {39, 11}, {45, 11}, {51, 11},
        {3, 14}, {9, 14}, {15, 14}, {21, 14}, {27, 14}, {33, 14}, {39, 14}, {45, 14}, {51, 14},
        {3, 17}, {9, 17}, {15, 17}, {21, 17}, {27, 17}, {33, 17}, {39, 17}, {45, 17}, {51, 17}}
    }
    
    local tSize = {[22] = 1, [28] = 2, [34] = 3, [40] = 4, [46] = 5, [52] = 6, [58] = 7}
    local r_t = tSize[reactor.getInventorySize()]
    local side_r = 3
    
    local function list()
      for k = 1, #tbl[r_t] do
        local item = reactor.getStackInSlot(k)
        if item ~= nil then
          gpu.fill(tbl[r_t][k][1], tbl[r_t][k][2], 3, 2, '#')
          
        end
      end
    end
    
    local function setka()
      for i = 1, #tbl[7] do
        gpu.fill(tbl[7][i][1], tbl[7][i][2], 3, 2, 'X')
      end
    end
    
    local function click()
      while 1 do
        local e = {event.pull('touch')}
        for j = 1, #tbl[r_t] do
          if e[3] >= tbl[r_t][j][1] and e[4] >= tbl[r_t][j][2] and e[3] <= tbl[r_t][j][1]+3 and e[4] <= tbl[r_t][j][2]+2 then
            term.clear()
            setka()
            list()
            local item = reactor.getStackInSlot(j)
            if item ~= nil then
              gpu.set(1, 20, 'item: '..item.display_name)
              if item.dmg ~= nil and item.max_dmg ~= nil then
                gpu.set(30, 20, ' '.. string.sub(item.dmg/item.max_dmg, 1, 4) .. '%')
              end
              break
            end
          end
        end
        gpu.set(1, 21, 'energy: '..reactor.getEUOutput())
        gpu.set(1, 22, 'heat: '..string.sub(reactor.getHeat()/reactor.getMaxHeat(), 1, 4)..' %')
      end
    end
    
    term.clear()
    setka()
    list()
    click()
    

     

     

     

    Как руки дойдут - доведу до ума.


  7. пересмотрите пожалуйста весь код, очень часто попадается ошибка двойного написания local. а также ругается на inv_scaner в 615 строке, разобраться что он требует не вышло

     

    Спасибо за информацию, правил все автозаменой, даже не смотрел в код.

    Проверил в майнерсе, работает, но из-за неизвестного препятствия вернулся, не обработав весь объем.

    Бедрок плоский, не знаю, во что там можно упереться, зато работает.

     

     

    Ты оптимизировал код Артёма или это свой ?

     

    Выше написано, я немного подчистил мусор и добавил использование связанной карты.

    Могу выложить свой, но этих геокопалок и так уже, как грязи.


  8. По сравнению с мониторами, голограмма заливается быстрее, (правда, шрифт я использовал 3x3 пикселя)

    Для каких-нибудь динамичных рекламных панелей вполне сгодится (масштаб-то ого-го! да и просунуть можно туда, куда монитор не влезет), а клавиатуру заменить не трудно.

    • Нравится 2

  9. 12 адаптеров? Может быть 12 хранилищ? Потому-что 60 компонентов ни один сервер не потянет.

     

    Сделал небольшой скрипт вывода информации, можно добавлять компоненты в определенном порядке, воспользовавшись функцией 'add'

     

     

    local component = require('component')
    local event = require('event')
    local term = require('term')
    local e
    local tType = {
      'batbox',
      'cesu',
      'mfe',
      'mfsu',
      'chargepad_batbox',
      'chargepad_cesu',
      'chargepad_mfe',
      'chargepad_mfsu'
    }
    
    local tStore = {}
    
    local function add()
      while 1 do
        e = {event.pull()}
        for i = 1, #tType do
          if e[1] == 'component_added' and tType[i] == e[3] then
            table.insert(tStore, e[2])
            print('added', e[2])
          elseif e[1] == 'key_down' then
            return true
          end
        end
      end
    end
    
    local function status()
      tStore = {}
      for i = 1, #tType do
        for j in pairs(component.list(tType[i])) do
          table.insert(tStore, j)
        end
      end
      print('#', 'type', 'address', 'stored', 'output')
      for s = 1, #tStore do
        print(s, component.proxy(tStore[s]).getInventoryName(), string.sub(tStore[s], 1, 7),
          string.sub((component.proxy(tStore[s]).getEUStored()/component.proxy(tStore[s]).getEUCapacity())*100, 1, 4) .. '%',
          component.proxy(tStore[s]).getEUOutputPerTick())
      end
    end
    
    local function main()
      term.clear()
      status()
      while 1 do
        print('Команды: [L]ist, [A]dd')
        local cmd = io.read()
        if cmd:upper() == 'L' or cmd:upper() == 'LIST' then
          term.clear()
          status()
        elseif cmd:upper() == 'A' or cmd:upper() == 'ADD' then
          print('Press any key to continue.')
          add()
        end
      end
    end
    
    main()
    

     

     

     

    Чтобы включать и выключать произвольные хранилища, придется сделать фиксированную конструкцию, поэтому абы как хранилища не расставить, могу дать инструкции, как это сделать.


  10. Сделал набросок файлопомойки.
    Очень примитивная штука, даже не факт, что работает.

     

    Сервер:

     

    local filesystem = require('filesystem')
    local component = require('component')
    local modem = component.modem
    local event = require('event')
    local file, file1, e
    local port = 1234
    
    --[[
    name, pass, cmd, filename, file
    
    /pomojka
      /name
      /name_share
    ]]
    
    local function main()
      while 1 do
        e = {event.pull()}
        if e[1] == 'modem_message' then
          local path = '/pomojka/'..e[6]..'/'
          if not fs.exists(path) then
            filesystem.makeDirectory(path)
            filesystem.makeDirectory('/pomojka/'..e[6]..'_share/')
            file = io.open(path..'pass.cfg', 'w')
            file:write(e[7])
            file:close()
          end
          file = io.open(path..'pass.cfg', 'r')
          if file:read() == e[7] then
            if e[8] == 'list' then
              if component.filesystem.list(path) ~= nil then
                modem.send(e[3], port, table.unpack(component.filesystem.list(path)))
              end
            elseif e[8] == 'upload' then
              if filesystem.size(path..e[9]) < 2048 then
                print(path..e[9])
                print(e[10])
                file1 = io.open(path..e[9], 'w')
                file1:write(e[10])
                file1:close()
              end
            elseif e[8] == 'download' then
              file1 = io.open(path..e[9], 'r')
              modem.send(e[3], port, file1:read())
              file1:close()
            elseif e[8] == 'delete' then
              filesystem.remove(path..e[9])
            end
          end
          file:close()
        elseif e[1] == 'component_added' and e[3] == 'filesystem' then
          os.excute('mount '..e[2].sub(1, 3)..' /pomojka/')
        end
      end
    end
    
    modem.open(port)
    main()
    

     

     

     

     

    Клиент:

     

     

    local component = require('component')
    local modem = component.modem
    local event = require('event')
    local file, e
    local server = 'address'
    local port = 1234
    
    tArgs = {...}
    modem.open(port)
    
    if tArgs[3] == 'list' then
      modem.send(server, port, table.unpack(tArgs))
      e = {event.pull(5, 'modem_message')}
    if e[3] == server then
        list = table.pack(e)
        for i = 5, #list do
          io.write(list[i]..'\n')
        end
      end
    elseif tArgs[3] == 'download' then
      modem.send(server, port, table.unpack(tArgs))
      e = {event.pull(5, 'modem_message')}
      if e[3] == server then
        file = io.open(tArgs[4], 'w')
        file:write(e[6])
        file:close()
      end
    elseif tArgs[3] == 'upload' then
      file = io.open(tArgs[4], 'r')
      modem.send(server, port, table.unpack(tArgs), file:read())
      file:close()
    elseif tArgs[3] == 'delete' then
      modem.send(server, port, table.unpack(tArgs))
    else
      print('Использование:\n <имя> <пароль> [list]\n <имя> <пароль> [download] <файл>\n <имя> <пароль> [upload] <файл>\n <имя> <пароль> [delete] <файл>')
    end
    
    modem.close(port)
    

     

     

     

    Можно устанавливать RAID на лету.

    Загружать/читать/удалять файлы.

    Ограничение 2 кб на одного пользователя.


  11. На входе должен быть комп, который отрубает все права на варпы, хомки, телепортации и переключает игровой режим на приключенца.

    Основа для лабиринта будет очень простая, но на деле, алгоритм связей разгадать довольно сложно (может-быть, в качестве бонуса будут выдаваться очки с подсказками)

    Лабиринт состоит из комнат, связанных друг с другом переходами. После каждого перемещения из одной комнаты в другую, связи между комнатами меняются, по заданному алгоритму перемешивания.

    Помимо обычных комнат с ловушками, есть секретные комнаты, в которые можно попасть только при выполнении определенных условий (жертвоприношение, выполнение переходов, в определенной последовательности)

    При выполнении заданных условий, определенные переходы в основном лабиринте подменяются на переходы к секретным комнатам.

     

    Самое сложное это придумать наполнение - ловушки, условия, отслеживание игроков в лабиринте.

    • Нравится 2
×
×
  • Создать...