namespace ProjectM.Simulation
{
///
/// Central home for gameplay-balance constants that were previously buried as private consts
/// inside individual systems, so designers have one searchable place to tune them. Burst-safe (compile-time
/// consts only — they inline into the consuming systems with no runtime cost or managed reference).
///
/// Systems reference these via Tuning.* (wired in the 2026-06-04 polish pass, Stage C). When adding a
/// new tunable value, prefer adding it here over a local private const UNLESS it already has an obvious,
/// well-named public home (see the cross-references below) — duplicating a literal creates two sources of truth.
///
///
/// Values that already live in a clear, public, semantically-named home (NOT duplicated here):
///
/// - / — cycle phase durations.
/// - — base→expedition world-space offset.
/// - Per-ability/character stats — authored in ScriptableObjects, baked to the AbilityDatabase blob (M3).
///
///
///
public static class Tuning
{
// ---- Ability damage upgrade (AbilityUpgradeSystem) ----
/// Distinct sentinel SourceId so the upgrade StatModifier is found + grown in place
/// (replace-by-SourceId keeps the bounded modifier buffer from growing a row per upgrade).
public const uint AbilityUpgradeSourceId = 0x00A0E711u;
/// Damage bonus added per upgrade tier (PercentAdd op): +25% per tier.
public const float AbilityUpgradeTierStep = 0.25f;
/// Aether cost charged to the shared ledger per upgrade tier.
public const int AbilityUpgradeCostAmount = 20;
// ---- Resource harvest (ResourceHarvestSystem) ----
/// Effective projectile radius used by the swept-segment node-hit test (added to the node's
/// HitRadius). Tunnel-safe because the segment is reconstructed from Projectile.LastStep.
public const float HarvestProjectileRadius = 0.2f;
// ---- Enemy knockback (ProjectileDamageSystem stamps on hit; EnemyAISystem applies + suppresses seek/strike) ----
/// Knockback speed (world units/sec) a Husk recoils at when shot; 0 disables knockback globally.
public const float KnockbackSpeed = 8f;
/// Server ticks the knockback lasts (~60 ticks/sec).
public const int KnockbackDurationTicks = 8;
// ---- Husk attack telegraph (EnemyAISystem 2-phase strike; client cue in CombatFeedbackSystem) ----
/// Wind-up ticks before a Husk strike lands (~0.3s @ 60 ticks/sec). 0/1 = near-instant (legacy behaviour).
public const int AttackWindupTicks = 18;
// ---- Production / automation (M7: Harvester/Conveyor/Fabricator) ----
/// Max production cycles a single machine awards in one process (bounds within-session
/// catch-up after any skipped ticks; restore re-seats the baseline so this never reflects wall-clock).
public const int MaxProductionCatchup = 600;
}
}