#pragma once #include "CoreMinimal.h" #include "Core/DescentWorldSubsystem.h" #include "GameFramework/SaveGame.h" #include "DescentSave.generated.h" USTRUCT() struct FDescentSavedTender { GENERATED_BODY() UPROPERTY() bool bOut = false; UPROPERTY() FVector PosUU = FVector::ZeroVector; UPROPERTY() FRotator Rot = FRotator::ZeroRotator; UPROPERTY() double Hull = 100.0; UPROPERTY() double Power = 100.0; UPROPERTY() double BioFu = 0.0; UPROPERTY() TArray Hold; }; USTRUCT() struct FDescentSavedPlaceable { GENERATED_BODY() UPROPERTY() int32 Id = 0; UPROPERTY() FName Kit; UPROPERTY() FVector PosM = FVector::ZeroVector; UPROPERTY() double YawDeg = 0.0; UPROPERTY() uint8 Surface = 1; UPROPERTY() TArray Queue; // refinery UPROPERTY() double Progress = 0.0; UPROPERTY() bool bPower = true; // arm UPROPERTY() int32 Moved = 0; }; USTRUCT() struct FDescentSavedBox { GENERATED_BODY() UPROPERTY() uint8 Type = 0; UPROPERTY() int32 Count = 0; UPROPERTY() FString Where; UPROPERTY() FVector LocalM = FVector::ZeroVector; }; /** The save of DESIGN_UE.md section 6.12, slot `descent_0`. */ UCLASS() class THEDESCENT_API UDescentSaveGame : public USaveGame { GENERATED_BODY() public: UPROPERTY() int32 Version = 1; // player UPROPERTY() double Nutrition = 42.0; UPROPERTY() double O2Max = 45.0; UPROPERTY() double Health = 100.0; UPROPERTY() double Fees = 0.0; UPROPERTY() int32 Deaths = 0; UPROPERTY() TArray InvItems; UPROPERTY() TArray InvCounts; UPROPERTY() TArray Hotbar; // economy UPROPERTY() double Earned = 0.0; UPROPERTY() int32 Sold = 0; UPROPERTY() TArray Refined; UPROPERTY() TArray Upgrades; UPROPERTY() TArray KitNames; UPROPERTY() TArray KitCounts; // carrier UPROPERTY() FVector CarrierPosM = FVector::ZeroVector; UPROPERTY() double CarrierYawDeg = 0.0; UPROPERTY() double CarrierHull = 100.0; UPROPERTY() double CarrierPower = 100.0; UPROPERTY() double BiomassFU = 0.0; UPROPERTY() TArray VatFauna; // Tenders, placeables, boxes UPROPERTY() TArray Tenders; UPROPERTY() TArray Placeables; UPROPERTY() TArray Boxes; UPROPERTY() TArray PackerBuffer; UPROPERTY() TArray PackerPartial; // terrain and ore UPROPERTY() TArray Terrain; UPROPERTY() int32 TerrainRawSize = 0; UPROPERTY() TArray OreMined; UPROPERTY() TArray OreRemoved; // map and horror (M9) UPROPERTY() TArray MapSurvey; UPROPERTY() TArray Markers; UPROPERTY() TArray HorrorFlags; UPROPERTY() double SimTime = 0.0; }; UCLASS() class THEDESCENT_API UDescentSaveSubsystem : public UDescentWorldSubsystem { GENERATED_BODY() public: static UDescentSaveSubsystem* Get(const UWorld* World); static const TCHAR* SlotName() { return TEXT("descent_0"); } UDescentSaveGame* Capture(); bool Apply(const UDescentSaveGame* Save); bool SaveToSlot(FString* OutWhyNot = nullptr); bool LoadFromSlot(FString* OutWhyNot = nullptr); bool HasSave() const; int32 Saves = 0, Loads = 0; /** Other systems (biomass, map, horror) add their own blocks. */ DECLARE_MULTICAST_DELEGATE_OneParam(FOnSaveBlock, UDescentSaveGame*); FOnSaveBlock OnCapture; DECLARE_MULTICAST_DELEGATE_OneParam(FOnLoadBlock, const UDescentSaveGame*); FOnLoadBlock OnApply; };