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

Система диких встреч

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

Как работают встречи

  1. Игрок ходит по тайлу с данными встреч.
  2. На каждом шаге система бросает против частоты встреч.
  3. Если бросок успешен, монстр выбирается из таблицы встреч тайла на основе взвешенной вероятности.
  4. Создаётся объект BattleParameters с данными о виде, уровне и форме выбранного монстра.
  5. BattleLauncher переходит к сцене сражения.

WildEncountersSet

ScriptableObject WildEncountersSet определяет таблицу встреч для данной области:

Создайте через: Assets > Create > OpenMon > Wild Encounters Set

Каждая запись в наборе содержит:

ПолеОписание
MonsterСсылка на ScriptableObject MonsterEntry
Min LevelМинимальный уровень дикого монстра
Max LevelМаксимальный уровень дикого монстра
ProbabilityОтносительный вес для данной записи (чем выше, тем чаще)

Фактический уровень случайно выбирается между Min и Max при каждом срабатывании встречи.

Расчёт вероятности

Вероятности -- это относительные веса, а не проценты. Система суммирует все веса и рассчитывает шанс каждой записи:

Chance = Entry Weight / Sum of All Weights

Пример таблицы:

МонстрВесФактический шанс
Leafpup4040/100 = 40%
Windling3030/100 = 30%
Silkworm2020/100 = 20%
Sparkbit1010/100 = 10%

Типы встреч

MCE поддерживает различные методы встреч через перечисление EncounterType:

ТипТриггерОписание
WalkingХодьба через высокую траву или пещерыСтандартные встречи в открытом мире
SurfingСёрфинг по водным тайламВстречи на водной поверхности
FishingИспользование удочки на водеВстречи на основе удочки (Old Rod, Good Rod, Super Rod)
RockSmashИспользование Rock Smash на разрушаемом камнеВстречи на основе камней
HeadbuttИспользование Headbutt на деревеВстречи на основе деревьев

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

Настройка зон встреч

Метод 1: Компонент EncounterTile

  1. В вашей сцене создайте пустой GameObject в иерархии карты.
  2. Добавьте компонент EncounterTile.
  3. Назначьте WildEncountersSet в поле Encounters.
  4. Расположите и масштабируйте зону встреч для покрытия нужных тайлов.

Метод 2: Встречи по умолчанию в SceneInfo

SceneInfo каждой сцены может иметь WildEncountersSet по умолчанию. Любой проходимый тайл травы в сцене будет использовать эту таблицу встреч, если она не переопределена конкретным EncounterTile.

Метод 3: Встречи по тайлам

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

Частота встреч

Частота встреч контролирует, как часто встречи срабатывают за шаг:

  • Базовая частота: Настраивается для каждой зоны встреч (типичный диапазон: 5-25%).
  • Модификаторы: Предметы (например, Repel снижает до 0%), способности (например, Stench снижает частоту) и предметы (например, Cleanse Tag).
  • Счётчик шагов: Система отслеживает шаги с последней встречи. После многих шагов без встречи частота немного увеличивается, чтобы предотвратить длительные серии без встреч.

Встречи по времени суток

Разные монстры могут появляться в разное время суток:

ПериодЧасы
Утро06:00 - 11:59
День12:00 - 17:59
Вечер18:00 - 20:59
Ночь21:00 - 05:59

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

Встречи с формами

Некоторые виды имеют формы, которые появляются по-разному в зависимости от условий. EncounterFormCalculator определяет, в какой форме появляется дикий монстр:

  • Региональные формы: На основе тега региона карты.
  • Сезонные формы: На основе внутриигрового календаря.
  • Случайные формы: Случайный выбор из доступных форм.

Используйте компонент SingleFormEncounter для принудительного появления определённой формы в записи встречи.

Специальные паттерны встреч

Рыбалка

Встречи при рыбалке требуют от игрока использования удочки, стоя перед водным тайлом:

  1. Создайте WildEncountersSet с записями EncounterType.Fishing.
  2. Назначьте его конфигурации встреч водной области.
  3. Разные уровни удочек (Old Rod, Good Rod, Super Rod) фильтруют доступные записи.

Легендарные / одноразовые встречи

Для особых встреч, которые должны произойти только один раз:

  1. Используйте событие CommandGraph вместо случайных встреч.
  2. Событие проверяет игровую переменную (например, LegendaryDefeated) перед срабатыванием.
  3. После боя устанавливается переменная для предотвращения повторных встреч.
  4. Этот подход даёт полный контроль над контекстом встречи (катсцены, диалоги, местность).

Групповые встречи

Несколько диких монстров одновременно:

  • Настройте запись встречи с флагом группы.
  • В бою появляются 3-5 монстров указанного вида.
  • Игрок сражается с ними по одному или может целиться в группу (приёмами области, если поддерживается).

Репеллы и предотвращение встреч

Игроки могут использовать предметы для предотвращения встреч:

ПредметЭффектДлительность
RepelПредотвращает встречи с монстрами ниже уровня лидера игрока100 шагов
Super RepelТот же эффект, большая длительность200 шагов
Max RepelТот же эффект, наибольшая длительность250 шагов

Репеллы реализованы как счётчик шагов. Система встреч проверяет счётчик репелла перед броском на встречу.

Утилиты встреч

Класс EncounterUtils предоставляет вспомогательные методы:

// Check if encounters are possible at the current tile
bool canEncounter = EncounterUtils.CanEncounterAt(position, encounterType);

// Get the encounter set for a position
WildEncountersSet set = EncounterUtils.GetEncounterSet(position, encounterType);

// Roll for an encounter (returns null if no encounter triggers)
WildEncounter encounter = EncounterUtils.RollEncounter(set);

Лучшие практики

  1. Балансируйте частоту встреч. Слишком высокая (>25%) раздражает. Слишком низкая (<5%) делает мир пустым. 8-15% -- типичное значение.
  2. Масштабируйте уровни с прогрессией. На Маршруте 1 должны быть монстры уровней 2-5, а не 50.
  3. Варьируйте таблицы встреч между картами. Каждый маршрут должен ощущаться уникальным.
  4. Включайте редкие встречи. Одна запись с 5% в таблице даёт игрокам цель для поиска.
  5. Тестируйте встречи по времени суток. Игроки не должны чувствовать себя наказанными за игру в определённое время.
  6. Размещайте репеллы рано. Игроки ценят контроль над встречами до середины игры.