LifePlay-Revival/Docs/Migration/etat/REL/MAPDL1/MAPDL1-L4-CART-01.md
2026-10-22 21:10:39 +02:00

66 lines
5.5 KiB
Markdown

Fiche MAPDL1-L4-CART-01 — Niveau N2 — Modèle prévu opus medium | utilisé claude-opus-5-5 — Agent session « Medium · MAPDL1 » — Skills sk-protocol, lp-city, lp-commandlets
# MAPDL1-L4 (préparation) : comment le menu décide qu'une ville est « Installed » (2026-10-22)
Lecture demandée par Big Boss pour démarrer L4 aussitôt. Commandlets en lecture seule, sous le jeton UE de P1.
## 1. Mesuré
- `LPDumpFunction -BP=City` : `=== City : 1 graphe(s) === / EventGraph (75 noeuds)`.
- `LPDumpFunction -BP=City -Fn=EventGraph -Pins -Exec` : 349 lignes, dans `etat\REL\MAPDL1\MAPDL1-L4-dump-City-EventGraph.txt`. Journal : `Saved\Logs\portage\MAPDL1_LPDumpFunction_20261022-115942.log`.
- `LPDumpFunction -BP=CityMenu -Fn=EventGraph -Pins -Exec` : 264 lignes, dans `etat\REL\MAPDL1\MAPDL1-L4-dump-CityMenu-EventGraph.txt`. Journal : `…_20261022-120130.log`.
Extraits, avec les lignes des fichiers ci-dessus :
```
CityMenu.EventGraph l. 123-132 :
K2Node_CallFunction_7 appel ModdingExtraBPLibrary::GetAllFilesFromFolder()
Files -> K2Node_VariableSet_20.SM_Data
RootFolderFullPath = 'Heavy/StreetMap'
Ext = 'uasset'
City.EventGraph l. 2-4, 45-49 : Construct -> CityText.SetText(City.DisplayName) -> Delay 0.2
City.EventGraph l. 164-181 : String = '/' + <nom tiré de City.StreetMapName> + '.uasset'
City.EventGraph l. 168-225 : ForEachLoopWithBreak sur CityMenu.SM_Data ; EndsWith(element, String, IgnoreCase) -> Count++ ;
Count == 2 -> InstalledText.SetText(…) + SetColorAndOpacity(R=0.176, G=1, B=0 : vert), Break
City.EventGraph l. 5-22, 96-104 : CityButton.OnClicked -> si InstalledText.GetText() == FormatText(…) -> CityMenu.CheckIfValidProportion -> SetLoading -> MoveCity
```
Source C++ de la liste : `Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp:153-224`.
- La fonction cherche d'abord les fichiers `*.uasset` sur le disque, sous `Content/Heavy/StreetMap` (`FindFilesRecursive`, l. 180).
- Si la liste est vide, ce qui est le cas d'un build IoStore, elle la reconstruit **depuis le registre d'assets**, `GetAssetsByPath("/Game/Heavy/StreetMap", récursif)`, l. 186-218 (lot O2b).
## 2. Ce qui est établi
- Une ville est **« Installed »** quand `SM_Data` contient **deux** chemins qui finissent par `/<Ville>.uasset` : `StreetMap/<Ville>` et `Static/<Ville>`. C'est le mécanisme d'origine, celui de « How_to_install_a_city.txt » (copier les deux paires dans `Content\Heavy\StreetMap`). Sinon le texte reste celui du widget, « Not Installed » (`L1-CART-02`).
- **Le clic est déjà bloqué** pour une ville « Not Installed » : `MoveCity` n'est appelé que si `InstalledText` vaut le texte « installé ». La décision D4 (« une ville reste indisponible tant que pas installée ») existe donc **déjà dans le Blueprint d'origine**.
- Aujourd'hui, les 277 gabarits ont leurs deux `.uasset` : **toutes les villes apparaissent « Installed »**.
- Les packs `lpm_city_*` sont sous `/<pack>/StreetMap/…`, **hors de** `/Game/Heavy/StreetMap`. `SM_Data` ne les voit pas. Une ville servie seulement par un pack n'a l'état « Installed » que parce que son gabarit existe.
## 3. Conséquence pour L4 (à rédiger en SPEC, sans code avant GO)
Le levier le plus simple est **C++, sans Blueprint** : `GetAllFilesFromFolder("Heavy/StreetMap", "uasset")`, qui ne sert que `CityMenu` pour ce dossier (à confirmer par recherche dans les autres Blueprints).
1. Il **retire** de la liste les gabarits, c'est-à-dire les villes sans pack et sans données réelles. Le critère reste à fixer en SPEC :
- liste blanche des villes pleines du jeu (CentralLondon, 00BathCC) ;
- ou repère du gabarit (maillage `Static/<Ville>` de 98 Ko, ou étiquette du registre d'assets) ;
- ou ville absente de `ResolveCityPath`.
2. Il **ajoute** `…/StreetMap/<Ville>.uasset` et `…/Static/<Ville>.uasset` pour chaque ville redirigée par un pack `lpm_city_*` monté.
Ce qui en découle :
- le menu d'origine affiche lui-même « Installed » ou « Not Installed », et bloque le clic : D4 est satisfait sans décoration ;
- il reste à décorer en C++ : le **tri** (installées, téléchargeables, autres ; enfants de `CityScrollBox`) et le **bouton Download**, ou bien le texte « Download » sur `InstalledText` relayé à la fenêtre Slate.
Attention :
- `InstalledText` est aussi réécrit par `SetLoading` (bleu) et lu au clic : notre texte « Download » ne doit pas être égal au texte « installé » ;
- le texte du `FormatText` comparé au clic n'est pas affiché par le dump (« Format (vide) »). Il faut le lire avant L4 (`uasset58.py strings` ou MCP).
## 4. Compte rendu
- **Résultat** : le calcul « Installed » est établi. Ce sont deux fichiers `<Ville>.uasset` dans la liste de `GetAllFilesFromFolder("Heavy/StreetMap")`. Le clic est bloqué pour une ville non installée. Le levier de L4 est cette fonction C++.
- **Incertitudes** :
- texte exact comparé au clic ;
- autres appelants de `GetAllFilesFromFolder` sur `Heavy/StreetMap` ;
- critère du gabarit.
- **Fichiers** : `MAPDL1-L4-CART-01.md` (A). Les deux dumps `.txt` sont dans `etat\REL\MAPDL1\`, non suivis par git (`.gitignore`, `.txt` d'`etat`).
- **À verser** : `lp-city` § 3 : l'état « Installed » du menu des villes est calculé par `GetAllFilesFromFolder("Heavy/StreetMap","uasset")` (`ModdingExtraBPLibrary.cpp:153`), avec deux `.uasset` par ville. Les packs `lpm_city_*` n'y figurent pas.
- **Suite** : SPEC de L4 après les décisions D10 et D11.