Противники: что в движке, что на бумаге

Отвечает на один вопрос: какой враг существует в игре, а какой только описан. Дизайн — в карточках, принципы ростера — в Enemies - Catalog.

Как читать статус

Владелец факта — поле impl в шапке карточки; здесь сводка. Значения — те же три, что у мементо (см. Memento - Implementation Status §Как читать статус). Поле asset — id ассета (enemy.goblin_grunt).

Мерка сверки: наличие ассета в Assets/_Project/ScriptableObjects/Enemies/ (виды — ScriptableObjects/Species/). Ручная сверка — 2026-07-29: 4 карточки из 13 в движке, из видов — только гоблины.

Обновление 2026-07-31: стат-блоки заведены для всех 13 карточных врагов (impl: partial у девяти новых — стат-блок в движке, навыки на бумаге до Фазы 2), созданы виды species.bandits, species.beasts, species.golems и AI-пресеты фракций. Механика (эффекты/способности/новый код — слепота, антихил, швырок союзника) — Фаза 2. Ход: docs/enemies-implementation-progress.md.

Фаза 2, пассивки (2026-07-31): в движке механика пятерых — гоблин-воин (барьер 50 / 1 заряд / кд 4 с), гоблин-убийца (маскировка средней ступени + +50% в тыл), разбойник со щитом (барьер 100 / 2 заряда / кд 6 с), отравленный арбалет (яд + антихил 50%), волк стаи (+15% за союзника в радиусе 3). Трое из них — impl: engine; щитоносец и арбалетчик остаются partial из-за побега (ниже). Антихил стал общей шкалойeffect.antiheal_weak|medium|strong|absolute (30/50/75/100%) поверх HealShieldTakenEff, доступна любому киту. Ждут Фазы 2: командир, маг, наездник, брузер, варлок, голем (у всех механика — способности), плюс швырок союзника и слепота (новый код).

Фаза 2B, активки (2026-07-31): в движке клич командира с парированием, стан брузера, метка варлока и каменный оберег голема — все проверены живым боем. Барьер шамана и лечение варлока заведены, но молчат: AbilityData.HealEffect проведён только в ветку «Взрыва спор» Друида. Правка написана и ждёт замера. Ещё не в движке: разгон наездника, огненные сферы шамана, цикл ударов голема, швырок союзника — все четыре требуют кода (ниже).

Фаза 2C (2026-07-31, вечер): заведены последние четыре механики ростера — разгон наездника (проход сквозь строй, урон от скорости ×4.95 на его штатных 3.63, игнор половины брони), огненные сферы мага (3 заряда, откат 4 сек каждый, ×2 по площади 1.5, +100% скорости пока сфера есть), цикл голема (1 обычный → размашистый по площади → тяжёлый с отбросом и замедлением 80%), швырок союзника у командира и наездника (урон поровну обоим, стан 1 сек). Появился общий примитив процентного пробивания брони. Замер подтвердил разгон (346 против 70), сферы (180 против 90) и швырок (снаряд в полёте, стан у обоих); цикл голема после правки счётчика ждёт повторного замера.

Комбо под циклом и «каждой третьей» (2026-08-01, 2026-08-01/12/13): обе механики переехали на общий счётчик серии Атак. Что изменилось в бою: голем, выбитый из боя дольше 1.5 секунды (стан, потеря цели, отброс), начинает круг с обычного удара, а взведённый тяжёлый гаснет; то же у «каждой третьей» Драугра. Промах Атаку засчитывает, многоударная Атака двигает счётчик один раз. Заряды сферы мага и обеих фаз голема получили тег Empowered — до этого израсходованный заряд висел на носителе до конца боя. Замер на новом поведении не делался — цикл голема ждёт его вместе с тем, что был должен раньше.

Ростер пополнился (2026-07-31): проказники заведены оба — Гоблин-шутник (белая повязка, первый носитель слепоты) и Гоблин-кривляка (синяя повязка, мана-дрейн каналом), оба impl: engine. Итого карточных врагов 15, из них в движке все.

