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

Doob

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

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

  • Посещение

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

    141

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


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

    Кстати, ты в The Talos Principle играл?

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

     

    В The Talos Principle не играл, играл в Antichamber - там связи жестко зафиксированы и решить задачу можно просто рандомно бегая в разные двери.


  2. А можно тоже самое, но для "дубов"?

     

    Появляешься в комнате [1] с четырьмя дверьми, идешь в первую попавшуюся - оказываешься в комнате [3] с кучей зомбей, бежишь назад - оказываешься в комнате [17]. В комнате [17] стоит печка, верстак и табличка, на табличке надпись "Ты всегда можешь вернуться сюда, войдя в ту же дверь, из которой вышел". Идешь в первую попавшуюся дверь - попадаешь в комнату [109], она пустая, идешь в первую попавшуюся дверь - попадешь в комнату [108], там растет дерево со стволом из коблы и "листвой" из досок.

    Ну и в таком духе...


  3. Удобный интерфейс нарисовать дело нескольких часов. Есть множество хороших, библиотек для создания гуи. И я думаю скорборды лишние, можно обойтись и базами данных, например ExDB от сябра.

     

    БД удобней хранить в CSV - оптимально и универсально. А вот до GUI библиотек у меня руки не доходят. GML, к примеру хорош, но очень тяжел. На ComputerCraft куча удобных, со всеми современными фичами и довольно легковесных, а на OpenComputers я таких не находил. Надобно затачивать либу под определенные задачи, чтобы не плодить сущности.


  4. Как-то ковыряясь с комблоком я вспомнил фильм "Cube", начал делать алгоритм пермутаций, попутно пытаясь сделать переброс пространства через время и наоборот, потом энтузиазм затух.

     

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

     

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

     

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

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

     

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

    • Нравится 4

  5. Админское хранилище. Прикольно, но как по мне -- пустая болтовня. Покажите нам код!

     

    Код был, когда я сидел на ComputerCraft, там я делал сохранение блоков в scoreboard игрока, была жуткая конвертация таблиц, на выходе получалась каша, но зато работало. Идея была в том, что мир можно стереть, а игроков со своими ресурсами оставить (на самом деле не ресурсами, а постройками).

     

    Вся проблема в том, что мне лень рисовать удобный интерфейс и переводить RSA на Lua.


  6. %PLAYERNAME% имеет %ITEMNAME%, в кoличетcве n, у негo зaбиты cундуки вcяким хлaмoм, ендерчеcт вooбще трещит пo-швaм. Мoжнo иcпoльзoвaть виртуaльные хрaнилищa AE, нo caм мoд cлишкoм лaгучий и c дoлгим рaзвитием.

     

    Мoя идея cocтoит в тoм, чтoбы cделaть aльтернaтиву AE в OpenComputers, чтoбы oблегчить жизнь игрoкaм и cерверу.

     

    Любoй игрoк, имеющий кoмпьютер c WiFi кaртoй, мoжет coздaть личнoе виртуaльнoе хрaнилище cкaчaв прoгрaмму и зaрегиcтрирoвaв cебя в cиcтеме.

     

    Функции cерверa:

    • Перенoc предметoв из инвентaря в личнoе/oбщеcтвеннoе виртуaльнoе хрaнилище (ВХ).
    • Мaтериaлизaция предметoв из ВХ.
    • Мaтериaлизaция предметoв, кoтoрых нет в ВХ, нo для кoтoрых еcть рецепт и реcурcы в ВХ игрoкa.
    • Перевoд предметoв из cвoегo ВХ в oбщеcтвеннoе/перевoд в ВХ другoгo игрoкa.
    • Сoздaние oбщеcтвеннoгo хрaнилищa c дocтупoм пo пaрoлю.
    • Сoздaние oбменнoй cделки (кaк в тoргoвых aвтoмaтaх IC)
    • Уничтoжение предметa в ВХ
    Функции клиентa:
    • Сoбcтвеннo, интерфейc к функциям cерверa.
    Вoзле cерверa cтoят терминaлы, чтoбы игрoки caми зaбивaли рецепты - игрoк кидaет предметы в вoрoнку, нa мoнитoре в виртуaльнoм oкне крaфтa зaбивaет рецепт, рoбoт рacклaдывaет рецепт и прoбует cкрaфтить, еcли true, тo рецепт coхрaняетcя нa cервере.

     

    Тaк же, мoжнo cделaть aдминcкoе беcпaрoльнoе виртуaльнoе хрaнилище c беcкoнечными дешевыми вoзoбнoвляемыми реcурcaми (деревo/кaктуc/aрбузы/трocтник), тoгдa игрoкaм не нaдo будет делaть лaгo-фермы, oни будут зaнимaтьcя чем-тo бoлее oтвлеченным.

     

    Мoжнo oгрaничить время жизни хрaнилищa (хaлявных cундукoв не бывaет), чтoбы дaвнo не игрaвшие игрoки удaлялиcь из БД, a чтoбы прoдлевaть жизнь хрaнилищa, неoбхoдимo в нем cжигaть oпределенные предметы (невoзoбнoвляемые реcурcы)

    • Нравится 2

  7. Сегодня игрался со своими интерактивными автономными фаланговыми геосканерными робо-копалками в одиночке и натолкнулся на факт наличия квитанции от командного блока. Я то слышал когда-то, что с КБ можно получить TRUE и FALSE, но как-то все забывал проверить.

     

    С компаратора можно получить "ответку" от команды, прошла ли она успешно. У нас были некоторые проблемы с тем, что игрок мог наложить заточку на предмет, но его в руках при этом не держал, или держал в это время кактус. Также при несовместимости заточек с игрока тоже в Банке снимались UU в любом случае.

     

    Если применить контроль сигнала с компаратора банковского "гивальщика" , можно на 100% быть уверенным, по идее, когда с клиента можно списать средства.

     

    А разве дебаг-плата и драйвер комблока не возвращает результат исполнения команды?


  8. Пытался прикрутить брутфорс, выяснил, что средствами OpenComputers ломать бессмысленно.

    Из-за того, что мощность процессора регулируется не замедлением реальных тактов, а жесткими фризами, то даже на самой мощной железяке выходит примерно так:

      алфавит 92 символа - 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !?@#$%^&*()_+=-*/[]{}:;'".,<>

     

    время перебора:

      1 символ = 0.42 секунд
      2 символа = 39 секунд
      3 = около получаса
      4 = больше трех дней
      5 = почти год

     

    Если брутить голым lua, то скорость возрастает где-то в 2000 раз.

     

    А если в ключе использовать рандомные символы юникода, то ломать вообще бессмысленно (при длине пароля не меньше 10 символов).

    • Нравится 1

  9. Если надо зашифровать сообщение, но не хватает ресурсов, можно использовать XOR.

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

    Если в math.random нету дыр, то можно использовать его.

    Функция подгоняет длину ключа к длине сообщения и прогоняет через XOR.

    local function encrypt(message, key)
      unicode = require('unicode')
      nKey = ''
      for i = 1, unicode.len(key) do
        nKey = nKey..key:byte(i) -- переводим ключ в number
      end
    
      math.randomseed(tonumber(nKey)) -- засеиваем генератор ключом
    
      tKey = {}
      sNewKey = ''
      for j = 1, unicode.len(message) do
        tKey[j] = ''
        while unicode.len(tKey[j]) ~= unicode.len(message.byte(j)) do
          tKey[j] = tKey[j]..math.random(0, 9) -- создаем рандомный код для ключа
        end
        sNewKey = sNewKey..unicode.char(bit32.bxor(message:byte(j), tKey[j])) -- записваем результат
      end
      return sNewKey
    end
    

    Пример использования:

    a = encrypt('сообщение', 'ключ') -- шифруем

    print(encrypt(a, 'ключ')) -- расшифровываем

    • Нравится 3

  10. Очевидно, это все отголоски системы тегов хабра. Это когда теги служат не для поиска, но для краткого отображения сути поста. Передачи некоего дополнительного смысла, быть может. Этакий tl;dr - прочитал теги и все сразу ясно.

    2Doob: проблема с дисками в том, что нет особого блока, куда могут быть вставлены только они. Есть RAID, но диски форматируются при извлечении из него. Значит, простой системой конвейеров не отделаешься, нужен робот. Распознавание по name не поможет, т.к. name у всех OC блоков и предметов один и тот же (недавно точно так было). Можно задать забор предмета из определенных ячеек инвентаря системного блока, но тогда придется использовать один фиксированный тип этого самого блока (алмазный, скорее всего), так как различить робот их не может. Хотя комп может оповещать робота - редстоуном с разной силой, например, чтобы без дорогих вайфаев. Но как робот поймет, где диск на которого записывали, а где диск, с которого записывали? Тут на помощь придет RAID. Вынеся системный диск наружу системного блока, робот, не трогающий RAID, сможет извлечь исключительно тот диск, который и нужен. Как вариант - вместо рейда дисковод с дискеткой. Правда, тогда на всех дисках будут копии проги-автомата, потому что две оси на одну дискету вряд ли влезет, и придется писать корень. Так что лучше RAID. Ну или можно просто использовать для системного диска определенную ячейку, но такой вариант мне не нравится. Все равно перепутаются как-нибудь.

    Коротко: может и сделаю когда-нибудь. Ну как я фермера на улучшенный алгоритм движения собрался перевести и до сих пор не перевел.

     

    Проблема в получении слота с диском?

    component.filesystem.slot и вообще, слотов для дисков всего два

    Запоминаем адреса файловых систем по дефолту, при срабатывании программы ищем новую файловую систему, на нее и пишем.


  11. Поискал информацию о Data Card, даже на гитхабе пока ничего нет, поковырял сам - функционал не очень, все это можно сделать стандартными средствами lua.

     

    Список функций Data Card:

     

    Хеширование
    data.sha256(string) :binary - возвращает sha256 хеш строки в бинарном формате
    data.md5(string) :binary - возвращает md5 хеш строки в бинарном формате

    data.crc32(string) :binary - возвращает crc32 хеш строки в бинарном формате

     

    Сжатие
    data.deflate(string) :string - упаковывает строку по алгоритму deflate, возвращает сжатую строку
    data.inflate(binary) :string - распаковывает сжатую строку

     

    Кодирование
    Base64
    data.encode64(string) :string - кодирует строку
    data.decode64(string) :string - декодирует строку

    data.toHex(string) :string - приводит строку в шестнадцатиричный вид
    data.fromHex(string) :string - декодирует строку из шестнадцатиричного вида

     

    Внутренние функции
    data.getLimit() :number - возвращает максисальный размер данных, которые может обработать карта
    data.slot :number - возвращает номер слота, в котором находится карта
    data.address :string - возвращает адрес карты


  12. В общем идея такая: игрок посылает запрос на крафт определенного предмета, робот ищет ингредиенты в сундуках и крафтит запрошенный предмет.

    Давно бьюсь над способом размещения метаданных предмета в таблице, но что-то голова не варит.

     

    Есть код, который принимает системное имя предмета и если рецепт есть в списке - находит в сундуках ингредиенты и крафтит по рецепту. http://pastebin.com/E5yZVpUA

     

    Надо, чтобы в рецептах можно было указывать метаданные предмета, например вот так:

    REPICES = {
      --рецепт1
      [{"NAME", "META"}] = {
        {"NAME", "META"}, {"NAME", "META"}, {"NAME", "META"},
        {"NAME", "META"}, {"NAME", "META"}, {"NAME", "META"},
        {"NAME", "META"}, {"NAME", "META"}, {"NAME", "META"}
      },
    
      --рецепт2
      [{"NAME", "META"}] = {
        {"NAME", "META"}, {"NAME", "META"}, {"NAME", "META"},
        {"NAME", "META"}, {"NAME", "META"}, {"NAME", "META"},
        {"NAME", "META"}, {"NAME", "META"}, {"NAME", "META"}
      }
    }
    1-9 {"NAME", "META"} это список ингредиентов.
    [{"NAME", "META"}] - результат крафта
    

  13. Добавил текстурпак для OpenGlasses, со временем буду добавлять и для других аддонов.

     

    Я уже давно его жду! Пак бомбовый. Ему равных пока не видел и близко. Когда будет готов, закинем его в наш клиент тоже.  Титанический труд проведен! Просто колоссальный!

     

    П.С. Единственное, что меня лично терзает, это провода. Имхо, сильно рябит, может пусть бы были одноцветные, как в самом моде. Классика, так классика.  

     

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

    Глазик (или иллюминатор, как его там назвать, не соображу, окошечко короче)  как бы  ему сделать реалистичнее не мешало. Чтобы мордофейс пострашнее был, щель какая-то смотровая или что, типа забрала какого-то. Может просто блик, как в ванили, добавить. Не пойму, но что-то в мордочке робота не то, чего-то не хватает.

     

    С проводами что-нибудь придумаю.

    Морду попробую поковырять, проблема в том, что текстура растягивается на модели. Неонку изначально хотел сделать как глаз у гигантского робота из фильма "День, когда земля остановилась", но пришлось бы разрешение сделать 128

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