112 lines
2.8 KiB
GDScript
112 lines
2.8 KiB
GDScript
extends KinematicBody2D
|
|
|
|
# class member variables go here, for example:
|
|
# var a = 2
|
|
# var b = "textvar"
|
|
|
|
const SPEED_MAX = 200
|
|
const SPEED_MIN = 10
|
|
const MOVE_SPEED = 200
|
|
const ACTION_RANGE = 65
|
|
var velocity = Vector2()
|
|
var nearest_face_target = Dictionary()
|
|
var cooldowns = {
|
|
'ram' : {
|
|
'default': 1,
|
|
'current': 0,
|
|
},
|
|
'eat' : {
|
|
'default': 0.5,
|
|
'current': 0,
|
|
}
|
|
}
|
|
var strength = 1
|
|
var turd_count = 0
|
|
var facing_collisions = Dictionary()
|
|
|
|
func _ready():
|
|
# Called every time the node is added to the scene.
|
|
# Initialization here
|
|
get_node('/root').connect('player_action', self, '_on_player_action')
|
|
set_fixed_process(true)
|
|
|
|
func _fixed_process(delta):
|
|
# Check Inputs
|
|
if (Input.is_action_pressed("ui_up")):
|
|
velocity.y = -MOVE_SPEED
|
|
set_rot(0)
|
|
if (Input.is_action_pressed("ui_down")):
|
|
velocity.y = MOVE_SPEED
|
|
set_rot(deg2rad(180.0))
|
|
if (Input.is_action_pressed("ui_left")):
|
|
velocity.x = -MOVE_SPEED
|
|
set_rot(deg2rad(90.0))
|
|
if (Input.is_action_pressed("ui_right")):
|
|
velocity.x = MOVE_SPEED
|
|
set_rot(deg2rad(-90.0))
|
|
|
|
# Set limits and move
|
|
var motion = velocity * delta
|
|
motion = move(motion)
|
|
# Stop movement for the moment
|
|
velocity = Vector2()
|
|
var space_state = get_world_2d().get_direct_space_state()
|
|
var facing = Vector2(0, 1).rotated(get_rot())
|
|
#print(get_global_pos())
|
|
#print(facing)
|
|
facing_collisions = space_state.intersect_ray( get_global_pos(), facing * ACTION_RANGE, [ self ] )
|
|
for cd in cooldowns:
|
|
if cooldowns[cd]['current'] > 0:
|
|
cooldowns[cd]['current'] -= delta
|
|
# Collision handling
|
|
|
|
func _on_game_player_action( action ):
|
|
#print('Received action: ', action)
|
|
if _can_do_action(action):
|
|
_do_action(action)
|
|
|
|
func _can_do_action(action):
|
|
if not action in cooldowns:
|
|
return true
|
|
if (cooldowns[action]['current'] > 0):
|
|
#print("Action %s cooldown left: %f" % [action, cooldowns[action]['current']])
|
|
return false
|
|
else:
|
|
return true
|
|
|
|
func _do_action(action):
|
|
#print('Doing: ', action)
|
|
if action in cooldowns:
|
|
cooldowns[action]['current'] = cooldowns[action]['default']
|
|
if action == 'ram':
|
|
_do_ram()
|
|
elif action == 'eat':
|
|
_do_eat()
|
|
|
|
func _do_ram():
|
|
# Ram Distance?
|
|
var bodies = get_node('ActionArea').get_overlapping_bodies()
|
|
#print(bodies)
|
|
for b in bodies:
|
|
if b.has_method('damage'):
|
|
b.damage(strength)
|
|
if get_node('/root/game').has_method('update_suspicion'):
|
|
get_node('/root/game').update_suspicion(5)
|
|
|
|
func _do_eat():
|
|
var areas = get_node('ActionArea').get_overlapping_areas()
|
|
#print(areas)
|
|
for a in areas:
|
|
var n = a.get_parent()
|
|
if n.has_method('is_eatable'):
|
|
if n.is_eatable():
|
|
n.eat(self)
|
|
|
|
|
|
func _on_VisibilityNotifier2D_exit_screen():
|
|
get_node('/root/game').game_over("You made it to sweet sweet freedom :)", false)
|
|
|
|
|
|
func _on_VisibilityNotifier2D_exit_viewport( viewport ):
|
|
get_node('/root/game').game_over("You made it to sweet sweet freedom :)", false)
|