Melta turret


Adds a short-ranged turret that burns liquid fuel into a pressurized stream of heat. It needs no ammunition. Balance and progression are still being tuned (see the changelog).

Content
41 minutes ago
2.1
72
Combat

Changelog

Version: 0.6.5
Date: 2026-11-09
  Performance:
    - The turret registry used to be rebuilt by scanning every surface of the map every ten
      seconds. On a large save with no meltas built, that scan alone was 60 ms of a tick, which
      reads as a hitch every ten seconds. The full scan now happens once, when the mod loads,
      and afterwards the map is repaired one 512x512-tile block per second, so the same work
      costs well under a millisecond on any single tick
    - A chunk is checked the moment it is generated, so newly explored ground is covered
      without waiting for its block to come round
  Bugfixes:
    - A melta placed by construction robots on a space platform, or duplicated by another mod,
      was never registered and stayed silent until the next rescan. Both are picked up now

Version: 0.6.4
Date: 2026-10-27
  Major Features:
    - The melta is a continuous weapon now. Damage is applied every tick instead of once per
      pulse, so whatever the beam visibly crosses is burnt for as long as it is crossing: a
      turret sweeping across a swarm no longer cuts through bodies that take nothing
    - The lance follows the BARREL and the turret does not stop firing while there are enemies
      in range. A target switch sweeps the beam across everything between the two bearings, and
      the 2.5 s spin-up no longer restarts on every kill
    - Pierce falloff is off by default: every body on the beam takes the full hit, up to 30 at
      once. (Set C.pierce_falloff below 1 in constants.lua to bring the ladder back)
    - New spin-up gauge: five lights on the hull deck fill as the turret heats and go out as it
      cools, so how hot it is can be read without staring at the beam
    - The lance is drawn from a soft sprite core rather than engine line primitives, so it now
      renders consistently with smoke and weather mods (it used to draw in front of them), and
      its far end frays and dissolves at maximum range instead of ending on a hard edge
    - The hull and the cannon sit half a tile lower, on the tile they actually occupy. The pipe
      stubs stay on the pipe grid, so nothing already built disconnects
    - Any fuel that exists in the pack is accepted, including fluids that another mod defines
      after this one loads (cubonium gas was being dropped); the tooltip lists the real fuel
      roster with its damage multipliers
  Bugfixes:
    - Fire damage research now scales the beam on the INFINITE tier, not once. Ten extra levels
      of refined-flammables bought 0.2 damage before instead of 2.0; damage is now read from the
      engine's own accumulators. The melta also appears in the flamethrower damage technologies,
      so the research screen shows what improves it
    - A turret with an empty buffer no longer keeps firing on the fluid dust left behind
  Balancing:
    - NOT FULLY TESTED. This is the first release of the reworked weapon and the numbers were set
      by measurement in a single game (dps against dummies and biters, armour, asteroids), not by
      a balance pass. Damage, fuel costs, research scaling and progression placement are expected
      to move in a later version. If something feels off -- too strong, too weak, too expensive
      to feed -- that is useful and expected feedback, not a finished design

