diff mm7_3.cpp @ 853:7ada14f991f5

Слияние
author Ritor1
date Sat, 30 Mar 2013 09:40:15 +0600
parents e3609dd06c15 39503542470c
children 06fc66ceecd6
line wrap: on
line diff
--- a/mm7_3.cpp	Sat Mar 30 09:40:05 2013 +0600
+++ b/mm7_3.cpp	Sat Mar 30 09:40:15 2013 +0600
@@ -862,15 +862,15 @@
 void __cdecl UpdateActors_ODM()
 {
   Actor *v0; // esi@2
-  unsigned __int16 v1; // ax@2
-  unsigned int v2; // ecx@6
+  AIState uAIState; // ax@2
+  //unsigned int v2; // ecx@6
   int v3; // ebx@6
-  int v4; // eax@8
+  //int v4; // eax@8
   int v5; // eax@10
   int v6; // ecx@10
-  signed int v7; // ebx@10
+  //signed int v7; // ebx@10
   signed int v8; // ebx@17
-  unsigned __int8 v9; // zf@17
+  //unsigned __int8 v9; // zf@17
   unsigned __int8 v10; // sf@17
   unsigned __int16 v11; // ax@21
   int v12; // eax@29
@@ -878,7 +878,7 @@
   int v14; // eax@30
   unsigned __int64 v15; // qax@30
   int v16; // eax@33
-  int v17; // edi@34
+  //int v17; // edi@34
   int v18; // edx@42
   int v19; // ecx@42
   __int16 v20; // ax@42
@@ -895,7 +895,7 @@
   int v31; // edi@57
   signed int i; // ebx@57
   unsigned int v33; // ecx@58
-  int v34; // ebx@64
+  //int v34; // ebx@64
   int v35; // edi@64
   int v36; // eax@64
   unsigned __int16 v37; // cx@66
@@ -915,7 +915,7 @@
   unsigned __int64 v51; // qax@85
   unsigned __int8 v52; // zf@87
   unsigned __int8 v53; // sf@87
-  unsigned __int8 v54; // of@104
+ // unsigned __int8 v54; // of@104
   int v55; // eax@107
   unsigned int v56; // edi@107
   int v57; // ST10_4@107
@@ -929,71 +929,64 @@
   int v65; // [sp+20h] [bp-30h]@2
   int v66; // [sp+24h] [bp-2Ch]@2
   bool v67; // [sp+28h] [bp-28h]@10
-  unsigned int v68; // [sp+2Ch] [bp-24h]@10
+  //unsigned int v68; // [sp+2Ch] [bp-24h]@10
   unsigned int v69; // [sp+30h] [bp-20h]@6
   unsigned int v70; // [sp+34h] [bp-1Ch]@10
   int v71; // [sp+38h] [bp-18h]@62
-  int v72; // [sp+3Ch] [bp-14h]@10
+  int uIsAboveFloor; // [sp+3Ch] [bp-14h]@10
+  int v72b;
   int v73; // [sp+40h] [bp-10h]@17
-  int v74; // [sp+44h] [bp-Ch]@8
+  int uIsFlying; // [sp+44h] [bp-Ch]@8
   unsigned int v75; // [sp+48h] [bp-8h]@1
-  int v76; // [sp+4Ch] [bp-4h]@10
-
-  v75 = 0;
-  if ( (signed int)uNumActors <= 0 )
-    return;
-  do
+  int uIsOnWater; // [sp+4Ch] [bp-4h]@10
+
+  for(v75=0;(signed int)v75 < (signed int)uNumActors;++v75)
   {
     v0 = &pActors[v75];
     v66 = v0->vPosition.x;
     v65 = v0->vPosition.y;
-    v1 = v0->uAIState;
-    if ( v1 == 11 || v1 == 19 || v1 == 17 || !v0->uMovementSpeed )
-      goto LABEL_121;
-    v2 = v0->pMonsterInfo.uID;
+    uAIState = v0->uAIState;
+    if ( uAIState == Removed || uAIState == Disabled || uAIState == Summoned || !v0->uMovementSpeed )
+	{
+		continue;
+	}
     v3 = 0;
     v69 = 0;
-    if ( MonsterStats::BelongsToSupertype(v2, MONSTER_SUPERTYPE_WATER_ELEMENTAL) )
+    if ( MonsterStats::BelongsToSupertype(v0->pMonsterInfo.uID, MONSTER_SUPERTYPE_WATER_ELEMENTAL) )
       v3 = 1;
-    v4 = v0->pMonsterInfo.uFlying;
     v0->uSectorID = 0;
-    v74 = v4;
+    uIsFlying = v0->pMonsterInfo.uFlying;
     if ( !v0->CanAct() )
-      v74 = 0;
+      uIsFlying = 0;
     v70 = IsTerrainSlopeTooHigh(v0->vPosition.x, v0->vPosition.y);
     v5 = ODM_GetFloorLevel(
            v0->vPosition.x,
            v0->vPosition.y,
            v0->vPosition.z,
            v0->uActorHeight,
-           &v76,
+           &uIsOnWater,
            (int *)&v69,
            v3);
     v6 = v0->vPosition.z;
-    v7 = v5;
-    v68 = v5;
-    v72 = 0;
+    uIsAboveFloor = 0;
     v67 = v69 == 0;
     if ( v6 > v5 + 1 )
-      v72 = 1;
-    if ( v0->uAIState == 5 && v76 && !v72 )
+      uIsAboveFloor = 1;
+    if ( uAIState == Dead && uIsOnWater && !uIsAboveFloor )
     {
       v0->uAIState = Removed;
-      goto LABEL_121;
+	  continue;
     }
     if ( v0->uCurrentActionAnimation == ANIM_Walking )
     {
       v8 = v0->uMovementSpeed;
-      v9 = HIDWORD(v0->pActorBuffs[7].uExpireTime) == 0;
-      v10 = SHIDWORD(v0->pActorBuffs[7].uExpireTime) < 0;
       v73 = v0->uMovementSpeed;
-      if ( !v10 && (!(v10 | v9) || LODWORD(v0->pActorBuffs[7].uExpireTime) > 0) )
+      if ( (signed __int64)v0->pActorBuffs[7].uExpireTime > 0 )
       {
         v8 = (signed __int64)((double)v73 * 0.5);
         v73 = (signed __int64)((double)v73 * 0.5);
       }
-      v11 = v0->uAIState;
-      if ( v11 == 7 || v11 == 6 )
+      if ( uAIState == Fleeing || uAIState == Pursuing )
       {
         v8 *= 2;
         v73 = v8;
@@ -1003,15 +996,13 @@
       if ( v8 > 1000 )
         v8 = 1000;
       v12 = stru_5C6E00->Cos(v0->uYawAngle);
-      v69 = v12;
       v13 = v12 * (signed __int64)v8;
       v73 = v13 >> 16;
       v0->vVelocity.x = WORD1(v13);
       v69 = stru_5C6E00->Sin(v0->uYawAngle);
       v73 = (unsigned __int64)((signed int)v69 * (signed __int64)v8) >> 16;
-      v9 = v74 == 0;
       v0->vVelocity.y = v69 * v8 >> 16;
-      if ( !v9 )
+      if ( uIsFlying )
       {
         v14 = stru_5C6E00->Sin(v0->uPitchAngle);
         v69 = v14;
@@ -1019,7 +1010,7 @@
         v73 = v15 >> 16;
         v0->vVelocity.z = WORD1(v15);
       }
-      v7 = v68;
+      //v7 = v68;
     }
     else
     {
@@ -1029,9 +1020,8 @@
       v0->vVelocity.x = v73;
       v73 = v0->vVelocity.y;
       v73 = (unsigned __int64)((signed int)v69 * (signed __int64)v73) >> 16;
-      v9 = v74 == 0;
       v0->vVelocity.y = v73;
-      if ( !v9 )
+      if ( uIsFlying )
       {
         v69 = 55000;
         v73 = v0->vVelocity.z;
@@ -1039,20 +1029,20 @@
         v0->vVelocity.z = v73;
       }
     }
-    if ( v0->vPosition.z < v7 )
-    {
-      v16 = v74;
-      v0->vPosition.z = v7;
+    if ( v0->vPosition.z < v5 )
+    {
+      v16 = uIsFlying;
+      v0->vPosition.z = v5;
       v0->vVelocity.z = v16 != 0 ? 0x14 : 0;
     }
-    v17 = 0;
-    if ( !v72 || v74 )
-    {
-      if ( v70 && !v72 && v67 )
+    //v17 = 0;
+    if ( !uIsAboveFloor || uIsFlying )
+    {
+      if ( v70 && !uIsAboveFloor && v67 )
       {
         v18 = v0->vPosition.y;
         v19 = v0->vPosition.x;
-        v0->vPosition.z = v7;
+        v0->vPosition.z = v5;
         ODM_GetTerrainNormalAt(v19, v18, &v62);
         v20 = GetGravityStrength();
         v21 = v62.y;
@@ -1060,22 +1050,22 @@
         v23 = v62.y * v0->vVelocity.y;
         v0->vVelocity.z += -8 * LOWORD(pEventTimer->uTimeElapsed) * v20;
         v73 = abs(v62.x * v0->vVelocity.x + v22 * v0->vVelocity.z + v23) >> 16;
-        v72 = v21;
+        v72b = v21;
         v0->vVelocity.x += (unsigned int)(v73 * v62.x) >> 16;
-        v72 = (unsigned __int64)(v73 * (signed __int64)v72) >> 16;
-        v24 = v72;
-        v72 = v22;
+        v72b = (unsigned __int64)(v73 * (signed __int64)v72b) >> 16;
+        v24 = v72b;
+        v72b = v22;
         v0->vVelocity.y += v24;
-        v72 = (unsigned __int64)(v73 * (signed __int64)v72) >> 16;
-        v0->vVelocity.z += v72;
-        v17 = 0;
+        v72b = (unsigned __int64)(v73 * (signed __int64)v72b) >> 16;
+        v0->vVelocity.z += v72b;
+        //v17 = 0;
       }
     }
     else
     {
       v0->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
     }
-    if ( pParty->armageddon_timer != v17 && v0->CanAct() )
+    if ( pParty->armageddon_timer != 0 && v0->CanAct() )
     {
       v0->vVelocity.x += rand() % 100 - 50;
       v0->vVelocity.y += rand() % 100 - 50;
@@ -1085,14 +1075,13 @@
       v0->uYawAngle += v25 % 32 - 16;
       v0->UpdateAnimation();
     }
-    if ( v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y < 400 && v70 == v17 )
-    {
-      v0->vVelocity.y = v17;
-      v0->vVelocity.x = v17;
-    }
-    v9 = v0->pMonsterInfo.uFlying == 0;
+    if ( v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y < 400 && v70 == 0 )
+    {
+      v0->vVelocity.y = 0;
+      v0->vVelocity.x = 0;
+    }
     stru_721530.field_0 = 1;
-    if ( v9 )
+    if ( !uIsFlying )
       v26 = 40;
     else
       v26 = v0->uActorRadius;
@@ -1101,8 +1090,8 @@
     stru_721530.field_8 = v26;
     stru_721530.prolly_normal_d = v26;
     stru_721530.field_C = v27;
-    stru_721530.field_70 = v17;
-    v69 = v17;
+    stru_721530.field_70 = 0;
+    v69 = 0;
     while ( 1 )
     {
       stru_721530.field_34.x = v0->vPosition.x;
@@ -1136,7 +1125,7 @@
       v71 = i > 1;
       if ( stru_721530.field_7C < stru_721530.field_6C )
         v70 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
-      v34 = 0;
+      //v34 = 0;
       v35 = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
       v36 = ODM_GetFloorLevel(
               stru_721530.normal2.x,
@@ -1146,7 +1135,7 @@
               (int *)&v63,
               &v64,
               0);
-      if ( v76 )
+      if ( uIsOnWater )
       {
         if ( v35 < v36 + 60 )
         {
@@ -1156,7 +1145,7 @@
             if ( v64 )
               v61 = v36 + 30;
             else
-              v61 = v68 + 60;
+              v61 = v5 + 60;
             sub_42F960_create_object(v0->vPosition.x, v0->vPosition.y, v61);
             v0->uAIState = Removed;
             return;
@@ -1170,60 +1159,64 @@
         v0->vPosition.z = LOWORD(stru_721530.normal2.z) - LOWORD(stru_721530.prolly_normal_d) - 1;
         break;
       }
-      v72 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
+      v72b = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
       v0->vPosition.x += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.x) >> 16;
-      v72 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
+      v72b = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
       v0->vPosition.y += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.y) >> 16;
-      v72 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
+      v72b = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
       v38 = stru_721530.uFaceID;
       v0->vPosition.z += (unsigned int)(stru_721530.field_7C * stru_721530.field_58.z) >> 16;
       stru_721530.field_70 += stru_721530.field_7C;
       v39 = v38 >> 3;
-      switch ( v38 & 7 )
-      {
-        case 3:
-          if ( pParty->bTurnBasedModeOn != 1 )
-            goto LABEL_97;
-          if ( pTurnEngine->field_4 != 2 && pTurnEngine->field_4 != 3 )
-          {
-            v34 = 0;
-LABEL_97:
+      switch ( PID_TYPE(v38) )
+      {
+        case OBJECT_Actor:
+          if ( pTurnEngine->field_4 != 2 && pTurnEngine->field_4 != 3 || pParty->bTurnBasedModeOn != 1 )
+          {
+			//if(pParty->bTurnBasedModeOn == 1)
+				//v34 = 0;
             if ( v0->pMonsterInfo.uHostilityType )
             {
-              if ( v71 == v34 )
-                goto LABEL_99;
-LABEL_101:
-              Actor::AI_StandOrBored(v75, 4, v34, (AIDirection *)v34);
-              break;
+              if ( v71 == 0 )
+			  {
+				  Actor::_402968(v75, v38, 0, (AIDirection *)0);
+			  }
+			  else
+			  {
+				  Actor::AI_StandOrBored(v75, 4, 0, (AIDirection *)0);
+			  }
             }
-            if ( v71 != v34 )
-              goto LABEL_101;
-            if ( pActors[v39].pMonsterInfo.uHostilityType )
+            else if ( v71 != 0 )
+			{
+              Actor::AI_StandOrBored(v75, 4, 0, (AIDirection *)0);
+			}
+			else if ( pActors[v39].pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly )
             {
-LABEL_99:
-              Actor::_402968(v75, v38, v34, (AIDirection *)v34);
-              break;
+              Actor::_402968(v75, v38, 0, (AIDirection *)0);
             }
-LABEL_103:
-            Actor::FaceObject(v75, v38, v34, (AIDirection *)v34);
-            break;
+			else
+			{
+				Actor::FaceObject(v75, v38, 0, (AIDirection *)0);
+			}
           }
           break;
-        case 4:
+        case OBJECT_Player:
           if ( !v0->GetActorsRelation(0) )
           {
             v38 = stru_721530.uFaceID;
-            goto LABEL_103;
+            Actor::FaceObject(v75, v38, 0, (AIDirection *)0);
+            break;
           }
           v52 = HIDWORD(pParty->pPartyBuffs[11].uExpireTime) == 0;
           v53 = SHIDWORD(pParty->pPartyBuffs[11].uExpireTime) < 0;
           v0->vVelocity.y = 0;
           v0->vVelocity.x = 0;
-          if ( !v53 && (!(v53 | v52) || LODWORD(pParty->pPartyBuffs[11].uExpireTime) > 0) )
+          //if ( !v53 && (!(v53 | v52) || LODWORD(pParty->pPartyBuffs[11].uExpireTime) > 0) )
+		  if ( (signed __int64)pParty->pPartyBuffs[11].uExpireTime < 0)
             pParty->pPartyBuffs[11].Reset();
           viewparams->bRedrawGameUI = 1;
           break;
-        case 5:
+        case OBJECT_Decoration:
           v47 = integer_sqrt(v0->vVelocity.x * v0->vVelocity.x + v0->vVelocity.y * v0->vVelocity.y);
           v48 = stru_5C6E00->Atan2(
                   v0->vPosition.x - pLevelDecorations[v39].vPosition.x,
@@ -1238,7 +1231,7 @@
           v70 = v51 >> 16;
           v0->vVelocity.y = WORD1(v51);
           break;
-        case 6:
+        case OBJECT_BModel:
           v40 = &pOutdoor->pBModels[v38 >> 9];
           v41 = &v40->pFaces[v39 & 0x3F];
           if ( !(BYTE3(v41->uAttributes) & 0x20) )
@@ -1258,16 +1251,16 @@
             }
             else
             {
-              v72 = abs(v41->pFacePlane.vNormal.y * v0->vVelocity.y + v41->pFacePlane.vNormal.z * v0->vVelocity.z
+              v72b = abs(v41->pFacePlane.vNormal.y * v0->vVelocity.y + v41->pFacePlane.vNormal.z * v0->vVelocity.z
                                                                     + v41->pFacePlane.vNormal.x * v0->vVelocity.x) >> 16;
-              if ( stru_721530.field_64 >> 3 > v72 )
-                v72 = stru_721530.field_64 >> 3;
+              if ( stru_721530.field_64 >> 3 > v72b )
+                v72b = stru_721530.field_64 >> 3;
               v73 = v41->pFacePlane.vNormal.x;
-              v73 = (unsigned __int64)(v72 * (signed __int64)v73) >> 16;
+              v73 = (unsigned __int64)(v72b * (signed __int64)v73) >> 16;
               v71 = v41->pFacePlane.vNormal.y;
-              v71 = (unsigned __int64)(v72 * (signed __int64)v71) >> 16;
+              v71 = (unsigned __int64)(v72b * (signed __int64)v71) >> 16;
               v70 = v41->pFacePlane.vNormal.z;
-              v70 = (unsigned __int64)(v72 * (signed __int64)(signed int)v70) >> 16;
+              v70 = (unsigned __int64)(v72b * (signed __int64)(signed int)v70) >> 16;
               v0->vVelocity.x += v73;
               v0->vVelocity.y += v71;
               v0->vVelocity.z += v70;
@@ -1302,35 +1295,26 @@
       v70 = v0->vVelocity.z;
       v70 = (unsigned __int64)(v71 * (signed __int64)(signed int)v70) >> 16;
       ++v69;
-      v54 = v69 < 100;
-      v10 = (v69 - 100) < 0;
+      //v54 = v69 < 100;
+      //v10 = (v69 - 100) < 0;
       v0->vVelocity.z = v70;
-      if ( !(v10 ^ v54) )
+      if ( v69 >= 100 )
         break;
       v26 = stru_721530.prolly_normal_d;
     }
-    v69 = WorldPosToGridCellX(v66);
-    v55 = WorldPosToGridCellZ(v65);
-    v56 = v55 - 1;
-    v57 = v0->vPosition.x;
-    v71 = v55 - 1;
-    v68 = WorldPosToGridCellX(v57);
-    v70 = WorldPosToGridCellZ(v0->vPosition.y) - 1;
-    v58 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(v69, v56) >> 1) & 1;
-    v59 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(v68, v70) >> 1) & 1;
-    v60 = 0;
-    if ( v69 == v68 && v71 == v70 && v58 )
-      v60 = 1;
-    if ( !v67 )
-      v60 = 1;
-    if ( !v60 )
+    v58 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(WorldPosToGridCellX(v66), WorldPosToGridCellZ(v65) - 1) >> 1) & 1;
+    v59 = ((unsigned int)~pOutdoor->ActuallyGetSomeOtherTileInfo(WorldPosToGridCellX(v0->vPosition.x), WorldPosToGridCellZ(v0->vPosition.y) - 1) >> 1) & 1;
+    if ( WorldPosToGridCellX(v66) == WorldPosToGridCellX(v0->vPosition.x) 
+		&& WorldPosToGridCellZ(v65) == WorldPosToGridCellZ(v0->vPosition.y)
+		&& v58 
+		|| v67 != 0 )
     {
       if ( MonsterStats::BelongsToSupertype(v0->pMonsterInfo.uID, MONSTER_SUPERTYPE_WATER_ELEMENTAL) )
       {
         v58 = v58 == 0;
         v59 = v59 == 0;
       }
-      if ( !v74 && v58 && !v59 )
+      if ( !uIsFlying && v58 && !v59 )
       {
         v0->vPosition.x = v66;
         v0->vPosition.y = v65;
@@ -1343,10 +1327,7 @@
         }
       }
     }
-LABEL_121:
-    ++v75;
-  }
-  while ( (signed int)v75 < (signed int)uNumActors );
+  }
 }
 
 //----- (0047253E) --------------------------------------------------------
@@ -15112,14 +15093,14 @@
 	unsigned __int16 v22; // ax@86
 	//signed int v23; // eax@94
 	//unsigned int v24; // eax@102
-	signed int v25; // edi@102
-	SpellBuff *v26; // esi@102
+	//signed int v25; // edi@102
+	//SpellBuff *v26; // esi@102
 	unsigned int v27; // ecx@123
 	unsigned int v28; // eax@123
-	unsigned int v29; // eax@127
+	//unsigned int v29; // eax@127
 	AIDirection *v30; // eax@129
 	unsigned __int16 v31; // ax@132
-	unsigned int v32; // esi@142
+	//unsigned int v32; // esi@142
 	int v33; // eax@144
 	int v34; // eax@147
 	char v35; // al@150
@@ -15127,57 +15108,58 @@
 	signed int v37; // eax@154
 	unsigned __int8 v38; // sf@158
 	unsigned __int8 v39; // of@158
-	signed int v40; // edx@166
-	unsigned int v41; // ecx@166
+	//signed int v40; // edx@166
+	//unsigned int v41; // ecx@166
 	double v42; // st7@176
 	double v43; // st6@176
-	bool v44; // eax@189
+	//bool v44; // eax@189
 	bool v45; // eax@192
 	unsigned __int8 v46; // cl@197
 	double v47; // st7@206
 	double v48; // st7@207
-	char v49; // zf@208
-	char v50; // zf@214
-	signed int v51; // edx@219
-	unsigned int v52; // ecx@219
+	//char v49; // zf@208
+	//char v50; // zf@214
+	//signed int v51; // edx@219
+	//unsigned int v52; // ecx@219
 	__int16 v53; // fps@224
 	unsigned __int8 v54; // c0@224
 	unsigned __int8 v55; // c3@224
 	double v56; // st7@226
 	AIDirection *v57; // eax@246
 	double v58; // st7@246
-	signed int v59; // [sp-18h] [bp-C8h]@213
-	int v60; // [sp-14h] [bp-C4h]@144
-	int v61; // [sp-14h] [bp-C4h]@168
-	AIDirection *v62; // [sp-14h] [bp-C4h]@213
-	signed int v63; // [sp-14h] [bp-C4h]@216
+	//signed int v59; // [sp-18h] [bp-C8h]@213
+	//int v60; // [sp-14h] [bp-C4h]@144
+	//int v61; // [sp-14h] [bp-C4h]@168
+	//AIDirection *v62; // [sp-14h] [bp-C4h]@213
+	//signed int v63; // [sp-14h] [bp-C4h]@216
 	unsigned int v64; // [sp-14h] [bp-C4h]@219
 	unsigned int v65; // [sp-10h] [bp-C0h]@144
 	char v66; // [sp-10h] [bp-C0h]@147
-	AIDirection *v67; // [sp-10h] [bp-C0h]@167
-	int v68; // [sp-10h] [bp-C0h]@168
-	AIDirection *v69; // [sp-10h] [bp-C0h]@206
+	//AIDirection *v67; // [sp-10h] [bp-C0h]@167
+	//int v68; // [sp-10h] [bp-C0h]@168
+	//AIDirection *v69; // [sp-10h] [bp-C0h]@206
 	int v70; // [sp-10h] [bp-C0h]@213
-	AIDirection *v71; // [sp-10h] [bp-C0h]@216
+	//AIDirection *v71; // [sp-10h] [bp-C0h]@216
 	AIDirection v72; // [sp+0h] [bp-B0h]@246
 	AIDirection a3; // [sp+1Ch] [bp-94h]@129
 	AIDirection v74; // [sp+38h] [bp-78h]@246
 	AIDirection v75; // [sp+54h] [bp-5Ch]@129
-	int v76; // [sp+70h] [bp-40h]@83
+	int actor_pid_type; // [sp+70h] [bp-40h]@83
 	signed int a1; // [sp+74h] [bp-3Ch]@129
 	int v78; // [sp+78h] [bp-38h]@79
 	AIDirection pDir; // [sp+7Ch] [bp-34h]@129
 	float v80; // [sp+98h] [bp-18h]@33
 	int v81; // [sp+9Ch] [bp-14h]@100
-	int v82; // [sp+A0h] [bp-10h]@45
+	//int v82; // [sp+A0h] [bp-10h]@45
 	//unsigned int uActorID; // [sp+A4h] [bp-Ch]@32
 	unsigned int v84; // [sp+A8h] [bp-8h]@11
-	signed int a2; // [sp+ACh] [bp-4h]@83
+	signed int actor_pid; // [sp+ACh] [bp-4h]@83
+	AIState uAIState;
 	
 	if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
-	MakeActorAIList_ODM();
+		MakeActorAIList_ODM();
 	else
-	MakeActorAIList_BLV();
+		MakeActorAIList_BLV();
 	
 	//v0 = 0;
 	if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 )
@@ -15194,7 +15176,7 @@
 			v3 = pParty->sRotationX + v1 % 16 - 8;
 			pParty->sRotationX = v3;
 			if ( v3 > 128 || (v2 = -128, v3 < -128) )
-			pParty->sRotationX = v2;
+				pParty->sRotationX = v2;
 			pParty->uFlags |= 2u;
 			pParty->armageddon_timer -= pMiscTimer->uTimeElapsed;
 			v4 = pParty->field_16140 + 50;
@@ -15222,7 +15204,7 @@
 								{
 									Actor::Die(v84);
 									if ( v5->pMonsterInfo.uExp )
-									GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp);
+										GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp);
 								}
 							}
 						}
