Fiche MAPDL1-E1 — Niveau N3 — Modèle prévu sonnet (agent lp-impl ; escalade lp-impl-max) | utilisé claude-sonnet-5-5 — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat (préchargés) ; lp-city (invoqué en fin de travail) ; lp-lot de la fiche non chargé # MAPDL1-E1-IMPL : états des villes et menu, C1 à C5 de SPEC-05 v3, en C++ (2026-10-22) Hors gabarit : le gabarit IMPL (sections 1 à 6) est suivi dans l'ordre. Les éléments que la fiche § 4 ajoute (MD5, choix, sorties des contrôles § 3, compte rendu) sont dans les sections 1 à 5 et dans `## Constats`. Déroulé : décision de l'utilisateur citée par la fiche (SPEC-05 v3 approuvée). Hors moteur : aucun build, commandlet, éditeur, commit, rien sous `Mods\`, aucun Blueprint. Pendant la lecture des références, la session MAPDL1 a ordonné de ne rien écrire dans l'arbre (cuisson de la copie en cours), puis a donné le feu vert. Établi : rien n'avait été écrit avant cet ordre (`git status --short` des fichiers du § 1 vide au 15:55, `ls` : fichiers neufs absents) ; le dossier `E1-prepa\` n'a pas été utilisé ; les écritures de l'arbre ont toutes eu lieu après le feu vert. ## 1. Fichiers modifiés (chemins, lignes, MD5 avant / après) MD5 « avant » = manifeste de l'instantané du 15:56 (`Get-FileHash -Algorithm MD5`). « Après » relevé à la fin. | Fichier (copie `D:\Game\LifePlay-master 5.8`) | État | Lignes | MD5 avant | MD5 après | |---|---|---|---|---| | `Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h` | M | +5 (l. 52-56, hors de la classe) | 5933990B42C62A02AC59B2A18342E69A | 01132482CCDB59F3C3DE3256F3EE905F | | `Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp` | M | +19 −2 (l. 31-38 filtre, l. 166-167 `ExtRecu`, l. 235-240 appel) | 1F93601C71D126F173FE30636AEC0660 | BFADF97CDC90FE168D22FDEDFE2856D0 | | `Source/LifePlay/LifePlay.Build.cs` | M | +4 (l. 43-46) | BC37B92F3496B2A3E2BB9B3BBCD74B40 | 29A02ED098581BC186E679A1C461ABE8 | | `Config/DefaultGame.ini` | M | +1 (l. 75, section `[/Script/UnrealEd.ProjectPackagingSettings]`, après la l. 74) | 8D7F4BDF45E4F36620CCFE043B380C66 | FBB022145B5C1AC7DB22A13C06F1913A | | `Source/LifePlay/LPCityMapsSubsystem.h` | A | 160 | absent | 8D48BB187947025902FF1EC266C94256 | | `Source/LifePlay/LPCityMapsSubsystem.cpp` | A | 842 | absent | 79C7BBAF4FD72DA869A7AD0849D922F9 | | `Content/Data/LPCityMaps.json` | A | 15 | absent | 308B46C40A43BC4180B66E46A07018DE | | `Tools/IndexCartes.ps1` | A (hors git, `.gitignore:91 /Tools/`) | 194 | absent | 30D9DFADB328AA71CCCE4610DEE6EDBF | Fichiers de ville de STM1 non commités (`LPCityWaterSubsystem.*`, `LPCityWaterMask.h`, `LPCityNamesSubsystem.*`, `LPCityHouses.h`, `LPCityLandmarks.h`, `LPAssetRegistryHelpers.*`) : 9 empreintes relevées avant et après, **identiques** (sortie collée dans `## Constats`). Diff résumé : - **ModdingExtra** : alias `FModdingExtraFileListFilter` et `MODDINGEXTRA_API void ModdingExtraSetFileListFilter(...)` (.h:55-56) ; variable `static FModdingExtraFileListFilter GLPFileListFilter` et définition (.cpp:33-38) ; copie `ExtRecu` de `Ext` avant sa transformation en `*.uasset` (.cpp:167) ; appel `GLPFileListFilter(RootFolderFullPath, ExtRecu, Files)` juste avant `return true;` (.cpp:236-239). Le plugin ne dépend toujours pas du jeu. - **Build.cs** : `"ModdingExtra"` et `"Json"` en dépendances privées, avec le commentaire « Lot MAPDL1 (SPEC-05) ». - **DefaultGame.ini** : `+DirectoriesToAlwaysStageAsUFS=(Path="Data")`, pour livrer `Content/Data/LPCityMaps.json` dans le pak. - **`ULPCityMapsSubsystem`** (C1 à C4) : index (Saved puis Content/Data), état `Installed` / `Downloadable` / `Unavailable` mis en cache, filtre de la liste `Heavy/StreetMap`, ticker de 0 s pour le menu (tri stable en trois groupes, textes, couleurs, bouton grisé, relais de clic `ULPCityRowClick`), bandeau de 10 s sur `OnCityMapResolved`. - **`LPCityMaps.json`** : format 2, `base`, `licences` (`osm` et `lifeplay_ancienne`, titre = texte de `MAPDL1-SPEC-05-v2.md` § 4, **identique** au caractère près, comparaison sensible à la casse : 333 / 333 caractères, `True`), `villes: []`. UTF-8 sans BOM, LF. - **`IndexCartes.ps1`** (C5) : voir § 2 pour les choix ; ASCII, LF, 0 erreur de syntaxe. ## 2. Écarts à la SPEC (obligatoire) et choix là où la fiche laisse une latitude **Écart** : - E-1. Le ticker du menu est un `FTSTicker` de 0 s, comme la fiche § 2.3 le prescrit. La SPEC v1 (C3) et `lp-city` § 3 (R12-14) disent `FWorldDelegates::OnWorldPostActorTick`. Estimé (non lu dans le moteur) : le ticker du cœur passe avant les acteurs ; si le Blueprint réécrit `InstalledText` après notre passage dans la même image, une image peut montrer le texte d'origine. Suivi : la fiche. Repli si l'essai en jeu (E4) montre un clignotement : poser le même corps dans `OnWorldPostActorTick` (modèle : `LPCityWaterSubsystem`). Non mesuré. **Choix** (latitude, tous dans les fichiers de § 1) : - C-1. La recherche de `CityScrollBox` par `TObjectIterator` n'a pas lieu à chaque image : toutes les 0,1 s sans liste connue, toutes les 0,5 s avec une liste connue (pour détecter une instance plus récente). La liste connue est revalidée à chaque image (mêmes conditions que la fiche : nom `CityScrollBox`, objet extérieur de classe `CityMenu_C`, `IsVisible()`, `GetCachedWidget().IsValid()`, plus même instance de jeu). Raison : le parcours de tous les `UScrollBox` à chaque image tournerait toute la partie, menu fermé. - C-2. Plusieurs `CityMenu_C` vivants : celui qui est au viewport (`IsInViewport()`) l'emporte, puis la liste déjà suivie. - C-3. Liens non HTTPS écartés à la lecture de l'index (SPEC v3 § 2, « HTTPS seulement ») : « au moins une URL » de la fiche s'entend donc « au moins une URL HTTPS ». `page` non HTTPS est vidée. - C-4. Versions : composante absente = `0`, comparaison textuelle insensible à la casse quand l'une des composantes n'est pas un nombre ; borne `jeu_min` ou `jeu_max` vide = pas de limite de ce côté. - C-5. « Mo » = 1 048 576 octets, arrondi supérieur. `octets` = 0 donne « Download (0 MB) » (le texte reste dans les deux autorisés du § 2.3). - C-6. Plusieurs entrées pour une même ville : la première éligible dans l'ordre du fichier. - C-7. Index présent mais `base` absente ou vide : `CentralLondon` et `00BathCC`. Index présent mais illisible : pas de repli sur le second fichier (la fiche dit « le premier fichier présent »), avertissement, aucune ville téléchargeable. - C-8. Nom de ville d'une ligne : champ `StreetMapName*` lu en `FNameProperty` ; repli `FStrProperty` si le champ est une chaîne (non demandé, sans effet si c'est un nom). - C-9. Ligne `City_C` dont la ville est illisible (valeur vide ou par défaut `…/`) : rangée avec les installées, non décorée. - C-10. Tri sauté (pas de `ClearChildren`) quand l'ordre est déjà le bon. - C-11. Le filtre de ModdingExtra n'est retiré par `Deinitialize` que s'il a été posé par cette instance (en PIE, plusieurs instances de jeu). - C-12. Chemins de l'index passés tels que le moteur les donne (`ProjectSavedDir`, `ProjectContentDir`), sans `ConvertRelativePathToFull`, pour que le pak retrouve le fichier. - C-13. `IndexCartes.ps1` : - `base` et `licences` sont reprises de `Content\Data\LPCityMaps.json` (le texte de licence n'existe qu'à un endroit) ; - `sha256` en minuscules ; - `-Toutes` écarte, avec un message, un pack dont le CREDITS n'a pas de ligne `- file … SHA-256 …` (Paris : pas une ancienne carte, CREDITS d'une autre forme) ; avec `-Villes Paris`, c'est une erreur (code 2) ; - `VersionName` du `.uplugin` source différent de la version de l'archive : code 2 ; - `source` = la ligne du CREDITS sans le `- file ` du début ; - `-Villes` et `-Toutes` exclusifs, validation de `-Hebergeur` à la main (code 2 et non l'erreur de liaison de `ValidateSet`). - C-14. Espaces de fin : deux lignes du `.cpp` de ModdingExtra qui portaient des espaces en fin (la ligne vide avant `// FPaths::NormalizeDirectoryName` et `return true;`) sont normalisées par le remplacement. Aucun autre octet de ce fichier ne change (`git diff --stat` : 19 insertions, 2 suppressions). - C-15. Trois commentaires du `.cpp` contiennent le signe « § » (non ASCII, comme `LPModInfoSubsystem.h`) ; rien d'autre n'est hors ASCII dans le `.h` et le `.cpp` (grep : 3 lignes). ## 3. Instantané - Lot `MAPDL1-E1`, un chemin par appel (`Tools\Snapshot.ps1 -Lot MAPDL1-E1 -Path `, 8 appels, code 0), manifeste : `D:\Game\LifePlay_Backup_5.5\MAPDL1-E1\manifest.csv`. - 4 fichiers existants sauvegardés (MD5 du § 1) ; 4 fichiers neufs notés absents (`Existed=False`) : `LPCityMapsSubsystem.h`, `.cpp`, `Content\Data\LPCityMaps.json`, `Tools\IndexCartes.ps1`. - Pris à 15:56:38-47, avant toute écriture dans l'arbre. Retour arrière : `Tools\Restore.ps1 -Lot MAPDL1-E1`, **seulement proposé**. ## 4. Ce qui n'a pas été fait - Aucun build, commandlet, éditeur ni essai en jeu (étape E2 et suivantes). Rien n'est compilé : tout ce qui suit est « écrit, non compilé ». - C6 (fenêtre de téléchargement, HTTP, SHA-256, libzip, pose) : étape E5. Le clic d'une ligne téléchargeable ouvre le navigateur. - Pas de `Saved/LPCityMaps.json` d'essai posé (la fiche renvoie à `MAPDL1-ESSAI-FJ` F4) ; `Content/Data/LPCityMaps.json` livré avec `villes: []`. - Pas de ligne ajoutée à `Tools\LISEZMOI.md` (hors du § 1). Proposition de ligne d'index : `| IndexCartes.ps1 | Écrit l'index LPCityMaps.json (format 2) des cartes de villes téléchargeables depuis les archives lpm_city_* de la publication et les sources des packs ; hébergeur en paramètre (Forgejo, GitHub, modèle d'URL), aucun réseau | `.\Tools\IndexCartes.ps1 (-Villes A,B | -Toutes) -Hebergeur Forgejo -Owner o -Repo r -Tag t [-Miroir "https://…/{zip}"] [-Sortie f [-Livre]] [-ABlanc]` (lot MAPDL1) |`. À reporter par l'orchestrateur avec une entrée CHG (`Tools\` est local, non suivi). - `Tools\FicheStats.py` non relancé. ## 5. Points à confirmer en VAL / à la compilation (E2), un par ligne - V-1 (E2) UHT accepte, dans `ModdingExtraBPLibrary.h`, un alias `using … = TFunction<…>` et une fonction libre `MODDINGEXTRA_API` après la classe. - V-2 (E2) Édition de liens : `LifePlay` (dépendance privée) appelle `ModdingExtraSetFileListFilter` exportée par `ModdingExtra` ; l'en-tête `ModdingExtraBPLibrary.h` (avec son `.generated.h`) est trouvé depuis `LifePlay`. Le module a `LoadingPhase: PreLoadingScreen`. - V-3 (E2) Compilation de `LPCityMapsSubsystem.cpp` : surtout `SNew(SOverlay).Visibility(…) + SOverlay::Slot()…`, `SBox::Padding(FMargin)`, `TSet>::Contains`, `AddUniqueDynamic` sur `UButton::OnClicked`, `CastField<…>` sur un `const FProperty*`, `ContainerPtrToValuePtr` sur un `const UUserWidget*`, boucle sur `FJsonObject::Values` (`const auto&`, clé `UE::FSharedString`). - V-4 (E2) 0 avertissement nouveau (aucun membre déprécié utilisé : `UScrollBoxSlot` par accesseurs) ; collisions d'unity build (tous les noms du `.cpp` sont dans `LPCityMapsImpl`). - V-5 (jeu) Journal au premier menu : `[LPCity] CARTES index …`, `ETAT ` pour chaque ville vue (de l'ordre de 280 lignes), `LISTE Heavy/StreetMap : entrees, retirees`, `MENU tri : …`. - V-6 (jeu) Le Blueprint `City` relance `Construct` quand une ligne est retirée puis remise (`ClearChildren` + `AddChild`) : textes, couleurs et boutons doivent se rétablir ; pas de clignotement (cf. E-1). - V-7 (jeu) Le champ `StreetMapName*` de la structure `City` est lisible (type, suffixe) ; variables `City`, `InstalledText`, `CityButton` trouvées sur les lignes `City_C`. - V-8 (jeu) Tokyo (pack monté) reste « Installed » en vert et se charge ; une ville de gabarit apparaît « Not available », grisée, en bas ; une ville de l'index d'essai apparaît « Download (xx MB) » en bleu, au milieu. - V-9 (jeu) Le clic sur une ligne téléchargeable n'appelle pas `MoveCity` et ouvre le navigateur ; journal `[LPCity] CLIC : navigateur `. - V-10 (jeu) Bandeau : texte, 10 s, une fois par ville, au-dessus de la fenêtre des mods (Z 1100 contre 1000), sans bloquer la souris. - V-11 (cuisson) `Content/Data/LPCityMaps.json` est dans le pak (`DirectoriesToAlwaysStageAsUFS`) et `IFileManager::FileExists` / `LoadFileToString` le lisent en Shipping. - V-12 (jeu) Moment du premier appel de `ResolveCityPath` : il met en cache un résultat négatif ; l'état n'est calculé qu'à l'ouverture du menu (dossier `Heavy/StreetMap`), après le montage des packs. À confirmer qu'aucun autre appelant de `GetAllFilesFromFolder("Heavy/StreetMap")` ne le déclenche plus tôt (E0 : un seul Blueprint porte ce littéral). - V-13 (dépôt) Dépendance de commit : `OnCityMapResolved` et `ResolveCityPath` sont dans `LPAssetRegistryHelpers.*`, encore en `M` (STM1, non commité). Le commit de ce lot ne se compile pas seul : ordre STM1 d'abord, ou ensemble, décision du gardien. ## 6. Fichiers à commiter Dépôt du jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; aucun agent ne commite, le gardien le fait sur ticket : - M `Config/DefaultGame.ini` - M `Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp` - M `Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h` - M `Source/LifePlay/LifePlay.Build.cs` - A `Source/LifePlay/LPCityMapsSubsystem.cpp` - A `Source/LifePlay/LPCityMapsSubsystem.h` - A `Content/Data/LPCityMaps.json` - A `Docs/Migration/etat/REL/MAPDL1/MAPDL1-E1-IMPL.md` Hors git : `Tools/IndexCartes.ps1` (ignoré, `.gitignore:91`, instantané + CHG + ligne d'index remplacent le commit) ; instantané `D:\Game\LifePlay_Backup_5.5\MAPDL1-E1\`. Tours : 47 / 60 (décompte de l'agent ; `FicheStats` non relancé) ## Constats ### Sorties des contrôles du § 3 de la fiche (collées) 1. `git diff --stat` des fichiers M ; `git status --short` des fichiers du § 1 : ``` Config/DefaultGame.ini | 1 + .../ModdingExtra/Private/ModdingExtraBPLibrary.cpp | 21 +++++++++++++++++++-- .../ModdingExtra/Public/ModdingExtraBPLibrary.h | 5 +++++ Source/LifePlay/LifePlay.Build.cs | 4 ++++ 4 files changed, 29 insertions(+), 2 deletions(-) M Config/DefaultGame.ini M Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp M Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h M Source/LifePlay/LifePlay.Build.cs ?? Content/Data/ ?? Source/LifePlay/LPCityMapsSubsystem.cpp ?? Source/LifePlay/LPCityMapsSubsystem.h ``` Fichiers A : `LPCityMapsSubsystem.h`, `LPCityMapsSubsystem.cpp`, `Content/Data/LPCityMaps.json` (suivis par git une fois commités) ; `Tools/IndexCartes.ps1` ignoré (`git check-ignore -v` : `.gitignore:91:/Tools/`). 2. MD5 avant / après : tableau du § 1. Fichiers de STM1 (avant = après, `diff` des deux relevés : `IDENTIQUE`) : ``` CC146CC6979ED4321413130DCD1B4417 .\Source\LifePlay\LPCityWaterSubsystem.cpp 4A6C67116A76BFFB9D8D04E38A6C9AC5 .\Source\LifePlay\LPCityWaterSubsystem.h E5027FD7FD2B827831D52E8CE5727A36 .\Source\LifePlay\LPCityWaterMask.h F378333812EFD901C72F252131F28E47 .\Source\LifePlay\LPCityNamesSubsystem.cpp 1063948323E856860350F143296D8611 .\Source\LifePlay\LPCityNamesSubsystem.h 01CC49D85CA415B11A04D19E8EA23FBB .\Source\LifePlay\LPCityHouses.h B4FF95AE838F241DBBAB23C7DDAB4D5A .\Source\LifePlay\LPCityLandmarks.h 7B44F5FA7A1CB33EA8E96C9ECC1C7BDE .\Source\LifePlay\LPAssetRegistryHelpers.cpp 8E3B725A609CC8E5E23D2F0CEC309C1A .\Source\LifePlay\LPAssetRegistryHelpers.h ``` 3. Fins de ligne, `git ls-files --eol` (fichiers M suivis), puis CR / BOM / non-ASCII des fichiers neufs (`tr -cd '\r' | wc -c`, `head -c 3 | od`, `grep -c -P '[^\x00-\x7F]'`) : ``` i/lf w/lf attr/-text Config/DefaultGame.ini i/lf w/lf attr/-text Plugins/ModdingExtra/Source/ModdingExtra/Private/ModdingExtraBPLibrary.cpp i/lf w/lf attr/-text Plugins/ModdingExtra/Source/ModdingExtra/Public/ModdingExtraBPLibrary.h i/lf w/lf attr/-text Source/LifePlay/LifePlay.Build.cs Source/LifePlay/LPCityMapsSubsystem.h : CR=0 BOM=2f2f20 nonASCII-lignes=0 Source/LifePlay/LPCityMapsSubsystem.cpp : CR=0 BOM=2f2f20 nonASCII-lignes=3 Content/Data/LPCityMaps.json : CR=0 BOM=7b0a20 nonASCII-lignes=1 Tools/IndexCartes.ps1 : CR=0 BOM=3c230a nonASCII-lignes=0 ``` (`LPCityMaps.json` : 1 ligne non ASCII = le tiret demi-cadratin U+2013 de « 2018–2022 », octets `342 200 223` ; premiers octets `{ \n` = pas de BOM. La console de l'outil affiche ce tiret en `-` : l'affichage seul est en cause.) 4. Analyse syntaxique PowerShell de `IndexCartes.ps1` (`[System.Management.Automation.Language.Parser]::ParseFile`) : ``` erreurs de syntaxe: 0 ``` 5. `Test-Json` sous pwsh sur `Content/Data/LPCityMaps.json` : ``` Test-Json: True villes: 0 ; base: CentralLondon,00BathCC titre identique a v2 par 4 : True (match: True ; longueurs v2/json : 333 / 333) ``` 6. Essai à blanc du § 2.7, valeurs fictives (`pwsh -NoProfile -File Tools/IndexCartes.ps1 -Villes Manila -Hebergeur Forgejo -Owner exemple -Repo exemple -Tag cartes-test-1 -ABlanc`, code 0 ; octets et SHA-256 identiques à `PRODUCTION.csv` ligne Manila : 22075120 ; 2BA28C4E…B4CF) : ``` packs retenus : 1 ; ecartes : 0 ; archives : D:\Game\LifePlay_Publication\Mods ; hebergeur : Forgejo { "format": 2, "base": [ "CentralLondon", "00BathCC" ], "licences": { "osm": { "titre": "Map data (c) OpenStreetMap contributors, ODbL 1.0", "fichier": "Licenses/OpenStreetMap_Geodata_License.txt" }, "lifeplay_ancienne": { "titre": "Original LifePlay city map (2018-2022), inherited from the original LifePlay game's \"NEW Maps\" download folder. Author and licence of the original map asset are not recorded in the source. Map data (c) OpenStreetMap contributors, ODbL 1.0. LifePlay code and assets by Vinfamy are under the MIT licence (Licenses/Vinfamy_License.txt).", "fichier": "Licenses/Vinfamy_License.txt" } }, "villes": [ { "ville": "Manila", "pack": "lpm_city_manila", "version": "1.0.1", "jeu_min": "2026.10.2.2a", "jeu_max": "2026.12.99", "zip": "lpm_city_manila-1.0.1-for-LifePlay-2026.10.2.2a.zip", "octets": 22075120, "sha256": "2ba28c4edfb98e7b0265be719e3a42489f0fd79b17268c6ee9f3fbe2dc08b4cf", "urls": [ "https://forgejo.edujiro5972.fr/exemple/exemple/releases/download/cartes-test-1/lpm_city_manila-1.0.1-for-LifePlay-2026.10.2.2a.zip" ], "page": "", "licences": [ "osm", "lifeplay_ancienne" ], "source": "Manila.zip, 19 946 453 bytes, SHA-256 cb0fce4be80df76e54b7a6c5a8a448b46739c7944644925f59be9d7c2bf0f308" } ] } a blanc : rien n'a ete ecrit exit=0 ``` (Le tiret de « 2018–2022 » s'affiche `-` à la console, voir 3 ; le JSON de l'outil le reprend du fichier livré.) 7. Essais complémentaires de `IndexCartes.ps1` (non demandés, tous à blanc ou refusés, rien d'écrit) : - `-Toutes -Hebergeur Modele -Modele "https://cartes.exemple.org/{zip}" -Miroir "https://github.com/exemple/exemple/releases/download/t/{zip}" -ABlanc` : `packs retenus : 10 ; ecartes : 1` (ligne : `lpm_city_paris ecarte : CREDITS sans ligne "- file ... SHA-256 ..." (pas une ancienne carte)`) ; villes : Bangalore 1.0.0, Beijing 1.0.1, Manila 1.0.1, MexicoCity 1.0.1, Moscow 1.0.1, Mumbai 1.0.0, NYC 1.0.0, Seoul 1.0.1, Shanghai 1.0.1, Tokyo 1.0.0 ; deux URL par ville (principal puis miroir). Paris a plusieurs dizaines d'archives de versions différentes dans la publication ; les copies `precedent_*` ne correspondent pas au motif et sont ignorées. - `-Villes Paris …` : `IndexCartes.ps1 : CREDITS de lpm_city_paris sans ligne '- file ... SHA-256 ...' : …\ModSources\lpm_city_paris\Module\CREDITS.txt`, code 2. - `-Villes Atlantis …` : `archive absente pour le pack lpm_city_atlantis dans D:\Game\LifePlay_Publication\Mods`, code 2. - `-Sortie Content/Data/LPCityMaps.json` sans `-Livre` : `ecrire Content\Data\LPCityMaps.json (copie livree avec le jeu) exige -Livre`, code 2. - sans argument : `-Villes ou -Toutes attendu. …`, code 2. ### API moteur UE 5.8 lues dans les sources (`D:\Game\Launcher\Engine\UE_5.8\Engine\Source`, chemins sous `Runtime\` sauf mention) - `UMG/Public/Components/PanelWidget.h:28` (`GetChildrenCount`), `:36` (`GetChildAt`), `:59` (`AddChild(UWidget*)`), `:122` (`virtual ClearChildren`). - `UMG/Public/Components/ScrollBoxSlot.h:46, 49, 55, 58, 60, 63` (`GetPadding`, `SetPadding`, `Get/SetHorizontalAlignment`, `Get/SetVerticalAlignment` ; les membres `Padding` etc. sont `UE_DEPRECATED(5.1)`, lignes 29-42, donc non utilisés). - `UMG/Public/Components/Widget.h:264` (`TObjectPtr Slot`), `:541` / `:545` (`GetIsEnabled` / `SetIsEnabled`), `:582` (`IsVisible`), `:598` / `:602` (`Get/SetRenderOpacity`), `:857` (`GetCachedWidget`) ; `UMG/Private/Components/Widget.cpp:395-404` (`IsVisible` lit la visibilité du widget Slate en cache). - `UMG/Public/Components/TextBlock.h:95, 103, 106, 114` (`GetText`, `SetText`, `GetColorAndOpacity`, `SetColorAndOpacity`) ; `UMG/Public/Components/Button.h:76` (`OnClicked`) ; `SlateCore/Public/Styling/SlateColor.h:134` (`GetSpecifiedColor`). - `Core/Public/GenericPlatform/GenericPlatformProcess.h:563` (`LaunchURL(const TCHAR*, const TCHAR*, FString*)`), `Core/Public/Windows/WindowsPlatformProcess.h:238`. - `Json/Public/Dom/JsonObject.h:237` (`Values` à clé `FStringType`, `UE::FSharedString` par défaut, `UE_JSONOBJECT_LEGACY_STRING_KEYS` à 0 : `:46-47`), `:414-441` (`TryGetNumberField`, dont `int64&` à `:429`), `:450` (`TryGetStringField`), `:494` (`TryGetArrayField`), `:507` (`TryGetObjectField`), tous avec `FStringView` ; `Json/Public/Dom/JsonValue.h:74` (`TryGetString`), `:89` (`TryGetObject(const TSharedPtr*&) const`) ; `Json/Public/Serialization/JsonSerializer.h:676` (`FJsonSerializer`) ; `Json/Public/Serialization/JsonReader.h:1088` (`TJsonReaderFactory::Create(const StringType&)`) ; `Core/Public/Containers/SharedString.h:92` (`ToView`). Même emploi dans le jeu : `LPBuildCityLandmarksCommandlet.cpp:118`, `LPDataCache.cpp:150` et `:203`. - `CoreUObject/Public/UObject/UnrealType.h:801-816` (`ContainerPtrToValuePtr`), `:1663` (`GetPropertyValue_InContainer` des propriétés de valeur : `FName`, `FString`), `:2896` (`GetObjectPropertyValue_InContainer`), `:3723` (`FNameProperty`), `:6387` (`FStructProperty`) ; `CoreUObject/Public/UObject/Class.h:663` (`FindPropertyByName(FName)`). - `Core/Public/Containers/UnrealString.h.inl:1219` (`FindChar`), `:1231` (`FindLastChar`) ; `Core/Public/Misc/Char.h:240` (`IsDigit`), `:261` (`IsHexDigit`) ; `Core/Public/Misc/Paths.h:527` (`GetBaseFilename`) ; `Core/Public/HAL/FileManager.h:116` (`FileExists`). - `Engine/Classes/Engine/GameViewportClient.h:258` (`AddViewportWidgetContent`), `:265` (`RemoveViewportWidgetContent`) ; `SlateCore/Public/Widgets/SOverlay.h:57` (arguments de `FOverlaySlot`) ; `Slate/Public/Widgets/Layout/SBox.h:55` (`SLATE_ATTRIBUTE(FMargin, Padding)`) ; `SlateCore/Public/Layout/Visibility.h:23` (`HitTestInvisible`). - Livraison du JSON dans le pak : `Developer/DeveloperToolSettings/Classes/Settings/ProjectPackagingSettings.h:586-591` (`DirectoriesToAlwaysStageAsUFS` : « added to the .pak », chemins relatifs à `Content`) et `Programs/AutomationTool/Scripts/CopyBuildToStagingDirectory.Automation.cs:2052-2054` (la clé est lue par `StageAdditionalDirectoriesFromConfig` avec `ProjectContentRoot`). ### Compte rendu (sk-protocol) [sk-protocol] Skills présents dans mon contexte : sk-protocol, ue-cpp-build, lp-build, lp-ue-compat (préchargés) ; lp-city (invoqué en fin de travail). 1. **Résultat** : réussi hors moteur (C1 à C5 écrits, contrôles du § 3 faits) ; **rien n'est compilé**, la compilation est l'étape E2. 2. **Preuves** : `MAPDL1-E1-FICHE.md`, `SPEC-05-v3` § 1, `SPEC-05` § 1-2, `SPEC-05-v2` § 4, `E0-INV`, `L1-CART-02`, `L4-CART-01` ; modèle `LPModInfoSubsystem.h/.cpp:308-373` ; `LPAssetRegistryHelpers.h:19`, `.cpp:37, 101-133` ; API moteur ci-dessus (fichier:ligne). 3. **Mesuré** : sorties collées dans `## Constats` (git diff --stat, status, `ls-files --eol`, MD5 avant / après, analyse syntaxique 0 erreur, `Test-Json True`, essai à blanc, code 0). 4. **Incertitudes** : toute la compilation (V-1 à V-4) ; le comportement dans le Blueprint (V-6 à V-10 : relance de `Construct` après le tri, ordre d'écriture de `InstalledText` face au ticker de 0 s, E-1) ; la livraison du JSON dans le pak (V-11) ; le moment du premier `ResolveCityPath` (V-12). Non mesuré : tout ce qui demande le moteur. 5. **Écarts** : E-1 (ticker de 0 s) et choix C-1 à C-15 (§ 2). Fichiers écrits : les 8 du § 1, plus ce livrable `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\REL\MAPDL1\MAPDL1-E1-IMPL.md`. À commiter : liste du § 6 (`Tools/IndexCartes.ps1` hors git). 6. **Tours** : 47 / 60 (décompte de l'agent). 7. **À verser** : `lp-city` § 3 — le menu des villes est décoré par `ULPCityMapsSubsystem` (ticker de 0 s, `CityScrollBox` / `City_C`, filtre de `GetAllFilesFromFolder` dans ModdingExtra) ; `lp-commandlets` ou `Tools\LISEZMOI.md` — ligne d'index de `IndexCartes.ps1` (§ 4) ; `sk-protocol` § 7 — `Write` d'un fichier contenant un tiret demi-cadratin : les octets sont bons (`od -c`), la console des outils l'affiche en `-`, vérifier par `od`, pas par l'affichage. 8. **Handoff** : Suite : lp-builder doit lancer E2 (`Tools\Build.ps1 -Lot MAPDL1-E2`, éditeur puis jeu Development, jeton UE) puis rapporter les erreurs sans les corriger ; état : code écrit et non compilé, fichiers de STM1 inchangés, instantané `MAPDL1-E1` en place, ordre de commit à fixer avec STM1 (V-13).