forked from minetest-mods/technic
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:
parent
7a9d2ffe5f
commit
2912e2da78
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user