This simplifies radioactivity by removing the 1000 and 0.25 multipliers.
It also increases the effectiveness of protection (I think it was too low
before -- most of the advantage of adding protective layers was just from
the increased distance).
The reactor originaly used a stainless steel shield only
because lead wasn't yet available. Stainless steel shields
are automatically converted to lead shields for legacy reasons.
Changes:
* Make rayIter a global utility, and use it for radiation too.
* prettynum -> pretty_num and cleanup.
* Remove resolve_name/function_exists (unused).
* Cleanup nuclear reactor code.
Adds a cache to the quarry in order to reduce load and send larger stacks through pipes instead of just single items. Coin tossing ensures the cache gets purged around every 200 seconds. The interval isn't fixed in order to prevent material spikes from multiple quarries which got loaded simultaneously. When the cache is full, or the quarry finished, it is purged too.
Don't load the whole digging area when only a small piece is relevant.
Also, move the (time expensive) check whether the air above a block is free to the last position, which spares unneccessary checks when multiple quarries are placed together, or a quarry has to loop over air for another reason.
Squeeze the range of material shielding values. The strongest shielding
materials get weaker, and weaker shielding materials, especially low-end
ones such as dirt, get stronger. The radioactivity of the active
reactor core is increased so that the standard shielding is (still)
only narrowly sufficient.
Make the "radioactive" group value be the safe distance in millimeters
rather than meters, to allow for intermediate values. Use such
intermediate values for the uranium blocks, using the existing formula
with this finer quantisation. All other radioactive nodes retain their
existing radioactivity exactly.
The quarry used to get stuck when it encountered an undiggable node.
Change it to skip past that node, digging whatever later stuff it can.
Necessarily, the current digging position becomes semantically-significant
state: it is no longer sufficient to search the quarry cuboid from the top
on each iteration. The current digging height is reported in the quarry's
interaction form, and can be reset to the top using a button on the form.
Where there is a non-air node within the quarry directly above the
next node to dig, it blocks the quarry's access to that node, even if
everything involved is diggable. Thus an undiggable node casts a shadow
of undug nodes below it. Resolving undiggability of a node is a major
reason to use the restart button.
The new API function is now renamed to pipeworks.tube_inject_item(),
so use it under that name. If it is not available, synthesise the new
API in terms of the old one.
With breaking an active reactor core now causing instant meltdown, having
it breakable by hand is too hazardous. Change it to match steel block,
which constitutes the main part of the rest of the reactor structure.
Replacing the extractor-based system, uranium to be used as reactor fuel
must now be enriched in stages using the centrifuge. Uranium metal can
exist at 36 levels of fissile content, from 0.0% to 3.5% in steps of 0.1%.
One round of centrifuging splits two dust of a particular grade in to one
dust each of the two neighbouring grades. Uranium of each grade can exist
as dust, ingot, and block, with all the regular metal processes to convert
between them. Uranium from ore exists in lump form, and is 0.7% fissle.
The blocks are radioactive to a degree dependent on fissile content.
Thus the chemical refinement and processing of uranium now follows the
standard pattern for metals, and is orthogonal to isotopic enrichment.
Each form of uranium (dust, ingot, block) intentionally looks identical
regardless of fissile grade.
If technic_worldgen is used alone, it defines only one grade of uranium
(as before), but defines it in the regular metal pattern, with lump, ingot
produced by cooking lump, and block crafted from ingots. It identifies
the metal only as "uranium". The multiple grades of uranium are defined
by the technic mod, which identifies each grade as "N.N%-fissile
uranium". The single grade that was registered by technic_worldgen
is redefined to be described specifically as "0.7%-fissile uranium".
For the redefinition to work, technic_worldgen must load before technic,
so technic now declares a dependency on technic_worldgen.
Each fuel rod is made from five 3.5%-fissile ingots, each of which in
turn requires one to start with five 0.7%-fissile dust, so each fuel rod
is now derived from 12.5 uranium lumps (or 25 if the lumps were first
cooked rather than being ground). This replaces the 20 lumps required
by the former recipes. After setting up and priming the centrifuge
cascade, enriching a full set of fuel for the reactor (six fuel rods)
takes 14700 centrifuge operations. It's intended to be a practical
necessity to automate the centrifuge. In the absence of EU upgrades
for the centrifuges, these operations consume 5.88e8 EU, about 0.97%
of the 6.048e10 EU that the fuel set will produce in the reactor.
The intent is that, in this respect as in others, operating a reactor
should carry a very high up-front cost, but ultimately be very profitable.
As the layers of reactor structure now have a practical purpose,
in attenuating the modelled radiation from the core, it is no longer
necessary to make so much of it mandatory in order to motivate players
to build it.
The siren sounds a "danger" tone continuously while it is active and
damaged, such that meltdown is imminent. It sounds a one-off "clear"
tone if it has been sounding "danger" and the danger has passed, either
because the structure is repaired or because the reactor has become idle.
The meltdown check now doesn't trigger meltdown immediately on reactor
structure being compromised. Instead, there's a grace period of up to
100 s, during which the reactor can be repaired. The check doesn't just
look at whether the structure is damaged at all: it looks at how damaged
it is, counting the number of faulty nodes. The amount of damage is
integrated over time, and the grace period is actually 100 node-seconds,
so greater damage causes meltdown more quickly. If the active core is
dug then it melts down immediately, preventing the tactic of digging
the core to avert meltdown.
Incidentally move the meltdown check into its own ABM, from the
technic_run callback, so that it applies even when the reactor is not
connected to a switching station.
Radiation is attenuated exponentially by passing through shielding
material. Radiation resistance values are assigned to all bulk-material
nodes, and the radiation damage ABM traces the path of each radiation ray
to count up the shielding. The relative radiation resistance values are
essentially real, but the effectiveness of all shielding is scaled down
by a factor of about 70 for game purposes. Strength of the existing
radiation sources is increased by varying amounts to compensate for
shielding. Uranium block and ore, both usable as shielding, are made
slightly radioactive, the latter only very slightly.
For use on servers that have a mainly creative purpose, the setting
enable_corium_griefing=false will prevent corium from flowing far or
unpredictably and from destroying nodes other than water. All reactor
meltdowns will stay contained.
Reactor `explosion' now replaces the reactor core with a corium source
node. Corium is a new liquid, which flows a bit like lava, but has
the additional feature of destroying nodes to which it is adjacent.
It also randomly turns into a solid form, chernobylite, which makes an
attractive building block. It thus gradually melts its way through the
reactor shielding layers; a meltdown gets worse over time if not cleaned
up promptly.
The mechanism for an active reactor core to damage nearby players is
generalised into a "radioactive" node group. Corium and chernobylite
are radioactive, to varying degrees. Players receive a varying amount of
damage from a radioactive node, depending on proximity. Staying outside
a reactor cube is sufficient to be safe from the active core, but not
sufficient to be safe from a melted core.
Drop support for negative mesecon control. This requires users of
negative mesecon control to invert their mesecon signal externally.
Comment on rationale for the way toggle buttons in formspec are managed.
The code formerly attempted to make the forcefield emitter controlled
both manually and by (inverted) mesecon signal, but the two interfered
with each other. In particular, a newly-placed emitted would be
informed that it was getting no mesecon signal, and would therefore
enable itself. Fix this by adding explicit modes for how the emitter
will respond to mesecon signals: ignore them, obey them positively,
or obey them negatively.
The manual control could have been incorporated into this mode setting
by having two "ignore mesecon" modes: always-enabled and always-disabled.
But it seems more useful to have a separate manual master switch, so that
the emitter can be manually disabled without losing the mesecon mode.
So it is now implemented that way.
LV cables are now paper-insulated, rather than uninsulated (which made
no sense). MV cables are rubber-insulated as before. HV cables are now
plastic-insulated (which they already visually appeared to be). MV and
HV cables are still crafted by adding insulation onto lower-tier cable,
rather than by insulating raw copper; this matches the way machines are
upgraded between tiers rather than crafted afresh.
All electric machine recipes now include cable of the appropriate tier
as the bottom-middle ingredient, immediately below the casing ingredient.
Many LV machines were using a copper ingot in that location.
The size configuration is no longer cleared when exiting the dialog with
<esc>. The enable/disable toggle button now indicates the current state.
The name of the toggle button now varies according to state, so that
pressing the button multiple times in one state (which can arise due
to lag making the user unsure about whether the first press registered)
only makes the state change that the user requested, rather than toggling
repeatedly.
All electrically-powered machines now consistently indicate their
tier (supply voltage) in their names. As this implies that they are
electrically powered, the furnaces no longer have "Electric" in their
names. The fuel-fired equivalents of electric machines, which exist
for alloy furnace and furnace, now say "Fuel-Fired" to distinguish them.
(The fuel-fired alloy furnace used to say "Coal", which was inaccurate
because it uses any fuel. The fuel-fired furnace, from the default mod,
used to just be called "Furnace", which is ambiguous.)
Electric power generators now consistently indicate their tier and have
the word "Generator" in their names. This makes their purpose much
clearer, and makes obvious craft guide searches produce useful results.
The fuel-fired generators, previously just (ambiguously) called
"Generator", are now explicitly "Fuel-Fired".
The size configuration is no longer cleared when exiting the dialog with
<esc>. The enable/disable toggle button now indicates the current state.
The name of the toggle button now varies according to state, so that
pressing the button multiple times in one state (which can arise due
to lag making the user unsure about whether the first press registered)
only makes the state change that the user requested, rather than toggling
repeatedly.