Commit Graph

9 Commits

Author SHA1 Message Date
z.kirill
da670af6dc Экран отряда: подсказка не закрывает статы, имена не режутся
Подсказка вставала НИЖЕ курсора и ложилась ровно на строки
характеристик - те самые, которые объясняет: игрок наводил на броню,
чтобы понять, откуда 28%, и подсказка закрывала строку ARMOR. Теперь
она встаёт выше курсора, там пусто.

Ячейка схрона была 52 пикселя: в неё не влезало даже слово BATTERY, и
половина имён обрезалась на середине. Шесть колонок вместо восьми -
читаемость важнее двух лишних ячеек, прокрутка и так есть.

Сумка вне вылазки честно подписана RAID ONLY: она принадлежит забегу и
очищается при сборке этажа, а молчащий отказ читается как поломка.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 05:27:22 +03:00
z.kirill
53ea43f2a4 Пистолет не пропадает, эвакуация откуда угодно, кнопки в HUD (M36)
БАГ С ПИСТОЛЕТОМ - на самом деле ДВА бага.

Первый: экран отряда правит ЖИВОЙ МИР, а вылазка собирает бойцов заново
из профиля (NewRun пересоздаёт ecs::World и раздаёт снаряжение через
ApplyProfileLoadout). Всё, переложенное в меню, стиралось на старте, а
вещь, вынутая из схрона, исчезала вместе с миром - схрон её уже отдал.
Теперь всякая правка снаряжения пишется в профиль сразу.

Второй, рядом: перетаскивание мышью НЕ РАБОТАЛО ВООБЩЕ. Флаг dropOk
нигде не выставлялся в true - только сбрасывался, - и сброс молча
отменялся. Единственным рабочим способом переодеться оставался ENTER.
Теперь флаг считается каждый кадр, и ячейка честно красится в "нельзя".

Заодно: вне забега сумка не принимает вещей. Она принадлежит вылазке и
очищается при сборке этажа; вещь, положенная в неё из меню, исчезла бы
так же молча.

Проверка ловит именно цепочку "поменял в меню -> начал вылазку -> вышел
с этим": сам обмен работал и раньше, пропадал он на старте.

  сборы: в профиле после обмена PISTOL, на этаже PISTOL

ТВАРИ НЕ ВОСКРЕСАЮТ. Убитая в этой вылазке убита насовсем: с возвратом
любая расчищенная комната через полминуты снова была полна, и "пробиться
и уйти" не отличалось от "молотить бесконечную очередь". Исключение одно
- аура плакальщика, это его роль.

ЭВАКУАЦИЯ С ЛЮБОГО ЭТАЖА И ИЗ ЛЮБОЙ ТОЧКИ. Раньше уйти можно было только
стоя на кольце: отряд, решивший не рисковать, всё равно шёл через этаж и
умирал ровно там, где игрок уже принял решение. Чекпоинты теперь значат
только то, чем должны быть: откуда можно НАЧАТЬ следующую вылазку.

ОТЗЫВЧИВОСТЬ СТРОЯ. Отряд ходил 1.75 при курсоре 3.3 - он всегда
отставал, и управление ощущалось как "тяну за верёвку". Стало 2.6,
поводок короче (2.5 против 3.0), доворот строя вдвое резче.

Ориентация строя теперь ПОВОРАЧИВАЕТСЯ, а не щёлкает: раньше слоты клина
перепрыгивали через весь отряд на каждом повороте, и бойцы бросали дорогу
ради перестроения. В тесноте доворот почти мгновенный - там строй и так
колонна, а колонна, смотрящая в прошлую сторону, упирается в стену.

Автопилот поймал, что первая версия правок сделала хуже: при быстром
наборе натяжения (5.2) отряд уходил в вечный спринт, а спринт растягивает
строй и выключает огонь. Порог спринта поднят до 0.95, набор до 3.4 -
приёмка 11.4 держится (0.13 с при пороге 0.30).

КНОПКИ В HUD. Слева внизу четыре: SQUAD, TREE, WORK, MENU. Экраны
открывались только клавишами, о которых игра нигде не говорила, - без
кнопки мастерская и дерево не открываются никогда.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 05:24:10 +03:00
z.kirill
f7ce189352 Лут перестал быть мусором; 19 новых вещей (M35)
ЧТО ДЕЛАЛО ЛУТ МУСОРОМ. Три вещи, и все три чинятся в броске:

