Skip to content

Commit 05926d9

Browse files
committed
New tweak: title-start-rename
Adds a safe rename option to the title screen "Start Playing" menu
1 parent a9ad2f4 commit 05926d9

5 files changed

Lines changed: 125 additions & 2 deletions

File tree

NEWS.rst

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
1010
Internals
1111
Lua
12-
New [Internal Commands | Plugins | Scripts | Tweaks]
12+
New [Internal Commands | Plugins | Scripts | Features]
1313
Fixes
1414
Misc Improvements
1515
Removed
@@ -36,6 +36,9 @@ New Features
3636
------------
3737
- `confirm`: Added a confirmation for retiring locations
3838
- `search-plugin`: Support for the location occupation assignment menu
39+
- `tweak`:
40+
41+
- ``tweak title-start-rename``: Adds a safe rename option to the title screen "Start Playing" menu
3942

4043
Fixes
4144
-----

docs/Plugins.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ Subcommands that persist until disabled or DF quits:
315315
:nestbox-color: Fixes the color of built nestboxes
316316
:shift-8-scroll: Gives Shift-8 (or :kbd:`*`) priority when scrolling menus, instead of scrolling the map
317317
:stable-cursor: Saves the exact cursor position between t/q/k/d/b/etc menus of fortress mode.
318+
:title-start-rename: Adds a safe rename option to the title screen "Start Playing" menu
318319
:tradereq-pet-gender: Displays pet genders on the trade request screen
319320

320321
.. _fix-armory:

library/xml

plugins/tweak/tweak.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "modules/Materials.h"
1515
#include "modules/MapCache.h"
1616
#include "modules/Buildings.h"
17+
#include "modules/Filesystem.h"
1718

1819
#include "MiscUtils.h"
1920

@@ -96,6 +97,7 @@
9697
#include "tweaks/nestbox-color.h"
9798
#include "tweaks/shift-8-scroll.h"
9899
#include "tweaks/stable-cursor.h"
100+
#include "tweaks/title-start-rename.h"
99101
#include "tweaks/tradereq-pet-gender.h"
100102

101103
using std::set;
@@ -218,6 +220,8 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi
218220
" tweak shift-8-scroll [disable]\n"
219221
" Gives Shift+8 (or *) priority when scrolling menus, instead of \n"
220222
" scrolling the map\n"
223+
" tweak title-start-rename [disable]\n"
224+
" Adds a safe rename option to the title screen \"Start Playing\" menu\n"
221225
" tweak tradereq-pet-gender [disable]\n"
222226
" Displays the gender of pets in the trade request list\n"
223227
// " tweak military-training [disable]\n"
@@ -277,6 +281,9 @@ DFhackCExport command_result plugin_init (color_ostream &out, std::vector <Plugi
277281

278282
TWEAK_HOOK("stable-cursor", stable_cursor_hook, feed);
279283

284+
TWEAK_HOOK("title-start-rename", title_start_rename_hook, feed);
285+
TWEAK_HOOK("title-start-rename", title_start_rename_hook, render);
286+
280287
TWEAK_HOOK("tradereq-pet-gender", pet_gender_hook, render);
281288

282289
return CR_OK;
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
#include "df/viewscreen_titlest.h"
2+
3+
using namespace DFHack;
4+
5+
struct title_start_rename_hook : df::viewscreen_titlest {
6+
typedef df::viewscreen_titlest interpose_base;
7+
typedef interpose_base::T_sel_subpage T_sel_subpage;
8+
static T_sel_subpage last_subpage;
9+
static bool in_rename;
10+
static bool rename_failed;
11+
static std::string entry;
12+
13+
inline df::viewscreen_titlest::T_start_savegames *get_cur_save()
14+
{
15+
return vector_get(start_savegames, sel_submenu_line);
16+
}
17+
18+
inline std::string full_save_dir(const std::string &region_name)
19+
{
20+
return std::string("data/save/") + region_name;
21+
}
22+
23+
bool do_rename()
24+
{
25+
auto save = get_cur_save();
26+
if (!save)
27+
return false;
28+
if (Filesystem::isdir(full_save_dir(entry)))
29+
return false;
30+
if (rename(full_save_dir(save->save_dir).c_str(), full_save_dir(entry).c_str()) != 0)
31+
return false;
32+
save->save_dir = entry;
33+
entry = "";
34+
return true;
35+
}
36+
37+
DEFINE_VMETHOD_INTERPOSE(void, render, ())
38+
{
39+
INTERPOSE_NEXT(render)();
40+
if (sel_subpage == T_sel_subpage::StartSelectWorld || sel_subpage == T_sel_subpage::StartSelectMode)
41+
{
42+
auto save = get_cur_save();
43+
if (save)
44+
{
45+
int x = 1, y = 7;
46+
OutputHotkeyString(x, y,
47+
in_rename ? entry.c_str() : "Rename",
48+
df::interface_key::CUSTOM_R,
49+
false, 0,
50+
rename_failed ? COLOR_LIGHTRED : COLOR_WHITE,
51+
in_rename ? COLOR_RED : COLOR_LIGHTRED);
52+
if (in_rename)
53+
OutputString(COLOR_LIGHTGREEN, x, y, "_");
54+
}
55+
}
56+
}
57+
58+
DEFINE_VMETHOD_INTERPOSE(void, feed, (std::set<df::interface_key> *input))
59+
{
60+
using namespace df::enums::interface_key;
61+
if (in_rename)
62+
{
63+
rename_failed = false;
64+
auto string_key = get_string_key(input);
65+
if (input->count(SELECT) && !entry.empty())
66+
{
67+
if (do_rename())
68+
in_rename = false;
69+
else
70+
rename_failed = true;
71+
}
72+
else if (input->count(STRING_A000))
73+
{
74+
if (!entry.empty())
75+
entry.erase(entry.size() - 1);
76+
}
77+
else if (string_key != NONE)
78+
{
79+
entry += Screen::keyToChar(string_key);
80+
}
81+
else if (input->count(LEAVESCREEN) || (input->count(SELECT) && entry.empty()) ||
82+
input->count(STANDARDSCROLL_UP) || input->count(STANDARDSCROLL_DOWN))
83+
{
84+
entry = "";
85+
in_rename = false;
86+
std::set<df::interface_key> tmp;
87+
if (input->count(STANDARDSCROLL_UP))
88+
tmp.insert(STANDARDSCROLL_UP);
89+
if (input->count(STANDARDSCROLL_DOWN))
90+
tmp.insert(STANDARDSCROLL_DOWN);
91+
INTERPOSE_NEXT(feed)(&tmp);
92+
}
93+
}
94+
else if (input->count(CUSTOM_R))
95+
{
96+
in_rename = true;
97+
}
98+
else
99+
{
100+
INTERPOSE_NEXT(feed)(input);
101+
}
102+
}
103+
};
104+
105+
IMPLEMENT_VMETHOD_INTERPOSE(title_start_rename_hook, render);
106+
IMPLEMENT_VMETHOD_INTERPOSE(title_start_rename_hook, feed);
107+
108+
df::viewscreen_titlest::T_sel_subpage title_start_rename_hook::last_subpage =
109+
df::viewscreen_titlest::T_sel_subpage::None;
110+
bool title_start_rename_hook::in_rename = false;
111+
bool title_start_rename_hook::rename_failed = false;
112+
std::string title_start_rename_hook::entry;

0 commit comments

Comments
 (0)