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>
18 KiB
20 — Дизайн игры: от одного исследователя до отряда думслееров
Это мастер-документ. Формулы урона и стихий — 21-damage.md, предметы и зачарования — 22-loot.md, бесконечный лейт, лидерборды и ачивки — 23-endgame.md.
Всё, что здесь написано, обязано ужиться с уже построенным: спуск и бюджет опасности (16-descent.md), экстракшен (17-extraction.md), вес, боезапас и расходники, движок Tile2D (18-engine.md). Где новое ломает старое — сказано прямо.
1. Обещание игры
Первый экран: один оперативник-исследователь. Тактический нож, слабый фонарь, костюм радиозащиты. Полупустая лаборатория, две вялых твари, свет работает. Не страшно — и это НАМЕРЕННО: игроку показывают дно шкалы, чтобы через сто этажей он мог оглянуться.
Последний экран, которого нет: пятеро в силовой броне идут сквозь Бездну, поджигают, замораживают и расщепляют всё в радиусе, и всё равно однажды не возвращаются.
Между этими двумя точками — 200 часов, и ни одной минуты, где сила решала бы всё сама.
2. Закон масштаба — главное правило всей математики
Угроза растёт квадратично. Сила отряда — линейно с затуханием. Разрыв закрывается ЗНАНИЕМ, а не числами.
Угроза этажа — это бюджет опасности, он уже квадратичный:
T(d) = 3 + 2.2·(d−1) + 0.10·(d−1)².
Сила отряда P растёт от улучшений, снаряжения и артефактов, но каждый источник
имеет затухание (§6). Поэтому T(d) / P неизбежно растёт, и на каждой глубине
есть стена — этаж, где отряд перестаёт справляться.
Сдвинуть стену можно тремя способами, и только третий не имеет потолка:
| Способ | Даёт | Потолок |
|---|---|---|
| улучшения и снаряжение | +5–8 этажей за полный тир | есть, жёсткий |
| артефакты и зачарования | +3–6 этажей за сборку | есть, мягкий |
| знание — стихии, реакции, порядок целей, маршрут | ×1.5–3 к эффективной силе | нет |
Отсюда следуют все дальнейшие решения. Если бы числа закрывали разрыв, игра перестала бы быть хоррором на сороковом этаже: страшно не там, где мало урона, а там, где ты не понимаешь, что тебя убивает.
Что ломается, если нарушить. Дайте силе расти быстрее квадрата — и лейтгейм превратится в покос травы, а лидерборд — в тест на терпение. Дайте угрозе расти быстрее силы без канала знания — и стена станет непроходимой стеной, а не задачей.
3. Акты и глубины
Шесть актов авторского содержимого, дальше — бесконечность.
| Акт | Глубины | Тема | Что вводится | Отряд |
|---|---|---|---|---|
| I. Лаборатория | 1–8 | STEEL | базовый бой, вес, патроны | 1 |
| II. Технические уровни | 9–20 | RUST | стихии INC/CRY, первые аффиксы, 2-й оперативник | 2 |
| III. Био-крыло | 21–35 | FLESH | TOX, on-death эффекты, зачарования | 3 |
| IV. Криокамеры | 36–52 | FROST | ARC, реакции, специализации | 4 |
| V. Реактор | 53–72 | EMBER | RAD, аномалии, артефакты | 5 |
| VI. Провал | 73–100 | VOID | VOID, залом, сборки-ключи | 5 |
| VII. Бездна | 101+ | ABYSS | мутации, сезоны, лидерборды | 5 |
Тем становится семь (сейчас четыре: THEME_COUNT = 4 в engine/theme.h).
Полосы задаются проектом (themes в project.txt), поэтому это правка данных,
а не движка.
Каждый акт — это новая причина умирать, а не новый цвет стен. Акт без собственной механики смерти вырезается.
4. Игровой цикл
Три петли, вложенные друг в друга. Каждая обязана давать ответ на вопрос «зачем ещё раз».
Петля этажа (3–8 минут)
Спуститься → разведать → решить, где драка неизбежна → собрать находки → уйти на спуск или наверх. Решение одно и постоянное: ещё этаж или назад. Его задают ресурсы (патроны, бинты, вес) и здоровье, а не таймер.
Петля вылазки (25–45 минут)
Чекпоинт → 5–12 этажей → эвакуация или вайп. Ставка: снаряжение на выживших. Награда: добыча, опыт, материалы, продвижение рекорда.
Петля мета (десятки часов)
Опыт → узлы улучшений. Материалы → крафт и зачарования. Артефакты → сборки. Рекорд глубины → новые чекпоинты → доступ к более глубоким находкам.
┌──────────── этаж ────────────┐
спуск│ разведка → бой → находки │уход
└───────────┬──────────────────┘
↓ эвакуация
┌──────── вылазка ─────────────┐
│ опыт · материалы · артефакты │
└───────────┬──────────────────┘
↓ база
┌────────── мета ──────────────┐
│ узлы · крафт · сборка отряда │
└───────────┬──────────────────┘
↓ глубже
5. Двести часов: откуда цифра
Не «на глазок», а из бюджета времени.
| Величина | Значение |
|---|---|
| среднее время этажа | 4.5 мин (акт I — 2.5, акт VI — 7) |
| этажей за вылазку | 5 → 12 (растёт с глубиной чекпоинтов) |
| время вылазки с подготовкой | 28 → 48 мин |
| вылазок на продвижение одного чекпоинта (5 этажей) | 1 → 12 |
Вылазок на акт: I — 6, II — 22, III — 38, IV — 56, V — 74, VI — 96. Итого ≈ 292 вылазки × 40 мин ≈ 195 часов.
Кривая «вылазок на чекпоинт» растёт линейно: R(c) = 1 + 0.55·c, где c —
номер чекпоинта. Линейно, а не экспоненциально: экспонента даёт стену, за
которой игрок уходит, а не гриндит.
Правило против гринда: каждая вылазка обязана давать прогресс, даже провальная. Вайп сохраняет рекорд глубины и половину материалов, найденных на этажах глубже предыдущего рекорда (см. §7). Ноль прогресса за 40 минут — это причина закрыть игру, а не мотивация.
6. Рост отряда
6.1. Оперативники
Начинаем с одного. Каждый следующий — событие, а не покупка.
| № | Класс | Где | Условие |
|---|---|---|---|
| 1 | Исследователь | старт | — |
| 2 | Штурмовик | D9–12 | капсула стазиса + 2 500 опыта |
| 3 | Техник | D21–26 | капсула + 18 000 опыта + 3 био-ядра |
| 4 | Егерь | D36–42 | капсула + 90 000 опыта + 5 крио-ядер |
| 5 | Инквизитор | D53–60 | капсула + 400 000 опыта + артефакт |
Капсула — редкая находка в своей полосе глубин (шанс на этаж 6%, пити на 20-м этаже полосы). Найти её можно только В ЭТОЙ полосе: пропустить акт и прийти за пятым оперативником на десятом этаже нельзя.
Классы различаются НЕ статами, а поведением в бою — игра без ручных действий (спек 5), и класс это то, как оперативник ведёт себя сам:
| Класс | Поведение | Слабость |
|---|---|---|
| Исследователь | держит дистанцию, первым замечает аномалии, +обзор | ломается в ближнем бою |
| Штурмовик | идёт первым, держит удар, ломает строй тварей | жрёт патроны и бинты |
| Техник | ставит турель/мину на стоянках, чинит броню между этажами | почти не бьёт сам |
| Егерь | бьёт по одиночным целям с дистанции, добивает раненых | бесполезен в толпе |
| Инквизитор | накладывает стихии по площади, запускает реакции | хрупкий, ест материалы |
Пятеро — потолок жёсткий: NUM_AGENTS = 5 уже в коде, и это же потолок
читаемости строя. Шестой в клине не виден.
6.2. Дерево улучшений
Пять ветвей, в каждой 8 узлов, у каждого 5 уровней = 200 уровней узлов.
| Ветвь | О чём | Пример узлов |
|---|---|---|
| Снабжение | патроны, вес, расходники | запас, переноска, ёмкость сумки, авто-бинт |
| Живучесть | HP, броня, сопротивления | живучесть, латание, сопротивление RAD |
| Огневая мощь | урон, крит, скорострельность | пробитие, крит, перезарядка |
| Стихии | элементы и реакции | сила стихии, длительность, сила реакций |
| Разведка | обзор, находки, аномалии | обзор, шанс редкого, чтение аномалий |
Существующие четыре улучшения (Upgrade::AMMO/CARRY/SIGHT/VIGOR в
sim/profile.h) становятся первым кольцом ветвей Снабжения и Живучести.
Затухание — обязательное. Уровень L узла даёт долю от максимума узла:
gain(L) = maxGain · (1 − 1 / (1 + 0.55·L))
L=1 → 35% максимума, L=2 → 52%, L=3 → 62%, L=4 → 69%, L=5 → 73%. Пятый уровень стоит вчетверо дороже первого и даёт вчетверо меньше — и это честно написано в подсказке узла.
Цена уровня: cost(node, L) = base(node) · 2.15^L, где base — от 150
(первое кольцо) до 12 000 (внешнее). Полное дерево ≈ 41 миллион опыта.
6.3. Сходится ли экономика опыта
Опыт за этаж: XP(d) = T(d) · 10 · (1 + 0.15·(d−1)) — это уже работающая
формула (xpPerDanger, xpScale).
| Глубина | XP за этаж |
|---|---|
| 5 | 205 |
| 20 | 3 460 |
| 50 | 29 300 |
| 80 | 116 000 |
| 100 | 190 000 |
За 292 вылазки по 8 этажей средней глубины акта набегает ≈ 44 миллиона.
Дерево стоит 41 — сходится с запасом 7% на переигрывание. Это не совпадение:
base узлов подобраны от этой суммы обратным счётом.
Опыт зачисляется только за эвакуацию — правило уже в коде (FinishRun).
Вайп теряет весь опыт вылазки, и это главный источник напряжения на выходе.
7. Что теряется и что остаётся
Дополняет правила экстракшена (17-extraction.md).
| Эвакуация | Вайп | |
|---|---|---|
| надетое на выживших | остаётся | — |
| надетое на павших | теряется | теряется |
| общая сумка | в схрон целиком | теряется |
| опыт вылазки | зачисляется | теряется |
| материалы | все | половина того, что найдено глубже рекорда |
| рекорд глубины | растёт | растёт |
| узлы, артефакты в схроне | остаются | остаются |
Половина материалов при вайпе — единственная поблажка во всей системе, и она куплена конкретной ценой: без неё «пошёл проверить, что там на пять этажей глубже» стоит сорок минут и не даёт ничего. Прогресс обязан идти даже из провала, иначе разведка глубины перестаёт быть занятием.
8. Что должно измениться в коде
Не «когда-нибудь», а список того, что эта математика требует прямо сейчас.
| Что | Где | Объём |
|---|---|---|
| отряд переменного размера 1→5 | sim/squad.*, HUD, строй |
средний |
| стихии и сопротивления | sim/loadout.h, sim/target.*, каталог |
крупный |
| шина триггеров on-hit/on-kill | поверх sim/events.h — журнал УЖЕ есть |
средний |
| аффиксы предметов | sim/items.h → предмет с рулонами |
крупный |
| материалы и крафт | sim/profile.h, новый экран |
средний |
| дерево узлов | sim/profile.h + экран |
средний |
| темы FLESH.. VOID | данные проекта | мелкий |
| мутации тварей | engine/catalog.* + sim/enemy.* |
средний |
Порядок работ. Стихии → триггеры → аффиксы → материалы → дерево → классы → мутации. Каждый шаг — отдельная веха со своими проверками, как всё в этом репозитории. Стихии первыми, потому что от них зависят и аффиксы, и мутации, и половина ачивок.
9. Как это проверяется
Дизайн, который нельзя измерить, — это пожелание. Для каждого утверждения выше есть или должен появиться инструмент (19-agent.md):
| Утверждение | Чем меряется |
|---|---|
| угроза растёт квадратично | --tool curve 1 120 |
| стена сдвигается на 5–8 этажей за тир | --tool wall <сборка> (новый) |
| TTK держится в коридоре | --tool ttk <глубина> (новый) |
| экономика опыта сходится | --tool economy (новый): доход против цены дерева |
| 200 часов | --tool time (новый): бюджет по актам из таблицы §5 |
| набор комнат тянет глубину | --tool validate (есть) |
Числа в этих документах — вход для инструментов, а не украшение. Расхождение между таблицей и выводом инструмента означает, что неправ документ.