LifePlay-Revival/Source/LifePlay/LPCityWaterSubsystem.h

73 lines
2.9 KiB
C
Raw Normal View History

// Lot STM1 (STM1-SPEC-03 § 2.6, pilote O-B) : pose en jeu du maillage d'eau d'une ville.
//
// Les cartes StreetMap n'ont pas d'eau (STM1-CART-03) ; en mode carte par defaut, le sol de pave de MapMarkers recouvre les
// fleuves. Ce sous-systeme pose /Game/Heavy/StreetMap/Water/<Ville> (cree par le commandlet LPBuildCityWater) sur l'acteur
// de la carte, 2 cm au-dessus du plan de pave (composant Plane de MapMarkers, Z lu en jeu) ; visible aussi en mode classique.
// Lecture seule du GameInstance par reflexion (GI.StreetMapStatic) : aucun Blueprint ni GI modifie. Ville sans asset d'eau :
// composant masque. Une ligne [LPCity] (LogLPCity) a chaque pose. Present aussi en Shipping (rendu du jeu).
// STM1-SPEC-08 (O2, option D) : masque aussi, a l'echelle 0, les maisons generiques (House*, Skyscraper*) de MapMarkers
// posees aux centres de /Game/Heavy/StreetMap/Water/<Ville>_Mask ; arbres et jeeps non touches ; indices conserves.
#pragma once
#include "CoreMinimal.h"
#include "Containers/Ticker.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "LPCityWaterSubsystem.generated.h"
class AActor;
class ULPCityWaterMask;
class UStaticMeshComponent;
UCLASS()
class LIFEPLAY_API ULPCityWaterSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
private:
bool Tick(float DeltaTime);
/** Pose ou masque l'eau pour le maillage de carte courant. */
void UpdateWater(AActor* Street, UStaticMeshComponent* MapComp);
/** Z monde du plan de pave de MapMarkers ; false si introuvable (acteur pas encore cree). */
bool FindPlaneZ(const UWorld* World, double& OutZ) const;
/** STM1-SPEC-08 (O2) : charge le masque <Ville>_Mask de la carte courante (ou le vide). */
void LoadMask(const FString& City);
/** STM1-SPEC-08 (O2) : masque (echelle 0) les maisons generiques de MapMarkers posees aux centres du masque. */
void HideHousesInWater(UStaticMeshComponent* MapComp, bool bForce);
FTSTicker::FDelegateHandle TickHandle;
/** Maillage de carte deja traite (chemin), pour ne poser qu'au changement. */
FString LastMapMesh;
/** Pose faite avec le repli de hauteur : a corriger des que le plan de MapMarkers apparait. */
bool bUsedFallbackZ = false;
/** Secondes passees a attendre le plan avant le repli. */
double WaitPlaneSeconds = 0.0;
UPROPERTY(Transient)
TObjectPtr<UStaticMeshComponent> WaterComponent;
/** Masque de la carte courante (nul si la ville n'en a pas). */
UPROPERTY(Transient)
TObjectPtr<ULPCityWaterMask> Mask;
/** Centres du masque ranges par case de 1 m (indice dans Mask->Centers). */
TMultiMap<FIntPoint, int32> MaskCells;
/** Nombre total d'instances de maisons a la derniere passe (nouvelle passe s'il change). */
int32 LastHouseInstances = -1;
/** Dernier temoin ecrit (pour n'ecrire qu'au changement). */
FString LastMaskReport;
};