bool FScalableFloat::SerializeFromMismatchedTag(const FPropertyTag& Tag, FArchive& Ar) { if (Tag.Type == NAME_FloatProperty) { float OldValue; Ar << OldValue; *this = FScalableFloat(OldValue); return true; } return false; }
void Test_PeriodicDamage() { const int32 NumPeriods = 10; const float PeriodSecs = 1.0f; const float DamagePerPeriod = 5.f; const float StartingHealth = DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health; // just try and reduce the health attribute { CONSTRUCT_CLASS(UGameplayEffect, BaseDmgEffect); AddModifier(BaseDmgEffect, GET_FIELD_CHECKED(UAbilitySystemTestAttributeSet, Health), EGameplayModOp::Additive, FScalableFloat(-DamagePerPeriod)); BaseDmgEffect->DurationPolicy = EGameplayEffectDurationType::HasDuration; BaseDmgEffect->DurationMagnitude = FGameplayEffectModifierMagnitude(FScalableFloat(NumPeriods * PeriodSecs)); BaseDmgEffect->Period.Value = PeriodSecs; SourceComponent->ApplyGameplayEffectToTarget(BaseDmgEffect, DestComponent, 1.f); } int32 NumApplications = 0; // Tick a small number to verify the application tick TickWorld(SMALL_NUMBER); ++NumApplications; TestEqual(SKILL_TEST_TEXT("Health Reduced"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health, StartingHealth - (DamagePerPeriod * NumApplications)); // Tick a bit more to address possible floating point issues TickWorld(PeriodSecs * .1f); for (int32 i = 0; i < NumPeriods; ++i) { // advance time by one period TickWorld(PeriodSecs); ++NumApplications; // check that health has been reduced TestEqual(SKILL_TEST_TEXT("Health Reduced"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health, StartingHealth - (DamagePerPeriod * NumApplications)); } // advance time by one extra period TickWorld(PeriodSecs); // should not have reduced further TestEqual(SKILL_TEST_TEXT("Health Reduced"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health, StartingHealth - (DamagePerPeriod * NumApplications)); // TODO: test that the effect is no longer applied }
void Test_ManaBuff() { const float BuffValue = 30.f; const float StartingMana = DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Mana; FActiveGameplayEffectHandle BuffHandle; // apply the buff { CONSTRUCT_CLASS(UGameplayEffect, DamageBuffEffect); AddModifier(DamageBuffEffect, GET_FIELD_CHECKED(UAbilitySystemTestAttributeSet, Mana), EGameplayModOp::Additive, FScalableFloat(BuffValue)); DamageBuffEffect->DurationPolicy = EGameplayEffectDurationType::Infinite; BuffHandle = SourceComponent->ApplyGameplayEffectToTarget(DamageBuffEffect, DestComponent, 1.f); } // check that the value changed TestEqual(SKILL_TEST_TEXT("Mana Buffed"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Mana, StartingMana + BuffValue); // remove the effect { DestComponent->RemoveActiveGameplayEffect(BuffHandle); } // check that the value changed back TestEqual(SKILL_TEST_TEXT("Mana Restored"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Mana, StartingMana); }
void Test_InstantDamageRemap() { const float DamageValue = 5.f; const float StartingHealth = DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health; // This is the same as GameplayEffectsTest_InstantDamage but modifies the Damage attribute and confirms it is remapped to -Health by UAbilitySystemTestAttributeSet::PostAttributeModify { CONSTRUCT_CLASS(UGameplayEffect, BaseDmgEffect); AddModifier(BaseDmgEffect, GET_FIELD_CHECKED(UAbilitySystemTestAttributeSet, Damage), EGameplayModOp::Additive, FScalableFloat(DamageValue)); BaseDmgEffect->DurationPolicy = EGameplayEffectDurationType::Instant; SourceComponent->ApplyGameplayEffectToTarget(BaseDmgEffect, DestComponent, 1.f); } // Now we should have lost some health TestEqual(SKILL_TEST_TEXT("Health Reduced"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health, StartingHealth - DamageValue); // Confirm the damage attribute itself was reset to 0 when it was applied to health TestEqual(SKILL_TEST_TEXT("Damage Applied"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Damage, 0.f); }
void Test_InstantDamage() { const float DamageValue = 5.f; const float StartingHealth = DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health; // just try and reduce the health attribute { CONSTRUCT_CLASS(UGameplayEffect, BaseDmgEffect); AddModifier(BaseDmgEffect, GET_FIELD_CHECKED(UAbilitySystemTestAttributeSet, Health), EGameplayModOp::Additive, FScalableFloat(-DamageValue)); BaseDmgEffect->DurationPolicy = EGameplayEffectDurationType::Instant; SourceComponent->ApplyGameplayEffectToTarget(BaseDmgEffect, DestComponent, 1.f); } // make sure health was reduced TestEqual(SKILL_TEST_TEXT("Health Reduced"), DestComponent->GetSet<UAbilitySystemTestAttributeSet>()->Health, StartingHealth - DamageValue); }