@@ -15236,14 +15218,14 @@
 				{
 					pPlayer = *v8;
 					if ( !(*v8)->pConditions[14] && !pPlayer->pConditions[15] && !pPlayer->pConditions[16] )
-					pPlayer->ReceiveDamage(v4, 5);
+						pPlayer->ReceiveDamage(v4, 5);
 					++v8;
 				}
 				while ( (signed int)v8 <= (signed int)&pPlayers[4] );
 				//v0 = 0;
 			}
 			if (pTurnEngine->field_1C)
-			--pTurnEngine->field_1C;
+				--pTurnEngine->field_1C;
 		}
 	}
 	
@@ -15266,10 +15248,10 @@
 			//v49 = *(unsigned int *)LODWORD(v80) == 5;
 			ai_near_actors_targets_pid[i] = OBJECT_Player;
 			if (actor->uAIState == Dead || actor->uAIState == Removed || actor->uAIState == Disabled || actor->uAttributes & 0x0400)
-			continue;
+				continue;
 			
 			if (!actor->sCurrentHP && actor->uAIState != Dying)
-			Actor::Die(i);
+				Actor::Die(i);
 			
 			//v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1;
 			//v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1;
@@ -15292,18 +15274,19 @@
 				++v14;
 			}
 			while ( v13 < 22 );*/
