
extends KinematicBody2D

# This is a simple collision demo showing how
# the kinematic cotroller works.
# move() will allow to move the node, and will
# always move it to a non-colliding spot, 
# as long as it starts from a non-colliding spot too.


#pixels / second
const GRAVITY = 500.0

# Angle in degrees towards either side that the player can 
# consider "floor".
const FLOOR_ANGLE_TOLERANCE = 40
const WALK_FORCE = 600
const WALK_MAX_SPEED = 200
const STOP_FORCE = 1300
const JUMP_SPEED = 200
const JUMP_MAX_AIRBORNE_TIME=0.2

var velocity = Vector2()
var on_air_time=100
var jumping=false

var prev_jump_pressed=false

func _fixed_process(delta):

	#create forces
	var force = Vector2(0,GRAVITY)

	var stop = velocity.x!=0.0
	
	var walk_left = Input.is_action_pressed("move_left")
	var walk_right = Input.is_action_pressed("move_right")
	var jump = Input.is_action_pressed("jump")

	var stop=true
	
	if (walk_left):
		if (velocity.x<=0 and velocity.x > -WALK_MAX_SPEED):
			force.x-=WALK_FORCE			
			stop=false
		
	elif (walk_right):
		if (velocity.x>=0 and velocity.x < WALK_MAX_SPEED):
			force.x+=WALK_FORCE
			stop=false
	
	if (stop):
		var vsign = sign(velocity.x)
		var vlen = abs(velocity.x)
		
		vlen -= STOP_FORCE * delta
		if (vlen<0):
			vlen=0
			
		velocity.x=vlen*vsign
		

		
	#integrate forces to velocity
	velocity += force * delta
	
	#integrate velocity into motion and move
	var motion = velocity * delta

	#move and consume motion
#
	motion = move(motion)


	var floor_velocity=Vector2()

	if (is_colliding()):
		#ran against something, is it the floor? get normal
		var n = get_collision_normal()

		if ( rad2deg(acos(n.dot( Vector2(0,-1)))) < FLOOR_ANGLE_TOLERANCE ):
			#if angle to the "up" vectors is < angle tolerance
			#char is on floor
			on_air_time=0
			floor_velocity=get_collider_velocity()
			#velocity.y=0 
			
		# But we were moving and our motion was interrupted, 
		# so try to complete the motion by "sliding"
		# by the normal
		motion = n.slide(motion)
		velocity = n.slide(velocity)
		
		#then move again
		move(motion)

	if (floor_velocity!=Vector2()):
		#if floor moves, move with floor
		move(floor_velocity*delta)

	if (jumping and velocity.y>0):
		jumping=false
		
	if (on_air_time<JUMP_MAX_AIRBORNE_TIME and jump and not prev_jump_pressed and not jumping):	
		velocity.y=-JUMP_SPEED	
		jumping=true
		
	on_air_time+=delta
	prev_jump_pressed=jump	

func _ready():
	# Initalization here
	set_fixed_process(true)
	pass


