diff --git a/src/Actors/Enemies/Machines/Turret.gd b/src/Actors/Enemies/Machines/Turret.gd index 3f8f1e8..010e083 100644 --- a/src/Actors/Enemies/Machines/Turret.gd +++ b/src/Actors/Enemies/Machines/Turret.gd @@ -6,7 +6,9 @@ extends KinematicBody2D onready var sightline: RayCast2D = $RayCast2D onready var turret_state_machine = $TurretStateMachine onready var lock_on_timer = $LockOnTimer +onready var sight_lost_timer = $SightLostTimer onready var turret_animation = $AnimationPlayer.get_animation("Turret Rotation") +onready var Bullet = preload("res://src/HarmfulObjects/Bullet.tscn") # Derives the freedom from the number of bald head eagles onready var angle_of_freedom = deg2rad( turret_animation.track_get_key_value( @@ -36,6 +38,7 @@ func searching(): prey = collider +# TODO should this stand still? func start_locking(): target_ray = RayCast2D.new() add_child(target_ray) @@ -51,8 +54,8 @@ func is_locked_on_target(): return lock_on_timer.is_stopped() +# TODO simplify/split this method func shooting(): - target_ray.cast_to = to_local(prey.position) var target_angle = target_ray.cast_to.angle_to(sightline.cast_to) var rotation_speed = max( min_rotation_speed, abs(target_angle / rotation_speed_divider) @@ -68,4 +71,26 @@ func shooting(): # The collider returns not the area or body it hit, but the parent of them var collider = sightline.get_collider() if collider.is_in_group("player"): - prey = collider + sight_lost_timer.stop() + target_ray.cast_to = to_local(prey.position) + else: + if ( + sight_lost_timer.get_time_left() < 0.1 + && sight_lost_timer.get_time_left() > 0 + ): + prey = null + target_ray.queue_free() + return + if sight_lost_timer.is_stopped(): + sight_lost_timer.start() + else: + target_ray.cast_to = to_local(prey.position) + + spawn_projectile() + + +func spawn_projectile(): + var b = Bullet.instance() + owner.add_child(b) + b.set_collision_mask_bit(1, false) + b.transform = $Muzzle.global_transform diff --git a/src/Actors/Enemies/Machines/Turret.tscn b/src/Actors/Enemies/Machines/Turret.tscn index 20f6a1a..72af793 100644 --- a/src/Actors/Enemies/Machines/Turret.tscn +++ b/src/Actors/Enemies/Machines/Turret.tscn @@ -42,6 +42,7 @@ shape = SubResource( 1 ) [node name="RayCast2D" type="RayCast2D" parent="."] enabled = true cast_to = Vector2( 0, 1e+07 ) +collision_mask = 59 [node name="AnimationPlayer" type="AnimationPlayer" parent="."] pause_mode = 2 @@ -63,4 +64,12 @@ align = 1 valign = 1 [node name="LockOnTimer" type="Timer" parent="."] +wait_time = 0.633 +one_shot = true + +[node name="Muzzle" type="Position2D" parent="."] +position = Vector2( 0, 39 ) + +[node name="SightLostTimer" type="Timer" parent="."] +wait_time = 3.33 one_shot = true diff --git a/src/Actors/Enemies/Machines/TurretStateMachine.gd b/src/Actors/Enemies/Machines/TurretStateMachine.gd index 54bfac8..006e886 100644 --- a/src/Actors/Enemies/Machines/TurretStateMachine.gd +++ b/src/Actors/Enemies/Machines/TurretStateMachine.gd @@ -55,6 +55,8 @@ func _get_transition(_delta): if parent.prey != null && self.state == "searching": parent.start_locking() new_state = "locking" + if parent.prey == null && self.state == "shooting": + new_state = "searching" if self.state == "locking" && parent.is_locked_on_target(): new_state = "shooting" if new_state != self.state: diff --git a/src/HarmfulObjects/Bullet.gd b/src/HarmfulObjects/Bullet.gd index 3e5c573..0b8ba21 100644 --- a/src/HarmfulObjects/Bullet.gd +++ b/src/HarmfulObjects/Bullet.gd @@ -11,7 +11,7 @@ func _ready() -> void: func _physics_process(delta: float) -> void: - position.x += 30 * delta + position += transform.y * 500 * delta func _on_Bullet_body_entered(_body: Node) -> void: diff --git a/src/HarmfulObjects/Bullet.tscn b/src/HarmfulObjects/Bullet.tscn index d8c87d6..e7c1a61 100644 --- a/src/HarmfulObjects/Bullet.tscn +++ b/src/HarmfulObjects/Bullet.tscn @@ -7,7 +7,6 @@ extents = Vector2( 1.51498, 5.05697 ) [node name="Bullet" type="Area2D" groups=["harmful"]] -rotation = 1.5708 collision_layer = 64 collision_mask = 59 script = ExtResource( 2 )