LifePlay-Revival/Source/LifePlay/LPStringCompat.h
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

61 lines
4 KiB
C++

// Portage UE 5.5 (2026.9 beta) - correctif CX-B08 (ERR-027).
//
// UE 5.x a reecrit FString::ParseIntoArray sur UE::String::ParseTokens. Deux comportements
// ont change par rapport a UE4, sans aucun avertissement :
// 1. chaine source vide, CullEmpty=false : UE4 renvoie [] ; UE5 renvoie [""] ;
// 2. recherche du separateur : UE4 respecte la casse (FCString::Strstr) ; UE5 l'ignore.
//
// Le cas 1 casse generatePerson() sans argument : "()" donne Presets=[""], GeneratePerson
// charge alors les 141 presets (suffixe "" + ".lpcharacter") et finit sur un corps legacy
// jamais charge -> personnage invisible et devetu.
//
// ULPStringCompat::ParseIntoArray reproduit a l'identique l'algorithme UE4 (source UE4,
// Runtime/Core/Private/Containers/String.cpp, FString::ParseIntoArray). Ses parametres et
// ses valeurs par defaut sont ceux de UKismetStringLibrary::ParseIntoArray, pour que les noeuds
// existants rebranches lors du portage 5.5 (outil retire en U2, voir l'historique git) gardent leurs liaisons.
//
// Correctif CX-B12 (lot L7i) : FString::Find avec une sous-chaine VIDE, recherche insensible a la
// casse depuis le debut (mode par defaut des noeuds Contains, Find Substring et Split) :
// - UE4 : FCString::Stristr cherche le caractere nul final et ne le trouve jamais -> INDEX_NONE ;
// - UE 5.5 : TCString::Strnistr renvoie le debut de la chaine -> 0.
// "Contains(x, "")" est donc faux en UE4 et vrai en 5.5. Les autres modes (sensible a la casse,
// depuis la fin) donnent le meme resultat dans les deux moteurs. Contains, FindSubstring et Split
// ci-dessous reprennent les parametres des fonctions de UKismetStringLibrary et appliquent la regle UE4
// (semantique UE4 conservee en 5.8).
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "LPStringCompat.generated.h"
UCLASS()
class LIFEPLAY_API ULPStringCompat : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
/** ParseIntoArray avec le comportement exact de UE4 (voir en-tete du fichier). */
UFUNCTION(BlueprintPure, Category = "Utilities|String", meta = (DisplayName = "Parse Into Array (UE4)"))
static TArray<FString> ParseIntoArray(const FString& SourceString, const FString& Delimiter = FString(TEXT(" ")), const bool CullEmptyStrings = true);
/** FindSubstring avec le comportement de UE4 pour une sous-chaine vide (voir en-tete). */
UFUNCTION(BlueprintPure, Category = "Utilities|String", meta = (DisplayName = "Find Substring (UE4)"))
static int32 FindSubstring(const FString& SearchIn, const FString& Substring, bool bUseCase = false, bool bSearchFromEnd = false, int32 StartPosition = -1);
/** Contains avec le comportement de UE4 pour une sous-chaine vide (voir en-tete). */
UFUNCTION(BlueprintPure, Category = "Utilities|String", meta = (DisplayName = "Contains (UE4)"))
static bool Contains(const FString& SearchIn, const FString& Substring, bool bUseCase = false, bool bSearchFromEnd = false);
/** Split avec le comportement de UE4 pour un separateur vide (voir en-tete). */
UFUNCTION(BlueprintPure, Category = "Utilities|String", meta = (DisplayName = "Split (UE4)"))
static bool Split(const FString& SourceString, const FString& InStr, FString& LeftS, FString& RightS, ESearchCase::Type SearchCase = ESearchCase::IgnoreCase, ESearchDir::Type SearchDir = ESearchDir::FromStart);
/** Element Index du tableau, ou chaine vide s'il n'existe pas : meme valeur que « Get (a copy) » hors bornes,
* sans l'avertissement au journal. Lot STB-GIB (lignes de donnees a champs manquants, STA-T2c R03 / R04). */
UFUNCTION(BlueprintPure, Category = "Utilities|String", meta = (DisplayName = "Get String At Or Empty"))
static FString GetStringAtOrEmpty(const TArray<FString>& Array, int32 Index);
/** FString::Find de UE4 : seul ecart avec UE 5.5, la sous-chaine vide en mode insensible a la casse depuis le debut. */
static int32 FindUE4(const FString& Str, const FString& SubStr, ESearchCase::Type SearchCase, ESearchDir::Type SearchDir, int32 StartPosition = INDEX_NONE);
};