Mutators: added precalculated compatibility function

This commit is contained in:
bi 2018-05-06 20:13:28 +03:00
parent d8a84d2d76
commit 895bac9b96
3 changed files with 59 additions and 7 deletions

View file

@ -317,7 +317,7 @@ local mutators_view = {
-- Creates and return text for checkbox tooltip -- Creates and return text for checkbox tooltip
generate_tooltip_for = function(self, mutator) generate_tooltip_for = function(self, mutator)
local config = vmf.get_mutator_config(mutator) local config = mutator:get_config()
local text = "" local text = ""
-- Show supported difficulty when can't be enabled due to difficulty level -- Show supported difficulty when can't be enabled due to difficulty level

View file

@ -104,6 +104,55 @@ local function is_compatible(mutator, other_mutator)
return compatible return compatible
end end
-- Creates 'compatibility' entry for the mutator, checks compatibility of given mutator with all other mutators.
-- 'compatibility.mostly_compatible' is 'true' when mutator is not specifically set to be incompatible with
-- all other mutators. All the incompatible mutators will be added to 'compatibility.except'. And vice versa,
-- if 'mostly_compatible' is 'false', all the compatible mutators will be added to 'except'.
local function update_compatibility(mutator)
-- Create default 'compatibility' entry
local config = mutator:get_config()
config.compatibility = {}
local compatibility = config.compatibility
compatibility.mostly_compatible = not config.incompatible_with_all
compatibility.except = {}
local mostly_compatible = compatibility.mostly_compatible
local except = compatibility.except
for _, other_mutator in ipairs(_MUTATORS) do
local other_config = other_mutator:get_config()
local other_mostly_compatible = other_config.compatibility.mostly_compatible
local other_except = other_config.compatibility.except
if is_compatible(mutator, other_mutator) then
if not mostly_compatible then except[other_mutator] = true end
if not other_mostly_compatible then other_except[mutator] = true end
else
if mostly_compatible then except[other_mutator] = true end
if other_mostly_compatible then other_except[mutator] = true end
end
end
end
function vmf.temp_show_mutator_compatibility()
print("MUTATORS COMPATIBILITY:")
for _, mutator in ipairs(_MUTATORS) do
local compatibility = mutator:get_config().compatibility
print("\n" .. mutator:get_readable_name() .. (compatibility.mostly_compatible and "[+]" or "[-]") .. ":")
local ident = compatibility.mostly_compatible and " - " or " + "
for other_mutator in pairs(compatibility.except) do
print(ident .. other_mutator:get_readable_name())
end
end
end
-- Called after mutator is enabled -- Called after mutator is enabled
local function on_enabled(mutator) local function on_enabled(mutator)
local config = mutator:get_config() local config = mutator:get_config()
@ -321,13 +370,9 @@ end
-- Turns a mod into a mutator -- Turns a mod into a mutator
function vmf.register_mod_as_mutator(mod, config) function vmf.register_mod_as_mutator(mod, config)
-- Form config
config = config or {} config = config or {}
local _config = table.clone(_DEFAULT_CONFIG)
table.insert(_MUTATORS, mod)
-- Save config
mod._data.config = table.clone(_DEFAULT_CONFIG)
local _config = mod:get_config()
for k, _ in pairs(_config) do for k, _ in pairs(_config) do
if config[k] ~= nil then if config[k] ~= nil then
_config[k] = config[k] _config[k] = config[k]
@ -335,7 +380,10 @@ function vmf.register_mod_as_mutator(mod, config)
end end
if _config.short_title == "" then _config.short_title = nil end if _config.short_title == "" then _config.short_title = nil end
-- Save config inside the mod data
mod._data.config = _config
update_compatibility(mod)
local mod_name = mod:get_name() local mod_name = mod:get_name()
@ -350,6 +398,8 @@ function vmf.register_mod_as_mutator(mod, config)
end end
end end
table.insert(_MUTATORS, mod)
_MUTATORS_SORTED = false _MUTATORS_SORTED = false
_MUTATORS_VIEW:update_mutator_list() _MUTATORS_VIEW:update_mutator_list()

View file

@ -60,6 +60,8 @@ return {
object.vmf.create_network_dictionary() object.vmf.create_network_dictionary()
object.vmf.ping_vmf_users() object.vmf.ping_vmf_users()
object.vmf.temp_show_mutator_compatibility()
object.vmf.all_mods_loaded_event() object.vmf.all_mods_loaded_event()
object.vmf.all_mods_were_loaded = true object.vmf.all_mods_were_loaded = true