sorcery  Check-in [56a2b90c1b]

Overview
Comment:add tree lathe recipes
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 56a2b90c1b48667634abbd166e9b57964f6c0318ca0a88be1740f410a3322adc
User & Date: lexi on 2021-07-08 21:52:42
Other Links: manifest | tags
Context
2021-07-08
23:14
add lathe recipes, bugfixes check-in: 669078947d user: lexi tags: trunk
21:52
add tree lathe recipes check-in: 56a2b90c1b user: lexi tags: trunk
17:06
bug fixes, add disc textures, get lathe fully operational finally check-in: efb9d9d1b9 user: lexi tags: trunk
Changes

Modified data/gems.lua from [4d559c7735] to [bb2fee6e3c].

21
22
23
24
25
26
27


28
29
30
31
32
33
34
..
36
37
38
39
40
41
42

43
44
45
46
47
48
49
		foreign = 'default:diamond';
		tone = {137,240,255};
		items = default_items('diamond');
		tools = true, armor = true;
		maxenergy = 2000;
		hardness = 8;
		randomfind = false;


		wandprops = {
			sturdiness = (1/3);
		};
		slots = {
			{affinity = {'praxic','counterpraxic'}, confluence = 1};
			{affinity = {'praxic','syncretic'}, confluence = 0.6};
			{affinity = {'counterpraxic', 'entropic'}, confluence = 0.7};
................................................................................
	};
	mese = {
		foreign = 'default:mese_crystal';
		foreign_shard = 'default:mese_crystal_fragment';
		tone = {255,253,94};
		energysource = 5;
		hardness = 6;

		maxenergy = 600;
		items = default_items('mese');
		tools = true, armor = true;
		randomfind = false;
		slots = {
			{affinity = {'praxic'}, confluence = 1};
			{affinity = {'praxic'}, confluence = 0.5};







>
>







 







>







21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
..
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
		foreign = 'default:diamond';
		tone = {137,240,255};
		items = default_items('diamond');
		tools = true, armor = true;
		maxenergy = 2000;
		hardness = 8;
		randomfind = false;
		level = 1;
		maxlevel = 2;
		wandprops = {
			sturdiness = (1/3);
		};
		slots = {
			{affinity = {'praxic','counterpraxic'}, confluence = 1};
			{affinity = {'praxic','syncretic'}, confluence = 0.6};
			{affinity = {'counterpraxic', 'entropic'}, confluence = 0.7};
................................................................................
	};
	mese = {
		foreign = 'default:mese_crystal';
		foreign_shard = 'default:mese_crystal_fragment';
		tone = {255,253,94};
		energysource = 5;
		hardness = 6;
		level = 1;
		maxenergy = 600;
		items = default_items('mese');
		tools = true, armor = true;
		randomfind = false;
		slots = {
			{affinity = {'praxic'}, confluence = 1};
			{affinity = {'praxic'}, confluence = 0.5};

Modified data/metals.lua from [81e12129e0] to [eba257a7d6].

64
65
66
67
68
69
70

71
72
73
74
75
76
77
		items = default_items('bronze');
		hardness = 4;
		durability = 350;
		maxenergy = 150;
		sharpness = 1;
		speed = 1.4;
		level = 0;

		slots = {
			{affinity = {'counterpraxic'}; confluence = 0.7};
		};
		mix = {
			metals = {
				copper = 4;
				tin = 1;







>







64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
		items = default_items('bronze');
		hardness = 4;
		durability = 350;
		maxenergy = 150;
		sharpness = 1;
		speed = 1.4;
		level = 0;
		maxlevel = 1;
		slots = {
			{affinity = {'counterpraxic'}; confluence = 0.7};
		};
		mix = {
			metals = {
				copper = 4;
				tin = 1;

Modified data/trees.lua from [33057bf9f3] to [1a5929f3d1].

8
9
10
11
12
13
14






15
16
17
18

19
20
21
22






23
24
25
26

27
28
29
30
31






32
33
34
35

36
37
38
39
40






41
42
43
44
45
46
47

48
49
50
51
52




53
54


	apple = {
		desc = 'Apple';
		node = 'default:tree';
		sapling = 'default:sapling';
		leaves = 'default:leaves';
		sap = 'Apple Syrup';
		sapcolor = {218, 238, 66};






	};
	pine = {
		desc = 'Pine';
		node = 'default:pine_tree';

		sapling = 'default:pine_sapling';
		leaves = 'default:pine_needles';
		sap = 'Pine Resin';
		color = {95, 64, 57};






	};
	aspen = {
		desc = 'Aspen';
		node = 'default:aspen_tree';

		sapling = 'default:aspen_sapling';
		sap = 'Aspen Sap';
		leaves = 'default:aspen_leaves';
		color = {255, 251, 172};
		imgvariant = 'dull';






	};
	acacia = {
		desc = 'Acacia';
		node = 'default:acacia_tree';

		sapling = 'default:acacia_sapling';
		leaves = 'default:acacia_leaves';
		sap = 'Acacia Sap';
		color = {217, 51, 22};
		sapglow = 7;






	};
	jungle = {
		desc = 'Jungle';
		node = {
			'default:jungletree';
			'moretrees:jungletree_trunk';
		};

		sapling = 'default:junglesapling';
		leaves = 'default:jungleleaves';
		sap = 'Tropical Syrup';
		color = {86, 39, 71};
		imgvariant = 'dull';




	};
}









>
>
>
>
>
>




>




>
>
>
>
>
>




>





>
>
>
>
>
>




>





>
>
>
>
>
>







>





>
>
>
>
|
|
>
>
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
	apple = {
		desc = 'Apple';
		node = 'default:tree';
		sapling = 'default:sapling';
		leaves = 'default:leaves';
		sap = 'Apple Syrup';
		sapcolor = {218, 238, 66};
		lathe = {
			cut = {
				{'default:fence_wood', 5, 2};
				{'default:fence_rail_wood', 20, 2};
			};
		}
	};
	pine = {
		desc = 'Pine';
		node = 'default:pine_tree';
		plank = 'default:pine_wood';
		sapling = 'default:pine_sapling';
		leaves = 'default:pine_needles';
		sap = 'Pine Resin';
		color = {95, 64, 57};
		lathe = {
			cut = {
				{'default:fence_pine_wood', 5, 2};
				{'default:fence_rail_pine_wood', 20, 2};
			};
		};
	};
	aspen = {
		desc = 'Aspen';
		node = 'default:aspen_tree';
		plank = 'default:aspen_wood';
		sapling = 'default:aspen_sapling';
		sap = 'Aspen Sap';
		leaves = 'default:aspen_leaves';
		color = {255, 251, 172};
		imgvariant = 'dull';
		lathe = {
			cut = {
				{'default:fence_aspen_wood', 5, 2};
				{'default:fence_rail_aspen_wood', 20, 2};
			};
		};
	};
	acacia = {
		desc = 'Acacia';
		node = 'default:acacia_tree';
		plank = 'default:acacia_wood';
		sapling = 'default:acacia_sapling';
		leaves = 'default:acacia_leaves';
		sap = 'Acacia Sap';
		color = {217, 51, 22};
		sapglow = 7;
		lathe = {
			cut = {
				{'default:fence_acacia_wood', 5, 2};
				{'default:fence_rail_acacia_wood', 20, 2};
			};
		};
	};
	jungle = {
		desc = 'Jungle';
		node = {
			'default:jungletree';
			'moretrees:jungletree_trunk';
		};
		plank = 'default:junglewood';
		sapling = 'default:junglesapling';
		leaves = 'default:jungleleaves';
		sap = 'Tropical Syrup';
		color = {86, 39, 71};
		imgvariant = 'dull';
		lathe = {
			cut = {
				{'default:fence_junglewood', 5, 2};
				{'default:fence_rail_junglewood', 20, 2};
			};
		};
	};
}

Modified gems.lua from [68440cd05e] to [266c01e80c].

48
49
50
51
52
53
54

55
56
57
58
59
60
61
							{'',itemname,''};
						};
					}
				};
			};
		})
	end

	if not gem.foreign_amulet then
		local img = sorcery.lib.image
		local img_stone = img('sorcery_amulet.png'):multiply(sorcery.lib.color(gem.tone))
		local img_sparkle = img('sorcery_amulet_sparkle.png')
		local useamulet = function(stack,user,target)
			local sp = sorcery.amulet.getspell(stack)
			if not sp or not sp.cast then return nil end







