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

Этот док отвечает на один вопрос: какое мементо существует в игре, а какая только описана. Дизайн мементо тут не живёт — он в карточках; редкость и типы — в Content - Mementos.

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

Владелец факта — поле impl в шапке самой карточки, здесь только сводка. Три значения:

implЗначитЧто можно делать
engineесть рабочий ассет RelicData, механики соответствуют карточкеправки — через баланс-петлю, карточку и ассет менять вместе
partialассет есть, но механика расходится с карточкойрасхождение описано в impl_note; чинится заходом реализации
paperассета нет вовсепереписывать свободно, в игре ничего не сломается

Поле asset — id ассета-владельца (relic.assassin). У paper его нет и быть не должно. Порядок в дереве: engine/partialorder 10–499 · разделитель 500 · paper — 510+ · инкубаторы идей — 900.

Мерка сверки: наличие ассета в Assets/_Project/ScriptableObjects/Relics/. Ручная сверка — 2026-07-30 (19 из 27 карточек в движке): к десяти прежним добавились Арканист, Ночное лезвие, Монах воды, Хранитель углей и Антимаг и Пожиратель снов, Хладнорождённый и Десятина и Костодел-некромант.

Сверка 2026-08-01: добавились семь болванок тира Треш (relic.trash_*) — по одной на класс, все impl: engine. У них карточка исполнена целиком: тир не имеет ни пассивок, ни второго навыка, а улучшений ему пока не назначено вовсе (открытый вопрос — Meta - Open Forks). Числа болванок сверены с ассетами через боевой каскад, а не с карточек.

У всех девяти новых impl: engine означает «кит работает», а не «карточка исполнена целиком»: улучшения (Шаг 6) не заведены ни у кого — системы улучшений в коде нет как таковой. Что именно разошлось у каждого — в §Долги по киту ниже. Числа взяты из карточек и замером не проверены.

В движке

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

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

TABLE combat_class AS "Класс", status AS "Статус дока"
FROM "gdd/relics"
WHERE impl = "paper"
SORT file.name ASC

Устаревшие замеры

  • Bundle of Herbs — карточка называет 28 HP в секунду, но это ЗАМЕР, снятый при _healPctTargetMissingHp: 0.08. 03.08.2026 доля выросла до 0.25, то есть втрое, и прежнее число врёт. Новое в карточку не вписано намеренно: оно берётся прогоном, а не пересчётом на бумаге — лечение зависит от того, насколько цель просела, и линейно из доли не выводится. До перезамера читать строку лечения в карточке нельзя.

Долг сверки карточка ↔ движок

Пересверено по ассетам 2026-07-30. Три расхождения из старого handoff оказались закрыты, а impl: partial у этих карточек — устаревшим:

  • The Bloom — споры не лечат — лечат: spore_burst несёт SporeMend (HoT 60/сек × 3 сек, до 10 стаков).
  • The Pyre — воспламенение без стаков, поджог плоский — оба работают: IgnitionComponent считает по стакам, а SplitAttackOnTagComponent держит процент от макс. HP (_pctTargetMaxHp: 0.01, _pctPerStack: 0.0025).
  • The Thorn — шипы без роста радиуса — растёт: _radiusPerGrowthStack: 0.2.

Что нашлось сделанным заодно (мои же записи об этом врали): «Решительный удар» Bulwark наносит 200% (_damageMultiplier: 2), «Стальной вихрь» Копейщика уже несёт замедление и щит (WhirlSlow + WhirlShield), кувырок Убийцы реализован (_rollSpeedPerSecond: 12) и его усиленная атака ещё и переносит за спину (_blinkBehind: 1), «Длань жизни» Пастыря несёт диспел (HandOfLifeCleanse), а у Кровоманта на автоатаке висят и Bleed, и StoneCrush.

Кодовые долги от вердиктов 2026-07-30 — ЗАКРЫТЫ

