summaryrefslogtreecommitdiff
path: root/godot/scripts/vehicles
diff options
context:
space:
mode:
Diffstat (limited to 'godot/scripts/vehicles')
-rw-r--r--godot/scripts/vehicles/Airplane.gd106
-rw-r--r--godot/scripts/vehicles/Gunboat.gd100
2 files changed, 206 insertions, 0 deletions
diff --git a/godot/scripts/vehicles/Airplane.gd b/godot/scripts/vehicles/Airplane.gd
new file mode 100644
index 0000000..cf3c21a
--- /dev/null
+++ b/godot/scripts/vehicles/Airplane.gd
@@ -0,0 +1,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)
diff --git a/godot/scripts/vehicles/Gunboat.gd b/godot/scripts/vehicles/Gunboat.gd
new file mode 100644
index 0000000..e1a61c5
--- /dev/null
+++ b/godot/scripts/vehicles/Gunboat.gd
@@ -0,0 +1,100 @@
+extends "res://scripts/machines/NetworkedMachine.gd"
+
+export var team = 0
+
+const accel = 50000
+const turn_accel = 50000
+
+export(float, 0.0, 1.0) var sail_out = 0.0
+export var sail_speed : float = 0.5
+var sail_turn = 0
+export var sail_turn_speed = 30
+const SAIL_MAX = 90
+
+var rudder_turn : float = 0.0
+export var rudder_speed = 25
+export var rudder_constant = 1800
+const RUDDER_MAX = 60
+
+const health_max = 1000
+var health = health_max
+const damage_threshold = 20
+const max_depth = 2
+
+#controls
+var throttle: float = 0.0
+var rudder: float = 0.0
+var mainsheet: float = 0.0
+
+func get_init_info():
+ return {"sail_out" : sail_out, "rudder_turn" : rudder_turn, "sail_turn" : sail_turn, "health" : health, "in_use" : in_use}
+
+func mp_init(init_info):
+ for variable in init_info.keys():
+ set(variable, init_info[variable])
+
+# Called when the node enters the scene tree for the first time.
+func _ready():
+ world = get_tree().get_root().find_node("GAMEWORLD", true, false)
+ mass = 13500
+ weight = mass * 9.8
+
+func on_no_control():
+ rudder = 0.0
+ throttle = 0.0
+ mainsheet = 0.0
+
+func auto_sail(delta):
+ var in_range = global_transform.basis.x.dot(world.winddir) >= 0
+ if in_range:
+ if Vector2(world.winddir.x, world.winddir.z).angle_to(Vector2($Mast.global_transform.basis.x.x,$Mast.global_transform.basis.x.z)) < 0:
+ sail_turn -= sail_turn_speed*delta
+ else:
+ sail_turn += sail_turn_speed*delta
+ else:
+ if abs(Vector2(world.winddir.x, world.winddir.z).angle_to(Vector2(global_transform.basis.z.x,global_transform.basis.z.z))) < PI/2:
+ sail_turn -= sail_turn_speed*delta
+ else:
+ sail_turn += sail_turn_speed*delta
+
+func direction_input(fwd,bwd,left,right,_left,_right):
+ throttle = fwd - bwd
+ rudder = left - right
+ mainsheet = _left - _right
+
+remotesync func damage(amount, _type, _shooter, _extra = ""):
+ if amount >= damage_threshold:
+ health -= amount
+ print(health)
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _physics_process(delta):
+ if is_network_master():
+ $Mast/Sail.scale.y = sail_out
+ $Rudder.rotation_degrees.y = rudder_turn
+ $Mast.rotation_degrees.y = sail_turn
+ var push_force = accel*sail_out*world.winddir.dot($Mast.global_transform.basis.x)
+ if world.winddir.angle_to($Mast.global_transform.basis.x) < PI/2:
+ add_force(global_transform.basis.x*push_force, Vector3.ZERO)
+ add_torque(Vector3(0,-rudder_turn*rudder_constant*(0.5+linear_velocity.dot(global_transform.basis.x)),0))
+ add_torque(Vector3(-1000000*angular_velocity.x,0,0))
+ add_torque(Vector3(0,0,-1000000*angular_velocity.z))
+ rudder_turn += rudder_speed*delta*(-0.25 if rudder_turn > 0 else 0.25)
+ for point in $FloatPoints.get_children():
+ for area in point.get_overlapping_areas():
+ if area.name == "WaterArea":
+ var depth = area.global_transform.origin.y-point.global_transform.origin.y
+ var floatiness = 0.275 if health <= 0 else 1.0
+ if floatiness == 0.275:
+ depth = 0.05
+ add_force(Vector3.UP*weight*depth*floatiness, point.global_transform.origin-global_transform.origin)
+ if in_use:
+ rudder_turn += rudder_speed*delta*(rudder)
+ sail_out += sail_speed*delta*(throttle)
+ sail_turn += sail_turn_speed*delta*(mainsheet)
+ auto_sail(delta)
+ sail_out = clamp(sail_out, 0, 1)
+ rudder_turn = clamp(rudder_turn, -RUDDER_MAX, RUDDER_MAX)
+ sail_turn = clamp(sail_turn, -SAIL_MAX, SAIL_MAX)
+
+ #add_force(transform.basis.x*accel*Input.get_action_strength("move_forward"), Vector3.ZERO)