From 9d10f0fb11689eba6f0853c01e2c41428c02c1e4 Mon Sep 17 00:00:00 2001 From: SilasD Date: Wed, 23 Jul 2025 15:19:26 -0700 Subject: [PATCH 1/3] embark-anyone.lua Test the current viewscreen to ensure that it is the choose_start_site viewscreen, before trying to use it. This was found while diagnosing Issue #5509, but is not related. Minimal changes to the script. --- embark-anyone.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/embark-anyone.lua b/embark-anyone.lua index 10772e46e1..156fcaaf0a 100644 --- a/embark-anyone.lua +++ b/embark-anyone.lua @@ -3,6 +3,9 @@ local utils = require('utils') function addCivToEmbarkList(info) local viewscreen = dfhack.gui.getDFViewscreen(true) + if viewscreen._type ~= df.viewscreen_choose_start_sitest then + qerror("This script can only be used on the embark screen!") + end viewscreen.start_civ:insert ('#', info.civ) viewscreen.start_civ_nem_num:insert ('#', info.nemeses) @@ -12,16 +15,16 @@ end function embarkAnyone() local viewscreen = dfhack.gui.getDFViewscreen(true) + if viewscreen._type ~= df.viewscreen_choose_start_sitest then + qerror("This script can only be used on the embark screen!") + end + local choices, existing_civs = {}, {} for _,existing_civ in ipairs(viewscreen.start_civ) do existing_civs[existing_civ.id] = true end - if viewscreen._type ~= df.viewscreen_choose_start_sitest then - qerror("This script can only be used on the embark screen!") - end - for i, civ in ipairs (df.global.world.entities.all) do -- Test if entity is a civ if civ.type ~= df.historical_entity_type.Civilization then goto continue end From 5295834dc6625da9650ab65cc32ab47318733b55 Mon Sep 17 00:00:00 2001 From: SilasD Date: Thu, 24 Jul 2025 07:46:04 -0700 Subject: [PATCH 2/3] Test the current viewscreen The bug: if the embark-anyone script is executed on any viewscreen other than the embark viewscreen, it aborts with a stack trace. This bugfix makes it cleanly abort with a reasonably-descriptive error message. This was found while diagnosing Issue #5509, but is not related. Minimal changes to the script. Note on the code change: by moving the function addCivToEmbarkList() inside the function embarkAnyone(), addCivToEmbarkList() cannot execute unless embarkAnyone() has at least passed its safety check. --- embark-anyone.lua | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/embark-anyone.lua b/embark-anyone.lua index 156fcaaf0a..8239cd332b 100644 --- a/embark-anyone.lua +++ b/embark-anyone.lua @@ -1,19 +1,17 @@ local dialogs = require('gui.dialogs') local utils = require('utils') -function addCivToEmbarkList(info) - local viewscreen = dfhack.gui.getDFViewscreen(true) - if viewscreen._type ~= df.viewscreen_choose_start_sitest then - qerror("This script can only be used on the embark screen!") - end +function embarkAnyone() - viewscreen.start_civ:insert ('#', info.civ) - viewscreen.start_civ_nem_num:insert ('#', info.nemeses) - viewscreen.start_civ_entpop_num:insert ('#', info.pops) - viewscreen.start_civ_site_num:insert ('#', info.sites) -end + function addCivToEmbarkList(info) + local viewscreen = dfhack.gui.getDFViewscreen(true) + + viewscreen.start_civ:insert ('#', info.civ) + viewscreen.start_civ_nem_num:insert ('#', info.nemeses) + viewscreen.start_civ_entpop_num:insert ('#', info.pops) + viewscreen.start_civ_site_num:insert ('#', info.sites) + end -function embarkAnyone() local viewscreen = dfhack.gui.getDFViewscreen(true) if viewscreen._type ~= df.viewscreen_choose_start_sitest then qerror("This script can only be used on the embark screen!") From d7e20aa29402b8321bce89f06b3e239a296350df Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Thu, 24 Jul 2025 11:58:42 -0500 Subject: [PATCH 3/3] Update changelog.txt --- changelog.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.txt b/changelog.txt index 71e2a281fd..b0ca7040df 100644 --- a/changelog.txt +++ b/changelog.txt @@ -17,6 +17,7 @@ Template for new versions: ## New Features ## Fixes +- ``embark-anyone``: validate viewscreen before using, avoids a crash ## Misc Improvements