Add core simulation modules for owniverse mechanics

- Introduced `life_evolution.gd` to manage life evolution processes.
- Implemented `manual_production.gd` for handling production mechanics, including resource management and production steps.
- Created `object_batches.gd` to manage batches of objects, including scaling and appending batches.
- Developed `object_ledger.gd` for tracking physical amounts, available resources, and binding ownerships.
- Added `simulation_module.gd` as a base class for simulation modules, providing a weak reference to the world.
- Established `stellar_rules.gd` for managing stellar evolution and destruction mechanics.
- Introduced `universe_environment.gd` to calculate environmental parameters based on the current state of the universe.
This commit is contained in:
Kirill
2026-09-29 20:23:20 +03:00
parent da03ba11c0
commit f2111a376a
42 changed files with 1681 additions and 1704 deletions
+26 -24
View File
@@ -1,4 +1,6 @@
extends SceneTree
const CivilizationState = preload("res://world/owniverse/civilization_state.gd")
const CivilizationEvolution = preload("res://world/owniverse/civilization_evolution.gd")
const Parameters = preload("res://world/owniverse/world_parameters.gd")
const Descriptions = preload("res://world/owniverse/item_description.gd")
@@ -18,7 +20,7 @@ func fixture():
var world = load("res://world/owniverse/owniverse.gd").new()
for id in root.get_node("Global").OwniverseEntities:
var entity = load("res://world/owniverse/owniverse_entity.gd").new(root.get_node("Global").OwniverseEntities[id])
world.entities[id] = entity
world.catalog.entities[id] = entity
world.state.amount[id] = 0.0
world.state.stats.total_amount[id] = 0.0
if entity.group_as != "":
@@ -27,49 +29,49 @@ func fixture():
return world
func dispose(world) -> void:
for entity in world.entities.values(): entity.free()
for entity in world.catalog.entities.values(): entity.free()
world.free()
func run() -> void:
var global: Node = root.get_node("Global")
var world = fixture()
world.state.amount.RD = 400.0
world._append_batch(world.state, "RD", 400.0, 0.0, 0.0)
world.batches.append_batch(world.state, "RD", 400.0, 0.0, 0.0)
var end: float = world.state.batches.RD[0].end_year
world.modify_world_parameter("Bur", 9.0)
world.environment.modify_world_parameter("Bur", 9.0)
check(is_equal_approx(world.state.batches.RD[0].end_year, end / 10.0), "Burnability accelerates existing cohorts")
var count: float = world.state.batches.RD[0].amount
world.modify_world_parameter("Bur", -9.0)
world.environment.modify_world_parameter("Bur", -9.0)
check(is_equal_approx(world.state.batches.RD[0].end_year, end) and world.state.batches.RD[0].amount == count, "Changing burnability back preserves population and lifetime")
world.modify_world_parameter("Bur", 9.0)
world._append_batch(world.state, "YD", 10.0, 0.0, 0.0)
check(is_equal_approx(world.state.batches.YD[0].start_year, world.entities.YD.lifespan / 10.0), "New stars use the same burnability")
world.environment.modify_world_parameter("Bur", 9.0)
world.batches.append_batch(world.state, "YD", 10.0, 0.0, 0.0)
check(is_equal_approx(world.state.batches.YD[0].start_year, world.catalog.entities.YD.lifespan / 10.0), "New stars use the same burnability")
world.state.time = {"datetime": end / 10.0 - 0.1, "year": end / 10.0 - 0.1}
world._withdraw_batches(world.state, "RD", world.state.time.year)
world.modify_world_parameter("Bur", -18.0)
world.batches.withdraw_batches(world.state, "RD", world.state.time.year)
world.environment.modify_world_parameter("Bur", -18.0)
check(world.state.batches.RD[0].end_year >= world.state.time.year, "Slowing a partially evolved cohort keeps its remaining window in the future")
world.modify_world_parameter("Exp", 9.0)
check(world._evolution_products(world.state, world.entities.SN, 2.0).blast == 180.0, "Explosion power includes world explosiveness")
var products: Dictionary = world._evolution_products(world.state, world.entities.HRG, 1000.0)
world.environment.modify_world_parameter("Exp", 9.0)
check(world.stellar.evolution_products(world.state, world.catalog.entities.SN, 2.0).blast == 180.0, "Explosion power includes world explosiveness")
var products: Dictionary = world.stellar.evolution_products(world.state, world.catalog.entities.HRG, 1000.0)
check(products.get("GRB", 0.0) == 100.0 and products.get("SN", 0.0) == 900.0, "Explosiveness raises rare-event probability without duplicating stars")
world.entities.HRG.output_or.chance = 50.0
products = world._evolution_products(world.state, world.entities.HRG, 100.0)
world.catalog.entities.HRG.output_or.chance = 50.0
products = world.stellar.evolution_products(world.state, world.catalog.entities.HRG, 100.0)
check(products.get("GRB", 0.0) == 100.0 and products.get("SN", 0.0) == 0.0, "Rare-event probability is bounded at one")
dispose(world)
world = fixture()
var ordinary: Dictionary = world._life_products(world.state, world.entities.HP, 1000000.0)
var ordinary: Dictionary = world.life.life_products(world.state, world.catalog.entities.HP, 1000000.0)
world.state.life_remainders.clear()
world.modify_world_parameter("Agg", 9.0)
var aggressive: Dictionary = world._life_products(world.state, world.entities.HP, 1000000.0)
world.environment.modify_world_parameter("Agg", 9.0)
var aggressive: Dictionary = world.life.life_products(world.state, world.catalog.entities.HP, 1000000.0)
check(aggressive.EON1 > ordinary.EON1, "Aggression accelerates primitive evolution")
world.state.life_remainders.clear()
world.state.world_parameters.Order = 10.0
var orderly: Dictionary = world._life_products(world.state, world.entities.HP, 1000000.0)
var orderly: Dictionary = world.life.life_products(world.state, world.catalog.entities.HP, 1000000.0)
check(orderly.RP < aggressive.RP, "Order reduces degradation")
world.state.life_remainders.clear()
world.state.world_parameters.Enlightenment = 10.0
var enlightened: Dictionary = world._life_products(world.state, world.entities.HP, 1000000.0)
var enlightened: Dictionary = world.life.life_products(world.state, world.catalog.entities.HP, 1000000.0)
check(enlightened.EON1 > orderly.EON1, "Enlightenment increases primitive progress")
dispose(world)
@@ -77,8 +79,8 @@ func run() -> void:
var hotter = fixture()
for simulation in [world, hotter]:
simulation.state.amount.RD = 1000000.0
simulation._append_batch(simulation.state, "RD", 1000000.0, 0.0, 0.0)
hotter.modify_world_parameter("Bur", 9.0)
simulation.batches.append_batch(simulation.state, "RD", 1000000.0, 0.0, 0.0)
hotter.environment.modify_world_parameter("Bur", 9.0)
world.evolute(1000.0)
hotter.evolute(1000.0)
check(hotter.state.amount.S > world.state.amount.S, "Burnability changes actual space production")
@@ -96,8 +98,8 @@ func run() -> void:
var outcomes: Array = []
for target in [baseline, advanced]:
var expired: Dictionary = {"C0.2": [{"amount": 1000000.0, "from": 0.0, "to": 1.0}]}
var budget: Dictionary = world.CivilizationState.stellar_budget(world, target, global.CivilizationRules)
world.CivilizationEvolution.prepare(world, target, expired, 1.0, budget, global.CivilizationRules)
var budget: Dictionary = CivilizationState.stellar_budget(world, target, global.CivilizationRules)
CivilizationEvolution.prepare(world, target, expired, 1.0, budget, global.CivilizationRules)
outcomes.append(expired["C0.2"][0].products.get(next_stage, 0.0))
check(outcomes[1] > outcomes[0], "Aggression changes actual ethical civilization transitions")
dispose(world)