Diffstat (limited to 'enemy/scripts/Drone.gd')
-rw-r--r--enemy/scripts/Drone.gd112
1 files changed, 112 insertions, 0 deletions
diff --git a/enemy/scripts/Drone.gd b/enemy/scripts/Drone.gd
new file mode 100644
index 0000000..76fd812
--- /dev/null
+++ b/enemy/scripts/Drone.gd
@@ -0,0 +1,112 @@
+extends RigidBody2D
+
+var alive = true
+var asleep = false
+var health = 15
+var COOLDOWN = 1
+
+var hovering
+
+export var MAX_SPEED = 50
+export var MAX_THRUST = 25
+
+
+func _integrate_forces(state):
+ if not alive:
+ return
+
+ if asleep:
+ return
+
+ var delta = state.get_step()
+
+ # Check nearby objects with raycast
+ var closest_collision = null
+ $rays.rotation += delta * 11 * PI
+ for ray in $rays.get_children():
+ if ray.is_colliding():
+ var collision_point = ray.get_collision_point() - global_position
+ if closest_collision == null:
+ closest_collision = collision_point
+ if collision_point.length() < closest_collision.length():
+ closest_collision = collision_point
+
+ # Dodge
+ if closest_collision:
+ var normal = -closest_collision.normalized()
+ var dodge_direction = 1
+ if randf() < 0.5:
+ dodge_direction = -1
+ linear_velocity += normal * MAX_THRUST * 2 * delta
+ linear_velocity += normal.rotated(PI / 2 * dodge_direction) * MAX_THRUST * delta
+
+ # Steer towards player
+ var distance_to_player = global_position.distance_to($"../../Ship".global_position)
+ var vector_to_player = ($"../../Ship".global_position - global_position).normalized()
+
+ # Rotate turret
+ var start = $turret.rotation
+ var angle_to_target = Vector2(1, 0).rotated(start).angle_to(vector_to_player)
+ var end = start + angle_to_target
+ $Tween.interpolate_property(
+ $turret, "rotation", start, end, 0.1, Tween.TRANS_QUAD, Tween.EASE_OUT
+ )
+ $Tween.start()
+
+ if distance_to_player > 40:
+ # Move towards player
+ linear_velocity += vector_to_player * MAX_THRUST * delta
+ hovering = false
+ else:
+ # Move away from player
+ hovering = false
+ linear_velocity += -vector_to_player * MAX_THRUST * delta
+
+ # Clamp max speed
+ if linear_velocity.length() > MAX_SPEED:
+ linear_velocity = linear_velocity.normalized() * MAX_SPEED
+
+
+func shoot():
+ $shootCooldown.wait_time = COOLDOWN * (1 + rand_range(-0.25, 0.25))
+ $shootCooldown.start()
+
+ if not alive:
+ return
+
+ if asleep:
+ return
+
+ # Start firing animation
+ $AnimationPlayer.play("firing")
+
+
+const Laser = preload("res://bullets/scenes/EnemyLaser.tscn")
+
+
+func spawn_bullet():
+ var laser = Game.instance_scene_on_main(Laser, global_position)
+ laser.apply_impulse(Vector2.ZERO, Vector2(-50, 0))
+
+
+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():
+ create_explosion()
+
+
+func _on_Drone_body_entered(body):
+ if body.is_in_group("pbullet"):
+ health -= 1
+ if health <= 0:
+ queue_free()