Merge branch 'Combat' into dev

This commit is contained in:
Philip W 2023-04-26 13:20:48 +01:00
commit 383a85449e
12 changed files with 239 additions and 160 deletions

BIN
Content/BlueprintAI/AI/AIBruh.uasset (Stored with Git LFS)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -94,6 +94,11 @@ void ATempCharacter::Sneak()
} }
void ATempCharacter::ResetWidgetPointer() const
{
WidgetPointer->SetWorldLocationAndRotation(FVector(0, 0, 0), FRotator(0, 0, 0).Quaternion());
}
// Called every frame // Called every frame
void ATempCharacter::Tick(float DeltaTime) void ATempCharacter::Tick(float DeltaTime)
{ {

View File

@ -19,6 +19,7 @@ class THE_TWILIGHT_ABYSS_API ATempCharacter : public ACharacter
public: public:
// Sets default values for this character's properties // Sets default values for this character's properties
ATempCharacter(); ATempCharacter();
void ResetWidgetPointer() const;
protected: protected:
// Called when the game starts or when spawned // Called when the game starts or when spawned

View File

@ -2,7 +2,10 @@
#include "HoldToInitCombat.h" #include "HoldToInitCombat.h"
#include "AIController.h"
#include "TurnBaseCombatV2.h" #include "TurnBaseCombatV2.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "Blueprint/UserWidget.h" #include "Blueprint/UserWidget.h"
@ -28,10 +31,10 @@ void UHoldToInitCombat::BeginPlay()
{ {
Super::BeginPlay(); Super::BeginPlay();
InitCombatWidget = CreateWidget<UUserWidget>(GetWorld(), InitCombatWidgetClass); InitCombatWidget = CreateWidget<UUserWidget>(GetWorld(), InitCombatWidgetClass);
InitCombatWidget->AddToViewport();
InitCombatWidget->SetVisibility(ESlateVisibility::Hidden);
UInputComponent* PlayerInputComponent = GetWorld()->GetFirstPlayerController()->InputComponent; ReloadSlider = Cast<URadialSlider>(InitCombatWidget->GetWidgetFromName("ReloadSlider"));
PlayerInputComponent->BindAction("RightClick", IE_Pressed, this, &UHoldToInitCombat::OnRightClickDown);
PlayerInputComponent->BindAction("RightClick", IE_Released, this, &UHoldToInitCombat::OnRightClickUp);
} }
@ -39,35 +42,26 @@ void UHoldToInitCombat::BeginPlay()
void UHoldToInitCombat::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) void UHoldToInitCombat::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction)
{ {
Super::TickComponent(DeltaTime, TickType, ThisTickFunction); Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
if (ReloadTimer > 0.0f)
{
ReloadTimer -= DeltaTime;
ReloadSlider->SetValue(FMath::Clamp<float>(ReloadTime - ReloadTimer, 0.f, ReloadTime) / ReloadTime);
}
else if (InitCombatWidget->GetVisibility() == ESlateVisibility::Visible)
{
InitCombatWidget->SetVisibility(ESlateVisibility::Hidden);
}
// if (bRightClickDown && RightClickDownTime < 0.1f) if (bClickDown && TargetEnemy != nullptr)
// {
// RightClickDownTime += DeltaTime;
// }
// else if (bRightClickDown && RightClickDownTime >= 0.1f)
// {
// //Enter Combat Mode
// Cast<ATurnBaseCombatV2>(GetWorld()->GetGameState())->StartCombat(TargetEnemy);
// //UBlackboardComponent* TargetEnemyBlackboard = Cast<UBlackboardComponent>(TargetEnemy->GetComponentByClass(UBlackboardComponent::StaticClass()));
// //TargetEnemyBlackboard->SetValueAsBool("IsInCombat", true);
// OnRightClickUp();
// }
if (bRightClickDown)
{ {
Cast<ATurnBaseCombatV2>(GetWorld()->GetGameState())->StartCombat(TargetEnemy); Cast<ATurnBaseCombatV2>(GetWorld()->GetGameState())->StartCombat(TargetEnemy);
OnRightClickUp();
} }
} }
void UHoldToInitCombat::OnRightClickDown() void UHoldToInitCombat::OnClickDown()
{ {
if (AActor* RightClickHit = LookingAtEnemy(); RightClickHit != nullptr) if (Cast<ATurnBaseCombatV2>(GetWorld()->GetGameState())->bIsInCombat) return;
{ if (ReloadTimer > 0.0f) return;
TargetEnemy = RightClickHit;
bRightClickDown = true;
//InitCombatWidget->AddToViewport();
}
if (GunEffect) if (GunEffect)
{ {
const AActor* PlayerActor = GetWorld()->GetFirstPlayerController()->GetPawn(); const AActor* PlayerActor = GetWorld()->GetFirstPlayerController()->GetPawn();
@ -75,16 +69,22 @@ void UHoldToInitCombat::OnRightClickDown()
const FVector GunLocationOffset = GunComponent->GetSocketTransform("Muzzle").TransformPosition(FVector(-100, 0, 0)); const FVector GunLocationOffset = GunComponent->GetSocketTransform("Muzzle").TransformPosition(FVector(-100, 0, 0));
UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), GunEffect, GunLocationOffset, PlayerActor->GetActorRotation()); UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), GunEffect, GunLocationOffset, PlayerActor->GetActorRotation());
} }
}
void UHoldToInitCombat::OnRightClickUp() if (AActor* ClickHit = LookingAtEnemy(); ClickHit != nullptr)
{
bRightClickDown = false;
RightClickDownTime = 0.0f;
if (InitCombatWidget->IsInViewport())
{ {
InitCombatWidget->RemoveFromParent(); TargetEnemy = ClickHit;
EnemyBlackboard = Cast<AAIController>(TargetEnemy->GetInstigatorController())->GetBlackboardComponent();
if (!EnemyBlackboard->GetValueAsBool("WasInCombat"))
{
Cast<ATurnBaseCombatV2>(GetWorld()->GetGameState())->StartCombat(TargetEnemy, true);
return;
}
InitCombatWidget->SetVisibility(ESlateVisibility::Hidden);
return;
} }
ReloadTimer = ReloadTime;
InitCombatWidget->SetVisibility(ESlateVisibility::Visible);
} }
AActor* UHoldToInitCombat::LookingAtEnemy() const AActor* UHoldToInitCombat::LookingAtEnemy() const

