Files
Soul_Game/scripts/Knowledge.cs
T
mmcghen 3e4e44c623 Run 12: knowledge system, mortality, and the North's generational soul
SPEC §5 built: three skill domains (forage/woodcraft/masonry) that pay
off and grow by practice; proximity diffusion soul-calibrated by
absorption x teaching-drive; and mortality - the piece that makes
knowledge generational. Elders die (~150-230 days), everything unshared
dies with them, a youth comes of age near knowing nothing. North soul
(absorption 1.6, teaching 0.9) vs South (1.0, 0.3); East teaches no one.

Two findings: (1) headless soaks were contaminated by orphaned child
processes writing later runs' CSVs - fixed with StopAfterDays clean
self-terminate; (2) passive diffusion barely helped - the North's real
culture is the young seeking elders on purpose, so added deliberate
teacher-seeking and youths now cradle beside the wisest elder. North
now leads knowledge at every checkpoint, but a stable town approaches
the ceiling regardless, so teaching is a recovery advantage not an
equilibrium one. The crisis-recovery experiment is the real test, noted
in FINDINGS as next.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 16:27:28 -04:00

48 lines
1.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Godot;
namespace WorldSim;
/// <summary>Domains of practical knowledge (SPEC §5 — deliberately few).</summary>
public enum KnowledgeDomain { Forage, Woodcraft, Masonry }
/// <summary>
/// What a person knows how to do (SPEC §5). Not an object in the world —
/// it lives in people, spreads by proximity, grows by practice, and dies
/// with its holder unless it was passed on. Every death is a small library
/// burning; a teaching culture is a culture of copies.
///
/// Capacity is personal and randomized: some people can hold more than
/// others, and what fills first is what they lived.
/// </summary>
public class Knowledge
{
public const int DomainCount = 3;
/// <summary>01 per domain.</summary>
public float[] Skill = new float[DomainCount];
/// <summary>Total learning this mind can hold, across all domains.</summary>
public float Capacity = 1.5f;
public float Total => Skill[0] + Skill[1] + Skill[2];
public float Headroom => Mathf.Max(0f, Capacity - Total);
public float this[KnowledgeDomain d] => Skill[(int)d];
/// <summary>Learn, limited by personal capacity.</summary>
public void Gain(KnowledgeDomain d, float amount)
{
if (amount <= 0f || Headroom <= 0f) return;
float a = Mathf.Min(amount, Headroom);
Skill[(int)d] = Mathf.Clamp(Skill[(int)d] + a, 0f, 1f);
}
/// <summary>Which domain a material teaches and benefits from.</summary>
public static KnowledgeDomain DomainFor(MaterialKind kind) => kind switch
{
MaterialKind.Food => KnowledgeDomain.Forage,
MaterialKind.Wood => KnowledgeDomain.Woodcraft,
_ => KnowledgeDomain.Masonry, // stone, clay — builder's craft
};
}