-			if (!actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime)
+			if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 )
 			//&& SHIDWORD(pActor->pActorBuffs[3].uExpireTime) <= (signed int)v12 && (SHIDWORD(pActor->pActorBuffs[3].uExpireTime) < (signed int)v12
 			// || LODWORD(pActor->pActorBuffs[3].uExpireTime) <= v12) )
-			actor->uActorHeight = pMonsterList->pMonsters[actor->pMonsterInfo.uID - 1].uMonsterHeight;
-			if (actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime)
-			actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
-			else
-			actor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[actor->pMonsterInfo.uID].uHostilityType;
+				actor->uActorHeight = pMonsterList->pMonsters[actor->pMonsterInfo.uID - 1].uMonsterHeight;
+			if ( (signed __int64)actor->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 )
+				actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
+			// not sure
+			else // if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 )
+				actor->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[actor->pMonsterInfo.uID].uHostilityType;
 			
-			if (actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime ||
-			actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime)
-			continue;
+			if ((signed __int64)actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime > 0 
+				|| (signed __int64)actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime > 0)
+				continue;
 			
 			//v15 = pMiscTimer->uTimeElapsed;
 			//v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime;
@@ -15312,17 +15295,18 @@
 			if (actor->pMonsterInfo.uRecoveryTime)
 			{
 				if (actor->pMonsterInfo.uRecoveryTime < pMiscTimer->uTimeElapsed)
-				actor->pMonsterInfo.uRecoveryTime = 0;
-				else actor->pMonsterInfo.uRecoveryTime -= pMiscTimer->uTimeElapsed;
+					actor->pMonsterInfo.uRecoveryTime = 0;
+				else 
+					actor->pMonsterInfo.uRecoveryTime -= pMiscTimer->uTimeElapsed;
 			}
 			
 			actor->uCurrentActionTime += pMiscTimer->uTimeElapsed;
 			if (actor->uCurrentActionTime < actor->uCurrentActionLength)
