LifePlay-Revival/Docs/Migration/etat/REL/MAPDL1/MAPDL1-L1-CART-02.md

85 lines
6.7 KiB
Markdown
Raw Normal View History

Fiche MAPDL1-L1 (CART-02) — Niveau N2 — Modèle prévu opus medium | utilisé claude-opus-5-5 — Agent session « Medium · MAPDL1 » (pas de sous-agent) — Skills sk-protocol, lp-city, lp-lot, lp-commandlets, lp-paths
# MAPDL1-L1 : arbre de `CityMenu` et ligne de ville `City` (lecture hors éditeur, 2026-10-22)
GO de Big Boss (`local_d2580e73`). Décision de l'utilisateur, citée : « GO pour MAPDL1 avec les valeurs par défaut D7 à D14 : voie (a), commencer par L1, L2 et P1, vague 1 classée par population. »
Méthode : `Tools\uasset58.py` (`events`, `imports --paquets`, `strings --motif`, `locate`), en lecture seule et sans éditeur. Aucun jeton UE n'a été pris.
## 1. Mesuré (extraits)
```
python -I -X utf8 Tools\uasset58.py events Content\UI\CityMenu.uasset
exports 382 contigus=True noms=571 taille=459239
K2Node_ComponentBoundEvent_0 export#199 delegue=['OnTextChanged'] widget=['SearchAction']
K2Node_ComponentBoundEvent_1 export#200 delegue=['OnCheckStateChanged'] widget=['CheckBoxMoveNPC']
K2Node_ComponentBoundEvent_127 export#201 delegue=['OnClicked'] widget=['ClearButton']
K2Node_ComponentBoundEvent_2 export#202 delegue=['OnValueChanged'] widget=['RacePercent']
K2Node_ComponentBoundEvent_3 export#203 delegue=['OnClicked'] widget=['RaceButton']
K2Node_ComponentBoundEvent_31 export#204 delegue=['OnClicked'] widget=['StayButton']
K2Node_ComponentBoundEvent_34 export#205 delegue=['OnCheckStateChanged'] widget=['CheckboxRandomize']
K2Node_ComponentBoundEvent_4 export#206 delegue=['OnCheckStateChanged'] widget=['CheckBoxClassicMap']
python -I -X utf8 Tools\uasset58.py locate Content\UI\CityMenu.uasset CityScrollBox ...
== CityScrollBox : 5
@397970 export #287 CityScrollBox classe=ScrollBox +109/135
python -I -X utf8 Tools\uasset58.py events Content\UI\City.uasset
K2Node_ComponentBoundEvent_90 export#50 delegue=['OnClicked'] widget=['CityButton']
python -I -X utf8 Tools\uasset58.py imports Content\UI\City.uasset --paquets
/Game/BPs/GI /Game/BPs/StreetMap_Static /Game/Heavy/New2/Sound/ui_click /Game/Structs/City /Game/UI/CityMenu
python -I -X utf8 Tools\uasset58.py locate Content\UI\City.uasset InstalledText CityText CityButton City
== InstalledText : 5 @242508 export #95 InstalledText classe=TextBlock
== CityText : 5 @242009 export #94 CityText classe=TextBlock
== CityButton : 5 @130520 export #1 CityButton classe=Button
== City : 17 (variable de structure City, exports #98 et #99)
python -I -X utf8 Tools\uasset58.py strings Content\UI\City.uasset --min 3 --motif '(instal|download|avail|valid|exist|size)'
CallFunc_CheckIfValidProportion_Valid CheckIfValidProportion Installed InstalledText Not Installed ...
python -I -X utf8 Tools\uasset58.py strings Content\BPs\GI.uasset --min 3 --motif '(cityscroll|City_C|installed|CityMenu)'
CityMenu CityMenu_C CityScrollBox City_C ClearCityMenuWidget CreateCityMenuWidget OpenCityMenu CloseCityMenu MoveCity_Changed ...
```
## 2. Ce qui est établi
- **Liste** : `UI/CityMenu` porte un `ScrollBox` nommé **`CityScrollBox`** (export #287). Ses enfants sont des widgets **`UI/City`** (`City_C`) ; `CityMenu` les caste par `AsCity`.
- **Création de la liste** : elle est faite par le GI (`CreateCityMenuWidget`, `ClearCityMenuWidget`, `OpenCityMenu`, `CloseCityMenu`, qui sont des noms présents dans `GI.uasset`). Le corps de ces fonctions n'est pas lu ici.
- **Une ligne** (`UI/City`) contient :
- un bouton **`CityButton`** (événement `OnClicked`, export #50 ; il appelle `MoveCity` et `LoadCity`, noms présents, avec « Loading, Please Wait ... » et « Same City ») ;
- un texte **`CityText`** ;
- un texte **`InstalledText`** ;
- une variable **`City`** de la structure `/Game/Structs/City` (`DisplayName`, `StreetMapName`, `StaticMeshName`).
- **Indicateur déjà présent** : les littéraux « **Installed** » et « **Not Installed** » et l'appel `CheckIfValidProportion` figurent dans `City`. **Le jeu d'origine marquait déjà chaque ville installée ou non.** Ce qu'il calcule exactement (`CheckIfValidProportion`, couleur `TextColor`) n'est pas lu : il faudrait `LPDumpFunction -BP=City`, avec le jeton UE. **Incertain.**
- **Partie chargée** : `MoveCity(GetCityByName(Save.City))`, comparaison sans tenir compte de la casse avec `DisplayName` (`STM1-CART-02.md` M4, établi). Une ville sans correspondance retombe sur la structure par défaut, puis sur `Cities[0]` (M3).
## 3. Conséquences pour L4 (interface)
- Le sous-système C++ trouve l'instance de `CityMenu` ouverte (comme `ULPModInfoSubsystem` trouve `ModManager.ModScrollBox`), puis son `CityScrollBox`. Pour chaque enfant `City_C`, il lit par réflexion la variable `City` et son champ `DisplayName`.
- Ce qu'il fait ensuite :
- **tri** : retrait et réinsertion des enfants dans l'ordre installées, puis disponibles, puis sans pack (SPEC-03 § 3) ;
- **non choisissable** : `CityButton->SetIsEnabled(false)` ;
- **état** : `InstalledText->SetText` avec « Installed », « Download (xx MB) » ou « Not available », et une teinte ;
- **bouton Download** : un `UButton` ajouté par C++ dans la ligne (`HorizontalBox` à lire) ou, plus sûr, un clic sur `InstalledText` relayé à la fenêtre Slate de consentement.
- **Point à trancher avant L4**, avec le jeton UE, en lecture par commandlet :
- `LPDumpWidgetTree -BP=City` : panneau qui contient `InstalledText` (pour y loger un bouton) ;
- `LPDumpFunction -BP=City -Fn=Construct -Pins -Exec` : ce que l'original met dans `InstalledText`, et donc ce que notre texte doit remplacer à chaque image (même règle que `lp-city` § 3, R12-14 et R12-15 : réglage dans `OnPostActorTick`, sinon le Blueprint reprend la main).
## 4. Compte rendu
- **Résultat** : arbre utile établi :
- `CityMenu` contient `CityScrollBox`, dont chaque enfant est une ligne `City_C` ;
- une ligne contient `CityButton`, `CityText`, `InstalledText` et la variable `City` ;
- un indicateur d'origine « Installed / Not Installed » existe.
- **Mesuré** : § 1.
- **Incertitudes** :
- calcul de l'indicateur d'origine ;
- panneau parent d'`InstalledText` ;
- corps de `CreateCityMenuWidget` (ordre de remplissage, qui doit être repris à chaque ouverture).
- **Écarts** : aucun ; ni éditeur ni jeton UE.
- **Fichier** : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\REL\MAPDL1\MAPDL1-L1-CART-02.md` (A).
- **Tours** : ≈ 5 (lot L1).
- **À verser** : `lp-city` § 3 : la ligne de ville `UI/City` a déjà `InstalledText` (« Installed » / « Not Installed », `CheckIfValidProportion`) ; la liste est `CityMenu.CityScrollBox`, remplie par `GI.CreateCityMenuWidget`.
- **Suite** : les lectures `LPDumpWidgetTree -BP=City` et `LPDumpFunction -BP=City -Fn=Construct` se font au début de L4, avec le jeton UE.