Burn effect over time on enemies - timer node help

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By quizzcode

Hey !
Im working on a tower defense game.
And I’d like some of my towers to apply a BURN / POISON effect.

I need a little help on how to structures the function…
right now when PROJECTILE hit ENEMY i start the function enemy.EFFECT()

func effect(effect_type,effect_amount,effect_time) 

Effect type : 1 2 3 4; 1 = damage over time. 2,3,4 are other system (speed debuf etc…)
Effect amount (in our case) : The total damage to deal.
Effect time : how long does it last. (in secondes)
(so i can basically take the dmg and divide it by time to know every “tick” time)

Alright,
so now im here… And my challenge is the “double timer”. Because one timer needs to make the effect last, let’s say 8 seconds. And the other one needs to TICK every X seconds and apply the dmg.
So… 2 timers ? node timer or delta timer created directly in the script ?

Then, once the “status” is applied, if the same effect is applied, i want to reset the timer and dmg to the original stats. - this part won’t be hard.

how would you proceed with the timer situation ?
Someone recommended me to create a unique scene for each debuff and give_parent to the ENEMY.

thx !

If I could (and if I’m understanding this correctly), I would have two variables that kept track of time, and it only involved the usage of delta in the _process() function. I would structure it like this.

 # In the script that oversees debuffs.
 var effect_time = 8.0
 var dmg_time = 0.0

 # One counts up while the other counts down.
 dmg_time -= delta
 effect_time += delta

 if dmg_time >= 1.0:
      dmg_time = 0.0
      apply_dmg(amount) # This is calculated elsewhere.

  # End the effect.
  if effect_time <= 0.0:
       return

If the effects are going to be applied to enemies, I would build in some kind of class to the enemies’ script. But that may bring along other complications (I don’t entirely know how you have your towers and enemies structured).

Ertain | 2020-05-19 08:33

Hey !
Thanks for your reply.
I actually did a very similar thing in the mean time :

if statuts_1 == 0:
		var total_damage = effect_amount / effect_time #how much dmg
		for i in range(effect_time):
			statuts_1 = 1
			yield(get_tree().create_timer(1), "timeout") 
			if i == effect_time-1:
				statuts_1 = 0
				print("total_damage") ##last dmg tick.
				break
			else:
				print(total_damage) ### apply dmg
				
	else:
		print("already burning")

This works great.
it avoid the “stacking” stop burning status to cumulate.
I’m blocking on one thing tho. How could i “reset” the timer when hit ?
I don’t see any solution because each projectile trigger the function separately.

Do you see any solution ?

quizzcode | 2020-05-19 15:08

:bust_in_silhouette: Reply From: astrale-sharp

I see an easy to do solution:
On hit, get rid of the old timer if there is one and apply your same logic, m i clear? :slight_smile:
Good luck!