changeset 2047:8622640ffa8f

Merge
author Ritor1
date Tue, 26 Nov 2013 18:45:08 +0600
parents da35dc35d635 (current diff) 2ccf638342d6 (diff)
children 73ee77d482f8
files lib/swig/swigwin-2.0.11/UIControlModule.swig
diffstat 10 files changed, 1654 insertions(+), 1470 deletions(-) [+]
line wrap: on
line diff
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj	Tue Nov 26 18:45:03 2013 +0600
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj	Tue Nov 26 18:45:08 2013 +0600
@@ -44,6 +44,7 @@
     <IntDir>$(Configuration)\</IntDir>
     <OutDir>$(WoMM_MM7_INSTALL_DIR)\</OutDir>
     <GenerateManifest>false</GenerateManifest>
+    <IncludePath>$(SolutionDir)../../;$(IncludePath)</IncludePath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <LinkIncremental>false</LinkIncremental>
@@ -63,6 +64,9 @@
       <AdditionalDependencies>..\..\lib\legacy_dx\lib\ddraw.lib;..\..\lib\legacy_dx\lib\dxguid.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
     </Link>
+    <PostBuildEvent>
+      <Command>XCOPY "$(SolutionDir)../../Scripts" "$(OutDir)data/scripts/lua/core" /E /I /F /R /Y</Command>
+    </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
     <ClCompile>
@@ -142,8 +146,6 @@
     <ClCompile Include="..\..\lib\lua\lua-5.2.2\lundump.c" />
     <ClCompile Include="..\..\lib\lua\lua-5.2.2\lvm.c" />
     <ClCompile Include="..\..\lib\lua\lua-5.2.2\lzio.c" />
-    <ClCompile Include="..\..\lib\swig\swigwin-2.0.11\TestModule_wrap.cxx" />
-    <ClCompile Include="..\..\lib\swig\swigwin-2.0.11\UIControlModule_wrap.cxx" />
     <ClCompile Include="..\..\lib\zlib\adler32.c" />
     <ClCompile Include="..\..\lib\zlib\compress.c" />
     <ClCompile Include="..\..\lib\zlib\crc32.c" />
@@ -171,6 +173,7 @@
     <ClCompile Include="..\..\mm7_data.cpp" />
     <ClCompile Include="..\..\Monsters.cpp" />
     <ClCompile Include="..\..\Mouse.cpp" />
+    <ClCompile Include="..\..\NewUI\Core\UIControlModule_wrap.cxx" />
     <ClCompile Include="..\..\NewUI\MainMenu.cpp" />
     <ClCompile Include="..\..\NPC.cpp" />
     <ClCompile Include="..\..\ObjectList.cpp" />
@@ -320,7 +323,6 @@
     <ClInclude Include="..\..\LOD.h" />
     <ClInclude Include="..\..\Log.h" />
     <ClInclude Include="..\..\MapInfo.h" />
-    <ClInclude Include="..\..\Math.h" />
     <ClInclude Include="..\..\MM7.h" />
     <ClInclude Include="..\..\mm7_data.h" />
     <ClInclude Include="..\..\Monsters.h" />
@@ -333,6 +335,7 @@
     <ClInclude Include="..\..\OSAPI.h" />
     <ClInclude Include="..\..\OSInfo.h" />
     <ClInclude Include="..\..\OSWindow.h" />
+    <ClInclude Include="..\..\OurMath.h" />
     <ClInclude Include="..\..\Outdoor.h" />
     <ClInclude Include="..\..\Outdoor_stuff.h" />
     <ClInclude Include="..\..\Overlays.h" />
@@ -375,6 +378,13 @@
   </ItemGroup>
   <ItemGroup>
     <None Include="..\..\lib\legacy_dx\d3dvec.inl" />
+    <None Include="..\..\lib\swig.bat" />
+    <CustomBuild Include="..\..\NewUI\Core\UIControlModule.swig">
+      <FileType>Document</FileType>
+      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">call "../../lib/swig" "%(FileName)" %(RelativeDir) "%(FileName)%(Extension)" "%(FullPath)" "$(SolutionDir)" %(Filename)_wrap.cxx</Command>
+      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename)_wrap.cxx</Outputs>
+    </CustomBuild>
+    <None Include="..\..\lib\swig\swigwin-2.0.11\UIControlModule.swig" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters	Tue Nov 26 18:45:03 2013 +0600
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters	Tue Nov 26 18:45:08 2013 +0600
@@ -31,81 +31,15 @@
     <ClInclude Include="..\..\Indoor_stuff.h" />
     <ClInclude Include="..\..\Items.h" />
     <ClInclude Include="..\..\Keyboard.h" />
-    <ClInclude Include="..\..\Level\Decoration.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3d.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3dcaps.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3drm.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3drmdef.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3drmobj.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3drmwin.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\d3dtypes.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\ddraw.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dinput.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dinputd.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmdls.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmerror.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmksctrl.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmplugin.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmusbuff.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmusicc.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmusicf.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmusici.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dmusics.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dsconf.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dsound.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\dvoice.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\multimon.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\rmxfguid.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\rmxftmpl.h" />
-    <ClInclude Include="..\..\lib\legacy_dx\strsafe.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lapi.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lauxlib.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lcode.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lctype.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ldebug.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ldo.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lfunc.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lgc.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\llex.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\llimits.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lmem.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lobject.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lopcodes.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lparser.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lstate.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lstring.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ltable.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ltm.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lua.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\luaconf.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lualib.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lundump.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lvm.h" />
-    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lzio.h" />
-    <ClInclude Include="..\..\lib\lua\lua.h" />
-    <ClInclude Include="..\..\lib\zlib\deflate.h" />
-    <ClInclude Include="..\..\lib\zlib\infblock.h" />
-    <ClInclude Include="..\..\lib\zlib\infcodes.h" />
-    <ClInclude Include="..\..\lib\zlib\inffast.h" />
-    <ClInclude Include="..\..\lib\zlib\inffixed.h" />
-    <ClInclude Include="..\..\lib\zlib\inftrees.h" />
-    <ClInclude Include="..\..\lib\zlib\infutil.h" />
-    <ClInclude Include="..\..\lib\zlib\trees.h" />
-    <ClInclude Include="..\..\lib\zlib\zconf.h" />
-    <ClInclude Include="..\..\lib\zlib\zlib.h" />
-    <ClInclude Include="..\..\lib\zlib\zutil.h" />
     <ClInclude Include="..\..\LightmapBuilder.h" />
     <ClInclude Include="..\..\Lights.h" />
     <ClInclude Include="..\..\LOD.h" />
     <ClInclude Include="..\..\Log.h" />
     <ClInclude Include="..\..\MapInfo.h" />
-    <ClInclude Include="..\..\Math.h" />
     <ClInclude Include="..\..\MM7.h" />
     <ClInclude Include="..\..\mm7_data.h" />
     <ClInclude Include="..\..\Monsters.h" />
     <ClInclude Include="..\..\Mouse.h" />
-    <ClInclude Include="..\..\NewUI\Core\UIControl.h" />
-    <ClInclude Include="..\..\NewUI\MainMenu.h" />
     <ClInclude Include="..\..\NPC.h" />
     <ClInclude Include="..\..\NZIArray.h" />
     <ClInclude Include="..\..\ObjectList.h" />
@@ -143,14 +77,214 @@
     <ClInclude Include="..\..\TileFrameTable.h" />
     <ClInclude Include="..\..\Time.h" />
     <ClInclude Include="..\..\TurnEngine.h" />
-    <ClInclude Include="..\..\UI\UIBooks.h" />
-    <ClInclude Include="..\..\UI\UIHouses.h" />
     <ClInclude Include="..\..\VectorTypes.h" />
     <ClInclude Include="..\..\VideoPlayer.h" />
     <ClInclude Include="..\..\Viewport.h" />
     <ClInclude Include="..\..\Vis.h" />
     <ClInclude Include="..\..\Weather.h" />
     <ClInclude Include="..\..\TestClass.h" />
+    <ClInclude Include="..\..\NewUI\MainMenu.h">
+      <Filter>NewUI</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\NewUI\Core\UIControl.h">
+      <Filter>NewUI\Core</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\Level\Decoration.h">
+      <Filter>Level</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3d.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\ddraw.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3dcaps.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3drm.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3drmdef.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3drmobj.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3drmwin.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\d3dtypes.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dinput.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dvoice.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dinputd.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmdls.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmerror.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmksctrl.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmplugin.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmusbuff.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmusicc.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmusicf.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmusici.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dmusics.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dsconf.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\dsound.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\multimon.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\rmxfguid.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\rmxftmpl.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\legacy_dx\strsafe.h">
+      <Filter>lib\legacy_dx</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua.h">
+      <Filter>lib\lua</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lgc.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lapi.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lauxlib.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lcode.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lctype.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ldebug.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ldo.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lfunc.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lobject.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\llex.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\llimits.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lmem.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lzio.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lopcodes.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lparser.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lstate.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lstring.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ltable.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\ltm.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lua.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\luaconf.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lualib.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lundump.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\lua\lua-5.2.2\lvm.h">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\OurMath.h" />
+    <ClInclude Include="..\..\lib\zlib\deflate.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\infutil.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\infblock.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\infcodes.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\inffast.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\inffixed.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\inftrees.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\trees.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\zconf.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\zlib.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\lib\zlib\zutil.h">
+      <Filter>lib\zlib</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\UI\UIBooks.h">
+      <Filter>UI</Filter>
+    </ClInclude>
+    <ClInclude Include="..\..\UI\UIHouses.h">
+      <Filter>UI</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Filter Include="lib">
@@ -180,12 +314,26 @@
     <Filter Include="lib\swig">
       <UniqueIdentifier>{2b5db0d5-d6c8-4aad-b295-ac2b5df51fb2}</UniqueIdentifier>
     </Filter>
-    <Filter Include="lib\swig\swiwin-2.0.11">
+    <Filter Include="lib\lua">
+      <UniqueIdentifier>{247dd8f2-a9fc-4e53-bc8c-d8bbe255bfe4}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="lib\lua\lua-5.2.2">
+      <UniqueIdentifier>{410b9d18-77b5-461d-8b23-ba841039152e}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="lib\swig\swigwin-2.0.11">
       <UniqueIdentifier>{cb1041ae-addb-49d8-9ec1-ffe52d29ae64}</UniqueIdentifier>
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <None Include="..\..\lib\legacy_dx\d3dvec.inl" />
+    <None Include="..\..\lib\legacy_dx\d3dvec.inl">
+      <Filter>lib\legacy_dx</Filter>
+    </None>
+    <None Include="..\..\lib\swig.bat">
+      <Filter>lib</Filter>
+    </None>
+    <None Include="..\..\lib\swig\swigwin-2.0.11\UIControlModule.swig">
+      <Filter>lib\swig\swigwin-2.0.11</Filter>
+    </None>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="..\..\Actor.cpp" />
@@ -214,53 +362,6 @@
     <ClCompile Include="..\..\IndoorCameraD3D.cpp" />
     <ClCompile Include="..\..\Items.cpp" />
     <ClCompile Include="..\..\Keyboard.cpp" />
-    <ClCompile Include="..\..\Level\Decoration.cpp" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lapi.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lauxlib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lbaselib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lbitlib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lcode.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lcorolib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lctype.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldblib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldebug.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldo.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldump.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lfunc.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lgc.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\linit.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\liolib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\llex.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lmathlib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lmem.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\loadlib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lobject.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lopcodes.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\loslib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lparser.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lstate.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lstring.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lstrlib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ltable.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ltablib.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ltm.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lua.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lundump.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lvm.c" />
-    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lzio.c" />
-    <ClCompile Include="..\..\lib\zlib\adler32.c" />
-    <ClCompile Include="..\..\lib\zlib\compress.c" />
-    <ClCompile Include="..\..\lib\zlib\crc32.c" />
-    <ClCompile Include="..\..\lib\zlib\deflate.c" />
-    <ClCompile Include="..\..\lib\zlib\infblock.c" />
-    <ClCompile Include="..\..\lib\zlib\infcodes.c" />
-    <ClCompile Include="..\..\lib\zlib\inffast.c" />
-    <ClCompile Include="..\..\lib\zlib\inflate.c" />
-    <ClCompile Include="..\..\lib\zlib\inftrees.c" />
-    <ClCompile Include="..\..\lib\zlib\infutil.c" />
-    <ClCompile Include="..\..\lib\zlib\trees.c" />
-    <ClCompile Include="..\..\lib\zlib\uncompr.c" />
-    <ClCompile Include="..\..\lib\zlib\zutil.c" />
     <ClCompile Include="..\..\LightmapBuilder.cpp" />
     <ClCompile Include="..\..\LightsStack.cpp" />
     <ClCompile Include="..\..\LOD.cpp" />
@@ -275,7 +376,6 @@
     <ClCompile Include="..\..\mm7_data.cpp" />
     <ClCompile Include="..\..\Monsters.cpp" />
     <ClCompile Include="..\..\Mouse.cpp" />
-    <ClCompile Include="..\..\NewUI\MainMenu.cpp" />
     <ClCompile Include="..\..\NPC.cpp" />
     <ClCompile Include="..\..\ObjectList.cpp" />
     <ClCompile Include="..\..\OSAPI.cpp" />
@@ -301,34 +401,214 @@
     <ClCompile Include="..\..\TileTable.cpp" />
     <ClCompile Include="..\..\Time.cpp" />
     <ClCompile Include="..\..\TurnEngine.cpp" />
-    <ClCompile Include="..\..\UI\Books\UIMapBook.cpp" />
-    <ClCompile Include="..\..\UI\Books\UINotesBooks.cpp" />
-    <ClCompile Include="..\..\UI\Books\UISpellBook.cpp" />
-    <ClCompile Include="..\..\UI\UIBooks.cpp" />
-    <ClCompile Include="..\..\UI\UICharacter.cpp" />
-    <ClCompile Include="..\..\UI\UiGame.cpp" />
-    <ClCompile Include="..\..\UI\UIGuilds.cpp" />
-    <ClCompile Include="..\..\UI\UIHouses.cpp" />
-    <ClCompile Include="..\..\UI\UIMainMenu.cpp" />
-    <ClCompile Include="..\..\UI\UIMsgProc.cpp" />
-    <ClCompile Include="..\..\UI\UIOptions.cpp" />
-    <ClCompile Include="..\..\UI\UIPartyCreation.cpp" />
-    <ClCompile Include="..\..\UI\UIPopup.cpp" />
-    <ClCompile Include="..\..\UI\UIRest.cpp" />
-    <ClCompile Include="..\..\UI\UISaveLoad.cpp" />
-    <ClCompile Include="..\..\UI\UIShops.cpp" />
-    <ClCompile Include="..\..\UI\UITransition.cpp" />
     <ClCompile Include="..\..\VectorTypes.cpp" />
     <ClCompile Include="..\..\VideoPlayer.cpp" />
     <ClCompile Include="..\..\Viewport.cpp" />
     <ClCompile Include="..\..\Vis.cpp" />
     <ClCompile Include="..\..\Weather.cpp" />
     <ClCompile Include="..\..\_deleted.cpp" />
-    <ClCompile Include="..\..\lib\swig\swigwin-2.0.11\UIControlModule_wrap.cxx">
-      <Filter>lib\swig\swiwin-2.0.11</Filter>
+    <ClCompile Include="..\..\NewUI\Core\UIControlModule_wrap.cxx">
+      <Filter>NewUI\Core</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\NewUI\MainMenu.cpp">
+      <Filter>NewUI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\Level\Decoration.cpp">
+      <Filter>Level</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lapi.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lauxlib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lbaselib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lbitlib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lcode.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lcorolib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lctype.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldblib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldebug.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldo.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ldump.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lfunc.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lgc.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\linit.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\liolib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\llex.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lmathlib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lmem.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\loadlib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lobject.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lopcodes.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\loslib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lparser.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lstate.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lstring.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lstrlib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ltable.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ltablib.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\ltm.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lua.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
     </ClCompile>
