Files
pf1e-simulator/pyproject.toml
T
ctan a21e234b41 feat(runner): Monte Carlo runner, closed-form metrics and balance CLI
Adds the S6 layer on top of the deterministic combat engine:
- metrics.py: closed-form binomial statistics (win rate, standard error,
  3-sigma confidence band) with clamped degenerate proportions.
- runner.py: EncounterSpec/Side definitions, per-run SeededRng streams,
  global duplicate-id disambiguation, attrition averages per combatant.
- cli.py: pf1e-sim entry point producing a French balance report with
  win rates, 3-sigma bands, draws, rounds, and attrition.
- Movement fix: greedy straight-line heuristic could oscillate at walls;
  _step_toward now follows the true shortest path via an unbounded
  Dijkstra cost field from the target (Grid.reachable budget=None).
- Regression tests: melee unit routes around a wall and engages; grid
  unbounded-budget coverage.
2026-08-17 22:49:50 +02:00

64 lines
2.2 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[project]
name = "pf1e-simulator"
version = "0.1.0"
requires-python = ">=3.12"
dependencies = [
"pydantic>=2",
"pyyaml",
]
[project.scripts]
pf1e-sim = "pf1e_simulator.cli:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/pf1e_simulator"]
[dependency-groups]
dev = [
"pytest",
"ruff",
"basedpyright",
]
# ── Ruff ──────────────────────────────────────────────────────────────────────
[tool.ruff]
target-version = "py312"
line-length = 100
[tool.ruff.lint]
select = ["ALL"]
ignore = [
# D: docstring rules — we don't write docstrings everywhere in early scaffolding
"D",
# COM812: trailing-comma-in-missing — conflicts with ruff formatter
"COM812",
# ISC001: single-line-implicit-string-concatenation — conflicts with formatter
"ISC001",
# CPY001: missing copyright notice — we don't use copyright headers
"CPY001",
]
# RUF001: sigma in the CLI balance report is intentional, not a confusable
allowed-confusables = ["σ"]
[tool.ruff.lint.per-file-ignores]
# Tests: assert is expected, magic numbers are fine, annotations are noisy,
# parametrized golden tests legitimately take many arguments
"tests/**" = ["S101", "PLR2004", "ANN", "PLR0913", "PLR0917"]
# rng.py: `random.Random` is used for reproducible Monte Carlo streams, not cryptography
"src/pf1e_simulator/rng.py" = ["S311"]
# cli.py: stdout printing is the point of a CLI
"src/pf1e_simulator/cli.py" = ["T201"]
# ── Basedpyright ──────────────────────────────────────────────────────────────
[tool.basedpyright]
typeCheckingMode = "strict"
include = ["src", "tests"]
# ── Pytest ────────────────────────────────────────────────────────────────────
[tool.pytest.ini_options]
testpaths = ["tests"]