From 9a0d3f216619b84dd818aff94efb6738de9b7622 Mon Sep 17 00:00:00 2001
From: kpoppel <poulsen.kim@gmail.com>
Date: Thu, 04 Jul 2013 21:33:27 +0200
Subject: [PATCH] Forcefield now working with updated power scheme.

---
 technic/forcefield.lua |  196 ++++++++++++++++++++++++++----------------------
 1 files changed, 105 insertions(+), 91 deletions(-)

diff --git a/technic/forcefield.lua b/technic/forcefield.lua
index 8af98f4..98201e8 100644
--- a/technic/forcefield.lua
+++ b/technic/forcefield.lua
@@ -1,7 +1,9 @@
---Forcefield mod by ShadowNinja
+-- Forcefield mod by ShadowNinja
+-- Modified by kpoppel
+--
+-- Forcefields are powerful barriers but they consume huge amounts of power.
+-- Forcefield Generator is a HV machine.
 
-local forcefield_emitter_buffer_size = 10000
-local forcefield_emitter_power_consumption = 0.8
 local forcefield_update_interval = 1
 
 minetest.register_craft({
@@ -13,22 +15,13 @@
 	}
 })
 
-local function get_forcefield_count(range)
-	local count = 0
-	for x=-range,range do
-	for y=-range,range do
-	for z=-range,range do
-		if ((x*x+y*y+z*z) <= (range * range + range)) then
-			if (y == 0) or ((range-1) * (range-1) + (range-1) <= x*x+y*y+z*z) then
-				count = count + 1
-			end
-		end
-	end
-	end
-	end
-	return count
-end
-
+-- Idea: Let forcefields have different colors by upgrade slot.
+-- Idea: Let forcefields add up by detecting if one hits another.
+--    ___   __
+--   /   \/   \
+--  |          |
+--   \___/\___/
+--
 local function add_forcefield(pos, range)
 	for x=-range,range do
 	for y=-range,range do
@@ -66,69 +59,90 @@
 	end
 end
 
-local forcefield_receive_fields = function(pos, formname, fields, sender)
-	local meta = minetest.env:get_meta(pos)
-	local range = meta:get_int("range")
-	if fields.add then range = range + 1 end
-	if fields.subtract then range = range - 1 end
-	if fields.toggle then
-		if meta:get_int("enabled") == 1 then
-			meta:set_int("enabled", 0)
-		else
-			meta:set_int("enabled", 1)
-		end
-	end
-	if range <= 20 and range >= 0 and meta:get_int("range") ~= range then
-		remove_forcefield(pos, meta:get_int("range"))
-		meta:set_int("range", range)
-		local buffer = meta:get_float("internal_EU_buffer")
-		local buffer_size = meta:get_float("internal_EU_buffer_size")
-		local load = math.floor(buffer / buffer_size * 100)
-		meta:set_string("formspec", get_forcefield_formspec(range, 0))
-	end
+local get_forcefield_formspec = function(range)
+   --	return "invsize[8,9;]"..  (if upgrades added later - colors for instance)
+	return "invsize[3,4;]"..
+	"label[0,0;Forcefield emitter]"..
+	"label[1,1;Range]"..
+	"label[1,2;"..range.."]"..
+	"button[0,2;1,1;subtract;-]"..
+	"button[2,2;1,1;add;+]"..
+	"button[0,3;3,1;toggle;Enable/Disable]" -- ..
+--	"list[current_player;main;0,5;8,4;]"
 end
 
-local get_forcefield_formspec = function(range, load)
-	if not load then load = 0 end
-	return "invsize[8,9;]"..
-	"label[0,0;Forcefield emitter]"..
-	"label[1,3;Power level]"..
-	"image[1,1;1,2;technic_power_meter_bg.png^[lowpart:"..
-	load..":technic_power_meter_fg.png]"..
-	"label[4,1;Range]"..
-	"label[4,2;"..range.."]"..
-	"button[3,2;1,1;add;+]"..
-	"button[5,2;1,1;subtract;-]"..
-	"button[3,3;3,1;toggle;Enable/Disable]"..
-	"list[current_player;main;0,5;8,4;]"
-end
+local forcefield_receive_fields = function(pos, formname, fields, sender)
+				     local meta = minetest.env:get_meta(pos)
+				     local range = meta:get_int("range")
+				     if fields.add then range = range + 1 end
+				     if fields.subtract then range = range - 1 end
+				     if fields.toggle then
+					if meta:get_int("enabled") == 1 then
+					   meta:set_int("enabled", 0)
+					else
+					   meta:set_int("enabled", 1)
+					end
+				     end
+				     -- Smallest field is 5. Anything less is asking for trouble.
+				     -- Largest is 20. It is a matter of pratical node handling.
+				     if range < 5  then range = 5 end
+				     if range > 20 then range = 20 end
+
+				     if range <= 20 and range >= 5 and meta:get_int("range") ~= range then
+					remove_forcefield(pos, meta:get_int("range"))
+					meta:set_int("range", range)
+					meta:set_string("formspec", get_forcefield_formspec(range))
+				     end
+				  end
 
 local forcefield_check = function(pos)
-	local meta = minetest.env:get_meta(pos)
-	local node = minetest.env:get_node(pos)
-	local internal_EU_buffer=meta:get_float("internal_EU_buffer")
-	local internal_EU_buffer_size=meta:get_float("internal_EU_buffer_size")
+			    local meta = minetest.env:get_meta(pos)
+			    local node = minetest.env:get_node(pos)
+			    local eu_input   = meta:get_int("HV_EU_input")
+			    local eu_demand  = meta:get_int("HV_EU_demand")
+			    local enabled    = meta:get_int("enabled")
+			    
+			    -- Power off automatically if no longer connected to a switching station
+			    technic.switching_station_timeout_count(pos, "HV")
 
