diff options
Diffstat (limited to 'scripts/vehicles/Gunboat.gd')
| -rw-r--r-- | scripts/vehicles/Gunboat.gd | 97 |
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) |
