Files
Fighting_Rthythm_game/scenes/components/damage_emitter.gd
2026-07-02 09:47:52 -07:00

48 lines
1.2 KiB
GDScript

class_name DamageEmitter
extends Area2D
@export var damage := 10
@export var hit_type: StringName = &"normal"
var action_context: Resource
var judgement_context: Dictionary = {}
func _ready() -> void:
area_entered.connect(_on_area_entered)
func configure_hit(action: Resource, judgement: Dictionary) -> void:
action_context = action
judgement_context = judgement.duplicate()
func _on_area_entered(receiver: Area2D) -> void:
if receiver.is_in_group("damage_receivers"):
var final_damage := _resolve_damage()
receiver.emit_signal("damage_received", final_damage, hit_type, global_position)
_event_bus().emit_signal("damage_dealt", receiver, final_damage, hit_type)
func _resolve_damage() -> int:
var combat := _combat_manager_or_null()
if combat == null:
return damage
return int(round(combat.call("resolve_damage", float(damage), action_context, judgement_context, null, null)))
func _event_bus() -> Node:
var root := get_tree().root
var bus := root.get_node_or_null("EventBus")
if bus == null:
bus = load("res://autoload/event_bus.gd").new()
bus.name = "EventBus"
root.add_child(bus)
return bus
func _combat_manager_or_null() -> Node:
if not is_inside_tree():
return null
return get_tree().root.get_node_or_null("CombatManager")