-    <ClCompile Include="..\..\lib\swig\swigwin-2.0.11\TestModule_wrap.cxx">
-      <Filter>lib\swig\swiwin-2.0.11</Filter>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lundump.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lvm.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\lua\lua-5.2.2\lzio.c">
+      <Filter>lib\lua\lua-5.2.2</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\adler32.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\compress.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\crc32.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\deflate.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\infblock.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\infcodes.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\inffast.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\inflate.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\inftrees.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\infutil.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\trees.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\uncompr.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\lib\zlib\zutil.c">
+      <Filter>lib\zlib</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIBooks.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UITransition.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UICharacter.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UiGame.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIGuilds.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIHouses.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIMainMenu.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIMsgProc.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIOptions.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIPartyCreation.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIPopup.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIRest.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UISaveLoad.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\UIShops.cpp">
+      <Filter>UI</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\Books\UIMapBook.cpp">
+      <Filter>UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\Books\UISpellBook.cpp">
+      <Filter>UI\Books</Filter>
+    </ClCompile>
+    <ClCompile Include="..\..\UI\Books\UINotesBooks.cpp">
+      <Filter>UI\Books</Filter>
     </ClCompile>
   </ItemGroup>
+  <ItemGroup>
+    <CustomBuild Include="..\..\NewUI\Core\UIControlModule.swig">
+      <Filter>NewUI\Core</Filter>
+    </CustomBuild>
+  </ItemGroup>
 </Project>
\ No newline at end of file
--- a/Outdoor.cpp	Tue Nov 26 18:45:03 2013 +0600
+++ b/Outdoor.cpp	Tue Nov 26 18:45:08 2013 +0600
@@ -25,6 +25,7 @@
 #include "Viewport.h"
 #include "Events.h"
 #include "ParticleEngine.h"
+#include "TurnEngine.h"
 
 #include "mm7_data.h"
 #include "MM7.h"
@@ -3648,3 +3649,1211 @@
   //sr_6BE060[1] = 1;
   //RotationToInts();
 }
