<!-- MANAGED BY sync_project_docs.py -->
Devlog — 2026-05-24
Защита обработки сломанного дерева и бревна
Перед дальнейшим развитием живой рубки укреплён существующий цикл разрушения: смертельный удар по дереву и последующее разрушение упавшего бревна теперь имеют явную защиту от повторной обработки. Это важно для будущей кооперативной проверки, где два близких удара не должны приводить к повторному бревну или второму набору ресурсов.
Поведение игрока при этом не расширялось: дерево падает, оставляет пень/бревно или ресурсы по прежним правилам, физика и экономика не менялись. Следующий шаг — отдельный runtime retest обычной рубки и повторных ударов перед любыми новыми structural или physics фазами.
Первый проход производительности физики
Performance overlay показал, что текущая просадка кадров связана прежде всего с физикой, а не с интерфейсом или отрисовкой: около 39.78 ms из примерно 54 ms кадра приходятся на Physics. Поэтому первый проход сфокусирован на объектах мира и коллайдерах.
Стоящие деревья теперь не должны тратить движение rigidbody, пока игрок не срубит их: при ломке прежнее физическое падение включается как раньше. Добавлена ручная команда sl_debug_perf, чтобы в следующем тестовом запуске увидеть количество физических тел, деревьев, дропов, fallen logs и автоматов в одной паре логов.
Проверка source assets показала особенно тяжёлый кандидат для следующей Editor-работы: большой забор содержит сотни dynamic physics parts и используется в сцене многократно. В этом проходе scene/prefab/material assets не менялись, а forced sleep для дропов не включался до проверки падения и magnet pickup в runtime.
Единый маршрут ручной настройки в Editor
Подготовлен общий checklist для ручной сборки тех элементов мира и персонажа, которые уже поддержаны логикой, но ещё требуют настройки или проверки в Editor. В него вошли проходы T2-T10, first-person руки, косметика и инструмент персонажа, игровые автоматы со звуками, посадка деревьев на рельеф, визуальный feedback рубки, мастерская гномов и подписи игроков.
Проверка исходных assets показала важный ближайший шаг: first-person renderer рук ещё нужно назначить на prefab игрока, а проходы локаций по-прежнему нужно расставить и связать с safety triggers. При этом существующие Dresser, held axe, name tag и основа казино уже доступны для ручной верификации.
В этом проходе сцены, prefab, материалы и игровой код не менялись. Следующий шаг выполняется в Editor по checklist, а runtime-проверка остаётся отдельной задачей после сохранения source assets.
Подготовка проходов к новым локациям
Подготовлена точная инструкция для ручной расстановки проходов T2-T10 в мире. Каждый вход должен получить интерактивный gate перед границей зоны и отдельный safety trigger за ним, чтобы персональное открытие доступа оставалось понятным и устойчивым в кооперативе.
Поскольку проход покупается каждым игроком отдельно, общий физический барьер нельзя просто убрать после покупки одним участником: это изменило бы мир и для тех, кто проход ещё не открыл. В первой версии безопаснее использовать читаемый gate/sign и оставить контроль доступа за ZoneTrigger.
Сцена и prefab в этом проходе не менялись. Следующий ручной шаг — разместить gates T2-T10 в Editor; проверка покупки, сохранения и co-op поведения выполняется позже отдельным runtime retest.
Первый шаг живой рубки деревьев
Удары по стоящим деревьям теперь получают короткую визуальную вспышку модели, видимую через сетевой feedback, а звук топора и число урона продолжают работать как раньше. Реакция специально сделана визуальной: она не толкает дерево, не двигает коллайдер и не меняет результат рубки.
Смерть дерева, fallen log и выдача ресурсов не перерабатывались. Физическое падение, частицы щепы и настоящие гномы-лесорубы остаются последующими этапами; перед ними нужен отдельный runtime retest этого feedback в solo и кооперативе.
План Valheim-like рубки деревьев
Подготовлен дизайн-план для более живой рубки деревьев в стиле Valheim. В этом проходе механика не менялась: деревья, дропы, топоры, гномы, сцены и prefab остались как были.
Главное решение — двигаться по фазам. Сначала безопасный feedback удара: звук, лёгкая реакция дерева, частицы и понятные логи. Только после этого стоит стабилизировать смерть дерева как пень + fallen log, затем дать игроку рубить fallen log, и лишь потом включать полноценную controlled physics-версию падающих деревьев.
Отдельно зафиксировано, что будущие настоящие гномы-лесорубы не должны рубить world trees до появления reservation/ownership: иначе в кооперативе можно получить спор за дерево, двойной дроп или непонятного владельца добычи.
Рекомендуемый следующий игровой шаг: Phase 1 — улучшить ощущение удара по дереву без изменения дропа и без нового физического падения.
Гномы v1: фоновая добыча ресурсов
Мастерская гномов теперь честно описывает текущую механику: гномы в v1 добывают WoodLog в фоне, а не генерируют деньги напрямую. Накопленная добыча остаётся персональной для владельца и при сборе добавляется сразу в inventory. В мире не появляется общий pickup, поэтому другой игрок не может забрать результат.
UI мастерской показывает ресурс, скорость в минуту, накопленное количество, количество нанятых гномов, tier мастерской, цену найма и апгрейды. Тексты обновлены на RU/EN/FR, tutorial больше не говорит про денежный passive income.
Механика осталась timer-based и совместимой со старыми сейвами. Отдельно зафиксированы будущие фазы: v2 — косметические анимированные гномы около мастерской; v3 — настоящие host-authoritative woodcutters только после дизайна tree reservation/ownership, защиты от double drops и кооп-синхронизации.
Runtime QA в этом проходе не выполнялся. Нужен отдельный retest: открыть UI, нанять гнома, дождаться накопления, собрать ресурс, проверить save/load и убедиться, что world pickup не создаётся.
Открытие проходов за деньги
Добавлена первая версия персонального открытия локаций. T1 открыт всегда, а проходы T2-T10 игрок покупает за свои деньги. Это не общий прогресс лобби: в кооперативе игрок A может открыть T2, а игрок B останется на своём текущем HighestUnlockedLocationTier, пока сам не оплатит проход.
Цены пока provisional:
| Проход | Цена |
| --- | ---: |
| T2 | 5 000$ |
| T3 | 20 000$ |
| T4 | 50 000$ |
| T5 | 120 000$ |
| T6 | 250 000$ |
| T7 | 500 000$ |
| T8 | 1 000 000$ |
| T9 | 2 000 000$ |
| T10 | 4 000 000$ |
Прогресс сохраняется в локальный file-first save и не зависит от облачных Stats. Старые сейвы без нового поля автоматически считаются открывшими T1.
Для мира добавлен code-side LocationUnlockGateComponent: при взгляде на gate он показывает prompt открытия прохода, а по E списывает деньги и отправляет system chat о покупке. Физические gate-объекты и барьеры в сцене пока не расставлялись и не менялись; это отдельная ручная настройка.
Нужен отдельный runtime retest позже: старый save, покупка T2, save/load после покупки и Host+Client проверка персональности unlock.
HUD игрока, name tags и системные сообщения
В левом верхнем углу появился компактный блок идентичности игрока: аватар Steam или fallback LJ, никнейм, деньги, текущий топор с upgrade level и Prestige Points. Деньги теперь находятся в этом блоке, а справа остаётся только компактный индикатор веса.
Name tags над игроками стали информативнее: показывают никнейм, аватар/fallback и метку Host. Локальный игрок по-прежнему не видит собственный tag, но клиенты должны видеть tag хоста с правильным именем после обновления owner-данных.
Добавлена основа системных сообщений в чат. Сейчас сообщения появляются для трёх событий:
- покупка топора;
- получение Prestige;
- крупный выигрыш в казино.
Мелкие события вроде подбора ресурсов, ударов по дереву, продажи и небольших casino wins не отправляются в системный чат, чтобы не создавать spam.
Нужен отдельный runtime retest в solo и Host + Client: проверить HUD, name tags, Host badge, avatar fallback/Steam avatar и одиночные system chat messages.
Локализация туториала и подсказок
Все игровые подсказки взаимодействия и текст диалогов с обучающим NPC теперь
переведены на три языка: **русский, английский и французский**.
Подсказки снизу экрана:
| Действие | RU | EN | FR |
| --- | --- | --- | --- |
| Рубить | [ЛКМ] Рубить | [LMB] Chop | [LMB] Couper |
| Говорить | [E] Поговорить | [E] Talk | [E] Parler |
| Лесопилка | [E] Лесопилка | [E] Sawmill | [E] Scierie |
| Казино | [E] Крутить рычаг | [E] Pull lever | [E] Tirer le levier |
Диалог NPC (9 тем): рубка, магазин топоров, продажа, лесопилка, гномы, перки,
престиж, казино, телега — все строки локализованы.
Видимые руки в first-person (code support)
В LumberjackPlayer добавлено свойство ArmsRenderer.
Если в prefab будет назначен второй SkinnedModelRenderer с arms-only Body Groups,
он будет автоматически показываться в first-person и прятаться в third-person.
**Что нужно сделать в S&box Editor (разработчик prefab):**
1. Добавить дочерний GameObject ArmsBody в prefab игрока.
2. Добавить SkinnedModelRenderer — та же модель и скелет, что у Body.
3. В Body Groups показать только группы рук (обычно группа 1+).
4. Назначить этот рендерер в поле LumberjackPlayer → ArmsRenderer.
Пока рендерер не назначен — в логе появится [PLAYER_VIEW] result=SKIPPED reason=MISSING_ARMS_RENDERER при каждом переключении режима.
Магнит ресурсов
Упавшие ресурсы теперь мягко притягиваются к игроку когда тот находится
в радиусе 100 единиц. В радиусе 40 единиц ресурс автоматически подбирается.
Работает в соло и кооперативе без двойного подбора.
B38 — Идентичность ресурсов Apple / Acorn / AncientCore
Задача B38 закрыта. Краткий итог аудита:
- **Apple** (ID=6) и **Acorn** (ID=7) уже корректно настроены: иконки
l1_apple.png/l1_acorn.png, локализация «Яблоко» / «Жёлудь», выдаются T1-деревьями. Ни одно из них не отображается как другой ресурс. - **HardWood / RareWood** — сохранены как legacy alias (отображаются как Шишка / Жёлудь) — без изменений.
- **AncientCore** переведён из статуса NEEDS_DESIGN_DECISION в **deferred**: существует в enum для save-совместимости, корректно отображается как «Древнее ядро» при наличии в инвентаре, не выдаётся через ранние деревья и sawmill. Нужен art-ассет (иконка).
Найденные и исправленные проблемы:
1. В трёх узлах перков (Удача L4, Удача-дерево, Красноречие-монополист) описания использовали сырое имя AncientCore вместо «Древнее ядро» — исправлено в RU/EN/FR.
2. Туториал лесопилки (tutorial.mill.1) ссылался на удалённый рецепт «Смола → Древнее ядро (1500$)» с устаревшей ценой 9$ — заменён на реальный рецепт «Кора (10$) → Шишка (65$)».
UI pass 2 — Perks и Prestige
**Perks:** правая колонка была полным дублём центральной — убрана. Список бонусов по уровням теперь прямо в центральной панели под карточкой улучшения. Размер узлов уменьшен с 100px до 64px — цепочка перестала вылезать за экран. Все английские строки заменены ключами локализации.
**Prestige:** исправлена ошибка, которая могла ввести игрока в заблуждение: панель показывала «Прогресс лесопилки» в секции потерь — но Mill при престиже **не сбрасывается**. Теперь лесопилка в секции «ты сохранишь». Зато топор **сбрасывается** (до T1) — добавлена соответствующая карточка в «потеряешь». Убрана карточка «Постоянные апгрейды» (такой механики нет в игре). Кнопка престижа при недостатке денег теперь визуально dimmed. Блок «Why Prestige?» удалён — дублировал описание в верхней части.
Добавлены ключи локализации во все три языка (RU/EN/FR): perks.subtitle, perks.available, perks.progress, perks.cost, perks.level_bonuses, prestige.keep.sawmill, prestige.lose.axe, prestige.requirement, prestige.ready, prestige.not_enough. Удалены неточные ключи prestige.keep.perm и prestige.lose.mill.
Сохранение: файл-первичный
Игровой прогресс теперь загружается из локального файла (lumberjack_save.lsv)
как первичного источника. Облачные Stats используются как резерв только если
файл не найден. Сохранение по-прежнему пишет в оба места одновременно.
Stats: только аналитика
Sandbox.Services.Stats полностью выведен из контура сохранения прогрессии.
SaveAllStats() теперь пишет только в локальный файл. Мёртвые delta-методыSaveResources(), SaveGnomes(), SaveProgression(), SavePerks(), SavePrestige()
удалены из компонентов — они обновляли Stats прогрессионными данными и
стали бесполезны после переключения на file-first стратегию.
Облачный legacy-fallback при загрузке сохранён: LoadAllStats() по-прежнему читает
Stats для игроков без локального файла (только один раз, при первом старте).
Добавлены аналитические хуки на ключевых событиях:
| Событие | Ключ |
| --- | --- |
| Дерево срублено | trees_chopped (было) |
| Продажа ресурсов | total_money_earned |
| Прокрутка казино | casino_spins |
| Выигрыш в казино | casino_wins |
| Покупка топора | axes_purchased |
| Престиж | total_prestiges |
Все аналитические записи логируются в формате [ANALYTICS] action=UPDATE key=... value=... result=OK.
Логи [SAVE] теперь содержат source=local. Логи [LOAD] в legacy-ветке используют source=cloud_legacy_fallback.
Идентичность игрока: HUD, теги, системный чат
В левом верхнем углу теперь постоянная карточка игрока: аватар из Steam (или буквы LJ если нет), никнейм, деньги, текущий топор с уровнем апгрейда и Prestige Points. Это не XP и не отдельный player level — только уже существующие данные прогрессии.
Над другими игроками в кооперативе отображаются теги с никнеймом, аватаром и меткой HOST. Свой собственный тег скрывается — он только мешал бы обзору. Исправлена ошибка, при которой никнейм хоста на первом кадре мог показываться пустым.
Системный чат используется для трёх значимых событий:
- покупка нового топора;
- получение Prestige;
- крупный выигрыш в казино (net ≥ ставка×3 или net ≥ 10 000$).
Подбор ресурсов, удары по деревьям, продажи и мелкие выигрыши в чат не попадают.
Персональные проходы в локации
Добавлена система открытия проходов. Прогресс строго персональный: если хост прошёл T5, новый игрок в его сессии всё равно начинает с T1 и открывает переходы сам за деньги. T1 доступен бесплатно.
В editor ещё нужно расставить физические ворота и настроить компонент прохода. Код уже умеет показывать prompt, сохранять прогресс и отправлять системное сообщение при успешной покупке.
Пока global/shared unlock для всей команды сразу не реализован — это тема для отдельного обсуждения.
Гномы v1: честная ресурсная мастерская
Уточнена механика гномов. Гномы — фоновые добытчики WoodLog: ресурсы накапливаются по таймеру и при нажатии «Собрать» уходят напрямую в инвентарь. Никаких мировых дропов нет, поэтому другие игроки не могут украсть накопленное.
UI мастерской переписан: теперь честно показывает ресурс, скорость накопления, запас и цены.
Анимированных гномов-дровосеков пока нет — для этого нужна отдельная система резервирования деревьев.
Рубка деревьев: визуальный фидбек и план развития
Создан поэтапный план развития рубки в сторону Valheim-like ощущения. Первая фаза уже реализована: при каждом принятом ударе дерево кратко моргает цветом. Движения дерева, изменения физики и дропов нет — только визуальная реакция.
Дальше: пень и упавшее бревно как отдельная стадия добычи, физическое падение ствола, интеграция с гномами. Каждая фаза разрабатывается и тестируется отдельно.