Фракция разбойников доросла до шести (2026-08-01): заведены разбойник-дуэлянт (парирование + щит 200/3 сек за парирование + +50% урона в дуэли) и разбойник-убийца (кровь 30% от силы атаки порциями + маскировка средней ступени). Оба impl: engine, оба «стандарт» по новой оси тиров. Парирование и кровотечение получили первых носителей — до этого оба примитива стояли в коде без потребителя. Карточных врагов стало 17. Замер 2026-08-01: дуэлянт бьёт 111 один на один и 74 в свалке (ровно +50%), щит от парирования держится 90 тиков = 3 сек; убийца за 8 секунд снял 700 колющим и 161 кровью, порции доросли до четырёх одновременно.

Кривляка потребовал от движка двух новых примитивов (решения Макса 2026-07-31): плоский стат скорости набора ресурса (StatType.ResourceRegenFlat, слагаемое к базе StatsConfig ДО множителя ResourceGainEff) и режим выбора цели AbilityTargetMode.NearestEnemyWithResource — ближайший из тех, у кого пул ресурса непустой. Оба закрыты тестом ManaDrainTests. Замер 2026-07-31: у жертвы набор 1/сек против 5 у нетронутого, канал держится 4 сек, дебафф гаснет через 1.5 сек после обрыва.

Расхождение: чего активки врагов не дают

Замысел карточкиЧто в движкеПочему
Командир: «уник атака с 2 ударами» на парированииответ один ударответ идёт рекастом одной атаки (RuntimeUnit.RecastAttack); «два удара в одном ответе» примитивом не выражается
Наездник: после разгона «продолжает двигаться вперёд ещё 1 сек»пролетает заданные 6 единиц и возвращается к охотедлительность полёта считается из дистанции, отдельного «ещё секунду вперёд» у смещения нет
Голем: второй удар — «AOE перед собой»площадь вокруг целиу заряда есть радиус задевания соседей цели; конус перед носителем — другая форма, её у ударов нет (у способностей есть AreaShape.Line)
Командир и наездник: хватает «мили-гоблина, не ветерана»любой союзник ближнего бояфлага тира у юнита нет вовсе (EncounterTier описывает БОЙ); ближний бой различается по AttackType
Швырок: живой снаряд, влетевший в край ареныполучает урон броска и удар о стенуфизика смещения общая для всех; удвоение законно, но в трассе читается как второй бросок
Варлок: раненый союзник «отходит и ждёт 80% HP»AI-порог отступлениясм. побег ниже — та же природа

Порядок кастов у врага с двумя активками — «первая готовая по списку» (плейсхолдер в AbilitySystem), поэтому варлок предпочитает метку лечению не по приоритету, а по порядку в данных.

Расхождение: побег разбойников при 30% HP

Карточки трёх разбойников (Шаг 6) обещают «при 30% HP пытается сбежать по общему правилу фракции». В движке есть AI-порог отступления (_retreat в профиле: отход на своей половине и возврат при восстановлении) — фракция играбельна и читается как «побежал», но выхода из боя совсем нет: юнит не покидает арену и не забирает с собой золото, о котором говорит карточка. Отдельная механика «сбежал = снят с арены» не заведена; пока это осознанное приближение, а не реализованный замысел.

Расхождение: HP гоблинов-ветеранов ↔ каскад

Видовой множитель species.goblins MaxHP ×0.4 (для «серой массы») умножает ФИНАЛ стата (Stats.cs: (base+Flat)×(1+PctAdd)×Π(1+PctMult)), поэтому override HP на юните им срезается — гоблинам-ветеранам не пробить видовую хрупкость ни через Override, ни через Flat. Итог класс×вид: командир 800, маг 520, наездник 600. Карточка наездника заявляет «HP МНОГО» — сейчас движок это не даёт. Костыль «override = желаемое/0.4» отвергнут (хрупок к смене множителя). Чистые пути — решение Макса/balance: подвид-ветеран с компенсирующим PercentMult, пересмотр видового множителя, или отдельный HP-путь для ветеранов. До решения ветераны на честных класс×вид числах.

В движке

TABLE asset AS "Ассет", impl_note AS "Расхождение"
FROM "gdd/enemies"
WHERE impl = "engine" OR impl = "partial"
SORT order ASC

Только дизайн

TABLE status AS "Статус дока"
FROM "gdd/enemies"
WHERE impl = "paper"
SORT order ASC

Виды

ВидСостояние
Goblins · Bandits · Beasts · Golemsвсе четыре в движке (species.*, заведены 2026-07-31)
Revenant Caravanтолько дизайн — единственный дом нежити и льда у врага