View File

@ -4,8 +4,9 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "Components/ActorComponent.h" #include "Components/ActorComponent.h"
#include "NiagaraComponent.h"
#include "NiagaraFunctionLibrary.h" #include "NiagaraFunctionLibrary.h"
#include "Components/RadialSlider.h"
#include "BehaviorTree/BlackboardComponent.h"
#include "HoldToInitCombat.generated.h" #include "HoldToInitCombat.generated.h"
class UNiagaraSystem; class UNiagaraSystem;
@ -26,21 +27,30 @@ public:
UPROPERTY() UPROPERTY()
UNiagaraSystem* GunEffect; UNiagaraSystem* GunEffect;
UPROPERTY(EditAnywhere)
float ReloadTime = 1.0f;
UFUNCTION(BlueprintCallable)
void OnClickDown();
protected: protected:
// Called when the game starts // Called when the game starts
virtual void BeginPlay() override; virtual void BeginPlay() override;
UPROPERTY()
UBlackboardComponent* EnemyBlackboard;
public: public:
// Called every frame // Called every frame
virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override;
private: private:
void OnRightClickDown(); bool bClickDown = false;
void OnRightClickUp(); float ReloadTimer = 0.0f;
bool bRightClickDown = false;
float RightClickDownTime = 0.0f;
UFUNCTION() UFUNCTION()
AActor* LookingAtEnemy() const; AActor* LookingAtEnemy() const;
AActor* TargetEnemy = nullptr; AActor* TargetEnemy = nullptr;
UPROPERTY()
URadialSlider* ReloadSlider;
}; };

View File

