Skip to content

HD2Runtime v0.31.0 — Beams, Wind-up, Missiles, Charges, Other Mods' Values and Every Game Language

Choose a tag to compare

@SkyeShade SkyeShade released this 11 Oct 00:06
· 67 commits to master since this release

HD2Runtime 0.31.0 — beams, wind-up, missiles, charges, other mods' values and every game language

0.31.0 is a feature release built from player reports and the stats editor's wish list. Each item says whether it was
seen working in game ("live", solo unless stated) or is covered by the offline tests only. Most new fields need
allow_unverified_effect: the Runtime proves where each value lives and that the game reads it, but its effect in
play is still awaiting confirmation in game. Expect hotfixes as reports come in.

Other mods' values

  • A value another mod changed refuses only itself (offline only). When a value differs from both the game's and
    every HD2Runtime write, it belongs to a mod outside HD2Runtime (a data-file mod or another program). That write is
    refused with CONFLICT ... owner: unknown mod, not HD2Runtime, and its result carries owner = 'unknown' and
    foreign = true. Every other write goes ahead. Each such value is logged once (FOREIGN VALUE) and listed by
    hd2.diagnostics.foreign_values(). A link another mod changed in a stratagem's attack chain refuses only the
    values below it. A conflict on bytes HD2Runtime does not track (an attachment delta row) is a plain CONFLICT,
    never blamed on an unknown mod.
  • Component tables another mod moved (offline only). Some mods point the game at their own copy of a component
    table, so writes to the game's table changed nothing (the LAS-12 Sai heat report). HD2Runtime now checks, read-only,
    that the game reads each component from the table it writes. A moved table refuses only that component
    (COMPONENT TABLE MOVED, owner unknown) and is logged once.
  • hd2.inspect{target, fields} (live: reads and ownership). Read-only. For up to 64 fields of a typed target it
    says who owns the live value: vanilla, runtime (and which mod), foreign (an unknown mod), changed,
    unavailable or invalid, with the value. A stats editor can show other mods' values read-only before writing
    anything. A weapon whose entity map row another mod rebuilt reads as changed, owner unknown. Detection of a real
    data-file mod's value has not been confirmed in game yet.

Text in every game language (fixes issue #8)

  • Mod windows draw Chinese, Japanese, Korean, Russian and Latin extras with the game's own fonts (live,
    2026-10-09: Simplified and Traditional Chinese, Japanese, Korean, Russian and Spanish each drew their own text).

    Characters no loaded font has still show ?. Text is now 1-512 bytes and wraps without splitting a character.
  • In any game language (offline only). The game loads only its selected language's font. Text that needs another
    language's font now loads that font package on demand. The Runtime's own panels (the custom stratagem details and
    tooltips, the alert card) use the same fonts.
  • hd2.ui.can_draw(text), hd2.ui.game_fonts() and hd2.ui.unsupported(text) (the characters no game font can ever
    draw, for translation tools). Greek cannot be drawn: no game font has it.

Status effects

  • Status effect stats (writes live; gameplay effect not yet confirmed). hd2.status_effect(id) edits a status
    definition itself: status.duration, and through :damage() the damage it deals while active (needs
    allow_unverified_effect). Every user of that status changes, so writes need allow_shared. hd2.status_effects()
    lists all 71 ids. The tick rate is not exposed.