-			continue;
+				continue;
 			
 			//v19 = actor->uAIState;
 			if (actor->uAIState == Dying)
-			actor->uAIState = Dead;
+				actor->uAIState = Dead;
 			else
 			{
 				if (actor->uAIState != Summoned)
@@ -15358,150 +15342,125 @@
 			v21 = &pActors[actor_id];
 			Actor::_SelectTarget(actor_id, &ai_near_actors_targets_pid[actor_id], true);
 			if (v21->pMonsterInfo.uHostilityType && !ai_near_actors_targets_pid[actor_id])
-			v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
-			a2 = ai_near_actors_targets_pid[actor_id];
-			v76 = a2 & 7;
-			if ( (a2 & 7) == OBJECT_Actor)
-			v80 = 0.5;
+				v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
+			actor_pid = ai_near_actors_targets_pid[actor_id];
+			actor_pid_type = PID_TYPE(actor_pid);
+			if ( actor_pid_type == OBJECT_Actor)
+				v80 = 0.5;
 			else
-			v80 = 1.0;
+				v80 = 1.0;
 			v22 = v21->uAIState;
 			if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned)
 			{
 				continue;
 			}
-			else
-			{
-				if ( !v21->sCurrentHP )
+			if ( !v21->sCurrentHP )
 				Actor::Die(actor_id);
-				v25 = 0;
-				v26 = v21->pActorBuffs;
-				do
+			for(int i=0;i<22;i++)
+			{
+				if ( i != 10 )
 				{
-					if ( v25 != 10 )
-					{
-						v26->_4585CA(pParty->uTimePlayed);
-						//v24 = 0;
-					}
-					++v25;
-					++v26;
+					v21->pActorBuffs[i]._4585CA(pParty->uTimePlayed);
 				}
-				while ( v25 < 22 );
-				if ( (signed __int64)v21->pActorBuffs[3].uExpireTime > 0
-				&& SHIDWORD(v21->pActorBuffs[3].uExpireTime) <= 0
-				&& (SHIDWORD(v21->pActorBuffs[3].uExpireTime) < 0
-				|| LODWORD(v21->pActorBuffs[3].uExpireTime) <= 0) )
+			}
+			if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 )
 				v21->uActorHeight = pMonsterList->pMonsters[v21->pMonsterInfo.uID - 1].uMonsterHeight;
