mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Code cleanup and edits before merging
This commit is contained in:
@@ -494,7 +494,7 @@ void PrintFloatText(fo::GameObject* object, const char* text, long colorText, lo
|
|||||||
|
|
||||||
// print text to surface
|
// print text to surface
|
||||||
void PrintText(char* displayText, BYTE colorIndex, DWORD xPos, DWORD yPos, DWORD txtWidth, DWORD toWidth, BYTE* toSurface) {
|
void PrintText(char* displayText, BYTE colorIndex, DWORD xPos, DWORD yPos, DWORD txtWidth, DWORD toWidth, BYTE* toSurface) {
|
||||||
DWORD posOffset = yPos * toWidth + xPos;
|
DWORD posOffset = (yPos * toWidth) + xPos;
|
||||||
__asm {
|
__asm {
|
||||||
xor eax, eax;
|
xor eax, eax;
|
||||||
mov al, colorIndex;
|
mov al, colorIndex;
|
||||||
@@ -504,12 +504,12 @@ void PrintText(char* displayText, BYTE colorIndex, DWORD xPos, DWORD yPos, DWORD
|
|||||||
mov eax, toSurface;
|
mov eax, toSurface;
|
||||||
mov ecx, toWidth;
|
mov ecx, toWidth;
|
||||||
add eax, posOffset;
|
add eax, posOffset;
|
||||||
call dword ptr ds:[FO_VAR_text_to_buf];
|
call dword ptr ds:[FO_VAR_text_to_buf]; // calls FMtext_to_buf_ or GNW_text_to_buf_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrintTextFM(const char* displayText, BYTE colorIndex, DWORD xPos, DWORD yPos, DWORD txtWidth, DWORD toWidth, BYTE* toSurface) {
|
void PrintTextFM(const char* displayText, BYTE colorIndex, DWORD xPos, DWORD yPos, DWORD txtWidth, DWORD toWidth, BYTE* toSurface) {
|
||||||
DWORD posOffset = yPos * toWidth + xPos;
|
DWORD posOffset = (yPos * toWidth) + xPos;
|
||||||
__asm {
|
__asm {
|
||||||
xor eax, eax;
|
xor eax, eax;
|
||||||
mov al, colorIndex;
|
mov al, colorIndex;
|
||||||
|
|||||||
+13
-12
@@ -148,17 +148,6 @@ static void __stdcall SplitPrintMessage(char* message, void* printFunc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __declspec(naked) sf_display_print_alt() {
|
|
||||||
__asm {
|
|
||||||
push ecx;
|
|
||||||
push fo::funcoffs::display_print_;
|
|
||||||
push eax; // message
|
|
||||||
call SplitPrintMessage;
|
|
||||||
pop ecx;
|
|
||||||
retn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __declspec(naked) sf_inven_display_msg() {
|
static void __declspec(naked) sf_inven_display_msg() {
|
||||||
__asm {
|
__asm {
|
||||||
push ecx;
|
push ecx;
|
||||||
@@ -170,12 +159,24 @@ static void __declspec(naked) sf_inven_display_msg() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __declspec(naked) sf_display_print_alt() {
|
||||||
|
__asm {
|
||||||
|
push ecx;
|
||||||
|
push fo::funcoffs::display_print_; // func replaced by HRP
|
||||||
|
push eax; // message
|
||||||
|
call SplitPrintMessage;
|
||||||
|
pop ecx;
|
||||||
|
retn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Text::init() {
|
void Text::init() {
|
||||||
// Support for the newline control character '\n' in the object description in pro_*.msg files
|
|
||||||
void* printFunc = sf_display_print; // for vanilla and HRP 4.1.8
|
void* printFunc = sf_display_print; // for vanilla and HRP 4.1.8
|
||||||
if (sf::versionCHI || (sf::hrpIsEnabled && !sf::hrpVersionValid)) {
|
if (sf::versionCHI || (sf::hrpIsEnabled && !sf::hrpVersionValid)) {
|
||||||
printFunc = sf_display_print_alt;
|
printFunc = sf_display_print_alt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Support for the newline control character '\n' in the object description in pro_*.msg files
|
||||||
sf::SafeWriteBatch<DWORD>((DWORD)printFunc, {0x46ED87, 0x49AD7A}); // setup_inventory_, obj_examine_
|
sf::SafeWriteBatch<DWORD>((DWORD)printFunc, {0x46ED87, 0x49AD7A}); // setup_inventory_, obj_examine_
|
||||||
sf::SafeWrite32(0x472F9A, (DWORD)&sf_inven_display_msg); // inven_obj_examine_func_
|
sf::SafeWrite32(0x472F9A, (DWORD)&sf_inven_display_msg); // inven_obj_examine_func_
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,11 +56,7 @@ DWORD Graphics::mode;
|
|||||||
bool Graphics::PlayAviMovie = false;
|
bool Graphics::PlayAviMovie = false;
|
||||||
bool Graphics::AviMovieWidthFit = false;
|
bool Graphics::AviMovieWidthFit = false;
|
||||||
|
|
||||||
//static DWORD yoffset;
|
|
||||||
//static DWORD xoffset;
|
|
||||||
|
|
||||||
bool DeviceLost = false;
|
bool DeviceLost = false;
|
||||||
//static bool mainTexLock = false; // for preventing a crash during the locked state of the texture
|
|
||||||
static char textureFilter; // 1 - auto, 2 - force
|
static char textureFilter; // 1 - auto, 2 - force
|
||||||
|
|
||||||
static DDSURFACEDESC surfaceDesc;
|
static DDSURFACEDESC surfaceDesc;
|
||||||
@@ -139,16 +135,6 @@ static VertexFormat ShaderVertices[] = {
|
|||||||
{639.5, 479.5, 0, 1, 1, 1} // 3 - bottom right
|
{639.5, 479.5, 0, 1, 1, 1} // 3 - bottom right
|
||||||
};
|
};
|
||||||
|
|
||||||
HWND Graphics::GetFalloutWindowInfo(RECT* rect) {
|
|
||||||
if (rect) {
|
|
||||||
rect->left = windowLeft;
|
|
||||||
rect->top = windowTop;
|
|
||||||
rect->right = gWidth;
|
|
||||||
rect->bottom = gHeight;
|
|
||||||
}
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
long Graphics::GetGameWidthRes() {
|
long Graphics::GetGameWidthRes() {
|
||||||
return (fo::var::scr_size.offx - fo::var::scr_size.x) + 1;
|
return (fo::var::scr_size.offx - fo::var::scr_size.x) + 1;
|
||||||
}
|
}
|
||||||
@@ -195,12 +181,10 @@ static void ResetDevice(bool create) {
|
|||||||
GetDisplayMode(dispMode);
|
GetDisplayMode(dispMode);
|
||||||
|
|
||||||
params.BackBufferCount = 1;
|
params.BackBufferCount = 1;
|
||||||
params.BackBufferFormat = dispMode.Format; // (Graphics::mode != 4) ? D3DFMT_UNKNOWN : D3DFMT_X8R8G8B8;
|
params.BackBufferFormat = dispMode.Format;
|
||||||
params.BackBufferWidth = gWidth;
|
params.BackBufferWidth = gWidth;
|
||||||
params.BackBufferHeight = gHeight;
|
params.BackBufferHeight = gHeight;
|
||||||
params.EnableAutoDepthStencil = false;
|
params.EnableAutoDepthStencil = false;
|
||||||
//params.MultiSampleQuality = 0;
|
|
||||||
//params.MultiSampleType = D3DMULTISAMPLE_NONE;
|
|
||||||
params.Windowed = (Graphics::mode != 4);
|
params.Windowed = (Graphics::mode != 4);
|
||||||
params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
params.SwapEffect = D3DSWAPEFFECT_DISCARD;
|
||||||
params.hDeviceWindow = window;
|
params.hDeviceWindow = window;
|
||||||
@@ -272,7 +256,6 @@ static void ResetDevice(bool create) {
|
|||||||
d3d9Device->Reset(¶ms);
|
d3d9Device->Reset(¶ms);
|
||||||
if (gpuBltEffect) gpuBltEffect->OnResetDevice();
|
if (gpuBltEffect) gpuBltEffect->OnResetDevice();
|
||||||
ScriptShaders::OnResetDevice();
|
ScriptShaders::OnResetDevice();
|
||||||
//mainTexLock = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
d3d9Device->CreateTexture(ResWidth, ResHeight, 1, 0, textureFormat, D3DPOOL_DEFAULT, &mainTexD, 0);
|
d3d9Device->CreateTexture(ResWidth, ResHeight, 1, 0, textureFormat, D3DPOOL_DEFAULT, &mainTexD, 0);
|
||||||
@@ -342,8 +325,6 @@ static DWORD lastTime = GetTickCount();
|
|||||||
static long frameCount;
|
static long frameCount;
|
||||||
static long elapsedTime;
|
static long elapsedTime;
|
||||||
static long fps;
|
static long fps;
|
||||||
//static long palCounter;
|
|
||||||
//static long lockCounter;
|
|
||||||
|
|
||||||
static void CalcFPS() {
|
static void CalcFPS() {
|
||||||
frameCount++;
|
frameCount++;
|
||||||
@@ -560,7 +541,7 @@ void Graphics::ShowMovieFrame(IDirect3DTexture9* tex) {
|
|||||||
d3d9Device->SetRenderTarget(0, backBuffer);
|
d3d9Device->SetRenderTarget(0, backBuffer);
|
||||||
|
|
||||||
d3d9Device->BeginScene();
|
d3d9Device->BeginScene();
|
||||||
//if (!mainTexLock) {
|
|
||||||
if (ScriptShaders::Count() && Graphics::GPUBlt) {
|
if (ScriptShaders::Count() && Graphics::GPUBlt) {
|
||||||
d3d9Device->SetTexture(0, sTex2);
|
d3d9Device->SetTexture(0, sTex2);
|
||||||
} else {
|
} else {
|
||||||
@@ -579,7 +560,7 @@ void Graphics::ShowMovieFrame(IDirect3DTexture9* tex) {
|
|||||||
gpuBltEffect->EndPass();
|
gpuBltEffect->EndPass();
|
||||||
gpuBltEffect->End();
|
gpuBltEffect->End();
|
||||||
}
|
}
|
||||||
//}
|
|
||||||
// for avi movie
|
// for avi movie
|
||||||
d3d9Device->SetTexture(0, movieTex);
|
d3d9Device->SetTexture(0, movieTex);
|
||||||
d3d9Device->SetStreamSource(0, vertexMovie, 0, sizeof(VertexFormat));
|
d3d9Device->SetStreamSource(0, vertexMovie, 0, sizeof(VertexFormat));
|
||||||
@@ -679,15 +660,12 @@ public:
|
|||||||
|
|
||||||
// called 0x4868DA movie_MVE_ShowFrame_ used for game movies (only for w/o HRP by Mash)
|
// called 0x4868DA movie_MVE_ShowFrame_ used for game movies (only for w/o HRP by Mash)
|
||||||
HRESULT __stdcall Blt(LPRECT dst, LPDIRECTDRAWSURFACE b, LPRECT scr, DWORD d, LPDDBLTFX e) {
|
HRESULT __stdcall Blt(LPRECT dst, LPDIRECTDRAWSURFACE b, LPRECT scr, DWORD d, LPDDBLTFX e) {
|
||||||
mveDesc.dwHeight = scr->bottom; //(dst->bottom - dst->top);
|
mveDesc.dwHeight = scr->bottom;
|
||||||
mveDesc.lPitch = scr->right; //(dst->right - dst->left);
|
mveDesc.lPitch = scr->right;
|
||||||
//xoffset = (ResWidth - mveDesc.lPitch) / 2;
|
|
||||||
//yoffset = (ResHeight - mveDesc.dwHeight) / 2;
|
|
||||||
|
|
||||||
//dlog_f("\nBlt: [mveDesc: w:%d, h:%d]", DL_INIT, mveDesc.lPitch, mveDesc.dwHeight);
|
//dlog_f("\nBlt: [mveDesc: w:%d, h:%d]", DL_INIT, mveDesc.lPitch, mveDesc.dwHeight);
|
||||||
|
|
||||||
IsPlayMovie = true;
|
IsPlayMovie = true;
|
||||||
//mainTexLock = true;
|
|
||||||
|
|
||||||
BYTE* lockTarget = ((FakeDirectDrawSurface*)b)->lockTarget;
|
BYTE* lockTarget = ((FakeDirectDrawSurface*)b)->lockTarget;
|
||||||
|
|
||||||
@@ -724,7 +702,6 @@ public:
|
|||||||
//mainTexD->GetSurfaceLevel(0, &mSurfD);
|
//mainTexD->GetSurfaceLevel(0, &mSurfD);
|
||||||
//d3d9Device->StretchRect(mSurf, 0, mSurfD, 0, D3DTEXF_LINEAR);
|
//d3d9Device->StretchRect(mSurf, 0, mSurfD, 0, D3DTEXF_LINEAR);
|
||||||
|
|
||||||
//mainTexLock = false;
|
|
||||||
//if (Graphics::PlayAviMovie) return DD_OK; // Blt method is not executed during avi playback because the sfShowFrame_ function is blocked
|
//if (Graphics::PlayAviMovie) return DD_OK; // Blt method is not executed during avi playback because the sfShowFrame_ function is blocked
|
||||||
|
|
||||||
Refresh();
|
Refresh();
|
||||||
@@ -766,7 +743,6 @@ public:
|
|||||||
D3DLOCKED_RECT buf;
|
D3DLOCKED_RECT buf;
|
||||||
if (SUCCEEDED(mainTex->LockRect(0, &buf, lockRect, D3DLOCK_NO_DIRTY_UPDATE))) {
|
if (SUCCEEDED(mainTex->LockRect(0, &buf, lockRect, D3DLOCK_NO_DIRTY_UPDATE))) {
|
||||||
mainTex->AddDirtyRect(lockRect);
|
mainTex->AddDirtyRect(lockRect);
|
||||||
//mainTexLock = true;
|
|
||||||
b->lpSurface = buf.pBits;
|
b->lpSurface = buf.pBits;
|
||||||
b->lPitch = buf.Pitch;
|
b->lPitch = buf.Pitch;
|
||||||
}
|
}
|
||||||
@@ -809,8 +785,6 @@ public:
|
|||||||
}
|
}
|
||||||
if (DeviceLost) return DD_OK;
|
if (DeviceLost) return DD_OK;
|
||||||
|
|
||||||
//mainTexLock = true;
|
|
||||||
|
|
||||||
D3DLOCKED_RECT dRect;
|
D3DLOCKED_RECT dRect;
|
||||||
mainTex->LockRect(0, &dRect, 0, 0);
|
mainTex->LockRect(0, &dRect, 0, 0);
|
||||||
|
|
||||||
@@ -831,7 +805,7 @@ public:
|
|||||||
|
|
||||||
mainTex->UnlockRect(0);
|
mainTex->UnlockRect(0);
|
||||||
d3d9Device->UpdateTexture(mainTex, mainTexD);
|
d3d9Device->UpdateTexture(mainTex, mainTexD);
|
||||||
//mainTexLock = false;
|
|
||||||
return DD_OK;
|
return DD_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -845,11 +819,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
HRESULT __stdcall Unlock(LPVOID lockSurface) {
|
HRESULT __stdcall Unlock(LPVOID lockSurface) {
|
||||||
if (!isPrimary) return DD_OK;
|
if (!isPrimary) return DD_OK;
|
||||||
//lockCounter++;
|
|
||||||
|
|
||||||
if (Graphics::GPUBlt == 0) {
|
if (Graphics::GPUBlt == 0) {
|
||||||
//mainTexLock = true;
|
|
||||||
|
|
||||||
D3DLOCKED_RECT dRect;
|
D3DLOCKED_RECT dRect;
|
||||||
mainTex->LockRect(0, &dRect, lockRect, D3DLOCK_NO_DIRTY_UPDATE);
|
mainTex->LockRect(0, &dRect, lockRect, D3DLOCK_NO_DIRTY_UPDATE);
|
||||||
mainTex->AddDirtyRect(lockRect);
|
mainTex->AddDirtyRect(lockRect);
|
||||||
@@ -887,8 +858,8 @@ public:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*if (mainTexLock)*/ mainTex->UnlockRect(0);
|
|
||||||
//mainTexLock = false;
|
mainTex->UnlockRect(0);
|
||||||
d3d9Device->UpdateTexture(mainTex, mainTexD);
|
d3d9Device->UpdateTexture(mainTex, mainTexD);
|
||||||
|
|
||||||
if (!IsPlayMovie && !Graphics::PlayAviMovie) {
|
if (!IsPlayMovie && !Graphics::PlayAviMovie) {
|
||||||
@@ -938,7 +909,6 @@ public:
|
|||||||
*/
|
*/
|
||||||
HRESULT __stdcall SetEntries(DWORD a, DWORD b, DWORD c, LPPALETTEENTRY d) { // used to set palette for splash screen, fades, subtitles
|
HRESULT __stdcall SetEntries(DWORD a, DWORD b, DWORD c, LPPALETTEENTRY d) { // used to set palette for splash screen, fades, subtitles
|
||||||
if (!paletteInit || (long)c <= 0) return DDERR_INVALIDPARAMS;
|
if (!paletteInit || (long)c <= 0) return DDERR_INVALIDPARAMS;
|
||||||
//palCounter++;
|
|
||||||
|
|
||||||
fo::PALETTE* destPal = (fo::PALETTE*)d;
|
fo::PALETTE* destPal = (fo::PALETTE*)d;
|
||||||
|
|
||||||
@@ -971,6 +941,7 @@ public:
|
|||||||
destPal++;
|
destPal++;
|
||||||
b++;
|
b++;
|
||||||
} while (--c);
|
} while (--c);
|
||||||
|
|
||||||
primarySurface->SetPalette(0); // update texture
|
primarySurface->SetPalette(0); // update texture
|
||||||
if (FakeDirectDrawSurface::IsPlayMovie) return DD_OK; // prevents flickering at the beginning of playback (w/o HRP & GPUBlt=2)
|
if (FakeDirectDrawSurface::IsPlayMovie) return DD_OK; // prevents flickering at the beginning of playback (w/o HRP & GPUBlt=2)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ public:
|
|||||||
static DWORD mode;
|
static DWORD mode;
|
||||||
static DWORD GPUBlt;
|
static DWORD GPUBlt;
|
||||||
|
|
||||||
static HWND GetFalloutWindowInfo(RECT* rect);
|
|
||||||
static long GetGameWidthRes();
|
static long GetGameWidthRes();
|
||||||
static long GetGameHeightRes();
|
static long GetGameHeightRes();
|
||||||
|
|
||||||
|
|||||||
@@ -1053,10 +1053,8 @@ void Interface::init() {
|
|||||||
// Transparent/Hidden - will not toggle the mouse cursor when the cursor hovers over a transparent/hidden window
|
// Transparent/Hidden - will not toggle the mouse cursor when the cursor hovers over a transparent/hidden window
|
||||||
// ScriptWindow - prevents the player from moving when clicking on the window if the 'Transparent' flag is not set
|
// ScriptWindow - prevents the player from moving when clicking on the window if the 'Transparent' flag is not set
|
||||||
HookCall(0x44B737, gmouse_bk_process_hook);
|
HookCall(0x44B737, gmouse_bk_process_hook);
|
||||||
LoadGameHook::OnBeforeGameInit() += []() {
|
|
||||||
if (hrpVersionValid) IFACE_BAR_MODE = (GetIntHRPValue(HRP_VAR_IFACE_BAR_MODE) != 0);
|
|
||||||
HookCall(0x44C018, gmouse_handle_event_hook); // replaces hack function from HRP
|
HookCall(0x44C018, gmouse_handle_event_hook); // replaces hack function from HRP
|
||||||
};
|
if (hrpVersionValid) IFACE_BAR_MODE = (GetIntHRPValue(HRP_VAR_IFACE_BAR_MODE) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Interface::exit() {
|
void Interface::exit() {
|
||||||
|
|||||||
@@ -151,8 +151,8 @@ static void __declspec(naked) game_init_databases_hack2() {
|
|||||||
mov eax, ds:[FO_VAR_master_db_handle]; // pointer to master_patches node
|
mov eax, ds:[FO_VAR_master_db_handle]; // pointer to master_patches node
|
||||||
mov eax, [eax]; // eax = master_patches.path
|
mov eax, [eax]; // eax = master_patches.path
|
||||||
call fo::funcoffs::xremovepath_;
|
call fo::funcoffs::xremovepath_;
|
||||||
dec eax; // remove path (critter_patches == master_patches)?
|
dec eax; // 1 = remove path (critter_patches == master_patches)?
|
||||||
jz end; // Yes (jump if 0)
|
jz end; // yes (jump if removed)
|
||||||
mov ecx, [esp + 0x104 + 4]; // path_patches
|
mov ecx, [esp + 0x104 + 4]; // path_patches
|
||||||
call RemoveDatabase;
|
call RemoveDatabase;
|
||||||
end:
|
end:
|
||||||
@@ -184,6 +184,26 @@ static void __fastcall game_init_databases_hook() { // eax = _master_db_handle
|
|||||||
}
|
}
|
||||||
master_patches->next = paths; // master_patches.next -> paths
|
master_patches->next = paths; // master_patches.next -> paths
|
||||||
fo::var::paths = master_patches; // set master_patches node at the beginning of the chain of paths
|
fo::var::paths = master_patches; // set master_patches node at the beginning of the chain of paths
|
||||||
|
|
||||||
|
// remove paths that are identical to master_patches (usually the DATA folder)
|
||||||
|
fo::PathNode* parentPath = fo::var::paths;
|
||||||
|
paths = parentPath->next;
|
||||||
|
while (paths) {
|
||||||
|
if (!paths->isDat && _stricmp(paths->path, fo::var::paths->path) == 0) {
|
||||||
|
auto nextPaths = paths->next;
|
||||||
|
__asm {
|
||||||
|
mov eax, [paths];
|
||||||
|
call fo::funcoffs::nfree_; // free path string
|
||||||
|
mov eax, paths;
|
||||||
|
call fo::funcoffs::nfree_; // free self
|
||||||
|
}
|
||||||
|
parentPath->next = nextPaths;
|
||||||
|
paths = nextPaths;
|
||||||
|
} else {
|
||||||
|
parentPath = paths;
|
||||||
|
paths = paths->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
static void __fastcall game_init_databases_hook1() {
|
static void __fastcall game_init_databases_hook1() {
|
||||||
|
|||||||
+9
-5
@@ -20,12 +20,16 @@
|
|||||||
|
|
||||||
extern ddrawDll ddraw;
|
extern ddrawDll ddraw;
|
||||||
|
|
||||||
typedef HRESULT (__stdcall *DDrawCreateProc)(void* a, void* b, void* c);
|
//typedef HRESULT (__stdcall *DDrawCreateProc)(DWORD a, IDirectDraw* b, DWORD c);
|
||||||
|
|
||||||
HRESULT __stdcall FakeDirectDrawCreate(void* a, void* b, void* c) {
|
//HRESULT __stdcall FakeDirectDrawCreate(DWORD a, IDirectDraw* b, DWORD c) {
|
||||||
DDrawCreateProc proc = (DDrawCreateProc)ddraw.DirectDrawCreate;
|
// DDrawCreateProc proc = (DDrawCreateProc)ddraw.DirectDrawCreate;
|
||||||
if (!proc) return -1;
|
// if (!proc) return -1;
|
||||||
return proc(a, b, c);
|
// return proc(a, b, c);
|
||||||
|
//}
|
||||||
|
|
||||||
|
__declspec(naked) void FakeDirectDrawCreate() {
|
||||||
|
__asm jmp [ddraw.DirectDrawCreate];
|
||||||
}
|
}
|
||||||
|
|
||||||
__declspec(naked) void FakeAcquireDDThreadLock() {
|
__declspec(naked) void FakeAcquireDDThreadLock() {
|
||||||
|
|||||||
Reference in New Issue
Block a user