Merge phase/40-clock-tempo.

This commit is contained in:
Leonid Pershin
2026-08-20 07:07:00 +03:00
17 changed files with 193 additions and 58 deletions
+12 -12
View File
@@ -12,26 +12,26 @@
## Задачи
- [ ] `GameMinutesPerRealSecond` по умолчанию 1 (опции, `appsettings.json`, `GET /api/schools`)
- [ ] `ClockSpeed.Multipliers`: `0.5, 1, 2, 5, 10`. Зеркало в `protocol.ts`. Подписи кнопок:
- [x] `GameMinutesPerRealSecond` по умолчанию 1 (опции, `appsettings.json`, `GET /api/schools`)
- [x] `ClockSpeed.Multipliers`: `0.5, 1, 2, 5, 10`. Зеркало в `protocol.ts`. Подписи кнопок:
×½ ×1 ×2 ×5 ×10. Стартовый индекс по-прежнему 1
- [ ] Воркер будит мир 20 раз в секунду на любой скорости. `GameClock.Advance`, граница лога
- [x] Воркер будит мир 20 раз в секунду на любой скорости. `GameClock.Advance`, граница лога
6:00, годовой набор, пул соискателей, погода — каждый импульс
- [ ] На индексах ×5 и ×10 ходьба, действия, решения, нужды, тепло, обучение, износ — раз в
- [x] На индексах ×5 и ×10 ходьба, действия, решения, нужды, тепло, обучение, износ — раз в
4 и раз в 2 импульса соответственно, с накопленными минутами (квант — 1 игровая минута).
На ×½ ×1 ×2 — каждый импульс, как сейчас
- [ ] Не прыгать календарём одним жирным `Tick` вместо страйда
- [ ] Комментарий меню про «минута за 12 секунд» привести к новой базе
- [ ] `docs/protocol.md` — таблица множителей. Раскладку и версию сокета не трогать
- [x] Не прыгать календарём одним жирным `Tick` вместо страйда
- [x] Комментарий меню про «минута за 12 секунд» привести к новой базе
- [x] `docs/protocol.md` — таблица множителей. Раскладку и версию сокета не трогать
## Тесты, без которых фаза не закрыта
- [ ] 20 шагов по 1/20 с на ×1 сдвигают календарь на 1 игровую минуту, не на 5
- [ ] Индексы 3 и 4 за одну реальную секунду дают 5 и 10 игровых минут
- [ ] На ×10 за 20 импульсов ходьба/нужды вызваны 10 раз, календарь — 20; накопленный аргумент
- [x] 20 шагов по 1/20 с на ×1 сдвигают календарь на 1 игровую минуту, не на 5
- [x] Индексы 3 и 4 за одну реальную секунду дают 5 и 10 игровых минут
- [x] На ×10 за 20 импульсов ходьба/нужды вызваны 10 раз, календарь — 20; накопленный аргумент
минут на тяжёлый вызов — 1
- [ ] Невалидный индекс 5 по-прежнему игнорируется
- [ ] Клиентский тест: пять кнопок ×½ ×1 ×2 ×5 ×10
- [x] Невалидный индекс 5 по-прежнему игнорируется
- [x] Клиентский тест: пять кнопок ×½ ×1 ×2 ×5 ×10
## Критерий готовности
+1 -1
View File
@@ -181,7 +181,7 @@
| Фаза | Статус | Зачем |
| --- | --- | --- |
| [40. Темп часов](40-clock-tempo.md) | 🔄 | ×1 = минута/с, кнопки ×½ ×1 ×2 ×5 ×10, страйд тяжёлых систем |
| [40. Темп часов](40-clock-tempo.md) | | ×1 = минута/с, кнопки ×½ ×1 ×2 ×5 ×10, страйд тяжёлых систем |
## Срез 9. Общение и романтический пак
+4 -4
View File
@@ -39,7 +39,7 @@ people; it does not change on a living school.
{
"maxSchools": 6,
"defaultStartDate": "2012-03-31T06:00:00Z",
"gameMinutesPerRealSecond": 5,
"gameMinutesPerRealSecond": 1,
"schoolWeekDays": 5,
"schools": [
{ "id": 1, "name": "Гимназия №14", "gameTime": "2012-03-31T07:35:00Z", "running": false, "speedIndex": 1, "modIds": ["core"], "seed": 1847291 }
@@ -753,9 +753,9 @@ Running and speed are **separate messages on purpose**. A single "set clock" mes
button to resend the other field from the client's own copy of the state, which is always at least
one tick stale — pressing play and then a speed button would pause the school again.
Speed indexes are `0 = ×½`, `1 = ×1`, `2 = ×2`, `3 = ×3`, `4 = ×4`; out-of-range values are
ignored rather than fatal. The base rate is `gameMinutesPerRealSecond` (5), so ×1 is five game
minutes per real second.
Speed indexes are `0 = ×½`, `1 = ×1`, `2 = ×2`, `3 = ×5`, `4 = ×10`; out-of-range values are
ignored rather than fatal. The base rate is `gameMinutesPerRealSecond` (1), so ×1 is one game
minute per real second.
### `0x07` SkipEmpty — 1 byte