Files
utad-ui/Source/UTAD_UI/SkillTree/CharacterStatsComponent.h

140 lines
4.4 KiB
C++

#pragma once
#include "CoreMinimal.h"
#include "Components/ActorComponent.h"
#include "CharacterStatsComponent.generated.h"
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FOnHealthChanged, float, CurrentHealth, float, MaxHealth);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnDamageChanged, float, CurrentDamage);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnSpeedChanged, float, CurrentSpeed);
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnStatsUpdated);
UCLASS(ClassGroup=(Custom), meta=(BlueprintSpawnableComponent))
class UTAD_UI_API UCharacterStatsComponent : public UActorComponent
{
GENERATED_BODY()
public:
UCharacterStatsComponent();
protected:
virtual void BeginPlay() override;
// Base stats (without any bonuses)
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Base Stats")
float BaseMaxHealth;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Base Stats")
float BaseDamage;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Base Stats")
float BaseSpeed;
// Current values
UPROPERTY(BlueprintReadOnly, Category = "Current Stats")
float CurrentHealth;
// Calculated stats (base + bonuses)
UPROPERTY(BlueprintReadOnly, Category = "Current Stats")
float MaxHealth;
UPROPERTY(BlueprintReadOnly, Category = "Current Stats")
float CurrentDamage;
UPROPERTY(BlueprintReadOnly, Category = "Current Stats")
float CurrentSpeed;
// Skill tree bonuses (flat bonuses)
UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses")
float SkillHealthBonus;
UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses")
float SkillDamageBonus;
UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses")
float SkillSpeedBonus;
// Skill tree bonuses (percentage bonuses)
UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses")
float SkillHealthBonusPercent;
UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses")
float SkillDamageBonusPercent;
UPROPERTY(BlueprintReadOnly, Category = "Skill Bonuses")
float SkillSpeedBonusPercent;
public:
// Initialize stats
UFUNCTION(BlueprintCallable, Category = "Character Stats")
void InitializeStats();
// Update stats from skill tree
UFUNCTION(BlueprintCallable, Category = "Character Stats")
void UpdateStatsFromSkillTree();
// Called when a skill is purchased
UFUNCTION()
void OnSkillPurchased(FName SkillID);
// Calculate final stats
UFUNCTION(BlueprintCallable, Category = "Character Stats")
void RecalculateStats();
// Getters for current stats
UFUNCTION(BlueprintPure, Category = "Character Stats")
float GetCurrentHealth() const { return CurrentHealth; }
UFUNCTION(BlueprintPure, Category = "Character Stats")
float GetMaxHealth() const { return MaxHealth; }
UFUNCTION(BlueprintPure, Category = "Character Stats")
float GetHealthPercentage() const { return MaxHealth > 0 ? CurrentHealth / MaxHealth : 0.0f; }
UFUNCTION(BlueprintPure, Category = "Character Stats")
float GetCurrentDamage() const { return CurrentDamage; }
UFUNCTION(BlueprintPure, Category = "Character Stats")
float GetCurrentSpeed() const { return CurrentSpeed; }
// Health management
UFUNCTION(BlueprintCallable, Category = "Character Stats")
void TakeDamage(float DamageAmount);
UFUNCTION(BlueprintCallable, Category = "Character Stats")
void Heal(float HealAmount);
UFUNCTION(BlueprintCallable, Category = "Character Stats")
void SetHealth(float NewHealth);
// Get formatted text for UI
UFUNCTION(BlueprintPure, Category = "Character Stats UI")
FText GetHealthText() const;
UFUNCTION(BlueprintPure, Category = "Character Stats UI")
FText GetDamageText() const;
UFUNCTION(BlueprintPure, Category = "Character Stats UI")
FText GetSpeedText() const;
// Events
UPROPERTY(BlueprintAssignable, Category = "Stats Events")
FOnHealthChanged OnHealthChanged;
UPROPERTY(BlueprintAssignable, Category = "Stats Events")
FOnDamageChanged OnDamageChanged;
UPROPERTY(BlueprintAssignable, Category = "Stats Events")
FOnSpeedChanged OnSpeedChanged;
UPROPERTY(BlueprintAssignable, Category = "Stats Events")
FOnStatsUpdated OnStatsUpdated;
private:
// Apply speed to character movement
void ApplySpeedToMovement();
// Reference to owner's skill tree component
UPROPERTY()
class USkillTreeComponent* OwnerSkillTree;
};