-	local load = math.floor(internal_EU_buffer/internal_EU_buffer_size * 100)
-	meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range"), load))
+			    local power_requirement
+			    if enabled == 1 then
+			       power_requirement = math.floor(4*math.pi*math.pow(meta:get_int("range"), 2)) * 1
+			    else
+			       power_requirement = eu_demand
+			    end
 
-	local power_requirement = get_forcefield_count(meta:get_int("range")) * forcefield_emitter_power_consumption
-	if meta:get_int("enabled") == 1 and internal_EU_buffer >= power_requirement then
-		if node.name == "technic:forcefield_emitter_off" then
-			hacky_swap_node(pos, "technic:forcefield_emitter_on")
-		end
-		internal_EU_buffer=internal_EU_buffer-power_requirement;
-		meta:set_float("internal_EU_buffer", internal_EU_buffer)
-		add_forcefield(pos, meta:get_int("range"))
-	else
-		if node.name == "technic:forcefield_emitter_on" then
-			remove_forcefield(pos, meta:get_int("range"))
-			hacky_swap_node(pos, "technic:forcefield_emitter_off")
-		end
-	end
-	return true
-
-end
+			    if eu_input == 0 then
+			       meta:set_string("infotext", "Forcefield Generator Unpowered")
+			       meta:set_int("HV_EU_demand", 100)
+			       if node.name == "technic:forcefield_emitter_on" then
+				  remove_forcefield(pos, meta:get_int("range"))
+				  hacky_swap_node(pos, "technic:forcefield_emitter_off")
+				  meta:set_int("enabled", 0)
+			       end
+			    elseif eu_input == power_requirement then
+			       if meta:get_int("enabled") == 1 then
+				  if node.name == "technic:forcefield_emitter_off" then
+				     hacky_swap_node(pos, "technic:forcefield_emitter_on")
+				     meta:set_string("infotext", "Forcefield Generator Active")
+				     add_forcefield(pos, meta:get_int("range"))
+				  else
+				     -- Range updated. Move the forcefield.
+				     add_forcefield(pos, meta:get_int("range"))
+				  end
+			       else
+				  if node.name == "technic:forcefield_emitter_on" then
+				     remove_forcefield(pos, meta:get_int("range"))
+				     hacky_swap_node(pos, "technic:forcefield_emitter_off")
+				     meta:set_int("HV_EU_demand", 100)
+				     meta:set_string("infotext", "Forcefield Generator Idle")
+				  end
+			       end
+			    else
+			       meta:set_int("HV_EU_demand", power_requirement)
+			    end
+			    return true
+			 end
 
 local mesecons = {effector = {
 	action_on = function(pos, node)
@@ -150,12 +164,12 @@
 	on_construct = function(pos)
 		minetest.env:get_node_timer(pos):start(forcefield_update_interval)
 		local meta = minetest.env:get_meta(pos)
-		meta:set_float("technic_power_machine", 1)
-		meta:set_float("internal_EU_buffer", 0)
-		meta:set_float("internal_EU_buffer_size", forcefield_emitter_buffer_size)
+		meta:set_float("technic_hv_power_machine", 1)
+		meta:set_int("HV_EU_input", 0)
+		meta:set_int("HV_EU_demand", 0)
 		meta:set_int("range", 10)
-		meta:set_int("enabled", 1)
-		meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range", 0)))
+		meta:set_int("enabled", 0)
+		meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range")))
 		meta:set_string("infotext", "Forcefield emitter");
 	end,
 	mesecons = mesecons
@@ -172,19 +186,18 @@
 	on_construct = function(pos) 
 		minetest.env:get_node_timer(pos):start(forcefield_update_interval)
 		local meta = minetest.env:get_meta(pos)
-		meta:set_float("technic_power_machine", 1)
-		meta:set_float("internal_EU_buffer", 0)
-		meta:set_float("internal_EU_buffer_size", forcefield_emitter_buffer_size)
-		meta:set_int("range", 10)
-		meta:set_int("enabled", 1)
-		meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range"), 0))
-		meta:set_string("infotext", "Forcefield emitter");
+--		meta:set_float("technic_hv_power_machine", 1)
+--		meta:set_float("HV_EU_input", 0)
+--		meta:set_float("HV_EU_demand", 0)
+--		meta:set_int("range", 10)
+--		meta:set_int("enabled", 1)
+		meta:set_string("formspec", get_forcefield_formspec(meta:get_int("range")))
+--		meta:set_string("infotext", "Forcefield emitter");
 	end,
 	on_dig = function(pos, node, digger)	
 		remove_forcefield(pos, minetest.env:get_meta(pos):get_int("range"))
 		return minetest.node_dig(pos, node, digger)
 	end,
-	technic_power_machine=1,
 	mesecons = mesecons
 })
 
@@ -192,6 +205,7 @@
 	description = "Forcefield (you hacker you)",
 	sunlight_propagates = true,
 	drop = '',
+        light_source = 8,
 	tiles = {{name="technic_forcefield_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}}},
 	is_ground_content = true,
 	groups = {not_in_creative_inventory=1, unbreakable=1},
@@ -205,5 +219,5 @@
 	},
 })
 
-technic.register_MV_machine("technic:forcefield_emitter_on","RE")
-technic.register_MV_machine("technic:forcefield_emitter_off","RE")
+technic.register_HV_machine("technic:forcefield_emitter_on","RE")
+technic.register_HV_machine("technic:forcefield_emitter_off","RE")

--
Gitblit v1.8.0