Diffstat (limited to 'bullets/scripts/missile.gd')
-rw-r--r--bullets/scripts/missile.gd77
1 files changed, 77 insertions, 0 deletions
diff --git a/bullets/scripts/missile.gd b/bullets/scripts/missile.gd
new file mode 100644
index 0000000..32d136d
--- /dev/null
+++ b/bullets/scripts/missile.gd
@@ -0,0 +1,77 @@
+extends RigidBody2D
+
+export(float) var TERMINAL_VELOCITY := 300.0
+export(float) var CONSTANT_THRUST := 200.0
+export(float) var TURN_STRENGTH := 15.0
+var off_screen = false
+onready var target_last_position
+var TARGET
+var powered_up
+
+
+func start(_target):
+ TARGET = _target
+ if is_instance_valid(TARGET):
+ target_last_position = TARGET.global_position
+ else:
+ linear_velocity.x = CONSTANT_THRUST
+
+
+func _physics_process(delta: float) -> void:
+ if is_instance_valid(TARGET):
+ var target_position = (
+ TARGET.global_position
+ + (TARGET.global_position - target_last_position) / delta
+ )
+ target_last_position = TARGET.global_position
+ var direction: Vector2 = global_position.direction_to(target_position - linear_velocity)
+ var attenuate_turning: float = global_transform.y.dot(
+ direction.rotated(angular_velocity * delta)
+ )
+ apply_torque_impulse(TURN_STRENGTH * attenuate_turning)
+ var apply_thrust := Vector2()
+ if linear_velocity.length() < TERMINAL_VELOCITY:
+ var attenuate_thrust: float = clamp(global_transform.x.dot(direction), 0, 1)
+ apply_thrust = global_transform.x * CONSTANT_THRUST * attenuate_thrust
+ apply_central_impulse(apply_thrust)
+
+
+const ExplosionEffect = preload("res://effects/ExplosionEffect.tscn")
+const HitEffect = preload("res://effects/HitEffect.tscn")
+
+
+func create_hit_effect():
+ Game.instance_scene_on_main(HitEffect, global_position)
+
+
+func create_explosion():
+ Game.instance_scene_on_main(ExplosionEffect, global_position)
+
+
+func _exit_tree():
+ if not off_screen:
+ create_explosion()
+
+
+func _on_VisibilityNotifier2D_screen_exited():
+ if randi() % 6 != 5:
+ off_screen = true
+ queue_free()
+
+
+func _ready():
+ $LaserSound.pitch_scale = randf() + 0.4
+ var minscalingrand = 1
+ var maxscalingrand = 1
+ if powered_up:
+ CONSTANT_THRUST -= 20
+ TURN_STRENGTH += 20
+ minscalingrand += 1
+ maxscalingrand += 2
+ var rand = rand_range(minscalingrand, maxscalingrand)
+ var to_scale = Vector2(rand, rand)
+ $Sprite.scale = to_scale
+ $Light.texture_scale = to_scale.x
+ $CollisionPolygon2D.scale = to_scale
+ if powered_up:
+ $Trail.THICKNESS += rand * 2