sorcery  Check-in [9278734b41]

Overview
Comment:fix bugs, finish grinder, add conduits and condensers to extract and transmit energy from leylines
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 9278734b41a35b8a889f08daf57da556528b37d29b57f5a3d806f0105df74e15
User & Date: lexi on 2020-08-17 13:35:12
Other Links: manifest | tags
Context
2020-08-21
11:52
add force field emitters, generators, rework leyline distribution algorithm, add utility function for automatically dumping out inventories when an item is dug, add draconium and tyrannium alloys (tentatively), various fixes check-in: f7f6898cbd user: lexi tags: trunk
2020-08-17
13:35
fix bugs, finish grinder, add conduits and condensers to extract and transmit energy from leylines check-in: 9278734b41 user: lexi tags: trunk
2020-08-16
02:05
changes, merges, additions galore check-in: 82178e0a16 user: lexi tags: trunk
Changes

Added data/compat.lua version [04ce335701].

            1  +local grain = {
            2  +	hardness = 1;
            3  +	value = 1;
            4  +	powder = 'farming:flour';
            5  +	grindcost = 4;
            6  +}
            7  +return {
            8  +	grindables = {
            9  +		['farming:wheat'] = grain;
           10  +		['farming:rye'] = grain;
           11  +		['farming:oats'] = grain;
           12  +		['farming:barley'] = grain;
           13  +		['farming:rice'] = {
           14  +			powder = 'farming:rice_flour';
           15  +			hardness = 1;
           16  +			value = 1;
           17  +			grindcost = 4;
           18  +		}
           19  +	};
           20  +	ley = {
           21  +		['default:mese'] = {
           22  +			power = 0.25;
           23  +			mode = 'produce';
           24  +		};
           25  +	};
           26  +}

