6ee66a627d
- Enhanced the `civilization_evolution.gd` script to improve population handling and resource allocation during civilization transitions. - Introduced new functions in `civilization_state.gd` for profile normalization and merging, ensuring consistent population representation across stages. - Updated `evolution_coordinator.gd` to incorporate budget phases for better tracking of simulation performance. - Improved `frame_budget.gd` to monitor maximum slice durations and phases during processing. - Added a new benchmarking tool in `android_benchmark.gd` to measure performance metrics during simulation runs, including frame processing times and throughput. - Created associated scene and resource files for the benchmarking tool to facilitate testing and performance evaluation.
141 lines
7.6 KiB
GDScript
141 lines
7.6 KiB
GDScript
extends SceneTree
|
|
const E = preload("res://world/owniverse/math/exact.gd")
|
|
const Clock = preload("res://world/owniverse/simulation_time.gd")
|
|
var checks: int = 0
|
|
var failures: int = 0
|
|
|
|
func _initialize() -> void:
|
|
call_deferred("run")
|
|
|
|
func check(condition: bool, message: String) -> void:
|
|
checks = E.add(checks, 1)
|
|
if (not condition):
|
|
failures = E.add(failures, 1)
|
|
push_error(message)
|
|
|
|
func fixture():
|
|
var world = load("res://world/owniverse/owniverse.gd").new()
|
|
var global: Node = root.get_node("Global")
|
|
for id in global.OwniverseEntities:
|
|
var entity = load("res://world/owniverse/owniverse_entity.gd").new(global.OwniverseEntities[id])
|
|
world.catalog.entities[id] = entity
|
|
world.state.amount[id] = 0
|
|
world.state.stats.total_amount[id] = 0
|
|
if E.ne(entity.group_as, ""):
|
|
world.state.amount[entity.group_as] = 0
|
|
world.state.stats.total_amount[entity.group_as] = 0
|
|
world.catalog.entities["N"].life_product = {}
|
|
world.catalog.entities["N"].product_per_year_type = "H"
|
|
world.catalog.entities["N"].product_per_year_amount = 10
|
|
world.catalog.entities["N"].auto = 0
|
|
world.state.amount.N = 1
|
|
return world
|
|
|
|
func dispose(world) -> void:
|
|
for entity in world.catalog.entities.values():
|
|
entity.free()
|
|
world.free()
|
|
|
|
func run() -> void:
|
|
var world = fixture()
|
|
var global: Node = root.get_node("Global")
|
|
check(E.eq(global.CivilizationRules.size(), 44), "Load all ethical civilization stages")
|
|
for row : Dictionary in global.CivilizationRules.values():
|
|
check((E.eq(row.ethics.size(), 6) or E.eq(row.span, 0)), "Every ethical stage has six rules")
|
|
world.state.amount.RD = 12
|
|
world.state.amount["C0.2"] = 8
|
|
world.state.binds.RD = {"C2.0": 12, "C1.9": 3}
|
|
world.evolution.initialize_life_batches()
|
|
check((E.eq(world.state.amount["C2.0"], 12) and E.eq(world.state.binds.RD["C2.0"], 0)), "Old space civilizations detach without loss")
|
|
check(E.eq(world.state.binds.RD["C1.9"], 3), "Planetary civilizations retain their host")
|
|
check(world.state.ethics["C0.2"].values().all(func ( n ) : return E.near(n, 1.0 / 6.0)), "Migration initializes equal ethic shares")
|
|
check(world.state.ethics["C2.0"].values().all(func ( n ) : return E.near(n, 1.0 / 6.0)), "Bound civilization ethics are population-independent shares")
|
|
var before: Dictionary = world.state.duplicate(true)
|
|
world.evolution.initialize_life_batches()
|
|
var profiles_stable: bool = true
|
|
for ethic_id in before.ethics:
|
|
for ethic in before.ethics[ethic_id]:
|
|
profiles_stable = profiles_stable and E.near(world.state.ethics[ethic_id][ethic], before.ethics[ethic_id][ethic])
|
|
check(profiles_stable, "Repeated initialization preserves ethics")
|
|
world.state.ethics["C0.2"] = {"m": 8, "l": 0, "w": 0, "d": 0, "c": 0, "b": 0}
|
|
world.evolution.initialize_life_batches()
|
|
check(E.eq(world.state.ethics["C0.2"].m, 1.0), "Existing unequal distribution is retained")
|
|
world.state.amount["C0.2"] = 3
|
|
world.evolution.initialize_life_batches()
|
|
check(E.eq(world.state.ethics["C0.2"].m, 1.0), "Losses retain normalized ethical composition")
|
|
check(E.eq(world.ledger.physical_amounts(world.state)["C0.2"], 3), "Exact population remains in the object ledger")
|
|
check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Ethics state validates")
|
|
var restored = fixture()
|
|
restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state))))
|
|
restored.evolution.initialize_life_batches()
|
|
check(E.eq(restored.state, world.state), "Save roundtrip preserves ethics and ownership")
|
|
dispose(restored)
|
|
dispose(world)
|
|
world = fixture()
|
|
world.state.amount.RD = 10
|
|
for row : Dictionary in global.CivilizationRules["C1.9"].ethics.values():
|
|
row.progress = "1"
|
|
row.degradation = "0"
|
|
row.colonization = "0"
|
|
world.state.binds.RD = {"C1.9": 10}
|
|
world.state.batches["C1.9"] = [{"amount": 10, "start_year": 1, "end_year": 1}]
|
|
world.evolution.evolve_batches(world.state, 1)
|
|
check((E.eq(world.state.amount["C2.0"], 10) and E.eq(world.state.binds.RD.get("C2.0", 0), 0)), "Space successor does not inherit planetary binding")
|
|
dispose(world)
|
|
var capacity = load("res://world/owniverse/civilization_state.gd")
|
|
world = fixture()
|
|
world.state.amount.RD = 10
|
|
world.state.amount["C2.0"] = 8
|
|
var budget: Dictionary = capacity.stellar_budget(world, world.state, global.CivilizationRules)
|
|
check(E.eq(capacity.admit_transition(budget, global.CivilizationRules, "C1.9", "C2.0", 5), 2), "Growth consumes only remaining stellar capacity")
|
|
check(E.eq(capacity.admit_transition(budget, global.CivilizationRules, "C1.9", "C2.0", 5), 0), "A reservation cannot be spent twice")
|
|
world.state.amount["C2.0"] = 1
|
|
budget = capacity.stellar_budget(world, world.state, global.CivilizationRules)
|
|
check(E.eq(capacity.admit_transition(budget, global.CivilizationRules, "C2.0", "C2.1", 1), 1), "A transition reuses the source reservation")
|
|
check(E.eq(budget.free.DwStar, 0), "C2.1 reserves ten dwarf stars")
|
|
world.state.amount["C2.0"] = 0
|
|
world.state.binds.SC = {"RD": 10}
|
|
budget = capacity.stellar_budget(world, world.state, global.CivilizationRules)
|
|
check(E.eq(budget.capacity.DwStar, 20), "Stars inside structures are counted once")
|
|
dispose(world)
|
|
|
|
world = fixture()
|
|
world.state.amount.RD = 12
|
|
world.state.amount["C2.1"] = 2
|
|
world.state.amount["C2.0"] = 5
|
|
world.evolution.initialize_life_batches()
|
|
check((E.eq(world.state.amount["C2.1"], 1) and E.eq(world.state.amount["C2.0"], 2)), "Shared budget supports advanced civilizations first")
|
|
check(E.eq(world.state.binds.RD["C1.9"], 4), "Excess cascades to supported planetary stage")
|
|
var snapshot: Dictionary = world.state.duplicate(true)
|
|
world.evolution.initialize_life_batches()
|
|
check(E.eq(world.state, snapshot), "Capacity enforcement is idempotent")
|
|
world.state.amount.RD = 0
|
|
world.evolution.initialize_life_batches()
|
|
check((E.eq(world.state.amount["C2.1"], 0) and E.eq(world.state.amount["C2.0"], 0)), "Vanished stars force all unsupported space civilizations down")
|
|
check(E.eq(world.ledger.physical_amounts(world.state)["C1.9"], 7), "Forced degradation conserves civilizations")
|
|
dispose(world)
|
|
|
|
world = fixture()
|
|
world.state.amount.LGW = 20
|
|
world.state.amount.SMBH = E.of("2.0e22")
|
|
world.state.amount["C4.2"] = 3
|
|
world.evolution.initialize_life_batches()
|
|
check(E.eq(world.state.amount["C4.2"], 2), "SMBH capacity uses stellar mass equivalent")
|
|
check(E.eq(world.ledger.physical_amounts(world.state)["C1.9"], 1), "Unsupported civilization degrades through missing habitat families")
|
|
check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Capacity-limited state validates")
|
|
dispose(world)
|
|
|
|
world = fixture()
|
|
world.state.amount.RD = 2
|
|
for row : Dictionary in global.CivilizationRules["C1.9"].ethics.values():
|
|
row.progress = "1"
|
|
row.degradation = "0"
|
|
row.colonization = "0"
|
|
world.state.binds.RD = {"C1.9": 5}
|
|
world.state.batches["C1.9"] = [{"amount": 5, "start_year": 1, "end_year": 1}]
|
|
world.evolution.evolve_batches(world.state, 1)
|
|
check((E.eq(world.state.amount["C2.0"], 2) and E.eq(world.state.binds.RD["C1.9"], 3)), "Unfunded transition retains the original planetary civilization")
|
|
dispose(world)
|
|
print(("Civilization state: %d checks, %d failures" % [checks, failures]))
|
|
quit((0 if E.eq(failures, 0) else 1))
|