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