Skip to content

Экспериментальная сборка — полный обзор изменений

Охват: всё в ветке bza-dev-gameplay-pivot начиная с 6d92290 («Pivot docs», 22 июля 2026) — 69 коммитов, ~1 370 строк геймплейного кода, ~240 строк новых тюнинг-значений.


0. Что это такое

На одну сборку подряд легли две дизайнерские программы:

  1. Action-пивот (пробы 0.1–0.13, 6d92290..5a90b5d) — тест издателя показал, что проблема в моменте к моменту: в руках у игрока нет глаголов, бои пассивные и затянутые, награды не видны, рейд длится целую сессию. Эта программа перестроила управление, ощущение боя, восприятие врагов и правила встреч.
  2. Погружение (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 (паритет с Unity JoystickInput). Клавиатура: 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 с до выстрела (линия становится сплошной = уворачивайся сейчас), и выстрел уходит по направлению взгляда, а не в твою текущую позицию. Заряд может начаться только когда ты перед мобом — никаких «замахов в спину». Руки заняты: во время заряда моб не бьёт в ближнем бою.
  • Почему помогает. Та же грамматика «ведение → фиксация → выстрел», что и у выпада в ближнем бою, так что один урок покрывает всех врагов. Замахи Босса и Привратника удлинены (chargeDur 0.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. Известные риски и открытые вопросы

  1. ⚠ Пять эффектов карт не работают. «Кровопускание», «Быстрый шаг», «Твёрдая рука», «Широкий магнит» пишут поля игрока, которые пока никто не читает. В каждой категории есть хотя бы одна полностью рабочая карта, так что выбор никогда не бывает пустым — но игрок, взявший «Твёрдую руку», не получает ничего. Сознательно: по плану их подключают только если система карт переживёт твой вердикт.
  2. ⚠ Пересклон экономики не измерен. Доход на глубине упал примерно в 4 раза за один заход. Теперь он может оказаться слишком медленным.
  3. ⚠ Эскалация соперников через спорную цель (§5.4) — единственный путь Tier 0, ни разу не подтверждённый в игре.
  4. ⚠ Разгрузка HUD не сделана — план пивота требует убрать кольцо стамины и виньетку обнаружения; вместо этого новые фишки «под риском»/«безопасный карман» добавлены сверху.
  5. ⚠ Босс-стена и потоп из чертежей (§8.4) не решены и являются главной угрозой тому, чтобы пивот хорошо прочитался в свежем тесте.
  6. Баланс «бонус глубины против раннего банка» — открытый вопрос настройки. Отношение, за которым надо следить: забанкованная ценность забега с банком на 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» переприменяет значения спавна/плотности/раскладки; размер карты требует перезагрузки страницы.