1. Оружие могло выкатиться БЕЗ ЕДИНОГО боевого аффикса. Редкость обещала
   силу, а рулон целиком уходил в снабжение - и "реликт" оказывался хуже
   обычного карабина. Теперь первым всегда идёт ключевой тег вида: у
   оружия боевой, у брони защитный. Замер: 935 небанальных стволов, ноль
   без боевых аффиксов.

2. Тир брался равномерно до потолка глубины: на восьмидесятом этаже
   половина аффиксов была первого-второго тира, то есть глубина меняла
   число строк в описании, а не их силу. Теперь из двух бросков берётся
   больший - средний тир на дне поднялся с 5.0 до 6.5.

3. Все находки одного этажа имели один бюджет и различались только
   рулонами. Теперь уровень предмета гуляет -2..+3 от глубины: плюс три
   сверху дают находку, опережающую глубину, а это лучшая причина
   спускаться.

КОНТЕНТ. 19 новых предметов: шесть стволов (гвоздомёт, пулемёт, плазма,
рельса, огнемёт, кислота), четыре клинка (стилет с парированием 0.52,
молот на 430 урона и парированием 0.02, цепной, крио), четыре брони и
пять карманных. У каждой вещи свой минус, ни одна не доминирует старые;
клинки уложены в одну ось "вес против парирования".

ИНСТРУМЕНТЫ СЧИТАЛИ ТРЕТЬ ИГРЫ. Список стволов в tools.cpp был
захардкожен шестью значениями: --tool weapons и --tool ttk молчали про
новое оружие ровно так же, как про новых тварей. Теперь там весь арсенал.

Каталог проекта пополнен всеми новыми вещами по тирам и глубинам (3..31),
чтобы они реально падали, а не лежали в перечислении.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 19:47:13 +03:00
z.kirill
f5240111d5 Семь новых тварей: акты II-VI перестали быть пустыми (M34)
Каталог кончался громилой на седьмом этаже: глубже бюджет опасности
выбирался теми же пятью видами, то есть спуск переставал показывать новое
ровно там, где обязан был начать.

CINDER (D9) горит сама - дробовик против неё бесполезен, первый повод
носить второй ствол. STINGER (D21) не убивает, а не даёт стоять. SWARM
(D36) толпа в одном теле, сектор 160 градусов - вбок не обойти, берётся
площадью. HUSK (D36) стена: 0.70 по кинетике, вскрывается только
кислотой. SLEEPER (D44) с радиусом агро 3.4 - мимо неё МОЖНО пройти, а
разбуженная бьёт кругом на 62 по всем, кто шёл кучей. WAILER (D53)
меняет порядок целей: пока жив, павшие рядом встают вшестеро быстрее.
VOIDLING (D73) ровные 0.45 по шести стихиям - верного ствола нет, берётся
срезанием сопротивлений.

Аура воскрешения у плакальщика РАБОТАЕТ, а не описана: список поднимающих
собирается раз в шаг, берётся наибольший множитель, а не сумма. В
песочнице приёмки список всегда пуст.

Ни одного множителя от глубины, ни одного иммунитета, ни одного числа
вне EnemyDefOf.

ИНСТРУМЕНТЫ ЗНАЛИ ПОЛОВИНУ ИГРЫ. Список KINDS в tools.cpp был захардкожен
пятью видами и не содержал даже личинки: --tool enemies и --tool ttk
молчали про остальных. Теперь там весь бестиарий, тринадцать видов.

Личинка из коридора стихий исключена намеренно и с пометкой "учебная":
она населяет первые этажи и умирает от чего угодно - в этом её работа.
Требовать от неё разброса значило бы требовать знания стихий на первом
этаже.

Проверено: --descend 80 собирает все глубины, --tool ttk в коридоре,
--accept PASS.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 19:41:49 +03:00
z.kirill
3ebd1f96fc Дерево улучшений вместо четырёх кнопок (M32)
Четыре строки покупок (патроны, переноска, обзор, живучесть) удалены
целиком. Выбора в них не было: купить в итоге можно было всё, порядок ни
на что не влиял, и через две вылазки экран превращался в кнопку
"продолжить".

Дерево: пять ветвей по восемь узлов, у каждого пять уровней. Ветви - это
пять способов закрыть разрыв из закона масштаба: стволы, клинки, стихии,
снабжение, отряд. Ветвь открывается цепочкой - узел доступен, когда взят
предыдущий в этой же ветви. Свободная сетка читалась бы как список;
цепочка читается как путь.

Ни один узел не заводит нового канала влияния: каждый кладёт своё число
туда, куда уже кладут снаряжение и аффиксы. Дерево будет расти, и первый
же "особенный" узел со своей веткой в коде превратил бы SyncLoadout в
свалку.

