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