-				if ( (signed __int64)v21->pActorBuffs[1].uExpireTime > 0 )
+			if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 )
+				v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
+			// not sure
+			else // if ( (signed __int64)v21->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime < 0 )
+				v21->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[v21->pMonsterInfo.uID].uHostilityType;
+			if ( (signed __int64)v21->pActorBuffs[2].uExpireTime < 0 )
+			{
+				v21->uAIState = Removed;
+				continue;
+			}
+			if ( (signed __int64)v21->pActorBuffs[5].uExpireTime > 0
+				|| (signed __int64)v21->pActorBuffs[6].uExpireTime > 0)
+			{
+				continue;
+			}
+			v27 = pMiscTimer->uTimeElapsed;
+			v28 = v21->pMonsterInfo.uRecoveryTime;
+			v21->uCurrentActionTime += pMiscTimer->uTimeElapsed;
+			if ( (signed int)v28 > 0 )
+				v21->pMonsterInfo.uRecoveryTime = v28 - v27;
+			if ( v21->pMonsterInfo.uRecoveryTime< 0 )
+				v21->pMonsterInfo.uRecoveryTime = 0;
+			if ( !(v21->uAttributes & 0x8000) )
+				v21->uAttributes |= 0x8000;
+			a1 = 8 * actor_id | OBJECT_Actor;
+			v30 = Actor::GetDirectionInfo(8 * actor_id | OBJECT_Actor, actor_pid, &a3, 0);
+			memcpy(&v75, v30, sizeof(v75));
+			memcpy(&pDir, &v75, sizeof(pDir));
+			uAIState = v21->uAIState; 
+			/*if ( v21->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Friendly
+				&& (signed int)v21->pMonsterInfo.uRecoveryTime <= 0
+				&& v80 * 307.2 >= (double)(signed int)v75.uDistance
+				&& (uAIState == Pursuing || uAIState == Standing || uAIState == Tethered || uAIState == Fidgeting)
+				|| ( v21->pMonsterInfo.uMissleAttack1Type && uAIState == Stunned ) )
+			{
+				v32 = actor_id;
+			}*/
+			if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly
+				|| (signed int)v21->pMonsterInfo.uRecoveryTime > 0
+				|| v80 * 307.2 < (double)(signed int)v75.uDistance
+				|| uAIState != Pursuing && uAIState != Standing && uAIState != Tethered && uAIState != Fidgeting
+				&&  !v21->pMonsterInfo.uMissleAttack1Type || uAIState != Stunned )
+			//else
+			{
+				if ( (signed int)v21->uCurrentActionTime < v21->uCurrentActionLength )
 				{
-					v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
-					if ( SHIDWORD(v21->pActorBuffs[1].uExpireTime) <= 0 )
-					{
-						if ( SHIDWORD(v21->pActorBuffs[1].uExpireTime) < 0
-						|| LODWORD(v21->pActorBuffs[1].uExpireTime) <= 0 )
-						v21->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[v21->pMonsterInfo.uID].uHostilityType;
-					}
-				}
-				if ( (signed __int64)v21->pActorBuffs[2].uExpireTime > 0
-				&& SHIDWORD(v21->pActorBuffs[2].uExpireTime) <= 0
-				&& (SHIDWORD(v21->pActorBuffs[2].uExpireTime) < 0
-				|| LODWORD(v21->pActorBuffs[2].uExpireTime) <= 0) )
-				{
-					v21->uAIState = Removed;
 					continue;
 				}
-				else if ( v21->pActorBuffs[5].uExpireTime || v21->pActorBuffs[6].uExpireTime )
+				else if ( v21->uAIState == AttackingMelee )
 				{
-					continue;
+					v35 = stru_50C198.special_ability_use_check(v21, actor_id);
+					stru_50FE08.Add(
+						a1,
+						5120,
+						v21->vPosition.x,
+						v21->vPosition.y,
+						v21->vPosition.z + ((signed int)v21->uActorHeight >> 1),
+						v35,
+						1
+					);
+				}
+				else if ( v21->uAIState == AttackingRanged1 )
+				{
+					v34 = v21->pMonsterInfo.uMissleAttack1Type;
+					Actor::_404874(actor_id, &pDir, v34, 0);
+				}
+				else if ( v21->uAIState == AttackingRanged2 )
+				{
+					v34 = v21->pMonsterInfo.uMissleAttack2Type;
+					Actor::_404874(actor_id, &pDir, v34, 1);
 				}
 				else
 				{
-					v27 = pMiscTimer->uTimeElapsed;
-					v28 = v21->pMonsterInfo.uRecoveryTime;
-					v21->uCurrentActionTime += pMiscTimer->uTimeElapsed;
-					if ( (signed int)v28 > 0 )
-					v21->pMonsterInfo.uRecoveryTime = v28 - v27;
-					if ( v21->pMonsterInfo.uRecoveryTime< 0 )
-					v21->pMonsterInfo.uRecoveryTime = 0;
-					v29 = v21->uAttributes;
-					if ( !(v29 & 0x8000) )
-					v21->uAttributes = v29 | 0x8000;
-					a1 = 8 * actor_id | OBJECT_Actor;
-					v30 = Actor::GetDirectionInfo(8 * actor_id | OBJECT_Actor, a2, &a3, 0);
-					v49 = v21->pMonsterInfo.uHostilityType == 0;
-					memcpy(&v75, v30, sizeof(v75));
-					memcpy(&pDir, &v75, sizeof(pDir));
-					if ( !v49
-					&& (signed int)v21->pMonsterInfo.uRecoveryTime <= 0
-					&& v80 * 307.2 >= (double)(signed int)v75.uDistance
-					&& ((v31 = v21->uAIState, v31 == 6) || !v31 || v31 == 1 || v31 == 9)
-					|| v21->pMonsterInfo.uMissleAttack1Type && v21->uAIState == 8 )
-					{
-						v32 = actor_id;
-					}
-					else
+					if ( v21->uAIState == AttackingRanged3 )
 					{
-						if ( (signed int)v21->uCurrentActionTime < v21->uCurrentActionLength )
-						{
-							continue;
-						}
-						else if ( v21->uAIState == 2 )
-						{
-							v32 = actor_id;
-							v35 = stru_50C198.special_ability_use_check(v21, actor_id);
-							stru_50FE08.Add(
-							a1,
-							5120,
-							v21->vPosition.x,
-							v21->vPosition.y,
-							v21->vPosition.z + ((signed int)v21->uActorHeight >> 1),
-							v35,
-							1
-							);
-						}
-						else if ( v21->uAIState == 3 )
-						{
-							v34 = v21->pMonsterInfo.uMissleAttack1Type;
-							v66 = 0;
-							v32 = actor_id;
-							Actor::_404874(actor_id, &pDir, v34, v66);
-						}
-						else if ( v21->uAIState == 12 )
-						{
-							v34 = v21->pMonsterInfo.uMissleAttack2Type;
-							v66 = 1;
-							v32 = actor_id;
-							Actor::_404874(actor_id, &pDir, v34, v66);
-						}
-						else
-						{
-							v32 = actor_id;
-							if ( v21->uAIState == 13 )
-							{
-								v65 = v21->pMonsterInfo.uSpellSkillAndMastery1;
-								v60 = 2;
-								v33 = v21->pMonsterInfo.uSpell1ID;
-								Actor::_404AC7(actor_id, &pDir, v33, v60, v65);
-							}
-							else if ( v21->uAIState == 18 )
-							{
-								v65 = v21->pMonsterInfo.uSpellSkillAndMastery2;
-								v60 = 3;
-								v33 = v21->pMonsterInfo.uSpell2ID;
-								Actor::_404AC7(actor_id, &pDir, v33, v60, v65);
-							}
-						}
+						v65 = v21->pMonsterInfo.uSpellSkillAndMastery1;
+						v33 = v21->pMonsterInfo.uSpell1ID;
+						Actor::_404AC7(actor_id, &pDir, v33, 2, v65);
+					}
+					else if ( v21->uAIState == AttackingRanged4 )
+					{
+						v65 = v21->pMonsterInfo.uSpellSkillAndMastery2;
+						v33 = v21->pMonsterInfo.uSpell2ID;
+						Actor::_404AC7(actor_id, &pDir, v33, 3, v65);
 					}
 				}
 			}
