--[[ ------------------------------------------------------------ -- --- -- MCM Savefile Storage -- --- -- Savefile-specific persistent MCM configuration storage -- You are free to do with this file as you want, as long as you keep this header intact. -- -- Version 1.0 for Anomaly 1.5.1 / MCM 1.3 -- By dph-hcl ------------------------------------------------------------ USAGE -- Usually the only thing you need to do is call register_module(mod) from on_game_start() in your addon. The parameter "mod" here is the ID of the tree you return on_mcm_load() in your script. You may want to check for existence of "dph_mcm_save_storage" beforehand, unless you distribute this script with your addon. For example: function on_mcm_load() op = { id="example_example", ,gr={ ... } } return op end function on_game_start() if dph_mcm_save_storage then dph_mcm_save_storage.register_module("example_example") end end And that's it. All config options inside that tree are now saved/loaded with the players savefile. You can also save only a subset of your options, or everything in a collection by passing the correct path as parameter: For example: -- this isn't any different than the above example, -- but since "example_collection" is a collection name the path will match all options starting with example_collection/ dph_mcm_save_storage.register_module("example_collection") -- this will match "example_option1" in the tree "example_example" dph_mcm_save_storage.register_module("example_example/example_option1") -- this will match everything in the tree "example_example" belonging to "example_collection" dph_mcm_save_storage.register_module("example_collection/example_example") And so on. It'll simply use all options that match the path you pass register_module, regardless of its semantics. ]]-- local modules = {} function register_module(mod) m = tostring(mod) if (not m) then return end table.insert(modules, mod) end local function compare_paths(mt, pt) m = tostring(mt) p = tostring(pt) if (not m) or (not p) then return end local mm = str_explode(m, "/") local pp = str_explode(p, "/") for i, seg in ipairs(mm) do if (not pp[i]) or (seg ~= pp[i]) then return false end return true end end function load_state(data) local t = axr_main.config:collect_section("mcm") for p, v in pairs(t) do for i, m in ipairs(modules) do if not data[m] then goto continue end if compare_paths(m, p) then ui_mcm.set(p, (data[m][p] or false)) end ::continue:: end end end function save_state(data) local t = axr_main.config:collect_section("mcm") for p, v in pairs(t) do for i, m in ipairs(modules) do if not data[m] then data[m] = {} end if compare_paths(m, p) then data[m][p] = ui_mcm.get(p) end end end end function on_game_start() RegisterScriptCallback("save_state", save_state) RegisterScriptCallback("load_state", load_state) end