77 lines
2 KiB
GDScript
77 lines
2 KiB
GDScript
@tool
|
|
class_name Weapon
|
|
extends Node2D
|
|
|
|
# constants
|
|
@export var max_ammo = 1
|
|
## Number of seconds until the weapon can be used again.
|
|
@export var cooldown = 0.1
|
|
@export var shot: PackedScene:
|
|
set(new_shot):
|
|
shot = new_shot
|
|
update_configuration_warnings()
|
|
@export var shot_spawn: Node2D
|
|
@export var audio: AudioStreamPlayer2D
|
|
|
|
# gameplay variables
|
|
var ammo
|
|
var timer = 0.0
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
func _ready() -> void:
|
|
if !Engine.is_editor_hint():
|
|
ammo = max_ammo
|
|
else:
|
|
child_entered_tree.connect(_on_child_entered_tree)
|
|
child_exiting_tree.connect(_on_child_exited_tree)
|
|
|
|
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
func _process(delta: float) -> void:
|
|
if !Engine.is_editor_hint():
|
|
timer += delta
|
|
|
|
func _get_configuration_warnings():
|
|
var warnings = []
|
|
|
|
if shot == null:
|
|
warnings.append("Please select a projectile scene for the shot variable.")
|
|
if shot_spawn == null:
|
|
warnings.append("Please add a Node2D as the muzzle/projectile spawning location for the shot_spawn variable.")
|
|
if audio == null:
|
|
warnings.append("Please add an AudioStreamPlayer2D which plays the weapon's audio.")
|
|
return warnings
|
|
|
|
func _on_child_entered_tree(node):
|
|
print_debug("saw a child entering tree: ", node)
|
|
if node.get_class() == "Node2D":
|
|
shot_spawn = node
|
|
if node is AudioStreamPlayer2D:
|
|
audio = node
|
|
update_configuration_warnings()
|
|
|
|
func _on_child_exited_tree(node):
|
|
if node == shot_spawn:
|
|
shot_spawn = null
|
|
if node == audio:
|
|
audio = null
|
|
update_configuration_warnings()
|
|
|
|
# Creates and returns an instance of the weapon's projectile.
|
|
func shoot() -> Projectile:
|
|
print_debug("trying to shoot, timer at ", timer, " out of ", cooldown, " ammo at ", ammo, " out of ", max_ammo)
|
|
if timer > cooldown && ammo > 0:
|
|
timer = 0
|
|
var new_shot = shot.instantiate()
|
|
owner.add_child(new_shot)
|
|
new_shot.transform = shot_spawn.global_transform
|
|
ammo -= 1
|
|
audio.play()
|
|
return new_shot
|
|
else:
|
|
return null
|
|
|
|
func add_ammo(amount):
|
|
ammo += amount
|
|
if ammo > max_ammo:
|
|
ammo = max_ammo
|