- Home /
Buff/debuff system (Temporarily change variables)
Hello everyone!
I'm trying to design a buff/debuff system for my game (Like in games such as World of Warcraft). My first approach was a class called Effect. This class has override-able methods that are called when the character receives the buff/debuff and when the effect wears off. For example, here is what a "slow movement" effect would look like:
public override void StartEffect () {
originalSpeed = victim.speed;
victim.speed = originalSpeed * 0.5f;
}
public override void EndEffect () {
victim.speed = originalSpeed;
}
It works as it should! But not until you add another effect which alters the same variable. Suppose our character Bob first receives a "slow movement" debuff which reduces speed by 50%. Then he gets a "curse" debuff which reduces his speed by an additional 20%. The curse effect would register the "original speed" to be 50% of the ACTUAL original speed because "slow movement" has already halved the speed. If "curse" wears off after "slow movement" does, poor Bob would be left with speed of 50% of original forever.
Another inconvenience with this approach is that you have to reverse every change you make to the variables in the end.
What would be your approach for something like this? Thanks in advance :)
Answer by SMDSMD · Aug 25, 2013 at 07:15 AM
You could uses a Stack and when you initialize, you push the original value on it. Whenever you apply a buff, you push the new value on top, potentially reading the previous top value and modifying it. When the buff is done, you pop the top element of the stack.
However, this gets messy when the buffs have different timeouts, in this case, you could use a List of buff objects, where each buff object has a method float Apply(float input_value). Then, when you add a new buff, you just Add it to the list. Removing the buff means you remove the buff from the list. This can in theory be expensive, but for small numbers of buffs it's not gonna be a problem.
Whenever you add/remove a buff, you just loop through the buffs, calling Apply with the previous buffs' value. The first buff would use the base value.
Your answer
Follow this Question
Related Questions
How to Keep Track of ScriptableObject Coroutine Durations? 1 Answer
Built in Glass Stained Bump distort on Particles 0 Answers
Audio Low Pass Filter Not Working 1 Answer
In what way would be best to achieve a retro Gameboy simulation 0 Answers
How can I do such as that effect for my water sprite in Unity? 1 Answer