You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.7 KiB
GDScript

extends Node3D
class_name AI
@onready var character: Character = (get_owner() as Character)
@onready var status: Status = (%Status as Status)
var ai: BeehaveTree
var is_init: bool = false
var has_ai: bool = false
func _process(delta) -> void:
if not is_init:
init()
else:
process(delta)
func init() -> void:
if not status.cfg:
return
is_init = true
var ai_scene: PackedScene = status.cfg.get_ai()
if not ai_scene:
return
ai = ai_scene.instantiate() as BeehaveTree
ai.tick_rate = 20
add_child(ai)
has_ai = true
on_init()
func process(delta) -> void:
if has_ai and status.ai_is_alert:
on_process(delta)
else:
if status.cfg.ai:
stroll()
var player: Character = Global.character_mgr.get_player()
var dir: Vector2 = player.pos2D() - character.pos2D()
var dist: float = dir.length()
var can_see: bool = character.get_face_dir().angle_to(dir) < PI/2
var alert_range: float = status.cfg.ai.alert_range if can_see else status.cfg.ai.alert_range_back
var alert_speed: float = status.cfg.ai.alert_speed if can_see else status.cfg.ai.alert_speed_back
if dist < alert_range:
status.ai_alert += alert_speed * delta
status.emit_status("ai_alert")
if status.ai_alert >= status.ai_alert_max:
status.ai_is_alert = true
status.ai_alert = 0
status.emit_status("ai_is_alert")
status.emit_status("ai_alert")
else:
status.ai_alert -= status.cfg.ai.alert_recover * delta
if status.ai_alert < 0:
status.ai_alert = 0
status.emit_status("ai_alert")
else:
status.ai_is_alert = true
status.emit_status("ai_is_alert")
func stroll() -> void:
#todo 闲逛
character.move_stop()
pass
func on_init() -> void:
pass
func on_process(delta):
pass