Skip to content

Create Integration

denfry edited this page Oct 13, 2026 · 1 revision

Create Integration

Note

Design stage. This page describes planned mechanics from the design document. Not implemented yet — see Roadmap (milestone M5; centrifuges arrive with M9, refueling and cranes with M12).

Prompt Critical uses the kinetic network of Create 6 as the mechanical power source for its rotating machines: main coolant pumps, feedwater pumps, control rod drives, gas centrifuges, fans, the refueling machine and cranes. The turbine can also act as a Create source.

Create models kinetics as a network with an imposed speed: sources set RPM, consumers declare "stress" (SU per RPM), and the network either rotates as a whole or stops as a whole when total stress exceeds total capacity (overstress). Create has no inertia, torque, coast-down or slip. For a nuclear plant that is not enough: pump coast-down on a flywheel and gravity rod drop are central safety features. The mod therefore keeps its own rotor model on top of the Create shaft.

Coupling rules

# Rule Consequence
R1 Own inertia. Every mod machine has its own angular velocity ω and moment of inertia J. The Create shaft speed is only a command to the drive (ω_cmd). Coast-down, spin-up and resonances are simulated.
R2 One-way coupling for consumers. A consumer (pump, centrifuge, rod drive) never returns energy to the Create network; it is driven through an overrunning (freewheel) or friction clutch. A flywheel cannot be used as a "battery" for Create; no exploits.
R3 Quantized source. The turbine as a Create source (GeneratingKineticBlockEntity) changes its declared speed only in steps with hysteresis; capacity (SU) is updated at most once per second with a dead band. Expensive Create network rebuilds stay rare.
R4 Throttled dynamic stress. A consumer declares stress proportional to actual power, updated at most once per second and only on a change > 5 %. Honest energy balance without loading Create sync.
R5 Loss of kinetics is a safety event. A "shaft turning → stopped" transition on a rod drive or main coolant pump raises TripReason.LOSS_OF_DRIVE_POWER in the protection system, independent of Lua. Anticipatory trip before LOW_COOLANT_FLOW develops.

Power is converted to stress with the global constant W_PER_SU = 1000 W/SU:

impact [SU/RPM] = P_shaft [W] / (W_PER_SU * |n_s| [RPM])
stress_total    = impact * |n_s| = P_shaft / W_PER_SU

The declared power never drops below a floor of 2 % of rated power, so a machine never "disappears" from the network. When the shaft is stopped, impact is computed at nominal speed so that Engineer's Goggles show the real future load before start-up.

Binding architecture

The simulation (pc-sim, pure Java) sees Create only through two port interfaces; pc-mod implements them with Create adapters.

Port (sim.mechanics) Implemented by Purpose
KineticPort CreateKineticPort Consumer: reads shaftRpm(), networkHealthy(); writes requestStressSu() (filtered by R4)
KineticSourcePort CreateSourcePort Source (turbine): offer(rpm, capacitySu), loadPowerW(), networkOverstressed()

Order inside the FAST tick (server thread):

  1. pc-mod reads getSpeed() and isOverStressed() for each machine into a double buffer.
  2. pc-sim steps hydraulics with pump heads from the current ω, then steps mechanics ω(n) → ω(n+1) and computes the required stress.
  3. pc-mod applies stress/capacity requests that pass the R3/R4 filters.

Compatibility policy: public Create API and inheritance only (access transformer or mixin accessor as a fallback for KineticNetwork internals); Create is a hard dependency pinned by version range in neoforge.mods.toml; every Create release gets a GameTest "pump + flywheel + overstress → coast-down ≥ 10 s".

Behavior on Create overstress

Create stops the whole network. Each mod machine reacts physically:

Machine What happens Safety signal
primary_pump Coasts down on the flywheel, flow falls as 1/(1 + t/τ) LOSS_OF_DRIVE_POWER immediately, then LOW_COOLANT_FLOW
control_rod_drive Holding clutch releases → gravity drop LOSS_OF_DRIVE_POWER
feedwater_pump Coast-down in seconds (small J) LOW_SG_LEVEL develops later
gas_centrifuge Rotor coasts for hours, slowly passing critical speeds downward cascade_overspeed / vibration event
turbine_* (source) Load disappears → acceleration → governor / overspeed trip TURBINE_TRIP at 110 %
refueling_machine All motion stops; grapple holds the load (brake) Interlock
Fans Flow drops in ~1 s Zone pressures equalize

The classic cascade scenario: one Create network feeds the main coolant pumps, centrifuges and crushers. The player adds a crusher → overstress → pumps stop → scram. The lesson is the real one: separate power supplies for safety systems. The mod pushes toward separate kinetic networks without forbidding the mistake.

