Make functions unified_inventory global
This commit is contained in:
parent
bcc6774ff8
commit
e03a34ab7c
310
match_craft.lua
310
match_craft.lua
|
@ -4,144 +4,6 @@ local function extract_group_name(name)
|
||||||
return name:match("^group:(.+)")
|
return name:match("^group:(.+)")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function add_craft_item(t, item_name, craft_pos)
|
|
||||||
local item = t[item_name]
|
|
||||||
|
|
||||||
if item == nil then
|
|
||||||
t[item_name] = {
|
|
||||||
craft_positions = {craft_pos},
|
|
||||||
found = false
|
|
||||||
}
|
|
||||||
else
|
|
||||||
table.insert(item.craft_positions, craft_pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function add_craft_group(t, group_name, craft_pos)
|
|
||||||
local group = t[group_name]
|
|
||||||
|
|
||||||
if group == nil then
|
|
||||||
t[group_name] = {
|
|
||||||
craft_positions = {craft_pos},
|
|
||||||
found = false,
|
|
||||||
found_items = {}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
table.insert(group.craft_positions, craft_pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function create_craft_index(craft)
|
|
||||||
local craft_index = {
|
|
||||||
items = {},
|
|
||||||
groups = {}
|
|
||||||
}
|
|
||||||
|
|
||||||
local MAX_HEIGHT = 3
|
|
||||||
local MAX_WIDTH = 3
|
|
||||||
|
|
||||||
local craft_items = craft.items
|
|
||||||
local craft_width = craft.width
|
|
||||||
|
|
||||||
if craft_width == 0 then
|
|
||||||
craft_width = MAX_WIDTH
|
|
||||||
end
|
|
||||||
|
|
||||||
local pos = 1
|
|
||||||
|
|
||||||
for y = 1, MAX_HEIGHT do
|
|
||||||
for x = 1, craft_width do
|
|
||||||
local craft_pos = (y - 1) * MAX_WIDTH + x
|
|
||||||
local item = craft_items[pos]
|
|
||||||
|
|
||||||
if item ~= nil then
|
|
||||||
local group = extract_group_name(item)
|
|
||||||
|
|
||||||
if group == nil then
|
|
||||||
add_craft_item(craft_index.items, item, craft_pos)
|
|
||||||
else
|
|
||||||
add_craft_group(craft_index.groups, group, craft_pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
pos = pos + 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return craft_index
|
|
||||||
end
|
|
||||||
|
|
||||||
local function find_craft_item(item_name, craft_index)
|
|
||||||
local found = false
|
|
||||||
local item = craft_index.items[item_name]
|
|
||||||
local get_item_group = minetest.get_item_group
|
|
||||||
|
|
||||||
if item ~= nil then
|
|
||||||
item.found = true
|
|
||||||
found = true
|
|
||||||
end
|
|
||||||
|
|
||||||
for group_name, group in pairs(craft_index.groups) do
|
|
||||||
if get_item_group(item_name, group_name) > 0 then
|
|
||||||
group.found = true
|
|
||||||
found = true
|
|
||||||
|
|
||||||
table.insert(group.found_items, item_name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return found
|
|
||||||
end
|
|
||||||
|
|
||||||
local function all_items_found(craft_index)
|
|
||||||
for _, item in pairs(craft_index.items) do
|
|
||||||
if not item.found then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for _, group in pairs(craft_index.groups) do
|
|
||||||
if not group.found then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
local function create_item_index(inv_list, craft_index)
|
|
||||||
local item_index = {}
|
|
||||||
local not_found = {}
|
|
||||||
|
|
||||||
for inv_list_pos, stack in ipairs(inv_list) do
|
|
||||||
local item_name = stack:get_name()
|
|
||||||
|
|
||||||
if item_name ~= "" then
|
|
||||||
local item_count = stack:get_count()
|
|
||||||
local item = item_index[item_name]
|
|
||||||
|
|
||||||
if item == nil then
|
|
||||||
if not_found[item_name] == nil then
|
|
||||||
local item_found = find_craft_item(item_name, craft_index)
|
|
||||||
|
|
||||||
if item_found then
|
|
||||||
item_index[item_name] = {
|
|
||||||
total_count = item_count,
|
|
||||||
times_matched = 0
|
|
||||||
}
|
|
||||||
else
|
|
||||||
not_found[item_name] = true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
item.total_count = item.total_count + item_count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return item_index
|
|
||||||
end
|
|
||||||
|
|
||||||
local function count_compare(item1, item2)
|
local function count_compare(item1, item2)
|
||||||
return item1.index.total_count > item2.index.total_count
|
return item1.index.total_count > item2.index.total_count
|
||||||
end
|
end
|
||||||
|
@ -166,7 +28,145 @@ local function lex_compare(group1, group2)
|
||||||
return len1 < len2
|
return len1 < len2
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_group_items(group_name, craft_index, item_index)
|
function unified_inventory.add_craft_item(t, item_name, craft_pos)
|
||||||
|
local item = t[item_name]
|
||||||
|
|
||||||
|
if item == nil then
|
||||||
|
t[item_name] = {
|
||||||
|
craft_positions = {craft_pos},
|
||||||
|
found = false
|
||||||
|
}
|
||||||
|
else
|
||||||
|
table.insert(item.craft_positions, craft_pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function unified_inventory.add_craft_group(t, group_name, craft_pos)
|
||||||
|
local group = t[group_name]
|
||||||
|
|
||||||
|
if group == nil then
|
||||||
|
t[group_name] = {
|
||||||
|
craft_positions = {craft_pos},
|
||||||
|
found = false,
|
||||||
|
found_items = {}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
table.insert(group.craft_positions, craft_pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function unified_inventory.create_craft_index(craft)
|
||||||
|
local craft_index = {
|
||||||
|
items = {},
|
||||||
|
groups = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
local MAX_HEIGHT = 3
|
||||||
|
local MAX_WIDTH = 3
|
||||||
|
|
||||||
|
local craft_items = craft.items
|
||||||
|
local craft_width = craft.width
|
||||||
|
|
||||||
|
if craft_width == 0 then
|
||||||
|
craft_width = MAX_WIDTH
|
||||||
|
end
|
||||||
|
|
||||||
|
local pos = 1
|
||||||
|
|
||||||
|
for y = 1, MAX_HEIGHT do
|
||||||
|
for x = 1, craft_width do
|
||||||
|
local craft_pos = (y - 1) * MAX_WIDTH + x
|
||||||
|
local item = craft_items[pos]
|
||||||
|
|
||||||
|
if item ~= nil then
|
||||||
|
local group = extract_group_name(item)
|
||||||
|
|
||||||
|
if group == nil then
|
||||||
|
unified_inventory.add_craft_item(craft_index.items, item, craft_pos)
|
||||||
|
else
|
||||||
|
unified_inventory.add_craft_group(craft_index.groups, group, craft_pos)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
pos = pos + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return craft_index
|
||||||
|
end
|
||||||
|
|
||||||
|
function unified_inventory.find_craft_item(item_name, craft_index)
|
||||||
|
local found = false
|
||||||
|
local item = craft_index.items[item_name]
|
||||||
|
local get_item_group = minetest.get_item_group
|
||||||
|
|
||||||
|
if item ~= nil then
|
||||||
|
item.found = true
|
||||||
|
found = true
|
||||||
|
end
|
||||||
|
|
||||||
|
for group_name, group in pairs(craft_index.groups) do
|
||||||
|
if get_item_group(item_name, group_name) > 0 then
|
||||||
|
group.found = true
|
||||||
|
found = true
|
||||||
|
|
||||||
|
table.insert(group.found_items, item_name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return found
|
||||||
|
end
|
||||||
|
|
||||||
|
function unified_inventory.all_items_found(craft_index)
|
||||||
|
for _, item in pairs(craft_index.items) do
|
||||||
|
if not item.found then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, group in pairs(craft_index.groups) do
|
||||||
|
if not group.found then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
function unified_inventory.create_item_index(inv_list, craft_index)
|
||||||
|
local item_index = {}
|
||||||
|
local not_found = {}
|
||||||
|
|
||||||
|
for inv_list_pos, stack in ipairs(inv_list) do
|
||||||
|
local item_name = stack:get_name()
|
||||||
|
|
||||||
|
if item_name ~= "" then
|
||||||
|
local item_count = stack:get_count()
|
||||||
|
local item = item_index[item_name]
|
||||||
|
|
||||||
|
if item == nil then
|
||||||
|
if not_found[item_name] == nil then
|
||||||
|
local item_found = unified_inventory.find_craft_item(item_name, craft_index)
|
||||||
|
|
||||||
|
if item_found then
|
||||||
|
item_index[item_name] = {
|
||||||
|
total_count = item_count,
|
||||||
|
times_matched = 0
|
||||||
|
}
|
||||||
|
else
|
||||||
|
not_found[item_name] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
item.total_count = item.total_count + item_count
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return item_index
|
||||||
|
end
|
||||||
|
|
||||||
|
function unified_inventory.get_group_items(group_name, craft_index, item_index)
|
||||||
local items = {}
|
local items = {}
|
||||||
local group = craft_index.groups[group_name]
|
local group = craft_index.groups[group_name]
|
||||||
|
|
||||||
|
@ -182,11 +182,11 @@ local function get_group_items(group_name, craft_index, item_index)
|
||||||
return items
|
return items
|
||||||
end
|
end
|
||||||
|
|
||||||
local function ordered_groups(craft_index, item_index)
|
function unified_inventory.ordered_groups(craft_index, item_index)
|
||||||
local groups = {}
|
local groups = {}
|
||||||
|
|
||||||
for group_name in pairs(craft_index.groups) do
|
for group_name in pairs(craft_index.groups) do
|
||||||
local group_items = get_group_items(group_name, craft_index, item_index)
|
local group_items = unified_inventory.get_group_items(group_name, craft_index, item_index)
|
||||||
table.sort(group_items, count_compare)
|
table.sort(group_items, count_compare)
|
||||||
|
|
||||||
table.insert(groups, {
|
table.insert(groups, {
|
||||||
|
@ -210,7 +210,7 @@ local function ordered_groups(craft_index, item_index)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function match_items(m, craft_index, item_index)
|
function unified_inventory.match_items(m, craft_index, item_index)
|
||||||
for item_name, item in pairs(craft_index.items) do
|
for item_name, item in pairs(craft_index.items) do
|
||||||
local index = item_index[item_name]
|
local index = item_index[item_name]
|
||||||
local times_used = #item.craft_positions
|
local times_used = #item.craft_positions
|
||||||
|
@ -225,8 +225,8 @@ local function match_items(m, craft_index, item_index)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function match_groups(m, craft_index, item_index)
|
function unified_inventory.match_groups(m, craft_index, item_index)
|
||||||
for group, group_items in ordered_groups(craft_index, item_index) do
|
for group, group_items in unified_inventory.ordered_groups(craft_index, item_index) do
|
||||||
for _, craft_pos in ipairs(group.craft_positions) do
|
for _, craft_pos in ipairs(group.craft_positions) do
|
||||||
local cell_count = 0
|
local cell_count = 0
|
||||||
local matched_item = nil
|
local matched_item = nil
|
||||||
|
@ -253,30 +253,30 @@ local function match_groups(m, craft_index, item_index)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_match_table(craft_index, item_index)
|
function unified_inventory.get_match_table(craft_index, item_index)
|
||||||
local match_table = {
|
local match_table = {
|
||||||
count = MAX_COUNT,
|
count = MAX_COUNT,
|
||||||
items = {}
|
items = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
match_items(match_table, craft_index, item_index)
|
unified_inventory.match_items(match_table, craft_index, item_index)
|
||||||
match_groups(match_table, craft_index, item_index)
|
unified_inventory.match_groups(match_table, craft_index, item_index)
|
||||||
|
|
||||||
return match_table
|
return match_table
|
||||||
end
|
end
|
||||||
|
|
||||||
local function find_best_match(inv_list, craft)
|
function unified_inventory.find_best_match(inv_list, craft)
|
||||||
local craft_index = create_craft_index(craft)
|
local craft_index = unified_inventory.create_craft_index(craft)
|
||||||
local item_index = create_item_index(inv_list, craft_index)
|
local item_index = unified_inventory.create_item_index(inv_list, craft_index)
|
||||||
|
|
||||||
if not all_items_found(craft_index) then
|
if not unified_inventory.all_items_found(craft_index) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
return get_match_table(craft_index, item_index)
|
return unified_inventory.get_match_table(craft_index, item_index)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function can_move(match_items, inv_list)
|
function unified_inventory.can_move(match_items, inv_list)
|
||||||
for match_pos, match_name in pairs(match_items) do
|
for match_pos, match_name in pairs(match_items) do
|
||||||
local inv_item = inv_list[match_pos]
|
local inv_item = inv_list[match_pos]
|
||||||
local inv_item_name = inv_item:get_name()
|
local inv_item_name = inv_item:get_name()
|
||||||
|
@ -293,7 +293,7 @@ function unified_inventory.craftguide_match_craft(inv, src_list_name, dst_list_n
|
||||||
local src_list = inv:get_list(src_list_name)
|
local src_list = inv:get_list(src_list_name)
|
||||||
local dst_list = inv:get_list(dst_list_name)
|
local dst_list = inv:get_list(dst_list_name)
|
||||||
|
|
||||||
local craft_match = find_best_match(src_list, craft)
|
local craft_match = unified_inventory.find_best_match(src_list, craft)
|
||||||
|
|
||||||
if craft_match == nil then
|
if craft_match == nil then
|
||||||
return
|
return
|
||||||
|
@ -302,7 +302,7 @@ function unified_inventory.craftguide_match_craft(inv, src_list_name, dst_list_n
|
||||||
local matched_items = craft_match.items
|
local matched_items = craft_match.items
|
||||||
local matched_count = craft_match.count
|
local matched_count = craft_match.count
|
||||||
|
|
||||||
if not can_move(matched_items, dst_list) then
|
if not unified_inventory.can_move(matched_items, dst_list) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue