@@ -63,9 +63,9 @@ for _, g in ipairs(bad) do god.gifts[g] = nil end end end) -local std_god_interval = 70 +local std_god_interval = 40 for name, god in pairs(sorcery.data.gods) do local hitbox = { 0-(god.idol.width / 2.0), 0-(god.idol.height / 2.0), -0.15, @@ -79,8 +79,32 @@ recipe = god.idol.craft; }; end local god_interval = std_god_interval * (god.freq or 1) + local add_sparkles = function(pos,divine_favor) + divine_favor = divine_favor or minetest.get_meta(pos):get_int('favor') + if divine_favor > 5 then + local ct = divine_favor / 5 + minetest.add_particlespawner { + texture = L.image('sorcery_glitter.png'):glow(L.color(god.color)):render(); + glow = 14; + amount = ct / (1 / god_interval), time = god_interval; + minpos = pos:offset(-0.4, -0.5, -0.4); + maxpos = pos:offset( 0.4,god.idol.height-0.5,0.4); + minvel = vector.new(0, 0.05, 0); + minvel = vector.new(0, 0.1, 0); + minacc = vector.new(0, 0.1, 0); + maxacc = vector.new(0, 0.2, 0); + minexptime = 4, maxexptime = 4; + minsize = 0.3, maxsize = 1; + animation = { + type = 'vertical_frames'; + length = 0.1; + aspect_w = 16, aspect_h = 16; + } + } + end + end sorcery.lib.node.reg_autopreserve('sorcery:idol_' .. name, { description = god.idol.desc; drawtype = "mesh"; mesh = 'sorcery-idol-' .. name .. '.obj'; @@ -90,12 +114,17 @@ stack_max = 1; tiles = god.idol.tex; selection_box = { type = "fixed"; fixed = {hitbox}; }; collision_box = { type = "fixed"; fixed = {hitbox}; }; - groups = { cracky = 2, sorcery_idol = 1, heavy = 1, sorcery_worship = 1}; + groups = { cracky = 2, sorcery_idol = 1, heavy = 1, sorcery_worship = 1, sorcery_instantiate = 1}; + _sorcery = { + idol_god = name; + on_load = function(pos) add_sparkles(pos) end; + }; on_construct = function(pos) minetest.get_node_timer(pos):start(god_interval) + add_sparkles(pos) end; on_timer = function(pos, elapsed) local altar = minetest.find_node_near(pos, 3, "sorcery:altar") @@ -106,29 +135,9 @@ local altarmeta = minetest.get_meta(altar) local inv = altarmeta:get_inventory() local idolmeta = minetest.get_meta(pos) local divine_favor = idolmeta:get_int('favor') - if divine_favor > 5 then - local ct = divine_favor / 5 - minetest.add_particlespawner { - texture = L.image('sorcery_glitter.png'):glow(L.color(god.color)):render(); - glow = 14; - amount = ct / (1 / god_interval), time = god_interval; - minpos = pos:offset(-0.4, -0.5, -0.4); - maxpos = pos:offset( 0.4,god.idol.height-0.5,0.4); - minvel = vector.new(0, 0.05, 0); - minvel = vector.new(0, 0.1, 0); - minacc = vector.new(0, 0.1, 0); - maxacc = vector.new(0, 0.2, 0); - minexptime = 4, maxexptime = 4; - minsize = 0.3, maxsize = 1; - animation = { - type = 'vertical_frames'; - length = 0.1; - aspect_w = 16, aspect_h = 16; - } - } - end + add_sparkles(pos,divine_favor) local bestow = function(item,color) if type(item) == 'string' then item = ItemStack(item) end @@ -196,9 +205,9 @@ local data = god.gifts[gift] local value, rarity = data[1], data[2] if value <= divine_favor and math.random(rarity) == 1 then bestow(gift) - log.act(god.name .. ' has produced ' .. gift .. ' upon an altar as a gift') + log.act(god.name,'has produced',gift,'upon an altar as a gift') if math.random(god.generosity) == 1 then -- unappreciated gifts may incur divine -- irritation divine_favor = divine_favor - 1 @@ -234,9 +243,10 @@ bestow(nil) end divine_favor = divine_favor + value - print(god.name.." has accepted a sacrifice of "..s..", raising divine favor by "..value.." points to "..divine_favor) + log.actf("%s has accepted a sacrifice of %s, raising divine favor by %u points to %u at altar %s", god.name, s, value, divine_favor, minetest.pos_to_string(pos)) + idolmeta:set_string('last_sacrifice', s) goto refresh end