summaryrefslogtreecommitdiff
path: root/godot/scripts/vehicles/Airplane.gd
blob: cf3c21a8bbf1e37e953908fc7aca353d068a646a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
extends VehicleBody

var countdown
var boosting = false
const booster_force = 2500
const brake_force = 50
const boost_length = 8
const turn_constant = 0.45
const roll_constant = 0.5
const pitch_constant = 0.9
const drag_constant = 0.4
const v_angle_max = 1.0472 #60 deg, also top and bottom of regular steering
const v_angle_min = -1.45626 #-85 deg
const roll_angle_max = 1.22173 #70 deg
var roll_dir = 0 #right = 1, left = -1
var pitch_dir = 0 #up = 1, down = -1
var v_angle
var roll_angle
var vel_slow
var parentvel = [Vector3.ZERO, Vector3.ZERO]
export var roll_curve : CurveTexture



func _ready():
	countdown = boost_length
	brake = 5
	set_network_master(-1)
	set_physics_process(true)
		#mode = RigidBody.MODE_STATIC

func trigger_boost():
	if not boosting:
		print("boosting")
		boosting = true

func _process(delta):
	if is_network_master():
		if boosting and countdown <= 0:
			print("stopped boosting")
			boosting = false
			countdown = boost_length
		
		if Input.is_action_just_pressed("boost"):
			trigger_boost()
		roll_dir =  Input.get_action_strength("roll_left") - Input.get_action_strength("roll_right")
		pitch_dir = Input.get_action_strength("pitch_up") - Input.get_action_strength("pitch_down")
		$rearwheel.brake = lerp($rearwheel.brake, Input.get_action_strength("brake")*brake_force, 0.05)

func _physics_process(delta):
	if is_network_master():
		v_angle = atan2(global_transform.basis.x.y,sqrt(global_transform.basis.x.z*global_transform.basis.x.z + global_transform.basis.x.x*global_transform.basis.x.x))
		roll_angle = global_transform.basis.x.cross(Vector3.UP).angle_to($rightaileron.global_transform.origin-$wingcenter.global_transform.origin)
		if $rightaileron.global_transform.origin.y < $leftaileron.global_transform.origin.y:
			roll_angle *= -1
		if boosting:
			add_force(global_transform.basis.x*booster_force,Vector3.ZERO)
			countdown -= delta
		
		#print(linear_velocity.length())
		#slow plane by drag and gravity
		if linear_velocity.length() > 16 and linear_velocity.angle_to(global_transform.basis.x) < 0.25:
			var v_dir = 1 if linear_velocity.y > 0 else -1
			vel_slow = v_dir*sqrt(abs(2*9.8*linear_velocity.y*delta)) + drag_constant + Input.get_action_strength("brake")*5
			add_force(-1*linear_velocity.normalized()*vel_slow*mass,Vector3.ZERO)
		

		
			#pass #"inherit" linear and angular velocity of what plane is landed on

func _integrate_forces(state):
	if is_network_master():
		#linear_velocity -= parentvel[0]; angular_velocity -= parentvel[1]
#		if $rightwheel.get_rpm() < 60 and $rightwheel.is_in_contact():
#			if $rightwheel/Area.get_overlapping_bodies()[0].has_method("get_linear_velocity"):
#				var ulv = $rightwheel/Area.get_overlapping_bodies()[0].linear_velocity
#				var uav = $rightwheel/Area.get_overlapping_bodies()[0].angular_velocity
#				var upos = $rightwheel/Area.get_overlapping_bodies()[0].global_transform.origin
#				ulv += (global_transform.origin - upos).rotated(uav.normalized(),uav.length()*state.get_step()) + global_transform.origin
#				parentvel = [ulv,uav]
#		else:
#			parentvel = [Vector3.ZERO, Vector3.ZERO]
		if linear_velocity.length() > 25:
			#linear_velocity = linear_velocity.normalized()*(linear_velocity.length()-vel_slow)
			var ang_vel_target = Vector3.ZERO
			#pitch plane
			if pitch_dir == 1: #up, rotate toward maximum vertical angle
				ang_vel_target += pitch_constant*(v_angle_max-v_angle)*global_transform.basis.z
			elif pitch_dir == -1: #down, rotate toward minimum vertical angle
				ang_vel_target += pitch_constant*(v_angle_min-v_angle)*global_transform.basis.z
			
			#roll (rotate around lengthwise axis)
			var is_returning = 3 if roll_dir == 0 else 1 #return to flat quicker
			ang_vel_target -= roll_constant*is_returning*(roll_dir*roll_curve.curve.interpolate(roll_angle_max-roll_angle))*global_transform.basis.x
			
			#turn (based on how much the plane is rolled (need to add
			ang_vel_target += turn_constant*Vector3.UP*roll_angle
			
			#apply angular velocity
			angular_velocity = ang_vel_target#lerp(angular_velocity,ang_vel_target,0.1)
			if linear_velocity.angle_to(global_transform.basis.x) < 0.25:
				set_linear_velocity(get_linear_velocity().slerp(transform.basis.x*linear_velocity.length(),0.1))
		#linear_velocity += parentvel[0]; angular_velocity += parentvel[1]
		rpc("_set_position", global_transform, linear_velocity)
	elif get_network_master() == -1 and get_tree().get_network_unique_id() == 1:
		rpc("_set_position", global_transform, linear_velocity)