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

Система типов

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

Обзор​

У каждого монстра один или два типа. У каждого приёма ровно один тип. Когда приём попадает в цель, игра вычисляет множитель эффективности типа по типу приёма и типу (или типам) цели.

Type Chart Editor

Таблица — это данные, а не код: редактор выше записывает те же ассеты, которые боевая формула читает во время выполнения. Именно поэтому сетка из 18 типов — отправная точка, а не правило: вы можете добавить тип, убрать один или переписать ячейку, и ничего не нужно перекомпилировать.

Множители по умолчанию:

РезультатМножительСообщение
Очень эффективно2,0x"It's super effective!"
Малоэффективно0,5x"It's not very effective..."
Иммунитет0,0x"It doesn't affect [target]..."
Нейтрально1,0x(без сообщения)

Для монстров с двойным типом множители перемножаются. Огненный приём против монстра Grass/Ice наносит 2,0 x 2,0 = 4,0x урона.

Таблица типов по умолчанию​

Демо поставляется с 18 типами, соответствующими стандартному жанру ловли монстров (плюс тип Typeless):

Normal, Fire, Water, Grass, Electric, Ice, Fighting, Poison, Ground, Flying, Psychic, Bug, Rock, Ghost, Dragon, Dark, Steel, Fairy

Настройка типов

Эти 18 типов — лишь отправная точка. Типы — обычные ассеты MonsterType, поэтому их можно добавлять, удалять и переименовывать. Некоторые игры используют меньше типов (ранние поколения использовали 15), а некоторые оригинальные игры создают совершенно особые таблицы типов.

Таблица эффективности типов​

Таблица хранится в самих типах: у каждого ассета MonsterType есть словарь AttackMultipliers (защищающийся тип → множитель) для приёмов этого типа. Метод IMonsterDatabase.GetTypeEffectiveness() возвращает множитель во время выполнения:

float multiplier = database.GetTypeEffectiveness(attackingType, defendingType);

Ключевые соотношения, которые стоит запомнить:

Атакующий типСилён против (2x)Слаб против (0,5x)Иммунитет (0x)
FireGrass, Ice, Bug, SteelFire, Water, Rock, Dragon--
WaterFire, Rock, GroundWater, Grass, Dragon--
GrassWater, Rock, GroundFire, Grass, Poison, Flying, Bug, Dragon, Steel--
ElectricWater, FlyingElectric, Grass, DragonGround
GroundFire, Electric, Poison, Rock, SteelGrass, BugFlying
GhostPsychic, GhostDarkNormal
Normal--Rock, SteelGhost

Полную таблицу можно просмотреть и отредактировать в Type Chart Editor. Пара, отсутствующая в словаре типа, считается нейтральной (1,0x).

Двойные типы​

Когда у монстра два типа, при получении урона проверяются оба:

Final Multiplier = Effectiveness(move_type vs type1) * Effectiveness(move_type vs type2)

Это порождает несколько интересных ситуаций:

Тип приёмаТипы целиРасчётРезультат
IceDragon / Flying2,0 x 2,04,0x (двойная сверхэффективность)
ElectricWater / Ground2,0 x 0,00,0x (иммунитет, Ground поглощает)
FightingNormal / Ghost1,0 x 0,00,0x (иммунитет, Ghost поглощает)
WaterFire / Rock2,0 x 2,04,0x (двойная сверхэффективность)

STAB (бонус за совпадение типа)​

Когда монстр использует приём, совпадающий с одним из его собственных типов, приём получает бонус STAB 1,5x (DamageMath.StabMultiplier). Бонус перемножается с эффективностью типа и остальными множителями урона:

Final Damage = Base Damage * STAB * Type Effectiveness

Например, монстр типа Water использует приём Water против цели Fire:

Base * 1.5 (STAB) * 2.0 (super effective) = 3.0x total

Использование Type Chart Editor​

