extends Node2D var timer: Timer var asteroids := [ preload('res://Enemies/Scenes/asteroidTiny.tscn'), preload('res://Enemies/Scenes/asteroidSm.tscn'), preload('res://Enemies/Scenes/asteroid.tscn'), preload('res://Enemies/Scenes/asteroidBig.tscn') ] var screen_size: Vector2 func _ready(): Game.spawner = self screen_size = get_viewport_rect().size # Call spawn_enemy() every spawn_interval seconds timer = Timer.new() timer.wait_time = spawn_time_from_score(Game.score) timer.timeout.connect(spawn_enemy) add_child(timer) func spawn_time_from_score(score: int) -> float: var min_time = 0.3 var max_time = 2.0 var max_score = 50000.0 # Clamp score so it doesn’t overshoot var clamped_score = clamp(score, 0, max_score) # Normalized value [0..1] var t = float(clamped_score) / max_score # Logarithmic easing (slows down progression) # Use log10 but you can tweak the base for different curves var curved_t = log(1.0 + 9.0 * t) / log(10.0) # maps 0..1 to 0..1, but with log shape # Interpolate between max_time and min_time return lerp(max_time, min_time, curved_t) func spawn_enemy(): var enemy = asteroids[randi_range(0, 3)].instantiate() var pos = get_random_edge_position() enemy.position = pos # Direction vector toward center var center = screen_size * 0.5 var dir = (center - pos).normalized() # Add some randomness so it's not always perfect var angle_variation = randf_range(-0.5, 0.5) # radians (~±14 degrees) dir = dir.rotated(angle_variation) # Apply starting velocity enemy.rot_velocity = randf_range(0, PI) enemy.velocity = dir * randf_range(50, 200) enemy.rotation = randf_range(0, PI) var scl = randi_range(1, 5) enemy.scale = Vector2(scl, scl) enemy.add_to_group("enemies") add_child(enemy) timer.wait_time = spawn_time_from_score(Game.score) func get_random_edge_position() -> Vector2: # Pick which edge (0=top,1=bottom,2=left,3=right) var edge = randi() % 4 match edge: 0: # top return Vector2(randf() * screen_size.x, 0) 1: # bottom return Vector2(randf() * screen_size.x, screen_size.y) 2: # left return Vector2(0, randf() * screen_size.y) 3: # right return Vector2(screen_size.x, randf() * screen_size.y) return Vector2.ZERO func stop(): timer.stop() func start(): timer.start()