17 Commits

Author SHA1 Message Date
Kirill e41d652631 Add achievement item UI and logic for displaying achievements 2026-10-18 20:03:27 +03:00
Kirill fe68e788b3 Add achievement loader script with unique identifier 2026-10-18 18:57:42 +03:00
Kirill 3047ef5a85 Implement apocalypse mechanics: add apocalypse queue, controller, and integrate into production logic 2026-10-18 00:05:53 +03:00
Kirill f53181b9ad Refactor production logic to incorporate helium share calculations and lifespan multipliers for stellar entities 2026-10-17 23:51:08 +03:00
Kirill 273093bd9e Разделить частоту обновления часов и расчёта симуляции
Счётчик времени UI обновляется до 10 Гц по запрошенному времени, а тяжёлые циклы по-прежнему запускаются с адаптивным интервалом и обрабатывают весь накопленный промежуток. Обновить тесты и описание модели.
2026-10-17 23:41:18 +03:00
Kirill 00b6192d19 Refactor production request handling: implement queuing mechanism and improve production application logic 2026-10-08 22:19:29 +03:00
Kirill 02c9843e1b Enhance civilization flow mechanics and adaptive quality control
- Implemented runtime-only adaptive quality controller to optimize simulation performance based on CPU time.
- Added adaptive quality thresholds and recovery cycles to dynamically adjust simulation fidelity.
- Introduced single-step solving method for civilization transitions to improve performance under high loads.
- Updated benchmark scripts to include speed parameter for testing various simulation speeds.
- Added tests for adaptive quality adjustments and their effects on civilization flow calculations.
- Documented results of optimization attempts and their impact on performance metrics.
2026-10-08 22:05:08 +03:00
Kirill 459fbb2a4d Refactor civilization flow reward calculations for improved accuracy and performance 2026-10-08 21:25:39 +03:00
Kirill c42940369a Refactor capacity enforcement and production logic
- Updated `enforce_capacity` function to accept an optional `physical` parameter, allowing for more flexible handling of physical amounts.
- Modified `initialize_life_batches` to return physical amounts after enforcing capacity, improving data flow.
- Enhanced `try_production` to utilize shared physical amounts, reducing redundant calculations.
- Adjusted `stellar_environment` to accept an optional `quantities` parameter, streamlining its usage.
- Added new test results for physical totals to validate performance improvements across various scenarios.
2026-10-08 21:10:36 +03:00
Kirill 9357f757a9 Refactor civilization flow mechanics: enhance commit and colonization logic, add tests for flow application and resource allocation, and optimize performance metrics. 2026-10-08 20:43:51 +03:00
Kirill 413f2be904 Refactor simulation timing and frame processing logic for improved accuracy and performance 2026-10-08 00:15:23 +03:00
Kirill 3fcc7211ce Implement civilization flow mechanics and profiling for resource allocation
- Added `civilization_flow.gd` to manage continuous expected flows and resource allocation within civilizations.
- Introduced `allocate_profiled` and `whole_quotas` functions in `quantity_math.gd` for precise stock allocation based on float shares.
- Enhanced `credit` logic in `object_ledger.gd` to handle production remainders more effectively.
- Updated `append_batch` in `object_batches.gd` to prevent batch creation for invalid IDs.
- Introduced `ratio_approx` function in `exact.gd` for better handling of float profiles.
- Added a benchmark script `benchmark_civilization_flows.gd` to evaluate the performance of civilization flow mechanics.
- Refactored various functions to improve clarity and efficiency in handling resource flows and allocations.
2026-10-07 22:51:55 +03:00
Kirill 6ee66a627d Refactor civilization evolution and state management
- 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.
2026-10-06 23:02:42 +03:00
Kirill e48d4bbe88 Add comprehensive tests and optimizations for simulation and UI performance
- Introduced a new benchmark save script to create a stress test scenario with extreme values for simulation performance.
- Added a full UI benchmark script to measure frame rates and performance metrics during UI interactions.
- Implemented tests for coarse generations to ensure population transitions are handled correctly.
- Created tests for extra parameters to validate the loading and application of configuration settings.
- Developed simulation optimization tests to verify the efficiency of population drift and rounding mechanisms.
- Added split optimization tests to ensure accurate allocation and rounding behavior in population management.
- Included startup parameter tests to confirm the correct initialization of global parameters before scene readiness.
- Enhanced the audit rounding ledger to compare selective and full rounding results for consistency.
2026-10-05 22:16:59 +03:00
Kirill 6f6a1be3bd Refactor audio effect handling: remove cooldown logic and enhance sound playback functionality 2026-10-03 13:36:33 +03:00
Kirill 9e13c8bbe3 Implement audio management system with effects and music players; add settings for sound and music volume 2026-10-03 13:21:53 +03:00
Kirill b6c683298b Replaced txt by Loaders 2026-10-03 11:06:52 +03:00
142 changed files with 288439 additions and 1668 deletions
+45 -74
View File
@@ -2,6 +2,7 @@ extends Node
const E = preload("res://world/owniverse/math/exact.gd") const E = preload("res://world/owniverse/math/exact.gd")
const SPEED_LIMIT: int = 6 const SPEED_LIMIT: int = 6
const SUPPORTED_LOCALES: PackedStringArray = ["en", "ru"]
# Write a readable diagnostic copy next to the encrypted save. Never used for loading. # Write a readable diagnostic copy next to the encrypted save. Never used for loading.
var save_plaintext_copy: bool = true var save_plaintext_copy: bool = true
@@ -9,27 +10,46 @@ var save_plaintext_copy: bool = true
var Settings: Dictionary = { var Settings: Dictionary = {
"filename": "save-0001", "filename": "save-0001",
"sound_volume": 1.0, "sound_volume": 1.0,
"music_volume": 1.0,
"sound_enabled": true,
"music_enabled": true,
"language": "en", "language": "en",
} }
# TODO getter setter for locale #var Locales: Dictionary = {}
var _locale: String = "en"
var Locales: Dictionary = {} var Locale: String:
var Locale = "en" get:
return _locale
set(value):
set_locale(value)
var OwniverseEntities: Dictionary = {} var OwniverseEntities: Dictionary = {}
var OwniverseItems: Dictionary = {} var OwniverseItems: Dictionary = {}
var Templates: Dictionary = {} var Templates: Dictionary = {}
var LifeRules: Dictionary = {} var LifeRules: Dictionary = {}
var CivilizationRules: Dictionary = {} var CivilizationRules: Dictionary = {}
var ExtraParams: Dictionary = {}
var batch_count: float = 40.0 # must be even not odd var ApocalypseQueue: Dictionary = {}
var Achievements: Dictionary = {}
func get_localized_item_description(item_id: String, item: String) -> String: var Music: Dictionary = {}
if Locales[Locale].has(item_id): var Effects: Dictionary = {}
return Locales[Locale][item_id][item]
return "" var batch_count: int = 40 # number of age groups per lifespan
func set_locale(locale: String) -> void:
_locale = locale if SUPPORTED_LOCALES.has(locale) else "en"
Settings.language = _locale
TranslationServer.set_locale(_locale)
#func get_localized_item_description(item_id: String, item: String) -> String:
#if Locales[Locale].has(item_id):
#return Locales[Locale][item_id][item]
#return ""
# Russian templates include the class; legacy English keys omit it. # Russian templates include the class; legacy English keys omit it.
@@ -62,73 +82,24 @@ func format_number(value, digits: int = 0) -> String:
return E.grouped(value, digits) return E.grouped(value, digits)
func _init() -> void:
# Stage constructs its world before autoload _ready callbacks run.
ExtraParams = preload("res://data/owniverse_extra_param_loader.gd").get_data()
func _ready() -> void: func _ready() -> void:
CivilizationRules.clear() set_locale(str(Settings.language))
for row: Dictionary in _read_from_csv("res://data/civilization_rules.txt").values():
if not CivilizationRules.has(row.stage):
CivilizationRules[row.stage] = {"home": row.home, "span": E.of(row.span), "stars": E.of(row.stars), "ethics": {},
"colonizes": row.colonizes == "1", "fights": row.fights == "1", "diplomacy": row.diplomacy == "1", "worships": row.worships == "1"}
CivilizationRules[row.stage].ethics[row.ethic] = row
var stages: Array = CivilizationRules.keys()
stages.sort()
for i in stages.size():
CivilizationRules[stages[i]].next = stages[i + 1] if i + 1 < stages.size() else "Ct"
CivilizationRules[stages[i]].previous = stages[i - 1] if i > 0 else "C0.1"
CivilizationRules[stages[i]].colony = stages[maxi(0, i - 2)]
CivilizationRules.Ct = {"home": "", "span": 0.0, "stars": 0.0, "ethics": {}, "next": "Ct", "previous": "C4.4", "colonizes": false, "fights": false, "diplomacy": false, "worships": false}
LifeRules = _read_from_csv("res://data/life_rules.txt")
OwniverseEntities = _read_from_csv("res://data/owniverse_entities.txt")
OwniverseItems = _read_from_csv("res://data/owniverse_items.txt")
Locales["en"] = _read_from_csv("res://data/locale.en.txt")
Locales["ru"] = _read_from_csv("res://data/locale.ru.txt")
Templates = OwniverseTemplate.get_data() LifeRules = OwniverseLifeRuleLoader.get_data()
OwniverseEntities = OwniverseEntityLoader.get_data()
OwniverseItems = OwniverseItemLoader.get_data()
Templates = OwniverseTemplateLoader.get_data()
CivilizationRules = OwniverseCivilizationRuleLoader.get_data()
ApocalypseQueue = OwniverseApocalypseQueueLoader.get_data()
Achievements = OwniverseAchievementLoader.get_data()
func _read_from_csv(file_path: String) -> Dictionary: Music = OwniverseAudioLoader.get_music()
if not FileAccess.file_exists(file_path): Effects = OwniverseAudioLoader.get_effects()
printerr("File not found: " + file_path)
return {}
var file = FileAccess.open(file_path, FileAccess.READ)
if file == null:
printerr("File can not be opened:" + file_path)
return {}
var headers: PackedStringArray = []
var data: Array = []
if not file.eof_reached():
headers = PackedStringArray()
for val in file.get_csv_line("|"):
headers.append(val.strip_edges())
while not file.eof_reached():
var raw_row = file.get_csv_line("|")
if raw_row.is_empty(): # пропускаем пустые строки
continue
var trimmed_row: PackedStringArray = []
for val in raw_row:
trimmed_row.append(val.strip_edges())
data.append(trimmed_row)
file.close()
var dict_data: Dictionary = {}
for row in data:
if row.size() < 2: continue
if row.size() == headers.size():
var dict: Dictionary = {}
for i in headers.size():
dict[headers[i]] = row[i]
dict_data[row[0]] = dict
return dict_data
func _read_folder_list(folder_name: String) -> void: func _read_folder_list(folder_name: String) -> void:
+46 -4
View File
@@ -6,7 +6,7 @@ const E = preload("res://world/owniverse/math/exact.gd")
const SETTING_SECTION = "Settings" const SETTING_SECTION = "Settings"
const SAVE_PATH = "user://settings.cfg" const SAVE_PATH = "user://settings.cfg"
const FORMAT_VERSION : int = 5 const FORMAT_VERSION : int = 6
const SimulationTime = preload("res://world/owniverse/simulation_time.gd") const SimulationTime = preload("res://world/owniverse/simulation_time.gd")
const WorldParameters = preload("res://world/owniverse/world_parameters.gd") const WorldParameters = preload("res://world/owniverse/world_parameters.gd")
const STATE_VERSION : String = SimulationTime.STATE_VERSION const STATE_VERSION : String = SimulationTime.STATE_VERSION
@@ -178,6 +178,30 @@ func load_data(filename: String, password: String) -> Dictionary:
return E.decode(data) return E.decode(data)
## Preserve a structurally readable but game-incompatible save, then allow the
## already initialized fresh session to use the original filename.
func archive_incompatible_save(filename: String) -> bool:
flush_saves()
var path: String = save_directory.path_join(E.add(filename, ".adventure"))
if not FileAccess.file_exists(path):
blocked_saves.erase(filename)
last_error = ""
return true
var archive: String = E.add(path, ".incompatible.bak")
var index: int = 0
while FileAccess.file_exists(archive):
index = E.add(index, 1)
archive = E.add(E.add(path, ".incompatible.bak."), str(index))
var error: Error = DirAccess.rename_absolute(path, archive)
if E.ne(error, OK):
blocked_saves[filename] = true
return _fail(E.add("Cannot archive incompatible save: ", error_string(error)))
blocked_saves.erase(filename)
last_error = ""
push_warning(E.add(E.add("Incompatible save preserved at ", archive), "; starting a new game."))
return true
static func _number(value: Variant, whole: bool = false, nonnegative: bool = true) -> bool: static func _number(value: Variant, whole: bool = false, nonnegative: bool = true) -> bool:
return E.numeric(value) and E.finite(value) and (not value is float or absf(value) < 1e28) and (not whole or E.eq(value, E.floor_value(value))) and (not nonnegative or E.ge(value, 0)) return E.numeric(value) and E.finite(value) and (not value is float or absf(value) < 1e28) and (not whole or E.eq(value, E.floor_value(value))) and (not nonnegative or E.ge(value, 0))
@@ -226,8 +250,16 @@ static func _validate_payload(data: Variant, speed_limit: int, stages: Array, en
# Optional additions to the current format. Saves predating indicators keep # Optional additions to the current format. Saves predating indicators keep
# their quantities and receive neutral defaults from Owniverse on load. # their quantities and receive neutral defaults from Owniverse on load.
for field in saved: for field in saved:
if (not E.contains(required, field) and not E.contains(["world_parameters", "trends"], field)): if (not E.contains(required, field) and not E.contains(["world_parameters", "trends", "apocalypse"], field)):
return "unsupported state structure" return "unsupported state structure"
if saved.has("apocalypse"):
var apocalypse: Variant = saved.apocalypse
if not apocalypse is Dictionary: return "invalid state.apocalypse"
for key in ["phase", "stage", "tick", "end_ticks"]:
if not _number(apocalypse.get(key), true): return E.add("invalid state.apocalypse.", key)
for key in ["type", "warning"]:
if not _number(apocalypse.get(key), true, false): return E.add("invalid state.apocalypse.", key)
if E.lt(apocalypse.phase, 0) or E.gt(apocalypse.phase, 2): return "invalid apocalypse phase"
if saved.has("world_parameters"): if saved.has("world_parameters"):
if ((not _number_map(saved.world_parameters)) or E.ne(saved.world_parameters.size(), WorldParameters.defaults().size())): if ((not _number_map(saved.world_parameters)) or E.ne(saved.world_parameters.size(), WorldParameters.defaults().size())):
return "invalid state.world_parameters" return "invalid state.world_parameters"
@@ -324,11 +356,19 @@ static func _validate_payload(data: Variant, speed_limit: int, stages: Array, en
if ((not (saved.ethics is Dictionary)) or (not (saved.civilization_homes is Dictionary))): if ((not (saved.ethics is Dictionary)) or (not (saved.civilization_homes is Dictionary))):
return "invalid civilization state" return "invalid civilization state"
for id in saved.ethics: for id in saved.ethics:
if (not E.contains(stages, id) or (not _number_map(saved.ethics[id], true))): if (not E.contains(stages, id) or (not (saved.ethics[id] is Dictionary))):
return E.add("invalid state.ethics.", str(id)) return E.add("invalid state.ethics.", str(id))
if E.ne(saved.ethics[id].keys().size(), 6):
return E.add("invalid ethic profile size for ", str(id))
var share_sum: float = 0.0
for ethic in saved.ethics[id]: for ethic in saved.ethics[id]:
if not E.contains(["m", "l", "w", "d", "c", "b"], ethic): var share: Variant = saved.ethics[id][ethic]
var share_value: float = 0.0 + share if share is int or share is float else -1.0
if not E.contains(["m", "l", "w", "d", "c", "b"], ethic) or not is_finite(share_value) or share_value < 0.0 or share_value > 1.0:
return E.add("invalid ethic ", str(ethic)) return E.add("invalid ethic ", str(ethic))
share_sum += share_value
if absf(share_sum - 1.0) > 0.000001:
return E.add("invalid ethic profile total for ", str(id))
for id in saved.civilization_homes: for id in saved.civilization_homes:
if (not _number_map(saved.civilization_homes[id], true)): if (not _number_map(saved.civilization_homes[id], true)):
return "invalid civilization homes" return "invalid civilization homes"
@@ -350,8 +390,10 @@ func load_settings():
var config = ConfigFile.new() var config = ConfigFile.new()
var err = config.load(SAVE_PATH) var err = config.load(SAVE_PATH)
if E.ne(err, OK): if E.ne(err, OK):
Global.set_locale(str(Global.Settings.language))
return false return false
for item in Global.Settings: for item in Global.Settings:
Global.Settings[item] = config.get_value(SETTING_SECTION, item, Global.Settings[item]) Global.Settings[item] = config.get_value(SETTING_SECTION, item, Global.Settings[item])
Global.set_locale(str(Global.Settings.language))
return true return true
#endregion #endregion
-318
View File
@@ -1,318 +0,0 @@
Civ|Stars|Home|Fall|ScaleLevel|Description|EthL|Lev|Eth|Wor|Pro|Deg|Col|War|Dip|WorC|ProC|DegC|ColC|WarC|DipC|Span|Ret
RP|||||Каменистая планета. Все умерли.||0|||||||||||||||
HP|||RP:1||Обитаемая планета. Абиогенез.||0|||1|1|||||0.00025|0.0025||||5E+06|5E-05
LP|||||На этой планете есть жизнь!||0|||||||||||||||
EON1|||HP:100^RP:1||Архей. Не сразу бросается в глаза, но на таких планетах полно археев и цианобактерий.||1|||1|1|||||0.00025|0.0025||||1E+07|1E-06
EON2|||EON1:1||Протерозой. Помимо вездесущих амёб, здесь присутствуют водоросли, губки и даже моллюски.||1|||1|1|||||0.00025|0.0025||||1E+07|1E-06
EON3|||EON2:1000^EON1:1||Палеозой. Папоротники, черви, трилобиты и рыбы.||1|||1|1|||||0.00025|0.0025||||1E+06|1E-05
EON4|||EON3:1000^EON1:1||Мезозой. Голосеменные, ящеры, динозавры и терапсиды.||1|||1|1|||||0.00025|0.0025||||1E+06|1E-05
EON5|||EON4:2000^EON1:1||Кайнозой. Покрытосеменные и разнообразные млекопитающие, из них некоторые проявляют признаки интеллекта.||1|||1|1|||||0.00025|0.0025||||5E+05|5E-04
C0|||||Докосмическая эпоха — от племени до федерации.||0|||||||||||||||
C0.0|||EON5:1||Нижний палеолит. Приручение огня, каменные орудия.||1|0|0|1|1|||||0.0175|0.025||||2E+03|1
C0.1|||C0.0:1||Средний палеолит. Развитые каменные орудия.||1|0|0|1|1|||||0.0175|0.025||||2E+03|1
C0.2|||||Верхний палеолит. Сложные каменные орудия, искусство.||1|1|1|1|1||||||||||2E+03|1
C0.2m|||C0.1:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.2b|||C0.1:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.2d|||C0.1:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.2l|||C0.1:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.2c|||C0.1:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.2w|||C0.1:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.3|||||Мезолит. Лук и стрелы, рыболовство, лодки.||1|1|1|1|1||||||||||2E+03|1
C0.3m|||C0.2:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.3b|||C0.2:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.3d|||C0.2:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.3l|||C0.2:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.3c|||C0.2:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.3w|||C0.2:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.4|||||Ранний неолит. Земледелие.||1|1|1|1|1||||||||||2E+03|1
C0.4m|||C0.3:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.4b|||C0.3:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.4d|||C0.3:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.4l|||C0.3:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.4c|||C0.3:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.4w|||C0.3:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.5|||||Средний неолит. Скотоводство, керамика.||1|1|1|1|1||||||||||2E+03|1
C0.5m|||C0.4:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.5b|||C0.4:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.5d|||C0.4:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.5l|||C0.4:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.5c|||C0.4:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.5w|||C0.4:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.6|||||Поздний неолит. Крупные поселения.||1|1|1|1|1||||||||||2E+03|1
C0.6m|||C0.5:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.6b|||C0.5:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.6d|||C0.5:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.6l|||C0.5:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.6c|||C0.5:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.6w|||C0.5:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.7|||||Первые царства медного и бронзового века. Колесо.||1|1|1|1|1||||||||||2E+03|1
C0.7m|||C0.6:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.7b|||C0.6:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.7d|||C0.6:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.7l|||C0.6:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.7c|||C0.6:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.7w|||C0.6:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.8|||||Античные империи железного века. Философия.||1|1|1|1|1||||||||||2E+03|1
C0.8m|||C0.7:1||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.8b|||C0.7:1||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.8d|||C0.7:1||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.8l|||C0.7:1||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.8c|||C0.7:1||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.8w|||C0.7:1||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C0.9|||||Промышленная эпоха. Электричество.||1|1|1|1|1||||||||||2E+03|1
C0.9m|||C0.8:512^C0.7:256^EON5:21^EON1:6||Мистики|m|2||||||||1.6|0.0084|0.01|0.0000625|0.001024|||
C0.9b|||C0.8:512^C0.7:256^EON5:43^EON1:9||Строители|b|2||||||||1|0.01859375|0.02|0.00003125|0.0025|||
C0.9d|||C0.8:512^C0.7:256^EON5:7^EON1:3||Дипломаты|d|2||||||||1|0.0112|0.01538461538|0.0005|0.00015625|||
C0.9l|||C0.8:512^C0.7:256^EON5:60^EON1:11||Логики|l|2||||||||0.5|0.0504|0.03571428571|0.0005|0.0025|||
C0.9c|||C0.8:512^C0.7:256^EON5:252^EON1:19||Колонисты|c|2||||||||0.8|0.021|0.02604166667|0.004096|0.006103515625|||
C0.9w|||C0.8:512^C0.7:256^EON5:260^EON1:26||Воины|w|2||||||||1.25|0.02625|0.03125|0.0005|0.016384|||
C1|||||Цивилизации, осваивающие родную солнечную систему.||0|||||||||||||||
C1.0|||||Цивилизация, освоившая родную планету. Сверхпроводимость, управляемый термоядерный синтез.||1|1|1|1|1||||||||||5E+03|1
C1.0m|||C0.9:1024^EON5:21^EON1:6||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.0b|||C0.9:1024^EON5:43^EON1:9||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.0d|||C0.9:1024^EON5:7^EON1:3||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.0l|||C0.9:1024^EON5:60^EON1:11||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.0c|||C0.9:1024^EON5:152^EON1:19||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.0w|||C0.9:1024^EON5:260^EON1:26||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.1|||||Научные базы на других телах родной системы. Пусковая петля, космический лифт.||1|1|1|1|1||||||||||5E+03|1
C1.1m|||C1.0:1024^C0.9:256^EON5:21^EON1:6||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.1b|||C1.0:1024^C0.9:256^EON5:43^EON1:9||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.1d|||C1.0:1024^C0.9:256^EON5:7^EON1:3||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.1l|||C1.0:1024^C0.9:256^EON5:60^EON1:11||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.1c|||C1.0:1024^C0.9:256^EON5:152^EON1:19||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.1w|||C1.0:1024^C0.9:256^EON5:260^EON1:26||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.2|||||Полное управление генетикой. Киборгизация.||1|1|1|1|1||||||||||5E+03|1
C1.2m|||C1.1:256^C1.0:1024^C0.9:256^EON5:21^EON1:6||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.2b|||C1.1:256^C1.0:1024^C0.9:256^EON5:43^EON1:9||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.2d|||C1.1:256^C1.0:1024^C0.9:256^EON5:7^EON1:3||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.2l|||C1.1:256^C1.0:1024^C0.9:256^EON5:60^EON1:11||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.2c|||C1.1:256^C1.0:1024^C0.9:256^EON5:152^EON1:19||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.2w|||C1.1:256^C1.0:1024^C0.9:256^EON5:260^EON1:26||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.3|||||Промышленная добыча астероидов. Колонии на других планетах родной системы.||1|1|1|1|1||||||||||5E+03|1
C1.3m|||C1.2:256^C1.0:1024^C0.9:64^EON5:13^EON1:13||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.3b|||C1.2:256^C1.0:1024^C0.9:64^EON5:22^EON1:22||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.3d|||C1.2:256^C1.0:1024^C0.9:64^EON5:5^EON1:5||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.3l|||C1.2:256^C1.0:1024^C0.9:64^EON5:30^EON1:30||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.3c|||C1.2:256^C1.0:1024^C0.9:64^EON5:64^EON1:64||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.3w|||C1.2:256^C1.0:1024^C0.9:64^EON5:100^EON1:100||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.4|||||Сбор вещества из атмосфер газовых гигантов.||1|1|1|1|1||||||||||5E+03|1
C1.4m|||C1.3:384^C1.0:896^EON5:6^EON1:21||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.4b|||C1.3:384^C1.0:896^EON5:9^EON1:43||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.4d|||C1.3:384^C1.0:896^EON5:3^EON1:7||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.4l|||C1.3:384^C1.0:896^EON5:11^EON1:60||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.4c|||C1.3:384^C1.0:896^EON5:19^EON1:152||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.4w|||C1.3:384^C1.0:896^EON5:26^EON1:260||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.5|||||Космические города. Пикотехнологии: управление отдельными атомами.||1|1|1|1|1||||||||||5E+03|1
C1.5m|||C1.4:512^C1.0:768^EON5:6^EON1:21||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.5b|||C1.4:512^C1.0:768^EON5:9^EON1:43||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.5d|||C1.4:512^C1.0:768^EON5:3^EON1:7||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.5l|||C1.4:512^C1.0:768^EON5:11^EON1:60||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.5c|||C1.4:512^C1.0:768^EON5:19^EON1:152||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.5w|||C1.4:512^C1.0:768^EON5:26^EON1:260||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.6|||||Промышленное производство антивещества. Первые звездолёты.||1|1|1|1|1|1|||||||||5E+03|1
C1.6m|||C1.5:768^C1.0:512^EON5:6^RP:21||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.6b|||C1.5:768^C1.0:512^EON5:9^RP:43||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.6d|||C1.5:768^C1.0:512^EON5:3^RP:7||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.6l|||C1.5:768^C1.0:512^EON5:11^RP:60||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.6c|||C1.5:768^C1.0:512^EON5:19^RP:152||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.6w|||C1.5:768^C1.0:512^EON5:26^RP:260||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.7|||||Терраформинг. Гамма-лазеры.||1|1|1|1|1|1|||||||||5E+03|1
C1.7m|||C1.6:896^C1.0:384^EON5:6^RP:21||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.7b|||C1.6:896^C1.0:384^EON5:9^RP:43||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.7d|||C1.6:896^C1.0:384^EON5:3^RP:7||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.7l|||C1.6:896^C1.0:384^EON5:11^RP:60||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.7c|||C1.6:896^C1.0:384^EON5:19^RP:152||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.7w|||C1.6:896^C1.0:384^EON5:26^RP:260||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.8|||||Космические станции континентального масштаба.||1|1|1|1|1|1|||||||||5E+03|1
C1.8m|||C1.7:1024^C1.0:256^EON5:6^RP:21||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.8b|||C1.7:1024^C1.0:256^EON5:9^RP:43||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.8d|||C1.7:1024^C1.0:256^EON5:3^RP:7||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.8l|||C1.7:1024^C1.0:256^EON5:11^RP:60||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.8c|||C1.7:1024^C1.0:256^EON5:19^RP:152||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.8w|||C1.7:1024^C1.0:256^EON5:26^RP:260||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C1.9|||||Частичный рой Дайсона.||1|1|1|1|1|1|||||||||5E+03|1
C1.9m|||C1.8:1024^C1.0:128^EON5:6^RP:21||Мистики|m|2||||||||1.6|0.009|0.01|0.0000625|0.001024|||
C1.9b|||C1.8:1024^C1.0:128^EON5:9^RP:43||Строители|b|2||||||||1|0.019921875|0.02|0.00003125|0.0025|||
C1.9d|||C1.8:1024^C1.0:128^EON5:3^RP:7||Дипломаты|d|2||||||||1|0.012|0.01538461538|0.0005|0.00015625|||
C1.9l|||C1.8:1024^C1.0:128^EON5:11^RP:60||Логики|l|2||||||||0.5|0.054|0.03571428571|0.0005|0.0025|||
C1.9c|||C1.8:1024^C1.0:128^EON5:19^RP:152||Колонисты|c|2||||||||0.8|0.0225|0.02604166667|0.004096|0.006103515625|||
C1.9w|||C1.8:1024^C1.0:128^EON5:26^RP:260||Воины|w|2||||||||1.25|0.028125|0.03125|0.0005|0.016384|||
C2|||||Цивилизации, ведущие экспансию к иным звёздам.||0|||||||||||||||
C2.0|1E+00|DwStar||Звезда|Цивилизация, освоившая энергию родного солнца.||1|1|1|1|1|1|1|1|||||||5E+03|1
C2.0m|||C1.9:1024^C1.0:128^RP:28||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.0b|||C1.9:1024^C1.0:128^EON5:9^RP:59||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.0d|||C1.9:1024^C1.0:128^EON5:3^RP:8||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.0l|||C1.9:1024^C1.0:128^EON5:11^RP:85||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.0c|||C1.9:1024^C1.0:128^EON5:19^RP:235||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.0w|||C1.9:1024^C1.0:128^EON5:26^RP:419||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.1|1E+01|DwStar|||Изменение планетарных орбит.||1|1|1|1|1|1|1|1|||||||5E+03|5.62E-01
C2.1m|||C2.0:1||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.1b|||C2.0:1||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.1d|||C2.0:1||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.1l|||C2.0:1||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.1c|||C2.0:1||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.1w|||C2.0:1||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.2|1E+02|DwStar|||Управление инерцией.||1|1|1|1|1|1|1|1|||||||1E+04|3.16E-01
C2.2m|||C2.1:1024^C2.0:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.2b|||C2.1:1024^C2.0:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.2d|||C2.1:1024^C2.0:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.2l|||C2.1:1024^C2.0:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.2c|||C2.1:1024^C2.0:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.2w|||C2.1:1024^C2.0:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.3|1E+03|DwStar||Рассеянное звёздное скопление|Сбор вещества со звёзд.||1|1|1|1|1|1|1|1|||||||2E+04|1.78E-01
C2.3m|||C2.2:1024^C2.1:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.3b|||C2.2:1024^C2.1:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.3d|||C2.2:1024^C2.1:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.3l|||C2.2:1024^C2.1:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.3c|||C2.2:1024^C2.1:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.3w|||C2.2:1024^C2.1:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.4|1E+04|DwStar||Малое звёздное скопление|Фемтотехнологии: управление отдельными фермионами.||1|1|1|1|1|1|1|1|||||||2E+04|1.00E-01
C2.4m|||C2.3:1024^C2.2:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.4b|||C2.3:1024^C2.2:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.4d|||C2.3:1024^C2.2:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.4l|||C2.3:1024^C2.2:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.4c|||C2.3:1024^C2.2:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.4w|||C2.3:1024^C2.2:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.5|1E+05|DwStar||Звёздное скопление|Деконструкция и сборка планет.||1|1|1|1|1|1|1|1|||||||3E+04|5.62E-02
C2.5m|||C2.4:1024^C2.3:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.5b|||C2.4:1024^C2.3:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.5d|||C2.4:1024^C2.3:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.5l|||C2.4:1024^C2.3:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.5c|||C2.4:1024^C2.3:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.5w|||C2.4:1024^C2.3:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.6|1E+06|DwStar||Большое звёздное скопление|Астроархитектурная доминанта.||1|1|1|1|1|1|1|1|||||||3E+04|3.16E-02
C2.6m|||C2.5:1024^C2.4:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.6b|||C2.5:1024^C2.4:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.6d|||C2.5:1024^C2.4:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.6l|||C2.5:1024^C2.4:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.6c|||C2.5:1024^C2.4:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.6w|||C2.5:1024^C2.4:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.7|1E+07|GiStar||Гигантское звёздное скопление|Освоение ресурсов звёзд-гигантов.||1|1|1|1|1|1|1|1|||||||4E+04|1.78E-02
C2.7m|||C2.6:1024^C2.5:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.7b|||C2.6:1024^C2.5:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.7d|||C2.6:1024^C2.5:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.7l|||C2.6:1024^C2.5:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.7c|||C2.6:1024^C2.5:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.7w|||C2.6:1024^C2.5:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.8|1E+08|GiStar|||Управление гравитацией.||1|1|1|1|1|1|1|1|||||||4E+04|1.00E-02
C2.8m|||C2.7:1024^C2.6:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.8b|||C2.7:1024^C2.6:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.8d|||C2.7:1024^C2.6:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.8l|||C2.7:1024^C2.6:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.8c|||C2.7:1024^C2.6:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.8w|||C2.7:1024^C2.6:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C2.9|1E+09|GiStar||Карликовая галактика|Перемещение звёзд.||1|1|1|1|1|1|1|1|||||||5E+04|5.62E-03
C2.9m|||C2.8:1024^C2.7:6||Мистики|m|2||||||||1.6|0.006|0.01|0.0005|0.00128|1||
C2.9b|||C2.8:1024^C2.7:9||Строители|b|2||||||||1|0.02125|0.015625|0.00003125|0.0025|0.64||
C2.9d|||C2.8:1024^C2.7:3||Дипломаты|d|2||||||||1|0.0128|0.01923076923|0.0009765625|0.0003125|2.56||
C2.9l|||C2.8:1024^C2.7:11||Логики|l|2||||||||0.5|0.0576|0.04464285714|0.0005|0.0025|1.5625||
C2.9c|||C2.8:1024^C2.7:19||Колонисты|c|2||||||||0.8|0.024|0.04166666667|0.004096|0.006103515625|1||
C2.9w|||C2.8:1024^C2.7:26||Воины|w|2||||||||1.25|0.03|0.025|0.000256|0.03072|0.25||
C3|||||Цивилизации галактического масштаба.||0|||||||||||||||
C3.0|1E+10|GiStar||Малая галактика|Экспансия в группу галактик.||1|1|1|1|1|1|1|1|||||||1E+05|3.16E-03
C3.0m|||C2.9:1024^C2.8:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.0b|||C2.9:1024^C2.8:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.0d|||C2.9:1024^C2.8:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.0l|||C2.9:1024^C2.8:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.0c|||C2.9:1024^C2.8:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.0w|||C2.9:1024^C2.8:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.1|1E+11|GiStar||Средняя галактика|Создание звёзд.||1|1|1|1|1|1|1|1|||||||1E+05|1.78E-03
C3.1m|||C3.0:1024^C2.9:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.1b|||C3.0:1024^C2.9:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.1d|||C3.0:1024^C2.9:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.1l|||C3.0:1024^C2.9:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.1c|||C3.0:1024^C2.9:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.1w|||C3.0:1024^C2.9:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.2|1E+12|WD||Большая галактика|Использование белых карликов.||1|1|1|1|1|1|1|1|||||||2E+05|1.00E-03
C3.2m|||C3.1:1024^C3.0:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.2b|||C3.1:1024^C3.0:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.2d|||C3.1:1024^C3.0:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.2l|||C3.1:1024^C3.0:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.2c|||C3.1:1024^C3.0:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.2w|||C3.1:1024^C3.0:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.3|1E+13|WD||Гигантская галактика|Создание чёрных дыр из концентрированного излучения.||1|1|1|1|1|1|1|1|||||||3E+05|5.62E-04
C3.3m|||C3.2:1024^C3.1:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.3b|||C3.2:1024^C3.1:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.3d|||C3.2:1024^C3.1:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.3l|||C3.2:1024^C3.1:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.3c|||C3.2:1024^C3.1:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.3w|||C3.2:1024^C3.1:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.4|1E+14|WD||Группа галактик|Экспансия в сверхскопление.||1|1|1|1|1|1|1|1|||||||4E+05|3.16E-04
C3.4m|||C3.3:1024^C3.2:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.4b|||C3.3:1024^C3.2:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.4d|||C3.3:1024^C3.2:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.4l|||C3.3:1024^C3.2:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.4c|||C3.3:1024^C3.2:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.4w|||C3.3:1024^C3.2:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.5|1E+15|NS|||Использование нейтронных звёзд.||1|1|1|1|1|1|1|1|||||||5E+05|1.78E-04
C3.5m|||C3.4:1024^C3.3:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.5b|||C3.4:1024^C3.3:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.5d|||C3.4:1024^C3.3:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.5l|||C3.4:1024^C3.3:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.5c|||C3.4:1024^C3.3:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.5w|||C3.4:1024^C3.3:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.6|1E+16|NS||Сверхскопление|Экспансия в нить.||1|1|1|1|1|1|1|1|||||||6E+05|1.00E-04
C3.6m|||C3.5:1024^C3.4:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.6b|||C3.5:1024^C3.4:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.6d|||C3.5:1024^C3.4:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.6l|||C3.5:1024^C3.4:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.6c|||C3.5:1024^C3.4:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.6w|||C3.5:1024^C3.4:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.7|1E+17|MGT|||Использование магнетаров.||1|1|1|1|1|1|1|1|||||||7E+05|5.62E-05
C3.7m|||C3.6:1024^C3.5:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.7b|||C3.6:1024^C3.5:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.7d|||C3.6:1024^C3.5:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.7l|||C3.6:1024^C3.5:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.7c|||C3.6:1024^C3.5:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.7w|||C3.6:1024^C3.5:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.8|1E+18|MGT||Галактическая нить|Экспансия в великую стену.||1|1|1|1|1|1|1|1|||||||8E+05|3.16E-05
C3.8m|||C3.7:1024^C3.6:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.8b|||C3.7:1024^C3.6:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.8d|||C3.7:1024^C3.6:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.8l|||C3.7:1024^C3.6:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.8c|||C3.7:1024^C3.6:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.8w|||C3.7:1024^C3.6:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C3.9|1E+19|BH|||Использование чёрных дыр.||1|1|1|1|1|1|1|1|||||||9E+05|1.78E-05
C3.9m|||C3.8:1024^C3.7:6||Мистики|m|2||||||||1.6|0.006375|0.01|0.0005|0.00128|1||
C3.9b|||C3.8:1024^C3.7:9||Строители|b|2||||||||1|0.022578125|0.015625|0.00003125|0.0025|0.64||
C3.9d|||C3.8:1024^C3.7:3||Дипломаты|d|2||||||||1|0.0136|0.01923076923|0.0009765625|0.0003125|2.56||
C3.9l|||C3.8:1024^C3.7:11||Логики|l|2||||||||0.5|0.0612|0.04464285714|0.0005|0.0025|1.5625||
C3.9c|||C3.8:1024^C3.7:19||Колонисты|c|2||||||||0.8|0.0255|0.04166666667|0.004096|0.006103515625|1||
C3.9w|||C3.8:1024^C3.7:26||Воины|w|2||||||||1.25|0.031875|0.025|0.000256|0.03072|0.25||
C4|||||Цивилизации вселенского масштаба.||0|||||||||||||||
C4.0|1E+20|BH|||Манипуляции со временем.||1|1|1|1|1|1|1|1|||||||2E+06|1.00E-05
C4.0m|||C3.9:1024^C3.8:6||Мистики|m|2||||||||1.6|0.00675|0.01|0.0005|0.00128|1||
C4.0b|||C3.9:1024^C3.8:9||Строители|b|2||||||||1|0.02390625|0.015625|0.00003125|0.0025|0.64||
C4.0d|||C3.9:1024^C3.8:3||Дипломаты|d|2||||||||1|0.0144|0.01923076923|0.0009765625|0.0003125|2.56||
C4.0l|||C3.9:1024^C3.8:11||Логики|l|2||||||||0.5|0.0648|0.04464285714|0.0005|0.0025|1.5625||
C4.0c|||C3.9:1024^C3.8:19||Колонисты|c|2||||||||0.8|0.027|0.04166666667|0.004096|0.006103515625|1||
C4.0w|||C3.9:1024^C3.8:26||Воины|w|2||||||||1.25|0.03375|0.025|0.000256|0.03072|0.25||
C4.1|1E+21|BH||Великая стена|Экспансия на масштабы всей вселенной.||1|1|1|1|1|1|1|1|||||||2E+06|5.62E-06
C4.1m|||C4.0:1024^C3.9:6||Мистики|m|2||||||||1.6|0.00675|0.01|0.0005|0.00128|1||
C4.1b|||C4.0:1024^C3.9:9||Строители|b|2||||||||1|0.02390625|0.015625|0.00003125|0.0025|0.64||
C4.1d|||C4.0:1024^C3.9:3||Дипломаты|d|2||||||||1|0.0144|0.01923076923|0.0009765625|0.0003125|2.56||
C4.1l|||C4.0:1024^C3.9:11||Логики|l|2||||||||0.5|0.0648|0.04464285714|0.0005|0.0025|1.5625||
C4.1c|||C4.0:1024^C3.9:19||Колонисты|c|2||||||||0.8|0.027|0.04166666667|0.004096|0.006103515625|1||
C4.1w|||C4.0:1024^C3.9:26||Воины|w|2||||||||1.25|0.03375|0.025|0.000256|0.03072|0.25||
C4.2|1E+22|SMBH|||Использование сверхмассивных чёрных дыр.||1|1|1|1|1|1|1|1|||||||4E+06|3.16E-06
C4.2m|||C4.1:1024^C4.0:6||Мистики|m|2||||||||1.6|0.00675|0.01|0.0005|0.00128|1||
C4.2b|||C4.1:1024^C4.0:9||Строители|b|2||||||||1|0.02390625|0.015625|0.00003125|0.0025|0.64||
C4.2d|||C4.1:1024^C4.0:3||Дипломаты|d|2||||||||1|0.0144|0.01923076923|0.0009765625|0.0003125|2.56||
C4.2l|||C4.1:1024^C4.0:11||Логики|l|2||||||||0.5|0.0648|0.04464285714|0.0005|0.0025|1.5625||
C4.2c|||C4.1:1024^C4.0:19||Колонисты|c|2||||||||0.8|0.027|0.04166666667|0.004096|0.006103515625|1||
C4.2w|||C4.1:1024^C4.0:26||Воины|w|2||||||||1.25|0.03375|0.025|0.000256|0.03072|0.25||
C4.3|1E+23|SMBH|||Складное пространство.||1|1|1|1|1|1|1|1|||||||6E+06|1.78E-06
C4.3m|||C4.2:1024^C4.1:6||Мистики|m|2||||||||1.6|0.00675|0.01|0.0005|0.00128|1||
C4.3b|||C4.2:1024^C4.1:9||Строители|b|2||||||||1|0.02390625|0.015625|0.00003125|0.0025|0.64||
C4.3d|||C4.2:1024^C4.1:3||Дипломаты|d|2||||||||1|0.0144|0.01923076923|0.0009765625|0.0003125|2.56||
C4.3l|||C4.2:1024^C4.1:11||Логики|l|2||||||||0.5|0.0648|0.04464285714|0.0005|0.0025|1.5625||
C4.3c|||C4.2:1024^C4.1:19||Колонисты|c|2||||||||0.8|0.027|0.04166666667|0.004096|0.006103515625|1||
C4.3w|||C4.2:1024^C4.1:26||Воины|w|2||||||||1.25|0.03375|0.025|0.000256|0.03072|0.25||
C4.4|1E+24|SMBH||Вселенский пузырь|Поле невероятности.||1|1|1|1|1|1|1|1|||||||8E+06|1.00E-06
C4.4m|||C4.3:1024^C4.2:6||Мистики|m|2||||||||1.6|0.00675|0.01|0.0005|0.00128|1||
C4.4b|||C4.3:1024^C4.2:9||Строители|b|2||||||||1|0.02390625|0.015625|0.00003125|0.0025|0.64||
C4.4d|||C4.3:1024^C4.2:3||Дипломаты|d|2||||||||1|0.0144|0.01923076923|0.0009765625|0.0003125|2.56||
C4.4l|||C4.3:1024^C4.2:11||Логики|l|2||||||||0.5|0.0648|0.04464285714|0.0005|0.0025|1.5625||
C4.4c|||C4.3:1024^C4.2:19||Колонисты|c|2||||||||0.8|0.027|0.04166666667|0.004096|0.006103515625|1||
C4.4w|||C4.3:1024^C4.2:26||Воины|w|2||||||||1.25|0.03375|0.025|0.000256|0.03072|0.25||
Ct|||||Трансцендентальность.||0|1||||||||||||||
1 Civ Stars Home Fall ScaleLevel Description EthL Lev Eth Wor Pro Deg Col War Dip WorC ProC DegC ColC WarC DipC Span Ret
2 RP Каменистая планета. Все умерли. 0
3 HP RP:1 Обитаемая планета. Абиогенез. 0 1 1 0.00025 0.0025 5E+06 5E-05
4 LP На этой планете есть жизнь! 0
5 EON1 HP:100^RP:1 Архей. Не сразу бросается в глаза, но на таких планетах полно археев и цианобактерий. 1 1 1 0.00025 0.0025 1E+07 1E-06
6 EON2 EON1:1 Протерозой. Помимо вездесущих амёб, здесь присутствуют водоросли, губки и даже моллюски. 1 1 1 0.00025 0.0025 1E+07 1E-06
7 EON3 EON2:1000^EON1:1 Палеозой. Папоротники, черви, трилобиты и рыбы. 1 1 1 0.00025 0.0025 1E+06 1E-05
8 EON4 EON3:1000^EON1:1 Мезозой. Голосеменные, ящеры, динозавры и терапсиды. 1 1 1 0.00025 0.0025 1E+06 1E-05
9 EON5 EON4:2000^EON1:1 Кайнозой. Покрытосеменные и разнообразные млекопитающие, из них некоторые проявляют признаки интеллекта. 1 1 1 0.00025 0.0025 5E+05 5E-04
10 C0 Докосмическая эпоха — от племени до федерации. 0
11 C0.0 EON5:1 Нижний палеолит. Приручение огня, каменные орудия. 1 0 0 1 1 0.0175 0.025 2E+03 1
12 C0.1 C0.0:1 Средний палеолит. Развитые каменные орудия. 1 0 0 1 1 0.0175 0.025 2E+03 1
13 C0.2 Верхний палеолит. Сложные каменные орудия, искусство. 1 1 1 1 1 2E+03 1
14 C0.2m C0.1:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
15 C0.2b C0.1:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
16 C0.2d C0.1:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
17 C0.2l C0.1:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
18 C0.2c C0.1:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
19 C0.2w C0.1:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
20 C0.3 Мезолит. Лук и стрелы, рыболовство, лодки. 1 1 1 1 1 2E+03 1
21 C0.3m C0.2:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
22 C0.3b C0.2:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
23 C0.3d C0.2:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
24 C0.3l C0.2:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
25 C0.3c C0.2:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
26 C0.3w C0.2:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
27 C0.4 Ранний неолит. Земледелие. 1 1 1 1 1 2E+03 1
28 C0.4m C0.3:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
29 C0.4b C0.3:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
30 C0.4d C0.3:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
31 C0.4l C0.3:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
32 C0.4c C0.3:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
33 C0.4w C0.3:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
34 C0.5 Средний неолит. Скотоводство, керамика. 1 1 1 1 1 2E+03 1
35 C0.5m C0.4:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
36 C0.5b C0.4:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
37 C0.5d C0.4:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
38 C0.5l C0.4:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
39 C0.5c C0.4:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
40 C0.5w C0.4:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
41 C0.6 Поздний неолит. Крупные поселения. 1 1 1 1 1 2E+03 1
42 C0.6m C0.5:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
43 C0.6b C0.5:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
44 C0.6d C0.5:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
45 C0.6l C0.5:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
46 C0.6c C0.5:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
47 C0.6w C0.5:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
48 C0.7 Первые царства медного и бронзового века. Колесо. 1 1 1 1 1 2E+03 1
49 C0.7m C0.6:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
50 C0.7b C0.6:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
51 C0.7d C0.6:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
52 C0.7l C0.6:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
53 C0.7c C0.6:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
54 C0.7w C0.6:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
55 C0.8 Античные империи железного века. Философия. 1 1 1 1 1 2E+03 1
56 C0.8m C0.7:1 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
57 C0.8b C0.7:1 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
58 C0.8d C0.7:1 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
59 C0.8l C0.7:1 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
60 C0.8c C0.7:1 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
61 C0.8w C0.7:1 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
62 C0.9 Промышленная эпоха. Электричество. 1 1 1 1 1 2E+03 1
63 C0.9m C0.8:512^C0.7:256^EON5:21^EON1:6 Мистики m 2 1.6 0.0084 0.01 0.0000625 0.001024
64 C0.9b C0.8:512^C0.7:256^EON5:43^EON1:9 Строители b 2 1 0.01859375 0.02 0.00003125 0.0025
65 C0.9d C0.8:512^C0.7:256^EON5:7^EON1:3 Дипломаты d 2 1 0.0112 0.01538461538 0.0005 0.00015625
66 C0.9l C0.8:512^C0.7:256^EON5:60^EON1:11 Логики l 2 0.5 0.0504 0.03571428571 0.0005 0.0025
67 C0.9c C0.8:512^C0.7:256^EON5:252^EON1:19 Колонисты c 2 0.8 0.021 0.02604166667 0.004096 0.006103515625
68 C0.9w C0.8:512^C0.7:256^EON5:260^EON1:26 Воины w 2 1.25 0.02625 0.03125 0.0005 0.016384
69 C1 Цивилизации, осваивающие родную солнечную систему. 0
70 C1.0 Цивилизация, освоившая родную планету. Сверхпроводимость, управляемый термоядерный синтез. 1 1 1 1 1 5E+03 1
71 C1.0m C0.9:1024^EON5:21^EON1:6 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
72 C1.0b C0.9:1024^EON5:43^EON1:9 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
73 C1.0d C0.9:1024^EON5:7^EON1:3 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
74 C1.0l C0.9:1024^EON5:60^EON1:11 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
75 C1.0c C0.9:1024^EON5:152^EON1:19 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
76 C1.0w C0.9:1024^EON5:260^EON1:26 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
77 C1.1 Научные базы на других телах родной системы. Пусковая петля, космический лифт. 1 1 1 1 1 5E+03 1
78 C1.1m C1.0:1024^C0.9:256^EON5:21^EON1:6 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
79 C1.1b C1.0:1024^C0.9:256^EON5:43^EON1:9 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
80 C1.1d C1.0:1024^C0.9:256^EON5:7^EON1:3 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
81 C1.1l C1.0:1024^C0.9:256^EON5:60^EON1:11 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
82 C1.1c C1.0:1024^C0.9:256^EON5:152^EON1:19 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
83 C1.1w C1.0:1024^C0.9:256^EON5:260^EON1:26 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
84 C1.2 Полное управление генетикой. Киборгизация. 1 1 1 1 1 5E+03 1
85 C1.2m C1.1:256^C1.0:1024^C0.9:256^EON5:21^EON1:6 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
86 C1.2b C1.1:256^C1.0:1024^C0.9:256^EON5:43^EON1:9 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
87 C1.2d C1.1:256^C1.0:1024^C0.9:256^EON5:7^EON1:3 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
88 C1.2l C1.1:256^C1.0:1024^C0.9:256^EON5:60^EON1:11 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
89 C1.2c C1.1:256^C1.0:1024^C0.9:256^EON5:152^EON1:19 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
90 C1.2w C1.1:256^C1.0:1024^C0.9:256^EON5:260^EON1:26 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
91 C1.3 Промышленная добыча астероидов. Колонии на других планетах родной системы. 1 1 1 1 1 5E+03 1
92 C1.3m C1.2:256^C1.0:1024^C0.9:64^EON5:13^EON1:13 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
93 C1.3b C1.2:256^C1.0:1024^C0.9:64^EON5:22^EON1:22 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
94 C1.3d C1.2:256^C1.0:1024^C0.9:64^EON5:5^EON1:5 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
95 C1.3l C1.2:256^C1.0:1024^C0.9:64^EON5:30^EON1:30 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
96 C1.3c C1.2:256^C1.0:1024^C0.9:64^EON5:64^EON1:64 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
97 C1.3w C1.2:256^C1.0:1024^C0.9:64^EON5:100^EON1:100 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
98 C1.4 Сбор вещества из атмосфер газовых гигантов. 1 1 1 1 1 5E+03 1
99 C1.4m C1.3:384^C1.0:896^EON5:6^EON1:21 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
100 C1.4b C1.3:384^C1.0:896^EON5:9^EON1:43 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
101 C1.4d C1.3:384^C1.0:896^EON5:3^EON1:7 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
102 C1.4l C1.3:384^C1.0:896^EON5:11^EON1:60 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
103 C1.4c C1.3:384^C1.0:896^EON5:19^EON1:152 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
104 C1.4w C1.3:384^C1.0:896^EON5:26^EON1:260 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
105 C1.5 Космические города. Пикотехнологии: управление отдельными атомами. 1 1 1 1 1 5E+03 1
106 C1.5m C1.4:512^C1.0:768^EON5:6^EON1:21 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
107 C1.5b C1.4:512^C1.0:768^EON5:9^EON1:43 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
108 C1.5d C1.4:512^C1.0:768^EON5:3^EON1:7 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
109 C1.5l C1.4:512^C1.0:768^EON5:11^EON1:60 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
110 C1.5c C1.4:512^C1.0:768^EON5:19^EON1:152 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
111 C1.5w C1.4:512^C1.0:768^EON5:26^EON1:260 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
112 C1.6 Промышленное производство антивещества. Первые звездолёты. 1 1 1 1 1 1 5E+03 1
113 C1.6m C1.5:768^C1.0:512^EON5:6^RP:21 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
114 C1.6b C1.5:768^C1.0:512^EON5:9^RP:43 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
115 C1.6d C1.5:768^C1.0:512^EON5:3^RP:7 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
116 C1.6l C1.5:768^C1.0:512^EON5:11^RP:60 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
117 C1.6c C1.5:768^C1.0:512^EON5:19^RP:152 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
118 C1.6w C1.5:768^C1.0:512^EON5:26^RP:260 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
119 C1.7 Терраформинг. Гамма-лазеры. 1 1 1 1 1 1 5E+03 1
120 C1.7m C1.6:896^C1.0:384^EON5:6^RP:21 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
121 C1.7b C1.6:896^C1.0:384^EON5:9^RP:43 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
122 C1.7d C1.6:896^C1.0:384^EON5:3^RP:7 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
123 C1.7l C1.6:896^C1.0:384^EON5:11^RP:60 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
124 C1.7c C1.6:896^C1.0:384^EON5:19^RP:152 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
125 C1.7w C1.6:896^C1.0:384^EON5:26^RP:260 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
126 C1.8 Космические станции континентального масштаба. 1 1 1 1 1 1 5E+03 1
127 C1.8m C1.7:1024^C1.0:256^EON5:6^RP:21 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
128 C1.8b C1.7:1024^C1.0:256^EON5:9^RP:43 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
129 C1.8d C1.7:1024^C1.0:256^EON5:3^RP:7 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
130 C1.8l C1.7:1024^C1.0:256^EON5:11^RP:60 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
131 C1.8c C1.7:1024^C1.0:256^EON5:19^RP:152 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
132 C1.8w C1.7:1024^C1.0:256^EON5:26^RP:260 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
133 C1.9 Частичный рой Дайсона. 1 1 1 1 1 1 5E+03 1
134 C1.9m C1.8:1024^C1.0:128^EON5:6^RP:21 Мистики m 2 1.6 0.009 0.01 0.0000625 0.001024
135 C1.9b C1.8:1024^C1.0:128^EON5:9^RP:43 Строители b 2 1 0.019921875 0.02 0.00003125 0.0025
136 C1.9d C1.8:1024^C1.0:128^EON5:3^RP:7 Дипломаты d 2 1 0.012 0.01538461538 0.0005 0.00015625
137 C1.9l C1.8:1024^C1.0:128^EON5:11^RP:60 Логики l 2 0.5 0.054 0.03571428571 0.0005 0.0025
138 C1.9c C1.8:1024^C1.0:128^EON5:19^RP:152 Колонисты c 2 0.8 0.0225 0.02604166667 0.004096 0.006103515625
139 C1.9w C1.8:1024^C1.0:128^EON5:26^RP:260 Воины w 2 1.25 0.028125 0.03125 0.0005 0.016384
140 C2 Цивилизации, ведущие экспансию к иным звёздам. 0
141 C2.0 1E+00 DwStar Звезда Цивилизация, освоившая энергию родного солнца. 1 1 1 1 1 1 1 1 5E+03 1
142 C2.0m C1.9:1024^C1.0:128^RP:28 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
143 C2.0b C1.9:1024^C1.0:128^EON5:9^RP:59 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
144 C2.0d C1.9:1024^C1.0:128^EON5:3^RP:8 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
145 C2.0l C1.9:1024^C1.0:128^EON5:11^RP:85 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
146 C2.0c C1.9:1024^C1.0:128^EON5:19^RP:235 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
147 C2.0w C1.9:1024^C1.0:128^EON5:26^RP:419 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
148 C2.1 1E+01 DwStar Изменение планетарных орбит. 1 1 1 1 1 1 1 1 5E+03 5.62E-01
149 C2.1m C2.0:1 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
150 C2.1b C2.0:1 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
151 C2.1d C2.0:1 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
152 C2.1l C2.0:1 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
153 C2.1c C2.0:1 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
154 C2.1w C2.0:1 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
155 C2.2 1E+02 DwStar Управление инерцией. 1 1 1 1 1 1 1 1 1E+04 3.16E-01
156 C2.2m C2.1:1024^C2.0:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
157 C2.2b C2.1:1024^C2.0:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
158 C2.2d C2.1:1024^C2.0:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
159 C2.2l C2.1:1024^C2.0:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
160 C2.2c C2.1:1024^C2.0:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
161 C2.2w C2.1:1024^C2.0:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
162 C2.3 1E+03 DwStar Рассеянное звёздное скопление Сбор вещества со звёзд. 1 1 1 1 1 1 1 1 2E+04 1.78E-01
163 C2.3m C2.2:1024^C2.1:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
164 C2.3b C2.2:1024^C2.1:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
165 C2.3d C2.2:1024^C2.1:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
166 C2.3l C2.2:1024^C2.1:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
167 C2.3c C2.2:1024^C2.1:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
168 C2.3w C2.2:1024^C2.1:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
169 C2.4 1E+04 DwStar Малое звёздное скопление Фемтотехнологии: управление отдельными фермионами. 1 1 1 1 1 1 1 1 2E+04 1.00E-01
170 C2.4m C2.3:1024^C2.2:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
171 C2.4b C2.3:1024^C2.2:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
172 C2.4d C2.3:1024^C2.2:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
173 C2.4l C2.3:1024^C2.2:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
174 C2.4c C2.3:1024^C2.2:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
175 C2.4w C2.3:1024^C2.2:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
176 C2.5 1E+05 DwStar Звёздное скопление Деконструкция и сборка планет. 1 1 1 1 1 1 1 1 3E+04 5.62E-02
177 C2.5m C2.4:1024^C2.3:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
178 C2.5b C2.4:1024^C2.3:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
179 C2.5d C2.4:1024^C2.3:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
180 C2.5l C2.4:1024^C2.3:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
181 C2.5c C2.4:1024^C2.3:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
182 C2.5w C2.4:1024^C2.3:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
183 C2.6 1E+06 DwStar Большое звёздное скопление Астроархитектурная доминанта. 1 1 1 1 1 1 1 1 3E+04 3.16E-02
184 C2.6m C2.5:1024^C2.4:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
185 C2.6b C2.5:1024^C2.4:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
186 C2.6d C2.5:1024^C2.4:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
187 C2.6l C2.5:1024^C2.4:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
188 C2.6c C2.5:1024^C2.4:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
189 C2.6w C2.5:1024^C2.4:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
190 C2.7 1E+07 GiStar Гигантское звёздное скопление Освоение ресурсов звёзд-гигантов. 1 1 1 1 1 1 1 1 4E+04 1.78E-02
191 C2.7m C2.6:1024^C2.5:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
192 C2.7b C2.6:1024^C2.5:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
193 C2.7d C2.6:1024^C2.5:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
194 C2.7l C2.6:1024^C2.5:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
195 C2.7c C2.6:1024^C2.5:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
196 C2.7w C2.6:1024^C2.5:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
197 C2.8 1E+08 GiStar Управление гравитацией. 1 1 1 1 1 1 1 1 4E+04 1.00E-02
198 C2.8m C2.7:1024^C2.6:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
199 C2.8b C2.7:1024^C2.6:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
200 C2.8d C2.7:1024^C2.6:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
201 C2.8l C2.7:1024^C2.6:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
202 C2.8c C2.7:1024^C2.6:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
203 C2.8w C2.7:1024^C2.6:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
204 C2.9 1E+09 GiStar Карликовая галактика Перемещение звёзд. 1 1 1 1 1 1 1 1 5E+04 5.62E-03
205 C2.9m C2.8:1024^C2.7:6 Мистики m 2 1.6 0.006 0.01 0.0005 0.00128 1
206 C2.9b C2.8:1024^C2.7:9 Строители b 2 1 0.02125 0.015625 0.00003125 0.0025 0.64
207 C2.9d C2.8:1024^C2.7:3 Дипломаты d 2 1 0.0128 0.01923076923 0.0009765625 0.0003125 2.56
208 C2.9l C2.8:1024^C2.7:11 Логики l 2 0.5 0.0576 0.04464285714 0.0005 0.0025 1.5625
209 C2.9c C2.8:1024^C2.7:19 Колонисты c 2 0.8 0.024 0.04166666667 0.004096 0.006103515625 1
210 C2.9w C2.8:1024^C2.7:26 Воины w 2 1.25 0.03 0.025 0.000256 0.03072 0.25
211 C3 Цивилизации галактического масштаба. 0
212 C3.0 1E+10 GiStar Малая галактика Экспансия в группу галактик. 1 1 1 1 1 1 1 1 1E+05 3.16E-03
213 C3.0m C2.9:1024^C2.8:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
214 C3.0b C2.9:1024^C2.8:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
215 C3.0d C2.9:1024^C2.8:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
216 C3.0l C2.9:1024^C2.8:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
217 C3.0c C2.9:1024^C2.8:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
218 C3.0w C2.9:1024^C2.8:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
219 C3.1 1E+11 GiStar Средняя галактика Создание звёзд. 1 1 1 1 1 1 1 1 1E+05 1.78E-03
220 C3.1m C3.0:1024^C2.9:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
221 C3.1b C3.0:1024^C2.9:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
222 C3.1d C3.0:1024^C2.9:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
223 C3.1l C3.0:1024^C2.9:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
224 C3.1c C3.0:1024^C2.9:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
225 C3.1w C3.0:1024^C2.9:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
226 C3.2 1E+12 WD Большая галактика Использование белых карликов. 1 1 1 1 1 1 1 1 2E+05 1.00E-03
227 C3.2m C3.1:1024^C3.0:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
228 C3.2b C3.1:1024^C3.0:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
229 C3.2d C3.1:1024^C3.0:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
230 C3.2l C3.1:1024^C3.0:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
231 C3.2c C3.1:1024^C3.0:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
232 C3.2w C3.1:1024^C3.0:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
233 C3.3 1E+13 WD Гигантская галактика Создание чёрных дыр из концентрированного излучения. 1 1 1 1 1 1 1 1 3E+05 5.62E-04
234 C3.3m C3.2:1024^C3.1:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
235 C3.3b C3.2:1024^C3.1:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
236 C3.3d C3.2:1024^C3.1:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
237 C3.3l C3.2:1024^C3.1:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
238 C3.3c C3.2:1024^C3.1:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
239 C3.3w C3.2:1024^C3.1:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
240 C3.4 1E+14 WD Группа галактик Экспансия в сверхскопление. 1 1 1 1 1 1 1 1 4E+05 3.16E-04
241 C3.4m C3.3:1024^C3.2:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
242 C3.4b C3.3:1024^C3.2:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
243 C3.4d C3.3:1024^C3.2:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
244 C3.4l C3.3:1024^C3.2:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
245 C3.4c C3.3:1024^C3.2:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
246 C3.4w C3.3:1024^C3.2:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
247 C3.5 1E+15 NS Использование нейтронных звёзд. 1 1 1 1 1 1 1 1 5E+05 1.78E-04
248 C3.5m C3.4:1024^C3.3:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
249 C3.5b C3.4:1024^C3.3:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
250 C3.5d C3.4:1024^C3.3:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
251 C3.5l C3.4:1024^C3.3:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
252 C3.5c C3.4:1024^C3.3:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
253 C3.5w C3.4:1024^C3.3:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
254 C3.6 1E+16 NS Сверхскопление Экспансия в нить. 1 1 1 1 1 1 1 1 6E+05 1.00E-04
255 C3.6m C3.5:1024^C3.4:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
256 C3.6b C3.5:1024^C3.4:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
257 C3.6d C3.5:1024^C3.4:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
258 C3.6l C3.5:1024^C3.4:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
259 C3.6c C3.5:1024^C3.4:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
260 C3.6w C3.5:1024^C3.4:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
261 C3.7 1E+17 MGT Использование магнетаров. 1 1 1 1 1 1 1 1 7E+05 5.62E-05
262 C3.7m C3.6:1024^C3.5:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
263 C3.7b C3.6:1024^C3.5:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
264 C3.7d C3.6:1024^C3.5:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
265 C3.7l C3.6:1024^C3.5:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
266 C3.7c C3.6:1024^C3.5:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
267 C3.7w C3.6:1024^C3.5:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
268 C3.8 1E+18 MGT Галактическая нить Экспансия в великую стену. 1 1 1 1 1 1 1 1 8E+05 3.16E-05
269 C3.8m C3.7:1024^C3.6:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
270 C3.8b C3.7:1024^C3.6:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
271 C3.8d C3.7:1024^C3.6:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
272 C3.8l C3.7:1024^C3.6:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
273 C3.8c C3.7:1024^C3.6:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
274 C3.8w C3.7:1024^C3.6:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
275 C3.9 1E+19 BH Использование чёрных дыр. 1 1 1 1 1 1 1 1 9E+05 1.78E-05
276 C3.9m C3.8:1024^C3.7:6 Мистики m 2 1.6 0.006375 0.01 0.0005 0.00128 1
277 C3.9b C3.8:1024^C3.7:9 Строители b 2 1 0.022578125 0.015625 0.00003125 0.0025 0.64
278 C3.9d C3.8:1024^C3.7:3 Дипломаты d 2 1 0.0136 0.01923076923 0.0009765625 0.0003125 2.56
279 C3.9l C3.8:1024^C3.7:11 Логики l 2 0.5 0.0612 0.04464285714 0.0005 0.0025 1.5625
280 C3.9c C3.8:1024^C3.7:19 Колонисты c 2 0.8 0.0255 0.04166666667 0.004096 0.006103515625 1
281 C3.9w C3.8:1024^C3.7:26 Воины w 2 1.25 0.031875 0.025 0.000256 0.03072 0.25
282 C4 Цивилизации вселенского масштаба. 0
283 C4.0 1E+20 BH Манипуляции со временем. 1 1 1 1 1 1 1 1 2E+06 1.00E-05
284 C4.0m C3.9:1024^C3.8:6 Мистики m 2 1.6 0.00675 0.01 0.0005 0.00128 1
285 C4.0b C3.9:1024^C3.8:9 Строители b 2 1 0.02390625 0.015625 0.00003125 0.0025 0.64
286 C4.0d C3.9:1024^C3.8:3 Дипломаты d 2 1 0.0144 0.01923076923 0.0009765625 0.0003125 2.56
287 C4.0l C3.9:1024^C3.8:11 Логики l 2 0.5 0.0648 0.04464285714 0.0005 0.0025 1.5625
288 C4.0c C3.9:1024^C3.8:19 Колонисты c 2 0.8 0.027 0.04166666667 0.004096 0.006103515625 1
289 C4.0w C3.9:1024^C3.8:26 Воины w 2 1.25 0.03375 0.025 0.000256 0.03072 0.25
290 C4.1 1E+21 BH Великая стена Экспансия на масштабы всей вселенной. 1 1 1 1 1 1 1 1 2E+06 5.62E-06
291 C4.1m C4.0:1024^C3.9:6 Мистики m 2 1.6 0.00675 0.01 0.0005 0.00128 1
292 C4.1b C4.0:1024^C3.9:9 Строители b 2 1 0.02390625 0.015625 0.00003125 0.0025 0.64
293 C4.1d C4.0:1024^C3.9:3 Дипломаты d 2 1 0.0144 0.01923076923 0.0009765625 0.0003125 2.56
294 C4.1l C4.0:1024^C3.9:11 Логики l 2 0.5 0.0648 0.04464285714 0.0005 0.0025 1.5625
295 C4.1c C4.0:1024^C3.9:19 Колонисты c 2 0.8 0.027 0.04166666667 0.004096 0.006103515625 1
296 C4.1w C4.0:1024^C3.9:26 Воины w 2 1.25 0.03375 0.025 0.000256 0.03072 0.25
297 C4.2 1E+22 SMBH Использование сверхмассивных чёрных дыр. 1 1 1 1 1 1 1 1 4E+06 3.16E-06
298 C4.2m C4.1:1024^C4.0:6 Мистики m 2 1.6 0.00675 0.01 0.0005 0.00128 1
299 C4.2b C4.1:1024^C4.0:9 Строители b 2 1 0.02390625 0.015625 0.00003125 0.0025 0.64
300 C4.2d C4.1:1024^C4.0:3 Дипломаты d 2 1 0.0144 0.01923076923 0.0009765625 0.0003125 2.56
301 C4.2l C4.1:1024^C4.0:11 Логики l 2 0.5 0.0648 0.04464285714 0.0005 0.0025 1.5625
302 C4.2c C4.1:1024^C4.0:19 Колонисты c 2 0.8 0.027 0.04166666667 0.004096 0.006103515625 1
303 C4.2w C4.1:1024^C4.0:26 Воины w 2 1.25 0.03375 0.025 0.000256 0.03072 0.25
304 C4.3 1E+23 SMBH Складное пространство. 1 1 1 1 1 1 1 1 6E+06 1.78E-06
305 C4.3m C4.2:1024^C4.1:6 Мистики m 2 1.6 0.00675 0.01 0.0005 0.00128 1
306 C4.3b C4.2:1024^C4.1:9 Строители b 2 1 0.02390625 0.015625 0.00003125 0.0025 0.64
307 C4.3d C4.2:1024^C4.1:3 Дипломаты d 2 1 0.0144 0.01923076923 0.0009765625 0.0003125 2.56
308 C4.3l C4.2:1024^C4.1:11 Логики l 2 0.5 0.0648 0.04464285714 0.0005 0.0025 1.5625
309 C4.3c C4.2:1024^C4.1:19 Колонисты c 2 0.8 0.027 0.04166666667 0.004096 0.006103515625 1
310 C4.3w C4.2:1024^C4.1:26 Воины w 2 1.25 0.03375 0.025 0.000256 0.03072 0.25
311 C4.4 1E+24 SMBH Вселенский пузырь Поле невероятности. 1 1 1 1 1 1 1 1 8E+06 1.00E-06
312 C4.4m C4.3:1024^C4.2:6 Мистики m 2 1.6 0.00675 0.01 0.0005 0.00128 1
313 C4.4b C4.3:1024^C4.2:9 Строители b 2 1 0.02390625 0.015625 0.00003125 0.0025 0.64
314 C4.4d C4.3:1024^C4.2:3 Дипломаты d 2 1 0.0144 0.01923076923 0.0009765625 0.0003125 2.56
315 C4.4l C4.3:1024^C4.2:11 Логики l 2 0.5 0.0648 0.04464285714 0.0005 0.0025 1.5625
316 C4.4c C4.3:1024^C4.2:19 Колонисты c 2 0.8 0.027 0.04166666667 0.004096 0.006103515625 1
317 C4.4w C4.3:1024^C4.2:26 Воины w 2 1.25 0.03375 0.025 0.000256 0.03072 0.25
318 Ct Трансцендентальность. 0 1
-3
View File
@@ -1,3 +0,0 @@
ID | Name | Age | Email
1 | John | 30 | john@example.com
2 | Jane | 25 | jane@example.com
1 ID Name Age Email
2 1 John 30 john@example.com
3 2 Jane 25 jane@example.com
-130
View File
@@ -1,130 +0,0 @@
Owniverse||interface||||
MM-Create||interface||||Menu/en/CreateUniverse
MM-Help||interface||||Menu/en/Tutorial
MM-Achievments||interface||||Menu/en/Achievements
MM-Credits||interface||||Menu/en/Credits
MM-LanguageEn||interface||||Menu/en/EnglishActive
MM-LanguageRu||interface||||Menu/en/Russian
MM-SoundActive||interface||||Menu/en/SoundActive
MM-SoundNonActive||interface||||Menu/en/SoundNonActive
MM-MusicActive||interface||||Menu/en/MusicActive
MM-MusicNonActive||interface||||Menu/en/MusicNonActive
MM-LeaveReality||interface||||Menu/en/LeaveReality
CreditsTitle||interface||||Credits/en/Credits
CreditsRoles||interface||Unitizer <br> Python Tamer <br> Painter <br> Original Score by||
CreditsNames||interface||Kirill Ivlev <br> Ilya Konovalov <br> Dmitry Uvarov <br> Tatyana Stepanenko||
Achievement-Header||interface||||Achievements/en/Achievements
Achievement-Status-Template||interface||Unlocked %Count% of %Total%||
ReportTitle||interface||||Report/en/Title
ReportNewWarning||interface||||Report/en/NewWarning
ReportNewButton||interface||||Report/en/NewButton
ReportWipeWarning||interface||||Report/en/WipeWarning
ReportWipeButton||interface||||Report/en/WipeButton
MF-FBV-ReturnButton||interface||||Dashboard/Indicators/ForceBoxes/En/Return
MF-FBV-OpenBoxButton||interface||||Dashboard/Indicators/ForceBoxes/En/OpenBox
MF-FBV-AcquireButton||interface||||Dashboard/Indicators/ForceBoxes/En/Acquire
MF-FBV-NoAdsDeliveredSign||interface||||Dashboard/Indicators/ForceBoxes/En/NoAds
Universe||interface||||
Time|Time|indicator|AboutTheGame|Time|Change the speed as you like.|
Energy|Enr|indicator|EnergyAndDensity|Energy|Spend on hydrogen and space.|
Density|Den|indicator|EnergyAndDensity|Density|Maintain balance.|
DensityRip|DenR|indicator|EnergyAndDensity|Big Rip|Increase density!|
DensityCrunch|DenC|indicator|EnergyAndDensity|Big Crunch|Decrease density!|
BurnabilityIndicator|Bur|indicator|BurnabilityAndExplosiveness|Burnability|Burning intensity of stars.|
ExplosivenessIndicator|Exp|indicator|BurnabilityAndExplosiveness|Explosiveness|Power of stellar explosions.|
AggressionIndicator|Agg|indicator|AggressionAndTrends|Aggression|Evolution and competition.|
||||1 year per second||
||||10 years per second||
||||100 years per second||
||||1 000 years per second||
||||10 000 years per second||
||||100 000 years per second||
||||1 000 000 years per second||
||||10 000 000 years per second||
||||100 000 000 years per second||
||||1 000 000 000 years per second||
||logtext||Summary of changes in the last 100 seconds.<br>Average values for the year are shown.||
ForceNavigationImage||interface||||BigBang/Dashboard/en/Forces
1-1-1-NavigationResourceImage||interface||||BigBang/Dashboard/en/Resources
Space|S|entity|SpaceAndHydrogen|Space|Needed for placing objects.|
Hydrogen|H|entity|SpaceAndHydrogen|Hydrogen|Used to create clouds and stars.|
Helium|He|entity|HeliumAndMetals|Helium|Saves hydrogen.|
Metals|Met|entity|HeliumAndMetals|Metals|Needed to create planets.|
||||Metallicity||
NavigationStarImage||interface||||BigBang/Dashboard/en/Stars
Nebula|N|entity|Clouds|Nebula|Produces hydrogen.|
Globula|G|entity|Clouds|Globula|Produces more hydrogen.|
StarNursery|STN|entity|Clouds|Star Nursery|Produces hydrogen and stars.|
MolecularCloud|MC|entity|Clouds|Molecular Cloud|Produces a lot of hydrogen.|
ActiveStarNursery|ASTN|entity|Clouds|Active Star Nursery|Produces a lot of hydrogen and stars.|
BrownDwarf|BD|entity|DwarfStars|Brown Dwarf|Useless, but doesn't take up space.|
RedDwarf|RD|entity|DwarfStars|Red Dwarf|The simplest star.|
OrangeDwarf|OD|entity|DwarfStars|Orange Dwarf|Star with planets.|
YellowDwarf|YD|entity|DwarfStars|Yellow Dwarf|Star similar to the Sun.|
WhiteYellowDwarf|WYD|entity|DwarfStars|White-Yellow Dwarf|Star with many planets.|
RedGiant|RG|entity|GiantStars|Red Giant|Degrading old star.|
YellowGiant|YG|entity|GiantStars|Yellow Giant|Optimal for metals production.|
BlueGiant|BG|entity|GiantStars|Blue Giant|Produces metals and space in a balanced manner.|
Supergiant|SG|entity|GiantStars|Supergiant|Produces space and a bit of metals quickly.|
Hypergiant|HG|entity|GiantStars|Hypergiant|Burns violently, creating a lot of space.|
WhiteDwarf|WD|entity|DegenerateObjects|White Dwarf|Remnant of a dwarf star.|
NeutronStar|NS|entity|DegenerateObjects|Neutron Star|Remnant of a burned-out giant.|
Magnetar|MGT|entity|DegenerateObjects|Magnetar|Remnant of a large giant.|
BlackHole|BH|entity|DegenerateObjects|Black Hole|The result of a stellar catastrophe. Needed for structures.|
SupermassiveBlackHole|SMBH|entity|DegenerateObjects|Supermassive Black Hole|Merged from black holes. Needed for galaxies.|
1-3-1-NavigationStructureImage||interface||||BigBang/Dashboard/en/Structures
StarClusterScattered|SCD|entity|StarClusters|Scattered Star Cluster|A little structure of irregular shape.<br>Space: +10%.|
StarClusterSmall|SCS|entity|StarClusters|Small Star Cluster|Has globular shape.<br>Space: +20%.|
StarClusterMedium|SCM|entity|StarClusters|Medium Star Cluster|Noticeable from afar off.<br>Space: +30%.|
StarClusterLarge|SCL|entity|StarClusters|Large Star Cluster|Makes an impression.<br>Space: +50%.|
StarClusterGiant|SCG|entity|StarClusters|Giant Star Cluster|Causes awe.<br>Space: +80%.|
GalaxyEllipticalDwarf|GED|entity|Galaxies|Dwarf Elliptical Galaxy|The size of the Small Magellanic Cloud.<br>Space: +100%.|
GalaxyEllipticalSmall|GES|entity|Galaxies|Small Elliptical Galaxy|The size of the Large Magellanic Cloud.<br>Space: +150%.|
GalaxyEllipticalMedium|GEM|entity|Galaxies|Medium Elliptical Galaxy|The size of the Milky Way.<br>Space: +200%.|
GalaxyEllipticalLarge|GEL|entity|Galaxies|Large Elliptical Galaxy|The size of the Andromeda Galaxy.<br>Space: +300%.|
GalaxyEllipticalGiant|GEG|entity|Galaxies|Giant Elliptical Galaxy|Similar to the IC 1101.<br>Space: +450%.|
GalaxySpiralDwarf|GSD|entity|Galaxies|Dwarf Spiral Galaxy|Similar to the Small Magellanic Cloud.|
GalaxySpiralSmall|GSS|entity|Galaxies|Small Spiral Galaxy|Similar to the Large Magellanic Cloud.|
GalaxySpiralMedium|GSM|entity|Galaxies|Medium Spiral Galaxy|Similar to the Milky Way.|
GalaxySpiralLarge|GSL|entity|Galaxies|Large Spiral Galaxy|Similar to the Andromeda Galaxy.|
GalaxySpiralGiant|GSG|entity|Galaxies|Giant Spiral Galaxy|The size of the IC 1101.|
GalacticGroup|LGG|entity|LargeStructures|Galactic Group|Aggregates galaxies.|
GalacticSupercluster|LSC|entity|LargeStructures|Galactic Supercluster|Basis for the structure of the universe.|
GalacticFilament|LGF|entity|LargeStructures|Galactic Filament|Balances density with voids.|
GalacticWall|LGW|entity|LargeStructures|Great Wall|Creates the structure of the universe.|
UniverseBubble|LUB|entity|LargeStructures|Universe Bubble|That's the extent of it.|
1-4-1-NavigationLifeImage||interface||||BigBang/Dashboard/en/Planets
GasGiant|GG|entity|Planets|Gas Giant|Too big.|
AsteroidBelt|AB|entity|Planets|Asteroids|A bunch of rocks.|
RockyPlanet|RP|entity|Planets|Rocky Planet|Not suitable for life.|
HabitablePlanet|HP|entity|Planets|Habitable Planet|Has the potential for life.|
LivingPlanet|LP|entity|Planets|Living Planet|There is life on this planet!|
|Star|||Star||
|SC|||Star Cluster||
|GAL|||Galaxy||
AboutTheGame||help||About The Game|In this game you can <b>create a universe</b> and control its development. The final goal is designated by yourself. Don't forget to check out the list of game achievements and try to reach some of the ones that seem interesting. Read hints, explore possibilities and don't be afraid to experiment. In the worst case you can always start from scratch.<br><br>Numbers greater than 1 000 are displayed using <b>scientific notation</b>. 1e4 – this is a 10 000, meaning “one with 4 zeroes”. 1e6 – a million, 1e9 – a billion and so on. 13.77e9 – this is 13 billions 770 millions.<br><br>The game plays in <b>real time</b> with changeable scaling. One second of real time can pass a year, a decade, a century and so on. Change the pace of time by using buttons “−” and “+”.|Help/en/AboutTheGame
GameplayBasics||help||Gameplay Basics|You have access to a very large, but still limited <b>cache of energy</b> that is used to create the whole matter in the universe and the expanse of the universe's space itself. At the start of the game the vast majority of this energy is not in your direct control. But during the game you will take more and more energy from the cache. The less filled the cache is, the harder it is to obtain new energy. The energy shortage won’t become an urgent problem in the first billion years or so: the cache is really very large.<br><br>The matter is harvested from the energy cache in the form of <b>hydrogen</b> by clouds. Hydrogen may be spent to create new clouds and also to create stars. During their burning stars create <b>space</b> that can be used to place additional stars and clouds. This creation of space also spends some energy from the cache.|Help/en/GameplayBasics
StarsAndStructures||help||Stars and Structures|The heavier the star is, the faster it burns and the more space it produces. However, on the contrary, the most cost-efficient way of spending hydrogen to obtain new space, is investment into the smallest stars. Unfortunately they burn for a very long time and produce space very slowly. Also each star takes a unit of space, no matter which type the star is.<br><br>There is a reason to arrange stars and nebulae of the growing universe into galaxies and even larger <b>structures</b>. The production of space by stars is increased inside structures.<br><br>The proportion between universe matter and space is called density. The universe is only stable when the <b>density</b> is inside a certain range. If it is too packed or too empty, problems come into being.|Help/en/StarsAndStructures
LifeAndForces||help||Life and Forces|<b>Planets</b> form around certain stars, and life may emerge there. In specific circumstances life can evolve to sapience, and sapience can advance to high technology. Life's next step is to try to reclaim the universe, which she assumes as her own.<br><br>There are many events in the universe that don't happen all the time, only with certain probability. You have access to special <b>forces</b>, which you can use to “tweak” chances of events that are important to you, changing the laws of nature in the process.|Help/en/LifeAndForces
Achievements||help||Achievements|During the gameplay you will definitely be able to reach certain <b>achievements</b>. While simpler ones come by themselves, ones that are more complex may be more tricky. You can use the achievements list as a roadmap of hints and suggestions for possible next steps.<br><br>It is unnecessary to try to finish each and every achievement. This is your own universe and you can do whatever you like with it. However, achievements are a nice thing in general, and besides just having a personal feeling of pride and accomplishment you can easily <b>share</b> it with friends!|Help/en/Achievements
Karma||help||Karma|Each obtained achievement grants you a certain number of <b>karmic points</b>. During the new universe creation you may spend these points to gain some small bonuses that will definitely help you to gain better results.<br><br>Spent karmic points are not lost: they will be <b>available</b> for spending again in the next universe. There is a chance that there will be even more of them at that moment.|Help/en/Karma
Gauges||help||Gauges|<b>Gauges</b> of measures that are especially important for an active objects page are located on the dashboard. To check other gauges just swipe the page.|Help/en/Gauges
EnergyAndDensity||help||Energy and Density|<b>Energy</b> from the cache is converted into hydrogen and space. The lower the proportion of remaining cache, indicated in the middle of the bar, the lower is the efficiency of the resource generators, such as clouds for hydrogen and stars for space.<br>The energy cache really is immense, however it is not infinite.<br><br>Average <b>density</b> of the universe is the ratio of total matter mass, meaning all stars, clouds and so on, to the empty space. It increases alongside the mass and decreases when the space grows. If the “ρ” gauge will leave the “middle zone” and become inclined to any of the two extremeties, then the outcome might surprise you in a bad way.|Help/en/EnergyAndDensity
BurnabilityAndExplosiveness||help||Burnability and Explosiveness|<b>Burnability</b> displays the current burning rate of stars. It can be influenced by the universe density (the denser the greater), the actions of superadvanced civilizations and the forces used by the player.<br><br><b>Explosiveness</b> displays the current probability of the gamma-ray bursts and the space yield produced by any sort of star collapses. It can be influenced by universe density (the denser the lower), actions of superadvanced civilizations and forces used by the player.|Help/en/BurnabilityAndExplosiveness
AggressionAndTrends||help||Aggression and Trends|<b>Aggression</b> displays the intensity of competition between species, civilizations and their inner factions. It governs the progress and stability of life and societies. It can be influenced by universal trends and forces used by the player.<br>By default the average universal aggression is shown. But you can select any civilization level and observe the average aggression for this level, which can be different from the universal one.<br><br><b>Trends</b> are the results of prolonged civilization influences. There are five trends in total.|Help/en/AggressionAndTrends
SpaceAndHydrogen||help||Space and Hydrogen|The majority of creative actions require spending <b>resources</b>.<br><br><b>Space</b> is needed to place everything you are creating. To add new space lit up some stars! Also don't forget to combine the created stars into structures to get even more space.<br><br><b>Hydrogen</b> is required to create nebulae and stars. Nebulae allow you to obtain more hydrogen. Stars are used to make more space and also to harbor planets. Both of these object types also serve as building blocks to create more complex structures.|Help/en/SpaceAndHydrogen
HeliumAndMetals||help||Helium and Metals|Helium and metals are obtained when stars finish their life cycle.<br><b>Helium</b> is not especially useful, but it is inevitable. It is automatically spent in a line of hydrogen if possible, conserving the more valuable resource.<br><br><b>Metals</b> “contaminate” your hydrogen and helium by heavier elements. And usually it is a good thing, because the high proportion of metals to hydrogen and helium, also known as “metallicity”, provides for a greater chance for planets to emerge near new stars.<br>Metals are added when stars burn out, especially larger ones. But total metellicity may shrink down when the universe is filled by new objects made from pure hydrogen and helium, such as nebulae and stars.|Help/en/HeliumAndMetals
Clouds||help||Clouds|Clouds are used to produce hydrogen, which is required to construct the universe. Simplest nebulae can be arranged into more complex cloud structures.<br><br><b>Nebula:</b> the simplest of clouds.<br><b>Globula:</b> provides hydrogen at a slower rate than nebulae, but persists for longer, and also takes less space. Used in creation of larger clouds.<br><b>Star nursery:</b> automatically creates stars from a fraction of provided hydrogen.<br><b>Molecular cloud:</b> large and long-lasting hydrogen generator.<br><b>Active star nursery:</b> very large automatic hydrogen and stars generator.|Help/en/Clouds
DwarfStars||help||Dwarf Stars|Dwarf stars are cheap, they last for a long time and produce space efficiently. They can have planets that sometimes may harbor life at some point.<br><br><b>Brown dwarf:</b> useless rejects that happen during the star creation process. They appear by themselves and do not take space as opposed to all the other stars. Can’t be created manually, and you don’t need to.<br><b>Red dwarf:</b> It is cost-effective in space creation, but works very slowly.<br><b>Orange dwarf:</b> perfect for the development of life.<br><b>Yellow dwarf:</b> good for the emergence of life.<br><b>White-yellow dwarf:</b> has a largest habitable zone, but burns out rapidly.|Help/en/DwarfStars
GiantStars||help||Giant Stars|Giant stars burn rapidly and produce a lot of space. At the end of their existence they collapse. These events can damage planets at nearby stars, but they produce metals.<br><br><b>Red giant:</b> a star that has consumed the majority of its fuel. You can’t create these manually, they emerge themselves.<br><b>Yellow giant:</b> the most modest of giant stars. Produces a lot of metals, collapse is weak.<br><b>Blue giant:</b> a common giant star. Produces a good amount of space and metals. Collapse is average.<br><b>Supergiant:</b> huge giant star. Lives short, collapses violently, produces a lot of space and few metals.<br><b>Hypergiant:</b> extremely giant star. Always collapses into a black hole, producing a huge amount of space, which is accompanied by insane destruction.|Help/en/GiantStars
DegenerateObjects||help||Degenerate Objects|Stars that have exhausted their fusion fuel. They occupy space and do not produce anything, but can be used in forming structures.<br><br><b>White dwarf:</b> the remains of a dwarf star.<br><b>Neutron star:</b> exceptionally compact remains of a giant star.<br><b>Magnetar:</b> the most dense object that is not a black hole.<br><b>Black hole:</b> the remains of a giant star that experienced a destructive collapse. They may be merged into supermassive black holes.<br><b>Supermassive black hole:</b> the result of multitudes of the stellar mass black holes merged into one. Required for galactic formation. They do grow in time, consuming other stars, but do so very slowly.|Help/en/DegenerateObjects
StarClusters||help||Star Clusters|Star clusters are the most modest of available structures. As a matter of fact these are just a lot of stars which are co-located closer to each other than usual, and therefore they are gravitationally bound. But even such simple lumps already bring noticeable variety into the homogenous landscape of the universe.<br><br><b>Scattered:</b> little structure of irregular shape.<br><b>Small:</b> globular shape.<br><b>Medium:</b> noticeable from afar off.<br><b>Large:</b> makes an impression.<br><b>Giant:</b> causes awe.<br><br>Clusters, like other structures, increase the production of space for their constituent stars. Stars in structures exist as usual. Over time, the clusters disintegrate, releasing the stars they are composed of. Large clusters last longer than small ones and provide a larger bonus to space production.|Help/en/StarClusters
Galaxies||help||Galaxies|<b>Elliptical galaxies</b> resemble colossal star clusters. They have lenticular shapes, rotate slowly and look very much alike to each other. The stars in them produce more space than in spiral galaxies. Gradually, elliptical galaxies disintegrate into separate stars.<br><br><b>Spiral galaxies</b> spin faster than elliptical ones, they have diverse structures with arms and keep active star formation. They are better fit for the emergence and development of life. In time spiral galaxies exhaust their storage of free gas, they slow down and become more stable and boring ellipticals.<br><br>As in the case of other structures, the stars included in the composition of galaxies continue to function as usual. They produce space, and dwarf stars can have planets.|Help/en/Galaxies
LargeStructures||help||Large Structures|<b>Large structures</b> are called that for a reason: whole galaxies are used there as building blocks. They are needed to arrange the universe on the largest scales. Without them the space, uniformly filled by stars and galaxies, becomes too monotonous and sparse, meanwile these structures create a packing gradient with more and less dense regions. This arrangement is better fit for being claimed and developed by superadvanced sapient beings.<br><br>Over time, large structures disintegrate into their components, but this does not happen very soon.|Help/en/LargeStructures
Planets||help||Planets|Planets emerge around dwarf stars when metals are sufficient. In a sense all this space construction is being made with a purpose of making planets with potential of bearing life.<br><br><b>Gas giant:</b> large planet with a very thick atmosphere, unsuitable for life.<br><b>Asteroid belt:</b> a bunch of rocks that lacks mass to form a planet.<br><b>Rocky planet:</b> a planet unsuitable for life. Too cold, hot or wrong chemical makeup.<br><b>Habitable planet:</b> there is liquid water here and life may emerge in the long run.<br><b>Living planet:</b> denizens of this planet show great promise!|Help/en/Planets
Eons||help||Eons|Life slowly evolves through eons from the most primitive one to the one with sapience potential. Not all planets are successful in completing this process to the end, because stars do not burn forever.<br><br><b>Archean:</b> it is difficult to notice, but these planets are full of archaea and cyanobacteria.<br><b>Paleozoic:</b> alongside ubiquitous amoeba these planets host algae, sponges and even molluscs.<br><b>Proterozoic:</b> ferns, worms, trilobites and fishes.<br><b>Mezozoic:</b> conifers, lizards, dinosaurs and therapsids.<br><b>Cenozoic:</b> flowering plants and various mammals, some of which show signs of sapience.|Help/en/Eons
Type0Civilizations||help||Type 0 Civilizations|Pre-space epoch – from a tribe to a federation.<br><br><b>c0.0:</b> Lower Paleolithic. Control of fire, stone tools.<br><b>c0.1:</b> Middle Paleolithic. Developed stone tools.<br><b>c0.2:</b> Upper Paleolithic. Advanced stone tools, art.<br><b>c0.3:</b> Mesolithic. Bow and arrows, fishing, boats.<br><b>c0.4:</b> Early Neolithic. Agriculture.<br><b>c0.5:</b> Middle Neolithic. Animal husbandry, ceramics.<br><b>c0.6:</b> Late Neolithic. Large settlements.<br><b>c0.7:</b> First kingdoms of copper and bronze ages. Wheel.<br><b>c0.8:</b> Ancient empires of the iron age. Philosophy.<br><b>c0.9:</b> Industrial age. Electronics and nuclear energy.|Help/en/Type0Civilizations
Type1Civilizations||help||Type 1 Civilizations|Civilizations are busy with settling their own solar system.<br><br><b>c1.0:</b> A civilization that has completely mastered its home planet. Superconductivity, controlled nuclear fusion.<br><b>c1.1:</b> Research compounds in the home system. Launch loop, space elevator.<br><b>c1.2:</b> Complete genetic tailoring. Cyborgization.<br><b>c1.3:</b> Industrial asteroid mining. Colonies on the other planets of the home system.<br><b>c1.4:</b> Harvesting of matter from atmospheres of gas giants.<br><b>c1.5:</b> Space cities. Picotechnologies.<br><b>c1.6:</b> Industrial manufacturing of antimatter. First starships.<br><b>c1.7:</b> Terraforming. Gamma-lasers.<br><b>c1.8:</b> Space stations of continental scale.<br><b>c1.9:</b> Partial Dyson swarm.|Help/en/Type1Civilizations
Type2Civilizations||help||Type 2 Civilizations|Civilizations that can expand to other stars.<br><br><b>c2.0:</b> A civilization that completely exploits the energy output of its own sun.<br><b>c2.1:</b> Change of planetary orbits.<br><b>c2.2:</b> Control over inertia.<br><b>c2.3:</b> Starlifting, harvesting matter from stars.<br><b>c2.4:</b> Femtotechnologies: manipulations on individual fermions.<br><b>c2.5:</b> Deconstruction and creation of planets.<br><b>c2.6:</b> Complete domination of astroarchitecture over planets.<br><b>c2.7:</b> Giant stars resources exploitation.<br><b>c2.8:</b> Control over gravity.<br><b>c2.9:</b> Movement of stars.|Help/en/Type2Civilizations
Type3Civilizations||help||Type 3 Civilizations|Civilizations of galactic scale.<br><br><b>c3.0:</b> Expansion into a galactic group is available.<br><b>c3.1:</b> Creation of stars.<br><b>c3.2:</b> Utilization of white dwarfs.<br><b>c3.3:</b> Creation of black holes by focused radiation.<br><b>c3.4:</b> Expansion into a galactic supercluster is available.<br><b>c3.5:</b> Utilization of neutron stars.<br><b>c3.6:</b> Expansion into a galactic filament is available.<br><b>c3.7:</b> Utilization of magnetars.<br><b>c3.8:</b> Expansion into a great wall is available.<br><b>c3.9:</b> Utilization of black holes.|Help/en/Type3Civilizations
Type4Civilizations||help||Type 4 Civilizations|Civilizations of the universe scale.<br><br><b>c4.0:</b> Temporal manipulations.<br><b>c4.1:</b> Expansion into the whole universe scale is available.<br><b>c4.2:</b> Utilization of supermassive black holes.<br><b>c4.3:</b> Folding space.<br><b>c4.4:</b> Improbability field.<br><br>And so on, bigger and bigger, so long as there is space.|Help/en/Type4Civilizations
1 Owniverse interface
2 MM-Create interface Menu/en/CreateUniverse
3 MM-Help interface Menu/en/Tutorial
4 MM-Achievments interface Menu/en/Achievements
5 MM-Credits interface Menu/en/Credits
6 MM-LanguageEn interface Menu/en/EnglishActive
7 MM-LanguageRu interface Menu/en/Russian
8 MM-SoundActive interface Menu/en/SoundActive
9 MM-SoundNonActive interface Menu/en/SoundNonActive
10 MM-MusicActive interface Menu/en/MusicActive
11 MM-MusicNonActive interface Menu/en/MusicNonActive
12 MM-LeaveReality interface Menu/en/LeaveReality
13 CreditsTitle interface Credits/en/Credits
14 CreditsRoles interface Unitizer <br> Python Tamer <br> Painter <br> Original Score by
15 CreditsNames interface Kirill Ivlev <br> Ilya Konovalov <br> Dmitry Uvarov <br> Tatyana Stepanenko
16 Achievement-Header interface Achievements/en/Achievements
17 Achievement-Status-Template interface Unlocked %Count% of %Total%
18 ReportTitle interface Report/en/Title
19 ReportNewWarning interface Report/en/NewWarning
20 ReportNewButton interface Report/en/NewButton
21 ReportWipeWarning interface Report/en/WipeWarning
22 ReportWipeButton interface Report/en/WipeButton
23 MF-FBV-ReturnButton interface Dashboard/Indicators/ForceBoxes/En/Return
24 MF-FBV-OpenBoxButton interface Dashboard/Indicators/ForceBoxes/En/OpenBox
25 MF-FBV-AcquireButton interface Dashboard/Indicators/ForceBoxes/En/Acquire
26 MF-FBV-NoAdsDeliveredSign interface Dashboard/Indicators/ForceBoxes/En/NoAds
27 Universe interface
28 Time Time indicator AboutTheGame Time Change the speed as you like.
29 Energy Enr indicator EnergyAndDensity Energy Spend on hydrogen and space.
30 Density Den indicator EnergyAndDensity Density Maintain balance.
31 DensityRip DenR indicator EnergyAndDensity Big Rip Increase density!
32 DensityCrunch DenC indicator EnergyAndDensity Big Crunch Decrease density!
33 BurnabilityIndicator Bur indicator BurnabilityAndExplosiveness Burnability Burning intensity of stars.
34 ExplosivenessIndicator Exp indicator BurnabilityAndExplosiveness Explosiveness Power of stellar explosions.
35 AggressionIndicator Agg indicator AggressionAndTrends Aggression Evolution and competition.
36 1 year per second
37 10 years per second
38 100 years per second
39 1 000 years per second
40 10 000 years per second
41 100 000 years per second
42 1 000 000 years per second
43 10 000 000 years per second
44 100 000 000 years per second
45 1 000 000 000 years per second
46 logtext Summary of changes in the last 100 seconds.<br>Average values for the year are shown.
47 ForceNavigationImage interface BigBang/Dashboard/en/Forces
48 1-1-1-NavigationResourceImage interface BigBang/Dashboard/en/Resources
49 Space S entity SpaceAndHydrogen Space Needed for placing objects.
50 Hydrogen H entity SpaceAndHydrogen Hydrogen Used to create clouds and stars.
51 Helium He entity HeliumAndMetals Helium Saves hydrogen.
52 Metals Met entity HeliumAndMetals Metals Needed to create planets.
53 Metallicity
54 NavigationStarImage interface BigBang/Dashboard/en/Stars
55 Nebula N entity Clouds Nebula Produces hydrogen.
56 Globula G entity Clouds Globula Produces more hydrogen.
57 StarNursery STN entity Clouds Star Nursery Produces hydrogen and stars.
58 MolecularCloud MC entity Clouds Molecular Cloud Produces a lot of hydrogen.
59 ActiveStarNursery ASTN entity Clouds Active Star Nursery Produces a lot of hydrogen and stars.
60 BrownDwarf BD entity DwarfStars Brown Dwarf Useless, but doesn't take up space.
61 RedDwarf RD entity DwarfStars Red Dwarf The simplest star.
62 OrangeDwarf OD entity DwarfStars Orange Dwarf Star with planets.
63 YellowDwarf YD entity DwarfStars Yellow Dwarf Star similar to the Sun.
64 WhiteYellowDwarf WYD entity DwarfStars White-Yellow Dwarf Star with many planets.
65 RedGiant RG entity GiantStars Red Giant Degrading old star.
66 YellowGiant YG entity GiantStars Yellow Giant Optimal for metals production.
67 BlueGiant BG entity GiantStars Blue Giant Produces metals and space in a balanced manner.
68 Supergiant SG entity GiantStars Supergiant Produces space and a bit of metals quickly.
69 Hypergiant HG entity GiantStars Hypergiant Burns violently, creating a lot of space.
70 WhiteDwarf WD entity DegenerateObjects White Dwarf Remnant of a dwarf star.
71 NeutronStar NS entity DegenerateObjects Neutron Star Remnant of a burned-out giant.
72 Magnetar MGT entity DegenerateObjects Magnetar Remnant of a large giant.
73 BlackHole BH entity DegenerateObjects Black Hole The result of a stellar catastrophe. Needed for structures.
74 SupermassiveBlackHole SMBH entity DegenerateObjects Supermassive Black Hole Merged from black holes. Needed for galaxies.
75 1-3-1-NavigationStructureImage interface BigBang/Dashboard/en/Structures
76 StarClusterScattered SCD entity StarClusters Scattered Star Cluster A little structure of irregular shape.<br>Space: +10%.
77 StarClusterSmall SCS entity StarClusters Small Star Cluster Has globular shape.<br>Space: +20%.
78 StarClusterMedium SCM entity StarClusters Medium Star Cluster Noticeable from afar off.<br>Space: +30%.
79 StarClusterLarge SCL entity StarClusters Large Star Cluster Makes an impression.<br>Space: +50%.
80 StarClusterGiant SCG entity StarClusters Giant Star Cluster Causes awe.<br>Space: +80%.
81 GalaxyEllipticalDwarf GED entity Galaxies Dwarf Elliptical Galaxy The size of the Small Magellanic Cloud.<br>Space: +100%.
82 GalaxyEllipticalSmall GES entity Galaxies Small Elliptical Galaxy The size of the Large Magellanic Cloud.<br>Space: +150%.
83 GalaxyEllipticalMedium GEM entity Galaxies Medium Elliptical Galaxy The size of the Milky Way.<br>Space: +200%.
84 GalaxyEllipticalLarge GEL entity Galaxies Large Elliptical Galaxy The size of the Andromeda Galaxy.<br>Space: +300%.
85 GalaxyEllipticalGiant GEG entity Galaxies Giant Elliptical Galaxy Similar to the IC 1101.<br>Space: +450%.
86 GalaxySpiralDwarf GSD entity Galaxies Dwarf Spiral Galaxy Similar to the Small Magellanic Cloud.
87 GalaxySpiralSmall GSS entity Galaxies Small Spiral Galaxy Similar to the Large Magellanic Cloud.
88 GalaxySpiralMedium GSM entity Galaxies Medium Spiral Galaxy Similar to the Milky Way.
89 GalaxySpiralLarge GSL entity Galaxies Large Spiral Galaxy Similar to the Andromeda Galaxy.
90 GalaxySpiralGiant GSG entity Galaxies Giant Spiral Galaxy The size of the IC 1101.
91 GalacticGroup LGG entity LargeStructures Galactic Group Aggregates galaxies.
92 GalacticSupercluster LSC entity LargeStructures Galactic Supercluster Basis for the structure of the universe.
93 GalacticFilament LGF entity LargeStructures Galactic Filament Balances density with voids.
94 GalacticWall LGW entity LargeStructures Great Wall Creates the structure of the universe.
95 UniverseBubble LUB entity LargeStructures Universe Bubble That's the extent of it.
96 1-4-1-NavigationLifeImage interface BigBang/Dashboard/en/Planets
97 GasGiant GG entity Planets Gas Giant Too big.
98 AsteroidBelt AB entity Planets Asteroids A bunch of rocks.
99 RockyPlanet RP entity Planets Rocky Planet Not suitable for life.
100 HabitablePlanet HP entity Planets Habitable Planet Has the potential for life.
101 LivingPlanet LP entity Planets Living Planet There is life on this planet!
102 Star Star
103 SC Star Cluster
104 GAL Galaxy
105 AboutTheGame help About The Game In this game you can <b>create a universe</b> and control its development. The final goal is designated by yourself. Don't forget to check out the list of game achievements and try to reach some of the ones that seem interesting. Read hints, explore possibilities and don't be afraid to experiment. In the worst case you can always start from scratch.<br><br>Numbers greater than 1 000 are displayed using <b>scientific notation</b>. 1e4 – this is a 10 000, meaning “one with 4 zeroes”. 1e6 – a million, 1e9 – a billion and so on. 13.77e9 – this is 13 billions 770 millions.<br><br>The game plays in <b>real time</b> with changeable scaling. One second of real time can pass a year, a decade, a century and so on. Change the pace of time by using buttons “−” and “+”. Help/en/AboutTheGame
106 GameplayBasics help Gameplay Basics You have access to a very large, but still limited <b>cache of energy</b> that is used to create the whole matter in the universe and the expanse of the universe's space itself. At the start of the game the vast majority of this energy is not in your direct control. But during the game you will take more and more energy from the cache. The less filled the cache is, the harder it is to obtain new energy. The energy shortage won’t become an urgent problem in the first billion years or so: the cache is really very large.<br><br>The matter is harvested from the energy cache in the form of <b>hydrogen</b> by clouds. Hydrogen may be spent to create new clouds and also to create stars. During their burning stars create <b>space</b> that can be used to place additional stars and clouds. This creation of space also spends some energy from the cache. Help/en/GameplayBasics
107 StarsAndStructures help Stars and Structures The heavier the star is, the faster it burns and the more space it produces. However, on the contrary, the most cost-efficient way of spending hydrogen to obtain new space, is investment into the smallest stars. Unfortunately they burn for a very long time and produce space very slowly. Also each star takes a unit of space, no matter which type the star is.<br><br>There is a reason to arrange stars and nebulae of the growing universe into galaxies and even larger <b>structures</b>. The production of space by stars is increased inside structures.<br><br>The proportion between universe matter and space is called density. The universe is only stable when the <b>density</b> is inside a certain range. If it is too packed or too empty, problems come into being. Help/en/StarsAndStructures
108 LifeAndForces help Life and Forces <b>Planets</b> form around certain stars, and life may emerge there. In specific circumstances life can evolve to sapience, and sapience can advance to high technology. Life's next step is to try to reclaim the universe, which she assumes as her own.<br><br>There are many events in the universe that don't happen all the time, only with certain probability. You have access to special <b>forces</b>, which you can use to “tweak” chances of events that are important to you, changing the laws of nature in the process. Help/en/LifeAndForces
109 Achievements help Achievements During the gameplay you will definitely be able to reach certain <b>achievements</b>. While simpler ones come by themselves, ones that are more complex may be more tricky. You can use the achievements list as a roadmap of hints and suggestions for possible next steps.<br><br>It is unnecessary to try to finish each and every achievement. This is your own universe and you can do whatever you like with it. However, achievements are a nice thing in general, and besides just having a personal feeling of pride and accomplishment you can easily <b>share</b> it with friends! Help/en/Achievements
110 Karma help Karma Each obtained achievement grants you a certain number of <b>karmic points</b>. During the new universe creation you may spend these points to gain some small bonuses that will definitely help you to gain better results.<br><br>Spent karmic points are not lost: they will be <b>available</b> for spending again in the next universe. There is a chance that there will be even more of them at that moment. Help/en/Karma
111 Gauges help Gauges <b>Gauges</b> of measures that are especially important for an active objects page are located on the dashboard. To check other gauges just swipe the page. Help/en/Gauges
112 EnergyAndDensity help Energy and Density <b>Energy</b> from the cache is converted into hydrogen and space. The lower the proportion of remaining cache, indicated in the middle of the bar, the lower is the efficiency of the resource generators, such as clouds for hydrogen and stars for space.<br>The energy cache really is immense, however it is not infinite.<br><br>Average <b>density</b> of the universe is the ratio of total matter mass, meaning all stars, clouds and so on, to the empty space. It increases alongside the mass and decreases when the space grows. If the “ρ” gauge will leave the “middle zone” and become inclined to any of the two extremeties, then the outcome might surprise you in a bad way. Help/en/EnergyAndDensity
113 BurnabilityAndExplosiveness help Burnability and Explosiveness <b>Burnability</b> displays the current burning rate of stars. It can be influenced by the universe density (the denser the greater), the actions of superadvanced civilizations and the forces used by the player.<br><br><b>Explosiveness</b> displays the current probability of the gamma-ray bursts and the space yield produced by any sort of star collapses. It can be influenced by universe density (the denser the lower), actions of superadvanced civilizations and forces used by the player. Help/en/BurnabilityAndExplosiveness
114 AggressionAndTrends help Aggression and Trends <b>Aggression</b> displays the intensity of competition between species, civilizations and their inner factions. It governs the progress and stability of life and societies. It can be influenced by universal trends and forces used by the player.<br>By default the average universal aggression is shown. But you can select any civilization level and observe the average aggression for this level, which can be different from the universal one.<br><br><b>Trends</b> are the results of prolonged civilization influences. There are five trends in total. Help/en/AggressionAndTrends
115 SpaceAndHydrogen help Space and Hydrogen The majority of creative actions require spending <b>resources</b>.<br><br><b>Space</b> is needed to place everything you are creating. To add new space lit up some stars! Also don't forget to combine the created stars into structures to get even more space.<br><br><b>Hydrogen</b> is required to create nebulae and stars. Nebulae allow you to obtain more hydrogen. Stars are used to make more space and also to harbor planets. Both of these object types also serve as building blocks to create more complex structures. Help/en/SpaceAndHydrogen
116 HeliumAndMetals help Helium and Metals Helium and metals are obtained when stars finish their life cycle.<br><b>Helium</b> is not especially useful, but it is inevitable. It is automatically spent in a line of hydrogen if possible, conserving the more valuable resource.<br><br><b>Metals</b> “contaminate” your hydrogen and helium by heavier elements. And usually it is a good thing, because the high proportion of metals to hydrogen and helium, also known as “metallicity”, provides for a greater chance for planets to emerge near new stars.<br>Metals are added when stars burn out, especially larger ones. But total metellicity may shrink down when the universe is filled by new objects made from pure hydrogen and helium, such as nebulae and stars. Help/en/HeliumAndMetals
117 Clouds help Clouds Clouds are used to produce hydrogen, which is required to construct the universe. Simplest nebulae can be arranged into more complex cloud structures.<br><br><b>Nebula:</b> the simplest of clouds.<br><b>Globula:</b> provides hydrogen at a slower rate than nebulae, but persists for longer, and also takes less space. Used in creation of larger clouds.<br><b>Star nursery:</b> automatically creates stars from a fraction of provided hydrogen.<br><b>Molecular cloud:</b> large and long-lasting hydrogen generator.<br><b>Active star nursery:</b> very large automatic hydrogen and stars generator. Help/en/Clouds
118 DwarfStars help Dwarf Stars Dwarf stars are cheap, they last for a long time and produce space efficiently. They can have planets that sometimes may harbor life at some point.<br><br><b>Brown dwarf:</b> useless rejects that happen during the star creation process. They appear by themselves and do not take space as opposed to all the other stars. Can’t be created manually, and you don’t need to.<br><b>Red dwarf:</b> It is cost-effective in space creation, but works very slowly.<br><b>Orange dwarf:</b> perfect for the development of life.<br><b>Yellow dwarf:</b> good for the emergence of life.<br><b>White-yellow dwarf:</b> has a largest habitable zone, but burns out rapidly. Help/en/DwarfStars
119 GiantStars help Giant Stars Giant stars burn rapidly and produce a lot of space. At the end of their existence they collapse. These events can damage planets at nearby stars, but they produce metals.<br><br><b>Red giant:</b> a star that has consumed the majority of its fuel. You can’t create these manually, they emerge themselves.<br><b>Yellow giant:</b> the most modest of giant stars. Produces a lot of metals, collapse is weak.<br><b>Blue giant:</b> a common giant star. Produces a good amount of space and metals. Collapse is average.<br><b>Supergiant:</b> huge giant star. Lives short, collapses violently, produces a lot of space and few metals.<br><b>Hypergiant:</b> extremely giant star. Always collapses into a black hole, producing a huge amount of space, which is accompanied by insane destruction. Help/en/GiantStars
120 DegenerateObjects help Degenerate Objects Stars that have exhausted their fusion fuel. They occupy space and do not produce anything, but can be used in forming structures.<br><br><b>White dwarf:</b> the remains of a dwarf star.<br><b>Neutron star:</b> exceptionally compact remains of a giant star.<br><b>Magnetar:</b> the most dense object that is not a black hole.<br><b>Black hole:</b> the remains of a giant star that experienced a destructive collapse. They may be merged into supermassive black holes.<br><b>Supermassive black hole:</b> the result of multitudes of the stellar mass black holes merged into one. Required for galactic formation. They do grow in time, consuming other stars, but do so very slowly. Help/en/DegenerateObjects
121 StarClusters help Star Clusters Star clusters are the most modest of available structures. As a matter of fact these are just a lot of stars which are co-located closer to each other than usual, and therefore they are gravitationally bound. But even such simple lumps already bring noticeable variety into the homogenous landscape of the universe.<br><br><b>Scattered:</b> little structure of irregular shape.<br><b>Small:</b> globular shape.<br><b>Medium:</b> noticeable from afar off.<br><b>Large:</b> makes an impression.<br><b>Giant:</b> causes awe.<br><br>Clusters, like other structures, increase the production of space for their constituent stars. Stars in structures exist as usual. Over time, the clusters disintegrate, releasing the stars they are composed of. Large clusters last longer than small ones and provide a larger bonus to space production. Help/en/StarClusters
122 Galaxies help Galaxies <b>Elliptical galaxies</b> resemble colossal star clusters. They have lenticular shapes, rotate slowly and look very much alike to each other. The stars in them produce more space than in spiral galaxies. Gradually, elliptical galaxies disintegrate into separate stars.<br><br><b>Spiral galaxies</b> spin faster than elliptical ones, they have diverse structures with arms and keep active star formation. They are better fit for the emergence and development of life. In time spiral galaxies exhaust their storage of free gas, they slow down and become more stable and boring ellipticals.<br><br>As in the case of other structures, the stars included in the composition of galaxies continue to function as usual. They produce space, and dwarf stars can have planets. Help/en/Galaxies
123 LargeStructures help Large Structures <b>Large structures</b> are called that for a reason: whole galaxies are used there as building blocks. They are needed to arrange the universe on the largest scales. Without them the space, uniformly filled by stars and galaxies, becomes too monotonous and sparse, meanwile these structures create a packing gradient with more and less dense regions. This arrangement is better fit for being claimed and developed by superadvanced sapient beings.<br><br>Over time, large structures disintegrate into their components, but this does not happen very soon. Help/en/LargeStructures
124 Planets help Planets Planets emerge around dwarf stars when metals are sufficient. In a sense all this space construction is being made with a purpose of making planets with potential of bearing life.<br><br><b>Gas giant:</b> large planet with a very thick atmosphere, unsuitable for life.<br><b>Asteroid belt:</b> a bunch of rocks that lacks mass to form a planet.<br><b>Rocky planet:</b> a planet unsuitable for life. Too cold, hot or wrong chemical makeup.<br><b>Habitable planet:</b> there is liquid water here and life may emerge in the long run.<br><b>Living planet:</b> denizens of this planet show great promise! Help/en/Planets
125 Eons help Eons Life slowly evolves through eons from the most primitive one to the one with sapience potential. Not all planets are successful in completing this process to the end, because stars do not burn forever.<br><br><b>Archean:</b> it is difficult to notice, but these planets are full of archaea and cyanobacteria.<br><b>Paleozoic:</b> alongside ubiquitous amoeba these planets host algae, sponges and even molluscs.<br><b>Proterozoic:</b> ferns, worms, trilobites and fishes.<br><b>Mezozoic:</b> conifers, lizards, dinosaurs and therapsids.<br><b>Cenozoic:</b> flowering plants and various mammals, some of which show signs of sapience. Help/en/Eons
126 Type0Civilizations help Type 0 Civilizations Pre-space epoch – from a tribe to a federation.<br><br><b>c0.0:</b> Lower Paleolithic. Control of fire, stone tools.<br><b>c0.1:</b> Middle Paleolithic. Developed stone tools.<br><b>c0.2:</b> Upper Paleolithic. Advanced stone tools, art.<br><b>c0.3:</b> Mesolithic. Bow and arrows, fishing, boats.<br><b>c0.4:</b> Early Neolithic. Agriculture.<br><b>c0.5:</b> Middle Neolithic. Animal husbandry, ceramics.<br><b>c0.6:</b> Late Neolithic. Large settlements.<br><b>c0.7:</b> First kingdoms of copper and bronze ages. Wheel.<br><b>c0.8:</b> Ancient empires of the iron age. Philosophy.<br><b>c0.9:</b> Industrial age. Electronics and nuclear energy. Help/en/Type0Civilizations
127 Type1Civilizations help Type 1 Civilizations Civilizations are busy with settling their own solar system.<br><br><b>c1.0:</b> A civilization that has completely mastered its home planet. Superconductivity, controlled nuclear fusion.<br><b>c1.1:</b> Research compounds in the home system. Launch loop, space elevator.<br><b>c1.2:</b> Complete genetic tailoring. Cyborgization.<br><b>c1.3:</b> Industrial asteroid mining. Colonies on the other planets of the home system.<br><b>c1.4:</b> Harvesting of matter from atmospheres of gas giants.<br><b>c1.5:</b> Space cities. Picotechnologies.<br><b>c1.6:</b> Industrial manufacturing of antimatter. First starships.<br><b>c1.7:</b> Terraforming. Gamma-lasers.<br><b>c1.8:</b> Space stations of continental scale.<br><b>c1.9:</b> Partial Dyson swarm. Help/en/Type1Civilizations
128 Type2Civilizations help Type 2 Civilizations Civilizations that can expand to other stars.<br><br><b>c2.0:</b> A civilization that completely exploits the energy output of its own sun.<br><b>c2.1:</b> Change of planetary orbits.<br><b>c2.2:</b> Control over inertia.<br><b>c2.3:</b> Starlifting, harvesting matter from stars.<br><b>c2.4:</b> Femtotechnologies: manipulations on individual fermions.<br><b>c2.5:</b> Deconstruction and creation of planets.<br><b>c2.6:</b> Complete domination of astroarchitecture over planets.<br><b>c2.7:</b> Giant stars resources exploitation.<br><b>c2.8:</b> Control over gravity.<br><b>c2.9:</b> Movement of stars. Help/en/Type2Civilizations
129 Type3Civilizations help Type 3 Civilizations Civilizations of galactic scale.<br><br><b>c3.0:</b> Expansion into a galactic group is available.<br><b>c3.1:</b> Creation of stars.<br><b>c3.2:</b> Utilization of white dwarfs.<br><b>c3.3:</b> Creation of black holes by focused radiation.<br><b>c3.4:</b> Expansion into a galactic supercluster is available.<br><b>c3.5:</b> Utilization of neutron stars.<br><b>c3.6:</b> Expansion into a galactic filament is available.<br><b>c3.7:</b> Utilization of magnetars.<br><b>c3.8:</b> Expansion into a great wall is available.<br><b>c3.9:</b> Utilization of black holes. Help/en/Type3Civilizations
130 Type4Civilizations help Type 4 Civilizations Civilizations of the universe scale.<br><br><b>c4.0:</b> Temporal manipulations.<br><b>c4.1:</b> Expansion into the whole universe scale is available.<br><b>c4.2:</b> Utilization of supermassive black holes.<br><b>c4.3:</b> Folding space.<br><b>c4.4:</b> Improbability field.<br><br>And so on, bigger and bigger, so long as there is space. Help/en/Type4Civilizations
-130
View File
@@ -1,130 +0,0 @@
Owniverse||interface||||
MM-Create||interface||||Menu/ru/CreateUniverse
MM-Help||interface||||Menu/ru/Tutorial
MM-Achievments||interface||||Menu/ru/Achievements
MM-Credits||interface||||Menu/ru/Credits
MM-LanguageEn||interface||||Menu/ru/English
MM-LanguageRu||interface||||Menu/ru/RussianActive
MM-SoundActive||interface||||Menu/ru/SoundActive
MM-SoundNonActive||interface||||Menu/ru/SoundNonActive
MM-MusicActive||interface||||Menu/ru/MusicActive
MM-MusicNonActive||interface||||Menu/ru/MusicNonActive
MM-LeaveReality||interface||||Menu/ru/LeaveReality
CreditsTitle||interface||||Credits/ru/Credits
CreditsRoles||interface||Объединитель <br> Укротитель питона <br> Рисователь <br> Композитор||
CreditsNames||interface||Кирилл Ивлев <br> Илья Коновалов <br> Дмитрий Уваров <br> Татьяна Степаненко||
Achievement-Header||interface||||Achievements/ru/Achievements
Achievement-Status-Template||interface||Открыто %Count% из %Total%||
ReportTitle||interface||||Report/ru/Title
ReportNewWarning||interface||||Report/ru/NewWarning
ReportNewButton||interface||||Report/ru/NewButton
ReportWipeWarning||interface||||Report/ru/WipeWarning
ReportWipeButton||interface||||Report/ru/WipeButton
MF-FBV-ReturnButton||interface||||Dashboard/Indicators/ForceBoxes/Ru/Return
MF-FBV-OpenBoxButton||interface||||Dashboard/Indicators/ForceBoxes/Ru/OpenBox
MF-FBV-AcquireButton||interface||||Dashboard/Indicators/ForceBoxes/Ru/Acquire
MF-FBV-NoAdsDeliveredSign||interface||||Dashboard/Indicators/ForceBoxes/Ru/NoAds
Universe||interface||||
Time|Time|indicator|AboutTheGame|Время|Меняйте скорость как хотите.|
Energy|Enr|indicator|EnergyAndDensity|Энергия|Расходуйте на водород и пространство.|
Density|Den|indicator|EnergyAndDensity|Плотность|Поддерживайте баланс.|
DensityRip|DenR|indicator|EnergyAndDensity|Большой разрыв|Повышайте плотность!|
DensityCrunch|DenC|indicator|EnergyAndDensity|Большое сжатие|Понижайте плотность!|
BurnabilityIndicator|Bur|indicator|BurnabilityAndExplosiveness|Горючесть|Интенсивность горения звёзд.|
ExplosivenessIndicator|Exp|indicator|BurnabilityAndExplosiveness|Взрвычатость|Мощность звёздных взрывов.|
AggressionIndicator|Agg|indicator|AggressionAndTrends|Агрессия|Эволюция и конкуренция.|
||||1 год в секунду||
||||10 лет в секунду||
||||100 лет в секунду||
||||1 000 лет в секунду||
||||10 000 лет в секунду||
||||100 000 лет в секунду||
||||1 000 000 лет в секунду||
||||10 000 000 лет в секунду||
||||100 000 000 лет в секунду||
||||1 000 000 000 лет в секунду||
||logtext||Сводка изменений за последние 100 секунд.<br>Указаны средние значения за год.||
ForceNavigationImage||interface||||BigBang/Dashboard/ru/Forces
1-1-1-NavigationResourceImage||interface||||BigBang/Dashboard/ru/Resources
Space|S|entity|SpaceAndHydrogen|Пространство|Нужно для размещения объектов.|
Hydrogen|H|entity|SpaceAndHydrogen|Водород|Нужен для создания облаков и звёзд.|
Helium|He|entity|HeliumAndMetals|Гелий|Экономит водород.|
Metals|Met|entity|HeliumAndMetals|Металлы|Нужны для создания планет.|
||||Металличность||
NavigationStarImage||interface||||BigBang/Dashboard/ru/Stars
Nebula|N|entity|Clouds|Туманность|Производит водород.|
Globula|G|entity|Clouds|Глобула|Производит больше водорода.|
StarNursery|STN|entity|Clouds|Звёздная колыбель|Производит водород и звёзды.|
MolecularCloud|MC|entity|Clouds|Молекулярное облако|Производит много водорода.|
ActiveStarNursery|ASTN|entity|Clouds|Активная звёздная колыбель|Производит очень много водорода и звёзд.|
BrownDwarf|BD|entity|DwarfStars|Бурый карлик|Бесполезен, но не занимает место.|
RedDwarf|RD|entity|DwarfStars|Красный карлик|Простейшая звезда.|
OrangeDwarf|OD|entity|DwarfStars|Оранжевый карлик|Звезда с планетами.|
YellowDwarf|YD|entity|DwarfStars|Жёлтый карлик|Звезда похожая на Солнце.|
WhiteYellowDwarf|WYD|entity|DwarfStars|Бело-жёлтый карлик|Звезда со множеством планет.|
RedGiant|RG|entity|GiantStars|Красный гигант|Деградирующая старая звезда.|
YellowGiant|YG|entity|GiantStars|Жёлтый гигант|Оптимальна для производства металлов.|
BlueGiant|BG|entity|GiantStars|Голубой гигант|Сбалансированно производит металлы и пространство.|
Supergiant|SG|entity|GiantStars|Сверхгигант|Быстро производит пространство и чуть-чуть металлов.|
Hypergiant|HG|entity|GiantStars|Гипергигант|Бурно сгорает, создавая много пространства.|
WhiteDwarf|WD|entity|DegenerateObjects|Белый карлик|Остаток сгоревшего карлика.|
NeutronStar|NS|entity|DegenerateObjects|Нейтронная звезда|Остаток сгоревшего гиганта.|
Magnetar|MGT|entity|DegenerateObjects|Магнетар|Остаток большого гиганта.|
BlackHole|BH|entity|DegenerateObjects|Чёрная дыра|Результат звёздной катастрофы. Нужна для структур.|
SupermassiveBlackHole|SMBH|entity|DegenerateObjects|Сверхмассивная чёрная дыра|Собирается из чёрных дыр. Нужна для галактик.|
1-3-1-NavigationStructureImage||interface||||BigBang/Dashboard/ru/Structures
StarClusterScattered|SCD|entity|StarClusters|Рассеянное звёздное скопление|Небольшая структура неправильной формы.<br>Пространство: +10%.|
StarClusterSmall|SCS|entity|StarClusters|Малое звёздное скопление|Имеет шарообразную форму.<br>Пространство: +20%.|
StarClusterMedium|SCM|entity|StarClusters|Среднее звёздное скопление|Заметно издалека.<br>Пространство: +30%.|
StarClusterLarge|SCL|entity|StarClusters|Большое звёздное скопление|Производит впечатление.<br>Пространство: +50%.|
StarClusterGiant|SCG|entity|StarClusters|Гигантское звёздное скопление|Вызывает трепет.<br>Пространство: +80%.|
GalaxyEllipticalDwarf|GED|entity|Galaxies|Карликовая эллиптическая галактика|Размером с Малое Магелланово Облако.<br>Пространство: +100%.|
GalaxyEllipticalSmall|GES|entity|Galaxies|Малая эллиптическая галактика|Размером с Большое Магелланово Облако.<br>Пространство: +150%.|
GalaxyEllipticalMedium|GEM|entity|Galaxies|Средняя эллиптическая галактика|Размером с Млечный Путь.<br>Пространство: +200%.|
GalaxyEllipticalLarge|GEL|entity|Galaxies|Большая эллиптическая галактика|Размером с Туманность Андромеды.<br>Пространство: +300%.|
GalaxyEllipticalGiant|GEG|entity|Galaxies|Гигантская эллиптическая галактика|Похожа на IC 1101.<br>Пространство: +450%.|
GalaxySpiralDwarf|GSD|entity|Galaxies|Карликовая спиральная галактика|Похожа на Малое Магелланово Облако.|
GalaxySpiralSmall|GSS|entity|Galaxies|Малая спиральная галактика|Похожа на Большое Магелланово Облако.|
GalaxySpiralMedium|GSM|entity|Galaxies|Средняя спиральная галактика|Похожа на Млечный Путь.|
GalaxySpiralLarge|GSL|entity|Galaxies|Большая спиральная галактика|Похожа на Туманность Андромеды.|
GalaxySpiralGiant|GSG|entity|Galaxies|Гигантская спиральная галактика|Размером с IC 1101.|
GalacticGroup|LGG|entity|LargeStructures|Группа галактик|Объединяет галактики.|
GalacticSupercluster|LSC|entity|LargeStructures|Сверхскопление галактик|Основа для структуры вселенной.|
GalacticFilament|LGF|entity|LargeStructures|Галактическая нить|Балансирует плотность воидами.|
GalacticWall|LGW|entity|LargeStructures|Великая стена|Создаёт структуру вселенной.|
UniverseBubble|LUB|entity|LargeStructures|Вселенский пузырь|Больше некуда.|
1-4-1-NavigationLifeImage||interface||||BigBang/Dashboard/ru/Planets
GasGiant|GG|entity|Planets|Газовый гигант|Слишком велика.|
AsteroidBelt|AB|entity|Planets|Астероиды|Куча камней.|
RockyPlanet|RP|entity|Planets|Каменистая планета|Не подходит для жизни.|
HabitablePlanet|HP|entity|Planets|Обитаемая планета|Имеет потенциал для жизни.|
LivingPlanet|LP|entity|Planets|Живая планета|На этой планете есть жизнь!|
|Star|||Звезда||
|SC|||Звёздное скопление||
|GAL|||Галактика||
AboutTheGame||help||Об игре|В этой игре вы можете <b>создать вселенную</b> и управлять её развитием. Конечную цель вы определяете для себя самостоятельно. Попробуйте получить те достижения, которые вам понравятся. Читайте подсказки, исследуйте возможности и не бойтесь экспериментировать. Всегда можно начать всё заново.<br><br>Числа больше 1 000 записаны <b>экспоненциально</b>. 1e4 — это 10 000, то есть «единица, у которой 4 нуля». 1е6 — миллион, 1е9 — миллиард и так далее. 13,77е9 — это 13 миллиардов 770 миллионов.<br><br>Игра идёт в реальном времени с изменяемым масштабированием. За одну секунду может пройти год, десять лет, век и так далее. Меняйте скорость течения времени кнопками «−» и «+».|Help/ru/AboutTheGame
GameplayBasics||help||Основы игры|Вам доступен большой, но конечный <b>запас энергии</b>, нужной для создания всего вещества во вселенной и самого её пространства. В начале подавляющая часть этой энергии вам напрямую недоступна. Но в ходе игры вы будете забирать всё больше энергии, и чем меньше её останется в запасе, тем сложнее будет брать новую. Нехватка энергии не станет острой проблемой в ближайший миллиард лет или около того: запас действительно очень велик.<br><br>Из энергии с помощью облаков производится вещество в виде <b>водорода</b>. Он тратится на создание новых облаков и звёзд. Звёзды в процессе горения создают <b>пространство</b>, в котором могут быть размещены новые звёзды и облака. Создание пространства также расходует некоторую часть энергии из общего запаса.|Help/ru/GameplayBasics
StarsAndStructures||help||Звёзды и структуры|Чем массивнее звезда, тем быстрее она сгорает и больше пространства производит. Самым выгодным вложением водорода на полученное пространство являются самые маленькие звёзды. Но они горят очень долго и медленно производят пространство. Также каждая звезда сама занимает единицу пространства.<br><br>Звёзды и туманности растущей вселенной есть смысл организовывать в галактики и более крупные <b>структуры</b>. В структурах производство пространства звёздами увеличивается.<br><br>Соотношение между веществом и свободным пространством называется <b>плотностью</b>. Вселенная стабильна только в определённом диапазоне плотности. При выходе за его рамки возникают проблемы.|Help/ru/StarsAndStructures
LifeAndForces||help||Жизнь и силы|Возле некоторых звёзд возникают <b>планеты</b>, на которых может появиться жизнь. При определённых обстоятельствах жизнь эволюционирует до разумной, а разумная развивается до высокотехнологичной. Далее она пытается освоить вселенную, которую считает своей.<br><br>Многие события во вселенной случаются не всегда, а лишь с некоторой вероятностью. У вас есть доступ к особым <b>силам</b>, с помощью которых вы можете «подкручивать» вероятности интересующих вас событий, влияя на законы природы.|Help/ru/LifeAndForces
Achievements||help||Достижения|В ходе игры вам совершенно точно удастся выполнить некоторые <b>достижения</b>. Простые получаются сами собой, а вот над более сложными может понадобиться призадуматься. Можно использовать список достижений в качестве карты подсказок возможных следующих шагов.<br><br>Гнаться за всеми достижениями необязательно. Это ваша вселенная и вы можете делать с ней что угодно. Однако достижение есть достижение, и помимо личной гордости о проделанной работе вы сможете с лёгкостью <b>поделиться</b> им с друзьями!|Help/ru/Achievements
Karma||help||Карма|Каждое полученное достижение даёт вам некоторое число <b>кармических очков</b>. При создании новой вселенной вы можете потратить полученные очки на получение небольших бонусов, с помощью которых вам непременно удастся добиться лучших результатов.<br><br>Потраченные кармические очки никуда не деваются: они <b>остаются</b> с вами и вы снова сможете их потратить в следующей вселенной. Скорее всего, к этому моменту их станет ещё больше.|Help/ru/Karma
Gauges||help||Индикаторы|На приборной панели расположены <b>индикаторы</b> тех показателей, которые особенно важны для выбранной страницы с объектами.|Help/ru/Gauges
EnergyAndDensity||help||Энергия и плотность|<b>Энергия</b> из запаса конвертируется в водород и пространство. Чем ниже доля оставшегося запаса, указанная в середине полоски, тем с меньшей эффективностью работают источники создания ресурсов, такие как облака для водорода и звёзды для пространства.<br>Запас энергии правда очень велик, хоть и не бесконечен.<br><br>Средняя <b>плотность</b> вселенной это отношение общей массы вещества, то есть всех звёзд, облаков и так далее, к пустому пространству. Она растёт вместе с массой и уменьшается с ростом пространства. Если индикатор «ρ» выйдет из «средней зоны» и склонится к одной из крайностей, то последствия могут вас неприятно удивить.|Help/ru/EnergyAndDensity
BurnabilityAndExplosiveness||help||Горючесть и взрывчатость|<b>Горючесть</b> показывает текущую скорость горения звёзд. На неё могут влиять плотность вселенной (чем больше, тем выше), действия сверхразвитых цивилизаций и силы игрока.<br><br><b>Взрывчатость</b> показывает текущую вероятность гамма-всплесков и мощность взрыва при любом коллапсе звезды-гиганта. На неё могут влиять плотность вселенной (чем больше, тем ниже), действия сверхразвитых цивилизаций и силы игрока.|Help/ru/BurnabilityAndExplosiveness
AggressionAndTrends||help||Агрессия и тенденции|<b>Агрессия</b> показывает интенсивность конкурентной борьбы между видами, цивилизациями и их внутренними фракциями. Она влияет на развитие и стабильность жизни и обществ. Изменяется под воздействием вселенских тенденций и сил игрока.<br>По умолчанию показывается средняя вселенская агрессия. Но можно выделить какой-либо цивилизационный уровень и увидеть среднюю агрессию именно для этого уровня.<br><br><b>Тенденциями</b> называются результаты долговременных действий цивилизаций. Всего их пять.|Help/ru/AggressionAndTrends
SpaceAndHydrogen||help||Пространство и водород|Большинство созидательных действий требует траты ресурсов.<br><br><b>Пространство</b> нужно для размещения всего того, что вы создаёте. Для создания нового пространства зажигайте звёзды! Также не забывайте объединять созданные звёзды в структуры, чтобы получать ещё больше пространства.<br><br><b>Водород</b> требуется для создания туманностей и звёзд. Туманности позволяют получать больше водорода. Звёзды создают пространство и используются для базирования планет. Эти объекты также служат кирпичиками для возведения сложных структур.|Help/ru/SpaceAndHydrogen
HeliumAndMetals||help||Гелий и металлы|Гелий и металлы остаются, когда звёзды завершают своё существование.<br><b>Гелий</b> не особенно полезен, но от него никуда не деться. Он расходуется автоматически, по возможности замещая водород, экономя более полезный ресурс.<br><br><b>Металлы</b> «загрязняют» ваш запас водорода и гелия более тяжёлыми элементами. Это хорошо, поскольку высокая «металличность», отношение металлов к водороду и гелию, увеличивает вероятность возникновения планет у новых звёзд.<br>Металлы добавляются от сгорания звёзд, особенно больших, но общая металличность может уменьшаться, когда вселенная наполняется новыми объектами из чистого водорода и гелия, такими как туманности и звёзды.|Help/ru/HeliumAndMetals
Clouds||help||Облака|Облака нужны для создания водорода, из которого впоследствии можно построить вселенную. Из базовых туманностей можно собирать более сложные облачные структуры.<br><br><b>Туманность:</b> самое простое облако.<br><b>Глобула:</b> даёт водород медленнее туманности, но существует дольше, а также занимает меньше места. Используется в создании более крупных облаков.<br><b>Звёздная колыбель:</b> автоматически создаёт звёзды из части выданного водорода.<br><b>Молекулярное облако:</b> большой и долговременный генератор водорода.<br><b>Активная звёздная колыбель:</b> очень большой автоматический генератор водорода и звёзд.|Help/ru/Clouds
DwarfStars||help||Звёзды-карлики|Звёзды-карлики дёшевы, существуют долго и производят пространство эффективно. У них бывают планеты, на которых впоследствии может развиться жизнь.<br><br><b>Бурый карлик:</b> брак, бесполезный побочный эффект от создания звёзд. Они возникают сами и не занимают пространство в отличие от остальных звёзд. Производить их специально нельзя, да и не нужно.<br><b>Красный карлик:</b> экономически выгоден для производства пространства, но работает очень медленно.<br><b>Оранжевый карлик:</b> идеален для развития жизни.<br><b>Жёлтый карлик:</b> подходит для возникновения жизни.<br><b>Бело-жёлтый карлик:</b> имеет самую большую зону обитания, но быстро выгорает.|Help/ru/DwarfStars
GiantStars||help||Звёзды-гиганты|Звёзды-гиганты быстро сгорают и производят много пространства. Коллапс в конце существования повреждает планеты у соседних звёзд, но производит металлы.<br><br><b>Красный гигант:</b> деградирующая звезда на закате существования.<br><b>Жёлтый гигант:</b> малая звезда-гигант. Производит много металлов, коллапс слаб.<br><b>Голубой гигант:</b> обычная звезда-гигант. Производит пространство и металлы. Средний коллапс.<br><b>Сверхгигант:</b> огромная звезда-гигант. Живёт недолго, производит множество пространства и немного металлов.<br><b>Гипергигант:</b> экстремальная звезда-гигант. Всегда коллапсирует в чёрную дыру, выделяя множество пространства с сумасшедшими разрушениями.|Help/ru/GiantStars
DegenerateObjects||help||Вырожденные объекты|Звёзды, выработавшие своё термоядерное топливо. Они занимают пространство и ничего не производят, но из них можно собирать структуры.<br><br><b>Белый карлик:</b> остаток сгоревшего карлика.<br><b>Нейтронная звезда:</b> исключительно компактный остаток звезды-гиганта.<br><b>Магнетар:</b> самый плотный объект, не являющийся чёрной дырой.<br><b>Чёрная дыра:</b> остаток огромной звезды, прошедшей разрушительный коллапс. Их можно объединять в сверхмассивные чёрные дыры.<br><b>Сверхмассивная чёрная дыра:</b> результат слияния множества чёрных дыр звёздной массы. Необходимы для создания галактик. Растут самостоятельно за счёт прочих звёзд, хотя и очень медленно.|Help/ru/DegenerateObjects
StarClusters||help||Звёздные скопления|Звёздные скопления являются самыми скромными из структур. Это некоторое количество звёзд, расположенных близко друг к другу и связанных гравитационно. Подобные комки вносят разнообразие в однородный вселенский ландшафт.<br><br><b>Рассеянное:</b> небольшая структура неправильной формы.<br><b>Малое:</b> имеет шарообразную форму.<br><b>Среднее:</b> заметно издалека.<br><b>Большое:</b> производит впечатление.<br><b>Гигантское:</b> вызывает трепет.<br><br>Звёзды в структурах ведут себя как обычно, но получают бонус к производству пространства. Со временем скопления рассыпаются, высвобождая звёзды. Крупные скопления существуют дольше, чем мелкие, и дают больший бонус пространства.|Help/ru/StarClusters
Galaxies||help||Галактики|<b>Эллиптические галактики</b> имеют линзовидную форму и вращаются медленно. Звёзды в них производят больше пространства, чем в спиральных галактиках. Постепенно эллиптические галактики рассыпаются на отдельные звёзды.<br><br><b>Спиральные галактики</b> имеют неоднородную структуру с рукавами и поддерживают активное звездообразование. Они лучше подходят для зарождения и развития жизни. Со временем в спиральных галактиках заканчивается запас газа, они замедляются и превращаются в более стабильные и скучные эллиптические.<br><br>Звёзды, вошедшие в состав галактик, продолжают функционировать как обычно. Они производят пространство, а у карликов могут быть планеты.|Help/ru/Galaxies
LargeStructures||help||Большие структуры|<b>Большие структуры</b> не зря так называются: в качестве строительных кирпичиков в них используются целые галактики. Они нужны для организации вселенной на самых больших масштабах. Без них пространство, равномерно заполненное звёздами и галактиками, оказывается слишком однообразным и разреженным, тогда как они создают градиент заполнения с более и менее плотными областями, более подходящий для освоения сверхразвитыми разумными существами.<br><br>Со временем большие структуры рассыпаются на составляющие, но это происходит очень нескоро.|Help/ru/LargeStructures
Planets||help||Планеты|Планеты возникают у звёзд-карликов при наличии металлов. В некотором смысле всё это космическое строительство проводится ради тех планет, у которых есть потенциал для зарождения жизни.<br><br><b>Газовый гигант:</b> большая планета с чрезвычайно плотной атмосферой, непригодная для жизни.<br><b>Пояс астероидов:</b> куча камней недостаточной массы, чтобы собраться в планету.<br><b>Каменистая планета:</b> непригодная для жизни планета. Слишком холодно, жарко или не тот химический состав.<br><b>Обитаемая планета:</b> здесь есть жидкая вода и в перспективе может образоваться жизнь.<br><b>Живая планета:</b> обитатели этой планеты подают большие надежды!|Help/ru/Planets
Eons||help||Эоны|Жизнь медленно эволюционирует через эоны от самой примитивной до способной к появлению разума. Не всем планетам удаётся довести этот процесс до победного конца, потому что звёзды горят не вечно.<br><br><b>Архей:</b> не сразу бросается в глаза, но на таких планетах полно археев и цианобактерий.<br><b>Палеозой:</b> помимо вездесущих амёб, здесь присутствуют водоросли, губки и даже моллюски.<br><b>Протерозой:</b> папоротники, черви, трилобиты и рыбы.<br><b>Мезозой:</b> голосеменные, ящеры, динозавры и терапсиды.<br><b>Кайнозой:</b> покрытосеменные и разнообразные млекопитающие, некоторые из которых проявляют признаки интеллекта.|Help/ru/Eons
Type0Civilizations||help||Цивилизации типа 0|Докосмическая эпоха — от племени до федерации.<br><br><b>ц0.0:</b> нижний палеолит. Приручение огня, каменные орудия.<br><b>ц0.1:</b> средний палеолит. Развитые каменные орудия.<br><b>ц0.2:</b> верхний палеолит. Сложные каменные орудия, искусство.<br><b>ц0.3:</b> мезолит. Лук и стрелы, рыболовство, лодки.<br><b>ц0.4:</b> ранний неолит. Земледелие.<br><b>ц0.5:</b> средний неолит. Скотоводство, керамика.<br><b>ц0.6:</b> поздний неолит. Крупные поселения.<br><b>ц0.7:</b> первые царства медного и бронзового века. Колесо.<br><b>ц0.8:</b> античные империи железного века. Философия.<br><b>ц0.9:</b> промышленная эпоха. Электричество.|Help/ru/Type0Civilizations
Type1Civilizations||help||Цивилизации типа 1|Цивилизации, заселяющие родную солнечную систему.<br><br><b>ц1.0:</b> цивилизация, освоившая родную планету. Сверхпроводимость, термоядерный синтез.<br><b>ц1.1:</b> научные базы в родной системе. Пусковая петля, космический лифт.<br><b>ц1.2:</b> полное управление генетикой. Киборгизация.<br><b>ц1.3:</b> промышленная добыча астероидов. Поселения в родной системе.<br><b>ц1.4:</b> сбор вещества из атмосфер газовых гигантов.<br><b>ц1.5:</b> космические города. Пикотехнологии.<br><b>ц1.6:</b> промышленное антивещество. Первые звездолёты.<br><b>ц1.7:</b> терраформинг. Гамма-лазеры.<br><b>ц1.8:</b> космические станции континентального масштаба.<br><b>ц1.9:</b> частичный рой Дайсона.|Help/ru/Type1Civilizations
Type2Civilizations||help||Цивилизации типа 2|Цивилизации, ведущие экспансию к иным звёздам.<br><br><b>ц2.0:</b> цивилизация, освоившая энергию родного солнца.<br><b>ц2.1:</b> изменение планетарных орбит.<br><b>ц2.2:</b> управление инерцией.<br><b>ц2.3:</b> сбор вещества со звёзд.<br><b>ц2.4:</b> фемтотехнологии: управление отдельными фермионами.<br><b>ц2.5:</b> деконструкция и сборка планет.<br><b>ц2.6:</b> окончательное переселение с планет в космос.<br><b>ц2.7:</b> освоение ресурсов звёзд-гигантов.<br><b>ц2.8:</b> управление гравитацией.<br><b>ц2.9:</b> перемещение звёзд.|Help/ru/Type2Civilizations
Type3Civilizations||help||Цивилизации типа 3|Цивилизации галактического масштаба.<br><br><b>ц3.0:</b> возможна экспансия в группу галактик.<br><b>ц3.1:</b> создание звёзд.<br><b>ц3.2:</b> использование белых карликов.<br><b>ц3.3:</b> создание чёрных дыр из концентрированного излучения.<br><b>ц3.4:</b> возможна экспансия в сверхскопление.<br><b>ц3.5:</b> использование нейтронных звёзд.<br><b>ц3.6:</b> возможна экспансия в галактическую нить.<br><b>ц3.7:</b> использование магнетаров.<br><b>ц3.8:</b> возможна экспансия в великую стену.<br><b>ц3.9:</b> использование чёрных дыр.|Help/ru/Type3Civilizations
Type4Civilizations||help||Цивилизации типа 4|Цивилизации вселенского масштаба.<br><br><b>ц4.0:</b> манипуляции со временем.<br><b>ц4.1:</b> возможна экспансия на масштабы всей вселенной.<br><b>ц4.2:</b> использование сверхмассивных чёрных дыр.<br><b>ц4.3:</b> складное пространство.<br><b>ц4.4:</b> поле невероятности.<br><br>И так далее, всё больше и больше, пока есть место.|Help/ru/Type4Civilizations
1 Owniverse interface
2 MM-Create interface Menu/ru/CreateUniverse
3 MM-Help interface Menu/ru/Tutorial
4 MM-Achievments interface Menu/ru/Achievements
5 MM-Credits interface Menu/ru/Credits
6 MM-LanguageEn interface Menu/ru/English
7 MM-LanguageRu interface Menu/ru/RussianActive
8 MM-SoundActive interface Menu/ru/SoundActive
9 MM-SoundNonActive interface Menu/ru/SoundNonActive
10 MM-MusicActive interface Menu/ru/MusicActive
11 MM-MusicNonActive interface Menu/ru/MusicNonActive
12 MM-LeaveReality interface Menu/ru/LeaveReality
13 CreditsTitle interface Credits/ru/Credits
14 CreditsRoles interface Объединитель <br> Укротитель питона <br> Рисователь <br> Композитор
15 CreditsNames interface Кирилл Ивлев <br> Илья Коновалов <br> Дмитрий Уваров <br> Татьяна Степаненко
16 Achievement-Header interface Achievements/ru/Achievements
17 Achievement-Status-Template interface Открыто %Count% из %Total%
18 ReportTitle interface Report/ru/Title
19 ReportNewWarning interface Report/ru/NewWarning
20 ReportNewButton interface Report/ru/NewButton
21 ReportWipeWarning interface Report/ru/WipeWarning
22 ReportWipeButton interface Report/ru/WipeButton
23 MF-FBV-ReturnButton interface Dashboard/Indicators/ForceBoxes/Ru/Return
24 MF-FBV-OpenBoxButton interface Dashboard/Indicators/ForceBoxes/Ru/OpenBox
25 MF-FBV-AcquireButton interface Dashboard/Indicators/ForceBoxes/Ru/Acquire
26 MF-FBV-NoAdsDeliveredSign interface Dashboard/Indicators/ForceBoxes/Ru/NoAds
27 Universe interface
28 Time Time indicator AboutTheGame Время Меняйте скорость как хотите.
29 Energy Enr indicator EnergyAndDensity Энергия Расходуйте на водород и пространство.
30 Density Den indicator EnergyAndDensity Плотность Поддерживайте баланс.
31 DensityRip DenR indicator EnergyAndDensity Большой разрыв Повышайте плотность!
32 DensityCrunch DenC indicator EnergyAndDensity Большое сжатие Понижайте плотность!
33 BurnabilityIndicator Bur indicator BurnabilityAndExplosiveness Горючесть Интенсивность горения звёзд.
34 ExplosivenessIndicator Exp indicator BurnabilityAndExplosiveness Взрвычатость Мощность звёздных взрывов.
35 AggressionIndicator Agg indicator AggressionAndTrends Агрессия Эволюция и конкуренция.
36 1 год в секунду
37 10 лет в секунду
38 100 лет в секунду
39 1 000 лет в секунду
40 10 000 лет в секунду
41 100 000 лет в секунду
42 1 000 000 лет в секунду
43 10 000 000 лет в секунду
44 100 000 000 лет в секунду
45 1 000 000 000 лет в секунду
46 logtext Сводка изменений за последние 100 секунд.<br>Указаны средние значения за год.
47 ForceNavigationImage interface BigBang/Dashboard/ru/Forces
48 1-1-1-NavigationResourceImage interface BigBang/Dashboard/ru/Resources
49 Space S entity SpaceAndHydrogen Пространство Нужно для размещения объектов.
50 Hydrogen H entity SpaceAndHydrogen Водород Нужен для создания облаков и звёзд.
51 Helium He entity HeliumAndMetals Гелий Экономит водород.
52 Metals Met entity HeliumAndMetals Металлы Нужны для создания планет.
53 Металличность
54 NavigationStarImage interface BigBang/Dashboard/ru/Stars
55 Nebula N entity Clouds Туманность Производит водород.
56 Globula G entity Clouds Глобула Производит больше водорода.
57 StarNursery STN entity Clouds Звёздная колыбель Производит водород и звёзды.
58 MolecularCloud MC entity Clouds Молекулярное облако Производит много водорода.
59 ActiveStarNursery ASTN entity Clouds Активная звёздная колыбель Производит очень много водорода и звёзд.
60 BrownDwarf BD entity DwarfStars Бурый карлик Бесполезен, но не занимает место.
61 RedDwarf RD entity DwarfStars Красный карлик Простейшая звезда.
62 OrangeDwarf OD entity DwarfStars Оранжевый карлик Звезда с планетами.
63 YellowDwarf YD entity DwarfStars Жёлтый карлик Звезда похожая на Солнце.
64 WhiteYellowDwarf WYD entity DwarfStars Бело-жёлтый карлик Звезда со множеством планет.
65 RedGiant RG entity GiantStars Красный гигант Деградирующая старая звезда.
66 YellowGiant YG entity GiantStars Жёлтый гигант Оптимальна для производства металлов.
67 BlueGiant BG entity GiantStars Голубой гигант Сбалансированно производит металлы и пространство.
68 Supergiant SG entity GiantStars Сверхгигант Быстро производит пространство и чуть-чуть металлов.
69 Hypergiant HG entity GiantStars Гипергигант Бурно сгорает, создавая много пространства.
70 WhiteDwarf WD entity DegenerateObjects Белый карлик Остаток сгоревшего карлика.
71 NeutronStar NS entity DegenerateObjects Нейтронная звезда Остаток сгоревшего гиганта.
72 Magnetar MGT entity DegenerateObjects Магнетар Остаток большого гиганта.
73 BlackHole BH entity DegenerateObjects Чёрная дыра Результат звёздной катастрофы. Нужна для структур.
74 SupermassiveBlackHole SMBH entity DegenerateObjects Сверхмассивная чёрная дыра Собирается из чёрных дыр. Нужна для галактик.
75 1-3-1-NavigationStructureImage interface BigBang/Dashboard/ru/Structures
76 StarClusterScattered SCD entity StarClusters Рассеянное звёздное скопление Небольшая структура неправильной формы.<br>Пространство: +10%.
77 StarClusterSmall SCS entity StarClusters Малое звёздное скопление Имеет шарообразную форму.<br>Пространство: +20%.
78 StarClusterMedium SCM entity StarClusters Среднее звёздное скопление Заметно издалека.<br>Пространство: +30%.
79 StarClusterLarge SCL entity StarClusters Большое звёздное скопление Производит впечатление.<br>Пространство: +50%.
80 StarClusterGiant SCG entity StarClusters Гигантское звёздное скопление Вызывает трепет.<br>Пространство: +80%.
81 GalaxyEllipticalDwarf GED entity Galaxies Карликовая эллиптическая галактика Размером с Малое Магелланово Облако.<br>Пространство: +100%.
82 GalaxyEllipticalSmall GES entity Galaxies Малая эллиптическая галактика Размером с Большое Магелланово Облако.<br>Пространство: +150%.
83 GalaxyEllipticalMedium GEM entity Galaxies Средняя эллиптическая галактика Размером с Млечный Путь.<br>Пространство: +200%.
84 GalaxyEllipticalLarge GEL entity Galaxies Большая эллиптическая галактика Размером с Туманность Андромеды.<br>Пространство: +300%.
85 GalaxyEllipticalGiant GEG entity Galaxies Гигантская эллиптическая галактика Похожа на IC 1101.<br>Пространство: +450%.
86 GalaxySpiralDwarf GSD entity Galaxies Карликовая спиральная галактика Похожа на Малое Магелланово Облако.
87 GalaxySpiralSmall GSS entity Galaxies Малая спиральная галактика Похожа на Большое Магелланово Облако.
88 GalaxySpiralMedium GSM entity Galaxies Средняя спиральная галактика Похожа на Млечный Путь.
89 GalaxySpiralLarge GSL entity Galaxies Большая спиральная галактика Похожа на Туманность Андромеды.
90 GalaxySpiralGiant GSG entity Galaxies Гигантская спиральная галактика Размером с IC 1101.
91 GalacticGroup LGG entity LargeStructures Группа галактик Объединяет галактики.
92 GalacticSupercluster LSC entity LargeStructures Сверхскопление галактик Основа для структуры вселенной.
93 GalacticFilament LGF entity LargeStructures Галактическая нить Балансирует плотность воидами.
94 GalacticWall LGW entity LargeStructures Великая стена Создаёт структуру вселенной.
95 UniverseBubble LUB entity LargeStructures Вселенский пузырь Больше некуда.
96 1-4-1-NavigationLifeImage interface BigBang/Dashboard/ru/Planets
97 GasGiant GG entity Planets Газовый гигант Слишком велика.
98 AsteroidBelt AB entity Planets Астероиды Куча камней.
99 RockyPlanet RP entity Planets Каменистая планета Не подходит для жизни.
100 HabitablePlanet HP entity Planets Обитаемая планета Имеет потенциал для жизни.
101 LivingPlanet LP entity Planets Живая планета На этой планете есть жизнь!
102 Star Звезда
103 SC Звёздное скопление
104 GAL Галактика
105 AboutTheGame help Об игре В этой игре вы можете <b>создать вселенную</b> и управлять её развитием. Конечную цель вы определяете для себя самостоятельно. Попробуйте получить те достижения, которые вам понравятся. Читайте подсказки, исследуйте возможности и не бойтесь экспериментировать. Всегда можно начать всё заново.<br><br>Числа больше 1 000 записаны <b>экспоненциально</b>. 1e4 — это 10 000, то есть «единица, у которой 4 нуля». 1е6 — миллион, 1е9 — миллиард и так далее. 13,77е9 — это 13 миллиардов 770 миллионов.<br><br>Игра идёт в реальном времени с изменяемым масштабированием. За одну секунду может пройти год, десять лет, век и так далее. Меняйте скорость течения времени кнопками «−» и «+». Help/ru/AboutTheGame
106 GameplayBasics help Основы игры Вам доступен большой, но конечный <b>запас энергии</b>, нужной для создания всего вещества во вселенной и самого её пространства. В начале подавляющая часть этой энергии вам напрямую недоступна. Но в ходе игры вы будете забирать всё больше энергии, и чем меньше её останется в запасе, тем сложнее будет брать новую. Нехватка энергии не станет острой проблемой в ближайший миллиард лет или около того: запас действительно очень велик.<br><br>Из энергии с помощью облаков производится вещество в виде <b>водорода</b>. Он тратится на создание новых облаков и звёзд. Звёзды в процессе горения создают <b>пространство</b>, в котором могут быть размещены новые звёзды и облака. Создание пространства также расходует некоторую часть энергии из общего запаса. Help/ru/GameplayBasics
107 StarsAndStructures help Звёзды и структуры Чем массивнее звезда, тем быстрее она сгорает и больше пространства производит. Самым выгодным вложением водорода на полученное пространство являются самые маленькие звёзды. Но они горят очень долго и медленно производят пространство. Также каждая звезда сама занимает единицу пространства.<br><br>Звёзды и туманности растущей вселенной есть смысл организовывать в галактики и более крупные <b>структуры</b>. В структурах производство пространства звёздами увеличивается.<br><br>Соотношение между веществом и свободным пространством называется <b>плотностью</b>. Вселенная стабильна только в определённом диапазоне плотности. При выходе за его рамки возникают проблемы. Help/ru/StarsAndStructures
108 LifeAndForces help Жизнь и силы Возле некоторых звёзд возникают <b>планеты</b>, на которых может появиться жизнь. При определённых обстоятельствах жизнь эволюционирует до разумной, а разумная развивается до высокотехнологичной. Далее она пытается освоить вселенную, которую считает своей.<br><br>Многие события во вселенной случаются не всегда, а лишь с некоторой вероятностью. У вас есть доступ к особым <b>силам</b>, с помощью которых вы можете «подкручивать» вероятности интересующих вас событий, влияя на законы природы. Help/ru/LifeAndForces
109 Achievements help Достижения В ходе игры вам совершенно точно удастся выполнить некоторые <b>достижения</b>. Простые получаются сами собой, а вот над более сложными может понадобиться призадуматься. Можно использовать список достижений в качестве карты подсказок возможных следующих шагов.<br><br>Гнаться за всеми достижениями необязательно. Это ваша вселенная и вы можете делать с ней что угодно. Однако достижение есть достижение, и помимо личной гордости о проделанной работе вы сможете с лёгкостью <b>поделиться</b> им с друзьями! Help/ru/Achievements
110 Karma help Карма Каждое полученное достижение даёт вам некоторое число <b>кармических очков</b>. При создании новой вселенной вы можете потратить полученные очки на получение небольших бонусов, с помощью которых вам непременно удастся добиться лучших результатов.<br><br>Потраченные кармические очки никуда не деваются: они <b>остаются</b> с вами и вы снова сможете их потратить в следующей вселенной. Скорее всего, к этому моменту их станет ещё больше. Help/ru/Karma
111 Gauges help Индикаторы На приборной панели расположены <b>индикаторы</b> тех показателей, которые особенно важны для выбранной страницы с объектами. Help/ru/Gauges
112 EnergyAndDensity help Энергия и плотность <b>Энергия</b> из запаса конвертируется в водород и пространство. Чем ниже доля оставшегося запаса, указанная в середине полоски, тем с меньшей эффективностью работают источники создания ресурсов, такие как облака для водорода и звёзды для пространства.<br>Запас энергии правда очень велик, хоть и не бесконечен.<br><br>Средняя <b>плотность</b> вселенной это отношение общей массы вещества, то есть всех звёзд, облаков и так далее, к пустому пространству. Она растёт вместе с массой и уменьшается с ростом пространства. Если индикатор «ρ» выйдет из «средней зоны» и склонится к одной из крайностей, то последствия могут вас неприятно удивить. Help/ru/EnergyAndDensity
113 BurnabilityAndExplosiveness help Горючесть и взрывчатость <b>Горючесть</b> показывает текущую скорость горения звёзд. На неё могут влиять плотность вселенной (чем больше, тем выше), действия сверхразвитых цивилизаций и силы игрока.<br><br><b>Взрывчатость</b> показывает текущую вероятность гамма-всплесков и мощность взрыва при любом коллапсе звезды-гиганта. На неё могут влиять плотность вселенной (чем больше, тем ниже), действия сверхразвитых цивилизаций и силы игрока. Help/ru/BurnabilityAndExplosiveness
114 AggressionAndTrends help Агрессия и тенденции <b>Агрессия</b> показывает интенсивность конкурентной борьбы между видами, цивилизациями и их внутренними фракциями. Она влияет на развитие и стабильность жизни и обществ. Изменяется под воздействием вселенских тенденций и сил игрока.<br>По умолчанию показывается средняя вселенская агрессия. Но можно выделить какой-либо цивилизационный уровень и увидеть среднюю агрессию именно для этого уровня.<br><br><b>Тенденциями</b> называются результаты долговременных действий цивилизаций. Всего их пять. Help/ru/AggressionAndTrends
115 SpaceAndHydrogen help Пространство и водород Большинство созидательных действий требует траты ресурсов.<br><br><b>Пространство</b> нужно для размещения всего того, что вы создаёте. Для создания нового пространства зажигайте звёзды! Также не забывайте объединять созданные звёзды в структуры, чтобы получать ещё больше пространства.<br><br><b>Водород</b> требуется для создания туманностей и звёзд. Туманности позволяют получать больше водорода. Звёзды создают пространство и используются для базирования планет. Эти объекты также служат кирпичиками для возведения сложных структур. Help/ru/SpaceAndHydrogen
116 HeliumAndMetals help Гелий и металлы Гелий и металлы остаются, когда звёзды завершают своё существование.<br><b>Гелий</b> не особенно полезен, но от него никуда не деться. Он расходуется автоматически, по возможности замещая водород, экономя более полезный ресурс.<br><br><b>Металлы</b> «загрязняют» ваш запас водорода и гелия более тяжёлыми элементами. Это хорошо, поскольку высокая «металличность», отношение металлов к водороду и гелию, увеличивает вероятность возникновения планет у новых звёзд.<br>Металлы добавляются от сгорания звёзд, особенно больших, но общая металличность может уменьшаться, когда вселенная наполняется новыми объектами из чистого водорода и гелия, такими как туманности и звёзды. Help/ru/HeliumAndMetals
117 Clouds help Облака Облака нужны для создания водорода, из которого впоследствии можно построить вселенную. Из базовых туманностей можно собирать более сложные облачные структуры.<br><br><b>Туманность:</b> самое простое облако.<br><b>Глобула:</b> даёт водород медленнее туманности, но существует дольше, а также занимает меньше места. Используется в создании более крупных облаков.<br><b>Звёздная колыбель:</b> автоматически создаёт звёзды из части выданного водорода.<br><b>Молекулярное облако:</b> большой и долговременный генератор водорода.<br><b>Активная звёздная колыбель:</b> очень большой автоматический генератор водорода и звёзд. Help/ru/Clouds
118 DwarfStars help Звёзды-карлики Звёзды-карлики дёшевы, существуют долго и производят пространство эффективно. У них бывают планеты, на которых впоследствии может развиться жизнь.<br><br><b>Бурый карлик:</b> брак, бесполезный побочный эффект от создания звёзд. Они возникают сами и не занимают пространство в отличие от остальных звёзд. Производить их специально нельзя, да и не нужно.<br><b>Красный карлик:</b> экономически выгоден для производства пространства, но работает очень медленно.<br><b>Оранжевый карлик:</b> идеален для развития жизни.<br><b>Жёлтый карлик:</b> подходит для возникновения жизни.<br><b>Бело-жёлтый карлик:</b> имеет самую большую зону обитания, но быстро выгорает. Help/ru/DwarfStars
119 GiantStars help Звёзды-гиганты Звёзды-гиганты быстро сгорают и производят много пространства. Коллапс в конце существования повреждает планеты у соседних звёзд, но производит металлы.<br><br><b>Красный гигант:</b> деградирующая звезда на закате существования.<br><b>Жёлтый гигант:</b> малая звезда-гигант. Производит много металлов, коллапс слаб.<br><b>Голубой гигант:</b> обычная звезда-гигант. Производит пространство и металлы. Средний коллапс.<br><b>Сверхгигант:</b> огромная звезда-гигант. Живёт недолго, производит множество пространства и немного металлов.<br><b>Гипергигант:</b> экстремальная звезда-гигант. Всегда коллапсирует в чёрную дыру, выделяя множество пространства с сумасшедшими разрушениями. Help/ru/GiantStars
120 DegenerateObjects help Вырожденные объекты Звёзды, выработавшие своё термоядерное топливо. Они занимают пространство и ничего не производят, но из них можно собирать структуры.<br><br><b>Белый карлик:</b> остаток сгоревшего карлика.<br><b>Нейтронная звезда:</b> исключительно компактный остаток звезды-гиганта.<br><b>Магнетар:</b> самый плотный объект, не являющийся чёрной дырой.<br><b>Чёрная дыра:</b> остаток огромной звезды, прошедшей разрушительный коллапс. Их можно объединять в сверхмассивные чёрные дыры.<br><b>Сверхмассивная чёрная дыра:</b> результат слияния множества чёрных дыр звёздной массы. Необходимы для создания галактик. Растут самостоятельно за счёт прочих звёзд, хотя и очень медленно. Help/ru/DegenerateObjects
121 StarClusters help Звёздные скопления Звёздные скопления являются самыми скромными из структур. Это некоторое количество звёзд, расположенных близко друг к другу и связанных гравитационно. Подобные комки вносят разнообразие в однородный вселенский ландшафт.<br><br><b>Рассеянное:</b> небольшая структура неправильной формы.<br><b>Малое:</b> имеет шарообразную форму.<br><b>Среднее:</b> заметно издалека.<br><b>Большое:</b> производит впечатление.<br><b>Гигантское:</b> вызывает трепет.<br><br>Звёзды в структурах ведут себя как обычно, но получают бонус к производству пространства. Со временем скопления рассыпаются, высвобождая звёзды. Крупные скопления существуют дольше, чем мелкие, и дают больший бонус пространства. Help/ru/StarClusters
122 Galaxies help Галактики <b>Эллиптические галактики</b> имеют линзовидную форму и вращаются медленно. Звёзды в них производят больше пространства, чем в спиральных галактиках. Постепенно эллиптические галактики рассыпаются на отдельные звёзды.<br><br><b>Спиральные галактики</b> имеют неоднородную структуру с рукавами и поддерживают активное звездообразование. Они лучше подходят для зарождения и развития жизни. Со временем в спиральных галактиках заканчивается запас газа, они замедляются и превращаются в более стабильные и скучные эллиптические.<br><br>Звёзды, вошедшие в состав галактик, продолжают функционировать как обычно. Они производят пространство, а у карликов могут быть планеты. Help/ru/Galaxies
123 LargeStructures help Большие структуры <b>Большие структуры</b> не зря так называются: в качестве строительных кирпичиков в них используются целые галактики. Они нужны для организации вселенной на самых больших масштабах. Без них пространство, равномерно заполненное звёздами и галактиками, оказывается слишком однообразным и разреженным, тогда как они создают градиент заполнения с более и менее плотными областями, более подходящий для освоения сверхразвитыми разумными существами.<br><br>Со временем большие структуры рассыпаются на составляющие, но это происходит очень нескоро. Help/ru/LargeStructures
124 Planets help Планеты Планеты возникают у звёзд-карликов при наличии металлов. В некотором смысле всё это космическое строительство проводится ради тех планет, у которых есть потенциал для зарождения жизни.<br><br><b>Газовый гигант:</b> большая планета с чрезвычайно плотной атмосферой, непригодная для жизни.<br><b>Пояс астероидов:</b> куча камней недостаточной массы, чтобы собраться в планету.<br><b>Каменистая планета:</b> непригодная для жизни планета. Слишком холодно, жарко или не тот химический состав.<br><b>Обитаемая планета:</b> здесь есть жидкая вода и в перспективе может образоваться жизнь.<br><b>Живая планета:</b> обитатели этой планеты подают большие надежды! Help/ru/Planets
125 Eons help Эоны Жизнь медленно эволюционирует через эоны от самой примитивной до способной к появлению разума. Не всем планетам удаётся довести этот процесс до победного конца, потому что звёзды горят не вечно.<br><br><b>Архей:</b> не сразу бросается в глаза, но на таких планетах полно археев и цианобактерий.<br><b>Палеозой:</b> помимо вездесущих амёб, здесь присутствуют водоросли, губки и даже моллюски.<br><b>Протерозой:</b> папоротники, черви, трилобиты и рыбы.<br><b>Мезозой:</b> голосеменные, ящеры, динозавры и терапсиды.<br><b>Кайнозой:</b> покрытосеменные и разнообразные млекопитающие, некоторые из которых проявляют признаки интеллекта. Help/ru/Eons
126 Type0Civilizations help Цивилизации типа 0 Докосмическая эпоха — от племени до федерации.<br><br><b>ц0.0:</b> нижний палеолит. Приручение огня, каменные орудия.<br><b>ц0.1:</b> средний палеолит. Развитые каменные орудия.<br><b>ц0.2:</b> верхний палеолит. Сложные каменные орудия, искусство.<br><b>ц0.3:</b> мезолит. Лук и стрелы, рыболовство, лодки.<br><b>ц0.4:</b> ранний неолит. Земледелие.<br><b>ц0.5:</b> средний неолит. Скотоводство, керамика.<br><b>ц0.6:</b> поздний неолит. Крупные поселения.<br><b>ц0.7:</b> первые царства медного и бронзового века. Колесо.<br><b>ц0.8:</b> античные империи железного века. Философия.<br><b>ц0.9:</b> промышленная эпоха. Электричество. Help/ru/Type0Civilizations
127 Type1Civilizations help Цивилизации типа 1 Цивилизации, заселяющие родную солнечную систему.<br><br><b>ц1.0:</b> цивилизация, освоившая родную планету. Сверхпроводимость, термоядерный синтез.<br><b>ц1.1:</b> научные базы в родной системе. Пусковая петля, космический лифт.<br><b>ц1.2:</b> полное управление генетикой. Киборгизация.<br><b>ц1.3:</b> промышленная добыча астероидов. Поселения в родной системе.<br><b>ц1.4:</b> сбор вещества из атмосфер газовых гигантов.<br><b>ц1.5:</b> космические города. Пикотехнологии.<br><b>ц1.6:</b> промышленное антивещество. Первые звездолёты.<br><b>ц1.7:</b> терраформинг. Гамма-лазеры.<br><b>ц1.8:</b> космические станции континентального масштаба.<br><b>ц1.9:</b> частичный рой Дайсона. Help/ru/Type1Civilizations
128 Type2Civilizations help Цивилизации типа 2 Цивилизации, ведущие экспансию к иным звёздам.<br><br><b>ц2.0:</b> цивилизация, освоившая энергию родного солнца.<br><b>ц2.1:</b> изменение планетарных орбит.<br><b>ц2.2:</b> управление инерцией.<br><b>ц2.3:</b> сбор вещества со звёзд.<br><b>ц2.4:</b> фемтотехнологии: управление отдельными фермионами.<br><b>ц2.5:</b> деконструкция и сборка планет.<br><b>ц2.6:</b> окончательное переселение с планет в космос.<br><b>ц2.7:</b> освоение ресурсов звёзд-гигантов.<br><b>ц2.8:</b> управление гравитацией.<br><b>ц2.9:</b> перемещение звёзд. Help/ru/Type2Civilizations
129 Type3Civilizations help Цивилизации типа 3 Цивилизации галактического масштаба.<br><br><b>ц3.0:</b> возможна экспансия в группу галактик.<br><b>ц3.1:</b> создание звёзд.<br><b>ц3.2:</b> использование белых карликов.<br><b>ц3.3:</b> создание чёрных дыр из концентрированного излучения.<br><b>ц3.4:</b> возможна экспансия в сверхскопление.<br><b>ц3.5:</b> использование нейтронных звёзд.<br><b>ц3.6:</b> возможна экспансия в галактическую нить.<br><b>ц3.7:</b> использование магнетаров.<br><b>ц3.8:</b> возможна экспансия в великую стену.<br><b>ц3.9:</b> использование чёрных дыр. Help/ru/Type3Civilizations
130 Type4Civilizations help Цивилизации типа 4 Цивилизации вселенского масштаба.<br><br><b>ц4.0:</b> манипуляции со временем.<br><b>ц4.1:</b> возможна экспансия на масштабы всей вселенной.<br><b>ц4.2:</b> использование сверхмассивных чёрных дыр.<br><b>ц4.3:</b> складное пространство.<br><b>ц4.4:</b> поле невероятности.<br><br>И так далее, всё больше и больше, пока есть место. Help/ru/Type4Civilizations
-38
View File
@@ -1,38 +0,0 @@
Version|Content:en|Content:ru
0.6.12.128|Unlock|Раблокироровка
0.5.1|Minor fixes|Незначительные правки
0.5.0|WooHoo! Public release|Ура! Публичный релиз
0.4.8|Ads double forces|Реклама удваивает силы
0.4.7|Forces rebalanced|Силы перебалансированы
0.4.6|Additional forces|Ещё силы
0.4.5|Forces appeared in the game|В игре появились силы
0.4.4|Trends got a proper description, wipe button wipes wipely|Теперь у трендов есть описание, а кнопка стирания стирает стирательно
0.4.3|Massive changes. Trends, Lootboxes|Множественные изменения. Тренды, лутбоксы
0.4.2|UI updated Small bugs fixed|Обновления интерфейса и исправление мелких ошибок
0.4.1|They are going to talk to you|Они собираются общаться с тобой
0.4.0|Life and civilization were rebalanced|Жизнь и цивилизация были сбалансированы
0.3.33|High-level civilizations shenanigans|Выкрутасы высокоуровневых цивилизаций
0.3.32|Life: Fix habitats check for civs that require multiple objects|Фиксы для хабитатов цив
0.3.31|Life processes are more coherent now|Внутренние процессы жизни теперь более согласованы
0.3.30|Some bugs were fixed|Некоторые фиксы
0.3.29|Warriors are less aggressive now|Воины теперь менее агрессивны
0.3.28|Indicators are more interactive now|Индикаторы теперь более интерактивны
0.3.27|Apocalypse is not just a border now|Апокалипс теперь не просто рамка
0.3.26|Star distribution added to Report screen|На экран отчета добавлено распределение звезд.
0.3.25|Star wars, cleanup & diplomacy|Звездные войны. зачистка и дипломатия
0.3.24|Blast space fixed|Поправлено пространство от бласта
0.3.23|Other adjustments|Прочие правки
0.3.22|Civ Ethics distribution adjusted|Скорректировано распределение этик
0.3.21|Civ Ethics added|Добавлены этики цивилизаций
0.3.20|Lovely ethic buttons appeared|Появились красивые кнопки этик
0.3.20|Fix for wide screens|Корректное размещение на широких экранах
0.3.20|Low opacity of inactive actions|Затемнение неактивных действий
0.3.19|Background parallax added|Добавлен параллакс фона
0.3.18|Light moved to HSV model|Свет изменен на HSV модель
0.3.17|Swipe fixed|Поправлен свайп
0.3.16|Civ evolution tuned up|Эволюция цивилизаций улучшена
0.3.15|UI small fixes and adjustements|Небольшие правки интерфейса
0.3.14|Low level life forced to exist|Низкоуровневая жизнь вынуждена существовать
0.3.13|Tutorial updated|Обучение дополнено
0.3.12|Some miserable civilizations are going to be lobotomized|Некоторые незначительные цивилизации будут лоботомизированы
0.3.11|Change Log added|Добавлен журнал изменений
-9
View File
@@ -1,9 +0,0 @@
id|span|progress|degradation|next|fall
HP|5E+06|0.00025|0.0025|EON1|RP:1
EON1|1E+07|0.00025|0.0025|EON2|HP:100^RP:1
EON2|1E+07|0.00025|0.0025|EON3|EON1:1
EON3|1E+06|0.00025|0.0025|EON4|EON2:1000^EON1:1
EON4|1E+06|0.00025|0.0025|EON5|EON3:1000^EON1:1
EON5|5E+05|0.00025|0.0025|C0.0|EON4:2000^EON1:1
C0.0|2E+03|0.0175|0.025|C0.1|EON5:1
C0.1|2E+03|0.0175|0.025|C0.2|C0.0:1
-115
View File
@@ -1,115 +0,0 @@
name|label|description|image
Hydrogenin|Hydrogenin|Hydrogen production +100%[p]Space production −50%[p]Duration 1e9 years|
Temporin|Temporin|Skip 1 billion years[p] [p]|
Inflatite|Inflatite|Space production +100%[p]Structures age +10%[p]Duration 1e9 years|
Singularite|Singularite|Space consumption by SMBH +1000%[p]Stars consumption by SMBH +100%[p]Duration 1e9 years|
Primex|Primex|Helium usage +200%[p]Hydrogen production −50%[p]Duration 1e9 years|
Stellarin|Stellarin|Automatization of star production +50%[p] [p]Duration 1e8 years|
Renewin|Renewin|[p]Structures age −10%[p]Explosiveness +10%[p]Duration 1e8 years|
Infusite|Infusite|Burnability +10%[p]5% of brown dwarfs are infused into other stars[p]Duration 1e8 years|
Frostite|Frostite|Explosiveness −10%[p]Burnability −10%[p]Duration 1e8 years|
Desintegrex|Desintegrex|Destroys 1% of degenerate objects[p]Causes gamma-ray bursts and antitheistic trends[p]|
Rockein|Rockein|Chance of formation for hocky planets +50%, for habitable planets +25%[p]Chance of formation for gas giants -75%[p]Duration 1e7 years|
Panspermin|Panspermin|1% of habitable planets become living[p]5% of habitable planets become rocky[p]|
Gaianite|Gaianite|5% of rocky planets become habitable[p]Aggression −5%[p]Duration 1e7 years|
Darwinite|Darwinite|Progress +25% for all eons[p]Aggression +5%[p]Duration 1e7 years|
Edenex|Edenex|Degradation −90% for all eons[p]Progress −50% for all eons, causes spiritual trends[p]Duration 1e7 years|
Pacifin|Pacifin|Aggression −10%[p]Drift from bellicosity and to friendliness +5%[p]Duration 1e5 years|
Enragein|Enragein|Aggression +10%[p]Drift from friendliness and to bellicosity +5%[p]Duration 1e5 years|
Moralite|Moralite|Drift to the chosen ethic +20%[p]Causes antitheistic trends[p]Duration 1e5 years|
Discriminite|Discriminite|Progress +25% for the chosen ethic[p]Causes antitheistic trends[p]Duration 1e5 years|
Reprex|Reprex|Trends input −90% for the chosen ethic[p]Drift to mysticism and logic +10%[p]Duration 1e5 years|
Archean|Archean|It is difficult to notice, but these planets are full of archaea and cyanobacteria.|
Proterozoic|Proterozoic|Alongside ubiquitous amoeba these planets host algae, sponges and even molluscs.|
Paleozoic|Paleozoic|Ferns, worms, trilobites and fishes.|
Mezozoic|Mesozoic|Conifers, lizards, dinosaurs and therapsids.|
Cenozoic|Cenozoic|Flowering plants and various mammals, some of which show signs of sapience.|
Civ0|Civ0|Pre-space epoch – from a tribe to a federation.|
Civ0.0|Civ0.0|Lower Paleolithic. Control of fire, stone tools.|
Civ0.1|Civ0.1|Middle Paleolithic. Developed stone tools.|
Civ0.2|Civ0.2|Upper Paleolithic. Advanced stone tools, art.|
Civ0.3|Civ0.3|Mesolithic. Bow and arrows, fishing, boats.|
Civ0.4|Civ0.4|Early Neolithic. Agriculture.|
Civ0.5|Civ0.5|Middle Neolithic. Animal husbandry, ceramics.|
Civ0.6|Civ0.6|Late Neolithic. Large settlements.|
Civ0.7|Civ0.7|First kingdoms of copper and bronze ages. Wheel.|
Civ0.8|Civ0.8|Ancient empires of the iron age. Philosophy.|
Civ0.9|Civ0.9|Industrial age. Electronics and nuclear energy.|
Civ1|Civ1|Civilizations that are busy with mastering their own solar system.|
Civ1.0|Civ1.0|Civilization which completely mastered its home planet. Superconductivity, controlled nuclear fusion.|
Civ1.1|Civ1.1|Science is based on other bodies of the home system. Launch loop, space elevator.|
Civ1.2|Civ1.2|Complete genetic tailoring. Cyborgization.|
Civ1.3|Civ1.3|Industrial asteroid mining. Colonies on other planets of the home system.|
Civ1.4|Civ1.4|Harvesting of matter from gas giants’ atmosphere.|
Civ1.5|Civ1.5|Space cities. Picotechnologies: manipulations on individual atoms.|
Civ1.6|Civ1.6|Industrial manufacturing of antimatter. First starships.|
Civ1.7|Civ1.7|Terraforming. Gamma-lasers.|
Civ1.8|Civ1.8|Space stations of continental scale.|
Civ1.9|Civ1.9|Partial Dyson swarm.|
Civ2|Civ2|Civilizations that can expand to other stars.|
Civ2.0|Civ2.0|Civilization that completely exploits the energy output of its own sun.[p]About 1 star is settled (handful).|
Civ2.1|Civ2.1|Change of planetary orbits.[p]About 10 stars are settled (tens).|
Civ2.2|Civ2.2|Control over inertia.[p]About 100 stars are settled (hundreds).|
Civ2.3|Civ2.3|Starlifting, harvesting matter from stars.[p]About 1000 stars are settled (thousands), this is on the scale of a scattered star cluster.|
Civ2.4|Civ2.4|Femtotechnologies: manipulations on individual fermions.[p]About e4 stars are settled (tens of thousands), this is on the scale of a small star cluster.|
Civ2.5|Civ2.5|Deconstruction and creation of planets.[p]About e5 stars are settled (hundreds of thousands), this is on the scale of a medium star cluster.|
Civ2.6|Civ2.6|Complete domination of astroarchitecture over planets.[p]About e6 stars are settled (millions), this is on the scale of a large star cluster.|
Civ2.7|Civ2.7|Giant stars resources exploitation.[p]About e7 stars are settled (tens of millions), this is on the scale of a giant star cluster.|
Civ2.8|Civ2.8|Control over gravity.[p]About e8 stars are settled (hundreds of millions).|
Civ2.9|Civ2.9|Movement of stars.[p]About e9 stars are settled (billions), this is on a scale of a dwarf galaxy such as the Small Magellanic Cloud.|
Civ3|Civ3|Civilizations of galactic scale.|
Civ3.0|Civ3.0|Expansion into a galactic group is available.[p]About e10 stars are settled (tens of billions), this is on a scale of a small galaxy such as the Large Magellanic Cloud.|
Civ3.1|Civ3.1|Creation of stars.[p]About e11 stars are settled (hundreds of billions), this is on a scale of a medium galaxy such as the Milky Way.|
Civ3.2|Civ3.2|Utilization of white dwarfs.[p]About e12 stars are settled (trillions), this is on a scale of a large galaxy such as Andromeda Galaxy.|
Civ3.3|Civ3.3|Creation of black holes by focused radiation.[p]About e13 stars are settled (tens of trillions), this is on a scale of a giant galaxy such as IC 1101.|
Civ3.4|Civ3.4|Expansion into a galactic supercluster is available.[p]About e14 stars are settled (hundreds of trillions) or e1 galaxies (tens).|
Civ3.5|Civ3.5|Utilization of neutron stars.[p]About e15 stars are settled (quadrillions) or e2 galaxies (hundreds).|
Civ3.6|Civ3.6|Expansion into a galactic filament is available.[p]About e16 stars are settled (tens of quadrillions) or e3 galaxies (thousands).|
Civ3.7|Civ3.7|Utilization of magnetars.[p]About e17 stars are settled (hundreds of quadrillions) or e4 galaxies (tens of thousands).|
Civ3.8|Civ3.8|Expansion into a great wall is available.[p]About e18 stars are settled (quintillions) or e5 galaxies (hundreds of thousands).|
Civ3.9|Civ3.9|Utilization of black holes.[p]About e19 stars are settled (tens of quintillions) or e6 galaxies (millions).|
Civ4|Civ4|Civilizations of the universe scale.|
Civ4.0|Civ4.0|Temporal manipulations.[p]About e20 stars are settled (hundreds of quintillions) or e7 galaxies (tens of millions).|
Civ4.1|Civ4.1|Expansion into the whole universe scale is available.[p]About e21 stars are settled (sextillions) or e8 galaxies (hundreds of millions).|
Civ4.2|Civ4.2|Utilization of supermassive black holes.[p]About e22 stars are settled (tens of sextillions) or e9 galaxies (billions).|
Civ4.3|Civ4.3|Folding space.[p]About e23 stars are settled (hundreds of sextillions) or e10 galaxies (tens of billions).|
Civ4.4|Civ4.4|Improbability field.[p]About e24 stars are settled (septillions) or e11 galaxies (hundreds of billions).|
Civ4.5|Civ4.5|About e25 stars are settled (tens of septillions) or e12 galaxies (trillions).|
Civ4.6|Civ4.6|About e26 stars are settled (hundreds of septillions) or e13 galaxies (tens of trillions).|
Civ4.7|Civ4.7|About e27 stars are settled (octillions) or e14 galaxies (hundreds of trillions).|
Civ4.8|Civ4.8|About e28 stars are settled (tens of octillions) or e15 galaxies (quadrillions).|
Civ4.9|Civ4.9|About e29 stars are settled (hundreds of octillions) or e16 galaxies (tens of quadrillions).|
AboutTheGame|About The Game|In this game you can [b]create a universe[/b] and control its development. The final goal can be designated by yourself. Don't forget to check out the list of game achievements and try to reach some of the ones that seem interesting. Read hints, explore possibilities and don't be afraid to experiment. In the worst case you can always start from scratch.[p] [p]Numbers greater than 1 000 are displayed using [b]scientific notation[/b]. 1e4 – this is a 10 000, meaning “one with 4 zeroes”. 1e6 – a million, 1e9 – a billion and so on. 13.77e9 – this is 13 billions 770 millions.[p] [p]The game plays in [b]real time[/b] with changeable scaling. One second of real time can pass a year, a decade, a century and so on. Change the pace of time by using buttons “−” and “+”.|GameHelp/en/AboutTheGame
GameplayBasics|Gameplay Basics|You have access to a very large, but still limited [b]cache of energy[/b] that is used to create the whole matter in the universe and the expanse of the universe's space itself. At the start of the game the vast majority of this energy is not in your direct control. But during the game you will take more and more energy from the cache. The less filled the cache is, the harder it is to obtain new energy. The energy shortage won’t become an urgent problem in the first billion years or so: the cache is really very large.[p] [p]The matter is harvested from the energy cache in the form of [b]hydrogen[/b] by clouds. Hydrogen may be spent to create new clouds and also to create stars. During their burning stars create [b]space[/b] that can be used to place additional stars and clouds. This creation of space also spends some energy from the cache.|GameHelp/en/GameplayBasics
StarsAndStructures|Stars and Structures|The heavier the star is, the faster it burns and the more space it produces. However, on the contrary, the most cost-efficient way of spending hydrogen to obtain new space, is investment into the smallest stars. Unfortunately they burn for a very long time and produce space very slowly. Also each star takes a unit of space, no matter which type the star is.[p] [p]There is a reason to arrange stars and nebulae of the growing universe into galaxies and even larger [b]structures[/b]. Objects that became parts of such structures keep functioning as usual.[p] [p]The proportion between universe matter and space is called density. The universe is only stable when the [b]density[/b] is inside a certain range. If it is too packed or too empty, problems come into being.|GameHelp/en/StarsAndStructures
LifeAndForces|Life and Forces|[b]Planets[/b] form around certain stars, and life may emerge there. In specific circumstances life can evolve to sapience, and sapience can advance to high technology. Life's next step is to try to reclaim the universe, which she assumes as her own.[p] [p]There are many events in the universe that don't happen all the time, only with certain probability. You have access to special [b]forces[/b], which you can use to “tweak” chances of events that are important to you, changing the laws of nature in the process.|GameHelp/en/LifeAndForces
Achievements|Achievements|During the gameplay you will definitely be able to reach certain [b]achievements[/b]. While simpler ones come by themselves, ones that are more complex may be more tricky. You can use the achievements list as a roadmap of hints and suggestions for possible next steps.[p] [p]It is unnecessary to try to finish each and every achievement. This is your own universe and you can do whatever you like with it. However, achievements are a nice thing in general, and besides just having a personal feeling of pride and accomplishment you can easily [b]share[/b] it with friends!|GameHelp/en/Achievements
Karma|Karma|Each obtained achievement grants you a certain number of [b]karmic points[/b]. During the new universe creation you may spend these points to gain some small bonuses that will definitely help you to gain better results.[p] [p]Spent karmic points are not lost: they will be [b]available[/b] for spending again in the next universe. There is a chance that there will be even more of them at that moment.|GameHelp/en/Karma
GaugesAndEnergy|Gauges and Energy|[b]Gauges[/b] of measures that are especially important for an active objects page are located on the dashboard. To check other gauges just swipe the page.[p] [p][b]Energy cache[/b] or “ε”. Any creation of primary resources, meaning hydrogen and space, spends some energy. The lower the proportion of remaining cache, indicated in the middle of the bar, the lower is the efficiency of resource generators, such as clouds for hydrogen and stars for space.[p]The energy cache really is immense, however it is not infinite.|GameHelp/en/GaugesAndEnergy
DensityAndBurnability|Density and Burnability|Average [b]density[/b] of the universe is the ratio of total matter mass, meaning all stars, clouds and so on, to the empty space. It increases alongside the mass and decreases when the space grows. If the “ρ” gauge will leave the “middle zone” and become inclined to any of the two extremeties, then the outcome might surprise you in a bad way.[p] [p][b]Burnability[/b] displays the current burning rate of stars. It can be influenced by universe density (the denser the greater), actions of superadvanced civilizations and forces used by the player.|GameHelp/en/DensityAndBurnability
ExplosivenessAndAggression|Explosiveness and Aggression|[b]Explosiveness[/b] displays the current probability of gamma-ray bursts and the yield of any star collapse explosion. It can be influenced by universe density (the denser the lower), actions of superadvanced civilizations and forces used by the player.[p] [p][b]Aggression[/b] displays the intensity of competition between species, civilizations and their inner factions. It governs the progress and stability of life and societies. It can be influenced by universal trends and forces used by the player.[p]By default the average universal aggression is shown. But you can select any civilization level and observe the average aggression for this level, which can be different from the universal one.|GameHelp/en/ExplosivenessAndAggression
Trends|Trends|[b]Trends[/b] are global goals of universal development that civilizations are inclined to. Aggregation of the actions of multitudes of highly advanced sapients manifests as a certain trend. When it becomes large enough, it influences the universe as a whole.[p]There are five trends: spirituality, antitheism, integration, xenocide and mastery.|GameHelp/en/Trends
SpiritualityAndAntitheism|Spirituality and Antitheism|[b]Spirituality[/b] is understanding and acceptance of a higher will. It is not a secret that a higher power objectively exists in this universe, and enlightened beings are eager to follow it. They are very useful, because their reason for existence is to serve the player. However this behavior of theirs can be felt as being annoyingly clinging.[p] [p][b]Antitheism[/b] is the opposition of the people's will against the higher will. It can lead to an active conflict of sapient beings, inhabiting the universe, to the wishes of the player. In a manner antitheism might be perceived as something undesired. However, if a player is interested in nurturing self-sufficient beings who do not require any support of higher powers, then perhaps this “teenage angst” of your wards is not bad at all.|GameHelp/en/SpiritualityAndAntitheism
IntegrationAndXenocide|Integration and Xenocide|[b]Integration[/b] is peaceful coexistence and unification of various life forms. It leads to a peaceful and harmonious life without conflicts and warfare. This utopia is great in every measure except lowered motivations to progress. A well integrated international society is not afraid of anything and has no real ambitions, because all mundane problems are already solved.[p] [p][b]Xenocide[/b] is a policy of seeking the final solution to the “us or them” question. Denizens of this universe do not trust each other, constantly expecting for a backstab. They argue that if a war is inevitable, then it is better to strike first to get an advantage. The universe is too small for several higher life forms, so in the end there can be only one, the most perfect and advanced of all. Let the strongest prevail!|GameHelp/en/IntegrationAndXenocide
Mastery|Mastery|[b]Mastery[/b] is a rearrangement of the universe for the needs of a civilization. Denizens assume themselves as a peak of evolution, and the universe is supposed to be their habitable space, which has to be reclaimed. They obey the laws of economics and follow their desires, not thinking about distant consequences. Nobody cares what happensafter billions of years, if it is possible to enrich living conditions right now. And descendants won’t be fools anyway, that’s their problem and they can manage it.|GameHelp/en/Mastery
Forces|Forces|[b]Forces[/b] are special powers available to the player. They globally influence the laws of nature that govern your universe. Each day you obtain a new random assortment of powers. Forces are not transfered between games, so there is no point in hoarding them.[p]There are 20 different forces. Ones with green border are common, blue are rare and purple are extra rare, but very powerful. The majority of the forces have innate duration, but there are some that just work instantly and that's it. Forces are detailed on the following help pages.|GameHelp/en/Forces
UniverseForces|Universe Forces|These forces have duration of 1e9 years.[p][b]Hydrogenin[/b] increases the production of hydrogen and decreases the production of space. It is useful the space is plentiful.[p][b]Temporin[/b] allows you to skip 1 billion of years. This power is great when everything works as planned.[p][b]Inflatite[/b] boosts the production of space, but makes structures less stable. You can always create new ones.[p][b]Singularite[/b] makes your supermassive black holes significantly more active. They even consume the space itself, condensing the universe.[p][b]Primex[/b] allows you to use significantly larger portion of helium in creation of new stars and clouds. However, your hydrogen production decreases.|GameHelp/en/UniverseForces
StellarForces|Stellar Forces|These forces have duration of 1e8 years.[p][b]Stellarin[/b] dedicates more hydrogen, produced by stellar nurseries, to automatic making of new stars. However you'll get less hydrogen into your budget.[p][b]Renewin[/b] makes structures more stable for the price of making stars more explosive.[p][b]Infusite[/b] infuses stars with these useless brown dwarfs, which increases their burnability and, occasionally, grows them up.[p][b]Frostite[/b] lowers both burnability and explosiveness of stars. Sometimes the universe needs some chill.[p][b]Desintegrex[/b] breaks some degenerate objects with catastrophical results. It provides you with more metals, but sapient denizens of the universe probably won't like such blatant display of destructive power.|GameHelp/en/StellarForces
PlanetaryForces|Planetary Forces|These forces have duration of 1e7 years.[p][b]Rockein[/b] increases chances of forming rocky and even habitable planets instead of gas giants.[p][b]Panspermin[/b] instantly fills some habitable planets with life, but unfortunately it also reverts other habitable planets into rocky ones.[p][b]Gaianite[/b] converts some rocky planets into habitable ones and also decreases aggression.[p][b]Darwinite[/b] increases progress of evolution for all eons and also increases aggression. Survival of the fittest, you know.[p][b]Edenex[/b] greatly decreases degradation chance for all eons, but also significantly lowers the evolution progress, because everything becomes too good to require adaptation. It also boosts the spirituality trend.|GameHelp/en/PlanetaryForces
CivilizationForces|Civilization Forces|These forces have duration of 1e5 years.[p][b]Pacifin[/b] lowers the aggression. Also it increases drift from bellicosity and to friendliness.[p][b]Enragein[/b] raises the aggression. Also it increases drift from friendliness and to bellicosity.[p][b]Moralite[/b] increases drift to a chosen ethic and causes anitheistic trends, because sapients don't like being told what to do.[p][b]Discriminite[/b] increases progress of advancement for the chosen ethic and causes antitheistic trends, because sapients don't like when you play favorites.[p][b]Reprex[/b] greatly decreases trends input for the chosen ethic. It also causes drift both to mysticism and logic, because sapients try to search answers in different places.|GameHelp/en/CivilizationForces
SpaceAndHydrogen|Space and Hydrogen|The majority of creative actions require spending [b]resources[/b].[p] [p][b]Space[/b] is needed to place everything you are creating. To add new space lit up some stars![p] [p][b]Hydrogen[/b] is required to create nebulae and stars. Nebulae allow you to obtain more hydrogen. Stars are used to make more space and also to harbor planets. Both of these object types also serve as building blocks to create more complex structures.|GameHelp/en/SpaceAndHydrogen
HeliumAndMetals|Helium and Metals|Helium and metals are obtained when stars finish their life cycle.[p][b]Helium[/b] is not especially useful, but it is inescapable. It is automatically spent in a line of hydrogen if possible, conserving the more valuable resource.[p] [p][b]Metals[/b] “contaminate” your hydrogen and helium by heavier elements. And usually it is a good thing, because the high proportion of metals to hydrogen and helium, also known as “metallicity”, provides for a greater chance for planets to emerge near new stars.[p]Metals are added when stars burn out, especially larger ones. But total metellicity may shrink down when the universe is filled by new objects made from pure hydrogen and helium, such as nebulae and stars.|GameHelp/en/HeliumAndMetals
Clouds|Clouds|Clouds are used to produce hydrogen, which is required to construct the universe. Simplest nebulae can be arranged into more complex cloud structures.[p] [p][b]Nebula:[/b] the simplest of clouds.[p][b]Globula:[/b] provides hydrogen at a slower rate than nebulae, but persists for longer, and also takes less space. Used in creation of larger clouds.[p][b]Star nursery:[/b] automatically creates stars from a fraction of provided hydrogen.[p][b]Molecular cloud:[/b] large and long-lasting hydrogen generator.[p][b]Active star nursery:[/b] very large automatic hydrogen and stars generator.|GameHelp/en/Clouds
DwarfStars|Dwarf Stars|Dwarf stars are cheap, they last for a long time and produce space efficiently. They can have planets that sometimes may harbor life at some point.[p] [p][b]Brown dwarf:[/b] useless rejects that happen during the star creation process. They appear by themselves and do not take space as opposed to all the other stars. Can’t be created manually, and you don’t need to.[p][b]Red dwarf:[/b] It is cost-effective in space creation, but works very slowly.[p][b]Orange dwarf:[/b] perfect for the development of life.[p][b]Yellow dwarf:[/b] good for the emergence of life.[p][b]White-yellow dwarf:[/b] has a largest habitable zone, but burns out rapidly.|GameHelp/en/DwarfStars
GiantStars|Giant Stars|Giant stars are expensive, burn rapidly and produce a lot of space. At the end of their existence they collapse and explode. These events can damage planets at nearby stars, but they produce metals.[p] [p][b]Red giant:[/b] a star that has consumed the majority of its fuel. You can’t create these manually, they emerge themselves.[p][b]Yellow giant:[/b] the most modest of giant stars. The collapse is comparatively weak.[p][b]Blue giant:[/b] a common giant star. The collapse creates a lot of space.[p][b]Supergiant:[/b] huge giant star. Burns fast, the collapse is powerful.[p][b]Hypergiant:[/b] extremely giant star. Always collapses into a black hole.|GameHelp/en/GiantStars
DegenerateObjects|Degenerate Objects|Stars that have exhausted their fusion fuel. They occupy space and do not produce anything, but can be used in forming structures.[p] [p][b]White dwarf:[/b] the remains of a dwarf star.[p][b]Neutron star:[/b] exceptionally compact remains of a giant star.[p][b]Magnetar:[/b] the most dense object that is not a black hole.[p][b]Black hole:[/b] the remains of a giant star that experienced a destructive collapse. They may be merged into supermassive black holes.[p][b]Supermassive black hole:[/b] the result of multitudes of the stellar mass black holes merged into one. Required for galactic formation. They do grow in time, consuming other stars, but do so very slowly.|GameHelp/en/DegenerateObjects
StarClusters|Star Clusters|Star clusters are the most modest of available structures. As a matter of fact these are just certain numbers of stars which are co-located closer to each other than usual, and therefore they are gravitationally bound. But even such simple lumps already bring noticeable variety into the homogenous landscape of the universe.[p] [p][b]Scattered:[/b] little structure of irregular shape.[p][b]Small:[/b] globular shape.[p][b]Medium:[/b] noticeable from afar off.[p][b]Large:[/b] makes an impression.[p][b]Giant:[/b] causes awe.|GameHelp/en/StarClusters
Galaxies|Galaxies|[b]Elliptical galaxies[/b] resemble colossal star clusters. They have lenticular shapes, rotate slowly and look very much alike to each other. Star formation is almost completely absent there, so if no life emerged in such a galaxy during the first couple of billion years, then it probably won’t emerge later.[p] [p][b]Spiral galaxies[/b] spin faster than elliptical ones, they have diverse structures with arms and keep active star formation. They are better fit for the emergence and development of life. In time spiral galaxies exhaust their storage of free gas, they slow down and become more stable and boring ellipticals.|GameHelp/en/Galaxies
LargeStructures|Large Structures|[b]Large structures[/b] are called that for a reason: whole galaxies are used there as building blocks. They are needed to arrange the universe on the largest scales. Without them the space, uniformly filled by stars and galaxies, becomes too monotonous and sparse, meanwile these structures create a packing gradient with more and less dense regions. This arrangement is better fit for being claimed and developed by superadvanced sapient beings.|GameHelp/en/LargeStructures
Planets|Planets|Planets emerge around dwarf stars when metals are sufficient. In a sense all this space construction is being made with a purpose of making planets with potential of bearing life.[p] [p][b]Gas giant:[/b] large planet with a very thick atmosphere, unsuitable for life.[p][b]Asteroid belt:[/b] a bunch of rocks that lacks mass to form a planet.[p][b]Rocky planet:[/b] a planet unsuitable for life. Too cold, hot or wrong chemical makeup.[p][b]Habitable planet:[/b] there is liquid water here and life may emerge in the long run.[p][b]Living planet:[/b] denizens of this planet show great promise!|GameHelp/en/Planets
Eons|Eons|Life slowly evolves through eons from the most primitive one to the one with sapience potential. Not all planets are successful in completing this process to the end, because stars do not burn forever.[p] [p][b]Archean:[/b] it is difficult to notice, but these planets are full of archaea and cyanobacteria.[p][b]Paleozoic:[/b] alongside ubiquitous amoeba these planets host algae, sponges and even molluscs.[p][b]Proterozoic:[/b] ferns, worms, trilobites and fishes.[p][b]Mezozoic:[/b] conifers, lizards, dinosaurs and therapsids.[p][b]Cenozoic:[/b] flowering plants and various mammals, some of which show signs of sapience.|GameHelp/en/Eons
Type0Civilizations|Type 0 Civilizations|Pre-space epoch – from a tribe to a federation.[p] [p][b]c0.0:[/b] Lower Paleolithic. Control of fire, stone tools.[p][b]c0.1:[/b] Middle Paleolithic. Developed stone tools.[p][b]c0.2:[/b] Upper Paleolithic. Advanced stone tools, art.[p][b]c0.3:[/b] Mesolithic. Bow and arrows, fishing, boats.[p][b]c0.4:[/b] Early Neolithic. Agriculture.[p][b]c0.5:[/b] Middle Neolithic. Animal husbandry, ceramics.[p][b]c0.6:[/b] Late Neolithic. Large settlements.[p][b]c0.7:[/b] First kingdoms of copper and bronze ages. Wheel.[p][b]c0.8:[/b] Ancient empires of the iron age. Philosophy.[p][b]c0.9:[/b] Industrial age. Electronics and nuclear energy.|GameHelp/en/Type0Civilizations
Type1Civilizations|Type 1 Civilizations|Civilizations are busy with settling their own solar system.[p] [p][b]c1.0:[/b] A civilization that has completely mastered its home planet. Superconductivity, controlled nuclear fusion.[p][b]c1.1:[/b] Research compounds in the home system. Launch loop, space elevator.[p][b]c1.2:[/b] Complete genetic tailoring. Cyborgization.[p][b]c1.3:[/b] Industrial asteroid mining. Colonies on the other planets of the home system.[p][b]c1.4:[/b] Harvesting of matter from atmospheres of gas giants.[p][b]c1.5:[/b] Space cities. Picotechnologies.[p][b]c1.6:[/b] Industrial manufacturing of antimatter. First starships.[p][b]c1.7:[/b] Terraforming. Gamma-lasers.[p][b]c1.8:[/b] Space stations of continental scale.[p][b]c1.9:[/b] Partial Dyson swarm.|GameHelp/en/Type1Civilizations
Type2Civilizations|Type 2 Civilizations|Civilizations that can expand to other stars.[p] [p][b]c2.0:[/b] A civilization that completely exploits the energy output of its own sun.[p][b]c2.1:[/b] Change of planetary orbits.[p][b]c2.2:[/b] Control over inertia.[p][b]c2.3:[/b] Starlifting, harvesting matter from stars.[p][b]c2.4:[/b] Femtotechnologies: manipulations on individual fermions.[p][b]c2.5:[/b] Deconstruction and creation of planets.[p][b]c2.6:[/b] Complete domination of astroarchitecture over planets.[p][b]c2.7:[/b] Giant stars resources exploitation.[p][b]c2.8:[/b] Control over gravity.[p][b]c2.9:[/b] Movement of stars.|GameHelp/en/Type2Civilizations
Type3Civilizations|Type 3 Civilizations|Civilizations of galactic scale.[p] [p][b]c3.0:[/b] Expansion into a galactic group is available.[p][b]c3.1:[/b] Creation of stars.[p][b]c3.2:[/b] Utilization of white dwarfs.[p][b]c3.3:[/b] Creation of black holes by focused radiation.[p][b]c3.4:[/b] Expansion into a galactic supercluster is available.[p][b]c3.5:[/b] Utilization of neutron stars.[p][b]c3.6:[/b] Expansion into a galactic filament is available.[p][b]c3.7:[/b] Utilization of magnetars.[p][b]c3.8:[/b] Expansion into a great wall is available.[p][b]c3.9:[/b] Utilization of black holes.|GameHelp/en/Type3Civilizations
Type4Civilizations|Type 4 Civilizations|Civilizations of the universe scale.[p] [p][b]c4.0:[/b] Temporal manipulations.[p][b]c4.1:[/b] Expansion into the whole universe scale is available.[p][b]c4.2:[/b] Utilization of supermassive black holes.[p][b]c4.3:[/b] Folding space.[p][b]c4.4:[/b] Improbability field.[p] [p]And so on, bigger and bigger, so long as there is space.|GameHelp/en/Type4Civilizations
-3
View File
@@ -1,3 +0,0 @@
[remap]
importer="keep"
-115
View File
@@ -1,115 +0,0 @@
name|label|description|image
Hydrogenin|Водородин|Производство водорода +100%<br>Производство пространства −50%<br>Длительность 1e9 лет|
Temporin|Темпорин|Пропуск 1 миллиарда лет<br><br>|
Inflatite|Инфлатит|Производство пространства +100%<br>Возраст структур +10%<br>Длительность 1e9 лет|
Singularite|Сингулярит|Поглощение пространства СМЧД +1000%<br>Поглощение звёзд СМЧД +100%<br>Длительность 1e9 лет|
Primex|Примекс|Использование гелия +200%<br>Производство водорода −50%<br>Длительность 1e9 лет|
Stellarin|Звездин|Автоматизация производства звёзд +50%<br><br>Длительность 1e8 лет|
Renewin|Обновин|Возраст структур −10%<br>Взрывчатость +10%<br>Длительность 1e8 лет|
Infusite|Инфузит|Горючесть +10%<br>5% бурых карликов вливается в звёзды<br>Длительность 1e8 лет|
Frostite|Фростит|Взрывчатость −10%<br>Горючесть −10%<br>Длительность 1e8 лет|
Desintegrex|Дезинтегрекс|Разрушает 1% вырожденных объектов<br>Вызывает гамма-всплески и антитеистические тенденции<br>|
Rockein|Камнеин|Шанс формирования каменистых планет +50%, обитаемых +25%<br>Шанс формирования газовых гигантов −75%<br>Длительность 1e7 лет|
Panspermin|Панспермин|1% обитаемых планет становятся живыми<br>5% обитаемых планет становятся каменистыми<br>|
Gaianite|Гайянит|5% каменистых планет становятся обитаемыми<br>Агрессивность −5%<br>Длительность 1e7 лет|
Darwinite|Дарвинит|Прогресс +25% для всех эонов<br>Агрессивность +5%<br>Длительность 1e7 лет|
Edenex|Эдемекс|Деградация −90% для всех эонов<br>Прогресс −50% для всех эонов, духовность<br>Длительность 1e7 лет|
Pacifin|Пацифин|Агрессивность −10%<br>Дрейф от воинственности и к дружелюбию +5%<br>Длительность 1e5 лет|
Enragein|Озверин|Агрессивность +10%<br>Дрейф от дружелюбия и к воинственности +5%<br>Длительность 1e5 лет|
Moralite|Моралит|Дрейф к выбранной этике +20%<br>Вызывает антитеистические тенденции<br>Длительность 1e5 лет|
Discriminite|Дискриминит|Прогресс +25% для выбранной этики<br>Вызывает антитеистические тенденции<br>Длительность 1e5 лет|
Reprex|Репрекс|Вклад в тенденции −90% для выбранной этики<br>Дрейф к мистике и к логике +10%<br>Длительность 1e5 лет|
Archean|Архей|Не сразу бросается в глаза, но на таких планетах полно археев и цианобактерий.|
Proterozoic|Протерозой|Помимо вездесущих амёб, здесь присутствуют водоросли, губки и даже моллюски.|
Paleozoic|Палеозой|Папоротники, черви, трилобиты и рыбы.|
Mezozoic|Мезозой|Голосеменные, ящеры, динозавры и терапсиды.|
Cenozoic|Кайнозой|Покрытосеменные и разнообразные млекопитающие, некоторые из которых проявляют признаки интеллекта.|
Civ0|ц0|Докосмическая эпоха — от племени до федерации.|
Civ0.0|ц0.0|Нижний палеолит. Приручение огня, каменные орудия.|
Civ0.1|ц0.1|Средний палеолит. Развитые каменные орудия.|
Civ0.2|ц0.2|Верхний палеолит. Сложные каменные орудия, искусство.|
Civ0.3|ц0.3|Мезолит. Лук и стрелы, рыболовство, лодки.|
Civ0.4|ц0.4|Ранний неолит. Земледелие.|
Civ0.5|ц0.5|Средний неолит. Скотоводство, керамика.|
Civ0.6|ц0.6|Поздний неолит. Крупные поселения.|
Civ0.7|ц0.7|Первые царства медного и бронзового века. Колесо.|
Civ0.8|ц0.8|Античные империи железного века. Философия.|
Civ0.9|ц0.9|Промышленная эпоха. Электричество.|
Civ1|ц1|Цивилизации, осваивающие родную солнечную систему.|
Civ1.0|ц1.0|Цивилизация, освоившая родную планету. Сверхпроводимость, управляемый термоядерный синтез.|
Civ1.1|ц1.1|Научные базы на других телах родной системы. Пусковая петля, космический лифт.|
Civ1.2|ц1.2|Полное управление генетикой. Киборгизация.|
Civ1.3|ц1.3|Промышленная добыча астероидов. Колонии на других планетах родной системы.|
Civ1.4|ц1.4|Сбор вещества из атмосфер газовых гигантов.|
Civ1.5|ц1.5|Космические города. Пикотехнологии: управление отдельными атомами.|
Civ1.6|ц1.6|Промышленное производство антивещества. Первые звездолёты.|
Civ1.7|ц1.7|Терраформинг. Гамма-лазеры.|
Civ1.8|ц1.8|Космические станции континентального масштаба.|
Civ1.9|ц1.9|Частичный рой Дайсона.|
Civ2|ц2|Цивилизации, ведущие экспансию к иным звёздам.|
Civ2.0|ц2.0|Цивилизация, освоившая энергию родного солнца. <br> Заселено порядка 1 звезды (единицы).|
Civ2.1|ц2.1|Изменение планетарных орбит. <br> Заселено порядка 10 звёзд (десятки).|
Civ2.2|ц2.2|Управление инерцией. <br> Заселено порядка 100 звёзд (сотни).|
Civ2.3|ц2.3|Сбор вещества со звёзд. <br> Заселено порядка 100 звёзд (тысячи), это масштаб рассеянного звёздного скопления.|
Civ2.4|ц2.4|Фемтотехнологии: управление отдельными фермионами. <br> Заселено порядка e4 звёзд (десятки тысяч), это масштаб малого звёздного скопления.|
Civ2.5|ц2.5|Деконструкция и сборка планет. <br> Заселено порядка e5 звёзд (сотни тысяч), это масштаб среднего звёздного скопления.|
Civ2.6|ц2.6|Полное доминирование астроархитектуры над планетами. <br> Заселено порядка e6 звёзд (миллионы), это масштаб большого звёздного скопления.|
Civ2.7|ц2.7|Освоение ресурсов звёзд-гигантов. <br> Заселено порядка e7 звёзд (десятки миллионов), это масштаб гигантского звёздного скопления.|
Civ2.8|ц2.8|Управление гравитацией. <br> Заселено порядка e8 звёзд (сотни миллионов).|
Civ2.9|ц2.9|Перемещение звёзд. <br> Заселено порядка e9 звёзд (миллиарды), это масштаб карликовой галактики вроде Малого Магелланова Облака.|
Civ3|ц3|Цивилизации галактического масштаба.|
Civ3.0|ц3.0|Возможна экспансия в группу галактик. <br> Заселено порядка e10 звёзд (десятки миллиардов), это масштаб малой галактики вроде Большого Магелланова Облака.|
Civ3.1|ц3.1|Создание звёзд. <br> Заселено порядка e11 звёзд (сотни миллиардов), это масштаб средней галактики вроде Млечного Пути.|
Civ3.2|ц3.2|Использование белых карликов. <br> Заселено порядка e12 звёзд (триллионы), это масштаб большой галактики вроде Туманности Андромеды.|
Civ3.3|ц3.3|Создание чёрных дыр из концентрированного излучения. <br> Заселено порядка e13 звёзд (десятки триллионов), это масштаб гигантской галактики вроде IC 1101.|
Civ3.4|ц3.4|Возможна экспансия в сверхскопление. <br> Заселено порядка e14 звёзд (сотни триллионов) или e1 галактик (десятки).|
Civ3.5|ц3.5|Использование нейтронных звёзд. <br> Заселено порядка e15 звёзд (квадриллионы) или e2 галактик (сотни).|
Civ3.6|ц3.6|Возможна экспансия в галактическую нить. <br> Заселено порядка e16 звёзд (десятки квадриллионов) или e3 галактик (тысячи).|
Civ3.7|ц3.7|Использование магнетаров. <br> Заселено порядка e17 звёзд (сотни квадриллионов) или e4 галактик (десятки тысяч).|
Civ3.8|ц3.8|Возможна экспансия в великую стену. <br> Заселено порядка e18 звёзд (квинтиллионы) или e5 галактик (сотни тысяч).|
Civ3.9|ц3.9|Использование чёрных дыр. <br> Заселено порядка e19 звёзд (десятки квинтиллионов) или e6 галактик (миллионы).|
Civ4|ц4|Цивилизации вселенского масштаба.|
Civ4.0|ц4.0|Манипуляции со временем. <br> Заселено порядка e20 звёзд (сотни квинтиллионов) или e7 галактик (десятки миллионов).|
Civ4.1|ц4.1|Возможна экспансия на масштабы всей вселенной. <br> Заселено порядка e21 звёзд (секстиллионы) или e8 галактик (сотни миллионов).|
Civ4.2|ц4.2|Использование сверхмассивных чёрных дыр. <br> Заселено порядка e22 звёзд (секстиллионы) или e9 галактик (миллиарды).|
Civ4.3|ц4.3|Складное пространство. <br> Заселено порядка e23 звёзд (сотни секстиллионов) или e10 галактик (десятки миллиардов).|
Civ4.4|ц4.4|Поле невероятности. <br> Заселено порядка e24 звёзд (септиллионы) или e11 галактик (сотни миллиардов).|
Civ4.5|ц4.5|Заселено порядка e25 звёзд (десятки септиллионов) или e12 галактик (триллионы).|
Civ4.6|ц4.6|Заселено порядка e26 звёзд (сотни септиллионов) или e13 галактик (десятки триллионов).|
Civ4.7|ц4.7|Заселено порядка e27 звёзд (октиллионы) или e14 галактик (сотни триллионов).|
Civ4.8|ц4.8|Заселено порядка e28 звёзд (десятки октиллионов) или e15 галактик (квадриллионы).|
Civ4.9|ц4.9|Заселено порядка e29 звёзд (сотни октиллионов) или e16 галактик (десятки квадриллионов).|
AboutTheGame|Об игре|В этой игре вы можете <b>создать вселенную</b> и управлять её развитием. Конечную цель вы определяете для себя самостоятельно. Попробуйте получить те достижения, которые вам понравятся. Читайте подсказки, исследуйте возможности и не бойтесь экспериментировать. Всегда можно начать всё заново.<br><br>Числа больше 1 000 записаны <b>экспоненциально</b>. 1e4 — это 10 000, то есть «единица, у которой 4 нуля». 1е6 — миллион, 1е9 — миллиард и так далее. 13,77е9 — это 13 миллиардов 770 миллионов.<br><br>Игра идёт в реальном времени с изменяемым масштабированием. За одну секунду может пройти год, десять лет, век и так далее. Меняйте скорость течения времени кнопками «−» и «+».|GameHelp/ru/AboutTheGame
GameplayBasics|Основы игры|Вам доступен большой, но конечный <b>запас энергии</b>, нужной для создания всего вещества во вселенной и самого её пространства. В начале подавляющая часть этой энергии вам напрямую недоступна. Но в ходе игры вы будете забирать всё больше энергии, и чем меньше её останется в запасе, тем сложнее будет брать новую. Нехватка энергии не станет острой проблемой в ближайший миллиард лет или около того: запас действительно очень велик.<br><br>Из энергии с помощью облаков производится вещество в виде <b>водорода</b>. Он тратится на создание новых облаков и звёзд. Звёзды в процессе горения создают <b>пространство</b>, в котором могут быть размещены новые звёзды и облака. Создание пространства также расходует некоторую часть энергии из общего запаса.|GameHelp/ru/GameplayBasics
StarsAndStructures|Звёзды и структуры|Чем массивнее звезда, тем быстрее она сгорает и больше пространства производит. Самым выгодным вложением водорода на полученное пространство являются самые маленькие звёзды. Но они горят очень долго и медленно производят пространство. Также каждая звезда сама занимает единицу пространства.<br><br>Звёзды и туманности растущей вселенной есть смысл организовывать в галактики и более крупные <b>структуры</b>. Объекты, ставшие частью таких структур, продолжают функционировать как обычно.<br><br>Соотношение между веществом и свободным пространством называется <b>плотностью</b>. Вселенная стабильна только в определённом диапазоне плотности. При выходе за его рамки возникают проблемы.|GameHelp/ru/StarsAndStructures
LifeAndForces|Жизнь и силы|Возле некоторых звёзд возникают <b>планеты</b>, на которых может появиться жизнь. При определённых обстоятельствах жизнь эволюционирует до разумной, а разумная развивается до высокотехнологичной. Далее она пытается освоить вселенную, которую считает своей.<br><br>Многие события во вселенной случаются не всегда, а лишь с некоторой вероятностью. У вас есть доступ к особым <b>силам</b>, с помощью которых вы можете «подкручивать» вероятности интересующих вас событий, влияя на законы природы.|GameHelp/ru/LifeAndForces
Achievements|Достижения|В ходе игры вам совершенно точно удастся выполнить некоторые <b>достижения</b>. Простые получаются сами собой, а вот над более сложными может понадобиться призадуматься. Можно использовать список достижений в качестве карты подсказок возможных следующих шагов.<br><br>Гнаться за всеми достижениями необязательно. Это ваша вселенная и вы можете делать с ней что угодно. Однако достижение есть достижение, и помимо личной гордости о проделанной работе вы сможете с лёгкостью <b>поделиться</b> им с друзьями!|GameHelp/ru/Achievements
Karma|Карма|Каждое полученное достижение даёт вам некоторое число <b>кармических очков</b>. При создании новой вселенной вы можете потратить полученные очки на получение небольших бонусов, с помощью которых вам непременно удастся добиться лучших результатов.<br><br>Потраченные кармические очки никуда не деваются: они <b>остаются</b> с вами и вы снова сможете их потратить в следующей вселенной. Скорее всего, к этому моменту их станет ещё больше.|GameHelp/ru/Karma
GaugesAndEnergy|Индикаторы и энергия|На приборной панели расположены <b>индикаторы</b> тех показателей, которые особенно важны для выбранной страницы с объектами.<br><br><b>Запас энергии</b> или «ε». На любое производство первичных ресурсов, то есть водорода и пространства, расходуется запас энергии. Чем ниже доля оставшегося запаса, указанная в середине полоски, тем с меньшей эффективностью работают источники создания ресурсов, такие как облака для водорода и звёзды для пространства.<br>Запас энергии правда очень велик, хоть и не бесконечен.|GameHelp/ru/GaugesAndEnergy
DensityAndBurnability|Плотность и горючесть|Средняя <b>плотность</b> вселенной это отношение общей массы вещества, то есть всех звёзд, облаков и так далее, к пустому пространству. Она растёт вместе с массой и уменьшается с ростом пространства. Если индикатор «ρ» выйдет из «средней зоны» и склонится к одной из крайностей, то последствия могут вас неприятно удивить.<br><br><b>Горючесть</b> показывает текущую скорость горения звёзд. На неё могут влиять плотность вселенной (чем больше, тем выше), действия сверхразвитых цивилизаций и силы игрока.|GameHelp/ru/DensityAndBurnability
ExplosivenessAndAggression|Взрывчатость и агрессия|<b>Взрывчатость</b> показывает текущую вероятность гамма-всплесков и мощность взрыва при любом коллапсе звезды-гиганта. На неё могут влиять плотность вселенной (чем больше, тем ниже), действия сверхразвитых цивилизаций и силы игрока.<br><br><b>Агрессия</b> показывает интенсивность конкурентной борьбы между видами, цивилизациями и их внутренними фракциями. Она влияет на развитие и стабильность жизни и обществ. Изменяется под воздействием вселенских тенденций и сил игрока.<br>По умолчанию показывается средняя вселенская агрессия. Но можно выделить какой-либо цивилизационный уровень и увидеть среднюю агрессию именно для этого уровня.|GameHelp/ru/ExplosivenessAndAggression
Trends|Тенденции|<b>Тенденциями</b> называются глобальные цели развития вселенной, к которым тяготеют цивилизации. Совокупность действий множества высокоразвитых существ проявляет себя как та или иная тенденция, по достижении некоторого порога величины влияющая на вселенную в целом.<br><br>Всего есть пять тенденций: духовность, антитеизм, интеграция, ксеноцид и владение.|GameHelp/ru/Trends
SpiritualityAndAntitheism|Духовность и антитеизм|<b>Духовность</b> это понимание и принятие высшей воли. Не секрет, что в этой вселенной высшая воля объективно присутствует, и просветлённые существа готовы ей следовать. Они очень полезны, поскольку смысл их существования в услужении игроку. Однако это поведение может восприниматься как раздражающая навязчивость.<br><br><b>Антитеизм</b> это противопоставление воли людей высшей воле. Он может привести к конфликту разумных обитателей вселенной с желаниями игрока. В некотором смысле антитеизм может восприниматься как нечто нежелательное. Однако если игрок хочет вырастить самостоятельных существ, которым не нужно покровительство высших сил, тогда ничего страшного в «подростковом бунте» подопечных на самом деле и нет.|GameHelp/ru/SpiritualityAndAntitheism
IntegrationAndXenocide|Интеграция и ксеноцид|<b>Интеграция</b> это мирное сосуществование и объединение различных форм жизни. Она приводит к мирной и гармоничной жизни без конфликтов и войн. Эта утопия хороша всем, кроме снижения стимулов к развитию. Плотно интегрированное международное сообщество ничего не боится и ни к чему не стремится, поскольку все насущные проблемы и так решены.<br><br><b>Ксеноцид</b> это политика окончательного решения вопроса «мы или они». Жители такой вселенной не доверяют друг другу и рассуждают, что раз уж война всё равно неизбежна, то для получения преимущества надо бить первыми. Вселенная слишком мала для нескольких высших форм жизни, поэтому в конце должна остаться только одна, наиболее совершенная и высокоразвитая из всех. Пусть выживет сильнейший!|GameHelp/ru/IntegrationAndXenocide
Mastery|Владение|<b>Владение</b> это перестройка вселенной для нужд цивилизации. Жители считают себя вершиной эволюции, а вселенную воспринимают как пространство для освоения. Они подчиняются законам экономики и служат собственным желаниям, не думая о последствиях. Неважно, что случится через миллиарды лет, если можно поднять качество жизни. А потомки не дураки, сами разберутся, это уже их проблемы.|GameHelp/ru/Mastery
Forces|Силы|<b>Силы</b> это особые способности, доступные игроку. Они глобально влияют на законы природы, управляющие вашей вселенной. Каждый день вы получаете новый случайный набор сил. Силы не переходят из одной партии в другую, поэтому их нет особого смысла беречь.<br>Всего есть 20 различных сил. Силы с зелёной границей встречаются чаще всего, синие реже, а фиолетовые особенно редки, но очень мощны. У большинства сил есть определённая длительность, но некоторые из них просто срабатывают мгновенно и всё. Силы разъяснены на следующих страницах помощи.|GameHelp/ru/Forces
UniverseForces|Вселенские силы|Длительность этих сил равна 1e9 лет.<br><b>Водородин</b> увеличивает производство водорода и уменьшает производство пространства. Полезен, когда пространства и так хватает.<br><b>Темпорин</b> позволяет вам пропустить 1 миллиард лет. Эта сила полезна, когда всё идёт по плану.<br><b>Инфлатит</b> усиливает производство пространства, но структуры становятся менее стабильными. Вы всегда можете сделать новые.<br><b>Сингулярит</b> делает ваши сверхмассивные чёрные дыры значительно активнее. Они даже начинают поглощать пустое пространство, уплотняя вселенную.<br><b>Примекс</b> позволяет вам использовать гораздо большую долю гелия вместо водорода при создании новых звёзд и облаков. Однако ваше производство водорода уменьшается.|GameHelp/ru/UniverseForces
StellarForces|Звёздные силы|Длительность этих сил равна 1e8 лет.<br><b>Звездин</b> направляет большую часть водорода, производимого звёздными колыбелями, на автоматическое создание новых звёзд. Вы получите меньше водорода в свой бюджет.<br><b>Обновин</b> повышает стабильность структур, но делает звёзды более взрывчатыми.<br><b>Инфузит</b> вливает в звёзды эти бесполезные бурые карлики, что увеличивает их горючесть и, время от времени, их размеры.<br><b>Фростит</b> понижает горючесть и взрывчатость звёзд. Иногда вселенной полезно слегка остыть.<br><b>Дезинтегрекс</b> разламывает некоторые вырожденные объекты с катастрофическими последствиями. Вы получаете больше металлов, но разумным жителям вселенной вряд ли придётся по вкусу такая грубая демонстрация разрушительной мощи.|GameHelp/ru/StellarForces
PlanetaryForces|Планетные силы|Длительность этих сил равна 1e7 лет.<br><b>Камнеин</b> увеличивает шанс появления каменистых и даже обитаемых планет вместо газовых гигантов.<br><b>Панспермин</b> мгновено заполняет некоторые обитаемые планеты жизнью, но, к сожалению, он портит другие обитаемые планеты, делая их каменистыми.<br><b>Гайянит</b> превращает некоторые каменистые планеты в обитаемые, а также снижает агрессивность.<br><b>Дарвинит</b> ускоряет прогресс эволюции для всех эонов, а также повышает агрессивность. Выживание сильнейших, понятное дело.<br><b>Эдемекс</b> мощно снижает шанс деградации для всех эонов, но также значительно замедляет эволюционный прогресс, потому что всё становится слишком благостным и не требует адаптации. Также он усиливает тенденцию духовности.|GameHelp/ru/PlanetaryForces
CivilizationForces|Цивилизационные силы|Длительность этих сил равна 1e5 лет.<br><b>Пацифин</b> снижает агрессивность. Также он увеличивает дрейф от воинственности и к дружелюбию.<br><b>Озверин</b> повышает агрессивность. Также он увеличивает дрейф от дружелюбия и к воинственности.<br><b>Моралит</b> увеличивает дрейф к выбранной этике и вызывает антитеистические тенденции, потому что разумным существам не нравится, когда им указывают, что делать.<br><b>Дискриминит</b> увеличивает прогресс развития для выбранной этики и вызывает антитеистические тенденции, потому что разумным существам не нравится, когда выбирается любимчик.<br><b>Репрекс</b> мощно снижает вклад в тенденции для выбранной этики. Также он вызывает дрейф одновременно к мистике и логике, потому что разумные существа пытаются искать ответы в разных местах.|GameHelp/ru/CivilizationForces
SpaceAndHydrogen|Пространство и водород|Большинство созидательных действий требует траты ресурсов.<br><br><b>Пространство</b> нужно для размещения всего того, что вы создаёте. Для создания нового пространства зажигайте звёзды!<br><br><b>Водород</b> требуется для создания туманностей и звёзд. Туманности позволяют получать больше водорода. Звёзды создают пространство и используются для базирования планет. Эти объекты также служат кирпичиками для возведения сложных структур.|GameHelp/ru/SpaceAndHydrogen
HeliumAndMetals|Гелий и металлы|Гелий и металлы остаются, когда звёзды завершают своё существование.<br><b>Гелий</b> не особенно полезен, но от него никуда не деться. Он расходуется автоматически, по возможности замещая водород, экономя более полезный ресурс.<br><br><b>Металлы</b> «загрязняют» ваш запас водорода и гелия более тяжёлыми элементами. Это хорошо, поскольку высокая «металличность», отношение металлов к водороду и гелию, увеличивает вероятность возникновения планет у новых звёзд.<br>Металлы добавляются от сгорания звёзд, особенно больших, но общая металличность может уменьшаться, когда вселенная наполняется новыми объектами из чистого водорода и гелия, такими как туманности и звёзды.|GameHelp/ru/HeliumAndMetals
Clouds|Облака|Облака нужны для создания водорода, из которого впоследствии можно построить вселенную. Из базовых туманностей можно собирать более сложные облачные структуры.<br><br><b>Туманность:</b> самое простое облако.<br><b>Глобула:</b> даёт водород медленнее туманности, но существует дольше, а также занимает меньше места. Используется в создании более крупных облаков.<br><b>Звёздная колыбель:</b> автоматически создаёт звёзды из части выданного водорода.<br><b>Молекулярное облако:</b> большой и долговременный генератор водорода.<br><b>Активная звёздная колыбель:</b> очень большой автоматический генератор водорода и звёзд.|GameHelp/ru/Clouds
DwarfStars|Звёзды-карлики|Звёзды-карлики дёшевы, существуют долго и производят пространство эффективно. У них бывают планеты, на которых впоследствии может развиться жизнь.<br><br><b>Бурый карлик:</b> брак, бесполезный побочный эффект от создания звёзд. Они возникают сами и не занимают пространство в отличие от остальных звёзд. Производить их специально нельзя, да и не нужно.<br><b>Красный карлик:</b> экономически выгоден для производства пространства, но работает очень медленно.<br><b>Оранжевый карлик:</b> идеален для развития жизни.<br><b>Жёлтый карлик:</b> подходит для возникновения жизни.<br><b>Бело-жёлтый карлик:</b> имеет самую большую зону обитания, но быстро выгорает.|GameHelp/ru/DwarfStars
GiantStars|Звёзды-гиганты|Звёзды-гиганты дороги, быстро сгорают и производят много пространства. В конце существования они коллапсируют и взрываются, что может повредить планеты у соседних звёзд, но производит металлы.<br><br><b>Красный гигант:</b> звезда, израсходовавшая большую часть запаса топлива. Их нельзя производить специально, они появляются сами.<br><b>Жёлтый гигант:</b> самая скромная из звёзд-гигантов. Коллапс сравнительно слаб.<br><b>Голубой гигант:</b> обычная звезда-гигант. Коллапс создаёт много пространства.<br><b>Сверхгигант:</b> огромная звезда-гигант. Живёт недолго, коллапсирует бурно.<br><b>Гипергигант:</b> экстремальная звезда-гигант. Всегда коллапсирует в чёрную дыру.|GameHelp/ru/GiantStars
DegenerateObjects|Вырожденные объекты|Звёзды, выработавшие своё термоядерное топливо. Они занимают пространство и ничего не производят, но из них можно собирать структуры.<br><br><b>Белый карлик:</b> остаток сгоревшего карлика.<br><b>Нейтронная звезда:</b> исключительно компактный остаток звезды-гиганта.<br><b>Магнетар:</b> самый плотный объект, не являющийся чёрной дырой.<br><b>Чёрная дыра:</b> остаток огромной звезды, прошедшей разрушительный коллапс. Их можно объединять в сверхмассивные чёрные дыры.<br><b>Сверхмассивная чёрная дыра:</b> результат слияния множества чёрных дыр звёздной массы. Необходимы для создания галактик. Растут самостоятельно за счёт прочих звёзд, хотя и очень медленно.|GameHelp/ru/DegenerateObjects
StarClusters|Звёздные скопления|Звёздные скопления являются самыми скромными из структур. Фактически это просто некоторое количество звёзд, расположенных ближе друг к другу, чем обычно и из-за этого гравитационно связанных. Но даже подобные комки уже вносят заметное разнообразие в однородный вселенский ландшафт.<br><br><b>Рассеянное:</b> небольшая структура неправильной формы.<br><b>Малое:</b> имеет шарообразную форму.<br><b>Среднее:</b> заметно издалека.<br><b>Большое:</b> производит впечатление.<br><b>Гигантское:</b> вызывает трепет.|GameHelp/ru/StarClusters
Galaxies|Галактики|<b>Эллиптические галактики</b> напоминают колоссальные звёздные скопления. Они имеют линзовидную форму, вращаются медленно и довольно похожи друг на друга. В них почти не идёт процесс звездообразования, поэтому если жизнь в такой галактике не зародилась в первые пару миллиардов лет, то вряд ли она появится в дальнейшем.<br><br><b>Спиральные галактики</b> вращаются быстрее эллиптических, имеют неоднородную структуру с рукавами и поддерживают активное звездообразование. Они лучше подходят для зарождения и развития жизни. Со временем в спиральных галактиках заканчивается запас газа, они замедляются и превращаются в более стабильные и скучные эллиптические.|GameHelp/ru/Galaxies
LargeStructures|Большие структуры|<b>Большие структуры</b> не зря так называются: в качестве строительных кирпичиков в них используются целые галактики. Они нужны для организации вселенной на самых больших масштабах. Без них пространство, равномерно заполненное звёздами и галактиками, оказывается слишком однообразным и разреженным, тогда как они создают градиент заполнения с более и менее плотными областями, более подходящий для освоения сверхразвитыми разумными существами.|GameHelp/ru/LargeStructures
Planets|Планеты|Планеты возникают у звёзд-карликов при наличии металлов. В некотором смысле всё это космическое строительство проводится ради тех планет, у которых есть потенциал для зарождения жизни.<br><br><b>Газовый гигант:</b> большая планета с чрезвычайно плотной атмосферой, непригодная для жизни.<br><b>Пояс астероидов:</b> куча камней недостаточной массы, чтобы собраться в планету.<br><b>Каменистая планета:</b> непригодная для жизни планета. Слишком холодно, жарко или не тот химический состав.<br><b>Обитаемая планета:</b> здесь есть жидкая вода и в перспективе может образоваться жизнь.<br><b>Живая планета:</b> обитатели этой планеты подают большие надежды!|GameHelp/ru/Planets
Eons|Эоны|Жизнь медленно эволюционирует через эоны от самой примитивной до способной к появлению разума. Не всем планетам удаётся довести этот процесс до победного конца, потому что звёзды горят не вечно.<br><br><b>Архей:</b> не сразу бросается в глаза, но на таких планетах полно археев и цианобактерий.<br><b>Палеозой:</b> помимо вездесущих амёб, здесь присутствуют водоросли, губки и даже моллюски.<br><b>Протерозой:</b> папоротники, черви, трилобиты и рыбы.<br><b>Мезозой:</b> голосеменные, ящеры, динозавры и терапсиды.<br><b>Кайнозой:</b> покрытосеменные и разнообразные млекопитающие, некоторые из которых проявляют признаки интеллекта.|GameHelp/ru/Eons
Type0Civilizations|Цивилизации типа 0|Докосмическая эпоха — от племени до федерации.<br><br><b>ц0.0:</b> нижний палеолит. Приручение огня, каменные орудия.<br><b>ц0.1:</b> средний палеолит. Развитые каменные орудия.<br><b>ц0.2:</b> верхний палеолит. Сложные каменные орудия, искусство.<br><b>ц0.3:</b> мезолит. Лук и стрелы, рыболовство, лодки.<br><b>ц0.4:</b> ранний неолит. Земледелие.<br><b>ц0.5:</b> средний неолит. Скотоводство, керамика.<br><b>ц0.6:</b> поздний неолит. Крупные поселения.<br><b>ц0.7:</b> первые царства медного и бронзового века. Колесо.<br><b>ц0.8:</b> античные империи железного века. Философия.<br><b>ц0.9:</b> промышленная эпоха. Электричество.|GameHelp/ru/Type0Civilizations
Type1Civilizations|Цивилизации типа 1|Цивилизации, заселяющие родную солнечную систему.<br><br><b>ц1.0:</b> цивилизация, освоившая родную планету. Сверхпроводимость, термоядерный синтез.<br><b>ц1.1:</b> научные базы в родной системе. Пусковая петля, космический лифт.<br><b>ц1.2:</b> полное управление генетикой. Киборгизация.<br><b>ц1.3:</b> промышленная добыча астероидов. Поселения в родной системе.<br><b>ц1.4:</b> сбор вещества из атмосфер газовых гигантов.<br><b>ц1.5:</b> космические города. Пикотехнологии.<br><b>ц1.6:</b> промышленное антивещество. Первые звездолёты.<br><b>ц1.7:</b> терраформинг. Гамма-лазеры.<br><b>ц1.8:</b> космические станции континентального масштаба.<br><b>ц1.9:</b> частичный рой Дайсона.|GameHelp/ru/Type1Civilizations
Type2Civilizations|Цивилизации типа 2|Цивилизации, ведущие экспансию к иным звёздам.<br><br><b>ц2.0:</b> цивилизация, освоившая энергию родного солнца.<br><b>ц2.1:</b> изменение планетарных орбит.<br><b>ц2.2:</b> управление инерцией.<br><b>ц2.3:</b> сбор вещества со звёзд.<br><b>ц2.4:</b> фемтотехнологии: управление отдельными фермионами.<br><b>ц2.5:</b> деконструкция и сборка планет.<br><b>ц2.6:</b> окончательное переселение с планет в космос.<br><b>ц2.7:</b> освоение ресурсов звёзд-гигантов.<br><b>ц2.8:</b> управление гравитацией.<br><b>ц2.9:</b> перемещение звёзд.|GameHelp/ru/Type2Civilizations
Type3Civilizations|Цивилизации типа 3|Цивилизации галактического масштаба.<br><br><b>ц3.0:</b> возможна экспансия в группу галактик.<br><b>ц3.1:</b> создание звёзд.<br><b>ц3.2:</b> использование белых карликов.<br><b>ц3.3:</b> создание чёрных дыр из концентрированного излучения.<br><b>ц3.4:</b> возможна экспансия в сверхскопление.<br><b>ц3.5:</b> использование нейтронных звёзд.<br><b>ц3.6:</b> возможна экспансия в галактическую нить.<br><b>ц3.7:</b> использование магнетаров.<br><b>ц3.8:</b> возможна экспансия в великую стену.<br><b>ц3.9:</b> использование чёрных дыр.|GameHelp/ru/Type3Civilizations
Type4Civilizations|Цивилизации типа 4|Цивилизации вселенского масштаба.<br><br><b>ц4.0:</b> манипуляции со временем.<br><b>ц4.1:</b> возможна экспансия на масштабы всей вселенной.<br><b>ц4.2:</b> использование сверхмассивных чёрных дыр.<br><b>ц4.3:</b> складное пространство.<br><b>ц4.4:</b> поле невероятности.<br><br>И так далее, всё больше и больше, пока есть место.|GameHelp/ru/Type4Civilizations
-3
View File
@@ -1,3 +0,0 @@
[remap]
importer="keep"
+420
View File
@@ -0,0 +1,420 @@
class_name OwniverseAchievementLoader
static func get_data() -> Dictionary:
return {
'en': CSVLoader.load(EN),
'ru': CSVLoader.load(RU),
}
#region RU
const RU := """
id|Category|Points|progr: 60|Ignore|OpenCondition|AchieveCondition|Ru1|Ru2
a1|время|1|||age::1E9|age::1E9|Хорошее начало!|Вселенная существует миллиард лет.
a2|время|3|||age::1E10|age::1E10|Средний возраст.|Вселенная существует десять миллиардов лет.
a3|время|6|||age::1E11|age::1E11|Внушительный срок.|Вселенная существует сто миллиардов лет.
a4|время|10|||age::1E12|age::1E12|А не слишком ли это долго?|Вселенная существует триллион лет
a5|время|1||1||uptime|Вселенная под вашим управлением 13 минут подряд.|Неплохо для начала!
a6|время|3||1||uptime|Вселенная под вашим управлением 34 минуты подряд.|Без вас было бы хуже.
a7|время|6||1||uptime|Вселенная под вашим управлением 1 час 29 минут подряд.|Не привлекайте ненужного внимания.
a8|время|10||1||uptime|Вселенная под вашим управлением 3 часа 53 минуты подряд!|Можно и отдохнуть, это финальное достижение в данной линейке!
a9|время|1||1||played|Вы управляете вселенной 8 часов.|Её обитатели должны быть вам благодарны.
a10|время|3||1||played|Вы управляете вселенной 21 час.|Наверняка уже многое стало понятно.
a11|время|6||1||played|Вы управляете вселенной 2 суток и 7 часов.|Расскажите об игре друзьям!
a12|время|10||1||played|Вы управляете вселенной 6 суток.|Поделитесь опытом в социальных сетях!
a13|ресурсы|1||||total:H:1000|Получи всего 1 000 водорода|
a14|ресурсы|1|1||total:H:5E4|total:H:1E6|Получи всего 1 миллион водорода|
a15|ресурсы|1|1||total:H:5E7|total:H:1E9|Получи всего 1 миллиард водорода|
a16|ресурсы|3|1||total:H:5E10|total:H:1E12|Получи всего 1 триллион водорода|
a17|ресурсы|3|1||total:H:5E13|total:H:1E15|Получи всего 1 квадриллион водорода|
a18|ресурсы|3|1||total:H:5E16|total:H:1E18|Получи всего 1 квинтиллион водорода|
a19|ресурсы|6|1||total:H:5E19|total:H:1E21|Получи всего 1 секстиллион водорода|
a20|ресурсы|6|1||total:H:5E22|total:H:1E24|Получи всего 1 септиллион водорода|
a21|ресурсы|1||||total:S:1000|Создай 1 000 кубических парсек пространства|
a22|ресурсы|1|||total:S:5E4|total:S:1E6|Создай 1 миллион кубических парсек пространства|
a23|ресурсы|1|||total:S:5E7|total:S:1E9|Создай 1 миллиард кубических парсек пространства|
a24|ресурсы|3|||total:S:5E10|total:S:1E12|Создай 1 триллион кубических парсек пространства|
a25|ресурсы|3|||total:S:5E13|total:S:1E15|Создай 1 квадриллион кубических парсек пространства|
a26|ресурсы|3|||total:S:5E16|total:S:1E18|Создай 1 квинтиллион кубических парсек пространства|
a27|ресурсы|6|||total:S:5E19|total:S:1E21|Создай 1 секстиллион кубических парсек пространства|
a28|ресурсы|6|||total:S:5E22|total:S:1E24|Создай 1 септиллион кубических парсек пространства|
a29|ресурсы|1|||total:He:1E9|total:He:1E9|Получи 1 миллиард гелия|
a30|ресурсы|3|||total:He:1E15|total:He:1E15|Получи 1 квадриллион гелия|
a31|ресурсы|6|||total:He:1E21|total:He:1E21|Получи 1 секстиллион гелия|
a32|ресурсы|1||1|||Израсходуй 1 миллион гелия|
a33|ресурсы|3||1|||Израсходуй 1 триллион гелия|
a34|ресурсы|6||1|||Израсходуй 1 квинтиллион гелия|
a35|ресурсы|1||1|total:Voids:5|total:Voids:25|Сформируй 25 войдов|
a36|ресурсы|1||1|total:Voids:25|total:Voids:125|Сформируй 125 войдов|
a37|ресурсы|1||1|total:Voids:125|total:Voids:625|Сформируй 625 войдов|
a38|ресурсы|3||1|total:Voids:625|total:Voids:3125|Сформируй 3125 войдов|
a39|ресурсы|3||1|total:Voids:3125|total:Voids:15625|Сформируй 15625 войдов|
a40|ресурсы|6||1|total:Voids:15625|total:Voids:78125|Сформируй 78125 войдов|Продолжай в том же духе, без войдов вселенная обречена!
a41|ресурсы|10||1|energy::1E27|energy::1E27|На складе пусто!|Потрачен весь запас энергии.
a42|объекты|1||||total:Star:1|Зажги звезду|
a43|объекты|1|||total:OD:1|total:OD:1|Зажги оранжевого карлика|
a44|объекты|1||||total:YD:1|Зажги жёлтого карлика|
a45|объекты|1|||total:WYD:1|total:WYD:1|Зажги бело-жёлтого карлика|
a46|объекты|1|||total:WS:1|total:WS:1|Зажги белую звезду|
a47|объекты|1||||total:BG:1|Зажги голубого гиганта|
a48|объекты|1|1||total:BG:1|total:SG:1|Зажги сверхгиганта|
a49|объекты|1|1||total:SG:1|total:HG:1|Зажги гипергиганта|
a50|объекты|1||||total:WD:1|Получи белого карлика|
a51|объекты|1||||total:NS:1|Получи нейтронную звезду|
a52|объекты|1|1||total:NS:1|total:MGT:1|Получи магнетар|
a53|объекты|1||||total:BH:1|Получи чёрную дыру|
a54|объекты|1|1||total:BH:1|total:SMBH:1|Создай сверхмассивную чёрную дыру|
a55|объекты|1||||total:N:1|Создай туманность|
a56|объекты|1|1||total:N:1|total:G:1|Создай глобулу|
a57|объекты|1|1||total:G:1|total:STN:1|Создай звёздную колыбель|
a58|объекты|1|1||total:G:1|total:MC:1|Создай молекулярное облако|
a59|объекты|3|1||total:STN:1|total:ASTN:1|Создай активную звёздную колыбель|
a60|объекты|3|1||total:MC:100|total:MC:1E4|Создай 10 000 молекулярных облаков|
a61|объекты|1|1|1|auto:Star:1|auto:Star:10|Создай 10 звёзд с помощью облаков|
a62|объекты|1|1|1|auto:Star:10|auto:Star:1000|Создай 1 000 звёзд с помощью облаков|
a63|объекты|3|1|1|auto:Star:1000|auto:Star:1E6|Создай 1 миллион звёзд с помощью облаков|
a64|объекты|1|1||total:Star:30|total:Star:300|Зажги 300 звёзд|
a65|объекты|1|1||total:OD:1|total:OD:2000|Зажги 2 000 оранжевых карликов|
a66|объекты|1|1||total:WYD:1|total:WYD:500|Зажги 500 бело-жёлтых карликов|
a67|объекты|1|1||total:BD:1|total:BD:1E6|Зажги 1 миллион бурых карликов|
a68|объекты|3|||total:HG:1000|total:HG:1000|Это кому-нибудь нужно?|Зажги 1 000 гипергигантов.
a69|объекты|3|1||total:Star:5000|total:Star:1E7|Зажги 10 миллионов звёзд|
a70|объекты|3|||total:Star:4E9|total:Star:4E11|Зажги 400 миллиардов звёзд|
a71|объекты|3|||total:Star:9E14|total:Star:9E16|Зажги 90 квадриллионов звёзд|
a72|объекты|3|1||total:SMBH:1|total:SMBH:1E4|Сбрось 10 000 вещества в сверхмассивные чёрные дыры|
a73|объекты|3|||total:SMBH:3E5|total:SMBH:4.2E7|Сбрось 42 миллиона вещества в сверхмассивные чёрные дыры|Примерно столько весит Стрелец А со звёздочкой.
a74|объекты|3|||total:SMBH:3E9|total:SMBH:6.6E11|Сбрось 660 миллиардов вещества в сверхмассивные чёрные дыры|Примерно столько весит TON 618.
a75|структуры|1||||total:SC:1|Создай любое звёздное скопление|
a76|структуры|1||||total:SCM:1|Создай среднее звёздное скопление|
a77|структуры|1|1||total:SC:1|total:SCL:1|Создай большое звёздное скопление|
a78|структуры|3|1||total:SCL:1|total:SCG:1|Создай гигантское звёздное скопление|
a79|структуры|3|1||total:SC:10|total:SC:100|Создай 100 звёздных скоплений|
a80|структуры|1||||total:GAL:1|Создай любую галактику|
a81|структуры|3|1|1|total:GAL:1|total:GALS:1|Создай спиральную галактику|
a82|структуры|1||||total:GEM:1|Создай среднюю галактику|
a83|структуры|1|1||total:GAL:1|total:GEL:1|Создай большую галактику|
a84|структуры|3|1||total:GEL:1|total:GEG:1|Создай гигантскую галактику|
a85|структуры|3|1||total:GAL:5|total:GAL:30|Создай 30 галактик|
a86|структуры|1|1||total:GAL:30|total:LGG:1|Создай группу галактик|
a87|структуры|3|1||total:LGG:1|total:LGG:30|Создай 30 групп галактик|
a88|структуры|3|1||total:LGG:30|total:LSC:1|Создай галактическое сверхскопление|
a89|структуры|3|1||total:LSC:1|total:LSC:30|Создай 30 галактических сверхскоплений|
a90|структуры|6|1||total:LSC:30|total:LGF:1|Создай галактическую нить|
a91|структуры|6|1||total:LGF:1|total:LGF:100|Создай 100 галактических нитей|
a92|структуры|6|1||total:LGF:100|total:LGW:1|Создай великую стену|
a93|структуры|6|1||total:LGW:1|total:LGW:100|Создай 100 великих стен|
a94|структуры|6|1||total:LGW:100|total:LUB:1|Создай вселенский пузырь|
a95|структуры|10|1|1|total:LUB:1|total:LUB:1|Это должно было когда-то закончиться!|Создана крупномасштабная структура вселенной.
a96|жизнь|1||1||Planet:1|Создай любую планету|
a97|жизнь|1|1|1|GG:1^AB:1|RP:1|Создай каменистую планету|
a98|жизнь|1|1|1|RP:1|HP:1|Создай обитаемую планету|
a99|жизнь|3||1||EON1:1|Создай жизнь|
a100|жизнь|1|1|1|EON1:1|EON2:1|Вырасти амёб и водоросли|
a101|жизнь|1|1|1|EON2:1|EON3:1|Вырасти трилобитов и рыб|
a102|жизнь|1|1|1|EON3:1|EON4:1|Вырасти динозавров и птиц|
a103|жизнь|1|1|1|EON4:1|EON5:1|Вырасти млекопитающих и приготовься...|
a104|жизнь|1|1|1|Planet:1|Planet:1E5|Создай 100 000 планет|
a105|жизнь|1|1|1|HP:1|HP:1E4|Создай 10 000 обитаемых планет|
a106|жизнь|3|1|1|EON1:1|EON1:1000|Создай жизнь на 1 000 планет|
a107|жизнь|6||1|C0.0:1|C0.0:1|Возник разум!|
a108|жизнь|1|1|1|C0.0:1|C0.5:1|Они умеют лепить глиняные горшки!|Цивилизация достигла уровня 0.5.
a109|жизнь|3|1|1|C0.7:1|C1.0:1|Они освоили свою родную планету!|Цивилизация достигла уровня 1.0.
a110|жизнь|1|1|1|C1.3:1|C1.5:1|Они построили космический город!|Цивилизация достигла уровня 1.5.
a111|жизнь|6|1|1|C1.7:1|C2.0:1|У них есть рой Дайсона!|Цивилизация достигла уровня 2.0.
a112|жизнь|1||1|C2.2:1|C2.2:1|Вроде бы они начали расти!|Цивилизация заселила сотню звёзд.
a113|жизнь|1||1|C2.5:1|C2.5:1|Их почти можно увидеть невооружённым глазом!|Цивилизация заселила среднее звёздное скопление.
a114|жизнь|3||1|C2.8:1|C2.8:1|О, они наконец-то поняли, как управлять гравитацией!|Цивилизация достигла уровня 2.8.
a115|жизнь|6||1|C3.0:1|C3.0:1|Они и правда научились летать!|Цивилизация способна путешествовать между галактиками.
a116|жизнь|3||1|C3.2:1|C3.2:1|Они наверное так гордятся собой!|Цивилизация расселилась на масштабах порядка Туманности Андромеды.
a117|жизнь|3||1|C3.5:1|C3.5:1|Вот это они смекалистые!|Цивилизация использует ресурсы нейтронной звезды.
a118|жизнь|3||1|C3.8:1|C3.8:1|Теперь их и правда легко заметить.|Цивилизация заселила сотни тысяч галактик.
a119|жизнь|6||1|C4.0:1|C4.0:1|Кажется это уже было, нет?|Цивилизация освоила манипуляции со временем.
a120|жизнь|6||1|C4.2:1|C4.2:1|Наконец-то они перестали мелочиться.|Цивилизация использует сверхмассивную чёрную дыру для своих целей.
a121|жизнь|10||1|C4.4:1|C4.4:1|Они справились! Интересно, чем же дальше займутся?|Цивилизация расселилась на масштабах порядка всей видимой вселенной.
a122|жизнь|3|1|1|C1.6:1|SET:1|Они основали колонию у соседней звезды!|
a123|жизнь|6|1|1||GSM:1&C2.8:50|Они похоже основали Галактическую Федерацию или что-то в этом роде!|
a124|жизнь|1||1|||О нет...|Погибла цивилизация 0.8+ уровня.
a125|жизнь|1||1|||Да сколько можно!|Погибло 100 цивилизаций 1.2+ уровня.
a126|жизнь|1||1|||К этому вообще можно привыкнуть?|Погибло 1 000 цивилизаций 1.6+ уровня.
a127|жизнь|3||1|||Да, в какой-то момент становится безразлично.|Погибло 10 000 цивилизаций 2.0+ уровня
a128|жизнь|6||1|||А выглядели крепкими. Что ж поделать.|Погибла цивилизация 3.0+ уровня.
a129|жизнь|10||1|||Моё разочарование неизмеримо.|Погибла цивилизация 4.0+ уровня.
a130|жизнь|6||1|||Что-то это мне напоминает...|На момент 13.8 миллиардов лет существует цивилизация уровня 0.9.
a131|события|3|1|1|высокая плотность|BigCrunch|Большое сжатие!|Вселенная схлопнулась в колоссальную чёрную дыру.
a132|события|3|1|1|низкая плотность|BigRip|Большой разрыв!|Вселенная рассеялась в разные стороны.
a133|события|6|1|1|BigCrunch^BigRip|BigCrunch&BigRip|Двойная неурядица!|Два разных апокалипсиса завершены.
a134|события|10||1|||Изгнание! Вас выгнали из вселенной.|Теперь эта вселенная существует сама по себе, без вашего участия.
a135|события|3||1|||Антитеизм: они отрицают ваше существование.|Может они в чём-то и правы?
a136|события|3||1|||Интеграция: они стремятся к сосуществованию.|Может быть хотя бы у них получится?
a137|события|3||1|||Ксеноцид: их воинственность приводит к ужасным результатам.|Впрочем, ничего нового.
a138|события|3||1|||Реконструкция: они переделывают вселенную.|Это же их вселенная, да? Или нет?
a139|события|3||1|||Духовность: они ищут глубинный смысл.|Что если они узнают правду?
a140|события|3||1|||Исход: они хотят покинуть вселенную.|Что же им здесь не нравится?
a141|события|6||1|||Динамичная вселенная|Все тенденции проявили себя!
a142|события|3||1|||Изгнание: они пытаются выгнать из вселенной вас!|Их определённо что-то не устраивает.
a143|события|3||1|||Федерация: они ищут способы мирного сосуществования.|Наверное это неплохо?
a144|события|3||1|||Просвещение: они помогают отстающим.|Какая прелесть!
a145|события|3||1|||Новый порядок: они закапывают топор войны.|Может оно и к лучшему?
a146|события|3||1|||Великие войны: они устроили эпическое побоище.|Жаль, что отсюда не рассмотреть всех деталей.
a147|события|3||1|||Истребление: они занимаются чисткой потенциальных конкурентов.|Жизнь — это возобновляемый ресурс.
a148|события|3||1|||Опустошение: они разрушают вселенную!|Звёзды превращаются в чёрные дыры.
a149|события|3||1|||Звёздное дробление: они перестраивают вселенную под себя.|Им удобнее жить на малых и стабильных звёздах.
a150|события|3||1|||Звёздная накачка: они создают новые звёзды!|Из облаков и бурых карликов создаются красные карлики.
a151|события|3||1|||Звёздное охлаждение: они стабилизируют звёзды.|Снижается активность звёздных процессов.
a152|события|3||1|||Молитва: они невероятно истово молятся.|Вы даже смогли что-то расслышать.
a153|события|3||1|||Диалог: они ждут ответа!|А отвечать именно вам.
a154|события|3||1|||Живая вселенная|Произошло 10 действий цивилизаций.
a155|события|6||1|||Очень живая вселенная|Произошло 30 действий цивилизаций.
a156|события|10||1|||Невероятно живая вселенная!|Произошло 100 действий цивилизаций.
a157|события|10||1|||Столько всего происходит!|Все действия произошли хотя бы один раз!
a158|силы|1||1|сила получена|сила применена|Научись быстро копать.|Используй лопатин
a159|силы|1||1|сила получена|сила применена|Запусти инфляцию.|Используй надувин
a160|силы|3||1|сила получена|сила применена|Пропусти время.|Используй временит
a161|силы|3||1|сила получена|сила применена|Утилизируй мусор.|Используй столкновит
a162|силы|6||1|сила получена|сила применена|Подели физику на ноль.|Используй первекс
a163|силы|1||1|сила получена|сила применена|Уничтожь пространство.|Используй сингулярит
a164|силы|1||1|сила получена|сила применена|Укрепи структуры.|Используй обновин
a165|силы|3||1|сила получена|сила применена|Разожги звёзды.|Используй вливанит
a166|силы|3||1|сила получена|сила применена|Остуди вселенную.|Используй морозин
a167|силы|6||1|сила получена|сила применена|Избавься от звёзд.|Используй дезвездит
a168|силы|1||1|сила получена|сила применена|Сделай больше планет.|Используй камнекс
a169|силы|1||1|сила получена|сила применена|Осемени вселенную.|Используй панспермин
a170|силы|3||1|сила получена|сила применена|Удобри вселенную.|Используй гайанит
a171|силы|3||1|сила получена|сила применена|Взбодри вселенную.|Используй дарвинит
a172|силы|6||1|сила получена|сила применена|Наполни вселенную благостью.|Используй эдемекс
a173|силы|1||1|сила получена|сила применена|Научи разумных жить в мире.|Используй пацифин
a174|силы|1||1|сила получена|сила применена|Научи разумных сражаться за свою жизнь.|Используй озверин
a175|силы|3||1|сила получена|сила применена|Назначь пророков среди разумных.|Используй моралит
a176|силы|3||1|сила получена|сила применена|Покарай тех разумных, кто не следует твоим планам.|Используй дискриминит
a177|силы|6||1|сила получена|сила применена|Подави тех разумных, которые слишком много о себе возомнили.|Используй репрекс
a178|силы|6||1|одна любая сила получена в 4 градациях|флэш|Потрать силу одного типа по нарастанию градаций.|Зелёная, синяя, фиолетовая, оранжевая
a179|силы|3||1|снижена вручную|Bur=1|Холодная вселенная.|Минимальная горючесть
a180|силы|3||1|аналогично|Bur=19|Звёзды зажигают, чтобы они сгорели!|Максимальная горючесть
a181|силы|3||1|аналогично|Exp=1|Плотный вакуум.|Минимальная взрывчатость
a182|силы|3||1|аналогично|Exp=19|Бада-бим, бада-бум-бум-бум!|Максимальная взрывчатость
a183|силы|3||1|аналогично|Agg=1|Мир и покой.|Минимальная агрессия
a184|силы|3||1|аналогично|Agg=19|Как 4Е4!|Максимальная агрессия
a185|силы|6||1|||Все силы доступны одновременно!|
a186|силы|10||1|||Все силы использованы хотя бы по одному разу в этой вселенной.|
a187|силы|1||1|3 обычные силы одного вида||Улучшите силу до редкой.|
a188|силы|3||1|3 редкие силы одного вида||Улучшите силу до эпической.|
a189|силы|6||1|3 эпические силы одного вида||Улучшите силу до легендарной.|
a190|силы|1||1|улучш 3 силы|5|Улучшите 5 сил.|
a191|силы|1||1|8|13|Улучшите 13 сил.|
a192|силы|3||1|21|34|Улучшите 34 силы.|
a193|силы|3||1|55|89|Улучшите 89 сил.|
a194|силы|6||1|144|233|Улучшите 233 силы.|
a195|силы|6||1|377|610|Улучшите 610 сил.|
a196|силы|10||1|987|1597|Улучшите 1 597 сил.|Продолжайте в том же духе!
a197|силы|1||1|1|3|Улучшите 3 сундука с силами.|
a198|силы|3||1|5|7|Улучшите 7 сундуков с силами.|
a199|силы|6||1|14|20|Улучшите 20 сундуков с силами.|
a200|силы|10||1|38|55|Улучшите 55 сундуков с силами.|Спасибо за поддержку!
"""
#endregion
#region EN
const EN := """
id|Category|Points|progr: 60|Ignore|OpenCondition|AchieveCondition|En1|En2
a1|время|1|||age::1E9|age::1E9|A good start!|The Universe exists for a billion years.
a2|время|3|||age::1E10|age::1E10|Middle age.|The Universe exists for a ten billions years.
a3|время|6|||age::1E11|age::1E11|Impressive term.|The Universe exists for a hundred billions years.
a4|время|10|||age::1E12|age::1E12|Isn't it too long?|The Universe exists for a trillion years.
a5|время|1||1||uptime|The universe is under your control for 13 minutes in a row.|Not bad for a start!
a6|время|3||1||uptime|The universe is under your control for 34 minutes in a row.|It would be worse without you.
a7|время|6||1||uptime|The universe is under your control for 1 hour 29 minutes in a row.|Don't draw unnecessary attention.
a8|время|10||1||uptime|The universe is under your control for 3 hours 53 minutes in a row!|You can also relax, this is the final achievement in this line!
a9|время|1||1||played|You rule the universe for 8 hours.|Its inhabitants should be grateful to you.
a10|время|3||1||played|You rule the universe for 21 hours.|Surely a lot has become clear by now.
a11|время|6||1||played|You rule the universe for 2 days and 7 hours.|Tell your friends about the game!
a12|время|10||1||played|You rule the universe for 6 days.|Share your experience on social networks!
a13|ресурсы|1||||total:H:1000|Get total 1 000 hydrogen|
a14|ресурсы|1|1||total:H:5E4|total:H:1E6|Get total 1 million hydrogen|
a15|ресурсы|1|1||total:H:5E7|total:H:1E9|Get total 1 billion hydrogen|
a16|ресурсы|3|1||total:H:5E10|total:H:1E12|Get total 1 trillion hydrogen|
a17|ресурсы|3|1||total:H:5E13|total:H:1E15|Get total 1 quadrillion hydrogen|
a18|ресурсы|3|1||total:H:5E16|total:H:1E18|Get total 1 quintillion hydrogen|
a19|ресурсы|6|1||total:H:5E19|total:H:1E21|Get total 1 sextillion hydrogen|
a20|ресурсы|6|1||total:H:5E22|total:H:1E24|Get total 1 septillion hydrogen|
a21|ресурсы|1||||total:S:1000|Create 1 000 cubic parsecs of space|
a22|ресурсы|1|||total:S:5E4|total:S:1E6|Create 1 million cubic parsecs of space|
a23|ресурсы|1|||total:S:5E7|total:S:1E9|Create 1 billion cubic parsecs of space|
a24|ресурсы|3|||total:S:5E10|total:S:1E12|Create 1 trillion cubic parsecs of space|
a25|ресурсы|3|||total:S:5E13|total:S:1E15|Create 1 quadrillion cubic parsecs of space|
a26|ресурсы|3|||total:S:5E16|total:S:1E18|Create 1 quintillion cubic parsecs of space|
a27|ресурсы|6|||total:S:5E19|total:S:1E21|Create 1 sextillion cubic parsecs of space|
a28|ресурсы|6|||total:S:5E22|total:S:1E24|Create 1 septillion cubic parsecs of space|
a29|ресурсы|1|||total:He:1E9|total:He:1E9|Obtain 1 billion helium|
a30|ресурсы|3|||total:He:1E15|total:He:1E15|Obtain 1 quadrillion helium|
a31|ресурсы|6|||total:He:1E21|total:He:1E21|Obtain 1 sextilion helium|
a32|ресурсы|1||1|||Use up 1 million helium|
a33|ресурсы|3||1|||Use up 1 trillion helium|
a34|ресурсы|6||1|||Use up 1 quintillion helium|
a35|ресурсы|1||1|total:Voids:5|total:Voids:25|Form 25 voids|
a36|ресурсы|1||1|total:Voids:25|total:Voids:125|Form 125 voids|
a37|ресурсы|1||1|total:Voids:125|total:Voids:625|Form 625 voids|
a38|ресурсы|3||1|total:Voids:625|total:Voids:3125|Form 3125 voids|
a39|ресурсы|3||1|total:Voids:3125|total:Voids:15625|Form 15625 voids|
a40|ресурсы|6||1|total:Voids:15625|total:Voids:78125|Form 78125 voids|Keep up the good work, without voids the universe is doomed!
a41|ресурсы|10||1|energy::1E27|energy::1E27|Out of ammo!|All energy cache is spent.
a42|объекты|1||||total:Star:1|Make a Star|
a43|объекты|1|||total:OD:1|total:OD:1|Make an Orange Dwarf|
a44|объекты|1||||total:YD:1|Make a Yellow Dwarf|
a45|объекты|1|||total:WYD:1|total:WYD:1|Make a White-Yellow Dwarf|
a46|объекты|1|||total:WS:1|total:WS:1|Make a White Star|
a47|объекты|1||||total:BG:1|Make a Blue Giant|
a48|объекты|1|1||total:BG:1|total:SG:1|Make a Supergiant|
a49|объекты|1|1||total:SG:1|total:HG:1|Make a Hypergiant|
a50|объекты|1||||total:WD:1|Get a White Dwarf|
a51|объекты|1||||total:NS:1|Get a Neutron Star|
a52|объекты|1|1||total:NS:1|total:MGT:1|Get a Magnetar|
a53|объекты|1||||total:BH:1|Get a Black Hole|
a54|объекты|1|1||total:BH:1|total:SMBH:1|Make a Supermassive Black Hole|
a55|объекты|1||||total:N:1|Make a Nebula|
a56|объекты|1|1||total:N:1|total:G:1|Make a Globula|
a57|объекты|1|1||total:G:1|total:STN:1|Make a Star Nursery|
a58|объекты|1|1||total:G:1|total:MC:1|Make a Molecular Cloud|
a59|объекты|3|1||total:STN:1|total:ASTN:1|Make an Active Star Nursery|
a60|объекты|3|1||total:MC:100|total:MC:1E4|Make 10 000 Molecular Clouds|
a61|объекты|1|1|1|auto:Star:1|auto:Star:10|Make 10 stars via clouds|
a62|объекты|1|1|1|auto:Star:10|auto:Star:1000|Make 1 000 stars via clouds|
a63|объекты|3|1|1|auto:Star:1000|auto:Star:1E6|Make 1 million stars via clouds|
a64|объекты|1|1||total:Star:30|total:Star:300|Make 300 stars|
a65|объекты|1|1||total:OD:1|total:OD:2000|Make 2 000 orange dwarfs|
a66|объекты|1|1||total:WYD:1|total:WYD:500|Make 500 white-yellow dwarfs|
a67|объекты|1|1||total:BD:1|total:BD:1E6|Make 1 million brown dwarfs|
a68|объекты|3|||total:HG:1000|total:HG:1000|Someone must need them, of course?|Make 1 000 hypergiants.
a69|объекты|3|1||total:Star:5000|total:Star:1E7|Make 10 million stars|
a70|объекты|3|||total:Star:4E9|total:Star:4E11|Make 400 billion stars|
a71|объекты|3|||total:Star:9E14|total:Star:9E16|Make 90 quadrillion stars|
a72|объекты|3|1||total:SMBH:1|total:SMBH:1E4|Drop 10 000 matter into Supermassive Black Holes|
a73|объекты|3|||total:SMBH:3E5|total:SMBH:4.2E7|Drop 42 million matter into Supermassive Black Holes|Sagittarius A* weighs about as much.
a74|объекты|3|||total:SMBH:3E9|total:SMBH:6.6E11|Drop 660 billion matter into Supermassive Black Holes|TON 618 weighs about as much.
a75|структуры|1||||total:SC:1|Make a Star Cluster|
a76|структуры|1||||total:SCM:1|Make a Medium Star Cluster|
a77|структуры|1|1||total:SC:1|total:SCL:1|Make a Large Star Cluster|
a78|структуры|3|1||total:SCL:1|total:SCG:1|Make a Giant Star Cluster|
a79|структуры|3|1||total:SC:10|total:SC:100|Make 100 Star Clusters|
a80|структуры|1||||total:GAL:1|Make a Galaxy|
a81|структуры|3|1|1|total:GAL:1|total:GALS:1|Make a Spiral Galaxy|
a82|структуры|1||||total:GEM:1|Make a Medium Galaxy|
a83|структуры|1|1||total:GAL:1|total:GEL:1|Make a Large Galaxy|
a84|структуры|3|1||total:GEL:1|total:GEG:1|Make a Giant Galaxy|
a85|структуры|3|1||total:GAL:5|total:GAL:30|Make 30 Galaxies|
a86|структуры|1|1||total:GAL:30|total:LGG:1|Make a Galactic Group|
a87|структуры|3|1||total:LGG:1|total:LGG:30|Make 30 Galactic Groups|
a88|структуры|3|1||total:LGG:30|total:LSC:1|Make a Galactic Supercluster|
a89|структуры|3|1||total:LSC:1|total:LSC:30|Make 30 Galactic Superclusters|
a90|структуры|6|1||total:LSC:30|total:LGF:1|Make a Galactic Filament|
a91|структуры|6|1||total:LGF:1|total:LGF:100|Make 100 Galactic Filaments|
a92|структуры|6|1||total:LGF:100|total:LGW:1|Make a Great Wall|
a93|структуры|6|1||total:LGW:1|total:LGW:100|Make 100 Great Walls|
a94|структуры|6|1||total:LGW:100|total:LUB:1|Make an Universe Bubble|
a95|структуры|10|1|1|total:LUB:1|total:LUB:1|It had to end sometime!|The large-scale structure of the universe has been created.
a96|жизнь|1||1||Planet:1|Make a planet|
a97|жизнь|1|1|1|GG:1^AB:1|RP:1|Make a rocky planet|
a98|жизнь|1|1|1|RP:1|HP:1|Make a habitable planet|
a99|жизнь|3||1||EON1:1|Make life|
a100|жизнь|1|1|1|EON1:1|EON2:1|Grow amoebas and algae|
a101|жизнь|1|1|1|EON2:1|EON3:1|Grow trilobites and fishes|
a102|жизнь|1|1|1|EON3:1|EON4:1|Grow dinosaurs and birds|
a103|жизнь|1|1|1|EON4:1|EON5:1|Grow mammals and prepare yourself...|
a104|жизнь|1|1|1|Planet:1|Planet:1E5|Make 100 000 planets|
a105|жизнь|1|1|1|HP:1|HP:1E4|Make 10 000 habitable planets|
a106|жизнь|3|1|1|EON1:1|EON1:1000|Make life at 1 000 planets|
a107|жизнь|6||1|C0.0:1|C0.0:1|Sapience emerged!|
a108|жизнь|1|1|1|C0.0:1|C0.5:1|They can make pots out of clay!|A civilization has reached 0.5 level.
a109|жизнь|3|1|1|C0.7:1|C1.0:1|They have mastered their home planet!|A civilization has reached 1.0 level.
a110|жизнь|1|1|1|C1.3:1|C1.5:1|They have built a space city!|A civilization has reached 1.5 level.
a111|жизнь|6|1|1|C1.7:1|C2.0:1|They have a Dyson Swarm!|A civilization has reached 2.0 level.
a112|жизнь|1||1|C2.2:1|C2.2:1|They seem to grow at last!|A civilization has settled over a hundred of stars.
a113|жизнь|1||1|C2.5:1|C2.5:1|They are almost noticeable by a naked eye!|A civilization has settled over a Medium Star Cluster.
a114|жизнь|3||1|C2.8:1|C2.8:1|Oh, they grasped how to control gravity at last!|A civilization has reached 2.8 level.
a115|жизнь|6||1|C3.0:1|C3.0:1|They really have learned to fly!|A civilization is able to travel between Galaxies.
a116|жизнь|3||1|C3.2:1|C3.2:1|They must be so proud of themselves!|A civilization has settled on a scale of an Andromeda Galaxy.
a117|жизнь|3||1|C3.5:1|C3.5:1|Hey, they are resourceful!|A civilization has utilized a Neutron Star resources.
a118|жизнь|3||1|C3.8:1|C3.8:1|Now they actually easy to notice.|A civilization has settled over hundreds of thousands Galaxies.
a119|жизнь|6||1|C4.0:1|C4.0:1|Feels like this has happened already, no?|A civilization has grasp on temporal manipulations.
a120|жизнь|6||1|C4.2:1|C4.2:1|At last they seem to think big enough.|A civilization has utilized a Supermassive Black Hole for their goals.
a121|жизнь|10||1|C4.4:1|C4.4:1|They've made it! What will they do next, I wonder?|A civilization has expanded on a scale of a whole visible Universe.
a122|жизнь|3|1|1|C1.6:1|SET:1|They have made an extrasolar colony!|
a123|жизнь|6|1|1||GSM:1&C2.8:50|They seem to have found a Galactic Federation or something!|
a124|жизнь|1||1|||Oh no...|A civilization of 0.8+ level extinct.
a125|жизнь|1||1|||Not again!|100 civilizations of 1.2+ level extinct.
a126|жизнь|1||1|||Will I get used to it?|1 000 civilizations of 1.6+ level extinct.
a127|жизнь|3||1|||Yeah, you become numb after a while.|10 000 civilizations of 2.0+ level extinct.
a128|жизнь|6||1|||They seemed to be survivors. Oh well.|A civilization of 3.0+ level extinct.
a129|жизнь|10||1|||My dissapointment is immeasureable.|A civilization of 4.0+ level extinct.
a130|жизнь|6||1|||This reminds me of something...|At the date of 13.8 billions of years there is a civilization of 0.9 level.
a131|события|3|1|1|высокая плотность|BigCrunch|Big Crunch!|The universe collapsed into a colossal black hole.
a132|события|3|1|1|низкая плотность|BigRip|Big Rip!|The universe dissipated in different directions.
a133|события|6|1|1|BigCrunch^BigRip|BigCrunch&BigRip|Double Trouble!|Two different apocalypses are finished.
a134|события|10||1|||Complete banishment! You have been kicked out of the universe.|Now this universe exists by itself, without your participation.
a135|события|3||1|||Antitheism: They deny your existence.|Maybe they are somehow right about that?
a136|события|3||1|||Integration: They strive for coexistence.|Maybe at least they can make it?
a137|события|3||1|||Xenocide: Their bellicosity leads to dire results.|However, nothing is new.
a138|события|3||1|||Reconstruction: They rearrange the universe.|It is their universe, right? Or not?
a139|события|3||1|||Spirituality: They seek deep meaning.|What if they find out the truth?
a140|события|3||1|||Exodus: They want to leave the universe.|What do they not like here?
a141|события|6||1|||Dynamic Universe|All trends have shown themselves!
a142|события|3||1|||Banishment: They are trying to expel you from the universe!|They definitely don't like something.
a143|события|3||1|||Federation: They are looking for ways to peacefully coexist.|Perhaps this is good?
a144|события|3||1|||Enlightenment: They help those who are lagging behind.|How lovely!
a145|события|3||1|||New Order: They bury the hatchet.|Maybe it's for the best?
a146|события|3||1|||Grand Wars: They are engaged into carnage of epic proportions.|It is a pity that it is impossible to discern all the details from here.
a147|события|3||1|||Extermination: They are purging potential competitors.|Life is a renewable resource.
a148|события|3||1|||Devastation: They are destroying the universe!|Stars turn into black holes.
a149|события|3||1|||Stellar Fragmentation: They reconstruct the universe for themselves.|It is more convenient for them to live on small and stable stars.
a150|события|3||1|||Stellar Pumping: They create new stars!|Red dwarfs are created from clouds and brown dwarfs.
a151|события|3||1|||Stellar Cooling: They stabilize the stars.|The activity of stellar processes is decreasing.
a152|события|3||1|||Prayer: They pray incredibly fervently.|You were even able to hear something.
a153|события|3||1|||Dialogue: They are waiting for an answer!|And it is you who should answer.
a154|события|3||1|||Living Universe|10 civilization actions have taken place.
a155|события|6||1|||Very Living Universe|30 civilization actions have taken place.
a156|события|10||1|||Incredibly Alive Universe!|100 civilization actions have taken place.
a157|события|10||1|||So much is happening!|All actions happened at least once!
a158|силы|1||1|сила получена|сила применена|Learn to dig fast.|Use Shovelin
a159|силы|1||1|сила получена|сила применена|Kickstart inflation.|Use Inflatin
a160|силы|3||1|сила получена|сила применена|Pass time.|Use Temporite
a161|силы|3||1|сила получена|сила применена|Dispose of garbage.|Use Collisite
a162|силы|6||1|сила получена|сила применена|Divide physics by zero.|Use Primex
a163|силы|1||1|сила получена|сила применена|Destroy space.|Use Singularite
a164|силы|1||1|сила получена|сила применена|Strengthen structures.|Use Renewin
a165|силы|3||1|сила получена|сила применена|Light up the stars.|Use Infusite
a166|силы|3||1|сила получена|сила применена|Cool down the universe.|Use Frostin
a167|силы|6||1|сила получена|сила применена|Get rid of the stars.|Use Destellarite
a168|силы|1||1|сила получена|сила применена|Make more planets.|Use Rockex
a169|силы|1||1|сила получена|сила применена|Seed the universe.|Use Panspermin
a170|силы|3||1|сила получена|сила применена|Fertilize the universe.|Use Gaianite
a171|силы|3||1|сила получена|сила применена|Invigorate the universe.|Use Darwinite
a172|силы|6||1|сила получена|сила применена|Fill the universe with goodness.|Use Edenex
a173|силы|1||1|сила получена|сила применена|Teach sapients to live in peace.|Use Pacifin
a174|силы|1||1|сила получена|сила применена|Teach sapients to fight for their lives.|Use Enragein
a175|силы|3||1|сила получена|сила применена|Appoint prophets among sapients.|Use Moralite
a176|силы|3||1|сила получена|сила применена|Punish those sapients who do not follow your plans.|Use Discriminite
a177|силы|6||1|сила получена|сила применена|Suppress those sapients who think too much of themselves.|Use Reprex
a178|силы|6||1|одна любая сила получена в 4 градациях|флэш|Use the forces of the one kind by increase of power.|Green, blue, purple, orange
a179|силы|3||1|снижена вручную|Bur=1|Cold universe.|Minimal Burnability
a180|силы|3||1|аналогично|Bur=19|The stars are lit to burn out!|Maximum Burnability
a181|силы|3||1|аналогично|Exp=1|Dense vacuum.|Minimal Explosiveness
a182|силы|3||1|аналогично|Exp=19|Bada-bing, bada-boom-boom-boom!|Maximum Explosiveness
a183|силы|3||1|аналогично|Agg=1|Peace and tranquility.|Minimal Aggression
a184|силы|3||1|аналогично|Agg=19|Like 4E4!|Maximum Aggression
a185|силы|6||1|||All forces are available at once!|
a186|силы|10||1|||All forces are used at least once in this universe.|
a187|силы|1||1|3 обычные силы одного вида||Upgrade a force to rare.|
a188|силы|3||1|3 редкие силы одного вида||Upgrade a force to epic.|
a189|силы|6||1|3 эпические силы одного вида||Upgrade a force to legendary.|
a190|силы|1||1|улучш 3 силы|5|Upgrade 5 forces.|
a191|силы|1||1|8|13|Upgrade 13 forces.|
a192|силы|3||1|21|34|Upgrade 34 forces.|
a193|силы|3||1|55|89|Upgrade 89 forces.|
a194|силы|6||1|144|233|Upgrade 233 forces.|
a195|силы|6||1|377|610|Upgrade 610 forces.|
a196|силы|10||1|987|1597|Upgrade 1 597 forces.|Continue in the same spirit!
a197|силы|1||1|1|3|Upgrade 3 force chests.|
a198|силы|3||1|5|7|Upgrade 7 force chests.|
a199|силы|6||1|14|20|Upgrade 20 force chests.|
a200|силы|10||1|38|55|Upgrade 55 force chests.|Thanks for support!
"""
#endregion
+1
View File
@@ -0,0 +1 @@
uid://bx5onxr8atifn
@@ -1,3 +1,11 @@
class_name OwniverseApocalypseQueueLoader
static func get_data() -> Dictionary:
return CSVLoader.load(DATA)
#region Owniverse Items
const DATA := """
Num|Shortcut|Stage|Screen|Tick|Desc Num|Shortcut|Stage|Screen|Tick|Desc
1|LUB|1|3|50|Вселенский пузырь 1|LUB|1|3|50|Вселенский пузырь
2|LGW|1|3|5|Великая стена 2|LGW|1|3|5|Великая стена
@@ -130,3 +138,7 @@ Num|Shortcut|Stage|Screen|Tick|Desc
129|H|11|1|5|Водород 129|H|11|1|5|Водород
130|SMBH|12|2|5|СМЧД 130|SMBH|12|2|5|СМЧД
131|S|12|1|5|Пространство 131|S|12|1|5|Пространство
"""
#endregion
@@ -0,0 +1 @@
uid://8bh387weuy7a
+40
View File
@@ -0,0 +1,40 @@
class_name OwniverseAudioLoader
const MUSIC: Dictionary = {
"apocalypse_the_end": preload("res://sound/music/apocalypse_the_end.ogg"),
"cosmic_unicorns": preload("res://sound/music/cosmic_unicorns.ogg"),
"funky_eldritch": preload("res://sound/music/funky_eldritch.ogg"),
"meditative_beings": preload("res://sound/music/meditative_beings.ogg"),
"owniverse_main_theme": preload("res://sound/music/owniverse_main_theme.ogg"),
}
const EFFECTS: Dictionary = {
"black_hole_feed": preload("res://sound/effects/black_hole_feed.ogg"),
"blast": preload("res://sound/effects/blast.ogg"),
"civ_birth": preload("res://sound/effects/civ_birth.ogg"),
"civ_death": preload("res://sound/effects/civ_death.ogg"),
"civ_top": preload("res://sound/effects/civ_top.ogg"),
"cloud_decay": preload("res://sound/effects/cloud_decay.ogg"),
"create": preload("res://sound/effects/create.ogg"),
"force": preload("res://sound/effects/force.ogg"),
"gamma_ray": preload("res://sound/effects/gamma_ray.ogg"),
"life_birth": preload("res://sound/effects/life_birth.ogg"),
"life_death": preload("res://sound/effects/life_death.ogg"),
"select": preload("res://sound/effects/select.ogg"),
"star_birth": preload("res://sound/effects/star_birth.ogg"),
"structure_decay": preload("res://sound/effects/structure_decay.ogg"),
#"swipe": preload("res://sound/effects/swipe.ogg"),
"time_minus": preload("res://sound/effects/time_minus.ogg"),
"time_plus": preload("res://sound/effects/time_plus.ogg"),
"trend_action": preload("res://sound/effects/trend_action.ogg"),
"window_close": preload("res://sound/effects/window_close.ogg"),
"window_open": preload("res://sound/effects/window_open.ogg"),
}
static func get_music() -> Dictionary:
return MUSIC.duplicate()
static func get_effects() -> Dictionary:
return EFFECTS.duplicate()
+1
View File
@@ -0,0 +1 @@
uid://cb517ydjlk7iq
@@ -1,3 +1,48 @@
class_name OwniverseCivilizationRuleLoader
const E = preload("res://world/owniverse/math/exact.gd")
static func get_data() -> Dictionary:
var result: Dictionary = {}
for row: Dictionary in CSVLoader.load(DATA).values():
for field in ["span", "stars", "progress", "degradation", "colonization", "war", "diplomacy_rate", "worship"]:
row[field] = E.of(row[field])
if not result.has(row.stage):
result[row.stage] = {
"home": row.home,
"span": E.of(row.span),
"stars": E.of(row.stars),
"ethics": {},
"colonizes": row.colonizes == "1",
"fights": row.fights == "1",
"diplomacy": row.diplomacy == "1",
"worships": row.worships == "1",
}
result[row.stage].ethics[row.ethic] = row
var stages: Array = result.keys()
stages.sort()
for i in stages.size():
result[stages[i]].next = stages[i + 1] if i + 1 < stages.size() else "Ct"
result[stages[i]].previous = stages[i - 1] if i > 0 else "C0.1"
result[stages[i]].colony = stages[maxi(0, i - 2)]
result.Ct = {
"home": "",
"span": 0.0,
"stars": 0.0,
"ethics": {},
"next": "Ct",
"previous": "C4.4",
"colonizes": false,
"fights": false,
"diplomacy": false,
"worships": false,
}
return result
#region Data Items
const DATA := """
id|stage|span|home|stars|colonizes|fights|diplomacy|worships|ethic|progress|degradation|colonization|war|diplomacy_rate|worship|fall id|stage|span|home|stars|colonizes|fights|diplomacy|worships|ethic|progress|degradation|colonization|war|diplomacy_rate|worship|fall
C0.2:m|C0.2|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.1:1 C0.2:m|C0.2|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.1:1
C0.2:b|C0.2|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.1:1 C0.2:b|C0.2|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.1:1
@@ -257,3 +302,6 @@ C4.4:d|C4.4|8E+06|SMBH|1E+24|1|1|1|1|d|0.0144|0.01923076923|0.0009765625|0.00031
C4.4:l|C4.4|8E+06|SMBH|1E+24|1|1|1|1|l|0.0648|0.04464285714|0.0005|0.0025|1.5625|0.5|C4.3:1024^C4.2:11 C4.4:l|C4.4|8E+06|SMBH|1E+24|1|1|1|1|l|0.0648|0.04464285714|0.0005|0.0025|1.5625|0.5|C4.3:1024^C4.2:11
C4.4:c|C4.4|8E+06|SMBH|1E+24|1|1|1|1|c|0.027|0.04166666667|0.004096|0.006103515625|1|0.8|C4.3:1024^C4.2:19 C4.4:c|C4.4|8E+06|SMBH|1E+24|1|1|1|1|c|0.027|0.04166666667|0.004096|0.006103515625|1|0.8|C4.3:1024^C4.2:19
C4.4:w|C4.4|8E+06|SMBH|1E+24|1|1|1|1|w|0.03375|0.025|0.000256|0.03072|0.25|1.25|C4.3:1024^C4.2:26 C4.4:w|C4.4|8E+06|SMBH|1E+24|1|1|1|1|w|0.03375|0.025|0.000256|0.03072|0.25|1.25|C4.3:1024^C4.2:26
"""
#endregion
@@ -0,0 +1 @@
uid://271dcyio6pm7
-3
View File
@@ -1,3 +0,0 @@
[remap]
importer="keep"
@@ -1,3 +1,11 @@
class_name OwniverseEntityLoader
static func get_data() -> Dictionary:
return CSVLoader.load(ENTITIES)
#region Owniverse Entities
const ENTITIES := """
id|is_visible|unlock|cost|bind|mass|space|lifespan|auto|gamma|blast|life_product|voids|output|destroy_level|degradation|planets|count_as|group_as|event_group|blastability|space_bonus|civ_bonus|claim id|is_visible|unlock|cost|bind|mass|space|lifespan|auto|gamma|blast|life_product|voids|output|destroy_level|degradation|planets|count_as|group_as|event_group|blastability|space_bonus|civ_bonus|claim
S|1|S:0|E:1||||||||||||||||S|||| S|1|S:0|E:1||||||||||||||||S||||
H|1|H:0|E:1||||||||||||||||H|||| H|1|H:0|E:1||||||||||||||||H||||
@@ -150,4 +158,6 @@ fpac|1|fpac:1|||||||||||||||||||||
fenr|1|fenr:1||||||||||||||||||||| fenr|1|fenr:1|||||||||||||||||||||
fmor|1|fmor:1||||||||||||||||||||| fmor|1|fmor:1|||||||||||||||||||||
fdis|1|fdis:1||||||||||||||||||||| fdis|1|fdis:1|||||||||||||||||||||
frep|1|frep:1||||||||||||||||||||| frep|1|frep:1|||||||||||||||||||||
"""
#endregion
+1
View File
@@ -0,0 +1 @@
uid://bqtpylmso1ahc
@@ -1,3 +1,14 @@
class_name OwniverseExtraParamLoader
const E = preload("res://world/owniverse/math/exact.gd")
static func get_data() -> Dictionary:
var result: Dictionary = {}
for row: Dictionary in CSVLoader.load(DATA).values():
result[row["param name"]] = E.of(row["param export"])
return result
#region Data
const DATA := """
param name|param value|param export|comment param name|param value|param export|comment
E|1.00E+27|1.00E+27|количество энергии во вселенной E|1.00E+27|1.00E+27|количество энергии во вселенной
G|6.67E-11|6.67E-11| G|6.67E-11|6.67E-11|
@@ -25,3 +36,5 @@ ForceBox0Weight| 24|24|Вес вероятности появления зелё
ForceBox1Weight| 6|6|Вес вероятности появления синего ящика ForceBox1Weight| 6|6|Вес вероятности появления синего ящика
ForceBox2Weight| 2|2|Вес вероятности появления фиолетового ящика ForceBox2Weight| 2|2|Вес вероятности появления фиолетового ящика
ForceBox3Weight| 1|1|Вес вероятности появления оранжевого ящика ForceBox3Weight| 1|1|Вес вероятности появления оранжевого ящика
"""
#endregion
+1
View File
@@ -0,0 +1 @@
uid://0sukoduq5ghq
@@ -1,3 +1,11 @@
class_name OwniverseItemLoader
static func get_data() -> Dictionary:
return CSVLoader.load(ITEMS)
#region Owniverse Items
const ITEMS := """
id|name|image|page|row|col|sub_page id|name|image|page|row|col|sub_page
fsho|shovelin|ui/0-forces/|0|0|0| fsho|shovelin|ui/0-forces/|0|0|0|
finf|inflatin|ui/0-forces/|0|0|1| finf|inflatin|ui/0-forces/|0|0|1|
@@ -122,4 +130,8 @@ C4.0|civ4.0|ui/4-life/civ4/|10|0|0|
C4.1|civ4.1|ui/4-life/civ4/|10|0|1| C4.1|civ4.1|ui/4-life/civ4/|10|0|1|
C4.2|civ4.2|ui/4-life/civ4/|10|0|2| C4.2|civ4.2|ui/4-life/civ4/|10|0|2|
C4.3|civ4.3|ui/4-life/civ4/|10|0|3| C4.3|civ4.3|ui/4-life/civ4/|10|0|3|
C4.4|civ4.4|ui/4-life/civ4/|10|0|4| C4.4|civ4.4|ui/4-life/civ4/|10|0|4|
"""
#endregion
+1
View File
@@ -0,0 +1 @@
uid://du0vey80c1o0e
-3
View File
@@ -1,3 +0,0 @@
[remap]
importer="keep"
+25
View File
@@ -0,0 +1,25 @@
class_name OwniverseLifeRuleLoader
const E = preload("res://world/owniverse/math/exact.gd")
static func get_data() -> Dictionary:
var result: Dictionary = CSVLoader.load(DATA)
for row: Dictionary in result.values():
for field in ["span", "progress", "degradation"]:
row[field] = E.of(row[field])
return result
#region Data Items
const DATA := """
id|span|progress|degradation|next|fall
HP|5E+06|0.00025|0.0025|EON1|RP:1
EON1|1E+06|0.025|0.0025|EON2|HP:100^RP:1
EON2|1E+06|0.025|0.0025|EON3|EON1:1
EON3|1E+05|0.025|0.0025|EON4|EON2:1000^EON1:1
EON4|1E+05|0.025|0.0025|EON5|EON3:1000^EON1:1
EON5|5E+05|0.025|0.0025|C0.0|EON4:2000^EON1:1
C0.0|2E+03|0.0175|0.025|C0.1|EON5:1
C0.1|2E+03|0.0175|0.025|C0.2|C0.0:1
"""
#endregion
+1
View File
@@ -0,0 +1 @@
uid://c2valw4nqebxp
@@ -1,4 +1,4 @@
class_name OwniverseTemplate class_name OwniverseTemplateLoader
#region RU #region RU
const RU := """ const RU := """
+1
View File
@@ -1,6 +1,7 @@
[runnable_presets] [runnable_presets]
"Windows Desktop"="Windows Desktop" "Windows Desktop"="Windows Desktop"
Android="Android"
[preset.0] [preset.0]
+68 -25
View File
@@ -46,7 +46,15 @@ float. Весь порядок E27 сохраняет целые единицы.
### Общие окна рождения и эволюции ### Общие окна рождения и эволюции
Окно рождения шириной `w = lifespan / 40` при `lifespan > 10`, иначе `w = lifespan`. Окно превращения сдвинуто на `lifespan`. При частичном списании: На всех скоростях целевая частота запуска — пять полных циклов в секунду. После накопления не менее 0,2 реальной секунды запускается расчёт за весь ожидающий игровой интервал. Время, поступающее во время расчёта, остаётся для следующего цикла. При задержках шаг увеличивается; время не отбрасывается. Смена скорости не сокращает реальный интервал между запусками. Незавершённая транзакция из сохранения возобновляется с прежней границей. Кооперативный бюджет кадра — 40 мс; фактическая частота завершения зависит от стоимости расчёта.
На скоростях 4–6 укрупнение звёздных партий зависит от размера цикла и прежнего окна рождения. Номинальная ширина сетки партий — `0.2 × 10^(speed - 1)` игровых лет: 200, 2000 и 20000 лет. Если прежнее окно `max(lifespan / 40, временное разрешение)` шире цикла, оно сохраняется: долгоживущие звёзды не дробятся на более мелкую сетку. Если оно не шире цикла, новые звёзды группы `Star` (включая красные гиганты) объединяются по общей границе завершения жизни и переходят целиком.
При обработке существующих партий объединяются только две или более партии одного типа, весь оставшийся интервал превращения которых попадает в один и тот же цикл. Широкие партии и партии, пересекающие границу циклов, остаются без изменений. Количества и накопленные остатки складываются точно; объединённая партия переходит целиком на границе цикла. Повторное укрупнение не меняет результат.
Это приближение времени перехода: задержка узкой партии не превышает одного цикла. Производство учитывает полное исчезновение объединённой партии на выбранной границе. При снижении скорости новые звёзды снова получают постепенные партии; уже созданные партии не разделяются. События SN/GRB сохраняют прежний расчёт.
На скоростях 1–3 звёзды, а также остальные объекты со сроком жизни больше 10 лет используют 40 возрастных групп: окно рождения имеет ширину `w = lifespan / 40`; для коротких событий ширина равна сроку жизни. Окно превращения сдвинуто на `lifespan`. Для облаков и первичной жизни на скоростях 4–6 сохраняется прежнее укрупнение окна по временному разрешению. При частичном списании:
``` ```
expected = remainder + (remaining_count - remainder) * elapsed / remaining_window expected = remainder + (remaining_count - remainder) * elapsed / remaining_window
@@ -54,7 +62,7 @@ converted = floor(expected)
remainder = expected - converted remainder = expected - converted
``` ```
Конец окна списывает остаток. Переход не уничтожает всю партию в начале окна. Начала и длительности сохраняют модель GI, включая годовую длительность событий SN/GRB. Конец постепенного окна списывает остаток. Новые звёздные партии высоких скоростей вместо такого окна имеют одну границу полного перехода. Длительность событий SN/GRB остаётся годовой.
## Планеты ## Планеты
@@ -73,10 +81,10 @@ remainder = expected - planets_created
GI не хранит накопленные счётчики первичной материи Unity. Поэтому `stellar_environment()` вычисляет среду из текущего физического состава, включая связанные объекты, без суммирующих групп интерфейса. Это приближение для баланса GI, а не побитовое воспроизведение Unity. GI не хранит накопленные счётчики первичной материи Unity. Поэтому `stellar_environment()` вычисляет среду из текущего физического состава, включая связанные объекты, без суммирующих групп интерфейса. Это приближение для баланса GI, а не побитовое воспроизведение Unity.
- `M` — свободные и связанные H/He/Met плюс табличная масса конкретных объектов и масса SMBH. - `M` — свободные и связанные H/He/Met плюс табличная масса конкретных объектов и масса SMBH.
- `V` — физическое S плюс табличный объём объектов и `voids * 1e22`. - `V` — физическое S плюс табличный объём объектов и `voids * ExtraParams.VoidSize`.
- `Z = max(0, 0.4 * ln(100 * free_Met / M + 0.11) + 0.88)`; при `M = 0` металличность нулевая. - `Z = max(0, 0.4 * ln(100 * free_Met / M + 0.11) + 0.88)`; при `M = 0` металличность нулевая.
- `B = 65536 * f(M)`, где `f(0)=1`, `f(M)=M^0.1` при `0<M<1e10`, иначе `10`. - `B = ExtraParams.DA * f(M)`, где `f(0)=1`, `f(M)=M^0.1` при `0<M<1e10`, иначе `10`.
- `density = 1.23456e-7 * sqrt(B + M) / max(1, V)^(1/6)`. - `density = ExtraParams.NPC * sqrt(B + M) / max(1, V)^(1/6)`.
- `blast_factor = clamp(free_S / V, 0, 1)`; при нулевом объёме `1`. - `blast_factor = clamp(free_S / V, 0, 1)`; при нулевом объёме `1`.
Планетные бонусы сил пока не перенесены. Параметры мира Bur/Exp/Agg имеют собственные сохраняемые шкалы и эффективные множители (см. раздел индикаторов ниже). Металличность для производства фиксируется до расходования ресурсов на звёзды. Среда бласта фиксируется для поколения до добавления его продуктов. Планетные бонусы сил пока не перенесены. Параметры мира Bur/Exp/Agg имеют собственные сохраняемые шкалы и эффективные множители (см. раздел индикаторов ниже). Металличность для производства фиксируется до расходования ресурсов на звёзды. Среда бласта фиксируется для поколения до добавления его продуктов.
@@ -101,7 +109,7 @@ GI не хранит накопленные счётчики первичной
## Первичная жизнь: HP → EON1 → … → EON5 → C0.0 ## Первичная жизнь: HP → EON1 → … → EON5 → C0.0
Правила хранятся в `data/life_rules.txt`, исходные сроки и коэффициенты взяты из Unity `civs.txt`. В каждой обработанной части партии: Правила встроены в `data/owniverse_life_rule_loader.gd` и загружаются через `OwniverseLifeRuleLoader`; исходные сроки и коэффициенты взяты из Unity `civs.txt`. В каждой обработанной части партии:
- прогресс: `count * progress + carry_progress`; - прогресс: `count * progress + carry_progress`;
- деградация: `count * degradation + carry_degradation`; - деградация: `count * degradation + carry_degradation`;
@@ -109,7 +117,7 @@ GI не хранит накопленные счётчики первичной
Прогресс и деградация округляются вниз с сохранением остатков. Если оба накопленных исхода конкурируют за последнюю планету, распределяются только существующие объекты, а неиспользованный остаток переносится на следующую попытку. Деградация распределяется по весам `fall`; знаковые ошибки распределения также сохраняются. Прогресс и деградация округляются вниз с сохранением остатков. Если оба накопленных исхода конкурируют за последнюю планету, распределяются только существующие объекты, а неиспользованный остаток переносится на следующую попытку. Деградация распределяется по весам `fall`; знаковые ошибки распределения также сохраняются.
Для всех шести стадий базовые доли за попытку — `progress=0.00025`, `degradation=0.0025`. Интервалы HP/EON1/EON2/EON3/EON4/EON5: 5 млн, 10 млн, 10 млн, 1 млн, 1 млн, 500 тыс. лет. Используются постепенные окна GI шириной `span / 40`. Случайные множители Unity не применяются. Агрессия, порядок и просвещение изменяют вероятности по формулам из раздела индикаторов ниже. Базовые доли за попытку: для HP `progress=0.00025`, для EON1–EON5 `progress=0.025`; у всех `degradation=0.0025`. Текущие интервалы HP/EON1/EON2/EON3/EON4/EON5: 5 млн, 1 млн, 1 млн, 100 тыс., 100 тыс., 500 тыс. лет. Используются постепенные окна GI шириной `span / 40`. Случайные множители Unity не применяются. Агрессия, порядок и просвещение изменяют вероятности по формулам из раздела индикаторов ниже.
HP деградирует в RP. У эонов возможен откат к предыдущим стадиям по таблице. RP не развивается сам. C0.0 и C0.1 также развиваются: период 2000 лет, прогресс 0.0175, деградация 0.025. Переходы C0.0 → C0.1 → C0.2, откат C0.0 → EON5 и C0.1 → C0.0. Развитие C0.2 и выше подключено через этические правила. Конфликт civ_bonus устранён повторным импортом: бонусы структур совпадают с Unity. Для существующих этических цивилизаций пользователь выбрал равномерное распределение между шестью этиками с детерминированным целым остатком. HP деградирует в RP. У эонов возможен откат к предыдущим стадиям по таблице. RP не развивается сам. C0.0 и C0.1 также развиваются: период 2000 лет, прогресс 0.0175, деградация 0.025. Переходы C0.0 → C0.1 → C0.2, откат C0.0 → EON5 и C0.1 → C0.0. Развитие C0.2 и выше подключено через этические правила. Конфликт civ_bonus устранён повторным импортом: бонусы структур совпадают с Unity. Для существующих этических цивилизаций пользователь выбрал равномерное распределение между шестью этиками с детерминированным целым остатком.
@@ -119,37 +127,39 @@ HP деградирует в RP. У эонов возможен откат к п
## Этические и космические цивилизации ## Этические и космические цивилизации
`civilization_rules.txt` содержит 43 стадии по шесть этик из Unity. Они загружаются в `Global.CivilizationRules` и участвуют в расчёте партий. После C4.4 следует Ct: конечная стадия без новых жизненных партий. `data/owniverse_civilization_rule_loader.gd` содержит 43 стадии по шесть этик из Unity. `OwniverseCivilizationRuleLoader` группирует строки по стадиям, формирует связи между ними и передаёт готовый словарь в `Global.CivilizationRules`. После C4.4 следует Ct: конечная стадия без новых жизненных партий.
Состояние `ethics[stage][ethic]` хранит целые количества. Для существующих цивилизаций без этик количество распределяется поровну в порядке m, l, w, d, c, b; остаток распределяется по одному в этом порядке. Существующее распределение сохраняется. При внешних потерях оно пропорционально сокращается. Стадия хранит точное целое количество в физическом реестре и шесть долей `float` в `ethics[stage]`. C0.2–C4.4 не используют возрастные партии. Значение `span` задаёт средний интервал попыток: интенсивности прогресса, деградации, войны и колонизации равны соответствующим коэффициентам таблицы, делённым на эффективный `span`.
Цивилизации с непустым `home` (C2.0–C4.4) освобождаются от прежних привязок без изменения общего количества. Общий механизм переходов больше не переносит планетную привязку на такого преемника. Структуры назначаются отдельно в `civilization_homes`; при возвращении к планетным стадиям цивилизации размещаются у имеющихся карликовых звёзд. `civilization_flow.gd` вычисляет ожидаемые потоки по состоянию начала интервала. Разреженный оператор непрерывных переходов интегрируется рядом Пуассона (uniformization): один интервал может пройти несколько последовательных стадий, включая достижение Ct. Число членов ряда зависит от интенсивности и длительности интервала, а не от количества цивилизаций. Большой интервал полностью обрабатывается частями с параметром Пуассона не более 32. Промежуточные массы и составы потоков — `float`; конечные количества распределяются целыми квотами с сохранением точной общей суммы. Доли квот округляются до 15 десятичных знаков; остатки округления сохраняются между циклами.
Правило среды согласовано: число космических цивилизаций ограничено звёздным ресурсом. Для стадии `i` расход ёмкости — `population[i] * max(1, Stars[i])`. Каждое семейство `Home` имеет общий бюджет для всех использующих его стадий; звёзды внутри структур также учитываются, но повторно не суммируются. SMBH учитывается по суммарной массе в эквиваленте звёзд, согласно решению пользователя. Обычный дрейф этик интегрируется аналитически: уход 2% за средний интервал попыток распределяется между четырьмя не противоположными этиками. После смешивания приходящих потоков дипломатия постепенно смещает доли в соответствии с `diplomacy_rate`. Ct сохраняет этику без дрейфа. Это приближённое разделение процессов: переходы и дрейф используют один интервал, но не чередуются для каждого отдельного поколения.
Переход переиспользует резерв исходной стадии. При нехватке ёмкости неподдержанные переходы остаются на исходной стадии. Лимит применяется к общему механизму выходов партий и ручному созданию; расчёт прогресса C0.2+ использует тот же бюджет. Войны включены в интенсивности переходов. На столкновение ожидается 17/36 успешного прогресса и 31/18 суммарных потерь сторон, разделённых на `Order`; потери распределяются по `fall`. Счётчик столкновений и колониальные попытки интегрируются по времени пребывания на каждой стадии, включая посещённые внутри интервала. Побочный ущерб 40/3 на столкновение применяется к остающейся популяции предыдущей стадии и ограничивается её количеством. Отдельных партий победителей, нападающих и жертв нет.
При загрузке и после эволюционных поколений избыток деградирует последовательно до поддерживаемой стадии. Приоритет получают существующие более развитые цивилизации; остаток бюджета достаётся младшим. Деградация переносит количество и этики, сокращает старые партии и регистрирует новые, не уничтожая цивилизации. C2.0 при избытке становится C1.9 и распределяется по имеющимся звёздам-карликам. Если карликов нет, C1.9 остаётся свободной — отсутствующая звезда не создаётся. Планетные стадии до C2.0 не расходуют отдельную звёздную ёмкость: у одной звезды могут быть несколько планет. Колонизация агрегирует запросы по стадии назначения (на две стадии ниже отправителя), ограничивает их общим запасом GG, AB, RP и HP и заменяет ровно выделенное число планет. Целые колонии сохраняют владельца целевой планеты; состав получает дрейф 960/4/9. Исходное население не расходуется.
Резерв ёмкости логический: звёзды не расходуются и продолжают производить ресурсы. Общий бюджет пересчитывается из физических количеств, отдельная копия бронирований в сохранении не хранится. Применение потоков сначала строит таблицу исходных владельцев. Для каждой исходной стадии готовые целые квоты распределяются по строкам владельцев; последняя строка получает точный остаток. Стадии с единственным свободным запасом применяют готовые квоты напрямую. Поступления объединяются по стадии и владельцу; физическая выдача и статистика создания выполняются один раз на получателя. Ct всегда остаётся свободной от привязок.
При колонизации планеты сначала списываются по типам и владельцам, затем суммарное списание каждого владельца распределяется между стадиями колоний. Каждая стадия получает одну суммарную выдачу. Общие целые квоты, число списанных планет и количество колоний сохраняются точно. Из-за объединения распределений единичные остатки между владельцами могут отличаться от прежнего последовательного порядка; вероятности переходов и формулы этик не меняются.
### Расчёт поколения C0.2–C4.4 В пределах цивилизационной транзакции точные общие количества передаются между фазами. Применение переходов, колонизация и коррекция ёмкости возвращают обновлённый снимок; перемещение между владельцами само по себе общую численность не меняет. Этот снимок используется для периодов, ограничений, нормализации этик и поклонения. После изменения запасов другими подсистемами снимок строится заново. Снимки не сохраняются в файл и не заменяют проверку состояния при внешних изменениях словарей.
1. Из истёкшей части партии пропорционально выбираются представители шести этик. Для каждой этики читаются `progress` и `degradation`; целые исходы получаются с сохранением дробных остатков. Неудавшийся из-за лимита переход возвращается на исходную стадию. Автоматическое создание нескольких типов звёзд также использует один текущий снимок. Успешная пробная операция вычитает фактически израсходованные количества; перенос ресурса в привязку сохраняет общий запас. При отказе пробной операции снимок остаётся неизменным. Новые звёзды выдаются после завершения отбора типов, как и прежде.
2. Прогресс ведёт на следующую стадию; деградация распределяется по весам `fall` конкретной этики. Повторные попытки не увеличивают статистику созданных цивилизаций.
3. При флаге `fights` рассчитываются войны. Веса исходов — 1:2:3:3, доли прогресса победителей — 0:0.25:0.5:0.75; первый исход деградирует атакующих. Потери противников — 2:1:1.5:2 на войну. Два последних исхода дают 10 и 30 единиц побочного ущерба предыдущей стадии. Выбор участников ограничен живой популяцией, включая ещё не сработавшие партии; их партии сокращаются вместе с населением.
4. Для обычного дрейфа веса своей/противоположной/каждой другой этики равны 196/0/1. Дипломатия умножает исходные численности на `diplomacy_rate`, затем нормирует к прежней численности. Флаг дипломатии действует на остающихся на стадии. При переходе в Ct этика сохраняется без дрейфа.
5. При флаге `colonizes` создаются колонии на две стадии ниже отправителя. Цели — существующие GG, AB, RP, HP; колонизация заменяет цель и сохраняет её звёздную привязку. Веса дрейфа колонистов — 960/4/9. Исходная цивилизация не расходуется. Новая партия начинается в текущий игровой момент.
6. После применения переходов пересчитываются этики, поклонение (`Σ population × worship`), бласты и ограничения среды. Число операций зависит от числа типов и партий, а не от числа цивилизаций.
Окна исходных партий сохраняют время переходов; несколько частей одного типа обрабатываются агрегированно между минимальным и максимальным временем. Побочный ущерб неистёкшим партиям применяется в текущий момент. Все остатки округления сохраняются в `civilization_remainders`, счётчики — в `civilization_stats`. Космические стадии C2.0–C4.4 свободны от планетных привязок. Общие бюджеты звёздных семейств и структур учитывают уже занятые резервы. Неподдерживаемый промежуточный переход блокируется в операторе; конечные положительные запросы делят свободную ёмкость одновременно. Отклонённые количества возвращаются к источнику. Освободившаяся при переходах ёмкость доступна следующему шагу. Если внешние изменения уменьшили ёмкость ниже существующего населения, избыток последовательно деградирует с приоритетом старших стадий. При возвращении в планетные стадии используются реальные карликовые звёзды, при отсутствии хозяина население остаётся свободным.
Порядок полного шага: производство за интервал → непрерывные потоки существующих цивилизаций → поколения звёзд и биологической жизни и бласты → итоговые ограничения среды → тренды. Возникшие из C0.1 цивилизации C0.2 получают равномерный профиль, смешанный с существующим населением, и начинают непрерывную эволюцию со следующего шага. Разные размеры полного шага могут отличаться из-за этого порядка, ограничений среды и нелинейных эффектов; чистая непрерывная цепочка без ограничений согласована при разделении интервала.
Счётчик времени UI показывает запрошенные часы и обновляется с частотой до 10 Гц независимо от тяжёлой транзакции. Состояние мира и его индикаторы публикуются по завершении транзакции; при высокой нагрузке отображаемые часы поэтому могут немного опережать рассчитанные объекты. Тяжёлые циклы адаптивно запускаются с целевым интервалом 0,2–0,5 реальной секунды, каждый использует весь накопленный игровой интервал.
В `civilization_remainders` сохраняются квоты и дробные остатки потоков; в `civilization_stats` — войны, колонии, побочный ущерб и поклонение. Возрастные партии сохраняются для звёзд, HP, эонов, C0.0 и C0.1.
### Структуры и периоды ### Структуры и периоды
Прямой `claim` задаёт структуру стадии и норму 1; каждая промежуточная стадия умножает норму на 10 до следующего `claim`. Начиная с C3.0 требуется соответствующий запас структур, общий для использующих его стадий. При потере запаса избыток деградирует. Этот бюджет действует одновременно со звёздным. Прямой `claim` задаёт структуру стадии и норму 1; каждая промежуточная стадия умножает норму на 10 до следующего `claim`. Начиная с C3.0 требуется соответствующий запас структур, общий для использующих его стадий. При потере запаса избыток деградирует. Этот бюджет действует одновременно со звёздным.
Размещение выбирает структуры в порядке убывания `civ_bonus`, начиная с соответствующего стадии `claim`. Прямое размещение ограничено числом структур; остальные разрешённые структуры при наличии дают общий бонус, как в Unity. Период новых партий равен `span / средневзвешенный civ_bonus`, для неразмещённой части множитель равен 1. Уже назначенные сроки партий не переписываются при изменении бонуса. Размещение выбирает структуры в порядке убывания `civ_bonus`, начиная с соответствующего стадии `claim`. Прямое размещение ограничено числом структур; остальные разрешённые структуры при наличии дают общий бонус, как в Unity. Эффективный средний интервал попыток равен `span / средневзвешенный civ_bonus`, для неразмещённой части множитель равен 1. Бонус входит в оператор следующего расчётного интервала.
Ct не получает часы. Инициализация отсутствующих партий жизни выполняется при загрузке и перед продвижением симуляции. Параметры мира и тенденции описаны ниже; интерфейс применения сил в этот перенос не входит. Ct не получает часы. Инициализация отсутствующих партий жизни выполняется при загрузке и перед продвижением симуляции. Параметры мира и тенденции описаны ниже; интерфейс применения сил в этот перенос не входит.
@@ -167,9 +177,11 @@ Ct не получает часы. Инициализация отсутству
- `1e-5 < density < 0.9`: обычная шкала, `ln(density × 1e5) / ln(9e4)`; - `1e-5 < density < 0.9`: обычная шкала, `ln(density × 1e5) / ln(9e4)`;
- `density ≥ 0.9`: шкала сжатия, `(density − 0.9) × 10`. - `density ≥ 0.9`: шкала сжатия, `(density − 0.9) × 10`.
В Unity в первой формуле было `−7`; это ошибка, не позволяющая указателю двигаться. Здесь исправлено на `+7`. Переключение шкалы меняет и заголовок/описание индикатора. Само наступление апокалипсиса индикатор не запускает. В Unity в первой формуле было `−7`; это ошибка, не позволяющая указателю двигаться. Здесь исправлено на `+7`. Переключение шкалы меняет и заголовок/описание индикатора.
Общая рамка `Background/WarningBorder` получает цвета Unity `WarningUI` в формате RGBA: при плотности ≤1e-5 — `C040407F`, ≤1e-6 — `DF2020BF`, ≤1e-7 — `FF0000FF`; при плотности ≥0,9 — `40A0C07F`, ≥0,97 — `20B0DFBF`, ≥1 — `00C0FFFF`. В нормальном диапазоне рамка прозрачна. Она обновляется вместе с индикаторами, не перехватывает нажатия и снимается при восстановлении плотности. Необратимая последовательность апокалипсиса Unity сюда не входит. Общая рамка `Background/WarningBorder` получает цвета Unity `WarningUI` в формате RGBA: при плотности ≤1e-5 — `C040407F`, ≤1e-6 — `DF2020BF`, ≤1e-7 — `FF0000FF`; при плотности ≥0,9 — `40A0C07F`, ≥0,97 — `20B0DFBF`, ≥1 — `00C0FFFF`. В нормальном диапазоне рамка прозрачна. Она обновляется вместе с индикаторами и не перехватывает нажатия.
Пороговые состояния управляют запуском апокалипсиса: при `density ≤ bigrip3` начинается Big Rip, при `density ≥ bigcrunch3` — Big Crunch. Последовательность берётся из `Global.ApocalypseQueue`, сортируется по `Num` и использует указанные `Stage`, `Screen` и `Tick`. Каждые 0,1 секунды активные объекты выбранной страницы теряют половину количества (для остатков до 5 — по одному). На время последовательности скорость фиксируется на 1, ручное и автоматическое создание блокируется, а экран переключается по очереди. Big Rip пропускает `S`, Big Crunch — `SMBH`; остаток энергии постепенно переводится в соответствующий объект. После 20 тиков с нулевой энергией апокалипсис получает фазу завершения, симуляция останавливает время. Фаза, тип события, предупреждение и позиция в очереди сохраняются в состоянии вселенной.
### Горючесть, взрывчатость и агрессия ### Горючесть, взрывчатость и агрессия
@@ -206,3 +218,34 @@ Ct не получает часы. Инициализация отсутству
При достижении 1 учитываются все целые срабатывания, дробный остаток сохраняется. Только Integration имеет последствия в исходной Unity: равновероятно выбирается Federation (+0,1 и Agg −1), Enlightenment (+0,2 и Agg −1) или Order (+0,1). Генератор сохраняет своё состояние. До 256 событий за шаг выбор выполняется по одному; для больших количеств используется нормальная аппроксимация мультиномиального распределения с сохранением точного суммарного числа событий, чтобы высокие скорости не блокировали кадр. Она может менять последовательность исходов при другом разбиении больших интервалов. При достижении 1 учитываются все целые срабатывания, дробный остаток сохраняется. Только Integration имеет последствия в исходной Unity: равновероятно выбирается Federation (+0,1 и Agg −1), Enlightenment (+0,2 и Agg −1) или Order (+0,1). Генератор сохраняет своё состояние. До 256 событий за шаг выбор выполняется по одному; для больших количеств используется нормальная аппроксимация мультиномиального распределения с сохранением точного суммарного числа событий, чтобы высокие скорости не блокировали кадр. Она может менять последовательность исходов при другом разбиении больших интервалов.
Federation сохраняется и увеличивается как в Unity, но в исходном коде не применяется к дипломатии. Дополнительное правило для него не придумано. Остальные четыре тенденции имеют счётчики срабатываний и сброс, но не последствия — так же, как в исходной реализации. Параметры и остатки тенденций сохраняются; у существующего сохранения текущего формата без этих полей используются нейтральные значения и нулевые тенденции, без изменения ресурсов или возраста. Federation сохраняется и увеличивается как в Unity, но в исходном коде не применяется к дипломатии. Дополнительное правило для него не придумано. Остальные четыре тенденции имеют счётчики срабатываний и сброс, но не последствия — так же, как в исходной реализации. Параметры и остатки тенденций сохраняются; у существующего сохранения текущего формата без этих полей используются нейтральные значения и нулевые тенденции, без изменения ресурсов или возраста.
## Дополнительные параметры
Рабочая таблица встроена в `data/owniverse_extra_param_loader.gd` как `const DATA`,
по аналогии с остальными таблицами. В `Global._init()` вызывается get_data() до создания главной сцены:
CSVLoader разбирает строки, колонка `param export` преобразуется через E.of.
Результат хранится только в `Global.ExtraParams`. После редактирования таблицы
требуется перезапуск игры; отдельного CSV и статического кэша загрузчика нет.
Из таблицы берутся начальная энергия E, добавочная масса DA, коэффициент NPC,
размер пустот VoidSize, показатель степени combustibility_bonus для горючести
выше единицы, пороги bigrip1–3 и bigcrunch1–3. Интервалы индикатора плотности
вычисляются из тех же порогов, без дублирующих числовых констант.
Начальная энергия относится к новым вселенным; запас энергии существующей
вселенной остаётся частью её сохранения.
G, C, space_generation, ChatPerTick и параметры ForceBox загружаются, но пока не
используются в GI: соответствующие
формулы и механики старой Unity-версии здесь отсутствуют. Производство объектов
в GI задаётся их собственной таблицей life_product и lifespan.
Для звёзд с прямой стоимостью H доля He в свободной смеси H+He заменяет часть
водородной стоимости. Применяются `helium_multiplier` и `helium_bonus_limit`, а
замещение ограничено 50%, как в Unity. Недостающий He не блокирует создание:
непокрытая часть оплачивается H. При создании таких звёзд срок жизни
умножается на `1 − 1.5 × доля замещения`; тот же коэффициент задаёт сроки их
партий. Автоматическое создание использует свободный He, а бюджет автоматического
H списывает только оставшуюся после замещения водородную часть.
`tests/test_extra_params.gd` проверяет загрузку точных чисел и изменение энергии,
плотности, объёма пустот, порогов индикатора и бонуса горючести.
+104 -10
View File
@@ -9,6 +9,10 @@ const ItemDescription = preload("res://world/owniverse/item_description.gd")
const WorldIndicators = preload("res://ui/indicators/world_indicators.gd") const WorldIndicators = preload("res://ui/indicators/world_indicators.gd")
var world_indicators: RefCounted var world_indicators: RefCounted
var indicator_elapsed: float = 0.0 var indicator_elapsed: float = 0.0
var indicator_revision: int = -1
var actions_revision: int = -1
var descriptions_revision: int = -1
var displayed_year: Variant = null
var description_targets: Dictionary = {} var description_targets: Dictionary = {}
var description_samples: Dictionary = {} var description_samples: Dictionary = {}
var description_rates: Dictionary = {} var description_rates: Dictionary = {}
@@ -64,6 +68,7 @@ const SWIPE_DURATION: float = 0.4
@onready var g_time_minus: TextureButton = $World/TopMenu/TimeMinus @onready var g_time_minus: TextureButton = $World/TopMenu/TimeMinus
@onready var g_time_plus: TextureButton = $World/TopMenu/TimePlus @onready var g_time_plus: TextureButton = $World/TopMenu/TimePlus
@onready var effects_player: OwniverseEffectsPlayer = $"../FXPlayer"
@onready var screens: Dictionary = { @onready var screens: Dictionary = {
"World": $World, "World": $World,
@@ -93,6 +98,14 @@ var g_active_items: Dictionary = {}
var pending_page: int = -1 var pending_page: int = -1
var active_actions_dirty: bool = true var active_actions_dirty: bool = true
var active_actions_elapsed: float = 0.0 var active_actions_elapsed: float = 0.0
var clock_display_elapsed: float = 0.0
var interface_sounds_enabled: bool = false
var apocalypse_elapsed: float = 0.0
var apocalypse_ui_phase: int = -1
var apocalypse_screen: int = -1
@onready var time_minus_button: TextureButton = $World/TopMenu/TimeMinus
@onready var time_plus_button: TextureButton = $World/TopMenu/TimePlus
@onready var apocalypse_music: OwniverseMusicPlayer = $"../MusicPlayer"
var owniverse:Owniverse = Owniverse.new() var owniverse:Owniverse = Owniverse.new()
var owniverse_items: Dictionary[String, OwniverseItem] = {} var owniverse_items: Dictionary[String, OwniverseItem] = {}
@@ -157,6 +170,11 @@ func _update_descriptions(delta: float) -> void:
description_elapsed += delta description_elapsed += delta
if description_elapsed < 0.25: if description_elapsed < 0.25:
return return
if descriptions_revision == owniverse.presentation.revision:
var has_rate: bool = false
for rate in description_rates.values(): has_rate = has_rate or E.ne(rate, 0)
if not has_rate: return
descriptions_revision = owniverse.presentation.revision
for page in description_targets: for page in description_targets:
var id: String = description_targets[page].id var id: String = description_targets[page].id
var total = ItemDescription.quantities(owniverse, id).total var total = ItemDescription.quantities(owniverse, id).total
@@ -262,13 +280,16 @@ func _swipe_to_nearest_page() -> void:
func _input(event: InputEvent) -> void: func _input(event: InputEvent) -> void:
if E.eq(owniverse.state.get("apocalypse", {}).get("phase", 0), 1): return
if event is InputEventScreenDrag: if event is InputEventScreenDrag:
#effects_player.play_effect("swipe")
stage_page_scroller.scroll_horizontal = clamp( stage_page_scroller.scroll_horizontal = clamp(
stage_page_scroller.scroll_horizontal - PAGE_COUNT * event.screen_relative.x, stage_page_scroller.scroll_horizontal - PAGE_COUNT * event.screen_relative.x,
0, PAGE_WIDTH * (PAGE_COUNT - 1)) 0, PAGE_WIDTH * (PAGE_COUNT - 1))
g_counters.swipe.is_active = true g_counters.swipe.is_active = true
g_counters.swipe.value = 0 g_counters.swipe.value = 0
elif event is InputEventPanGesture: elif event is InputEventPanGesture:
#effects_player.play_effect("swipe")
g_counters.swipe.is_active = true g_counters.swipe.is_active = true
g_counters.swipe.value = 0 g_counters.swipe.value = 0
elif event is InputEventScreenTouch: elif event is InputEventScreenTouch:
@@ -285,7 +306,7 @@ func _set_active_page_actions() -> void:
#var amount = owniverse.get_available_to_produce(item_id) #var amount = owniverse.get_available_to_produce(item_id)
#var amount = owniverse.get_available_to_produce(entity) #var amount = owniverse.get_available_to_produce(entity)
var amount = owniverse.production.calculate_max_producible(entity) var amount = (0 if E.gt(owniverse.state.get("apocalypse", {}).get("phase", 0), 0) else owniverse.production.calculate_max_producible(entity))
#print(item_id, " : ", amount) #print(item_id, " : ", amount)
if item_id == "SMBH": if item_id == "SMBH":
var preview: Callable = func(requested): var preview: Callable = func(requested):
@@ -302,7 +323,11 @@ func _page_action_pressed(page_id: int, action_amount) -> void:
var item_id: String = g_active_items[page_id].item_id var item_id: String = g_active_items[page_id].item_id
if E.gt(action_amount, 0): if E.gt(action_amount, 0):
owniverse.request_production(item_id, action_amount) if owniverse.request_production(item_id, action_amount):
page_actions[page_id].mark_pending(action_amount)
func _on_owniverse_production_applied(_item_id: String) -> void:
active_actions_dirty = true
#endregion #endregion
@@ -320,6 +345,11 @@ func _ready() -> void:
for pa in page_actions: for pa in page_actions:
page_actions[pa].action_pressed.connect(_page_action_pressed) page_actions[pa].action_pressed.connect(_page_action_pressed)
page_actions[pa].page_id = pa page_actions[pa].page_id = pa
_enable_interface_sounds.call_deferred()
func _enable_interface_sounds() -> void:
interface_sounds_enabled = true
## Starts a fresh universe. Can be connected directly to a button's pressed signal. ## Starts a fresh universe. Can be connected directly to a button's pressed signal.
@@ -327,6 +357,7 @@ func _ready() -> void:
func create_new_universe() -> void: func create_new_universe() -> void:
var previous: Owniverse = owniverse var previous: Owniverse = owniverse
owniverse = Owniverse.new() owniverse = Owniverse.new()
owniverse.production_applied.connect(_on_owniverse_production_applied)
var inited_result: Dictionary = init_enitities() var inited_result: Dictionary = init_enitities()
locked_items = inited_result.locked_items locked_items = inited_result.locked_items
@@ -338,6 +369,10 @@ func create_new_universe() -> void:
g_tween.kill() g_tween.kill()
g_active_items.clear() g_active_items.clear()
description_targets.clear() description_targets.clear()
indicator_revision = -1
actions_revision = -1
descriptions_revision = -1
displayed_year = null
description_samples.clear() description_samples.clear()
description_rates.clear() description_rates.clear()
description_elapsed = 0.0 description_elapsed = 0.0
@@ -362,7 +397,7 @@ func create_new_universe() -> void:
func _refresh_universe_ui() -> void: func _refresh_universe_ui() -> void:
owniverse.presentation.refresh(owniverse.state, owniverse.catalog) owniverse.presentation.refresh(owniverse.state, owniverse.catalog)
_change_speed(0) _change_speed(0)
set_datetime(owniverse.state.time.year) set_datetime(owniverse.display_clock().year)
set_owniverse_item_value() set_owniverse_item_value()
_unlock_items() _unlock_items()
if world_indicators != null: world_indicators.update(owniverse) if world_indicators != null: world_indicators.update(owniverse)
@@ -370,13 +405,21 @@ func _refresh_universe_ui() -> void:
func _process(delta: float) -> void: func _process(delta: float) -> void:
owniverse.evolute_frame(delta, get_tree()) owniverse.evolute_frame(delta, get_tree())
_process_apocalypse(delta)
clock_display_elapsed += delta
if clock_display_elapsed >= 0.1:
clock_display_elapsed = fmod(clock_display_elapsed, 0.1)
set_datetime(owniverse.display_clock().year)
indicator_elapsed += delta indicator_elapsed += delta
if indicator_elapsed >= 0.1: if indicator_elapsed >= 0.1 and indicator_revision != owniverse.presentation.revision:
indicator_elapsed = 0.0 indicator_elapsed = 0.0
world_indicators.update(owniverse) world_indicators.update(owniverse)
indicator_revision = owniverse.presentation.revision
_update_descriptions(delta) _update_descriptions(delta)
set_owniverse_item_value() if not owniverse.presentation.pending_amounts.is_empty(): set_owniverse_item_value()
set_datetime(owniverse.state.time.year) var committed_year: Variant = owniverse.state.time.year
if displayed_year == null or E.ne(displayed_year, committed_year):
displayed_year = committed_year
#owniverse.cycle(delta) #owniverse.cycle(delta)
@@ -388,17 +431,24 @@ func _process(delta: float) -> void:
# them when selection changes and at a modest cadence instead of every # them when selection changes and at a modest cadence instead of every
# rendered frame. The simulation itself continues to run every frame. # rendered frame. The simulation itself continues to run every frame.
active_actions_elapsed += delta active_actions_elapsed += delta
if active_actions_dirty or active_actions_elapsed >= 0.1: if active_actions_dirty or (active_actions_elapsed >= 0.1 and actions_revision != owniverse.presentation.revision):
active_actions_elapsed = 0.0 active_actions_elapsed = 0.0
active_actions_dirty = false active_actions_dirty = false
_set_active_page_actions() _set_active_page_actions()
actions_revision = owniverse.presentation.revision
func _change_speed(delta: int) -> void: func _change_speed(delta: int) -> void:
if E.eq(owniverse.state.get("apocalypse", {}).get("phase", 0), 1) and delta != 0: return
var previous_speed: int = owniverse.speed
owniverse.speed = owniverse.speed + delta owniverse.speed = owniverse.speed + delta
var speed: int = owniverse.speed var speed: int = owniverse.speed
if speed > previous_speed:
effects_player.play_effect("time_plus")
elif speed < previous_speed:
effects_player.play_effect("time_minus")
var ind: int = 1 var ind: int = 1
for icon in g_speed_icons: for icon in g_speed_icons:
if ind <= speed: if ind <= speed:
@@ -417,7 +467,51 @@ func _change_speed(delta: int) -> void:
g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed + 1)) g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed + 1))
func _process_apocalypse(delta: float) -> void:
var apocalypse: Dictionary = owniverse.state.get("apocalypse", {})
var phase: int = int(apocalypse.get("phase", 0))
if phase != apocalypse_ui_phase:
apocalypse_ui_phase = phase
if phase == 1:
apocalypse_music.play_apocalypse()
owniverse.speed = 1
_change_speed(0)
elif phase == 2:
owniverse.speed = 1
_change_speed(0)
time_minus_button.disabled = phase == 1
time_plus_button.disabled = phase == 1
active_actions_dirty = true
if phase == 1:
_set_active_page_actions()
if phase != 1:
apocalypse_elapsed = 0.0
return
apocalypse_elapsed += delta
if owniverse.frame_busy or owniverse.production_queue_busy:
return
while apocalypse_elapsed >= OwniverseApocalypseController.TICK_SECONDS and E.eq(owniverse.state.apocalypse.phase, 1):
apocalypse_elapsed -= OwniverseApocalypseController.TICK_SECONDS
var result: Dictionary = owniverse.apocalypse.process_tick(owniverse.state)
if int(result.screen) >= 0 and int(result.screen) != apocalypse_screen:
apocalypse_screen = int(result.screen)
stage_page_scroller.scroll_horizontal = apocalypse_screen * PAGE_WIDTH
if bool(result.finished):
_change_speed(0)
func _on_topmenu_button_pressed(screen_name: String) -> void: func _on_topmenu_button_pressed(screen_name: String) -> void:
var current_screen: String = ""
for screen_id in screens:
if screens[screen_id].visible:
current_screen = screen_id
break
if current_screen == screen_name:
return
if interface_sounds_enabled:
effects_player.play_effect("window_close" if screen_name == "World" else "window_open")
for screen_id in screens: for screen_id in screens:
#print(screen_name, " ←→ ", screen_id) #print(screen_name, " ←→ ", screen_id)
@@ -443,8 +537,8 @@ func load_data() -> bool:
# Current definitions are initialized first; reject incompatible saves before publishing. # Current definitions are initialized first; reject incompatible saves before publishing.
for id in owniverse.state.amount: for id in owniverse.state.amount:
if not restored.amount.has(id) or not restored.stats.total_amount.has(id): if not restored.amount.has(id) or not restored.stats.total_amount.has(id):
SaveManager.blocked_saves["owniverse"] = true push_warning("Save is missing the current entity: " + id)
push_error("Save is missing the current entity: " + id) SaveManager.archive_incompatible_save("owniverse")
return false return false
var complete: Dictionary = owniverse.state.duplicate(true) var complete: Dictionary = owniverse.state.duplicate(true)
complete.merge(restored, true) complete.merge(restored, true)
+153 -5
View File
@@ -1,5 +1,24 @@
# Проверки поэтапного переноса из Owniverse.U # Проверки поэтапного переноса из Owniverse.U
`test_simulation_optimizations.gd` сравнивает прямые формулы дрейфа с прежней
матрицей, включая целые количества больше E27 и накопленные остатки.
Тестовый ledger сверяет выборочное округление с полным на каждом поколении
нагруженной симуляции. `test_ui_updates.gd` проверяет обновление по публикации,
выбору объекта и изменению параметров мира, а также пропуск повторных расчётов
для неизменившегося состояния.
Динамический размер партий проверяется в `test_batch_boundaries.gd`: скорости
1–6, сохранение больших целых количеств и дробных остатков, повторное
укрупнение и снижение скорости. Высокие скорости допускают приближение
времени переходов; сравнение со старым состоянием целиком не является
проверкой эквивалентности такого режима.
`test_coarse_generations.gd` проверяет отсутствие повторного перехода C0.0,
C0.1 и C0.2 внутри одного интервала, старое смещение сетки партий,
продолжение эволюции в следующем интервале, большие целые количества и
дробные остатки. `test_frame_evolution.gd` сравнивает целый и разбитый по
кадрам расчёт, включая возобновление сохранённого незавершённого шага.
## Производительность на сохранении ## Производительность на сохранении
```sh ```sh
@@ -103,7 +122,41 @@ godot --headless --path Owniverse.GI --script res://tests/test_time.gd
## Согласованные правила эволюции ## Согласованные правила эволюции
Сохраняются постепенные интервальные окна GI: начало преобразования — через `lifespan`, длительность окна — `lifespan / 40` при `lifespan > 10`, иначе `lifespan`. Сохраняются постепенные интервальные окна GI: срок жизни делится на 40 возрастных групп; начало преобразования — через `lifespan`, длительность окна — `lifespan / 40` при `lifespan > 10`, иначе `lifespan`.
На скоростях 4–6 узкие звёздные партии могут объединяться по границе полного
цикла смерти шириной 200/2000/20000 игровых лет. Прежнее окно шире цикла
сохраняется: долгоживущие звёзды не дробятся. Из существующих партий сливаются
только две или более одного типа, чей оставшийся переход полностью попадает
в общий цикл; широкие и пересекающие границу партии сохраняются.
`test_batch_boundaries` проверяет объединение, точные большие количества и
остатки, однократное изъятие, сериализацию, сохранение широких окон,
распределённые рождения и интеграл производства.
`benchmark_large_star_cohorts.gd` создаёт отдельные большие диагностические
сохранения со старой и новой звёздной сеткой при одинаковых количествах и
входных интервалах рождения. Переключатель `batches.cycle_stars` используется
только для сравнительного замера, в игре он включён. Парные прогоны меняют
порядок моделей и сбрасывают исходное состояние перед каждым запуском:
```sh
godot --headless --path Owniverse.GI --script res://tests/benchmark_large_star_cohorts.gd -- cycles=50 repeats=2
```
Сохранения и полные профили записываются в `tests/artifacts/large_star_cohorts_*`;
сохранение игрока не затрагивается. `generate_only` проверяет запись/чтение и
исходное равенство физических количеств без запуска замеров.
`benchmark_many_objects.gd` создаёт новую диагностическую вселенную со всеми
типами объектов и цивилизаций и 4800 синтетическими звёздными партиями,
попадающими группами в общие циклы. Это отдельный стресс-сценарий большого
числа партий; старый и новый расчёты используют одинаковый исходный состав.
```sh
godot --headless --path Owniverse.GI --script res://tests/benchmark_many_objects.gd -- cycles=40 repeats=2
```
Файлы сценария: `tests/artifacts/many_objects_fragmented_stars_*`.
Вероятностные исходы используют накопление дробного остатка GI, без случайного округления. Этот же подход выбран для будущего создания планет. Шансы планет записаны долями (`0.01` = 1%), а альтернативные исходы звёзд — процентами (`%0.1` = 0.1%). Парсер планет сохраняет дроби и поддерживает один элемент без `&`. Вероятностные исходы используют накопление дробного остатка GI, без случайного округления. Этот же подход выбран для будущего создания планет. Шансы планет записаны долями (`0.01` = 1%), а альтернативные исходы звёзд — процентами (`%0.1` = 0.1%). Парсер планет сохраняет дроби и поддерживает один элемент без `&`.
@@ -185,15 +238,33 @@ godot --path Owniverse.GI --script res://tests/benchmark_civilizations.gd -- ui
## Расчёт между кадрами ## Расчёт между кадрами
`test_flow_commit.gd` проверяет консолидированное применение переходов и колонизации: точные квоты получателей, сохранение количества у каждого владельца, профили этик, статистику создания и отсутствие привязок у Ct. Проверки используют несколько владельцев и численность 103, 10^40 + 103 и 10^400 + 103.
Дополнительно проверяется точное совпадение обновляемых общих количеств с полным пересчётом после переходов, колонизации и каскадной деградации при нехватке ёмкости. Входные снимки остаются неизменными.
`test_production_transaction.gd` проверяет, что успешное создание обновляет общий снимок, привязка сохраняет общий ресурс, а отклонённая операция сохраняет и состояние, и снимок.
```sh
godot --headless --path Owniverse.GI --script res://tests/test_flow_commit.gd
```
`godot --headless --path Owniverse.GI --script res://tests/test_frame_evolution.gd` `godot --headless --path Owniverse.GI --script res://tests/test_frame_evolution.gd`
Stage вызывает `evolute_frame`: транзакция получает бюджет 40 мс и уступает Stage вызывает `evolute_frame`: транзакция получает бюджет 40 мс и уступает
следующему кадру внутри создания партий и обработки стадий. Расчёт остаётся следующему кадру внутри создания партий и обработки стадий. Расчёт остаётся
на главном потоке, состояние публикуется только после полного завершения. на главном потоке, состояние публикуется только после полного завершения.
Длительность одной транзакции ограничена обычным шагом 1/60 секунды выбранной Запрошенные игровые часы и счётчик UI обновляются независимо от тяжёлого расчёта;
скорости. Запрошенное время хранится отдельно, поэтому отставание не превращается Stage показывает запрошенное время раз в 0,1 секунды (10 Гц), а опубликованное
в один всё более тяжёлый шаг. При предельной нагрузке время симуляции может состояние мира остаётся на последнем завершённом цикле. Расчёт запускается после
отставать от запрошенного; это не ограничение FPS интерфейса и не удаление событий. накопления выбранного интервала и обрабатывает весь ожидающий интервал. Время,
поступившее во время расчёта, обрабатывается следующим циклом. Контроллер нагрузки
меняет целевой шаг между 0,2, 0,25, 0,333 и 0,5 секунды (5/4/3/2 цикла в секунду):
вниз при EMA расчёта выше 90% текущего шага, вверх после 30 циклов ниже 65%.
Временное разрешение укрупнения партий масштабируется с шагом, исходная точность
сохраняется на 5 Гц. Контроллер не пропускает накопленное игровое время, но 2/с —
нижняя целевая частота, не гарантия при перегрузке.
`benchmark_dynamic_cadence.gd` сравнивает пропускную способность полного цикла на двух диагностических сохранениях. `benchmark_dynamic_cadence_ui.gd` сравнивает 10 секунд работы полной сцены на сохранении со всеми объектами; результаты сохранены в `artifacts/dynamic_cadence_results.json` и `artifacts/dynamic_cadence_ui_results.json`.
Производство во время транзакции выполняется после её завершения. Запрошенное Производство во время транзакции выполняется после её завершения. Запрошенное
время, активный интервал, скорость и очередь производства входят в сохранение; время, активный интервал, скорость и очередь производства входят в сохранение;
@@ -205,3 +276,80 @@ Stage вызывает `evolute_frame`: транзакция получает б
15.9 FPS (максимальный кадр 98 мс), большие количества 17.5 FPS (106 мс), 15.9 FPS (максимальный кадр 98 мс), большие количества 17.5 FPS (106 мс),
много партий 16.3 FPS (97 мс). много партий 16.3 FPS (97 мс).
Это FPS отрисовки, а не число завершённых транзакций симуляции в секунду. Это FPS отрисовки, а не число завершённых транзакций симуляции в секунду.
Индекс партий переиспользуется внутри одной транзакции, отдельно для каждого
массива партий. Замена массива при изъятии или переход к другому состоянию
сбрасывает индекс. Сортировка выполняется при нарушении порядка новых окон,
а не после каждого добавления в уже существующее окно. `test_batch_boundaries`
проверяет объединение, раннюю вставку, замену массива и изоляцию состояний.
На копии текущего сохранения с 785 партиями шесть шагов на скорости 6:
среднее время 167 → 145 мс; полное состояние после шести шагов совпало точно.
Следующий этап исключает арифметическую работу при прибавлении нуля,
временные знаменатели при умножении целых блоков и нулевые вклады этик.
На той же копии сохранения среднее время шага скорости 6 снизилось с 145
до 138 мс; полный результат после шести шагов совпал с исходным состоянием.
Тест появления разума задаёт свой progress явно, поскольку проверяет
сохранение хозяина планеты, а не актуальное значение коэффициента баланса.
Следующие шесть оптимизаций: однократное изъятие умирающих партий;
поверхностные снимки неизменяемых таблиц связей; пропуск планирования
цивилизаций без переходов; кэш нормализованных этик и произведений поклонения;
пропуск укрупнения для нуля/одной партии; кэш вероятностей переходов.
Кэши принадлежат миру и не входят в сохранение. Изменение количества,
этик, коэффициентов правил или модификаторов обнаруживается по значениям.
Суммирование поклонения сохраняет прежний порядок дробных операций.
`test_simulation_optimizations` проверяет также обновление этих кэшей.
Полное состояние совпало с реализацией до этих шести изменений после каждого
из восьми шагов на скоростях 1, 4 и 6, отдельно на большом фрагментированном
сценарии и на диагностической копии сохранения (48 сравнений).
На M4 Pro шесть шагов по 0.1 секунды скорости 6: 103.3 мс первый,
70.9–76.0 мс последующие; пропускная способность без UI 1.278.
Замер 600 кадров с реальным UI: 12.24 FPS, p95 97.16 мс, максимум 104.86 мс,
520 завершённых транзакций, отношение обработанного времени к поступившему
1.057. Замер включает сокращение накопленного отставания сохранения;
это результат конкретного сценария на Mac, а не гарантия для Android.
Целевая частота запуска — пять циклов в секунду. Размер шага равен всему накопленному интервалу. Checkpoint сохраняет границу активного расчёта и ожидающее реальное время. Тест проверяет все шесть скоростей, смену скорости, задержку запуска и накопление времени во время расчёта.
Дипломатический drift использует шесть взвешенных вкладов вместо матрицы
пар этик: вес = сумма вкладов + 195 × свой вклад − противоположный вклад.
Для колониальной матрицы коэффициенты 9, 951 и 5 соответственно.
Целая численность и механизм сохранения ошибок распределения не меняются,
но порядок операций над дробными весами отличается от матричного варианта.
Тест сравнивает с матрицей на точно представимых коэффициентах и проверяет
целочисленное сохранение популяций до 1e40 на десятичных коэффициентах.
Пустые популяции пропускают drift; численность выходов суммируется один раз.
На профильной копии при шаге 0.5 число вызовов снизилось 1038 → 849
за шесть шагов, но время drift осталось около 303 мс суммарно;
заметного ускорения полного расчёта в этом сценарии не зафиксировано.
`test_split_optimizations.gd` сравнивает распределение и все сохранённые
остатки с прежним scalar split в последовательных вызовах: пустые ветви,
единственная ветвь, равные веса, десятичные веса, положительные/отрицательные
остатки, количества до 1e80. Также проверяет grouped mul_div против scalar.
Split переиспользует разложение количества и знаменателя между ветвями,
кэширует ключи остатков (не более 512 наборов) и получает веса дрифта массивом.
Вторая нормализация пропускается только при целых долях с нужной суммой:
при дробях даже единичное отношение может изменить округление, поэтому
прежний путь сохраняется. Единственная положительная ветвь обрабатывается
напрямую только при целом количестве, неотрицательных весах и нулевых остатках.
На профильной копии время drift за шесть шагов 0.5 снизилось примерно
303 → 287 мс, но общее время осталось около 1.31 секунды.
Обычный drift сокращает целое количество из отношения
count*weight/(200*count), колониальный — из отношения с 1000.
Целая часть делится на малый знаменатель; для дроби используются исходные
масштабированные числитель и знаменатель, чтобы сохранить float округление.
`test_split_optimizations` проверяет совпадение со scalar mul_div до 1e80.
Производство новорождённых сохраняет только created_from → amount вместо
глубокой копии партий. Повторное мгновенное рождение с теми же сроками,
длительностью и сеткой сразу добавляется в найденную партию.
Индекс ближайшей границы позволяет повторным проходам пропускать будущие
партии; замена массива, добавление и масштабирование сбрасывают индекс.
Тест границ проверяет объединение и сброс обоих индексов.
Адаптивный шаг дополнительно учитывает сглаженное отношение реальной
длительности транзакции к обработанному времени. Если отношение выше 0.85
и долг больше одного шага, ступень увеличивается раньше порога двух шагов.
Долг и граница сохраняются как прежде; измерения являются временным кэшем.
+110
View File
@@ -0,0 +1,110 @@
extends Control
const E = preload("res://world/owniverse/math/exact.gd")
const RESULT_PATH := "user://android_benchmark_result.txt"
const FRAME_COUNT := 120
var status_label: Label
func _ready() -> void:
status_label = Label.new()
status_label.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)
status_label.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
status_label.vertical_alignment = VERTICAL_ALIGNMENT_CENTER
status_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
status_label.add_theme_font_size_override("font_size", 32)
add_child(status_label)
call_deferred("_run")
func _set_status(message: String) -> void:
status_label.text = message
var file := FileAccess.open(RESULT_PATH, FileAccess.WRITE)
if file != null:
file.store_line(message)
file.flush()
func _restore(value):
if value is float and value == floorf(value) and absf(value) <= 9007199254740991:
return int(value)
if value is Dictionary:
for key in value:
value[key] = _restore(value[key])
elif value is Array:
for index in value.size():
value[index] = _restore(value[index])
return value
func _load_payload_threaded() -> Dictionary:
var file := FileAccess.open("res://tests/artifacts/all_objects_speed6.adventure.json", FileAccess.READ)
if file == null:
return {"error": "Cannot open benchmark save: %s" % FileAccess.get_open_error()}
var parser := JSON.new()
var error := parser.parse(file.get_as_text())
if error != OK:
return {"error": "JSON parse error at line %d: %s" % [parser.get_error_line(), parser.get_error_message()]}
var data = E.decode(_restore(parser.data))
if not data is Dictionary or not data.has("state"):
return {"error": "Benchmark save has no state"}
return {"payload": data}
func _run() -> void:
_set_status("Reading and decoding benchmark save on a worker thread…")
var worker := Thread.new()
var start_error := worker.start(Callable(self, "_load_payload_threaded"))
if start_error != OK:
_set_status("ERROR: could not start loader thread (%s)" % start_error)
return
while worker.is_alive():
await get_tree().process_frame
var loaded: Dictionary = worker.wait_to_finish()
if loaded.has("error"):
_set_status("ERROR: " + str(loaded.error))
return
_set_status("Save decoded. Initializing UI scene…")
var payload: Dictionary = loaded.payload
var scene: Node = load("res://world/world.tscn").instantiate()
var stage = scene.get_node("Stage")
stage.owniverse.free()
stage.set_script(load("res://tests/fixtures/benchmark_ui_stage.gd"))
get_tree().root.add_child(scene)
await get_tree().process_frame
stage.owniverse.state = payload.state.duplicate(true)
stage.owniverse.restore_frame_checkpoint(payload.get("simulation", {}))
stage.owniverse.presentation.refresh(stage.owniverse.state, stage.owniverse.catalog)
stage.set_owniverse_item_value()
stage.stage_page_scroller.scroll_horizontal = 4 * stage.PAGE_WIDTH
var initial_requested = stage.owniverse.frame_clock.get("datetime", stage.owniverse.state.time.datetime)
var initial_published = stage.owniverse.state.time.datetime
stage.owniverse.profile_enabled = true
stage.measuring = true
_set_status("Running speed 6: 0/%d frames" % FRAME_COUNT)
for frame in FRAME_COUNT:
await get_tree().process_frame
if frame % 5 == 4:
_set_status("Running speed 6: %d/%d frames; commits=%d" % [frame + 1, FRAME_COUNT, stage.owniverse.frame_commits])
stage.measuring = false
var samples: Array = stage.frame_samples
if samples.is_empty():
_set_status("ERROR: no rendered frame samples; frames=%d" % stage.frame_samples.size())
return
var total: float = 0.0
for sample in samples:
total += sample
samples.sort()
var requested_advance = E.subtract(stage.owniverse.frame_clock.datetime, initial_requested)
var published_advance = E.subtract(stage.owniverse.state.time.datetime, initial_published)
var process_samples: Array = stage.process_samples
process_samples.sort()
var process_total: float = 0.0
for sample in process_samples:
process_total += sample
var process_summary := "no _process samples"
if not process_samples.is_empty():
process_summary = "mean=%.2fms p95=%.2fms max=%.2fms samples=%d" % [process_total / process_samples.size(), process_samples[int(ceil(process_samples.size() * 0.95)) - 1], process_samples.back(), process_samples.size()]
var budget: Variant = stage.owniverse.frame_budget
var max_slice_summary: String = "none"
if budget != null:
max_slice_summary = "%.2fms (%s)" % [budget.max_slice_usec / 1000.0, budget.max_slice_phase]
var result := "DONE\nFPS=%.2f mean=%.2fms p95=%.2fms max=%.2fms frames=%d commits=%d\nStage _process CPU: %s\nMax uninterrupted simulation slice: %s\nRequested=%s published=%s throughput=%s\nFinal adaptive step=%s\nProfile=%s" % [1000.0 / (total / samples.size()), total / samples.size(), samples[int(ceil(samples.size() * 0.95)) - 1], samples.back(), samples.size(), stage.owniverse.frame_commits, process_summary, max_slice_summary, str(requested_advance), str(published_advance), str(E.divide(published_advance, requested_advance)), str(stage.owniverse.frame_step_seconds), str(stage.owniverse.profile)]
_set_status(result)
get_tree().quit()
+1
View File
@@ -0,0 +1 @@
uid://dkbyhj8ib0eyf
+12
View File
@@ -0,0 +1,12 @@
[gd_scene load_steps=2 format=3]
[ext_resource type="Script" path="res://tests/android_benchmark.gd" id="1"]
[node name="AndroidBenchmark" type="Control"]
layout_mode = 3
anchors_preset = 15
anchor_right = 1.0
anchor_bottom = 1.0
grow_horizontal = 2
grow_vertical = 2
script = ExtResource("1")
@@ -0,0 +1,49 @@
{
"date": "2026-10-08",
"machine": "Apple M4 Pro",
"godot": "4.7.2.stable.official.ed1daf0bf",
"renderer": "headless",
"delta_seconds": 0.2,
"profile_enabled": true,
"ui": false,
"adaptation": {
"controller": "runtime-only exponential moving average of full-cycle CPU time; 0.8 previous + 0.2 latest",
"quality_thresholds_ms": {
"quality_1": 200,
"quality_2": 220,
"quality_3": 300,
"quality_2_to_3_when_over_ms": 200,
"recovery_below_ms": 140,
"recovery_cycles": 30
},
"quality_effects": {
"quality_1": "one-transition civilization approximation, at most 3 stellar/life generations per cycle, temporal grouping x2",
"quality_2": "same civilization approximation, at most 1 generation per cycle, temporal grouping x4",
"quality_3": "same civilization approximation, at most 1 generation per cycle, temporal grouping x8, alternate halves of batch types each cycle"
}
},
"inputs": {
"all_objects_speed6.adventure.json": "44bee3b3753fa51615f766d8f800a10cc2b70c8e7fb4ea12b6e18da7f07a7d67",
"many_objects_fragmented_stars_cycle.adventure.json": "1e95ef398923f26b912a305c84f9b3eb502d24cb14e8ae687a4becccf047324a"
},
"runs": [
{"speed": 1, "save": "all_objects_speed6.adventure.json", "cycles": 60, "mean_ms": 165.03665, "min_ms": 151.514, "max_ms": 170.171, "cycles_per_second": 6.05926, "game_years": 12, "validation": "OK"},
{"speed": 1, "save": "many_objects_fragmented_stars_cycle.adventure.json", "cycles": 60, "mean_ms": 128.463817, "min_ms": 124.475, "max_ms": 144.05, "cycles_per_second": 7.784293, "game_years": 12, "validation": "OK"},
{"speed": 2, "save": "all_objects_speed6.adventure.json", "cycles": 60, "mean_ms": 181.431217, "min_ms": 171.92, "max_ms": 196.005, "cycles_per_second": 5.511731, "game_years": 120, "validation": "OK"},
{"speed": 2, "save": "many_objects_fragmented_stars_cycle.adventure.json", "cycles": 60, "mean_ms": 131.78055, "min_ms": 126.963, "max_ms": 148.01, "cycles_per_second": 7.588373, "game_years": 120, "validation": "OK"},
{"speed": 3, "save": "all_objects_speed6.adventure.json", "cycles": 60, "mean_ms": 175.235683, "min_ms": 166.031, "max_ms": 203.456, "cycles_per_second": 5.7066, "game_years": 1200, "validation": "OK"},
{"speed": 3, "save": "many_objects_fragmented_stars_cycle.adventure.json", "cycles": 60, "mean_ms": 145.013367, "min_ms": 135.062, "max_ms": 162.768, "cycles_per_second": 6.895916, "game_years": 1200, "validation": "OK"},
{"speed": 4, "save": "all_objects_speed6.adventure.json", "cycles": 60, "mean_ms": 159.705883, "min_ms": 150.404, "max_ms": 221.101, "cycles_per_second": 6.26151, "game_years": 12000, "validation": "OK"},
{"speed": 4, "save": "many_objects_fragmented_stars_cycle.adventure.json", "cycles": 60, "mean_ms": 177.064483, "min_ms": 170.624, "max_ms": 189.729, "cycles_per_second": 5.64766, "game_years": 12000, "validation": "OK"},
{"speed": 5, "save": "all_objects_speed6.adventure.json", "cycles": 60, "mean_ms": 174.857517, "min_ms": 158.809, "max_ms": 270.078, "cycles_per_second": 5.718942, "game_years": 120000, "validation": "OK"},
{"speed": 5, "save": "many_objects_fragmented_stars_cycle.adventure.json", "cycles": 60, "mean_ms": 185.601233, "min_ms": 131.409, "max_ms": 273.8, "cycles_per_second": 5.387895, "game_years": 120000, "validation": "OK"},
{"speed": 6, "save": "all_objects_speed6.adventure.json", "cycles": 60, "mean_ms": 190.570967, "min_ms": 159.38, "max_ms": 345.149, "cycles_per_second": 5.247389, "game_years": 1200000, "validation": "OK"},
{"speed": 6, "save": "many_objects_fragmented_stars_cycle.adventure.json", "cycles": 60, "mean_ms": 184.426, "min_ms": 149.645, "max_ms": 366.767, "cycles_per_second": 5.422229, "game_years": 1200000, "validation": "OK"}
],
"notes": [
"Each run begins in exact mode and adapts during its 60-cycle series.",
"The mean meets 5 complete cycles/s at all six speeds in these synthetic diagnostic saves on this computer; maxima show occasional cycles still exceed 200 ms at speeds 3-6.",
"No Android device or UI performance was measured.",
"Diagnostic save inputs were not modified."
]
}
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,518 @@
# Все объекты, скорость 6
Создано скриптом `tests/create_full_benchmark_save.gd`. Пароль нативного сохранения: `qwerty`.
Генератор не читает и не перезаписывает сохранение игрока.
Начальное состояние: 151 запись каталога (включая группы), все 44 стадии правил цивилизаций, все шесть этик на каждой стадии, 1000 когорт (по десять на сущность с временными партиями). У большинства обычных объектов количество равно 6e60, у стадий цивилизаций — 6e20. Пространство и водород имеют количество 1e90, гелий и металлы — 1e80, энергия — 1e100. Возраст — 1e15 лет. Запасов достаточно для требований продвинутых стадий звезд и структур. Оставшиеся сроки жизни когорт покрывают весь срок жизни сущностей, поэтому переходы происходят во время замера.
Это искусственный экстремальный сценарий, а не прогноз для обычного сохранения.
Машина: Apple M4 Pro, Godot 4.7.2, рендерер Metal Mobile.
| Замер | Результат |
|---|---:|
| Headless, скорость 6, шесть шагов по 0,5 секунды | 943,936–1221,992 мс на шаг |
| Среднее время headless-шага | 1122,287 мс |
| Пропускная способность headless | 0,446 секунды симуляции на секунду CPU |
| Настоящий UI, страница цивилизаций, 600 кадров | 17,38 FPS |
| Средний / p95 / максимальный кадр UI | 57,55 / 99,78 / 116,94 мс |
| Завершенные транзакции | 23 |
| Запрошенный прирост игрового времени | 3464662,267 лет |
| Опубликованный прирост игрового времени | 1080000 лет |
| Пропускная способность с UI | 0,3117 |
| Накопленный долг за замер | 2384662,267 игровых лет (23,85 реальных секунд на скорости 6) |
| Записей каталога осталось в конце | 151 |
Динамический шаг достигает предела в 0,5 секунды. Рендеринг идет быстрее 5 FPS, но симуляция не успевает за заданным темпом в этом сценарии. На обработку поколений приходится примерно 94% времени CPU. Подготовка цивилизаций занимает в среднем 634 мс на шаг, в том числе дрифт этик — 218 мс, войны — 124 мс; колонизация — 121 мс на шаг. Интервалы профилировщика вложенные и частично перекрываются.
## Сравнение оптимизации дрифта (2026-10-05)
Замеры сделаны на одном сгенерированном сохранении и одной машине до и после прямого распределения потоков для обычного и колониального дрифта, а также кеширования ставок дипломатии в фиксированной точке. Каждый headless-запуск выполняет шесть последовательных шагов по 0,5 секунды на каждой скорости.
| Замер | До | После |
|---|---:|---:|
| Средний headless-шаг на скорости 6 | 1122,287 мс | 1018,559 мс |
| Пропускная способность headless на скорости 6 | 0,446 | 0,491 |
| Дрифт этик, сумма интервалов за шесть шагов | 1,338 с | 0,643 с |
| UI, FPS за 600 кадров | 17,38 | 17,04 |
| Средний / p95 / максимальный кадр UI | 57,55 / 99,78 / 116,94 мс | 58,70 / 102,67 / 114,30 мс |
| Завершенные UI-транзакции | 23 | 25 |
| Запрошено / опубликовано игровых лет в UI | 3464662 / 1080000 | 3533627 / 1180000 |
| Пропускная способность симуляции с UI | 0,3117 | 0,3339 |
Средний headless-шаг ускорился примерно на 9,2%, а интервал профиля дрифта этик сократился примерно на 52%. Частота кадров UI практически не изменилась (в этом запуске снизилась примерно на 2%), при этом завершилось больше транзакций и выросла доля опубликованного игрового времени. На скорости 6 стресс-сценарий все еще отстает от реального времени: пропускная способность — около 0,49 секунды симуляции на секунду CPU в headless и 0,33 с UI. Самыми затратными остаются планирование поколений и войны.
Прямые пути сохраняют целое население, но разносят малые целочисленные потоки по нескольким последовательным переходам с помощью остатков для каждого источника. Поэтому распределение в отдельном переходе отличается от независимого округленного распределения по матрице 6×6. Ставки дипломатии округляются до сетки фиксированной точки с шагом 1e-9. Целевая регрессия: 769 проверок эволюции цивилизаций, оптимизаций симуляции, границ партий, укрупненных поколений и эволюции кадров; все пройдены.
## Последующая оптимизация подготовки поколений и кешей (2026-10-05)
На той же нагрузке среднее время headless-шага на скорости 6 снизилось с 1018,559 до 1005,138 мс (примерно на 1,3%). Пропускная способность headless изменилась с 0,491 до 0,497. Суммарные интервалы `generations` близки: 5,703 с и 5,629 с за шесть шагов. Подготовка цивилизаций остается самой затратной измеренной подфазой — 3,130 с. UI также почти не изменился: 17,04 → 17,09 FPS, пропускная способность симуляции — 0,3339 → 0,3351. Улучшение небольшое: арифметика населения в поколениях по-прежнему дорога при сотнях активных когорт и множестве правил цивилизаций.
Профиль теперь отдельно показывает `generation_withdrawal` и `generation_products`. Первый интервал занимает 55,5 мс, второй — 120,2 мс за шесть headless-шагов на скорости 6. Эти значения нельзя складывать с общим временем поколений, поскольку интервалы профилировщика вложенные.
## Инкрементальная обработка партий новорожденных (2026-10-05)
Удалены снимки когорт до и после рождения и последующий полный обход когорт. `append_batch` теперь сразу накапливает поправку на возраст новорожденных при добавлении частей когорт. Финальный замер после повторного использования сумм завершившихся партий в пределах поколения дал 1028,991 мс на headless-шаг скорости 6 и пропускную способность 0,486. В повторных прогонах этой же версии получилось 1005–1011 мс, поэтому при выборке всего в шесть шагов разброс велик, и устойчивое ускорение утверждать нельзя. В UI получилось 17,05 FPS, среднее время кадра 58,66 мс и пропускная способность 0,3342. Новый профиль показывает 319 мс на обработку партий новорожденных за шесть шагов. Это изменение пока не демонстрирует снижения общего времени на этом сохранении; его потенциальная польза относится прежде всего к сценариям с гораздо большим числом когорт на сущность, где прежние обходы росли пропорционально числу когорт.
Повторить замеры из родительской папки проекта:
```sh
godot --headless --path Owniverse.GI --script res://tests/create_full_benchmark_save.gd
godot --headless --path Owniverse.GI --script res://tests/benchmark_saved_state.gd -- Owniverse.GI/tests/artifacts/all_objects_speed6.adventure.json 0.5 profile
godot --path Owniverse.GI --script res://tests/benchmark_full_ui.gd
```
## Проверка на Android Note8 (2026-10-06)
Сборка benchmark установлена отдельным пакетом `com.KIDGameProduction.Owniverse.AndroidBench`, сохранение основной игры не использовалось. Подготовка и декодирование сохранения выполнялись в фоновом потоке; ход и результат записывались в файл приложения. Устройство: Samsung SM-N950F, Android 9. Сценарий: все объекты и цивилизации, скорость 6, 120 кадров (119 интервалов).
| Метрика | Результат |
|---|---:|
| FPS UI | 1,76 |
| Средний / p95 / максимальный кадр | 567,28 / 817,54 / 1278,33 мс |
| Завершенные транзакции за прогон | 1 |
| Запрошено / опубликовано игрового времени | 1599938,57 / 10000 лет |
| Доля опубликованного от запрошенного | 0,00625 |
| Итоговый динамический шаг | 0,2 с |
Самый дорогой участок профиля — `generations`: 5,350 с суммарно за единственную завершенную транзакцию; внутри него `civilization_prepare` занял 3,186 с, `wars` — 2,217 с, `civilization_transitions` — 1,034 с. Интервалы вложены, поэтому их нельзя складывать с `generations`. Этот экстремальный сценарий на Note8 не достигает целевых 5 FPS и сильно отстает по игровому времени. Это замер именно полного стресс-сохранения, а не обычного игрового сохранения.
### Покадровая уступка в расчётах цивилизаций
Добавлены контрольные точки внутри обработки этик, проигравших в войне, падения популяции и выходов между стадиями. Математика и порядок переходов не меняются. На том же Note8 повторный прогон дал 1,87 FPS против 1,76 FPS до изменения (прирост около 6%). Средний кадр сократился с 567 до 535 мс, но p95 остался 630 мс, максимум — 1281 мс. Это слишком малое улучшение для цели 5 FPS.
В повторном профиле `generations` заняли 5,166 с, `civilization_prepare` — 3,040 с, войны — 0,985 с, переходы между стадиями — 0,640 с. Профиль не показывает явного трёхкратного ускорения: контрольные точки лучше дробят отдельные подциклы, но главный синхронный участок остается слишком дорогим. Диагностическая сборка для измерения максимального непрерывного участка не завершила прогон на телефоне; при следующем проходе сначала нужно локализовать этот участок, а затем оптимизировать его отдельно.
Контрольный запуск UI-бенчмарка на Apple M4 Pro после изменения: 21,51 FPS, средний / p95 / максимальный кадр — 46,49 / 89,62 / 107,19 мс. Этот результат подтверждает отсутствие регрессии на компьютере, но не заменяет Android-замер.
### После перехода этик на доли (2026-10-06)
Этическое состояние теперь хранит шесть долей `float`, а точное целое население берётся из реестра объектов. Исходы одной стадии сначала собираются по назначениям; доли состояния обновляются после агрегации потоков. Формат сохранения повышен до версии 6; миграции прежних сохранений нет.
Финальная APK повторно проверена на Samsung SM-N950F, Android 9, тем же полным сценарием и 120 кадрами. Два последовательных прогона дали **14,57 и 15,02 FPS**, средний кадр — **68,61 и 66,58 мс**, p95 — **113,03 и 123,03 мс**, по одной завершённой транзакции из 119 интервалов. Опубликовано 10 000 лет из 647 331 и 634 134 запрошенных; пропускная способность — 0,01545 и 0,01577. В последнем профиле `generations` заняли 5,120 с, `civilization_prepare` — 3,162 с, войны — 1,026 с, переходы — 0,728 с, дрейф этик — 0,474 с. Самый длинный непрерывный участок составил **458,14 мс** в `deep_copy_and_coarsen`, максимальный кадр — 976 мс. Предыдущий одиночный запуск старой benchmark-сборки показал 1,83 FPS, поэтому сравнивать его с этой парой напрямую нельзя; оба финальных прогона выполнены на одной APK и подтверждают результат около 15 FPS.
На компьютере прошли тесты состояния (70), эволюции (555), оптимизаций симуляции (364), индикаторов (63) и жизни (25). Полный набор всё ещё сообщает о двух отказах в `test_descriptions.gd` при обновлении выбранного описания и смене языка; оба относятся к UI-описаниям, а не к модели этик. В логах Android ошибок GDScript/Godot за прогон не найдено.
## Непрерывная модель цивилизаций — 2026-10-06
Сравнены исходная симуляция из коммита `6ee66a6` и новая модель потоков. Оба запуска используют один диагностический JSON, скорость 6, 100 последовательных полных циклов с запросом 0,1 секунды каждый и включённый CPU-профиль. Подготовка каталога и чтение JSON не включены в длительность цикла. Запуски выполнены последовательно, без параллельных тестов. Сохранение игрока не читалось и не изменялось.
| Полный цикл и пропускная способность | До | После |
|---|---:|---:|
| Среднее время полного цикла | 811,292 мс | 401,796 мс |
| Минимум / максимум | 488,914 / 963,141 мс | 323,427 / 435,607 мс |
| Завершённых полных циклов в секунду | 1,233 | 2,489 |
| Обработанных секунд симуляции на секунду CPU | 0,123 | 0,249 |
| Применено игровых лет за 100 циклов | 1 000 000 | 1 000 000 |
Полный цикл ускорился в **2,02 раза**, среднее время сократилось на **50,5%**. Цель **100 мс / 10 полных циклов в секунду не достигнута**: для неё требуется ещё примерно 4,02-кратное ускорение текущей версии. При непрерывном запросе времени на шестой скорости и шаге 0,1 секунды этот стресс-сценарий продолжит накапливать долг. Это измерение полных завершённых шагов симуляции, без показателя FPS.
Текущие внешние интервалы CPU-профиля, по убыванию среднего времени на цикл:
| Расчёт | Среднее за цикл |
|---|---:|
| Поколения звёзд и биологической жизни | 151,6 мс |
| Подготовка непрерывных потоков цивилизаций | 98,5 мс |
| Применение потоков к количествам и владельцам | 53,2 мс |
| Производство за период | 28,7 мс |
| Тренды | 18,1 мс |
| Дрейф, проверка вместимости и поклонение после потоков | 8,8 мс |
| Инициализация жизни | 6,1 мс |
| Ограничение потоков ресурсными бюджетами | 5,8 мс |
| Применение колонизации | 5,5 мс |
Внутри подготовки потоков разреженный оператор занимает 24,5 мс на цикл; этот вложенный интервал нельзя прибавлять к 98,5 мс. Внешние интервалы не покрывают всё время: остальная работа включает копирование транзакции, построение физических снимков и обновление представления.
Модель C0.2–C4.4 теперь использует точные целые количества и шесть долей float без возрастных партий. Оператор учитывает несколько последовательных переходов за интервал. Конечные количества и ресурсные потолки сохраняются точно; пропорции потоков и владельцев приближены float и квантованием долей до 15 десятичных знаков. Изменяется распределение событий во времени, поэтому тесты проверяют законы новой модели, сохранение количества, владение, ресурсные ограничения и воспроизводимое продолжение сохранения.
Регрессия: 27 из 28 наборов прошли. Новые переходы — 1895 проверок; арифметика распределения и кеши — 1889; кадровое выполнение — 24. В `test_descriptions.gd` сохраняются две ранее обнаруженные ошибки обновления выбранного описания и языка; этот UI-код не изменён в данном рефакторинге.
Повторение из папки `Owniverse.GI`:
```sh
godot --headless --path . --script res://tests/benchmark_civilization_flows.gd -- tests/artifacts/all_objects_speed6.adventure.json 0.1 profile cycles=100
```
## Фиксированные пять циклов в секунду — 2026-10-07
Текущая версия после отката агрегации и возврата 40 возрастных групп.
Планировщик использует шаг 0,2 реальной секунды на всех скоростях. Замер:
диагностическое сохранение со всеми объектами и цивилизациями, скорость 6,
100 полных синхронных циклов с CPU-профилем, без отрисовки интерфейса.
Проверка сохранения: OK. Исходное сохранение не изменялось.
| Метрика | Результат |
|---|---:|
| Среднее время полного цикла | 439,228 мс |
| Минимум / максимум | 340,370 / 483,152 мс |
| Завершённых полных циклов в секунду | 2,277 |
| Требуется циклов в секунду | 5 |
| Обработано игровых лет | 2 000 000 |
| Запрошенное время сценария | 20 с |
| Время расчёта 100 циклов | 43,923 с |
| Пропускная способность | 0,455 с симуляции / с расчёта |
Цель 200 мс на полный цикл не достигнута: по среднему времени требуется
ускорение примерно в 2,20 раза. Увеличение шага с 0,1 до 0,2 секунды улучшило
отношение обработанного времени к затратам, но при непрерывном поступлении
времени этот стресс-сценарий продолжит накапливать долг. Это измерение
пропускной способности симуляции, без оценки FPS. Один прогон не задаёт
гарантированную производительность для других сохранений или устройств.
Внешние интервалы CPU-профиля, по убыванию среднего времени на цикл:
| Расчёт | Среднее на цикл |
|---|---:|
| Поколения звёзд и биологической жизни | 168,294 мс |
| Подготовка непрерывных потоков цивилизаций | 111,835 мс |
| Применение потоков к количествам и владельцам | 59,516 мс |
| Производство за период | 29,248 мс |
| Тренды | 17,787 мс |
| Завершение цивилизационных потоков | 8,864 мс |
| Ограничение потоков вместимостью | 6,439 мс |
| Инициализация жизни | 6,172 мс |
| Колонизация | 6,111 мс |
Вложенные интервалы нельзя прибавлять к внешним: построение физических
снимков — 27,845 мс/цикл; изъятие партий — 42,015 мс/цикл; решение оператора
цивилизаций — 31,835 мс/цикл. Проверки кадрового планировщика:
35 проверок, 0 ошибок, включая все шесть скоростей, сохранение долга,
возобновление расчёта и пять завершённых циклов на одну секунду запроса.
```sh
godot --headless --path . --script res://tests/benchmark_civilization_flows.gd -- tests/artifacts/all_objects_speed6.adventure.json 0.2 profile cycles=100
```
## Новые звёздные партии с целым переходом за цикл — 2026-10-07
На скоростях 4–6 новые звёзды одного типа объединяются по общей границе
завершения жизни и переходят целиком. Временная сетка равна одному полному
циклу (200/2000/20000 игровых лет). Старые постепенные партии из сохранения
не преобразуются; SN/GRB сохраняют прежнюю обработку.
Повторён тот же замер: диагностическое сохранение, скорость 6, шаг 0,2 с,
100 полных циклов с CPU-профилем. Проверка сохранения OK.
| Метрика | До | После |
|---|---:|---:|
| Среднее время полного цикла | 439,228 мс | 445,690 мс |
| Минимум / максимум | 340,370 / 483,152 мс | 345,276 / 486,647 мс |
| Полных циклов в секунду | 2,277 | 2,244 |
| Пропускная способность | 0,455 | 0,449 |
| Обработано игровых лет | 2 000 000 | 2 000 000 |
| Поколения, среднее на цикл | 168,294 мс | 171,039 мс |
| Обработка партий новорождённых, среднее на цикл | 7,768 мс | 6,199 мс |
| Вызовы обработки партий новорождённых | 16 147 | 13 885 |
Общего ускорения на этой выборке нет: среднее выросло примерно на 1,5%.
Обработка новорождённых занимает на 20% меньше времени, но это небольшая
доля полного цикла. Замер включает существующие постепенные партии;
он не доказывает ускорения вселенной, целиком созданной по новой схеме.
Цель пяти полных циклов в секунду остаётся недостигнутой.
Проверки: границы партий — 109, звёздные правила — 333, короткие события —
841, укрупнённые поколения — 28, кадровое выполнение — 35; все без ошибок.
Тестируются точные большие количества, целый однократный переход,
распределённые рождения, сохранения и интеграл производства.
## Первоначальный замер больших сохранений до исправления сетки — 2026-10-07
Созданы `large_star_cohorts_legacy.adventure.json` и
`large_star_cohorts_cycle.adventure.json`: по 6×10^60 звёзд каждого из 15
типов (главная последовательность и красные гиганты), остальные объекты,
жизнь и цивилизации взяты из диагностического сценария. Возраст — 10^12 лет.
Для каждого типа заново сформирована одинаковая история рождения длиной
`min(эффективный срок жизни, 2 млн лет)` перед началом завершения жизни.
Исходные физические количества и этические профили совпадают строго.
Сохранения валидируются и проходят точное сравнение состояния после записи
и чтения JSON с полной точностью float. Сохранение игрока не изменялось.
Старая схема измеряется переключателем `batches.cycle_stars = false`, новая
включена по умолчанию. В обоих вариантах одинаковый остальной код симуляции,
скорость 6, шаг 0,2 с и CPU-профиль. Два прогона по 50 полных циклов на модель,
порядок запусков: старая → новая → новая → старая. Перед каждым прогоном
восстанавливается исходное состояние; каждый обрабатывает 1 млн игровых лет.
| Метрика | Старая схема | Новая схема |
|---|---:|---:|
| Среднее первого прогона | 417,265 мс | 423,419 мс |
| Среднее второго прогона | 431,081 мс | 427,011 мс |
| Среднее всех 100 циклов на модель | 424,173 мс | 425,215 мс |
| Полных циклов в секунду | 2,358 | 2,352 |
| Пропускная способность | 0,472 | 0,470 |
| Звёздных партий в исходном сохранении | 118 | 1 300 |
| Пиковое число звёздных партий | 132 | 1 300 |
| Поколения, среднее на цикл | 157,711 мс | 147,906 мс |
| Производство, среднее на цикл | 28,692 мс | 34,704 мс |
| Применение потоков цивилизаций, среднее на цикл | 58,642 мс | 62,160 мс |
| Изъятие партий, вложенное в поколения | 37,015 мс | 41,379 мс |
| Партии новорождённых, вложенное в поколения | 7,648 мс | 4,248 мс |
**Устойчивого выигрыша полного цикла не обнаружено.** Разница средних —
около +0,25% у новой схемы; в первом парном сравнении она медленнее, во втором
быстрее. Поколения занимают примерно на 6,2% меньше времени, но производство
стало дороже примерно на 21%. Пять полных циклов в секунду не достигнуты.
Причина роста числа партий: для долгоживущих звёзд сетка одного цикла
значительно мельче `lifespan / 40`. Например, у RD прежняя ширина — 1 млрд
лет, новая на скорости 6 — 20 тыс. лет. Поэтому изменение не всегда
укрупняет партии: на таком наборе исходных рождений их стало в 11 раз больше.
Итоговое временное распределение переходов у моделей различается; совпадение
их конечных состояний не является условием этого замера.
Для дальнейшего упрощения следует сохранять широкие группы долгоживущих
звёзд и применять целый переход только к партиям, уже укладывающимся в один
цикл. Это предложение в данном замере не реализовано.
```sh
godot --headless --path . --script res://tests/benchmark_large_star_cohorts.gd -- cycles=50 repeats=2
```
Полные результаты первоначального замера: `large_star_cohorts_before_dynamic_fix_results.json`.
Набор с 1300 партиями сохранён в `large_star_cohorts_before_dynamic_fix_cycle.adventure.json`.
Последующие файлы без этого суффикса относятся к исправленной динамической схеме.
## Исправленное динамическое укрупнение без дробления — 2026-10-07
Ошибка первоначальной реализации устранена: циклическая сетка больше не
заменяет широкие возрастные окна долгоживущих звёзд. При создании новая сетка
используется только если прежнее окно не шире цикла. Иначе используется
прежнее широкое окно. Из существующих партий объединяются две или более
одного типа, чей оставшийся интервал завершения целиком лежит в общем цикле.
Партии, пересекающие границу циклов или занимающие несколько циклов, не делятся.
Повторён парный замер на отдельных больших сохранениях, с теми же исходными
количествами и входными интервалами рождения: скорость 6, шаг 0,2 с,
два прогона по 50 циклов на модель в порядке старая → новая → новая → старая.
Каждый прогон обрабатывает 1 млн игровых лет; состояния валидируются до и
после, записанные файлы проходят точное сравнение после чтения.
| Метрика | Старая схема | Исправленная динамическая |
|---|---:|---:|
| Исходных звёздных партий | 118 | 113 |
| Пиковое число партий | 132 | 127 |
| Число партий после 50 циклов | 130 | 125 |
| Среднее первого прогона | 420,388 мс | 424,307 мс |
| Среднее второго прогона | 431,605 мс | 428,498 мс |
| Среднее всех 100 циклов на модель | 425,996 мс | 426,402 мс |
| Полных циклов в секунду | 2,347 | 2,345 |
| Поколения, среднее на цикл | 158,622 мс | 157,606 мс |
| Партии новорождённых, вложенный интервал | 7,679 мс | 6,693 мс |
На этом наборе партиям стало меньше примерно на 4,2%, вместо прежнего
ошибочного роста до 1300. Проверено, что долгая группа RD остаётся одной
широкой партией и её окно не меняется при добавлении новых звёзд.
Новый тест запрещает рост числа исходных партий в диагностическом сценарии.
Устойчивого ускорения полного цикла по этим прогонам нет: разница средних
около +0,10%; знак разницы в отдельных парных сравнениях меняется.
Обработка партий новорождённых занимает примерно на 13% меньше времени,
но её доля недостаточна для заметного выигрыша всего расчёта.
Цель пяти циклов в секунду по-прежнему не достигнута.
Проверки: границы партий — 117, звёздные правила — 333, короткие события —
841, кадровое выполнение — 35; все без ошибок. Дополнительные проверки
охватывают сохранение широких окон, объединение старых партий с точными
количествами и остатками, соседние циклы и повторное укрупнение.
Актуальные сохранения: `large_star_cohorts_legacy.adventure.json` и
`large_star_cohorts_cycle.adventure.json`; результаты: `large_star_cohorts_results.json`.
## Новая вселенная с множеством объектов и мелких звёздных партий — 2026-10-07
Создано отдельное состояние с нуля по текущим таблицам: 150 типов объектов,
все 44 стадии этических цивилизаций (включая Ct), 15 типов живых звёзд.
Запасы большинства объектов — 10^60 каждого типа; планет и цивилизаций —
10^28. Жизнь размещена у четырёх типов карликов, четверть звёзд каждого типа
связана со структурами. Этические профили различаются между стадиями.
Высокий запас пространства сохраняет жизнь при бластах. Интерфейс не отрисовывался.
Для проверки укрупнения заданы валидные синтетические исторические партии:
40 последовательных циклов завершения × 8 узких партий × 15 типов звёзд.
Все восемь партий типа целиком завершаются в общем цикле; это целевой
стресс-сценарий большого числа партий, а не утверждение, что обычное создание
с неизменным временем жизни обязательно порождает такую фрагментацию.
Исходный состав и интервалы одинаковы для обеих моделей. Долгоживущие звёзды
не дробились алгоритмом: ему переданы уже существующие узкие партии.
До укрупнения — 4800 звёздных партий. Старая схема сохраняет 4560,
исправленная динамическая — 600. Созданы два отдельных диагностических файла,
проверены запись/чтение без изменения состояния и валидация до и после каждого
прогона. Сохранение игрока не затрагивалось.
Два прогона по 40 полных циклов на модель; порядок старая → новая → новая →
старая. Скорость 6, фиксированный шаг 0,2 с, CPU-профиль включён.
Каждый прогон восстанавливает исходное состояние и обрабатывает 800 тыс. лет.
| Метрика | Старая схема | Динамическое укрупнение |
|---|---:|---:|
| Исходных звёздных партий после укрупнения | 4 560 | 600 |
| Пиковое число партий | 4 560 | 607 |
| Среднее первого прогона | 612,606 мс | 530,285 мс |
| Среднее второго прогона | 624,625 мс | 532,578 мс |
| Среднее всех 80 циклов на модель | 618,616 мс | 531,431 мс |
| Полных циклов в секунду | 1,617 | 1,882 |
| Обработанных секунд симуляции / секунду расчёта | 0,323 | 0,376 |
| Поколения, среднее на цикл | 211,916 мс | 138,339 мс |
| Производство, среднее на цикл | 51,201 мс | 38,038 мс |
| Подготовка потоков цивилизаций | 113,371 мс | 113,270 мс |
| Применение потоков цивилизаций | 114,343 мс | 113,820 мс |
| Колонизация | 55,284 мс | 55,291 мс |
| Обработка партий новорождённых, вложенная в поколения | 29,464 мс | 2,967 мс |
**Выигрыш полного цикла подтверждён обоими парными сравнениями:** время
сократилось на 14,1%, ускорение около 1,16 раза. Поколения занимают на 34,7%
меньше времени. Механизм даёт эффект при множестве подходящих для объединения
партий; в предыдущем сценарии с небольшим числом широких партий эффект был
незаметен. Изменение моментов переходов допускается моделью: конечные состояния
двух схем не обязаны совпадать, но обе полностью обработали запрошенный интервал.
Пять циклов в секунду не достигнуты: для данного сценария требуется ещё
примерно 2,66-кратное ускорение. Главные оставшиеся затраты — поколения и
подготовка/применение цивилизационных потоков; колонизация также заметна.
Сохранения: `many_objects_fragmented_stars_legacy.adventure.json` и
`many_objects_fragmented_stars_cycle.adventure.json`.
Полные результаты: `many_objects_fragmented_stars_results.json`.
```sh
godot --headless --path . --script res://tests/benchmark_many_objects.gd -- cycles=40 repeats=2
```
## Консолидация применения потоков и колонизации — 2026-10-08
Первый этап: исходное население распределяется по строкам владельцев одной таблицы переходов. Свободные стадии применяют готовые целые квоты напрямую. При колонизации списания планет объединяются по владельцам; каждая стадия колоний получает одну суммарную выдачу. Общие целые количества и статистика сохранены. Изменён порядок распределения единичных остатков между владельцами; полного совпадения состояния с прежним порядком округления не заявляется. Ct остаётся свободной от привязок.
До и после загружались одни и те же диагностические файлы с теми же количествами и партиями. Скорость 6, полный интервал 0,2 секунды (20 000 игровых лет), CPU-профилирование включено, UI отсутствует. По два прогона из исходного состояния, каждый по 20 циклов: до → после → после → до. На каждую модель и сохранение обработано 800 000 игровых лет. Валидация начальных и конечных состояний прошла; SHA-256 входных файлов до и после совпали. Сохранение игрока не использовалось.
| Сохранение | До, мс | После, мс | Сокращение времени | Полных циклов/с после |
|---|---:|---:|---:|---:|
| Все объекты | 385,263 | 377,222 | 2,09% | 2,651 |
| Много объектов и партий | 506,888 | 443,303 | 12,54% | 2,256 |
Для тяжёлого сохранения:
| Участок | До, мс/цикл | После, мс/цикл |
|---|---:|---:|
| Применение переходов | 113,011 | 91,591 |
| Колонизация | 53,487 | 11,520 |
| Подготовка потоков | 114,808 | 114,742 |
| Поколения звёзд и жизни | 116,085 | 115,999 |
Первый этап сокращает полный тяжёлый цикл на 12.54%, но цель пяти циклов в секунду не достигнута. До 200 мс нужно ещё примерно 2.22-кратное ускорение. Следующие крупные затраты — подготовка цивилизационных потоков, поколения и оставшееся применение переходов.
Проверки: целочисленные квоты и владельцы, включая 10^400 + 103 — 1068; цивилизационные потоки — 1895; состояние цивилизаций — 70; кадровый планировщик — 38. Всего 3071 проверка без ошибок. Проверены сохранение населения каждого владельца при планетных переходах, точные поступления по стадиям, замена планет колониями, статистика и Ct.
Полные профили, отдельные прогоны и контрольные суммы: `flow_commit_step1_results.json`. Базовая версия: `413f2be9044090c878c2909dd9d0646f77513a5f`.
Для замера текущей версии на тех же входных файлах:
```sh
godot --headless --path . --script res://tests/benchmark_civilization_flows.gd -- res://tests/artifacts/all_objects_speed6.adventure.json 0.2 profile cycles=20
godot --headless --path . --script res://tests/benchmark_civilization_flows.gd -- res://tests/artifacts/many_objects_fragmented_stars_cycle.adventure.json 0.2 profile cycles=20
```
## Повторное использование общих количеств — 2026-10-08
Второй этап: общий точный снимок передаётся между фазами цивилизационных потоков, колонизации и коррекции ёмкости. Переходы и выдачи обновляют только затронутые количества; перенос между владельцами сохраняет общую численность. Периоды стадий, дрейф и поклонение используют актуальные количества этого интервала. Автоматическое создание разных типов звёзд также использует общий снимок: успешная пробная операция вычитает расходы, отказ сохраняет исходный снимок. При внешних изменениях используется обычный пересчёт. Снимки не записываются в сохранения.
Сравнение с версией после первого этапа. На двух одинаковых диагностических сохранениях выполнены пары до → после → после → до: по 20 циклов на прогон, по 40 циклов на модель и сохранение. Скорость 6, интервал 0,2 секунды, CPU-профиль включён, UI отсутствует. Каждый прогон полностью обработал 400 000 игровых лет. Состояния валидны, входные SHA-256 не изменились.
| Сохранение | До, мс | После, мс | Сокращение | Полных циклов/с после |
|---|---:|---:|---:|---:|
| Все объекты | 377,185 | 367,326 | 2,61% | 2,722 |
| Много объектов и партий | 443,163 | 422,973 | 4,56% | 2,364 |
Тяжёлое сохранение:
| Метрика | До | После |
|---|---:|---:|
| Полных сборок общих количеств за цикл | 15 | 7 |
| Сборка общих количеств, мс/цикл | 37,498 | 17,767 |
| Производство, мс/цикл | 37,554 | 20,316 |
| Применение потоков, мс/цикл | 91,626 | 89,259 |
| Завершение потоков, мс/цикл | 9,821 | 6,881 |
Время сборки общих количеств вложено в остальные фазы и не прибавляется к ним повторно. Проверка цивилизационной части отдельно дала небольшой выигрыш; основную экономию обеспечивает исключение повторных сборок при автоматическом создании звёзд.
Полные состояния обеих версий совпали после 10 последовательных сравнений: по пять на каждое сохранение, интервалы 0,2 / 0,53 / 0,31 / 0,2 / 0,2 секунды. Дополнительные проверки сравнивают снимки с полным пересчётом, контролируют неизменность входных снимков, отказ производства и каскадную деградацию. Выполнено 4321 целевая проверка без ошибок; полная регрессия всех наборов не запускалась.
Пять полных циклов в секунду пока не достигнуты: тяжёлый цикл составляет 423.0 мс; до 200 мс нужно ещё около 2.11-кратного ускорения. Следующая крупная статья — подготовка потоков цивилизаций, около 115.2 мс/цикл.
Полные результаты и контрольные суммы: `physical_totals_step2_results.json`. Базовая версия: `9357f757a95db96274d4e115c7e498b58eca6902`. Сохранение игрока не использовалось.
## Упрощение расчёта наград потоков цивилизаций — 2026-10-08
Третий этап убирает промежуточное динамическое число при умножении точного целого населения на float-ставку награды. Частное и дробный остаток вычисляются напрямую, а дробный перенос сохраняет прежнее округление. Это применяется к наградам войны, урона и колонизации; размеры населения остаются точными целыми.
Сравнение с коммитом `c429403` (после второго этапа): те же два диагностических сохранения, скорость 6, интервал 0,2 секунды, CPU-профиль включён. Порядок пар — до → после → после → до; два прогона по 20 циклов на версию и сохранение. Каждый прогон обработал 400 000 игровых лет, валидация сохранений прошла, SHA-256 входов совпали. Сохранение игрока не использовалось.
| Сохранение | До, мс | После, мс | Сокращение времени | Полных циклов/с после |
|---|---:|---:|---:|---:|
| Все объекты | 380,579 | 357,026 | 6,19% | 2,801 |
| Много объектов и партий | 432,912 | 409,268 | 5,46% | 2,443 |
Подготовка потоков уменьшилась с 111,980 до 87,832 мс на сохранении со всеми объектами и со 117,004 до 92,100 мс на тяжёлом сохранении — примерно на 21% в обоих случаях. Остальные основные участки остались в пределах погрешности замера.
Полные состояния до и после совпали после пяти последовательных интервалов на каждом сохранении (включая дробные интервалы). Тест оптимизаций прошёл: 1889 проверок без ошибок. Цель пяти полных циклов в секунду ещё не достигнута: тяжёлому циклу требуется ускорение примерно в 2,05 раза, чтобы уложиться в 200 мс.
Полные профили и SHA-256 входов: `civilization_flow_prepare_step3_results.json`.
## Проверка оптимизации частичного изъятия партий — 2026-10-08
Перенос связанного содержимого уже агрегируется по типам внутри поколения. Проверен вариант частичного изъятия, исключающий промежуточное сложение квоты с дробным переносом и последующее вычитание целой части. Возрастные интервалы и порядок поколений сохранялись.
Парный замер на тех же сохранениях: скорость 6, интервал 0,2 секунды, CPU-профиль, без UI; до → после → после → до, по 20 циклов на прогон (40 циклов на версию и сохранение).
| Сохранение | До, мс/цикл | После, мс/цикл |
|---|---:|---:|
| Все объекты | 350,516 | 349,835 |
| Много объектов и партий | 404,255 | 404,390 |
Изъятие партий на тяжёлом сохранении: 40,919 → 40,837 мс/цикл. Изменения полного цикла меньше 0,2%; подтверждённого выигрыша нет. Вариант **откачен**, код симуляции оставлен прежним. Полные состояния совпали в 10 последовательных сравнениях; границы партий — 117 проверок без ошибок. Входные файлы не изменены.
Результаты отклонённого варианта: `batch_withdrawal_step4_results.json`. Этот замер не доказывает достижение пяти полных циклов в секунду.
## Адаптивное упрощение симуляции — 2026-10-08
Добавлен runtime-контроллер качества, который измеряет сглаженное CPU-время полного цикла. Он повышает уровень упрощения при превышении бюджета 200 мс и снимает его после 30 циклов с запасом. Режим не сохраняется в файл: после загрузки точность постепенно подстраивается заново.
При нагрузке цивилизационный поток заменяется приближением не более чем с одним переходом на стадию за интервал. На наиболее грубом уровне типы возрастных партий делятся на две чередующиеся группы: каждая обрабатывается раз в два цикла. Временные группы при этом расширяются. Это сохраняет количества, но сдвигает сроки отдельных переходов и исключает несколько последовательных переходов цивилизации за один интервал.
Проверены два синтетических сохранения на Apple M4 Pro, Godot 4.7.2, headless, с CPU-профилем и интервалом 0,2 секунды. Каждый замер — 60 последовательных полных циклов; каждый запуск начинается в точном режиме и адаптируется по ходу серии.
| Скорость | Все объекты, мс/цикл (циклов/с) | Много объектов и партий, мс/цикл (циклов/с) |
|---:|---:|---:|
| 1 | 165,0 (6,06) | 128,5 (7,78) |
| 2 | 181,4 (5,51) | 131,8 (7,59) |
| 3 | 175,2 (5,71) | 145,0 (6,90) |
| 4 | 159,7 (6,26) | 177,1 (5,65) |
| 5 | 174,9 (5,72) | 185,6 (5,39) |
| 6 | 190,6 (5,25) | 184,4 (5,42) |
Среднее время на всех прогонах ниже 200 мс. Отдельные циклы всё ещё бывают длиннее: максимумы составили 203–367 мс на скоростях 3–6, включая первые циклы до срабатывания адаптации. Значит, замеры подтверждают требуемую среднюю пропускную способность на этом компьютере, но не гарантируют отсутствие кратковременных задержек. Android и работа с UI отдельно не проверялись.
Проверки: адаптивное качество — 18, хронология поколений — 28, границы партий — 117, оптимизации симуляции — 1889, планировщик кадров — 39; ошибок нет. Все 12 конечных диагностических состояний прошли валидацию. Хеши входных файлов: `44bee3b3753fa51615f766d8f800a10cc2b70c8e7fb4ea12b6e18da7f07a7d67` и `1e95ef398923f26b912a305c84f9b3eb502d24cb14e8ae687a4becccf047324a`.
Детали уровней, минимумы/максимумы и воспроизводимые результаты: `adaptive_quality_results.json`. Штатный benchmark принимает параметр `speed=1..6`.
## Адаптивная частота циклов 5 → 4 → 3 — 2026-10-17
Частота запуска полного цикла теперь снижается при устойчивой нагрузке: пороги шага — 0,2, 0,25 и 0,333 секунды. EMA времени расчёта переключает частоту вниз, когда цикл занимает больше 90% текущего интервала; возврат на одну ступень происходит после 30 циклов быстрее 65% интервала. Уровень частоты временный и после загрузки начинается с 5 Гц. Игровые часы продолжают накапливать весь прошедший интервал. Временное объединение партий масштабируется с выбранным интервалом, при этом при 5 Гц прежняя точность остаётся прежней.
Проверка сцены на диагностическом сохранении `all_objects_speed6.adventure.json`, скорость 6, Godot 4.7.2, Mac16,8. Сравнивались фиксированные 5 Гц и адаптивные 5/4/3 Гц, два прогона каждого режима в чередующемся порядке, по 10 секунд реального времени. Последняя транзакция каждого прогона завершалась до снятия результата.
| Метрика | Фиксированные 5 Гц | Адаптивно, установилось 3 Гц | Изменение |
|---|---:|---:|---:|
| Завершённые циклы/с | 4,64 | 2,96 | −36% |
| Средний FPS сцены | 22,60 | 64,35 | ×2,85 |
| p95 времени кадра | 115,6 мс | 66,5 мс | −42% |
| Средний максимум кадра | 227 мс | 205 мс | −10% |
| Опубликованные игровые годы/с | 99 017 | 98 049 | −1,0% |
На этих замерах реальное игровое время почти не замедлилось: симуляция завершала около трёх более крупных циклов вместо примерно 4,6 меньших. Средний FPS заметно вырос, но отдельные кадры всё ещё превышали 200 мс; это не гарантия отсутствия коротких задержек. UI-замер выполнен в headless-сцене на компьютере, поэтому его FPS не переносится напрямую на телефон.
Отдельно прогнан синхронный benchmark полного CPU-цикла на тех же двух тяжёлых сохранениях (скорость 6, 30 циклов × 2 повтора). При фиксированном шаге 0,2 секунды и адаптивном шаге итоговая обработка игрового времени за CPU-секунду выросла с 1,099 до 1,656 на сохранении со всеми объектами (+50,7%) и с 1,036 до 1,697 на сохранении со множеством объектов и партий (+63,9%). В каждом адаптивном прогоне частоты установились на 3 Гц; интервалы игровых часов сверены с запрошенными, все конечные состояния прошли проверку сохранения. Синхронный показатель показывает пропускную способность расчёта, а UI-прогон — фактический темп транзакций сцены.
Повторяемые результаты: `dynamic_cadence_results.json` (CPU-прогоны) и `dynamic_cadence_ui_results.json` (сцена и UI). Запуски выполняются скриптами `benchmark_dynamic_cadence.gd` и `benchmark_dynamic_cadence_ui.gd`; исходные диагностические сохранения не изменялись.
@@ -0,0 +1,646 @@
{
"retained": false,
"conclusion": "No measurable full-cycle improvement; implementation reverted",
"delta_seconds": 0.2,
"exact_state_differential": true,
"input_sha256": {
"all_objects_speed6": "44bee3b3753fa51615f766d8f800a10cc2b70c8e7fb4ea12b6e18da7f07a7d67",
"many_objects_fragmented_stars_cycle": "1e95ef398923f26b912a305c84f9b3eb502d24cb14e8ae687a4becccf047324a"
},
"order": "before-after-after-before",
"runs": [
{
"cycles": 20,
"max_ms": 382.054,
"mean_ms": 347.474,
"min_ms": 291.952,
"model": "before",
"profile": {
"assign_homes": [
23851,
80
],
"civilization_flow_capacity": [
121403,
20
],
"civilization_flow_colonies": [
52415,
20
],
"civilization_flow_finish": [
135271,
20
],
"civilization_flow_ledger": [
880672,
20
],
"civilization_flow_plan": [
1718363,
20
],
"civilization_operator_build": [
61955,
20
],
"civilization_operator_solve": [
673740,
860
],
"enforce_capacity": [
316094,
80
],
"generation_products": [
190666,
40
],
"generation_withdrawal": [
545822,
60
],
"generations": [
2727124,
20
],
"initialize": [
113986,
20
],
"newborn_batches": [
121039,
3016
],
"physical_amounts_build": [
285729,
200
],
"production": [
373910,
20
],
"trends": [
358046,
20
]
},
"run": 1,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 382.156,
"mean_ms": 349.53305,
"min_ms": 297.266,
"model": "after",
"profile": {
"assign_homes": [
23877,
80
],
"civilization_flow_capacity": [
121854,
20
],
"civilization_flow_colonies": [
53021,
20
],
"civilization_flow_finish": [
137725,
20
],
"civilization_flow_ledger": [
883114,
20
],
"civilization_flow_plan": [
1733356,
20
],
"civilization_operator_build": [
62368,
20
],
"civilization_operator_solve": [
680005,
860
],
"enforce_capacity": [
319290,
80
],
"generation_products": [
192497,
40
],
"generation_withdrawal": [
548252,
60
],
"generations": [
2737148,
20
],
"initialize": [
115930,
20
],
"newborn_batches": [
121459,
3016
],
"physical_amounts_build": [
287621,
200
],
"production": [
376359,
20
],
"trends": [
359971,
20
]
},
"run": 1,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 387.438,
"mean_ms": 350.1367,
"min_ms": 298.254,
"model": "after",
"profile": {
"assign_homes": [
24181,
80
],
"civilization_flow_capacity": [
122008,
20
],
"civilization_flow_colonies": [
53315,
20
],
"civilization_flow_finish": [
137169,
20
],
"civilization_flow_ledger": [
885851,
20
],
"civilization_flow_plan": [
1736978,
20
],
"civilization_operator_build": [
62264,
20
],
"civilization_operator_solve": [
680485,
860
],
"enforce_capacity": [
319558,
80
],
"generation_products": [
193735,
40
],
"generation_withdrawal": [
547473,
60
],
"generations": [
2743162,
20
],
"initialize": [
115720,
20
],
"newborn_batches": [
121401,
3016
],
"physical_amounts_build": [
287832,
200
],
"production": [
376295,
20
],
"trends": [
360758,
20
]
},
"run": 2,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 391.136,
"mean_ms": 353.55755,
"min_ms": 295.752,
"model": "before",
"profile": {
"assign_homes": [
23999,
80
],
"civilization_flow_capacity": [
125136,
20
],
"civilization_flow_colonies": [
53681,
20
],
"civilization_flow_finish": [
137614,
20
],
"civilization_flow_ledger": [
893234,
20
],
"civilization_flow_plan": [
1749507,
20
],
"civilization_operator_build": [
63052,
20
],
"civilization_operator_solve": [
683642,
860
],
"enforce_capacity": [
319168,
80
],
"generation_products": [
193901,
40
],
"generation_withdrawal": [
550377,
60
],
"generations": [
2768999,
20
],
"initialize": [
115976,
20
],
"newborn_batches": [
122734,
3016
],
"physical_amounts_build": [
292064,
200
],
"production": [
382112,
20
],
"trends": [
363057,
20
]
},
"run": 2,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 418.952,
"mean_ms": 402.88125,
"min_ms": 362.784,
"model": "before",
"profile": {
"assign_homes": [
18182,
60
],
"civilization_flow_capacity": [
138911,
20
],
"civilization_flow_colonies": [
235353,
20
],
"civilization_flow_finish": [
139454,
20
],
"civilization_flow_ledger": [
1808094,
20
],
"civilization_flow_plan": [
1823967,
20
],
"civilization_operator_build": [
63710,
20
],
"civilization_operator_solve": [
684725,
860
],
"enforce_capacity": [
241433,
60
],
"generation_products": [
79394,
20
],
"generation_withdrawal": [
814774,
40
],
"generations": [
2390414,
20
],
"initialize": [
142892,
20
],
"newborn_batches": [
55241,
1490
],
"physical_amounts_build": [
359891,
140
],
"production": [
410388,
20
],
"trends": [
362721,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle"
},
{
"cycles": 20,
"max_ms": 425.202,
"mean_ms": 404.3497,
"min_ms": 355.885,
"model": "after",
"profile": {
"assign_homes": [
18056,
60
],
"civilization_flow_capacity": [
139522,
20
],
"civilization_flow_colonies": [
236599,
20
],
"civilization_flow_finish": [
140701,
20
],
"civilization_flow_ledger": [
1809113,
20
],
"civilization_flow_plan": [
1824567,
20
],
"civilization_operator_build": [
63452,
20
],
"civilization_operator_solve": [
684152,
860
],
"enforce_capacity": [
242790,
60
],
"generation_products": [
80500,
20
],
"generation_withdrawal": [
817704,
40
],
"generations": [
2406807,
20
],
"initialize": [
143427,
20
],
"newborn_batches": [
55885,
1490
],
"physical_amounts_build": [
363175,
140
],
"production": [
412428,
20
],
"trends": [
365215,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle"
},
{
"cycles": 20,
"max_ms": 418.858,
"mean_ms": 404.4306,
"min_ms": 357.106,
"model": "after",
"profile": {
"assign_homes": [
18133,
60
],
"civilization_flow_capacity": [
139021,
20
],
"civilization_flow_colonies": [
237100,
20
],
"civilization_flow_finish": [
139480,
20
],
"civilization_flow_ledger": [
1815717,
20
],
"civilization_flow_plan": [
1825515,
20
],
"civilization_operator_build": [
63298,
20
],
"civilization_operator_solve": [
685950,
860
],
"enforce_capacity": [
242932,
60
],
"generation_products": [
79477,
20
],
"generation_withdrawal": [
815781,
40
],
"generations": [
2400821,
20
],
"initialize": [
144101,
20
],
"newborn_batches": [
56140,
1490
],
"physical_amounts_build": [
362394,
140
],
"production": [
412986,
20
],
"trends": [
364511,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle"
},
{
"cycles": 20,
"max_ms": 422.492,
"mean_ms": 405.6284,
"min_ms": 355.699,
"model": "before",
"profile": {
"assign_homes": [
18208,
60
],
"civilization_flow_capacity": [
139305,
20
],
"civilization_flow_colonies": [
236973,
20
],
"civilization_flow_finish": [
141048,
20
],
"civilization_flow_ledger": [
1818465,
20
],
"civilization_flow_plan": [
1832211,
20
],
"civilization_operator_build": [
63519,
20
],
"civilization_operator_solve": [
688184,
860
],
"enforce_capacity": [
243601,
60
],
"generation_products": [
79839,
20
],
"generation_withdrawal": [
822003,
40
],
"generations": [
2410757,
20
],
"initialize": [
144424,
20
],
"newborn_batches": [
55500,
1490
],
"physical_amounts_build": [
363454,
140
],
"production": [
412711,
20
],
"trends": [
367008,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle"
}
],
"speed": 6
}
@@ -0,0 +1,645 @@
{
"reference_commit": "c429403",
"delta_seconds": 0.2,
"exact_state_differential": true,
"input_sha256": {
"all_objects_speed6": "44bee3b3753fa51615f766d8f800a10cc2b70c8e7fb4ea12b6e18da7f07a7d67",
"many_objects_fragmented_stars_cycle": "1e95ef398923f26b912a305c84f9b3eb502d24cb14e8ae687a4becccf047324a"
},
"order": "before-after-after-before",
"runs": [
{
"cycles": 20,
"max_ms": 417.124,
"mean_ms": 381.20745,
"min_ms": 328.622,
"model": "before",
"profile": {
"assign_homes": [
24482,
80
],
"civilization_flow_capacity": [
127513,
20
],
"civilization_flow_colonies": [
54148,
20
],
"civilization_flow_finish": [
140918,
20
],
"civilization_flow_ledger": [
905665,
20
],
"civilization_flow_plan": [
2240897,
20
],
"civilization_operator_build": [
63936,
20
],
"civilization_operator_solve": [
685115,
860
],
"enforce_capacity": [
323853,
80
],
"generation_products": [
195550,
40
],
"generation_withdrawal": [
565054,
60
],
"generations": [
2802836,
20
],
"initialize": [
117049,
20
],
"newborn_batches": [
123941,
3016
],
"physical_amounts_build": [
294599,
200
],
"production": [
385593,
20
],
"trends": [
363466,
20
]
},
"run": 1,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 390.389,
"mean_ms": 357.03875,
"min_ms": 302.117,
"model": "after",
"profile": {
"assign_homes": [
24490,
80
],
"civilization_flow_capacity": [
125647,
20
],
"civilization_flow_colonies": [
54325,
20
],
"civilization_flow_finish": [
141339,
20
],
"civilization_flow_ledger": [
902399,
20
],
"civilization_flow_plan": [
1755403,
20
],
"civilization_operator_build": [
63055,
20
],
"civilization_operator_solve": [
683933,
860
],
"enforce_capacity": [
324284,
80
],
"generation_products": [
197296,
40
],
"generation_withdrawal": [
562515,
60
],
"generations": [
2804447,
20
],
"initialize": [
117904,
20
],
"newborn_batches": [
123892,
3016
],
"physical_amounts_build": [
296839,
200
],
"production": [
389361,
20
],
"trends": [
364246,
20
]
},
"run": 1,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 390.735,
"mean_ms": 357.0124,
"min_ms": 304.896,
"model": "after",
"profile": {
"assign_homes": [
24460,
80
],
"civilization_flow_capacity": [
125447,
20
],
"civilization_flow_colonies": [
54216,
20
],
"civilization_flow_finish": [
139778,
20
],
"civilization_flow_ledger": [
906760,
20
],
"civilization_flow_plan": [
1757858,
20
],
"civilization_operator_build": [
63411,
20
],
"civilization_operator_solve": [
687170,
860
],
"enforce_capacity": [
325360,
80
],
"generation_products": [
196450,
40
],
"generation_withdrawal": [
558924,
60
],
"generations": [
2799057,
20
],
"initialize": [
117825,
20
],
"newborn_batches": [
123788,
3016
],
"physical_amounts_build": [
295498,
200
],
"production": [
385114,
20
],
"trends": [
367268,
20
]
},
"run": 2,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 410.865,
"mean_ms": 379.9508,
"min_ms": 328.074,
"model": "before",
"profile": {
"assign_homes": [
24504,
80
],
"civilization_flow_capacity": [
125523,
20
],
"civilization_flow_colonies": [
54072,
20
],
"civilization_flow_finish": [
138884,
20
],
"civilization_flow_ledger": [
900719,
20
],
"civilization_flow_plan": [
2238292,
20
],
"civilization_operator_build": [
63477,
20
],
"civilization_operator_solve": [
687863,
860
],
"enforce_capacity": [
323929,
80
],
"generation_products": [
196146,
40
],
"generation_withdrawal": [
557728,
60
],
"generations": [
2793469,
20
],
"initialize": [
117168,
20
],
"newborn_batches": [
123830,
3016
],
"physical_amounts_build": [
294159,
200
],
"production": [
382811,
20
],
"trends": [
366676,
20
]
},
"run": 2,
"save": "all_objects_speed6"
},
{
"cycles": 20,
"max_ms": 454.17,
"mean_ms": 431.32255,
"min_ms": 380.165,
"model": "before",
"profile": {
"assign_homes": [
18277,
60
],
"civilization_flow_capacity": [
138886,
20
],
"civilization_flow_colonies": [
239194,
20
],
"civilization_flow_finish": [
140538,
20
],
"civilization_flow_ledger": [
1823769,
20
],
"civilization_flow_plan": [
2332907,
20
],
"civilization_operator_build": [
63920,
20
],
"civilization_operator_solve": [
689691,
860
],
"enforce_capacity": [
244580,
60
],
"generation_products": [
80081,
20
],
"generation_withdrawal": [
823351,
40
],
"generations": [
2417052,
20
],
"initialize": [
145160,
20
],
"newborn_batches": [
55841,
1490
],
"physical_amounts_build": [
364671,
140
],
"production": [
414028,
20
],
"trends": [
365376,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle"
},
{
"cycles": 20,
"max_ms": 437.315,
"mean_ms": 409.44945,
"min_ms": 360.224,
"model": "after",
"profile": {
"assign_homes": [
18338,
60
],
"civilization_flow_capacity": [
139951,
20
],
"civilization_flow_colonies": [
238906,
20
],
"civilization_flow_finish": [
141435,
20
],
"civilization_flow_ledger": [
1834486,
20
],
"civilization_flow_plan": [
1841420,
20
],
"civilization_operator_build": [
64315,
20
],
"civilization_operator_solve": [
691338,
860
],
"enforce_capacity": [
245861,
60
],
"generation_products": [
79738,
20
],
"generation_withdrawal": [
825947,
40
],
"generations": [
2423500,
20
],
"initialize": [
145491,
20
],
"newborn_batches": [
56085,
1490
],
"physical_amounts_build": [
371874,
140
],
"production": [
441338,
20
],
"trends": [
366919,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle"
},
{
"cycles": 20,
"max_ms": 424.959,
"mean_ms": 409.08685,
"min_ms": 359.281,
"model": "after",
"profile": {
"assign_homes": [
18404,
60
],
"civilization_flow_capacity": [
140108,
20
],
"civilization_flow_colonies": [
239591,
20
],
"civilization_flow_finish": [
141361,
20
],
"civilization_flow_ledger": [
1836691,
20
],
"civilization_flow_plan": [
1842577,
20
],
"civilization_operator_build": [
64001,
20
],
"civilization_operator_solve": [
692117,
860
],
"enforce_capacity": [
245631,
60
],
"generation_products": [
80486,
20
],
"generation_withdrawal": [
829783,
40
],
"generations": [
2438245,
20
],
"initialize": [
145228,
20
],
"newborn_batches": [
56248,
1490
],
"physical_amounts_build": [
369443,
140
],
"production": [
416359,
20
],
"trends": [
367683,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle"
},
{
"cycles": 20,
"max_ms": 452.639,
"mean_ms": 434.50095,
"min_ms": 387.05,
"model": "before",
"profile": {
"assign_homes": [
18271,
60
],
"civilization_flow_capacity": [
140778,
20
],
"civilization_flow_colonies": [
239800,
20
],
"civilization_flow_finish": [
141233,
20
],
"civilization_flow_ledger": [
1836252,
20
],
"civilization_flow_plan": [
2347237,
20
],
"civilization_operator_build": [
64454,
20
],
"civilization_operator_solve": [
693176,
860
],
"enforce_capacity": [
244735,
60
],
"generation_products": [
80563,
20
],
"generation_withdrawal": [
830888,
40
],
"generations": [
2436028,
20
],
"initialize": [
145261,
20
],
"newborn_batches": [
56321,
1490
],
"physical_amounts_build": [
369324,
140
],
"production": [
417541,
20
],
"trends": [
369444,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle"
}
],
"speed": 6
}
@@ -0,0 +1,172 @@
{
"cycles_per_run": 30,
"godot": {
"build": "official",
"hash": "ed1daf0bf001b61586d9930840f2f1394092c079",
"hex": 263938,
"major": 4,
"minor": 7,
"patch": 2,
"status": "stable",
"string": "4.7.2-stable (official)",
"timestamp": 0
},
"input_saves_unchanged": true,
"machine": "Mac16,8",
"repeats": 2,
"results": [
{
"applied_game_years": "600000",
"cadence_steps": {
"0.2": 30
},
"cpu_cycles_per_second": 5.5818824005294605,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 5.0,
"max_ms": 351.156,
"mean_ms_per_cycle": 179.15103333333334,
"mode": "fixed_5",
"p95_ms": 188.985,
"repeat": 0,
"requested_simulation_seconds": 6.000000000000003,
"save": "all_objects_speed6.adventure.json",
"simulated_seconds_per_cpu_second": 1.1163764801058926
},
{
"applied_game_years": "978333",
"cadence_steps": {
"0.2": 1,
"0.25": 1,
"0.33333333333333": 28
},
"cpu_cycles_per_second": 5.126867760649103,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 3.0,
"max_ms": 349.806,
"mean_ms_per_cycle": 195.05086666666668,
"mode": "adaptive_5_4_3",
"p95_ms": 214.441,
"repeat": 0,
"requested_simulation_seconds": 9.783333333333333,
"save": "all_objects_speed6.adventure.json",
"simulated_seconds_per_cpu_second": 1.671928541945013
},
{
"applied_game_years": "978333",
"cadence_steps": {
"0.2": 1,
"0.25": 1,
"0.33333333333333": 28
},
"cpu_cycles_per_second": 5.029407785556781,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 3.0,
"max_ms": 340.747,
"mean_ms_per_cycle": 198.83056666666667,
"mode": "adaptive_5_4_3",
"p95_ms": 233.775,
"repeat": 1,
"requested_simulation_seconds": 9.783333333333333,
"save": "all_objects_speed6.adventure.json",
"simulated_seconds_per_cpu_second": 1.6401457611787948
},
{
"applied_game_years": "600000",
"cadence_steps": {
"0.2": 30
},
"cpu_cycles_per_second": 5.403485464263869,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 5.0,
"max_ms": 351.698,
"mean_ms_per_cycle": 185.06573333333333,
"mode": "fixed_5",
"p95_ms": 195.396,
"repeat": 1,
"requested_simulation_seconds": 6.000000000000003,
"save": "all_objects_speed6.adventure.json",
"simulated_seconds_per_cpu_second": 1.0806970928527742
},
{
"applied_game_years": "600000",
"cadence_steps": {
"0.2": 30
},
"cpu_cycles_per_second": 5.218331511555821,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 5.0,
"max_ms": 373.477,
"mean_ms_per_cycle": 191.63213333333334,
"mode": "fixed_5",
"p95_ms": 250.5,
"repeat": 0,
"requested_simulation_seconds": 6.000000000000003,
"save": "many_objects_fragmented_stars_cycle.adventure.json",
"simulated_seconds_per_cpu_second": 1.0436663023111648
},
{
"applied_game_years": "978333",
"cadence_steps": {
"0.2": 1,
"0.25": 1,
"0.33333333333333": 28
},
"cpu_cycles_per_second": 5.21296979935453,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 3.0,
"max_ms": 373.168,
"mean_ms_per_cycle": 191.82923333333332,
"mode": "adaptive_5_4_3",
"p95_ms": 258.047,
"repeat": 0,
"requested_simulation_seconds": 9.783333333333333,
"save": "many_objects_fragmented_stars_cycle.adventure.json",
"simulated_seconds_per_cpu_second": 1.7000073734561718
},
{
"applied_game_years": "978333",
"cadence_steps": {
"0.2": 1,
"0.25": 1,
"0.33333333333333": 28
},
"cpu_cycles_per_second": 5.195109254879333,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 3.0,
"max_ms": 372.878,
"mean_ms_per_cycle": 192.48873333333333,
"mode": "adaptive_5_4_3",
"p95_ms": 254.848,
"repeat": 1,
"requested_simulation_seconds": 9.783333333333333,
"save": "many_objects_fragmented_stars_cycle.adventure.json",
"simulated_seconds_per_cpu_second": 1.694182851452316
},
{
"applied_game_years": "600000",
"cadence_steps": {
"0.2": 30
},
"cpu_cycles_per_second": 5.137478056546851,
"cycles": 30,
"final_adaptive_quality": 3,
"final_cadence_hz": 5.0,
"max_ms": 375.784,
"mean_ms_per_cycle": 194.64803333333333,
"mode": "fixed_5",
"p95_ms": 255.446,
"repeat": 1,
"requested_simulation_seconds": 6.000000000000003,
"save": "many_objects_fragmented_stars_cycle.adventure.json",
"simulated_seconds_per_cpu_second": 1.0274956113093707
}
],
"speed": 6
}
@@ -0,0 +1,359 @@
{
"godot": {
"build": "official",
"hash": "ed1daf0bf001b61586d9930840f2f1394092c079",
"hex": 263938,
"major": 4,
"minor": 7,
"patch": 2,
"status": "stable",
"string": "4.7.2-stable (official)",
"timestamp": 0
},
"machine": "Mac16,8",
"results": [
{
"commits": 48,
"completed_cycles_per_second": 4.743091908967023,
"cpu_profile_usec_calls": {
"assign_homes": [
51095,
170
],
"civilization_flow_capacity": [
111005,
48
],
"civilization_flow_colonies": [
131724,
48
],
"civilization_flow_finish": [
325933,
48
],
"civilization_flow_ledger": [
928271,
48
],
"civilization_flow_plan": [
825706,
48
],
"civilization_operator_build": [
148485,
48
],
"civilization_operator_solve": [
104924,
2064
],
"enforce_capacity": [
626179,
170
],
"generation_products": [
235626,
74
],
"generation_withdrawal": [
455348,
97
],
"generations": [
3654469,
48
],
"initialize": [
215278,
48
],
"newborn_batches": [
237070,
3088
],
"physical_amounts_build": [
630353,
437
],
"production": [
1115470,
48
],
"trends": [
865132,
48
]
},
"elapsed_seconds": 10.119981,
"final_adaptive_quality": 3,
"final_cadence_hz": 5.0,
"frames": 246,
"mean_render_fps": 24.584772192104204,
"mode": "fixed_5",
"published_to_requested": 0.9943600000000001,
"published_years": "1006667",
"render_max_ms": 237.132,
"render_p95_ms": 111.449,
"requested_years": "1012372"
},
{
"commits": 21,
"completed_cycles_per_second": 2.085573876935847,
"cpu_profile_usec_calls": {
"assign_homes": [
30276,
75
],
"civilization_flow_capacity": [
51694,
21
],
"civilization_flow_colonies": [
52773,
21
],
"civilization_flow_finish": [
142952,
21
],
"civilization_flow_ledger": [
309711,
21
],
"civilization_flow_plan": [
435139,
21
],
"civilization_operator_build": [
74385,
21
],
"civilization_operator_solve": [
87284,
903
],
"enforce_capacity": [
414865,
75
],
"generation_products": [
105449,
33
],
"generation_withdrawal": [
152279,
43
],
"generations": [
1503309,
21
],
"initialize": [
255626,
21
],
"newborn_batches": [
114834,
1633
],
"physical_amounts_build": [
274341,
193
],
"production": [
685165,
21
],
"trends": [
377582,
21
]
},
"elapsed_seconds": 10.069171,
"final_adaptive_quality": 3,
"final_cadence_hz": 2.0,
"frames": 879,
"mean_render_fps": 87.80117977216634,
"mode": "adaptive_5_4_3_2",
"published_to_requested": 0.9889800000000001,
"published_years": "989844",
"render_max_ms": 203.26,
"render_p95_ms": 42.712,
"requested_years": "1000874"
},
{
"commits": 21,
"completed_cycles_per_second": 2.0775335521668676,
"cpu_profile_usec_calls": {
"assign_homes": [
31004,
76
],
"civilization_flow_capacity": [
51172,
21
],
"civilization_flow_colonies": [
52782,
21
],
"civilization_flow_finish": [
142851,
21
],
"civilization_flow_ledger": [
309607,
21
],
"civilization_flow_plan": [
431321,
21
],
"civilization_operator_build": [
74854,
21
],
"civilization_operator_solve": [
86348,
903
],
"enforce_capacity": [
423638,
76
],
"generation_products": [
105537,
34
],
"generation_withdrawal": [
151611,
43
],
"generations": [
1516916,
21
],
"initialize": [
261806,
21
],
"newborn_batches": [
112492,
1621
],
"physical_amounts_build": [
278871,
195
],
"production": [
696352,
21
],
"trends": [
377969,
21
]
},
"elapsed_seconds": 10.10814,
"final_adaptive_quality": 3,
"final_cadence_hz": 2.0,
"frames": 880,
"mean_render_fps": 88.00051040296032,
"mode": "adaptive_5_4_3_2",
"published_to_requested": 0.9933700000000001,
"published_years": "994002",
"render_max_ms": 201.104,
"render_p95_ms": 42.207,
"requested_years": "1000640"
},
{
"commits": 47,
"completed_cycles_per_second": 4.646829581875308,
"cpu_profile_usec_calls": {
"assign_homes": [
50139,
165
],
"civilization_flow_capacity": [
108674,
47
],
"civilization_flow_colonies": [
129977,
47
],
"civilization_flow_finish": [
323458,
47
],
"civilization_flow_ledger": [
911542,
47
],
"civilization_flow_plan": [
807459,
47
],
"civilization_operator_build": [
147856,
47
],
"civilization_operator_solve": [
96154,
2021
],
"enforce_capacity": [
619397,
165
],
"generation_products": [
234744,
71
],
"generation_withdrawal": [
451797,
95
],
"generations": [
3665554,
47
],
"initialize": [
217827,
47
],
"newborn_batches": [
265766,
3178
],
"physical_amounts_build": [
623211,
428
],
"production": [
1142731,
47
],
"trends": [
856364,
47
]
},
"elapsed_seconds": 10.114423,
"final_adaptive_quality": 3,
"final_cadence_hz": 5.0,
"frames": 239,
"mean_render_fps": 23.87480014844331,
"mode": "fixed_5",
"published_to_requested": 0.9904200000000001,
"published_years": "992039",
"render_max_ms": 201.438,
"render_p95_ms": 114.211,
"requested_years": "1001635"
}
],
"save": "all_objects_speed6.adventure.json",
"speed": 6,
"wall_seconds_per_run": 10.0
}
@@ -0,0 +1,763 @@
{
"delta_seconds": 0.2,
"input_sha256": {
"all_objects_speed6": "44bee3b3753fa51615f766d8f800a10cc2b70c8e7fb4ea12b6e18da7f07a7d67",
"many_objects_fragmented_stars_cycle": "1e95ef398923f26b912a305c84f9b3eb502d24cb14e8ae687a4becccf047324a"
},
"order": "before-after-after-before",
"profile_enabled": true,
"runs": [
{
"cycles": 20,
"max_ms": 407.447,
"mean_ms": 382.1863,
"min_ms": 338.878,
"model": "before",
"profile": {
"assign_homes": [
23607,
80
],
"civilization_flow_capacity": [
119827,
20
],
"civilization_flow_colonies": [
100257,
20
],
"civilization_flow_finish": [
167710,
20
],
"civilization_flow_ledger": [
1031564,
20
],
"civilization_flow_plan": [
2148765,
20
],
"civilization_operator_build": [
60291,
20
],
"civilization_operator_solve": [
665230,
860
],
"enforce_capacity": [
338749,
80
],
"generation_products": [
187536,
40
],
"generation_withdrawal": [
520136,
60
],
"generations": [
2614358,
20
],
"initialize": [
112213,
20
],
"newborn_batches": [
118460,
3016
],
"physical_amounts_build": [
478063,
360
],
"production": [
537724,
20
],
"trends": [
349106,
20
]
},
"run": 1,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 406.895,
"mean_ms": 376.23395,
"min_ms": 324.14,
"model": "after",
"profile": {
"assign_homes": [
23735,
80
],
"civilization_flow_capacity": [
120538,
20
],
"civilization_flow_colonies": [
50071,
20
],
"civilization_flow_finish": [
169132,
20
],
"civilization_flow_ledger": [
892018,
20
],
"civilization_flow_plan": [
2165803,
20
],
"civilization_operator_build": [
60679,
20
],
"civilization_operator_solve": [
670541,
860
],
"enforce_capacity": [
340289,
80
],
"generation_products": [
188663,
40
],
"generation_withdrawal": [
534195,
60
],
"generations": [
2649493,
20
],
"initialize": [
113482,
20
],
"newborn_batches": [
118902,
3016
],
"physical_amounts_build": [
489793,
360
],
"production": [
548119,
20
],
"trends": [
350991,
20
]
},
"run": 1,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 413.636,
"mean_ms": 378.2097,
"min_ms": 326.044,
"model": "after",
"profile": {
"assign_homes": [
23901,
80
],
"civilization_flow_capacity": [
121116,
20
],
"civilization_flow_colonies": [
50174,
20
],
"civilization_flow_finish": [
170232,
20
],
"civilization_flow_ledger": [
899208,
20
],
"civilization_flow_plan": [
2173515,
20
],
"civilization_operator_build": [
61133,
20
],
"civilization_operator_solve": [
672190,
860
],
"enforce_capacity": [
341889,
80
],
"generation_products": [
190021,
40
],
"generation_withdrawal": [
537089,
60
],
"generations": [
2668071,
20
],
"initialize": [
113520,
20
],
"newborn_batches": [
120186,
3016
],
"physical_amounts_build": [
491086,
360
],
"production": [
549548,
20
],
"trends": [
352056,
20
]
},
"run": 2,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 410.851,
"mean_ms": 388.3392,
"min_ms": 346.936,
"model": "before",
"profile": {
"assign_homes": [
23780,
80
],
"civilization_flow_capacity": [
121258,
20
],
"civilization_flow_colonies": [
101386,
20
],
"civilization_flow_finish": [
171098,
20
],
"civilization_flow_ledger": [
1048869,
20
],
"civilization_flow_plan": [
2182234,
20
],
"civilization_operator_build": [
61215,
20
],
"civilization_operator_solve": [
676192,
860
],
"enforce_capacity": [
343586,
80
],
"generation_products": [
191018,
40
],
"generation_withdrawal": [
528628,
60
],
"generations": [
2654320,
20
],
"initialize": [
113911,
20
],
"newborn_batches": [
120518,
3016
],
"physical_amounts_build": [
485368,
360
],
"production": [
550201,
20
],
"trends": [
354035,
20
]
},
"run": 2,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 540.275,
"mean_ms": 504.8664,
"min_ms": 445.592,
"model": "before",
"profile": {
"assign_homes": [
17920,
60
],
"civilization_flow_capacity": [
136151,
20
],
"civilization_flow_colonies": [
1064307,
20
],
"civilization_flow_finish": [
195983,
20
],
"civilization_flow_ledger": [
2251097,
20
],
"civilization_flow_plan": [
2284423,
20
],
"civilization_operator_build": [
62124,
20
],
"civilization_operator_solve": [
678656,
860
],
"enforce_capacity": [
288140,
60
],
"generation_products": [
77749,
20
],
"generation_withdrawal": [
795116,
40
],
"generations": [
2321187,
20
],
"initialize": [
140958,
20
],
"newborn_batches": [
54878,
1490
],
"physical_amounts_build": [
746203,
300
],
"production": [
744868,
20
],
"trends": [
355994,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 462.134,
"mean_ms": 441.9819,
"min_ms": 389.761,
"model": "after",
"profile": {
"assign_homes": [
17865,
60
],
"civilization_flow_capacity": [
137136,
20
],
"civilization_flow_colonies": [
229748,
20
],
"civilization_flow_finish": [
196611,
20
],
"civilization_flow_ledger": [
1828223,
20
],
"civilization_flow_plan": [
2286989,
20
],
"civilization_operator_build": [
62177,
20
],
"civilization_operator_solve": [
678566,
860
],
"enforce_capacity": [
288805,
60
],
"generation_products": [
78203,
20
],
"generation_withdrawal": [
805143,
40
],
"generations": [
2312257,
20
],
"initialize": [
141951,
20
],
"newborn_batches": [
55057,
1490
],
"physical_amounts_build": [
746690,
300
],
"production": [
749636,
20
],
"trends": [
355174,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 467.425,
"mean_ms": 444.6246,
"min_ms": 389.196,
"model": "after",
"profile": {
"assign_homes": [
18039,
60
],
"civilization_flow_capacity": [
137286,
20
],
"civilization_flow_colonies": [
231059,
20
],
"civilization_flow_finish": [
197868,
20
],
"civilization_flow_ledger": [
1835420,
20
],
"civilization_flow_plan": [
2302705,
20
],
"civilization_operator_build": [
62638,
20
],
"civilization_operator_solve": [
680863,
860
],
"enforce_capacity": [
289856,
60
],
"generation_products": [
78541,
20
],
"generation_withdrawal": [
808144,
40
],
"generations": [
2327718,
20
],
"initialize": [
142049,
20
],
"newborn_batches": [
55184,
1490
],
"physical_amounts_build": [
752516,
300
],
"production": [
752648,
20
],
"trends": [
358218,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 532.382,
"mean_ms": 508.9093,
"min_ms": 451.042,
"model": "before",
"profile": {
"assign_homes": [
18208,
60
],
"civilization_flow_capacity": [
137370,
20
],
"civilization_flow_colonies": [
1075170,
20
],
"civilization_flow_finish": [
198272,
20
],
"civilization_flow_ledger": [
2269355,
20
],
"civilization_flow_plan": [
2307886,
20
],
"civilization_operator_build": [
62940,
20
],
"civilization_operator_solve": [
683671,
860
],
"enforce_capacity": [
291171,
60
],
"generation_products": [
78498,
20
],
"generation_withdrawal": [
807187,
40
],
"generations": [
2322215,
20
],
"initialize": [
143015,
20
],
"newborn_batches": [
55362,
1490
],
"physical_amounts_build": [
749843,
300
],
"production": [
753597,
20
],
"trends": [
360333,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
}
],
"speed": 6,
"reference_commit": "413f2be9044090c878c2909dd9d0646f77513a5f",
"reference_script_sha256": "b2a04cc50ad1e77b45762264846cb546b013b09f4c204ba22e6472a38728e5b7",
"candidate_script_sha256": "cbc65eaf4ab0e67fb9d6d5d7ad11757bdeb5f0b1e0ffb2f2631bfe3dcd9e962e",
"summary": {
"all_objects_speed6": {
"before": {
"mean_ms": 385.26275,
"cycles_per_second": 2.5956311634073113,
"profile_ms": {
"assign_homes": 1.184675,
"civilization_flow_capacity": 6.027125,
"civilization_flow_colonies": 5.041075,
"civilization_flow_finish": 8.4702,
"civilization_flow_ledger": 52.010825,
"civilization_flow_plan": 108.27497500000001,
"civilization_operator_build": 3.03765,
"civilization_operator_solve": 33.53555,
"enforce_capacity": 17.058375,
"generation_products": 9.46385,
"generation_withdrawal": 26.219099999999997,
"generations": 131.71695000000003,
"initialize": 5.6531,
"newborn_batches": 5.97445,
"physical_amounts_build": 24.085775,
"production": 27.198125,
"trends": 17.578525000000003
}
},
"after": {
"mean_ms": 377.22182499999997,
"cycles_per_second": 2.6509600816442687,
"profile_ms": {
"assign_homes": 1.1909,
"civilization_flow_capacity": 6.04135,
"civilization_flow_colonies": 2.506125,
"civilization_flow_finish": 8.4841,
"civilization_flow_ledger": 44.78065,
"civilization_flow_plan": 108.48295,
"civilization_operator_build": 3.0453,
"civilization_operator_solve": 33.568275,
"enforce_capacity": 17.05445,
"generation_products": 9.4671,
"generation_withdrawal": 26.7821,
"generations": 132.9391,
"initialize": 5.675050000000001,
"newborn_batches": 5.9772,
"physical_amounts_build": 24.521974999999998,
"production": 27.441675,
"trends": 17.576175
}
},
"reduction_percent": 2.0871275512621024
},
"many_objects_fragmented_stars_cycle": {
"before": {
"mean_ms": 506.88784999999996,
"cycles_per_second": 1.9728229824407906,
"profile_ms": {
"assign_homes": 0.9032,
"civilization_flow_capacity": 6.838025,
"civilization_flow_colonies": 53.486925,
"civilization_flow_finish": 9.856375,
"civilization_flow_ledger": 113.0113,
"civilization_flow_plan": 114.807725,
"civilization_operator_build": 3.1266,
"civilization_operator_solve": 34.058175000000006,
"enforce_capacity": 14.482775,
"generation_products": 3.906175,
"generation_withdrawal": 40.057575,
"generations": 116.08505000000001,
"initialize": 7.099324999999999,
"newborn_batches": 2.756,
"physical_amounts_build": 37.40115,
"production": 37.461625,
"trends": 17.908175
}
},
"after": {
"mean_ms": 443.30325,
"cycles_per_second": 2.255792169355853,
"profile_ms": {
"assign_homes": 0.8976000000000001,
"civilization_flow_capacity": 6.86055,
"civilization_flow_colonies": 11.520175,
"civilization_flow_finish": 9.861975000000001,
"civilization_flow_ledger": 91.591075,
"civilization_flow_plan": 114.74235,
"civilization_operator_build": 3.120375,
"civilization_operator_solve": 33.985724999999995,
"enforce_capacity": 14.466524999999999,
"generation_products": 3.9186,
"generation_withdrawal": 40.332175,
"generations": 115.999375,
"initialize": 7.1,
"newborn_batches": 2.756025,
"physical_amounts_build": 37.48015,
"production": 37.5571,
"trends": 17.834799999999998
}
},
"reduction_percent": 12.544116020930463
}
}
}
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,345 @@
{
"cycles_per_run": 50,
"delta_seconds": 0.2,
"profile_enabled": true,
"repeats": 2,
"runs": [
{
"cycles": 50,
"cycles_per_second": 2.39655612966922,
"final_stellar_cohorts": 130,
"game_years": "1000000",
"max_ms": 454.421,
"mean_ms": 417.26542,
"min_ms": 349.968,
"model": "legacy",
"p95_ms": 448.31,
"peak_stellar_cohorts": 132,
"profile": {
"assign_homes": [
58334,
200
],
"civilization_flow_capacity": [
308485,
50
],
"civilization_flow_colonies": [
272661,
50
],
"civilization_flow_finish": [
432935,
50
],
"civilization_flow_ledger": [
2884631,
50
],
"civilization_flow_plan": [
5425115,
50
],
"civilization_operator_build": [
151687,
50
],
"civilization_operator_solve": [
1609348,
2150
],
"enforce_capacity": [
871224,
200
],
"generation_products": [
542267,
100
],
"generation_withdrawal": [
1820057,
150
],
"generations": [
7751170,
50
],
"initialize": [
297786,
50
],
"newborn_batches": [
375307,
8322
],
"physical_amounts_build": [
1351719,
900
],
"production": [
1410303,
50
],
"trends": [
879262,
50
]
},
"repeat": 1,
"throughput": 0.479311225933843
},
{
"cycles": 50,
"cycles_per_second": 2.36172713483247,
"final_stellar_cohorts": 1300,
"game_years": "1000000",
"max_ms": 460.373,
"mean_ms": 423.41894,
"min_ms": 350.862,
"model": "cycle",
"p95_ms": 458.712,
"peak_stellar_cohorts": 1300,
"profile": {
"assign_homes": [
52297,
176
],
"civilization_flow_capacity": [
314752,
50
],
"civilization_flow_colonies": [
277416,
50
],
"civilization_flow_finish": [
442436,
50
],
"civilization_flow_ledger": [
3097867,
50
],
"civilization_flow_plan": [
5500302,
50
],
"civilization_operator_build": [
156156,
50
],
"civilization_operator_solve": [
1624350,
2150
],
"enforce_capacity": [
841074,
176
],
"generation_products": [
441260,
76
],
"generation_withdrawal": [
2058882,
126
],
"generations": [
7358962,
50
],
"initialize": [
304251,
50
],
"newborn_batches": [
211077,
5960
],
"physical_amounts_build": [
1293092,
826
],
"production": [
1725690,
50
],
"trends": [
899707,
50
]
},
"repeat": 1,
"throughput": 0.472345426966493
},
{
"cycles": 50,
"cycles_per_second": 2.34186004575995,
"final_stellar_cohorts": 1300,
"game_years": "1000000",
"max_ms": 465.408,
"mean_ms": 427.011,
"min_ms": 351.168,
"model": "cycle",
"p95_ms": 460.645,
"peak_stellar_cohorts": 1300,
"profile": {
"assign_homes": [
52872,
176
],
"civilization_flow_capacity": [
317075,
50
],
"civilization_flow_colonies": [
279484,
50
],
"civilization_flow_finish": [
446195,
50
],
"civilization_flow_ledger": [
3118109,
50
],
"civilization_flow_plan": [
5537625,
50
],
"civilization_operator_build": [
158082,
50
],
"civilization_operator_solve": [
1637405,
2150
],
"enforce_capacity": [
854481,
176
],
"generation_products": [
445328,
76
],
"generation_withdrawal": [
2078977,
126
],
"generations": [
7431634,
50
],
"initialize": [
308950,
50
],
"newborn_batches": [
213741,
5960
],
"physical_amounts_build": [
1308770,
826
],
"production": [
1744677,
50
],
"trends": [
903605,
50
]
},
"repeat": 2,
"throughput": 0.468372009151989
},
{
"cycles": 50,
"cycles_per_second": 2.31974771537327,
"final_stellar_cohorts": 130,
"game_years": "1000000",
"max_ms": 462.587,
"mean_ms": 431.08136,
"min_ms": 364.143,
"model": "legacy",
"p95_ms": 461.998,
"peak_stellar_cohorts": 132,
"profile": {
"assign_homes": [
60468,
200
],
"civilization_flow_capacity": [
318914,
50
],
"civilization_flow_colonies": [
281067,
50
],
"civilization_flow_finish": [
446947,
50
],
"civilization_flow_ledger": [
2979604,
50
],
"civilization_flow_plan": [
5570636,
50
],
"civilization_operator_build": [
158593,
50
],
"civilization_operator_solve": [
1643754,
2150
],
"enforce_capacity": [
904863,
200
],
"generation_products": [
564253,
100
],
"generation_withdrawal": [
1881469,
150
],
"generations": [
8019908,
50
],
"initialize": [
312899,
50
],
"newborn_batches": [
389499,
8322
],
"physical_amounts_build": [
1396769,
900
],
"production": [
1458932,
50
],
"trends": [
909402,
50
]
},
"repeat": 2,
"throughput": 0.463949543074653
}
],
"speed": 6
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,345 @@
{
"cycles_per_run": 50,
"delta_seconds": 0.2,
"profile_enabled": true,
"repeats": 2,
"runs": [
{
"cycles": 50,
"cycles_per_second": 2.3787548645537,
"final_stellar_cohorts": 130,
"game_years": "1000000",
"max_ms": 453.742,
"mean_ms": 420.388,
"min_ms": 354.113,
"model": "legacy",
"p95_ms": 452.604,
"peak_stellar_cohorts": 132,
"profile": {
"assign_homes": [
59021,
200
],
"civilization_flow_capacity": [
310616,
50
],
"civilization_flow_colonies": [
276485,
50
],
"civilization_flow_finish": [
436890,
50
],
"civilization_flow_ledger": [
2908982,
50
],
"civilization_flow_plan": [
5444724,
50
],
"civilization_operator_build": [
152980,
50
],
"civilization_operator_solve": [
1604917,
2150
],
"enforce_capacity": [
879602,
200
],
"generation_products": [
550010,
100
],
"generation_withdrawal": [
1834842,
150
],
"generations": [
7827667,
50
],
"initialize": [
300448,
50
],
"newborn_batches": [
379245,
8322
],
"physical_amounts_build": [
1360704,
900
],
"production": [
1417179,
50
],
"trends": [
884554,
50
]
},
"repeat": 1,
"throughput": 0.47575097291074
},
{
"cycles": 50,
"cycles_per_second": 2.3567861205283,
"final_stellar_cohorts": 125,
"game_years": "1000000",
"max_ms": 461.919,
"mean_ms": 424.30664,
"min_ms": 355.62,
"model": "cycle",
"p95_ms": 459.138,
"peak_stellar_cohorts": 127,
"profile": {
"assign_homes": [
59817,
200
],
"civilization_flow_capacity": [
314882,
50
],
"civilization_flow_colonies": [
279378,
50
],
"civilization_flow_finish": [
442443,
50
],
"civilization_flow_ledger": [
2950938,
50
],
"civilization_flow_plan": [
5516132,
50
],
"civilization_operator_build": [
156869,
50
],
"civilization_operator_solve": [
1618413,
2150
],
"enforce_capacity": [
892637,
200
],
"generation_products": [
529169,
100
],
"generation_withdrawal": [
1861386,
150
],
"generations": [
7833909,
50
],
"initialize": [
304443,
50
],
"newborn_batches": [
332349,
7522
],
"physical_amounts_build": [
1382887,
900
],
"production": [
1444907,
50
],
"trends": [
896615,
50
]
},
"repeat": 1,
"throughput": 0.471357224105661
},
{
"cycles": 50,
"cycles_per_second": 2.33373492243879,
"final_stellar_cohorts": 125,
"game_years": "1000000",
"max_ms": 471.891,
"mean_ms": 428.49768,
"min_ms": 363.562,
"model": "cycle",
"p95_ms": 458.377,
"peak_stellar_cohorts": 127,
"profile": {
"assign_homes": [
60419,
200
],
"civilization_flow_capacity": [
317546,
50
],
"civilization_flow_colonies": [
281187,
50
],
"civilization_flow_finish": [
447446,
50
],
"civilization_flow_ledger": [
2973320,
50
],
"civilization_flow_plan": [
5561963,
50
],
"civilization_operator_build": [
157327,
50
],
"civilization_operator_solve": [
1631869,
2150
],
"enforce_capacity": [
900410,
200
],
"generation_products": [
541714,
100
],
"generation_withdrawal": [
1875079,
150
],
"generations": [
7926735,
50
],
"initialize": [
307215,
50
],
"newborn_batches": [
336903,
7522
],
"physical_amounts_build": [
1400661,
900
],
"production": [
1457871,
50
],
"trends": [
908259,
50
]
},
"repeat": 2,
"throughput": 0.466746984487757
},
{
"cycles": 50,
"cycles_per_second": 2.31693373652923,
"final_stellar_cohorts": 130,
"game_years": "1000000",
"max_ms": 466.374,
"mean_ms": 431.60492,
"min_ms": 366.359,
"model": "legacy",
"p95_ms": 465.621,
"peak_stellar_cohorts": 132,
"profile": {
"assign_homes": [
60684,
200
],
"civilization_flow_capacity": [
318805,
50
],
"civilization_flow_colonies": [
282225,
50
],
"civilization_flow_finish": [
448335,
50
],
"civilization_flow_ledger": [
2980134,
50
],
"civilization_flow_plan": [
5579243,
50
],
"civilization_operator_build": [
157141,
50
],
"civilization_operator_solve": [
1638102,
2150
],
"enforce_capacity": [
904255,
200
],
"generation_products": [
565486,
100
],
"generation_withdrawal": [
1885470,
150
],
"generations": [
8034541,
50
],
"initialize": [
308996,
50
],
"newborn_batches": [
388637,
8322
],
"physical_amounts_build": [
1400258,
900
],
"production": [
1465783,
50
],
"trends": [
913581,
50
]
},
"repeat": 2,
"throughput": 0.463386747305846
}
],
"speed": 6
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,345 @@
{
"cycles_per_run": 40,
"delta_seconds": 0.2,
"profile_enabled": true,
"repeats": 2,
"runs": [
{
"cycles": 40,
"cycles_per_second": 1.6323701614814,
"final_stellar_cohorts": 105,
"game_years": "800000",
"max_ms": 628.888,
"mean_ms": 612.60615,
"min_ms": 564.108,
"model": "legacy",
"p95_ms": 624.987,
"peak_stellar_cohorts": 4560,
"profile": {
"assign_homes": [
48558,
160
],
"civilization_flow_capacity": [
263456,
40
],
"civilization_flow_colonies": [
2192836,
40
],
"civilization_flow_finish": [
401558,
40
],
"civilization_flow_ledger": [
4523753,
40
],
"civilization_flow_plan": [
4491368,
40
],
"civilization_operator_build": [
128185,
40
],
"civilization_operator_solve": [
1314272,
1720
],
"enforce_capacity": [
755412,
160
],
"generation_products": [
621550,
80
],
"generation_withdrawal": [
2524452,
120
],
"generations": [
8393123,
40
],
"initialize": [
293736,
40
],
"newborn_batches": [
1166060,
19424
],
"physical_amounts_build": [
1707597,
675
],
"production": [
2026863,
40
],
"trends": [
716666,
40
]
},
"repeat": 1,
"throughput": 0.32647403229628
},
{
"cycles": 40,
"cycles_per_second": 1.88577938012452,
"final_stellar_cohorts": 99,
"game_years": "800000",
"max_ms": 564.379,
"mean_ms": 530.284725,
"min_ms": 448.092,
"model": "cycle",
"p95_ms": 560.287,
"peak_stellar_cohorts": 607,
"profile": {
"assign_homes": [
39924,
132
],
"civilization_flow_capacity": [
265954,
40
],
"civilization_flow_colonies": [
2204837,
40
],
"civilization_flow_finish": [
404568,
40
],
"civilization_flow_ledger": [
4540902,
40
],
"civilization_flow_plan": [
4517593,
40
],
"civilization_operator_build": [
128322,
40
],
"civilization_operator_solve": [
1324328,
1720
],
"enforce_capacity": [
672871,
132
],
"generation_products": [
184761,
52
],
"generation_withdrawal": [
2150050,
92
],
"generations": [
5519639,
40
],
"initialize": [
295834,
40
],
"newborn_batches": [
118202,
3115
],
"physical_amounts_build": [
1594387,
612
],
"production": [
1526313,
40
],
"trends": [
723713,
40
]
},
"repeat": 1,
"throughput": 0.377155876024903
},
{
"cycles": 40,
"cycles_per_second": 1.87765994001252,
"final_stellar_cohorts": 99,
"game_years": "800000",
"max_ms": 566.428,
"mean_ms": 532.5778,
"min_ms": 456.191,
"model": "cycle",
"p95_ms": 565.345,
"peak_stellar_cohorts": 607,
"profile": {
"assign_homes": [
40238,
132
],
"civilization_flow_capacity": [
264957,
40
],
"civilization_flow_colonies": [
2218466,
40
],
"civilization_flow_finish": [
405624,
40
],
"civilization_flow_ledger": [
4564735,
40
],
"civilization_flow_plan": [
4543992,
40
],
"civilization_operator_build": [
127427,
40
],
"civilization_operator_solve": [
1338172,
1720
],
"enforce_capacity": [
672773,
132
],
"generation_products": [
185633,
52
],
"generation_withdrawal": [
2159985,
92
],
"generations": [
5547513,
40
],
"initialize": [
297516,
40
],
"newborn_batches": [
119187,
3115
],
"physical_amounts_build": [
1590461,
612
],
"production": [
1516716,
40
],
"trends": [
731042,
40
]
},
"repeat": 2,
"throughput": 0.375531988002504
},
{
"cycles": 40,
"cycles_per_second": 1.60095961519335,
"final_stellar_cohorts": 105,
"game_years": "800000",
"max_ms": 660.704,
"mean_ms": 624.625375,
"min_ms": 562.732,
"model": "legacy",
"p95_ms": 638.671,
"peak_stellar_cohorts": 4560,
"profile": {
"assign_homes": [
49183,
160
],
"civilization_flow_capacity": [
268901,
40
],
"civilization_flow_colonies": [
2229856,
40
],
"civilization_flow_finish": [
406135,
40
],
"civilization_flow_ledger": [
4623708,
40
],
"civilization_flow_plan": [
4578330,
40
],
"civilization_operator_build": [
130249,
40
],
"civilization_operator_solve": [
1340466,
1720
],
"enforce_capacity": [
765788,
160
],
"generation_products": [
635386,
80
],
"generation_withdrawal": [
2573324,
120
],
"generations": [
8560126,
40
],
"initialize": [
297396,
40
],
"newborn_batches": [
1191081,
19424
],
"physical_amounts_build": [
1738195,
675
],
"production": [
2069255,
40
],
"trends": [
735591,
40
]
},
"repeat": 2,
"throughput": 0.320191923038669
}
],
"speed": 6
}
@@ -0,0 +1,870 @@
{
"delta_seconds": 0.2,
"input_sha256": {
"all_objects_speed6": "44bee3b3753fa51615f766d8f800a10cc2b70c8e7fb4ea12b6e18da7f07a7d67",
"many_objects_fragmented_stars_cycle": "1e95ef398923f26b912a305c84f9b3eb502d24cb14e8ae687a4becccf047324a"
},
"order": "before-after-after-before",
"profile_enabled": true,
"runs": [
{
"cycles": 20,
"max_ms": 409.924,
"mean_ms": 374.42165,
"min_ms": 321.955,
"model": "before",
"profile": {
"assign_homes": [
23286,
80
],
"civilization_flow_capacity": [
120325,
20
],
"civilization_flow_colonies": [
49609,
20
],
"civilization_flow_finish": [
167957,
20
],
"civilization_flow_ledger": [
890864,
20
],
"civilization_flow_plan": [
2156571,
20
],
"civilization_operator_build": [
59939,
20
],
"civilization_operator_solve": [
667995,
860
],
"enforce_capacity": [
338483,
80
],
"generation_products": [
186561,
40
],
"generation_withdrawal": [
530120,
60
],
"generations": [
2635468,
20
],
"initialize": [
112680,
20
],
"newborn_batches": [
118343,
3016
],
"physical_amounts_build": [
488368,
360
],
"production": [
543976,
20
],
"trends": [
348509,
20
]
},
"run": 1,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 396.498,
"mean_ms": 366.8874,
"min_ms": 316.948,
"model": "after",
"profile": {
"assign_homes": [
23679,
80
],
"civilization_flow_capacity": [
121355,
20
],
"civilization_flow_colonies": [
52357,
20
],
"civilization_flow_finish": [
134122,
20
],
"civilization_flow_ledger": [
867762,
20
],
"civilization_flow_plan": [
2171014,
20
],
"civilization_operator_build": [
60589,
20
],
"civilization_operator_solve": [
672927,
860
],
"enforce_capacity": [
313233,
80
],
"generation_products": [
188758,
40
],
"generation_withdrawal": [
537217,
60
],
"generations": [
2691969,
20
],
"initialize": [
113057,
20
],
"newborn_batches": [
119560,
3016
],
"physical_amounts_build": [
283727,
200
],
"production": [
371874,
20
],
"trends": [
352124,
20
]
},
"run": 1,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 400.433,
"mean_ms": 367.76455,
"min_ms": 317.346,
"model": "after",
"profile": {
"assign_homes": [
23679,
80
],
"civilization_flow_capacity": [
120585,
20
],
"civilization_flow_colonies": [
52508,
20
],
"civilization_flow_finish": [
133714,
20
],
"civilization_flow_ledger": [
873014,
20
],
"civilization_flow_plan": [
2178049,
20
],
"civilization_operator_build": [
60872,
20
],
"civilization_operator_solve": [
674461,
860
],
"enforce_capacity": [
312963,
80
],
"generation_products": [
189817,
40
],
"generation_withdrawal": [
538355,
60
],
"generations": [
2697406,
20
],
"initialize": [
113617,
20
],
"newborn_batches": [
119833,
3016
],
"physical_amounts_build": [
283294,
200
],
"production": [
370613,
20
],
"trends": [
354430,
20
]
},
"run": 2,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 412.947,
"mean_ms": 379.94895,
"min_ms": 327.79,
"model": "before",
"profile": {
"assign_homes": [
23817,
80
],
"civilization_flow_capacity": [
120810,
20
],
"civilization_flow_colonies": [
50245,
20
],
"civilization_flow_finish": [
170562,
20
],
"civilization_flow_ledger": [
901208,
20
],
"civilization_flow_plan": [
2186592,
20
],
"civilization_operator_build": [
61551,
20
],
"civilization_operator_solve": [
676571,
860
],
"enforce_capacity": [
342898,
80
],
"generation_products": [
190410,
40
],
"generation_withdrawal": [
538869,
60
],
"generations": [
2675372,
20
],
"initialize": [
114216,
20
],
"newborn_batches": [
120558,
3016
],
"physical_amounts_build": [
495969,
360
],
"production": [
554663,
20
],
"trends": [
353982,
20
]
},
"run": 2,
"save": "all_objects_speed6",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 463.763,
"mean_ms": 441.44965,
"min_ms": 386.031,
"model": "before",
"profile": {
"assign_homes": [
17806,
60
],
"civilization_flow_capacity": [
136652,
20
],
"civilization_flow_colonies": [
230107,
20
],
"civilization_flow_finish": [
196342,
20
],
"civilization_flow_ledger": [
1825154,
20
],
"civilization_flow_plan": [
2292865,
20
],
"civilization_operator_build": [
62146,
20
],
"civilization_operator_solve": [
680101,
860
],
"enforce_capacity": [
288185,
60
],
"generation_products": [
77590,
20
],
"generation_withdrawal": [
800537,
40
],
"generations": [
2298719,
20
],
"initialize": [
141855,
20
],
"newborn_batches": [
54592,
1490
],
"physical_amounts_build": [
745858,
300
],
"production": [
747261,
20
],
"trends": [
356732,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 445.055,
"mean_ms": 423.0315,
"min_ms": 374.104,
"model": "after",
"profile": {
"assign_homes": [
17840,
60
],
"civilization_flow_capacity": [
137440,
20
],
"civilization_flow_colonies": [
231537,
20
],
"civilization_flow_finish": [
137928,
20
],
"civilization_flow_ledger": [
1782223,
20
],
"civilization_flow_plan": [
2310391,
20
],
"civilization_operator_build": [
61962,
20
],
"civilization_operator_solve": [
687903,
860
],
"enforce_capacity": [
238360,
60
],
"generation_products": [
77666,
20
],
"generation_withdrawal": [
802637,
40
],
"generations": [
2360346,
20
],
"initialize": [
141317,
20
],
"newborn_batches": [
54930,
1490
],
"physical_amounts_build": [
356207,
140
],
"production": [
405364,
20
],
"trends": [
357407,
20
]
},
"run": 1,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 441.891,
"mean_ms": 422.9136,
"min_ms": 376.819,
"model": "after",
"profile": {
"assign_homes": [
17821,
60
],
"civilization_flow_capacity": [
136949,
20
],
"civilization_flow_colonies": [
231992,
20
],
"civilization_flow_finish": [
137312,
20
],
"civilization_flow_ledger": [
1788156,
20
],
"civilization_flow_plan": [
2297486,
20
],
"civilization_operator_build": [
61993,
20
],
"civilization_operator_solve": [
683317,
860
],
"enforce_capacity": [
238430,
60
],
"generation_products": [
78170,
20
],
"generation_withdrawal": [
804912,
40
],
"generations": [
2364256,
20
],
"initialize": [
141451,
20
],
"newborn_batches": [
54900,
1490
],
"physical_amounts_build": [
354476,
140
],
"production": [
407287,
20
],
"trends": [
358298,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
},
{
"cycles": 20,
"max_ms": 465.049,
"mean_ms": 444.87595,
"min_ms": 392.884,
"model": "before",
"profile": {
"assign_homes": [
17906,
60
],
"civilization_flow_capacity": [
136963,
20
],
"civilization_flow_colonies": [
229784,
20
],
"civilization_flow_finish": [
196495,
20
],
"civilization_flow_ledger": [
1839904,
20
],
"civilization_flow_plan": [
2302987,
20
],
"civilization_operator_build": [
62518,
20
],
"civilization_operator_solve": [
683660,
860
],
"enforce_capacity": [
289846,
60
],
"generation_products": [
78882,
20
],
"generation_withdrawal": [
808021,
40
],
"generations": [
2328372,
20
],
"initialize": [
142755,
20
],
"newborn_batches": [
54963,
1490
],
"physical_amounts_build": [
754056,
300
],
"production": [
754898,
20
],
"trends": [
358634,
20
]
},
"run": 2,
"save": "many_objects_fragmented_stars_cycle",
"validation": "",
"years": 400000
}
],
"speed": 6,
"reference_commit": "9357f757a95db96274d4e115c7e498b58eca6902",
"exact_differential": {
"cycles": 10,
"inputs": [
"all_objects_speed6",
"many_objects_fragmented_stars_cycle"
],
"delta_seconds": [
0.2,
0.53,
0.31,
0.2,
0.2
],
"equal_full_states": true
},
"checks": {
"flow_commit": 1971,
"civilization_flows": 1895,
"civilization_state": 70,
"frame_evolution": 38,
"production_transaction": 14,
"stellar_rules": 333
},
"summary": {
"all_objects_speed6": {
"before": {
"mean_ms": 377.1853,
"cycles_per_second": 2.651216789201488,
"profile_ms": {
"assign_homes": 1.177575,
"civilization_flow_capacity": 6.028375,
"civilization_flow_colonies": 2.49635,
"civilization_flow_finish": 8.462975,
"civilization_flow_ledger": 44.8018,
"civilization_flow_plan": 108.579075,
"civilization_operator_build": 3.03725,
"civilization_operator_solve": 33.61415,
"enforce_capacity": 17.034525000000002,
"generation_products": 9.424275,
"generation_withdrawal": 26.724725,
"generations": 132.771,
"initialize": 5.6724,
"newborn_batches": 5.972524999999999,
"physical_amounts_build": 24.608425,
"production": 27.465975,
"trends": 17.562275000000003
},
"profile_calls_per_cycle": {
"assign_homes": 4.0,
"civilization_flow_capacity": 1.0,
"civilization_flow_colonies": 1.0,
"civilization_flow_finish": 1.0,
"civilization_flow_ledger": 1.0,
"civilization_flow_plan": 1.0,
"civilization_operator_build": 1.0,
"civilization_operator_solve": 43.0,
"enforce_capacity": 4.0,
"generation_products": 2.0,
"generation_withdrawal": 3.0,
"generations": 1.0,
"initialize": 1.0,
"newborn_batches": 150.8,
"physical_amounts_build": 18.0,
"production": 1.0,
"trends": 1.0
}
},
"after": {
"mean_ms": 367.32597499999997,
"cycles_per_second": 2.7223775830173733,
"profile_ms": {
"assign_homes": 1.18395,
"civilization_flow_capacity": 6.0485,
"civilization_flow_colonies": 2.621625,
"civilization_flow_finish": 6.6959,
"civilization_flow_ledger": 43.519400000000005,
"civilization_flow_plan": 108.726575,
"civilization_operator_build": 3.036525,
"civilization_operator_solve": 33.6847,
"enforce_capacity": 15.6549,
"generation_products": 9.464375,
"generation_withdrawal": 26.8893,
"generations": 134.734375,
"initialize": 5.66685,
"newborn_batches": 5.984825,
"physical_amounts_build": 14.175525,
"production": 18.562175,
"trends": 17.66385
},
"profile_calls_per_cycle": {
"assign_homes": 4.0,
"civilization_flow_capacity": 1.0,
"civilization_flow_colonies": 1.0,
"civilization_flow_finish": 1.0,
"civilization_flow_ledger": 1.0,
"civilization_flow_plan": 1.0,
"civilization_operator_build": 1.0,
"civilization_operator_solve": 43.0,
"enforce_capacity": 4.0,
"generation_products": 2.0,
"generation_withdrawal": 3.0,
"generations": 1.0,
"initialize": 1.0,
"newborn_batches": 150.8,
"physical_amounts_build": 10.0,
"production": 1.0,
"trends": 1.0
}
},
"reduction_percent": 2.613920797019398
},
"many_objects_fragmented_stars_cycle": {
"before": {
"mean_ms": 443.1628,
"cycles_per_second": 2.2565070894939736,
"profile_ms": {
"assign_homes": 0.8927999999999999,
"civilization_flow_capacity": 6.840375,
"civilization_flow_colonies": 11.497275,
"civilization_flow_finish": 9.820924999999999,
"civilization_flow_ledger": 91.62644999999999,
"civilization_flow_plan": 114.8963,
"civilization_operator_build": 3.1166,
"civilization_operator_solve": 34.094025,
"enforce_capacity": 14.450775,
"generation_products": 3.9118000000000004,
"generation_withdrawal": 40.21395,
"generations": 115.677275,
"initialize": 7.11525,
"newborn_batches": 2.738875,
"physical_amounts_build": 37.49785,
"production": 37.553975,
"trends": 17.88415
},
"profile_calls_per_cycle": {
"assign_homes": 3.0,
"civilization_flow_capacity": 1.0,
"civilization_flow_colonies": 1.0,
"civilization_flow_finish": 1.0,
"civilization_flow_ledger": 1.0,
"civilization_flow_plan": 1.0,
"civilization_operator_build": 1.0,
"civilization_operator_solve": 43.0,
"enforce_capacity": 3.0,
"generation_products": 1.0,
"generation_withdrawal": 2.0,
"generations": 1.0,
"initialize": 1.0,
"newborn_batches": 74.5,
"physical_amounts_build": 15.0,
"production": 1.0,
"trends": 1.0
}
},
"after": {
"mean_ms": 422.97254999999996,
"cycles_per_second": 2.364219616615783,
"profile_ms": {
"assign_homes": 0.891525,
"civilization_flow_capacity": 6.859725,
"civilization_flow_colonies": 11.588225,
"civilization_flow_finish": 6.881,
"civilization_flow_ledger": 89.25947500000001,
"civilization_flow_plan": 115.19692500000001,
"civilization_operator_build": 3.098875,
"civilization_operator_solve": 34.2805,
"enforce_capacity": 11.91975,
"generation_products": 3.8959,
"generation_withdrawal": 40.188725,
"generations": 118.11505,
"initialize": 7.0691999999999995,
"newborn_batches": 2.74575,
"physical_amounts_build": 17.767075000000002,
"production": 20.316275,
"trends": 17.892625
},
"profile_calls_per_cycle": {
"assign_homes": 3.0,
"civilization_flow_capacity": 1.0,
"civilization_flow_colonies": 1.0,
"civilization_flow_finish": 1.0,
"civilization_flow_ledger": 1.0,
"civilization_flow_plan": 1.0,
"civilization_operator_build": 1.0,
"civilization_operator_solve": 43.0,
"enforce_capacity": 3.0,
"generation_products": 1.0,
"generation_withdrawal": 2.0,
"generations": 1.0,
"initialize": 1.0,
"newborn_batches": 74.5,
"physical_amounts_build": 7.0,
"production": 1.0,
"trends": 1.0
}
},
"reduction_percent": 4.5559442263655825
}
},
"candidate_script_sha256": {
"civilization_flow.gd": "5d2b5f5a90fc9182ac1f933d473441457be28b47800a0081b1409614dd28aab5",
"civilization_state.gd": "ae0832531c7ce244e6939793007b3d7be5bd32246be6c209a75fdb5e3e6ffe7a",
"civilization_evolution.gd": "24efc14eedee5e8a28422262e37e6c54e1a0c403a164bd8f4c96d749f89ac61f",
"evolution_coordinator.gd": "0b8cec7e53f047698545e9b97c986b99e0ea5bfc61a6b0177335aedb442e6048",
"object_ledger.gd": "f7fbfeb4be905b525ad91648167ed1e32c4d3b77553549c69c3ebb808ac99b4b",
"manual_production.gd": "138a94d3bb7d63470f2ca2eb841badef910ec27f3e247c5c9ed8e925c0971fa4",
"automatic_production.gd": "dba9f98cbecc90ad9935653c39f7fcfad53edb3ca2670bbce4e1594b58b399a5",
"universe_environment.gd": "e31c87b38a4ec0052f3d43f7be2af51ee7612a48fadcf0b5072ba678107e576e"
}
}
+67
View File
@@ -0,0 +1,67 @@
extends SceneTree
## Full-cycle throughput benchmark; diagnostic input is never modified.
const E = preload("res://world/owniverse/math/exact.gd")
func _initialize():
call_deferred("run")
func restore_json_integers(value):
# JSON parses ordinary integer tokens as float. Large integers are $exact.
if value is float and value == floorf(value) and absf(value) <= 9007199254740991:
return int(value)
if value is Dictionary:
for key in value: value[key] = restore_json_integers(value[key])
elif value is Array:
for i in value.size(): value[i] = restore_json_integers(value[i])
return value
func run():
var args = OS.get_cmdline_user_args()
if args.is_empty():
print("Usage: --script tests/benchmark_civilization_flows.gd -- /path/to/save.adventure.json [delta_seconds] [profile] [cycles=100] [speed=1..6]")
quit(1)
return
var data = JSON.parse_string(FileAccess.get_file_as_string(args[0]))
if not data is Dictionary or data.get("format_version") != 6:
push_error("Expected diagnostic JSON format 6")
quit(1)
return
var initial: Dictionary = E.decode(restore_json_integers(data)).state
var validation: String = root.get_node("SaveManager").validate_data(E.decode(restore_json_integers(data)))
print("Save validation: ", "OK" if validation.is_empty() else validation)
var delta: float = args[1].to_float() if args.size() > 1 else 1.0 / 60.0
if not is_finite(delta) or delta <= 0:
quit(1)
return
var selected_speed: int = 6
for arg in args:
if arg.begins_with("speed="):
selected_speed = clampi(arg.trim_prefix("speed=").to_int(), 1, root.get_node("Global").SPEED_LIMIT)
for speed in [selected_speed]:
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
world.state = initial.duplicate(true)
world.speed = speed
world.profile_enabled = args.has("profile")
var elapsed: Array = []
var cycles: int = 100
for arg in args:
if arg.begins_with("cycles="): cycles = maxi(1, arg.trim_prefix("cycles=").to_int())
var initial_clock: Variant = world.state.time.datetime
for cycle in cycles:
var start: int = Time.get_ticks_usec()
world.evolute(delta)
elapsed.append((Time.get_ticks_usec() - start) / 1000.0)
print("Speed %d, %d complete %.3f-second steps" % [speed, cycles, delta])
print("Min/max ms: ", elapsed.min(), "/", elapsed.max())
print("Game years applied: ", E.fixed(E.subtract(world.state.time.datetime, initial_clock)))
var total_ms: float = 0.0
for sample in elapsed: total_ms += sample
var throughput: float = float(cycles) * delta / (total_ms / 1000.0)
print("Mean complete cycle ms: ", total_ms / cycles)
print("Full cycles/s: ", float(cycles) * 1000.0 / total_ms)
print("Simulation throughput: %.3f real-time seconds processed per CPU second; needs >= 1.0 to keep up" % throughput)
if world.profile_enabled: print("CPU profile (usec, calls): ", world.profile)
for entity in world.catalog.entities.values(): entity.free()
world.free()
quit()
@@ -0,0 +1 @@
uid://biwpwcsboh0s7
+121
View File
@@ -0,0 +1,121 @@
extends SceneTree
## Paired, read-only throughput benchmark for adaptive 5/4/3/2 Hz cadence.
const E = preload("res://world/owniverse/math/exact.gd")
const SAVE_PATHS: Array[String] = [
"res://tests/artifacts/all_objects_speed6.adventure.json",
"res://tests/artifacts/many_objects_fragmented_stars_cycle.adventure.json"
]
const RESULT_PATH := "res://tests/artifacts/dynamic_cadence_results.json"
var cycles: int = 40
var repeats: int = 2
func _initialize() -> void:
call_deferred("run")
func restore_json_integers(value):
if value is float and value == floorf(value) and absf(value) <= 9007199254740991:
return int(value)
if value is Dictionary:
for key in value: value[key] = restore_json_integers(value[key])
elif value is Array:
for i in value.size(): value[i] = restore_json_integers(value[i])
return value
func create_world(initial: Dictionary, use_adaptive_cadence: bool):
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
world.state = initial.duplicate(true)
world.speed = 6
world.adaptive_cadence = use_adaptive_cadence
world.frame_step_seconds = 0.2
world.cadence_level = 0
return world
func dispose(world) -> void:
for entity in world.catalog.entities.values(): entity.free()
world.free()
func measure(initial: Dictionary, adaptive: bool, save_name: String, repeat_index: int) -> Dictionary:
var world = create_world(initial, adaptive)
var elapsed_usec: int = 0
var requested_seconds: float = 0.0
var step_counts: Dictionary = {}
var samples: Array[float] = []
var initial_clock: Variant = world.state.time.datetime
for i in cycles:
var step: float = world.frame_step_seconds
step_counts[str(step)] = int(step_counts.get(str(step), 0)) + 1
requested_seconds += step
var started: int = Time.get_ticks_usec()
world.evolute(step)
var usec: int = Time.get_ticks_usec() - started
elapsed_usec += usec
samples.append(float(usec) / 1000.0)
var applied_years: Variant = E.subtract(world.state.time.datetime, initial_clock)
var expected_years: float = requested_seconds * 100000.0
assert(absf(E.approx(applied_years) - expected_years) <= maxf(1.0, expected_years * 1e-10), "Clock advance differs from accumulated cadence interval")
var validation: String = root.get_node("SaveManager").validate_data({
"format_version": 6,
"app_version": "0.7.0",
"ui": {"current_page": 0},
"state": world.state
})
assert(validation.is_empty(), validation)
samples.sort()
var result: Dictionary = {
"save": save_name,
"mode": "adaptive_5_4_3_2" if adaptive else "fixed_5",
"repeat": repeat_index,
"cycles": cycles,
"mean_ms_per_cycle": float(elapsed_usec) / (cycles * 1000.0),
"p95_ms": samples[int(ceil(samples.size() * 0.95)) - 1],
"max_ms": samples.back(),
"cpu_cycles_per_second": float(cycles) * 1000000.0 / elapsed_usec,
"simulated_seconds_per_cpu_second": requested_seconds * 1000000.0 / elapsed_usec,
"requested_simulation_seconds": requested_seconds,
"applied_game_years": E.fixed(applied_years),
"cadence_steps": step_counts,
"final_cadence_hz": 1.0 / world.frame_step_seconds,
"final_adaptive_quality": world.adaptive_quality
}
print("CADENCE_RESULT ", JSON.stringify(result))
dispose(world)
return result
func run() -> void:
for arg in OS.get_cmdline_user_args():
if arg.begins_with("cycles="): cycles = maxi(1, arg.trim_prefix("cycles=").to_int())
if arg.begins_with("repeats="): repeats = maxi(1, arg.trim_prefix("repeats=").to_int())
var inputs: Dictionary = {}
for path in SAVE_PATHS:
var parsed = JSON.parse_string(FileAccess.get_file_as_string(path))
assert(parsed is Dictionary and parsed.get("format_version") == 6, "Invalid benchmark save: " + path)
var payload: Dictionary = E.decode(restore_json_integers(parsed))
var validation: String = root.get_node("SaveManager").validate_data(payload)
assert(validation.is_empty(), validation)
inputs[path.get_file()] = payload.state
var results: Array[Dictionary] = []
for save_name in inputs:
var initial: Dictionary = inputs[save_name]
# Alternate order to limit machine warm-up and thermal bias.
for repeat_index in repeats:
if repeat_index % 2 == 0:
results.append(measure(initial, false, save_name, repeat_index))
results.append(measure(initial, true, save_name, repeat_index))
else:
results.append(measure(initial, true, save_name, repeat_index))
results.append(measure(initial, false, save_name, repeat_index))
var output := FileAccess.open(RESULT_PATH, FileAccess.WRITE)
assert(output != null)
output.store_string(JSON.stringify({
"machine": OS.get_model_name(),
"godot": Engine.get_version_info(),
"speed": 6,
"cycles_per_run": cycles,
"repeats": repeats,
"input_saves_unchanged": true,
"results": results
}, "\t", true, true))
output.close()
print("Wrote paired cadence results: ", RESULT_PATH)
quit()
+1
View File
@@ -0,0 +1 @@
uid://3fogff2lfmy5
+116
View File
@@ -0,0 +1,116 @@
extends SceneTree
## Measures real Stage scheduling on the full-load diagnostic save.
const E = preload("res://world/owniverse/math/exact.gd")
const RUN_SECONDS: float = 10.0
const RESULT_PATH := "res://tests/artifacts/dynamic_cadence_ui_results.json"
func _initialize() -> void:
call_deferred("run")
func restore(value):
if value is float and value == floorf(value) and absf(value) <= 9007199254740991: return int(value)
if value is Dictionary:
for key in value: value[key] = restore(value[key])
elif value is Array:
for i in value.size(): value[i] = restore(value[i])
return value
func prepare(stage, state: Dictionary, adaptive: bool) -> void:
var world = stage.owniverse
world.state = state.duplicate(true)
world.speed = 6
world.adaptive_cadence = adaptive
world.adaptive_cycle_ema_ms = 0.0
world.adaptive_quality = 0
world.adaptive_recovery_cycles = 0
world.cadence_level = 0
world.cadence_recovery_cycles = 0
world.frame_step_seconds = 0.2
world.frame_elapsed_seconds = 0.0
world.frame_clock = world.state.time.duplicate()
world.frame_active_clock = {}
world._resume_clock = {}
world._queued_productions.clear()
world.production_queue_busy = false
world.frame_busy = false
world.frame_commits = 0
world.profile.clear()
stage.frame_samples.clear()
stage.process_samples.clear()
stage.previous_frame = 0
stage.measuring = false
world.presentation.refresh(world.state, world.catalog)
stage.set_owniverse_item_value()
func run_measurement(stage, initial: Dictionary, adaptive: bool) -> Dictionary:
prepare(stage, initial, adaptive)
var world = stage.owniverse
var start_usec: int = Time.get_ticks_usec()
var requested_start: Variant = world.frame_clock.datetime
var published_start: Variant = world.state.time.datetime
stage.measuring = true
while float(Time.get_ticks_usec() - start_usec) / 1000000.0 < RUN_SECONDS:
await process_frame
stage.measuring = false
var measured_frames: int = stage.frame_samples.size()
# Let the final atomic transaction publish before starting the paired run.
while world.frame_busy or world.production_queue_busy:
await process_frame
var elapsed_usec: int = Time.get_ticks_usec() - start_usec
var requested: Variant = E.subtract(world.frame_clock.datetime, requested_start)
var published: Variant = E.subtract(world.state.time.datetime, published_start)
var samples: Array = stage.frame_samples.duplicate()
var total_frame_ms: float = 0.0
for value in samples: total_frame_ms += value
samples.sort()
var result: Dictionary = {
"mode": "adaptive_5_4_3_2" if adaptive else "fixed_5",
"frames": measured_frames,
"elapsed_seconds": float(elapsed_usec) / 1000000.0,
"commits": world.frame_commits,
"completed_cycles_per_second": float(world.frame_commits) * 1000000.0 / elapsed_usec,
"requested_years": E.fixed(requested),
"published_years": E.fixed(published),
"published_to_requested": snappedf(E.approx(E.divide(published, requested)), 0.00001),
"mean_render_fps": float(samples.size()) * 1000.0 / total_frame_ms if total_frame_ms > 0.0 else 0.0,
"render_p95_ms": samples[int(ceil(samples.size() * 0.95)) - 1] if not samples.is_empty() else 0.0,
"render_max_ms": samples.back() if not samples.is_empty() else 0.0,
"final_cadence_hz": 1.0 / world.frame_step_seconds,
"final_adaptive_quality": world.adaptive_quality,
"cpu_profile_usec_calls": world.profile.duplicate(true)
}
print("UI_CADENCE_RESULT ", JSON.stringify(result))
return result
func run() -> void:
var raw = JSON.parse_string(FileAccess.get_file_as_string("res://tests/artifacts/all_objects_speed6.adventure.json"))
assert(raw is Dictionary and raw.get("format_version") == 6)
var payload: Dictionary = E.decode(restore(raw))
var validation: String = root.get_node("SaveManager").validate_data(payload)
assert(validation.is_empty(), validation)
var scene = load("res://world/world.tscn").instantiate()
var stage = scene.get_node("Stage")
stage.owniverse.free()
stage.set_script(load("res://tests/fixtures/benchmark_ui_stage.gd"))
root.add_child(scene)
await process_frame
stage.owniverse.profile_enabled = true
var results: Array[Dictionary] = []
for repeat_index in 2:
if repeat_index % 2 == 0:
results.append(await run_measurement(stage, payload.state, false))
results.append(await run_measurement(stage, payload.state, true))
else:
results.append(await run_measurement(stage, payload.state, true))
results.append(await run_measurement(stage, payload.state, false))
var report: Dictionary = {"machine": OS.get_model_name(), "godot": Engine.get_version_info(), "speed": 6, "wall_seconds_per_run": RUN_SECONDS, "save": "all_objects_speed6.adventure.json", "results": results}
var output := FileAccess.open(RESULT_PATH, FileAccess.WRITE)
assert(output != null)
output.store_string(JSON.stringify(report, "\t", true, true))
output.close()
print("UI_CADENCE_RESULTS ", JSON.stringify(report))
print("Wrote paired UI cadence results: ", RESULT_PATH)
for entity in stage.owniverse.catalog.entities.values(): entity.free()
stage.owniverse.free()
scene.free()
quit()
@@ -0,0 +1 @@
uid://olp81bbycovp
+48
View File
@@ -0,0 +1,48 @@
extends SceneTree
const E = preload("res://world/owniverse/math/exact.gd")
func _initialize(): call_deferred("run")
func restore(value):
if value is float and value == floorf(value) and absf(value) <= 9007199254740991: return int(value)
if value is Dictionary:
for k in value: value[k] = restore(value[k])
elif value is Array:
for i in value.size(): value[i] = restore(value[i])
return value
func run():
var payload = E.decode(restore(JSON.parse_string(FileAccess.get_file_as_string("res://tests/artifacts/all_objects_speed6.adventure.json"))))
var scene = load("res://world/world.tscn").instantiate()
var stage = scene.get_node("Stage")
stage.owniverse.free()
stage.set_script(load("res://tests/fixtures/benchmark_ui_stage.gd"))
root.add_child(scene)
await process_frame
stage.owniverse.state = payload.state.duplicate(true)
stage.owniverse.restore_frame_checkpoint(payload.get("simulation", {}))
stage.owniverse.presentation.refresh(stage.owniverse.state, stage.owniverse.catalog)
stage.set_owniverse_item_value()
stage.stage_page_scroller.scroll_horizontal = 4 * stage.PAGE_WIDTH
var initial_requested: Variant = stage.owniverse.frame_clock.get("datetime", stage.owniverse.state.time.datetime)
var initial_published: Variant = stage.owniverse.state.time.datetime
stage.owniverse.profile_enabled = true
stage.measuring = true
for i in 600: await process_frame
stage.measuring = false
var samples = stage.frame_samples
var total: float = 0
for sample in samples: total += sample
samples.sort()
print("Saved UI: FPS=%.2f mean=%.2fms p95=%.2fms max=%.2fms commits=%d" % [1000.0/(total/samples.size()),total/samples.size(),samples[int(ceil(samples.size()*0.95))-1],samples.back(),stage.owniverse.frame_commits])
var requested_advance: Variant = E.subtract(stage.owniverse.frame_clock.datetime, initial_requested)
var published_advance: Variant = E.subtract(stage.owniverse.state.time.datetime, initial_published)
print("Requested years advanced=", requested_advance, " published=", published_advance, " throughput=", E.divide(published_advance, requested_advance))
print("UI CPU profile: ", stage.owniverse.profile)
var remaining_objects: int = 0
for id in stage.owniverse.catalog.entities:
if E.gt(stage.owniverse.ledger.physical_amount(stage.owniverse.state, id), 0): remaining_objects += 1
print("Remaining objects: ", remaining_objects)
print("Simulation step: ", stage.owniverse.frame_step_seconds)
for entity in stage.owniverse.catalog.entities.values(): entity.free()
stage.owniverse.free()
scene.free()
for i in 3: await process_frame
quit()
+1
View File
@@ -0,0 +1 @@
uid://3xjh23kg5vrn
+130
View File
@@ -0,0 +1,130 @@
extends SceneTree
## Paired old/new cohort timing on separate generated large diagnostic saves.
const E = preload("res://world/owniverse/math/exact.gd")
var cycles: int = 50
var repeats: int = 2
var artifact_prefix: String = "large_star_cohorts"
func _initialize(): call_deferred("run")
func restore_json_integers(value):
if value is float and value == floorf(value) and absf(value) <= 9007199254740991: return int(value)
if value is Dictionary:
for key in value: value[key] = restore_json_integers(value[key])
elif value is Array:
for i in value.size(): value[i] = restore_json_integers(value[i])
return value
func dispose(world):
for entity in world.catalog.entities.values(): entity.free()
world.free()
func world_from(state: Dictionary, use_cycles: bool):
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
world.state = state.duplicate(true)
world.speed = 6
world.batches.cycle_stars = use_cycles
return world
func cohort_count(world) -> int:
var total: int = 0
for id in world.state.batches:
if world.catalog.entities[id].group_as == "Star": total += world.state.batches[id].size()
return total
func make_state(initial: Dictionary, use_cycles: bool) -> Dictionary:
var world = world_from(initial, use_cycles)
var anchor: Variant = E.of("1e12")
var shift: Variant = E.subtract(anchor, world.state.time.datetime)
for id in world.state.batches:
for batch: Dictionary in world.state.batches[id]:
for field in ["created_from", "created_to", "start_year", "end_year", "processed_until"]:
if batch.has(field): batch[field] = E.add(batch[field], shift)
for id in world.state.batch_origins:
world.state.batch_origins[id] = E.add(world.state.batch_origins[id], shift)
world.state.time = {"datetime": anchor, "year": anchor}
var physical: Dictionary = world.ledger.physical_amounts(world.state)
var populations: Dictionary = {}
for id in world.catalog.entities:
var entity = world.catalog.entities[id]
if entity.group_as != "Star" or E.le(entity.lifespan, 0) or E.le(physical.get(id, 0), 0): continue
world.state.batches[id] = []
world.state.batch_origins.erase(id)
var lifespan: Variant = world.batches.effective_lifespan(world.state, id)
var birth_from: Variant = E.subtract(anchor, lifespan)
var duration: Variant = E.minimum(lifespan, 2000000)
world.batches.append_batch(world.state, id, physical[id], birth_from, E.add(birth_from, duration))
populations[id] = E.fixed(physical[id])
var payload: Dictionary = {"format_version": 6, "app_version": "0.7.0", "ui": {"current_page": 0}, "state": world.state,
"simulation": {"active_clock": {}, "requested_clock": {}, "productions": [], "speed": 6}}
var error: String = root.get_node("SaveManager").validate_data(payload)
assert(error.is_empty(), error)
var suffix: String = "cycle" if use_cycles else "legacy"
var path: String = "res://tests/artifacts/%s_%s.adventure.json" % [artifact_prefix, suffix]
var output = FileAccess.open(path, FileAccess.WRITE)
assert(output != null)
output.store_string(JSON.stringify(E.encode(payload), " ", true, true))
output.close()
print("Generated %s: star_types=%d stellar_cohorts=%d populations=%s" % [suffix, populations.size(), cohort_count(world), str(populations)])
var restored: Dictionary = E.decode(restore_json_integers(JSON.parse_string(FileAccess.get_file_as_string(path))))
assert(E.eq(restored.state, world.state), "Diagnostic file roundtrip changed initial state")
dispose(world)
return restored.state
func measure(initial: Dictionary, use_cycles: bool, run_index: int) -> Dictionary:
var world = world_from(initial, use_cycles)
world.profile_enabled = true
var samples: Array = []
var total_usec: int = 0
var initial_year: Variant = world.state.time.datetime
var peak_cohorts: int = cohort_count(world)
for cycle in cycles:
var started: int = Time.get_ticks_usec()
world.evolute(0.2)
var elapsed: int = Time.get_ticks_usec() - started
total_usec += elapsed
samples.append(elapsed / 1000.0)
peak_cohorts = maxi(peak_cohorts, cohort_count(world))
var applied: Variant = E.subtract(world.state.time.datetime, initial_year)
assert(E.eq(applied, cycles * 20000))
var error: String = root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "0.7.0", "ui": {"current_page": 0}, "state": world.state})
assert(error.is_empty(), error)
samples.sort()
var result: Dictionary = {"model": "cycle" if use_cycles else "legacy", "repeat": run_index, "cycles": cycles,
"mean_ms": total_usec / (1000.0 * cycles), "min_ms": samples.front(), "max_ms": samples.back(), "p95_ms": samples[int(ceil(samples.size() * 0.95)) - 1],
"cycles_per_second": cycles * 1000000.0 / total_usec, "throughput": cycles * 200000.0 / total_usec,
"game_years": E.fixed(applied), "peak_stellar_cohorts": peak_cohorts, "final_stellar_cohorts": cohort_count(world), "profile": world.profile.duplicate(true)}
print("PAIRED_RESULT ", JSON.stringify(result))
dispose(world)
return result
func run():
for arg in OS.get_cmdline_user_args():
if arg.begins_with("cycles="): cycles = maxi(1, arg.trim_prefix("cycles=").to_int())
if arg.begins_with("repeats="): repeats = maxi(1, arg.trim_prefix("repeats=").to_int())
var raw = JSON.parse_string(FileAccess.get_file_as_string("res://tests/artifacts/all_objects_speed6.adventure.json"))
var payload: Dictionary = E.decode(restore_json_integers(raw))
assert(root.get_node("SaveManager").validate_data(payload).is_empty())
var legacy: Dictionary = make_state(payload.state, false)
var current: Dictionary = make_state(payload.state, true)
var reference = world_from(legacy, false)
var candidate = world_from(current, true)
assert(E.eq(reference.ledger.physical_amounts(reference.state), candidate.ledger.physical_amounts(candidate.state)))
assert(E.eq(reference.state.ethics, candidate.state.ethics))
assert(cohort_count(candidate) <= cohort_count(reference), "Dynamic widening increased the fixture cohort count")
dispose(reference)
dispose(candidate)
if OS.get_cmdline_user_args().has("generate_only"):
print("Generated states validate and survive disk roundtrip; physical amounts and ethics match")
quit()
return
var results: Array = []
for repeat_index in repeats:
var order: Array = [false, true] if repeat_index % 2 == 0 else [true, false]
for use_cycles in order:
results.append(measure(current if use_cycles else legacy, use_cycles, repeat_index + 1))
var output = FileAccess.open("res://tests/artifacts/%s_results.json" % artifact_prefix, FileAccess.WRITE)
output.store_string(JSON.stringify({"delta_seconds": 0.2, "speed": 6, "cycles_per_run": cycles, "repeats": repeats, "profile_enabled": true, "runs": results}, " "))
output.close()
quit()
@@ -0,0 +1 @@
uid://hl20vbt440nb
+111
View File
@@ -0,0 +1,111 @@
extends "res://tests/benchmark_large_star_cohorts.gd"
## Fresh all-object stress world with many valid cohorts sharing death cycles.
const Fixture = preload("res://tests/fixtures/civilization_benchmark.gd")
var death_cycles: int = 40
var fragments_per_cycle: int = 8
func _initialize():
artifact_prefix = "many_objects_fragmented_stars"
cycles = 40
call_deferred("run")
func make_state(_initial: Dictionary, use_cycles: bool) -> Dictionary:
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
var global: Node = root.get_node("Global")
Fixture.seed(world, global)
world.batches.cycle_stars = use_cycles
var anchor: Variant = E.of("1e12")
var stock: Variant = E.of("1e60")
var planets: Variant = E.of("1e28")
world.state.time = {"datetime": anchor, "year": anchor}
world.state.energy = E.of("1e100")
world.state.batches = {}
world.state.batch_origins = {}
world.state.binds = {}
world.state.ethics = {}
for id in world.catalog.entities:
world.state.amount[id] = 0 if world.catalog.is_group(id) else (planets if world.catalog.entities[id].group_as == "Planet" else stock)
world.state.stats.total_amount[id] = world.state.amount[id]
# Keep the synthetic universe sparse enough for blast damage to coexist
# with all life stages instead of sterilizing them on the first cycle.
world.state.amount.S = E.of("1e300")
world.state.amount.H = E.of("1e80")
world.state.amount.He = E.of("1e79")
world.state.amount.Met = E.of("1e79")
var dwarfs: Array = ["RD", "OD", "YD", "WYD"]
var stages: int = 0
for id in global.CivilizationRules:
world.state.amount[id] = planets
var weights: Array = [0.35, 0.2, 0.15, 0.12, 0.1, 0.08]
var profile: Dictionary = {}
var ethics: Array = ["m", "l", "w", "d", "c", "b"]
for e in 6: profile[ethics[e]] = weights[(e + stages) % 6]
world.state.ethics[id] = profile
stages += 1
# Planetary stages are hosted by all four kinds of dwarf stars.
for id in world.catalog.entities:
if world.catalog.entities[id].group_as != "Planet" or world.catalog.is_group(id): continue
if global.CivilizationRules.has(id) and str(global.CivilizationRules[id].home) != "": continue
var held: Variant = E.divide(world.state.amount[id], 4)
world.state.amount[id] = 0
for dwarf in dwarfs:
if not world.state.binds.has(dwarf): world.state.binds[dwarf] = {}
world.state.binds[dwarf][id] = held
# Bound stars remain physical and continue producing inside structures.
var structures: Array = ["SCD", "SCM", "SCG", "GEM", "GSD"]
var stellar_types: int = 0
for id in world.catalog.entities:
if world.catalog.entities[id].group_as != "Star" or E.le(world.catalog.entities[id].lifespan, 0): continue
var held: Variant = E.divide(stock, 4)
var owner: String = structures[stellar_types % structures.size()]
if not world.state.binds.has(owner): world.state.binds[owner] = {}
world.state.binds[owner][id] = held
world.state.amount[id] = E.subtract(stock, held)
stellar_types += 1
world.ledger.refresh_groups(world.state)
var physical: Dictionary = world.ledger.physical_amounts(world.state)
var active_types: int = 0
for id in world.catalog.entities:
if world.catalog.is_group(id) or E.le(physical.get(id, 0), 0): continue
active_types += 1
world.state.stats.total_amount[id] = physical[id]
var entity = world.catalog.entities[id]
if E.le(entity.lifespan, 0) or global.CivilizationRules.has(id): continue
if entity.group_as != "Star":
world.batches.append_batch(world.state, id, physical[id], anchor, anchor)
continue
# Valid but deliberately fragmented historical age cohorts. The test
# stresses merge eligibility, rather than claiming these are produced
# by the ordinary steady-state creation path with one fixed origin.
var span: Variant = world.batches.effective_lifespan(world.state, id)
var count: int = death_cycles * fragments_per_cycle
var assigned: Variant = 0
world.state.batches[id] = []
for n in count:
var cycle: int = n / fragments_per_cycle
var fragment: int = n % fragments_per_cycle
var start: Variant = E.add(anchor, cycle * 20000 + (fragment + 1) * 1800)
var end: Variant = E.add(start, 500)
var quota: Variant = E.floor_value(E.mul_div(physical[id], n + 1, count))
world.state.batches[id].append({"amount": E.subtract(quota, assigned), "created_from": E.subtract(start, span), "created_to": E.subtract(end, span), "start_year": start, "end_year": end})
assigned = quota
assert(E.eq(assigned, physical[id]))
world.state.batch_origins[id] = world.state.batches[id][0].created_from
var raw_cohorts: int = cohort_count(world)
world.batches.coarsen(world.state)
var payload: Dictionary = {"format_version": 6, "app_version": "0.7.0", "ui": {"current_page": 0}, "state": world.state,
"simulation": {"active_clock": {}, "requested_clock": {}, "productions": [], "speed": 6}}
var error: String = root.get_node("SaveManager").validate_data(payload)
assert(error.is_empty(), error)
var suffix: String = "cycle" if use_cycles else "legacy"
var path: String = "res://tests/artifacts/%s_%s.adventure.json" % [artifact_prefix, suffix]
var output = FileAccess.open(path, FileAccess.WRITE)
assert(output != null)
output.store_string(JSON.stringify(E.encode(payload), " ", true, true))
output.close()
var restored: Dictionary = E.decode(restore_json_integers(JSON.parse_string(FileAccess.get_file_as_string(path))))
assert(E.eq(restored.state, world.state), "Save roundtrip changed the stress state")
print("Generated %s: active_types=%d civilization_stages=%d stellar_types=%d raw_cohorts=%d stored_stellar_cohorts=%d" % [suffix, active_types, stages, stellar_types, raw_cohorts, cohort_count(world)])
dispose(world)
return restored.state
+1
View File
@@ -0,0 +1 @@
uid://d0plagt7blmcf
+8
View File
@@ -27,6 +27,8 @@ func run():
quit(1) quit(1)
return return
var initial: Dictionary = E.decode(restore_json_integers(data)).state var initial: Dictionary = E.decode(restore_json_integers(data)).state
var validation: String = root.get_node("SaveManager").validate_data(E.decode(restore_json_integers(data)))
print("Save validation: ", "OK" if validation.is_empty() else validation)
var delta: float = args[1].to_float() if args.size() > 1 else 1.0 / 60.0 var delta: float = args[1].to_float() if args.size() > 1 else 1.0 / 60.0
if not is_finite(delta) or delta <= 0: if not is_finite(delta) or delta <= 0:
quit(1) quit(1)
@@ -36,12 +38,18 @@ func run():
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities) world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
world.state = initial.duplicate(true) world.state = initial.duplicate(true)
world.speed = speed world.speed = speed
world.profile_enabled = args.has("profile")
var elapsed: Array = [] var elapsed: Array = []
for cycle in 6: for cycle in 6:
var start: int = Time.get_ticks_usec() var start: int = Time.get_ticks_usec()
world.evolute(delta) world.evolute(delta)
elapsed.append((Time.get_ticks_usec() - start) / 1000.0) elapsed.append((Time.get_ticks_usec() - start) / 1000.0)
print("Speed %d, six consecutive %s-second steps, ms: %s" % [speed, delta, elapsed]) print("Speed %d, six consecutive %s-second steps, ms: %s" % [speed, delta, elapsed])
var total_ms: float = 0.0
for sample in elapsed: total_ms += sample
var throughput: float = 6.0 * delta / (total_ms / 1000.0)
print("Simulation throughput: %.3f real-time seconds processed per CPU second; needs >= 1.0 to keep up" % throughput)
if world.profile_enabled: print("CPU profile (usec, calls): ", world.profile)
for entity in world.catalog.entities.values(): entity.free() for entity in world.catalog.entities.values(): entity.free()
world.free() world.free()
quit() quit()
+51
View File
@@ -0,0 +1,51 @@
extends SceneTree
## Reproducible stress save; never writes to the player's user:// directory.
const E = preload("res://world/owniverse/math/exact.gd")
const State = preload("res://world/owniverse/civilization_state.gd")
func _initialize(): call_deferred("run")
func run():
var global: Node = root.get_node("Global")
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(global.OwniverseEntities)
world.speed = 6
world.state.time = {"datetime": 1000000000000000, "year": 1000000000000000, "tick_remainder": 0}
world.state.energy = E.of("1e100")
for id in world.catalog.entities:
world.state.amount[id] = E.of("6e60")
world.state.stats.total_amount[id] = world.state.amount[id]
if global.CivilizationRules.has(id): world.state.amount[id] = E.of("6e20")
world.state.amount.S = E.of("1e90")
world.state.amount.H = E.of("1e90")
world.state.amount.He = E.of("1e80")
world.state.amount.Met = E.of("1e80")
world.ledger.refresh_groups(world.state)
State.enforce_capacity(world, world.state, global.CivilizationRules, world.state.time.year)
State.reconcile(world, world.state, global.CivilizationRules)
var cohorts: int = 0
for id in world.catalog.entities:
if world.catalog.is_group(id): continue
var lifespan: Variant = State.effective_span(world, world.state, id, global.CivilizationRules)
if E.le(lifespan, 0): continue
world.state.batches[id] = []
var width: Variant = E.divide(lifespan, 10)
for i in 10:
var start: Variant = E.add(world.state.time.year, E.multiply(width, i))
var end: Variant = E.add(start, width)
var birth: Variant = E.subtract(start, lifespan)
world.state.batches[id].append({"amount": E.divide(world.state.amount[id], 10), "created_from": birth, "created_to": E.add(birth, width), "start_year": start, "end_year": end})
cohorts += 1
world.state.batch_origins[id] = world.state.batches[id][0].created_from
world.state.stats.total_amount = world.state.amount.duplicate(true)
var manager: Node = root.get_node("SaveManager")
var folder: String = ProjectSettings.globalize_path("res://tests/artifacts")
DirAccess.make_dir_recursive_absolute(folder)
manager.save_directory = folder
global.save_plaintext_copy = true
var success: bool = manager.save_data("all_objects_speed6", "qwerty", {"state": world.state, "simulation": world.frame_checkpoint(), "ui": {"current_page": 4}})
var empty: Array = []
for id in world.catalog.entities:
if E.le(world.state.amount.get(id, 0), 0): empty.append(id)
print("Full save: objects=%d civilization stages=%d cohorts=%d empty=%s success=%s" % [world.catalog.entities.size(), global.CivilizationRules.size(), cohorts, empty, success])
for entity in world.catalog.entities.values(): entity.free()
world.free()
quit(0 if success and empty.is_empty() else 1)
+1
View File
@@ -0,0 +1 @@
uid://1icskkk5nld8
+12
View File
@@ -0,0 +1,12 @@
extends "res://world/owniverse/object_ledger.gd"
var checks: int = 0
var failures: int = 0
func round_object_allocations(target: Dictionary, affected: Variant = null) -> void:
var reference: Dictionary = target.duplicate(true)
super.round_object_allocations(reference)
super.round_object_allocations(target, affected)
checks += 1
if not E.eq(target, reference):
failures += 1
push_error("Selective rounding differs from full rounding")
+1
View File
@@ -0,0 +1 @@
uid://csew6jyuiwxh0
+8
View File
@@ -1,4 +1,12 @@
extends "res://stage/stage.gd" extends "res://stage/stage.gd"
var actions_refreshes: int = 0
func tick_ui(delta: float) -> void:
super._process(delta)
func _set_active_page_actions() -> void:
actions_refreshes += 1
super._set_active_page_actions()
# Keep scene wiring and display logic, without accessing the player's save. # Keep scene wiring and display logic, without accessing the player's save.
func load_data() -> bool: func load_data() -> bool:
+4
View File
@@ -38,6 +38,10 @@ func run() -> void:
actions.set_actions("step", 123, func ( request ) : return E.multiply(E.floor_value(E.divide(request, 5)), 5)) actions.set_actions("step", 123, func ( request ) : return E.multiply(E.floor_value(E.divide(request, 5)), 5))
check(E.eq(actions.action_values.values(), [10, 100, 123, 0, 0]), "Unproducible small requests omitted") check(E.eq(actions.action_values.values(), [10, 100, 123, 0, 0]), "Unproducible small requests omitted")
check(E.eq(actions.action_labels[2].text, "120"), "Recipe preview displayed while original request retained") check(E.eq(actions.action_labels[2].text, "120"), "Recipe preview displayed while original request retained")
actions.mark_pending(123)
check(actions.action_labels[2].text == "…" and actions.action_labels[2].get_parent().get_node("TextureButton").disabled, "Queued action is visibly pending and cannot be duplicated")
actions.set_actions("step", 123, func ( request ) : return E.multiply(E.floor_value(E.divide(request, 5)), 5))
check(actions.action_labels[2].text == "120" and not actions.action_labels[2].get_parent().get_node("TextureButton").disabled, "Action refresh clears pending state")
var emitted: Array = [] var emitted: Array = []
actions.action_pressed.connect(func ( _page , amount ) : emitted.append(amount)) actions.action_pressed.connect(func ( _page , amount ) : emitted.append(amount))
actions._on_action_button_pressed(2) actions._on_action_button_pressed(2)
+57
View File
@@ -0,0 +1,57 @@
extends SceneTree
var checks: int = 0
var failures: int = 0
func _initialize() -> void:
call_deferred("run")
func check(condition: bool, message: String) -> void:
checks += 1
if not condition:
failures += 1
push_error(message)
func run() -> void:
var world = load("res://world/owniverse/owniverse.gd").new()
world.adaptive_cadence = false
world.update_adaptive_quality(250000)
check(world.adaptive_quality == 2, "A slow cycle selects the medium approximation")
world.update_adaptive_quality(250000)
check(world.adaptive_quality == 3, "A slow medium-approximation cycle selects the coarse mode")
check(world.adaptive_generation_phase == 1, "Coarse generation phase alternates")
for i in 36: world.update_adaptive_quality(100000)
check(world.adaptive_quality == 2, "Thirty consecutive recovery cycles lower quality by one level")
for i in 30: world.update_adaptive_quality(100000)
check(world.adaptive_quality == 1, "Sustained headroom lowers quality gradually")
for i in 30: world.update_adaptive_quality(100000)
check(world.adaptive_quality == 0, "The exact mode returns after sustained headroom")
var cadence_world = load("res://world/owniverse/owniverse.gd").new()
for i in 3: cadence_world.update_adaptive_quality(350000)
check(cadence_world.cadence_level == 3, "Sustained 350 ms cycles select the 2 Hz cadence")
check(is_equal_approx(cadence_world.frame_step_seconds, 0.5), "The lowest cadence uses a 0.5 second frame step")
cadence_world.free()
var rows: Array = []
for node in 12:
var edges: Dictionary = {}
var outgoing: float = 0.0
if node < 6:
edges[node + 6] = 0.25
outgoing = 0.25
rows.append({"edges": edges, "outgoing": outgoing})
var generator: Dictionary = {"rows": rows, "index": {"source": 0}}
var solved: Dictionary = world.civilization_flow._solve_single_step(generator, "source", 2.0)
for ethic in 6:
var mass: float = 0.0
var occupation: float = 0.0
for node in range(ethic, 12, 6):
mass += solved.mass[node]
occupation += solved.occupation[node]
check(absf(mass - 1.0) < 1e-12, "Approximate transition conserves ethic mass %d" % ethic)
check(absf(occupation - 2.0) < 1e-12, "Approximate transition conserves integrated time %d" % ethic)
world.free()
print("Adaptive quality: %d checks, %d failures" % [checks, failures])
quit(1 if failures else 0)
+1
View File
@@ -0,0 +1 @@
uid://ct356urggcgal
+9
View File
@@ -88,6 +88,15 @@ func run() -> void:
manager.flush_saves() manager.flush_saves()
check(E.eq(manager.load_data("incompatible", "test-password").state, data.state), "New format saves and reloads after incompatible file") check(E.eq(manager.load_data("incompatible", "test-password").state, data.state), "New format saves and reloads after incompatible file")
var readable_path: String = directory.path_join("readable-incompatible.adventure")
var readable = FileAccess.open_encrypted_with_pass(readable_path, FileAccess.WRITE, "test-password")
readable.store_var(manager._snapshot("readable-incompatible", "test-password", data).payload, false)
readable.close()
manager.blocked_saves["readable-incompatible"] = true
check(manager.archive_incompatible_save("readable-incompatible"), "Readable incompatible save is archived")
check((not FileAccess.file_exists(readable_path)) and FileAccess.file_exists(E.add(readable_path, ".incompatible.bak")), "Archived save no longer occupies the active path")
check(not manager.blocked_saves.has("readable-incompatible"), "Archiving an incompatible save permits a fresh save")
# Expected failures below must leave the last good encrypted file intact. # Expected failures below must leave the last good encrypted file intact.
data.state.energy = E.neg(1) data.state.energy = E.neg(1)
manager.request_save("latest", "test-password", data) manager.request_save("latest", "test-password", data)
+153
View File
@@ -38,6 +38,43 @@ func dispose(world) -> void:
func run() -> void: func run() -> void:
var world = fixture() var world = fixture()
world.catalog.entities.N.lifespan = 100
world.batches.append_batch(world.state, "N", 2, 10, 10)
world.batches.append_batch(world.state, "N", 3, 10, 10)
check(world.state.batches.N.size() == 1 and E.eq(world.state.batches.N[0].amount, 5), "Repeated insertion merges using the cohort index")
world.batches.append_batch(world.state, "N", 1, 0, 0)
check(E.eq(world.state.batches.N[0].created_from, 0), "Earlier insertion preserves chronological order")
var replaced: Array = world.state.batches.N.duplicate(true)
world.state.batches.N = replaced
world.batches.append_batch(world.state, "N", 7, 10, 10)
check(E.eq(replaced[1].amount, 12), "Replacing cohort array invalidates cached references")
var separate: Dictionary = world.state.duplicate(true)
world.batches.append_batch(separate, "N", 9, 10, 10)
check(E.eq(separate.batches.N[1].amount, 21) and E.eq(world.state.batches.N[1].amount, 12), "Index is isolated between transaction states")
dispose(world)
world = fixture()
for speed in range(1, 7):
world.state.speed = speed
check(E.eq(world.batches.window_duration(world.state, 100), 2.5 if speed < 4 else pow(10, speed - 2)), "Windows follow selected speed")
check(E.eq(world.batches.window_duration(world.state, 5), 5), "Short explosions retain their timing")
var huge: Variant = E.of("10000000000000000000000000000000000000000")
world.catalog.entities.N.lifespan = 100
world.state.batches.N = [
{"amount": huge, "start_year": 100, "end_year": 110, "created_from": 0, "created_to": 10, "withdraw_remainder": 0.25},
{"amount": 7, "start_year": 120, "end_year": 130, "created_from": 20, "created_to": 30, "withdraw_remainder": 0.5}
]
world.batches.coarsen(world.state)
check(world.state.batches.N.size() == 1, "High speed combines nearby cohorts")
check(E.eq(world.state.batches.N[0].amount, E.add(huge, 7)), "Coarsening preserves exact large whole counts")
check(E.eq(world.state.batches.N[0].withdraw_remainder, 0.75), "Coarsening preserves withdrawal carry")
var combined: Dictionary = world.state.batches.N[0].duplicate(true)
world.batches.coarsen(world.state)
check(world.state.batches.N[0] == combined, "Coarsening is idempotent")
world.state.speed = 1
world.batches.coarsen(world.state)
check(world.state.batches.N[0] == combined, "Slowing down does not invent finer history")
dispose(world)
world = fixture()
world.state.batch_origins.LGRB = E.of("10357034.80000000074505806") world.state.batch_origins.LGRB = E.of("10357034.80000000074505806")
var boundary: Variant = E.of("41215289.79999999701976776") var boundary: Variant = E.of("41215289.79999999701976776")
for interval in [[E.subtract(boundary, E.of("2.5")), E.add(boundary, E.of("2.25"))], [boundary, E.add(boundary, 2)]]: for interval in [[E.subtract(boundary, E.of("2.5")), E.add(boundary, E.of("2.25"))], [boundary, E.add(boundary, 2)]]:
@@ -54,5 +91,121 @@ func run() -> void:
check(E.eq(total, 100), "Boundary correction preserves all objects") check(E.eq(total, 100), "Boundary correction preserves all objects")
check(E.le(world.state.batches.LGRB.size(), 7), "Finite number of windows") check(E.le(world.state.batches.LGRB.size(), 7), "Finite number of windows")
dispose(world) dispose(world)
world = fixture()
world.batches.append_batch(world.state, "N", 100, 100, 100)
var first: Dictionary = world.state.batches.N[0].duplicate(true)
world.batches.append_batch(world.state, "N", 7, 100, 100)
check(world.state.batches.N.size() == 1 and E.eq(world.state.batches.N[0].amount, 107), "Repeated births merge directly into one window")
check(E.eq(world.state.batches.N[0].start_year, first.start_year), "Direct merge preserves transition time")
check(world.batches.withdraw_batches(world.state, "N", 0).is_empty(), "Future cohorts are not withdrawn")
var untouched: Array = world.state.batches.N
check(world.batches.withdraw_batches(world.state, "N", 1).is_empty() and is_same(untouched, world.state.batches.N), "Readiness index skips future cohorts")
world.state.batches.N = [{"amount": 7, "start_year": 0, "end_year": 0, "created_from": 0, "created_to": 0}]
check(world.batches.withdraw_batches(world.state, "N", 1).size() == 1, "Replacing cohorts invalidates readiness index")
world.batches.append_batch(world.state, "N", 3, 100, 100)
check(E.eq(world.state.batches.N[0].amount, 3), "Replacing cohorts invalidates instant merge cache")
world.batches.withdraw_batches(world.state, "N", 0)
world.batches.scale_batches(world.state, "N", 0)
world.batches.withdraw_batches(world.state, "N", 1)
check(world.state.batches.N.is_empty(), "Scaling invalidates readiness and removes zero cohorts")
dispose(world)
for selected_speed in [4, 5, 6]:
world = fixture()
world.speed = selected_speed
world.state.time = {"datetime": 37, "year": 37}
var cycle_width: Variant = E.multiply(E.power(10, selected_speed - 1), E.of("0.2"))
world.catalog.entities.HG.lifespan = E.multiply(cycle_width, 3)
world.state.batches = {}
var life: Variant = world.batches.effective_lifespan(world.state, "HG")
var deadline: Variant = E.add(37, E.multiply(cycle_width, 4))
world.batches.append_batch(world.state, "HG", huge, E.add(37, 1), E.add(37, 1))
world.batches.append_batch(world.state, "HG", 7, E.add(37, 2), E.add(37, 2))
check(world.state.batches.HG.size() == 1 and E.eq(world.state.batches.HG[0].amount, E.add(huge, 7)), "Births in the same death cycle merge exactly")
var point: Dictionary = world.state.batches.HG[0]
check(E.eq(point.start_year, deadline) and E.eq(point.end_year, deadline), "High-speed stellar cohort transitions at one cycle boundary")
var born: Variant = E.add(37, 1)
var delay: Variant = E.subtract(deadline, E.add(born, life))
check(E.ge(delay, 0) and E.le(delay, cycle_width), "Transition is delayed by at most one cycle")
var encoded: Dictionary = E.decode(E.encode(world.state))
check(E.eq(encoded.batches, world.state.batches), "Cycle cohorts survive exact save roundtrip")
check(world.batches.withdraw_batches(world.state, "HG", E.subtract(deadline, 1)).is_empty(), "Cycle cohort is not withdrawn partially")
var expired: Array = world.batches.withdraw_batches(world.state, "HG", deadline)
check(expired.size() == 1 and E.eq(expired[0].amount, E.add(huge, 7)) and world.state.batches.HG.is_empty(), "Boundary withdraws the exact whole cohort once")
check(world.batches.withdraw_batches(world.state, "HG", deadline).is_empty(), "Repeated boundary cannot withdraw twice")
world.batches.append_batch(world.state, "HG", 3, E.add(37, 1), E.add(37, 1))
check(E.eq(world.state.batches.HG[0].amount, 3), "Withdrawal invalidates cycle insertion references")
world.state.batches.HG = []
world.batches.append_batch(world.state, "HG", 11, 37, E.add(37, E.multiply(cycle_width, 3)))
var total: Variant = 0
for batch: Dictionary in world.state.batches.HG:
total = E.add(total, batch.amount)
check(E.eq(batch.start_year, batch.end_year), "Distributed births create point cohorts")
check(E.eq(total, 11) and world.state.batches.HG.size() == 3, "Distributed births retain all integers across death cycles")
var before_coarsen: Dictionary = world.state.duplicate(true)
world.batches.coarsen(world.state)
check(E.eq(before_coarsen, world.state), "Coarsening cannot smear point stellar transitions")
world.state.batches.HG = []
var completed: Dictionary = {}
var cutoff: Variant = E.add(37, E.multiply(cycle_width, 10))
var integral: Variant = world.batches.append_batch(world.state, "HG", 11, 37, E.add(37, E.multiply(cycle_width, 3)), completed, cutoff)
var reference_integral: Variant = 0
total = 0
for part: Dictionary in completed.HG:
total = E.add(total, part.amount)
reference_integral = E.add(reference_integral, E.multiply(part.amount, E.subtract(cutoff, part.to)))
reference_integral = E.subtract(E.multiply(11, E.subtract(cutoff, E.add(37, E.multiply(cycle_width, E.of("1.5"))))), reference_integral)
check(E.eq(total, 11) and world.state.batches.HG.is_empty(), "Already completed stars retain counts without stored batches")
check(E.eq(integral, reference_integral), "Lifetime production agrees with point transitions")
world.speed = 1
world.state.batches.HG = []
world.batches.append_batch(world.state, "HG", 10, 100, 100)
check(E.gt(world.state.batches.HG[0].end_year, world.state.batches.HG[0].start_year), "Low speed retains gradual stellar transitions")
dispose(world)
world = fixture()
world.speed = 6
world.state.amount.RHG = 5
world.batches.append_batch(world.state, "RHG", 5, 0, 0)
world.ledger.refresh_groups(world.state)
var validation: String = root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state})
check(validation.is_empty(), "Cycle-star state born at zero validates: " + validation)
var lifespan: Variant = world.batches.effective_lifespan(world.state, "RHG")
check(E.eq(world.state.batches.RHG[0].start_year, lifespan), "Birth exactly aligned with a death boundary adds no extra cycle")
dispose(world)
world = fixture()
world.speed = 6
world.state.batches.RD = []
world.batches.append_batch(world.state, "RD", huge, 0, 2000000)
check(world.state.batches.RD.size() == 1, "Long-lived stars are not subdivided into cycle buckets")
var long_cohort: Dictionary = world.state.batches.RD[0].duplicate(true)
world.batches.append_batch(world.state, "RD", 7, 10000, 20000)
check(world.state.batches.RD.size() == 1 and E.eq(world.state.batches.RD[0].amount, E.add(huge, 7)), "New births still merge into their original wide stellar group")
check(E.eq(world.state.batches.RD[0].start_year, long_cohort.start_year) and E.eq(world.state.batches.RD[0].end_year, long_cohort.end_year), "Long-lived transition interval is preserved")
world.state.batches.RD = [
{"amount": huge, "start_year": 1000, "end_year": 2000, "withdraw_remainder": 0.25},
{"amount": 7, "start_year": 3000, "end_year": 4000, "withdraw_remainder": 0.5},
{"amount": 9, "start_year": 19000, "end_year": 21000},
{"amount": 11, "start_year": 22000, "end_year": 1000000},
{"amount": 13, "start_year": 21000, "end_year": 22000},
]
var spanning: Dictionary = world.state.batches.RD[2].duplicate(true)
var wide: Dictionary = world.state.batches.RD[3].duplicate(true)
world.batches.coarsen(world.state)
check(world.state.batches.RD.size() == 4, "Only cohorts ending entirely within the same cycle are merged")
var merged: Dictionary = {}
var broad_kept: bool = false
var crossing_kept: bool = false
for batch: Dictionary in world.state.batches.RD:
if E.eq(batch.start_year, 20000) and E.eq(batch.end_year, 20000): merged = batch
if E.eq(batch, wide): broad_kept = true
if E.eq(batch, spanning): crossing_kept = true
check(not merged.is_empty() and E.eq(merged.amount, E.add(huge, 7)) and E.eq(merged.withdraw_remainder, 0.75), "Merged stellar cohort retains exact population and carries")
check(broad_kept and crossing_kept, "Wide and cycle-crossing cohorts remain unchanged")
var once: Dictionary = world.state.duplicate(true)
world.batches.coarsen(world.state)
check(E.eq(world.state, once), "Dynamic stellar merging is idempotent")
world.state.batches.HG = [{"amount": 3, "start_year": 20000, "end_year": 20000}, {"amount": 4, "start_year": 20001, "end_year": 21000}]
world.batches.coarsen(world.state)
check(world.state.batches.HG.size() == 2, "An exact boundary belongs to the preceding cycle")
dispose(world)
print(("Batch boundaries: %d checks, %d failures" % [checks, failures])) print(("Batch boundaries: %d checks, %d failures" % [checks, failures]))
quit((0 if E.eq(failures, 0) else 1)) quit((0 if E.eq(failures, 0) else 1))
+95 -124
View File
@@ -1,165 +1,136 @@
extends SceneTree extends SceneTree
const E = preload("res://world/owniverse/math/exact.gd") const E = preload("res://world/owniverse/math/exact.gd")
const Clock = preload("res://world/owniverse/simulation_time.gd") const State = preload("res://world/owniverse/civilization_state.gd")
var checks: int = 0 var checks: int = 0
var failures: int = 0 var failures: int = 0
func _initialize() -> void: func _initialize(): call_deferred("run")
call_deferred("run") func check(value: bool, message: String) -> void:
checks += 1
func check(condition: bool, message: String) -> void: if not value:
checks = E.add(checks, 1) failures += 1
if (not condition):
failures = E.add(failures, 1)
push_error(message) push_error(message)
func fixture(): func fixture():
var world = load("res://world/owniverse/owniverse.gd").new() var world = load("res://world/owniverse/owniverse.gd").new()
var global: Node = root.get_node("Global") world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
for id in global.OwniverseEntities: for id in world.catalog.entities:
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.amount[id] = 0
world.state.stats.total_amount[id] = 0 world.state.stats.total_amount[id] = 0
if E.ne(entity.group_as, ""): for id in ["RD", "OD", "YD", "WYD", "BG", "TWD", "SNS", "MGT", "BH25", "SMBH", "SCD", "SCS", "SCM", "SCL", "SCG", "GED", "GES", "GEM", "GEL", "GEG", "LGG", "LSC", "LGF", "LGW", "LUB"]:
world.state.amount[entity.group_as] = 0 if world.state.amount.has(id): world.state.amount[id] = E.of("1e60")
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 return world
func dispose(world) -> void: func dispose(world):
for entity in world.catalog.entities.values(): for entity in world.catalog.entities.values(): entity.free()
entity.free()
world.free() world.free()
func seed_population(world, id: String, count: Variant, time: Variant = 1.0) -> void: func population(world) -> Variant:
world.state.amount.N = 0
world.state.amount[id] = count
world.state.batches[id] = [{"amount": count, "start_year": time, "end_year": time}]
world.evolution.initialize_life_batches()
func sum_ethics(world, id: String) -> Variant:
var result: Variant = 0 var result: Variant = 0
for n in world.state.ethics.get(id, {}).values(): result = E.add(result, n) for id in world.ledger.physical_amounts(world.state):
if root.get_node("Global").CivilizationRules.has(id) or world.catalog.entities[id].group_as == "Planet":
result = E.add(result, world.ledger.physical_amount(world.state, id))
return result return result
func invariants(world) -> void: func invariants(world) -> void:
var physical: Dictionary = world.ledger.physical_amounts(world.state) var physical: Dictionary = world.ledger.physical_amounts(world.state)
for id in physical:
check(E.ge(physical[id], 0) and E.eq(physical[id], E.floor_value(physical[id])), "Physical counts remain nonnegative whole: " + id)
for id in world.state.ethics: for id in world.state.ethics:
check(E.eq(sum_ethics(world, id), physical.get(id, 0)), E.add("Ethics equal physical population for ", id)) var total: float = 0.0
for n in world.state.ethics[id].values(): for value in world.state.ethics[id].values():
if (E.lt(n, 0) or E.ne(n, E.floor_value(n))): check(false, "Invalid ethic amount") check(is_finite(value) and value >= 0.0 and value <= 1.0, "Finite normalized ethic shares")
check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Civilization state validates") total += value
check(absf(total - 1.0) < 1e-12, "Ethic shares sum to one: " + id)
func run() -> void: func configure(rules: Dictionary, progress: float, degradation: float, span: int = 100) -> void:
for id in rules:
if rules[id].ethics.is_empty(): continue
rules[id].span = span
rules[id].fights = false
rules[id].colonizes = false
rules[id].diplomacy = false
for row in rules[id].ethics.values():
row.progress = progress
row.degradation = degradation
row.war = 0
row.colonization = 0
row.fall = rules[id].previous + ":1"
func run():
var global: Node = root.get_node("Global") var global: Node = root.get_node("Global")
var baseline: Dictionary = global.CivilizationRules.duplicate(true) var baseline: Dictionary = global.CivilizationRules.duplicate(true)
configure(global.CivilizationRules, 1.0, 0.0)
var world = fixture() var world = fixture()
seed_population(world, "C0.2", 60000) var count: Variant = E.of("10000000000000000000000000000000000000007")
world.evolution.evolve_batches(world.state, 1) world.state.amount["C0.2"] = count
check(E.gt(world.state.amount["C0.3"], 0), "C0.2 actually progresses") world.state.ethics["C0.2"] = State.empty_profile()
check(E.gt(world.state.amount["C0.1"], 0), "C0.2 actually degrades") world.civilization_flow.evolve(world.state, 0, 100)
check(E.eq(world.state.civilization_stats.get("wars", 0), 0), "Table disables early wars") check(E.eq(population(world), count), "Continuous chain conserves arbitrary-size whole population")
check(E.eq(E.add(E.add(world.state.amount["C0.2"], world.state.amount["C0.3"]), world.state.amount["C0.1"]), 60000), "Ordinary evolution conserves population") check(absf(E.approx(E.divide(world.state.amount["C0.2"], count)) - exp(-1.0)) < 1e-12, "Survival follows the exponential interval law")
check(E.eq(world.state.stats.total_amount["C0.2"], 0), "Survivors do not count as new civilizations") check(E.gt(world.state.amount["C0.4"], 0), "One interval includes multiple successive stages")
check(E.gt(world.state.civilization_stats.worship, 0), "Worship derived from surviving ethics") check(not world.state.batches.has("C0.2") and not world.state.batches.has("C0.3"), "Civilizations do not create age batches")
invariants(world) invariants(world)
var restored = fixture() var half = fixture()
restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state)))) half.state.amount["C0.2"] = count
world.evolution.evolve_batches(world.state, 2100) half.state.ethics["C0.2"] = State.empty_profile()
restored.evolution.evolve_batches(restored.state, 2100) half.civilization_flow.evolve(half.state, 0, 50)
check(E.eq(world.state, restored.state), "Save resumes deterministic ethical evolution") half.civilization_flow.evolve(half.state, 50, 100)
invariants(world) for id in global.CivilizationRules:
dispose(restored) check(E.approx(E.divide(E.absolute(E.subtract(world.state.amount.get(id, 0), half.state.amount.get(id, 0))), count)) < 1e-12, "Splitting the interval preserves continuous dynamics: " + id)
dispose(half)
dispose(world) dispose(world)
configure(global.CivilizationRules, 0.0, 0.0)
world = fixture() world = fixture()
world.state.amount.RD = 100000000 world.state.amount["C0.2"] = 10001
seed_population(world, "C2.0", 60000) world.state.ethics["C0.2"] = {"m": 1.0, "l": 0.0, "w": 0.0, "d": 0.0, "c": 0.0, "b": 0.0}
world.state.amount["C1.9"] = 10000 world.civilization_flow.evolve(world.state, 0, 100)
world.evolution.initialize_life_batches() check(E.eq(world.state.amount["C0.2"], 10001), "Disabled stage movement retains every individual")
world.evolution.evolve_batches(world.state, 1) check(world.state.ethics["C0.2"].m < 1.0 and world.state.ethics["C0.2"].m > 0.9, "Analytical drift changes shares without materializing populations")
check(E.gt(world.state.civilization_stats.wars, 0), "Wars execute when enabled")
check(E.gt(world.state.civilization_stats.collateral, 0), "Wars affect previous-stage populations")
check(E.gt(world.state.amount["C2.1"], 0), "Winners and peaceful progress reach next stage")
invariants(world) invariants(world)
dispose(world) dispose(world)
configure(global.CivilizationRules, 1.0, 0.0)
world = fixture() world = fixture()
world.state.amount.RD = 1 for id in ["RD", "OD", "YD", "WYD"]: world.state.amount[id] = 0
world.state.binds.RD = {"HP": 5, "GG": 5, "AB": 5, "RP": 5} world.state.amount["C1.9"] = 101
seed_population(world, "C1.6", 60000) world.civilization_flow.evolve(world.state, 0, 100)
for row : Dictionary in global.CivilizationRules["C1.6"].ethics.values(): row.degradation = "0" check(E.eq(world.state.amount["C1.9"], 101), "Unfunded interstellar flows return to their source")
world.evolution.evolve_batches(world.state, 1) check(E.eq(population(world), 101), "Resource admission conserves exact population")
var after: Dictionary = world.ledger.physical_amounts(world.state) dispose(world)
check(E.eq(world.state.civilization_stats.colonies, 20), "Colonization limited to real targets")
check(E.eq(E.add(E.add(E.add(after.HP, after.GG), after.AB), after.RP), 0), "Colonized objects consumed once") configure(global.CivilizationRules, 0.0, 0.0, 1)
check(E.eq(world.state.binds.RD.get("C1.4", 0), 20), "Colonies retain target host and use two-stages-earlier level") world = fixture()
var totals: Variant = 0 world.state.amount["C1.6"] = 60000
for id in after: world.state.binds.RD = {"HP": 5, "RP": 5, "GG": 5, "AB": 5}
if E.eq(world.catalog.entities[id].group_as, "Planet"): totals = E.add(totals, after[id]) global.CivilizationRules["C1.6"].colonizes = true
check(E.eq(totals, 60020), "Colonization replaces planets, does not create extra worlds") for row in global.CivilizationRules["C1.6"].ethics.values(): row.colonization = 1
world.civilization_flow.evolve(world.state, 0, 1)
check(E.eq(world.state.civilization_stats.colonies, 20), "Integrated colonization is limited by real planet stock")
check(E.eq(world.state.binds.RD.get("C1.4", 0), 20), "Colonies retain the target stellar owner")
check(E.eq(population(world), 60020), "Colonization creates precisely the consumed number of occupied worlds")
var physical: Dictionary = world.ledger.physical_amounts(world.state)
for resource in ["HP", "RP", "GG", "AB"]: check(E.eq(physical[resource], 0), "Planet stock consumed once: " + resource)
invariants(world) invariants(world)
dispose(world) dispose(world)
global.CivilizationRules = baseline.duplicate(true) global.CivilizationRules = baseline.duplicate(true)
world = fixture() world = fixture()
world.state.amount.RD = E.of("1e25") world.state.amount["C2.0"] = 60000
world.state.amount.BG = E.of("1e25") world.state.amount["C1.9"] = 10000
world.state.amount.TWD = E.of("1e25") world.civilization_flow.evolve(world.state, 0, 20000)
world.state.amount.SNS = E.of("1e25") check(E.gt(world.state.civilization_stats.wars, 0), "War rewards integrate encounters during the interval")
world.state.amount.MGT = E.of("1e25") check(E.gt(world.state.civilization_stats.collateral, 0), "Collateral damage reaches previous stages")
world.state.amount.BH25 = E.of("1e25") check(E.eq(population(world), 70000), "War outcomes and collateral conserve occupied-world counts")
world.state.amount.SMBH = E.of("1e26")
for id in world.catalog.entities:
if E.ne(world.catalog.entities[id].claim, ""): world.state.amount[id] = E.of("1e12")
# Accelerated deterministic fixture traverses every enabled stage, including Ct.
for id in global.CivilizationRules:
if E.eq(id, "Ct"): continue
global.CivilizationRules[id].fights = false
global.CivilizationRules[id].colonizes = false
global.CivilizationRules[id].diplomacy = false
for row : Dictionary in global.CivilizationRules[id].ethics.values():
row.progress = "1"
row.degradation = "0"
world.catalog.entities[id].lifespan = 1
world.catalog.entities[id].lifespan_delta = 1
global.CivilizationRules[id].span = 1
seed_population(world, "C0.2", 6)
world.evolution.evolve_batches(world.state, 1000)
check(E.eq(world.state.amount.Ct, 6), "Complete C0.2 -> C4.4 -> Ct chain runs")
check((not world.state.batches.has("Ct")), "Transcendence is terminal")
invariants(world) invariants(world)
var restored = fixture()
restored.state = E.decode(E.encode(world.state))
world.civilization_flow.evolve(world.state, 20000, 30000)
restored.civilization_flow.evolve(restored.state, 20000, 30000)
check(E.eq(world.state, restored.state), "Save resume reproduces flow populations and carries")
dispose(restored)
dispose(world) dispose(world)
global.CivilizationRules = baseline global.CivilizationRules = baseline
print("Civilization flows: %d checks, %d failures" % [checks, failures])
world = fixture() quit(1 if failures else 0)
world.state.amount.RD = 10000
world.state.amount.SCS = 1
world.state.amount["C2.4"] = 1
world.evolution.initialize_life_batches()
var span: Variant = world.state.batches["C2.4"][0].start_year
check(E.near(span, E.divide(20000, E.of("3.6"))), "Structure bonus shortens newly registered lifespan")
dispose(world)
var evolution = load("res://world/owniverse/civilization_evolution.gd")
var balanced: Dictionary = {"m": 10000, "l": 10000, "w": 10000, "d": 10000, "c": 10000, "b": 10000}
var neutral: Dictionary = evolution.drift({}, "test", balanced, global.CivilizationRules["C2.0"].ethics)
var diplomatic: Dictionary = evolution.drift({}, "test", balanced, global.CivilizationRules["C2.0"].ethics, true)
check(E.eq(neutral, balanced), "Ordinary drift preserves balanced ethics")
check(E.gt(diplomatic.d, diplomatic.w), "Diplomacy uses per-ethic influence")
check(E.eq(evolution.total(diplomatic), 60000), "Diplomacy conserves population")
world = fixture()
world.state.amount.RD = E.of("1e15")
world.state.amount.BG = E.of("1e15")
world.state.amount["C3.0"] = 6
world.evolution.initialize_life_batches()
check((E.eq(world.state.amount["C3.0"], 0) and E.eq(world.state.amount["C2.9"], 6)), "Missing mandatory structures degrade existing civilizations")
invariants(world)
dispose(world)
print(("Civilization evolution: %d checks, %d failures" % [checks, failures]))
quit((0 if E.eq(failures, 0) else 1))
+15 -9
View File
@@ -48,18 +48,23 @@ func run() -> void:
world.evolution.initialize_life_batches() 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.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(E.eq(world.state.binds.RD["C1.9"], 3), "Planetary civilizations retain their host")
check(E.eq(world.state.ethics["C0.2"], {"m": 2, "l": 2, "w": 1, "d": 1, "c": 1, "b": 1}), "Migration uses equal ethics and deterministic remainder") 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.eq(n, 2)), "Bound civilization ethics count physical population") 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) var before: Dictionary = world.state.duplicate(true)
world.evolution.initialize_life_batches() world.evolution.initialize_life_batches()
check(E.eq(world.state, before), "Repeated initialization preserves ethics") 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.state.ethics["C0.2"] = {"m": 8, "l": 0, "w": 0, "d": 0, "c": 0, "b": 0}
world.evolution.initialize_life_batches() world.evolution.initialize_life_batches()
check(E.eq(world.state.ethics["C0.2"].m, 8), "Existing unequal distribution is retained") check(E.eq(world.state.ethics["C0.2"].m, 1.0), "Existing unequal distribution is retained")
world.state.amount["C0.2"] = 3 world.state.amount["C0.2"] = 3
world.evolution.initialize_life_batches() world.evolution.initialize_life_batches()
check(E.eq(world.state.ethics["C0.2"].m, 3), "Losses reduce ethics without inventing population") check(E.eq(world.state.ethics["C0.2"].m, 1.0), "Losses retain normalized ethical composition")
check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Ethics state validates") 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() var restored = fixture()
restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state)))) restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state))))
restored.evolution.initialize_life_batches() restored.evolution.initialize_life_batches()
@@ -74,7 +79,8 @@ func run() -> void:
row.colonization = "0" row.colonization = "0"
world.state.binds.RD = {"C1.9": 10} world.state.binds.RD = {"C1.9": 10}
world.state.batches["C1.9"] = [{"amount": 10, "start_year": 1, "end_year": 1}] world.state.batches["C1.9"] = [{"amount": 10, "start_year": 1, "end_year": 1}]
world.evolution.evolve_batches(world.state, 1) global.CivilizationRules["C1.9"].span = E.of("0.001")
world.civilization_flow.evolve(world.state, 0, 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") 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) dispose(world)
var capacity = load("res://world/owniverse/civilization_state.gd") var capacity = load("res://world/owniverse/civilization_state.gd")
@@ -117,7 +123,7 @@ func run() -> void:
world.evolution.initialize_life_batches() world.evolution.initialize_life_batches()
check(E.eq(world.state.amount["C4.2"], 2), "SMBH capacity uses stellar mass equivalent") 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(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": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Capacity-limited state validates") 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) dispose(world)
world = fixture() world = fixture()
@@ -128,7 +134,7 @@ func run() -> void:
row.colonization = "0" row.colonization = "0"
world.state.binds.RD = {"C1.9": 5} world.state.binds.RD = {"C1.9": 5}
world.state.batches["C1.9"] = [{"amount": 5, "start_year": 1, "end_year": 1}] world.state.batches["C1.9"] = [{"amount": 5, "start_year": 1, "end_year": 1}]
world.evolution.evolve_batches(world.state, 1) world.civilization_flow.evolve(world.state, 0, 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") 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) dispose(world)
print(("Civilization state: %d checks, %d failures" % [checks, failures])) print(("Civilization state: %d checks, %d failures" % [checks, failures]))
+83
View File
@@ -0,0 +1,83 @@
extends SceneTree
const E = preload("res://world/owniverse/math/exact.gd")
var checks: int = 0
var failures: int = 0
func _initialize(): call_deferred("run")
func check(condition: bool, message: String):
checks += 1
if not condition:
failures += 1
push_error(message)
func fixture(id: String, speed: int):
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
for entity in world.catalog.entities.values():
world.state.amount[entity.id] = 0
world.state.stats.total_amount[entity.id] = 0
if entity.group_as != "":
world.state.amount[entity.group_as] = 0
world.state.stats.total_amount[entity.group_as] = 0
world.state.amount.RD = 1
world.state.binds.RD = {id: 40000}
world.state.batches[id] = [{"amount": 40000, "start_year": 1, "end_year": 1}]
# A saved origin off the new grid must not backdate rounded successors.
world.state.batch_origins[id] = 500
world.speed = speed
world.profile_enabled = true
return world
func dispose(world):
for entity in world.catalog.entities.values(): entity.free()
world.free()
func run():
for id in ["C0.0", "C0.1", "C0.2"]:
var world = fixture(id, 6)
world.evolution.evolute_to_datetime(10000)
var physical: Dictionary = world.ledger.physical_amounts(world.state)
var population: Variant = 0
for stage in physical:
if world.catalog.entities[stage].group_as == "Planet":
population = E.add(population, physical[stage])
check(E.eq(population, 40000), "Coarse transitions preserve all whole populations: " + id)
for batches: Array in world.state.batches.values():
for batch: Dictionary in batches:
check(E.gt(batch.start_year, 10000), "Successors cannot expire inside their birth bucket: " + id)
if id == "C0.0":
check(E.eq(physical.get("C0.0", 0), 38300), "C0.0 attempts evolution once")
check(E.eq(physical.get("C0.1", 0), 700), "C0.0 progress rate is applied once")
check(E.eq(physical.get("EON5", 0), 1000), "C0.0 degradation rate is applied once")
elif id == "C0.1":
check(E.eq(physical.get("C0.1", 0), 38300), "C0.1 attempts evolution once")
check(E.eq(physical.get("C0.2", 0), 700), "C0.1 successor does not immediately attempt again")
else:
check(world.profile.civilization_flow_plan[1] == 1, "Ethical civilization uses one continuous interval plan")
var before: Dictionary = world.state.duplicate(true)
world.evolution.evolute_to_datetime(10000)
check(E.eq(world.state, before), "Repeating completed clock does not repeat transitions")
var validation: String = root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state})
check(validation.is_empty(), "Coarse state validates: " + validation)
world.evolution.evolute_to_datetime(20000)
if id in ["C0.0", "C0.1"]:
check(E.lt(world.ledger.physical_amounts(world.state)[id], 38300), "The next bucket still processes legitimate evolution: " + id)
dispose(world)
var fine = fixture("C0.0", 1)
fine.evolution.evolute_to_datetime(10000)
check(E.lt(fine.ledger.physical_amounts(fine.state)["C0.0"], 38300), "Low speeds retain multiple chronological generations")
dispose(fine)
var large = fixture("C0.0", 6)
var count: Variant = E.of("10000000000000000000000000000000000000001")
large.state.binds.RD["C0.0"] = count
large.state.batches["C0.0"][0].amount = count
var reference: Dictionary = large.state.duplicate(true)
var products: Dictionary = large.life.life_products(reference, large.catalog.entities["C0.0"], count)
large.evolution.evolute_to_datetime(10000)
var physical: Dictionary = large.ledger.physical_amounts(large.state)
for id in products:
check(E.eq(physical.get(id, 0), products[id]), "Large whole population undergoes one transition: " + id)
check(E.eq(large.state.life_remainders, reference.life_remainders), "Coarse timing preserves the single attempt's fractional carry")
dispose(large)
print("Coarse generations: %d checks, %d failures" % [checks, failures])
quit(1 if failures else 0)
+1
View File
@@ -0,0 +1 @@
uid://ggml5q061lwh
+4
View File
@@ -31,6 +31,10 @@ func run():
verify(not E.eq(E.of("1e1000"), INF), "huge number is not infinity") verify(not E.eq(E.of("1e1000"), INF), "huge number is not infinity")
verify(E.eq(E.floor_sum(huge, 2, 1, 2), E.divide(E.multiply(huge, E.subtract(huge, 1)), 2)), "floor sum supports huge window counts") verify(E.eq(E.floor_sum(huge, 2, 1, 2), E.divide(E.multiply(huge, E.subtract(huge, 1)), 2)), "floor sum supports huge window counts")
var rows = JSON.parse_string(FileAccess.get_file_as_string("res://tests/fixtures/big_integer_oracle.json")) var rows = JSON.parse_string(FileAccess.get_file_as_string("res://tests/fixtures/big_integer_oracle.json"))
for row in rows.slice(0, 20):
var scaled = B.divmod(B.parse(row[0] + "000000000000000000"), B.parse(row[1] + "000000000000000000"))
verify(B.decimal(scaled[0]) == row[4], "cancel shared blocks preserves quotient")
verify(B.compare(scaled[1], B.multiply(B.parse(row[5]), B.parse("1000000000000000000"))) == 0, "cancel shared blocks restores original remainder")
for row in rows: for row in rows:
var a: Array = B.parse(row[0]) var a: Array = B.parse(row[0])
var b: Array = B.parse(row[1]) var b: Array = B.parse(row[1])
+44
View File
@@ -0,0 +1,44 @@
extends SceneTree
var checks: int = 0
var failures: int = 0
func _initialize() -> void:
call_deferred("run")
func check(condition: bool, message: String) -> void:
checks += 1
if not condition:
failures += 1
push_error(message)
func run() -> void:
var player := OwniverseEffectsPlayer.new()
root.add_child(player)
check(player.play_effect("select"), "Known effect starts")
check(player.stream == player._effects.select and player.playing, "Selected effect is playing")
var selected_stream: AudioStream = player.stream
check(not player.play_effect("select"), "Playing effect is not restarted")
check(player.stream == selected_stream and player.playing, "Rejected duplicate keeps current playback")
player.stop()
check(player.play_effect("select"), "Stopped effect can start again immediately")
check(player.play_effect("blast"), "Different effect starts immediately")
check(not player.play_effect("missing_effect"), "Unknown effect is rejected")
check(player.stream == player._effects.blast, "Unknown effect does not interrupt playback")
player.set_enabled(false)
check(player.stream_paused, "Disabling effects pauses current playback")
check(not player.play_effect("select") and player.stream == player._effects.blast, "Disabled player rejects new effects")
player.set_enabled(true)
check(not player.stream_paused, "Enabling effects resumes current playback")
player.stop()
player.stream = null
player.free()
await process_frame
print("Effects player: %d checks, %d failures" % [checks, failures])
quit(0 if failures == 0 else 1)
+1
View File
@@ -0,0 +1 @@
uid://cj2kk1vx5umtc
+1 -1
View File
@@ -94,7 +94,7 @@ func run():
check(str(world.state.auto_star_deficits).length() < 500, "true", "fraction storage stays bounded") check(str(world.state.auto_star_deficits).length() < 500, "true", "fraction storage stays bounded")
print("100 changing-composition cycles: %d ms" % (Time.get_ticks_msec() - started)) print("100 changing-composition cycles: %d ms" % (Time.get_ticks_msec() - started))
var saves = root.get_node("SaveManager") var saves = root.get_node("SaveManager")
check(saves.validate_data({"format_version": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), "", "long-running state saves") check(saves.validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), "", "long-running state saves")
for entity in world.catalog.entities.values(): entity.free() for entity in world.catalog.entities.values(): entity.free()
world.free() world.free()
print("Exact math: %d checks, %d failures" % [checks, failures]) print("Exact math: %d checks, %d failures" % [checks, failures])
+54
View File
@@ -0,0 +1,54 @@
extends SceneTree
const E = preload("res://world/owniverse/math/exact.gd")
const Extra = preload("res://data/owniverse_extra_param_loader.gd")
const Parameters = preload("res://world/owniverse/world_parameters.gd")
var checks: int = 0
var failures: int = 0
func _initialize(): call_deferred("run")
func check(ok: bool, label: String):
checks += 1
if not ok:
failures += 1
push_error(label)
func run():
var global = root.get_node("Global")
check(E.eq(global.ExtraParams, Extra.get_data()), "Global table equals loader data")
check(E.eq(global.ExtraParams.E, E.of("1e27")), "Energy parsed as exact integer")
check(E.eq(global.ExtraParams.DA, 65536), "Export column is used, not formatted display column")
var saved: Dictionary = global.ExtraParams.duplicate()
global.ExtraParams.E = E.of("1e40")
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(global.OwniverseEntities)
check(E.eq(world.state.energy, E.of("1e40")), "New world uses configured energy")
var initial: Dictionary = world.environment.stellar_environment(world.state)
global.ExtraParams.DA = E.multiply(saved.DA, 4)
check(E.near(world.environment.stellar_environment(world.state).density, E.multiply(initial.density, 2)), "Base mass changes density")
global.ExtraParams.DA = saved.DA
global.ExtraParams.NPC = E.multiply(saved.NPC, 2)
check(E.near(world.environment.stellar_environment(world.state).density, E.multiply(initial.density, 2)), "NPC changes density")
global.ExtraParams.NPC = saved.NPC
world.state.amount.S = E.of("1e24")
world.state.amount.LGF = 1
var old_density = world.environment.stellar_environment(world.state).density
global.ExtraParams.VoidSize = E.multiply(saved.VoidSize, 100)
check(E.lt(world.environment.stellar_environment(world.state).density, old_density), "Void volume uses configured size")
global.ExtraParams.bigcrunch1 = E.of("0.5")
global.ExtraParams.bigcrunch2 = E.of("0.6")
global.ExtraParams.bigcrunch3 = E.of("0.7")
check(Parameters.density_display(E.of("0.6")).mode == "DensityCrunch", "Configured crunch start")
check(E.near(Parameters.density_display(E.of("0.6")).position, E.of("0.5")), "Crunch indicator uses configured interval")
check(Parameters.density_warning_color(E.of("0.6")) == Color.html("20b0dfbf"), "Configured middle crunch warning")
global.ExtraParams.bigrip1 = E.of("0.01")
global.ExtraParams.bigrip2 = E.of("0.001")
global.ExtraParams.bigrip3 = E.of("0.0001")
check(Parameters.density_display(E.of("0.001")).mode == "DensityRip", "Configured rip start")
check(E.near(Parameters.density_display(E.of("0.001")).position, E.of("0.5")), "Rip indicator uses configured interval")
check(Parameters.density_warning_color(E.of("0.001")) == Color.html("df2020bf"), "Configured middle rip warning")
world.state.world_parameters.Bur = 19
global.ExtraParams.combustibility_bonus = 1
check(E.eq(Parameters.production(world.state, world.catalog.entities.RD), Parameters.effective(world.state, "Bur")), "Configured combustion exponent")
global.ExtraParams.merge(saved, true)
for entity in world.catalog.entities.values(): entity.free()
world.free()
print("Extra params: %d checks, %d failures" % [checks, failures])
quit(1 if failures else 0)
+1
View File
@@ -0,0 +1 @@
uid://doertyqlkrm26
+78
View File
@@ -0,0 +1,78 @@
extends "res://tests/test_civilization_evolution.gd"
func run():
var rules: Dictionary = root.get_node("Global").CivilizationRules
for count in [103, E.of("10000000000000000000000000000000000000103"), E.add(E.of("1e400"), 103)]:
var world = fixture()
var third: Variant = E.floor_value(E.divide(count, 3))
var free: Variant = E.subtract(count, E.multiply(third, 2))
world.state.amount["C0.2"] = free
world.state.binds.RD = {"C0.2": third}
world.state.binds.OD = {"C0.2": third}
var counts: Dictionary = {"C0.2": third, "C0.3": third, "HP": free}
var profile: Dictionary = {"m": 0.4, "l": 0.2, "w": 0.1, "d": 0.1, "c": 0.1, "b": 0.1}
var profiles: Dictionary = {}
for id in counts: profiles[id] = profile
var physical: Dictionary = world.ledger.physical_amounts(world.state)
var initial_physical: Dictionary = physical.duplicate()
var committed: Dictionary = world.civilization_flow._commit(world.state, physical, {"C0.2": {"counts": counts, "profiles": profiles}}, rules, 100)
check(E.eq(committed, world.ledger.physical_amounts(world.state)), "Commit snapshot matches a full physical rebuild")
check(E.eq(physical, initial_physical), "Commit does not mutate its input snapshot")
for id in counts:
check(E.eq(world.ledger.physical_amount(world.state, id), counts[id]), "Commit preserves exact destination quota: " + id)
for owner in ["RD", "OD"]:
var held: Variant = 0
for id in counts: held = E.add(held, world.state.binds[owner].get(id, 0))
check(E.eq(held, third), "Commit preserves each owner's exact population")
for id in ["C0.2", "C0.3"]:
for ethic in profile: check(absf(world.state.ethics[id][ethic] - profile[ethic]) < 1e-12, "Commit preserves incoming ethical profile")
invariants(world)
dispose(world)
world = fixture()
world.state.binds.RD = {"C4.4": count}
var terminal: Dictionary = {"Ct": State.empty_profile()}
world.civilization_flow._commit(world.state, world.ledger.physical_amounts(world.state), {"C4.4": {"counts": {"Ct": count}, "profiles": terminal}}, rules, 100)
check(E.eq(world.state.amount.Ct, count), "Transcendent population is entirely free")
check(E.eq(world.state.binds.RD.get("Ct", 0), 0), "Transcendent population cannot retain a stellar owner")
dispose(world)
world = fixture()
world.state.amount["C2.0"] = count
var initial_capacity: Dictionary = world.ledger.physical_amounts(world.state)
var frozen_capacity: Dictionary = initial_capacity.duplicate()
var constrained: Dictionary = State.enforce_capacity(world, world.state, rules, 100, initial_capacity)
check(E.eq(constrained, world.ledger.physical_amounts(world.state)), "Cascading capacity changes maintain exact physical totals")
check(E.eq(initial_capacity, frozen_capacity), "Capacity correction does not mutate the previous snapshot")
dispose(world)
world = fixture()
var original_owners: Dictionary = {}
for owner in ["RD", "OD", "YD", "WYD"]:
world.state.binds[owner] = {}
for resource in ["GG", "AB", "RP", "HP"]:
world.state.binds[owner][resource] = count
original_owners[owner] = E.multiply(count, 4)
var colonies: Dictionary = {
"C1.4": {"counts": {"C1.4": E.multiply(count, 3)}, "profiles": {"C1.4": profile}},
"C1.5": {"counts": {"C1.5": E.multiply(count, 5)}, "profiles": {"C1.5": profile}}
}
var physical_before: Dictionary = world.ledger.physical_amounts(world.state)
var untouched: Dictionary = physical_before.duplicate()
var colonized: Dictionary = world.civilization_flow._colonize(world.state, colonies, 100, rules, physical_before)
check(E.eq(colonized, world.ledger.physical_amounts(world.state)), "Colonization snapshot matches a full physical rebuild")
check(E.eq(physical_before, untouched), "Colonization does not mutate its input snapshot")
var capacity: Dictionary = State.enforce_capacity(world, world.state, rules, 100, colonized)
check(E.eq(capacity, world.ledger.physical_amounts(world.state)), "Capacity snapshot matches a full physical rebuild")
check(E.eq(world.ledger.physical_amount(world.state, "C1.4"), E.multiply(count, 3)), "Colonization credits exact first quota")
check(E.eq(world.ledger.physical_amount(world.state, "C1.5"), E.multiply(count, 5)), "Colonization credits exact second quota")
check(E.eq(world.state.stats.total_amount["C1.4"], E.multiply(count, 3)), "Consolidated credit preserves creation statistics")
check(E.eq(world.state.civilization_stats.colonies, E.multiply(count, 8)), "Colonization statistics equal exact granted total")
for owner in original_owners:
var held: Variant = 0
for id in ["GG", "AB", "RP", "HP", "C1.4", "C1.5"]: held = E.add(held, world.state.binds[owner].get(id, 0))
check(E.eq(held, original_owners[owner]), "Colonization preserves each owner's occupied worlds")
var remaining_planets: Variant = 0
for id in ["GG", "AB", "RP", "HP"]: remaining_planets = E.add(remaining_planets, world.ledger.physical_amount(world.state, id))
check(E.eq(remaining_planets, E.multiply(count, 8)), "Planet loss equals colonies created")
invariants(world)
dispose(world)
print("Flow commit: %d checks, %d failures" % [checks, failures])
quit(1 if failures else 0)
+1
View File
@@ -0,0 +1 @@
uid://bfgdsxoycr20e
+48 -9
View File
@@ -35,24 +35,28 @@ func run():
direct = fixture() direct = fixture()
sliced = fixture() sliced = fixture()
var initial_h: Variant = sliced.state.amount.H var initial_h: Variant = sliced.state.amount.H
sliced.evolute_frame(1.0 / 60.0, self) sliced.evolute_frame(0.2, self)
check(sliced.frame_busy, "Heavy transaction yields before publishing") check(sliced.frame_busy, "Heavy transaction yields before publishing")
check(E.eq(sliced.state.time.year, 0), "Published clock stays at completed transaction") check(E.eq(sliced.state.time.year, 0), "Published clock stays at completed transaction")
sliced.request_production("H", 1, true) check(E.eq(sliced.display_clock().year, Clock.advance({"datetime": 0, "year": 0}, 0.2, sliced.speed).year), "Display clock advances independently of the heavy transaction")
check(sliced.request_production("H", 1, true), "Production requested during a frame is queued")
check(sliced.frame_checkpoint().productions.size() == 1, "Queued production remains part of the save checkpoint")
check(E.eq(sliced.state.amount.H, initial_h), "Player action waits for transaction commit") check(E.eq(sliced.state.amount.H, initial_h), "Player action waits for transaction commit")
sliced.evolute_frame(0.01, self) sliced.evolute_frame(0.01, self)
var requested: Dictionary = sliced.frame_clock.duplicate() var requested: Dictionary = sliced.frame_clock.duplicate()
sliced.speed = 3 sliced.speed = 3
check(sliced.speed == 3 and sliced.state.speed == 6, "Speed change is visible and cannot mutate an unfinished transaction") check(sliced.speed == 3 and sliced.state.speed == 6, "Speed change is visible and cannot mutate an unfinished transaction")
while sliced.frame_busy: await process_frame while sliced.frame_busy or sliced.production_queue_busy: await process_frame
direct.evolute(1.0 / 60.0) direct.evolute(0.2)
direct.production.produce_hs("H", 1) direct.production.produce_hs("H", 1)
direct.speed = 3 direct.speed = 3
check(E.eq(direct.state, sliced.state), "Queued action and speed change survive publication") check(E.eq(direct.state, sliced.state), "Queued action and speed change survive publication")
sliced.evolute_frame(0.001, self) sliced.evolute_frame(0.001, self)
var second_clock: Dictionary = Clock.advance(requested, 0.001, 3) check(not sliced.frame_busy, "Speed change does not bypass real-time cadence")
sliced.evolute_frame(0.189, self)
var second_clock: Dictionary = Clock.advance(Clock.advance(requested, 0.001, 3), 0.189, 3)
var active: Dictionary = sliced.frame_active_clock.duplicate() var active: Dictionary = sliced.frame_active_clock.duplicate()
while sliced.frame_busy: await process_frame while sliced.frame_busy or sliced.production_queue_busy: await process_frame
direct.evolution.evolute_to_datetime(active.datetime, active) direct.evolution.evolute_to_datetime(active.datetime, active)
check(E.eq(direct.state, sliced.state), "Bounded frame transaction matches its exact target clock") check(E.eq(direct.state, sliced.state), "Bounded frame transaction matches its exact target clock")
check(E.eq(sliced.frame_clock, second_clock), "All elapsed time during a busy frame remains in the requested clock") check(E.eq(sliced.frame_clock, second_clock), "All elapsed time during a busy frame remains in the requested clock")
@@ -60,7 +64,7 @@ func run():
dispose(direct) dispose(direct)
dispose(sliced) dispose(sliced)
var original = fixture() var original = fixture()
original.evolute_frame(1.0 / 60.0, self) original.evolute_frame(0.2, self)
original.request_production("H", 123, true) original.request_production("H", 123, true)
original.evolute_frame(0.01, self) original.evolute_frame(0.01, self)
original.speed = 3 original.speed = 3
@@ -75,7 +79,7 @@ func run():
expected.state = published.duplicate(true) expected.state = published.duplicate(true)
resumed.restore_frame_checkpoint(checkpoint) resumed.restore_frame_checkpoint(checkpoint)
resumed.evolute_frame(0.0, self) resumed.evolute_frame(0.0, self)
while resumed.frame_busy: await process_frame while resumed.frame_busy or resumed.production_queue_busy: await process_frame
expected.evolution.evolute_to_datetime(expected_clock.datetime, expected_clock) expected.evolution.evolute_to_datetime(expected_clock.datetime, expected_clock)
expected.production.produce_hs("H", 123) expected.production.produce_hs("H", 123)
expected.speed = 3 expected.speed = 3
@@ -84,7 +88,7 @@ func run():
dispose(resumed) dispose(resumed)
dispose(expected) dispose(expected)
var cancelled = fixture() var cancelled = fixture()
cancelled.evolute_frame(0.133333333333, self) cancelled.evolute_frame(0.2, self)
check(cancelled.frame_busy, "Cancellation fixture has suspended work") check(cancelled.frame_busy, "Cancellation fixture has suspended work")
var budget_ref: RefCounted = cancelled.frame_budget var budget_ref: RefCounted = cancelled.frame_budget
dispose(cancelled) dispose(cancelled)
@@ -96,5 +100,40 @@ func run():
invalid.evolute(1e308) invalid.evolute(1e308)
check(not invalid.frame_busy and invalid.frame_clock.is_empty() and E.eq(before, invalid.state), "Overflowing elapsed float cannot enter either clock API") check(not invalid.frame_busy and invalid.frame_clock.is_empty() and E.eq(before, invalid.state), "Overflowing elapsed float cannot enter either clock API")
dispose(invalid) dispose(invalid)
for selected_speed in range(1, 7):
var scheduled = fixture()
scheduled.speed = selected_speed
scheduled.evolute_frame(0.1, self)
check(not scheduled.frame_busy and scheduled.frame_commits == 0, "Wait for a full step at speed %d" % selected_speed)
scheduled.evolute_frame(0.1, self)
while scheduled.frame_busy: await process_frame
var cadence_clock: Dictionary = Clock.advance({"datetime": 0, "year": 0}, 0.2, selected_speed)
check(scheduled.frame_commits == 1 and E.eq(scheduled.state.time, cadence_clock), "One complete 0.2 second cycle at speed %d" % selected_speed)
scheduled.evolute_frame(0.0, self)
check(not scheduled.frame_busy and scheduled.frame_commits == 1, "No extra cycle without elapsed time")
dispose(scheduled)
var behind = fixture()
behind.evolute_frame(1.0, self)
while behind.frame_busy: await process_frame
check(E.eq(behind.state.time.datetime, 100000) and E.eq(behind.state.time, behind.frame_clock), "Delayed start consumes all elapsed time in one cycle")
behind.evolute_frame(0.0, self)
check(behind.frame_commits == 1 and not behind.frame_busy, "Consumed interval cannot be processed twice")
var next_interval: float = behind.frame_step_seconds + 0.03
behind.evolute_frame(next_interval, self)
var remained_busy: bool = behind.frame_busy
if remained_busy: behind.evolute_frame(0.53, self)
var pending_clock: Dictionary = behind.frame_clock.duplicate()
if remained_busy:
var expected_active: Dictionary = Clock.advance({"datetime": 100000, "year": 100000}, next_interval, behind.speed)
check(E.eq(behind.frame_active_clock, expected_active), "Busy transaction reserves its original target")
while behind.frame_busy: await process_frame
if remained_busy:
check(E.eq(behind.state.time, behind.frame_active_clock), "Busy transaction keeps its original target")
behind.evolute_frame(0.0, self)
while behind.frame_busy: await process_frame
check(E.eq(behind.state.time, pending_clock), "Next cycle consumes all time accumulated during computation")
else:
check(E.eq(behind.state.time, pending_clock), "Completed transaction publishes the full requested interval")
dispose(behind)
print("Frame evolution: %d checks, %d failures" % [checks, failures]) print("Frame evolution: %d checks, %d failures" % [checks, failures])
quit(1 if failures else 0) quit(1 if failures else 0)
+6 -4
View File
@@ -46,7 +46,7 @@ func run() -> void:
var before: Dictionary = world.state.duplicate(true) var before: Dictionary = world.state.duplicate(true)
world.evolution.initialize_life_batches() world.evolution.initialize_life_batches()
check(E.eq(world.state, before), "Initialization is idempotent") check(E.eq(world.state, before), "Initialization is idempotent")
world.evolution.evolve_batches(world.state, E.add(5000000, E.divide(5000000, 40))) world.evolution.evolve_batches(world.state, E.add(5000000, E.divide(5000000, root.get_node("Global").batch_count)))
check(E.eq(world.state.amount.EON1, 10), "HP abiogenesis follows source probability") check(E.eq(world.state.amount.EON1, 10), "HP abiogenesis follows source probability")
check(E.eq(world.state.amount.RP, 100), "HP degradation produces RP") check(E.eq(world.state.amount.RP, 100), "HP degradation produces RP")
check(E.eq(world.state.amount.HP, 39890), "Unchanged planets retry, not disappear") check(E.eq(world.state.amount.HP, 39890), "Unchanged planets retry, not disappear")
@@ -54,7 +54,7 @@ func run() -> void:
check(E.gt(world.state.batches.HP.size(), 0), "Survivors get next attempt") check(E.gt(world.state.batches.HP.size(), 0), "Survivors get next attempt")
var physical: Dictionary = world.ledger.physical_amounts(world.state) var physical: Dictionary = world.ledger.physical_amounts(world.state)
check(E.eq(E.add(E.add(physical.HP, physical.EON1), physical.RP), 40000), "Life conserves planets") check(E.eq(E.add(E.add(physical.HP, physical.EON1), physical.RP), 40000), "Life conserves planets")
check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Life save validates") check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Life save validates")
var restored = fixture() var restored = fixture()
restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state)))) restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state))))
world.evolution.evolve_batches(world.state, 11000000) world.evolution.evolve_batches(world.state, 11000000)
@@ -66,8 +66,10 @@ func run() -> void:
world = fixture() world = fixture()
world.state.amount.RD = 1 world.state.amount.RD = 1
world.state.binds.RD = {"EON5": 40000} world.state.binds.RD = {"EON5": 40000}
# Test host preservation with a fixed rate, independent of game balance.
world.catalog.entities.EON5.life_rule.progress = "0.00025"
world.evolution.initialize_life_batches() world.evolution.initialize_life_batches()
world.evolution.evolve_batches(world.state, E.add(500000, E.divide(500000, 40))) world.evolution.evolve_batches(world.state, E.add(500000, E.divide(500000, root.get_node("Global").batch_count)))
check(E.eq(world.state.binds.RD["C0.0"], 10), "Intelligence emerges at the same host star") check(E.eq(world.state.binds.RD["C0.0"], 10), "Intelligence emerges at the same host star")
check(E.eq(world.state.amount["C0.0"], 0), "Life transition keeps planet bound") check(E.eq(world.state.amount["C0.0"], 0), "Life transition keeps planet bound")
check(world.state.batches.has("C0.0"), "New C0.0 starts civilization evolution") check(world.state.batches.has("C0.0"), "New C0.0 starts civilization evolution")
@@ -118,7 +120,7 @@ func run() -> void:
world.evolution.evolve_batches(world.state, 2050) world.evolution.evolve_batches(world.state, 2050)
check(E.eq(world.state.binds.RD["C0.2"], 700), "C0.1 reaches ethical civilization without losing host") check(E.eq(world.state.binds.RD["C0.2"], 700), "C0.1 reaches ethical civilization without losing host")
check(E.eq(world.state.binds.RD["C0.0"], 1000), "C0.1 degradation follows Unity") check(E.eq(world.state.binds.RD["C0.0"], 1000), "C0.1 degradation follows Unity")
check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Extended life save validates") check(E.eq(root.get_node("SaveManager").validate_data({"format_version": 6, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Extended life save validates")
dispose(world) dispose(world)
print(("Life: %d checks, %d failures" % [checks, failures])) print(("Life: %d checks, %d failures" % [checks, failures]))
quit((0 if E.eq(failures, 0) else 1)) quit((0 if E.eq(failures, 0) else 1))
+1 -1
View File
@@ -17,7 +17,7 @@ func run() -> void:
var World = load("res://world/owniverse/owniverse.gd") var World = load("res://world/owniverse/owniverse.gd")
var first = World.new() var first = World.new()
var second = World.new() var second = World.new()
var names: Array = ["batches", "ledger", "production", "automatic", "stellar", "life", "environment", "evolution"] var names: Array = ["batches", "ledger", "production", "automatic", "stellar", "life", "environment", "evolution", "civilization_flow"]
var references: Array = [] var references: Array = []
for name in names: for name in names:
check(E.ne(first.get(name), second.get(name)), E.add("World has its own ", name)) check(E.ne(first.get(name), second.get(name)), E.add("World has its own ", name))
+54
View File
@@ -0,0 +1,54 @@
extends SceneTree
var checks: int = 0
var failures: int = 0
func _initialize() -> void:
call_deferred("run")
func check(condition: bool, message: String) -> void:
checks += 1
if not condition:
failures += 1
push_error(message)
func run() -> void:
var player := OwniverseMusicPlayer.new()
root.add_child(player)
await process_frame
check(player.last_track == "", "Music player starts with silence")
check(player._pause_timer.time_left >= player.MIN_PAUSE_SECONDS and player._pause_timer.time_left <= player.MAX_PAUSE_SECONDS, "Initial pause is between two and five minutes")
player._pause_timer.stop()
player._play_next()
check(player.last_track != "", "Music player selects an initial track")
check(player.last_track != player.EXCLUDED_TRACK, "Normal playlist excludes apocalypse")
var previous: String = player.last_track
player._play_next()
check(player.last_track != previous, "Consecutive tracks do not repeat")
check(player.last_track != player.EXCLUDED_TRACK, "Subsequent tracks exclude apocalypse")
var last_normal_track: String = player.last_track
player.play_apocalypse()
check(player.stream == player._music[player.EXCLUDED_TRACK] and player.playing, "Apocalypse music starts immediately")
check(player.last_track == last_normal_track, "Apocalypse does not replace the last normal track")
player._schedule_pause()
check(player._pause_timer.time_left >= player.MIN_PAUSE_SECONDS and player._pause_timer.time_left <= player.MAX_PAUSE_SECONDS, "Pause is between two and five minutes")
player.set_enabled(false)
check(player.stream_paused and player._pause_timer.paused, "Disabling music pauses playback and scheduling")
var disabled_stream: AudioStream = player.stream
player.play_apocalypse()
check(player.stream == disabled_stream, "Apocalypse does not start while music is disabled")
player.set_enabled(true)
check(not player.stream_paused and not player._pause_timer.paused, "Enabling music resumes playback and scheduling")
player.stop()
player.stream = null
player.free()
await process_frame
print("Music player: %d checks, %d failures" % [checks, failures])
quit(0 if failures == 0 else 1)
+1
View File
@@ -0,0 +1 @@
uid://nue2ifdplt25
+15 -2
View File
@@ -59,14 +59,27 @@ func run() -> void:
world.state.auto_resources = {"H": 10} world.state.auto_resources = {"H": 10}
world.state.batches.H = [{"amount": 10, "start_year": 1, "end_year": 2}] world.state.batches.H = [{"amount": 10, "start_year": 1, "end_year": 2}]
var before: Dictionary = world.state.duplicate(true) var before: Dictionary = world.state.duplicate(true)
check((not world.production.try_production(world.state, world.catalog.entities.N, 1, true)), "Binding failure rejects production") var physical: Dictionary = world.ledger.physical_amounts(world.state)
var frozen_physical: Dictionary = physical.duplicate()
check((not world.production.try_production(world.state, world.catalog.entities.N, 1, true, physical)), "Binding failure rejects production")
check(E.eq(physical, frozen_physical), "Failed production preserves the shared quantity snapshot")
check(E.eq(world.state, before), "Failure preserves costs, batches and budget") check(E.eq(world.state, before), "Failure preserves costs, batches and budget")
world.state.amount.S = 10 world.state.amount.S = 10
physical = world.ledger.physical_amounts(world.state)
var old_batches: Array = world.state.batches.H var old_batches: Array = world.state.batches.H
check(world.production.try_production(world.state, world.catalog.entities.N, 2, true), "Funded production succeeds") check(world.production.try_production(world.state, world.catalog.entities.N, 2, true, physical), "Funded production succeeds")
check(E.eq(physical, world.ledger.physical_amounts(world.state)), "Successful production updates exact totals without changing bound-resource totals")
check((E.eq(world.state.amount.H, 6) and E.eq(world.state.amount.S, 4)), "Exact cost and binding") check((E.eq(world.state.amount.H, 6) and E.eq(world.state.amount.S, 4)), "Exact cost and binding")
check(E.eq(world.state.auto_resources.H, 6), "Exact automatic budget") check(E.eq(world.state.auto_resources.H, 6), "Exact automatic budget")
check((E.eq(old_batches[0].amount, 10) and E.eq(world.state.batches.H[0].amount, 6)), "Consumed batches isolated") check((E.eq(old_batches[0].amount, 10) and E.eq(world.state.batches.H[0].amount, 6)), "Consumed batches isolated")
for member in world.catalog.members("Star"): world.state.amount[member] = 0
var star_stocks: Array = ["1234567890123456789", "876543210987654321", "3141592653589793238", "2718281828459045235", "1414213562373095048", "1732050807568877293", "2236067977499789696", "2449489742783178098", "3162277660168379331"]
for i in star_stocks.size(): world.state.amount[world.catalog.members("Star")[i]] = E.of(star_stocks[i])
var scd_request: Variant = E.of("1e15")
var scd_created: Variant = world.production.produce("SCD", scd_request)
check(E.eq(scd_created, scd_request), "Large SCD production distributes a whole star quota exactly")
check(E.eq(world.state.amount.SCD, scd_request), "Large SCD creation is committed")
print(("Transaction: %d checks, %d failures" % [checks, failures])) print(("Transaction: %d checks, %d failures" % [checks, failures]))
dispose(world) dispose(world)
quit((1 if failures else 0)) quit((1 if failures else 0))
+3
View File
@@ -30,6 +30,9 @@ func run() -> void:
for id in requests: requests[id] = E.multiply(requests[id], E.of("1e40")) for id in requests: requests[id] = E.multiply(requests[id], E.of("1e40"))
var limit: Variant = E.multiply(rng.randi_range(0, 600), E.of("1e40")) if sample % 3 == 0 else rng.randi_range(0, 600) var limit: Variant = E.multiply(rng.randi_range(0, 600), E.of("1e40")) if sample % 3 == 0 else rng.randi_range(0, 600)
check(E.eq(Math.allocate_whole(requests, limit), Legacy.allocate_whole(requests, limit)), "Allocation matches legacy with limits, ties and big integers") check(E.eq(Math.allocate_whole(requests, limit), Legacy.allocate_whole(requests, limit)), "Allocation matches legacy with limits, ties and big integers")
var whole_requests: Dictionary = {}
for id in requests: whole_requests[id] = E.floor_value(E.maximum(0, requests[id]))
check(E.eq(Math.allocate_whole(whole_requests, limit), Math.allocate_whole_with_total(whole_requests, limit, Math.sum(whole_requests))), "Known-total allocation matches ordinary allocation")
var count: Variant = limit var count: Variant = limit
check(E.eq(Math.split(new_remainders, "population", count, weights), Legacy.split(old_remainders, "population", count, weights)), "Split matches legacy rounding") check(E.eq(Math.split(new_remainders, "population", count, weights), Legacy.split(old_remainders, "population", count, weights)), "Split matches legacy rounding")
check(E.eq(new_remainders, old_remainders), "Signed remainder debt matches legacy") check(E.eq(new_remainders, old_remainders), "Signed remainder debt matches legacy")
+111
View File
@@ -0,0 +1,111 @@
extends SceneTree
const E = preload("res://world/owniverse/math/exact.gd")
const Civ = preload("res://world/owniverse/civilization_evolution.gd")
const Q = preload("res://world/owniverse/quantity_math.gd")
const Fixture = preload("res://tests/fixtures/civilization_benchmark.gd")
var checks: int = 0
var failures: int = 0
func _initialize(): call_deferred("run")
func check(value: bool, message: String):
checks += 1
if not value:
failures += 1
push_error(message)
func run():
for count in [0, 1, 7, 999999999, E.of("1e40"), E.of("1e400")]:
var carry: Dictionary = {}
for round_index in 20:
var weights: Dictionary = {"m": round_index + 1.0, "l": 0.0, "w": 9.0, "d": 4.0, "c": 137.0, "b": 2.0}
var profile: Dictionary = Civ.State.normalize_profile(weights)
var shares: Array = []
for ethic in Civ.ETHICS: shares.append(profile[ethic])
var result: Dictionary = Q.split_profile(carry, "profile", count, Civ.ETHICS, shares)
check(E.eq(Q.sum(result), count), "Profile quotas conserve arbitrary-size whole totals")
for value in result.values(): check(E.ge(value, 0) and E.eq(value, E.floor_value(value)), "Profile quotas stay nonnegative whole")
for value in carry.values(): check(is_finite(value) and value >= -1.0 and value <= 1.0, "Signed profile carries stay bounded")
check(absf(E.ratio_approx(E.of("1e400"), E.of("3e400")) - 1.0 / 3.0) < 1e-15, "Float profile ratio handles values beyond float range")
for count in [1, 101, E.of("1e40"), E.of("1e400")]:
var stocks: Dictionary = {"a": count, "b": E.add(count, 1), "c": 0}
var total: Variant = Q.sum(stocks)
for limit in [0, count, E.subtract(total, 1), total]:
var allocated: Dictionary = Q.allocate_profiled(stocks, limit)
check(E.eq(Q.sum(allocated), limit), "Profiled stock allocation retains the exact granted total")
for id in stocks: check(E.ge(allocated[id], 0) and E.le(allocated[id], stocks[id]), "Profiled stock allocation respects every owner ceiling")
for probability in [0.1, 1.0 / 3.0, 1.23456789]:
var carries: Dictionary = {}
var old_carry: Variant = 0
for iteration in 20:
var expected: Variant = E.add(E.multiply(count, probability), old_carry)
var whole: Variant = E.floor_value(expected)
old_carry = E.maximum(0, E.subtract(expected, whole))
var actual: Variant = Q.accumulate_rate(carries, "rate", count, probability)
check(E.eq(actual, whole), "Fast float carries preserve the whole result of rate accumulation")
check(E.near(carries.rate, old_carry), "Fast float carries preserve the fractional remainder")
for speed in [1, 4, 6]:
var world = load("res://world/owniverse/owniverse.gd").new()
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
Fixture.seed(world, root.get_node("Global"), true, true)
var rules: Dictionary = root.get_node("Global").CivilizationRules
var id: String = rules.keys()[0]
var modifiers: Dictionary = {"progress": 1, "degradation": 1, "war": 1, "colonization": 1}
var original: Dictionary = Civ.coefficients(world, rules, id, modifiers).duplicate(true)
modifiers.progress = 2
var changed: Dictionary = Civ.coefficients(world, rules, id, modifiers)
var row: Dictionary = rules[id].ethics.m
var p: Variant = E.maximum(0, E.multiply(E.of(row.progress), 2))
var d: Variant = E.maximum(0, E.of(row.degradation))
check(E.near(changed.m.pro, E.divide(p, E.maximum(1, E.add(p, d)))), "Coefficient cache follows modifiers")
modifiers.progress = 1
check(E.eq(Civ.coefficients(world, rules, id, modifiers), original), "Coefficient cache restores original rates")
var local_rules: Dictionary = rules.duplicate(true)
local_rules[id].ethics.m.progress = "0.375"
changed = Civ.coefficients(world, local_rules, id, modifiers)
check(E.near(changed.m.pro, E.divide(E.of("0.375"), E.maximum(1, E.add(E.of("0.375"), d)))), "Coefficient cache follows rule edits")
var target: Dictionary = {"ethics": {}}
target.amount = {}
target.binds = {}
target.stats = {"total_amount": {}}
target.amount[id] = 60
target.stats.total_amount[id] = 60
Civ.State.reconcile(world, target, rules, {id: 60})
target.ethics[id] = {"m": 1.0, "l": 0.0, "w": 0.0, "d": 0.0, "c": 0.0, "b": 0.0}
Civ.State.reconcile(world, target, rules, {id: 60})
check(E.eq(target.ethics[id].m, 1.0), "Reconcile cache detects changed ethics")
Civ.State.reconcile(world, target, rules, {id: 120})
check(E.eq(target.ethics[id].m, 1.0), "Reconcile cache detects changed population")
target.amount[id] = 120
Civ.worship(world, target, rules)
target.ethics[id].m = 0.5
target.ethics[id].l = 0.5
var expected: float = 0.0
for stage in rules:
if rules[stage].worships:
for ethic in target.ethics[stage]:
var n: float = (0.0 + target.ethics[stage][ethic]) * E.approx(E.of(rules[stage].ethics[ethic].worship))
n *= E.approx(target.amount.get(stage, 0))
expected += n
check(E.near(Civ.worship(world, target, rules), expected), "Worship cache detects changed ethics")
var worship_rules: Dictionary = rules.duplicate(true)
for stage in worship_rules:
if worship_rules[stage].worships:
worship_rules[stage].ethics.m.worship = "0.375"
expected = 0.0
for stage in worship_rules:
if worship_rules[stage].worships:
for ethic in target.ethics[stage]:
var n: float = (0.0 + target.ethics[stage][ethic]) * E.approx(E.of(worship_rules[stage].ethics[ethic].worship))
n *= E.approx(target.amount.get(stage, 0))
expected += n
check(E.near(Civ.worship(world, target, worship_rules), expected), "Worship cache detects changed rules")
world.ledger = load("res://tests/fixtures/audit_rounding_ledger.gd").new(world)
# Civilizations no longer trigger batch generations. Seed an actual
# stellar completion so the selective-rounding path is exercised.
world.state.batches.BG = [{"amount": world.state.amount.BG, "start_year": 1, "end_year": 1}]
world.speed = speed
for i in 3: world.evolute(1.0 if speed == 1 else 0.1)
check(world.ledger.checks > 0 and world.ledger.failures == 0, "Selective and full rounding agree at speed %d" % speed)
for entity in world.catalog.entities.values(): entity.free()
world.free()
print("Simulation optimizations: %d checks, %d failures" % [checks, failures])
quit(1 if failures else 0)

Some files were not shown because too many files have changed in this diff Show More