Files
UE5-Modular-Game-Framework/Source/Framework/Public/Save/SS_SaveManager.h
Lefteris Notas f6c4f44827 feat: Add Enhanced Input Manager for context management and key rebinding
- Implemented USS_EnhancedInputManager to manage input contexts with priority.
- Added methods for pushing, popping, and querying input contexts.
- Integrated input mode switching and key rebinding functionality.

feat: Introduce Inventory System Component for item management

- Created UBPC_InventorySystem to handle inventory operations such as adding, removing, and sorting items.
- Implemented weight management and slot organization features.
- Added event dispatchers for inventory changes.

feat: Develop Item Data Asset for item definitions

- Established UDA_ItemData as a base class for all items, encapsulating properties like type, weight, and stack limits.
- Included conditional sub-data structures for equipment, consumables, and inspect data.

feat: Create State Manager Component for player state management

- Developed UBPC_StateManager to manage player action states and overlays.
- Implemented gating logic for action requests and vital sign tracking.

feat: Implement Save Manager for game state persistence

- Introduced USS_SaveManager for handling save/load operations and slot management.
- Utilized FArchive for efficient binary serialization.

feat: Implement Damage Reception System for combat mechanics

- Created UBPC_DamageReceptionSystem to process incoming damage and apply resistance calculations.
- Added event dispatchers for damage reception and hit reactions.
2026-05-20 15:04:17 +03:00

194 lines
6.1 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
// UE5 Modular Game Framework — SS_SaveManager (35)
// Save/Load subsystem. Slot management, serialization, manifest tracking.
// In C++, uses FArchive for direct binary serialization — far more powerful
// than Blueprint "Save Game" / "Load Game" nodes.
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "GameplayTagContainer.h"
#include "SS_SaveManager.generated.h"
/**
* Save slot metadata returned by GetSlotManifest().
*/
USTRUCT(BlueprintType)
struct FRAMEWORK_API FSaveSlotInfo
{
GENERATED_BODY()
UPROPERTY(BlueprintReadOnly)
int32 SlotIndex = -1;
UPROPERTY(BlueprintReadOnly)
FString SlotName;
UPROPERTY(BlueprintReadOnly)
FString ChapterName;
UPROPERTY(BlueprintReadOnly)
float PlayTimeHours = 0.0f;
UPROPERTY(BlueprintReadOnly)
FDateTime Timestamp;
UPROPERTY(BlueprintReadOnly)
FGameplayTag LastCheckpoint;
UPROPERTY(BlueprintReadOnly)
bool bIsEmpty = true;
};
// Delegates
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSaveComplete, int32, SlotIndex, bool, bSuccess);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnLoadComplete, int32, SlotIndex, bool, bSuccess);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSaveManifestUpdated, const TArray<FSaveSlotInfo>&, Slots);
/**
* SS_SaveManager — Save/Load Subsystem.
*
* Manages all save slots, serialization, and manifest tracking.
* C++ gives us direct FArchive-based serialization, proper error handling,
* and async save operations — impossible to match in Blueprint.
*/
UCLASS()
class FRAMEWORK_API USS_SaveManager : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
USS_SaveManager();
// ========================================================================
// Lifecycle
// ========================================================================
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
// ========================================================================
// Configuration
// ========================================================================
/** Maximum number of save slots. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Framework|Save")
int32 MaxSlots = 10;
/** Save game file prefix for slot naming. */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Framework|Save")
FString SavePrefix = TEXT("FrameworkSave_");
// ========================================================================
// Slot Manifest
// ========================================================================
/**
* Returns metadata for all save slots.
* Fast — reads header only, not full save data.
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
TArray<FSaveSlotInfo> GetSlotManifest() const;
/**
* Checks if a slot has save data.
*/
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Framework|Save")
bool DoesSlotExist(int32 SlotIndex) const;
// ========================================================================
// Save / Load Operations
// ========================================================================
/**
* Save game to a slot. Returns true if successful.
* Server-authoritative in multiplayer.
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool SaveGame(int32 SlotIndex, const FString& Description);
/**
* Load game from a slot. Returns true if successful.
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool LoadGame(int32 SlotIndex);
/**
* Delete a save slot. Irreversible!
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool DeleteSlot(int32 SlotIndex);
/**
* Quick-save to the current active slot.
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool QuickSave();
/**
* Quick-load from the current active slot.
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool QuickLoad();
// ========================================================================
// Checkpoint Management
// ========================================================================
/** Loads the most recent checkpoint from a slot. */
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool LoadCheckpoint(int32 SlotIndex);
/**
* Creates a checkpoint within the current slot.
* Checkpoints are incremental saves within a single slot.
*/
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool CreateCheckpoint(FGameplayTag CheckpointTag);
// ========================================================================
// Event Dispatchers
// ========================================================================
UPROPERTY(BlueprintAssignable, Category = "Framework|Events")
FOnSaveComplete OnSaveComplete;
UPROPERTY(BlueprintAssignable, Category = "Framework|Events")
FOnLoadComplete OnLoadComplete;
UPROPERTY(BlueprintAssignable, Category = "Framework|Events")
FOnSaveManifestUpdated OnSaveManifestUpdated;
// ========================================================================
// Utilities
// ========================================================================
/** Returns the total disk space used by all saves (in bytes). */
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Framework|Save")
int64 GetTotalSaveSize() const;
/** Backs up all save slots to a Backup/ subdirectory. */
UFUNCTION(BlueprintCallable, Category = "Framework|Save")
bool BackupAllSaves(const FString& BackupLabel);
protected:
/** Builds the save slot name from prefix + index. */
FString GetSlotName(int32 SlotIndex) const;
/** Reads only the header/metadata from a save file. */
FSaveSlotInfo ReadSlotHeader(int32 SlotIndex) const;
/** Internal save implementation using FArchive serialization. */
bool SaveToFile(int32 SlotIndex, const TArray<uint8>& Data, const FSaveSlotInfo& Meta);
/** Internal load implementation. */
bool LoadFromFile(int32 SlotIndex, TArray<uint8>& OutData, FSaveSlotInfo& OutMeta);
/** Path to the save directory. */
FString GetSaveDirectory() const;
/** Currently active save slot (from GI_GameFramework). */
int32 GetActiveSlot() const;
};