Repository navigation
Reactor Calculations
How the Dark Energy Reactor works out its power, spin, stability and failures, tick by tick. Every number is the default; the config key that changes it is in code (all in masteris_bhe-server.toml).
A few names used all through this page:
| Name | Meaning | Default |
|---|---|---|
| M | Total mass in the four stabilizers | |
| M₀ | The ignition minimum: 4 × minMassPerStabilizer
|
4 × 10,000 = 40,000 |
| rpm | The accretion disc's spin (signed; negative spins backwards and behaves the same) | |
| safe |
safeRpm, the spin above which the ring takes stress |
4,000 |
| offset | The stabilizers' angle, in degrees, ±maxOffset
|
±15 |
| Fed in (Mass Input Port, bomb, Horizon Ring) or swallowed | Mass each | Config |
|---|---|---|
| Any block | 1 | blockMass |
| Neutronium Ingot | 200 | neutroniumMass |
| Block of Neutronium | 9 × ingot = 1,800 | |
| Raw Neutronium | ½ × ingot = 100 | |
| Mass Shard | 16 | massShardMass |
| Singularity Heart | 10,000 | singularityHeartMass |
| An item that isn't a block (swallowed only; can't be fed in) | 1 | swallowedItemMass |
| A creature (swallowed) | ⌈max health ÷ 2 × 1⌉, so 1 per heart | creatureMassPerHeart |
A zombie (20 health, 10 hearts) is worth 10 mass.
Mass a running black hole swallows (items, mobs, blocks it tears loose) is split evenly across the four stabilizers. Any remainder goes round-robin, so none is lost.
| Total mass | Config | |
|---|---|---|
| Ignition needs, in each stabilizer | 10,000 | minMassPerStabilizer |
| Below this, stability is pushed down by 20 | 10,000 | warningMass |
| Below this, the reactor goes to pre-meltdown | 4,000 | criticalMass |
| A stabilizer at 0 while the disc spins faster than 1,000 rpm | stalls the disc |
Several things grow with the square root of the mass, scaled to the ignition minimum:
scale = √(M / M₀) 1 at 40,000 mass, 2 at 160,000, 3 at 360,000
radius = 1.5 × clamp(scale, 0.5, 3.33) blocks
So it's 3 blocks across at 40,000 mass, never smaller than 0.75 radius, and reaches its biggest (5 radius, 10 across) at about 444,000 mass. Anything that touches it is swallowed.
More mass holds the core steadier. "Shake" multiplies what the offset and overspin cost in stability, how fast ring stress builds, and how hard the disc wobbles:
shake = clamp((M₀ / M) ^ 1.5, 0.1, 2) (massSteadiness, minSpinShake, maxSpinShake)
| Mass | Shake |
|---|---|
| 25,000 or less | 2 (twice as touchy) |
| 30,000 | 1.54 |
| 40,000 | 1 |
| 80,000 | 0.35 |
| 160,000 | 0.13 |
| 186,000 or more | 0.1 (the floor) |
With massSteadiness at 1, twice the mass halves the shake; at 0, mass doesn't matter.
Every tick the stabilizers push the disc:
rpm += offset × 0.5 (spinAcceleration)
There's no top speed: at 1° the disc gains 10 rpm per second for as long as you leave it. A negative offset brakes a forward spin, then spins the disc backwards. The stabilizers turn toward the offset you set at 1° per second.
While shutting down, the disc brakes by 40 rpm per tick (shutdownBrake). Offline it slows by 50 rpm per tick.
There are two sources, and they add up.
mass power = (M / M₀) ^ 1 (massPowerExponent)
rotational RF/t = 0.0125 × rpm² × efficiency × mass power (rfPerRpmSquared)
Every RF of it is paid for with spin:
rpm lost this tick = rotational RF / (2,000,000 × mass power) (rfPerRpmSpent)
A heavier disc makes more power at the same spin and holds more energy per rpm, so the extra power costs no extra spin: the spin drains exactly as fast at any mass.
Spin is only spent on RF the core has room for, so with a full buffer the disc keeps its speed. Without both axial stabilizers, spin makes no power at all and isn't spent (so it just keeps climbing).
At the ignition minimum (40,000 mass, mass power 1):
| rpm | RF/t at 100% efficiency | Spin it costs |
|---|---|---|
| 1,000 | 12,500 | 0.006 rpm/t |
| 2,500 | 78,125 | 0.039 rpm/t (0.8 rpm/s) |
| 4,000 (safe) | 200,000 | 0.1 rpm/t (2 rpm/s) |
| 6,000 | 450,000 | 0.225 rpm/t |
With more mass, multiply the RF (not the spin cost):
| Total mass | Mass power | RF/t at 4,000 rpm, 100% efficiency |
|---|---|---|
| 40,000 | 1 | 200,000 |
| 80,000 | 2 | 400,000 |
| 160,000 | 4 | 800,000 |
| 400,000 | 10 | 2,000,000 |
With massPowerExponent at 0, mass makes no difference; at 2, four times the mass gives sixteen times the power.
Worked example: why you can't just leave it at 1°. At 1° the disc gains 0.5 rpm/t. At 100% efficiency the conversion only takes 0.5 rpm/t back at (at any mass)
0.5 = 0.0125 × rpm² / 2,000,000 → rpm ≈ 8,944
That's more than twice the safe spin. So you spin up with offset, then set it back to 0 and let conversion slowly drain the spin (at 2,500 rpm it loses under 1 rpm per second), topping up with short bursts of offset.
efficiency = resonance efficiency × wobble efficiency (0 without the axial stabilizers)
Spin turns into power fully only inside a resonance band that moves.
center = max(600, min(2,500 × scale, 0.95 × safe) + drift) (resonanceRpm)
band = center ± 300 (resonanceWidth)
- At 40,000 mass the center is 2,500 rpm. It rises with the square root of the mass and stops at 3,800 (95% of safe), from about 92,000 mass.
-
Drift: each tick the center wanders randomly by up to ±0.6 rpm (
resonanceDrift6 → about ±6 rpm per second). About once a minute (1 in 1,200 per tick) it jumps 300–600 rpm up or down. The drift never takes it more than 900 rpm (3 × width) from its base. A disc stall also knocks it 600 rpm one way or the other.
Outside the band, efficiency falls off smoothly to a floor:
off = |rpm − center| − 300
if off ≤ 0: resonance efficiency = 1
else: resonance efficiency = 0.2 + 0.8 × e^(−(off / 450)²) (resonanceMinEfficiency = 0.2)
| Distance from the center | Efficiency |
|---|---|
| up to 300 rpm | 100% |
| 450 | 91% |
| 600 | 71% |
| 900 | 34% |
| 1,200 or more | about 20% |
With the axial stabilizers up, the spinning disc precesses and leans (−100…100, negative toward the north-west). The axial trim (−10…10) pushes back. Each tick:
uneven = (heaviest stabilizer − lightest) / heaviest
precession wanders by ±0.01 per tick, kept within −1…1
drive = rpm / safe × 0.5 × precession × (1 + 2 × uneven) × 1.0 × shake (precessionStrength)
wobble = (wobble + drive + trim × 0.1) × 0.99
So faster spin and uneven mass (up to 3× the push) make it lean harder, and more mass (a smaller shake) makes it lean less.
- Up to ±25 it's harmless.
- Past ±25 it costs efficiency:
wobble efficiency = 1 − (|wobble| − 25) / 75 × 0.5, down to 50% at the edge. - It also costs stability (see below).
- At ±100 the disc tips over and stalls.
Without the axial stabilizers there's nothing to lean against, and any wobble dies away (×0.95 per tick).
The Bending Laser is part of the containment ring: it replaces the outermost middle block of the north-east beam port tunnel (12 east, 12 north of the core, at core height). Only a laser in that spot is used. It fires RF past the black hole; the beam swings round it and comes back stronger, burning mass as it does:
laser in = 200,000 × power% / 100 RF/t (laserMaxRate)
gain = 1.15 + (1.30 − 1.15) × power% / 100 (laserGainMin, laserGainMax)
laser out = laser in × gain
mass burnt = laser in / 400,000 per tick (laserRfPerMass)
| Laser power | In (RF/t) | Out (RF/t) | Net gain (RF/t) | Mass burnt |
|---|---|---|---|---|
| 25% | 50,000 | 59,375 | 9,375 | 0.125/t (150/min) |
| 50% | 100,000 | 122,500 | 22,500 | 0.25/t (300/min) |
| 100% | 200,000 | 260,000 | 60,000 | 0.5/t (600/min) |
Mass is drained evenly from the four stabilizers.
The stabilizers run on the reactor's own power. While it runs, each stabilizer draws 2,000 RF/t (stabilizerPower) from the core's buffer: the four around the ring, plus the two axial stabilizers once they're built.
| Built | Draw |
|---|---|
| Ring stabilizers only | 8,000 RF/t |
| With both axial stabilizers | 12,000 RF/t |
It's paid each tick out of that tick's output, before the Reactor Ports take anything. Whatever the buffer can't cover leaves stabilizers unpowered. Each costs its share of 100 stability (unpoweredStabilityLoss): one of six costs about 17, and with none powered the target is 0, so stability drains away into pre-meltdown.
For the first 30 seconds after ignition (stabilizerGraceSeconds) the stabilizers run on the ignition charge and draw nothing, giving the disc time to spin up. After that the spin has to cover the draw (about 1,000 rpm at the ignition minimum of mass, in the resonance band), or the buffer has to: charge it beyond the ignition cost, feed it through a Reactor Port, or run the Bending Laser. Without the axial stabilizers, spin makes no power at all.
| Config | ||
|---|---|---|
| Core buffer | 1,000,000,000 RF | |
| Ignition costs | 50,000,000 RF | ignitionEnergy |
| Each Reactor Port pushes, per side | up to 2,000,000 RF/t | portPushPerSide |
Ports only push while the reactor generates (stable, warning, shutting down or pre-meltdown).
above safe spin: stress += (|rpm| − safe) / 20,000 × shake per tick
otherwise: stress −= 0.05 per tick (1% per second)
Example: at 5,000 rpm with 40,000 mass, stress climbs 0.05 per tick, 1% per second, so 100% in under two minutes. At 100% the reactor goes to pre-meltdown.
Stability (0–100%) moves toward a target by at most 0.2 per tick (4% per second):
target = 100
− |offset| × 2 × shake
− laser power% × 0.2
− stress × 0.3
− (|rpm| − safe) / 100 × shake only above safe spin
− 20 only below warningMass (10,000)
− (|wobble| − 25) × 0.3 only past ±25 wobble
− 100 × unpowered / all stabilizers (see Stabilizer power)
Example: 40,000 mass (shake 1), 5° offset, laser at 50%, no stress, under safe spin, no wobble:
target = 100 − 10 − 10 = 80
More mass makes the offset and overspin cost less: at 80,000 mass the same 5° costs only 3.5.
Offline, stability recovers 0.5 per tick. During a disc stall it drops 0.02 per tick.
| State | When | Config |
|---|---|---|
| Stable | stability ≥ 50 | warningStability |
| Warning | stability < 50 | |
| Pre-meltdown | stability < 20, or stress ≥ 100, or mass < 4,000, or a breach of the ring |
preMeltdownStability, criticalMass
|
| Recovers from pre-meltdown | stability ≥ 35 and stress < 90 and mass ≥ 4,000 and the structure is whole |
recoverStability, recoverStress
|
Countdowns:
| Seconds | Config | |
|---|---|---|
| Disc stall (overcharge every breaker, then JUMP) | 60 | discStallSeconds |
| JUMP pressed too early costs | 5 | jumpPenaltySeconds |
| Fixing an ignition or shutdown fault | 120 | faultSeconds |
| Pre-meltdown | 90 | preMeltdownSeconds |
| Meltdown phase 1 | 120 | meltdownPhase1Seconds |
| Meltdown phase 2, then collapse | 60 | meltdownPhase2Seconds |
The disc stalls when:
- a stabilizer runs dry (0 mass) while the disc spins faster than 1,000 rpm, or
- the wobble reaches ±100, or
- you SCRAM above 90% of the safe spin (3,600 rpm;
scramStallSpin).
When it stalls, the disc's trapped energy dumps into the buffer, and stability drops by 15:
RF dumped = 0.0125 × rpm² × 200
At 3,000 rpm that's 22,500,000 RF.
Rolled when you ignite or start a shutdown. Both are capped at 90%.
Ignition fault
low, high = the emptiest and fullest stabilizer
imbalance = (high − low) / high
thin = clamp(1 − (low / 10,000 − 1) / 0.5, 0, 1) full at exactly the minimum, gone at 1.5× it
chance = 0.05 + 0.5 × imbalance + 0.3 × thin + 0.3 × (1 − stability / 100) (faultBaseChance = 0.05)
| Setup | Chance |
|---|---|
| All four at 15,000+, stability 100 | 5% |
| All four at exactly 10,000 | 35% |
| 20,000 / 20,000 / 20,000 / 10,000 | 5% + 25% + 30% = 60% |
Shutdown fault
chance = 0.05 + 0.5 × (1 − stability / 100) + 0.25 × stress / 100 + (0.15 if |rpm| > safe)
A clean shutdown (100% stability, no stress, under safe spin) is 5%. Shutting down from a shaky 60% stability with 40% stress at 4,500 rpm is 5 + 20 + 10 + 15 = 50%.
| Mass burnt | Config | |
|---|---|---|
| Normal vent through the Venting Lance | 15% | ventMassFraction |
| Vent while the ring is breached | 75% | breachVentMassFraction |
| Emergency vent (meltdown phase 1) | all of it, and the lance |
A singularity rebound (a shutdown fault) closes once you drain the core's charge below 5,000,000 RF (reboundDrainRf).
The running black hole pulls in items and mobs, and tears loose blocks within a sphere (when pullBlocks is on), turning them into mass. The sphere grows as things go wrong:
| State | Reach (blocks from the core) |
|---|---|
| Running normally | 12.5 (just inside the ring) |
| Disc stall, fault | 21.5 (just past the ring) |
| Pre-meltdown | 21.5 → 31.5 over the countdown, +6 if breached |
| Meltdown phase 1 | 40 |
| Meltdown phase 2 | 48 |
Past the ring, blocks are only eaten with destroyBlocks on. At most 300 torn blocks fly in at once (maxBlocksInFlight). In a meltdown, mobs, players and items are dragged in from 20 blocks (phase 1, meltdownPhase1Pull) and 32 blocks (phase 2, meltdownPhase2Pull).
When meltdown phase 2 runs out, the core collapses.
crater radius = min(80, 50 + M / 10,000) (baseExplosionRadius, massPerRadius, maxExplosionRadius)
zone radius = clamp(500 × scale, 150, 2,000) (zoneRadius, zoneMinRadius, zoneMaxRadius)
fallout = min(zone radius, 500) (falloutRadius)
| Mass at collapse | Crater | Zone | Fallout |
|---|---|---|---|
| 10,000 | 51 | 250 | 250 |
| 40,000 | 54 | 500 | 500 |
| 160,000 | 66 | 1,000 | 500 |
| 300,000 | 80 (cap) | 1,369 | 500 |
| 640,000+ | 80 | 2,000 (cap) | 500 |
The zone is a sphere centered on the crater floor. Inside it, gravity is 40% (gravityMultiplier). It takes 8 stabilized ore nodes to close (stabilizationNodes); each one shrinks the radius by an equal share of what's left.
blast radius = min(150, 60 + M / 25) (bomb.baseRadius, bomb.massPerRadius, bomb.maxRadius)
zone radius = as above, but for twice the bomb's mass
1,000 mass gives a 100-block blast. 2,250 or more hits the 150 cap.