Update game screenshot
[Pixture/pixture_revival.git] / mods / rp_jewels / init.lua
bloba7314c30fe621e6d940e1ad32483c041b68eeb14
2 --
3 -- Jewels mod
4 -- By Kaadmy
5 --
7 local S = minetest.get_translator("rp_jewels")
8 local NS = function(s) return s end
9 local F = minetest.formspec_escape
11 jewels = {}
13 -- Array of registered jeweled tools
15 jewels.registered_jewels = {}
16 jewels.registered_jewel_defs = {}
17 jewels.registered_jewel_parents = {}
19 -- Formspec
21 local form_bench = rp_formspec.get_page("rp_default:2part")
23 form_bench = form_bench .. "list[current_name;main;2.25,1.75;1,1;]"
24 form_bench = form_bench .. "listring[current_name;main]"
25 form_bench = form_bench .. rp_formspec.get_itemslot_bg(2.25, 1.75, 1, 1)
27 form_bench = form_bench .. "label[3.25,1.75;"..F(S("1. Place tool here")).."]"
28 form_bench = form_bench .. "label[3.25,2.25;"..F(S("2. Hold a jewel and punch the bench")).."]"
30 form_bench = form_bench .. "list[current_player;main;0.25,4.75;8,4;]"
31 form_bench = form_bench .. "listring[current_player;main]"
32 form_bench = form_bench .. rp_formspec.get_hotbar_itemslot_bg(0.25, 4.75, 8, 1)
33 form_bench = form_bench .. rp_formspec.get_itemslot_bg(0.25, 5.75, 8, 3)
35 rp_formspec.register_page("rp_jewels_bench", form_bench)
37 local function plus_power(i)
38 if i >= 0 then
39 i = "+" .. i
40 end
42 return i
43 end
45 function jewels.register_jewel(toolname, new_toolname, def)
46 -- registers a new tool with different stats
48 local data = {
49 name = new_toolname, -- the new name of the tool
50 overlay = def.overlay or "jewels_jeweled_handle.png", -- overlay image
51 overlay_wield = def.overlay_wield, -- overlay wield image
52 description = def.description or nil,
53 stats = {
54 digspeed = def.stats.digspeed, -- negative digs faster
55 maxlevel = def.stats.maxlevel, -- positive digs higher levels
56 maxdrop = def.stats.maxdrop, -- positive increases max drop level
57 uses = def.stats.uses, -- positive increases uses
58 fleshy = def.stats.fleshy, -- positive increases fleshy damage
59 range = def.stats.range, -- positive increases reach distance with tool
62 if not data.overlay_wield then
63 data.overlay_wield = data.overlay
64 end
66 if not jewels.registered_jewels[toolname] then
67 jewels.registered_jewels[toolname] = {}
68 end
70 jewels.registered_jewel_defs[new_toolname] = data
72 table.insert(jewels.registered_jewels[toolname], data)
73 local newparent = {
74 name = toolname,
75 stats = {
76 digspeed = (data.stats.digspeed or 0),
77 maxlevel = (data.stats.maxlevel or 0),
78 maxdrop = (data.stats.maxdrop or 0),
79 uses = (data.stats.uses or 0),
80 fleshy = (data.stats.fleshy or 0),
81 range = (data.stats.range or 0),
85 local parent = jewels.registered_jewel_parents[toolname]
86 if parent then
87 for k,v in pairs(parent.stats) do
88 newparent.stats[k] = newparent.stats[k] + v
89 end
90 end
91 jewels.registered_jewel_parents[new_toolname] = newparent
93 local tooldef = minetest.registered_tools[toolname]
95 if not tooldef then
96 minetest.log("warning",
97 "[rp_jewels] Trying to register jewel " .. new_toolname
98 .. " that has an unknown output item " .. toolname)
100 return
103 local new_tool_invimage
104 if tooldef.inventory_image ~= nil and tooldef.inventory_image ~= "" then
105 new_tool_invimage = "(" .. tooldef.inventory_image .. ")^(" .. data.overlay .. ")"
108 local new_tool_wieldimage
109 if tooldef.wield_image ~= nil and tooldef.wield_image ~= "" then
110 new_tool_wieldimage = "(" .. tooldef.wield_image .. ")^(" .. data.overlay_wield .. ")"
111 elseif data.overlay_wield then
112 new_tool_wieldimage = "(" .. tooldef.inventory_image .. ")^(" .. data.overlay_wield .. ")"
115 local new_tooldef = table.copy(tooldef)
116 local desc
117 if data.description ~= nil then
118 desc = data.description
119 else
120 -- All tools should have their description set explicitly. This is a fallback
121 minetest.log("warning", "[rp_jewels] No description for jeweled tool "..new_toolname.."! Auto-generating a name")
122 desc = new_tooldef.description
123 if not desc then
124 desc = new_toolname
125 else
126 desc = S("Jeweled @1", desc)
129 new_tooldef.description = desc
131 new_tooldef.inventory_image = new_tool_invimage
132 new_tooldef.wield_image = new_tool_wieldimage
134 if data.stats.range then
135 if not new_tooldef.range then
136 new_tooldef.range = 4
138 new_tooldef.range = new_tooldef.range + data.stats.range
141 if new_tooldef.tool_capabilities then
142 if data.stats.maxdrop and new_tooldef.tool_capabilities.max_drop_level then
143 new_tooldef.tool_capabilities.max_drop_level =
144 new_tooldef.tool_capabilities.max_drop_level + data.stats.maxdrop
147 if data.stats.digspeed then
148 for group, cap in pairs(new_tooldef.tool_capabilities.groupcaps) do
149 for i, _ in ipairs(cap.times) do
150 cap.times[i] = cap.times[i] + data.stats.digspeed
153 if data.stats.maxlevel and cap.maxlevel then
154 cap.maxlevel = cap.maxlevel + data.stats.maxlevel
157 if data.stats.uses and cap.uses then
158 cap.uses = cap.uses + data.stats.uses
163 if data.stats.fleshy and new_tooldef.tool_capabilities.damage_groups
164 and new_tooldef.tool_capabilities.damage_groups.fleshy then
165 new_tooldef.tool_capabilities.damage_groups.fleshy =
166 new_tooldef.tool_capabilities.damage_groups.fleshy + data.stats.fleshy
170 if not new_tooldef.groups then
171 new_tooldef.groups = {}
173 new_tooldef.groups.not_in_creative_inventory = 1
175 minetest.register_tool(new_toolname, new_tooldef)
178 if minetest.get_modpath("tt") then
180 local function get_stat(format_text, stats_key, parent, stats)
181 local disp_val = stats[stats_key] or 0
182 if parent then
183 disp_val = disp_val + parent.stats[stats_key]
185 if disp_val ~= 0 then
186 return S(format_text, plus_power(disp_val))
188 return nil
191 local amendments = {
192 { "range", NS("Range: @1") },
193 { "maxdrop", NS("Drop level: @1") },
194 { "digspeed", NS("Dig time: @1 s") },
195 { "uses", NS("Uses: @1") },
196 { "maxlevel", NS("Dig level: @1") },
199 for a=1, #amendments do
200 tt.register_snippet(function(itemname)
201 local jewel = jewels.registered_jewel_defs[itemname]
202 local parent = jewels.registered_jewel_parents[itemname]
203 if not jewel then
204 return
207 local desc
208 local stat = amendments[a][1]
209 if jewel.stats[stat] then
210 desc = get_stat(amendments[a][2], stat, parent, jewel.stats)
212 if desc ~= nil then
213 return desc, "#4CFFFD"
216 return desc
217 end)
222 function jewels.can_jewel(toolname)
223 for name, _ in pairs(jewels.registered_jewels) do
224 if name == toolname then
225 return true
229 return false
232 function jewels.get_jeweled(toolname)
233 for name, jables in pairs(jewels.registered_jewels) do
234 if name == toolname then
235 return util.choice_element(jables)
240 -- Items
242 minetest.register_craftitem(
243 "rp_jewels:jewel",
245 description = S("Jewel"),
246 inventory_image = "jewels_jewel.png",
247 stack_max = 10
251 -- Nodes
253 local check_put = function(pos, listname, index, stack, player)
254 if minetest.is_protected(pos, player:get_player_name()) and
255 not minetest.check_player_privs(player, "protection_bypass") then
256 minetest.record_protection_violation(pos, player:get_player_name())
257 return 0
259 local meta = minetest.get_meta(pos)
260 local inv = meta:get_inventory()
261 if listname == "main" then
262 local name = stack:get_name()
263 if minetest.registered_items[name] then
264 -- Disallow put for non-tools (unless it can be jeweled)
265 if (not jewels.can_jewel(name)) and minetest.registered_items[name].type ~= "tool" then
266 return 0
270 return stack:get_count()
272 local check_move = function(pos, from_list, from_index, to_list, to_index, count, player)
273 local meta = minetest.get_meta(pos)
274 local inv = meta:get_inventory()
275 local stack = inv:get_stack(from_list, from_index)
276 return check_take(pos, to_list, to_index, stack, player)
278 local check_take = function(pos, listname, index, stack, player)
279 if minetest.is_protected(pos, player:get_player_name()) and
280 not minetest.check_player_privs(player, "protection_bypass") then
281 minetest.record_protection_violation(pos, player:get_player_name())
282 return 0
283 else
284 return stack:get_count()
288 minetest.register_node(
289 "rp_jewels:bench",
291 description = S("Jeweler's Workbench"),
292 _tt_help = S("Tools can be upgraded with jewels here"),
293 tiles ={"jewels_bench_top.png", "jewels_bench_bottom.png", "jewels_bench_sides.png"},
294 paramtype2 = "facedir",
295 groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
296 legacy_facedir_simple = true,
297 is_ground_content = false,
298 sounds = rp_sounds.node_sound_wood_defaults(),
300 on_construct = function(pos)
301 local meta = minetest.get_meta(pos)
302 meta:set_string("formspec", rp_formspec.get_page("rp_jewels_bench"))
303 meta:set_string("infotext", S("Jeweler's Workbench"))
305 local inv = meta:get_inventory()
306 inv:set_size("main", 1)
307 end,
308 can_dig = function(pos, player)
309 local meta = minetest.get_meta(pos)
310 local inv = meta:get_inventory()
312 return inv:is_empty("main")
313 end,
314 allow_metadata_inventory_move = check_move,
315 allow_metadata_inventory_put = check_put,
316 allow_metadata_inventory_take = check_take,
317 on_punch = function(pos, node, player, pointed_thing)
318 local itemstack = player:get_wielded_item()
319 local itemstack_changed = false
320 if itemstack:get_name() == "rp_jewels:jewel" then
321 if minetest.is_protected(pos, player:get_player_name()) and
322 not minetest.check_player_privs(player, "protection_bypass") then
323 minetest.record_protection_violation(pos, player:get_player_name())
324 return
326 local meta = minetest.get_meta(pos)
327 local inv = meta:get_inventory()
329 local iitem = inv:get_stack("main", 1)
330 if iitem:is_empty() then
331 return
333 local itemname = iitem:get_name()
335 if jewels.can_jewel(itemname) then
336 -- Success
337 inv:set_stack("main", 1, ItemStack(jewels.get_jeweled(itemname)))
339 if not minetest.is_creative_enabled(player:get_player_name()) then
340 itemstack:take_item()
341 itemstack_changed = true
344 minetest.sound_play({name="jewels_jewelling_a_tool"}, {gain=0.8, pos=pos, max_hear_distance=8}, true)
345 -- TODO: Graphical effect
347 achievements.trigger_achievement(player, "jeweler")
348 else
349 -- Failure
350 minetest.sound_play({name="jewels_jewelling_fail"}, {gain=0.8, pos=pos, max_hear_distance=8}, true)
354 if itemstack_changed then
355 player:set_wielded_item(itemstack)
357 end,
360 minetest.register_node(
361 "rp_jewels:jewel_ore",
363 description = S("Jewel Ore"),
364 tiles = {
365 "default_tree_birch_top.png",
366 "default_tree_birch_top.png",
367 "default_tree_birch.png^jewels_ore.png"
369 drop = "rp_jewels:jewel",
370 groups = {snappy=1, choppy=1, tree=1},
371 sounds = rp_sounds.node_sound_wood_defaults(),
374 crafting.register_craft(
376 output = "rp_jewels:bench",
377 items = {
378 "group:planks 5",
379 "rp_default:ingot_carbon_steel 2",
380 "rp_jewels:jewel",
384 minetest.register_craft(
386 type = "cooking",
387 output = "rp_jewels:jewel",
388 recipe = "rp_jewels:jewel_ore",
389 cooktime = 6,
392 -- Achievements
394 achievements.register_achievement(
395 "jeweler",
397 title = S("Jeweler"),
398 description = S("Jewel a tool."),
399 times = 1,
400 item_icon = "rp_jewels:shovel_steel_uses",
403 achievements.register_achievement(
404 "secret_of_jewels",
406 title = S("Secret of Jewels"),
407 description = S("Discover the origin of jewels."),
408 times = 1,
409 dignode = "rp_jewels:jewel_ore",
412 -- Update node after the rename orgy after 1.5.3
413 minetest.register_lbm(
415 label = "Update jeweler's workbench",
416 name = "rp_jewels:update_bench",
417 nodenames = {"rp_jewels:bench"},
418 action = function(pos, node)
419 local def = minetest.registered_nodes[node.name]
420 def.on_construct(pos)
425 -- The tool jewel definitions
427 dofile(minetest.get_modpath("rp_jewels").."/jewels.lua")
428 dofile(minetest.get_modpath("rp_jewels").."/mapgen.lua")
429 dofile(minetest.get_modpath("rp_jewels").."/aliases.lua")