153 lines
5.8 KiB
C++
153 lines
5.8 KiB
C++
#pragma once
|
|
|
|
#include "CoreMinimal.h"
|
|
#include "Components/ActorComponent.h"
|
|
#include "SkillTreeTypes.h"
|
|
#include "SkillTreeComponent.generated.h"
|
|
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillPointsChanged, int32, NewSkillPoints);
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillPurchased, FName, SkillID);
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillSelectionChanged, int32, TotalCost);
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSkillStateChanged, FName, SkillID);
|
|
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnSelectionError, FName, SkillID, FText, ErrorMessage);
|
|
|
|
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
|
|
class UTAD_UI_API USkillTreeComponent : public UActorComponent
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
public:
|
|
USkillTreeComponent();
|
|
|
|
protected:
|
|
virtual void BeginPlay() override;
|
|
|
|
// Current skill points available
|
|
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Skill Points", SaveGame)
|
|
int32 AvailableSkillPoints = 0;
|
|
// Total skill points earned
|
|
UPROPERTY(BlueprintReadOnly, Category = "Skill Points", SaveGame)
|
|
int32 TotalSkillPointsEarned = 0;
|
|
|
|
// Data table containing all skill definitions
|
|
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Skill Tree")
|
|
class UDataTable* SkillDataTable = nullptr;
|
|
|
|
// All skills loaded from the data table
|
|
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree")
|
|
TMap<FName, FSkillNodeRuntime> AllSkills = {};
|
|
|
|
// Currently purchased skills
|
|
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree", SaveGame)
|
|
TArray<FName> PurchasedSkills;
|
|
|
|
// Currently selected skills for purchase
|
|
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree")
|
|
TArray<FName> SelectedSkills;
|
|
|
|
// Cache the total cost of selected skills
|
|
UPROPERTY(BlueprintReadOnly, Category = "Skill Tree")
|
|
int32 CurrentSelectionCost;
|
|
|
|
public:
|
|
// Initialize the skill tree from data table
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Tree")
|
|
void InitializeSkillTree();
|
|
|
|
// Skill Points Management
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Points")
|
|
void AddSkillPoints(int32 Amount);
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Points")
|
|
void RemoveSkillPoints(int32 Amount);
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Points")
|
|
int32 GetAvailableSkillPoints() const { return AvailableSkillPoints; }
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Points")
|
|
int32 GetTotalSkillPointsEarned() const { return TotalSkillPointsEarned; }
|
|
|
|
// Selection Management
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Selection")
|
|
bool SelectSkill(FName SkillID);
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Selection")
|
|
bool DeselectSkill(FName SkillID);
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Selection")
|
|
void ClearSelection();
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Selection")
|
|
bool ConfirmPurchase();
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Selection")
|
|
TArray<FName> GetSelectedSkills() const { return SelectedSkills; }
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Selection")
|
|
int32 GetSelectionCost() const { return CurrentSelectionCost; }
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Selection")
|
|
bool CanAffordSelection() const { return AvailableSkillPoints >= CurrentSelectionCost; }
|
|
|
|
// Skill State Queries
|
|
UFUNCTION(BlueprintPure, Category = "Skill State")
|
|
bool IsSkillPurchased(FName SkillID) const;
|
|
UFUNCTION(BlueprintPure, Category = "Skill State")
|
|
bool IsSkillSelected(FName SkillID) const;
|
|
UFUNCTION(BlueprintPure, Category = "Skill State")
|
|
bool IsSkillAvailable(FName SkillID) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill State")
|
|
bool CanSelectSkill(FName SkillID, FText& OutErrorMessage) const;
|
|
|
|
// Get skill data
|
|
UFUNCTION(BlueprintPure, Category = "Skill Data")
|
|
bool GetSkillNodeData(FName SkillID, FSkillNodeRuntime& OutNodeData) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill State")
|
|
ESkillNodeState GetSkillState(FName SkillID) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Data")
|
|
TArray<FSkillNodeRuntime> GetAllSkillNodes() const;
|
|
|
|
// Calculate total bonuses from purchased skills
|
|
UFUNCTION(BlueprintPure, Category = "Skill Bonuses")
|
|
float GetTotalHealthBonus() const;
|
|
UFUNCTION(BlueprintPure, Category = "Skill Bonuses")
|
|
float GetTotalDamageBonus() const;
|
|
UFUNCTION(BlueprintPure, Category = "Skill Bonuses")
|
|
float GetTotalSpeedBonus() const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "Skill Bonuses")
|
|
float GetTotalHealthBonusPercent() const;
|
|
UFUNCTION(BlueprintPure, Category = "Skill Bonuses")
|
|
float GetTotalDamageBonusPercent() const;
|
|
UFUNCTION(BlueprintPure, Category = "Skill Bonuses")
|
|
float GetTotalSpeedBonusPercent() const;
|
|
|
|
// Reset skills (for respec feature)
|
|
UFUNCTION(BlueprintCallable, Category = "Skill Tree")
|
|
void ResetAllSkills();
|
|
|
|
// Events
|
|
UPROPERTY(BlueprintAssignable, Category = "Skill Events")
|
|
FOnSkillPointsChanged OnSkillPointsChanged;
|
|
UPROPERTY(BlueprintAssignable, Category = "Skill Events")
|
|
FOnSkillPurchased OnSkillPurchased;
|
|
UPROPERTY(BlueprintAssignable, Category = "Skill Events")
|
|
FOnSkillSelectionChanged OnSkillSelectionChanged;
|
|
UPROPERTY(BlueprintAssignable, Category = "Skill Events")
|
|
FOnSkillStateChanged OnSkillStateChanged;
|
|
UPROPERTY(BlueprintAssignable, Category = "Skill Events")
|
|
FOnSelectionError OnSelectionError;
|
|
|
|
private:
|
|
// Internal helper functions
|
|
void UpdateSkillStates();
|
|
void UpdateSelectionCost();
|
|
bool ArePrerequisitesMet(const FSkillNodeData& SkillData, bool bIncludeSelected = false) const;
|
|
bool HasChildrenPurchased(FName SkillID) const;
|
|
void ApplySkillEffects(const FSkillNodeData& SkillData);
|
|
void RemoveSkillEffects(const FSkillNodeData& SkillData);
|
|
void CascadeDeselectDependents(FName SkillID);
|
|
}; |