diff --git a/game/entities/player.gd b/game/entities/player.gd index 81d04d8..4fa7042 100644 --- a/game/entities/player.gd +++ b/game/entities/player.gd @@ -13,7 +13,15 @@ func _process(delta: float) -> void: $Ship.accelerate(input_direction, delta) var weapons : Array = $Ship.weapons - var weapon_actions := { 0: "shoot_weapon_1", 1: "shoot_weapon_2" } + var weapon_actions := { + 0: ["shoot_weapon_1", "reload_weapon_1"], + 1: ["shoot_weapon_2", "reload_weapon_2"] + } for index : int in weapon_actions: - if Input.is_action_pressed(weapon_actions[index], true) and weapons.size() > index: + if index >= weapons.size(): break + + if Input.is_action_pressed(weapon_actions[index][0], true): $Ship.shoot(weapons[index]) + + if Input.is_action_pressed(weapon_actions[index][1], true): + $Ship.reload(weapons[index]) diff --git a/game/entities/ship.gd b/game/entities/ship.gd index 52eebd8..5cded68 100644 --- a/game/entities/ship.gd +++ b/game/entities/ship.gd @@ -72,3 +72,8 @@ func _get_new_speed(accel: float, decel: float, current_speed: float) -> float: func shoot(weapon: Node) -> void: if weapon in weapons: weapon.shoot() + + +func reload(weapon: Node) -> void: + if weapon in weapons: + weapon.reload() diff --git a/game/entities/weapons/reloaders/abstract_reloader.gd b/game/entities/weapons/reloaders/abstract_reloader.gd index 6328fc4..de85601 100644 --- a/game/entities/weapons/reloaders/abstract_reloader.gd +++ b/game/entities/weapons/reloaders/abstract_reloader.gd @@ -3,7 +3,7 @@ class_name AbstractReloader extends Node -var random := RandomNumberGenerator.new() +var _random := RandomNumberGenerator.new() @abstract @@ -12,3 +12,7 @@ func can_shoot() -> bool @abstract func shoot() -> void + + +@abstract +func reload() -> void diff --git a/game/entities/weapons/reloaders/energy_reloader.gd b/game/entities/weapons/reloaders/energy_reloader.gd new file mode 100644 index 0000000..04cf921 --- /dev/null +++ b/game/entities/weapons/reloaders/energy_reloader.gd @@ -0,0 +1,61 @@ +extends AbstractReloader + + +@export var heat_per_shot : int: + set(value): + heat_per_shot = value + _calculate_critical_heat() + + +@export var heat_capacity : int: + set(value): + heat_capacity = value + _calculate_critical_heat() + + +@export var cooling_down_rate : int: + set(value): + cooling_down_rate = value + _calculate_cool() + + +var _cool_per_sec : float +var _cool_per_sec_tenth : float + + +var _heat : float +var _critical_heat : int + + +func _ready() -> void: + _calculate_critical_heat() + _calculate_cool() + + +func _process(delta: float) -> void: + if _heat > 0: + _heat -= _cool_per_sec * delta + if _heat < 0: + _heat = 0 + + +func can_shoot() -> bool: + return _heat <= _critical_heat + + +func shoot() -> void: + var random_heat := _random.randf_range(-_cool_per_sec_tenth, _cool_per_sec_tenth) + _heat += heat_per_shot + random_heat + + +func reload() -> void: + pass + + +func _calculate_critical_heat() -> void: + _critical_heat = heat_capacity - heat_per_shot + + +func _calculate_cool() -> void: + _cool_per_sec = cooling_down_rate / 60.0 + _cool_per_sec_tenth = _cool_per_sec / 10 diff --git a/game/entities/weapons/reloaders/energy_reloader.gd.uid b/game/entities/weapons/reloaders/energy_reloader.gd.uid new file mode 100644 index 0000000..9505021 --- /dev/null +++ b/game/entities/weapons/reloaders/energy_reloader.gd.uid @@ -0,0 +1 @@ +uid://dxk56xdihfw4m diff --git a/game/entities/weapons/reloaders/firerate_reloader.gd b/game/entities/weapons/reloaders/firerate_reloader.gd index 87141fa..3a577c9 100644 --- a/game/entities/weapons/reloaders/firerate_reloader.gd +++ b/game/entities/weapons/reloaders/firerate_reloader.gd @@ -1,16 +1,21 @@ extends AbstractReloader -@export var firerate : int - - -@onready var _delay : float = 60.0 / firerate -@onready var _delay_tenth : float = _delay / 10 +@export var firerate : int: + set(value): + firerate = value + _calculate_delay() +var _delay : float +var _delay_tenth : float var _cooldown : float +func _ready() -> void: + _calculate_delay() + + func _process(delta: float) -> void: if _cooldown > 0: _cooldown -= delta @@ -21,5 +26,14 @@ func can_shoot() -> bool: func shoot() -> void: - var random_delay := random.randf_range(-_delay_tenth, _delay_tenth) + var random_delay := _random.randf_range(-_delay_tenth, _delay_tenth) _cooldown = _delay + random_delay + + +func reload() -> void: + pass + + +func _calculate_delay() -> void: + _delay = 60.0 / firerate + _delay_tenth = _delay / 10 diff --git a/game/entities/weapons/reloaders/magazine_reloader.gd b/game/entities/weapons/reloaders/magazine_reloader.gd index 0dec75f..57f30ee 100644 --- a/game/entities/weapons/reloaders/magazine_reloader.gd +++ b/game/entities/weapons/reloaders/magazine_reloader.gd @@ -1,23 +1,33 @@ extends AbstractReloader -@export var magazine_size : int -@export var reload_time : int +@export var magazine_size : int: + set(value): + magazine_size = value + _calculate_bullets_in_magazine() -@onready var _bullets_in_magazine : int = magazine_size if magazine_size > 0 else -1 -@onready var _reload_time_tenth : float = reload_time / 10.0 +@export var reload_time : int: + set(value): + reload_time = value + _calculate_reload_time_tenth() +var _bullets_in_magazine : int +var _reload_time_tenth : float var _cooldown : float +func _ready() -> void: + _calculate_bullets_in_magazine() + _calculate_reload_time_tenth() + + func _process(delta: float) -> void: if _cooldown > 0: _cooldown -= delta - - if _bullets_in_magazine == 0 and _cooldown <= 0: - _bullets_in_magazine = magazine_size + if _cooldown <= 0: + _bullets_in_magazine = magazine_size func can_shoot() -> bool: @@ -29,5 +39,19 @@ func shoot() -> void: _bullets_in_magazine -= 1 if _bullets_in_magazine == 0: - var random_delay := random.randf_range(-_reload_time_tenth, _reload_time_tenth) - _cooldown = reload_time + random_delay + reload() + + +func reload() -> void: + if _cooldown > 0 or _bullets_in_magazine == magazine_size: return + print("reload") + var random_delay := _random.randf_range(-_reload_time_tenth, _reload_time_tenth) + _cooldown = reload_time + random_delay + + +func _calculate_bullets_in_magazine() -> void: + _bullets_in_magazine = magazine_size + + +func _calculate_reload_time_tenth() -> void: + _reload_time_tenth = reload_time / 10.0 diff --git a/game/entities/weapons/weapon.gd b/game/entities/weapons/weapon.gd index a981774..f0d9e08 100644 --- a/game/entities/weapons/weapon.gd +++ b/game/entities/weapons/weapon.gd @@ -2,25 +2,35 @@ extends Node2D @export var damage : int -@export var firerate : int -@export var magazine_size : int -@export var reload_time : int +@export var explosion_size : 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 +@export var reloaders : Array[AbstractReloader] func _init() -> void: -#TEST - firerate = 600 - magazine_size = 300 - reload_time = 2 + #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 = 5 + magazine_reloader.reload_time = 3 + 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: @@ -31,8 +41,18 @@ func _ready() -> void: func shoot() -> void: if not _can_shoot(): return - print("shoot") + print("shot") + 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