extends VBoxContainer const E = preload("res://world/owniverse/math/exact.gd") const Presentation = preload("res://world/owniverse/item_presentation.gd") const STARS = ["RD", "OD", "YD", "WYD", "WS", "BG", "SG", "HG"] const EFFECTS = {"Int.Fed": "Federation", "Int.Enl": "Enlightenment", "Int.Ord": "Order"} var report_locale: String = "" @onready var report_body: RichTextLabel = $ReportBody @onready var report_header: TextureRect = $Header/Header func _ready() -> void: visibility_changed.connect(_on_visibility_changed) func _process(_delta: float) -> void: if is_visible_in_tree() and report_locale != get_node("/root/Global").Locale: refresh() func _on_visibility_changed() -> void: if is_node_ready() and is_visible_in_tree(): refresh() report_body.scroll_to_line(0) func refresh() -> void: var global: Node = get_node("/root/Global") report_locale = global.Locale report_body.text = build(get_parent().owniverse, global) report_header.texture = load("res://ui/report/" + report_locale + "/report.png") ## Formats existing committed state only. No historical counters or simulation work. static func build(world, global: Node) -> String: var source: Dictionary = world.state var totals: Dictionary = Presentation.amounts(source, world.catalog, true) var physical: Dictionary = world.ledger.physical_amounts(source) var star_total: Variant = 0 for id in STARS: star_total = E.add(star_total, physical.get(id, 0)) var blocks: PackedStringArray = [] var lines: PackedStringArray = [] var header: String = "" # Russian keys provide the common order; get_template resolves both key formats. for key in global.Templates.ru: if not str(key).contains(".Report."): continue var parts: PackedStringArray = str(key).rsplit(".Report.", true, 1) var id: String = parts[0] var kind: String = parts[1] var row: Dictionary = global.get_template(id, "Report", kind) if kind == "Header": if not lines.is_empty(): blocks.append(header + "\n\n" + "\n".join(lines)) lines.clear() header = global.render_template(row, {}) elif kind == "Fraction": var amount: Variant = physical.get(id, 0) if E.gt(amount, 0) and E.gt(star_total, 0): var percent: String = E.grouped(E.mul_div(amount, 100, star_total), 2, false) + "%" lines.append(global.render_template(row, {"proportion": percent})) elif kind == "Max": var amount: Variant = totals.get(id, 0) if EFFECTS.has(id): amount = E.subtract(source.world_parameters.get(EFFECTS[id], 1), 1) if E.gt(amount, 0): lines.append(global.render_template(row, {"max": E.grouped(amount, 2 if EFFECTS.has(id) else 0, false)})) if not lines.is_empty(): blocks.append(header + "\n\n" + "\n".join(lines)) return "\n\n".join(blocks)