diff --git a/AnimSources/freeanims/pack.json b/AnimSources/freeanims/pack.json new file mode 100644 index 0000000..f861701 --- /dev/null +++ b/AnimSources/freeanims/pack.json @@ -0,0 +1,187 @@ +{ + "pack": "freeanims", + "prefixe": "fap", + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "auteur": "SoerGame", + "licence": "CC BY 4.0", + "url": "https://www.fab.com/listings/9e93d929-36e8-45f9-b925-325db1b9385d", + "url_auteur": "https://www.fab.com/sellers/SoerGame", + "fichiers": [ + "Content/FreeAnimationsPack (assets Unreal)" + ], + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "exclus": [], + "chaine": { + "methode": "auto", + "profil_attendu": "ue5_mannequin", + "source": { + "type": "uasset", + "clips": "/Game/FreeAnimationsPack/Animations", + "maillage": "/Game/FreeAnimationsPack/Demo/Characters/Mannequins/Meshes/SKM_Manny.SKM_Manny", + "clip_reference": "AS_Rest" + }, + "sortie": { + "clips": "/Game/AnimPacks/FreeAnimationsPack", + "rigs": "/Game/Retarget_ue5" + }, + "corps": [ + { + "nom": "Bridget", + "maillage": "/Game/Heavy/Daz/Bridget/bridget_gp.bridget_gp", + "prefixe": "B_", + "gabarit": "/Game/Heavy/Daz/Anims/Idle_F_Daz" + }, + { + "nom": "Michael", + "maillage": "/Game/Heavy/Daz/Michael/michael.michael", + "prefixe": "M_", + "gabarit": "/Game/Heavy/Daz/Anims/idle_Daz" + } + ], + "mod": "lpr_anim_freeanims", + "travail": "Saved/AnimPipeline/freeanims", + "sandbox": "AnimPipeline/freeanims/sandbox" + }, + "animations": { + "fap_as_airkiss": { + "clip": "AS_AirKiss", + "nom": { + "fr": "Baiser envoyé", + "en": "Blow a kiss" + }, + "categorie": "interaction", + "accessoire": "", + "style": "détendu", + "usage": { + "fr": "Geste ponctuel (probablement joué une fois) d'envoi de baiser, joué sur place ; utile pour une scène de flirt ou d'adieu.", + "en": "One-shot gesture (probably played once) of blowing a kiss, played in place; useful for a flirting or farewell scene." + } + }, + "fap_as_attackinlevitation2": { + "clip": "AS_AttackInLevitation2", + "nom": { + "fr": "Attaque en lévitation", + "en": "Levitation attack" + }, + "categorie": "magie", + "accessoire": "", + "style": "agressif", + "usage": { + "fr": "Attaque lancée en lévitation, probablement jouée une fois, sur place ; pour un sort ou une attaque surnaturelle.", + "en": "Attack performed while levitating, probably played once, in place; for a spell or supernatural attack." + } + }, + "fap_as_chilldriving": { + "clip": "AS_ChillDriving", + "nom": { + "fr": "Conduite détendue", + "en": "Relaxed driving" + }, + "categorie": "conduite", + "accessoire": "volant", + "style": "détendu", + "usage": { + "fr": "Pose de conduite détendue, probablement en boucle, jouée sur place ; à utiliser avec un véhicule ou un volant.", + "en": "Relaxed driving pose, probably looping, played in place; to use with a vehicle or steering wheel." + } + }, + "fap_as_combohands": { + "clip": "AS_ComboHands", + "nom": { + "fr": "Enchaînement de poings", + "en": "Punch combo" + }, + "categorie": "combat", + "accessoire": "", + "style": "agressif", + "usage": { + "fr": "Enchaînement de coups de poing, probablement joué une fois, sur place ; pour une bagarre ou un entraînement.", + "en": "Sequence of punches, probably played once, in place; for a fight or training scene." + } + }, + "fap_as_eatingonparty": { + "clip": "AS_EatingOnParty", + "nom": { + "fr": "Manger en soirée", + "en": "Eating at party" + }, + "categorie": "interaction", + "accessoire": "", + "style": "détendu", + "usage": { + "fr": "Personnage mangeant debout lors d'une soirée, probablement en boucle, joué sur place ; pour un buffet ou une fête.", + "en": "Character eating while standing at a party, probably looping, played in place; for a buffet or party scene." + } + }, + "fap_as_flyingup": { + "clip": "AS_FlyingUp", + "nom": { + "fr": "Envol", + "en": "Take off" + }, + "categorie": "magie", + "accessoire": "", + "style": "neutre", + "usage": { + "fr": "Décollage vers le haut, probablement joué une fois, sur place ; pour un envol ou une lévitation.", + "en": "Upward take-off, probably played once, in place; for flying off or levitating." + } + }, + "fap_as_goforward": { + "clip": "AS_GoForward", + "nom": { + "fr": "Marche avant", + "en": "Walk forward" + }, + "categorie": "locomotion", + "accessoire": "", + "style": "neutre", + "usage": { + "fr": "Cycle de marche vers l'avant, probablement en boucle, joué sur place ; à combiner avec un déplacement du personnage.", + "en": "Forward walk cycle, probably looping, played in place; combine with a character movement." + } + }, + "fap_as_rest": { + "clip": "AS_Rest", + "nom": { + "fr": "Repos", + "en": "Rest" + }, + "categorie": "attente", + "accessoire": "", + "style": "neutre", + "usage": { + "fr": "Posture de repos debout, probablement en boucle, jouée sur place ; pose d'attente par défaut.", + "en": "Standing rest posture, probably looping, played in place; default waiting pose." + } + }, + "fap_as_rightlegkick2": { + "clip": "AS_RightLegKick2", + "nom": { + "fr": "Coup de pied droit", + "en": "Right leg kick" + }, + "categorie": "combat", + "accessoire": "", + "style": "agressif", + "usage": { + "fr": "Coup de pied de la jambe droite, probablement joué une fois, sur place ; pour un combat ou un entraînement.", + "en": "Right leg kick, probably played once, in place; for a fight or training scene." + } + }, + "fap_as_talk": { + "clip": "AS_Talk", + "nom": { + "fr": "Parler", + "en": "Talk" + }, + "categorie": "conversation", + "accessoire": "", + "style": "neutre", + "usage": { + "fr": "Personnage qui parle debout, probablement en boucle, joué sur place ; pour un dialogue ou une conversation.", + "en": "Character talking while standing, probably looping, played in place; for a dialogue or conversation." + } + } + } +} diff --git a/AnimSources/quaternius/pack.json b/AnimSources/quaternius/pack.json index 9ed1a9e..de652ff 100644 --- a/AnimSources/quaternius/pack.json +++ b/AnimSources/quaternius/pack.json @@ -12,6 +12,39 @@ "exclus": [ "A_TPose" ], + "chaine": { + "methode": "auto", + "profil_attendu": "ue4_mannequin", + "source": { + "type": "glb", + "fichier": "D:/Game/Universal Animation Library[Standard]/Unreal-Godot/UAL1_Standard.glb", + "import": "Tools/ImportQuaternius.py", + "clips": "/Game/Quaternius/UAL", + "maillage": "/Game/Quaternius/UAL/UAL1_Standard.UAL1_Standard", + "clip_reference": "A_TPose" + }, + "sortie": { + "clips": "/Game/Quaternius/UAL", + "rigs": "/Game/Quaternius/Retarget" + }, + "corps": [ + { + "nom": "Bridget", + "maillage": "/Game/Heavy/Daz/Bridget/bridget_gp.bridget_gp", + "prefixe": "B_", + "gabarit": "/Game/Heavy/Daz/Anims/Idle_F_Daz" + }, + { + "nom": "Michael", + "maillage": "/Game/Heavy/Daz/Michael/michael.michael", + "prefixe": "M_", + "gabarit": "/Game/Heavy/Daz/Anims/idle_Daz" + } + ], + "mod": "lpr_anim_quaternius", + "travail": "Saved/AnimPipeline/quaternius", + "sandbox": "Measurement" + }, "animations": { "qua_crouch_fwd_loop": { "clip": "Crouch_Fwd_Loop", diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini index 64f8ac2..3c6a7e9 100644 --- a/Config/DefaultGame.ini +++ b/Config/DefaultGame.ini @@ -1,7 +1,7 @@ [/Script/EngineSettings.GeneralProjectSettings] ProjectID=543F4F9E4DE525696C82F5A52303C15C ProjectName=LifePlay -ProjectVersion=2026.10.1.5 +ProjectVersion=2026.10.1.6 Description=Portage UE 5.5 - assets integres depuis LifePlay 5.9 Full Source [/Script/MoviePlayer.MoviePlayerSettings] @@ -47,6 +47,11 @@ bSkipMovies=False ; Tout /Game doit donc etre cuit, quelle que soit la methode d'empaquetage (ERR-026). +DirectoriesToAlwaysCook=(Path="/Game") +DirectoriesToNeverCook=(Path="/Game/Heavy/New/fBlah") +; Lot AP7 : dossiers de travail de la chaine d'animations (sources des packs, clips convertis, rigs) : livres par mods, jamais dans le jeu ++DirectoriesToNeverCook=(Path="/Game/Quaternius") ++DirectoriesToNeverCook=(Path="/Game/FreeAnimationsPack") ++DirectoriesToNeverCook=(Path="/Game/AnimPacks") ++DirectoriesToNeverCook=(Path="/Game/Retarget_ue5") ; Lot O1 : contenu des plugins limites a l'editeur (LifePlay.uproject, TargetAllowList Editor) : jamais cuit. +DirectoriesToNeverCook=(Path="/Interchange") +DirectoriesToNeverCook=(Path="/InterchangeAssets") diff --git a/Docs/Migration/20_Chaine_Animations.md b/Docs/Migration/20_Chaine_Animations.md index b0fd353..628caf9 100644 --- a/Docs/Migration/20_Chaine_Animations.md +++ b/Docs/Migration/20_Chaine_Animations.md @@ -12,20 +12,20 @@ pose ») et le mécanisme des mods d'assets (16_H3_Mods_Paquets.md). | Question | Situation aujourd'hui | Source | |---|---|---| | **Comment les animations entrent** | Un seul pack, importé à la main : `Tools/ImportQuaternius.py` lit un `.glb` à un chemin fixe (`D:/Game/Universal Animation Library[Standard]/…`) et écrit dans `/Game/Quaternius/UAL`. Un second pack (`Content/FreeAnimationsPack`, mannequin UE5) est présent mais n'est pas traité. | `ImportQuaternius.py` | -| **Comment le modèle est identifié** | Il ne l'est pas : la correspondance des os est écrite en dur deux fois, pour le seul couple « mannequin UE4 (Quaternius) → Genesis 8 » : en C++ (`Links`, `TSegs`, `TransferMaps`, `DazToT` dans `LPPoseMeasure.cpp`) et en Python (`SOURCE_CHAINS`, `DAZ_CHAINS` dans `RetargetQuaternius.py`). | | +| **Comment le modèle est identifié** | **Levé (AP7)** : `-run=LPAnimIdentify` (et `LPAnimMeasure::Identify`) compare les os du squelette aux profils `Tools/anim/profiles/*.json` (score par profil, os manquants, méthode associée) ; à égalité, le profil le plus complet l'emporte (le mannequin UE5 contient tous les noms UE4). Les tables ne sont plus en dur. | CHG-221 | | **Le pack contient-il un modèle de référence** | Quaternius : oui, `UAL1_Standard` (maillage, squelette, repos en pose T). FreeAnimationsPack : oui, `SKM_Manny` / `SKM_Quinn`, plus un clip `MM_T_Pose` et son propre `RTG_Mannequin`. | `Content/Quaternius/UAL`, `Content/FreeAnimationsPack/Demo` | | **Calques** | Le calque de pose (CHG-203) est le squelette cible posé par la formule, à partir du squelette source du pack : il utilise déjà le modèle de référence du pack (son squelette au repos), pas un modèle à nous. | mode Mesure du plugin `LPSandbox` (`LPSandboxMeasure*.cpp`, ex-`LPPairSandbox.cpp`) | -| **Conversion** | Retargeter Unreal généré par `RetargetQuaternius.py`, pose de retarget lue dans `Saved/Measurement/retarget_pose_.txt` (CHG-204). Écriture : entrée du mode Mesure (`Tools/debug/LifePlay_measure_sandbox.bat`, `Saved/sandbox_mode.txt` = `Mesure`) ou commandlet `-run=LPAnimEval` (`-PoseDir` = `Saved/Measurement` par défaut). Module de mesure : `LPAnimMeasure` dans l'addon `LifePlay-Sandbox` (plugin `LPSandbox`, lot S3). Les os *Twist* sont répartis après cuisson (`-run=LPAnimTwist`, AP3). | `RetargetQuaternius.py`, `21_Sandbox_Addon.md` | -| **Évaluation** | **Interactive :** tournée sandbox Mesure (`Saved/Measurement/tour.csv`, captures `tour/`, vignettes, planches ; CHG-202, AP6). **Headless :** `-run=LPAnimEval` (`LifePlayEditorTools`, dépend de `LPAnimMeasure`) — rapports sous `Saved/AnimPipeline//` ; contrôles indépendants AP4 (`controles_*.csv`, `rapport.json`). | CHG-206 à CHG-208, `S6-VAL.md` | +| **Conversion** | Retargeter généré par `Tools/anim/RetargetPack.py` (ex-`RetargetQuaternius.py`), piloté par `Saved/anim_retarget.json` ; la méthode (`ue4` pose T, `ue5` pose A, `genesis_direct`) est choisie par `-Methode=` ; pose de retarget écrite par `-run=LPAnimEval` (`-PoseDir`, `Saved/Measurement` par défaut) ou la sandbox Mesure ; os *Twist* répartis après cuisson (`-run=LPAnimTwist`). Module de mesure : `LPAnimMeasure` (addon `LifePlay-Sandbox`, `21_Sandbox_Addon.md`). | CHG-204, CHG-221, CHG-222 | +| **Évaluation** | **Interactive :** tournée sandbox Mesure (`tour.csv`, captures, vignettes, planches ; CHG-202, AP6). **Headless :** `-run=LPAnimEval` — rapports sous `Saved/AnimPipeline//`, contrôles AP4 (`controles_*.csv`, `rapport.json`). **Enchaînée (AP7) :** `Tools/anim/AnimPipeline.ps1` (`BuildMod.ps1 -Anim `) exécute identification, calque, conversion, évaluation, livraison et catalogue ; passé sur Quaternius et FreeAnimationsPack. | CHG-206 à CHG-208, CHG-223 | | **Livraison** | Les clips convertis sont dans le **contenu du jeu** (`/Game/Quaternius/UAL/B_*`, `M_*`), adressés par un chemin en dur (`LPAnimRedirect::ClipPath`). Ils ne passent pas par un mod. `BuildMod.ps1 -Retarget` ne vérifie que la présence d'une ligne de journal. | `LPAnimRedirect.cpp`, `BuildMod.ps1` | | **Appel depuis un scénario** | Un scénario désigne une animation par une clé courte : `ANIMATION: write` (`.lpaction`), `Actor.animate(martialart)` (`.lpscene`). Le jeu lui associe les assets `_F` (corps féminin) et `_M` (corps masculin), par exemple `Content/Heavy/New3/Anims/Daily/martialart_F` / `_M` ; la même convention sert aux paires de couple (`LPShowCoupleSubsystem`). Les clips convertis, nommés `B_` / `M_`, ne sont donc **pas appelables** par un scénario. Le jeu résout la clé par `Person::PlayDaily`, qui cherche dans `Room.Dailies` (tableau fixe de clips, sans registre d'assets) ; les clips des mods y sont ajoutés par `ULPModDailiesSubsystem` (CHG-209). | `vin_Base/Actions`, `vin_Base/Scenes` | | **Information pour le moddeur** | Aucune : pour connaître la durée, la posture ou l'usage d'un clip, il faut l'ouvrir dans l'éditeur. | | ### Écarts à combler -1. Pas d'identification du squelette : un pack Mixamo, UE5, CC4 ou Genesis 9 serait converti avec une table fausse. -2. Correspondance dupliquée (C++ et Python) : une modification oubliée d'un côté fausse le résultat sans erreur. -3. ~~La pose de retarget dépend d'une ouverture manuelle de la sandbox.~~ **Levé (AP2 / S6)** : `-run=LPAnimEval` écrit les mêmes fichiers sans fenêtre ; la sandbox reste utile pour le contrôle visuel. +1. ~~Pas d'identification du squelette : un pack Mixamo, UE5, CC4 ou Genesis 9 serait converti avec une table fausse.~~ **Levé (AP7)** : `LPAnimIdentify` et profils (CHG-221). +2. ~~Correspondance dupliquée (C++ et Python) : une modification oubliée d'un côté fausse le résultat sans erreur.~~ **Levé (AP1, CHG-205)** : profils JSON lus par le C++ et le Python. +3. ~~La pose de retarget dépend d'une ouverture manuelle de la sandbox.~~ **Levé (AP2 / S6, confirmé AP7)** : `-run=LPAnimEval` écrit les mêmes fichiers sans fenêtre ; la sandbox reste utile pour le contrôle visuel. 4. Torsion des membres non répartie entre *Bend* et *Twist* (peau de l'avant-bras). 5. Michael converti mais jamais mesuré. 6. Livraison hors mod : impossible de distribuer un pack sans recuire le jeu. @@ -56,6 +56,8 @@ déclarer sa conversion A → T dans son profil (comme les réglages Daz). Un co Seule la **table de correspondance** change d'un squelette à l'autre : elle devient une donnée (profil), plus du code. +**Méthodes de transformation (AP7).** Le convertisseur choisit un profil de transformation (`Tools/anim/methodes/*.json`, `-Methode=`) en quatre parties : 1) la pose du mannequin source, A ou T, est le calque d'origine ; 2) Bridget et Michael sont placés dans la même pose, le calque étant ajusté à leur morphologie ; 3) la méthode est choisie d'après le profil identifié ; 4) la transformation est appliquée. Méthodes : `ue4` (pose T, mannequin UE4 / Quaternius), `ue5` (pose A : calques = repos du mannequin UE5 et de Genesis, ajusté à la morphologie), `genesis_direct` (copie Daz, déclarée factice). Règle d'égalité : à score égal entre profils, le plus complet l'emporte (le mannequin UE5 contient tous les noms UE4 et était pris pour UE4 à 100 %). Pour UE5 la conversion se fait A → A : aucun angle A → T n'est inventé, les deux calques sont dans la même pose de repos. Borne des réglages : 30° pour le corps, 45° pour les doigts (`-SeuilReglageDoigts`), la main du mannequin UE5 étant au repos légèrement fermée (ajustement des doigts ≈ 31°). Voir CHG-221. + --- ## 3. Chaîne cible @@ -76,6 +78,8 @@ Rien n'est supprimé : un résultat précédent est déplacé dans `precedent__F` / `_M`, sous `//Anims/…` ; module texte `.lpmod` ; catalogue joint ; cuisson DLC, contrôle du conteneur et archive `.zip` (étapes existantes de `BuildMod`). La clé peut contenir `_` (coupure au dernier `_`, CHG-209) ; outil : `Tools\anim\DeliverAnims.ps1`. | Conteneur sans asset du jeu ; archive testée ; **essai de chargement** : jeu de test lancé avec le mod, chaque clé du catalogue appelée par `animate()` sur un personnage féminin et un masculin (journal). | +Réalisé par `Tools/anim/AnimPipeline.ps1` (CHG-223) ; ordre réel des étapes 6 et 7 : la livraison dans le mod précède les fiches et le catalogue, puis vient la cuisson DLC. + Le jeu résout les clés par `Room.Dailies` ; les clips des mods y sont ajoutés par `ULPModDailiesSubsystem` (CHG-209). `LPAnimRedirect` ne sert plus qu'à la sandbox et au personnage piloté. @@ -154,6 +158,6 @@ Le pilote refuse de livrer un mod dont le catalogue n'a pas été produit dans l | AP4 ✔ | Contrôles indépendants (§ 4) et rapport HTML | seuils étalonnés sur les 43 clips — **fait, CHG-208** (`-run=LPAnimEval`, `Tools/anim/RapportControles.py`) ; 0 rejeté, 8 clips à revoir (4 par corps : `Death01`, `Fixing_Kneeling`, `Roll` au sol, `Jump_Start` au saut) | | AP5 ✔ | Livraison en mod : clips renommés `_F` / `_M` sous `//Anims`, ajout à `Room.Dailies` et correctif de `Person::PlayDaily`, essai de chargement par `animate()` | jeu de test avec le mod Quaternius, clés appelées depuis un scénario d'essai — **fait, CHG-209** ; essai empaqueté reporté (nouvelle version de référence nécessaire) | | AP6 ✔ | Catalogue (§ 5) : fiches calculées, `pack.json`, vignettes, `catalogue.json` et `catalogue.html` | une fiche par clip, champs calculés relus sur 5 clips témoins (marche, assis, pistolet, danse, chute) — **fait, CHG-210** ; taille cuite en AP7 | -| AP7 | Pilote `AnimPipeline.ps1` + `BuildMod -Anim`, identification, deuxième pack (FreeAnimationsPack, mannequin UE5) | pack UE5 converti, évalué, catalogué et livré de bout en bout sans intervention | +| AP7 ✔ | Pilote `AnimPipeline.ps1` + `BuildMod -Anim`, identification, méthodes `ue4` / `ue5`, deuxième pack (FreeAnimationsPack, mannequin UE5) | pack UE5 converti, évalué, catalogué et livré de bout en bout sans intervention — **fait, CHG-221 à 224** ; cuisson DLC contre la version d'essai `2026.10.1.6` et essai en jeu empaqueté validés (CHG-224) | Chaque lot suit `10_Protocole_Operations.md` : instantané, journal `CHG`, retour arrière par `Restore.ps1`. diff --git a/Docs/Migration/21_Sandbox_Addon.md b/Docs/Migration/21_Sandbox_Addon.md index cf2e64c..7ab5881 100644 --- a/Docs/Migration/21_Sandbox_Addon.md +++ b/Docs/Migration/21_Sandbox_Addon.md @@ -117,12 +117,12 @@ D:\Game\ - **Liaison** : `LifePlay.uproject` déclare `"AdditionalPluginDirectories": ["../LifePlay-Sandbox/Plugins"]` (chemin relatif au `.uproject`) et active `LPSandbox` dans `Plugins`. UBT et l'éditeur y trouvent `LPSandbox.uplugin` (modules `LPSandbox` et `LPAnimMeasure`) ; les DLL du plugin sont compilées avec le jeu (`Build.bat LifePlayEditor Win64 Development`). - **Pourquoi pas un submodule** : l'addon est un `uproject` mince qui contient le plugin sous `Plugins/LPSandbox/`. Un submodule monté sur `Plugins/LPSandbox` du jeu donnerait `Plugins/LPSandbox/Plugins/LPSandbox/` (plugin imbriqué, non scanné au bon niveau) ; un submodule `External/LifePlay-Sandbox` dupliquerait l'addon à côté du sibling et rendrait ambigu l'exemplaire chargé. Un clone sibling évite les deux problèmes. -- **Pin** : le jeu consomme un commit précis de l'addon, consigné à la main dans `S3-INT.md` (aujourd'hui `f09c42e5a2bc613cf269cce76c878461ca41c8b7`, `main`, S7-T2 uplugin ; précédents : `c1fdd29e2c1036c7d6365ba6389eff5d2f8c8c96` S5-T2 `LPCoupleSim`, `f8102647ccdebad37e4977ccbf2c51e583823a80`, S4-T3). Le pin est mis à jour (hash dans `S3-INT.md` et README de l'addon) à chaque évolution de l'addon que le jeu doit prendre. Reproduire : +- **Pin** : le jeu consomme un commit précis de l'addon, consigné à la main dans `S3-INT.md` (aujourd'hui `a3b1b897715b05b22d75b79d53637e58b6698c2c`, `main`, AP7 méthodes de transformation et sandbox multi-pack ; précédents : `f09c42e5a2bc613cf269cce76c878461ca41c8b7` S7-T2 uplugin, `c1fdd29e2c1036c7d6365ba6389eff5d2f8c8c96` S5-T2 `LPCoupleSim`, `f8102647ccdebad37e4977ccbf2c51e583823a80`, S4-T3). Le pin est mis à jour (hash dans `S3-INT.md` et README de l'addon) à chaque évolution de l'addon que le jeu doit prendre. Reproduire : ```powershell cd D:\Game git clone https://github.com/edujiro5972/LifePlay-Sandbox.git -git -C LifePlay-Sandbox checkout f09c42e5a2bc613cf269cce76c878461ca41c8b7 +git -C LifePlay-Sandbox checkout a3b1b897715b05b22d75b79d53637e58b6698c2c # le jeu doit être cloné à côté : D:\Game\LifePlay-master 5.5 ``` diff --git a/Docs/Migration/Journal_Modifications.md b/Docs/Migration/Journal_Modifications.md index eb304dc..5c615f9 100644 --- a/Docs/Migration/Journal_Modifications.md +++ b/Docs/Migration/Journal_Modifications.md @@ -1131,6 +1131,10 @@ Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (sol | CHG-155 | 2026-10-05 | ShowCouple | Un lit est reconnu par son nom. Il ne bloque un déplacement que vers le bas, pour se poser ; le retour horizontal n'est plus arrêté et le contact ne renvoie plus la boîte | après avoir quitté le lit, la boîte ne pouvait plus y revenir | revenir au test `DoesPackageExist` et au filtre du flanc seul | | CHG-156 | 2026-10-05 | Clavier | `LPKeyboardSubsystem` : bouton « Clavier » ajouté à l'exécution dans `MainMenu.SettingsScrollBox` ; panneau pour changer, ajouter ou retirer une touche (actions et axes clavier). Écrit dans `Saved/Config/Windows`, pas dans `GameSettings.sav` | pouvoir réaffecter les touches, dont Q, sans modifier les Blueprints | retirer `LPKeyboardSubsystem.h/.cpp` et la dépendance `UMG` | | CHG-158 | 2026-10-05 | Réglages | `LPSettingsSubsystem` : onglets Audio, Video, Lewd, General, Keyboard, Misc au-dessus de `SettingsScrollBox`. Les lignes du Blueprint restent en place et sont montrées selon leur texte ; le reste va dans Misc. Keyboard affiche la liste des touches | la liste unique ne montrait pas le clavier | retirer `LPSettingsSubsystem.h/.cpp` | +| CHG-224 | 2026-10-07 | AP7 | Cuisson DLC et essai en jeu empaqueté. `Config/DefaultGame.ini` : `ProjectVersion=2026.10.1.6` (version de référence d'essai, non publiée) ; `+DirectoriesToNeverCook` pour `/Game/Quaternius`, `/Game/FreeAnimationsPack`, `/Game/AnimPacks`, `/Game/Retarget_ue5` (sources de travail, jamais dans le jeu). `Tools/anim/DeliverAnims.py` : à la copie dans le mod, les réglages de compression qui pointent sur `/Engine/` sont remis à vide (les clips d'un pack UE5 référençaient `/Engine/Animation/DefaultAnim*CompressionSettings` : cuisson DLC refusée) ; la compression par défaut du projet s'applique, comme pour Quaternius | lot AP7, étape 7. Empaquetage Shipping `2026.10.1.6` (`D:\Game\LifePlay_Build_5.5_Shipping_AP7\Windows`, `Releases/2026.10.1.6`) ; mods cuits contre cette version : `lpr_anim_quaternius` (84 paquets, zip 15 798 332 o), `lpr_anim_freeanims` (20 paquets, 0 référence moteur, zip 4 416 299 o) dans `D:\Game\LifePlay_Publication\Mods\` ; module d'essai `lpr_anim_essai` copié dans le seul jeu d'essai (hors du projet : `LifePlay_Backup_5.5/AP7/hors_build`). **Essai utilisateur en jeu empaqueté : animations jouées** (`qua_*`, `fap_*`, témoin `dance`) | `.\Tools\Restore.ps1 -Lot AP7` ; supprimer `D:\Game\LifePlay_Build_5.5_Shipping_AP7` et `Releases/2026.10.1.6` ; rien n'est commité dans le dépôt du jeu | +| CHG-223 | 2026-10-07 | AP7 | Pilote. `Tools/anim/AnimPipeline.ps1` (étapes 0 inventaire, 1 import, 2 identification, 3 calque, 4 conversion + torsion, 5 évaluation + rapport HTML + vignettes et planches par la sandbox, 6 livraison dans le mod + fiches + catalogue, 7 cuisson DLC ; rapport JSON par étape dans `Saved/AnimPipeline//etapes`, `etat.json`, arrêt au premier contrôle en échec, reprise `-From`, ancien contenu déplacé dans `precedent_`, `-DryRun`, `-SansCuisson`) ; `BuildMod.ps1 -Anim ` ; `pack.json` étendu (bloc `chaine` : méthode, profil attendu, source glb|uasset, sorties, corps et gabarits Daz `Idle_F_Daz` / `idle_Daz`, mod, dossier de travail, sortie sandbox) ; `AnimSources/freeanims/pack.json` (licence CC BY 4.0, auteur SoerGame, page Fab, page de l'auteur `url_auteur`, 10 animations déclarées) ; outils de livraison et de catalogue génériques (`DeliverAnims -Pipeline -Pack -Vignettes -Planches`, textes du mod et lien d'auteur tirés de `pack.json`, adresse de la source dans `CREDITS.txt`). Défauts corrigés pendant les passages réels : console `start /wait` restée ouverte (lancement par `cmd /c`), lancement de la sandbox par un tuyau qui attendait sa fermeture | lot AP7. Quaternius de bout en bout (reprises à l'étape 4 puis 5 après corrections) : mesures, verdicts, fiches et catalogue identiques au passage précédent (42 fiches, 42 vignettes, 42 planches) ; FreeAnimationsPack de bout en bout en 10 min, code 0 : mod `lpr_anim_freeanims` (10 clips × 2, `.lpmod` CC BY 4.0, crédits), catalogue de 10 fiches. Étape 7 (cuisson DLC) non faite : la version de référence `Releases/2026.10.1.5` (V1.5) ne contient ni le correctif de `Person` ni `LPModDailies` ; nouvel empaquetage à décider avec l'utilisateur | `.\Tools\Restore.ps1 -Lot AP7` (jeu) et `.\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox` (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu | +| CHG-222 | 2026-10-07 | AP7 | Conversion et sandbox. `Tools/RetargetQuaternius.py` déplacé en `Tools/anim/RetargetPack.py`, piloté par `Saved/anim_retarget.json` (méthode, maillage source, dossiers, corps, exclusions, dossier des poses ; défauts = Quaternius, noms d'assets inchangés ; rigs suffixés pour les autres méthodes) ; jeton de cuisson (BuildMod ne retient que les lignes `RETARGET … jeton `). `BuildMod.ps1` : chemins entre guillemets au lancement de l'éditeur (le dossier contient une espace ; l'éditeur se fermait sans journal), lecture complète des journaux modifiés depuis le lancement (l'ancienne lecture à partir de la taille du précédent `LifePlay.log` sautait la ligne de résultat), attente de fermeture de l'éditeur portée à 10 min, `-RetargetConfig`, `-Anim`. Addon `LifePlay-Sandbox` (commits `a3b1b89` puis `159afbf`, pin mis à jour dans `etat/sandbox/S3/S3-INT.md`, `21_Sandbox_Addon.md` et README de l'addon) : `[Sandbox.Pack]` + surcharge `Saved/sandbox_pack.ini` (mode Mesure seulement), `LPAnimRedirect::BodyClipPath`, clip initial du pack, tournée `vignettes planches quitter` (enchaînement et fermeture). Piège rencontré : des DLL périmées du plugin dans `LifePlay-Sandbox/Plugins/LPSandbox/Binaries` (même BuildId) étaient chargées à la place des neuves ; dossier déplacé (non supprimé) dans `LifePlay_Backup_5.5/AP7-addon/Binaries_perimes_2036` | lot AP7 : FreeAnimationsPack (10 clips) converti en `ue5` : 0 rejeté, 0 à revoir, écart 0,0006 %, torsion 0,015° ; **validé visuellement par l'utilisateur** dans la sandbox | `.\Tools\Restore.ps1 -Lot AP7` (jeu) et `.\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox` (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu | +| CHG-221 | 2026-10-07 | AP7 | Méthodes de transformation et identification du squelette. Profil `Tools/anim/profiles/ue5_mannequin.json` (SK_Mannequin UE5, colonne 5 os, cou 2, réglages A→T optionnels) ; méthodes `Tools/anim/methodes/ue4.json` (pose T, ex-« Quaternius »), `ue5.json` (pose A : calques = repos du mannequin UE5 et de Genesis, ajusté à la morphologie), `genesis_direct.json` (copie Daz, déclarée factice). Principe (demande de l'utilisateur) : 1) la pose du mannequin, A ou T, est le calque d'origine ; 2) Bridget et Michael sont placés dans la même pose, calque ajusté à leur morphologie ; 3) le convertisseur choisit le profil de transformation ; 4) application. Addon `LPAnimMeasure` : `SetMethod`, `MethodForProfile`, calque par méthode (`MakeTPose`), cache d'ajustement par méthode, identification à égalité → profil le plus complet (le mannequin UE5 contient tous les noms UE4 : il était pris pour UE4 à 100 %). Commandlets du jeu : `LPAnimIdentify` (nouveau : scores par profil, os manquants, squelette, méthode ; contrôle croisé avec le module de mesure), `-Methode=` sur `LPAnimEval` et `LPAnimTwist` (`Source/LifePlayEditorTools/LPAnimMethodSelect.h`), `-BodyClipDir`, `-Templates`, `-PoseOnly`, borne des réglages séparée pour les doigts `-SeuilReglageDoigts=45` (corps : 30 ; la main du mannequin UE5 est au repos légèrement fermée : ajustement des doigts ≈ 31°) | lot AP7 de `20_Chaine_Animations.md`. Non-régression : Quaternius en `auto` → `ue4`, toutes valeurs et verdicts identiques à AP4 (écart de torsion 4e-5°) | `.\Tools\Restore.ps1 -Lot AP7` (jeu) et `.\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox` (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu | | CHG-220 | 2026-10-06 | S8 | `Docs/Migration/22_Eval_Agents_Sandbox.md` (nouveau) ; `Docs/Migration/etat/sandbox/S8/S8-VAL.md` (nouveau) ; `Docs/Migration/21_Sandbox_Addon.md` (§ Acceptation : S8 coché, push addon coché, deux cases ouvertes ajoutées `BuildMod -Target` et commit côté jeu ; ligne S8 du tableau des lots) ; `Saved/Logs/S8-VAL-runtime-game.log` (copie locale, non versionnée) | lot S8-T1/T2 : bilan du mode multi-agents + multi-modèles sur S0–S7 (lots tenus / coupés, consignes et reprises, adéquation modèle ↔ fiche : 11 fiches sur 27 tracent le modèle réel, S3-T3 sous-classé, S2-T2 sur-classé ; erreurs de rôle ; friction git : submodule abandonné, jeu jamais commité, trois identités git) ; décision **GO conditionnel** et 3 recommandations (politique modèles tracée, clôture git par lot, séparation VAL / DOC + registre des reports) ; validation S8-VAL **PASS** : `Tools/debug/LifePlay_pair_sandbox.bat` lancé tel quel, plugin monté, `LPPairSandboxGameMode`, 16 lignes `LogLPSandbox`, boîte `AgMakeout` identique à S5 / S7-VAL, 0 crash ; constat : `origin/main` addon = `dae6206` (pin `f09c42e` poussé) | aucun changement de code C++ ni de configuration | retirer `22_Eval_Agents_Sandbox.md`, `etat/sandbox/S8/`, cette entrée ; rétablir § Acceptation et ligne S8 de doc 21 (état S7) | | CHG-219 | 2026-10-06 | S7 | `LifePlay.uproject` (plugin `LPSandbox` : `Optional: true`) ; repo addon `LifePlay-Sandbox` `Plugins/LPSandbox/LPSandbox.uplugin` (`SupportedTargetPlatforms: ["Win64"]`, module `LPSandbox` : `TargetConfigurationDenyList: ["Shipping"]`, description ; commit local `f09c42e`, non poussé) ; `Docs/Migration/21_Sandbox_Addon.md` (§ Acceptation, ligne S7, pin), `Docs/Migration/etat/sandbox/S3/S3-INT.md` (pin) ; `Docs/Migration/etat/sandbox/S7/S7-SPEC.md`, `S7-IMPL-L.md`, `S7-CART.md`, `S7-VAL.md` (nouveaux) ; `Saved/Logs/S7-VAL-*.log` (copies locales, non versionnées) | lot S7-T1..T4 : contrat d'isolation du plugin (aucun include / `LIFEPLAY_API` / module `LifePlay` : 0 résultat ; `Person` en lecture de CDO seule, aucun `GI` / `Room` ; chemins par config) ; `LPSandbox` exclu du Shipping (`TargetAllowList: ["Editor"]` rejeté : le sandbox tourne en `-game`), `LPAnimMeasure` conservé car requis par `LifePlay.Build.cs` ; validation S7-VAL **PASS** : build `LifePlayEditor Development` à jour, plan UBT Game Development (6 occurrences `LPSandbox`) / Shipping (0), smoke Pair ~1 min 45 s (boîte AgMakeout identique à S5-VAL, 0 crash) ; limites : pas de compilation Shipping complète, commit addon non poussé, `Optional` n'évite pas l'échec du build sans clone sibling | aucun changement de code C++ | `git revert f09c42e` dans l'addon, retirer `"Optional": true` du `.uproject`, remettre le pin `c1fdd29`, retirer `S7/`, § Acceptation et l'entrée journal | | CHG-218 | 2026-10-06 | S6 | `Docs/Migration/20_Chaine_Animations.md`, `Docs/Migration/09_Commandes_Utiles.md`, `Docs/Migration/21_Sandbox_Addon.md` (lot S6), `Docs/Migration/etat/sandbox/S6/S6-VAL.md` (nouveau) ; `Saved/AnimPipeline/S6-VAL/`, `Saved/Logs/S6-VAL-LPAnimEval.log` (copies locales, non versionnées) | lot S6-T1…T3 : confirmation que `LifePlayEditorTools.Build.cs` dépend déjà de `LPAnimMeasure` (module addon, aucun include cassé, 0 fichier `Source/LPAnimMeasure/`) ; build `LifePlayEditor Win64 Development` à jour ; doc chaîne animations et commandes alignées (plugin `LPSandbox`, bats `Tools/debug`, sorties `Saved/Measurement`, commandlets `LPAnimEval` / `LPAnimTwist` / `LPAnimCatalog`) ; validation S6-VAL **PASS** : `-run=LPAnimEval -Clips=Idle_Loop -Instants=1` (~1,3 s, code 0, `rapport.json` valide, `LogLPAnimMeasure` actif) ; bat Mesure non rejoué (déjà PASS en S2-VAL) | aucun changement de code C++ | retirer `S6-VAL.md`, entrée journal, rétablir les trois docs | diff --git a/LifePlay.uproject b/LifePlay.uproject index 1228961..16b975b 100644 --- a/LifePlay.uproject +++ b/LifePlay.uproject @@ -18,14 +18,14 @@ ] } ], - "AdditionalPluginDirectories": [ - "../LifePlay-Sandbox/Plugins" - ], "Plugins": [ { "Name": "LPSandbox", "Enabled": true, - "Optional": true + "Optional": true, + "SupportedTargetPlatforms": [ + "Win64" + ] }, { "Name": "ModdingExtra", @@ -201,6 +201,9 @@ ] } ], + "AdditionalPluginDirectories": [ + "../LifePlay-Sandbox/Plugins" + ], "TargetPlatforms": [ "Windows" ] diff --git a/ModSources/lpr_anim_freeanims/Module/Animations/catalogue.html b/ModSources/lpr_anim_freeanims/Module/Animations/catalogue.html new file mode 100644 index 0000000..a9da526 --- /dev/null +++ b/ModSources/lpr_anim_freeanims/Module/Animations/catalogue.html @@ -0,0 +1,106 @@ + + + + + +Animations — lpr_anim_freeanims + + + +
+

Animations — lpr_anim_freeanims

+
Version 1.0 — 10 animations — généré le 2026-10-07. Copiez la clé puis écrivez Actor.animate(clé) dans une scène ou ANIMATION: clé dans une action. Survolez une vignette pour voir le mouvement.
+
+ + + + +
+
+
+
Aucune animation ne correspond aux filtres.
+
+
Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay
+ + + + diff --git a/ModSources/lpr_anim_freeanims/Module/Animations/catalogue.json b/ModSources/lpr_anim_freeanims/Module/Animations/catalogue.json new file mode 100644 index 0000000..2cff1c0 --- /dev/null +++ b/ModSources/lpr_anim_freeanims/Module/Animations/catalogue.json @@ -0,0 +1,761 @@ +{ + "pack": "freeanims", + "mod": "lpr_anim_freeanims", + "version": "1.0", + "genere": "2026-10-07T02:38:49", + "nombre_animations": 10, + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "animations": [ + { + "cle": "fap_as_airkiss", + "appel": { + "script": "Actor.animate(fap_as_airkiss)", + "action": "ANIMATION: fap_as_airkiss" + }, + "nom": { + "fr": "Baiser envoyé", + "en": "Blow a kiss" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_airkiss_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_airkiss_M" + }, + "duree_s": 10.3, + "images": 310, + "planche": { + "fichier": "planches/fap_as_airkiss.jpg", + "images": 24, + "taille": 256, + "ips": 2.3 + }, + "cadence": 30, + "taille_ko": { + "feminin": 1262, + "masculin": 1253, + "total": 2515 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 36.57 + }, + "deplacement": { + "cm": 8, + "cm_s": 1, + "sens": "cote" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 100 + }, + "mains": { + "gauche": "repos", + "droite": "mouvement" + } + }, + "accessoire": "", + "categorie": "interaction", + "style": "détendu", + "usage": { + "fr": "Geste ponctuel (probablement joué une fois) d'envoi de baiser, joué sur place ; utile pour une scène de flirt ou d'adieu.", + "en": "One-shot gesture (probably played once) of blowing a kiss, played in place; useful for a flirting or farewell scene." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "FFBE444E7D7717C9DFD6FD4E3BD7DD706F8BB600E8AB05239CBEF9078652693A" + }, + { + "cle": "fap_as_attackinlevitation2", + "appel": { + "script": "Actor.animate(fap_as_attackinlevitation2)", + "action": "ANIMATION: fap_as_attackinlevitation2" + }, + "nom": { + "fr": "Attaque en lévitation", + "en": "Levitation attack" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_attackinlevitation2_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_attackinlevitation2_M" + }, + "duree_s": 7.07, + "images": 213, + "planche": { + "fichier": "planches/fap_as_attackinlevitation2.jpg", + "images": 24, + "taille": 256, + "ips": 3.4 + }, + "cadence": 30, + "taille_ko": { + "feminin": 944, + "masculin": 934, + "total": 1878 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 6.74 + }, + "deplacement": { + "cm": 6, + "cm_s": 1, + "sens": "cote" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 0, + "droite": 0 + }, + "mains": { + "gauche": "mouvement", + "droite": "levee" + } + }, + "accessoire": "", + "categorie": "magie", + "style": "agressif", + "usage": { + "fr": "Attaque lancée en lévitation, probablement jouée une fois, sur place ; pour un sort ou une attaque surnaturelle.", + "en": "Attack performed while levitating, probably played once, in place; for a spell or supernatural attack." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.01 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "D909B0E97115A819BCCA61CC8B1D4EE819DB91CF6D471EFCF8E87C6987E8D0F1" + }, + { + "cle": "fap_as_chilldriving", + "appel": { + "script": "Actor.animate(fap_as_chilldriving)", + "action": "ANIMATION: fap_as_chilldriving" + }, + "nom": { + "fr": "Conduite détendue", + "en": "Relaxed driving" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_chilldriving_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_chilldriving_M" + }, + "duree_s": 6.7, + "images": 202, + "planche": { + "fichier": "planches/fap_as_chilldriving.jpg", + "images": 24, + "taille": 256, + "ips": 3.6 + }, + "cadence": 30, + "taille_ko": { + "feminin": 908, + "masculin": 898, + "total": 1806 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 3.88 + }, + "deplacement": { + "cm": 1, + "cm_s": 0, + "sens": "sur place" + }, + "posture": { + "principale": "assis", + "posture_origine": "calculee", + "hauteur_assise_cm": 40 + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 100 + }, + "mains": { + "gauche": "repos", + "droite": "levee" + } + }, + "accessoire": "volant", + "categorie": "conduite", + "style": "détendu", + "usage": { + "fr": "Pose de conduite détendue, probablement en boucle, jouée sur place ; à utiliser avec un véhicule ou un volant.", + "en": "Relaxed driving pose, probably looping, played in place; to use with a vehicle or steering wheel." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "5A74F7DA765AB938991A14FFF3E77DB6A18C12D025D810D598DBDD936EB67E24" + }, + { + "cle": "fap_as_combohands", + "appel": { + "script": "Actor.animate(fap_as_combohands)", + "action": "ANIMATION: fap_as_combohands" + }, + "nom": { + "fr": "Enchaînement de poings", + "en": "Punch combo" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_combohands_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_combohands_M" + }, + "duree_s": 2.2, + "images": 67, + "planche": { + "fichier": "planches/fap_as_combohands.jpg", + "images": 24, + "taille": 256, + "ips": 10.9 + }, + "cadence": 30, + "taille_ko": { + "feminin": 517, + "masculin": 507, + "total": 1025 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 56.24 + }, + "deplacement": { + "cm": 2, + "cm_s": 1, + "sens": "sur place" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 93 + }, + "mains": { + "gauche": "mouvement", + "droite": "mouvement" + } + }, + "accessoire": "", + "categorie": "combat", + "style": "agressif", + "usage": { + "fr": "Enchaînement de coups de poing, probablement joué une fois, sur place ; pour une bagarre ou un entraînement.", + "en": "Sequence of punches, probably played once, in place; for a fight or training scene." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "012073AFF1B80B99F9C15CBAA1BA428CCCB1B16C3C21746E3182956A4BE967A4" + }, + { + "cle": "fap_as_eatingonparty", + "appel": { + "script": "Actor.animate(fap_as_eatingonparty)", + "action": "ANIMATION: fap_as_eatingonparty" + }, + "nom": { + "fr": "Manger en soirée", + "en": "Eating at party" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_eatingonparty_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_eatingonparty_M" + }, + "duree_s": 23.7, + "images": 712, + "planche": { + "fichier": "planches/fap_as_eatingonparty.jpg", + "images": 24, + "taille": 256, + "ips": 1.0 + }, + "cadence": 30, + "taille_ko": { + "feminin": 2581, + "masculin": 2571, + "total": 5152 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 19.28 + }, + "deplacement": { + "cm": 10, + "cm_s": 0, + "sens": "cote" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 100 + }, + "mains": { + "gauche": "repos", + "droite": "mouvement" + } + }, + "accessoire": "", + "categorie": "interaction", + "style": "détendu", + "usage": { + "fr": "Personnage mangeant debout lors d'une soirée, probablement en boucle, joué sur place ; pour un buffet ou une fête.", + "en": "Character eating while standing at a party, probably looping, played in place; for a buffet or party scene." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "8D06644A66882A9CD6A5D9CF112353409FADAF453A397DBBAC99E177C0753FBA" + }, + { + "cle": "fap_as_flyingup", + "appel": { + "script": "Actor.animate(fap_as_flyingup)", + "action": "ANIMATION: fap_as_flyingup" + }, + "nom": { + "fr": "Envol", + "en": "Take off" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_flyingup_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_flyingup_M" + }, + "duree_s": 2.7, + "images": 82, + "planche": { + "fichier": "planches/fap_as_flyingup.jpg", + "images": 24, + "taille": 256, + "ips": 8.9 + }, + "cadence": 30, + "taille_ko": { + "feminin": 514, + "masculin": 504, + "total": 1018 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 68.13 + }, + "deplacement": { + "cm": 2, + "cm_s": 1, + "sens": "sur place" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 43, + "droite": 43 + }, + "mains": { + "gauche": "levee", + "droite": "levee" + } + }, + "accessoire": "", + "categorie": "magie", + "style": "neutre", + "usage": { + "fr": "Décollage vers le haut, probablement joué une fois, sur place ; pour un envol ou une lévitation.", + "en": "Upward take-off, probably played once, in place; for flying off or levitating." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "327291EFF0B154B719CE85A07AD11B4DED45F4DB16787A5DE1BA3960092BA8C6" + }, + { + "cle": "fap_as_goforward", + "appel": { + "script": "Actor.animate(fap_as_goforward)", + "action": "ANIMATION: fap_as_goforward" + }, + "nom": { + "fr": "Marche avant", + "en": "Walk forward" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_goforward_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_goforward_M" + }, + "duree_s": 3.37, + "images": 102, + "planche": { + "fichier": "planches/fap_as_goforward.jpg", + "images": 24, + "taille": 256, + "ips": 7.1 + }, + "cadence": 30, + "taille_ko": { + "feminin": 579, + "masculin": 569, + "total": 1149 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 4.29 + }, + "deplacement": { + "cm": 0, + "cm_s": 0, + "sens": "sur place" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 100 + }, + "mains": { + "gauche": "mouvement", + "droite": "levee" + } + }, + "accessoire": "", + "categorie": "locomotion", + "style": "neutre", + "usage": { + "fr": "Cycle de marche vers l'avant, probablement en boucle, joué sur place ; à combiner avec un déplacement du personnage.", + "en": "Forward walk cycle, probably looping, played in place; combine with a character movement." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "44363245CBE7C209178B3292D49B97B43F2DF0DBCC4FBC5B58EA230B8C48E469" + }, + { + "cle": "fap_as_rest", + "appel": { + "script": "Actor.animate(fap_as_rest)", + "action": "ANIMATION: fap_as_rest" + }, + "nom": { + "fr": "Repos", + "en": "Rest" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_rest_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_rest_M" + }, + "duree_s": 11.47, + "images": 345, + "planche": { + "fichier": "planches/fap_as_rest.jpg", + "images": 24, + "taille": 256, + "ips": 2.1 + }, + "cadence": 30, + "taille_ko": { + "feminin": 1377, + "masculin": 1357, + "total": 2734 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 4.26 + }, + "deplacement": { + "cm": 1, + "cm_s": 0, + "sens": "sur place" + }, + "posture": { + "principale": "allonge", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 100 + }, + "mains": { + "gauche": "repos", + "droite": "repos" + } + }, + "accessoire": "", + "categorie": "attente", + "style": "neutre", + "usage": { + "fr": "Posture de repos debout, probablement en boucle, jouée sur place ; pose d'attente par défaut.", + "en": "Standing rest posture, probably looping, played in place; default waiting pose." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "513BEEE6DC9431E52D66DC07D26C88621C6A6DFF465DEF42F81E711E2A5AE3DF" + }, + { + "cle": "fap_as_rightlegkick2", + "appel": { + "script": "Actor.animate(fap_as_rightlegkick2)", + "action": "ANIMATION: fap_as_rightlegkick2" + }, + "nom": { + "fr": "Coup de pied droit", + "en": "Right leg kick" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_rightlegkick2_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_rightlegkick2_M" + }, + "duree_s": 1.1, + "images": 34, + "planche": { + "fichier": "planches/fap_as_rightlegkick2.jpg", + "images": 13, + "taille": 256, + "ips": 11.8 + }, + "cadence": 30, + "taille_ko": { + "feminin": 387, + "masculin": 377, + "total": 764 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 55.01 + }, + "deplacement": { + "cm": 11, + "cm_s": 10, + "sens": "avant" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 0, + "droite": 38 + }, + "mains": { + "gauche": "mouvement", + "droite": "mouvement" + } + }, + "accessoire": "", + "categorie": "combat", + "style": "agressif", + "usage": { + "fr": "Coup de pied de la jambe droite, probablement joué une fois, sur place ; pour un combat ou un entraînement.", + "en": "Right leg kick, probably played once, in place; for a fight or training scene." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.0 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "FA818881DD479BA94192C8C1BA8A8220E0E2D94432D1E04E12E59F998F0129F0" + }, + { + "cle": "fap_as_talk", + "appel": { + "script": "Actor.animate(fap_as_talk)", + "action": "ANIMATION: fap_as_talk" + }, + "nom": { + "fr": "Parler", + "en": "Talk" + }, + "assets": { + "feminin": "/lpr_anim_freeanims/Anims/Female/fap_as_talk_F", + "masculin": "/lpr_anim_freeanims/Anims/Male/fap_as_talk_M" + }, + "duree_s": 14.07, + "images": 423, + "planche": { + "fichier": "planches/fap_as_talk.jpg", + "images": 24, + "taille": 256, + "ips": 1.7 + }, + "cadence": 30, + "taille_ko": { + "feminin": 1633, + "masculin": 1623, + "total": 3256 + }, + "taille_cuite": false, + "boucle": { + "oui": false, + "ecart_pct": 28.35 + }, + "deplacement": { + "cm": 2, + "cm_s": 0, + "sens": "sur place" + }, + "posture": { + "principale": "debout", + "posture_origine": "calculee" + }, + "contacts": { + "pieds_au_sol_pct": { + "gauche": 100, + "droite": 100 + }, + "mains": { + "gauche": "mouvement", + "droite": "mouvement" + } + }, + "accessoire": "", + "categorie": "conversation", + "style": "neutre", + "usage": { + "fr": "Personnage qui parle debout, probablement en boucle, joué sur place ; pour un dialogue ou une conversation.", + "en": "Character talking while standing, probably looping, played in place; for a dialogue or conversation." + }, + "corps": [ + "feminin", + "masculin" + ], + "qualite": { + "verdict": "accepté", + "motifs": [], + "pire_brut_pct": 0.0, + "pire_torsion_deg": 0.01 + }, + "source": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "licence": "CC BY 4.0", + "credit": "Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay", + "version": "1.0", + "empreinte": "5C9CB1D57C27D542A2DC131F4C53EDA4171BD96F8FD5B9CD831566AA86563A75" + } + ] +} diff --git a/ModSources/lpr_anim_freeanims/Module/CREDITS.txt b/ModSources/lpr_anim_freeanims/Module/CREDITS.txt new file mode 100644 index 0000000..15aa2ed --- /dev/null +++ b/ModSources/lpr_anim_freeanims/Module/CREDITS.txt @@ -0,0 +1,2 @@ +Credits and licenses of the assets in Free Animations Pack (SoerGame, Fab ; mannequin UE5) (one line per asset: title, author, license, source URL, changes). +- Animations : Free Animations Pack par SoerGame (Fab), licence Creative Commons Attribution (CC BY 4.0), converties pour LifePlay, https://www.fab.com/listings/9e93d929-36e8-45f9-b925-325db1b9385d . Changes: retargeted to the Genesis 8 skeletons (Bridget, Michael), renamed fap__F / fap__M. diff --git a/ModSources/lpr_anim_freeanims/Module/lpr_anim_freeanims.lpmod b/ModSources/lpr_anim_freeanims/Module/lpr_anim_freeanims.lpmod new file mode 100644 index 0000000..a5997ef --- /dev/null +++ b/ModSources/lpr_anim_freeanims/Module/lpr_anim_freeanims.lpmod @@ -0,0 +1,12 @@ +MODULE_UNIQUEID: lpr_anim_freeanims +MODULE_NAME: Free Animations Pack (SoerGame, Fab ; mannequin UE5) +MODULE_AUTHOR: LifePlay Revival (animations by SoerGame) +MODULE_LINK: https://github.com/edujiro5972/LifePlay-Revival +MODULE_DESCRIPTION: Free animation clips from Free Animations Pack (SoerGame, Fab ; mannequin UE5) (CC BY 4.0), retargeted for LifePlay +MODULE_REQUIREMENTS: vin_Base +MODULE_VERSION: 1.0 +MODULE_CREATED: 2026-10-07 +MODULE_LICENSE: CC BY 4.0 +MODULE_AUTHOR_LINK: https://www.fab.com/sellers/SoerGame +MODULE_PRICE: Free +MODULE_DEFAULT_ENABLED: true diff --git a/ModSources/lpr_anim_freeanims/lpr_anim_freeanims.uplugin b/ModSources/lpr_anim_freeanims/lpr_anim_freeanims.uplugin new file mode 100644 index 0000000..6680103 --- /dev/null +++ b/ModSources/lpr_anim_freeanims/lpr_anim_freeanims.uplugin @@ -0,0 +1,13 @@ +{ + "FileVersion": 3, + "Version": 1, + "VersionName": "1.0", + "FriendlyName": "Free Animations Pack (SoerGame, Fab ; mannequin UE5)", + "Description": "Free animation clips from Free Animations Pack (SoerGame, Fab ; mannequin UE5) (CC BY 4.0), retargeted for LifePlay", + "Category": "LifePlay Mods", + "CreatedBy": "LifePlay Revival (animations by SoerGame)", + "CanContainContent": true, + "IsBetaVersion": false, + "Installed": false, + "CreatedByURL": "https://www.fab.com/sellers/SoerGame" +} diff --git a/ModSources/lpr_anim_quaternius/Module/Animations/catalogue.html b/ModSources/lpr_anim_quaternius/Module/Animations/catalogue.html index 2b93620..3d5211b 100644 --- a/ModSources/lpr_anim_quaternius/Module/Animations/catalogue.html +++ b/ModSources/lpr_anim_quaternius/Module/Animations/catalogue.html @@ -35,7 +35,7 @@ footer{max-width:1200px;margin:0 auto;padding:0 16px 24px;color:var(--mut);font-

Animations — lpr_anim_quaternius

-
Version 1.0 — 42 animations — généré le 2026-10-06. Copiez la clé puis écrivez Actor.animate(clé) dans une scène ou ANIMATION: clé dans une action. Survolez une vignette pour voir le mouvement.
+
Version 1.0 — 42 animations — généré le 2026-10-07. Copiez la clé puis écrivez Actor.animate(clé) dans une scène ou ANIMATION: clé dans une action. Survolez une vignette pour voir le mouvement.
@@ -47,7 +47,7 @@ footer{max-width:1200px;margin:0 auto;padding:0 16px 24px;color:var(--mut);font-
Aucune animation ne correspond aux filtres.
Animations : Universal Animation Library (Standard) par Quaternius, licence CC0 1.0, https://quaternius.com
- +