Mechanics models

Main coolant pump (primary_pump)

A 3×3×4 multiblock: volute casing with pipe_large nozzles, shaft, mechanical seal, Create-driven motor with gearbox, built-in friction clutch with overrunning mechanism, anti-reverse ratchet, and seats for 0–2 pump_flywheel blocks. CC peripheral: pc_pump.

The head curve is H(Q, ω) = H0·(ω/ω0)² − K_H·Q·|Q|; affinity laws (Q ∝ ω, H ∝ ω², P ∝ ω³) follow automatically. Efficiency is a parabola around the best-efficiency point, which shifts with speed. The pump head enters the hydraulic network as a pressure source on the pump's flow link.

Default parameters

Parameter Value Config key / note
Rated speed ω0 104.72 rad/s (1000 rpm) Real PWR/VVER pumps: 1000–1500 rpm
Gear ratio 3.906 (256 RPM shaft → 1000 rpm) pumps.primary.gear_ratio
Q at BEP 0.85 m³/s (≈ 633 kg/s at 745 kg/m³) pumps.primary.q_bep_m3s
H_nom / H0 60 m / 75 m pumps.primary.head_m
η_max 0.80
Nominal shaft power 465.9 kW at 290 °C, 15.5 MPa
Rated drive power 629 kW (1.35 × nominal) margin for cold start (+34 % density)
Nominal stress 1.82 SU/RPM (466 SU)
J pump (rotor + motor) 30 kg·m²
J per pump_flywheel 270 kg·m² (steel disc Ø 1.2 m, ≈ 1.5 t) pumps.flywheel_inertia
Required NPSH at rated speed 40 m requires pressurizer back-pressure

Coast-down

Without drive torque, ω(t) = ω0 / (1 + t/τ_cd) with τ_cd = J·ω0² / P0. Flow halves in τ_cd.

Configuration J, kg·m² τ_cd, s Flow after 5 s Comment
No flywheel 30 0.71 12 % Boiling crisis almost unavoidable
1 flywheel 300 7.06 59 % Short for this pump
2 flywheels 570 13.4 73 % Realistic for PWR/VVER (half flow in 10–20 s)

The price of flywheels: slower start-up (1.64 MJ to spin up with one flywheel, ≥ 2.6 s at full power; 3.13 MJ and ≥ 5.0 s with two), start-up stress up to 629 SU, and a flywheel burst above 125 % ω0.

Cavitation, clutch, failures

  • Cavitation. Cavitation index κ = NPSH_r / NPSH_a. Above 1 the head is multiplied by max(0.3, κ^-1/2); above 1.5 the impeller erodes and loses efficiency. κ and flow are published to the pump's acoustic emitter (see Acoustics).
  • Clutch. Command pc_pump.setClutch(bool) or redstone. Re-engaging at speed is safe only when |ω_cmd − ω| < 0.1 ω0; otherwise the clutch slips, wears (50 MJ slip-energy budget) and pulls peak stress equal to rated power, which can overstress the Create network.
  • Anti-reverse ratchet. Reverse rotation is blocked; a stopped pump acts as a resistance with K_rev = 2·K_H. With a broken ratchet the rotor spins backwards ("turbine mode") and a restart needs double torque.
Failure Trigger Mechanics
Rotor seizure Bearing wear > 1, or prolonged vibration above threshold ω → 0 in 0.1 s
Shaft break Torque > 3 × stall torque Impeller free (J = 2 kg·m²), drive idles
Seal failure Seal cooling lost > 120 s at T > 550 K Coolant leak 2–20 kg/s (seal LOCA)
Flywheel burst ω > 1.25 ω0 Debris damage

Tags: rcs.loop<N>.pump.speed [rad/s], rcs.loop<N>.pump.power [W], rcs.loop<N>.pump.vibration, rcs.loop<N>.pump.npsh_margin [m], rcs.loop<N>.pump.clutch [0/1], rcs.loop<N>.flow.

Feedwater and condensate pumps

Same model with different parameters and no flywheel:

Parameter feedwater_pump condensate_pump
Q at BEP 0.060 m³/s (≈ 52 kg/s) 0.055 m³/s
H_nom / H0 800 m / 950 m 150 m / 190 m
ω0 314 rad/s (3000 rpm) 157 rad/s
Nominal shaft power 565 kW 107 kW
Stress at 256 RPM 2.21 SU/RPM 0.42 SU/RPM
J 8 kg·m² (τ_cd ≈ 1.4 s) 3 kg·m²
Required NPSH 25 m (needs booster or deaerator head) 3 m (condenser vacuum: classic cavitation case)

