X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;ds=sidebyside;f=enchanting.lua;h=5cc7ac275ded37e99c3bb847bb711103205a9382;hb=f1a50fdd9a4ca2223f5910f9f3d0cd8431911b17;hp=bfd6202b4843e3474d94563c230b9ae0f8bc995d;hpb=24c173792b8f38aea004fa4cb4259bc1f492492c;p=xdecor.git diff --git a/enchanting.lua b/enchanting.lua index bfd6202..5cc7ac2 100644 --- a/enchanting.lua +++ b/enchanting.lua @@ -2,15 +2,19 @@ local enchanting = {} function enchanting.construct(pos) local meta = minetest.get_meta(pos) - meta:set_string("formspec", "size[8,7;]"..xdecor.fancy_gui.. - "label[0.85,-0.15;Enchant]".. - "image[0.6,0.2;2,2;xdecor_enchbook.png]".. - "image[1.5,2;1,1;ench_mese_layout.png]".. + local xbg = default.gui_bg..default.gui_bg_img..default.gui_slots + local concat = table.concat + + local f = {"size[8,7;]"..xbg.. + "label[0.85,-0.15;Enchant]".."image[0.6,0.2;2,2;xdecor_enchbook.png]".. "list[current_name;tool;0.5,2;1,1;]".. - "list[current_name;mese;1.5,2;1,1;]".. + "list[current_name;mese;1.5,2;1,1;]".."image[1.5,2;1,1;mese_layout.png]".. "image_button[2.75,0;5,1.5;ench_bg.png;durable;Durable]".. "image_button[2.75,1.5;5,1.5;ench_bg.png;fast;Fast]".. - "list[current_player;main;0,3.3;8,4;]") + "list[current_player;main;0,3.3;8,4;]"} + local formspec = concat(f) + + meta:set_string("formspec", formspec) meta:set_string("infotext", "Enchantment Table") local inv = meta:get_inventory() @@ -18,36 +22,35 @@ function enchanting.construct(pos) inv:set_size("mese", 1) end -function enchanting.is_allowed_tool(toolname) +function enchanting.is_allowed(toolname) local tdef = minetest.registered_tools[toolname] - if tdef and string.find(toolname, "default:") and not - string.find(toolname, "sword") and not - string.find(toolname, "stone") and not - string.find(toolname, "wood") then + if tdef and toolname:find("default:") and not toolname:find("sword") and not + toolname:find("stone") and not toolname:find("wood") then return 1 else return 0 end end -function enchanting.fields(pos, formname, fields, sender) +function enchanting.fields(pos, _, fields, _) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local toolstack = inv:get_stack("tool", 1) local mesestack = inv:get_stack("mese", 1) local toolname = toolstack:get_name() + local toolwear = toolstack:get_wear() local mese = mesestack:get_count() - local enchs = {"durable", "fast"} - - for _, e in pairs(enchs) do - if enchanting.is_allowed_tool(toolname) ~= 0 and mese > 0 and fields[e] then - toolstack:replace("xdecor:enchanted_"..string.sub(toolname, 9).."_"..e) - mesestack:take_item() - inv:set_stack("mese", 1, mesestack) - inv:set_stack("tool", 1, toolstack) - end + local ench = dump(fields):match("%w+") + + if enchanting.is_allowed(toolname) ~= 0 and mese > 0 and + fields[ench] and ench ~= "quit" then + toolstack:replace("xdecor:enchanted_"..toolname:sub(9).."_"..ench) + toolstack:add_wear(toolwear) + mesestack:take_item() + inv:set_stack("mese", 1, mesestack) + inv:set_stack("tool", 1, toolstack) end end -function enchanting.dig(pos, player) +function enchanting.dig(pos, _) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -57,16 +60,16 @@ function enchanting.dig(pos, player) return true end -function enchanting.put(pos, listname, index, stack, player) +function enchanting.put(_, listname, _, stack, _) local toolname = stack:get_name() local count = stack:get_count() if listname == "mese" then if toolname == "default:mese_crystal" then return count - else return 0 end + else return 0 end end if listname == "tool" then - return enchanting.is_allowed_tool(toolname) + return enchanting.is_allowed(toolname) end return count end @@ -79,57 +82,54 @@ xdecor.register("enchantment_table", { "xdecor_enchantment_side.png", "xdecor_enchantment_side.png" }, groups = {cracky=1}, - sounds = xdecor.stone, - on_construct = enchanting.construct, + sounds = default.node_sound_stone_defaults(), can_dig = enchanting.dig, + on_construct = enchanting.construct, + on_receive_fields = enchanting.fields, allow_metadata_inventory_put = enchanting.put, - on_receive_fields = enchanting.fields + allow_metadata_inventory_move = function(...) return 0 end }) -function enchanting.register_enchtools(init, m, def) - local faster, longer = {}, {} - longer = init["uses"] * 1.2 -- Wearing factor for enchanted tools (higher number = longer use). - for i = 1, 3 do - faster[i] = init["times"][i] - 0.1 -- Digging factor for enchanted tools (higher number = faster dig). - end +local function capitalize(str) return str:gsub("^%l", string.upper) end + + -- Higher number = stronger enchant. +local use_factor = 1.2 +local times_subtractor = 0.1 - local enchtools = { - {"axe", "durable", {choppy = {times=def.times, uses=longer, maxlevel=def.maxlvl}}}, - {"axe", "fast", {choppy = {times=faster, uses=def.uses, maxlevel=def.maxlvl}}}, - {"pick", "durable", {cracky = {times=def.times, uses=longer, maxlevel=def.maxlvl}}}, - {"pick", "fast", {cracky = {times=faster, uses=def.uses, maxlevel=def.maxlvl}}}, - {"shovel", "durable", {crumbly = {times=def.times, uses=longer, maxlevel=def.maxlvl}}}, - {"shovel", "fast", {crumbly = {times=faster, uses=def.uses, maxlevel=def.maxlvl}}} - } - for _, x in pairs(enchtools) do - local tool, ench, grp = x[1], x[2], x[3] - minetest.register_tool("xdecor:enchanted_"..tool.."_"..m.."_"..ench, { - description = "Enchanted "..string.gsub(m, "%l", string.upper, 1).. - " "..string.gsub(tool, "%l", string.upper, 1).." ("..string.gsub(ench, "%l", string.upper, 1)..")", - inventory_image = minetest.registered_tools["default:"..tool.."_"..m]["inventory_image"], +function enchanting.register_enchtools() + local materials = {"steel", "bronze", "mese", "diamond"} + local tools = { {"axe", "choppy"}, {"pick", "cracky"}, {"shovel", "crumbly"} } + local chants = {"durable", "fast"} + + for j = 1, #materials do + for t = 1, #tools do + for i = 1, #chants do + local chant = chants[i] + local material = materials[j] + local tool_name = tools[t][1] + local main_groupcap = tools[t][2] + local original_tool = minetest.registered_tools["default:"..tool_name.."_"..material] + local original_groupcaps = original_tool.tool_capabilities.groupcaps + local groupcaps = table.copy(original_groupcaps) + + if chant == "durable" then + groupcaps[main_groupcap].uses = original_groupcaps[main_groupcap].uses * use_factor + elseif chant == "fast" then + for i = 1, 3 do + groupcaps[main_groupcap].times[i] = original_groupcaps[main_groupcap].times[i] - times_subtractor + end + end + + minetest.register_tool(string.format("xdecor:enchanted_%s_%s_%s", tool_name, material, chant), { + description = string.format("Enchanted %s %s (%s)", capitalize(material), capitalize(tool_name), capitalize(chant)), + inventory_image = original_tool.inventory_image, + wield_image = original_tool.wield_image, groups = {not_in_creative_inventory=1}, - tool_capabilities = {groupcaps = grp, damage_groups = def.dmg} + tool_capabilities = {groupcaps = groupcaps, damage_groups = original_tool.damage_groups} }) end + end + end end -local tools = { - {"axe", "choppy"}, {"pick", "cracky"}, {"shovel", "crumbly"} -} -local materials = {"steel", "bronze", "mese", "diamond"} - -for _, t in pairs(tools) do -for _, m in pairs(materials) do - local tool, group = t[1], t[2] - local toolname = tool.."_"..m - local init_def = minetest.registered_tools["default:"..toolname]["tool_capabilities"]["groupcaps"][group] - - local tooldef = { - times = init_def["times"], - uses = init_def["uses"], - dmg = init_def["damage_groups"], - maxlvl = init_def["maxlevel"] - } - enchanting.register_enchtools(init_def, m, tooldef) -end -end +enchanting.register_enchtools()