namespace HSchool.Content; /// Stable family ids for immunity grouping and realism labels. public static class DiseaseFamilies { public const string Respiratory = "respiratory"; public const string Gastrointestinal = "gastrointestinal"; public const string Ent = "ent"; } /// One severity band on a curve. public sealed class DiseaseStage { /// Inclusive lower bound of severity for this stage. public float MinSeverity { get; init; } public float SeverityPerDay { get; init; } public float ProgressPerDay { get; init; } /// Multiplies lesson skill gain while this stage is active (after incubation). public float LessonLearningFactor { get; init; } = 1f; /// Per-day chance the person stays off campus while in this stage (after incubation). public float StayHomeChance { get; init; } /// Multiplies Warmth decay. 1 = unchanged. public float WarmthDecayFactor { get; init; } = 1f; /// /// Multiplies Chat / talk leisure weight and talk-circle start pull. 1 = unchanged; lower when /// symptoms make conversation harder. /// public float TalkWeightFactor { get; init; } = 1f; /// Locale key for the person-card effect line. Empty — card shows severity only. public string Effect { get; init; } = ""; } /// /// A named disease: stages, weather vectors, lesson/attendance effects, temporary immunity, /// and optional person-to-person contagion (node and/or class). /// public sealed class DiseaseDef : Def { /// id. Required on concrete defs. public string Family { get; init; } = ""; /// Game days after onset before stage effects (lesson / stay-home) apply. public float IncubationDays { get; init; } public IReadOnlyList Stages { get; init; } = []; /// Base daily onset chance before weather vectors and . public float BaseChancePerDay { get; init; } /// Street °C at or below this adds . Null — no cold vector. public float? ColdBelowC { get; init; } public float ColdChancePerDay { get; init; } public float RainChancePerDay { get; init; } public float SnowChancePerDay { get; init; } /// Days of immunity to this def after recovery. public float ImmunityDays { get; init; } /// /// Daily chance to infect each other person sharing the same map node. 0 — no node contagion. /// public float NodeContagionChancePerDay { get; init; } /// /// Daily chance to infect each classmate (same ClassId) while both are on campus. /// 0 — no class contagion. /// public float ClassContagionChancePerDay { get; init; } /// When true, the carrier can infect during incubation before stage effects apply. public bool ContagiousDuringIncubation { get; init; } /// /// After incubation, severity at or above this sends the person toward the nurse's office. /// public float NurseSeekSeverity { get; init; } = 0.35f; /// /// Extra severity change per day while a nurse tends (usually negative). 0 — care only /// advances progress. /// public float TendSeverityPerDay { get; init; } /// Extra progress per day while a nurse tends (speeds recovery / immunity). public float TendProgressPerDay { get; init; } }