summaryrefslogtreecommitdiff
path: root/unified_inventory/group.lua
diff options
context:
space:
mode:
authorVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 20:02:19 -0400
committerVanessa Ezekowitz <vanessaezekowitz@gmail.com>2016-04-01 21:09:33 -0400
commitda66780a569712c23ae4f2996cfb4608a9f9d69d (patch)
tree217556029a78bc23ad4564720afc86de97228a04 /unified_inventory/group.lua
parent615b22df4d423aded3613db7716943a2f389b047 (diff)
downloaddreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.gz
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.bz2
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.tar.xz
dreambuilder_modpack-da66780a569712c23ae4f2996cfb4608a9f9d69d.zip
copy all standard Dreambuilder mods in from the old subgame
(exactly as last supplied there, updates to these mods will follow later)
Diffstat (limited to 'unified_inventory/group.lua')
-rw-r--r--unified_inventory/group.lua108
1 files changed, 108 insertions, 0 deletions
diff --git a/unified_inventory/group.lua b/unified_inventory/group.lua
new file mode 100644
index 0000000..9bf6895
--- /dev/null
+++ b/unified_inventory/group.lua
@@ -0,0 +1,108 @@
+function unified_inventory.canonical_item_spec_matcher(spec)
+ local specname = ItemStack(spec):get_name()
+ if specname:sub(1, 6) == "group:" then
+ local group_names = specname:sub(7):split(",")
+ return function (itemname)
+ local itemdef = minetest.registered_items[itemname]
+ for _, group_name in ipairs(group_names) do
+ if (itemdef.groups[group_name] or 0) == 0 then
+ return false
+ end
+ end
+ return true
+ end
+ else
+ return function (itemname) return itemname == specname end
+ end
+end
+
+function unified_inventory.item_matches_spec(item, spec)
+ local itemname = ItemStack(item):get_name()
+ return unified_inventory.canonical_item_spec_matcher(spec)(itemname)
+end
+
+unified_inventory.registered_group_items = {
+ mesecon_conductor_craftable = "mesecons:wire_00000000_off",
+ stone = "default:cobble",
+ wool = "wool:white",
+}
+
+function unified_inventory.register_group_item(groupname, itemname)
+ unified_inventory.registered_group_items[groupname] = itemname
+end
+
+
+-- This is used when displaying craft recipes, where an ingredient is
+-- specified by group rather than as a specific item. A single-item group
+-- is represented by that item, with the single-item status signalled
+-- in the "sole" field. If the group contains no items at all, the item
+-- field will be nil.
+--
+-- Within a multiple-item group, we prefer to use an item that has the
+-- same specific name as the group, and if there are more than one of
+-- those items we prefer the one registered for the group by a mod.
+-- Among equally-preferred items, we just pick the one with the
+-- lexicographically earliest name.
+--
+-- The parameter to this function isn't just a single group name.
+-- It may be a comma-separated list of group names. This is really a
+-- "group:..." ingredient specification, minus the "group:" prefix.
+
+local function compute_group_item(group_name_list)
+ local group_names = group_name_list:split(",")
+ local candidate_items = {}
+ for itemname, itemdef in pairs(minetest.registered_items) do
+ if (itemdef.groups.not_in_creative_inventory or 0) == 0 then
+ local all = true
+ for _, group_name in ipairs(group_names) do
+ if (itemdef.groups[group_name] or 0) == 0 then
+ all = false
+ end
+ end
+ if all then table.insert(candidate_items, itemname) end
+ end
+ end
+ local num_candidates = #candidate_items
+ if num_candidates == 0 then
+ return {sole = true}
+ elseif num_candidates == 1 then
+ return {item = candidate_items[1], sole = true}
+ end
+ local is_group = {}
+ local registered_rep = {}
+ for _, group_name in ipairs(group_names) do
+ is_group[group_name] = true
+ local rep = unified_inventory.registered_group_items[group_name]
+ if rep then registered_rep[rep] = true end
+ end
+ local bestitem = ""
+ local bestpref = 0
+ for _, item in ipairs(candidate_items) do
+ local pref
+ if registered_rep[item] then
+ pref = 4
+ elseif string.sub(item, 1, 8) == "default:" and is_group[string.sub(item, 9)] then
+ pref = 3
+ elseif is_group[item:gsub("^[^:]*:", "")] then
+ pref = 2
+ else
+ pref = 1
+ end
+ if pref > bestpref or (pref == bestpref and item < bestitem) then
+ bestitem = item
+ bestpref = pref
+ end
+ end
+ return {item = bestitem, sole = false}
+end
+
+
+local group_item_cache = {}
+
+function unified_inventory.get_group_item(group_name)
+ if not group_item_cache[group_name] then
+ group_item_cache[group_name] = compute_group_item(group_name)
+ end
+ return group_item_cache[group_name]
+end
+