LifePlay-Revival/Docs/Migration/etat/REL/MAPDL1/MAPDL1-P1-IMPL.md

129 lines
9.8 KiB
Markdown
Raw Normal View History

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_<v>/StreetMap/<Ville>`, 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/<Ville>` 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.