Rebalance radiation shielding

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.
This commit is contained in:
Zefram 2014-08-20 20:09:41 +01:00
parent 7a9d2ffe5f
commit 2912e2da78
1 changed files with 23 additions and 12 deletions

View File

@ -293,7 +293,7 @@ minetest.register_node("technic:hv_nuclear_reactor_core_active", {
tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", tiles = {"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png",
"technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"}, "technic_hv_nuclear_reactor_core.png", "technic_hv_nuclear_reactor_core.png"},
groups = {cracky=1, technic_machine=1, radioactive=7000, not_in_creative_inventory=1}, groups = {cracky=1, technic_machine=1, radioactive=11000, not_in_creative_inventory=1},
legacy_facedir_simple = true, legacy_facedir_simple = true,
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
drop="technic:hv_nuclear_reactor_core", drop="technic:hv_nuclear_reactor_core",
@ -548,14 +548,18 @@ end
-- --
-- Shielding is assessed by sampling every 0.25 m along the path -- Shielding is assessed by sampling every 0.25 m along the path
-- from the source to the player, ignoring the source node itself. -- from the source to the player, ignoring the source node itself.
-- The summed radiation resistance values from the sampled nodes yield -- The summed shielding values from the sampled nodes yield a measure
-- a measure of the total amount of radiation resistance on the path. -- of the total amount of shielding on the path. As in reality,
-- As in reality, shielding causes exponential attenuation of radiation. -- shielding causes exponential attenuation of radiation. However, the
-- However, the effect is scaled down relative to real life: each -- effect is scaled down relative to real life. A metre of a node with
-- metre-point of shielding, corresponding to a real-life halving of -- radiation resistance value R yields attenuation of sqrt(R)*0.1 nepers.
-- radiation, reduces radiation by 0.01 nepers (a factor of about 1.01). -- (In real life it would be about R*0.69 nepers, by the definition
-- This scales down the difference between shielded and unshielded safe -- of the radiation resistance values.) The sqrt part of this formula
-- distances, avoiding the latter becoming impractically large. -- scales down the differences between shielding types, reflecting the
-- game's simplification of making expensive materials such as gold
-- readily available in cubic metres. The multiplicative factor in the
-- formula scales down the difference between shielded and unshielded
-- safe distances, avoiding the latter becoming impractically large.
-- --
-- Damage is processed at rates down to 0.25 HP/s, which in the absence of -- Damage is processed at rates down to 0.25 HP/s, which in the absence of
-- shielding is attained at the distance specified by the "radioactive" -- shielding is attained at the distance specified by the "radioactive"
@ -565,6 +569,7 @@ end
-- need to be considered. -- need to be considered.
local assumed_abdomen_offset = vector.new(0, 1, 0) local assumed_abdomen_offset = vector.new(0, 1, 0)
local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset) local assumed_abdomen_offset_length = vector.length(assumed_abdomen_offset)
local cache_scaled_shielding = {}
minetest.register_abm({ minetest.register_abm({
nodenames = {"group:radioactive"}, nodenames = {"group:radioactive"},
interval = 1, interval = 1,
@ -578,15 +583,21 @@ minetest.register_abm({
local dist = math.sqrt(dist_sq) local dist = math.sqrt(dist_sq)
local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4) local dirstep = dist == 0 and vector.new(0,0,0) or vector.divide(rel, dist*4)
local intpos = pos local intpos = pos
local resistance = 0 local shielding = 0
for intdist = 0.25, dist, 0.25 do for intdist = 0.25, dist, 0.25 do
intpos = vector.add(intpos, dirstep) intpos = vector.add(intpos, dirstep)
local intnodepos = vector.round(intpos) local intnodepos = vector.round(intpos)
if not vector.equals(intnodepos, pos) then if not vector.equals(intnodepos, pos) then
resistance = resistance + node_radiation_resistance(minetest.get_node(intnodepos).name) local sname = minetest.get_node(intnodepos).name
local sval = cache_scaled_shielding[sname]
if not sval then
sval = math.sqrt(node_radiation_resistance(sname)) * -0.025
cache_scaled_shielding[sname] = sval
end
shielding = shielding + sval
end end
end end
local dmg_rate = 0.25e-6 * strength*strength * math.exp(-0.0025*resistance) / math.max(0.75, dist_sq) local dmg_rate = 0.25e-6 * strength*strength * math.exp(shielding) / math.max(0.75, dist_sq)
if dmg_rate >= 0.25 then if dmg_rate >= 0.25 then
local dmg_int = math.floor(dmg_rate) local dmg_int = math.floor(dmg_rate)
if math.random() < dmg_rate-dmg_int then if math.random() < dmg_rate-dmg_int then