mirror of
				https://github.com/FaceDeer/dfcaverns.git
				synced 2025-10-27 06:15:31 +01:00 
			
		
		
		
	puzzle seals now fully functional. Need to add clues for decoding the keys next.
This commit is contained in:
		| @@ -224,11 +224,8 @@ local get_pit = function(pos) | ||||
| 	local radius = variance_multiplier * (radius_pit_max - 15) + 15 | ||||
| 	local variance = radius_pit_variance/2 + radius_pit_variance*variance_multiplier/2 | ||||
| 	local depth = math.random(plasma_depth_min, plasma_depth_max) | ||||
| 	 | ||||
| 	local shaft_seed = math.random() | ||||
| 	local shaft_location = corner_xz | ||||
| 	math.randomseed(next_seed) | ||||
| 	return {location = location, radius = radius, variance = variance, depth = depth}, {seed = shaft_seed, location = shaft_location} | ||||
| 	return {location = location, radius = radius, variance = variance, depth = depth} | ||||
| end | ||||
|  | ||||
| local perlin_pit = { | ||||
| @@ -248,10 +245,9 @@ minetest.register_chatcommand("find_pit", { | ||||
| 	decription = "find a nearby glowing pit", | ||||
| 	func = function(name, param) | ||||
| 		local player = minetest.get_player_by_name(name) | ||||
| 		local pit, shaft = get_pit(player:get_pos()) | ||||
| 		local pit = get_pit(player:get_pos()) | ||||
| 		if pit then | ||||
| 			minetest.chat_send_player(name, "Pit location: x=" .. math.floor(pit.location.x) .. " z=" .. math.floor(pit.location.z)) | ||||
| 			minetest.chat_send_player(name, "Shaft location: x=" .. math.floor(shaft.location.x) .. " z=" .. math.floor(shaft.location.z)) | ||||
| 		end | ||||
| 	end, | ||||
| }) | ||||
| @@ -273,7 +269,7 @@ minetest.register_on_generated(function(minp, maxp, seed) | ||||
| 	local nvals_wave = mapgen_helper.perlin2d("df_caverns:underworld_wave", emin, emax, perlin_wave) --cave noise for structure | ||||
| 	local nvals_zone = mapgen_helper.perlin2d("df_caverns:underworld_zone", emin, emax, perlin_zone) --building zones | ||||
| 	 | ||||
| 	local pit, shaft = get_pit(minp) | ||||
| 	local pit = get_pit(minp) | ||||
| 	--minetest.chat_send_all(minetest.pos_to_string(pit.location)) | ||||
|  | ||||
| 	local buildings = get_buildings(emin, emax, nvals_zone) | ||||
| @@ -300,7 +296,7 @@ minetest.register_on_generated(function(minp, maxp, seed) | ||||
| 				then | ||||
| 					-- there's a pit nearby | ||||
| 					if pit_uninitialized then | ||||
| 						nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit) -- determine which areas are spongey with warrens | ||||
| 						nvals_pit, area_pit = mapgen_helper.perlin3d("df_cavern:perlin_cave", minp, maxp, perlin_pit) | ||||
| 						pit_uninitialized = false | ||||
| 					end | ||||
| 					local pit_value = nvals_pit[area_pit:index(x,y,z)] * pit.variance | ||||
| @@ -401,7 +397,7 @@ minetest.register_on_generated(function(minp, maxp, seed) | ||||
| 	 | ||||
| 	-- puzzle seal | ||||
| 	local puzzle_seal = nil	 | ||||
| 	if pit_uninitialized and minp.x == shaft.location.x and minp.z == shaft.location.z then | ||||
| 	if pit_uninitialized and math.random() < 0.025 then | ||||
| 		local index2d = mapgen_helper.index2d(emin, emax, minp.x + 3, minp.z + 3) | ||||
| 		local abs_cave = math.abs(nvals_cave[index2d]) -- range is from 0 to approximately 2, with 0 being connected and 2s being islands | ||||
| 		local wave = nvals_wave[index2d] * wave_mult | ||||
| @@ -429,7 +425,9 @@ minetest.register_on_generated(function(minp, maxp, seed) | ||||
| 	 | ||||
| 	if puzzle_seal ~= nil then | ||||
| 		minetest.place_schematic({x=puzzle_seal.x-3, y=puzzle_seal.y, z=puzzle_seal.z-3}, df_underworld_items.seal_temple_schem, 0, {}, true) | ||||
| 		minetest.set_node(puzzle_seal, {name="df_underworld_items:puzzle_seal"}) | ||||
| 		local node_name = minetest.get_node(puzzle_seal).name | ||||
| 		local node_def = minetest.registered_nodes[node_name] | ||||
| 		node_def.on_construct(puzzle_seal) | ||||
| 	end | ||||
| 	 | ||||
| 	if bones_loot_path then | ||||
|   | ||||
| @@ -4,23 +4,148 @@ local S, NS = dofile(MP.."/intllib.lua") | ||||
|  | ||||
| local invulnerable = df_underworld_items.config.invulnerable_slade and not minetest.settings:get_bool("creative_mode") | ||||
|  | ||||
| local get_formspec = function(pos, completion) | ||||
| 	completion = completion or 0.5 | ||||
| -- Ensures that the node is functioning correctly | ||||
| local ensure_meta = function(pos) | ||||
|     local meta = minetest.get_meta(pos) | ||||
| 	if not meta:contains("key") then | ||||
| 		local inv = meta:get_inventory() | ||||
| 		inv:set_size("main", 8) | ||||
| 		local next_seed = math.random() * 2^21 | ||||
| 		math.randomseed(pos.x + pos.z^16) | ||||
| 		-- Key is consistent with location | ||||
| 		local key = {math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7), math.random(0,7),math.random(0,7), math.random(0,7)} | ||||
| 		math.randomseed(next_seed) | ||||
| 		meta:set_string("key", minetest.serialize(key)) | ||||
| 		meta:mark_as_private("key") | ||||
| 	end | ||||
| 	 | ||||
| 	local timer = minetest.get_node_timer(pos) | ||||
| 	if not timer:is_started() then | ||||
| 		timer:start(4) | ||||
| 	end | ||||
| end | ||||
|  | ||||
| local colour_groups = { | ||||
| 	"color_black",	-- 0 | ||||
| 	"color_red",	-- 1 | ||||
| 	"color_orange",	-- 2 | ||||
| 	"color_yellow",	-- 3 | ||||
| 	"color_green",	-- 4 | ||||
| 	"color_blue",	-- 5 | ||||
| 	"color_violet",	-- 6 | ||||
| 	"color_white"}	-- 7 | ||||
|  | ||||
| local test_key = function(pos) | ||||
|     local meta = minetest.get_meta(pos) | ||||
| 	if not meta:contains("key") then | ||||
| 		return false | ||||
| 	end | ||||
| 		 | ||||
| 	local keystring = meta:get_string("key") | ||||
| 	local key = minetest.deserialize(keystring) | ||||
| 	local inv = meta:get_inventory() | ||||
| 	 | ||||
| 	for offset = 0, 7 do | ||||
| 		local valid | ||||
| 		for i = 0, 7 do | ||||
| 			valid = true | ||||
| 			local keyval = (i + offset) % 8 + 1 | ||||
| 			local key_group = colour_groups[key[keyval]+1] | ||||
| 			local item = inv:get_stack("main", i+1) | ||||
| 			if minetest.get_item_group(item:get_name(), key_group) == 0 then | ||||
| 				valid = false | ||||
| 				break | ||||
| 			end | ||||
| 		end | ||||
| 		if valid then | ||||
| 			meta:set_int("unlocked", 1) | ||||
| 			return true | ||||
| 		end | ||||
| 	end | ||||
| 	meta:set_int("unlocked", 0) | ||||
| 	return false | ||||
| end | ||||
|  | ||||
| local formspec_prefix = "df_underworld_items_puzzle_seal:" | ||||
| local get_formspec = function(pos, unlocked) | ||||
| 	local formspec =  | ||||
| 		"size[10,10]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1,1;3,3;]" | ||||
| 		.."container[5,0.5]" | ||||
| 		.."box[0,0;1,5;#0A0000]box[0.1,0.1;0.8,4.8;#000000]box[0.1," .. 0.1 + 4.8*completion ..";0.8,".. 4.8*completion ..";#FFCC22]" | ||||
| 		"size[8,8]" | ||||
| 		.."container[2.25,0]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0.25,0.25;1,1;0]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1.25,0;1,1;1]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.25,0.25;1,1;2]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.5,1.25;1,1;3]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;2.25,2.25;1,1;4]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;1.25,2.5;1,1;5]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0.25,2.25;1,1;6]" | ||||
| 		.."list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,1.25;1,1;7]" | ||||
| 	if unlocked then | ||||
| 		formspec = formspec .. "image_button[1.25,1.25;1,1;dfcaverns_seal.png;open;"..S("Turn").."]" | ||||
| 	else | ||||
| 		formspec = formspec .. "image[1.25,1.25;1,1;dfcaverns_seal.png]" | ||||
| 	end | ||||
| 	 | ||||
| 	formspec = formspec | ||||
| 		.."container_end[]" | ||||
| 		.."container[1,5.75]list[current_player;main;0,0;8,1;]listring[]" | ||||
| --		.."container[5,0.5]" | ||||
| --		.."box[0,0;1,5;#0A0000]box[0.1,0.1;0.8,4.8;#000000]box[0.1," .. 0.1 + 4.8*completion ..";0.8,".. 4.8*completion ..";#FFCC22]" | ||||
| --		.."container_end[]" | ||||
| 		.."container[0,4]list[current_player;main;0,0;8,1;]listring[]" | ||||
| 		.."list[current_player;main;0,1.25;8,3;8]container_end[]" | ||||
| 	return formspec | ||||
| end | ||||
| local refresh_formspec = function(pos, player) | ||||
| 	local player_name = player:get_player_name() | ||||
| 	local unlocked = test_key(pos) | ||||
| 	local formspec = get_formspec(pos, unlocked) | ||||
| 	minetest.show_formspec(player_name, formspec_prefix..minetest.pos_to_string(pos), formspec) | ||||
| end | ||||
|  | ||||
| local ensure_inventory = function(pos) | ||||
| local show_key = function(pos, index) | ||||
|     minetest.sound_play("dfcaverns_seal_key", { | ||||
|         pos = pos, | ||||
|         gain = 0.125, | ||||
|         max_hear_distance = 16, | ||||
|     }) | ||||
|     local meta = minetest.get_meta(pos) | ||||
| 	local inv = meta:get_inventory() | ||||
| 	inv:set_size("main", 3*3) | ||||
| 	local keystring = meta:get_string("key") | ||||
| 	local key = minetest.deserialize(keystring) | ||||
| 	--minetest.chat_send_all(keystring) | ||||
| 	local minpos = vector.add(pos, {x=-1, y=1, z=-1}) | ||||
| 	local maxpos = vector.add(pos, {x=1, y=3, z=1}) | ||||
| 	minetest.add_particlespawner({ | ||||
| 		amount = key[index+1], | ||||
| 		time = 0.5, | ||||
| 		minpos = minpos, | ||||
| 		maxpos = maxpos, | ||||
| 		minvel = {x=-0.25, y=0, z=-0.25}, | ||||
| 		maxvel = {x=0.25, y=0.25, z=0.25}, | ||||
| 		minacc = {x=0, y=0, z=0}, | ||||
| 		maxacc = {x=0, y=0, z=0}, | ||||
| 		minexptime = 3, | ||||
| 		maxexptime = 3, | ||||
| 		minsize = 1, | ||||
| 		maxsize = 1, | ||||
| 		texture = "dfcaverns_glow_amethyst.png", | ||||
| 		glow = 8, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| local show_unlocked = function(pos) | ||||
| 	-- Plays globally. This is deliberate. | ||||
| 	minetest.sound_play("dfcaverns_seal_unlocked", { | ||||
|         gain = 1.0, | ||||
|         pitch = 1.0, | ||||
|     }) | ||||
| 	minetest.add_particle({ | ||||
| 		pos = pos, | ||||
| 		velocity = {x=0, y=1, z=0}, | ||||
| 		expirationtime = 30, | ||||
| 		size = 20, | ||||
| 		texture = "dfcaverns_seal.png^[invert:rgb^[brighten", | ||||
| 		glow = 15, | ||||
| --		vertical = true, | ||||
| 	}) | ||||
| end | ||||
|  | ||||
| local puzzle_seal_def = { | ||||
| @@ -32,7 +157,7 @@ local puzzle_seal_def = { | ||||
| 	tiles = {"dfcaverns_slade_block.png", "dfcaverns_slade_block.png^dfcaverns_seal.png", "dfcaverns_slade_block.png"}, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "facedir", | ||||
| 	light_source = 12, | ||||
| 	light_source = 8, | ||||
| 	groups = {stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, not_in_creative_inventory=1}, | ||||
| 	sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), | ||||
| 		selection_box = { | ||||
| @@ -47,25 +172,107 @@ local puzzle_seal_def = { | ||||
| 	on_blast = function() end, | ||||
| 	on_rotate = function() return false end, | ||||
| 	on_construct = function(pos) | ||||
| 	    ensure_inventory(pos) | ||||
| 	    ensure_meta(pos) | ||||
| 	end, | ||||
| 	on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) | ||||
| 		minetest.get_node_timer(pos):start(1) | ||||
| 		--ensure_inventory(pos) -- needed because mapgen doesn't call on_construct | ||||
| 		--local player_name = clicker:get_player_name() | ||||
| 		--minetest.show_formspec(player_name, "df_underworld_items_puzzle_seal:"..minetest.pos_to_string(pos)..":"..player_name, get_formspec(pos)) | ||||
| 		ensure_meta(pos) | ||||
| 		refresh_formspec(pos, clicker) | ||||
| 	end, | ||||
| 	on_timer = function(pos, elapsed)	 | ||||
| 		local meta = minetest.get_meta(pos) | ||||
| 		if meta:get_int("unlocked") > 0 then | ||||
| 			show_unlocked(pos) | ||||
| 		else | ||||
| 			local index = meta:get_int("key_index") | ||||
| 			show_key(pos, index) | ||||
| 			meta:set_int("key_index", (index+1) % 8) | ||||
| 		end | ||||
| 		minetest.get_node_timer(pos):start(4) | ||||
| 	end, | ||||
| 	on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) | ||||
| 		refresh_formspec(pos, player) | ||||
| 	end, | ||||
| 	on_metadata_inventory_put = function(pos, listname, index, stack, player) | ||||
| 		refresh_formspec(pos, player) | ||||
| 	end, | ||||
| 	on_metadata_inventory_take = function(pos, listname, index, stack, player) | ||||
| 		refresh_formspec(pos, player) | ||||
| 	end, | ||||
| } | ||||
|  | ||||
| if invulnerable then | ||||
| 	puzzle_seal_def.groups.immortal = 1 | ||||
| else | ||||
| 	puzzle_seal_def.groups.cracky = 3 | ||||
| end | ||||
|  | ||||
| minetest.register_node("df_underworld_items:puzzle_seal", puzzle_seal_def) | ||||
|  | ||||
| -------------------------------------------------------------------------------- | ||||
| -- Once the seal is opened, it turns into this and digs its way down through the slade. | ||||
|  | ||||
| local digging_seal_def = { | ||||
| 	description = S("Slade Digging Seal"), | ||||
| 	_doc_items_longdesc = nil, | ||||
| 	_doc_items_usagehelp = nil, | ||||
| 	drawtype = "mesh", | ||||
| 	mesh = "underworld_seal.obj", | ||||
| 	tiles = {"dfcaverns_pit_plasma_static.png", "dfcaverns_pit_plasma_static.png^dfcaverns_seal.png", "dfcaverns_pit_plasma_static.png"}, | ||||
| 	paramtype = "light", | ||||
| 	paramtype2 = "facedir", | ||||
| 	light_source = 15, | ||||
| 	groups = {immortal=1, stone=1, level=3, slade=1, pit_plasma_resistant=1, mese_radiation_shield=1, not_in_creative_inventory=1}, | ||||
| 	sounds = default.node_sound_stone_defaults({ footstep = { name = "bedrock2_step", gain = 1 } }), | ||||
| 		selection_box = { | ||||
| 		type = "fixed", | ||||
| 		fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625}, | ||||
| 	}, | ||||
| 	collision_box = { | ||||
| 		type = "fixed", | ||||
| 		fixed = {-0.625, -0.625, -0.625, 0.625, 0.625, 0.625}, | ||||
| 	}, | ||||
| 	is_ground_content = false, | ||||
| 	on_blast = function() end, | ||||
| 	on_rotate = function() return false end, | ||||
| 	on_construct = function(pos) | ||||
| 		minetest.get_node_timer(pos):start(0) | ||||
| 	end, | ||||
| 	 | ||||
| 	on_timer = function(pos, elapsed) | ||||
| 		local node = minetest.get_node(pos) | ||||
| 		local below_node = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}) | ||||
| 		if below_node.name == "ignore" then | ||||
| 			minetest.get_node_timer(pos):start(1) | ||||
| 			minetest.get_node_timer(pos):start(4) | ||||
| 			return | ||||
| 		end | ||||
|  | ||||
| 		minetest.sound_play("dfcaverns_massive_digging", { | ||||
| 			pos = pos, | ||||
| 			gain = 1.0, | ||||
| 			max_hear_distance = 32, | ||||
| 		}) | ||||
| 		 | ||||
| 		local minpos = vector.add(pos, {x=0, y=-1, z=0}) | ||||
| 		minetest.add_particlespawner({ | ||||
| 			amount = 100, | ||||
| 			time = 4, | ||||
| 			minpos = minpos, | ||||
| 			maxpos = minpos, | ||||
| 			minvel = {x=-5, y=0, z=-5}, | ||||
| 			maxvel = {x=5, y=20, z=5}, | ||||
| 			minacc = {x=0, y=-10, z=0}, | ||||
| 			maxacc = {x=0, y=-10, z=0}, | ||||
| 			minexptime = 5, | ||||
| 			maxexptime = 15, | ||||
| 			minsize = 1, | ||||
| 			maxsize = 5, | ||||
| 			texture = "dfcaverns_glowpit_particle.png", | ||||
| 			collisiondetection = true, | ||||
| 			collision_removal = true, | ||||
| 			glow = 15, | ||||
| 		}) | ||||
| 		 | ||||
| 		if minetest.get_item_group(below_node.name, "slade") == 0 then | ||||
| 			minetest.set_node(pos, {name="air"}) | ||||
| 			minetest.set_node(pos, {name="default:lava_source"}) | ||||
| 			return | ||||
| 		end | ||||
| 		 | ||||
| @@ -88,23 +295,28 @@ local puzzle_seal_def = { | ||||
| 		minetest.set_node(pos, {name="air"}) | ||||
| 		local newpos = {x=pos.x, y=pos.y-2, z=pos.z} | ||||
| 		minetest.set_node(newpos, node) | ||||
| 		minetest.get_node_timer(newpos):start(1)		 | ||||
| 	end, | ||||
| 	on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) | ||||
| 	end, | ||||
| 	on_metadata_inventory_put = function(pos, listname, index, stack, player) | ||||
| 	end, | ||||
| 	on_metadata_inventory_take = function(pos, listname, index, stack, player) | ||||
| 		minetest.get_node_timer(newpos):start(4) | ||||
| 	end, | ||||
| } | ||||
|  | ||||
| if invulnerable then | ||||
| 	puzzle_seal_def.groups.immortal = 1 | ||||
| else | ||||
| 	puzzle_seal_def.groups.cracky = 3 | ||||
| end | ||||
| minetest.register_node("df_underworld_items:digging_seal", digging_seal_def) | ||||
|  | ||||
| minetest.register_node("df_underworld_items:puzzle_seal", puzzle_seal_def) | ||||
| local prefix_len = string.len(formspec_prefix) | ||||
| minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 	if formname:sub(1,prefix_len) ~= formspec_prefix or not fields.open then | ||||
| 		return | ||||
| 	end | ||||
| 	local pos_string = formname:sub(prefix_len+1)	 | ||||
| 	local pos = minetest.string_to_pos(pos_string) | ||||
| 	if test_key(pos) then | ||||
| 		minetest.set_node(pos, {name="df_underworld_items:digging_seal", param2 = math.random(1,4)-1}) | ||||
| 		minetest.get_node_timer(pos):start(4) | ||||
| 		minetest.close_formspec(player:get_player_name(), formname) | ||||
| 	end | ||||
| end) | ||||
|  | ||||
| ----------------------------------------------------------------------------------------- | ||||
| -- Schematics | ||||
|  | ||||
| local n1 = { name = "df_underworld_items:slade_block" } | ||||
| local n5 = { name = "default:meselamp" } | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_massive_digging.1.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_massive_digging.1.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_massive_digging.2.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_massive_digging.2.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_massive_digging.3.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_massive_digging.3.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_seal_key.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_seal_key.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_seal_unlocked.ogg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								df_underworld_items/sounds/dfcaverns_seal_unlocked.ogg
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| @@ -9,4 +9,10 @@ dfcaverns_grinding_stone.3.ogg - from https://freesound.org/people/FreqMan/sound | ||||
| dfcaverns_arcing.1.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 | ||||
| dfcaverns_arcing.2.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 | ||||
| dfcaverns_arcing.3.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 | ||||
| dfcaverns_arcing.4.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 | ||||
| dfcaverns_arcing.4.ogg - from https://freesound.org/people/unfa/sounds/264827/ by unfa under Creative Commons BY 3.0 | ||||
|  | ||||
| dfcaverns_seal_unlocked.ogg - from https://freesound.org/people/juskiddink/sounds/74920/ by juskiddink under Creative Commons BY 3.0 | ||||
| dfcaverns_seal_key.ogg - from https://freesound.org/people/Veiler/sounds/209894/ by Veiler under the Creative Commons 0 public domain license | ||||
| dfcaverns_massive_digging.1.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0 | ||||
| dfcaverns_massive_digging.2.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0 | ||||
| dfcaverns_massive_digging.3.ogg - from https://freesound.org/people/OGsoundFX/sounds/423120/ by OGsoundFX under Creative Commons BY 3.0 | ||||
		Reference in New Issue
	
	Block a user