40 lines
1.4 KiB
GDScript
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
|