Paint fuel, graphite, control rods, absorbers, reflectors, boilers and coolers onto the column grid and watch the mod's own per-tick loop run: four neutron streams per fueled rod, graphite moderation, xenon-135 poison, core→hull→column heat, boiler steam — every figure from TileEntityRBMKRod · RBMKNeutronHandler · ItemRBMKRod · TileEntityRBMKBase. Press AZ-5 to see why the RBMK is famous.
Drag to rotate. Right-drag, Shift-drag or two-finger drag to pan. Scroll or pinch to zoom. Cutaway clips the near half so the column interiors show; Lids hides lid plates and rod drives.
Each cell is one full RBMK column (the dialled column height tall). Pick a column type, pick a fuel rod, paint. Hover a cell for flux, rod temperatures, xenon and yield. The overlay tints show column heat, absorbed flux, and emitted neutrons — on the grid and on the 3D columns.
The simulation runs in full up front (20,000 ticks = 1,000 s of game time); Run replays it as the live tick loop.
A column is the base tileentity plus the dialled stack above it (rod at the core, lid on top, RBMKBase.fillSpace). Fuel cells take the rod chosen above.
Water feeds each boiler's 10,000 mB tank per tick; pipes take the steam as fast as it's made. Water stops at cuts the feed at that second (a tank running dry, a pump losing power): the boilers run on what is left in their own tanks, then the columns climb. Each running cooler burns 50 mB/t of perfluoromethyl cold and pulls 200 HE off every column in its cached 5×5 — the supply slider runs the first supply/50 coolers.
Level 100 = fully out (streams pass at ×1), 0 = fully inserted (streams stop dead). Rods travel at 0.00277/t × speed, drawing 5,000 EU/t from a 50,000 EU buffer (assumed supplied). Manual control rods add a surge while dropping: sin((1−level)¹⁵π)·(start−target)·surgeMod — reactivity peaks at level ≈ 0.046, the Chernobyl tip effect.
dialPassiveCooling …), not a config fileThe mod's per-tick loop, run for up to 20,000 ticks (1,000 s of game time). Heat is HBM HE; 1,500 HE in a column and the whole connected net melts.
Every fueled rod fires its output as four streams (N/E/S/W) up to the flux-range dial, walking column to column. Graphite multiplies the stream's fast ratio by (1 − moderator efficiency), so with the default eff 1 the first graphite block makes a fast stream fully slow — and the chain lives: fast emitters (rType FAST) feed the SLOW-absorbing fuels (slow + 0.5×fast), a loop that only closes through moderator between the rods.
ratio *= 1 − moderatorEfficiency // per moderator block fluxIn: SLOW = slow + 0.5·fast · FAST = fast + 0.3·slow · ANY = totalRBMKNeutronHandler.runStreamInteraction · TileEntityRBMKRod.fluxFromType
With reflector efficiency 1 (the default), a stream that hits a reflector isn't reflected around the corner — it is handed straight back to the rod that emitted it, fully moderated. A core wrapped in reflectors self-amplifies every rod; drop the dial below 1 and the reflector just multiplies the flux and lets it continue.
if (reflectorEfficiency == 1) { originRod.receiveFlux(stream); return; }
RBMKNeutronHandler.runStreamInteraction
The poison value (0–100 %) is updated in one arithmetic chain: it first burns by flux²/50, the incoming flux is then multiplied by (1 − poison/100) — using the post-burn value, so a deep burn temporarily amplifies the flux — and the poison regrows by 0.5·flux. Strong flux destroys xenon, weak flux lets it pin at 100 % and choke the core. That's the 1/75 poison dynamic that makes lea/heu cores oscillate.
x -= in² / xBurn // xBurn 50 in *= 1 − x / 100 // x as post-burn x += in · xGen // xGen 0.5, clamp [0,100]ItemRBMKRod.burn
Only UZH registers the heat coefficient (start 1000, length 500). Above 1,000 HE core the output multiplier slides down a sine from 1 at 1,000 HE to 0 at 1,500 HE — a built-in negative feedback that caps the rod's core right below its 1,845 HE melting point. Every other rod's output ignores its own temperature.
prog = clamp((core − 1000) / 500, 0, 1) mult = sin((prog·π + π) / 2) // 1 → 0 as core 1000 → 1500ItemRBMKRod.burn · ModItems rbmk_fuel_uzh
A boiler boils everything above its steam-type cap at 0.1 HE per mB of water, then multiplies by 100 ÷ factor. Plain steam: 1 HE → 10 mB water → 1,000 mB steam (cap 100). Ultrahot steam: cap 600, factor 1000 — 1 HE → 1 mB of steam from 10 mB of water. Hotter steam types trade a thousandfold steam volume for five hundred HE of extra cap headroom — they run cores that plain-steam boilers would flash over.
waterUsed = min(floor((colHeat − cap) / 0.1), feed) steam = floor(waterUsed · 100 / factor) // ×100, ×10, ×1, ×0.1TileEntityRBMKBoiler.onTick · getHeatFromSteam · getFactorFromSteam
Manual control rods report level + surge while moving downward, and sin((1−level)¹⁵π) peaks when level ≈ 0.046 — just above fully inserted. Scram from full out: the whole core sees a reactivity kick of up to (start−target)·surgeMod for the last few ticks of the drop, on top of the tips. That's the RBMK's fatal signature, transcribed exactly.
if (target < start && |level − target| > 0.01) surge = sin((1 − level)^15 · π) · (start − target) · surgeMod speed = 0.00277 / tick · controlSpeed dialTileEntityRBMKControlManual.getMult · TileEntityRBMKControl
Every absorbed neutron burns yield; enrichment = yield/max. RAISING-slope fuels (ueu, lep, mox…) run at enrichment + sin(enrichment·π)/2 — up to 1.5× at full enrichment, sliding to the linear curve as they deplete. A fresh graphite-moderated ueu core is a power curve that walks itself down over hundreds of thousands of ticks, not a cliff.
out = func(in · depMod(e)) · reactivityMod // e = yield/maxYield depMod: RAISING e + sin(eπ)/2 · GENTLE e + sin(eπ)/3 · LINEAR eItemRBMKRod.reactivityModByEnrichment · burn
Every RBMK tunable — passive cooling 2.5, heat flow 0.2, flux range 5, xenon on — is a world game rule (dialPassiveCooling, dialColumnHeatFlow…), clamped in RBMKDials.refresh; there is no toml. Forks ship their own defaults, which is why presets here carry rbmk.dial.* values. One constant lives in code: pulling a rod whose hull sits at ≥150 HE melts the column (forks raise it to 1,500). Melting fuel drops a corium stack plus FUEL debris.
pull rod with hull ≥ 150 HE → meltdown · meltdowns dial: dialDisableMeltdowns column heat > 1500 → whole connected net meltsRBMKDials · TileEntityRBMKRod.onBlockBreak / onMelt · TileEntityRBMKBase.meltdown