diff --git a/enemies/leech/segment.tscn b/enemies/leech/segment.tscn index d33a9ad..ac86a92 100644 --- a/enemies/leech/segment.tscn +++ b/enemies/leech/segment.tscn @@ -26,6 +26,7 @@ shape = SubResource("RectangleShape2D_fgt1l") collision_layer = 16 canvasItem = NodePath("..") flashColor = Color(2.00392, 2.00392, 2.00392, 1) +id_block_time = 0 [node name="CollisionShape2D" type="CollisionShape2D" parent="EnemyHurtbox"] visible = false diff --git a/items/active_items/bow/arrow.gd b/items/active_items/bow/arrow.gd index cc9a2a4..66634fc 100644 --- a/items/active_items/bow/arrow.gd +++ b/items/active_items/bow/arrow.gd @@ -3,8 +3,9 @@ extends Area2D var damage = 20 var direction = Vector2(1,0) @export var speed = 2000 +@onready var dmg_id = Global.next_dmg_id func _process(delta: float) -> void: self.position += delta * speed * direction for area in get_overlapping_areas(): - area.hurt(damage, -3 * direction) + area.hurt(damage, -3 * direction, dmg_id) diff --git a/main.tscn b/main.tscn index c26f383..2a284d8 100644 --- a/main.tscn +++ b/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3 uid="uid://cxo6bq26huau7"] +[gd_scene load_steps=15 format=3 uid="uid://cxo6bq26huau7"] [ext_resource type="PackedScene" uid="uid://cmaovvr15b3qk" path="res://player/player.tscn" id="2_1bvp3"] [ext_resource type="Texture2D" uid="uid://d3fpq76anm4t7" path="res://world/Background Prototype/Background prototype.png" id="3_kek77"] @@ -13,6 +13,7 @@ [ext_resource type="PackedScene" uid="uid://ca5ndobertnp4" path="res://water/water.tscn" id="10_4c57u"] [ext_resource type="Script" uid="uid://cpaskpj67pnaj" path="res://enemies/boss/boss_spawner.gd" id="10_efxa6"] [ext_resource type="PackedScene" uid="uid://cpe4s6vsn0ujd" path="res://enemies/boss/boss.tscn" id="11_efxa6"] +[ext_resource type="PackedScene" uid="uid://ddn025xnjngko" path="res://items/active_items/bow/bow.tscn" id="14_w48qg"] [node name="main" type="Node2D"] @@ -88,6 +89,9 @@ texture = ExtResource("3_kek77") script = ExtResource("10_efxa6") boss = ExtResource("11_efxa6") +[node name="Bow" parent="." instance=ExtResource("14_w48qg")] +position = Vector2(128, -3178) + [connection signal="active_item_changed" from="Player" to="UIOverlay/ItemUI" method="_on_player_active_item_changed"] [connection signal="health_changed" from="Player" to="UIOverlay/Healthbar" method="_on_player_health_changed"] [connection signal="max_hp_changed" from="Player" to="UIOverlay/Healthbar" method="_on_player_max_hp_changed"] diff --git a/player/sword.gd b/player/sword.gd index e9dec69..724d52b 100644 --- a/player/sword.gd +++ b/player/sword.gd @@ -5,12 +5,14 @@ var slash_timer = 0 var damage = 20 var facing = -1 var facing_mult = 1 +var dmg_id func _ready() -> void: anim_sprite = $AnimatedSprite2D get_parent().attack.connect(swing) func swing(dir_str) -> void: + dmg_id = Global.next_dmg_id facing = - get_parent().facing * facing_mult if dir_str == "up": scale.x = abs(scale.x) @@ -30,6 +32,5 @@ func _process(delta: float) -> void: if(slash_timer == 0): anim_sprite.visible = false for area in get_overlapping_areas(): - area.hurt(damage, -get_parent().earth_aligner.global_from_local(Vector2(-facing, 0)).rotated(facing*rotation)) - - + var hurt_dir = -get_parent().earth_aligner.global_from_local(Vector2(-facing, 0)).rotated(facing*rotation) + area.hurt(damage, hurt_dir, dmg_id) diff --git a/traps/morning_star.gd b/traps/morning_star.gd index 384e93b..5551208 100644 --- a/traps/morning_star.gd +++ b/traps/morning_star.gd @@ -3,6 +3,8 @@ extends Trap var anglespeed = 0.3 var player_damage = 1 var enemy_damage = 10 +@onready var dmg_id = Global.next_dmg_id +var id_refreshing = false func _ready() -> void: rotate(randf() * TAU) @@ -12,12 +14,21 @@ func _process(delta: float) -> void: rotate(anglespeed * delta * TAU) for target in ball.get_overlapping_areas(): damage_target(target) + for target in ball.get_overlapping_bodies(): damage_target(target) - + func damage_target(target: CollisionObject2D): var dir = (ball.global_position - target.global_position).normalized() if(target.get_collision_layer_value(3)): target.hurt(player_damage, dir) else: - target.hurt(enemy_damage, 2.5*dir) + target.hurt(enemy_damage, 2.5*dir, dmg_id) + refresh_id() + +func refresh_id(): + if not id_refreshing: + id_refreshing = true + await get_tree().create_timer(0.2).timeout + id_refreshing = false + dmg_id = Global.next_dmg_id diff --git a/utils/enemy_hurtbox.gd b/utils/enemy_hurtbox.gd index f7f2a6f..5ac140a 100644 --- a/utils/enemy_hurtbox.gd +++ b/utils/enemy_hurtbox.gd @@ -2,28 +2,38 @@ extends Area2D @export var max_hp : int @onready var hp = max_hp -@export var hit_invulnerability = 0.2 +@export var flash_duration = 0.2 @export var canvasItem : CanvasItem @export var flashColor : Color = Color(1.5, 1.5, 1.5) -var inv_time = 0; +@export var id_block_time = 10 +var flash_time = 0 +var blocked_damage_ids : Array[int] = [] signal damage_taken(damage, dir) signal died func _process(delta: float) -> void: - inv_time = max(inv_time-delta, 0) - if(inv_time <= 0 and canvasItem != null): + flash_time = max(flash_time-delta, 0) + if(flash_time <= 0 and canvasItem != null): canvasItem.modulate = Color(1,1,1) -func hurt(damage : int, dir : Vector2 = Vector2.ZERO): - if(inv_time<=0): +func hurt(damage : int, dir : Vector2 = Vector2.ZERO, id : int = -1): + if not id in blocked_damage_ids: + block_id(id) if canvasItem != null: canvasItem.modulate = flashColor - inv_time = hit_invulnerability + flash_time = flash_duration hp = max(hp-damage, 0) damage_taken.emit(damage, dir) if(hp <= 0): die() - + +func block_id(id : int): + blocked_damage_ids.append(id) + await get_tree().create_timer(id_block_time).timeout + var id_pos = blocked_damage_ids.find(id) + if not id_pos == -1: blocked_damage_ids.remove_at(id_pos) + + func die(): died.emit() diff --git a/utils/global.gd b/utils/global.gd new file mode 100644 index 0000000..5b8efe4 --- /dev/null +++ b/utils/global.gd @@ -0,0 +1,6 @@ +class_name Global + +static var next_dmg_id : int = 0 : + get: + next_dmg_id += 1 + return next_dmg_id diff --git a/utils/global.gd.uid b/utils/global.gd.uid new file mode 100644 index 0000000..3ae2796 --- /dev/null +++ b/utils/global.gd.uid @@ -0,0 +1 @@ +uid://buxg0u226nfcm