// Fill out your copyright notice in the Description page of Project Settings. #include "TurnBaseCombat.h" #include "CoreMinimal.h" #include "Blueprint/UserWidget.h" #include "Components/TextBlock.h" #include "Components/ProgressBar.h" #include "Kismet/GameplayStatics.h" ATurnBaseCombat::ATurnBaseCombat() { if (HUDWidget == nullptr) { // Load the HUD widget from the specified path static ConstructorHelpers::FClassFinder HUDWidgetClass(TEXT("/Game/Blueprints/Combat_UI/Combat_UI")); HUDWidget = HUDWidgetClass.Class; } } void ATurnBaseCombat::BeginPlay() { Super::BeginPlay(); TArray AllCharacterActorsInScene; UGameplayStatics::GetAllActorsOfClassWithTag(GetWorld(), AActor::StaticClass(), FName("Character"), AllCharacterActorsInScene); UUserWidget* HUD = CreateWidget(GetWorld(), HUDWidget); HUD->AddToViewport(); TurnIndicatorTextBlock = Cast(HUD->GetWidgetFromName("TurnIndicator")); CurrentComboTextBlock = Cast(HUD->GetWidgetFromName("CurrentCombo")); ActionPointsTextBlock = Cast(HUD->GetWidgetFromName("ActionPoints")); PlayerHealthBar = Cast(HUD->GetWidgetFromName("PlayerHealthBar")); EnemyHealthBar = Cast(HUD->GetWidgetFromName("EnemyHealthBar")); CastButton = Cast(HUD->GetWidgetFromName("CastButton")); FButton = Cast(HUD->GetWidgetFromName("FButton")); WButton = Cast(HUD->GetWidgetFromName("WButton")); BackspaceButton = Cast(HUD->GetWidgetFromName("BackspaceButton")); CastButton->OnClicked.AddDynamic(this, &ATurnBaseCombat::CastButtonOnClick); FButton->OnClicked.AddDynamic(this, &ATurnBaseCombat::FButtonOnClick); WButton->OnClicked.AddDynamic(this, &ATurnBaseCombat::WButtonOnClick); BackspaceButton->OnClicked.AddDynamic(this, &ATurnBaseCombat::BackspaceButtonOnClick); } void ATurnBaseCombat::ExecuteCast(FString Combo) { if (!IsValidCombo(Combo)) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Invalid Combo")); CurrentComboString = ""; UpdateComboString(CurrentComboString); RevertActionPoints(); UpdateActionPoints(); return; } CurrentComboString = ""; UpdateComboString(CurrentComboString); RevertActionPoints(); UpdateActionPoints(); switch (bIsPlayerTurn) { case true: // Player Turn DamageEnemy(*ValidCombos.Find(Combo)); GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("Enemy Damaged %d"), *ValidCombos.Find(Combo))); break; case false: // Enemy Turn DamagePlayer(*ValidCombos.Find(Combo)); GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("Player Damaged %d"), *ValidCombos.Find(Combo))); break; } SwitchTurn(); } void ATurnBaseCombat::UseActionPoint() { ActiveActionPoints += 1; UpdateActionPoints(); } void ATurnBaseCombat::ReuseActionPoint() { ActiveActionPoints -= 1; UpdateActionPoints(); } void ATurnBaseCombat::RevertActionPoints() { ActiveActionPoints = 0; UpdateActionPoints(); } void ATurnBaseCombat::DamagePlayer(int Damage) { PlayerHealth -= FMath::Clamp(Damage, 0, 100); UpdateProgressBars(); } void ATurnBaseCombat::DamageEnemy(int Damage) { EnemyHealth -= FMath::Clamp(Damage, 0, 100); UpdateProgressBars(); } void ATurnBaseCombat::UpdateProgressBars() const { PlayerHealthBar->SetPercent(PlayerHealth / 100.0f); EnemyHealthBar->SetPercent(EnemyHealth / 100.0f); } bool ATurnBaseCombat::IsValidCombo(FString Combo) const { return ValidCombos.Contains(Combo); } void ATurnBaseCombat::SwitchTurn() { //TurnIndicatorTextBlock->SetText(FText::FromString(bIsPlayerTurn ? "Enemy Turn" : "Player Turn")); //bIsPlayerTurn = !bIsPlayerTurn; TurnIndicatorTextBlock->SetText(FText::FromString("Enemy Turn")); DamagePlayer(10); TurnIndicatorTextBlock->SetText(FText::FromString("Player Turn")); //activeActor = bIsPlayerTurn ? enemyActor : playerActor; } void ATurnBaseCombat::CastButtonOnClick() { ExecuteCast(CurrentComboString); } void ATurnBaseCombat::FButtonOnClick() { if (ActiveActionPoints >= DefaultActionPoints) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("No More Action Points")); return; } UseActionPoint(); CurrentComboString.AppendChar('F'); UpdateComboString(CurrentComboString); } void ATurnBaseCombat::WButtonOnClick() { if (ActiveActionPoints >= DefaultActionPoints) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("No More Action Points")); return; } UseActionPoint(); CurrentComboString.AppendChar('W'); UpdateComboString(CurrentComboString); } void ATurnBaseCombat::BackspaceButtonOnClick() { if (CurrentComboString.Len() <= 0) { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, TEXT("Blank Combo")); return; } ReuseActionPoint(); CurrentComboString.RemoveAt(CurrentComboString.Len() - 1); UpdateComboString(CurrentComboString); } void ATurnBaseCombat::UpdateComboString(FString NewCombo) { CurrentComboTextBlock->SetText(FText::FromString(NewCombo)); } void ATurnBaseCombat::UpdateActionPoints() { ActionPointsTextBlock->SetText(FText::FromString(FString::FromInt(ActiveActionPoints))); }