LifePlay-Revival/Source/LifePlay/LPHairstyleSubsystem.h
edujiro5972 bac557d829 H2 : liste de base des coiffures dans vin_Base/Hairstyles/vin_Base.lphair
Table reconstruite depuis le fichier (MODE: BASE) puis coiffures des modules ;
verification -LPVerifyHairstyles : table et morphs identiques au Blueprint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:21:16 +02:00

83 lines
3.6 KiB
C++

// Portage UE 5.5 - lots H1 et H2 (Docs/Migration/11_Audit_Optimisation.md §16.7 et §16.9).
//
// La liste des coiffures du jeu est la valeur par defaut de GI.HairstyleTable (126 entrees ecrites dans le Blueprint),
// avec GI.MorphableHairs (morph d'ajustement par coiffure) : un mod ne pouvait pas y toucher. Ce sous-systeme lit les
// fichiers texte Modules/<module>/**/*.lphair. Un fichier peut decrire plusieurs coiffures : chaque ligne HAIRSTYLE
// ouvre une entree, les lignes suivantes la completent.
//
// HAIRSTYLE: /Game/Heavy/New5/Hairs/Exemple.Exemple chemin complet d'un SkeletalMesh (squelette Genesis 8),
// ou NONE (option "sans cheveux")
// SEX: F F ou M (defaut F)
// DAZ: true defaut true ; false = coiffure "legacy", chargee seulement
// si GI.LegacyPercentage > 0
// FIT_MORPH: Exemple__AllExpand 0.45 facultatif : morph applique par Person.FitMorphableHair
// MORPHABLE: Cle [Morph Valeur] entree brute de GI.MorphableHairs (fichier de base)
// MODE: BASE fichier de base (H2) : la table est reconstruite a partir de
// ce fichier, dans son ordre, avant l'ajout des autres modules
//
// Sans fichier de base, les coiffures sont ajoutees en fin de la table du Blueprint (H1). Les coiffures des modules
// sont controlees (SkeletalMesh present, pas de doublon) ; celles du fichier de base sont reprises telles quelles,
// comme dans le Blueprint (35 coiffures "legacy" absentes du projet depuis 4.27 y figurent).
// Les modules desactives dans GI.ModEnableds sont ignores ; la table est reconstruite quand cette liste change.
// Option -LPVerifyHairstyles : la table et les morphs construits depuis le fichier de base sont compares a ceux du
// Blueprint (texte exporte), avant l'ajout des modules.
#pragma once
#include "CoreMinimal.h"
#include "Containers/Ticker.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "LPHairstyleSubsystem.generated.h"
UCLASS()
class LIFEPLAY_API ULPHairstyleSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
private:
struct FHairDef
{
FString File;
FString Module;
FString Path;
bool bNone = false;
bool bMale = false;
bool bDaz = true;
FString FitMorph;
FString FitValue;
};
struct FMorphDef
{
FString Key;
FString Morph;
FString Value;
};
bool Tick(float DeltaTime);
/** Releve des fichiers .lphair (une fois : les fichiers de Modules ne changent pas en cours de partie). */
void ScanFiles();
void ParseFile(const FString& Relative, const FString& Module, const FString& Text);
/** Reconstruit la table : base (fichier MODE: BASE ou Blueprint) puis coiffures des modules actifs. */
void Sync();
FString EnabledSignature() const;
bool IsModuleEnabled(const FString& Module) const;
FTSTicker::FDelegateHandle TickHandle;
double NextCheck = 0.0;
FString LastSignature;
/** Coiffures et morphs du fichier de base, dans l'ordre. */
FString BaseFile;
TArray<FHairDef> BaseDefs;
TArray<FMorphDef> BaseMorphs;
/** Coiffures des autres fichiers. */
TArray<FHairDef> Defs;
/** Table et morphs du Blueprint, captures au premier passage (texte exporte, pour revenir a la base sans fichier). */
FString BlueprintTableText;
FString BlueprintMorphsText;
bool bCaptured = false;
};