extends Control ## Offers a set of random modifiers each round as draggable pieces. ## Dropping one on the board applies it and consumes the whole set. const SectorSwatch := preload("res://core/ui/sector_swatch.gd") @export var drop_catcher: Control @export var pieces_per_round := 3 @export var piece_size := Vector2(90, 110) @export var spacing := 24.0 @export var bottom_margin := 30.0 var _pieces: Array[Control] = [] func _ready() -> void: mouse_filter = Control.MOUSE_FILTER_IGNORE spawn_round() func spawn_round() -> void: _clear_pieces() # ModRegistry is the autoload. (Was "ModifierCatalog" — renamed.) var choices: Array = ModRegistry.pick_random(pieces_per_round) if choices.is_empty(): push_warning("ModifierTray: registry returned no modifiers.") return for mod in choices: var piece := Control.new() piece.set_script(SectorSwatch) piece.custom_minimum_size = piece_size piece.size = piece_size piece.modifier = mod piece.paint_texture = mod.texture piece.drop_catcher = drop_catcher piece.tray = self add_child(piece) _pieces.append(piece) _layout_pieces() func _layout_pieces() -> void: var count := _pieces.size() if count == 0: return var total_w := count * piece_size.x + (count - 1) * spacing var screen := get_viewport_rect().size var start_x := (screen.x - total_w) * 0.5 var y := screen.y - piece_size.y - bottom_margin for i in count: _pieces[i].position = Vector2(start_x + i * (piece_size.x + spacing), y) ## Called by a piece when it lands successfully — the whole set is spent. func consume() -> void: _clear_pieces() func _clear_pieces() -> void: for p in _pieces: if is_instance_valid(p): p.queue_free() _pieces.clear() # TESTING ONLY — SPACE rolls a new set. func _unhandled_input(event: InputEvent) -> void: if event is InputEventKey and event.pressed and event.keycode == KEY_SPACE: spawn_round()