Фракция разбойников — самая укомплектованная после гоблинов: шесть врагов, все в движке (брузер, щитоносец, отравленный арбалет, варлок, дуэлянт, убийца). Строка «фракция целиком на бумаге» стояла здесь до 2026-07-31 и устарела вместе с Фазой 1 ростера.

Чего требуют боссы от движка

Разнесено из карточек боссов 2026-07-30 (правило «карточка держит только механику», журнал 2026-07-30/1). Все три босса — impl: paper.

Общее для всех трёх. Многостадийность швом не является: по каркасу 2026-07-29 стадия — обычный бой, связь между стадиями сюжетная, нужен только контейнер узла (Enemies - Bosses).

Дезертировавшая Армия

ТребованиеЕсть?Комментарий
Чтение состава игрока и выдача баффов от негонет, но дешёвыйнужен «профиль команды» (главный тип урона, роли, связки). Не боевой шов: чистая функция от ростера, считается до первого тика и складывает статмоды — детерминизм не трогает
Катсцена перед расстановкой с подстановкой прочитанногонетлок-строка с параметром, не фиксированный текст; порядок «катсцена → расстановка → бой» обязателен
Статистика профиля за все забеги (стадия 2)нетстатистика забега считается на месте, история профиля — новое поле сейва; тот же заход, что счётчики поведения игрока (Roadmap §Блок 2.5)
Перенос состояния между стадиямине шовэто данные: во второй стадии стоит другая запись Тактика, уже с баффами
Воскрешение и вывод юнита из боянет, но дешёвыйпуть DeathSystem (снятие со spatial hash и из активных), только без смерти
Неуязвимость по порогам HPчастичноиммунитет как эффект есть; образец порога уже применяется — PassiveThresholdPct * MaxHP в BulwarkComponent.cs:103
Смена атмосферы по стадиичастичнослои есть (свет, пост, аудио-шины), связки «стадия → атмосфера» нет
Доп. тип урона + сопротивление емудашколы урона и защиты есть

Гоблинская Банда

ТребованиеЕсть?Комментарий
Две задачи одновременнодешёвыйдве зоны размещения с квотой 2 + 2, проверка до боя. Зоны есть, нужны квота и валидация; ядро не трогается
Зона размещения кольцом (стадия 2)нетформы зон прямоугольные — тех-долг взят сознательно
Союзные/нейтральные NPCне нужноголемы — обычные враги команды босса; третья сторона снята решением про две зоны
Барьеры — Стенаспроектированодизайн + план
Массовое отбрасывание с рестартом расстановкичастичносмещение есть; окно перерасстановки между стадиями принято каркасом, не реализовано
Наказание за кучность (молния по кластеру)частично«Проводимость» есть как свойство эффекта, но не как заявленный рычаг
Щит в 300% max HPдаобычный щит, вопрос чисел

Разбойничье Гнездо

ТребованиеЕсть?Комментарий
Подкрепление посреди боя («догоняет в спину через X сек»)нетвраги сейчас все на арене со старта
Выбор направления побега перед боемнетвыбор, влияющий на арену и расстановку
Ветвление сценария от того, кто погибнеттребует, чтобы исход боя нёс данные, а не только «победа/поражение»
Диалоговая система с таймеромнетпростая диалоговая система числится отдельной идеей
Побег врага при низком HPчастичноAI-порог отступления есть, «выйти из боя совсем» — нет
Снижение награды как следствие решениячастичноэкономика наград есть, «модификатор награды от сценария» — нет

Ассеты без карточки

enemy.training_dummy — дев-болванка для арены отладки и балансных бенчей. Карточки не имеет и не должна: это инструмент, не противник забега.

enemy.skeleton_swordsmanне враг, а призыв игрока: его ставят «Скелеты-защитники» и «Призыв скелета» Некроманта, и описан он там же (700 HP при 70 урона, лимит 8). Лежит в папке Enemies/ потому, что призыв — это EnemyData по типу ассета, а не по стороне боя; своей карточки в этой папке ему не нужно, дом факта — карточка кита-призывателя.

Энкаунтеры

Восемь ассетов Encounters/ (GoblinAmbush, GoblinRaid, GoblinScouts, GoblinSkirmishLine, GoblinWarband + три Dummy*) карточек в ГДД не имеют вовсе: состав встречи — это баланс, а не дизайн-сущность, и живёт он в бенчах контура balance. Если появится дизайн-язык встреч («какие бывают волны»), его дом — Combat - System, не эта папка.