mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-02 23:00:42 -07:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f857e63d5d | |||
| b462c838f6 | |||
| 4d658bf273 | |||
| 67721c416b | |||
| 0b5f7787be |
@@ -19,3 +19,8 @@ dist/*
|
|||||||
external/cv2pdb/*
|
external/cv2pdb/*
|
||||||
|
|
||||||
.ccache/*
|
.ccache/*
|
||||||
|
|
||||||
|
# Visual Studio
|
||||||
|
.vs
|
||||||
|
out
|
||||||
|
CMakeSettings.json
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
09/18/2025 [spice2x]
|
||||||
|
Polaris Chord windowed mode fixes
|
||||||
|
UI tweaks
|
||||||
|
|
||||||
09/17/2025 [spice2x]
|
09/17/2025 [spice2x]
|
||||||
Polaris Chord I/O fixes, language shim
|
Polaris Chord I/O fixes, language shim
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ namespace games::mfg {
|
|||||||
SetEnvironmentVariableA("VFG_CABINET_TYPE", MFG_CABINET_TYPE.c_str());
|
SetEnvironmentVariableA("VFG_CABINET_TYPE", MFG_CABINET_TYPE.c_str());
|
||||||
|
|
||||||
// add card reader
|
// add card reader
|
||||||
portName = MFG_CABINET_TYPE == "UKS" ? L"\\\\.\\COM1" : L"\\\\.\\COM3";
|
portName = (MFG_CABINET_TYPE == "UKS") ? std::wstring(L"\\\\.\\COM1") : std::wstring(L"\\\\.\\COM3");
|
||||||
acioHandle = new acioemu::ACIOHandle(portName.c_str(), 1);
|
acioHandle = new acioemu::ACIOHandle(portName.c_str(), 1);
|
||||||
devicehook_init_trampoline();
|
devicehook_init_trampoline();
|
||||||
devicehook_add(acioHandle);
|
devicehook_add(acioHandle);
|
||||||
|
|||||||
@@ -35,7 +35,14 @@ std::vector<Button> &games::pc::get_buttons() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string games::pc::get_buttons_help() {
|
std::string games::pc::get_buttons_help() {
|
||||||
return "";
|
// keep to max 100 characters wide
|
||||||
|
return
|
||||||
|
" FADER-L FADER-R \n"
|
||||||
|
"\n"
|
||||||
|
" B1 B2 B3 ... B11 B12\n"
|
||||||
|
"\n"
|
||||||
|
" Most menu interactions are on the touch screen; you can use your mouse.\n"
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<Analog> &games::pc::get_analogs() {
|
std::vector<Analog> &games::pc::get_analogs() {
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ namespace games::pc {
|
|||||||
static std::wstring portName = L"COM1";
|
static std::wstring portName = L"COM1";
|
||||||
|
|
||||||
static decltype(RegisterRawInputDevices) *RegisterRawInputDevices_orig = nullptr;
|
static decltype(RegisterRawInputDevices) *RegisterRawInputDevices_orig = nullptr;
|
||||||
|
static decltype(EnumDisplaySettingsW) *EnumDisplaySettingsW_orig = nullptr;
|
||||||
|
static decltype(QueryDisplayConfig) *QueryDisplayConfig_orig = nullptr;
|
||||||
|
|
||||||
static BOOL WINAPI RegisterRawInputDevices_hook(PCRAWINPUTDEVICE pRawInputDevices, UINT uiNumDevices, UINT cbSize) {
|
static BOOL WINAPI RegisterRawInputDevices_hook(PCRAWINPUTDEVICE pRawInputDevices, UINT uiNumDevices, UINT cbSize) {
|
||||||
|
|
||||||
@@ -38,6 +40,27 @@ namespace games::pc {
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static BOOL WINAPI EnumDisplaySettingsW_hook(LPCWSTR lpszDeviceName, DWORD iModeNum, DEVMODEW* lpDevMode) {
|
||||||
|
auto result = EnumDisplaySettingsW_orig(lpszDeviceName, iModeNum, lpDevMode);
|
||||||
|
|
||||||
|
// https://docs.unity3d.com/2022.3/Documentation/ScriptReference/Screen-currentResolution.html
|
||||||
|
// "If the player is running in windowed mode, this returns the current dimensions of the game window in pixels and the display refresh rate."
|
||||||
|
// Override it to 1920x1080 to avoid broken UI under Windowed mode
|
||||||
|
if (result && iModeNum == ENUM_CURRENT_SETTINGS) {
|
||||||
|
// Actually make it returns size of the game window, Can I?
|
||||||
|
lpDevMode->dmPelsWidth = 1920;
|
||||||
|
lpDevMode->dmPelsHeight = 1080;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
LONG WINAPI QueryDisplayConfig_hook(UINT32, UINT32*, DISPLAYCONFIG_PATH_INFO*, UINT32*, DISPLAYCONFIG_MODE_INFO*, DISPLAYCONFIG_TOPOLOGY_ID*) {
|
||||||
|
// make unity fallback to EnumDisplaySettingsW as I don't
|
||||||
|
// want to deal with this api which is way more complex
|
||||||
|
return ERROR_NOT_SUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
void PCGame::attach() {
|
void PCGame::attach() {
|
||||||
Game::attach();
|
Game::attach();
|
||||||
|
|
||||||
@@ -63,7 +86,10 @@ namespace games::pc {
|
|||||||
const auto user32Dll = "user32.dll";
|
const auto user32Dll = "user32.dll";
|
||||||
detour::trampoline_try(user32Dll, "RegisterRawInputDevices",
|
detour::trampoline_try(user32Dll, "RegisterRawInputDevices",
|
||||||
RegisterRawInputDevices_hook, &RegisterRawInputDevices_orig);
|
RegisterRawInputDevices_hook, &RegisterRawInputDevices_orig);
|
||||||
|
detour::trampoline_try(user32Dll, "QueryDisplayConfig",
|
||||||
|
QueryDisplayConfig_hook, &QueryDisplayConfig_orig);
|
||||||
|
detour::trampoline_try(user32Dll, "EnumDisplaySettingsW",
|
||||||
|
EnumDisplaySettingsW_hook, &EnumDisplaySettingsW_orig);
|
||||||
|
|
||||||
if (GRAPHICS_SHOW_CURSOR) {
|
if (GRAPHICS_SHOW_CURSOR) {
|
||||||
unity_utils::force_show_cursor(true);
|
unity_utils::force_show_cursor(true);
|
||||||
|
|||||||
@@ -1272,6 +1272,19 @@ int main_implementation(int argc, char *argv[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (options[launcher::Options::GameExecutable].is_active() && !cfg::CONFIGURATOR_STANDALONE) {
|
||||||
|
log_warning(
|
||||||
|
"launcher",
|
||||||
|
"WARNING - user specified -exec option\n\n\n"
|
||||||
|
"!!! !!!\n"
|
||||||
|
"!!! Using -exec option disables all game-specific hooks! !!!\n"
|
||||||
|
"!!! Unless you know exactly what you are doing, clear -exec !!!\n"
|
||||||
|
"!!! and try again. Using -exec by itself will result in weird !!!\n"
|
||||||
|
"!!! errors and loss of functionality. !!!\n"
|
||||||
|
"!!! !!!\n"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (options[launcher::Options::FullscreenResolution].is_active()) {
|
if (options[launcher::Options::FullscreenResolution].is_active()) {
|
||||||
std::pair<uint32_t, uint32_t> result;
|
std::pair<uint32_t, uint32_t> result;
|
||||||
if (parse_width_height(options[launcher::Options::FullscreenResolution].value_text(), result)) {
|
if (parse_width_height(options[launcher::Options::FullscreenResolution].value_text(), result)) {
|
||||||
@@ -1767,7 +1780,14 @@ int main_implementation(int argc, char *argv[]) {
|
|||||||
// usage error
|
// usage error
|
||||||
if (!cfg::CONFIGURATOR_STANDALONE
|
if (!cfg::CONFIGURATOR_STANDALONE
|
||||||
&& (!CHECK_DLL_IGNORE_ARCH)) {
|
&& (!CHECK_DLL_IGNORE_ARCH)) {
|
||||||
log_fatal("launcher", "module auto detection failed.");
|
log_fatal(
|
||||||
|
"launcher",
|
||||||
|
"module auto detection failed!\n\n"
|
||||||
|
"This usually means one of the following:\n\n"
|
||||||
|
" 1. You put spice executables in the wrong place, or\n"
|
||||||
|
" 2. XML files in prop directory are malformed or missing, or\n"
|
||||||
|
" 3. You passed in invalid options (usually, path overrides like -exec)\n\n"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ static const std::vector<std::string> CATEGORY_ORDER_ADVANCED = {
|
|||||||
"NFC Card Readers",
|
"NFC Card Readers",
|
||||||
};
|
};
|
||||||
static const std::vector<std::string> CATEGORY_ORDER_DEV = {
|
static const std::vector<std::string> CATEGORY_ORDER_DEV = {
|
||||||
"Paths",
|
"Path Overrides",
|
||||||
"Network (Development)",
|
"Network (Development)",
|
||||||
"Audio (Hacks)",
|
"Audio (Hacks)",
|
||||||
"I/O Modules",
|
"I/O Modules",
|
||||||
@@ -53,12 +53,14 @@ bool launcher::USE_CMD_OVERRIDE = false;
|
|||||||
*/
|
*/
|
||||||
static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||||
{
|
{
|
||||||
.title = "Game Executable",
|
.title = "Override Game Executable & Disable Hooks",
|
||||||
.name = "exec",
|
.name = "exec",
|
||||||
.desc = "Path to the game DLL file",
|
.desc = "Path to the game DLL file.\n\n"
|
||||||
|
"This option is typically not needed; leave it empty to allow spice to auto-detect your game.\n\n"
|
||||||
|
"WARNING: this option also disables all game-specific hooks and turns off most I/O modules!",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.setting_name = "*.dll",
|
.setting_name = "*.dll",
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Open Configurator",
|
.title = "Open Configurator",
|
||||||
@@ -1091,88 +1093,88 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
|||||||
.category = "Game Options (Advanced)",
|
.category = "Game Options (Advanced)",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Modules Folder Path",
|
.title = "Modules Folder Override",
|
||||||
.name = "modules",
|
.name = "modules",
|
||||||
.desc = "Sets a custom path to the modules folder",
|
.desc = "Sets a custom path to the modules folder",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Screenshot Folder Path",
|
.title = "Screenshot Folder Override",
|
||||||
.name = "screenshotpath",
|
.name = "screenshotpath",
|
||||||
.desc = "Sets a custom path to the screenshots folder",
|
.desc = "Sets a custom path to the screenshots folder",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Configuration Path",
|
.title = "Configuration Path Override",
|
||||||
.name = "cfgpath",
|
.name = "cfgpath",
|
||||||
.desc = "Sets a custom file path for config file. Must be passed via the command line. "
|
.desc = "Sets a custom file path for config file. Must be passed via the command line. "
|
||||||
"If left empty, %appdata%\\spicetools.xml will be used",
|
"If left empty, %appdata%\\spicetools.xml will be used",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.setting_name = "(default)",
|
.setting_name = "(default)",
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
.disabled = true,
|
.disabled = true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// ScreenResizeConfigPath
|
// ScreenResizeConfigPath
|
||||||
.title = "Screen Resize Config Path",
|
.title = "Screen Resize Config Path Override",
|
||||||
.name = "resizecfgpath",
|
.name = "resizecfgpath",
|
||||||
.desc = "Sets a custom file path for screen resize config file. "
|
.desc = "Sets a custom file path for screen resize config file. "
|
||||||
"If left empty, %appdata%\\spice2x\\spicetools_screen_resize.json will be used",
|
"If left empty, %appdata%\\spice2x\\spicetools_screen_resize.json will be used",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
// PatchManagerConfigPath
|
// PatchManagerConfigPath
|
||||||
.title = "Patch Manager Config Path",
|
.title = "Patch Manager Config Path Override",
|
||||||
.name = "patchcfgpath",
|
.name = "patchcfgpath",
|
||||||
.desc = "Sets a custom file path for patch manager config file. Can be used to manage 'profiles' for auto-patches. "
|
.desc = "Sets a custom file path for patch manager config file. Can be used to manage 'profiles' for auto-patches. "
|
||||||
"If left empty, %appdata%\\spice2x\\spicetools_patch_manager.json will be used",
|
"If left empty, %appdata%\\spice2x\\spicetools_patch_manager.json will be used",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Intel SDE Folder Path",
|
.title = "Intel SDE Folder",
|
||||||
.name = "sde",
|
.name = "sde",
|
||||||
.desc = "Path to Intel SDE kit path for automatic attaching",
|
.desc = "Path to Intel SDE kit path for automatic attaching",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Path to ea3-config.xml",
|
.title = "ea3-config.xml Override",
|
||||||
.name = "e",
|
.name = "e",
|
||||||
.desc = "Sets a custom path to ea3-config.xml",
|
.desc = "Sets a custom path to ea3-config.xml",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Path to app-config.xml",
|
.title = "app-config.xml Override",
|
||||||
.name = "a",
|
.name = "a",
|
||||||
.desc = "Sets a custom path to app-config.xml",
|
.desc = "Sets a custom path to app-config.xml",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Path to avs-config.xml",
|
.title = "avs-config.xml Override",
|
||||||
.name = "v",
|
.name = "v",
|
||||||
.desc = "Sets a custom path to avs-config.xml",
|
.desc = "Sets a custom path to avs-config.xml",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Path to bootstrap.xml",
|
.title = "bootstrap.xml Override",
|
||||||
.name = "b",
|
.name = "b",
|
||||||
.desc = "Sets a custom path to bootstrap.xml",
|
.desc = "Sets a custom path to bootstrap.xml",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "Path to log.txt",
|
.title = "log.txt Override",
|
||||||
.name = "y",
|
.name = "y",
|
||||||
.desc = "Sets a custom path to log.txt",
|
.desc = "Sets a custom path to log.txt",
|
||||||
.type = OptionType::Text,
|
.type = OptionType::Text,
|
||||||
.category = "Paths",
|
.category = "Path Overrides",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.title = "API TCP Port",
|
.title = "API TCP Port",
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ namespace overlay::windows {
|
|||||||
auto const register_fn = reinterpret_cast<decltype(&LdrRegisterDllNotification)>
|
auto const register_fn = reinterpret_cast<decltype(&LdrRegisterDllNotification)>
|
||||||
(GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "LdrRegisterDllNotification"));
|
(GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "LdrRegisterDllNotification"));
|
||||||
|
|
||||||
auto callback = [] CALLBACK (ULONG reason, PCLDR_DLL_NOTIFICATION_DATA data, PVOID ctx) {
|
auto callback =
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
static_cast<PLDR_DLL_NOTIFICATION_FUNCTION>([]
|
||||||
|
#else
|
||||||
|
[] CALLBACK
|
||||||
|
#endif
|
||||||
|
(ULONG reason, PCLDR_DLL_NOTIFICATION_DATA data, PVOID ctx) {
|
||||||
if (reason == LDR_DLL_NOTIFICATION_REASON_LOADED) {
|
if (reason == LDR_DLL_NOTIFICATION_REASON_LOADED) {
|
||||||
auto const dll = strtolower(std::filesystem::path({
|
auto const dll = strtolower(std::filesystem::path({
|
||||||
data->Loaded.FullDllName->Buffer,
|
data->Loaded.FullDllName->Buffer,
|
||||||
@@ -241,7 +247,11 @@ namespace overlay::windows {
|
|||||||
static_cast<PatchManager*>(ctx)->reload_local_patches(true);
|
static_cast<PatchManager*>(ctx)->reload_local_patches(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
)
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
|
||||||
if (register_fn && NT_SUCCESS(register_fn(0, callback, this, &ldr_notify_cookie))) {
|
if (register_fn && NT_SUCCESS(register_fn(0, callback, this, &ldr_notify_cookie))) {
|
||||||
log_info("patchmanager", "registered for DLL load notifications");
|
log_info("patchmanager", "registered for DLL load notifications");
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ std::string peb::entry_name(const LDR_DATA_TABLE_ENTRY* entry) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const PEB* peb::peb_get() {
|
const PEB* peb::peb_get() {
|
||||||
#ifdef SPICE64
|
#ifdef _WIN64
|
||||||
return reinterpret_cast<const PEB *>(__readgsqword(0x60));
|
return reinterpret_cast<const PEB *>(__readgsqword(0x60));
|
||||||
#else
|
#else
|
||||||
return reinterpret_cast<const PEB *>(__readfsdword(0x30));
|
return reinterpret_cast<const PEB *>(__readfsdword(0x30));
|
||||||
|
|||||||
Reference in New Issue
Block a user