mutators: compatibility settings, some gui testing, fixes

This commit is contained in:
UnShame 2018-02-21 01:18:15 +03:00
parent 0d417798d8
commit 512b69cb9e
4 changed files with 166 additions and 92 deletions

View file

@ -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 = {}
} }

View file

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

View file

@ -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,"-"))))

View file

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