From d6259d64e1ca929845cf87fa38a027ca08316643 Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Wed, 22 Oct 2025 00:11:03 +0300 Subject: [PATCH] Added some weapon logic --- game/entities/player.gd | 14 ++++----- game/entities/weapon.gd | 64 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 8 deletions(-) diff --git a/game/entities/player.gd b/game/entities/player.gd index ebcf40d..81d04d8 100644 --- a/game/entities/player.gd +++ b/game/entities/player.gd @@ -8,14 +8,12 @@ var position : Vector2: return $Ship.position -func _input(event: InputEvent) -> void: - var weapons : Array = $Ship.weapons - var weapon_actions := { 0: "shoot_weapon_1", 1: "shoot_weapon_2" } - for index : int in weapon_actions: - if event.is_action_pressed(weapon_actions[index]) and weapons.size() > index: - $Ship.shoot(weapons[index]) - - func _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 = $Ship.weapons + var weapon_actions := { 0: "shoot_weapon_1", 1: "shoot_weapon_2" } + for index : int in weapon_actions: + if Input.is_action_pressed(weapon_actions[index], true) and weapons.size() > index: + $Ship.shoot(weapons[index]) diff --git a/game/entities/weapon.gd b/game/entities/weapon.gd index dc1371c..ff1fd71 100644 --- a/game/entities/weapon.gd +++ b/game/entities/weapon.gd @@ -1,11 +1,75 @@ extends Node2D +@export var damage : int +@export var firerate : int +@export var magazine_size : int +@export var reload_time : int +@export var bullet_velocity : int +@export var bullet_acceleration : int +@export var bullet_per_shot : int +@export var sector_angle : int +@export var distance : int +@export var heat_per_shot : int +@export var heat_capacity : int +@export var cooling_down_rate : int +@export var explosion_size : int + +@onready var _firerate_delay : float = 60.0 / firerate +@onready var _firerate_delay_tenth : float = _firerate_delay / 10 + +@onready var _bullets_in_magazine : int = magazine_size if magazine_size > 0 else -1 + +@onready var _reload_time_tenth : float = reload_time / 10.0 + +var _firerate_cooldown : float +var _reload_cooldown : float + +var random := RandomNumberGenerator.new() + + +func _init() -> void: +#TEST + firerate = 600 + magazine_size = 300 + reload_time = 2 + + func _ready() -> void: var texture := PlaceholderTexture2D.new() texture.size = Vector2(10, 7) $Sprite2D.texture = texture +func _process(delta: float) -> void: + if _firerate_cooldown > 0: + _firerate_cooldown -= delta + if _reload_cooldown > 0: + _reload_cooldown -= delta + + if _bullets_in_magazine == 0 and _reload_cooldown <= 0: + _bullets_in_magazine = magazine_size + + func shoot() -> void: + if not _can_shoot(): return + + var random_firerate_delay := random.randf_range(-_firerate_delay_tenth, _firerate_delay_tenth) + _firerate_cooldown = _firerate_delay + random_firerate_delay + + if _bullets_in_magazine > 0: + _bullets_in_magazine -= 1 + + if _bullets_in_magazine == 0: + var random_reload_delay := random.randf_range(-_reload_time_tenth, _reload_time_tenth) + _reload_cooldown = reload_time + random_reload_delay + print("shoot") + + +func _can_shoot() -> bool: + if _firerate_cooldown > 0: return false + + if _reload_cooldown > 0: return false + + return true