| Comment: | ui tweaks, rework enchantment slightly |
|---|---|
| Downloads: | Tarball | ZIP archive | SQL archive |
| Timelines: | family | ancestors | descendants | both | trunk |
| Files: | files | file ages | folders |
| SHA3-256: |
41fdb5b0b80615f7ccde49d5172525b7 |
| User & Date: | lexi on 2021-04-21 01:32:38 |
| Other Links: | manifest | tags |
|
2021-06-23
| ||
| 09:31 | look i don't fucking remember okay check-in: a08f21c56c user: lexi tags: trunk | |
|
2021-04-21
| ||
| 01:32 | ui tweaks, rework enchantment slightly check-in: 41fdb5b0b8 user: lexi tags: trunk | |
|
2020-10-31
| ||
| 19:49 | add background noise for condensers (temporary hack, need to write a proper environment sound framework as the fucking env_sounds module is completely impossible to extend), fix a couple of really stupid bugs, make higher-quality phials increase the chance of getting good runes so it's not a complete waste to burn iridium or levitanium powder on making them, add targeted disjunction and some other amulet spells check-in: 15f176a7fe user: lexi tags: trunk | |
Modified cookbook.lua from [604c53eb6c] to [e643a56c3c].
29 30 31 32 33 34 35 36 37 38 39 40 41 42 ... 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 ... 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 ... 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 |
dye = { caption = 'Any Dye', cnitem = 'dye:black' };
bone = { caption = 'Any Bone', cnitem = 'bonemeal:bone' };
vessel = { caption = 'Any Bottle', cnitem = 'vessels:glass_bottle' };
flower = { caption = 'Any Flower', cnitem = 'flowers:rose' };
mushroom = { caption = 'Any Mushroom', cnitem = 'flowers:mushroom_brown' };
water_bucket = { caption = 'Water Bucket', cnitem = 'bucket:bucket_water' };
sorcery_ley_cable = { caption = 'Cable', cnitem = 'sorcery:cable_vidrium' };
};
}
sorcery.cookbook.constants = constants
local slot3x3 = {
{0,0}, {1,0}, {2,0};
{0,1}, {1,1}, {2,1};
................................................................................
desc = string.format("%s (%u)",desc,s:get_count())
end
return desc
end;
local bookadjs = { -- sets are in reverse order!
{'Celestial', 'Divine', 'Inspired', 'Heavenly';
'Mystic', 'Diabolic', 'Luminous', 'Forsaken'};
{'Dark', 'Perfected', 'Flawless', 'Unthinkable';
'Impossible', 'Worrisome', 'Unimpeachable'};
{'Splendid', 'Magnificent', 'Sublime', 'Grand';
'Beneficent', 'Mysterious', 'Peculiar', 'Eerie';
'Fulsome', 'Fearsome', 'Curious', 'Fascinating';
'Notorious', 'Infamous'};
}
local cache = {
populate_grindables = function(cache)
if not cache.grindables then
cache.grindables = {}
for k,v in pairs(minetest.registered_items) do
................................................................................
local rec = {}
local en = sorcery.data.enchants[name]
if not en then return nil end
en = en.recipe
for i,e in pairs(en) do
if e.lens then
rec[i] = 'sorcery:lens_' .. e.lens .. '_' .. e.gem
end
end
return rec
end;
props = function(name)
return sorcery.data.enchants[name].info or {}
end;
slots = {
{0.5,0};
{0,1}, {1,1}
};
title = function(name) return sorcery.data.enchants[name].name end;
outdesc = function(name,suffix)
local e = sorcery.data.enchants[name]
return sorcery.lib.ui.tooltip {
title = e.name;
desc = sorcery.lib.str.capitalize(e.desc);
color = sorcery.lib.color(e.tone):readable();
}
end;
};
-- spells = {
-- booksuf = 'Spellbook';
-- slots = {
-- {0,0}, {1,0};
................................................................................
end
end
end
local img, ot
if props.note then
local nx, ny, nw, nh
if notes_right then
nx = 5.25 ny = 0
nw = 4 nh = 3
else
nx = 0 ny = 3
nw = 4 nh = 1
end
t = t .. string.format([[
hypertext[%f,%f;%f,%f;note;<global valign=middle halign=justify size=20>%s]
]], nx,ny,nw,nh, minetest.formspec_escape(props.note))
end
if k.icon then img = k.icon(result) end
if k.outdesc then ot = k.outdesc(result) else ot = desc_builtin(result) end
-- image[%f,%f;1,1;gui_furnace_arrow_bg.png^[transformR270]
return t .. string.format([[
item_image[%f,%f;1,1;%s]tooltip[%f,%f;1,1;%s]
]] --[[box[%f,%f;1,1;#850083A0]] .. [[
%s[%f,%f;1,1;%s]
tooltip[%f,%f;1,1;%s]
]], k.w, k.h/2 - 0.5, k.node,
k.w, k.h/2 - 0.5, minetest.formspec_escape(minetest.registered_nodes[k.node].description),
-- k.w+1, k.h/2 - 0.5,
img and 'image' or 'item_image',
k.w+1.1, k.h/2 - 0.5, minetest.formspec_escape(img or result),
k.w+1.1, k.h/2 - 0.5, minetest.formspec_escape(ot))
end;
local retrieve_recipe = function(kind,out,notes_right)
local rec = recipe_kinds[kind]
|
> | > | > | > > > > > | > > > > > > > > > > > > > > > > | > > > > | > > > | | | | | |
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 ... 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 ... 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 ... 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 |
dye = { caption = 'Any Dye', cnitem = 'dye:black' };
bone = { caption = 'Any Bone', cnitem = 'bonemeal:bone' };
vessel = { caption = 'Any Bottle', cnitem = 'vessels:glass_bottle' };
flower = { caption = 'Any Flower', cnitem = 'flowers:rose' };
mushroom = { caption = 'Any Mushroom', cnitem = 'flowers:mushroom_brown' };
water_bucket = { caption = 'Water Bucket', cnitem = 'bucket:bucket_water' };
sorcery_ley_cable = { caption = 'Cable', cnitem = 'sorcery:cable_vidrium' };
scissors = { caption = 'Scissors', cnitem = 'sorcery:scissors_steel' };
};
}
sorcery.cookbook.constants = constants
local slot3x3 = {
{0,0}, {1,0}, {2,0};
{0,1}, {1,1}, {2,1};
................................................................................
desc = string.format("%s (%u)",desc,s:get_count())
end
return desc
end;
local bookadjs = { -- sets are in reverse order!
{'Celestial', 'Divine', 'Inspired', 'Heavenly';
'Mystic', 'Diabolic', 'Luminous', 'Forsaken',
'Ethereal'};
{'Dark', 'Perfected', 'Flawless', 'Unthinkable';
'Impossible', 'Worrisome', 'Unimpeachable', 'Fulsome',
'Wise'};
{'Splendid', 'Magnificent', 'Sublime', 'Grand';
'Beneficent', 'Mysterious', 'Peculiar', 'Eerie';
'Fulsome', 'Fearsome', 'Curious', 'Fascinating';
'Notorious', 'Infamous', 'Wondrous'};
}
local cache = {
populate_grindables = function(cache)
if not cache.grindables then
cache.grindables = {}
for k,v in pairs(minetest.registered_items) do
................................................................................
local rec = {}
local en = sorcery.data.enchants[name]
if not en then return nil end
en = en.recipe
for i,e in pairs(en) do
if e.lens then
rec[i] = 'sorcery:lens_' .. e.lens .. '_' .. e.gem
elseif e.item then
rec[i] = e.item
end
if e.consume or (e.item and not e.dmg) then
rec[i] = rec[i] .. ' ' .. tostring(e.consume or 1) -- :/
end
end
return rec
end;
props = function(name)
local ench = sorcery.data.enchants[name]
local p = ench.info
local desc = ''
if ench.cost ~= 0 then
desc = string.format('%s <b>%i</b> thaum-second%s of charge when tool is used',
ench.cost > 0 and 'Consumes' or 'Generates',
math.abs(ench.cost),
ench.cost ~= 1 and 's' or ''
)
end
if p == nil then return {note = desc} end
if p.note then return p end
return sorcery.lib.tbl.proto({note = desc},p)
end;
slots = {
{0.5,0};
{0,1}, {1,1}
};
title = function(name) return sorcery.data.enchants[name].name end;
outdesc = function(name,suffix)
local e = sorcery.data.enchants[name]
local cap = sorcery.lib.str.capitalize
local aff = sorcery.data.affinities[e.affinity]
return sorcery.lib.ui.tooltip {
title = e.name;
desc = cap(e.desc);
color = sorcery.lib.color(e.tone);
props = {
{
title = string.format('%s affinity', cap(e.affinity));
desc = aff.desc;
color = sorcery.lib.color(aff.color);
};
};
}
end;
};
-- spells = {
-- booksuf = 'Spellbook';
-- slots = {
-- {0,0}, {1,0};
................................................................................
end
end
end
local img, ot
if props.note then
local nx, ny, nw, nh
if notes_right then
nx = 5.25 - (3 - k.w) -- :/
ny = 0
nw = 4 nh = k.h
else
nx = 0 ny = 3
nw = 4 nh = k,h
end
t = t .. string.format([[
hypertext[%f,%f;%f,%f;note;<global valign=middle halign=justify size=20>%s]
]], nx,ny,nw,nh, minetest.formspec_escape(props.note))
end
if k.icon then img = k.icon(result) end
if k.outdesc then ot = k.outdesc(result) else ot = desc_builtin(result) end
-- image[%f,%f;1,1;gui_furnace_arrow_bg.png^[transformR270]
return t .. string.format([[
item_image[%f,%f;1,1;%s]tooltip[%f,%f;1,1;%s]
box[%f,%f;1.1,1.1;#1a001650]
%s[%f,%f;1,1;%s]
tooltip[%f,%f;1,1;%s]
]], k.w, k.h/2 - 0.5, k.node,
k.w, k.h/2 - 0.5, minetest.formspec_escape(minetest.registered_nodes[k.node].description),
k.w+1.05, k.h/2 - 0.55,
img and 'image' or 'item_image',
k.w+1.1, k.h/2 - 0.5, minetest.formspec_escape(img or result),
k.w+1.1, k.h/2 - 0.5, minetest.formspec_escape(ot))
end;
local retrieve_recipe = function(kind,out,notes_right)
local rec = recipe_kinds[kind]
|
Modified data/enchants.lua from [5670d710ce] to [f66e8dbb2f].
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 .. 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 .. 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 .. 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 ... 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 ... 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 ... 217 218 219 220 221 222 223 224 225 226 227 228 229 |
cost = 1;
tone = {232,102,255};
desc = 'tools last longer before wearing out';
affinity = 'counterpraxic';
groups = allgroups;
recipe = {
{lens = 'convex', gem = 'amethyst', dmg = 2};
{lens = 'rectifier', gem = 'emerald', dmg = 4};
{lens = 'convex', gem = 'emerald', dmg = 2};
};
apply = function(stack,power,base)
local caps = table.copy(stack:get_definition().tool_capabilities)
for g,v in pairs(caps.groupcaps) do
local unit = base.groupcaps[g].uses * 0.6
caps.groupcaps[g].uses = v.uses + unit*power
................................................................................
groups = digtools;
affinity = 'cognic';
cost = 1;
tone = {255,235,195};
desc = 'Leave a trail of light hanging in the air as you dig';
recipe = {
{lens = 'convex', gem = 'sapphire', dmg = 2};
{lens = 'concave', gem = 'ruby', dmg = 1};
{lens = 'concave', gem = 'sapphire', dmg = 1};
};
on_dig = function(ctx)
local chance = 10 -- make dependent on power somehow?
if math.random(chance) == 1 then
local lightlevel = math.floor(math.min(minetest.LIGHT_MAX,4*ctx.power))
-- spawn a light block
................................................................................
cost = 0; -- energy is only depleted when repair takes place
tone = {255,84,187};
affinity = 'syncretic';
groups = {
'pick'; 'pickaxe'; 'sword';
};
recipe = {
{lens = 'amplifier', gem = 'ruby', dmg = 5};
{lens = 'concave', gem = 'mese', dmg = 1};
{lens = 'concave', gem = 'sapphire', dmg = 1};
};
desc = 'some damage is repaired when used to mine ore or kill an attacker';
on_dig = function(ctx)
local orepfx = "stone_with_" -- }:<
-- local oredrop = ' lump'
local barename = string.sub(ctx.node.name, string.find(ctx.node.name, ':') + 1)
if sorcery.itemclass.get(ctx.node.name,'ore') then
ctx.tool:add_wear(-(sorcery.enchant.strength(ctx.tool,'harvest') * 2000))
ctx.cost = 3
................................................................................
name = 'Conserve';
tone = {84,255,144};
cost = 0;
desc = 'enchantments last longer before running out of power to sustain them';
groups = allgroups;
affinity = 'syncretic';
recipe = {
{lens = 'rectifier', gem = 'mese', dmg = 7};
{lens = 'rectifier', gem = 'sapphire', dmg = 2};
{lens = 'rectifier', gem = 'amethyst', dmg = 2};
};
-- implemented in sorcery/enchanter.lua:register_on_dig
};
dowse = { -- send up flare when valuable ores are nearby
name = 'Dowse';
tone = {241,251,113};
cost = 1;
desc = 'strike colored sparks when used to dig near valuable ore.';
groups = {'pick','pickaxe'};
affinity = 'cognic';
recipe = {
{lens = 'concave', gem = 'ruby', dmg = 3};
{lens = 'concave', gem = 'emerald', dmg = 3};
{lens = 'concave', gem = 'sapphire', dmg = 3};
};
on_dig = function(ctx)
local range = 4*sorcery.enchant.strength(ctx.tool,'dowse')
local colors = {
['default:stone_with_gold' ] = {255,234,182};
................................................................................
name = 'Glitter';
cost = 10;
tone = {255,50,60};
desc = 'dramatically improve your chances of finding gems while mining veins';
groups = {'pick','pickaxe'};
affinity = 'entropic';
recipe = {
{lens = 'amplifier', gem = 'diamond', dmg = 12};
{lens = 'rectifier', gem = 'sapphire', dmg = 9};
{lens = 'convex', gem = 'ruby', dmg = 7};
};
};
pierce = { -- faster mining speed
name = 'Pierce';
cost = 3;
tone = {113,240,251};
groups = digtools;
{
'pick';'pickaxe';'axe';'shovel';'sickle';
};
desc = 'rip through solid stone or wood like a hot knife through butter';
recipe = {
{lens = 'amplifier', gem = 'diamond', dmg = 4};
{lens = 'amplifier', gem = 'ruby', dmg = 4};
{lens = 'rectifier', gem = 'diamond', dmg = 2};
};
affinity = 'praxic';
apply = function(stack,power,base)
local caps = table.copy(stack:get_definition().tool_capabilities)
for g,v in pairs(caps.groupcaps) do
for i,t in pairs(v.times) do
local unit = base.groupcaps[g].times[i] * 0.15
................................................................................
};
rend = { -- more damage / mine higher level blocks
name = 'Rend';
affinity = 'praxic';
tone = {251,203,113};
groups = {'sword';'pick';'pickaxe';};
recipe = {
{lens = 'convex', gem = 'mese', dmg = 3};
{lens = 'amplifier', gem = 'emerald', dmg = 7};
{lens = 'amplifier', gem = 'diamond', dmg = 7};
};
cost = 5;
desc = 'cleave through sturdy ores and tear mortal flesh with fearsome ease';
apply = function(stack,power,base)
local caps = table.copy(stack:get_definition().tool_capabilities)
for g,v in pairs(caps.groupcaps) do
local unit = 2
................................................................................
sanctify = {
desc = 'prolong the blessings of the heavens';
groups = {'sorcery_sanctify'};
affinity = 'entropic';
tone = {255,255,255};
cost = 7;
recipe = {
{lens = 'amplifier', gem = 'ruby', dmg = 13};
{lens = 'amplifier', gem = 'ruby', dmg = 15};
{lens = 'amplifier', gem = 'ruby', dmg = 18};
};
};
}
|
| | | | | > > > | | > < < < < | < > | | |
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 .. 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 .. 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 .. 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 ... 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 ... 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 ... 217 218 219 220 221 222 223 224 225 226 227 228 229 |
cost = 1;
tone = {232,102,255};
desc = 'tools last longer before wearing out';
affinity = 'counterpraxic';
groups = allgroups;
recipe = {
{lens = 'convex', gem = 'amethyst', dmg = 2};
{item = 'default:obsidian_shard'};
{lens = 'convex', gem = 'emerald', dmg = 2};
};
apply = function(stack,power,base)
local caps = table.copy(stack:get_definition().tool_capabilities)
for g,v in pairs(caps.groupcaps) do
local unit = base.groupcaps[g].uses * 0.6
caps.groupcaps[g].uses = v.uses + unit*power
................................................................................
groups = digtools;
affinity = 'cognic';
cost = 1;
tone = {255,235,195};
desc = 'Leave a trail of light hanging in the air as you dig';
recipe = {
{lens = 'convex', gem = 'sapphire', dmg = 2};
{item = 'sorcery:gem_luxite_shard'};
{lens = 'concave', gem = 'sapphire', dmg = 1};
};
on_dig = function(ctx)
local chance = 10 -- make dependent on power somehow?
if math.random(chance) == 1 then
local lightlevel = math.floor(math.min(minetest.LIGHT_MAX,4*ctx.power))
-- spawn a light block
................................................................................
cost = 0; -- energy is only depleted when repair takes place
tone = {255,84,187};
affinity = 'syncretic';
groups = {
'pick'; 'pickaxe'; 'sword';
};
recipe = {
{lens = 'amplifier', gem = 'ruby', dmg = 5};
{item = 'sorcery:powder_tungsten'};
{item = 'sorcery:extract_rye'};
};
desc = 'some damage is repaired when used to mine ore or kill an attacker';
info = {
note = 'Consumes <b>3</b> thaum-seconds of charge when repair takes place';
};
on_dig = function(ctx)
local orepfx = "stone_with_" -- }:<
-- local oredrop = ' lump'
local barename = string.sub(ctx.node.name, string.find(ctx.node.name, ':') + 1)
if sorcery.itemclass.get(ctx.node.name,'ore') then
ctx.tool:add_wear(-(sorcery.enchant.strength(ctx.tool,'harvest') * 2000))
ctx.cost = 3
................................................................................
name = 'Conserve';
tone = {84,255,144};
cost = 0;
desc = 'enchantments last longer before running out of power to sustain them';
groups = allgroups;
affinity = 'syncretic';
recipe = {
{item = 'default:mese_crystal_fragment'};
{lens = 'rectifier', gem = 'sapphire', dmg = 2};
{lens = 'rectifier', gem = 'amethyst', dmg = 2};
};
-- implemented in sorcery/enchanter.lua:register_on_dig
};
dowse = { -- send up flare when valuable ores are nearby
name = 'Dowse';
tone = {241,251,113};
cost = 1;
desc = 'strike colored sparks when used to dig near valuable ore.';
groups = {'pick','pickaxe'};
affinity = 'cognic';
recipe = {
{item = 'sorcery:gem_luxite'};
{lens = 'concave', gem = 'emerald', dmg = 3};
{lens = 'concave', gem = 'sapphire', dmg = 3};
};
on_dig = function(ctx)
local range = 4*sorcery.enchant.strength(ctx.tool,'dowse')
local colors = {
['default:stone_with_gold' ] = {255,234,182};
................................................................................
name = 'Glitter';
cost = 10;
tone = {255,50,60};
desc = 'dramatically improve your chances of finding gems while mining veins';
groups = {'pick','pickaxe'};
affinity = 'entropic';
recipe = {
{item = 'sorcery:oil_luck'};
{lens = 'amplifier', gem = 'diamond', dmg = 12};
{lens = 'rectifier', gem = 'sapphire', dmg = 9};
};
};
pierce = { -- faster mining speed
name = 'Pierce';
cost = 3;
tone = {113,240,251};
groups = digtools;
desc = 'rip through solid stone or wood like a hot knife through butter';
recipe = {
{lens = 'amplifier', gem = 'diamond', dmg = 4};
{lens = 'amplifier', gem = 'ruby', dmg = 4};
{item = 'default:flint'};
};
affinity = 'praxic';
apply = function(stack,power,base)
local caps = table.copy(stack:get_definition().tool_capabilities)
for g,v in pairs(caps.groupcaps) do
for i,t in pairs(v.times) do
local unit = base.groupcaps[g].times[i] * 0.15
................................................................................
};
rend = { -- more damage / mine higher level blocks
name = 'Rend';
affinity = 'praxic';
tone = {251,203,113};
groups = {'sword';'pick';'pickaxe';};
recipe = {
{lens = 'amplifier', gem = 'emerald', dmg = 7};
{item = 'flowers:flower_rose'};
{item = 'sorcery:powder_silver'};
};
cost = 5;
desc = 'cleave through sturdy ores and tear mortal flesh with fearsome ease';
apply = function(stack,power,base)
local caps = table.copy(stack:get_definition().tool_capabilities)
for g,v in pairs(caps.groupcaps) do
local unit = 2
................................................................................
sanctify = {
desc = 'prolong the blessings of the heavens';
groups = {'sorcery_sanctify'};
affinity = 'entropic';
tone = {255,255,255};
cost = 7;
recipe = {
{item = 'sorcery:holy_water'};
{lens = 'amplifier', gem = 'ruby', dmg = 15};
{lens = 'amplifier', gem = 'ruby', dmg = 18};
};
};
}
|
Modified data/metals.lua from [3560b06dd9] to [81e12129e0].
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 |
artificial=true;
meltpoint = 5;
cooktime = 120;
hardness = 8;
maxconduct = 15;
sharpness = 5;
level = 2;
speed = 1.7;
maxenergy = 2200;
durability = 1500;
slots = {
{affinity={'praxic'},confluence=3};
{affinity={'syncretic'},confluence=2};
};
sinter = {
|
| |
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 |
artificial=true;
meltpoint = 5;
cooktime = 120;
hardness = 8;
maxconduct = 15;
sharpness = 5;
level = 2;
speed = 2.5;
maxenergy = 2200;
durability = 1500;
slots = {
{affinity={'praxic'},confluence=3};
{affinity={'syncretic'},confluence=2};
};
sinter = {
|
Modified data/oils.lua from [6619d22587] to [1e67dfd074].
105 106 107 108 109 110 111 112 113 |
mix = {
'sorcery:extract_greengrass';
'sorcery:extract_grape';
'farming:cocoa_beans';
'farming:sugar';
'farming:sugar';
};
};
}
|
> > > > > > > > > > | > > |
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
mix = {
'sorcery:extract_greengrass';
'sorcery:extract_grape';
'farming:cocoa_beans';
'farming:sugar';
'farming:sugar';
};
};
luck = {
color = {156,54,255};
style = 'sparkle';
mix = {
'sorcery:extract_marram';
'farming:hemp_leaf';
'farming:hemp_oil';
'xdecor:honey';
'farming:salt';
'farming:salt';
};
};
}
|
Modified data/runes.lua from [56e196edd6] to [92db18c27d].
140
141
142
143
144
145
146
147
148
149
150
151
152
153
...
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
|
cast = function(ctx)
local target = minetest.get_player_by_name(ctx.meta:get_string('rune_join_target'))
if not target then return false end
local subjects if ctx.amulet.frame == 'cobalt' then
if ctx.target.type ~= 'object' then return false end
subjects = {{ref=ctx.target.ref}}
else subjects = {{ref=ctx.caster}} end
local delay = math.max(5,11 - ctx.stats.power) + 2.3*(math.random()*2-1)
local color = sorcery.lib.color(117,38,237)
teleport(ctx,subjects,delay,target:get_pos(),color)
if ctx.amulet.frame == 'gold' then
teleport(ctx,{{ref=target}},delay,ctx.caster:get_pos())
................................................................................
mingrade = 4;
name = 'Duplication';
desc = 'Bring an exact twin of any object or item into existence, no matter how common or rare it might be';
cast = function(ctx)
local color = sorcery.lib.color(255,61,205)
local dup, sndpos, anchor, sbj, ty
if ctx.target.type == 'object' and ctx.target.ref:get_luaentity().name == '__builtin:item' then
-- sorcery.vfx.imbue(color, ctx.target.ref) -- causes graphics card problems???
sndpos = 'subjects'
sbj = {{player = ctx.target.ref}}
local item = ItemStack(ctx.target.ref:get_luaentity().itemstring)
local r = function() return math.random() * 2 - 1 end
local putpos = vector.offset(ctx.target.ref:get_pos(), r(), 1, r())
dup = function()
item:set_count(1) -- nice try bouge-san
|
>
>
>
>
>
|
|
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
...
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
|
cast = function(ctx)
local target = minetest.get_player_by_name(ctx.meta:get_string('rune_join_target'))
if not target then return false end
local subjects if ctx.amulet.frame == 'cobalt' then
if ctx.target.type ~= 'object' then return false end
subjects = {{ref=ctx.target.ref}}
elseif ctx.amulet.frame == 'iridium' then
subjects = {}
for _,o in pairs(minetest.get_objects_inside_radius(ctx.caster:get_pos(), ctx.stats.power)) do
subjects[#subjects+1] = {player = o}
end
else subjects = {{ref=ctx.caster}} end
local delay = math.max(5,11 - ctx.stats.power) + 2.3*(math.random()*2-1)
local color = sorcery.lib.color(117,38,237)
teleport(ctx,subjects,delay,target:get_pos(),color)
if ctx.amulet.frame == 'gold' then
teleport(ctx,{{ref=target}},delay,ctx.caster:get_pos())
................................................................................
mingrade = 4;
name = 'Duplication';
desc = 'Bring an exact twin of any object or item into existence, no matter how common or rare it might be';
cast = function(ctx)
local color = sorcery.lib.color(255,61,205)
local dup, sndpos, anchor, sbj, ty
if ctx.target.type == 'object' and ctx.target.ref:get_luaentity().name == '__builtin:item' then
sorcery.vfx.imbue(color, ctx.target.ref) -- causes graphics card problems???
sndpos = 'subjects'
sbj = {{player = ctx.target.ref}}
local item = ItemStack(ctx.target.ref:get_luaentity().itemstring)
local r = function() return math.random() * 2 - 1 end
local putpos = vector.offset(ctx.target.ref:get_pos(), r(), 1, r())
dup = function()
item:set_count(1) -- nice try bouge-san
|
Modified data/spells.lua from [dffc43152b] to [2d770c6227].
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ... 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 ... 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 ... 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 ... 583 584 585 586 587 588 589 590 591 592 593 594 595 596 ... 624 625 626 627 628 629 630 631 632 633 634 635 636 637 |
end
return r[math.random(#r)]
end
local anchorwand = function(aff,uses,recipe)
local affcolor = sorcery.lib.color(sorcery.data.affinities[aff].color)
return {
name = aff .. ' anchor';
desc = 'With an enchanter, anchor ' .. aff .. ' spells into an object to enable it to produce preternatural effects';
uses = uses;
affinity = recipe;
color = affcolor;
sound = 'xdecor_enchanting'; -- FIXME make own
cast = function(ctx)
local node = target_node(ctx, 'sorcery:enchanter')
if not node then return false end
................................................................................
local proto = stack:get_definition()._proto
if proto.kind ~= spec.lens or proto.gem ~= spec.gem
then return false end
elseif spec.item then
default_mode = 'consume'
if stack:get_name() ~= spec.item then
return false end
else
return false
end
local mode
if spec.dmg then mode = 'dmg'
elseif spec.consume then mode = 'consume'
else mode = default_mode end
if mode == 'dmg' then
stack:add_wear((spec.dmg or 1) * 1000)
return stack
elseif mode == 'consume' then
stack:take_item(spec.consume or 1)
return stack
end
end
for ench,data in pairs(sorcery.data.enchants) do
if data.affinity ~= aff or data.recipe == nil then goto skip end
local newinv = {}
for s,v in pairs(data.recipe) do
................................................................................
bolt:get_luaentity()._blastradius = radius
bolt:set_velocity(vel)
end;
};
seal = {
name = 'sealing';
color = {255,238,16};
uses = 32;
desc = 'Bind an object to your spirit such that it will be rendered impregnable to others, or break a sealing created with this same wand';
leytype = 'imperic';
affinity = {'pine','dark'};
cast = function(ctx)
if ctx.target == nil or ctx.target.type ~= 'node' then return false end
local meta = minetest.get_meta(ctx.target.under)
-- first we need to check if the wand has an identifying 'key' yet,
................................................................................
uses = 128;
desc = 'Reveal the strength and affinities of the local leyline';
cast = function(ctx)
local color = ctx.base.gem == 'sapphire';
local duration = (ctx.base.gem == 'amethyst' and 4) or 2;
local ley = sorcery.ley.estimate(ctx.caster:get_pos())
local strength = ley.force
if color then
strength = strength / #ley.aff
for _,a in pairs(ley.aff) do
cast_sparkle(ctx,sorcery.lib.color(sorcery.data.affinities[a].color):brighten(1.3), strength, duration * strength)
end
else
cast_sparkle(ctx,sorcery.lib.color(250,255,185), strength, duration*strength)
end
end;
};
................................................................................
end
newenergy = math.min(maxcharge, newenergy * (ctx.stats.power or 1))
sorcery.ley.setcharge(rechargee,charge + newenergy)
e:set_stack('item',1,rechargee)
enchantment_sparkle(ctx, sorcery.lib.color(212,6,63))
end;
};
transfer = {
name = 'transfer';
uses = 65;
color = {6,212,121};
leytype = 'syncretic';
................................................................................
if ctx.base.gem == 'sapphire'
then e.spells = {} e.energy = 0
else table.remove(e.spells, math.random(#e.spells))
end
end
sorcery.enchant.set(item,e)
ei:set_stack('item',1,item)
enchantment_sparkle(ctx,sorcery.lib.color(255,154,44))
enchantment_sparkle(ctx,sorcery.lib.color(226,44,255))
end;
};
divine = {
name = 'divining';
desc = 'Steal away the secrets of the cosmos';
|
| > > > > > > > > > > > | | | > > |
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ... 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 ... 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 ... 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 ... 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 ... 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 |
end
return r[math.random(#r)]
end
local anchorwand = function(aff,uses,recipe)
local affcolor = sorcery.lib.color(sorcery.data.affinities[aff].color)
return {
name = aff .. ' anchor';
desc = 'Destroy items on an enchanter and channel their essence with enchanting lenses to anchor ' .. aff .. ' spells into an object, enabling it to produce preternatural effects';
uses = uses;
affinity = recipe;
color = affcolor;
sound = 'xdecor_enchanting'; -- FIXME make own
cast = function(ctx)
local node = target_node(ctx, 'sorcery:enchanter')
if not node then return false end
................................................................................
local proto = stack:get_definition()._proto
if proto.kind ~= spec.lens or proto.gem ~= spec.gem
then return false end
elseif spec.item then
default_mode = 'consume'
if stack:get_name() ~= spec.item then
return false end
if spec.consume and stack:get_count() < spec.consume then
return false end
else
return false
end
local mode
if spec.dmg then mode = 'dmg'
elseif spec.consume then mode = 'consume'
else mode = default_mode end
if mode == 'dmg' then
stack:add_wear((spec.dmg or 1) * 1000)
return stack
elseif mode == 'consume' then
local r = sorcery.register.residue.db[stack:get_name()]
stack:take_item(spec.consume or 1)
if r then
local rs = ItemStack(r)
rs:set_count(rs:get_count() * (spec.consume or 1))
if stack:is_empty()
then stack = rs
else minetest.add_item(ctx.target.above, rs)
end
end
return stack
end
end
for ench,data in pairs(sorcery.data.enchants) do
if data.affinity ~= aff or data.recipe == nil then goto skip end
local newinv = {}
for s,v in pairs(data.recipe) do
................................................................................
bolt:get_luaentity()._blastradius = radius
bolt:set_velocity(vel)
end;
};
seal = {
name = 'sealing';
color = {255,238,16};
uses = 128;
desc = 'Bind an object to your spirit such that it will be rendered impregnable to others, or break a sealing created with this same wand';
leytype = 'imperic';
affinity = {'pine','dark'};
cast = function(ctx)
if ctx.target == nil or ctx.target.type ~= 'node' then return false end
local meta = minetest.get_meta(ctx.target.under)
-- first we need to check if the wand has an identifying 'key' yet,
................................................................................
uses = 128;
desc = 'Reveal the strength and affinities of the local leyline';
cast = function(ctx)
local color = ctx.base.gem == 'sapphire';
local duration = (ctx.base.gem == 'amethyst' and 4) or 2;
local ley = sorcery.ley.estimate(ctx.caster:get_pos())
local strength = ley.force * 4 * ley.force
if color then
strength = strength / #ley.aff
for _,a in pairs(ley.aff) do
cast_sparkle(ctx,sorcery.lib.color(sorcery.data.affinities[a].color):brighten(1.3), strength, duration * (strength*0.5))
end
else
cast_sparkle(ctx,sorcery.lib.color(250,255,185), strength, duration*strength)
end
end;
};
................................................................................
end
newenergy = math.min(maxcharge, newenergy * (ctx.stats.power or 1))
sorcery.ley.setcharge(rechargee,charge + newenergy)
e:set_stack('item',1,rechargee)
enchantment_sparkle(ctx, sorcery.lib.color(212,6,63))
sorcery.enchant.update_enchanter(ctx.target.under)
end;
};
transfer = {
name = 'transfer';
uses = 65;
color = {6,212,121};
leytype = 'syncretic';
................................................................................
if ctx.base.gem == 'sapphire'
then e.spells = {} e.energy = 0
else table.remove(e.spells, math.random(#e.spells))
end
end
sorcery.enchant.set(item,e)
ei:set_stack('item',1,item)
sorcery.enchant.update_enchanter(ctx.target.under)
enchantment_sparkle(ctx,sorcery.lib.color(255,154,44))
enchantment_sparkle(ctx,sorcery.lib.color(226,44,255))
end;
};
divine = {
name = 'divining';
desc = 'Steal away the secrets of the cosmos';
|
Modified entities.lua from [9e257faffc] to [5b6d6366ce].
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
age = u.marshal.t.u32;
lastemit = u.marshal.t.u32;
}
minetest.register_entity('sorcery:spell_projectile_flamebolt',{
initial_properties = {
visual = "sprite";
use_texture_alpha = true;
textures = {'sorcery_fireball.png'};
visual_size = { x = 2, y = 2, z = 2 };
physical = true;
collide_with_objects = true;
pointable = false;
glow = 14;
static_save = false;
|
| |
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
age = u.marshal.t.u32;
lastemit = u.marshal.t.u32;
}
minetest.register_entity('sorcery:spell_projectile_flamebolt',{
initial_properties = {
visual = "sprite";
use_texture_alpha = 'blend';
textures = {'sorcery_fireball.png'};
visual_size = { x = 2, y = 2, z = 2 };
physical = true;
collide_with_objects = true;
pointable = false;
glow = 14;
static_save = false;
|
Deleted hotmetallurgy.lua version [ac0bc31ba3].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 |
-- alloying furnace -- -- there are several kinds of alloy furnace, with varying -- capabilities. the simplest can alloy two simple metals; -- the most complex can alloy four high-grade metals such -- as titanium, platinum, iridium, or levitanium. -- -- furnace recipes follow a pattern: the number of crucibles -- determines the input slots, the type of crucible determines -- how hot the furnace can get, and various other components -- (like a coolant circulator) can be added to allow the -- creation of exotic metals. -- -- alloy furnaces produce ingots that can later be melted down -- again and cast into a mold to produce items of particular -- shapes. -- there are five kinds of crucibles: clay, aluminum, platinum, -- duridium, and impervium. clay crucibles are made by molding -- clay into the proper shape and then firing it in a furnace. -- others are made by casting. local fragments_per_ingot = 4 for _, c in pairs { 'clay', 'aluminum', 'platinum', 'duranium' } do minetest.register_craftitem('sorcery:crucible_' .. c, { description = sorcery.lib.str.capitalize(c .. ' crucible'); inventory_image = 'sorcery_crucible_' .. c .. '.png'; }) end minetest.register_craftitem('sorcery:crucible_clay_molding', { description = sorcery.lib.str.capitalize('Crucible molding'); inventory_image = 'sorcery_crucible_clay_molding.png'; }) minetest.register_craft { recipe = { { 'default:clay_lump', '', 'default:clay_lump'}; { 'default:clay_lump', '', 'default:clay_lump'}; { 'default:clay_lump', 'default:clay_lump', 'default:clay_lump'}; }; output = 'sorcery:crucible_clay_molding'; } minetest.register_craft { type = 'shapeless'; recipe = { 'sorcery:crucible_clay_molding' }; output = 'default:clay_lump 7'; } minetest.register_craft { type = 'cooking'; recipe = 'sorcery:crucible_clay_molding'; cooktime = 40; output = 'sorcery:crucible_clay'; } local burn_layout = function(v) local layouts = { [1] = {w = 1, h = 1}; [2] = {w = 2, h = 1}; [3] = {w = 3, h = 1}; [4] = {w = 2, h = 2}; [5] = {w = 3, h = 2}; [6] = {w = 3, h = 2}; [7] = {w = 4, h = 2}; [8] = {w = 4, h = 2}; [9] = {w = 3, h = 3}; } local inpos = { x = 2.8, y = 1 } local insize = layouts[v.in] local outpos = { x = 5.2, y = 2.4 } local outsize = layouts[v.out] local fuelpos = { x = 2.8, y = 3.4 } local fuelsize = layouts[v.fuel] return string.format([[ list[context;input;%f,%f;%f,%f;] list[context;output;%f,%f;%f,%f;] list[context;fuel;%f,%f;%f,%f;] image[2.3,1.9;1,1;default_furnace_fire_bg.png^[lowpart:%u%%:default_furnace_fire_fg.png] image[3.2,1.9;1,1;gui_furnace_arrow_bg.png^[lowpart:%u%%:gui_furnace_arrow_fg.png^[transformR270] listring[context;output] listring[current_player;main] listring[context;input] listring[current_player;main] listring[context;fuel] listring[current_player;main] ]], --input inpos.x - insize.w/2, -- pos inpos.y - insize.h/2, insize.w, insize.h, -- size --output outpos.x - outsize.w/2, -- pos outpos.y - outsize.h/2, outsize.w, outsize.h, -- size --fuel fuelpos.x - fuelsize.w/2, -- pos fuelpos.y - fuelsize.h/2, fuelsize.w, fuelsize.h, -- size v.burn, v.prog ) end local kiln_formspec = function(kind, fuel_progress, cook_progress) return [[ size[8,8] list[current_player;main;0,4.2;8,4] list[context;wax;0,2;1,1] ]] .. burn_layout{ in = kind.size^2; out = kind.outsize; fuel = kind.fuelsize; burn = fuel_progress; prog = cook_progress; } end local smelter_formspec = function(kind, fuel_progress, smelt_progress) return [[ size[8,8] list[current_player;main;0,4.2;8,4] ]] .. burn_layout { in = kind.size; out = kind.outsize; fuel = kind.fuelsize; burn = fuel_progress; prog = smelt_progress; } end local find_recipe = function(inv) local mix = {} local count = 0 for i=1,inv:get_size('input') do local m = inv:get_stack('input',i) if m:is_empty() then goto skip end local l = sorcery.data.metallookup[m:get_name()] if not l then return false end mix[l.id] = (mix[l.id] or 0) + l.value count = count + l.value ::skip::end -- everything is metal, we've finished summing it up. -- let's see if the assembled items match the ratio -- specified in any of the smelting recipes. local matches = 0 for _,rec in pairs(sorcery.data.alloys) do local fac = nil local meltpoint = 1 if rec.metals == nil then goto skip_recipe end for metal, ratio in pairs(rec.metals) do if mix[metal] and mix[metal] % ratio == 0 then if fac then if mix[metal] / ratio ~= fac then goto skip_recipe end else fac = math.floor(mix[metal] / ratio) end local m = sorcery.data.metals[metal] if m.meltpoint then meltpoint = math.max(meltpoint, m.meltpoint) end else goto skip_recipe end end do return rec, count, fac, meltpoint end ::skip_recipe::end return false end local update_smelter = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local proto = minetest.registered_nodes[minetest.get_node(pos).name]._proto local recipe, count, factor, meltpoint = find_recipe(inv) if recipe --[[and proto.temp >= meltpoint]] then minetest.get_node_timer(pos):start(1) else meta:set_float('burntime',0) end end local smelter_step = function(kind,active,pos,delta) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local recipe, count, factor = find_recipe(inv) local cooktime local elapsed = meta:get_float('burntime') + delta meta:set_float('burnleft',meta:get_float('burnleft') - delta) if (not active) and (not recipe) then return false end if meta:get_float('burnleft') <= 0 or not active then if recipe then local burn, frep = minetest.get_craft_result { method = 'fuel', width = 1; items = { inv:get_stack('fuel',1) }; } if burn.time == 0 then goto nofuel end inv:set_stack('fuel', 1, frep.items[1]) meta:set_float('burnleft',burn.time) meta:set_float('burnmax',burn.time) if not active then minetest.swap_node(pos, sorcery.lib.tbl.merge(minetest.get_node(pos), { name = kind.id .. '_active' })) active = true end else goto nofuel end end if not recipe then goto update end cooktime = ((recipe.cooktime / fragments_per_ingot) * count) / factor if elapsed >= cooktime then elapsed = 0 -- remove used items for i=1,inv:get_size('input') do local s = inv:get_stack('input',i) if s:is_empty() then goto skip end s:take_item(1) inv:set_stack('input',i,s) ::skip::end local outstack if count % fragments_per_ingot == 0 then outstack = ItemStack { name = sorcery.data.metals[recipe.output].ingot or 'sorcery:' .. recipe.output .. '_ingot'; count = count / fragments_per_ingot; } else outstack = ItemStack { name = 'sorcery:fragment_' .. recipe.output; count = count; } end local leftover = inv:add_item('output',outstack) if not leftover:is_empty() then minetest.add_item(pos, leftover) end end ::update:: meta:set_float('burntime',elapsed) meta:set_string('formspec', smelter_formspec(kind, math.min(1, meta:get_float('burnleft') / meta:get_float('burnmax') ) * 100, -- fuel (cooktime and math.min(1, elapsed / cooktime) * 100) or 0 -- smelt )) do return active end ::nofuel:: if active then minetest.swap_node(pos, sorcery.lib.tbl.merge(minetest.get_node(pos), { name = kind.id })) end meta:set_float('burnleft',0) -- just in case ::noburn:: meta:set_float('burntime',0) -- just in case meta:set_string('formspec', smelter_formspec(kind, 0, 0)) return false end local register_kiln = function(kind) local box = { open = { type = 'fixed'; fixed = { -0.5,-0.5,-0.5, 0.5, 1.6, 0.5 }; }; closed = { type = 'fixed'; fixed = { -0.5,-0.5,-0.5, 0.5, 0.7, 0.5 }; }; } local id = 'sorcery:kiln_' .. kind.material local metal = sorcery.data.metals[kind.material] -- use some iffy heuristics to guess the texture local metaltex if kind.material == 'clay' then metaltex = 'default_brick.png'; else metaltex = (metal.img and metal.img.block) or (metal.ingot and 'default_' .. kind.material .. '_block.png') or sorcery.lib.image('default_steel_block.png'):multiply(sorcery.lib.color(metal.tone)):render(); end local tex = { open = { 'default_furnace_front.png'; metaltex; 'default_copper_block.png'; 'default_stone.png'; }; closed = { 'default_furnace_front_active.png'; 'default_copper_block.png'; metaltex; 'default_stone.png'; }; }; for _,state in pairs{'open','closed'} do local id_closed = id .. '_closed' local id_current = (state == 'closed' and id_closed) or id local desc = sorcery.lib.str.capitalize(kind.temp_name) .. ' kiln'; minetest.register_node(id_current, { _active = (state == 'closed'); _proto = kind; description = desc; drawtype = "mesh"; mesh = 'sorcery-kiln-' .. state .. '.obj'; drop = id; groups = { cracky = 2; sorcery_device_kiln = (state == 'closed') and 1 or 2; } sunlight_propagates = true; paramtype1 = 'light'; paramtype2 = 'facedir'; selection_box = box[state]; collision_box = box[state]; tiles = tex[state]; light_source = (state == 'closed' and 7) or 0; on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size('input', kind.size^2) inv:set_size('output', kind.outsize) inv:set_size('fuel', kind.fuelsize) inv:set_size('wax', 1) meta:set_float('burnleft',0) meta:set_float('burnmax',0) meta:set_float('burntime',0) meta:set_string('infotext',desc) meta:set_string('formspec',kiln_formspec(kind,0,0)) end; on_timer = function(pos,delta) end; on_metadata_inventory_put = function(pos) minetest.get_node_timer(pos):start(1) end; on_metadata_inventory_move = function(pos) minetest.get_node_timer(pos):start(1) end; on_metadata_inventory_take = function(pos) minetest.get_node_timer(pos):start(1) end; }) end local ingot if kind.material == 'clay' then ingot = 'default:clay_brick'; else ingot = metal.ingot or 'sorcery:' .. kind.material .. '_ingot' end minetest.register_craft = { output = id_open; recipe = { {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}; {ingot,'',ingot}; {ingot,'default:furnace',ingot}; }; } end local register_smelter = function(kind) local recipe = {{},{}; {'default:stone','default:furnace','default:stone'}; } do local on = kind.crucible local ti = 'default:tin_ingot' local cu = 'default:copper_ingot' local crucmap = { [2] = { {cu,cu,cu}, {on,ti,on} }; [3] = { {cu,on,cu}, {on,ti,on} }; [4] = { {on,cu,on}, {on,ti,on} }; [5] = { {on,cu,on}, {on,on,on} }; [6] = { {on,on,on}, {on,on,on} }; }; for y=1,2 do recipe[y] = crucmap[kind.size][y] end end local desc = 'smelter'; if kind.temp_name then desc = kind.temp_name .. ' ' .. desc end if kind.size_name then desc = kind.size_name .. ' ' .. desc end desc = sorcery.lib.str.capitalize(desc); local id = 'sorcery:smelter_' .. kind.material .. kind.size_name kind.id = id for _, active in pairs {false, true} do minetest.register_node((active and id .. '_active') or id, { _proto = kind; description = desc; drop = id; groups = { cracky = 2; sorcery_device_smelter = active and 1 or 2; }; paramtype2 = 'facedir'; light_source = (active and 9) or 0; on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size('input',kind.size) inv:set_size('output',kind.outsize) inv:set_size('fuel',kind.fuelsize) meta:set_string('infotext', desc) meta:set_string('formspec', smelter_formspec(kind, 0, 0)) meta:set_float('burnleft',0) meta:set_float('burnmax',0) meta:set_float('burntime',0) end; on_metadata_inventory_put = update_smelter; on_metadata_inventory_move = update_smelter; on_metadata_inventory_take = update_smelter; on_timer = function(pos,delta) return smelter_step(kind, active, pos, delta) end; -- allow_metadata_inventory_put = function(pos, listname, index, stack, player) -- end; tiles = { 'sorcery_smelter_top_' .. tostring(kind.size) .. '.png'; 'sorcery_smelter_bottom.png'; 'sorcery_smelter_side.png'; 'sorcery_smelter_side.png'; 'sorcery_smelter_side.png'; 'sorcery_smelter_front' .. ((active and '_hot') or '') .. '.png'; }; }) end minetest.register_craft { recipe = recipe; output = id; } end for _, t in pairs { {1, nil, 'clay'}; -- {2, 'hot','aluminum'}; -- {3, 'volcanic','platinum'}; -- {4, 'stellar','duridium'}; -- {5, 'nova','impervium'}; } do register_kiln { temp = t[1], temp_name = t[2]; material = t[3]; size = 3, outsize = 4, fuelsize = 1; -- future-proofing } for _, s in pairs { {2, 'small'}; {3, 'large'}; {4, 'grand'}; } do register_smelter { size = s[1], size_name = s[2]; temp = t[1], temp_name = t[2]; material = t[3]; crucible = 'sorcery:crucible_' .. t[3]; outsize = 4, fuelsize = 1; -- future-proofing } end end |
< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < < |
Modified init.lua from [98e23bb4d1] to [b6f042d41b].
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
root {'compat','matreg'}
if not sorcery.stage('loadlore', data, root) then
data {
'compat';
'affinities'; 'gods';
'calendar', 'signs';
'resonance';
'enchants', 'spells', 'runes';
'gems', 'metals';
'potions', 'oils', 'greases',
'draughts', 'elixirs',
'philters', 'extracts';
}
end
sorcery.load('registration') do
|
< > |
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
root {'compat','matreg'}
if not sorcery.stage('loadlore', data, root) then
data {
'compat';
'affinities'; 'gods';
'calendar', 'signs';
'resonance';
'gems', 'metals';
'enchants', 'spells', 'runes';
'potions', 'oils', 'greases',
'draughts', 'elixirs',
'philters', 'extracts';
}
end
sorcery.load('registration') do
|
Modified leylines.lua from [a8ee2829a5] to [3f1f974e2b].
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
name = 'Condenser sound effects';
nodenames = {'sorcery:condenser'};
neighbors = {'group:sorcery_ley_device'};
interval = 5.6, chance = 1, catch_up = false;
action = function(pos)
local force = sorcery.ley.estimate(pos).force
minetest.sound_play('sorcery_condenser_bg', {
pos = pos, max_hear_distance = 5 + 8*force, gain = force*0.3;
})
end;
}
end
minetest.register_craft {
output = 'sorcery:condenser';
|
| |
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 |
name = 'Condenser sound effects';
nodenames = {'sorcery:condenser'};
neighbors = {'group:sorcery_ley_device'};
interval = 5.6, chance = 1, catch_up = false;
action = function(pos)
local force = sorcery.ley.estimate(pos).force
minetest.sound_play('sorcery_condenser_bg', {
pos = pos, max_hear_distance = 5 + 4*force, gain = force*0.3;
})
end;
}
end
minetest.register_craft {
output = 'sorcery:condenser';
|
Modified lib/color.lua from [818d3ded97] to [9a1b399926].
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
...
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
-- print("r"..self.red.."g"..self.green.."b"..self.blue.." is h"..hue.."s"..saturation.."l"..luminosity)
local temp = from_hsl({hue=hue,saturation=saturation,luminosity=luminosity},self.alpha)
-- print("back is r"..temp.red.."g"..temp.green.."b"..temp.blue)
return { hue = hue, saturation = saturation, luminosity = luminosity }
end;
readable = function(self, target)
target = target or 0.5
local hsl = self:to_hsl()
hsl.luminosity = target
return from_hsl(hsl, self.alpha)
end;
bg = function(self, text) return
text .. minetest.get_background_escape_sequence(self:hex())
end;
................................................................................
brighten = function(self, fac)
-- Use HSL to brighten
-- To HSL
local hsl = self:to_hsl()
-- Do the calculation, clamp to 0-1 instead of the clamp fn
hsl.luminosity = math.min(math.max(hsl.luminosity * fac, 0), 1)
-- Turn back into RGB color
local t = from_hsl(hsl, self.alpha)
-- print("brighten is r"..t.red.."g"..t.green.."b"..t.blue)
return from_hsl(hsl, self.alpha)
end;
darken = warp(function(new, fac)
-- TODO: is there any point to this being different than brighten? Probably especially not now.
new.red = clip(new.red - (new.red * fac))
|
|
>
>
>
>
>
>
>
|
>
|
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
-- print("r"..self.red.."g"..self.green.."b"..self.blue.." is h"..hue.."s"..saturation.."l"..luminosity)
local temp = from_hsl({hue=hue,saturation=saturation,luminosity=luminosity},self.alpha)
-- print("back is r"..temp.red.."g"..temp.green.."b"..temp.blue)
return { hue = hue, saturation = saturation, luminosity = luminosity }
end;
readable = function(self, target)
target = target or 0.6
local hsl = self:to_hsl()
hsl.luminosity = target
local worstHue = 230
local nearness = math.abs(worstHue - hsl.hue)
if nearness <= 70 then
local boost = 1.0 - (nearness / 70)
hsl.luminosity = math.min(1, hsl.luminosity * (1 + (boost*0.4)))
end
return from_hsl(hsl, self.alpha)
end;
bg = function(self, text) return
text .. minetest.get_background_escape_sequence(self:hex())
end;
................................................................................
brighten = function(self, fac)
-- Use HSL to brighten
-- To HSL
local hsl = self:to_hsl()
-- Do the calculation, clamp to 0-1 instead of the clamp fn
hsl.luminosity = math.min(math.max(hsl.luminosity * fac, 0), 1)
-- Turn back into RGB color
-- local t = from_hsl(hsl, self.alpha)
-- print("darker is r"..hsl.red.."g"..hsl.green.."b"..hsl.blue)
-- print("brighten is r"..t.red.."g"..t.green.."b"..t.blue)
return from_hsl(hsl, self.alpha)
end;
darken = warp(function(new, fac)
-- TODO: is there any point to this being different than brighten? Probably especially not now.
new.red = clip(new.red - (new.red * fac))
|
Added lib/hud.lua version [a485497e38].
> > > > > > > > > > > > > > > > > > > > > > > > > > > > |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
-- the HUD library provides an easy-to-use interface for create custom -- item UIs. the idea is that an item <id> will define one or more UI layouts -- in its _sorcery.hud property, then call lib.hud.open(id, layout, player, ...) -- when it wishes to open <layout>, usually from its on_use handler. the library -- will then iterate through the elements in its definition, transmit them to -- the user, and store the resulting handles in a user context. it will also -- register any timer callbacks needed to ensure a timely update of the item. -- if the item is removed from the hotbar, any UI associated with it will be -- closed. -- -- each UI element can have a function that is called to set its value. if -- this is present, it will be called at initialization and at update. -- -- example: -- _sorcery = { -- hud = { -- powerlevel = { -- period = 0.1; -- elements = { -- {kind = 'text', -- text = function(ctx) -- return ctx.stack:get_meta():get_int("power") -- end; -- }; -- }; -- }; -- }; -- }; |
Modified lib/tbl.lua from [6f943d189b] to [d4f49ab351].
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
new[k] = fn.deepcopy(v)
else
new[k] = v
end
end
return new
end
fn.merge = function(base,override)
local new = fn.copy(base)
for k,v in pairs(override) do
new[k] = v
end
return new
end
fn.deepmerge = function(base,override,func)
local new = {}
local keys = fn.merge(fn.keys(base),fn.keys(override))
for _,k in pairs(keys) do
if type(base[k]) == 'table' and
type(override[k]) == 'table' then
new[k] = fn.deepmerge(base[k], override[k], func)
elseif func and override[k] and base[k] then
new[k] = func(base[k],override[k], k)
elseif override[k] then
new[k] = override[k]
else
new[k] = base[k]
end
end
return new
end
fn.append = function(r1, r2)
local new = fn.copy(r1)
for i=1,#r2 do
new[#new + 1] = r2[i]
end
return new
end
fn.has = function(tbl,value,eqfn)
for k,v in pairs(tbl) do
if eqfn then
if eqfn(v,value,tbl) then return true, k end
|
> > > > > > > > | < < < < < < < < |
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
new[k] = fn.deepcopy(v) else new[k] = v end end return new end fn.append = function(r1, r2) local new = fn.copy(r1) for i=1,#r2 do new[#new + 1] = r2[i] end return new end fn.merge = function(base,override) local new = fn.copy(base) for k,v in pairs(override) do new[k] = v end return new end fn.deepmerge = function(base,override,func) local new = {} local keys = fn.append(fn.keys(base),fn.keys(override)) for _,k in pairs(keys) do if type(base[k]) == 'table' and type(override[k]) == 'table' then new[k] = fn.deepmerge(base[k], override[k], func) elseif func and override[k] and base[k] then new[k] = func(base[k],override[k], k) elseif override[k] then new[k] = override[k] else new[k] = base[k] end end return new end fn.has = function(tbl,value,eqfn) for k,v in pairs(tbl) do if eqfn then if eqfn(v,value,tbl) then return true, k end |
Modified lib/ui.lua from [a001c55363] to [787cef01b1].
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
local l = sorcery.lib
local dui = sorcery.data.ui
return {
tooltip = function(a)
local color = a.color
if color == nil then color = l.color(136,158,177) end
local str = a.title
if a.desc then
str = str .. '\n' .. color:fmt(minetest.wrap_text(a.desc,60))
end
if a.props then
-- str = str .. '\n'
for _,prop in pairs(a.props) do
local c
if prop.color and l.color.id(prop.color) then
c = prop.color
elseif dui.colors[prop.affinity] then
c = l.color(dui.colors[prop.affinity])
else
c = l.color(dui.colors.neutral)
end
str = str .. '\n ' .. c:fmt('* ')
if prop.title then
str = str .. c:brighten(1.3):fmt(prop.title) .. ': '
end
local lines = minetest.wrap_text(prop.desc, 50, true)
str = str .. c:fmt(lines[1])
for i=2,#lines do
str = str .. '\n' .. string.rep(' ',5) .. c:fmt(lines[i])
end
end
end
return str
end;
}
|
| | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
local l = sorcery.lib
local dui = sorcery.data.ui
return {
tooltip = function(a)
local color = a.color and a.color:readable()
if color == nil then color = l.color(136,158,177) end
local str = a.title
if a.desc then
str = str .. '\n' .. color:fmt(minetest.wrap_text(a.desc,60))
end
if a.props then
-- str = str .. '\n'
for _,prop in pairs(a.props) do
local c
if prop.color and l.color.id(prop.color) then
c = prop.color:readable()
elseif dui.colors[prop.affinity] then
c = l.color(dui.colors[prop.affinity])
else
c = l.color(dui.colors.neutral)
end
str = str .. '\n ' .. c:fmt('* ')
if prop.title then
str = str .. c:brighten(1.3):fmt(prop.title) .. ': '
end
local lines = minetest.wrap_text(prop.desc, 55, true)
str = str .. c:fmt(lines[1])
for i=2,#lines do
str = str .. '\n' .. string.rep(' ',5) .. c:fmt(lines[i])
end
end
end
return color:darken(0.8):bg(str)
end;
}
|
Modified metallurgy-cold.lua from [0187673a26] to [3417cf14d8].
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
mp.torque = constants.grind_torque_factor * mp.hardness mp.grindvalue = mp.grindvalue or constants.default_grindvalue mp.grindcost = mp.grindcost or constants.default_grindcost if item:get_wear() ~= 0 then -- prevent cheating by recovering metal from items before they -- are destroyed local wearfac = (item:get_wear() / 65535) mp.grindvalue = math.max(1,math.ceil(mp.grindvalue * wearfac)) mp.hardness = math.max(1,math.ceil(mp.grindcost * wearfac)) mp.torque = math.max(1,math.ceil(mp.torque * wearfac)) end return mp end |
| |
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
mp.torque = constants.grind_torque_factor * mp.hardness
mp.grindvalue = mp.grindvalue or constants.default_grindvalue
mp.grindcost = mp.grindcost or constants.default_grindcost
if item:get_wear() ~= 0 then
-- prevent cheating by recovering metal from items before they
-- are destroyed
local wearfac = 1-(item:get_wear() / 65535)
mp.grindvalue = math.max(1,math.ceil(mp.grindvalue * wearfac))
mp.hardness = math.max(1,math.ceil(mp.grindcost * wearfac))
mp.torque = math.max(1,math.ceil(mp.torque * wearfac))
end
return mp
end
|
Modified portal.lua from [12b64fac56] to [149a85d413].
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
time = 2;
amount = 500 * fac;
minpos = { x = -0.3, y = 0, z = -0.3 };
maxpos = { x = 0.3, y = 1.5, z = 0.3 };
minvel = { x = -0.3, y = 0.4, z = -0.3 };
maxvel = { x = 0.3, y = 0.6, z = 0.3 };
maxacc = { x = 0, y = 0.5, z = 0 };
texture = sorcery.lib.image('sorcery_spark.png'):multiply(sorcery.lib.color(255,144,226)):render();
minexptime = 1.5;
maxexptime = 2;
minsize = 0.4;
maxsize = 1.6 * fac;
glow = 14;
attached = u.object;
animation = {
|
| |
358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 |
time = 2;
amount = 500 * fac;
minpos = { x = -0.3, y = 0, z = -0.3 };
maxpos = { x = 0.3, y = 1.5, z = 0.3 };
minvel = { x = -0.3, y = 0.4, z = -0.3 };
maxvel = { x = 0.3, y = 0.6, z = 0.3 };
maxacc = { x = 0, y = 0.5, z = 0 };
texture = sorcery.lib.image('sorcery_sputter.png'):glow(sorcery.lib.color(255,144,226)):render();
minexptime = 1.5;
maxexptime = 2;
minsize = 0.4;
maxsize = 1.6 * fac;
glow = 14;
attached = u.object;
animation = {
|
Modified potions.lua from [f87e1ae861] to [2e6379fa76].
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
sorcery.register_potion = function(name,label,desc,color,imgvariant,glow,extra)
local image = 'sorcery_liquid_'..(imgvariant or 'dull')..'.png' ..
'^[multiply:'..tostring(color)..
'^vessels_glass_bottle.png'
sorcery.register.residue.link('sorcery:' .. name, 'vessels:glass_bottle')
local node = {
description = color:darken(0.8):bg(
sorcery.lib.ui.tooltip {
title = label;
desc = desc;
color = color:readable();
}
-- label .. (desc and ("\n" .. color:readable():fmt(desc)) or '')
);
short_description = label;
drawtype = "plantlike";
tiles = {image};
inventory_image = image;
paramtype = "light";
is_ground_content = false;
light_source = glow and math.min(minetest.LIGHT_MAX,glow) or 0;
|
| | | |
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
sorcery.register_potion = function(name,label,desc,color,imgvariant,glow,extra)
local image = 'sorcery_liquid_'..(imgvariant or 'dull')..'.png' ..
'^[multiply:'..tostring(color)..
'^vessels_glass_bottle.png'
sorcery.register.residue.link('sorcery:' .. name, 'vessels:glass_bottle')
local node = {
description = --color:darken(0.8):bg(
sorcery.lib.ui.tooltip {
title = label;
desc = desc;
color = color:readable();
};
-- label .. (desc and ("\n" .. color:readable():fmt(desc)) or '')
--);
short_description = label;
drawtype = "plantlike";
tiles = {image};
inventory_image = image;
paramtype = "light";
is_ground_content = false;
light_source = glow and math.min(minetest.LIGHT_MAX,glow) or 0;
|
Modified runeforge.lua from [4e5c236dfa] to [6c2e235473].
1 2 3 4 5 6 7 8 9 10 11 12 .. 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 ... 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 ... 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 |
-- TODO make some kind of disposable "filter" tool that runeforges require
-- to generate runes and that wears down over time, to make amulets more
-- 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 = 240;
-- how often a powered forge rolls for new runes
rune_cache_max = 4;
-- how many runes a runeforge can hold at a time
................................................................................
local fac = (g-1) / 5
return i - ((i*0.5) * fac), 0.5 * fac
end
sorcery.register.runes.foreach('sorcery:generate',{},function(name,rune)
local id = 'sorcery:rune_' .. name
rune.image = rune.image or string.format('sorcery_rune_%s.png',name)
rune.item = id
minetest.register_craftitem(id, {
description = sorcery.lib.color(rune.tone):readable():fmt(rune.name .. ' Rune');
short_description = rune.name .. ' Rune';
inventory_image = rune.image;
stack_max = 1;
groups = {
sorcery_rune = 1;
not_in_creative_inventory = 1;
};
................................................................................
local rp = rune:get_definition()._proto
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
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;
................................................................................
local i = m:get_inventory()
i:set_size('cache',constants.rune_cache_max)
i:set_size('wrench',1) i:set_size('phial',1) i:set_size('refuse',1)
i:set_size('amulet',1) i:set_size('active',1)
m:set_string('infotext','Rune Forge')
runeforge_update(pos)
end;
after_dig_node = sorcery.lib.node.purge_only {'amulet'};
on_timer = runeforge_update;
on_metadata_inventory_move = function(pos, fl,fi, tl,ti, count, user)
local inv = minetest.get_meta(pos):get_inventory()
local wrench if not inv:is_empty('wrench') then
wrench = inv:get_stack('wrench',1):get_definition()._proto
end
local wwear = function(cap)
|
> > | | | |
1 2 3 4 5 6 7 8 9 10 11 12 13 .. 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 ... 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 ... 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 |
-- TODO make some kind of disposable "filter" tool that runeforges require -- to generate runes and that wears down over time, to make amulets more -- 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 -- -- are phials & rune-wrenches enough for this now? local constants = { 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 ................................................................................ local fac = (g-1) / 5 return i - ((i*0.5) * fac), 0.5 * fac end sorcery.register.runes.foreach('sorcery:generate',{},function(name,rune) local id = 'sorcery:rune_' .. name rune.image = rune.image or string.format('sorcery_rune_%s.png',name) rune.item = id local c = sorcery.lib.color(rune.tone) minetest.register_craftitem(id, { description = c:darken(0.7):bg(c:readable():fmt(rune.name .. ' Rune')); short_description = rune.name .. ' Rune'; inventory_image = rune.image; stack_max = 1; groups = { sorcery_rune = 1; not_in_creative_inventory = 1; }; ................................................................................ local rp = rune:get_definition()._proto 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 if spell.mingrade and spell.mingrade > 0 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; ................................................................................ local i = m:get_inventory() i:set_size('cache',constants.rune_cache_max) i:set_size('wrench',1) i:set_size('phial',1) i:set_size('refuse',1) i:set_size('amulet',1) i:set_size('active',1) m:set_string('infotext','Rune Forge') runeforge_update(pos) end; after_dig_node = sorcery.lib.node.purge_only {'amulet','wrench'}; on_timer = runeforge_update; on_metadata_inventory_move = function(pos, fl,fi, tl,ti, count, user) local inv = minetest.get_meta(pos):get_inventory() local wrench if not inv:is_empty('wrench') then wrench = inv:get_stack('wrench',1):get_definition()._proto end local wwear = function(cap) |
Modified vfx.lua from [423ee7c3cf] to [d0158e43bb].
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
..
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
and function(x) return vector.add(pos,x) end
or function(x) return x end
local height = caster:get_properties().eye_height
minetest.add_particlespawner {
amount = 70 * strength;
time = duration or 1.5;
attached = caster;
texture = sorcery.lib.image('sorcery_spark.png'):multiply(color):render();
minpos = ofs({ x = 0.0, z = 0.6, y = height*0.7});
maxpos = ofs({ x = 0.4, z = 0.2, y = height*1.1});
minvel = { x = -0.5, z = -0.5, y = -0.5};
maxvel = { x = 0.5, z = 0.5, y = 0.5};
minacc = { x = 0.0, z = 0.0, y = 0.5};
maxacc = { x = 0.0, z = 0.0, y = 0.5};
minsize = 0.4, maxsize = 0.8;
................................................................................
end
sorcery.vfx.enchantment_sparkle = function(tgt,color)
local minvel, maxvel
if minetest.get_node(vector.add(tgt.under,{y=1,z=0,x=0})).name == 'air' then
minvel = {x=0,z=0,y= 0.3} maxvel = {x=0,z=0,y= 1.5};
else
local dir = vector.subtract(tgt.under,tgt.above)
minvel = vector.multiply(dir, 0.3)
maxvel = vector.multiply(dir, 1.2)
end
return minetest.add_particlespawner {
amount = 50;
time = 0.5;
minpos = vector.subtract(tgt.under, 0.5);
|
|
>
|
|
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
..
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
and function(x) return vector.add(pos,x) end
or function(x) return x end
local height = caster:get_properties().eye_height
minetest.add_particlespawner {
amount = 70 * strength;
time = duration or 1.5;
attached = caster;
-- texture = sorcery.lib.image('sorcery_spark.png'):multiply(color):render();
texture = sorcery.vfx.glowspark(color):render();
minpos = ofs({ x = 0.0, z = 0.6, y = height*0.7});
maxpos = ofs({ x = 0.4, z = 0.2, y = height*1.1});
minvel = { x = -0.5, z = -0.5, y = -0.5};
maxvel = { x = 0.5, z = 0.5, y = 0.5};
minacc = { x = 0.0, z = 0.0, y = 0.5};
maxacc = { x = 0.0, z = 0.0, y = 0.5};
minsize = 0.4, maxsize = 0.8;
................................................................................
end
sorcery.vfx.enchantment_sparkle = function(tgt,color)
local minvel, maxvel
if minetest.get_node(vector.add(tgt.under,{y=1,z=0,x=0})).name == 'air' then
minvel = {x=0,z=0,y= 0.3} maxvel = {x=0,z=0,y= 1.5};
else
local dir = vector.subtract(tgt.above,tgt.under)
minvel = vector.multiply(dir, 0.3)
maxvel = vector.multiply(dir, 1.2)
end
return minetest.add_particlespawner {
amount = 50;
time = 0.5;
minpos = vector.subtract(tgt.under, 0.5);
|
Modified wands.lua from [e661ef77a3] to [3776b1d392].
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 ... 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 ... 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 |
end
return proto
end;
matprops = function(proto)
local matprops = {}
for k,v in pairs(proto) do
if sorcery.wands.materials[k] then
local mp = sorcery.wands.materials[k].wandprops
if mp then
matprops = sorcery.lib.tbl.deepmerge(matprops, mp,
function(a,b,k)
if key == 'bond'
then return a+b
else return a*b
end
end)
end
end
................................................................................
angle = user:get_look_horizontal();
eyeheight = uprops.eye_height;
};
wearmult = 1;
}
local result = castfn(context)
if result ~= false then
minetest.sound_play(sorcery.data.spells[spell].sound or "default_item_smoke", { --FIXME make own sounds
pos = user:get_pos();
gain = 0.8;
})
-- minetest.add_particle {
-- pos = vector.add(vector.add(user:get_pos(), vector.multiply(user:get_look_dir(),1.1)), {y=1.6,z=0,x=0});
-- velocity = user:get_velocity();
-- expirationtime = 0.5;
................................................................................
sunlight_propagates = true;
paramtype = 'light';
paramtype2 = 'facedir';
tiles = images;
selection_box = hitbox;
collision_box = hitbox;
after_dig_node = sorcery.lib.node.purge_container;
use_texture_alpha = true;
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size('wand', 1)
update_stand_info(pos)
end;
_proto = {
|
| | | | |
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 ... 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 ... 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 |
end
return proto
end;
matprops = function(proto)
local matprops = {}
for k,v in pairs(proto) do
if sorcery.wands.materials[k] then
local mp = sorcery.wands.materials[k][v].wandprops
if mp then
matprops = sorcery.lib.tbl.deepmerge(matprops, mp,
function(a,b,key)
if key == 'bond'
then return a+b
else return a*b
end
end)
end
end
................................................................................
angle = user:get_look_horizontal();
eyeheight = uprops.eye_height;
};
wearmult = 1;
}
local result = castfn(context)
if result ~= false then
minetest.sound_play(sorcery.data.spells[spell].sound or "sorcery_chime", { --FIXME make better sound
pos = user:get_pos();
gain = 0.8;
})
-- minetest.add_particle {
-- pos = vector.add(vector.add(user:get_pos(), vector.multiply(user:get_look_dir(),1.1)), {y=1.6,z=0,x=0});
-- velocity = user:get_velocity();
-- expirationtime = 0.5;
................................................................................
sunlight_propagates = true;
paramtype = 'light';
paramtype2 = 'facedir';
tiles = images;
selection_box = hitbox;
collision_box = hitbox;
after_dig_node = sorcery.lib.node.purge_container;
use_texture_alpha = 'blend';
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size('wand', 1)
update_stand_info(pos)
end;
_proto = {
|