extends Node2D # Same informal interface as GasGiantVisual/RockyPlanetVisual - configure(), # extractor_anchor(), animates via its own _process(). Deliberately angular # and armoured rather than a natural silhouette (#63: this is an ENEMY # installation, not a celestial body), with a rotating dish and blinking # warning lights to read as occupied/hostile at a glance. var phase: float = 0.0 const RADIUS: float = 108.0 const HULL_COLOR: Color = Color(0.55, 0.1, 0.08) const CORE_COLOR: Color = Color(0.9, 0.25, 0.18) const WARNING_COLOR: Color = Color(1.0, 0.2, 0.15) const DARK_CORE: Color = Color(0.14, 0.02, 0.02) func configure(_shape_seed: int) -> void: queue_redraw() func extractor_anchor() -> Vector2: return Vector2(0.0, -(RADIUS + 40.0)) func _process(delta: float) -> void: phase += delta queue_redraw() func _draw() -> void: var hull: PackedVector2Array = PackedVector2Array() for i in range(6): var angle: float = TAU * float(i) / 6.0 hull.append(Vector2(cos(angle), sin(angle)) * RADIUS) NeonDraw.draw_glowing_polygon(self, hull, HULL_COLOR, 0.85, DARK_CORE) var inner: PackedVector2Array = PackedVector2Array() for i in range(6): var angle: float = TAU * float(i) / 6.0 + PI / 6.0 inner.append(Vector2(cos(angle), sin(angle)) * RADIUS * 0.55) NeonDraw.draw_glowing_polygon(self, inner, CORE_COLOR, 0.9, DARK_CORE) # A slow-rotating dish - reads as actively transmitting, not derelict. var dish_angle: float = phase * 0.6 var dish_tip: Vector2 = Vector2(cos(dish_angle), sin(dish_angle)) * RADIUS * 1.35 NeonDraw.draw_glowing_line(self, Vector2.ZERO, dish_tip, CORE_COLOR, 0.8, 0.55, DARK_CORE) NeonDraw.draw_glowing_circle(self, dish_tip, 11.0, CORE_COLOR, 1.0, DARK_CORE) # Blinking hull-corner warning lights. var blink: float = 0.4 + 0.6 * absf(sin(phase * 4.0)) for i in range(6): var angle: float = TAU * float(i) / 6.0 var at: Vector2 = Vector2(cos(angle), sin(angle)) * RADIUS NeonDraw.draw_glowing_circle(self, at, 5.0, WARNING_COLOR, blink, DARK_CORE)