Merge branch 'develop'

This commit is contained in:
2025-07-29 23:37:48 +02:00
4 changed files with 35 additions and 117 deletions

View File

@ -194,19 +194,20 @@ stickDeadzone=7849
[keyboard] [keyboard]
; Keyboard bindings: ; Keyboard bindings:
; Stick controls (default: WASD) ; Keyboard movement
; Default is WASD keys for Joystick movemnt
up=0x57 up=0x57
left=0x41
down=0x53 down=0x53
left=0x41
right=0x44 right=0x44
; Attack (default: Space) ; Dash button. Default is the Left Shift,
attack=0x20 dash=0xA0
; Dash (default: LSHIFT) ; Cycle Target button. Default is the F key.
dash=0xa0 target=0x46
; Change Target (default: J) ; Attack button, Default is the Right Mouse Button.
target=0x4A attack=0x02
; Re-center camera (default: K) ; Noble Phantasm button. Default is the Spacebar
camera=0x4B np=0x20
; Noble Phantasm (default: L) ; Center Camera, Default is the C key
np=0x4C camera=0x43

View File

@ -1,9 +1,4 @@
#include <windows.h> #include <windows.h>
#include <dinput.h>
#include <stddef.h>
#include <stdint.h>
#include <wchar.h>
#include <assert.h> #include <assert.h>
#include "apm3io/backend.h" #include "apm3io/backend.h"
@ -25,9 +20,6 @@ static HRESULT apm3_di_config_apply(const struct apm3_di_config *cfg);
static BOOL CALLBACK apm3_di_enum_callback( static BOOL CALLBACK apm3_di_enum_callback(
const DIDEVICEINSTANCEW *dev, const DIDEVICEINSTANCEW *dev,
void *ctx); void *ctx);
static BOOL CALLBACK apm3_di_enum_callback_shifter(
const DIDEVICEINSTANCEW *dev,
void *ctx);
static void apm3_di_get_gamebtns(uint16_t *gamebtn_out); static void apm3_di_get_gamebtns(uint16_t *gamebtn_out);
static uint8_t apm3_di_decode_pov(DWORD pov); static uint8_t apm3_di_decode_pov(DWORD pov);
@ -42,7 +34,7 @@ static IDirectInputDevice8W *apm3_di_dev;
static IDirectInputEffect *apm3_di_fx; static IDirectInputEffect *apm3_di_fx;
static uint8_t apm3_di_home; static uint8_t apm3_di_home;
static uint8_t apm3_di_start; static uint8_t apm3_di_start;
static uint8_t apm3_di_button[8]; static uint8_t apm3_di_button[APM3_BUTTON_COUNT];
HRESULT apm3_di_init( HRESULT apm3_di_init(
const struct apm3_di_config *cfg, const struct apm3_di_config *cfg,
@ -50,10 +42,6 @@ HRESULT apm3_di_init(
const struct apm3_io_backend **backend) const struct apm3_io_backend **backend)
{ {
HRESULT hr; HRESULT hr;
HMODULE dinput8;
HRESULT (WINAPI *api_entry)(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN);
wchar_t dll_path[MAX_PATH];
UINT path_pos;
assert(cfg != NULL); assert(cfg != NULL);
assert(backend != NULL); assert(backend != NULL);
@ -72,6 +60,18 @@ HRESULT apm3_di_init(
return hr; return hr;
} }
hr = DirectInput8Create(
inst,
DIRECTINPUT_VERSION,
&IID_IDirectInput8W,
(void**)&apm3_di_api,
NULL);
if (FAILED(hr)) {
dprintf("DirectInput: DirectInput8Create failed: %08x\n", (int)hr);
return hr;
}
hr = IDirectInput8_EnumDevices( hr = IDirectInput8_EnumDevices(
apm3_di_api, apm3_di_api,
DI8DEVCLASS_GAMECTRL, DI8DEVCLASS_GAMECTRL,
@ -138,7 +138,7 @@ static HRESULT apm3_di_config_apply(const struct apm3_di_config *cfg)
dprintf("Stick: Start button . . . : %i\n", cfg->start); dprintf("Stick: Start button . . . : %i\n", cfg->start);
/* Print the configuration for all 8 buttons */ /* Print the configuration for all 8 buttons */
for (i = 0; i < 8; i++) { for (i = 0; i < APM3_BUTTON_COUNT; i++) {
dprintf("Stick: Button %i . . . . . : %i\n", i, cfg->button[i]); dprintf("Stick: Button %i . . . . . : %i\n", i, cfg->button[i]);
} }
@ -147,7 +147,7 @@ static HRESULT apm3_di_config_apply(const struct apm3_di_config *cfg)
apm3_di_start = cfg->start; apm3_di_start = cfg->start;
apm3_di_home = cfg->home; apm3_di_home = cfg->home;
for (i = 0; i < 8; i++) { for (i = 0; i < APM3_BUTTON_COUNT; i++) {
apm3_di_button[i] = cfg->button[i]; apm3_di_button[i] = cfg->button[i];
} }

View File

@ -1,11 +1,5 @@
#include <windows.h> #include <windows.h>
#include <dinput.h>
#include <assert.h> #include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <wchar.h>
#include "idacio/backend.h" #include "idacio/backend.h"
#include "idacio/config.h" #include "idacio/config.h"
@ -88,10 +82,6 @@ HRESULT idac_di_init(
const struct idac_io_backend **backend) const struct idac_io_backend **backend)
{ {
HRESULT hr; HRESULT hr;
HMODULE dinput8;
HRESULT (WINAPI *api_entry)(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN);
wchar_t dll_path[MAX_PATH];
UINT path_pos;
assert(cfg != NULL); assert(cfg != NULL);
assert(backend != NULL); assert(backend != NULL);
@ -110,38 +100,7 @@ HRESULT idac_di_init(
return hr; return hr;
} }
/* Initial D THE ARCADE has some built-in DirectInput support that is not hr = DirectInput8Create(
particularly useful. idachook shorts this out by redirecting dinput8.dll
to a no-op implementation of DirectInput. However, idacio does need to
talk to the real operating system implementation of DirectInput without
the stub DLL interfering, so build a path to
C:\Windows\System32\dinput.dll here. */
dll_path[0] = L'\0';
path_pos = GetSystemDirectoryW(dll_path, _countof(dll_path));
wcscat_s(
dll_path + path_pos,
_countof(dll_path) - path_pos,
L"\\dinput8.dll");
dinput8 = LoadLibraryW(dll_path);
if (dinput8 == NULL) {
hr = HRESULT_FROM_WIN32(GetLastError());
dprintf("DirectInput: LoadLibrary failed: %08x\n", (int) hr);
return hr;
}
api_entry = (void *) GetProcAddress(dinput8, "DirectInput8Create");
if (api_entry == NULL) {
dprintf("DirectInput: GetProcAddress failed\n");
return E_FAIL;
}
hr = api_entry(
inst, inst,
DIRECTINPUT_VERSION, DIRECTINPUT_VERSION,
&IID_IDirectInput8W, &IID_IDirectInput8W,
@ -149,8 +108,7 @@ HRESULT idac_di_init(
NULL); NULL);
if (FAILED(hr)) { if (FAILED(hr)) {
dprintf("DirectInput: API create failed: %08x\n", (int) hr); dprintf("DirectInput: DirectInput8Create failed: %08x\n", (int)hr);
return hr; return hr;
} }

View File

@ -1,11 +1,5 @@
#include <windows.h> #include <windows.h>
#include <dinput.h>
#include <assert.h> #include <assert.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <wchar.h>
#include "swdcio/backend.h" #include "swdcio/backend.h"
#include "swdcio/config.h" #include "swdcio/config.h"
@ -81,10 +75,6 @@ HRESULT swdc_di_init(
const struct swdc_io_backend **backend) const struct swdc_io_backend **backend)
{ {
HRESULT hr; HRESULT hr;
HMODULE dinput8;
HRESULT (WINAPI *api_entry)(HINSTANCE,DWORD,REFIID,LPVOID *,LPUNKNOWN);
wchar_t dll_path[MAX_PATH];
UINT path_pos;
assert(cfg != NULL); assert(cfg != NULL);
assert(backend != NULL); assert(backend != NULL);
@ -103,38 +93,7 @@ HRESULT swdc_di_init(
return hr; return hr;
} }
/* SWDC has some built-in DirectInput support that is not hr = DirectInput8Create(
particularly useful. swdchook shorts this out by redirecting dinput8.dll
to a no-op implementation of DirectInput. However, swdcio does need to
talk to the real operating system implementation of DirectInput without
the stub DLL interfering, so build a path to
C:\Windows\System32\dinput.dll here. */
dll_path[0] = L'\0';
path_pos = GetSystemDirectoryW(dll_path, _countof(dll_path));
wcscat_s(
dll_path + path_pos,
_countof(dll_path) - path_pos,
L"\\dinput8.dll");
dinput8 = LoadLibraryW(dll_path);
if (dinput8 == NULL) {
hr = HRESULT_FROM_WIN32(GetLastError());
dprintf("DirectInput: LoadLibrary failed: %08x\n", (int) hr);
return hr;
}
api_entry = (void *) GetProcAddress(dinput8, "DirectInput8Create");
if (api_entry == NULL) {
dprintf("DirectInput: GetProcAddress failed\n");
return E_FAIL;
}
hr = api_entry(
inst, inst,
DIRECTINPUT_VERSION, DIRECTINPUT_VERSION,
&IID_IDirectInput8W, &IID_IDirectInput8W,
@ -142,7 +101,7 @@ HRESULT swdc_di_init(
NULL); NULL);
if (FAILED(hr)) { if (FAILED(hr)) {
dprintf("DirectInput: API create failed: %08x\n", (int) hr); dprintf("DirectInput: DirectInput8Create failed: %08x\n", (int) hr);
return hr; return hr;
} }