+//----- (00473893) --------------------------------------------------------
+void ODM_ProcessPartyActions()
+{
+  int v1; // edi@1
+  int v2; // ebx@1
+  int v3; // eax@14
+  int v6; // esi@45
+  ODMFace *face; // ecx@45
+  signed int v33; // eax@143
+  int v34; // esi@143
+  int v35; // esi@147
+  int v36; // eax@155
+  signed int v37; // esi@159
+  signed int v38; // eax@159
+  signed int i; // esi@159
+  int v40; // esi@162
+  bool v42; // eax@180
+  signed int v43; // ecx@184
+  signed int v44; // edx@184
+  int v45; // ecx@200
+  BSPModel *pModel; // eax@203
+  ODMFace *pODMFace; // esi@203
+  int v48; // eax@203
+  char v49; // zf@203
+  char v50; // sf@203
+  unsigned __int8 v51; // of@203
+  int v52; // eax@203
+  BSPModel *v54; // eax@215
+  int v55; // eax@217
+  signed int v56; // ebx@228
+  int v57; // eax@228
+  BSPModel *v58; // eax@228
+  unsigned __int64 v59; // qax@228
+  BSPModel *v60; // eax@228
+  unsigned __int64 v61; // qax@228
+  int v62; // eax@241
+  unsigned int v65; // ebx@263
+  unsigned int v66; // esi@263
+  int v67; // eax@263
+  signed int v68; // ecx@263
+  int v69; // eax@263
+  int v70; // ebx@271
+  int v71; // esi@271
+  int v72; // edi@271
+  int v73; // eax@271
+  unsigned int v76; // edi@293
+  bool v77; // edx@297
+  bool v78; // ecx@303
+  int v79; // ecx@314
+  __int16 v80; // dx@317
+  int v81; // ebx@318
+  int v82; // ecx@318
+  int pTerrainHeight; // eax@321
+  int v86; // [sp-20h] [bp-B4h]@246
+  int v87; // [sp-20h] [bp-B4h]@248
+  signed int v88; // [sp-1Ch] [bp-B0h]@246
+  unsigned int v89; // [sp-18h] [bp-ACh]@246
+  signed int v90; // [sp-14h] [bp-A8h]@246
+  signed int v91; // [sp-10h] [bp-A4h]@246
+  int v92; // [sp-Ch] [bp-A0h]@246
+  unsigned int v94; // [sp-8h] [bp-9Ch]@246
+  int v96; // [sp-4h] [bp-98h]@246
+  int v97; // [sp+Ch] [bp-88h]@180
+  Vec3_int_ v98;
+  bool high_fall_flag; // [sp+1Ch] [bp-78h]@33
+  int v102; // [sp+20h] [bp-74h]@1
+  int v103; // [sp+24h] [bp-70h]@1
+  bool bFeatherFall; // [sp+28h] [bp-6Ch]@4
+  int v105; // [sp+2Ch] [bp-68h]@24
+  bool bWaterWalk; // [sp+30h] [bp-64h]@1
+  int v109; // [sp+3Ch] [bp-58h]@28
+  int v110; // [sp+40h] [bp-54h]@180
+  int v111; // [sp+44h] [bp-50h]@14
+  bool hovering; // [sp+48h] [bp-4Ch]@1
+  int v113; // [sp+4Ch] [bp-48h]@1
+  bool party_running_flag; // [sp+50h] [bp-44h]@1
+  int _walk_speed; // [sp+54h] [bp-40h]@48
+  int pX; // [sp+58h] [bp-3Ch]@1
+  int pY; // [sp+5Ch] [bp-38h]@1
+  int v118; // [sp+60h] [bp-34h]@1
+  int _angle_x; // [sp+68h] [bp-2Ch]@48
+  unsigned int v122; // [sp+70h] [bp-24h]@180
+  int pZ; // [sp+74h] [bp-20h]@1
+  bool party_walking_flag; // [sp+78h] [bp-1Ch]@1
+  int _angle_y; // [sp+7Ch] [bp-18h]@48
+  int v126; // [sp+80h] [bp-14h]@48
+  int v128; // [sp+88h] [bp-Ch]@1
+  int v129; // [sp+8Ch] [bp-8h]@92
+
+  v1 = 0;
+  v103 = 0;
+  v2 = 0;
+  //*(float *)&v128 = 0.0;
+  v128 = 0;
+  v129 = 0;
+  pX = pParty->vPosition.x;
+  pY = pParty->vPosition.y;
+  pZ = pParty->vPosition.z;
+  v113 = pParty->field_6F0;
+  hovering = false;
+  bool partyAtHighSlope = IsTerrainSlopeTooHigh(pParty->vPosition.x, pParty->vPosition.y);
+  party_running_flag = false;
+  party_walking_flag = false;
+  v102 = 0;
+  pModel = 0;
+  bWaterWalk = false;
+
+  if (!pParty->FeatherFallActive())//Проверка падение пера
+  {
+    bFeatherFall = false;
+    for (int i = 0; i < 4; ++i)
+      if (pParty->pPlayers[i].WearsItemAnyWhere(ITEM_ARTIFACT_LADYS_ESCORT))  // seems like flying boots
+      {
+        bFeatherFall = true;
+        break;
+      }
+  }
+  else
+    bFeatherFall = true;
+
+  pParty->uFlags &= ~PARTY_FLAGS_1_STANDING_ON_WATER;
+  if (pParty->WaterWalkActive())//Проверка хождения по воде
+  {
+    //LOBYTE(pParty->uFlags) &= 0x7Fu;
+    bWaterWalk = true;
+    *(short *)&stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 119] |= 1u;
+    if (!(pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags & 1) &&
+          pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uCaster - 1].sMana <= 0 )
+      bWaterWalk = false;
+  }
+
+  int bmodel_standing_on_pid;
+  int is_on_water = false;
+  v3 = ODM_GetFloorLevel(pX, pY, pZ, pParty->uPartyHeight, &is_on_water, &bmodel_standing_on_pid, bWaterWalk);
+  int is_not_on_bmodel = bmodel_standing_on_pid == 0;
+
+  v111 = v3;
+  if ( bFeatherFall )
+    pParty->uFallStartY = v3;
+  else
+    v3 = pParty->uFallStartY;
+  if ( v3 - pZ > 512 && !bFeatherFall && pZ <= v111 + 1 )
+  {
+    if (pParty->uFlags & PARTY_FLAGS_1_LANDING)
+    {
+      pParty->uFlags &= ~PARTY_FLAGS_1_LANDING;
+    }
+    else for (int i = 0; i < 4; ++i)     // receive falling damage
+    {
+      if ( !pParty->pPlayers[i].HasEnchantedItemEquipped(72) && !pParty->pPlayers[i].WearsItem(ITEM_ARTIFACT_HERMES_SANDALS, EQUIP_BOOTS) )
+      {
+        pParty->pPlayers[i].ReceiveDamage(
+            (signed int)((pParty->uFallStartY - pZ) * (unsigned __int64)(pParty->pPlayers[i].GetMaxHealth() / 10)) / 256, DMGT_PHISYCAL);
+        v105 = 20 - pParty->pPlayers[i].GetParameterBonus(pParty->pPlayers[i].GetActualEndurance());
+        pParty->pPlayers[i].SetRecoveryTime((signed __int64)((double)v105 * flt_6BE3A4_debug_recmod1 * 2.133333333333333));
+      }
+      //}
+      //while ( (signed int)v4 <= (signed int)&pPlayers[4] );
+    }
+  }
+  v109 = -1;
+  if ( pParty->bFlying )
+    v109 = GetCeilingHeight(pX, pY, pZ + pParty->uPartyHeight, (int)&v102);
+  //v107 = bmodel_standing_on_pid == 0;
+  v105 = v111 + 1;
+  if ( pZ <= v111 + 1 )
+  {
+    v109 = -1;
+    pParty->bFlying = false;
+  }
+  else
+    hovering = true;
+  high_fall_flag = pZ - v111 <= 32;
+
+  if ( bWalkSound && pParty->walk_sound_timer)//timer update
+  {
+    if (pParty->walk_sound_timer >= pEventTimer->uTimeElapsed)
+      pParty->walk_sound_timer -= pEventTimer->uTimeElapsed;
+    else
+      pParty->walk_sound_timer = 0;
+  }
+
+  if (!bUnderwater && pParty->pPartyBuffs[PARTY_BUFF_FLY].uExpireTime <= 0)
+    pParty->bFlying = false;
+  if (!hovering)
+  {
+    if ( pParty->floor_face_pid != PID(OBJECT_BModel, bmodel_standing_on_pid) )
+    {
+      if (bmodel_standing_on_pid)
+      {
+        if ( (bmodel_standing_on_pid >> 6) < pOutdoor->uNumBModels )
+        {
+          face = pOutdoor->pBModels[bmodel_standing_on_pid >> 6].pFaces;
+          v6 = bmodel_standing_on_pid & 0x3F;
+          /*if ( *(char *)(v7->pFacePlane.vNormal.x + 308 * v6 + 31) & 4 )
+          {
+            pParty->field_6F4_packedid = PID(OBJECT_BModel,v108);
+            v103 = *(short *)(v7->pFacePlane.vNormal.x + 308 * v6 + 292);
+          }*/
+		  if ( BYTE3(face[v6].uAttributes) & 4 )
+          {
+            pParty->floor_face_pid = PID(OBJECT_BModel, bmodel_standing_on_pid);
+            v103 = face[v6].sCogTriggeredID;
+          }
+        }
+      }
+    }
+    pParty->floor_face_pid = PID(OBJECT_BModel, bmodel_standing_on_pid);
+  }
+  _walk_speed = pParty->uWalkSpeed;
+  _angle_y = pParty->sRotationY;
+  _angle_x = pParty->sRotationX;
+  v126 = pEventTimer->dt_in_some_format;
+  /*v119 = (Player **)((unsigned __int64)(pEventTimer->dt_in_some_format
+                                      * (signed __int64)((signed int)(pParty->field_20_prolly_turn_speed
+                                                                    * stru_5C6E00->uIntegerPi)
+                                                       / 180)) >> 16);*/
+  __int64 dturn = (unsigned __int64)(pEventTimer->dt_in_some_format * (signed __int64)((signed int)(pParty->y_rotation_speed * stru_5C6E00->uIntegerPi) / 180)) >> 16;
+  while (pPartyActionQueue->uNumActions)
+  {
+    switch (pPartyActionQueue->Next())
+    {
+      case PARTY_FlyUp:
+      {
+        if (!pParty->FlyActive() && !bUnderwater)
+          break;
+
+        pParty->bFlying = false;
+        if (bUnderwater ||
+            pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags & 1 ||
+            pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].sMana > 0 )
+          {
+            extern int max_flight_height;
+            if ( pParty->vPosition.z < max_flight_height || hovering )
+            {
+              pZ += 30;
+              v113 += 30;
+              pParty->bFlying = true;
+              if ( pZ > max_flight_height )
+              {
+                pZ = max_flight_height;
+                v113 = max_flight_height;
+              }
+              v1 = 0;
+              v2 = 0;
+              pParty->uFallSpeed = 0;
+              *(float *)&v128 = 0.0;
+              if ( v102 && pZ < v109 && (signed int)(pParty->uPartyHeight + pZ) >= v109 )//сверить с ида(ошибка)
+              {
+                pParty->field_6E0 = 0;
+                pParty->field_6E4 = 0;
+                pPartyActionQueue->uNumActions = 0;
+                pParty->uFlags |= PARTY_FLAGS_1_LANDING;
+                pParty->vPosition.z = v109 - pParty->uPartyHeight - 31;
+                pParty->field_6F0 = pZ;
+                pParty->bFlying = false;
+                pZ = v109 - pParty->uPartyHeight - 31;
+                v113 = pParty->field_6F0;
+              }
+              pParty->uFallSpeed = 0;
+              pModel = (BSPModel *)1;
+            }
+          }
+      }
+      break;
+
+      case PARTY_FlyDown:
+        if (pParty->FlyActive() || bUnderwater)
+        {
+          pParty->bFlying = false;
+          if ( bUnderwater
+            || pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags & 1
+            || pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].sMana > 0 )//*(int *)&pParty->pArtifactsFound[6972 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster + 10] > 0 )
+          {
+            pZ -= 30;
+            v113 -= 30;
+            pParty->uFallSpeed = 0;
+            //pParty->uFallSpeed = 0;
+            pParty->bFlying = true;
+            pModel = (BSPModel *)1;
+            if ( pZ <= v111 )
+            {
+              pParty->bFlying = false;
+              pPartyActionQueue->uNumActions = 0;
+            }
+          }
+        }
+        break;
+
+      case PARTY_TurnLeft:
+        if (uTurnSpeed)
+          _angle_y += uTurnSpeed;   //descrete turn
+        else
+          _angle_y += dturn * fTurnSpeedMultiplier;  // time-based smooth turn
+
+        _angle_y &= stru_5C6E00->uDoublePiMask;
+      break;
+
+      case PARTY_TurnRight:
+        if (uTurnSpeed)
+          _angle_y -= uTurnSpeed;
+        else
+          _angle_y -= dturn * fTurnSpeedMultiplier;
+
+        _angle_y &= stru_5C6E00->uDoublePiMask;
+      break;
+
+      case PARTY_FastTurnLeft:
+        if (uTurnSpeed)
+          _angle_y += uTurnSpeed;
+        else
+          _angle_y += 2.0f * fTurnSpeedMultiplier * (double)dturn;
+
+        _angle_y &= stru_5C6E00->uDoublePiMask;
+      break;
+
+      case PARTY_FastTurnRight:
+        if (!uTurnSpeed)
+          _angle_y -= 2.0f * fTurnSpeedMultiplier * (double)dturn;
+        else
+          _angle_y -= uTurnSpeed;
+
+        _angle_y &= stru_5C6E00->uDoublePiMask;
+      break;
+
+      case PARTY_StrafeLeft:
+      {
+        *(float *)&v128 = pParty->uWalkSpeed;
+
+        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0);
+        int dx = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+        v2 -= 3 * dx / 4;
+        
+        float cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
+        int dy = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+        v1 += 3 * dy / 4;
+
+        v128 = v1;
+        party_walking_flag = true;
+      }
+      break;
+
+      case PARTY_StrafeRight:
+      {
+        *(float *)&v128 = pParty->uWalkSpeed;
+
+        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0);
+        int dx = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+        v2 += 3 * dx / 4;
+        
+        float cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
+        int dy = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+        v1 -= 3 * dy / 4;
+
+        v128 = v1;
+        party_walking_flag = true;
+      }
+      break;
+
+      case PARTY_WalkForward:
+      {
+        *(float *)&v128 = _walk_speed;
+
+        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
+              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
+
+        int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+        int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+
+        extern bool new_speed;
+        if ( new_speed )
+        {
+          v2 += dx * 12;
+          v1 += dy * 12;
+        }
+        else
+        {
+          v2 += dx;
+          v1 += dy;
+        }
+
+        v128 = v1;
+        party_walking_flag = true;
+      }
+      break;
+
+      case PARTY_RunForward:
+      {
+        *(float *)&v128 = _walk_speed;
+
+        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
+              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
+
+        int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+        int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
+
+        if (pParty->bFlying)
+        {
+          v2 += 4 * dx;
+          v1 += 4 * dy;
+
+          v128 = v1;
+        }
+        else if (partyAtHighSlope && !bmodel_standing_on_pid)
+        {
+          v2 += dx;
+          v1 += dy;
+
+          v128 = v1;
+          party_walking_flag = true;
+        }
+        else
+        {
+          v2 += 2 * dx;
+          v1 += 2 * dy;
+          
+          v128 = v1;
+          party_running_flag = true;
+        }
+      }
+      break;
+
+
+      case PARTY_WalkBackward:
+      {
+        *(float *)&v128 = _walk_speed;
+
+        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
+              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
+
+        int dx = cos_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;
+        v2 -= dx;
+        
+        int dy = sin_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;
+        v1 -= dy;
+
+        v128 = v1;
+        party_walking_flag = true;
+      }
+      break;
+
+
+      case PARTY_RunBackward:
+      {
+        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
+              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
+
+        int dx = cos_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;        
+        int dy = sin_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;
+
+        if (pParty->bFlying)
+        {
+          v2 -= 4 * dx;
+          v1 -= 4 * dy;
+          v128 = v1;
+        }
+        else
+        {
+          v2 -= dx;
+          v1 -= dy;
+
+          v128 = v1;
+          party_walking_flag = true;
+        }
+      }
+      break;
+
+      case PARTY_CenterView:
+        _angle_x = 0;
+      break;
+
+      case PARTY_LookUp:
+        _angle_x += (signed __int64)(flt_6BE150_look_up_down_dangle * 25.0);
+        if ( _angle_x > 128 )
+          _angle_x = 128;
+        if (uActiveCharacter)
+          pPlayers[uActiveCharacter]->PlaySound(SPEECH_63, 0);
+      break;
+
+      case PARTY_LookDown:
+        _angle_x += (signed __int64)(flt_6BE150_look_up_down_dangle * -25.0);
+        if ( _angle_x < -128 )
+          _angle_x = -128;
+        if (uActiveCharacter)
+          pPlayers[uActiveCharacter]->PlaySound(SPEECH_64, 0);
+      break;
+
+      case PARTY_Jump:
+        if ( (!partyAtHighSlope || bmodel_standing_on_pid) && !hovering && pParty->field_24 && !(pParty->uFlags & 4) && !(BYTE1(pParty->uFlags) & 2) )
+        {
+          v126 = pParty->field_24 << 6;
+          hovering = true;
+          pParty->uFallSpeed = (signed __int64)((double)(pParty->field_24 << 6) * 1.5 + (double)pParty->uFallSpeed);
+        }
+      break;
+
+      case PARTY_Land:
+        if (pParty->bFlying)
+        {
+          pParty->uFlags |= PARTY_FLAGS_1_LANDING;
+          pParty->uFallSpeed = 0;
+        }
+        pParty->bFlying = false;
+        pPartyActionQueue->uNumActions = 0;
+      break;
+
+      default:
+        assert(false);
+
+
+    }
+  }
+
+//LABEL_123:
+  pParty->sRotationY = _angle_y;
+  pParty->sRotationX = _angle_x;
+  if ( pZ < v111 || pParty->bFlying)
+  {
+    if ( pParty->bFlying )
+    {
+      v126 = stru_5C6E00->Cos(GetTickCount());
+      v129 = (unsigned __int64)(4i64 * v126) >> 16;
+      pZ = v113 + v129;
+      if ( pModel )
+        pZ = v113;
+      if (pParty->FlyActive())
+        stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] &= 0xFEu;
+      pParty->uFallStartY = pZ;
+    }
+    else
+    {
+      if ( is_on_water && pParty->uFallSpeed )
+        sub_42F960_create_object(pX, pY, v111);
+      pParty->uFallSpeed = 0;
+      pZ = v111;
+      pParty->uFallStartY = v111;
+      v113 = pZ;
+      if (pParty->FlyActive())
+        stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1u;
+    }
+  }
+  else
+  {
+	  v113 = pZ;
+	  if (pParty->FlyActive())
+		stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1u;
+  }
+//LABEL_141:
+  if (hovering && !pParty->bFlying)//расчёт скорости падения
+  {
+    v33 = -(pEventTimer->uTimeElapsed * GetGravityStrength());
+    v34 = pParty->uFallSpeed + 2 * v33;
+    pParty->uFallSpeed += 2 * v33;
+  }
+  else if (!partyAtHighSlope)
+  {
+    v34 = pParty->uFallSpeed;
+  }
+  else if (!hovering)
+  {
+    if ( !bmodel_standing_on_pid )
+	{
+		// rolling down the hill
+		// how it's done: you get a little bit pushed in the air along terrain normal, getting in the air
+		// and falling to the gravity, gradually sliding downwards. nice trick
+		pZ = v111;
+		ODM_GetTerrainNormalAt(pX, pY, &v98);
+		v35 = pParty->uFallSpeed + -8 * pEventTimer->uTimeElapsed * GetGravityStrength();
+		v129 = abs((signed __int64)v2 * v98.x + (signed __int64)v1 * v98.y + (signed __int64)v35 * v98.z) >> 16;
+		v2 += (unsigned __int64)(v129 * (signed __int64)v98.x) >> 16;
+		v1 += (unsigned __int64)(v129 * (signed __int64)v98.y) >> 16;
+		v34 = v35 + ((unsigned __int64)(v129 * (signed __int64)v98.z) >> 16);
+		v128 = v1;
+		pParty->uFallSpeed = v34;
+	}
+  }
+  else
+	  v34 = pParty->uFallSpeed;
+
+//LABEL_164:
+  if ( hovering )
+  {
+	  if ( !bUnderwater && v34 <= 0)
+	  {
+		if ( v34 < -500
+		  && !pParty->bFlying
+		  && pParty->vPosition.z - v111 > 1000
+		  && !pParty->FeatherFallActive())
+		{ // falling scream
+		  for (int i = 0; i < 4; ++i)
+		  {
+            if (!pParty->pPlayers[i].HasEnchantedItemEquipped(72) && !pParty->pPlayers[i].WearsItem(ITEM_ARTIFACT_HERMES_SANDALS, EQUIP_BOOTS) && pParty->pPlayers[i].CanAct())
+              pParty->pPlayers[i].PlaySound(SPEECH_Falling_scream, 0);//крик падения
+		  }
+		}
+	  }
+  }
+  else
+  {
+//LABEL_150:
+  pParty->uFallStartY = pZ;
+  }
+
+  if ( v2 * v2 + v1 * v1 < 400 && !partyAtHighSlope )
+  {
+    *(float *)&v128 = 0.0;
+    v2 = 0;
+  }
+  stru_721530.field_84 = -1;
+  stru_721530.field_70 = 0;
+  stru_721530.prolly_normal_d = pParty->field_14_radius;
+  stru_721530.field_8_radius = pParty->field_14_radius >> 1;
+  v126 = 0;
+  stru_721530.field_0 = 1;
+  stru_721530.height = pParty->uPartyHeight - 32;
+  do
+  {
+    stru_721530.position.x = pX;
+    stru_721530.normal.x = pX;
+    stru_721530.velocity.x = v2;
+    stru_721530.position.y = pY;
+    stru_721530.normal.y = pY;
+    stru_721530.normal.z = stru_721530.prolly_normal_d + pZ + 1;
+    stru_721530.position.z = stru_721530.height + pZ + 1;
+    stru_721530.velocity.y = v128;
+    stru_721530.velocity.z = pParty->uFallSpeed;
+    v36 = 0;
+    stru_721530.uSectorID = 0;
+    if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3 )
+      v36 = 13312;
+    if ( stru_721530._47050A(v36) )
+      break;
+    _46E889_collide_against_bmodels(1u);
+    v37 = WorldPosToGridCellZ(pParty->vPosition.y);
+    v38 = WorldPosToGridCellX(pParty->vPosition.x);
+    _46E26D_collide_against_sprites(v38, v37);
+    _46ED8A_collide_against_sprite_objects(4u);
+    for ( i = 0; i < (signed int)uNumActors; ++i )
+      Actor::_46DF1A_collide_against_actor(i, 0);
+    if ( stru_721530.field_7C >= stru_721530.field_6C )
+    {
+      _angle_x = stru_721530.normal2.x;
+      _angle_y = stru_721530.normal2.y;
+      v40 = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
+    }
+    else
+    {
+      _angle_x = pX + fixpoint_mul(stru_721530.field_7C, stru_721530.direction.x);
+      _angle_y = pY + fixpoint_mul(stru_721530.field_7C, stru_721530.direction.y);
+      pModel = (BSPModel *)fixpoint_mul(stru_721530.field_7C, stru_721530.direction.z);
+      v40 = fixpoint_mul(stru_721530.field_7C, stru_721530.direction.z) + pZ;
+    }
+    v122 = v40;
+    ODM_GetFloorLevel(_angle_x, _angle_y, v40, pParty->uPartyHeight, &is_on_water, &bmodel_standing_on_pid, 0);
+    v129 = ODM_GetFloorLevel(_angle_x, pY, v40, pParty->uPartyHeight, &is_on_water, &v97, 0);
+    int v119 = ODM_GetFloorLevel(pX, _angle_y, v40, pParty->uPartyHeight, &is_on_water, &v110, 0);
+    pModel = (BSPModel *)IsTerrainSlopeTooHigh(_angle_x, pY);
+    v42 = IsTerrainSlopeTooHigh(pX, _angle_y);
+    is_not_on_bmodel = false;
+    v118 = v42;
+    if ( !v97 && !v110 && !bmodel_standing_on_pid )
+      is_not_on_bmodel = true;
+    v43 = 1;
+    v44 = 1;
+    if ( bUnderwater || !is_not_on_bmodel )
+	{
+		  pX = _angle_x;
+		  if ( v43 )
+			  pY = _angle_y;
+	}
+	else
+	{
+		if ( pModel && v129 > pZ )
+		  v44 = 0;
+		if ( v118 && v119 > pZ )
+		  v43 = 0;
+		if ( v44 )
+		{
+			  pX = _angle_x;
+			  if ( v43 )
+				  pY = _angle_y;
+		}
+		else if ( v43 )
+		  pY = _angle_y;
+		else
+		{
+			pModel = (BSPModel *)ODM_GetFloorLevel(_angle_x, _angle_y, v40, pParty->uPartyHeight, &is_on_water, &bmodel_standing_on_pid, 0);
+			if ( IsTerrainSlopeTooHigh(_angle_x, _angle_y) && (signed int)pModel <= pZ )
+			{
+			  v43 = 1;
+			  pX = _angle_x;
+			  if ( v43 )
+				  pY = _angle_y;
+			}
+		}
+	}
+    if ( stru_721530.field_7C >= stru_721530.field_6C )
+    {
+      if ( !is_not_on_bmodel )
+      {
+        pX = stru_721530.normal2.x;
+        pY = stru_721530.normal2.y;
+      }
+      pZ = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
+      break;
+    }
+    stru_721530.field_70 += stru_721530.field_7C;
+    pX = _angle_x;
+    pY = _angle_y;
+    v45 = stru_721530.uFaceID;
+    pZ = v40;
+    if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Actor)
+    {
+      if (pParty->Invisible())
+        pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset();
+
+      viewparams->bRedrawGameUI = true;
+		v2 = (unsigned __int64)(58500i64 * v2) >> 16;
+		pModel = (BSPModel *)58500;
+		v128 = (unsigned __int64)(58500i64 * v128) >> 16;
+		v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+		++v126;
+		pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+		continue;
+	}
+    if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Decoration)
+    {
+      v56 = integer_sqrt(v2 * v2 + v128 * v128);
+      v118 = v56;
+      v57 = stru_5C6E00->Atan2(_angle_x - pLevelDecorations[(signed int)stru_721530.uFaceID >> 3].vPosition.x,
+                               _angle_y - pLevelDecorations[(signed int)stru_721530.uFaceID >> 3].vPosition.y);
+      v129 = v57;
+      v58 = (BSPModel *)stru_5C6E00->Cos(v57);
+      pModel = v58;
+      v59 = (signed int)v58 * (signed __int64)v56;
+      v122 = v59 >> 16;
+      v2 = v59 >> 16;
+      v60 = (BSPModel *)stru_5C6E00->Sin(v129);
+      pModel = v60;
+      v61 = (signed int)v60 * (signed __int64)v118;
+      v122 = v61 >> 16;
+      v128 = v61 >> 16;
+    }
+    else
+    {
+      if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_BModel)
+      {
+        pParty->bFlying = false;
+        pModel = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9];
+        //v127 = v46;
+        pODMFace = &pModel->pFaces[((signed int)stru_721530.uFaceID >> 3) & 0x3F];
+        v48 = pODMFace->pBoundingBox.z2 - pODMFace->pBoundingBox.z1;
+        v51 = __OFSUB__(v48, 32);
+        v49 = v48 == 32;
+        v50 = v48 - 32 < 0;
+        v52 = pODMFace->pFacePlane.vNormal.z;
+        v129 = (unsigned __int8)(v50 ^ v51 | v49);
+        v119 = v52 < 46378;
+        if ( bUnderwater == 1 )
+          v119 = 0;
+        if ( pODMFace->uPolygonType == POLYGON_Floor )
+        {
+          if ( pParty->uFallSpeed < 0 )
+            pParty->uFallSpeed = 0;
+          pZ = pModel->pVertices.pVertices[pODMFace->pVertexIDs[0]].z + 1;
+          if ( v2 * v2 + v128 * v128 < 400 )
+          {
+            v2 = 0;
+            *(float *)&v128 = 0.0;
+          }
+          if ( pParty->floor_face_pid != v45 && (pODMFace->uAttributes & FACE_PRESSURE_PLATE))
+          {
+            pParty->floor_face_pid = v45;
+            v103 = pODMFace->sCogTriggeredID;
+          }
+          v2 = (unsigned __int64)(58500i64 * v2) >> 16;
+          pModel = (BSPModel *)58500;
+          v128 = (unsigned __int64)(58500i64 * v128) >> 16;
+          v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+          ++v126;
+          pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+          continue;
+        }
+        if ( !v129 && (pODMFace->uPolygonType != POLYGON_InBetweenFloorAndWall || v119) )// упёрся в столб
+        {
+          v118 = abs(v128 * pODMFace->pFacePlane.vNormal.y + pParty->uFallSpeed * v52 + v2 * pODMFace->pFacePlane.vNormal.x) >> 16;
+          if ((stru_721530.speed >> 3) > v118 )
+            v118 = stru_721530.speed >> 3;
+          v129 = (unsigned __int64)(v118 * (signed __int64)pODMFace->pFacePlane.vNormal.x) >> 16;
+          _walk_speed = (unsigned __int64)(v118 * (signed __int64)pODMFace->pFacePlane.vNormal.y) >> 16;
+          v54 = 0;
+          if ( !v119 )
+          {
+            pModel = (BSPModel *)pODMFace->pFacePlane.vNormal.z;
+            pModel = (BSPModel *)((unsigned __int64)(v118 * (signed __int64)(signed int)pModel) >> 16);
+            v54 = pModel;
+          }
+          pParty->uFallSpeed += (int)v54;
+          v128 += _walk_speed;
+          v2 += v129;
+          v55 = stru_721530.prolly_normal_d
+              - ((signed int)(pODMFace->pFacePlane.dist
+                            + v122 * pODMFace->pFacePlane.vNormal.z
+                            + _angle_y * pODMFace->pFacePlane.vNormal.y
+                            + _angle_x * pODMFace->pFacePlane.vNormal.x) >> 16);
+          if ( v55 > 0 )
+          {
+            pX = _angle_x + (pODMFace->pFacePlane.vNormal.x * v55 >> 16);
+            pY = _angle_y + (pODMFace->pFacePlane.vNormal.y * v55 >> 16);
+            if ( !v119 )
+              pZ = v122 + (pODMFace->pFacePlane.vNormal.z * v55 >> 16);
+          }
+//LABEL_220:
+			v45 = stru_721530.uFaceID;
+			if ( pParty->floor_face_pid != v45 && BYTE3(pODMFace->uAttributes) & 4 )
+			{
+				pParty->floor_face_pid = v45;
+				v103 = pODMFace->sCogTriggeredID;
+			}
+			v2 = (unsigned __int64)(58500i64 * v2) >> 16;
+			pModel = (BSPModel *)58500;
+			v128 = (unsigned __int64)(58500i64 * v128) >> 16;
+			v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+			++v126;
+			pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+			continue;
+        }
+        v118 = abs(v128 * pODMFace->pFacePlane.vNormal.y + pParty->uFallSpeed * v52 + v2 * pODMFace->pFacePlane.vNormal.x) >> 16;
+        if ((stru_721530.speed >> 3) > v118 )
+          v118 = stru_721530.speed >> 3;
+        v122 = pODMFace->pFacePlane.vNormal.x;
+        v122 = (unsigned __int64)(v118 * (signed __int64)(signed int)v122) >> 16;
+        pModel = (BSPModel *)pODMFace->pFacePlane.vNormal.y;
+        pModel = (BSPModel *)((unsigned __int64)(v118 * (signed __int64)(signed int)pModel) >> 16);
+        v129 = pODMFace->pFacePlane.vNormal.z;
+        v129 = (unsigned __int64)(v118 * (signed __int64)v129) >> 16;
+        pParty->uFallSpeed += v129;
+        v2 += v122;
+        v128 += (int)pModel;
+        if ( v2 * v2 + v128 * v128 >= 400 )
+		{
+			v45 = stru_721530.uFaceID;
+			if ( pParty->floor_face_pid != v45 && BYTE3(pODMFace->uAttributes) & 4 )
+			{
+				pParty->floor_face_pid = v45;
+				v103 = pODMFace->sCogTriggeredID;
+			}
+			v2 = (unsigned __int64)(58500i64 * v2) >> 16;
+			pModel = (BSPModel *)58500;
+			v128 = (unsigned __int64)(58500i64 * v128) >> 16;
+			v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+			++v126;
+			pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+			continue;
+		}
+        v2 = 0;
+        pParty->uFallSpeed = 0;
+        *(float *)&v128 = 0.0;
+      }
+    }
+//LABEL_234:
+    v2 = (unsigned __int64)(58500i64 * v2) >> 16;
+    pModel = (BSPModel *)58500;
+    v128 = (unsigned __int64)(58500i64 * v128) >> 16;
+    v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+    ++v126;
+    pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
+  }
+  while ( v126 < 100 );
+
+  if ( bWalkSound && pParty->walk_sound_timer <= 0 )
+  {
+    v122 = abs(pParty->vPosition.x - pX);
+    v126 = abs(pParty->vPosition.y - pY);
+    v62 = abs(pParty->vPosition.z - pZ);
+    if ( integer_sqrt(v122 * v122 + v126 * v126 + v62 * v62) >= 8 )
+    {
+      if ( party_running_flag && (!hovering || !high_fall_flag) )
+      {
+        if ( !is_not_on_bmodel
+           && !(BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20) )
+          pAudioPlayer->PlaySound(SOUND_RunAlong3DModel, 804, 1, -1, 0, 0, 0, 0);//бег на 3D Modelи
+        else
+        {
+          v87 = pOutdoor->GetSoundIdByPosition(WorldPosToGridCellX(pParty->vPosition.x), WorldPosToGridCellZ(pParty->vPosition.y) - 1, 1);
+          pAudioPlayer->PlaySound((SoundID)v87, 804, 1, -1, 0, 0, 0, 0);//бег по земле
+        }
+      }
+      else if ( party_walking_flag && (!hovering || !high_fall_flag) )
+      {
+        if ( is_not_on_bmodel
+          || BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20 )
+        {
+          v87 = pOutdoor->GetSoundIdByPosition(WorldPosToGridCellX(pParty->vPosition.x), WorldPosToGridCellZ(pParty->vPosition.y) - 1, 0);
+          pAudioPlayer->PlaySound((SoundID)v87, 804, 1, -1, 0, 0, 0, 0);// хождение по земле
+        }
+        else
+          pAudioPlayer->PlaySound(SOUND_WalkAlong3DModel, 804, 1, -1, 0, 0, 0, 0);// хождение на 3D Modelи
+      }
+    }
+    else
+    {
+      pAudioPlayer->_4AA258(804);
+      pParty->walk_sound_timer = 64;
+    }
+  }
+
+  if ( !hovering || !high_fall_flag )
+    pParty->uFlags &= ~PARTY_FLAGS_1_FALLING;
+  else
+    pParty->uFlags |= PARTY_FLAGS_1_FALLING;
+  v126 = WorldPosToGridCellX(pParty->vPosition.x);
+  v65 = WorldPosToGridCellZ(pParty->vPosition.y) - 1;
+  unsigned int v114_a = WorldPosToGridCellX(pX);
+  v66 = WorldPosToGridCellZ(pY) - 1;
+  pModel = (BSPModel *)((~(unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(v126, v65) >> 1) & 1);
+  v122 = (~(unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(v114_a, v65) >> 1) & 1;
+  v67 = pOutdoor->ActuallyGetSomeOtherTileInfo(v126, v66);
+  v68 = 0;
+  v69 = (~(unsigned int)v67 >> 1) & 1;
+  if ( v114_a == v126 && v66 == v65 && v122 && v69 )
+    v68 = 1;
+  if ( !is_not_on_bmodel )
+    v68 = 1;
+  if ( v68 )
+  {
+    v70 = pZ;
+    v71 = pX;
+    v72 = pY;
+    //pParty->uFallSpeed = v121;
+    v73 = pZ;
+    pParty->vPosition.x = pX;
+    pParty->vPosition.y = pY;
+    pParty->vPosition.z = pZ;
+    pParty->field_6F0 = v113;
+    if ( pZ > 8160 )
+    {
+      v73 = 8160;
+      pParty->uFallStartY = 8160;
+      pParty->vPosition.z = 8160;
+    }
+    if ( !v103
+      || (EventProcessor(v103, 0, 1), pParty->vPosition.x == v71)
+      && pParty->vPosition.y == v72
+      && (v73 = pParty->vPosition.z, pParty->vPosition.z == v70) )
+    {
+      if ( v73 < v111 )
+      {
+        pParty->uFallSpeed = 0;
+        v73 = v105;
+        pParty->vPosition.z = v105;
+        if ( pParty->uFallStartY - v70 > 512 && !bFeatherFall && v70 <= v105 && !bUnderwater )//Fall to the ground(падение на землю с высоты)
+        {
+          if ( pParty->uFlags & PARTY_FLAGS_1_LANDING )
+          {
+            pParty->uFlags &= ~PARTY_FLAGS_1_LANDING;
+          }
+          else
+          {
+            for ( uint i = 1; i <= 4; ++i )
+            {
+              v110 = pPlayers[i]->GetMaxHealth();
+              pPlayers[i]->ReceiveDamage((signed int)((pParty->uFallStartY - v70) * (unsigned __int64)(signed __int64)((double)v110 * 0.1)) / 256,
+                DMGT_PHISYCAL);
+              v110 = 20 - pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualEndurance());
+              pPlayers[i]->SetRecoveryTime((signed __int64)((double)v110 * flt_6BE3A4_debug_recmod1 * 2.133333333333333));
+            }
+            v73 = pParty->vPosition.z;
+          }
+        }
+        pParty->uFallStartY = v70;
+      }
+      if ( v102 && v73 < v109 )
+      {
+        if ( (signed int)(pParty->uPartyHeight + v73) >= v109 )
+        {
+          pParty->vPosition.z = v109 - pParty->uPartyHeight - 1;
+          pParty->field_6F0 = v109 - pParty->uPartyHeight - 1;
+        }
+      }
+      pParty->uFlags &= ~0x204;
+    }
+    return;
+  }
+  //v76 = pParty->bFlying;
+  if ( pParty->bFlying || !high_fall_flag || bWaterWalk || !pModel )
+    v77 = 1;
+  else
+    v77 = v122 != 0;
+  bool party_drowning_flag = false;
+  if ( !pParty->bFlying && high_fall_flag && !bWaterWalk )
+  {
+    if ( pModel )
+    {
+      v78 = v69 != 0;
+    }
+	else
+	{
+		party_drowning_flag = true;
+		v78 = 1;
+	}
+  }
+  else
+	v78 = 1;
+//LABEL_306:
+  if ( v77 )
+  {
+    pParty->vPosition.x = pX;
+  }
+  if ( v78 )
+  {
+    pParty->vPosition.y = pY;
+  }
+  if ( v78 || v77)
+  {
+    if ( bWaterWalk )
+    {
+      pParty->uFlags &= ~PARTY_FLAGS_1_STANDING_ON_WATER;
+      //v79 = 20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 6180178;
+      //*(short *)&stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 119] |= 1u;
+      v79 = (int)&stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 119];
+      *(short *)v79 |= 1u;
+      if ( !v122 || !v69 )
+      {
+        if ( !pParty->bFlying )
+        {
+          v80 = *(short *)v79;
+          pParty->uFlags |= PARTY_FLAGS_1_STANDING_ON_WATER;
+          *(short *)v79 = v80 & 0xFFFE;
+        }
+      }
+    }
+  }
+  else if ( bWalkSound && pParty->walk_sound_timer <= 0 )
+  {
+    pAudioPlayer->_4AA258(804);
+    pParty->walk_sound_timer = 64;
+  }
+//LABEL_318:
+  v81 = pZ;
+  v82 = pZ;
+  pParty->vPosition.z = pZ;
+  if ( pZ > 8160 )
+  {
+    v82 = 8160;
+    pParty->uFallStartY = 8160;
+    pParty->vPosition.z = 8160;
+  }
+  LOWORD(pParty->uFlags) &= 0xFDFBu;
+  //pParty->uFallSpeed = v121;
+  pParty->field_6F0 = v113;
+  if ( party_drowning_flag )
+  {
+    pTerrainHeight = GetTerrainHeightsAroundParty2(pParty->vPosition.x, pParty->vPosition.y, &v110, 1);
+    if ( pParty->vPosition.z <= pTerrainHeight + 1 )//положение группы всегда +1
+      pParty->uFlags |= PARTY_FLAGS_1_WATER_DAMAGE;
+  }
+  if ( !v103
+    || (EventProcessor(v103, 0, 1), pParty->vPosition.x == pX)
+    && pParty->vPosition.y == pY
+    && (v82 = pParty->vPosition.z, pParty->vPosition.z == v81) )
+  {
+    if ( v82 < v111 )
+    {
+      v82 = v105;
+      pParty->uFallSpeed = 0;
+      pParty->vPosition.z = v105;
+      if ( pParty->uFallStartY - v81 > 512 && !bFeatherFall && v81 <= v105 && !bUnderwater )//Fall to the water(падение на воду с высоты)
+      {
+        if ( pParty->uFlags & PARTY_FLAGS_1_LANDING )
+        {
+          pParty->uFlags &= ~PARTY_FLAGS_1_LANDING;
+        }
+        else
+        {
+          for ( uint i = 1; i <= 4; ++i )
+          {
+            v110 = pPlayers[i]->GetMaxHealth();
+            pPlayers[i]->ReceiveDamage((signed int)((pParty->uFallStartY - v81) * (unsigned __int64)(signed __int64)((double)v110 * 0.1)) / 256,
+              DMGT_PHISYCAL);
+            v110 = 20 - pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualEndurance());
+            pPlayers[i]->SetRecoveryTime((signed __int64)((double)v110 * flt_6BE3A4_debug_recmod1 * 2.133333333333333));
+          }
+          v82 = pParty->vPosition.z;
+        }
+      }
+      pParty->uFallStartY = v81;
+    }
+    if ( v102 && v82 < v109 && (signed int)(pParty->uPartyHeight + v82) >= v109 )
+    {
+      pParty->vPosition.z = v82 + pParty->uPartyHeight - v109 + 1;
+      pParty->field_6F0 = v82 + pParty->uPartyHeight - v109 + 1;
+    }
+  }
+}
+//----- (0046D8E3) --------------------------------------------------------
+int GetCeilingHeight(int Party_X, signed int Party_Y, int Party_ZHeight, int pFaceID)
+{
+  signed int v13; // eax@25
+  int v14; // edx@27
+  int v16; // ST18_4@29
+  signed int v17; // edx@29
+  signed __int64 v18; // qtt@29
+  int v19; // eax@35
+  signed int v20; // ecx@37
+  signed int v22; // ebx@42
+  int v24; // edx@44
+  int v25; // eax@44
+  int v27; // [sp+10h] [bp-34h]@21
+  bool v34; // [sp+30h] [bp-14h]@21
+  bool v35; // [sp+34h] [bp-10h]@23
+  signed int v37; // [sp+38h] [bp-Ch]@21
+  signed int v38; // [sp+38h] [bp-Ch]@42
+  signed int v39; // [sp+3Ch] [bp-8h]@1
+
+  dword_720ED0[0] = -1;
+  dword_720E80[0] = -1;
+  v39 = 1;
+  ceiling_height_level[0] = 10000;//нет потолка
+  for ( uint i = 0; i < (signed int)pOutdoor->uNumBModels; ++i )
+  {
+    if ( Party_X <= pOutdoor->pBModels[i].sMaxX && Party_X >= pOutdoor->pBModels[i].sMinX
+      && Party_Y <= pOutdoor->pBModels[i].sMaxY && Party_Y >= pOutdoor->pBModels[i].sMinY )
+    {
+      for ( uint j = 0; j < pOutdoor->pBModels[i].uNumFaces; ++j )
+      {
+        if ( (pOutdoor->pBModels[i].pFaces[j].uPolygonType == POLYGON_Ceiling
+           || pOutdoor->pBModels[i].pFaces[j].uPolygonType == POLYGON_InBetweenCeilingAndWall)
+           && !(BYTE3(pOutdoor->pBModels[i].pFaces[j].uAttributes) & 0x20)
+           && Party_X <= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.x2 && Party_X >= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.x1
+           && Party_Y <= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.y2 && Party_Y >= pOutdoor->pBModels[i].pFaces[j].pBoundingBox.y1 )
+        {
+          for ( uint v = 0; v < pOutdoor->pBModels[i].pFaces[j].uNumVertices; v++ )
+          {
+            word_720DB0_xs[2 * v] = pOutdoor->pBModels[i].pFaces[j].pXInterceptDisplacements[v] + LOWORD(pOutdoor->pBModels[i].pVertices.pVertices[pOutdoor->pBModels[i].pFaces[j].pVertexIDs[v]].x);
+            word_720CE0_ys[2 * v] = pOutdoor->pBModels[i].pFaces[j].pXInterceptDisplacements[v] + LOWORD(pOutdoor->pBModels[i].pVertices.pVertices[pOutdoor->pBModels[i].pFaces[j].pVertexIDs[v]].y);
+            word_720DB0_xs[2 * v + 1] = pOutdoor->pBModels[i].pFaces[j].pXInterceptDisplacements[v] + LOWORD(pOutdoor->pBModels[i].pVertices.pVertices[pOutdoor->pBModels[i].pFaces[j].pVertexIDs[v + 1]].x);
+            word_720CE0_ys[2 * v + 1] = pOutdoor->pBModels[i].pFaces[j].pXInterceptDisplacements[v] + LOWORD(pOutdoor->pBModels[i].pVertices.pVertices[pOutdoor->pBModels[i].pFaces[j].pVertexIDs[v + 1]].y);
+          }
+          v27 = 2 * pOutdoor->pBModels[i].pFaces[j].uNumVertices;
+          word_720DB0_xs[2 * pOutdoor->pBModels[i].pFaces[j].uNumVertices] = word_720DB0_xs[0];
+          word_720CE0_ys[2 * pOutdoor->pBModels[i].pFaces[j].uNumVertices] = word_720CE0_ys[0];
+          v34 = word_720CE0_ys[0] >= Party_Y;
+          v37 = 0;
+          for ( uint v = 0; v < v27; ++v )
+          {
+            if ( v37 >= 2 )
+              break;
+            v35 = word_720CE0_ys[v + 1] >= Party_Y;
+            if ( v34 != v35 )
+            {
+              v13 = word_720DB0_xs[v + 1] >= Party_X ? 0 : 2;
+              v14 = v13 | (word_720DB0_xs[v] < Party_X);
+              if ( v14 != 3 )
+              {
+                if ( !v14 || ( v16 = word_720CE0_ys[v + 1] - word_720CE0_ys[v],
+                  v17 = Party_Y - word_720CE0_ys[v],
+                  LODWORD(v18) = v17 << 16,
+                  HIDWORD(v18) = v17 >> 16,
+                  (signed int)(((unsigned __int64)(((signed int)word_720DB0_xs[v + 1]
+                  - (signed int)word_720DB0_xs[v]) * v18 / v16) >> 16) + word_720DB0_xs[v]) >= Party_X) )
+                  ++v37;
+              }
+            }
+            v34 = v35;
+          }
+          if ( v37 == 1 )
+          {
+            if ( v39 >= 20 )
+              break;
+            if ( pOutdoor->pBModels[i].pFaces[j].uPolygonType == POLYGON_Ceiling )
+              v19 = pOutdoor->pBModels[i].pVertices.pVertices[pOutdoor->pBModels[i].pFaces[j].pVertexIDs[0]].z;
+            else
+              v19 = ((unsigned __int64)(pOutdoor->pBModels[i].pFaces[j].zCalc1 * (signed __int64)Party_X) >> 16)
+                  + ((unsigned __int64)(pOutdoor->pBModels[i].pFaces[j].zCalc2 * (signed __int64)Party_Y) >> 16)
+                  + HIWORD(pOutdoor->pBModels[i].pFaces[j].zCalc3);
+            v20 = v39++;
+            ceiling_height_level[v20] = v19;
+            dword_720ED0[v20] = i;
+            dword_720E80[v20] = j;
+          }
+        }
+      }
+    }
+  }
+  if ( !v39 )
+  {
+    pFaceID = 0;
+    return ceiling_height_level[0];
+  }
+  v22 = 0;
+  for ( v38 = 0; v38 < v39; ++v38 )
+  {
+    if ( ceiling_height_level[v38] == ceiling_height_level[0] )
+      v22 = v38;
+    else if ( ceiling_height_level[v38] < ceiling_height_level[0] && ceiling_height_level[0] > Party_ZHeight + 15 )
+      v22 = v38;
+    else if ( ceiling_height_level[v38] > ceiling_height_level[0] && ceiling_height_level[v38] <= Party_ZHeight + 15 )
+      v22 = v38;
+  }
+  if ( v22 )
+  {
+    *(int *)pFaceID = dword_720E80[v22] | (dword_720ED0[v22] << 6);
+    return ceiling_height_level[v22];//если есть преграда
+  }
+  pFaceID = 0;
+  return ceiling_height_level[v22];// нет никакой преграды
+}
\ No newline at end of file
--- a/lib/swig.bat	Tue Nov 26 18:45:03 2013 +0600
+++ b/lib/swig.bat	Tue Nov 26 18:45:08 2013 +0600
@@ -1,15 +1,15 @@
-rem echo 1 %1
-rem echo 2 %2
-rem echo 3 %3
-rem echo 4 %4
-rem echo 5 %5
-rem echo 6 %6
+echo 1 %1
+echo 2 %2
+echo 3 %3
+echo 4 %4
+echo 5 %5
+echo 6 %6
 