>







48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
							{'',itemname,''};
						};
					}
				};
			};
		})
	end
	gem.durability = gem.durability or (gem.hardness or 1) * 100
	if not gem.foreign_amulet then
		local img = sorcery.lib.image
		local img_stone = img('sorcery_amulet.png'):multiply(sorcery.lib.color(gem.tone))
		local img_sparkle = img('sorcery_amulet_sparkle.png')
		local useamulet = function(stack,user,target)
			local sp = sorcery.amulet.getspell(stack)
			if not sp or not sp.cast then return nil end

Modified init.lua from [eeaa9926dc] to [7aae623fb9].

164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
	end
	sorcery.registry.mk('residue',false)
end

sorcery.stage('startup',data)
for _,u in pairs {
	'global'; 'vfx'; 'context'; 'attunement'; 'itemclass'; 'craft'; 'spell';
	'liquid'; 'tree'; 'potions'; 'lathe'; 'metal', 'gems'; 'leylines';
	'infuser'; 'altar'; 'wands'; 'tools', 'crafttools';
	'enchanter'; 'harvester'; 'metallurgy-hot', 'metallurgy-cold';
	'entities'; 'recipes'; 'coins'; 'interop';
	'tnodes'; 'forcefield'; 'farcaster'; 'portal';
	'cookbook', 'writing'; 'disassembly'; 'displacer';
	'gravitator'; 'precipitator'; 'calendar', 'astrolabe';
	'keypunch'; 'runeforge'; 'keg'; 'tap';

	'privs', 'admin';
} do sorcery.load(u) end
sorcery.stage('finalize')

