sorcery  Check-in [cb09c77754]

Overview
Comment:optimize pngs, finish spellshatter spell, tweak rune forge algorithm to be more fair & reasonable, new spell-casting vfx
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: cb09c77754a372126ba17fca4047463a3cb189533c7e50bc4f9b1c052ca204ac
User & Date: lexi on 2021-07-31 19:13:12
Other Links: manifest | tags
Context
2021-08-01
13:42
remove debug statements >_< check-in: de7d27795b user: lexi tags: trunk
2021-07-31
19:13
optimize pngs, finish spellshatter spell, tweak rune forge algorithm to be more fair & reasonable, new spell-casting vfx check-in: cb09c77754 user: lexi tags: trunk
2021-07-24
01:01
add beds, external lights, fix various glitches check-in: d44d0ac782 user: lexi tags: trunk
Changes

Modified data/runes.lua from [67a4930ba7] to [4936c92bc2].

     1      1   -- a rune is an abstract object created by a runeforge, which can be
     2      2   -- applied to an amulet in order to imbue that amulet with unique
     3      3   -- and fearsome powers. the specific spell depends on the stone the
     4      4   -- rune is applied to, and not all runes can necessarily be applied
     5      5   -- to all stones.
     6      6   
            7  +local L = sorcery.lib
     7      8   local sparkle_region = function(s)
     8      9   	s.spell.visual_subjects {
     9     10   		amount = s.amt, time = s.time, -- attached = s;
    10     11   		minpos = s.minpos;
    11     12   		maxpos = s.maxpos;
    12     13   		minvel = { x = -0.4, y = -0.2, z = -0.4 };
    13     14   		maxvel = { x =  0.4, y =  0.2, z =  0.4 };
................................................................................
   122    123   	sorcery.spell.disjoin{target=target}
   123    124   end
   124    125   
   125    126   return {
   126    127   	translocate = {
   127    128   		name = 'Translocate';
   128    129   		tone = {0,235,233};
   129         -		minpower = 3;
   130         -		rarity = 7;
          130  +		minpower = 2;
          131  +		rarity = 8;
   131    132   		amulets = {
   132    133   			amethyst = {
   133    134   				name = 'Joining';
   134    135   				desc = 'Give this amulet to another and with a snap of their fingers they can arrive safely at your side from anywhere in the world — though returning whence they came may be a more difficult matter';
   135    136   				apply = function(ctx)
   136    137   					local maker = ctx.user:get_player_name()
   137    138   					ctx.meta:set_string('rune_join_target',maker)
................................................................................
   408    409   			};
   409    410   		};
   410    411   	};
   411    412   	disjoin = {
   412    413   		name = 'Disjoin';
   413    414   		tone = {159,235,0};
   414    415   		minpower = 4;
   415         -		rarity = 34;
          416  +		rarity = 10;
   416    417   		amulets = {
   417    418   			sapphire = {
   418    419   				name = 'Unsealing';
   419    420   				desc = 'Wielding this amulet, a touch of your hand will unravel even the mightiest protective magics, leaving doors unsealed and walls free to tear down';
          421  +				sound = 'sorcery_disjoin';
   420    422   				cast = function(ctx)
   421    423   					if ctx.target.type ~= 'node' then return false end
   422    424   					local r = 2 + math.floor(ctx.stats.power / 2)
   423    425   					local cast = false
   424    426   					for x = -r,r do
   425    427   					for y = -r,r do
   426    428   					for z = -r,r do
................................................................................
   442    444   					end
   443    445   					return cast
   444    446   				end;
   445    447   			};
   446    448   			amethyst = {
   447    449   				name = 'Purging';
   448    450   				desc = 'Free yourself from the grip of any malicious spellwork with a snap of your fingers — interrupting all of your own active spells in the process, including impending translocations';
          451  +				sound = 'sorcery_disjoin';
   449    452   				cast = function(ctx) purge(ctx.caster) end;
   450    453   			};
   451    454   			emerald = {
   452    455   				name = 'Disjunction Field';
   453    456   				desc = 'Render an area totally opaque to spellwork for a period of time, disrupting any existing spells and preventing further spellcasting therein';
          457  +				sound = 'sorcery_disjoin';
   454    458   			};
   455    459   			ruby = {
   456    460   				name = 'Disjunction';
   457    461   				desc = 'Wield this amulet against a spellcaster to disrupt and abort all their spells in progress, perhaps to trap a foe intent on translocating away, or unleash its force upon the victim of a malign hex to free them from its clutches';
   458    462   				mingrade = 3;
          463  +				sound = 'sorcery_disjoin';
   459    464   				cast = function(ctx)
   460    465   					if ctx.target.type == 'object'
   461    466   						then purge(ctx.target.ref)
   462    467   						else return false
   463    468   					end
   464    469   				end;
   465    470   				frame = {
................................................................................
   469    474   						desc = 'Not only will your victim\'s spells be nullified, but all enchanted objects they carry will be stripped of their power — or possibly even destroyed outright';
   470    475   					};
   471    476   				};
   472    477   			};
   473    478   			luxite = {
   474    479   				name = 'Disjunctive Aura';
   475    480   				desc = 'For a time, all magic undertaken in your vicinity will fail totally — including your own';
          481  +				sound = 'sorcery_disjoin';
   476    482   				cast = function(ctx)
   477    483   					local h = ctx.heading.eyeheight*1.1
   478    484   					sorcery.spell.cast {
   479    485   						name = 'sorcery:disjunctive-aura';
   480    486   						caster = ctx.caster, attach = 'caster';
   481    487   						subjects = {{player=ctx.caster}};
   482    488   						disjunction = true, range = 4 + ctx.stats.power;
................................................................................
   510    516   									minpos = { x = 0-range, y = -0.5, z = 0-range };
   511    517   									maxpos = { x =   range, y = h,    z =   range };
   512    518   									img = sorcery.lib.image('sorcery_flicker.png'):glow(sorcery.lib.color(120,255,30));
   513    519   								}
   514    520   							end;
   515    521   						};
   516    522   						sounds = {
   517         -							[0.00] = {sound='sorcery_disjoin',   where='caster'};
          523  +							-- [0.00] = {sound='sorcery_disjoin',   where='caster'};
   518    524   							[{whence=0,secs=0.8}] = {
   519    525   								sound='sorcery_disjoin_bg', where='subjects';
   520    526   								gain=0.5, stop = {whence=1,secs=-1.5}
   521    527   							};
   522    528   							[1.00] = {sound='sorcery_powerdown', where='caster'};
   523    529   						};
   524    530   					}
   525    531   				end
   526    532   			};
   527    533   			diamond = {
   528    534   				name = 'Mundanity';
   529    535   				desc = 'Strip away the effects of all active potions and spells in your immediate vicinity, leaving adversaries without their magicks to enhance and protect them, and allies free of any curses they may be hobbled by -- and, of course, vice versa';
          536  +				sound = 'sorcery_disjoin';
   530    537   				cast = function(ctx)
   531    538   					local where = ctx.caster:get_pos()
   532    539   					local what = minetest.get_objects_inside_radius(where, 3 + (2*ctx.stats.power))
   533    540   					local who = {}
   534    541   					local pfac = math.min(1, ctx.stats.power/8)
   535    542   					for _, w in pairs(what) do
   536    543   						if w:is_player() and w ~= ctx.caster then
................................................................................
   623    630   						};
   624    631   					}
   625    632   				end;
   626    633   				frame = {
   627    634   					iridium = {
   628    635   						name = 'Spellshatter';
   629    636   						desc = 'Blast out a tidal wave of anti-magic that will nullify active spells, but also disenchant or destroy all magical items in range of its violently mundane grip';
          637  +						sound = 'sorcery_disjoin';
   630    638   						cast = function(ctx)
   631    639   							local where = ctx.caster:get_pos()
   632    640   							local radius = 3 + (2*ctx.stats.power)
   633    641   							local what = minetest.get_objects_inside_radius(where, radius)
   634    642   							local who = {}
   635    643   							local pfac = math.min(1, ctx.stats.power/8)
   636    644   							for _, w in pairs(what) do
................................................................................
   685    693   											minsize = 0.7, maxsize = 2;
   686    694   											animation = {
   687    695   												type = 'vertical_frames', length = (21/6) + 0.1;
   688    696   												aspect_w = 16, aspect_h = 16;
   689    697   											}
   690    698   										}
   691    699   									end;
          700  +								};
          701  +								sounds = {
          702  +									[{whence=0,secs=0.8}] = {
          703  +										sound='sorcery_disjoin_bg', where=where;
          704  +										gain=0.5, stop = {whence=1,secs=-0.6}
          705  +									};
   692    706   								};
   693    707   								intervals = {
   694    708   									{period = 0.1, after = 0.15, fn = function(c)
   695    709   										for i = 1,80 do
   696    710   											local life = 0.2 + math.random() * 2
   697    711   											local dir = vector.new(math.random()-0.5,0,math.random()-0.5):normalize()
   698    712   											local pos = epicenter + (dir * (math.random()*radius))
................................................................................
   709    723   												}
   710    724   											}
   711    725   										end
   712    726   										if next(wreck) then
   713    727   											local k,p = sorcery.lib.tbl.pick(wreck)
   714    728   
   715    729   											minetest.add_particle {
   716         -												texture = sorcery.lib.image('sorcery_sparking.png'):glow(sorcery.lib.color(255,0,0)):render();
          730  +												texture = L.image('sorcery_sparking.png'):glow(L.color(0,255,0)):render();
   717    731   												pos = vector.offset(p,math.random(),math.random(),math.random());
   718    732   												expirationtime = 1;
   719    733   												size = 5 + math.random() * 4;
   720    734   												glow = 14;
   721    735   												animation = {
   722    736   													type = 'vertical_frames', length = 0.3;
   723    737   													aspect_w = 64, aspect_h = 64;
   724    738   												}
   725    739   											}
   726    740   											minetest.add_particle {
   727         -												texture = sorcery.lib.image('sorcery_crackle.png'):glow(sorcery.lib.color(255,0,0)):render();
          741  +												texture = L.image('sorcery_crackle.png'):glow(L.color(0,255,0)):render();
   728    742   												pos = vector.offset(p,math.random(),math.random(),math.random());
   729    743   												expirationtime = 1;
   730    744   												size = 4 + math.random() * 6;
   731    745   												glow = 14;
   732    746   												animation = {
   733         -													type = 'vertical_frames', length = 0.6;
          747  +													type = 'vertical_frames', length = 1.1;
   734    748   													aspect_w = 64, aspect_h = 64;
   735    749   												}
   736    750   											}
          751  +											if math.random(1,7) == 1 then
          752  +												minetest.sound_play('sorcery_' .. (math.random(1,2)==1 and 'rip' or 'crunch'), {
          753  +													pos = p;
          754  +													gain = math.random(5,13)*0.1;
          755  +												}, true)
          756  +												minetest.after(0.2, function() minetest.remove_node(p) end)
          757  +												sorcery.vfx.show {
          758  +													amount = 120, time = 0.3;
          759  +													kind = 'flicker', color = L.color(80,255,10);--(255,12,0);
          760  +													pos = p, radius = 0.4;
          761  +													velrange = 1, accrange = vector.new(0.0,0.2,0.0);
          762  +													minsize = 5, maxsize = 20;
          763  +													life = 0.6, varylife = 0.1;
          764  +												}
          765  +												sorcery.vfx.show {
          766  +													amount = 80, time = 0.2;
          767  +													minsize = 0.1, maxsize = 0.8;
          768  +													pos = p, radius = 0.6;
          769  +													node = minetest.get_node(p);
          770  +													vel = vector.new(0,7,0);
          771  +													velrange = vector.new(2, 4, 2);
          772  +													acc = vector.new(0,-9,0);
          773  +													life = 3, varylife = 0.4;
          774  +												}
          775  +												-- minetest.add_particlespawner {
          776  +												-- 	amount = 60, time = 0.2;
          777  +												-- 	texture = L.image('sorcery_flicker.png'):glow():render();
          778  +												-- 	minpos = vector.offset(p, -0.5, -0.5, -0.5);
          779  +												-- 	maxpos = vector.offset(p,  0.5,  0.5,  0.5);
          780  +												-- 	minacc = vector.new(0.0, -0.2, 0.0);
          781  +												-- 	maxacc = vector.new(0.0,  0.2, 0.0);
          782  +												-- 	minvel = vector.new(-1,-1,-1);
          783  +												-- 	maxvel = vector.new(1,1,1);
          784  +												-- 	minsize = 0.5, maxsize = 4;
          785  +												-- 	minexptime = 0.6, maxexptime = 0.7;
          786  +												-- 	animation = {
          787  +												-- 		type = 'vertical_frames';
          788  +												-- 		aspect_w = 16, aspect_h = 16;
          789  +												-- 		length = 0.8;
          790  +												-- 	}
          791  +												-- }
          792  +												table.remove(wreck,k)
          793  +											end
   737    794   										end
   738    795   									end};
   739    796   								};
   740    797   							}
   741    798   						end;
   742    799   					};
   743    800   				};