Четыре правки Макса не легли в данные и потребовали кода. Сделано 2026-07-30, каждая величина стала полем: AbilityData._repeatSelfEffects (Hearth — 5 стаков и на себя), TitheComponent._healShareOfTaken (Десятина — лечение на 100% забранного, при 30% в максимум), RearStrikeEffectComponent._bonusStacks (Fang — 2 стака с тыла), Rule.BonusPerStack + Rule.MaxBonus в TaggedTargetDamageBonusComponent (Winter — +5% за стак льда до +100%). Развилки — запись «Payload Repeat And Per-Stack Bonus»; инвариант держит тест DataDrivenPayloadRulesTests.

Тем же заходом закрыты ещё два: Lull не автоатакует вовсе — заведён режим AutoAttackMode.None (не «урон 0»: ноль оставлял бы её в ритме ударов и портил замер), и Winter переведён на холодную линию.

Осталось из карточек, не про числа: (долг Десятины по двум формам закрыт 2026-07-30 — журнал 2026-07-30/13) Bonewright просит ускоряющийся в полёте череп и раз в 4 сек отправку костей (полей нет), Gale — толчок в секторе 45°, Rift — залп со своей базой и скейлом от AP вместо доли автоатаки.

Закрыто 2026-07-31: «Двойной удар» Gale работает. Атака из нескольких Ударов заведена в движке (маркеры клипа = контакты, сила каждого Удара задаётся лично), Монаху проставлены два маркера и доли 0.5 / 0.5. При его скорости 0.75 атак/сек удары приходят на 0.4 и 0.6 секунды от старта свинга.

Снова разошлось 2026-08-04: у Gale один Удар вместо двух. Весь ростер переехал на скелетное тело (журнал 2026-08-04-the-whole-roster-moves-onto-bones), а костяной клип Attack несёт один маркер контакта — число Ударов задаёт разметка клипа, и второго взять негде. Доли 0.5 / 0.5 очищены, иначе список долей врал бы про несуществующий контакт. Карточка остаётся замыслом: механика в движке цела, не хватает ровно клипа с двумя контактами — его авторинг и вернёт «Двойной удар».

Настройки AI, изменённые балансом

  • Криомант — фокус автоатаки Ближайший (03.08.2026, вердикт Макса). Прежде стоял Без «Изморози» (PreferUntagged) — правило от старой бинарной заморозки: не тратить удар на уже замороженного. С холодной линией стаки надо ДОКАПЛИВАТЬ на одной цели, и уход с неё работал против собственной механики кита. Карточка при этом не врёт: она перечисляет режим как один из четырёх доступных.

Долги по киту

Разнесено из карточек 2026-07-30 (правило «карточка держит только механику», журнал 2026-07-30/1). Общее для всех девяти новых китов: улучшения Шага 6 не заведены — системы улучшений в коде нет.

