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

6.7 KiB

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.