62 lines
1.9 KiB
GDScript
62 lines
1.9 KiB
GDScript
class_name WeaponComponent extends Node
|
|
|
|
@export var weapon_data: WeaponShot = null
|
|
@export var available_weapons: Array[WeaponShot] = []
|
|
@export var weapon_change_flash: BaseEffect = null
|
|
|
|
var _current_weapon_index: int = 0
|
|
|
|
@onready var effects_component: EffectComponent = %EffectsComponent
|
|
|
|
func _ready() -> void:
|
|
|
|
# Set the default weapon to be stock, i.e. index 1
|
|
if weapon_data and not available_weapons.is_empty():
|
|
for i in range(available_weapons.size()):
|
|
if available_weapons[i] == weapon_data:
|
|
_current_weapon_index = i
|
|
return
|
|
|
|
|
|
func _emit_weapon_changed() -> void:
|
|
var ship: Sprite2D = get_parent().get_node("Ship")
|
|
var sprite_size = ship.get_rect().size
|
|
var origin_offset = weapon_data.origin if weapon_data else 0.0
|
|
EventBus.weapon_changed.emit(weapon_data.shot_name, get_parent(), sprite_size, origin_offset)
|
|
|
|
|
|
func get_bullet_scene() -> PackedScene:
|
|
return weapon_data.bullet_scene if weapon_data else null
|
|
|
|
func get_weapon_resource() -> Resource:
|
|
return weapon_data
|
|
|
|
func select_weapon_by_name(name: String) -> bool:
|
|
for i in range(available_weapons.size()):
|
|
if available_weapons[i].shot_name == name:
|
|
_current_weapon_index = i
|
|
weapon_data = available_weapons[i]
|
|
print("Switched to: ", name)
|
|
|
|
_emit_weapon_changed()
|
|
_trigger_change_flash()
|
|
return true
|
|
return false
|
|
|
|
|
|
func _trigger_change_flash() -> void:
|
|
if weapon_change_flash and effects_component:
|
|
effects_component.apply_effect(weapon_change_flash)
|
|
|
|
|
|
|
|
func cycle_weapon() -> void: # Used for testing weapon cycling
|
|
if available_weapons.is_empty():
|
|
return
|
|
|
|
_current_weapon_index = (_current_weapon_index + 1) % available_weapons.size()
|
|
weapon_data = available_weapons[_current_weapon_index]
|
|
print("Switched to: ", weapon_data.shot_name)
|
|
|
|
_emit_weapon_changed()
|
|
_trigger_change_flash()
|