TailgunnerGodot/scripts/weapon.gd

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