sorcery.registry.defercheck()







|













164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
	end
	sorcery.registry.mk('residue',false)
end

sorcery.stage('startup',data)
for _,u in pairs {
	'global'; 'vfx'; 'context'; 'attunement'; 'itemclass'; 'craft'; 'spell';
	'liquid'; 'potions'; 'lathe'; 'tree'; 'metal', 'gems'; 'leylines';
	'infuser'; 'altar'; 'wands'; 'tools', 'crafttools';
	'enchanter'; 'harvester'; 'metallurgy-hot', 'metallurgy-cold';
	'entities'; 'recipes'; 'coins'; 'interop';
	'tnodes'; 'forcefield'; 'farcaster'; 'portal';
	'cookbook', 'writing'; 'disassembly'; 'displacer';
	'gravitator'; 'precipitator'; 'calendar', 'astrolabe';
	'keypunch'; 'runeforge'; 'keg'; 'tap';

	'privs', 'admin';
} do sorcery.load(u) end
sorcery.stage('finalize')

sorcery.registry.defercheck()

Modified lathe.lua from [75f9e0d88f] to [525693d594].

13
14
15
16
17
18
19







































20
21
22
23
24
25
26
..
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
..
81
82
83
84
85
86
87








88
89
90
91
92
93
94
...
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
...
173
174
175
176
177
178
179









