extends RefCounted const E = preload("res://world/owniverse/math/exact.gd") const Parameters = preload("res://world/owniverse/world_parameters.gd") var energy_bars: Array = [] var density_indicators: Array = [] var pointers: Dictionary = {} var trend_bars: Array = [] var warning_border: TextureRect func _init(stage: Node) -> void: warning_border = stage.get_node("../Background/WarningBorder") var pages: Node = stage.get_node("World/PageScroller/HBoxContainer") for path in ["ResourcePage/ResourceHeader", "StructurePage/StructureHeader"]: energy_bars.append(pages.get_node(path + "/EnergyIndicator/Indicator")) density_indicators.append(pages.get_node(path + "/DensityIndicator")) pointers.Bur = pages.get_node("StarPage/StarHeader/BurnabilityIndicator/BurnabilityPointer") pointers.Exp = pages.get_node("StarPage/StarHeader/ExplosivenessIndicator/ExplosivenessPointer") pointers.Agg = pages.get_node("LifePage/LifeHeader/AggressionIndicator/AggressionPointer") var trends: Node = pages.get_node("LifePage/LifeHeader/TrendIndicator/HBoxContainer") for i in 5: var container: String = "CenterContainer" + (str(i + 1) if i > 0 else "") trend_bars.append(trends.get_node(container + "/Trend" + str(i + 1))) # Decorative children must not swallow clicks intended for indicator buttons. for header_path in ["ResourcePage/ResourceHeader", "StructurePage/StructureHeader", "StarPage/StarHeader", "LifePage/LifeHeader"]: for child in pages.get_node(header_path).get_children(): if child is TextureButton: _ignore_mouse_on_children(child) func _ignore_mouse_on_children(node: Node) -> void: for child in node.get_children(): if child is Control: child.mouse_filter = Control.MOUSE_FILTER_IGNORE _ignore_mouse_on_children(child) func update(world) -> void: var source: Dictionary = world.state var energy: float = E.approx(E.clamp_value(E.divide(source.energy, Parameters.INITIAL_ENERGY), 0, 1)) for bar in energy_bars: bar.scale.x = energy var density_value = world.environment.stellar_environment(source).density var density: Dictionary = Parameters.density_display(density_value) warning_border.self_modulate = Parameters.density_warning_color(density_value) for indicator in density_indicators: for mode in ["Density", "DensityRip", "DensityCrunch"]: indicator.get_node(mode).visible = mode == density.mode var pointer: Control = indicator.get_node("Pointer") pointer.position.x = 16.0 + 288.0 * E.approx(density.position) - pointer.size.x / 2.0 pointer.self_modulate = Color.BLACK if density.mode == "DensityCrunch" else Color.WHITE for key in pointers: var pointer: Control = pointers[key] pointer.position.x = 16.0 * E.approx(E.clamp_value(Parameters.value(source, key), 1, 19)) - pointer.size.x / 2.0 for i in trend_bars.size(): var bar: Control = trend_bars[i] bar.pivot_offset = Vector2(0.0, bar.size.y) bar.scale.y = E.approx(E.clamp_value(source.get("trends", {}).get(Parameters.TRENDS[i], 0), 0, 1))