class_name PaletteEntryButton extends Control # One selectable tile in the setup editor's palette: either the generic # capture-point marker, or one enemy definition's own hull/colour. Drawn # directly from the definition rather than a fixed icon set, so a new # EnemyDefinitions entry shows up automatically with no editor code change. signal pressed @export var is_capture_point: bool = false const ENEMY_DEFINITIONS = preload("res://enemies/EnemyDefinitions.gd") @export var enemy_definition: Resource @export var selected: bool = false: set = set_selected const RING_COLOR: Color = Color(0.55, 0.85, 1.0) func set_selected(value: bool) -> void: selected = value queue_redraw() func _ready() -> void: queue_redraw() func _gui_input(event: InputEvent) -> void: if event is InputEventScreenTouch and not event.pressed \ and Rect2(Vector2.ZERO, size).has_point(event.position): pressed.emit() elif event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT and not event.pressed: pressed.emit() func _draw() -> void: var center: Vector2 = size / 2.0 var margin: float = 4.0 var frame: PackedVector2Array = PackedVector2Array([ Vector2(margin, margin), Vector2(size.x - margin, margin), Vector2(size.x - margin, size.y - margin), Vector2(margin, size.y - margin), ]) var frame_color: Color = Color(1.0, 0.95, 0.9) if selected else Color(0.4, 0.45, 0.5) NeonDraw.draw_glowing_polygon(self, frame, frame_color, 0.85 if selected else 0.5) if is_capture_point: var points: PackedVector2Array = PackedVector2Array() for i in range(16): var angle: float = float(i) / 16.0 * TAU points.append(center + Vector2(cos(angle), sin(angle)) * (size.x * 0.28)) NeonDraw.draw_glowing_polygon(self, points, RING_COLOR, 0.8) elif enemy_definition != null: # Same routine as the marker and the enemy, so the button previews # what will actually be placed. var scale_factor: float = (size.x * 0.5) / 28.0 * 0.6 ENEMY_DEFINITIONS.draw_definition(self, enemy_definition, enemy_definition.glow_color, scale_factor, center)