Рефактор: стадии роста и спавн — данными

Стадии стали данными: AnimalStageDef + AnimalDef.Stages (возраст входа = EnterAt x якорь maturity/lifespan, масштаб, набор текстур baby/adult, флаг adult для размножения); пусто -> встроенный дефолт Baby/Juvenile/Adult/Senior. AnimalFactory.StageAt/RegionFor/Scale/IsAdult работают по данным стадий; системы роста/решения/гона используют флаг adult вместо индекса. Спавн стал данными: AnimalDef.SpawnPer1000Cells — WorldScene рассыпает ВСЕ виды по плотности, не только захардкоженного оленя. Устраняет блокеры расширяемости #5 и #7.

Сборка чистая, --check-content (9 типов дефов).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Leonid Pershin
2026-06-14 04:57:44 +03:00
co-authored by Claude Opus 4.8
parent f12b0f170c
commit 5d0cbd2115
7 changed files with 132 additions and 81 deletions
+8 -6
View File
@@ -132,7 +132,7 @@ public sealed class AnimalNeedsSystem(GameClock clock, float secondsPerDay, Need
/// под этим хедифом считает <see cref="AnimalNeedsSystem"/> (нужда Mating с <c>risesUnder=Rut</c>) —
/// сезонность и влечение разнесены: эта система отвечает только за состояние.
/// </summary>
public sealed class AnimalRutSystem(Climate climate, HediffDef rut)
public sealed class AnimalRutSystem(AnimalSet animals, Climate climate, HediffDef rut)
: QuerySystem<AnimalGrowth, AnimalOrganism, Health>
{
protected override void OnUpdate()
@@ -146,7 +146,8 @@ public sealed class AnimalRutSystem(Climate climate, HediffDef rut)
for (var i = 0; i < g.Length; i++)
{
var inRut =
g[i].Stage >= AnimalFactory.StageAdult && season == o[i].Traits.BreedingSeason;
AnimalFactory.IsAdult(animals[o[i].Species], g[i].Stage)
&& season == o[i].Traits.BreedingSeason;
if (inRut)
{
h[i].State.Add(rut);
@@ -255,7 +256,7 @@ public sealed class AnimalDecisionSystem : BaseSystem
brain.DecideIn = Interval + _rng.NextSingle() * Interval; // джиттер — расфазировать скан
var pos = t[i].Position;
var adult = gr[i].Stage >= AnimalFactory.StageAdult;
var adult = AnimalFactory.IsAdult(_animalSet[o[i].Species], gr[i].Stage);
var name =
_brain.Select(new AnimalContext(n[i].Values))?.Name ?? AnimalActions.Wander;
@@ -391,7 +392,7 @@ public sealed class AnimalDecisionSystem : BaseSystem
var tt = transforms.Span;
for (var i = 0; i < tt.Length; i++)
{
if (oo[i].IsMale == selfMale || gg[i].Stage < AnimalFactory.StageAdult)
if (oo[i].IsMale == selfMale || !AnimalFactory.IsAdult(_animalSet[oo[i].Species], gg[i].Stage))
{
continue; // тот же пол / не взрослый (self отсеивается по полу)
}
@@ -719,10 +720,12 @@ public sealed class AnimalGrowthSystem(
ref var grow = ref g[i];
grow.AgeDays += days;
ref readonly var org = ref o[i];
var sp = animals[org.Species];
var stage = AnimalFactory.StageAt(
grow.AgeDays,
org.Traits.MaturityAge,
org.Traits.Lifespan
org.Traits.Lifespan,
sp.Stages
);
if (stage == grow.Stage)
{
@@ -730,7 +733,6 @@ public sealed class AnimalGrowthSystem(
}
grow.Stage = stage;
var sp = animals[org.Species];
var region = AnimalFactory.RegionFor(sp, stage, org.IsMale);
ref var sprite = ref s[i];
sprite.Region = region;