18-engine.md границы Tile2D, проекции 2D, формат проекта, второй проект 19-agent.md инструменты --tool, скиллы, терминал в редакторе 20-gdd.md акты, петли, рост отряда, закон масштаба, бюджет 200 часов 21-damage.md семь стихий, статусы, десять реакций, формулы, триггеры 22-loot.md редкости, аффиксы, артефакты, зачарования, материалы 23-endgame.md Бездна, мутации, лидерборды, 262 ачивки Плюс правки 01/02/07/15/16/17 под переехавшие пути и новые правила забега. Дизайнерская часть держится на одном законе: угроза растёт квадратично, сила отряда — линейно с затуханием, разрыв закрывается ЗНАНИЕМ, а не числами. Из него выведены и экономика опыта (41 млн против 44 млн дохода), и то, почему реакции считаются от глубины, а не от урона оружия, и почему в Бездне множитель HP разрешён, а во всём авторском контенте запрещён. .claude/commands: скиллы /tile2d, /room, /floor — правила этого движка, которые нельзя вывести из кода. Главное записано первым: не отчитываться об успехе без прохода --tool validate. Числа в этих документах — вход для инструментов, а не украшение. Расхождение между таблицей и выводом инструмента означает, что неправ документ. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
14 KiB
21 — Урон: стихии, статусы, реакции, триггеры
Продолжение 20-gdd.md. Здесь вся боевая арифметика.
Главное ограничение, из которого всё следует: в игре нет ручных действий (спек 5). Игрок водит диск и строит отряд; ни одна механика ниже не вводит кнопку. Стихии накладываются оружием, реакции срабатывают сами, эффекты висят на снаряжении. Мастерство — это ЧТО ты взял вниз и КУДА повёл отряд, а не как быстро ты нажимаешь.
1. Семь стихий
| Код | Имя | Что делает | Против кого |
|---|---|---|---|
| KIN | Кинетика | оглушение, отбрасывание | универсально, режется бронёй |
| INC | Жар | горение, распространение при смерти | мягкие, скопления |
| CRY | Холод | замедление, заморозка | быстрые, рывковые |
| TOX | Кислота | снятие брони, урон от макс. HP | бронированные, жирные |
| ARC | Дуга | цепь по целям, наводка | толпы, слабые |
| RAD | Радиация | взрыв при смерти, заражение | стаи, respawn-твари |
| VOID | Пустота | срезание сопротивлений, притяжение | всё, что защищено |
Стихии вводятся по актам (20-gdd.md §3), а не разом: игрок должен успеть понять каждую, прежде чем получит следующую.
1.1. Статусы
Каждая стихия кладёт стаки статуса. Стак живёт dur, сгорает по одному.
| Статус | Стаки | Эффект за стак | Потолок |
|---|---|---|---|
| Горение (INC) | 5 | 6% урона удара в секунду, 4 с | при смерти поджигает в радиусе 1.5 |
| Оледенение (CRY) | 10 | −4% скорости, 3 с | 10 стаков → Заморозка 1.4 с, +50% получаемого KIN |
| Разъедание (TOX) | 8 | −4% брони, 5 с | +0.8% макс. HP цели в секунду |
| Разряд (ARC) | 4 | +5% получаемого крита, 3 с | 4 стака → цепь на 2 цели по 40% |
| Заражение (RAD) | 6 | +3% получаемого урона, 6 с | при смерти взрыв 60% макс. HP, R=2.2 |
| Схлопывание (VOID) | 3 | −8% всех сопротивлений, 4 с | 3 стака → притяжение к центру |
Числа подобраны под один принцип: один стак не значит ничего, полный набор меняет бой. Это заставляет выбирать цель и держать её, а не поливать всех.
2. Формула урона
Одна формула на всё — и на пулю, и на клинок, и на тик горения.
┌ базовый урон источника
dmg_raw = W · (1 + Σ add) · Π mult
dmg_elem = dmg_raw · share(e) для каждой стихии e удара
mitig(e) = 1 − clamp(R(e) + R_aff − PEN(e), −0.60, +0.85)
dmg_final = Σ_e dmg_elem · mitig(e) · crit · vuln
| Символ | Что | Диапазон |
|---|---|---|
W |
урон оружия (каталог sim/weapon_defs.h) |
8 → 900 по глубине |
Σ add |
аддитивные проценты (аффиксы «+X% урона») | 0 → 4.5 |
Π mult |
множители (специализации, реакции, метки) | 1.0 → 3.0 |
share(e) |
доля стихии в уроне, Σ = 1 | конверсия аффиксами |
R(e) |
сопротивление вида (каталог) | −0.5 → 0.9 |
PEN(e) |
пробитие сборки | 0 → 0.75 |
crit |
1.0 или critMult |
1.5 → 4.0 |
vuln |
уязвимости от статусов | 1.0 → 2.2 |
Почему сопротивление режется до −0.60, а не глубже. Отрицательное сопротивление — это уязвимость, и она обязана быть ощутимой, но не абсурдной: при −2.0 одна верная стихия обесценивала бы всю остальную сборку.
Почему потолок +0.85, а не 1.0. Иммунитета нет ни у кого. Тварь, которую физически нельзя ранить, — это не сложность, а тупик: игрок без нужной стихии просто не может играть.
2.1. Броня — отдельно от сопротивлений
Броня режет только KIN и работает долей с жёстким потолком ARMOR_CAP = 0.72
(уже в коде). TOX снимает броню стаками — это единственный способ пробить
тяжёлую цель без пробития в сборке.
2.2. Крит
critChance = clamp(0.05 + Σ aff, 0, 0.75)
critMult = 1.5 + Σ aff (без потолка)
Шанс с потолком, множитель без — потому что «всегда крит» убивает разброс результата, а «очень больно раз в четыре удара» его сохраняет.
3. Реакции
Две РАЗНЫЕ стихии на одной цели в пределах 3 секунд дают реакцию. Реакция срабатывает сама и снимает оба статуса.
| Реакция | Пара | Эффект |
|---|---|---|
| Растрескивание | INC + CRY | всплеск 250% APow в точке, +80% к следующему KIN |
| Возгорание | INC + TOX | облако R=3.0, 180% APow в секунду, 3 с |
| Сверхпроводник | ARC + CRY | −30% всех сопротивлений цели и соседей, 6 с |
| Электролиз | ARC + TOX | все DoT на цели ×3 на 3 с |
| Распад | RAD + INC | зона R=2.5 на 8 с, 60% APow в секунду, кладёт RAD |
| Пепел | RAD + CRY | цель не воскресает и не респавнится |
| Резонанс | VOID + любая | реакция повторяется вторым срабатыванием на 60% |
| Схлоп | VOID + ARC | притяжение всех в R=4 к цели, оглушение 1 с |
| Осколки | KIN + CRY | замороженная цель при смерти бьёт осколками, 120% APow |
| Прорыв | KIN + TOX | −40% брони цели на 5 с, игнорируя потолок |
3.1. Сила реакции не зависит от оружия
APow(d) = 4 + 0.12·d (d — глубина этажа)
reaction = k · APow(d) · (1 + reactionBonus)
Это ключевое решение. Реакция считается от глубины, а не от урона оружия — иначе на сотом этаже реакции стали бы округлением, и вся система стихий превратилась бы в украшение. Так же поступает Genshin с Elemental Mastery, и по той же причине.
Следствие: реакции — это канал «знания» из закона масштаба (20-gdd.md §2). Они растут сами по глубине, но только у того, кто умеет их запускать.
3.2. Внутренний откат
У каждой пары свой ICD: 1.2 с на цель. Без него цепь ARC по десяти тварям взорвала бы этаж одним нажатием, которого к тому же нет.
4. Триггеры: on-hit, on-kill, on-death
Журнал боевых событий уже существует — sim/events.h, кольцевой буфер, по
которому сейчас работают эффекты и свет. Триггеры вешаются на него, а не рядом:
второй канал событий разошёлся бы с первым в первый же месяц.
| Триггер | Когда | Пример эффекта |
|---|---|---|
on_attack |
начало выстрела/замаха | «каждый 5-й выстрел бесплатный» |
on_hit |
попадание | «10% наложить CRY» |
on_crit |
критическое попадание | «крит снимает 1 стак перезарядки» |
on_kill |
цель умерла от тебя | «+8% скорости на 3 с, стак до 5» |
on_death |
ЦЕЛЬ умерла (любая) | «труп взрывается RAD» |
on_hurt |
по тебе попали | «20%: наложить INC атакующему» |
on_down |
твой оперативник пал | «отряд получает +25% урона на 10 с» |
on_floor |
вход на этаж | «+1 бинт, если сумка не полна» |
on_extract |
эвакуация | «+15% материалов» |
4.1. Против взрыва комбинаций
Три ограничителя, все обязательные:
- ICD у каждого эффекта. Минимум 0.5 с, у мощных — до 8 с.
- Бюджет строки. Предмет несёт суммарный бюджет
B(ilvl) = 40 + 3·ilvl; каждый аффикс стоит по тиру (22-loot.md §3). Шесть сильнейших аффиксов не влезают в один предмет никогда. - Запрет рекурсии. Эффект, сработавший от триггера, не может запустить тот
же триггер:
on_kill→ взрыв → смерть →on_killобрывается на первом шаге.
Без третьего пункта одна цепь ARC на скоплении из сорока тварей вешает игру — и это не гипотеза, а то, как ломаются все игры с триггерами.
5. Твари: сопротивления и роли
Сопротивление — свойство ВИДА, из каталога проекта. Роль читается по профилю сопротивлений, и это единственная подсказка, которую игра даёт напрямую.
| Вид | Акт | KIN | INC | CRY | TOX | ARC | RAD | Роль |
|---|---|---|---|---|---|---|---|---|
| Бредущий | I | .0 | −.2 | .0 | .0 | .0 | .3 | мясо |
| Бегун | I | .0 | .0 | −.4 | .0 | .2 | .0 | давление |
| Плевок | II | .1 | .0 | .0 | .5 | −.3 | .2 | дистанция |
| Хват | III | .3 | −.3 | .1 | .0 | .0 | .0 | контроль |
| Громила | III | .5 | .2 | .3 | −.4 | .0 | .1 | танк |
| Рой | IV | −.2 | −.5 | .0 | .0 | −.4 | .4 | толпа |
| Скорлупа | IV | .7 | .3 | .4 | −.5 | .3 | .2 | стена |
| Плакальщик | V | .2 | .0 | .0 | .2 | .2 | −.6 | воскрешает |
| Пустотник | VI | .3 | .3 | .3 | .3 | .3 | .3 | требует VOID |
Читается так: против Скорлупы бесполезно всё, кроме TOX; Плакальщика надо жечь радиацией, иначе он поднимет остальных; Пустотник равномерно защищён, и его берут только срезанием сопротивлений.
Ни у одного вида нет множителя HP от глубины. Глубже выходят ДРУГИЕ виды — правило из 16-descent.md, и оно не отменяется до Бездны (23-endgame.md §2, где отменяется осознанно и с объяснением).
6. Коридор TTK
Чтобы бой не превращался ни в тир, ни в губку, время убийства держится в коридоре — это проверяемое обещание, а не пожелание.
| Цель | TTK одним оперативником, с верной стихией | с неверной |
|---|---|---|
| мясо своей полосы | 0.6–1.2 с | 2–4 с |
| давление | 1.0–2.0 с | 4–8 с |
| танк | 4–7 с | 15–40 с |
| элита (мутант) | 8–15 с | не убивается до отката ресурсов |
Разрыв «верная/неверная» — от ×3 до ×6. Меньше — стихии перестают значить, больше — игра требует энциклопедии перед каждым спуском.
Проверяется инструментом --tool ttk <глубина>: он печатает таблицу «вид ×
сборка → секунды» и валится с кодом 1, если хоть одна пара вышла из коридора.
7. Свет как ресурс
Хоррор-часть, которая сейчас не сделана: фонарь даёт множитель обзора и не садится. Должен садиться.
заряд(t) = заряд₀ − drain·t, drain = 1/сек
радиус = base · (0.35 + 0.65 · заряд/заряд₀)
Батареи — расходник (вес 0.3), заменяются автоматически при разряде, как бинты. Кончились — отряд идёт в темноте: обзор 35%, твари замечают первыми.
Это второй после патронов ресурс, который гонит наверх, и он же — причина, по которой ветвь Разведки в дереве узлов не «приятная», а обязательная.