Control rod drives (control_rod_drive)

A drive sits on top of a control_rod_channel. Inside: rack-and-pinion or winch, a self-locking worm stage and a holding clutch that is closed only while (a) the Create shaft turns faster than a threshold and (b) the protection_cabinet gives a permissive signal. Any violation opens the clutch and the rod falls under its own weight: "holds while it turns".

HOLD = (|n_s| ≥ n_hold) ∧ RPS_PERMISSIVE ∧ ¬MECH_FAULT, with n_hold = 8 RPM (rods.hold_min_rpm). This is evaluated every FAST tick in hardware logic, not Lua.

Shaft ≥ 8 RPM RPS permits Mech. fault Result TripReason logged by the drive
1 1 0 Hold / move —
0 1 0 Drop LOSS_OF_DRIVE_POWER
1 0 0 Drop (scram command) — (reason already in RPS)
x x 1 Drop or stuck — ; event rod_drive_fault

With rods.loss_of_drive_full_trip = true (default) loss of kinetics on any drive causes a full scram of all groups.

Normal motion. Speed is min(|v_cmd|, k_rack·|n_s|, v_max) with k_rack = 3.125e-4 m/(s·RPM) (64 RPM → 2 cm/s) and a mechanical limit rods.max_drive_speed_m_s = 0.05 m/s. Even a Lua script cannot withdraw rods faster. Commands come from the pc_rod_drive peripheral or redstone (signal 1–7 down, 9–15 up, 8 stop). Holding power is about 2 kW; the drive is a cheap consumer where continuity matters, not power.

Gravity drop. The rod falls with drag to a terminal velocity, then enters a hydraulic dashpot on the last metres:

RodType Prototype g′, m/s² v_t, m/s Dashpot L_d / v_d Insertion over 3.5 m
SHUTOFF_GRAVITY PWR/VVER cluster in water 8.0 3.0 0.35 m / 0.5 m/s ≈ 1.6 s (real: 1.5–4 s)
CHANNEL_SLOW RBMK-like channel rod 6.0 0.4 0.3 m / 0.2 m/s ≈ 9.5 s (17.55 s over 7 m)
PILE_ZIP CP-1 emergency rod on a rope 9.6 (in air) 12 0.5 m / 2 m/s ≈ 0.9 s

These are defaults for a water-filled channel. If the rod has a RodGeometry, g′ and v_t are recomputed each tick from the channel fluid density, so in steam or an empty channel (LOCA) the rod falls faster and the dashpot stops working. The acceptance criterion is full stroke ≤ 4 s.

PILE_ZIP (tier T0) hangs on the zip_rod_winch drum. It drops on an RPS signal, on loss of kinetics, or when a player hits the zip_rope block with an axe.

Stuck rods. Probability per drop is 1e-3 · (1 + 50·δ_ch) where δ_ch ∈ [0, 1] is channel deformation. A stuck rod stops at a random 20–90 % of height and fires the rod_stuck event.

Drive state machine

State Event Next
LATCHED_HOLD v_cmd ≠ 0 ∧ HOLD LATCHED_MOVING
LATCHED_MOVING v_cmd = 0 or limit switch LATCHED_HOLD
LATCHED_* ¬HOLD RELEASED_FALLING
RELEASED_FALLING x ≤ L_d DASHPOT
RELEASED_FALLING jam on release STUCK
DASHPOT x = 0 BOTTOMED_UNLATCHED
BOTTOMED_UNLATCHED HOLD restored ∧ RPS reset RELATCHING
RELATCHING gripper reaches rod LATCHED_HOLD
STUCK repair / manual insertion LATCHED_HOLD / BOTTOMED_UNLATCHED

Re-latching takes gripper height / v_max, so a drive is not ready instantly after a scram.

Dead-man drive. A create:hand_crank on the drive shaft holds the rods only while the player keeps cranking. Let go and the rods drop.

Tags: rods.<group>.position [m], rods.<group>.state, rods.<group>.drive_speed [RPM], rods.<group>.hold [0/1].

Turbine and generator

ID Role
turbine_casing, turbine_rotor Turbine multiblock; rotor length = number of stages
turbine_governor Speed governor and overspeed trip; drives the inlet valve_control
turbine_stop_valve Stop valve: closes in 0.2 s on TURBINE_TRIP
turbine_gearbox Output to a Create shaft: 64 / 128 / 256 RPM
electric_generator FE generator directly on the turbine shaft (not through Create)
turbine_turning_gear Turning gear: slow rotor rotation after shutdown, driven from a Create shaft