+
 			v36 = v75.uDistance;
-			if ( !v21->pMonsterInfo.uHostilityType )
+			if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Friendly)
 			{
-				if ( v76 == 3 )
+				if ( actor_pid_type == OBJECT_Actor )
 				{
 					v36 = v75.uDistance;
 					v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (v21->pMonsterInfo.uID - 1) / 3]
-					+ (pActors[a2 >> 3].pMonsterInfo.uID - 1) / 3);
+						+ (pActors[actor_pid >> 3].pMonsterInfo.uID - 1) / 3);
 				}
 				else
 				{
@@ -15523,394 +15482,301 @@
 					v38 = ((v36 - 5120) & 0x80000000u) != 0;
 				}
 				if ( v37 >= 1 && v37 <= 4 && v38 ^ v39 || v37 == 1 )
-				v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
+					v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
 			}
+
 			if ( (signed __int64)v21->pActorBuffs[4].uExpireTime > 0 )
 			{
-				v40 = a2;
-				v41 = v32;
 				if ( (signed int)v36 >= 10240 )
 				{
-					v68 = 0;
-					v61 = 1024;
-					Actor::_4032B2(v41, v40, v61, v68);
-					continue;
+					Actor::_4032B2(actor_id, actor_pid, 1024, 0);
 				}
-				v67 = &pDir;
-				Actor::_402968(v41, v40, 0, v67);
+				else
+				{
+					//peasents after attacked
+					//guard after attacked
+					Actor::_402968(actor_id, actor_pid, 0, &pDir);
+				}
 				continue;
 			}
