Index: altar.lua ================================================================== --- altar.lua +++ altar.lua @@ -1,8 +1,9 @@ local altar_item_offset = { x = 0, y = -0.3, z = 0 } +local log = function(...) sorcery.log('altar',...) end local range = function(min, max) local span = max - min local val = math.random() * span return val + min @@ -168,11 +169,11 @@ local gift = sorcery.lib.tbl.pick(god.gifts) local data = god.gifts[gift] local value, rarity = data[1], data[2] if value <= divine_favor and math.random(rarity) == 1 then bestow(gift) - print(god.name .. ' has produced ' .. gift .. ' upon an altar as a gift') + log(god.name .. ' has produced ' .. gift .. ' upon an altar as a gift') if math.random(god.generosity) == 1 then -- unappreciated gifts may incur divine -- irritation divine_favor = divine_favor - 1 end Index: cookbook.lua ================================================================== --- cookbook.lua +++ cookbook.lua @@ -84,11 +84,11 @@ end end local find_builtin = function(method,kind) return function(out) local rec = {} local crec = sorcery.lib.tbl.walk(minetest.registered_items[out],{'_sorcery','recipe','canonical',kind}) - local w=0, lst + local w, lst = 0 if crec then lst = {} for i,v in pairs(crec) do if #v > w then w = #v end for j,n in pairs(v) do @@ -110,13 +110,11 @@ end -- for j=1,#i.items do for j,item in pairs(lst) do local row = math.floor((j-1) / w) local col = (j-1) % w - if item then - rec[1 + (row * 3) + col] = item - end + if item then rec[1 + (row * 3) + col] = item end end return rec end end local function group_eval(i) @@ -220,31 +218,31 @@ {0,0}; {0,1}; }; pick = function(restrict) -- TODO make sure affinity restrictions match - return sorcery.data.infusions[math.random(#sorcery.data.infusions)].output + return sorcery.register.infusions.db[math.random(#sorcery.register.infusions.db)].output end; title = function(output) - for _,i in pairs(sorcery.data.infusions) do + for _,i in pairs(sorcery.register.infusions.db) do if i.output == output then if i._proto and i._proto.name then return i._proto.name else break end end end return 'Mysterious Potion' end; find = function(out) - for _,i in pairs(sorcery.data.infusions) do + for _,i in pairs(sorcery.register.infusions.db) do if i.output == out then return { i.infuse, i.into } end end end; props = function(out) - for _,i in pairs(sorcery.data.infusions) do + for _,i in pairs(sorcery.register.infusions.db) do if i.output == out then if i.recipe then return i.recipe else return {} end end end end; Index: data/extracts.lua ================================================================== --- data/extracts.lua +++ data/extracts.lua @@ -15,7 +15,9 @@ pine = {"default:pine_sapling", {41,166,80}}; cocoa = {"farming:cocoa_beans", {146,38,0}}; grape = {"farming:grapes", {206,56,214}}; kelp = {"default:sand_with_kelp", {109,185,145}}; fern = {"default:fern_1", {164,238,47}}; + greengrass = {"default:grass_1", {185,255,115}}; marram = {"default:marram_grass_1", {127,255,210}}; + shrub = {"default:dry_shrub", {187,149,76}}; }; Index: data/oils.lua ================================================================== --- data/oils.lua +++ data/oils.lua @@ -101,13 +101,13 @@ }; }; luscious = { color = {10,255,10}; mix = { - 'sorcery:extract_marram'; + 'sorcery:extract_greengrass'; 'sorcery:extract_grape'; 'farming:cocoa_beans'; 'farming:sugar'; 'farming:sugar'; }; }; } Index: data/resonance.lua ================================================================== --- data/resonance.lua +++ data/resonance.lua @@ -44,11 +44,11 @@ }; }; ['default:mese_crystal'] = { mode = 'random'; give = { - {value = 1; item = 'default:mese_fragment'}; + {value = 1; item = 'default:mese_crystal_fragment'}; {value = 2; item = 'sorcery:essence_force'}; }; }; }; Index: data/runes.lua ================================================================== --- data/runes.lua +++ data/runes.lua @@ -34,11 +34,11 @@ }; }; }; sapphire = { name = 'Return'; - desc = 'Use this amulet once to bind it to a particular point in the world, then discharge its spell to return instantly to that point.'; + desc = 'Use this amulet once to bind it to a particular place, then discharge its spell to translocate yourself back to that point from anywhere in the world.'; remove = function(ctx) ctx.meta:set_string('rune_return_dest','') end; cast = function(ctx) if not ctx.meta:contains('rune_return_dest') then @@ -49,25 +49,69 @@ local pos = minetest.string_to_pos(ctx.meta:get_string('rune_return_dest')) ctx.meta:set_string('rune_return_dest','') local subjects = { ctx.caster } local center = ctx.caster:get_pos() ctx.sparkle = false + local delay = math.max(3,10 - ctx.stats.power) + 3*(math.random()*2-1) + print('teledelay',delay,ctx.stats.power) for _,s in pairs(subjects) do local offset = vector.subtract(s:get_pos(), center) local pt = sorcery.lib.node.get_arrival_point(vector.add(pos,offset)) if pt then - sorcery.vfx.body_sparkle(s,sorcery.lib.color(20,120,255),2) - sorcery.vfx.body_sparkle(nil,sorcery.lib.color(20,255,120),2,pt) - s:set_pos(pt) + minetest.sound_play('sorcery_stutter', { + object = s, gain = 0.8; + },true) + local windup = minetest.sound_play('sorcery_windup',{ + object = s, gain = 0.4; + }) + local mydelay = delay + math.random(-10,10)*.1; + local spark = sorcery.lib.image('sorcery_spark.png') + local sh = s:get_properties().eye_height + local sparkle = function(amt,time,minsize,maxsize) + minetest.add_particlespawner { + amount = amt, time = time, attached = s; + minpos = { x = -0.3, y = -0.5, z = -0.3 }; + maxpos = { x = 0.3, y = sh*1.1, z = 0.3 }; + minvel = { x = -0.4, y = -0.2, z = -0.4 }; + maxvel = { x = 0.4, y = 0.2, z = 0.4 }; + minacc = { x = -0.5, y = -0.4, z = -0.5 }; + maxacc = { x = 0.5, y = 0.4, z = 0.5 }; + minexptime = 1.0, maxexptime = 2.0; + minsize = minsize, maxsize = maxsize, glow = 14; + texture = spark:blit(spark:multiply(sorcery.lib.color(29,205,247))):render(); + animation = { + type = 'vertical_frames'; + aspect_w = 16, aspect_h = 16; + }; + } + end + sparkle(mydelay*100,mydelay,0.3,1.3) + minetest.after(mydelay*0.4, function() + local timeleft = mydelay - (mydelay*0.4) + sparkle(timeleft*150, timeleft, 0.6,1.8) + end) + minetest.after(mydelay*0.7, function() + local timeleft = mydelay - (mydelay*0.7) + sparkle(timeleft*80, timeleft, 2,4) + end) + sorcery.lib.node.preload(pt,s) + minetest.after(mydelay, function() + minetest.sound_stop(windup) + minetest.sound_play('sorcery_zap', { pos = pt, gain = 0.4 },true) + minetest.sound_play('sorcery_zap', { pos = s:get_pos(), gain = 0.4 },true) + sorcery.vfx.body_sparkle(nil,sorcery.lib.color(20,255,120),2,s:get_pos()) + s:set_pos(pt) + sorcery.vfx.body_sparkle(s,sorcery.lib.color(20,120,255),2) + end) end end end end; frame = { iridium = { name = 'Mass Return'; - desc = 'Use this amulet once to bind it to a particular point in the world, then carry yourself and everyone around you back to that point in a flash simply by using it again'; + desc = 'Use this amulet once to bind it to a particular place, then carry yourself and everyone around you back to that point in a flash simply by using it again'; }; }; }; emerald = { name = 'Banishment'; @@ -77,13 +121,30 @@ name = 'Mass Banishment'; desc = 'Use this amulet once to bind it to a particular point in the world, then use it again to seize up everyone surrounding you in the grip of a fearsome magic that will deport them all in the blink of an eye to whatever destination you have chosen'; }; }; }; - ruby = { + ruby = minetest.get_modpath('beds') and { name = 'Escape'; desc = 'Immediately transport yourself out of a dangerous situation back to the last place you slept'; + cast = function(ctx) + -- if not beds.spawns then beds.read_spawns() end + local subjects = {ctx.caster} + for _,s in pairs(subjects) do + local spp = beds.spawn[ctx.caster:get_player_name()] + if spp then + local oldpos = s:get_pos() + minetest.sound_play('sorcery_splunch', {pos=oldpos}, true) + sorcery.vfx.body_sparkle(nil,sorcery.lib.color(244,38,131),2,oldpos) + s:set_pos(spp) + minetest.sound_play('sorcery_splunch', {pos=spp}, true) + sorcery.vfx.body_sparkle(nil,sorcery.lib.color(244,38,89),2,spp) + end + -- TODO decide what happens to the people who don't have + -- respawn points already set + end + end; frame = { cobalt = { name = 'Vengeful Exit'; desc = 'Translocate away to the safety of your boudoir with a fearsome blast of dangerous radiance that will send bodies flying and deal heavy damage to those nearby'; }; @@ -123,12 +184,24 @@ amulets = { amethyst = { name = 'Hurling'; desc = 'Wielding this amulet, a mere flick of your fingers will lift any target of your choice bodily into the air and press upon them with tremendous repulsive force, throwing them like a hapless ragdoll out of your path'; }; - diamond = { + sapphire = { + name = 'Flinging'; + desc = 'Toss an enemy violently into the air, and allow the inevitable impact to do your dirty work for you'; + }; + emerald = { name = 'Shockwave'; + desc = 'Let loose a stream of concussive force that slams into everything in your path and sends them hurtling away from you'; + }; + luxite = { + name = 'Repulsive Aura'; + desc = 'For a period of time, anyone who approaches you will be violently thrust aside'; + }; + diamond = { + name = 'Blastwave'; desc = 'Unleash a tidal wave of force in every direction, blasting friends and foes alike away from you with enough violence to sprain and fracture bone'; }; }; }; obliterate = { @@ -143,12 +216,32 @@ }; ruby = { name = 'Shattering'; desc = 'Tear a violent wound in the earth with the destructive force of this amulet'; }; + emerald = { + name = 'Detonate'; + desc = 'Wielding this amulet, you can loose an extraordinarily powerful bolt of flame from your fingertips that will explode violently on impact, wreaking total havoc wherever it lands'; + cast = function(ctx) + local speed = 40 + local radius = math.random(math.floor(ctx.stats.power*0.5),math.ceil(ctx.stats.power)) + local heading = ctx.heading + heading.pos.y = heading.pos.y + heading.eyeheight*0.9 + local vel = vector.multiply(heading.yaw,speed) + local bolt = minetest.add_entity(vector.add(heading.pos,vector.multiply(heading.yaw,2.5)),'sorcery:spell_projectile_flamebolt') + bolt:set_rotation(heading.yaw) + bolt:get_luaentity()._blastradius = radius + bolt:set_velocity(vel) + end; + }; + luxite = { + name = 'Lethal Aura'; + desc = 'For a time, anyone who approaches you, whether friend or foe, will suffer immediate retaliation as they are quickly sapped of their life force'; + }; diamond = { name = 'Killing'; + mingrade = 4; desc = 'Wield this amulet against a foe to instantly snuff the life out of their mortal form, regardless of their physical protections.'; cast = function(ctx) if not (ctx.target and ctx.target.type == 'object') then return false end local tgt = ctx.target.ref if not minetest.is_player(obj) then return false end @@ -208,10 +301,11 @@ name = 'Radiance'; desc = 'Set the air around you alight with a mystic luminance, letting you see clearly a great distance in every direction for several minutes'; frame = { iridium = { name = 'Sunshine'; + mingrade = 5; desc = 'Unleash the power of this amulet to seize ultimate control over the forces of nature and summon the Sun high into the nighttime sky'; }; }; }; }; @@ -224,13 +318,17 @@ amulets = { amethyst = { name = 'Suffocation'; desc = 'Wrap this spell tightly around your victim\'s throat, cutting off their oxygen until you release them.'; }; + emerald = { + name = 'Caging'; + desc = 'Trap your victim in an impenetrable field of force, leaving them with no way out but translocation or waiting for the field to release them'; + }; ruby = { name = 'Exsanguination'; - desc = 'Rip the life force out of another, leaving them on the brink of death, and use it to mend your own wounds and invigorate your own being'; + desc = 'Rip the life force out of another, leaving them on the brink of death, and use it to mend your own wounds and invigorate your being'; cast = function(ctx) if not (ctx.target and ctx.target.type == 'object') then return false end local tgt = ctx.target.ref local takefac = math.min(99,50 + (ctx.stats.power * 5)) / 100 local dmg = tgt:get_hp() * takefac Index: data/spells.lua ================================================================== --- data/spells.lua +++ data/spells.lua @@ -181,11 +181,10 @@ leytype = 'praxic'; desc = 'Conjure a gout of fire to scorch your foes with a flick of this wand'; cast = function(ctx) local speed = 30 -- TODO maybe amethyst tip increases speed? local radius = math.random(math.max(1,math.floor((ctx.stats.power or 1) - 0.5)), math.ceil((ctx.stats.power or 1)+0.5)) - print('!! radius',radius) local heading = ctx.heading heading.pos.y = heading.pos.y + heading.eyeheight*0.9 local vel = vector.multiply(heading.yaw,speed) local bolt = minetest.add_entity(vector.add(heading.pos,vector.multiply(heading.yaw,2.5)),'sorcery:spell_projectile_flamebolt') bolt:set_rotation(heading.yaw) @@ -493,16 +492,17 @@ if not tgt then return false end local inv = minetest.get_meta(ctx.target.under):get_inventory() for _,name in pairs{'foci','item'} do for i=1,inv:get_size(name) do + if inv:get_stack(name,i):is_empty() then goto skip end local stack = 'sorcery:ash' if ctx.base.gem == 'sapphire' then stack = nil end inv:set_stack(name,i,ItemStack(stack)) - end + ::skip::end end enchantment_sparkle(ctx,sorcery.lib.color(255,12,0)) enchantment_sparkle(ctx,sorcery.lib.color(85,18,35)) enchantment_sparkle(ctx,sorcery.lib.color(0,0,0)) Index: depends.txt ================================================================== --- depends.txt +++ depends.txt @@ -7,5 +7,6 @@ late instant_ores screwdriver hopper? unifieddyes? +beds? Index: gems.lua ================================================================== --- gems.lua +++ gems.lua @@ -63,15 +63,24 @@ local ctx = { caster = user; target = target; stats = stats; - sound = "xdecor_enchanting"; --FIXME make own sounds - sparkle = true; amulet = stack; meta = stack:get_meta(); -- avoid spell boilerplate color = sorcery.lib.color(sp.tone); + today = minetest.get_day_count(); + heading = { + pos = user:get_pos(); + yaw = user:get_look_dir(); + pitch = user:get_look_vertical(); + angle = user:get_look_horizontal(); + eyeheight = user:get_properties().eye_height; + }; + + sound = "xdecor_enchanting"; --FIXME make own sounds + sparkle = true; } print('casting') local res = sp.cast(ctx) if res == nil or res == true then Index: portal.lua ================================================================== --- portal.lua +++ portal.lua @@ -299,10 +299,11 @@ if u.object:get_player_name() == name then found = true end end if not found then + if user.sound then minetest.sound_fade(user.sound,1,0) end portal_context.users[name] = nil end end end @@ -313,10 +314,14 @@ local pname = u.object:get_player_name() if not portal_context.users[pname] then portal_context.users[pname] = { time = 0, portal = pos } end local user = portal_context.users[pname] if not vector.equals(pos,user.portal) then + if user.sound then + minetest.sound_fade(user.sound,1,0) + user.sound = nil + end user.time = 0 user.portal = pos end local cap = sorcery.ley.netcaps(pos,delta) local jc = (constants.portal_jump_cost_local*delta) @@ -324,10 +329,13 @@ user.dest = portal_pick_destination(dev,crc,partner) sorcery.lib.node.preload(user.dest, u.object) end if not user.dest then goto skippad end local fac = math.min(1,(user.time / constants.portal_jump_time)) + if user.time == 0 then + user.sound = minetest.sound_play('sorcery_windup', {pos=pos}) + end minetest.add_particlespawner { time = 1, amount = 100 + (fac * 200); minsize = 0.2 + fac*0.7, maxsize = 0.4 + fac*0.9; minvel = {y = 0.2, x=0,z=0}, maxvel = {y = 0.5, x=0,z=0}; minacc = {y = 0.0, x=0,z=0}, maxacc = {y = 0.3, x=0,z=0}; @@ -364,10 +372,14 @@ } end -- hack to try and swat an unkillable fucking impossibug if user.time > constants.portal_jump_time * 2 then user.time = 0 + if user.sound then + minetest.sound_stop(user.sound) + user.sound = nil + end elseif user.time >= constants.portal_jump_time then local dd = portal_disposition(portal_composition(user.dest)) if #dd.freepads > 0 then local destpad = dd.freepads[math.random(#dd.freepads)].pad local rng = function(min,max) @@ -394,12 +406,19 @@ type = 'vertical_frames', length = life + 0.1; aspect_w = 16, aspect_h = 16; }; } end + if user.sound then + minetest.sound_fade(user.sound,1,0) + user.sound = nil + end user.dest = nil user.time = 0 + user.sound = nil + minetest.sound_play('sorcery_zap',{pos=pos},true) + minetest.sound_play('sorcery_zap',{pos=destpad},true) portal_context.users[pname] = nil u.object:set_pos(vector.add(destpad, {y=0.5,z=0,x=0})) end else user.time = user.time + delta Index: runeforge.lua ================================================================== --- runeforge.lua +++ runeforge.lua @@ -3,11 +3,11 @@ -- expensive than they currently are? the existing system is neat but -- i think amulets are a little overpowered for something that just -- passively consumes ley-current local constants = { - rune_mine_interval = 250; + rune_mine_interval = 240; -- how often a powered forge rolls for new runes rune_cache_max = 4; -- how many runes a runeforge can hold at a time @@ -25,11 +25,11 @@ exalted = {grade = 5; name = 'Exalted'; infusion = 'sorcery:powder_levitanium'}; supreme = {grade = 6; name = 'Supreme'; infusion = 'sorcery:essence_force'}; }; } local calc_phial_props = function(phial) --> mine interval: float, time factor: float - local g = phial:get_definition()._proto.grade + local g = phial:get_definition()._proto.data.grade local i = constants.rune_mine_interval local fac = (g-1) / 5 return i - ((i*0.5) * fac), 0.5 * fac end sorcery.register.runes.foreach('sorcery:generate',{},function(name,rune) @@ -49,17 +49,17 @@ }) end) for name,p in pairs(constants.phial_kinds) do local f = string.format - local color = sorcery.lib.color(255,27,188) + local color = sorcery.lib.color(204,38,235) local fac = p.grade / 6 local id = f('phial_%s', name); sorcery.register_potion_tbl { name = id; label = f('%s Phial',p.name); - desc = "A powerful liquid consumed in the operation of a rune forge. Its quality determines how fast new runes can be constructed."; + desc = "A powerful liquid consumed in the operation of a rune forge. Its quality determines how fast new runes can be constructed and how much energy is required by the process."; color = color:brighten(1 + fac*0.5); imgvariant = (fac >= 5) and 'sparkle' or 'dull'; glow = 5+p.grade; extra = { groups = { sorcery_phial = p.grade }; @@ -67,11 +67,11 @@ }; } sorcery.register.infusions.link { infuse = p.infusion; into = 'sorcery:potion_subtle'; - output = id; + output = 'sorcery:'..id; } end local register_rune_wrench = function(w) local mp = sorcery.data.metals[w.metal].parts @@ -91,11 +91,11 @@ minetest.register_craft { output = w.name; recipe = { {'', mp.fragment,''}; {'', mp.ingot, mp.fragment}; - {'sorcery:vidrium_fragment','', ''}; + {'sorcery:fragment_vidrium','', ''}; }; } end register_rune_wrench { @@ -134,12 +134,16 @@ local rg = rune:get_meta():get_int('rune_grade') m:set_string('amulet_rune', rp.id) m:set_int('amulet_rune_grade', rg) local spell = sorcery.amulet.getspell(stack) if not spell then return nil end - - local name = string.format('Amulet of %s %s', constants.amulet_grades[rg], spell.name) + local name + if spell.minrune then -- indicating quality makes less sense if it's restricted + name = string.format('Amulet of %s', spell.name) + else + name = string.format('Amulet of %s %s', constants.amulet_grades[rg], spell.name) + end m:set_string('description', sorcery.lib.ui.tooltip { title = name; color = spell.tone; desc = spell.desc; }) @@ -198,27 +202,27 @@ local rune = m:get_string('amulet_rune') local rg = m:get_string('amulet_rune_grade') local rd = sorcery.data.runes[rune] local spell = rd.amulets[proto.base] if not spell then return nil end - local title,desc,cast,apply,remove = spell.name, spell.desc, spell.cast, spell.apply, spell.remove -- FIXME in serious need of refactoring + local title,desc,cast,apply,remove,mingrade = spell.name, spell.desc, spell.cast, spell.apply, spell.remove, spell.mingrade -- FIXME in serious need of refactoring local base_spell = true if proto.frame and spell.frame and spell.frame[proto.frame] then local sp = spell.frame[proto.frame] title = sp.name or title desc = sp.desc or desc cast = sp.desc or cast apply = sp.apply or apply remove = sp.remove or remove + mingrade = sp.mingrade or remove base_spell = false end return { - rune = rune; - grade = rg; - spell = spell; + rune = rune, grade = rg; + spell = spell, mingrade = mingrade; name = title, desc = desc; cast = cast, apply = apply, remove = remove; frame = proto.frame; framestats = proto.frame and sorcery.data.metals[proto.frame].amulet; tone = sorcery.lib.color(rd.tone); @@ -235,21 +239,26 @@ local pow_min = l.self.powerdraw >= l.self.minpower local pow_max = l.self.powerdraw >= l.self.maxpower local has_phial = function() return not i:is_empty('phial') end if time and has_phial() and pow_min then -- roll for runes - local rolls = math.floor(time/calc_phial_props(i:get_stack('phial',1))) + local int, powerfac = calc_phial_props(i:get_stack('phial',1)) + local rolls = math.floor(time/int) local newrunes = {} for _=1,rolls do local choices = {} for name,rune in pairs(sorcery.data.runes) do - if rune.minpower*time <= l.self.powerdraw and math.random(rune.rarity) == 1 then + print('considering',name) + print('-- power',rune.minpower,(rune.minpower*powerfac)*time,'//',l.self.powerdraw,l.self.powerdraw/time,'free',l.freepower,'max',l.maxpower) + if (rune.minpower*powerfac)*time <= l.self.powerdraw and math.random(rune.rarity) == 1 then local n = ItemStack(rune.item) choices[#choices + 1] = n end end if #choices > 0 then newrunes[#newrunes + 1] = choices[math.random(#choices)] end + print('rune choices:',dump(choices)) + print('me',dump(l.self)) end for _,r in pairs(newrunes) do if i:room_for_item('cache',r) and has_phial() then local qual = math.random(#constants.rune_grades) @@ -444,17 +453,28 @@ local wrench if not inv:is_empty('wrench') then wrench = inv:get_stack('wrench',1):get_definition()._proto end if fl == 'cache' then if tl == 'cache' then return 1 end - if tl == 'active' then + if tl == 'active' and inv:is_empty('active') then print(dump(wrench)) if wrench and wrench.powers.imbue and not inv:is_empty('amulet') then local amulet = inv:get_stack('amulet',1) local rune = inv:get_stack(fl,fi) - if sorcery.data.runes[rune:get_definition()._proto.id].amulets[amulet:get_definition()._sorcery.amulet.base] then - return 1 + local runeid = rune:get_definition()._proto.id + local runegrade = rune:get_meta():get_int('rune_grade') + if sorcery.data.runes[runeid].amulets[amulet:get_definition()._sorcery.amulet.base] then + local spell do -- haaaack + local i=ItemStack(amulet:get_name()) + local im = i:get_meta() + im:set_string('amulet_rune',runeid) + im:set_int('amulet_rune_grade',runegrade) + spell = sorcery.amulet.getspell(i) + end + if not spell.mingrade or runegrade >= spell.mingrade then + return 1 + end end end end end if fl == 'active' then Index: sorcery.md ================================================================== --- sorcery.md +++ sorcery.md @@ -8,10 +8,11 @@ * **default** * **stairs** for slabs, used in crafting recipes * **screwdriver** for several crafting recipes * **vessels** for potions, ink bottles, etc. * **tnt** for the flamebolt spell impact effect + * **beds** for the escape amulet *(optional)* ## third-party * **xdecor** for various tools and ingredients, especially honey and the hammer * **basic_materials** for crafting ingredients * **instant_ores** for ore generation. temporary, will be removed and replaced with home-grown mechanism soon ADDED sounds/sorcery_splunch.ogg Index: sounds/sorcery_splunch.ogg ================================================================== --- sounds/sorcery_splunch.ogg +++ sounds/sorcery_splunch.ogg cannot compute difference between binary files ADDED sounds/sorcery_stutter.ogg Index: sounds/sorcery_stutter.ogg ================================================================== --- sounds/sorcery_stutter.ogg +++ sounds/sorcery_stutter.ogg cannot compute difference between binary files ADDED sounds/sorcery_windup.ogg Index: sounds/sorcery_windup.ogg ================================================================== --- sounds/sorcery_windup.ogg +++ sounds/sorcery_windup.ogg cannot compute difference between binary files ADDED sounds/sorcery_zap.ogg Index: sounds/sorcery_zap.ogg ================================================================== --- sounds/sorcery_zap.ogg +++ sounds/sorcery_zap.ogg cannot compute difference between binary files Index: wands.lua ================================================================== --- wands.lua +++ wands.lua @@ -39,11 +39,11 @@ diamond = { item = 'sorcery:shard_diamond'; wandprops = { sturdiness = 1.7, reliability = 0.85 }; }; mese = { - item = 'default:mese_fragment'; + item = 'default:mese_crystal_fragment'; wandprops = { generate = 2 }; }; cobalt = { item = 'sorcery:powder_cobalt'; wandprops = { power = 1.4 };