diff --git a/build/Resources_CN.dll b/build/Resources_CN.dll
index 87dc011..d4919bf 100644
--- a/build/Resources_CN.dll
+++ b/build/Resources_CN.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b29905bf73aea4baf7a3ca50fc224d6e6f33478efcd19c06230439d48499ed54
+oid sha256:763a6c83e88092d518e00b641db5f1ec1e1f03273966fa62c3023f5fab35d63c
size 125952
diff --git a/build/Resources_EN.dll b/build/Resources_EN.dll
new file mode 100644
index 0000000..dda3381
--- /dev/null
+++ b/build/Resources_EN.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9768c3856e6e7eb99d2a1aa84738dbf54f4742d22f9e3ab85b7e2c1bfcf1a349
+size 125952
diff --git a/build/Resources_IT.dll b/build/Resources_IT.dll
new file mode 100644
index 0000000..3e06507
--- /dev/null
+++ b/build/Resources_IT.dll
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b94cb7ee037071908b8b6e8f585c2e20a598de3d21d47c6ed2772603c7509571
+size 131584
diff --git a/build/dxwnd.cn.bat b/build/dxwnd.cn.bat
deleted file mode 100644
index ff63282..0000000
--- a/build/dxwnd.cn.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-echo off
-start "" "dxwnd.exe" "/lang=cn"
\ No newline at end of file
diff --git a/build/dxwnd.cn.lnk b/build/dxwnd.cn.lnk
deleted file mode 100644
index 32ee7b1..0000000
Binary files a/build/dxwnd.cn.lnk and /dev/null differ
diff --git a/build/dxwnd.dll b/build/dxwnd.dll
index 577bd21..53e526a 100644
--- a/build/dxwnd.dll
+++ b/build/dxwnd.dll
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:512069ae0535b5c459f092824da7d559e7950574c161c31657fdcbc739a29f93
-size 489472
+oid sha256:053fb6f12d42bc12bc80eac6aae9f57621783b3b69bed282eab3bc43ecde0a01
+size 491520
diff --git a/build/dxwnd.exe b/build/dxwnd.exe
index b575366..e38350c 100644
--- a/build/dxwnd.exe
+++ b/build/dxwnd.exe
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:c06874fa4dbb6cee68cbee26cbb5510526ed30c895494280e8d365a0fdb7ce56
-size 547328
+oid sha256:8eea2972772c9c037a22822bcc7caa6a42b94e34c0d1e0e94da53eff32f8879f
+size 548864
diff --git a/build/dxwnd.ini b/build/dxwnd.ini
index bbea89f..7c6f1c3 100644
--- a/build/dxwnd.ini
+++ b/build/dxwnd.ini
@@ -1,37 +1,6 @@
-[keymapping]
-timetoggle=0x72
-altf4=0x73
-timeslow=0x74
-timefast=0x75
[window]
-posx=709
-posy=406
+posx=402
+posy=414
sizx=320
sizy=200
-[target]
-title0=Conflict Zone
-path0=D:\Games\Conflict Zone\Conflict zone.exe
-launchpath0=
-module0=
-opengllib0=
-ver0=0
-coord0=0
-flag0=134217760
-flagg0=1207959552
-flagh0=20
-flagi0=4194308
-tflag0=64
-initx0=0
-inity0=0
-minx0=0
-miny0=0
-maxx0=0
-maxy0=0
-posx0=50
-posy0=50
-sizx0=800
-sizy0=600
-maxfps0=0
-initts0=0
-winver0=0
-maxres0=-1
+lang=automatic
diff --git a/build/exports/Age of Wonders.dxw b/build/exports/Age of Wonders.dxw
new file mode 100644
index 0000000..8caa0f2
--- /dev/null
+++ b/build/exports/Age of Wonders.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Age of Wonders
+path0=D:\Games\Age of Wonders\AoW.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=679477792
+flagg0=1207959552
+flagh0=20
+flagi0=201326596
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Battle Realms.dxw b/build/exports/Battle Realms.dxw
new file mode 100644
index 0000000..2ab1589
--- /dev/null
+++ b/build/exports/Battle Realms.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Battle Realms
+path0=D:\Games\Battle Realms\Battle_Realms_F.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=150994976
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Devil Inside, the.dxw b/build/exports/Devil Inside, the.dxw
new file mode 100644
index 0000000..e33739b
--- /dev/null
+++ b/build/exports/Devil Inside, the.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Devil Inside, the
+path0=D:\Games\Devil Inside\Devil.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=671088672
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+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
diff --git a/build/exports/O.D.T. Escape Or Die Trying.dxw b/build/exports/O.D.T. Escape Or Die Trying.dxw
new file mode 100644
index 0000000..508f20b
--- /dev/null
+++ b/build/exports/O.D.T. Escape Or Die Trying.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=O.D.T. Escape Or Die Trying
+path0=D:\Games\ODT\ODT.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=1207959648
+flagg0=1207959552
+flagh0=20
+flagi0=205520900
+tflag0=6147
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Of Light and Darkness.dxw b/build/exports/Of Light and Darkness.dxw
new file mode 100644
index 0000000..f76d65b
--- /dev/null
+++ b/build/exports/Of Light and Darkness.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Of Light and Darkness
+path0=D:\Games\Of Light and Darkness\3di.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134234660
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Ominous Horizons.dxw b/build/exports/Ominous Horizons.dxw
new file mode 100644
index 0000000..4688534
--- /dev/null
+++ b/build/exports/Ominous Horizons.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Ominous Horizons
+path0=D:\Games\Ominous_Horizons\bin\ominous.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=9
+coord0=0
+flag0=134218272
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Outlaws.dxw b/build/exports/Outlaws.dxw
new file mode 100644
index 0000000..d54d468
--- /dev/null
+++ b/build/exports/Outlaws.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Outlaws
+path0=D:\Games\Outlaws\OUTLAWS.EXE
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=671105568
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Panzer Commander.dxw b/build/exports/Panzer Commander.dxw
new file mode 100644
index 0000000..4c0d56c
--- /dev/null
+++ b/build/exports/Panzer Commander.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Panzer Commander
+path0=D:\Games\Panzer_Commander\Panzer.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134217826
+flagg0=1207959552
+flagh0=20
+flagi0=136314884
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Theme Hospital.dxw b/build/exports/Theme Hospital.dxw
new file mode 100644
index 0000000..acf4ae7
--- /dev/null
+++ b/build/exports/Theme Hospital.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Theme Hospital
+path0=D:\Games\Theme Hospital\HOSPITAL_win.EXE
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=134283780
+flagg0=1207959552
+flagh0=20
+flagi0=138412036
+tflag0=0
+initx0=0
+inity0=0
+minx0=0
+miny0=0
+maxx0=0
+maxy0=0
+posx0=50
+posy0=50
+sizx0=800
+sizy0=600
+maxfps0=0
+initts0=0
+winver0=0
+maxres0=-1
diff --git a/build/exports/Tomb Raider - Underworld.dxw b/build/exports/Tomb Raider - Underworld.dxw
new file mode 100644
index 0000000..ba38306
--- /dev/null
+++ b/build/exports/Tomb Raider - Underworld.dxw
@@ -0,0 +1,27 @@
+[target]
+title0=Tomb Raider - Underworld
+path0=D:\Games\Tomb Raider - Underworld\tru.exe
+launchpath0=
+module0=
+opengllib0=
+ver0=0
+coord0=0
+flag0=142623264
+flagg0=1207959552
+flagh0=20
+flagi0=205520900
+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
diff --git a/build/readme-relnotes.txt b/build/readme-relnotes.txt
index cdd9b97..40020ac 100644
--- a/build/readme-relnotes.txt
+++ b/build/readme-relnotes.txt
@@ -531,4 +531,11 @@ Preliminary multilanguage release, english and chinese, many thanks to gsky916 s
fixed Sleep bug for small delays and accelerated timeshift: fixes "Wind Fantasy SP" reported bug
added log for DirectInput::SetCooperativeLevel flags
fixed flip emulation mode when backbuffer is lost: fixes cursor problems in "HellCopter"
-fixed Pitch setting in DirectDraw::EnumDisplayModes when in SVGA emulation mode. Let "Outlive" use this setting
\ No newline at end of file
+fixed Pitch setting in DirectDraw::EnumDisplayModes when in SVGA emulation mode. Let "Outlive" use this setting
+
+v2.02.81
+fix: hooked GetMonitorInfoA/W that is a possible way to get the screen resolution. The hooker sets the virtual screen size updating both rcWork & rcMonitor rects in the MONITORINFO structure. This fixes the mouse control in "Tomb Raider Underworld" and likely in other games with a similar engine.
+
+v2.02.82
+fix: completed chinese translation and language selection through dxwnd.ini file.
+added very preliminary (and incomplete) italian translation for debugging.
\ No newline at end of file
diff --git a/dll/Debug/BuildLog.htm b/dll/Debug/BuildLog.htm
new file mode 100644
index 0000000..7f7b4ac
Binary files /dev/null and b/dll/Debug/BuildLog.htm differ
diff --git a/dll/Debug/advapi.obj b/dll/Debug/advapi.obj
new file mode 100644
index 0000000..1857632
Binary files /dev/null and b/dll/Debug/advapi.obj differ
diff --git a/dll/Debug/ddproxy.obj b/dll/Debug/ddproxy.obj
new file mode 100644
index 0000000..5fd639d
Binary files /dev/null and b/dll/Debug/ddproxy.obj differ
diff --git a/dll/Debug/ddraw.obj b/dll/Debug/ddraw.obj
new file mode 100644
index 0000000..c9e3fa5
Binary files /dev/null and b/dll/Debug/ddraw.obj differ
diff --git a/dll/Debug/dinput.obj b/dll/Debug/dinput.obj
new file mode 100644
index 0000000..efd3a95
Binary files /dev/null and b/dll/Debug/dinput.obj differ
diff --git a/dll/Debug/dwhide.obj b/dll/Debug/dwhide.obj
new file mode 100644
index 0000000..3722cd9
Binary files /dev/null and b/dll/Debug/dwhide.obj differ
diff --git a/dll/Debug/dxdiaghook.obj b/dll/Debug/dxdiaghook.obj
new file mode 100644
index 0000000..bb57cf2
Binary files /dev/null and b/dll/Debug/dxdiaghook.obj differ
diff --git a/dll/Debug/dxemublt.obj b/dll/Debug/dxemublt.obj
new file mode 100644
index 0000000..3029ee4
Binary files /dev/null and b/dll/Debug/dxemublt.obj differ
diff --git a/dll/Debug/dxhelper.obj b/dll/Debug/dxhelper.obj
new file mode 100644
index 0000000..bd8635e
Binary files /dev/null and b/dll/Debug/dxhelper.obj differ
diff --git a/dll/Debug/dxhook.obj b/dll/Debug/dxhook.obj
new file mode 100644
index 0000000..ec12f89
Binary files /dev/null and b/dll/Debug/dxhook.obj differ
diff --git a/dll/Debug/dxwcore.obj b/dll/Debug/dxwcore.obj
new file mode 100644
index 0000000..8abc0f6
Binary files /dev/null and b/dll/Debug/dxwcore.obj differ
diff --git a/dll/Debug/dxwnd.dll.embed.manifest b/dll/Debug/dxwnd.dll.embed.manifest
new file mode 100644
index 0000000..11bb704
--- /dev/null
+++ b/dll/Debug/dxwnd.dll.embed.manifest
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dll/Debug/dxwnd.dll.embed.manifest.res b/dll/Debug/dxwnd.dll.embed.manifest.res
new file mode 100644
index 0000000..c933726
Binary files /dev/null and b/dll/Debug/dxwnd.dll.embed.manifest.res differ
diff --git a/locale/cn/Release/Resources_CN.dll.intermediate.manifest b/dll/Debug/dxwnd.dll.intermediate.manifest
similarity index 100%
rename from locale/cn/Release/Resources_CN.dll.intermediate.manifest
rename to dll/Debug/dxwnd.dll.intermediate.manifest
diff --git a/dll/Debug/dxwnd.exp b/dll/Debug/dxwnd.exp
new file mode 100644
index 0000000..606dfb0
Binary files /dev/null and b/dll/Debug/dxwnd.exp differ
diff --git a/dll/Debug/dxwnd.lib b/dll/Debug/dxwnd.lib
new file mode 100644
index 0000000..5004800
Binary files /dev/null and b/dll/Debug/dxwnd.lib differ
diff --git a/dll/Debug/dxwnd.obj b/dll/Debug/dxwnd.obj
new file mode 100644
index 0000000..d80f533
Binary files /dev/null and b/dll/Debug/dxwnd.obj differ
diff --git a/dll/Debug/dxwnd.pdb b/dll/Debug/dxwnd.pdb
new file mode 100644
index 0000000..2356add
Binary files /dev/null and b/dll/Debug/dxwnd.pdb differ
diff --git a/dll/Debug/dxwnd.res b/dll/Debug/dxwnd.res
new file mode 100644
index 0000000..c23cbab
Binary files /dev/null and b/dll/Debug/dxwnd.res differ
diff --git a/dll/Debug/gdi32.obj b/dll/Debug/gdi32.obj
new file mode 100644
index 0000000..3453770
Binary files /dev/null and b/dll/Debug/gdi32.obj differ
diff --git a/dll/Debug/glide.obj b/dll/Debug/glide.obj
new file mode 100644
index 0000000..fab5531
Binary files /dev/null and b/dll/Debug/glide.obj differ
diff --git a/dll/Debug/hd3d.obj b/dll/Debug/hd3d.obj
new file mode 100644
index 0000000..7ddf469
Binary files /dev/null and b/dll/Debug/hd3d.obj differ
diff --git a/dll/Debug/hd3d7.obj b/dll/Debug/hd3d7.obj
new file mode 100644
index 0000000..fd1c75a
Binary files /dev/null and b/dll/Debug/hd3d7.obj differ
diff --git a/dll/Debug/hotpatch.obj b/dll/Debug/hotpatch.obj
new file mode 100644
index 0000000..138ebe9
Binary files /dev/null and b/dll/Debug/hotpatch.obj differ
diff --git a/dll/Debug/iatpatch.obj b/dll/Debug/iatpatch.obj
new file mode 100644
index 0000000..5c96f3c
Binary files /dev/null and b/dll/Debug/iatpatch.obj differ
diff --git a/dll/Debug/imelib.obj b/dll/Debug/imelib.obj
new file mode 100644
index 0000000..dbc80b7
Binary files /dev/null and b/dll/Debug/imelib.obj differ
diff --git a/dll/Debug/kernel32.obj b/dll/Debug/kernel32.obj
new file mode 100644
index 0000000..0feda5d
Binary files /dev/null and b/dll/Debug/kernel32.obj differ
diff --git a/dll/Debug/msvfw.obj b/dll/Debug/msvfw.obj
new file mode 100644
index 0000000..edfc7b0
Binary files /dev/null and b/dll/Debug/msvfw.obj differ
diff --git a/dll/Debug/mt.dep b/dll/Debug/mt.dep
new file mode 100644
index 0000000..397df39
--- /dev/null
+++ b/dll/Debug/mt.dep
@@ -0,0 +1 @@
+Manifest resource last updated at 0:24:39.39 on 30/06/2014
diff --git a/dll/Debug/ole32.obj b/dll/Debug/ole32.obj
new file mode 100644
index 0000000..8b24470
Binary files /dev/null and b/dll/Debug/ole32.obj differ
diff --git a/dll/Debug/opengl.obj b/dll/Debug/opengl.obj
new file mode 100644
index 0000000..51efa8c
Binary files /dev/null and b/dll/Debug/opengl.obj differ
diff --git a/dll/Debug/smack.obj b/dll/Debug/smack.obj
new file mode 100644
index 0000000..2b2a40c
Binary files /dev/null and b/dll/Debug/smack.obj differ
diff --git a/dll/Debug/user32.obj b/dll/Debug/user32.obj
new file mode 100644
index 0000000..9875a3d
Binary files /dev/null and b/dll/Debug/user32.obj differ
diff --git a/dll/Debug/vc90.idb b/dll/Debug/vc90.idb
new file mode 100644
index 0000000..4df69fb
Binary files /dev/null and b/dll/Debug/vc90.idb differ
diff --git a/dll/Debug/vc90.pdb b/dll/Debug/vc90.pdb
new file mode 100644
index 0000000..0b3ec79
Binary files /dev/null and b/dll/Debug/vc90.pdb differ
diff --git a/dll/Debug/winmm.obj b/dll/Debug/winmm.obj
new file mode 100644
index 0000000..9479aec
Binary files /dev/null and b/dll/Debug/winmm.obj differ
diff --git a/dll/Debug/wintrust.obj b/dll/Debug/wintrust.obj
new file mode 100644
index 0000000..a080284
Binary files /dev/null and b/dll/Debug/wintrust.obj differ
diff --git a/dll/Debug/wndproc.obj b/dll/Debug/wndproc.obj
new file mode 100644
index 0000000..7924acc
Binary files /dev/null and b/dll/Debug/wndproc.obj differ
diff --git a/dll/dxhook.cpp b/dll/dxhook.cpp
index 7dcffc1..9a34db4 100644
--- a/dll/dxhook.cpp
+++ b/dll/dxhook.cpp
@@ -87,7 +87,7 @@ static char *Flag4Names[32]={
"STRETCHTIMERS", "NOFLIPEMULATION", "NOTEXTURES", "RETURNNULLREF",
"FINETIMING", "NATIVERES", "SUPPORTSVGA", "SUPPORTHDTV",
"RELEASEMOUSE", "FRAMECOMPENSATION", "HOTPATCH", "ENABLEHOTKEYS",
- "HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "",
+ "HOTPATCHALWAYS", "NOD3DRESET", "OVERRIDEREGISTRY", "HIDECDROMEMPTY",
};
static char *TFlagNames[32]={
@@ -557,7 +557,7 @@ LRESULT CALLBACK extDialogWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPA
}
pWindowProc=WhndGetWindowProc(hwnd);
- if(pWindowProc) return(*pWindowProc)(hwnd, message, wparam, lparam);
+ if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam);
char *sMsg="ASSERT: DialogWinMsg pWindowProc=NULL !!!\n";
OutTraceDW(sMsg);
if (IsAssertEnabled) MessageBox(0, sMsg, "WindowProc", MB_OK | MB_ICONEXCLAMATION);
@@ -571,49 +571,53 @@ LRESULT CALLBACK extChildWindowProc(HWND hwnd, UINT message, WPARAM wparam, LPAR
WNDPROC pWindowProc;
OutTraceW("DEBUG: ChildWinMsg [0x%x]%s(%x,%x)\n", message, ExplainWinMessage(message), wparam, lparam);
- switch(message){
- // Cybermercs: it seems that all game menus are conveniently handled by the WindowProc routine,
- // while the action screen get messages processed by the ChildWindowProc, that needs some different
- // setting ..........
- // Beware: Cybermercs handles some static info about cursor position handling, so that if you resize
- // a menu it doesn't work correctly until you don't change screen.
- case WM_MOUSEMOVE:
- case WM_MOUSEWHEEL:
- case WM_LBUTTONDOWN:
- case WM_LBUTTONUP:
- case WM_LBUTTONDBLCLK:
- case WM_RBUTTONDOWN:
- case WM_RBUTTONUP:
- case WM_RBUTTONDBLCLK:
- case WM_MBUTTONDOWN:
- case WM_MBUTTONUP:
- case WM_MBUTTONDBLCLK:
- if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
- POINT prev, curr;
- // scale mouse coordinates
- prev.x = LOWORD(lparam);
- prev.y = HIWORD(lparam);
- curr = prev;
- if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
- POINT upleft={0,0};
- (*pClientToScreen)(dxw.GethWnd(), &upleft);
- curr = dxw.SubCoordinates(curr, upleft);
+ if(dxw.Windowize){
+ switch(message){
+ // Cybermercs: it seems that all game menus are conveniently handled by the WindowProc routine,
+ // while the action screen get messages processed by the ChildWindowProc, that needs some different
+ // setting ..........
+ // Beware: Cybermercs handles some static info about cursor position handling, so that if you resize
+ // a menu it doesn't work correctly until you don't change screen.
+ case WM_MOUSEMOVE:
+ case WM_MOUSEWHEEL:
+ case WM_LBUTTONDOWN:
+ case WM_LBUTTONUP:
+ case WM_LBUTTONDBLCLK:
+ case WM_RBUTTONDOWN:
+ case WM_RBUTTONUP:
+ case WM_RBUTTONDBLCLK:
+ case WM_MBUTTONDOWN:
+ case WM_MBUTTONUP:
+ case WM_MBUTTONDBLCLK:
+ if(dxw.dwFlags1 & MODIFYMOUSE){ // mouse processing
+ POINT prev, curr;
+ // scale mouse coordinates
+ prev.x = LOWORD(lparam);
+ prev.y = HIWORD(lparam);
+ curr = prev;
+ if(message == WM_MOUSEWHEEL){ // v2.02.33 mousewheel fix
+ POINT upleft={0,0};
+ (*pClientToScreen)(dxw.GethWnd(), &upleft);
+ curr = dxw.SubCoordinates(curr, upleft);
+ }
+ //OutTraceC("ChildWindowProc: hwnd=%x pos XY prev=(%d,%d)\n", hwnd, prev.x, prev.y);
+ curr=dxw.FixCursorPos(curr); // Warn! the correction must refer to the main window hWnd, not the current hwnd one !!!
+ lparam = MAKELPARAM(curr.x, curr.y);
+ OutTraceC("ChildWindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
}
- //OutTraceC("ChildWindowProc: hwnd=%x pos XY prev=(%d,%d)\n", hwnd, prev.x, prev.y);
- curr=dxw.FixCursorPos(curr); // Warn! the correction must refer to the main window hWnd, not the current hwnd one !!!
- lparam = MAKELPARAM(curr.x, curr.y);
- OutTraceC("ChildWindowProc: hwnd=%x pos XY=(%d,%d)->(%d,%d)\n", hwnd, prev.x, prev.y, curr.x, curr.y);
+ break;
+ default:
+ break;
}
- break;
- default:
- break;
}
pWindowProc=WhndGetWindowProc(hwnd);
- if(pWindowProc) return(*pWindowProc)(hwnd, message, wparam, lparam);
-
+ // v2.02.82: use CallWindowProc that handles WinProc handles
+ if(pWindowProc) return(*pCallWindowProc)(pWindowProc, hwnd, message, wparam, lparam);
+ // should never get here ....
+ OutTraceDW("ChildWindowProc: no WndProc for CHILD hwnd=%x\n", hwnd);
return DefWindowProc(hwnd, message, wparam, lparam);
}
diff --git a/dll/dxwnd.aps b/dll/dxwnd.aps
index dd2e7ad..3f3df4b 100644
Binary files a/dll/dxwnd.aps and b/dll/dxwnd.aps differ
diff --git a/dll/dxwnd.cpp b/dll/dxwnd.cpp
index ae0e13e..84461ba 100644
--- a/dll/dxwnd.cpp
+++ b/dll/dxwnd.cpp
@@ -24,7 +24,7 @@ along with this program. If not, see .
#include "dxwnd.h"
#include "dxwcore.hpp"
-#define VERSION "2.02.80"
+#define VERSION "2.02.82"
#define DDTHREADLOCK 1
diff --git a/dll/dxwnd.vs2008.suo b/dll/dxwnd.vs2008.suo
index 2923f2d..190757a 100644
Binary files a/dll/dxwnd.vs2008.suo and b/dll/dxwnd.vs2008.suo differ
diff --git a/dll/syslibs.h b/dll/syslibs.h
index d3e1bd3..f41b85c 100644
--- a/dll/syslibs.h
+++ b/dll/syslibs.h
@@ -160,6 +160,7 @@ typedef BOOL (WINAPI *GetCursorPos_Type)(LPPOINT);
typedef HDC (WINAPI *GDIGetDC_Type)(HWND);
typedef HWND (WINAPI *GetDesktopWindow_Type)(void);
typedef BOOL (WINAPI *GetMessage_Type)(LPMSG, HWND, UINT, UINT);
+typedef BOOL (WINAPI *GetMonitorInfo_Type)(HMONITOR, LPMONITORINFO);
typedef int (WINAPI *GetSystemMetrics_Type)(int);
typedef HWND (WINAPI *GetTopWindow_Type)(HWND);
typedef LONG (WINAPI *GetWindowLong_Type)(HWND, int);
@@ -364,6 +365,8 @@ DXWEXTERN GetClipCursor_Type pGetClipCursor DXWINITIALIZED;
DXWEXTERN GetCursorPos_Type pGetCursorPos DXWINITIALIZED;
DXWEXTERN GDIGetDC_Type pGDIGetDC DXWINITIALIZED;
DXWEXTERN GetDesktopWindow_Type pGetDesktopWindow DXWINITIALIZED;
+DXWEXTERN GetMonitorInfo_Type pGetMonitorInfoA DXWINITIALIZED;
+DXWEXTERN GetMonitorInfo_Type pGetMonitorInfoW DXWINITIALIZED;
DXWEXTERN GetSystemMetrics_Type pGetSystemMetrics DXWINITIALIZED;
DXWEXTERN GetTopWindow_Type pGetTopWindow DXWINITIALIZED;
DXWEXTERN GDIGetDC_Type pGDIGetWindowDC DXWINITIALIZED;
@@ -573,6 +576,8 @@ extern HDC WINAPI extGDIGetDC(HWND);
extern HDC WINAPI extEMUGetDC(HWND);
extern HDC WINAPI extDDGetDC(HWND);
extern HWND WINAPI extGetDesktopWindow(void);
+extern BOOL WINAPI extGetMonitorInfoA(HMONITOR, LPMONITORINFO);
+extern BOOL WINAPI extGetMonitorInfoW(HMONITOR, LPMONITORINFO);
extern int WINAPI extGetSystemMetrics(int);
extern HWND WINAPI extGetTopWindow(HWND);
extern HDC WINAPI extGDIGetWindowDC(HWND);
diff --git a/dll/user32.cpp b/dll/user32.cpp
index 1fcf12f..5314c46 100644
--- a/dll/user32.cpp
+++ b/dll/user32.cpp
@@ -22,6 +22,8 @@ static HookEntry_Type Hooks[]={
{HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsExA", (FARPROC)ChangeDisplaySettingsExA, (FARPROC *)&pChangeDisplaySettingsExA, (FARPROC)extChangeDisplaySettingsExA},
{HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsW, (FARPROC)extChangeDisplaySettingsW}, // ref. by Knights of Honor
{HOOK_HOT_CANDIDATE, "ChangeDisplaySettingsExW", (FARPROC)NULL, (FARPROC *)&pChangeDisplaySettingsExW, (FARPROC)extChangeDisplaySettingsExW},
+ {HOOK_HOT_CANDIDATE, "GetMonitorInfoA", (FARPROC)NULL, (FARPROC *)&pGetMonitorInfoA, (FARPROC)extGetMonitorInfoA},
+ {HOOK_HOT_CANDIDATE, "GetMonitorInfoW", (FARPROC)NULL, (FARPROC *)&pGetMonitorInfoW, (FARPROC)extGetMonitorInfoW},
{HOOK_IAT_CANDIDATE, "ShowCursor", (FARPROC)ShowCursor, (FARPROC *)&pShowCursor, (FARPROC)extShowCursor},
{HOOK_IAT_CANDIDATE, "CreateDialogIndirectParamA", (FARPROC)CreateDialogIndirectParamA, (FARPROC *)&pCreateDialogIndirectParam, (FARPROC)extCreateDialogIndirectParam},
{HOOK_IAT_CANDIDATE, "CreateDialogParamA", (FARPROC)CreateDialogParamA, (FARPROC *)&pCreateDialogParam, (FARPROC)extCreateDialogParam},
@@ -887,7 +889,7 @@ BOOL WINAPI extSetCursorPos(int x, int y)
res=0;
if (pSetCursorPos) res=(*pSetCursorPos)(x,y);
- OutTraceC("SetCursorPos: res=%x XY=(%d,%d)->(%d,%d)\n",res, PrevX, PrevY, x, y);
+ OutTraceC("SetCursorPos: res=%x XY=(%d,%d)->(%d,%d)\n", res, PrevX, PrevY, x, y);
return res;
}
@@ -1122,6 +1124,39 @@ ATOM WINAPI extRegisterClassA(WNDCLASS *lpwcx)
return (*pRegisterClassA)(lpwcx);
}
+static void HookChildWndProc(HWND hwnd, DWORD dwStyle, LPCTSTR ApiName)
+{
+ // child window inherit the father's windproc, so if it's redirected to
+ // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve
+ // the correct value (WhndGetWindowProc) before saving it (WhndStackPush).
+ long res;
+ WNDPROC pWindowProc;
+
+ pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
+ if((pWindowProc == extWindowProc) ||
+ (pWindowProc == extChildWindowProc) ||
+ (pWindowProc == extDialogWindowProc)){ // avoid recursions
+ HWND Father;
+ WNDPROC pFatherProc;
+ Father=GetParent(hwnd);
+ pFatherProc=WhndGetWindowProc(Father);
+ OutTraceDW("%s: WndProc=%s father=%x WndProc=%x\n", ApiName,
+ (pWindowProc == extWindowProc) ? "extWindowProc" : ((pWindowProc == extChildWindowProc) ? "extChildWindowProc" : "extDialogWindowProc"),
+ Father, pFatherProc);
+ pWindowProc = pFatherProc;
+ }
+ WhndStackPush(hwnd, pWindowProc);
+ if(dwStyle & WS_CHILD){
+ OutTraceDW("%s: Hooking CHILD hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extChildWindowProc);
+ res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc);
+ }
+ else { // must be dwStyle & WS_DLGFRAME
+ OutTraceDW("%s: Hooking DLGFRAME hwnd=%x father WindowProc %x->%x\n", ApiName, hwnd, pWindowProc, extDialogWindowProc);
+ res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extDialogWindowProc);
+ }
+ if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError());
+}
+
static HWND WINAPI extCreateWindowCommon(
LPCTSTR ApiName,
BOOL WideChar,
@@ -1139,7 +1174,6 @@ static HWND WINAPI extCreateWindowCommon(
LPVOID lpParam)
{
HWND hwnd;
- WNDPROC pWindowProc;
BOOL isValidHandle=TRUE;
if(!dxw.Windowize){
@@ -1147,44 +1181,12 @@ static HWND WINAPI extCreateWindowCommon(
hwnd= (*pCreateWindowExW)(dwExStyle, (LPCWSTR)lpClassName, (LPCWSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
else
hwnd= (*pCreateWindowExA)(dwExStyle, (LPCSTR)lpClassName, (LPCSTR)lpWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, hMenu, hInstance, lpParam);
- if ((dwStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN)){
- // child window inherit the father's windproc, so if it's redirected to
- // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve
- // the correct value (WhndGetWindowProc) before saving it (WhndStackPush).
- long res;
- pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
- if((pWindowProc == extWindowProc) ||
- (pWindowProc == extChildWindowProc) ||
- (pWindowProc == extDialogWindowProc)){ // avoid recursions
- HWND Father;
- Father=GetParent(hwnd);
- pWindowProc=WhndGetWindowProc(Father);
- }
- OutTraceDW("Hooking CHILD hwnd=%x father WindowProc %x->%x\n", hwnd, pWindowProc, extChildWindowProc);
- res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc);
- if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError());
- WhndStackPush(hwnd, pWindowProc);
- }
- if ((dwStyle & WS_DLGFRAME) && (dxw.dwFlags1 & HOOKCHILDWIN)){
- // child window inherit the father's windproc, so if it's redirected to
- // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve
- // the correct value (WhndGetWindowProc) before saving it (WhndStackPush).
- long res;
- pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, DWL_DLGPROC);
- if((pWindowProc == extWindowProc) ||
- (pWindowProc == extChildWindowProc) ||
- (pWindowProc == extDialogWindowProc)){ // avoid recursions
- HWND Father;
- Father=GetParent(hwnd);
- pWindowProc=WhndGetWindowProc(Father);
- }
- OutTraceDW("Hooking CHILD hwnd=%x father WindowProc %x->%x\n", hwnd, pWindowProc, extChildWindowProc);
- res=(*pSetWindowLongA)(hwnd, DWL_DLGPROC, (LONG)extDialogWindowProc);
- if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError());
- WhndStackPush(hwnd, pWindowProc);
- }
+
+ if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME)))
+ HookChildWndProc(hwnd, dwStyle, ApiName);
+
OutTraceDW("%s: ret=%x\n", ApiName, hwnd);
- return hwnd;
+ return hwnd;
}
// no maximized windows in any case
@@ -1332,43 +1334,8 @@ static HWND WINAPI extCreateWindowCommon(
if ((dxw.dwFlags1 & FIXWINFRAME) && !(dwStyle & WS_CHILD) && dxw.IsDesktop(hwnd))
dxw.FixWindowFrame(hwnd);
- // to do: handle inner child, and leave dialogue & modal child alone!!!
- if ((dwStyle & WS_CHILD) && (dxw.dwFlags1 & HOOKCHILDWIN)){
- // child window inherit the father's windproc, so if it's redirected to
- // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve
- // the correct value (WhndGetWindowProc) before saving it (WhndStackPush).
- long res;
- pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, GWL_WNDPROC);
- if((pWindowProc == extWindowProc) ||
- (pWindowProc == extChildWindowProc) ||
- (pWindowProc == extDialogWindowProc)){ // avoid recursions
- HWND Father;
- Father=GetParent(hwnd);
- pWindowProc=WhndGetWindowProc(Father);
- }
- OutTraceDW("Hooking CHILD hwnd=%x father WindowProc %x->%x\n", hwnd, pWindowProc, extChildWindowProc);
- res=(*pSetWindowLongA)(hwnd, GWL_WNDPROC, (LONG)extChildWindowProc);
- if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError());
- WhndStackPush(hwnd, pWindowProc);
- }
- if ((dwStyle & WS_DLGFRAME) && (dxw.dwFlags1 & HOOKCHILDWIN)){
- // child window inherit the father's windproc, so if it's redirected to
- // a hooker (either extWindowProc or extChildWindowProc) you have to retrieve
- // the correct value (WhndGetWindowProc) before saving it (WhndStackPush).
- long res;
- pWindowProc = (WNDPROC)(*pGetWindowLongA)(hwnd, DWL_DLGPROC);
- if((pWindowProc == extWindowProc) ||
- (pWindowProc == extChildWindowProc) ||
- (pWindowProc == extDialogWindowProc)){ // avoid recursions
- HWND Father;
- Father=GetParent(hwnd);
- pWindowProc=WhndGetWindowProc(Father);
- }
- OutTraceDW("Hooking CHILD hwnd=%x father WindowProc %x->%x\n", hwnd, pWindowProc, extChildWindowProc);
- res=(*pSetWindowLongA)(hwnd, DWL_DLGPROC, (LONG)extDialogWindowProc);
- if(!res) OutTraceE("%s: SetWindowLong ERROR %x\n", ApiName, GetLastError());
- WhndStackPush(hwnd, pWindowProc);
- }
+ if ((dxw.dwFlags1 & HOOKCHILDWIN) && (dwStyle & (WS_CHILD|WS_DLGFRAME)))
+ HookChildWndProc(hwnd, dwStyle, ApiName);
OutTraceDW("%s: ret=%x\n", ApiName, hwnd);
return hwnd;
@@ -2331,13 +2298,53 @@ BOOL WINAPI extDestroyWindow(HWND hWnd)
return res;
}
+static char *ExplainTAAlign(UINT c)
+{
+ static char eb[256];
+ unsigned int l;
+ strcpy(eb,"TA_");
+ strcat(eb, (c & TA_UPDATECP) ? "UPDATECP+" : "NOUPDATECP+");
+ strcat(eb, (c & TA_RIGHT) ? (((c & TA_CENTER) == TA_CENTER) ? "CENTER+" : "RIGHT+") : "LEFT+");
+ strcat(eb, (c & TA_BOTTOM) ? "BOTTOM+" : "TOP+");
+ if ((c & TA_BASELINE)==TA_BASELINE) strcat(eb, "BASELINE+");
+ if (c & TA_RTLREADING) strcat(eb, "RTLREADING+");
+ l=strlen(eb);
+ eb[l-1]=0;
+ return(eb);
+}
+
+static char *ExplainDTFormat(UINT c)
+{
+ static char eb[256];
+ unsigned int l;
+ strcpy(eb,"DT_");
+ if(!(c & (DT_CENTER|DT_RIGHT))) strcat(eb, "LEFT+");
+ if(c & DT_CENTER) strcat(eb, "CENTER+");
+ if(c & DT_RIGHT) strcat(eb, "RIGHT+");
+ if(!(c & (DT_VCENTER|DT_BOTTOM))) strcat(eb, "TOP+");
+ if(c & DT_VCENTER) strcat(eb, "VCENTER+");
+ if(c & DT_BOTTOM) strcat(eb, "BOTTOM+");
+ if(c & DT_WORDBREAK) strcat(eb, "WORDBREAK+");
+ if(c & DT_SINGLELINE) strcat(eb, "SINGLELINE+");
+ if(c & DT_EXPANDTABS) strcat(eb, "EXPANDTABS+");
+ if(c & DT_TABSTOP) strcat(eb, "TABSTOP+");
+ if(c & DT_NOCLIP) strcat(eb, "NOCLIP+");
+ if(c & DT_EXTERNALLEADING) strcat(eb, "EXTERNALLEADING+");
+ if(c & DT_CALCRECT) strcat(eb, "CALCRECT+");
+ if(c & DT_NOPREFIX) strcat(eb, "NOPREFIX+");
+ if(c & DT_INTERNAL) strcat(eb, "INTERNAL+");
+ l=strlen(eb);
+ eb[l-1]=0;
+ return(eb);
+}
+
BOOL gFixed;
int WINAPI extDrawTextA(HDC hdc, LPCTSTR lpchText, int nCount, LPRECT lpRect, UINT uFormat)
{
int ret;
- OutTraceDW("DrawText: hdc=%x rect=(%d,%d)-(%d,%d) Format=%x Text=(%d)\"%s\"\n",
- hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, uFormat, nCount, lpchText);
+ OutTraceDW("DrawText: hdc=%x rect=(%d,%d)-(%d,%d) Format=%x(%s) Text=(%d)\"%s\"\n",
+ hdc, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, uFormat, ExplainDTFormat(uFormat), nCount, lpchText);
gFixed = TRUE;
if (dxw.IsFullScreen() && (OBJ_DC == GetObjectType(hdc))){
@@ -2642,3 +2649,28 @@ HWND WINAPI extChildWindowFromPointEx(HWND hWndParent, POINT Point, UINT uFlags)
return ret;
}
+BOOL extGetMonitorInfo(HMONITOR hMonitor, LPMONITORINFO lpmi, GetMonitorInfo_Type pGetMonitorInfo)
+{
+ BOOL res;
+ OutTrace("GetMonitorInfo: hMonitor=%x mi=MONITORINFO%s\n", hMonitor, lpmi->cbSize==sizeof(MONITORINFO)?"":"EX");
+ res=(*pGetMonitorInfo)(hMonitor, lpmi);
+ if(res && dxw.Windowize){
+ OutTraceDW("GetMonitorInfo: FIX Work=(%d,%d)-(%d,%d) Monitor=(%d,%d)-(%d,%d) -> (%d,%d)-(%d,%d)\n",
+ lpmi->rcWork.left, lpmi->rcWork.top, lpmi->rcWork.right, lpmi->rcWork.bottom,
+ lpmi->rcMonitor.left, lpmi->rcMonitor.top, lpmi->rcMonitor.right, lpmi->rcMonitor.bottom,
+ 0, 0, dxw.GetScreenWidth(), dxw.GetScreenHeight());
+ lpmi->rcWork = dxw.GetScreenRect();
+ lpmi->rcMonitor = dxw.GetScreenRect();
+ }
+ return res;
+}
+
+BOOL WINAPI extGetMonitorInfoA(HMONITOR hMonitor, LPMONITORINFO lpmi)
+{
+ return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoA);
+}
+
+BOOL WINAPI extGetMonitorInfoW(HMONITOR hMonitor, LPMONITORINFO lpmi)
+{
+ return extGetMonitorInfo(hMonitor, lpmi, pGetMonitorInfoW);
+}
diff --git a/doc/dxwnd_manual.odt b/doc/dxwnd_manual.odt
new file mode 100644
index 0000000..eccef6a
Binary files /dev/null and b/doc/dxwnd_manual.odt differ
diff --git a/doc/dxwnd_manual.pdf b/doc/dxwnd_manual.pdf
new file mode 100644
index 0000000..af7b0e1
Binary files /dev/null and b/doc/dxwnd_manual.pdf differ
diff --git a/doc/resources/config_compat.png b/doc/resources/config_compat.png
new file mode 100644
index 0000000..0e39b81
Binary files /dev/null and b/doc/resources/config_compat.png differ
diff --git a/doc/resources/config_directx.png b/doc/resources/config_directx.png
new file mode 100644
index 0000000..c93a4d9
Binary files /dev/null and b/doc/resources/config_directx.png differ
diff --git a/doc/resources/config_input.png b/doc/resources/config_input.png
new file mode 100644
index 0000000..ee1a0f8
Binary files /dev/null and b/doc/resources/config_input.png differ
diff --git a/doc/resources/config_libs.png b/doc/resources/config_libs.png
new file mode 100644
index 0000000..b58595f
Binary files /dev/null and b/doc/resources/config_libs.png differ
diff --git a/doc/resources/config_log.png b/doc/resources/config_log.png
new file mode 100644
index 0000000..1496eb4
Binary files /dev/null and b/doc/resources/config_log.png differ
diff --git a/doc/resources/config_main.png b/doc/resources/config_main.png
new file mode 100644
index 0000000..3d0c38e
Binary files /dev/null and b/doc/resources/config_main.png differ
diff --git a/doc/resources/config_timing.png b/doc/resources/config_timing.png
new file mode 100644
index 0000000..2c5b273
Binary files /dev/null and b/doc/resources/config_timing.png differ
diff --git a/doc/resources/config_video.png b/doc/resources/config_video.png
new file mode 100644
index 0000000..b47c878
Binary files /dev/null and b/doc/resources/config_video.png differ
diff --git a/doc/resources/dxwnd.png b/doc/resources/dxwnd.png
new file mode 100644
index 0000000..61d663b
Binary files /dev/null and b/doc/resources/dxwnd.png differ
diff --git a/doc/resources/dxwnd_menu.png b/doc/resources/dxwnd_menu.png
new file mode 100644
index 0000000..2b9d8f5
Binary files /dev/null and b/doc/resources/dxwnd_menu.png differ
diff --git a/doc/resources/help_about.png b/doc/resources/help_about.png
new file mode 100644
index 0000000..ed58f6b
Binary files /dev/null and b/doc/resources/help_about.png differ
diff --git a/doc/resources/menu_edit.png b/doc/resources/menu_edit.png
new file mode 100644
index 0000000..2272b6d
Binary files /dev/null and b/doc/resources/menu_edit.png differ
diff --git a/doc/resources/menu_file.png b/doc/resources/menu_file.png
new file mode 100644
index 0000000..bfdf234
Binary files /dev/null and b/doc/resources/menu_file.png differ
diff --git a/doc/resources/menu_help.png b/doc/resources/menu_help.png
new file mode 100644
index 0000000..6244e27
Binary files /dev/null and b/doc/resources/menu_help.png differ
diff --git a/doc/resources/menu_view.png b/doc/resources/menu_view.png
new file mode 100644
index 0000000..623ae96
Binary files /dev/null and b/doc/resources/menu_view.png differ
diff --git a/doc/resources/view_palette.png b/doc/resources/view_palette.png
new file mode 100644
index 0000000..35acdb9
Binary files /dev/null and b/doc/resources/view_palette.png differ
diff --git a/doc/resources/view_status.png b/doc/resources/view_status.png
new file mode 100644
index 0000000..f54a14c
Binary files /dev/null and b/doc/resources/view_status.png differ
diff --git a/doc/resources/view_timeslider.png b/doc/resources/view_timeslider.png
new file mode 100644
index 0000000..7ba052f
Binary files /dev/null and b/doc/resources/view_timeslider.png differ
diff --git a/host/MessageBox.cpp b/host/MessageBox.cpp
index 50a0cbd..6f0ab9c 100644
--- a/host/MessageBox.cpp
+++ b/host/MessageBox.cpp
@@ -29,10 +29,3 @@ int MessageBoxLangArg(UINT iText, UINT iCaption, UINT uType, ...)
return MessageBoxExW(NULL, sBuffer, sCaption, uType, NULL);
}
-int MessageBoxLangWstr(LPWSTR lpBuffer, UINT iCaption, UINT uType)
-{
- WCHAR sCaption[48+1];
- LoadStringW(AfxGetResourceHandle(), iCaption, (LPWSTR)&sCaption, sizeof(sCaption));
-
- return MessageBoxExW(NULL, lpBuffer, sCaption, uType, NULL);
-}
diff --git a/host/Resource.h b/host/Resource.h
index ab85cd2..c346f1b 100644
Binary files a/host/Resource.h and b/host/Resource.h differ
diff --git a/host/TabWindow.cpp b/host/TabWindow.cpp
index 813f0ae..a0aca8d 100644
--- a/host/TabWindow.cpp
+++ b/host/TabWindow.cpp
@@ -72,6 +72,8 @@ static char *Resolutions[]={
"" // terminator
};
+char UnlimitedString[20+1];
+
BOOL CTabWindow::OnInitDialog()
{
@@ -82,6 +84,9 @@ BOOL CTabWindow::OnInitDialog()
int i;
List=(CListBox *)this->GetDlgItem(IDC_LISTRES);
List->ResetContent();
+ if(LoadString(AfxGetResourceHandle(), DXW_STRING_UNLIMITED, UnlimitedString, sizeof(UnlimitedString))){
+ Resolutions[0]=UnlimitedString;
+ }
for(i=0; strlen(Resolutions[i]); i++) List->AddString(Resolutions[i]);
List->SetCurSel(cTarget->m_MaxScreenRes);
diff --git a/host/TargetDlg.cpp b/host/TargetDlg.cpp
index 445743f..70096ab 100644
--- a/host/TargetDlg.cpp
+++ b/host/TargetDlg.cpp
@@ -172,6 +172,7 @@ BOOL CTargetDlg::OnInitDialog()
int i=0;
AfxEnableControlContainer();
CDialog::OnInitDialog();
+#if 0
m_tabdxTabCtrl.InsertItem(i++, _T("Main"));
m_tabdxTabCtrl.InsertItem(i++, _T("Video"));
m_tabdxTabCtrl.InsertItem(i++, _T("Input"));
@@ -181,6 +182,27 @@ BOOL CTargetDlg::OnInitDialog()
m_tabdxTabCtrl.InsertItem(i++, _T("Libs"));
m_tabdxTabCtrl.InsertItem(i++, _T("Compat"));
if (gbDebug) m_tabdxTabCtrl.InsertItem(i++, _T("Debug"));
+#else
+ char sCaption[48+1];
+ LoadString(AfxGetResourceHandle(), DXW_TAB_MAIN, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_VIDEO, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_INPUT, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_DIRECTX, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_TIMING, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_LOGS, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_LIBS, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_COMPAT, sCaption, sizeof(sCaption));
+ m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+ LoadString(AfxGetResourceHandle(), DXW_TAB_DEBUG, sCaption, sizeof(sCaption));
+ if (gbDebug) m_tabdxTabCtrl.InsertItem(i++, _T(sCaption));
+#endif
m_tabdxTabCtrl.Init();
return TRUE;
}
diff --git a/host/TimeSliderDialog.h b/host/TimeSliderDialog.h
index 6615576..8a03ec1 100644
--- a/host/TimeSliderDialog.h
+++ b/host/TimeSliderDialog.h
@@ -27,4 +27,6 @@ public:
virtual BOOL OnInitDialog();
protected:
virtual void OnOK();
+private:
+ char IdleString[20+1];
};
diff --git a/host/TimeSliderDlg.cpp b/host/TimeSliderDlg.cpp
index 5b63808..b94abed 100644
--- a/host/TimeSliderDlg.cpp
+++ b/host/TimeSliderDlg.cpp
@@ -12,6 +12,7 @@ IMPLEMENT_DYNAMIC(CTimeSliderDialog, CDialog)
CTimeSliderDialog::CTimeSliderDialog(CWnd* pParent /*=NULL*/)
: CDialog(CTimeSliderDialog::IDD, pParent)
{
+ LoadString(AfxGetResourceHandle(), DXW_STRING_IDLE, IdleString, sizeof(IdleString));
}
CTimeSliderDialog::~CTimeSliderDialog()
@@ -52,7 +53,7 @@ void CTimeSliderDialog::OnTimer(UINT_PTR nIDEvent)
i_TimeSlider=Slider->GetPos();
if(GetHookStatus(NULL)!=DXW_RUNNING) {
Slider->SetPos(0);
- Text->SetWindowTextA("idle");
+ Text->SetWindowTextA(IdleString);
return;
}
if(i_TimeSlider==iLastPos){
diff --git a/host/dxwnd.ini b/host/dxwnd.ini
new file mode 100644
index 0000000..3608fe7
--- /dev/null
+++ b/host/dxwnd.ini
@@ -0,0 +1,5 @@
+[window]
+posx=1213
+posy=261
+sizx=320
+sizy=200
diff --git a/host/dxwndhost.aps b/host/dxwndhost.aps
index 14d47b9..df724c3 100644
Binary files a/host/dxwndhost.aps and b/host/dxwndhost.aps differ
diff --git a/host/dxwndhost.cpp b/host/dxwndhost.cpp
index 03d0c0b..0cf927b 100644
--- a/host/dxwndhost.cpp
+++ b/host/dxwndhost.cpp
@@ -45,6 +45,9 @@ class CNewCommandLineInfo : public CCommandLineInfo
void ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast);
};
+BOOL LangSelected=FALSE;
+char LangString[20+1] = {0};
+
void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
{
if(bFlag) {
@@ -66,8 +69,12 @@ void CNewCommandLineInfo::ParseParam(LPCTSTR lpszParam, BOOL bFlag, BOOL bLast)
CString Lang;
Lang = sParam.MakeLower().Right(2);
ResLib=LoadLibrary("Resources_"+Lang+".dll");
- if(ResLib) AfxSetResourceHandle(ResLib);
+ if(ResLib) {
+ AfxSetResourceHandle(ResLib);
+ LangSelected=TRUE;
+ }
else MessageBoxEx(NULL, "Missing language \""+Lang+"\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
+ //strcpy(LangString, sParam.MakeLower().Mid(5));
return;
}
if (sParam.Left(2).MakeLower() == "c:"){
@@ -124,6 +131,50 @@ BOOL CDxwndhostApp::InitInstance()
CNewCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
+ if(!LangSelected){
+ LANGID LangId;
+ char LangString[20+1];
+ char InitPath[MAX_PATH];
+ GetCurrentDirectory(MAX_PATH, InitPath);
+ strcat_s(InitPath, sizeof(InitPath), "\\dxwnd.ini");
+ GetPrivateProfileString("window", "lang", "", LangString, 20+1, InitPath);
+ if(!strcmp(LangString, "default") || !strlen(LangString)){ // if no specification, or lang=default
+ // do nothing
+ }
+ if(!strcmp(LangString, "automatic")){ // lang=automatic
+ HMODULE ResLib;
+ LangId=GetUserDefaultUILanguage();
+ // other codes to be implemented:
+ // 409 (2-9): english (default)
+ // 411 (2-11): japanese
+ switch(LangId & 0x1FF){
+ case 0x04: // chinese family
+ ResLib=LoadLibrary("Resources_CN.dll");
+ if(ResLib) AfxSetResourceHandle(ResLib);
+ else MessageBoxEx(NULL, "Missing language \"CN\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
+ break;
+ case 0x10: // 410 - italian, 810 - switzerland italian
+ ResLib=LoadLibrary("Resources_IT.dll");
+ if(ResLib) AfxSetResourceHandle(ResLib);
+ else MessageBoxEx(NULL, "Missing language \"CN\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
+ break;
+ default:
+ //char sBuf[81];
+ //sprintf(sBuf, "Got Lang=%x(%x-%x)", LangId, LangId>>9, (LangId & 0x1FF));
+ //MessageBox(NULL, sBuf, "LangId", MB_OK);
+ break;
+ }
+ }
+ if(strcmp(LangString, "automatic") && strcmp(LangString, "default") && strlen(LangString)) { // lang=something different from both automatic and default
+ HMODULE ResLib;
+ CString Lang;
+ Lang.SetString(LangString);
+ ResLib=LoadLibrary("Resources_"+Lang+".dll");
+ if(ResLib) AfxSetResourceHandle(ResLib);
+ else MessageBoxEx(NULL, "Missing language \""+Lang+"\"\nUsing default language \"en\"", "Warning", MB_OK, NULL);
+ }
+ }
+
// Dispatch commands specified on the command line.
if (!ProcessShellCommand(cmdInfo))
return FALSE;
diff --git a/host/dxwndhost.h b/host/dxwndhost.h
index 3f4660c..c948818 100644
--- a/host/dxwndhost.h
+++ b/host/dxwndhost.h
@@ -14,6 +14,9 @@
#include "resource.h" // Main symbols
+extern int MessageBoxLang(UINT, UINT, UINT);
+extern int MessageBoxLangArg(UINT, UINT, UINT, ...);
+
// DxWnd host app private data
// fields here are associated to TARGETMAP records, but need not to be passed
// to the dxwnd hook callback, so they are left in a separate array to save
diff --git a/host/dxwndhost.rc b/host/dxwndhost.rc
index a50f32c..767a7b4 100644
Binary files a/host/dxwndhost.rc and b/host/dxwndhost.rc differ
diff --git a/host/dxwndhost.vs2008.sln b/host/dxwndhost.vs2008.sln
index 804a3d2..5bf4fb1 100644
--- a/host/dxwndhost.vs2008.sln
+++ b/host/dxwndhost.vs2008.sln
@@ -3,10 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 10.00
# Visual Studio 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwndhost", "dxwndhost.vs2008.vcproj", "{FD0B0234-8EC5-43C0-A384-1B881DD3D925}"
EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Resources_Ch", "..\locale\ch\Resources_Ch.vcproj", "{F8D07BBB-A04B-4C0C-8AF8-7F839A152456}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dxwnd", "..\dll\dxwnd.vs2008.vcproj", "{579E7FE7-2745-4100-A802-23511711FCDE}"
-EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
@@ -17,14 +13,6 @@ Global
{FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Debug|Win32.Build.0 = Debug|Win32
{FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.ActiveCfg = Release|Win32
{FD0B0234-8EC5-43C0-A384-1B881DD3D925}.Release|Win32.Build.0 = Release|Win32
- {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.ActiveCfg = Debug|Win32
- {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.Build.0 = Debug|Win32
- {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.ActiveCfg = Release|Win32
- {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.Build.0 = Release|Win32
- {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.ActiveCfg = Debug|Win32
- {579E7FE7-2745-4100-A802-23511711FCDE}.Debug|Win32.Build.0 = Debug|Win32
- {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.ActiveCfg = Release|Win32
- {579E7FE7-2745-4100-A802-23511711FCDE}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/host/dxwndhost.vs2008.suo b/host/dxwndhost.vs2008.suo
index 2e19ae5..2a7b5f6 100644
Binary files a/host/dxwndhost.vs2008.suo and b/host/dxwndhost.vs2008.suo differ
diff --git a/locale/cn/Release/BuildLog.htm b/locale/cn/Release/BuildLog.htm
deleted file mode 100644
index 6cff08a..0000000
Binary files a/locale/cn/Release/BuildLog.htm and /dev/null differ
diff --git a/locale/cn/Release/Resources_CN.res b/locale/cn/Release/Resources_CN.res
deleted file mode 100644
index e2f8457..0000000
Binary files a/locale/cn/Release/Resources_CN.res and /dev/null differ
diff --git a/locale/cn/Release/mt.dep b/locale/cn/Release/mt.dep
deleted file mode 100644
index a52fe20..0000000
--- a/locale/cn/Release/mt.dep
+++ /dev/null
@@ -1 +0,0 @@
-Manifest resource last updated at 17:52:51.01 on 22/06/2014
diff --git a/locale/cn/Resources_Cn.aps b/locale/cn/Resources_Cn.aps
deleted file mode 100644
index d995815..0000000
Binary files a/locale/cn/Resources_Cn.aps and /dev/null differ
diff --git a/locale/cn/Resources_Cn.ncb b/locale/cn/Resources_Cn.ncb
index eadc44b..93f1bff 100644
Binary files a/locale/cn/Resources_Cn.ncb and b/locale/cn/Resources_Cn.ncb differ
diff --git a/locale/cn/Resources_Cn.rc b/locale/cn/Resources_Cn.rc
index ba7a392..b3accc8 100644
Binary files a/locale/cn/Resources_Cn.rc and b/locale/cn/Resources_Cn.rc differ
diff --git a/locale/cn/Resources_Cn.suo b/locale/cn/Resources_Cn.suo
index d8a3d33..7f42a10 100644
Binary files a/locale/cn/Resources_Cn.suo and b/locale/cn/Resources_Cn.suo differ
diff --git a/locale/en/Resources_Ch.suo b/locale/en/Resources_Ch.suo
new file mode 100644
index 0000000..41b9a01
Binary files /dev/null and b/locale/en/Resources_Ch.suo differ
diff --git a/locale/en/Resources_EN.rc b/locale/en/Resources_EN.rc
new file mode 100644
index 0000000..767a7b4
Binary files /dev/null and b/locale/en/Resources_EN.rc differ
diff --git a/release/Resources_CN.pdb b/locale/en/Resources_En.ncb
similarity index 54%
rename from release/Resources_CN.pdb
rename to locale/en/Resources_En.ncb
index c9a4905..048a0c9 100644
Binary files a/release/Resources_CN.pdb and b/locale/en/Resources_En.ncb differ
diff --git a/locale/en/Resources_En.sln b/locale/en/Resources_En.sln
new file mode 100644
index 0000000..ad7432b
--- /dev/null
+++ b/locale/en/Resources_En.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Resources_EN", "Resources_En.vcproj", "{F8D07BBB-A04B-4C0C-8AF8-7F839A152456}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.Build.0 = Debug|Win32
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.ActiveCfg = Release|Win32
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/locale/en/Resources_En.suo b/locale/en/Resources_En.suo
new file mode 100644
index 0000000..f764e99
Binary files /dev/null and b/locale/en/Resources_En.suo differ
diff --git a/locale/en/Resources_En.vcproj b/locale/en/Resources_En.vcproj
new file mode 100644
index 0000000..dad9541
--- /dev/null
+++ b/locale/en/Resources_En.vcproj
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/locale/it/Resources_Ch.suo b/locale/it/Resources_Ch.suo
new file mode 100644
index 0000000..41b9a01
Binary files /dev/null and b/locale/it/Resources_Ch.suo differ
diff --git a/locale/it/Resources_En.suo b/locale/it/Resources_En.suo
new file mode 100644
index 0000000..7683bd2
Binary files /dev/null and b/locale/it/Resources_En.suo differ
diff --git a/locale/it/Resources_IT.rc b/locale/it/Resources_IT.rc
new file mode 100644
index 0000000..7e52c08
Binary files /dev/null and b/locale/it/Resources_IT.rc differ
diff --git a/locale/it/Resources_It.ncb b/locale/it/Resources_It.ncb
new file mode 100644
index 0000000..1fcbde9
Binary files /dev/null and b/locale/it/Resources_It.ncb differ
diff --git a/locale/it/Resources_It.sln b/locale/it/Resources_It.sln
new file mode 100644
index 0000000..67750a4
--- /dev/null
+++ b/locale/it/Resources_It.sln
@@ -0,0 +1,20 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Resources_IT", "Resources_It.vcproj", "{F8D07BBB-A04B-4C0C-8AF8-7F839A152456}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Win32 = Debug|Win32
+ Release|Win32 = Release|Win32
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.ActiveCfg = Debug|Win32
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Debug|Win32.Build.0 = Debug|Win32
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.ActiveCfg = Release|Win32
+ {F8D07BBB-A04B-4C0C-8AF8-7F839A152456}.Release|Win32.Build.0 = Release|Win32
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/locale/it/Resources_It.suo b/locale/it/Resources_It.suo
new file mode 100644
index 0000000..c1a0d39
Binary files /dev/null and b/locale/it/Resources_It.suo differ
diff --git a/locale/it/Resources_It.vcproj b/locale/it/Resources_It.vcproj
new file mode 100644
index 0000000..4562a16
--- /dev/null
+++ b/locale/it/Resources_It.vcproj
@@ -0,0 +1,259 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/release/release_82.rar b/release/release_82.rar
new file mode 100644
index 0000000..32e4fb4
Binary files /dev/null and b/release/release_82.rar differ