Repository navigation
HD2Runtime v0.30.0 — Custom Stratagems
HD2Runtime 0.30.0 — Custom Stratagems
0.30.0 adds custom stratagems: mods register new stratagems with their own name, icon, code and payload. The
Runtime handles selection, carrier allocation, presentation, the beacon, every guarded write and every restore. The
release also adds weapon variants for every support weapon, armor stats and passives, Helldiver-wide fields, the
explosion and sound catalogues, the game's own HUD icons in mod overlays, and services for UI and editor mods.
What is live-tested is listed per capability in docs/live-evidence.md (schemas/live_evidence.json). Everything
else is validated offline, and its writes need allow_unverified_effect until a live test passes. The development
log of the 0.30.0 test builds (r1 to r59) is docs/releases/0.30.0-dev.md.
Compatibility
- Mods built for 0.28.x keep working. No field that SDK 0.28.1 published as editable lost editability: 14,972
fields then, 17,101 now, across the player weapon, support weapon, backpack and vehicle catalogs. - One new acknowledgement, handled as legacy. The PLAS-45 Epoch's 30 partial-charge projectile, damage and
explosion fields now needallow_unverified_effect, because only its partial charge fires that row. A mod that
declares SDK 0.28.x or older is accepted without it, as a logged legacy operation, as in 0.28.1
(schemas/legacy_acknowledgements.json,docs/legacy-sdk-compatibility.md). The 0.28.0 entries (146 fields) are
unchanged. - Versions. The startup line reads
HD2Runtime 0.30.0 initialized (API 1). A mod that uses anything new in 0.30.0
declares"min_version": "0.30.0". Mods built against the 0.30.0-dev test builds ("0.30.0-dev") load too. - ModBuilder and other SDK tools. The SDK publishes the new catalogues and schemas:
CustomStratagemSchema.jsonandschemas/custom_stratagems.project.schema.json;ArmorStatsCapabilities.jsonandArmorPassiveCatalog.json;HudIconSprites.json,ModelBaseCapabilities.jsonand the sound and explosion catalogues;- the new field families in the existing capability files.
Custom stratagems
hd2.custom_stratagem.register({...}) (docs/custom-stratagem-api.md). A builder can write the same thing as data
(custom_stratagems.json, compiled by hd2.py custom-stratagem compile; docs/custom-stratagem-builder.md).
- Selection. A Runtime-owned panel beside the native loadout grid, in the native card look, with the game's FS
Sinclair font, a details overlay (the code in arrows, call-in time, uses, cooldown), scrolling, and several instances
of one definition. - The carrier is the stratagem. A selected custom stratagem sits in a loadout slot as its carrier, a vanilla
stratagem the player does not use that mission. Carriers are picked from dynamic pools, reserved for the lobby and
blocked in the native picker while held. Carriers are never account items, and loadouts are never restricted. - Presentation. Runtime-owned text and icons: the name, cased name, description, icon and call-in code in the
HUD, the pickup prompt, the map and the panels. Everything is restored byte for byte aboard the ship. - Payload families:
- support pods (any support weapon or backpack, with per-launcher impact conversion, for example the Gas EAT);
- expendable clones (an EAT-17 clone on an unused EAT-700 or EAT-411 type);
- weapon variants;
- orbital bombardment patterns and shell redirects;
- Pelican close air support with native or custom guns;
- Eagle rocket pods;
- sentries;
- the Shredder Silo;
- script delivery.
- Uses, cooldowns and traits per definition, and teammates' custom stratagems shown on the teammate HUD.
- Weapon variants for every support weapon.
delivery={family='weapon'}changes a support weapon's own type for
one mission: its name and icon, its round (another output of its own compatibility class), and optionally a
Runtime-owned model (hd2.resources.model).- Coverage: 34 of 35 support weapon types are hosts, and 32 register. The TX-41 Sterilizer's and the MS-11 Solo
Silo's pods are not reviewed pickup racks; the SG-88 Break-Action has no stratagem of its own. - Hosts that world loot or another pod also brings need
allow_shared.
- Coverage: 34 of 35 support weapon types are hosts, and 32 register. The TX-41 Sterilizer's and the MS-11 Solo
- Synced assets. A peer on the same Runtime loads the packages another player's mod needs (the
hd2aschannel).
Live-tested (solo host unless stated):
- the panel, selection, virtual slots and their reconstruction;
- carrier conversion and presentation (custom text and icon, calldown codes, the slot overlay);
- the bombardment pattern and shell redirect;
- the expendable clone, its availability and payload;
- weapon variants:
- the Maxigun with the Talon round and a debug model;
- the AC-8 with the EAT-700's napalm round;
- the GR-8 with the EAT-411's round;
- the MG-206 with the APW-1's round;
- the LAS-98 renamed.
Partial: the native-style panel; the carrier in the slot (two players, r43); the expendable delivery; the Pelican's
native gun; the Shredder Silo. See docs/live-evidence.md.
Several players: EXPERIMENTAL. Custom stratagems run in an experimental multiplayer scope. Every compatible Runtime
converts its own copy from the synced definition over the lobby channel (hd2rt/1). A mismatched registry fails
closed: custom stratagems are disabled lobby-wide and custom slots are locked. Live with two players:
- the Gas EAT (r3);
- four example mods with the carrier in the slot (r43).
The rest is not proven with several players. Custom projectiles are solo / host-only; see "Not in 0.30.0".
Armor and the Helldiver
- Armor passives (
docs/armor-passives.md): every passive of the game's 32 is named. The 411 armor kits are
listed, 378 of them by name. A table says which passive effects follow a swap. Effect packages load before the
write and sync to peers.hd2.player_passives.set({armor, second})overrides the local player's armor passive, solo.- Live-proven armor swaps: SCOUT, ENGINEERING KIT, SERVO-ASSISTED, MED-KIT.
- Armor stats (
docs/armor-stats.md, not live-tested):hd2.armor_stats.- Per kit: a kit's piece weights.
- Per player, solo: the local player's armor bonus and stamina factor.
- Every Helldiver on this machine: the per-weight class tables (armor value, speed, stamina) and the damage curve.
- The class tables and the curve live in game.dll pages mapped PAGE_EXECUTE_READWRITE. They are written as
reviewed executable data: exact 4-byte extents a domain registers after its own proofs, never re-protected,
the only such exception (the user's decision). Whether an anti-cheat scan reacts to that is not known.
- Type-wide Helldiver fields (
hd2.helldiver(), not live-tested): movement speeds, stamina, and each body zone's
damage multiplier, durable share, damage to main health and health. These change every Helldiver this machine
simulates, so every write needsallow_shared.
Weapons, stratagems and the world
All of these are offline-proven unless docs/live-evidence.md says otherwise:
- muzzle, optics and underbarrel attachment stat modifiers (132 fields);
- the orbital bombardment pattern (salvos, shells, delays, scatter),
stratagem.call_in_time, Eagle attack fields,
and sentry and turret fields; - PLAS-45 Epoch and RS-422 Railgun charge-level explosions;
- 32 more projectile donors (Eagle payloads, orbital shells, mortars, emplacements);
hd2.projectiles.homing, andhd2.projectiles.modify_shots(per-shot stat changes on fired rounds), both solo;- enemy spawn weights (
hd2.enemies.spawn_weight); - the explosion catalogue: 241 of 422 explosions named, editable, usable as payloads and requestable;
- vehicle tuning.
Services for mods
hd2.ui.overlayscreen overlays, with Runtime fonts (FS Sinclair) and the game's own stratagem and booster HUD
icons (hd2.resources.game_icon).- Sounds:
hd2.sounds(all 10,030 Wwise events catalogued) and playback controls. - Input:
- keys and chords;
- the mouse wheel (experimental);
hd2.input.block(experimental).
hd2.on_frame, a per-modstore,hd2.build()andensurerecovery.- Editor services:
- following choices;
- every mod's options;
- tuning custom stratagems.
- Diagnostics and performance:
- per-mod CPU time ("which mod is slow");
- a startup progress display;
- faster initial discovery;
- quieter logs: per-call traces and the read-only "Ongoing" HUD-timer probe (one line a second per call) run only
withhd2.custom_stratagem.verbose(true).
- A version label aboard the ship.
- Proton and Wine: copy-on-write data pages are accepted as read contexts (GitHub issues #3 and #6; not live-tested on
Linux). - Building examples and mods from the downloads works from inside the extracted SDK (GitHub issue #2).
Not in 0.30.0
-
Custom projectiles in multiplayer. These are solo / host-only, and other players never see them:
- Runtime-owned custom projectile rows;
- projectile replacement;
- the Pelican gun's custom rounds;
- per-shot modification.
They refuse
NOT_SOLOor stay host-only with several players. The multiplayer design (each machine converting its
own copy of a shot) moves to the next version. This was the user's decision of 2026-10-08. -
Full weapon clones beyond the EAT class.
scripts/research_clone_classes.pyreviewed every donor / carrier pair.
Only EAT pairs are eligible; the others differ in their magazine contract, AI equipment type or backpack link, or
have unreviewed members. A variant of the weapon itself is the supported customisation. -
Composition with other writers. A weapon variant refuses (
NOT_NATIVE, nothing written) when another writer
changed its records. The log names the changed words. Live: a third-party HMG buff mod.
Validation
All of it ran from the release-candidate artifacts built at 893d31f (build/release-candidate-0.30.0/).
-
Unit suite: 2,026 tests.
-
Generator freshness: every domain table, catalog, stub and SDK document checks as current, including the legacy
acknowledgement table. -
Snapshot validation: every production snapshot validator passes against the retained snapshot, as part of each
migration re-validation below. -
Examples: 118 of 118 validate against this SDK, including the snapshot baselines (475 baseline changes).
-
Packaged runtime: 208 scenarios run from the built runtime ZIP, with late module lookups disabled:
- 470 applied operations, 3 of them legacy;
- 15 declared refusals and 1 declared inactive operation;
- none refused or skipped unexpectedly;
- 0 real writes and no game process access.
-
Package contents: the runtime archive holds 232 resources, every referenced module resolves, and no module of
0.28.1 is removed. No test or scratch files are included. Telemetry is off by default and the fixture fallback is
disabled. Two development probes ship inert: they load only when their own proof mods require them. The read-only
Ongoing probe runs only with verbose logging. -
Game-update migration, re-validated against the release-candidate runtime ZIP (28/28 checks each, 0 unsafe
stale writes):- same build F5FEE03DCFDB;
- previous build D8E23968D141.
The retained migration plans are 0.26.1's. Fresh reports from the 0.30.0 tables were not generated for this release.
-
Live: as recorded per capability in
docs/live-evidence.md. The user also ran the release candidate itself in
game before release.
The asset checksums are published with the release (SHA256SUMS.txt).