Skip to main content

kirby-combat

Pure-Python combat engine for the HERO System 6th Edition, designed as the authoritative back-end for Kirby — the HERO System VTT in the Kirby product line.

Zero runtime dependencies (stdlib only). Strict TDD. RAW-aligned against the official 6E2 / 6E1 books, with per-rule citations on every behavioral commit.

Status

Working, and tested at 898 tests. It is a library: no server, no I/O, no API layer — kirby-api depends on this package, never the other way round.

What it resolves

  • Attacks — strike, killing, ranged, haymaker, autofire, rapid fire, multiple attack, sweep, area of effect, pulling a punch
  • Grappling — grab, throw, entangle
  • Tactics — brace, set, dive for cover, held actions, triggers
  • Reactions — abort, block, dodge
  • Movement — running, leaping, flight, swimming, teleportation, tunnelling, and knockback as its own resolver
  • Mental combat — the OMCV/DMCV pipeline: Mental Blast, Mind Control, Telepathy, Mental Illusion, Mental Entangle
  • The scene — surfaces with their own PD/ED, walls, hazards, cover, line of sight, elevation, falling
  • Vehicles — passengers, ramming, driving rolls
  • Mass combat — a mob as one Unit with a shared BODY pool and morale
  • Breakables — scenery with BODY, and structural collapse that cascades
  • Presence attacks — intimidation as a mechanic, on an effects ladder
  • GM tooling — three override tiers, attacks on behalf of, spawn/despawn

The session layer adds a SPD-chart timeline, an event log, per-action rewind, and to_dict / from_dict round-trip for a whole encounter.

Usage

Combatants are plain objects — nothing here needs a character file. This snippet runs as-is:

from kirby_combat.models import AttackInput, AttackPower, Combatant, DiceValues
from kirby_combat.resolution.to_hit import resolve_to_hit
from kirby_combat.template import RAW_SUPERHEROIC

def fighter(id_, name, **over):
    """A combatant with workable defaults; override what matters."""
    base = dict(ocv=8, dcv=8, omcv=3, dmcv=3, spd=4, dex=18, ego=10, str_=15,
                con=20, pre=15, rec=8, pd=8, ed=8, rpd=0, red=0, md=0,
                power_defense=0, flash_defense=0, max_stun=40, max_body=12,
                max_end=40, current_stun=40, current_body=12, current_end=40)
    return Combatant(id=id_, name=name, **{**base, **over})

blast = AttackPower(
    xmlid="ENERGYBLAST", name="Energy Blast",
    damage_dice=10, half_die=False, plus_one=False,
    damage_type="normal", defense_type="ed",
    range_m=200, uses_str=False, str_min=0,
    armor_piercing=0, penetrating=0, increased_stun_mult=0,
)

result = resolve_to_hit(AttackInput(
    attacker=fighter("hero", "Hero", ocv=9),
    target=fighter("villain", "Villain", dcv=7),
    power=blast,
    distance_m=20.0,
    aim=None,
    dice=DiceValues(to_hit=[2, 3, 3], damage=[3] * 10,
                    hit_location=[], stun_multiplier=[], knockback=[]),
), RAW_SUPERHEROIC)
print(result.hit, result.margin)   # True 1  — a hit, by 1

CombatSession sits on top when you want a timeline, an event log and rewind rather than one-shot resolution — see examples/rooftop_brawl.py.

Examples

Four runnable demos, none of which need anything installed beyond the package:

examples/rooftop_brawl.py a narrated fight — SPD phases, abort to Dodge, knockback off a roof, falling damage, Post-Segment 12 recovery, and a rewind
examples/mental_duel.py the OMCV/DMCV pipeline — mental to-hit, Mental Blast against Mental Defense, Mind Control measured against EGO
examples/bring_the_house_down.py scenery as combatants — destroy a support column and watch the collapse cascade and drop everyone standing above it
examples/hold_the_line.py Presence attacks on the effects ladder, and twenty thugs resolved as one Unit with morale
.venv/bin/python examples/rooftop_brawl.py

RAW alignment

Every game-mechanical commit cites a specific page or section in 6E1 / 6E2 (or in Dorman's MIT-licensed dmdorman/hero6e-foundryvtt reference port, where Dorman's behavior is the source of truth). The Codex retrieval system backs this — values are verified against the corpus rather than memory.

Tests

.venv/bin/pytest tests/ -q
.venv/bin/pytest tests/ --cov=kirby_combat --cov-report=term-missing

License

PolyForm Noncommercial License 1.0.0 — the same terms as kirby-cost and kirby-sheet. Source-available and free for personal, non-commercial use; not OSI-approved open source.

Relicensed from MIT at 0.4.0. Versions 0.3.x were published under MIT and those grants stand — MIT cannot be withdrawn from a release already made. This applies from 0.4.0 onward.

The combat-mechanics derivation is independent work: no proprietary HERO Designer source enters this repository. Not affiliated with or endorsed by DOJ, Inc. d/b/a Hero Games; HERO System™ is their trademark.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

kirby_combat-0.4.0.tar.gz (219.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

kirby_combat-0.4.0-py3-none-any.whl (185.4 kB view details)

Uploaded Python 3

File details

Details for the file kirby_combat-0.4.0.tar.gz.

File metadata

  • Download URL: kirby_combat-0.4.0.tar.gz
  • Upload date:
  • Size: 219.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for kirby_combat-0.4.0.tar.gz
Algorithm Hash digest
SHA256 7bd7dfa0c7c86d7d17854a9369ec607fd20bb6fed90b6e49f60e3d223b8f693d
MD5 c629f061352507541454b574b0316be9
BLAKE2b-256 5ab07ca58c42dff337a6afacb9aeac25fa647d126cf6a3b3fcfd1cdfd34907e1

See more details on using hashes here.

File details

Details for the file kirby_combat-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: kirby_combat-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 185.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for kirby_combat-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 abaaa62ecb72d4f70142a59ae78bf77b60c3cacf61bc1bd5744cd9dfe6bf5c06
MD5 609c0f81e9e6a70570d310c7b44acace
BLAKE2b-256 28bca1e1c0205169787ac982259487455683a18db540eaaa5b921569b3340277

See more details on using hashes here.

Release history Release notifications | RSS feed

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.1

2 files

0.8.0

2 files

0.7.3

2 files

0.7.2

2 files

0.7.1

2 files

0.7.0

1 file

0.6.0

2 files

0.5.0

2 files

This release

0.4.0 This release

2 files

0.3.28

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page