Merge branch 'Combat' into dev
This commit is contained in:
commit
383a85449e
BIN
Content/BlueprintAI/AI/AIBruh.uasset
(Stored with Git LFS)
BIN
Content/BlueprintAI/AI/AIBruh.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Blueprints/Combat_UI/BookCombat_UI.uasset
(Stored with Git LFS)
BIN
Content/Blueprints/Combat_UI/BookCombat_UI.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Blueprints/Combat_UI/CombatCharacter.uasset
(Stored with Git LFS)
BIN
Content/Blueprints/Combat_UI/CombatCharacter.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Blueprints/Combat_UI/CombatInit.uasset
(Stored with Git LFS)
BIN
Content/Blueprints/Combat_UI/CombatInit.uasset
(Stored with Git LFS)
Binary file not shown.
BIN
Content/Blueprints/Combat_UI/CombatTutorial.uasset
(Stored with Git LFS)
BIN
Content/Blueprints/Combat_UI/CombatTutorial.uasset
(Stored with Git LFS)
Binary file not shown.
@ -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)
|
||||||
{
|
{
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
|
@ -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()
|
||||||
|
@ -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" });
|
||||||
|
Loading…
Reference in New Issue
Block a user