mutators: compatibility settings, some gui testing, fixes
This commit is contained in:
parent
0d417798d8
commit
512b69cb9e
4 changed files with 166 additions and 92 deletions
|
@ -4,7 +4,6 @@ return {
|
||||||
tomes = 0,
|
tomes = 0,
|
||||||
bonus = 0
|
bonus = 0
|
||||||
},
|
},
|
||||||
server_name = "",
|
|
||||||
title = "",
|
title = "",
|
||||||
short_title = "",
|
short_title = "",
|
||||||
difficulties = {
|
difficulties = {
|
||||||
|
@ -17,5 +16,9 @@ return {
|
||||||
"survival_hard",
|
"survival_hard",
|
||||||
"survival_harder",
|
"survival_harder",
|
||||||
"survival_hardest"
|
"survival_hardest"
|
||||||
}
|
},
|
||||||
|
incompatible_with_all = false,
|
||||||
|
compatible_with_all = false,
|
||||||
|
incompatible_with = {},
|
||||||
|
compatible_with = {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,10 +2,26 @@ local vmf = get_mod("VMF")
|
||||||
local mutators = vmf.mutators
|
local mutators = vmf.mutators
|
||||||
|
|
||||||
|
|
||||||
|
local banner_level_widget = UIWidgets.create_texture_with_text_and_tooltip("title_bar", "Mutators", "map_level_setting_tooltip", "banner_level", "banner_level_text", {
|
||||||
|
vertical_alignment = "center",
|
||||||
|
scenegraph_id = "banner_level_text",
|
||||||
|
localize = false,
|
||||||
|
font_size = 28,
|
||||||
|
horizontal_alignment = "center",
|
||||||
|
font_type = "hell_shark",
|
||||||
|
text_color = Colors.get_color_table_with_alpha("cheeseburger", 255)
|
||||||
|
})
|
||||||
|
local banner_level = UIWidget.init(banner_level_widget)
|
||||||
|
|
||||||
local window = nil
|
local window = nil
|
||||||
local button = nil
|
local button = nil
|
||||||
local window_opened = false
|
local window_opened = false
|
||||||
|
|
||||||
|
local function get_map_view()
|
||||||
|
local ingame_ui = Managers.matchmaking and Managers.matchmaking.ingame_ui
|
||||||
|
return ingame_ui and ingame_ui.views and ingame_ui.views.map_view
|
||||||
|
end
|
||||||
|
|
||||||
local function update_window_visibility(map_view)
|
local function update_window_visibility(map_view)
|
||||||
if not window then return end
|
if not window then return end
|
||||||
button.visible = map_view and map_view.friends and not map_view.friends:is_active()
|
button.visible = map_view and map_view.friends and not map_view.friends:is_active()
|
||||||
|
@ -24,10 +40,8 @@ local function destroy_window(map_view)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function create_window(map_view)
|
local function create_window(map_view)
|
||||||
destroy_window(map_view)
|
|
||||||
|
|
||||||
vmf.sort_mutators()
|
destroy_window(map_view)
|
||||||
vmf.disable_impossible_mutators()
|
|
||||||
|
|
||||||
local window_size = {0, 0}
|
local window_size = {0, 0}
|
||||||
local window_position = {50, 500}
|
local window_position = {50, 500}
|
||||||
|
@ -35,13 +49,16 @@ local function create_window(map_view)
|
||||||
window = get_mod("gui").create_window("mutators_window", window_position, window_size)
|
window = get_mod("gui").create_window("mutators_window", window_position, window_size)
|
||||||
|
|
||||||
for i, mutator in ipairs(mutators) do
|
for i, mutator in ipairs(mutators) do
|
||||||
window:create_checkbox("label" .. mutator:get_name(), {10, 40 * i}, {30, 30}, mutator:get_config().title, mutator:is_enabled(), function()
|
local title = mutator:get_config().title or mutator:get_name()
|
||||||
if not mutator:is_enabled() and mutator:can_be_enabled() then
|
window:create_checkbox("checkbox_" .. mutator:get_name(), {30, 360 - 40 * (i - 1)}, {30, 30}, title, mutator:is_enabled(), function(self)
|
||||||
mutator:enable()
|
if self.value then
|
||||||
|
if not mutator:is_enabled() and mutator:can_be_enabled() then
|
||||||
|
mutator:enable()
|
||||||
|
elseif not mutator:is_enabled() then
|
||||||
|
create_window(map_view)
|
||||||
|
end
|
||||||
elseif mutator:is_enabled() then
|
elseif mutator:is_enabled() then
|
||||||
mutator:disable()
|
mutator:disable()
|
||||||
else
|
|
||||||
create_window(map_view)
|
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
@ -61,27 +78,43 @@ local function create_window(map_view)
|
||||||
update_window_visibility(map_view)
|
update_window_visibility(map_view)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function reload_window()
|
||||||
|
local map_view = get_map_view()
|
||||||
|
if map_view and map_view.active then
|
||||||
|
create_window(map_view)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
vmf:hook("MapView.on_enter", function(func, self, ...)
|
vmf:hook("MapView.on_enter", function(func, self, ...)
|
||||||
func(self, ...)
|
func(self, ...)
|
||||||
print("on_enter")
|
print("on_enter")
|
||||||
|
|
||||||
|
vmf.sort_mutators()
|
||||||
|
vmf.disable_impossible_mutators()
|
||||||
vmf:pcall(function() create_window(self) end)
|
vmf:pcall(function() create_window(self) end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
vmf:hook("MapView.on_level_index_changed", function(func, self, ...)
|
vmf:hook("MapView.on_level_index_changed", function(func, self, ...)
|
||||||
func(self, ...)
|
func(self, ...)
|
||||||
print("on_level_index_changed")
|
print("on_level_index_changed")
|
||||||
|
|
||||||
|
vmf.disable_impossible_mutators()
|
||||||
vmf:pcall(function() create_window(self) end)
|
vmf:pcall(function() create_window(self) end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
vmf:hook("MapView.on_difficulty_index_changed", function(func, self, ...)
|
vmf:hook("MapView.on_difficulty_index_changed", function(func, self, ...)
|
||||||
func(self, ...)
|
func(self, ...)
|
||||||
print("on_difficulty_index_changed")
|
print("on_difficulty_index_changed")
|
||||||
|
|
||||||
|
vmf.disable_impossible_mutators()
|
||||||
vmf:pcall(function() create_window(self) end)
|
vmf:pcall(function() create_window(self) end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
vmf:hook("MapView.set_difficulty_stepper_index", function(func, self, ...)
|
vmf:hook("MapView.set_difficulty_stepper_index", function(func, self, ...)
|
||||||
func(self, ...)
|
func(self, ...)
|
||||||
print("set_difficulty_stepper_index")
|
print("set_difficulty_stepper_index")
|
||||||
|
|
||||||
|
vmf.disable_impossible_mutators()
|
||||||
vmf:pcall(function() create_window(self) end)
|
vmf:pcall(function() create_window(self) end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -121,16 +154,25 @@ vmf:hook("MapView.draw", function(func, self, input_service, gamepad_active, dt)
|
||||||
UIRenderer.draw_widget(ui_renderer, widget)
|
UIRenderer.draw_widget(ui_renderer, widget)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not window_opened then
|
if window_opened or not self.settings_button_widget.content.toggled then
|
||||||
if self.settings_button_widget.content.toggled then
|
for widget_name, widget in pairs(self.normal_settings_widgets) do
|
||||||
for widget_name, widget in pairs(self.advanced_settings_widgets) do
|
local skipped_widgets_keys = {
|
||||||
UIRenderer.draw_widget(ui_renderer, widget)
|
"stepper_level",
|
||||||
end
|
"level_preview",
|
||||||
else
|
"level_preview_text",
|
||||||
for widget_name, widget in pairs(self.normal_settings_widgets) do
|
"banner_level"
|
||||||
|
}
|
||||||
|
if not window_opened or not table.has_item(skipped_widgets_keys, widget_name) then
|
||||||
UIRenderer.draw_widget(ui_renderer, widget)
|
UIRenderer.draw_widget(ui_renderer, widget)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
if window_opened then
|
||||||
|
vmf:pcall(function() UIRenderer.draw_widget(ui_renderer, banner_level) end)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
for widget_name, widget in pairs(self.advanced_settings_widgets) do
|
||||||
|
UIRenderer.draw_widget(ui_renderer, widget)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
UIRenderer.draw_widget(ui_renderer, self.player_list_conuter_text_widget)
|
UIRenderer.draw_widget(ui_renderer, self.player_list_conuter_text_widget)
|
||||||
|
@ -174,3 +216,5 @@ vmf:hook("MapView.draw", function(func, self, input_service, gamepad_active, dt)
|
||||||
end
|
end
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
return reload_window, get_map_view
|
||||||
|
|
|
@ -38,7 +38,7 @@ local function set_lobby_data()
|
||||||
Managers.matchmaking.lobby:set_lobby_data(lobby_data)
|
Managers.matchmaking.lobby:set_lobby_data(lobby_data)
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_member_func( client_cookie)
|
local function get_member_func(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,"-"))))
|
||||||
|
|
|
@ -89,11 +89,14 @@ end
|
||||||
|
|
||||||
-- Disables mutators that cannot be enabled right now
|
-- Disables mutators that cannot be enabled right now
|
||||||
vmf.disable_impossible_mutators = function()
|
vmf.disable_impossible_mutators = function()
|
||||||
|
local disabled_mutators = {}
|
||||||
for _, mutator in pairs(mutators) do
|
for _, mutator in pairs(mutators) do
|
||||||
if mutator:is_enabled() and not mutator:can_be_enabled() then
|
if mutator:is_enabled() and not mutator:can_be_enabled() then
|
||||||
mutator:disable()
|
mutator:disable()
|
||||||
|
table.insert(disabled_mutators, mutator)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
return disabled_mutators
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,6 +104,7 @@ end
|
||||||
PRIVATE METHODS
|
PRIVATE METHODS
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
|
local update_mutators_view, get_map_view = dofile("scripts/mods/vmf/modules/mutators/gui")
|
||||||
local addDice, removeDice = dofile("scripts/mods/vmf/modules/mutators/dice")
|
local addDice, removeDice = dofile("scripts/mods/vmf/modules/mutators/dice")
|
||||||
local set_lobby_data = dofile("scripts/mods/vmf/modules/mutators/info")
|
local set_lobby_data = dofile("scripts/mods/vmf/modules/mutators/info")
|
||||||
|
|
||||||
|
@ -121,6 +125,71 @@ local function update_mutators_sequence(mutator_name, enable_these_after)
|
||||||
table.combine(mutators_sequence[mutator_name], enable_these_after)
|
table.combine(mutators_sequence[mutator_name], enable_these_after)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Checks if mutators are compatible both ways
|
||||||
|
local function is_compatible(mutator, other_mutator)
|
||||||
|
local config = mutator:get_config()
|
||||||
|
local name = mutator:get_name()
|
||||||
|
local other_config = other_mutator:get_config()
|
||||||
|
local other_name = other_mutator:get_name()
|
||||||
|
|
||||||
|
local incompatible_specifically = (
|
||||||
|
#config.incompatible_with > 0 and (
|
||||||
|
table.has_item(config.incompatible_with, other_name)
|
||||||
|
) or
|
||||||
|
#other_config.incompatible_with > 0 and (
|
||||||
|
table.has_item(other_config.incompatible_with, name)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
local compatible_specifically = (
|
||||||
|
#config.compatible_with > 0 and (
|
||||||
|
table.has_item(config.compatible_with, other_name)
|
||||||
|
) or
|
||||||
|
#other_config.compatible_with > 0 and (
|
||||||
|
table.has_item(other_config.compatible_with, name)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
local compatible
|
||||||
|
if incompatible_specifically then
|
||||||
|
compatible = false
|
||||||
|
elseif compatible_specifically then
|
||||||
|
compatible = true
|
||||||
|
elseif config.compatible_with_all or other_config.compatible_with_all then
|
||||||
|
compatible = true
|
||||||
|
elseif config.incompatible_with_all or other_config.incompatible_with_all then
|
||||||
|
compatible = false
|
||||||
|
else
|
||||||
|
compatible = true
|
||||||
|
end
|
||||||
|
|
||||||
|
return compatible
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Disables enabled mutators that aren't compatible with the specified
|
||||||
|
local function disable_incompatible_with(mutator)
|
||||||
|
local names = nil
|
||||||
|
for _, other_mutator in ipairs(mutators) do
|
||||||
|
if (
|
||||||
|
other_mutator ~= mutator and
|
||||||
|
other_mutator:is_enabled() and
|
||||||
|
not is_compatible(mutator, other_mutator)
|
||||||
|
) then
|
||||||
|
other_mutator:disable()
|
||||||
|
local name = other_mutator:get_config().title or other_mutator:get_name()
|
||||||
|
if names then
|
||||||
|
names = names .. " " .. name
|
||||||
|
else
|
||||||
|
names = name
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if names then
|
||||||
|
-- TODO: output this to the menu instead of chat
|
||||||
|
vmf:echo("These mutators are incompatible with " .. mutator:get_name() .. " and were disabled: " .. names)
|
||||||
|
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()
|
||||||
|
@ -157,6 +226,11 @@ local function set_mutator_state(mutator, state)
|
||||||
vmf.sort_mutators()
|
vmf.sort_mutators()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Disable mutators that aren't compatible
|
||||||
|
if state then
|
||||||
|
disable_incompatible_with(mutator)
|
||||||
|
end
|
||||||
|
|
||||||
local disabled_mutators = {}
|
local disabled_mutators = {}
|
||||||
local enable_these_after = mutators_sequence[mutator:get_name()]
|
local enable_these_after = mutators_sequence[mutator:get_name()]
|
||||||
|
|
||||||
|
@ -193,6 +267,9 @@ local function set_mutator_state(mutator, state)
|
||||||
disabled_mutators[j]:enable()
|
disabled_mutators[j]:enable()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
update_mutators_view()
|
||||||
|
|
||||||
print("---------")
|
print("---------")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -219,8 +296,7 @@ local function can_be_enabled(self)
|
||||||
local actual_difficulty = Managers.state and Managers.state.difficulty:get_difficulty()
|
local actual_difficulty = Managers.state and Managers.state.difficulty:get_difficulty()
|
||||||
local right_difficulty = not actual_difficulty or table.has_item(mutator_difficulties, actual_difficulty)
|
local right_difficulty = not actual_difficulty or table.has_item(mutator_difficulties, actual_difficulty)
|
||||||
|
|
||||||
local ingame_ui = Managers.matchmaking and Managers.matchmaking.ingame_ui
|
local map_view = get_map_view()
|
||||||
local map_view = ingame_ui and ingame_ui.views and ingame_ui.views.map_view
|
|
||||||
local map_view_active = map_view and map_view.active
|
local map_view_active = map_view and map_view.active
|
||||||
local right_unapplied_difficulty = false
|
local right_unapplied_difficulty = false
|
||||||
|
|
||||||
|
@ -257,7 +333,7 @@ VMFMod.register_as_mutator = function(self, config)
|
||||||
mutators_config[mod_name] = table.clone(default_config)
|
mutators_config[mod_name] = table.clone(default_config)
|
||||||
local _config = mutators_config[mod_name]
|
local _config = mutators_config[mod_name]
|
||||||
for k, _ in pairs(_config) do
|
for k, _ in pairs(_config) do
|
||||||
if config[k] then
|
if config[k] ~= nil then
|
||||||
_config[k] = config[k]
|
_config[k] = config[k]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -291,16 +367,18 @@ 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()
|
local disabled_mutators = vmf.disable_impossible_mutators()
|
||||||
|
if #disabled_mutators > 0 then
|
||||||
|
local message = "MUTATORS DISABLED DUE TO DIFFICULTY CHANGE:"
|
||||||
|
for _, mutator in ipairs(disabled_mutators) do
|
||||||
|
message = message .. " " .. mutator:get_config().title or mutator:get_name()
|
||||||
|
end
|
||||||
|
Managers.chat:send_system_chat_message(1, message, 0, true)
|
||||||
|
end
|
||||||
return func(self, difficulty)
|
return func(self, difficulty)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
||||||
--[[
|
|
||||||
GUI
|
|
||||||
]]--
|
|
||||||
dofile("scripts/mods/vmf/modules/mutators/gui")
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -320,87 +398,36 @@ dofile("scripts/mods/vmf/modules/mutators/gui")
|
||||||
--[[
|
--[[
|
||||||
Testing
|
Testing
|
||||||
--]]
|
--]]
|
||||||
local mutation = new_mod("mutation")
|
local mutator2 = new_mod("mutator2")
|
||||||
local deathwish = new_mod("deathwish")
|
|
||||||
local mutator3 = new_mod("mutator3")
|
local mutator3 = new_mod("mutator3")
|
||||||
local mutator555 = new_mod("mutator555")
|
local mutator555 = new_mod("mutator555")
|
||||||
local mutator_whatever = new_mod("mutator_whatever")
|
|
||||||
|
|
||||||
mutator555:register_as_mutator({
|
mutator555:register_as_mutator({
|
||||||
enable_after_these = {
|
compatible_with_all = true,
|
||||||
"mutation"
|
incompatible_with = {
|
||||||
},
|
"mutator2"
|
||||||
title = "mutator555"
|
}
|
||||||
})
|
})
|
||||||
mutator555:create_options({}, true, "mutator555", "mutator555 description")
|
mutator555:create_options({}, true, "mutator555", "mutator555 description")
|
||||||
mutator555.on_enabled = function() end
|
mutator555.on_enabled = function() end
|
||||||
mutator555.on_disabled = function() end
|
mutator555.on_disabled = function() end
|
||||||
|
|
||||||
|
|
||||||
deathwish:register_as_mutator({
|
|
||||||
enable_before_these = {
|
|
||||||
"mutator555",
|
|
||||||
"mutator3",
|
|
||||||
"mutation"
|
|
||||||
},
|
|
||||||
difficulties = {
|
|
||||||
"hardest"
|
|
||||||
},
|
|
||||||
title = "deathwish"
|
|
||||||
})
|
|
||||||
deathwish:create_options({}, true, "deathwish", "deathwish description")
|
|
||||||
deathwish.on_enabled = function()
|
|
||||||
print(tostring(Breeds.skaven_gutter_runner == Breeds.skaven_pack_master))
|
|
||||||
end
|
|
||||||
deathwish.on_disabled = function() end
|
|
||||||
|
|
||||||
|
|
||||||
-------------------------------
|
|
||||||
local breeds
|
|
||||||
mutation:register_as_mutator({
|
|
||||||
enable_after_these = {
|
|
||||||
"deathwish"
|
|
||||||
},
|
|
||||||
title = "mutation",
|
|
||||||
dice = {
|
|
||||||
grims = 5,
|
|
||||||
tomes = 1
|
|
||||||
}
|
|
||||||
})
|
|
||||||
mutation:create_options({}, true, "mutation", "mutation description")
|
|
||||||
mutation.on_enabled = function()
|
|
||||||
breeds = table.clone(Breeds)
|
|
||||||
Breeds.skaven_slave = Breeds.skaven_clan_rat
|
|
||||||
Breeds.skaven_clan_rat = Breeds.skaven_storm_vermin_commander
|
|
||||||
|
|
||||||
Breeds.skaven_gutter_runner = Breeds.skaven_rat_ogre
|
|
||||||
Breeds.skaven_pack_master = Breeds.skaven_rat_ogre
|
|
||||||
Breeds.skaven_poison_wind_globadier = Breeds.skaven_rat_ogre
|
|
||||||
Breeds.skaven_ratling_gunner = Breeds.skaven_rat_ogre
|
|
||||||
end
|
|
||||||
mutation.on_disabled = function(initial)
|
|
||||||
if not initial then Breeds = breeds end
|
|
||||||
end
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
mutator3:register_as_mutator({
|
mutator3:register_as_mutator({
|
||||||
enable_before_these = {
|
compatible_with_all = true,
|
||||||
|
incompatible_with = {
|
||||||
"mutator555"
|
"mutator555"
|
||||||
},
|
|
||||||
title = "mutator3",
|
|
||||||
dice = {
|
|
||||||
grims = 5,
|
|
||||||
tomes = 1,
|
|
||||||
bonus = 22
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
mutator3:create_options({}, true, "mutator3", "mutator3 description")
|
mutator3:create_options({}, true, "mutator3", "mutator3 description")
|
||||||
mutator3.on_enabled = function() end
|
mutator3.on_enabled = function() end
|
||||||
mutator3.on_disabled = function() end
|
mutator3.on_disabled = function() end
|
||||||
|
|
||||||
mutator_whatever:register_as_mutator({
|
mutator2:register_as_mutator({
|
||||||
title = "mutator_whatever"
|
difficulties = {
|
||||||
|
"hardest"
|
||||||
|
}
|
||||||
})
|
})
|
||||||
mutator_whatever:create_options({}, true, "mutator_whatever", "mutator_whatever description")
|
mutator2:create_options({}, true, "mutator2", "mutator2 description")
|
||||||
mutator_whatever.on_enabled = function() end
|
mutator2.on_enabled = function() end
|
||||||
mutator_whatever.on_disabled = function() end
|
mutator2.on_disabled = function() end
|
Loading…
Add table
Reference in a new issue