1
0
mirror of synced 2024-11-27 17:00:53 +01:00

Enable loading without patched exe, enable input

This commit is contained in:
BroGamer 2022-06-20 06:10:09 +12:00
parent e746464108
commit d4e1b81836
2 changed files with 64 additions and 23 deletions

9
dist/keyconfig.toml vendored
View File

@ -5,3 +5,12 @@ DEBUG_DOWN = [ "DOWNARROW" ]
DEBUG_ENTER = [ "ENTER" ] DEBUG_ENTER = [ "ENTER" ]
COIN_ADD = [ "ENTER", "SDL_START" ] COIN_ADD = [ "ENTER", "SDL_START" ]
P1_LEFT_BLUE = [ "D" ]
P1_LEFT_RED = [ "F" ]
P1_RIGHT_RED = [ "J" ]
P1_RIGHT_BLUE = [ "K" ]
P2_LEFT_BLUE = [ ]
P2_LEFT_RED = [ ]
P2_RIGHT_RED = [ ]
P2_RIGHT_BLUE = [ ]

View File

@ -2,21 +2,12 @@
#include "poll.h" #include "poll.h"
#include <math.h> #include <math.h>
u16
rand16 (void) {
int max_value = 20000; // ~ 90 in I/O test menu
int min_value = 10000; // ~ 30 in I/O test menu
return (u16)(rand () % max_value + min_value);
}
HWND windowHandle = 0; HWND windowHandle = 0;
int CALLBACK int CALLBACK
enumWindows (HWND handle, LPARAM param) { enumWindows (HWND handle, LPARAM param) {
char buf[64]; char buf[64];
GetClassName (handle, buf, 64); GetClassName (handle, buf, 64);
printf ("%s\n", buf);
if (!strcmp (buf, "nuFoundation.Window")) { if (!strcmp (buf, "nuFoundation.Window")) {
windowHandle = handle; windowHandle = handle;
return 0; return 0;
@ -31,18 +22,21 @@ HOOK_DYNAMIC (i32, __stdcall, ShowMouse, i32 show) {
// xinput stuff // xinput stuff
HOOK_DYNAMIC (u32, __stdcall, XinputGetState, u32 index, void *state) { HOOK_DYNAMIC (u32, __stdcall, XinputGetState, u32 index, void *state) {
return 1167; return ERROR_DEVICE_NOT_CONNECTED;
} }
HOOK_DYNAMIC (u32, __stdcall, XinputSetState, u32 index, void *state) { HOOK_DYNAMIC (u32, __stdcall, XinputSetState, u32 index, void *state) {
return 1167; return ERROR_DEVICE_NOT_CONNECTED;
} }
HOOK_DYNAMIC (u32, __stdcall, XinputGetCapabilites, u32 index, u32 flags, HOOK_DYNAMIC (u32, __stdcall, XinputGetCapabilites, u32 index, u32 flags,
void *state) { void *state) {
return 1167; return ERROR_DEVICE_NOT_CONNECTED;
} }
#define DRUM_HIT 20000
#define IF_HIT(bind) return IsButtonTapped (bind) ? DRUM_HIT : 0
struct Keybindings COIN_ADD = { .keycodes = { VK_RETURN }, struct Keybindings COIN_ADD = { .keycodes = { VK_RETURN },
.buttons = { SDL_CONTROLLER_BUTTON_START } }; .buttons = { SDL_CONTROLLER_BUTTON_START } };
struct Keybindings TEST = { .keycodes = { VK_F1 } }; struct Keybindings TEST = { .keycodes = { VK_F1 } };
@ -50,6 +44,14 @@ struct Keybindings SERVICE = { .keycodes = { VK_F2 } };
struct Keybindings DEBUG_UP = { .keycodes = { VK_UP } }; struct Keybindings DEBUG_UP = { .keycodes = { VK_UP } };
struct Keybindings DEBUG_DOWN = { .keycodes = { VK_DOWN } }; struct Keybindings DEBUG_DOWN = { .keycodes = { VK_DOWN } };
struct Keybindings DEBUG_ENTER = { .keycodes = { VK_RETURN } }; struct Keybindings DEBUG_ENTER = { .keycodes = { VK_RETURN } };
struct Keybindings P1_LEFT_BLUE = { .keycodes = { 'D' } };
struct Keybindings P1_LEFT_RED = { .keycodes = { 'F' } };
struct Keybindings P1_RIGHT_RED = { .keycodes = { 'J' } };
struct Keybindings P1_RIGHT_BLUE = { .keycodes = { 'K' } };
struct Keybindings P2_LEFT_BLUE = {};
struct Keybindings P2_LEFT_RED = {};
struct Keybindings P2_RIGHT_RED = {};
struct Keybindings P2_RIGHT_BLUE = {};
int coin_count = 0; int coin_count = 0;
bool testEnabled = false; bool testEnabled = false;
@ -69,8 +71,28 @@ HOOK_DYNAMIC (i64, __fastcall, DecCoin, i32 a1, u16 a2) {
HOOK_DYNAMIC (i64, __fastcall, DecService, i32 a1, u16 a2) { return false; } HOOK_DYNAMIC (i64, __fastcall, DecService, i32 a1, u16 a2) { return false; }
// TODO HOOK_DYNAMIC (u16, __fastcall, GetAnalogIn, u8 which) {
HOOK_DYNAMIC (u16, __fastcall, GetAnalogIn, u8 which) { return false; } switch (which) {
case 0: // Player 1 Left Blue
IF_HIT (P1_LEFT_BLUE);
case 1: // Player 1 Left Red
IF_HIT (P1_LEFT_RED);
case 2: // Player 1 Right Red
IF_HIT (P1_RIGHT_RED);
case 3: // Player 1 Right Blue
IF_HIT (P1_RIGHT_BLUE);
case 4: // Player 2 Left Blue
IF_HIT (P2_LEFT_BLUE);
case 5: // Player 2 Left Red
IF_HIT (P2_LEFT_RED);
case 6: // Player 2 Right Red
IF_HIT (P2_RIGHT_RED);
case 7: // Player 2 Right Blue
IF_HIT (P2_RIGHT_BLUE);
default:
return 0;
}
}
HOOK_DYNAMIC (void *, __fastcall, GetBuffer, u16 a1, i64 a2, i16 a3) { HOOK_DYNAMIC (void *, __fastcall, GetBuffer, u16 a1, i64 a2, i16 a3) {
return false; return false;
@ -86,13 +108,23 @@ HOOK_DYNAMIC (u16, __fastcall, GetCoin, i32 a1) {
toml_table_t *config = openConfig (configPath ("keyconfig.toml")); toml_table_t *config = openConfig (configPath ("keyconfig.toml"));
if (config) { if (config) {
SetConfigValue (config, "COIN_ADD", &COIN_ADD);
SetConfigValue (config, "TEST", &TEST); SetConfigValue (config, "TEST", &TEST);
SetConfigValue (config, "SERVICE", &SERVICE); SetConfigValue (config, "SERVICE", &SERVICE);
SetConfigValue (config, "DEBUG_UP", &DEBUG_UP); SetConfigValue (config, "DEBUG_UP", &DEBUG_UP);
SetConfigValue (config, "DEBUG_DOWN", &DEBUG_DOWN); SetConfigValue (config, "DEBUG_DOWN", &DEBUG_DOWN);
SetConfigValue (config, "DEBUG_ENTER", &DEBUG_ENTER); SetConfigValue (config, "DEBUG_ENTER", &DEBUG_ENTER);
SetConfigValue (config, "COIN_ADD", &COIN_ADD);
SetConfigValue (config, "P1_LEFT_BLUE", &P1_LEFT_BLUE);
SetConfigValue (config, "P1_LEFT_RED", &P1_LEFT_RED);
SetConfigValue (config, "P1_RIGHT_RED", &P1_RIGHT_RED);
SetConfigValue (config, "P1_RIGHT_BLUE", &P1_RIGHT_BLUE);
SetConfigValue (config, "P2_LEFT_BLUE", &P2_LEFT_BLUE);
SetConfigValue (config, "P2_LEFT_RED", &P2_LEFT_RED);
SetConfigValue (config, "P2_RIGHT_RED", &P2_RIGHT_RED);
SetConfigValue (config, "P2_RIGHT_BLUE", &P2_RIGHT_BLUE);
toml_free (config); toml_free (config);
} }
@ -101,7 +133,6 @@ HOOK_DYNAMIC (u16, __fastcall, GetCoin, i32 a1) {
UpdatePoll (windowHandle); UpdatePoll (windowHandle);
if (IsButtonTapped (COIN_ADD)) { if (IsButtonTapped (COIN_ADD)) {
printf ("Add coin\n");
coin_count++; coin_count++;
} }
if (IsButtonTapped (TEST)) if (IsButtonTapped (TEST))
@ -160,7 +191,6 @@ HOOK_DYNAMIC (u8, __stdcall, IsWideUsio) { return false; }
HOOK_DYNAMIC (i64, __stdcall, Open) { return false; } HOOK_DYNAMIC (i64, __stdcall, Open) { return false; }
// TODO
HOOK_DYNAMIC (i64, __stdcall, ResetCoin) { HOOK_DYNAMIC (i64, __stdcall, ResetCoin) {
coin_count = 0; coin_count = 0;
return false; return false;
@ -174,7 +204,6 @@ HOOK_DYNAMIC (i64, __fastcall, SetBuffer, u16 a1, i32 a2, i16 a3) {
HOOK_DYNAMIC (i64, __fastcall, SetCDOut, u8 a1, u8 a2) { return false; } HOOK_DYNAMIC (i64, __fastcall, SetCDOut, u8 a1, u8 a2) { return false; }
// TODO
HOOK_DYNAMIC (i64, __fastcall, SetCoinLock, u8 a1, u8 a2) { return false; } HOOK_DYNAMIC (i64, __fastcall, SetCoinLock, u8 a1, u8 a2) { return false; }
HOOK_DYNAMIC (i64, __fastcall, SetExpansionMode, i16 a1) { return false; } HOOK_DYNAMIC (i64, __fastcall, SetExpansionMode, i16 a1) { return false; }
@ -223,11 +252,14 @@ i32 __stdcall DllMain (HMODULE mod, DWORD cause, void *ctx) {
if (cause != DLL_PROCESS_ATTACH) if (cause != DLL_PROCESS_ATTACH)
return 1; return 1;
void *base = GetModuleHandleA (0); // Blatantly stolen patches from mon.im
WRITE_MEMORY ((void *)0x140000C00 + 0x22DC0, u8,
// Blatantly stolen patches 0xC3); // Actually get shit working
WRITE_MEMORY (base + 0x239C0, u8, 0xC3); // Actually get shit working WRITE_MEMORY ((void *)0x140000C00 + 0x31428D, u8, 0xB0,
WRITE_MEMORY (base + 0x314E8D, u8, 0xB0, 0x01); // Unlock songs 0x01); // Unlock songs
WRITE_MEMORY ((void *)0x140000C00 + 0x692217, u8, 0xEB); // Shared audio
WRITE_MEMORY ((void *)0x140000C00 + 0x516739, u8, 0xBA, 0x00, 0x00, 0x00,
0x00, 0x90); // Disable VSync
INSTALL_HOOK_DYNAMIC (ShowMouse, INSTALL_HOOK_DYNAMIC (ShowMouse,
PROC_ADDRESS ("user32.dll", "ShowCursor")); PROC_ADDRESS ("user32.dll", "ShowCursor"));