# Растения как экосистема Дизайн системы растений: рост зависит от среды, среда описана факторами, реакция растения на факторы задаётся **генами**, а размножение передаёт гены потомкам с мутацией — появляется естественный отбор. Документ — единый ориентир для фаз A–D; детали каждой фазы уточняются её отдельным планом. ## Модель роста Скорость роста растения в данный момент: ``` скорость = база × пригодность(свет) × пригодность(температура) × пригодность(плодородность) ``` Каждая «пригодность» — число в [0..1] из кривой отклика (движковый `ResponseCurve`, модуль `MrGameEng.AI`) с **оптимумом** и **шириной толерантности**, которые берутся из генов растения. Растение вне своих оптимумов растёт медленно или стоит; в своих — быстро. Так все факторы среды сводятся к одному механизму, а различие видов/особей — целиком в генах. Фактор «возраст/стадия» остаётся как сейчас (`PlantGrowthStage` в дефах): пригодности умножают прирост `AgeDays`, стадии переключают спрайт/размер по накопленному возрасту. ## Факторы среды - **Свет** — амбиент день/ночь (`MrGameEng.Lighting.DayNight`), сэмплируемый в точке (`SampleAt(world)`); глобальный в фазе A, локальный (с тенями) в фазе D. - **Температура** — непрерывная, из климата (`MrGameEng.Core.Climate`): сезонный синус по дню года + суточные колебания (холоднее ночью). - **Плодородность** — пока константа типа террейна (`TerrainDef.Fertility`); позже возможна по-клеточная почва с истощением/восстановлением. ## Гены (диплоидный геном, гибридная экспрессия) Каждое растение несёт **геном**: по паре аллелей на ген. Экспрессия гибридная: - **Числовые гены** (оптимум света, толерантность к свету, оптимум температуры, толерантность, потребность в плодородности, макс. размер, базовая скорость, продолжительность жизни, дальность расселения, плодовитость, темп мутаций, способность к самоопылению) — фенотип = **смешение** (среднее двух аллелей). Реализм отбора: промежуточные значения, плавный дрейф. - **Дискретные гены** (например, цвет/морфа, наличие признака) — **доминант/рецессив**: рецессивный фенотип виден только в гомозиготе (aa). Наследование (мейоз): каждый родитель отдаёт по одному случайному аллелю на ген; потомок получает по одному от каждого. Затем — мутация (с вероятностью из гена темпа мутаций сдвигаем числовой аллель/переключаем дискретный). Всё детерминировано сидом мира. Стартовая популяция: геномы генерируются из сида (вид задаёт базовый геном и разброс аллелей в дефе; особи отклоняются). ## Размножение (полуреалистичное) - **Перекрёстное опыление (приоритет):** зрелое растение ищет зрелого соседа того же вида в радиусе (ген дальности; запрос через spatial-hash движка). Есть партнёр → семя с геномом от двух родителей (Мендель + мутация). - **Самоопыление (запас):** нет партнёра и ген «способность к самоопылению» позволяет → семя из одного родителя (само-скрещивание аллелей + мутация). - **Расселение:** семя падает в клетку в радиусе расселения; прорастает, если клетка подходит (суша, не занято сверх лимита, пригодность не нулевая). - **Лимит плотности:** не больше N растений на клетку/площадь — иначе взрыв численности. - **Старение/смерть:** возраст превышает ген жизни → смерть; или длительный стресс (пригодность около нуля) → гибель. Смерть освобождает место — баланс с размножением и основа отбора. ## Производительность и сейв - Представление — **по сущности на растение** (видно в рендере и ECS-инспекторе, индивидуальные гены). Защита от взрыва: лимит плотности, смерть, разумные радиусы, проверки размножения по таймеру/сезону (не каждый кадр на каждое растение), spatial-hash для соседей. - **Персист:** геномы, позиции, возраст и стадия растений сохраняются в `WorldSave` (мир больше не воспроизводится только из сида — эволюция переживает загрузку). - **Детерминизм:** мутации/расселение/опыление — на сидированном `Random`, как в остальной симуляции. ## Фазы реализации - **A — климат и день/ночь (движок).** `Climate` (температура/сезон поверх `Calendar`), `DayNight` (амбиент, `Renderer2D.AmbientLight` на World-слоях, сэмплируемый `SampleAt`), затемнение мира ночью, HUD: сезон/температура/время. Фундамент для влияния среды на рост. - **B — гены и рост по пригодностям (игра).** Компонент `PlantGenome`, расчёт пригодностей (свет из `DayNight.SampleAt`, температура из `Climate`, плодородность из террейна), замена плоского `GrowthRate`. Геном виден/правится в инспекторе. - **C — размножение и смерть (игра).** Перекрёстное/самоопыление, расселение, лимит плотности, старение/стресс-смерть, персист популяции в сейв. - **D — полноценное 2D-освещение (движок).** Точечные источники + тени (окклюзия от препятствий); `DayNight.SampleAt` начинает возвращать локальную освещённость, и затенённые растения растут хуже.