<!-- MANAGED BY sync_project_docs.py -->

Devlog — 2026-05-25

Начало дня: документация и планирование

С утра закрыли предыдущую сессию документированием — обновили changelog и devlog за 24 мая, написали план совещания команды и чеклист ручного тестирования. Сразу же убрали из всех активных документов ссылки на Mobile/Yandex Games/ads/IAP/leaderboards: они никогда не были частью текущего плана и попали в документацию по ошибке. Актуальный бэклог теперь короткий и честный.

Диагностика ошибок в логах

Разобрались с накопленными ошибками движка:

  • Два terrain материала (terrainmaterial1, terrainmaterial2) не находятся — их source-файлы были удалены, но terrain всё ещё держит на них ссылки. Нужно убрать вручную в S&box Terrain Editor. Написана точная инструкция Docs/setup/TERRAIN_MATERIAL_CLEANUP_2026-05-25.md.
  • Ошибка sandbox.terrain_c из сцены — переназначение в Inspector.
  • Casino звук CasinoSpin.sound — файлы существуют на диске, ошибка из устаревшего compiled prefab, правок не требует.
  • Прочие ошибки (bullethole.vmat и подобные) — engine/sample контент S&box, к проекту не относится.

Единый checklist настройки в Editor

Собран один документ со всеми ручными задачами для S&box Editor: ворота локаций T2–T10, first-person руки, Dresser, держание топора, 20 автоматов казино, генератор деревьев и привязки HUD-идентичности игрока. Документ не исполнительный — рабочий список для prefab-разработчика, чтобы ни одна настройка не была упущена перед очередным runtime retest.

QA по логам

Создана система автоматического анализа логов: скрипт Tools/qa/analyze_sbox_log.py ищет теги [TREE], [CASINO], [SAVE], [GNOME] и другие, классифицирует каждую строку как PASS/WARN/FAIL, проверяет дублирующиеся события на деревьях и выводит итоговый список проблем. Сопровождается документами с правилами (LOG_QA_RULES) и инструкцией для solo QA-сессии.

Оптимизация физики

Сцена работала около 18 FPS, почти всё время кадра (~40 мс из ~54 мс) уходило в физику. Добавлена Editor-команда sl_debug_perf — выводит счётчики: rigidbody, collider, деревья, pickups, fallen logs, слот-машины. Главный кандидат по аудиту: fencebig.prefab (206 динамических rigidbody × 10 экземпляров).

Безопасное code-side изменение: стоящие деревья больше не симулируют физику до первого рубящего удара. При срубании движение сразу восстанавливается и дерево падает как раньше.

Защита рубки от двойного срабатывания

Исправлена проблема кооператива: если два игрока наносили финальный удар одновременно, дерево могло дропнуть ресурсы дважды. Теперь процесс смерти дерева и бревна обрабатывается строго один раз — первый вызов выполняет процесс, повторные молча игнорируются. Механика дропа, экономика и физика не изменились.

Обновление T10 prefabs

Prefab-разработчик обновил модели для T10 ресурсов: l10_neatlog, l10_sakura, l10_thinbark получили финальную 3D-модель. Добавлен новый T10 ресурс l10_matsutake. В сцену добавлен Post Process volume для работы цветокоррекции в рабочей зоне.

Version 0.9.0

Первый внутренний тег версии. Фиксирует состояние кода перед началом полного QA-цикла.

Статический code review

Проведён полный аудит 37 компонентов и 21 UI-файла. Найдены:

  • 6 P0 багов (null ref, race condition, сетевые ошибки)
  • 8 P1 багов (UX, minor networking)
  • 8 tech debt items, 7 network risks, 6 save/load risks, 6 performance risks

Написаны: CODE_REVIEW_2026-05-25.md с полным разбором, PROJECT_BRIEF.md — одностраничный обзор игры, NEXT.md — единый текущий план.

Трёхигровой co-op QA

