448 lines
12 KiB
Lua

local RecipeController = {
classname = "FNRecipeController"
}
local RecipeGui = require "scripts/recipe/gui"
local r_list = List:new("recipe_queue")
local pages = "recipe-pages"
function RecipeController.init_events()
pages = Page:new(pages, RecipeController.get_name(), 1, RecipeController.change_page_event, RecipeController.change_page_event)
RecipeGui.init_events()
Events.add_custom_event(RecipeGui.name, "choose-elem-button", "fluid", RecipeController.open_fluid_recipe_event)
Events.add_custom_event(RecipeGui.name, "choose-elem-button", "item", RecipeController.open_item_recipe_event)
Events.add_custom_event(RecipeGui.name, "sprite-button", "tech", RecipeController.open_tech_event)
end
function RecipeController.exit()
out("Recipe exit")
RecipeGui.close_window()
end
function RecipeController.open()
out("Recipe open")
local gui = RecipeGui.open_window()
RecipeController.open_new_recipes()
return gui
end
function RecipeController.back_key()
r_list:remove()
if RecipeController.can_open_gui() then
RecipeController.open_new_recipes()
end
return r_list:is_empty()
end
function RecipeController.can_open_gui()
return not r_list:is_empty()
end
function RecipeController.get_name()
return RecipeGui.name
end
function RecipeController.is_gui_open()
return RecipeGui.is_gui_open()
end
----------------------------------- gui ---------------------------------------
function RecipeController.open_new_recipes()
RecipeController.set_page_list()
if pages:amount_page() == 0 then
if RecipeController.can_open_gui() then
r_list:remove()
RecipeController.open_new_recipes()
else
Controller.back_key_event()
end
return
end
RecipeController.change_page_event()
end
function RecipeController.draw_recipe()
local recipe = pages:get_list_for_tab(pages:get_cur_page())
if recipe and recipe[1] then
recipe = recipe[1]
else
return
end
RecipeGui.set_recipe_name(recipe)
RecipeGui.set_recipe_icon(recipe)
local prot_dif = #recipe.ingredients + 1 - #recipe.products
RecipeGui.set_ingredients(recipe.ingredients, -prot_dif)
RecipeGui.set_products(recipe.products, prot_dif)
RecipeGui.set_recipe_time(recipe.energy)
RecipeGui.set_made_in_list(recipe)
RecipeGui.set_techs(recipe)
end
function RecipeController.draw_paging()
RecipeGui.draw_paging(pages)
end
function RecipeController.set_crafting_type()
local cur_prot = r_list.get() or {}
RecipeGui.set_crafting_type(cur_prot.action_type)
end
function RecipeController.draw_cur_prot()
local cur_prot = r_list.get() or {}
RecipeGui.draw_cur_prot(cur_prot.type, cur_prot.name)
end
function RecipeController.get_recipe_stucture(prot_type, prot_name, action_type, saved_recipe_name)
return {
type = prot_type,
name = prot_name,
action_type = action_type,
recipe_name = saved_recipe_name
}
end
function RecipeController.draw_favorite_button()
local elem = r_list:get()
local recipe = {}
if elem then
recipe = RecipeController.get_recipe_stucture(elem.type, elem.name, elem.action_type, elem.page.name)
end
if RecipeController.is_gui_open() then
local state = Controller.get_cont("hotbar").get_favorite_recipe_state(recipe)
RecipeGui.draw_favorite_state(state)
end
end
----------------------------------- recipe list ---------------------------------------
function RecipeController.add_element_in_recipe_list(action_type, prot_type, prot_name, cur_page)
local cur_gui = Controller.get_cur_con()
if cur_gui and (cur_gui.get_name() == RecipeGui.name or cur_gui.get_name() == "settings") then
RecipeController.add_element(action_type, prot_type, prot_name, cur_page)
else
RecipeController.add_element_in_new_recipe_list(action_type, prot_type, prot_name, cur_page)
end
end
function RecipeController.add_element_in_new_recipe_list(action_type, prot_type, prot_name, cur_page)
r_list:clear()
local state = RecipeController.add_element(action_type, prot_type, prot_name, cur_page)
if state then
Controller.get_cont("hotbar").add_last_elem({ })
end
end
function RecipeController.add_element(action_type, prot_type, prot_name, cur_page)
local last_elem = r_list:get()
if last_elem == nil or (prot_name ~= last_elem.name or prot_type ~= last_elem.type or action_type ~= last_elem.action_type) then
local recipe_list = RecipeController.get_recipe_list(action_type, prot_type, prot_name)
if recipe_list and #recipe_list > 0 then
local page = RecipeController.get_page_name_for_recipe(action_type, prot_type, prot_name, cur_page)
r_list:add({ type = prot_type, name = prot_name, action_type = action_type, page = page })
return true
end
else
last_elem.page = RecipeController.get_page_name_for_recipe(action_type, prot_type, prot_name, cur_page)
end
end
function RecipeController.get_page_name_for_recipe(action_type, prot_type, prot_name, cur_page)
if cur_page then
local recipe = get_recipe_list()[cur_page]
if recipe then
return recipe
end
end
local global = Player.get_global()
if not global.recipe_page then global.recipe_page = {} end
if action_type and prot_type and prot_name then
local name = action_type .. prot_type .. prot_name
return global.recipe_page[name]
else
Debug:error("Error in function RecipeController.get_page_name_for_recipe: nil value")
end
end
function RecipeController.set_page_name_for_recipe(action_type, prot_type, prot_name, val)
local global = Player.get_global()
if not global.recipe_page then global.recipe_page = {} end
if action_type and prot_type and prot_name then
local name = action_type .. prot_type .. prot_name
global.recipe_page[name] = val
else
Debug:error("Error in function RecipeController.set_page_name_for_recipe: nil value")
end
end
function RecipeController.save_page()
local val = r_list:get()
if val then
local list = pages:get_list_for_tab(pages:get_cur_page())
if list and list[1] then
RecipeController.set_page_name_for_recipe(val.action_type, val.type, val.name, list[1])
val.page = list[1]
end
end
end
function RecipeController.change_last_opened_recipe()
local elem = r_list:get()
local recipe = {}
if elem then
recipe = RecipeController.get_recipe_stucture(elem.type, elem.name, elem.action_type, elem.page.name)
end
Controller.get_cont("hotbar").replace_last_elem( recipe )
end
----------------------------------- paging ---------------------------------------
function RecipeController.set_page_list()
local last_prot = r_list.get()
if last_prot then
pages:set_page_list(RecipeController.get_recipe_list(last_prot.action_type, last_prot.type, last_prot.name))
end
RecipeController.set_cur_page()
end
function RecipeController.set_cur_page()
local val = r_list.get()
if val and val.page then
local end_val = pages:amount_page()
for i = 1,end_val do
local recipe = pages:get_list_for_tab(i)
if recipe and recipe[1] == val.page then
pages:set_cur_page(i)
return
end
end
end
pages:set_cur_page(1)
end
-------------------------------- events ----------------------------------------
function RecipeController.open_item_recipe_event(event, elem_name)
if elem_name == "item" then
local _,pos = string.find(event.element.name, "item\t")
if pos then
elem_name = string.sub(event.element.name, pos + 1)
end
if event.button == defines.mouse_button_type.right then
RecipeController.add_element("usage", "item", elem_name)
RecipeController.open_new_recipes()
else
RecipeController.add_element("craft", "item", elem_name)
RecipeController.open_new_recipes()
end
end
end
function RecipeController.open_fluid_recipe_event(event, elem_name)
if elem_name == "fluid" then
local _,pos = string.find(event.element.name, "fluid\t")
if pos then
elem_name = string.sub(event.element.name, pos + 1)
end
if event.button == defines.mouse_button_type.right then
RecipeController.add_element("usage", "fluid", elem_name)
RecipeController.open_new_recipes()
else
RecipeController.add_element("craft", "fluid", elem_name)
RecipeController.open_new_recipes()
end
end
end
function RecipeController.open_tech_event(event, elem_name, split_names)
local tech_name = split_names[4]
TechHook.save_cur_fnei_state()
Player.get().open_technology_gui(tech_name)
end
function RecipeController.change_page_event()
RecipeController.draw_paging()
RecipeController.draw_recipe()
RecipeController.set_crafting_type()
RecipeController.draw_cur_prot()
RecipeController.save_page()
RecipeController.draw_favorite_button()
RecipeController.change_last_opened_recipe()
end
function RecipeController.settings_key_event(event)
Controller.open_event("settings")
end
function RecipeController.back_key_event(event)
if event.control or event.shift then
r_list:clear()
end
Controller.back_key_event()
end
local state = true
function RecipeController.favorite_key_event(event)
local elem = r_list:get()
local recipe = {}
if elem then
recipe = RecipeController.get_recipe_stucture(elem.type, elem.name, elem.action_type, elem.page.name)
end
Controller.get_cont("hotbar").change_favorite_recipe_state( recipe )
RecipeController.draw_favorite_button()
end
-------------------------------- recipe list ----------------------------------------
function RecipeController.get_recipe_list(action_type, type, prot)
local recipe_list = {}
if action_type == "craft" then
recipe_list = RecipeController.get_caraft_recipe_list(prot, type)
elseif action_type == "usage" then
recipe_list = RecipeController.get_usage_recipe_list(prot, type)
else
Debug:error("Error in function RecipeController.get_recipe_list: unknown craft type: ", action_type, "")
end
local rec_list = get_filtred_recipe_list(recipe_list)
rec_list = RecipeController.delete_equals_recipe(rec_list)
return RecipeController.sort_recipe_list(rec_list)
end
function RecipeController.delete_equals_recipe(list)
if not Settings.get_val("show-the-same-recipes") then
local ret_tb = {}
local eq_rec = get_equals_recipe_list()
for name, recipe in pairs(list) do
if eq_rec[name] then
local flag = true
for _, s_recipe in pairs(eq_rec[name]) do
if s_recipe.valid and ret_tb[s_recipe.name] then
flag = false
break
end
end
if flag then
ret_tb[name] = recipe
end
else
ret_tb[name] = recipe
end
end
return ret_tb
end
return list
end
function RecipeController.sort_recipe_list(recipe_list)
local en_list = {}
local dis_list = {}
local hid_list = {}
for _,recipe in pairs(recipe_list) do
if recipe.hidden then
table.insert(hid_list, recipe)
elseif recipe.enabled then
table.insert(en_list, recipe)
else
table.insert(dis_list, recipe)
end
end
local ret_tb = {}
for _,recipe in pairs(en_list) do
table.insert(ret_tb, recipe)
end
for _,recipe in pairs(dis_list) do
table.insert(ret_tb, recipe)
end
for _,recipe in pairs(hid_list) do
table.insert(ret_tb, recipe)
end
return ret_tb
end
function RecipeController.get_caraft_recipe_list(element, el_type)
local recipes = get_recipe_list()
local ret_tb = {}
for _,recipe in pairs(recipes) do
for _,product in pairs(recipe.products) do
if product.name == element and product.type == el_type then
ret_tb[recipe.name] = recipe
end
end
end
return ret_tb
end
function RecipeController.get_usage_recipe_list(element, el_type)
local recipes = get_recipe_list()
local ret_tb = {}
for _,recipe in pairs(recipes) do
for _,ingredient in pairs(recipe.ingredients) do
if ingredient.name == element and ingredient.type == el_type then
ret_tb[recipe.name] = recipe
end
end
end
return ret_tb
end
--------------------------------------------------------------------------------------
return RecipeController