Add item description and testing framework for Owniverse

- Introduced `item_description.gd` to handle item descriptions with localization support.
- Implemented a testing script `test_descriptions.gd` to validate item description rendering and localization.
- Added a new template file for Russian localization.
- Included a large package file `owniverse.0.6.29-145.pck` for game assets.
- Ensured proper memory management in tests with fixture and dispose functions.
This commit is contained in:
Kirill
2026-09-15 22:01:45 +03:00
parent 5f5cc6f894
commit cc2700d507
14 changed files with 1470 additions and 48 deletions
+87
View File
@@ -0,0 +1,87 @@
extends RefCounted
const GREEN = "#40cc40"
const RED = "#ff6060"
const GREY = "#888888"
static func number(value: float, digits: int = 0) -> String:
if not is_finite(value):
return "—"
if absf(value) >= 1e5:
var exponent: int = int(floor(log(absf(value)) / log(10.0)))
return "%.4fE%+d" % [value / pow(10.0, exponent), exponent]
return "%.*f" % [digits, value]
static func colored(text: String, color: String) -> String:
return "[color=" + color + "]" + text + "[/color]"
static func matches(world, id: String) -> Array:
var result: Array = []
for key in world.entities:
var entity = world.entities[key]
if key == id or entity.count_as == id or entity.group_as == id:
if not world._is_group(key):
result.append(key)
return result
static func quantities(world, id: String) -> Dictionary:
var free: float = 0.0
var total: float = 0.0
var physical: Dictionary = world._physical_amounts(world.state)
for key in matches(world, id):
free += world.state.amount.get(key, 0.0)
total += physical.get(key, 0.0)
if id == "SMBH":
free = world.state.amount.get(id, 0.0)
total = free
return {"free": free, "total": total}
static func costs(world, global: Node, id: String) -> String:
if not world.entities.has(id):
return ""
var lines: PackedStringArray = []
for requirements in [world.entities[id].cost, world.entities[id].bind]:
for resource in requirements:
var required: float = requirements[resource]
if required < 0.0:
continue
var available: float = floorf(world._available(world.state, resource))
var name: String = str(global.get_template(resource, "Entity", "Name").get("text", resource))
lines.append(colored(name + ": " + number(required) + " (" + number(available) + ")", GREEN if available >= required else RED))
return "\n".join(lines)
static func variables(world, global: Node, id: String, rate: float = 0.0) -> Dictionary:
var counts: Dictionary = quantities(world, id)
var show_total: bool = false
for key in matches(world, id):
show_total = show_total or world.entities[key].group_as == "Planet"
var amount: String = number(counts.total if show_total else counts.free) if world.entities.has(id) else "—"
if not show_total and counts.total > counts.free:
amount += " " + colored("(" + number(counts.total) + ")", GREY)
if rate != 0.0:
amount += " | " + colored(("−" if rate < 0.0 else "+") + number(absf(rate), 1), RED if rate < 0.0 else GREEN)
var physical: Dictionary = world._physical_amounts(world.state)
var voids: float = 0.0
for key in physical:
voids += physical[key] * world.entities[key].voids
var he: float = world.state.amount.get("He", 0.0)
var h: float = world.state.amount.get("H", 0.0)
var mixture: String = "—"
if he + h > 0.0:
mixture = "He: " + number(100.0 * he / (he + h), 2) + "% / H: " + number(100.0 * h / (he + h), 2) + "%"
var environment: Dictionary = world.stellar_environment(world.state)
return {
"amount": amount, "colored costs": costs(world, global, id),
"lifespan": number(world.entities[id].lifespan) if world.entities.has(id) else "—",
"voids": number(voids), "he / h": "\n" + mixture,
"metallicity": number(environment.metallicity * 100.0, 2) + "%",
"энергия": number(world.state.energy), "плотность": number(environment.density, 6),
"лет в секунду": number(world.state.speed_in_year),
"amount1": "—", "amount2": "—", "amount3": "—", "amount4": "—",
}
static func render(world, global: Node, id: String, category: String = "Entity", rate: float = 0.0) -> String:
var values: Dictionary = variables(world, global, id, rate)
var title: String = global.render_template(global.get_template(id, category, "Name"), values)
var body: String = global.render_template(global.get_template(id, category, "Description"), values)
return "[b]" + (title if title != "" else id) + "[/b]\n" + body
+1
View File
@@ -0,0 +1 @@
uid://dumnryq20c2ij
+25 -25
View File
@@ -227,11 +227,11 @@ theme_override_fonts/normal_font = ExtResource("14_o7xkw")
theme_override_fonts/bold_font = ExtResource("7_gwdna")
theme_override_fonts/bold_italics_font = ExtResource("15_bfrib")
theme_override_fonts/italics_font = ExtResource("16_mip0j")
theme_override_font_sizes/normal_font_size = 42
theme_override_font_sizes/bold_font_size = 54
theme_override_font_sizes/bold_italics_font_size = 42
theme_override_font_sizes/italics_font_size = 42
theme_override_font_sizes/mono_font_size = 42
theme_override_font_sizes/normal_font_size = 34
theme_override_font_sizes/bold_font_size = 34
theme_override_font_sizes/bold_italics_font_size = 34
theme_override_font_sizes/italics_font_size = 34
theme_override_font_sizes/mono_font_size = 34
bbcode_enabled = true
horizontal_alignment = 1
@@ -370,11 +370,11 @@ theme_override_fonts/normal_font = ExtResource("14_o7xkw")
theme_override_fonts/bold_font = ExtResource("7_gwdna")
theme_override_fonts/bold_italics_font = ExtResource("15_bfrib")
theme_override_fonts/italics_font = ExtResource("16_mip0j")
theme_override_font_sizes/normal_font_size = 42
theme_override_font_sizes/bold_font_size = 54
theme_override_font_sizes/bold_italics_font_size = 42
theme_override_font_sizes/italics_font_size = 42
theme_override_font_sizes/mono_font_size = 42
theme_override_font_sizes/normal_font_size = 34
theme_override_font_sizes/bold_font_size = 34
theme_override_font_sizes/bold_italics_font_size = 34
theme_override_font_sizes/italics_font_size = 34
theme_override_font_sizes/mono_font_size = 34
bbcode_enabled = true
horizontal_alignment = 1
@@ -498,11 +498,11 @@ theme_override_fonts/normal_font = ExtResource("14_o7xkw")
theme_override_fonts/bold_font = ExtResource("7_gwdna")
theme_override_fonts/bold_italics_font = ExtResource("15_bfrib")
theme_override_fonts/italics_font = ExtResource("16_mip0j")
theme_override_font_sizes/normal_font_size = 42
theme_override_font_sizes/bold_font_size = 54
theme_override_font_sizes/bold_italics_font_size = 42
theme_override_font_sizes/italics_font_size = 42
theme_override_font_sizes/mono_font_size = 42
theme_override_font_sizes/normal_font_size = 34
theme_override_font_sizes/bold_font_size = 34
theme_override_font_sizes/bold_italics_font_size = 34
theme_override_font_sizes/italics_font_size = 34
theme_override_font_sizes/mono_font_size = 34
bbcode_enabled = true
text = "Stars"
horizontal_alignment = 1
@@ -639,11 +639,11 @@ theme_override_fonts/normal_font = ExtResource("14_o7xkw")
theme_override_fonts/bold_font = ExtResource("7_gwdna")
theme_override_fonts/bold_italics_font = ExtResource("15_bfrib")
theme_override_fonts/italics_font = ExtResource("16_mip0j")
theme_override_font_sizes/normal_font_size = 42
theme_override_font_sizes/bold_font_size = 54
theme_override_font_sizes/bold_italics_font_size = 42
theme_override_font_sizes/italics_font_size = 42
theme_override_font_sizes/mono_font_size = 42
theme_override_font_sizes/normal_font_size = 34
theme_override_font_sizes/bold_font_size = 34
theme_override_font_sizes/bold_italics_font_size = 34
theme_override_font_sizes/italics_font_size = 34
theme_override_font_sizes/mono_font_size = 34
bbcode_enabled = true
text = "Structures"
horizontal_alignment = 1
@@ -787,11 +787,11 @@ theme_override_fonts/normal_font = ExtResource("14_o7xkw")
theme_override_fonts/bold_font = ExtResource("7_gwdna")
theme_override_fonts/bold_italics_font = ExtResource("15_bfrib")
theme_override_fonts/italics_font = ExtResource("16_mip0j")
theme_override_font_sizes/normal_font_size = 42
theme_override_font_sizes/bold_font_size = 54
theme_override_font_sizes/bold_italics_font_size = 42
theme_override_font_sizes/italics_font_size = 42
theme_override_font_sizes/mono_font_size = 42
theme_override_font_sizes/normal_font_size = 34
theme_override_font_sizes/bold_font_size = 34
theme_override_font_sizes/bold_italics_font_size = 34
theme_override_font_sizes/italics_font_size = 34
theme_override_font_sizes/mono_font_size = 34
bbcode_enabled = true
text = "Planets"
horizontal_alignment = 1