--------------------------------------------------
-- Tunnel tube

-- Magenta
-- curving trunk
-- Max trunk height 	8
-- depth 2-3

-- internationalization boilerplate
local MP = minetest.get_modpath(minetest.get_current_modname())
local S, NS = dofile(MP.."/intllib.lua")

minetest.register_node("dfcaverns:tunnel_tube", {
	description = S("Tunnel Tube"),
	tiles = {"dfcaverns_tunnel_tube.png"},
	paramtype2 = "facedir",
	drawtype = "nodebox",
	paramtype = "light",
	groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2},
	sounds = default.node_sound_wood_defaults(),
	on_place = minetest.rotate_node,
	
	node_box = {
		type = "fixed",
		fixed = {
			{-8/16,-8/16,-8/16,-4/16,8/16,8/16},
			{4/16,-8/16,-8/16,8/16,8/16,8/16},
			{-4/16,-8/16,-8/16,4/16,8/16,-4/16},
			{-4/16,-8/16,8/16,4/16,8/16,4/16},
		},
	},
})

--Wood
minetest.register_craft({
	output = 'dfcaverns:tunnel_tube_wood 4',
	recipe = {
		{'dfcaverns:tunnel_tube'},
	}
})

minetest.register_node("dfcaverns:tunnel_tube_wood", {
	description = S("Tunnel Tube Plies"),
	paramtype2 = "facedir",
	place_param2 = 0,
	tiles = {"dfcaverns_tunnel_tube_wood_top.png", "dfcaverns_tunnel_tube_wood_top.png", "dfcaverns_tunnel_tube_wood_side.png"},
	is_ground_content = false,
	groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
	sounds = default.node_sound_wood_defaults(),
})

minetest.register_craft({
	type = "fuel",
	recipe = "dfcaverns:tunnel_tube_wood",
	burntime = 9,
})
minetest.register_craft({
	type = "fuel",
	recipe = "dfcaverns:tunnel_tube",
	burntime = 36,
})
minetest.register_craft({
	type = "fuel",
	recipe = "dfcaverns:tunnel_tube_sapling",
	burntime = 3,
})


minetest.register_node("dfcaverns:tunnel_tube_fruiting_body", {
	description = S("Tunnel Tube Fruiting Body"),
	tiles = {"dfcaverns_tunnel_tube.png^[multiply:#b09090"},
	paramtype2 = "facedir",
	groups = {choppy = 3, oddly_breakable_by_hand=1, flammable = 2},
	sounds = default.node_sound_wood_defaults(),
	on_place = minetest.rotate_node,
	
	drop = {
		max_items = 3,
		items = {
			{
				items = {'dfcaverns:tunnel_tube_sapling'},
				rarity = 2,
			},
			{
				items = {'dfcaverns:tunnel_tube_sapling'},
				rarity = 2,
			},
			{
				items = {'dfcaverns:tunnel_tube_sapling'},
				rarity = 2,
			},
		}
	},
})

minetest.register_node("dfcaverns:tunnel_tube_sapling", {
	description = S("Tunnel Tube Spawn"),
	drawtype = "plantlike",
	visual_scale = 1.0,
	tiles = {"dfcaverns_tunnel_tube_sapling.png"},
	inventory_image = "dfcaverns_tunnel_tube_sapling.png",
	wield_image = "dfcaverns_tunnel_tube_sapling.png",
	paramtype = "light",
	sunlight_propagates = true,
	walkable = false,
	selection_box = {
		type = "fixed",
		fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
	},
	groups = {snappy = 2, dig_immediate = 3, flammable = 2,
		attached_node = 1, sapling = 1, light_sensitive_fungus = 11},
	sounds = default.node_sound_leaves_defaults(),

	on_construct = function(pos)
		minetest.get_node_timer(pos):start(math.random(
			dfcaverns.config.tunnel_tube_delay_multiplier*dfcaverns.config.tree_min_growth_delay,
			dfcaverns.config.tunnel_tube_delay_multiplier*dfcaverns.config.tree_max_growth_delay))
	end,
	
	on_timer = function(pos)
		minetest.set_node(pos, {name="air"})
		dfcaverns.spawn_tunnel_tube(pos)
	end,
})

local tunnel_tube_directions = {
	{x=1,y=0,z=0},
	{x=-1,y=0,z=0},
	{x=0,y=0,z=1},
	{x=0,y=0,z=-1},
--	{x=1,y=0,z=1}, -- diagonals work, but they don't look as nice as orthogonals
--	{x=-1,y=0,z=1},
--	{x=1,y=0,z=-1},
--	{x=-1,y=0,z=-1},
}

local tunnel_tube_curvature = {0,0,0,0,1,1,1,2,2,3,4}

dfcaverns.spawn_tunnel_tube = function(pos)
	local direction = tunnel_tube_directions[math.random(1,4)]
	local height = math.random(6,10)
	local x, y, z = pos.x, pos.y, pos.z
	local top_pos = vector.add(pos, vector.multiply(direction, tunnel_tube_curvature[height]))
	top_pos.y = y + height - 1

	local vm = minetest.get_voxel_manip()
	local minp, maxp = vm:read_from_map(pos, top_pos)
	local area = VoxelArea:new({MinEdge = minp, MaxEdge = maxp})
	local data = vm:get_data()
	local param2_data = vm:get_param2_data()

	dfcaverns.spawn_tunnel_tube_vm(area:indexp(pos), area, data, param2_data, height, direction)

	vm:set_data(data)
	vm:set_param2_data(param2_data)
	vm:write_to_map()
	vm:update_map()	
end

local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore")
local c_tunnel_tube = minetest.get_content_id("dfcaverns:tunnel_tube")
local c_tunnel_tube_fruiting_body  = minetest.get_content_id("dfcaverns:tunnel_tube_fruiting_body")

dfcaverns.spawn_tunnel_tube_vm = function(vi, area, data, param2_data, height, direction)
	if not height then height = math.random(6, 10) end
	if not direction then direction = tunnel_tube_directions[math.random(1,4)] end
	
	local pos = area:position(vi)
	local y = pos.y
	local previous_vi = vi
	for i = 1, height do
		pos.y = y + i - 1
		vi = area:indexp(vector.add(pos, vector.multiply(direction, tunnel_tube_curvature[i])))
		if data[vi] == c_air or data[vi] == c_ignore then
			previous_vi = vi
			if i ~= height then
				data[vi] = c_tunnel_tube
				param2_data[vi] = 0
			else
				data[vi] = c_tunnel_tube_fruiting_body
			end
		else
			data[previous_vi] = c_tunnel_tube_fruiting_body
			break
		end
	end
end