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