Mutators: refactoring

This commit is contained in:
bi 2018-05-20 16:43:31 +03:00
parent a603ac007c
commit b44dac106e
5 changed files with 231 additions and 264 deletions

View file

@ -6,7 +6,6 @@ return {
}, },
short_title = "", --@TODO: rename it? short_title = "", --@TODO: rename it?
title_placement = "after", title_placement = "after",
description = "No description provided",
difficulty_levels = { difficulty_levels = {
"easy", "easy",
"normal", "normal",
@ -21,5 +20,7 @@ return {
incompatible_with_all = false, incompatible_with_all = false,
compatible_with_all = false, compatible_with_all = false,
incompatible_with = {}, incompatible_with = {},
compatible_with = {} compatible_with = {},
enable_before_these = {},
enable_after_these = {}
} }

View file

@ -1,32 +1,35 @@
--[[ Notify players of enabled mutators via chat and tab menu --]] --[[
Notify players of enabled mutators via chat and tab menu
--]]
local vmf = get_mod("VMF") local vmf = get_mod("VMF")
local mutators = vmf.mutators local _MUTATORS = vmf.mutators
local were_enabled_before = false local _WERE_ENABLED_BEFORE = false
-- Assembles a list of enabled mutators -- Assembles a list of enabled mutators
local function add_enabled_mutators_titles_to_string(str, separator, short) local function add_enabled_mutators_titles_to_string(separator, is_short)
local _mutators = {} local enabled_mutators = {}
for _, mutator in ipairs(mutators) do for _, mutator in ipairs(_MUTATORS) do
if mutator:is_enabled() then if mutator:is_enabled() then
table.insert(_mutators, mutator) table.insert(enabled_mutators, mutator)
end end
end end
return vmf.add_mutator_titles_to_string(_mutators, str, separator, short) return vmf.add_mutator_titles_to_string(enabled_mutators, separator, is_short)
end end
-- Sets the lobby name -- Sets the lobby name
local function set_lobby_data() local function set_lobby_data()
if ( if not Managers.matchmaking or
not Managers.matchmaking or not Managers.matchmaking.lobby or
not Managers.matchmaking.lobby or not Managers.matchmaking.lobby.set_lobby_data or
not Managers.matchmaking.lobby.set_lobby_data or not Managers.matchmaking.lobby.get_stored_lobby_data
not Managers.matchmaking.lobby.get_stored_lobby_data then
) then return end return
end
local name = add_enabled_mutators_titles_to_string("", " ", true) local name = add_enabled_mutators_titles_to_string(" ", true) -- @TODO: change separator?
local default_name = LobbyAux.get_unique_server_name() local default_name = LobbyAux.get_unique_server_name()
if string.len(name) > 0 then if string.len(name) > 0 then
@ -45,7 +48,7 @@ end
local function get_peer_id_from_cookie(client_cookie) local function get_peer_id_from_cookie(client_cookie)
local peer_id = tostring(client_cookie) local peer_id = tostring(client_cookie)
for _ = 1, 3 do for _ = 1, 3 do
peer_id = string.sub(peer_id, 1 + tonumber(tostring(string.find(peer_id,"-")))) peer_id = string.sub(peer_id, 1 + tonumber(tostring(string.find(peer_id, "-"))))
end end
peer_id = string.sub(peer_id, 2) peer_id = string.sub(peer_id, 2)
peer_id = string.reverse(peer_id) peer_id = string.reverse(peer_id)
@ -56,18 +59,15 @@ local function get_peer_id_from_cookie(client_cookie)
end end
-- Append difficulty name with enabled mutators' titles -- Append difficulty name with enabled mutators' titles
vmf:hook("IngamePlayerListUI.update_difficulty", function(func, self) vmf:hook("IngamePlayerListUI.update_difficulty", function(func_, self)
local difficulty_settings = Managers.state.difficulty:get_difficulty_settings() local difficulty_settings = Managers.state.difficulty:get_difficulty_settings()
local difficulty_name = difficulty_settings.display_name local difficulty_name = difficulty_settings.display_name
--local name = not self.is_in_inn and Localize(difficulty_name) or "" local name = add_enabled_mutators_titles_to_string(", ", true)
--name = add_enabled_mutators_titles_to_string(name, ", ", true)
local name = add_enabled_mutators_titles_to_string("", ", ", true)
local localized_difficulty_name = not self.is_in_inn and Localize(difficulty_name) or "" local localized_difficulty_name = not self.is_in_inn and Localize(difficulty_name) or ""
if name == "" then -- no mutators if name == "" then -- no mutators
name = localized_difficulty_name name = localized_difficulty_name
elseif localized_difficulty_name ~= "" then -- no difficulty (inn) elseif localized_difficulty_name ~= "" then -- it can be "" if player is in the inn with no selected level
name = name .. " (" .. localized_difficulty_name .. ")" name = name .. " (" .. localized_difficulty_name .. ")"
end end
@ -80,24 +80,24 @@ end)
vmf:hook("MatchmakingStateHostGame.host_game", function(func, self, ...) vmf:hook("MatchmakingStateHostGame.host_game", function(func, self, ...)
func(self, ...) func(self, ...)
set_lobby_data() set_lobby_data()
local names = add_enabled_mutators_titles_to_string("", ", ") local names = add_enabled_mutators_titles_to_string(", ")
if string.len(names) > 0 then if names ~= "" then
vmf:chat_broadcast(vmf:localize("broadcast_enabled_mutators") .. ": " .. names) vmf:chat_broadcast(vmf:localize("broadcast_enabled_mutators") .. ": " .. names)
were_enabled_before = true _WERE_ENABLED_BEFORE = true
elseif were_enabled_before then elseif _WERE_ENABLED_BEFORE then
vmf:chat_broadcast(vmf:localize("broadcast_all_disabled")) vmf:chat_broadcast(vmf:localize("broadcast_all_disabled"))
were_enabled_before = false _WERE_ENABLED_BEFORE = false
end end
end) end)
-- Send special messages with enabled mutators list to players just joining the lobby -- Send special messages with enabled mutators list to players just joining the lobby
vmf:hook("MatchmakingManager.rpc_matchmaking_request_join_lobby", function(func, self, sender, client_cookie, host_cookie, lobby_id, friend_join) vmf:hook("MatchmakingManager.rpc_matchmaking_request_join_lobby", function(func, self, sender, client_cookie, ...)
local name = add_enabled_mutators_titles_to_string("", ", ") local name = add_enabled_mutators_titles_to_string(", ")
if string.len(name) > 0 then if name ~= "" then
local message = vmf:localize("whisper_enabled_mutators") .. ": " .. name local message = vmf:localize("whisper_enabled_mutators") .. ": " .. name
vmf:chat_whisper(get_peer_id_from_cookie(client_cookie), message) vmf:chat_whisper(get_peer_id_from_cookie(client_cookie), message)
end end
func(self, sender, client_cookie, host_cookie, lobby_id, friend_join) func(self, sender, client_cookie, ...)
end) end)
return set_lobby_data return set_lobby_data

View file

@ -1,15 +1,6 @@
--[[ --[[
Converts mods into mutators
--]]
INCOMPATIBLE WITH:
COMPATIBLE ONLY WITH: (incompatible with everything except)
]]
--[[ Add ability to turn mods into mutators --]]
local vmf = get_mod("VMF") local vmf = get_mod("VMF")
-- List of mods that are also mutators in order in which they should be enabled -- List of mods that are also mutators in order in which they should be enabled
@ -35,7 +26,6 @@ local _MUTATORS_SORTED = false
local _ALL_MUTATORS_DISABLED = false local _ALL_MUTATORS_DISABLED = false
-- External modules -- External modules
--local _MUTATORS_VIEW
local _DICE_MANAGER local _DICE_MANAGER
local _SET_LOBBY_DATA local _SET_LOBBY_DATA
@ -57,21 +47,41 @@ local function get_index(tbl, o)
return nil return nil
end end
-- Adds mutator names from enable_these_after to the list of mutators that should be enabled after the mutator_name
local function update_mutators_sequence(mutator_name, enable_these_after)
if not _MUTATORS_SEQUENCE[mutator_name] then
_MUTATORS_SEQUENCE[mutator_name] = {}
end
for _, other_mutator_name in ipairs(enable_these_after) do
if _MUTATORS_SEQUENCE[other_mutator_name] and table.contains(_MUTATORS_SEQUENCE[other_mutator_name], mutator_name) then -- Adds mutator names from enable_these_after to the list of mutators that should be enabled after the mutator_name
vmf:error("(mutators): Mutators '%s' and '%s' are both set to load after each other.", mutator_name, other_mutator_name) local function update_mutators_sequence(mutator)
elseif not table.contains(_MUTATORS_SEQUENCE[mutator_name], other_mutator_name) then
table.insert(_MUTATORS_SEQUENCE[mutator_name], other_mutator_name) local config = mutator:get_config()
local enable_before_these = config.enable_before_these
local enable_after_these = config.enable_after_these
local mutator_name = mutator:get_name()
if enable_before_these then
_MUTATORS_SEQUENCE[mutator_name] = _MUTATORS_SEQUENCE[mutator_name] or {}
for _, other_mutator_name in ipairs(enable_before_these) do
if _MUTATORS_SEQUENCE[other_mutator_name] and table.contains(_MUTATORS_SEQUENCE[other_mutator_name], mutator_name) then
vmf:error("(mutators): Mutators '%s' and '%s' are both set to load after each other.", mutator_name, other_mutator_name)
elseif not table.contains(_MUTATORS_SEQUENCE[mutator_name], other_mutator_name) then
table.insert(_MUTATORS_SEQUENCE[mutator_name], other_mutator_name)
end
end
end
if enable_after_these then
for _, other_mutator_name in ipairs(enable_after_these) do
_MUTATORS_SEQUENCE[other_mutator_name] = _MUTATORS_SEQUENCE[other_mutator_name] or {}
if _MUTATORS_SEQUENCE[mutator_name] and table.contains(_MUTATORS_SEQUENCE[mutator_name], other_mutator_name) then
vmf:error("(mutators): Mutators '%s' and '%s' are both set to load after each other.", mutator_name, other_mutator_name)
elseif not table.contains(_MUTATORS_SEQUENCE[other_mutator_name], mutator_name) then
table.insert(_MUTATORS_SEQUENCE[other_mutator_name], mutator_name)
end
end end
end end
end end
-- Checks if mutators are compatible both ways -- Checks if mutators are compatible both ways
local function is_compatible(mutator, other_mutator) local function is_compatible(mutator, other_mutator)
local config = mutator:get_config() local config = mutator:get_config()
@ -117,6 +127,7 @@ end
-- 'compatibility.is_mostly_compatible' is 'true' when mutator is not specifically set to be incompatible with -- 'compatibility.is_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, -- all other mutators. All the incompatible mutators will be added to 'compatibility.except'. And vice versa,
-- if 'is_mostly_compatible' is 'false', all the compatible mutators will be added to 'except'. -- if 'is_mostly_compatible' is 'false', all the compatible mutators will be added to 'except'.
-- Also, converts given difficulties compatibility to optimized form.
local function update_compatibility(mutator) local function update_compatibility(mutator)
-- Create default 'compatibility' entry -- Create default 'compatibility' entry
@ -168,25 +179,6 @@ local function update_compatibility(mutator)
compatibility.compatible_difficulties_number = compatible_difficulties_number compatibility.compatible_difficulties_number = compatible_difficulties_number
end end
function vmf.temp_show_mutator_compatibility()
print("MUTATORS COMPATIBILITY:")
print("")
for _, mutator in ipairs(_MUTATORS) do
local compatibility = mutator:get_config().compatibility
print(mutator:get_readable_name() .. (compatibility.is_mostly_compatible and "[+]" or "[-]") .. ":")
local ident = compatibility.is_mostly_compatible and " - " or " + "
for other_mutator in pairs(compatibility.except) do
print(ident .. other_mutator:get_readable_name())
end
print("")
end
end
-- Called after mutator is enabled -- Called after mutator is enabled
local function on_enabled(mutator) local function on_enabled(mutator)
@ -276,32 +268,52 @@ vmf.mutators = _MUTATORS
-- # LOCAL # -- # LOCAL #
-- ######### -- #########
-- Checks current difficulty, map selection screen settings (optionally), incompatible mutators and whether player is server -- Determine if a mutator can be enabled
-- to determine if a mutator can be enabled local function mutator_can_be_enabled(mutator)
function vmf.mutator_can_be_enabled(mutator)
if #vmf.get_incompatible_mutators(mutator, true) > 0 then return false end -- If conflicting mutators are enabled
return player_is_server() and vmf.mutator_supports_current_difficulty(mutator) local mutator_compatibility_config = mutator:get_config().compatibility
local is_mostly_compatible = mutator_compatibility_config.is_mostly_compatible
local except = mutator_compatibility_config.except
for _, other_mutator in ipairs(_MUTATORS) do
if other_mutator:is_enabled() and other_mutator ~= mutator and
(is_mostly_compatible and except[other_mutator] or not is_mostly_compatible and not except[other_mutator]) then
return false
end
end
-- If player is no longer the server
if not player_is_server() then
return false
end
-- If conflicting difficulty is set (if no difficulty is set, all mutators are allowed)
local actual_difficulty = Managers.state and Managers.state.difficulty:get_difficulty()
local compatible_difficulties = mutator_compatibility_config.compatible_difficulties
return not actual_difficulty or compatible_difficulties[actual_difficulty]
end end
-- Appends, prepends and replaces the string with mutator titles -- Appends, prepends and replaces the string with mutator titles
-- M, I function vmf.add_mutator_titles_to_string(mutators, separator, is_short)
function vmf.add_mutator_titles_to_string(_mutators, str, separator, short)
if #_mutators == 0 then return str end if #mutators == 0 then
return ""
end
local before = nil local before = nil
local after = nil local after = nil
local replace = nil local replace = nil
for _, mutator in ipairs(_mutators) do for _, mutator in ipairs(mutators) do
local config = mutator:get_config() local config = mutator:get_config()
local added_name = (short and config.short_title or mutator:get_readable_name()) local added_name = (is_short and config.short_title or mutator:get_readable_name())
if config.title_placement == "before" then if config.title_placement == "before" then
if before then if before then
before = added_name .. separator .. before before = added_name .. separator .. before
else else
before = added_name before = added_name
end end
elseif config.title_placement == "replace" then elseif config.title_placement == "replace" then --@TODO: get rid of replace? Or maybe title_placement as a whole?
if replace then if replace then
replace = replace .. separator .. added_name replace = replace .. separator .. added_name
else else
@ -315,7 +327,7 @@ function vmf.add_mutator_titles_to_string(_mutators, str, separator, short)
end end
end end
end end
local new_str = replace or str local new_str = replace or ""
if before then if before then
new_str = before .. (string.len(new_str) > 0 and separator or "") .. new_str new_str = before .. (string.len(new_str) > 0 and separator or "") .. new_str
end end
@ -325,65 +337,27 @@ function vmf.add_mutator_titles_to_string(_mutators, str, separator, short)
return new_str return new_str
end end
-- Returns a list of incompatible with self mutators, all or only enabled ones
-- M, G
function vmf.get_incompatible_mutators(mutator, enabled_only)
local incompatible_mutators = {}
for _, other_mutator in ipairs(_MUTATORS) do
if (
other_mutator ~= mutator and
(not enabled_only or other_mutator:is_enabled()) and
not is_compatible(mutator, other_mutator)
) then
table.insert(incompatible_mutators, other_mutator)
end
end
return incompatible_mutators
end
-- Disables mutators that cannot be enabled right now -- Disables mutators that cannot be enabled right now
-- M, G local function disable_impossible_mutators(everybody, reason)
function vmf.disable_impossible_mutators(notify, everybody, reason)
local disabled_mutators = {} local disabled_mutators = {}
for i = #_MUTATORS, 1, -1 do for i = #_MUTATORS, 1, -1 do
local mutator = _MUTATORS[i] local mutator = _MUTATORS[i]
if mutator:is_enabled() and not vmf.mutator_can_be_enabled(mutator) then if mutator:is_enabled() and not mutator_can_be_enabled(mutator) then
vmf.mod_state_changed(mutator:get_name(), false) vmf.mod_state_changed(mutator:get_name(), false)
table.insert(disabled_mutators, mutator) table.insert(disabled_mutators, mutator)
end end
end end
if #disabled_mutators > 0 and notify then if #disabled_mutators > 0 then
if not reason then reason = "" end
local loc = everybody and "broadcast_disabled_mutators" or "local_disabled_mutators" local loc = everybody and "broadcast_disabled_mutators" or "local_disabled_mutators"
local message = vmf:localize(loc) .. " " .. vmf:localize(reason) .. ":" local message = vmf:localize(loc) .. " " .. vmf:localize(reason) .. ":"
message = message .. " " .. vmf.add_mutator_titles_to_string(disabled_mutators, "", ", ", false) message = message .. " " .. vmf.add_mutator_titles_to_string(disabled_mutators, ", ", false)
if everybody then if everybody then
vmf:chat_broadcast(message) vmf:chat_broadcast(message)
else else
vmf:echo(message) vmf:echo(message)
end end
end end
return disabled_mutators
end
-- Only checks difficulty
-- M, G
function vmf.mutator_supports_current_difficulty(mutator)
local mutator_difficulty_levels = mutator:get_config().difficulty_levels
local actual_difficulty = Managers.state and Managers.state.difficulty:get_difficulty()
local right_difficulty = not actual_difficulty or table.contains(mutator_difficulty_levels, actual_difficulty)
local right_unapplied_difficulty = false
local map_view_exists, map_view = pcall(function () return Managers.matchmaking.ingame_ui.views.map_view end)
local map_view_active = map_view_exists and map_view.active
if map_view_active then
local difficulty_data = map_view.selected_level_index and map_view:get_difficulty_data(map_view.selected_level_index)
local difficulty_layout = difficulty_data and difficulty_data[map_view.selected_difficulty_stepper_index]
local difficulty_key = difficulty_layout and difficulty_layout.key
right_unapplied_difficulty = difficulty_key and table.contains(mutator_difficulty_levels, difficulty_key)
end
return (map_view_active and right_unapplied_difficulty) or (not map_view_active and right_difficulty)
end end
-- ########## -- ##########
@ -407,25 +381,11 @@ function vmf.register_mod_as_mutator(mod, config)
mod._data.config = _config mod._data.config = _config
update_compatibility(mod) update_compatibility(mod)
update_mutators_sequence(mod)
local mod_name = mod:get_name()
-- @TODO: probably move these 2 blocks to the function of something like that
if config.enable_before_these then
update_mutators_sequence(mod_name, config.enable_before_these)
end
if config.enable_after_these then
for _, other_mod_name in ipairs(config.enable_after_these) do
update_mutators_sequence(other_mod_name, {mod_name})
end
end
table.insert(_MUTATORS, mod) table.insert(_MUTATORS, mod)
_MUTATORS_SORTED = false _MUTATORS_SORTED = false
--_MUTATORS_VIEW:update_mutator_list()
end end
-- Enables/disables mutator while preserving the sequence in which they were enabled -- Enables/disables mutator while preserving the sequence in which they were enabled
@ -476,7 +436,7 @@ end
-- Check if player is still hosting (on update) -- Check if player is still hosting (on update)
function vmf.check_mutators_state() function vmf.check_mutators_state()
if not _ALL_MUTATORS_DISABLED and not player_is_server() then if not _ALL_MUTATORS_DISABLED and not player_is_server() then
vmf.disable_impossible_mutators(true, false, "disabled_reason_not_server") disable_impossible_mutators(false, "disabled_reason_not_server")
_ALL_MUTATORS_DISABLED = true _ALL_MUTATORS_DISABLED = true
end end
end end
@ -486,12 +446,32 @@ function vmf.is_mutator_enabled(mutator_name)
return _ENABLED_MUTATORS[mutator_name] return _ENABLED_MUTATORS[mutator_name]
end end
function vmf.temp_show_mutator_compatibility()
print("MUTATORS COMPATIBILITY:")
print("")
for _, mutator in ipairs(_MUTATORS) do
local compatibility = mutator:get_config().compatibility
print(mutator:get_readable_name() .. (compatibility.is_mostly_compatible and "[+]" or "[-]") .. ":")
local ident = compatibility.is_mostly_compatible and " - " or " + "
for other_mutator in pairs(compatibility.except) do
print(ident .. other_mutator:get_readable_name())
end
print("")
end
end
-- #################################################################################################################### -- ####################################################################################################################
-- ##### Hooks ######################################################################################################## -- ##### Hooks ########################################################################################################
-- #################################################################################################################### -- ####################################################################################################################
vmf:hook("DifficultyManager.set_difficulty", function(func, self, difficulty) vmf:hook("DifficultyManager.set_difficulty", function(func, self, difficulty)
vmf.disable_impossible_mutators(true, true, "disabled_reason_difficulty_change") disable_impossible_mutators(true, "disabled_reason_difficulty_change")
return func(self, difficulty) return func(self, difficulty)
end) end)
@ -501,13 +481,9 @@ end)
_DEFAULT_CONFIG = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_default_config") _DEFAULT_CONFIG = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_default_config")
--_MUTATORS_VIEW = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_gui")
_DICE_MANAGER = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_dice") _DICE_MANAGER = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_dice")
_SET_LOBBY_DATA = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_info") _SET_LOBBY_DATA = vmf:dofile("scripts/mods/vmf/modules/ui/mutators/mutator_info")
-- Initialize mutators view when map_view has been initialized already
--_MUTATORS_VIEW:init(_MUTATORS_VIEW:get_map_view())
-- Testing -- Testing
vmf:dofile("scripts/mods/vmf/modules/ui/mutators/test/mutator_test") vmf:dofile("scripts/mods/vmf/modules/ui/mutators/test/mutator_test")
--vmf:dofile("scripts/mods/vmf/modules/ui/mutators/test/mutation") --vmf:dofile("scripts/mods/vmf/modules/ui/mutators/test/mutation")

