Skip to content

Commit

Permalink
Add 'skip_cutscene_bind' command
Browse files Browse the repository at this point in the history
  • Loading branch information
rafalh committed Dec 5, 2019
1 parent 370a11c commit fa6d019
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 7 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ DashFaction Changelog

Version 1.4.1
-------------
- add 'skip_cutscene_bind' command allowing to change the control used for skipping cutscenes (by default Multiplayer Stats - TAB)
- fix crash after exiting administration with Gryphon (regression)

Version 1.4.0 (released 2019-12-04)
Expand Down
6 changes: 4 additions & 2 deletions common/GameConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,15 @@ bool GameConfig::load() try
result &= dash_faction_key.read_value("Direct Input", &direct_input);
result &= dash_faction_key.read_value("Fast Start", &fast_start);
result &= dash_faction_key.read_value("Scoreboard Animations", &scoreboard_anim);
result &= dash_faction_key.read_value("Level Sound Volume", reinterpret_cast<unsigned*>(&level_sound_volume));
result &= dash_faction_key.read_value("Level Sound Volume", &level_sound_volume);
result &= dash_faction_key.read_value("Allow Overwriting Game Files", &allow_overwrite_game_files);
result &= dash_faction_key.read_value("Version", &dash_faction_version);
result &= dash_faction_key.read_value("Swap Assault Rifle Controls", &swap_assault_rifle_controls);
result &= dash_faction_key.read_value("Glares", &glares);
result &= dash_faction_key.read_value("Linear Pitch", &linear_pitch);
result &= dash_faction_key.read_value("Show Enemy Bullets", &show_enemy_bullets);
result &= dash_faction_key.read_value("Keep Launcher Open", &keep_launcher_open);
result &= dash_faction_key.read_value("Skip Cutscene Control", &skip_cutscene_ctrl);

#ifdef NDEBUG
max_fps = std::clamp(max_fps, MIN_FPS_LIMIT, MAX_FPS_LIMIT);
Expand Down Expand Up @@ -93,14 +94,15 @@ void GameConfig::save() try
dash_faction_key.write_value("Direct Input", direct_input);
dash_faction_key.write_value("Fast Start", fast_start);
dash_faction_key.write_value("Scoreboard Animations", scoreboard_anim);
dash_faction_key.write_value("Level Sound Volume", *reinterpret_cast<unsigned*>(&level_sound_volume));
dash_faction_key.write_value("Level Sound Volume", level_sound_volume);
dash_faction_key.write_value("Allow Overwriting Game Files", allow_overwrite_game_files);
dash_faction_key.write_value("Version", dash_faction_version);
dash_faction_key.write_value("Swap Assault Rifle Controls", swap_assault_rifle_controls);
dash_faction_key.write_value("Glares", &glares);
dash_faction_key.write_value("Linear Pitch", linear_pitch);
dash_faction_key.write_value("Show Enemy Bullets", show_enemy_bullets);
dash_faction_key.write_value("Keep Launcher Open", keep_launcher_open);
dash_faction_key.write_value("Skip Cutscene Control", skip_cutscene_ctrl);
}
catch (...) {
std::throw_with_nested(std::runtime_error("failed to save config"));
Expand Down
1 change: 1 addition & 0 deletions common/include/common/GameConfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ struct GameConfig
bool allow_overwrite_game_files = false;
bool scoreboard_anim = false;
bool keep_launcher_open = false;
int skip_cutscene_ctrl = -1;

// Advanced
float level_sound_volume = 1.0f;
Expand Down
30 changes: 30 additions & 0 deletions common/include/common/RegKey.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,24 @@ class RegKey
return result;
}

bool read_value(const char* name, int* value)
{
unsigned temp;
bool result = read_value(name, &temp);
if (result)
*value = static_cast<int>(temp);
return result;
}

bool read_value(const char* name, float* value)
{
unsigned temp;
bool result = read_value(name, &temp);
if (result)
std::copy(reinterpret_cast<char*>(&temp), reinterpret_cast<char*>(&temp + 1), reinterpret_cast<char*>(value));
return result;
}

void write_value(const char* name, unsigned value)
{
DWORD temp = value;
Expand All @@ -116,6 +134,18 @@ class RegKey
write_value(name, value ? 1u : 0u);
}

void write_value(const char* name, int value)
{
write_value(name, static_cast<unsigned>(value));
}

