Restore Slavic save lift and redress abstract underwear on load.
Recheck of slice 7 stage A found UpgradeOlderSave removed after UpperUnderwear, so format-2 nameSetId saves never started, and golden people.json wearing abstract Underwear failed RequireKnownApparel. Bring back the lift, treat unusable items as undressed, and restore GoldenSaveTests.
This commit is contained in:
@@ -5,53 +5,58 @@
|
||||
## Срез 7. Этап A — данные и гардероб
|
||||
|
||||
- **Фазы:** 29–31
|
||||
- **Проверен на:** `d5547b7`, 2026-08-20
|
||||
- **Пути:** `src/HSchool.Content/{CountryDef,ApparelDefs,CatalogLoader}.cs`,
|
||||
- **Проверен на:** `PENDING`, 2026-08-20 — **перепроверка** после `d5547b7`
|
||||
- **Пути:** `src/HSchool.Content/{ApparelDefs,CatalogLoader}.cs`,
|
||||
`src/HSchool.People/{DressGenerator,CountryClimate,RosterJson}.cs`,
|
||||
`src/HSchool.Server/{Game/SchoolStore.cs,Api/{ModEndpoints,SchoolEndpoints}.cs,Api/PeopleModels.cs}`,
|
||||
`src/HSchool.Client/src/ui/{createSchoolDialog.ts,personCard.ts}`,
|
||||
`src/HSchool.Server/{Game/SchoolStore.cs,Game/SchoolWorker.Tick.cs,Api/{ModEndpoints,SchoolEndpoints}.cs,Api/PeopleModels.cs}`,
|
||||
`src/HSchool.Client/src/ui/{createSchoolDialog.ts,personCard.ts,personCardApparel.ts,personCardCarry.ts}`,
|
||||
`tests/HSchool.Content.Tests/{CountryDefTests,ApparelDefTests,VanillaCoreTests}.cs`,
|
||||
`tests/HSchool.People.Tests/{DressGeneratorTests,GoldenRosterTests}.cs`,
|
||||
`tests/HSchool.AppHost.Tests/{SchoolApiTests,InventoryApiTests,GoldenSaveTests,ServiceabilityTests}.cs`,
|
||||
`src/HSchool.Client/src/ui/createSchoolDialog.test.ts`
|
||||
- **Итог:** все 17 тестов из списков фаз на месте; исправлен дубликат `peopleTabOverview` в
|
||||
`strings.ts` (ломал `npm run build`); одно замечание рядом про вкладки карточки
|
||||
- **Итог:** обещания 29–31 после дрейфа (сессия, владельцы, UpperUnderwear, сплит карточки)
|
||||
в целом держатся; снятый в `660340c` подъём `nameSetId: Slavic` возвращён; золотой сейв с
|
||||
абстрактным `Underwear` снова одевается. B–C не трогался.
|
||||
|
||||
Что подтверждено:
|
||||
|
||||
- **29:** `CountryDef`/`ClimatePresetDef`; `namesets/` убран; ваниль `Russia` с двумя пресетами;
|
||||
каталог отдаёт `countries`; create принимает `countryId`, `unknown-country` на чужую страну;
|
||||
пресет от сида (`CreateSchool_WithTheSameSeed_GetsTheSameClimatePreset`); `nameSetId: Slavic`
|
||||
поднимается через `UpgradeOlderSave` (`GoldenSaveTests`, `legacy-no-native/`); формат без
|
||||
страны не стартует (`ServiceabilityTests`); диалог — страны и языки (`createSchoolDialog.test.ts`);
|
||||
золотой ростер обновлён (`GoldenRosterTests`).
|
||||
- **30:** поля `ThingDef`/`ColorDef`, слои как роли, мебель без `layers`; ванильная палитра и
|
||||
одежда в `VanillaCoreTests`; локали ru/en (`EveryVanillaLabel_ExistsInBothLocales`); учебник
|
||||
один def без `subject` на def.
|
||||
- **31:** `InventoryItem` с `def`/`color`/`condition`/`location`/`subject`; `DressGenerator`
|
||||
детерминирован (`DressGeneratorTests`, `InventoryApiTests.SameSeed_YieldsTheSameShirt`); слои
|
||||
без пересечения, платье на два слоя; пол/яркость/учебник/родители/соискатели/масса/Hauling;
|
||||
карточка отдаёт worn+carried, список — нет (`InventoryApiTests`); старый `people.json` без
|
||||
items одевается на reload (`PeopleJsonWithoutInventory_IsDressedOnReloadAndRewritten`);
|
||||
`HSchool.People`/`HSchool.Content` без ASP.NET; протокол не тронут.
|
||||
- **29:** `CountryDef`/`ClimatePresetDef`; `namesets/` нет; ваниль `Russia` с двумя пресетами;
|
||||
каталог отдаёт `countries`, не `nameSets`; create — `countryId`, `unknown-country`;
|
||||
пресет от сида (`CreateSchool_WithTheSameSeed_GetsTheSameClimatePreset`); формат 3 без
|
||||
`countryId` не стартует (`ServiceabilityTests`); диалог — страны и языки;
|
||||
золотой ростер (`GoldenRosterTests`). `UpgradeOlderSave` снова в `SchoolStore`: format 2
|
||||
`nameSetId: Slavic` поднимается как `Russia` + первый пресет в памяти, файл не
|
||||
переписывается, пока школа сама не сохранится (`GoldenSaveTests`, `legacy-no-native/`).
|
||||
- **30:** поля `ThingDef`/`ColorDef`, слои включая `UpperUnderwear`; мебель без `layers`;
|
||||
каталог редактора без футболки/учебника; ваниль и локали (`VanillaCoreTests`); учебник —
|
||||
один def без предмета на def.
|
||||
- **31:** `InventoryItem`; `DressGenerator` от `ApparelSalt`; слои без пересечения, платье,
|
||||
пол/яркость/учебник/родители/соискатели/масса/`Hauling`; карточка worn+carried, список —
|
||||
нет; пустой `people.json` одевается на reload. Протокол этапа A не тронут;
|
||||
`HSchool.People`/`Content` без ASP.NET.
|
||||
|
||||
Дописано:
|
||||
|
||||
- (нет новых тестов — списки фаз закрыты существующими)
|
||||
- `GoldenSaveTests.CurrentFormatSave_LoadsTheSamePeopleAndTime` — возвращён (снят в фазе 39)
|
||||
- `GoldenSaveTests.SaveWithoutNativeLanguage_LoadsWithoutReshuffling` — Slavic-сейв стартует, одежда дописывается
|
||||
- `DressGeneratorTests.AbstractUnderwearInASave_IsRedressedOnEnsure`
|
||||
|
||||
Исправлено:
|
||||
|
||||
- Дубликат ключа `peopleTabOverview` в `strings.ts` (ru/en): vitest не ловит TS2300/TS1117,
|
||||
`npm run build` падал; ключ перенесён, `peopleTabPortrait` рядом с остальными вкладками.
|
||||
- Повтор `using HSchool.Content` в `SchoolStore.cs` (CS0105).
|
||||
- `660340c` выкинул `NameSetId`/`UpgradeOlderSave` и сузил `CanStart` до format == 3: старые
|
||||
сейвы с `nameSetId: Slavic` не стартовали. Подъём возвращён; `CanStart` — format ≤ 3 и
|
||||
непустой `countryId`.
|
||||
- После `UpperUnderwear` золотой `people.json` носил абстрактный `Underwear`, и
|
||||
`RequireKnownApparel` не пускал школу. `NeedsDressing`/`EnsureDressed` переодевают
|
||||
неизвестный или абстрактный def тем же сидом.
|
||||
|
||||
Замечено рядом:
|
||||
|
||||
- Карточка уже с вкладками (`personCard.ts`, фаза 31 обещала один свиток — позже по
|
||||
`../../design/07-inventory/inventory.md`); портрет/SwarmUI-строки в `strings.ts` — не этап A.
|
||||
- `ResolveClimatePreset` в `SchoolWorker` при reload без сохранённого пресета берёт первый
|
||||
пресет страны (`schoolSeed: 0`, `rollIfOmitted: false`) — по дизайну для legacy; create
|
||||
кидает пресет из `GameLoopService` до spawn.
|
||||
- Карточка с вкладками — этап C (фаза 36); сплит в `personCardApparel.ts` / `personCardCarry.ts`.
|
||||
- `ResolveClimatePreset` на reload без сохранённого пресета берёт первый пресет страны.
|
||||
- POST `nameSetId` по-прежнему игнорируется (поля нет на create); пустой `countryId` на create
|
||||
берёт первую страну каталога — это create, не сейв.
|
||||
- Этап B–C в этом проходе не проверялся.
|
||||
|
||||
## Срез 7. Этап B–C — климат, жизнь одежды и правила
|
||||
|
||||
|
||||
Reference in New Issue
Block a user