Version: 0.6.3
Date: 2026-10-27
  Changes:
    - The turret keeps firing while there are enemies in range. Two things used to break the
      stream: the off-bore gate (the beam was only drawn when the head was within 2 degrees of
      the target, so a turret could never sweep) and the moment of re-acquisition after a kill
      (the engine has no target for a tick or three, and the script went down its "not
      shooting" branch: beam out, pulse clock reset, charge decaying). Measured over 140 ticks
      with the target forced across a nine-body fan: 123 silent ticks on 0.6.2, 0 on this
      version, and the spin-up climbs straight through five forced 80 degree switches
    - The lance is drawn along the BARREL now, not along the line to the target, and damages
      whatever it crosses. A target switch therefore sweeps the beam across everything between
      the old bearing and the new one, which is what a melta is for
    - The off-bore charge-up glow is gone with the gate it existed for (no wind-up: the beam
      fires from the first tick), and with it C.aim_tolerance and C.windup_ticks
    - New C.target_grace_ticks (8): how long the lance stays lit after the last live target
      while the turret looks for the next body itself. Idle turrets still do no surface work
  Bugfixes:
    - A dry turret no longer keeps firing. The fuel gate was get_fluid_count > 0 and fluids are
      doubles, so a drained buffer's dust (measured 0.0005 units) was enough: 8580 damage dealt
      over 240 ticks on an empty tank, and the lance drawn the whole time. The gate is now
      C.fuel_empty = 0.1 units, and the same threshold applies to the fuel-colour choice
    - Same measurement after the fix: 0 damage over 240 ticks with 0.0005 units in the buffer

Version: 0.6.2
Date: 2026-10-27
  Bugfixes:
    - The beam now damages what it visibly touches. Damage was tested against the corridor on
      the tick a pulse happened (8 ticks apart), while the beam is redrawn along a moving
      target every tick, so a turret dragging its beam across a swarm cut through bodies that
      took nothing whenever no pulse landed on them. Damage is now applied EVERY tick at
      pulse damage / pulse interval, which is the same damage per second on a locked target
      and the right damage per second of exposure for everything the beam crosses
    - Damage rollup is now visible per tick rather than per pulse in the health bar of
      anything being burnt (measured series in docs/verification/sweep-damage.md)
  Changes:
    - Pierce falloff is off by default (C.pierce_falloff = 1): every body on the beam axis
      takes the whole hit, up to C.pierce_max bodies. With per-tick damage a "who is in
      front" ranking decides damage at the moment the corridor is refreshed rather than at
      the moment of a pulse, so the ladder stopped meaning anything; setting the constant
      below 1 brings it back
    - The pulse clock is now purely the thump: muzzle flash, cut marks, impact pop, the fuel
      surcharge and the fuel sample. Nothing about the look or the fuel bill changed
    - Corridor refreshes only when the beam moved (or every C.hit_refresh_ticks), so a
      locked-on turret still costs one spatial query per pulse window; a sweeping one costs
      one per tick, which is exactly when it matters
    - Cost: measured with 20 turrets firing, 9.09 -> 10.21 ms per update (+12 %). Per body
      radius is cached at refresh (bounding_box allocates), and the fire and physical halves
      of a hit land on alternating ticks at double the amount -- every resistance is linear
      in the amount, so a two-tick window is identical for half the engine calls
    - Tooltip: with no falloff the description no longer claims a ladder it does not apply
  Balance:
    - Single-target dps is unchanged (a body on the axis for a full interval takes exactly
      one pulse's damage). Total damage against a LINE goes up, because there is no falloff:
      the old ladder paid 82 % to the second body; it now pays 100 %

Version: 0.6.1
Date: 2026-10-27
  Bugfixes:
    - Fuels that another mod defines LATER than this one now work. The turret's fuel list is
      built in data.lua and can only keep fluids that already exist; on her install
      lilys-melta's data.lua loads at 37.9 s and lilys-cubeine's (which defines cubonium-gas)
      at 41.2 s, so cubonium-gas was silently dropped. data-updates now tops the list up and
      the tooltip is rebuilt at the same stage, so what the turret accepts and what the
      tooltip promises cannot disagree. Verified: cubonium-gas is accepted, listed, shown in
      the tooltip, and burnt (196.4 -> 131.2 units over 200 firing ticks)
    - Fire damage research on the INFINITE tier now counts every level. refined-flammables-7
      is max_level = "infinite" (+0.2 per level) and the old hand sum added its modifier once,
      so ten extra levels bought 0.2 instead of 2.0 -- the turret looked researched and
      fought like it was not. Damage and firing speed are now read from the engine's own
      accumulators (get_ammo_damage_modifier / get_turret_attack_modifier /
      get_gun_speed_modifier), which include infinite levels. Measured on a dummy: +200 % on
      either damage modifier takes the beam from 1398 to 7426 dps (5.3x, i.e. (1+2)^1.5), and
      +100 % firing speed from 1398 to 2654 (1.9x)
    - The bonus cache now expires after a second instead of waiting for a research event:
      another mod's script can change a force modifier and no event this mod can hear is
      raised for it
  Graphics:
    - No art changed in this version
  Balance:
    - Research now visibly applies, which is a large late-game buff by construction (that is
      the fix, not a retune): at all finite tiers plus 10 levels of the infinite one the
      damage factor is 9.9x instead of 4.7x
    - Numbers retuned by the author on top of 0.6.0: damage_hot 56 -> 128 (4x cold),
      pierce_falloff 0.82 -> 0.95, pierce_max 12 -> 30, hit_half_width 0.45 -> 0.9,
      pipe_reach 1.12 -> 1.0, fluid_consumption 2.5 -> 2.0, extra_fluid_per_pulse_hot 3.8 ->
      3.0, fuel multipliers (petroleum-gas 0.85 -> 1.25, melta-fuel 1.60 -> 3.00, napalm
      1.35 -> 1.50) and a new cubonium-gas entry at 2.00

Version: 0.6.0
Date: 2026-10-27
  Graphics:
    - The turret stands on its own tile now. The hull AND the cannon are both drawn half a
      tile further south, so the emplacement stops reading as balanced on the tile boundary
      behind it. Measured on the before/after screenshots: 0.5 tiles (32 px at 64 px/tile)
      for both sprites, which is what makes the gun sit on the deck instead of floating
      above it
    - The pipe stubs do not move: they are drawn by the engine on the pipe grid, not as
      part of the art. The north stub therefore loses half a tile of overlap with the hull
      (visible in docs/verification/visual-rework); the south stub, which used to show bare
      ground between itself and the front rim, now tucks under it properly. No
      pipe_connections changed, so nothing already built disconnects
    - The beam's cutting core is a soft sprite instead of two rendering.draw_line quads.
      draw_line has no render_layer field at all, so with a smog/weather mod installed the
      core drew in FRONT of the smoke while the rest of the lance sat behind it -- the
      whole lance now shares one render layer and one tint. It also loses the hard edge
      that made it read as a graph line at every zoom
    - The lance no longer stops dead at maximum range: a ragged plume is carried past the
      tip (1.2 tiles cold, 2.6 white hot) and the last two sheath tongues run past the end,
      so the heat thins out instead of being cut
    - A barrel pointing away from the camera now fires a lance that starts past the gun
      rather than burning over it (the drawn start moves 0.55 tiles down the barrel). The
      lance stays in front of the world -- deliberately: an earlier attempt drew it behind
      the turret on a lower render layer, which put it behind every biter nest and wall it
      crossed
    - Spin-up indicator: five lights on the hull deck fill one at a time as the turret
      winds up (cold to white hot over 2.5 s) and go out as it cools, so "how hot is this
      one" is readable instead of guessed from beam width
    - The emitter's bleed-off glow follows the mouth now. It used to stay where the last
      shot was fired, so a turret that turned left a glowing disc hanging next to the gun
  Bugfixes:
    - The lance is coloured by the fuel that is BURNING, not by whatever fuel is present.
      A fluid turret holds two fluid boxes (the piped one and the internal buffer) and both
      are reported by get_fluid_count, so "highest damage_modifier present" could colour the
      beam with fluid that was only waiting in the pipe. The turret now samples its own
      consumption once per pulse (docs/verification/fluid-buffer.md)
  Balance:
    - No damage, rate, range or fuel numbers changed. The lance follows the burning fluid's
      damage_modifier, which is the same rule the engine uses for its own stream

Version: 0.5.2
Date: 2026-10-27
  Graphics:
    - Pipe connections are the same hardware the Cubeine combustion center uses: the
      space-age electromagnetic-plant pipe stubs, in their normal grey, drawn only on a
      side that actually has a pipe connected (draw_only_when_connected), and drawn
      behind the hull so what shows is the pipe running into the housing
    - An unused side is now bare hull. The old build put a cap on all four sides, and
      that cap sat at the connection point while the hull starts further out, so every
      unused port showed a plate floating half a tile off the deck
    - The mod's own rendered port and cap sprites are no longer used; on a base-only
      install (no Space Age) the turret falls back to vanilla's pipe covers, the same
      thing the flamethrower turret uses

Version: 0.5.1
Date: 2026-10-26
  Graphics:
    - The turret is re-rendered toward the vanilla palette. The body is mid-value warm
      gunmetal instead of dark grey, the fluid hardware (compressor block, turbine
      housing, pressurised fuel tank, copper feed lines running into the receiver) is
      brass and copper, and the only saturated thing left is the orange heat in the
      vents and the gauge lights
    - The muzzle is a WH40K-style melta projector now: a fat cylinder with a ring of six
      radial vents and a hollow, warm bore, so the pressurised stream has somewhere
      visible to come out of. The flat pale plate that used to cap the barrel front is
      gone -- the muzzle face is a dark bore with a hot-metal lip, and the vents carry
      the glow
    - The tone curve is refit for the new model (quantile-matched to vanilla
      gun-turret-shooting-1.png). The assembled head measures mean 79 against vanilla
      gun turret's 75, p50 63 vs 60, p75 116 vs 105, p90 177 vs 160, 14 % of pixels
      under luma 16 (vanilla 11 %), warm +27 against +27 and no pure-white pixel at
      all; the base layer measures mean 61 beside the vanilla flamethrower's 56-60 and
      the laser's 63. The old curve was fitted to the dark model and sent the new
      render to p90 234, which is what read as a white plate at the muzzle
    - The warm accent is its own material, so it survives the downsample without
      washing the barrel: the vent bores, the muzzle lip, the two pressure gauges and
      the sight lens are lit by a small lamp material, while the glow collar between
      the heat rings stays dim. One vent dot is about 2 art pixels at sheet scale,
      which is why the first pass (an emissive of 0.9) disappeared entirely in game
    - The icon and thumbnail are re-rendered from the same model through a fixed rig. A
      lighting softbox used to be photographed as a flat white triangle in the icon's
      top-left (the icon camera sees 4.2 tiles where the sheets see 4.0), which also
      shrank the turret to 54 % of the icon cell; the plates are hidden from camera rays
      now, the icon fills 65 % of the cell (vanilla gun turret 64 %) and its values sit
      at p10/p50/p90 11/72/190 against vanilla's 19/80/175
    - check_sheets.py checks the thing a misordered or duplicated direction actually
      breaks: the head centroid has to walk a closed loop with no jump over 4 px (this
      art: 2.08 px worst step, 1.53 px closure). The old test compared the centroid's
      bearing against 64 bins, which this model can never pass -- the receiver is
      heavier than the barrel, so the bearing trails the muzzle and flips at the poles
      (60-63 distinct bins on both the old and the new sheets)
    - The crafting-menu icon reads as a turret now instead of a rounded pod. It was a
      shape-budget problem, not a camera one: the 3.1-tile emplacement left the 1.5-tile
      cannon 15 % of the silhouette, so at the 32 px size the menu draws it collapsed into
      a warm oval. The icon render now scales the gun about its own bore (sheets untouched)
      and lights the muzzle white-hot: protrusion 15.5 % -> 23.1 %, reach 1.60 -> 2.03,
      barrel-versus-body contrast 21 -> 50 luma, against vanilla turret icons at 20-24 %
      and 1.7-2.5. The technology icon and the portal thumbnail keep the machine's real
      proportions (docs/verification/icon-read-0.5.1.md)
  Balance:
    - The cold barrel now lands where it has to: 32 damage per pulse (240 dps) instead of
      14 (105 dps), i.e. level with a gun turret on uranium rounds, even though the melta
      only reaches 16 tiles and drinks fluid. Fully spun up it is 56 per pulse (420 dps,
      1.75x cold) -- measured against an unarmoured dummy in game.
    - The beam damage now scales with research. Before this it was invisible to every
      technology in the game: the turret stayed at 240/420 dps while a gun turret went to
      1633. It takes the same two dips a gun turret takes -- the fire damage line
      (refined flammables) and the turret firing speed line -- and holds cold parity with the
      gun turret at every tier (1.00x-1.15x measured), 1.75x its own cold dps when white hot
      (1.76x-2.02x the gun turret) (docs/verification/balance-verification.md).
    - The researched firing speed is delivered in full. The pulse clock used to round every
      interval up to a whole tick, which silently threw part of the bonus away (+80 % rate
      fires every 4.44 ticks: the old clock pulsed every 5, i.e. 12 pulses/s instead of
      13.5). It now carries the fraction of a tick forward, so the average interval is the
      researched one; that alone was worth 15 % of the melta's dps at tier 4.
    - Flat armour no longer eats the beam. The engine subtracts a target's `decrease`
      before applying its percentage resistance; the pulse is now handed that much extra so
      the subtraction cancels. Percentage resistance is untouched (a 100 % fire-resistant
      target still ignores the fire share), and a NEGATIVE flat resistance (which means
      "takes extra damage") is left alone. A behemoth's 12 flat armour used to absorb a
      whole cold pulse (2.75 damage where an unarmoured body took 17.6); it now takes 90 %
      of the unarmoured figure, i.e. only its 10 % resistance. Big/huge asteroids carry
      positive 2000/3000 physical flat armour, so their slice is compensated too -- it is
      0.2 % of a big rock's health, and the asteroid channel is unchanged.
    - The tooltip says both things: it ignores flat armour, and it scales with flamethrower
      damage and turret firing speed research.
  Changes:
    - The turret is listed with the other turrets instead of at the end of the combat
      tab. Its item moved out of the defensive-structure subgroup, where the walls, gate
      and radar live, into the turret subgroup, on an order key taken from the
      flamethrower turret's own and extended by one segment: in the 2.1.23 crafting menu,
      searching "turret" reads gun, laser, flamethrower, melta, artillery, rocket, tesla,
      railgun
    - Every string the player reads is in the base game's register now instead of the
      mod's own: item, entity, technology, fluid and mod descriptions in sentence case
      with US spelling, using the "needs a fluid supply instead of ammunition" phrasing
      the flamethrower turret uses. The fuel list names the fluids it takes instead of
      drawing three unnamed drops, and the two lines about armour and research render at
      all -- a parameterised localised string drops everything appended after its last
      parameter, so they belong to the tooltip's own description
  Fixed:
    - The pipe ports are sized and placed like a pipe fitting rather than like a collar:
      1.03 to 1.08 tiles across, against a pipe's 1.00 to 1.11 and vanilla's own 0.80
      pipe cover, where they were 0.59 to 0.70; and the inboard end sits 0.35 to 0.52
      tiles from the centre where it was 0.91 to 1.09. The port is scaled about its
      mouth, so the far end stays on the pipe on all four sides and no floor shows
      between the two (seam 0.00 on every side). Moving the connection point itself a
      tile inwards cannot work: at pipe_reach 0.75 all four sides still link, at 0.50
      two of them stop linking and no fluid arrives, so the art carries the move and the
      reach stays 1.12
Version: 0.5.0
Date: 2026-10-25
  Graphics:
    - The firing beam is no longer a hairline. rendering.draw_line's `width` is in PIXELS
      (32 per tile) and the old layer table was written as if it were tiles, so the whole
      four-line stack was at most 1.90 px = 0.06 tiles wide -- thinner than the barrel it
      came out of. Measured from a 64 px/tile screenshot, the lance is now 1.03 tiles wide
      at half maximum (16.5x wider), puts 2.8x the light into the scene, and the peak is
      no brighter (so it gained body, not glare)
    - The beam is built in layers now: two sharp core lines, three additive glow sprites
      (wide soft haze -> tight bright gas), six boiling sheath tongues that re-roll a few
      times a second, a muzzle flare plus a directional blast cone, an impact flare that
      follows the body it is cutting, and a tip flare where the lance runs out of reach
    - The glow reads on dark ground: the sprite layers blend additively, and their
      textures are generated white with the shape in the alpha channel
      (graphics/beam/generate.py), so one set of five textures is tinted with whatever
      fuel is burning (oil orange, gas blue, melta green, napalm red)
    - The beam fades out over 10 ticks instead of snapping off, and it keeps fading when
      the turret or its target dies mid-beam: a dead turret's lance is handed to a fade
      list, drawn from its last geometry and then freed, so no beam can be left stuck in
      the air
    - Cheaper than the old beam despite owning 17 render objects per turret instead of 15:
      the draw path allocates nothing per tick (measured -15% script time with six turrets
      firing continuously)
  Changes:
    - Reach is 16 tiles (was 12), and quality extends it through the engine's own
      `range_multiplier` rather than a script multiplier: 16 / 17.6 / 19.2 / 20.8 / 24 at
      normal / uncommon / rare / epic / legendary, and that is both the acquisition and the
      firing range. The drawn lance mirrors the multiplier and stops at `C.range_max` = 24,
      so a modded quality with a silly number cannot hand the turret a 48-tile beam.
      Measured headless on 2.1.23: a normal melta engages at 15 tiles and not 19, a
      legendary at 23 and not 27, and with the quality mod disabled the whole ladder
      collapses back to 16
    - The head turns 5x faster, 0.03 turns/tick (10.8 deg/tick) instead of 0.006 (2.16,
      inherited from the rocket turret): half a turn takes 16-17 ticks (0.27 s) instead of
      83 (1.4 s). The old speed could not track a behemoth biter crossing at 0.3 tiles/tick
      inside its own range; worst-case aim error while tracking that crossing is now 10.7
      deg. Still twice the vanilla gun turret's 0.015, so it reads as a heavy mount and not
      a snap turret
    - The beam can break asteroids now. Every space-age asteroid resists 100 % of the
      damage types it does not list, and fire is listed for none, so 85 % of every pulse was
      zero; big and huge rocks then subtracted 2000/3000 flat armour from what was left.
      Measured before: 11 pulses per small rock, 31 per medium, and a big rock took 0.14 hp
      from 236 pulses -- effectively immune. Each pulse now adds one extra `explosion` hit
      (the type the vanilla asteroid ladder is balanced on: 50/30/10/99 %) sized
      `C.asteroid_damage_multiplier` = 1.6 and gated on `entity.type == "asteroid"`:
      small 100 hp = 2-3 pulses (0.75 s), medium 400 = 5-7 (1.4 s), big 2000 = 17-21
      (3.4 s), while a huge rock still outlives a full minute of fire and stays railgun
      work. Pawns are untouched (821 -> 823 dps on a plain dummy, behemoth TTK ~4.2 s
      either way); set the dial to 0 to switch the rock channel off
  Fixed:
    - Pipes read as connected on all four sides. The turret was setting only
      `fluid_box.pipe_covers`, which 2.1 draws where NOTHING is connected
      (`always_draw_covers` defaults to true when `pipe_picture` is absent), so every side
      got vanilla's cap collar about 0.3 tiles short of the pipe, and no port art at all
      where the pipe arrived. It now carries its own port model -- mount pad, ribbed neck,
      bolted clamp collar, socket mouth -- as `pipe_picture` where a pipe is connected and a
      blanked-off plate as `pipe_covers` where none is, with a per-side offset for the 51
      deg camera (south +0.18, west -0.22 tiles). Port reach overlaps the pipe's near edge
      by 0.35-0.58 tiles on every side with no bare floor between them; straight, L, T,
      cross and dead-end runs all meet cleanly, and an unconnected port shows the bolted
      plate instead of a floating collar
    - The impact flare no longer lingers on a dead body: it is re-positioned to its target
      every tick and hidden the instant that body dies
    - The core lines are mixed toward white; a fuel-coloured line over an additive glow
      measured darker than its surroundings and drew a dark seam down the middle of the
      beam
    - Beams no longer outlive their turret's death: mining or destroying a firing melta
      used to leave the render objects destroyed mid-fade, now the lance is retired and
      freed through a fenced path
    - The inspect panel now prints the damage the turret actually deals. The beam is
      script damage, not the engine's, so the panel had no damage line at all; the text
      is generated from constants.lua (14 per pulse cold, 56 at full charge, 85 % fire +
      15 % physical, 7.5 pulses/s, 82 % pierce falloff up to 12 bodies, every fuel
      multiplier, the asteroid channel) and is translated in locale/en and locale/ru,
      so the tooltip cannot drift from the numbers control.lua applies. Verified by
      measuring a pulse against an unarmoured dummy: 56.00 hp at full charge on light
      oil, and 89.63 = 56 x 1.60 on enriched melta fuel
  Sound:
    - The firing cue is a layered sound now instead of one flat noise bed: a sharp
      pressurised release on the first sample, a sizzling roar as the stream burns, and
      a turbopump hum spinning up underneath that gives the shot its weight. Three
      variations of the ignition, so a turret that stops and starts firing does not
      sound identical every time
    - It is heavier than the gun and laser turrets on purpose, and longer than a
      gunshot: the melta holds a beam, so the cue is the engine's begin/middle/end
      cycle (the same model the vanilla flamethrower turret uses). Measured effective
      loudness -18.5 dBFS for the shot and -18.4 for the sustained loop, against -19.2
      and -19.7 for the flamethrower turret, -25.9 for the gun turret and -26.2 for
      the laser turret
    - Every cue is synthesised by sound/_generator/melta_sounds.py and checked after
      encoding: 44.1 kHz mono Ogg Vorbis, RMS-normalised (peak-normalising is why the
      old loop measured -26 dBFS RMS and sounded quiet), a transient on sample 0 with
      no leading silence, and no cue decoding above -3 dBFS so two overlapping shots
      cannot clip
    - melta-start.ogg is replaced by melta-fire-1/2/3.ogg, listed as `variations` on
      begin_sound; nothing references the old file and no unreferenced sound is left
      in the mod
Version: 0.4.0
Date: 2026-10-25
  Graphics:
    - The turret is modelled and rendered in Blender now instead of drawn: a rusted
      industrial emplacement plus a wide-bore melta cannon (chunky breech, ribbed copper
      heat coils, vented shroud, welded seams, rivets, dents, chipped paint, rust streaks)
      rendered for all 64 directions off one fixed top-down key light
    - The cannon is ~2.4x longer and ~2x fatter than the old drawn head, so it reads as a
      real gun next to the vanilla gun and laser turrets
    - The muzzle's front face is 1.512 tiles from the pivot (it was 0.66): the beam starts
      at the barrel mouth, and gun_barrel_length / the beam anchors follow the art
    - The hull art is the mod's own render, so the turret looks the same with or without
      the Space Age rocket turret installed
    - selection_box widened to +-1.6 tiles and drawing_box_vertical_extension added so the
      big cannon is fully clickable and does not clip behind neighbours; collision_box is
      unchanged at +-1.2 tiles, so existing blueprints place exactly as before
    - The turret, the item that places it, the technology and thumbnail.png use icons
      rendered from that same model now, so no vanilla turret icon art is borrowed
    - The fluid box became a symmetric four-port set at 1.12 tiles carrying vanilla
      pipe covers, and the hull is de-squashed in Y so the north and south sockets
      meet it: a pipe ends in a visible socket on all four sides
  Fixed:
    - The beam no longer appears while the turret is still turning: it waits until the
      head is within one rotation step (2.16 deg) of the target, and the muzzle plays a
      short charge-up glow instead. dps is unchanged against a target the barrel is
      already on (measured: 673.0 dps before and after)
    - The beam now starts exactly at the barrel mouth in every direction, instead of at a
      fixed point in front of the pivot: the rendered head is a pitched-camera image, so
      the mouth sits 1.51 tiles from the pivot pointing north but only 0.39 pointing south
      (a raised muzzle is drawn further up the screen)
    - Damage is fire with a physical slice instead of a damage type of the mod's own:
      each pulse is 85 % fire + 15 % physical out of the same total, and the `thermal`
      damage type is gone from the mod entirely
    - The firing sound is ~15 dB louder in the mix: the loop was re-mastered
      (-26.4 -> -15.2 dBFS RMS) and now sits at -18.3 dBFS against the vanilla
      flamethrower turret's -19.2, with aggregation capped at 2 voices so several
      turrets cannot clip
  Notes:
    - Art pipeline lives in graphics/_blender/ (melta_render.py, assemble.py,
      check_sheets.py, muzzle_marker.py, check_beam_anchor.py, README.md); re-render with
      one command, no hand-drawn pixels
    - muzzle_marker.py projects the model's own muzzle points through Blender's camera and
      check_beam_anchor.py tests the result against every shipped frame, so the beam anchor
      can be re-derived after any re-render instead of guessed
    - The 15 % physical slice is absorbed by the biters' flat physical armour: dps is
      unchanged against unarmoured targets but ~8-15 % lower against medium, big and
      behemoth biters. C.physical_share is the dial if that trade is not wanted
    - Pipe joins: east, south and west meet the hull; north leaves ~0.12 tiles, and
      vanilla assembling-machine-2 (same +-1.2 collision box) leaves 0.22 on its own
      north side. Measured by graphics/_blender/pipe_sockets.py --check
Version: 0.3.0
Date: 2026-10-22
  Features:
    - Own sound set, synthesised (sound/_generator/melta_sounds.py): a jet-exhaust loop with a
      sizzling top layer, plus pressure build-up and shut-down cues
    - Fuel defines the beam: light-oil (orange, 1.0x), petroleum-gas (blue, 0.85x),
      enriched melta-fuel (green-white, 1.6x), incendiaries napalm (deep red, 1.35x)
    - Enriched melta-fuel is now laced with uranium: 20 light oil + 2 uranium-238 + 1 sulfur -> 100
    - Burn rate raised to ~19/s cold and ~47/s held at full intensity (was ~1/s)
  Bugfixes:
    - The fuel surcharge could throw "Fluid index out of bounds": remove_fluid is (index, amount)
Version: 0.2.1
Date: 2026-10-22
  Changes:
    - Fuel list is data-driven: the turret accepts any fluid listed in constants.lua that exists
      in the install, and the fluid box is no longer filtered to one fluid
    - Lily's Incendiaries integration: lilys-napalm-mix can be piped straight in and burns 35%
      hotter than pyrum
    - Wanderer integration hooks: if an iridium item/technology appears, the turret recipe and
      the technology pick it up automatically (nothing happens when they are absent)
Version: 0.2.0
Date: 2026-10-22
  Changes:
    - Fuel is now a liquid: melta-fuel, brewed from light oil, piped straight into the turret
      (the turret is a fluid turret for that reason; its stream is invisible and only carries
      the fluid burn, the beam is drawn by the script)
    - New drawn 64-direction emitter head replaces the recoloured rocket pod; the hull art is
      still the vanilla rocket turret, untouched
    - The beam now runs its full length instead of stopping at the first body it cuts
    - Beam is layered (haze / glow / hot / white core) with a boiling plasma sheath on the
      outer edge, a muzzle flash and a burn pop on every body it cuts
    - Friendly forces are never damaged; the beam passes over your own walls like any turret
  Bugfixes:
    - A turret with no fuel no longer damages anything
Version: 0.1.0
Date: 2026-10-22
  Features:
    - Melta turret: fuel-fed thermal beam turret on the rocket turret hull
    - The beam pierces every body in line; thermal damage is its own damage type
    - Beam spins up over 2.5 s of sustained fire and decays in 1 s
    - Melta fuel item, recipe and the technology that unlocks both