@ -32,48 +32,16 @@ ATurnBaseCombatV2::ATurnBaseCombatV2()
} }
} }
void ATurnBaseCombatV2::StartCombat(AActor* Enemy) void ATurnBaseCombatV2::StartCombat(AActor* Enemy, bool bWasShot)
{ {
if (Enemy == nullptr) return; if (Enemy == nullptr) return;
EnemyActor = Enemy;
if (bIsInCombat) return; if (bIsInCombat) return;
BookHUD->SetVisibility(ESlateVisibility::SelfHitTestInvisible);
EscapePercentage = CalculateEscapePercentage(); EscapePercentage = CalculateEscapePercentage();
EscapePercentageTextBlock->SetText(FText::Join(FText::FromString(""), FText::FromString(FString::FromInt(EscapePercentage * 100)), FText::FromString("%"))); EscapePercentageTextBlock->SetText(FText::Join(FText::FromString(""), FText::FromString(FString::FromInt(EscapePercentage * 100)), FText::FromString("%")));
const FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY());
GetWorld()->GetFirstPlayerController()->SetMouseLocation(ViewportSize.X / 2, ViewportSize.Y / 2);
bIsInCombat = true; bIsInCombat = true;
UBlackboardComponent* EnemyBlackboard = Cast<AAIController>(Enemy->GetInstigatorController())->GetBlackboardComponent(); UBlackboardComponent* EnemyBlackboard = Cast<AAIController>(Enemy->GetInstigatorController())->GetBlackboardComponent();
if (!HasSeenTutorial)
{
ToggleButtons();
CombatTutorialWidgetInstance = CreateWidget<UUserWidget>(GetWorld(), CombatTutorialWidget);
CombatTutorialWidgetInstance->AddToViewport();
HasSeenTutorial = true;
}
if (EnemyBlackboard->GetValueAsBool("IsInCombat")) return;
EnemyBlackboard->SetValueAsBool("IsInCombat", true);
FProperty* HealthProperty = Enemy->GetClass()->FindPropertyByName(FName("Health"));
int32* EnemyHealthPtr = HealthProperty->ContainerPtrToValuePtr<int32>(Enemy);
EnemyHealth = EnemyHealthPtr;
if (EnemyBlackboard->GetValueAsBool("Sight"))
{
//bEnemyHasExtraTurn = true;
SwitchTurn();
}
else
{
bPlayerHasExtraTurn = true;
}
if (HUD->IsInViewport()) return;
//HUD->AddToViewport();
EnemyActor = Enemy;
ProbertiumResource = 10;
EisResource = 10;
AzosResource = 10;
IroquoidResource = 10;
//Disable Character Movement //Disable Character Movement
APlayerController* PlayerController = GetWorld()->GetFirstPlayerController(); APlayerController* PlayerController = GetWorld()->GetFirstPlayerController();
@ -88,7 +56,34 @@ void ATurnBaseCombatV2::StartCombat(AActor* Enemy)
LookAtRotation.Pitch = -9.0f; LookAtRotation.Pitch = -9.0f;
PlayerController->SetControlRotation(LookAtRotation); PlayerController->SetControlRotation(LookAtRotation);
if (EnemyBlackboard->GetValueAsBool("IsInCombat")) return;
EnemyBlackboard->SetValueAsBool("IsInCombat", true);
FProperty* HealthProperty = Enemy->GetClass()->FindPropertyByName(FName("Health"));
int32* EnemyHealthPtr = HealthProperty->ContainerPtrToValuePtr<int32>(Enemy);
EnemyHealth = EnemyHealthPtr;
if (IsValid(CombatTutorialWidgetInstance) && CombatTutorialWidgetInstance->IsInViewport()) return;
if (!HasSeenTutorial)
{
DisableButtons();
CombatTutorialWidgetInstance->AddToViewport();
HasSeenTutorial = true;
return;
}
CombatCheck(bWasShot);
//DrawDebugPoint(GetWorld(), Enemy->GetActorLocation(), 10, FColor::Red, false, 10); //DrawDebugPoint(GetWorld(), Enemy->GetActorLocation(), 10, FColor::Red, false, 10);
}
void ATurnBaseCombatV2::CombatCheck(bool bWasShot)
{
const UBlackboardComponent* EnemyBlackboard = Cast<AAIController>(EnemyActor->GetInstigatorController())->GetBlackboardComponent();
//TODO: REMOVE THIS
ProbertiumResource = 10;
EisResource = 10;
AzosResource = 10;
IroquoidResource = 10;
CurrentComboString = ""; CurrentComboString = "";
UpdateComboString(CurrentComboString); UpdateComboString(CurrentComboString);
@ -96,13 +91,27 @@ void ATurnBaseCombatV2::StartCombat(AActor* Enemy)
UpdateActionPoints(); UpdateActionPoints();
UpdateResourceBars(); UpdateResourceBars();
ClearBattleLog(); ClearBattleLog();
EnableButtons();
FProperty* ReactionSpeedProperty = EnemyActor->GetClass()->FindPropertyByName(FName("ReactionSpeed"));
float* EnemyReactionSpeedPtr = ReactionSpeedProperty->ContainerPtrToValuePtr<float>(EnemyActor);
if (EnemyBlackboard->GetValueAsBool("Sight") && !bWasShot)
{
//bEnemyHasExtraTurn = true;
SwitchTurn();
}
else if (Cast<ATempCharacter>(PlayerActor)->ReactionSpeed > *EnemyReactionSpeedPtr && bWasShot)
{
bPlayerHasExtraTurn = true;
}
TurnIndicatorTextBlock->SetText(FText::FromString("Player Turn"));
} }
void ATurnBaseCombatV2::EndCombat() void ATurnBaseCombatV2::EndCombat()
{ {
const FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY()); BookHUD->SetVisibility(ESlateVisibility::Hidden);
Cast<ATempCharacter>(PlayerActor)->ResetWidgetPointer();
TurnIndicatorTextBlock->SetText(FText::FromString("")); TurnIndicatorTextBlock->SetText(FText::FromString(""));
GetWorld()->GetFirstPlayerController()->SetMouseLocation(ViewportSize.X / 2, ViewportSize.Y / 2);
bEnemyHasExtraTurn = false; bEnemyHasExtraTurn = false;
bPlayerHasExtraTurn = false; bPlayerHasExtraTurn = false;
bIsInCombat = false; bIsInCombat = false;
@ -127,8 +136,6 @@ void ATurnBaseCombatV2::EndCombat()
void ATurnBaseCombatV2::BeginPlay() void ATurnBaseCombatV2::BeginPlay()
{ {
Super::BeginPlay(); Super::BeginPlay();
const FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY());
GetWorld()->GetFirstPlayerController()->SetMouseLocation(ViewportSize.X / 2, ViewportSize.Y / 2);
TArray<AActor*> AllCharacterActorsInScene; TArray<AActor*> AllCharacterActorsInScene;
@ -139,6 +146,7 @@ void ATurnBaseCombatV2::BeginPlay()
} }
PlayerHealth = &Cast<ATempCharacter>(PlayerActor)->Health; PlayerHealth = &Cast<ATempCharacter>(PlayerActor)->Health;
CombatTutorialWidgetInstance = CreateWidget<UUserWidget>(GetWorld(), CombatTutorialWidget);
HUD = CreateWidget<UUserWidget>(GetWorld(), HUDWidget); HUD = CreateWidget<UUserWidget>(GetWorld(), HUDWidget);
TArray<AActor*> PlayerChildActors; TArray<AActor*> PlayerChildActors;
PlayerActor->GetAllChildActors(PlayerChildActors, false); PlayerActor->GetAllChildActors(PlayerChildActors, false);
@ -152,6 +160,7 @@ void ATurnBaseCombatV2::BeginPlay()
CurrentComboTextBlock2 = Cast<UTextBlock>(BookHUD->GetWidgetFromName("CurrentCombo_2")); CurrentComboTextBlock2 = Cast<UTextBlock>(BookHUD->GetWidgetFromName("CurrentCombo_2"));
BattleLogTextBlock = Cast<UTextBlock>(HUD->GetWidgetFromName("BattleLog")); BattleLogTextBlock = Cast<UTextBlock>(HUD->GetWidgetFromName("BattleLog"));
EscapePercentageTextBlock = Cast<UTextBlock>(BookHUD->GetWidgetFromName("EscapePercentage_Text")); EscapePercentageTextBlock = Cast<UTextBlock>(BookHUD->GetWidgetFromName("EscapePercentage_Text"));
DamageMultiplierTextBlock = Cast<UTextBlock>(BookHUD->GetWidgetFromName("DamageMultiplier_Text"));
PlayerHealthBar = Cast<UProgressBar>(BookHUD->GetWidgetFromName("PlayerHealthBar")); PlayerHealthBar = Cast<UProgressBar>(BookHUD->GetWidgetFromName("PlayerHealthBar"));
EnemyHealthBar = Cast<UProgressBar>(HUD->GetWidgetFromName("EnemyHealthBar")); EnemyHealthBar = Cast<UProgressBar>(HUD->GetWidgetFromName("EnemyHealthBar"));
ProbertiumResourceBar = Cast<UProgressBar>(BookHUD->GetWidgetFromName("ProbertiumResourceBar")); ProbertiumResourceBar = Cast<UProgressBar>(BookHUD->GetWidgetFromName("ProbertiumResourceBar"));
@ -208,14 +217,14 @@ void ATurnBaseCombatV2::ExecuteCast(FString Combo)
if (IsSpecialCombo(Combo)) if (IsSpecialCombo(Combo))
{ {
UStatusSystem* StatusSystem = Cast<UStatusSystem>(PlayerActor->GetComponentByClass(UStatusSystem::StaticClass())); UStatusSystem* StatusSystem = Cast<UStatusSystem>(PlayerActor->GetComponentByClass(UStatusSystem::StaticClass()));
if (Combo == "AAE") if (Combo == "PA")
{ {
UStatusEffect* TempThornsStatusEffect = NewObject<UStatusEffect>(PlayerActor, ThornsStatusEffect); UStatusEffect* TempThornsStatusEffect = NewObject<UStatusEffect>(PlayerActor, ThornsStatusEffect);
StatusSystem->AddStatusEffect(TempThornsStatusEffect, 1, false); StatusSystem->AddStatusEffect(TempThornsStatusEffect, 1, false);
StatusEffects.Add(TempThornsStatusEffect); StatusEffects.Add(TempThornsStatusEffect);
AddBattleLogMessage("Player Casted Thorns"); AddBattleLogMessage("Player Casted Thorns");
} }
else if (Combo == "PPI") else if (Combo == "PI")
{ {
UStatusEffect* TempDOTStatusEffect = NewObject<UStatusEffect>(PlayerActor, DOTStatusEffect); UStatusEffect* TempDOTStatusEffect = NewObject<UStatusEffect>(PlayerActor, DOTStatusEffect);
StatusSystem->AddStatusEffect(TempDOTStatusEffect, 1, false); StatusSystem->AddStatusEffect(TempDOTStatusEffect, 1, false);
@ -224,13 +233,29 @@ void ATurnBaseCombatV2::ExecuteCast(FString Combo)
} }
} }
if (GunEffect && !bIsInCombat) if (GunEffect)
{ {
const UStaticMeshComponent* GunComponent = Cast<UStaticMeshComponent>(PlayerActor->GetComponentsByTag(UPrimitiveComponent::StaticClass(), FName("Gun"))[0]); const UStaticMeshComponent* GunComponent = Cast<UStaticMeshComponent>(PlayerActor->GetComponentsByTag(UPrimitiveComponent::StaticClass(), FName("Gun"))[0]);
const FVector GunLocationOffset = GunComponent->GetSocketTransform("Muzzle").TransformPosition(FVector(-100, 0, 0)); const FVector GunLocationOffset = GunComponent->GetSocketTransform("Muzzle").TransformPosition(FVector(-100, 0, 0));
UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), GunEffect, GunLocationOffset, PlayerActor->GetActorRotation()); UNiagaraFunctionLibrary::SpawnSystemAtLocation(GetWorld(), GunEffect, GunLocationOffset, PlayerActor->GetActorRotation());
} }
if (ChainDamageMultiplier == 1) BaseDamageMultiplier = 1;
if ((CurrentComboString == "II" || CurrentComboString == "PP" || CurrentComboString == "EE" || CurrentComboString == "AA") &&
(PreviousComboString == "II" || PreviousComboString == "PP" || PreviousComboString == "EE" || PreviousComboString == "AA"))
{
ChainDamageMultiplier += 0.2;
DamageMultiplierTextBlock->SetText(FText::Join(FText::FromString(""), FText::FromString("x"), FText::FromString(FString::SanitizeFloat(ChainDamageMultiplier))));
}
else if (CurrentComboString == "EI")
{
BaseDamageMultiplier = ChainDamageMultiplier;
ChainDamageMultiplier = 1;
DamageMultiplierTextBlock->SetText(FText::FromString(""));
}
PreviousComboString = CurrentComboString;
CurrentComboString = ""; CurrentComboString = "";
UpdateComboString(CurrentComboString); UpdateComboString(CurrentComboString);
RevertActionPoints(); RevertActionPoints();
@ -251,21 +276,6 @@ void ATurnBaseCombatV2::ExecuteCast(FString Combo)
break; break;
} }
//Ends Combat if either the player or enemy is dead
if (*EnemyHealth <= 0)
{
EndCombat();
EnemyActor->Destroy();
return;
}
if (*PlayerHealth <= 0)
{
//EndCombat();
DeathScreenWidget = CreateWidget<UUserWidget>(GetWorld(), DeathScreenWidgetSubclass);
DeathScreenWidget->AddToViewport();
return;
}
if (!bPlayerHasExtraTurn) if (!bPlayerHasExtraTurn)
{ {
SwitchTurn(); SwitchTurn();
@ -293,16 +303,44 @@ void ATurnBaseCombatV2::RevertActionPoints()
void ATurnBaseCombatV2::DamagePlayer(int Damage, FString DamageType) void ATurnBaseCombatV2::DamagePlayer(int Damage, FString DamageType)
{ {
*PlayerHealth -= FMath::Clamp(Damage, 0, 100); *PlayerHealth -= FMath::Clamp(Damage * BaseDefenseMultiplier, 0, 100);
UpdateProgressBars(); UpdateProgressBars();
AddBattleLogMessage("Player was damaged for " + FString::FromInt(Damage) + " HP by " + DamageType + "."); AddBattleLogMessage("Player was damaged for " + FString::FromInt(Damage * BaseDefenseMultiplier) + " HP by " + DamageType + ".");
//Ends Combat if either the player or enemy is dead
if (*EnemyHealth <= 0)
{
EndCombat();
EnemyActor->Destroy();
return;
}
if (*PlayerHealth <= 0)
{
//EndCombat();
DeathScreenWidget = CreateWidget<UUserWidget>(GetWorld(), DeathScreenWidgetSubclass);
DeathScreenWidget->AddToViewport();
return;
}
} }
void ATurnBaseCombatV2::DamageEnemy(int Damage, FString DamageType) void ATurnBaseCombatV2::DamageEnemy(int Damage, FString DamageType)
{ {
*EnemyHealth -= FMath::Clamp(Damage, 0, 100); *EnemyHealth -= FMath::Clamp(Damage * BaseDamageMultiplier, 0, 100);
UpdateProgressBars(); UpdateProgressBars();
AddBattleLogMessage("Enemy was damaged for " + FString::FromInt(Damage) + " HP by " + DamageType + "."); AddBattleLogMessage("Enemy was damaged for " + FString::FromInt(Damage * BaseDamageMultiplier) + " HP by " + DamageType + ".");
//Ends Combat if either the player or enemy is dead
if (*EnemyHealth <= 0)
{
EndCombat();
EnemyActor->Destroy();
return;
}
if (*PlayerHealth <= 0)
{
//EndCombat();
DeathScreenWidget = CreateWidget<UUserWidget>(GetWorld(), DeathScreenWidgetSubclass);
DeathScreenWidget->AddToViewport();
return;
}
} }
void ATurnBaseCombatV2::UpdateProgressBars() const void ATurnBaseCombatV2::UpdateProgressBars() const
@ -481,6 +519,7 @@ void ATurnBaseCombatV2::RunButtonOnClick()
SwitchTurn(); SwitchTurn();
return; return;
} }
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Escape Successful"));
UBlackboardComponent* EnemyBlackboard = Cast<AAIController>(EnemyActor->GetInstigatorController())->GetBlackboardComponent(); UBlackboardComponent* EnemyBlackboard = Cast<AAIController>(EnemyActor->GetInstigatorController())->GetBlackboardComponent();
EscapePercentageTextBlock->SetText(FText::Join(FText::FromString(""), FText::FromString("--"), FText::FromString("%"))); EscapePercentageTextBlock->SetText(FText::Join(FText::FromString(""), FText::FromString("--"), FText::FromString("%")));
EnemyBlackboard->SetValueAsBool("IsInCombat", false); EnemyBlackboard->SetValueAsBool("IsInCombat", false);
@ -551,6 +590,28 @@ void ATurnBaseCombatV2::ToggleButtons() const
RunButton->SetIsEnabled(!RunButton->GetIsEnabled()); RunButton->SetIsEnabled(!RunButton->GetIsEnabled());
} }
void ATurnBaseCombatV2::DisableButtons() const
{
PButton->SetIsEnabled(false);
EButton->SetIsEnabled(false);
AButton->SetIsEnabled(false);
IButton->SetIsEnabled(false);
BackspaceButton->SetIsEnabled(false);
CastButton->SetIsEnabled(false);
RunButton->SetIsEnabled(false);
}
void ATurnBaseCombatV2::EnableButtons() const
{
PButton->SetIsEnabled(true);
EButton->SetIsEnabled(true);
AButton->SetIsEnabled(true);
IButton->SetIsEnabled(true);
BackspaceButton->SetIsEnabled(true);
CastButton->SetIsEnabled(true);
RunButton->SetIsEnabled(true);
}
void ATurnBaseCombatV2::EnemyTurn() void ATurnBaseCombatV2::EnemyTurn()
{ {
DamagePlayer(10); DamagePlayer(10);

View File

@ -29,8 +29,15 @@ public:
bool bIsInCombat = false; bool bIsInCombat = false;
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
int DefaultActionPoints = 2; float BaseDamageMultiplier = 1.0f;
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
float BaseDefenseMultiplier = 1.0f;
UPROPERTY()
float ChainDamageMultiplier = 1.0f;
UPROPERTY(EditDefaultsOnly)
int DefaultActionPoints = 2;
UPROPERTY()
int ActiveActionPoints = 0; int ActiveActionPoints = 0;
UPROPERTY(EditDefaultsOnly) UPROPERTY(EditDefaultsOnly)
@ -47,7 +54,7 @@ public:
UPROPERTY(VisibleAnywhere) UPROPERTY(VisibleAnywhere)
AActor* PlayerActor; AActor* PlayerActor;
UPROPERTY(VisibleAnywhere) UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
AActor* EnemyActor; AActor* EnemyActor;
// AActor* ActiveActor; // AActor* ActiveActor;
UPROPERTY(BlueprintReadWrite) UPROPERTY(BlueprintReadWrite)
@ -59,53 +66,40 @@ public:
UUserWidget* CombatTutorialWidgetInstance; UUserWidget* CombatTutorialWidgetInstance;
UPROPERTY() UPROPERTY()
UWidgetComponent* PlayerWidget; UWidgetComponent* PlayerWidget;
/*
TODO:
Reference Player Inventory
*/
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
TSubclassOf<UUserWidget> HUDWidget; TSubclassOf<UUserWidget> HUDWidget;
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
TSubclassOf<UUserWidget> CombatTutorialWidget; TSubclassOf<UUserWidget> CombatTutorialWidget;
UPROPERTY() UPROPERTY(BlueprintReadWrite)
bool HasSeenTutorial = false; bool HasSeenTutorial = false;
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
TMap<FString, int32> ValidCombos = TMap<FString, int32> ValidCombos =
{ {
{"P", 5}, {"PE", 15},
{"PP", 15}, {"PA", 15},
{"PPP", 20},
{"E", 5},
{"EE", 15},
{"EEE", 20},
{"A", 5},
{"AA", 15},
{"AAA", 20},
{"I", 5},
{"II", 15},
{"III", 20},
{"IA", 15},
{"IIA", 20},
{"EP", 15},
{"EEP", 20},
{"AE", 15},
{"AAE", 20},
{"PI", 15}, {"PI", 15},
{"PPI", 20} {"EA", 15},
{"EI", 15},
{"AI", 15},
{"PP", 20},
{"EE", 20},
{"AA", 20},
{"II", 20}
}; };
UPROPERTY(EditAnywhere) UPROPERTY(EditAnywhere)
TMap<FString, FString> SpecialCombos = TMap<FString, FString> SpecialCombos =
{ {
//{"IIA", "ReduceActSpeed"}, {"PA", "Thorns"},
//{"EEP", "AreaOfEffect"}, {"PI", "DamageOverTime"}
{"AAE", "Thorns"},
{"PPI", "DamageOverTime"}
}; };
FString BattleLog; FString BattleLog;
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void StartCombat(AActor* Enemy); void StartCombat(AActor* Enemy, bool bWasShot = false);
UFUNCTION(BlueprintCallable)
void CombatCheck(bool bWasShot = false);
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void EndCombat(); void EndCombat();
@ -146,53 +140,57 @@ private:
UPROPERTY(VisibleAnywhere) UPROPERTY(VisibleAnywhere)
bool bIsPlayerTurn = true; bool bIsPlayerTurn = true;
FString PreviousComboString = "";
UPROPERTY(VisibleAnywhere) UPROPERTY(VisibleAnywhere)
FString CurrentComboString = ""; FString CurrentComboString = "";
void SwitchTurn(); void SwitchTurn();
UPROPERTY(VisibleAnywhere) UPROPERTY()
UTextBlock* TurnIndicatorTextBlock; UTextBlock* TurnIndicatorTextBlock;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UTextBlock* CurrentComboTextBlock; UTextBlock* CurrentComboTextBlock;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UTextBlock* CurrentComboTextBlock1; UTextBlock* CurrentComboTextBlock1;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UTextBlock* CurrentComboTextBlock2; UTextBlock* CurrentComboTextBlock2;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UTextBlock* BattleLogTextBlock; UTextBlock* BattleLogTextBlock;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UTextBlock* EscapePercentageTextBlock; UTextBlock* EscapePercentageTextBlock;
UPROPERTY()
UTextBlock* DamageMultiplierTextBlock;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UProgressBar* PlayerHealthBar; UProgressBar* PlayerHealthBar;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UProgressBar* EnemyHealthBar; UProgressBar* EnemyHealthBar;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UProgressBar* ProbertiumResourceBar; UProgressBar* ProbertiumResourceBar;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UProgressBar* EisResourceBar; UProgressBar* EisResourceBar;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UProgressBar* AzosResourceBar; UProgressBar* AzosResourceBar;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UProgressBar* IroquoidResourceBar; UProgressBar* IroquoidResourceBar;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* CastButton; UButton* CastButton;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* PButton; UButton* PButton;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* EButton; UButton* EButton;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* AButton; UButton* AButton;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* IButton; UButton* IButton;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* BackspaceButton; UButton* BackspaceButton;
UPROPERTY(VisibleAnywhere) UPROPERTY()
UButton* RunButton; UButton* RunButton;
UFUNCTION() UFUNCTION()
@ -221,6 +219,10 @@ private:
void UpdateResourceBars() const; void UpdateResourceBars() const;
UFUNCTION(BlueprintCallable) UFUNCTION(BlueprintCallable)
void ToggleButtons() const; void ToggleButtons() const;
UFUNCTION(BlueprintCallable)
void DisableButtons() const;
UFUNCTION(BlueprintCallable)
void EnableButtons() const;
void EnemyTurn(); void EnemyTurn();
UPROPERTY() UPROPERTY()

View File

@ -10,7 +10,7 @@ public class the_twilight_abyss : ModuleRules
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Niagara", "AIModule", "Json" }); PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "UMG", "Niagara", "AIModule", "Json" });
PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore", "AdvancedWidgets" });
// Uncomment if you are using Slate UI // Uncomment if you are using Slate UI
// PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });