<!-- 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, добавлены 15mill.*ключей. - **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.