Экспериментальная сборка — полный обзор изменений¶
Охват: всё в ветке
bza-dev-gameplay-pivotначиная с6d92290(«Pivot docs», 22 июля 2026) — 69 коммитов, ~1 370 строк геймплейного кода, ~240 строк новых тюнинг-значений.
0. Что это такое¶
На одну сборку подряд легли две дизайнерские программы:
- Action-пивот (пробы 0.1–0.13,
6d92290..5a90b5d) — тест издателя показал, что проблема в моменте к моменту: в руках у игрока нет глаголов, бои пассивные и затянутые, награды не видны, рейд длится целую сессию. Эта программа перестроила управление, ощущение боя, восприятие врагов и правила встреч. - Погружение (The Dive) (
7e2cb9d..914ac04) — ответ на запрос «другая extraction-игра из тех же ассетов, а не итерация». Эта программа перестроила форму сессии и прогрессии: теперь один забег — это непрерывный спуск, и ты забираешь только то, что вынес.
Обе программы полностью A/B-переключаемы из внутриигровой панели тюнинга. Ни одна дверь не закрыта необратимо:
| Программа | Мастер-флаг | Выключено = |
|---|---|---|
| Погружение | dive.enabled |
точно та игра, что была до пивота (спуск банкует и завершает забег) |
| Action-управление | action.enabled |
классические тап-в-точку / двойной тап-спринт / свайп-уворот |
| Stealth-lite восприятие | combat.aggroOnly |
полный конвейер накопления обнаружения / состояния «подозрение» |
| Нейтральность соперников | rival.neutral |
старые всегда-реактивные соперники |
| Мир/Война | combat.peaceWar |
старый режим «всегда стреляем» |
| Закрывающиеся выходы | extraction.closingStart ≤ 0 |
закрытий нет |
| Смерть по таймеру (шторм) | extraction.stormFinale |
(сейчас выключено) — вернёт финал с утечкой HP |
Как читать каждый пункт: Проблема → Что реализовано → Почему должно помочь → Статус → Твоё решение. «Статус» честный: ▣ проверено в игре, ▢ сделано, не отыграно, ⚠ известный риск.
1. Главные изменения правил (если читать только один раздел — этот)¶
| № | Старое правило | Новое правило | Флаг |
|---|---|---|---|
| 1 | Таймер рейда убивает (шторм, утечка HP) | Смерти по таймеру нет. Часы решают только, какие безопасные выходы закрываются | extraction.stormFinale: false, dive.enabled |
| 2 | Рейд — 10 минут | Этаж — 3 минуты (roundTime: 180) |
map.roundTime |
| 3 | Эвакуация = банк + конец забега | Две двери. Безопасный выход = банк + продвижение чекпоинта + конец. Портал спуска = ничего не банкует, ничего не завершает, ведёт глубже | dive.enabled |
| 4 | Смерть сбрасывает лестницу этажей | Смерть стоит только вынесенной добычи — никогда снаряжения и этажей; ретрай начинается с чекпоинта | реализовано |
| 5 | Смерть не оставляет ничего | Безопасный карман: лучший найденный предмет защищён автоматически и переживает смерть | loot.safeSlots: 1 |
| 6 | Этажи просто сложнее | Каждый спуск даёт выбор 1 из 3 карт улучшений (Тело / Клинок / Жадность), на забег | dive.cardCount |
| 7 | Ценность добычи плоская | Бонус глубины: валюта банкуется с ×(1 + спусков × 0.12), потолок ×1.6 | dive.depthBonusPerFloor |
| 8 | Встреча с соперником = бой | Соперники нейтральны по умолчанию. Войну выбираешь ты: пометить и нанести первый удар | rival.neutral |
| 9 | Стелс — это шкала, которой управляешь | Обнаружение мгновенное и бинарное — нарисованный конус и есть правда | combat.aggroOnly |
| 10 | Тап для движения | Плавающий джойстик рулит напрямую; рывок — экранная кнопка на кулдауне | action.enabled |
| 11 | Автоогонь всегда по видимому | В мире оружие опущено, пока ты движешься; остановка = прицеливание; замечен/ударен = война | combat.peaceWar |
| 12 | FTUE = 7 стадий | FTUE = 3 стадии (лут → бой → спуск) | реализовано (старая таблица припаркована, не удалена) |
2. Управление¶
2.1 Плавающий виртуальный джойстик — action.enabled: true¶
- Проблема. Тап-в-точку не даёт игроку ничего делать поминутно; D1 22.5% и один рейд за сессию читаются как «неинтересно держать в руках», а не как «слишком сложно».
- Что реализовано. Тянешь в любом месте → под пальцем появляется плавающий стик и рулит
персонажем напрямую.
stickRadius: 56, мёртвая зонаstickDead: 0.12(паритет с UnityJoystickInput). Клавиатура: WASD/стрелки — движение, Space — рывок. Тап-в-точку, двойной тап-спринт и свайп-уворот полностью выключены, пока это включено. - Почему помогает. Появляется стрейф. Появляется кайтинг. Все остальные механики пивота (крит с фланга, уворот от телеграфа, «убежать» от доводки прицела) выразимы только при непрерывном управлении.
- Статус. ▣ Проверено — это фундамент, под который настраивалось всё остальное.
- Твоё решение. Взять/выкинуть здесь = решение по всему пивоту; §2–§3 без этого бессмысленны.
2.2 Кнопка действия (рывок) — action.dashCd: 0.9, action.dashFree: true¶
- Проблема. Уворот был свайпом — его не находили, и он конфликтовал с рулением.
- Что реализовано. Крупная экранная кнопка с разворачивающимся кулдауном. Без затрат
стамины — модель «глагол на кулдауне». Длительность уворота расширена
0.25 → 0.35 с(~87 px пути, i-frames =dodgeTime + 0.05). - Почему помогает. Одна надёжная «кнопка паники» ⇒ смерть становится читаемой ошибкой, а не провалом менеджмента ресурса. Стамина как налог на уворот била именно по тем, кто и так проигрывает.
- Статус. ▣ Проверено.
- Твоё решение.
dashCd— та самая ручка темпа; 0.9 с сейчас ощущается щедро. Нужен явный выбор между 0.9 и 1.4.
2.3 Зелье — глоток, а не канал — player.potionChannelTime: 0, player.potionSwig: 0.35¶
- Проблема. Канал 1.2 с с корнем, отменяемый движением, — это дизайн «отойди и спрячься». В стрейф-бою он неиспользуем: он воюет с большими пальцами.
- Что реализовано. Глоток занимает 0.35 с, не укореняет, и прерывается только полученным уроном (зелье при этом сохраняется, не тратится) — но никогда движением. Пей на ходу, но не под градом ударов.
- Статус. ▣ Проверено.
2.4 Посадка на портал — по стойке, а не по тапу — (без флага; паритет с Unity Portal.cs)¶
- Проблема. Быстрая 3-секундная принудительная посадка запускалась тапом — стик-управление осиротило её, остался только медленный 9-секундный пассивный вариант.
- Что реализовано. Стоишь неподвижно на площадке, никого не преследуешь и не в бою → быстрый канал с корнем. Двигаешься по площадке или дерёшься на ней → пассивная посадка (уходишь, продолжая стрелять). Полученный урон стопорит оба; нахождение в бою понижает «с корнем» до пассивной — укоренение никогда не позволяет пропустить бой.
- Почему помогает. Стойка и есть намерение — выбор «активная/пассивная эвакуация» выживает без кнопки. Заодно урок посадки в FTUE становится бестаповым.
- Статус. ▣ Проверено.
2.5 Камера — camera.fitMin: 0.75, leadSteer: 225, leadFight: 150, leadSmooth: 0.02¶
- Проблема. При прямом управлении ты обгоняешь собственный обзор; телефоны видели слишком мало.
- Что реализовано. Телефоны заметно сильнее отдаляют камеру (
0.9 → 0.75). Камера уводит по направлению стика, пока ты свободен, и переключается на увод к противнику в бою. Сглаживание смягчено, чтобы бо́льшие уводы вплывали, а не швыряли кадр. - Заметка. На проходе G0 откатили прежний подъём
fog.radius 300 → 330— более широкая камера решает задачу «видеть дальше» лучше, чем увеличенный круг тумана. - Статус. ▣ Проверено.
3. Ощущение боя¶
3.1 «Губка» отменена — combat.mobHpMult: 2 → 1, mobDmgMult: 0.5 → 1¶
- Проблема. Прежняя модель «долго, но выживаемо» (двойное HP, половинный урон) превращала каждый бой в длинное безопасное простукивание. Бои были пассивными: внутри них не было решений.
- Что реализовано. Нейтральные множители. Мусорные мобы умирают за секунды; удары больно бьют.
- Почему помогает. Смерть становится читаемой («я съел этот телеграф»), а не результатом истощения. Скорость убийства теперь задаётся позиционированием игрока, а не налогом на HP.
- Статус. ▣ Проверено. ⚠ Самый крупный балансный рычаг во всей сборке — проблема «босс-стена» из §8 стоит ниже по течению от него.
3.2 Постоянный крит с фланга — combat.flankCrit: true¶
- Что реализовано. Любое попадание игрока — ближний бой или дистанция — из слепой зоны цели критует, всегда. Без «взведения» стелсом, без блокировки огня после тихого открытия.
- Почему помогает. Позиционирование непрерывно конвертируется в урон — именно это делает twin-stick бой читаемым и выразительным без добавления кнопок.
- Статус. ▣ Проверено.
3.3 Окна для крита с фланга — кого можно переиграть по развороту¶
Крит — это наказание внутри боя, заработанное против связавшего себя врага, а не бесплатная карусель:
| Ручка | Значение | Смысл |
|---|---|---|
turnMelee |
6 рад/с | мусор разворачивается резко — обойти по кругу нельзя (проверка на лобовой DPS) |
turnRanged |
5 | |
turnHeavy |
3 | тяжёлые на средней дистанции — заход на фланг возможен на сближении |
turnClose / turnCloseRange |
4.5 / 70 px | хлыст в упор: внутри 70 px все разворачиваются быстро — дальнобойный тяжёлый не является бесплатной казнью в ближнем бою |
mobMeleeArc |
1.75 рад (~100°) | взмах моба требует лобовой дуги — он не бьёт то, к чему не может повернуться |
melee.recover |
0.15 → 0.35 с | увёрнутый выпад надёжно даёт один удар в открытый тыл |
bodyBlock |
true | тела врагов непроходимы для руления, самонаведения и рывка — фланг означает обход, i-frames нужны для атак, а не для тел |
| - Статус. ▣ Проверено. Самый плотный кластер настройки ощущения во всей сборке и самый | ||
| достойный отдельного плейтеста. |
3.4 Заряженные выстрелы — устоявшаяся модель (без флага режима)¶
- Проблема. Раньше заряд превращал моба в статую, а в момент выстрела прицел щёлкал в идеальную точку — замах ничему не учил, потому что уворот от него не работал.
- Что реализовано. Во время заряда моб упирается (медленное покачивание, не заморозка),
и направление взгляда и есть прицел — конус, пунктирная линия телеграфа и сам выстрел
согласованы. Прицел доводится со скоростью
chargeTurn: 1.8рад/с (сильно ниже боевого разворота — стрейфом его можно обогнать, и это отставание и есть твоё окно), замирает заchargeLockLead: 0.25 сдо выстрела (линия становится сплошной = уворачивайся сейчас), и выстрел уходит по направлению взгляда, а не в твою текущую позицию. Заряд может начаться только когда ты перед мобом — никаких «замахов в спину». Руки заняты: во время заряда моб не бьёт в ближнем бою. - Почему помогает. Та же грамматика «ведение → фиксация → выстрел», что и у выпада в ближнем
бою, так что один урок покрывает всех врагов. Замахи Босса и Привратника удлинены
(
chargeDur0.5→1.0 / 0.55→0.7), чтобы читались с одного взгляда. - ⚠ Прицеливание было сломано до 29.07.2026 — найдено плейтестом, подтверждено замерами. Заряженные выстрелы промахивались по игроку, стоящему совершенно неподвижно, на 43–157 px с дистанции ~260 px. Две причины:
chargeTurnбыл описан как «рад/с», но реализован как дробный lerp по кадрам, то есть экспоненциальное сглаживание — оно асимптотически приближается и никогда не доходит. Прицел сохранял постоянное отставание, пропорциональное скорости изменения пеленга, и собственное покачивание моба давало достаточную скорость пеленга, чтобы промахнуться по неподвижной цели. Теперь это настоящее ограничение скорости.- Плоский
chargeArc(40°) позволял мобу начать выстрел, который он не в состоянии довести по прицелу. Страж ведёт цель всего 0.2 с — это 0.36 рад «полномочий» — но начинал заряд с 40° и стрелял мимо на ~30°. Порог входа теперь выводится для каждого моба из его же замаха (chargeAimMargin: 0.6): эффективная дуга от 9° (Огнешар) до 40° (Босс).chargeArcостаётся потолком. - Замерено после исправления (игрок зафиксирован, первый выстрел, ~260 px): попадают все заряжающиеся мобы — ошибка прицела 0–4°, 0–15 px в сторону. Контригра сохранена: стоишь — попадают; идёшь стрейфом пешком — мимо; рывок на фиксации — мимо. До исправления замах был декорацией; теперь он вынуждает двигаться, что и есть главный тезис пивота.
- Статус. ▣ Проверено — ⚠ но это реальное повышение сложности: заряженные выстрелы, которые раньше всегда мазали, теперь наказывают за стояние на месте. Стоит последить на боссе биома 1.
3.5 Никакой регенерации вне боя — player.hpRegen: 0.005 → 0¶
- Почему. Убыль HP по ходу забега — ключевой рычаг жадности («на 30%: лезть в хранилище
или уходить?»). Струйка регена тихо стирает его. Лечение от «обречённых прогулок» — это
больше дропа зелий (
consumableChance 0.45 → 0.6), а не реген. - Статус. ▣ Проверено. ⚠ Теперь несёт нагрузку в погружении, где HP переносится между этажами.
3.6 Мелочи по бою¶
| Изменение | Было → Стало | Зачем |
|---|---|---|
weapons.sniper.mag |
2 → 3 | «один бой на магазин» — 3×34 убивает мусорного моба с запасом; 2 не могли без крита |
noise.waveSpeed |
(мгновенно) → 560 px/с | звук летит: существа реагируют, когда нарисованное кольцо реально до них дошло, и идут туда, где звук случился — выстрели и смени позицию, и они соберутся на пустом месте |
combat.patrolHold |
(нет) → 1.2× | патрульные задерживаются в конце каждого отрезка с припаркованным конусом — убирает внезапный разворот на 180° прямо на подкрадывающегося |
combat.fightLinger |
2 с | ты считаешься «в бою» 2 с после последнего удара — это блокирует каналы сундуков/ворот (паритет с Unity) |
Вздрагивание (mobReact) |
удалено | решение лида — украшательство «реакция по органу чувств», которое никто не считывал |
4. Восприятие — «stealth-lite»¶
4.1 Мгновенное бинарное обнаружение — combat.aggroOnly: true¶
- Проблема. Старый стелс-конвейер (накопление обнаружения, состояние «подозрение», плавные шкалы) просил мобильного игрока читать симуляцию. Телеметрия говорит, что не читали.
- Что реализовано — три правила, без шкал:
- КОНУС РЕШАЕТ. Нарисованный конус и есть зона обнаружения. Вне дуги обзора = заработанное открытие (попадания критуют через крит с фланга; урон агрит).
- КУСТЫ. Бинарная маскировка — не-заагренные враги замечают спрятанного в кусте только
внутри
bushDetectMult × radius; уже зацепившийся враг листву игнорирует. Двое в одном кусте всегда видят друг друга (нельзя потерять — или получить в засаде — того, кто стоит в твоём же кусте). - ЗВУК. Шум созывает; эхо-блипы предупреждают.
UI:
❗ захват / ? ищет / ничего. Выброшено навсегда: плавное накопление, состояние «подозрение». - Статус. ▣ Проверено. В обучении сохранено старое восприятие.
4.2 Видишь — дерись — combat.mutualSightFire: false + fog.sightFairness: true¶
- Что реализовано. Симметричный шлюз «стрелять можно только когда замечен» выключен. Чтобы это не стало нечестным, введён инвариант: ничто не может стрелять — и даже захватывать — игрока из-за пределов его собственного радиуса обзора. Шесть типов врагов видят дальше тумана; этот зажим их ограничивает. Память преследования после агра не затронута.
- Статус. ▣ Проверено.
4.3 Радиус вступления в бой — combat.engageRange: 200 (+ ui.engageRing)¶
- Проблема. Без шлюза огня автоогонь начинал бои, которых игрок не выбирал.
- Что реализовано. Твой автоогонь открывается по не-заагренным врагам только внутри 200 px (< радиуса обзора). Снаружи можно смотреть, читать и занимать позицию, не связывая себя собственным луком. Ответный огонь по тому, кто уже дерётся с тобой, не ограничен дистанцией. Слабое пунктирное кольцо на земле показывает границу, когда рядом с ней есть видимый не вовлечённый враг.
- Почему помогает. Возвращает выбор вступления в бой игре без кнопки стрельбы.
- Статус. ▣ Проверено.
4.4 Мир / Война — combat.peaceWar: true, plantTime: 0.25, aimTime: 0.9¶
- Проблема. Даже с кольцом вовлечения просто ходить означало объявлять войну. Последовательные заплатки («stalk-hold», «движешься — значит тихо») превратились в лестницу условий, которую никто не мог прочесть.
- Что реализовано — одно видимое состояние:
- МИР (на тебя никто не охотится): оружие опущено, пока ты движешься — ходить можно где угодно бесшумно, без условий на каждую цель.
- ОСТАНОВКА: 0.25 с настоящей неподвижности (палец снят со стика — проход через мёртвую
зону при развороте не считается) → лук натягивается
aimTime: 0.9 сс нарастающей золотой линией телеграфа, затем выстрел. Любое движение отменяет натяг. - ВОЙНА: удар с подхода, либо тебя заметили/ударили — огонь становится неограниченным (полноценный стрейф/кайт-бой).
- Кольцо вовлечения показывает состояние: синее = мир, наполняющееся золотом = прицеливание, красное = война.
- Почему помогает. Враги телеграфируют замахом — теперь и ты тоже. Одно состояние, один цвет, и осознанный первый выстрел становится выбором с ценой, а не случайностью.
- Статус. ▣ Проверено. ⚠ Самая нестандартная идея в сборке — наибольший риск, что новичок прочтёт её как «моё оружие не работает». Нужен явный вердикт.
4.5 Эхо-чувство сужено — fog.senseRadius: 660 → 420¶
Сонарные блипы — это кольцо ближнего предупреждения сразу за зоной видимости, а не радар на всю карту. Сохранено как контрмера против засад в кустах.
5. Соперники-рейдеры (Tier 0 — встреча как выбор)¶
5.1 Нейтральны по умолчанию — rival.neutral: true¶
- Проблема. Любая встреча с соперником схлопывалась в бой, поэтому всё социальное поведение, которое у ботов уже есть (лутают, бегут, гонятся за ключом, эвакуируются с реальной добычей), было невидимым. Пивот обострил это: при aggro-only восприятии со снятым шлюзом огня встречи превратились бы в мгновенные автоматические бои.
- Что реализовано. У каждого соперника одно состояние по отношению к тебе: НЕЙТРАЛЬНЫЙ (исключён из автоогня в обе стороны — вы расходитесь, лутаете и бьёте мобов бок о бок) или ВРАЖДЕБНЫЙ (обычный симметричный бой).
- Статус. ▣ Проверено. Это жёсткая зависимость для «соперники с первого этажа», а не украшение.
5.2 Тап = ПОМЕТКА — rival.declareRange: 260¶
- Проблема. Первая версия была «тап = объявление»: твой тап мгновенно сообщал сопернику, что он в состоянии войны. Это ровно то, чего засада делать не должна.
- Что реализовано. Тап помечает соперника молча — твоё намерение, его неведение. Прицеливание, наведение и удар в спину по нему открываются, а он продолжает лутать. Война начинается по-настоящему, когда попадает твой первый удар. Пометить → подкрасться → заряженный выстрел или нож в тыловую дугу. Повторный тап снимает пометку.
- Статус. ▣ Проверено.
5.3 Безопасный перекрёстный огонь — rival.safeCrossfire: true¶
Шальной огонь между нейтральными сторонами безвреден — выстрелы проходят насквозь, без урона и без войны. Значит, совместный бой против одной стаи мобов не может случайно разрушить перемирие. Война начинается намеренно (пометка или спорный приз). ⚠ Это сознательное отклонение от буквы GDD («любой урон делает враждебным») — вынесено на твоё решение.
5.4 Эскалация и остывание¶
| Ручка | Значение | Поведение |
|---|---|---|
warnRadius / warnTime |
140 px / 1.5 с | вы оба толкаетесь у одного приза (ворота хранилища, площадка, на которую он садится) → жёлтое предупреждение → враждебность. Отход деэскалирует. |
resetTime |
6 → 30 с | враждебный соперник остывает до нейтрального через 30 с потери контакта — драку стоит помнить подольше |
rememberAttacker |
false | true = война, объявленная тобой, навсегда |
⚠ Эскалация через спорную цель — единственный путь Tier 0, не подтверждённый в игре.
5.5 Честный лут — lootSight: 480, crackMult: 1.35, lootPause: 2.5¶
- Проблема. Соперники лутали всеведуще — шли от сундука к сундуку по глобальному списку, пока игрок исследовал сквозь туман, и оставляли после себя только вскрытые сундуки.
- Что реализовано. Соперник целится только в сундуки, которые правдоподобно мог заметить (480 px); иначе он бродит и ищет, как ты. Вскрывает на 35% медленнее тебя и после каждого сундука 2.5 с копается — так что забеги за следующим сундуком можно выигрывать, а спорные сундуки достижимы.
- Статус. ▣ Проверено (исправление по итогам плейтеста).
5.6 Оппортунист (кусок Tier 1, вытянутый вперёд) — oppChance: 0.45, oppFromBiome: 1¶
- Проблема. Полностью нейтральные соперники — это декорация. У поздней жадности не было зубов.
- Что реализовано. Часть соперников выпадает хищниками: нейтральны, пока ты не станешь
добычей — ранен (
oppHpFrac: 0.45) или несёшь много рядом с открытой площадкой (oppHaul: 5предметов в пределах 300 px от площадки). Затем жёлтый такт предупреждения (он тебя оценивает — твоё окно отойти), и он прыгает. Соперники в биоме 1 остаются полностью безмятежными. - Взаимодействие с погружением.
oppHaulPerDescent: 3— порог «жирной добычи» растёт с каждым спуском, потому что при погружении сумка не обнуляется; плоское число оставило бы каждого Оппортуниста навсегда взведённым примерно с 2-го этажа и превратило бы вторую половину забега в коридор из соперников. - Статус. ▢ Сделано, отыграно поверхностно.
5.7 Соперники с первого этажа — prog.botsFromBiome: 1 → 0, botSpawnClear: 380¶
Фантазия extraction-игры на экране с первой минуты (это безопасно теперь, когда нейтральность — поведение по умолчанию). Соперники появляются минимум в 380 px от любого существа, то есть приходят мародёрами со свободным пространством, а не посреди боя.
6. Структура рейда и давление на эвакуацию¶
6.1 Смерти по таймеру нет — extraction.stormFinale: false¶
- Проблема. Финал со штормом (баннеры, утечка HP в последние 30 с, вспышка катаклизма) — это жёсткий провал, который наказывает ровно тех, кому и так тяжело, и он не может сосуществовать с накапливаемой добычей.
- Что реализовано. Шторм выключен. При погружении часы никогда не завершают рейд.
- Статус. ▣ Проверено.
6.2 Закрывающиеся эвакуации — пространственный эндгейм — closingStart: 0.5, closingInterval: 60, closingFromStep: 1¶
- Что реализовано. На середине расписания этажа безопасные выходы гаснут один за другим, начиная с ближайшего к точке входа, с общим баннером и обратным отсчётом на каждой площадке. Резервный (самый дальний) безопасный выход при погружении не закрывается никогда — забрать последнюю возможность забанковать значило бы превратить центральный выбор в принуждение, а игрок, которому не дали обналичить большую добычу, читает это как жульничество игры. Намерение «воронки» несёт бонус глубины: тянуть вниз наградой, а не толкать отказом.
closingFromStep: 1— на этаже B1F1 часов нет вообще (спроектированная победа); давление закрытия дебютирует на B1F2, как и стрелки угроз за экраном (arrowsFromStep: 1).- ⚠ Важное исправление:
tilesPerExit 30 → 20. Маленькие этажи биома 1 округлялись до единственного безопасного выхода, который планировщик тут же резервировал — поэтому до 4-го этажа не закрывалось ничего, и урок закрытия просто не мог состояться. При 20 у этажа 2+ есть два выхода, и один закрывается как задумано. - Статус. ▣ Проверено после исправления. В плане это помечено как носитель напряжения всего пивота и его go/no-go проба — заслуживает прямого вердикта.
6.3 Охраняемый портал спуска — guardsFromStep: 1¶
На этажах ниже шага 1 у портала спуска Привратник не появляется (B1F1 — свободный проход, часть спроектированной победы). Везде дальше спуск — это финальный бой: убрать стража, затем удержать площадку. Этаж босса от этого не освобождается никогда.
6.4 Длина раунда — map.roundTime: 600 → 330 → 180¶
Теперь это расписание закрытий на этаж, а не длина рейда. Первая площадка гаснет на 90-й
секунде, дальше каждые 60 с. Также gateGiveUp 330 → 240, чтобы соперник-ключник успевал
эффектно эвакуироваться со своей добычей, а не погибал на задании под зачисткой.
7. ПОГРУЖЕНИЕ — перестройка прогрессии¶
Питч: сессия — это один непрерывный спуск, и ты забираешь только то, что вынес. Всё остальное в §7 существует, чтобы это предложение стало правдой.
7.1 Две двери — dive.enabled: true¶
- Проблема. Эвакуация была единственным глаголом, завершающим забег, поэтому каждый забег сводился к «зашёл, набрал, ушёл». Внутри сессии не было нарастающего напряжения и не было повода почувствовать жадность.
- Что реализовано.
- Безопасный выход (зелёный) → банкует добычу, двигает чекпоинт, завершает забег. Этаж открывается тем, что ты обналичился с него.
- Портал спуска (👑) → ничего не банкует, ничего не завершает. Генерируется следующий этаж, а добыча, раны, расходники, надетое в поле снаряжение и карты улучшений переносятся.
- Смерть → стоит только добычи. Снаряжение и лестница не теряются никогда; ретрай начинается с чекпоинта, а не с этажа, где ты погиб.
- Почему помогает. Появляется решение, которого в игре не было никогда: забанковать сейчас или унести глубже? Добыча накапливается, HP не восстанавливается, и ответ меняется на каждом этаже.
- Статус. ▣ Проверено от начала до конца (перенос, банк, чекпоинт, смерть, A/B-выключение).
7.2 Бонус глубины — depthBonusPerFloor: 0.12, depthBonusMax: 1.6¶
- Что реализовано. Валюта и ценности банкуются с ×(1 + спусков × 0.12), потолок ×1.6. Считаются спуски, а не номер этажа — это убивает эксплойт «начать глубоко и сразу забанковать».
- ⚠ Правило, которое задаёт размер. Бонус глубины оценивает риск, и он обязан быть ниже
точки безубыточности. Безубыточность при пошаговом шансе смерти
pравнаp/(1-p). Исходные 0.25 утверждали «ты умираешь на одном этаже из пяти»; при реалистичных ~10% это делало спуск строго правильным и стирало выбор. Он должен оставаться ниже безубыточности ещё и потому, что спуск сам по себе даёт целый дополнительный этаж лута, который уже частично оплачивает риск. - Статус. ▣ Пересклонён после плейтеста (в первом тесте: ровно один безопасный выход за всю сессию, и то чтобы обойти босса). На 0.12 ещё не перемерян.
7.3 Карты улучшений — 1 из 3 за спуск¶
- Проблема. Спуску нужна была тяга, а не только выплата — и уход глубже с неизменным персонажем делает вторую половину забега строго хуже первой.
- Что реализовано. Каждый спуск предлагает по одной карте из каждой категории
(
cardCount: 3), на забег:
| Тело (выжить) | Клинок (убивать быстрее) | Жадность (вынести больше) |
|---|---|---|
| ❤ Перевязка — восстановить здоровье ✅ | 🗡 Заточка — +25% урона крита с фланга ✅ | 🔒 Глубокие карманы — +1 слот безопасного кармана ✅ |
| 🛡 Толстая шкура — +20% макс. здоровья ✅ | 💨 Быстрый шаг — −20% кулдауна рывка ⚠ | 💰 Мусорщик — +10% к бонусу глубины ✅ |
| 🩸 Кровопускание — криты с фланга лечат ⚠ | 🎯 Твёрдая рука — +20% скорости атаки ⚠ | 🧲 Широкий магнит — +40% радиуса подбора ⚠ |
✅ = полностью подключено · ⚠ = карта пишет поле, которое пока не читает ни одна система
(сознательно — см. §12).
- Рельс против «спирали смерти». Ниже healCardHpFrac: 0.40 HP слот «Тело» принудительно
становится лечением — забег не может зайти в тупик из-за того, что рандом предложил три
бесполезных сейчас вещи.
- ⚠ Баг, найденный только игрой. applyCards() переприменял каждый выбор на каждом этаже,
из-за чего Перевязка лечила бесконечно — делая её строго доминирующей и стирая убыль HP
(второй накапливающийся ресурс погружения). Мгновенные карты теперь несут once: true и
не срабатывают повторно.
- Статус. ▣ Проверено. ⚠ GDD помечает всю систему карт как вырезаемую — это самая
«рогалитная» вещь в игре, которая в остальном рогалитом не является.
7.4 Безопасный карман, ставший настоящим — loot.safeSlots: 1¶
- Проблема, найденная по ходу ревью. Безопасный карман был мёртвым контентом. Ручная
фишка «🔒 Защитить» живёт в Лут-станции, которая припаркована за
loot.inRunInventory: false— то есть была недостижима, ничто никогда не защищалось, а карта «Глубокие карманы» усиливала пустоту. - Что реализовано. Безопасный карман теперь автоматический: N самых ценных найденных предметов в сумке защищены, и выбираются они непрерывно (вычисляются, а не хранятся — пересчитываются в момент, когда ты нашёл что-то лучше). Показаны фишками 🔒 в HUD во время забега и возглавляют экран смерти как «сохранено». Собственное надетое снаряжение исключено (оно и не было под угрозой).
- Почему помогает. Смерть должна была что-то оставлять. Один защищённый предмет превращает «я потерял всё» в «зато хорошее я вынес» — и делает риск читаемым до того, как он принят.
- Статус. ▣ Проверено (мусорный нож потерян, легендарная броня забанкована; с «Глубокими карманами» выжили два предмета).
7.5 Лимит на настойки — player.potionsMax: 3¶
- Проблема. Зелья подбираются автоматически при касании и теперь переносятся между этажами, так что без лимита они копились, пока глотание не обесценивало любой бой. Это был ровно тот пункт, который G0 пометил «наблюдать».
- Что реализовано. Лимит 3. На лимите настойка остаётся лежать на земле — она всё ещё там, когда ты вернёшься раненым. (Альтернатива — снизить шанс дропа — сделала бы зелья редкими и на мелких этажах, где они проблемой не являются.)
- Статус. ▣ Проверено.
7.6 HUD показывает, что поставлено на кон¶
Два числа, которые и есть решение, теперь в углу: сумма под риском (добыча × текущий
множитель глубины) и ⬇ глубина · ×множитель, плюс фишки 🔒 безопасного кармана. Экраны
результата читаются как Погружение: N этажей · бонус глубины ×M · забанковано V, а экран
смерти возглавляет кнопка «⚔ Нырнуть снова».
7.7 Два правила, замороженные на G0, сознательно отменены¶
Помечены явно, чтобы их можно было перепроверить именно как отменённые: смерть по таймеру и закрытие последней безопасной площадки. Обоснования — в GDD погружения.
8. Экономика и лут¶
8.1 За глубину нельзя платить дважды — CUR_MULT отделён от RAR_MULT¶
- Проблема (найдена плейтестом). Количество валюты масштабировалось множителем редкости
снаряжения
RAR_MULT(1 → 5), а редкость сама зависит от глубины. То есть глубина платила за валюту один раз через таблицу лута и второй раз через бонус глубины. Итог по отчёту: один банк поднял силу снаряжения с ~1500 до ~4500. - Что реализовано. Отдельный
CUR_MULT(1 → 2) только для валюты; снаряжение сохраняет полный разброс 1→5, что и является законной наградой за глубину. Дроп легендарных чертежей падает с 3–6 до 1–2. Вместе с пересклоном глубины доход на глубине упал примерно в 4 раза. - Статус. ▣ Реализовано, ▢ ещё не перемеряно.
8.2 Лут ощущается обильным (проба 0.9)¶
| Ручка | Было → Стало |
|---|---|
fieldChestDiv |
720 → 520 (больше сундуков) |
groundLootDiv |
520 → 380 (больше предметов на земле) |
t1MaterialChance |
0.50 → 0.65 (убийства заметнее окупаются) |
consumableChance |
0.45 → 0.60 (зелья — единственное лечение) |
chestTime |
4.0 → 3.0 с (вскрытие остаётся тактом «громко и уязвимо», но короче) |
firstFloorGearBoost |
2.5× к шансу снаряжения на самом первом этаже — первые сессии надёжно дают ощутимый апгрейд |
8.3 Пересклон ввода врагов по телеметрии¶
Тест 16–19 июля показал всплески провалов ровно там, где входит новый контент. Теперь каждый этаж вводит не более одного нового врага:
| Моб | Было | Стало | Причина |
|---|---|---|---|
| Гончая (стайная) | B1F2 | B1F3 | давала всплеск провалов на 1-2 (13.8) — первое настоящее давление ближним боем |
| Огнешар | B1F3 | B1F4 | следствие |
| Скелет | B1F4 | B1F5 | следствие |
| Страж (первый, кто видит дальше игрока) | B2F1 | B2F2 | накладывался на соперников + смену карты на 2-1 (провал 18.9, отток 35%) — теперь 2-1 вводит только сам новый биом |
Единственное новое давление на B1F2 — закрывающиеся часы.
8.4 ⚠ Не исправлено — сознательно передано тебе¶
- Сток плоский. Стоимость апгрейда —
it.level * 2чертежей, без учёта редкости и глубины (game.js:6505). Каждый лишний чертёж конвертируется в скорость прогрессии один к одному. Менять доход и сток в одном заходе значило бы сделать следующий плейтест нечитаемым — поэтому сдвинут только доход. - Босс биома 1 — стена силы при ~1500 и тривиален после одного банка. Это один и тот же баг: экономика разрушает кривую сложности, и игра читается как невозможно, потом тривиально. Оба пункта относятся к отдельному проходу по TTK/экономике, а не к угадыванию ручки.
9. FTUE — 7 стадий → 3¶
- Проблема (измеренная). Прохождение обучения 75.5%. Ни один отдельный шаг не сломан — прохождение по шагам 93–98%. Потеря в 24.5% — это просто цена семи последовательных ворот. Трое ворот при той же поштучной конверсии ≈ 88%+.
- Что реализовано — три стадии в том порядке, в каком игра реально играется:
- Первые шаги — рулить и лутать. Сундук выдаёт полный стартовый комплект (свежее сохранение безоружно, поэтому бой не может быть первой стадией); один сундук в стороне учит, что «исследовать выгодно»; сесть на площадку.
- Бой — вскрыть сундук, хлопок притягивает слушателя, держать позицию (⭕ круг дерётся сам), затем подойти со спины ко второму гоблину, повёрнутому прочь, и критануть. Выдаёт Шепчущий кинжал. Каждый урок стоит на проверенной геометрии шума и зрения — слушатель находится в полосе хлопка, но вне радиуса вовлечения; цель для подкрадывания стоит дальше любого боевого шума, так что урок нельзя испортить.
- Спуск — Привратник закрывает 👑 портал спуска. Пройти рывком сквозь его замах, зайти за спину, добить только что полученным кинжалом. Учит правилу двух дверей на одном экране.
- Заметки по дизайну. Урок рывка перенесён на Привратника (решение лида): мусор умирает слишком быстро, чтобы показать замах, так что учить увороту на нём было уроком ни о чём. Стелс-стадии (Незамеченный, Услышанный) и стадия хранилища уходят — хранилище учит себя само позже, через существующие подсказки по ключу и воротам.
- Таблица на 7 стадий припаркована, а не удалена (
TUTORIAL_LEGACY) — вернуть переименованием. - Статус. ▣ Проверено.
10. UI и читаемость¶
| Изменение | Флаг | Заметка |
|---|---|---|
| Мини-карта показывает только цели — сундуки, выходы, статус закрытия; врагов нет | ui.minimapEnemies: false |
большая тактическая карта блипы сохраняет |
| Кольцо вовлечения — круг состояния мир/война | ui.engageRing: true |
синее мир / золотое прицеливание / красное война |
| Конусы в тревоге читаются «горячо» — ярче красный, выше альфа, обводка | — | «этот меня видит» с одного взгляда |
| Фишки «под риском» и безопасного кармана в HUD | — | §7.6 |
| Стрелки угроз дебютируют на 2-м этаже | prog.arrowsFromStep: 1 |
B1F1 — чистый лут-и-бой, без давления в HUD |
| Подсветка замороженного конуса | — | удалена полностью после плейтеста — линия прицела делала эту работу |
| «Рейд/Погружение снова» возглавляет экран смерти | — | лобби понижено до вторичного |
| Индикация обнаружения | — | только бинарная: ❗ захват / ? ищет / ничего |
11. Всё, что выключено или удалено¶
| Что | Состояние | Как вернуть |
|---|---|---|
| Финал со штормом (утечка HP, катаклизм) | выкл. | extraction.stormFinale: true |
| Смерть по таймеру | выкл. при погружении | dive.enabled: false |
| Плавное накопление обнаружения / «подозрение» | выброшено навсегда | combat.aggroOnly: false (весь конвейер) |
| Симметричный шлюз огня по видимости | выкл. | combat.mutualSightFire: true |
| Реген HP вне боя | обнулён | player.hpRegen |
| Зелье с укоренением | выкл. | player.potionChannelTime > 0 |
| Затраты стамины на уворот | выкл. | action.dashFree: false |
| Тап-в-точку / двойной тап-спринт / свайп-уворот | выкл. | action.enabled: false |
Вздрагивание (mobReact) |
удалено | — |
| Подсветка замороженного конуса | удалена | — |
| Враги на мини-карте | выкл. | ui.minimapEnemies: true |
| Сброс лестницы при смерти | убран ещё до пивота | — |
| FTUE на 7 стадий | припаркован как TUTORIAL_LEGACY |
переименовать таблицу |
| Лут-станция в забеге (ручной безопасный карман, сброс/осмотр) | всё ещё припаркована | loot.inRunInventory: true |
12. Известные риски и открытые вопросы¶
- ⚠ Пять эффектов карт не работают. «Кровопускание», «Быстрый шаг», «Твёрдая рука», «Широкий магнит» пишут поля игрока, которые пока никто не читает. В каждой категории есть хотя бы одна полностью рабочая карта, так что выбор никогда не бывает пустым — но игрок, взявший «Твёрдую руку», не получает ничего. Сознательно: по плану их подключают только если система карт переживёт твой вердикт.
- ⚠ Пересклон экономики не измерен. Доход на глубине упал примерно в 4 раза за один заход. Теперь он может оказаться слишком медленным.
- ⚠ Эскалация соперников через спорную цель (§5.4) — единственный путь Tier 0, ни разу не подтверждённый в игре.
- ⚠ Разгрузка HUD не сделана — план пивота требует убрать кольцо стамины и виньетку обнаружения; вместо этого новые фишки «под риском»/«безопасный карман» добавлены сверху.
- ⚠ Босс-стена и потоп из чертежей (§8.4) не решены и являются главной угрозой тому, чтобы пивот хорошо прочитался в свежем тесте.
- Баланс «бонус глубины против раннего банка» — открытый вопрос настройки. Отношение, за которым надо следить: забанкованная ценность забега с банком на 1-м этаже против полного погружения до 5-го. Если полное погружение стоит больше ~3× мелкого банка, мелкий банк — мёртвый контент. И поведенческая версия того же вопроса: берёшь ли ты вообще безопасный выход рано? В первом плейтесте ответ был один раз, и то чтобы обойти босса — именно это и вызвало пересклон.
13. Лист решений¶
Отметь по одному в строке. Всё, помеченное как вырезаемое, построено так, чтобы удаляться не задевая остального.
| № | Фича | Вырезаемо? | Оставить | Настроить | Убрать |
|---|---|---|---|---|---|
| 1 | Плавающий джойстик + кнопка рывка | нет (фундамент) | ☐ | ☐ | ☐ |
| 2 | Отмена «губки» (быстрый TTK) | флаг | ☐ | ☐ | ☐ |
| 3 | Постоянный крит с фланга + окна по развороту | флаг | ☐ | ☐ | ☐ |
| 4 | Грамматика заряда «ведение→фиксация→выстрел» | нет | ☐ | ☐ | ☐ |
| 5 | Непроходимые тела врагов | флаг | ☐ | ☐ | ☐ |
| 6 | Stealth-lite восприятие | флаг | ☐ | ☐ | ☐ |
| 7 | Радиус вовлечения + кольцо | флаг | ☐ | ☐ | ☐ |
| 8 | Мир / Война | флаг | ☐ | ☐ | ☐ |
| 9 | Нейтральность соперников + тап-пометка | флаг | ☐ | ☐ | ☐ |
| 10 | Безопасный перекрёстный огонь (отклонение от GDD) | флаг | ☐ | ☐ | ☐ |
| 11 | Соперники-оппортунисты | флаг | ☐ | ☐ | ☐ |
| 12 | Закрывающиеся эвакуации (без смерти по таймеру) | флаг | ☐ | ☐ | ☐ |
| 13 | Охраняемый портал спуска | флаг | ☐ | ☐ | ☐ |
| 14 | Трёхминутные этажи | ручка | ☐ | ☐ | ☐ |
| 15 | ПОГРУЖЕНИЕ — две двери, добыча накапливается | мастер-флаг | ☐ | ☐ | ☐ |
| 16 | Бонус глубины | ручка | ☐ | ☐ | ☐ |
| 17 | Карты улучшений (1 из 3) | да — GDD помечает как вырезаемое | ☐ | ☐ | ☐ |
| 18 | Автоматический безопасный карман | ручка (safeSlots: 0 = выкл.) |
☐ | ☐ | ☐ |
| 19 | Лимит настоек (остаются на земле) | ручка | ☐ | ☐ | ☐ |
| 20 | Обилие лута + щедрость первого этажа | ручки | ☐ | ☐ | ☐ |
| 21 | Пересклон ввода врагов | ручки | ☐ | ☐ | ☐ |
| 22 | FTUE на 3 стадии | обратная замена | ☐ | ☐ | ☐ |
| 23 | Мини-карта только с целями | флаг | ☐ | ☐ | ☐ |
Любое значение выше редактируется вживую в Developer → 🎛 Tuning и сохраняется в
localStorage. «Re-roll run» переприменяет значения спавна/плотности/раскладки; размер карты
требует перезагрузки страницы.