--[[

	TechAge
	=======

	Copyright (C) 2019 Joachim Stolberg

	AGPL v3
	See LICENSE.txt for more information
	
	Biogas flare

]]--


local HEIGHT = 7

local function remove_flame(pos)
	local idx
	for idx=HEIGHT,1,-1 do
		pos = {x=pos.x, y=pos.y+1, z=pos.z}
		local node = minetest.get_node(pos)
		if string.find(node.name, "techage:flame") then
			minetest.remove_node(pos)
		end
	end
end

local function flame(pos)
	local idx
	for idx=HEIGHT,1,-1 do
		pos = {x=pos.x, y=pos.y+1, z=pos.z}
		idx = math.min(idx, 12)
		local node = minetest.get_node(pos)
		if node.name ~= "air" then
			return
		end
		minetest.add_node(pos, {name = "techage:flame"..math.min(idx,7)})
		local meta = minetest.get_meta(pos)
	end
end


local lRatio = {120, 110, 95, 75, 55, 28, 0}
local lColor = {"000080", "400040", "800000", "800000", "800000", "800000", "800000"}
for idx,ratio in ipairs(lRatio) do
	local color = "techage_flame_animated.png^[colorize:#"..lColor[idx].."B0:"..ratio
	minetest.register_node("techage:flame"..idx, {
		drawtype = "nodebox",
		node_box = {
			type = "fixed",
			fixed = {
				{-3/8, -4/8, -2/8,  3/8, 4/8, 2/8},
				{-2/8, -4/8, -3/8,  2/8, 4/8, 3/8},
			},
		},
		tiles = {
			{
				name = color,
				animation = {
					type = "vertical_frames",
					aspect_w = 16,
					aspect_h = 16,
					length = 1
				},
			},
		},
		
		after_destruct = function(pos, oldnode)
			pos.y = pos.y + 1
			local node = minetest.get_node(pos)
			if minetest.get_item_group(node.name, "techage_flame") > 0 then
				minetest.remove_node(pos)
			end
		end,
		
		use_texture_alpha = true,
		inventory_image = "techage_flame.png",
		paramtype = "light",
		light_source = 13,
		walkable = false,
		pointable = false,
		diggable = false,
		buildable_to = true,
		is_ground_content = false,
		drop = "",
		drowning = 1,
		damage_per_second = 4 + idx,
		groups = {igniter = 2, dig_immediate = 3, techage_flame=1, not_in_creative_inventory=1},
		drop = "",
	})
end

local function start_flarestack(pos, playername)
	if minetest.is_protected(
			{x=pos.x, y=pos.y+1, z=pos.z}, 
			playername) then
		return
	end
	local meta = minetest.get_meta(pos)
	flame({x=pos.x, y=pos.y+1, z=pos.z})
	local handle = minetest.sound_play("gasflare", {
			pos = pos, 
			max_hear_distance = 20, 
			gain = 1, 
			loop = true})
	--print("handle", handle)
	meta:set_int("handle", handle)
end

local function stop_flarestack(pos, handle)
	remove_flame({x=pos.x, y=pos.y+1, z=pos.z})
	minetest.sound_stop(handle)
end

minetest.register_node("techage:gasflare", {
	description = "gas flare",
	tiles = {
		"techage_gasflare.png",
		"techage_gasflare.png",
		"techage_gasflare.png",
		"techage_gasflare.png",
		"techage_gasflare.png",
		"techage_gasflare.png^techage_appl_hole2.png",
	},
	
	after_place_node = function(pos, placer, itemstack, pointed_thing)
		local node = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
		if node.name ~= "air" then
			return
		end
		minetest.add_node({x=pos.x, y=pos.y+1, z=pos.z}, {name = "techage:gasflare2"})
	end,
	
	on_punch = function(pos, node, puncher)
		local meta = minetest.get_meta(pos)
		local handle = meta:get_int("handle")
		minetest.sound_stop(handle)
		start_flarestack(pos, puncher:get_player_name())
	end,
	
	after_dig_node = function(pos, oldnode, oldmetadata, digger)
		--print(dump(oldmetadata))
		stop_flarestack(pos, oldmetadata.fields.handle)
		local node = minetest.get_node({x=pos.x, y=pos.y+1, z=pos.z})
		if node.name == "techage:gasflare2" then
			minetest.remove_node({x=pos.x, y=pos.y+1, z=pos.z})
		end
	end,

	paramtype = "light",
	light_source = 0,	
	sunlight_propagates = true,
	paramtype2 = "facedir",
	groups = {cracky=2, crumbly=2, choppy=2},
	is_ground_content = false,
	sounds = default.node_sound_stone_defaults(),
})

minetest.register_node("techage:gasflare2", {
	description = "",
	tiles = {
		"techage_gasflare.png^techage_appl_hole2.png",
		"techage_gasflare.png"
	},
	
	drawtype = "nodebox",
	node_box = {
		type = "fixed",
		fixed = {
			{-1/8, -4/8, -1/8,  1/8, 4/8, 1/8},
			{-4/8,  3/8, -4/8,  4/8, 4/8, 4/8},
		},
	},
	paramtype = "light",
	light_source = 0,	
	sunlight_propagates = true,
	paramtype2 = "facedir",
	diggable = false,
	is_ground_content = false,
	sounds = default.node_sound_stone_defaults(),
})