................................................................................
   744    801   			};
   745    802   		}
   746    803   	};
   747    804   	repulse = {
   748    805   		name = 'Repulse';
   749    806   		tone = {0,180,235};
   750    807   		minpower = 1;
   751         -		rarity = 5;
          808  +		rarity = 7;
   752    809   		amulets = {
   753    810   			amethyst = {
   754    811   				name = 'Hurling';
   755    812   				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';
   756    813   				cast = function(ctx)
   757    814   					if not (ctx.target and ctx.target.type == 'object') then return false end
   758    815   					local tgt = ctx.target.ref
   759    816   					local line = vector.subtract(ctx.caster:get_pos(), tgt:get_pos())
   760    817   					-- direction vector from target to caster
   761    818   					local dir,mag = sorcery.lib.math.vsep(line)
   762    819   					if mag > 6 then return false end -- no cheating!
   763    820   					local force = 20 + (ctx.stats.power * 2.5)
   764         -					minetest.sound_play('sorcery_hurl',{pos=tgt:get_pos()},true)
   765         -					local immortal = tgt:get_luaentity():get_armor_groups().immortal or 0
          821  +					minetest.sound_play('sorcery_slide',{pos=tgt:get_pos()},true)
          822  +					local immortal = 0
          823  +					-- if tgt and tgt.get_armor_groups then
          824  +						immortal = tgt:get_armor_groups().immortal or 0
          825  +					-- end
   766    826   					if minetest.is_player(tgt) or immortal == 0 then
   767    827   						tgt:punch(ctx.caster, 1, {
   768    828   							full_punch_interval = 1;
   769    829   							damage_groups = { fleshy = force / 10 };
   770    830   						})
   771    831   					end
   772    832   					sparktrail(nil,tgt,sorcery.lib.color(101,226,255))
................................................................................
   798    858   							end;
   799    859   							[{whence=0, secs=1}] = function(s)
   800    860   								s.affect {
   801    861   									duration = power * 0.50;
   802    862   									raise = 0.5;
   803    863   									-- fall = (power * 0.25) * 0.3;
   804    864   									impacts = {
   805         -										gravity = 0.1;
          865  +										gravity = 0.2;
   806    866   									};
   807    867   								}
   808    868   							end;
   809    869   						};
   810    870   						intervals = {
   811    871   							{period = 0.2, after = {whence=0, secs=2}; fn = function(c)
   812    872   							-- return gravity to normal once they touch down
................................................................................
   864    924   								for _,sub in pairs(s.subjects) do
   865    925   									sub.player:add_velocity{y=-power*2;x=0,z=0}
   866    926   								end
   867    927   							end or nil;
   868    928   						};
   869    929   						sounds = {
   870    930   							[0.3] = {
   871         -								sound = 'sorcery_hurl';
          931  +								sound = 'sorcery_slide';
   872    932   								where = 'subjects';
   873    933   								ephemeral = true;
   874    934   							};
   875    935   							[1] = (ctx.amulet.frame == 'cobalt') and {
   876    936   								sound = 'sorcery_hurl';
   877    937   								where = 'subjects';
   878    938   								ephemeral = true;
................................................................................
   904    964   				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';
   905    965   			};
   906    966   		};
   907    967   	};
   908    968   	obliterate = {
   909    969   		name = 'Obliterate';
   910    970   		tone = {255,0,10};
   911         -		minpower = 5;
   912         -		rarity = 30;
          971  +		minpower = 4;
          972  +		rarity = 10;
   913    973   		amulets = {
   914    974   			amethyst = {
   915    975   				name = 'Sapping';
   916    976   				desc = 'Punch a hole in enemy fortifications big enough to slip through but small enough to avoid immediate attention';
   917    977   			};
   918    978   			ruby = {
   919    979   				name = 'Shattering';
................................................................................
   963   1023   				};
   964   1024   			};
   965   1025   		};
   966   1026   	};
   967   1027   	excavate = {
   968   1028   		name = 'Excavate';
   969   1029   		tone = {0,68,235};
   970         -		minpower = 3;
   971         -		rarity = 17;
         1030  +		minpower = 2;
         1031  +		rarity = 9;
   972   1032   		amulets = {
   973   1033   			luxite = {
   974   1034   				name = 'Stonestride';
   975   1035   				desc = 'Rock walls will open up before you when you brandish this amulet before them, closing up again behind you without leaving a trace of your passage';
   976   1036   			};
   977   1037   			sapphire = {
   978   1038   				name = 'Tunnelling';
................................................................................
  1091   1151   				desc = 'Cut a wide shaft up into the ceiling of a cavern';
  1092   1152   			};
  1093   1153   		};
  1094   1154   	};
  1095   1155   	genesis = {
  1096   1156   		name = 'Genesis';
  1097   1157   		tone = {235,0,175};
  1098         -		minpower = 5;
  1099         -		rarity = 23;
         1158  +		minpower = 3;
         1159  +		rarity = 12;
  1100   1160   		amulets = {
  1101   1161   			amethyst = {
  1102   1162   				name = 'Shelter';
  1103   1163   				desc = 'Pour the power of this amulet into the soil or sand and out will grow a warm and well-lit place of shelter, no matter how far you may be from civilization.';
  1104   1164   				cast = function(ctx)
  1105   1165   					local ctr = ctx.caster:get_pos()
  1106   1166   					local dim = { rmax = 2 + 6 * (ctx.stats.power*0.1) }
................................................................................
  1710   1770   				};
  1711   1771   			};
  1712   1772   		};
  1713   1773   	};
  1714   1774   	dominate = {
  1715   1775   		name = 'Dominate';
  1716   1776   		tone = {235,0,228};
  1717         -		minpower = 4;
  1718         -		rarity = 13;
         1777  +		minpower = 3;
         1778  +		rarity = 12;
  1719   1779   		amulets = {
  1720   1780   			amethyst = {
  1721   1781   				name = 'Suffocation';
  1722   1782   				desc = 'Wrap this spell tightly around your victim\'s throat, cutting off their oxygen until you release them.';
  1723   1783   			};
  1724   1784   			emerald = {
  1725   1785   				name = 'Caging';

Modified gems.lua from [7d79adb54e] to [3215634528].

    87     87   					pos   = user:get_pos();
    88     88   					yaw   = user:get_look_dir();
    89     89   					pitch = user:get_look_vertical();
    90     90   					angle = user:get_look_horizontal();
    91     91   					eyeheight = user:get_properties().eye_height;
    92     92   				};
    93     93   
    94         -				sound = "xdecor_enchanting"; --FIXME make own sounds
           94  +				sound = sp.sound or "xdecor_enchanting"; --FIXME make own sounds
    95     95   				sparkle = true;
    96     96   			}
    97     97   			local res = sp.cast(ctx)
    98     98   
    99         -			if res == nil or res == true then
           99  +			if res == nil or res == true and ctx.sound then
   100    100   				minetest.sound_play(ctx.sound, { 
   101    101   					pos = user:get_pos();
   102    102   					gain = 1;
   103    103   				})
   104    104   			end
   105    105   			if ctx.sparkle then
   106         -				sorcery.vfx.cast_sparkle(user, ctx.color, stats.power,0.5)
          106  +				sorcery.vfx.cast_sparkle(user, ctx.color, stats.power,0.2)
   107    107   			end
   108    108   			local infinirune = minetest.check_player_privs(user, 'sorcery:infinirune')
   109    109   			if res == nil then
   110    110   				if not infinirune then sorcery.amulet.setrune(usedamulet) end
   111    111   			end
   112    112   
   113    113   			if stack:get_count() == 1 then
................................................................................
   164    164   				recipe = {
   165    165   					{amuletname};
   166    166   					{disc};
   167    167   					-- {'',  frag,''};
   168    168   					-- {frag,amuletname,frag};
   169    169   					-- {'',  frag,''};
   170    170   				};
          171  +			}
          172  +			minetest.register_craft {
          173  +				output = amuletname;
          174  +				type = 'shapeless';
          175  +				recipe = { framedid, 'xdecor:hammer'; };
          176  +				replacements = {
          177  +					{'xdecor:hammer', 'xdecor:hammer'};
          178  +					{framedid, disc};
          179  +				};
   171    180   			}
   172    181   		end)
   173    182   	end
   174    183   	minetest.register_craft {
   175    184   		type = 'shapeless';
   176    185   		recipe = (minetest.get_modpath('xdecor') and {
   177    186   			'xdecor:hammer', itemname;

Modified runeforge.lua from [b7d5d6135c] to [dd6f797d8b].

     2      2   -- to generate runes and that wears down over time, to make amulets more
     3      3   -- expensive than they currently are? the existing system is neat but
     4      4   -- i think amulets are a little overpowered for something that just
     5      5   -- passively consumes ley-current
     6      6   --  -- are phials & rune-wrenches enough for this now?
     7      7   
     8      8   local constants = {
     9         -	rune_mine_interval = 240;
            9  +	rune_mine_interval = 180;
    10     10   	-- how often a powered forge rolls for new runes
    11     11   
    12     12   	rune_cache_max = 6;
    13     13   	-- how many runes a runeforge can hold at a time
    14     14   	
    15     15   	rune_grades = {'Fragile', 'Weak', 'Ordinary', 'Pristine', 'Sublime'};
    16     16   	-- how many grades of rune quality/power there are
................................................................................
    40     40   	};
    41     41   }
    42     42   local calc_phial_props = function(phial) --> mine interval: float, power factor: float
    43     43   	local m = phial:get_meta()
    44     44   	local g = phial:get_definition()._proto.data.grade
    45     45   	local i = constants.rune_mine_interval 
    46     46   	local fac = (g-1) / 5
    47         -	fac = fac + 0.2 * m:get_int('speed')
           47  +	fac = fac + 0.1 * m:get_int('speed')
    48     48   	return math.max(3,i - ((i*0.5) * fac)), 0.5 * fac
    49     49   end
    50     50   sorcery.register.runes.foreach('sorcery:generate',{},function(name,rune)
    51     51   	local id = 'sorcery:rune_' .. name
    52     52   	rune.image = rune.image or string.format('sorcery_rune_%s.png',name)
    53     53   	rune.item = id
    54     54   	local c = sorcery.lib.color(rune.tone)
................................................................................
   226    226   	local proto = stack:get_definition()._sorcery.amulet
   227    227   	if not m:contains('amulet_rune') then return nil end
   228    228   	local rune = m:get_string('amulet_rune')
   229    229   	local rg = m:get_int('amulet_rune_grade')
   230    230   	local rd = sorcery.data.runes[rune]
   231    231   	local spell = rd.amulets[proto.base]
   232    232   	if not spell then return nil end
   233         -	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
          233  +	local title,desc,cast,apply,remove,mingrade,sound = spell.name, spell.desc, spell.cast, spell.apply, spell.remove, spell.mingrade,spell.sound -- FIXME in serious need of refactoring
   234    234   	local base_spell = true
   235    235   
   236    236   	if proto.frame and spell.frame and spell.frame[proto.frame] then
   237    237   		local sp = spell.frame[proto.frame]
   238    238   		if not sp.mingrade or rg >= sp.mingrade then
   239    239   			title = sp.name or title
   240    240   			desc = sp.desc or desc
   241    241   			cast = sp.cast or cast
   242    242   			apply = sp.apply or apply
   243    243   			remove = sp.remove or remove
   244    244   			mingrade = sp.mingrade or mingrade
          245  +			sound = sp.sound or sound
   245    246   			base_spell = false
   246    247   		end
   247    248   	end
   248    249   	
          250  +	-- PLEASE, GOD, REFACTOR ME
   249    251   	return {
   250    252   		rune = rune, grade = rg;
   251    253   		spell = spell, mingrade = mingrade;
   252         -		name = title, desc = desc;
          254  +		name = title, desc = desc, sound = sound;
   253    255   		cast = cast, apply = apply, remove = remove;
   254    256   		frame = proto.frame;
   255    257   		framestats = proto.frame and sorcery.data.metals[proto.frame].amulet;
   256    258   		tone = sorcery.lib.color(rd.tone);
   257    259   		base_spell = base_spell;
   258    260   	}
   259    261   end
................................................................................
   271    273   	if time and has_phial() and pow_min and not probe.disjunction then -- roll for runes
   272    274   		local phial = i:get_stack('phial',1)
   273    275   		local int, powerfac = calc_phial_props(phial)
   274    276   		local pf = phial:get_meta():get_int('force')
   275    277   		local rolls = math.floor(time/int)
   276    278   		local newrunes = {}
   277    279   		for _=1,rolls do
          280  +			print('--- rune roll',_,'pf',pf)
   278    281   			local choices = {}
   279    282   			for name,rune in pairs(sorcery.data.runes) do
   280         -				-- print('considering',name)
   281         -				-- print('-- power',rune.minpower,(rune.minpower*powerfac)*time,'//',l.self.powerdraw,l.self.powerdraw/time,'free',l.freepower,'max',l.maxpower)
   282         -				if (rune.minpower*powerfac)*time <= l.self.powerdraw and math.random(rune.rarity - pf) == 1 then
          283  +				local powreq = (rune.minpower*powerfac)*time 
          284  +				print('- rune', name)
          285  +				print('powreq',powreq)
          286  +				print('power draw',l.self.powerdraw)
          287  +				if powreq <= l.self.powerdraw then
          288  +					print(' ! sufficient power for rune')
   283    289   					choices[#choices + 1] = rune
   284    290   				end
   285    291   			end
          292  +			for k,v in pairs(choices) do print(' * choice',k,v.item) end
   286    293   			if #choices > 0 then
   287         -				-- if multiple runes were rolled up, be nice to the player
   288         -				-- and pick the rarest one to give them
   289         -				local rare, choice = 0
   290         -				for i,c in pairs(choices) do
   291         -					if c.rarity > rare then
   292         -						rare = c.rarity
   293         -						choice = c
          294  +				for try = 1,#choices do
          295  +					print(' -- try',try)
          296  +					local _, choice = sorcery.lib.tbl.pick(choices)
          297  +					local adjrare = math.max(2, choice.rarity - pf)
          298  +					print(choice.item,'rarity',choice.rarity, 'adjusted', adjrare)
          299  +					if math.random(adjrare) == 1 then
          300  +						print(' ! picking ', choice.item)
          301  +						newrunes[#newrunes + 1] = ItemStack(choice.item)
          302  +						break
   294    303   					end
   295    304   				end
   296         -				newrunes[#newrunes + 1] = ItemStack(choice.item)
   297    305   			end
   298    306   			-- print('rune choices:',dump(choices))
   299    307   			-- print('me',dump(l.self))
   300    308   		end
   301    309   
   302    310   		for _,r in pairs(newrunes) do
   303    311   			if i:room_for_item('cache',r) and has_phial() then
................................................................................
   420    428   		local i = m:get_inventory()
   421    429   		i:set_size('cache',constants.rune_cache_max)
   422    430   		i:set_size('wrench',1) i:set_size('phial',1) i:set_size('refuse',1)
   423    431   		i:set_size('amulet',1) i:set_size('active',1)
   424    432   		m:set_string('infotext','Rune Forge')
   425    433   		runeforge_update(pos)
   426    434   	end;
   427         -	after_dig_node = sorcery.lib.node.purge_only {'amulet','wrench'};
          435  +	after_dig_node = sorcery.lib.node.purge_only {'amulet','wrench','refuse','phial'};
   428    436   	on_timer = runeforge_update;
   429    437   	on_metadata_inventory_move = function(pos, fl,fi, tl,ti, count, user)
   430    438   		local inv = minetest.get_meta(pos):get_inventory()
   431    439   		local wrench if not inv:is_empty('wrench') then
   432    440   			wrench = inv:get_stack('wrench',1):get_definition()._proto
   433    441   		end
   434    442   		local wwear = function(cap)

Modified textures/sorcery_aether_coruscator.png from [cd811a55fe] to [ef8ded092e].

cannot compute difference between binary files

Modified textures/sorcery_aetherial_harmonizer.png from [8e627df916] to [4b86394030].

cannot compute difference between binary files

Modified textures/sorcery_aluminum_fragment.png from [a37622efed] to [9574722f6b].

cannot compute difference between binary files

Modified textures/sorcery_aluminum_ore.png from [9daddeb433] to [c64ced441f].

cannot compute difference between binary files

Modified textures/sorcery_aluminum_pick.png from [00ec310e93] to [266ffd0854].

cannot compute difference between binary files

Modified textures/sorcery_aluminum_powder.png from [90765bbba2] to [ee8894f642].

cannot compute difference between binary files

Modified textures/sorcery_aluminum_sword.png from [0a9f808a14] to [d3ff62c552].

cannot compute difference between binary files

Modified textures/sorcery_amulet.png from [9548ac041a] to [1fec4bee23].

cannot compute difference between binary files

Modified textures/sorcery_amulet_frame_cobalt.png from [3cd2449b29] to [03581951d2].

cannot compute difference between binary files

Modified textures/sorcery_amulet_frame_gold.png from [c26ecea1e3] to [3f4e9ea977].

cannot compute difference between binary files

Modified textures/sorcery_amulet_frame_iridium.png from [9dc3aa0c0f] to [1a2fff3d07].

cannot compute difference between binary files

Modified textures/sorcery_amulet_frame_tungsten.png from [6075b8196a] to [22b5ae6c57].

cannot compute difference between binary files

Modified textures/sorcery_amulet_sparkle.png from [060f589cac] to [5b0e4685c3].

cannot compute difference between binary files

Modified textures/sorcery_beam_generator.png from [58c2e4401c] to [1ec60caf50].

cannot compute difference between binary files

Modified textures/sorcery_blood_1.png from [e5a6d411e5] to [8153f7cf4e].

cannot compute difference between binary files

Modified textures/sorcery_blood_2.png from [af7224a5c6] to [d5817418ba].

cannot compute difference between binary files

Modified textures/sorcery_blood_3.png from [f78b6f9ea8] to [ad48fab8a0].

cannot compute difference between binary files

Modified textures/sorcery_blood_4.png from [52377a856a] to [745c8db451].

cannot compute difference between binary files

Modified textures/sorcery_blood_5.png from [9fed30d56f] to [51ee6b5f1f].

cannot compute difference between binary files

Modified textures/sorcery_brass_fragment.png from [2e8179d88a] to [cc5a4e4152].

cannot compute difference between binary files

Modified textures/sorcery_brass_powder.png from [72cc1a227d] to [cd2377aade].

cannot compute difference between binary files

Modified textures/sorcery_bronze_fragment.png from [b4c2175ac8] to [dedcc5bbc6].

cannot compute difference between binary files

Modified textures/sorcery_bronze_powder.png from [1f5965ab69] to [fb42fde961].

cannot compute difference between binary files

Modified textures/sorcery_candle.png from [bf169bc9fa] to [a860a8d7fc].

cannot compute difference between binary files

Modified textures/sorcery_catalytic_convector.png from [2535be977e] to [3b085d96b6].

cannot compute difference between binary files

Modified textures/sorcery_cobalt_fragment.png from [dd9ea5f70e] to [98ee8532da].

cannot compute difference between binary files

Modified textures/sorcery_cobalt_ore.png from [09827dfd82] to [ff7d7d7cef].

cannot compute difference between binary files

Modified textures/sorcery_cobalt_pick.png from [a29aae0a50] to [7f702b0fbe].

cannot compute difference between binary files

Modified textures/sorcery_cobalt_powder.png from [d40093df7d] to [874e60d86a].

cannot compute difference between binary files

Modified textures/sorcery_cobalt_sword.png from [9f00538add] to [8fd70120db].

cannot compute difference between binary files

Modified textures/sorcery_cobalt_wire.png from [1bbb441d29] to [b509f09889].

cannot compute difference between binary files

Modified textures/sorcery_coin.png from [fc92861388] to [8fd4284f0d].

cannot compute difference between binary files

Modified textures/sorcery_coin_gem.png from [ea0d6b6069] to [8e6a28e6e9].

cannot compute difference between binary files

Modified textures/sorcery_condenser.png from [4dc6d2863f] to [ba9b67f5dd].

cannot compute difference between binary files

Modified textures/sorcery_conduction_plate.png from [1b9d9e47f7] to [569cc0eaa4].

cannot compute difference between binary files

Modified textures/sorcery_conduit_copper_side.png from [f1ead52faf] to [e61b6a63b2].

cannot compute difference between binary files

Modified textures/sorcery_conduit_copper_top.png from [8c1a859f77] to [f69ba0084f].

cannot compute difference between binary files

Modified textures/sorcery_copper_fragment.png from [b7d00a6825] to [3179ea111e].

cannot compute difference between binary files

Modified textures/sorcery_copper_powder.png from [f251fc6c10] to [c1fe22dcc4].

cannot compute difference between binary files

Modified textures/sorcery_core_counterpraxic.png from [e3aaf06222] to [6f1a036a92].

cannot compute difference between binary files

Modified textures/sorcery_core_mandatic.png from [b6c2d06b72] to [dab110f4ea].

cannot compute difference between binary files

Modified textures/sorcery_core_syncretic.png from [e7d1b92a14] to [6de85ad6bc].

cannot compute difference between binary files

Modified textures/sorcery_crackle.png from [58d455dd12] to [11403faf13].

cannot compute difference between binary files

Modified textures/sorcery_crucible_aluminum.png from [f493780a48] to [13ed85cb3b].

cannot compute difference between binary files

Modified textures/sorcery_crucible_clay.png from [2dfb16403b] to [3519f10e3d].

cannot compute difference between binary files

Modified textures/sorcery_crucible_clay_molding.png from [a6928655d6] to [061078d6a0].

cannot compute difference between binary files

Modified textures/sorcery_crucible_duridium.png from [3b1e95eec0] to [4d7265a4f9].

cannot compute difference between binary files

Modified textures/sorcery_crucible_platinum.png from [a6c806c3a1] to [1298eb990a].

cannot compute difference between binary files

Modified textures/sorcery_current_felicitator.png from [377884433f] to [9355b87323].

cannot compute difference between binary files

Modified textures/sorcery_dagger.png from [90260263cf] to [0ca4097d99].

cannot compute difference between binary files

Modified textures/sorcery_dagger_glow.png from [cc2d006b05] to [5d9ea2ede5].

cannot compute difference between binary files

Modified textures/sorcery_diamond_outline.png from [8801c22cef] to [9adb5df4bc].

cannot compute difference between binary files

Modified textures/sorcery_disc.png from [3f68afb16e] to [bc968d78ab].

cannot compute difference between binary files

Modified textures/sorcery_disc_impervium.png from [0d454327bd] to [13b9208b67].

cannot compute difference between binary files

Modified textures/sorcery_disc_steel.png from [c212e5c1db] to [b60afdee98].

cannot compute difference between binary files

Modified textures/sorcery_displacer_front.png from [51a09bc368] to [9e76e12626].

cannot compute difference between binary files

Modified textures/sorcery_displacer_module_receive.png from [99916d60d5] to [16111f41c9].

cannot compute difference between binary files

Modified textures/sorcery_displacer_module_transmit.png from [ee8e01ea67] to [b9979946af].

cannot compute difference between binary files

Modified textures/sorcery_displacer_side.png from [fe755fceaa] to [ec69661229].

cannot compute difference between binary files

Modified textures/sorcery_displacer_top.png from [e8a57f9374] to [cb61014c08].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_1.png from [a6051837ed] to [ddc9fe807b].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_2.png from [67375e0690] to [6a7336b32a].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_3.png from [96e1d5aad2] to [725cfae3e3].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_4.png from [9188276ad6] to [d5da0c9ca4].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_5.png from [5857f30d4c] to [75055879e8].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_6.png from [fa85d0503b] to [4a09fda5ff].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_7.png from [00207df4e6] to [098c2df953].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_8.png from [478d15d1bd] to [e71d40a586].

cannot compute difference between binary files

Modified textures/sorcery_divine_radiance_9.png from [494a990e0a] to [d8f42ceb7d].

cannot compute difference between binary files

Modified textures/sorcery_draconium_fragment.png from [daf6a96b07] to [2908882477].

cannot compute difference between binary files

Modified textures/sorcery_draconium_pick.png from [0594568178] to [9e40f49107].

cannot compute difference between binary files

Modified textures/sorcery_draconium_powder.png from [83c429250a] to [8e48b03577].

cannot compute difference between binary files

Modified textures/sorcery_draconium_sword.png from [d24b6d0aca] to [bc77e36a19].

cannot compute difference between binary files

Modified textures/sorcery_drop.png from [7237a7e209] to [133f7a521a].

cannot compute difference between binary files

Modified textures/sorcery_droplet.png from [fee2bce25e] to [a09e40590d].

cannot compute difference between binary files

Modified textures/sorcery_duranium_fragment.png from [7d415a62db] to [077c08e9af].

cannot compute difference between binary files

Modified textures/sorcery_duridium_fragment.png from [7d415a62db] to [077c08e9af].

cannot compute difference between binary files

Modified textures/sorcery_duridium_pick.png from [6a881a18af] to [f12fe7b0aa].

cannot compute difference between binary files

Modified textures/sorcery_duridium_powder.png from [1bb4df86fd] to [88377dbc48].

cannot compute difference between binary files

Modified textures/sorcery_duridium_sword.png from [7b322d9198] to [dddcd9f1da].

cannot compute difference between binary files

Modified textures/sorcery_electrum_fragment.png from [c636d62fc0] to [bb9078b46f].

cannot compute difference between binary files

Modified textures/sorcery_electrum_powder.png from [18417a63d0] to [ea77279751].

cannot compute difference between binary files

Modified textures/sorcery_emitter_barrier_bottom.png from [a6363e789d] to [e3f591cf0c].

cannot compute difference between binary files

Modified textures/sorcery_emitter_barrier_front.png from [76e1531fe0] to [b59c06e452].

cannot compute difference between binary files

Modified textures/sorcery_emitter_barrier_side.png from [b566c1148a] to [c02b037e5e].

cannot compute difference between binary files

Modified textures/sorcery_emitter_barrier_top.png from [2705ace703] to [407d79fc4a].

cannot compute difference between binary files

Modified textures/sorcery_enchant_conserve.png from [3451249f04] to [1301a377b9].

cannot compute difference between binary files

Modified textures/sorcery_enchant_dowse.png from [efa02ac638] to [99266215cd].

cannot compute difference between binary files

Modified textures/sorcery_enchant_endure.png from [84094793b8] to [b01372f23b].

cannot compute difference between binary files

Modified textures/sorcery_enchant_glimmer.png from [d92d1302fd] to [4ff8e2f006].

cannot compute difference between binary files

Modified textures/sorcery_enchant_glitter.png from [2872a22baf] to [294d38acb7].

cannot compute difference between binary files

Modified textures/sorcery_enchant_harvest.png from [40b1201c27] to [ce00330cc8].

cannot compute difference between binary files

Modified textures/sorcery_enchant_pierce.png from [fd3ecbaa4b] to [1c91a96d16].

cannot compute difference between binary files

Modified textures/sorcery_enchant_rend.png from [3f9d55bb9f] to [2a27ddf4a2].

cannot compute difference between binary files

Modified textures/sorcery_enchanter_bg.png from [5aab98de3b] to [e2caa4526a].

cannot compute difference between binary files

Modified textures/sorcery_enchanter_channeler.png from [cf624a00b3] to [311bd87431].

cannot compute difference between binary files

Modified textures/sorcery_enchanter_glyphs.png from [55cb1589bc] to [2d060cc1bf].

cannot compute difference between binary files

Modified textures/sorcery_enchanter_pedestal.png from [acba9558af] to [db8269e799].

cannot compute difference between binary files

Modified textures/sorcery_enchanter_ui.png from [2d2ff89774] to [34bdb14b1b].

cannot compute difference between binary files

Modified textures/sorcery_erasure_fluid_bottle.png from [6cc2e06a0c] to [8a59856008].

cannot compute difference between binary files

Modified textures/sorcery_essence_flame.png from [ad79abd24b] to [777e110dcc].

cannot compute difference between binary files

Modified textures/sorcery_essence_force.png from [e8aa8d2e8b] to [c37f2aa5e9].

cannot compute difference between binary files

Modified textures/sorcery_essence_frost.png from [22caf1a2b1] to [b53df8d88a].

cannot compute difference between binary files

Modified textures/sorcery_eternium_fragment.png from [e8291dc4b5] to [be88feb60c].

cannot compute difference between binary files

Modified textures/sorcery_eternium_pick.png from [441dd90fc1] to [e088b95e90].

cannot compute difference between binary files

Modified textures/sorcery_eternium_powder.png from [48054b80d7] to [eca77e6cdf].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_linear_bottom.png from [118744afe2] to [ec7f1adaaf].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_linear_side.png from [408a859773] to [a66c6e761a].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_linear_top.png from [4fda01e825] to [1126e70441].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_nonlocal_back.png from [2b03768188] to [582b9e44c1].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_nonlocal_front.png from [c925e1401d] to [92980f867a].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_nonlocal_side.png from [c091ae564e] to [d474244d5b].

cannot compute difference between binary files

Modified textures/sorcery_farcaster_nonlocal_top.png from [b273235492] to [f30e3af893].

cannot compute difference between binary files

Modified textures/sorcery_field_emitter.png from [aee8d20a12] to [e8d66640fa].

cannot compute difference between binary files

Modified textures/sorcery_fireball.png from [6de20cfcd2] to [5020807d4b].

cannot compute difference between binary files

Modified textures/sorcery_flicker.png from [d2be38b136] to [6b9cc64d8b].

cannot compute difference between binary files

Modified textures/sorcery_fog.png from [f33fe7d904] to [54da5feb7d].

cannot compute difference between binary files

Modified textures/sorcery_gem_amethyst.png from [de673e3513] to [c8be7c174e].

cannot compute difference between binary files

Modified textures/sorcery_gem_amethyst_shard.png from [01ea7e16ed] to [bccc8fde38].

cannot compute difference between binary files

Modified textures/sorcery_gem_diamond_shard.png from [1d314919ff] to [bdde34f8ca].

cannot compute difference between binary files

Modified textures/sorcery_gem_emerald.png from [a6ac5a662a] to [a60cde7bef].

cannot compute difference between binary files

Modified textures/sorcery_gem_emerald_shard.png from [79e596eb64] to [f28336e9c6].

cannot compute difference between binary files

Modified textures/sorcery_gem_lumite.png from [da90c310c7] to [b63ba0ca88].

cannot compute difference between binary files

Modified textures/sorcery_gem_lumite_shard.png from [551a18760e] to [3ab328367e].

cannot compute difference between binary files

Modified textures/sorcery_gem_luxite.png from [da90c310c7] to [b63ba0ca88].

cannot compute difference between binary files

Modified textures/sorcery_gem_luxite_shard.png from [551a18760e] to [3ab328367e].

cannot compute difference between binary files

Modified textures/sorcery_gem_ruby.png from [612ff8492f] to [f89a7441f3].

cannot compute difference between binary files

Modified textures/sorcery_gem_ruby_shard.png from [4eb5d055b0] to [ff3210a5a6].

cannot compute difference between binary files

Modified textures/sorcery_gem_sapphire.png from [b347de3f3d] to [10737a5165].

cannot compute difference between binary files

Modified textures/sorcery_gem_sapphire_shard.png from [d7fa09ef8c] to [a46db5e6ab].

cannot compute difference between binary files

Modified textures/sorcery_glitter.png from [e4de7bf843] to [68702f63cd].

cannot compute difference between binary files

Modified textures/sorcery_gold_fragment.png from [f362acc18f] to [13b199ae10].

cannot compute difference between binary files

Modified textures/sorcery_gold_powder.png from [e415c0e827] to [fcdafae53c].

cannot compute difference between binary files

Modified textures/sorcery_gravitator_panel_crush.png from [61f151d4e3] to [db791d2a32].

cannot compute difference between binary files

Modified textures/sorcery_gravitator_panel_lift.png from [607e0d2a18] to [6f9704c7db].

cannot compute difference between binary files

Modified textures/sorcery_gravitator_panel_off.png from [4ef1021164] to [836086ef6b].

cannot compute difference between binary files

Modified textures/sorcery_gravitator_panel_slow.png from [d6bbdcb829] to [f5341611aa].

cannot compute difference between binary files

Modified textures/sorcery_gravitator_panel_stop.png from [99c6937d1a] to [f6b2e33a53].

cannot compute difference between binary files

Modified textures/sorcery_gravitator_side.png from [f72e073bca] to [4895a48537].

cannot compute difference between binary files

Modified textures/sorcery_gravity_manipulator.png from [f01b379bf4] to [91d444b4f4].

cannot compute difference between binary files

Modified textures/sorcery_harvester_receptacle.png from [300237c666] to [914ca70906].

cannot compute difference between binary files

Modified textures/sorcery_impervium_fragment.png from [d92d8970c5] to [9bb3a8eb39].

cannot compute difference between binary files

Modified textures/sorcery_impervium_pick.png from [72b553feae] to [57471b194f].

cannot compute difference between binary files

Modified textures/sorcery_impervium_powder.png from [a542329e06] to [d050a364bf].

cannot compute difference between binary files

Modified textures/sorcery_inferno_crystal.png from [1a58b10f86] to [b73b017129].

cannot compute difference between binary files

Modified textures/sorcery_infuser_chamber.png from [05e93c632f] to [e2535a24ae].

cannot compute difference between binary files

Modified textures/sorcery_infuser_concentrator.png from [3fa2cbf91c] to [9c16ac7a5e].

cannot compute difference between binary files

Modified textures/sorcery_infuser_mod_prolongator.png from [ac985c3831] to [9dbfc1bc9d].

cannot compute difference between binary files

Modified textures/sorcery_infuser_tube.png from [631bf73fd1] to [f2c4355ae2].

cannot compute difference between binary files

Modified textures/sorcery_ingot_outline.png from [aa2b24c821] to [1a5d835f01].

cannot compute difference between binary files

Modified textures/sorcery_ink_bottle.png from [9cd1cb7026] to [892526e75d].

cannot compute difference between binary files

Modified textures/sorcery_inversion_matrix.png from [13e557b968] to [cd0e1d72d7].

cannot compute difference between binary files

Modified textures/sorcery_inverter_coil.png from [a40914f554] to [e999d85e84].

cannot compute difference between binary files

Modified textures/sorcery_iridium_fragment.png from [688bc8d1fa] to [70a8b31eff].

cannot compute difference between binary files

Modified textures/sorcery_iridium_ore.png from [b017777bda] to [3054ee871d].

cannot compute difference between binary files

Modified textures/sorcery_iridium_pick.png from [c38156cead] to [1b982747f1].

cannot compute difference between binary files

Modified textures/sorcery_iridium_powder.png from [aef440b9aa] to [4df6ac8a78].

cannot compute difference between binary files

Modified textures/sorcery_iridium_sword.png from [1e823db68a] to [b79feb1de3].

cannot compute difference between binary files

Modified textures/sorcery_lens_amplifier.png from [115f332269] to [5982043abf].

cannot compute difference between binary files

Modified textures/sorcery_lens_concave.png from [ea0ab99b0c] to [2efe2f207a].

cannot compute difference between binary files

Modified textures/sorcery_lens_convex.png from [a982f601d4] to [9216161265].

cannot compute difference between binary files

Modified textures/sorcery_lens_overlay_gold.png from [fba3b50dd8] to [6b3481be9c].

cannot compute difference between binary files

Modified textures/sorcery_lens_rectifier.png from [227ae0dc1a] to [b0bb9ed6e5].

cannot compute difference between binary files

Modified textures/sorcery_levitanium_fragment.png from [133d713fe8] to [b36743db0c].

cannot compute difference between binary files

Modified textures/sorcery_levitanium_ore.png from [dbc5d31e75] to [5768663650].

cannot compute difference between binary files

Modified textures/sorcery_levitanium_powder.png from [9eacd80255] to [e857d7bb5a].

cannot compute difference between binary files

Modified textures/sorcery_ley_generator_back.png from [aedb4f096c] to [5df1b6633b].

cannot compute difference between binary files

Modified textures/sorcery_ley_generator_bottom.png from [f23afab857] to [eecf96db0a].

cannot compute difference between binary files

Modified textures/sorcery_ley_generator_front_off.png from [811455addd] to [243e09162e].

cannot compute difference between binary files

Modified textures/sorcery_ley_generator_front_on.png from [cf5b54dd34] to [1e8fa85829].

cannot compute difference between binary files

Modified textures/sorcery_ley_generator_side.png from [07ad2d2926] to [39496d6436].

cannot compute difference between binary files

Modified textures/sorcery_ley_generator_top.png from [7147d2203f] to [9da026953e].

cannot compute difference between binary files

Modified textures/sorcery_ley_plug.png from [ac3ad24938] to [6462e62704].

cannot compute difference between binary files

Modified textures/sorcery_ley_puncture.png from [5c29b49287] to [8d1e9b2b53].

cannot compute difference between binary files

Modified textures/sorcery_ley_switch_base.png from [eca6656993] to [527cc6653e].

cannot compute difference between binary files

Modified textures/sorcery_ley_switch_down.png from [5722e6a77c] to [282f727f8c].

cannot compute difference between binary files

Modified textures/sorcery_ley_switch_panel.png from [3f4a278966] to [a1c1ee522c].

cannot compute difference between binary files

Modified textures/sorcery_ley_switch_up.png from [3e480e03fd] to [9e8feb4fbb].

cannot compute difference between binary files

Modified textures/sorcery_leyline_stabilizer.png from [148e93c8c1] to [3f0a5ceb18].

cannot compute difference between binary files

Modified textures/sorcery_lithium_fragment.png from [a9d6a0503b] to [9f0581e647].

cannot compute difference between binary files

Modified textures/sorcery_lithium_ore.png from [99373498fd] to [e5f359834f].

cannot compute difference between binary files

Modified textures/sorcery_lithium_powder.png from [c8272b7787] to [2b446abc7f].

cannot compute difference between binary files

Modified textures/sorcery_metal_iridium.png from [0232c814fa] to [60a3284edb].

cannot compute difference between binary files

Modified textures/sorcery_metal_iridium_shiny.png from [f46801542e] to [35606819aa].

cannot compute difference between binary files

Modified textures/sorcery_metal_vidrium.png from [59842011f5] to [b7efc17a80].

cannot compute difference between binary files

Modified textures/sorcery_metal_vidrium_shiny.png from [5b59bab96d] to [b2090df4b7].

cannot compute difference between binary files

Modified textures/sorcery_mill_back.png from [7495982119] to [bdcd6ac298].

cannot compute difference between binary files

Modified textures/sorcery_mill_bottom.png from [2a6d4c6eae] to [7e58767ec0].

cannot compute difference between binary files

Modified textures/sorcery_mill_front.png from [a435aaac6a] to [1d1b1f7c24].

cannot compute difference between binary files

Modified textures/sorcery_mill_grindhead.png from [7f26b51b05] to [b09f142f3e].

cannot compute difference between binary files

Modified textures/sorcery_mill_grindhead_shade.png from [9d6a7ea7b2] to [063526191a].

cannot compute difference between binary files

Modified textures/sorcery_mill_side.png from [6da51e5a57] to [4a17318392].

cannot compute difference between binary files

Modified textures/sorcery_mill_top.png from [790b4e6ed9] to [21aee0b42b].

cannot compute difference between binary files

Modified textures/sorcery_moon_phases.png from [acb81162df] to [2299bafb0b].

cannot compute difference between binary files

Modified textures/sorcery_node_liquid.png from [1e803e25e4] to [fe30ef36c1].

cannot compute difference between binary files

Modified textures/sorcery_oil_dull.png from [b7e1fbe16b] to [64e8cd8c6c].

cannot compute difference between binary files

Modified textures/sorcery_oil_sparkle.png from [878f389914] to [1f3e53e61d].

cannot compute difference between binary files

Modified textures/sorcery_pen.png from [dbab6605a4] to [65c4b663ec].

cannot compute difference between binary files

Modified textures/sorcery_pen_nib.png from [20a8f60412] to [616e59b551].

cannot compute difference between binary files

Modified textures/sorcery_pentacle.png from [52fed99c8a] to [ab5a8c3ebd].

cannot compute difference between binary files

Modified textures/sorcery_pentacle_power_cognic.png from [f3393f63e3] to [46f323c326].

cannot compute difference between binary files

Modified textures/sorcery_pentacle_power_counterpraxic.png from [8766a9b24c] to [f8ea8d9d7e].

cannot compute difference between binary files

Modified textures/sorcery_pentacle_power_entropic.png from [931aa622a8] to [7dead51a70].

cannot compute difference between binary files

Modified textures/sorcery_pentacle_power_praxic.png from [1cf736ae19] to [1b7af7a718].

cannot compute difference between binary files

Modified textures/sorcery_pentacle_power_syncretic.png from [5db686cb80] to [33959b1dbd].

cannot compute difference between binary files

Modified textures/sorcery_pipe.png from [b548e1e3c7] to [50199b07e1].

cannot compute difference between binary files

Modified textures/sorcery_planet_phases.png from [e8e7b4670e] to [3cadff195c].

cannot compute difference between binary files

Modified textures/sorcery_platinum_fragment.png from [f3d2d85804] to [2177764a1d].

cannot compute difference between binary files

Modified textures/sorcery_platinum_ore.png from [4ec4985ec9] to [c2d5506651].

cannot compute difference between binary files

Modified textures/sorcery_platinum_pick.png from [d53a4d228b] to [c328ca6615].

cannot compute difference between binary files

Modified textures/sorcery_platinum_powder.png from [a2a2fa62a8] to [6fc8d84ce3].

cannot compute difference between binary files

Modified textures/sorcery_platinum_sword.png from [df7ab5492d] to [05e2aa4dda].

cannot compute difference between binary files

Modified textures/sorcery_portal_front.png from [64f724c208] to [0374434c0a].

cannot compute difference between binary files

Modified textures/sorcery_portal_pad_bottom.png from [be4807eea7] to [54968c7287].

cannot compute difference between binary files

Modified textures/sorcery_portal_pad_front.png from [1bc5617d20] to [7f0c95b287].

cannot compute difference between binary files

Modified textures/sorcery_portal_pad_side.png from [c75e2555a9] to [eb5eacf924].

cannot compute difference between binary files

Modified textures/sorcery_portal_pad_top.png from [accc2af1a9] to [29a5372045].

cannot compute difference between binary files

Modified textures/sorcery_portal_side.png from [df1d5fcacb] to [ab76207eff].

cannot compute difference between binary files

Modified textures/sorcery_portal_top.png from [ce9e9950a7] to [35bea40663].

cannot compute difference between binary files

Modified textures/sorcery_powder_firestorm.png from [c9ba8b2b43] to [f6c4278cf5].

cannot compute difference between binary files

Modified textures/sorcery_pulp.png from [27b1ecfa58] to [4e21886c16].

cannot compute difference between binary files

Modified textures/sorcery_pulp_inky.png from [386c7a53ef] to [560fec792b].

cannot compute difference between binary files

Modified textures/sorcery_pulp_sheet.png from [b7b1aab632] to [5222a83e1b].

cannot compute difference between binary files

Modified textures/sorcery_pulse_rectifier.png from [c06567df62] to [0865c3361f].

cannot compute difference between binary files

Modified textures/sorcery_punchcard.png from [d1c8b3f9f3] to [0ea8ff0f48].

cannot compute difference between binary files

Modified textures/sorcery_punchcard_punched.png from [7a6b5d17b3] to [ca795e2dbe].

cannot compute difference between binary files

Modified textures/sorcery_radiatic_filament.png from [843838bba4] to [89e693781a].

cannot compute difference between binary files

Modified textures/sorcery_rune_disjoin.png from [a7f795bf63] to [72e49d923f].

cannot compute difference between binary files

Modified textures/sorcery_rune_dominate.png from [d2ed48d357] to [b8e0b6b571].

cannot compute difference between binary files

Modified textures/sorcery_rune_excavate.png from [916ec7193a] to [77e4e7dea1].

cannot compute difference between binary files

Modified textures/sorcery_rune_genesis.png from [7091d5d260] to [f8d6278438].

cannot compute difference between binary files

Modified textures/sorcery_rune_luminate.png from [2fa0002e5a] to [18a2327f22].

cannot compute difference between binary files

Modified textures/sorcery_rune_obliterate.png from [1d8576869e] to [e848733528].

cannot compute difference between binary files

Modified textures/sorcery_rune_repulse.png from [821db474a1] to [b4c2786163].

cannot compute difference between binary files

Modified textures/sorcery_rune_translocate.png from [662d2c9a2c] to [babe9ce634].

cannot compute difference between binary files

Modified textures/sorcery_rune_wrench.png from [c39260a038] to [98bfac0275].

cannot compute difference between binary files

Modified textures/sorcery_rune_wrench_iridium.png from [076b434e79] to [a7092598d7].

cannot compute difference between binary files

Modified textures/sorcery_scissors_aluminum.png from [2d37a11f3d] to [959ef39532].

cannot compute difference between binary files

Modified textures/sorcery_scissors_bronze.png from [d1baf6e9c4] to [596e05fba0].

cannot compute difference between binary files

Modified textures/sorcery_scissors_iridium.png from [19c8d02f68] to [c38fe839da].

cannot compute difference between binary files

Modified textures/sorcery_scissors_steel.png from [4a46c3698e] to [131246ae3a].

cannot compute difference between binary files

Modified textures/sorcery_scissors_tungsten.png from [b8529839fc] to [ed729af6de].

cannot compute difference between binary files

Modified textures/sorcery_screw.png from [0f1a74e38b] to [499de43308].

cannot compute difference between binary files

Modified textures/sorcery_silver_fragment.png from [971b79b54a] to [492d990569].

cannot compute difference between binary files

Modified textures/sorcery_silver_ore.png from [8e84c2f224] to [276c706809].

cannot compute difference between binary files

Modified textures/sorcery_silver_powder.png from [084c4156da] to [58a4278ca7].

cannot compute difference between binary files

Modified textures/sorcery_smelter_bottom.png from [e669ec6634] to [6f77986f02].

cannot compute difference between binary files

Modified textures/sorcery_smelter_front.png from [82848fe3a3] to [7632308bf9].

cannot compute difference between binary files

Modified textures/sorcery_smelter_front_hot.png from [2516f6fec9] to [41dfd6fa08].

cannot compute difference between binary files

Modified textures/sorcery_smelter_side.png from [c2098d1960] to [732beda4c9].

cannot compute difference between binary files

Modified textures/sorcery_smelter_top_2.png from [9b04da96f9] to [48ef3075d2].

cannot compute difference between binary files

Modified textures/sorcery_smelter_top_3.png from [63a8f0ebfc] to [e35b972ec2].

cannot compute difference between binary files

Modified textures/sorcery_smelter_top_4.png from [40859d3ac3] to [0f48811e4d].

cannot compute difference between binary files

Modified textures/sorcery_sparking.png from [6a1bae8d93] to [2f5ee50cea].

cannot compute difference between binary files

Modified textures/sorcery_sparkle.png from [6a08a098f8] to [6895bd99f2].

cannot compute difference between binary files

Modified textures/sorcery_sputter.png from [3a75e25024] to [f603c89b6c].

cannot compute difference between binary files

Modified textures/sorcery_statlamp_blue.png from [6a04f2cd64] to [0074d91b2b].

cannot compute difference between binary files

Modified textures/sorcery_statlamp_green.png from [298a31bc72] to [c6a5ed415b].

cannot compute difference between binary files

Modified textures/sorcery_statlamp_off.png from [e77628e4ce] to [f2975fbb94].

cannot compute difference between binary files

Modified textures/sorcery_statlamp_purple.png from [1d0c592359] to [2f0fcc5fe1].

cannot compute difference between binary files

Modified textures/sorcery_statlamp_red.png from [87e8ab6d25] to [ed3b8628fc].

cannot compute difference between binary files

Modified textures/sorcery_statlamp_yellow.png from [458f0fd969] to [a8027f3205].

cannot compute difference between binary files

Modified textures/sorcery_steel_fragment.png from [16e2d50a85] to [b3591fc629].

cannot compute difference between binary files

Modified textures/sorcery_steel_powder.png from [0f9fc0ea2b] to [b5102a1a0a].

cannot compute difference between binary files

Modified textures/sorcery_suppression_matrix.png from [9c64f4969e] to [57d83d3cd9].

cannot compute difference between binary files

Modified textures/sorcery_tacit_couple.png from [d637fb94c7] to [28e64c2648].

cannot compute difference between binary files

Modified textures/sorcery_tacit_web.png from [ddc29e7188] to [7c9bfafe07].

cannot compute difference between binary files

Modified textures/sorcery_tap_inv.png from [0ade756825] to [4d3cf85550].

cannot compute difference between binary files

Modified textures/sorcery_tin_fragment.png from [2e3adf5243] to [8ed224e69e].

cannot compute difference between binary files

Modified textures/sorcery_tin_powder.png from [01dbc5d6c6] to [e8db951a7f].

cannot compute difference between binary files

Modified textures/sorcery_translocator_front.png from [51a09bc368] to [9e76e12626].

cannot compute difference between binary files

Modified textures/sorcery_translocator_module_receive.png from [99916d60d5] to [16111f41c9].

cannot compute difference between binary files

Modified textures/sorcery_translocator_module_receive_panel.png from [dadefd439a] to [a8047b9160].

cannot compute difference between binary files

Modified textures/sorcery_translocator_module_transmit.png from [ee8e01ea67] to [b9979946af].

cannot compute difference between binary files

Modified textures/sorcery_translocator_module_transmit_bg.png from [0f4d8aeb55] to [3705f5630b].

cannot compute difference between binary files

Modified textures/sorcery_translocator_module_transmit_panel.png from [c0f1b6ee7b] to [3a82829433].

cannot compute difference between binary files

Modified textures/sorcery_translocator_side.png from [fe755fceaa] to [ec69661229].

cannot compute difference between binary files

Modified textures/sorcery_translocator_top.png from [e8a57f9374] to [cb61014c08].

cannot compute difference between binary files

Modified textures/sorcery_trough_bottom.png from [5c4632abf2] to [81fde81e4b].

cannot compute difference between binary files

Modified textures/sorcery_trough_side.png from [1761840248] to [ca03800219].

cannot compute difference between binary files

Modified textures/sorcery_trough_side_handle.png from [1624a277c4] to [a81a5c46c7].

cannot compute difference between binary files

Modified textures/sorcery_trough_top_overlay.png from [d2285d9446] to [62549bec86].

cannot compute difference between binary files

Modified textures/sorcery_tungsten_fragment.png from [784aa60809] to [268421d49b].

cannot compute difference between binary files

Modified textures/sorcery_tungsten_ore.png from [fabcffe445] to [17cb107100].

cannot compute difference between binary files

Modified textures/sorcery_tungsten_pick.png from [058aab1c69] to [10283c48db].

cannot compute difference between binary files

Modified textures/sorcery_tungsten_powder.png from [8aba8a538e] to [cd69291b95].

cannot compute difference between binary files

Modified textures/sorcery_tungsten_sword.png from [db252be33e] to [38bafd26f8].

cannot compute difference between binary files

Modified textures/sorcery_tuning_disc.png from [4820ec8236] to [667b3d216f].

cannot compute difference between binary files

Modified textures/sorcery_tyrannium_fragment.png from [799ab0fe68] to [272ac293ef].

cannot compute difference between binary files

Modified textures/sorcery_tyrannium_pick.png from [4d3128e9b0] to [b7df4a7977].

cannot compute difference between binary files

Modified textures/sorcery_tyrannium_powder.png from [44795f36cc] to [b24c9bdef4].

cannot compute difference between binary files

Modified textures/sorcery_tyrannium_sword.png from [e379761923] to [85564ce4d9].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_amulet.png from [1e1e56f3c1] to [cf5ee61b7e].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_ink_bottle.png from [7c2f6ae8df] to [8dc98a9d22].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_paper.png from [2fd8d9799a] to [642460668d].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_pen.png from [35aabc24b3] to [05c82c2481].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_punchcard.png from [8580093926] to [72d2d17801].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_rune.png from [8e47e791d3] to [bde391a846].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_rune_wrench.png from [1bd60d3986] to [5391c9ff41].

cannot compute difference between binary files

Modified textures/sorcery_ui_ghost_wand.png from [0e9bf2eef0] to [677808bf01].

cannot compute difference between binary files

Modified textures/sorcery_ui_infuse_tube.png from [095d88d1aa] to [e971aee3d9].

cannot compute difference between binary files

Modified textures/sorcery_ui_inkwell_bar.png from [619704ff57] to [091dfb431e].

cannot compute difference between binary files

Modified textures/sorcery_ui_inkwell_bar_black.png from [790e8f3039] to [7a8cee9d9c].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_0.png from [aebcb77ec1] to [0c0a15f50e].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_1.png from [d03261c06f] to [c9c7368215].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_10.png from [66eafce742] to [5a52cd71b1].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_11.png from [9a69465e5c] to [d6beca04c0].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_12.png from [5db337f18b] to [60565763d6].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_13.png from [00c1eef083] to [1910895fb8].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_14.png from [4ac1d3242f] to [aef74db7e8].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_15.png from [58fe058e6b] to [599fd06a40].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_16.png from [8dd3a566b5] to [aa58eddf8e].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_2.png from [2a4cdfb7eb] to [d27d7af624].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_3.png from [3906c0dad8] to [c4d04d950b].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_4.png from [9f97dafed9] to [0c80791293].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_5.png from [224a393ff3] to [9764071968].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_6.png from [ab952652b7] to [aa38dbb102].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_7.png from [044c6ab65b] to [563f2f750c].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_8.png from [48dcf6b6d6] to [e85d9d084d].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_9.png from [440f647fa2] to [912a192a70].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_0.png from [6bde9edc7b] to [804b69c92a].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_1.png from [6bde9edc7b] to [804b69c92a].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_10.png from [29f838a2be] to [8d70ba6863].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_11.png from [29f838a2be] to [8d70ba6863].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_12.png from [48fe5c3d7d] to [2fd8d65496].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_13.png from [48fe5c3d7d] to [2fd8d65496].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_14.png from [d3aa3fa899] to [c46cce6913].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_15.png from [d3aa3fa899] to [c46cce6913].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_16.png from [8dd3a566b5] to [aa58eddf8e].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_2.png from [b19fd7a676] to [154a11ac5a].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_3.png from [b19fd7a676] to [154a11ac5a].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_4.png from [3fb2f1935a] to [22b595de00].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_5.png from [3fb2f1935a] to [22b595de00].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_6.png from [20c3d5c4fd] to [385666a50a].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_7.png from [20c3d5c4fd] to [385666a50a].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_8.png from [c8a0d9df2a] to [cd032e719e].

cannot compute difference between binary files

Modified textures/sorcery_ui_manaring_flash_9.png from [c8a0d9df2a] to [cd032e719e].

cannot compute difference between binary files

Modified textures/sorcery_ui_pg_next.png from [6be954ccbc] to [b35b74afa1].

cannot compute difference between binary files

Modified textures/sorcery_ui_thaum_1.png from [e137ef73f2] to [dad7e9df06].

cannot compute difference between binary files

Modified textures/sorcery_ui_thaum_2.png from [1bf5943350] to [6ab2f22786].

cannot compute difference between binary files

Modified textures/sorcery_ui_thaum_3.png from [3bb23f844d] to [ef61d81be5].

cannot compute difference between binary files

Modified textures/sorcery_unobtanium_fragment.png from [bf98fc8591] to [7bf4e8706c].

cannot compute difference between binary files

Modified textures/sorcery_unobtanium_pick.png from [1eefd73a4c] to [926e148c04].

cannot compute difference between binary files

Modified textures/sorcery_unobtanium_powder.png from [9962b3a315] to [e97c7355c1].

cannot compute difference between binary files

Modified textures/sorcery_unobtanium_sword.png from [086d4d4f9e] to [4714a40217].

cannot compute difference between binary files

Modified textures/sorcery_valve.png from [3ab7bc9586] to [3355f880f1].

cannot compute difference between binary files

Modified textures/sorcery_vice.png from [949f16d3cc] to [1fdbcd0ba5].

cannot compute difference between binary files

Modified textures/sorcery_vidrium_fragment.png from [bb35934799] to [1b36cc176b].

cannot compute difference between binary files

Modified textures/sorcery_vidrium_powder.png from [a51f419db4] to [c36e07b70c].

cannot compute difference between binary files

Modified textures/sorcery_vidrium_wire.png from [2621ccf9ee] to [6c9e39323d].

cannot compute difference between binary files

Modified textures/sorcery_wand_amethyst_tip.png from [689089654b] to [68c25d5323].

cannot compute difference between binary files

Modified textures/sorcery_wand_base_acacia.png from [08d9e0c827] to [6506215c57].

cannot compute difference between binary files

Modified textures/sorcery_wand_base_apple.png from [76a4e88a19] to [620b31aa6a].

cannot compute difference between binary files

Modified textures/sorcery_wand_base_aspen.png from [d1b967913c] to [64359c7641].

cannot compute difference between binary files

Modified textures/sorcery_wand_base_jungle.png from [445befeab0] to [7d54d27e62].

cannot compute difference between binary files

Modified textures/sorcery_wand_base_pine.png from [d705a8687e] to [b61c89672d].

cannot compute difference between binary files

Modified textures/sorcery_wand_copper_wire.png from [c631d4917f] to [74c73597d1].

cannot compute difference between binary files

Modified textures/sorcery_wand_diamond_tip.png from [55bf8defd0] to [1506b1768e].

cannot compute difference between binary files

Modified textures/sorcery_wand_emerald_tip.png from [28e29410ff] to [cbe59f7aa5].

cannot compute difference between binary files

Modified textures/sorcery_wand_gold_wire.png from [43b17c033a] to [f9f89c9865].

cannot compute difference between binary files

Modified textures/sorcery_wand_luxite_tip.png from [38ca0fd520] to [719af1a1f7].

cannot compute difference between binary files

Modified textures/sorcery_wand_mese_tip.png from [d1c5dd63a4] to [2c28d37ef2].

cannot compute difference between binary files

Modified textures/sorcery_wand_ruby_tip.png from [8a5494e018] to [49fc363b6b].

cannot compute difference between binary files

Modified textures/sorcery_wand_sapphire_tip.png from [3887ed3731] to [fd0d2627ea].

cannot compute difference between binary files

Modified textures/sorcery_wand_silver_wire.png from [5bc9b27ae4] to [c110db0eb7].

cannot compute difference between binary files

Modified textures/sorcery_wand_steel_wire.png from [e1894022cc] to [d7733712ab].

cannot compute difference between binary files

Modified textures/sorcery_wandworking_station_side.png from [e0b319811e] to [45c605b77e].

cannot compute difference between binary files

Modified textures/sorcery_wandworking_station_top.png from [f562cd81e5] to [4a3e795256].

cannot compute difference between binary files

Modified textures/sorcery_wandworking_station_top_rotated.png from [e95deb0ffe] to [9477e4aa01].

cannot compute difference between binary files

Modified textures/sorcery_wandworking_station_top_water.png from [2860f8c72e] to [2e4c7e3707].

cannot compute difference between binary files

Modified textures/sorcery_warding_plate.png from [0aaf624823] to [58f6c685b8].

cannot compute difference between binary files

Modified vfx.lua from [e1c11d0a7c] to [936cc31413].

     1      1   sorcery.vfx = {}
     2      2   local L = sorcery.lib
            3  +
            4  +sorcery.vfx.particle = {
            5  +	flicker = { fw = 64 };
            6  +	crackle = { fw = 64 };
            7  +	sparking = { fw = 16 };
            8  +	spark = { fw = 16 };
            9  +	sputter = { fw = 16 };
           10  +	glitter = { fw = 16 };
           11  +	poof = { fw = 16 };
           12  +	fog = { fw = 16};
           13  +}
           14  +
           15  +sorcery.vfx.show = function(def)
           16  +	local sp = {}
           17  +	local p
           18  +	if def.kind then
           19  +		p = sorcery.vfx.particle[def.kind]
           20  +		local img = L.image(p.img or string.format('sorcery_%s.png', def.kind))
           21  +		if def.color then img = img:glow(def.color) end
           22  +		if def.warp then img = def:warp(img) end
           23  +		sp.texture = img:render()
           24  +	else
           25  +		sp.texture = def.texture
           26  +	end
           27  +
           28  +	sp.collisiondetection = def.collisiondetection
           29  +	sp.collision_removal  = def.collision_removal
           30  +	sp.object_collision = def.object_collision
           31  +
           32  +	local function q(bp, rp, ao, so)
           33  +		ao = ao or bp
           34  +		so = so or bp
           35  +		local min, max
           36  +
           37  +		if def[bp] or def[rp] then
           38  +			local b = def[bp] or vector.new(0,0,0)
           39  +			if def[rp] then
           40  +				local r
           41  +				if type(def[rp]) == 'number' then
           42  +					r = vector.new(def[rp],def[rp],def[rp])
           43  +				else r = def[rp] end
           44  +				min = vector.subtract(b, r)
           45  +				max = vector.add     (b, r)
           46  +			else
           47  +				min, max = b,b
           48  +			end
           49  +		else
           50  +			local dflt = vector.new(0,0,0)
           51  +			min, max = def['min'..bp] or dflt, def['max'..bp] or dflt
           52  +		end
           53  +
           54  +		if def.amount and def.amount > 1 then
           55  +			sp['min'..ao], sp['max'..ao] = min, max
           56  +		else
           57  +			if vector.equals(min,max) then sp[so] = min else
           58  +				local d = vector.subtract(max, min)
           59  +				sp[so]  = vector.add(min, vector.multiply(d, math.random()))
           60  +			end
           61  +		end
           62  +	end
           63  +	q('pos','radius')
           64  +	q('vel','velrange',   'vel', 'velocity')
           65  +	q('acc','accrange',   'acc', 'acceleration')
           66  +	local vary = def.varysize or 0
           67  +	if def.amount and def.amount > 1 then
           68  +		sp.amount = def.amount
           69  +		sp.time = def.time or def.life or 1
           70  +		def.life = def.life or sp.time
           71  +
           72  +		sp.minsize = def.minsize or ((def.size or 1) - vary)
           73  +		sp.maxsize = def.maxsize or ((def.size or 1) + vary)
           74  +		sp.attached = def.attached
           75  +	else
           76  +		if def.minsize and def.maxsize then
           77  +			sp.size = def.minsize + ((def.maxsize - def.minsize) * math.random())
           78  +		elseif vary > 0 then
           79  +			sp.size = ((def.size or 1) - vary) + (vary*2*math.random())
           80  +		else sp.size = def.size end
           81  +		if def.attached then
           82  +			sp.pos = vector.add(
           83  +				vector.rotate(sp.pos,
           84  +					{x = 0, y = def.attached:get_yaw() or def.attached:get_look_horizontal(), z = 0}
           85  +				),
           86  +				def.attached:get_pos()
           87  +			)
           88  +
           89  +			sp.velocity = vector.add(sp.velocity, def.attached:get_velocity())
           90  +		end
           91  +	end
           92  +	sp.node = def.node
           93  +	sp.playername = def.playername
           94  +	sp.vertical = def.vertical
           95  +	sp.glow = def.glow
           96  +	if def.life then
           97  +		if sp.amount then
           98  +			if def.varylife then
           99  +				sp.minexptime = def.life - def.varylife
          100  +				sp.maxexptime = def.life + def.varylife
          101  +			else
          102  +				sp.minexptime, sp.maxexptime = def.life, def.life
          103  +			end
          104  +		else
          105  +			sp.expirationtime = def.life
          106  +		end
          107  +	end
          108  +	if p and p.fw then
          109  +		sp.animation = {
          110  +			type = 'vertical_frames';
          111  +			aspect_w = p.fw, aspect_h = p.fh or p.fw;
          112  +			length = (sp.maxexptime or sp.life or 1) + 0.1;
          113  +		}
          114  +	end
          115  +	if sp.amount then
          116  +		minetest.add_particlespawner(sp)
          117  +	else
          118  +		minetest.add_particle(sp)
          119  +	end
          120  +end
     3    121   
     4    122   sorcery.vfx.glowspark = function(color)
     5    123   	local spark = L.image('sorcery_spark.png')
     6    124   	return spark:blit(spark:multiply(color))
     7    125   end
     8    126   
     9    127   sorcery.vfx.cast_sparkle = function(caster,color,strength,duration,pos)
    10    128   	local ofs = pos
    11    129   		and function(x) return vector.add(pos,x) end
    12    130   		or  function(x) return x end
    13    131   	local height = caster:get_properties().eye_height
    14         -	minetest.add_particlespawner {
    15         -		amount = 70 * strength;
    16         -		time = duration or 1.5;
          132  +	sorcery.vfx.show {
          133  +		amount = 4 * (0.5+strength*0.5), time = duration or 1.5;
          134  +		kind = 'spark', color = color, glow = 14, life = 0.5;
          135  +		-- minpos = ofs({ x =  0.0, z =  0.6, y =  height - 0.7});
          136  +		-- maxpos = ofs({ x =  0.4, z =  0.2, y =  height - 0.3});
          137  +		pos = ofs(vector.new(0.2, height - 0.5, 0.4)), radius = 0.2;
          138  +		vel = vector.new(0,0,0.8);
          139  +		velrange = 0.7, acc = vector.new(0,0.5,0);
          140  +		minsize = 5, maxsize = 10;
    17    141   		attached = caster;
    18         -		-- texture = L.image('sorcery_spark.png'):multiply(color):render();
    19         -		texture = sorcery.vfx.glowspark(color):render();
    20         -		minpos = ofs({ x =  0.0, z =  0.6, y =  height*0.7});
    21         -		maxpos = ofs({ x =  0.4, z =  0.2, y =  height*1.1});
    22         -		minvel = { x = -0.5, z = -0.5, y = -0.5};
    23         -		maxvel = { x =  0.5, z =  0.5, y =  0.5};
    24         -		minacc = { x =  0.0, z =  0.0, y =  0.5};
    25         -		maxacc = { x =  0.0, z =  0.0, y =  0.5};
    26         -		minsize = 0.4, maxsize = 0.8;
    27         -		minexptime = 1, maxexptime = 1;
    28         -		glow = 14;
    29         -		animation = {
    30         -			type = 'vertical_frames';
    31         -			aspect_w = 16;
    32         -			aspect_h = 16;
    33         -			length = 1.1;
    34         -		};
          142  +	}
          143  +	sorcery.vfx.show {
          144  +		amount = 140 * strength, time = 0.3 + (duration or 1.5);
          145  +		kind = 'sputter', color = color, glow = 14, life = 3;
          146  +		pos = ofs(vector.new(0.2, height - 0.5, 0.5)), radius = 0.3;
          147  +		vel = vector.new(0,0,1.2);
          148  +		velrange = 0.4, acc = vector.new(0,0.5,-0.7);
          149  +		minsize = 0.05, maxsize = 0.4;
          150  +		attached = caster;
    35    151   	}
          152  +	-- minetest.add_particlespawner {
          153  +	-- 	amount = 40 * strength;
          154  +	-- 	time = duration or 1.5;
          155  +	-- 	attached = caster;
          156  +	-- 	-- texture = L.image('sorcery_spark.png'):multiply(color):render();
          157  +	-- 	texture = sorcery.vfx.glowspark(color):render();
          158  +	-- 	minvel = { x = -0.5, z = -0.5, y = -0.5};
          159  +	-- 	maxvel = { x =  0.5, z =  0.5, y =  0.5};
          160  +	-- 	minacc = { x =  0.0, z =  0.0, y =  0.5};
          161  +	-- 	maxacc = { x =  0.0, z =  0.0, y =  0.5};
          162  +	-- 	minsize = 0.2, maxsize = 1.5;
          163  +	-- 	minexptime = 1, maxexptime = 1;
          164  +	-- 	glow = 14;
          165  +	-- 	animation = {
          166  +	-- 		type = 'vertical_frames';
          167  +	-- 		aspect_w = 16;
          168  +	-- 		aspect_h = 16;
          169  +	-- 		length = 1.1;
          170  +	-- 	};
          171  +	-- }
    36    172   end
    37    173   
    38    174   sorcery.vfx.body_sparkle = function(body,color,str,pos)
    39    175   	local tex = L.image('sorcery_spark.png')
    40    176   	local pi = tex:blit(tex:multiply(color)):render()
    41    177   	local ofs = pos
    42    178   		and function(x) return vector.add(pos,x) end