Routing the network components changed nothing, so the fault is further
down. The wiki documents no network components at all, so there is
nothing to look up and the remaining possibilities have to be separated
empirically.
Each probe drives its own indicator, and an indicator draws while its
toggle is off, so a visible icon means that probe failed:
A (mine) ThresholdToggle misbehaves, no network involved
B (crew) a mod-defined category carries nothing, broadcast and
received on the same part
C (EMP) receiving fails even for thermal_load_dissipation, which
this very radiator already broadcasts
Also switch the real thresholds from MinAmount = 0.5 to the
MaxAmount = 0 / Invert form the thermal pump uses. The signals are only
ever 0 or 1 so it is equivalent, and it removes a variable.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oLWY1G6S8U35bi2FxVWni
167 lines
4.5 KiB
Plaintext
167 lines
4.5 KiB
Plaintext
// ABOUT ME
|
|
// Components merged into the Radiator. They receive the three network values
|
|
// this mod broadcasts and combine them into a single gate, AutoPowerToggle,
|
|
// which mod.rules then substitutes for the radiator's vanilla PowerToggle on
|
|
// the parts of the radiator that actually dissipate heat.
|
|
//
|
|
// Each broadcast arrives as a number, 1 or 0, summarised across the network by
|
|
// a NetworkValueReceiver and turned back into a toggle by a threshold at 0.5.
|
|
// A network with no broadcaster at all yields 0, which is why a ship without
|
|
// thermal batteries or thermal launchers keeps vanilla behaviour.
|
|
//
|
|
// The player's manual on/off switch (PowerToggle) is preserved and still wins:
|
|
// a radiator the player has switched off stays off. The automation can only
|
|
// idle a radiator the player has left on.
|
|
//
|
|
// A radiator vents when ANY of these hold:
|
|
// - the network is not asking it to hold (no battery, or battery full)
|
|
// - no launcher on the network is using thermal ammunition
|
|
// - some part is overflowing heat right now (safety net, overrides all)
|
|
|
|
AutoRad_HoldSignal
|
|
{
|
|
Type = NetworkValueReceiver
|
|
Categories = [ auto_radiator_hold ]
|
|
Mode = Max
|
|
AllowUncategorized = false
|
|
}
|
|
|
|
AutoRad_ThermalAmmoSignal
|
|
{
|
|
Type = NetworkValueReceiver
|
|
Categories = [ auto_radiator_ammo_user ]
|
|
Mode = Max
|
|
AllowUncategorized = false
|
|
}
|
|
|
|
AutoRad_ForceVentSignal
|
|
{
|
|
Type = NetworkValueReceiver
|
|
Categories = [ auto_radiator_force_vent ]
|
|
Mode = Max
|
|
AllowUncategorized = false
|
|
}
|
|
|
|
// "value is not zero", written the way vanilla writes it (the thermal pump's
|
|
// UtilizationToggle). The signals are only ever 0 or 1, so this is equivalent
|
|
// to a 0.5 threshold while sticking to a form the game demonstrably honours.
|
|
AutoRad_IsHolding
|
|
{
|
|
Type = ThresholdToggle
|
|
ValueFrom = AutoRad_HoldSignal
|
|
MinAmount = 0
|
|
MaxAmount = 0
|
|
Invert = true
|
|
}
|
|
|
|
AutoRad_ThermalAmmoInUse
|
|
{
|
|
Type = ThresholdToggle
|
|
ValueFrom = AutoRad_ThermalAmmoSignal
|
|
MinAmount = 0
|
|
MaxAmount = 0
|
|
Invert = true
|
|
}
|
|
|
|
AutoRad_ForceVent
|
|
{
|
|
Type = ThresholdToggle
|
|
ValueFrom = AutoRad_ForceVentSignal
|
|
MinAmount = 0
|
|
MaxAmount = 0
|
|
Invert = true
|
|
}
|
|
|
|
// --- Self-test probes -------------------------------------------------------
|
|
//
|
|
// Three versions of this mod have now loaded cleanly and done nothing, each for
|
|
// a different reason, so these bisect the remaining possibilities directly.
|
|
// Each drives an indicator, and an indicator is drawn while its toggle is OFF,
|
|
// so in every case a visible icon means that probe FAILED.
|
|
|
|
// A: does ThresholdToggle behave as expected at all? No network involved.
|
|
AutoRad_ProbeOne { Type = StaticValue; Value = 1 }
|
|
AutoRad_ProbeThresholdOK
|
|
{
|
|
Type = ThresholdToggle
|
|
ValueFrom = AutoRad_ProbeOne
|
|
MinAmount = 0
|
|
MaxAmount = 0
|
|
Invert = true
|
|
}
|
|
|
|
// B: can a mod-defined category carry a value at all? The radiator broadcasts
|
|
// and receives this one itself, so no second part is involved.
|
|
AutoRad_ProbeBroadcast
|
|
{
|
|
Type = NetworkValue
|
|
ValueSource = AutoRad_ProbeOne
|
|
Categories = [ auto_radiator_selftest ]
|
|
IncludeInBlueprints = false
|
|
}
|
|
AutoRad_ProbeReceive
|
|
{
|
|
Type = NetworkValueReceiver
|
|
Categories = [ auto_radiator_selftest ]
|
|
Mode = Max
|
|
AllowUncategorized = false
|
|
}
|
|
AutoRad_ProbeSelfLoopOK
|
|
{
|
|
Type = ThresholdToggle
|
|
ValueFrom = AutoRad_ProbeReceive
|
|
MinAmount = 0
|
|
MaxAmount = 0
|
|
Invert = true
|
|
}
|
|
|
|
// C: does receiving work for a category vanilla already broadcasts? The
|
|
// radiator's own NetworkedThermalDissipationLoadValue publishes this one.
|
|
AutoRad_ProbeVanillaCat
|
|
{
|
|
Type = NetworkValueReceiver
|
|
Categories = [ thermal_load_dissipation ]
|
|
Mode = Max
|
|
AllowUncategorized = false
|
|
}
|
|
AutoRad_ProbeVanillaCatOK
|
|
{
|
|
Type = ThresholdToggle
|
|
ValueFrom = AutoRad_ProbeVanillaCat
|
|
MinAmount = 0
|
|
MaxAmount = 0
|
|
Invert = true
|
|
}
|
|
|
|
AutoRad_VentAllowed
|
|
{
|
|
Type = MultiToggle
|
|
Toggles
|
|
[
|
|
{ Toggle = AutoRad_IsHolding; Invert = true }
|
|
{ Toggle = AutoRad_ThermalAmmoInUse; Invert = true }
|
|
AutoRad_ForceVent
|
|
]
|
|
Mode = Any
|
|
}
|
|
|
|
// The replacement gate. PowerToggle is the radiator's vanilla UIToggle, so the
|
|
// player's switch remains the master control.
|
|
AutoPowerToggle
|
|
{
|
|
Type = MultiToggle
|
|
Toggles = [ PowerToggle, AutoRad_VentAllowed ]
|
|
Mode = All
|
|
}
|
|
|
|
// Diagnostic anchor. An indicator icon shows while its toggle is OFF, so an
|
|
// icon bound to this one is visible whenever these components were merged onto
|
|
// the part at all. If that icon is absent, the AddBase in mod.rules did not
|
|
// take effect and nothing else in this file is running either -- which is the
|
|
// single most useful thing to be able to tell apart from a dead signal.
|
|
AutoRad_AlwaysOff
|
|
{
|
|
Type = StaticToggle
|
|
ToggleOn = false
|
|
}
|