Refactor rhythm action architecture
This commit is contained in:
47
scenes/components/damage_emitter.gd
Normal file
47
scenes/components/damage_emitter.gd
Normal file
@@ -0,0 +1,47 @@
|
||||
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")
|
||||
Reference in New Issue
Block a user