-rem echo xcopy %4 "../../lib/swig/swigwin-2.0.11" /y
+echo xcopy %4 "../../lib/swig/swigwin-2.0.11" /y
 xcopy %4 "../../lib/swig/swigwin-2.0.11" /y
 
 cd ../../lib/swig/swigwin-2.0.11
 swig -c++ -lua %3
 
-rem echo xcopy "%6  %5"%2" /y
-xcopy "%6  %5"%2" /y
\ No newline at end of file
+echo xcopy "%6" %5"%2" /y
+xcopy "%6" %5"%2" /y
\ No newline at end of file
--- a/lib/swig/swigwin-2.0.11/UIControlModule.swig	Tue Nov 26 18:45:03 2013 +0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-%module UIControl
-%{
-#include "UIControl.h"
-%}
-
-%include "../../../NewUI/Core/UIControl.h"
\ No newline at end of file
--- a/mm7_2.cpp	Tue Nov 26 18:45:03 2013 +0600
+++ b/mm7_2.cpp	Tue Nov 26 18:45:08 2013 +0600
@@ -4305,7 +4305,7 @@
 bool show_picked_face = false;
 bool draw_debug_line = false;
 bool new_speed = true;
-
+int max_flight_height = 4000;
 
 
 
--- a/mm7_3.cpp	Tue Nov 26 18:45:03 2013 +0600
+++ b/mm7_3.cpp	Tue Nov 26 18:45:08 2013 +0600
@@ -2056,1100 +2056,6 @@
     EventProcessor(uFaceEvent, 0, 1);
 }
 
