From ce6b93a7bf281fc92507b04a17e0398e95b48450 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 4 Nov 2025 20:03:17 +0300 Subject: [PATCH] Added gatling gun and railgun --- game/entities/player.gd | 2 +- game/entities/ship.gd | 9 ++- .../{projectiles => }/abstract_projectile.gd | 0 .../abstract_projectile.gd.uid | 0 game/entities/weapons/abstract_weapon.gd | 58 ++++++++++++++ .../{weapon.gd.uid => abstract_weapon.gd.uid} | 0 game/entities/weapons/abstract_weapon.tscn | 23 ++++++ .../weapons/gatling_gun/gatling_gun.gd | 12 +++ .../weapons/gatling_gun/gatling_gun.gd.uid | 1 + .../weapons/gatling_gun/gatling_gun.tscn | 26 +++++++ .../gatling_projectile.gd | 0 .../gatling_projectile.gd.uid | 0 .../gatling_projectile.tscn | 2 +- .../projectiles/abstract_projectile.tscn | 9 --- game/entities/weapons/railgun/railgun.gd | 12 +++ game/entities/weapons/railgun/railgun.gd.uid | 1 + game/entities/weapons/railgun/railgun.tscn | 26 +++++++ .../weapons/railgun/railgun_projectile.gd | 9 +++ .../weapons/railgun/railgun_projectile.gd.uid | 1 + .../weapons/railgun/railgun_projectile.tscn | 20 +++++ .../weapons/reloaders/abstract_reloader.gd | 6 +- .../weapons/reloaders/energy_reloader.gd | 3 +- .../weapons/reloaders/firerate_reloader.gd | 3 +- .../weapons/reloaders/magazine_reloader.gd | 3 +- game/entities/weapons/weapon.gd | 75 ------------------- game/entities/weapons/weapon.tscn | 12 --- 26 files changed, 207 insertions(+), 106 deletions(-) rename game/entities/weapons/{projectiles => }/abstract_projectile.gd (100%) rename game/entities/weapons/{projectiles => }/abstract_projectile.gd.uid (100%) create mode 100644 game/entities/weapons/abstract_weapon.gd rename game/entities/weapons/{weapon.gd.uid => abstract_weapon.gd.uid} (100%) create mode 100644 game/entities/weapons/abstract_weapon.tscn create mode 100644 game/entities/weapons/gatling_gun/gatling_gun.gd create mode 100644 game/entities/weapons/gatling_gun/gatling_gun.gd.uid create mode 100644 game/entities/weapons/gatling_gun/gatling_gun.tscn rename game/entities/weapons/{projectiles => gatling_gun}/gatling_projectile.gd (100%) rename game/entities/weapons/{projectiles => gatling_gun}/gatling_projectile.gd.uid (100%) rename game/entities/weapons/{projectiles => gatling_gun}/gatling_projectile.tscn (92%) delete mode 100644 game/entities/weapons/projectiles/abstract_projectile.tscn create mode 100644 game/entities/weapons/railgun/railgun.gd create mode 100644 game/entities/weapons/railgun/railgun.gd.uid create mode 100644 game/entities/weapons/railgun/railgun.tscn create mode 100644 game/entities/weapons/railgun/railgun_projectile.gd create mode 100644 game/entities/weapons/railgun/railgun_projectile.gd.uid create mode 100644 game/entities/weapons/railgun/railgun_projectile.tscn delete mode 100644 game/entities/weapons/weapon.gd delete mode 100644 game/entities/weapons/weapon.tscn diff --git a/game/entities/player.gd b/game/entities/player.gd index 643147e..ab14d66 100644 --- a/game/entities/player.gd +++ b/game/entities/player.gd @@ -15,7 +15,7 @@ func _physics_process(delta: float) -> void: var input_direction := Input.get_vector("move_left", "move_right", "move_up", "move_down") ship.accelerate(input_direction, delta) - var weapons : Array[Weapon] = ship.weapons + var weapons : Array[AbstractWeapon] = ship.weapons var weapon_actions := { 0: ["shoot_weapon_1", "reload_weapon_1"], 1: ["shoot_weapon_2", "reload_weapon_2"] diff --git a/game/entities/ship.gd b/game/entities/ship.gd index 6e0be7e..ba66e78 100644 --- a/game/entities/ship.gd +++ b/game/entities/ship.gd @@ -21,7 +21,7 @@ extends CharacterBody2D @export var deceleration : int @export var max_speed : int -@onready var weapons : Array[Weapon]: +@onready var weapons : Array[AbstractWeapon]: set(value): pass get: @@ -33,10 +33,11 @@ func _ready() -> void: texture.size = size sprite.texture = texture - const WEAPON = preload("res://game/entities/weapons/weapon.tscn") + const GATLING = preload("res://game/entities/weapons/gatling_gun/gatling_gun.tscn") + const RAILGUN = preload("res://game/entities/weapons/railgun/railgun.tscn") var weapons_by_offset := { - 8: WEAPON.instantiate(), - -8: WEAPON.instantiate(), + 8: GATLING.instantiate(), + -8: RAILGUN.instantiate(), } for offset : int in weapons_by_offset: var weapon : Node2D = weapons_by_offset[offset] diff --git a/game/entities/weapons/projectiles/abstract_projectile.gd b/game/entities/weapons/abstract_projectile.gd similarity index 100% rename from game/entities/weapons/projectiles/abstract_projectile.gd rename to game/entities/weapons/abstract_projectile.gd diff --git a/game/entities/weapons/projectiles/abstract_projectile.gd.uid b/game/entities/weapons/abstract_projectile.gd.uid similarity index 100% rename from game/entities/weapons/projectiles/abstract_projectile.gd.uid rename to game/entities/weapons/abstract_projectile.gd.uid diff --git a/game/entities/weapons/abstract_weapon.gd b/game/entities/weapons/abstract_weapon.gd new file mode 100644 index 0000000..68fe8fb --- /dev/null +++ b/game/entities/weapons/abstract_weapon.gd @@ -0,0 +1,58 @@ +class_name AbstractWeapon +extends Node2D + + +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 Projectile : PackedScene +@export var reloaders : Array[AbstractReloader] + + +var _reloaders : Array[AbstractReloader] + + +func _ready() -> void: + for reloader in reloaders: + _reloaders.append(reloader.duplicate()) + + +func _physics_process(delta: float) -> void: + for reloader in _reloaders: + reloader.process(delta) + + +func shoot() -> void: + if not _can_shoot(): return + + var projectile := Projectile.instantiate() + + match belonging: + Belonging.PLAYER: + projectile.direction = Vector2.RIGHT + projectile.collide_enemies = true + Belonging.ENEMY: + projectile.direction = Vector2.LEFT + projectile.collide_player = true + + add_child(projectile) + + for reloader in _reloaders: + reloader.shoot() + + +func reload() -> void: + for reloader in _reloaders: + reloader.reload() + + +func _can_shoot() -> bool: + for reloader in _reloaders: + if not reloader.can_shoot(): + return false + return true diff --git a/game/entities/weapons/weapon.gd.uid b/game/entities/weapons/abstract_weapon.gd.uid similarity index 100% rename from game/entities/weapons/weapon.gd.uid rename to game/entities/weapons/abstract_weapon.gd.uid diff --git a/game/entities/weapons/abstract_weapon.tscn b/game/entities/weapons/abstract_weapon.tscn new file mode 100644 index 0000000..fe7d651 --- /dev/null +++ b/game/entities/weapons/abstract_weapon.tscn @@ -0,0 +1,23 @@ +[gd_scene load_steps=8 format=3 uid="uid://1o2ta17yc5bp"] + +[ext_resource type="Script" uid="uid://dpqxs8hlql2o0" path="res://game/entities/weapons/abstract_weapon.gd" id="1_x30ps"] +[ext_resource type="PackedScene" uid="uid://cnoiv8hdgossf" path="res://game/entities/weapons/gatling_gun/gatling_projectile.tscn" id="2_7kmqt"] +[ext_resource type="Script" uid="uid://ccpriilfr3kme" path="res://game/entities/weapons/reloaders/abstract_reloader.gd" id="3_x30ps"] +[ext_resource type="Script" uid="uid://d2gfhnlbqxsoq" path="res://game/entities/weapons/reloaders/magazine_reloader.gd" id="4_7kmqt"] +[ext_resource type="Script" uid="uid://b255rb32vc6co" path="res://game/entities/weapons/reloaders/firerate_reloader.gd" id="5_jj42u"] + +[sub_resource type="Resource" id="Resource_xi513"] +script = ExtResource("4_7kmqt") +magazine_size = 5 +reload_time = 2 +metadata/_custom_type_script = "uid://d2gfhnlbqxsoq" + +[sub_resource type="Resource" id="Resource_kq1js"] +script = ExtResource("5_jj42u") +firerate = 120 +metadata/_custom_type_script = "uid://b255rb32vc6co" + +[node name="Weapon" type="Node2D"] +script = ExtResource("1_x30ps") +Projectile = ExtResource("2_7kmqt") +reloaders = Array[ExtResource("3_x30ps")]([SubResource("Resource_xi513"), SubResource("Resource_kq1js")]) diff --git a/game/entities/weapons/gatling_gun/gatling_gun.gd b/game/entities/weapons/gatling_gun/gatling_gun.gd new file mode 100644 index 0000000..a3c01cf --- /dev/null +++ b/game/entities/weapons/gatling_gun/gatling_gun.gd @@ -0,0 +1,12 @@ +extends AbstractWeapon + + +@onready var sprite := $Sprite2D + + +func _ready() -> void: + var texture := PlaceholderTexture2D.new() + texture.size = Vector2(10, 7) + sprite.texture = texture + + super._ready() diff --git a/game/entities/weapons/gatling_gun/gatling_gun.gd.uid b/game/entities/weapons/gatling_gun/gatling_gun.gd.uid new file mode 100644 index 0000000..793f99d --- /dev/null +++ b/game/entities/weapons/gatling_gun/gatling_gun.gd.uid @@ -0,0 +1 @@ +uid://c1bsvmj7xhnxe diff --git a/game/entities/weapons/gatling_gun/gatling_gun.tscn b/game/entities/weapons/gatling_gun/gatling_gun.tscn new file mode 100644 index 0000000..3fd83c4 --- /dev/null +++ b/game/entities/weapons/gatling_gun/gatling_gun.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=8 format=3 uid="uid://c4vvw741175tj"] + +[ext_resource type="Script" uid="uid://c1bsvmj7xhnxe" path="res://game/entities/weapons/gatling_gun/gatling_gun.gd" id="1_irb3o"] +[ext_resource type="PackedScene" uid="uid://cnoiv8hdgossf" path="res://game/entities/weapons/gatling_gun/gatling_projectile.tscn" id="2_kifyy"] +[ext_resource type="Script" uid="uid://ccpriilfr3kme" path="res://game/entities/weapons/reloaders/abstract_reloader.gd" id="3_lpe3m"] +[ext_resource type="Script" uid="uid://b255rb32vc6co" path="res://game/entities/weapons/reloaders/firerate_reloader.gd" id="4_uk8wm"] +[ext_resource type="Script" uid="uid://d2gfhnlbqxsoq" path="res://game/entities/weapons/reloaders/magazine_reloader.gd" id="5_376q2"] + +[sub_resource type="Resource" id="Resource_83oj5"] +script = ExtResource("4_uk8wm") +firerate = 600 +metadata/_custom_type_script = "uid://b255rb32vc6co" + +[sub_resource type="Resource" id="Resource_6px3v"] +script = ExtResource("5_376q2") +magazine_size = 300 +reload_time = 2 +metadata/_custom_type_script = "uid://d2gfhnlbqxsoq" + +[node name="GatlingGun" type="Node2D"] +script = ExtResource("1_irb3o") +Projectile = ExtResource("2_kifyy") +reloaders = Array[ExtResource("3_lpe3m")]([SubResource("Resource_83oj5"), SubResource("Resource_6px3v")]) +metadata/_custom_type_script = "uid://dpqxs8hlql2o0" + +[node name="Sprite2D" type="Sprite2D" parent="."] diff --git a/game/entities/weapons/projectiles/gatling_projectile.gd b/game/entities/weapons/gatling_gun/gatling_projectile.gd similarity index 100% rename from game/entities/weapons/projectiles/gatling_projectile.gd rename to game/entities/weapons/gatling_gun/gatling_projectile.gd diff --git a/game/entities/weapons/projectiles/gatling_projectile.gd.uid b/game/entities/weapons/gatling_gun/gatling_projectile.gd.uid similarity index 100% rename from game/entities/weapons/projectiles/gatling_projectile.gd.uid rename to game/entities/weapons/gatling_gun/gatling_projectile.gd.uid diff --git a/game/entities/weapons/projectiles/gatling_projectile.tscn b/game/entities/weapons/gatling_gun/gatling_projectile.tscn similarity index 92% rename from game/entities/weapons/projectiles/gatling_projectile.tscn rename to game/entities/weapons/gatling_gun/gatling_projectile.tscn index bfeca46..dba04bc 100644 --- a/game/entities/weapons/projectiles/gatling_projectile.tscn +++ b/game/entities/weapons/gatling_gun/gatling_projectile.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=4 format=3 uid="uid://cnoiv8hdgossf"] -[ext_resource type="Script" uid="uid://rtsf1n0djorp" path="res://game/entities/weapons/projectiles/gatling_projectile.gd" id="1_xq7oi"] +[ext_resource type="Script" uid="uid://rtsf1n0djorp" path="res://game/entities/weapons/gatling_gun/gatling_projectile.gd" id="1_xq7oi"] [sub_resource type="PlaceholderTexture2D" id="PlaceholderTexture2D_xq7oi"] size = Vector2(4, 4) diff --git a/game/entities/weapons/projectiles/abstract_projectile.tscn b/game/entities/weapons/projectiles/abstract_projectile.tscn deleted file mode 100644 index e4a3a2e..0000000 --- a/game/entities/weapons/projectiles/abstract_projectile.tscn +++ /dev/null @@ -1,9 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://bohp8yx6cldgc"] - -[ext_resource type="Script" uid="uid://ctmjb3nkxrepu" path="res://game/entities/weapons/projectiles/abstract_projectile.gd" id="1_4tgfk"] - -[node name="AbstractProjectile" type="CharacterBody2D"] -collision_layer = 0 -collision_mask = 0 -motion_mode = 1 -script = ExtResource("1_4tgfk") diff --git a/game/entities/weapons/railgun/railgun.gd b/game/entities/weapons/railgun/railgun.gd new file mode 100644 index 0000000..a3c01cf --- /dev/null +++ b/game/entities/weapons/railgun/railgun.gd @@ -0,0 +1,12 @@ +extends AbstractWeapon + + +@onready var sprite := $Sprite2D + + +func _ready() -> void: + var texture := PlaceholderTexture2D.new() + texture.size = Vector2(10, 7) + sprite.texture = texture + + super._ready() diff --git a/game/entities/weapons/railgun/railgun.gd.uid b/game/entities/weapons/railgun/railgun.gd.uid new file mode 100644 index 0000000..8f5a3fc --- /dev/null +++ b/game/entities/weapons/railgun/railgun.gd.uid @@ -0,0 +1 @@ +uid://drnofu4ium56e diff --git a/game/entities/weapons/railgun/railgun.tscn b/game/entities/weapons/railgun/railgun.tscn new file mode 100644 index 0000000..e0a4a34 --- /dev/null +++ b/game/entities/weapons/railgun/railgun.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=8 format=3 uid="uid://4ikdkhxoiwox"] + +[ext_resource type="Script" uid="uid://drnofu4ium56e" path="res://game/entities/weapons/railgun/railgun.gd" id="1_5nhwg"] +[ext_resource type="PackedScene" uid="uid://dpd6qm3e3wbjx" path="res://game/entities/weapons/railgun/railgun_projectile.tscn" id="2_cbsia"] +[ext_resource type="Script" uid="uid://ccpriilfr3kme" path="res://game/entities/weapons/reloaders/abstract_reloader.gd" id="3_qxka8"] +[ext_resource type="Script" uid="uid://b255rb32vc6co" path="res://game/entities/weapons/reloaders/firerate_reloader.gd" id="4_igknv"] +[ext_resource type="Script" uid="uid://d2gfhnlbqxsoq" path="res://game/entities/weapons/reloaders/magazine_reloader.gd" id="5_buejq"] + +[sub_resource type="Resource" id="Resource_6wi8i"] +script = ExtResource("4_igknv") +firerate = 60 +metadata/_custom_type_script = "uid://b255rb32vc6co" + +[sub_resource type="Resource" id="Resource_2gq2l"] +script = ExtResource("5_buejq") +magazine_size = 30 +reload_time = 7 +metadata/_custom_type_script = "uid://d2gfhnlbqxsoq" + +[node name="Railgun" type="Node2D"] +script = ExtResource("1_5nhwg") +Projectile = ExtResource("2_cbsia") +reloaders = Array[ExtResource("3_qxka8")]([SubResource("Resource_6wi8i"), SubResource("Resource_2gq2l")]) +metadata/_custom_type_script = "uid://dpqxs8hlql2o0" + +[node name="Sprite2D" type="Sprite2D" parent="."] diff --git a/game/entities/weapons/railgun/railgun_projectile.gd b/game/entities/weapons/railgun/railgun_projectile.gd new file mode 100644 index 0000000..e00f7b1 --- /dev/null +++ b/game/entities/weapons/railgun/railgun_projectile.gd @@ -0,0 +1,9 @@ +extends AbstractProjectile + + +func _ready() -> void: + var texture := PlaceholderTexture2D.new() + texture.size = Vector2(6, 6) + $Sprite2D.texture = texture + + super._ready() diff --git a/game/entities/weapons/railgun/railgun_projectile.gd.uid b/game/entities/weapons/railgun/railgun_projectile.gd.uid new file mode 100644 index 0000000..2ecb482 --- /dev/null +++ b/game/entities/weapons/railgun/railgun_projectile.gd.uid @@ -0,0 +1 @@ +uid://n3h1e3pj02g0 diff --git a/game/entities/weapons/railgun/railgun_projectile.tscn b/game/entities/weapons/railgun/railgun_projectile.tscn new file mode 100644 index 0000000..31788ff --- /dev/null +++ b/game/entities/weapons/railgun/railgun_projectile.tscn @@ -0,0 +1,20 @@ +[gd_scene load_steps=3 format=3 uid="uid://dpd6qm3e3wbjx"] + +[ext_resource type="Script" uid="uid://n3h1e3pj02g0" path="res://game/entities/weapons/railgun/railgun_projectile.gd" id="1_hycpq"] + +[sub_resource type="CircleShape2D" id="CircleShape2D_hycpq"] +radius = 2.0 + +[node name="RailgunProjectile" type="CharacterBody2D"] +collision_layer = 0 +collision_mask = 0 +motion_mode = 1 +script = ExtResource("1_hycpq") +damage = 45 +speed = 300 +metadata/_custom_type_script = "uid://ctmjb3nkxrepu" + +[node name="Sprite2D" type="Sprite2D" parent="."] + +[node name="CollisionShape2D" type="CollisionShape2D" parent="."] +shape = SubResource("CircleShape2D_hycpq") diff --git a/game/entities/weapons/reloaders/abstract_reloader.gd b/game/entities/weapons/reloaders/abstract_reloader.gd index 6285412..6bf28b8 100644 --- a/game/entities/weapons/reloaders/abstract_reloader.gd +++ b/game/entities/weapons/reloaders/abstract_reloader.gd @@ -1,11 +1,15 @@ @abstract +extends Resource class_name AbstractReloader -extends Node var _random := RandomNumberGenerator.new() +@abstract +func process(delta: float) -> void + + @abstract func can_shoot() -> bool diff --git a/game/entities/weapons/reloaders/energy_reloader.gd b/game/entities/weapons/reloaders/energy_reloader.gd index b1b1e01..5215b36 100644 --- a/game/entities/weapons/reloaders/energy_reloader.gd +++ b/game/entities/weapons/reloaders/energy_reloader.gd @@ -1,4 +1,5 @@ extends AbstractReloader +class_name EnergyReloader @export var heat_per_shot : int: @@ -32,7 +33,7 @@ func _ready() -> void: _calculate_cool() -func _physics_process(delta: float) -> void: +func process(delta: float) -> void: if _heat > 0: _heat -= _cool_per_sec * delta if _heat < 0: diff --git a/game/entities/weapons/reloaders/firerate_reloader.gd b/game/entities/weapons/reloaders/firerate_reloader.gd index 923e3b1..d150d51 100644 --- a/game/entities/weapons/reloaders/firerate_reloader.gd +++ b/game/entities/weapons/reloaders/firerate_reloader.gd @@ -1,4 +1,5 @@ extends AbstractReloader +class_name FirerateReloader @export var firerate : int: @@ -16,7 +17,7 @@ func _ready() -> void: _calculate_delay() -func _physics_process(delta: float) -> void: +func process(delta: float) -> void: if _cooldown > 0: _cooldown -= delta diff --git a/game/entities/weapons/reloaders/magazine_reloader.gd b/game/entities/weapons/reloaders/magazine_reloader.gd index 5c19f48..7c7789c 100644 --- a/game/entities/weapons/reloaders/magazine_reloader.gd +++ b/game/entities/weapons/reloaders/magazine_reloader.gd @@ -1,4 +1,5 @@ extends AbstractReloader +class_name MagazineReloader @export var magazine_size : int: @@ -23,7 +24,7 @@ func _ready() -> void: _calculate_reload_time_tenth() -func _physics_process(delta: float) -> void: +func process(delta: float) -> void: if _countdown > 0: _countdown -= delta if _countdown <= 0: diff --git a/game/entities/weapons/weapon.gd b/game/entities/weapons/weapon.gd deleted file mode 100644 index 9a46cad..0000000 --- a/game/entities/weapons/weapon.gd +++ /dev/null @@ -1,75 +0,0 @@ -class_name Weapon -extends Node2D - - -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 Projectile : AbstractProjectile -@export var reloaders : Array[AbstractReloader] - - -@onready var sprite := $Sprite2D - - -func _init() -> void: - #TEST - var firerate_reloader := preload("res://game/entities/weapons/reloaders/firerate_reloader.gd").new() - firerate_reloader.firerate = 600 - reloaders.append(firerate_reloader) - add_child(firerate_reloader) - - var magazine_reloader := preload("res://game/entities/weapons/reloaders/magazine_reloader.gd").new() - magazine_reloader.magazine_size = 300 - magazine_reloader.reload_time = 2 - reloaders.append(magazine_reloader) - add_child(magazine_reloader) - - #var energy_reloader := preload("res://game/entities/weapons/reloaders/energy_reloader.gd").new() - #energy_reloader.heat_capacity = 1000 - #energy_reloader.heat_per_shot = 25 - #energy_reloader.cooling_down_rate = 1000 - #reloaders.append(energy_reloader) - #add_child(energy_reloader) - - -func _ready() -> void: - var texture := PlaceholderTexture2D.new() - texture.size = Vector2(10, 7) - sprite.texture = texture - - -func shoot() -> void: - if not _can_shoot(): return - - var projectile := preload("res://game/entities/weapons/projectiles/gatling_projectile.tscn").instantiate() - - match belonging: - Belonging.PLAYER: - projectile.direction = Vector2.RIGHT - projectile.collide_enemies = true - Belonging.ENEMY: - projectile.direction = Vector2.LEFT - projectile.collide_player = true - - add_child(projectile) - - for reloader in reloaders: - reloader.shoot() - - -func reload() -> void: - for reloader in reloaders: - reloader.reload() - - -func _can_shoot() -> bool: - for reloader in reloaders: - if not reloader.can_shoot(): - return false - return true diff --git a/game/entities/weapons/weapon.tscn b/game/entities/weapons/weapon.tscn deleted file mode 100644 index ee742a9..0000000 --- a/game/entities/weapons/weapon.tscn +++ /dev/null @@ -1,12 +0,0 @@ -[gd_scene load_steps=2 format=3 uid="uid://dwm4iejnbuhxo"] - -[ext_resource type="Script" uid="uid://dpqxs8hlql2o0" path="res://game/entities/weapons/weapon.gd" id="1_4oq3a"] - -[node name="Weapon" type="Node2D"] -script = ExtResource("1_4oq3a") -belonging = null -damage = null -bullet_per_shot = null -sector_angle = null - -[node name="Sprite2D" type="Sprite2D" parent="."]