diff --git a/game/entities/ships/enemies/abstract_enemy_ship.tscn b/game/entities/ships/enemies/abstract_enemy_ship.tscn index 29edeff..c6dd927 100644 --- a/game/entities/ships/enemies/abstract_enemy_ship.tscn +++ b/game/entities/ships/enemies/abstract_enemy_ship.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" uid="uid://byicf1t0807pq" path="res://game/entities/ships/enemies/abstract_enemy_ship.gd" id="2_fwvrd"] [ext_resource type="Script" uid="uid://bs8qqj6yepfln" path="res://game/controllers/enemy_controller.gd" id="3_vfnhw"] -[node name="AbstractEnemyShip" instance=ExtResource("1_28j6l")] +[node name="AbstractEnemyShip" groups=["enemies"] instance=ExtResource("1_28j6l")] collision_layer = 4 collision_mask = 0 script = ExtResource("2_fwvrd") diff --git a/game/entities/ships/enemies/heavy/heavy_enemy_ship.tscn b/game/entities/ships/enemies/heavy/heavy_enemy_ship.tscn index f78af0a..9964cc1 100644 --- a/game/entities/ships/enemies/heavy/heavy_enemy_ship.tscn +++ b/game/entities/ships/enemies/heavy/heavy_enemy_ship.tscn @@ -26,7 +26,3 @@ shape = SubResource("CapsuleShape2D_cuapu") [node name="Health" parent="." index="2"] max_hull = 200 - -[connection signal="accelerate" from="EnemyController" to="." method="accelerate"] -[connection signal="reload" from="EnemyController" to="." method="reload"] -[connection signal="shoot" from="EnemyController" to="." method="shoot"] diff --git a/game/entities/ships/player/player_ship.tscn b/game/entities/ships/player/player_ship.tscn index 0f1ddcd..b923ec0 100644 --- a/game/entities/ships/player/player_ship.tscn +++ b/game/entities/ships/player/player_ship.tscn @@ -11,7 +11,7 @@ size = Vector2(48, 32) radius = 15.0 height = 46.0 -[node name="PlayerShip" instance=ExtResource("1_6otxb")] +[node name="PlayerShip" groups=["players"] instance=ExtResource("1_6otxb")] collision_layer = 3 script = ExtResource("2_625ti") acceleration = 92 diff --git a/game/entities/weapons/abstract_projectile.gd b/game/entities/weapons/abstract_projectile.gd index 92fe9a1..6804b89 100644 --- a/game/entities/weapons/abstract_projectile.gd +++ b/game/entities/weapons/abstract_projectile.gd @@ -19,9 +19,9 @@ const ENEMY_PROJECTILE_LAYER = 16 var direction : Vector2 var ship_velocity: Vector2 -var collide_player: bool: +var collide_players: bool: set(value): - collide_player = value + collide_players = value _apply_collision_mask() var collide_enemies: bool: @@ -45,7 +45,7 @@ func _physics_process(delta: float) -> void: func _apply_collision_mask() -> void: - if collide_player: + if collide_players: collision_layer |= ENEMY_PROJECTILE_LAYER collision_mask |= PLAYER_LAYER else: diff --git a/game/entities/weapons/abstract_weapon.gd b/game/entities/weapons/abstract_weapon.gd index b63b451..738aed1 100644 --- a/game/entities/weapons/abstract_weapon.gd +++ b/game/entities/weapons/abstract_weapon.gd @@ -50,7 +50,7 @@ func _create_projectile(ship_velocity: Vector2) -> Node: projectile.collide_enemies = true Belonging.ENEMY: projectile.direction = Vector2.LEFT - projectile.collide_player = true + projectile.collide_players = true if sector_angle > 0: var sector_rad := deg_to_rad(sector_angle) diff --git a/game/entities/weapons/tesla/tesla.tscn b/game/entities/weapons/tesla/tesla.tscn index 690177a..0222c75 100644 --- a/game/entities/weapons/tesla/tesla.tscn +++ b/game/entities/weapons/tesla/tesla.tscn @@ -21,6 +21,6 @@ metadata/_custom_type_script = "uid://dxk56xdihfw4m" [node name="Tesla" instance=ExtResource("1_rpud7")] script = ExtResource("2_08si3") -sector_angle = 180 +sector_angle = 10 Projectile = ExtResource("2_1rrdy") reloaders = Array[ExtResource("3_08si3")]([SubResource("Resource_1rrdy"), SubResource("Resource_08si3")]) diff --git a/game/entities/weapons/tesla/tesla_projectile.gd b/game/entities/weapons/tesla/tesla_projectile.gd index f4d8c80..6aa20ee 100644 --- a/game/entities/weapons/tesla/tesla_projectile.gd +++ b/game/entities/weapons/tesla/tesla_projectile.gd @@ -1 +1,69 @@ extends AbstractProjectile + + +@export_range(0.01, 0.5) var jink_min_delay: float = 0.01 +@export_range(0.01, 0.5) var jink_max_delay: float = 0.01 +@export_range(0, 360) var deviation_angle: int = 0 +@export_range(0, 1000) var no_deviation_distance: int = 0 + + +@onready var jinkTimer : Timer = $JinkTimer + + +func _ready() -> void: + super._ready() + _start_jink_timer() + + +func _start_jink_timer() -> void: + var random_delay := randf_range(jink_min_delay, jink_max_delay) + jinkTimer.start(random_delay) + + +func _on_jink_timer_timeout() -> void: + var foe := _get_nearest_foe() + if foe: + _target_foe(foe) + if position.distance_to(foe.position) > no_deviation_distance: + _apply_random_deviation() + else: + _apply_random_deviation() + + _start_jink_timer() + + +func _target_foe(foe: AbstractShip) -> void: + var current_speed := _velocity.length() + var foe_direction := position.direction_to(foe.position) + _velocity = current_speed * foe_direction + + +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] = [] + + if collide_enemies: + foes.append_array(get_tree().get_nodes_in_group("enemies")) + + if collide_players: + foes.append_array(get_tree().get_nodes_in_group("players")) + + return foes diff --git a/game/entities/weapons/tesla/tesla_projectile.tscn b/game/entities/weapons/tesla/tesla_projectile.tscn index 49e002a..7aa29ed 100644 --- a/game/entities/weapons/tesla/tesla_projectile.tscn +++ b/game/entities/weapons/tesla/tesla_projectile.tscn @@ -19,6 +19,10 @@ radius = 5.0 collision_layer = 0 collision_mask = 0 script = ExtResource("2_q73is") +jink_min_delay = 0.05 +jink_max_delay = 0.09999999999999999 +deviation_angle = 90 +no_deviation_distance = 50 damage = SubResource("Resource_1121u") speed = 900 @@ -27,3 +31,8 @@ texture = SubResource("PlaceholderTexture2D_1oexk") [node name="CollisionShape2D" parent="." index="1"] shape = SubResource("CircleShape2D_l65ib") + +[node name="JinkTimer" type="Timer" parent="." index="3"] +one_shot = true + +[connection signal="timeout" from="JinkTimer" to="." method="_on_jink_timer_timeout"] diff --git a/game/reloaders/abstract_reloader.gd b/game/reloaders/abstract_reloader.gd index 6bf28b8..4194343 100644 --- a/game/reloaders/abstract_reloader.gd +++ b/game/reloaders/abstract_reloader.gd @@ -3,9 +3,6 @@ extends Resource class_name AbstractReloader -var _random := RandomNumberGenerator.new() - - @abstract func process(delta: float) -> void diff --git a/game/reloaders/energy_reloader.gd b/game/reloaders/energy_reloader.gd index 44f959a..a663627 100644 --- a/game/reloaders/energy_reloader.gd +++ b/game/reloaders/energy_reloader.gd @@ -45,7 +45,7 @@ func can_shoot() -> bool: func shoot() -> void: - var random_heat := _random.randf_range(-_cool_per_sec_tenth, _cool_per_sec_tenth) + var random_heat := randf_range(-_cool_per_sec_tenth, _cool_per_sec_tenth) _heat += heat_per_shot + random_heat diff --git a/game/reloaders/firerate_reloader.gd b/game/reloaders/firerate_reloader.gd index b49083a..1c7459e 100644 --- a/game/reloaders/firerate_reloader.gd +++ b/game/reloaders/firerate_reloader.gd @@ -27,7 +27,7 @@ func can_shoot() -> bool: func shoot() -> void: - var random_delay := _random.randf_range(-_delay_tenth, _delay_tenth) + var random_delay := randf_range(-_delay_tenth, _delay_tenth) _cooldown = _delay + random_delay diff --git a/game/reloaders/magazine_reloader.gd b/game/reloaders/magazine_reloader.gd index 13b49fd..053b7c2 100644 --- a/game/reloaders/magazine_reloader.gd +++ b/game/reloaders/magazine_reloader.gd @@ -45,7 +45,7 @@ func shoot() -> void: func reload() -> void: if _countdown > 0 or _bullets_in_magazine == magazine_size: return - var random_delay := _random.randf_range(-_reload_time_tenth, _reload_time_tenth) + var random_delay := randf_range(-_reload_time_tenth, _reload_time_tenth) _countdown = reload_time + random_delay diff --git a/project.godot b/project.godot index 11752bc..dc9b380 100644 --- a/project.godot +++ b/project.godot @@ -34,6 +34,11 @@ window/stretch/mode="viewport" window/stretch/scale=1.02 window/stretch/scale_mode="integer" +[global_group] + +enemies="" +players="" + [input] ui_accept={