-//----- (00473893) --------------------------------------------------------
-void ODM_ProcessPartyActions()
-{
-  int v1; // edi@1
-  int v2; // ebx@1
-  int v3; // eax@14
-  int v6; // esi@45
-  ODMFace *face; // ecx@45
-  signed int v33; // eax@143
-  int v34; // esi@143
-  int v35; // esi@147
-  int v36; // eax@155
-  signed int v37; // esi@159
-  signed int v38; // eax@159
-  signed int i; // esi@159
-  int v40; // esi@162
-  bool v42; // eax@180
-  signed int v43; // ecx@184
-  signed int v44; // edx@184
-  int v45; // ecx@200
-  BSPModel *pModel; // eax@203
-  ODMFace *pODMFace; // esi@203
-  int v48; // eax@203
-  char v49; // zf@203
-  char v50; // sf@203
-  unsigned __int8 v51; // of@203
-  int v52; // eax@203
-  BSPModel *v54; // eax@215
-  int v55; // eax@217
-  signed int v56; // ebx@228
-  int v57; // eax@228
-  BSPModel *v58; // eax@228
-  unsigned __int64 v59; // qax@228
-  BSPModel *v60; // eax@228
-  unsigned __int64 v61; // qax@228
-  int v62; // eax@241
-  unsigned int v65; // ebx@263
-  unsigned int v66; // esi@263
-  int v67; // eax@263
-  signed int v68; // ecx@263
-  int v69; // eax@263
-  int v70; // ebx@271
-  int v71; // esi@271
-  int v72; // edi@271
-  int v73; // eax@271
-  unsigned int v76; // edi@293
-  bool v77; // edx@297
-  bool v78; // ecx@303
-  int v79; // ecx@314
-  __int16 v80; // dx@317
-  int v81; // ebx@318
-  int v82; // ecx@318
-  int pTerrainHeight; // eax@321
-  int v86; // [sp-20h] [bp-B4h]@246
-  int v87; // [sp-20h] [bp-B4h]@248
-  signed int v88; // [sp-1Ch] [bp-B0h]@246
-  unsigned int v89; // [sp-18h] [bp-ACh]@246
-  signed int v90; // [sp-14h] [bp-A8h]@246
-  signed int v91; // [sp-10h] [bp-A4h]@246
-  int v92; // [sp-Ch] [bp-A0h]@246
-  unsigned int v94; // [sp-8h] [bp-9Ch]@246
-  int v96; // [sp-4h] [bp-98h]@246
-  int v97; // [sp+Ch] [bp-88h]@180
-  Vec3_int_ v98;
-  bool high_fall_flag; // [sp+1Ch] [bp-78h]@33
-  int v102; // [sp+20h] [bp-74h]@1
-  int v103; // [sp+24h] [bp-70h]@1
-  bool bFeatherFall; // [sp+28h] [bp-6Ch]@4
-  int v105; // [sp+2Ch] [bp-68h]@24
-  bool bWaterWalk; // [sp+30h] [bp-64h]@1
-  int v109; // [sp+3Ch] [bp-58h]@28
-  int v110; // [sp+40h] [bp-54h]@180
-  int v111; // [sp+44h] [bp-50h]@14
-  bool hovering; // [sp+48h] [bp-4Ch]@1
-  int v113; // [sp+4Ch] [bp-48h]@1
-  bool party_running_flag; // [sp+50h] [bp-44h]@1
-  int _walk_speed; // [sp+54h] [bp-40h]@48
-  int pX; // [sp+58h] [bp-3Ch]@1
-  int pY; // [sp+5Ch] [bp-38h]@1
-  int v118; // [sp+60h] [bp-34h]@1
-  int _angle_x; // [sp+68h] [bp-2Ch]@48
-  unsigned int v122; // [sp+70h] [bp-24h]@180
-  int pZ; // [sp+74h] [bp-20h]@1
-  bool party_walking_flag; // [sp+78h] [bp-1Ch]@1
-  int _angle_y; // [sp+7Ch] [bp-18h]@48
-  int v126; // [sp+80h] [bp-14h]@48
-  int v128; // [sp+88h] [bp-Ch]@1
-  int v129; // [sp+8Ch] [bp-8h]@92
-
-  v1 = 0;
-  v103 = 0;
-  v2 = 0;
-  //*(float *)&v128 = 0.0;
-  v128 = 0;
-  v129 = 0;
-  pX = pParty->vPosition.x;
-  pY = pParty->vPosition.y;
-  pZ = pParty->vPosition.z;
-  v113 = pParty->field_6F0;
-  hovering = false;
-  bool partyAtHighSlope = IsTerrainSlopeTooHigh(pParty->vPosition.x, pParty->vPosition.y);
-  party_running_flag = false;
-  party_walking_flag = false;
-  v102 = 0;
-  pModel = 0;
-  bWaterWalk = false;
-
-  if (!pParty->FeatherFallActive())//Проверка падение пера
-  {
-    bFeatherFall = false;
-    for (int i = 0; i < 4; ++i)
-      if (pParty->pPlayers[i].WearsItemAnyWhere(ITEM_ARTIFACT_LADYS_ESCORT))  // seems like flying boots
-      {
-        bFeatherFall = true;
-        break;
-      }
-  }
-  else
-    bFeatherFall = true;
-
-  pParty->uFlags &= ~PARTY_FLAGS_1_STANDING_ON_WATER;
-  if (pParty->WaterWalkActive())//Проверка хождения по воде
-  {
-    //LOBYTE(pParty->uFlags) &= 0x7Fu;
-    bWaterWalk = true;
-    *(short *)&stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 119] |= 1u;
-    if (!(pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uFlags & 1) &&
-          pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uCaster - 1].sMana <= 0 )
-      bWaterWalk = false;
-  }
-
-  int bmodel_standing_on_pid;
-  int is_on_water = false;
-  v3 = ODM_GetFloorLevel(pX, pY, pZ, pParty->uPartyHeight, &is_on_water, &bmodel_standing_on_pid, bWaterWalk);
-  int is_not_on_bmodel = bmodel_standing_on_pid == 0;
-
-  v111 = v3;
-  if ( bFeatherFall )
-    pParty->uFallStartY = v3;
-  else
-    v3 = pParty->uFallStartY;
-  if ( v3 - pZ > 512 && !bFeatherFall && pZ <= v111 + 1 )
-  {
-    if (pParty->uFlags & PARTY_FLAGS_1_LANDING)
-    {
-      pParty->uFlags &= ~PARTY_FLAGS_1_LANDING;
-    }
-    else for (int i = 0; i < 4; ++i)     // receive falling damage
-    {
-      if ( !pParty->pPlayers[i].HasEnchantedItemEquipped(72) && !pParty->pPlayers[i].WearsItem(ITEM_ARTIFACT_HERMES_SANDALS, EQUIP_BOOTS) )
-      {
-        pParty->pPlayers[i].ReceiveDamage(
-            (signed int)((pParty->uFallStartY - pZ) * (unsigned __int64)(pParty->pPlayers[i].GetMaxHealth() / 10)) / 256, DMGT_PHISYCAL);
-        v105 = 20 - pParty->pPlayers[i].GetParameterBonus(pParty->pPlayers[i].GetActualEndurance());
-        pParty->pPlayers[i].SetRecoveryTime((signed __int64)((double)v105 * flt_6BE3A4_debug_recmod1 * 2.133333333333333));
-      }
-      //}
-      //while ( (signed int)v4 <= (signed int)&pPlayers[4] );
-    }
-  }
-  v109 = -1;
-  if ( pParty->bFlying )
-    v109 = sub_46D8E3(pX, pY, pZ + pParty->uPartyHeight, (int)&v102);
-  //v107 = bmodel_standing_on_pid == 0;
-  v105 = v111 + 1;
-  if ( pZ <= v111 + 1 )
-  {
-    v109 = -1;
-    pParty->bFlying = false;
-  }
-  else
-    hovering = true;
-  high_fall_flag = pZ - v111 <= 32;
-
-  if ( bWalkSound && pParty->walk_sound_timer)//timer update
-  {
-    if (pParty->walk_sound_timer >= pEventTimer->uTimeElapsed)
-      pParty->walk_sound_timer -= pEventTimer->uTimeElapsed;
-    else pParty->walk_sound_timer = 0;
-  }
-
-  if (!bUnderwater && pParty->pPartyBuffs[PARTY_BUFF_FLY].uExpireTime <= 0)
-    pParty->bFlying = false;
-  if (!hovering)
-  {
-    if ( pParty->floor_face_pid != PID(OBJECT_BModel, bmodel_standing_on_pid) )
-    {
-      if (bmodel_standing_on_pid)
-      {
-        if ( (bmodel_standing_on_pid >> 6) < pOutdoor->uNumBModels )
-        {
-          face = pOutdoor->pBModels[bmodel_standing_on_pid >> 6].pFaces;
-          v6 = bmodel_standing_on_pid & 0x3F;
-          /*if ( *(char *)(v7->pFacePlane.vNormal.x + 308 * v6 + 31) & 4 )
-          {
-            pParty->field_6F4_packedid = PID(OBJECT_BModel,v108);
-            v103 = *(short *)(v7->pFacePlane.vNormal.x + 308 * v6 + 292);
-          }*/
-		  if ( BYTE3(face[v6].uAttributes) & 4 )
-          {
-            pParty->floor_face_pid = PID(OBJECT_BModel, bmodel_standing_on_pid);
-            v103 = face[v6].sCogTriggeredID;
-          }
-        }
-      }
-    }
-    pParty->floor_face_pid = PID(OBJECT_BModel, bmodel_standing_on_pid);
-  }
-  _walk_speed = pParty->uWalkSpeed;
-  _angle_y = pParty->sRotationY;
-  _angle_x = pParty->sRotationX;
-  v126 = pEventTimer->dt_in_some_format;
-  /*v119 = (Player **)((unsigned __int64)(pEventTimer->dt_in_some_format
-                                      * (signed __int64)((signed int)(pParty->field_20_prolly_turn_speed
-                                                                    * stru_5C6E00->uIntegerPi)
-                                                       / 180)) >> 16);*/
-  __int64 dturn = (unsigned __int64)(pEventTimer->dt_in_some_format * (signed __int64)((signed int)(pParty->y_rotation_speed * stru_5C6E00->uIntegerPi) / 180)) >> 16;
-  while (pPartyActionQueue->uNumActions)
-  {
-    switch (pPartyActionQueue->Next())
-    {
-      case PARTY_FlyUp:
-      {
-        if (!pParty->FlyActive() && !bUnderwater)
-          break;
-
-        pParty->bFlying = false;
-        if (bUnderwater ||
-            pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags & 1 ||
-            pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].sMana > 0 )
-          {
-            if ( pParty->vPosition.z < 4000 || hovering )
-            {
-              pZ += 30;
-              v113 += 30;
-              pParty->bFlying = true;
-              if ( pZ > 4000 )
-              {
-                pZ = 4000;
-                v113 = 4000;
-              }
-              v1 = 0;
-              v2 = 0;
-              pParty->uFallSpeed = 0;
-              *(float *)&v128 = 0.0;
-              if ( v102 && pZ < v109 && (signed int)(pParty->uPartyHeight + pZ) >= v109 )
-              {
-                pParty->field_6E0 = 0;
-                pParty->field_6E4 = 0;
-                pPartyActionQueue->uNumActions = 0;
-                pParty->uFlags |= PARTY_FLAGS_1_LANDING;
-                pParty->vPosition.z = v109 - pParty->uPartyHeight - 31;
-                pParty->field_6F0 = pZ;
-                pParty->bFlying = 0;
-                pZ = v109 - pParty->uPartyHeight - 31;
-                v113 = pParty->field_6F0;
-              }
-              pParty->uFallSpeed = 0;
-              pModel = (BSPModel *)1;
-            }
-          }
-      }
-      break;
-
-      case PARTY_FlyDown:
-        if (pParty->FlyActive() || bUnderwater)
-        {
-          pParty->bFlying = false;
-          if ( bUnderwater
-            || pParty->pPartyBuffs[PARTY_BUFF_FLY].uFlags & 1
-            || pParty->pPlayers[pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster - 1].sMana > 0 )//*(int *)&pParty->pArtifactsFound[6972 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uCaster + 10] > 0 )
-          {
-            pZ -= 30;
-            v113 -= 30;
-            pParty->uFallSpeed = 0;
-            //pParty->uFallSpeed = 0;
-            pParty->bFlying = true;
-            pModel = (BSPModel *)1;
-            if ( pZ <= v111 )
-            {
-              pParty->bFlying = false;
-              pPartyActionQueue->uNumActions = 0;
-            }
-          }
-        }
-        break;
-
-      case PARTY_TurnLeft:
-        if (uTurnSpeed)
-          _angle_y += uTurnSpeed;   //descrete turn
-        else
-          _angle_y += dturn * fTurnSpeedMultiplier;  // time-based smooth turn
-
-        _angle_y &= stru_5C6E00->uDoublePiMask;
-      break;
-
-      case PARTY_TurnRight:
-        if (uTurnSpeed)
-          _angle_y -= uTurnSpeed;
-        else
-          _angle_y -= dturn * fTurnSpeedMultiplier;
-
-        _angle_y &= stru_5C6E00->uDoublePiMask;
-      break;
-
-      case PARTY_FastTurnLeft:
-        if (uTurnSpeed)
-          _angle_y += uTurnSpeed;
-        else
-          _angle_y += 2.0f * fTurnSpeedMultiplier * (double)dturn;
-
-        _angle_y &= stru_5C6E00->uDoublePiMask;
-      break;
-
-      case PARTY_FastTurnRight:
-        if (!uTurnSpeed)
-          _angle_y -= 2.0f * fTurnSpeedMultiplier * (double)dturn;
-        else
-          _angle_y -= uTurnSpeed;
-
-        _angle_y &= stru_5C6E00->uDoublePiMask;
-      break;
-
-      case PARTY_StrafeLeft:
-      {
-        *(float *)&v128 = pParty->uWalkSpeed;
-
-        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0);
-        int dx = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-        v2 -= 3 * dx / 4;
-        
-        float cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
-        int dy = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-        v1 += 3 * dy / 4;
-
-        v128 = v1;
-        party_walking_flag = true;
-      }
-      break;
-
-      case PARTY_StrafeRight:
-      {
-        *(float *)&v128 = pParty->uWalkSpeed;
-
-        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0);
-        int dx = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-        v2 += 3 * dx / 4;
-        
-        float cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
-        int dy = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-        v1 -= 3 * dy / 4;
-
-        v128 = v1;
-        party_walking_flag = true;
-      }
-      break;
-
-      case PARTY_WalkForward:
-      {
-        *(float *)&v128 = _walk_speed;
-
-        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
-              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
-
-        int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-        int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-
-        extern bool new_speed;
-        if ( new_speed )
-        {
-          v2 += dx * 12;
-          v1 += dy * 12;
-        }
-        else
-        {
-          v2 += dx;
-          v1 += dy;
-        }
-
-        v128 = v1;
-        party_walking_flag = true;
-      }
-      break;
-
-      case PARTY_RunForward:
-      {
-        *(float *)&v128 = _walk_speed;
-
-        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
-              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
-
-        int dx = cos_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-        int dy = sin_y * pParty->uWalkSpeed * fWalkSpeedMultiplier;
-
-        if (pParty->bFlying)
-        {
-          v2 += 4 * dx;
-          v1 += 4 * dy;
-
-          v128 = v1;
-        }
-        else if (partyAtHighSlope && !bmodel_standing_on_pid)
-        {
-          v2 += dx;
-          v1 += dy;
-
-          v128 = v1;
-          party_walking_flag = true;
-        }
-        else
-        {
-          v2 += 2 * dx;
-          v1 += 2 * dy;
-          
-          v128 = v1;
-          party_running_flag = true;
-        }
-      }
-      break;
-
-
-      case PARTY_WalkBackward:
-      {
-        *(float *)&v128 = _walk_speed;
-
-        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
-              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
-
-        int dx = cos_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;
-        v2 -= dx;
-        
-        int dy = sin_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;
-        v1 -= dy;
-
-        v128 = v1;
-        party_walking_flag = true;
-      }
-      break;
-
-
-      case PARTY_RunBackward:
-      {
-        float sin_y = sinf(2 * 3.141592653589 * _angle_y / 2048.0),
-              cos_y = cosf(2 * 3.141592653589 * _angle_y / 2048.0);
-
-        int dx = cos_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;        
-        int dy = sin_y * pParty->uWalkSpeed * fBackwardWalkSpeedMultiplier;
-
-        if (pParty->bFlying)
-        {
-          v2 -= 4 * dx;
-          v1 -= 4 * dy;
-          v128 = v1;
-        }
-        else
-        {
-          v2 -= dx;
-          v1 -= dy;
-
-          v128 = v1;
-          party_walking_flag = true;
-        }
-      }
-      break;
-
-      case PARTY_CenterView:
-        _angle_x = 0;
-      break;
-
-      case PARTY_LookUp:
-        _angle_x += (signed __int64)(flt_6BE150_look_up_down_dangle * 25.0);
-        if ( _angle_x > 128 )
-          _angle_x = 128;
-        if (uActiveCharacter)
-          pPlayers[uActiveCharacter]->PlaySound(SPEECH_63, 0);
-      break;
-
-      case PARTY_LookDown:
-        _angle_x += (signed __int64)(flt_6BE150_look_up_down_dangle * -25.0);
-        if ( _angle_x < -128 )
-          _angle_x = -128;
-        if (uActiveCharacter)
-          pPlayers[uActiveCharacter]->PlaySound(SPEECH_64, 0);
-      break;
-
-      case PARTY_Jump:
-        if ( (!partyAtHighSlope || bmodel_standing_on_pid) && !hovering && pParty->field_24 && !(pParty->uFlags & 4) && !(BYTE1(pParty->uFlags) & 2) )
-        {
-          v126 = pParty->field_24 << 6;
-          hovering = true;
-          pParty->uFallSpeed = (signed __int64)((double)(pParty->field_24 << 6) * 1.5 + (double)pParty->uFallSpeed);
-        }
-      break;
-
-      case PARTY_Land:
-        if (pParty->bFlying)
-        {
-          pParty->uFlags |= PARTY_FLAGS_1_LANDING;
-          pParty->uFallSpeed = 0;
-        }
-        pParty->bFlying = false;
-        pPartyActionQueue->uNumActions = 0;
-      break;
-
-      default:
-        assert(false);
-
-
-    }
-  }
-
-//LABEL_123:
-  pParty->sRotationY = _angle_y;
-  pParty->sRotationX = _angle_x;
-  if ( pZ < v111 || pParty->bFlying)
-  {
-    if ( pParty->bFlying )
-    {
-      v126 = stru_5C6E00->Cos(GetTickCount());
-      v129 = (unsigned __int64)(4i64 * v126) >> 16;
-      pZ = v113 + v129;
-      if ( pModel )
-        pZ = v113;
-      if (pParty->FlyActive())
-        stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] &= 0xFEu;
-      pParty->uFallStartY = pZ;
-    }
-    else
-    {
-      if ( is_on_water && pParty->uFallSpeed )
-        sub_42F960_create_object(pX, pY, v111);
-      pParty->uFallSpeed = 0;
-      pZ = v111;
-      pParty->uFallStartY = v111;
-      v113 = pZ;
-      if (pParty->FlyActive())
-        stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1u;
-    }
-  }
-  else
-  {
-	  v113 = pZ;
-	  if (pParty->FlyActive())
-		stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_FLY].uOverlayID + 119] |= 1u;
-  }
-//LABEL_141:
-  if (hovering && !pParty->bFlying)//расчёт скорости падения
-  {
-    v33 = -(pEventTimer->uTimeElapsed * GetGravityStrength());
-    v34 = pParty->uFallSpeed + 2 * v33;
-    pParty->uFallSpeed += 2 * v33;
-  }
-  else if (!partyAtHighSlope)
-  {
-    v34 = pParty->uFallSpeed;
-  }
-  else if (!hovering)
-  {
-    if ( !bmodel_standing_on_pid )
-	{
-		// rolling down the hill
-		// how it's done: you get a little bit pushed in the air along terrain normal, getting in the air
-		// and falling to the gravity, gradually sliding downwards. nice trick
-		pZ = v111;
-		ODM_GetTerrainNormalAt(pX, pY, &v98);
-		v35 = pParty->uFallSpeed + -8 * pEventTimer->uTimeElapsed * GetGravityStrength();
-		v129 = abs((signed __int64)v2 * v98.x + (signed __int64)v1 * v98.y + (signed __int64)v35 * v98.z) >> 16;
-		v2 += (unsigned __int64)(v129 * (signed __int64)v98.x) >> 16;
-		v1 += (unsigned __int64)(v129 * (signed __int64)v98.y) >> 16;
-		v34 = v35 + ((unsigned __int64)(v129 * (signed __int64)v98.z) >> 16);
-		v128 = v1;
-		pParty->uFallSpeed = v34;
-	}
-  }
-  else
-	  v34 = pParty->uFallSpeed;
-
-//LABEL_164:
-  if ( hovering )
-  {
-	  if ( !bUnderwater && v34 <= 0)
-	  {
-		if ( v34 < -500
-		  && !pParty->bFlying
-		  && pParty->vPosition.z - v111 > 1000
-		  && !pParty->FeatherFallActive())
-		{ // falling scream
-		  for (int i = 0; i < 4; ++i)
-		  {
-            if (!pParty->pPlayers[i].HasEnchantedItemEquipped(72) && !pParty->pPlayers[i].WearsItem(ITEM_ARTIFACT_HERMES_SANDALS, EQUIP_BOOTS) && pParty->pPlayers[i].CanAct())
-              pParty->pPlayers[i].PlaySound(SPEECH_Falling_scream, 0);//крик падения
-		  }
-		}
-	  }
-  }
-  else
-  {
-//LABEL_150:
-  pParty->uFallStartY = pZ;
-  }
-
-  if ( v2 * v2 + v1 * v1 < 400 && !partyAtHighSlope )
-  {
-    *(float *)&v128 = 0.0;
-    v2 = 0;
-  }
-  stru_721530.field_84 = -1;
-  stru_721530.field_70 = 0;
-  stru_721530.prolly_normal_d = pParty->field_14_radius;
-  stru_721530.field_8_radius = pParty->field_14_radius >> 1;
-  v126 = 0;
-  stru_721530.field_0 = 1;
-  stru_721530.height = pParty->uPartyHeight - 32;
-  do
-  {
-    stru_721530.position.x = pX;
-    stru_721530.normal.x = pX;
-    stru_721530.velocity.x = v2;
-    stru_721530.position.y = pY;
-    stru_721530.normal.y = pY;
-    stru_721530.normal.z = stru_721530.prolly_normal_d + pZ + 1;
-    stru_721530.position.z = stru_721530.height + pZ + 1;
-    stru_721530.velocity.y = v128;
-    stru_721530.velocity.z = pParty->uFallSpeed;
-    v36 = 0;
-    stru_721530.uSectorID = 0;
-    if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3 )
-      v36 = 13312;
-    if ( stru_721530._47050A(v36) )
-      break;
-    _46E889_collide_against_bmodels(1u);
-    v37 = WorldPosToGridCellZ(pParty->vPosition.y);
-    v38 = WorldPosToGridCellX(pParty->vPosition.x);
-    _46E26D_collide_against_sprites(v38, v37);
-    _46ED8A_collide_against_sprite_objects(4u);
-    for ( i = 0; i < (signed int)uNumActors; ++i )
-      Actor::_46DF1A_collide_against_actor(i, 0);
-    if ( stru_721530.field_7C >= stru_721530.field_6C )
-    {
-      _angle_x = stru_721530.normal2.x;
-      _angle_y = stru_721530.normal2.y;
-      v40 = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
-    }
-    else
-    {
-      _angle_x = pX + fixpoint_mul(stru_721530.field_7C, stru_721530.direction.x);
-      _angle_y = pY + fixpoint_mul(stru_721530.field_7C, stru_721530.direction.y);
-      pModel = (BSPModel *)fixpoint_mul(stru_721530.field_7C, stru_721530.direction.z);
-      v40 = fixpoint_mul(stru_721530.field_7C, stru_721530.direction.z) + pZ;
-    }
-    v122 = v40;
-    ODM_GetFloorLevel(_angle_x, _angle_y, v40, pParty->uPartyHeight, &is_on_water, &bmodel_standing_on_pid, 0);
-    v129 = ODM_GetFloorLevel(_angle_x, pY, v40, pParty->uPartyHeight, &is_on_water, &v97, 0);
-    int v119 = ODM_GetFloorLevel(pX, _angle_y, v40, pParty->uPartyHeight, &is_on_water, &v110, 0);
-    pModel = (BSPModel *)IsTerrainSlopeTooHigh(_angle_x, pY);
-    v42 = IsTerrainSlopeTooHigh(pX, _angle_y);
-    is_not_on_bmodel = false;
-    v118 = v42;
-    if ( !v97 && !v110 && !bmodel_standing_on_pid )
-      is_not_on_bmodel = true;
-    v43 = 1;
-    v44 = 1;
-    if ( bUnderwater || !is_not_on_bmodel )
-	{
-		  pX = _angle_x;
-		  if ( v43 )
-			  pY = _angle_y;
-	}
-	else
-	{
-		if ( pModel && v129 > pZ )
-		  v44 = 0;
-		if ( v118 && v119 > pZ )
-		  v43 = 0;
-		if ( v44 )
-		{
-			  pX = _angle_x;
-			  if ( v43 )
-				  pY = _angle_y;
-		}
-		else if ( v43 )
-		  pY = _angle_y;
-		else
-		{
-			pModel = (BSPModel *)ODM_GetFloorLevel(_angle_x, _angle_y, v40, pParty->uPartyHeight, &is_on_water, &bmodel_standing_on_pid, 0);
-			if ( IsTerrainSlopeTooHigh(_angle_x, _angle_y) && (signed int)pModel <= pZ )
-			{
-			  v43 = 1;
-			  pX = _angle_x;
-			  if ( v43 )
-				  pY = _angle_y;
-			}
-		}
-	}
-    if ( stru_721530.field_7C >= stru_721530.field_6C )
-    {
-      if ( !is_not_on_bmodel )
-      {
-        pX = stru_721530.normal2.x;
-        pY = stru_721530.normal2.y;
-      }
-      pZ = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
-      break;
-    }
-    stru_721530.field_70 += stru_721530.field_7C;
-    pX = _angle_x;
-    pY = _angle_y;
-    v45 = stru_721530.uFaceID;
-    pZ = v40;
-    if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Actor)
-    {
-      if (pParty->Invisible())
-        pParty->pPartyBuffs[PARTY_BUFF_INVISIBILITY].Reset();
-
-      viewparams->bRedrawGameUI = true;
-		v2 = (unsigned __int64)(58500i64 * v2) >> 16;
-		pModel = (BSPModel *)58500;
-		v128 = (unsigned __int64)(58500i64 * v128) >> 16;
-		v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-		++v126;
-		pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-		continue;
-	}
-    if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_Decoration)
-    {
-      v56 = integer_sqrt(v2 * v2 + v128 * v128);
-      v118 = v56;
-      v57 = stru_5C6E00->Atan2(_angle_x - pLevelDecorations[(signed int)stru_721530.uFaceID >> 3].vPosition.x,
-                               _angle_y - pLevelDecorations[(signed int)stru_721530.uFaceID >> 3].vPosition.y);
-      v129 = v57;
-      v58 = (BSPModel *)stru_5C6E00->Cos(v57);
-      pModel = v58;
-      v59 = (signed int)v58 * (signed __int64)v56;
-      v122 = v59 >> 16;
-      v2 = v59 >> 16;
-      v60 = (BSPModel *)stru_5C6E00->Sin(v129);
-      pModel = v60;
-      v61 = (signed int)v60 * (signed __int64)v118;
-      v122 = v61 >> 16;
-      v128 = v61 >> 16;
-    }
-    else
-    {
-      if ( PID_TYPE(stru_721530.uFaceID) == OBJECT_BModel)
-      {
-        pParty->bFlying = false;
-        pModel = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9];
-        //v127 = v46;
-        pODMFace = &pModel->pFaces[((signed int)stru_721530.uFaceID >> 3) & 0x3F];
-        v48 = pODMFace->pBoundingBox.z2 - pODMFace->pBoundingBox.z1;
-        v51 = __OFSUB__(v48, 32);
-        v49 = v48 == 32;
-        v50 = v48 - 32 < 0;
-        v52 = pODMFace->pFacePlane.vNormal.z;
-        v129 = (unsigned __int8)(v50 ^ v51 | v49);
-        v119 = v52 < 46378;
-        if ( bUnderwater == 1 )
-          v119 = 0;
-        if ( pODMFace->uPolygonType == POLYGON_Floor )
-        {
-          if ( pParty->uFallSpeed < 0 )
-            pParty->uFallSpeed = 0;
-          pZ = pModel->pVertices.pVertices[pODMFace->pVertexIDs[0]].z + 1;
-          if ( v2 * v2 + v128 * v128 < 400 )
-          {
-            v2 = 0;
-            *(float *)&v128 = 0.0;
-          }
-          if ( pParty->floor_face_pid != v45 && (pODMFace->uAttributes & FACE_PRESSURE_PLATE))
-          {
-            pParty->floor_face_pid = v45;
-            v103 = pODMFace->sCogTriggeredID;
-          }
-          v2 = (unsigned __int64)(58500i64 * v2) >> 16;
-          pModel = (BSPModel *)58500;
-          v128 = (unsigned __int64)(58500i64 * v128) >> 16;
-          v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-          ++v126;
-          pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-          continue;
-        }
-        if ( !v129 && (pODMFace->uPolygonType != POLYGON_InBetweenFloorAndWall || v119) )// упёрся в столб
-        {
-          v118 = abs(v128 * pODMFace->pFacePlane.vNormal.y + pParty->uFallSpeed * v52 + v2 * pODMFace->pFacePlane.vNormal.x) >> 16;
-          if ((stru_721530.speed >> 3) > v118 )
-            v118 = stru_721530.speed >> 3;
-          v129 = (unsigned __int64)(v118 * (signed __int64)pODMFace->pFacePlane.vNormal.x) >> 16;
-          _walk_speed = (unsigned __int64)(v118 * (signed __int64)pODMFace->pFacePlane.vNormal.y) >> 16;
-          v54 = 0;
-          if ( !v119 )
-          {
-            pModel = (BSPModel *)pODMFace->pFacePlane.vNormal.z;
-            pModel = (BSPModel *)((unsigned __int64)(v118 * (signed __int64)(signed int)pModel) >> 16);
-            v54 = pModel;
-          }
-          pParty->uFallSpeed += (int)v54;
-          v128 += _walk_speed;
-          v2 += v129;
-          v55 = stru_721530.prolly_normal_d
-              - ((signed int)(pODMFace->pFacePlane.dist
-                            + v122 * pODMFace->pFacePlane.vNormal.z
-                            + _angle_y * pODMFace->pFacePlane.vNormal.y
-                            + _angle_x * pODMFace->pFacePlane.vNormal.x) >> 16);
-          if ( v55 > 0 )
-          {
-            pX = _angle_x + (pODMFace->pFacePlane.vNormal.x * v55 >> 16);
-            pY = _angle_y + (pODMFace->pFacePlane.vNormal.y * v55 >> 16);
-            if ( !v119 )
-              pZ = v122 + (pODMFace->pFacePlane.vNormal.z * v55 >> 16);
-          }
-//LABEL_220:
-			v45 = stru_721530.uFaceID;
-			if ( pParty->floor_face_pid != v45 && BYTE3(pODMFace->uAttributes) & 4 )
-			{
-				pParty->floor_face_pid = v45;
-				v103 = pODMFace->sCogTriggeredID;
-			}
-			v2 = (unsigned __int64)(58500i64 * v2) >> 16;
-			pModel = (BSPModel *)58500;
-			v128 = (unsigned __int64)(58500i64 * v128) >> 16;
-			v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-			++v126;
-			pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-			continue;
-        }
-        v118 = abs(v128 * pODMFace->pFacePlane.vNormal.y + pParty->uFallSpeed * v52 + v2 * pODMFace->pFacePlane.vNormal.x) >> 16;
-        if ((stru_721530.speed >> 3) > v118 )
-          v118 = stru_721530.speed >> 3;
-        v122 = pODMFace->pFacePlane.vNormal.x;
-        v122 = (unsigned __int64)(v118 * (signed __int64)(signed int)v122) >> 16;
-        pModel = (BSPModel *)pODMFace->pFacePlane.vNormal.y;
-        pModel = (BSPModel *)((unsigned __int64)(v118 * (signed __int64)(signed int)pModel) >> 16);
-        v129 = pODMFace->pFacePlane.vNormal.z;
-        v129 = (unsigned __int64)(v118 * (signed __int64)v129) >> 16;
-        pParty->uFallSpeed += v129;
-        v2 += v122;
-        v128 += (int)pModel;
-        if ( v2 * v2 + v128 * v128 >= 400 )
-		{
-			v45 = stru_721530.uFaceID;
-			if ( pParty->floor_face_pid != v45 && BYTE3(pODMFace->uAttributes) & 4 )
-			{
-				pParty->floor_face_pid = v45;
-				v103 = pODMFace->sCogTriggeredID;
-			}
-			v2 = (unsigned __int64)(58500i64 * v2) >> 16;
-			pModel = (BSPModel *)58500;
-			v128 = (unsigned __int64)(58500i64 * v128) >> 16;
-			v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-			++v126;
-			pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-			continue;
-		}
-        v2 = 0;
-        pParty->uFallSpeed = 0;
-        *(float *)&v128 = 0.0;
-      }
-    }
-//LABEL_234:
-    v2 = (unsigned __int64)(58500i64 * v2) >> 16;
-    pModel = (BSPModel *)58500;
-    v128 = (unsigned __int64)(58500i64 * v128) >> 16;
-    v122 = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-    ++v126;
-    pParty->uFallSpeed = (unsigned __int64)(58500i64 * pParty->uFallSpeed) >> 16;
-  }
-  while ( v126 < 100 );
-
-  if ( bWalkSound && pParty->walk_sound_timer <= 0 )
-  {
-    v122 = abs(pParty->vPosition.x - pX);
-    v126 = abs(pParty->vPosition.y - pY);
-    v62 = abs(pParty->vPosition.z - pZ);
-    if ( integer_sqrt(v122 * v122 + v126 * v126 + v62 * v62) >= 8 )
-    {
-      if ( party_running_flag && (!hovering || !high_fall_flag) )
-      {
-        if ( !is_not_on_bmodel
-           && !(BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20) )
-          pAudioPlayer->PlaySound(SOUND_RunAlong3DModel, 804, 1, -1, 0, 0, 0, 0);//бег на 3D Modelи
-        else
-        {
-          v87 = pOutdoor->GetSoundIdByPosition(WorldPosToGridCellX(pParty->vPosition.x), WorldPosToGridCellZ(pParty->vPosition.y) - 1, 1);
-          pAudioPlayer->PlaySound((SoundID)v87, 804, 1, -1, 0, 0, 0, 0);//бег по земле
-        }
-      }
-      else if ( party_walking_flag && (!hovering || !high_fall_flag) )
-      {
-        if ( is_not_on_bmodel
-          || BYTE1(pOutdoor->pBModels[pParty->floor_face_pid >> 9].pFaces[(pParty->floor_face_pid >> 3) & 0x3F].uAttributes) & 0x20 )
-        {
-          v87 = pOutdoor->GetSoundIdByPosition(WorldPosToGridCellX(pParty->vPosition.x), WorldPosToGridCellZ(pParty->vPosition.y) - 1, 0);
-          pAudioPlayer->PlaySound((SoundID)v87, 804, 1, -1, 0, 0, 0, 0);// хождение по земле
-        }
-        else
-          pAudioPlayer->PlaySound(SOUND_WalkAlong3DModel, 804, 1, -1, 0, 0, 0, 0);// хождение на 3D Modelи
-      }
-    }
-    else
-    {
-      pAudioPlayer->_4AA258(804);
-      pParty->walk_sound_timer = 64;
-    }
-  }
-
-  if ( !hovering || !high_fall_flag )
-    pParty->uFlags &= ~PARTY_FLAGS_1_FALLING;
-  else
-    pParty->uFlags |= PARTY_FLAGS_1_FALLING;
-  v126 = WorldPosToGridCellX(pParty->vPosition.x);
-  v65 = WorldPosToGridCellZ(pParty->vPosition.y) - 1;
-  unsigned int v114_a = WorldPosToGridCellX(pX);
-  v66 = WorldPosToGridCellZ(pY) - 1;
-  pModel = (BSPModel *)((~(unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(v126, v65) >> 1) & 1);
-  v122 = (~(unsigned int)pOutdoor->ActuallyGetSomeOtherTileInfo(v114_a, v65) >> 1) & 1;
-  v67 = pOutdoor->ActuallyGetSomeOtherTileInfo(v126, v66);
-  v68 = 0;
-  v69 = (~(unsigned int)v67 >> 1) & 1;
-  if ( v114_a == v126 && v66 == v65 && v122 && v69 )
-    v68 = 1;
-  if ( !is_not_on_bmodel )
-    v68 = 1;
-  if ( v68 )
-  {
-    v70 = pZ;
-    v71 = pX;
-    v72 = pY;
-    //pParty->uFallSpeed = v121;
-    v73 = pZ;
-    pParty->vPosition.x = pX;
-    pParty->vPosition.y = pY;
-    pParty->vPosition.z = pZ;
-    pParty->field_6F0 = v113;
-    if ( pZ > 8160 )
-    {
-      v73 = 8160;
-      pParty->uFallStartY = 8160;
-      pParty->vPosition.z = 8160;
-    }
-    if ( !v103
-      || (EventProcessor(v103, 0, 1), pParty->vPosition.x == v71)
-      && pParty->vPosition.y == v72
-      && (v73 = pParty->vPosition.z, pParty->vPosition.z == v70) )
-    {
-      if ( v73 < v111 )
-      {
-        pParty->uFallSpeed = 0;
-        v73 = v105;
-        pParty->vPosition.z = v105;
-        if ( pParty->uFallStartY - v70 > 512 && !bFeatherFall && v70 <= v105 && !bUnderwater )//Fall to the ground(падение на землю с высоты)
-        {
-          if ( pParty->uFlags & PARTY_FLAGS_1_LANDING )
-          {
-            pParty->uFlags &= ~PARTY_FLAGS_1_LANDING;
-          }
-          else
-          {
-            for ( uint i = 1; i <= 4; ++i )
-            {
-              v110 = pPlayers[i]->GetMaxHealth();
-              pPlayers[i]->ReceiveDamage((signed int)((pParty->uFallStartY - v70) * (unsigned __int64)(signed __int64)((double)v110 * 0.1)) / 256,
-                DMGT_PHISYCAL);
-              v110 = 20 - pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualEndurance());
-              pPlayers[i]->SetRecoveryTime((signed __int64)((double)v110 * flt_6BE3A4_debug_recmod1 * 2.133333333333333));
-            }
-            v73 = pParty->vPosition.z;
-          }
-        }
-        pParty->uFallStartY = v70;
-      }
-      if ( v102 && v73 < v109 )
-      {
-        if ( (signed int)(pParty->uPartyHeight + v73) >= v109 )
-        {
-          pParty->vPosition.z = v109 - pParty->uPartyHeight - 1;
-          pParty->field_6F0 = v109 - pParty->uPartyHeight - 1;
-        }
-      }
-      pParty->uFlags &= ~0x204;
-    }
-    return;
-  }
-  //v76 = pParty->bFlying;
-  if ( pParty->bFlying || !high_fall_flag || bWaterWalk || !pModel )
-    v77 = 1;
-  else
-    v77 = v122 != 0;
-  bool party_drowning_flag = false;
-  if ( !pParty->bFlying && high_fall_flag && !bWaterWalk )
-  {
-    if ( pModel )
-    {
-      v78 = v69 != 0;
-    }
-	else
-	{
-		party_drowning_flag = true;
-		v78 = 1;
-	}
-  }
-  else
-	v78 = 1;
-//LABEL_306:
-  if ( v77 )
-  {
-    pParty->vPosition.x = pX;
-  }
-  if ( v78 )
-  {
-    pParty->vPosition.y = pY;
-  }
-  if ( v78 || v77)
-  {
-    if ( bWaterWalk )
-    {
-      pParty->uFlags &= ~PARTY_FLAGS_1_STANDING_ON_WATER;
-      //v79 = 20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 6180178;
-      //*(short *)&stru_5E4C90._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 119] |= 1u;
-      v79 = (int)&stru_5E4C90_MapPersistVars._decor_events[20 * pParty->pPartyBuffs[PARTY_BUFF_WATER_WALK].uOverlayID + 119];
-      *(short *)v79 |= 1u;
-      if ( !v122 || !v69 )
-      {
-        if ( !pParty->bFlying )
-        {
-          v80 = *(short *)v79;
-          pParty->uFlags |= PARTY_FLAGS_1_STANDING_ON_WATER;
-          *(short *)v79 = v80 & 0xFFFE;
-        }
-      }
-    }
-  }
-  else if ( bWalkSound && pParty->walk_sound_timer <= 0 )
-  {
-    pAudioPlayer->_4AA258(804);
-    pParty->walk_sound_timer = 64;
-  }
-//LABEL_318:
-  v81 = pZ;
-  v82 = pZ;
-  pParty->vPosition.z = pZ;
-  if ( pZ > 8160 )
-  {
-    v82 = 8160;
-    pParty->uFallStartY = 8160;
-    pParty->vPosition.z = 8160;
-  }
-  LOWORD(pParty->uFlags) &= 0xFDFBu;
-  //pParty->uFallSpeed = v121;
-  pParty->field_6F0 = v113;
-  if ( party_drowning_flag )
-  {
-    pTerrainHeight = GetTerrainHeightsAroundParty2(pParty->vPosition.x, pParty->vPosition.y, &v110, 1);
-    if ( pParty->vPosition.z <= pTerrainHeight + 1 )//положение группы всегда +1
-      pParty->uFlags |= PARTY_FLAGS_1_WATER_DAMAGE;
-  }
-  if ( !v103
-    || (EventProcessor(v103, 0, 1), pParty->vPosition.x == pX)
-    && pParty->vPosition.y == pY
-    && (v82 = pParty->vPosition.z, pParty->vPosition.z == v81) )
-  {
-    if ( v82 < v111 )
-    {
-      v82 = v105;
-      pParty->uFallSpeed = 0;
-      pParty->vPosition.z = v105;
-      if ( pParty->uFallStartY - v81 > 512 && !bFeatherFall && v81 <= v105 && !bUnderwater )//Fall to the water(падение на воду с высоты)
-      {
-        if ( pParty->uFlags & PARTY_FLAGS_1_LANDING )
-        {
-          pParty->uFlags &= ~PARTY_FLAGS_1_LANDING;
-        }
-        else
-        {
-          for ( uint i = 1; i <= 4; ++i )
-          {
-            v110 = pPlayers[i]->GetMaxHealth();
-            pPlayers[i]->ReceiveDamage((signed int)((pParty->uFallStartY - v81) * (unsigned __int64)(signed __int64)((double)v110 * 0.1)) / 256,
-              DMGT_PHISYCAL);
-            v110 = 20 - pPlayers[i]->GetParameterBonus(pPlayers[i]->GetActualEndurance());
-            pPlayers[i]->SetRecoveryTime((signed __int64)((double)v110 * flt_6BE3A4_debug_recmod1 * 2.133333333333333));
-          }
-          v82 = pParty->vPosition.z;
-        }
-      }
-      pParty->uFallStartY = v81;
-    }
-    if ( v102 && v82 < v109 && (signed int)(pParty->uPartyHeight + v82) >= v109 )
-    {
-      pParty->vPosition.z = v82 + pParty->uPartyHeight - v109 + 1;
-      pParty->field_6F0 = v82 + pParty->uPartyHeight - v109 + 1;
-    }
-  }
-}
-
 //----- (0047531C) --------------------------------------------------------
 bool __fastcall sub_47531C(int a1, int *a2, int a3, int a4, int a5, int a6, int a7, int a8, BLVFace *a9, int a10)
 {
--- a/mm7_4.cpp	Tue Nov 26 18:45:03 2013 +0600
+++ b/mm7_4.cpp	Tue Nov 26 18:45:08 2013 +0600
@@ -76,221 +76,6 @@
 }
 // 6836C8: using guessed type int 6836C8_num_decorations_6807E8;
 
