From 8ccb6d97ec88176b8006da685e54806e6e0c0b25 Mon Sep 17 00:00:00 2001
From: ShadowNinja <shadowninja@minetest.net>
Date: Sat, 28 Jan 2017 23:51:14 +0100
Subject: [PATCH] Switch nuclear reactor to a lead shield

---
 technic/machines/HV/nuclear_reactor.lua |   70 ++++++++++++++++++++++++-----------
 1 files changed, 48 insertions(+), 22 deletions(-)

diff --git a/technic/machines/HV/nuclear_reactor.lua b/technic/machines/HV/nuclear_reactor.lua
index c7951ab..fd3b774 100644
--- a/technic/machines/HV/nuclear_reactor.lua
+++ b/technic/machines/HV/nuclear_reactor.lua
@@ -110,18 +110,17 @@
 
 	CCCC CCCC
 	CBBB BBBC
-	CBSS SSBC
-	CBSWWWSBC
-	CBSW#WSBC
-	CBSW|WSBC
-	CBSS|SSBC
+	CBLL LLBC
+	CBLWWWLBC
+	CBLW#WLBC
+	CBLW|WLBC
+	CBLL|LLBC
 	CBBB|BBBC
 	CCCC|CCCC
-	C = Concrete, B = Blast-resistant concrete, S = Stainless Steel,
+	C = Concrete, B = Blast-resistant concrete, L = Lead,
 	W = water node, # = reactor core, | = HV cable
 
-The man-hole and the HV cable are only in the middle, and the man-hole
-is optional.
+The man-hole is optional (but necessary for refueling).
 
 For the reactor to operate and not melt down, it insists on the inner
 7x7x7 portion (from the core out to the blast-resistant concrete)
@@ -139,6 +138,9 @@
 implementation of radiation) it needs to continue being adequate
 shielding of legacy reactors.  If it ever ceases to be adequate
 shielding for new reactors, legacy ones should be grandfathered.
+
+For legacy reasons, if the reactor has a stainless steel layer instead
+of a lead layer it will be converted to a lead layer.
 --]]
 local function reactor_structure_badness(pos)
 	local vm = VoxelManip()
@@ -149,11 +151,12 @@
 	local area = VoxelArea:new({MinEdge=MinEdge, MaxEdge=MaxEdge})
 
 	local c_blast_concrete = minetest.get_content_id("technic:blast_resistant_concrete")
-	local c_stainless_steel = minetest.get_content_id("technic:stainless_steel_block")
+	local c_lead = minetest.get_content_id("technic:lead_block")
+	local c_steel = minetest.get_content_id("technic:stainless_steel_block")
 	local c_water_source = minetest.get_content_id("default:water_source")
 	local c_water_flowing = minetest.get_content_id("default:water_flowing")
 
-	local blastlayer, steellayer, waterlayer = 0, 0, 0
+	local blast_layer, steel_layer, lead_layer, water_layer = 0, 0, 0, 0
 
 	for z = pos1.z, pos2.z do
 	for y = pos1.y, pos2.y do
@@ -163,28 +166,51 @@
 		   y == pos1.y or y == pos2.y or
 		   z == pos1.z or z == pos2.z then
 			if cid == c_blast_concrete then
-				blastlayer = blastlayer + 1
+				blast_layer = blast_layer + 1
 			end
 		elseif x == pos1.x+1 or x == pos2.x-1 or
-		   y == pos1.y+1 or y == pos2.y-1 or
-		   z == pos1.z+1 or z == pos2.z-1 then
-			if cid == c_stainless_steel then
-				steellayer = steellayer + 1
+		       y == pos1.y+1 or y == pos2.y-1 or
+		       z == pos1.z+1 or z == pos2.z-1 then
+			if cid == c_lead then
+				lead_layer = lead_layer + 1
+			elseif cid == c_steel then
+				steel_layer = steel_layer + 1
 			end
 		elseif x == pos1.x+2 or x == pos2.x-2 or
-		   y == pos1.y+2 or y == pos2.y-2 or
-		   z == pos1.z+2 or z == pos2.z-2 then
+		       y == pos1.y+2 or y == pos2.y-2 or
+		       z == pos1.z+2 or z == pos2.z-2 then
 			if cid == c_water_source or cid == c_water_flowing then
-				waterlayer = waterlayer + 1
+				water_layer = water_layer + 1
 			end
 		end
 	end
 	end
 	end
-	if waterlayer > 25 then waterlayer = 25 end
-	if steellayer > 96 then steellayer = 96 end
-	if blastlayer > 216 then blastlayer = 216 end
-	return (25 - waterlayer) + (96 - steellayer) + (216 - blastlayer)
+
+	if steel_layer >= 96 then
+		for z = pos1.z+1, pos2.z-1 do
+		for y = pos1.y+1, pos2.y-1 do
+		for x = pos1.x+1, pos2.x-1 do
+			local vi = area:index(x, y, z)
+			if x == pos1.x+1 or x == pos2.x-1 or
+			   y == pos1.y+1 or y == pos2.y-1 or
+			   z == pos1.z+1 or z == pos2.z-1 then
+				if data[vi] == c_steel then
+					data[vi] = c_lead
+				end
+			end
+		end
+		end
+		end
+		vm:set_data(data)
+		vm:write_to_map()
+		lead_layer = steel_layer
+	end
+
+	if water_layer > 25 then water_layer = 25 end
+	if lead_layer > 96 then lead_layer = 96 end
+	if blast_layer > 216 then blast_layer = 216 end
+	return (25 - water_layer) + (96 - lead_layer) + (216 - blast_layer)
 end
 
 

--
Gitblit v1.8.0