Files
owniverse/simulation_rules.md
T
Kirill 5f5cc6f894 Implement gradual evolution mechanics and simulation time handling in Owniverse.GI
- Added `blastability` property to entities for vulnerability tracking.
- Enhanced planet string parsing with validation and error handling.
- Introduced `simulation_rules.md` to document evolution mechanics and rules.
- Created tests for time progression and stellar evolution rules, ensuring correct handling of fractional years and resource production.
- Implemented `simulation_time.gd` for managing accumulated time and year processing.
- Updated tests to validate legacy save compatibility and migration to new time schema.
2026-09-15 08:27:04 +03:00

7.8 KiB

Эволюция звёзд Owniverse.GI

Механики перенесены из Owniverse.U с согласованными изменениями GI: постепенные партии, детерминированные дробные остатки, уязвимость цивилизаций до C1.2 и передача выживших планет преемнику. Баланс таблицы GI сохраняется.

Порядок расчёта

  1. Накопить игровое время; обработать новые десятые доли года.
  2. Рассчитать производство существующих объектов за интервал с учётом их постепенного исчезновения; выполнить автоматическое создание звёзд и их планет.
  3. Для очередного поколения определить долю заканчивающих жизнь звёзд. Применить локальное разрушение их планет до списания партий.
  4. Снять целые объекты из партий, рассчитать основные и альтернативные выходы с накоплением дробей.
  5. Передать выжившие планеты полученным звёздам/остаткам. Если преемников несколько, распределить по их фактическим количествам; если преемника нет — освободить. Остальные связанные объекты используют существующие правила GI.
  6. Создать партии преемников. Учесть производство новорождённых за оставшуюся часть длинного шага, включая излучение короткоживущих сверхновых.
  7. Применить суммарный бласт поколения; повторять обработку поколений, пока в интервале остаются переходы.
  8. Пересчитать группы и опубликовать состояние.

Постепенные партии

Окно рождения шириной 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 * 1e22.
  • Z = max(0, 0.4 * ln(100 * free_Met / M + 0.11) + 0.88); при M = 0 металличность нулевая.
  • B = 65536 * f(M), где f(0)=1, f(M)=M^0.1 при 0<M<1e10, иначе 10.
  • density = 1.23456e-7 * sqrt(B + M) / max(1, V)^(1/6).
  • blast_factor = clamp(free_S / V, 0, 1); при нулевом объёме 1.

Система сил Unity и планетные бонусы в GI пока не перенесены; здесь используются нейтральные множители 1. Металличность для производства фиксируется до расходования ресурсов на звёзды. Среда бласта фиксируется для поколения до добавления его продуктов.

Разрушение и бласты

Локальное воздействие: 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 в выходе — событие, а не предмет. Поле blast сущности повторно не суммируется с выходом blast:N.

Границы этапа

Рассчитываются агрегаты по типам, а не отдельные звёздные системы; конкретная принадлежность каждой планеты отдельной звезде не моделируется. Распределения целых объектов детерминированы. Порядок внутри длинного шага — по поколениям, поэтому нелинейное воздействие бластов и среды не обязано совпадать с серией более коротких шагов. Развитие жизни и цивилизаций из Unity, их бонусы и силы остаются отдельными этапами переноса.

Проверки: tests/test_time.gd, tests/test_stellar_rules.gd. Сохранения игрока тестами не затрагиваются.