ЭКОНОМИКА. --tool economy поймал, что первая версия дерева стоит 9%
одного прохода 1..100: опыт растёт с глубиной квадратично, а дерево с
фиксированными ценами выкупается целиком за половину глубокого прохода, и
выбор кончается к сороковому этажу навсегда.

Введено общее удорожание: каждая вложенная точка поднимает цену всех
следующих (цена = база · 1.5^уровень · (1 + 0.15 · вложено)). Полное
дерево стоит 34 млн против 41 млн, заложенных в дизайне, то есть около
шести с половиной полных проходов.

Старые покупки из профиля читаются, но не применяются: потраченный на них
опыт возвращается в банк. Молча съесть чужие двадцать часов нельзя.

Проверка меряет ПРОВОДКУ по всем пяти ветвям, а не таблицу узлов:

  дерево: куплено уровней 45, закрытый узел закрыт
          урон ствола 12.0 -> 14.4, здоровье 100 -> 150, скорость 1.06 -> 1.22
          парирование 0.34 -> 0.49, свет 420 -> 620

Попутно: в проекте hollow бегуны и хваты уехали с первых этажей глубже -
там одиночка с ножом гиб на первом же этаже по той же причине, по которой
это было в основном проекте.

Формат профиля 7: строки tree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 19:24:50 +03:00
z.kirill
e3294cffd4 Личинки, парирование и инструмент --wall (M30)
--WALL. Новый прогон отвечает на вопрос, появившийся вместе с чекпоинтами
через пятьдесят этажей: растёт ли достижимая глубина от вылазки к вылазке.
Отряд из одного, трёх и пяти, одетый по глубине, ставится в скопление
тварей и живёт полторы минуты без управления. Первая стена: одиночка D7,
трое D30, пятеро D30 - петля работает.

И он же нашёл настоящую ошибку: PlaceSquad воскрешал ВСЕ пять слотов, в
том числе незанятые. Строка писалась, когда отряд всегда был впятером;
после появления ростера одиночка выходил на этаж с четырьмя невидимыми
телохранителями. Из-за них прежний замер "одиночка выжил на первом этаже,
100 -> 41" был боем впятером.

ЛИЧИНКИ. С исправленным замером выяснилось, что одиночка с ножом
проигрывает двум бредущим: 210 здоровья против ножа это девять секунд
работы под ответным уроном. Первые этажи населены личинками (55 здоровья,
7 урона, медленные), бредущий уехал на третий этаж, бегун на четвёртый.
Новый ВИД, а не ослабленный бредущий с множителем: глубина в этой игре
меняет, кто выходит, а не числа у одного и того же.

ПАРИРОВАНИЕ. Отдельная характеристика клинка, и чем оружие легче, тем она
выше: нож 34%, сабля 20%, тесак 8%. Не выведена из веса намеренно - её
двигает аффикс PARRY, и лёгкий тесак обязан быть возможен как находка.

Отбить можно, только если удары СОПРИКОСНУЛИСЬ: боец сам должен быть в
замахе или в ударе. Иначе клинок стал бы щитом, работающим, пока стоишь.

Удавшийся отбив снимает урон, бьёт тварь ударом бойца целиком и запускает
повторную атаку с начала фазы, НЕ сбрасывая откат. Последнее и есть суть
размена: сбрасывай отбив откат, выгоднее было бы подставляться под удары.

Плевок отбивается тоже: летит назад и несёт урон бойца, а не твари. Это
его удар, просто по летящей цели.

Проверка меряет размен целиком, включая обратную половину правила:
"стоя столбом не отбивает". Без неё условие про соприкосновение
существовало бы только в комментарии.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 05:04:35 +03:00
z.kirill
ef103050b1 Правки по игре: начало, ставка, наёмники (M29)
Семь изменений по итогам игры вживую.

НАЧАЛО. Первый этаж встречал одинокого оперативника с ножом тремя тварями,
из которых одна быстрая: бюджет 3.0 и бегуны с первого этажа. Стало 2.2
(ровно два бредущих), бегуны с четвёртого. Света прибавлено: обзор
начинается с 1.30 вместо 1.0, у этажа появилась своя яркость пройденного
(0.42 наверху против 0.13 на дне). Наверху ещё работает освещение, и
хоррор первого этажа в том, что игрок один, а не в том, что не видно
стен. Темнота это инструмент глубины, и тратить её на первый этаж значит
не иметь запаса дальше.

