Противники: что в движке, что на бумаге
Отвечает на один вопрос: какой враг существует в игре, а какой только описан. Дизайн — в карточках, принципы ростера — в 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, не эта папка.