extends Node2D const WORLD_SIZE := Vector2(5200.0, 3600.0) const ENEMY_COUNT := 20 const SAFE_ZONE_RADIUS := 440.0 const ENEMY_MIN_SEPARATION := 240.0 const ENEMY_SCENE := preload("res://scenes/game/enemy_ship.tscn") const ENEMY_TEXTURES: Array[Texture2D] = [ preload("res://assets/alien ship/Ship_1.png"), preload("res://assets/alien ship/Ship_2.png"), preload("res://assets/alien ship/Ship_3.png"), preload("res://assets/alien ship/Ship_4.png"), preload("res://assets/alien ship/Ship_5.png"), preload("res://assets/alien ship/Ship_6.png"), preload("res://assets/alien ship/Ship_7.png"), preload("res://assets/alien ship/Ship_8.png"), preload("res://assets/alien ship/Ship_9.png"), preload("res://assets/alien ship/Ship_10.png"), preload("res://assets/alien ship/Ship_11.png"), ] @onready var player: CharacterBody2D = $PlayerShip func _ready() -> void: # Keep the camera limits aligned with the test map if its size is tuned later. var camera := player.get_node_or_null("Camera2D") as Camera2D if camera: camera.limit_left = int(-WORLD_SIZE.x * 0.5) camera.limit_right = int(WORLD_SIZE.x * 0.5) camera.limit_top = int(-WORLD_SIZE.y * 0.5) camera.limit_bottom = int(WORLD_SIZE.y * 0.5) _spawn_enemies() func _spawn_enemies() -> void: var rng := RandomNumberGenerator.new() rng.randomize() var spawn_positions: Array[Vector2] = [] var attempts := 0 while spawn_positions.size() < ENEMY_COUNT and attempts < 3000: attempts += 1 var candidate := Vector2( rng.randf_range(-WORLD_SIZE.x * 0.5 + 130.0, WORLD_SIZE.x * 0.5 - 130.0), rng.randf_range(-WORLD_SIZE.y * 0.5 + 130.0, WORLD_SIZE.y * 0.5 - 130.0) ) if candidate.length_squared() < SAFE_ZONE_RADIUS * SAFE_ZONE_RADIUS: continue var too_close := false for other_position in spawn_positions: if candidate.distance_squared_to(other_position) < ENEMY_MIN_SEPARATION * ENEMY_MIN_SEPARATION: too_close = true break if not too_close: spawn_positions.append(candidate) for spawn_position in spawn_positions: var enemy := ENEMY_SCENE.instantiate() as CharacterBody2D enemy.position = spawn_position add_child(enemy) enemy.call("configure", player, ENEMY_TEXTURES[rng.randi_range(0, ENEMY_TEXTURES.size() - 1)])