85 lines
2.2 KiB
GDScript
85 lines
2.2 KiB
GDScript
class_name RangedWeapon extends Node2D
|
|
|
|
signal projectile_spawned(projectile)
|
|
|
|
@export var projectile_scene: PackedScene
|
|
|
|
# Base stats - will be modified by modifiers
|
|
var base_stats = {
|
|
"damage": 10.0,
|
|
"fire_rate": 2.0, # Shots per second
|
|
"projectile_speed": 500.0,
|
|
"projectile_size": 1.0,
|
|
"projectile_lifetime": 5.0,
|
|
"max_pierce": 0
|
|
}
|
|
|
|
# Components
|
|
var stats: ModifierManager
|
|
var can_fire: bool = true
|
|
var fire_timer: Timer
|
|
|
|
func _init() -> void:
|
|
stats = ModifierManager.new(base_stats)
|
|
Log.pr(stats)
|
|
add_child(stats)
|
|
|
|
func _ready():
|
|
# Connect to stats updated signal
|
|
stats.connect("stats_updated", _on_stats_updated)
|
|
|
|
# Setup fire timer
|
|
fire_timer = Timer.new()
|
|
add_child(fire_timer)
|
|
fire_timer.one_shot = true
|
|
fire_timer.connect("timeout", _on_fire_timer_timeout)
|
|
|
|
# Initial update
|
|
_on_stats_updated()
|
|
|
|
func fire(direction: Vector2):
|
|
if !can_fire:
|
|
return
|
|
|
|
_spawn_projectile(global_position, direction)
|
|
|
|
can_fire = false
|
|
fire_timer.start(1.0 / stats.get_stat("fire_rate"))
|
|
|
|
func _spawn_projectile(spawn_position: Vector2, spawn_direction: Vector2):
|
|
var projectile = projectile_scene.instantiate()
|
|
projectile.global_position = spawn_position
|
|
projectile.direction = spawn_direction
|
|
|
|
# Apply stats to projectile
|
|
projectile.speed = stats.get_stat("projectile_speed")
|
|
projectile.damage = stats.get_stat("damage")
|
|
projectile.lifetime = stats.get_stat("projectile_lifetime")
|
|
projectile.pierce_count = stats.get_stat("max_pierce")
|
|
projectile.source_weapon = self
|
|
|
|
# Apply size (scale)
|
|
var size = stats.get_stat("projectile_size")
|
|
projectile.scale = Vector2(size, size)
|
|
|
|
# Allow modifiers to directly modify the projectile
|
|
for modifier in stats.modifiers:
|
|
modifier.modify_projectile(projectile)
|
|
|
|
get_tree().root.add_child(projectile)
|
|
projectile.emit_signal("on_spawned", projectile)
|
|
emit_signal("projectile_spawned", projectile)
|
|
|
|
func add_modifier(modifier: Modifier):
|
|
stats.add_modifier(modifier)
|
|
|
|
func remove_modifier(modifier_id: String):
|
|
stats.remove_modifier(modifier_id)
|
|
|
|
func _on_stats_updated():
|
|
# Update any visual components based on new stats
|
|
# For example, if weapon appearance changes based on damage/fire rate
|
|
pass
|
|
|
|
func _on_fire_timer_timeout():
|
|
can_fire = true
|