diff --git a/game/entities/weapons/abstract_projectile.gd b/game/entities/weapons/abstract_projectile.gd index fba7e56..cb5b98d 100644 --- a/game/entities/weapons/abstract_projectile.gd +++ b/game/entities/weapons/abstract_projectile.gd @@ -76,3 +76,34 @@ func _on_body_entered(body: Node2D) -> void: func _process_hit_for_projectile(_collided_body: Node2D) -> void: queue_free() + + +func _get_nearest_foe(filter: Array[AbstractShip]) -> AbstractShip: + var nearest_foe : AbstractShip = null + var minimal_distance := 1000000 + + for foe in _get_foes(filter): + var distance := floori(position.distance_to(foe.position)) + if distance < minimal_distance: + minimal_distance = distance + nearest_foe = foe + + return nearest_foe + + +func _get_foes(filter: Array[AbstractShip]) -> Array[AbstractShip]: + var foes : Array[AbstractShip] = [] + + var flags_by_group : Dictionary[String, bool] = { + "enemies": collide_enemies, + "players": collide_players, + } + + for group in flags_by_group: + if not flags_by_group[group]: continue + var nodes := get_tree().get_nodes_in_group(group) + for node in nodes: + if not node in filter: + foes.append(node) + + return foes diff --git a/game/entities/weapons/launcher/launcher_projectile.gd b/game/entities/weapons/launcher/launcher_projectile.gd index 92ef07e..786d126 100644 --- a/game/entities/weapons/launcher/launcher_projectile.gd +++ b/game/entities/weapons/launcher/launcher_projectile.gd @@ -2,17 +2,44 @@ class_name LauncherProjectile extends AbstractProjectile +@export_range(0, 360) var rotation_speed: int + + @onready var sprites : Array[Sprite2D] = [ $Sprite2D_E, $Sprite2D_SE, $Sprite2D_S, $Sprite2D_SW, $Sprite2D_W, $Sprite2D_NW, $Sprite2D_N, $Sprite2D_NE, ] +var target : AbstractShip = null + func _ready() -> void: + _acquire_target() super._ready() _update_sprite(_velocity) +func _physics_process(delta: float) -> void: + _apply_homing_guidance(delta) + super._physics_process(delta) + + +func _acquire_target() -> void: + target = _get_nearest_foe([]) + + +func _apply_homing_guidance(delta: float) -> void: + if not target: return + + var max_rotation_speed := deg_to_rad(rotation_speed) * delta + + var angle := (_velocity + position - target.position).angle() + + _velocity = _velocity.rotated(angle) + + _update_sprite(_velocity) + + func _update_sprite(velocity: Vector2) -> void: var sector := 360.0 / sprites.size() var angle := rad_to_deg(velocity.angle()) diff --git a/game/entities/weapons/launcher/launcher_projectile.tscn b/game/entities/weapons/launcher/launcher_projectile.tscn index c56a234..184c584 100644 --- a/game/entities/weapons/launcher/launcher_projectile.tscn +++ b/game/entities/weapons/launcher/launcher_projectile.tscn @@ -50,6 +50,7 @@ height = 6.0 collision_layer = 0 collision_mask = 0 script = ExtResource("2_6hdsf") +rotation_speed = 90 damage = SubResource("Resource_kxgpk") speed = 300 diff --git a/game/entities/weapons/tesla/tesla_projectile.gd b/game/entities/weapons/tesla/tesla_projectile.gd index cc6aa56..594b5c8 100644 --- a/game/entities/weapons/tesla/tesla_projectile.gd +++ b/game/entities/weapons/tesla/tesla_projectile.gd @@ -39,7 +39,7 @@ func _start_jink_timer() -> void: func _on_jink_timer_timeout() -> void: - var foe := _get_nearest_foe() + var foe := _get_nearest_foe(_collided_foes) if foe: _target_foe(foe) if position.distance_to(foe.position) > no_deviation_distance: @@ -60,34 +60,3 @@ func _apply_random_deviation() -> void: var deviation_rad := deg_to_rad(deviation_angle) var random_angle := randfn(0.0, deviation_rad / 6.0) _velocity = _velocity.rotated(random_angle) - - -func _get_nearest_foe() -> AbstractShip: - var nearest_foe : AbstractShip = null - var minimal_distance := 1000000 - - for foe in _get_foes(): - var distance := floori(position.distance_to(foe.position)) - if distance < minimal_distance: - minimal_distance = distance - nearest_foe = foe - - return nearest_foe - - -func _get_foes() -> Array[AbstractShip]: - var foes : Array[AbstractShip] = [] - - var flags_by_group : Dictionary[String, bool] = { - "enemies": collide_enemies, - "players": collide_players, - } - - for group in flags_by_group: - if not flags_by_group[group]: continue - var nodes := get_tree().get_nodes_in_group(group) - for node in nodes: - if not node in _collided_foes: - foes.append(node) - - return foes