Diffstat (limited to 'enemy/scripts/Drone.gd')
| -rw-r--r-- | enemy/scripts/Drone.gd | 112 |
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() |