Added gatling gun and railgun

This commit is contained in:
2025-11-04 20:03:17 +03:00
parent 832db6f531
commit ce6b93a7bf
26 changed files with 207 additions and 106 deletions
+1 -1
View File
@@ -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"]
+5 -4
View File
@@ -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]
+58
View File
@@ -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
@@ -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")])
@@ -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()
@@ -0,0 +1 @@
uid://c1bsvmj7xhnxe
@@ -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="."]
@@ -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)
@@ -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")
+12
View File
@@ -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()
@@ -0,0 +1 @@
uid://drnofu4ium56e
@@ -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="."]
@@ -0,0 +1,9 @@
extends AbstractProjectile
func _ready() -> void:
var texture := PlaceholderTexture2D.new()
texture.size = Vector2(6, 6)
$Sprite2D.texture = texture
super._ready()
@@ -0,0 +1 @@
uid://n3h1e3pj02g0
@@ -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")
@@ -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
@@ -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:
@@ -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
@@ -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:
-75
View File
@@ -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
-12
View File
@@ -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="."]