146 lines
5.2 KiB
Lua

local SearchResults = {}
local group_gap_size = 20
function SearchResults.add_entity(entity, surface_data)
-- Group entities
-- Group contains count, avg_position, selection_box, entity_name, selection_boxes
local entity_name = entity.name
local entity_position = entity.position
local entity_selection_box = entity.selection_box
local entity_surface_data = surface_data[entity_name] or {}
local assigned_group
for _, group in pairs(entity_surface_data) do
if entity_name == group.entity_name and math2d.bounding_box.collides_with(entity_selection_box, group.selection_box) then
-- Add entity to group
assigned_group = group
local count = group.count
local new_count = count + 1
group.avg_position = {
x = (group.avg_position.x * count + entity_position.x) / new_count,
y = (group.avg_position.y * count + entity_position.y) / new_count,
}
group.selection_box = {
left_top = {
x = math.min(group.selection_box.left_top.x + group_gap_size, entity_selection_box.left_top.x) - group_gap_size,
y = math.min(group.selection_box.left_top.y + group_gap_size, entity_selection_box.left_top.y) - group_gap_size,
},
right_bottom = {
x = math.max(group.selection_box.right_bottom.x - group_gap_size, entity_selection_box.right_bottom.x) + group_gap_size,
y = math.max(group.selection_box.right_bottom.y - group_gap_size, entity_selection_box.right_bottom.y) + group_gap_size,
},
}
group.count = new_count
table.insert(group.selection_boxes, entity.selection_box)
break
end
end
if not assigned_group then
-- Create new group
assigned_group = {
count = 1,
avg_position = entity_position,
selection_box = {
left_top = {
x = entity_selection_box.left_top.x - group_gap_size,
y = entity_selection_box.left_top.y - group_gap_size,
},
right_bottom = {
x = entity_selection_box.right_bottom.x + group_gap_size,
y = entity_selection_box.right_bottom.y + group_gap_size,
}
},
entity_name = entity_name,
selection_boxes = {[1] = entity.selection_box},
localised_name = entity.localised_name,
}
table.insert(entity_surface_data, assigned_group)
end
surface_data[entity_name] = entity_surface_data
return assigned_group
end
local add_entity = SearchResults.add_entity
function SearchResults.add_entity_product(entity, surface_data, recipe)
local group = add_entity(entity, surface_data)
local group_recipe_list = group.recipe_list or {}
recipe_name_info = group_recipe_list[recipe.name] or {localised_name = recipe.localised_name, count = 0}
recipe_name_info.count = recipe_name_info.count + 1
group_recipe_list[recipe.name] = recipe_name_info
group.recipe_list = group_recipe_list
end
function SearchResults.add_entity_storage(entity, surface_data, item_count)
local group = add_entity(entity, surface_data)
local group_item_count = group.item_count or 0
group.item_count = group_item_count + item_count
end
function SearchResults.add_entity_storage_fluid(entity, surface_data, fluid_count)
local group = add_entity(entity, surface_data)
local group_fluid_count = group.fluid_count or 0
group.fluid_count = group_fluid_count + fluid_count
end
function SearchResults.add_entity_module(entity, surface_data, module_count)
local group = add_entity(entity, surface_data)
local group_module_count = group.module_count or 0
group.module_count = group_module_count + module_count
end
function SearchResults.add_entity_request(entity, surface_data, request_count)
local group = add_entity(entity, surface_data)
local group_request_count = group.request_count or 0
group.request_count = group_request_count + request_count
end
function SearchResults.add_entity_signal(entity, surface_data, signal_count)
local group = add_entity(entity, surface_data)
local group_signal_count = group.signal_count or 0
group.signal_count = group_signal_count + signal_count
end
function SearchResults.add_entity_resource(entity, surface_data, resource_count)
local group = add_entity(entity, surface_data)
local group_resource_count = group.resource_count or 0
group.resource_count = group_resource_count + resource_count
end
function SearchResults.add_tag(tag, surface_data)
-- An alternative to add_entity*, for map tags
local icon_name = tag.icon.name
local tag_surface_data = surface_data[icon_name] or {}
-- Tag groups always have size 1
local tag_position = tag.position
local tag_box_size = 8
local selection_box = {
left_top = {
x = tag_position.x - tag_box_size,
y = tag_position.y - tag_box_size,
},
right_bottom = {
x = tag_position.x + tag_box_size,
y = tag_position.y + tag_box_size,
}
}
local localised_name = tag.text
if localised_name == "" then localised_name = { "search-gui.default-map-tag-name" } end
local group = {
count = 1,
avg_position = tag_position,
entity_name = tag.icon.name,
selection_boxes = {
[1] = selection_box
},
localised_name = localised_name,
}
table.insert(tag_surface_data, group)
surface_data[icon_name] = tag_surface_data
end
return SearchResults