# HG changeset patch
# User Ritor1
# Date 1385469908 -21600
# Node ID 8622640ffa8f95d4fbf634db645407254eb8d530
# Parent da35dc35d6353d8ab1eea81d14ecb89ea5bc2171# Parent 2ccf638342d6b73283f4b07272c8540b14616afb
Merge
diff -r da35dc35d635 -r 8622640ffa8f Build/Visual Studio 2010/World of Might and Magic.vcxproj
--- 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 @@
$(Configuration)\
$(WoMM_MM7_INSTALL_DIR)\
false
+ $(SolutionDir)../../;$(IncludePath)
false
@@ -63,6 +64,9 @@
..\..\lib\legacy_dx\lib\ddraw.lib;..\..\lib\legacy_dx\lib\dxguid.lib;%(AdditionalDependencies)
$(OutDir)$(TargetName)$(TargetExt)
+
+ XCOPY "$(SolutionDir)../../Scripts" "$(OutDir)data/scripts/lua/core" /E /I /F /R /Y
+
@@ -142,8 +146,6 @@
-
-
@@ -171,6 +173,7 @@
+
@@ -320,7 +323,6 @@
-
@@ -333,6 +335,7 @@
+
@@ -375,6 +378,13 @@
+
+
+ Document
+ call "../../lib/swig" "%(FileName)" %(RelativeDir) "%(FileName)%(Extension)" "%(FullPath)" "$(SolutionDir)" %(Filename)_wrap.cxx
+ %(Filename)_wrap.cxx
+
+
diff -r da35dc35d635 -r 8622640ffa8f Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters
--- 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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -143,14 +77,214 @@
-
-
+
+ NewUI
+
+
+ NewUI\Core
+
+
+ Level
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\legacy_dx
+
+
+ lib\lua
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ UI
+
+
+ UI
+
@@ -180,12 +314,26 @@
{2b5db0d5-d6c8-4aad-b295-ac2b5df51fb2}
-
+
+ {247dd8f2-a9fc-4e53-bc8c-d8bbe255bfe4}
+
+
+ {410b9d18-77b5-461d-8b23-ba841039152e}
+
+
{cb1041ae-addb-49d8-9ec1-ffe52d29ae64}
-
+
+ lib\legacy_dx
+
+
+ lib
+
+
+ lib\swig\swigwin-2.0.11
+
@@ -214,53 +362,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -275,7 +376,6 @@
-
@@ -301,34 +401,214 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- lib\swig\swiwin-2.0.11
+
+ NewUI\Core
+
+
+ NewUI
+
+
+ Level
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
-
- lib\swig\swiwin-2.0.11
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\lua\lua-5.2.2
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ lib\zlib
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI
+
+
+ UI\Books
+
+
+ UI\Books
+
+
+ UI\Books
+
+
+ NewUI\Core
+
+
\ No newline at end of file
diff -r da35dc35d635 -r 8622640ffa8f Outdoor.cpp
--- 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
diff -r da35dc35d635 -r 8622640ffa8f lib/swig.bat
--- 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
diff -r da35dc35d635 -r 8622640ffa8f lib/swig/swigwin-2.0.11/UIControlModule.swig
--- 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
diff -r da35dc35d635 -r 8622640ffa8f mm7_2.cpp
--- 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;
diff -r da35dc35d635 -r 8622640ffa8f mm7_3.cpp
--- 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)
{
diff -r da35dc35d635 -r 8622640ffa8f mm7_4.cpp
--- 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)
{
diff -r da35dc35d635 -r 8622640ffa8f mm7_data.cpp
--- 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 dword_720E80;
std::array dword_720ED0;
-std::array dword_720F20;
+std::array ceiling_height_level;
std::array<__int16, 777> word_720F70; // idb
std::array<__int16, 777> word_721040; // idb
std::array dword_721110; // idb
diff -r da35dc35d635 -r 8622640ffa8f mm7_data.h
--- 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 dword_720E80;
extern std::array dword_720ED0;
-extern std::array dword_720F20;
+extern std::array ceiling_height_level;
extern std::array<__int16, 777> word_720F70; // idb
extern std::array<__int16, 777> word_721040; // idb
extern std::array 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();