diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp index 2b69ad6..5ba1bda 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.cpp @@ -3,9 +3,10 @@ #include "StatusEffect.h" -void UStatusEffect::Invoke(ACharacter* Character) +void UStatusEffect::Invoke(AActor* Character) +{ +} + +void UStatusEffect::OnExpiry(AActor* Character) { - - - } diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h index be3dcae..14a0b12 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusEffect.h @@ -15,13 +15,18 @@ class THE_TWILIGHT_ABYSS_API UStatusEffect : public UObject GENERATED_BODY() public: - UPROPERTY() + UPROPERTY(EditAnywhere, BlueprintReadWrite) FString Name; - UPROPERTY() + UPROPERTY(EditAnywhere, BlueprintReadWrite) FString Description; - UPROPERTY() - UStaticMesh* Icon; + UPROPERTY(EditAnywhere, BlueprintReadWrite) + float BaseDuration; + UPROPERTY(EditAnywhere, BlueprintReadWrite) + UTexture2D* Icon; UFUNCTION() - virtual void Invoke(ACharacter* Character); + virtual void Invoke(AActor* Character); + + UFUNCTION() + virtual void OnExpiry(AActor* Character); }; diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp index 1baa68f..7d19848 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.cpp @@ -4,6 +4,10 @@ #include "StatusSystem.h" #include +#include "Blueprint/UserWidget.h" +#include "Components/Image.h" +#include "Components/TextBlock.h" + // Sets default values for this component's properties UStatusSystem::UStatusSystem() { @@ -11,7 +15,13 @@ UStatusSystem::UStatusSystem() // off to improve performance if you don't need them. PrimaryComponentTick.bCanEverTick = true; - // ... + if (HUDStatusIndicatorsWidget != nullptr) + { + static ConstructorHelpers::FClassFinder HUDStatusIndicatorsWidgetClassFinder(TEXT("/Game/Blueprints/Status_UI/StatusIndicator")); + HUDStatusIndicatorsWidget = HUDStatusIndicatorsWidgetClassFinder.Class; + static ConstructorHelpers::FClassFinder HUDStatusIconWidgetClassFinder(TEXT("/Game/Blueprints/Status_UI/StatusIcon")); + HUDStatusIconWidget = HUDStatusIconWidgetClassFinder.Class; + } } @@ -20,8 +30,9 @@ void UStatusSystem::BeginPlay() { Super::BeginPlay(); - // ... - + HUDStatusIndicators = CreateWidget(GetWorld(), HUDStatusIndicatorsWidget); + HUDStatusIndicators->AddToViewport(); + StatusIconsBox = Cast(HUDStatusIndicators->GetWidgetFromName(TEXT("StatusIndicators"))); } @@ -30,12 +41,38 @@ void UStatusSystem::TickComponent(float DeltaTime, ELevelTick TickType, FActorCo { Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - for (FActiveStatusEffect StatusEffect : ActiveStatusEffects) + for (FActiveStatusEffect ActiveStatusEffect : ActiveStatusEffects) { - if (StatusEffect.TimeTillExpiry > UGameplayStatics::GetRealTimeSeconds(GetWorld())) + if (ActiveStatusEffect.TimeTillExpiry >= UGameplayStatics::GetRealTimeSeconds(GetWorld())) { - ActiveStatusEffects.Remove(StatusEffect); + ActiveStatusEffect.StatusEffect->OnExpiry(GetOwner()); + ActiveStatusEffects.Remove(ActiveStatusEffect); } } } +void UStatusSystem::AddStatusEffect(UStatusEffect* StatusEffect, const float DurationMultiplier) +{ + FActiveStatusEffect NewStatusEffect; + NewStatusEffect.StatusEffect = StatusEffect; + NewStatusEffect.TimeInitiated = UGameplayStatics::GetRealTimeSeconds(GetWorld()); + NewStatusEffect.TimeTillExpiry = UGameplayStatics::GetRealTimeSeconds(GetWorld()) + StatusEffect->BaseDuration * DurationMultiplier; + NewStatusEffect.StatusIcon = CreateWidget(GetWorld(), HUDStatusIconWidget); + UImage* StatusIconImage = Cast(NewStatusEffect.StatusIcon->GetWidgetFromName(TEXT("StatusIconImage"))); + StatusIconImage->SetBrushFromTexture(StatusEffect->Icon); + StatusIconsBox->AddChild(NewStatusEffect.StatusIcon); + + ActiveStatusEffects.Add(NewStatusEffect); +} + +void UStatusSystem::RemoveStatusEffect(UStatusEffect* StatusEffect) +{ + if (ActiveStatusEffects.Contains(FActiveStatusEffect{0, 0, StatusEffect, nullptr})) + { + ActiveStatusEffects.Remove(FActiveStatusEffect{0, 0, StatusEffect, nullptr}); + } + else + { + UE_LOG(LogTemp, Warning, TEXT("StatusEffect not found in ActiveStatusEffects")); + } +} diff --git a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h index f80e070..7683878 100644 --- a/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h +++ b/Source/the_twilight_abyss/TurnBasedCombatV2/StatusSystem.h @@ -5,6 +5,8 @@ #include "CoreMinimal.h" #include "Components/ActorComponent.h" #include "StatusEffect.h" +#include "Components/TextBlock.h" +#include "Components/WrapBox.h" #include "StatusSystem.generated.h" USTRUCT() @@ -20,6 +22,9 @@ struct FActiveStatusEffect UPROPERTY() UStatusEffect* StatusEffect; + UPROPERTY() + UUserWidget* StatusIcon; + bool operator==(const FActiveStatusEffect& Comp) const { return StatusEffect == Comp.StatusEffect; @@ -35,6 +40,15 @@ public: // Sets default values for this component's properties UStatusSystem(); + UPROPERTY() + TSubclassOf HUDStatusIndicatorsWidget; + UPROPERTY() + TSubclassOf HUDStatusIconWidget; + UPROPERTY() + UUserWidget* HUDStatusIndicators; + UPROPERTY() + UWrapBox* StatusIconsBox; + UPROPERTY() TArray ActiveStatusEffects; @@ -46,5 +60,9 @@ public: // Called every frame virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; - + UFUNCTION() + void AddStatusEffect(UStatusEffect* StatusEffect, float DurationMultiplier = 1.0f); + + UFUNCTION() + void RemoveStatusEffect(UStatusEffect* StatusEffect); };