From bad825e64e5038c380daee6b3e74f2cda26d3982 Mon Sep 17 00:00:00 2001 From: Kaedenn Date: Sun, 7 Apr 2024 16:06:30 -0800 Subject: [PATCH] *MASSIVE* update: shift_query 3.0 Fixed improper range display in the settings window Added force-update whenever any setting (except enable) is changed Added support for colored output Added rare material highlighting Added configurable expansion of multi-material shifts Added "flask resolving", which accurately lists past shifts Added countdown timer to window title Added sensible feedback if imgui isn't available --- Makefile.sh | 2 +- build/ui.png | Bin 0 -> 142367 bytes files/common.lua | 89 +++--- files/constants.lua | 10 + files/materials.lua | 74 ++++- files/query.lua | 87 ++++-- init.lua | 185 +++++++---- lib/feedback.lua | 65 +++- lib/nxml.lua | 742 ++++++++++++++++++++++++++++++++++++++++++++ mod_description.txt | 18 ++ mod_id.txt | 2 +- settings.lua | 128 +++++--- shift_query.vdf | 10 + 13 files changed, 1211 insertions(+), 201 deletions(-) create mode 100644 build/ui.png create mode 100644 lib/nxml.lua create mode 100644 mod_description.txt create mode 100644 shift_query.vdf diff --git a/Makefile.sh b/Makefile.sh index 0aa1054..f1234dc 100755 --- a/Makefile.sh +++ b/Makefile.sh @@ -231,7 +231,6 @@ fi info "Detected differences between local and deployed directories" if [[ "$ACTION" == "cp" ]]; then - info "Copying . to $DEST_DIR" # Should we create a backup of the deployed directory? if [[ -n "${BACKUP:-}" ]]; then @@ -244,6 +243,7 @@ if [[ "$ACTION" == "cp" ]]; then fi fi + info "Copying . to $DEST_DIR" # Deploy this mod to the destination directory if dry checked rm -r "$DEST_DIR"; then mkdir "$DEST_DIR" 2>/dev/null diff --git a/build/ui.png b/build/ui.png new file mode 100644 index 0000000000000000000000000000000000000000..350668dad1e53f1835d3d9e41d060a3ae460fd75 GIT binary patch literal 142367 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