void write_value(const char* name, float value)
{
unsigned temp;
std::copy(reinterpret_cast<char*>(&value), reinterpret_cast<char*>(&value + 1), reinterpret_cast<char*>(&temp));
write_value(name, temp);
}

bool is_open() const
{
return m_open;
Expand Down
39 changes: 34 additions & 5 deletions game_patch/misc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,7 @@ CodeInjection RflLoadInternal_CheckRestoreStatus_patch{
};

static int g_cutscene_bg_sound_sig = -1;
static constexpr rf::GameCtrl default_skip_cutscene_ctrl = rf::GC_MP_STATS;

rf::String GetGameCtrlBindName(int game_ctrl)
{
Expand All @@ -438,11 +439,12 @@ rf::String GetGameCtrlBindName(int game_ctrl)
return name;
}

void RenderSkipCutsceneHintText()
void RenderSkipCutsceneHintText(rf::GameCtrl ctrl)
{
auto bind_name = GetGameCtrlBindName(rf::GC_MP_STATS);
auto bind_name = GetGameCtrlBindName(ctrl);
auto& ctrl_name = rf::local_player->config.controls.keys[ctrl].name;
rf::GrSetColor(255, 255, 255, 255);
auto msg = rf::String::Format("Press Multiplayer Stats (%s) to skip the cutscene", bind_name.CStr());
auto msg = rf::String::Format("Press %s (%s) to skip the cutscene", ctrl_name.CStr(), bind_name.CStr());
auto x = rf::GrGetMaxWidth() / 2;
auto y = rf::GrGetMaxHeight() - 30;
rf::GrDrawAlignedText(rf::GR_ALIGN_CENTER, x, y, msg.CStr(), -1, rf::gr_text_material);
Expand All @@ -452,11 +454,14 @@ FunHook<void(bool)> MenuInGameUpdateCutscene_hook{
0x0045B5E0,
[](bool dlg_open) {
bool skip_cutscene = false;
rf::IsEntityCtrlActive(&rf::local_player->config.controls, rf::GC_MP_STATS, &skip_cutscene);
auto skip_cutscene_ctrl = g_game_config.skip_cutscene_ctrl != -1
? static_cast<rf::GameCtrl>(g_game_config.skip_cutscene_ctrl)
: default_skip_cutscene_ctrl;
rf::IsEntityCtrlActive(&rf::local_player->config.controls, skip_cutscene_ctrl, &skip_cutscene);

if (!skip_cutscene) {
MenuInGameUpdateCutscene_hook.CallTarget(dlg_open);
RenderSkipCutsceneHintText();
RenderSkipCutsceneHintText(skip_cutscene_ctrl);
}
else {
auto& timer_add_delta_time = AddrAsRef<int(int delta_ms)>(0x004FA2D0);
Expand Down Expand Up @@ -510,6 +515,29 @@ CallHook<int()> PlayHardcodedBackgroundMusicForCutscene_hook{
},
};

DcCommand2 skip_cutscene_bind_cmd{
"skip_cutscene_bind",
[](std::string bind_name) {
if (bind_name == "default") {
g_game_config.skip_cutscene_ctrl = -1;
}
else {
auto ConfigFindControlByName = AddrAsRef<int(rf::PlayerConfig&, const char*)>(0x0043D9F0);
int ctrl = ConfigFindControlByName(rf::local_player->config, bind_name.c_str());
if (ctrl == -1) {
rf::DcPrintf("Cannot find control: %s", bind_name.c_str());
}
else {
g_game_config.skip_cutscene_ctrl = ctrl;
g_game_config.save();
rf::DcPrintf("Skip Cutscene bind changed to: %s", bind_name.c_str());
}
}
},
"Changes bind used to skip cutscenes",
"skip_cutscene_bind ctrl_name",
};

CodeInjection CoronaEntityCollisionTestFix{
0x004152F1,
[](auto& regs) {
Expand Down Expand Up @@ -1151,6 +1179,7 @@ void MiscInit()
// Support skipping cutscenes
MenuInGameUpdateCutscene_hook.Install();
PlayHardcodedBackgroundMusicForCutscene_hook.Install();
skip_cutscene_bind_cmd.Register();

// Open server list menu instead of main menu when leaving multiplayer game
GameEnterState_hook.Install();
Expand Down

0 comments on commit fa6d019

Please sign in to comment.