Просмотрщик и редактор процедурной добычи Build 42.20
Один и тот же визуальный редактор доступен из 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.
Просмотрщик проверяет, на какое процедурное распределение указывает каждая ссылка, и явно отмечает отсутствующие определения.
Порядок редактирования
- Выберите игровые определения, доступные только для чтения.
- Выберите корень проекта карты или мода за пределами игровой установки.
- Выберите соответствие RoomDef/контейнера или процедурное распределение.
- Нажмите Clone / edit in project... либо создайте новую запись.
- Измените броски, предметы, исходные шансы, junk, веса селектора, min/max и поля принудительных селекторов.
- Сохраните диалог. Манифест и сгенерированный Lua атомарно заменяются.
Создание локальной структуры Lua не устанавливает и не включает мод. Упаковка, mod.info, порядок зависимостей/загрузки, экспорт и публикация в Workshop выполняются отдельно.
Текущая область
Редактор охватывает распределения контейнеров/комнат Build 42 и ProceduralDistributions.list. Сейчас он не редактирует распределения для транспортных средств, улучшений оружия, скрипты/иконки/определения предметов, настройки песочницы и полную упаковку модов.
Руководство Procedural Loot Editor