diff --git a/changelog.txt b/changelog.txt index 25e1688ee..7c9a075dd 100644 --- a/changelog.txt +++ b/changelog.txt @@ -50,6 +50,7 @@ Template for new versions: - `idle-crafting`: also support making shell crafts for workshops with linked input stockpiles - `gui/gm-editor`: automatic display of semantic values for language_name fields - `fix/stuck-worship`: reduced console output by default. Added ``--verbose`` and ``--quiet`` options. +- `necronomicon`: new ``--world`` option to list all secret-containing items in the entire world ## Removed - `modtools/force`: merged into `force` diff --git a/docs/necronomicon.rst b/docs/necronomicon.rst index 5028304ee..274501327 100644 --- a/docs/necronomicon.rst +++ b/docs/necronomicon.rst @@ -5,10 +5,10 @@ necronomicon :summary: Find books that contain the secrets of life and death. :tags: fort inspection items -Lists all books in the fortress that contain the secrets to life and death. -To find the books in fortress mode, go to the Written content submenu in -Objects (O). Slabs are not shown by default since dwarves cannot read secrets -from a slab in fort mode. +Lists all books in the fortress (or world) that contain the secrets to life and +death. To zoom to the books in fortress mode, go to the ``Artifacts`` tab in +`gui/sitemap` and click on their names. Slabs are not listed by default since +dwarves cannot read secrets from a slab in fort mode. Usage ----- @@ -23,3 +23,7 @@ Options ``-s``, ``--include-slabs`` Also list slabs that contain the secrets of life and death. Note that dwarves cannot read the secrets from a slab in fort mode. + +``-w``, ``--world`` + Lists ALL secret-containing items across the entire world, not just your + fortress. diff --git a/necronomicon.lua b/necronomicon.lua index fcffb0fdb..47d7c374a 100644 --- a/necronomicon.lua +++ b/necronomicon.lua @@ -9,14 +9,16 @@ function get_book_interactions(item) improvement._type == df.itemimprovement_writingst then for _, content_id in ipairs(improvement.contents) do local written_content = df.written_content.find(content_id) - title = written_content.title + if not written_content then goto continue end + title = written_content.title for _, ref in ipairs (written_content.refs) do if ref._type == df.general_ref_interactionst then local interaction = df.interaction.find(ref.interaction_id) table.insert(book_interactions, interaction) end end + ::continue:: end end end @@ -79,11 +81,37 @@ function necronomicon(include_slabs) end end +function necronomicon_world(include_slabs) + if include_slabs then + print("Slabs:") + print() + for _,rec in ipairs(df.global.world.artifacts.all) do + if df.item_slabst:is_instance(rec.item) and check_slab_secrets(rec.item) then + print(dfhack.df2console(dfhack.TranslateName(rec.name))) + end + end + print() + end + print("Books and Scrolls:") + print() + for _,rec in ipairs(df.global.world.artifacts.all) do + if df.item_bookst:is_instance(rec.item) or df.item_toolst:is_instance(rec.item) then + local title, interactions = get_book_interactions(rec.item) + + if next(interactions) then + print(" " .. dfhack.df2console(title)) + print_interactions(interactions) + print() + end + end + end +end local help = false -local include_slabs = false +local include_slabs, scan_world = false, false local args = argparse.processArgsGetopt({...}, { {"s", "include-slabs", handler=function() include_slabs = true end}, + {"w", "world", handler=function() scan_world = true end}, {"h", "help", handler=function() help = true end} }) @@ -91,8 +119,12 @@ local cmd = args[1] if help or cmd == "help" then print(dfhack.script_help()) -elseif cmd == nil or cmd == "" then - necronomicon(include_slabs) +elseif not cmd then + if scan_world then + necronomicon_world(include_slabs) + else + necronomicon(include_slabs) + end else print(('necronomicon: Invalid argument: "%s"'):format(cmd)) end