267 lines
18 KiB
Markdown
267 lines
18 KiB
Markdown
|
|
# 20 — Дизайн игры: от одного исследователя до отряда думслееров
|
|||
|
|
|
|||
|
|
Это мастер-документ. Формулы урона и стихий — [21-damage.md](21-damage.md),
|
|||
|
|
предметы и зачарования — [22-loot.md](22-loot.md), бесконечный лейт, лидерборды
|
|||
|
|
и ачивки — [23-endgame.md](23-endgame.md).
|
|||
|
|
|
|||
|
|
Всё, что здесь написано, обязано ужиться с уже построенным: спуск и бюджет
|
|||
|
|
опасности ([16-descent.md](16-descent.md)), экстракшен ([17-extraction.md](17-extraction.md)),
|
|||
|
|
вес, боезапас и расходники, движок Tile2D ([18-engine.md](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](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](19-agent.md)):
|
|||
|
|
|
|||
|
|
| Утверждение | Чем меряется |
|
|||
|
|
|---|---|
|
|||
|
|
| угроза растёт квадратично | `--tool curve 1 120` |
|
|||
|
|
| стена сдвигается на 5–8 этажей за тир | `--tool wall <сборка>` (новый) |
|
|||
|
|
| TTK держится в коридоре | `--tool ttk <глубина>` (новый) |
|
|||
|
|
| экономика опыта сходится | `--tool economy` (новый): доход против цены дерева |
|
|||
|
|
| 200 часов | `--tool time` (новый): бюджет по актам из таблицы §5 |
|
|||
|
|
| набор комнат тянет глубину | `--tool validate` (есть) |
|
|||
|
|
|
|||
|
|
Числа в этих документах — **вход** для инструментов, а не украшение. Расхождение
|
|||
|
|
между таблицей и выводом инструмента означает, что неправ документ.
|