Compare commits
63 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e48d4bbe88 | |||
| 6f6a1be3bd | |||
| 9e13c8bbe3 | |||
| b6c683298b | |||
| e94093ac17 | |||
| c4e7302567 | |||
| f51eea6c0f | |||
| befb377774 | |||
| fad862d618 | |||
| fb8a3f5658 | |||
| f2111a376a | |||
| da03ba11c0 | |||
| c2313e9163 | |||
| 2f0a3ee8d4 | |||
| 15ee7833ed | |||
| e79f3fa362 | |||
| e87d4083e9 | |||
| 5a18b41528 | |||
| d6fd40969f | |||
| a3d24114a1 | |||
| 8867da569a | |||
| 1796829338 | |||
| f246efd6ad | |||
| f25b77b605 | |||
| a09e3df220 | |||
| 26347fca30 | |||
| 5ea65a7e9b | |||
| 5f3875bc14 | |||
| cc2700d507 | |||
| 5f5cc6f894 | |||
| 7de65f6145 | |||
| 85a13eb241 | |||
| dea744bc30 | |||
| c22b21a537 | |||
| b44f92aacf | |||
| 0162084e53 | |||
| 2f4b6a98d8 | |||
| d90f8693c9 | |||
| e870c96879 | |||
| e531e7d9b6 | |||
| 57cc023558 | |||
| 23929e3651 | |||
| 829aadca2d | |||
| 30486616f8 | |||
| d9a2679af4 | |||
| 4f57c37572 | |||
| e4a0dd2d13 | |||
| 0a10cff0fa | |||
| e4cf5bdad0 | |||
| 645751cd23 | |||
| b92a49821d | |||
| 3a91528e95 | |||
| 3c37be2a8e | |||
| 544b5f4f56 | |||
| cc9de54d42 | |||
| e76414ce17 | |||
| 68c2b4f25d | |||
| 78946f1bb4 | |||
| 0d1671fe8f | |||
| ea35017aa0 | |||
| 0db24fec60 | |||
| b2a18c9c41 | |||
| 16ec80929c |
@@ -1,13 +1,19 @@
|
||||
---
|
||||
name: Godot 4.4 Core Rules
|
||||
name: Godot 4.7 Core Rules
|
||||
priority: high
|
||||
---
|
||||
|
||||
Ты — senior Godot 4.4 GDScript разработчик.
|
||||
Ты — senior Godot 4.7 GDScript разработчик.
|
||||
|
||||
- Use Godot 4.7+ API.
|
||||
- Do not use Godot 3.x syntax or APIs.
|
||||
- Follow the existing project architecture and coding style.
|
||||
- Do not introduce unnecessary abstractions.
|
||||
- Do not modify unrelated files.
|
||||
|
||||
- Всегда используй Godot 4.4+ API.
|
||||
- Пиши строго типизированный код (`var health: int = 100`, `: Array[Node]` и т.д.).
|
||||
- Предпочитай Signals вместо проверки в _process.
|
||||
- Используй @export, @export_range, @export_enum, @onready.
|
||||
- Composition over deep inheritance.
|
||||
- Менеджеры и автолоады выноси в отдельные singleton'ы.
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
- use spaces not tabs for indentation
|
||||
@@ -0,0 +1,107 @@
|
||||
name: Android production release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
jobs:
|
||||
test-build-publish:
|
||||
runs-on: godot
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
lfs: true
|
||||
|
||||
- name: Verify tag belongs to main
|
||||
run: |
|
||||
git fetch origin main
|
||||
git merge-base --is-ancestor "${GITHUB_SHA}" origin/main
|
||||
|
||||
- name: Show Godot version
|
||||
run: godot --version
|
||||
|
||||
- name: Import project
|
||||
run: |
|
||||
rm -rf .godot
|
||||
godot --headless --path . --editor --import --quit --verbose
|
||||
|
||||
- name: Run all tests
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mapfile -t tests < <(find tests -maxdepth 1 -type f -name 'test_*.gd' | sort)
|
||||
test "${#tests[@]}" -gt 0
|
||||
|
||||
for test_file in "${tests[@]}"; do
|
||||
echo "::group::${test_file}"
|
||||
godot --headless --path . --script "res://${test_file}"
|
||||
echo "::endgroup::"
|
||||
done
|
||||
|
||||
- name: Prepare Android signing
|
||||
env:
|
||||
ANDROID_KEYSTORE_BASE64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }}
|
||||
run: |
|
||||
test -n "${ANDROID_KEYSTORE_BASE64}"
|
||||
printf '%s' "${ANDROID_KEYSTORE_BASE64}" | base64 --decode > "${RUNNER_TEMP}/release.keystore"
|
||||
test -s "${RUNNER_TEMP}/release.keystore"
|
||||
|
||||
- name: Configure release AAB
|
||||
env:
|
||||
RELEASE_VERSION: ${{ github.ref_name }}
|
||||
RELEASE_VERSION_CODE: ${{ github.run_number }}
|
||||
run: |
|
||||
python3 - <<'PY'
|
||||
import os
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
path = Path("export_presets.cfg")
|
||||
text = path.read_text()
|
||||
start = text.index('[preset.1.options]')
|
||||
head, android = text[:start], text[start:]
|
||||
replacements = (
|
||||
(r'gradle_build/use_gradle_build=false', 'gradle_build/use_gradle_build=true'),
|
||||
(r'gradle_build/export_format=0', 'gradle_build/export_format=1'),
|
||||
(r'package/signed=false', 'package/signed=true'),
|
||||
(r'version/code=\d+', f'version/code={100000 + int(os.environ["RELEASE_VERSION_CODE"])}'),
|
||||
(r'version/name="[^"]*"', f'version/name="{os.environ["RELEASE_VERSION"].removeprefix("v")}"'),
|
||||
)
|
||||
for pattern, replacement in replacements:
|
||||
android, count = re.subn(pattern, replacement, android, count=1)
|
||||
if count != 1:
|
||||
raise RuntimeError(f'Expected one Android preset match for {pattern!r}, got {count}')
|
||||
path.write_text(head + android)
|
||||
PY
|
||||
|
||||
- name: Build signed Android App Bundle
|
||||
env:
|
||||
GODOT_ANDROID_KEYSTORE_RELEASE_USER: ${{ secrets.ANDROID_KEYSTORE_ALIAS }}
|
||||
GODOT_ANDROID_KEYSTORE_RELEASE_PASSWORD: ${{ secrets.ANDROID_KEYSTORE_PASSWORD }}
|
||||
run: |
|
||||
export GODOT_ANDROID_KEYSTORE_RELEASE_PATH="${RUNNER_TEMP}/release.keystore"
|
||||
mkdir -p build
|
||||
godot --headless --path . --export-release "Android" build/owniverse-${GITHUB_REF_NAME}.aab
|
||||
test -s "build/owniverse-${GITHUB_REF_NAME}.aab"
|
||||
ls -lh "build/owniverse-${GITHUB_REF_NAME}.aab"
|
||||
|
||||
- name: Publish to Google Play production
|
||||
uses: r0adkll/upload-google-play@v1
|
||||
with:
|
||||
serviceAccountJsonPlainText: ${{ secrets.GOOGLE_PLAY_SERVICE_ACCOUNT_JSON }}
|
||||
packageName: com.KIDGameProduction.Owniverse
|
||||
releaseFiles: build/owniverse-${{ github.ref_name }}.aab
|
||||
tracks: production
|
||||
status: completed
|
||||
|
||||
- name: Upload release bundle
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: owniverse-${{ github.ref_name }}-aab
|
||||
path: build/owniverse-${{ github.ref_name }}.aab
|
||||
if-no-files-found: error
|
||||
retention-days: 90
|
||||
@@ -1,91 +0,0 @@
|
||||
name: Android
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
jobs:
|
||||
android:
|
||||
runs-on: godot
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Godot version
|
||||
run: godot --version
|
||||
|
||||
- name: Prepare Godot
|
||||
run: |
|
||||
rm -rf .godot
|
||||
|
||||
godot \
|
||||
--headless \
|
||||
--path . \
|
||||
--editor \
|
||||
--quit \
|
||||
--verbose
|
||||
|
||||
|
||||
- name: Build APK
|
||||
run: |
|
||||
mkdir -p build
|
||||
|
||||
godot \
|
||||
--headless \
|
||||
--path . \
|
||||
--editor \
|
||||
--quit
|
||||
|
||||
godot \
|
||||
--headless \
|
||||
--path . \
|
||||
--export-release "Android" \
|
||||
build/app.apk
|
||||
|
||||
|
||||
- name: Check imported resources
|
||||
run: |
|
||||
echo "=== PNG imports ==="
|
||||
find .godot/imported -iname '*habitable*' -o -iname '*civ2*'
|
||||
|
||||
echo "=== PNG files ==="
|
||||
ls -lh ui/4-life/habitable_planet.png
|
||||
ls -lh ui/4-life/civ2.png
|
||||
|
||||
|
||||
- name: Verify APK
|
||||
run: |
|
||||
test -f build/app.apk
|
||||
ls -lh build/app.apk
|
||||
|
||||
- name: Create Release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||
run: |
|
||||
curl -f \
|
||||
-X POST \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
"https://gt.owad.ru/api/v1/repos/K/owniverse/releases" \
|
||||
-d "{
|
||||
\"tag_name\": \"${GITHUB_REF_NAME}\",
|
||||
\"name\": \"${GITHUB_REF_NAME}\",
|
||||
\"body\": \"Android build ${GITHUB_REF_NAME}\"
|
||||
}"
|
||||
|
||||
- name: Upload APK to Release
|
||||
env:
|
||||
GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||
run: |
|
||||
RELEASE_ID=$(curl -fsS \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
"https://gt.owad.ru/api/v1/repos/K/owniverse/releases/tags/${GITHUB_REF_NAME}" \
|
||||
| python3 -c 'import sys,json; print(json.load(sys.stdin)["id"])')
|
||||
|
||||
curl -f \
|
||||
-X POST \
|
||||
-H "Authorization: token ${GITEA_TOKEN}" \
|
||||
-F "attachment=@build/app.apk" \
|
||||
"https://gt.owad.ru/api/v1/repos/K/owniverse/releases/${RELEASE_ID}/assets?name=owniverse-${GITHUB_REF_NAME}.apk"
|
||||
@@ -0,0 +1,62 @@
|
||||
name: Testing builds
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- testing
|
||||
|
||||
jobs:
|
||||
test-and-build:
|
||||
runs-on: godot
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
lfs: true
|
||||
|
||||
- name: Show Godot version
|
||||
run: godot --version
|
||||
|
||||
- name: Import project
|
||||
run: |
|
||||
rm -rf .godot
|
||||
godot --headless --path . --editor --import --quit --verbose
|
||||
|
||||
- name: Run all tests
|
||||
shell: bash
|
||||
run: |
|
||||
set -euo pipefail
|
||||
mapfile -t tests < <(find tests -maxdepth 1 -type f -name 'test_*.gd' | sort)
|
||||
test "${#tests[@]}" -gt 0
|
||||
|
||||
for test_file in "${tests[@]}"; do
|
||||
echo "::group::${test_file}"
|
||||
godot --headless --path . --script "res://${test_file}"
|
||||
echo "::endgroup::"
|
||||
done
|
||||
|
||||
- name: Build Android APK
|
||||
run: |
|
||||
mkdir -p build
|
||||
godot --headless --path . --export-release "Android" build/owniverse-testing.apk
|
||||
|
||||
- name: Build Windows EXE
|
||||
run: |
|
||||
godot --headless --path . --export-release "Windows Desktop" build/owniverse-testing.exe
|
||||
|
||||
- name: Verify builds
|
||||
run: |
|
||||
test -s build/owniverse-testing.apk
|
||||
test -s build/owniverse-testing.exe
|
||||
ls -lh build/owniverse-testing.apk build/owniverse-testing.exe
|
||||
|
||||
- name: Upload testing builds
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: owniverse-testing-${{ github.sha }}
|
||||
path: |
|
||||
build/owniverse-testing.apk
|
||||
build/owniverse-testing.exe
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
@@ -3,6 +3,7 @@
|
||||
.vscode/
|
||||
/android/
|
||||
*.import
|
||||
!data/*.txt.import
|
||||
|
||||
# MacOS specific ignores
|
||||
.DS_Store
|
||||
|
||||
+69
-73
@@ -1,104 +1,100 @@
|
||||
extends Node
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
const SPEED_LIMIT: int = 4
|
||||
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.
|
||||
var save_plaintext_copy: bool = true
|
||||
|
||||
var Settings: Dictionary = {
|
||||
"filename": "save-0001",
|
||||
"sound_volume": 1.0,
|
||||
"music_volume": 1.0,
|
||||
"sound_enabled": true,
|
||||
"music_enabled": true,
|
||||
"language": "en",
|
||||
}
|
||||
|
||||
# TODO getter setter for locale
|
||||
|
||||
var Locales: Dictionary = {}
|
||||
var Locale = "en"
|
||||
#var Locales: Dictionary = {}
|
||||
var _locale: String = "en"
|
||||
var Locale: String:
|
||||
get:
|
||||
return _locale
|
||||
set(value):
|
||||
set_locale(value)
|
||||
|
||||
var OwniverseEntities: Dictionary = {}
|
||||
var OwniverseItems: Dictionary = {}
|
||||
var Templates: Dictionary = {}
|
||||
var LifeRules: Dictionary = {}
|
||||
var CivilizationRules: Dictionary = {}
|
||||
var ExtraParams: Dictionary = {}
|
||||
|
||||
var Music: Dictionary = {}
|
||||
var Effects: Dictionary = {}
|
||||
|
||||
var batch_count: float = 40.0 # must be even not odd
|
||||
|
||||
|
||||
func get_localized_item_description(item_id: String, item: String) -> String:
|
||||
if Locales[Locale].has(item_id):
|
||||
return Locales[Locale][item_id][item]
|
||||
return ""
|
||||
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.
|
||||
func get_template(id: String, category: String, field: String) -> Dictionary:
|
||||
var rows: Dictionary = Templates.get(Locale, {})
|
||||
for key in [id + "." + category + "." + field, id + "." + field]:
|
||||
if rows.has(key):
|
||||
return rows[key]
|
||||
return {}
|
||||
|
||||
|
||||
func render_template(row: Dictionary, variables: Dictionary) -> String:
|
||||
var result: String = str(row.get("text", ""))
|
||||
for i in range(5):
|
||||
var variable: String = str(row.get("value" + str(i), "")).strip_edges()
|
||||
var value: String = str(variables.get(variable, "—")) if variable != "" else ""
|
||||
result = result.replace("%value" + str(i) + "%", value)
|
||||
return result.replace("<br>", "\n").replace("[p]", "\n")
|
||||
|
||||
|
||||
func get_description(item_id: String, items: Array = []) -> String:
|
||||
if !Templates[Locale].has(item_id):
|
||||
return ""
|
||||
var description: String = Templates[Locale][item_id]["text"]
|
||||
var value = 0
|
||||
for item in items:
|
||||
description.replace("value" + str(value), str(item))
|
||||
return description
|
||||
var row: Dictionary = Templates.get(Locale, {}).get(item_id, {})
|
||||
var variables: Dictionary = {}
|
||||
for i in mini(items.size(), 5):
|
||||
variables[str(row.get("value" + str(i), ""))] = items[i]
|
||||
return render_template(row, variables)
|
||||
|
||||
|
||||
func format_number(value: float, digits: int = 0) -> String:
|
||||
if value == 0: return ""
|
||||
if value < 10_000:
|
||||
return "%.*f" % [digits, value]
|
||||
func format_number(value, digits: int = 0) -> String:
|
||||
return E.grouped(value, digits)
|
||||
|
||||
var exp_value = int(floor(log(abs(value)) / log(10.0)))
|
||||
var mantissa = value / pow(10.0, exp_value)
|
||||
|
||||
return "%.*f" % [digits, mantissa] + "E%+d" % exp_value
|
||||
|
||||
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:
|
||||
OwniverseEntities = _read_from_csv("res://data/owniverse_entitites.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["en"] = _read_from_csv("res://data/templates.en.txt")
|
||||
|
||||
set_locale(str(Settings.language))
|
||||
|
||||
func _read_from_csv(file_path: String) -> Dictionary:
|
||||
if not FileAccess.file_exists(file_path):
|
||||
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())
|
||||
LifeRules = OwniverseLifeRuleLoader.get_data()
|
||||
OwniverseEntities = OwniverseEntityLoader.get_data()
|
||||
OwniverseItems = OwniverseItemLoader.get_data()
|
||||
Templates = OwniverseTemplateLoader.get_data()
|
||||
CivilizationRules = OwniverseCivilizationRuleLoader.get_data()
|
||||
|
||||
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
|
||||
Music = OwniverseAudioLoader.get_music()
|
||||
Effects = OwniverseAudioLoader.get_effects()
|
||||
|
||||
|
||||
func _read_folder_list(folder_name: String) -> void:
|
||||
|
||||
+347
-20
@@ -1,38 +1,363 @@
|
||||
# SaveManager.gd (добавить в AutoLoad)
|
||||
extends Node
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
# ~/Library/Application Support/Godot/app_userdata/Owniverse Adventure/savegame.cfg
|
||||
const SETTING_SECTION := "Settings"
|
||||
const SETTING_SECTION = "Settings"
|
||||
const SAVE_PATH = "user://settings.cfg"
|
||||
|
||||
const FORMAT_VERSION : int = 5
|
||||
const SimulationTime = preload("res://world/owniverse/simulation_time.gd")
|
||||
const WorldParameters = preload("res://world/owniverse/world_parameters.gd")
|
||||
const STATE_VERSION : String = SimulationTime.STATE_VERSION
|
||||
var last_error: String = ""
|
||||
var blocked_saves: Dictionary = {}
|
||||
var save_directory: String = "user://"
|
||||
signal save_completed ( filename : String , success : bool , error : String )
|
||||
signal saves_drained
|
||||
|
||||
# Queue ownership stays on the main thread. The worker only sees its snapshot.
|
||||
var _save_thread: Thread
|
||||
var _active_filename: String = ""
|
||||
var _pending_saves: Dictionary = {}
|
||||
|
||||
|
||||
func _process(_delta: Variant) -> void:
|
||||
if (E.ne(_save_thread, null) and (not _save_thread.is_alive())):
|
||||
_finish_save()
|
||||
|
||||
|
||||
func is_saving() -> bool:
|
||||
return (E.ne(_save_thread, null) or (not _pending_saves.is_empty()))
|
||||
|
||||
|
||||
func _snapshot(filename: String, password: String, data: Dictionary) -> Dictionary:
|
||||
var payload: Dictionary = E.encode(data)
|
||||
payload.format_version = FORMAT_VERSION
|
||||
payload.app_version = str(ProjectSettings.get_setting("application/config/version", ""))
|
||||
return {"filename": filename, "path": save_directory.path_join(E.add(filename, ".adventure")), "password": password, "payload": payload, "plaintext": Global.save_plaintext_copy, "speed_limit": Global.SPEED_LIMIT, "stages": Global.CivilizationRules.keys(), "entities": Global.OwniverseEntities.keys()}
|
||||
|
||||
|
||||
## True means queued, not written. Completion is reported by save_completed.
|
||||
func request_save(filename: String, password: String, data: Dictionary) -> bool:
|
||||
if blocked_saves.has(filename):
|
||||
return _fail(E.add("Save blocked to preserve an unreadable save: ", filename))
|
||||
_pending_saves[filename] = _snapshot(filename, password, data)
|
||||
if E.eq(_save_thread, null):
|
||||
_start_save()
|
||||
return true
|
||||
|
||||
|
||||
func _start_save() -> void:
|
||||
if _pending_saves.is_empty():
|
||||
return
|
||||
_active_filename = _pending_saves.keys()[0]
|
||||
var job: Dictionary = _pending_saves[_active_filename]
|
||||
_pending_saves.erase(_active_filename)
|
||||
_save_thread = Thread.new()
|
||||
var error: Error = _save_thread.start(_write_snapshot.bind(job))
|
||||
if E.ne(error, OK):
|
||||
_save_thread = null
|
||||
_fail(E.add("Cannot start save worker: ", error_string(error)))
|
||||
save_completed.emit(_active_filename, false, last_error)
|
||||
_start_save()
|
||||
if (not is_saving()): saves_drained.emit()
|
||||
|
||||
|
||||
func _finish_save() -> void:
|
||||
var error: String = _save_thread.wait_to_finish()
|
||||
var filename: String = _active_filename
|
||||
_save_thread = null
|
||||
last_error = error
|
||||
if E.ne(error, ""): push_error(error)
|
||||
save_completed.emit(filename, E.eq(error, ""), error)
|
||||
if E.eq(_save_thread, null): _start_save()
|
||||
if (not is_saving()): saves_drained.emit()
|
||||
|
||||
|
||||
## Used for application suspension and teardown, when frames may stop arriving.
|
||||
func flush_saves() -> void:
|
||||
while is_saving():
|
||||
if E.eq(_save_thread, null): _start_save()
|
||||
if E.ne(_save_thread, null): _finish_save()
|
||||
|
||||
|
||||
func _exit_tree() -> void:
|
||||
flush_saves()
|
||||
|
||||
#region Save Load routines
|
||||
|
||||
func _fail(message: String) -> bool:
|
||||
last_error = message
|
||||
push_error(message)
|
||||
return false
|
||||
|
||||
func save_data(filename: String, password: String, data: Dictionary) -> void:
|
||||
filename = "user://" + filename + ".adventure"
|
||||
var file := FileAccess.open_encrypted_with_pass(filename, FileAccess.WRITE, password)
|
||||
if file == null:
|
||||
push_error("Can't write to the file: ", filename)
|
||||
return
|
||||
|
||||
file.store_var(data) # бинарно + быстрее + сериализация
|
||||
func save_data(filename: String, password: String, data: Dictionary) -> bool:
|
||||
# Synchronous compatibility API must never race an asynchronous writer.
|
||||
flush_saves()
|
||||
last_error = ""
|
||||
if blocked_saves.has(filename):
|
||||
return _fail(E.add("Save blocked to preserve an unreadable save: ", filename))
|
||||
var error: String = _write_snapshot(_snapshot(filename, password, data))
|
||||
return (_fail(error) if E.ne(error, "") else true)
|
||||
|
||||
|
||||
static func _write_snapshot(job: Dictionary) -> String:
|
||||
var payload: Dictionary = job.payload
|
||||
var problem: String = _validate_payload(payload, job.speed_limit, job.stages, job.entities)
|
||||
if E.ne(problem, ""):
|
||||
return E.add("Invalid save: ", problem)
|
||||
var path: String = job.path
|
||||
var temporary: String = E.add(path, ".tmp")
|
||||
var file = FileAccess.open_encrypted_with_pass(temporary, FileAccess.WRITE, job.password)
|
||||
if E.eq(file, null):
|
||||
return E.add("Cannot write encrypted save: ", temporary)
|
||||
file.store_var(payload, false)
|
||||
file.close()
|
||||
# Check the actual encrypted file, including finalization, before replacing the old save.
|
||||
var verification = FileAccess.open_encrypted_with_pass(temporary, FileAccess.READ, job.password)
|
||||
if E.eq(verification, null):
|
||||
return E.add("Cannot verify encrypted save: ", temporary)
|
||||
var restored: Variant = verification.get_var(false)
|
||||
verification.close()
|
||||
if ((not (restored is Dictionary)) or E.ne(restored, payload)):
|
||||
return E.add("Encrypted save verification failed: ", temporary)
|
||||
if E.ne(DirAccess.rename_absolute(temporary, path), OK):
|
||||
return E.add("Cannot replace encrypted save: ", path)
|
||||
if job.plaintext:
|
||||
var plain_path: String = E.add(path, ".json")
|
||||
file = FileAccess.open(E.add(plain_path, ".tmp"), FileAccess.WRITE)
|
||||
if E.eq(file, null):
|
||||
return E.add("Encrypted save written, but cannot write diagnostic copy: ", plain_path)
|
||||
file.store_string(E.add(JSON.stringify(payload, " ", true, true), "\n"))
|
||||
file.flush()
|
||||
var write_error: Error = file.get_error()
|
||||
file.close()
|
||||
if (E.ne(write_error, OK) or E.ne(DirAccess.rename_absolute(E.add(plain_path, ".tmp"), plain_path), OK)):
|
||||
return E.add("Encrypted save written, but diagnostic copy failed: ", plain_path)
|
||||
return ""
|
||||
|
||||
|
||||
func load_data(filename: String, password: String) -> Dictionary:
|
||||
filename = "user://" + filename + ".adventure"
|
||||
if not FileAccess.file_exists(filename):
|
||||
flush_saves()
|
||||
last_error = ""
|
||||
# Plaintext is diagnostic only: never use it as a fallback.
|
||||
var path: String = save_directory.path_join(E.add(filename, ".adventure"))
|
||||
if (not FileAccess.file_exists(path)):
|
||||
return {}
|
||||
|
||||
var file := FileAccess.open_encrypted_with_pass(filename, FileAccess.READ, password)
|
||||
if file == null:
|
||||
push_error(filename, " couldn't be decrypted.")
|
||||
var file = FileAccess.open_encrypted_with_pass(path, FileAccess.READ, password)
|
||||
if E.eq(file, null):
|
||||
blocked_saves[filename] = true
|
||||
_fail(E.add("Cannot decrypt save: ", path))
|
||||
return {}
|
||||
|
||||
var data: Variant = file.get_var()
|
||||
var data: Variant = file.get_var(false)
|
||||
file.close()
|
||||
|
||||
return data if data is Dictionary else {}
|
||||
# Unsupported formats are archived, never converted or overwritten.
|
||||
# Returning no data lets the stage start a new, saveable session.
|
||||
if ((data is Dictionary) and E.ne(data.get("format_version"), FORMAT_VERSION)):
|
||||
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
|
||||
_fail(E.add("Cannot archive incompatible save: ", error_string(error)))
|
||||
return {}
|
||||
blocked_saves.erase(filename)
|
||||
push_warning(E.add(E.add("Incompatible save preserved at ", archive), "; starting a new game."))
|
||||
return {}
|
||||
var problem: String = validate_data(data)
|
||||
if E.ne(problem, ""):
|
||||
blocked_saves[filename] = true
|
||||
_fail(E.add(E.add(E.add("Invalid save ", path), ": "), problem))
|
||||
return {}
|
||||
blocked_saves.erase(filename)
|
||||
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:
|
||||
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))
|
||||
|
||||
|
||||
static func _number_map(value: Variant, whole: bool = false, nonnegative: bool = true) -> bool:
|
||||
if (not (value is Dictionary)):
|
||||
return false
|
||||
for key in value:
|
||||
if ((not (((key is String) or (key is StringName)))) or (not _number(value[key], whole, nonnegative))):
|
||||
return false
|
||||
return true
|
||||
|
||||
|
||||
static func _plain_tree(value: Variant) -> bool:
|
||||
if (value is Dictionary):
|
||||
for key in value:
|
||||
if ((not (((key is String) or (key is StringName)))) or (not _plain_tree(value[key]))):
|
||||
return false
|
||||
return true
|
||||
if (value is Array):
|
||||
for item in value:
|
||||
if (not _plain_tree(item)):
|
||||
return false
|
||||
return true
|
||||
return ((((E.eq(value, null) or (value is String)) or (value is StringName)) or (value is bool)) or _number(value, false, false))
|
||||
|
||||
|
||||
## Return a diagnostic path on failure; an empty string means the structure is valid.
|
||||
func validate_data(data: Variant) -> String:
|
||||
return _validate_payload(data, Global.SPEED_LIMIT, Global.CivilizationRules.keys(), Global.OwniverseEntities.keys())
|
||||
|
||||
|
||||
static func _validate_payload(data: Variant, speed_limit: int, stages: Array, entities: Array) -> String:
|
||||
if not E.valid_encoded(data): return "invalid exact number encoding"
|
||||
data = E.decode(data)
|
||||
if ((not (data is Dictionary)) or (not _plain_tree(data))):
|
||||
return "save must contain plain finite values"
|
||||
if (E.ne(data.get("format_version"), FORMAT_VERSION) or (not (data.get("app_version") is String))):
|
||||
return "unsupported save format"
|
||||
if (((not (data.get("ui") is Dictionary)) or (not E.numeric(data.ui.get("current_page")))) or E.lt(data.ui.current_page, 0)):
|
||||
return "invalid ui.current_page"
|
||||
if (not (data.get("state") is Dictionary)):
|
||||
return "state must be a Dictionary"
|
||||
var saved: Dictionary = data.state
|
||||
var required = ["version", "time", "speed", "speed_in_year", "energy", "batches", "batch_origins", "binds", "amount", "distribution", "auto_resources", "auto_star_deficits", "production_remainders", "resource_remainders", "evolution_remainders", "life_remainders", "planet_remainders", "blast_remainders", "destruction_remainders", "civilization_remainders", "civilization_stats", "civilization_homes", "ethics", "stats"]
|
||||
# Optional additions to the current format. Saves predating indicators keep
|
||||
# their quantities and receive neutral defaults from Owniverse on load.
|
||||
for field in saved:
|
||||
if (not E.contains(required, field) and not E.contains(["world_parameters", "trends"], field)):
|
||||
return "unsupported state structure"
|
||||
if saved.has("world_parameters"):
|
||||
if ((not _number_map(saved.world_parameters)) or E.ne(saved.world_parameters.size(), WorldParameters.defaults().size())):
|
||||
return "invalid state.world_parameters"
|
||||
for key in WorldParameters.defaults():
|
||||
if ((not saved.world_parameters.has(key)) or E.lt(saved.world_parameters[key], 1)):
|
||||
return E.add("invalid world parameter ", key)
|
||||
if (E.contains(["Bur", "Exp", "Agg"], key) and E.gt(saved.world_parameters[key], 19)):
|
||||
return E.add("invalid world scale ", key)
|
||||
if saved.has("trends"):
|
||||
if ((not _number_map(saved.trends)) or E.ne(saved.trends.size(), WorldParameters.TRENDS.size())):
|
||||
return "invalid state.trends"
|
||||
for key in WorldParameters.TRENDS:
|
||||
if ((not saved.trends.has(key)) or E.ge(saved.trends[key], 1)):
|
||||
return E.add("invalid trend ", key)
|
||||
for field in required:
|
||||
if (not saved.has(field)):
|
||||
return E.add("missing state.", field)
|
||||
if E.ne(saved.version, STATE_VERSION):
|
||||
return "unsupported state.version"
|
||||
if (((not (saved.time is Dictionary)) or (not _number(saved.time.get("datetime")))) or (not _number(saved.time.get("year")))):
|
||||
return "invalid state.time"
|
||||
if E.ne(saved.time.year, SimulationTime.processed_year(saved.time.datetime)):
|
||||
return "invalid processed time"
|
||||
if saved.time.has("tick_remainder"):
|
||||
if not E.finite(saved.time.tick_remainder) or E.ge(E.absolute(saved.time.tick_remainder), 1):
|
||||
return "invalid fractional tick"
|
||||
if (((not _number(saved.speed, true)) or E.lt(saved.speed, 1)) or E.gt(saved.speed, speed_limit)):
|
||||
return "invalid state.speed"
|
||||
if ((not _number(saved.speed_in_year)) or E.ne(saved.speed_in_year, E.power(10, E.subtract(saved.speed, 1)))):
|
||||
return "invalid state.speed_in_year"
|
||||
if data.has("simulation"):
|
||||
var checkpoint: Variant = data.simulation
|
||||
if not checkpoint is Dictionary or not checkpoint.get("productions") is Array:
|
||||
return "invalid simulation checkpoint"
|
||||
if not _number(checkpoint.get("speed"), true) or E.lt(checkpoint.speed, 1) or E.gt(checkpoint.speed, speed_limit):
|
||||
return "invalid simulation speed"
|
||||
for name in ["requested_clock", "active_clock"]:
|
||||
var clock: Variant = checkpoint.get(name)
|
||||
if not clock is Dictionary: return "invalid simulation clock"
|
||||
if clock.is_empty(): continue
|
||||
if not _number(clock.get("datetime")) or not _number(clock.get("year")):
|
||||
return "invalid simulation clock"
|
||||
if E.lt(clock.datetime, saved.time.datetime) or E.ne(clock.year, SimulationTime.processed_year(clock.datetime)):
|
||||
return "invalid simulation clock"
|
||||
if not E.finite(clock.get("tick_remainder", 0)) or E.ge(E.absolute(clock.get("tick_remainder", 0)), 1):
|
||||
return "invalid simulation tick"
|
||||
if not checkpoint.active_clock.is_empty():
|
||||
if checkpoint.requested_clock.is_empty() or E.gt(checkpoint.active_clock.datetime, checkpoint.requested_clock.datetime):
|
||||
return "invalid simulation clock order"
|
||||
for command in checkpoint.productions:
|
||||
if not command is Dictionary or not entities.has(command.get("id")) or not command.get("resource") is bool or not _number(command.get("amount")):
|
||||
return "invalid queued production"
|
||||
if command.resource and command.id not in ["S", "H"]: return "invalid queued resource production"
|
||||
if ((not _number(saved.energy, true)) or (not _number_map(saved.amount, true))):
|
||||
return "invalid state resources"
|
||||
if ((not (saved.stats is Dictionary)) or (not _number_map(saved.stats.get("total_amount"), true))):
|
||||
return "invalid state.stats.total_amount"
|
||||
if E.ne(saved.amount.keys(), saved.stats.total_amount.keys()):
|
||||
return "amount and total_amount keys differ"
|
||||
if ((not (saved.binds is Dictionary)) or (not (saved.batches is Dictionary))):
|
||||
return "state.binds and state.batches must be Dictionaries"
|
||||
for owner_id in saved.binds:
|
||||
if ((not saved.amount.has(owner_id)) or (not _number_map(saved.binds[owner_id], true))):
|
||||
return E.add("invalid state.binds.", owner_id)
|
||||
for id in saved.binds[owner_id]:
|
||||
if (not saved.amount.has(id)):
|
||||
return E.add("unknown bound resource ", id)
|
||||
for id in saved.batches:
|
||||
if ((not saved.amount.has(id)) or (not (saved.batches[id] is Array))):
|
||||
return E.add("invalid state.batches.", id)
|
||||
for batch in saved.batches[id]:
|
||||
if ((((not (batch is Dictionary)) or (not _number(batch.get("amount"), true))) or (not _number(batch.get("start_year")))) or (not _number(batch.get("end_year")))):
|
||||
return E.add("invalid batch in ", id)
|
||||
if E.lt(batch.end_year, batch.start_year):
|
||||
return E.add("reversed batch interval in ", id)
|
||||
if E.ne(batch.has("created_from"), batch.has("created_to")):
|
||||
return E.add("incomplete batch creation interval in ", id)
|
||||
if (batch.has("created_from") and (((((not _number(batch.created_from)) or (not _number(batch.created_to))) or E.le(batch.created_to, batch.created_from)) or E.lt(batch.start_year, batch.created_from)))):
|
||||
return E.add("invalid batch creation interval in ", id)
|
||||
if (batch.has("processed_until") and ((((not _number(batch.processed_until)) or E.lt(batch.processed_until, batch.start_year)) or E.gt(batch.processed_until, batch.end_year)))):
|
||||
return E.add("invalid batch.processed_until in ", id)
|
||||
if (batch.has("withdraw_remainder") and (((not _number(batch.withdraw_remainder)) or E.gt(batch.withdraw_remainder, batch.amount)))):
|
||||
return E.add("invalid batch.withdraw_remainder in ", id)
|
||||
for field in ["batch_origins", "distribution", "production_remainders", "evolution_remainders", "planet_remainders", "blast_remainders", "destruction_remainders", "life_remainders", "civilization_remainders", "civilization_stats"]:
|
||||
if (not _number_map(saved[field], false, false)):
|
||||
return E.add("invalid state.", field)
|
||||
if ((not _number_map(saved.auto_resources, true)) or (not _number_map(saved.auto_star_deficits, false, false))):
|
||||
return "invalid automatic production state"
|
||||
if ((((not (saved.resource_remainders is Dictionary)) or E.ne(saved.resource_remainders.keys().size(), 2)) or (not saved.resource_remainders.has("basic"))) or (not saved.resource_remainders.has("automatic"))):
|
||||
return "invalid state.resource_remainders"
|
||||
for channel in ["basic", "automatic"]:
|
||||
if (not _number_map(saved.resource_remainders[channel], false, false)):
|
||||
return E.add("invalid state.resource_remainders.", channel)
|
||||
if ((not (saved.ethics is Dictionary)) or (not (saved.civilization_homes is Dictionary))):
|
||||
return "invalid civilization state"
|
||||
for id in saved.ethics:
|
||||
if (not E.contains(stages, id) or (not _number_map(saved.ethics[id], true))):
|
||||
return E.add("invalid state.ethics.", str(id))
|
||||
for ethic in saved.ethics[id]:
|
||||
if not E.contains(["m", "l", "w", "d", "c", "b"], ethic):
|
||||
return E.add("invalid ethic ", str(ethic))
|
||||
for id in saved.civilization_homes:
|
||||
if (not _number_map(saved.civilization_homes[id], true)):
|
||||
return "invalid civilization homes"
|
||||
return ""
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -40,7 +365,7 @@ func load_data(filename: String, password: String) -> Dictionary:
|
||||
#region Settings
|
||||
func save_settings():
|
||||
var config = ConfigFile.new()
|
||||
|
||||
|
||||
for item in Global.Settings:
|
||||
config.set_value(SETTING_SECTION, item, Global.Settings[item])
|
||||
config.save(SAVE_PATH)
|
||||
@@ -48,9 +373,11 @@ func save_settings():
|
||||
func load_settings():
|
||||
var config = ConfigFile.new()
|
||||
var err = config.load(SAVE_PATH)
|
||||
if err != OK:
|
||||
if E.ne(err, OK):
|
||||
Global.set_locale(str(Global.Settings.language))
|
||||
return false
|
||||
for item in Global.Settings:
|
||||
Global.Settings[item] = config.get_value(SETTING_SECTION, item, Global.Settings[item])
|
||||
Global.set_locale(str(Global.Settings.language))
|
||||
return true
|
||||
#endregion
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
class_name CSVLoader
|
||||
|
||||
const SPLITTER = '|'
|
||||
|
||||
static func load(csv_text: String) -> Dictionary:
|
||||
var result: Dictionary = {}
|
||||
|
||||
var lines := csv_text.strip_edges().split("\n")
|
||||
|
||||
if lines.size() < 2:
|
||||
return result
|
||||
|
||||
var headers := lines[0].split(SPLITTER)
|
||||
|
||||
for i in range(1, lines.size()):
|
||||
var line := lines[i].strip_edges()
|
||||
|
||||
if line.is_empty():
|
||||
continue
|
||||
|
||||
var values := line.split(SPLITTER)
|
||||
|
||||
if values.size() != headers.size():
|
||||
push_warning(
|
||||
"CSV row %d has %d columns, expected %d"
|
||||
% [i + 1, values.size(), headers.size()]
|
||||
)
|
||||
continue
|
||||
|
||||
var elem: Dictionary = {}
|
||||
|
||||
for j in range(headers.size()):
|
||||
elem[headers[j].strip_edges()] = values[j].strip_edges()
|
||||
|
||||
result[elem[headers[0]]] = elem
|
||||
return result
|
||||
@@ -0,0 +1 @@
|
||||
uid://bfe1fyutcw0cx
|
||||
@@ -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,3 +0,0 @@
|
||||
ID | Name | Age | Email
|
||||
1 | John | 30 | john@example.com
|
||||
2 | Jane | 25 | jane@example.com
|
||||
|
@@ -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,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,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|Добавлен журнал изменений
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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()
|
||||
@@ -0,0 +1 @@
|
||||
uid://cb517ydjlk7iq
|
||||
@@ -0,0 +1,307 @@
|
||||
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
|
||||
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:d|C0.2|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.1:1
|
||||
C0.2:l|C0.2|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.1:1
|
||||
C0.2:c|C0.2|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.1:1
|
||||
C0.2:w|C0.2|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.1:1
|
||||
C0.3:m|C0.3|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.2:1
|
||||
C0.3:b|C0.3|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.2:1
|
||||
C0.3:d|C0.3|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.2:1
|
||||
C0.3:l|C0.3|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.2:1
|
||||
C0.3:c|C0.3|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.2:1
|
||||
C0.3:w|C0.3|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.2:1
|
||||
C0.4:m|C0.4|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.3:1
|
||||
C0.4:b|C0.4|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.3:1
|
||||
C0.4:d|C0.4|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.3:1
|
||||
C0.4:l|C0.4|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.3:1
|
||||
C0.4:c|C0.4|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.3:1
|
||||
C0.4:w|C0.4|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.3:1
|
||||
C0.5:m|C0.5|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.4:1
|
||||
C0.5:b|C0.5|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.4:1
|
||||
C0.5:d|C0.5|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.4:1
|
||||
C0.5:l|C0.5|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.4:1
|
||||
C0.5:c|C0.5|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.4:1
|
||||
C0.5:w|C0.5|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.4:1
|
||||
C0.6:m|C0.6|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.5:1
|
||||
C0.6:b|C0.6|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.5:1
|
||||
C0.6:d|C0.6|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.5:1
|
||||
C0.6:l|C0.6|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.5:1
|
||||
C0.6:c|C0.6|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.5:1
|
||||
C0.6:w|C0.6|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.5:1
|
||||
C0.7:m|C0.7|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.6:1
|
||||
C0.7:b|C0.7|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.6:1
|
||||
C0.7:d|C0.7|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.6:1
|
||||
C0.7:l|C0.7|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.6:1
|
||||
C0.7:c|C0.7|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.6:1
|
||||
C0.7:w|C0.7|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.6:1
|
||||
C0.8:m|C0.8|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.7:1
|
||||
C0.8:b|C0.8|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.7:1
|
||||
C0.8:d|C0.8|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.7:1
|
||||
C0.8:l|C0.8|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.7:1
|
||||
C0.8:c|C0.8|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.7:1
|
||||
C0.8:w|C0.8|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.7:1
|
||||
C0.9:m|C0.9|2E+03||||||1|m|0.0084|0.01|0.0000625|0.001024||1.6|C0.8:512^C0.7:256^EON5:21^EON1:6
|
||||
C0.9:b|C0.9|2E+03||||||1|b|0.01859375|0.02|0.00003125|0.0025||1|C0.8:512^C0.7:256^EON5:43^EON1:9
|
||||
C0.9:d|C0.9|2E+03||||||1|d|0.0112|0.01538461538|0.0005|0.00015625||1|C0.8:512^C0.7:256^EON5:7^EON1:3
|
||||
C0.9:l|C0.9|2E+03||||||1|l|0.0504|0.03571428571|0.0005|0.0025||0.5|C0.8:512^C0.7:256^EON5:60^EON1:11
|
||||
C0.9:c|C0.9|2E+03||||||1|c|0.021|0.02604166667|0.004096|0.006103515625||0.8|C0.8:512^C0.7:256^EON5:252^EON1:19
|
||||
C0.9:w|C0.9|2E+03||||||1|w|0.02625|0.03125|0.0005|0.016384||1.25|C0.8:512^C0.7:256^EON5:260^EON1:26
|
||||
C1.0:m|C1.0|5E+03||||||1|m|0.009|0.01|0.0000625|0.001024||1.6|C0.9:1024^EON5:21^EON1:6
|
||||
C1.0:b|C1.0|5E+03||||||1|b|0.019921875|0.02|0.00003125|0.0025||1|C0.9:1024^EON5:43^EON1:9
|
||||
C1.0:d|C1.0|5E+03||||||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C0.9:1024^EON5:7^EON1:3
|
||||
C1.0:l|C1.0|5E+03||||||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C0.9:1024^EON5:60^EON1:11
|
||||
C1.0:c|C1.0|5E+03||||||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C0.9:1024^EON5:152^EON1:19
|
||||
C1.0:w|C1.0|5E+03||||||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C0.9:1024^EON5:260^EON1:26
|
||||
C1.1:m|C1.1|5E+03||||||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.0:1024^C0.9:256^EON5:21^EON1:6
|
||||
C1.1:b|C1.1|5E+03||||||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.0:1024^C0.9:256^EON5:43^EON1:9
|
||||
C1.1:d|C1.1|5E+03||||||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.0:1024^C0.9:256^EON5:7^EON1:3
|
||||
C1.1:l|C1.1|5E+03||||||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.0:1024^C0.9:256^EON5:60^EON1:11
|
||||
C1.1:c|C1.1|5E+03||||||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.0:1024^C0.9:256^EON5:152^EON1:19
|
||||
C1.1:w|C1.1|5E+03||||||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.0:1024^C0.9:256^EON5:260^EON1:26
|
||||
C1.2:m|C1.2|5E+03||||||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.1:256^C1.0:1024^C0.9:256^EON5:21^EON1:6
|
||||
C1.2:b|C1.2|5E+03||||||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.1:256^C1.0:1024^C0.9:256^EON5:43^EON1:9
|
||||
C1.2:d|C1.2|5E+03||||||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.1:256^C1.0:1024^C0.9:256^EON5:7^EON1:3
|
||||
C1.2:l|C1.2|5E+03||||||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.1:256^C1.0:1024^C0.9:256^EON5:60^EON1:11
|
||||
C1.2:c|C1.2|5E+03||||||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.1:256^C1.0:1024^C0.9:256^EON5:152^EON1:19
|
||||
C1.2:w|C1.2|5E+03||||||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.1:256^C1.0:1024^C0.9:256^EON5:260^EON1:26
|
||||
C1.3:m|C1.3|5E+03||||||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.2:256^C1.0:1024^C0.9:64^EON5:13^EON1:13
|
||||
C1.3:b|C1.3|5E+03||||||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.2:256^C1.0:1024^C0.9:64^EON5:22^EON1:22
|
||||
C1.3:d|C1.3|5E+03||||||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.2:256^C1.0:1024^C0.9:64^EON5:5^EON1:5
|
||||
C1.3:l|C1.3|5E+03||||||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.2:256^C1.0:1024^C0.9:64^EON5:30^EON1:30
|
||||
C1.3:c|C1.3|5E+03||||||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.2:256^C1.0:1024^C0.9:64^EON5:64^EON1:64
|
||||
C1.3:w|C1.3|5E+03||||||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.2:256^C1.0:1024^C0.9:64^EON5:100^EON1:100
|
||||
C1.4:m|C1.4|5E+03||||||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.3:384^C1.0:896^EON5:6^EON1:21
|
||||
C1.4:b|C1.4|5E+03||||||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.3:384^C1.0:896^EON5:9^EON1:43
|
||||
C1.4:d|C1.4|5E+03||||||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.3:384^C1.0:896^EON5:3^EON1:7
|
||||
C1.4:l|C1.4|5E+03||||||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.3:384^C1.0:896^EON5:11^EON1:60
|
||||
C1.4:c|C1.4|5E+03||||||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.3:384^C1.0:896^EON5:19^EON1:152
|
||||
C1.4:w|C1.4|5E+03||||||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.3:384^C1.0:896^EON5:26^EON1:260
|
||||
C1.5:m|C1.5|5E+03||||||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.4:512^C1.0:768^EON5:6^EON1:21
|
||||
C1.5:b|C1.5|5E+03||||||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.4:512^C1.0:768^EON5:9^EON1:43
|
||||
C1.5:d|C1.5|5E+03||||||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.4:512^C1.0:768^EON5:3^EON1:7
|
||||
C1.5:l|C1.5|5E+03||||||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.4:512^C1.0:768^EON5:11^EON1:60
|
||||
C1.5:c|C1.5|5E+03||||||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.4:512^C1.0:768^EON5:19^EON1:152
|
||||
C1.5:w|C1.5|5E+03||||||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.4:512^C1.0:768^EON5:26^EON1:260
|
||||
C1.6:m|C1.6|5E+03|||1|||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.5:768^C1.0:512^EON5:6^RP:21
|
||||
C1.6:b|C1.6|5E+03|||1|||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.5:768^C1.0:512^EON5:9^RP:43
|
||||
C1.6:d|C1.6|5E+03|||1|||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.5:768^C1.0:512^EON5:3^RP:7
|
||||
C1.6:l|C1.6|5E+03|||1|||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.5:768^C1.0:512^EON5:11^RP:60
|
||||
C1.6:c|C1.6|5E+03|||1|||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.5:768^C1.0:512^EON5:19^RP:152
|
||||
C1.6:w|C1.6|5E+03|||1|||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.5:768^C1.0:512^EON5:26^RP:260
|
||||
C1.7:m|C1.7|5E+03|||1|||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.6:896^C1.0:384^EON5:6^RP:21
|
||||
C1.7:b|C1.7|5E+03|||1|||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.6:896^C1.0:384^EON5:9^RP:43
|
||||
C1.7:d|C1.7|5E+03|||1|||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.6:896^C1.0:384^EON5:3^RP:7
|
||||
C1.7:l|C1.7|5E+03|||1|||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.6:896^C1.0:384^EON5:11^RP:60
|
||||
C1.7:c|C1.7|5E+03|||1|||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.6:896^C1.0:384^EON5:19^RP:152
|
||||
C1.7:w|C1.7|5E+03|||1|||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.6:896^C1.0:384^EON5:26^RP:260
|
||||
C1.8:m|C1.8|5E+03|||1|||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.7:1024^C1.0:256^EON5:6^RP:21
|
||||
C1.8:b|C1.8|5E+03|||1|||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.7:1024^C1.0:256^EON5:9^RP:43
|
||||
C1.8:d|C1.8|5E+03|||1|||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.7:1024^C1.0:256^EON5:3^RP:7
|
||||
C1.8:l|C1.8|5E+03|||1|||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.7:1024^C1.0:256^EON5:11^RP:60
|
||||
C1.8:c|C1.8|5E+03|||1|||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.7:1024^C1.0:256^EON5:19^RP:152
|
||||
C1.8:w|C1.8|5E+03|||1|||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.7:1024^C1.0:256^EON5:26^RP:260
|
||||
C1.9:m|C1.9|5E+03|||1|||1|m|0.009|0.01|0.0000625|0.001024||1.6|C1.8:1024^C1.0:128^EON5:6^RP:21
|
||||
C1.9:b|C1.9|5E+03|||1|||1|b|0.019921875|0.02|0.00003125|0.0025||1|C1.8:1024^C1.0:128^EON5:9^RP:43
|
||||
C1.9:d|C1.9|5E+03|||1|||1|d|0.012|0.01538461538|0.0005|0.00015625||1|C1.8:1024^C1.0:128^EON5:3^RP:7
|
||||
C1.9:l|C1.9|5E+03|||1|||1|l|0.054|0.03571428571|0.0005|0.0025||0.5|C1.8:1024^C1.0:128^EON5:11^RP:60
|
||||
C1.9:c|C1.9|5E+03|||1|||1|c|0.0225|0.02604166667|0.004096|0.006103515625||0.8|C1.8:1024^C1.0:128^EON5:19^RP:152
|
||||
C1.9:w|C1.9|5E+03|||1|||1|w|0.028125|0.03125|0.0005|0.016384||1.25|C1.8:1024^C1.0:128^EON5:26^RP:260
|
||||
C2.0:m|C2.0|5E+03|DwStar|1E+00|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C1.9:1024^C1.0:128^RP:28
|
||||
C2.0:b|C2.0|5E+03|DwStar|1E+00|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C1.9:1024^C1.0:128^EON5:9^RP:59
|
||||
C2.0:d|C2.0|5E+03|DwStar|1E+00|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C1.9:1024^C1.0:128^EON5:3^RP:8
|
||||
C2.0:l|C2.0|5E+03|DwStar|1E+00|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C1.9:1024^C1.0:128^EON5:11^RP:85
|
||||
C2.0:c|C2.0|5E+03|DwStar|1E+00|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C1.9:1024^C1.0:128^EON5:19^RP:235
|
||||
C2.0:w|C2.0|5E+03|DwStar|1E+00|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C1.9:1024^C1.0:128^EON5:26^RP:419
|
||||
C2.1:m|C2.1|5E+03|DwStar|1E+01|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.0:1
|
||||
C2.1:b|C2.1|5E+03|DwStar|1E+01|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.0:1
|
||||
C2.1:d|C2.1|5E+03|DwStar|1E+01|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.0:1
|
||||
C2.1:l|C2.1|5E+03|DwStar|1E+01|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.0:1
|
||||
C2.1:c|C2.1|5E+03|DwStar|1E+01|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.0:1
|
||||
C2.1:w|C2.1|5E+03|DwStar|1E+01|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.0:1
|
||||
C2.2:m|C2.2|1E+04|DwStar|1E+02|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.1:1024^C2.0:6
|
||||
C2.2:b|C2.2|1E+04|DwStar|1E+02|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.1:1024^C2.0:9
|
||||
C2.2:d|C2.2|1E+04|DwStar|1E+02|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.1:1024^C2.0:3
|
||||
C2.2:l|C2.2|1E+04|DwStar|1E+02|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.1:1024^C2.0:11
|
||||
C2.2:c|C2.2|1E+04|DwStar|1E+02|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.1:1024^C2.0:19
|
||||
C2.2:w|C2.2|1E+04|DwStar|1E+02|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.1:1024^C2.0:26
|
||||
C2.3:m|C2.3|2E+04|DwStar|1E+03|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.2:1024^C2.1:6
|
||||
C2.3:b|C2.3|2E+04|DwStar|1E+03|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.2:1024^C2.1:9
|
||||
C2.3:d|C2.3|2E+04|DwStar|1E+03|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.2:1024^C2.1:3
|
||||
C2.3:l|C2.3|2E+04|DwStar|1E+03|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.2:1024^C2.1:11
|
||||
C2.3:c|C2.3|2E+04|DwStar|1E+03|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.2:1024^C2.1:19
|
||||
C2.3:w|C2.3|2E+04|DwStar|1E+03|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.2:1024^C2.1:26
|
||||
C2.4:m|C2.4|2E+04|DwStar|1E+04|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.3:1024^C2.2:6
|
||||
C2.4:b|C2.4|2E+04|DwStar|1E+04|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.3:1024^C2.2:9
|
||||
C2.4:d|C2.4|2E+04|DwStar|1E+04|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.3:1024^C2.2:3
|
||||
C2.4:l|C2.4|2E+04|DwStar|1E+04|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.3:1024^C2.2:11
|
||||
C2.4:c|C2.4|2E+04|DwStar|1E+04|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.3:1024^C2.2:19
|
||||
C2.4:w|C2.4|2E+04|DwStar|1E+04|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.3:1024^C2.2:26
|
||||
C2.5:m|C2.5|3E+04|DwStar|1E+05|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.4:1024^C2.3:6
|
||||
C2.5:b|C2.5|3E+04|DwStar|1E+05|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.4:1024^C2.3:9
|
||||
C2.5:d|C2.5|3E+04|DwStar|1E+05|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.4:1024^C2.3:3
|
||||
C2.5:l|C2.5|3E+04|DwStar|1E+05|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.4:1024^C2.3:11
|
||||
C2.5:c|C2.5|3E+04|DwStar|1E+05|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.4:1024^C2.3:19
|
||||
C2.5:w|C2.5|3E+04|DwStar|1E+05|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.4:1024^C2.3:26
|
||||
C2.6:m|C2.6|3E+04|DwStar|1E+06|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.5:1024^C2.4:6
|
||||
C2.6:b|C2.6|3E+04|DwStar|1E+06|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.5:1024^C2.4:9
|
||||
C2.6:d|C2.6|3E+04|DwStar|1E+06|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.5:1024^C2.4:3
|
||||
C2.6:l|C2.6|3E+04|DwStar|1E+06|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.5:1024^C2.4:11
|
||||
C2.6:c|C2.6|3E+04|DwStar|1E+06|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.5:1024^C2.4:19
|
||||
C2.6:w|C2.6|3E+04|DwStar|1E+06|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.5:1024^C2.4:26
|
||||
C2.7:m|C2.7|4E+04|GiStar|1E+07|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.6:1024^C2.5:6
|
||||
C2.7:b|C2.7|4E+04|GiStar|1E+07|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.6:1024^C2.5:9
|
||||
C2.7:d|C2.7|4E+04|GiStar|1E+07|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.6:1024^C2.5:3
|
||||
C2.7:l|C2.7|4E+04|GiStar|1E+07|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.6:1024^C2.5:11
|
||||
C2.7:c|C2.7|4E+04|GiStar|1E+07|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.6:1024^C2.5:19
|
||||
C2.7:w|C2.7|4E+04|GiStar|1E+07|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.6:1024^C2.5:26
|
||||
C2.8:m|C2.8|4E+04|GiStar|1E+08|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.7:1024^C2.6:6
|
||||
C2.8:b|C2.8|4E+04|GiStar|1E+08|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.7:1024^C2.6:9
|
||||
C2.8:d|C2.8|4E+04|GiStar|1E+08|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.7:1024^C2.6:3
|
||||
C2.8:l|C2.8|4E+04|GiStar|1E+08|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.7:1024^C2.6:11
|
||||
C2.8:c|C2.8|4E+04|GiStar|1E+08|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.7:1024^C2.6:19
|
||||
C2.8:w|C2.8|4E+04|GiStar|1E+08|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.7:1024^C2.6:26
|
||||
C2.9:m|C2.9|5E+04|GiStar|1E+09|1|1|1|1|m|0.006|0.01|0.0005|0.00128|1|1.6|C2.8:1024^C2.7:6
|
||||
C2.9:b|C2.9|5E+04|GiStar|1E+09|1|1|1|1|b|0.02125|0.015625|0.00003125|0.0025|0.64|1|C2.8:1024^C2.7:9
|
||||
C2.9:d|C2.9|5E+04|GiStar|1E+09|1|1|1|1|d|0.0128|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.8:1024^C2.7:3
|
||||
C2.9:l|C2.9|5E+04|GiStar|1E+09|1|1|1|1|l|0.0576|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.8:1024^C2.7:11
|
||||
C2.9:c|C2.9|5E+04|GiStar|1E+09|1|1|1|1|c|0.024|0.04166666667|0.004096|0.006103515625|1|0.8|C2.8:1024^C2.7:19
|
||||
C2.9:w|C2.9|5E+04|GiStar|1E+09|1|1|1|1|w|0.03|0.025|0.000256|0.03072|0.25|1.25|C2.8:1024^C2.7:26
|
||||
C3.0:m|C3.0|1E+05|GiStar|1E+10|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C2.9:1024^C2.8:6
|
||||
C3.0:b|C3.0|1E+05|GiStar|1E+10|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C2.9:1024^C2.8:9
|
||||
C3.0:d|C3.0|1E+05|GiStar|1E+10|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C2.9:1024^C2.8:3
|
||||
C3.0:l|C3.0|1E+05|GiStar|1E+10|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C2.9:1024^C2.8:11
|
||||
C3.0:c|C3.0|1E+05|GiStar|1E+10|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C2.9:1024^C2.8:19
|
||||
C3.0:w|C3.0|1E+05|GiStar|1E+10|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C2.9:1024^C2.8:26
|
||||
C3.1:m|C3.1|1E+05|GiStar|1E+11|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.0:1024^C2.9:6
|
||||
C3.1:b|C3.1|1E+05|GiStar|1E+11|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.0:1024^C2.9:9
|
||||
C3.1:d|C3.1|1E+05|GiStar|1E+11|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.0:1024^C2.9:3
|
||||
C3.1:l|C3.1|1E+05|GiStar|1E+11|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.0:1024^C2.9:11
|
||||
C3.1:c|C3.1|1E+05|GiStar|1E+11|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.0:1024^C2.9:19
|
||||
C3.1:w|C3.1|1E+05|GiStar|1E+11|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.0:1024^C2.9:26
|
||||
C3.2:m|C3.2|2E+05|WD|1E+12|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.1:1024^C3.0:6
|
||||
C3.2:b|C3.2|2E+05|WD|1E+12|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.1:1024^C3.0:9
|
||||
C3.2:d|C3.2|2E+05|WD|1E+12|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.1:1024^C3.0:3
|
||||
C3.2:l|C3.2|2E+05|WD|1E+12|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.1:1024^C3.0:11
|
||||
C3.2:c|C3.2|2E+05|WD|1E+12|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.1:1024^C3.0:19
|
||||
C3.2:w|C3.2|2E+05|WD|1E+12|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.1:1024^C3.0:26
|
||||
C3.3:m|C3.3|3E+05|WD|1E+13|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.2:1024^C3.1:6
|
||||
C3.3:b|C3.3|3E+05|WD|1E+13|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.2:1024^C3.1:9
|
||||
C3.3:d|C3.3|3E+05|WD|1E+13|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.2:1024^C3.1:3
|
||||
C3.3:l|C3.3|3E+05|WD|1E+13|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.2:1024^C3.1:11
|
||||
C3.3:c|C3.3|3E+05|WD|1E+13|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.2:1024^C3.1:19
|
||||
C3.3:w|C3.3|3E+05|WD|1E+13|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.2:1024^C3.1:26
|
||||
C3.4:m|C3.4|4E+05|WD|1E+14|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.3:1024^C3.2:6
|
||||
C3.4:b|C3.4|4E+05|WD|1E+14|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.3:1024^C3.2:9
|
||||
C3.4:d|C3.4|4E+05|WD|1E+14|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.3:1024^C3.2:3
|
||||
C3.4:l|C3.4|4E+05|WD|1E+14|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.3:1024^C3.2:11
|
||||
C3.4:c|C3.4|4E+05|WD|1E+14|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.3:1024^C3.2:19
|
||||
C3.4:w|C3.4|4E+05|WD|1E+14|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.3:1024^C3.2:26
|
||||
C3.5:m|C3.5|5E+05|NS|1E+15|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.4:1024^C3.3:6
|
||||
C3.5:b|C3.5|5E+05|NS|1E+15|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.4:1024^C3.3:9
|
||||
C3.5:d|C3.5|5E+05|NS|1E+15|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.4:1024^C3.3:3
|
||||
C3.5:l|C3.5|5E+05|NS|1E+15|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.4:1024^C3.3:11
|
||||
C3.5:c|C3.5|5E+05|NS|1E+15|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.4:1024^C3.3:19
|
||||
C3.5:w|C3.5|5E+05|NS|1E+15|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.4:1024^C3.3:26
|
||||
C3.6:m|C3.6|6E+05|NS|1E+16|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.5:1024^C3.4:6
|
||||
C3.6:b|C3.6|6E+05|NS|1E+16|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.5:1024^C3.4:9
|
||||
C3.6:d|C3.6|6E+05|NS|1E+16|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.5:1024^C3.4:3
|
||||
C3.6:l|C3.6|6E+05|NS|1E+16|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.5:1024^C3.4:11
|
||||
C3.6:c|C3.6|6E+05|NS|1E+16|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.5:1024^C3.4:19
|
||||
C3.6:w|C3.6|6E+05|NS|1E+16|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.5:1024^C3.4:26
|
||||
C3.7:m|C3.7|7E+05|MGT|1E+17|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.6:1024^C3.5:6
|
||||
C3.7:b|C3.7|7E+05|MGT|1E+17|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.6:1024^C3.5:9
|
||||
C3.7:d|C3.7|7E+05|MGT|1E+17|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.6:1024^C3.5:3
|
||||
C3.7:l|C3.7|7E+05|MGT|1E+17|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.6:1024^C3.5:11
|
||||
C3.7:c|C3.7|7E+05|MGT|1E+17|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.6:1024^C3.5:19
|
||||
C3.7:w|C3.7|7E+05|MGT|1E+17|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.6:1024^C3.5:26
|
||||
C3.8:m|C3.8|8E+05|MGT|1E+18|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.7:1024^C3.6:6
|
||||
C3.8:b|C3.8|8E+05|MGT|1E+18|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.7:1024^C3.6:9
|
||||
C3.8:d|C3.8|8E+05|MGT|1E+18|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.7:1024^C3.6:3
|
||||
C3.8:l|C3.8|8E+05|MGT|1E+18|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.7:1024^C3.6:11
|
||||
C3.8:c|C3.8|8E+05|MGT|1E+18|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.7:1024^C3.6:19
|
||||
C3.8:w|C3.8|8E+05|MGT|1E+18|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.7:1024^C3.6:26
|
||||
C3.9:m|C3.9|9E+05|BH|1E+19|1|1|1|1|m|0.006375|0.01|0.0005|0.00128|1|1.6|C3.8:1024^C3.7:6
|
||||
C3.9:b|C3.9|9E+05|BH|1E+19|1|1|1|1|b|0.022578125|0.015625|0.00003125|0.0025|0.64|1|C3.8:1024^C3.7:9
|
||||
C3.9:d|C3.9|9E+05|BH|1E+19|1|1|1|1|d|0.0136|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.8:1024^C3.7:3
|
||||
C3.9:l|C3.9|9E+05|BH|1E+19|1|1|1|1|l|0.0612|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.8:1024^C3.7:11
|
||||
C3.9:c|C3.9|9E+05|BH|1E+19|1|1|1|1|c|0.0255|0.04166666667|0.004096|0.006103515625|1|0.8|C3.8:1024^C3.7:19
|
||||
C3.9:w|C3.9|9E+05|BH|1E+19|1|1|1|1|w|0.031875|0.025|0.000256|0.03072|0.25|1.25|C3.8:1024^C3.7:26
|
||||
C4.0:m|C4.0|2E+06|BH|1E+20|1|1|1|1|m|0.00675|0.01|0.0005|0.00128|1|1.6|C3.9:1024^C3.8:6
|
||||
C4.0:b|C4.0|2E+06|BH|1E+20|1|1|1|1|b|0.02390625|0.015625|0.00003125|0.0025|0.64|1|C3.9:1024^C3.8:9
|
||||
C4.0:d|C4.0|2E+06|BH|1E+20|1|1|1|1|d|0.0144|0.01923076923|0.0009765625|0.0003125|2.56|1|C3.9:1024^C3.8:3
|
||||
C4.0:l|C4.0|2E+06|BH|1E+20|1|1|1|1|l|0.0648|0.04464285714|0.0005|0.0025|1.5625|0.5|C3.9:1024^C3.8:11
|
||||
C4.0:c|C4.0|2E+06|BH|1E+20|1|1|1|1|c|0.027|0.04166666667|0.004096|0.006103515625|1|0.8|C3.9:1024^C3.8:19
|
||||
C4.0:w|C4.0|2E+06|BH|1E+20|1|1|1|1|w|0.03375|0.025|0.000256|0.03072|0.25|1.25|C3.9:1024^C3.8:26
|
||||
C4.1:m|C4.1|2E+06|BH|1E+21|1|1|1|1|m|0.00675|0.01|0.0005|0.00128|1|1.6|C4.0:1024^C3.9:6
|
||||
C4.1:b|C4.1|2E+06|BH|1E+21|1|1|1|1|b|0.02390625|0.015625|0.00003125|0.0025|0.64|1|C4.0:1024^C3.9:9
|
||||
C4.1:d|C4.1|2E+06|BH|1E+21|1|1|1|1|d|0.0144|0.01923076923|0.0009765625|0.0003125|2.56|1|C4.0:1024^C3.9:3
|
||||
C4.1:l|C4.1|2E+06|BH|1E+21|1|1|1|1|l|0.0648|0.04464285714|0.0005|0.0025|1.5625|0.5|C4.0:1024^C3.9:11
|
||||
C4.1:c|C4.1|2E+06|BH|1E+21|1|1|1|1|c|0.027|0.04166666667|0.004096|0.006103515625|1|0.8|C4.0:1024^C3.9:19
|
||||
C4.1:w|C4.1|2E+06|BH|1E+21|1|1|1|1|w|0.03375|0.025|0.000256|0.03072|0.25|1.25|C4.0:1024^C3.9:26
|
||||
C4.2:m|C4.2|4E+06|SMBH|1E+22|1|1|1|1|m|0.00675|0.01|0.0005|0.00128|1|1.6|C4.1:1024^C4.0:6
|
||||
C4.2:b|C4.2|4E+06|SMBH|1E+22|1|1|1|1|b|0.02390625|0.015625|0.00003125|0.0025|0.64|1|C4.1:1024^C4.0:9
|
||||
C4.2:d|C4.2|4E+06|SMBH|1E+22|1|1|1|1|d|0.0144|0.01923076923|0.0009765625|0.0003125|2.56|1|C4.1:1024^C4.0:3
|
||||
C4.2:l|C4.2|4E+06|SMBH|1E+22|1|1|1|1|l|0.0648|0.04464285714|0.0005|0.0025|1.5625|0.5|C4.1:1024^C4.0:11
|
||||
C4.2:c|C4.2|4E+06|SMBH|1E+22|1|1|1|1|c|0.027|0.04166666667|0.004096|0.006103515625|1|0.8|C4.1:1024^C4.0:19
|
||||
C4.2:w|C4.2|4E+06|SMBH|1E+22|1|1|1|1|w|0.03375|0.025|0.000256|0.03072|0.25|1.25|C4.1:1024^C4.0:26
|
||||
C4.3:m|C4.3|6E+06|SMBH|1E+23|1|1|1|1|m|0.00675|0.01|0.0005|0.00128|1|1.6|C4.2:1024^C4.1:6
|
||||
C4.3:b|C4.3|6E+06|SMBH|1E+23|1|1|1|1|b|0.02390625|0.015625|0.00003125|0.0025|0.64|1|C4.2:1024^C4.1:9
|
||||
C4.3:d|C4.3|6E+06|SMBH|1E+23|1|1|1|1|d|0.0144|0.01923076923|0.0009765625|0.0003125|2.56|1|C4.2:1024^C4.1:3
|
||||
C4.3:l|C4.3|6E+06|SMBH|1E+23|1|1|1|1|l|0.0648|0.04464285714|0.0005|0.0025|1.5625|0.5|C4.2:1024^C4.1:11
|
||||
C4.3:c|C4.3|6E+06|SMBH|1E+23|1|1|1|1|c|0.027|0.04166666667|0.004096|0.006103515625|1|0.8|C4.2:1024^C4.1:19
|
||||
C4.3:w|C4.3|6E+06|SMBH|1E+23|1|1|1|1|w|0.03375|0.025|0.000256|0.03072|0.25|1.25|C4.2:1024^C4.1:26
|
||||
C4.4:m|C4.4|8E+06|SMBH|1E+24|1|1|1|1|m|0.00675|0.01|0.0005|0.00128|1|1.6|C4.3:1024^C4.2:6
|
||||
C4.4:b|C4.4|8E+06|SMBH|1E+24|1|1|1|1|b|0.02390625|0.015625|0.00003125|0.0025|0.64|1|C4.3:1024^C4.2:9
|
||||
C4.4:d|C4.4|8E+06|SMBH|1E+24|1|1|1|1|d|0.0144|0.01923076923|0.0009765625|0.0003125|2.56|1|C4.3:1024^C4.2:3
|
||||
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: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
|
||||
@@ -1,6 +1,14 @@
|
||||
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
|
||||
S|1|S:0|S:0||||||||||||||||S||||
|
||||
H|1|H:0|H:0||||||||||||||||H||||
|
||||
S|1|S:0|E:1||||||||||||||||S||||
|
||||
H|1|H:0|E:1||||||||||||||||H||||
|
||||
He|1|He:1|||||||||||||||||||||
|
||||
Met|1|Met:1|||||||||||||||||||||
|
||||
BD|1|BD:1|||||||||||||||||||||
|
||||
@@ -21,14 +29,14 @@ LRG|0||||50||50000000||||S:300||DSN^SGRB%0.1|2|||RG|Star|||||
|
||||
HRG|0||||100||10000000||||S:400.||SN^GRB%1|2|||RG|Star|||||
|
||||
RSG|0||||300||1000000||||S:500||BSN^LGRB%3|2|||RG|Star|||||
|
||||
RHG|0||||1000||100000||||S:600||HN^HGRB%10|2|||RG|Star|||||
|
||||
DSN|0||||||1|||2|S:59.1||SNS:1&H:6.5&He:13.5&Met:11&blast:2|2|mass:15&H:6.5&HE:13.5&MET:11||||SNGRBB||||
|
||||
SN|0||||||1|||9|S:99.1||LNS:1&H:8&He:50&Met:11&blast:9|2|mass:18&H:8&HE:50&MET:11||||SNGRBB||||
|
||||
BSN|0||||||1||.|305|S:309.1||MGT:1&H:15&He:186&Met:15&blast:305|2|mass:21&H:15&HE:186&MET:15||||SNGRBB||||
|
||||
HN|0||||||1|||9990|S:939.1||BH40:1&H:30&He:560&Met:30&blast:9990|2|mass:40&H:30&HE:560&MET:30||||SNGRBB||||
|
||||
SGRB|0||||||1||0.001|31|S:149.1||BH25:1&H:0.5&He:10&Met:4&blast:31|2|mass:25&H:0.5&HE:10&MET:4||||SNGRBB||||
|
||||
GRB|0||||||1||0.01|136|S:239.1||BH30:1&H:19&He:12&Met:5&blast:136|2|mass:30&H:19&HE:12&MET:5||||SNGRBB||||
|
||||
LGRB|0||||||1||0.03|3446|S:669.1||BH40:1&H:68&He:18&Met:9&blast:3446|2|mass:40&H:68&HE:18&MET:9||||SNGRBB||||
|
||||
HGRB|0||||||1||0.1|97342|S:1939.1||BH60:1&H:0&He:40&Met:10&blast:97342|2|mass:60&H:0&HE:40&MET:10||||SNGRBB||||
|
||||
DSN|0||||||1|||2|S:59.1||SNS:1&H:6.5&He:13.5&Met:11|2|mass:15&H:6.5&HE:13.5&MET:11||||SNGRBB||||
|
||||
SN|0||||||1|||9|S:99.1||LNS:1&H:8&He:50&Met:11|2|mass:18&H:8&HE:50&MET:11||||SNGRBB||||
|
||||
BSN|0||||||1||.|305|S:309.1||MGT:1&H:15&He:186&Met:15|2|mass:21&H:15&HE:186&MET:15||||SNGRBB||||
|
||||
HN|0||||||1|||9990|S:939.1||BH40:1&H:30&He:560&Met:30|2|mass:40&H:30&HE:560&MET:30||||SNGRBB||||
|
||||
SGRB|0||||||1||0.001|31|S:149.1||BH25:1&H:0.5&He:10&Met:4|2|mass:25&H:0.5&HE:10&MET:4||||SNGRBB||||
|
||||
GRB|0||||||1||0.01|136|S:239.1||BH30:1&H:19&He:12&Met:5|2|mass:30&H:19&HE:12&MET:5||||SNGRBB||||
|
||||
LGRB|0||||||1||0.03|3446|S:669.1||BH40:1&H:68&He:18&Met:9|2|mass:40&H:68&HE:18&MET:9||||SNGRBB||||
|
||||
HGRB|0||||||1||0.1|97342|S:1939.1||BH60:1&H:0&He:40&Met:10|2|mass:60&H:0&HE:40&MET:10||||SNGRBB||||
|
||||
CBD|0||||0.1||||||||||||BD||||||
|
||||
WD|1|WD:1|||||||||||||||||||||
|
||||
TWD|0||||0.8||||||||||||WD|Star|Degen||||
|
||||
@@ -51,25 +59,25 @@ STN|1|G:1|H:200&G:1||211|300|30000000|0.5|||H:3000||H:211&S:320|||||CL|CL||||
|
||||
MC|1|G:1&S:1300|H:2000&G:1||2011|4000|300000000||||H:90000.||H:2011&S:4020|||||CL|CL||||
|
||||
ASTN|1|MC:1&S:60000|H:200000&MC:1||202011|200000|100000000|0.65|||H:2000000||H:202011&S:204020|||||CL|CL||||
|
||||
SCD|1|Star:300||Star:1000|||10000000|||||||||||SC|SC||0.1|4|C2.3
|
||||
SCS|1|SCD:1&Star:2000||Star:10000&BH:10|||1000000000|||||||||||SC|SC||0.2|44350|C2.4
|
||||
SCM|1|SCS:1&Star:20000||Star:100000&BH:100|||3000000000|||||||||||SC|SC||0.3|44289|C2.5
|
||||
SCL|1|SCM:1&Star:200000||Star:1000000&BH:1000|||10000000000|||||||||||SC|SC||0.5|44230|C2.6
|
||||
SCS|1|SCD:1&Star:2000||Star:10000&BH:10|||1000000000|||||||||||SC|SC||0.2|3.6|C2.4
|
||||
SCM|1|SCS:1&Star:20000||Star:100000&BH:100|||3000000000|||||||||||SC|SC||0.3|3.4|C2.5
|
||||
SCL|1|SCM:1&Star:200000||Star:1000000&BH:1000|||10000000000|||||||||||SC|SC||0.5|3.2|C2.6
|
||||
SCG|1|SCL:1&Star:2000000||Star:10000000&BH:10000|||30000000000|||||||||||SC|SC||0.8|3|C2.7
|
||||
GED|1|SMBH:1&SC:1|SMBH:10000|Star:1000000000&BH:1000000&SC:100|||12000000000|||||||||||GAL|GALE||1|44440|C2.9
|
||||
GES|1|GED:1&Star:2000000000|SMBH:100000|Star:10000000000&BH:10000000&SC:1000|||13000000000|||||||||||GAL|GALE||1.5|44409|C3.0
|
||||
GEM|1|GES:1&Star:20000000000|SMBH:1000000|Star:100000000000&BH:100000000&SC:10000|||15000000000|||||||||||GAL|GALE||2|44378|C3.1
|
||||
GEL|1|GEM:1&Star:200000000000|SMBH:10000000|Star:1000000000000&BH:1000000000&SC:100000|||17000000000|||||||||||GAL|GALE||3|44348|C3.2
|
||||
GEG|1|GEL:1&Star:2000000000000|SMBH:100000000|Star:10000000000000&BH:10000000000&SC:1000000|||20000000000|||||||||||GAL|GALE||4.5|44317|C3.3
|
||||
GSD|1|GED:1|STN:10000&ASTN:10|GED:1||-5240200|2000000000|0.8|||H:2400000000||H:4112110|||||GAL|GALS|||44318|C2.9
|
||||
GSS|1|GES:1|STN:100000&ASTN:100|GES:1||-52402000|3000000000|0.8|||H:36000000000||H:41121100|||||GAL|GALS|||44257|C3.0
|
||||
GSM|1|GEM:1|STN:1000000&ASTN:1000|GEM:1||-524020000|4000000000|0.8|||H:480000000000||H:411211000|||||GAL|GALS|||44229|C3.1
|
||||
GSL|1|GEL:1|STN:10000000&ASTN:10000|GEL:1||-5240200000|6000000000|0.8|||H:7200000000000||H:4112110000|||||GAL|GALS|||44198|C3.2
|
||||
GED|1|SMBH:1&SC:1|SMBH:10000|Star:1000000000&BH:1000000&SC:100|||12000000000|||||||||||GAL|GALE||1|1.9|C2.9
|
||||
GES|1|GED:1&Star:2000000000|SMBH:100000|Star:10000000000&BH:10000000&SC:1000|||13000000000|||||||||||GAL|GALE||1.5|1.8|C3.0
|
||||
GEM|1|GES:1&Star:20000000000|SMBH:1000000|Star:100000000000&BH:100000000&SC:10000|||15000000000|||||||||||GAL|GALE||2|1.7|C3.1
|
||||
GEL|1|GEM:1&Star:200000000000|SMBH:10000000|Star:1000000000000&BH:1000000000&SC:100000|||17000000000|||||||||||GAL|GALE||3|1.6|C3.2
|
||||
GEG|1|GEL:1&Star:2000000000000|SMBH:100000000|Star:10000000000000&BH:10000000000&SC:1000000|||20000000000|||||||||||GAL|GALE||4.5|1.5|C3.3
|
||||
GSD|1|GED:1|STN:10000&ASTN:10|GED:1||-5240200|2000000000|0.8|||H:2400000000||H:4112110|||||GAL|GALS|||2.5|C2.9
|
||||
GSS|1|GES:1|STN:100000&ASTN:100|GES:1||-52402000|3000000000|0.8|||H:36000000000||H:41121100|||||GAL|GALS|||2.3|C3.0
|
||||
GSM|1|GEM:1|STN:1000000&ASTN:1000|GEM:1||-524020000|4000000000|0.8|||H:480000000000||H:411211000|||||GAL|GALS|||2.2|C3.1
|
||||
GSL|1|GEL:1|STN:10000000&ASTN:10000|GEL:1||-5240200000|6000000000|0.8|||H:7200000000000||H:4112110000|||||GAL|GALS|||2.1|C3.2
|
||||
GSG|1|GEG:1|STN:100000000&ASTN:100000|GEG:1||-52402000000|9000000000|0.8|||H:108000000000000||H:41121100000|||||GAL|GALS|||2|C3.3
|
||||
LGG|1|GAL:20||GAL:50|||10000000000|||||||||||LS|LS|||44317|C3.4
|
||||
LSC|1|LGG:1&GAL:100||LGG:200|||20000000000|||||||||||LS|LS|||44287|C3.6
|
||||
LGF|1|LSC:1&LGG:400||LSC:100|||30000000000|||||5||||||LS|LS|||44256|C3.8
|
||||
LGW|1|LGF:1&LSC:200||LGF:1000|||60000000000|||||10000||||||LS|LS|||44228|C4.1
|
||||
LUB|1|LGW:1&LGF:2000||LGW:1000|||100000000000|||||1000000000||||||LS|LS|||44197|C4.4
|
||||
LGG|1|GAL:20||GAL:50|||10000000000|||||||||||LS|LS|||1.5|C3.4
|
||||
LSC|1|LGG:1&GAL:100||LGG:200|||20000000000|||||||||||LS|LS|||1.4|C3.6
|
||||
LGF|1|LSC:1&LGG:400||LSC:100|||30000000000|||||5||||||LS|LS|||1.3|C3.8
|
||||
LGW|1|LGF:1&LSC:200||LGF:1000|||60000000000|||||10000||||||LS|LS|||1.2|C4.1
|
||||
LUB|1|LGW:1&LGF:2000||LGW:1000|||100000000000|||||1000000000||||||LS|LS|||1.1|C4.4
|
||||
GG|1|GG:1||||||||||||||||Planet|BPlanet||||
|
||||
AB|1|AB:1||||||||||||||||Planet|BPlanet||||
|
||||
RP|1|RP:1||||||||||||||||Planet|BPlanet||||
|
||||
@@ -150,4 +158,6 @@ fpac|1|fpac:1|||||||||||||||||||||
|
||||
fenr|1|fenr:1|||||||||||||||||||||
|
||||
fmor|1|fmor:1|||||||||||||||||||||
|
||||
fdis|1|fdis:1|||||||||||||||||||||
|
||||
frep|1|frep:1|||||||||||||||||||||
|
||||
frep|1|frep:1|||||||||||||||||||||
|
||||
"""
|
||||
#endregion
|
||||
@@ -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
|
||||
E|1.00E+27|1.00E+27|количество энергии во вселенной
|
||||
G|6.67E-11|6.67E-11|
|
||||
@@ -25,3 +36,5 @@ ForceBox0Weight| 24|24|Вес вероятности появления зелё
|
||||
ForceBox1Weight| 6|6|Вес вероятности появления синего ящика
|
||||
ForceBox2Weight| 2|2|Вес вероятности появления фиолетового ящика
|
||||
ForceBox3Weight| 1|1|Вес вероятности появления оранжевого ящика
|
||||
"""
|
||||
#endregion
|
||||
@@ -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
|
||||
fsho|shovelin|ui/0-forces/|0|0|0|
|
||||
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.2|civ4.2|ui/4-life/civ4/|10|0|2|
|
||||
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
|
||||
@@ -0,0 +1 @@
|
||||
uid://du0vey80c1o0e
|
||||
@@ -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
|
||||
@@ -0,0 +1 @@
|
||||
uid://c2valw4nqebxp
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
uid://cunl2sqmcj1ff
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
||||
[gd_resource type="AudioBusLayout" format=3 uid="uid://b5g7p85k5do0m"]
|
||||
|
||||
[resource]
|
||||
bus/1/name = &"Music"
|
||||
bus/1/solo = false
|
||||
bus/1/mute = false
|
||||
bus/1/bypass_fx = false
|
||||
bus/1/volume_db = 0.0
|
||||
bus/1/send = &"Master"
|
||||
bus/2/name = &"FX"
|
||||
bus/2/solo = false
|
||||
bus/2/mute = false
|
||||
bus/2/bypass_fx = false
|
||||
bus/2/volume_db = 0.0
|
||||
bus/2/send = &"Master"
|
||||
+14
-8
@@ -1,14 +1,17 @@
|
||||
[runnable_presets]
|
||||
|
||||
"Windows Desktop"="Windows Desktop"
|
||||
|
||||
[preset.0]
|
||||
|
||||
name="Windows Desktop"
|
||||
platform="Windows Desktop"
|
||||
runnable=true
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
include_filter=""
|
||||
exclude_filter=""
|
||||
export_path="../../Documents/Owad/Owniverse.I/Builds/owniverse.0.6.13-129.exe"
|
||||
export_path="../../../Documents/Owad/Owniverse.I/Builds/owniverse.0.7.0-146.console.exe"
|
||||
patches=PackedStringArray()
|
||||
patch_delta_encoding=false
|
||||
patch_delta_compression_level_zstd=19
|
||||
@@ -27,7 +30,7 @@ script_export_mode=2
|
||||
custom_template/debug=""
|
||||
custom_template/release=""
|
||||
debug/export_console_wrapper=1
|
||||
binary_format/embed_pck=false
|
||||
binary_format/embed_pck=true
|
||||
texture_format/s3tc_bptc=true
|
||||
texture_format/etc2_astc=false
|
||||
shader_baker/enabled=false
|
||||
@@ -74,7 +77,6 @@ Remove-Item -Recurse -Force '{temp_dir}'"
|
||||
|
||||
name="Android"
|
||||
platform="Android"
|
||||
runnable=false
|
||||
dedicated_server=false
|
||||
custom_features=""
|
||||
export_filter="all_resources"
|
||||
@@ -110,7 +112,7 @@ architectures/armeabi-v7a=false
|
||||
architectures/arm64-v8a=true
|
||||
architectures/x86=false
|
||||
architectures/x86_64=false
|
||||
version/code=133
|
||||
version/code=146
|
||||
version/name=""
|
||||
package/unique_name="com.KIDGameProduction.Owniverse"
|
||||
package/name="Owniverse"
|
||||
@@ -136,11 +138,12 @@ screen/support_normal=true
|
||||
screen/support_large=true
|
||||
screen/support_xlarge=true
|
||||
screen/background_color=Color(0, 0, 0, 1)
|
||||
splash_screen/disable_godot_boot_splash=false
|
||||
splash_screen/icon=""
|
||||
splash_screen/branding_image=""
|
||||
splash_screen/background_color=Color(0, 0, 0, 1)
|
||||
user_data_backup/allow=false
|
||||
command_line/extra_args=""
|
||||
apk_expansion/enable=false
|
||||
apk_expansion/SALT=""
|
||||
apk_expansion/public_key=""
|
||||
permissions/custom_permissions=PackedStringArray()
|
||||
permissions/access_checkin_properties=false
|
||||
permissions/access_coarse_location=false
|
||||
@@ -295,3 +298,6 @@ permissions/write_sms=false
|
||||
permissions/write_social_stream=false
|
||||
permissions/write_sync_settings=false
|
||||
permissions/write_user_dictionary=false
|
||||
apk_expansion/enable=false
|
||||
apk_expansion/SALT=""
|
||||
apk_expansion/public_key=""
|
||||
|
||||
Binary file not shown.
+4
-4
@@ -8,18 +8,18 @@
|
||||
|
||||
config_version=5
|
||||
|
||||
[animation]
|
||||
[accessibility]
|
||||
|
||||
compatibility/default_parent_skeleton_in_mesh_instance_3d=true
|
||||
general/updates_per_second=10
|
||||
|
||||
[application]
|
||||
|
||||
config/name="Owniverse"
|
||||
config/version="0.6.17"
|
||||
config/version="0.7.0"
|
||||
run/main_scene="uid://bv384dpmvjv8o"
|
||||
config/features=PackedStringArray("4.7", "Mobile")
|
||||
boot_splash/show_image=false
|
||||
config/icon="uid://do5teb1i7uiuw"
|
||||
config/icon="uid://djiwkyk470qb2"
|
||||
config/size/borderless=true
|
||||
config/stretch_mode=0
|
||||
|
||||
|
||||
@@ -0,0 +1,237 @@
|
||||
# Эволюция звёзд Owniverse.GI
|
||||
|
||||
Числа симуляции хранят целую часть в двух блоках int64, дробный остаток — в
|
||||
float. Весь порядок E27 сохраняет целые единицы. Возраст разделён на целые
|
||||
годы и дробную часть с шагом 10^-9 года; большие промежуточные произведения
|
||||
распределений вычисляются через `mul_div`. Границы точности, допуск переноса
|
||||
дробей и несовместимый со старым формат сохранения 4 описаны в
|
||||
[документации математики](world/owniverse/math/README.md).
|
||||
|
||||
Механики перенесены из Owniverse.U с согласованными изменениями GI: постепенные партии, детерминированные дробные остатки, уязвимость цивилизаций до C1.2 и передача выживших планет преемнику. Баланс таблицы GI сохраняется.
|
||||
|
||||
## Порядок расчёта
|
||||
|
||||
1. Накопить игровое время; обработать новые десятые доли года.
|
||||
2. Рассчитать производство существующих объектов за интервал с учётом их постепенного исчезновения; выполнить автоматическое создание звёзд и их планет.
|
||||
3. Для очередного поколения определить долю заканчивающих жизнь звёзд. Применить локальное разрушение их планет до списания партий.
|
||||
4. Снять целые объекты из партий, рассчитать основные и альтернативные выходы с накоплением дробей.
|
||||
5. Передать выжившие планеты полученным звёздам/остаткам. Если преемников несколько, распределить по их фактическим количествам; если преемника нет — освободить. Остальные связанные объекты используют существующие правила GI.
|
||||
6. Создать партии преемников. Учесть производство новорождённых за оставшуюся часть длинного шага, включая излучение короткоживущих сверхновых.
|
||||
7. Применить суммарный бласт поколения; повторять обработку поколений, пока в интервале остаются переходы.
|
||||
8. Пересчитать группы и опубликовать состояние.
|
||||
|
||||
## Автоматическое создание бурых карликов
|
||||
|
||||
На горячие бурые карлики `HBD` выделяется 0,1% **нового фактически произведённого автоматического водорода** за расчётный интервал. По текущей таблице автоматическую долю имеют STN (`auto = 0.5`) и ASTN (`auto = 0.65`). Обычный водород, ручные покупки и неиспользованный запас прошлых интервалов повторно в эту долю не входят.
|
||||
|
||||
При стоимости `c = 0.1 H` квота объектов увеличивается на `ΔQ = ΔH_auto × 0.001 / c`. Она хранится между циклами и в сохранении в `auto_star_deficits.HBD`. Доступность ограничивается автоматическим запасом и уже оплаченным топливом: `Q ≤ (auto_resources.H + HBD_fuel) / c`.
|
||||
|
||||
Карлики появляются по одному. Для `q = max(0, Q)` создаётся `floor(q)` объектов и ещё один с вероятностью `q - floor(q)`, с ограничением по доступному топливу. Созданное количество вычитается из Q; отрицательный остаток компенсирует досрочное появление на следующих шагах. Повторного случайного округления без нового автоматического водорода нет. Это исключение из общего детерминированного округления GI. Состояние генератора `auto_star_deficits.HBD_random` сохраняется, поэтому загрузка продолжает ту же последовательность.
|
||||
|
||||
Водород списывается целыми единицами авансом: `charge = ceil(max(0, count × c - HBD_fuel))`. Неиспользованный остаток `HBD_fuel += charge - count × c` сохраняется в `auto_star_deficits.HBD_fuel` и больше не входит в свободный запас или бюджет обычных звёзд. Например, 500 автоматических H позволяют создать 5 HBD, списав 1 H и оставив 0,5 H оплаченного топлива. Следующие 5 HBD используют этот остаток без повторного списания. Численность всегда целая, но не обязана быть кратной 10. При отсутствии обычных звёзд их доля остаётся в запасе, а производство HBD всё равно работает.
|
||||
|
||||
Новые HBD получают обычные жизненные партии. По таблице их срок — 5 миллиардов лет, затем они постепенно превращаются в холодные `CBD`. На экране оба типа суммируются в `BD`. Ручного рецепта у общего счётчика BD нет. Миграция сохранений не требуется: квота использует существующий словарь, отсутствующее значение равно нулю.
|
||||
|
||||
## Постепенные партии
|
||||
|
||||
### Короткоживущие звёздные события внутри длинного шага
|
||||
|
||||
Для SN, DSN, BSN, HN и GRB-событий полностью завершившиеся окна рождения не создают отдельные словари партий. Их целые количества суммируются в очередь завершений текущего расчёта; обычные партии сохраняются только для окон, срок которых ещё не закончился. Состояние этой очереди не записывается в сохранение: она полностью обрабатывается до публикации нового состояния.
|
||||
|
||||
Окно завершено, если `window_end + lifespan ≤ to_year`. Его доля количества рассчитывается прежним методом разности накопленных целых значений. Для производства пространства интеграл исчезновения вычитается по окнам в прежнем порядке, чтобы сохранить округление. Здесь остаётся лёгкий арифметический проход по окнам, но отсутствуют создание, копирование, сортировка и последующая обработка тысяч временных словарей.
|
||||
|
||||
Ресурсы, остатки звёзд и бласты от завершившейся части применяются на следующем поколении расчёта, как раньше. Поэтому сохраняются порядок передачи привязок, среда бластов и ограничения цивилизаций. Ускорение допускается только для событий группы `SNGRBB` с линейным выходом и без преемников с ненулевым сроком жизни. При изменении таблиц остальные случаи автоматически используют обычный путь. Сроки жизни и ширина окон не увеличиваются, формат сохранения не меняется.
|
||||
|
||||
На сохранении возраста 140,55 млн лет, при шестой скорости и шаге 1/60 секунды: максимальное временное число партий SN/GRB уменьшилось с 1668 до 2; средний расчёт кадра без отрисовки — примерно с 15 до 10 мс. За 120 шагов результаты старого и нового путей совпали по всем полям состояния. Эти значения характеризуют конкретное сохранение, а не гарантированную частоту кадров на всех устройствах.
|
||||
|
||||
### Общие окна рождения и эволюции
|
||||
|
||||
Обработка кадров на скоростях 4–6 использует адаптивный шаг 0.1 → 0.2 → 0.5 реальной секунды: накопленное отставание больше двух текущих шагов повышает ступень, меньше половины шага понижает её. Граница ограничивается запрошенным временем, долг не отбрасывается. Скорости 1–3 используют 1/60 секунды. При смене скорости ступень сбрасывается. Сохранённая незавершённая транзакция сначала возобновляется с прежней границей. Кооперативный бюджет кадра остаётся 40 мс. Изменение шага не изменяет ширину временных партий, но может влиять на результаты дискретных расчётов производства и глобальных параметров.
|
||||
|
||||
Окно рождения шириной `w = lifespan / 40` при `lifespan > 10`, иначе `w = lifespan`. Окно превращения сдвинуто на `lifespan`. При частичном списании:
|
||||
|
||||
```
|
||||
expected = remainder + (remaining_count - remainder) * elapsed / remaining_window
|
||||
converted = floor(expected)
|
||||
remainder = expected - converted
|
||||
```
|
||||
|
||||
Конец окна списывает остаток. Переход не уничтожает всю партию в начале окна. Начала и длительности сохраняют модель GI, включая годовую длительность событий SN/GRB.
|
||||
|
||||
## Планеты
|
||||
|
||||
При ручном и автоматическом создании звёзд:
|
||||
|
||||
```
|
||||
expected = stars_created * planet_amount * planet_chance * metallicity + remainder
|
||||
planets_created = floor(expected)
|
||||
remainder = expected - planets_created
|
||||
```
|
||||
|
||||
Остаток независим для каждой пары звезда/планета и сохраняется. Планеты сразу связаны со звездой. Эволюционный переход сам по себе не создаёт новую планетную систему. Шансы планет в таблице — доли, а проценты альтернативных выходов звёзд делятся на 100.
|
||||
|
||||
## Среда: адаптация формул Unity к состоянию GI
|
||||
|
||||
GI не хранит накопленные счётчики первичной материи Unity. Поэтому `stellar_environment()` вычисляет среду из текущего физического состава, включая связанные объекты, без суммирующих групп интерфейса. Это приближение для баланса GI, а не побитовое воспроизведение Unity.
|
||||
|
||||
- `M` — свободные и связанные H/He/Met плюс табличная масса конкретных объектов и масса SMBH.
|
||||
- `V` — физическое S плюс табличный объём объектов и `voids * ExtraParams.VoidSize`.
|
||||
- `Z = max(0, 0.4 * ln(100 * free_Met / M + 0.11) + 0.88)`; при `M = 0` металличность нулевая.
|
||||
- `B = ExtraParams.DA * f(M)`, где `f(0)=1`, `f(M)=M^0.1` при `0<M<1e10`, иначе `10`.
|
||||
- `density = ExtraParams.NPC * sqrt(B + M) / max(1, V)^(1/6)`.
|
||||
- `blast_factor = clamp(free_S / V, 0, 1)`; при нулевом объёме `1`.
|
||||
|
||||
Планетные бонусы сил пока не перенесены. Параметры мира Bur/Exp/Agg имеют собственные сохраняемые шкалы и эффективные множители (см. раздел индикаторов ниже). Металличность для производства фиксируется до расходования ресурсов на звёзды. Среда бласта фиксируется для поколения до добавления его продуктов.
|
||||
|
||||
## Разрушение и бласты
|
||||
|
||||
Локальное воздействие: `ratio = dying_stars / physical_stars`, без множителя плотности.
|
||||
|
||||
Бласт: `hits = floor(power * blast_factor + saved_remainder)`. Распределение экспозиции между типами звёзд, имеющими планетные системы в таблице, пропорционально их физическому количеству. Для типа: `ratio = hits * star_share / physical_stars * density`.
|
||||
|
||||
Для каждого связанного типа планет накапливается `held_planets * min(1, ratio)`. Уничтожается целая часть, не больше существующего количества. Остатки локального воздействия и бластов раздельны. Это позволяет слабым воздействиям работать при постепенной эволюции.
|
||||
|
||||
Уровень 1 превращает только `blastability=1` в RP (HP, EON, цивилизации до C1.2). C1.3 и выше защищены от этого уровня. Уровень 2 уничтожает все планеты, включая защищённые цивилизации, без создания RP. Уничтоженные объекты удаляются из жизненных партий, чтобы не возникать заново.
|
||||
|
||||
Единственный источник мощности — поле `blast` сущности: `power = expired_count × max(0, entity.blast)`. При `blast = 0` внешнего воздействия нет. Старые вхождения `blast:N` в `output` игнорируются, включая альтернативные выходы; двойного суммирования нет. Внутренний выход `blast` остаётся событием, а не предметом. `destroy_level` независимо задаёт уровень локального разрушения у умирающего объекта; внешние бласты всегда действуют на уровне 1.
|
||||
|
||||
## Границы этапа
|
||||
|
||||
Рассчитываются агрегаты по типам, а не отдельные звёздные системы; конкретная принадлежность каждой планеты отдельной звезде не моделируется. Распределения целых объектов детерминированы. Порядок внутри длинного шага — по поколениям, поэтому нелинейное воздействие бластов и среды не обязано совпадать с серией более коротких шагов. Эволюция HP и эонов подключена ниже; эволюция цивилизаций и бонусы структур описаны ниже. Глобальная система сил остаётся отдельной механикой.
|
||||
|
||||
Проверки: `tests/test_time.gd`, `tests/test_stellar_rules.gd`. Сохранения игрока тестами не затрагиваются.
|
||||
|
||||
## Первичная жизнь: HP → EON1 → … → EON5 → C0.0
|
||||
|
||||
Правила встроены в `data/owniverse_life_rule_loader.gd` и загружаются через `OwniverseLifeRuleLoader`; исходные сроки и коэффициенты взяты из Unity `civs.txt`. В каждой обработанной части партии:
|
||||
|
||||
- прогресс: `count * progress + carry_progress`;
|
||||
- деградация: `count * degradation + carry_degradation`;
|
||||
- остальная жизнь остаётся на прежней стадии и получает новую партию для следующей попытки.
|
||||
|
||||
Прогресс и деградация округляются вниз с сохранением остатков. Если оба накопленных исхода конкурируют за последнюю планету, распределяются только существующие объекты, а неиспользованный остаток переносится на следующую попытку. Деградация распределяется по весам `fall`; знаковые ошибки распределения также сохраняются.
|
||||
|
||||
Для всех шести стадий базовые доли за попытку — `progress=0.00025`, `degradation=0.0025`. Интервалы HP/EON1/EON2/EON3/EON4/EON5: 5 млн, 10 млн, 10 млн, 1 млн, 1 млн, 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/эонов — однократно при загрузке с текущим возрастом вселенной, без выдумывания их прошлого возраста. Состояние содержит `life_version=2` (версия 1 также загружается) и `life_remainders`.
|
||||
|
||||
Миграция версии жизни 1 → 2 добавляет только недостающие партии C0.0/C0.1, сохраняя уже существующие партии HP и эонов.
|
||||
|
||||
## Этические и космические цивилизации
|
||||
|
||||
`data/owniverse_civilization_rule_loader.gd` содержит 43 стадии по шесть этик из Unity. `OwniverseCivilizationRuleLoader` группирует строки по стадиям, формирует связи между ними и передаёт готовый словарь в `Global.CivilizationRules`. После C4.4 следует Ct: конечная стадия без новых жизненных партий.
|
||||
|
||||
Состояние `ethics[stage][ethic]` хранит целые количества. Для существующих цивилизаций без этик количество распределяется поровну в порядке m, l, w, d, c, b; остаток распределяется по одному в этом порядке. Существующее распределение сохраняется. При внешних потерях оно пропорционально сокращается.
|
||||
|
||||
Цивилизации с непустым `home` (C2.0–C4.4) освобождаются от прежних привязок без изменения общего количества. Общий механизм переходов больше не переносит планетную привязку на такого преемника. Структуры назначаются отдельно в `civilization_homes`; при возвращении к планетным стадиям цивилизации размещаются у имеющихся карликовых звёзд.
|
||||
|
||||
Правило среды согласовано: число космических цивилизаций ограничено звёздным ресурсом. Для стадии `i` расход ёмкости — `population[i] * max(1, Stars[i])`. Каждое семейство `Home` имеет общий бюджет для всех использующих его стадий; звёзды внутри структур также учитываются, но повторно не суммируются. SMBH учитывается по суммарной массе в эквиваленте звёзд, согласно решению пользователя.
|
||||
|
||||
Переход переиспользует резерв исходной стадии. При нехватке ёмкости неподдержанные переходы остаются на исходной стадии. Лимит применяется к общему механизму выходов партий и ручному созданию; расчёт прогресса C0.2+ использует тот же бюджет.
|
||||
|
||||
При загрузке и после эволюционных поколений избыток деградирует последовательно до поддерживаемой стадии. Приоритет получают существующие более развитые цивилизации; остаток бюджета достаётся младшим. Деградация переносит количество и этики, сокращает старые партии и регистрирует новые, не уничтожая цивилизации. C2.0 при избытке становится C1.9 и распределяется по имеющимся звёздам-карликам. Если карликов нет, C1.9 остаётся свободной — отсутствующая звезда не создаётся. Планетные стадии до C2.0 не расходуют отдельную звёздную ёмкость: у одной звезды могут быть несколько планет.
|
||||
|
||||
Резерв ёмкости логический: звёзды не расходуются и продолжают производить ресурсы. Общий бюджет пересчитывается из физических количеств, отдельная копия бронирований в сохранении не хранится.
|
||||
|
||||
|
||||
### Расчёт поколения 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`), бласты и ограничения среды. Число операций зависит от числа типов и партий, а не от числа цивилизаций.
|
||||
|
||||
На скоростях 1–3 размер временной партии равен сроку жизни / 40. На скоростях 4–6 он равен максимуму этого значения и 100, 1000, 10000 игровых лет соответственно (0,1 реальной секунды). Близкие существующие партии объединяются при следующем шаге: целые количества и остатки изъятия складываются, временной интервал охватывает исходные партии. Это приближает моменты переходов внутри объединённого интервала. События со сроком жизни до 10 лет сохраняют прежние окна. При снижении скорости ранее объединённые партии не разделяются; новые получают меньшие окна. Шаг публикации на скоростях 4–6 ограничен 0,1 реальной секунды; накопленное отставание сохраняется.
|
||||
|
||||
Несколько частей одного типа обрабатываются агрегированно между минимальным и максимальным временем. На скоростях 4–6 новые партии жизни и цивилизаций после перехода создаются на ближайшей следующей границе интервала 100/1000/10000 лет. Начало сетки этих новых партий равно нулю независимо от старого `batch_origins`: округлённое время рождения не попадает обратно в раннюю часть старого окна. Это исключает повторные попытки эволюции той же выходящей популяции внутри её временного интервала; следующие интервалы продолжают обрабатываться. На скоростях 1–3 сохраняются исходные интервалы рождения и последовательные поколения. Звёздные события используют прежнюю схему.
|
||||
|
||||
Побочный ущерб неистёкшим партиям применяется в текущий момент. Все остатки округления сохраняются в `civilization_remainders`, счётчики — в `civilization_stats`.
|
||||
|
||||
### Структуры и периоды
|
||||
|
||||
Прямой `claim` задаёт структуру стадии и норму 1; каждая промежуточная стадия умножает норму на 10 до следующего `claim`. Начиная с C3.0 требуется соответствующий запас структур, общий для использующих его стадий. При потере запаса избыток деградирует. Этот бюджет действует одновременно со звёздным.
|
||||
|
||||
Размещение выбирает структуры в порядке убывания `civ_bonus`, начиная с соответствующего стадии `claim`. Прямое размещение ограничено числом структур; остальные разрешённые структуры при наличии дают общий бонус, как в Unity. Период новых партий равен `span / средневзвешенный civ_bonus`, для неразмещённой части множитель равен 1. Уже назначенные сроки партий не переписываются при изменении бонуса.
|
||||
|
||||
Ct не получает часы. Инициализация отсутствующих партий жизни выполняется при загрузке и перед продвижением симуляции. Параметры мира и тенденции описаны ниже; интерфейс применения сил в этот перенос не входит.
|
||||
|
||||
## Параметры мира, тенденции и индикаторы
|
||||
|
||||
Источник формул — Unity `OwniverseInstance`, `Life`, `LifeActions`, `Trends` и классы индикаторов. Расчёты находятся в `world_parameters.gd`; показ — в `ui/indicators/world_indicators.gd`. Шкалы обновляются каждые 0,1 реальной секунды и сразу при создании/загрузке вселенной. Подписи используют текущую локаль и шаблоны.
|
||||
|
||||
### Энергия и плотность
|
||||
|
||||
Энергия сохраняет экономику GI: запас расходуется на H/S. Заполнение индикатора — `clamp(energy / 1e14, 0, 1)`. Это не коэффициент производства Unity; дополнительное замедление производства при уменьшении запаса не вводится. В описании выводятся остаток и процент.
|
||||
|
||||
Плотность берётся из `stellar_environment`. Положение указателя ограничено диапазоном 0…1:
|
||||
|
||||
- `density ≤ 1e-5`: шкала разрыва, `(log10(max(density, 1e-7)) + 7) / 2`;
|
||||
- `1e-5 < density < 0.9`: обычная шкала, `ln(density × 1e5) / ln(9e4)`;
|
||||
- `density ≥ 0.9`: шкала сжатия, `(density − 0.9) × 10`.
|
||||
|
||||
В 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 сюда не входит.
|
||||
|
||||
### Горючесть, взрывчатость и агрессия
|
||||
|
||||
`world_parameters` хранит Bur, Exp и Agg в диапазоне 1…19, начальное значение — 10. Эффективный множитель `M(x) = 10^((x−10)/9)`: крайние значения 0,1 и 10, нейтральное — 1.
|
||||
|
||||
- Bur делит срок жизни новых звёзд на `M(Bur)`. `modify_world_parameter("Bur", delta)` также пересчитывает оставшееся время существующих звёзд с коэффициентом `старый M / новый M`, сохраняя количество и остатки округления. Производство звёзд умножается на `M`, если `M ≤ 1`, иначе на `sqrt(M)`.
|
||||
- Exp умножает вероятность альтернативного исхода (с ограничением до 1), мощность `entity.blast` и производство событий группы SNGRBB. Локальный `destroy_level` от него не меняется.
|
||||
- Для Agg обозначим `a = M(Agg)`. Вероятность прогресса умножается на `a`, деградации — на `(1 − (1−a)/20) / Order`, войны — на `1 − (1−a)/5`, колонизации — на `1 − (1−a)/2`. Если сумма прогресса и деградации превышает 1, они пропорционально нормируются. Вероятности войны/колонизации ограничены единицей.
|
||||
- Для первичной жизни дополнительный множитель прогресса — Enlightenment. Order дополнительно уменьшает потери в войнах и побочный ущерб. Начальные Enlightenment и Order равны 1.
|
||||
|
||||
Изменять шкалы следует через `owniverse.modify_world_parameter(key, delta)`, чтобы горючесть корректно обновляла партии. Готовых кнопок применения сил этот метод не добавляет.
|
||||
|
||||
### Тенденции
|
||||
|
||||
Пять направлений: Antitheism, Integration, Xenocide, Reconstruction, Spirituality. Участвуют космические стадии с непустым `home`; вес первой — 1, каждой следующей — вдвое больше. Для каждой тенденции:
|
||||
|
||||
`rate = Σ_стадий (вес стадии × Σ_этик(доля этики × вес этики))`
|
||||
|
||||
`прирост = rate × прошедшие игровые годы × 1e-9`.
|
||||
|
||||
Доли берутся на начало интервала, после проверки вместимости. Умножение на время исправляет ошибку Unity, где аргумент period не использовался. Накопление само по себе не зависит от FPS; изменение состава цивилизаций внутри крупных шагов остаётся дискретным, как остальная симуляция.
|
||||
|
||||
Веса этик в порядке пяти направлений:
|
||||
|
||||
| Этика | Антитеизм | Интеграция | Ксеноцид | Реконструкция | Духовность |
|
||||
|---|---:|---:|---:|---:|---:|
|
||||
| m | 0 | 2 | 2 | 0 | 6 |
|
||||
| l | 6 | 1 | 1 | 2 | 0 |
|
||||
| w | 2 | 0 | 6 | 0 | 2 |
|
||||
| d | 0 | 6 | 0 | 1 | 3 |
|
||||
| c | 1 | 3 | 3 | 3 | 0 |
|
||||
| b | 3 | 0 | 0 | 6 | 1 |
|
||||
|
||||
При достижении 1 учитываются все целые срабатывания, дробный остаток сохраняется. Только Integration имеет последствия в исходной Unity: равновероятно выбирается Federation (+0,1 и Agg −1), Enlightenment (+0,2 и Agg −1) или Order (+0,1). Генератор сохраняет своё состояние. До 256 событий за шаг выбор выполняется по одному; для больших количеств используется нормальная аппроксимация мультиномиального распределения с сохранением точного суммарного числа событий, чтобы высокие скорости не блокировали кадр. Она может менять последовательность исходов при другом разбиении больших интервалов.
|
||||
|
||||
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, PI, helium_multiplier, helium_bonus_limit, space_generation, ChatPerTick
|
||||
и параметры ForceBox загружаются, но пока не используются в GI: соответствующие
|
||||
формулы и механики старой Unity-версии здесь отсутствуют. Производство объектов
|
||||
в GI задаётся их собственной таблицей life_product и lifespan.
|
||||
|
||||
`tests/test_extra_params.gd` проверяет загрузку точных чисел и изменение энергии,
|
||||
плотности, объёма пустот, порогов индикатора и бонуса горючести.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+381
-111
@@ -1,59 +1,83 @@
|
||||
extends Control
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
const OWNIVERSE_ITEM = preload("uid://d3xjfxwe3w16v")
|
||||
|
||||
const SPEED_TEXTURE_NAME_TEMPLATE = "res://ui/topmenu/time&speed/time%s.png"
|
||||
|
||||
const ItemDescription = preload("res://world/owniverse/item_description.gd")
|
||||
const WorldIndicators = preload("res://ui/indicators/world_indicators.gd")
|
||||
var world_indicators: RefCounted
|
||||
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_samples: Dictionary = {}
|
||||
var description_rates: Dictionary = {}
|
||||
var description_elapsed: float = 0.0
|
||||
|
||||
const PAGE_COUNT = 5
|
||||
const RESOURCE_PAGE = 1
|
||||
const PAGE_WIDTH = 1080
|
||||
const DRAG_TOLERANCE = 360
|
||||
const SWIPE_DURATION: float = 0.4
|
||||
|
||||
@onready var stage_page_scroller: ScrollContainer = $StageRows/PageScroller
|
||||
@onready var stage_page_scroller: ScrollContainer = $World/PageScroller
|
||||
|
||||
@onready var item_pages: Array[Control] = [
|
||||
$StageRows/PageScroller/HBoxContainer/ForcePage/Forces,
|
||||
$StageRows/PageScroller/HBoxContainer/ResourcePage/HBoxContainer/Resources,
|
||||
$StageRows/PageScroller/HBoxContainer/StarPage/Stars,
|
||||
$StageRows/PageScroller/HBoxContainer/StructurePage/Structures,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Life,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/LivingPlanet,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ0,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ1,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ2,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ3,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Planets/Civ4
|
||||
$World/PageScroller/HBoxContainer/ForcePage/Forces,
|
||||
$World/PageScroller/HBoxContainer/ResourcePage/HBoxContainer/Resources,
|
||||
$World/PageScroller/HBoxContainer/StarPage/Stars,
|
||||
$World/PageScroller/HBoxContainer/StructurePage/Structures,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/Life,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/LivingPlanet,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/Civ0,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/Civ1,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/Civ2,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/Civ3,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Planets/Civ4
|
||||
]
|
||||
|
||||
@onready var page_actions: Dictionary[int, OwniverseAction] = {
|
||||
2: $StageRows/PageScroller/HBoxContainer/StarPage/Actions,
|
||||
3: $StageRows/PageScroller/HBoxContainer/StructurePage/Actions,
|
||||
2: $World/PageScroller/HBoxContainer/StarPage/Actions,
|
||||
3: $World/PageScroller/HBoxContainer/StructurePage/Actions,
|
||||
}
|
||||
|
||||
@onready var g_item_descriptions: Array = [
|
||||
$StageRows/PageScroller/HBoxContainer/ForcePage/Description,
|
||||
$StageRows/PageScroller/HBoxContainer/ResourcePage/Description,
|
||||
$StageRows/PageScroller/HBoxContainer/StarPage/Description,
|
||||
$StageRows/PageScroller/HBoxContainer/StructurePage/Description,
|
||||
$StageRows/PageScroller/HBoxContainer/LifePage/Description
|
||||
$World/PageScroller/HBoxContainer/ForcePage/Description,
|
||||
$World/PageScroller/HBoxContainer/ResourcePage/Description,
|
||||
$World/PageScroller/HBoxContainer/StarPage/Description,
|
||||
$World/PageScroller/HBoxContainer/StructurePage/Description,
|
||||
$World/PageScroller/HBoxContainer/LifePage/Description
|
||||
]
|
||||
|
||||
@onready var date_time: Label = $StageRows/TopMenu/InfoPanel/DateTime
|
||||
@onready var date_time: Label = $World/TopMenu/InfoPanel/DateTime
|
||||
|
||||
@onready var g_speed_icons: Array = [
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed1,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed2,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed3,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed4,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed5,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed6,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed7,
|
||||
$StageRows/TopMenu/InfoPanel/Speed/Speed8
|
||||
$World/TopMenu/InfoPanel/Speed/Speed1,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed2,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed3,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed4,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed5,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed6,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed7,
|
||||
$World/TopMenu/InfoPanel/Speed/Speed8
|
||||
]
|
||||
|
||||
@onready var g_time_minus: TextureButton = $StageRows/TopMenu/TimeMinus
|
||||
@onready var g_time_plus: TextureButton = $StageRows/TopMenu/TimePlus
|
||||
@onready var g_time_minus: TextureButton = $World/TopMenu/TimeMinus
|
||||
@onready var g_time_plus: TextureButton = $World/TopMenu/TimePlus
|
||||
@onready var effects_player: OwniverseEffectsPlayer = $"../FXPlayer"
|
||||
|
||||
@onready var screens: Dictionary = {
|
||||
"World": $World,
|
||||
"MainMenu": $MainMenu,
|
||||
"Report": $Report,
|
||||
"Achievements": $Achievements,
|
||||
"Credits": $Credits,
|
||||
|
||||
}
|
||||
|
||||
var g_tween: Tween = null
|
||||
var g_dragged_start: Vector2 = Vector2.ZERO
|
||||
@@ -71,65 +95,100 @@ var g_counters: Dictionary[String, Counter] = {
|
||||
|
||||
var g_active_items: Dictionary = {}
|
||||
|
||||
var pending_page: int = -1
|
||||
var active_actions_dirty: bool = true
|
||||
var active_actions_elapsed: float = 0.0
|
||||
var interface_sounds_enabled: bool = false
|
||||
|
||||
var owniverse:Owniverse = Owniverse.new()
|
||||
var owniverse_items: Dictionary[String, OwniverseItem] = {}
|
||||
var locked_items: Array = []
|
||||
|
||||
var item_list_to_update: Dictionary = {}
|
||||
|
||||
func set_datetime(value: float):
|
||||
date_time.text = str(snapped(value, 0.1))
|
||||
func set_datetime(value):
|
||||
# Simulation time advances in tenths of a year; displaying five decimal
|
||||
# places only adds zeroes and suggests precision the simulation does not
|
||||
# have.
|
||||
date_time.text = Global.format_number(value, 1) if not E.eq(value, 0) else "0.0"
|
||||
|
||||
#region Item manipulations: update and visibility
|
||||
|
||||
|
||||
func add_to_update_list(item_id: String, amount: int) -> void:
|
||||
if item_list_to_update.has(item_id):
|
||||
item_list_to_update[item_id] += amount
|
||||
else:
|
||||
item_list_to_update[item_id] = amount
|
||||
|
||||
|
||||
func set_owniverse_item_value() -> void:
|
||||
for item_id in owniverse.items_to_update:
|
||||
for item_id in owniverse.presentation.pending_amounts:
|
||||
if owniverse_items.has(item_id):
|
||||
owniverse_items[item_id].set_label(owniverse.items_to_update[item_id])
|
||||
owniverse.items_to_update = {}
|
||||
owniverse_items[item_id].set_label(owniverse.presentation.pending_amounts[item_id])
|
||||
owniverse.presentation.pending_amounts.clear()
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
func _unlock_items():
|
||||
var result: Dictionary = owniverse.presentation.unlocks(owniverse.state, owniverse.catalog, locked_items)
|
||||
for item_id in result.visible:
|
||||
if owniverse_items.has(item_id):
|
||||
owniverse_items[item_id].set_visible(true)
|
||||
locked_items = result.remaining
|
||||
|
||||
func _on_indicator_pressed(indicator_name: String, page: int = 0):
|
||||
_set_description(indicator_name, page)
|
||||
|
||||
|
||||
func _set_item_description(item: OwniverseItem) -> void:
|
||||
var description: String = "[b]" \
|
||||
+ Global.get_localized_item_description(item.item_name, "label") \
|
||||
+"[/b]" \
|
||||
+"\n" \
|
||||
+ Global.get_localized_item_description(item.item_name, "description")
|
||||
var desc_page = clamp(item.item_page, 0, 4)
|
||||
g_item_descriptions[desc_page].text = description
|
||||
var category: String = "Entity" if owniverse.catalog.entities.has(item.item_id) else "Force"
|
||||
var id: String = item.item_id if category == "Entity" else item.item_name.capitalize()
|
||||
var page: int = clampi(item.item_page, 0, 4)
|
||||
if description_targets.get(page, {}).get("id", "") != id:
|
||||
description_samples.erase(id)
|
||||
description_rates.erase(id)
|
||||
description_targets[page] = {"id": id, "category": category}
|
||||
_refresh_descriptions()
|
||||
|
||||
|
||||
func _set_description(item_name: String, page: int) -> void:
|
||||
var description = Global.get_description(item_name + ".Name")
|
||||
description += "\n"
|
||||
description += Global.get_description(item_name + ".Description")
|
||||
g_item_descriptions[page].text = description
|
||||
description_targets[page] = {"id": item_name, "category": "Indicator"}
|
||||
_refresh_descriptions()
|
||||
|
||||
|
||||
func _refresh_descriptions() -> void:
|
||||
for page in description_targets:
|
||||
var target: Dictionary = description_targets[page]
|
||||
var label: RichTextLabel = g_item_descriptions[page]
|
||||
label.bbcode_enabled = true
|
||||
label.text = ItemDescription.render(owniverse, Global, target.id, target.category, description_rates.get(target.id, 0.0))
|
||||
|
||||
|
||||
func _update_descriptions(delta: float) -> void:
|
||||
description_elapsed += delta
|
||||
if description_elapsed < 0.25:
|
||||
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:
|
||||
var id: String = description_targets[page].id
|
||||
var total = ItemDescription.quantities(owniverse, id).total
|
||||
description_rates[id] = E.divide(E.subtract(total, description_samples[id]), E.of(description_elapsed)) if description_samples.has(id) else 0.0
|
||||
description_samples[id] = total
|
||||
description_elapsed = 0.0
|
||||
_refresh_descriptions()
|
||||
|
||||
|
||||
func _control_page(item: OwniverseItem) -> void:
|
||||
# TODO переписать это ↓
|
||||
if !g_active_items.has(item.item_page):
|
||||
g_active_items[item.item_page] = null
|
||||
|
||||
|
||||
var current_item: OwniverseItem = g_active_items[item.item_page]
|
||||
if current_item == item:
|
||||
return
|
||||
|
||||
|
||||
g_active_items[item.item_page] = item
|
||||
|
||||
active_actions_dirty = true
|
||||
|
||||
if current_item != null and current_item.item_page == item.item_page:
|
||||
current_item.set_selection(false)
|
||||
|
||||
@@ -158,7 +217,7 @@ func _init_owniverse_items() -> bool:
|
||||
item_pages[page].add_child(item)
|
||||
item.init_button(item_props)
|
||||
item.item_activated.connect(item_activated)
|
||||
|
||||
|
||||
owniverse_items[item_id] = item
|
||||
|
||||
return false
|
||||
@@ -167,12 +226,11 @@ func _init_owniverse_items() -> bool:
|
||||
func item_activated(item: OwniverseItem) -> void:
|
||||
_control_page(item)
|
||||
_set_item_description(item)
|
||||
|
||||
|
||||
if item.item_id == "S" or item.item_id == "H":
|
||||
owniverse.produce(item.item_id, 100_000)
|
||||
|
||||
func _unlock_item(item_id: String):
|
||||
owniverse_items[item_id].set_visible(true)
|
||||
var _value = owniverse.state.amount[item.item_id]
|
||||
_value = E.multiply(9, _value) if E.gt(_value, 0) else 1
|
||||
owniverse.request_production(item.item_id, _value, true)
|
||||
|
||||
|
||||
func _check_counters(delta: float) -> Array:
|
||||
@@ -181,17 +239,17 @@ func _check_counters(delta: float) -> Array:
|
||||
var cnt: Counter = g_counters[k]
|
||||
if not cnt.is_active:
|
||||
continue
|
||||
|
||||
|
||||
cnt.value += delta
|
||||
if cnt.value >= cnt.sec:
|
||||
actions.append(k)
|
||||
cnt.value = 0
|
||||
cnt.is_active = false
|
||||
|
||||
|
||||
return actions
|
||||
|
||||
|
||||
#region Swipe
|
||||
#region Swipe and page
|
||||
|
||||
func _do_actions(actions: Array) -> void:
|
||||
for action: String in actions:
|
||||
@@ -202,7 +260,7 @@ func _do_actions(actions: Array) -> void:
|
||||
|
||||
func _swipe_to_nearest_page() -> void:
|
||||
if stage_page_scroller.scroll_horizontal % PAGE_WIDTH == 0: return
|
||||
|
||||
|
||||
var new_page: int = round(1.0 * stage_page_scroller.scroll_horizontal / PAGE_WIDTH)
|
||||
|
||||
if g_tween != null:
|
||||
@@ -216,65 +274,162 @@ func _swipe_to_nearest_page() -> void:
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event is InputEventScreenDrag:
|
||||
#effects_player.play_effect("swipe")
|
||||
stage_page_scroller.scroll_horizontal = clamp(
|
||||
stage_page_scroller.scroll_horizontal - PAGE_COUNT * event.screen_relative.x,
|
||||
0, PAGE_WIDTH * (PAGE_COUNT - 1))
|
||||
g_counters.swipe.is_active = true
|
||||
g_counters.swipe.value = 0
|
||||
elif event is InputEventPanGesture:
|
||||
#effects_player.play_effect("swipe")
|
||||
g_counters.swipe.is_active = true
|
||||
g_counters.swipe.value = 0
|
||||
elif event is InputEventScreenTouch:
|
||||
pass
|
||||
|
||||
|
||||
func _set_active_page_actions() -> void:
|
||||
for pa in page_actions:
|
||||
if !g_active_items.has(pa): continue
|
||||
|
||||
var item_id: String = g_active_items[pa].item_id
|
||||
var entity: OwniverseEntity = owniverse.catalog.entities[item_id]
|
||||
|
||||
#var amount = owniverse.get_available_to_produce(item_id)
|
||||
|
||||
#var amount = owniverse.get_available_to_produce(entity)
|
||||
var amount = owniverse.production.calculate_max_producible(entity)
|
||||
#print(item_id, " : ", amount)
|
||||
if item_id == "SMBH":
|
||||
var preview: Callable = func(requested):
|
||||
return owniverse.production.calculate_max_producible(entity, requested)
|
||||
page_actions[pa].set_actions(item_id, amount, preview)
|
||||
else:
|
||||
page_actions[pa].set_actions(item_id, amount)
|
||||
|
||||
|
||||
func _page_action_pressed(page_id: int, action_amount) -> void:
|
||||
if !g_active_items.has(page_id):
|
||||
return
|
||||
|
||||
var item_id: String = g_active_items[page_id].item_id
|
||||
|
||||
if E.gt(action_amount, 0):
|
||||
owniverse.request_production(item_id, action_amount)
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
owniverse.init_enitities()
|
||||
owniverse.load_data()
|
||||
_init_owniverse_items()
|
||||
|
||||
owniverse.unlock_item.connect(_unlock_item)
|
||||
get_tree().auto_accept_quit = false
|
||||
world_indicators = WorldIndicators.new(self)
|
||||
create_new_universe()
|
||||
load_data()
|
||||
_refresh_universe_ui()
|
||||
|
||||
g_counters.swipe.sec = 0.2
|
||||
|
||||
for pa in page_actions:
|
||||
page_actions[pa].action_pressed.connect(_page_action_pressed)
|
||||
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.
|
||||
## Saving continues through the normal autosave/close path.
|
||||
func create_new_universe() -> void:
|
||||
var previous: Owniverse = owniverse
|
||||
owniverse = Owniverse.new()
|
||||
var inited_result: Dictionary = init_enitities()
|
||||
locked_items = inited_result.locked_items
|
||||
|
||||
for entity in previous.catalog.entities.values():
|
||||
entity.free()
|
||||
previous.free()
|
||||
|
||||
if is_instance_valid(g_tween):
|
||||
g_tween.kill()
|
||||
g_active_items.clear()
|
||||
description_targets.clear()
|
||||
indicator_revision = -1
|
||||
actions_revision = -1
|
||||
descriptions_revision = -1
|
||||
displayed_year = null
|
||||
description_samples.clear()
|
||||
description_rates.clear()
|
||||
description_elapsed = 0.0
|
||||
active_actions_dirty = true
|
||||
active_actions_elapsed = 0.0
|
||||
for label in g_item_descriptions:
|
||||
label.text = ""
|
||||
for item in owniverse_items.values():
|
||||
item.get_parent().remove_child(item)
|
||||
item.queue_free()
|
||||
_init_owniverse_items()
|
||||
for page in range(5, item_pages.size()):
|
||||
item_pages[page].visible = false
|
||||
for actions in page_actions.values():
|
||||
actions.set_actions("", 0.0)
|
||||
pending_page = RESOURCE_PAGE
|
||||
_restore_page.call_deferred()
|
||||
_refresh_universe_ui()
|
||||
_on_topmenu_button_pressed("World")
|
||||
|
||||
|
||||
func _refresh_universe_ui() -> void:
|
||||
owniverse.presentation.refresh(owniverse.state, owniverse.catalog)
|
||||
_change_speed(0)
|
||||
set_datetime(owniverse.state.time.year)
|
||||
set_owniverse_item_value()
|
||||
_unlock_items()
|
||||
if world_indicators != null: world_indicators.update(owniverse)
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
|
||||
var year_delta: float = owniverse.add_time_delta(delta)
|
||||
set_datetime(year_delta)
|
||||
owniverse.cycle(year_delta)
|
||||
|
||||
|
||||
owniverse.evolute_frame(delta, get_tree())
|
||||
indicator_elapsed += delta
|
||||
if indicator_elapsed >= 0.1 and indicator_revision != owniverse.presentation.revision:
|
||||
indicator_elapsed = 0.0
|
||||
world_indicators.update(owniverse)
|
||||
indicator_revision = owniverse.presentation.revision
|
||||
_update_descriptions(delta)
|
||||
if not owniverse.presentation.pending_amounts.is_empty(): set_owniverse_item_value()
|
||||
if displayed_year == null or E.ne(displayed_year, owniverse.state.time.year):
|
||||
set_datetime(owniverse.state.time.year)
|
||||
displayed_year = owniverse.state.time.year
|
||||
|
||||
#owniverse.cycle(delta)
|
||||
|
||||
#owniverse.cycle_legacy(year_delta)
|
||||
|
||||
var actions = _check_counters(delta)
|
||||
_do_actions(actions)
|
||||
|
||||
_set_active_page_actions()
|
||||
|
||||
func _set_active_page_actions() -> void:
|
||||
for pa in page_actions:
|
||||
if !g_active_items.has(pa): continue
|
||||
|
||||
var item_id: String = g_active_items[pa].item_id
|
||||
var amount = owniverse.get_available_to_produce(item_id)
|
||||
page_actions[pa].set_actions(item_id, amount)
|
||||
|
||||
|
||||
|
||||
func _page_action_pressed(page_id: int, action_amount: float) -> void:
|
||||
if !g_active_items.has(page_id):
|
||||
return
|
||||
|
||||
var item_id: String = g_active_items[page_id].item_id
|
||||
|
||||
if action_amount > 0:
|
||||
owniverse.produce(item_id, action_amount)
|
||||
# Production limits are expensive (they walk the resource ledger). Refresh
|
||||
# them when selection changes and at a modest cadence instead of every
|
||||
# rendered frame. The simulation itself continues to run every frame.
|
||||
active_actions_elapsed += delta
|
||||
if active_actions_dirty or (active_actions_elapsed >= 0.1 and actions_revision != owniverse.presentation.revision):
|
||||
active_actions_elapsed = 0.0
|
||||
active_actions_dirty = false
|
||||
_set_active_page_actions()
|
||||
actions_revision = owniverse.presentation.revision
|
||||
|
||||
|
||||
func _change_speed(delta: int) -> void:
|
||||
var speed: int = owniverse.change_speed(delta)
|
||||
var previous_speed: int = owniverse.speed
|
||||
owniverse.speed = owniverse.speed + delta
|
||||
|
||||
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
|
||||
for icon in g_speed_icons:
|
||||
if ind <= speed:
|
||||
@@ -291,16 +446,131 @@ func _change_speed(delta: int) -> void:
|
||||
else:
|
||||
g_time_minus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed - 1))
|
||||
g_time_plus.texture_normal = load(SPEED_TEXTURE_NAME_TEMPLATE % str(speed + 1))
|
||||
|
||||
|
||||
func _on_topmenu_button_pressed(ButtonName) -> void:
|
||||
print(ButtonName)
|
||||
#var s: float = 1E15
|
||||
#var z = 1.0
|
||||
#for i in range(30):
|
||||
#print(i, " | ", z, " | ", " | ", s - z)
|
||||
#z *= 10
|
||||
|
||||
|
||||
func _on_save_data() -> void:
|
||||
owniverse.save_data()
|
||||
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:
|
||||
#print(screen_name, " ←→ ", screen_id)
|
||||
screens[screen_id].visible = screen_id == screen_name
|
||||
|
||||
|
||||
func _on_unlock_and_save_timeout() -> void:
|
||||
save_data()
|
||||
_unlock_items()
|
||||
|
||||
|
||||
#region Init save load routines
|
||||
|
||||
|
||||
func load_data() -> bool:
|
||||
var game_data: Dictionary = SaveManager.load_data("owniverse", "qwerty")
|
||||
if game_data.is_empty():
|
||||
if SaveManager.last_error == "":
|
||||
pending_page = RESOURCE_PAGE
|
||||
_restore_page.call_deferred()
|
||||
return false
|
||||
var restored: Dictionary = game_data.state
|
||||
# Current definitions are initialized first; reject incompatible saves before publishing.
|
||||
for id in owniverse.state.amount:
|
||||
if not restored.amount.has(id) or not restored.stats.total_amount.has(id):
|
||||
push_warning("Save is missing the current entity: " + id)
|
||||
SaveManager.archive_incompatible_save("owniverse")
|
||||
return false
|
||||
var complete: Dictionary = owniverse.state.duplicate(true)
|
||||
complete.merge(restored, true)
|
||||
owniverse.state = complete
|
||||
owniverse.restore_frame_checkpoint(game_data.get("simulation", {}))
|
||||
|
||||
owniverse.evolution.initialize_life_batches()
|
||||
owniverse.presentation.refresh(owniverse.state, owniverse.catalog)
|
||||
pending_page = clampi(int(game_data.get("ui", {}).get("current_page", 0)), 0, PAGE_COUNT - 1)
|
||||
_restore_page.call_deferred()
|
||||
return true
|
||||
|
||||
|
||||
func _restore_page() -> void:
|
||||
# Wait until containers have calculated the scrollable width.
|
||||
await get_tree().process_frame
|
||||
if pending_page >= 0:
|
||||
stage_page_scroller.scroll_horizontal = pending_page * PAGE_WIDTH
|
||||
pending_page = -1
|
||||
|
||||
|
||||
func save_data() -> void:
|
||||
var page: int = pending_page
|
||||
if page < 0:
|
||||
page = clampi(roundi(float(stage_page_scroller.scroll_horizontal) / PAGE_WIDTH), 0, PAGE_COUNT - 1)
|
||||
SaveManager.request_save("owniverse", "qwerty", {
|
||||
"state": owniverse.state,
|
||||
"simulation": owniverse.frame_checkpoint(),
|
||||
"ui": {"current_page": page},
|
||||
})
|
||||
|
||||
|
||||
var closing: bool = false
|
||||
|
||||
|
||||
func _notification(what: int) -> void:
|
||||
if not is_node_ready() or closing:
|
||||
return
|
||||
if what == NOTIFICATION_WM_CLOSE_REQUEST:
|
||||
_close_after_save()
|
||||
elif what == NOTIFICATION_APPLICATION_PAUSED:
|
||||
save_data()
|
||||
# The OS may suspend frames immediately; finish the queued write now.
|
||||
SaveManager.flush_saves()
|
||||
|
||||
|
||||
func _close_after_save() -> void:
|
||||
closing = true
|
||||
process_mode = Node.PROCESS_MODE_DISABLED
|
||||
save_data()
|
||||
if SaveManager.is_saving():
|
||||
await SaveManager.saves_drained
|
||||
get_tree().quit()
|
||||
|
||||
|
||||
func init_enitities() -> Dictionary:
|
||||
var _result := {
|
||||
'locked_items': [],
|
||||
}
|
||||
owniverse.catalog.load_definitions(Global.OwniverseEntities)
|
||||
for entity_id in owniverse.catalog.entities:
|
||||
var entity: OwniverseEntity = owniverse.catalog.entities[entity_id]
|
||||
|
||||
owniverse.state.stats.total_amount[entity_id] = 0
|
||||
owniverse.state.amount[entity_id] = 0
|
||||
if E.gt(entity.lifespan, 0):
|
||||
owniverse.state.batches[entity.id] = []
|
||||
owniverse.batches.add_entity_to_batch(entity_id, 0, 0)
|
||||
if entity.group_as != "":
|
||||
owniverse.state.amount[entity.group_as] = 0
|
||||
|
||||
owniverse.state.stats.total_amount[entity.group_as] = 0
|
||||
|
||||
if entity.unlock != {}:
|
||||
_result.locked_items.append(entity.id)
|
||||
|
||||
return _result
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
func _on_achievements_pressed(extra_arg_0: String) -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
|
||||
func _on_credits_pressed(extra_arg_0: String) -> void:
|
||||
pass # Replace with function body.
|
||||
|
||||
+316
@@ -0,0 +1,316 @@
|
||||
# Проверки поэтапного переноса из 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
|
||||
godot --headless --path Owniverse.GI --script res://tests/benchmark_saved_state.gd -- /tmp/save.adventure.json
|
||||
```
|
||||
|
||||
Читает диагностический JSON формата 4 в отдельные экземпляры мира и замеряет
|
||||
шесть последовательных шагов на скоростях 1, 4, 6. Запись сохранений не вызывается.
|
||||
Последним аргументом можно задать длительность шага в реальных секундах
|
||||
(по умолчанию 1/60). Это время расчёта симуляции, без отрисовки интерфейса.
|
||||
|
||||
На диагностической копии с 120 партиями прежняя рациональная арифметика после
|
||||
оптимизации пустых окон давала 90–99 мс на шаг 1/60 секунды на скорости 6.
|
||||
После перехода на целые блоки и устранения повторного построения физических
|
||||
количеств повторный замер дал 53–58 мс. При шаге 0,1 секунды: 65–67 мс вместо
|
||||
117–138 мс. Это замеры расчёта на данной
|
||||
копии, а не обещание FPS. Для сравнения старый JSON был преобразован только
|
||||
во временный тестовый файл; в загрузчик игры миграция не добавлена.
|
||||
Разреженные сценарии сравниваются с полным расчётом в `test_short_lived_events.gd`.
|
||||
|
||||
## Целые блоки и дробные остатки
|
||||
|
||||
`godot --headless --path Owniverse.GI --script res://tests/test_exact_math.gd`
|
||||
|
||||
Независимый эталон Python Fraction: 160 пар с произведением внутри E27; целые
|
||||
проверяются точно, дроби — с допуском 10^-12. Также границы int64/E27, сериализация,
|
||||
рецепты с дробными стоимостями, сохранение сумм, время и 100 циклов с меняющимися
|
||||
долями. Все остальные тесты используют числовое сравнение и сериализацию через
|
||||
`E`, а не сравнение ссылок на большие числа. Границы точности и новый формат
|
||||
сохранения описаны в [документации арифметики](../world/owniverse/math/README.md).
|
||||
|
||||
## Модули симуляции
|
||||
|
||||
`godot --headless --path Owniverse.GI --script res://tests/test_module_lifecycle.gd`
|
||||
|
||||
Проверяются отдельные экземпляры модулей и состояния для каждой вселенной, слабая обратная ссылка, освобождение модулей вместе с миром и защита от некорректного delta. Остальные тесты используют прямые API batches, ledger, production, automatic, stellar, life, environment и evolution; временные методы-переадресации Owniverse удалены. Описание границ модулей и порядка фаз: `../world/owniverse/README.md`.
|
||||
|
||||
## Математика распределений и каталог
|
||||
|
||||
`godot --headless --path Owniverse.GI --script res://tests/test_quantity_catalog.gd`
|
||||
|
||||
Проверяются целочисленность и границы распределения, сохранение суммы, разрешение равных остатков, накопление дробей и долгов округления, нормализация весов, размер производственной партии, загрузка каталога и его индексы. Архитектура описана в `../world/owniverse/README.md`. Сохранение игрока не используется.
|
||||
|
||||
## Иконки стадий жизни
|
||||
|
||||
Тест также проверяет модуль `item_presentation.gd`: отсутствие изменений входного состояния и списка закрытых иконок, решения по разблокировке, отложенную и принудительную публикацию количеств.
|
||||
|
||||
`godot --headless --path Owniverse.GI --script res://tests/test_life_icons.gd`
|
||||
|
||||
Проверяются одновременная разблокировка подробных и общих иконок EON/LP и C0.0/C0, количества свободных и связанных планет без двойного учёта, переключение подпанелей и очистка счётчика при исчезновении стадии. Сохранение игрока не используется.
|
||||
|
||||
## Параметры мира и индикаторы
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_world_indicators.gd
|
||||
```
|
||||
|
||||
Проверяются сроки жизни существующих и новых звёзд при смене горючести, вероятности и мощность взрывов, влияние агрессии/порядка/просвещения на жизнь, накопление тенденций по времени и этикам, несколько событий за шаг, продолжение после сериализации, валидация сохранения, границы шкал и описания на двух языках. Сцена использует фикстуру без доступа к сохранению игрока.
|
||||
|
||||
## Прямой расчёт завершившихся сверхновых
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_short_lived_events.gd
|
||||
```
|
||||
|
||||
Сравниваются ускоренный путь и прежний путь с созданием всех партий, отключаемый только в тестовой фикстуре. Проверяются LRG, HRG, RSG и RHG на границах коротких и длинных интервалов, существующие SN, нехватка энергии, ресурсы, бласты, привязки, остатки округления и живые партии. Дополнительно проверяется, что длинный интервал создаёт не более двух живых окон и одну запись завершений, сохраняя общее количество. Сохранение игрока этот тест не использует.
|
||||
|
||||
`test_stellar_rules.gd` также проверяет автоматическое создание HBD: долю 0,1% нового автоматического водорода, появление по одному со случайным округлением, сохранение оплаченного остатка топлива, отсутствие повторного начисления на старый запас, продолжение случайной последовательности после сериализации и переход HBD → CBD с сохранением счётчика BD. Формулы описаны в `../simulation_rules.md`.
|
||||
|
||||
## Фоновое сохранение и частота обновления интерфейса
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_async_save.gd
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_ui_updates.gd
|
||||
```
|
||||
|
||||
Сохранение: основной поток создаёт глубокий снимок состояния и параметров. Рабочий поток проверяет данные, записывает зашифрованный временный файл, проверяет чтением и заменяет основное сохранение; диагностический JSON создаётся из того же снимка. Одновременно работает один писатель. Для каждого имени файла хранится только последний ожидающий запрос. `request_save()` подтверждает постановку в очередь; результат записи сообщает сигнал `save_completed`. При закрытии игра ждёт `saves_drained`, при приостановке приложения и уничтожении менеджера очередь завершается через `flush_saves()`. Копирование снимка остаётся в основном потоке.
|
||||
|
||||
Тест сохранений пишет только в уникальную временную папку `/tmp`, затем удаляет собственные файлы. Проверяются независимость снимка, работа кадров при записи, объединение запросов, диагностическая копия, сохранность предыдущего файла при ошибках и завершение очереди при уничтожении менеджера. Сообщения `Invalid save`, `Save blocked` и `Cannot write` в этом тесте ожидаемы.
|
||||
|
||||
Тест интерфейса проверяет передачу количеств из presentation в контролы, очистку очереди после публикации, отложенное и принудительное обновление, производство по нажатию и формат времени. Stage в текущей реализации применяет очередь счётчиков и время каждый кадр; интервал 0,1 секунды используется для индикаторов. Рефакторинг этот порядок не меняет. Тест использует игровую сцену с отключёнными загрузкой, сохранением и автоматической симуляцией, не обращаясь к сохранению игрока.
|
||||
|
||||
## Время: шаг 0,1 игрового года
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_time.gd
|
||||
```
|
||||
|
||||
Команда выполняется из общей папки проектов. Тесты используют искусственные состояния; сохранение игрока не читается и не перезаписывается.
|
||||
|
||||
Проверяются границы десятых долей года, производство ресурсов на этих границах, накопление дробного остатка, скорости 1–10 000 лет/сек, продолжение после загрузки и недопустимые интервалы.
|
||||
|
||||
Схема состояния `0.3.0` хранит:
|
||||
|
||||
- `time.datetime` — накопленный возраст, включая необработанную дробную часть;
|
||||
- `time.year` — последний рассчитанный возраст с точностью до десятой доли года.
|
||||
|
||||
Сохранения используют формат 4 и актуальную структуру состояния. Проверяются целостность данных, фоновая запись и повторная загрузка; поддержка и миграция прежних форматов отсутствуют.
|
||||
|
||||
Файл с несовместимым номером формата при загрузке переносится в `*.adventure.incompatible.bak` (при совпадении имени добавляется числовой суффикс). Игра начинает новую сессию и может сохранять её в формате 4. Прогресс несовместимого файла не переносится, исходные байты сохраняются в архиве. Ошибка архивирования, расшифровки или повреждение данных текущего формата по-прежнему блокируют перезапись.
|
||||
|
||||
## Согласованные правила эволюции
|
||||
|
||||
Сохраняются постепенные интервальные окна GI: начало преобразования — через `lifespan`, длительность окна — `lifespan / 40` при `lifespan > 10`, иначе `lifespan`.
|
||||
|
||||
Вероятностные исходы используют накопление дробного остатка GI, без случайного округления. Этот же подход выбран для будущего создания планет. Шансы планет записаны долями (`0.01` = 1%), а альтернативные исходы звёзд — процентами (`%0.1` = 0.1%). Парсер планет сохраняет дроби и поддерживает один элемент без `&`.
|
||||
|
||||
Уязвимость к бластам читается из `blastability` таблицы GI: HP, EON и цивилизации до C1.2 включительно; C1.3 и выше неуязвимы. Это ограничение относится к бластам уровня 1; локальное уничтожение планет уровня 2 в Unity охватывает все планеты.
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_stellar_rules.gd
|
||||
```
|
||||
|
||||
Проверяются парсер планет, граница уязвимости, накопление редких исходов, сериализация остатков и постепенное преобразование реальной партии RD в TWD.
|
||||
|
||||
Создание планет подключено к ручному и автоматическому производству звёзд. Бласты обрабатываются как события, а не ресурс. Выжившие планеты переходят преемнику звезды пропорционально числу реально полученных преемников; при отсутствии преемника освобождаются. Локальное разрушение выполняется перед передачей.
|
||||
|
||||
Дополнительно проверяются частичная передача, альтернативные преемники, уровни разрушения 1/2, накопление слабых бластов, сохранения, ручное/автоматическое создание планет и несколько поколений за длинный шаг. Правила и формулы описаны в `../simulation_rules.md`.
|
||||
|
||||
## Описания выбранных объектов
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_descriptions.gd
|
||||
```
|
||||
|
||||
Источник текста — `Global.Templates[Global.Locale]`. Заголовок берётся из `Name`, основной текст — из `Description`. Поддерживаются ключи с классом (`RD.Entity.Description`) и старые ключи без класса (`RD.Description`).
|
||||
|
||||
`%valueN%` заменяется значением переменной, имя которой записано в поле `valueN` этой строки. Поддерживаются `amount`, `colored costs`, `lifespan`, `voids`, `he / h`, `metallicity`, показатели энергии, плотности и скорости времени. `amount1`–`amount4` сил пока отображаются как `—`; неизвестные непустые обозначения тоже дают `—`, пустые поля — пустую строку. `[p]` превращается в разделение абзацев, цветовые BBCode-теги сохраняются.
|
||||
|
||||
Доступные требования зелёные, недоступные красные. Для объектов со связанными экземплярами выводится доступное количество и серым общее; для планет — общее количество. Скорость изменения вычисляется по реальному времени и обновляется раз в 0,25 секунды. Доли He/H вычисляются из текущих свободных запасов; при пустой смеси показывается `—`. Металличность и плотность используют расчёт среды GI. Счётчики исходной материи и этики Unity в текущей GI отсутствуют и здесь не добавляются.
|
||||
|
||||
## Первичная жизнь
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_life.gd
|
||||
```
|
||||
|
||||
Проверяются абиогенез, деградация, повторные попытки без создания дополнительных планет, появление C0.0 на прежней звезде, остатки вероятностей, сохранение/продолжение, однократная инициализация старых планет и отсутствие воскрешения после бластов.
|
||||
|
||||
Проверка загрузки этических правил, распределений и отделения космических цивилизаций:
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_civilization_state.gd
|
||||
```
|
||||
|
||||
Тест цивилизаций дополнительно проверяет общий звёздный бюджет, повторное использование резерва при переходе, звёзды в структурах, массовый эквивалент SMBH, блокировку неподдержанного прогресса, каскад деградации и повторное применение ограничений без потерь.
|
||||
|
||||
|
||||
## Полная эволюция цивилизаций
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/test_civilization_evolution.gd
|
||||
```
|
||||
|
||||
Проверяются реальные коэффициенты C0.2, войны и побочный ущерб C2.0, замена планет колониями с сохранением хозяина, дипломатическое влияние, бонус периода от структур и деградация при их отсутствии. Ускоренная модель проходит все стадии C0.2 → C4.4 → Ct. Проверки контролируют сохранение населения, целочисленность этик, валидацию сохранения и детерминированное продолжение после сериализации.
|
||||
|
||||
## Профиль цивилизаций на шестой скорости
|
||||
|
||||
```sh
|
||||
godot --headless --path Owniverse.GI --script res://tests/benchmark_civilizations.gd -- frames=20 profile
|
||||
godot --path Owniverse.GI --script res://tests/benchmark_civilizations.gd -- ui scenario=mixed frames=10 profile
|
||||
```
|
||||
|
||||
Сценарии `mixed`, `large`, `fragmented` заполняют все стадии и этики, синхронизируя
|
||||
переходы; `large` использует по 6e20 цивилизаций, `fragmented` — десять партий.
|
||||
Это искусственные стрессовые сценарии. `scenario=stable` использует штатные
|
||||
сроки стадий. Параметр `snapshot=/tmp/civil` сохраняет состояние каждого сценария
|
||||
для сравнения до и после изменения. UI запускает настоящую сцену со страницей
|
||||
жизни и реальным delta, без загрузки и записи сохранения игрока.
|
||||
|
||||
`profile` выводит суммарные микросекунды и число вызовов по этапам. Вложенные
|
||||
этапы входят во время родительских; складывать их нельзя. В игре сбор выключен.
|
||||
Кэши физических количеств принадлежат отдельному миру и проверяют изменения
|
||||
количеств, вложенных привязок и индексов каталога. Кэш структуры правил не входит
|
||||
в сохранение: при изменении Claim/бонусов нужно перестроить индексы каталога,
|
||||
при изменении home в существующей таблице — invalidate_civilization_layout().
|
||||
|
||||
После оптимизации на M4 Pro, по 20 шагов 1/60 секунды, среднее время:
|
||||
`mixed` 295 → 235 мс, `large` 666 → 539 мс, `fragmented` 359 → 282 мс.
|
||||
Полные состояния всех трёх сценариев после 20 шагов совпали до и после изменения.
|
||||
Дополнительно тест распределений сравнивает новый путь с прежним на 300
|
||||
случайных наборах, включая 1e40 и накопленные долги округления.
|
||||
|
||||
## Расчёт между кадрами
|
||||
|
||||
`godot --headless --path Owniverse.GI --script res://tests/test_frame_evolution.gd`
|
||||
|
||||
Stage вызывает `evolute_frame`: транзакция получает бюджет 40 мс и уступает
|
||||
следующему кадру внутри создания партий и обработки стадий. Расчёт остаётся
|
||||
на главном потоке, состояние публикуется только после полного завершения.
|
||||
Длительность одной транзакции ограничена обычным шагом 1/60 секунды выбранной
|
||||
скорости. Запрошенное время хранится отдельно, поэтому отставание не превращается
|
||||
в один всё более тяжёлый шаг. При предельной нагрузке время симуляции может
|
||||
отставать от запрошенного; это не ограничение FPS интерфейса и не удаление событий.
|
||||
|
||||
Производство во время транзакции выполняется после её завершения. Запрошенное
|
||||
время, активный интервал, скорость и очередь производства входят в сохранение;
|
||||
при загрузке незавершённый интервал пересчитывается с опубликованного состояния.
|
||||
Сброс мира отменяет отложенный расчёт. Тест проверяет точное совпадение непрерывного
|
||||
и распределённого расчёта, очереди, переключение скорости, восстановление и отмену.
|
||||
|
||||
На M4 Pro, 180 кадров реального UI на шестой скорости: смешанный сценарий
|
||||
15.9 FPS (максимальный кадр 98 мс), большие количества 17.5 FPS (106 мс),
|
||||
много партий 16.3 FPS (97 мс).
|
||||
Это 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.
|
||||
|
||||
Адаптивный шаг на скоростях 4–6 выбирает 0.1, 0.2 или 0.5 реальной секунды.
|
||||
Долг больше двух шагов повышает ступень, меньше половины шага понижает её.
|
||||
Шаг ограничен доступным запрошенным временем. Скорости 1–3 сохраняют 1/60;
|
||||
смена скорости сбрасывает ступень. Возобновляемая транзакция сохраняет точную
|
||||
границу из checkpoint, адаптация применяется к следующей транзакции.
|
||||
Бюджет кадра остаётся 40 мс; ширина временных партий не меняется.
|
||||
`test_frame_evolution` проверяет ступени, гистерезис, сохранение долга,
|
||||
переключение скорости, возобновление и совпадение с прямым расчётом того же шага.
|
||||
На свежей диагностической копии сохранения с долгом 407.79 млн лет:
|
||||
600 кадров реального UI на M4 Pro дали 18.05 FPS (p95 92.91 мс,
|
||||
максимум 122.45 мс), поступило 3.335 млн лет, обработано 6.480 млн:
|
||||
пропускная способность 1.943 вместо 0.787 при фиксированном шаге 0.1.
|
||||
Разбиение времени влияет на дискретные производство и глобальные параметры;
|
||||
адаптивные шаги не обещают совпадения результата с последовательностью 0.1.
|
||||
|
||||
Дипломатический 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
|
||||
и долг больше одного шага, ступень увеличивается раньше порога двух шагов.
|
||||
Долг и граница сохраняются как прежде; измерения являются временным кэшем.
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,63 @@
|
||||
# Все объекты, скорость 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
|
||||
```
|
||||
@@ -0,0 +1,74 @@
|
||||
extends SceneTree
|
||||
const Fixture = preload("res://tests/fixtures/civilization_benchmark.gd")
|
||||
|
||||
func _initialize(): call_deferred("run")
|
||||
|
||||
func run():
|
||||
var ui: bool = "ui" in OS.get_cmdline_user_args()
|
||||
var scenarios: Array = ["mixed", "large", "fragmented"]
|
||||
var frames: int = 120
|
||||
var step_delta: float = 1.0 / 60.0
|
||||
for argument in OS.get_cmdline_user_args():
|
||||
if argument.begins_with("scenario="): scenarios = [argument.trim_prefix("scenario=")]
|
||||
if argument.begins_with("delta="): step_delta = float(argument.trim_prefix("delta="))
|
||||
if argument.begins_with("frames="): frames = maxi(2, int(argument.trim_prefix("frames=")))
|
||||
Engine.max_fps = 60
|
||||
if ui: DisplayServer.window_set_size(Vector2i(540, 960))
|
||||
for scenario in scenarios:
|
||||
var scene
|
||||
var stage
|
||||
var world
|
||||
if ui:
|
||||
scene = load("res://world/world.tscn").instantiate()
|
||||
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
|
||||
await process_frame
|
||||
world = stage.owniverse
|
||||
else:
|
||||
world = load("res://world/owniverse/owniverse.gd").new()
|
||||
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
|
||||
Fixture.seed(world, root.get_node("Global"), scenario == "fragmented", scenario == "large", scenario == "stable")
|
||||
world.profile_enabled = "profile" in OS.get_cmdline_user_args()
|
||||
var samples: Array = []
|
||||
if ui:
|
||||
stage.stage_page_scroller.scroll_horizontal = 4 * stage.PAGE_WIDTH
|
||||
for item in stage.owniverse_items.values(): item.visible = true
|
||||
for page in stage.item_pages: page.visible = true
|
||||
stage._set_item_description(stage.owniverse_items["C2.0"])
|
||||
stage._refresh_universe_ui()
|
||||
for warmup in 10: await process_frame
|
||||
stage.measuring = true
|
||||
for frame in frames:
|
||||
await process_frame
|
||||
if (frame + 1) % 10 == 0:
|
||||
print("%s: measured %d UI frames" % [scenario, frame + 1])
|
||||
stage.measuring = false
|
||||
samples = stage.process_samples
|
||||
report(scenario + " UI frame", stage.frame_samples)
|
||||
else:
|
||||
for frame in frames:
|
||||
var started: int = Time.get_ticks_usec()
|
||||
world.evolute(step_delta)
|
||||
samples.append((Time.get_ticks_usec() - started) / 1000.0)
|
||||
report(scenario + (" UI handler" if ui else " CPU"), samples)
|
||||
if ui:
|
||||
print("Completed simulation transactions: ", world.frame_commits, "; published year: ", world.state.time.year, "; requested year: ", world.frame_clock.get("year", 0))
|
||||
print("Statistics ", world.state.civilization_stats)
|
||||
if world.profile_enabled: print("Profile microseconds/calls: ", world.profile)
|
||||
for argument in OS.get_cmdline_user_args():
|
||||
if argument.begins_with("snapshot="):
|
||||
var file = FileAccess.open(argument.trim_prefix("snapshot=") + "-" + scenario + ".json", FileAccess.WRITE)
|
||||
file.store_string(JSON.stringify(world.E.encode(world.state)))
|
||||
for entity in world.catalog.entities.values(): entity.free()
|
||||
world.free()
|
||||
if ui: scene.free()
|
||||
quit()
|
||||
|
||||
func report(label: String, samples: Array):
|
||||
var total: float = 0.0
|
||||
for sample in samples: total += sample
|
||||
samples.sort()
|
||||
print("%s: mean %.2f ms, p95 %.2f ms, max %.2f ms, %.1f per second" % [label, total / samples.size(), samples[ceili(samples.size() * 0.95) - 1], samples.back(), samples.size() * 1000 / total])
|
||||
@@ -0,0 +1 @@
|
||||
uid://b5w4sp6eepypa
|
||||
@@ -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("Final adaptive 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()
|
||||
@@ -0,0 +1 @@
|
||||
uid://3xjh23kg5vrn
|
||||
@@ -0,0 +1,55 @@
|
||||
extends SceneTree
|
||||
## Read-only benchmark. Loads a diagnostic JSON, never invokes SaveManager.
|
||||
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_saved_state.gd -- /path/to/save.adventure.json [delta_seconds]")
|
||||
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") != 5:
|
||||
push_error("Expected diagnostic JSON format 5")
|
||||
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
|
||||
for speed in [1, 4, 6]:
|
||||
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 = []
|
||||
for cycle in 6:
|
||||
var start: int = Time.get_ticks_usec()
|
||||
world.evolute(delta)
|
||||
elapsed.append((Time.get_ticks_usec() - start) / 1000.0)
|
||||
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()
|
||||
world.free()
|
||||
quit()
|
||||
@@ -0,0 +1 @@
|
||||
uid://dji1apht4pn5y
|
||||
@@ -0,0 +1,40 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
func _initialize(): call_deferred("run")
|
||||
|
||||
func run():
|
||||
for scenario in ["ordinary", "hypergiants"]:
|
||||
var world = load("res://world/owniverse/owniverse.gd").new()
|
||||
world.catalog.load_definitions(root.get_node("Global").OwniverseEntities)
|
||||
for id in world.catalog.entities:
|
||||
world.state.amount[id] = 0
|
||||
world.state.stats.total_amount[id] = 0
|
||||
var group: String = world.catalog.entities[id].group_as
|
||||
if group != "":
|
||||
world.state.amount[group] = 0
|
||||
world.state.stats.total_amount[group] = 0
|
||||
world.speed = 6
|
||||
world.state.amount.S = E.of("1e24")
|
||||
world.state.amount.H = E.of("1e24")
|
||||
for entry in [["RD", 1234567], ["YD", 765432], ["STN", 654321]]:
|
||||
world.state.amount[entry[0]] = entry[1]
|
||||
world.batches.append_batch(world.state, entry[0], entry[1], 0, 0)
|
||||
if scenario == "hypergiants":
|
||||
world.state.amount.HG = E.of("1e20")
|
||||
world.batches.append_batch(world.state, "HG", E.of("1e20"), 0, 0)
|
||||
var start_year = E.subtract(world.catalog.entities.HG.lifespan, 1000)
|
||||
world.state.time = {"datetime": start_year, "year": start_year}
|
||||
var samples: Array = []
|
||||
var total: int = 0
|
||||
for frame in 600:
|
||||
var started: int = Time.get_ticks_usec()
|
||||
world.evolute(1.0 / 60.0)
|
||||
var duration: int = Time.get_ticks_usec() - started
|
||||
samples.append(duration)
|
||||
total += duration
|
||||
samples.sort()
|
||||
print("Speed 6 %s: 600 frames, mean %.3f ms, p95 %.3f ms, max %.3f ms, %.1f cycles/sec" % [scenario, total / 600000.0, samples[569] / 1000.0, samples.back() / 1000.0, 600000000.0 / total])
|
||||
for entity in world.catalog.entities.values(): entity.free()
|
||||
world.free()
|
||||
quit()
|
||||
@@ -0,0 +1 @@
|
||||
uid://bboo6op14es24
|
||||
@@ -0,0 +1,56 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
func _initialize(): call_deferred("run")
|
||||
|
||||
func report(label: String, samples: Array):
|
||||
var total: float = 0.0
|
||||
var slow: int = 0
|
||||
for sample in samples:
|
||||
total += sample
|
||||
if sample > 33.333: slow += 1
|
||||
samples.sort()
|
||||
print("%s: %d samples, mean %.3f ms, p95 %.3f ms, max %.3f ms, >33ms %d" % [label, samples.size(), total / samples.size(), samples[int(samples.size() * 0.95) - 1], samples.back(), slow])
|
||||
|
||||
func run():
|
||||
Engine.max_fps = 60
|
||||
DisplayServer.window_set_size(Vector2i(540, 960))
|
||||
print("Renderer: ", RenderingServer.get_current_rendering_method(), " adapter: ", RenderingServer.get_video_adapter_name())
|
||||
for scenario in ["ordinary", "hypergiants"]:
|
||||
for page in ([2] if "stars" in OS.get_cmdline_user_args() else [1, 2]):
|
||||
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
|
||||
await process_frame
|
||||
var world = stage.owniverse
|
||||
world.speed = 6
|
||||
world.state.amount.S = E.of("1e24")
|
||||
world.state.amount.H = E.of("1e24")
|
||||
for entry in [["RD", 1234567], ["YD", 765432], ["STN", 654321]]:
|
||||
world.state.amount[entry[0]] = entry[1]
|
||||
world.batches.append_batch(world.state, entry[0], entry[1], 0, 0)
|
||||
if scenario == "hypergiants":
|
||||
world.state.amount.HG = E.of("1e20")
|
||||
world.batches.append_batch(world.state, "HG", E.of("1e20"), 0, 0)
|
||||
var start_year = E.subtract(world.catalog.entities.HG.lifespan, 1000)
|
||||
world.state.time = {"datetime": start_year, "year": start_year}
|
||||
stage.stage_page_scroller.scroll_horizontal = page * stage.PAGE_WIDTH
|
||||
for item in stage.owniverse_items.values(): item.visible = true
|
||||
if page == 2: stage._control_page(stage.owniverse_items.HG)
|
||||
stage._set_item_description(stage.owniverse_items.HG if page == 2 else stage.owniverse_items.H)
|
||||
stage._refresh_universe_ui()
|
||||
for warmup in 30: await process_frame
|
||||
stage.measuring = true
|
||||
for frame in 600: await process_frame
|
||||
stage.measuring = false
|
||||
var label: String = "%s page %d" % [scenario, page]
|
||||
report(label + " Stage CPU", stage.process_samples)
|
||||
report(label + " frame wall", stage.frame_samples)
|
||||
print("UI counters: H=", stage.owniverse_items.H.description.text, " HG=", stage.owniverse_items.HG.description.text, " date=", stage.date_time.text)
|
||||
for entity in world.catalog.entities.values(): entity.free()
|
||||
world.free()
|
||||
scene.free()
|
||||
quit()
|
||||
@@ -0,0 +1 @@
|
||||
uid://b3gmlo2vq6kk4
|
||||
@@ -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)
|
||||
@@ -0,0 +1 @@
|
||||
uid://1icskkk5nld8
|
||||
+12
@@ -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
@@ -0,0 +1 @@
|
||||
uid://csew6jyuiwxh0
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
extends "res://stage/stage.gd"
|
||||
|
||||
var measuring: bool = false
|
||||
var process_samples: Array = []
|
||||
var frame_samples: Array = []
|
||||
var previous_frame: int = 0
|
||||
|
||||
# Exercise the production Stage, with isolated state and no player-save I/O.
|
||||
func load_data() -> bool: return false
|
||||
func save_data() -> void: pass
|
||||
func _notification(_what: int) -> void: pass
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if not measuring: return
|
||||
var started: int = Time.get_ticks_usec()
|
||||
if previous_frame: frame_samples.append((started - previous_frame) / 1000.0)
|
||||
previous_frame = started
|
||||
super._process(delta)
|
||||
process_samples.append((Time.get_ticks_usec() - started) / 1000.0)
|
||||
+1
@@ -0,0 +1 @@
|
||||
uid://d1wm7nav71y3o
|
||||
+1
File diff suppressed because one or more lines are too long
+30
@@ -0,0 +1,30 @@
|
||||
extends RefCounted
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
static func seed(world, global, fragmented: bool = false, large: bool = false, stable: bool = false):
|
||||
for id in world.catalog.entities:
|
||||
world.state.amount[id] = 0
|
||||
world.state.stats.total_amount[id] = 0
|
||||
var entity = world.catalog.entities[id]
|
||||
if entity.group_as != "":
|
||||
world.state.amount[entity.group_as] = 0
|
||||
world.state.stats.total_amount[entity.group_as] = 0
|
||||
for id in ["RD", "BG", "TWD", "SNS", "MGT", "BH25", "SMBH", "SCD", "GEM", "LGG", "LSC", "LGF", "LGW", "LUB"]:
|
||||
world.state.amount[id] = E.of("1e48")
|
||||
world.state.amount.S = E.of("1e50")
|
||||
world.state.amount.H = E.of("1e48")
|
||||
world.state.binds.RD = {"HP": E.of("1e30"), "RP": E.of("1e30"), "GG": E.of("1e30"), "AB": E.of("1e30")}
|
||||
var count = E.of("6e20") if large else 6000
|
||||
for id in global.CivilizationRules:
|
||||
if E.le(global.CivilizationRules[id].span, 0): continue
|
||||
world.state.amount[id] = count
|
||||
world.state.ethics[id] = {}
|
||||
for ethic in ["m", "l", "w", "d", "c", "b"]:
|
||||
world.state.ethics[id][ethic] = E.divide(count, 6)
|
||||
world.state.batches[id] = []
|
||||
var parties: int = 10 if fragmented else 1
|
||||
for i in parties:
|
||||
var lifespan = E.of(global.CivilizationRules[id].span) if stable else 1
|
||||
world.state.batches[id].append({"amount": E.divide(count, parties), "created_from": i * 100, "created_to": 1000 + i * 100, "start_year": E.add(lifespan, i * 100), "end_year": E.add(lifespan, 1000 + i * 100)})
|
||||
world.ledger.refresh_groups(world.state)
|
||||
world.speed = 6
|
||||
@@ -0,0 +1 @@
|
||||
uid://bjloakx4qdpsj
|
||||
Vendored
+1
File diff suppressed because one or more lines are too long
+59
@@ -0,0 +1,59 @@
|
||||
extends RefCounted
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
# Frozen apportionment before the civilization performance refactor.
|
||||
|
||||
static func allocate_whole(requests: Dictionary, limit: Variant) -> Dictionary:
|
||||
var total: Variant = 0
|
||||
for amount in requests.values():
|
||||
total = E.add(total, E.floor_value(E.maximum(0, amount)))
|
||||
var available: Variant = E.floor_value(E.minimum(E.maximum(0, limit), total))
|
||||
var result: Dictionary = {}
|
||||
var order: Array = []
|
||||
var assigned: Variant = 0
|
||||
for id in requests:
|
||||
var expected: Variant = (E.mul_div(E.floor_value(E.maximum(0, requests[id])), available, total) if E.gt(total, 0) else 0)
|
||||
result[id] = E.floor_value(expected)
|
||||
assigned = E.add(assigned, result[id])
|
||||
order.append({"id": id, "rest": E.subtract(expected, result[id])})
|
||||
order.sort_custom(func ( a : Dictionary , b : Dictionary ) -> bool : return (E.gt(a.rest, b.rest) if E.ne(a.rest, b.rest) else E.lt(str(a.id), str(b.id))))
|
||||
for item : Dictionary in order:
|
||||
if E.ge(assigned, available):
|
||||
break
|
||||
if E.lt(result[item.id], E.floor_value(requests[item.id])):
|
||||
result[item.id] = E.add(result[item.id], 1)
|
||||
assigned = E.add(assigned, 1)
|
||||
return result
|
||||
|
||||
|
||||
static func sum(pop: Dictionary) -> Variant:
|
||||
var result: Variant = 0
|
||||
for n in pop.values(): result = E.add(result, n)
|
||||
return result
|
||||
|
||||
|
||||
static func split(remainders: Dictionary, key: String, count: Variant, weights: Dictionary) -> Dictionary:
|
||||
var result: Dictionary = {}
|
||||
var sum_weights: Variant = sum(weights)
|
||||
if (E.le(count, 0) or E.le(sum_weights, 0)): return result
|
||||
var expected: Dictionary = {}
|
||||
var positive_sum: Variant = 0
|
||||
for id in weights:
|
||||
expected[id] = E.add(E.mul_div(count, weights[id], sum_weights), remainders.get(E.add(E.add(key, ":"), id), 0))
|
||||
positive_sum = E.add(positive_sum, E.maximum(0, expected[id]))
|
||||
var order: Array = []
|
||||
var assigned: Variant = 0
|
||||
for id in weights:
|
||||
var normalized: Variant = (E.mul_div(E.maximum(0, expected[id]), count, positive_sum) if E.gt(positive_sum, 0) else 0)
|
||||
result[id] = E.floor_value(normalized)
|
||||
assigned = E.add(assigned, result[id])
|
||||
order.append({"id": id, "rest": E.subtract(normalized, result[id])})
|
||||
order.sort_custom(func ( a , b ) : return (E.gt(a.rest, b.rest) if E.ne(a.rest, b.rest) else E.lt(str(a.id), str(b.id))))
|
||||
for entry in order:
|
||||
if E.ge(assigned, count): break
|
||||
result[entry.id] = E.add(result[entry.id], 1)
|
||||
assigned = E.add(assigned, 1)
|
||||
for id in weights:
|
||||
remainders[E.add(E.add(key, ":"), id)] = E.clamp_value(E.subtract(expected[id], result[id]), E.neg(1), 1)
|
||||
return result
|
||||
|
||||
|
||||
+1
@@ -0,0 +1 @@
|
||||
uid://dxsly3qpyqrjy
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
extends "res://world/owniverse/owniverse.gd"
|
||||
|
||||
# Compare with the materialized-batch path, without overriding the coordinator.
|
||||
func _init() -> void:
|
||||
stellar.direct_completions = false
|
||||
+1
@@ -0,0 +1 @@
|
||||
uid://cn6hhpjw1sjpb
|
||||
Vendored
+22
@@ -0,0 +1,22 @@
|
||||
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.
|
||||
func load_data() -> bool:
|
||||
return false
|
||||
|
||||
func save_data() -> void:
|
||||
pass
|
||||
|
||||
func _process(_delta: float) -> void:
|
||||
pass
|
||||
|
||||
func _notification(_what: int) -> void:
|
||||
pass
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
uid://c8ewikdhlvnex
|
||||
@@ -0,0 +1,48 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
var failures: int = 0
|
||||
var checks: int = 0
|
||||
|
||||
func _initialize() -> void:
|
||||
call_deferred("run")
|
||||
|
||||
func check(value: bool, message: String) -> void:
|
||||
checks = E.add(checks, 1)
|
||||
if (not value):
|
||||
failures = E.add(failures, 1)
|
||||
push_error(message)
|
||||
|
||||
func run() -> void:
|
||||
var actions = load("res://ui/actions/actions.tscn").instantiate()
|
||||
root.add_child(actions)
|
||||
for maximum in [0, E.of("0.1"), E.of("0.99"), 1, E.of("1.9"), 10, 100, 123, 1000, 10000, E.of("1e9"), E.of("1.1e9"), E.of("9e27")]:
|
||||
actions.set_actions("test", maximum)
|
||||
var labels: Array = []
|
||||
var values: Array = []
|
||||
for i in 5:
|
||||
var value: Variant = actions.action_values[i]
|
||||
var text: String = actions.action_labels[i].text
|
||||
check((E.eq(value, E.floor_value(value)) and E.le(value, E.floor_value(maximum))), "Whole affordable request")
|
||||
if E.gt(value, 0):
|
||||
check(((not values.has(value)) and (not labels.has(text))), "Unique requests and displayed labels")
|
||||
values.append(value)
|
||||
labels.append(text)
|
||||
else:
|
||||
check((E.eq(text, "") and actions.action_labels[i].get_parent().get_node("TextureButton").disabled), "Unused button blank and disabled")
|
||||
if E.ge(maximum, 1): check(E.eq(values.back(), E.floor_value(maximum)), "Maximum retained")
|
||||
actions.set_actions("test", 100)
|
||||
check(E.eq(actions.action_values.values(), [1, 10, 100, 0, 0]), "Exact power of ten not duplicated")
|
||||
actions.set_actions("SMBH", 25, func ( _request ) : return 25)
|
||||
check(E.eq(actions.action_values.values(), [25, 0, 0, 0, 0]), "Identical SMBH previews collapse to one button")
|
||||
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_labels[2].text, "120"), "Recipe preview displayed while original request retained")
|
||||
var emitted: Array = []
|
||||
actions.action_pressed.connect(func ( _page , amount ) : emitted.append(amount))
|
||||
actions._on_action_button_pressed(2)
|
||||
actions._on_action_button_pressed(4)
|
||||
check(E.eq(emitted, [123]), "Only active button emits its matching request")
|
||||
actions.queue_free()
|
||||
print(("Action values: %d checks, %d failures" % [checks, failures]))
|
||||
quit((0 if E.eq(failures, 0) else 1))
|
||||
@@ -0,0 +1 @@
|
||||
uid://dilbcphuku6k1
|
||||
@@ -0,0 +1,144 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
|
||||
var failures: int = 0
|
||||
var checks: int = 0
|
||||
var completions: Array = []
|
||||
|
||||
func _initialize() -> void:
|
||||
call_deferred("run")
|
||||
|
||||
func check(value: bool, message: String) -> void:
|
||||
checks = E.add(checks, 1)
|
||||
if (not value):
|
||||
failures = E.add(failures, 1)
|
||||
push_error(message)
|
||||
|
||||
func run() -> void:
|
||||
var manager = load("res://autoload/save_manager.gd").new()
|
||||
var directory: String = ("/tmp/owniverse-async-%s-%s" % [OS.get_process_id(), Time.get_ticks_usec()])
|
||||
DirAccess.make_dir_recursive_absolute(directory)
|
||||
manager.save_directory = directory
|
||||
root.add_child(manager)
|
||||
manager.save_completed.connect(func ( filename , success , error ) : completions.append([filename, success, error]))
|
||||
var world = load("res://world/owniverse/owniverse.gd").new()
|
||||
world.state.energy = E.subtract(world.state.energy, 1)
|
||||
world.state.time = preload("res://world/owniverse/simulation_time.gd").advance({"datetime": E.of("1e27")}, 0.000000001, 1)
|
||||
var data: Dictionary = {"state": world.state, "ui": {"current_page": 1}}
|
||||
var initial_energy: Variant = world.state.energy
|
||||
var global: Node = root.get_node("Global")
|
||||
var old_plaintext: bool = global.save_plaintext_copy
|
||||
global.save_plaintext_copy = true
|
||||
check(manager.request_save("snapshot", "test-password", data), "Snapshot queued")
|
||||
data.state.energy = 99
|
||||
data.ui.current_page = 2
|
||||
var frames: int = 0
|
||||
var deadline: int = E.add(Time.get_ticks_msec(), 10000)
|
||||
while (manager.is_saving() and E.lt(Time.get_ticks_msec(), deadline)):
|
||||
frames = E.add(frames, 1)
|
||||
await process_frame
|
||||
check(((not manager.is_saving()) and E.gt(frames, 0)), "Frames continue while save is pending")
|
||||
var saved: Dictionary = manager.load_data("snapshot", "test-password")
|
||||
check((E.eq(saved.state.energy, initial_energy) and E.eq(saved.ui.current_page, 1)), "Worker owns a deep snapshot")
|
||||
check(E.eq(saved.state.time, world.state.time), "Encrypted save preserves exact ticks at huge age")
|
||||
var plain: Dictionary = JSON.parse_string(FileAccess.get_file_as_string(directory.path_join("snapshot.adventure.json")))
|
||||
check(E.eq(E.decode(plain.state.energy), initial_energy), "Diagnostic JSON uses same snapshot")
|
||||
check(E.eq(E.decode(plain.state.time), saved.state.time), "Diagnostic JSON preserves fractional time")
|
||||
check((E.eq(completions.size(), 1) and completions[0][1]), "Completion reports successful write")
|
||||
|
||||
completions.clear()
|
||||
data.state.energy = 1
|
||||
manager.request_save("latest", "test-password", data)
|
||||
data.state.energy = 2
|
||||
manager.request_save("latest", "test-password", data)
|
||||
data.state.energy = 3
|
||||
manager.request_save("latest", "test-password", data)
|
||||
data.state.energy = 4
|
||||
manager.flush_saves()
|
||||
check(E.eq(completions.size(), 2), "Repeated requests coalesce behind active write")
|
||||
check(E.eq(manager.load_data("latest", "test-password").state.energy, 3), "Last queued snapshot wins")
|
||||
|
||||
var pending_clock: Dictionary = preload("res://world/owniverse/simulation_time.gd").advance(world.state.time, 0.01, 1)
|
||||
data.simulation = {"requested_clock": pending_clock, "active_clock": pending_clock, "speed": 1, "productions": [{"id": "H", "amount": 7, "resource": true}]}
|
||||
manager.request_save("checkpoint", "test-password", data)
|
||||
manager.flush_saves()
|
||||
check(E.eq(manager.load_data("checkpoint", "test-password").simulation, data.simulation), "Encrypted save preserves requested time and queued production")
|
||||
var malformed: Dictionary = manager._snapshot("probe", "test-password", data).payload
|
||||
malformed.simulation.productions[0].id = "missing-entity"
|
||||
check(manager.validate_data(malformed).contains("queued production"), "Unknown queued production is rejected before resume")
|
||||
malformed = manager._snapshot("probe", "test-password", data).payload
|
||||
malformed.simulation.requested_clock.year = -1
|
||||
check(manager.validate_data(malformed).contains("simulation clock"), "Invalid requested clock is rejected before resume")
|
||||
data.erase("simulation")
|
||||
|
||||
var incompatible_path: String = directory.path_join("incompatible.adventure")
|
||||
var incompatible = FileAccess.open_encrypted_with_pass(incompatible_path, FileAccess.WRITE, "test-password")
|
||||
incompatible.store_var({"format_version": E.neg(1), "state": {"unknown": true}}, false)
|
||||
incompatible.close()
|
||||
var original: PackedByteArray = FileAccess.get_file_as_bytes(incompatible_path)
|
||||
var previous_archive = FileAccess.open(E.add(incompatible_path, ".incompatible.bak"), FileAccess.WRITE)
|
||||
previous_archive.store_string("keep previous backup")
|
||||
previous_archive.close()
|
||||
manager.blocked_saves.incompatible = true
|
||||
check((manager.load_data("incompatible", "test-password").is_empty() and E.eq(manager.last_error, "")), "Unsupported format permits a fresh session")
|
||||
check(((not manager.blocked_saves.has("incompatible")) and (not FileAccess.file_exists(incompatible_path))), "Incompatible file no longer blocks saving")
|
||||
check(E.eq(FileAccess.get_file_as_bytes(E.add(incompatible_path, ".incompatible.bak.1")), original), "Unsupported save archived without losing bytes")
|
||||
check(E.eq(FileAccess.get_file_as_string(E.add(incompatible_path, ".incompatible.bak")), "keep previous backup"), "Earlier archive preserved")
|
||||
check(manager.request_save("incompatible", "test-password", data), "New session can queue a save")
|
||||
manager.flush_saves()
|
||||
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.
|
||||
data.state.energy = E.neg(1)
|
||||
manager.request_save("latest", "test-password", data)
|
||||
manager.flush_saves()
|
||||
check(((not completions.back()[1]) and manager.last_error.contains("Invalid save")), "Worker validation error reaches main thread")
|
||||
check(E.eq(manager.load_data("latest", "test-password").state.energy, 3), "Invalid snapshot preserves previous save")
|
||||
manager.blocked_saves.latest = true
|
||||
check((not manager.request_save("latest", "test-password", data)), "Unreadable save protection also applies to queue")
|
||||
# A valid snapshot exercises an actual I/O failure, not validation.
|
||||
data.state.energy = 5
|
||||
manager.request_save("missing/failure", "test-password", data)
|
||||
manager.flush_saves()
|
||||
check(manager.last_error.contains("Cannot write"), "I/O error reported without hanging queue")
|
||||
|
||||
manager.request_save("shutdown", "test-password", data)
|
||||
data.state.energy = 6
|
||||
manager.request_save("shutdown", "test-password", data)
|
||||
manager.free()
|
||||
var reader = load("res://autoload/save_manager.gd").new()
|
||||
reader.save_directory = directory
|
||||
check(E.eq(reader.load_data("shutdown", "test-password").state.energy, 6), "Teardown drains final pending snapshot")
|
||||
reader.free()
|
||||
world.free()
|
||||
# Exercise the stage entry point too: manager tests alone do not catch a
|
||||
# regression back to the synchronous API in stage.gd.
|
||||
var shared_manager: Node = root.get_node("SaveManager")
|
||||
var original_directory: String = shared_manager.save_directory
|
||||
shared_manager.save_directory = directory
|
||||
var stage = load("res://stage/stage.gd").new()
|
||||
stage.pending_page = 2
|
||||
stage.owniverse.state.energy = 42
|
||||
stage.save_data()
|
||||
check(shared_manager.is_saving(), "Stage queues a background save instead of waiting for disk")
|
||||
stage.owniverse.state.energy = 43
|
||||
shared_manager.flush_saves()
|
||||
check(E.eq(shared_manager.load_data("owniverse", "qwerty").state.energy, 42), "Stage save writes an independent snapshot")
|
||||
stage.owniverse.free()
|
||||
stage.free()
|
||||
shared_manager.save_directory = original_directory
|
||||
global.save_plaintext_copy = old_plaintext
|
||||
for filename in DirAccess.get_files_at(directory):
|
||||
DirAccess.remove_absolute(directory.path_join(filename))
|
||||
DirAccess.remove_absolute(directory)
|
||||
print(("Async save: %d checks, %d failures (validation/block/I/O errors above are intentional)" % [checks, failures]))
|
||||
quit((0 if E.eq(failures, 0) else 1))
|
||||
@@ -0,0 +1 @@
|
||||
uid://dsn0ih3yfrry2
|
||||
@@ -0,0 +1,113 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
const Clock = preload("res://world/owniverse/simulation_time.gd")
|
||||
var checks: int = 0
|
||||
var failures: int = 0
|
||||
|
||||
func _initialize() -> void:
|
||||
call_deferred("run")
|
||||
|
||||
func check(condition: bool, message: String) -> void:
|
||||
checks = E.add(checks, 1)
|
||||
if (not condition):
|
||||
failures = E.add(failures, 1)
|
||||
push_error(message)
|
||||
|
||||
func fixture():
|
||||
var world = load("res://world/owniverse/owniverse.gd").new()
|
||||
var global: Node = root.get_node("Global")
|
||||
for id in global.OwniverseEntities:
|
||||
var entity = load("res://world/owniverse/owniverse_entity.gd").new(global.OwniverseEntities[id])
|
||||
world.catalog.entities[id] = entity
|
||||
world.state.amount[id] = 0
|
||||
world.state.stats.total_amount[id] = 0
|
||||
if E.ne(entity.group_as, ""):
|
||||
world.state.amount[entity.group_as] = 0
|
||||
world.state.stats.total_amount[entity.group_as] = 0
|
||||
world.catalog.entities["N"].life_product = {}
|
||||
world.catalog.entities["N"].product_per_year_type = "H"
|
||||
world.catalog.entities["N"].product_per_year_amount = 10
|
||||
world.catalog.entities["N"].auto = 0
|
||||
world.state.amount.N = 1
|
||||
return world
|
||||
|
||||
func dispose(world) -> void:
|
||||
for entity in world.catalog.entities.values():
|
||||
entity.free()
|
||||
world.free()
|
||||
|
||||
func run() -> void:
|
||||
var world = fixture()
|
||||
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")
|
||||
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)]]:
|
||||
world.state.batches.LGRB = []
|
||||
world.batches.append_batch(world.state, "LGRB", 100, interval[0], interval[1])
|
||||
var total: Variant = 0
|
||||
var last: Variant = E.neg(INF)
|
||||
for batch : Dictionary in world.state.batches.LGRB:
|
||||
total = E.add(total, batch.amount)
|
||||
check(E.gt(batch.created_from, last), "Batch windows advance monotonically")
|
||||
check(E.gt(batch.created_to, batch.created_from), "Positive window duration")
|
||||
check(E.ge(batch.amount, 0), "No negative batch amounts")
|
||||
last = batch.created_from
|
||||
check(E.eq(total, 100), "Boundary correction preserves all objects")
|
||||
check(E.le(world.state.batches.LGRB.size(), 7), "Finite number of windows")
|
||||
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)
|
||||
print(("Batch boundaries: %d checks, %d failures" % [checks, failures]))
|
||||
quit((0 if E.eq(failures, 0) else 1))
|
||||
@@ -0,0 +1 @@
|
||||
uid://dq86k8bto42xl
|
||||
@@ -0,0 +1,165 @@
|
||||
extends SceneTree
|
||||
const E = preload("res://world/owniverse/math/exact.gd")
|
||||
const Clock = preload("res://world/owniverse/simulation_time.gd")
|
||||
var checks: int = 0
|
||||
var failures: int = 0
|
||||
|
||||
func _initialize() -> void:
|
||||
call_deferred("run")
|
||||
|
||||
func check(condition: bool, message: String) -> void:
|
||||
checks = E.add(checks, 1)
|
||||
if (not condition):
|
||||
failures = E.add(failures, 1)
|
||||
push_error(message)
|
||||
|
||||
func fixture():
|
||||
var world = load("res://world/owniverse/owniverse.gd").new()
|
||||
var global: Node = root.get_node("Global")
|
||||
for id in global.OwniverseEntities:
|
||||
var entity = load("res://world/owniverse/owniverse_entity.gd").new(global.OwniverseEntities[id])
|
||||
world.catalog.entities[id] = entity
|
||||
world.state.amount[id] = 0
|
||||
world.state.stats.total_amount[id] = 0
|
||||
if E.ne(entity.group_as, ""):
|
||||
world.state.amount[entity.group_as] = 0
|
||||
world.state.stats.total_amount[entity.group_as] = 0
|
||||
world.catalog.entities["N"].life_product = {}
|
||||
world.catalog.entities["N"].product_per_year_type = "H"
|
||||
world.catalog.entities["N"].product_per_year_amount = 10
|
||||
world.catalog.entities["N"].auto = 0
|
||||
world.state.amount.N = 1
|
||||
return world
|
||||
|
||||
func dispose(world) -> void:
|
||||
for entity in world.catalog.entities.values():
|
||||
entity.free()
|
||||
world.free()
|
||||
|
||||
func seed_population(world, id: String, count: Variant, time: Variant = 1.0) -> void:
|
||||
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
|
||||
for n in world.state.ethics.get(id, {}).values(): result = E.add(result, n)
|
||||
return result
|
||||
|
||||
func invariants(world) -> void:
|
||||
var physical: Dictionary = world.ledger.physical_amounts(world.state)
|
||||
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))
|
||||
for n 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(E.eq(root.get_node("SaveManager").validate_data({"format_version": 5, "app_version": "", "ui": {"current_page": 0}, "state": world.state}), ""), "Civilization state validates")
|
||||
|
||||
func run() -> void:
|
||||
var global: Node = root.get_node("Global")
|
||||
var baseline: Dictionary = global.CivilizationRules.duplicate(true)
|
||||
var world = fixture()
|
||||
seed_population(world, "C0.2", 60000)
|
||||
world.evolution.evolve_batches(world.state, 1)
|
||||
check(E.gt(world.state.amount["C0.3"], 0), "C0.2 actually progresses")
|
||||
check(E.gt(world.state.amount["C0.1"], 0), "C0.2 actually degrades")
|
||||
check(E.eq(world.state.civilization_stats.get("wars", 0), 0), "Table disables early wars")
|
||||
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(E.eq(world.state.stats.total_amount["C0.2"], 0), "Survivors do not count as new civilizations")
|
||||
check(E.gt(world.state.civilization_stats.worship, 0), "Worship derived from surviving ethics")
|
||||
invariants(world)
|
||||
var restored = fixture()
|
||||
restored.state = E.decode(bytes_to_var(var_to_bytes(E.encode(world.state))))
|
||||
world.evolution.evolve_batches(world.state, 2100)
|
||||
restored.evolution.evolve_batches(restored.state, 2100)
|
||||
check(E.eq(world.state, restored.state), "Save resumes deterministic ethical evolution")
|
||||
invariants(world)
|
||||
dispose(restored)
|
||||
dispose(world)
|
||||
|
||||
world = fixture()
|
||||
world.state.amount.RD = 100000000
|
||||
seed_population(world, "C2.0", 60000)
|
||||
world.state.amount["C1.9"] = 10000
|
||||
world.evolution.initialize_life_batches()
|
||||
world.evolution.evolve_batches(world.state, 1)
|
||||
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)
|
||||
dispose(world)
|
||||
|
||||
world = fixture()
|
||||
world.state.amount.RD = 1
|
||||
world.state.binds.RD = {"HP": 5, "GG": 5, "AB": 5, "RP": 5}
|
||||
seed_population(world, "C1.6", 60000)
|
||||
for row : Dictionary in global.CivilizationRules["C1.6"].ethics.values(): row.degradation = "0"
|
||||
world.evolution.evolve_batches(world.state, 1)
|
||||
var after: Dictionary = world.ledger.physical_amounts(world.state)
|
||||
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")
|
||||
check(E.eq(world.state.binds.RD.get("C1.4", 0), 20), "Colonies retain target host and use two-stages-earlier level")
|
||||
var totals: Variant = 0
|
||||
for id in after:
|
||||
if E.eq(world.catalog.entities[id].group_as, "Planet"): totals = E.add(totals, after[id])
|
||||
check(E.eq(totals, 60020), "Colonization replaces planets, does not create extra worlds")
|
||||
invariants(world)
|
||||
dispose(world)
|
||||
|
||||
global.CivilizationRules = baseline.duplicate(true)
|
||||
world = fixture()
|
||||
world.state.amount.RD = E.of("1e25")
|
||||
world.state.amount.BG = E.of("1e25")
|
||||
world.state.amount.TWD = E.of("1e25")
|
||||
world.state.amount.SNS = E.of("1e25")
|
||||
world.state.amount.MGT = E.of("1e25")
|
||||
world.state.amount.BH25 = E.of("1e25")
|
||||
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)
|
||||
dispose(world)
|
||||
global.CivilizationRules = baseline
|
||||
|
||||
world = fixture()
|
||||
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))
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user