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.

122 lines
3.3 KiB
GDScript

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()