From d9f0d80b184c96dea40d1117d9d4a79289d150f0 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Fri, 7 Nov 2025 00:50:23 +0300 Subject: [PATCH] Added bullet_per_shot and sector_angle implementation --- game/entities/weapons/abstract_projectile.gd | 3 +++ game/entities/weapons/abstract_weapon.gd | 24 +++++++++++++------ .../weapons/gatling_gun/gatling_gun.tscn | 1 + .../weapons/railgun/railgun_projectile.tscn | 1 + 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/game/entities/weapons/abstract_projectile.gd b/game/entities/weapons/abstract_projectile.gd index 3edefba..33fc556 100644 --- a/game/entities/weapons/abstract_projectile.gd +++ b/game/entities/weapons/abstract_projectile.gd @@ -18,6 +18,7 @@ signal destroyed @export var acceleration : int @export var max_distance : int @export var max_livetime : int +@export var piercing: int @export var collide_player: bool: set(value): @@ -65,12 +66,14 @@ func process_distance(delta: float) -> void: _traveled_distance += velocity.length() * delta if max_distance > 0 and _traveled_distance > max_distance: destroyed.emit() + queue_free() func process_livetime(delta: float) -> void: _livetime += delta if _livetime > max_livetime: destroyed.emit() + queue_free() func _apply_collision_mask() -> void: collision_mask |= PROJECTILE_BORDER_LAYER diff --git a/game/entities/weapons/abstract_weapon.gd b/game/entities/weapons/abstract_weapon.gd index 57b986e..830e018 100644 --- a/game/entities/weapons/abstract_weapon.gd +++ b/game/entities/weapons/abstract_weapon.gd @@ -7,9 +7,8 @@ enum Belonging { PLAYER, ENEMY } @export var belonging: Belonging -@export var damage : int -@export var bullet_per_shot : int -@export var sector_angle : int +@export var bullet_per_shot : int = 1 +@export var sector_angle : int = 0 @export var Projectile : PackedScene @export var reloaders : Array[AbstractReloader] @@ -30,7 +29,17 @@ func _physics_process(delta: float) -> void: func shoot() -> void: if not _can_shoot(): return + for i in range(bullet_per_shot): + var projectile := _create_projectile() + get_tree().current_scene.add_child(projectile) + + for reloader in _reloaders: + reloader.shoot() + + +func _create_projectile() -> Node: var projectile := Projectile.instantiate() + projectile.global_position = global_position match belonging: Belonging.PLAYER: @@ -40,11 +49,12 @@ func shoot() -> void: projectile.direction = Vector2.LEFT projectile.collide_player = true - projectile.global_position = global_position - get_tree().current_scene.add_child(projectile) + if sector_angle > 0: + var sector_rad := deg_to_rad(sector_angle) + var random_angle := randfn(0.0, sector_rad / 6.0) + projectile.direction = projectile.direction.rotated(random_angle) - for reloader in _reloaders: - reloader.shoot() + return projectile func reload() -> void: diff --git a/game/entities/weapons/gatling_gun/gatling_gun.tscn b/game/entities/weapons/gatling_gun/gatling_gun.tscn index 0a9fcbd..ff4b913 100644 --- a/game/entities/weapons/gatling_gun/gatling_gun.tscn +++ b/game/entities/weapons/gatling_gun/gatling_gun.tscn @@ -20,6 +20,7 @@ metadata/_custom_type_script = "uid://d2gfhnlbqxsoq" [node name="GatlingGun" type="Node2D"] script = ExtResource("1_irb3o") +sector_angle = 5 Projectile = ExtResource("2_kifyy") reloaders = Array[ExtResource("3_lpe3m")]([SubResource("Resource_kifyy"), SubResource("Resource_6px3v")]) metadata/_custom_type_script = "uid://dpqxs8hlql2o0" diff --git a/game/entities/weapons/railgun/railgun_projectile.tscn b/game/entities/weapons/railgun/railgun_projectile.tscn index 6612cf4..1b08822 100644 --- a/game/entities/weapons/railgun/railgun_projectile.tscn +++ b/game/entities/weapons/railgun/railgun_projectile.tscn @@ -12,6 +12,7 @@ motion_mode = 1 script = ExtResource("1_hycpq") damage = 45 speed = 900 +piercing = 1 metadata/_custom_type_script = "uid://ctmjb3nkxrepu" [node name="Sprite2D" type="Sprite2D" parent="."]