From de4d2e231d7a9d383db4a34cc49a4289aefc4c67 Mon Sep 17 00:00:00 2001 From: gho tik Date: Tue, 28 Feb 2017 11:50:28 -0500 Subject: [PATCH] v2_04_17_src Former-commit-id: 6a3d3573af5c0d9f8c8d22835f869431439fbd4a --- Include/dxwnd.h | 13 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 4 +- .../Nightmare Creatures demo (sw mode).dxw | 36 +++ build/exports/Nightmare Creatures demo.dxw | 36 +++ build/exports/Star Trek Armada.dxw | 26 +- build/exports/dxwnd.reg | 233 ++++++++++++++++++ build/readme-relnotes.txt | 8 + dll/ddraw.cpp | 5 +- dll/dxwcore.hpp | 2 + dll/dxwnd.aps | Bin 58232 -> 58232 bytes dll/dxwnd.cpp | 9 +- dll/dxwnd.vs2008.suo | Bin 33792 -> 81902 bytes dll/gdi32.cpp | 6 +- dll/kernel32.cpp | 4 + dll/shareddc.cpp | 32 ++- dll/shareddc.hpp | 2 + dll/user32.cpp | 26 +- dll/winmm.cpp | 74 +++++- dll/winproc.cpp | 5 + host/StatusDialog.h | 1 - host/TabCompat.cpp | 9 +- host/TabRegistry.cpp | 7 + host/TabSysLibs.cpp | 3 +- host/TargetDlg.cpp | 2 + host/TargetDlg.h | 2 + host/VJoyDialog.cpp | 143 +++++++++-- host/VJoyDialog.h | 10 + host/dxwndhost.aps | Bin 262424 -> 263884 bytes host/dxwndhost.rc | Bin 154256 -> 156064 bytes host/dxwndhost.vs2008.suo | Bin 224768 -> 230912 bytes host/dxwndhostView.cpp | 7 +- host/resource | Bin 55674 -> 56594 bytes 33 files changed, 646 insertions(+), 63 deletions(-) create mode 100644 build/exports/Nightmare Creatures demo (sw mode).dxw create mode 100644 build/exports/Nightmare Creatures demo.dxw create mode 100644 build/exports/dxwnd.reg diff --git a/Include/dxwnd.h b/Include/dxwnd.h index 1bf8969..801076b 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -277,6 +277,11 @@ #define OFFSCREENZBUFFER 0x02000000 // Allow building plain surfaces and ZBuffer on offscreen videomemory surfaces #define VIRTUALHEAP 0x04000000 // Remap heap calls to C library memory allocation routines #define ZBUFFERHARDCLEAN 0x08000000 // Clean ZBUFFER the hard way (memset 0xFF on whole surface buffer ....) +#define LOADLIBRARYERR 0x10000000 // When LoadLibrary* fail for missing file returns ... instead of .... +#define SHAREDDCHYBRID 0x20000000 // Hybrid mode for shared dc GDI emulation - blits both on ddraw surface and window surface + +// 9th flags DWORD dxw.dwFlags9: +// 10th flags DWORD dxw.dwFlags10: // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general @@ -321,6 +326,8 @@ typedef struct TARGETMAP int flags6; int flags7; int flags8; + int flags9; + int flags10; int tflags; // trace flags (cleared when exported/imported) int dflags; // debug flags (cleared when exported/imported) int monitorid; @@ -348,6 +355,11 @@ typedef struct TARGETMAP #define INVERTXAXIS 0x00000010 // Invert virtual joystick X axis #define B1AUTOFIRE 0x00000020 // Button 1 auto fire #define B2AUTOFIRE 0x00000040 // Button 2 auto fire +#define VJAUTOCENTER 0x00000080 // auto-center feature +#define VJKEYBOARDMAP 0x00000100 // mapvirtual joystick lever & buttons to keyboard +#define VJMOUSEMAP 0x00000200 // mapvirtual joystick lever & buttons to mouse +#define VJSENSIVITY 0x00000400 // tune sensibility through mouse wheel +#define VJMOUSEWHEEL 0x00000800 // tune sensibility through mouse wheel typedef struct { @@ -368,6 +380,7 @@ typedef struct PALETTEENTRY Palette[256]; BOOL AllowMultiTask; DWORD VJoyStatus; + DWORD VJoySensivity; short joyposx; short joyposy; } DXWNDSTATUS; diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 0cf6795..2b15d21 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b2007119a0075012b9c97e2f0532e9c00393cd639510b97d7984683ad53776d -size 793088 +oid sha256:66c9cb4107758dceb3b65f8f4c1422c950197c50f039e41ff421489b1e5128ac +size 794112 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 161bb2d..7f5c434 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2708b771a49673ae154fffa2cadaaefe2eab5b1fb497f35c84f14d1a4bde1701 -size 681472 +oid sha256:f46151918909f2ce7b12958e32290a0173cd6e56e3471c371f4f3db4d9eecc67 +size 707584 diff --git a/build/exports/Nightmare Creatures demo (sw mode).dxw b/build/exports/Nightmare Creatures demo (sw mode).dxw new file mode 100644 index 0000000..c9ffe9b --- /dev/null +++ b/build/exports/Nightmare Creatures demo (sw mode).dxw @@ -0,0 +1,36 @@ +[target] +title0=Nightmare Creatures demo (sw mode) +path0=D:\Games\nc_demo\nc.exe +startfolder0= +launchpath0=D:\Games\nc_demo\nc.exe -pc +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=5248 +flagk0=65536 +flagl0=0 +flagm0=268435456 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Nightmare Creatures demo.dxw b/build/exports/Nightmare Creatures demo.dxw new file mode 100644 index 0000000..4247f3e --- /dev/null +++ b/build/exports/Nightmare Creatures demo.dxw @@ -0,0 +1,36 @@ +[target] +title0=Nightmare Creatures demo +path0=D:\Games\nc_demo\nc.exe +startfolder0= +launchpath0= +module0= +opengllib0= +notes0= +registry0= +ver0=0 +monitorid0=-1 +coord0=0 +flag0=673185826 +flagg0=1207959552 +flagh0=20 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +flagl0=0 +flagm0=301989888 +tflag0=0 +dflag0=0 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=0 +swapeffect0=0 +maxddinterface0=7 +slowratio0=2 +scanline0=0 +initresw0=800 +initresh0=600 diff --git a/build/exports/Star Trek Armada.dxw b/build/exports/Star Trek Armada.dxw index b8f7965..70e5009 100644 --- a/build/exports/Star Trek Armada.dxw +++ b/build/exports/Star Trek Armada.dxw @@ -4,15 +4,15 @@ path0=D:\Games\Star Trek Armada\Armada.exe launchpath0= module0= opengllib0= -notes0= +notes0=Side effect (to be known):\nDo not notify on task switch: inhibits the game cursor registry0= ver0=0 coord0=0 -flag0=-2011168669 -flagg0=1543503872 -flagh0=98320 -flagi0=136314884 -flagj0=4224 +flag0=-1474297822 +flagg0=1476395008 +flagh0=8208 +flagi0=138412036 +flagj0=128 flagk0=327680 tflag0=0 initx0=0 @@ -21,8 +21,8 @@ minx0=0 miny0=0 maxx0=0 maxy0=0 -posx0=100 -posy0=100 +posx0=50 +posy0=50 sizx0=800 sizy0=600 maxfps0=0 @@ -30,3 +30,13 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 +startfolder0= +monitorid0=0 +flagl0=0 +flagm0=536870912 +dflag0=0 +maxddinterface0=7 +slowratio0=1 +scanline0=1 +initresw0=0 +initresh0=0 diff --git a/build/exports/dxwnd.reg b/build/exports/dxwnd.reg new file mode 100644 index 0000000..f56c51a --- /dev/null +++ b/build/exports/dxwnd.reg @@ -0,0 +1,233 @@ + +[HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft Games\Motocross Madness] +"1.0"=".\\" + +[HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft Games\Motocross Madness\1.0] +"InstalledFrom"=".\\" +"HardDriveRootPath"=".\\" +"InstallType"="Full" +"version"="1.0" +"Launched"="1" +"PID"="87799-442-0210567-79960" +"Path"=".\\" +"VersionType"="RetailVersion" +"InstalledGroup"="15" +"LangID"=dword:00000009 +"OmitDriverCheck"=dword:00000000 +"LocalDriverInfo"=hex:4e,56,33,44,44,33,32,2e,44,4c,4c,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,34,2e,31,30,2e,30,2e,31,37,31,33,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,44,69,61,6d,6f,6e,64,20,56,69,70,65,72,20,\ + 56,33,33,30,20,28,4e,76,69,64,69,61,20,52,69,76,61,20,31,32,38,29,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,44,69,61,6d,\ + 6f,6e,64,20,56,69,70,65,72,20,56,33,33,30,20,28,4e,76,69,64,69,61,20,52,69,\ + 76,61,20,31,32,38,29,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,44,69,61,6d,6f,6e,64,20,4d,75,6c,74,69,6d,65,64,69,61,20,\ + 53,79,73,74,65,6d,73,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,08,6d,6d,33,64,66,78,33,32,2e,64,6c,6c,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,34,2e,31,\ + 30,2e,30,2e,31,35,39,38,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,33,44,66,78,20,56,6f,6f,64,6f,6f,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,33,44,66,78,20,56,6f,6f,\ + 64,6f,6f,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,33,44,66,78,20,49,6e,74,65,72,61,63,74,69,76,65,2c,20,49,6e,63,2e,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,08 + +[HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft Games\Motocross Madness\1.0\DriverInfo] + +[HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft Games\Motocross Madness\1.0\DriverInfo\{00000000-0000-0000-0000-000000000000}] +"Driver"="NV3DD32.DLL" +"Version"="4.10.0.1713" +"Description"="Diamond Viper V330 (Nvidia Riva 128)" +"DeviceID"="PCI\\VEN_12D2&DEV_0018&SUBSYS_10921092&REV_10\\000800" +"NumberOfModes"=dword:00000025 +"Modes"=hex:40,01,00,00,c8,00,00,00,08,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,40,01,00,00,f0,00,00,00,08,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,90,01,00,00,2c,01,00,00,08,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,e0,01,00,00,68,01,00,00,08,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,80,01,00,00,08,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,02,00,00,90,01,00,\ + 00,08,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,02,00,00,\ + e0,01,00,00,08,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,20,\ + 03,00,00,58,02,00,00,08,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,c0,03,00,00,d0,02,00,00,08,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,04,00,00,00,03,00,00,08,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,80,04,00,00,60,03,00,00,08,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,05,00,00,00,04,00,00,08,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,06,00,00,b0,04,00,00,08,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,01,00,00,c8,00,00,00,\ + 10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,40,01,00,00,f0,\ + 00,00,00,10,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,e0,fd,ff,01,90,01,\ + 00,00,2c,01,00,00,10,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,e0,fd,ff,\ + 01,e0,01,00,00,68,01,00,00,10,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,\ + e0,fd,ff,01,00,02,00,00,80,01,00,00,10,00,00,00,00,00,00,00,01,00,00,00,00,\ + 00,00,00,e0,fd,ff,01,80,02,00,00,90,01,00,00,10,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,80,02,00,00,e0,01,00,00,10,00,00,00,00,00,00,\ + 00,01,00,00,00,00,00,00,00,e0,fd,ff,01,20,03,00,00,58,02,00,00,10,00,00,00,\ + 00,00,00,00,01,00,00,00,00,00,00,00,e0,fd,ff,01,c0,03,00,00,d0,02,00,00,10,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,04,00,00,00,03,\ + 00,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,04,00,\ + 00,60,03,00,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,05,00,00,00,04,00,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,40,06,00,00,b0,04,00,00,10,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,40,01,00,00,c8,00,00,00,20,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,40,01,00,00,f0,00,00,00,20,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,90,01,00,00,2c,01,00,00,20,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,e0,01,00,00,68,01,00,00,20,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,00,80,01,00,\ + 00,20,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,02,00,00,\ + 90,01,00,00,20,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,80,\ + 02,00,00,e0,01,00,00,20,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,20,03,00,00,58,02,00,00,20,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,c0,03,00,00,d0,02,00,00,20,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,04,00,00,00,03,00,00,20,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,80,04,00,00,60,03,00,00,20,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00 +"TextureSizes"=hex:00,00,02,00,aa,aa,02,00,00,80,00,00,aa,aa,00,00,00,20,00,00,\ + aa,2a,00,00,00,08,00,00,a0,0d,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\ + 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 + +[HKEY_LOCAL_MACHINE\Software\Microsoft\Microsoft Games\Motocross Madness\1.0\DriverInfo\{3A0CFD01-9320-11CF-ACA1-00A02413C2E2}] +"Driver"="mm3dfx32.dll" +"Version"="4.10.0.1598" +"Description"="3Dfx Voodoo" +"DeviceID"="PCI\\VEN_121A&DEV_0001&SUBSYS_00000000&REV_02\\BUS_00&DEV_0E&FUNC_00" +"NumberOfModes"=dword:00000004 +"Modes"=hex:00,02,00,00,80,01,00,00,10,00,00,00,00,00,00,00,01,00,00,00,01,00,\ + 00,00,00,00,40,00,80,02,00,00,90,01,00,00,10,00,00,00,00,00,00,00,00,00,00,\ + 00,01,00,00,00,00,00,00,00,80,02,00,00,e0,01,00,00,10,00,00,00,00,00,00,00,\ + 01,00,00,00,01,00,00,00,00,00,40,00,20,03,00,00,58,02,00,00,10,00,00,00,00,\ + 00,00,00,01,00,00,00,00,00,00,00,00,00,40,00 +"TextureSizes"=hex:00,00,02,00,33,ab,02,00,00,80,00,00,33,ab,00,00,00,20,00,00,\ + 33,2b,00,00,00,08,00,00,33,0b,00,00,00,04,01,00,55,59,01,00,00,44,00,00,55,\ + 59,00,00,00,14,00,00,55,19,00,00,00,08,00,00,55,09,00,00 + + diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index e49beaa..5d832e2 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -1563,3 +1563,11 @@ fix: error messages on LoadLibrary errors v2.04.16 add: improved virtual joystick with configuration and monitoring panel, invert axis options, show crossfire. fix: GetAttachedSurface now simulates also the primary surface as attach to backbuffer. Fixes GTA first episode windows version. + +v2.04.17 +add: 2 more DWORD flags, unused for now +add: virtual joystick sensivity control +fix: check on ZBUFFER capability attribution in case the capsdb holds a wrong capability belonging to a different surface that was deleted +add: "Fix LoadLibrary error" flag (LOADLIBRARYERR) to return ERROR_DLL_NOT_FOUND instead of ERROR_MOD_NOT_FOUND error code. Fixes "Nightmare Creatures". +add: "Hybrid" flag for "Shared ddraw & GDI DC" mode - reduces "Star Treck: Armada" problems. + diff --git a/dll/ddraw.cpp b/dll/ddraw.cpp index b58ce2c..547d908 100644 --- a/dll/ddraw.cpp +++ b/dll/ddraw.cpp @@ -2568,7 +2568,10 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet DWORD dwCaps; lpDDZBuffer = *lplpddas; dwCaps = dxwcdb.GetCaps(*lplpddas); - if(!dwCaps){ + // v2.04.17 - beware: the caps db is not properly cleaned on surface destruction, so it may happen + // that you get a fake-known case where the caps are referred to some other surface type. + // Happened in "Star Treck: Armada" where the ZBUFFER collects an old PRIMARY caps entry. + if(!dwCaps || !(dwCaps & DDSCAPS_ZBUFFER)){ dwCaps = dxwcdb.GetCaps(lpdds); if(dwCaps){ dwCaps &= ~(DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_BACKBUFFER|DDSCAPS_3DDEVICE|DDSCAPS_COMPLEX); diff --git a/dll/dxwcore.hpp b/dll/dxwcore.hpp index 39454d1..ef3e2f8 100644 --- a/dll/dxwcore.hpp +++ b/dll/dxwcore.hpp @@ -176,6 +176,8 @@ public: // simple data variables DWORD dwFlags6; DWORD dwFlags7; DWORD dwFlags8; + DWORD dwFlags9; + DWORD dwFlags10; DWORD dwTFlags; HWND hParentWnd; HWND hChildWnd; diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index 07f36f0c9dcacc833481caea73ab9b2258e0456d..da2dbe5adbd2571c2f0cfa8253d14c2f0841979a 100644 GIT binary patch delta 76 zcmexyjQPhg<_QUm<{J~Q-eEM~Y<~9$6QlXWMB&N&5A-06Kp0~(jBypl5PxU{R. #include "TlHelp32.h" -#define VERSION "2.04.16" +#define VERSION "2.04.17" #define DDTHREADLOCK 1 @@ -123,7 +123,10 @@ int SetTarget(DXWNDSTATUS *statusmap, TARGETMAP *targets){ pStatus->DXVersion = 0; pStatus->AllowMultiTask=GetMultiTaskEnabling(); //pStatus->VJoyStatus=VJOYENABLED|CROSSENABLED|INVERTYAXIS; - if(statusmap) pStatus->VJoyStatus=statusmap->VJoyStatus; + if(statusmap) { + pStatus->VJoyStatus=statusmap->VJoyStatus; + pStatus->VJoySensivity=statusmap->VJoySensivity; + } for(i = 0; targets[i].path[0]; i ++){ char *c; pMapping[i] = targets[i]; @@ -362,7 +365,7 @@ static char *FlagNames[9][32] ={{ "MARKWING32", "DYNAMICZCLEAN", "MARKGDI32", "DUMPDIBSECTION", "DUMPDEVCONTEXT", "QUALITYFONTS", "ALLOWSYSMEMON3DDEV", "CLIPMENU", "BACKGROUNDPRIORITY", "OFFSCREENZBUFFER", "VIRTUALHEAP", "ZBUFFERHARDCLEAN", - "", "", "", "", + "LOADLIBRARYERR", "SHAREDDCHYBRID", "", "", },{ // TFlags "OUTTRACE", "OUTDDRAWTRACE", "OUTWINMESSAGES", "OUTCURSORTRACE", diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 5f975ddf41746ab5737ec21875e4cfa0a0836b9e..ecb19e122501ad932b59ebce26d9927922881a0f 100644 GIT binary patch literal 81902 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 delta 8889 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 J{e`H<{u`nWMqU5_ diff --git a/dll/gdi32.cpp b/dll/gdi32.cpp index cd3a655..4ddf445 100644 --- a/dll/gdi32.cpp +++ b/dll/gdi32.cpp @@ -980,7 +980,7 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH case 1: // memory to screen case 3: // screen to screen dxw.HandleFPS(); // handle refresh delays - sdc.GetPrimaryDC(hdcDest); + sdc.GetPrimaryDC(hdcDest, hdcSrc); res=(*pGDIBitBlt)(sdc.GetHdc(), nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); sdc.PutPrimaryDC(hdcDest, TRUE, nXDest, nYDest, nWidth, nHeight); break; @@ -1027,7 +1027,7 @@ BOOL WINAPI extGDIBitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nH if (hdcDest==dxw.RealHDC) { hdcDest=dxw.VirtualHDC; dxw.HandleFPS(); // handle refresh delays - } + } res=(*pGDIBitBlt)(hdcDest, nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, dwRop); OutTraceB("GDI.BitBlt: DEBUG emulated hdc dest=%x->%x\n", dxw.RealHDC, hdcDest); break; @@ -1097,7 +1097,7 @@ BOOL WINAPI extGDIStretchBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, in break; case 1: // memory to screen case 3: // screen to screen - sdc.GetPrimaryDC(hdcDest); + sdc.GetPrimaryDC(hdcDest, hdcSrc); res=(*pGDIStretchBlt)(sdc.GetHdc(), nXDest, nYDest, nWidth, nHeight, hdcSrc, nXSrc, nYSrc, nWSrc, nHSrc, dwRop); sdc.PutPrimaryDC(hdcDest, TRUE, nXDest, nYDest, nWidth, nHeight); break; diff --git a/dll/kernel32.cpp b/dll/kernel32.cpp index c1445b8..08e4644 100644 --- a/dll/kernel32.cpp +++ b/dll/kernel32.cpp @@ -599,6 +599,10 @@ HMODULE WINAPI LoadLibraryExWrapper(LPVOID lpFileName, BOOL IsWidechar, HANDLE h if(!libhandle){ OutTraceE("%s: ERROR FileName=%s err=%d\n", api, lpFileName, GetLastError()); Recursed = FALSE; + + // compatibility issue: some games (Nightmare Creatures) check for the ERROR_DLL_NOT_FOUND + // errorcode or assume the library is there, hence the dialog box about a SDL.DLL file to delete. + if((dxw.dwFlags8 & LOADLIBRARYERR) && (GetLastError()==ERROR_MOD_NOT_FOUND)) SetLastError(ERROR_DLL_NOT_FOUND); return libhandle; } diff --git a/dll/shareddc.cpp b/dll/shareddc.cpp index e99bf0a..64b234b 100644 --- a/dll/shareddc.cpp +++ b/dll/shareddc.cpp @@ -52,6 +52,11 @@ dxwSDC::~dxwSDC() static IDirect3DSurface9 *pDestSurface = NULL; HDC dxwSDC::GetPrimaryDC(HDC hdc) +{ + return GetPrimaryDC(hdc, NULL); +} + +HDC dxwSDC::GetPrimaryDC(HDC hdc, HDC hdcsrc) { HRESULT res; extern HandleDDThreadLock_Type pReleaseDDThreadLock; @@ -59,10 +64,13 @@ HDC dxwSDC::GetPrimaryDC(HDC hdc) OutTraceB("dxwSDC::GetPrimaryDC: hdc=%x\n", hdc); + CurrentHDCSrc = hdcsrc; + CurrentHDC = hdc; + // look for ddraw first //if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); lpDDSPrimary = dxwss.GetPrimarySurface(); - if (lpDDSPrimary) { + if (lpDDSPrimary) { if(pReleaseDDThreadLock)(*pReleaseDDThreadLock)(); res=((*pGetDCMethod())(lpDDSPrimary, &PrimaryDC)); while((PrimaryDC == NULL) && lpDDSPrimary) { @@ -242,6 +250,7 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int if(UpdateScreen){ switch(VirtualSurfaceType){ case VIRTUAL_ON_DDRAW: + ret=(*pGDIBitBlt)(PrimaryDC, XDest+VirtualOffset.x, YDest+VirtualOffset.y, nDestWidth, nDestHeight, VirtualHDC, XDest, YDest, SRCCOPY); if(!ret || (ret==GDI_ERROR)) { OutTraceE("dxwSDC::PutPrimaryDC: BitBlt ERROR ret=%x err=%d\n", ret, GetLastError()); @@ -251,8 +260,28 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR res=%x\n", res); } dxw.ScreenRefresh(); + + // trick: duplicate the operation using the stretched mode to blit over clipped areas. + // good for "Star Treck: Armada". + if((dxw.dwFlags8 & SHAREDDCHYBRID) && CurrentHDCSrc && (WindowFromDC(CurrentHDC)!=dxw.GethWnd())){ + int nWDest, nHDest, nXDest, nYDest; + OutTraceB("dxwSDC::PutPrimaryDC: StretchBlt over ddraw\n"); + nXDest= XDest; + nYDest= YDest; + nWDest= nDestWidth; + nHDest= nDestHeight; + dxw.MapClient(&nXDest, &nYDest, &nWDest, &nHDest); + res=(*pGDIStretchBlt)( + CurrentHDC, nXDest, nYDest, nWDest, nHDest, + CurrentHDCSrc, XDest, YDest, nDestWidth, nDestHeight, SRCCOPY); + if(!res) OutTraceE("dxwSDC::PutPrimaryDC: StretchBlt ERROR err=%d\n", GetLastError()); + //res=(*pGDIReleaseDC)(WindowFromDC(CurrentHDC), CurrentHDC); + //if(!res) OutTraceE("dxwSDC::PutPrimaryDC: ReleaseDC ERROR err=%d\n", GetLastError()); + } + break; case VIRTUAL_ON_WINDOW: + SetStretchBltMode(PrimaryDC, HALFTONE); RECT RealArea, VirtualArea; // some fullscreen games ("Imperialism II") blitted from negative coordinates -2,-2 !! @@ -275,6 +304,7 @@ BOOL dxwSDC::PutPrimaryDC(HDC hdc, BOOL UpdateScreen, int XDest, int YDest, int if(PrimaryDC)ret=(*pGDIStretchBlt)(PrimaryDC, RealArea.left, RealArea.top, RealArea.right, RealArea.bottom, VirtualHDC, VirtualArea.left, VirtualArea.top, VirtualArea.right, VirtualArea.bottom, SRCCOPY); ret=(*pGDIReleaseDC)(dxw.GethWnd(), PrimaryDC); break; + } } else { diff --git a/dll/shareddc.hpp b/dll/shareddc.hpp index 0ac049a..3a34cf6 100644 --- a/dll/shareddc.hpp +++ b/dll/shareddc.hpp @@ -20,6 +20,7 @@ public: // Operations public: // methods HDC GetPrimaryDC(HDC); + HDC GetPrimaryDC(HDC, HDC); HDC GetHdc(void); BOOL PutPrimaryDC(HDC, BOOL, int, int, int, int); BOOL PutPrimaryDC(HDC, BOOL); @@ -31,6 +32,7 @@ private: HDC PrimaryDC; HDC VirtualHDC; HDC CurrentHDC; + HDC CurrentHDCSrc; HWND CurrenthWnd; LPDIRECTDRAWSURFACE lpDDSPrimary; HBITMAP VirtualPic; diff --git a/dll/user32.cpp b/dll/user32.cpp index 2136309..722b252 100644 --- a/dll/user32.cpp +++ b/dll/user32.cpp @@ -2918,8 +2918,9 @@ int WINAPI extDrawTextA(HDC hdc, LPCTSTR lpchText, int nCount, LPRECT lpRect, UI ret=(*pDrawTextA)(sdc.GetHdc(), lpchText, nCount, lpRect, uFormat); if(nCount) sdc.PutPrimaryDC(hdc, TRUE, lpRect->left, lpRect->top, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top); - else - sdc.PutPrimaryDC(hdc, FALSE); // Diablo makes a DrawText of nuull string in the intro ... + else { + sdc.PutPrimaryDC(hdc, FALSE); // Diablo makes a DrawText of null string in the intro ... + } return ret; break; case GDIMODE_STRETCHED: @@ -2949,14 +2950,14 @@ int WINAPI extDrawTextExA(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, U int ret; OutTraceDW("DrawTextExA: hdc=%x rect=(%d,%d)-(%d,%d) DTFormat=%x Text=(%d)\"%s\"\n", hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, dwDTFormat, nCount, lpchText); - if (IsDebug){ - if(lpDTParams) - OutTrace("DTParams: size=%d (L,R)margins=(%d,%d) TabLength=%d lDrawn=%d\n", - lpDTParams->cbSize, lpDTParams->iLeftMargin, lpDTParams->iRightMargin, - lpDTParams->iTabLength, lpDTParams->uiLengthDrawn); - else - OutTrace("DTParams: NULL\n"); - } + if (IsDebug){ + if(lpDTParams) + OutTrace("DTParams: size=%d (L,R)margins=(%d,%d) TabLength=%d lDrawn=%d\n", + lpDTParams->cbSize, lpDTParams->iLeftMargin, lpDTParams->iRightMargin, + lpDTParams->iTabLength, lpDTParams->uiLengthDrawn); + else + OutTrace("DTParams: NULL\n"); + } gFixed = TRUE; // semaphore to avoid multiple scaling with HOT patching if(dxw.IsToRemap(hdc)){ @@ -2964,7 +2965,10 @@ int WINAPI extDrawTextExA(HDC hdc, LPTSTR lpchText, int nCount, LPRECT lpRect, U case GDIMODE_SHAREDDC: sdc.GetPrimaryDC(hdc); ret=(*pDrawTextExA)(sdc.GetHdc(), lpchText, nCount, lpRect, dwDTFormat, lpDTParams); - sdc.PutPrimaryDC(hdc, TRUE, lpRect->left, lpRect->top, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top); + if(nCount) + sdc.PutPrimaryDC(hdc, TRUE, lpRect->left, lpRect->top, lpRect->right-lpRect->left, lpRect->bottom-lpRect->top); + else + sdc.PutPrimaryDC(hdc, FALSE); // in cases like Diablo that makes a DrawText of null string in the intro ... return ret; break; case GDIMODE_STRETCHED: diff --git a/dll/winmm.cpp b/dll/winmm.cpp index 762b764..36f03c9 100644 --- a/dll/winmm.cpp +++ b/dll/winmm.cpp @@ -540,6 +540,27 @@ MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc) return JOYERR_NOERROR; } +BOOL JoyProcessMouseWheelMessage(WPARAM wParam, LPARAM lParam) +{ + int zDelta; + DWORD dwSensivity = GetHookInfo()->VJoySensivity; + DWORD dwJoyStatus = GetHookInfo()->VJoyStatus; + + if(!(dwJoyStatus & VJMOUSEWHEEL)) return FALSE; + + if(!dwSensivity) dwSensivity=100; + //fwKeys = GET_KEYSTATE_WPARAM(wParam); + zDelta = GET_WHEEL_DELTA_WPARAM(wParam); + if(zDelta > 4 * WHEEL_DELTA) zDelta = 4 * WHEEL_DELTA; + if(zDelta < -4 * WHEEL_DELTA) zDelta = -4 * WHEEL_DELTA; + if(zDelta > 0) dwSensivity = (dwSensivity * 110 * zDelta) / (100 * WHEEL_DELTA); + if(zDelta < 0) dwSensivity = (dwSensivity * 100 * -zDelta) / (110 * WHEEL_DELTA); + if(dwSensivity < 32) dwSensivity = 32; + if(dwSensivity > 250) dwSensivity = 250; + GetHookInfo()->VJoySensivity = dwSensivity; + return TRUE; +} + static MMRESULT GetJoy(char *apiname, DWORD uJoyID, LPJOYINFO lpj) { OutTraceC("%s: joyid=%d\n", apiname, uJoyID); @@ -601,19 +622,58 @@ static MMRESULT GetJoy(char *apiname, DWORD uJoyID, LPJOYINFO lpj) } else{ OutTraceB("%s: ACTIVE mouse=(%d,%d)\n", apiname, pt.x, pt.y); - if(pt.x < client.left) pt.x = client.left; - if(pt.x > client.right) pt.x = client.right; - if(pt.y < client.top) pt.y = client.top; - if(pt.y > client.bottom) pt.y = client.bottom; CenterX = (client.right - client.left) >> 1; CenterY = (client.bottom - client.top) >> 1; - x = ((pt.x - CenterX) * XSPAN) / client.right; - y = ((pt.y - CenterY) * YSPAN) / client.bottom; + if(dwVJoyStatus & VJMOUSEMAP){ + if(pt.x < client.left) pt.x = client.left; + if(pt.x > client.right) pt.x = client.right; + if(pt.y < client.top) pt.y = client.top; + if(pt.y > client.bottom) pt.y = client.bottom; + + x = ((pt.x - CenterX) * XSPAN) / client.right; + y = ((pt.y - CenterY) * YSPAN) / client.bottom; + + if(dwVJoyStatus & VJAUTOCENTER) { + // autocenter: each time, moves 1/20 distance toward centered 0,0 position + // 1/20 = 0.05, changing value changes the autocenter speed (must be >0.0 and <1.0) + int x1, y1; + x1 = (int)(pt.x + upleft.x - ((pt.x - CenterX) * 0.05)); + y1 = (int)(pt.y + upleft.y - ((pt.y - CenterY) * 0.05)); + if((x1 != pt.x+upleft.x) || (y1 != pt.y+upleft.y)) (*pSetCursorPos)(x1, y1); + } + } + + if(dwVJoyStatus & VJKEYBOARDMAP){ + if (GetKeyState(VK_LEFT) < 0) x = -XSPAN/2; + if (GetKeyState(VK_RIGHT) < 0) x = +XSPAN/2; + if (GetKeyState(VK_UP) < 0) y = -YSPAN/2; + if (GetKeyState(VK_DOWN) < 0) y = +YSPAN/2; + if (GetKeyState(VK_SPACE) < 0) dwButtons |= JOY_BUTTON1; + if (GetKeyState(VK_LCONTROL) < 0) dwButtons |= JOY_BUTTON2; + } + if(dwVJoyStatus & INVERTXAXIS) x = -x; if(dwVJoyStatus & INVERTYAXIS) y = -y; + //if(dwVJoyStatus & VJSENSIVITY){ + { + DWORD dwSensivity = GetHookInfo()->VJoySensivity; + if(dwSensivity){ + x = (x * (LONG)dwSensivity) / 100; + y = (y * (LONG)dwSensivity) / 100; + if(x > +XSPAN) x = +XSPAN; + if(x < -XSPAN) x = -XSPAN; + if(y > +YSPAN) y = +YSPAN; + if(y < -YSPAN) y = -YSPAN; + } + } + } + if (dwVJoyStatus & CROSSENABLED) { + int jx, jy; + jx = CenterX + (x * client.right) / XSPAN; + jy = CenterY + (y * client.bottom) / YSPAN; + ShowJoystick(jx, jy, dwButtons); } - if (dwVJoyStatus & CROSSENABLED) ShowJoystick(pt.x, pt.y, dwButtons); } lpj->wXpos = x; lpj->wYpos = y; diff --git a/dll/winproc.cpp b/dll/winproc.cpp index 4125a30..638b722 100644 --- a/dll/winproc.cpp +++ b/dll/winproc.cpp @@ -13,6 +13,7 @@ extern void SuppressIMEWindow(); extern void RecoverScreenMode(); extern void dx_FullScreenToggle(HWND); extern void dx_DesktopToggle(HWND, BOOL); +extern BOOL JoyProcessMouseWheelMessage(WPARAM, LPARAM); static void dx_ToggleLogging() { @@ -494,6 +495,10 @@ LRESULT CALLBACK extWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lp break; // fall through cases: case WM_MOUSEWHEEL: + if(dxw.dwFlags6 & VIRTUALJOYSTICK) { + if(dxw.Windowize && (dxw.dwFlags1 & CLIPCURSOR) && !dxw.IsClipCursorActive()) dxw.SetClipCursor(); + if (JoyProcessMouseWheelMessage(wparam, lparam)) return 0; + } // fall through case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_LBUTTONDBLCLK: diff --git a/host/StatusDialog.h b/host/StatusDialog.h index eddabc2..8928d54 100644 --- a/host/StatusDialog.h +++ b/host/StatusDialog.h @@ -13,7 +13,6 @@ public: // Dialog Data enum { IDD = IDD_STATUS }; - int iTimeSlider; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support diff --git a/host/TabCompat.cpp b/host/TabCompat.cpp index d956331..0ddea38 100644 --- a/host/TabCompat.cpp +++ b/host/TabCompat.cpp @@ -50,12 +50,9 @@ void CTabCompat::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_COLORFIX, cTarget->m_ColorFix); DDX_Check(pDX, IDC_FIXGLOBALUNLOCK, cTarget->m_FixGlobalUnlock); DDX_Check(pDX, IDC_FIXFREELIBRARY, cTarget->m_FixFreeLibrary); - - // Registry management - DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); - DDX_Check(pDX, IDC_OVERRIDEREGISTRY, cTarget->m_OverrideRegistry); - DDX_Check(pDX, IDC_WOW64REGISTRY, cTarget->m_Wow64Registry); - DDX_Check(pDX, IDC_WOW32REGISTRY, cTarget->m_Wow32Registry); + DDX_Check(pDX, IDC_LOADLIBRARYERR, cTarget->m_LoadLibraryErr); + DDX_Check(pDX, IDC_PRETENDVISIBLE, cTarget->m_PretendVisible); + DDX_Check(pDX, IDC_WININSULATION, cTarget->m_WinInsulation); // GOG patches DDX_Check(pDX, IDC_HOOKGOGLIBS, cTarget->m_HookGOGLibs); diff --git a/host/TabRegistry.cpp b/host/TabRegistry.cpp index 7c3de2b..31e45da 100644 --- a/host/TabRegistry.cpp +++ b/host/TabRegistry.cpp @@ -27,7 +27,14 @@ void CTabRegistry::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); CTargetDlg *cTarget = ((CTargetDlg *)(this->GetParent()->GetParent())); + + // Registry management + DDX_Check(pDX, IDC_EMULATEREGISTRY, cTarget->m_EmulateRegistry); + DDX_Check(pDX, IDC_OVERRIDEREGISTRY, cTarget->m_OverrideRegistry); + DDX_Check(pDX, IDC_WOW64REGISTRY, cTarget->m_Wow64Registry); + DDX_Check(pDX, IDC_WOW32REGISTRY, cTarget->m_Wow32Registry); DDX_Text(pDX, IDC_REGISTRY, cTarget->m_Registry); + } BEGIN_MESSAGE_MAP(CTabRegistry, CDialog) diff --git a/host/TabSysLibs.cpp b/host/TabSysLibs.cpp index 96c7554..3d30c6f 100644 --- a/host/TabSysLibs.cpp +++ b/host/TabSysLibs.cpp @@ -34,10 +34,9 @@ void CTabSysLibs::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_QUALITYFONTS, cTarget->m_QualityFonts); DDX_Check(pDX, IDC_NOFILLRECT, cTarget->m_NoFillRect); DDX_Check(pDX, IDC_FIXCLIPPERAREA, cTarget->m_FixClipperArea); + DDX_Check(pDX, IDC_SHAREDDCHYBRID, cTarget->m_SharedDCHybrid); DDX_Check(pDX, IDC_SYNCPALETTE, cTarget->m_SyncPalette); DDX_Check(pDX, IDC_NOWINERRORS, cTarget->m_NoWinErrors); - DDX_Check(pDX, IDC_PRETENDVISIBLE, cTarget->m_PretendVisible); - DDX_Check(pDX, IDC_WININSULATION, cTarget->m_WinInsulation); // OpenGL DDX_Check(pDX, IDC_HOOKOPENGL, cTarget->m_HookOpenGL); // duplicated diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index a89ff6e..e325c80 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -89,6 +89,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_ColorFix = FALSE; m_FixGlobalUnlock = FALSE; m_FixFreeLibrary = FALSE; + m_LoadLibraryErr = FALSE; m_NoPixelFormat = FALSE; m_NoAlphaChannel = FALSE; m_FixRefCounter = TRUE; // default true !! @@ -251,6 +252,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_NoGDIBlt = FALSE; m_NoFillRect = FALSE; m_FixClipperArea = FALSE; // ?? + m_SharedDCHybrid = FALSE; // ?? m_SyncPalette = FALSE; m_NoWinErrors = FALSE; m_PretendVisible = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index 78ff6db..e77544c 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -201,6 +201,7 @@ public: BOOL m_NoGDIBlt; BOOL m_NoFillRect; BOOL m_FixClipperArea; + BOOL m_SharedDCHybrid; BOOL m_SyncPalette; BOOL m_NoWinErrors; BOOL m_PretendVisible; @@ -251,6 +252,7 @@ public: BOOL m_ColorFix; BOOL m_FixGlobalUnlock; BOOL m_FixFreeLibrary; + BOOL m_LoadLibraryErr; BOOL m_NoPixelFormat; BOOL m_NoAlphaChannel; BOOL m_FixRefCounter; diff --git a/host/VJoyDialog.cpp b/host/VJoyDialog.cpp index 282161c..7e50d4e 100644 --- a/host/VJoyDialog.cpp +++ b/host/VJoyDialog.cpp @@ -4,11 +4,53 @@ #include "stdafx.h" #include "dxwndhost.h" #include "VJoyDialog.h" +#include #define XSPAN 128 #define YSPAN 128 -#define PICWIDTH 140 -#define PICHEIGHT 140 + +/* + // calculates the closest m_Slider value + int pos, delta, lastdelta; + lastdelta=200; + for(pos=-10; pos<=10; pos++){ + int s; + s = (int)(100 * pow(TICKMULTIPLIER, (float)pos)); + delta = abs(s - this->m_VJoySensivity); + if(delta > lastdelta) break; + lastdelta = delta; + } + this->m_Slider = pos-1; +*/ + +int CVJoyDialog::GetSliderPos(int sensivity) +{ + int pos; + int delta, lastdelta; + lastdelta = 400; // initial value big enough ... + for(pos=-20; pos<=20; pos++){ + delta = abs(Multipliers[20+pos] - sensivity); + if(delta > lastdelta) break; + lastdelta = delta; + } + return pos-1; +} + +int CVJoyDialog::SetSensivity(int slider) +{ + if(slider < -20) slider = -20; + if(slider > 20) slider = 20; + return Multipliers[20+slider]; +} + +void CVJoyDialog::InitSensivity(void) +{ + int Multiplier; + int pos; + for(Multiplier = 100, pos=-1; pos>=-20; pos--) Multipliers[20+pos] = Multiplier = (Multiplier * 100) / 105; + for(Multiplier = 100, pos= 1; pos<= 20; pos++) Multipliers[20+pos] = Multiplier = (Multiplier * 105) / 100; + Multipliers[20] = 100; +} // CVJoyDialog dialog @@ -36,6 +78,10 @@ void CVJoyDialog::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_INVERTYAXIS, this->m_InvertYAxis); DDX_Check(pDX, IDC_B1AUTOFIRE, this->m_B1AutoFire); DDX_Check(pDX, IDC_B2AUTOFIRE, this->m_B2AutoFire); + DDX_Check(pDX, IDC_VJAUTOCENTER, this->m_VJAutoCenter); + DDX_Check(pDX, IDC_VJMOUSEWHEEL, this->m_VJMouseWheel); + DDX_Radio(pDX, IDC_VJ_USEMOUSE, this->m_UseMode); + DDX_Slider(pDX, IDC_SENSIVITY_SLIDER, this->m_Slider); //}}AFX_DATA_MAP } @@ -47,6 +93,7 @@ END_MESSAGE_MAP() #define IDVJoyTIMER 3 #define FINDERSIZE 5 #define CROSSSIZE 20 +#define TICKMULTIPLIER 1.05f // CVJoyDialog message handlers @@ -55,7 +102,23 @@ void CVJoyDialog::OnTimer(UINT_PTR nIDEvent) // IDC_VJOYPOSITION int x, y; DWORD dwVJoyStatus; + DWORD dwSensivity; + CString text; + static DWORD dwLastSensivity = 0; + + // takes care of external updates of sensivity by mouse wheel + dwSensivity = GetHookInfo()->VJoySensivity; + if(dwLastSensivity && (dwSensivity != dwLastSensivity)){ + CSliderCtrl *Slider; + this->m_Slider = this->GetSliderPos(dwSensivity); + Slider=(CSliderCtrl *)this->GetDlgItem(IDC_SENSIVITY_SLIDER); + Slider->SetPos(this->m_Slider); + } + CDialog::UpdateData(); // calls DoDataExchange + this->m_VJoySensivity = this->SetSensivity(m_Slider); + dwLastSensivity = this->m_VJoySensivity; + dwVJoyStatus = GetHookInfo()->VJoyStatus; this->m_VJoyPresent = (dwVJoyStatus & VJOYPRESENT) ? 1 : 0; dwVJoyStatus &= VJOYPRESENT; // clear all BUT VJOYPRESENT! @@ -65,22 +128,43 @@ void CVJoyDialog::OnTimer(UINT_PTR nIDEvent) if(this->m_InvertXAxis) dwVJoyStatus |= INVERTXAXIS; if(this->m_B1AutoFire) dwVJoyStatus |= B1AUTOFIRE; if(this->m_B2AutoFire) dwVJoyStatus |= B2AUTOFIRE; + if(this->m_VJAutoCenter) dwVJoyStatus |= VJAUTOCENTER; + if(this->m_VJMouseWheel) dwVJoyStatus |= VJMOUSEWHEEL; + switch(this->m_UseMode){ + case 0: dwVJoyStatus |= VJMOUSEMAP; break; + case 1: dwVJoyStatus |= VJKEYBOARDMAP; break; + case 2: dwVJoyStatus |= (VJKEYBOARDMAP|VJMOUSEMAP); break; + } + if(this->m_VJoyEnabled && this->m_VJoyPresent){ CWnd *JoyPos = this->GetDlgItem(IDC_VJOYPOSITION); CDC *dc = JoyPos->GetDC(); RECT client; - CString coord; JoyPos->GetClientRect(&client); x = (client.right/2) + ((GetHookInfo()->joyposx * client.right) / XSPAN); y = (client.bottom/2) + ((GetHookInfo()->joyposy * client.bottom) / YSPAN); + // clear whole square area dc->FillRect(&client, Background); + // draw sensivity circle + dc->SelectObject(SensivityPen); + dc->Ellipse( + (client.right)*(250-dwSensivity)/500, + (client.bottom)*(250-dwSensivity)/500, + (client.right)*(250+dwSensivity)/500, + (client.bottom)*(250+dwSensivity)/500); + // draw center crossfinder dc->SelectObject(CenterPen); dc->MoveTo((client.right/2)-CROSSSIZE,(client.bottom/2)); dc->LineTo((client.right/2)+CROSSSIZE,(client.bottom/2)); dc->MoveTo((client.right/2),(client.bottom/2)-CROSSSIZE); dc->LineTo((client.right/2),(client.bottom/2)+CROSSSIZE); + // draw joystick crossfinder dc->SelectObject(FinderPen); int x0, y0; + if(xclient.right) x = client.right; + if(yclient.bottom) y = client.bottom; x0 = (x-FINDERSIZE)MoveTo(x0,y); x0 = (x+FINDERSIZE)>client.right ? client.right : x+FINDERSIZE; @@ -89,34 +173,53 @@ void CVJoyDialog::OnTimer(UINT_PTR nIDEvent) dc->MoveTo(x,y0); y0 = (y+FINDERSIZE)>client.bottom ? client.bottom : y+FINDERSIZE; dc->LineTo(x,y0); - dc->MoveTo(20,20); - coord.Format("%d,%d", GetHookInfo()->joyposx, GetHookInfo()->joyposy); - dc->TextOutA(5, 5, coord); + //dc->MoveTo(20,20); + text.Format("%d,%d", GetHookInfo()->joyposx, GetHookInfo()->joyposy); + dc->TextOutA(5, 5, text); + text.Format("x%d%%", GetHookInfo()->VJoySensivity); + dc->TextOutA(5, 200, text); dc->DeleteDC(); } GetHookInfo()->VJoyStatus = dwVJoyStatus; + GetHookInfo()->VJoySensivity = this->m_VJoySensivity; + dwLastSensivity = this->m_VJoySensivity; } BOOL CVJoyDialog::OnInitDialog() { DWORD dwVJoyStatus; + CSliderCtrl *Slider; // TODO: Add extra initialization here Background = new(CBrush); Background->CreateSolidBrush(RGB(255, 255, 255)); // white CenterPen = new(CPen); - CenterPen->CreatePen(PS_DOT, 1, RGB(255, 0, 0)); + CenterPen->CreatePen(PS_DOT, 1, RGB(255, 0, 0)); // red FinderPen = new(CPen); - FinderPen->CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); + FinderPen->CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); // black + SensivityPen = new(CPen); + SensivityPen->CreatePen(PS_DOT, 1, RGB(127, 127, 255)); // clear blue + dwVJoyStatus = GetHookInfo()->VJoyStatus; - this->m_VJoyPresent = (dwVJoyStatus & VJOYPRESENT) ? 1 : 0; - this->m_VJoyEnabled = (dwVJoyStatus & VJOYENABLED) ? 1 : 0; - this->m_CrossEnabled= (dwVJoyStatus & CROSSENABLED) ? 1 : 0; - this->m_InvertYAxis = (dwVJoyStatus & INVERTYAXIS) ? 1 : 0; - this->m_InvertXAxis = (dwVJoyStatus & INVERTXAXIS) ? 1 : 0; - this->m_B1AutoFire = (dwVJoyStatus & B1AUTOFIRE) ? 1 : 0; - this->m_B2AutoFire = (dwVJoyStatus & B2AUTOFIRE) ? 1 : 0; + this->m_VJoyPresent = (dwVJoyStatus & VJOYPRESENT) ? 1 : 0; + this->m_VJoyEnabled = (dwVJoyStatus & VJOYENABLED) ? 1 : 0; + this->m_CrossEnabled = (dwVJoyStatus & CROSSENABLED) ? 1 : 0; + this->m_InvertYAxis = (dwVJoyStatus & INVERTYAXIS) ? 1 : 0; + this->m_InvertXAxis = (dwVJoyStatus & INVERTXAXIS) ? 1 : 0; + this->m_B1AutoFire = (dwVJoyStatus & B1AUTOFIRE) ? 1 : 0; + this->m_B2AutoFire = (dwVJoyStatus & B2AUTOFIRE) ? 1 : 0; + this->m_VJAutoCenter = (dwVJoyStatus & VJAUTOCENTER) ? 1 : 0; + this->m_VJMouseWheel = (dwVJoyStatus & VJMOUSEWHEEL) ? 1 : 0; + this->m_UseMode = (dwVJoyStatus & VJKEYBOARDMAP) ? ((dwVJoyStatus & VJMOUSEMAP) ? 2 : 1) : 0; + this->m_VJoySensivity = GetHookInfo()->VJoySensivity; + // calculates the m_Slider values + this->InitSensivity(); + this->m_Slider = this->GetSliderPos(this->m_VJoySensivity); + Slider=(CSliderCtrl *)this->GetDlgItem(IDC_SENSIVITY_SLIDER); + Slider->SetRange(-20, 20, 1); + CDialog::OnInitDialog(); + SetTimer(IDVJoyTIMER, 40, NULL); return TRUE; // return TRUE unless you set the focus to a control @@ -138,8 +241,18 @@ void CVJoyDialog::OnOK() if(this->m_InvertXAxis) dwVJoyStatus |= INVERTXAXIS; if(this->m_B1AutoFire) dwVJoyStatus |= B1AUTOFIRE; if(this->m_B2AutoFire) dwVJoyStatus |= B2AUTOFIRE; + if(this->m_VJAutoCenter) dwVJoyStatus |= VJAUTOCENTER; + if(this->m_VJMouseWheel) dwVJoyStatus |= VJMOUSEWHEEL; + switch(this->m_UseMode){ + case 0: dwVJoyStatus |= VJMOUSEMAP; break; + case 1: dwVJoyStatus |= VJKEYBOARDMAP; break; + case 2: dwVJoyStatus |= (VJKEYBOARDMAP|VJMOUSEMAP); break; + } + this->m_VJoySensivity = (int)(100 * pow(TICKMULTIPLIER, (float)this->m_Slider)); sprintf_s(val, sizeof(val), "%i", dwVJoyStatus); WritePrivateProfileString("joystick", "flags", val, gInitPath); + sprintf_s(val, sizeof(val), "%i", this->m_VJoySensivity); + WritePrivateProfileString("joystick", "sensivity", val, gInitPath); GetHookInfo()->VJoyStatus = dwVJoyStatus; CDialog::OnOK(); } \ No newline at end of file diff --git a/host/VJoyDialog.h b/host/VJoyDialog.h index b0508d5..30ae397 100644 --- a/host/VJoyDialog.h +++ b/host/VJoyDialog.h @@ -27,6 +27,9 @@ protected: virtual void OnOK(); //virtual void OnCancel(); private: + int GetSliderPos(int); + int SetSensivity(int); + void InitSensivity(void); BOOL m_VJoyPresent; BOOL m_VJoyEnabled; BOOL m_CrossEnabled; @@ -34,7 +37,14 @@ private: BOOL m_InvertXAxis; BOOL m_B1AutoFire; BOOL m_B2AutoFire; + BOOL m_VJAutoCenter; + BOOL m_VJMouseWheel; + int m_UseMode; + int m_VJoySensivity; + int m_Slider; CBrush *Background; CPen *CenterPen; CPen *FinderPen; + CPen *SensivityPen; + int Multipliers[41]; }; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index 29c5c67bdbfb2e67374ac8ce00833fa5fd992561..e86564b6e2197b182963af6aa37139613e672dfa 100644 GIT binary patch delta 7175 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 diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index 66ec858a7461a03edaa36db7a279f3cccd3a9545..ed1618ea7815f7c8fa5d843961481b7a3ebfe43f 100644 GIT binary patch delta 10517 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 delta 6948 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 HOEml+u4KU{ diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index c1a831a..1aaf384 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -427,6 +427,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_ColorFix) t->flags3 |= COLORFIX; if(dlg->m_FixGlobalUnlock) t->flags7 |= FIXGLOBALUNLOCK; if(dlg->m_FixFreeLibrary) t->flags7 |= FIXFREELIBRARY; + if(dlg->m_LoadLibraryErr) t->flags8 |= LOADLIBRARYERR; if(dlg->m_NoPixelFormat) t->flags3 |= NOPIXELFORMAT; if(dlg->m_NoAlphaChannel) t->flags4 |= NOALPHACHANNEL; if(dlg->m_FixRefCounter) t->flags4 |= FIXREFCOUNTER; @@ -538,6 +539,7 @@ void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_NoGDIBlt) t->flags3 |= NOGDIBLT; if(dlg->m_NoFillRect) t->flags4 |= NOFILLRECT; if(dlg->m_FixClipperArea) t->flags7 |= FIXCLIPPERAREA; + if(dlg->m_SharedDCHybrid) t->flags8 |= SHAREDDCHYBRID; if(dlg->m_SyncPalette) t->flags6 |= SYNCPALETTE; if(dlg->m_NoWinErrors) t->flags7 |= NOWINERRORS; if(dlg->m_PretendVisible) t->flags8 |= PRETENDVISIBLE; @@ -737,6 +739,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_ColorFix = t->flags3 & COLORFIX ? 1 : 0; dlg->m_FixGlobalUnlock = t->flags7 & FIXGLOBALUNLOCK ? 1 : 0; dlg->m_FixFreeLibrary = t->flags7 & FIXFREELIBRARY ? 1 : 0; + dlg->m_LoadLibraryErr = t->flags8 & LOADLIBRARYERR ? 1 : 0; dlg->m_NoPixelFormat = t->flags3 & NOPIXELFORMAT ? 1 : 0; dlg->m_NoAlphaChannel = t->flags4 & NOALPHACHANNEL ? 1 : 0; dlg->m_FixRefCounter = t->flags4 & FIXREFCOUNTER ? 1 : 0; @@ -870,6 +873,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_NoGDIBlt = t->flags3 & NOGDIBLT ? 1 : 0; dlg->m_NoFillRect = t->flags4 & NOFILLRECT ? 1 : 0; dlg->m_FixClipperArea = t->flags7 & FIXCLIPPERAREA ? 1 : 0; + dlg->m_SharedDCHybrid = t->flags8 & SHAREDDCHYBRID ? 1 : 0; dlg->m_SyncPalette = t->flags6 & SYNCPALETTE ? 1 : 0; dlg->m_NoWinErrors = t->flags7 & NOWINERRORS ? 1 : 0; dlg->m_PretendVisible = t->flags8 & PRETENDVISIBLE ? 1 : 0; @@ -1401,7 +1405,8 @@ void CDxwndhostView::OnInitialUpdate() strcat_s(gInitPath, sizeof(gInitPath), m_ConfigFileName); listctrl.InsertColumn(0, &listcol); - StatusMap.VJoyStatus = GetPrivateProfileInt("joystick", "flags", VJOYENABLED|CROSSENABLED|INVERTYAXIS, gInitPath); + StatusMap.VJoyStatus = GetPrivateProfileInt("joystick", "flags", VJOYENABLED|CROSSENABLED|INVERTYAXIS|VJMOUSEMAP|VJKEYBOARDMAP, gInitPath); + StatusMap.VJoySensivity = GetPrivateProfileInt("joystick", "sensivity", 100, gInitPath); for(i = 0; i < MAXTARGETS; i ++){ if (!LoadConfigItem(&TargetMaps[i], &PrivateMaps[i], i, gInitPath)) break; diff --git a/host/resource b/host/resource index 0882bd01be18826bdf8e9a3bc754b6dec2d93aae..b95b35431cea16374021d238b6a8246bf878b543 100644 GIT binary patch delta 406 zcmZ8du}cDR6n@7YzYHPnhBOsZiQM88TpAkA?!ZhF?@mJq!p5fNXc62(iu*XRF=%P4 zYzm6Drogdi=}%~krru8)q~Z62_r33Z-}m0nofFDa286xuG-dvli+-~8+H!&Fq9E2y)Ka7VQG&3f?py4?@ zPR-!7%_bcxQ-dsW$%dk*r_#w`)|ll