///|
fn main {
  let sim = @moonsim.Sim::new(seed=777UL)
  ignore(
    sim.install_timer(@moonsim.timer_plan("game:tick", interval=1, times=10)),
  )
  let mut hp = 20
  for turn in 0..<10 {
    let damage = sim.next_range(1, 5)
    hp -= damage
    if hp < 0 {
      hp = 0
    }
    sim.sample("damage", damage)
    sim.set_gauge("hp", hp)
    ignore(
      sim.schedule_at(
        turn,
        "turn:" + turn.to_string() + ":damage:" + damage.to_string(),
      ),
    )
  }
  let checkpoint = sim.snapshot(name="after_planning")
  let aggressive = checkpoint.fork("aggressive")
  let defensive = checkpoint.fork("defensive")
  aggressive.inc_counter("strategy_aggressive")
  defensive.inc_counter("strategy_defensive")
  ignore(aggressive.schedule_after(1, "strategy:attack"))
  ignore(defensive.schedule_after(1, "strategy:block"))
  ignore(aggressive.run_until_idle())
  ignore(defensive.run_until_idle())
  let comparison = @moonsim.compare_forks(
    "aggressive", aggressive, "defensive", defensive,
  )

  println("game loop simulation")
  println("hp=" + sim.metrics().gauge("hp").to_string())
  println("damage_samples=" + sim.metrics().sample_count("damage").to_string())
  println(comparison.summary())
}