Рефактор: стадии роста и спавн — данными
Стадии стали данными: 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:
co-authored by
Claude Opus 4.8
parent
f12b0f170c
commit
5d0cbd2115
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user