Fiche MAPDL1-P1-IMPL — Niveau N3 — Modèle prévu opus medium | utilisé claude-opus-5-5 — Agent session « Medium · MAPDL1 » ; compilation et DryRun par le sous-agent lp-builder (`MAPDL1-P1-BUILD.md`, `MAPDL1-P1-BUILD-02.md`) — Skills sk-protocol, lp-city, lp-lot, lp-commandlets, lp-paths # MAPDL1-P1 : commandlet `LPImportLegacyStreetMap`, reprise à l'identique d'une ancienne carte (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. » Jeton UE : attribué par Big Boss à 11:52, rendu à la fin de cette fiche. ## 1. Ce qui a été fait - **Deux fichiers neufs**, et seulement eux, sous l'instantané `Snapshot.ps1 -Lot MAPDL1` (`Existed=False`, `D:\Game\LifePlay_Backup_5.5\MAPDL1\manifest.csv`) : | Fichier | MD5 après | Fins de ligne | |---|---|---| | `Source/LifePlayEditorTools/LPImportLegacyStreetMapCommandlet.h` | `34874DB2638C26DE378CCAF5E85F297A` | LF | | `Source/LifePlayEditorTools/LPImportLegacyStreetMapCommandlet.cpp` | `0678BCCB6C86D9C40D55C11B74742AA0` | LF | - **Ce que fait le commandlet** : - il lit le résumé UE4 (legacy −6 ou −7, non versionné ou version 511 et plus), la table de noms, les imports, puis l'export de classe `StreetMap` ; - il recopie **chaque propriété étiquetée** dans la propriété 5.8 du même nom, **par réflexion**. Types pris en charge : booléen, entier, flottant, chaîne, nom, octet ou énumération, `Vector2D` et `Vector` natifs, structures étiquetées, tableaux ; - il ne recalcule aucune donnée ; - une propriété inconnue ou incompatible est sautée par sa taille et comptée au rapport ; - il garde les mêmes protections que `LPImportCityOSM` : écriture seulement sous `_Pilot/` ou `/lpm_city_/StreetMap/`, jamais sur un paquet existant, `-DryRun` sans écriture. - **Aucun fichier de STM1 n'est touché**, ni `LifePlayEditorTools.Build.cs` : `StreetMapRuntime` et `Json` y étaient déjà. MD5 relevés avant l'écriture et relus après, identiques : - `LPAssetRegistryHelpers.cpp` `7B44F5FA…` et `.h` `8E3B725A…` ; - `LPCityWaterSubsystem.cpp` `CC146CC6…` et `.h` `4A6C6711…` ; - `LPCityWaterMask.h` `E5027FD7…` ; - `LPBuildCityWaterCommandlet.cpp` `96EC9503…` et `.h` `AEFBBF33…` ; - `LPImportCityOSMCommandlet.cpp` `CFFBAAEC…` ; - `LifePlayEditorTools.Build.cs` `6487F4B6…`. - **Correctif après la première compilation** : C4456, la variable `P` masquait une autre variable (`.cpp:188`, traité en erreur ; `MAPDL1-P1-BUILD.md`). Les deux variables ont été renommées `ByteProp` et `EnumProp`. La seconde compilation donne code 0, 0 erreur, 0 avertissement (`MAPDL1-P1-BUILD-02.md`). - **Référence indépendante** : le script ponctuel `Saved\MAPDL1\lire_streetmap_ue4.py` (MD5 `10D1133BC2BCD1802E3E863E6CE55F5A`) a reçu l'option `--totaux`, un décodage complet et générique. ## 2. Mesuré Référence Python : ``` python -I -X utf8 Saved\MAPDL1\lire_streetmap_ue4.py <…>\Paris.uasset <…>\Paris.uexp --totaux TOTAUX routes=6719 points_routes=33916 sens_unique=4477 noeuds=7999 refs_noeuds=18057 batiments=43789 points_batiments=551010 nommes=2082 amenites=1290 hauteurs=296 parcs=273 points_parcs=6067 eaux=0 BORNES (-411527.8, -291203.4) a (417012.0, 308414.8) cm ; soit 8.29 x 6.00 km code=0 ``` DryRun (`MAPDL1-P1-BUILD-02.md`, rapport `D:\Game\LifePlay_Data\Mega-essai\P1-dryrun.md`) : ``` TOTAUX routes=6719 points_routes=33916 sens_unique=4477 noeuds=7999 refs_noeuds=18057 batiments=43789 points_batiments=551010 nommes=2082 amenites=1290 hauteurs=296 parcs=273 points_parcs=6067 eaux=0 BORNES (-411527.8, -291203.4) a (417012.0, 308414.8) cm ; soit 8.29 x 6.00 km DryRun : aucun asset ecrit CODE 0 ``` Écriture du pilote : ``` & .\Tools\RunCommandlet.ps1 -Lot MAPDL1 -Commandlet LPImportLegacyStreetMap -EtatDir '<…>\etat\REL\MAPDL1' -Args '-Uasset=D:\Game\LifePlay_Data\Mega-essai\MAPDL1-entetes\Paris.uasset -Package=/Game/Heavy/StreetMap/_Pilot/MAPDL1_ParisLegacy -Report=D:\Game\LifePlay_Data\Mega-essai\P1-ecriture.md' code=0 duree=26s erreurs=0 avertissements=0 proprietes lues jusqu'a l'octet 25005768 ; reste 4 octets apres la fin de liste (attendu : 4) TOTAUX routes=6719 points_routes=33916 sens_unique=4477 noeuds=7999 refs_noeuds=18057 batiments=43789 points_batiments=551010 nommes=2082 amenites=1290 hauteurs=296 parcs=273 points_parcs=6067 eaux=0 BORNES (-411527.8, -291203.4) a (417012.0, 308414.8) cm ; soit 8.29 x 6.00 km asset ecrit : /Game/Heavy/StreetMap/_Pilot/MAPDL1_ParisLegacy (…/Content/Heavy/StreetMap/_Pilot/MAPDL1_ParisLegacy.uasset), 29616770 octets CODE 0 ``` Relecture depuis le disque, par un autre outil : ``` & .\Tools\RunCommandlet.ps1 -Lot MAPDL1 -Commandlet LPCheckStreetMap -EtatDir '<…>\etat\REL\MAPDL1' -Args '-Path=/Game/Heavy/StreetMap/_Pilot -CSV=D:\Game\LifePlay_Data\Mega-essai\P1-relecture.csv' code=0 duree=21s erreurs=0 avertissements=24 (les 24 lignes sont la synthèse de l'outil, écrite au niveau Warning) Ville;Charge;Routes;Noeuds;Batiments;Eaux;Parcs;BatimentsNommes;AvecAmenity;TypesAmenity MAPDL1_ParisLegacy;1;6719;7999;43789;0;273;2082;1290;120 Paris;1;22280;25221;110949;0;658;4246;1781;111 ``` MD5 du pilote : `5BCB7785B9E5564377D9EE54E7D85A02`. `UeState.ps1 -Kind Editeur` en fin de fiche : `processus=0 editeur=0`, code 0. ## 3. Verdict - **Les 13 comptes et les bornes sont identiques** entre trois lectures : - le lecteur Python, indépendant du moteur ; - le commandlet en DryRun et en écriture ; - la relecture du paquet écrit par `LPCheckStreetMap`. - Le paquet se charge, avec 0 propriété inconnue et 0 propriété incompatible. La voie (a) est **établie** pour Paris : l'ancienne carte est reprise à l'identique en `UStreetMap` 5.8. **Non mesuré** : - le maillage `Static/` régénéré par `LPBuildCityStatic` et sa comparaison avec l'ancien `Static\Paris.uexp` (lot P2) ; - un zip d'une autre année (2020 à 2022) ; - l'aspect en jeu. La ligne `Paris` du CSV est l'ancien pilote STM1 (`_Pilot/Paris`, OSM de 2026, 11 × 8 km). Elle n'est pas à comparer. ## 4. Écarts - **Snapshot** : `pwsh -File Snapshot.ps1 -Path a, b` a inscrit une entrée fautive `…Commandlet.h,` (avec la virgule). Les deux fichiers ont ensuite été inscrits un par un. L'entrée fautive est à ignorer au retour arrière : la ligne `Existed=False` d'un chemin inexistant ne retire rien. - **Résumés de `Build.ps1`** : ils sont dans `Docs\Migration\etat\MAPDL1\`, avec l'avertissement « EtatDir.ps1 : lot 'MAPDL1' hors table », donc **un dossier nouveau à la racine d'`etat\`**, ce qui est contraire à `lp-lot` (« Où écrire »). Je ne l'ai ni déplacé ni corrigé : `Tools\EtatDir.ps1` est un outil partagé avec l'addon. Décision à Big Boss : ajouter `MAPDL1` (projet `REL`) à la table, puis déplacer les deux `.txt`. - **Commandlets de lecture lancés en plus**, sous le même jeton, pour préparer L4 comme Big Boss l'a demandé : `LPDumpFunction -BP=City`, `-BP=City -Fn=EventGraph -Pins -Exec`, `-BP=CityMenu -Fn=EventGraph -Pins -Exec`. Ils sont en lecture seule. Résultat dans `MAPDL1-L4-CART-01.md`. ## 5. Fichiers À commiter (ticket du lot ; aucun fichier partagé) : - A `Source/LifePlayEditorTools/LPImportLegacyStreetMapCommandlet.h` - A `Source/LifePlayEditorTools/LPImportLegacyStreetMapCommandlet.cpp` - A `Docs/Migration/etat/REL/MAPDL1/` : `MAPDL1-CART-01.md`, `MAPDL1-SPEC-01.md`, `MAPDL1-SPEC-02.md`, `MAPDL1-SPEC-03.md`, `MAPDL1-L1-CART-02.md`, `MAPDL1-L2-RECH-01.md`, `MAPDL1-P1-IMPL.md`, `MAPDL1-P1-BUILD.md`, `MAPDL1-P1-BUILD-02.md`, `MAPDL1-L4-CART-01.md`, `MAPDL1-JOURNAL-BROUILLON.md` Hors git : - `Content/Heavy/StreetMap/_Pilot/MAPDL1_ParisLegacy.uasset` (pilote) ; - `Saved/MAPDL1/lire_streetmap_ue4.py` ; - `D:\Game\LifePlay_Data\Mega-essai\` (extraits et rapports) ; - résumés `.txt` dans `etat\REL\MAPDL1\` et `etat\MAPDL1\`, non suivis par git. Retour arrière : `.\Tools\Restore.ps1 -Lot MAPDL1 -WhatIf`, puis sans `-WhatIf`. Il retire les deux sources et le pilote. ## 6. Compte rendu - **Résultat** : réussi. Le commandlet est compilé, le pilote Paris écrit et relu, avec des comptes identiques à la référence. - **Tours** : ≈ 22 pour P1 (déclaré ; `FicheStats.py` fait foi). - **À verser** : - `lp-commandlets` § Cartes de villes : ajouter `LPImportLegacyStreetMap` (`-Uasset= [-Uexp=] (-DryRun | -Package=) [-Report=]`, reprise d'une carte « NEW Maps » UE4 cuite) ; - `lp-commandlets` : avec `RunCommandlet.ps1`, passer `-Args` par une variable dans la même session pwsh (`$a = '-Uasset=…'; & .\Tools\RunCommandlet.ps1 … -Args $a`). Par `pwsh -File`, une valeur qui commence par `-` est prise pour un paramètre (« Argument manquant pour le paramètre Args ») ; - `lp-lot` : `Snapshot.ps1 -Path a, b` par `pwsh -File` inscrit `a,` comme chemin. Un chemin par appel, ou `-Command`. - `lp-city` § 7 et `lp-commandlets` § Cartes de villes : **aucun asset de travail ne reste sous `Content\` entre deux sessions**. `DirectoriesToAlwaysCook` couvre tout `/Game`. Un asset de travail sous `_Pilot/`, absent de la release de base, fait échouer la cuisson des packs (« Uncooked … referenced by DLC »), comme ici avec `MAPDL1_ParisLegacy`. Il faut l'écrire sous un chemin exclu de la cuisson, ou le retirer, par déplacement, à la fin du lot. **Après coup (Big Boss)** : le pilote a été déplacé hors de `Content\`, vers `D:\Game\LifePlay_Backup_5.5\MAPDL1\pilote-hors-content\MAPDL1_ParisLegacy.uasset` (MD5 `5BCB7785…` inchangé). La mention « Hors git : … pilote » du § 5 désigne maintenant ce chemin. Un `Restore.ps1 -Lot MAPDL1` n'a plus de pilote à retirer. - **Suite** : P2, le pilote du maillage, sur la première ville de la vague 1 (Tokyo) : l'utilisateur télécharge `Tokyo.zip`, puis `LPBuildCityStatic -CompareStreetMap` et la comparaison avec l'ancien `Static`. État : P1 clos, jeton UE rendu.