Type Chart Editor — интерактивный инструмент-сетка для просмотра и изменения соотношений типов:

Откройте OpenMon Hub (Tools > MCE > OpenMon Hub) → вкладка Database → Type Chart Editor

В редакторе:

  1. Режим просмотра -- сетка показывает полную таблицу типов NxN; в строке заголовка указано, сколько типов в ней перечислено. Строки — атакующие типы, столбцы — защищающиеся, а цвет каждого типа отмечает его строку и столбец.
  2. Цветовая кодировка -- зелёный = очень эффективно (2x), красный = малоэффективно (0,5x), тёмно-серый = нет эффекта (0x), светло-серый = нейтрально (1x).
  3. Режим редактирования -- щёлкните любую ячейку, чтобы переключать значения по кругу: нейтрально → 2 → 0,5 → 0 → нейтрально. Каждое изменение можно отменить через Undo Unity.
  4. Refresh -- перезагружает список типов из проекта (он также перезагружается, когда окно получает фокус).
  5. Save All -- помечает все типы изменёнными и сохраняет ассеты на диск.

В сетке перечислены ассеты MonsterType с включённым Index. Чтобы добавить или удалить тип, создайте или удалите ассет (ниже) — у самого редактора нет кнопок добавления и удаления.

Изменение типов влияет на всё

Изменение таблицы типов влияет на все сражения в вашей игре. После любых изменений тщательно проверяйте. Добавление или удаление типов требует обновления назначений монстров и приёмов.

Создание пользовательских типов​

Если вы создаёте оригинальную игру, вам может понадобиться своя таблица типов:

  1. Создайте ассет MonsterType: Assets > Create > MCE > Monster Database > Type или New Monster Type на вкладке Database в Hub. Назовите его (например, Cosmic, Sound, Digital), задайте цвет и значок и оставьте Index включённым, чтобы он отображался в таблице.
  2. Откройте Type Chart Editor и нажмите Refresh: новый тип появится как строка и столбец.
  3. Задайте значения эффективности для каждого взаимодействия с существующими типами.
  4. Создайте монстров и приёмы, использующие ваш новый тип.

Советы по дизайну пользовательских типов​

  • Балансируйте нападение и защиту. У типа должно быть примерно поровну сильных и слабых сторон.
  • Избегайте слишком большого числа иммунитетов. Иммунитеты мощны и при чрезмерном использовании делают игру раздражающей.
  • Держите общее число управляемым. Оптимально 15–20 типов. Больше 25 игрокам трудно запомнить.
  • Создавайте интересное противодействие. Лучшие соотношения типов создают решения «риск/награда», а не автоматические победы.

Запрос типов из кода​

Интерфейс SDK (редакции Indie, Pro, Source и Studio)​

using System.Linq;
using OpenMon.MCE.SDK;

IReadOnlyList<MonsterType> allTypes = engine.Database.GetAllTypes();
var fire = allTypes.FirstOrDefault(type => type.name == "Fire");
var grass = allTypes.FirstOrDefault(type => type.name == "Grass");

float effectiveness = engine.Database.GetTypeEffectiveness(fire, grass);
// Returns 2.0 when both types exist in the database

Прямой доступ (редакции Source и Studio)​

С доступом к исходному коду можно также работать с таблицей типов напрямую через классы MonsterDatabase и изменять значения эффективности во время выполнения для особых боевых условий.

Рекомендации​

  1. Используйте Type Chart Editor для изменений — он записывает шаги отмены и сохраняет ассеты типов за вас.
  2. Документируйте свои пользовательские типы, если создаёте оригинальную игру. Игрокам нужно изучить соотношения.
  3. Проверяйте граничные случаи с двойными типами. Слабости 4x и двойные иммунитеты могут удивить игроков.
  4. Учитывайте распределение приёмов при балансировке типов. Тип, который силён в защите, но не имеет хороших приёмов, фактически слаб.