|  |  |  | 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 | 
					
						
							|  |  |  |     add_child(ai) | 
					
						
							|  |  |  |     has_ai = true | 
					
						
							|  |  |  |     on_init() | 
					
						
							|  |  |  |     ai.init() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func process(delta) -> void: | 
					
						
							|  |  |  |     if has_ai and status.ai_is_alert: | 
					
						
							|  |  |  |         on_process(delta) | 
					
						
							|  |  |  |         ai.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 |