diff --git a/v2/CLAUDE.md b/v2/CLAUDE.md index 14cc812..2707647 100644 --- a/v2/CLAUDE.md +++ b/v2/CLAUDE.md @@ -1014,8 +1014,11 @@ перекраска манекена другой палитрой «посмотреть скин»). Время суток (трек 31): секция сверху панели — метка, слайдер 0..1439 и пресеты (8:00/12:00/18:54/22:00); перемотка дёргает `clock.set` + `lighting.update` - (свет сразу, не дожидаясь тика); панель — мир на паузе, время течёт после - закрытия. Мир стоит, пока открыта панель/вьювер (как в диалоге). Мост: + (свет сразу, не дожидаясь тика). Панель НЕ ставит мир на паузу (2026-09-12, + фидбек): время и мир живут при открытой панели — правки слайдеров видны + в живой игре; метка часов обновляется каждый тик (`refreshClockLabel`, + слайдер не трогается — не мешать тянущему), полная синхронизация слайдера + — на открытии и после перемоток. Пауза осталась только у меню/сумки. Мост: `devInfo` (каталог + метка часов), `devOpen`/`devOpenEntry(id)`/`devClose`, `devSetClock(m)`, `devStats`. FPS (2026-09-12): счётчик кадров `#fps` в правом верхнем углу (z-index diff --git a/v2/apps/game/src/devview.ts b/v2/apps/game/src/devview.ts index 336de4c..f92eb40 100644 --- a/v2/apps/game/src/devview.ts +++ b/v2/apps/game/src/devview.ts @@ -3,7 +3,8 @@ * Движок даёт ModelViewer (орбита мышью, клипы, статы) — панель только * рисует DOM. Каталог берётся из реестра объектов (registry.ts): объекты * регистрируются там же, где создаются — devview ничего не перечисляет. - * F3 (или «) — открыть/закрыть; мир стоит, пока открыта панель/вьювер. + * F3 (или «) — открыть/закрыть; панель не ставит мир на паузу — время и мир + * живут, метка часов следует за потоком времени. */ import { ModelViewer, mannequin, resolveTiles } from '@rpg/engine'; import type { MannequinPalette, ModelStats, WeatherSpec } from '@rpg/engine'; @@ -29,9 +30,10 @@ /** * Панель: DOM-список (#dev) + вьювер-оверлей (#devview). onOpenChange — - * игра ставит мир на паузу (как в диалоге). getMinutes/setMinutes — часы - * суток (слайдер и пресеты секции «Время суток»; мир на паузе, время - * течёт только после закрытия панели). + * игра показывает подсказку/обновляет HUD. getMinutes/setMinutes — часы + * суток (слайдер и пресеты секции «Время суток»; время течёт и при + * открытой панели — метка обновляется каждый тик, слайдер синхронизируется + * на открытии и после перемоток). */ export class DevPanel { private viewer: ModelViewer | null = null; @@ -74,7 +76,7 @@ }); } // Погода: слайдер тянет правку сразу (поверх базы области), сброс — - // вернуть погоду области; осадки анимируют, пока панель открыта + // вернуть погоду области; счётчики слоёв обновляет живая погода const bind = (id: string, patch: (v: number) => Partial): void => { const el = document.getElementById(id) as HTMLInputElement; el.addEventListener('input', () => { @@ -119,10 +121,17 @@ this.onOpenChange(true); } - /** Слайдер/метка из текущих часов игры (время течёт вне панели). */ + /** Слайдер/метка из текущих часов игры (полная синхронизация). */ refreshClock(): void { + (document.getElementById('dev-clock-slider') as HTMLInputElement).value = + String(this.getMinutes()); + this.refreshClockLabel(); + } + + /** Только метка времени: тик игры тянет её за часами (слайдер не трогаем — + * не мешаем тянущему его пользователю). */ + refreshClockLabel(): void { const m = this.getMinutes(); - (document.getElementById('dev-clock-slider') as HTMLInputElement).value = String(m); const h = Math.floor(m / 60); const mm = m % 60; document.getElementById('dev-clock')!.textContent = `${h}:${mm < 10 ? '0' : ''}${mm}`; diff --git a/v2/apps/game/src/main.ts b/v2/apps/game/src/main.ts index 463ccb9..ad15cfb 100644 --- a/v2/apps/game/src/main.ts +++ b/v2/apps/game/src/main.ts @@ -1069,14 +1069,10 @@ /** Один шаг логики: часы/свет → фейд → катсцена → движение/накат → цели «E». */ function tick(dt: number): void { if (menuOpen) return; // меню-пауза: мир стоит (автосейв снимается при открытии) - if (dev.open) { - // дев-панель: мир стоит, но погода анимирует — слайдеры видно в деле - elapsed += dt; - weather.update(elapsed); - return; - } - // время суток и свет идут всегда (в фейде/катсцене — тоже, как в v1) + // время суток и свет идут всегда (в фейде/катсцене — тоже, как в v1); + // дев-панель мир не ставит на паузу — правки слайдеров видны в живой игре clock.advance(dt); + if (dev.open) dev.refreshClockLabel(); // метка времени панели едет с часами elapsed += dt; lighting?.update(); if (areaAsh) ash.update(elapsed);