From d9a1b51681e58229383cb6786a4cbbe82b50766e Mon Sep 17 00:00:00 2001 From: gho tik Date: Mon, 11 May 2015 12:42:20 -0400 Subject: [PATCH] v2_03_43_src Former-commit-id: 0c803637a7ab97963738d27af966c40851b0cb19 --- Include/dxwnd.h | 1 + build/dxwnd.dll | 4 +- build/dxwnd.exe | 2 +- build/dxwnd.ini | 143 ++++------------------- build/exports/Arx Fatalis.dxw | 32 ++++++ build/exports/TieFighter 95.dxw | 32 ++++++ build/readme-relnotes.txt | 13 +++ dll/cross.bmp | Bin 0 -> 3942 bytes dll/ddraw.cpp | 24 ++-- dll/dsound.cpp | 5 +- dll/dxhook.cpp | 3 +- dll/dxwnd.aps | Bin 37668 -> 47948 bytes dll/dxwnd.cpp | 2 +- dll/dxwnd.rc | 4 + dll/dxwnd.vs2008.suo | Bin 105472 -> 105472 bytes dll/dxwnd.vs2008.vcproj | 28 +++++ dll/fire1.bmp | Bin 0 -> 3942 bytes dll/fire2.bmp | Bin 0 -> 3942 bytes dll/fire3.bmp | Bin 0 -> 3942 bytes dll/resource.h | 7 +- dll/winmm.cpp | 198 +++++++++++++++++++++++++++++++- host/TabInput.cpp | 1 + host/TargetDlg.cpp | 1 + host/TargetDlg.h | 1 + host/dxwndhost.aps | Bin 161096 -> 161248 bytes host/dxwndhost.rc | Bin 105982 -> 106264 bytes host/dxwndhost.vs2008.suo | Bin 27648 -> 30208 bytes host/dxwndhostView.cpp | 2 + host/host.aps | Bin 47496 -> 47496 bytes host/resource | Bin 37448 -> 37540 bytes 30 files changed, 365 insertions(+), 138 deletions(-) create mode 100644 build/exports/Arx Fatalis.dxw create mode 100644 build/exports/TieFighter 95.dxw create mode 100644 dll/cross.bmp create mode 100644 dll/fire1.bmp create mode 100644 dll/fire2.bmp create mode 100644 dll/fire3.bmp diff --git a/Include/dxwnd.h b/Include/dxwnd.h index c018474..e026e07 100644 --- a/Include/dxwnd.h +++ b/Include/dxwnd.h @@ -208,6 +208,7 @@ #define CREATEDESKTOP 0x01000000 // creates a virtual desktop window to replace the real one #define NOWINDOWHOOKS 0x02000000 // do not intercept window callback routines #define SYNCPALETTE 0x04000000 // Syncronize GDI to DDRAW palette +#define VIRTUALJOYSTICK 0x08000000 // Enables the DxWnd virtual joystick // logging Tflags DWORD: #define OUTTRACE 0x00000001 // enables tracing to dxwnd.log in general diff --git a/build/dxwnd.dll b/build/dxwnd.dll index 95f92cb..b101732 100644 --- a/build/dxwnd.dll +++ b/build/dxwnd.dll @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:aea2bada6a8f9329392fea5ab8975c3751d32c6a84c8f02924cdef0f42854dca -size 595456 +oid sha256:367c504db6f66d3f5c9e40e1a3e3aeb94f3c5a3df7b7bd9134a649379a40c8fa +size 612864 diff --git a/build/dxwnd.exe b/build/dxwnd.exe index 2f0682e..8f4f1a8 100644 --- a/build/dxwnd.exe +++ b/build/dxwnd.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d242c24095ab0e76e32fe9d98821ab993f406512317a733859b531f466d160f7 +oid sha256:4b44208fd7eef222ff0861d95418c3aabb46481b83198c1b40d769bc52f6a8b4 size 545792 diff --git a/build/dxwnd.ini b/build/dxwnd.ini index e99a2ff..ce0540b 100644 --- a/build/dxwnd.ini +++ b/build/dxwnd.ini @@ -1,26 +1,26 @@ [window] -exportpath=D:\DxWnd\exports\ -posx=1231 -posy=493 +exportpath=D:\DxWnd\v2_03_43_src\build\exports\ +exepath=D:\Games\Arx Fatalis demo\ +posx=1946 +posy=567 sizx=320 sizy=200 -exepath=D:\Games\Men in Black\ [target] -title0=Fin-Fin -path0=D:\Games\Fin-Fin\v90seger\teoboot.exe -launchpath0=D:\Games\Fin-Fin\v90seger\FinFin.exe -module0= +title0=Arx Fatalis demo +path0=D:\Games\Arx Fatalis demo\ARX.exe +launchpath0= +module0=Athena opengllib0= notes0= registry0= ver0=0 coord0=0 -flag0=-1465909214 +flag0=136314918 flagg0=1207959552 -flagh0=20 -flagi0=205520900 +flagh0=65552 +flagi0=138412036 flagj0=4224 -flagk0=327680 +flagk0=65536 tflag0=0 initx0=0 inity0=0 @@ -28,7 +28,7 @@ minx0=0 miny0=0 maxx0=0 maxy0=0 -posx0=50 +posx0=150 posy0=50 sizx0=800 sizy0=600 @@ -37,28 +37,28 @@ initts0=0 winver0=0 maxres0=-1 swapeffect0=0 -title1=Men in Black -path1=D:\Games\Men in Black\MiBd.exe +title1=TieFighter 95 +path1=D:\Games\TIE95\TIE95.EXE launchpath1= -module1=RWL21 +module1= opengllib1= -notes1= +notes1=The game can be played also with no joystick using the DxWnd virtual one.\nIf you have a real joystick, the "Use DLL injection" flag is not necessary.\nUse "Unlock Z order" to avoid losing control of the window. registry1= -ver1=0 +ver1=1 coord1=0 -flag1=136314914 -flagg1=1209008128 +flag1=681574514 +flagg1=1744830464 flagh1=20 flagi1=138412036 -flagj1=4224 -flagk1=327680 -tflag1=-2147477245 +flagj1=1073746048 +flagk1=136642560 +tflag1=0 initx1=0 inity1=0 minx1=0 miny1=0 -maxx1=0 -maxy1=0 +maxx1=800 +maxy1=600 posx1=50 posy1=50 sizx1=800 @@ -68,96 +68,3 @@ initts1=0 winver1=0 maxres1=-1 swapeffect1=0 -title2=STCC Swedish TouringCar Championship -path2=D:\Games\STCC\STCC.exe -launchpath2= -module2= -opengllib2= -notes2=Still slow and choppy in emulation mode -registry2= -ver2=0 -coord2=0 -flag2=136314914 -flagg2=1207959552 -flagh2=-2147483628 -flagi2=138412036 -flagj2=268439680 -flagk2=69632 -tflag2=-2147477245 -initx2=0 -inity2=0 -minx2=0 -miny2=0 -maxx2=0 -maxy2=0 -posx2=50 -posy2=50 -sizx2=800 -sizy2=600 -maxfps2=0 -initts2=0 -winver2=0 -maxres2=-1 -swapeffect2=0 -title3=DOSBox.exe -path3=D:\Program Files (x86)\DOSBox-0.74\DOSBox.exe -launchpath3= -module3= -opengllib3= -notes3= -registry3= -ver3=0 -coord3=0 -flag3=681574434 -flagg3=1744830464 -flagh3=20 -flagi3=138412036 -flagj3=4224 -flagk3=327680 -tflag3=0 -initx3=0 -inity3=0 -minx3=0 -miny3=0 -maxx3=0 -maxy3=0 -posx3=50 -posy3=50 -sizx3=800 -sizy3=600 -maxfps3=0 -initts3=0 -winver3=0 -maxres3=-1 -swapeffect3=0 -title4=Imperialism -path4=D:\Games\Imperialism\Imperialism.exe -launchpath4= -module4= -opengllib4= -notes4=Note:\nMap zooming is currently not workind. Do not click on the magnifying glass, \nor the game will crash. -registry4= -ver4=0 -coord4=0 -flag4=1746935843 -flagg4=1209008128 -flagh4=20 -flagi4=4194308 -flagj4=128 -flagk4=0 -tflag4=0 -initx4=0 -inity4=0 -minx4=0 -miny4=0 -maxx4=0 -maxy4=0 -posx4=50 -posy4=50 -sizx4=800 -sizy4=600 -maxfps4=0 -initts4=0 -winver4=0 -maxres4=-1 -swapeffect4=0 diff --git a/build/exports/Arx Fatalis.dxw b/build/exports/Arx Fatalis.dxw new file mode 100644 index 0000000..45ee414 --- /dev/null +++ b/build/exports/Arx Fatalis.dxw @@ -0,0 +1,32 @@ +[target] +title0=Arx Fatalis +path0=D:\Games\Arx Fatalis\arx.exe +launchpath0= +module0=Athena +opengllib0= +notes0= +registry0= +ver0=0 +coord0=0 +flag0=136314918 +flagg0=1207959552 +flagh0=65552 +flagi0=138412036 +flagj0=4224 +flagk0=65536 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=0 +maxy0=0 +posx0=150 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/exports/TieFighter 95.dxw b/build/exports/TieFighter 95.dxw new file mode 100644 index 0000000..bc3ffb9 --- /dev/null +++ b/build/exports/TieFighter 95.dxw @@ -0,0 +1,32 @@ +[target] +title0=TieFighter 95 +path0=D:\Games\TIE95\TIE95.EXE +launchpath0= +module0= +opengllib0= +notes0=The game can be played also with no joystick using the DxWnd virtual one.\nIf you have a real joystick, the "Use DLL injection" flag is not necessary.\nUse "Unlock Z order" to avoid losing control of the window. +registry0= +ver0=1 +coord0=0 +flag0=681574514 +flagg0=1744830464 +flagh0=20 +flagi0=138412036 +flagj0=1073746048 +flagk0=136642560 +tflag0=0 +initx0=0 +inity0=0 +minx0=0 +miny0=0 +maxx0=800 +maxy0=600 +posx0=50 +posy0=50 +sizx0=800 +sizy0=600 +maxfps0=0 +initts0=0 +winver0=0 +maxres0=-1 +swapeffect0=0 diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt index dee4007..1bdfc3e 100644 --- a/build/readme-relnotes.txt +++ b/build/readme-relnotes.txt @@ -939,3 +939,16 @@ add: added debug flag NOWINDOWHOOKS to avoid WindowProc hook. fix: GetPaletteEntries hook returns 256 value against hpal=NULL. Let "M.I.B." run, though palette is still not ok. fix: StretchDIBits hook no longer can return an unassigned value fix: anti-recursion check in DialogBox WindowProc call + +v2.03.42 +add: option "Syncronize GDI and DDRAW palette" - fixes "Man in Black" palette problems +add: apply "Remap MCI coordinates" options also to movies rendered through MCIWndCreate: fixes "Man in Black" movie problems +fix: fixed InvalidateRect hooker logic - fixes "Imperialism" graphic. + +v2.03.43 +fix: eliminated SYSTEMMEMORY usage on DDSCAPS_3DDEVICE surfaces. Needed for "Arx Fatalis" +fix: deleted emulation of ZBUFFER attach. Needed for "Arx Fatalis" +fix: added emulation of PixelFormat in getPixelFormat hooker. Needed for "Arx Fatalis" +add: added virtual joystick feature. Required to play "Tie Fighter 95" with no real joystick +v2.03.43.fix1 +fix: recovered virtual joystick buttons \ No newline at end of file diff --git a/dll/cross.bmp b/dll/cross.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b6ea64fac233ba4d9336190b4ea45aa5a55409c8 GIT binary patch literal 3942 zcmeHJyK00$6y20sXq$l560$+?iCBuJvCu4vD1v?dWno(bHsYUd4(<{p&fEw)gcNgN zMDOc3XJ#(*_Wq&oW`uaYVm#l*!|rjmyEp&*As;)}bzk^^SCmF56-CiBO`j~l9>=jL zI@`97$K!>Ms;Vr@5;8S#Wm(3jx)enrxoD}ShO|CgyuvlaVLWiK-|v$oA@+QlrikHW zAA%rQ&Im-P*7yCHh12OYjw8W^)`1vS>UkIj!!VX~IEiiB64mZ;sjB*etFG&N3KF@J zix6j{OKP}LC?agFVb^s;{5>v3QI_WmJ;XFkP1AH1@ME6m5p-b~q97|(M@`@Nmp$tG z4t6FS$I0`Y;3~@!{h65ydwFlags & DDSD_CAPS) && (lpddsd->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)) { // z-buffer surface - set to memory - lpddsd->ddsCaps.dwCaps = (DDSCAPS_SYSTEMMEMORY|DDSCAPS_ZBUFFER); + lpddsd->ddsCaps.dwCaps = DDSCAPS_ZBUFFER; return; } @@ -2185,7 +2187,7 @@ static void FixSurfaceCaps(LPDDSURFACEDESC2 lpddsd, int dxversion) (lpddsd->ddsCaps.dwCaps & DDSCAPS_3DDEVICE)) // v2.02.90: added for "Zoo Tycoon" textures { // 3DDEVICE no TEXTURE: enforce PIXELFORMAT on MEMORY lpddsd->dwFlags |= DDSD_PIXELFORMAT; - lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_SYSTEMMEMORY|DDSCAPS_3DDEVICE); + lpddsd->ddsCaps.dwCaps = (DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE); GetPixFmt(lpddsd); return; } @@ -2703,7 +2705,6 @@ static HRESULT BuildGenericEmu(LPDIRECTDRAW lpdd, CreateSurface_Type pCreateSurf // For "Risk II" it is necessary that both the primary surface and the offscreen surfaces are generated // with the same type, so that assuming an identical lPitch and memcopy-ing from one buffer to the // other is a legitimate operation. - if(ddsd.ddsCaps.dwCaps & DDSCAPS_ZBUFFER) ddsd.ddsCaps.dwCaps &= ~DDSCAPS_SYSTEMMEMORY; // v2.03.03 !! if(dxw.dwFlags6 & POWER2WIDTH){ // v2.03.28: POWER2WIDTH to fix "Midtown Madness" in surface emulation mode if(((ddsd.dwFlags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) == (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH)) && @@ -3103,10 +3104,14 @@ HRESULT WINAPI extGetAttachedSurface(int dxversion, GetAttachedSurface_Type pGet } } // arguable utility .... - if ((IsPrim || IsBack) && lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ - *lplpddas = lpDDZBuffer; - OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds); - return DD_OK; + // commented out: causes "Arx Fatalis" crash assigning ZBUFFER to the wrong surface? + // would that be necessary on some game? + if(EMULATEZBUFFERATTACH){ + if ((IsPrim || IsBack) && lpDDZBuffer && (lpddsc->dwCaps & DDSCAPS_ZBUFFER)){ + *lplpddas = lpDDZBuffer; + OutTraceDW("GetAttachedSurface(%d): SIMULATE ZBUFFER attach to %s=%x\n", dxversion, IsPrim?"PRIM":"BACK", lpdds); + return DD_OK; + } } OutTraceE("GetAttachedSurface(%d): ERROR res=%x(%s) at %d\n", dxversion, res, ExplainDDError(res), __LINE__); } @@ -4487,7 +4492,9 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask ); } - if ((dxw.dwFlags1 & EMULATESURFACE) && IsPrim){ + // fix: virtual pixel definition is helpful not only on promary surfaces, but more in general + // on every surface that returns an error. It fixes "Arx Fatalis" crash. + if ((dxw.dwFlags1 & EMULATESURFACE) && res){ p->dwFlags = dxw.VirtualPixelFormat.dwFlags; p->dwRGBBitCount= dxw.VirtualPixelFormat.dwRGBBitCount; p->dwRBitMask = dxw.VirtualPixelFormat.dwRBitMask; @@ -4496,6 +4503,7 @@ HRESULT WINAPI extGetPixelFormat(LPDIRECTDRAWSURFACE lpdds, LPDDPIXELFORMAT p) p->dwRGBAlphaBitMask = dxw.VirtualPixelFormat.dwRGBAlphaBitMask; OutTraceDW("GetPixelFormat: EMULATED BitCount=%d RGBA=(%x,%x,%x,%x)\n", p->dwRGBBitCount, p->dwRBitMask, p->dwGBitMask, p->dwBBitMask, p->dwRGBAlphaBitMask ); + res = DD_OK; } return res; diff --git a/dll/dsound.cpp b/dll/dsound.cpp index b6d9e97..4c54339 100644 --- a/dll/dsound.cpp +++ b/dll/dsound.cpp @@ -45,7 +45,7 @@ void HookDirectSoundInit() HookLibInit(Hooks); } -void HookDirectSound(LPDIRECTSOUND *lpds) +void HookDirectSoundObj(LPDIRECTSOUND *lpds) { // IDIrectSound::SetCooperativeLevel SetHook((void *)(**(DWORD **)lpds + 24), extDSSetCooperativeLevel, (void **)&pDSSetCooperativeLevel, "SetCooperativeLevel(DSound)"); @@ -62,9 +62,10 @@ HRESULT WINAPI extDirectSoundCreate(LPGUID guid, LPDIRECTSOUND *lpds, LPUNKNOWN return res; } - HookDirectSound(lpds); + HookDirectSoundObj(lpds); return res; } + #define DSSCL_NORMAL 0x00000001 #define DSSCL_PRIORITY 0x00000002 #define DSSCL_EXCLUSIVE 0x00000003 diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp index b376ba1..13126a4 100644 --- a/dll/dxhook.cpp +++ b/dll/dxhook.cpp @@ -23,6 +23,7 @@ #include "MinHook.h" #define SKIPIMEWINDOW TRUE +#define HOOKDIRECTSOUND FALSE dxwCore dxw; dxwSStack dxwss; @@ -863,7 +864,7 @@ void HookModule(HMODULE base, int dxversion) HookMSV4WLibs(base); // -- used by Aliens & Amazons demo: what for? HookAVIFil32(base); //HookSmackW32(base); - //HookDirectSound(base); + //if (HOOKDIRECTSOUND) HookDirectSound(base); //HookComDlg32(base); } diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps index caed8be93d5e61062efddb6d12e8ebd76eb2f8a8..ea03d6582138b8db4029713356ffd15b66f4ca7a 100644 GIT binary patch delta 10511 zcmds7ZA=u~89vKJ7mN|*TBUvyFcDX8Oy&zC4@+BW$jHIg<1UA)MiYOQ~vnCoa zT!YKTi=3P^4nn#Ny7ll!BIABkT{f0>$8qknq+VLE-zIlD7wX3nfT0ygQu z?ws?U_kEso-t(R_Gw;sTKg9j;@3=E*E>CcAy0`u>gf!;W7j=I1O=JCGk1xyX%klc! z+m6&X?%$u$?%&tsZ*FPd*H+)y+3`(dMq2|RL%;r0c~V^xA!&pVRgJ@^DfFf5C(2UP z>BmJ<@J&b-bj*i$@(yM4pkqRgfj=uN>u2@{T4N%zQ8MrYYxCyKmo8oUPIf?^pPxTY zKCK%W85!l}<*K6E9@W*=YuB#T48~Ic+4k+*WlRzN%F4>gCkuB#*&@Q4TyAqLS+b;{pum7`s3_{zty`gF zW4=5mCr6|M6X4FCJ^QWfICbjOg$ox9_{Ivh5a@`eidGpM99*zqfyjpiSyxwQM3}JJ zv}w~QmlppZtF5h_FnA+Sm@MK+flDzePDIU~OoBdMen({EhQr_&0neJcY-p&Ga$6QGX1NH$Q!onUK&A4waCAN&+|s0%`#D z0O|qMZ{NO+GurTAk5>HQ;1yb+H8r$%YNnFV-N}%|FSNZ8>nJBt1CvalGLs?|sqYMm z3AVBy2~h-9nIiA0iA14@t-57GM@P7W?vBW4aQk|WK(Upga{ENc1_PugK>8>EvsaE# z;Tc+{GLA|`uqK4}h*~Ew*#JszrbmYutBgqS$SEp(!^W>r!~g(^n+n13V}SY_?x9ED z;2;~sJKF646A^6?Y&c;VP87*BB{Hw-GQs~`7$yxv>WVstjD&ksm=dZ^J!OQ0P#6Q# zp4ifuo_z0=H@GxzM-bMfNE=g*(t zx^=6)y?y%h>EllhnfWmY+-tEgGk<|>_3G8mhbXtekn-~KqUED-X9^{`wL>W`P>&ux zG7pH>6DK#`Sa9^7JFM+fdAxnAw{COJ+T^tMsk#3N~#Lf?h zzCO0G>d2B3QVv)Vax#h3hJVG16+JyY5_qF%U|_&@WD+uoi1H(_SFT)XM3&SruTJ9; zA&ik=dsw`9F}~p#aG`wj=FKpHA|X!F!i5WQZ)fG> z+nf~c(4j-sASbUHS zk%&vPXCd_@mMD<3YnT1evR@If-fBVQdNA3BO3Uaa6;qQ^fRpyg8#XvdBn zi^BKz?b}(iW+9H2E?tU?8*UC#Qc{ps1{tc+9f@6>yO8#h`yWda_Y`(~7&_t((J(SH zqUqeZa|h`hbQ-p=U%!@)Z)j*}_UzfBGk6(Y^!xqq-@n)5kHVq{d=PNEMk5xmxM7KY zba!`~_>LYuI%m!tD-)MsQqYg0q9RNLo_?_l!Br4eRaGe>fvMcp)x}piQeeAw?SgS( zVIka(*|B5NC@J&jPp3)2Sk5=zmz}}UcGu1>pRv_*zv0@}ZIUn`+I6SeZ6 z(2NtS(aaOeQouS(ad&n@YCJF}JX@oS*@acFvJ!jHFe$R>G$tH)vPLFD0!I-rWs3HR zj(~3I?&%5Vo)UT@qd^j9fF(NIV`F1CnJ&vcwUUlj(goQVlPN3*bcU9xY%D-aGy?={ zWKWokTC=PW&qp!Y_YPz-JaU9`@Z3``MQjBi&t@Ux^{zDuqCZm+T!e%fPvdlj)gZ(m z6zXd>9Hz#;nET)8b(CaY)n$VJxsWE+^g~zFWzs2Ooe2m^DAL505e`BqvZ01m-TdsP zxu>|i{Ls9L5@lP_7GGgiMRhgF&hn6{giygRwpA5pL*OMai3mIp=6&FY%Ff(ngMu zdeTVt<1YhsKiNl`@ZC&WP}@h^MvnLOy5KVQZWu|7Z-B{f$U*#Nkgv%BLS4yQo6$;5 z+hCS$X>Ac&J(gC#(CQUhf9GQFp@lvVD#{05W?PRJ)>M@`-@|5y&!4jw;x=d)UTuc6 z!!Ok-vA$K8tAXTbARdQr=H+P^Uqmo|UhH)UvXOyMuaF-?qrr5SC-gYD-1WzhtKaMT zS8ynEDt>by8(hKvWK6kRMo4|=_x delta 310 zcmX@}jcLg;rU?p+8WR0X3;G{QnQa3=9lDlVf)(Gipq3+^NpEU}CL4s~Ax5 z!Q{I;jTv<&3+^&j3SeXas$>G643zz{U9@{f8*!WL=wo8uf1W=hv|75P+ Pa%_ztRTC%c?Un-o)>B{# diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp index fda1426..dc793d8 100644 --- a/dll/dxwnd.cpp +++ b/dll/dxwnd.cpp @@ -27,7 +27,7 @@ along with this program. If not, see . #include "TlHelp32.h" -#define VERSION "2.03.42" +#define VERSION "2.03.43.fix1" #define DDTHREADLOCK 1 //#define LOCKTHREADS diff --git a/dll/dxwnd.rc b/dll/dxwnd.rc index 2705594..6d398ea 100644 --- a/dll/dxwnd.rc +++ b/dll/dxwnd.rc @@ -53,6 +53,10 @@ END // IDB_BANNER BITMAP "dxwbanner.bmp" +IDB_CROSS BITMAP "cross.bmp" +IDB_FIRE1 BITMAP "fire1.bmp" +IDB_FIRE2 BITMAP "fire2.bmp" +IDB_FIRE3 BITMAP "fire3.bmp" #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo index 9f6c4813e70ac2524bc0bb6264767c08304186cd..99cde0e29a53e06b9b32f77e3e31d288365b0c18 100644 GIT binary patch delta 10026 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 delta 5458 zcmb`Ld2rR$702&+8`%gUyZ{L#gd`HFBqV`Az$Cl`1W8h|h#N(AT0nLKBB1ZdCbEPi z7r1EEK}4dX?UX)-M}?8dVpT-N;&ke?BQVnzECX0l7CVxD&wJ+=9vw;ZM^EPa?)iOw z=kE7+fA<&P0hjN9tKLHqdrP!E@m6bV>oZCzPA$Q0UDHtAtmF|mcF&|k*@%8&9@q+_VRBUJdr|Eb}`@W(nk`C&AZ7IqkV-Qol{t#ZT*sT_SFni zqp7E^D{^<6s2)|b)qM4^dP>d2TrCGq=vbn;k8@Kf~zSR_GE*6p7@6-D_J9v2f1+UkSp>elk&sW+* zYwcpCOI4s?yLHc%i`ku_^!FFX>Z8%Qu0goG7(Fq>rXG$CRQV^ z26_k@4?PS$0%2yFhN}{lhref0QEuL#!Ad2l!_GanC?3;wwqTcWOBKvJ?%)Xz0LR~bTL3_glC|&$+MJfyKdM_S`ww1W*@mt*(&N8 zs9Qz@>`m_{6PcE!RBU#xq$7b>X3{8|sq#{3?hn$N)u?YR)BwEzHA3s57oiQ%MraeX z4Eu{2Wuu&i#}1eQb~0W)P)g35YM$i3tCj#h% z&CyiTfLeaDp2|&q9m<})j%rMoHPkt2b@<3Og^g@eV8|L8PVEJ3SWBht1sDX((aW!< z1Qu#KNBc9#6HDVYC5<#w`cRaKolOzCJ|ixPSMjTOq&Xc8y(a$a@lDNn|FJAg$|5>v&b&ZbX773`GtC<)$rL_KG3Kv}s2AUOFllgj*Y}5YeLpw+ zPux6L`AW4?txyH3R1Ly!o+wKVfu93qsa*Vxg0gV0Kn(@WfQ*b9_ra% zr5Nvz_4|qO+wP;9%scwoPD`zRw%Z*pnU`1m?TJshdzryUYWNz;qV%?rzI${avCOF2$z2e)J!O-AikaG7dJQ@b0aol{dK?X25IUT7DJ^z@qMcujdMx=Kz zb7&2E|Bq|%zc$zow8NoH!5aGg9SgGq+1eh!j&=6V7244O<}E6hIy#z9J5?|2AAZl4 z2-2hfvD`#tQGrPW^+~2vPsUp2a0(Lsx_Q7tT`-?Ms}X-RW`O`+)g&3N!#>%Y&E|L4zQ+5fHP!kOyKL z12N-M?t>89c!=3R=wXO$62y#cawx&ED#*Nwo5ZhNyl>TWA*kw+J_)hC0deNJ&~AwB zEy!YT2Z>U@5>|_pPnB#ZAdX}9Da3XjVm1uApwjURy8>D8JMph04Gyr0&Y_{&wzk-- z)Sm&_tWtQWE(8gBfD*V6wtR7h3**bl_~8TclrXjceiyJs!gAo>51*|;*w5fMGDH39 zb%E32?~=fGgz?zEE9{`KRIo$BjtS#N9~X8~7?Ao*n03G_1WUtVk8J=_uiRHz0<)1a ztAqv$8!PPRU}eIpg!Kcf7B*YhOt3k^mJ2HYTOsWE+i@PXN}v|Vt9PrgSA@+5dsWy0 zVceMC*+K{QwquT4$E}OkuVuRQ{KP8WCEbpu#&56cxOBJvHl;g8oBNgq-2<`phnQ7E zKY`e+houC*^|0IzpX1ng5V)PPhLJvP2Se^8fm(Lb14YpkvpJ$A)H*7vr;>J77chz0I=j-)9aG+ICIs7XUcwI8r zfZY(r->6)9ut#>iv}k}S-AwL1izyOg^`+$CP2>-f5~mnkLl zqP`bCTZJ&boQ5CXP-Y0LfIp6Jz~(dKCnFtNAn<91xaLeNgl!ZCq&5lLENm!Pov_`) zc!PLT*xoSqTVd}B<89h|P~Zmwd6tg|J0*-4;g`bB2;&Bx6?R#e2keTlPI&usM|fpK z$U(v_%z!0?m{(;8907Qb1m+6keK=3pSYac<%7jf7_5j#4Vb2KTrM^N~gD`H;Yw&qv z+8JaR|1G#^l)zmQ$kTfQJ}<$O!noqy68AS@KUW73K?L&%5{zY@=Lw=$5Xgl9jWK*|oE%^_?xe5bHPVP$IolLQVF*bOX4{Cr7y+6u&f2C238-d-2FWI}>` zUaX{k{CP2Ulm*S<{S>A|+kmY0!p408Uo4b}dVHvI>IP|<4u diff --git a/dll/dxwnd.vs2008.vcproj b/dll/dxwnd.vs2008.vcproj index c95764e..1549714 100644 --- a/dll/dxwnd.vs2008.vcproj +++ b/dll/dxwnd.vs2008.vcproj @@ -539,10 +539,38 @@ Name="Resource Files" Filter="ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" > + + + + + + + + + + + + + + diff --git a/dll/fire1.bmp b/dll/fire1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..be8f6f3e0f8a7c9eb9e182a711d6d964ba3c9297 GIT binary patch literal 3942 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 #define SUPPRESSMCIERRORS FALSE +#define EMULATEJOY TRUE +#define INVERTJOYAXIS TRUE BOOL IsWithinMCICall = FALSE; @@ -20,10 +23,19 @@ MCIDEVICEID WINAPI extmciGetDeviceIDA(LPCTSTR); typedef MCIDEVICEID (WINAPI *mciGetDeviceIDW_Type)(LPCWSTR); mciGetDeviceIDW_Type pmciGetDeviceIDW = NULL; MCIDEVICEID WINAPI extmciGetDeviceIDW(LPCWSTR); +typedef DWORD (WINAPI *joyGetNumDevs_Type)(void); +joyGetNumDevs_Type pjoyGetNumDevs = NULL; +DWORD WINAPI extjoyGetNumDevs(void); +typedef MMRESULT (WINAPI *joyGetDevCapsA_Type)(DWORD, LPJOYCAPS, UINT); +joyGetDevCapsA_Type pjoyGetDevCapsA = NULL; +MMRESULT WINAPI extjoyGetDevCapsA(DWORD, LPJOYCAPS, UINT); +typedef MMRESULT (WINAPI *joyGetPosEx_Type)(DWORD, LPJOYINFOEX); +joyGetPosEx_Type pjoyGetPosEx = NULL; +MMRESULT WINAPI extjoyGetPosEx(DWORD, LPJOYINFOEX); static HookEntry_Type Hooks[]={ - {HOOK_HOT_CANDIDATE, "mciSendCommandA", NULL, (FARPROC *)&pmciSendCommandA, (FARPROC)extmciSendCommandA}, - {HOOK_HOT_CANDIDATE, "mciSendCommandW", NULL, (FARPROC *)&pmciSendCommandW, (FARPROC)extmciSendCommandW}, + {HOOK_IAT_CANDIDATE, "mciSendCommandA", NULL, (FARPROC *)&pmciSendCommandA, (FARPROC)extmciSendCommandA}, + {HOOK_IAT_CANDIDATE, "mciSendCommandW", NULL, (FARPROC *)&pmciSendCommandW, (FARPROC)extmciSendCommandW}, {HOOK_HOT_CANDIDATE, "mciGetDeviceIDA", NULL, (FARPROC *)&pmciGetDeviceIDA, (FARPROC)extmciGetDeviceIDA}, {HOOK_HOT_CANDIDATE, "mciGetDeviceIDW", NULL, (FARPROC *)&pmciGetDeviceIDW, (FARPROC)extmciGetDeviceIDW}, {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator @@ -42,11 +54,19 @@ static HookEntry_Type RemapHooks[]={ {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator }; +static HookEntry_Type JoyHooks[]={ + {HOOK_IAT_CANDIDATE, "joyGetNumDevs", NULL, (FARPROC *)&pjoyGetNumDevs, (FARPROC)extjoyGetNumDevs}, + {HOOK_IAT_CANDIDATE, "joyGetDevCapsA", NULL, (FARPROC *)&pjoyGetDevCapsA, (FARPROC)extjoyGetDevCapsA}, + {HOOK_IAT_CANDIDATE, "joyGetPosEx", NULL, (FARPROC *)&pjoyGetPosEx, (FARPROC)extjoyGetPosEx}, + {HOOK_IAT_CANDIDATE, 0, NULL, 0, 0} // terminator +}; + void HookWinMM(HMODULE module) { HookLibrary(module, Hooks, "winmm.dll"); if(dxw.dwFlags2 & TIMESTRETCH) HookLibrary(module, TimeHooks, "winmm.dll"); if(dxw.dwFlags5 & REMAPMCI) HookLibrary(module, RemapHooks, "winmm.dll"); + if(dxw.dwFlags6 & VIRTUALJOYSTICK) HookLibrary(module, JoyHooks, "winmm.dll"); } FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule) @@ -58,6 +78,8 @@ FARPROC Remap_WinMM_ProcAddress(LPCSTR proc, HMODULE hModule) if (addr=RemapLibrary(proc, hModule, TimeHooks)) return addr; if(dxw.dwFlags5 & REMAPMCI) if (addr=RemapLibrary(proc, hModule, RemapHooks)) return addr; + if(dxw.dwFlags6 & VIRTUALJOYSTICK) + if (addr=RemapLibrary(proc, hModule, JoyHooks)) return addr; return NULL; } @@ -115,7 +137,22 @@ MCIERROR WINAPI extmciSendCommand(mciSendCommand_Type pmciSendCommand, MCIDEVICE OutTraceDW("mciSendCommand: IDDevice=%x msg=%x(%s) Command=%x(%s)\n", IDDevice, uMsg, ExplainMCICommands(uMsg), fdwCommand, ExplainMCIFlags(uMsg, fdwCommand)); - if(dxw.dwFlags6 && BYPASSMCI) return 0; + if(dxw.dwFlags6 & BYPASSMCI){ + if((uMsg == MCI_STATUS) && (fdwCommand == MCI_STATUS_ITEM)){ + // fix for Tie Fighter 95: when bypassing, let the caller know you have no CD tracks + // otherwise you risk an almost endless loop going through the unassigned returned + // number of ghost tracks + MCI_STATUS_PARMS *p = (MCI_STATUS_PARMS *)dwParam; + p->dwItem = 0; + p->dwTrack = 0; + p->dwReturn = 0; + OutTraceDW("mciSendCommand: BYPASS fixing MCI_STATUS\n"); + } + else{ + OutTraceDW("mciSendCommand: BYPASS\n"); + } + return 0; + } if(dxw.IsFullScreen()){ switch(uMsg){ @@ -157,6 +194,15 @@ MCIERROR WINAPI extmciSendCommand(mciSendCommand_Type pmciSendCommand, MCIDEVICE ret=(*pmciSendCommand)(IDDevice, uMsg, fdwCommand, dwParam); + if(ret == 0){ + switch(uMsg){ + case MCI_STATUS: + MCI_STATUS_PARMS *p = (MCI_STATUS_PARMS *)dwParam; + OutTrace("mciSendCommand: Item=%d Track=%d return=%x\n", p->dwItem, p->dwTrack, p->dwReturn); + break; + } + } + if(dxw.IsFullScreen() && uMsg==MCI_PUT) pr->rc=saverect; if (ret) OutTraceE("mciSendCommand: ERROR res=%d\n", ret); return ret; @@ -245,4 +291,148 @@ MCIDEVICEID WINAPI extmciGetDeviceIDW(LPCWSTR lpszDevice) ret = (*pmciGetDeviceIDW)(lpszDevice); OutTraceDW("mciGetDeviceIDW: device=\"%ls\" ret=%x\n", lpszDevice, ret); return ret; -} \ No newline at end of file +} + +DWORD WINAPI extjoyGetNumDevs(void) +{ + OutTraceDW("joyGetNumDevs: emulate joystick ret=1\n"); + return 1; +} + +#define XSPAN 128 +#define YSPAN 128 +static void ShowJoystick(LONG, LONG, DWORD); + +MMRESULT WINAPI extjoyGetDevCapsA(DWORD uJoyID, LPJOYCAPS pjc, UINT cbjc) +{ + OutTraceDW("joyGetDevCaps: joyid=%d size=%d\n", uJoyID, cbjc); + if((uJoyID != -1) && (uJoyID != 0)) return MMSYSERR_NODRIVER; + if(cbjc != sizeof(JOYCAPS)) return MMSYSERR_INVALPARAM; + uJoyID = 0; // always first (unique) one ... + + // set Joystick capability structure + memset(pjc, 0, sizeof(JOYCAPS)); + strncpy(pjc->szPname, "DxWnd Joystick Emulator", MAXPNAMELEN); + pjc->wXmin = 0; + pjc->wXmax = XSPAN; + pjc->wYmin = 0; + pjc->wYmax = YSPAN; + pjc->wNumButtons = 2; + pjc->wMaxButtons = 2; + pjc->wPeriodMin = 60; + pjc->wPeriodMax = 600; + pjc->wCaps = 0; + pjc->wMaxAxes = 2; + pjc->wNumAxes = 2; + + return JOYERR_NOERROR; +} + +MMRESULT WINAPI extjoyGetPosEx(DWORD uJoyID, LPJOYINFOEX pji) +{ + OutTraceDW("joyGetPosEx: joyid=%d\n", uJoyID); + if(uJoyID != 0) return JOYERR_PARMS; + LONG x, y; + HWND hwnd; + DWORD dwButtons; + + dwButtons = 0; + if (GetKeyState(VK_LBUTTON) < 0) dwButtons |= JOY_BUTTON1; + if (GetKeyState(VK_RBUTTON) < 0) dwButtons |= JOY_BUTTON2; + POINT pt; + if(hwnd=dxw.GethWnd()){ + RECT client; + POINT upleft = {0,0}; + (*pGetClientRect)(hwnd, &client); + (*pClientToScreen)(hwnd, &upleft); + (*pGetCursorPos)(&pt); + pt.x -= upleft.x; + pt.y -= upleft.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; + x = (pt.x * XSPAN) / client.right; + if(INVERTJOYAXIS) + y = ((client.bottom - pt.y) * YSPAN) / client.bottom; // inverted y axis + else + pt.y = (pt.y * YSPAN) / dxw.GetScreenHeight(); + ShowJoystick(pt.x, pt.y, dwButtons); + } + else { + x=(XSPAN>>1); + y=(YSPAN>>1); + } + + // set Joystick info structure + memset(pji, 0, sizeof(JOYINFOEX)); + pji->dwSize = sizeof(JOYINFOEX); + pji->dwFlags = 0; + pji->dwXpos = x; + pji->dwYpos = y; + pji->dwButtons = dwButtons; + pji->dwFlags = JOY_RETURNX|JOY_RETURNY|JOY_RETURNBUTTONS; + + OutTraceDW("joyGetPosEx: joyid=%d pos=(%d,%d)\n", uJoyID, pji->dwXpos, pji->dwYpos); + return JOYERR_NOERROR; +} + +static void ShowJoystick(LONG x, LONG y, DWORD dwButtons) +{ + static BOOL JustOnce=FALSE; + extern HMODULE hInst; + BITMAP bm; + HDC hClientDC; + static HBITMAP g_hbmJoyCross; + static HBITMAP g_hbmJoyFire1; + static HBITMAP g_hbmJoyFire2; + static HBITMAP g_hbmJoyFire3; + HBITMAP g_hbmJoy; + RECT client; + RECT win; + POINT PrevViewPort; + int StretchMode; + + // don't show when system cursor is visible + CURSORINFO ci; + ci.cbSize = sizeof(CURSORINFO); + GetCursorInfo(&ci); + if(ci.flags == CURSOR_SHOWING) return; + + hClientDC=(*pGDIGetDC)(dxw.GethWnd()); + (*pGetClientRect)(dxw.GethWnd(), &client); + + if(!JustOnce){ + g_hbmJoyCross = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CROSS)); + g_hbmJoyFire1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE1)); + g_hbmJoyFire2 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE2)); + g_hbmJoyFire3 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_FIRE3)); + JustOnce=TRUE; + } + + HDC hdcMem = CreateCompatibleDC(hClientDC); + switch(dwButtons){ + case 0: g_hbmJoy = g_hbmJoyCross; break; + case JOY_BUTTON1: g_hbmJoy = g_hbmJoyFire1; break; + case JOY_BUTTON2: g_hbmJoy = g_hbmJoyFire2; break; + default: g_hbmJoy = g_hbmJoyFire3; break; + } + HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, g_hbmJoy); + GetObject(g_hbmJoy, sizeof(bm), &bm); + + (*pGetWindowRect)(dxw.GethWnd(), &win); + + //if(!pSetViewportOrgEx) pSetViewportOrgEx=SetViewportOrgEx; + (*pSetViewportOrgEx)(hClientDC, 0, 0, &PrevViewPort); + StretchMode=GetStretchBltMode(hClientDC); + SetStretchBltMode(hClientDC, HALFTONE); + int w, h; + w=36; + h=36; + (*pGDIStretchBlt)(hClientDC, x-(w>>1), y-(h>>1), w, h, hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY); + + SetStretchBltMode(hClientDC, StretchMode); + (*pSetViewportOrgEx)(hClientDC, PrevViewPort.x, PrevViewPort.y, NULL); + SelectObject(hdcMem, hbmOld); + DeleteDC(hdcMem); +} diff --git a/host/TabInput.cpp b/host/TabInput.cpp index f2abdab..5513149 100644 --- a/host/TabInput.cpp +++ b/host/TabInput.cpp @@ -40,6 +40,7 @@ void CTabInput::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_FIXNCHITTEST, cTarget->m_FixNCHITTEST); DDX_Check(pDX, IDC_SLOW, cTarget->m_SlowDown); DDX_Check(pDX, IDC_RELEASEMOUSE, cTarget->m_ReleaseMouse); + DDX_Check(pDX, IDC_VIRTUALJOYSTICK, cTarget->m_VirtualJoystick); //DDX_Check(pDX, IDC_FRAMECOMPENSATION, cTarget->m_FrameCompensation); // DirectInput DDX_Check(pDX, IDC_HOOKDI, cTarget->m_HookDI); diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp index b11eac2..318ec37 100644 --- a/host/TargetDlg.cpp +++ b/host/TargetDlg.cpp @@ -29,6 +29,7 @@ CTargetDlg::CTargetDlg(CWnd* pParent /*=NULL*/) m_TextureHandling = 0; m_HookDI = FALSE; m_ModifyMouse = TRUE; // default true !! + m_VirtualJoystick = FALSE; m_LogEnabled = FALSE; m_OutProxyTrace = FALSE; m_OutDebug = FALSE; diff --git a/host/TargetDlg.h b/host/TargetDlg.h index ed76f55..a9db998 100644 --- a/host/TargetDlg.h +++ b/host/TargetDlg.h @@ -34,6 +34,7 @@ public: int m_SonProcessMode; BOOL m_HookDI; BOOL m_ModifyMouse; + BOOL m_VirtualJoystick; BOOL m_OutProxyTrace; BOOL m_OutDebug; BOOL m_CursorTrace; diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps index f5fd7629ee3c83cd8a55916e5f0738e6026b14cd..39a7981fa93a0c61993525e1612823f35224fce6 100644 GIT binary patch delta 6473 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 T@Po67JVaz3%u#sv9L4i@Aa2vS diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc index 5035f2ffa2cb9bb82507f295b02de1e1ed234076..45864e25140c318ccdd059dc3fb84fb2c2a7a2c5 100644 GIT binary patch delta 105 zcmeyjn{CEEwhb3HPG0a|WpdRfp6N@t83in}81fk^8HyQ77%~}>8L}Ca7<3ps8C)2g z8R8kjfUF>f5Qb0&M+P4TF9v^xNQPh_-xDb7JvlKwoY7!1|9aWY7dC1{O)iOU*zUu_ HxM?B)wVxio delta 28 mcmV+%0OS9dz6Sog2C&evli-aav*5A@T9XFnPPbqU0l1Oi2@X&I diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo index c76dae1ccd1371f35a1655aaf5bee21fa2d00db2..9b0926db438869de0c6c0ad4c1ec076e22dec78a 100644 GIT binary patch delta 4506 zcma){z9VM(fc525sRSGQ(;7nWF85LB-BA~XhLZGDo=iO(+)(;M6 z=fCGUzxO%kJ@<3o*xNdGMISw7DXLLQ&4cDcwNM>&dwhKS_Hb*79x?{9j@I_6$MetW zG(1qvwA(moQ>8F7>B5E_>gg<`5xYS2|RTI$FdB%ZjBY*0QEvXh)WJgO#5w3 zdLjMA<}nrn#jo3f79FMok-Yfgj2~*7E&!c$r??Cwem(PVY0-_=BbH31#>X#Ol!gn3 zx^KT_BrLpZfNje}TG>>(((s%E4{qXY==5{d*`MCNHqM-b8_I%G`QP#EGQ`bVqjsnP zHK-m?@#d*JH2uK{(Ws-vZpAaSX`EU*XIQ^LqK|etSJ|he;v6KNrW?+cX0E~PwKkmr zG&$KcYaUV`(v9ph+L2`O(VTsHO*J0uQH`ofEmzA>_iFryRHa&C+F@8B{F+n{R-^f> z5mpetMrbJpHHe)2TdKnJTHd8Z|I#&oE}hNy7NK}muewmePSv5dnnPp(^O7#8rG|pX zv_WqcM6KL{ykymEexwE!?Jitt=b4jietfjh(3Y1o<6}i9F?x*ClX)ghhvT~t0TUN-8c(T6~*)NKqREyw6~*|UTN>*S(zB8c&y_wO;374lX#^By9c-L3UxixaIeng zji5H82mgsR&i~}J&!$*sjLsLh>F_ddQN7xXz2ke>J2vBu53BEBXPBZgRTH&(JQ-ot zjr4Z4i=rFepry_b4R&Go3!=nX$$q2JuC=@|T6564E41sr$LW2)+sB0@!d!`)5OW92 zf|j9+e?PT?w&yhz{1TA)H0TW&yv4t%6%D&ebTO7;8SRhMP;R7?8fsc}8g&OeQC?3L z_@+SyWQCZeBep{sP$o19nhZ^WvY@Gu19C#yPyv(+RYUm@mr;ng1S*!a3-L6_4S681 zRvVQMh93$*rBE4E4o!zvs=zmC&tWfsxI376pz{z1?ha;r zQggR($P*TZ&0WHQn=Yo=1_xaCjL-ftVYS$w*>59M2b;t5!pdR4AncU{i<%C< z75F=G^n$)BY(!WY*z3Yh3G;!S7WR%XZpgdBE(zm%*vG=I3IkHt(h~1ip9$obd@hdv z5yrLtQrJ8mY|e>LBbT5$VSFu_FZK$F7lW-9zcyi<_gli&MFn#2ZGp`%>len8pgNGU~?-e#czlBjij*Ggh#;u&|@T%D{$&of5_i z^0ct@bh`Zj-aZp-?!>t;_#lo7>=5H~lE}{c(t3z)E%56q97aAGu^LvsCZ|m}@rK2R zr0En)I2GD;UDCnIcm90ZwXjUjH=j1-7*<|>;iQM%29KQnp{2y0AXOA;)qRtTJq%=aXqS}TlaM2oNGkdLizwUPrr{+Sf(9kG?)u9_ZIt=!{#BY6vlhb zeAp`yFB0a3eKv}MIJ64n!rNeT*d~k%-3_}F@g8Ab*pGC+}!zu9R0*}~fWPLr2^xZk~ij9{ZdHc_FenT!ksq?XUB_5d{MuzhrJwKxS8P)gl zCjz&CKMT0l{Q31S$N}-^0W%hV8t|QvKNC33&w1}R4?qBB9C#)4BDRpPKPQ7PL%iM; zzW(^CfG-&g-`02$_v%C*w(B6S3zx(1xgs`So0zfK=8(KM@Z8|*6l1;;am@8$n?sAR z$*^0+jtq#wjuCO}NO4>*c29~Q+Z=jR{5FZ*m*U4Zhb@TBW*_k7(5dnnA--Tvg?MtZ zPZeZ-DkJ9AA^8-aoE(#5bgikcpJm3r(=h!_43t4TTQ delta 3268 zcma);d2G~G5Xax!?*6)zQfPO3P}^<0-L_H=TPQ7u)D_pik8KWw(!KL(71&|ZKV6LrCoFjtC6|TawJ$wAC7X(EX6^*um(~Smzwf*~}BMS&=Ers35hLPNqx^ zWL4Ao)Twmd>89rVB)a7=(@;k>hTY`Pvs+@|UrR6c8%@!LF?2Gcu=5~K$z=BZPv!QIQ&@FoJKCzM}{JU(qm4PJnuR z0vJM^i|En|-xnvZyX2u1&e-gGVigfimeX?59H;c<4Of1Ei@n~+B9GVHXY z#zohwJ>>3HtqnY$Spjb$UGS#Rx&#AHXA+*r1Zwn-Czm-P=&xC+vASOqU6f-^#36GA zynX5YiCg)YDF?1EmTXPUwSCDy$xr^QC|dPWLHro#j!;gXZ^RZemII!5LF<@vQStT z_!Yq(g0=*0Q&m~29nO5eBuLBm2um{ezph%N8#r1qv{a&1N;Du{ zX|TtM-y&h0Y$I$gMN^pHV)5Jkm^G+90{;-0j!74UwT7|#!ea2kbd-U!Hp6Dg6vpvfhU$2>hY3spED^_7 zh4JRq3wuu(*R@gDN5V3|J{I<+uq?2zgdG;f2l0q7OCnm(PnBPEQFN86-u;IdTc>N;;juFV^Di=0I*bp$Uu=T=nz%~fmCk#mK z7xtqtzB~_#eMDM5CTzFY|ER!3z>~1^(EcurpQ>}Pd223&F{>4O3YLtPtHpjU*nExj z6vk()2zDvj!NSsEA443L3ac90KAD48!hxk;969Jx*nIme3!6M&{8kC;LpFC&9DDPv zzE(!pTk(zA`edOk%7h-@Y&e_6bKaz( xJ-+WaDEJzyqpNjM$jTA$rBKS;97E?~TJO*ciF|WAzMDC*TB=$yn)dm2{tKe^inRa$ diff --git a/host/dxwndhostView.cpp b/host/dxwndhostView.cpp index cb749f4..fd9dd14 100644 --- a/host/dxwndhostView.cpp +++ b/host/dxwndhostView.cpp @@ -248,6 +248,7 @@ static void SetTargetFromDlg(TARGETMAP *t, CTargetDlg *dlg) if(dlg->m_HookDI) t->flags |= HOOKDI; if(dlg->m_ModifyMouse) t->flags |= MODIFYMOUSE; + if(dlg->m_VirtualJoystick) t->flags6 |= VIRTUALJOYSTICK; if(dlg->m_OutProxyTrace) t->tflags |= OUTPROXYTRACE; if(dlg->m_OutDebug) t->tflags |= OUTDEBUG; if(dlg->m_CursorTrace) t->tflags |= OUTCURSORTRACE; @@ -488,6 +489,7 @@ static void SetDlgFromTarget(TARGETMAP *t, CTargetDlg *dlg) dlg->m_HookDI = t->flags & HOOKDI ? 1 : 0; dlg->m_ModifyMouse = t->flags & MODIFYMOUSE ? 1 : 0; + dlg->m_VirtualJoystick = t->flags6 & VIRTUALJOYSTICK ? 1 : 0; dlg->m_OutProxyTrace = t->tflags & OUTPROXYTRACE ? 1 : 0; dlg->m_OutDebug = t->tflags & OUTDEBUG ? 1 : 0; dlg->m_CursorTrace = t->tflags & OUTCURSORTRACE ? 1 : 0; diff --git a/host/host.aps b/host/host.aps index 6500e13ff048ec4e36019c4063a116975980ba4e..e615e8b950bea2cae8f2e8a6138611468618d4b0 100644 GIT binary patch delta 14 VcmeD9%+&FjX+i{}@y1B~od7T>1_=NF delta 14 VcmeD9%+&FjX+i{}(Z)#qod7T+1_%HE diff --git a/host/resource b/host/resource index 8de7c61ed04e01b936389ccf6712a906bdbd0f5a..918f057a9d151e809b5fc81eab159f3ebbe292bc 100644 GIT binary patch delta 56 zcmX@HglWlArVVqlCo2fCNQNd+vrT@) LB(-@?_8K(+z+Vs2 delta 14 WcmZ3ol