104 lines
3.2 KiB
C++
104 lines
3.2 KiB
C++
#include "jb.h"
|
|
|
|
#include <windows.h>
|
|
#include <filesystem>
|
|
|
|
#include "avs/game.h"
|
|
#include "bi2x_hook.h"
|
|
#include "cfg/configurator.h"
|
|
#include "util/logging.h"
|
|
#include "util/detour.h"
|
|
#include "util/libutils.h"
|
|
|
|
namespace games::jb {
|
|
|
|
#if !SPICE64
|
|
|
|
// fixes "IP ADDR CHANGE" errors with unusual network setups (e.g. a VPN)
|
|
static BOOL __stdcall network_addr_is_changed() {
|
|
return 0;
|
|
}
|
|
|
|
// fixes lag spikes from the periodic ping to "eamuse.konami.fun"
|
|
static BOOL __stdcall network_get_network_check_info() {
|
|
return 0;
|
|
}
|
|
|
|
// fixes network errors on non-DHCP interfaces
|
|
static BOOL __cdecl network_get_dhcp_result() {
|
|
return 1;
|
|
}
|
|
|
|
static int __cdecl GFDbgSetReportFunc(void *func) {
|
|
log_misc("jubeat", "GFDbgSetReportFunc hook hit");
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|
|
JBGame::JBGame() : Game("Jubeat") {
|
|
}
|
|
|
|
void JBGame::pre_attach() {
|
|
if (!cfg::CONFIGURATOR_STANDALONE) {
|
|
const auto current_path = std::filesystem::current_path();
|
|
log_misc("jubeat", "current working directory: {}", current_path);
|
|
if (current_path.parent_path() == current_path.root_path()) {
|
|
log_warning(
|
|
"jubeat",
|
|
"\n\nInvalid path error; jubeat cannot run from a directory in the drive root\n"
|
|
"The game will overflow the stack and silently fail to boot\n\n"
|
|
"Instead, it must be at least two levels deep, for example:\n"
|
|
" c:\\jubeat\\spice.exe <- CRASH\n"
|
|
" c:\\jubeat\\contents\\spice.exe <- OK\n\n"
|
|
"To fix this, create a new directory and move ALL game files there.\n\n"
|
|
"Your current working directory: {}\n",
|
|
current_path);
|
|
|
|
log_fatal(
|
|
"jubeat",
|
|
"Invalid path error; jubeat cannot run from a directory in the drive root");
|
|
}
|
|
}
|
|
}
|
|
|
|
void JBGame::attach() {
|
|
Game::attach();
|
|
|
|
#if SPICE64
|
|
if (avs::game::DLL_NAME == "jubeat2019.dll") {
|
|
libutils::load_library("libaio.dll");
|
|
libutils::load_library("libaio-iob.dll");
|
|
libutils::load_library("libaio-iob2_video.dll");
|
|
bi2x_hook_init();
|
|
}
|
|
#endif
|
|
|
|
touch_attach();
|
|
|
|
#if !SPICE64
|
|
// enable debug logging of gftools
|
|
HMODULE gftools = libutils::try_module("gftools.dll");
|
|
detour::inline_hook((void *) GFDbgSetReportFunc, libutils::try_proc(
|
|
gftools, "GFDbgSetReportFunc"));
|
|
|
|
// apply patches
|
|
HMODULE network = libutils::try_module("network.dll");
|
|
detour::inline_hook((void *) network_addr_is_changed, libutils::try_proc(
|
|
network, "network_addr_is_changed"));
|
|
detour::inline_hook((void *) network_get_network_check_info, libutils::try_proc(
|
|
network, "network_get_network_check_info"));
|
|
detour::inline_hook((void *) network_get_dhcp_result, libutils::try_proc(
|
|
network, "network_get_dhcp_result"));
|
|
#endif
|
|
|
|
}
|
|
|
|
void JBGame::detach() {
|
|
Game::detach();
|
|
|
|
touch_detach();
|
|
}
|
|
}
|