180
181
182
183
184
185
186
		local recipes = sorcery.lathe.recipes
		if not recipes[def.input] then recipes[def.input] = {} end
		local rs = recipes[def.input][def.tech]
		if not rs
			then recipes[def.input][def.tech] = { def }
			else rs[#rs+1] = def
		end







































	end;
	tooltech = function(tool)
		if type(tool) ~= 'string' then tool = tool:get_name() end
		for g,t in pairs(sorcery.lathe.tools) do
			if minetest.get_item_group(tool, g) ~= 0 then
				return t
			end
................................................................................
	local lfac = 1
	if tmat then
		local dur = tmat.data.durability or dur
		lfac = (wmat and wmat.data.level or 1) /
			(tmat.data.maxlevel or tmat.data.level or 1)
	end
	local ch = 65535 / dur
	local wear = 2 * (ch * rec.cost * ntimes * lfac);
	return {
		tool = tool, wkpc = wkpc;
		cost = rec.cost * ntimes;
		wear = wear;
		ntimes = ntimes;
		tqty = ntimes * (rec.mass or 1), outn = outn;
		tech = tech;
................................................................................
	-- obey level restrictions. TODO honor Rend
	if (wmat and wmat.data.level or 0) > (tmat and (tmat.data.maxlevel or tmat.data.level) or 0) then
		return
	end
	
	local tech = sorcery.lathe.tooltech(tool)
	local rec = R[wkpc:get_name()][tech]








	tech = sorcery.lathe.techs[tech]

	-- fill in the preview slots
	local j = 1
	for i=1, inv:get_size 'preview'  do
		local stk = ItemStack()
		local os = rec[i] and ItemStack(rec[i].output)
................................................................................
		local i = m:get_inventory()
		i:set_size('workpiece', 1);
		i:set_size('tool', 1);
		i:set_size('preview', 8);
		m:set_string('formspec', [[
			formspec_version[3] size[10.25,8]
			list[context;tool;1.25,1;1,1]
			list[context;workpiece;2.75,1;1,1]
			list[context;preview;5.25,0.25;4,2]
			list[current_player;main;0.25,3;8,4]

			listring[current_player;main] listring[context;workpiece]
			listring[current_player;main] listring[context;tool]
			listring[current_player;main] listring[context;preview]
			listring[current_player;main]
................................................................................
		if list == 'tool' then
			local s_wkpc = inv:get_stack('workpiece', 1)
			local tech = sorcery.lathe.tooltech(stack)
			if tech and (s_wkpc:is_empty()
			or (R[s_wkpc:get_name()]       ~= nil and
				R[s_wkpc:get_name()][tech] ~= nil))
					then return stack:get_count() end









		elseif list == 'workpiece' then
			local s_tool = inv:get_stack('tool', 1)
			if R[stack:get_name()] then
				if s_tool:is_empty()
				or R[stack:get_name()][sorcery.lathe.tooltech(s_tool)]
					then return stack:get_count() end
			end







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







 







|







 







>
>
>
>
>
>
>
>







 







|







 







>
>
>
>
>
>
>
>
>







13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
..
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
...
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
...
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
		local recipes = sorcery.lathe.recipes
		if not recipes[def.input] then recipes[def.input] = {} end
		local rs = recipes[def.input][def.tech]
		if not rs
			then recipes[def.input][def.tech] = { def }
			else rs[#rs+1] = def
		end
	end;
	register_metal = function(def)
		local parts = sorcery.data.metals[def.metal].parts
		local out = ItemStack(def.output)
		for _, ty in pairs {'ingot', 'block', 'fragment'} do
			local pt = parts[ty] 
			local ptc = sorcery.itemclass.get(pt, 'metal')
			if ptc and ptc.value then
				if def.mass <= ptc.value then
					local mass
					local vfc = ptc.value / def.mass
					if math.floor(vfc) ~= vfc then
						for i = 1, 50 do
							local v = vfc * i
							if math.floor(v) == v then
								mass = i
								vfc = v
								break
							end
						end
					else
						mass = 1
					end
					if not mass then
						log.err('tried to register a lathe metal recipe for',def.output,'but the mass ratio',vfc,'for part',ty,'has too many digits to the right of the decimal place')
						return false
					end
					sorcery.lathe.register {
						input = pt, mass = mass;
						tech = def.tech, cost = def.cost;
						output = {
							name = out:get_name();
							count = out:get_count() * vfc;
						};
						leftover = def.leftover;
					}
				end
			end
		end
	end;
	tooltech = function(tool)
		if type(tool) ~= 'string' then tool = tool:get_name() end
		for g,t in pairs(sorcery.lathe.tools) do
			if minetest.get_item_group(tool, g) ~= 0 then
				return t
			end
................................................................................
	local lfac = 1
	if tmat then
		local dur = tmat.data.durability or dur
		lfac = (wmat and wmat.data.level or 1) /
			(tmat.data.maxlevel or tmat.data.level or 1)
	end
	local ch = 65535 / dur
	local wear = (ch * rec.cost * ntimes * lfac)
	return {
		tool = tool, wkpc = wkpc;
		cost = rec.cost * ntimes;
		wear = wear;
		ntimes = ntimes;
		tqty = ntimes * (rec.mass or 1), outn = outn;
		tech = tech;
................................................................................
	-- obey level restrictions. TODO honor Rend
	if (wmat and wmat.data.level or 0) > (tmat and (tmat.data.maxlevel or tmat.data.level) or 0) then
		return
	end
	
	local tech = sorcery.lathe.tooltech(tool)
	local rec = R[wkpc:get_name()][tech]
	if not rec then
		for g,v in pairs(s_wkpc:get_definition().groups) do
			local gs = R['group:'..g..'='..tostring(v)] 
			local gg = R['group:'..g] 

			rec = (gs and gs[tech]) or (gg and gg[tech])
		end
	end
	tech = sorcery.lathe.techs[tech]

	-- fill in the preview slots
	local j = 1
	for i=1, inv:get_size 'preview'  do
		local stk = ItemStack()
		local os = rec[i] and ItemStack(rec[i].output)
................................................................................
		local i = m:get_inventory()
		i:set_size('workpiece', 1);
		i:set_size('tool', 1);
		i:set_size('preview', 8);
		m:set_string('formspec', [[
			formspec_version[3] size[10.25,8]
			list[context;tool;1.25,1;1,1]
			list[context;workpiece;3,1;1,1]
			list[context;preview;5.25,0.25;4,2]
			list[current_player;main;0.25,3;8,4]

			listring[current_player;main] listring[context;workpiece]
			listring[current_player;main] listring[context;tool]
			listring[current_player;main] listring[context;preview]
			listring[current_player;main]
................................................................................
		if list == 'tool' then
			local s_wkpc = inv:get_stack('workpiece', 1)
			local tech = sorcery.lathe.tooltech(stack)
			if tech and (s_wkpc:is_empty()
			or (R[s_wkpc:get_name()]       ~= nil and
				R[s_wkpc:get_name()][tech] ~= nil))
					then return stack:get_count() end
			for g,v in pairs(s_wkpc:get_definition().groups) do
				local gs = R['group:'..g..'='..tostring(v)] 
				local gg = R['group:'..g] 

				if (gs and gs[tech])
				or (gg and gg[tech]) then
					return stack:get_count()
				end
			end
		elseif list == 'workpiece' then
			local s_tool = inv:get_stack('tool', 1)
			if R[stack:get_name()] then
				if s_tool:is_empty()
				or R[stack:get_name()][sorcery.lathe.tooltech(s_tool)]
					then return stack:get_count() end
			end

Modified recipes.lua from [f4ffdfcd69] to [7b05938d1e].

370
371
372
373
374
375
376
377
378
379
380

381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
...
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808

809
regtech('valve','Valve', {metal = 1}, {
	{'','default:bronze_ingot',''};
	{'basic_materials:plastic_sheet','basic_materials:steel_bar','basic_materials:plastic_sheet'};
	{'','default:bronze_ingot',''};
},3,nil, mprop('bronze',2*4,1,2*4))
regtech('pipe','Pipe', {metal = 1},nil, nil, nil, mprop('aluminum', 4))

sorcery.lathe.register {
	input = ingot('aluminum');
	output = 'sorcery:pipe';
	tech = 'cut', cost = 8;

}

minetest.register_craft {
	output = 'sorcery:trough';
	recipe = {
		{ingot('aluminum'),'',ingot('aluminum')};
		{ingot('aluminum'),'',ingot('aluminum')};
		{ingot('aluminum'),ingot('aluminum'),ingot('aluminum')};
	};
}

regtech('infuser_tube', 'Infusion Tube', {metal = 1}, {
	{"basic_materials:copper_strip",'sorcery:infuser_concentrator', "basic_materials:copper_strip"};
	{"", "basic_materials:copper_strip", "basic_materials:gold_wire"};
	{"", "basic_materials:copper_strip", ""};
................................................................................
for n,v in pairs(sorcery.data.greases) do
	if (v.core and #v.core > 0) or (v.mix and #v.mix > 0) then
		local id = 'sorcery:grease_' .. n
		potion_auto_recipe(id,v,{'farming:mixing_bowl'},'xdecor:bowl')
	end
end

sorcery.lathe.register {
	output = 'basic_materials:steel_bar 2';
	input = 'default:steel_ingot';
	tech = 'cut', cost = 3;
}
sorcery.lathe.register {
	output = 'basic_materials:steel_bar 18';
	input = 'default:steelblock';
	tech = 'cut', cost = 3*9;
}
sorcery.lathe.register {
	output = 'basic_materials:steel_bar';
	input = 'default:steel_fragment', mass = 2;
	tech = 'cut', cost = 2;

}







|
|


>





|
|
|







 







|
|
<
<
<
<
<
<
<
<
<

<
|
>

370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
...
789
790
791
792
793
794
795
796
797









798

799
800
801
regtech('valve','Valve', {metal = 1}, {
	{'','default:bronze_ingot',''};
	{'basic_materials:plastic_sheet','basic_materials:steel_bar','basic_materials:plastic_sheet'};
	{'','default:bronze_ingot',''};
},3,nil, mprop('bronze',2*4,1,2*4))
regtech('pipe','Pipe', {metal = 1},nil, nil, nil, mprop('aluminum', 4))

sorcery.lathe.register_metal {
	metal = 'aluminum';
	output = 'sorcery:pipe';
	tech = 'cut', cost = 8;
	mass = 4;
}

minetest.register_craft {
	output = 'sorcery:trough';
	recipe = {
		{ingot 'aluminum','',ingot 'aluminum'};
		{ingot 'aluminum','',ingot 'aluminum'};
		{ingot 'aluminum',ingot 'aluminum',ingot 'aluminum'};
	};
}

regtech('infuser_tube', 'Infusion Tube', {metal = 1}, {
	{"basic_materials:copper_strip",'sorcery:infuser_concentrator', "basic_materials:copper_strip"};
	{"", "basic_materials:copper_strip", "basic_materials:gold_wire"};
	{"", "basic_materials:copper_strip", ""};
................................................................................
for n,v in pairs(sorcery.data.greases) do
	if (v.core and #v.core > 0) or (v.mix and #v.mix > 0) then
		local id = 'sorcery:grease_' .. n
		potion_auto_recipe(id,v,{'farming:mixing_bowl'},'xdecor:bowl')
	end
end

sorcery.lathe.register_metal {
	metal = 'steel';









	output = 'basic_materials:steel_bar';

	tech = 'cut', cost = 3;
	mass = 2;
}

Modified sorcery.md from [9b54d0ccbf] to [1bb9279edd].

44
45
46
47
48
49
50

51
52


53
54
55
56
57
58
59
 * extracts can be crafted using crushed excess seeds and alcohol
 * oils, greases, and other substances can be crafted by mixing together various ingredients, including extracts
 * magical elixirs can be made by infusing oils and the like into bottles of water at an **Infuser**, and can be drunk to gain temporary powers
 * liquids can be carried around in buckets, bottles, and glasses, depending on the liquid.
 * kegs can store large volumes of liquid, making for easy retrieval when you, say, need a specific extract or potion to brew an elixir
 * troughs can be used to gather liquid from nature. set out under the open sky, for instance, they will slowly collect rainwater (depending on the biome). they have twice the volume of buckets.
 * taps can be attached to trees to extract saps, syrups, and resins from under the bark; these can be caught by placing a trough below. you can then fill bottles from the trough, or simply pick the whole trough up and bring it home to deposit the liquid in a keg for later use.

 * wands, made at an **Wandworking Station** out of a wood, gems, bands, and cores, can be enchanted by soaking them in philters, special potions used for imbuing wood with ley-force (though i'm trying to come up with a better mechanism). these fire off powerful spells with a flick of the wrist, but will break when they run out of power (unless you recharge them…)
 * if you want to get into advanced arcanism, you can build an **Enchanter**. equipped with the proper wands, this powerful artifact can be used to imbue tools with useful supernatural properties, though what enchantments are available and how much ley-charge a tool can hold depend on what metal the tool is made of. but Enchanters can be used for more subtle purposes as well. with the right ingredients and a **Divination Wand**, you can conjure up recipes for delicacies or schematics for powerful magitech devices you never imagined were possible. **Melding Wands** can merge the mystic essences of items on an Enchanter to create something new, including some things that can't be made any other way, though the stars may need to be right (an **Astrolabe** can help you check) for certain recipes to work, and some may come down to plain old luck. **Division Wands** are very similar, but work the other way around.


 * you can also build a **Disassembly Kit**, which you can use with pen, ink, and paper to create schematics for any object you come across that you want to be able to craft yourself.
 * you can collect your assorted recipes into cookbooks, and you can build yourself a **Writing Stand** to insert, delete, re-order, or (if you have some Scissors handy) cut out parts of the book.
 * you can make a **Mill** for grinding up solid materials into powder or pulp. it makes flour from grain more efficiently than a mortar and pestle, can produce various metal powders of great utility, and can reduce books, paper, and punchcards down to a pulp, suitable for cleaning with **Erasure Fluid** and cooking back into clean paper. but you'll need some way to power it. a **Generator** will produce plenty of energy in a pinch, but it may be more rewarding to build yourself a real power grid, carrying current from place to place using cables (**Vidrium Cables** are sufficient for homes and studios, but industrial facilities may need **Iridium Cables** or the even more conductive **Conduit**). **Mese Blocks** always emit a small but constant amount of ley-current, but if you're near a strong leyline, building **Condenser**s to harvest its power will be much more efficient. (**Leyspark Wand**s are crucial tools for testing the source and affinity of the ambient leyscape.)
 * some new alloys can be made by sintering metal powders; others need to be melted down in a **Smelter**. these alloys have the most remarkable properties of any metal, and are especially valued by toolsmiths and enchanters, though they may be less broadly useful than the lesser metals.
 * if you need to travel quickly between two distant places, and you're wealthy enough to afford it, you can build yourself one of the most powerful and complex of magitech devices — the **Teleporter**. it's no mean feat: even the smallest teleporter requires a teleport pad with a reflector above it and a portal node connected to one or the other. the teleporter will then need to be connected to its destination with cables or conduits, and if where you're travelling is very far away, you'll have to build two separate ley nets and bridge them by using an **Attunement Wand** on a pair of **Raycasters** — or perhaps even **Farcasters**. the power required to operate all of these devices is not trivial, and while a Farcaster's signal can pierce through any substance and cross any distance to reach its destination, the farther away each is from the other, the more power each side will consume. and casters can't send current, they can only send signals, so you may need a sizable power plant on both sides of the portal.
 * if all you need to do is send small items, of course, a **Displacer** is much cheaper, and more flexible. if you're feeling particularly ambitious, you could use a Displacer net to connect your whole kingdom with instantaneous package service.
 * stop your foes in their tracks by flipping a switch to turn on your **Force Field Emitters**, generating an impenetrable barrier wherever they aim.







>

<
>
>







44
45
46
47
48
49
50
51
52

53
54
55
56
57
58
59
60
61
 * extracts can be crafted using crushed excess seeds and alcohol
 * oils, greases, and other substances can be crafted by mixing together various ingredients, including extracts
 * magical elixirs can be made by infusing oils and the like into bottles of water at an **Infuser**, and can be drunk to gain temporary powers
 * liquids can be carried around in buckets, bottles, and glasses, depending on the liquid.
 * kegs can store large volumes of liquid, making for easy retrieval when you, say, need a specific extract or potion to brew an elixir
 * troughs can be used to gather liquid from nature. set out under the open sky, for instance, they will slowly collect rainwater (depending on the biome). they have twice the volume of buckets.
 * taps can be attached to trees to extract saps, syrups, and resins from under the bark; these can be caught by placing a trough below. you can then fill bottles from the trough, or simply pick the whole trough up and bring it home to deposit the liquid in a keg for later use.
 * you can build a lathe for complex metal- and woodworking, to build things like pipes, screws, discs, and fenceposts.
 * wands, made at an **Wandworking Station** out of a wood, gems, bands, and cores, can be enchanted by soaking them in philters, special potions used for imbuing wood with ley-force (though i'm trying to come up with a better mechanism). these fire off powerful spells with a flick of the wrist, but will break when they run out of power (unless you recharge them…)

 * if you want to get into advanced arcanism, you can build an **Enchanter**. if you have the proper wands with the proper wands, this powerful artifact can be used to imbue tools with useful supernatural properties, though what enchantments are available and how much ley-charge a tool can hold depend on what metal the tool is made of. but Enchanters can be used for more subtle purposes as well. with the right ingredients and a **Divination Wand**, you can conjure up recipes for delicacies or schematics for powerful magitech devices you never imagined were possible. **Melding Wands** can merge the mystic essences of items on an Enchanter to create something new, including some things that can't be made any other way, though the stars may need to be right (an **Astrolabe** can help you check) for certain recipes to work, and some may come down to plain old luck. **Division Wands** are very similar, but work the other way around.
 * if you do a wide variety of things with your enchanter, you may want to build a **Wand Rack** in your lab, otherwise a **Wand Stand** or two will probably be good enough.
 * you can also build a **Disassembly Kit**, which you can use with pen, ink, and paper to create schematics for any object you come across that you want to be able to craft yourself.
 * you can collect your assorted recipes into cookbooks, and you can build yourself a **Writing Stand** to insert, delete, re-order, or (if you have some Scissors handy) cut out parts of the book.
 * you can make a **Mill** for grinding up solid materials into powder or pulp. it makes flour from grain more efficiently than a mortar and pestle, can produce various metal powders of great utility, and can reduce books, paper, and punchcards down to a pulp, suitable for cleaning with **Erasure Fluid** and cooking back into clean paper. but you'll need some way to power it. a **Generator** will produce plenty of energy in a pinch, but it may be more rewarding to build yourself a real power grid, carrying current from place to place using cables (**Vidrium Cables** are sufficient for homes and studios, but industrial facilities may need **Iridium Cables** or the even more conductive **Conduit**). **Mese Blocks** always emit a small but constant amount of ley-current, but if you're near a strong leyline, building **Condenser**s to harvest its power will be much more efficient. (**Leyspark Wand**s are crucial tools for testing the source and affinity of the ambient leyscape.)
 * some new alloys can be made by sintering metal powders; others need to be melted down in a **Smelter**. these alloys have the most remarkable properties of any metal, and are especially valued by toolsmiths and enchanters, though they may be less broadly useful than the lesser metals.
 * if you need to travel quickly between two distant places, and you're wealthy enough to afford it, you can build yourself one of the most powerful and complex of magitech devices — the **Teleporter**. it's no mean feat: even the smallest teleporter requires a teleport pad with a reflector above it and a portal node connected to one or the other. the teleporter will then need to be connected to its destination with cables or conduits, and if where you're travelling is very far away, you'll have to build two separate ley nets and bridge them by using an **Attunement Wand** on a pair of **Raycasters** — or perhaps even **Farcasters**. the power required to operate all of these devices is not trivial, and while a Farcaster's signal can pierce through any substance and cross any distance to reach its destination, the farther away each is from the other, the more power each side will consume. and casters can't send current, they can only send signals, so you may need a sizable power plant on both sides of the portal.
 * if all you need to do is send small items, of course, a **Displacer** is much cheaper, and more flexible. if you're feeling particularly ambitious, you could use a Displacer net to connect your whole kingdom with instantaneous package service.
 * stop your foes in their tracks by flipping a switch to turn on your **Force Field Emitters**, generating an impenetrable barrier wherever they aim.

Modified tree.lua from [e98976a563] to [26f773677c].

30
31
32
33
34
35
36

























37
38
39
40
41
42
43
						n.param1 = 1
						minetest.swap_node(pointed.above, n)
						-- end
					end
				end })
			end
		end

























	end

	if t.sap == false then return end
	if not t.sapliq then
		t.sapliq = string.format('sorcery:sap_%s', id)
		local sapdesc = t.sap or (t.desc .. ' Tree Sap')
		sorcery.liquid.register {







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
						n.param1 = 1
						minetest.swap_node(pointed.above, n)
						-- end
					end
				end })
			end
		end

		sorcery.lathe.register {
			input = t.node;
			tech = 'cut';
			output = 'default:stick 18';
			cost = 1;
		}

		if t.lathe then for tech, items in pairs(t.lathe) do
			for _, i in pairs(items) do
			for _, n in pairs(nodes) do
				if  minetest.registered_items[n]
				and minetest.registered_items[i[1]] then
					sorcery.lathe.register {
						input = n;
						tech = tech;
						output = {
							name = i[1];
							count = i[2];
						};
						cost = i[3];
					}
				end
			end end
		end end
	end

	if t.sap == false then return end
	if not t.sapliq then
		t.sapliq = string.format('sorcery:sap_%s', id)
		local sapdesc = t.sap or (t.desc .. ' Tree Sap')
		sorcery.liquid.register {