-
Notifications
You must be signed in to change notification settings - Fork 3
/
CentralizedCustomLogicTests.cs
132 lines (113 loc) · 4.16 KB
/
CentralizedCustomLogicTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
using ModiBuff.Core;
using ModiBuff.Core.Units;
using NUnit.Framework;
namespace ModiBuff.Tests
{
public sealed class CentralizedCustomLogicTests : ModifierTests
{
public static readonly RecipeAddFunc PoisonRecipe = add => add("Poison")
.Stack(WhenStackEffect.Always)
.Effect(new PoisonDamageEffect(), EffectOn.Interval | EffectOn.Stack)
.Interval(1)
.Remove(5).Refresh();
[Test]
public void PoisonEffect()
{
AddRecipe(PoisonRecipe);
Setup();
Unit.AddApplierModifier(Recipes.GetGenerator("Poison"), ApplierType.Cast);
Unit.TryCast("Poison", Enemy);
Enemy.Update(1);
Assert.AreEqual(EnemyHealth - 5, Enemy.Health);
Unit.TryCast("Poison", Enemy);
Enemy.Update(1);
Assert.AreEqual(EnemyHealth - 5 - 5 * 2, Enemy.Health);
}
private static readonly RecipeAddFunc[] healBasedOnPoisonStacksEventRecipes =
{
add => add("HealPerPoisonStack")
.Effect(new HealEffect(0, HealEffect.EffectState.None,
StackEffectType.Effect | StackEffectType.SetStacksBased, 1), EffectOn.CallbackEffect)
.CallbackEffect(CallbackType.PoisonDamage, effect =>
new PoisonEvent((target, source, stacks, totalStacks, damage) =>
{
//Kind of a stacks hack rn, by using stack effect in callbacks
((IStackEffect)effect).StackEffect(stacks, target, source);
})),
//ModifierAction.Stack version
add => add("HealPerPoisonStack")
.Tag(Core.TagType.CustomStack)
.Stack(WhenStackEffect.Always)
.Effect(new HealEffect(0, HealEffect.EffectState.None,
StackEffectType.Effect | StackEffectType.SetStacksBased, 1), EffectOn.Stack)
.CallbackEffect(CallbackType.PoisonDamage, effect =>
new PoisonEvent((target, source, stacks, totalStacks, damage) =>
{
effect.Effect(target, source);
}))
.ModifierAction(ModifierAction.Stack, EffectOn.CallbackEffect)
};
[TestCaseSource(nameof(healBasedOnPoisonStacksEventRecipes))]
public void HealBasedOnPoisonStacksEvent(RecipeAddFunc recipe)
{
AddRecipe(PoisonRecipe);
AddRecipe(recipe);
Setup();
Enemy.AddModifierSelf("HealPerPoisonStack");
Unit.AddApplierModifier(Recipes.GetGenerator("Poison"), ApplierType.Cast);
Unit.TryCast("Poison", Enemy);
Enemy.Update(1);
Enemy.AddModifierSelf("HealPerPoisonStack"); //Checks for stack behaviour
Assert.AreEqual(EnemyHealth - 5 + 1, Enemy.Health);
Unit.TryCast("Poison", Enemy);
Enemy.Update(1);
Assert.AreEqual(EnemyHealth - 5 + 1 - 5 * 2 + 1 * 2, Enemy.Health);
}
[Test]
public void HealBasedOnPoisonStacks()
{
AddRecipe(PoisonRecipe);
AddRecipe("PoisonHealHeal")
.Stack(WhenStackEffect.Always)
.Effect(new HealEffect(0, HealEffect.EffectState.None,
StackEffectType.Effect | StackEffectType.SetStacksBased, 1)
.SetMetaEffects(new AddValueBasedOnPoisonStacksMetaEffect(1f)), EffectOn.Stack);
AddEffect("PoisonHeal",
new ApplierEffect("Poison"),
new ApplierEffect("PoisonHealHeal", targeting: Targeting.SourceTarget));
Setup();
Unit.TakeDamage(UnitHealth / 2f, Unit);
Unit.AddEffectApplier("PoisonHeal");
Unit.TryCastEffect("PoisonHeal", Enemy);
Assert.AreEqual(UnitHealth / 2f + 1, Unit.Health);
Unit.TryCastEffect("PoisonHeal", Enemy);
Assert.AreEqual(UnitHealth / 2f + 1 + 1 * 2, Unit.Health);
}
[Test]
public void PoisonDamageThornsEvent()
{
AddRecipe(PoisonRecipe);
AddRecipe("PoisonThorns")
.Callback(CallbackType.PoisonDamage,
new PoisonEvent((target, source, stacks, totalStacks, damage) =>
{
((IAttackable<float, float>)source).TakeDamage(damage, target);
}));
Setup();
Enemy.AddModifierSelf("PoisonThorns");
Unit.AddApplierModifier(Recipes.GetGenerator("Poison"), ApplierType.Cast);
Unit.TryCast("Poison", Enemy);
Assert.AreEqual(UnitHealth, Unit.Health);
Enemy.Update(1);
Assert.AreEqual(UnitHealth - 5, Unit.Health);
Unit.TryCast("Poison", Enemy);
Enemy.Update(1);
Assert.AreEqual(UnitHealth - 5 - 5 * 2, Unit.Health);
Ally.AddApplierModifier(Recipes.GetGenerator("Poison"), ApplierType.Cast);
Ally.TryCast("Poison", Enemy);
Enemy.Update(1);
Assert.AreEqual(UnitHealth - 5 - 5 * 2 - 5 * 2, Unit.Health);
Assert.AreEqual(AllyHealth - 5, Ally.Health);
}
}
}