mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
More code style fixes and some wrappers.
This commit is contained in:
@@ -137,6 +137,7 @@ enum Gender
|
||||
// Some global variables referenced by engine
|
||||
enum GlobalVar : __int32
|
||||
{
|
||||
GVAR_PLAYER_REPUTATION = 0,
|
||||
GVAR_ENEMY_ARROYO = 7,
|
||||
GVAR_PLAYER_GOT_CAR = 18,
|
||||
GVAR_NUKA_COLA_ADDICT = 21,
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
// TODO: make consistent naming for all FO structs
|
||||
|
||||
struct TGameObj;
|
||||
struct TProgram;
|
||||
struct TScript;
|
||||
|
||||
/* 26 */
|
||||
#pragma pack(push, 1)
|
||||
@@ -102,7 +104,7 @@ struct TScript {
|
||||
__int32 spatial_radius;
|
||||
char gap_10[4];
|
||||
__int32 script_index;
|
||||
__int32 program_ptr;
|
||||
TProgram *program_ptr;
|
||||
__int32 self_obj_id;
|
||||
char gap_20[8];
|
||||
__int32 scr_return;
|
||||
|
||||
@@ -288,6 +288,18 @@ DWORD* __stdcall runProgram(TProgram* progPtr) {
|
||||
_WRAP_WATCOM_CALL1(runProgram_, progPtr)
|
||||
}
|
||||
|
||||
TScript* __stdcall scr_find_first_at(int elevation) {
|
||||
_WRAP_WATCOM_CALL1(scr_find_first_at_, elevation)
|
||||
}
|
||||
|
||||
TScript* __stdcall scr_find_next_at() {
|
||||
_WRAP_WATCOM_CALL0(scr_find_next_at_)
|
||||
}
|
||||
|
||||
TGameObj* __stdcall scr_find_obj_from_program(TProgram* program) {
|
||||
_WRAP_WATCOM_CALL1(scr_find_obj_from_program_, program)
|
||||
}
|
||||
|
||||
// Saves pointer to script object into scriptPtr using scriptID.
|
||||
// Returns 0 on success, -1 on failure.
|
||||
int __stdcall scr_ptr(int scriptId, TScript** scriptPtr) {
|
||||
|
||||
@@ -169,6 +169,12 @@ int proto_ptr(int pid, sProtoBase* *ptrPtr);
|
||||
|
||||
DWORD* __stdcall runProgram(TProgram* progPtr);
|
||||
|
||||
TScript* __stdcall scr_find_first_at(int elevation);
|
||||
|
||||
TScript* __stdcall scr_find_next_at();
|
||||
|
||||
TGameObj* __stdcall scr_find_obj_from_program(TProgram* program);
|
||||
|
||||
// Saves pointer to script object into scriptPtr using scriptID.
|
||||
// Returns 0 on success, -1 on failure.
|
||||
int __stdcall scr_ptr(int scriptId, TScript** scriptPtr);
|
||||
|
||||
+204
-126
@@ -54,15 +54,19 @@ static DWORD KeysDown[MAX_KEYS];
|
||||
static int mouseX;
|
||||
static int mouseY;
|
||||
|
||||
static DWORD ForcingGraphicsRefresh=0;
|
||||
static DWORD ForcingGraphicsRefresh = 0;
|
||||
|
||||
static DWORD DebugEditorKey=0;
|
||||
static DWORD DebugEditorKey = 0;
|
||||
|
||||
void _stdcall ForceGraphicsRefresh(DWORD d) { ForcingGraphicsRefresh=(d==0)?0:1; }
|
||||
void GetMouse(int* x, int* y) { *x=mouseX; *y=mouseY; mouseX=0; mouseY=0; }
|
||||
void _stdcall ForceGraphicsRefresh(DWORD d) {
|
||||
ForcingGraphicsRefresh = (d == 0) ? 0 : 1;
|
||||
}
|
||||
void GetMouse(int* x, int* y) {
|
||||
*x = mouseX; *y = mouseY; mouseX = 0; mouseY = 0;
|
||||
}
|
||||
|
||||
static BYTE LMouse=0;
|
||||
static BYTE RMouse=0;
|
||||
static BYTE LMouse = 0;
|
||||
static BYTE RMouse = 0;
|
||||
static int MPMouseX;
|
||||
static int MPMouseY;
|
||||
|
||||
@@ -74,12 +78,12 @@ static std::queue<DIDEVICEOBJECTDATA> bufferedPresses;
|
||||
static HKL keyboardLayout;
|
||||
|
||||
void SetMDown(bool down, bool right) {
|
||||
if(right) RMouse=down?0x80:0;
|
||||
else LMouse=down?0x80:0;
|
||||
if (right) RMouse = down ? 0x80 : 0;
|
||||
else LMouse = down ? 0x80 : 0;
|
||||
}
|
||||
void SetMPos(int x, int y) {
|
||||
MPMouseX=x;
|
||||
MPMouseY=y;
|
||||
MPMouseX = x;
|
||||
MPMouseY = y;
|
||||
}
|
||||
|
||||
DWORD _stdcall KeyDown(DWORD key) {
|
||||
@@ -102,12 +106,12 @@ DWORD _stdcall KeyDown(DWORD key) {
|
||||
|
||||
void _stdcall TapKey(DWORD key) {
|
||||
DIDEVICEOBJECTDATA data;
|
||||
data.dwTimeStamp=0;
|
||||
data.dwSequence=0;
|
||||
data.dwOfs=key;
|
||||
data.dwData=0x80;
|
||||
data.dwTimeStamp = 0;
|
||||
data.dwSequence = 0;
|
||||
data.dwOfs = key;
|
||||
data.dwData = 0x80;
|
||||
bufferedPresses.push(data);
|
||||
data.dwData=0x00;
|
||||
data.dwData = 0x00;
|
||||
bufferedPresses.push(data);
|
||||
}
|
||||
|
||||
@@ -118,6 +122,7 @@ private:
|
||||
ULONG Refs;
|
||||
bool formatLock;
|
||||
DIDATAFORMAT oldFormat;
|
||||
|
||||
public:
|
||||
/*** Constructor and misc functions ***/
|
||||
FakeDirectInputDevice(IDirectInputDevice* device,DWORD type) {
|
||||
@@ -127,208 +132,281 @@ public:
|
||||
formatLock = false;
|
||||
oldFormat.dwDataSize=0;
|
||||
}
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
HRESULT _stdcall QueryInterface (REFIID riid, LPVOID * ppvObj) { return RealDevice->QueryInterface(riid,ppvObj); }
|
||||
ULONG _stdcall AddRef(void) { return ++Refs; }
|
||||
HRESULT _stdcall QueryInterface(REFIID riid, LPVOID * ppvObj) {
|
||||
return RealDevice->QueryInterface(riid, ppvObj);
|
||||
}
|
||||
|
||||
ULONG _stdcall AddRef(void) {
|
||||
return ++Refs;
|
||||
}
|
||||
|
||||
ULONG _stdcall Release(void) {
|
||||
if(--Refs==0) {
|
||||
if (--Refs == 0) {
|
||||
RealDevice->Release();
|
||||
delete this;
|
||||
return 0;
|
||||
} else { return Refs; }
|
||||
} else {
|
||||
return Refs;
|
||||
}
|
||||
}
|
||||
|
||||
/*** IDirectInputDevice8A methods ***/
|
||||
HRESULT _stdcall GetCapabilities(LPDIDEVCAPS a) { return RealDevice->GetCapabilities(a); }
|
||||
HRESULT _stdcall EnumObjects(LPDIENUMDEVICEOBJECTSCALLBACKA a,LPVOID b,DWORD c) { return RealDevice->EnumObjects(a,b,c); }
|
||||
HRESULT _stdcall GetProperty(REFGUID a,DIPROPHEADER* b) { return RealDevice->GetProperty(a,b); }
|
||||
HRESULT _stdcall SetProperty(REFGUID a,const DIPROPHEADER* b) { return RealDevice->SetProperty(a,b); }
|
||||
HRESULT _stdcall Acquire(void) { return RealDevice->Acquire(); }
|
||||
HRESULT _stdcall Unacquire(void) { return RealDevice->Unacquire(); }
|
||||
//Only called for the mouse
|
||||
HRESULT _stdcall GetDeviceState(DWORD a,LPVOID b) {
|
||||
if(ForcingGraphicsRefresh) RefreshGraphics();
|
||||
if(DeviceType!=kDeviceType_MOUSE) {
|
||||
return RealDevice->GetDeviceState(a,b);
|
||||
HRESULT _stdcall GetCapabilities(LPDIDEVCAPS a) {
|
||||
return RealDevice->GetCapabilities(a);
|
||||
}
|
||||
|
||||
HRESULT _stdcall EnumObjects(LPDIENUMDEVICEOBJECTSCALLBACKA a, LPVOID b, DWORD c) {
|
||||
return RealDevice->EnumObjects(a, b, c);
|
||||
}
|
||||
|
||||
HRESULT _stdcall GetProperty(REFGUID a, DIPROPHEADER* b) {
|
||||
return RealDevice->GetProperty(a, b);
|
||||
}
|
||||
|
||||
HRESULT _stdcall SetProperty(REFGUID a, const DIPROPHEADER* b) {
|
||||
return RealDevice->SetProperty(a, b);
|
||||
}
|
||||
|
||||
HRESULT _stdcall Acquire(void) {
|
||||
return RealDevice->Acquire();
|
||||
}
|
||||
|
||||
HRESULT _stdcall Unacquire(void) {
|
||||
return RealDevice->Unacquire();
|
||||
}
|
||||
|
||||
//Only called for the mouse
|
||||
HRESULT _stdcall GetDeviceState(DWORD a, LPVOID b) {
|
||||
if (ForcingGraphicsRefresh) RefreshGraphics();
|
||||
if (DeviceType != kDeviceType_MOUSE) {
|
||||
return RealDevice->GetDeviceState(a, b);
|
||||
}
|
||||
|
||||
DIMOUSESTATE2 MouseState;
|
||||
HRESULT hr;
|
||||
int numButtons;
|
||||
if(formatLock) hr=RealDevice->GetDeviceState(sizeof(DIMOUSESTATE2), &MouseState);
|
||||
else hr=RealDevice->GetDeviceState(sizeof(DIMOUSESTATE), &MouseState);
|
||||
if(FAILED(hr)) return hr;
|
||||
if(ReverseMouse) {
|
||||
BYTE tmp=MouseState.rgbButtons[0];
|
||||
MouseState.rgbButtons[0]=MouseState.rgbButtons[1];
|
||||
MouseState.rgbButtons[1]=tmp;
|
||||
if (formatLock) hr = RealDevice->GetDeviceState(sizeof(DIMOUSESTATE2), &MouseState);
|
||||
else hr = RealDevice->GetDeviceState(sizeof(DIMOUSESTATE), &MouseState);
|
||||
if (FAILED(hr)) return hr;
|
||||
if (ReverseMouse) {
|
||||
BYTE tmp = MouseState.rgbButtons[0];
|
||||
MouseState.rgbButtons[0] = MouseState.rgbButtons[1];
|
||||
MouseState.rgbButtons[1] = tmp;
|
||||
}
|
||||
if(AdjustMouseSpeed) {
|
||||
double d=((double)MouseState.lX)*MouseSpeedMod + MousePartX;
|
||||
if (AdjustMouseSpeed) {
|
||||
double d = ((double)MouseState.lX)*MouseSpeedMod + MousePartX;
|
||||
MousePartX = modf(d, &d);
|
||||
MouseState.lX=(LONG)d;
|
||||
d=((double)MouseState.lY)*MouseSpeedMod + MousePartY;
|
||||
MouseState.lX = (LONG)d;
|
||||
d = ((double)MouseState.lY)*MouseSpeedMod + MousePartY;
|
||||
MousePartY = modf(d, &d);
|
||||
MouseState.lY=(LONG)d;
|
||||
MouseState.lY = (LONG)d;
|
||||
}
|
||||
if(UseScrollWheel) {
|
||||
if(MouseState.lZ>0) {
|
||||
if (UseScrollWheel) {
|
||||
if (MouseState.lZ > 0) {
|
||||
int count;
|
||||
if(WheelMod) count=MouseState.lZ/WheelMod;
|
||||
else count=1;
|
||||
while(count--) TapKey(DIK_UP);
|
||||
} else if(MouseState.lZ<0) {
|
||||
if (WheelMod) count = MouseState.lZ / WheelMod;
|
||||
else count = 1;
|
||||
while (count--) TapKey(DIK_UP);
|
||||
} else if (MouseState.lZ < 0) {
|
||||
int count;
|
||||
if(WheelMod) count=(-MouseState.lZ)/WheelMod;
|
||||
else count=1;
|
||||
while(count--) TapKey(DIK_DOWN);
|
||||
if (WheelMod) count = (-MouseState.lZ) / WheelMod;
|
||||
else count = 1;
|
||||
while (count--) TapKey(DIK_DOWN);
|
||||
}
|
||||
}
|
||||
if(MiddleMouseKey&&MouseState.rgbButtons[2]) {
|
||||
if(!MiddleMouseDown) {
|
||||
if (MiddleMouseKey&&MouseState.rgbButtons[2]) {
|
||||
if (!MiddleMouseDown) {
|
||||
TapKey(MiddleMouseKey);
|
||||
MiddleMouseDown=true;
|
||||
MiddleMouseDown = true;
|
||||
}
|
||||
} else MiddleMouseDown=false;
|
||||
mouseX=MouseState.lX;
|
||||
mouseY=MouseState.lY;
|
||||
} else MiddleMouseDown = false;
|
||||
mouseX = MouseState.lX;
|
||||
mouseY = MouseState.lY;
|
||||
|
||||
numButtons = formatLock ? 8 : 4;
|
||||
for(int i=0;i<numButtons;i++) {
|
||||
if ((MouseState.rgbButtons[i] & 0x80) != (KeysDown[256+i] & 0x80)) { // state changed
|
||||
for (int i = 0; i < numButtons; i++) {
|
||||
if ((MouseState.rgbButtons[i] & 0x80) != (KeysDown[256 + i] & 0x80)) { // state changed
|
||||
MouseClickHook(i, (MouseState.rgbButtons[i] & 0x80) > 0);
|
||||
}
|
||||
KeysDown[256+i]=MouseState.rgbButtons[i];
|
||||
KeysDown[256 + i] = MouseState.rgbButtons[i];
|
||||
}
|
||||
memcpy(b, &MouseState, sizeof(DIMOUSESTATE));
|
||||
return 0;
|
||||
}
|
||||
|
||||
//Only called for the keyboard
|
||||
HRESULT _stdcall GetDeviceData(DWORD a,DIDEVICEOBJECTDATA* b,DWORD* c,DWORD d) {
|
||||
if(DeviceType!=kDeviceType_KEYBOARD) {
|
||||
return RealDevice->GetDeviceData(a,b,c,d);
|
||||
HRESULT _stdcall GetDeviceData(DWORD a, DIDEVICEOBJECTDATA* b, DWORD* c, DWORD d) {
|
||||
if (DeviceType != kDeviceType_KEYBOARD) {
|
||||
return RealDevice->GetDeviceData(a, b, c, d);
|
||||
}
|
||||
|
||||
RunGlobalScripts2();
|
||||
|
||||
if(!b||bufferedPresses.empty()||(d&DIGDD_PEEK)) {
|
||||
HRESULT hr=RealDevice->GetDeviceData(a,b,c,d);
|
||||
if(FAILED(hr)||!b||!(*c)) return hr;
|
||||
for(DWORD i=0;i<*c;i++) {
|
||||
KeysDown[b[i].dwOfs]=b[i].dwData&0x80;
|
||||
if (!b || bufferedPresses.empty() || (d&DIGDD_PEEK)) {
|
||||
HRESULT hr = RealDevice->GetDeviceData(a, b, c, d);
|
||||
if (FAILED(hr) || !b || !(*c)) return hr;
|
||||
for (DWORD i = 0; i < *c; i++) {
|
||||
KeysDown[b[i].dwOfs] = b[i].dwData & 0x80;
|
||||
KeyPressHook(b[i].dwOfs, (b[i].dwData & 0x80) > 0, MapVirtualKeyEx(b[i].dwOfs, MAPVK_VSC_TO_VK, keyboardLayout));
|
||||
}
|
||||
if(KeysDown[DebugEditorKey]) RunDebugEditor();
|
||||
if (KeysDown[DebugEditorKey]) RunDebugEditor();
|
||||
return hr;
|
||||
}
|
||||
//Despite passing an array of 32 data objects, fallout cant seem to cope with a key being pressed and released in the same frame...
|
||||
//TODO: Fallouts behaviour when passing multiple keypresses makes it appear like it's expecting the DIDEVICEOBJECTDATA struct to be
|
||||
// something other than 16 bytes. afaik, fallout uses DX3 for input, which is before the appData field was added, but it could
|
||||
// be worth checking anyway.
|
||||
*b=bufferedPresses.front();
|
||||
*b = bufferedPresses.front();
|
||||
bufferedPresses.pop();
|
||||
*c=1;
|
||||
*c = 1;
|
||||
return DI_OK;
|
||||
}
|
||||
|
||||
HRESULT _stdcall SetDataFormat(const DIDATAFORMAT* a) {
|
||||
if(formatLock&&oldFormat.dwSize) return RealDevice->SetDataFormat(&oldFormat);
|
||||
if (formatLock&&oldFormat.dwSize) return RealDevice->SetDataFormat(&oldFormat);
|
||||
memcpy(&oldFormat, a, sizeof(DIDATAFORMAT));
|
||||
return RealDevice->SetDataFormat(a);
|
||||
}
|
||||
HRESULT _stdcall SetEventNotification(HANDLE a) { return RealDevice->SetEventNotification(a); }
|
||||
HRESULT _stdcall SetCooperativeLevel(HWND a,DWORD b) {
|
||||
if(DeviceType==kDeviceType_KEYBOARD&&BackgroundKeyboard) b=DISCL_BACKGROUND|DISCL_NONEXCLUSIVE;
|
||||
if(DeviceType==kDeviceType_MOUSE&&BackgroundMouse) b=DISCL_BACKGROUND|DISCL_NONEXCLUSIVE;
|
||||
return RealDevice->SetCooperativeLevel(a,b);
|
||||
|
||||
HRESULT _stdcall SetEventNotification(HANDLE a) {
|
||||
return RealDevice->SetEventNotification(a);
|
||||
}
|
||||
|
||||
HRESULT _stdcall SetCooperativeLevel(HWND a, DWORD b) {
|
||||
if (DeviceType == kDeviceType_KEYBOARD&&BackgroundKeyboard) b = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE;
|
||||
if (DeviceType == kDeviceType_MOUSE&&BackgroundMouse) b = DISCL_BACKGROUND | DISCL_NONEXCLUSIVE;
|
||||
return RealDevice->SetCooperativeLevel(a, b);
|
||||
}
|
||||
|
||||
HRESULT _stdcall GetObjectInfo(LPDIDEVICEOBJECTINSTANCEA a, DWORD b, DWORD c) {
|
||||
return RealDevice->GetObjectInfo(a, b, c);
|
||||
}
|
||||
|
||||
HRESULT _stdcall GetDeviceInfo(LPDIDEVICEINSTANCEA a) {
|
||||
return RealDevice->GetDeviceInfo(a);
|
||||
}
|
||||
|
||||
HRESULT _stdcall RunControlPanel(HWND a, DWORD b) {
|
||||
return RealDevice->RunControlPanel(a, b);
|
||||
}
|
||||
|
||||
HRESULT _stdcall Initialize(HINSTANCE a, DWORD b, REFGUID c) {
|
||||
return RealDevice->Initialize(a, b, c);
|
||||
}
|
||||
|
||||
void LockDataFormat(bool lock) {
|
||||
formatLock = lock;
|
||||
}
|
||||
HRESULT _stdcall GetObjectInfo(LPDIDEVICEOBJECTINSTANCEA a,DWORD b,DWORD c) { return RealDevice->GetObjectInfo(a,b,c); }
|
||||
HRESULT _stdcall GetDeviceInfo(LPDIDEVICEINSTANCEA a) { return RealDevice->GetDeviceInfo(a); }
|
||||
HRESULT _stdcall RunControlPanel(HWND a,DWORD b) { return RealDevice->RunControlPanel(a,b); }
|
||||
HRESULT _stdcall Initialize(HINSTANCE a,DWORD b,REFGUID c) { return RealDevice->Initialize(a,b,c); }
|
||||
void LockDataFormat(bool lock) {formatLock = lock; }
|
||||
};
|
||||
|
||||
class FakeDirectInput : public IDirectInputA {
|
||||
private:
|
||||
IDirectInputA* RealInput;
|
||||
ULONG Refs;
|
||||
public:
|
||||
/*** Constructor ***/
|
||||
FakeDirectInput(IDirectInput* Real) { RealInput=Real; Refs=1; }
|
||||
/*** IUnknown methods ***/
|
||||
HRESULT _stdcall QueryInterface (REFIID riid, LPVOID* ppvObj) { return RealInput->QueryInterface(riid,ppvObj); }
|
||||
ULONG _stdcall AddRef(void) { return ++Refs; }
|
||||
FakeDirectInput(IDirectInput* Real) {
|
||||
RealInput = Real; Refs = 1;
|
||||
}
|
||||
|
||||
/*** IUnknown methods ***/
|
||||
HRESULT _stdcall QueryInterface(REFIID riid, LPVOID* ppvObj) {
|
||||
return RealInput->QueryInterface(riid, ppvObj);
|
||||
}
|
||||
|
||||
ULONG _stdcall AddRef(void) {
|
||||
return ++Refs;
|
||||
}
|
||||
|
||||
ULONG _stdcall Release(void) {
|
||||
if(--Refs==0) {
|
||||
if (--Refs == 0) {
|
||||
RealInput->Release();
|
||||
delete this;
|
||||
return 0;
|
||||
} else { return Refs; }
|
||||
} else {
|
||||
return Refs;
|
||||
}
|
||||
}
|
||||
|
||||
/*** IDirectInput8A methods ***/
|
||||
HRESULT _stdcall CreateDevice(REFGUID r,IDirectInputDeviceA** device,IUnknown* unused) {
|
||||
HRESULT _stdcall CreateDevice(REFGUID r, IDirectInputDeviceA** device, IUnknown* unused) {
|
||||
GUID GUID_SysMouse = { 0x6F1D2B60, 0xD5A0, 0x11CF, { 0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00} };
|
||||
GUID GUID_SysKeyboard = { 0x6F1D2B61, 0xD5A0, 0x11CF, { 0xBF,0xC7,0x44,0x45,0x53,0x54,0x00,0x00} };
|
||||
|
||||
if(r!=GUID_SysKeyboard&&r!=GUID_SysMouse) {
|
||||
return RealInput->CreateDevice(r,device,unused);
|
||||
if (r != GUID_SysKeyboard&&r != GUID_SysMouse) {
|
||||
return RealInput->CreateDevice(r, device, unused);
|
||||
} else {
|
||||
DWORD d;
|
||||
IDirectInputDeviceA* RealDevice;
|
||||
HRESULT hr;
|
||||
|
||||
if(r==GUID_SysKeyboard) d=kDeviceType_KEYBOARD;
|
||||
else d=kDeviceType_MOUSE;
|
||||
hr=RealInput->CreateDevice(r,&RealDevice,unused);
|
||||
if(hr!=DI_OK) return hr;
|
||||
if (r == GUID_SysKeyboard) d = kDeviceType_KEYBOARD;
|
||||
else d = kDeviceType_MOUSE;
|
||||
hr = RealInput->CreateDevice(r, &RealDevice, unused);
|
||||
if (hr != DI_OK) return hr;
|
||||
|
||||
FakeDirectInputDevice* fd=new FakeDirectInputDevice(RealDevice,d);
|
||||
FakeDirectInputDevice* fd = new FakeDirectInputDevice(RealDevice, d);
|
||||
*device = fd;
|
||||
if(d==kDeviceType_MOUSE) {
|
||||
if(FAILED(fd->SetDataFormat(&c_dfDIMouse2))) {
|
||||
if (d == kDeviceType_MOUSE) {
|
||||
if (FAILED(fd->SetDataFormat(&c_dfDIMouse2))) {
|
||||
dlogr("ERROR: Could not set mouse format to DIMOUSESTATE2. Only 4 buttons will be available!", DL_MAIN);
|
||||
} else fd->LockDataFormat(true);
|
||||
}
|
||||
return DI_OK;
|
||||
}
|
||||
}
|
||||
HRESULT _stdcall EnumDevices(DWORD a,LPDIENUMDEVICESCALLBACKA b,void* c,DWORD d) { return RealInput->EnumDevices(a,b,c,d); }
|
||||
HRESULT _stdcall GetDeviceStatus(REFGUID r) { return RealInput->GetDeviceStatus(r); }
|
||||
HRESULT _stdcall RunControlPanel(HWND a,DWORD b) { return RealInput->RunControlPanel(a,b); }
|
||||
HRESULT _stdcall Initialize(HINSTANCE a,DWORD b) { return RealInput->Initialize(a,b); }
|
||||
|
||||
HRESULT _stdcall EnumDevices(DWORD a, LPDIENUMDEVICESCALLBACKA b, void* c, DWORD d) {
|
||||
return RealInput->EnumDevices(a, b, c, d);
|
||||
}
|
||||
|
||||
HRESULT _stdcall GetDeviceStatus(REFGUID r) {
|
||||
return RealInput->GetDeviceStatus(r);
|
||||
}
|
||||
|
||||
HRESULT _stdcall RunControlPanel(HWND a, DWORD b) {
|
||||
return RealInput->RunControlPanel(a, b);
|
||||
}
|
||||
|
||||
HRESULT _stdcall Initialize(HINSTANCE a, DWORD b) {
|
||||
return RealInput->Initialize(a, b);
|
||||
}
|
||||
};
|
||||
|
||||
HRESULT _stdcall FakeDirectInputCreate(HINSTANCE a,DWORD b,IDirectInputA** c,IUnknown* d) {
|
||||
ZeroMemory(KeysDown,sizeof(KeysDown));
|
||||
HRESULT _stdcall FakeDirectInputCreate(HINSTANCE a, DWORD b, IDirectInputA** c, IUnknown* d) {
|
||||
ZeroMemory(KeysDown, sizeof(KeysDown));
|
||||
|
||||
HMODULE dinput=LoadLibraryA("dinput.dll");
|
||||
if(!dinput||dinput==INVALID_HANDLE_VALUE) return -1;
|
||||
DInputCreateProc proc=(DInputCreateProc)GetProcAddress(dinput, "DirectInputCreateA");
|
||||
if(!proc) return -1;
|
||||
HMODULE dinput = LoadLibraryA("dinput.dll");
|
||||
if (!dinput || dinput == INVALID_HANDLE_VALUE) return -1;
|
||||
DInputCreateProc proc = (DInputCreateProc)GetProcAddress(dinput, "DirectInputCreateA");
|
||||
if (!proc) return -1;
|
||||
|
||||
HRESULT hr=proc(a,b,c,d);
|
||||
if(FAILED(hr)) return hr;
|
||||
HRESULT hr = proc(a, b, c, d);
|
||||
if (FAILED(hr)) return hr;
|
||||
|
||||
ReverseMouse=GetPrivateProfileInt("Input", "ReverseMouseButtons", 0, ini)!=0;
|
||||
ReverseMouse = GetPrivateProfileInt("Input", "ReverseMouseButtons", 0, ini) != 0;
|
||||
|
||||
UseScrollWheel=GetPrivateProfileInt("Input", "UseScrollWheel", 1, ini)!=0;
|
||||
WheelMod=GetPrivateProfileInt("Input", "ScrollMod", 0, ini);
|
||||
LONG MouseSpeed=GetPrivateProfileInt("Input", "MouseSensitivity", 100, ini);
|
||||
if(MouseSpeed!=100) {
|
||||
AdjustMouseSpeed=true;
|
||||
MouseSpeedMod=((double)MouseSpeed)/100.0;
|
||||
MousePartX=0;
|
||||
MousePartY=0;
|
||||
} else AdjustMouseSpeed=false;
|
||||
UseScrollWheel = GetPrivateProfileInt("Input", "UseScrollWheel", 1, ini) != 0;
|
||||
WheelMod = GetPrivateProfileInt("Input", "ScrollMod", 0, ini);
|
||||
LONG MouseSpeed = GetPrivateProfileInt("Input", "MouseSensitivity", 100, ini);
|
||||
if (MouseSpeed != 100) {
|
||||
AdjustMouseSpeed = true;
|
||||
MouseSpeedMod = ((double)MouseSpeed) / 100.0;
|
||||
MousePartX = 0;
|
||||
MousePartY = 0;
|
||||
} else AdjustMouseSpeed = false;
|
||||
|
||||
MiddleMouseKey=GetPrivateProfileInt("Input", "MiddleMouse", 0x30, ini);
|
||||
MiddleMouseDown=false;
|
||||
MiddleMouseKey = GetPrivateProfileInt("Input", "MiddleMouse", 0x30, ini);
|
||||
MiddleMouseDown = false;
|
||||
|
||||
BackgroundKeyboard=GetPrivateProfileInt("Input", "BackgroundKeyboard", 0, ini)!=0;
|
||||
BackgroundMouse=GetPrivateProfileInt("Input", "BackgroundMouse", 0, ini)!=0;
|
||||
BackgroundKeyboard = GetPrivateProfileInt("Input", "BackgroundKeyboard", 0, ini) != 0;
|
||||
BackgroundMouse = GetPrivateProfileInt("Input", "BackgroundMouse", 0, ini) != 0;
|
||||
|
||||
DebugEditorKey=GetPrivateProfileInt("Input", "DebugEditorKey", 0, ini);
|
||||
DebugEditorKey = GetPrivateProfileInt("Input", "DebugEditorKey", 0, ini);
|
||||
|
||||
*c=(IDirectInputA*)new FakeDirectInput(*c);
|
||||
*c = (IDirectInputA*)new FakeDirectInput(*c);
|
||||
|
||||
keyboardLayout = GetKeyboardLayout(0);
|
||||
|
||||
|
||||
+12
-4
@@ -55,10 +55,18 @@ void dlog_f(const char *fmt, int type, ...) {
|
||||
|
||||
void LoggingInit() {
|
||||
Log.open("sfall-log.txt", ios_base::out | ios_base::trunc);
|
||||
if (GetPrivateProfileIntA("Debugging", "Init", 0, ".\\ddraw.ini")) DebugTypes |= DL_INIT;
|
||||
if (GetPrivateProfileIntA("Debugging", "Hook", 0, ".\\ddraw.ini")) DebugTypes |= DL_HOOK;
|
||||
if (GetPrivateProfileIntA("Debugging", "Script", 0, ".\\ddraw.ini")) DebugTypes |= DL_SCRIPT;
|
||||
if (GetPrivateProfileIntA("Debugging", "Criticals", 0, ".\\ddraw.ini")) DebugTypes |= DL_CRITICALS;
|
||||
if (GetPrivateProfileIntA("Debugging", "Init", 0, ".\\ddraw.ini")) {
|
||||
DebugTypes |= DL_INIT;
|
||||
}
|
||||
if (GetPrivateProfileIntA("Debugging", "Hook", 0, ".\\ddraw.ini")) {
|
||||
DebugTypes |= DL_HOOK;
|
||||
}
|
||||
if (GetPrivateProfileIntA("Debugging", "Script", 0, ".\\ddraw.ini")) {
|
||||
DebugTypes |= DL_SCRIPT;
|
||||
}
|
||||
if (GetPrivateProfileIntA("Debugging", "Criticals", 0, ".\\ddraw.ini")) {
|
||||
DebugTypes |= DL_CRITICALS;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -66,6 +66,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_copy() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -116,6 +117,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_find() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -150,6 +152,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_write_byte() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -176,6 +179,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_write_short() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -202,6 +206,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_write_int() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -231,6 +236,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_write_string() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -265,6 +271,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_write_bstring() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -299,6 +306,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_read_byte() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -326,6 +334,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_read_short() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -353,6 +362,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_read_int() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -380,6 +390,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_read_float() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -407,6 +418,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_delete() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -424,6 +436,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_size() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -451,6 +464,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_pos() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -478,6 +492,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_seek() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -504,6 +519,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fs_resize() {
|
||||
__asm {
|
||||
pushad;
|
||||
|
||||
@@ -46,6 +46,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcLoadShader() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -84,6 +85,7 @@ result:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcFreeShader() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -105,6 +107,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcActivateShader() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -126,6 +129,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcDeactivateShader() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -147,6 +151,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcGetShaderTexture() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -198,6 +203,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetShaderInt() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -254,6 +260,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetShaderTexture() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -310,6 +317,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetShaderFloat() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -371,6 +379,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetShaderVector() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -426,6 +435,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcGetShaderVersion() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -447,6 +457,7 @@ static void __declspec(naked) funcGetShaderVersion() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetShaderMode() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -481,6 +492,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcForceGraphicsRefresh() {
|
||||
__asm {
|
||||
push ebx;
|
||||
|
||||
@@ -42,6 +42,7 @@ static void __declspec(naked) InputFuncsAvailable() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) KeyPressed() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -74,6 +75,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcTapKey() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -286,6 +288,7 @@ static void __declspec(naked) GetViewportX() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetViewportY() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -303,6 +306,7 @@ static void __declspec(naked) GetViewportY() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetViewportX() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -323,6 +327,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetViewportY() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -369,6 +374,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) HideIfaceTag() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -394,6 +400,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) IsIfaceTagActive() {
|
||||
__asm {
|
||||
pushad;
|
||||
|
||||
@@ -50,6 +50,7 @@ result:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ReadShort() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -78,6 +79,7 @@ result:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ReadInt() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -106,6 +108,7 @@ result:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ReadString() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -134,6 +137,7 @@ result:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) WriteByte() {
|
||||
__asm {
|
||||
pushad
|
||||
@@ -162,6 +166,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) WriteShort() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -190,6 +195,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) WriteInt() {
|
||||
__asm {
|
||||
pushad
|
||||
@@ -217,17 +223,19 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void _stdcall WriteStringInternal(const char* str, char* addr) {
|
||||
bool hitnull=false;
|
||||
while(*str) {
|
||||
if(!*addr) hitnull=true;
|
||||
if(hitnull&&addr[1]) break;
|
||||
*addr=*str;
|
||||
bool hitnull = false;
|
||||
while (*str) {
|
||||
if (!*addr) hitnull = true;
|
||||
if (hitnull&&addr[1]) break;
|
||||
*addr = *str;
|
||||
addr++;
|
||||
str++;
|
||||
}
|
||||
*addr=0;
|
||||
*addr = 0;
|
||||
}
|
||||
|
||||
static void __declspec(naked) WriteString() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -263,13 +271,14 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void _stdcall CallOffsetInternal(DWORD func, DWORD script) {
|
||||
func=(func>>2) - 0x1d2;
|
||||
bool ret=func>=5;
|
||||
int argcount=func%5;
|
||||
func = (func >> 2) - 0x1d2;
|
||||
bool ret = func >= 5;
|
||||
int argcount = func % 5;
|
||||
DWORD args[5];
|
||||
DWORD illegalarg=0;
|
||||
for(int i=argcount*4;i>=0;i-=4) {
|
||||
DWORD illegalarg = 0;
|
||||
for (int i = argcount * 4; i >= 0; i -= 4) {
|
||||
__asm {
|
||||
mov eax, script;
|
||||
call FuncOffs::interpretPopShort_;
|
||||
@@ -281,12 +290,12 @@ legal:
|
||||
call FuncOffs::interpretPopLong_;
|
||||
lea ecx, args;
|
||||
add ecx, i;
|
||||
mov [ecx], eax;
|
||||
mov[ecx], eax;
|
||||
}
|
||||
}
|
||||
|
||||
if(illegalarg) {
|
||||
args[0]=0;
|
||||
if (illegalarg) {
|
||||
args[0] = 0;
|
||||
} else {
|
||||
__asm {
|
||||
mov eax, args[1];
|
||||
@@ -298,7 +307,7 @@ legal:
|
||||
mov args[0], eax;
|
||||
}
|
||||
}
|
||||
if(ret) {
|
||||
if (ret) {
|
||||
__asm {
|
||||
mov eax, script;
|
||||
mov edx, args[0];
|
||||
@@ -309,6 +318,7 @@ legal:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) CallOffset() {
|
||||
__asm {
|
||||
pushad;
|
||||
|
||||
@@ -43,6 +43,7 @@ static DWORD MovieNamesPtr=(DWORD)MoviePaths;
|
||||
static void _stdcall strcpy_p(char* to, const char* from) {
|
||||
strcpy_s(to, 64, from);
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetDMModel() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -73,6 +74,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetDFModel() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -103,6 +105,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetMoviePath() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -151,6 +154,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetYear() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -182,6 +186,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GameLoaded() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -234,6 +239,7 @@ fail:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetPipBoyAvailable() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -293,6 +299,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ModKillCounter() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -371,6 +378,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetWeaponKnockback() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -378,6 +386,7 @@ static void __declspec(naked) SetWeaponKnockback() {
|
||||
jmp SetKnockback;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetTargetKnockback() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -385,6 +394,7 @@ static void __declspec(naked) SetTargetKnockback() {
|
||||
jmp SetKnockback;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetAttackerKnockback() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -392,6 +402,7 @@ static void __declspec(naked) SetAttackerKnockback() {
|
||||
jmp SetKnockback;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) RemoveKnockback() {
|
||||
__asm {
|
||||
mov ecx, eax;
|
||||
@@ -411,6 +422,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) RemoveWeaponKnockback() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -418,6 +430,7 @@ static void __declspec(naked) RemoveWeaponKnockback() {
|
||||
jmp RemoveKnockback;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) RemoveTargetKnockback() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -425,6 +438,7 @@ static void __declspec(naked) RemoveTargetKnockback() {
|
||||
jmp RemoveKnockback;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) RemoveAttackerKnockback() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -432,6 +446,7 @@ static void __declspec(naked) RemoveAttackerKnockback() {
|
||||
jmp RemoveKnockback;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetKillCounter2() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -462,6 +477,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ModKillCounter2() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -514,6 +530,7 @@ static void __declspec(naked) GetActiveHand() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ToggleActiveHand() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -544,9 +561,10 @@ static void __declspec(naked) EaxAvailable() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static char* NPCToInc;
|
||||
static void _stdcall IncNPCLevel4(char* npc) {
|
||||
if(_stricmp(npc, NPCToInc)) {
|
||||
if (_stricmp(npc, NPCToInc)) {
|
||||
SafeWrite8(0x00495C50, 0xe9);
|
||||
SafeWrite32(0x00495C51, 0x000001fc);
|
||||
} else {
|
||||
@@ -561,12 +579,13 @@ static void _stdcall IncNPCLevel4(char* npc) {
|
||||
//SafeWrite32(0x00495C8E, 0x90909090);
|
||||
SafeWrite16(0x00495CEC, 0x9090); //Check that the npc hasn't already levelled up recently
|
||||
SafeWrite32(0x00495CEE, 0x90909090);
|
||||
if(!npcautolevel) {
|
||||
if (!npcautolevel) {
|
||||
SafeWrite16(0x00495D22, 0x9090);//Random element
|
||||
SafeWrite32(0x00495D24, 0x90909090);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) IncNPCLevel3() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -577,8 +596,9 @@ static void __declspec(naked) IncNPCLevel3() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void _stdcall IncNPCLevel2(char* npc) {
|
||||
NPCToInc=npc;
|
||||
NPCToInc = npc;
|
||||
SafeWrite8(0x00495BEB, 0xe9); //Replace the debug output with a jmp
|
||||
SafeWrite32(0x00495BEC, ((DWORD)&IncNPCLevel3) - 0x00495BF0);
|
||||
__asm {
|
||||
@@ -592,11 +612,12 @@ static void _stdcall IncNPCLevel2(char* npc) {
|
||||
//SafeWrite32(0x00495C8E, 0x000001bf);
|
||||
SafeWrite16(0x00495CEC, 0x850f);
|
||||
SafeWrite32(0x00495CEE, 0x00000130);
|
||||
if(!npcautolevel) {
|
||||
if (!npcautolevel) {
|
||||
SafeWrite16(0x00495D22, 0x8f0f);
|
||||
SafeWrite32(0x00495D24, 0x00000129);
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) IncNPCLevel() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -626,8 +647,9 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static int _stdcall get_npc_level2(DWORD numMembers, DWORD maxMembers, DWORD* members, DWORD* pids, DWORD* words, const char* name) {
|
||||
for(DWORD i=0;i<numMembers;i++) {
|
||||
for (DWORD i = 0; i < numMembers; i++) {
|
||||
const char* name2;
|
||||
__asm {
|
||||
mov eax, members;
|
||||
@@ -635,25 +657,26 @@ static int _stdcall get_npc_level2(DWORD numMembers, DWORD maxMembers, DWORD* me
|
||||
call FuncOffs::critter_name_
|
||||
mov name2, eax;
|
||||
}
|
||||
if(_stricmp(name, name2)) {
|
||||
members+=4;
|
||||
if (_stricmp(name, name2)) {
|
||||
members += 4;
|
||||
continue;
|
||||
}
|
||||
|
||||
DWORD pid=((DWORD*)members[0])[25];
|
||||
DWORD id=-1;
|
||||
for(DWORD j=0;j<maxMembers;j++) {
|
||||
if(pids[j]==pid) {
|
||||
id=j;
|
||||
DWORD pid = ((DWORD*)members[0])[25];
|
||||
DWORD id = -1;
|
||||
for (DWORD j = 0; j < maxMembers; j++) {
|
||||
if (pids[j] == pid) {
|
||||
id = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(id==-1) break;
|
||||
if (id == -1) break;
|
||||
|
||||
return words[id*3];
|
||||
return words[id * 3];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_npc_level() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -700,34 +723,35 @@ end:
|
||||
|
||||
static char IniStrBuffer[128];
|
||||
static DWORD _stdcall GetIniSetting2(const char* c, DWORD string) {
|
||||
const char* key=strstr(c, "|");
|
||||
if(!key) return -1;
|
||||
DWORD filelen=(DWORD)key - (DWORD)c;
|
||||
if(filelen>=64) return -1;
|
||||
key=strstr(key+1, "|");
|
||||
if(!key) return -1;
|
||||
DWORD seclen=(DWORD)key - ((DWORD)c + filelen + 1);
|
||||
if(seclen>32) return -1;
|
||||
const char* key = strstr(c, "|");
|
||||
if (!key) return -1;
|
||||
DWORD filelen = (DWORD)key - (DWORD)c;
|
||||
if (filelen >= 64) return -1;
|
||||
key = strstr(key + 1, "|");
|
||||
if (!key) return -1;
|
||||
DWORD seclen = (DWORD)key - ((DWORD)c + filelen + 1);
|
||||
if (seclen > 32) return -1;
|
||||
|
||||
char file[67];
|
||||
file[0]='.';
|
||||
file[1]='\\';
|
||||
file[0] = '.';
|
||||
file[1] = '\\';
|
||||
memcpy(&file[2], c, filelen);
|
||||
file[filelen+2]=0;
|
||||
file[filelen + 2] = 0;
|
||||
|
||||
char section[33];
|
||||
memcpy(section, &c[filelen+1], seclen);
|
||||
section[seclen]=0;
|
||||
memcpy(section, &c[filelen + 1], seclen);
|
||||
section[seclen] = 0;
|
||||
|
||||
key++;
|
||||
if(string) {
|
||||
IniStrBuffer[0]=0;
|
||||
if (string) {
|
||||
IniStrBuffer[0] = 0;
|
||||
GetPrivateProfileStringA(section, key, "", IniStrBuffer, 128, file);
|
||||
return (DWORD)&IniStrBuffer[0];
|
||||
} else {
|
||||
return GetPrivateProfileIntA(section, key, -1, file);
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetIniSetting() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -767,6 +791,7 @@ result:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetIniString() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -814,6 +839,7 @@ result:
|
||||
static DWORD _stdcall GetTickCount2() {
|
||||
return GetTickCount();
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcGetTickCount() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -829,6 +855,7 @@ static void __declspec(naked) funcGetTickCount() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetCarTown() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1012,6 +1039,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcResetCriticalTable() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -1041,6 +1069,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetApAcBonus() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1059,6 +1088,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetApAcBonus() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1074,6 +1104,7 @@ static void __declspec(naked) GetApAcBonus() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetApAcEBonus() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1092,6 +1123,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetApAcEBonus() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1197,6 +1229,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_proto_data() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -1263,6 +1296,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetHeroStyle() {//for setting the hero style/appearance takes an 1 int
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1289,6 +1323,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetHeroRace() {// for setting the hero race takes an 1 int
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1329,6 +1364,7 @@ static void __declspec(naked) get_light_level() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) refresh_pc_art() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1341,6 +1377,7 @@ static void __declspec(naked) refresh_pc_art() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_attack_type() {
|
||||
__asm {
|
||||
push edx;
|
||||
@@ -1356,6 +1393,7 @@ static void __declspec(naked) get_attack_type() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) play_sfall_sound() {
|
||||
__asm {
|
||||
pushad
|
||||
@@ -1396,6 +1434,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) stop_sfall_sound() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -1461,6 +1500,7 @@ static void __declspec(naked) modified_ini() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) force_aimed_shots() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1480,6 +1520,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) disable_aimed_shots() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1499,6 +1540,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) mark_movie_played() {
|
||||
__asm {
|
||||
push ecx;
|
||||
@@ -1521,6 +1563,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_last_attacker() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -1547,6 +1590,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_last_target() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -1573,6 +1617,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) block_combat() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -1590,6 +1635,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) tile_under_cursor() {
|
||||
__asm {
|
||||
push edx;
|
||||
@@ -1617,6 +1663,7 @@ static void __declspec(naked) tile_under_cursor() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) gdialog_get_barter_mod() {
|
||||
__asm {
|
||||
push edx;
|
||||
@@ -1632,6 +1679,7 @@ static void __declspec(naked) gdialog_get_barter_mod() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_inven_ap_cost() {
|
||||
__asm {
|
||||
push ecx;
|
||||
|
||||
@@ -224,6 +224,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_weapon_ammo_pid() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -251,6 +252,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_weapon_ammo_pid() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -277,6 +279,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_weapon_ammo_count() {
|
||||
__asm {
|
||||
pushad;
|
||||
|
||||
@@ -36,6 +36,7 @@ static void __declspec(naked) GetPerkOwed() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetPerkOwed() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -55,6 +56,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_perk_freq() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -72,6 +74,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetPerkAvailable() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -101,6 +104,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetPerkName() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -136,6 +140,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetPerkDesc() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -171,6 +176,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSetPerkValue() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -271,6 +277,7 @@ fail:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetFakePerk() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -339,6 +346,7 @@ fail:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetFakeTrait() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -415,6 +423,7 @@ fail:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetPerkboxTitle() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -444,6 +453,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fIgnoreDefaultPerks() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -456,6 +466,7 @@ static void __declspec(naked) fIgnoreDefaultPerks() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fRestoreDefaultPerks() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -468,6 +479,7 @@ static void __declspec(naked) fRestoreDefaultPerks() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fClearSelectablePerks() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -480,6 +492,7 @@ static void __declspec(naked) fClearSelectablePerks() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fHasFakePerk() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -515,6 +528,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fHasFakeTrait() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -550,6 +564,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fAddPerkMode() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -571,6 +586,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) remove_trait() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -634,6 +650,7 @@ static void __declspec(naked) fApplyHeaveHoFix() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetSwiftLearnerMod() {
|
||||
__asm {
|
||||
push ebx;
|
||||
|
||||
@@ -53,6 +53,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -112,6 +113,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
used in place of [] operator when compiling in sslc
|
||||
so it works as get_array if first argument is int and as substr(x, y, 1) if first argument is string
|
||||
@@ -199,6 +201,7 @@ notstring:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) free_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -216,6 +219,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) len_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -242,6 +246,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) resize_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -272,6 +277,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) temp_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -307,6 +313,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fix_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -324,6 +331,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) scan_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -470,43 +478,36 @@ static void __declspec(naked) op_stack_array() {
|
||||
// object LISTS
|
||||
|
||||
struct sList {
|
||||
DWORD* obj;
|
||||
TGameObj** obj;
|
||||
DWORD len;
|
||||
DWORD pos;
|
||||
|
||||
sList(const std::vector<DWORD>* vec) {
|
||||
len=vec->size();
|
||||
obj=new DWORD[len];
|
||||
for(DWORD i=0;i<len;i++) obj[i]=(*vec)[i];
|
||||
pos=0;
|
||||
sList(const std::vector<TGameObj*>* vec) {
|
||||
len = vec->size();
|
||||
obj = new TGameObj*[len];
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
obj[i] = (*vec)[i];
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
};
|
||||
|
||||
static void FillListVector(DWORD type, std::vector<DWORD>& vec) {
|
||||
static void FillListVector(DWORD type, std::vector<TGameObj*>& vec) {
|
||||
// TODO: fix style, use wrappers
|
||||
if (type == 6) {
|
||||
DWORD scriptPtr, self_obj, programPtr;
|
||||
for (int elev=0; elev<=2; elev++) {
|
||||
__asm {
|
||||
mov eax, elev;
|
||||
call FuncOffs::scr_find_first_at_;
|
||||
mov scriptPtr, eax;
|
||||
}
|
||||
while (scriptPtr != 0) {
|
||||
self_obj = *(DWORD*)(scriptPtr + 0x34);
|
||||
if (self_obj == 0) {
|
||||
programPtr = *(DWORD*)(scriptPtr + 0x18);
|
||||
__asm {
|
||||
mov eax, programPtr;
|
||||
call FuncOffs::scr_find_obj_from_program_;
|
||||
mov self_obj, eax;
|
||||
}
|
||||
TScript* scriptPtr;
|
||||
TGameObj* self_obj;
|
||||
TProgram* programPtr;
|
||||
for (int elev = 0; elev <= 2; elev++) {
|
||||
scriptPtr = Wrapper::scr_find_first_at(elev);
|
||||
while (scriptPtr != nullptr) {
|
||||
self_obj = scriptPtr->self_obj;
|
||||
if (self_obj == nullptr) {
|
||||
programPtr = scriptPtr->program_ptr;
|
||||
self_obj = Wrapper::scr_find_obj_from_program(programPtr);
|
||||
}
|
||||
vec.push_back(self_obj);
|
||||
__asm {
|
||||
call FuncOffs::scr_find_next_at_;
|
||||
mov scriptPtr, eax;
|
||||
}
|
||||
scriptPtr = Wrapper::scr_find_next_at();
|
||||
}
|
||||
}
|
||||
} else if (type == 4) {
|
||||
@@ -520,51 +521,48 @@ static void FillListVector(DWORD type, std::vector<DWORD>& vec) {
|
||||
}*/
|
||||
|
||||
} else {
|
||||
for(int elv=0;elv<3;elv++) {
|
||||
for(int tile=0;tile<40000;tile++) {
|
||||
DWORD obj;
|
||||
__asm {
|
||||
mov edx, tile;
|
||||
mov eax, elv;
|
||||
call FuncOffs::obj_find_first_at_tile_;
|
||||
mov obj, eax;
|
||||
}
|
||||
while(obj) {
|
||||
DWORD otype = ((DWORD*)obj)[25];
|
||||
otype = (otype&0xff000000) >> 24;
|
||||
if(type==9 || (type==0&&otype==1) || (type==1&&otype==0) || (type>=2&&type<=5&&type==otype)) vec.push_back(obj);
|
||||
__asm {
|
||||
call FuncOffs::obj_find_next_at_tile_;
|
||||
mov obj, eax;
|
||||
for (int elv = 0; elv < 3; elv++) {
|
||||
for (int tile = 0; tile < 40000; tile++) {
|
||||
TGameObj* obj = Wrapper::obj_find_first_at_tile(elv, tile);
|
||||
while (obj) {
|
||||
DWORD otype = (obj->pid & 0xff000000) >> 24;
|
||||
if (type == 9 || (type == 0 && otype == 1) || (type == 1 && otype == 0) || (type >= 2 && type <= 5 && type == otype)) {
|
||||
vec.push_back(obj);
|
||||
}
|
||||
obj = Wrapper::obj_find_next_at_tile();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void* _stdcall list_begin2(DWORD type) {
|
||||
std::vector<DWORD> vec = std::vector<DWORD>();
|
||||
std::vector<TGameObj*> vec = std::vector<TGameObj*>();
|
||||
FillListVector(type, vec);
|
||||
sList* list=new sList(&vec);
|
||||
sList* list = new sList(&vec);
|
||||
return list;
|
||||
}
|
||||
|
||||
static DWORD _stdcall list_as_array2(DWORD type) {
|
||||
std::vector<DWORD> vec = std::vector<DWORD>();
|
||||
std::vector<TGameObj*> vec = std::vector<TGameObj*>();
|
||||
FillListVector(type, vec);
|
||||
DWORD id=TempArray(vec.size(), 4);
|
||||
for(DWORD i=0;i<vec.size();i++) {
|
||||
DWORD id = TempArray(vec.size(), 4);
|
||||
for (DWORD i = 0; i < vec.size(); i++) {
|
||||
arrays[id].val[i].set((long)vec[i]);
|
||||
}
|
||||
return id;
|
||||
}
|
||||
static DWORD _stdcall list_next2(sList* list) {
|
||||
if(list->pos==list->len) return 0;
|
||||
|
||||
static TGameObj* _stdcall list_next2(sList* list) {
|
||||
if (list->pos == list->len) return 0;
|
||||
else return list->obj[list->pos++];
|
||||
}
|
||||
|
||||
static void _stdcall list_end2(sList* list) {
|
||||
delete[] list->obj;
|
||||
delete list;
|
||||
}
|
||||
|
||||
static void __declspec(naked) list_begin() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -592,6 +590,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) list_as_array() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -619,6 +618,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) list_next() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -646,6 +646,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) list_end() {
|
||||
__asm {
|
||||
pushad;
|
||||
|
||||
@@ -67,6 +67,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcAbs() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -106,6 +107,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcSin() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -145,6 +147,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcCos() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -184,6 +187,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcTan() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -224,6 +228,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) funcATan() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -285,33 +290,34 @@ end:
|
||||
|
||||
static int _stdcall StringSplit(const char* str, const char* split) {
|
||||
int id;
|
||||
if(strlen(split)==0) {
|
||||
id=TempArray(strlen(str), 4);
|
||||
for(DWORD i=0;i<strlen(str);i++) {
|
||||
if (strlen(split) == 0) {
|
||||
id = TempArray(strlen(str), 4);
|
||||
for (DWORD i = 0; i < strlen(str); i++) {
|
||||
arrays[id].val[i].set(&str[i], 1);
|
||||
}
|
||||
} else {
|
||||
int count=1;
|
||||
const char *ptr=str, *newptr;
|
||||
while(true) {
|
||||
newptr=strstr(ptr, split);
|
||||
if(!newptr) break;
|
||||
int count = 1;
|
||||
const char *ptr = str, *newptr;
|
||||
while (true) {
|
||||
newptr = strstr(ptr, split);
|
||||
if (!newptr) break;
|
||||
count++;
|
||||
ptr=newptr+strlen(split);
|
||||
ptr = newptr + strlen(split);
|
||||
}
|
||||
id=TempArray(count, 0);
|
||||
ptr=str;
|
||||
count =0;
|
||||
while(true) {
|
||||
newptr=strstr(ptr, split);
|
||||
int len=newptr?newptr-ptr:strlen(ptr);
|
||||
id = TempArray(count, 0);
|
||||
ptr = str;
|
||||
count = 0;
|
||||
while (true) {
|
||||
newptr = strstr(ptr, split);
|
||||
int len = newptr ? newptr - ptr : strlen(ptr);
|
||||
arrays[id].val[count++].set(ptr, len);
|
||||
if(!newptr) break;
|
||||
ptr=newptr+strlen(split);
|
||||
if (!newptr) break;
|
||||
ptr = newptr + strlen(split);
|
||||
}
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
static void __declspec(naked) string_split() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -363,13 +369,16 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static int _stdcall str_to_int_internal(const char* str) {
|
||||
return (int)strtol(str, (char**)NULL, 0); // auto-determine radix
|
||||
}
|
||||
|
||||
static DWORD _stdcall str_to_flt_internal(const char* str) {
|
||||
float f=(float)atof(str);
|
||||
return *(DWORD*)&f;
|
||||
}
|
||||
|
||||
static void __declspec(naked) str_to_int() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -403,6 +412,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) str_to_flt() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -436,6 +446,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
char* _stdcall mysubstr(char* str, int pos, int length) {
|
||||
char* newstr;
|
||||
int srclen;
|
||||
@@ -458,22 +469,23 @@ char* _stdcall mysubstr(char* str, int pos, int length) {
|
||||
static DWORD _stdcall mystrlen(char* str) {
|
||||
return strlen(str);
|
||||
}
|
||||
|
||||
static char* sprintfbuf = NULL;
|
||||
static char* _stdcall mysprintf(char* format, DWORD value, DWORD valueType) {
|
||||
valueType = valueType & 0xFFFF; // use lower 2 bytes
|
||||
int fmtlen = strlen(format);
|
||||
int buflen = fmtlen + 1;
|
||||
for (int i=0; i<fmtlen; i++) {
|
||||
for (int i = 0; i < fmtlen; i++) {
|
||||
if (format[i] == '%')
|
||||
buflen++; // will possibly be escaped, need space for that
|
||||
}
|
||||
// parse format to make it safe
|
||||
char* newfmt = new char[buflen];
|
||||
byte mode = 0;
|
||||
int j=0;
|
||||
int j = 0;
|
||||
char c, specifier;
|
||||
bool hasDigits = false;
|
||||
for (int i=0; i<fmtlen; i++) {
|
||||
for (int i = 0; i < fmtlen; i++) {
|
||||
c = format[i];
|
||||
switch (mode) {
|
||||
case 0: // prefix
|
||||
@@ -502,7 +514,7 @@ static char* _stdcall mysprintf(char* format, DWORD value, DWORD valueType) {
|
||||
default:
|
||||
if (c == '%') { // don't allow more than one specifier
|
||||
newfmt[j++] = '%'; // escape it
|
||||
if (format[i+1] == '%')
|
||||
if (format[i + 1] == '%')
|
||||
i++; // skip already escaped
|
||||
}
|
||||
break;
|
||||
@@ -522,7 +534,7 @@ static char* _stdcall mysprintf(char* format, DWORD value, DWORD valueType) {
|
||||
}
|
||||
if (sprintfbuf)
|
||||
delete[] sprintfbuf;
|
||||
sprintfbuf = new char[buflen+1];
|
||||
sprintfbuf = new char[buflen + 1];
|
||||
if (valueType == VAR_TYPE_FLOAT) {
|
||||
_snprintf(sprintfbuf, buflen, newfmt, *(float*)(&value));
|
||||
} else {
|
||||
|
||||
@@ -69,6 +69,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetPCExtraStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -111,6 +112,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetPCBaseStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -149,6 +151,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetPCExtraStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -187,6 +190,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetCritterBaseStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -246,6 +250,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetCritterExtraStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -305,6 +310,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetCritterBaseStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -362,6 +368,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetCritterExtraStat() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -419,6 +426,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_critter_skill_points() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -468,6 +476,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_critter_skill_points() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -516,6 +525,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) set_available_skill_points() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -533,6 +543,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) get_available_skill_points() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -546,6 +557,7 @@ static void __declspec(naked) get_available_skill_points() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) mod_skill_points_per_level() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -568,6 +580,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetCritterAP() {
|
||||
__asm {
|
||||
//Store registers
|
||||
@@ -674,6 +687,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetHitChanceMax() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -702,6 +716,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetCritterHitChance() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -743,6 +758,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetBaseHitChance() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -777,6 +793,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetCritterPickpocket() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -818,6 +835,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetBasePickpocket() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -852,6 +870,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetCritterSkillMod() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -885,6 +904,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetBaseSkillMod() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -912,6 +932,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetSkillMax() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -939,6 +960,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetStatMax() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -976,6 +998,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetStatMin() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1013,6 +1036,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetPCStatMax() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1047,6 +1071,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetPCStatMin() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1081,6 +1106,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetNPCStatMax() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1115,6 +1141,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) fSetNPCStatMin() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1149,6 +1176,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static float xpmod;
|
||||
static DWORD xptmp;
|
||||
static void __declspec(naked) SetXpMod3() {
|
||||
@@ -1167,11 +1195,13 @@ static void __declspec(naked) SetXpMod3() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void _stdcall SetXpMod2(DWORD percent) {
|
||||
SafeWrite8(0x004AFAB8, 0xe9);
|
||||
SafeWrite32(0x004AFAB9, (DWORD)&SetXpMod3 - 0x004AFABD);
|
||||
xpmod=(float)percent/100.0f;
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetXpMod() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -1196,6 +1226,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static int PerkLevelMod;
|
||||
static void __declspec(naked) SetPerkLevelMod3() {
|
||||
__asm {
|
||||
@@ -1210,11 +1241,13 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void _stdcall SetPerkLevelMod2(int mod) {
|
||||
if(mod<-25||mod>25) return;
|
||||
PerkLevelMod=mod;
|
||||
if (mod < -25 || mod>25) return;
|
||||
PerkLevelMod = mod;
|
||||
SafeWrite32(0x00496880, (DWORD)&SetPerkLevelMod3 - 0x00496884);
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetPerkLevelMod() {
|
||||
__asm {
|
||||
push ebx;
|
||||
|
||||
@@ -24,13 +24,14 @@
|
||||
|
||||
static DWORD EncounteredHorrigan;
|
||||
static void _stdcall ForceEncounter4() {
|
||||
*(DWORD*)0x00672E04=EncounteredHorrigan;
|
||||
*(DWORD*)0x00672E04 = EncounteredHorrigan;
|
||||
SafeWrite32(0x004C070E, 0x95);
|
||||
SafeWrite32(0x004C0718, 0x95);
|
||||
SafeWrite32(0x004C06D1, 0x2E043D83);
|
||||
SafeWrite32(0x004C071D, 0xFFFC2413);
|
||||
SafeWrite8(0x4C0706, 0x75);
|
||||
}
|
||||
|
||||
static void __declspec(naked) ForceEncounter3() {
|
||||
__asm {
|
||||
push eax;
|
||||
@@ -48,14 +49,16 @@ static void __declspec(naked) ForceEncounter3() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void _stdcall ForceEncounter2(DWORD mapID, DWORD flags) {
|
||||
EncounteredHorrigan=*(DWORD*)0x00672E04;
|
||||
EncounteredHorrigan = *(DWORD*)0x00672E04;
|
||||
SafeWrite32(0x004C070E, mapID);
|
||||
SafeWrite32(0x004C0718, mapID);
|
||||
SafeWrite32(0x004C06D1, 0x18EBD231); //xor edx, edx / jmp 0x18
|
||||
SafeWrite32(0x004C071D, ((DWORD)&ForceEncounter3) - 0x004C0721);
|
||||
if(flags&1) SafeWrite8(0x4C0706, 0xeb);
|
||||
if (flags & 1) SafeWrite8(0x4C0706, 0xeb);
|
||||
}
|
||||
|
||||
static void __declspec(naked) ForceEncounter() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -78,6 +81,7 @@ end:
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) ForceEncounterWithFlags() {
|
||||
__asm {
|
||||
pushad
|
||||
@@ -127,6 +131,7 @@ static void __declspec(naked) funcInWorldMap() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetGameMode() {
|
||||
__asm {
|
||||
pushad;
|
||||
@@ -142,6 +147,7 @@ static void __declspec(naked) GetGameMode() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetWorldMapXPos() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -159,6 +165,7 @@ static void __declspec(naked) GetWorldMapXPos() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) GetWorldMapYPos() {
|
||||
__asm {
|
||||
push ebx;
|
||||
@@ -176,6 +183,7 @@ static void __declspec(naked) GetWorldMapYPos() {
|
||||
retn;
|
||||
}
|
||||
}
|
||||
|
||||
static void __declspec(naked) SetWorldMapPos() {
|
||||
__asm {
|
||||
push ebx;
|
||||
|
||||
+6
-6
@@ -22,11 +22,11 @@ typedef HRESULT (_stdcall *DDrawCreateProc)(void* a, void* b, void* c);
|
||||
|
||||
HRESULT _stdcall FakeDirectDrawCreate(void* a, void* b, void* c) {
|
||||
char path[MAX_PATH];
|
||||
GetSystemDirectoryA(path,MAX_PATH);
|
||||
GetSystemDirectoryA(path, MAX_PATH);
|
||||
strcat_s(path, "\\ddraw.dll");
|
||||
HMODULE ddraw=LoadLibraryA(path);
|
||||
if(!ddraw||ddraw==INVALID_HANDLE_VALUE) return -1;
|
||||
DDrawCreateProc proc=(DDrawCreateProc)GetProcAddress(ddraw, "DirectDrawCreate");
|
||||
if(!proc) return -1;
|
||||
return proc(a,b,c);
|
||||
HMODULE ddraw = LoadLibraryA(path);
|
||||
if (!ddraw || ddraw == INVALID_HANDLE_VALUE) return -1;
|
||||
DDrawCreateProc proc = (DDrawCreateProc)GetProcAddress(ddraw, "DirectDrawCreate");
|
||||
if (!proc) return -1;
|
||||
return proc(a, b, c);
|
||||
}
|
||||
|
||||
+210
-189
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user