# Фаза 40. Темп часов ## Зависимости - [Фаза 2](../01-shell/02-school-worker.md) - [Фаза 20](../05-ai/20-needs-actions.md) ## Зачем ×1 можно смотреть. Высокие скорости — ×5 и ×10, без лишней работы ходьбы и нужд на каждом импульсе календаря. ## Задачи - [x] `GameMinutesPerRealSecond` по умолчанию 1 (опции, `appsettings.json`, `GET /api/schools`) - [x] `ClockSpeed.Multipliers`: `0.5, 1, 2, 5, 10`. Зеркало в `protocol.ts`. Подписи кнопок: ×½ ×1 ×2 ×5 ×10. Стартовый индекс по-прежнему 1 - [x] Воркер будит мир 20 раз в секунду на любой скорости. `GameClock.Advance`, граница лога 6:00, годовой набор, пул соискателей, погода — каждый импульс - [x] На индексах ×5 и ×10 ходьба, действия, решения, нужды, тепло, обучение, износ — раз в 4 и раз в 2 импульса соответственно, с накопленными минутами (квант — 1 игровая минута). На ×½ ×1 ×2 — каждый импульс, как сейчас - [x] Не прыгать календарём одним жирным `Tick` вместо страйда - [x] Комментарий меню про «минута за 12 секунд» привести к новой базе - [x] `docs/protocol.md` — таблица множителей. Раскладку и версию сокета не трогать ## Тесты, без которых фаза не закрыта - [x] 20 шагов по 1/20 с на ×1 сдвигают календарь на 1 игровую минуту, не на 5 - [x] Индексы 3 и 4 за одну реальную секунду дают 5 и 10 игровых минут - [x] На ×10 за 20 импульсов ходьба/нужды вызваны 10 раз, календарь — 20; накопленный аргумент минут на тяжёлый вызов — 1 - [x] Невалидный индекс 5 по-прежнему игнорируется - [x] Клиентский тест: пять кнопок ×½ ×1 ×2 ×5 ×10 ## Критерий готовности - На ×1 секунда реального времени = минута в школе; ×10 не кладёт воркер, люди не телепортируются на десять минут за кадр - `dotnet test` и `npm test` / `build` проходят ## Стоп Не менять `TickRate` и потолок догона воркера. Не урезать рассылку кадров часов. Не трогать сессию и хозяина.