-			if ( v21->pMonsterInfo.uHostilityType == 4 && a2 )
+
+			if ( v21->pMonsterInfo.uHostilityType == MonsterInfo::Hostility_Long && actor_pid )
 			{
-				if ( !(v21->uAttributes & 0x020000) || v21->pMonsterInfo.uAIType == 1 )
+
+				if ( v21->pMonsterInfo.uAIType == 1 )
 				{
-					if ( v21->pMonsterInfo.uAIType == 1 )
+					if ( v21->pMonsterInfo.uMovementType == 5 )
 					{
-						v67 = &pDir;
-						if ( v21->pMonsterInfo.uMovementType != 5 )
-						{
-							v40 = a2;
-							v41 = v32;
-							Actor::_402968(v41, v40, 0, v67);
-							continue;
-						}
-						Actor::AI_Stand(
-						v32,
-						a2,
-						(signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333),
-						&pDir);
+						Actor::AI_Stand(actor_id, actor_pid, (signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333),	&pDir);
 					}
 					else
 					{
+						Actor::_402968(actor_id, actor_pid, 0, &pDir);
+						continue;
+					}
+						
+				}
+				if ( !(v21->uAttributes & 0x020000) )
+				{
+					if ( v21->pMonsterInfo.uAIType == 2 || v21->pMonsterInfo.uAIType == 3)
+					{
 						if ( v21->pMonsterInfo.uAIType == 2 )
-						{
-							v84 = v21->sCurrentHP;
-							v42 = (double)(signed int)v84;
 							v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.2;
-						}
-						else
-						{
-							v84 = v21->sCurrentHP;
-							v42 = (double)(signed int)v84;
+						if ( v21->pMonsterInfo.uAIType == 3 )
 							v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.1;
-						}
-						if ( v21->pMonsterInfo.uAIType == 2 || v21->pMonsterInfo.uAIType == 3 )
+						v84 = v21->sCurrentHP;
+						v42 = (double)(signed int)v84;
 						if ( v43 > v42 && (signed int)v36 < 10240 )
 						{
-							v67 = &pDir;
-							v40 = a2;
-							v41 = v32;
-							Actor::_402968(v41, v40, 0, v67);
+							Actor::_402968(actor_id, actor_pid, 0, &pDir);
 							continue;
 						}
 					}
 				}
+				
 				v81 = v36 - v21->uActorRadius;
-				if ( v76 == 3 )
-				v81 -= pActors[a2 >> 3].uActorRadius;
+				if ( actor_pid_type == OBJECT_Actor )
+					v81 -= pActors[actor_pid >> 3].uActorRadius;
 				if ( v81 < 0 )
-				v81 = 0;
+					v81 = 0;
 				rand();
-				v44 = (signed int)v21->pMonsterInfo.uRecoveryTime <= 0;
 				v21->uAttributes &= 0xFBFFFF;
-				v82 = 0;
-				v49 = v21->pMonsterInfo.uMovementType == 5;
-				v84 = v44;
-				if ( v49 )
-				v82 = 1;
 				if ( v81 < 5120 )
 				{
-					v45 = stru_50C198.special_ability_use_check(v21, v32);
-					if ( !v45 )
+					v45 = stru_50C198.special_ability_use_check(v21, actor_id);
+					if ( v45 == 0 )
 					{
 						if ( v21->pMonsterInfo.uMissleAttack1Type )
 						{
-							if ( v84 )
-							{
-								Actor::_403476(v32, a2, &pDir);
-								continue;
-								
-							}
-							if ( v82 )
+							if ( (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 )
 							{
-								v69 = &pDir;
-								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-								v51 = a2;
-								v64 = (signed __int64)v47;
-								v52 = v32;
-								Actor::AI_Stand(v52, v51, v64, v69);
-								continue;
+								Actor::_403476(actor_id, actor_pid, &pDir);
 							}
-							v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-							//UNDEF(v53);
-							v69 = &pDir;
-							if ( !(v54 | v55) )
+							else if ( v21->pMonsterInfo.uMovementType == 5 )
 							{
-								v51 = a2;
+								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
 								v64 = (signed __int64)v47;
-								v52 = v32;
-								Actor::AI_Stand(v52, v51, v64, v69);
-								continue;
+								Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 							}
-							Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
-							continue;
-						}
-						v56 = v80 * 307.2;
-						if ( (double)v81 >= v56 )
-						{
-							if ( v81 >= 1024 )
+							else
 							{
-								if ( v82 )
+								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+								if ( !(v54 | v55) )
 								{
-									v69 = &pDir;
-									v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-									v51 = a2;
 									v64 = (signed __int64)v47;
-									v52 = v32;
-									Actor::AI_Stand(v52, v51, v64, v69);
+									Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 									continue;
 								}
-								v71 = &pDir;
-								v63 = 0;
-								
-								Actor::_402686(v32, a2, v63, v71);
-								continue;
-							}
-							if ( v82 )
-							{
-								v69 = &pDir;
-								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-								v51 = a2;
-								v64 = (signed __int64)v47;
-								v52 = v32;
-								Actor::AI_Stand(v52, v51, v64, v69);
-								continue;
+								Actor::_402AD7(actor_id, actor_pid, actor_id, (signed __int64)v47, &pDir);
 							}
-							v70 = (signed __int64)v56;
-							v62 = &pDir;
-							v59 = 0;
-							Actor::_40281C(v32, a2, v59, v62, v70);
-							continue;
 						}
-						v49 = v84 == 0;
-						v69 = &pDir;
-						if ( v49 )
+						else
 						{
-							v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-							v51 = a2;
-							v64 = (signed __int64)v47;
-							v52 = v32;
-							Actor::AI_Stand(v52, v51, v64, v69);
-							continue;
+							v56 = v80 * 307.2;
+							if ( (double)v81 >= v56 )
+							{
+								if ( v81 >= 1024 )
+								{
+									if ( v21->pMonsterInfo.uMovementType == 5 )
+									{
+										v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+										v64 = (signed __int64)v47;
+										Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
+									}
+									else
+									{
+										//monsters
+										Actor::_402686(actor_id, actor_pid, 0, &pDir);
+									}
+								}
+								else if ( v21->pMonsterInfo.uMovementType == 5 )
+								{
+									v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+									v64 = (signed __int64)v47;
+									Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
+								}
+								else
+								{
+									v70 = (signed __int64)v56;
+									//monsters
+									//guard after player runs away
+									// follow player
+									Actor::_40281C(actor_id, actor_pid, 0, &pDir, v70);
+								}
+							}
+							else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 )
+							{
+								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+								v64 = (signed __int64)v47;
+								Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
+							}
+							else
+							{
+								//monsters
+								Actor::_403C6C(actor_id, actor_pid, &pDir);
+							}
 						}
-						Actor::_403C6C(v32, a2, &pDir);
 						continue;
 					}
-					if ( v45 != 1 )
+					else if ( v45 == 2 || v45 == 3 )
 					{
-						if ( v45 > 1 && v45 <= 3 )
+						if ( v45 == 2 )
+							v46 = v21->pMonsterInfo.uSpell1ID;
+						else
+							v46 = v21->pMonsterInfo.uSpell2ID;
+						if ( v46 )
 						{
-							if ( v45 == 2 )
-							v46 = v21->pMonsterInfo.uSpell1ID;
-							else
-							v46 = v21->pMonsterInfo.uSpell2ID;
-							if ( v46 )
+							if ( (signed int)v21->pMonsterInfo.uRecoveryTime <= 0 )
 							{
-								if ( v84 )
-								{
-									if ( v45 == 2 )
-									Actor::_403854(v32, a2, &pDir);
-									else
-									Actor::_403A60(v32, a2, &pDir);
-									continue;
-								}
-								if ( v80 * 307.2 > (double)v81 || v82 )
-								{
-									v69 = &pDir;
-									v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-									v51 = a2;
-									v64 = (signed __int64)v47;
-									v52 = v32;
-									Actor::AI_Stand(v52, v51, v64, v69);
-									continue;
-									
-								}
-								v69 = &pDir;
+								if ( v45 == 2 )
+									Actor::_403854(actor_id, actor_pid, &pDir);
+								else
+									Actor::_403A60(actor_id, actor_pid, &pDir);
+							}
+							else if ( v80 * 307.2 > (double)v81 || v21->pMonsterInfo.uMovementType == 5 )
+							{
 								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-								Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
-								continue;
+								v64 = (signed __int64)v47;
+								Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 							}
+							else
+							{
+								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+								Actor::_402AD7(actor_id, actor_pid, actor_id, (signed __int64)v47, &pDir);
+							}
+						}
+						else
+						{
 							v48 = v80 * 307.2;
 							if ( (double)v81 >= v48 )
 							{
 								if ( v81 >= 1024 )
 								{
-									v50 = v82 == 0;
-									if ( !v50 )
+									if ( v21->pMonsterInfo.uMovementType == 5 )
 									{
-										v69 = &pDir;
 										v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-										v51 = a2;
 										v64 = (signed __int64)v47;
-										v52 = v32;
-										Actor::AI_Stand(v52, v51, v64, v69);
-										continue;
+										Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 									}
-									v71 = &pDir;
-									v63 = 256;
-									Actor::_402686(v32, a2, v63, v71);
-									continue;
-									
+									else
+									{
+										Actor::_402686(actor_id, actor_pid, 256, &pDir);
+									}
 								}
-								if ( v82 )
+								else if ( v21->pMonsterInfo.uMovementType == 5 )
 								{
-									v69 = &pDir;
 									v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-									v51 = a2;
 									v64 = (signed __int64)v47;
-									v52 = v32;
-									Actor::AI_Stand(v52, v51, v64, v69);
-									continue;
+									Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 								}
-								v70 = (signed __int64)v48;
-								v62 = &pDir;
-								v59 = 0;
-								Actor::_40281C(v32, a2, v59, v62, v70);
-								continue;
+								else
+								{
+									v70 = (signed __int64)v48;
+									Actor::_40281C(actor_id, actor_pid, 0, &pDir, v70);
+								}
 							}
-							v49 = v84 == 0;
-							v69 = &pDir;
-							if ( v49 )
+							else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 )
 							{
 								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-								v51 = a2;
 								v64 = (signed __int64)v47;
-								v52 = v32;
-								Actor::AI_Stand(v52, v51, v64, v69);
-								continue;
+								Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 							}
-							Actor::_403C6C(v32, a2, &pDir);
-							continue;
+							else
+							{
+								Actor::_403C6C(actor_id, actor_pid, &pDir);
+							}
 						}
+						continue;
 					}
 				}
 			}
