Merge branch 'phase/32-weather-warmth'

This commit is contained in:
Leonid Pershin
2026-08-20 04:18:49 +03:00
46 changed files with 1364 additions and 295 deletions
+15 -15
View File
@@ -11,28 +11,28 @@
## Задачи
- [ ] `ClimatePresetDef` получает рабочие числа: нормы по месяцам, разброс дня, осадки
- [ ] Школа считает улицу из пресета + сида + даты/часа; не каждый тик, а когда меняется
- [x] `ClimatePresetDef` получает рабочие числа: нормы по месяцам, разброс дня, осадки
- [x] Школа считает улицу из пресета + сида + даты/часа; не каждый тик, а когда меняется
надпись или это сдвинет тепло
- [ ] В здании теплее улицы за счёт стен, без техника ещё не комфорт (комфорт — фаза 33)
- [ ] Двор и крыльцо — улица
- [ ] Нужда `Warmth`: декей от разницы «утепление одежды vs температура места»; вне школы
- [x] В здании теплее улицы за счёт стен, без техника ещё не комфорт (комфорт — фаза 33)
- [x] Двор и крыльцо — улица
- [x] Нужда `Warmth`: декей от разницы «утепление одежды vs температура места»; вне школы
восстанавливается, как сон
- [ ] Черты теплолюбивый / холодолюбивый: поле смещения комфорта на `TraitDef`, взаимно
- [x] Черты теплолюбивый / холодолюбивый: поле смещения комфорта на `TraitDef`, взаимно
несовместимы
- [ ] Кадр часов: температура (десятые доли °C, `i16`) и осадки (`u8`). Версия протокола +1.
- [x] Кадр часов: температура (десятые доли °C, `i16`) и осадки (`u8`). Версия протокола +1.
`ProtocolCodec.cs`, `protocol.ts`, `docs/protocol.md` в одном коммите
- [ ] Клиент рисует погоду у даты; не считает её из месяца
- [ ] Пропуск пустого времени выставляет погоду утра, не вчерашнюю
- [x] Клиент рисует погоду у даты; не считает её из месяца
- [x] Пропуск пустого времени выставляет погоду утра, не вчерашнюю
## Тесты, без которых фаза не закрыта
- [ ] Тот же пресет, сид и timestamp → та же температура и осадки
- [ ] Январь холоднее июля на ванильном пресете
- [ ] Ниже нуля осадки — снег, не дождь (если пресет вообще дал осадки)
- [ ] На морозе без верхней одежды тепло падает; дома за ночь возвращается
- [ ] Кадр часов круглый трип и байтовая раскладка на обеих сторонах
- [ ] Клиент с старой версией протокола отваливается Hello, как обычно
- [x] Тот же пресет, сид и timestamp → та же температура и осадки
- [x] Январь холоднее июля на ванильном пресете
- [x] Ниже нуля осадки — снег, не дождь (если пресет вообще дал осадки)
- [x] На морозе без верхней одежды тепло падает; дома за ночь возвращается
- [x] Кадр часов круглый трип и байтовая раскладка на обеих сторонах
- [x] Клиент с старой версией протокола отваливается Hello, как обычно
## Критерий готовности
+1 -1
View File
@@ -137,7 +137,7 @@
| Фаза | Статус | Зачем |
| --- | --- | --- |
| [32. Погода и тепло](32-weather-warmth.md) | 🔄 | Пресет крутит улицу, кадр часов, нужда, две черты |
| [32. Погода и тепло](32-weather-warmth.md) | | Пресет крутит улицу, кадр часов, нужда, две черты |
| [33. Техник и шкафчики](33-lockers-technician.md) | ⬜ | Комната техника, две раздевалки, раздача шкафчиков |
32 стоит на 29; 33 — на 31 и 32.
+7 -3
View File
@@ -1,4 +1,4 @@
# Wire protocol v7
# Wire protocol v8
The client talks to the server two ways:
@@ -680,11 +680,13 @@ The first frame the client receives.
| 1 | `i64` | client clock, echoed unchanged |
| 9 | `u32` | server tick when the ping was handled |
### `0x83` Clock — 24 bytes
### `0x83` Clock — 27 bytes
Sent every tick to every connection that has a school open, and only to those.
`skipAllowed` is the server's verdict; the client must not recompute it.
`skipTargetUnixMs` is 0 when skip is refused.
Temperature is outdoor tenths of a °C (`i16`, so 50 is 5.0 °C). Precipitation is `0` none,
`1` rain, `2` snow. The client must not derive weather from the month.
| Offset | Type | Field |
| --- | --- | --- |
@@ -695,6 +697,8 @@ Sent every tick to every connection that has a school open, and only to those.
| 14 | `u8` | speed index |
| 15 | `u8` | `1` skip allowed, `0` refused |
| 16 | `i64` | skip target, milliseconds since the Unix epoch, UTC; `0` if refused |
| 24 | `i16` | outdoor temperature, tenths of a °C |
| 26 | `u8` | precipitation: `0` none, `1` rain, `2` snow |
### `0x84` SchoolGone — 5 bytes
@@ -780,7 +784,7 @@ Each person:
the oldest, because a stale clock is worthless once a newer one exists.
- The map snapshot and presence use a separate reliable queue so ticks cannot crowd them out.
## Not in v7 yet
## Not in v8 yet
Authentication, Sit orders, an event log, walk animation, and `OpenLocation` on the server —
the tree and the location panel are filtered on the client from the snapshot plus presence.