wea.parse.chance: add weight mode

This commit is contained in:
Starbeamrainbowlabs 2021-05-11 22:12:04 +01:00
parent 040d7fbfde
commit 81f3a87180
Signed by: sbrl
GPG key ID: 1BE5172E637709C2
2 changed files with 8 additions and 3 deletions

View file

@ -1,12 +1,15 @@
--- Parses a chance value, and returns the 1-in-N value thereof. --- Parses a chance value, and returns the 1-in-N value thereof.
-- @param str string The string to parse. -- @param str string The string to parse.
-- @param invert_percent string The operation mode. Valid modes: "1-in-n" (default), "weight". "1-in-n" refers to a 1-in-N chance of something happening (lower numbers mean greater likelihood). "weight", on the other hand, is instead a weighting that something will happen (higher numbers mean a greater likelihood).
-- @returns number|nil The 1-in-N chance if parsing was successful, otherwise nil. -- @returns number|nil The 1-in-N chance if parsing was successful, otherwise nil.
function worldeditadditions.parse.chance(str) function worldeditadditions.parse.chance(str, mode)
if not mode then mode = "1-in-n" end
if tonumber(str) ~= nil then return tonumber(str) end if tonumber(str) ~= nil then return tonumber(str) end
if str:sub(#str) == "%" then if str:sub(#str) == "%" then
local result = tonumber(str:sub(1, #str-1)) local result = tonumber(str:sub(1, #str-1))
if not result then return nil end if not result then return nil end
if mode == "weight" then result = 100 - result end
return 1 / (result / 100) -- Convert percentage to 1-in-N chance return 1 / (result / 100) -- Convert percentage to 1-in-N chance
end end
return nil return nil

View file

@ -27,7 +27,7 @@ function worldeditadditions.parse.weighted_nodes(parts, as_list, func_normalise)
mode = MODE_EITHER mode = MODE_EITHER
elseif mode == MODE_EITHER then elseif mode == MODE_EITHER then
-- print("mode: either"); -- print("mode: either");
local chance = tonumber(part) local chance = worldeditadditions.parse.chance(part, "weight")
if not chance then if not chance then
-- print("not a chance, trying a node name") -- print("not a chance, trying a node name")
local node_name local node_name
@ -59,5 +59,7 @@ function worldeditadditions.parse.weighted_nodes(parts, as_list, func_normalise)
else result[last_node_name] = 1 end else result[last_node_name] = 1 end
end end
print(worldeditadditions.format.map(result, " "))
return true, result return true, result
end end