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; }
}