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

Пародия на АЕ на транспозере

Рекомендуемые сообщения

Итак, надумал опубликовать программульку, работающую с транспозером и двумя сундуками. Один рабочий, а второй - буфер, куда будет складываться лишнее и извлекаться недостающее.
Задача - поддерживать содержимое рабочего сундука в заранее заданном состоянии.
Для начала разложим в рабочем сундуке наше барахло в нужном порядке. Количество не важно.
Запускаем -- controlchest save  - будет создан файл, с записью о образцовом содержимом сундука.
Программа в цикле проверяет содержимое рабочего сундука, сравнивает с образцовым и перемещает предметы в/из буферного сундука, чтоб восстановить порядок, который мы нарушаем извлекая что-то или добавляя в сундук.
 
Второе применение для этой программы - управление реактором для неинженеров. Инвентарь максимального реактора соответствует железному сундуку. Делаем файл (руками или сканом железного сундука с расположенными нужным образом деталями), запускаем и вуаля. Компоненты в реакторе будут установлены соответственно и бонусом получаем автоматическую замену стержней. 

Единственный нюанс - нужно изменить программу так, чтоб она помещала  компоненты поштучно. Я не проверял, что будет, если транспозер попытается вкинуть в реактор сразу стак стержней. :)
 
Обязательно нужно правильно инициировать переменые first и second - они описывают положение сундуков относительно транспозера!

 

 

 

 

-- поддерживает содержимое сундука согласно списку

-- Ставим сундук, вплотную к нему транспозер и к транспозеру ещё сундук.
-- Транспозер подключаем к компьютеру
-- один из сундуков будет рабочим и в нём будет поддерживаться порядок, сохранённый в файле /rule_chest.ini
-- лишний инвентарь будет перемещаться в другой сундук или напротив, пополняться из него (если есть нужное)
-- первым делом нужно настроить переменые first и second - они описывают положение сундуков относительно транспондера.
-- Теперь необходимо разложить в рабочем сундуке ваше барахло в нужном порядке. Количество не важно.
-- запускаем --  controlchest save
-- будет создан файл с описанием где что должно лежать в сундуке. Кстати, его можно поправить вручную.

-- всё очень медленно.



local component = require("component")
local t = component.transposer
local sides = require("sides")

-- здесь настроить положение сундуков относитенльно транспондера.

local first = sides.east -- рабочий сундук
local second = sides.west -- буфер

local filename = "/rule_chest.ini"

pr = {} -- таблица - правило расположения барахла в сундуке.
ps = {} -- таблица - содержимое буферного сундука

-- сохранение и чтение таблицы из файла ----------------------------------

-- Сохранение массива в файл
function tablesave(filename)
   local f,err = io.open(filename,"w")
   if not f then
      return nil,err
   end
   for key, value in pairs(pr) do
        f:write(value,'\n')
   end
   f:close()
   return true
end

-- Чтение таблицы из файла в массив
function tableread(filename)
  local x = 1
  local f,err = io.open(filename,"r")
   if not f then
     print("Не удалось прочитать файл правила.")
     print("Выполните controlchest save для его создания")
     os.exit()
     -- return nil,err
   end
        for line in io.lines(filename) do
      pr[x]=line
      x = x+1   
    end
   f:close()
end

-- --------------------------------------------------------------------------

function saverule()
print("Сохраняем")
 for x=1, t.getInventorySize(first) do
  if t.getStackInSlot(first,x) then
   pr[x]= t.getStackInSlot(first,x).label
  else
   pr[x]=""
  end
 end

 for key, value in pairs(pr) do
   print(key, value)
 end

 tablesave(filename)
end

function getname(side,slot) -- отдаёт название итема или подменяет nil пустой строкой
 if t.getStackInSlot(side,slot) then
  return t.getStackInSlot(side,slot).label
 else
  return ""
 end  
end

function indexsecond()
print("Индексируем второй сундук")
  for x=1, t.getInventorySize(second) do
    if t.getStackInSlot(second,x) then
      ps[x]= t.getStackInSlot(second,x).label
    else
      ps[x]=""
    end
  end
end


function finditem(label) -- ищет указанный итем в буферном сундуке
local tmp = 0
-- print("Find "..label)
 for slot = 1, #ps do
      if ps[slot] == label then  -- сравниваем с искомым
          if getname(second,slot) == label then -- если реально присутствует в сундуке
             tmp = slot   
             break
          end
      end  
 end  
 if tmp == 0 then print("Облом "..label.."  не найден") end
 return tmp  
end  


local a = {...}
if a[1]=="save" then saverule() end

tableread(filename)   
print(" --------- Загружено правило: --------------")
for key, value in pairs(pr) do
  print(key, value)
end
print(" --------- Поехали! --------------")

repeat
local tname, fslot
  for x = 1 , #pr do
    if x == 1 then indexsecond() end
    tname = getname(first,x)
--    print("Process slot ",x, pr[x], tname)
    if (pr[x] == "") or ((pr[x] ~= tname) and (tname ~= "")) then -- если слот не соответствует шаблону или должен быть пуст
      if  t.getSlotStackSize(first,x) > 0 then
         t.transferItem(first, second  , 64 , x)
         print("Очистка слота "..x)
      end    
    else
      if (t.getSlotStackSize(first,x) < t.getSlotMaxStackSize(first,x)) or t.getSlotStackSize(first,x) == 0   then -- если меньше стака - пополняем
--        print("Пополняем ",x)
    fslot = finditem(pr[x]) -- ищем итем во 2м сундуке
       if fslot > 0 then -- если нашли
             t.transferItem(second, first  , 64 , fslot, x)  
           end
      end
    end  
  end
until false

 

 

Изменено пользователем BarBoss

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выловил ошибку в функции finditem() - исправил. (t.getStackInSlot() может отдавать nil, на котором спотыкается if )

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как все сложно..

Пробовал хоть реактор так запускать?

И поставь слипы, а то оно очень часто к сундукам обращается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как все сложно..

Пробовал хоть реактор так запускать?

И поставь слипы, а то оно очень часто к сундукам обращается

Реактор работает. В реакторную версию можно и слипов насыпать, хуже не будет.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...