Turbine models

Rotor dynamics. J_t·dω/dt = τ_steam(ω) − τ_Create − τ_gen − τ_friction. Steam torque follows an impulse-turbine line (stall torque ≈ 2× rated, runaway ≈ 2 ω0); isentropic efficiency is 0.85 (turbine.isentropic_efficiency). Inertia comes from the inertia constant H = 4 s: a 30 MW turbine at 314.16 rad/s has J_t = 2432 kg·m².

Output to Create. The gearbox is a GeneratingKineticBlockEntity. Output speed is the set speed above 95 % ω0, stepped in quarters between 20 % and 95 %, and zero below 20 %, with 2 % hysteresis. Capacity is (min(P_steam, P_rated) − P_gen_demand) / W_PER_SU, updated at most at 1 Hz with a 2 % dead band. Example: 30 MW fully on Create → 30 000 SU, 117.2 SU/RPM at 256 RPM. Load from the Create network is shared between sources by capacity.

Governor and overspeed trip. Droop R = 0.04, servo time constant 0.1 s, valve opening rate 0.1 /s, closing 0.5 /s (5 /s above 105 % speed). At ω ≥ 1.10 ω0 (turbine.overspeed_trip_frac) TURBINE_TRIP closes the stop valve in 0.2 s. A trip also occurs on condenser pressure > 25 kPa, high vibration, manual command, or reactor trip (turbine.trip_on_reactor_trip).

Load rejection check: 30 MW with valves frozen accelerates at 39.3 rad/s² and reaches 110 % in 0.80 s. With a working governor the peak is +6–8 % with no trip. If Lua holds the valve open, the trip fires in under 1 s, which is why overspeed protection is a hardware function.

FE generator. Electrical output is min(P_demand, P_gen_rated) only within 95–105 % of rated speed (frequency relay), with generator efficiency 0.98. Example: 30 MW mechanical → 588 000 FE/t.

Turning gear. After shutdown the rotor must turn at 2–5 rpm. Otherwise, after 30 physical minutes, it develops a thermal bow, and starting with a bow multiplies vibration by (1 + 10·bow). turbine_turning_gear takes ≥ 16 RPM from Create and draws about 2 kW.

Centrifuges

Rotor physics live in the fuel-cycle design (Nuclear Fuel Cycle); the Create side is:

Parameter T-A T-B T-C
Step-up ratio 256 256 256
Nominal shaft RPM 174.1 213.9 242.5
Shaft RPM at burst 224 248.7 323 (unreachable)
Rotor J, kg·m² 0.0447 0.0848 0.1005
Steady stress, SU/RPM 0.586 0.698 1.966
Spin-up power 20 kW 20 kW 20 kW
Clutch FREEWHEEL + brake same same
  • create:rotational_speed_controller is the precise way to set shaft RPM (and the only way to avoid bursting a T-A at 256 RPM). A sharp setpoint drop through the critical band is safe because the rotor freewheels; a slow stop that lingers in the critical band is destructive.
  • create:sequenced_gearshift runs staged start-up programs without CC.
  • create:speedometer / create:stressometer show the shaft, not the rotor. Rotor speed is visible only via pc_cascade or a vibration sensor.
  • 100 T-C machines need about 47 700 SU.

Refueling machine, arms and cranes

refueling_machine is a multiblock (refueling_bridge, refueling_rail, refueling_trolley, refueling_mast, refueling_grapple) with one Create shaft input on the bridge; one movement at a time.

Motion Speed Power
Bridge, trolley min(0.2, 0.003125·|n_s|) m/s (64 RPM → 0.2 m/s) 2 kW
Mast up/down min(0.1, 0.0016·|n_s|) m/s ≈ 1 kW
Grapple 2 s per operation —

Commands go through pc_fuel_pool. The cycle (IDLE → TRAVEL → LOWERING → SEATED → LATCHED → RAISING) has interlocks: travel only with the mast fully up; a seating impact > 1.5 × weight stops the mast (fuel_handling_snag); raising stops at the minimum water cover (pool.min_transfer_cover_m); the grapple opens only when unloaded; on shaft loss brakes hold the load (HALT).

  • create:mechanical_arm gets interaction points for fuel_pool_rack, assembly_jig, pellet_press, fuel_channel. It may handle irradiated fuel, but an assembly in the arm is an unshielded moving radiation source.
  • create:deployer pushes T0 cartridges into a fuel_channel face; the irradiated cartridge pushed out the far side drops into a water channel (X-10 style).
  • polar_crane: 200 t capacity (crane.capacity_t), hoist 0.02–0.05 m/s. The brake is normally closed, so the load is held on shaft loss, the opposite of rod drives. Overload > 1.25 × rated snaps the rope. heavy_load_path_marker defines allowed routes; carrying a load over the pool off-route fires heavy_load_over_pool.

