Уровни растений
Уровни растений
В GP-Next уже есть экспериментальная система уровней растений.
Ее основная идея не в том, чтобы напрямую менять ванильное растение, а в следующем:
- выбирается базовое растение
- для каждого уровня подготавливается свой клон
- связь
базовое растение ↔ клоны по уровнямописывается вjsons/extensions/plant-levels.json
Это удобно, потому что:
- у каждого уровня могут быть собственные
PlantProps / PlantAlmanac / PlantTypes - значки уровней, страница уровня в альманахе и runtime-подмена карточек используют одну и ту же карту соответствия
- не нужно править собранный вывод игры
На какой стадии это сейчас
Текущая версия лучше всего подходит для:
- регистрации данных уровней
- показа значков уровней
- просмотра страницы уровня в альманахе
- подмены базового входа растения на выбранный клон уровня во время выполнения
Пока не стоит воспринимать это как полное воссоздание оригинальной экономики улучшений PvZ2.
Все еще дорабатываются:
- источники ресурсов для улучшений
- полный экономический цикл улучшений
- более развитый интерфейс прогрессии
Что нужно включить сначала
Откройте панель GP-Next в игре:
- перейдите в
Experimental - включите
plant-level-system
Обычно также стоит держать включенным в Settings -> Runtime Extensions:
Dynamic Plant Registry
Это особенно важно, если ваша линия уровней использует новые или клонированные растения.
Структура файлов
Типичная структура выглядит так:
MyPack/
├── pack.json
└── jsons/
├── extensions/
│ └── plant-levels.json
├── features/
│ └── PlantFeatures.json5
└── objects/
├── PlantTypes.json5
├── PlantProps.json5
└── PlantAlmanac.json5Если вы только связываете уже существующие растения, иногда достаточно plant-levels.json.
Но если хотя бы один уровень использует ваш собственный клон, обычно понадобятся еще:
PlantFeaturesPlantTypesPlantPropsPlantAlmanac
Базовая форма plant-levels.json
Рекомендуемая структура такая:
{
"plants": {
"peashooter": {
"levels": {
"1": {
"cloneCodename": "peashooter",
"icon": "wood"
},
"2": {
"cloneCodename": "peashooter_lvl2",
"icon": "silver",
"displayName": "LV2"
},
"3": {
"cloneCodename": "peashooter_lvl3",
"icon": "gold",
"displayName": "LV3"
}
}
}
}
}Что это означает:
peashooter: codename базового растенияlevels: какую идентичность растения использует каждый уровеньcloneCodename: реальный codename, используемый этим уровнемicon: стиль значкаdisplayName: необязательный пользовательский текст уровня
Чем может быть displayName
displayName поддерживает два варианта:
1. Обычная строка
"displayName": "LV2"2. Локализованный объект
"displayName": {
"en": "Level 2",
"zh": "2级",
"es": "Nivel 2"
}Если ваш языковой пакет добавляет другие языковые коды, сюда можно добавить и их.
Какие значения поддерживает icon
Сейчас доступны такие значки уровней:
woodsilvergoldstar
Если поле не указано, по умолчанию используется wood.
Рекомендуемая стратегия для клонов
Самый безопасный шаблон:
- оставить базовое растение как базовую запись
- создавать собственные codename клонов для высоких уровней
- привязывать каждый уровень именно к своему клону
Например:
sunflowersunflower_lvl2sunflower_lvl3
а не указывать уровень напрямую на другое ванильное растение.
Почему не стоит напрямую привязывать уровень к другому ванильному растению
Например, если ваш подсолнух 3 уровня ведет себя как twinsunflower, все равно лучше сделать так:
- создать
sunflower_lvl3 - заставить этот клон использовать
PlantBasedOn: "twinsunflower"
а не привязывать уровень 3 напрямую к ванильному twinsunflower.
Так надежнее, потому что:
- система уровней остается привязанной к вашей собственной идентичности растения
- не происходит прямого захвата ванильной карточки
- runtime-сопоставление получается более прозрачным
Какие JSON должны существовать
Если вы добавляете клон вроде peashooter_lvl2, убедитесь, что он существует в:
PlantFeaturesPlantTypesPlantPropsPlantAlmanac
Иначе GP-Next не зарегистрирует его в отображении уровней.
На практике это значит:
PlantFeaturesопределяет, кто этоPlantTypesзадает runtime-типPlantPropsзадает числовые параметрыPlantAlmanacзадает отображение в альманахе
Что вы увидите в альманахе
После включения системы страница растения в альманахе получает дополнительную подстраницу Level.
Сейчас там в основном показываются:
- максимальный уровень
- текущий уровень
- максимальный разблокированный уровень
- codename текущего уровня
- краткое описание текущего уровня
То есть это скорее компактная страница обзора уровней, а не полноценный магазин улучшений.
Что происходит во время выполнения
Сейчас особенно важны два runtime-поведения:
1. Базовый вход растения разрешается в выбранный уровень
Если базовое растение — peashooter, а выбран уровень 3, то базовый вход будет разрешаться как:
peashooter_lvl3
2. Явные clone-записи можно пока оставлять видимыми
Во время разработки можно не скрывать явные clone-карты. Это полезно для:
- проверки привязки значков
- проверки регистрации в альманахе
- проверки runtime-поведения идентичности
Чем это отличается от полноценной системы улучшений
Сейчас эта система — в первую очередь:
- слой сопоставления идентичности уровней
- слой значков и отображения в альманахе
- слой runtime-подмены входов
Это еще не полноценная экономика улучшений в стиле оригинала.
Поэтому при создании пакета лучше сначала сосредоточиться на том:
- стабильна ли каждая идентичность растения
- действительно ли характеристики уровней независимы
- корректно ли работает отображение в альманахе
- правильно ли выбранный уровень применяется во время выполнения
Один практический совет
Не скрывайте все clone-записи сразу.
Более удобный порядок отладки такой:
- сначала оставить видимыми базовое растение и все level-clone
- проверить альманах, значки и runtime-сопоставление
- скрывать записи позже, когда вся цепочка уже стабильна
Так проблемы диагностировать намного проще.
