ADDED data/compat.lua Index: data/compat.lua ================================================================== --- data/compat.lua +++ data/compat.lua @@ -0,0 +1,26 @@ +local grain = { + hardness = 1; + value = 1; + powder = 'farming:flour'; + grindcost = 4; +} +return { + grindables = { + ['farming:wheat'] = grain; + ['farming:rye'] = grain; + ['farming:oats'] = grain; + ['farming:barley'] = grain; + ['farming:rice'] = { + powder = 'farming:rice_flour'; + hardness = 1; + value = 1; + grindcost = 4; + } + }; + ley = { + ['default:mese'] = { + power = 0.25; + mode = 'produce'; + }; + }; +} Index: data/enchants.lua ================================================================== --- data/enchants.lua +++ data/enchants.lua @@ -1,13 +1,17 @@ -- an optional 'enchant' function can be defined, and will -- be called when the enchantment is placed on the object local allgroups = { 'sword'; 'pick'; 'pickaxe'; - 'sickle'; 'scythe'; 'shovel'; - 'hoe'; 'helmet'; 'leggings'; - 'chestplate'; 'boots'; + 'sickle'; 'axe'; 'scythe'; + 'shovel'; 'hoe'; 'helmet'; + 'leggings'; 'chestplate'; 'boots'; } +local digtools = { + 'pick'; 'pickaxe'; 'sickle'; + 'shovel'; 'axe'; +} return { endure = { -- withstand more blows name = 'Endure'; cost = 1; tone = {232,102,255}; @@ -31,10 +35,18 @@ }; drain = { groups = {'sword'}; cost = 4; }; -- health vampirism + glitter = { -- created prolonged light on digging + name = 'Glitter'; + groups = digtools; + affinity = 'cognic'; + cost = 1; + tone = {255,235,195}; + desc = 'Leave a trail of light hanging in the air as you dig'; + }; harvest = { -- kills or digging ore replenish durability name = 'Harvest'; cost = 0; -- energy is only depleted when repair takes place tone = {255,84,187}; affinity = 'syncretic'; @@ -122,11 +134,12 @@ }; pierce = { -- faster mining speed name = 'Pierce'; cost = 3; tone = {113,240,251}; - groups = { + groups = digtools; + { 'pick';'pickaxe';'axe';'shovel';'sickle'; }; desc = 'rip through solid stone or wood like a hot knife through butter'; recipe = { {lens = 'amplifier', gem = 'diamond', dmg = 4}; Index: data/greases.lua ================================================================== --- data/greases.lua +++ data/greases.lua @@ -52,7 +52,16 @@ core = { 'sorcery:oil_flame', 'sorcery:oil_wind' }; mix = { 'sorcery:extract_onion'; 'tnt:gunpowder'; }; + }; + enchanting = { + color = {222,57,239}; + core = { 'sorcery:oil_mystic', 'sorcery:oil_dawn', 'sorcery:oil_mushroom' }; + mix = { + 'sorcery:powder_cobalt'; + 'sorcery:powder_cobalt'; + 'sorcery:extract_grape'; + }; }; } Index: data/metals.lua ================================================================== --- data/metals.lua +++ data/metals.lua @@ -20,21 +20,26 @@ tin = { ingot = 'default:tin_ingot'; block = 'default:tinblock'; tone = {172,172,172}; no_tools = true; no_armor = true; + hardness = 2; }; copper = { + dye = 'orange'; ingot = 'default:copper_ingot'; block = 'default:copperblock'; tone = {255,176,61}; no_tools = true; no_armor = true; + hardness = 2; }; brass = { tone = {255,226,87}; + dye = 'bright_orange'; artificial = true; no_tools = true; no_armor = true; + hardness = 3; mix = { metals = { silver = 1; copper = 4; }; @@ -41,13 +46,15 @@ }; }; bronze = { ingot = 'default:bronze_ingot'; block = 'default:bronzeblock'; + dye = 'dark_orange'; artificial = true; tone = {229,115,52}; items = default_items('bronze'); + hardness = 4; maxenergy = 150; slots = { {affinity = {'counterpraxic'}; confluence = 0.7}; }; mix = { @@ -61,30 +68,35 @@ ingot = 'default:steel_ingot'; block = 'default:steelblock'; tone = {240,240,240}; items = default_items('steel'); maxenergy = 200; + hardness = 5; slots = { {affinity = {'praxic'}; confluence = 0.5}; }; }; aluminum = { tone = {196,64,32}, alpha = 128; + dye = 'red'; meltpoint = 1; rarity = 12; depth = 158; power = 3; speed = 2.4; durability = 700; cooktime = 25; + hardness = 6; armor_weight = 0.3; maxenergy = 400; slots = { {affinity = {'syncretic'}; confluence = 0.7}; {affinity = {'praxic'}; confluence = 0.4}; }; }; levitanium = { tone = {17,255,191}, alpha = 40; + dye = 'bright_blue'; meltpoint = 4; + hardness = 3; rarity = 17; depth = 870; power = 1; durability = 50; cooktime = 70; armor_weight = -2.2; armor_protection = 1; maxenergy = 5000; no_tools = true; @@ -92,52 +104,60 @@ platinum = { tone = {255,233,118}, alpha = 50; meltpoint = 1; rarity = 15; depth = 580; power = 4; speed = 3; + hardness = 6; durability = 1400; cooktime = 40; armor_weight = 0.7; maxenergy = 1000; slots = { {affinity = {'praxic','counterpraxic'}; confluence = 0.3}; {affinity = {'counterpraxic'}; confluence = 0.8}; } }; gold = { + dye = 'yellow'; ingot = 'default:gold_ingot'; block = 'default:goldblock'; tone = {255,225,47}; + hardness = 1; maxenergy = 3000; slots = { {affinity = {'praxic','counterpraxic'}; confluence = 1.4}; {affinity = {'praxic','counterpraxic'}; confluence = 1.2}; } }; silver = { tone = {218,255,246}; - + dye = 'white'; maxenergy = 2000; + hardness = 1; depth = 380; rarity = 13.5; no_armor = true; no_tools = true; power = 1; cooktime = 8; hardness = 1; }; electrum = { tone = {212, 255, 0}, alpha = 80; artificial = true; + hardness = 1; + dye = 'bright_green'; mix = { metals = { silver = 1; gold = 1; }; }; + sinter = { 'silver', 'gold' }; no_tools = true; }; tungsten = { tone = {0,255,163}, alpha = 70; rarity = 14; speed = 2.8; power = 4; + hardness = 8; meltpoint = 4; cooktime = 100; durability = 2700; maxenergy = 1500; slots = { @@ -145,13 +165,15 @@ {affinity = {'praxic','counterpraxic'}, confluence = 1}; {affinity = {'praxic'}, confluence = 0.5}; }; }; cobalt = { + dye = 'blue'; tone = {48,101,255}, alpha = 90; rarity = 17; durabilty = 900; + hardness = 6; power = 3; speed = 3.5; cooktime = 30; maxenergy = 3500; slots = { @@ -162,19 +184,24 @@ }; } }; lithium = { tone = {255,252,93}, alpha = 80; + dye = 'yellow'; rarity = 13; + hardness = 2; + fuel = 80; no_tools = true; no_armor = true; }; iridium = { tone = {209,88,241}, alpha = 80; + dye = 'purple'; rarity = 18; meltpoint = 3; cooktime = 340; + hardness = 7; maxenergy = 1800; durability = 1900; speed = 3.2; img = { -- ingot = 'sorcery_iridium_ingot.png'; @@ -189,10 +216,11 @@ tone = {255,64,175}, alpha = 70; cooktime = 120; artificial = true; durability = 3400; speed = 3.1; + hardness = 9; power = 5; mix = { metals = { platinum = 4; aluminum = 4; @@ -212,10 +240,11 @@ tone = {226,255,107}, alpha = 90; cooktime = 260; meltpoint = 5; artificial = true; speed = 2.1; + hardness = 20; durability = 5300; maxenergy = 2300; watercool = true; mix = { metals = { @@ -234,10 +263,11 @@ tone = {156,82,222}, alpha = 100; cooktime = 500; meltpoint = 6; artificial = true; speed = 2; + hardness = 9; maxenergy = 1200; durability = 8100; watercool = true; mix = { metals = { @@ -255,10 +285,11 @@ tone = {114,255,214}, alpha = 120; meltpoint = 3; cooktime = 330; artificial = true; maxenergy = 4000; + hardness = 7; durability = 3300; speed = 3.4; slots = { {affinity={'praxic'}, confluence = 0.7}; {affinity={'counterpraxic'}, confluence = 1.2}; Index: data/spells.lua ================================================================== --- data/spells.lua +++ data/spells.lua @@ -291,11 +291,14 @@ }; praxic = anchorwand('praxic', 16, {'pine','shimmering','blazing'}); counterpraxic = anchorwand('counterpraxic',23, {'pine','shimmering','silent'}); entropic = anchorwand('entropic', 8, {'jungle','dark'}); syncretic = anchorwand('syncretic', 12, {'aspen','verdant','shimmering','blazing'}); - cognic = anchorwand('cognic', 36, {'acacia','verdant','dark'}); + cognic = anchorwand('cognic', 32, {'acacia','verdant','dark'}); + occlutic = anchorwand('occlutic', 15, {'apple','silent','dark'}); + imperic = anchorwand('imperic', 8, {'apple','verdant','blazing'}); + mandatic = anchorwand('mandatic', 18, {'jungle','verdant','silent'}); shape = { name = 'shaping'; uses = 24; color = {255,114,65}; leytype = 'praxic'; Index: enchanter.lua ================================================================== --- enchanter.lua +++ enchanter.lua @@ -169,11 +169,10 @@ local e = sorcery.enchant.get(stack) local p = 0.0 local slots = sorcery.matreg.lookup[stack:get_name()].data.slots -- TODO handle strength-boosting spells! for _,s in pairs(e.spells) do - print(dump(s)) if s.id == id then p = p + ((s.boost * slots[s.slot].confluence)/10) end end return p end sorcery.enchant.stackup = function(stack) @@ -265,34 +264,40 @@ description = 'Pedestal'; }) minetest.register_craft { output = 'sorcery:enchanter_channeler'; recipe = { - {'','default:bronze_ingot',''}; + {'sorcery:grease_enchanting','sorcery:platinum_ingot','sorcery:grease_enchanting'}; {'basic_materials:gold_wire','basic_materials:steel_strip','basic_materials:gold_wire'}; {'','sorcery:electrum_ingot',''}; }; replacements = { + {'sorcery:grease_enchanting','xdecor:bowl'}; + {'sorcery:grease_enchanting','xdecor:bowl'}; {'basic_materials:gold_wire','basic_materials:empty_spool'}; {'basic_materials:gold_wire','basic_materials:empty_spool'}; }; } minetest.register_craft { output = 'sorcery:enchanter_pedestal'; recipe = { {'basic_materials:copper_strip','group:wood','basic_materials:copper_strip'}; - {'','default:bronze_ingot',''}; + {'','sorcery:iridium_ingot',''}; {'','group:wood',''}; }; } minetest.register_craft { output = 'sorcery:enchanter'; recipe = { - {'','sorcery:enchanter_channeler',''}; + {'sorcery:grease_sealant','sorcery:enchanter_channeler','sorcery:grease_sealant'}; {'sorcery:enchanter_channeler','sorcery:enchanter_pedestal','sorcery:enchanter_channeler'}; {'group:wood','group:wood','group:wood'}; }; + replacements = { + {'sorcery:grease_sealant','xdecor:bowl'}; + {'sorcery:grease_sealant','xdecor:bowl'}; + }; } for i=1,10 do minetest.register_node('sorcery:air_flash_' .. i, { drawtype = 'airlike'; pointable = false; walkable = false; @@ -321,11 +326,10 @@ -- a flash of light when an enchanted tool's used -- to dig out a node local tool = puncher:get_wielded_item() local ench = sorcery.enchant.get(tool) if #ench.spells == 0 then return end - print('enchanted!') local sparks = {} -- local spark = function(name,color) local material = sorcery.enchant.getsubj(tool) local totalcost = 0 do local done = {} for _,sp in pairs(ench.spells) do Index: gems.lua ================================================================== --- gems.lua +++ gems.lua @@ -1,23 +1,26 @@ --- gemstones +local shards_per_gem = 9 sorcery.register_gem = function(name,gem) local itemname = gem.foreign or 'sorcery:gem_' .. name local shardname = gem.foreign_shard or 'sorcery:gem_' .. name .. '_shard' local amuletname = gem.foreign_amulet or 'sorcery:gem_' .. name .. '_amulet' local tools, armors = sorcery.matreg.tools, sorcery.matreg.armors - if gem.tools then for _,t in pairs(tools) do + if gem.tools then for t,c in pairs(tools) do sorcery.matreg.lookup[(gem.items and gem.items[t]) or ('sorcery:' .. t .. '_' .. name)] = { gem = true; id = name; data = gem; + value = c.cost*shards_per_gem; } end end - if gem.armor then for _,a in pairs(armors) do + if gem.armor then for a,c in pairs(armors) do sorcery.matreg.lookup[(gem.items and gem.items[a]) or ('sorcery:' .. a .. '_' .. name)] = { gem = true; id = name; data = gem; + value = c.cost*shards_per_gem; } end end if gem.foreign_shard then minetest.clear_craft {output=shardname} Index: init.lua ================================================================== --- init.lua +++ init.lua @@ -38,10 +38,11 @@ 'color', 'image', 'ui'; } sorcery.unit() { 'compat', 'matreg' } sorcery.unit('data') { + 'compat'; 'affinities'; 'gods'; 'enchants', 'spells'; 'gems', 'metals'; 'potions', 'oils', 'greases', 'draughts', 'elixirs', @@ -51,8 +52,9 @@ for _,u in pairs { 'leylines'; 'ores'; 'gems'; 'potions'; 'infuser'; 'altar'; 'wands'; 'tools'; 'enchanter'; 'harvester'; - 'metallurgy-hot'; 'entities'; 'recipes'; - 'coins'; 'interop'; 'tnodes'; + 'metallurgy-hot', 'metallurgy-cold'; + 'entities'; 'recipes'; 'coins'; + 'interop'; 'tnodes'; } do sorcery.load(u) end Index: leylines.lua ================================================================== --- leylines.lua +++ leylines.lua @@ -1,11 +1,13 @@ -- contains functions for determining information about -- the nearest leyline and its currents sorcery.ley = {} --- 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. +-- 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. +-- 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) +-- 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. sorcery.ley.estimate = function(pos) local affs = { 'praxic'; 'counterpraxic'; 'cognic'; 'mandatic'; 'occlutic'; 'imperic'; @@ -44,5 +46,313 @@ local pos = minetest.get_player_by_name(caller):get_pos() local ley = sorcery.ley.estimate(pos) minetest.chat_send_player(caller, 'Leyline force ' .. tostring(ley.force) .. ' with affinities ' .. table.concat(ley.aff, ',')) end; }) + +-- 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. +-- 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. + +minetest.register_node('sorcery:conduit', { + description = 'Conduit'; + tiles = { + 'sorcery_conduit_copper_top.png'; + 'sorcery_conduit_copper_top.png'; + 'sorcery_conduit_copper_side.png'; + }; + groups = { + sorcery_ley_device = 1; + cracky = 3; + }; + _sorcery = { + ley = { mode = 'signal'; power = 10 }; + }; +}) +minetest.register_craft { + output = 'sorcery:conduit 4'; + recipe = { + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}; + {'default:copper_ingot', 'sorcery:electrumblock', 'default:copper_ingot'}; + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}; + }; +}; +minetest.register_craft { + output = 'sorcery:wire 4'; + recipe = { + {'', 'basic_materials:copper_wire',''}; + {'', 'sorcery:fragment_electrum', ''}; + {'', 'basic_materials:copper_wire',''}; + } +}; + +sorcery.ley.field_to_current = function(strength,time) + local ley_factor = 0.25 + -- a ley harvester will produce this much current with + -- access to a full-strength leyline + + return strength * ley_factor * time; +end + +do -- register condenser + local gem = sorcery.lib.image('default_diamond_block.png') + local amethyst = gem:multiply(sorcery.lib.color(sorcery.data.gems.amethyst.tone)) + local emerald = gem:multiply(sorcery.lib.color(sorcery.data.gems.emerald.tone)) + local box = { + type = 'fixed'; + fixed = { + -0.5, -0.5, -0.5; + 0.5, 1.2, 0.5; + }; + }; + minetest.register_node('sorcery:condenser', { + description = 'Condenser'; + drawtype = 'mesh'; + mesh = 'sorcery-condenser.obj'; + selection_box = box; + collision_box = box; + tiles = { + amethyst:render(); + 'sorcery_condenser.png'; + 'default_tin_block.png'; + 'default_stone.png'; + 'default_copper_block.png'; + emerald:render(); + }; + groups = { + cracky = 2; + sorcery_ley_device = 1; + }; + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string('infotext','Condenser') + end; + _sorcery = { + ley = { mode = 'produce' }; + on_leycalc = function(pos,time) + local l = sorcery.ley.estimate(pos) + return { + power = sorcery.ley.field_to_current(l.force, time); + affinity = l.aff; + } + end; + }; + }) +end + +minetest.register_craft { + output = 'sorcery:condenser'; + recipe = { + {'sorcery:accumulator'}; + {'sorcery:conduit'}; + }; +} +sorcery.ley.mapnet = function(startpos,power) + -- this function returns a list of all the nodes accessible from + -- a ley network and their associated positions + local net = {} + power = power or 0 + + local devices = { + consume = {}; + produce = {}; + signal = {}; + } + local numfound = 0 + local maxconduct = 0 + local minconduct + local foundp = function(p) + for k in pairs(net) do + if vector.equals(p,k) then return true end + end + return false + end + -- we're implementing this with a recursive function to start with + -- but this could rapidly lead to stack overflows so we should + -- replace it with a linear one at some point + local function find(positions) + local searchnext = {} + for _,pos in pairs(positions) do + for _,p in pairs { + {x = 0, z = 0, y = 0}; + {x = -1, z = 0, y = 0}; + {x = 1, z = 0, y = 0}; + {x = 0, z = -1, y = 0}; + {x = 0, z = 1, y = 0}; + {x = 0, z = 0, y = -1}; + {x = 0, z = 0, y = 1}; + } do local sum = vector.add(pos,p) + if not foundp(sum) then + local nodename = minetest.get_node(sum).name + if minetest.get_item_group(nodename,'sorcery_ley_device') ~= 0 + or sorcery.data.compat.ley[nodename] then + local d = sorcery.ley.sample(pos,1,nodename) + assert(d.mode == 'signal' + or d.mode == 'consume' + or d.mode == 'produce') + devices[d.mode][#(devices[d.mode]) + 1] = { + id = nodename; pos = sum; + } + if d.mode == 'signal' then + if d.power > power then + if minconduct then + if d.power < minconduct then + minconduct = d.power + end + else minconduct = d.power end + if d.power > maxconduct then + maxconduct = d.power + end + end + end + numfound = numfound + 1; + net[sum] = nodename; + searchnext[#searchnext + 1] = sum; + end + end + end + end + if #searchnext > 0 then find(searchnext) end + end + + find{startpos} + + if numfound > 0 then + return { + count = numfound; + map = net; + devices = devices; + conduct = { + min = minconduct; + max = maxconduct; + }; + } + else return nil end +end + +do local afftbl = { + [1] = 'praxic'; [2] = 'counterpraxic'; + [3] = 'cognic'; [4] = 'syncretic'; + [5] = 'mandatic'; [6] = 'occlutic'; + [7] = 'imperic'; [8] = 'entropic'; + } + local modetbl = { + [0] = 'none'; + [1] = 'consume'; + [2] = 'produce'; + [3] = 'signal'; + } + for i=1,#afftbl do afftbl [afftbl [i]] = i end + for i=1,#modetbl do modetbl[modetbl[i]] = i end + local m = sorcery.lib.marshal + local enc, dec = m.transcoder { + mode = m.t.u8; + power = m.t.u32; -- power generated/consumed * 10,000 + affinity = m.g.array(m.t.u8); -- indexes into afftbl + } + sorcery.ley.encode = function(l) + local idxs = {} + for _,k in pairs(l.affinity) do + idxs[#idxs+1] = afftbl[k] + end + return meta_armor(enc { + mode = modetbl[l.mode]; + power = l.power * 10000; + affinity = idxs; + }, true) + end + sorcery.ley.decode = function(str) + local obj = dec(meta_dearmor(str,true)) + local affs = {} + for _,k in pairs(obj.affinity) do + affs[#affs+1] = afftbl[k] + end + return { + mode = modetbl[obj.mode]; + power = obj.power / 10000.0; + affinity = affs; + } + end +end +sorcery.ley.setnode = function(pos,l) + local meta = minetest.get_node(pos) + meta:set_string('sorcery:ley',sorcery.ley.encode(l)) +end + +sorcery.ley.sample = function(pos,timespan,name) + -- returns how much ley-force can be transmitted by a + -- device over timespan + name = name or minetest.get_node(pos).name + local props = minetest.registered_nodes[name]._sorcery + local callback = props and props.on_leycalc or nil + local p,a,m + if callback then + local gen = callback(pos,timespan) + p = gen.power + a = gen.affinity + m = gen.mode + end + + if not (p and a and m) then + local nm = minetest.get_meta(pos) + if nm:contains('sorcery:ley') then + local l = sorcery.ley.decode(nm:get_string('sorcery:ley')) + p = p or sorcery.ley.field_to_current(l.power,timespan) + a = a or l.affinity + m = m or l.mode + end + end + + if (not (p and a and m)) and props and props.ley then + p = p or sorcery.ley.field_to_current(props.ley.power,timespan) + a = a or props.ley.affinity + m = m or props.ley.mode + end + + if (not (p and a and m)) then + local compat = sorcery.data.compat.ley[name] + if compat then + p = p or sorcery.ley.field_to_current(compat.power,timespan) + a = a or compat.affinity + m = m or compat.mode + end + end + + return { + power = p or 0; + mode = m or 'none'; + affinity = a or {}; + } +end + +sorcery.ley.netcaps = function(pos,timespan,exclude) + local net = sorcery.ley.mapnet(pos) + local maxpower = 0 + local freepower = 0 + local affs,usedaffs = {},{} + for _,n in pairs(net.devices.produce) do + if not exclude or not vector.equals(n.pos,exclude) then + local ln = sorcery.ley.sample(n.pos,timespan,n.id) + maxpower = maxpower + ln.power + for _,a in pairs(ln.affinity) do + affs[a] = (affs[a] or 0) + 1 + end + end + end + freepower = maxpower; + for _,n in pairs(net.devices.consume) do + if not exclude or not vector.equals(n.pos,exclude) then + local ln = sorcery.ley.sample(n.pos,timespan,n.id) + freepower = freepower - ln.power + for _,a in pairs(ln.affinity) do + usedaffs[a] = (usedaffs[a] or 0) + 1 + end + end + end + + return { + net = net; + freepower = freepower; + maxpower = maxpower; + affinity = affs; + affinity_balance = usedaffs; + } +end Index: lib/marshal.lua ================================================================== --- lib/marshal.lua +++ lib/marshal.lua @@ -1,20 +1,25 @@ --- minetest provides its own built-in serializer mechanisms. --- however, these leave much to be desired: the first works --- by converting values to *lua source code* and 'deserializes' --- these values by executing it in a mildly sandboxed env. --- it's LSON basically. the other serializer is JSON. clearly --- we need something better. if this was lua 5.3, we'd just --- use string.pack, but alas, they had to use luajit, which --- is stuck on an ancient version because it no longer exists. --- if we built against moonjit, we could use pack, but then --- that would raise compat issues for other users who might --- want to use these mods. so we need to write our own. +-- minetest provides its own built-in serializer mechanisms. however, +-- these leave much to be desired: the first works by converting +-- values to *lua source code* and 'deserializes' these values by +-- executing it in a mildly sandboxed env. it's LSON basically. the +-- other serializer is JSON. clearly we need something better. if this +-- was lua 5.3, we'd just use string.pack, but alas, they had to use +-- luajit, which is stuck on an ancient version because it no longer +-- exists. if we built against moonjit, we could use pack, but then +-- that would raise compat issues for other users who might want to +-- use these mods. so we need to write our own. +-- +-- good news is, it's very easy to do better than both the minetest +-- people and the clowns at PUC-Rio. (if only we had general purpose +-- bitops, it would be even easier) -- --- good news is, it's very easy to do better than both the --- minetest people and the clowns at PUC-Rio. (if only we had --- general purpose bitops, it would be even easier) +-- WARNING: when storing binary data in minetest metadata stores, the +-- bytes 0x01-0x03 MUST be avoided or they will break the kvstore +-- format and the item/node's metadata will become corrupt. use the +-- lib.str.meta_{,de}armor functions on the output of pack/unpack to +-- safely store and retrieve data structures from meta storage. local m = { err = { unmarshalled = { exp = 'the bytes passed are not a marshalled data structure'; ADDED lib/objstore.lua Index: lib/objstore.lua ================================================================== --- lib/objstore.lua +++ lib/objstore.lua @@ -0,0 +1,110 @@ +-- marshal provides low-level data marshalling capabilities, but +-- for various reasons it's handy to have a higher-level interface +-- that allows us to register and retrieve data structures from +-- node or item metadata. this library provides that interface. + +-- objstore consists of a single function that returns a structure +-- store. this structure-store should be saved to a variable, and +-- called upon to register or modify attributes. every node or item +-- that contains metadata contains a list of attached structures, +-- which themselves contain a list of attached records. this allows +-- structures to be extended at will without disrupting existing +-- metadata storage. + +-- WARNING: this is likely incompatible with the StorageRef backend, +-- which uses json -- need to figure out how to make the marshalling +-- format compatible + +local lib = sorcery.lib +local m = lib.marshal + +local recpack, recunpack = m.transcoder { + recs = m.g.array(m.g.struct { + id = m.t.str; + data = m.t.blob; + }); +} +return function() { + return { + structs = {}; + register = function(self,id) + local struc = { + id = id; + records = {}; + register_record = function(self,def) + if not records[def.id] then + records[def.id] = def + return true + else + return false + end + end; + _encode = function(self,data) + local obj = {} + for k,v in pairs(records) do + local t = m.transcoder(v.fields) + obj[#obj + 1] = { + id = k; + data = t(data[k]); + } + end + return recpack(obj) + end; + _decode = function(self,str) + end; + _meta = function(self,store) + return { + store = store; + _getall = function(iself) + return self:_decode(lib.str.meta_dearmor(iself.store:get_string('objstore:'..id),true)) + end; + _save = function(iself,obj) + iself.store:set_string('objstore:'..id, lib.str.meta_armor(self:_encode(obj))) + end; + get = function(self,rec) + local recs = recunpack(lib.str.meta_dearmor(self.store:get_string('objstore:'..id),true)) + for _,r in pairs(recs) do + if r.id == rec then + return r + end + end + return nil + end; + merge = function(self,obj) + -- obj should be a table of structure { + -- record_id = { record_field = value; } + -- }, e.g.: + -- sorcery.store.enchantment.merge { + -- spells = { + -- [4] = { id = 'dowse, boost = 15 } + -- } + -- } + local recs = self:_getall() + for rec,flds in pairs(obj) do + for k,v in pairs(flds) do + if not recs[rec] then recs[rec] = {} end + recs[rec][k] = v + end + end + self:_save(recs) + end; + } + end; + item = function(self,stack) + return self:_meta(stack:get_meta()) + end; + node = function(self,pos) + return self:_meta(minetest.get_meta(pos)) + end; + user = function(self,u) + if type(u) == 'string' then + u = minetest.get_player_by_name(u) + end + return self:_meta(u:get_meta()) + end; + } + self.structs[id] = struc; + return struc; + end; + } +} Index: matreg.lua ================================================================== --- matreg.lua +++ matreg.lua @@ -1,11 +1,17 @@ return { lookup = {}; tools = { - 'pick'; 'axe'; 'shovel'; - 'sword'; 'hoe'; + pick = { cost = 3; }; + axe = { cost = 3; }; + shovel = { cost = 1; }; + sword = { cost = 2; }; + hoe = { cost = 2; }; }; armors = { - 'helmet'; 'boots'; 'shield'; - 'chestplate'; 'leggings'; + helmet = { cost = 5 }; + boots = { cost = 4 }; + leggings = { cost = 6 }; + chestplate = { cost = 8 }; + shield = { cost = 7 }; }; } ADDED metallurgy-cold.lua Index: metallurgy-cold.lua ================================================================== --- metallurgy-cold.lua +++ metallurgy-cold.lua @@ -0,0 +1,356 @@ +-- eventually this will need to be a powered node, +-- but for now i'm just overlooking the need for +-- power and making it work for free +local constants = { + mill_refresh = 1; + -- interval at which the mill progress is checked + -- the formspec is updated + + grind_range = 20; + -- maximum difference between the hardness of + -- any two metals in the database + + grind_grace_range = 2; + -- how many levels of hardness a grind head + -- can grind above its own (while taking massive + -- levels of damage) + + grind_grace_penalty = 3; + -- factor by which wear is increased when grinding + -- above your paygrade + + grind_factor = 10; + -- adjusts the amount of time it takes to grind + -- metal into powder + + grind_wear = 2000; + -- amount of damage done to a grind head grinding + -- metal of equal hardness. increased or decreased + -- depending on differential + + grind_torque_factor = 0.1; + -- how many points of hardness translate into how + -- much ley-current needed (per second) + + metal_grindvalue = 4; + -- how many powders an ingot is worth + + default_grindvalue = 1; + -- number of items produced when not otherwise + -- specified + + default_hardness = 1; + -- difficulty to grind an item when not otherwise + -- specified + + metal_grindcost = 1; + -- number of metal items needed to perform a grind +} +local mill_formspec_update = function(pos,pct,stat1,stat2) + -- eventually we'll want to display available + -- energy here, but for now we're just assuming + -- max energy available + + -- local meta = minetest.get_meta(pos) + -- local inv = meta:get_inventory() + -- local torque = 20 + stat1 = stat1 or 'off' + minetest.get_meta(pos):set_string('formspec', string.format([[ + size[8,7.2] + list[context;grinder;2.5,1;1,1;0] + list[context;grinder;4.5,1;1,1;1] + list[context;input;3.5,0.2;1,1] + list[context;output;2,2.2;4,1] + image[3.5,1.2;1,1;gui_furnace_arrow_bg.png^[lowpart:%u%%:gui_furnace_arrow_fg.png^[transformR180] + + image[1.6,1.0;1,1;sorcery_statlamp_%s.png] + image[5.4,1.0;1,1;sorcery_statlamp_%s.png] + + image[2.5,1;1,1;sorcery_mill_grindhead_shade.png] + image[4.5,1;1,1;sorcery_mill_grindhead_shade.png] + + list[current_player;main;0,3.5;8,4] + ]], 100*pct, stat1, stat2 or stat1)) +end +local mill_update = function(pos) + minetest.get_node_timer(pos):start(constants.mill_refresh) +end +local mill_fits_in_slot = function(slot,item) + if slot == 'grinder' then + if minetest.get_item_group(item:get_name(), 'sorcery_mill_grindhead')~=0 + then return 1 end + elseif slot == 'input' then + local metal = sorcery.data.metallookup[item:get_name()] + local mat = sorcery.matreg.lookup[item:get_name()] + local comp = sorcery.data.compat.grindables[item:get_name()] + if metal or mat.metal or comp then + return item:get_count() + else + local mat = item:get_definition()._matprop + if mat and mat.grindvalue then + return item:get_count() + end + end + end + return 0 +end +local matprops = function(item) + local metal = sorcery.data.metallookup[item:get_name()] + if not metal then + -- allow grinding of armor and tools back to their + -- original components + local mat = sorcery.matreg.lookup[item:get_name()] + if mat.metal then + metal = mat + else + return nil + end + end + local mp = item:get_definition()._matprop + or sorcery.data.compat.grindables[item:get_name()] + or {} + + again = true + if metal then mp = { + hardness = metal.data.hardness or mp.hardness or constants.default_hardness; + grindvalue = metal.value or mp.grindvalue or (metal and constants.metal_grindvalue) or constants.default_grindvalue; + powder = metal.data.parts.powder or mp.powder; + grindcost = constants.metal_grindcost or mp.grindcost; -- invariant for metal + } end + + mp.torque = constants.grind_torque_factor * mp.hardness + + if item:get_wear() ~= 0 then + -- prevent cheating by recovering metal from items before they + -- are destroyed + local wearfac = (item:get_wear() / 65535) + mp.grindvalue = math.max(1,math.ceil(mp.grindvalue * wearfac)) + mp.hardness = math.max(1,math.ceil(mp.grindcost * wearfac)) + mp.torque = math.max(1,math.ceil(mp.torque * wearfac)) + end + + return mp +end +minetest.register_node('sorcery:mill',{ + description = 'Mill'; + groups = { + cracky = 2; + sorcery_ley_device = 1; + }; + paramtype2 = 'facedir'; + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size('input',1) + inv:set_size('output',4) + inv:set_size('grinder',2) + meta:set_float('grindtime',0) + meta:set_int('active',0) + mill_formspec_update(pos, 0) + end; + on_metadata_inventory_put = function(pos,listname) + if listname == 'input' then + minetest.get_meta(pos):set_float('grindtime',0) + end + mill_update(pos) + end; + on_metadata_inventory_take = function(pos,listname) + if listname == 'input' then + minetest.get_meta(pos):set_float('grindtime',0) + end + mill_update(pos) + end; + on_metadata_inventory_move = function(pos,fl,fi,tl,ti) + if fl == 'input' or tl == 'input' then + minetest.get_meta(pos):set_float('grindtime',0) + end + mill_update(pos) + end; + _sorcery = { + ley = { mode = 'consume'; affinity = {'praxic'}}; + on_leyconnect = mill_update; + on_leycalc = function(pos,time) + local meta = minetest.get_meta(pos) + local active = meta:get_int('active') == 1 + if not active then return { power = 0; } end + local inv = meta:get_inventory() + local item = inv:get_stack('input',1) + if item:is_empty() then + meta:set_int('active', 0) + return { power = 0; } + end + return { + power = matprops(item).torque * time; + } + end; + }; + on_timer = function(pos,delta) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local elapsed = meta:get_float('grindtime') + delta + local ley = sorcery.ley.netcaps(pos,delta,pos) + local again = false + local active = false + local reqtime -- sigh + local statcolor = 'off' + local grinders_on + if inv:is_empty('input') or inv:is_empty('grinder') then + print('empty') + elapsed = 0 + mill_formspec_update(pos, 0) + else + local item = inv:get_stack('input',1) + local mp = matprops(item) + if mp.grindcost > item:get_count() then + elapsed = 0 + mill_formspec_update(pos, 0) + print('bad grindcost') + goto stop + end + + -- print('power supply',ley.maxpower) + -- print('power available',ley.freepower) + -- print('power needed',mp.torque*delta) + if ley.maxpower < (mp.torque * delta) then + -- not enough potential energy in the system to grind + -- so don't bother + print('not enough power') + statcolor = 'red' + elapsed = 0 goto stop + elseif ley.freepower < (mp.torque * delta) then + -- the net has enough potential energy to supply us, + -- but too much of it is in use right now. give up + -- on this round, but try again in a bit to see if + -- more energy is available + print('currently not enough power') + statcolor = 'yellow' + elapsed = 0 again = true goto stop + end + + local grinders = 0 + local grindpower = 0 + local grind_wear = {} + local grinders_present = false + grinders_on = {false,false} + for i=1,inv:get_size('grinder') do + local gh = inv:get_stack('grinder',i) + if not gh:is_empty() then + grinders_present = true + local hh = sorcery.data.metals[gh:get_definition()._proto.metal].hardness + local dif = mp.hardness - hh + local wear + if dif == 0 then + wear = constants.grind_wear + elseif dif < 0 then + wear = constants.grind_wear * ((dif * -1)/constants.grind_range) + elseif dif > 0 then + if dif > constants.grind_grace_range then + wear = 0 + print('grinder reject') + goto reject + else + wear = constants.grind_wear * (1 + (dif/constants.grind_range)) * constants.grind_grace_penalty + end + end + ::accept:: grinders = grinders + 1 + grindpower = grindpower + hh + grinders_on[i] = true + ::reject:: grind_wear[i] = wear + end + end + if grinders == 0 then + if grinders_present then + statcolor = 'purple' + end + elapsed = 0 + mill_formspec_update(pos, 0) + else + active = true again = true + if grindpower < mp.hardness then + statcolor = 'yellow' + else statcolor='green' end + grindpower = grindpower / grinders + -- if there is more power available than needed, + -- and/or if the blades are stronger than needed, + -- speed up the grind + local speedboost = math.max(0.05,((grindpower - mp.hardness)/constants.grind_range) * grinders) * ((mp.torque * delta) / ley.freepower) + reqtime = mp.grindvalue * mp.hardness * constants.grind_factor * (1-speedboost) + if elapsed >= reqtime then + item:take_item(mp.grindcost) + inv:set_stack('input',1,item) + local pw = ItemStack{ + name=mp.powder; + count=mp.grindvalue; + } + if inv:room_for_item('output',pw) then + inv:add_item('output',pw) + else + minetest.add_item(pos,pw) + end + elapsed = 0 + for i,d in pairs(grind_wear) do + local item = inv:get_stack('grinder',i) + item:add_wear(grind_wear[i]) + inv:set_stack('grinder',i,item) + end + end + end + end + + ::stop:: meta:set_float('grindtime',elapsed) + local sc1, sc2 = 'off','off' + if grinders_on then + sc1 = grinders_on[1] and statcolor or sc1 + sc2 = grinders_on[2] and statcolor or sc2 + else + sc1 = statcolor sc2=sc1 + end + mill_formspec_update(pos, active and (elapsed/reqtime) or 0, sc1,sc2) + meta:set_int('active',active and 1 or 0) + return again + end; + allow_metadata_inventory_put = function(pos,list,idx,stack,user) + return mill_fits_in_slot(list,stack) end; + allow_metadata_inventory_move = function(pos,fromlist,fromidx,tolist,toidx,count,user) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(fromlist,fromidx) + return mill_fits_in_slot(tolist,stack) + end; + tiles = { + 'sorcery_mill_top.png^[transformR90'; + 'sorcery_mill_bottom.png'; + 'sorcery_mill_side.png'; + 'sorcery_mill_side.png'; + 'sorcery_mill_back.png'; + 'sorcery_mill_front.png'; + }; +}) +minetest.register_craft { + output = 'sorcery:mill'; + recipe = { + {'basic_materials:chain_steel','basic_materials:gear_steel','basic_materials:chain_steel'}; + {'basic_materials:gear_steel', 'basic_materials:steel_bar', 'basic_materials:gear_steel'}; + {'default:tin_ingot','default:steelblock','default:tin_ingot'}; + }; +} +for name,metal in pairs(sorcery.data.metals) do + local i,f = metal.parts.ingot, metal.parts.fragment + local id = 'sorcery:mill_grindhead_' .. name + minetest.register_tool(id,{ + description = sorcery.lib.str.capitalize(name) .. ' Grinding Head'; + inventory_image = sorcery.lib.image('sorcery_mill_grindhead.png'):multiply(sorcery.lib.color(metal.tone)):render(); + groups = { sorcery_mill_grindhead = 1 }; + _proto = { + metal = name; + }; + }); + minetest.register_craft { + output = id; + recipe = { + {f,i,f}; + {i,i,i}; + {f,i,f}; + }; + } +end ADDED models/sorcery-condenser.obj Index: models/sorcery-condenser.obj ================================================================== --- models/sorcery-condenser.obj +++ models/sorcery-condenser.obj @@ -0,0 +1,1305 @@ +# Blender v2.82 (sub 7) OBJ File: 'condenser.blend' +# www.blender.org +mtllib sorcery-condenser.mtl +o Cube.011_Cube.013 +v 0.418477 0.868714 -0.028534 +v 0.418477 0.976405 -0.028534 +v 0.418477 0.976405 0.091016 +v 0.418477 0.868714 0.091016 +v 0.298928 0.868714 0.091016 +v 0.298928 0.976405 0.091016 +v 0.298928 0.976405 -0.028534 +v 0.298928 0.868714 -0.028534 +v -0.312736 0.868714 -0.028534 +v -0.312736 0.976405 -0.028534 +v -0.312736 0.976405 0.091016 +v -0.312736 0.868714 0.091016 +v -0.432286 0.868714 0.091016 +v -0.432286 0.976405 0.091016 +v -0.432286 0.976405 -0.028534 +v -0.432286 0.868714 -0.028534 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.049599 +vt 0.000000 0.049599 +vt 0.000000 0.950401 +vt 1.000000 0.950401 +vt 0.000000 0.049599 +vt 1.000000 0.049599 +vt 1.000000 0.950401 +vt 0.000000 0.950401 +vt 1.000000 0.049599 +vt 1.000000 0.950401 +vt 0.000000 0.049599 +vt 0.000000 0.950401 +vt 1.000000 0.049599 +vt 0.000000 0.049599 +vt 0.000000 0.950401 +vt 1.000000 0.950401 +vt 0.000000 0.049599 +vt 1.000000 0.049599 +vt 1.000000 0.950401 +vt 0.000000 0.950401 +vt 1.000000 0.049599 +vt 1.000000 0.950401 +vt 0.000000 0.049599 +vt 0.000000 0.950401 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +g Cube.011_Cube.013_gem.002 +usemtl gem.002 +s off +f 7/1/1 6/2/1 3/3/1 2/4/1 +f 8/5/2 1/6/2 4/7/2 5/8/2 +f 1/9/3 8/10/3 7/11/3 2/12/3 +f 5/13/4 4/14/4 3/15/4 6/16/4 +f 8/17/5 5/13/5 6/16/5 7/18/5 +f 4/19/6 1/9/6 2/12/6 3/20/6 +f 9/21/3 16/22/3 15/23/3 10/24/3 +f 13/25/4 12/26/4 11/27/4 14/28/4 +f 16/29/5 13/25/5 14/28/5 15/30/5 +f 12/31/6 9/21/6 10/24/6 11/32/6 +f 16/33/2 9/34/2 12/35/2 13/36/2 +f 15/37/1 14/38/1 11/39/1 10/40/1 +o Cube.006_Cube.014 +v -0.355575 -0.374496 0.375744 +v -0.355575 0.366792 0.375744 +v -0.355575 -0.374496 -0.365544 +v -0.355575 0.366792 -0.365544 +v 0.385712 -0.374496 0.375744 +v 0.385712 0.366792 0.375744 +v 0.385712 -0.374496 -0.365544 +v 0.385712 0.366792 -0.365544 +v -0.355575 -0.172402 0.375744 +v -0.355575 -0.060035 0.375744 +v -0.355575 0.052332 0.375744 +v -0.355575 0.164699 0.375744 +v -0.355575 0.164699 -0.365544 +v -0.355575 0.052332 -0.365544 +v -0.355575 -0.060035 -0.365544 +v -0.355575 -0.172402 -0.365544 +v 0.385712 0.164699 -0.365544 +v 0.385712 0.052332 -0.365544 +v 0.385712 -0.060035 -0.365544 +v 0.385712 -0.172402 -0.365544 +v 0.385712 0.164699 0.375744 +v 0.385712 0.052332 0.375744 +v 0.385712 -0.060035 0.375744 +v 0.385712 -0.172402 0.375744 +v -0.191901 0.366792 0.212070 +v -0.191901 0.366792 -0.201870 +v 0.222039 0.366792 -0.201870 +v 0.222039 0.366792 0.212070 +v -0.191901 0.455314 0.212070 +v -0.191901 0.455314 -0.201870 +v 0.222039 0.455314 -0.201870 +v 0.222039 0.455314 0.212070 +v -0.143424 0.455314 0.136294 +v -0.143424 0.455314 -0.126094 +v 0.173561 0.455314 -0.126094 +v 0.173561 0.455314 0.136294 +v -0.143424 0.433864 0.136294 +v -0.143424 0.433864 -0.126094 +v 0.173561 0.433864 -0.126094 +v 0.173561 0.433864 0.136294 +vt 0.000000 0.863964 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.863964 +vt 0.000000 0.863964 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.863964 +vt 0.000000 1.000000 +vt 0.000000 0.863964 +vt 1.000000 0.863964 +vt 1.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.500000 +vt -0.000000 0.500000 +vt 0.220797 0.389602 +vt 0.779203 0.389602 +vt 1.000000 0.501014 +vt 1.000000 0.637049 +vt 0.000000 0.637049 +vt 0.000000 0.501014 +vt 1.000000 0.712688 +vt 1.000000 0.788326 +vt 0.000000 0.788326 +vt 0.000000 0.712688 +vt 1.000000 0.501014 +vt 1.000000 0.637049 +vt 0.000000 0.637049 +vt 0.000000 0.501014 +vt 1.000000 0.712688 +vt 1.000000 0.788326 +vt 0.000000 0.788326 +vt 0.000000 0.712688 +vt 0.000000 0.501014 +vt 0.000000 0.637049 +vt 0.000000 0.712688 +vt 0.000000 0.788326 +vt 1.000000 0.637049 +vt 1.000000 0.501014 +vt 1.000000 0.788326 +vt 1.000000 0.712688 +vt 0.625000 0.750000 +vt 0.625000 0.500000 +vt 0.625000 0.500000 +vt 0.625000 0.750000 +vt 1.000000 0.000000 +vt 0.779203 0.110398 +vt -0.000000 0.000000 +vt 0.220797 0.110398 +vt 0.625000 1.000000 +vt 0.625000 0.750000 +vt 0.625000 1.000000 +vt 0.625000 0.250000 +vt 0.625000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.625000 1.000000 +vt 0.625000 0.500000 +vt 0.625000 0.250000 +vt 0.625000 0.250000 +vt 0.625000 0.500000 +vt 0.625000 0.000000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.750000 +vt 0.625000 0.000000 +vt 0.625000 1.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +g Cube.006_Cube.014_conduit.001 +usemtl conduit.001 +s off +f 28/41/7 18/42/7 20/43/7 29/44/7 +f 29/45/8 20/46/8 24/47/8 33/48/8 +f 33/48/9 24/47/9 22/49/9 37/50/9 +f 37/51/10 22/52/10 18/42/10 28/41/10 +f 19/53/11 23/54/11 21/55/11 17/56/11 +f 24/57/12 20/58/12 42/59/12 43/60/12 +f 21/61/10 40/62/10 25/63/10 17/64/10 +f 39/65/10 38/66/10 27/67/10 26/68/10 +f 23/69/9 36/70/9 40/71/9 21/72/9 +f 35/73/9 34/74/9 38/75/9 39/76/9 +f 19/77/8 32/78/8 36/70/8 23/69/8 +f 31/79/8 30/80/8 34/74/8 35/73/8 +f 17/64/7 25/63/7 32/81/7 19/82/7 +f 26/68/7 27/67/7 30/83/7 31/84/7 +f 44/85/9 43/86/9 47/87/9 48/88/9 +f 22/89/12 24/57/12 43/60/12 44/90/12 +f 20/58/12 18/91/12 41/92/12 42/59/12 +f 18/91/12 22/89/12 44/90/12 41/92/12 +f 45/93/12 48/88/12 52/94/12 49/95/12 +f 42/96/7 41/97/7 45/98/7 46/99/7 +f 41/100/10 44/85/10 48/88/10 45/93/10 +f 43/86/8 42/96/8 46/99/8 47/87/8 +f 51/101/10 50/102/10 54/103/10 55/104/10 +f 47/87/12 46/99/12 50/102/12 51/101/12 +f 48/88/12 47/87/12 51/101/12 52/94/12 +f 46/99/12 45/98/12 49/105/12 50/102/12 +f 55/104/12 54/106/12 53/107/12 56/108/12 +f 52/94/7 51/101/7 55/104/7 56/108/7 +f 50/102/9 49/105/9 53/109/9 54/103/9 +f 49/95/8 52/94/8 56/108/8 53/110/8 +f 37/50/11 28/41/11 29/45/11 33/48/11 +f 39/76/11 26/68/11 31/79/11 35/73/11 +f 38/75/12 34/74/12 30/80/12 27/67/12 +f 40/71/12 36/70/12 32/78/12 25/63/12 +o Cube.007_Cube.015 +v -0.355575 -0.172402 0.375744 +v -0.355575 -0.060035 0.375744 +v -0.355575 0.052332 0.375744 +v -0.355575 0.164699 0.375744 +v -0.355575 0.164699 -0.365544 +v -0.355575 0.052332 -0.365544 +v -0.355575 -0.060035 -0.365544 +v -0.355575 -0.172402 -0.365544 +v 0.385712 0.164699 -0.365544 +v 0.385712 0.052332 -0.365544 +v 0.385712 -0.060035 -0.365544 +v 0.385712 -0.172402 -0.365544 +v 0.385712 0.164699 0.375744 +v 0.385712 0.052332 0.375744 +v 0.385712 -0.060035 0.375744 +v 0.385712 -0.172402 0.375744 +v -0.443295 -0.172402 0.425633 +v -0.443295 -0.060035 0.425633 +v -0.443295 0.052332 0.425633 +v -0.443295 0.164699 0.425633 +v -0.443295 0.164699 -0.415433 +v -0.443295 0.052332 -0.415433 +v -0.443295 -0.060035 -0.415433 +v -0.443295 -0.172402 -0.415433 +v 0.473433 0.164699 -0.415433 +v 0.473433 0.052332 -0.415433 +v 0.473433 -0.060035 -0.415433 +v 0.473433 -0.172402 -0.415433 +v 0.473433 0.164699 0.425633 +v 0.473433 0.052332 0.425633 +v 0.473433 -0.060035 0.425633 +v 0.473433 -0.172402 0.425633 +v -0.116462 0.499773 -0.053556 +v 0.116462 0.499773 0.116196 +v 0.116462 0.499773 -0.053556 +v -0.116462 0.499773 0.116196 +v -0.116462 0.433792 -0.053556 +v 0.116462 0.433792 0.116196 +v 0.116462 0.433792 -0.053556 +v -0.116462 0.433792 0.116196 +v -0.071082 0.677987 0.102438 +v -0.071082 0.677987 -0.039956 +v 0.071311 0.677987 0.102438 +v 0.071311 0.677987 -0.039956 +v -0.032865 0.714147 0.064220 +v -0.032865 0.714147 -0.001739 +v 0.033094 0.714147 -0.001739 +v 0.033094 0.714147 0.064220 +v -0.032865 1.130972 0.064220 +v -0.032865 1.130972 -0.001739 +v 0.033094 1.130972 -0.001739 +v 0.033094 1.130972 0.064220 +v 0.033094 0.868714 -0.001739 +v 0.033094 0.976405 -0.001739 +v 0.033094 0.976405 0.064220 +v 0.033094 0.868714 0.064220 +v -0.032865 0.868714 0.064220 +v -0.032865 0.976405 0.064220 +v -0.032865 0.976405 -0.001739 +v -0.032865 0.868714 -0.001739 +v 0.287505 0.677987 0.102438 +v 0.287505 0.677987 -0.039956 +v 0.429899 0.677987 0.102438 +v 0.429899 0.677987 -0.039956 +v 0.325723 0.714147 0.064220 +v 0.325723 0.714147 -0.001739 +v 0.391682 0.714147 -0.001739 +v 0.391682 0.714147 0.064220 +v 0.325723 1.130972 0.064220 +v 0.325723 1.130972 -0.001739 +v 0.391682 1.130972 -0.001739 +v 0.391682 1.130972 0.064220 +v 0.391682 0.868714 -0.001739 +v 0.391682 0.976405 -0.001739 +v 0.391682 0.976405 0.064220 +v 0.391682 0.868714 0.064220 +v 0.325723 0.868714 0.064220 +v 0.325723 0.976405 0.064220 +v 0.325723 0.976405 -0.001739 +v 0.325723 0.868714 -0.001739 +v -0.443708 0.677987 0.102438 +v -0.443708 0.677987 -0.039956 +v -0.301314 0.677987 0.102438 +v -0.301314 0.677987 -0.039956 +v -0.405491 0.714147 0.064220 +v -0.405491 0.714147 -0.001739 +v -0.339532 0.714147 -0.001739 +v -0.339532 0.714147 0.064220 +v -0.405491 1.130972 0.064220 +v -0.405491 1.130972 -0.001739 +v -0.339532 1.130972 -0.001739 +v -0.339532 1.130972 0.064220 +v -0.339532 0.868714 -0.001739 +v -0.339532 0.976405 -0.001739 +v -0.339532 0.976405 0.064220 +v -0.339532 0.868714 0.064220 +v -0.405491 0.868714 0.064220 +v -0.405491 0.976405 0.064220 +v -0.405491 0.976405 -0.001739 +v -0.405491 0.868714 -0.001739 +vt 0.095689 0.904311 +vt 0.095689 0.095689 +vt 0.000000 0.041267 +vt 0.000000 0.958733 +vt 0.904311 0.095689 +vt 0.904311 0.904311 +vt 1.000000 0.958733 +vt 1.000000 0.041267 +vt 0.095689 0.095689 +vt 0.095689 0.904311 +vt 0.000000 0.958733 +vt 0.000000 0.041267 +vt 0.904311 0.904311 +vt 0.904311 0.095689 +vt 1.000000 0.041267 +vt 1.000000 0.958733 +vt 0.095689 0.904311 +vt 0.095689 0.095689 +vt 0.000000 0.041267 +vt 0.000000 0.958733 +vt 0.904311 0.095689 +vt 0.904311 0.904311 +vt 1.000000 0.958733 +vt 1.000000 0.041267 +vt 0.095689 0.904311 +vt 0.904311 0.904311 +vt 1.000000 0.958733 +vt 0.000000 0.958733 +vt 0.904311 0.095689 +vt 0.095689 0.095689 +vt 0.000000 0.041267 +vt 1.000000 0.041267 +vt 1.000000 0.316139 +vt 1.000000 0.438713 +vt 0.000000 0.438713 +vt 0.000000 0.316139 +vt 1.000000 0.561287 +vt 1.000000 0.683861 +vt 0.000000 0.683861 +vt 0.000000 0.561287 +vt 0.958733 0.316139 +vt 0.958733 0.438713 +vt 0.041267 0.438713 +vt 0.041267 0.316139 +vt 0.958733 0.561287 +vt 0.958733 0.683861 +vt 0.041267 0.683861 +vt 0.041267 0.561287 +vt 0.000000 0.316139 +vt 0.000000 0.438713 +vt 1.000000 0.438713 +vt 1.000000 0.316139 +vt 0.000000 0.561287 +vt 0.000000 0.683861 +vt 1.000000 0.683861 +vt 1.000000 0.561287 +vt 0.041267 0.316139 +vt 0.041267 0.438713 +vt 0.958733 0.438713 +vt 0.958733 0.316139 +vt 0.041267 0.561287 +vt 0.041267 0.683861 +vt 0.958733 0.683861 +vt 0.958733 0.561287 +vt 0.273833 0.216173 +vt 0.273833 0.783827 +vt 0.726167 0.783827 +vt 0.726167 0.216173 +vt 0.189666 0.216173 +vt 0.189666 0.783827 +vt 0.810334 0.783827 +vt 0.810334 0.216173 +vt 0.810334 0.216174 +vt 0.810334 0.783827 +vt 0.189666 0.783827 +vt 0.189666 0.216173 +vt 0.726167 0.216173 +vt 0.726167 0.783827 +vt 0.273833 0.783827 +vt 0.273833 0.216174 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.750000 +vt 0.125000 0.750000 +vt 0.420879 0.573624 +vt 0.579121 0.573624 +vt 0.579121 0.944444 +vt 0.420879 0.944444 +vt 0.579121 0.579121 +vt 0.420879 0.579121 +vt 0.420879 0.420879 +vt 0.579121 0.420879 +vt 0.579121 0.573624 +vt 0.420879 0.573624 +vt 0.420879 0.944444 +vt 0.579121 0.944444 +vt 0.579121 0.573624 +vt 0.579121 0.944444 +vt 0.420879 0.573624 +vt 0.420879 0.944444 +vt 0.579121 -0.055555 +vt 0.420879 -0.055555 +vt 0.420879 0.315265 +vt 0.579121 0.315265 +vt 0.420879 -0.055555 +vt 0.579121 -0.055555 +vt 0.579121 0.315265 +vt 0.420879 0.315265 +vt 0.579121 -0.055555 +vt 0.579121 0.315265 +vt 0.420879 -0.055555 +vt 0.420879 0.315265 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.750000 +vt 0.125000 0.750000 +vt 0.420879 0.573624 +vt 0.579121 0.573624 +vt 0.579121 0.944444 +vt 0.420879 0.944444 +vt 0.579121 0.579121 +vt 0.420879 0.579121 +vt 0.420879 0.420879 +vt 0.579121 0.420879 +vt 0.579121 0.573624 +vt 0.420879 0.573624 +vt 0.420879 0.944444 +vt 0.579121 0.944444 +vt 0.579121 0.573624 +vt 0.579121 0.944444 +vt 0.420879 0.573624 +vt 0.420879 0.944444 +vt 0.579121 -0.055555 +vt 0.420879 -0.055555 +vt 0.420879 0.315265 +vt 0.579121 0.315265 +vt 0.420879 -0.055555 +vt 0.579121 -0.055555 +vt 0.579121 0.315265 +vt 0.420879 0.315265 +vt 0.579121 -0.055555 +vt 0.579121 0.315265 +vt 0.420879 -0.055555 +vt 0.420879 0.315265 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.375000 0.750000 +vt 0.125000 0.750000 +vt 0.420879 0.573624 +vt 0.579121 0.573624 +vt 0.579121 0.944444 +vt 0.420879 0.944444 +vt 0.579121 0.579121 +vt 0.420879 0.579121 +vt 0.420879 0.420879 +vt 0.579121 0.420879 +vt 0.579121 0.573624 +vt 0.420879 0.573624 +vt 0.420879 0.944444 +vt 0.579121 0.944444 +vt 0.579121 0.573624 +vt 0.579121 0.944444 +vt 0.420879 0.573624 +vt 0.420879 0.944444 +vt 0.579121 -0.055555 +vt 0.420879 -0.055555 +vt 0.420879 0.315265 +vt 0.579121 0.315265 +vt 0.420879 -0.055555 +vt 0.579121 -0.055555 +vt 0.579121 0.315265 +vt 0.420879 0.315265 +vt 0.579121 -0.055555 +vt 0.579121 0.315265 +vt 0.420879 -0.055555 +vt 0.420879 0.315265 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -0.4058 -0.9140 +g Cube.007_Cube.015_tin.001 +usemtl tin.001 +s off +f 62/111/13 59/112/13 75/113/13 78/114/13 +f 70/115/13 66/116/13 82/117/13 86/118/13 +f 58/119/14 63/120/14 79/121/14 74/122/14 +f 67/123/14 71/124/14 87/125/14 83/126/14 +f 64/127/13 57/128/13 73/129/13 80/130/13 +f 72/131/13 68/132/13 84/133/13 88/134/13 +f 61/135/14 65/136/14 81/137/14 77/138/14 +f 69/139/14 60/140/14 76/141/14 85/142/14 +f 88/143/15 87/144/15 74/145/15 73/146/15 +f 86/147/15 85/148/15 76/149/15 75/150/15 +f 84/151/16 83/152/16 87/153/16 88/154/16 +f 82/155/16 81/156/16 85/157/16 86/158/16 +f 80/159/17 79/160/17 83/161/17 84/162/17 +f 78/163/17 77/164/17 81/165/17 82/166/17 +f 73/167/18 74/168/18 79/169/18 80/170/18 +f 75/171/18 76/172/18 77/173/18 78/174/18 +f 65/136/14 69/139/14 85/142/14 81/137/14 +f 57/128/13 72/131/13 88/134/13 73/129/13 +f 60/140/14 61/135/14 77/138/14 76/141/14 +f 68/132/13 64/127/13 80/130/13 84/133/13 +f 71/124/14 58/119/14 74/122/14 87/125/14 +f 63/120/14 67/123/14 83/126/14 79/121/14 +f 59/112/13 70/115/13 86/118/13 75/113/13 +f 66/116/13 62/111/13 78/114/13 82/117/13 +f 96/175/18 92/176/18 89/177/18 93/178/18 +f 93/179/17 89/180/17 91/181/17 95/182/17 +f 94/183/15 90/184/15 92/185/15 96/186/15 +f 95/187/16 91/188/16 90/189/16 94/190/16 +f 95/182/13 94/183/13 96/175/13 93/179/13 +f 98/191/13 100/192/13 99/193/13 97/194/13 +f 111/195/16 110/196/16 107/197/16 108/198/16 +f 107/199/14 106/200/14 105/201/14 108/202/14 +f 115/203/18 114/204/18 105/205/18 106/206/18 +f 114/204/15 111/207/15 108/208/15 105/205/15 +f 110/196/17 115/209/17 106/210/17 107/197/17 +f 103/211/17 102/212/17 116/213/17 109/214/17 +f 101/215/15 104/216/15 112/217/15 113/218/15 +f 102/219/18 101/215/18 113/218/18 116/220/18 +f 104/221/16 103/211/16 109/214/16 112/222/16 +f 118/223/13 120/224/13 119/225/13 117/226/13 +f 131/227/16 130/228/16 127/229/16 128/230/16 +f 127/231/14 126/232/14 125/233/14 128/234/14 +f 135/235/18 134/236/18 125/237/18 126/238/18 +f 134/236/15 131/239/15 128/240/15 125/237/15 +f 130/228/17 135/241/17 126/242/17 127/229/17 +f 123/243/17 122/244/17 136/245/17 129/246/17 +f 121/247/15 124/248/15 132/249/15 133/250/15 +f 122/251/18 121/247/18 133/250/18 136/252/18 +f 124/253/16 123/243/16 129/246/16 132/254/16 +f 138/255/13 140/256/13 139/257/13 137/258/13 +f 151/259/16 150/260/16 147/261/16 148/262/16 +f 147/263/14 146/264/14 145/265/14 148/266/14 +f 155/267/18 154/268/18 145/269/18 146/270/18 +f 154/268/15 151/271/15 148/272/15 145/269/15 +f 150/260/17 155/273/17 146/274/17 147/261/17 +f 143/275/17 142/276/17 156/277/17 149/278/17 +f 141/279/15 144/280/15 152/281/15 153/282/15 +f 142/283/18 141/279/18 153/282/18 156/284/18 +f 144/285/16 143/275/16 149/278/16 152/286/16 +f 70/115/18 69/139/18 65/136/18 66/116/18 +f 66/116/15 65/136/15 61/135/15 62/111/15 +f 62/111/16 61/135/16 60/140/16 59/112/16 +f 64/127/16 63/120/16 58/119/16 57/128/16 +f 68/132/15 67/123/15 63/120/15 64/127/15 +f 72/131/18 71/124/18 67/123/18 68/132/18 +f 88/143/19 73/146/19 58/119/19 71/124/19 +f 57/128/17 58/119/17 71/124/17 72/131/17 +f 59/112/17 60/140/17 69/139/17 70/115/17 +f 101/215/13 102/212/13 103/211/13 104/216/13 +f 121/247/13 122/244/13 123/243/13 124/248/13 +f 141/279/13 142/276/13 143/275/13 144/280/13 +f 136/252/14 133/250/14 132/249/14 129/246/14 +f 116/220/14 113/218/14 112/217/14 109/214/14 +f 156/284/14 153/282/14 152/281/14 149/278/14 +f 155/267/13 150/260/13 151/271/13 154/268/13 +f 115/203/13 110/196/13 111/207/13 114/204/13 +f 135/235/13 130/228/13 131/239/13 134/236/13 +f 92/185/14 90/184/14 91/188/14 89/180/14 +o Cube.008_Cube.016 +v -0.501270 0.679368 -0.120365 +v 0.501270 0.679368 -0.120365 +v -0.501270 0.679368 0.183006 +v 0.501270 0.679368 0.183006 +v -0.501270 0.499773 -0.120365 +v 0.501270 0.499773 0.183006 +v 0.501270 0.499773 -0.120365 +v -0.501270 0.499773 0.183006 +vt 0.000000 0.728785 +vt 0.000000 0.271215 +vt 1.000000 0.271215 +vt 1.000000 0.728785 +vt 0.728785 0.425711 +vt 0.728785 0.648579 +vt 0.271215 0.648579 +vt 0.271215 0.425711 +vt 1.000000 0.425711 +vt 1.000000 0.648579 +vt 0.000000 0.648579 +vt 0.000000 0.425711 +vt 0.000000 0.425711 +vt 0.000000 0.648579 +vt 1.000000 0.648579 +vt 1.000000 0.425711 +vt 0.271215 0.425711 +vt 0.271215 0.648579 +vt 0.728785 0.648579 +vt 0.728785 0.425711 +vt -0.015031 0.322545 +vt -0.015031 0.625147 +vt 0.984969 0.625147 +vt 0.984969 0.322545 +vn 0.0000 1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +g Cube.008_Cube.016_stone.001 +usemtl stone.001 +s off +f 157/287/20 159/288/20 160/289/20 158/290/20 +f 163/291/21 158/292/21 160/293/21 162/294/21 +f 162/295/22 160/296/22 159/297/22 164/298/22 +f 161/299/23 157/300/23 158/301/23 163/302/23 +f 164/303/24 159/304/24 157/305/24 161/306/24 +f 164/307/25 161/308/25 163/309/25 162/310/25 +o Cube.009_Cube.017 +v -0.071082 0.677987 0.102438 +v -0.071082 0.714147 0.102438 +v -0.071082 0.677987 -0.039956 +v -0.071082 0.714147 -0.039956 +v 0.071311 0.677987 0.102438 +v 0.071311 0.714147 0.102438 +v 0.071311 0.677987 -0.039956 +v 0.071311 0.714147 -0.039956 +v -0.032865 0.714147 0.064220 +v -0.032865 0.714147 -0.001739 +v 0.033094 0.714147 -0.001739 +v 0.033094 0.714147 0.064220 +v 0.287505 0.677987 0.102438 +v 0.287505 0.714147 0.102438 +v 0.287505 0.677987 -0.039956 +v 0.287505 0.714147 -0.039956 +v 0.429899 0.677987 0.102438 +v 0.429899 0.714147 0.102438 +v 0.429899 0.677987 -0.039956 +v 0.429899 0.714147 -0.039956 +v 0.325723 0.714147 0.064220 +v 0.325723 0.714147 -0.001739 +v 0.391682 0.714147 -0.001739 +v 0.391682 0.714147 0.064220 +v -0.443708 0.677987 0.102438 +v -0.443708 0.714147 0.102438 +v -0.443708 0.677987 -0.039956 +v -0.443708 0.714147 -0.039956 +v -0.301314 0.677987 0.102438 +v -0.301314 0.714147 0.102438 +v -0.301314 0.677987 -0.039956 +v -0.301314 0.714147 -0.039956 +v -0.405491 0.714147 0.064220 +v -0.405491 0.714147 -0.001739 +v -0.339532 0.714147 -0.001739 +v -0.339532 0.714147 0.064220 +v -0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.353656 -0.500000 -0.353656 +v 0.353656 -0.500000 0.353656 +v -0.353656 -0.500000 0.353656 +v -0.353656 -0.500000 -0.353656 +v 0.353656 0.500000 -0.353656 +v -0.353656 0.500000 -0.353656 +v -0.353656 0.500000 0.353656 +v 0.353656 0.500000 0.353656 +v 0.500000 -0.353656 -0.353656 +v 0.500000 0.353656 -0.353656 +v 0.500000 0.353656 0.353656 +v 0.500000 -0.353656 0.353656 +v 0.353656 -0.353656 0.500000 +v 0.353656 0.353656 0.500000 +v -0.353656 0.353656 0.500000 +v -0.353656 -0.353656 0.500000 +v -0.353656 -0.353656 -0.500000 +v -0.353656 0.353656 -0.500000 +v 0.353656 0.353656 -0.500000 +v 0.353656 -0.353656 -0.500000 +v -0.500000 -0.353656 0.353656 +v -0.500000 0.353656 0.353656 +v -0.500000 0.353656 -0.353656 +v -0.500000 -0.353656 -0.353656 +v 0.353656 -0.390500 0.353656 +v 0.353656 -0.390500 -0.353656 +v -0.353656 -0.390500 0.353656 +v -0.353656 -0.390500 -0.353656 +v -0.353656 0.390500 -0.353656 +v 0.353656 0.390500 -0.353656 +v -0.353656 0.390500 0.353656 +v 0.353656 0.390500 0.353656 +v 0.390500 0.353656 -0.353656 +v 0.390500 -0.353656 -0.353656 +v 0.390500 0.353656 0.353656 +v 0.390500 -0.353656 0.353656 +v 0.353656 0.353656 0.390500 +v 0.353656 -0.353656 0.390500 +v -0.353656 0.353656 0.390500 +v -0.353656 -0.353656 0.390500 +v -0.353656 0.353656 -0.390500 +v -0.353656 -0.353656 -0.390500 +v 0.353656 0.353656 -0.390500 +v 0.353656 -0.353656 -0.390500 +v -0.390500 0.353656 0.353656 +v -0.390500 -0.353656 0.353656 +v -0.390500 0.353656 -0.353656 +v -0.390500 -0.353656 -0.353656 +v 0.500000 0.170486 0.500000 +v -0.500000 0.170486 0.500000 +v -0.353656 0.170486 0.500000 +v -0.500000 0.170486 -0.500000 +v -0.500000 0.170486 -0.353656 +v 0.353656 0.170486 0.390500 +v 0.353656 0.170486 0.500000 +v -0.353656 0.170486 0.390500 +v -0.390500 0.170486 -0.353656 +v -0.390500 0.170486 0.353656 +v -0.500000 0.170486 0.353656 +v 0.500000 0.170486 0.353656 +v 0.500000 0.170486 -0.500000 +v 0.353656 0.170486 -0.500000 +v -0.353656 0.170486 -0.500000 +v 0.500000 0.170486 -0.353656 +v 0.390500 0.170486 0.353656 +v -0.353656 0.170486 -0.390500 +v 0.353656 0.170486 -0.390500 +v 0.390500 0.170486 -0.353656 +v 0.500000 -0.170486 0.500000 +v 0.500000 -0.170486 0.353656 +v -0.500000 -0.170486 0.500000 +v -0.353656 -0.170486 0.500000 +v 0.500000 -0.170486 -0.500000 +v 0.500000 -0.170486 -0.353656 +v 0.353656 -0.170486 0.390500 +v 0.390500 -0.170486 0.353656 +v 0.353656 -0.170486 0.500000 +v -0.353656 -0.170486 0.390500 +v 0.390500 -0.170486 -0.353656 +v 0.353656 -0.170486 -0.500000 +v -0.500000 -0.170486 -0.500000 +v -0.500000 -0.170486 -0.353656 +v -0.353656 -0.170486 -0.500000 +v -0.353656 -0.170486 -0.390500 +v 0.353656 -0.170486 -0.390500 +v -0.390500 -0.170486 -0.353656 +v -0.390500 -0.170486 0.353656 +v -0.500000 -0.170486 0.353656 +vt 0.000000 0.309540 +vt 0.000000 0.563487 +vt 1.000000 0.563487 +vt 1.000000 0.309540 +vt 0.000000 0.309540 +vt 0.000000 0.563487 +vt 1.000000 0.563487 +vt 1.000000 0.309540 +vt 0.000000 0.563487 +vt 0.000000 0.309540 +vt 1.000000 0.309540 +vt 1.000000 0.563487 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.268392 0.731608 +vt 0.731608 0.731608 +vt 1.000000 0.000000 +vt 0.731608 0.268392 +vt 0.000000 0.000000 +vt 0.268392 0.268392 +vt 0.000000 0.309540 +vt 0.000000 0.563487 +vt 1.000000 0.563487 +vt 1.000000 0.309540 +vt 0.000000 0.309540 +vt 0.000000 0.563487 +vt 1.000000 0.563487 +vt 1.000000 0.309540 +vt 0.000000 0.563487 +vt 0.000000 0.309540 +vt 1.000000 0.309540 +vt 1.000000 0.563487 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.268392 0.731608 +vt 0.731608 0.731608 +vt 1.000000 0.000000 +vt 0.731608 0.268392 +vt 0.000000 0.000000 +vt 0.268392 0.268392 +vt 0.000000 0.309540 +vt 0.000000 0.563487 +vt 1.000000 0.563487 +vt 1.000000 0.309540 +vt 0.000000 0.309540 +vt 0.000000 0.563487 +vt 1.000000 0.563487 +vt 1.000000 0.309540 +vt 0.000000 0.563487 +vt 0.000000 0.309540 +vt 1.000000 0.309540 +vt 1.000000 0.563487 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.268392 0.731608 +vt 0.731608 0.731608 +vt 1.000000 0.000000 +vt 0.731608 0.268392 +vt 0.000000 0.000000 +vt 0.268392 0.268392 +vt 0.041250 0.853656 +vt 0.041250 0.670486 +vt 0.141716 0.670486 +vt 0.141716 0.853656 +vt 0.958750 0.041250 +vt 0.824480 0.175520 +vt 0.824480 0.824480 +vt 0.958750 0.958750 +vt 0.041250 0.041250 +vt 0.175520 0.175520 +vt 0.041250 0.958750 +vt 0.175520 0.824480 +vt 0.175520 1.000000 +vt 0.824480 1.000000 +vt 0.824480 0.890500 +vt 0.175520 0.890500 +vt 0.041250 0.958750 +vt 0.175520 0.824480 +vt 0.824480 0.824480 +vt 0.958750 0.958750 +vt 0.041250 0.041250 +vt 0.175520 0.175520 +vt 0.958750 0.041250 +vt 0.824480 0.175520 +vt 0.175520 0.958750 +vt 0.824480 0.958750 +vt 0.824480 0.858284 +vt 0.175520 0.858284 +vt 0.958750 1.000000 +vt 0.824480 0.853656 +vt 0.824480 0.670486 +vt 0.958750 0.670486 +vt 0.041250 1.000000 +vt 0.175520 0.853656 +vt 0.041250 0.000000 +vt 0.175520 0.146344 +vt 0.175520 0.329514 +vt 0.041250 0.329514 +vt 0.958750 0.000000 +vt 0.824480 0.146344 +vt 0.958750 0.853656 +vt 0.958750 0.670486 +vt 0.858284 0.670486 +vt 0.858284 0.853656 +vt 0.958750 1.000000 +vt 0.824480 0.853656 +vt 0.824480 0.670486 +vt 0.958750 0.670486 +vt 0.041250 1.000000 +vt 0.175520 0.853656 +vt 0.041250 0.000000 +vt 0.175520 0.146344 +vt 0.175520 0.329514 +vt 0.041250 0.329514 +vt 0.958750 0.000000 +vt 0.824480 0.146344 +vt 0.175520 0.000000 +vt 0.824480 0.000000 +vt 0.824480 0.109500 +vt 0.175520 0.109500 +vt 0.041250 1.000000 +vt 0.175520 0.853656 +vt 0.175520 0.670486 +vt 0.041250 0.670486 +vt 0.824480 0.853656 +vt 0.824480 0.146344 +vt 0.824480 0.329514 +vt 0.958750 0.329514 +vt 0.041250 0.000000 +vt 0.175520 0.146344 +vt 0.041250 0.146344 +vt 0.041250 0.329514 +vt 0.141716 0.329514 +vt 0.141716 0.146344 +vt 0.175520 0.853656 +vt 0.175520 0.670486 +vt 0.041250 0.670486 +vt 0.958750 1.000000 +vt 0.824480 0.853656 +vt 0.958750 0.000000 +vt 0.824480 0.146344 +vt 0.824480 0.329514 +vt 0.958750 0.329514 +vt 0.175520 0.146344 +vt 0.824480 0.109500 +vt 0.824480 0.146344 +vt 0.175520 0.146344 +vt 0.175520 0.109500 +vt 0.175520 0.146344 +vt 0.824480 0.890500 +vt 0.824480 0.853656 +vt 0.175520 0.853656 +vt 0.175520 0.890500 +vt 0.175520 0.853656 +vt 0.824480 0.853656 +vt 0.824480 0.890500 +vt 0.175520 0.329514 +vt 0.141716 0.853656 +vt 0.041250 0.175520 +vt 0.041250 0.824480 +vt 0.141716 0.824480 +vt 0.141716 0.175520 +vt 0.958750 0.175520 +vt 0.958750 0.824480 +vt 0.858284 0.824480 +vt 0.858284 0.175520 +vt 0.958750 0.853656 +vt 0.958750 0.670486 +vt 0.858284 0.670486 +vt 0.858284 0.853656 +vt 0.175520 0.041250 +vt 0.824480 0.041250 +vt 0.824480 0.141716 +vt 0.175520 0.141716 +vt 0.041250 0.853656 +vt 0.041250 0.670486 +vt 0.141716 0.670486 +vt 0.141716 0.853656 +vt 0.824480 0.958750 +vt 0.175520 0.958750 +vt 0.175520 0.858284 +vt 0.824480 0.858284 +vt 0.041250 0.824480 +vt 0.041250 0.175520 +vt 0.141716 0.175520 +vt 0.141716 0.824480 +vt 0.175520 0.000000 +vt 0.175520 0.109500 +vt 0.175520 1.000000 +vt 0.175520 0.890500 +vt 0.824480 0.000000 +vt 0.175520 0.000000 +vt 0.824480 0.109500 +vt 0.958750 0.146344 +vt 0.958750 0.329514 +vt 0.858284 0.329514 +vt 0.858284 0.146344 +vt 0.824480 1.000000 +vt 0.175520 1.000000 +vt 0.041250 0.146344 +vt 0.041250 0.329514 +vt 0.141716 0.329514 +vt 0.141716 0.146344 +vt 0.824480 0.000000 +vt 0.958750 0.824480 +vt 0.958750 0.175520 +vt 0.858284 0.175520 +vt 0.858284 0.824480 +vt 0.958750 0.146344 +vt 0.958750 0.329514 +vt 0.858284 0.329514 +vt 0.858284 0.146344 +vt 0.824480 1.000000 +vt 0.824480 0.041250 +vt 0.175520 0.041250 +vt 0.175520 0.141716 +vt 0.824480 0.141716 +vt 0.824480 0.146344 +vt 0.175520 0.146344 +vt 0.141716 0.146344 +vt 0.824480 0.146344 +vt 0.175520 0.853656 +vt 0.175520 0.670486 +vt 0.824480 0.853656 +vt 0.858284 0.853656 +vt 0.824480 0.853656 +vt 0.175520 0.853656 +vt 0.824480 0.670486 +vt 0.858284 0.670486 +vt 0.175520 0.146344 +vt 0.824480 0.146344 +vt 0.858284 0.146344 +vt 0.824480 0.329514 +vt 0.858284 0.329514 +vt 0.141716 0.329514 +vt 0.041250 0.329514 +vt 0.041250 0.146344 +vt 0.141716 0.146344 +vt 0.826869 0.733677 +vt 0.858677 0.733677 +vt 0.858677 0.701869 +vt 0.834877 0.701869 +vt 0.826869 0.709877 +vt 0.673131 0.733677 +vt 0.673131 0.709877 +vt 0.665123 0.701869 +vt 0.641323 0.701869 +vt 0.641323 0.733677 +vt 0.673131 0.516323 +vt 0.641323 0.516323 +vt 0.641323 0.548131 +vt 0.665123 0.548131 +vt 0.673131 0.540123 +vt 0.826869 0.516323 +vt 0.826869 0.540123 +vt 0.834877 0.548131 +vt 0.858677 0.548131 +vt 0.858677 0.516323 +vt 0.824480 0.670486 +vt 0.175520 0.670486 +vt 0.824480 0.329514 +vt 0.041250 0.329514 +vt 0.175520 0.329514 +vt 0.175520 0.670486 +vt 0.141716 0.670486 +vt 0.824480 0.670486 +vt 0.824480 0.329514 +vt 0.141716 0.670486 +vt 0.041250 0.670486 +vt 0.041250 0.853656 +vt 0.141716 0.853656 +vt 0.958750 0.329514 +vt 0.824480 0.329514 +vt 0.041250 0.670486 +vt 0.175520 0.670486 +vt 0.958750 0.670486 +vt 0.824480 0.670486 +vt 0.858284 0.670486 +vt 0.958750 0.670486 +vt 0.958750 0.853656 +vt 0.858284 0.853656 +vt 0.958750 0.329514 +vt 0.958750 0.146344 +vt 0.175520 0.329514 +vt 0.141716 0.329514 +vt 0.041250 0.329514 +vt 0.041250 0.146344 +vt 0.858284 0.329514 +vt 0.958750 0.329514 +vt 0.958750 0.146344 +vt 0.858284 0.146344 +vt 0.041250 0.670486 +vt 0.041250 0.853656 +vt 0.141323 0.516323 +vt 0.141323 0.548131 +vt 0.165123 0.548131 +vt 0.173131 0.540123 +vt 0.173131 0.516323 +vt 0.358677 0.733677 +vt 0.358677 0.701869 +vt 0.334877 0.701869 +vt 0.326869 0.709877 +vt 0.326869 0.733677 +vt 0.173131 0.709877 +vt 0.165123 0.701869 +vt 0.141323 0.701869 +vt 0.141323 0.733677 +vt 0.173131 0.733677 +vt 0.358677 0.548131 +vt 0.358677 0.516323 +vt 0.326869 0.516323 +vt 0.326869 0.540123 +vt 0.334877 0.548131 +vt 0.958750 0.670486 +vt 0.958750 0.853656 +vt 0.175520 0.329514 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn -0.0000 -1.0000 0.0000 +vn 0.7071 0.7071 0.0000 +vn 0.5774 0.5774 -0.5773 +vn 0.0000 -0.7071 -0.7071 +vn 0.7071 -0.7071 0.0000 +vn 0.7071 0.0000 -0.7071 +vn -0.5774 0.5774 0.5773 +vn -0.0000 0.7071 -0.7071 +vn 0.5774 0.5774 0.5773 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.0000 0.7071 +vn 0.5774 -0.5774 0.5773 +vn 0.0000 -0.7071 0.7071 +vn -0.5774 -0.5774 0.5773 +vn -0.7071 -0.7071 0.0000 +vn -0.7071 0.0000 0.7071 +vn -0.7071 0.7071 -0.0000 +vn -0.5774 -0.5774 -0.5773 +vn -0.7071 0.0000 -0.7071 +vn -0.5774 0.5774 -0.5773 +vn 0.0000 -0.7264 -0.6873 +vn 0.6873 -0.7264 0.0000 +vn 0.0000 -0.7264 0.6873 +vn -0.6873 -0.7264 0.0000 +g Cube.009_Cube.017_copper.001 +usemtl copper.001 +s off +f 165/311/26 166/312/26 168/313/26 167/314/26 +f 167/315/27 168/316/27 172/317/27 171/318/27 +f 171/318/28 172/317/28 170/319/28 169/320/28 +f 169/321/29 170/322/29 166/312/29 165/311/29 +f 172/323/30 168/324/30 174/325/30 175/326/30 +f 170/327/30 172/323/30 175/326/30 176/328/30 +f 168/324/30 166/329/30 173/330/30 174/325/30 +f 166/329/30 170/327/30 176/328/30 173/330/30 +f 177/331/26 178/332/26 180/333/26 179/334/26 +f 179/335/27 180/336/27 184/337/27 183/338/27 +f 183/338/28 184/337/28 182/339/28 181/340/28 +f 181/341/29 182/342/29 178/332/29 177/331/29 +f 184/343/30 180/344/30 186/345/30 187/346/30 +f 182/347/30 184/343/30 187/346/30 188/348/30 +f 180/344/30 178/349/30 185/350/30 186/345/30 +f 178/349/30 182/347/30 188/348/30 185/350/30 +f 189/351/26 190/352/26 192/353/26 191/354/26 +f 191/355/27 192/356/27 196/357/27 195/358/27 +f 195/358/28 196/357/28 194/359/28 193/360/28 +f 193/361/29 194/362/29 190/352/29 189/351/29 +f 196/363/30 192/364/30 198/365/30 199/366/30 +f 194/367/30 196/363/30 199/366/30 200/368/30 +f 192/364/30 190/369/30 197/370/30 198/365/30 +f 190/369/30 194/367/30 200/368/30 197/370/30 +f 223/371/28 259/372/28 264/373/28 247/374/28 +f 203/375/31 210/376/31 209/377/31 206/378/31 +f 208/379/31 211/380/31 210/376/31 203/375/31 +f 202/381/31 212/382/31 211/380/31 208/379/31 +f 206/378/31 209/377/31 212/382/31 202/381/31 +f 216/383/26 213/384/26 238/385/26 240/386/26 +f 201/387/30 214/388/30 213/389/30 205/390/30 +f 207/391/30 215/392/30 214/388/30 201/387/30 +f 204/393/30 216/394/30 215/392/30 207/391/30 +f 205/390/30 213/389/30 216/394/30 204/393/30 +f 226/395/31 227/396/31 251/397/31 249/398/31 +f 205/399/28 218/400/28 272/401/28 269/402/28 +f 204/403/28 219/404/28 218/400/28 205/399/28 +f 203/405/28 220/406/28 278/407/28 277/408/28 +f 206/409/28 217/410/28 220/406/28 203/405/28 +f 219/411/27 268/412/27 273/413/27 243/414/27 +f 204/415/29 222/416/29 263/417/29 257/418/29 +f 207/419/29 223/420/29 222/416/29 204/415/29 +f 208/421/29 224/422/29 280/423/29 279/424/29 +f 203/425/29 221/426/29 224/422/29 208/421/29 +f 212/427/29 209/428/29 234/429/29 236/430/29 +f 201/431/27 226/432/27 271/433/27 260/434/27 +f 205/399/27 227/435/27 226/432/27 201/431/27 +f 206/409/27 228/436/27 288/437/27 281/438/27 +f 202/439/27 225/440/27 228/436/27 206/409/27 +f 229/441/27 296/442/27 295/443/27 254/444/27 +f 207/419/26 230/445/26 267/446/26 258/447/26 +f 201/448/26 231/449/26 230/445/26 207/419/26 +f 202/450/26 232/451/26 290/452/26 289/453/26 +f 208/421/26 229/454/26 232/451/26 202/450/26 +f 236/455/32 256/456/32 254/457/32 235/458/32 +f 248/459/33 235/458/33 254/444/33 +f 240/460/34 245/461/34 247/462/34 239/463/34 +f 239/463/35 253/464/35 255/465/35 237/466/35 +f 248/459/36 254/444/36 295/443/36 286/467/36 +f 247/462/37 239/463/37 253/468/37 +f 230/469/31 231/470/31 255/471/31 253/472/31 +f 220/473/30 217/474/30 242/475/30 244/476/30 +f 227/477/26 270/478/26 275/479/26 251/480/26 +f 224/481/30 221/482/30 246/483/30 248/484/30 +f 231/485/29 261/486/29 265/487/29 255/488/29 +f 228/489/30 225/490/30 250/491/30 252/492/30 +f 232/493/30 229/494/30 254/495/30 256/496/30 +f 209/428/26 210/497/26 233/498/26 234/429/26 +f 213/384/29 214/499/29 237/500/29 238/385/29 +f 210/501/27 211/502/27 235/458/27 233/503/27 +f 217/504/29 282/505/29 287/506/29 242/507/29 +f 214/508/28 215/509/28 239/463/28 237/466/28 +f 221/510/26 285/511/26 283/512/26 246/513/26 +f 211/502/28 212/514/28 236/455/28 235/458/28 +f 218/515/31 219/516/31 243/517/31 241/518/31 +f 225/519/28 291/520/28 292/521/28 250/522/28 +f 215/509/27 216/523/27 240/460/27 239/463/27 +f 222/524/31 223/525/31 247/526/31 245/527/31 +f 235/458/38 248/459/38 246/528/38 233/503/38 +f 236/430/39 250/529/39 256/530/39 +f 234/429/40 252/531/40 250/529/40 236/430/40 +f 249/532/41 255/488/41 265/487/41 274/533/41 +f 255/488/42 249/532/42 237/500/42 +f 237/500/43 249/532/43 251/534/43 238/385/43 +f 241/535/44 238/385/44 251/534/44 +f 238/385/45 241/536/45 243/537/45 240/386/45 +f 241/535/46 251/534/46 275/538/46 276/539/46 +f 252/531/37 234/429/37 242/507/37 +f 233/498/47 244/540/47 242/541/47 234/429/47 +f 245/461/48 240/460/48 243/414/48 +f 244/542/49 246/528/49 283/543/49 284/544/49 +f 246/528/50 244/542/50 233/503/50 +f 286/545/28 280/546/28 224/547/28 248/548/28 +f 259/549/31 258/550/31 267/551/31 266/552/31 264/553/31 +f 263/554/31 262/555/31 273/556/31 268/557/31 257/558/31 +f 270/559/31 269/560/31 272/561/31 276/562/31 275/563/31 +f 271/564/31 274/565/31 265/566/31 261/567/31 260/568/31 +f 273/413/49 262/569/49 245/461/49 243/414/49 +f 258/447/29 259/570/29 223/420/29 207/419/29 +f 281/438/28 282/571/28 217/410/28 206/409/28 +f 289/572/27 291/573/27 225/440/27 202/439/27 +f 264/574/36 266/575/36 253/468/36 247/462/36 +f 269/402/27 270/576/27 227/435/27 205/399/27 +f 287/506/46 293/577/46 252/531/46 242/507/46 +f 262/578/26 263/579/26 222/580/26 245/581/26 +f 277/582/29 285/583/29 221/426/29 203/425/29 +f 257/584/28 268/585/28 219/404/28 204/403/28 +f 260/586/26 261/587/26 231/449/26 201/448/26 +f 274/588/28 271/589/28 226/590/28 249/591/28 +f 284/544/27 278/592/27 220/593/27 244/542/27 +f 279/424/26 296/594/26 229/454/26 208/421/26 +f 294/595/29 290/596/29 232/597/29 256/530/29 +f 293/598/26 288/599/26 228/600/26 252/601/26 +f 266/575/27 267/602/27 230/603/27 253/468/27 +f 289/604/30 290/605/30 294/606/30 292/607/30 291/608/30 +f 277/609/30 278/610/30 284/611/30 283/612/30 285/613/30 +f 286/614/30 295/615/30 296/616/30 279/617/30 280/618/30 +f 282/619/30 281/620/30 288/621/30 293/622/30 287/623/30 +f 276/539/29 272/624/29 218/625/29 241/535/29 +f 292/626/41 294/595/41 256/530/41 250/529/41 +f 177/331/51 185/350/51 188/348/51 181/341/51 +f 179/334/52 186/345/52 185/350/52 177/331/52 +f 183/338/53 187/346/53 186/345/53 179/334/53 +f 181/341/54 188/348/54 187/346/54 183/338/54 +f 171/318/53 175/326/53 174/325/53 167/315/53 +f 169/320/54 176/328/54 175/326/54 171/318/54 +f 165/311/51 173/330/51 176/328/51 169/320/51 +f 167/315/52 174/325/52 173/330/52 165/311/52 +f 189/351/51 197/370/51 200/368/51 193/361/51 +f 193/361/54 200/368/54 199/366/54 195/358/54 +f 195/358/53 199/366/53 198/365/53 191/355/53 +f 191/355/52 198/365/52 197/370/52 189/351/52 +o Cube.010_Cube.018 +v 0.059889 0.868714 -0.028534 +v 0.059889 0.976405 -0.028534 +v 0.059889 0.976405 0.091016 +v 0.059889 0.868714 0.091016 +v -0.059660 0.868714 0.091016 +v -0.059660 0.976405 0.091016 +v -0.059660 0.976405 -0.028534 +v -0.059660 0.868714 -0.028534 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.049599 +vt 0.000000 0.049599 +vt 0.000000 0.950401 +vt 1.000000 0.950401 +vt 0.000000 0.049599 +vt 1.000000 0.049599 +vt 1.000000 0.950401 +vt 0.000000 0.950401 +vt 1.000000 0.049599 +vt 1.000000 0.950401 +vt 0.000000 0.049599 +vt 0.000000 0.950401 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +g Cube.010_Cube.018_gem.001 +usemtl gem.001 +s off +f 304/627/55 297/628/55 300/629/55 301/630/55 +f 297/631/56 304/632/56 303/633/56 298/634/56 +f 301/635/57 300/636/57 299/637/57 302/638/57 +f 304/639/58 301/635/58 302/638/58 303/640/58 +f 300/641/59 297/631/59 298/634/59 299/642/59 +f 303/643/60 302/644/60 299/645/60 298/646/60 Index: ores.lua ================================================================== --- ores.lua +++ ores.lua @@ -41,23 +41,33 @@ } local tools, armors = sorcery.matreg.tools, sorcery.matreg.armors for name, metal in pairs(sorcery.data.metals) do local ingot = metal.ingot or 'sorcery:' .. name .. '_ingot' - local block = metal.block or 'sorcery:' .. name .. '_block' + local block = metal.block or 'sorcery:' .. name .. 'block' local screw = 'sorcery:screw_' .. name local fragment = 'sorcery:fragment_' .. name - if not metal.no_tools then for _,t in pairs(tools) do + local powder = 'sorcery:powder_' .. name + metal.parts = { + ingot = ingot; + block = block; + screw = screw; + fragment = fragment; + powder = powder; + } + if not metal.no_tools then for t,c in pairs(tools) do sorcery.matreg.lookup[(metal.items and metal.items[t]) or ('sorcery:' .. t .. '_' .. name)] = { metal = true; id = name; data = metal; + value = c.cost * fragments_per_ingot; } end end - if not metal.no_armor then for _,a in pairs(armors) do + if not metal.no_armor then for a,c in pairs(armors) do sorcery.matreg.lookup[(metal.items and metal.items[a]) or ('sorcery:' .. a .. '_' .. name)] = { metal = true; id = name; data = metal; + value = c.cost * fragments_per_ingot; } end end sorcery.data.metallookup[ingot] = { id = name; data = metal; value = fragments_per_ingot; @@ -73,13 +83,30 @@ sorcery.data.metallookup[screw] = { id = name; data = metal; value = 0; -- prevent use in smelting } minetest.register_craftitem(screw, { - description = sorcery.lib.str.capitalize(name) .. ' screw'; + description = sorcery.lib.str.capitalize(name) .. ' Screw'; inventory_image = sorcery.lib.image('sorcery_screw.png'):multiply(sorcery.lib.color(metal.tone)):render(); }) + minetest.register_craftitem(powder, { + description = sorcery.lib.str.capitalize(name) .. ' Powder'; + inventory_image = 'sorcery_' .. name .. '_powder.png'; + }) + if metal.dye then + minetest.register_craft { + output = 'dye:' .. metal.dye .. ' 4'; + recipe = { + {'', powder, ''}; + {powder,'basic_materials:paraffin',powder}; + {'','bucket:bucket_water',''}; + }; + replacements = { + {'bucket:bucket_water', 'bucket:bucket_empty'}; + }; + }; + end -- TODO: replace crafting recipe with kiln recipe minetest.register_craft { output = screw.. ' 4'; recipe = { {fragment,fragment,fragment}; @@ -109,12 +136,18 @@ armor_protection = metal.armor_protection; } end minetest.register_craftitem(fragment, { inventory_image = 'sorcery_' .. name .. '_fragment.png'; - description = sorcery.lib.str.capitalize(name) .. ' fragment'; + description = sorcery.lib.str.capitalize(name) .. ' Fragment'; }) + minetest.register_craft { + type = 'cooking'; + recipe = powder; + cooktime = (metal.cooktime or 4) * 1.5; + output = fragment; + } minetest.register_craft { type = 'cooking'; recipe = ingot; cooktime = (metal.cooktime or 4) / 2; output = fragment .. ' ' .. tostring(fragments_per_ingot); @@ -126,13 +159,31 @@ minetest.register_craft { type = 'shapeless'; recipe = rec; output = ingot; } + end + if metal.fuel then + minetest.register_craft { + type = 'fuel'; + recipe = powder; + burntime = metal.fuel; + } end if metal.mix then sorcery.data.register.alloy(sorcery.lib.tbl.merge(metal.mix, { output = name; cooktime = metal.cooktime or 10; })) + end + if metal.sinter then + local powders = {} + for _,m in pairs(metal.sinter) do + powders[#powders+1] = 'sorcery:powder_' .. m + end + minetest.register_craft { + type = 'shapeless'; + output = powder .. ' ' .. tostring(#powders); + recipe = powders; + }; end end ADDED textures/sorcery_aluminum_powder.png Index: textures/sorcery_aluminum_powder.png ================================================================== --- textures/sorcery_aluminum_powder.png +++ textures/sorcery_aluminum_powder.png cannot compute difference between binary files ADDED textures/sorcery_brass_powder.png Index: textures/sorcery_brass_powder.png ================================================================== --- textures/sorcery_brass_powder.png +++ textures/sorcery_brass_powder.png cannot compute difference between binary files ADDED textures/sorcery_bronze_powder.png Index: textures/sorcery_bronze_powder.png ================================================================== --- textures/sorcery_bronze_powder.png +++ textures/sorcery_bronze_powder.png cannot compute difference between binary files ADDED textures/sorcery_cobalt_powder.png Index: textures/sorcery_cobalt_powder.png ================================================================== --- textures/sorcery_cobalt_powder.png +++ textures/sorcery_cobalt_powder.png cannot compute difference between binary files ADDED textures/sorcery_condenser.png Index: textures/sorcery_condenser.png ================================================================== --- textures/sorcery_condenser.png +++ textures/sorcery_condenser.png cannot compute difference between binary files ADDED textures/sorcery_conduit_copper_side.png Index: textures/sorcery_conduit_copper_side.png ================================================================== --- textures/sorcery_conduit_copper_side.png +++ textures/sorcery_conduit_copper_side.png cannot compute difference between binary files ADDED textures/sorcery_conduit_copper_top.png Index: textures/sorcery_conduit_copper_top.png ================================================================== --- textures/sorcery_conduit_copper_top.png +++ textures/sorcery_conduit_copper_top.png cannot compute difference between binary files ADDED textures/sorcery_copper_powder.png Index: textures/sorcery_copper_powder.png ================================================================== --- textures/sorcery_copper_powder.png +++ textures/sorcery_copper_powder.png cannot compute difference between binary files DELETED textures/sorcery_crucible_duranium.png Index: textures/sorcery_crucible_duranium.png ================================================================== --- textures/sorcery_crucible_duranium.png +++ textures/sorcery_crucible_duranium.png cannot compute difference between binary files ADDED textures/sorcery_crucible_duridium.png Index: textures/sorcery_crucible_duridium.png ================================================================== --- textures/sorcery_crucible_duridium.png +++ textures/sorcery_crucible_duridium.png cannot compute difference between binary files DELETED textures/sorcery_duranium_fragment.png Index: textures/sorcery_duranium_fragment.png ================================================================== --- textures/sorcery_duranium_fragment.png +++ textures/sorcery_duranium_fragment.png cannot compute difference between binary files ADDED textures/sorcery_duridium_fragment.png Index: textures/sorcery_duridium_fragment.png ================================================================== --- textures/sorcery_duridium_fragment.png +++ textures/sorcery_duridium_fragment.png cannot compute difference between binary files ADDED textures/sorcery_duridium_powder.png Index: textures/sorcery_duridium_powder.png ================================================================== --- textures/sorcery_duridium_powder.png +++ textures/sorcery_duridium_powder.png cannot compute difference between binary files ADDED textures/sorcery_electrum_powder.png Index: textures/sorcery_electrum_powder.png ================================================================== --- textures/sorcery_electrum_powder.png +++ textures/sorcery_electrum_powder.png cannot compute difference between binary files ADDED textures/sorcery_eternium_powder.png Index: textures/sorcery_eternium_powder.png ================================================================== --- textures/sorcery_eternium_powder.png +++ textures/sorcery_eternium_powder.png cannot compute difference between binary files ADDED textures/sorcery_gold_powder.png Index: textures/sorcery_gold_powder.png ================================================================== --- textures/sorcery_gold_powder.png +++ textures/sorcery_gold_powder.png cannot compute difference between binary files ADDED textures/sorcery_impervium_powder.png Index: textures/sorcery_impervium_powder.png ================================================================== --- textures/sorcery_impervium_powder.png +++ textures/sorcery_impervium_powder.png cannot compute difference between binary files ADDED textures/sorcery_iridium_powder.png Index: textures/sorcery_iridium_powder.png ================================================================== --- textures/sorcery_iridium_powder.png +++ textures/sorcery_iridium_powder.png cannot compute difference between binary files ADDED textures/sorcery_levitanium_powder.png Index: textures/sorcery_levitanium_powder.png ================================================================== --- textures/sorcery_levitanium_powder.png +++ textures/sorcery_levitanium_powder.png cannot compute difference between binary files ADDED textures/sorcery_lithium_powder.png Index: textures/sorcery_lithium_powder.png ================================================================== --- textures/sorcery_lithium_powder.png +++ textures/sorcery_lithium_powder.png cannot compute difference between binary files ADDED textures/sorcery_mill_back.png Index: textures/sorcery_mill_back.png ================================================================== --- textures/sorcery_mill_back.png +++ textures/sorcery_mill_back.png cannot compute difference between binary files ADDED textures/sorcery_mill_bottom.png Index: textures/sorcery_mill_bottom.png ================================================================== --- textures/sorcery_mill_bottom.png +++ textures/sorcery_mill_bottom.png cannot compute difference between binary files ADDED textures/sorcery_mill_front.png Index: textures/sorcery_mill_front.png ================================================================== --- textures/sorcery_mill_front.png +++ textures/sorcery_mill_front.png cannot compute difference between binary files ADDED textures/sorcery_mill_grindhead.png Index: textures/sorcery_mill_grindhead.png ================================================================== --- textures/sorcery_mill_grindhead.png +++ textures/sorcery_mill_grindhead.png cannot compute difference between binary files ADDED textures/sorcery_mill_grindhead_shade.png Index: textures/sorcery_mill_grindhead_shade.png ================================================================== --- textures/sorcery_mill_grindhead_shade.png +++ textures/sorcery_mill_grindhead_shade.png cannot compute difference between binary files ADDED textures/sorcery_mill_side.png Index: textures/sorcery_mill_side.png ================================================================== --- textures/sorcery_mill_side.png +++ textures/sorcery_mill_side.png cannot compute difference between binary files ADDED textures/sorcery_mill_top.png Index: textures/sorcery_mill_top.png ================================================================== --- textures/sorcery_mill_top.png +++ textures/sorcery_mill_top.png cannot compute difference between binary files ADDED textures/sorcery_platinum_powder.png Index: textures/sorcery_platinum_powder.png ================================================================== --- textures/sorcery_platinum_powder.png +++ textures/sorcery_platinum_powder.png cannot compute difference between binary files ADDED textures/sorcery_silver_powder.png Index: textures/sorcery_silver_powder.png ================================================================== --- textures/sorcery_silver_powder.png +++ textures/sorcery_silver_powder.png cannot compute difference between binary files ADDED textures/sorcery_statlamp_blue.png Index: textures/sorcery_statlamp_blue.png ================================================================== --- textures/sorcery_statlamp_blue.png +++ textures/sorcery_statlamp_blue.png cannot compute difference between binary files ADDED textures/sorcery_statlamp_green.png Index: textures/sorcery_statlamp_green.png ================================================================== --- textures/sorcery_statlamp_green.png +++ textures/sorcery_statlamp_green.png cannot compute difference between binary files ADDED textures/sorcery_statlamp_off.png Index: textures/sorcery_statlamp_off.png ================================================================== --- textures/sorcery_statlamp_off.png +++ textures/sorcery_statlamp_off.png cannot compute difference between binary files ADDED textures/sorcery_statlamp_purple.png Index: textures/sorcery_statlamp_purple.png ================================================================== --- textures/sorcery_statlamp_purple.png +++ textures/sorcery_statlamp_purple.png cannot compute difference between binary files ADDED textures/sorcery_statlamp_red.png Index: textures/sorcery_statlamp_red.png ================================================================== --- textures/sorcery_statlamp_red.png +++ textures/sorcery_statlamp_red.png cannot compute difference between binary files ADDED textures/sorcery_statlamp_yellow.png Index: textures/sorcery_statlamp_yellow.png ================================================================== --- textures/sorcery_statlamp_yellow.png +++ textures/sorcery_statlamp_yellow.png cannot compute difference between binary files ADDED textures/sorcery_steel_powder.png Index: textures/sorcery_steel_powder.png ================================================================== --- textures/sorcery_steel_powder.png +++ textures/sorcery_steel_powder.png cannot compute difference between binary files ADDED textures/sorcery_tin_powder.png Index: textures/sorcery_tin_powder.png ================================================================== --- textures/sorcery_tin_powder.png +++ textures/sorcery_tin_powder.png cannot compute difference between binary files ADDED textures/sorcery_tungsten_powder.png Index: textures/sorcery_tungsten_powder.png ================================================================== --- textures/sorcery_tungsten_powder.png +++ textures/sorcery_tungsten_powder.png cannot compute difference between binary files ADDED textures/sorcery_unobtanium_powder.png Index: textures/sorcery_unobtanium_powder.png ================================================================== --- textures/sorcery_unobtanium_powder.png +++ textures/sorcery_unobtanium_powder.png cannot compute difference between binary files