mutators: dice, info, default_config
This commit is contained in:
parent
b7f47297b2
commit
8f3a801e3c
6 changed files with 257 additions and 13 deletions
|
@ -20,4 +20,5 @@ lua = [
|
||||||
"scripts/mods/vmf/modules/debug/*"
|
"scripts/mods/vmf/modules/debug/*"
|
||||||
"scripts/mods/vmf/modules/gui/*"
|
"scripts/mods/vmf/modules/gui/*"
|
||||||
"scripts/mods/vmf/modules/options_menu/*"
|
"scripts/mods/vmf/modules/options_menu/*"
|
||||||
|
"scripts/mods/vmf/modules/mutators/*"
|
||||||
]
|
]
|
|
@ -0,0 +1,21 @@
|
||||||
|
return {
|
||||||
|
dice = {
|
||||||
|
grims = 0,
|
||||||
|
tomes = 0,
|
||||||
|
bonus = 0
|
||||||
|
},
|
||||||
|
server_name = "",
|
||||||
|
title = "default_title",
|
||||||
|
--short_title = "",
|
||||||
|
difficulties = {
|
||||||
|
"easy",
|
||||||
|
"normal",
|
||||||
|
"hard",
|
||||||
|
"harder",
|
||||||
|
"hardest",
|
||||||
|
|
||||||
|
"survival_hard",
|
||||||
|
"survival_harder",
|
||||||
|
"survival_hardest"
|
||||||
|
}
|
||||||
|
}
|
66
vmf_source/scripts/mods/vmf/modules/mutators/dice.lua
Normal file
66
vmf_source/scripts/mods/vmf/modules/mutators/dice.lua
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
local vmf = get_mod("VMF")
|
||||||
|
|
||||||
|
local missions = {
|
||||||
|
"bonus_dice_hidden_mission",
|
||||||
|
"tome_bonus_mission",
|
||||||
|
"grimoire_hidden_mission"
|
||||||
|
}
|
||||||
|
|
||||||
|
local num_dice_per_mission = {
|
||||||
|
bonus_dice_hidden_mission = 0,
|
||||||
|
tome_bonus_mission = 0,
|
||||||
|
grimoire_hidden_mission = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
vmf:hook("GameModeManager.complete_level", function(func, self)
|
||||||
|
local num_dice = 0
|
||||||
|
local max_dice = 7
|
||||||
|
local mission_system = Managers.state.entity:system("mission_system")
|
||||||
|
local active_mission = mission_system.active_missions
|
||||||
|
|
||||||
|
for _, mission in ipairs(missions) do
|
||||||
|
for _ = 1, num_dice_per_mission[mission] do
|
||||||
|
mission_system:request_mission(mission, nil, Network.peer_id())
|
||||||
|
mission_system:update_mission(mission, true, nil, Network.peer_id(), nil, true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for name, obj in pairs(active_mission) do
|
||||||
|
if table.has_item(missions, name) then
|
||||||
|
num_dice = num_dice + obj.current_amount
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, mission in ipairs(missions) do
|
||||||
|
if active_mission[mission] then
|
||||||
|
for _ = 1, active_mission[mission].current_amount do
|
||||||
|
if num_dice > max_dice then
|
||||||
|
mission_system:request_mission(mission, nil, Network.peer_id())
|
||||||
|
mission_system:update_mission(mission, false, nil, Network.peer_id(), nil, true)
|
||||||
|
num_dice = num_dice - 1
|
||||||
|
else break end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if num_dice <= max_dice then break end
|
||||||
|
end
|
||||||
|
|
||||||
|
return func(self)
|
||||||
|
end)
|
||||||
|
|
||||||
|
local function adjustDice(grims, tomes, bonus, multiplier)
|
||||||
|
if grims then num_dice_per_mission.grimoire_hidden_mission = num_dice_per_mission.grimoire_hidden_mission + grims * multiplier end
|
||||||
|
if tomes then num_dice_per_mission.tome_bonus_mission = num_dice_per_mission.tome_bonus_mission + tomes * multiplier end
|
||||||
|
if bonus then num_dice_per_mission.bonus_dice_hidden_mission = num_dice_per_mission.bonus_dice_hidden_mission + bonus * multiplier end
|
||||||
|
end
|
||||||
|
|
||||||
|
local addDice = function(dice)
|
||||||
|
dice = dice or {}
|
||||||
|
adjustDice(dice.grims, dice.tomes, dice.bonus, 1)
|
||||||
|
end
|
||||||
|
|
||||||
|
local removeDice = function(dice)
|
||||||
|
dice = dice or {}
|
||||||
|
adjustDice(dice.grims, dice.tomes, dice.bonus, -1)
|
||||||
|
end
|
||||||
|
|
||||||
|
return addDice, removeDice
|
79
vmf_source/scripts/mods/vmf/modules/mutators/info.lua
Normal file
79
vmf_source/scripts/mods/vmf/modules/mutators/info.lua
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
local vmf = get_mod("VMF")
|
||||||
|
local mutators = vmf.mutators
|
||||||
|
|
||||||
|
local function get_enabled_mutators_names(short)
|
||||||
|
local name = ""
|
||||||
|
for _, mutator in ipairs(mutators) do
|
||||||
|
local config = mutator:get_config()
|
||||||
|
if mutator:is_enabled() then
|
||||||
|
name = name .. " " .. (short and config.short_title or config.title)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return name
|
||||||
|
end
|
||||||
|
|
||||||
|
local function set_lobby_data()
|
||||||
|
|
||||||
|
if not Managers.matchmaking then return end
|
||||||
|
|
||||||
|
local name = get_enabled_mutators_names(true)
|
||||||
|
|
||||||
|
local default_name = LobbyAux.get_unique_server_name()
|
||||||
|
if name then
|
||||||
|
name = "||" .. name .. "|| " .. default_name
|
||||||
|
else
|
||||||
|
name = default_name
|
||||||
|
end
|
||||||
|
|
||||||
|
local lobby_data = Managers.matchmaking.lobby:get_stored_lobby_data()
|
||||||
|
lobby_data.unique_server_name = name
|
||||||
|
|
||||||
|
Managers.matchmaking.lobby:set_lobby_data(lobby_data)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function get_member_func( client_cookie)
|
||||||
|
local peer_id = tostring(client_cookie)
|
||||||
|
for _ = 1, 3 do
|
||||||
|
peer_id = string.sub(peer_id, 1 + tonumber(tostring(string.find(peer_id,"-"))))
|
||||||
|
end
|
||||||
|
peer_id = string.sub(peer_id, 2)
|
||||||
|
peer_id = string.reverse(peer_id)
|
||||||
|
peer_id = string.sub(peer_id, 2)
|
||||||
|
peer_id = string.reverse(peer_id)
|
||||||
|
|
||||||
|
return function()
|
||||||
|
for _, v in ipairs(Managers.matchmaking.lobby:members():get_members()) do
|
||||||
|
if v == peer_id then
|
||||||
|
return {v}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return Managers.matchmaking.lobby:members():get_members()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
vmf:hook("IngamePlayerListUI.set_difficulty_name", function(func, self, name)
|
||||||
|
local mutators_name = get_enabled_mutators_names(true)
|
||||||
|
if mutators_name then
|
||||||
|
name = name .. " " .. mutators_name
|
||||||
|
end
|
||||||
|
self.headers.content.game_difficulty = name
|
||||||
|
end)
|
||||||
|
|
||||||
|
vmf:hook("MatchmakingStateHostGame.host_game", function(func, self, ...)
|
||||||
|
func(self, ...)
|
||||||
|
set_lobby_data()
|
||||||
|
end)
|
||||||
|
|
||||||
|
vmf:hook("MatchmakingManager.rpc_matchmaking_request_join_lobby", function(func, self, sender, client_cookie, host_cookie, lobby_id, friend_join)
|
||||||
|
local name = get_enabled_mutators_names(false)
|
||||||
|
if name then
|
||||||
|
local message = "[Automated message] This lobby has the following difficulty mod active : " .. name
|
||||||
|
vmf:hook("Managers.chat.channels[1].members_func", get_member_func(client_cookie))
|
||||||
|
Managers.chat:send_system_chat_message(1, message, 0, true)
|
||||||
|
vmf:hook_remove("Managers.chat.channels[1].members_func")
|
||||||
|
end
|
||||||
|
func(self, sender, client_cookie, host_cookie, lobby_id, friend_join)
|
||||||
|
end)
|
||||||
|
|
||||||
|
return set_lobby_data
|
|
@ -1,8 +1,13 @@
|
||||||
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
|
||||||
-- This is populated via VMFMod.register_as_mutator
|
-- This is populated via VMFMod.register_as_mutator
|
||||||
local mutators = {}
|
local mutators = {}
|
||||||
|
vmf.mutators = mutators
|
||||||
|
|
||||||
|
local mutators_config = {}
|
||||||
|
local default_config = dofile("scripts/mods/vmf/modules/mutators/default_config")
|
||||||
|
|
||||||
-- This lists mutators and which ones should be enabled after them
|
-- This lists mutators and which ones should be enabled after them
|
||||||
-- This is populated via VMFMod.register_as_mutator
|
-- This is populated via VMFMod.register_as_mutator
|
||||||
|
@ -23,6 +28,9 @@ local mutators_sorted = false
|
||||||
PRIVATE METHODS
|
PRIVATE METHODS
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
|
local addDice, removeDice = dofile("scripts/mods/vmf/modules/mutators/dice")
|
||||||
|
local set_lobby_data = dofile("scripts/mods/vmf/modules/mutators/info")
|
||||||
|
|
||||||
-- Adds mutator names from enable_these_after to the list of mutators that should be enabled after the mutator_name
|
-- 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)
|
local function update_mutators_sequence(mutator_name, enable_these_after)
|
||||||
if not mutators_sequence[mutator_name] then
|
if not mutators_sequence[mutator_name] then
|
||||||
|
@ -82,7 +90,7 @@ local function sort_mutators()
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
|
||||||
numIter = numIter + 1
|
numIter = numIter + 1
|
||||||
if numIter > maxIter then
|
if numIter > maxIter then
|
||||||
vmf:error("Mutators: too many iterations. Check for loops in 'enable_before_these'/'enable_after_these'.")
|
vmf:error("Mutators: too many iterations. Check for loops in 'enable_before_these'/'enable_after_these'.")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -97,12 +105,33 @@ local function sort_mutators()
|
||||||
-- /LOG --
|
-- /LOG --
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Enables/disables mutator while preserving the sequence in which they were enabled
|
local function mutator_can_be_enabled(mutator)
|
||||||
local function set_mutator_state(self, state)
|
return (not Managers.state or not Managers.state.difficulty:get_difficulty()) or table.has_item(mutator:get_config().difficulties, Managers.state.difficulty:get_difficulty())
|
||||||
|
end
|
||||||
|
|
||||||
local i = table.index_of(mutators, self)
|
local function on_enabled(mutator)
|
||||||
|
local config = mutator:get_config()
|
||||||
|
addDice(config.dice)
|
||||||
|
set_lobby_data()
|
||||||
|
end
|
||||||
|
|
||||||
|
local function on_disabled(mutator)
|
||||||
|
local config = mutator:get_config()
|
||||||
|
removeDice(config.dice)
|
||||||
|
set_lobby_data()
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Enables/disables mutator while preserving the sequence in which they were enabled
|
||||||
|
local function set_mutator_state(mutator, state)
|
||||||
|
|
||||||
|
local i = table.index_of(mutators, mutator)
|
||||||
if i == nil then
|
if i == nil then
|
||||||
self:error("Mutator isn't in the list")
|
mutator:error("Mutator isn't in the list")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
if state and not mutator_can_be_enabled(mutator) then
|
||||||
|
mutator:error("Can't enable mutator - incorrect difficulty")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -112,7 +141,7 @@ local function set_mutator_state(self, state)
|
||||||
end
|
end
|
||||||
|
|
||||||
local disabled_mutators = {}
|
local disabled_mutators = {}
|
||||||
local enable_these_after = mutators_sequence[self:get_name()]
|
local enable_these_after = mutators_sequence[mutator:get_name()]
|
||||||
|
|
||||||
-- Disable mutators that were and are required to be enabled after the current one
|
-- Disable mutators that were and are required to be enabled after the current one
|
||||||
-- This will be recursive so that if mutator2 requires mutator3 to be enabled after it, mutator3 will be disabled before mutator2
|
-- This will be recursive so that if mutator2 requires mutator3 to be enabled after it, mutator3 will be disabled before mutator2
|
||||||
|
@ -130,11 +159,13 @@ local function set_mutator_state(self, state)
|
||||||
-- Enable/disable current mutator
|
-- Enable/disable current mutator
|
||||||
-- We're calling methods on the class object because we've overwritten them on the current one
|
-- We're calling methods on the class object because we've overwritten them on the current one
|
||||||
if state then
|
if state then
|
||||||
print("Enabled ", self:get_name(), "!")
|
print("Enabled ", mutator:get_name(), "!")
|
||||||
VMFMod.enable(self)
|
VMFMod.enable(mutator)
|
||||||
|
on_enabled(mutator)
|
||||||
else
|
else
|
||||||
print("Disabled ", self:get_name(), "!")
|
print("Disabled ", mutator:get_name(), "!")
|
||||||
VMFMod.disable(self)
|
VMFMod.disable(mutator)
|
||||||
|
on_disabled(mutator)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Re-enable disabled mutators
|
-- Re-enable disabled mutators
|
||||||
|
@ -158,13 +189,16 @@ local function disable_mutator(self)
|
||||||
vmf:pcall(function() set_mutator_state(self, false) end)
|
vmf:pcall(function() set_mutator_state(self, false) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_config(self)
|
||||||
|
return mutators_config[self:get_name()]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
PUBLIC METHODS
|
PUBLIC METHODS
|
||||||
]]--
|
]]--
|
||||||
|
|
||||||
-- Turns a mod into a mutator
|
-- Turns a mod into a mutator
|
||||||
-- For now all it does is creates a sequence in which they need to be enabled/disabled
|
|
||||||
VMFMod.register_as_mutator = function(self, config)
|
VMFMod.register_as_mutator = function(self, config)
|
||||||
if not config then config = {} end
|
if not config then config = {} end
|
||||||
|
|
||||||
|
@ -177,6 +211,16 @@ VMFMod.register_as_mutator = function(self, config)
|
||||||
|
|
||||||
table.insert(mutators, self)
|
table.insert(mutators, self)
|
||||||
|
|
||||||
|
-- Save config
|
||||||
|
mutators_config[mod_name] = table.clone(default_config)
|
||||||
|
local _config = mutators_config[mod_name]
|
||||||
|
for k, _ in pairs(_config) do
|
||||||
|
if config[k] then
|
||||||
|
_config[k] = config[k]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if _config.short_title == "" then _config.short_title = nil end
|
||||||
|
|
||||||
if config.enable_before_these then
|
if config.enable_before_these then
|
||||||
update_mutators_sequence(mod_name, config.enable_before_these)
|
update_mutators_sequence(mod_name, config.enable_before_these)
|
||||||
end
|
end
|
||||||
|
@ -190,12 +234,42 @@ VMFMod.register_as_mutator = function(self, config)
|
||||||
self.enable = enable_mutator
|
self.enable = enable_mutator
|
||||||
self.disable = disable_mutator
|
self.disable = disable_mutator
|
||||||
|
|
||||||
|
self.get_config = get_config
|
||||||
|
|
||||||
mutators_sorted = false
|
mutators_sorted = false
|
||||||
|
|
||||||
-- Always init in the off state
|
-- Always init in the off state
|
||||||
self:init_state(false)
|
self:init_state(false)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
HOOKS
|
||||||
|
]]--
|
||||||
|
vmf:hook("DifficultyManager.set_difficulty", function(func, self, difficulty)
|
||||||
|
for _, mutator in ipairs(mutators) do
|
||||||
|
if mutator:is_enabled() and not mutator_can_be_enabled(mutator:get_config()) then
|
||||||
|
mutator:disable()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return func(self, difficulty)
|
||||||
|
end)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--[[
|
--[[
|
||||||
Testing
|
Testing
|
||||||
|
@ -221,10 +295,13 @@ deathwish:register_as_mutator({
|
||||||
"mutator555",
|
"mutator555",
|
||||||
"mutator3",
|
"mutator3",
|
||||||
"mutation"
|
"mutation"
|
||||||
|
},
|
||||||
|
difficulties = {
|
||||||
|
"hardest"
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
deathwish:create_options({}, true, "deathwish", "deathwish description")
|
deathwish:create_options({}, true, "deathwish", "deathwish description")
|
||||||
deathwish.on_enabled = function()
|
deathwish.on_enabled = function()
|
||||||
print(tostring(Breeds.skaven_gutter_runner == Breeds.skaven_pack_master))
|
print(tostring(Breeds.skaven_gutter_runner == Breeds.skaven_pack_master))
|
||||||
end
|
end
|
||||||
deathwish.on_disabled = function() end
|
deathwish.on_disabled = function() end
|
||||||
|
|
|
@ -21,7 +21,7 @@ return {
|
||||||
dofile("scripts/mods/vmf/modules/options_menu/vmf_options_view")
|
dofile("scripts/mods/vmf/modules/options_menu/vmf_options_view")
|
||||||
dofile("scripts/mods/vmf/modules/vmf_options")
|
dofile("scripts/mods/vmf/modules/vmf_options")
|
||||||
|
|
||||||
dofile("scripts/mods/vmf/modules/mutators")
|
dofile("scripts/mods/vmf/modules/mutators/mutators")
|
||||||
|
|
||||||
object.vmf = get_mod("VMF")
|
object.vmf = get_mod("VMF")
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue