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

105 lines
4.1 KiB
C++

// Marche du personnage et invites de proximite.
//
// LeftRight et DownUp restent la vue de dessus (BPs/PC : LeftRightBirdView, DownUpBirdview).
// La marche lit deux axes neufs, MoveForward et MoveRight. Elle ne tourne pas quand un menu
// a le clavier (reglages, journal, panneau Clavier, saisie de texte).
//
// Les invites viennent des textes des modules : WHERE contenant interaction, et les fichiers
// .lpnear (MESH, PROMPT, ACTION). La liste est tenue ici, sur la personne ou le maillage le
// plus proche, et elle reste cachee. E l'affiche ; un second E, ou un clic, lance l'action.
// Le personnage n'est pas possede : la marche active bRunPhysicsWithNoController.
// La marche du jeu ne joue un cycle que si LPAnimTarget.ini vaut game (clips B_ / M_).
// sandbox laisse le corps au Blueprint. La camera suiveuse n'est pas branchee.
// Aucun Blueprint n'est modifie.
#pragma once
#include "CoreMinimal.h"
#include "Animation/AnimationAsset.h"
#include "Camera/CameraActor.h"
#include "Containers/Ticker.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "LPDirectControlSubsystem.generated.h"
class AActor;
UCLASS()
class LIFEPLAY_API ULPDirectControlSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
void ActivatePrompt(int32 Index);
void HighlightPrompt(int32 Index);
private:
bool Tick(float DeltaTime);
void RefreshIndex();
void RefreshTarget();
void Walk(float DeltaTime);
void FollowCamera(APawn* Pawn, APlayerController* PC, float DeltaTime, bool bMoving);
void WalkAnim(ACharacter* Character, float Speed);
void RestoreAnim();
void PollInteract();
void ShowPrompts();
void HidePrompts();
void WitnessMoveKeys(float DeltaTime);
void WatchSeatRelease(float DeltaTime);
void FitPersonBounds(float DeltaTime);
FTSTicker::FDelegateHandle TickHandle;
float MenuDelay = 0.f;
float IndexDelay = 0.f;
float TargetDelay = 0.f;
bool bMenuBlocks = false;
FString LastEnabled;
bool bIndexed = false;
FString ShownSignature;
int32 Selected = 0;
bool bPromptOpen = false;
TWeakObjectPtr<AActor> CurrentTarget;
bool bCurrentIsPerson = false;
// KO3b / KO3c : composants de Room dont le joueur doit sortir (sa capsule y etait) : Pawn en Ignore jusqu'a la sortie de chacun.
TArray<TWeakObjectPtr<class UPrimitiveComponent>> EscapeVolumes;
// KO3c : temps pendant lequel le joueur pousse (ZQSD) sans avancer.
float StuckTime = 0.f;
// M1e (STG-COMMUN6-DIAG) : temoin des touches de marche vues par Slate, cause du blocage par menu (vide : aucun), dernier
// blocage journalise, delai entre deux lignes de temoin.
TSharedPtr<class IInputProcessor> MoveWitness;
FString MenuWhy;
FString LoggedMenuWhy;
float MoveLogDelay = 0.f;
// C6-b : etat journalise de la boite Scene_C presente sans contenu visible.
bool bLoggedEmptyScene = false;
// C7-a (STG-COMMUN7-DIAG A) : place du joueur au tick precedent ; place liberee par un Blueprint sans marche, en attente depuis
// PendingSeatTime secondes (negatif : rien en attente).
TWeakObjectPtr<UObject> LastSeat;
TWeakObjectPtr<class UPrimitiveComponent> PendingSeat;
float PendingSeatTime = -1.f;
// B2q-a / T-cull (STG-B2q-DIAG) : delai du balayage des Person (0,5 s), delai de l'alerte T-cull (1 s), meuble deja mesure par personne.
float BoundsDelay = 0.f;
float CullAlertDelay = 0.f;
TMap<TWeakObjectPtr<AActor>, TWeakObjectPtr<UObject>> MeasuredSeats;
// B2q-b1 : echelle d'origine des bornes de chaque corps, relevee a la premiere vue (plancher du facteur).
TMap<TWeakObjectPtr<class UPrimitiveComponent>, float> OriginalBoundsScale;
// M-Z (STG-COMMUN9-DIAG) : nombre de balayages consecutifs ou une Person debout sans meuble a un maillage hors de sa hauteur de gabarit.
TMap<TWeakObjectPtr<AActor>, int32> MeshZScans;
UPROPERTY()
TObjectPtr<ACameraActor> FollowView;
UPROPERTY()
TObjectPtr<AActor> BirdView;
UPROPERTY()
TObjectPtr<UClass> SavedAnimClass;
UPROPERTY()
TObjectPtr<UAnimationAsset> SavedSingleAnim;
uint8 SavedAnimMode = 0;
bool bAnimCaptured = false;
};