"""Interactive CLI for vertical slice play.""" from __future__ import annotations import argparse import json from pathlib import Path from game.sim.day_cycle import Pace, Phase from game.sim.session import GameSession from game.io.save import save_slot, load_slot def cmd_day(args): s = GameSession(rng_seed=args.seed, pace=Pace[args.pace.upper()] if args.pace != "Normal" else Pace.NORMAL) # Pace enum values are Relaxed/Normal/Brisk pace_map = {"relaxed": Pace.RELAXED, "normal": Pace.NORMAL, "brisk": Pace.BRISK} s = GameSession(rng_seed=args.seed, pace=pace_map[args.pace.lower()]) rep = s.run_until_night() summary = s.night_summary() print(json.dumps({"report": rep.__dict__, "summary": summary}, ensure_ascii=False, indent=2, default=str)) return 0 def cmd_multiday(args): s = GameSession(rng_seed=args.seed, pace=Pace.BRISK) out = [] for _ in range(args.days): if s.day.phase == Phase.PREP: try: s.restock("tulip_pink", 2) except Exception: pass rep = s.run_until_night() out.append({"day": s.day.day_index, "wallet": rep.wallet_end, "sales": rep.sales, "summary": s.night_summary()}) s.sleep() print(json.dumps(out, ensure_ascii=False, indent=2)) return 0 def cmd_save(args): s = GameSession(rng_seed=args.seed) path = Path(args.path) save_slot(path, s.snapshot()) print("saved", path) return 0 def main(argv=None): p = argparse.ArgumentParser(prog="town-shop") sub = p.add_subparsers(dest="cmd", required=True) d = sub.add_parser("day") d.add_argument("--seed", type=int, default=7) d.add_argument("--pace", default="normal", choices=["relaxed", "normal", "brisk"]) d.set_defaults(func=cmd_day) m = sub.add_parser("multiday") m.add_argument("--days", type=int, default=3) m.add_argument("--seed", type=int, default=7) m.set_defaults(func=cmd_multiday) s = sub.add_parser("save") s.add_argument("--path", default="saves/slot_0.json") s.add_argument("--seed", type=int, default=0) s.set_defaults(func=cmd_save) args = p.parse_args(argv) return args.func(args) if __name__ == "__main__": raise SystemExit(main()) # reseal-product R5