СТАВКА. Опыт платится за убийства и сразу: выносить надо ВЕЩИ. Вайп
больше не отнимает всё - доезжает около половины добычи, и чем вещь реже,
тем охотнее теряется. Прежнее "вайп не возвращает ничего" делало
единственным разумным поведением уход наверх при первой царапине.

ВЫХОД. Аномалия возврата переехала из точки входа к спуску: развилка
"вниз или наверх" теперь там же, где этаж кончился. Обратный путь через
растревоженный этаж ничего не решал - это был ещё раз тот же этаж.

ЧЕКПОИНТЫ через 50 этажей вместо пяти: забег это долгий спуск, а не
перебежка между сохранениями.

НАЁМНИКИ. Кнопка "нанять за опыт" убрана, оперативники находятся в
капсулах на этажах: в среднем раз в сотню этажей и не чаще раза в
двадцать. У каждого свои три прибавки из одного бюджета - разница в
характере, а не в ранге. Покупка была скучной ровно в том смысле, в каком
скучна любая кнопка "стать сильнее": ничего не рассказывает и никуда не
зовёт.

ЗАМЕРЫ. Вайп на сотне повторов: доезжает 52% (обычное 69%, реликты 25%).
Первая версия проверки считала одну сумку и выдала "обычного доехало
112%" - спасение забирает ещё и надетое. Опыт: банк 558 -> 578 за
убийство без эвакуации. Капсула поднимает отряд до двух и даёт наёмнику
его числа.

Формат профиля 6: строки merc и rescued.

Не сделано и обсуждается: ростер сверх пятерых, задания для свободных,
пассивные бонусы от сидящих на базе.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-16 04:09:26 +03:00
z.kirill
0fb6e31c2b Свет как расходник: заряд тратится за путь, а не за время (M23)
Второй ресурс вылазки после патронов. Фонарь садится, погас — обзор падает
до 35%, а твари замечают отряд в 1.35 раза дальше: отряд не слепнет, он
меняется с тварями местами. Батарея встаёт сама, как бинт.

Главное решение — расход за ПРОЙДЕННЫЙ ПУТЬ, а не за время. Первая версия
считала по секундам, то есть была таймером, которого в игре нет по прямому
требованию к жанру: садящийся сам собой фонарь торопил бы игрока ровно как
секундомер, только без циферблата, и думать над этажом стало бы дорого.
За расстояние получается тот же размен, что и с весом, но с другой стороны:
вес делает дорогим «унести всё», свет — «обшарить всё».

Заряд общий на отряд и едет вниз вместе с ним: обновляйся он на этаже, это
был бы ресурс этажа, а не вылазки, и никуда бы не гнал. Чем глубже, тем
дороже шаг, а этажи внизу длиннее — глубина жмёт на свет дважды.

Проверка в --descend меряет правило целиком, и первая её строка не про
баланс, а про жанр: заряд на стоянке обязан стоять. Сам измеритель тоже
был неправ — делил потраченное на смещение отряда, а не на пройденный
путь, и показывал 1.55 за тайл при 1.10 в каталоге.

  свет: стоянка 0.2, ход 1.10 за тайл при 1.10 в каталоге
        глубина 8: заряда на 383 тайла, это 4.0 прямых пути до спуска
        обзор 1.00 -> 0.35 в темноте, батарея встала сама

Хватает ли заряда на этаж считается в этажах и по средней длине забега:
путь до спуска скачет вдвое от сида, и порог по одному этажу ловил бы
удачу, а не баланс.

--accept PASS без изменений: в песочнице света бесконечно, как и патронов.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 22:12:05 +03:00
z.kirill
f637a07d72 Содержимое двух проектов: DESCENT и HOLLOW
Игра стала проектом движка, и её содержимое переехало из assets/ в projects/.

  projects/descent  сама игра: восемь комнат, каталог из 28 сущностей,
                    изометрия, кривая спуска на сто этажей
  projects/hollow   второй проект: вид сверху, четыре комнаты, свой каталог,
                    короткая и злая кривая

Второй проект существует не для примера. Движок с одним проектом ничем не
отличается от игры с красиво названными каталогами, и проверить, что зашитых
знаний про DESCENT в движке не осталось, можно только вторым проектом
(docs/18-engine.md).

Он же сразу окупился: --check нашёл в комнате maw глухую камеру посередине —
ту же ошибку, что когда-то в storage. На сетке она выглядит нормально, но
точка спавна внутри недостижима, и этаж тихо становится легче.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 21:06:28 +03:00