Ventilation and filters

ID Role
create:encased_fan Draft source (native Create)
vent_duct, vent_damper Duct; damper (redstone or pc_containment)
hepa_filter Aerosol filter (99.97 % at 0.3 µm)
charcoal_filter Iodine filter (TEDA-impregnated carbon)
vent_zone_controller Registers a room (volume, bounds) as an air-network node
vent_stack Release point; height feeds the dispersion model

Ventilation models

The air network is solved by Newton iteration on node pressures (≤ 16 nodes per controller, once per real second). The fan curve is Δp = 500 Pa·(n/256)² − k_f·Q|Q| with 5.12 m³/s free delivery at 256 RPM. Fan stress uses Create's own config. Controlled zones must stay at Δp ≤ −20 Pa relative to clean zones; an open door between zones breaks this and fires zone_pressure_lost.

Filter Retains Efficiency Life
hepa_filter Aerosols (Cs, Sr, actinides, ...) 99.97 % (DF 3333) 5 kg dust; replace at Δp > 1000 Pa
charcoal_filter Iodine (I₂ 99.9 %; CH₃I 99 % below 70 % RH, 90 % above) DF 100–1000 Iodine loading + aging
— Noble gases (Kr, Xe), tritiated water vapour 0 —

Retained activity accumulates, making a spent filter a radiation source and a waste item. A charcoal filter fire (T > 600 K) releases the captured iodine.

Create pipes vs. mod pipes

Create pipes do not model pressure, temperature or corrosion. Primary and secondary circuits use only mod pipes (pipe, pipe_large).

Medium / conditions Create pipes chem_pipe pipe / pipe_large
Water, T < 373 K, ~atmospheric yes yes yes
Dilute H₂SO₄, natural U solutions yes (copper corrodes, leaks over time) yes —
HNO₃, HF, F₂, UF₆ no yes (HF/F₂: chem_pipe_monel only) —
Radioactive liquids > 10³ Bq/L no yes yes
Primary coolant, secondary steam, p > 0.6 MPa or T > 373 K no no yes

pipe_adapter_create connects the two worlds: a 1 m³ buffer on the Create side and a boundary node on the mod side, with a check valve and a relief valve that cuts flow above 0.6 MPa. It refuses liquids above the activity limit. The pipe_adapter_create_raw variant has no relief valve and bursts on overpressure.

Ponder scenes

25 Ponder scenes (promptcritical:<scene>), each ≤ 60 s, using the same formulas as the simulation:

Scene Teaches
inertia_basics Create shaft ≠ machine speed; coast-down
primary_pump_assembly Assembly, gearbox, stress
separate_safety_networks Overstress drops the pumps → scram
pump_cavitation Back-pressure, NPSH
rod_drive_hold_and_scram "Holds while it turns"
rod_drive_dead_man Hand-crank drive
t0_zip_rod Emergency rod on a rope
centrifuge_assembly, centrifuge_critical_speeds Tiers, step-up, do not linger in resonance
cascade_building, cascade_crash_isolation Stages, headers, isolation
turbine_to_create, turbine_load_rejection, turbine_turning_gear, electric_generator_fe Capacity, governor, turning gear, FE frequency window
refueling_machine_cycle, crane_heavy_loads Interlocks; crane brake holds
ventilation_negative_pressure, filters Negative pressure, doors, what filters catch
pipes_boundary Create/mod pipe boundary
arm_fuel_handling, deployer_t0_loading Dose during open handling; X-10 loading
comminution_bond, agitated_leach, bulk_wash_decon Grinding energy, agitator stress, wash decontamination

Events and config keys

Events exposed to CC: rod_drive_fault, rod_stuck, drive_power_lost, pump_cavitation, pump_seized, turbine_trip, turbine_overspeed, fuel_handling_snag, heavy_load_over_pool, zone_pressure_lost, filter_dp_high.

Config key groups: pumps.primary.*, pumps.flywheel_inertia, pumps.feedwater.*, pumps.condensate.*, rods.* (hold_min_rpm, k_rack, max_drive_speed_m_s, stuck_base_prob, loss_of_drive_full_trip), turbine.* (droop, overspeed_trip_frac, stop_valve_close_s, output_rpm, ...), ventilation.*, fluids.create_pipe_max_*, crane.*, mechanics.stress_update_min_interval_s, mechanics.stress_update_deadband.

See also

Clone this wiki locally