- 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.
7.8 KiB
Эволюция звёзд Owniverse.GI
Механики перенесены из Owniverse.U с согласованными изменениями GI: постепенные партии, детерминированные дробные остатки, уязвимость цивилизаций до C1.2 и передача выживших планет преемнику. Баланс таблицы GI сохраняется.
Порядок расчёта
- Накопить игровое время; обработать новые десятые доли года.
- Рассчитать производство существующих объектов за интервал с учётом их постепенного исчезновения; выполнить автоматическое создание звёзд и их планет.
- Для очередного поколения определить долю заканчивающих жизнь звёзд. Применить локальное разрушение их планет до списания партий.
- Снять целые объекты из партий, рассчитать основные и альтернативные выходы с накоплением дробей.
- Передать выжившие планеты полученным звёздам/остаткам. Если преемников несколько, распределить по их фактическим количествам; если преемника нет — освободить. Остальные связанные объекты используют существующие правила GI.
- Создать партии преемников. Учесть производство новорождённых за оставшуюся часть длинного шага, включая излучение короткоживущих сверхновых.
- Применить суммарный бласт поколения; повторять обработку поколений, пока в интервале остаются переходы.
- Пересчитать группы и опубликовать состояние.
Постепенные партии
Окно рождения шириной 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. Сохранения игрока тестами не затрагиваются.