extends Node3D @export var tile_scene: PackedScene @export var tile_size: float = 2.0 @export var tile_separation: float = 0.2 var generated_tiles: Dictionary = {} func _ready() -> void: spawn_tile(Vector2i(0, 0)) func spawn_tile(grid_pos: Vector2i) -> void: if generated_tiles.has(grid_pos): return var tile = tile_scene.instantiate() add_child(tile) var x_spacing = tile_size * 0.75 + tile_separation var z_spacing = tile_size * sqrt(3) / 2 + tile_separation var pos_x = grid_pos.x * x_spacing var pos_z = grid_pos.y * z_spacing + (abs(grid_pos.x) % 2) * (z_spacing / 2.0) var target_position = Vector3(pos_x, 0, pos_z) tile.transform.origin = Vector3(pos_x, -3.0, pos_z) generated_tiles[grid_pos] = tile if tile.has_method("initialize"): tile.initialize(grid_pos.x, grid_pos.y) var tween = create_tween() var tile_light = tile.get_node_or_null("OmniLight3D") if tile_light: tile_light.light_energy = 0.0 tween.tween_property(tile, "position", target_position, 0.8)\ .set_trans(Tween.TRANS_CUBIC)\ .set_ease(Tween.EASE_OUT) if tile_light: tween.parallel().tween_property(tile_light, "light_energy", 1.5, 0.8)\ .set_trans(Tween.TRANS_CUBIC)\ .set_ease(Tween.EASE_OUT) func get_hex_neighbors(grid_pos: Vector2i) -> Array[Vector2i]: var neighbors: Array[Vector2i] = [] neighbors.append(grid_pos + Vector2i(0, -1)) # Neighbor Up neighbors.append(grid_pos + Vector2i(0, 1)) # Neighbor Down neighbors.append(grid_pos + Vector2i(-1, 0)) # Neighbor Left neighbors.append(grid_pos + Vector2i(1, 0)) # Neighbor Right if abs(grid_pos.x) % 2 == 1: neighbors.append(grid_pos + Vector2i(-1, 1)) # Neighbor Left-Down neighbors.append(grid_pos + Vector2i(1, 1)) # Neighbor Right-Down else: neighbors.append(grid_pos + Vector2i(-1, -1)) # Neighbor Left-Up neighbors.append(grid_pos + Vector2i(1, -1)) # Neighbor Right-Up return neighbors func _on_button_pressed() -> void: var open_neighbors = [] for current_pos in generated_tiles.keys(): var neighbors = get_hex_neighbors(current_pos) for n_pos in neighbors: if not generated_tiles.has(n_pos) and not open_neighbors.has(n_pos): open_neighbors.append(n_pos) if open_neighbors.size() > 0: var random_target_pos = open_neighbors[randi() % open_neighbors.size()] spawn_tile(random_target_pos) print("Generated new tile at: ", random_target_pos) else: print("World is full")