diff --git a/Source/UTAD_UI/SkillTree/SkillTreeSubsystem.cpp b/Source/UTAD_UI/SkillTree/SkillTreeSubsystem.cpp new file mode 100644 index 0000000..8d4bb84 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeSubsystem.cpp @@ -0,0 +1,49 @@ +#include "SkillTreeManager.h" +#include "SkillTreeComponent.h" +#include "Engine/World.h" +#include "Kismet/GameplayStatics.h" + +void USkillTreeSubsystem::Initialize(FSubsystemCollectionBase& Collection) +{ + Super::Initialize(Collection); + + UE_LOG(LogTemp, Log, TEXT("SkillTreeManager: Initialized")); +} + +void USkillTreeSubsystem::Deinitialize() +{ + Super::Deinitialize(); + + PlayerSkillTreeComponent = nullptr; +} + +USkillTreeSubsystem* USkillTreeSubsystem::GetSkillTreeManager(const UObject* WorldContextObject) +{ + if (!WorldContextObject) + { + return nullptr; + } + + UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(WorldContextObject); + if (!GameInstance) + { + return nullptr; + } + + return GameInstance->GetSubsystem(); +} + +void USkillTreeSubsystem::RegisterPlayerSkillTree(USkillTreeComponent* SkillTreeComponent) +{ + if (SkillTreeComponent) + { + PlayerSkillTreeComponent = SkillTreeComponent; + UE_LOG(LogTemp, Log, TEXT("SkillTreeManager: Registered player skill tree component")); + } +} + +void USkillTreeSubsystem::UnregisterPlayerSkillTree() +{ + PlayerSkillTreeComponent = nullptr; + UE_LOG(LogTemp, Log, TEXT("SkillTreeManager: Unregistered player skill tree component")); +} diff --git a/Source/UTAD_UI/SkillTree/SkillTreeSubsystem.h b/Source/UTAD_UI/SkillTree/SkillTreeSubsystem.h new file mode 100644 index 0000000..84dcfe6 --- /dev/null +++ b/Source/UTAD_UI/SkillTree/SkillTreeSubsystem.h @@ -0,0 +1,64 @@ +#pragma once + +#include "CoreMinimal.h" +#include "Subsystems/GameInstanceSubsystem.h" +#include "SkillTreeTypes.h" +#include "SkillTreeSubsystem.generated.h" + +// Forward declarations +class USkillTreeComponent; + +UCLASS() +class UTAD_UI_API USkillTreeSubsystem : public UGameInstanceSubsystem +{ + GENERATED_BODY() + +public: + // Subsystem interface + virtual void Initialize(FSubsystemCollectionBase& Collection) override; + virtual void Deinitialize() override; + + // Get the singleton instance + UFUNCTION(BlueprintPure, Category = "Skill Tree", meta = (DisplayName = "Get Skill Tree Manager")) + static USkillTreeSubsystem* GetSkillTreeManager(const UObject* WorldContextObject); + + // Register and unregister player skill tree components + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + void RegisterPlayerSkillTree(USkillTreeComponent* SkillTreeComponent); + + UFUNCTION(BlueprintCallable, Category = "Skill Tree") + void UnregisterPlayerSkillTree(); + + // Get the player's skill tree component + UFUNCTION(BlueprintPure, Category = "Skill Tree") + USkillTreeComponent* GetPlayerSkillTree() const { return PlayerSkillTreeComponent; } + + // Global skill tree settings + UFUNCTION(BlueprintPure, Category = "Skill Tree Settings") + int32 GetMaxSkillPoints() const { return MaxSkillPoints; } + + UFUNCTION(BlueprintPure, Category = "Skill Tree Settings") + int32 GetSkillPointsPerLevel() const { return SkillPointsPerLevel; } + + UFUNCTION(BlueprintPure, Category = "Skill Tree Settings") + int32 GetRespecCost() const { return RespecCost; } + +protected: + // Reference to the player's skill tree component + UPROPERTY() + USkillTreeComponent* PlayerSkillTreeComponent; + + // Global settings + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Settings") + int32 MaxSkillPoints = 100; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Settings") + int32 SkillPointsPerLevel = 1; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Settings") + int32 RespecCost = 100; // Cost in gold/currency to reset skills + + // Data table for skills (can be overridden in Blueprint) + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Settings") + class UDataTable* DefaultSkillDataTable; +}; \ No newline at end of file