Skip to content

Commit 74cbd1c

Browse files
committed
Disable debug flags when joining multiplayer game + reworked debug command
1 parent 373e611 commit 74cbd1c

File tree

2 files changed

+72
-87
lines changed

2 files changed

+72
-87
lines changed

Diff for: game_patch/commands.cpp

+71-87
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,47 @@ DcCommand2 max_fps_cmd{
6666
"maxfps <limit>",
6767
};
6868

69+
struct DebugFlagDesc
70+
{
71+
bool& ref;
72+
const char* name;
73+
bool clear_geometry_cache = false;
74+
};
75+
76+
DebugFlagDesc g_debug_flags[] = {
77+
{AddrAsRef<bool>(0x0062F3AA), "thruster"},
78+
// debug string at the left-top corner
79+
{AddrAsRef<bool>(0x0062FE19), "light"},
80+
{g_dbg_static_lights, "light2"},
81+
{AddrAsRef<bool>(0x0062FE1A), "push_climb_reg"},
82+
{AddrAsRef<bool>(0x0062FE1B), "geo_reg"},
83+
{AddrAsRef<bool>(0x0062FE1C), "glass"},
84+
{AddrAsRef<bool>(0x0062FE1D), "mover"},
85+
{AddrAsRef<bool>(0x0062FE1E), "ignite"},
86+
{AddrAsRef<bool>(0x0062FE1F), "movemode"},
87+
{AddrAsRef<bool>(0x0062FE20), "perf"},
88+
{AddrAsRef<bool>(0x0062FE21), "perfbar"},
89+
{AddrAsRef<bool>(0x0064E39C), "waypoint"},
90+
// network meter in left-top corner
91+
{AddrAsRef<bool>(0x006FED24), "network"},
92+
{AddrAsRef<bool>(0x007B2758), "particlestats"},
93+
// debug strings at the left side of the screen
94+
{AddrAsRef<bool>(0x007CAB59), "weapon"},
95+
{AddrAsRef<bool>(0x00856500), "event"},
96+
{AddrAsRef<bool>(0x0085683C), "trigger"},
97+
{AddrAsRef<bool>(0x009BB5AC), "objrender"},
98+
{g_dbg_geometry_rendering_stats, "roomstats"},
99+
// geometry rendering
100+
{AddrAsRef<bool>(0x009BB594), "trans", true},
101+
{AddrAsRef<bool>(0x009BB598), "room", true},
102+
{AddrAsRef<bool>(0x009BB59C), "portal", true},
103+
{AddrAsRef<bool>(0x009BB5A4), "lightmap", true},
104+
{AddrAsRef<bool>(0x009BB5A8), "nolightmap", true},
105+
};
106+
69107
DcCommand2 debug_cmd{
70108
"debug",
71-
[](std::optional<std::string> type_opt) {
109+
[](std::string type) {
72110

73111
#ifdef NDEBUG
74112
if (rf::is_net_game) {
@@ -77,100 +115,44 @@ DcCommand2 debug_cmd{
77115
}
78116
#endif
79117

80-
auto type = type_opt ? type_opt.value() : "";
81-
bool handled = false;
82-
static bool all_flags = false;
83-
84-
if (type.empty()) {
85-
all_flags = !all_flags;
86-
handled = true;
87-
rf::DcPrintf("All debug flags are %s", all_flags ? "enabled" : "disabled");
88-
}
89-
90-
auto handle_flag = [&](bool& flag_ref, const char* flag_name) {
91-
bool old_flag_value = flag_ref;
92-
if (type == flag_name) {
93-
flag_ref = !flag_ref;
94-
handled = true;
95-
rf::DcPrintf("Debug flag '%s' is %s", flag_name, flag_ref ? "enabled" : "disabled");
96-
}
97-
else if (type.empty()) {
98-
flag_ref = all_flags;
118+
for (auto& dbg_flag : g_debug_flags) {
119+
if (type == dbg_flag.name) {
120+
dbg_flag.ref = !dbg_flag.ref;
121+
rf::DcPrintf("Debug flag '%s' is %s", dbg_flag.name, dbg_flag.ref ? "enabled" : "disabled");
122+
if (dbg_flag.ref && dbg_flag.clear_geometry_cache) {
123+
rf::GeomClearCache();
124+
}
125+
return;
99126
}
100-
return old_flag_value != flag_ref;
101-
};
102-
103-
// clang-format off
104-
auto &dg_thruster = AddrAsRef<bool>(0x0062F3AA);
105-
auto &dg_lights = AddrAsRef<bool>(0x0062FE19);
106-
auto &dg_push_and_climbing_regions = AddrAsRef<bool>(0x0062FE1A);
107-
auto &dg_geo_regions = AddrAsRef<bool>(0x0062FE1B);
108-
auto &dg_glass = AddrAsRef<bool>(0x0062FE1C);
109-
auto &dg_movers = AddrAsRef<bool>(0x0062FE1D);
110-
auto &dg_entity_burn = AddrAsRef<bool>(0x0062FE1E);
111-
auto &dg_movement_mode = AddrAsRef<bool>(0x0062FE1F);
112-
auto &dg_perfomance = AddrAsRef<bool>(0x0062FE20);
113-
auto &dg_perf_bar = AddrAsRef<bool>(0x0062FE21);
114-
auto &dg_waypoints = AddrAsRef<bool>(0x0064E39C);
115-
auto &dg_network = AddrAsRef<bool>(0x006FED24);
116-
auto &dg_particle_stats = AddrAsRef<bool>(0x007B2758);
117-
auto &dg_weapon = AddrAsRef<bool>(0x007CAB59);
118-
auto &dg_events = AddrAsRef<bool>(0x00856500);
119-
auto &dg_triggers = AddrAsRef<bool>(0x0085683C);
120-
auto &dg_obj_rendering = AddrAsRef<bool>(0x009BB5AC);
121-
// Geometry rendering flags
122-
auto& render_everything_see_through = AddrAsRef<bool>(0x009BB594);
123-
auto& render_rooms_in_different_colors = AddrAsRef<bool>(0x009BB598);
124-
auto& render_non_see_through_portal_faces = AddrAsRef<bool>(0x009BB59C);
125-
auto& render_lightmaps_only = AddrAsRef<bool>(0x009BB5A4);
126-
auto& render_no_lightmaps = AddrAsRef<bool>(0x009BB5A8);
127-
// clang-format on
128-
129-
handle_flag(dg_thruster, "thruster");
130-
// debug string at the left-top corner
131-
handle_flag(dg_lights, "light");
132-
handle_flag(g_dbg_static_lights, "light2");
133-
handle_flag(dg_push_and_climbing_regions, "push_climb_reg");
134-
handle_flag(dg_geo_regions, "geo_reg");
135-
handle_flag(dg_glass, "glass");
136-
handle_flag(dg_movers, "mover");
137-
handle_flag(dg_entity_burn, "ignite");
138-
handle_flag(dg_movement_mode, "movemode");
139-
handle_flag(dg_perfomance, "perf");
140-
handle_flag(dg_perf_bar, "perfbar");
141-
handle_flag(dg_waypoints, "waypoint");
142-
// network meter in left-top corner
143-
handle_flag(dg_network, "network");
144-
handle_flag(dg_particle_stats, "particlestats");
145-
// debug strings at the left side of the screen
146-
handle_flag(dg_weapon, "weapon");
147-
handle_flag(dg_events, "event");
148-
handle_flag(dg_triggers, "trigger");
149-
handle_flag(dg_obj_rendering, "objrender");
150-
handle_flag(g_dbg_geometry_rendering_stats, "roomstats");
151-
// geometry rendering
152-
bool geom_rendering_changed = false;
153-
geom_rendering_changed |= handle_flag(render_everything_see_through, "trans");
154-
geom_rendering_changed |= handle_flag(render_rooms_in_different_colors, "room");
155-
geom_rendering_changed |= handle_flag(render_non_see_through_portal_faces, "portal");
156-
geom_rendering_changed |= handle_flag(render_lightmaps_only, "lightmap");
157-
geom_rendering_changed |= handle_flag(render_no_lightmaps, "nolightmap");
158-
159-
// Clear geometry cache (needed for geometry rendering flags)
160-
if (geom_rendering_changed) {
161-
auto geom_cache_clear = (void (*)())0x004F0B90;
162-
geom_cache_clear();
163127
}
164128

165-
if (!handled)
166-
rf::DcPrintf("Invalid debug flag: %s", type.c_str());
129+
rf::DcPrintf("Invalid debug flag: %s", type.c_str());
167130
},
168131
nullptr,
169-
"debug [thruster | light | light2 | push_climb_reg | geo_reg | glass | mover | ignite | movemode | perf | "
170-
"perfbar | waypoint | network | particlestats | weapon | event | trigger | objrender | roomstats | trans | "
132+
"debug [thruster | light | light2 | push_climb_reg | geo_reg | glass | mover | ignite | movemode | perf |\n"
133+
"perfbar | waypoint | network | particlestats | weapon | event | trigger | objrender | roomstats | trans |\n"
171134
"room | portal | lightmap | nolightmap]",
172135
};
173136

137+
void DisableAllDebugFlags()
138+
{
139+
bool clear_geom_cache = false;
140+
for (auto& dbg_flag : g_debug_flags) {
141+
if (dbg_flag.ref && dbg_flag.clear_geometry_cache)
142+
clear_geom_cache = true;
143+
dbg_flag.ref = false;
144+
}
145+
if (clear_geom_cache)
146+
rf::GeomClearCache();
147+
}
148+
149+
CodeInjection MpInit_disable_debug_flags_patch{
150+
0x0046D5B0,
151+
[]([[maybe_unused]] auto& regs) {
152+
DisableAllDebugFlags();
153+
},
154+
};
155+
174156
void DebugRender3d()
175157
{
176158
const auto dbg_waypoints = AddrAsRef<void()>(0x00468F00);
@@ -650,4 +632,6 @@ void CommandsAfterGameInit()
650632
map_cmd.Register();
651633
input_mode_cmd.Register();
652634
debug_cmd.Register();
635+
636+
MpInit_disable_debug_flags_patch.Install();
653637
}

Diff for: game_patch/rf.h

+1
Original file line numberDiff line numberDiff line change
@@ -1638,6 +1638,7 @@ namespace rf
16381638
static auto& SetCursorVisible = AddrAsRef<void(bool visible)>(0x0051E680);
16391639
static auto& CutsceneIsActive = AddrAsRef<bool()>(0x0045BE80);
16401640
static const auto Timer__GetTimeLeftMs = reinterpret_cast<int(__thiscall*)(void* timer)>(0x004FA420);
1641+
static auto& GeomClearCache = AddrAsRef<void()>(0x004F0B90);
16411642

16421643
/* Strings Table */
16431644
namespace strings {

0 commit comments

Comments
 (0)