КитЧто расходится с карточкой или отсутствует в движке
ZephyrСобран целиком 2026-08-21 — мементо relic.windwarden, эффекты effect.headwind / effect.gust / effect.evasion / effect.windwarden_aura, лок-ключи, строка в реестре. Пассивка «Порыв» — не способность, а выданная аура (AllyAuraComponent): сама реакция живёт на союзнике, и держать её там должен кто-то ещё. Визуал ВЗЯТ ВЗАЙМЫ у relic.druid — облачение SwordOnly, архетип SwordShield, префаб UnitView_BoneStorybook. Маг ветра с мечом и щитом — заглушка, а не решение: она стоит там, чтобы ростер не был красным, пока не сделан свой арт. Дальность читается по UnitData.AttackType атакующего: для авто-атак точно, для способности мили-юнита с дистанции — приближение. Перезарядка «Порыва» живёт per-effect, то есть у каждого союзника своя: четверо под аурой дают вчетверо больше срабатываний, чем одна перезарядка (число ждёт приёмки). Автоатака в ассете — дробящая, как в карточке (2026-08-21/5). Улучшения Шага 6 не заведены, как и у всех; из них T2 «Обратный ход» остаётся замыслом — механики прерывания чужой атаки в движке нет.
AegisЩит от магии — отдельный пул на эффекте, а не третий вид общего щита; удар, съеденный им целиком, для реактивов «на удар» выглядит отменённым. Немоты (T2) в движке нет. Сверено 2026-07-31: щит с фильтром по школе, триггер «враг применил способность» и учёт поглощённого — на месте; «щит встаёт до попадания» теперь исполняется буквально и держится тестом AegisSliceTests.
RiftБлок G («смещение и от дальних») — поле ассета _alsoRanged, а не выбор игрока: модель AI-настроек не умеет переключать поведение компонента эффекта. Множитель залпа взят 0.35 от автоатаки (в карточке числа не было). Проверить резолв мультиснаряда и триггер «по мне ударили в ближнем». Цена самая низкая из пачки.
Fang«Удар в тыл» считается от конвенции сторон, а не от разворота юнита — «лица» у юнита в симуляции нет, слой C позиционики не реализован: удар в спину цели, зашедшей за нашу линию, тыловым не считается. Печать сделана неснимаемой — система эффектов не различает истечение и снятие, иначе чужой диспел работал бы детонатором. Фокус автоатак «Ближайший»: «Меньше всего HP%» роняет зеркальный бой (несимметричный тай-брейк по Id). Идентичности яда (анти-хил и родня) в движке нет — долг общий для всех ядовитых китов.
Torrent«+50% на себе» действует на прочность щита, но не на дальность отбрасывания взрыва. Прочность щита 300, автоатака 150 при темпе 0.8 — не замерено. Улучшения не заданы и в карточке.
HearthУголь с 03.08.2026 один на всех (effect.ember), близнец warm_ash удалён; стойкость и лечение раздаёт аура пассивки effect.warm_ember, потолки живут в ней (−50%, 50 стаков в лечении). Не реализовано из карточки: перенос части входящего урона на соседа (T1 «Общий очаг»), усиление лечения втрое (T1 «Целебное тепло»), два союзника за каст (T2), щит на 10 стаках (T2), угли на своих не гаснут (T2). Цена очистки в стаках — дизайн 2026-07-27, реализация не сверена.
Lull«Кошмар» реализован не пассивкой, а вторым эффектом «Колыбельной» (нарастающий DoT на той же цели): сон от другого источника кошмаром не обрастает. Разгон тика считается от прожитого времени эффекта, поэтому повторное наложение сбрасывает нарастание. Сна, правила агро и «урон источника не будит» в движке нетвсё три собрано (SleepComponent: пробуждающий удар ×2 и диспел по тегу, автор сна цель не будит; ProfileBrain.HuntsSleepers: спящих не выбирают, кроме тех, кто явно охотится за тегом сна). Мерить надо по интервалу «уснула → проснулась», а не DPS в открытом размене: замер 21.08.2026 дал ей 26% классовой нормы урона — линза меряет не то, чем она играет (docs/balance-issues.md §BAL-032).
TitheФормы разведены 2026-07-30 (стойка по дистанции, порог 3 с гистерезисом до 4.5; дальняя — канал типом Кровотечение, ближняя — Колющий со шредом). «Жилы» собраны 2026-07-30effect.sinews (порог 30% HP, +50% темпа, плата 4% макс HP за удар, кровь долей 30% от урона по статам), гейт по ближней стойке. Плата берётся прямым вычетом HP, поэтому вампиризм её не отыгрывает; порог гейтит бонус и плату разом, поэтому убить себя ударами кит не может. Дальняя форма кровь-DoT не вешает — поток бьёт типом Кровотечение напрямую. Фокус по форме собран 2026-07-30: стойка несёт свой TargetingMode (вдали — «больше всего HP», в упор — новый режим «больше всего брони», сумма обеих школ), мозг читает его у бойца и предпочитает профилю кита. Чипы карточки показывают обе формы с того же дня — стойка объявляет типы наружу через IDeclaresDamageTypes. Шред снят 2026-07-30 (вердикт Макса: «пробития брони нет в принципе»): effect.stone_crush удалён вместе с ассетом, ближняя форма несёт только «Жилы». Фокус в упор — Ближайший, вместе со шредом ушло и обоснование «бить самого бронированного». «Кровавый обмен» кормится только своими кровотечениями (событие идёт получателю) и только уроном типа Кровотечение — яд Клыка его больше не кормит (фильтр по типу, 2026-07-30).
DraugrПродление чужого оглушения сделано своим станом на 2 сек поверх: чужой рантайм-эффект не правится. «Ледяная жатва» целится режимом AllEnemiesWithTag по тегу статуи — одиночного выбора «цель с тегом» у способностей нет, по двум статуям ударит по обеим. Отсутствуют: канал, страх, конус, холодная линия; расщепление удара между школами — под вопросом (механика была, снята со старой моделью огня). Цена самая высокая по числу отсутствующих механик, но четыре из пяти нужны не только ему.
BonewrightЧисла не замерены: щит 90 + 0.5×AP, скелет 700 HP при 70 урона, лимит живых 8, мана 40.
BulwarkAP-коэффициенты не заполнены (как и у всех). Блок стал общим примитивом 2026-07-31 (BlockComponent), карточка описывает его переопределение. «Решительный удар» переделан 2026-07-31 и расхождения больше нет: активка сама не бьёт, она взводит заряд effect.resolute_strike_charge и делает рекаст — множитель ×2, стан и ослабление ложатся при попадании уникального удара, поэтому его можно сбить контролем, от него можно уклониться, и он уходит в промах вместе со всеми эффектами. Осталось от прежней модели: клип слота Skill1 (Attack2) по-прежнему нечему проигрывать — удар идёт анимацией авто-атаки.
VerdictКулдаун уклонения в ассете не выражен полем — проверить, чем гейтится перезарядка зарядов. Остальное сделано.
Spear«Стальной вихрь»: замедление и щит есть, отбрасывания и каст-тайма нет (_displaces: 0, _castSeconds: 0). Каст-тайм ждёт общей механики каст-времён.
ShepherdДиспел есть; числа лечения в ассете — 25% себе и 75% союзнику (_fraction: 0.25, _allyBonus: 3), карточка приведена к ним 2026-07-30.
WinterПереведён на холодную линию 2026-07-30: автоатака кладёт Frost вместо легаси-Frozen, активка стала «Ледяной зоной» (канал 5 сек, тик 0.5 сек, круг радиуса 3 вокруг цели). Остаток: центр зоны — позиция цели, а не свободно выбранная точка (таргетинга по точке нет). Легаси-ассеты Frozen и IceChainsStun удалены.
Pyre · Bloom · Thornсм. §Долг сверки карточка ↔ движок выше — расхождения из handoff, кодом не пересверены. Сделанное по ним: «Угли» отдельным эффектом и SplitAttackOnTagComponent (2026-07-26), процентная огненная половина _pctTargetMaxHp/_pctPerStack (2026-07-28), хил-нагрузка AbilityData._healEffect + SporeMend у Друида (2026-07-28).

Общая мель по AP: StatType.AbilityPower объявлен и ScalableValue умеет «база + k×стат», но ни один ассет не даёт ни единицы AP и не заполняет коэффициенты. Все скейлы, описанные в карточках, при AP = 0 дают ровно текущие числа.

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

relic.base — служебный базовый ассет (BaseRelic.asset), от которого наследуются числа. Карточки не имеет и не должен: это технический носитель дефолтов, а не контент.

Карточки без статуса реализации

The Tideнадгробие снятого кита (status: archive, поля impl нет намеренно). Он не «ждёт реализации», он заменён на The Torrent; файл живёт только чтобы исторические ссылки журнала не оборвались. В сводках выше не появляется — и правильно.