Add "faststart" plugin to make DF start faster

In particular, it makes the game's "Loading..." screen animate
as quickly as possible, shortening it from around 10 seconds to
slightly more than 1 second.

A conditional build setting makes it skip the animation as well,
making it slightly faster yet.

Ideally, this should become part of the Tweak plugin, but we're
not building that right now.
develop
Quietust 2023-04-01 12:37:36 -06:00
parent 1ed25cdd72
commit 8d40ca8be6
4 changed files with 89 additions and 0 deletions

@ -34,6 +34,7 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
# Future
## New Plugins
- `faststart`: speeds up the "Loading..." screen so the Main Menu appears sooner
## Fixes
- `hotkeys`: hotkey hints on menu popup will no longer get their last character cut off by the scrollbar

@ -0,0 +1,18 @@
faststart
=========
.. dfhack-tool::
:summary: Makes the main menu appear sooner.
:tags: interface
:no-command:
This plugin accelerates the initial "Loading..." screen that appears when the
game first starts, so you don't have to wait as long before the Main Menu
appears and you can start playing.
Usage
-----
::
enable faststart

@ -112,6 +112,7 @@ dfhack_plugin(dig-now dig-now.cpp LINK_LIBRARIES lua)
#dfhack_plugin(embark-tools embark-tools.cpp)
dfhack_plugin(eventful eventful.cpp LINK_LIBRARIES lua)
dfhack_plugin(fastdwarf fastdwarf.cpp)
dfhack_plugin(faststart faststart.cpp)
dfhack_plugin(filltraffic filltraffic.cpp)
#dfhack_plugin(fix-unit-occupancy fix-unit-occupancy.cpp)
#dfhack_plugin(fixveins fixveins.cpp)

@ -0,0 +1,69 @@
// Fast Startup tweak
#include "Core.h"
#include <Console.h>
#include <Export.h>
#include <PluginManager.h>
#include <MiscUtils.h>
#include <VTableInterpose.h>
#include "df/viewscreen_initial_prepst.h"
#include <vector>
using namespace DFHack;
using namespace df::enums;
using std::vector;
// Uncomment this to make the Loading screen as fast as possible
// This has the side effect of removing the dwarf face animation
// (and briefly making the game become unresponsive)
//#define REALLY_FAST
DFHACK_PLUGIN("faststart");
DFHACK_PLUGIN_IS_ENABLED(is_enabled);
struct prep_hook : df::viewscreen_initial_prepst
{
typedef df::viewscreen_initial_prepst interpose_base;
DEFINE_VMETHOD_INTERPOSE(void, logic, ())
{
#ifdef REALLY_FAST
while (breakdown_level != interface_breakdown_types::STOPSCREEN)
{
render_count++;
INTERPOSE_NEXT(logic)();
}
#else
render_count = 4;
INTERPOSE_NEXT(logic)();
#endif
}
};
IMPLEMENT_VMETHOD_INTERPOSE(prep_hook, logic);
DFhackCExport command_result plugin_enable(color_ostream &out, bool enable)
{
if (enable != is_enabled)
{
if (!INTERPOSE_HOOK(prep_hook, logic).apply(enable))
return CR_FAILURE;
is_enabled = enable;
}
return CR_OK;
}
DFhackCExport command_result plugin_init ( color_ostream &out, vector <PluginCommand> &commands)
{
return CR_OK;
}
DFhackCExport command_result plugin_shutdown ( color_ostream &out )
{
INTERPOSE_HOOK(prep_hook, logic).remove();
return CR_OK;
}