Files
barotrauma-localmods/Neurotrauma/Lua/Scripts/Client/configgui.lua
2025-03-31 13:19:47 +02:00

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)