Battle results per engine
Four engines reproduced the same recorded baseline across 100 output fields, with zero differences.
A Python tool for testing combat rules, comparing team compositions and making better balance decisions.
Four engines reproduced the same recorded baseline across 100 output fields, with zero differences.
Rule-derived tests and supporting validation checked mechanics, outputs and consistency.
Deliberately broken rules were caught by the tests intended to protect them.
Recorded verification: September 8, 2026. Eleven generic test modules; deterministic combat. These results cover the implemented baseline.
The practical result is a tool I can use to compare a proposed change with a known starting point, follow an unexpected outcome down to the battle, and keep the design decision connected to evidence.
The simulator includes reference Python, optimized Python, opcode and Numba engines. Keeping a readable reference alongside the faster paths makes changes easier to check.
For team summaries, each worker folds battle results into an aggregate as it runs. The parent combines those partial summaries, avoiding the need to retain or export every battle row.
I made output selection part of the requirements: broad screening for coverage, team aggregates for comparison, and detailed records when a specific interaction needs explanation.
I wanted battles to resolve sooner while preserving the reasons to use tanks, damage dealers and supports. The stat budget provided a system-wide tuning point: lowering the cost of ATK gives a module more attack for the same allocation.
I requested the weight-18 comparison after the weight-20 test because the shorter mirror fight was closer to the pace I wanted. The controlled study compared the same nine-module pool before expanding the active roster.
| ATK weight | 5v5 battles reaching the cap | Median ticks, uncapped 5v5 battles | 1v1 mirror turns per side |
|---|---|---|---|
| 30 — starting point | 48.3% | 324 | 10.1 |
| 20 — comparison | 14.3% | 214 | 6.4 |
| 18 — selected | 9.2% | 190 | 5.8 |
The selected weight moved the system toward the intended pace. I then evaluated the returning modules in that changed environment, including a focused adjustment to Fast Taunt’s damage.
See the Fast Taunt reworkThe comparison above is the nine-module experiment. The current eleven-module baseline adopted weight 18 and was verified on September 8; its results are a separate population.
Agreement between engines is useful, but the design needs an independent reference. I required expected results to come from the combat rules and worked through the decisions needed to make those rules testable.
Hand-derived scenarios check individual rules and interactions. The current baseline has 357 conformance tests, supported by 156 additional validation checks.
Mutation testing deliberately changes a rule to check whether a test detects it. The recorded run caught all 154 seeded defects.
Cross-engine comparisons then check that the faster implementations retain the reference behavior. The September verification compared 353,760 battle rows per engine, including 1v1–5v5 packets and control cases.
The four engines agreed across every one of the 100 recorded battle fields. Screening also matched diagnostics across 213,444 legal 5v5 battles and 1,000 seeded team selections. Combat itself remained deterministic.
Mutation coverage reached 345 of the 357 conformance tests. The other 12 check structural, document or boundary conditions outside the seeded combat mutations. The full baseline is an ongoing development stage; Crit and later combat layers remain future work.
A shared comparison process made it possible to move between a system-wide pacing change and a specific module adjustment. I could keep the intended experience in view while checking the consequences at several team sizes.
Multiple optimized engines and parallel summaries needed to preserve behavior. A reference implementation, independently derived checks and repeatable comparisons gave that work a concrete acceptance standard.
A high win rate or a battle hitting its cap needs context. I judged those results against the roles and compositions involved, then chose targeted changes that preserved useful differences between teams.
The deterministic foundation is verified. The next balance stage must address 558 identified 4v4/5v5 stalled matchups and evaluate the proposed Crit layer against the same comparisons.
The public repository contains the current Python package, setup instructions and regression fixtures. Its 161 included checks passed, with zero mismatches across 1,000 seeded engine comparisons.
Developed with AI coding assistance under my direction.