-			if ( v21->pMonsterInfo.uHostilityType != 4 || !a2 || v81 >= 5120 || v45 != 1 )
+
+			if ( v21->pMonsterInfo.uHostilityType != MonsterInfo::Hostility_Long || !actor_pid || v81 >= 5120 || v45 != 1 )
 			{
 				if ( !v21->pMonsterInfo.uMovementType )
 				{
-					v68 = 0;
-					v61 = 1024;
-					v41 = v32;
-					v40 = 4;
-					Actor::_4032B2(v41, v40, v61, v68);
-					continue;
-					
+					Actor::_4032B2(actor_id, 4, 1024, 0);
 				}
-				if ( v21->pMonsterInfo.uMovementType == 1 )
+				else if ( v21->pMonsterInfo.uMovementType == 1 )
 				{
-					v68 = 0;
-					v61 = 2560;
-					v41 = v32;
-					v40 = 4;
-					Actor::_4032B2(v41, v40, v61, v68);
-					continue;
+					Actor::_4032B2(actor_id, 4, 2560, 0);
 				}
-				if ( v21->pMonsterInfo.uMovementType == 2 )
+				else if ( v21->pMonsterInfo.uMovementType == 2 )
 				{
-					v68 = 0;
-					v61 = 5120;
-					v41 = v32;
-					v40 = 4;
-					Actor::_4032B2(v41, v40, v61, v68);
-					continue;
+					Actor::_4032B2(actor_id, 4, 5120, 0);
 				}
-				if ( v21->pMonsterInfo.uMovementType == 4 )
+				else if ( v21->pMonsterInfo.uMovementType == 4 )
 				{
-					v68 = 0;
-					v61 = 10240;
-					v41 = v32;
-					v40 = 4;
-					Actor::_4032B2(v41, v40, v61, v68);
-					continue;
+					Actor::_4032B2(actor_id, 4, 10240, 0);
 				}
-				if ( v21->pMonsterInfo.uMovementType == 5 )
+				else if ( v21->pMonsterInfo.uMovementType == 5 )
 				{
 					v57 = Actor::GetDirectionInfo(a1, 4u, &v72, 0);
 					v58 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
 					memcpy(&v74, v57, sizeof(v74));
 					memcpy(&pDir, &v74, sizeof(pDir));
-					v69 = &pDir;
-					v52 = actor_id;
 					v64 = (signed __int64)v58;
-					v51 = 4;
-					Actor::AI_Stand(v52, v51, v64, v69);
-					continue;
-				}
-				continue;
-				
+					Actor::AI_Stand(actor_id, 4, v64, &pDir);
+				}				
 			}
-			if ( !v21->pMonsterInfo.uMissleAttack2Type )
+			else if ( !v21->pMonsterInfo.uMissleAttack2Type )
 			{
 				v56 = v80 * 307.2;
 				if ( (double)v81 >= v56 )
 				{
 					if ( v81 >= 1024 )
 					{
-						v50 = v82 == 0;
-						if ( !v50 )
+						if ( v21->pMonsterInfo.uMovementType == 5 )
 						{
-							v69 = &pDir;
 							v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-							v51 = a2;
 							v64 = (signed __int64)v47;
-							v52 = v32;
-							Actor::AI_Stand(v52, v51, v64, v69);
-							continue;
+							Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 						}
-						v71 = &pDir;
-						v63 = 256;
-						Actor::_402686(v32, a2, v63, v71);
-						continue;
+						else
+						{
+							Actor::_402686(actor_id, actor_pid, 256, &pDir);
+						}
 					}
-					if ( v82 )
+					else if ( v21->pMonsterInfo.uMovementType == 5 )
 					{
-						v69 = &pDir;
 						v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-						v51 = a2;
 						v64 = (signed __int64)v47;
-						v52 = v32;
-						Actor::AI_Stand(v52, v51, v64, v69);
-						continue;
+						Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
 					}
-					v70 = (signed __int64)v56;
-					v62 = &pDir;
-					v59 = 0;
-					Actor::_40281C(v32, a2, v59, v62, v70);
-					continue;
-					
+					else
+					{
+						v70 = (signed __int64)v56;
+						Actor::_40281C(actor_id, actor_pid, 0, &pDir, v70);
+					}
 				}
-				v49 = v84 == 0;
-				v69 = &pDir;
-				if ( v49 )
+				else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 )
 				{
 					v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-					v51 = a2;
-					v64 = (signed __int64)v47;
-					v52 = v32;
-					Actor::AI_Stand(v52, v51, v64, v69);
-					continue;
-				}
-				Actor::_403C6C(v32, a2, &pDir);
-				continue;
-			}
-			if ( !v84 )
-			{
-				if ( v82 )
-				{
-					v69 = &pDir;
-					v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-					v51 = a2;
 					v64 = (signed __int64)v47;
-					v52 = v32;
-					Actor::AI_Stand(v52, v51, v64, v69);
-					continue;
+					Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
+				}
+				else
+				{
+					Actor::_403C6C(actor_id, actor_pid, &pDir);
 				}
+			}
+			else if ( (signed int)v21->pMonsterInfo.uRecoveryTime > 0 )
+			{
 				v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-				//UNDEF(v53);
-				v69 = &pDir;
-				if ( !(v54 | v55) )
+				if ( !(v54 | v55) || v21->pMonsterInfo.uMovementType == 5 )
 				{
-					v51 = a2;
 					v64 = (signed __int64)v47;
-					v52 = v32;
-					Actor::AI_Stand(v52, v51, v64, v69);
-					continue;
+					Actor::AI_Stand(actor_id, actor_pid, v64, &pDir);
+				}
+				else
+				{
+					Actor::_402AD7(actor_id, actor_pid, actor_id, (signed __int64)v47, &pDir);
 				}
-				Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
-				continue;
 			}
-			Actor::_40368B(v32, a2, &pDir);
+			else
+			{
+				Actor::_40368B(actor_id, actor_pid, &pDir);
+			}
 		}
 	}
 }