48 lines
1.2 KiB
GDScript
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")
|