Run 10: organic recovery achieved - minerals are not a commons

Recovery blocker was material, not motivational. Two fixes: (1) harvest
floors and commons debris apply only to living, regenerating resources -
stone does not regrow, so "leave half" merely stranded the world supply
and kept the homeless homeless forever; minerals now quarry to depletion
for every soul equally. (2) Matter conservation: idle variety-gathering
touches only renewables, and packs may only shed what the land replaces
- lossy make-room had milled 900+ stone to dust during demand flapping.

Verified over 260 headless days: year-1 winter still wrecks the naive
town, it rebuilds in 20 days, famine survivors found the first granaries
from hunger memory, and year-2 winter passes with zero ruins on stored
reserves. The town has a history now: naive youth, catastrophe,
learning, resilient maturity.

Remaining tuning in FINDINGS.md: granary sprawl, post-famine nourishment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-21 15:23:18 -04:00
parent 676a9f3f31
commit e661a3f739
7 changed files with 7011 additions and 7030 deletions
+5 -2
View File
@@ -25,7 +25,7 @@ public static class StatsLogger
private const string NpcHeader =
"day,npc,name,soul,town,dominant,gather_ticks,build_ticks,trade_ticks,rest_ticks,social_ticks," +
"nourish,health,debris";
"nourish,health,debris,demand,rough_nights,hunger_mem";
private const string GiftHeader =
"day,giver,giver_soul,receiver,receiver_soul,material,amount";
@@ -167,7 +167,10 @@ public static class StatsLogger
.Append(t[(int)NpcState.Socializing]).Append(',')
.Append(npc.Nourishment.ToString("0.000", ci)).Append(',')
.Append(npc.Health.ToString("0.0", ci)).Append(',')
.Append(npc.Imprint.Total.ToString("0.0000", ci)).Append('\n');
.Append(npc.Imprint.Total.ToString("0.0000", ci)).Append(',')
.Append(npc.CurrentDemand(gm)).Append(',')
.Append(npc.RoughNights).Append(',')
.Append(npc.HungerMemory ? 1 : 0).Append('\n');
System.Array.Clear(npc.StateTicksToday, 0, npc.StateTicksToday.Length);
}
File.AppendAllText(_npcPath, npcRows.ToString());