Updated Combat to Include Damage Stacking

This commit is contained in:
Philip W 2023-04-26 03:52:22 +01:00
parent 15d2734c52
commit 32f20c12c3
3 changed files with 54 additions and 26 deletions

Binary file not shown.

View File

@ -36,6 +36,7 @@ void ATurnBaseCombatV2::StartCombat(AActor* Enemy)
{
if (Enemy == nullptr) return;
if (bIsInCombat) return;
BookHUD->SetVisibility(ESlateVisibility::SelfHitTestInvisible);
EscapePercentage = CalculateEscapePercentage();
EscapePercentageTextBlock->SetText(FText::Join(FText::FromString(""), FText::FromString(FString::FromInt(EscapePercentage * 100)), FText::FromString("%")));
const FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY());
@ -100,6 +101,8 @@ void ATurnBaseCombatV2::StartCombat(AActor* Enemy)
void ATurnBaseCombatV2::EndCombat()
{
BookHUD->SetVisibility(ESlateVisibility::Hidden);
Cast<ATempCharacter>(PlayerActor)->ResetWidgetPointer();
const FVector2D ViewportSize = FVector2D(GEngine->GameViewport->Viewport->GetSizeXY());
TurnIndicatorTextBlock->SetText(FText::FromString(""));
GetWorld()->GetFirstPlayerController()->SetMouseLocation(ViewportSize.X / 2, ViewportSize.Y / 2);
@ -152,6 +155,7 @@ void ATurnBaseCombatV2::BeginPlay()
CurrentComboTextBlock2 = Cast<UTextBlock>(BookHUD->GetWidgetFromName("CurrentCombo_2"));
BattleLogTextBlock = Cast<UTextBlock>(HUD->GetWidgetFromName("BattleLog"));
EscapePercentageTextBlock = Cast<UTextBlock>(BookHUD->GetWidgetFromName("EscapePercentage_Text"));
DamageMultiplierTextBlock = Cast<UTextBlock>(BookHUD->GetWidgetFromName("DamageMultiplier_Text"));
PlayerHealthBar = Cast<UProgressBar>(BookHUD->GetWidgetFromName("PlayerHealthBar"));
EnemyHealthBar = Cast<UProgressBar>(HUD->GetWidgetFromName("EnemyHealthBar"));
ProbertiumResourceBar = Cast<UProgressBar>(BookHUD->GetWidgetFromName("ProbertiumResourceBar"));
@ -231,26 +235,27 @@ void ATurnBaseCombatV2::ExecuteCast(FString Combo)
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 = "";
UpdateComboString(CurrentComboString);
RevertActionPoints();
UpdateActionPoints();
//Damage Calculation
switch (bIsPlayerTurn)
{
case true:
// Player Turn
DamageEnemy(*ValidCombos.Find(Combo));
OnPlayerTurn.Broadcast(PlayerActor, EnemyActor);
break;
case false:
// Enemy Turn
DamagePlayer(*ValidCombos.Find(Combo));
OnEnemyTurn.Broadcast(EnemyActor, PlayerActor);
break;
}
//Ends Combat if either the player or enemy is dead
if (*EnemyHealth <= 0)
{
@ -266,6 +271,21 @@ void ATurnBaseCombatV2::ExecuteCast(FString Combo)
return;
}
//Damage Calculation
switch (bIsPlayerTurn)
{
case true:
// Player Turn
DamageEnemy(*ValidCombos.Find(Combo));
OnPlayerTurn.Broadcast(PlayerActor, EnemyActor);
break;
case false:
// Enemy Turn
DamagePlayer(*ValidCombos.Find(Combo));
OnEnemyTurn.Broadcast(EnemyActor, PlayerActor);
break;
}
if (!bPlayerHasExtraTurn)
{
SwitchTurn();
@ -293,16 +313,16 @@ void ATurnBaseCombatV2::RevertActionPoints()
void ATurnBaseCombatV2::DamagePlayer(int Damage, FString DamageType)
{
*PlayerHealth -= FMath::Clamp(Damage, 0, 100);
*PlayerHealth -= FMath::Clamp(Damage * BaseDefenseMultiplier, 0, 100);
UpdateProgressBars();
AddBattleLogMessage("Player was damaged for " + FString::FromInt(Damage) + " HP by " + DamageType + ".");
AddBattleLogMessage("Player was damaged for " + FString::FromInt(Damage * BaseDefenseMultiplier) + " HP by " + DamageType + ".");
}
void ATurnBaseCombatV2::DamageEnemy(int Damage, FString DamageType)
{
*EnemyHealth -= FMath::Clamp(Damage, 0, 100);
*EnemyHealth -= FMath::Clamp(Damage * BaseDamageMultiplier, 0, 100);
UpdateProgressBars();
AddBattleLogMessage("Enemy was damaged for " + FString::FromInt(Damage) + " HP by " + DamageType + ".");
AddBattleLogMessage("Enemy was damaged for " + FString::FromInt(Damage * BaseDamageMultiplier) + " HP by " + DamageType + ".");
}
void ATurnBaseCombatV2::UpdateProgressBars() const

View File

@ -29,8 +29,15 @@ public:
bool bIsInCombat = false;
UPROPERTY(EditDefaultsOnly)
int DefaultActionPoints = 2;
float BaseDamageMultiplier = 1.0f;
UPROPERTY(EditDefaultsOnly)
float BaseDefenseMultiplier = 1.0f;
UPROPERTY()
float ChainDamageMultiplier = 1.0f;
UPROPERTY(EditDefaultsOnly)
int DefaultActionPoints = 2;
UPROPERTY()
int ActiveActionPoints = 0;
UPROPERTY(EditDefaultsOnly)
@ -59,10 +66,7 @@ public:
UUserWidget* CombatTutorialWidgetInstance;
UPROPERTY()
UWidgetComponent* PlayerWidget;
/*
TODO:
Reference Player Inventory
*/
UPROPERTY(EditAnywhere)
TSubclassOf<UUserWidget> HUDWidget;
UPROPERTY(EditAnywhere)
@ -134,6 +138,8 @@ private:
UPROPERTY(VisibleAnywhere)
bool bIsPlayerTurn = true;
FString PreviousComboString = "";
UPROPERTY(VisibleAnywhere)
FString CurrentComboString = "";
@ -151,6 +157,8 @@ private:
UTextBlock* BattleLogTextBlock;
UPROPERTY()
UTextBlock* EscapePercentageTextBlock;
UPROPERTY()
UTextBlock* DamageMultiplierTextBlock;
UPROPERTY()
UProgressBar* PlayerHealthBar;