| """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_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()) |
| |
|
|