@@ -1,8 +1,9 @@ local altar_item_offset = { x = 0, y = -0.3, z = 0 } local log = sorcery.logger('altar') +local L = sorcery.lib local range = function(min, max) local span = max - min local val = math.random() * span @@ -61,8 +62,10 @@ end for _, g in ipairs(bad) do god.gifts[g] = nil end end end) + +local god_interval = 1 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, @@ -69,8 +72,14 @@ god.idol.width / 2.0, god.idol.height / 2.0, 0.15 } -- {xmin, ymin, zmin, -- xmax, ymax, zmax} in nodes from node center. paramtype = "light"; + if god.idol.craft then + minetest.register_craft { + output = 'sorcery:idol_' .. name; + recipe = god.idol.craft; + }; + end sorcery.lib.node.reg_autopreserve('sorcery:idol_' .. name, { description = god.idol.desc; drawtype = "mesh"; mesh = 'sorcery-idol-' .. name .. '.obj'; @@ -83,9 +92,9 @@ collision_box = { type = "fixed"; fixed = {hitbox}; }; groups = { cracky = 2, sorcery_idol = 1, heavy = 1, sorcery_worship = 1}; on_construct = function(pos) - minetest.get_node_timer(pos):start(1) + minetest.get_node_timer(pos):start(god_interval) end; on_timer = function(pos, elapsed) local altar = minetest.find_node_near(pos, 3, "sorcery:altar") @@ -96,8 +105,29 @@ 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 local bestow = function(item,color) if type(item) == 'string' then item = ItemStack(item) end @@ -156,9 +186,9 @@ end if inv:is_empty('item') then -- nothing on the altar. decide if we're going to do a -- gift cycle by rolling against the god's stinginess - if math.random(god.stinginess) == 1 then + if god.gifts and next(god.gifts) and math.random(god.stinginess) == 1 then -- we've beat the odds and started a gift cycle. now -- we pick a random gift and roll against its rarity -- to determine if the god is feeling generous local gift = sorcery.lib.tbl.pick(god.gifts)