Skip to content

Bullet file for ChamberSim Reloaded

Bullet manufacturers can publish the data of their projectiles as one file that users add to the program with Database > Projectiles > Import bullets…. The imported bullets become the user's own records (they can be copied, edited and deleted); nothing is sent anywhere. The same records can also be contributed to the project's built-in database (see CONTRIBUTING.md): put the "bullets" array into data/projectiles/<manufacturer>.json.

File name: <manufacturer>.csrbullets (UTF-8 JSON, a plain .json file works as well). A complete example is in examples/example.csrbullets.

{
  "format": "ChamberSimReloaded bullets",
  "version": 1,
  "manufacturer": "Acme Bullets",
  "source": "https://www.acme-bullets.example/data (bullet data sheet, 15-Jan-2026)",
  "date": "2026-01-15",
  "bullets": [
    {
      "pname": "Match HPBT .308 175 gr",
      "caliber": ".308",
      "gdia": 7.82,
      "glen": 31.2,
      "gmass": 175.0,
      "gtailtype": 2,
      "gtaildiaA": 7.82,
      "gtaildiaB": 6.9,
      "gtailh": 4.6,
      "g1bc": 0.52,
      "g7bc": 0.26,
      "gpressure": 250.0
    }
  ]
}
Key Meaning
format always "ChamberSimReloaded bullets"
version 1; a program that only knows older versions refuses the file
manufacturer used for every bullet without its own mname
source where the data come from (web address, data sheet and its date); stored with every bullet (field "origin")
date date of the data (yyyy-mm-dd)
bullets the list of bullets

One bullet

All lengths in millimetres, the mass in grains, pressures in bar. Numbers are JSON numbers (a decimal point, no units in the text). Keys that are left out stay empty (0 or empty text).

Key Required Meaning
pname yes name of the bullet, with caliber and mass, e.g. Match HPBT .308 175 gr (manufacturer, name and lotid identify a bullet)
mname no manufacturer, only if it differs from the header
lotid no lot or version, to tell apart bullets with the same name
caliber recommended the bullet caliber in inch as the program's calibers use it: .224, .243, .264, .277, .284, .308, .323, .338, .366, .375, ... (the cartridge selection of a new load is filtered by it)
gdia yes bullet diameter [mm] (> 0)
glen yes overall length [mm] (> 0)
gmass yes mass [gr] (> 0)
gtailtype recommended base: 0 flat, 1 hollow base, 2 boat tail
gtaildiaA for a boat tail diameter where the taper starts [mm] (the bullet diameter, smaller for a rebated boat tail)
gtaildiaB for a boat tail base diameter [mm]
gtailh for a boat tail length of the taper (or the depth of the hollow base) [mm]
gdepthmax no maximum seating depth [mm]
gpressure recommended start pressure [bar], the gas pressure at which the bullet leaves the case and engraves: about 150 lead, 250 jacketed, 290 brass, 350 copper monolithic. 0 is not meant to be "none"; leave a typical value
gfriction no extra friction [bar] (negative for coated bullets)
g1bc, g7bc no ballistic coefficients (G1, G7)
gUBCS no UBCS code
descr no free text (construction, notes)

Other columns of the projectile table are accepted but not needed (origin, status, ...); a key the program does not know makes that bullet fail. A bullet with a problem is reported and skipped, the others are imported. gValid ("Validated") is ignored: it is set by hand by a user who checked a bullet against a real one.

Checks

The program checks every bullet (known keys, numbers where numbers belong, name present, diameter / length / mass above 0) and shows the problems with the bullet's position in the file before anything is imported. Bullets that the database already has (same manufacturer, name and lot) are left out.

Programs can write such a file with csr::projectdata::toBulletFile and read it with readBulletFile (src/core/projectdata.h); scripts/data/bulletdata/bul_to_json.py converts QuickLOAD bullet files to the record format.