From e55984c529d818e5ca756eb982a3a988e40ead0d Mon Sep 17 00:00:00 2001 From: lethosor Date: Tue, 1 Aug 2023 00:05:02 -0400 Subject: [PATCH] Fix startup crashes when global addresses are missing Useful for initial research. Can be tested with `DFHACK_NO_GLOBALS=1` --- library/Core.cpp | 10 ++++++---- library/LuaTools.cpp | 14 ++++++++------ library/lua/argparse.lua | 2 +- library/lua/gui.lua | 2 +- library/modules/Textures.cpp | 3 +++ 5 files changed, 19 insertions(+), 12 deletions(-) diff --git a/library/Core.cpp b/library/Core.cpp index c4b03a7ac..9df45a869 100644 --- a/library/Core.cpp +++ b/library/Core.cpp @@ -1896,8 +1896,8 @@ void Core::doUpdate(color_ostream &out) strict_virtual_cast(screen); // save data (do this before updating last_world_data_ptr and triggering unload events) - if ((df::global::game->main_interface.options.do_manual_save && !d->last_manual_save_request) || - (df::global::plotinfo->main.autosave_request && !d->last_autosave_request) || + if ((df::global::game && df::global::game->main_interface.options.do_manual_save && !d->last_manual_save_request) || + (df::global::plotinfo && df::global::plotinfo->main.autosave_request && !d->last_autosave_request) || (is_load_save && !d->was_load_save && strict_virtual_cast(screen))) { doSaveData(out); @@ -1959,8 +1959,10 @@ void Core::doUpdate(color_ostream &out) // Execute per-frame handlers onUpdate(out); - d->last_autosave_request = df::global::plotinfo->main.autosave_request; - d->last_manual_save_request = df::global::game->main_interface.options.do_manual_save; + if (df::global::game && df::global::plotinfo) { + d->last_autosave_request = df::global::plotinfo->main.autosave_request; + d->last_manual_save_request = df::global::game->main_interface.options.do_manual_save; + } d->was_load_save = is_load_save; out << std::flush; diff --git a/library/LuaTools.cpp b/library/LuaTools.cpp index a1bf855d6..ffeb4980a 100644 --- a/library/LuaTools.cpp +++ b/library/LuaTools.cpp @@ -2172,10 +2172,12 @@ void DFHack::Lua::Core::Reset(color_ostream &out, const char *where) inhibit_m_down = true; } - if (!df::global::enabler->mouse_lbut) - inhibit_l_down = false; - if (!df::global::enabler->mouse_rbut) - inhibit_r_down = false; - if (!df::global::enabler->mouse_mbut) - inhibit_m_down = false; + if (df::global::enabler) { + if (!df::global::enabler->mouse_lbut) + inhibit_l_down = false; + if (!df::global::enabler->mouse_rbut) + inhibit_r_down = false; + if (!df::global::enabler->mouse_mbut) + inhibit_m_down = false; + } } diff --git a/library/lua/argparse.lua b/library/lua/argparse.lua index e094bbb57..36b80feb1 100644 --- a/library/lua/argparse.lua +++ b/library/lua/argparse.lua @@ -3,7 +3,6 @@ local _ENV = mkmodule('argparse') local getopt = require('3rdparty.alt_getopt') -local guidm = require('gui.dwarfmode') function processArgs(args, validArgs) local result = {} @@ -174,6 +173,7 @@ end function coords(arg, arg_name, skip_validation) if arg == 'here' then + local guidm = require('gui.dwarfmode') -- globals may not be available yet local cursor = guidm.getCursorPos() if not cursor then arg_error(arg_name, diff --git a/library/lua/gui.lua b/library/lua/gui.lua index e22ddae20..ca3b212f0 100644 --- a/library/lua/gui.lua +++ b/library/lua/gui.lua @@ -9,7 +9,7 @@ local getval = utils.getval local to_pen = dfhack.pen.parse -CLEAR_PEN = to_pen{tile=df.global.init.texpos_border_interior, ch=32, fg=0, bg=0, write_to_lower=true} +CLEAR_PEN = to_pen{tile=dfhack.internal.getAddress('init') and df.global.init.texpos_border_interior, ch=32, fg=0, bg=0, write_to_lower=true} TRANSPARENT_PEN = to_pen{tile=0, ch=0} KEEP_LOWER_PEN = to_pen{ch=32, fg=0, bg=0, keep_lower=true} diff --git a/library/modules/Textures.cpp b/library/modules/Textures.cpp index 46dd0a4c5..d29cf02fb 100644 --- a/library/modules/Textures.cpp +++ b/library/modules/Textures.cpp @@ -121,6 +121,9 @@ static size_t load_textures(color_ostream & out, const char * fname, // unloaded. // void Textures::init(color_ostream &out) { + if (!enabler) + return; + auto & textures = enabler->textures; long num_textures = textures.raws.size(); if (num_textures <= g_dfhack_logo_texpos_start)