aboutsummaryrefslogblamecommitdiffstats
path: root/godot/scenes/Die.gd
blob: f09a8b0899c5796e735c3fbb88644a537fc3e147 (plain) (tree)
1
2
3
4
5
6
7
8
9
                 
 

                                            




                           

                          


                             
                                              
                               



                                               
                                         
                        
       
                     

                          
                       
 

                         

                      




               
                


            




                                                                
                                        
                                      
                                             

                                       
                               

                                                                    
 
 
                   
        


                                                                            


                                         

                              






                                                        


                                                                      
                                           




                                                                       

                                               
 

                                            
                                                                                                 

                                                                                                                     
                                                                                                                                                                          
                                                                    

                                                                           
                                                
                                               
                                          
                                           

                                                                        

                                          
                                                               

                                                      
                                                                                           
                                                                            
                                    
                     
                                                                       
                        
 




                                                                  

                                                  
                                              


                                                 
        
                                                                                                                                        
                                                     


                                                         

                                                                                                                                



                                               
                                                                                                          

                                                     
                                    

                                               
                                     
                                         
                                                        

                                                                           


                                                                           


                                                                                              





























                                                                                                                             

 



     





                                                                                                                                                                                                                                                                                                                                                                                       

                                                                                                  

                                                                                                  

                                                                                                      
                                  
                                                                                                    
                                   

                        

 
                   



                                             
 


                             
                  
                                  


                         
                                       













                                         

                                         





                                     
 










                                                                     
 
                           
                                    






                                           
                             
                                            
 
 
                  
                                             







                                    

                                      
                                     
extends RigidBody

const Game = preload("res://scenes/Game.gd")

var camrot_h = 0
var camrot_v = 0
var camrot_v_locked_val = 0
var cam_v_min = -90
var cam_v_max = 90
var sensitivity_cam = 0.5
var sensitivity_charge = 2
var dice_is_moving = true
var dice_is_still_since = 0
var dice_still_timing = false
var last_frame_position = Vector3(1.0,1.0,1.0)
var mouse_origin = Vector2(0,0)
var die_launch_force_magnitude = 0
var die_launch_force_direction = Vector3(0,0,0)
var die_launch_force = Vector3(0,0,0)
var die_launch_force_multiplier = 0.05
var die_launch_force_magnitude_max = 1000
var left_pressed = false
var mat
var target_bounce = 1
var default_gravity = 2
var default_bounciness = 0
var after_stroke = true

var curr_buff = buff.none

var _game: Game = null

enum buff {
	none,
	stroke,
	bounce,
	phase,
	gravity,
	ball
}

# Called when the node enters the scene tree for the first time.
func _ready():
	Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
	$CamRoot/Horizontal/Vertical/Camera.add_exception(self)
	$CamRoot.set_as_toplevel(true)
	$PowerUI3D.set_as_toplevel(true)
	_game = get_node("/root/Game")
	mat = get_physics_material_override()
	mat.friction = 1
	gravity_scale = default_gravity
	$PowerUI3D/Arrow.hide()
	$PowerUI/PowerBar.hide()
	$PowerUI/PowerBar.max_value = die_launch_force_magnitude_max


func _input(event):
	
	if _game.is_post_game():
		if event is InputEventMouseButton || event is InputEventKey:
			_game.next_level()
			translation.x = 0
			translation.y = 0
			translation.z = 0
			return
	
	if event is InputEventKey:
		if event.scancode == KEY_TAB:
			if event.is_pressed():
				_game.open_scoreboard()
			else:
				_game.close_scoreboard()
		return

	if event is InputEventMouseButton and dice_is_moving == false:
		if event.is_pressed() and left_pressed == false:
			left_pressed = true
			camrot_v_locked_val = camrot_v
			#Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
			#mouse_origin = event.global_position
			die_launch_force_magnitude = 0
			$PowerUI/PowerBar.show()
			draw_arrow()
			$PowerUI3D/Arrow.show()

		else:
			left_pressed = false
			#die_launch_force_magnitude = -(mouse_origin.y - event.global_position.y)
			die_launch_force_direction = $CamRoot/Horizontal/Vertical/Camera.get_global_transform().basis
			die_launch_force_direction = -die_launch_force_direction.z
			die_launch_force = die_launch_force_direction * clamp(die_launch_force_magnitude, 0, die_launch_force_magnitude_max) * die_launch_force_multiplier
			self.apply_central_impulse(die_launch_force)
			if curr_buff != buff.ball:
				self.apply_torque_impulse(die_launch_force)
			$PowerUI/PowerBar.hide()
			$PowerUI3D/Arrow.hide()
			_game.add_stroke()
			after_stroke = true
			#Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
			# add one to counter
	
	if event is InputEventMouseMotion:
		camrot_h += -event.relative.x * sensitivity_cam
		if left_pressed:
			camrot_v = camrot_v_locked_val
			die_launch_force_magnitude += event.relative.y * sensitivity_charge
			$PowerUI/PowerBar.value = die_launch_force_magnitude
			draw_arrow()
		else:
			camrot_v += -event.relative.y * sensitivity_cam
			

