- Fix KOF98, more D:\ stuff
- Fix KOF98 to be able to run from D:\ - Additional improvements, more games should work without D:\ drive now - fix a typo
This commit is contained in:
parent
db4d013de5
commit
a2eacb82a4
@ -276,6 +276,17 @@ static InitFunction initFunction_RumbleFish2([]()
|
|||||||
#endif
|
#endif
|
||||||
}, GameID::RumbleFish2);
|
}, GameID::RumbleFish2);
|
||||||
|
|
||||||
|
static InitFunction initFunction_KOF98Nesica([]()
|
||||||
|
{
|
||||||
|
init_FastIoEmu();
|
||||||
|
init_RfidEmu();
|
||||||
|
init_RegHooks();
|
||||||
|
init_NesysEmu();
|
||||||
|
#if _M_IX86
|
||||||
|
init_CryptoPipe(GameDetect::NesicaKey);
|
||||||
|
#endif
|
||||||
|
}, GameID::KOF98Nesica);
|
||||||
|
|
||||||
static InitFunction initFunction_Theatrhythm([]()
|
static InitFunction initFunction_Theatrhythm([]()
|
||||||
{
|
{
|
||||||
uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0);
|
uintptr_t imageBase = (uintptr_t)GetModuleHandleA(0);
|
||||||
|
@ -6,6 +6,8 @@
|
|||||||
#include <queue>
|
#include <queue>
|
||||||
#include "Utility/GameDetect.h"
|
#include "Utility/GameDetect.h"
|
||||||
|
|
||||||
|
using namespace std::string_literals;
|
||||||
|
|
||||||
#define JVS_TRUE 0x01
|
#define JVS_TRUE 0x01
|
||||||
#define JVS_FALSE 0x00
|
#define JVS_FALSE 0x00
|
||||||
#define JVS_SYNC_CODE 0xE0
|
#define JVS_SYNC_CODE 0xE0
|
||||||
@ -845,6 +847,36 @@ LPCSTR ParseFileNamesA(LPCSTR lpFileName)
|
|||||||
return lpFileName;
|
return lpFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GameDetect::currentGame == GameID::KOF98Nesica)
|
||||||
|
{
|
||||||
|
if (!strncmp(lpFileName, "d:/SettingKOF98UM", 17) || !strncmp(lpFileName, "d:/RankingKOF98UM", 17) || !strncmp(lpFileName, "d:/CoinFileKOF98UM", 18))
|
||||||
|
{
|
||||||
|
//info(true, "ParseFileNamesA !!!!!SettingKOF98UM!!!: %s", lpFileName, lpFileName); // OK
|
||||||
|
|
||||||
|
memset(moveBuf, 0, 256);
|
||||||
|
if (lpFileName[2] == '\\' || lpFileName[2] == '/')
|
||||||
|
{
|
||||||
|
sprintf(moveBuf, ".\\OpenParrot\\%s", lpFileName + 3);
|
||||||
|
info(true, "ParseFileNamesA: %s -> .\\OpenParrot\\%s", lpFileName, lpFileName + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return moveBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strncmp(lpFileName, "SettingKOF98UM*.txt", 19) || !strncmp(lpFileName, "RankingKOF98UM*.txt", 19) || !strncmp(lpFileName, "CoinFileKOF98UM*.txt", 20))
|
||||||
|
{
|
||||||
|
//info(true, "ParseFileNamesA ASTERISK: %s", lpFileName, lpFileName); // OK
|
||||||
|
|
||||||
|
memset(moveBuf, 0, 256);
|
||||||
|
sprintf(moveBuf, ".\\OpenParrot\\%s", lpFileName);
|
||||||
|
info(true, "ParseFileNamesA ASTERISK: %s -> .\\OpenParrot\\%s", lpFileName, lpFileName);
|
||||||
|
|
||||||
|
return moveBuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lpFileName;
|
||||||
|
}
|
||||||
|
|
||||||
if (!strncmp(lpFileName, "D:", 2) || !strncmp(lpFileName, "d:", 2))
|
if (!strncmp(lpFileName, "D:", 2) || !strncmp(lpFileName, "d:", 2))
|
||||||
{
|
{
|
||||||
memset(moveBuf, 0, 256);
|
memset(moveBuf, 0, 256);
|
||||||
@ -924,7 +956,7 @@ LPCWSTR ParseFileNamesW(LPCWSTR lpFileName)
|
|||||||
{
|
{
|
||||||
//info(true, "ParseFileNamesW: %s", lpFileName);
|
//info(true, "ParseFileNamesW: %s", lpFileName);
|
||||||
|
|
||||||
if (!wcsncmp(lpFileName, L"D:\\eb342", 4))
|
if (!wcsncmp(lpFileName, L"D:\\eb342", 8))
|
||||||
{
|
{
|
||||||
memset(moveBufW, 0, 256);
|
memset(moveBufW, 0, 256);
|
||||||
if (lpFileName[3] == 'e')
|
if (lpFileName[3] == 'e')
|
||||||
@ -938,6 +970,36 @@ LPCWSTR ParseFileNamesW(LPCWSTR lpFileName)
|
|||||||
return lpFileName;
|
return lpFileName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GameDetect::currentGame == GameID::KOF98Nesica)
|
||||||
|
{
|
||||||
|
if (!wcsncmp(lpFileName, L"d:/SettingKOF98UM", 17) || !wcsncmp(lpFileName, L"d:/RankingKOF98UM", 17) || !wcsncmp(lpFileName, L"d:/CoinFileKOF98UM", 18))
|
||||||
|
{
|
||||||
|
//info(true, "ParseFileNamesA !!!!!SettingKOF98UM!!!: %s", lpFileName, lpFileName); // OK
|
||||||
|
|
||||||
|
memset(moveBufW, 0, 256);
|
||||||
|
if (lpFileName[2] == '\\' || lpFileName[2] == '/')
|
||||||
|
{
|
||||||
|
swprintf(moveBufW, L".\\OpenParrot\\%s", lpFileName + 3);
|
||||||
|
info(true, "ParseFileNamesA: %s -> .\\OpenParrot\\%s", lpFileName, lpFileName + 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
return moveBufW;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wcsncmp(lpFileName, L"SettingKOF98UM*.txt", 19) || !wcsncmp(lpFileName, L"RankingKOF98UM*.txt", 19) || !wcsncmp(lpFileName, L"CoinFileKOF98UM*.txt", 20))
|
||||||
|
{
|
||||||
|
//info(true, "ParseFileNamesA ASTERISK: %s", lpFileName, lpFileName); // OK
|
||||||
|
|
||||||
|
memset(moveBufW, 0, 256);
|
||||||
|
swprintf(moveBufW, L".\\OpenParrot\\%s", lpFileName);
|
||||||
|
info(true, "ParseFileNamesA ASTERISK: %s -> .\\OpenParrot\\%s", lpFileName, lpFileName);
|
||||||
|
|
||||||
|
return moveBufW;
|
||||||
|
}
|
||||||
|
|
||||||
|
return lpFileName;
|
||||||
|
}
|
||||||
|
|
||||||
if (!wcsncmp(lpFileName, L"D:", 2) || !wcsncmp(lpFileName, L"d:", 2))
|
if (!wcsncmp(lpFileName, L"D:", 2) || !wcsncmp(lpFileName, L"d:", 2))
|
||||||
{
|
{
|
||||||
memset(moveBufW, 0, 256);
|
memset(moveBufW, 0, 256);
|
||||||
@ -1105,6 +1167,7 @@ static HANDLE __stdcall FindFirstFileAWrap(
|
|||||||
{
|
{
|
||||||
return g_origFindFirstFileA(lpFileName, lpFindFileData);
|
return g_origFindFirstFileA(lpFileName, lpFindFileData);
|
||||||
}
|
}
|
||||||
|
|
||||||
return g_origFindFirstFileA(ParseFileNamesA(lpFileName), lpFindFileData);
|
return g_origFindFirstFileA(ParseFileNamesA(lpFileName), lpFindFileData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1146,6 +1209,29 @@ static BOOL __stdcall DeleteFileWWrap(LPCWSTR lpFileName) // seems to be used by
|
|||||||
return g_origDeleteFileW(ParseFileNamesW(lpFileName));
|
return g_origDeleteFileW(ParseFileNamesW(lpFileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HANDLE(__stdcall* g_origFindFirstFileExA)(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags);
|
||||||
|
static HANDLE __stdcall FindFirstFileExAWrap(LPCSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags)
|
||||||
|
{
|
||||||
|
return g_origFindFirstFileExA(ParseFileNamesA(lpFileName), fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HANDLE(__stdcall* g_origFindFirstFileExW)(LPCWSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags);
|
||||||
|
static HANDLE __stdcall FindFirstFileExWWrap(LPCWSTR lpFileName, FINDEX_INFO_LEVELS fInfoLevelId, LPVOID lpFindFileData, FINDEX_SEARCH_OPS fSearchOp, LPVOID lpSearchFilter, DWORD dwAdditionalFlags)
|
||||||
|
{
|
||||||
|
return g_origFindFirstFileExW(ParseFileNamesW(lpFileName), fInfoLevelId, lpFindFileData, fSearchOp, lpSearchFilter, dwAdditionalFlags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL(__stdcall* g_origSetCurrentDirectoryA)(LPCSTR lpPathName);
|
||||||
|
static BOOL __stdcall SetCurrentDirectoryAWrap(LPCSTR lpPathName)
|
||||||
|
{
|
||||||
|
char pathRoot[MAX_PATH];
|
||||||
|
GetModuleFileNameA(GetModuleHandleA(nullptr), pathRoot, _countof(pathRoot)); // get full pathname to game executable
|
||||||
|
|
||||||
|
strrchr(pathRoot, '\\')[0] = '\0'; // chop off everything from the last backslash.
|
||||||
|
|
||||||
|
return g_origSetCurrentDirectoryA((pathRoot + ""s).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
static DWORD WINAPI InsertCardThread(LPVOID)
|
static DWORD WINAPI InsertCardThread(LPVOID)
|
||||||
{
|
{
|
||||||
static bool keyDown;
|
static bool keyDown;
|
||||||
@ -1196,6 +1282,9 @@ void init_RfidEmu()
|
|||||||
MH_CreateHookApi(L"kernel32.dll", "GetDiskFreeSpaceExW", GetDiskFreeSpaceExWWrap, (void**)&g_origGetDiskFreeSpaceExW);
|
MH_CreateHookApi(L"kernel32.dll", "GetDiskFreeSpaceExW", GetDiskFreeSpaceExWWrap, (void**)&g_origGetDiskFreeSpaceExW);
|
||||||
MH_CreateHookApi(L"kernel32.dll", "DeleteFileA", DeleteFileAWrap, (void**)&g_origDeleteFileA);
|
MH_CreateHookApi(L"kernel32.dll", "DeleteFileA", DeleteFileAWrap, (void**)&g_origDeleteFileA);
|
||||||
MH_CreateHookApi(L"kernel32.dll", "DeleteFileW", DeleteFileWWrap, (void**)&g_origDeleteFileW);
|
MH_CreateHookApi(L"kernel32.dll", "DeleteFileW", DeleteFileWWrap, (void**)&g_origDeleteFileW);
|
||||||
|
MH_CreateHookApi(L"kernel32.dll", "FindFirstFileExA", FindFirstFileExAWrap, (void**)&g_origFindFirstFileExA);
|
||||||
|
MH_CreateHookApi(L"kernel32.dll", "FindFirstFileExW", FindFirstFileExWWrap, (void**)&g_origFindFirstFileExW);
|
||||||
|
MH_CreateHookApi(L"kernel32.dll", "SetCurrentDirectoryA", SetCurrentDirectoryAWrap, (void**)&g_origSetCurrentDirectoryA);
|
||||||
MH_EnableHook(MH_ALL_HOOKS);
|
MH_EnableHook(MH_ALL_HOOKS);
|
||||||
|
|
||||||
CreateThread(0, 0, InsertCardThread, 0, 0, 0);
|
CreateThread(0, 0, InsertCardThread, 0, 0, 0);
|
||||||
|
@ -520,7 +520,7 @@ void GameDetect::DetectCurrentGame()
|
|||||||
X2Type = X2Type::Generic;
|
X2Type = X2Type::Generic;
|
||||||
break;
|
break;
|
||||||
case 0x3806e8f4: //KoF98 (has files that need to be deleted to run)
|
case 0x3806e8f4: //KoF98 (has files that need to be deleted to run)
|
||||||
currentGame = GameID::Nesica;
|
currentGame = GameID::KOF98Nesica;
|
||||||
NesicaKey = NesicaKey::None;
|
NesicaKey = NesicaKey::None;
|
||||||
isNesica = true;
|
isNesica = true;
|
||||||
break;
|
break;
|
||||||
|
@ -77,5 +77,6 @@ enum class GameID
|
|||||||
HyperStreetFighterII,
|
HyperStreetFighterII,
|
||||||
StreetFigherZero3,
|
StreetFigherZero3,
|
||||||
StreetFighter3rdStrike,
|
StreetFighter3rdStrike,
|
||||||
RumbleFish2
|
RumbleFish2,
|
||||||
|
KOF98Nesica
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user