Weapons

  • Wind-up (firing charge) on heat weapons (offline only). heat.firing_charge, heat.charge_gain_per_second,
    heat.charge_loss_per_second and heat.reset_charge_after_shot (the Sickles' 0.5 s wind-up, the Quasar's warm-up).
    Also on the AX/LAS-5 Rover gun and the A/LAS-98 Laser Sentry. heat.warmup now reads as the derived value, and
    "cooldown after overheat" says which fields to edit (the LAS-99 Quasar report).
  • Wind-up controls everywhere (offline only). windup.wind_up_seconds and windup.wind_down_seconds on the
    EXO-45 Patriot minigun and the TD-110 Maelstrom tank gun. windup.wind_down_seconds is described as what it is: a
    spin-down switch.
  • Beam pulse fields (offline only). beam.fire_mode, beam.fire_rate, beam.pulse_beams and beam.pulse_seconds
    on every beam weapon: a Trident-like LAS-5 Scythe is one transaction on its own record. The LAS-13 Trident's pulse
    length is labelled as what limits its fire rate (a pulse starts only after the previous one ended). The Rover gun's
    beam.fire_rate has the reviewed 1-6000 range.
  • Beam swaps (offline only). The LAS-5 Scythe, LAS-7 Dagger, LAS-13 Trident, LAS-98 Laser Cannon, 40-K Meltagun and
    A/LAS-98 Laser Sentry fire any catalogued beam through weapon:beam_source() and hd2.fields.attack.beam
    (allow_unverified_reference and allow_unverified_effect). A projectile weapon cannot fire a beam this way.
  • Beam conversion (experimental; solo, or a lobby where every member runs the same HD2Runtime with the identical
    conversion).
    hd2.weapon(name):beam_conversion() makes a projectile weapon fire the LAS-13 Trident's pulsed beam,
    with its own rate of fire (1-900 rpm), beams per pulse, pulse length and, optionally, its own damage, armor
    penetration and range. It needs allow_component_swap and allow_unverified_effect, and writes only while no
    instance of that weapon exists.
    • Add layout (42 weapons): the weapon keeps its projectile component and gains a beam. Allowed with other
      players only when every member posts the identical conversion; otherwise it is refused or restored.
    • Swap layout (24 weapons, such as the AR-23 Liberator): solo only, and restart the game after using it.
    • Refused (25): shotguns and launchers fed by rounds, the autocannon, the Maxigun and GL-28, and charge weapons.
      Melee, arc, spray and beam weapons are out of scope.
    • The swap layout's mechanism was seen working live, solo, in development builds (Liberator, Talon and Reprimand at
      their own rates). Neither layout has been played through this API yet, and nothing of it has been tested with
      other players. See docs/beam-conversion.md.
  • Missiles (offline only). missile.* and function_missile.*: the flight of the missile the StA-X3 W.A.S.P.,
    FAF-14 Spear, MLS-4X Commando, P-33 and P-92 spawn per shot (lifetime, speeds, acceleration, turn rates, guidance
    delay). No missile swap is offered.
  • Team-reload ammunition (offline only). The GR-8, RL-77, FAF-14 and StA-X3 can carry spares of their own
    (magazine.spare_magazines, starting_magazines, magazines_from_supply, 0-31), and the AC-8 rounds of its own
    (rounds.spare_rounds, starting_rounds, rounds_from_supply, 0-511; multiples of 5 recommended). The wielder
    reloads from them alone before the backpack is used. The five team-reload backpacks get deposit.capacity,
    start_amount and refill_amount.
  • Fire-mode selector on single-mode weapons (offline only). The 30 single-mode weapons with a free input (the
    R/40-K Hot-Shot among them) can get two or three modes, with weapon_function = 'fire_mode' bound in the same
    transaction. The selector reaches three modes (the docs said four).
  • CQC-20 Breaching Hammer blast (offline only). support_weapon(...):attack('ability'):explosion().

Vehicles and backpacks

  • Mounted spread (offline only). weapon.horizontal_spread / weapon.vertical_spread on the 17 projectile mounts
    (Exosuit guns, FRV guns, Bastion, Maelstrom and more).
  • EXO-55 Breakthrough shield arm (offline only). hd2.vehicle('EXO-55 Breakthrough Exosuit'):shield(): the arm's
    health, and its plate's health and armor.
  • Hover Pack height explained. There is no height value: the pack climbs only while its lift
    (hover.vertical_acceleration_low_speed) is above gravity (9.82; vanilla 9.8 only holds height), for
    hover.duration seconds of air time. The descriptions and names now say so. Nothing in the write path changed.

Stratagems

  • Charges before cooldown (offline only). stratagem.rearm_pool = 'eagle_rearm' puts a non-Eagle stratagem in the
    Eagle Rearm pool, the game's only charge mechanism: its uses become charges refilled together by Eagle Rearm, and
    it shares the Eagle cooldown. An unlimited pool member is refused.
  • Orbital targeting (offline only). The Orbital Railcannon Strike's orbital.search_radius, movement_speed,
    duration and fire_delay; the Orbital Laser's orbital.retarget_interval. The Railcannon's shot count and
    target priority are not editable.

Thanks

Bans, author of
True Lasgun Beam Overhaul, whose mod was the research lead
for the laser work in this release: the wind-up, the Trident's pulsed beam, beam swaps and the add layout of beam
conversion. HD2Runtime proves each member itself from the game's data; none of his code is used.

Compatibility

  • Mods built for 0.30.3 work unchanged. New 0.31.0 features need min_version 0.31.0.
  • The team-reload weapons' own magazine rows and the AC-8's own rounds rows now need allow_unverified_effect. Mods
    that declare an older SDK keep writing them without it, as logged legacy operations
    (docs/legacy-sdk-compatibility.md). Their values are bounded by the game's network fields (0-31 magazines, 0-511
    rounds).
  • fire_mode.modes accepts at most 3 modes (was 4: the fourth slot is never selected).
  • The startup line reads HD2Runtime 0.31.0 initialized (API 1).
  • Multiplayer: only beam conversion has multiplayer rules (above), and they are implemented and tested offline only.
    Nothing else new in 0.31.0 was tested with several players.