func _physics_process(delta):
	camrot_v = clamp(camrot_v, cam_v_min, cam_v_max)
	
	$CamRoot/Horizontal.rotation_degrees.y = camrot_h
	$CamRoot/Horizontal/Vertical.rotation_degrees.x = camrot_v
	$CamRoot.translation.x = translation.x 
	$CamRoot.translation.y = translation.y + 5
	$CamRoot.translation.z = translation.z
	$PowerUI3D.translation.x = translation.x 
	$PowerUI3D.translation.y = translation.y
	$PowerUI3D.translation.z = translation.z
	
	if dice_is_moving == true and dice_still_timing == false and angular_velocity.length() < 0.1 and linear_velocity.length() < 0.1:
		print("stop morbin and start timing")
		dice_is_still_since = OS.get_ticks_msec()
		dice_still_timing = true
		
	elif dice_is_moving == false and after_stroke and (angular_velocity.length() >= 0.1 or linear_velocity.length() >= 0.1):
		print("start morbin")
		dice_still_timing = false
		dice_is_moving = true
		$PowerUI3D/SpriteCircles.hide()
		
	if after_stroke && dice_still_timing == true && (OS.get_ticks_msec() - dice_is_still_since) > 500:
		print("stop timing while not morbin")
		dice_is_moving = false
		after_stroke = false
		dice_still_timing = false
		$PowerUI3D/SpriteCircles.show()
		revert_current_buff()
		var last_buff = curr_buff
		curr_buff = get_buff_from_upwards_side()
		if not(last_buff == curr_buff && curr_buff == buff.stroke):
			apply_buff()


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
	var rot = $CamRoot/Horizontal/Vertical/Camera.get_global_transform().basis.get_euler()
	$PowerUI3D.rotation_degrees.y = rad2deg(rot.y) + 180

func draw_arrow():
	var l = 1 + 5 * clamp(die_launch_force_magnitude, 0, die_launch_force_magnitude_max) / die_launch_force_magnitude_max
	var vertices = PoolVector3Array([
		# base left
		Vector3( 0.2, 0, 0),
		Vector3( 0.2, 0, l),
		Vector3(-0.2, 0, l),
		# base right
		Vector3( 0.2, 0, 0),
		Vector3(-0.2, 0, l),
		Vector3(-0.2, 0, 0),
		# tip
		Vector3( 0.4, 0, l),
		Vector3(-0.0, 0, l + 0.4),
		Vector3(-0.4, 0, l),
	])
	var st = SurfaceTool.new()
	var m = SpatialMaterial.new()
	var color = Color(0.9, 0.1, 0.1)
	m.albedo_color = color
	st.begin(Mesh.PRIMITIVE_TRIANGLES)
	st.set_material(m)
	for v in vertices.size(): 
		st.add_color(color)
		st.add_uv(Vector2(0,0))
		st.add_vertex(vertices[v])
	var tmpMesh = Mesh.new()
	st.commit(tmpMesh)
	$PowerUI3D/Arrow.mesh = tmpMesh


"""
BUFFS
"""

func is_on_side():
	if $Plus1.get_overlapping_areas().size() > 0 || $Plus2.get_overlapping_areas().size() > 0 || $Ball1.get_overlapping_areas().size() > 0 || $Ball2.get_overlapping_areas().size() > 0 || $Bounce1.get_overlapping_areas().size() > 0  || $Bounce2.get_overlapping_areas().size() > 0 || $Phase1.get_overlapping_areas().size() > 0 || $Phase2.get_overlapping_areas().size() > 0:
		return true
	else:
		return false

func get_buff_from_upwards_side():
	if $Plus1.get_overlapping_areas().size() > 0 || $Plus2.get_overlapping_areas().size() > 0:
		return buff.stroke
	if $Ball1.get_overlapping_areas().size() > 0 || $Ball2.get_overlapping_areas().size() > 0:
		return buff.ball
	if $Bounce1.get_overlapping_areas().size() > 0 || $Bounce2.get_overlapping_areas().size() > 0:
		return buff.bounce
	if $Phase1.get_overlapping_areas().size() > 0 || $Phase2.get_overlapping_areas().size() > 0:
		return buff.gravity
		
	return buff.none


func low_gravity():
	gravity_scale = 0.3 * default_gravity
	
func low_gravity_revert():
	gravity_scale = default_gravity

func extra_stroke():
	_game.revoke_stroke()

func bounciness():
	mat.bounce = target_bounce


func bounciness_revert():
	mat.bounce = default_bounciness


func phase():
	set_collision_layer_bit(2, false)


func phase_revert():
	set_collision_layer_bit(2, true)


func ball():
	$BallShape.show()
	$BallShape.set_process(true)
	$BallShape.disabled = false
	angular_velocity = Vector3(0,0,0)
	linear_velocity = Vector3(0,0,0)


func ball_revert():
	$BallShape.hide()
	$BallShape.set_process(false)
	$BallShape.disabled = true

func buff_text():
	match curr_buff:
		buff.ball:
			return ""
		buff.bounce:
			return "You're bouncy!"
		buff.phase:
			return "WooOOoOO you can phase through walls"
		buff.gravity:
			return "Warning, Low gravity!"
	return ""

func revert_current_buff():
	$PowerUI/LabelBuff.text = ""
	match curr_buff:
		buff.ball:
			ball_revert()
		buff.bounce:
			bounciness_revert()
		buff.phase:
			phase_revert()
		buff.gravity:
			low_gravity_revert()


func apply_buff():
	$PowerUI/LabelBuff.text = buff_text()
	match curr_buff:
		buff.ball:
			ball()
		buff.bounce:
			bounciness()
		buff.phase:
			phase()
		buff.stroke:
			extra_stroke()
		buff.gravity:
			low_gravity()