View file

@ -1,6 +1,5 @@
local vmf = get_mod("VMF") local vmf = get_mod("VMF")
local _MUTATORS = vmf.mutators local _MUTATORS = vmf.mutators
local _SELECTED_DIFFICULTY_KEY -- Currently selected difficulty in the map view. local _SELECTED_DIFFICULTY_KEY -- Currently selected difficulty in the map view.
@ -18,7 +17,6 @@ local _IS_MUTATOR_LIST_VISIBLE -- 'true' if Mutator view is active, 'false' if P
local _CURRENT_PAGE_NUMBER local _CURRENT_PAGE_NUMBER
local _TOTAL_PAGES_NUMBER local _TOTAL_PAGES_NUMBER
local _IS_MUTATORS_GUI_INITIALIZED = false local _IS_MUTATORS_GUI_INITIALIZED = false
-- #################################################################################################################### -- ####################################################################################################################
@ -121,8 +119,7 @@ local function calculate_tooltip_offset (widget_content, widget_style, ui_render
end end
end end
-- Callback function for mutator widgets. It's not defined in definitions file because it works with -- Callback function for mutator widgets. It's not defined in definitions file because it works with mutators array.
-- mutators array and vmf.various_internal_functions.
local function offset_function_callback(ui_scenegraph_, style, content, ui_renderer) local function offset_function_callback(ui_scenegraph_, style, content, ui_renderer)
local mutator = content.mutator local mutator = content.mutator
@ -150,7 +147,7 @@ local function offset_function_callback(ui_scenegraph_, style, content, ui_rende
-- Enable/disable mutator. -- Enable/disable mutator.
if content.highlight_hotspot.on_release then if content.highlight_hotspot.on_release then
if mutator:is_enabled() then if mutator:is_enabled() then
vmf.set_mutator_state(mutator, false, false) vmf.set_mutator_state(mutator, false, false) --@TODO: change method?
elseif can_be_enabled then elseif can_be_enabled then
vmf.set_mutator_state(mutator, true, false) vmf.set_mutator_state(mutator, true, false)
end end

View file

@ -1,10 +1,11 @@
local vmf = get_mod("VMF") local vmf = get_mod("VMF")
local mod
local mod_data local mod_data
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local mutator555 = new_mod("mutator555") mod = new_mod("test_legendary")
mod_data = {} mod_data = {}
mod_data.name = "Legendary" mod_data.name = "Legendary"
mod_data.description = "Legendary description" mod_data.description = "Legendary description"
@ -12,34 +13,33 @@ mod_data.is_mutator = true
mod_data.mutator_settings = { mod_data.mutator_settings = {
incompatible_with_all = true, incompatible_with_all = true,
compatible_with = { compatible_with = {
--"mutator3" "test_something"
} }
--title = "Legendary"
} }
mutator555:initialize_data(mod_data) mod:initialize_data(mod_data)
mutator555.on_enabled = function(init_call) mutator555:echo("Legendary on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("Legendary on_enabled(" .. (init_call and "init)" or ")")) end
mutator555.on_disabled = function(init_call) mutator555:echo("Legendary on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("Legendary on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(mutator555) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local mutator3 = new_mod("mutator3") mod = new_mod("test_something")
mod_data = {} mod_data = {}
mod_data.name = "Something" mod_data.name = "Something"
mod_data.is_mutator = true mod_data.is_mutator = true
mod_data.mutator_settings = { mod_data.mutator_settings = {
incompatible_with = { incompatible_with = {
"mutator4" "test_true_solo",
}, "test_slayer"
--title = "Something" }
} }
mutator3:initialize_data(mod_data) mod:initialize_data(mod_data)
mutator3.on_enabled = function(init_call) mutator3:echo("Something on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("Something on_enabled(" .. (init_call and "init)" or ")")) end
mutator3.on_disabled = function(init_call) mutator3:echo("Something on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("Something on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(mutator3) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local mutator2 = new_mod("mutator2") mod = new_mod("test_deathwish")
mod_data = {} mod_data = {}
mod_data.name = "?Deathwish" mod_data.name = "?Deathwish"
mod_data.is_mutator = true mod_data.is_mutator = true
@ -48,17 +48,16 @@ mod_data.mutator_settings = {
"hardest", "hardest",
"survival_hardest" "survival_hardest"
}, },
--title = "?Deathwish",
title_placement = "after" title_placement = "after"
} }
mutator2:initialize_data(mod_data) mod:initialize_data(mod_data)
mutator2.on_enabled = function(init_call) mutator3:echo("?Deathwish on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("?Deathwish on_enabled(" .. (init_call and "init)" or ")")) end
mutator2.on_disabled = function(init_call) mutator3:echo("?Deathwish on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("?Deathwish on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(mutator2) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local slayer = new_mod("slayer") mod = new_mod("test_slayer")
mod_data = {} mod_data = {}
mod_data.name = "Slayer's Oath" mod_data.name = "Slayer's Oath"
mod_data.is_mutator = true mod_data.is_mutator = true
@ -67,179 +66,173 @@ mod_data.mutator_settings = {
"survival_hard", "survival_hard",
"survival_harder", "survival_harder",
"survival_hardest" "survival_hardest"
}, }
--title = "Slayer's Oath"
} }
slayer:initialize_data(mod_data) mod:initialize_data(mod_data)
slayer.on_enabled = function(init_call) mutator3:echo("Slayer's Oath on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("Slayer's Oath on_enabled(" .. (init_call and "init)" or ")")) end
slayer.on_disabled = function(init_call) mutator3:echo("Slayer's Oath on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("Slayer's Oath on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(slayer) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local true_solo = new_mod("true_solo") mod = new_mod("test_true_solo")
mod_data = {} mod_data = {}
mod_data.name = "True Solo" mod_data.name = "True Solo"
mod_data.is_mutator = true mod_data.is_mutator = true
mod_data.mutator_settings = { mod_data.mutator_settings = {
compatible_with_all = true, compatible_with_all = true,
--title = "True Solo",
title_placement = "before" title_placement = "before"
} }
true_solo:initialize_data(mod_data) mod:initialize_data(mod_data)
true_solo.on_enabled = function(init_call) mutator3:echo("True Solo on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("True Solo on_enabled(" .. (init_call and "init)" or ")")) end
true_solo.on_disabled = function(init_call) mutator3:echo("True Solo on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("True Solo on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(true_solo) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local onslaught = new_mod("onslaught") mod = new_mod("test_onslaught")
mod_data = {} mod_data = {}
mod_data.name = "Onslaught" mod_data.name = "Onslaught"
mod_data.is_mutator = true mod_data.is_mutator = true
--mod_data.mutator_settings = { mod:initialize_data(mod_data)
-- title = "Onslaught" mod.on_enabled = function(init_call) mod:echo("Onslaught on_enabled(" .. (init_call and "init)" or ")")) end
--} mod.on_disabled = function(init_call) mod:echo("Onslaught on_disabled(" .. (init_call and "init)" or ")")) end
onslaught:initialize_data(mod_data) vmf.initialize_mod_state(mod)
onslaught.on_enabled = function(init_call) mutator3:echo("Onslaught on_enabled(" .. (init_call and "init)" or ")")) end
onslaught.on_disabled = function(init_call) mutator3:echo("Onslaught on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(onslaught)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local one_hit_one_kill = new_mod("one_hit_one_kill") mod = new_mod("test_one_hit_one_kill")
mod_data = {} mod_data = {}
mod_data.name = "One Hit One Kill" mod_data.name = "One Hit One Kill"
mod_data.description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tincidunt placerat nulla eget pharetra. Vivamus consequat tristique vestibulum. Nullam vitae feugiat arcu, non porta ante. Phasellus consequat facilisis quam quis dignissim" mod_data.description = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tincidunt placerat" ..
" nulla eget pharetra. Vivamus consequat tristique vestibulum. Nullam vitae feugiat arcu," ..
" non porta ante. Phasellus consequat facilisis quam quis dignissim"
mod_data.is_mutator = true mod_data.is_mutator = true
mod_data.mutator_settings = { mod_data.mutator_settings = {
--title = "One Hit One Kill",
difficulty_levels = {"hardest"}, difficulty_levels = {"hardest"},
enable_after_these = {"more_rat_weapons"} enable_after_these = {"test_more_rats_weapons"}
} }
one_hit_one_kill:initialize_data(mod_data) mod:initialize_data(mod_data)
one_hit_one_kill.on_enabled = function(init_call) mutator3:echo("One Hit One Kill on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("One Hit One Kill on_enabled(" .. (init_call and "init)" or ")")) end
one_hit_one_kill.on_disabled = function(init_call) mutator3:echo("One Hit One Kill on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("One Hit One Kill on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(one_hit_one_kill) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local ayyyy = new_mod("ayyyy") mod = new_mod("ayyyy")
mod_data = {} mod_data = {}
mod_data.name = "ayyyy" mod_data.name = "ayyyy"
mod_data.is_mutator = true mod_data.is_mutator = true
ayyyy:initialize_data(mod_data) mod:initialize_data(mod_data)
ayyyy.on_enabled = function(init_call) mutator3:echo("ayyyy on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("ayyyy on_enabled(" .. (init_call and "init)" or ")")) end
ayyyy.on_disabled = function(init_call) mutator3:echo("ayyyy on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("ayyyy on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(ayyyy) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local lmao = new_mod("lmao") mod = new_mod("lmao")
mod_data = {} mod_data = {}
mod_data.name = "lmao" mod_data.name = "lmao"
mod_data.is_mutator = true mod_data.is_mutator = true
mod_data.mutator_settings = { mod_data.mutator_settings = {
--title = "One Hit One Kill",
difficulty_levels = {"hardest"}, difficulty_levels = {"hardest"},
enable_after_these = {"ayyyy"} enable_after_these = {"ayyyy"}
} }
lmao:initialize_data(mod_data) mod:initialize_data(mod_data)
lmao.on_enabled = function(init_call) mutator3:echo("lmao on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("lmao on_enabled(" .. (init_call and "init)" or ")")) end
lmao.on_disabled = function(init_call) mutator3:echo("lmao on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("lmao on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(lmao) vmf.initialize_mod_state(mod)
---------------------------------------------------------------------------------- ----------------------------------------------------------------------------------
local more_rat_weapons = new_mod("more_rat_weapons") mod = new_mod("test_more_rats_weapons")
mod_data = {} mod_data = {}
mod_data.name = "More Rat Weapons" mod_data.name = "More Rat Weapons"
mod_data.is_mutator = true mod_data.is_mutator = true
mod_data.mutator_settings = { mod_data.mutator_settings = {
compatible_with_all = true, compatible_with_all = true,
--title = "More Rat Weapons",
difficulty_levels = {"hardest"} difficulty_levels = {"hardest"}
} }
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
--[[ -- scrollbar test
mod = new_mod("111")
more_rat_weapons = new_mod("111")
mod_data = {} mod_data = {}
mod_data.name = "111" mod_data.name = "111"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("111 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("111 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("222") mod = new_mod("222")
mod_data = {} mod_data = {}
mod_data.name = "222" mod_data.name = "222"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("222 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("222 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("333") mod = new_mod("333")
mod_data = {} mod_data = {}
mod_data.name = "333" mod_data.name = "333"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("333 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("333 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("444") mod = new_mod("444")
mod_data = {} mod_data = {}
mod_data.name = "444" mod_data.name = "444"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("444 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("444 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("555") mod = new_mod("555")
mod_data = {} mod_data = {}
mod_data.name = "555" mod_data.name = "555"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("555 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("555 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("666") mod = new_mod("666")
mod_data = {} mod_data = {}
mod_data.name = "666" mod_data.name = "666"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("666 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("666 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("777") mod = new_mod("777")
mod_data = {} mod_data = {}
mod_data.name = "777" mod_data.name = "777"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("777 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("777 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
more_rat_weapons = new_mod("888") mod = new_mod("888")
mod_data = {} mod_data = {}
mod_data.name = "888" mod_data.name = "888"
mod_data.is_mutator = true mod_data.is_mutator = true
more_rat_weapons:initialize_data(mod_data) mod:initialize_data(mod_data)
more_rat_weapons.on_enabled = function(init_call) mutator3:echo("More Rat Weapons on_enabled(" .. (init_call and "init)" or ")")) end mod.on_enabled = function(init_call) mod:echo("888 on_enabled(" .. (init_call and "init)" or ")")) end
more_rat_weapons.on_disabled = function(init_call) mutator3:echo("More Rat Weapons on_disabled(" .. (init_call and "init)" or ")")) end mod.on_disabled = function(init_call) mod:echo("888 on_disabled(" .. (init_call and "init)" or ")")) end
vmf.initialize_mod_state(more_rat_weapons) vmf.initialize_mod_state(mod)
]]