D&;6LQO#&$M5}!@M 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 pending/previous shift(s)" message +--[[ Format a " pending/previous shift(s)" message ]] function f_shift_count(num, label) local prefix = tostring(num) local suffix = "shifts" @@ -41,12 +64,12 @@ function f_shift_count(num, label) return ("%s %s %s"):format(prefix, label, suffix) end --- Returns true if logging is enabled, false otherwise. +--[[ Returns true if logging is enabled, false otherwise. ]] function q_logging() return GlobalsGetValue(K_CONFIG_LOG_ENABLE, FLAG_OFF) ~= FLAG_OFF end --- Enable or disable logging +--[[ Enable or disable logging ]] function q_set_logging(enable) if enable then GlobalsSetValue(K_CONFIG_LOG_ENABLE, FLAG_ON) @@ -55,16 +78,17 @@ function q_set_logging(enable) q_log("Disabling debugging") GlobalsSetValue(K_CONFIG_LOG_ENABLE, FLAG_OFF) end + q_force_update() end --- Display a logging message if logging is enabled. +--[[ Display a logging message if logging is enabled. ]] function q_log(msg) if q_logging() then q_print("DEBUG: " .. msg) end end --- Display a formatted logging message if logging is enabled. +--[[ Display a formatted logging message if logging is enabled. ]] function q_logf(msg, ...) if q_logging() then q_log(msg:format(...)) @@ -80,6 +104,8 @@ end -- The cache allows for these values to appear instantly. Cache entries -- are stored when setting a value and cleared once that value is -- properly stored. +-- +-- FIXME: Just use ModSettingGetNextValue; this is unnecessary --]] local config_cache = {} @@ -107,6 +133,9 @@ function q_setting_set(setting, value) new_value = value } ModSettingSetNextValue(MOD_ID .. "." .. setting, value, false) + if old_value ~= value then + q_force_update() + end end -- Get the "enable gui?" setting's value @@ -123,24 +152,6 @@ function q_disable_gui() q_setting_set(SETTING_ENABLE, false) end --- Clear the logging global if set -function logger_clear() - local value = GlobalsGetValue("shift_query.logging") or "" - if value ~= "" then - GlobalsSetValue("shift_query.logging", "") - end -end - --- Add a component to the logging global -function logger_add(piece) - local old_log = GlobalsGetValue("shift_query.logging") or "" - local new_log = tostring(piece) - if old_log ~= "" then - new_log = old_log .. "\n" .. new_log - end - GlobalsSetValue("shift_query.logging", new_log) -end - -- Localize a material, either "name" or "$mat_name". function localize_material(material) local matid = CellFactory_GetType(material) @@ -148,11 +159,7 @@ function localize_material(material) if matid ~= -1 then mname = CellFactory_GetUIName(matid) end - local name = GameTextGetTranslatedOrNot(mname) - if not name then -- handle nil - return "" - end - return name + return GameTextGetTranslatedOrNot(mname) or "" end -- Localize a material based on the mode argument @@ -177,13 +184,13 @@ function localize_material_via(material, loc_mode) return ("[%s]"):format(material) end --- Possibly localize a material based on q_logging, localize setting +--[[ Possibly localize a material based on q_logging, localize setting ]] function maybe_localize_material(material) local loc_mode = q_setting_get(SETTING_LOCALIZE) return localize_material_via(material, loc_mode) end --- Format a material with the possibility of including a flask. +--[[ Format a material with the possibility of including a flask. ]] function flask_or(material, use_flask) local logging = q_logging() local mname = maybe_localize_material(material) @@ -196,7 +203,7 @@ function flask_or(material, use_flask) return mname end --- Format a fungal shift. Returns a table of pairs of strings. +--[[ Format a fungal shift. Returns a table of pairs of strings. ]] function format_shift(shift) if not shift then return {{"invalid shift", "invalid shift"}} end local source = shift.from @@ -210,23 +217,23 @@ function format_shift(shift) if not target then s_target = "no data" end - return {s_source, s_target} + return {{s_source, s_target}} end local s_target = flask_or(target.material, target.flask) local material_pairs = {} - if source.name_material then + local want_expand = q_setting_get(SETTING_EXPAND) + if want_expand == EXPAND_ONE and source.name_material then local s_source = flask_or(source.name_material, source.flask) table.insert(material_pairs, {s_source, s_target}) else - for index, material in ipairs(source.materials) do - local s_source = flask_or(material, source.flask) - table.insert(material_pairs, {s_source, s_target}) - end + local s_source = table.concat(source.materials, ", ") + s_source = flask_or(s_source, source.flask) + table.insert(material_pairs, {s_source, s_target}) end return material_pairs end --- Format a number relative to its current value +--[[ Format a number relative to its current value ]] function format_relative(curr, index) local term = "invalid" if index == curr then @@ -244,7 +251,7 @@ function format_relative(curr, index) return term end --- Format a duration of time +--[[ Format a duration of time ]] function format_duration(nsecs) local total = math.abs(nsecs) local hours = math.floor(total / 60 / 60) diff --git a/files/constants.lua b/files/constants.lua index 67522f8..332979c 100644 --- a/files/constants.lua +++ b/files/constants.lua @@ -5,6 +5,8 @@ MAX_SHIFTS = 20 -- the game implicitly supports only 20 shifts ALL_SHIFTS = -1 -- values < 0 mean "all" +CUTOFF_RARE = 0.2 -- shifts with this probability or lower are "rare" + FLAG_ON = "1" FLAG_OFF = "0" @@ -15,16 +17,24 @@ SETTING_PREVIOUS = "previous_count" SETTING_NEXT = "next_count" SETTING_LOCALIZE = "localize" SETTING_ENABLE = "enable" +SETTING_EXPAND = "expand_from" SETTING_APLC = "include_aplc" +SETTING_REAL = "flask_real" CONF_PREVIOUS = ("%s.%s"):format(MOD_ID, SETTING_PREVIOUS) CONF_NEXT = ("%s.%s"):format(MOD_ID, SETTING_NEXT) CONF_LOCALIZE = ("%s.%s"):format(MOD_ID, SETTING_LOCALIZE) CONF_ENABLE = ("%s.%s"):format(MOD_ID, SETTING_ENABLE) +CONF_EXPAND = ("%s.%s"):format(MOD_ID, SETTING_EXPAND) CONF_APLC = ("%s.%s"):format(MOD_ID, SETTING_APLC) +CONF_REAL = ("%s.%s"):format(MOD_ID, SETTING_REAL) --[[ Material formatting rules ]] FORMAT_INTERNAL = "internal" FORMAT_LOCALE = "locale" FORMAT_BOTH = "both" +--[[ Source material expansion rules ]] +EXPAND_ONE = "one" +EXPAND_ALL = "all" + diff --git a/files/materials.lua b/files/materials.lua index 7d3cd57..3484567 100644 --- a/files/materials.lua +++ b/files/materials.lua @@ -1,7 +1,18 @@ -- Fungal Query materials --- The following appears to crash Noita (Dec 21, release) ---dofile("data/scripts/magic/fungal_shift.lua") +--[[ NOTE: +-- While it would be easy just to have +dofile("data/scripts/magic/fungal_shift.lua") +-- and expose those values here; that script (as of Feb 14 2024) crashes Noita +-- if executed during mod initialization. This is because the script attempts +-- to validate the material tables via the CellFactory (CellFactory_GetType) +-- the instant the script is executed. The CellFactory is not initialized by +-- this point and thus the game crashes. +-- +-- To work around this, this file provides two solutions: +-- 1. Load data/scripts/magic/fungal_shift.lua only when requested, and +-- 2. Provide hard-coded material tables if the native ones are unavailable. +--]] -- The tables below are taken directly from Noita's own fungal_shift.lua -- script, with some formatting for good measure. Note that changes to @@ -90,19 +101,23 @@ MATERIALS_TO_COPY = { { probability = 0.01, material = "cheese_static" }, } +function get_material_tables() + dofile("data/scripts/magic/fungal_shift.lua") + if materials_from and materials_to then + return materials_from, materials_to + end + GamePrint("shift_query - unable to get material tables; using local versions") + return MATERIALS_FROM_COPY, MATERIALS_TO_COPY +end + return { --[[ Obtain the materials_from table. -- This first attempts to determine the table directly from Noita, and then -- falls back to the table defined above. --]] get_materials_from = function() - dofile("data/scripts/magic/fungal_shift.lua") - -- luacheck: globals materials_from materials_to - if materials_from and materials_to then - return materials_from - end - GamePrint("shift_query - unable to get source material table; using local copy") - return MATERIALS_FROM_COPY + local materials_from, materials_to = get_material_tables() + return materials_from end, --[[ Obtain the materials_to table. @@ -110,13 +125,42 @@ return { -- falls back to the table defined above. --]] get_materials_to = function() - dofile("data/scripts/magic/fungal_shift.lua") - -- luacheck: globals materials_from materials_to - if materials_from and materials_to then - return materials_to + local materials_from, materials_to = get_material_tables() + return materials_to + end, + + --[[ True if the given shift source is considered "rare" ]] + is_rare_source = function(material, cutoff) + if type(cutoff) ~= "number" then + cutoff = 0.2 + end + local materials_from, materials_to = get_material_tables() + for _, entry in ipairs(materials_from) do + if entry.probability <= cutoff then + for _, shift_mat in ipairs(entry.materials) do + if shift_mat == material then + return true + end + end + end + end + return false + end, + + --[[ True if the given shift destination is considered "rare" ]] + is_rare_target = function(material, cutoff) + if type(cutoff) ~= "number" then + cutoff = 0.2 + end + local materials_from, materials_to = get_material_tables() + for _, entry in ipairs(materials_to) do + if entry.probability <= cutoff then + if entry.material == material then + return true + end + end end - GamePrint("shift_query - unable to get source material table; using local copy") - return MATERIALS_TO_COPY + return false end, --[[ Material tables ]] diff --git a/files/query.lua b/files/query.lua index c8fb79b..28e8394 100644 --- a/files/query.lua +++ b/files/query.lua @@ -1,5 +1,12 @@ --[[ --- Shift Query mod core logic +-- Shift Query core logic +-- +-- Nomenclature used below: +-- +-- shift-info: table +-- flask: boolean +-- materials: {string...} +-- name_material: string (optional) --]] -- luacheck: globals pick_random_from_table_weighted random_nexti random_create @@ -12,44 +19,72 @@ COOLDOWN = 60*60*5 -- post shift cooldown; five minutes -- Get the current shift iteration function get_curr_iter() - return tonumber(GlobalsGetValue("fungal_shift_iteration", "0")) + return tonumber(GlobalsGetValue("fungal_shift_iteration", "0")) end -- Get the number of frames since the previous shift; -1 if none function get_last_shift_frame() - return tonumber(GlobalsGetValue("fungal_shift_last_frame", "-1")) + return tonumber(GlobalsGetValue("fungal_shift_last_frame", "-1")) end -- Get the pending cooldown in seconds; 0 if none or done function get_cooldown_sec() - local last_frame = get_last_shift_frame() - if last_frame == -1 then return 0 end + local last_frame = get_last_shift_frame() + if last_frame == -1 then return 0 end - local frame = GameGetFrameNum() - return (COOLDOWN - (frame - last_frame)) / 60 + local frame = GameGetFrameNum() + return (COOLDOWN - (frame - last_frame)) / 60 end --- Determine the numbered shift, where 0 is the first shift +--[[ Determine the numbered shift, where 0 is the first shift +-- +-- @param iter number +-- @returns table:{from=shift-info, to=shift-info} +--]] function sq_get_abs(iter) - local mat_from = matinfo.get_materials_from() - local mat_to = matinfo.get_materials_to() - SetRandomSeed(89346, 42345+iter) - local rnd = random_create(9123, 58925+iter) - - mat_from = pick_random_from_table_weighted(rnd, mat_from) - mat_to = pick_random_from_table_weighted(rnd, mat_to) - - mat_from.flask = false - mat_to.flask = false - if random_nexti(rnd, 1, 100) <= 75 then -- 75% to use a flask - if random_nexti(rnd, 1, 100) <= 50 then -- 50% which side gets it - mat_from.flask = true - else - mat_to.flask = true + local mats_from = matinfo.get_materials_from() + local mats_to = matinfo.get_materials_to() + SetRandomSeed(89346, 42345+iter) + local rnd = random_create(9123, 58925+iter) + + local mat_from = pick_random_from_table_weighted(rnd, mats_from) + local mat_to = pick_random_from_table_weighted(rnd, mats_to) + + mat_from.flask = false + mat_to.flask = false + if random_nexti(rnd, 1, 100) <= 75 then -- 75% to use a flask + if random_nexti(rnd, 1, 100) <= 50 then -- 50% which side gets it + mat_from.flask = true + else + mat_to.flask = true + end + end + + return {from=mat_from, to=mat_to} +end + +--[[ Determine if the shift uses a "rare" material +-- +-- @param shift_pair:table {from=shift-info, to=shift-info} +-- @returns rare_from:boolean, rare_to:boolean +--]] +function sq_is_rare_shift(shift_pair, cutoff) + if type(cutoff) ~= "number" then cutoff = CUTOFF_RARE end + local mats_from = shift_pair.from + local mat_to = shift_pair.to + local rare_from, rare_to = false, false + + for _, material in ipairs(mats_from) do + if matinfo.is_rare_source(material, cutoff) then + rare_from = true + end + end + + if matinfo.is_rare_target(mat_to.material, cutoff) then + rare_to = true end - end - return {from=mat_from, to=mat_to} + return rare_from, rare_to end --- vim: set ts=2 sts=2 sw=2: +-- vim: set ts=4 sts=4 sw=4: diff --git a/init.lua b/init.lua index 6b8f8c3..cefcc19 100644 --- a/init.lua +++ b/init.lua @@ -19,28 +19,29 @@ -- -- PLANNED FEATURES -- --- There's no ImGui fallback behavior, nor are there any diagnostic --- messages if ImGui isn't available. +-- Add either flask or pouch icon next to each material with the +-- material's CellData color (parse "data/materials.xml"). -- -- Add "fungal_shift_ui_icon" to the ImGui window. dofile_once("mods/shift_query/files/common.lua") -dofile_once("mods/shift_query/files/materials.lua") dofile_once("mods/shift_query/files/query.lua") dofile_once("mods/shift_query/lib/feedback.lua") dofile_once("mods/shift_query/files/constants.lua") APLC = dofile_once("mods/shift_query/files/aplc.lua") +--nxml = dofile_once("mods/shift_query/lib/nxml.lua") MAT_AP = "midas_precursor" MAT_LC = "magic_liquid_hp_regeneration_unstable" +RARE_MAT_COLOR = Feedback.colors.yellow_light + SQ = { new = function(self, imgui) self._imgui = imgui self._fb = Feedback:init(imgui) self._iter_track = -1 -- used for update detection self._frame_track = -1 -- used for update detection - self._force_update = false return self end, @@ -71,15 +72,10 @@ SQ = { idx_end = math.min(curr_iter + range_next, MAX_SHIFTS) end - q_logf("start = %s, end = %s", idx_start, idx_end) + q_logf("start=%s, end=%s", idx_start, idx_end) return {first=idx_start, last=idx_end} end, - --[[ Format the final shift line ]] - format_final = function(self, which, source, dest) - return ("%s shift is %s -> %s"):format(which, source, dest) - end, - --[[ Display either an AP or an LC recipe ]] print_aplc = function(self, mat, prob, combo) local result = maybe_localize_material(mat) @@ -100,14 +96,25 @@ SQ = { --[[ Determine and format a single shift ]] query = function(self, index) - q_logf("query(%s)", index) + q_logf("query(%d)", index) local iter = get_curr_iter() local shift = sq_get_abs(index) local which_msg = format_relative(iter, index) - for _, pair in ipairs(format_shift(shift)) do - local line = self:format_final(which_msg, pair[1], pair[2]) - q_log(line) - self._fb:add(line) + for idx, pair in ipairs(format_shift(shift)) do + q_logf("pair[%d]={%q, %q}", idx, pair[1], pair[2]) + -- To disable colors (for rare shift annotation), comment out the + -- code below and un-comment the following line. + --self._fb:add(("%s shift is %s -> %s"):format(which_msg, pair[1], pair[2])) + local rare_from, rare_to = sq_is_rare_shift(shift, nil) + local str_from = pair[1] + local str_to = pair[2] + if rare_from then + str_from = {color=RARE_MAT_COLOR, pair[1]} + end + if rare_to then + str_to = {color=RARE_MAT_COLOR, pair[2]} + end + self._fb:add({which_msg, "shift is", str_from, "->", str_to}) end end, @@ -143,8 +150,8 @@ SQ = { --[[ Determine if we should refresh the shift list ]] check_update = function(self) - if self._force_update then - self._force_update = false + if q_is_update_forced() then + q_clear_force_update() return true end local iter = get_curr_iter() @@ -163,35 +170,81 @@ SQ = { return draw end, + --[[ Obtain the actual list of shifted materials ]] + get_shift_map = function(self) + local world = EntityGetWithTag("world_state")[1] + local state = EntityGetComponent(world, "WorldStateComponent")[1] + local shifts = ComponentGetValue2(state, "changed_materials") + local shift_pairs = {} + for idx = 1, #shifts, 2 do + local mat1 = shifts[idx] + local mat2 = shifts[idx+1] + q_logf("shift %d shifted %s to %s", (idx+1)/2, mat1, mat2) + table.insert(shift_pairs, {mat1, mat2}) + end + return shift_pairs + end, + + --[[ Format the cooldown timer ]] + format_cooldown = function(self) + local last_shift_frame = get_last_shift_frame() + local cooldown = get_cooldown_sec() + if last_shift_frame > -1 then + if cooldown > 0 then + return format_duration(cooldown) + end + end + return nil + end, + --[[ Draw the menu bar ]] draw_menu = function(self) if self._imgui.BeginMenuBar() then if self._imgui.BeginMenu("Actions") then + if self._imgui.MenuItem("Refresh") then + self:refresh() + end + self._imgui.Separator() + local i18n_conf = q_setting_get(SETTING_LOCALIZE) if i18n_conf ~= FORMAT_LOCALE then if self._imgui.MenuItem("Show Local Names") then q_setting_set(SETTING_LOCALIZE, FORMAT_LOCALE) - self._force_update = true end end if i18n_conf ~= FORMAT_INTERNAL then if self._imgui.MenuItem("Show Internal Names") then q_setting_set(SETTING_LOCALIZE, FORMAT_INTERNAL) - self._force_update = true end end if i18n_conf ~= FORMAT_BOTH then if self._imgui.MenuItem("Show Local & Internal Names") then q_setting_set(SETTING_LOCALIZE, FORMAT_BOTH) - self._force_update = true end end + self._imgui.Separator() + local expand_opt = q_setting_get(SETTING_EXPAND) + if expand_opt == EXPAND_ONE then + if self._imgui.MenuItem("Show All Source Materials") then + q_setting_set(SETTING_EXPAND, EXPAND_ALL) + end + else + if self._imgui.MenuItem("Show Primary Source Material") then + q_setting_set(SETTING_EXPAND, EXPAND_ONE) + end + end + + self._imgui.Separator() + local real_str = f_enable(not q_setting_get(SETTING_REAL)) + if self._imgui.MenuItem(real_str .. " Flask Resolving") then + q_setting_set(SETTING_REAL, not q_setting_get(SETTING_REAL)) + end + self._imgui.Separator() local aplc_str = f_enable(not q_setting_get(SETTING_APLC)) if self._imgui.MenuItem(aplc_str .. " AP/LC Recipes") then q_setting_set(SETTING_APLC, not q_setting_get(SETTING_APLC)) - self._force_update = true end self._imgui.Separator() @@ -203,6 +256,7 @@ SQ = { self._fb:clear() end if self._imgui.MenuItem("Close") then + GamePrint("UI closed; re-open using the Mod Settings window") q_disable_gui() end self._imgui.EndMenu() @@ -212,25 +266,22 @@ SQ = { if self._imgui.BeginMenu("Prior Shifts") then if self._imgui.MenuItem("Show All") then q_setting_set(SETTING_PREVIOUS, tostring(ALL_SHIFTS)) - self._force_update = true end if self._imgui.MenuItem("Show One") then q_setting_set(SETTING_PREVIOUS, tostring(1)) - self._force_update = true end self._imgui.EndMenu() end if self._imgui.BeginMenu("Pending Shifts") then if self._imgui.MenuItem("Show All") then q_setting_set(SETTING_NEXT, tostring(ALL_SHIFTS)) - self._force_update = true end if self._imgui.MenuItem("Show Next") then q_setting_set(SETTING_NEXT, tostring(1)) - self._force_update = true end self._imgui.EndMenu() end + self._imgui.EndMenu() end self._imgui.EndMenuBar() @@ -239,39 +290,23 @@ SQ = { --[[ Draw the main window ]] draw_window = function(self) - self:_draw_window_main() - end, - - --[[ Draw the main window content ]] - _draw_window_main = function(self) local iter = get_curr_iter() - -- Draw a helpful "refresh now" button - if self._imgui.Button("Refresh Shifts") then - self:refresh() - end - if self:check_update() then self:refresh() end - -- Draw the feedback window Clear button - self._imgui.SameLine() - self._fb:draw_button() - -- Draw the current shift iteration + self._imgui.Text(("Shift: %s;"):format(iter)) + self._imgui.SameLine() - self._imgui.Text(("Shift: %s"):format(iter)) -- Draw the current shift cooldown - local last_shift_frame = get_last_shift_frame() - local cooldown = get_cooldown_sec() - if last_shift_frame > -1 then - if cooldown > 0 then - self._imgui.Text(("Cooldown: %s"):format(format_duration(cooldown))) - else - self._imgui.Text("Cooldown finished") - end + local cooldown = self:format_cooldown() + if cooldown ~= nil then + self._imgui.Text(("Cooldown: %s"):format(cooldown)) + else + self._imgui.Text("Cooldown finished") end -- Display what shifts the user has requested @@ -281,6 +316,18 @@ SQ = { local prev_text = f_shift_count(prev_c, "previous") self._imgui.Text(("Displaying %s and %s"):format(prev_text, next_text)) + if q_setting_get(SETTING_REAL) then + for _, matpair in ipairs(self:get_shift_map()) do + -- Don't localize the material; shifting affects that + local from_str, to_str = matpair[1], matpair[2] + self._fb:draw_line({ + {color="green", from_str}, + "became", + {color="green", to_str} + }) + end + end + self._fb:draw_box() end, @@ -291,16 +338,16 @@ SQ = { end } --- function OnWorldInitialized() end --- function OnModPostInit() end --- function OnPlayerSpawned(player_entity) end - imgui = nil query = nil +-- function OnWorldInitialized() end + function OnModPostInit() - imgui = load_imgui({version="1.3.0", mod="FungalShiftQuery"}) - query = SQ:new(imgui) + if load_imgui then + imgui = load_imgui({version="1.3.0", mod="FungalShiftQuery"}) + query = SQ:new(imgui) + end -- Fix problem with contradicting localize options (boolean / string) local localize = q_setting_get(SETTING_LOCALIZE) @@ -316,22 +363,34 @@ end -- The actual driving code, executed once per frame after world update function OnWorldPostUpdate() local ready = q_get_enabled() - local window_flags = imgui.WindowFlags.NoFocusOnAppearing - window_flags = window_flags + imgui.WindowFlags.MenuBar - window_flags = window_flags + imgui.WindowFlags.NoNavInputs if not imgui then - GamePrint("imgui not initialized") + GamePrint(table.concat({ + "shift_query - Noita-Dear-ImGui not found;", + "see workshop page for instructions"}, " ")) + GamePrint(table.concat({ + "shift_query - Ensure unsafe mods are enabled,", + "Noita-Dear-ImGui is installed and active,", + "and this mod is below Noita-Dear-ImGui in the mod list"}, " ")) ready = false - end - - if not query then - GamePrint("query object not initialized") + elseif not query then + GamePrint("shift_query - query object not initialized") ready = false end if ready then - if imgui.Begin("Fungal Shifts", nil, window_flags) then + local window_flags = bit.bor( + imgui.WindowFlags.NoFocusOnAppearing, + imgui.WindowFlags.MenuBar, + imgui.WindowFlags.NoNavInputs, + imgui.WindowFlags.HorizontalScrollbar) + local wtitle = "Fungal Shifts" + local last_shift = get_last_shift_frame() + local cooldown = get_cooldown_sec() + if last_shift > -1 and cooldown > 0 then + wtitle = ("%s (%s)"):format(wtitle, format_duration(cooldown)) + end + if imgui.Begin(wtitle .. "###Main", nil, window_flags) then local res, ret = pcall(query.draw, query) if not res then GamePrint(tostring(ret)) end imgui.End() diff --git a/lib/feedback.lua b/lib/feedback.lua index d6ca79b..5037b07 100644 --- a/lib/feedback.lua +++ b/lib/feedback.lua @@ -33,6 +33,27 @@ Feedback = { + colors = { + -- Pure colors + red = {1, 0, 0}, + green = {0, 1, 0}, + blue = {0, 0, 1}, + cyan = {0, 1, 1}, + magenta = {1, 0, 1}, + yellow = {1, 1, 0}, + white = {1, 1, 1}, + black = {0, 0, 0}, + + -- Blended colors + red_light = {1, 0.5, 0.5}, + green_light = {0.5, 1, 0.5}, + blue_light = {0.5, 0.5, 1}, + cyan_light = {0.5, 1, 1}, + magenta_light = {1, 0.5, 1}, + yellow_light = {1, 1, 0.5}, + gray = {0.5, 0.5, 0.5}, + }, + -- The lines table, public for convenience lines = {}, @@ -79,14 +100,48 @@ Feedback = { end end, + -- Convert a given color to a real color + get_color = function(self, color) + if color == nil then return nil end + if type(color) == "string" then + if self.colors[color] then + return self.colors[color] + end + end + if type(color) == "table" then + return { + color[1] or 0, + color[2] or 0, + color[3] or 0 + } + end + end, + + -- Draw a single line; public for convenience + draw_line = function(self, line) + if type(line) == "string" then + self._imgui.Text(line) + elseif type(line) == "table" then + local color = self:get_color(line.color) + if color then + self._imgui.PushStyleColor(self._imgui.Col.Text, unpack(color)) + end + for idx, part in ipairs(line) do + if idx > 1 then self._imgui.SameLine() end + self:draw_line(part) + end + if color then + self._imgui.PopStyleColor() + end + else + self._imgui.Text(tostring(line)) + end + end, + -- Draw the box of text draw_box = function(self) for _, line in ipairs(self.lines) do - if type(line) == "string" then - self._imgui.Text(line) - elseif type(line) == "table" then - self._imgui.Text(line[1]) -- TODO: font - end + self:draw_line(line) end end, diff --git a/lib/nxml.lua b/lib/nxml.lua new file mode 100644 index 0000000..6e150a5 --- /dev/null +++ b/lib/nxml.lua @@ -0,0 +1,742 @@ +---@alias int integer +---@alias bool boolean +---@alias str string +---@alias token_type "string" | "<" | ">" | "/" | "=" +---@alias error_type "missing_attribute_value" | "missing_element_close" | "missing_equals_sign" | "missing_element_name" | "missing_tag_open" | "mismatched_closing_tag" | "missing_token" | "missing_element" +---@alias error_fn fun(type: error_type, msg: str) + +---@class (exact) token +---@field value string? +---@field type token_type + +---@class (exact) error +---@field type error_type +---@field msg str +---@field row int +---@field col int + +---@class (exact) tokenizer +---@field data str +---@field cur_idx int +---@field cur_row int +---@field cur_col int +---@field prev_row int +---@field prev_col int +---@field len int + +---@class (exact) parser +---@field tok tokenizer_blob +---@field errors error[] +---@field error_reporter error_fn + +---@alias parser_blob parser_funcs | parser +---@alias tokenizer_blob tokenizer_funcs | tokenizer +---@alias element_blob element_funcs | element + +---@class (exact) element +---@field content str[]? +---@field children element_blob[] +---@field attr table +---@field name str +---@field errors error[] + +local ffi = nil +if require then + pcall(function() + ffi = require("ffi") + end) +end + +---@param str str +---@param start_idx int +---@param len int +---@return str +local function str_sub(str, start_idx, len) + return str:sub(start_idx + 1, start_idx + len) +end + +---@param str str +---@param idx int +---@return integer +local function str_index(str, idx) + return string.byte(str:sub(idx + 1, idx + 1)) +end + +--[[ + * The following is a Lua port of the NXML parser: + * https://github.com/xwitchproject/nxml + * + * The NXML Parser is heavily based on code from poro + * https://github.com/gummikana/poro + * + * The poro project is licensed under the Zlib license: + * + * -------------------------------------------------------------------------- + * Copyright (c) 2010-2019 Petri Purho, Dennis Belfrage + * Contributors: Martin Jonasson, Olli Harjola + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * -------------------------------------------------------------------------- +]] + +---@class nxml +local nxml = {} + +---@class tokenizer_funcs +local TOKENIZER_FUNCS = {} +local TOKENIZER_MT = { + __index = TOKENIZER_FUNCS, + __tostring = function(self) return "natif.nxml.tokenizer" end +} + +---@param cstring str +---@param len int +---@return tokenizer_blob +local function new_tokenizer(cstring, len) + ---@type tokenizer + local tokenizer = { + data = cstring, + cur_idx = 0, + cur_row = 1, + cur_col = 1, + prev_row = 1, + prev_col = 1, + len = len + } + return setmetatable(tokenizer, TOKENIZER_MT) +end + +---@type table +local ws = { + [string.byte(" ")] = true, + [string.byte("\t")] = true, + [string.byte("\n")] = true, + [string.byte("\r")] = true +} + +---@param char int +---@return bool +function TOKENIZER_FUNCS:is_whitespace(char) + local n = tonumber(char) + return ws[n] or false +end + +---@type table +local punct = { + [string.byte("<")] = true, + [string.byte(">")] = true, + [string.byte("=")] = true, + [string.byte("/")] = true, +} + +---@param char int +---@return bool +function TOKENIZER_FUNCS:is_whitespace_or_punctuation(char) + local n = tonumber(char) + --- We can disable here because is_whitespace(!int) -> false + ---@diagnostic disable-next-line: param-type-mismatch + return self:is_whitespace(n) or punct[n] or false +end + +---@param n int? 1 +function TOKENIZER_FUNCS:move(n) + ---@cast self tokenizer_blob + n = n or 1 + local prev_idx = self.cur_idx + self.cur_idx = self.cur_idx + n + if self.cur_idx >= self.len then + self.cur_idx = self.len + return + end + for i = prev_idx, self.cur_idx - 1 do + if str_index(self.data, i) == string.byte("\n") then + self.cur_row = self.cur_row + 1 + self.cur_col = 1 + else + self.cur_col = self.cur_col + 1 + end + end +end + +---@param n int? 1 +---@return int +function TOKENIZER_FUNCS:peek(n) + ---@cast self tokenizer_blob + n = n or 1 + local idx = self.cur_idx + n + if idx >= self.len then return 0 end + + return str_index(self.data, idx) +end + +---@param str str +---@return boolean +function TOKENIZER_FUNCS:match_string(str) + local len = #str + + for i = 0, len - 1 do + if self:peek(i) ~= str_index(str, i) then return false end + end + return true +end + +---@return bool +function TOKENIZER_FUNCS:eof() + ---@cast self tokenizer_blob + return self.cur_idx >= self.len +end + +---@return int +function TOKENIZER_FUNCS:cur_char() + ---@cast self tokenizer_blob + if self:eof() then return 0 end + return str_index(self.data, self.cur_idx) +end + +function TOKENIZER_FUNCS:skip_whitespace() + while not self:eof() do + if self:is_whitespace(self:cur_char()) then + self:move() + elseif self:match_string("") do + self:move() + end + + if self:match_string("-->") then + self:move(3) + end + elseif self:cur_char() == string.byte("<") and self:peek(1) == string.byte("!") then + self:move(2) + while not self:eof() and self:cur_char() ~= string.byte(">") do + self:move() + end + if self:cur_char() == string.byte(">") then + self:move() + end + elseif self:match_string("") do + self:move() + end + if self:match_string("?>") then + self:move(2) + end + else + break + end + end +end + +---@return str +function TOKENIZER_FUNCS:read_quoted_string() + ---@cast self tokenizer_blob + local start_idx = self.cur_idx + local len = 0 + + while not self:eof() and self:cur_char() ~= string.byte("\"") do + len = len + 1 + self:move() + end + + self:move() -- skip " + return str_sub(self.data, start_idx, len) +end + +---@return str +function TOKENIZER_FUNCS:read_unquoted_string() + ---@cast self tokenizer_blob + local start_idx = self.cur_idx - 1 -- first char is move()d + local len = 1 + + while not self:eof() and not self:is_whitespace_or_punctuation(self:cur_char()) do + len = len + 1 + self:move() + end + + return str_sub(self.data, start_idx, len) +end + +local C_NULL = 0 +local C_LT = string.byte("<") +local C_GT = string.byte(">") +local C_SLASH = string.byte("/") +local C_EQ = string.byte("=") +local C_QUOTE = string.byte("\"") + +---@return token? +function TOKENIZER_FUNCS:next_token() + self:skip_whitespace() + + self.prev_row = self.cur_row + self.prev_col = self.cur_col + + if self:eof() then return nil end + + local c = self:cur_char() + self:move() + + if c == C_NULL then + return nil + elseif c == C_LT then + ---@type token + local v = { type = "<" } + return v + elseif c == C_GT then + ---@type token + local v = { type = ">" } + return v + elseif c == C_SLASH then + ---@type token + local v = { type = "/" } + return v + elseif c == C_EQ then + ---@type token + local v = { type = "=" } + return v + elseif c == C_QUOTE then + ---@type token + local v = { type = "string", value = self:read_quoted_string() } + return v + else + ---@type token + local v = { type = "string", value = self:read_unquoted_string() } + return v + end +end + +---@class parser_funcs +local PARSER_FUNCS = {} +local PARSER_MT = { + __index = PARSER_FUNCS, + __tostring = function(self) return "natif.nxml.parser" end +} + +---@param tokenizer tokenizer_blob +---@param error_reporter fun(type, msg)? +---@return parser | parser_funcs parser +local function new_parser(tokenizer, error_reporter) + ---@type parser + local parser = { + tok = tokenizer, + errors = {}, + error_reporter = error_reporter or function(type, msg) print("parser error: [" .. type .. "] " .. msg) end + } + return setmetatable(parser, PARSER_MT) +end + +---@class element_funcs +local XML_ELEMENT_FUNCS = {} +local XML_ELEMENT_MT = { + __index = XML_ELEMENT_FUNCS, + __tostring = function(self) + return nxml.tostring(self, false) + end, +} + +---@param type error_type +---@param msg str +function PARSER_FUNCS:report_error(type, msg) + ---@cast self parser_blob + self.error_reporter(type, msg) + ---@type error + local error = { type = type, msg = msg, row = self.tok.prev_row, col = self.tok.prev_col } + table.insert(self.errors, error) +end + +---@param attr_table table +---@param name str +function PARSER_FUNCS:parse_attr(attr_table, name) + ---@cast self parser_blob + local tok = self.tok:next_token() + if not tok then + self:report_error("missing_token", string.format("parsing attribute '%s' - did not find a token", name)) + return + end + if tok.type == "=" then + tok = self.tok:next_token() + + if not tok then + self:report_error("missing_token", string.format("parsing attribute '%s' - did not find a token", name)) + return + end + + if tok.type == "string" then + attr_table[name] = tok.value + else + self:report_error("missing_attribute_value", + string.format("parsing attribute '%s' - expected a string after =, but did not find one", name)) + end + else + self:report_error("missing_equals_sign", + string.format("parsing attribute '%s' - did not find equals sign after attribute name", name)) + end +end + +---@param skip_opening_tag bool +---@return element_blob? +function PARSER_FUNCS:parse_element(skip_opening_tag) + ---@cast self parser_blob + local tok + if not skip_opening_tag then + tok = self.tok:next_token() + if not tok then + self:report_error("missing_token", "parsing element - did not find a token") + return + end + if tok.type ~= "<" then + self:report_error("missing_tag_open", "couldn't find a '<' to start parsing with") + end + end + + tok = self.tok:next_token() + if not tok then + self:report_error("missing_token", "parsing element - did not find a token") + return + end + if tok.type ~= "string" then + self:report_error("missing_element_name", "expected an element name after '<'") + end + + local elem_name = tok.value + if not elem_name then + self:report_error("missing_attribute_value", "parse element element missing name") + return + end + local elem = nxml.new_element(elem_name) + local content_idx = 0 + + local self_closing = false + + while true do + tok = self.tok:next_token() + + if tok == nil then + return elem + elseif tok.type == "/" then + if self.tok:cur_char() == C_GT then + self.tok:move() + self_closing = true + end + break + elseif tok.type == ">" then + break + elseif tok.type == "string" then + self:parse_attr(elem.attr, tok.value) + end + end + + if self_closing then return elem end + + while true do + tok = self.tok:next_token() + + if tok == nil then + return elem + elseif tok.type == "<" then + if self.tok:cur_char() == C_SLASH then + self.tok:move() + + local end_name = self.tok:next_token() + if not end_name then + self:report_error("missing_token", + string.format("parsing element '%s' - did not find a token", elem_name)) + return + end + if end_name.type == "string" and end_name.value == elem_name then + local close_greater = self.tok:next_token() + if not close_greater then + self:report_error("missing_token", + string.format("parsing element '%s' - did not find a token", elem_name)) + return + end + + if close_greater.type == ">" then + return elem + else + self:report_error("missing_element_close", + string.format("no closing '>' found for element '%s'", elem_name)) + end + else + self:report_error("mismatched_closing_tag", + string.format("closing element is in wrong order - expected '', but instead got '%s'", + elem_name, tostring(end_name.value))) + end + return elem + else + local child = self:parse_element(true) + table.insert(elem.children, child) + end + else + if not elem.content then + elem.content = {} + end + + content_idx = content_idx + 1 + elem.content[content_idx] = tok.value or tok.type + end + end +end + +---@return element_blob[] +function PARSER_FUNCS:parse_elements() + ---@cast self parser_blob + local tok = self.tok:next_token() + ---@type element_blob[] + local elems = {} + local elems_i = 1 + + while tok and tok.type == "<" do + local next_element = self:parse_element(true) + if not next_element then + self.error_reporter("missing_element", "parse_element returned nil while parsing elements") + return elems + end + elems[elems_i] = next_element + elems_i = elems_i + 1 + + tok = self.tok:next_token() + end + + return elems +end + +---@param str str +---@return bool +local function is_punctuation(str) + return str == "/" or str == "<" or str == ">" or str == "=" +end + +---@return str +function XML_ELEMENT_FUNCS:text() + ---@cast self element_blob + if self.content == nil then return "" end + local content_count = #self.content + if content_count == 0 then return "" end + + local text = self.content[1] + for i = 2, content_count do + local elem = self.content[i] + local prev = self.content[i - 1] + + if is_punctuation(elem) or is_punctuation(prev) then + text = text .. elem + else + text = text .. " " .. elem + end + end + + return text +end + +---@param child element_blob +function XML_ELEMENT_FUNCS:add_child(child) + self.children[#self.children + 1] = child +end + +---@param children element_blob[] +function XML_ELEMENT_FUNCS:add_children(children) + local children_i = #self.children + 1 + for i = 1, #children do + self.children[children_i] = children[i] + children_i = children_i + 1 + end +end + +---@param child element_blob +function XML_ELEMENT_FUNCS:remove_child(child) + for i = 1, #self.children do + if self.children[i] == child then + table.remove(self.children, i) + break + end + end +end + +---@param index int +function XML_ELEMENT_FUNCS:remove_child_at(index) + table.remove(self.children, index) +end + +function XML_ELEMENT_FUNCS:clear_children() + ---@cast self element_blob + self.children = {} +end + +function XML_ELEMENT_FUNCS:clear_attrs() + self.attr = {} +end + +---@param element_name str +---@return element_blob? +function XML_ELEMENT_FUNCS:first_of(element_name) + local i = 0 + local n = #self.children + + while i < n do + i = i + 1 + local c = self.children[i] + + if c.name == element_name then return c end + end + + return nil +end + +---@param element_name str +---@return fun(): element_blob? +function XML_ELEMENT_FUNCS:each_of(element_name) + local i = 1 + local n = #self.children + + return function() + while i <= n do + local child = self.children[i] + i = i + 1 + if child.name == element_name then + return child + end + end + end +end + +---@param element_name str +---@return element_blob[] +function XML_ELEMENT_FUNCS:all_of(element_name) + local table = {} + local i = 1 + for elem in self:each_of(element_name) do + table[i] = elem + i = i + 1 + end + return table +end + +---@return fun(): element_blob +function XML_ELEMENT_FUNCS:each_child() + local i = 0 + local n = #self.children + + return function() + while i < n do + i = i + 1 + return self.children[i] + end + end +end + +---@param data str +---@return element_blob +function nxml.parse(data) + local data_len = #data + local tok = new_tokenizer(data, data_len) + local parser = new_parser(tok) + + local elem = parser:parse_element(false) + + if not elem or (elem.errors and #elem.errors > 0) then + error("parser encountered errors") + end + + return elem +end + +---@param data str +---@return element_blob[] +function nxml.parse_many(data) + local data_len = #data + local tok = new_tokenizer(data, data_len) + local parser = new_parser(tok) + + local elems = parser:parse_elements() + + for i = 1, #elems do + local elem = elems[i] + + if elem.errors and #elem.errors > 0 then + error("parser encountered errors") + end + end + + return elems +end + +---@param name str +---@param attrs table? {} +---@return element_blob +function nxml.new_element(name, attrs) + ---@type element + local element = { + name = name, + attr = attrs or {}, + children = {}, + errors = {}, + content = nil + } + return setmetatable(element, XML_ELEMENT_MT) +end + +---@param value str | bool +---@return str +local function attr_value_to_str(value) + local t = type(value) + if t == "string" then return value end + if t == "boolean" then return value and "1" or "0" end + + return tostring(value) +end + +---@param elem element_blob +---@param packed bool +---@param indent_char str? \t +---@param cur_indent str? "" +---@return str +function nxml.tostring(elem, packed, indent_char, cur_indent) + indent_char = indent_char or "\t" + cur_indent = cur_indent or "" + local s = "<" .. elem.name + local self_closing = #elem.children == 0 and (not elem.content or #elem.content == 0) + + for k, v in pairs(elem.attr) do + s = s .. " " .. k .. "=\"" .. attr_value_to_str(v) .. "\"" + end + + if self_closing then + s = s .. " />" + return s + end + + s = s .. ">" + + local deeper_indent = cur_indent .. indent_char + + if elem.content and #elem.content ~= 0 then + if not packed then s = s .. "\n" .. deeper_indent end + s = s .. elem:text() + end + + if not packed then s = s .. "\n" end + + for i, v in ipairs(elem.children) do + if not packed then s = s .. deeper_indent end + s = s .. nxml.tostring(v, packed, indent_char, deeper_indent) + if not packed then s = s .. "\n" end + end + + s = s .. cur_indent .. "" + + return s +end + +return nxml diff --git a/mod_description.txt b/mod_description.txt new file mode 100644 index 0000000..c686da8 --- /dev/null +++ b/mod_description.txt @@ -0,0 +1,18 @@ +What are the fungal shifts for this seed? Which shifts will use a flask? + +This mod will tell you exactly these. It lists all pending shifts (configurable) using either the internal material name or your localized name (also configurable). + +If a shift mentions using a flask, then a flask will be used, assuming you're holding one. If a flask isn't mentioned, then the shift won't use one. + +**NEW!** Alchemic precursor and lively concoction are now included! The number next to the materials is the conversion chance. A higher number means a more effective conversion. +**NEW!** Flask resolving! If enabled via the Actions menu, this mod will tell you exactly what materials have been shifted, even if a flask was used. +**NEW!** Live feedback for shift delay period! This mod will tell you exactly how many seconds remain before you can perform another fungal shift. + +Alchemic Precursor / Lively Concoction behavior: These recipes are randomly generated every seed and take three random materials to generate Alchemic Precursor or Lively Concoction. The behavior is as follows: +Material_2, in the presence of Material_1 and Material_3, has a N percent chance to become Alchemic Precursor or Lively Concoction. Therefore, you want a large amount of the second material and a small amount of the first and third materials. A higher conversion percentage results in a more efficient conversion. + +This mod requires Noita-Dear-ImGui, which requires unsafe mods to be enabled. + +This has been tested against the February 14th, 2024 update. Note that the Beta (as of March 3rd, 2024) includes more materials and so this mod may give you incorrect results. + +Feedback welcome! diff --git a/mod_id.txt b/mod_id.txt index 86cfe31..b515e30 100644 --- a/mod_id.txt +++ b/mod_id.txt @@ -1 +1 @@ -shift_query +shift_query \ No newline at end of file diff --git a/settings.lua b/settings.lua index a1fbd41..d82b79d 100644 --- a/settings.lua +++ b/settings.lua @@ -1,72 +1,87 @@ +--[[ -- Configuration script for the Fungal Shift Query mod -- --- PLANNED FEATURES +-- Changing any setting (other than enable) triggers a force update. -- --- ** Ability to add/remove materials to existing source shift sets (both --- one-at-a-time and in bulk) --- ** Ability to modify source and destination probabilities --- ** Ability to add/remove source and destination shift sets (both --- one-at-a-time and in bulk) --- ** Ability to override MAX_SHIFTS - ---[[ --- FIXME: previous_count and next_count display -2 .. 20 --- FIXME: previous_count and next_count are not integers +-- Note that this script cannot reference any file in the mods/ directory, as +-- the virtual filesystem is not yet initialized by the time this script runs. +-- Therefore, all values in files/common.lua and files/constants.lua are +-- instead hard-coded here. --]] dofile_once("data/scripts/lib/utilities.lua") dofile_once("data/scripts/lib/mod_settings.lua") -dofile_once("mods/shift_query/files/common.lua") +MOD_ID = "shift_query" +MIN_SHIFTS = -1 +MAX_SHIFTS = 20 --- luacheck: globals MOD_SETTING_SCOPE_RUNTIME +function sq_mod_shift_range(mod_id, gui, in_main_menu, im_id, setting) + -- luacheck: globals ModSettingGetNextValue ModSettingSetNextValue + -- luacheck: globals GuiSlider mod_setting_group_x_offset + -- luacheck: globals mod_setting_handle_change_callback + -- luacheck: globals mod_setting_tooltip mod_setting_get_id + local value = ModSettingGetNextValue(mod_setting_get_id(mod_id, setting)) + if type(value) ~= "number" then value = setting.default or 0 end + + local value_new = GuiSlider( + gui, im_id, + mod_setting_group_x_offset, 0, + setting.ui_name, + value, + setting.value_min, + setting.value_max, + setting.value_default, + setting.value_display_multiplier or 1, + setting.value_display_formatting or "", 64) + --value_new = clamp(math.floor(value_new), MIN_SHIFTS, MAX_SHIFTS) + value_new = math.floor(value_new) + if value ~= value_new then + ModSettingSetNextValue(mod_setting_get_id(mod_id, setting), value_new, false) + mod_setting_handle_change_callback(mod_id, gui, in_main_menu, setting, value, value_new) + end --- Available functions: --- ModSettingSetNextValue(setting_id, next_value, true/false) --- ModSettingSet(setting_id, new_value) + mod_setting_tooltip(mod_id, gui, in_main_menu, setting) +end -function mod_setting_changed_callback(mod_id, gui, in_main_menu, setting, old_value, new_value) - --[[ TODO: enforce integer values - logger_add(("Setting %s changed from %s to %s"):format( - setting.id, tostring(old_value), tostring(new_value))) - if setting.id == "previous_count" or setting.id == "next_count" then - local final_value = math.floor(new_value) - if final_value < MIN_SHIFTS then - logger_add(("Setting %s %d below %d"):format(setting.id, new_value, final_value)) - final_value = MIN_SHIFTS - elseif final_value > MAX_SHIFTS then - logger_add(("Setting %s %d above %d"):format(setting.id, new_value, final_value)) - final_value = MAX_SHIFTS - end - if new_value ~= final_value then - ModSettingSet(MOD_ID .. "." .. setting.id, final_value) - end - return final_value +function sq_setting_changed( mod_id, gui, in_main_menu, setting, old_value, new_value ) + if old_value ~= new_value then + GlobalsSetValue("shift_query.q_force_update", "1") end - ]] end -mod_settings_version = 3 +mod_settings_version = 5 mod_settings = { + -- luacheck: globals MOD_SETTING_SCOPE_RUNTIME + { + id = "enable", + ui_name = "Enable UI", + ui_description = "Display GUI", + value_default = true, + change_fn = sq_setting_changed, + scope = MOD_SETTING_SCOPE_RUNTIME, + }, { id = "previous_count", ui_name = "Previous count", ui_description = "How many previous shifts should we display? (-1 = all)", value_default = 0, - value_min = MIN_SHIFTS, - value_max = MAX_SHIFTS, + value_min = -0.5, + value_max = 20, value_display_multiplier = 1, - change_fn = mod_setting_changed_callback, + change_fn = sq_setting_changed, + ui_fn = sq_mod_shift_range, scope = MOD_SETTING_SCOPE_RUNTIME, }, { id = "next_count", ui_name = "Next count", ui_description = "How many pending shifts should we display? (-1 = all)", - value_default = -1, - value_min = MIN_SHIFTS, - value_max = MAX_SHIFTS, + value_default = 20, + value_min = -0.5, + value_max = 20, value_display_multiplier = 1, - change_fn = mod_setting_changed_callback, + change_fn = sq_setting_changed, + ui_fn = sq_mod_shift_range, scope = MOD_SETTING_SCOPE_RUNTIME, }, { @@ -75,17 +90,23 @@ mod_settings = { ui_description = "How should material names be displayed?", value_default = "locale", values = { - {FORMAT_LOCALE, "Localized Name"}, - {FORMAT_INTERAL, "Internal Name"}, - {FORMAT_BOTH, "Both"} + {"locale", "Translated Name"}, + {"internal", "Internal Name"}, + {"both", "Both"}, }, + change_fn = sq_setting_changed, scope = MOD_SETTING_SCOPE_RUNTIME, }, { - id = "enable", - ui_name = "Enable UI", - ui_description = "Display GUI", - value_default = true, + id = "expand_from", + ui_name = "Expand sources?", + ui_description = "Show all source materials, or just the primary one?", + value_default = "one", + values = { + {"one", "Primary Material"}, + {"all", "All Materials"}, + }, + change_fn = sq_setting_changed, scope = MOD_SETTING_SCOPE_RUNTIME, }, { @@ -93,6 +114,15 @@ mod_settings = { ui_name = "Include AP / LC recipes", ui_description = "Include Alchemic Precursor and Lively Concoction recipes", value_default = false, + change_fn = sq_setting_changed, + scope = MOD_SETTING_SCOPE_RUNTIME, + }, + { + id = "flask_real", + ui_name = "Resolve Flasks", + ui_description = "Show a log of past shifts with flasks resolved to the real material", + value_default = false, + change_fn = sq_setting_changed, scope = MOD_SETTING_SCOPE_RUNTIME, }, } diff --git a/shift_query.vdf b/shift_query.vdf new file mode 100644 index 0000000..7c4d6e9 --- /dev/null +++ b/shift_query.vdf @@ -0,0 +1,10 @@ +"workshopitem" +{ + "appid" "881100" + "contentfolder" "/home/kaedenn/.local/share/Steam/steamapps/common/Noita/mods/shift_query" + "previewfile" "/home/kaedenn/.local/share/Steam/steamapps/common/Noita/mods/shift_query/workshop_preview_image.png" + "visibility" "0" // 0=public, 1=friends only, 2=private + "title" "Fungal Shift Query" + "description" "" + "publishedfileid" "3132525756" +}