mirror of
https://github.com/spice2x/spice2x.github.io.git
synced 2026-08-02 06:40:42 -07:00
Compare commits
11 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c0698a3872 | |||
| 1ed3521091 | |||
| 0dda920448 | |||
| 5f7580b69e | |||
| 3ef1b3ecaa | |||
| 931811da14 | |||
| 7624ded512 | |||
| a5252939dd | |||
| 808ac0c557 | |||
| 4e138b244e | |||
| 3fcd1bdbc9 |
@@ -80,6 +80,25 @@ if(MSVC)
|
||||
|
||||
# enable COMDAT folding for even smaller release builds
|
||||
add_link_options("$<$<CONFIG:RELEASE,MINSIZEREL>:/OPT:ICF>")
|
||||
|
||||
# always use UTF-8 (fix 4819)
|
||||
add_compile_options("/utf-8")
|
||||
|
||||
# spectre mitigation warning
|
||||
add_compile_options("/wd5045")
|
||||
|
||||
# implicit type convert warnings
|
||||
add_compile_options("/wd4244")
|
||||
add_compile_options("/wd4267")
|
||||
add_compile_options("/wd4305")
|
||||
|
||||
# unreferenced local variable
|
||||
add_compile_options("/wd4101")
|
||||
|
||||
# warning in winbase.h??
|
||||
add_compile_options("/wd5039")
|
||||
|
||||
|
||||
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
# disable warnings about using non _s variants like strncpy
|
||||
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
||||
|
||||
@@ -373,7 +373,7 @@ void ICCADevice::update_card(int unit) {
|
||||
bool kb_insert_press = false;
|
||||
|
||||
// eamio keypress
|
||||
kb_insert_press |= eamuse_get_keypad_state((size_t) unit) & (1 << EAM_IO_INSERT);
|
||||
kb_insert_press |= static_cast<bool>(eamuse_get_keypad_state((size_t) unit) & (1 << EAM_IO_INSERT));
|
||||
|
||||
// check for card
|
||||
if (this->cards[unit] == nullptr && (eamuse_card_insert_consume(this->node_count, unit) || kb_insert_press)) {
|
||||
|
||||
@@ -1,3 +1,12 @@
|
||||
09/22/2025 [spice2x]
|
||||
Add Polaris Chord lights
|
||||
Add boot.dll to Gitadora patches target
|
||||
Misc fixes
|
||||
|
||||
09/20/2025 [spice2x]
|
||||
Polaris Chord support for knobs/turntables/mouse as fader input
|
||||
Misc fixes
|
||||
|
||||
09/18/2025 [spice2x]
|
||||
Polaris Chord windowed mode fixes
|
||||
UI tweaks
|
||||
|
||||
+4
@@ -1527,8 +1527,10 @@ FMT_CONSTEXPR auto make_arg(const T& value) -> basic_format_arg<Context> {
|
||||
return arg;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdangling-reference"
|
||||
#endif
|
||||
|
||||
// The type template parameter is there to avoid an ODR violation when using
|
||||
// a fallback formatter in one translation unit and an implicit conversion in
|
||||
@@ -1544,7 +1546,9 @@ FMT_CONSTEXPR FMT_INLINE auto make_arg(const T& val) -> value<Context> {
|
||||
return arg;
|
||||
}
|
||||
|
||||
#ifdef __GNUC__
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
template <bool IS_PACKED, typename Context, type, typename T,
|
||||
FMT_ENABLE_IF(!IS_PACKED)>
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace games::ccj {
|
||||
bool MOUSE_TRACKBALL_USE_TOGGLE = false;
|
||||
uint8_t TRACKBALL_SENSITIVITY = 10;
|
||||
|
||||
static HANDLE fakeHandle = (HANDLE)0xDEADBEEF;
|
||||
static HANDLE fakeHandle = (HANDLE)0xDEADBEEFull;
|
||||
static HWND hWnd = nullptr;
|
||||
static WNDPROC wndProc = nullptr;
|
||||
static std::thread *tbThread = nullptr;
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "util/memutils.h"
|
||||
#include "util/sigscan.h"
|
||||
#include "util/utils.h"
|
||||
#include "launcher/signal.h"
|
||||
|
||||
#include "external/robin_hood.h"
|
||||
|
||||
@@ -232,6 +233,9 @@ namespace games::iidx {
|
||||
} else if (data.find(" W:touch: missing trigger:") != std::string::npos) {
|
||||
out.clear();
|
||||
return true;
|
||||
} else if (data.find("SuperstepSound: Audio device is not available") != std::string::npos) {
|
||||
launcher::signal::SUPERSTEP_SOUND_ERROR = TRUE;
|
||||
return false;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
@@ -781,7 +785,7 @@ namespace games::iidx {
|
||||
if (SOUND_OUTPUT_DEVICE_IN_EFFECT.has_value() && SOUND_OUTPUT_DEVICE_IN_EFFECT.value() == "wasapi") {
|
||||
intptr_t result = replace_pattern(
|
||||
avs::game::DLL_INSTANCE,
|
||||
"FF5008E8????ECFF83780803740D",
|
||||
"FF5008E8??????FF83780803740D",
|
||||
"??????BB00000000EB169090????",
|
||||
0, 0);
|
||||
|
||||
|
||||
@@ -94,7 +94,7 @@ namespace games::otoca {
|
||||
bool kb_insert_press = false;
|
||||
|
||||
// eamio keypress
|
||||
kb_insert_press |= eamuse_get_keypad_state(0) & (1 << EAM_IO_INSERT);
|
||||
kb_insert_press |= static_cast<bool>(eamuse_get_keypad_state(0) & (1 << EAM_IO_INSERT));
|
||||
|
||||
// check for card
|
||||
if (CARD_DATA == nullptr && (eamuse_card_insert_consume(1, 0) || kb_insert_press)) {
|
||||
|
||||
@@ -7,8 +7,68 @@
|
||||
#include "games/io.h"
|
||||
#include "io.h"
|
||||
#include "util/tapeled.h"
|
||||
#include "pc.h"
|
||||
#include "util/utils.h"
|
||||
|
||||
namespace games::pc {
|
||||
bool PC_KNOB_MODE = false;
|
||||
|
||||
constexpr float RELATIVE_DECAY = 0.02f;
|
||||
struct FADER_RELATIVE {
|
||||
// ranges from 0.f to 1.f
|
||||
float previous_raw = 0.5f;
|
||||
|
||||
// ranges from -1.f to +1.f
|
||||
float effective_value = 0.f;
|
||||
};
|
||||
|
||||
FADER_RELATIVE fader_l_relative;
|
||||
FADER_RELATIVE fader_r_relative;
|
||||
|
||||
float calculate_analog_raw_delta(float old_value, float new_value) {
|
||||
// assumed that values are between 0.f and 1.f
|
||||
|
||||
float delta = 0.f;
|
||||
if ((old_value < 0.25f) && (0.75f < new_value)) {
|
||||
// wrapped around: going left
|
||||
delta = -((1.f - new_value) + old_value);
|
||||
|
||||
} else if ((new_value < 0.25f) && (0.75f < old_value)) {
|
||||
// wrapped around: going right
|
||||
delta = (1.f - old_value) + new_value;
|
||||
|
||||
} else {
|
||||
delta = new_value - old_value;
|
||||
}
|
||||
return delta;
|
||||
}
|
||||
|
||||
float apply_decay(float val) {
|
||||
// return to center over time
|
||||
if (RELATIVE_DECAY < val) {
|
||||
return val - RELATIVE_DECAY;
|
||||
} else if (val < -RELATIVE_DECAY) {
|
||||
return val + RELATIVE_DECAY;
|
||||
} else {
|
||||
return 0.f;
|
||||
}
|
||||
}
|
||||
|
||||
float get_fader_knob_mode_value(float raw_analog, FADER_RELATIVE &fader) {
|
||||
// add new value...
|
||||
const float delta = calculate_analog_raw_delta(fader.previous_raw, raw_analog);
|
||||
fader.effective_value += (delta * 20.f);
|
||||
fader.previous_raw = raw_analog;
|
||||
|
||||
// capture the result after adding new input value
|
||||
fader.effective_value = CLAMP(fader.effective_value, -1.f, 1.f);
|
||||
const float result = fader.effective_value;
|
||||
|
||||
// post-process for next iteration: apply decay (return to center over time)
|
||||
fader.effective_value = apply_decay(fader.effective_value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* class definitions
|
||||
@@ -270,7 +330,13 @@ namespace games::pc {
|
||||
// FADER-L
|
||||
float val = 0.f;
|
||||
if (analogs[Analogs::FaderL].isSet()) {
|
||||
val = (GameAPI::Analogs::getState(RI_MGR, analogs[Analogs::FaderL]) - 0.5f) * 2;
|
||||
if (PC_KNOB_MODE) {
|
||||
val = get_fader_knob_mode_value(
|
||||
GameAPI::Analogs::getState(RI_MGR, analogs[Analogs::FaderL]),
|
||||
fader_l_relative);
|
||||
} else {
|
||||
val = (GameAPI::Analogs::getState(RI_MGR, analogs[Analogs::FaderL]) - 0.5f) * 2;
|
||||
}
|
||||
}
|
||||
if (GameAPI::Buttons::getState(RI_MGR, buttons[Buttons::FaderL_Left]) &&
|
||||
GameAPI::Buttons::getState(RI_MGR, buttons[Buttons::FaderL_Right])) {
|
||||
@@ -289,7 +355,13 @@ namespace games::pc {
|
||||
// FADER-R
|
||||
val = 0.f;
|
||||
if (analogs[Analogs::FaderR].isSet()) {
|
||||
val = (GameAPI::Analogs::getState(RI_MGR, analogs[Analogs::FaderR]) - 0.5f) * 2;
|
||||
if (PC_KNOB_MODE) {
|
||||
val = get_fader_knob_mode_value(
|
||||
GameAPI::Analogs::getState(RI_MGR, analogs[Analogs::FaderR]),
|
||||
fader_r_relative);
|
||||
} else {
|
||||
val = (GameAPI::Analogs::getState(RI_MGR, analogs[Analogs::FaderR]) - 0.5f) * 2;
|
||||
}
|
||||
}
|
||||
if (GameAPI::Buttons::getState(RI_MGR, buttons[Buttons::FaderR_Left]) &&
|
||||
GameAPI::Buttons::getState(RI_MGR, buttons[Buttons::FaderR_Right])) {
|
||||
@@ -343,6 +415,19 @@ namespace games::pc {
|
||||
}
|
||||
}
|
||||
|
||||
struct PolarisChordLight {
|
||||
int data_index;
|
||||
games::pc::Lights::pc_lights_t light;
|
||||
PolarisChordLight(
|
||||
int data_index, games::pc::Lights::pc_lights_t light) :
|
||||
data_index(data_index), light(light) {}
|
||||
};
|
||||
|
||||
static void set_led_value(games::pc::Lights::pc_lights_t light, uint8_t value) {
|
||||
auto &lights = games::pc::get_lights();
|
||||
GameAPI::Lights::writeLight(RI_MGR, lights.at(light), value / 255.f);
|
||||
}
|
||||
|
||||
void __fastcall aioIob2Bi2xAC1_SetTapeLedDataPart(AIO_IOB2_BI2X_AC1 *i_pNodeCtl, uint32_t i_TapeLedCh,
|
||||
uint32_t i_Offset, uint8_t *i_pData,
|
||||
uint32_t i_cntTapeLed, bool i_bReverse) {
|
||||
@@ -350,8 +435,82 @@ namespace games::pc {
|
||||
return aioIob2Bi2xAC1_SetTapeLedDataPart_orig(i_pNodeCtl, i_TapeLedCh, i_Offset, i_pData, i_cntTapeLed, i_bReverse);
|
||||
}
|
||||
|
||||
// TODO implement tape led
|
||||
// there are >200 lights in total, adding each one separately probably isn't the best idea...
|
||||
// log_info(
|
||||
// "pc",
|
||||
// "lamp [{}] [{}] = {},{},{}, cnt={}",
|
||||
// i_TapeLedCh,
|
||||
// i_Offset,
|
||||
// i_pData[0], i_pData[1], i_pData[2],
|
||||
// i_cntTapeLed);
|
||||
|
||||
// [channel 0]
|
||||
// these are button lamps; there are 12 buttons (columns) with this layout:
|
||||
//
|
||||
// 0 5 8 11 14 16 | 18 20 22 25 28 31
|
||||
// 1 6 9 12 15 17 | 19 21 23 26 29 32
|
||||
// 2 7 10 13 | 24 27 30 33
|
||||
// 3 | 34
|
||||
// 4 | 35
|
||||
//
|
||||
// 36 RGB lamps * 3 = 108 LEDs
|
||||
// each value ranges from [0, 255]
|
||||
// (we only care about the top row)
|
||||
|
||||
static PolarisChordLight button_lights_mapping[] = {
|
||||
{(0 * 3) + 0, games::pc::Lights::pc_lights_t::Button1_R},
|
||||
{(0 * 3) + 1, games::pc::Lights::pc_lights_t::Button1_G},
|
||||
{(0 * 3) + 2, games::pc::Lights::pc_lights_t::Button1_B},
|
||||
|
||||
{(5 * 3) + 0, games::pc::Lights::pc_lights_t::Button2_R},
|
||||
{(5 * 3) + 1, games::pc::Lights::pc_lights_t::Button2_G},
|
||||
{(5 * 3) + 2, games::pc::Lights::pc_lights_t::Button2_B},
|
||||
|
||||
{(8 * 3) + 0, games::pc::Lights::pc_lights_t::Button3_R},
|
||||
{(8 * 3) + 1, games::pc::Lights::pc_lights_t::Button3_G},
|
||||
{(8 * 3) + 2, games::pc::Lights::pc_lights_t::Button3_B},
|
||||
|
||||
{(11 * 3) + 0, games::pc::Lights::pc_lights_t::Button4_R},
|
||||
{(11 * 3) + 1, games::pc::Lights::pc_lights_t::Button4_G},
|
||||
{(11 * 3) + 2, games::pc::Lights::pc_lights_t::Button4_B},
|
||||
|
||||
{(14 * 3) + 0, games::pc::Lights::pc_lights_t::Button5_R},
|
||||
{(14 * 3) + 1, games::pc::Lights::pc_lights_t::Button5_G},
|
||||
{(14 * 3) + 2, games::pc::Lights::pc_lights_t::Button5_B},
|
||||
|
||||
{(16 * 3) + 0, games::pc::Lights::pc_lights_t::Button6_R},
|
||||
{(16 * 3) + 1, games::pc::Lights::pc_lights_t::Button6_G},
|
||||
{(16 * 3) + 2, games::pc::Lights::pc_lights_t::Button6_B},
|
||||
|
||||
{(18 * 3) + 0, games::pc::Lights::pc_lights_t::Button7_R},
|
||||
{(18 * 3) + 1, games::pc::Lights::pc_lights_t::Button7_G},
|
||||
{(18 * 3) + 2, games::pc::Lights::pc_lights_t::Button7_B},
|
||||
|
||||
{(20 * 3) + 0, games::pc::Lights::pc_lights_t::Button8_R},
|
||||
{(20 * 3) + 1, games::pc::Lights::pc_lights_t::Button8_G},
|
||||
{(20 * 3) + 2, games::pc::Lights::pc_lights_t::Button8_B},
|
||||
|
||||
{(22 * 3) + 0, games::pc::Lights::pc_lights_t::Button9_R},
|
||||
{(22 * 3) + 1, games::pc::Lights::pc_lights_t::Button9_G},
|
||||
{(22 * 3) + 2, games::pc::Lights::pc_lights_t::Button9_B},
|
||||
|
||||
{(25 * 3) + 0, games::pc::Lights::pc_lights_t::Button10_R},
|
||||
{(25 * 3) + 1, games::pc::Lights::pc_lights_t::Button10_G},
|
||||
{(25 * 3) + 2, games::pc::Lights::pc_lights_t::Button10_B},
|
||||
|
||||
{(28 * 3) + 0, games::pc::Lights::pc_lights_t::Button11_R},
|
||||
{(28 * 3) + 1, games::pc::Lights::pc_lights_t::Button11_G},
|
||||
{(28 * 3) + 2, games::pc::Lights::pc_lights_t::Button11_B},
|
||||
|
||||
{(31 * 3) + 0, games::pc::Lights::pc_lights_t::Button12_R},
|
||||
{(31 * 3) + 1, games::pc::Lights::pc_lights_t::Button12_G},
|
||||
{(31 * 3) + 2, games::pc::Lights::pc_lights_t::Button12_B},
|
||||
};
|
||||
|
||||
if (i_TapeLedCh == 0 && i_Offset == 0 && i_cntTapeLed == 108) {
|
||||
for (const auto &map : button_lights_mapping) {
|
||||
set_led_value(map.light, i_pData[map.data_index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall aioIob2Bi2x_SetTapeLedDataGroup(AIO_IOB2_BI2X_AC1* i_pNodeCtl, uint32_t i_bfGroup) {
|
||||
|
||||
@@ -71,7 +71,55 @@ std::vector<Light> &games::pc::get_lights() {
|
||||
&lights,
|
||||
"IC Reader R",
|
||||
"IC Reader G",
|
||||
"IC Reader B"
|
||||
"IC Reader B",
|
||||
|
||||
"Button 1 R",
|
||||
"Button 1 G",
|
||||
"Button 1 B",
|
||||
|
||||
"Button 2 R",
|
||||
"Button 2 G",
|
||||
"Button 2 B",
|
||||
|
||||
"Button 3 R",
|
||||
"Button 3 G",
|
||||
"Button 3 B",
|
||||
|
||||
"Button 4 R",
|
||||
"Button 4 G",
|
||||
"Button 4 B",
|
||||
|
||||
"Button 5 R",
|
||||
"Button 5 G",
|
||||
"Button 5 B",
|
||||
|
||||
"Button 6 R",
|
||||
"Button 6 G",
|
||||
"Button 6 B",
|
||||
|
||||
"Button 7 R",
|
||||
"Button 7 G",
|
||||
"Button 7 B",
|
||||
|
||||
"Button 8 R",
|
||||
"Button 8 G",
|
||||
"Button 8 B",
|
||||
|
||||
"Button 9 R",
|
||||
"Button 9 G",
|
||||
"Button 9 B",
|
||||
|
||||
"Button 10 R",
|
||||
"Button 10 G",
|
||||
"Button 10 B",
|
||||
|
||||
"Button 11 R",
|
||||
"Button 11 G",
|
||||
"Button 11 B",
|
||||
|
||||
"Button 12 R",
|
||||
"Button 12 G",
|
||||
"Button 12 B"
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -41,6 +41,55 @@ namespace games::pc {
|
||||
IC_READER_R,
|
||||
IC_READER_G,
|
||||
IC_READER_B,
|
||||
|
||||
Button1_R,
|
||||
Button1_G,
|
||||
Button1_B,
|
||||
|
||||
Button2_R,
|
||||
Button2_G,
|
||||
Button2_B,
|
||||
|
||||
Button3_R,
|
||||
Button3_G,
|
||||
Button3_B,
|
||||
|
||||
Button4_R,
|
||||
Button4_G,
|
||||
Button4_B,
|
||||
|
||||
Button5_R,
|
||||
Button5_G,
|
||||
Button5_B,
|
||||
|
||||
Button6_R,
|
||||
Button6_G,
|
||||
Button6_B,
|
||||
|
||||
Button7_R,
|
||||
Button7_G,
|
||||
Button7_B,
|
||||
|
||||
Button8_R,
|
||||
Button8_G,
|
||||
Button8_B,
|
||||
|
||||
Button9_R,
|
||||
Button9_G,
|
||||
Button9_B,
|
||||
|
||||
Button10_R,
|
||||
Button10_G,
|
||||
Button10_B,
|
||||
|
||||
Button11_R,
|
||||
Button11_G,
|
||||
Button11_B,
|
||||
|
||||
Button12_R,
|
||||
Button12_G,
|
||||
Button12_B
|
||||
|
||||
} pc_lights_t;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
namespace games::pc {
|
||||
extern std::string PC_INJECT_ARGS;
|
||||
extern bool PC_NO_IO;
|
||||
extern bool PC_KNOB_MODE;
|
||||
|
||||
class PCGame : public games::Game {
|
||||
public:
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "io.h"
|
||||
#include "acioemu/handle.h"
|
||||
#include "cfg/configurator.h"
|
||||
#include "launcher/signal.h"
|
||||
|
||||
static decltype(RegCloseKey) *RegCloseKey_orig = nullptr;
|
||||
static decltype(RegEnumKeyA) *RegEnumKeyA_orig = nullptr;
|
||||
@@ -209,6 +210,10 @@ namespace games::sdvx {
|
||||
out = "";
|
||||
return true;
|
||||
}
|
||||
if (data.find("SuperstepSound: Audio device is not available") != std::string::npos) {
|
||||
launcher::signal::SUPERSTEP_SOUND_ERROR = TRUE;
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -141,13 +141,17 @@ static ULONG WINAPI GetAdaptersInfo_hook(PIP_ADAPTER_INFO pAdapterInfo, PULONG p
|
||||
|
||||
static int WINAPI bind_hook(SOCKET s, const struct sockaddr *name, int namelen) {
|
||||
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma ide diagnostic ignored "OCDFAInspection"
|
||||
#endif
|
||||
|
||||
// cast to sockaddr_in
|
||||
struct sockaddr_in *in_name = (struct sockaddr_in *) name;
|
||||
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
// override bind to allow all hosts
|
||||
in_name->sin_addr.s_addr = inet_addr("0.0.0.0");
|
||||
|
||||
@@ -1112,6 +1112,9 @@ int main_implementation(int argc, char *argv[]) {
|
||||
if (options[launcher::Options::PCNoIO].is_active()) {
|
||||
games::pc::PC_NO_IO = options[launcher::Options::PCNoIO].value_bool();
|
||||
}
|
||||
if (options[launcher::Options::PCKnobMode].value_bool()) {
|
||||
games::pc::PC_KNOB_MODE = true;
|
||||
}
|
||||
if (options[launcher::Options::spice2x_EnableSMXStage].value_bool()) {
|
||||
rawinput::ENABLE_SMX_STAGE = true;
|
||||
}
|
||||
@@ -1964,6 +1967,7 @@ int main_implementation(int argc, char *argv[]) {
|
||||
libutils::warn_if_dll_exists("nvcuvid.dll");
|
||||
libutils::warn_if_dll_exists("nvEncodeAPI64.dll");
|
||||
libutils::warn_if_dll_exists("msvcr100.dll");
|
||||
libutils::warn_if_dll_exists("dsound.dll");
|
||||
|
||||
// complain loudly & early about dll load ordering issue
|
||||
libutils::check_duplicate_dlls();
|
||||
|
||||
@@ -1049,7 +1049,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
},
|
||||
{
|
||||
// LoadCCJModule
|
||||
.title = "Force Load Chase Chase Jokers",
|
||||
.title = "Force Load Chase Chase Jokers Module",
|
||||
.name = "ccj",
|
||||
.desc = "manually enable Chase Chase Jokers module",
|
||||
.type = OptionType::Bool,
|
||||
@@ -1058,7 +1058,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
},
|
||||
{
|
||||
// LoadQKSModule
|
||||
.title = "Force Load QuizKnock STADIUM",
|
||||
.title = "Force Load QuizKnock STADIUM Module",
|
||||
.name = "qks",
|
||||
.desc = "manually enable QuizKnock STADIUM module",
|
||||
.type = OptionType::Bool,
|
||||
@@ -1067,7 +1067,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
},
|
||||
{
|
||||
// LoadMFGModule
|
||||
.title = "Force Load Mahjong Fight Girl",
|
||||
.title = "Force Load Mahjong Fight Girl Module",
|
||||
.name = "mfg",
|
||||
.desc = "manually enable Mahjong Fight Girl module",
|
||||
.type = OptionType::Bool,
|
||||
@@ -1076,7 +1076,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
},
|
||||
{
|
||||
// LoadPCModule
|
||||
.title = "Force Load Polaris Chord",
|
||||
.title = "Force Load Polaris Chord Module",
|
||||
.name = "pc",
|
||||
.desc = "manually enable Polaris Chord module",
|
||||
.type = OptionType::Bool,
|
||||
@@ -1085,7 +1085,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
},
|
||||
{
|
||||
// LoadMusecaModule
|
||||
.title = "Force Load Museca",
|
||||
.title = "Force Load Museca Module",
|
||||
.name = "museca",
|
||||
.desc = "manually enable Museca module",
|
||||
.type = OptionType::Bool,
|
||||
@@ -1806,6 +1806,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
.category = "Game Options (Advanced)"
|
||||
},
|
||||
{
|
||||
// PCArgs
|
||||
.title = "PC Arguments Override",
|
||||
.name = "pcargs",
|
||||
.desc = "Command line arguments passed to the game.",
|
||||
@@ -1815,6 +1816,7 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
.category = "Game Options (Advanced)",
|
||||
},
|
||||
{
|
||||
// PCNoIO
|
||||
.title = "PC Disable IO Emulation",
|
||||
.name = "pcnoio",
|
||||
.desc = "Disables BI2X hooks for PC",
|
||||
@@ -1823,6 +1825,15 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
|
||||
.game_name = "Polaris Chord",
|
||||
.category = "Game Options (Advanced)"
|
||||
},
|
||||
{
|
||||
// PCKnobMode
|
||||
.title = "PC Fader Knobs Mode",
|
||||
.name = "pcknobs",
|
||||
.desc = "Allows SDVX knobs and IIDX turntables to be bound as Polaris Chord faders",
|
||||
.type = OptionType::Bool,
|
||||
.game_name = "Polaris Chord",
|
||||
.category = "Game Options",
|
||||
},
|
||||
{
|
||||
// spice2x_LightsOverallBrightness
|
||||
.title = "Lights Brightness Adjustment",
|
||||
@@ -2445,7 +2456,7 @@ std::unique_ptr<std::vector<Option>> launcher::parse_options(int argc, char *arg
|
||||
} else {
|
||||
// validate it is an integer
|
||||
try {
|
||||
std::stoull(argv[i], nullptr, 16);
|
||||
auto _ = std::stoull(argv[i], nullptr, 16);
|
||||
} catch (const std::exception &ex) {
|
||||
log_fatal("options", "parameter for -{} is not a hex number: {}", alias, argv[i]);
|
||||
}
|
||||
|
||||
@@ -205,6 +205,7 @@ namespace launcher {
|
||||
MFGNoIO,
|
||||
PCArgs,
|
||||
PCNoIO,
|
||||
PCKnobMode,
|
||||
spice2x_LightsOverallBrightness,
|
||||
spice2x_WindowBorder,
|
||||
spice2x_WindowSize,
|
||||
|
||||
@@ -29,6 +29,9 @@ namespace launcher::signal {
|
||||
// settings
|
||||
bool DISABLE = false;
|
||||
bool USE_VEH_WORKAROUND = false;
|
||||
|
||||
// states
|
||||
bool SUPERSTEP_SOUND_ERROR = false;
|
||||
}
|
||||
|
||||
#define V(variant) case variant: return #variant
|
||||
@@ -111,6 +114,13 @@ static LONG WINAPI TopLevelExceptionFilter(struct _EXCEPTION_POINTERS *Exception
|
||||
" RivaTuner Statistics Server (RTSS), MSI Afterburner, kernel mode anti-cheat");
|
||||
}
|
||||
|
||||
if (launcher::signal::SUPERSTEP_SOUND_ERROR) {
|
||||
log_warning("signal", "audio initialization error was previously detected during boot!");
|
||||
log_warning("signal", " (W:SuperstepSound: Audio device is not available!!!)");
|
||||
log_warning("signal", " this crash is most likely related to audio init failure");
|
||||
log_warning("signal", " fix your audio device, double check your audio options/patches, and try again");
|
||||
}
|
||||
|
||||
// walk the exception chain
|
||||
struct _EXCEPTION_RECORD *record_cause = ExceptionRecord->ExceptionRecord;
|
||||
while (record_cause != nullptr) {
|
||||
|
||||
@@ -5,6 +5,7 @@ namespace launcher::signal {
|
||||
// settings
|
||||
extern bool DISABLE;
|
||||
extern bool USE_VEH_WORKAROUND;
|
||||
extern bool SUPERSTEP_SOUND_ERROR;
|
||||
|
||||
//void print_stacktrace();
|
||||
void attach();
|
||||
|
||||
@@ -162,7 +162,7 @@ static void __cdecl cardunit_update() {
|
||||
bool kb_insert_press = false;
|
||||
|
||||
// eamio keypress
|
||||
kb_insert_press |= eamuse_get_keypad_state(unit) & (1 << EAM_IO_INSERT);
|
||||
kb_insert_press |= static_cast<bool>(eamuse_get_keypad_state(unit) & (1 << EAM_IO_INSERT));
|
||||
|
||||
// update card inserts
|
||||
if (eamuse_card_insert_consume((int) EXTDEV_CARDUNIT_COUNT, unit) ||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
#include <fmt/format.h>
|
||||
|
||||
#include "avs/game.h"
|
||||
#include "games/io.h"
|
||||
#include "cfg/screen_resize.h"
|
||||
#include "hooks/graphics/backends/d3d9/d3d9_backend.h"
|
||||
@@ -88,13 +89,32 @@ namespace overlay::windows {
|
||||
void GenericSubScreen::touch_transform(const ImVec2 xy_in, LONG *x_out, LONG *y_out) {}
|
||||
|
||||
void GenericSubScreen::build_content() {
|
||||
this->flags |= ImGuiWindowFlags_NoBackground;
|
||||
|
||||
if (this->disabled_message.has_value()) {
|
||||
this->flags &= ~ImGuiWindowFlags_NoBackground;
|
||||
ImGui::TextColored(YELLOW, "%s", this->disabled_message.value().c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
this->draw_texture();
|
||||
|
||||
if (!this->texture) {
|
||||
this->flags &= ~ImGuiWindowFlags_NoBackground;
|
||||
ImGui::TextColored(YELLOW, "Failed to acquire surface texture for subscreen.");
|
||||
if (avs::game::is_model("LDJ")) {
|
||||
ImGui::TextColored(
|
||||
YELLOW,
|
||||
"Ensure that you are using the correct DLL type, \n"
|
||||
"or patch the DLL to properly enable TDJ mode.");
|
||||
} else if (avs::game::is_model("KFC")) {
|
||||
ImGui::TextColored(
|
||||
YELLOW,
|
||||
"Ensure that you did not accidentally enable a patch \n"
|
||||
"that turns off subscreen rendering.");
|
||||
}
|
||||
}
|
||||
|
||||
#if OVERLAYDBG
|
||||
if (this->status_message.has_value()) {
|
||||
log_warning("sub::overlay", "{}", this->status_message.value().c_str());
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace overlay::windows {
|
||||
if (GRAPHICS_IIDX_WSUB) {
|
||||
this->disabled_message =
|
||||
"Close this overlay and use the second window.\n"
|
||||
"Or, turn on -iidxnosub to use the overlay instead.";
|
||||
"If you don't see the window, double check your DLL type and apply TDJ I/O patches as needed.";
|
||||
this->draws_window = false;
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace overlay::windows {
|
||||
{"arkmmd.dll", {"gamemmd.dll"}},
|
||||
{"arkklp.dll", {"lpac.dll"}},
|
||||
{"arknck.dll", {"weac.dll"}},
|
||||
{"gdxg.dll", {"game.dll", "libshare-pj.dll"}}
|
||||
{"gdxg.dll", {"game.dll", "libshare-pj.dll", "boot.dll"}}
|
||||
};
|
||||
|
||||
static size_t url_recent_idx = -1;
|
||||
|
||||
@@ -106,8 +106,10 @@ bool detour::inline_restore(void *address, char *data) {
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic push
|
||||
#pragma ide diagnostic ignored "OCDFAInspection"
|
||||
#endif
|
||||
|
||||
static void *pe_offset(void *ptr, size_t offset) {
|
||||
if (offset == 0) {
|
||||
@@ -282,7 +284,9 @@ void **detour::iat_find_proc(const char *iid_name, void *proc, HMODULE module) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
|
||||
void *detour::iat_try(const char *function, void *new_func, HMODULE module, const char *iid_name) {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user