squad-proto/docs/22-loot.md
z.kirill 92a8864726 Крафт стал выбором: закалка, отпечаток, направленные операции (M33)
Прежние пять операций были СЛЕПЫМИ: перековка бросала всё заново,
прививка ставила случайный тег, отсечение снимало последний аффикс,
возвышение поднимало случайный. Игрок не принимал ни одного решения - жал
кнопку и смотрел, что выпало. Это не крафт, это второй бросок предмета за
материалы.

Теперь половина операций направленные: игрок показывает пальцем, какой
аффикс трогать, и платит за это вдвое - вот это уже решение
("перебросить всё дёшево или снять один дорого").

Два новых глагола:
  ЗАКАЛКА двигает рулон выбранного аффикса к максимуму его тира на треть
  остатка. Дёшево, понятно, повторяемо - то самое "доработать почти
  хорошую вещь". Тир не трогает: за ступень платят возвышением.

  ОТПЕЧАТОК переносит лучший аффикс с ДРУГОЙ вещи, сжигая её. Именно он
  превращает хлам из схрона в ресурс, а не в мусор, который лежит.
  Правило "один тег один раз" им не обходится, бюджет проверяется.

В мастерской: клик по вещи кладёт её на верстак, повторный клик по той же
назначает донором (помечается кровью - он сгорит, и видеть это надо ДО
нажатия). Строки аффиксов стали кнопками: по ним выбирается цель.

Проверка меряет НАПРАВЛЕННОСТЬ, а не факт срабатывания:

  направленность: отсечение по цели, возвышение по цели,
                  закалка двигает рулон, отпечаток перенёс и сжёг донора

Отсечение пробуется на СРЕДНЕМ аффиксе из трёх: операция, которая
"работает", снимая последний, прошла бы и слепую версию.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 19:37:07 +03:00

