Divergent/mods/Mod Configuration Menu/gamedata/scripts/dph_mcm_save_storage.script

104 lines
3.2 KiB
Plaintext

--[[
------------------------------------------------------------
-- ---
-- 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