2026-09-28 22:19:13 +03:00
|
|
|
extends RefCounted
|
2026-09-30 08:08:27 +03:00
|
|
|
const E = preload("res://world/owniverse/math/exact.gd")
|
2026-09-28 22:19:13 +03:00
|
|
|
|
|
|
|
|
const Parameters = preload("res://world/owniverse/world_parameters.gd")
|
|
|
|
|
var energy_bars: Array = []
|
|
|
|
|
var density_indicators: Array = []
|
|
|
|
|
var pointers: Dictionary = {}
|
|
|
|
|
var trend_bars: Array = []
|
2026-09-28 22:32:52 +03:00
|
|
|
var warning_border: TextureRect
|
2026-09-28 22:19:13 +03:00
|
|
|
|
|
|
|
|
func _init(stage: Node) -> void:
|
2026-09-28 22:32:52 +03:00
|
|
|
warning_border = stage.get_node("../Background/WarningBorder")
|
2026-09-28 22:19:13 +03:00
|
|
|
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
|
2026-09-30 08:08:27 +03:00
|
|
|
var energy: float = E.approx(E.clamp_value(E.divide(source.energy, Parameters.INITIAL_ENERGY), 0, 1))
|
2026-09-28 22:19:13 +03:00
|
|
|
for bar in energy_bars: bar.scale.x = energy
|
2026-09-30 08:08:27 +03:00
|
|
|
var density_value = world.environment.stellar_environment(source).density
|
2026-09-28 22:32:52 +03:00
|
|
|
var density: Dictionary = Parameters.density_display(density_value)
|
|
|
|
|
warning_border.self_modulate = Parameters.density_warning_color(density_value)
|
2026-09-28 22:19:13 +03:00
|
|
|
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")
|
2026-09-30 08:08:27 +03:00
|
|
|
pointer.position.x = 16.0 + 288.0 * E.approx(density.position) - pointer.size.x / 2.0
|
2026-09-28 22:19:13 +03:00
|
|
|
pointer.self_modulate = Color.BLACK if density.mode == "DensityCrunch" else Color.WHITE
|
|
|
|
|
for key in pointers:
|
|
|
|
|
var pointer: Control = pointers[key]
|
2026-09-30 08:08:27 +03:00
|
|
|
pointer.position.x = 16.0 * E.approx(E.clamp_value(Parameters.value(source, key), 1, 19)) - pointer.size.x / 2.0
|
2026-09-28 22:19:13 +03:00
|
|
|
for i in trend_bars.size():
|
|
|
|
|
var bar: Control = trend_bars[i]
|
|
|
|
|
bar.pivot_offset = Vector2(0.0, bar.size.y)
|
2026-09-30 08:08:27 +03:00
|
|
|
bar.scale.y = E.approx(E.clamp_value(source.get("trends", {}).get(Parameters.TRENDS[i], 0), 0, 1))
|