Проведена сессия с тремя игроками, проанализированы логи. Ключевые находки:

  • **Overweight spam**: 1193 повторных событий MAGNET_BLOCKED за одну сессию — pickup пытался притянуться каждый кадр при полном инвентаре.
  • **Casino networking**: 0 клиентских событий broadcast RPC — клиенты не получали звуки и анимации при игре на слот-машине.
  • **StumpMarker**: 439 ошибок компонента на файл.

Составлен список Editor-задач E1–E9 для prefab-разработчика.

Исправление overweight spam и UI-ошибок

Устранены три класса проблем из co-op лога:

1. **Overweight spam**: pickup теперь ждёт 1.5 секунды между попытками при полном инвентаре. 1193 события → 1 событие на блокировку.
2. **Casino diagnostics**: добавлено логирование broadcast RPC в SlotMachineComponent — теперь ясно видно, получает ли клиент spin/win/lose.
3. **SCSS ошибки**: 7 случаев background: rgba(...) заменены на background-color: (устраняет "Unknown Image Type"); создан отсутствующий файл ZoneBlockedNotification.razor.scss (устранял "Error opening stylesheet" при каждом запуске).

Исправление перков и сохранений

Два связанных бага из code review:

**Perk reset на реконнекте**: StatsLoaded был [Sync]-полем — хост мог синхронизировать true клиенту до того, как клиент загрузит свой save-файл. Переведён в обычное локальное поле. Добавлены guards: SaveAllStats() не сохраняет пустое состояние до завершения загрузки; LoadAllStats() в try/finally_isLoading всегда сбрасывается.

Добавлены структурированные логи: [PERK] action=LOAD/SAVE, [PERK] action=RESET reason=PRESTIGE, [LEADERBOARD] теги с HasError статусом.

Атмосфера: туман и post process

Prefab-разработчик улучшил визуальную атмосферу сцены:

  • Добавлен Gradient Fog.
  • Post Process volume расширен до scene-wide coverage; добавлены Bloom, Ambient Occlusion, цветокоррекция.
  • Camera ZFar снижен с 43308 до 10000.
  • Debug boxes генераторов деревьев скрыты из viewport.
  • В LumberjackPlayer.prefab добавлен Cubemap Fog (skybox overcast_02).

Полная локализация UI (сессия 6)

Масштабный аудит и исправление локализации — все UI-файлы переведены на систему ключей:

  • **Mill.razor**: все hardcoded EN строки → #key, добавлены 15 mill.* ключей.
  • **Perks.razor**: названия и описания перков теперь через #perk.{type}.desc и #perk.{type}.node.0.{level}.desc вместо хардкодированных RU строк.
  • **CasinoWorldPanel.razor**: все RU хардкоды → GetPhrase(), 13 новых casino.* ключей.
  • **LumberjackInventory.razor**: заголовки, LOCATIONS, footer, sell hint — через #inv.* ключи.
  • **DialogPanel.razor / TutorialNPCComponent.cs**: NPCName/NPCSubtitle default с пустой строкой → корректно проваливается в dialog.npc.default.name.

Параллельно найден и исправлен **P0 баг**: вес переноса игрока не учитывал перки Constitution после загрузки сохранения. RecalculateMaxCarryWeight() вызывался до установки NodeLevels перков. Теперь вызов после блока перков. У MishK Constitution 3 теперь правильно даёт 80 кг вместо 50 кг.

Итог: **598 ключей**, паритет ru/en/fr 100%.

Исправление апгрейда мастерской (P0-7)

Апгрейд мастерской молча падал для не-host игроков. Root cause: UpgradeMill() проверял player?.Stats == null, но Stats = null на хосте для proxy-объектов клиентов. Заменено на Components.Get<LumberjackStatsComponent>(true). Добавлены логи UPGRADE_REQUEST / UPGRADE_DENIED.

Leaderboard footer теперь показывает корректные деньги и престиж из LumberjackPlayer.Local вместо backend stats (которые в dev-сборке возвращают 0). Лог перков расширен: constitutionLevel, maxCarryBefore, maxCarryAfter.