// 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 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> 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 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 LastSeat; TWeakObjectPtr 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> MeasuredSeats; // B2q-b1 : echelle d'origine des bornes de chaque corps, relevee a la premiere vue (plancher du facteur). TMap, 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, int32> MeshZScans; UPROPERTY() TObjectPtr FollowView; UPROPERTY() TObjectPtr BirdView; UPROPERTY() TObjectPtr SavedAnimClass; UPROPERTY() TObjectPtr SavedSingleAnim; uint8 SavedAnimMode = 0; bool bAnimCaptured = false; };