summaryrefslogtreecommitdiff
path: root/scripts/vehicles/Gunboat.gd
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/vehicles/Gunboat.gd')
-rw-r--r--scripts/vehicles/Gunboat.gd97
1 files changed, 97 insertions, 0 deletions
diff --git a/scripts/vehicles/Gunboat.gd b/scripts/vehicles/Gunboat.gd
new file mode 100644
index 0000000..2d9731f
--- /dev/null
+++ b/scripts/vehicles/Gunboat.gd
@@ -0,0 +1,97 @@
+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 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 = ""):
+ health -= amount
+ print(health)
+
+# Called every frame. 'delta' is the elapsed time since the previous frame.
+func _physics_process(delta):
+ $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
+ 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)