From e0580c25e4aea55090bcb44da32dfd104cadd153 Mon Sep 17 00:00:00 2001
From: rassv453 <rassv453@student.liu.se>
Date: Thu, 24 Oct 2024 10:00:38 +0200
Subject: [PATCH] Added invincible when taking damage

---
 scenes/characters/mouse/player.tscn |  5 +++++
 scripts/characters/mouse/player.gd  | 34 +++++++++++++++++++++++------
 2 files changed, 32 insertions(+), 7 deletions(-)

diff --git a/scenes/characters/mouse/player.tscn b/scenes/characters/mouse/player.tscn
index d41a32a..894ce76 100644
--- a/scenes/characters/mouse/player.tscn
+++ b/scenes/characters/mouse/player.tscn
@@ -658,3 +658,8 @@ debug_color = Color(1, 0, 0.0999999, 0.682353)
 [node name="hit_box_collision" type="CollisionShape2D" parent="hit_box"]
 shape = SubResource("CircleShape2D_vktk8")
 debug_color = Color(0, 0.64181, 0.328266, 0.42)
+
+[node name="invincibility_timer" type="Timer" parent="."]
+unique_name_in_owner = true
+
+[connection signal="timeout" from="invincibility_timer" to="." method="_on_invincibility_timer_timeout"]
diff --git a/scripts/characters/mouse/player.gd b/scripts/characters/mouse/player.gd
index 0393b64..40c34d7 100644
--- a/scripts/characters/mouse/player.gd
+++ b/scripts/characters/mouse/player.gd
@@ -11,6 +11,8 @@ var attack_duration = 0.5
 var is_falling = false
 var is_flying = false
 var attack_switch = false
+var is_invincible = false
+
 
 # Cooldown variables
 var attack_cooldown = 0.7 
@@ -37,6 +39,7 @@ var knockback_strength = 220
 @onready var animated_sprite_2d: AnimatedSprite2D = $animated_sprite_mouse
 @onready var hit_box: HitBox = $hit_box
 @onready var hurt_box: HurtBox = $hurt_box
+@onready var invincibility_timer: Timer = %invincibility_timer
 
 func _ready():
 	spawn_point = global_position
@@ -170,23 +173,36 @@ func is_colliding() -> bool:
 
 # Function to handle taking damage
 func take_damage(amount: int, attacker_position: Vector2):
-	if is_dead:
+	if is_dead or is_invincible:
 		return
 	
+	# Update health
 	current_health -= amount
 	hud.update_health(current_health)
+
+	start_invincibility()
 	
 	# Emit signal when damage is taken
 	player_take_damage.emit()
 	
+	# Calculate knockback direction here
+	var direction = (position - attacker_position).normalized()
+	knockback_velocity = direction * knockback_strength
+	knockback_timer = knockback_duration
+	animated_sprite_2d.play("damaged")
+	
 	if current_health <= 0:
 		die()
-	else:
-		# Calculate knockback direction here
-		var direction = (position - attacker_position).normalized()
-		knockback_velocity = direction * knockback_strength
-		knockback_timer = knockback_duration
-		animated_sprite_2d.play("damaged")
+
+func start_invincibility() -> void:
+	is_invincible = true
+	
+	var tween = create_tween()
+	tween.set_loops(4) # Flash 4 times
+	tween.tween_property(animated_sprite_2d, "modulate:a", 0.2, 0.1)
+	tween.tween_property(animated_sprite_2d, "modulate:a", 1.0, 0.1)
+	
+	invincibility_timer.start(1.0)
 
 # Function to handle player death
 func die():	
@@ -234,3 +250,7 @@ func fall_in_pit():
 	await tween.finished
 	
 	is_falling = false
+
+
+func _on_invincibility_timer_timeout() -> void:
+	is_invincible = false