LifePlay-Revival/Docs/Migration/etat/ST/STG/STG-WALK-IMPL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

5.4 KiB

Fiche STG-WALK — Niveau N3 — Modèle prévu claude-opus-5-5 | utilisé claude-opus-5-5

IMPL C++ de la marche animée (DIAG STG-WALK-DIAG.md), sur accord de Big Boss (2026-10-13) : garde locale, chargement du clip cuit puis de ClipPath, un seul avertissement, RestoreAnim quand la marche est bloquée ; IsGameTarget inchangé. Écrit sans compiler, par-dessus S-F5 / C1-Walk (VAL PASS-STATIC). VAL par un lp-validator distinct. La duplication des deux clips (asset) est une fiche à part, sous UE-GO, après l'UE-LIBRE de CAM. Lot STG, registre STG-TACHES.md.

1. Instantané et MD5

Fichier Avant Après
Source/LifePlay/LPDirectControlSubsystem.cpp 5323C2B2027286098DC3C527FC1F39BD (C1-Walk) A2E46943… (passe 1, VAL FAIL), puis 8A680F80111D742A924FF655FDB21B61 (passe 2, § 6)
Source/LifePlay/LPDirectControlSubsystem.h 3CDB498591DFF98DD53FCFD65D7322D0 inchangé

Instantané : D:\Game\LifePlay_Backup_5.5\STG-WALK2\manifest.csv (5323C2B2…). CRLF : 1 263 CR = LF (passe 2). Diff : STG-WALK.diff (format diff classique).

Incident : un premier Snapshot.ps1 lancé depuis Bash a perdu les \ du chemin. Backup_5.5\STG-WALK\manifest.csv contient une seule ligne erronée (SourceLifePlayLPDirectControlSubsystem.cpp, Existed=False), sans copie. Ce manifeste n'est pas à utiliser : son Restore ne ferait rien d'utile. La référence est STG-WALK2.

2. Gestes

  1. #include "HAL/PlatformProperties.h".
  2. WalkClip(bMale), dans l'espace anonyme :
    • charge /Game/Heavy/Daz/<Bridget|Michael>/Anim/<B|M>_Walk_Loop, la copie cuite à venir ;
    • sinon LPAnimRedirect::ClipPath(<nom>), comme avant (éditeur, mods) ;
    • les deux chargements sont faits avec LOAD_NoWarn | LOAD_Quiet ;
    • le clip trouvé est gardé en mémoire (TWeakObjectPtr, un par sexe), pour ne pas recharger à chaque image ;
    • si aucun des deux ne se charge : un seul avertissement par sexe, « Marche : clip … introuvable (…, …), marche sans animation », puis plus aucun essai pendant la session.
  3. Walk : la garde devient !bSandbox && (LPAnimRedirect::IsGameTarget() || FPlatformProperties::RequiresCookedData()).
    • jeu empaqueté : la marche est animée ;
    • éditeur : selon LPAnimTarget.ini, comme avant ;
    • IsGameTarget n'est pas modifié.
  4. WalkAnim : WalkClip(bMale) remplace LoadObject(ClipPath(...)). IsMale est toujours relu à chaque appel. La ligne « Marche : animation » est inchangée : elle s'écrit quand le cycle démarre.
  5. Tick, branche bloquée (menu, boîte de scène, SexOn) : appel de RestoreAnim(), sans effet si rien n'est capturé.
  6. RestoreAnim : si le maillage ne joue plus un *_Walk_Loop en mode AnimationSingleNode, le jeu (scène, action) a déjà posé sa propre animation. Elle n'est pas écrasée : seule la vitesse de lecture est rendue (1), et la capture est abandonnée. Sinon, l'Anim BP ou l'animation capturée est rendue, comme avant.
    • Ajout au DIAG, motivé : sans ce contrôle, le point 5 pourrait remplacer l'animation qu'une scène vient de poser. bMenuBlocks n'est relu que toutes les 0,25 s.

Nom nouveau de l'espace anonyme : WalkClip, absent du reste de Source/LifePlay.

2b. Passe 2 (WALK-fix), après la VAL FAIL (STG-WALK-VAL.md, P5)

Défaut établi par la VAL et contre-vérifié dans la source du moteur (SkeletalMeshComponent.cpp, PlayAnimation → SetAnimation → UAnimSingleNodeInstance::SetAnimationAsset). PlayAnimation ne met pas à jour AnimationData.AnimToPlay. Le contrôle ajouté au geste 6 rendait donc toujours « animation posée par le jeu » : l'Anim BP n'était plus rendue à l'arrêt. Les deux lectures d'origine de WalkAnim (capture de SavedSingleAnim, et test « déjà sur le cycle ») avaient le même défaut, latent tant que les clips manquaient : PlayAnimation et le journal auraient été relancés à chaque image.

Correction :

  • #include "Animation/AnimSingleNodeInstance.h" ;
  • fonction SingleNodeAnim(Mesh) dans l'espace anonyme : GetSingleNodeInstance()->GetAnimationAsset(), nulle en mode Anim BP ;
  • les 3 lectures de AnimationData.AnimToPlay sont remplacées : WalkAnim (capture, test) et RestoreAnim (contrôle du geste 6). Il ne reste plus aucune lecture de ce champ, seulement le commentaire.

3. Points à confirmer en VAL

P1 : diff limité aux gestes du § 2. P2 : API (FPlatformProperties::RequiresCookedData, LoadObject avec drapeaux, AnimationData.AnimToPlay, GetAnimationMode), includes. P3 : garde éditeur inchangée (IsGameTarget seul quand RequiresCookedData est faux). P4 : aucune boucle de chargement (cache et bMissing). P5 : RestoreAnim ne touche pas une animation posée par le jeu. P6 : KO3b, C1-Walk et 3a inchangés. P7 : compilation (BUILD de COMMUN-4).

4. Essai prévu (COMMUN-4, après la duplication des clips)

  • Michael puis Bridget en ZQSD : les jambes marchent. Au journal, « Marche : animation M_Walk_Loop » ou « B_Walk_Loop », et aucune ligne « clip … introuvable ».
  • Arrêt : la pose de repos revient.
  • Scène ouverte en marchant : la pose de la scène s'affiche, pas la marche.
  • Changement de sexe, puis marche : le bon clip est joué.

5. Fichiers à commiter

Source/LifePlay/LPDirectControlSubsystem.cpp (après COMMUN-4 et VAL), Docs/Migration/etat/ST/STG/STG-WALK-DIAG.md, STG-WALK-IMPL.md, STG-WALK.diff, STG-WALK-VAL.md.