Перейти к содержанию

Просмотрщик и редактор процедурной добычи Build 42.20

Как просматривать распределения добычи Build 42.20, оценивать нейтральные шансы и создавать Lua-переопределения в проекте.

Один и тот же визуальный редактор доступен из TileZed → Tools → Procedural Loot Viewer / Editor... и BuildingEd → Building → Procedural Loot Viewer / Editor... TileZed открывает редактор на свойстве container выбранного тайла, если оно есть. BuildingEd открывает его на внутреннем имени RoomDef текущей комнаты. Оба приложения используют один загрузчик, модель, проверку и формат вывода.

Пометки о доказательствах и результате

Автор сообщает, что по локальным Lua-файлам и коду выбора предметов Build 42.20 подтверждены игровые структуры SuburbsDistributions для реестра RoomDef/контейнеров, ProceduralDistributions.list, чередующиеся массивы предметов и шансов, прямые/junk-броски, procList, веса, ограничения и принудительные селекторы.

PZToolsLootEditor.json, Lua после слияния, атомарная запись и отказ писать в установку игры — механизмы авторинга и защиты самого инструмента. Это не форматы файлов базовой игры.

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

Игровые данные только для чтения, результат — в проект

Первый путь — установка Project Zomboid, извлечённый корень игровых данных или каталог lua/server/Items. Он всегда используется только для чтения. Редактор загружает следующие Lua-файлы:

Distribution_*.lua Distributions.lua ProceduralDistributions.lua

Второй путь — корень проекта карты или мода вне игровой установки. Изменения атомарно сохраняются в структуру:

<project-or-mod>/ └── media/ └── lua/ └── server/ └── Items/ ├── PZToolsLootEditor.json └── PZToolsLootDefinitions.lua

PZToolsLootEditor.json — редактируемый манифест PZTools. PZToolsLootDefinitions.lua создаётся заново на его основе. Сгенерированный Lua применяет определения проекта во время Events.OnPostDistributionMerge, до разбора игрой итоговых реестров. Поэтому определение проекта с игровым ключом является переопределением, а новый ключ — добавлением.

Редактор отказывается использовать корень проекта, совпадающий с корнем игры или находящийся внутри него. Он не переписывает Distributions.lua, ProceduralDistributions.lua и другие файлы базовой игры.

RoomDef, контейнеры и процедурные распределения

Вкладка Rooms & containers показывает действующий реестр SuburbsDistributions в виде иерархии:

Имя RoomDef └── тип контейнера

Соответствие контейнера относится к одной из двух форм:

  • Procedural: procList выбирает именованную запись из ProceduralDistributions.list.
  • Direct: контейнер напрямую содержит rolls, items и необязательную таблицу junk.

Вкладка Procedural distributions показывает повторно используемые именованные таблицы предметов. Фильтр ищет как по имени распределения, так и по имени предмета. Игровые записи помечены Game; добавления и переопределения — Project.

Редактирование игровой записи создаёт её полное переопределение в проекте. Удаление этого переопределения снова показывает доступное только для чтения игровое определение.

Что означают показанные шансы

Список предметов чередует названия предметов и числовые значения шанса. Пример исходного Lua:

items = { "Base.ExampleItem", 12.5, }

Редактор показывает это значение как Chance / roll. Если множитель бросков песочницы оставлен нейтральным, Build 42 отбрасывает дробную часть заданного числа бросков до целого.

Нейтральная вероятность хотя бы одного успеха вычисляется по формуле ниже; интерфейс показывает её как Neutral cumulative:

1 - (1 - chance / 100) ^ floor(rolls)

Это математический предпросмотр, а не точная гарантия игры. Итог могут изменить редкость добычи в песочнице, категория предмета, плотность зомби, правила по времени, вместимость контейнера и другие runtime-модификаторы. Броски junk показываются отдельно, поскольку игра применяет к их редкости другие модификаторы.

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

Для процедурного procList значение weightChance — относительный вес селектора, а не процент выпадения предмета. Neutral share нормализует только допустимые строки, не помеченные как принудительные. Реальный набор допустимых строк может меняться из-за:

  • min и max;
  • forceForItems;
  • forceForZones;
  • forceForTiles;
  • forceForRooms.

Если min или max отсутствует, Build 42 считывает его как ноль. Просмотрщик явно показывает это состояние, не подставляя выдуманное значение по умолчанию; новое правило создаётся с min=0 и max=99.

Просмотрщик проверяет, на какое процедурное распределение указывает каждая ссылка, и явно отмечает отсутствующие определения.

Порядок редактирования

  1. Выберите игровые определения, доступные только для чтения.
  2. Выберите корень проекта карты или мода за пределами игровой установки.
  3. Выберите соответствие RoomDef/контейнера или процедурное распределение.
  4. Нажмите Clone / edit in project... либо создайте новую запись.
  5. Измените броски, предметы, исходные шансы, junk, веса селектора, min/max и поля принудительных селекторов.
  6. Сохраните диалог. Манифест и сгенерированный Lua атомарно заменяются.

Создание локальной структуры Lua не устанавливает и не включает мод. Упаковка, mod.info, порядок зависимостей/загрузки, экспорт и публикация в Workshop выполняются отдельно.

Текущая область

Редактор охватывает распределения контейнеров/комнат Build 42 и ProceduralDistributions.list. Сейчас он не редактирует распределения для транспортных средств, улучшений оружия, скрипты/иконки/определения предметов, настройки песочницы и полную упаковку модов.

Руководство Procedural Loot Editor