extends Node # Player AI var ignore_input = false var body_exit_signal = false # interact_input() var interact_target = null var velocity_sum = Vector2(0.0,0.0) # Setters + Getters func set_ignore_input(new_bool): ignore_input = new_bool func get_ignore_input(): return ignore_input func get_user(): return get_parent() ### LOGIC ### # Get Player Input func get_input(): if not ignore_input: get_movement_input() get_interact_input() ### INTERACTING ### # Listen for Hotkey for Interacting func get_interact_input(): ## Interact Hotkey if Input.is_action_just_pressed('interact'): ## Get overlapping bodies from range bubble var bodies = get_user().get_overlapping_bodies() #var areas = get_user().get_overlapping_areas() ## Exclusions for body in bodies: if !body.has_method("get_user"): bodies.erase(body) if body.has_method("get_user") and body.get_user().is_player(): bodies.erase(body) #for area in areas: # if area.has_method("get_user"): # areas.erase(area) ## Collect Interactable Targets in Range var interact_targets = [] for b in bodies: if b.get_user().is_in_group("can_interact"): interact_targets.append(b.get_user()) #for a in areas: # if a.get_user().is_in_group("can_interact"): # interact_targets.append(a.get_user()) ## Find Nearest Interactable Target if interact_targets: interact_targets.sort_custom(FoeSorter.new(get_user().get_gpos()), "sort") #get_user().set_target(interact_targets[0]) interact_targets[0].interact() # Foe Finder System class FoeSorter: var point = null func _init(new_point): self.point = new_point func sort(a, b): return self.point.distance_to(a.get_gpos()) < self.point.distance_to(b.get_gpos()) ### MOVEMENT ### # Get Movement Key Input func get_movement_input(): if Input.is_action_pressed('ui_right'): movement_key_pressed(1) if Input.is_action_pressed('ui_left'): movement_key_pressed(2) if Input.is_action_pressed('ui_up'): movement_key_pressed(3) if Input.is_action_pressed('ui_down'): movement_key_pressed(4) if Input.is_action_just_released("ui_right"): movement_key_released(1) if Input.is_action_just_released("ui_left"): movement_key_released(2) if Input.is_action_just_released("ui_up"): movement_key_released(3) if Input.is_action_just_released("ui_down"): movement_key_released(4) # WASD Movement func movement_key_pressed(direction): get_user().set_internal_velocity(Vector2(0.0,0.0)) if direction == 1: # right velocity_sum.x = 0 velocity_sum.x += 1 get_user().animate("WalkRight") elif direction == 2: # left velocity_sum.x = 0 velocity_sum.x -= 1 get_user().animate("WalkLeft") elif direction == 3: # up velocity_sum.y = 0 velocity_sum.y -= 1 get_user().animate("WalkUp") elif direction == 4: # down velocity_sum.y = 0 velocity_sum.y += 1 get_user().animate("WalkDown") # Velocity cannot be faster with more vectors get_user().set_internal_velocity(velocity_sum) func movement_key_released(direction): if direction == 1 or direction == 2: # left/right velocity_sum.x = 0 elif direction == 3 or direction == 4: # up/down velocity_sum.y = 0 get_user().animate("Idle") get_user().set_internal_velocity(velocity_sum) ### PHYSICS PROCESS # Physics Process func _physics_process(_delta): ## Keyboard Movement get_input()