Files
rthythm_archor_game/scenes/enemies/enemy_action_driver.gd
T
2026-07-06 22:59:47 -07:00

40 lines
1.4 KiB
GDScript

class_name EnemyActionDriver
extends Node
const AIIntentScript := preload("res://scenes/components/ai_intent.gd")
@export var action_controller_path: NodePath
@onready var action_controller: Node = get_node_or_null(action_controller_path)
func start_action(action_id: StringName) -> void:
if action_controller == null or not action_controller.has_method("submit_ai_intent"):
return
if not _owner_allows_action(action_id):
return
var intent: RefCounted = AIIntentScript.create(action_id, float(Time.get_ticks_msec()))
action_controller.call("submit_ai_intent", intent)
func handle_chart_event(event: Resource) -> void:
if event == null:
return
var action_id := StringName(str(event.get("action_id")))
if action_id.is_empty() and event.get("payload") is Dictionary:
action_id = StringName(str(event.get("payload").get("action_id", &"")))
if action_id.is_empty():
return
if not _owner_allows_action(action_id):
return
if action_controller != null and int(action_controller.get("phase")) != 0 and action_controller.has_method("cancel_current"):
action_controller.call("cancel_current", &"chart_override")
start_action(action_id)
func _owner_allows_action(action_id: StringName) -> bool:
var actor := get_parent()
if actor != null and actor.has_method("can_start_enemy_action"):
return bool(actor.call("can_start_enemy_action", action_id))
return true