284 lines
21 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 22 — Добыча: редкости, аффиксы, артефакты, зачарования
Продолжение [20-gdd.md](20-gdd.md). Боевые формулы — [21-damage.md](21-damage.md).
Правило, из которого всё растёт: **находка должна быть решением, а не
прибавкой**. Предмет, который просто «лучше на 7%», не стоит того, чтобы за ним
идти в темноту, — а идти в темноту и есть игра.
## 1. Редкости
Сделано в M25. Числа ниже — **замеренные** (`--tool drops 1 100`, по 10000
бросков на глубину), а не задуманные:
| Редкость | Аффиксов | D1 | D28 | D55 | D100 |
|---|---|---|---|---|---|
| Обычное | 0 | 96.9% | 67.5% | 38.4% | 12.3% |
| Меченое | 12 | 2.9% | 21.3% | 23.5% | 21.9% |
| Разработка | 34 | 0.1% | 7.1% | 25.1% | 39.6% |
| Реликт | 56 | ~0.01% | 4.1% | 13.1% | 26.2% |
| **Артефакт** | уникальное правило + 2 | — | — | — | — |
Кривая редкости:
```
P(не обычное) = 0.02 + 0.011·d (до 0.88)
```
**Наклон 0.011, а не 0.0075.** В первой редакции этого документа формула и
таблица рядом с ней противоречили друг другу: формула давала на первом этаже
2.7% находок с аффиксами, таблица — 22%. Выбрана формула (первый этаж обязан
быть скучным, [20-gdd.md](20-gdd.md) §1), а наклон поднят так, чтобы сойтись с
таблицей на дне: 12% обычных на сотом этаже. Проверяется инструментом.
Реликт на первом этаже возможен — примерно один на восемь тысяч находок. Это
намеренно не запрещено: тир там всё равно первый, то есть пять рулонов по пять
процентов. Лотерейный выигрыш, а не сломанное начало.
**Артефактов пока нет** — они не «ещё не выкачены», а следующая веха: артефакт
даёт ПРАВИЛО, а не число, и для этого нужны триггеры (on-hit, on-kill), которых
в игре ещё нет.
**Пити на артефакт:** 60 этажей без артефакта → следующий гарантирован. Без
пити распределение даёт игроку без артефакта на восьмидесятом этаже, и это не
«не повезло», а сломанная сессия на двадцать часов.
## 2. Слоты и что в них лежит
| Слот | Что | Личное/общее |
|---|---|---|
| Руки | ствол или клинок | личное |
| Броня | костюм | личное |
| Карман | оберег/фонарь/модуль | личное |
| Сумка | всё остальное | **общее на отряд** |
| Гнёзда артефактов | 1 → 3 по глубине рекорда | общее на отряд |
Гнёзда артефактов открываются рекордом: первое сразу, второе на D40, третье на
D75. Артефакты общие намеренно — они правила, а не снаряжение, и делить их по
бойцам значило бы прятать главное решение сборки в подменю.
## 3. Аффиксы
Аффикс = `тег + тир + рулон`. Тег определяет, ЧТО он даёт; тир — насколько
сильный доступен; рулон — конкретное число в диапазоне тира.
```
доступный тир на глубине: T_max(d) = 1 + floor(d / 12) (до 9)
диапазон тира T: [lo·T^1.35, hi·T^1.35]
цена аффикса в бюджете: cost(T) = 4 + 5·T
бюджет предмета: B(ilvl) = 45 + 2.5·ilvl
```
Из этого следует потолок: на предмете с ilvl 100 бюджет 295, шесть аффиксов
девятого тира стоят 294, седьмой — уже 343. То есть предельная вещь существует
ровно на дне и ровно одна.
**Цифры пересчитаны против первой редакции.** Там стояло `cost = 6 + 4·T` при
`B = 40 + 3·ilvl` и утверждалось то же самое — «шесть и ни одним больше». На
деле влезало восемь (340 / 42 = 8.1), а предельная вещь собиралась уже к
семидесятому этажу. Обещание документа не выполнялось его же арифметикой; это
нашёл `--tool affix`, а не чтение.
Выше по глубине потолок держит бюджет, ниже — счётчик аффиксов: на сороковом
этаже доступен только четвёртый тир, шесть таких стоят 144 при бюджете 145.
Это нормально и не является поломкой: редкость там и обещает не больше шести.
### 3.1. Группы аффиксов
| Группа | Примеры | На чём |
|---|---|---|
| Урон | +% урона, +% стихии, +крит, +критмножитель | оружие |
| Пробитие | +PEN стихии, −сопротивление цели | оружие, карман |
| Стихия | конверсия X% урона в стихию | оружие |
| Статус | +стаки, +длительность, +шанс наложения | оружие, карман |
| Реакция | +% силы реакций, ICD реакции | карман, артефакт |
| Защита | +HP, +броня, +сопротивление, +уклонение | броня |
| Снабжение | +патроны, −вес, +ёмкость, +заряд фонаря | броня, сумка |
| Триггер | on-hit / on-kill / on-hurt эффекты | любое, дорого |
**Правило одной группы.** На предмете не может быть двух аффиксов одной группы
с одинаковым тегом. Иначе «+урон» шесть раз становится единственной правильной
сборкой, и весь остальной список превращается в мусор.
### 3.2. Конверсия стихий
Конверсия — самый важный аффикс в игре, потому что он превращает оружие в
инструмент против конкретного врага:
```
share(KIN) = 1 Σ конверсий, Σ конверсий ≤ 0.85
```
Полностью убрать кинетику нельзя: оружие без физического урона перестало бы
работать по целям, у которых нет сопротивлений вовсе.
## 4. Артефакты
Артефакт не даёт процентов. Он даёт **правило**, которое меняет то, как отряд
играет. Их около 60 к моменту выхода акта VI; ниже — восемь, задающих диапазон.
| Артефакт | Правило | Цена правила |
|---|---|---|
| **Стеклянный кулак** | +140% урона | 60% макс. HP всему отряду |
| **Двойное сердце** | реакции срабатывают дважды | 35% силы реакции |
| **Пепельный ход** | убийство даёт +12% скорости, стак 8 | вне боя стаки сгорают за 2 с |
| **Долг** | павший оперативник встаёт через 20 с | каждое воскрешение 5 макс. HP навсегда |
| **Счётчик Гейгера** | RAD не тратит стаки на реакции | весь отряд получает 3 RAD/сек на этаже |
| **Тихий шаг** | твари замечают на 45% ближе | фонарь садится вдвое быстрее |
| **Заём** | +1 гнездо артефакта | 25% опыта за вылазку |
| **Пустая рука** | оперативник без брони: +90% урона и +50% скорости | без брони |
Каждый артефакт — **сделка**, и ни один не является чистым улучшением. Артефакт
без цены превращается в обязательный предмет: его надевают все и всегда, и одно
гнездо сборки выпадает из игры навсегда.
## 5. Материалы и зачарование
### 5.1. Материалы
Сделано в M27.
| Материал | Откуда | Куда |
|---|---|---|
| Лом | разбитая обстановка, любая глубина | перековка |
| Био-ядро | твари на этажах FLESH, D21+ | прививка, возвышение |
| Крио-ядро | твари на этажах FROST, D36+ | отсечение, возвышение |
| Осколок реактора | твари, D53+ | возвышение |
| Пустотный шлак | твари, D73+ | залом |
Материал добывается только в своей полосе — это и есть причина возвращаться на
средние глубины после того, как рекорд ушёл вниз. Без этого весь контент, кроме
последнего акта, умирает.
Полосы проверяются в `--descend` прямым опросом таблицы: в игре протечка была бы
заметна часов через двадцать, когда выяснилось бы, что возвращаться незачем.
```
плоть на 25 лом 0, био 2, крио 0, осколок 0, шлак 0
сталь на 25 лом 0, био 0, крио 0, осколок 0, шлак 0
мороз на 40 лом 0, био 0, крио 2, осколок 0, шлак 0
```
**Материалы — валюта, а не предметы:** не занимают ячеек, не весят, в схроне не
лежат. Иначе поход за материалами превратился бы в тот же поход с сумкой. Но
теряются они так же, как добыча: заработанное зачисляется только при эвакуации.
С твари падает **одно ядро, с крупной — два**, и это не «сколько она стоит».
Первая версия роняла по её danger, и `--tool craft` показал, что вылазка на
восьмидесятом этаже приносит тысячу ядер при цене доводки вещи в шестьсот:
материалы не стоили ничего, а мастерская из ставки превращалась в кнопку.
### 5.2. Операции
| Операция | Что делает | Цена | Цель |
|---|---|---|---|
| Перековка | заново бросает значения (теги и тиры на месте) | 4 лома × тир | слепо |
| **Закалка** | двигает рулон ВЫБРАННОГО аффикса к максимуму его тира | 6 лома × тир | по выбору |
| Прививка | добавляет аффикс нового тега, если есть бюджет | 2 био × тир | слепо |
| Отсечение | снимает ВЫБРАННЫЙ аффикс | 2 крио × тир | по выбору |
| Возвышение | +1 тир ВЫБРАННОМУ аффиксу | 3 био + 3 крио × тир, 1 осколок | по выбору |
| **Отпечаток** | переносит лучший аффикс с ДРУГОГО предмета; донор сгорает | 4 био + 4 крио × тир, 2 осколка | по выбору вещи |
| **Залом** | +2 тира всем, но на один аффикс меньше | 3 шлака | 12%: предмет рассыпается |
### Чего не хватало первой версии: ВЫБОРА
Все пять прежних операций были слепыми: перековка бросала всё заново, прививка
ставила случайный тег, отсечение снимало ПОСЛЕДНИЙ аффикс, возвышение поднимало
случайный. Игрок не принимал ни одного решения — он жал кнопку и смотрел, что
выпало. Это не крафт, это второй бросок предмета за материалы.
Теперь половина операций **направленные**: игрок показывает пальцем, какой аффикс
трогать. Плата за это — цена: направленная операция вдвое дороже слепой, и вот
это уже решение — «перебросить всё дёшево или снять один дорого».
И появились два глагола, которых не было вовсе:
- **Закалка** двигает рулон к верху его тира на треть остатка. Дёшево, понятно,
повторяемо — то самое «доработать почти хорошую вещь». Тир она не трогает: за
ступень платят возвышением;
- **Отпечаток** переносит лучший аффикс с другой вещи, сжигая её. Именно он
превращает хлам из схрона в ресурс, а не в мусор, который лежит. Правило «один
тег один раз» им не обходится, и бюджет предмета проверяется как везде.
Три уточнения, каждое против конкретного обхода:
- перековка меняет **только значения**. Меняй она ещё и теги — это был бы новый
бросок предмета, то есть способ обойти редкость;
- прививка не ставит тег, который уже есть;
- отпечаток берёт **лучший** аффикс донора, а не выбранный: игрок и так жертвует
целой вещью, и просить два решения за одну цену — перебор.
Проверяется в `--descend` направленностью, а не фактом срабатывания:
```
направленность: отсечение по цели, возвышение по цели, закалка двигает рулон,
отпечаток перенёс и сжёг донора
```
Отсечение проверяется на СРЕДНЕМ аффиксе из трёх: операция, которая «работает»,
снимая последний, прошла бы и слепую версию.
Залом — единственная операция с риском, и он настоящий: предмет исчезает, а
плата снимается всё равно. Замерено на тысяче попыток: **рассыпалось 11.6% при
заявленных 12%**, платят всегда, слот теряется всегда. Проверять это иначе
нельзя — «у меня трижды не рассыпалось» не доказательство ни в какую сторону.
Именно поэтому лучшая вещь в игре всегда чуть хуже, чем могла бы быть, — почти
никто не заламывает то, что собирал двадцать часов. Это и задумано: разрыв между
«хорошей сборкой» и «идеальной» держит лейтгейм живым.
### 5.3. Стоимость полной сборки
Считается инструментом, а не на глаз: `--tool craft 80`.
```
на глубине 80: ядер за вылазку 104, полная доводка вещи 648 ядер
то есть 6.2 вылазок на предмет (в документе заявлено около 8)
```
Доход **упирается в потолок расстановки**: на этаж влезает не больше
`MAX_LEVEL_SPAWNS` тварей, поэтому с сорокового этажа и глубже вылазка приносит
примерно одно и то же. Глубина даёт не количество материалов, а КАЧЕСТВО
предметов — а вместе с ним и цену доводки, которая растёт с тиром. Отсюда и
кривая: вещь сорокового этажа доводится за три вылазки, вещь сотого — за шесть с
лишним.
Первая версия расчёта брала доход из бюджета опасности этажа и завысила его
впятеро: бюджет уходит не в количество тварей, а в их силу.
## 6. Как это не превращается в кашу
Три правила, которые придётся защищать от самих себя при любом расширении:
1. **Ни одного чистого улучшения.** Каждый артефакт — сделка, каждый высокий
тир — вес или риск. Предмет без цены обязателен, а обязательный предмет — это
вырезанный слот.
2. **Бюджет вместо запретов.** Ограничивает арифметика, а не список исключений.
Список исключений разрастается и однажды противоречит сам себе.
3. **Находка — решение.** Если новая вещь не заставляет игрока хоть раз
задуматься «а что снять», её не должно быть в таблице дропа вообще.
## 7. Проверки
| Утверждение | Инструмент | Статус |
|---|---|---|
| кривая редкости: первый этаж скучный, сотый щедрый | `--tool drops 1 100` | есть |
| бюджет пускает ровно шесть высших аффиксов и только на дне | `--tool affix <глубина>` | есть |
| выкатанное доезжает до бойца и до правил урона | `--descend` | есть |
| редкость и рулоны переживают запись профиля | `--descend`, круговой прогон | есть |
| материалов хватает на сборку за ~8 вылазок | `--tool economy` | материалов ещё нет |
| ни один артефакт не является чистым плюсом | ревью-чеклист | артефактов ещё нет |
| TTK не выходит из коридора с лучшими вещами | `--tool ttk --best` | нет |
Проверка «доезжает до бойца» — главная. Механика, которая есть в каталоге, но не
доходит до правил боя, выглядит снаружи как работающая, и на этом уже дважды
попадались вес и стихии ([07-milestones.md](07-milestones.md)). Поэтому в
`--descend` подкладывается карабин с известными рулонами и сверяется всё:
```
аффиксы: урон 12.0 -> 18.0, здоровье 100 -> 140, броня 0.10 -> 0.25, пробитие 0.20
стихии карабина: KIN 1.00 -> 0.60, CRY 0.40, сумма долей 1.000
```
Последнее число тут не украшение: конверсия обязана ПЕРЕВОДИТЬ урон, а не
добавлять седьмую долю сверх единицы. Иначе стихии стали бы каналом наращивания
чисел — ровно тем, чем они не должны быть ([21-damage.md](21-damage.md)).