Modified data/enchants.lua from [b3a388d8b4] to [9a3424a733].

     1      1   -- an optional 'enchant' function can be defined, and will
     2      2   -- be called when the enchantment is placed on the object
     3      3   local allgroups = {
     4      4   	'sword'; 'pick'; 'pickaxe';
     5         -	'sickle'; 'scythe'; 'shovel';
     6         -	'hoe'; 'helmet'; 'leggings';
     7         -	'chestplate'; 'boots';
            5  +	'sickle'; 'axe'; 'scythe';
            6  +	'shovel'; 'hoe'; 'helmet';
            7  +	'leggings'; 'chestplate'; 'boots';
     8      8   } 
            9  +local digtools = {
           10  +	'pick'; 'pickaxe'; 'sickle';
           11  +	'shovel'; 'axe';
           12  +}
     9     13   return {
    10     14   	endure = { -- withstand more blows
    11     15   		name = 'Endure';
    12     16   		cost = 1;
    13     17   		tone = {232,102,255};
    14     18   		desc = 'durability magnified';
    15     19   		affinity = 'counterpraxic';
................................................................................
    29     33   			return stack
    30     34   		end;
    31     35   	};
    32     36   	drain = {
    33     37   		groups = {'sword'};
    34     38   		cost = 4;
    35     39   	}; -- health vampirism
           40  +	glitter = { -- created prolonged light on digging
           41  +		name = 'Glitter';
           42  +		groups = digtools;
           43  +		affinity = 'cognic';
           44  +		cost = 1;
           45  +		tone = {255,235,195};
           46  +		desc = 'Leave a trail of light hanging in the air as you dig';
           47  +	};
    36     48   	harvest = { -- kills or digging ore replenish durability
    37     49   		name = 'Harvest';
    38     50   		cost = 0; -- energy is only depleted when repair takes place
    39     51   		tone = {255,84,187};
    40     52   		affinity = 'syncretic';
    41     53   		groups = {
    42     54   			'pick'; 'pickaxe'; 'sword';
................................................................................
   120    132   			end
   121    133   		end;
   122    134   	};
   123    135   	pierce = { -- faster mining speed
   124    136   		name = 'Pierce';
   125    137   		cost = 3;
   126    138   		tone = {113,240,251};
   127         -		groups = {
          139  +		groups = digtools;
          140  +		{
   128    141   			'pick';'pickaxe';'axe';'shovel';'sickle';
   129    142   		};
   130    143   		desc = 'rip through solid stone or wood like a hot knife through butter';
   131    144   		recipe = {
   132    145   			{lens = 'amplifier', gem = 'diamond',  dmg = 4};
   133    146   			{lens = 'amplifier', gem = 'ruby',     dmg = 4};
   134    147   			{lens = 'rectifier', gem = 'diamond',  dmg = 2};

Modified data/greases.lua from [471779a266] to [018bd8935a].

    50     50   	thunder = {
    51     51   		color = {255,245,84};
    52     52   		core = { 'sorcery:oil_flame', 'sorcery:oil_wind' };
    53     53   		mix = {
    54     54   			'sorcery:extract_onion';
    55     55   			'tnt:gunpowder';
    56     56   		};
           57  +	};
           58  +	enchanting = {
           59  +		color = {222,57,239};
           60  +		core = { 'sorcery:oil_mystic', 'sorcery:oil_dawn', 'sorcery:oil_mushroom' };
           61  +		mix = {
           62  +			'sorcery:powder_cobalt';
           63  +			'sorcery:powder_cobalt';
           64  +			'sorcery:extract_grape';
           65  +		};
    57     66   	};
    58     67   }

Modified data/metals.lua from [f4099f1a65] to [f9ae7215e3].

    18     18   
    19     19   return {
    20     20   	tin = {
    21     21   		ingot = 'default:tin_ingot';
    22     22   		block = 'default:tinblock';
    23     23   		tone = {172,172,172};
    24     24   		no_tools = true; no_armor = true;
           25  +		hardness = 2;
    25     26   	};
    26     27   	copper = {
           28  +		dye = 'orange';
    27     29   		ingot = 'default:copper_ingot';
    28     30   		block = 'default:copperblock';
    29     31   		tone = {255,176,61};
    30     32   		no_tools = true; no_armor = true;
           33  +		hardness = 2;
    31     34   	};
    32     35   	brass = {
    33     36   		tone = {255,226,87};
           37  +		dye = 'bright_orange';
    34     38   		artificial = true;
    35     39   		no_tools = true; no_armor = true;
           40  +		hardness = 3;
    36     41   		mix = {
    37     42   			metals = {
    38     43   				silver = 1;
    39     44   				copper = 4;
    40     45   			};
    41     46   		};
    42     47   	};
    43     48   	bronze = {
    44     49   		ingot = 'default:bronze_ingot';
    45     50   		block = 'default:bronzeblock';
           51  +		dye = 'dark_orange';
    46     52   		artificial = true;
    47     53   		tone = {229,115,52};
    48     54   		items = default_items('bronze');
           55  +		hardness = 4;
    49     56   		maxenergy = 150;
    50     57   		slots = {
    51     58   			{affinity = {'counterpraxic'}; confluence = 0.7};
    52     59   		};
    53     60   		mix = {
    54     61   			metals = {
    55     62   				copper = 4;
................................................................................
    59     66   	};
    60     67   	steel = {
    61     68   		ingot = 'default:steel_ingot';
    62     69   		block = 'default:steelblock';
    63     70   		tone = {240,240,240};
    64     71   		items = default_items('steel');
    65     72   		maxenergy = 200;
           73  +		hardness = 5;
    66     74   		slots = {
    67     75   			{affinity = {'praxic'}; confluence = 0.5};
    68     76   		};
    69     77   	};
    70     78   	aluminum = {
    71     79   		tone = {196,64,32}, alpha = 128;
           80  +		dye = 'red';
    72     81   		meltpoint = 1;
    73     82   		rarity = 12; depth = 158;
    74     83   		power = 3; speed = 2.4;
    75     84   		durability = 700; cooktime = 25;
           85  +		hardness = 6;
    76     86   		armor_weight = 0.3;
    77     87   		maxenergy = 400;
    78     88   		slots = {
    79     89   			{affinity = {'syncretic'}; confluence = 0.7};
    80     90   			{affinity = {'praxic'}; confluence = 0.4};
    81     91   		};
    82     92   	};
    83     93   	levitanium = {
    84     94   		tone = {17,255,191}, alpha = 40;
           95  +		dye = 'bright_blue';
    85     96   		meltpoint = 4;
           97  +		hardness = 3;
    86     98   		rarity = 17; depth = 870;
    87     99   		power = 1; durability = 50; cooktime = 70;
    88    100   		armor_weight = -2.2; armor_protection = 1;
    89    101   		maxenergy = 5000;
    90    102   		no_tools = true;
    91    103   	};
    92    104   	platinum = {
    93    105   		tone = {255,233,118}, alpha = 50;
    94    106   		meltpoint = 1;
    95    107   		rarity = 15; depth = 580;
    96    108   		power = 4; speed = 3;
          109  +		hardness = 6;
    97    110   		durability = 1400; cooktime = 40;
    98    111   		armor_weight = 0.7;
    99    112   		maxenergy = 1000;
   100    113   		slots = {
   101    114   			{affinity = {'praxic','counterpraxic'}; confluence = 0.3};
   102    115   			{affinity = {'counterpraxic'}; confluence = 0.8};
   103    116   		}
   104    117   	};
   105    118   	gold = {
          119  +		dye = 'yellow';
   106    120   		ingot = 'default:gold_ingot';
   107    121   		block = 'default:goldblock';
   108    122   		tone = {255,225,47};
          123  +		hardness = 1;
   109    124   		maxenergy = 3000;
   110    125   		slots = {
   111    126   			{affinity = {'praxic','counterpraxic'}; confluence = 1.4};
   112    127   			{affinity = {'praxic','counterpraxic'}; confluence = 1.2};
   113    128   		}
   114    129   	};
   115    130   	silver = {
   116    131   		tone = {218,255,246};
   117         -
          132  +		dye = 'white';
   118    133   		maxenergy = 2000;
          134  +		hardness = 1;
   119    135   		depth = 380; rarity = 13.5;
   120    136   		no_armor = true; no_tools = true;
   121    137   		power = 1; cooktime = 8; hardness = 1;
   122    138   	};
   123    139   	electrum = {
   124    140   		tone = {212, 255, 0}, alpha = 80;
   125    141   		artificial = true;
          142  +		hardness = 1;
          143  +		dye = 'bright_green';
   126    144   		mix = {
   127    145   			metals = {
   128    146   				silver = 1;
   129    147   				gold = 1;
   130    148   			};
   131    149   		};
          150  +		sinter = { 'silver', 'gold' };
   132    151   		no_tools = true;
   133    152   	};
   134    153   	tungsten = {
   135    154   		tone = {0,255,163}, alpha = 70;
   136    155   		rarity = 14;
   137    156   		speed = 2.8;
   138    157   		power = 4;
          158  +		hardness = 8;
   139    159   		meltpoint = 4;
   140    160   		cooktime = 100;
   141    161   		durability = 2700;
   142    162   		maxenergy = 1500;
   143    163   		slots = {
   144    164   			{affinity = {'counterpraxic'}, confluence = 0.6};
   145    165   			{affinity = {'praxic','counterpraxic'}, confluence = 1};
   146    166   			{affinity = {'praxic'}, confluence = 0.5};
   147    167   		};
   148    168   	};
   149    169   	cobalt = {
          170  +		dye = 'blue';
   150    171   		tone = {48,101,255}, alpha = 90;
   151    172   		rarity = 17;
   152    173   		durabilty = 900;
          174  +		hardness = 6;
   153    175   		power = 3;
   154    176   		speed = 3.5;
   155    177   		cooktime = 30;
   156    178   		maxenergy = 3500;
   157    179   		slots = {
   158    180   			{
   159    181   				affinity = {'counterpraxic'};
................................................................................
   160    182   				confluence = 0.65;
   161    183   				interference = {speed = 1};
   162    184   			};
   163    185   		}
   164    186   	};
   165    187   	lithium = {
   166    188   		tone = {255,252,93}, alpha = 80;
          189  +		dye = 'yellow';
   167    190   		rarity = 13;
          191  +		hardness = 2;
          192  +		fuel = 80;
   168    193   		no_tools = true;
   169    194   		no_armor = true;
   170    195   	};
   171    196   	iridium = {
   172    197   		tone = {209,88,241}, alpha = 80;
          198  +		dye = 'purple';
   173    199   		rarity = 18;
   174    200   		meltpoint = 3;
   175    201   		cooktime = 340;
          202  +		hardness = 7;
   176    203   		maxenergy = 1800;
   177    204   		durability = 1900;
   178    205   		speed = 3.2;
   179    206   		img = {
   180    207   			-- ingot = 'sorcery_iridium_ingot.png';
   181    208   			-- block = 'sorcery_iridium_block.png';
   182    209   		};
................................................................................
   187    214   	};
   188    215   	duridium = {
   189    216   		tone = {255,64,175}, alpha = 70;
   190    217   		cooktime = 120;
   191    218   		artificial = true;
   192    219   		durability = 3400;
   193    220   		speed = 3.1;
          221  +		hardness = 9;
   194    222   		power = 5;
   195    223   		mix = {
   196    224   			metals = {
   197    225   				platinum = 4;
   198    226   				aluminum = 4;
   199    227   				tin = 1;
   200    228   			};
................................................................................
   210    238   	};
   211    239   	impervium = {
   212    240   		tone = {226,255,107}, alpha = 90;
   213    241   		cooktime = 260;
   214    242   		meltpoint = 5;
   215    243   		artificial = true;
   216    244   		speed = 2.1;
          245  +		hardness = 20;
   217    246   		durability = 5300;
   218    247   		maxenergy = 2300;
   219    248   		watercool = true;
   220    249   		mix = {
   221    250   			metals = {
   222    251   				duranium = 4;
   223    252   				iridium = 2;
................................................................................
   232    261   	};
   233    262   	eternium = {
   234    263   		tone = {156,82,222}, alpha = 100;
   235    264   		cooktime = 500;
   236    265   		meltpoint = 6;
   237    266   		artificial = true;
   238    267   		speed = 2;
          268  +		hardness = 9;
   239    269   		maxenergy = 1200;
   240    270   		durability = 8100;
   241    271   		watercool = true;
   242    272   		mix = {
   243    273   			metals = {
   244    274   				iridium = 2;
   245    275   				tungsten = 2;
................................................................................
   253    283   	};
   254    284   	unobtanium = {
   255    285   		tone = {114,255,214}, alpha = 120;
   256    286   		meltpoint = 3;
   257    287   		cooktime = 330;
   258    288   		artificial = true;
   259    289   		maxenergy = 4000;
          290  +		hardness = 7;
   260    291   		durability = 3300;
   261    292   		speed = 3.4;
   262    293   		slots = {
   263    294   			{affinity={'praxic'}, confluence = 0.7};
   264    295   			{affinity={'counterpraxic'}, confluence = 1.2};
   265    296   			{affinity={'cognic'}, confluence = 1.1};
   266    297   		};

Modified data/spells.lua from [3dd4d17be3] to [47b0c7f3e9].

   289    289   		desc = 'Pour life-energy into the soil, causing flowers and trees to spring up at your command';
   290    290   		affinity = {'jungle','verdant'};
   291    291   	};
   292    292   	praxic        = anchorwand('praxic',       16, {'pine','shimmering','blazing'});
   293    293   	counterpraxic = anchorwand('counterpraxic',23, {'pine','shimmering','silent'});
   294    294   	entropic      = anchorwand('entropic',      8, {'jungle','dark'});
   295    295   	syncretic     = anchorwand('syncretic',    12, {'aspen','verdant','shimmering','blazing'});
   296         -	cognic        = anchorwand('cognic',       36, {'acacia','verdant','dark'});
          296  +	cognic        = anchorwand('cognic',       32, {'acacia','verdant','dark'});
          297  +	occlutic      = anchorwand('occlutic',     15, {'apple','silent','dark'});
          298  +	imperic       = anchorwand('imperic',       8, {'apple','verdant','blazing'});
          299  +	mandatic      = anchorwand('mandatic',     18, {'jungle','verdant','silent'});
   297    300   	shape = {
   298    301   		name = 'shaping';
   299    302   		uses = 24;
   300    303   		color = {255,114,65};
   301    304   		leytype = 'praxic';
   302    305   		affinity = {'apple','blazing'};
   303    306   		desc = 'With an enchanter, physically alter the mundane qualities of an object';

Modified enchanter.lua from [2062a1f6be] to [41724791de].

   167    167   		-- determine the power of a particular enchantment on
   168    168   		-- an enchanted item.
   169    169   		local e = sorcery.enchant.get(stack)
   170    170   		local p = 0.0
   171    171   		local slots = sorcery.matreg.lookup[stack:get_name()].data.slots
   172    172   		-- TODO handle strength-boosting spells!
   173    173   		for _,s in pairs(e.spells) do
   174         -			print(dump(s))
   175    174   			if s.id == id then p = p + ((s.boost * slots[s.slot].confluence)/10) end
   176    175   		end
   177    176   		return p
   178    177   	end
   179    178   	sorcery.enchant.stackup = function(stack)
   180    179   		-- stack update function. this should be called whenever
   181    180   		-- the enchantment status of a stack changes; it will
................................................................................
   263    262   minetest.register_craftitem('sorcery:enchanter_pedestal',{
   264    263   	inventory_image = 'sorcery_enchanter_pedestal.png';
   265    264   	description = 'Pedestal';
   266    265   })
   267    266   minetest.register_craft {
   268    267   	output = 'sorcery:enchanter_channeler';
   269    268   	recipe = {
   270         -		{'','default:bronze_ingot',''};
          269  +		{'sorcery:grease_enchanting','sorcery:platinum_ingot','sorcery:grease_enchanting'};
   271    270   		{'basic_materials:gold_wire','basic_materials:steel_strip','basic_materials:gold_wire'};
   272    271   		{'','sorcery:electrum_ingot',''};
   273    272   	};
   274    273   	replacements = {
          274  +		{'sorcery:grease_enchanting','xdecor:bowl'};
          275  +		{'sorcery:grease_enchanting','xdecor:bowl'};
   275    276   		{'basic_materials:gold_wire','basic_materials:empty_spool'};
   276    277   		{'basic_materials:gold_wire','basic_materials:empty_spool'};
   277    278   	};
   278    279   }
   279    280   minetest.register_craft {
   280    281   	output = 'sorcery:enchanter_pedestal';
   281    282   	recipe = {
   282    283   		{'basic_materials:copper_strip','group:wood','basic_materials:copper_strip'};
   283         -		{'','default:bronze_ingot',''};
          284  +		{'','sorcery:iridium_ingot',''};
   284    285   		{'','group:wood',''};
   285    286   	};
   286    287   }
   287    288   minetest.register_craft {
   288    289   	output = 'sorcery:enchanter';
   289    290   	recipe = {
   290         -		{'','sorcery:enchanter_channeler',''};
          291  +		{'sorcery:grease_sealant','sorcery:enchanter_channeler','sorcery:grease_sealant'};
   291    292   		{'sorcery:enchanter_channeler','sorcery:enchanter_pedestal','sorcery:enchanter_channeler'};
   292    293   		{'group:wood','group:wood','group:wood'};
   293    294   	};
          295  +	replacements = {
          296  +		{'sorcery:grease_sealant','xdecor:bowl'};
          297  +		{'sorcery:grease_sealant','xdecor:bowl'};
          298  +	};
   294    299   }
   295    300   for i=1,10 do
   296    301   	minetest.register_node('sorcery:air_flash_' .. i, {
   297    302   		drawtype = 'airlike';
   298    303   		pointable = false; walkable = false;
   299    304   		buildable_to = true;
   300    305   		sunlight_propagates = true;
................................................................................
   319    324   	-- replace the air with a "glow-air" that removes
   320    325   	-- itself after a short period of time, to create
   321    326   	-- a flash of light when an enchanted tool's used
   322    327   	-- to dig out a node
   323    328   	local tool = puncher:get_wielded_item()
   324    329   	local ench = sorcery.enchant.get(tool)
   325    330   	if #ench.spells == 0 then return end
   326         -	print('enchanted!')
   327    331   	local sparks = {}
   328    332   	-- local spark = function(name,color)
   329    333   	local material = sorcery.enchant.getsubj(tool)
   330    334   	local totalcost = 0
   331    335   	do local done = {} for _,sp in pairs(ench.spells) do
   332    336   		if done[sp.id] then goto skip end
   333    337   		done[sp.id] = true

Modified gems.lua from [461d75b6c5] to [67735ebab8].

     1      1   --- gemstones
            2  +local shards_per_gem = 9
     2      3   
     3      4   sorcery.register_gem = function(name,gem)
     4      5   	local itemname = gem.foreign or 'sorcery:gem_' .. name
     5      6   	local shardname = gem.foreign_shard or 'sorcery:gem_' .. name .. '_shard'
     6      7   	local amuletname = gem.foreign_amulet or 'sorcery:gem_' .. name .. '_amulet'
     7      8   
     8      9   	local tools, armors = sorcery.matreg.tools, sorcery.matreg.armors
     9         -	if gem.tools then for _,t in pairs(tools) do
           10  +	if gem.tools then for t,c in pairs(tools) do
    10     11   		sorcery.matreg.lookup[(gem.items and gem.items[t]) or ('sorcery:' .. t .. '_' .. name)] = {
    11     12   			gem = true;
    12     13   			id = name; data = gem;
           14  +			value = c.cost*shards_per_gem;
    13     15   		}
    14     16   	end end
    15         -	if gem.armor then for _,a in pairs(armors) do
           17  +	if gem.armor then for a,c in pairs(armors) do
    16     18   		sorcery.matreg.lookup[(gem.items and gem.items[a]) or ('sorcery:' .. a .. '_' .. name)] = {
    17     19   			gem = true;
    18     20   			id = name; data = gem;
           21  +			value = c.cost*shards_per_gem;
    19     22   		}
    20     23   	end end
    21     24   
    22     25   	if gem.foreign_shard then
    23     26   		minetest.clear_craft {output=shardname}
    24     27   	else
    25     28   		minetest.register_craftitem(shardname, {

Modified init.lua from [5c9fa3f240] to [8277bf1fce].

    36     36   	'tbl', 'class';
    37     37   	-- wrappers
    38     38   	'color', 'image', 'ui';
    39     39   }
    40     40   
    41     41   sorcery.unit() { 'compat', 'matreg' }
    42     42   sorcery.unit('data') {
           43  +	'compat';
    43     44   	'affinities'; 'gods';
    44     45   	'enchants', 'spells';
    45     46   	'gems', 'metals';
    46     47   	'potions', 'oils', 'greases',
    47     48   		'draughts', 'elixirs',
    48     49   		'philters', 'extracts';
    49     50   	'register';
    50     51   }
    51     52   
    52     53   for _,u in pairs {
    53     54   	'leylines'; 'ores'; 'gems';
    54     55   	'potions'; 'infuser'; 'altar'; 'wands';
    55     56   	'tools'; 'enchanter'; 'harvester';
    56         -	'metallurgy-hot'; 'entities'; 'recipes';
    57         -	'coins'; 'interop'; 'tnodes';
           57  +	'metallurgy-hot', 'metallurgy-cold';
           58  +	'entities'; 'recipes'; 'coins';
           59  +	'interop'; 'tnodes';
    58     60   } do sorcery.load(u) end

Modified leylines.lua from [aa52733fca] to [112e3b2a50].

     1      1   -- contains functions for determining information about
     2      2   -- the nearest leyline and its currents
     3      3   
     4      4   sorcery.ley = {}
     5      5   
     6         --- leylines are invisible force-currents that rise up from the core of the earth, carrying magical energy upwards. they weaken as they get closer to the surface. each leyline also has between one and three 'affinities', which control how easily they can be wielded to perform particular sorts of magic. for instance, telestratic-affine leylines will charge wands enchanted with telestratic spells more quickly than leylines lacking this affinity.
            6  +-- leylines are invisible force-currents that rise up from the core of the earth, carrying magical energy upwards. they weaken as they get closer to the surface. each leyline also has between one and three 'affinities', which control how easily they can be wielded to perform particular sorts of magic. for instance, praxic-affine leylines will charge wands enchanted with praxic spells more quickly than leylines lacking this affinity.
            7  +-- leylines are one of two mystic energy forms; the other is aetheric energy, which is beamed down from Heaven by the sun during the day and is the power wielded by the gods. mortals can make limited use of aetheric force by collecting it and beaming it from place to place -- see aether.lua (aether is stored and manipulated by use of diamond)
            8  +-- leylines are always available, unlike aetheric force, which can only be collected during the day. but aetheric force is accessible wherever one can see the sky, and the higher up you are, the more you can collect, whereas leylines vary randomly in strength and affinity by position.
     7      9   
     8     10   sorcery.ley.estimate = function(pos)
     9     11   	local affs = {
    10     12   		'praxic'; 'counterpraxic'; 'cognic';
    11     13   		'mandatic'; 'occlutic'; 'imperic';
    12     14   		'syncretic'; 'entropic';
    13     15   	};
................................................................................
    42     44   	privs = { server = true };
    43     45   	func = function(caller,params)
    44     46   		local pos = minetest.get_player_by_name(caller):get_pos()
    45     47   		local ley = sorcery.ley.estimate(pos)
    46     48   		minetest.chat_send_player(caller, 'Leyline force ' .. tostring(ley.force) .. ' with affinities ' .. table.concat(ley.aff, ','))
    47     49   	end;
    48     50   })
           51  +
           52  +-- leyline energy can be transmitted via a conduit from a leysink. however, it cannot be stored like aetheric energy can be; leyline energy must be drawn when needed unless it is bound up in an enchantment (which simply delays its expression). leysinks provide a constant source of ley-force.
           53  +-- there are two nodes for transmitting leyline energy, wires and conduits. wires transmit a limited amount of energy, but are cheap and small. conduits transmit much more, but are expensive and take up full blocks. both are composed of electrum, the carrier, and copper, which prevents the ley-force from leaking out as dangerous radiance.
           54  +
           55  +minetest.register_node('sorcery:conduit', {
           56  +	description = 'Conduit';
           57  +	tiles = {
           58  +		'sorcery_conduit_copper_top.png';
           59  +		'sorcery_conduit_copper_top.png';
           60  +		'sorcery_conduit_copper_side.png';
           61  +	};
           62  +	groups = {
           63  +		sorcery_ley_device = 1;
           64  +		cracky = 3;
           65  +	};
           66  +	_sorcery = {
           67  +		ley = { mode = 'signal'; power = 10 };
           68  +	};
           69  +})
           70  +minetest.register_craft {
           71  +	output = 'sorcery:conduit 4';
           72  +	recipe = {
           73  +		{'default:copper_ingot', 'default:copper_ingot',  'default:copper_ingot'};
           74  +		{'default:copper_ingot', 'sorcery:electrumblock', 'default:copper_ingot'};
           75  +		{'default:copper_ingot', 'default:copper_ingot',  'default:copper_ingot'};
           76  +	};
           77  +};
           78  +minetest.register_craft {
           79  +	output = 'sorcery:wire 4';
           80  +	recipe = {
           81  +		{'', 'basic_materials:copper_wire',''};
           82  +		{'', 'sorcery:fragment_electrum',  ''};
           83  +		{'', 'basic_materials:copper_wire',''};
           84  +	}
           85  +};
           86  +
           87  +sorcery.ley.field_to_current = function(strength,time)
           88  +	local ley_factor = 0.25
           89  +	-- a ley harvester will produce this much current with
           90  +	-- access to a full-strength leyline
           91  +	
           92  +	return strength * ley_factor * time;
           93  +end
           94  +
           95  +do -- register condenser
           96  +	local gem = sorcery.lib.image('default_diamond_block.png')
           97  +	local amethyst = gem:multiply(sorcery.lib.color(sorcery.data.gems.amethyst.tone))
           98  +	local emerald = gem:multiply(sorcery.lib.color(sorcery.data.gems.emerald.tone))
           99  +	local box = {
          100  +		type = 'fixed';
          101  +		fixed = {
          102  +			-0.5, -0.5, -0.5;
          103  +			 0.5,  1.2,  0.5;
          104  +		};
          105  +	};
          106  +	minetest.register_node('sorcery:condenser', {
          107  +		description = 'Condenser';
          108  +		drawtype = 'mesh';
          109  +		mesh = 'sorcery-condenser.obj';
          110  +		selection_box = box;
          111  +		collision_box = box;
          112  +		tiles = {
          113  +			amethyst:render();
          114  +			'sorcery_condenser.png';
          115  +			'default_tin_block.png';
          116  +			'default_stone.png';
          117  +			'default_copper_block.png';
          118  +			emerald:render();
          119  +		};
          120  +		groups = {
          121  +			cracky = 2;
          122  +			sorcery_ley_device = 1;
          123  +		};
          124  +		on_construct = function(pos)
          125  +			local meta = minetest.get_meta(pos)
          126  +			meta:set_string('infotext','Condenser')
          127  +		end;
          128  +		_sorcery = {
          129  +			ley = { mode = 'produce' };
          130  +			on_leycalc = function(pos,time)
          131  +				local l = sorcery.ley.estimate(pos)
          132  +				return {
          133  +					power = sorcery.ley.field_to_current(l.force, time);
          134  +					affinity = l.aff;
          135  +				}
          136  +			end;
          137  +		};
          138  +	})
          139  +end
          140  +
          141  +minetest.register_craft {
          142  +	output = 'sorcery:condenser';
          143  +	recipe = {
          144  +		{'sorcery:accumulator'};
          145  +		{'sorcery:conduit'};
          146  +	};
          147  +}
          148  +sorcery.ley.mapnet = function(startpos,power)
          149  +	-- this function returns a list of all the nodes accessible from
          150  +	-- a ley network and their associated positions
          151  +	local net = {}
          152  +	power = power or 0
          153  +	
          154  +	local devices = {
          155  +		consume = {};
          156  +		produce = {};
          157  +		signal = {};
          158  +	}
          159  +	local numfound = 0
          160  +	local maxconduct = 0
          161  +	local minconduct
          162  +	local foundp = function(p)
          163  +		for k in pairs(net) do
          164  +			if vector.equals(p,k) then return true end
          165  +		end
          166  +		return false
          167  +	end
          168  +	-- we're implementing this with a recursive function to start with
          169  +	-- but this could rapidly lead to stack overflows so we should
          170  +	-- replace it with a linear one at some point
          171  +	local function find(positions)
          172  +		local searchnext = {}
          173  +		for _,pos in pairs(positions) do
          174  +			for _,p in pairs {
          175  +				{x =  0, z =  0, y =  0};
          176  +				{x = -1, z =  0, y =  0};
          177  +				{x =  1, z =  0, y =  0};
          178  +				{x =  0, z = -1, y =  0};
          179  +				{x =  0, z =  1, y =  0};
          180  +				{x =  0, z =  0, y = -1};
          181  +				{x =  0, z =  0, y =  1};
          182  +			} do local sum = vector.add(pos,p)
          183  +				if not foundp(sum) then
          184  +					local nodename = minetest.get_node(sum).name
          185  +					if minetest.get_item_group(nodename,'sorcery_ley_device') ~= 0
          186  +					   or sorcery.data.compat.ley[nodename] then
          187  +						local d = sorcery.ley.sample(pos,1,nodename)
          188  +						assert(d.mode == 'signal'
          189  +						    or d.mode == 'consume'
          190  +						    or d.mode == 'produce')
          191  +						devices[d.mode][#(devices[d.mode]) + 1] = {
          192  +							id = nodename; pos = sum;
          193  +						}
          194  +						if d.mode == 'signal' then
          195  +							if d.power > power then
          196  +								if minconduct then
          197  +									if d.power < minconduct then
          198  +										minconduct = d.power
          199  +									end
          200  +								else minconduct = d.power end
          201  +								if d.power > maxconduct then
          202  +									maxconduct = d.power
          203  +								end
          204  +							end
          205  +						end
          206  +						numfound = numfound + 1;
          207  +						net[sum] = nodename;
          208  +						searchnext[#searchnext + 1] = sum;
          209  +					end
          210  +				end
          211  +			end
          212  +		end
          213  +		if #searchnext > 0 then find(searchnext) end
          214  +	end
          215  +
          216  +	find{startpos}
          217  +
          218  +	if numfound > 0 then
          219  +		return {
          220  +			count = numfound;
          221  +			map = net;
          222  +			devices = devices;
          223  +			conduct = {
          224  +				min = minconduct;
          225  +				max = maxconduct;
          226  +			};
          227  +		}
          228  +	else return nil end
          229  +end
          230  +
          231  +do local afftbl = {
          232  +		[1] = 'praxic';   [2] = 'counterpraxic';
          233  +		[3] = 'cognic';   [4] = 'syncretic';
          234  +		[5] = 'mandatic'; [6] = 'occlutic';
          235  +		[7] = 'imperic';  [8] = 'entropic';
          236  +	}
          237  +	local modetbl = {
          238  +		[0] = 'none';
          239  +		[1] = 'consume';
          240  +		[2] = 'produce';
          241  +		[3] = 'signal';
          242  +	}
          243  +	for i=1,#afftbl  do afftbl [afftbl [i]] = i end
          244  +	for i=1,#modetbl do modetbl[modetbl[i]] = i end
          245  +	local m = sorcery.lib.marshal
          246  +	local enc, dec = m.transcoder {
          247  +		mode = m.t.u8;
          248  +		power = m.t.u32; -- power generated/consumed * 10,000
          249  +		affinity = m.g.array(m.t.u8); -- indexes into afftbl
          250  +	}
          251  +	sorcery.ley.encode = function(l)
          252  +		local idxs = {}
          253  +		for _,k in pairs(l.affinity) do
          254  +			idxs[#idxs+1] = afftbl[k]
          255  +		end
          256  +		return meta_armor(enc {
          257  +			mode = modetbl[l.mode];
          258  +			power = l.power * 10000;
          259  +			affinity = idxs;
          260  +		}, true)
          261  +	end
          262  +	sorcery.ley.decode = function(str)
          263  +		local obj = dec(meta_dearmor(str,true))
          264  +		local affs = {}
          265  +		for _,k in pairs(obj.affinity) do
          266  +			affs[#affs+1] = afftbl[k]
          267  +		end
          268  +		return {
          269  +			mode = modetbl[obj.mode];
          270  +			power = obj.power / 10000.0;
          271  +			affinity = affs;
          272  +		}
          273  +	end
          274  +end
          275  +sorcery.ley.setnode = function(pos,l)
          276  +	local meta = minetest.get_node(pos)
          277  +	meta:set_string('sorcery:ley',sorcery.ley.encode(l))
          278  +end
          279  +
          280  +sorcery.ley.sample = function(pos,timespan,name)
          281  +	-- returns how much ley-force can be transmitted by a
          282  +	-- device over timespan
          283  +	name = name or minetest.get_node(pos).name
          284  +	local props = minetest.registered_nodes[name]._sorcery
          285  +	local callback = props and props.on_leycalc or nil
          286  +	local p,a,m
          287  +	if callback then
          288  +		local gen = callback(pos,timespan)
          289  +		p = gen.power
          290  +		a = gen.affinity
          291  +		m = gen.mode
          292  +	end
          293  +
          294  +	if not (p and a and m) then
          295  +		local nm = minetest.get_meta(pos)
          296  +		if nm:contains('sorcery:ley') then
          297  +			local l = sorcery.ley.decode(nm:get_string('sorcery:ley'))
          298  +			p = p or sorcery.ley.field_to_current(l.power,timespan)
          299  +			a = a or l.affinity
          300  +			m = m or l.mode
          301  +		end
          302  +	end
          303  +
          304  +	if (not (p and a and m)) and props and props.ley then
          305  +		p = p or sorcery.ley.field_to_current(props.ley.power,timespan)
          306  +		a = a or props.ley.affinity
          307  +		m = m or props.ley.mode
          308  +	end
          309  +
          310  +	if (not (p and a and m)) then
          311  +		local compat = sorcery.data.compat.ley[name] 
          312  +		if compat then
          313  +			p = p or sorcery.ley.field_to_current(compat.power,timespan)
          314  +			a = a or compat.affinity
          315  +			m = m or compat.mode
          316  +		end
          317  +	end
          318  +
          319  +	return {
          320  +		power = p or 0;
          321  +		mode = m or 'none';
          322  +		affinity = a or {};
          323  +	}
          324  +end
          325  +
          326  +sorcery.ley.netcaps = function(pos,timespan,exclude)
          327  +	local net = sorcery.ley.mapnet(pos)
          328  +	local maxpower = 0
          329  +	local freepower = 0
          330  +	local affs,usedaffs = {},{}
          331  +	for _,n in pairs(net.devices.produce) do
          332  +		if not exclude or not vector.equals(n.pos,exclude) then
          333  +			local ln = sorcery.ley.sample(n.pos,timespan,n.id)
          334  +			maxpower = maxpower + ln.power
          335  +			for _,a in pairs(ln.affinity) do
          336  +				affs[a] = (affs[a] or 0) + 1
          337  +			end
          338  +		end
          339  +	end
          340  +	freepower = maxpower;
          341  +	for _,n in pairs(net.devices.consume) do
          342  +		if not exclude or not vector.equals(n.pos,exclude) then
          343  +			local ln = sorcery.ley.sample(n.pos,timespan,n.id)
          344  +			freepower = freepower - ln.power
          345  +			for _,a in pairs(ln.affinity) do
          346  +				usedaffs[a] = (usedaffs[a] or 0) + 1
          347  +			end
          348  +		end
          349  +	end
          350  +	
          351  +	return {
          352  +		net = net;
          353  +		freepower = freepower;
          354  +		maxpower = maxpower;
          355  +		affinity = affs;
          356  +		affinity_balance = usedaffs;
          357  +	}
          358  +end

Modified lib/marshal.lua from [9fd6c4419a] to [30a22c2236].

     1         --- minetest provides its own built-in serializer mechanisms.
     2         --- however, these leave much to be desired: the first works
     3         --- by converting values to *lua source code* and 'deserializes'
     4         --- these values by executing it in a mildly sandboxed env.
     5         --- it's LSON basically. the other serializer is JSON. clearly
     6         --- we need something better. if this was lua 5.3, we'd just
     7         --- use string.pack, but alas, they had to use luajit, which
     8         --- is stuck on an ancient version because it no longer exists.
     9         --- if we built against moonjit, we could use pack, but then
    10         --- that would raise compat issues for other users who might
    11         --- want to use these mods. so we need to write our own.
            1  +-- minetest provides its own  built-in serializer mechanisms. however,
            2  +-- these  leave much  to be  desired:  the first  works by  converting
            3  +-- values  to *lua  source code*  and 'deserializes'  these values  by
            4  +-- executing it  in a mildly  sandboxed env. it's LSON  basically. the
            5  +-- other serializer is JSON. clearly we need something better. if this
            6  +-- was lua 5.3,  we'd just use string.pack, but alas,  they had to use
            7  +-- luajit, which is  stuck on an ancient version because  it no longer
            8  +-- exists. if  we built against moonjit,  we could use pack,  but then
            9  +-- that would  raise compat issues for  other users who might  want to
           10  +-- use these mods. so we need to write our own.
           11  +--
           12  +-- good news  is, it's very easy  to do better than  both the minetest
           13  +-- people and the  clowns at PUC-Rio. (if only we  had general purpose
           14  +-- bitops, it would be even easier)
    12     15   --
    13         --- good news is, it's very easy to do better than both the
    14         --- minetest people and the clowns at PUC-Rio. (if only we had
    15         --- general purpose bitops, it would be even easier)
           16  +-- WARNING: when storing binary data  in minetest metadata stores, the
           17  +-- bytes  0x01-0x03 MUST  be avoided  or they  will break  the kvstore
           18  +-- format and  the item/node's metadata  will become corrupt.  use the
           19  +-- lib.str.meta_{,de}armor functions  on the output of  pack/unpack to
           20  +-- safely store and retrieve data structures from meta storage.
    16     21   
    17     22   local m = {
    18     23   	err = {
    19     24   		unmarshalled = {
    20     25   			exp = 'the bytes passed are not a marshalled data structure';
    21     26   		};
    22     27   		corrupt = {

Added lib/objstore.lua version [368570196c].

            1  +-- marshal provides low-level data marshalling capabilities, but
            2  +-- for various reasons it's handy to have a higher-level interface
            3  +-- that allows us to register and retrieve data structures from
            4  +-- node or item metadata. this library provides that interface.
            5  +
            6  +-- objstore consists of a single function that returns a structure
            7  +-- store. this structure-store should be saved to a variable, and
            8  +-- called upon to register or modify attributes. every node or item
            9  +-- that contains metadata contains a list of attached structures,
           10  +-- which themselves contain a list of attached records. this allows
           11  +-- structures to be extended at will without disrupting existing
           12  +-- metadata storage.
           13  +
           14  +-- WARNING: this is likely incompatible with the StorageRef backend,
           15  +-- which uses json -- need to figure out how to make the marshalling
           16  +-- format compatible
           17  +
           18  +local lib = sorcery.lib
           19  +local m = lib.marshal
           20  +
           21  +local recpack, recunpack = m.transcoder {
           22  +	recs = m.g.array(m.g.struct {
           23  +		id = m.t.str;
           24  +		data = m.t.blob;
           25  +	});
           26  +}
           27  +return function() {
           28  +	return {
           29  +		structs = {};
           30  +		register = function(self,id)
           31  +			local struc = {
           32  +				id = id;
           33  +				records = {};
           34  +				register_record = function(self,def)
           35  +					if not records[def.id] then
           36  +						records[def.id] = def
           37  +						return true
           38  +					else
           39  +						return false
           40  +					end
           41  +				end;
           42  +				_encode = function(self,data)
           43  +					local obj = {}
           44  +					for k,v in pairs(records) do
           45  +						local t = m.transcoder(v.fields)
           46  +						obj[#obj + 1] = {
           47  +							id = k;
           48  +							data = t(data[k]);
           49  +						}
           50  +					end
           51  +					return recpack(obj)
           52  +				end;
           53  +				_decode = function(self,str)
           54  +				end;
           55  +				_meta = function(self,store)
           56  +					return {
           57  +						store = store;
           58  +						_getall = function(iself)
           59  +							return self:_decode(lib.str.meta_dearmor(iself.store:get_string('objstore:'..id),true))
           60  +						end;
           61  +						_save = function(iself,obj)
           62  +							iself.store:set_string('objstore:'..id, lib.str.meta_armor(self:_encode(obj)))
           63  +						end;
           64  +						get = function(self,rec)
           65  +							local recs = recunpack(lib.str.meta_dearmor(self.store:get_string('objstore:'..id),true))
           66  +							for _,r in pairs(recs) do
           67  +								if r.id == rec then
           68  +									return r
           69  +								end
           70  +							end
           71  +							return nil
           72  +						end;
           73  +						merge = function(self,obj)
           74  +							-- obj should be a table of structure {
           75  +							--		record_id = { record_field = value; }
           76  +							-- }, e.g.:
           77  +							--   sorcery.store.enchantment.merge {
           78  +							--		spells = {
           79  +							--			[4] = { id = 'dowse, boost = 15 }
           80  +							--		}
           81  +							--	}
           82  +							local recs = self:_getall()
           83  +							for rec,flds in pairs(obj) do
           84  +								for k,v in pairs(flds) do
           85  +									if not recs[rec] then recs[rec] = {} end
           86  +									recs[rec][k] = v
           87  +								end
           88  +							end
           89  +							self:_save(recs)
           90  +						end;
           91  +					}
           92  +				end;
           93  +				item = function(self,stack)
           94  +					return self:_meta(stack:get_meta())
           95  +				end;
           96  +				node = function(self,pos)
           97  +					return self:_meta(minetest.get_meta(pos))
           98  +				end;
           99  +				user = function(self,u)
          100  +					if type(u) == 'string' then
          101  +						u = minetest.get_player_by_name(u)
          102  +					end
          103  +					return self:_meta(u:get_meta())
          104  +				end;
          105  +			}
          106  +			self.structs[id] = struc;
          107  +			return struc;
          108  +		end;
          109  +	}
          110  +}

Modified matreg.lua from [550cf0df14] to [4e7450eef0].

     1      1   return {
     2      2   	lookup = {};
     3      3   	tools = {
     4         -		'pick'; 'axe'; 'shovel';
     5         -		'sword'; 'hoe';
            4  +		pick = { cost = 3; };
            5  +		axe = { cost = 3; };
            6  +		shovel = { cost = 1; };
            7  +		sword = { cost = 2; };
            8  +		hoe = { cost = 2; };
     6      9   	};
     7     10   	armors = {
     8         -		'helmet'; 'boots'; 'shield';
     9         -		'chestplate'; 'leggings';
           11  +		helmet = { cost = 5 };
           12  +		boots = { cost = 4 };
           13  +		leggings = { cost = 6 };
           14  +		chestplate = { cost = 8 };
           15  +		shield = { cost = 7 };
    10     16   	};
    11     17   }

Added metallurgy-cold.lua version [c21bb1a7ca].

            1  +-- eventually this will need to be a powered node,
            2  +-- but for now i'm just overlooking the need for
            3  +-- power and making it work for free
            4  +local constants = {
            5  +	mill_refresh = 1;
            6  +	-- interval at which the mill progress is checked
            7  +	-- the formspec is updated
            8  +
            9  +	grind_range = 20;
           10  +	-- maximum difference between the hardness of
           11  +	-- any two metals in the database
           12  +	
           13  +	grind_grace_range = 2;
           14  +	-- how many levels of hardness a grind head
           15  +	-- can grind above its own (while taking massive
           16  +	-- levels of damage)
           17  +
           18  +	grind_grace_penalty = 3;
           19  +	-- factor by which wear is increased when grinding
           20  +	-- above your paygrade
           21  +
           22  +	grind_factor = 10;
           23  +	-- adjusts the amount of time it takes to grind
           24  +	-- metal into powder
           25  +	
           26  +	grind_wear = 2000;
           27  +	-- amount of damage done to a grind head grinding
           28  +	-- metal of equal hardness. increased or decreased
           29  +	-- depending on differential
           30  +	
           31  +	grind_torque_factor = 0.1;
           32  +	-- how many points of hardness translate into how
           33  +	-- much ley-current needed (per second)
           34  +	
           35  +	metal_grindvalue = 4;
           36  +	-- how many powders an ingot is worth
           37  +
           38  +	default_grindvalue = 1;
           39  +	-- number of items produced when not otherwise
           40  +	-- specified
           41  +	
           42  +	default_hardness = 1;
           43  +	-- difficulty to grind an item when not otherwise
           44  +	-- specified
           45  +
           46  +	metal_grindcost = 1;
           47  +	-- number of metal items needed to perform a grind
           48  +}
           49  +local mill_formspec_update = function(pos,pct,stat1,stat2)
           50  +	-- eventually we'll want to display available
           51  +	-- energy here, but for now we're just assuming
           52  +	-- max energy available
           53  +
           54  +	-- local meta = minetest.get_meta(pos)
           55  +	-- local inv = meta:get_inventory()
           56  +	-- local torque = 20
           57  +	stat1 = stat1 or 'off'
           58  +	minetest.get_meta(pos):set_string('formspec', string.format([[
           59  +		size[8,7.2]
           60  +		list[context;grinder;2.5,1;1,1;0]
           61  +		list[context;grinder;4.5,1;1,1;1]
           62  +		list[context;input;3.5,0.2;1,1]
           63  +		list[context;output;2,2.2;4,1]
           64  +		image[3.5,1.2;1,1;gui_furnace_arrow_bg.png^[lowpart:%u%%:gui_furnace_arrow_fg.png^[transformR180]
           65  +
           66  +		image[1.6,1.0;1,1;sorcery_statlamp_%s.png]
           67  +		image[5.4,1.0;1,1;sorcery_statlamp_%s.png]
           68  +		
           69  +		image[2.5,1;1,1;sorcery_mill_grindhead_shade.png]
           70  +		image[4.5,1;1,1;sorcery_mill_grindhead_shade.png]
           71  +
           72  +		list[current_player;main;0,3.5;8,4]
           73  +	]], 100*pct, stat1, stat2 or stat1))
           74  +end
           75  +local mill_update = function(pos)
           76  +	minetest.get_node_timer(pos):start(constants.mill_refresh)
           77  +end
           78  +local mill_fits_in_slot = function(slot,item)
           79  +	if slot == 'grinder' then
           80  +		if minetest.get_item_group(item:get_name(), 'sorcery_mill_grindhead')~=0 
           81  +			then return 1 end
           82  +	elseif slot == 'input' then
           83  +		local metal = sorcery.data.metallookup[item:get_name()]
           84  +		local mat = sorcery.matreg.lookup[item:get_name()]
           85  +		local comp = sorcery.data.compat.grindables[item:get_name()]
           86  +		if metal or mat.metal or comp then
           87  +			return item:get_count()
           88  +		else
           89  +			local mat = item:get_definition()._matprop
           90  +			if mat and mat.grindvalue then
           91  +				return item:get_count() 
           92  +			end
           93  +		end
           94  +	end
           95  +	return 0
           96  +end
           97  +local matprops = function(item)
           98  +	local metal = sorcery.data.metallookup[item:get_name()]
           99  +	if not metal then
          100  +		-- allow grinding of armor and tools back to their
          101  +		-- original components
          102  +		local mat = sorcery.matreg.lookup[item:get_name()]
          103  +		if mat.metal then
          104  +			metal = mat
          105  +		else
          106  +			return nil
          107  +		end
          108  +	end
          109  +	local mp = item:get_definition()._matprop
          110  +		or sorcery.data.compat.grindables[item:get_name()]
          111  +		or {}
          112  +
          113  +	again = true
          114  +	if metal then mp = {
          115  +		hardness = metal.data.hardness or mp.hardness or constants.default_hardness;
          116  +		grindvalue = metal.value or mp.grindvalue or (metal and constants.metal_grindvalue) or constants.default_grindvalue;
          117  +		powder = metal.data.parts.powder or mp.powder;
          118  +		grindcost = constants.metal_grindcost or mp.grindcost; -- invariant for metal
          119  +	} end
          120  +
          121  +	mp.torque = constants.grind_torque_factor * mp.hardness
          122  +
          123  +	if item:get_wear() ~= 0 then
          124  +		-- prevent cheating by recovering metal from items before they
          125  +		-- are destroyed
          126  +		local wearfac = (item:get_wear() / 65535)
          127  +		mp.grindvalue = math.max(1,math.ceil(mp.grindvalue * wearfac))
          128  +		mp.hardness = math.max(1,math.ceil(mp.grindcost * wearfac))
          129  +		mp.torque = math.max(1,math.ceil(mp.torque * wearfac))
          130  +	end
          131  +
          132  +	return mp
          133  +end
          134  +minetest.register_node('sorcery:mill',{
          135  +	description = 'Mill';
          136  +	groups = {
          137  +		cracky = 2;
          138  +		sorcery_ley_device = 1;
          139  +	};
          140  +	paramtype2 = 'facedir';
          141  +	on_construct = function(pos)
          142  +		local meta = minetest.get_meta(pos)
          143  +		local inv = meta:get_inventory()
          144  +		inv:set_size('input',1)
          145  +		inv:set_size('output',4)
          146  +		inv:set_size('grinder',2)
          147  +		meta:set_float('grindtime',0)
          148  +		meta:set_int('active',0)
          149  +		mill_formspec_update(pos, 0)
          150  +	end;
          151  +	on_metadata_inventory_put = function(pos,listname)
          152  +		if listname == 'input' then
          153  +			minetest.get_meta(pos):set_float('grindtime',0)
          154  +		end
          155  +		mill_update(pos)
          156  +	end;
          157  +	on_metadata_inventory_take = function(pos,listname)
          158  +		if listname == 'input' then
          159  +			minetest.get_meta(pos):set_float('grindtime',0)
          160  +		end
          161  +		mill_update(pos)
          162  +	end;
          163  +	on_metadata_inventory_move = function(pos,fl,fi,tl,ti)
          164  +		if fl == 'input' or tl == 'input' then
          165  +			minetest.get_meta(pos):set_float('grindtime',0)
          166  +		end
          167  +		mill_update(pos)
          168  +	end;
          169  +	_sorcery = {
          170  +		ley = { mode = 'consume'; affinity = {'praxic'}};
          171  +		on_leyconnect = mill_update;
          172  +		on_leycalc = function(pos,time)
          173  +			local meta = minetest.get_meta(pos)
          174  +			local active = meta:get_int('active') == 1
          175  +			if not active then return { power = 0; } end
          176  +			local inv = meta:get_inventory()
          177  +			local item = inv:get_stack('input',1)
          178  +			if item:is_empty() then
          179  +				meta:set_int('active', 0)
          180  +				return { power = 0; }
          181  +			end
          182  +			return {
          183  +				power = matprops(item).torque * time;
          184  +			}
          185  +		end;
          186  +	};
          187  +	on_timer = function(pos,delta)
          188  +		local meta = minetest.get_meta(pos)
          189  +		local inv = meta:get_inventory()
          190  +		local elapsed = meta:get_float('grindtime') + delta
          191  +		local ley = sorcery.ley.netcaps(pos,delta,pos)
          192  +		local again = false
          193  +		local active = false
          194  +		local reqtime -- sigh
          195  +		local statcolor = 'off'
          196  +		local grinders_on
          197  +		if inv:is_empty('input') or inv:is_empty('grinder') then
          198  +			print('empty')
          199  +			elapsed = 0
          200  +			mill_formspec_update(pos, 0)
          201  +		else
          202  +			local item = inv:get_stack('input',1)
          203  +			local mp = matprops(item)
          204  +			if mp.grindcost > item:get_count() then
          205  +				elapsed = 0
          206  +				mill_formspec_update(pos, 0)
          207  +				print('bad grindcost')
          208  +				goto stop
          209  +			end
          210  +
          211  +			-- print('power supply',ley.maxpower)
          212  +			-- print('power available',ley.freepower)
          213  +			-- print('power needed',mp.torque*delta)
          214  +			if ley.maxpower < (mp.torque * delta) then
          215  +				-- not enough potential energy in the system to grind
          216  +				-- so don't bother
          217  +				print('not enough power')
          218  +				statcolor = 'red'
          219  +				elapsed = 0 goto stop
          220  +			elseif ley.freepower < (mp.torque * delta) then
          221  +				-- the net has enough potential energy to supply us,
          222  +				-- but too much of it is in use right now. give up
          223  +				-- on this round, but try again in a bit to see if
          224  +				-- more energy is available
          225  +				print('currently not enough power')
          226  +				statcolor = 'yellow'
          227  +				elapsed = 0 again = true goto stop
          228  +			end
          229  +
          230  +			local grinders = 0
          231  +			local grindpower = 0
          232  +			local grind_wear = {}
          233  +			local grinders_present = false
          234  +			grinders_on = {false,false}
          235  +			for i=1,inv:get_size('grinder') do
          236  +				local gh = inv:get_stack('grinder',i)
          237  +				if not gh:is_empty() then
          238  +					grinders_present = true
          239  +					local hh = sorcery.data.metals[gh:get_definition()._proto.metal].hardness
          240  +					local dif = mp.hardness - hh
          241  +					local wear
          242  +					if dif == 0 then
          243  +						wear = constants.grind_wear
          244  +					elseif dif < 0 then
          245  +						wear = constants.grind_wear * ((dif * -1)/constants.grind_range)
          246  +					elseif dif > 0 then
          247  +						if dif > constants.grind_grace_range then
          248  +							wear = 0
          249  +							print('grinder reject')
          250  +							goto reject
          251  +						else
          252  +							wear = constants.grind_wear * (1 + (dif/constants.grind_range)) * constants.grind_grace_penalty
          253  +						end
          254  +					end
          255  +					::accept:: grinders = grinders + 1
          256  +					           grindpower = grindpower + hh
          257  +							   grinders_on[i] = true
          258  +					::reject:: grind_wear[i] = wear
          259  +				end
          260  +			end
          261  +			if grinders == 0 then
          262  +				if grinders_present then
          263  +					statcolor = 'purple'
          264  +				end
          265  +				elapsed = 0
          266  +				mill_formspec_update(pos, 0)
          267  +			else
          268  +				active = true again = true 
          269  +				if grindpower < mp.hardness then
          270  +					statcolor = 'yellow'
          271  +				else statcolor='green' end
          272  +				grindpower = grindpower / grinders
          273  +				-- if there is more power available than needed,
          274  +				-- and/or if the blades are stronger than needed,
          275  +				-- speed up the grind
          276  +				local speedboost = math.max(0.05,((grindpower - mp.hardness)/constants.grind_range) * grinders) * ((mp.torque * delta) / ley.freepower)
          277  +				reqtime = mp.grindvalue * mp.hardness * constants.grind_factor * (1-speedboost)
          278  +				if elapsed >= reqtime then
          279  +					item:take_item(mp.grindcost)
          280  +					inv:set_stack('input',1,item)
          281  +					local pw = ItemStack{
          282  +						name=mp.powder;
          283  +						count=mp.grindvalue;
          284  +					}
          285  +					if inv:room_for_item('output',pw) then
          286  +						inv:add_item('output',pw)
          287  +					else
          288  +						minetest.add_item(pos,pw)
          289  +					end
          290  +					elapsed = 0
          291  +					for i,d in pairs(grind_wear) do
          292  +						local item = inv:get_stack('grinder',i)
          293  +						item:add_wear(grind_wear[i])
          294  +						inv:set_stack('grinder',i,item)
          295  +					end
          296  +				end
          297  +			end
          298  +		end
          299  +		
          300  +		::stop:: meta:set_float('grindtime',elapsed)
          301  +		         local sc1, sc2 = 'off','off'
          302  +				 if grinders_on then
          303  +					 sc1 = grinders_on[1] and statcolor or sc1
          304  +					 sc2 = grinders_on[2] and statcolor or sc2
          305  +				 else
          306  +					 sc1 = statcolor sc2=sc1
          307  +				 end
          308  +		         mill_formspec_update(pos, active and (elapsed/reqtime) or 0, sc1,sc2)
          309  +		         meta:set_int('active',active and 1 or 0)
          310  +		         return again
          311  +	end;
          312  +	allow_metadata_inventory_put = function(pos,list,idx,stack,user)
          313  +		return mill_fits_in_slot(list,stack) end;
          314  +	allow_metadata_inventory_move = function(pos,fromlist,fromidx,tolist,toidx,count,user)
          315  +		local meta = minetest.get_meta(pos)
          316  +		local inv = meta:get_inventory()
          317  +		local stack = inv:get_stack(fromlist,fromidx)
          318  +		return mill_fits_in_slot(tolist,stack)
          319  +	end;
          320  +	tiles = {
          321  +		'sorcery_mill_top.png^[transformR90';
          322  +		'sorcery_mill_bottom.png';
          323  +		'sorcery_mill_side.png';
          324  +		'sorcery_mill_side.png';
          325  +		'sorcery_mill_back.png';
          326  +		'sorcery_mill_front.png';
          327  +	};
          328  +})
          329  +minetest.register_craft {
          330  +	output = 'sorcery:mill';
          331  +	recipe = {
          332  +		{'basic_materials:chain_steel','basic_materials:gear_steel','basic_materials:chain_steel'};
          333  +		{'basic_materials:gear_steel', 'basic_materials:steel_bar', 'basic_materials:gear_steel'};
          334  +		{'default:tin_ingot','default:steelblock','default:tin_ingot'};
          335  +	};
          336  +}
          337  +for name,metal in pairs(sorcery.data.metals) do
          338  +	local i,f = metal.parts.ingot, metal.parts.fragment
          339  +	local id = 'sorcery:mill_grindhead_' .. name
          340  +	minetest.register_tool(id,{
          341  +		description = sorcery.lib.str.capitalize(name) .. ' Grinding Head';
          342  +		inventory_image = sorcery.lib.image('sorcery_mill_grindhead.png'):multiply(sorcery.lib.color(metal.tone)):render();
          343  +		groups = { sorcery_mill_grindhead = 1 };
          344  +		_proto = {
          345  +			metal = name;
          346  +		};
          347  +	});
          348  +	minetest.register_craft {
          349  +		output = id;
          350  +		recipe = {
          351  +			{f,i,f};
          352  +			{i,i,i};
          353  +			{f,i,f};
          354  +		};
          355  +	}
          356  +end

Added models/sorcery-condenser.obj version [f7a7a6bd75].

            1  +# Blender v2.82 (sub 7) OBJ File: 'condenser.blend'
            2  +# www.blender.org
            3  +mtllib sorcery-condenser.mtl
            4  +o Cube.011_Cube.013
            5  +v 0.418477 0.868714 -0.028534
            6  +v 0.418477 0.976405 -0.028534
            7  +v 0.418477 0.976405 0.091016
            8  +v 0.418477 0.868714 0.091016
            9  +v 0.298928 0.868714 0.091016
           10  +v 0.298928 0.976405 0.091016
           11  +v 0.298928 0.976405 -0.028534
           12  +v 0.298928 0.868714 -0.028534
           13  +v -0.312736 0.868714 -0.028534
           14  +v -0.312736 0.976405 -0.028534
           15  +v -0.312736 0.976405 0.091016
           16  +v -0.312736 0.868714 0.091016
           17  +v -0.432286 0.868714 0.091016
           18  +v -0.432286 0.976405 0.091016
           19  +v -0.432286 0.976405 -0.028534
           20  +v -0.432286 0.868714 -0.028534
           21  +vt 0.000000 1.000000
           22  +vt 0.000000 0.000000
           23  +vt 1.000000 0.000000
           24  +vt 1.000000 1.000000
           25  +vt 0.000000 1.000000
           26  +vt 1.000000 1.000000
           27  +vt 1.000000 0.000000
           28  +vt 0.000000 0.000000
           29  +vt 1.000000 0.049599
           30  +vt 0.000000 0.049599
           31  +vt 0.000000 0.950401
           32  +vt 1.000000 0.950401
           33  +vt 0.000000 0.049599
           34  +vt 1.000000 0.049599
           35  +vt 1.000000 0.950401
           36  +vt 0.000000 0.950401
           37  +vt 1.000000 0.049599
           38  +vt 1.000000 0.950401
           39  +vt 0.000000 0.049599
           40  +vt 0.000000 0.950401
           41  +vt 1.000000 0.049599
           42  +vt 0.000000 0.049599
           43  +vt 0.000000 0.950401
           44  +vt 1.000000 0.950401
           45  +vt 0.000000 0.049599
           46  +vt 1.000000 0.049599
           47  +vt 1.000000 0.950401
           48  +vt 0.000000 0.950401
           49  +vt 1.000000 0.049599
           50  +vt 1.000000 0.950401
           51  +vt 0.000000 0.049599
           52  +vt 0.000000 0.950401
           53  +vt 0.000000 1.000000
           54  +vt 1.000000 1.000000
           55  +vt 1.000000 0.000000
           56  +vt 0.000000 0.000000
           57  +vt 0.000000 1.000000
           58  +vt 0.000000 0.000000
           59  +vt 1.000000 0.000000
           60  +vt 1.000000 1.000000
           61  +vn 0.0000 1.0000 0.0000
           62  +vn 0.0000 -1.0000 0.0000
           63  +vn 0.0000 0.0000 -1.0000
           64  +vn 0.0000 0.0000 1.0000
           65  +vn -1.0000 0.0000 0.0000
           66  +vn 1.0000 0.0000 0.0000
           67  +g Cube.011_Cube.013_gem.002
           68  +usemtl gem.002
           69  +s off
           70  +f 7/1/1 6/2/1 3/3/1 2/4/1
           71  +f 8/5/2 1/6/2 4/7/2 5/8/2
           72  +f 1/9/3 8/10/3 7/11/3 2/12/3
           73  +f 5/13/4 4/14/4 3/15/4 6/16/4
           74  +f 8/17/5 5/13/5 6/16/5 7/18/5
           75  +f 4/19/6 1/9/6 2/12/6 3/20/6
           76  +f 9/21/3 16/22/3 15/23/3 10/24/3
           77  +f 13/25/4 12/26/4 11/27/4 14/28/4
           78  +f 16/29/5 13/25/5 14/28/5 15/30/5
           79  +f 12/31/6 9/21/6 10/24/6 11/32/6
           80  +f 16/33/2 9/34/2 12/35/2 13/36/2
           81  +f 15/37/1 14/38/1 11/39/1 10/40/1
           82  +o Cube.006_Cube.014
           83  +v -0.355575 -0.374496 0.375744
           84  +v -0.355575 0.366792 0.375744
           85  +v -0.355575 -0.374496 -0.365544
           86  +v -0.355575 0.366792 -0.365544
           87  +v 0.385712 -0.374496 0.375744
           88  +v 0.385712 0.366792 0.375744
           89  +v 0.385712 -0.374496 -0.365544
           90  +v 0.385712 0.366792 -0.365544
           91  +v -0.355575 -0.172402 0.375744
           92  +v -0.355575 -0.060035 0.375744
           93  +v -0.355575 0.052332 0.375744
           94  +v -0.355575 0.164699 0.375744
           95  +v -0.355575 0.164699 -0.365544
           96  +v -0.355575 0.052332 -0.365544
           97  +v -0.355575 -0.060035 -0.365544
           98  +v -0.355575 -0.172402 -0.365544
           99  +v 0.385712 0.164699 -0.365544
          100  +v 0.385712 0.052332 -0.365544
          101  +v 0.385712 -0.060035 -0.365544
          102  +v 0.385712 -0.172402 -0.365544
          103  +v 0.385712 0.164699 0.375744
          104  +v 0.385712 0.052332 0.375744
          105  +v 0.385712 -0.060035 0.375744
          106  +v 0.385712 -0.172402 0.375744
          107  +v -0.191901 0.366792 0.212070
          108  +v -0.191901 0.366792 -0.201870
          109  +v 0.222039 0.366792 -0.201870
          110  +v 0.222039 0.366792 0.212070
          111  +v -0.191901 0.455314 0.212070
          112  +v -0.191901 0.455314 -0.201870
          113  +v 0.222039 0.455314 -0.201870
          114  +v 0.222039 0.455314 0.212070
          115  +v -0.143424 0.455314 0.136294
          116  +v -0.143424 0.455314 -0.126094
          117  +v 0.173561 0.455314 -0.126094
          118  +v 0.173561 0.455314 0.136294
          119  +v -0.143424 0.433864 0.136294
          120  +v -0.143424 0.433864 -0.126094
          121  +v 0.173561 0.433864 -0.126094
          122  +v 0.173561 0.433864 0.136294
          123  +vt 0.000000 0.863964
          124  +vt 0.000000 1.000000
          125  +vt 1.000000 1.000000
          126  +vt 1.000000 0.863964
          127  +vt 0.000000 0.863964
          128  +vt 0.000000 1.000000
          129  +vt 1.000000 1.000000
          130  +vt 1.000000 0.863964
          131  +vt 0.000000 1.000000
          132  +vt 0.000000 0.863964
          133  +vt 1.000000 0.863964
          134  +vt 1.000000 1.000000
          135  +vt 0.000000 0.500000
          136  +vt 1.000000 0.500000
          137  +vt 1.000000 0.000000
          138  +vt 0.000000 0.000000
          139  +vt 1.000000 0.500000
          140  +vt -0.000000 0.500000
          141  +vt 0.220797 0.389602
          142  +vt 0.779203 0.389602
          143  +vt 1.000000 0.501014
          144  +vt 1.000000 0.637049
          145  +vt 0.000000 0.637049
          146  +vt 0.000000 0.501014
          147  +vt 1.000000 0.712688
          148  +vt 1.000000 0.788326
          149  +vt 0.000000 0.788326
          150  +vt 0.000000 0.712688
          151  +vt 1.000000 0.501014
          152  +vt 1.000000 0.637049
          153  +vt 0.000000 0.637049
          154  +vt 0.000000 0.501014
          155  +vt 1.000000 0.712688
          156  +vt 1.000000 0.788326
          157  +vt 0.000000 0.788326
          158  +vt 0.000000 0.712688
          159  +vt 0.000000 0.501014
          160  +vt 0.000000 0.637049
          161  +vt 0.000000 0.712688
          162  +vt 0.000000 0.788326
          163  +vt 1.000000 0.637049
          164  +vt 1.000000 0.501014
          165  +vt 1.000000 0.788326
          166  +vt 1.000000 0.712688
          167  +vt 0.625000 0.750000
          168  +vt 0.625000 0.500000
          169  +vt 0.625000 0.500000
          170  +vt 0.625000 0.750000
          171  +vt 1.000000 0.000000
          172  +vt 0.779203 0.110398
          173  +vt -0.000000 0.000000
          174  +vt 0.220797 0.110398
          175  +vt 0.625000 1.000000
          176  +vt 0.625000 0.750000
          177  +vt 0.625000 1.000000
          178  +vt 0.625000 0.250000
          179  +vt 0.625000 0.000000
          180  +vt 0.625000 0.000000
          181  +vt 0.625000 0.250000
          182  +vt 0.625000 1.000000
          183  +vt 0.625000 0.500000
          184  +vt 0.625000 0.250000
          185  +vt 0.625000 0.250000
          186  +vt 0.625000 0.500000
          187  +vt 0.625000 0.000000
          188  +vt 0.875000 0.500000
          189  +vt 0.875000 0.750000
          190  +vt 0.625000 0.750000
          191  +vt 0.625000 0.000000
          192  +vt 0.625000 1.000000
          193  +vn -1.0000 0.0000 0.0000
          194  +vn 0.0000 0.0000 -1.0000
          195  +vn 1.0000 0.0000 0.0000
          196  +vn 0.0000 0.0000 1.0000
          197  +vn 0.0000 -1.0000 0.0000
          198  +vn 0.0000 1.0000 -0.0000
          199  +g Cube.006_Cube.014_conduit.001
          200  +usemtl conduit.001
          201  +s off
          202  +f 28/41/7 18/42/7 20/43/7 29/44/7
          203  +f 29/45/8 20/46/8 24/47/8 33/48/8
          204  +f 33/48/9 24/47/9 22/49/9 37/50/9
          205  +f 37/51/10 22/52/10 18/42/10 28/41/10
          206  +f 19/53/11 23/54/11 21/55/11 17/56/11
          207  +f 24/57/12 20/58/12 42/59/12 43/60/12
          208  +f 21/61/10 40/62/10 25/63/10 17/64/10
          209  +f 39/65/10 38/66/10 27/67/10 26/68/10
          210  +f 23/69/9 36/70/9 40/71/9 21/72/9
          211  +f 35/73/9 34/74/9 38/75/9 39/76/9
          212  +f 19/77/8 32/78/8 36/70/8 23/69/8
          213  +f 31/79/8 30/80/8 34/74/8 35/73/8
          214  +f 17/64/7 25/63/7 32/81/7 19/82/7
          215  +f 26/68/7 27/67/7 30/83/7 31/84/7
          216  +f 44/85/9 43/86/9 47/87/9 48/88/9
          217  +f 22/89/12 24/57/12 43/60/12 44/90/12
          218  +f 20/58/12 18/91/12 41/92/12 42/59/12
          219  +f 18/91/12 22/89/12 44/90/12 41/92/12
          220  +f 45/93/12 48/88/12 52/94/12 49/95/12
          221  +f 42/96/7 41/97/7 45/98/7 46/99/7
          222  +f 41/100/10 44/85/10 48/88/10 45/93/10
          223  +f 43/86/8 42/96/8 46/99/8 47/87/8
          224  +f 51/101/10 50/102/10 54/103/10 55/104/10
          225  +f 47/87/12 46/99/12 50/102/12 51/101/12
          226  +f 48/88/12 47/87/12 51/101/12 52/94/12
          227  +f 46/99/12 45/98/12 49/105/12 50/102/12
          228  +f 55/104/12 54/106/12 53/107/12 56/108/12
          229  +f 52/94/7 51/101/7 55/104/7 56/108/7
          230  +f 50/102/9 49/105/9 53/109/9 54/103/9
          231  +f 49/95/8 52/94/8 56/108/8 53/110/8
          232  +f 37/50/11 28/41/11 29/45/11 33/48/11
          233  +f 39/76/11 26/68/11 31/79/11 35/73/11
          234  +f 38/75/12 34/74/12 30/80/12 27/67/12
          235  +f 40/71/12 36/70/12 32/78/12 25/63/12
          236  +o Cube.007_Cube.015
          237  +v -0.355575 -0.172402 0.375744
          238  +v -0.355575 -0.060035 0.375744
          239  +v -0.355575 0.052332 0.375744
          240  +v -0.355575 0.164699 0.375744
          241  +v -0.355575 0.164699 -0.365544
          242  +v -0.355575 0.052332 -0.365544
          243  +v -0.355575 -0.060035 -0.365544
          244  +v -0.355575 -0.172402 -0.365544
          245  +v 0.385712 0.164699 -0.365544
          246  +v 0.385712 0.052332 -0.365544
          247  +v 0.385712 -0.060035 -0.365544
          248  +v 0.385712 -0.172402 -0.365544
          249  +v 0.385712 0.164699 0.375744
          250  +v 0.385712 0.052332 0.375744
          251  +v 0.385712 -0.060035 0.375744
          252  +v 0.385712 -0.172402 0.375744
          253  +v -0.443295 -0.172402 0.425633
          254  +v -0.443295 -0.060035 0.425633
          255  +v -0.443295 0.052332 0.425633
          256  +v -0.443295 0.164699 0.425633
          257  +v -0.443295 0.164699 -0.415433
          258  +v -0.443295 0.052332 -0.415433
          259  +v -0.443295 -0.060035 -0.415433
          260  +v -0.443295 -0.172402 -0.415433
          261  +v 0.473433 0.164699 -0.415433
          262  +v 0.473433 0.052332 -0.415433
          263  +v 0.473433 -0.060035 -0.415433
          264  +v 0.473433 -0.172402 -0.415433
          265  +v 0.473433 0.164699 0.425633
          266  +v 0.473433 0.052332 0.425633
          267  +v 0.473433 -0.060035 0.425633
          268  +v 0.473433 -0.172402 0.425633
          269  +v -0.116462 0.499773 -0.053556
          270  +v 0.116462 0.499773 0.116196
          271  +v 0.116462 0.499773 -0.053556
          272  +v -0.116462 0.499773 0.116196
          273  +v -0.116462 0.433792 -0.053556
          274  +v 0.116462 0.433792 0.116196
          275  +v 0.116462 0.433792 -0.053556
          276  +v -0.116462 0.433792 0.116196
          277  +v -0.071082 0.677987 0.102438
          278  +v -0.071082 0.677987 -0.039956
          279  +v 0.071311 0.677987 0.102438
          280  +v 0.071311 0.677987 -0.039956
          281  +v -0.032865 0.714147 0.064220
          282  +v -0.032865 0.714147 -0.001739
          283  +v 0.033094 0.714147 -0.001739
          284  +v 0.033094 0.714147 0.064220
          285  +v -0.032865 1.130972 0.064220
          286  +v -0.032865 1.130972 -0.001739
          287  +v 0.033094 1.130972 -0.001739
          288  +v 0.033094 1.130972 0.064220
          289  +v 0.033094 0.868714 -0.001739
          290  +v 0.033094 0.976405 -0.001739
          291  +v 0.033094 0.976405 0.064220
          292  +v 0.033094 0.868714 0.064220
          293  +v -0.032865 0.868714 0.064220
          294  +v -0.032865 0.976405 0.064220
          295  +v -0.032865 0.976405 -0.001739
          296  +v -0.032865 0.868714 -0.001739
          297  +v 0.287505 0.677987 0.102438
          298  +v 0.287505 0.677987 -0.039956
          299  +v 0.429899 0.677987 0.102438
          300  +v 0.429899 0.677987 -0.039956
          301  +v 0.325723 0.714147 0.064220
          302  +v 0.325723 0.714147 -0.001739
          303  +v 0.391682 0.714147 -0.001739
          304  +v 0.391682 0.714147 0.064220
          305  +v 0.325723 1.130972 0.064220
          306  +v 0.325723 1.130972 -0.001739
          307  +v 0.391682 1.130972 -0.001739
          308  +v 0.391682 1.130972 0.064220
          309  +v 0.391682 0.868714 -0.001739
          310  +v 0.391682 0.976405 -0.001739
          311  +v 0.391682 0.976405 0.064220
          312  +v 0.391682 0.868714 0.064220
          313  +v 0.325723 0.868714 0.064220
          314  +v 0.325723 0.976405 0.064220
          315  +v 0.325723 0.976405 -0.001739
          316  +v 0.325723 0.868714 -0.001739
          317  +v -0.443708 0.677987 0.102438
          318  +v -0.443708 0.677987 -0.039956
          319  +v -0.301314 0.677987 0.102438
          320  +v -0.301314 0.677987 -0.039956
          321  +v -0.405491 0.714147 0.064220
          322  +v -0.405491 0.714147 -0.001739
          323  +v -0.339532 0.714147 -0.001739
          324  +v -0.339532 0.714147 0.064220
          325  +v -0.405491 1.130972 0.064220
          326  +v -0.405491 1.130972 -0.001739
          327  +v -0.339532 1.130972 -0.001739
          328  +v -0.339532 1.130972 0.064220
          329  +v -0.339532 0.868714 -0.001739
          330  +v -0.339532 0.976405 -0.001739
          331  +v -0.339532 0.976405 0.064220
          332  +v -0.339532 0.868714 0.064220
          333  +v -0.405491 0.868714 0.064220
          334  +v -0.405491 0.976405 0.064220
          335  +v -0.405491 0.976405 -0.001739
          336  +v -0.405491 0.868714 -0.001739
          337  +vt 0.095689 0.904311
          338  +vt 0.095689 0.095689
          339  +vt 0.000000 0.041267
          340  +vt 0.000000 0.958733
          341  +vt 0.904311 0.095689
          342  +vt 0.904311 0.904311
          343  +vt 1.000000 0.958733
          344  +vt 1.000000 0.041267
          345  +vt 0.095689 0.095689
          346  +vt 0.095689 0.904311
          347  +vt 0.000000 0.958733
          348  +vt 0.000000 0.041267
          349  +vt 0.904311 0.904311
          350  +vt 0.904311 0.095689
          351  +vt 1.000000 0.041267
          352  +vt 1.000000 0.958733
          353  +vt 0.095689 0.904311
          354  +vt 0.095689 0.095689
          355  +vt 0.000000 0.041267
          356  +vt 0.000000 0.958733
          357  +vt 0.904311 0.095689
          358  +vt 0.904311 0.904311
          359  +vt 1.000000 0.958733
          360  +vt 1.000000 0.041267
          361  +vt 0.095689 0.904311
          362  +vt 0.904311 0.904311
          363  +vt 1.000000 0.958733
          364  +vt 0.000000 0.958733
          365  +vt 0.904311 0.095689
          366  +vt 0.095689 0.095689
          367  +vt 0.000000 0.041267
          368  +vt 1.000000 0.041267
          369  +vt 1.000000 0.316139
          370  +vt 1.000000 0.438713
          371  +vt 0.000000 0.438713
          372  +vt 0.000000 0.316139
          373  +vt 1.000000 0.561287
          374  +vt 1.000000 0.683861
          375  +vt 0.000000 0.683861
          376  +vt 0.000000 0.561287
          377  +vt 0.958733 0.316139
          378  +vt 0.958733 0.438713
          379  +vt 0.041267 0.438713
          380  +vt 0.041267 0.316139
          381  +vt 0.958733 0.561287
          382  +vt 0.958733 0.683861
          383  +vt 0.041267 0.683861
          384  +vt 0.041267 0.561287
          385  +vt 0.000000 0.316139
          386  +vt 0.000000 0.438713
          387  +vt 1.000000 0.438713
          388  +vt 1.000000 0.316139
          389  +vt 0.000000 0.561287
          390  +vt 0.000000 0.683861
          391  +vt 1.000000 0.683861
          392  +vt 1.000000 0.561287
          393  +vt 0.041267 0.316139
          394  +vt 0.041267 0.438713
          395  +vt 0.958733 0.438713
          396  +vt 0.958733 0.316139
          397  +vt 0.041267 0.561287
          398  +vt 0.041267 0.683861
          399  +vt 0.958733 0.683861
          400  +vt 0.958733 0.561287
          401  +vt 0.273833 0.216173
          402  +vt 0.273833 0.783827
          403  +vt 0.726167 0.783827
          404  +vt 0.726167 0.216173
          405  +vt 0.189666 0.216173
          406  +vt 0.189666 0.783827
          407  +vt 0.810334 0.783827
          408  +vt 0.810334 0.216173
          409  +vt 0.810334 0.216174
          410  +vt 0.810334 0.783827
          411  +vt 0.189666 0.783827
          412  +vt 0.189666 0.216173
          413  +vt 0.726167 0.216173
          414  +vt 0.726167 0.783827
          415  +vt 0.273833 0.783827
          416  +vt 0.273833 0.216174
          417  +vt 0.125000 0.500000
          418  +vt 0.375000 0.500000
          419  +vt 0.375000 0.750000
          420  +vt 0.125000 0.750000
          421  +vt 0.420879 0.573624
          422  +vt 0.579121 0.573624
          423  +vt 0.579121 0.944444
          424  +vt 0.420879 0.944444
          425  +vt 0.579121 0.579121
          426  +vt 0.420879 0.579121
          427  +vt 0.420879 0.420879
          428  +vt 0.579121 0.420879
          429  +vt 0.579121 0.573624
          430  +vt 0.420879 0.573624
          431  +vt 0.420879 0.944444
          432  +vt 0.579121 0.944444
          433  +vt 0.579121 0.573624
          434  +vt 0.579121 0.944444
          435  +vt 0.420879 0.573624
          436  +vt 0.420879 0.944444
          437  +vt 0.579121 -0.055555
          438  +vt 0.420879 -0.055555
          439  +vt 0.420879 0.315265
          440  +vt 0.579121 0.315265
          441  +vt 0.420879 -0.055555
          442  +vt 0.579121 -0.055555
          443  +vt 0.579121 0.315265
          444  +vt 0.420879 0.315265
          445  +vt 0.579121 -0.055555
          446  +vt 0.579121 0.315265
          447  +vt 0.420879 -0.055555
          448  +vt 0.420879 0.315265
          449  +vt 0.125000 0.500000
          450  +vt 0.375000 0.500000
          451  +vt 0.375000 0.750000
          452  +vt 0.125000 0.750000
          453  +vt 0.420879 0.573624
          454  +vt 0.579121 0.573624
          455  +vt 0.579121 0.944444
          456  +vt 0.420879 0.944444
          457  +vt 0.579121 0.579121
          458  +vt 0.420879 0.579121
          459  +vt 0.420879 0.420879
          460  +vt 0.579121 0.420879
          461  +vt 0.579121 0.573624
          462  +vt 0.420879 0.573624
          463  +vt 0.420879 0.944444
          464  +vt 0.579121 0.944444
          465  +vt 0.579121 0.573624
          466  +vt 0.579121 0.944444
          467  +vt 0.420879 0.573624
          468  +vt 0.420879 0.944444
          469  +vt 0.579121 -0.055555
          470  +vt 0.420879 -0.055555
          471  +vt 0.420879 0.315265
          472  +vt 0.579121 0.315265
          473  +vt 0.420879 -0.055555
          474  +vt 0.579121 -0.055555
          475  +vt 0.579121 0.315265
          476  +vt 0.420879 0.315265
          477  +vt 0.579121 -0.055555
          478  +vt 0.579121 0.315265
          479  +vt 0.420879 -0.055555
          480  +vt 0.420879 0.315265
          481  +vt 0.125000 0.500000
          482  +vt 0.375000 0.500000
          483  +vt 0.375000 0.750000
          484  +vt 0.125000 0.750000
          485  +vt 0.420879 0.573624
          486  +vt 0.579121 0.573624
          487  +vt 0.579121 0.944444
          488  +vt 0.420879 0.944444
          489  +vt 0.579121 0.579121
          490  +vt 0.420879 0.579121
          491  +vt 0.420879 0.420879
          492  +vt 0.579121 0.420879
          493  +vt 0.579121 0.573624
          494  +vt 0.420879 0.573624
          495  +vt 0.420879 0.944444
          496  +vt 0.579121 0.944444
          497  +vt 0.579121 0.573624
          498  +vt 0.579121 0.944444
          499  +vt 0.420879 0.573624
          500  +vt 0.420879 0.944444
          501  +vt 0.579121 -0.055555
          502  +vt 0.420879 -0.055555
          503  +vt 0.420879 0.315265
          504  +vt 0.579121 0.315265
          505  +vt 0.420879 -0.055555
          506  +vt 0.579121 -0.055555
          507  +vt 0.579121 0.315265
          508  +vt 0.420879 0.315265
          509  +vt 0.579121 -0.055555
          510  +vt 0.579121 0.315265
          511  +vt 0.420879 -0.055555
          512  +vt 0.420879 0.315265
          513  +vn 0.0000 -1.0000 0.0000
          514  +vn 0.0000 1.0000 -0.0000
          515  +vn 0.0000 0.0000 1.0000
          516  +vn 1.0000 0.0000 0.0000
          517  +vn 0.0000 0.0000 -1.0000
          518  +vn -1.0000 0.0000 0.0000
          519  +vn 0.0000 -0.4058 -0.9140
          520  +g Cube.007_Cube.015_tin.001
          521  +usemtl tin.001
          522  +s off
          523  +f 62/111/13 59/112/13 75/113/13 78/114/13
          524  +f 70/115/13 66/116/13 82/117/13 86/118/13
          525  +f 58/119/14 63/120/14 79/121/14 74/122/14
          526  +f 67/123/14 71/124/14 87/125/14 83/126/14
          527  +f 64/127/13 57/128/13 73/129/13 80/130/13
          528  +f 72/131/13 68/132/13 84/133/13 88/134/13
          529  +f 61/135/14 65/136/14 81/137/14 77/138/14
          530  +f 69/139/14 60/140/14 76/141/14 85/142/14
          531  +f 88/143/15 87/144/15 74/145/15 73/146/15
          532  +f 86/147/15 85/148/15 76/149/15 75/150/15
          533  +f 84/151/16 83/152/16 87/153/16 88/154/16
          534  +f 82/155/16 81/156/16 85/157/16 86/158/16
          535  +f 80/159/17 79/160/17 83/161/17 84/162/17
          536  +f 78/163/17 77/164/17 81/165/17 82/166/17
          537  +f 73/167/18 74/168/18 79/169/18 80/170/18
          538  +f 75/171/18 76/172/18 77/173/18 78/174/18
          539  +f 65/136/14 69/139/14 85/142/14 81/137/14
          540  +f 57/128/13 72/131/13 88/134/13 73/129/13
          541  +f 60/140/14 61/135/14 77/138/14 76/141/14
          542  +f 68/132/13 64/127/13 80/130/13 84/133/13
          543  +f 71/124/14 58/119/14 74/122/14 87/125/14
          544  +f 63/120/14 67/123/14 83/126/14 79/121/14
          545  +f 59/112/13 70/115/13 86/118/13 75/113/13
          546  +f 66/116/13 62/111/13 78/114/13 82/117/13
          547  +f 96/175/18 92/176/18 89/177/18 93/178/18
          548  +f 93/179/17 89/180/17 91/181/17 95/182/17
          549  +f 94/183/15 90/184/15 92/185/15 96/186/15
          550  +f 95/187/16 91/188/16 90/189/16 94/190/16
          551  +f 95/182/13 94/183/13 96/175/13 93/179/13
          552  +f 98/191/13 100/192/13 99/193/13 97/194/13
          553  +f 111/195/16 110/196/16 107/197/16 108/198/16
          554  +f 107/199/14 106/200/14 105/201/14 108/202/14
          555  +f 115/203/18 114/204/18 105/205/18 106/206/18
          556  +f 114/204/15 111/207/15 108/208/15 105/205/15
          557  +f 110/196/17 115/209/17 106/210/17 107/197/17
          558  +f 103/211/17 102/212/17 116/213/17 109/214/17
          559  +f 101/215/15 104/216/15 112/217/15 113/218/15
          560  +f 102/219/18 101/215/18 113/218/18 116/220/18
          561  +f 104/221/16 103/211/16 109/214/16 112/222/16
          562  +f 118/223/13 120/224/13 119/225/13 117/226/13
          563  +f 131/227/16 130/228/16 127/229/16 128/230/16
          564  +f 127/231/14 126/232/14 125/233/14 128/234/14
          565  +f 135/235/18 134/236/18 125/237/18 126/238/18
          566  +f 134/236/15 131/239/15 128/240/15 125/237/15
          567  +f 130/228/17 135/241/17 126/242/17 127/229/17
          568  +f 123/243/17 122/244/17 136/245/17 129/246/17
          569  +f 121/247/15 124/248/15 132/249/15 133/250/15
          570  +f 122/251/18 121/247/18 133/250/18 136/252/18
          571  +f 124/253/16 123/243/16 129/246/16 132/254/16
          572  +f 138/255/13 140/256/13 139/257/13 137/258/13
          573  +f 151/259/16 150/260/16 147/261/16 148/262/16
          574  +f 147/263/14 146/264/14 145/265/14 148/266/14
          575  +f 155/267/18 154/268/18 145/269/18 146/270/18
          576  +f 154/268/15 151/271/15 148/272/15 145/269/15
          577  +f 150/260/17 155/273/17 146/274/17 147/261/17
          578  +f 143/275/17 142/276/17 156/277/17 149/278/17
          579  +f 141/279/15 144/280/15 152/281/15 153/282/15
          580  +f 142/283/18 141/279/18 153/282/18 156/284/18
          581  +f 144/285/16 143/275/16 149/278/16 152/286/16
          582  +f 70/115/18 69/139/18 65/136/18 66/116/18
          583  +f 66/116/15 65/136/15 61/135/15 62/111/15
          584  +f 62/111/16 61/135/16 60/140/16 59/112/16
          585  +f 64/127/16 63/120/16 58/119/16 57/128/16
          586  +f 68/132/15 67/123/15 63/120/15 64/127/15
          587  +f 72/131/18 71/124/18 67/123/18 68/132/18
          588  +f 88/143/19 73/146/19 58/119/19 71/124/19
          589  +f 57/128/17 58/119/17 71/124/17 72/131/17
          590  +f 59/112/17 60/140/17 69/139/17 70/115/17
          591  +f 101/215/13 102/212/13 103/211/13 104/216/13
          592  +f 121/247/13 122/244/13 123/243/13 124/248/13
          593  +f 141/279/13 142/276/13 143/275/13 144/280/13
          594  +f 136/252/14 133/250/14 132/249/14 129/246/14
          595  +f 116/220/14 113/218/14 112/217/14 109/214/14
          596  +f 156/284/14 153/282/14 152/281/14 149/278/14
          597  +f 155/267/13 150/260/13 151/271/13 154/268/13
          598  +f 115/203/13 110/196/13 111/207/13 114/204/13
          599  +f 135/235/13 130/228/13 131/239/13 134/236/13
          600  +f 92/185/14 90/184/14 91/188/14 89/180/14
          601  +o Cube.008_Cube.016
          602  +v -0.501270 0.679368 -0.120365
          603  +v 0.501270 0.679368 -0.120365
          604  +v -0.501270 0.679368 0.183006
          605  +v 0.501270 0.679368 0.183006
          606  +v -0.501270 0.499773 -0.120365
          607  +v 0.501270 0.499773 0.183006
          608  +v 0.501270 0.499773 -0.120365
          609  +v -0.501270 0.499773 0.183006
          610  +vt 0.000000 0.728785
          611  +vt 0.000000 0.271215
          612  +vt 1.000000 0.271215
          613  +vt 1.000000 0.728785
          614  +vt 0.728785 0.425711
          615  +vt 0.728785 0.648579
          616  +vt 0.271215 0.648579
          617  +vt 0.271215 0.425711
          618  +vt 1.000000 0.425711
          619  +vt 1.000000 0.648579
          620  +vt 0.000000 0.648579
          621  +vt 0.000000 0.425711
          622  +vt 0.000000 0.425711
          623  +vt 0.000000 0.648579
          624  +vt 1.000000 0.648579
          625  +vt 1.000000 0.425711
          626  +vt 0.271215 0.425711
          627  +vt 0.271215 0.648579
          628  +vt 0.728785 0.648579
          629  +vt 0.728785 0.425711
          630  +vt -0.015031 0.322545
          631  +vt -0.015031 0.625147
          632  +vt 0.984969 0.625147
          633  +vt 0.984969 0.322545
          634  +vn 0.0000 1.0000 -0.0000
          635  +vn 1.0000 0.0000 0.0000
          636  +vn 0.0000 0.0000 1.0000
          637  +vn 0.0000 0.0000 -1.0000
          638  +vn -1.0000 0.0000 0.0000
          639  +vn 0.0000 -1.0000 0.0000
          640  +g Cube.008_Cube.016_stone.001
          641  +usemtl stone.001
          642  +s off
          643  +f 157/287/20 159/288/20 160/289/20 158/290/20
          644  +f 163/291/21 158/292/21 160/293/21 162/294/21
          645  +f 162/295/22 160/296/22 159/297/22 164/298/22
          646  +f 161/299/23 157/300/23 158/301/23 163/302/23
          647  +f 164/303/24 159/304/24 157/305/24 161/306/24
          648  +f 164/307/25 161/308/25 163/309/25 162/310/25
          649  +o Cube.009_Cube.017
          650  +v -0.071082 0.677987 0.102438
          651  +v -0.071082 0.714147 0.102438
          652  +v -0.071082 0.677987 -0.039956
          653  +v -0.071082 0.714147 -0.039956
          654  +v 0.071311 0.677987 0.102438
          655  +v 0.071311 0.714147 0.102438
          656  +v 0.071311 0.677987 -0.039956
          657  +v 0.071311 0.714147 -0.039956
          658  +v -0.032865 0.714147 0.064220
          659  +v -0.032865 0.714147 -0.001739
          660  +v 0.033094 0.714147 -0.001739
          661  +v 0.033094 0.714147 0.064220
          662  +v 0.287505 0.677987 0.102438
          663  +v 0.287505 0.714147 0.102438
          664  +v 0.287505 0.677987 -0.039956
          665  +v 0.287505 0.714147 -0.039956
          666  +v 0.429899 0.677987 0.102438
          667  +v 0.429899 0.714147 0.102438
          668  +v 0.429899 0.677987 -0.039956
          669  +v 0.429899 0.714147 -0.039956
          670  +v 0.325723 0.714147 0.064220
          671  +v 0.325723 0.714147 -0.001739
          672  +v 0.391682 0.714147 -0.001739
          673  +v 0.391682 0.714147 0.064220
          674  +v -0.443708 0.677987 0.102438
          675  +v -0.443708 0.714147 0.102438
          676  +v -0.443708 0.677987 -0.039956
          677  +v -0.443708 0.714147 -0.039956
          678  +v -0.301314 0.677987 0.102438
          679  +v -0.301314 0.714147 0.102438
          680  +v -0.301314 0.677987 -0.039956
          681  +v -0.301314 0.714147 -0.039956
          682  +v -0.405491 0.714147 0.064220
          683  +v -0.405491 0.714147 -0.001739
          684  +v -0.339532 0.714147 -0.001739
          685  +v -0.339532 0.714147 0.064220
          686  +v -0.500000 0.500000 -0.500000
          687  +v -0.500000 -0.500000 -0.500000
          688  +v 0.500000 -0.500000 0.500000
          689  +v 0.500000 0.500000 0.500000
          690  +v 0.500000 0.500000 -0.500000
          691  +v 0.500000 -0.500000 -0.500000
          692  +v -0.500000 0.500000 0.500000
          693  +v -0.500000 -0.500000 0.500000
          694  +v 0.353656 -0.500000 -0.353656
          695  +v 0.353656 -0.500000 0.353656
          696  +v -0.353656 -0.500000 0.353656
          697  +v -0.353656 -0.500000 -0.353656
          698  +v 0.353656 0.500000 -0.353656
          699  +v -0.353656 0.500000 -0.353656
          700  +v -0.353656 0.500000 0.353656
          701  +v 0.353656 0.500000 0.353656
          702  +v 0.500000 -0.353656 -0.353656
          703  +v 0.500000 0.353656 -0.353656
          704  +v 0.500000 0.353656 0.353656
          705  +v 0.500000 -0.353656 0.353656
          706  +v 0.353656 -0.353656 0.500000
          707  +v 0.353656 0.353656 0.500000
          708  +v -0.353656 0.353656 0.500000
          709  +v -0.353656 -0.353656 0.500000
          710  +v -0.353656 -0.353656 -0.500000
          711  +v -0.353656 0.353656 -0.500000
          712  +v 0.353656 0.353656 -0.500000
          713  +v 0.353656 -0.353656 -0.500000
          714  +v -0.500000 -0.353656 0.353656
          715  +v -0.500000 0.353656 0.353656
          716  +v -0.500000 0.353656 -0.353656
          717  +v -0.500000 -0.353656 -0.353656
          718  +v 0.353656 -0.390500 0.353656
          719  +v 0.353656 -0.390500 -0.353656
          720  +v -0.353656 -0.390500 0.353656
          721  +v -0.353656 -0.390500 -0.353656
          722  +v -0.353656 0.390500 -0.353656
          723  +v 0.353656 0.390500 -0.353656
          724  +v -0.353656 0.390500 0.353656
          725  +v 0.353656 0.390500 0.353656
          726  +v 0.390500 0.353656 -0.353656
          727  +v 0.390500 -0.353656 -0.353656
          728  +v 0.390500 0.353656 0.353656
          729  +v 0.390500 -0.353656 0.353656
          730  +v 0.353656 0.353656 0.390500
          731  +v 0.353656 -0.353656 0.390500
          732  +v -0.353656 0.353656 0.390500
          733  +v -0.353656 -0.353656 0.390500
          734  +v -0.353656 0.353656 -0.390500
          735  +v -0.353656 -0.353656 -0.390500
          736  +v 0.353656 0.353656 -0.390500
          737  +v 0.353656 -0.353656 -0.390500
          738  +v -0.390500 0.353656 0.353656
          739  +v -0.390500 -0.353656 0.353656
          740  +v -0.390500 0.353656 -0.353656
          741  +v -0.390500 -0.353656 -0.353656
          742  +v 0.500000 0.170486 0.500000
          743  +v -0.500000 0.170486 0.500000
          744  +v -0.353656 0.170486 0.500000
          745  +v -0.500000 0.170486 -0.500000
          746  +v -0.500000 0.170486 -0.353656
          747  +v 0.353656 0.170486 0.390500
          748  +v 0.353656 0.170486 0.500000
          749  +v -0.353656 0.170486 0.390500
          750  +v -0.390500 0.170486 -0.353656
          751  +v -0.390500 0.170486 0.353656
          752  +v -0.500000 0.170486 0.353656
          753  +v 0.500000 0.170486 0.353656
          754  +v 0.500000 0.170486 -0.500000
          755  +v 0.353656 0.170486 -0.500000
          756  +v -0.353656 0.170486 -0.500000
          757  +v 0.500000 0.170486 -0.353656
          758  +v 0.390500 0.170486 0.353656
          759  +v -0.353656 0.170486 -0.390500
          760  +v 0.353656 0.170486 -0.390500
          761  +v 0.390500 0.170486 -0.353656
          762  +v 0.500000 -0.170486 0.500000
          763  +v 0.500000 -0.170486 0.353656
          764  +v -0.500000 -0.170486 0.500000
          765  +v -0.353656 -0.170486 0.500000
          766  +v 0.500000 -0.170486 -0.500000
          767  +v 0.500000 -0.170486 -0.353656
          768  +v 0.353656 -0.170486 0.390500
          769  +v 0.390500 -0.170486 0.353656
          770  +v 0.353656 -0.170486 0.500000
          771  +v -0.353656 -0.170486 0.390500
          772  +v 0.390500 -0.170486 -0.353656
          773  +v 0.353656 -0.170486 -0.500000
          774  +v -0.500000 -0.170486 -0.500000
          775  +v -0.500000 -0.170486 -0.353656
          776  +v -0.353656 -0.170486 -0.500000
          777  +v -0.353656 -0.170486 -0.390500
          778  +v 0.353656 -0.170486 -0.390500
          779  +v -0.390500 -0.170486 -0.353656
          780  +v -0.390500 -0.170486 0.353656
          781  +v -0.500000 -0.170486 0.353656
          782  +vt 0.000000 0.309540
          783  +vt 0.000000 0.563487
          784  +vt 1.000000 0.563487
          785  +vt 1.000000 0.309540
          786  +vt 0.000000 0.309540
          787  +vt 0.000000 0.563487
          788  +vt 1.000000 0.563487
          789  +vt 1.000000 0.309540
          790  +vt 0.000000 0.563487
          791  +vt 0.000000 0.309540
          792  +vt 1.000000 0.309540
          793  +vt 1.000000 0.563487
          794  +vt 1.000000 1.000000
          795  +vt 0.000000 1.000000
          796  +vt 0.268392 0.731608
          797  +vt 0.731608 0.731608
          798  +vt 1.000000 0.000000
          799  +vt 0.731608 0.268392
          800  +vt 0.000000 0.000000
          801  +vt 0.268392 0.268392
          802  +vt 0.000000 0.309540
          803  +vt 0.000000 0.563487
          804  +vt 1.000000 0.563487
          805  +vt 1.000000 0.309540
          806  +vt 0.000000 0.309540
          807  +vt 0.000000 0.563487
          808  +vt 1.000000 0.563487
          809  +vt 1.000000 0.309540
          810  +vt 0.000000 0.563487
          811  +vt 0.000000 0.309540
          812  +vt 1.000000 0.309540
          813  +vt 1.000000 0.563487
          814  +vt 1.000000 1.000000
          815  +vt 0.000000 1.000000
          816  +vt 0.268392 0.731608
          817  +vt 0.731608 0.731608
          818  +vt 1.000000 0.000000
          819  +vt 0.731608 0.268392
          820  +vt 0.000000 0.000000
          821  +vt 0.268392 0.268392
          822  +vt 0.000000 0.309540
          823  +vt 0.000000 0.563487
          824  +vt 1.000000 0.563487
          825  +vt 1.000000 0.309540
          826  +vt 0.000000 0.309540
          827  +vt 0.000000 0.563487
          828  +vt 1.000000 0.563487
          829  +vt 1.000000 0.309540
          830  +vt 0.000000 0.563487
          831  +vt 0.000000 0.309540
          832  +vt 1.000000 0.309540
          833  +vt 1.000000 0.563487
          834  +vt 1.000000 1.000000
          835  +vt 0.000000 1.000000
          836  +vt 0.268392 0.731608
          837  +vt 0.731608 0.731608
          838  +vt 1.000000 0.000000
          839  +vt 0.731608 0.268392
          840  +vt 0.000000 0.000000
          841  +vt 0.268392 0.268392
          842  +vt 0.041250 0.853656
          843  +vt 0.041250 0.670486
          844  +vt 0.141716 0.670486
          845  +vt 0.141716 0.853656
          846  +vt 0.958750 0.041250
          847  +vt 0.824480 0.175520
          848  +vt 0.824480 0.824480
          849  +vt 0.958750 0.958750
          850  +vt 0.041250 0.041250
          851  +vt 0.175520 0.175520
          852  +vt 0.041250 0.958750
          853  +vt 0.175520 0.824480
          854  +vt 0.175520 1.000000
          855  +vt 0.824480 1.000000
          856  +vt 0.824480 0.890500
          857  +vt 0.175520 0.890500
          858  +vt 0.041250 0.958750
          859  +vt 0.175520 0.824480
          860  +vt 0.824480 0.824480
          861  +vt 0.958750 0.958750
          862  +vt 0.041250 0.041250
          863  +vt 0.175520 0.175520
          864  +vt 0.958750 0.041250
          865  +vt 0.824480 0.175520
          866  +vt 0.175520 0.958750
          867  +vt 0.824480 0.958750
          868  +vt 0.824480 0.858284
          869  +vt 0.175520 0.858284
          870  +vt 0.958750 1.000000
          871  +vt 0.824480 0.853656
          872  +vt 0.824480 0.670486
          873  +vt 0.958750 0.670486
          874  +vt 0.041250 1.000000
          875  +vt 0.175520 0.853656
          876  +vt 0.041250 0.000000
          877  +vt 0.175520 0.146344
          878  +vt 0.175520 0.329514
          879  +vt 0.041250 0.329514
          880  +vt 0.958750 0.000000
          881  +vt 0.824480 0.146344
          882  +vt 0.958750 0.853656
          883  +vt 0.958750 0.670486
          884  +vt 0.858284 0.670486
          885  +vt 0.858284 0.853656
          886  +vt 0.958750 1.000000
          887  +vt 0.824480 0.853656
          888  +vt 0.824480 0.670486
          889  +vt 0.958750 0.670486
          890  +vt 0.041250 1.000000
          891  +vt 0.175520 0.853656
          892  +vt 0.041250 0.000000
          893  +vt 0.175520 0.146344
          894  +vt 0.175520 0.329514
          895  +vt 0.041250 0.329514
          896  +vt 0.958750 0.000000
          897  +vt 0.824480 0.146344
          898  +vt 0.175520 0.000000
          899  +vt 0.824480 0.000000
          900  +vt 0.824480 0.109500
          901  +vt 0.175520 0.109500
          902  +vt 0.041250 1.000000
          903  +vt 0.175520 0.853656
          904  +vt 0.175520 0.670486
          905  +vt 0.041250 0.670486
          906  +vt 0.824480 0.853656
          907  +vt 0.824480 0.146344
          908  +vt 0.824480 0.329514
          909  +vt 0.958750 0.329514
          910  +vt 0.041250 0.000000
          911  +vt 0.175520 0.146344
          912  +vt 0.041250 0.146344
          913  +vt 0.041250 0.329514
          914  +vt 0.141716 0.329514
          915  +vt 0.141716 0.146344
          916  +vt 0.175520 0.853656
          917  +vt 0.175520 0.670486
          918  +vt 0.041250 0.670486
          919  +vt 0.958750 1.000000
          920  +vt 0.824480 0.853656
          921  +vt 0.958750 0.000000
          922  +vt 0.824480 0.146344
          923  +vt 0.824480 0.329514
          924  +vt 0.958750 0.329514
          925  +vt 0.175520 0.146344
          926  +vt 0.824480 0.109500
          927  +vt 0.824480 0.146344
          928  +vt 0.175520 0.146344
          929  +vt 0.175520 0.109500
          930  +vt 0.175520 0.146344
          931  +vt 0.824480 0.890500
          932  +vt 0.824480 0.853656
          933  +vt 0.175520 0.853656
          934  +vt 0.175520 0.890500
          935  +vt 0.175520 0.853656
          936  +vt 0.824480 0.853656
          937  +vt 0.824480 0.890500
          938  +vt 0.175520 0.329514
          939  +vt 0.141716 0.853656
          940  +vt 0.041250 0.175520
          941  +vt 0.041250 0.824480
          942  +vt 0.141716 0.824480
          943  +vt 0.141716 0.175520
          944  +vt 0.958750 0.175520
          945  +vt 0.958750 0.824480
          946  +vt 0.858284 0.824480
          947  +vt 0.858284 0.175520
          948  +vt 0.958750 0.853656
          949  +vt 0.958750 0.670486
          950  +vt 0.858284 0.670486
          951  +vt 0.858284 0.853656
          952  +vt 0.175520 0.041250
          953  +vt 0.824480 0.041250
          954  +vt 0.824480 0.141716
          955  +vt 0.175520 0.141716
          956  +vt 0.041250 0.853656
          957  +vt 0.041250 0.670486
          958  +vt 0.141716 0.670486
          959  +vt 0.141716 0.853656
          960  +vt 0.824480 0.958750
          961  +vt 0.175520 0.958750
          962  +vt 0.175520 0.858284
          963  +vt 0.824480 0.858284
          964  +vt 0.041250 0.824480
          965  +vt 0.041250 0.175520
          966  +vt 0.141716 0.175520
          967  +vt 0.141716 0.824480
          968  +vt 0.175520 0.000000
          969  +vt 0.175520 0.109500
          970  +vt 0.175520 1.000000
          971  +vt 0.175520 0.890500
          972  +vt 0.824480 0.000000
          973  +vt 0.175520 0.000000
          974  +vt 0.824480 0.109500
          975  +vt 0.958750 0.146344
          976  +vt 0.958750 0.329514
          977  +vt 0.858284 0.329514
          978  +vt 0.858284 0.146344
          979  +vt 0.824480 1.000000
          980  +vt 0.175520 1.000000
          981  +vt 0.041250 0.146344
          982  +vt 0.041250 0.329514
          983  +vt 0.141716 0.329514
          984  +vt 0.141716 0.146344
          985  +vt 0.824480 0.000000
          986  +vt 0.958750 0.824480
          987  +vt 0.958750 0.175520
          988  +vt 0.858284 0.175520
          989  +vt 0.858284 0.824480
          990  +vt 0.958750 0.146344
          991  +vt 0.958750 0.329514
          992  +vt 0.858284 0.329514
          993  +vt 0.858284 0.146344
          994  +vt 0.824480 1.000000
          995  +vt 0.824480 0.041250
          996  +vt 0.175520 0.041250
          997  +vt 0.175520 0.141716
          998  +vt 0.824480 0.141716
          999  +vt 0.824480 0.146344
         1000  +vt 0.175520 0.146344
         1001  +vt 0.141716 0.146344
         1002  +vt 0.824480 0.146344
         1003  +vt 0.175520 0.853656
         1004  +vt 0.175520 0.670486
         1005  +vt 0.824480 0.853656
         1006  +vt 0.858284 0.853656
         1007  +vt 0.824480 0.853656
         1008  +vt 0.175520 0.853656
         1009  +vt 0.824480 0.670486
         1010  +vt 0.858284 0.670486
         1011  +vt 0.175520 0.146344
         1012  +vt 0.824480 0.146344
         1013  +vt 0.858284 0.146344
         1014  +vt 0.824480 0.329514
         1015  +vt 0.858284 0.329514
         1016  +vt 0.141716 0.329514
         1017  +vt 0.041250 0.329514
         1018  +vt 0.041250 0.146344
         1019  +vt 0.141716 0.146344
         1020  +vt 0.826869 0.733677
         1021  +vt 0.858677 0.733677
         1022  +vt 0.858677 0.701869
         1023  +vt 0.834877 0.701869
         1024  +vt 0.826869 0.709877
         1025  +vt 0.673131 0.733677
         1026  +vt 0.673131 0.709877
         1027  +vt 0.665123 0.701869
         1028  +vt 0.641323 0.701869
         1029  +vt 0.641323 0.733677
         1030  +vt 0.673131 0.516323
         1031  +vt 0.641323 0.516323
         1032  +vt 0.641323 0.548131
         1033  +vt 0.665123 0.548131
         1034  +vt 0.673131 0.540123
         1035  +vt 0.826869 0.516323
         1036  +vt 0.826869 0.540123
         1037  +vt 0.834877 0.548131
         1038  +vt 0.858677 0.548131
         1039  +vt 0.858677 0.516323
         1040  +vt 0.824480 0.670486
         1041  +vt 0.175520 0.670486
         1042  +vt 0.824480 0.329514
         1043  +vt 0.041250 0.329514
         1044  +vt 0.175520 0.329514
         1045  +vt 0.175520 0.670486
         1046  +vt 0.141716 0.670486
         1047  +vt 0.824480 0.670486
         1048  +vt 0.824480 0.329514
         1049  +vt 0.141716 0.670486
         1050  +vt 0.041250 0.670486
         1051  +vt 0.041250 0.853656
         1052  +vt 0.141716 0.853656
         1053  +vt 0.958750 0.329514
         1054  +vt 0.824480 0.329514
         1055  +vt 0.041250 0.670486
         1056  +vt 0.175520 0.670486
         1057  +vt 0.958750 0.670486
         1058  +vt 0.824480 0.670486
         1059  +vt 0.858284 0.670486
         1060  +vt 0.958750 0.670486
         1061  +vt 0.958750 0.853656
         1062  +vt 0.858284 0.853656
         1063  +vt 0.958750 0.329514
         1064  +vt 0.958750 0.146344
         1065  +vt 0.175520 0.329514
         1066  +vt 0.141716 0.329514
         1067  +vt 0.041250 0.329514
         1068  +vt 0.041250 0.146344
         1069  +vt 0.858284 0.329514
         1070  +vt 0.958750 0.329514
         1071  +vt 0.958750 0.146344
         1072  +vt 0.858284 0.146344
         1073  +vt 0.041250 0.670486
         1074  +vt 0.041250 0.853656
         1075  +vt 0.141323 0.516323
         1076  +vt 0.141323 0.548131
         1077  +vt 0.165123 0.548131
         1078  +vt 0.173131 0.540123
         1079  +vt 0.173131 0.516323
         1080  +vt 0.358677 0.733677
         1081  +vt 0.358677 0.701869
         1082  +vt 0.334877 0.701869
         1083  +vt 0.326869 0.709877
         1084  +vt 0.326869 0.733677
         1085  +vt 0.173131 0.709877
         1086  +vt 0.165123 0.701869
         1087  +vt 0.141323 0.701869
         1088  +vt 0.141323 0.733677
         1089  +vt 0.173131 0.733677
         1090  +vt 0.358677 0.548131
         1091  +vt 0.358677 0.516323
         1092  +vt 0.326869 0.516323
         1093  +vt 0.326869 0.540123
         1094  +vt 0.334877 0.548131
         1095  +vt 0.958750 0.670486
         1096  +vt 0.958750 0.853656
         1097  +vt 0.175520 0.329514
         1098  +vn -1.0000 0.0000 0.0000
         1099  +vn 0.0000 0.0000 -1.0000
         1100  +vn 1.0000 0.0000 0.0000
         1101  +vn 0.0000 0.0000 1.0000
         1102  +vn 0.0000 1.0000 0.0000
         1103  +vn -0.0000 -1.0000 0.0000
         1104  +vn 0.7071 0.7071 0.0000
         1105  +vn 0.5774 0.5774 -0.5773
         1106  +vn 0.0000 -0.7071 -0.7071
         1107  +vn 0.7071 -0.7071 0.0000
         1108  +vn 0.7071 0.0000 -0.7071
         1109  +vn -0.5774 0.5774 0.5773
         1110  +vn -0.0000 0.7071 -0.7071
         1111  +vn 0.5774 0.5774 0.5773
         1112  +vn 0.0000 0.7071 0.7071
         1113  +vn 0.7071 0.0000 0.7071
         1114  +vn 0.5774 -0.5774 0.5773
         1115  +vn 0.0000 -0.7071 0.7071
         1116  +vn -0.5774 -0.5774 0.5773
         1117  +vn -0.7071 -0.7071 0.0000
         1118  +vn -0.7071 0.0000 0.7071
         1119  +vn -0.7071 0.7071 -0.0000
         1120  +vn -0.5774 -0.5774 -0.5773
         1121  +vn -0.7071 0.0000 -0.7071
         1122  +vn -0.5774 0.5774 -0.5773
         1123  +vn 0.0000 -0.7264 -0.6873
         1124  +vn 0.6873 -0.7264 0.0000
         1125  +vn 0.0000 -0.7264 0.6873
         1126  +vn -0.6873 -0.7264 0.0000
         1127  +g Cube.009_Cube.017_copper.001
         1128  +usemtl copper.001
         1129  +s off
         1130  +f 165/311/26 166/312/26 168/313/26 167/314/26
         1131  +f 167/315/27 168/316/27 172/317/27 171/318/27
         1132  +f 171/318/28 172/317/28 170/319/28 169/320/28
         1133  +f 169/321/29 170/322/29 166/312/29 165/311/29
         1134  +f 172/323/30 168/324/30 174/325/30 175/326/30
         1135  +f 170/327/30 172/323/30 175/326/30 176/328/30
         1136  +f 168/324/30 166/329/30 173/330/30 174/325/30
         1137  +f 166/329/30 170/327/30 176/328/30 173/330/30
         1138  +f 177/331/26 178/332/26 180/333/26 179/334/26
         1139  +f 179/335/27 180/336/27 184/337/27 183/338/27
         1140  +f 183/338/28 184/337/28 182/339/28 181/340/28
         1141  +f 181/341/29 182/342/29 178/332/29 177/331/29
         1142  +f 184/343/30 180/344/30 186/345/30 187/346/30
         1143  +f 182/347/30 184/343/30 187/346/30 188/348/30
         1144  +f 180/344/30 178/349/30 185/350/30 186/345/30
         1145  +f 178/349/30 182/347/30 188/348/30 185/350/30
         1146  +f 189/351/26 190/352/26 192/353/26 191/354/26
         1147  +f 191/355/27 192/356/27 196/357/27 195/358/27
         1148  +f 195/358/28 196/357/28 194/359/28 193/360/28
         1149  +f 193/361/29 194/362/29 190/352/29 189/351/29
         1150  +f 196/363/30 192/364/30 198/365/30 199/366/30
         1151  +f 194/367/30 196/363/30 199/366/30 200/368/30
         1152  +f 192/364/30 190/369/30 197/370/30 198/365/30
         1153  +f 190/369/30 194/367/30 200/368/30 197/370/30
         1154  +f 223/371/28 259/372/28 264/373/28 247/374/28
         1155  +f 203/375/31 210/376/31 209/377/31 206/378/31
         1156  +f 208/379/31 211/380/31 210/376/31 203/375/31
         1157  +f 202/381/31 212/382/31 211/380/31 208/379/31
         1158  +f 206/378/31 209/377/31 212/382/31 202/381/31
         1159  +f 216/383/26 213/384/26 238/385/26 240/386/26
         1160  +f 201/387/30 214/388/30 213/389/30 205/390/30
         1161  +f 207/391/30 215/392/30 214/388/30 201/387/30
         1162  +f 204/393/30 216/394/30 215/392/30 207/391/30
         1163  +f 205/390/30 213/389/30 216/394/30 204/393/30
         1164  +f 226/395/31 227/396/31 251/397/31 249/398/31
         1165  +f 205/399/28 218/400/28 272/401/28 269/402/28
         1166  +f 204/403/28 219/404/28 218/400/28 205/399/28
         1167  +f 203/405/28 220/406/28 278/407/28 277/408/28
         1168  +f 206/409/28 217/410/28 220/406/28 203/405/28
         1169  +f 219/411/27 268/412/27 273/413/27 243/414/27
         1170  +f 204/415/29 222/416/29 263/417/29 257/418/29
         1171  +f 207/419/29 223/420/29 222/416/29 204/415/29
         1172  +f 208/421/29 224/422/29 280/423/29 279/424/29
         1173  +f 203/425/29 221/426/29 224/422/29 208/421/29
         1174  +f 212/427/29 209/428/29 234/429/29 236/430/29
         1175  +f 201/431/27 226/432/27 271/433/27 260/434/27
         1176  +f 205/399/27 227/435/27 226/432/27 201/431/27
         1177  +f 206/409/27 228/436/27 288/437/27 281/438/27
         1178  +f 202/439/27 225/440/27 228/436/27 206/409/27
         1179  +f 229/441/27 296/442/27 295/443/27 254/444/27
         1180  +f 207/419/26 230/445/26 267/446/26 258/447/26
         1181  +f 201/448/26 231/449/26 230/445/26 207/419/26
         1182  +f 202/450/26 232/451/26 290/452/26 289/453/26
         1183  +f 208/421/26 229/454/26 232/451/26 202/450/26
         1184  +f 236/455/32 256/456/32 254/457/32 235/458/32
         1185  +f 248/459/33 235/458/33 254/444/33
         1186  +f 240/460/34 245/461/34 247/462/34 239/463/34
         1187  +f 239/463/35 253/464/35 255/465/35 237/466/35
         1188  +f 248/459/36 254/444/36 295/443/36 286/467/36
         1189  +f 247/462/37 239/463/37 253/468/37
         1190  +f 230/469/31 231/470/31 255/471/31 253/472/31
         1191  +f 220/473/30 217/474/30 242/475/30 244/476/30
         1192  +f 227/477/26 270/478/26 275/479/26 251/480/26
         1193  +f 224/481/30 221/482/30 246/483/30 248/484/30
         1194  +f 231/485/29 261/486/29 265/487/29 255/488/29
         1195  +f 228/489/30 225/490/30 250/491/30 252/492/30
         1196  +f 232/493/30 229/494/30 254/495/30 256/496/30
         1197  +f 209/428/26 210/497/26 233/498/26 234/429/26
         1198  +f 213/384/29 214/499/29 237/500/29 238/385/29
         1199  +f 210/501/27 211/502/27 235/458/27 233/503/27
         1200  +f 217/504/29 282/505/29 287/506/29 242/507/29
         1201  +f 214/508/28 215/509/28 239/463/28 237/466/28
         1202  +f 221/510/26 285/511/26 283/512/26 246/513/26
         1203  +f 211/502/28 212/514/28 236/455/28 235/458/28
         1204  +f 218/515/31 219/516/31 243/517/31 241/518/31
         1205  +f 225/519/28 291/520/28 292/521/28 250/522/28
         1206  +f 215/509/27 216/523/27 240/460/27 239/463/27
         1207  +f 222/524/31 223/525/31 247/526/31 245/527/31
         1208  +f 235/458/38 248/459/38 246/528/38 233/503/38
         1209  +f 236/430/39 250/529/39 256/530/39
         1210  +f 234/429/40 252/531/40 250/529/40 236/430/40
         1211  +f 249/532/41 255/488/41 265/487/41 274/533/41
         1212  +f 255/488/42 249/532/42 237/500/42
         1213  +f 237/500/43 249/532/43 251/534/43 238/385/43
         1214  +f 241/535/44 238/385/44 251/534/44
         1215  +f 238/385/45 241/536/45 243/537/45 240/386/45
         1216  +f 241/535/46 251/534/46 275/538/46 276/539/46
         1217  +f 252/531/37 234/429/37 242/507/37
         1218  +f 233/498/47 244/540/47 242/541/47 234/429/47
         1219  +f 245/461/48 240/460/48 243/414/48
         1220  +f 244/542/49 246/528/49 283/543/49 284/544/49
         1221  +f 246/528/50 244/542/50 233/503/50
         1222  +f 286/545/28 280/546/28 224/547/28 248/548/28
         1223  +f 259/549/31 258/550/31 267/551/31 266/552/31 264/553/31
         1224  +f 263/554/31 262/555/31 273/556/31 268/557/31 257/558/31
         1225  +f 270/559/31 269/560/31 272/561/31 276/562/31 275/563/31
         1226  +f 271/564/31 274/565/31 265/566/31 261/567/31 260/568/31
         1227  +f 273/413/49 262/569/49 245/461/49 243/414/49
         1228  +f 258/447/29 259/570/29 223/420/29 207/419/29
         1229  +f 281/438/28 282/571/28 217/410/28 206/409/28
         1230  +f 289/572/27 291/573/27 225/440/27 202/439/27
         1231  +f 264/574/36 266/575/36 253/468/36 247/462/36
         1232  +f 269/402/27 270/576/27 227/435/27 205/399/27
         1233  +f 287/506/46 293/577/46 252/531/46 242/507/46
         1234  +f 262/578/26 263/579/26 222/580/26 245/581/26
         1235  +f 277/582/29 285/583/29 221/426/29 203/425/29
         1236  +f 257/584/28 268/585/28 219/404/28 204/403/28
         1237  +f 260/586/26 261/587/26 231/449/26 201/448/26
         1238  +f 274/588/28 271/589/28 226/590/28 249/591/28
         1239  +f 284/544/27 278/592/27 220/593/27 244/542/27
         1240  +f 279/424/26 296/594/26 229/454/26 208/421/26
         1241  +f 294/595/29 290/596/29 232/597/29 256/530/29
         1242  +f 293/598/26 288/599/26 228/600/26 252/601/26
         1243  +f 266/575/27 267/602/27 230/603/27 253/468/27
         1244  +f 289/604/30 290/605/30 294/606/30 292/607/30 291/608/30
         1245  +f 277/609/30 278/610/30 284/611/30 283/612/30 285/613/30
         1246  +f 286/614/30 295/615/30 296/616/30 279/617/30 280/618/30
         1247  +f 282/619/30 281/620/30 288/621/30 293/622/30 287/623/30
         1248  +f 276/539/29 272/624/29 218/625/29 241/535/29
         1249  +f 292/626/41 294/595/41 256/530/41 250/529/41
         1250  +f 177/331/51 185/350/51 188/348/51 181/341/51
         1251  +f 179/334/52 186/345/52 185/350/52 177/331/52
         1252  +f 183/338/53 187/346/53 186/345/53 179/334/53
         1253  +f 181/341/54 188/348/54 187/346/54 183/338/54
         1254  +f 171/318/53 175/326/53 174/325/53 167/315/53
         1255  +f 169/320/54 176/328/54 175/326/54 171/318/54
         1256  +f 165/311/51 173/330/51 176/328/51 169/320/51
         1257  +f 167/315/52 174/325/52 173/330/52 165/311/52
         1258  +f 189/351/51 197/370/51 200/368/51 193/361/51
         1259  +f 193/361/54 200/368/54 199/366/54 195/358/54
         1260  +f 195/358/53 199/366/53 198/365/53 191/355/53
         1261  +f 191/355/52 198/365/52 197/370/52 189/351/52
         1262  +o Cube.010_Cube.018
         1263  +v 0.059889 0.868714 -0.028534
         1264  +v 0.059889 0.976405 -0.028534
         1265  +v 0.059889 0.976405 0.091016
         1266  +v 0.059889 0.868714 0.091016
         1267  +v -0.059660 0.868714 0.091016
         1268  +v -0.059660 0.976405 0.091016
         1269  +v -0.059660 0.976405 -0.028534
         1270  +v -0.059660 0.868714 -0.028534
         1271  +vt 0.000000 1.000000
         1272  +vt 1.000000 1.000000
         1273  +vt 1.000000 0.000000
         1274  +vt 0.000000 0.000000
         1275  +vt 1.000000 0.049599
         1276  +vt 0.000000 0.049599
         1277  +vt 0.000000 0.950401
         1278  +vt 1.000000 0.950401
         1279  +vt 0.000000 0.049599
         1280  +vt 1.000000 0.049599
         1281  +vt 1.000000 0.950401
         1282  +vt 0.000000 0.950401
         1283  +vt 1.000000 0.049599
         1284  +vt 1.000000 0.950401
         1285  +vt 0.000000 0.049599
         1286  +vt 0.000000 0.950401
         1287  +vt 0.000000 1.000000
         1288  +vt 0.000000 0.000000
         1289  +vt 1.000000 0.000000
         1290  +vt 1.000000 1.000000
         1291  +vn 0.0000 -1.0000 0.0000
         1292  +vn 0.0000 0.0000 -1.0000
         1293  +vn 0.0000 0.0000 1.0000
         1294  +vn -1.0000 0.0000 0.0000
         1295  +vn 1.0000 0.0000 0.0000
         1296  +vn 0.0000 1.0000 0.0000
         1297  +g Cube.010_Cube.018_gem.001
         1298  +usemtl gem.001
         1299  +s off
         1300  +f 304/627/55 297/628/55 300/629/55 301/630/55
         1301  +f 297/631/56 304/632/56 303/633/56 298/634/56
         1302  +f 301/635/57 300/636/57 299/637/57 302/638/57
         1303  +f 304/639/58 301/635/58 302/638/58 303/640/58
         1304  +f 300/641/59 297/631/59 298/634/59 299/642/59
         1305  +f 303/643/60 302/644/60 299/645/60 298/646/60

Modified ores.lua from [a381d20de4] to [48691b218f].

    39     39   		value = fragments_per_ingot * 9;
    40     40   	};
    41     41   }
    42     42   
    43     43   local tools, armors = sorcery.matreg.tools, sorcery.matreg.armors
    44     44   for name, metal in pairs(sorcery.data.metals) do
    45     45   	local ingot = metal.ingot or 'sorcery:' .. name .. '_ingot'
    46         -	local block = metal.block or 'sorcery:' .. name .. '_block'
           46  +	local block = metal.block or 'sorcery:' .. name .. 'block'
    47     47   	local screw = 'sorcery:screw_' .. name
    48     48   	local fragment = 'sorcery:fragment_' .. name
    49         -	if not metal.no_tools then for _,t in pairs(tools) do
           49  +	local powder = 'sorcery:powder_' .. name
           50  +	metal.parts = {
           51  +		ingot = ingot;
           52  +		block = block;
           53  +		screw = screw;
           54  +		fragment = fragment;
           55  +		powder = powder;
           56  +	}
           57  +	if not metal.no_tools then for t,c in pairs(tools) do
    50     58   		sorcery.matreg.lookup[(metal.items and metal.items[t]) or ('sorcery:' .. t .. '_' .. name)] = {
    51     59   			metal = true;
    52     60   			id = name; data = metal;
           61  +			value = c.cost * fragments_per_ingot;
    53     62   		}
    54     63   	end end
    55         -	if not metal.no_armor then for _,a in pairs(armors) do
           64  +	if not metal.no_armor then for a,c in pairs(armors) do
    56     65   		sorcery.matreg.lookup[(metal.items and metal.items[a]) or ('sorcery:' .. a .. '_' .. name)] = {
    57     66   			metal = true;
    58     67   			id = name; data = metal;
           68  +			value = c.cost * fragments_per_ingot;
    59     69   		}
    60     70   	end end
    61     71   	sorcery.data.metallookup[ingot] = {
    62     72   		id = name; data = metal;
    63     73   		value = fragments_per_ingot;
    64     74   	}
    65     75   	sorcery.data.metallookup[block] = {
................................................................................
    71     81   		value = 1;
    72     82   	}
    73     83   	sorcery.data.metallookup[screw] = {
    74     84   		id = name; data = metal;
    75     85   		value = 0; -- prevent use in smelting
    76     86   	}
    77     87   	minetest.register_craftitem(screw, {
    78         -		description = sorcery.lib.str.capitalize(name) .. ' screw';
           88  +		description = sorcery.lib.str.capitalize(name) .. ' Screw';
    79     89   		inventory_image = sorcery.lib.image('sorcery_screw.png'):multiply(sorcery.lib.color(metal.tone)):render();
    80     90   	})
           91  +	minetest.register_craftitem(powder, {
           92  +		description = sorcery.lib.str.capitalize(name) .. ' Powder';
           93  +		inventory_image = 'sorcery_' .. name .. '_powder.png';
           94  +	})
           95  +	if metal.dye then
           96  +		minetest.register_craft {
           97  +			output = 'dye:' .. metal.dye .. ' 4';
           98  +			recipe = {
           99  +				{'',     powder,                   ''};
          100  +				{powder,'basic_materials:paraffin',powder};
          101  +				{'','bucket:bucket_water',''};
          102  +			};
          103  +			replacements = {
          104  +				{'bucket:bucket_water', 'bucket:bucket_empty'};
          105  +			};
          106  +		};
          107  +	end
    81    108   	-- TODO: replace crafting recipe with kiln recipe
    82    109   	minetest.register_craft {
    83    110   		output = screw.. ' 4';
    84    111   		recipe = {
    85    112   			{fragment,fragment,fragment};
    86    113   			{'',      fragment,''};
    87    114   			{'',      fragment,''};
................................................................................
   107    134   			lump_image = (metal.image and metal.image.lump) or nil;
   108    135   			armor_weight = metal.armor_weight;
   109    136   			armor_protection = metal.armor_protection;
   110    137   		}
   111    138   	end
   112    139   	minetest.register_craftitem(fragment, {
   113    140   		inventory_image = 'sorcery_' .. name .. '_fragment.png';
   114         -		description = sorcery.lib.str.capitalize(name) .. ' fragment';
          141  +		description = sorcery.lib.str.capitalize(name) .. ' Fragment';
   115    142   	})
          143  +	minetest.register_craft {
          144  +		type = 'cooking';
          145  +		recipe = powder;
          146  +		cooktime = (metal.cooktime or 4) * 1.5;
          147  +		output = fragment;
          148  +	}
   116    149   	minetest.register_craft {
   117    150   		type = 'cooking';
   118    151   		recipe = ingot;
   119    152   		cooktime = (metal.cooktime or 4) / 2;
   120    153   		output = fragment .. ' ' .. tostring(fragments_per_ingot);
   121    154   	}
   122    155   	do local rec = {}
................................................................................
   124    157   			rec[#rec+1]=fragment 
   125    158   		end
   126    159   		minetest.register_craft {
   127    160   			type = 'shapeless';
   128    161   			recipe = rec;
   129    162   			output = ingot;
   130    163   		}
          164  +	end
          165  +	if metal.fuel then
          166  +		minetest.register_craft {
          167  +			type = 'fuel';
          168  +			recipe = powder;
          169  +			burntime = metal.fuel;
          170  +		}
   131    171   	end
   132    172   	if metal.mix then
   133    173   		sorcery.data.register.alloy(sorcery.lib.tbl.merge(metal.mix, {
   134    174   			output = name;
   135    175   			cooktime = metal.cooktime or 10;
   136    176   		}))
          177  +	end
          178  +	if metal.sinter then
          179  +		local powders = {}
          180  +		for _,m in pairs(metal.sinter) do
          181  +			powders[#powders+1] = 'sorcery:powder_' .. m
          182  +		end
          183  +		minetest.register_craft {
          184  +			type = 'shapeless';
          185  +			output = powder .. ' ' .. tostring(#powders);
          186  +			recipe = powders;
          187  +		};
   137    188   	end
   138    189   end

Added textures/sorcery_aluminum_powder.png version [90765bbba2].

cannot compute difference between binary files

Added textures/sorcery_brass_powder.png version [72cc1a227d].

cannot compute difference between binary files

Added textures/sorcery_bronze_powder.png version [1f5965ab69].

cannot compute difference between binary files

Added textures/sorcery_cobalt_powder.png version [d40093df7d].

cannot compute difference between binary files

Added textures/sorcery_condenser.png version [4dc6d2863f].

cannot compute difference between binary files

Added textures/sorcery_conduit_copper_side.png version [f1ead52faf].

cannot compute difference between binary files

Added textures/sorcery_conduit_copper_top.png version [8c1a859f77].

cannot compute difference between binary files

Added textures/sorcery_copper_powder.png version [f251fc6c10].

cannot compute difference between binary files

Deleted textures/sorcery_crucible_duranium.png version [3b1e95eec0].

cannot compute difference between binary files

Added textures/sorcery_crucible_duridium.png version [3b1e95eec0].

cannot compute difference between binary files

Deleted textures/sorcery_duranium_fragment.png version [7d415a62db].

cannot compute difference between binary files

Added textures/sorcery_duridium_fragment.png version [7d415a62db].

cannot compute difference between binary files

Added textures/sorcery_duridium_powder.png version [1bb4df86fd].

cannot compute difference between binary files

Added textures/sorcery_electrum_powder.png version [18417a63d0].

cannot compute difference between binary files

Added textures/sorcery_eternium_powder.png version [48054b80d7].

cannot compute difference between binary files

Added textures/sorcery_gold_powder.png version [e415c0e827].

cannot compute difference between binary files

Added textures/sorcery_impervium_powder.png version [a542329e06].

cannot compute difference between binary files

Added textures/sorcery_iridium_powder.png version [aef440b9aa].

cannot compute difference between binary files

Added textures/sorcery_levitanium_powder.png version [9eacd80255].

cannot compute difference between binary files

Added textures/sorcery_lithium_powder.png version [c8272b7787].

cannot compute difference between binary files

Added textures/sorcery_mill_back.png version [7495982119].

cannot compute difference between binary files

Added textures/sorcery_mill_bottom.png version [2a6d4c6eae].

cannot compute difference between binary files

Added textures/sorcery_mill_front.png version [a435aaac6a].

cannot compute difference between binary files

Added textures/sorcery_mill_grindhead.png version [7f26b51b05].

cannot compute difference between binary files

Added textures/sorcery_mill_grindhead_shade.png version [9d6a7ea7b2].

cannot compute difference between binary files

Added textures/sorcery_mill_side.png version [6da51e5a57].

cannot compute difference between binary files

Added textures/sorcery_mill_top.png version [790b4e6ed9].

cannot compute difference between binary files

Added textures/sorcery_platinum_powder.png version [a2a2fa62a8].

cannot compute difference between binary files

Added textures/sorcery_silver_powder.png version [084c4156da].

cannot compute difference between binary files

Added textures/sorcery_statlamp_blue.png version [6a04f2cd64].

cannot compute difference between binary files

Added textures/sorcery_statlamp_green.png version [298a31bc72].

cannot compute difference between binary files

Added textures/sorcery_statlamp_off.png version [e77628e4ce].

cannot compute difference between binary files

Added textures/sorcery_statlamp_purple.png version [1d0c592359].

cannot compute difference between binary files

Added textures/sorcery_statlamp_red.png version [87e8ab6d25].

cannot compute difference between binary files

Added textures/sorcery_statlamp_yellow.png version [458f0fd969].

cannot compute difference between binary files

Added textures/sorcery_steel_powder.png version [0f9fc0ea2b].

cannot compute difference between binary files

Added textures/sorcery_tin_powder.png version [01dbc5d6c6].

cannot compute difference between binary files

Added textures/sorcery_tungsten_powder.png version [8aba8a538e].

cannot compute difference between binary files

Added textures/sorcery_unobtanium_powder.png version [9962b3a315].

cannot compute difference between binary files