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:
+23
-10
@@ -82,21 +82,29 @@ public class World
|
||||
{
|
||||
if (node.Kind == MaterialKind.Water) return requested; // unlimited at source
|
||||
|
||||
float floorFraction = npc.Soul.Sustainability * 0.5f; // how much of the node they leave standing
|
||||
// Reciprocity is with the living land: floors and the commons line
|
||||
// apply only to what regrows. Minerals quarry to depletion, for
|
||||
// every soul equally, with no mark on anyone.
|
||||
bool living = node.RegenPerDay > 0f;
|
||||
|
||||
float floorFraction = living ? npc.Soul.Sustainability * 0.5f : 0f;
|
||||
float takeable = Math.Max(0f, node.Amount - node.MaxAmount * floorFraction);
|
||||
float taken = Math.Min(requested, takeable);
|
||||
node.Amount -= taken;
|
||||
HarvestedToday += taken;
|
||||
|
||||
// The moral line sits below any respectful harvest floor (nature souls
|
||||
// stop at 45%) — ordinary sustainable taking never grazes it, while
|
||||
// strip-harvesting (selfish floor ~10%) lives deep inside it.
|
||||
float commons = node.MaxAmount * 0.4f;
|
||||
if (node.Amount < commons)
|
||||
if (living)
|
||||
{
|
||||
float takenBelow = Math.Min(taken, commons - node.Amount);
|
||||
npc.Imprint.OthersRegard =
|
||||
Math.Clamp(npc.Imprint.OthersRegard + takenBelow * 0.004f, 0f, 1f);
|
||||
// The moral line sits below any respectful harvest floor (nature
|
||||
// souls stop at 45%) — ordinary sustainable taking never grazes
|
||||
// it, while strip-harvesting (selfish ~10%) lives deep inside it.
|
||||
float commons = node.MaxAmount * 0.4f;
|
||||
if (node.Amount < commons)
|
||||
{
|
||||
float takenBelow = Math.Min(taken, commons - node.Amount);
|
||||
npc.Imprint.OthersRegard =
|
||||
Math.Clamp(npc.Imprint.OthersRegard + takenBelow * 0.004f, 0f, 1f);
|
||||
}
|
||||
}
|
||||
|
||||
return taken;
|
||||
@@ -146,7 +154,12 @@ public class World
|
||||
foreach (var node in Nodes)
|
||||
{
|
||||
if (node.Kind != kind || node.IsDepleted) continue;
|
||||
if (node.Kind != MaterialKind.Water && node.Amount <= node.MaxAmount * minFraction)
|
||||
// The harvest floor is an ethic of regrowth — it applies only to
|
||||
// living, regenerating things. Leaving half a berry bush lets it
|
||||
// live; leaving half a stone deposit protects nobody, and once
|
||||
// stranded it homelessly, we learned that the hard way (run 9).
|
||||
if (node.Kind != MaterialKind.Water && node.RegenPerDay > 0f &&
|
||||
node.Amount <= node.MaxAmount * minFraction)
|
||||
continue;
|
||||
float d = position.DistanceSquaredTo(node.Cell);
|
||||
if (d < bestDist) { best = node; bestDist = d; }
|
||||
|
||||
Reference in New Issue
Block a user