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

Таблица — это данные, а не код: редактор выше записывает те же ассеты, которые боевая формула читает во время выполнения. Именно поэтому сетка из 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) |
|---|---|---|---|
| Fire | Grass, Ice, Bug, Steel | Fire, Water, Rock, Dragon | -- |
| Water | Fire, Rock, Ground | Water, Grass, Dragon | -- |
| Grass | Water, Rock, Ground | Fire, Grass, Poison, Flying, Bug, Dragon, Steel | -- |
| Electric | Water, Flying | Electric, Grass, Dragon | Ground |
| Ground | Fire, Electric, Poison, Rock, Steel | Grass, Bug | Flying |
| Ghost | Psychic, Ghost | Dark | Normal |
| Normal | -- | Rock, Steel | Ghost |
Полную таблицу можно просмотреть и отредактировать в Type Chart Editor. Пара, отсутствующая в словаре типа, считается нейтральной (1,0x).
Двойные типы
Когда у монстра два типа, при получении урона проверяются оба:
Final Multiplier = Effectiveness(move_type vs type1) * Effectiveness(move_type vs type2)
Это порождает несколько интересных с итуаций:
| Тип приёма | Типы цели | Расчёт | Результат |
|---|---|---|---|
| Ice | Dragon / Flying | 2,0 x 2,0 | 4,0x (двойная сверхэффективность) |
| Electric | Water / Ground | 2,0 x 0,0 | 0,0x (иммунитет, Ground поглощает) |
| Fighting | Normal / Ghost | 1,0 x 0,0 | 0,0x (иммунитет, Ghost поглощает) |
| Water | Fire / Rock | 2,0 x 2,0 | 4,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
В редакторе:
- Режим просмотра -- сетка показывает полную таблицу типов NxN; в строке заголовка указано, сколько типов в ней перечислено. Строки — атакующие типы, столбцы — защищающиеся, а цвет каждого типа отмечает его строку и столбец.
- Цветовая кодировка -- зелёный = очень эффективно (2x), красный = малоэффективно (0,5x), тёмно-серый = нет эффекта (0x), светло-серый = нейтрально (1x).
- Режим редактирования -- щёлкните любую ячейку, чтобы переключать значения по кругу: нейтрально → 2 → 0,5 → 0 → нейтрально. Каждое изменение можно отменить через Undo Unity.
- Refresh -- перезагружает список типов из проекта (он также перезагружается, когда окно получает фокус).
- Save All -- помечает все типы изменёнными и сохраняет ассеты на диск.
В сетке перечислены ассеты MonsterType с включённым Index. Чтобы добавить или удалить тип, создайте или удалите ассет (ниже) — у самого редактора нет кнопок добавления и удаления.
Изменение таблицы типов влияет на все сражения в вашей игре. После любых изменений тщательно проверяйте. Добавление или удаление типов требует обновления на значений монстров и приёмов.
Создание пользовательских типов
Если вы создаёте оригинальную игру, вам может понадобиться своя таблица типов:
- Создайте ассет
MonsterType:Assets > Create > MCE > Monster Database > Typeили New Monster Type на вкладке Database в Hub. Назовите его (например,Cosmic,Sound,Digital), задайте цвет и значок и оставьте Index включённым, чтобы он отображался в таблице. - Откройте Type Chart Editor и нажмите Refresh: новый тип появится как строка и столбец.
- Задайте значения эффективности для каждого взаимодействия с существующими типами.
- Создайте монстров и приёмы, использующие ваш новый тип.
Советы по дизайну пользовательских типов
- Балансируйте нападение и защиту. У типа должно быть примерно поровну сильных и слабых сторон.
- Избегайте слишком большого числа иммунитетов. Иммунитеты мощны и при чрезмерном использовании делают игру раздражающей.
- Держите общее число управляемым. Оптимально 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