-//----- (0046D8E3) --------------------------------------------------------
-int __fastcall sub_46D8E3(int a1, signed int a2, int a3, int a4)
-{
-  int v4; // ebx@1
-  unsigned int v5; // ecx@1
-  BSPModel *v6; // edi@3
-  ODMFace *v7; // esi@10
-  unsigned __int8 v8; // al@10
-  signed __int16 *v9; // eax@18
-  int v10; // edx@19
-  int v11; // ecx@21
-  int v12; // ecx@23
-  signed int v13; // eax@25
-  int v14; // edx@27
-  int v15; // edx@29
-  int v16; // ST18_4@29
-  signed int v17; // edx@29
-  signed __int64 v18; // qtt@29
-  int v19; // eax@35
-  signed int v20; // ecx@37
-  signed int v22; // ebx@42
-  unsigned int v23; // esi@43
-  int v24; // edx@44
-  int v25; // eax@44
-  int v26; // [sp+Ch] [bp-38h]@7
-  int v27; // [sp+10h] [bp-34h]@21
-  int v28; // [sp+18h] [bp-2Ch]@21
-  int v29; // [sp+1Ch] [bp-28h]@2
-  unsigned int v30; // [sp+20h] [bp-24h]@8
-  signed int v31; // [sp+24h] [bp-20h]@1
-  signed int v32; // [sp+28h] [bp-1Ch]@1
-  int v33; // [sp+2Ch] [bp-18h]@7
-  bool v34; // [sp+30h] [bp-14h]@21
-  bool v35; // [sp+34h] [bp-10h]@23
-  signed int v36; // [sp+38h] [bp-Ch]@17
-  signed int v37; // [sp+38h] [bp-Ch]@21
-  signed int v38; // [sp+38h] [bp-Ch]@42
-  signed int v39; // [sp+3Ch] [bp-8h]@1
-  signed int v40; // [sp+40h] [bp-4h]@1
-
-  dword_720ED0[0] = -1;
-  dword_720E80[0] = -1;
-  v4 = a1;
-  v5 = 0;
-  v40 = a2;
-  v31 = v4;
-  v39 = 1;
-  dword_720F20[0] = 10000;
-  if ( (signed int)pOutdoor->uNumBModels > 0 )
-  {
-    v29 = 0;
-    for ( v32 = 0; v32 < (signed int)pOutdoor->uNumBModels; ++v32 )
-    {
-      v6 = &pOutdoor->pBModels[v29];
-      if ( v4 <= pOutdoor->pBModels[v29].sMaxX )
-      {
-        if ( v4 >= v6->sMinX )
-        {
-          if ( v40 <= v6->sMaxY )
-          {
-            if ( v40 >= v6->sMinY )
-            {
-              v33 = v5;
-              v26 = v6->uNumFaces;
-              if ( (signed int)v6->uNumFaces > (signed int)v5 )
-              {
-                v30 = v5;
-                while ( 1 )
-                {
-                  v7 = (ODMFace *)((char *)v6->pFaces + v30);
-                  v8 = v7->uPolygonType;
-                  if ( (v8 == 5 || v8 == 6)
-                    && !(BYTE3(v7->uAttributes) & 0x20)
-                    && v4 <= v7->pBoundingBox.x2
-                    && v4 >= v7->pBoundingBox.x1
-                    && v40 <= v7->pBoundingBox.y2
-                    && v40 >= v7->pBoundingBox.y1 )
-                  {
-                    v36 = v5;
-                    if ( v7->uNumVertices )
-                    {
-                      v9 = v7->pXInterceptDisplacements;
-                      do
-                      {
-                        v10 = 2 * v36;
-                        word_720DB0_xs[2 * v36] = *v9 + LOWORD(v6->pVertices.pVertices[*(v9 - 60)].x);
-                        word_720CE0_ys[2 * v36] = v9[20] + LOWORD(v6->pVertices.pVertices[*(v9 - 60)].y);
-                        word_720DB0_xs[2 * v36++ + 1] = *v9 + LOWORD(v6->pVertices.pVertices[*(v9 - 59)].x);
-                        word_720CE0_ys[v10 + 1] = v9[20] + LOWORD(v6->pVertices.pVertices[*(v9 - 59)].y);
-                        ++v9;
-                      }
-                      while ( v36 < v7->uNumVertices );
-                      v4 = v31;
-                    }
-                    v27 = 2 * v7->uNumVertices;
-                    word_720DB0_xs[2 * v7->uNumVertices] = word_720DB0_xs[0];
-                    word_720CE0_ys[v27] = word_720CE0_ys[0];
-                    v11 = 0;
-                    v34 = word_720CE0_ys[0] >= v40;
-                    v37 = 0;
-                    v28 = 0;
-                    if ( v27 > 0 )
-                    {
-                      do
-                      {
-                        if ( v37 >= 2 )
-                          break;
-                        v12 = v11;
-                        v4 = v31;
-                        v35 = word_720CE0_ys[v12 + 1] >= v40;
-                        if ( v34 != v35 )
-                        {
-                          v13 = word_720DB0_xs[v12 + 1] >= v31 ? 0 : 2;
-                          v14 = v13 | (word_720DB0_xs[v12] < v31);
-                          if ( v14 != 3 )
-                          {
-                            if ( !v14
-                              || (v15 = word_720CE0_ys[v12],
-                                  v16 = word_720CE0_ys[v12 + 1] - v15,
-                                  v17 = v40 - v15,
-                                  LODWORD(v18) = v17 << 16,
-                                  HIDWORD(v18) = v17 >> 16,
-                                  (signed int)(((unsigned __int64)(((signed int)word_720DB0_xs[v12 + 1]
-                                                                  - (signed int)word_720DB0_xs[v12])
-                                                                 * v18
-                                                                 / v16) >> 16)
-                                             + word_720DB0_xs[v12]) >= v31) )
-                              ++v37;
-                          }
-                        }
-                        v11 = v28 + 1;
-                        v34 = v35;
-                        ++v28;
-                      }
-                      while ( v28 < v27 );
-                      if ( v37 == 1 )
-                      {
-                        if ( v39 >= 20 )
-                          break;
-                        if ( v7->uPolygonType == 5 )
-                          v19 = v6->pVertices.pVertices[v7->pVertexIDs[0]].z;
-                        else
-                          v19 = ((unsigned __int64)(v7->zCalc1 * (signed __int64)v4) >> 16)
-                              + ((unsigned __int64)(v7->zCalc2 * (signed __int64)v40) >> 16)
-                              + HIWORD(v7->zCalc3);
-                        v20 = v39++;
-                        dword_720F20[v20] = v19;
-                        dword_720ED0[v20] = v32;
-                        dword_720E80[v20] = v33;
-                      }
-                    }
-                  }
-                  ++v33;
-                  v30 += 308;
-                  if ( v33 >= v26 )
-                    break;
-                  v5 = 0;
-                }
-              }
-            }
-          }
-        }
-      }
-      //++v32;
-      ++v29;
-      v5 = 0;
-    }
-    //while ( v32 < (signed int)pOutdoor->uNumBModels );
-    if ( !v39 )
-    {
-      *(int *)a4 = 0;
-      return dword_720F20[0];
-    }
-  }
-  v22 = 0;
-  v38 = v5;
-  if ( v39 > (signed int)v5 )
-  {
-	  v23 = 0;
-	  do
-	  {
-		v24 = dword_720F20[v5 / 4];
-		v25 = *(int *)((char *)dword_720F20.data() + v23);
-		if ( v24 == v25 )
-		{
-		  v22 = v38;
-		  v23 = v5;
-		}
-		else if ( v25 > a3 + 15 )
-		{
-		  if ( v24 < v25 )
-		  {
-			  v22 = v38;
-			  v23 = v5;
-		  }
-		}
-		else if ( v24 > v25 && v24 <= a3 + 15 )
-		{
-		  v22 = v38;
-		  v23 = v5;
-		}
-		++v38;
-		v5 += 4;
-	  }
-	  while ( v38 < v39 );
-	  if ( v22 )
-	  {
-		*(int *)a4 = dword_720E80[v22] | (dword_720ED0[v22] << 6);
-		return dword_720F20[v22];
-	  }
-  }
-  *(int *)a4 = 0;
-  return dword_720F20[v22];
-}
-
 //----- (0046DEF2) --------------------------------------------------------
 unsigned int __fastcall sub_46DEF2(signed int a2, unsigned int uLayingItemID)
 {
--- a/mm7_data.cpp	Tue Nov 26 18:45:03 2013 +0600
+++ b/mm7_data.cpp	Tue Nov 26 18:45:08 2013 +0600
@@ -1235,7 +1235,7 @@
 std::array<__int16, 777> word_720DB0_xs; // idb
 std::array<int, 20> dword_720E80;
 std::array<int, 20> dword_720ED0;
-std::array<int, 20> dword_720F20;
+std::array<int, 20> ceiling_height_level;
 std::array<__int16, 777> word_720F70; // idb
 std::array<__int16, 777> word_721040; // idb
 std::array<int, 777> dword_721110; // idb
--- a/mm7_data.h	Tue Nov 26 18:45:03 2013 +0600
+++ b/mm7_data.h	Tue Nov 26 18:45:08 2013 +0600
@@ -885,7 +885,7 @@
 extern std::array<__int16, 777> word_720DB0_xs; // idb
 extern std::array<int, 20> dword_720E80;
 extern std::array<int, 20> dword_720ED0;
-extern std::array<int, 20> dword_720F20;
+extern std::array<int, 20> ceiling_height_level;
 extern std::array<__int16, 777> word_720F70; // idb
 extern std::array<__int16, 777> word_721040; // idb
 extern std::array<int, 777> dword_721110; // idb
@@ -1273,7 +1273,7 @@
 bool __fastcall _46BFFA_check_object_intercept(unsigned int uLayingItemID, signed int a2);
 int BLV_GetFloorLevel(int x, int y, int z, unsigned int uSectorID, unsigned int *pFaceID);
 int ODM_GetFloorLevel(int X, signed int Y, int Z, int, int *pOnWater, int *bmodel_pid, int bWaterWalk);
-int __fastcall sub_46D8E3(int a1, signed int a2, int a3, int a4);
+int GetCeilingHeight(int Party_X, signed int Party_Y, int Party_ZHeight, int pFaceID);
 void ODM_GetTerrainNormalAt(int pos_x, int pos_z, Vec3_int_ *out);
 unsigned int __fastcall sub_46DEF2(signed int a2, unsigned int uLayingItemID);
 void _46E0B2_collide_against_decorations();