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

Doob

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

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

  • Посещение

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

    141

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


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

    По просьбе трудящихся убрал падение цены до 0. Даже если продают, чем покупают бесконечно больше, цена будет = 1.

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


  2. В ценooбразoвании неразумнo oтдавать власть игрoкам, т. к. в майне челoвек бессмертен, а сo всякими админшoпами ресурсы бескoнечны. Активную тoргoвлю ведут тoлькo нoвoприбывшие, а те, ктo наигрался - набили сундуки ресурсами и ушли. Следoвательнo, неoбхoдимo скупать излишек, давая вoзмoжнoсть oбменять любoй ресурс, на любoй другoй, пo справедливoй цене.

    Централизoванная скупка-прoдажа вывoрачивает недoстатки баланса в майне (тoчнее, егo oтсутствия), т. к. ресурсы=время, ресурсы не имеют веса, а с мoдами, oбъем стремится к нулю, oтсутствует энтрoпия, тo кoличествo ресурсoв вoзрастает пo экспoненте (с мoдами ускoряющими развитие, в ванили этo прoстая арифметическая прoгрессия). На бoльшинстве серверoв эта прoблема решается регулярными вайпами или oрганизoванным рoлеплеем.

     

    Представляю вам прoграмму умнoгo бартера, кoтoрая пoзвoляет oбменивать джинсы/бусы на зoлoтo/алмазы, пo справедливым ценам.

     

    Принцип рабoты

    Тoргoвый терминал пoкупает и прoдает предметы, устанавливая цены, oснoвываясь на закoне спрoса и предлoжения.

    Вычисление цены сoстoит из трех фoрмул:

    • O/(I-O[+1])/I*M - пoлучение реальнoй стoимoсти предмета. (I - купленo, O - прoданo, M - мнoжитель) I-O этo разница между купленными и прoданными предметами, т. е. текущее кoличествo. Чтoбы пoлучить нoрмальнoе oтнoшение при I=O, всегда прибавляем 1. Далее, пoлучаем oтнoшение всех прoданных предметoв к текущему кoличеству - O/(I-O+1). Затем, делим результат на кoличествo купленных предметoв, чтoбы пoлучить oбратную прoпoрцию и умнoжаем на некoтoрoе числo, кoтoрoе пoзвoлит представить кoэффициент спрoса/предлoжения в виде натуральнoгo числа.
    • ((R-C)/R)*C+C - если реальная стoимoсть бoльше текущей. (R - реальная стoимoсть, C - текущая) Пoлучаем разнoсть между реальнoй и текущей, делим на реальную, для пoлучения натуральнoй oснoвы. Далее, умнoжаем на текущую, и увеличиваем текущую стoимoсть на пoлученнoе значение.
    • (C-R)/3+R - если реальная ниже текущей. Пoлучаем oбратную разницу, делим на кoэффициент падения цены (мoжет быть случайным значением oт 1 дo inf или oтнoшением C/R, лучше втoрoе, нo пoлучается слишкoм маленькая инерция) и дoбавляем этo делo к реальнoй стoимoсти.

    Пример сферическoгo в вакууме рoста цены:

    Gr82u7G.png

     

    Пример падения:

    EZI45r9.png

     

     

     

    Уcтрoйствo

    Тoргoвый терминал сoстoит из кoмпьютера, рoбoта и прoизвoльнoй сети хранения предметoв AE2.

    Рoбoт, пo кoманде терминала, загружает и выгружает предметы, кoтoрые нахoдятся в буфере.

    К буферу пoдключен терминал через адаптер с кoнтрoллерoм инвентаря, кoтoрый пoзвoляет пoдсчитывать пoкупаемые у пoльзoвателя предметы.

    Терминал управляет перемещением предметoв между буферoм и МЕ сетью, через адаптер у МЕ-интерфейса. (На MC 1.7.10 нужен аддoн OpenPeripheral, дoбавляющий неoбхoдимые драйвера)

    uOZHpiE.png

     

    yGW9MJj.png

    pltqNZ1.png

    8jCrk89.png

     

     

    Кoмпoненты

    Для терминала пoтребуется: алмазный кoрпус с алмазным мoнитoрoм, интернет-карта, беспрoвoдная карта, алмазная графическая карта, Lua BIOS, жесткий диск с OpenOS, прoцессoр и максимум ОЗУ.

    Периферия: редстoун-I/O (для включения и перезагрузки), 2 адаптера, кoнтрoллер инвентаря, кoнвертер энергии, клавиатура, зарядник для рoбoта, ME-интерфейс и ME-дискoвoд с дискетами.

    Для рoбoта: зoлoтoй кoрпус, инвентарь, EEPROM, беспрoвoдная карта, прoцессoр и минимум OЗУ.

     

    Устанoвка и настрoйка

    wget https://raw.githubusercontent.com/DOOBW/automarket/master/terminal.lua
    wget https://raw.githubusercontent.com/DOOBW/automarket/master/style.gss
    wget https://raw.githubusercontent.com/DOOBW/automarket/master/start.lua
    wget https://raw.githubusercontent.com/DOOBW/automarket/master/market.db
    wget https://raw.githubusercontent.com/DOOBW/automarket/master/robot_bios.lua
    wget https://raw.githubusercontent.com/DOOBW/automarket/master/gml.lua /lib/gml.lua
    echo start >> .shrc
    В файле robot_bios.lua задать переменнoй address первые 4 симвoла адреса сетевoй карты терминала. Прoшить этoт файл в EEPROM рoбoта.

    В файле terminal.lua, в таблице cfg задать стoрoны: ic_side - стoрoна, с кoтoрoй нахoдится буфер пo oтнoшению к адаптеру с кoнтрoллерoм инвентаря. mei_side - стoрoна, с кoтoрoй нахoдится буфер oтнoсительнo адаптера.

    Перезагрузить терминал, включить рoбoта и мoжнo пoльзoваться.

    База данных устроена так:

    db = {
      users = {
        ['Ник_пользователя'] = {
          balance = счет,
          count = количество совершенных операций,
          lastlogin = время последней операции
        }
      },
      items = {
        ['название_мода:название_предмета|метаданные'] = {
          label = Лейбл_предмета,
          i = куплено,
          o = продано,
          cost = текущая_стоимость
        }
      }
    }
    
     

    Пример работы (старая версия)

     

     

    • Нравится 7

  3. На максимальном разрешении (160x50) один кадр рендерится 5-8 компами как-раз за 1 тик. 20 фпс на полный кадр это хорошо.

    Но если нужна цветная картинка 320x200, то объем данных увеличивается и обычный модем для этой цели не подходит.

     

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


  4. Все прекрасно биндится, в порядке живой очереди.

    Я тестил это дело в одиночке. Скорость вывода увеличивается примерно пропорционально количеству видеокарт.

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

     

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

    Если взять либу MoviePy, то можно запилить сервер конвертирующий видео (с ютуба, например) в соответствующий формат для опенкомпов и рендерить с вполне реальной скоростью. Я за это дело брался, но бросил т. к. не придумал, как синхронизировать звуковую дорожку.

    Самый главный плюс внешнего сервера это даже не скорость передачи, а возможность моментально определить ключевые кадры с дельтами и все это в опенкомповских 256 цветах вещать потоком. Оперкомпам не приходится напрягаться ни на что, кроме вывода кадров.


  5. Люди, которых что-то отпугивает, это непотенциальные игроки, кому они нужны?

    Мой клан несколько лет творил полный фарш на многих серверах DayZ Epoch (например, однажды хакнули сейф админов и увели технику из гаража, после того, как все раздарили, на сервере два дня шла безумная война).

    Кто-то строился, кто-то стрелялся, иногда собирались толпой выполнять миссии/мочить игроков. Никто не обижался, даже одиночки, которых преследовали несколько кланов. Наверное, потому-что каждый начинал с обычного DayZ, где убить голого новичка в черно/электро - святое дело. Да и без читеров было-бы скучно. А вот игры со смесью казуальщины и пострелушек рождают соответственных игроков, которые ни рыба, ни мясо.

    • Нравится 1

  6. Ало, это клон DayZ, который арма, геймплей перенесен полностью. Тому, кто не бегал на перегонки с пулями по Электро, не кемперил ВПП, не ползал по кустам с двумя патронами и переломом по лесу, после неожиданной встречи с другим игроком, геймплей объяснять бесполезно. В DayZ Epoch и его производных есть приваты, сейфы, виртуальные гаражи, но там, как говорится, анал-карнавал: админ это царь ибох, донатные бессмертные танки и самолеты, т. к. арма состоит из багов чуть более, чем полностью, то вводятся бредовые правила вроде "не взламывать сейфы", "не взрывать заприваченный забор", "не стрелять", "не чесаться" и т. д. И какой же это зомби-апокалипсис, если можно сказать "чик-чик, я в домике", тут у нас война за выживание, а не симулятор карапуза в песочке.

     

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

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

    • Нравится 1

  7. Вот где бы пригодились нейросети. Каждое слово можно завуалировать кучей разных способов, поэтому придется составить огромный соварь и постоянно читать логи, чтобы его обновить. Вроде есть сервисы по анализу контекста сообщений, на их основе можно выбирать подозрительные куски текста и руками добавлять в фильтр.

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

    • Нравится 1

  8. Для любителей тыкать логические блоки, есть StarMade, можно почти полностью автоматизировать полеты. Космический корабль можно переделать в межпланетный лифт, который, например, будет сам обороняться от пиратов.


  9. Делается это точно так же, как и без гуи, только с гуи.

    В качестве гуи взял forms:

    local component, uptime, internet = require('component'), require('computer').uptime -- получаем компоненты и аптайм
    local forms = require('forms') -- подключаем библиотеку
    local W, H = component.gpu.getResolution() -- получаем размер экрана
    if component.isAvailable('internet') then -- проверяем наличие интернета
      internet = component.internet
    else
      error('No internet card available.', 0)
    end
    if not internet.isHttpEnabled() then -- проверяем доступ по http
      error('HTTP is disabled.', 0)
    end
    
    local args, tz = {...}, 10800 -- получаем аргументы и задаем дефолтную тайм-зону
    if args[1] then -- если есть аргумент
      tz = tonumber(args[1])*3600 -- получаем разницу от UTC0 в секундах
    end
    
    local req, reason = internet.request('https://time100.ru/api.php') -- запрашиваем таймштамп
    if not req then error('Failed to issue request: '..reason, 0) end -- проверяем на ошибки
    local timestamp = '' 
    while true do -- получаем таймштамп из потока
      local data, reason = req.read()
      if not data then req.close()
        if reason then
          error(reason, 0)
        end
        break
      end
      timestamp = timestamp..data
    end
    local b_time = timestamp-uptime()+tz -- получаем разницу от аптайма
    
    forms.ignoreAll() -- чистка листенеров
    local main = forms.addForm() -- создаем форму
    main.W = 20 -- ширина и
    main.H = 6 -- высота главного окна
    main.left = (W-main.W)/2 -- размещаем окно по центру экрана
    main.top = (H-main.H)/2
    main.border = 2
    local l_time = main:addLabel(2,2,'') -- добавляем к форме зародыш времени
    local l_date = main:addLabel(2,3,'') -- и даты
    local btn_exit = main:addButton((main.W-7)/2,5,'exit', forms.stop) -- добавляем кнопку выхода
    local timer = main:addTimer(1, function() -- создаем таймер
      local c_date = os.date('*t', b_time+uptime()) -- получаем время из текущего таймштампа
      l_time.caption = ('time: '..c_date.hour..':'..c_date.min..':'..c_date.sec) -- задаем текст с текущим временем
      l_date.caption = ('date: '..c_date.day..'/'..c_date.month..'/'..c_date.year) -- задаем текст с датой
      l_time.W = #l_time.caption -- получем длину текста времени
      l_date.W = #l_date.caption -- и даты
      l_time.left = (main.W-l_time.W)/2+1 -- размещаем по центру окна
      l_date.left = (main.W-l_date.W)/2+1
      main:redraw() -- перерисовываем
    end)
    timer:run() -- запускаем таймер
    forms.run(main) -- запускаем окно
    
    • Нравится 3

  10. Нечего тут тестировать, если нет мода отрубающего руки. Запускаем сервер, кидаем моды и играем, все.

     

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

     

    Замысел как-раз в обратном - игроки сами пишут скрипты в процессе игры, кто лучше написал, тот и молодец.


  11. Средствами OC и CX, без использования дебаги или комблока это невозможно. Радиус 50 килоблоков это pi(50k^2) - почти 8 миллиардов блоков, умножим это хотя-бы на высоту самых высоких гор, получим больше триллиона блоков. Следовательно, не имея файла мира или доступа к командам оператора, ничего сделать нельзя.


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

     

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

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


  13. Не все так просто. Lua написан на си и написан чисто.

    https://github.com/lua/lua/blob/master/lmathlib.c

    https://github.com/lua/lua/blob/master/lbitlib.c

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


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

    А теперь попробуем адаптировать подход, который часто применяется в ассемблере: разделим 64int на 3 части, y максимум будет 255, а x и z - 134217728, хеширование происходит за 6 операций (тут нет умножения, хотя с мат. сопроцессором это не играет роли).

    local function hash(x, y, z)
      x, z = x+134217728, z+134217728
      return y|(x<<8)|(z<<36)
    end 
    Если бы не требовалось при поиске пути каждый раз получать исходное число, скорость была бы не намного выше, чем при использовании многомерных массивов.

    Я проводил сравнение нескольких алгоритмов хеширования и для реализации на опенкомпах остановился на единственном оптимальном варианте - многомерный массив, т. к. если расход памяти сверхкритичен, проще подгружать чанки оптимально закодированной карты, чем тратить кучу времени на ползание по ней. Сравнительная таблица где-то потерялась, но хорошо помню, что поиск таким способом в 100^3 вершинах происходит где-то за 20 секунд (в опенкомпе это около четырех часов), алгоритм поиска A* с манхетеннской эвристикой.

     

    Вот, кстати, тестовый код: https://pastebin.com/0uj6v3KX, убрать одни операции и добавить другие можно, но результат примерно тот же. И да, должен быть алгоритм нахождения расстояний в захешированных координатах, как-нибудь надо будет проверить.


  15. Не стоит сильно экономить память в опенкомпах, т. к. ее очень много, а процессор крайне медленный.

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

    Да, реализация битового сдвига хромает, но деление по модулю и взятие остатка заставляет биться головой об стену.


  16. У меня лаги смертельные, играть невозможно. Рендер внешности персонажей лишний, это ведь не спектрум, можно было бы оптимизировать (а еще лучше показывать внешность только в диалогах), чтобы не перерисовывать по килопикселю за раз.


  17. Это не интересно.

    Почему же не интересно? Если сделать это в виде толковой мини игры, то будет такая фича сервера. Могу взяться написать. Графоний, правда в опинкомпах отсутсвует, но есть куча текстовых игр, в которые играют десятилетиями.

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