darkheart.io — a realm of hearts & data In development

ARMOURY

Every weapon in First Assault, read straight out of the original game's own weapons.tdb. These are the decoded numbers the Darkheart build shoots with — not estimates, and not re-balanced.

83 · weapons 6 · classes Source · weapons.tdb, decoded 2026-07-31

Filter & sort

Class

83 weapons

  • Loading the weapon table…

How to read these numbers

Everything above is a value out of the game's own table. Where the project is sure what a column means, it is shown with a plain-English label and the raw column name under it. Where it is not sure, the column is either labelled with that caveat or left out entirely. Nothing here is invented to fill a gap.

  • Damage is the base figure (damage). The per-body-part numbers are percentages of it, not absolute damage — an SMG's 300 head is a 3× headshot. Head damage drops with range as well, which is why three head figures are listed.
  • Fire rate is stored as seconds between shots (fireRate); the RPM shown is 60 ÷ fireRate.
  • Ranges are treated as metres. That is an assumption, not a decoded unit — it is the reading the game build uses because 15 / 25 / 120 reads naturally as metres for a shooter.
  • Recoil is six stages, not six shots. recoilAmmofire_1..6 is how many rounds each stage covers, so the MP5's 2 / 3 / 7 / 5 / 5 / 30 means the kick escalates over the first dozen rounds and then plateaus.
  • Spread has no known unit. The ordering (crouch < stand < move < sprint < jump) is data; the scale is not. The raw values are shown unconverted rather than dressed up as degrees.
  • Class names are inferred from the roster in each weaponClass group. The game's own label sits behind weaponClass_string, a key into a string table nobody has exported yet.

Left out on purpose: roughly 300 columns whose meaning is unconfirmed or purely cosmetic — the Z_* camera-motion curves, muzzle and tracer effect IDs, model offsets, attachment tuning caps, ironsight part references, and a handful of columns like spottingRad and armorRatioPerDamage that are readable as names but not yet verified in play. They exist in the export; they are not shown here because a plausible guess printed as a stat is worse than a gap.

The decode itself: structure is strongly verified (size invariants hold across all 86 tables), individual row values are a weaker claim. If a single number here looks absurd, suspect the decode before concluding the game was balanced strangely.