243 lines
6.3 KiB
Lua
243 lines
6.3 KiB
Lua
--easysettings by Evil Factory
|
|
local easySettings = dofile(NT.Path .. "/Lua/Scripts/Client/easysettings.lua")
|
|
local MultiLineTextBox = dofile(NT.Path .. "/Lua/Scripts/Client/MultiLineTextBox.lua")
|
|
local GUIComponent = LuaUserData.CreateStatic("Barotrauma.GUIComponent")
|
|
local configUI
|
|
|
|
local function CommaStringToTable(str)
|
|
local tbl = {}
|
|
|
|
for word in string.gmatch(str, "([^,]+)") do
|
|
table.insert(tbl, word)
|
|
end
|
|
|
|
return tbl
|
|
end
|
|
|
|
--calculate difficulty
|
|
local function DetermineDifficulty()
|
|
local difficulty = 0
|
|
local defaultDifficulty = 0
|
|
local res = ""
|
|
|
|
for key, entry in pairs(NTConfig.Entries) do
|
|
if entry.difficultyCharacteristics then
|
|
local entryValue = entry.value
|
|
local entryValueDefault = entry.default
|
|
local diffMultiplier = 1
|
|
if entry.type == "bool" then
|
|
entryValue = HF.BoolToNum(entry.value)
|
|
entryValueDefault = HF.BoolToNum(entry.default)
|
|
end
|
|
if entry.difficultyCharacteristics.multiplier then
|
|
diffMultiplier = entry.difficultyCharacteristics.multiplier
|
|
end
|
|
|
|
defaultDifficulty = defaultDifficulty + entryValueDefault * diffMultiplier
|
|
difficulty = difficulty + math.min(entryValue * diffMultiplier, entry.difficultyCharacteristics.max or 1)
|
|
end
|
|
end
|
|
|
|
-- normalize to 10
|
|
difficulty = difficulty / defaultDifficulty * 10
|
|
|
|
if difficulty > 23 then
|
|
res = "Impossible"
|
|
elseif difficulty > 16 then
|
|
res = "Very hard"
|
|
elseif difficulty > 11 then
|
|
res = "Hard"
|
|
elseif difficulty > 8 then
|
|
res = "Normal"
|
|
elseif difficulty > 6 then
|
|
res = "Easy"
|
|
elseif difficulty > 4 then
|
|
res = "Very easy"
|
|
elseif difficulty > 2 then
|
|
res = "Barely different"
|
|
else
|
|
res = "Vanilla but sutures"
|
|
end
|
|
|
|
res = res .. " (" .. HF.Round(difficulty, 1) .. ")"
|
|
return res
|
|
end
|
|
|
|
--bulk of the GUI code
|
|
local function ConstructUI(parent)
|
|
local list = easySettings.BasicList(parent)
|
|
|
|
--info text
|
|
local userBlock = GUI.TextBlock(
|
|
GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform),
|
|
"Server config can be changed by owner or a client with manage settings permission. If the server doesn't allow writing into the config folder, then it must be edited manually.",
|
|
Color(200, 255, 255),
|
|
nil,
|
|
GUI.Alignment.Center,
|
|
true,
|
|
nil,
|
|
Color(0, 0, 0)
|
|
)
|
|
local difficultyBlock = GUI.TextBlock(
|
|
GUI.RectTransform(Vector2(1, 0.1), list.Content.RectTransform),
|
|
"",
|
|
Color(200, 255, 255),
|
|
nil,
|
|
GUI.Alignment.Center,
|
|
true,
|
|
nil,
|
|
Color(0, 0, 0)
|
|
)
|
|
|
|
--set difficulty text (why does this even exist in the first place)
|
|
local function OnChanged()
|
|
difficultyRate = "Calculated difficulty rating: " .. DetermineDifficulty()
|
|
difficultyBlock.Text = difficultyRate
|
|
end
|
|
OnChanged()
|
|
|
|
--empty space
|
|
--GUI.TextBlock(GUI.RectTransform(Vector2(0.2, 0.1), list.Content.RectTransform), "", Color(255,255,255), nil, GUI.Alignment.Center, true, nil, Color(0,0,0))
|
|
|
|
-- procedurally construct config UI
|
|
for key, entry in pairs(NTConfig.Entries) do
|
|
if entry.type == "float" then
|
|
-- scalar value
|
|
--grab range
|
|
local minrange = ""
|
|
local maxrange = ""
|
|
local count = 0
|
|
for _, rangegrab in pairs(entry.range) do
|
|
if count == 0 then
|
|
minrange = rangegrab
|
|
end
|
|
if count == 1 then
|
|
maxrange = rangegrab
|
|
end
|
|
count = count + 1
|
|
end
|
|
|
|
local rect = GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform)
|
|
local textBlock = GUI.TextBlock(
|
|
rect,
|
|
entry.name .. " (" .. minrange .. "-" .. maxrange .. ")",
|
|
Color(230, 230, 170),
|
|
nil,
|
|
GUI.Alignment.Center,
|
|
true,
|
|
nil,
|
|
Color(0, 0, 0)
|
|
)
|
|
if entry.description then
|
|
textBlock.ToolTip = entry.description
|
|
end
|
|
local scalar =
|
|
GUI.NumberInput(GUI.RectTransform(Vector2(1, 0.08), list.Content.RectTransform), NumberType.Float)
|
|
local key2 = key
|
|
scalar.valueStep = 0.1
|
|
scalar.MinValueFloat = 0
|
|
scalar.MaxValueFloat = 100
|
|
if entry.range then
|
|
scalar.MinValueFloat = entry.range[1]
|
|
scalar.MaxValueFloat = entry.range[2]
|
|
end
|
|
scalar.FloatValue = NTConfig.Get(key2, 1)
|
|
scalar.OnValueChanged = function()
|
|
NTConfig.Set(key2, scalar.FloatValue)
|
|
OnChanged()
|
|
end
|
|
elseif entry.type == "string" then
|
|
--user string input
|
|
local style = ""
|
|
--get custom style
|
|
if entry.style ~= nil then
|
|
style = " (" .. entry.style .. ")"
|
|
end
|
|
|
|
local rect = GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform)
|
|
local textBlock = GUI.TextBlock(
|
|
rect,
|
|
entry.name .. style,
|
|
Color(230, 230, 170),
|
|
nil,
|
|
GUI.Alignment.Center,
|
|
true,
|
|
nil,
|
|
Color(0, 0, 0)
|
|
)
|
|
if entry.description then
|
|
textBlock.ToolTip = entry.description
|
|
end
|
|
|
|
local stringinput = MultiLineTextBox(list.Content.RectTransform, "", entry.boxsize)
|
|
|
|
stringinput.Text = table.concat(entry.value, ",")
|
|
|
|
stringinput.OnTextChangedDelegate = function(textBox)
|
|
entry.value = CommaStringToTable(textBox.Text)
|
|
end
|
|
elseif entry.type == "bool" then
|
|
-- toggle
|
|
local rect = GUI.RectTransform(Vector2(1, 0.2), list.Content.RectTransform)
|
|
local toggle = GUI.TickBox(rect, entry.name)
|
|
if entry.description then
|
|
toggle.ToolTip = entry.description
|
|
end
|
|
local key2 = key
|
|
toggle.Selected = NTConfig.Get(key2, false)
|
|
toggle.OnSelected = function()
|
|
NTConfig.Set(key2, toggle.State == GUIComponent.ComponentState.Selected)
|
|
OnChanged()
|
|
end
|
|
elseif entry.type == "category" then
|
|
-- visual separation
|
|
GUI.TextBlock(
|
|
GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform),
|
|
entry.name,
|
|
Color(255, 255, 255),
|
|
nil,
|
|
GUI.Alignment.Center,
|
|
true,
|
|
nil,
|
|
Color(0, 0, 0)
|
|
)
|
|
end
|
|
end
|
|
|
|
--empty space as last tickbox was getting cutoff
|
|
GUI.TextBlock(
|
|
GUI.RectTransform(Vector2(1, 0.05), list.Content.RectTransform),
|
|
"",
|
|
Color(255, 255, 255),
|
|
nil,
|
|
GUI.Alignment.Center,
|
|
true,
|
|
nil,
|
|
Color(0, 0, 0)
|
|
)
|
|
|
|
if Game.IsMultiplayer and not Game.Client.HasPermission(ClientPermissions.ManageSettings) then
|
|
for guicomponent in list.GetAllChildren() do
|
|
guicomponent.enabled = false
|
|
end
|
|
end
|
|
|
|
return list
|
|
end
|
|
|
|
Networking.Receive("NT.ConfigUpdate", function(msg)
|
|
NTConfig.ReceiveConfig(msg)
|
|
local parent = configUI.Parent.Parent
|
|
configUI.RectTransform.Parent = nil
|
|
configUI = nil
|
|
configUI = ConstructUI(parent)
|
|
end)
|
|
|
|
easySettings.AddMenu("Neurotrauma", function(parent)
|
|
if Game.IsMultiplayer then
|
|
local msg = Networking.Start("NT.ConfigRequest")
|
|
Networking.Send(msg)
|
|
end
|
|
configUI = ConstructUI(parent)
|
|
end)
|