Adjusted damage behavior against enemies

This commit is contained in:
Melvin Weiß 2025-09-23 13:36:19 +02:00
parent 39df6cd554
commit a42d798490
8 changed files with 50 additions and 15 deletions

View file

@ -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

View file

@ -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)

View file

@ -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"]

View file

@ -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)

View file

@ -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

View file

@ -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()

6
utils/global.gd Normal file
View file

@ -0,0 +1,6 @@
class_name Global
static var next_dmg_id : int = 0 :
get:
next_dmg_id += 1
return next_dmg_id

1
utils/global.gd.uid Normal file
View file

@ -0,0 +1 @@
uid://buxg0u226nfcm