diff mm7_3.cpp @ 826:1133e34a7560

Слияние
author Ritor1
date Tue, 26 Mar 2013 23:19:12 +0600
parents 35c31a49d989 fe4c8b113548
children 085eb19b7ffd
line wrap: on
line diff
--- a/mm7_3.cpp	Tue Mar 26 23:18:58 2013 +0600
+++ b/mm7_3.cpp	Tue Mar 26 23:19:12 2013 +0600
@@ -1390,7 +1390,7 @@
       v4 = &pObjectList->pObjects[item->uObjectDescID];
       if (item->AttachedToActor())
       {
-          v5 = item->field_5C >> 3;
+          v5 = item->spell_target_pid >> 3;
           *(int *)(v2 - 26) = pActors[v5].vPosition.x;
           *(int *)(v2 - 22) = pActors[v5].vPosition.y;
           *(int *)(v2 - 18) = pActors[v5].vPosition.z + pActors[v5].uActorHeight;
@@ -7724,74 +7724,79 @@
 }
 
 //----- (0048257A) --------------------------------------------------------
-int __fastcall GetTerrainHeightsAroundParty2(int a1, int a2, int *pIsOnWater, int a4)
-{
-  unsigned int v4; // ebx@1
-  unsigned int v5; // edi@1
+int __fastcall GetTerrainHeightsAroundParty2(int a1, int a2, int *pIsOnWater, int bFloatAboveWater)
+{
+  //unsigned int v4; // ebx@1
+  //unsigned int v5; // edi@1
   int result; // eax@9
-  int v7; // ebx@10
+  //int v7; // ebx@10
   int v8; // ebx@11
   int v9; // eax@11
   int v10; // ecx@11
-  int v11; // [sp+Ch] [bp-Ch]@1
-  int v12; // [sp+10h] [bp-8h]@1
+  //int v11; // [sp+Ch] [bp-Ch]@1
+  //int v12; // [sp+10h] [bp-8h]@1
   int v13; // [sp+10h] [bp-8h]@11
   signed int v14; // [sp+14h] [bp-4h]@3
   int v15; // [sp+24h] [bp+Ch]@11
 
-  v11 = a1;
-  v12 = a2;
-  v4 = WorldPosToGridCellX(a1);
-  v5 = WorldPosToGridCellZ(v12) - 1;
-  dword_76D538_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4);
-  dword_76D53C_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4 + 1);
-  dword_76D540_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4 + 1);
-  dword_76D544_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4);
-  dword_76D528_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5);
-  dword_76D52C_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5);
-  dword_76D530_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5 + 1);
-  dword_76D534_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5 + 1);
-  dword_76D518_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4, v5);
-  dword_76D51C_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4 + 1, v5);
-  dword_76D520_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4 + 1, v5 + 1);
-  dword_76D524_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4, v5 + 1);
+  //v11 = a1;
+  //v12 = a2;
+  auto grid_x = WorldPosToGridCellX(a1);
+  auto grid_z = WorldPosToGridCellZ(a2) - 1;
+
+  auto grid_x1 = GridCellToWorldPosX(grid_x),
+       grid_x2 = GridCellToWorldPosX(grid_x + 1);
+  auto grid_z1 = GridCellToWorldPosZ(grid_z),
+       grid_z2 = GridCellToWorldPosZ(grid_z + 1);
+
+  auto y_x1z1 = pOutdoor->DoGetHeightOnTerrain(grid_x,     grid_z),
+       y_x2z1 = pOutdoor->DoGetHeightOnTerrain(grid_x + 1, grid_z),
+       y_x2z2 = pOutdoor->DoGetHeightOnTerrain(grid_x + 1, grid_z + 1),
+       y_x1z2 = pOutdoor->DoGetHeightOnTerrain(grid_x,     grid_z + 1);
+  //v4 = WorldPosToGridCellX(a1);
+  //v5 = WorldPosToGridCellZ(v12) - 1;
+  //dword_76D538_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4);
+  //dword_76D53C_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4 + 1);
+  //dword_76D540_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4 + 1);
+  //dword_76D544_terrain_cell_world_pos_around_party_x = GridCellToWorldPosX(v4);
+  //dword_76D528_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5);
+  //dword_76D52C_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5);
+  //dword_76D530_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5 + 1);
+  //dword_76D534_terrain_cell_world_pos_around_party_z = GridCellToWorldPosZ(v5 + 1);
+  //dword_76D518_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4, v5);
+  //dword_76D51C_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4 + 1, v5);
+  //dword_76D520_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4 + 1, v5 + 1);
+  //dword_76D524_terrain_cell_world_pos_around_party_y = pOutdoor->DoGetHeightOnTerrain(v4, v5 + 1);
   *pIsOnWater = false;
-  if ( pOutdoor->ActuallyGetSomeOtherTileInfo(v4, v5) & 2 )
+  if ( pOutdoor->ActuallyGetSomeOtherTileInfo(grid_x, grid_z) & 2 )
     *pIsOnWater = true;
   v14 = 0;
-  if ( !a4 && *pIsOnWater )
+  if ( !bFloatAboveWater && *pIsOnWater )
     v14 = -60;
-  if ( dword_76D518_terrain_cell_world_pos_around_party_y != dword_76D51C_terrain_cell_world_pos_around_party_y
-    || dword_76D51C_terrain_cell_world_pos_around_party_y != dword_76D520_terrain_cell_world_pos_around_party_y
-    || dword_76D520_terrain_cell_world_pos_around_party_y != dword_76D524_terrain_cell_world_pos_around_party_y )
-  {
-    v7 = abs(v11 - dword_76D538_terrain_cell_world_pos_around_party_x);
-    if ( abs(dword_76D528_terrain_cell_world_pos_around_party_z - v12) >= v7 )
-    {
-      v8 = dword_76D524_terrain_cell_world_pos_around_party_y;
-      v9 = dword_76D520_terrain_cell_world_pos_around_party_y;
-      v10 = dword_76D518_terrain_cell_world_pos_around_party_y;
-      v15 = v11 - dword_76D544_terrain_cell_world_pos_around_party_x;
-      v13 = v12 - dword_76D534_terrain_cell_world_pos_around_party_z;
+  if ( y_x1z1 != y_x2z1 ||
+       y_x2z1 != y_x2z2 ||
+       y_x2z2 != y_x1z2 )
+  {
+    if ( abs(grid_z1 - a2) >= abs(a1 - grid_x1) )
+    {
+      v8 = y_x1z2;
+      v9 = y_x2z2;
+      v10 = y_x1z1;
+      v15 = a1 - grid_x1;
+      v13 = a2 - grid_z2;
     }
     else
     {
-      v8 = dword_76D51C_terrain_cell_world_pos_around_party_y;
-      v9 = dword_76D518_terrain_cell_world_pos_around_party_y;
-      v10 = dword_76D520_terrain_cell_world_pos_around_party_y;
-      v15 = dword_76D53C_terrain_cell_world_pos_around_party_x - v11;
-      v13 = dword_76D52C_terrain_cell_world_pos_around_party_z - v12;
-    }
-    result = v14
-           + v8
-           + ((unsigned __int64)(v13 * (signed __int64)((v10 - v8) << 7)) >> 16)
-           + ((unsigned __int64)(v15 * (signed __int64)((v9 - v8) << 7)) >> 16);
-  }
-  else
-  {
-    result = v14 + dword_76D518_terrain_cell_world_pos_around_party_y;
-  }
-  return result;
+      v8 = y_x2z1;
+      v9 = y_x1z1;
+      v10 = y_x2z2;
+      v15 = grid_x2 - a1;
+      v13 = grid_z1 - a2;
+    }
+    return v14 + v8 + fixpoint_mul(v13, (v10 - v8) * 128) + fixpoint_mul(v15, (v9 - v8) * 128);
+  }
+  else
+    return y_x1z1;
 }
 
 //----- (0048276F) --------------------------------------------------------
@@ -11923,7 +11928,7 @@
 		else if (_evt->_e_type == EVENT_OnTimer || _evt->_e_type == EVENT_OnLongTimer)
 		{
 			v3 = &array_5B5928_timers[dword_5B65C8_timers_count];
-			v20 = pOutdoor->uLastVisitDay;
+			v20 = pOutdoor->loc_time.uLastVisitDay;
 			if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
 				v20 = pIndoor->stru1.uLastVisitDay;
 
@@ -12423,7 +12428,7 @@
   pFont = pFontArrus;
   if ( ptr_F8B1E8 && !byte_5B0938[0] )
     strcpy(byte_5B0938, ptr_F8B1E8);
-  v5.uFrameWidth = 460;
+  v5.uFrameWidth = game_viewport_width;
   v5.uFrameZ = 452;
   v1 = pFontArrus->CalcTextHeight(byte_5B0938, &v5, 12, 0) + 7;
   if ( 352 - v1 < 8 )
@@ -12676,7 +12681,7 @@
 
   if (pInString)
   {
-    pWindow.uFrameWidth = 460;
+    pWindow.uFrameWidth = game_viewport_width;
     pWindow.uFrameZ = 452;
     auto font = pFontArrus;
     v12 = pFontArrus->CalcTextHeight(pInString, &pWindow, 13, 0) + 7;
@@ -13782,9 +13787,9 @@
       case 41:
         a1.stru_24.Reset();
         v16 = 0;
-        a1.field_48 = spellnum;
-        a1.field_4C = level;
-        a1.field_50 = v15;
+        a1.spell_id = spellnum;
+        a1.spell_level = level;
+        a1.spell_skill = v15;
         if ( (signed int)pObjectList->uNumObjects <= 0 )
           goto LABEL_34;
         v17 = (char *)&pObjectList->pObjects->uObjectID;
@@ -13820,9 +13825,9 @@
           a8b = a7c / (v60 - 1);
           a1.stru_24.Reset();
           v21 = 0;
-          a1.field_48 = spellnum;
-          a1.field_4C = level;
-          a1.field_50 = v15;
+          a1.spell_id = spellnum;
+          a1.spell_level = level;
+          a1.spell_skill = v15;
           if ( (signed int)pObjectList->uNumObjects <= 0 )
           {
 LABEL_41:
@@ -13847,8 +13852,8 @@
           a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
           a1.field_60_distance_related_prolly_lod = v55;
           a1.uSpriteFrameID = 0;
-          a1.field_58_pid = 8000 | OBJECT_Item;
-          a1.field_5C = 4;
+          a1.spell_caster_pid = 8000 | OBJECT_Item;
+          a1.spell_target_pid = 4;
           a1.uSoundID = 0;
           for ( i = a7c / -2; i <= a7c / 2; i += a8b )
           {
@@ -13863,9 +13868,9 @@
         }
         a1.stru_24.Reset();
         v16 = 0;
-        a1.field_48 = spellnum;
-        a1.field_4C = level;
-        a1.field_50 = v15;
+        a1.spell_id = spellnum;
+        a1.spell_level = level;
+        a1.spell_skill = v15;
         if ( (signed int)pObjectList->uNumObjects <= 0 )
           goto LABEL_34;
         v19 = (char *)&pObjectList->pObjects->uObjectID;
@@ -13888,8 +13893,8 @@
         a1.field_60_distance_related_prolly_lod = v55;
         v20 = yaw;
         a1.uSpriteFrameID = 0;
-        a1.field_58_pid = 8000 | OBJECT_Item;
-        a1.field_5C = 0;
+        a1.spell_caster_pid = 8000 | OBJECT_Item;
+        a1.spell_target_pid = 0;
         a1.uFacing = yaw;
         a1.uSoundID = 0;
         v51 = 0;
@@ -13916,9 +13921,9 @@
         a8c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v60 - 1);
         a1.stru_24.Reset();
         v25 = 0;
-        a1.field_48 = spellnum;
-        a1.field_4C = level;
-        a1.field_50 = v15;
+        a1.spell_id = spellnum;
+        a1.spell_level = level;
+        a1.spell_skill = v15;
         if ( (signed int)pObjectList->uNumObjects <= 0 )
           goto LABEL_59;
         v26 = (char *)&pObjectList->pObjects->uObjectID;
@@ -13942,8 +13947,8 @@
         a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
         a1.field_60_distance_related_prolly_lod = v55;
         a1.uSpriteFrameID = 0;
-        a1.field_58_pid = 8000 | OBJECT_Item;
-        a1.field_5C = 4;
+        a1.spell_caster_pid = 8000 | OBJECT_Item;
+        a1.spell_target_pid = 4;
         a1.uSoundID = 0;
         for ( j = a7d / -2; j <= a7d / 2; j += a8c )
         {
@@ -13960,9 +13965,9 @@
           return;
         a1.stru_24.Reset();
         v29 = 0;
-        a1.field_48 = spellnum;
-        a1.field_4C = level;
-        a1.field_50 = v15;
+        a1.spell_id = spellnum;
+        a1.spell_level = level;
+        a1.spell_skill = v15;
         if ( (signed int)pObjectList->uNumObjects <= 0 )
           goto LABEL_70;
         v30 = (char *)&pObjectList->pObjects->uObjectID;
@@ -14096,8 +14101,8 @@
     a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
     a1.field_60_distance_related_prolly_lod = v55;
     a1.uSpriteFrameID = 0;
-    a1.field_58_pid = 8000 | OBJECT_Item;
-    a1.field_5C = 4;
+    a1.spell_caster_pid = 8000 | OBJECT_Item;
+    a1.spell_target_pid = 4;
     a1.uSoundID = 0;
     v51 = 0;
     v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
@@ -14926,710 +14931,834 @@
 // 4F75D8: using guessed type int ai_arrays_size;
 
 //----- (00401A91) --------------------------------------------------------
-void __cdecl UpdateActorAI()
-{
-  //unsigned int v0; // esi@4
-  int v1; // eax@7
-  int v2; // ecx@7
-  int v3; // eax@7
-  signed int v4; // edi@10
-  Actor *v5; // esi@12
-  signed int v6; // eax@14
-  __int16 v7; // cx@14
-  Player **v8; // esi@20
-  Player *pPlayer; // ecx@21
-  //Actor *pActor; // esi@34
-  //__int16 v11; // ax@34
-  //unsigned int v12; // eax@47
-  //signed int v13; // edi@47
-  //SpellBuff *v14; // ebx@47
-  //unsigned int v15; // edi@67
-  //char *v16; // eax@67
-  //unsigned int v17; // edx@67
-  //unsigned int v18; // ecx@67
-  //unsigned __int16 v19; // ax@72
-  //int *v20; // esi@80
-  Actor *v21; // ebx@80
-  unsigned __int16 v22; // ax@86
-  signed int v23; // eax@94
-  unsigned int v24; // eax@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
-  AIDirection *v30; // eax@129
-  unsigned __int16 v31; // ax@132
-  unsigned int v32; // esi@142
-  int v33; // eax@144
-  int v34; // eax@147
-  char v35; // al@150
-  unsigned int v36; // edi@152
-  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
-  double v42; // st7@176
-  double v43; // st6@176
-  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
-  __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
-  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
-  int v70; // [sp-10h] [bp-C0h]@213
-  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
-  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
-  //unsigned int uActorID; // [sp+A4h] [bp-Ch]@32
-  unsigned int v84; // [sp+A8h] [bp-8h]@11
-  signed int a2; // [sp+ACh] [bp-4h]@83
-
-  if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
-    MakeActorAIList_ODM();
-  else
-    MakeActorAIList_BLV();
-
-  //v0 = 0;
-  if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 )
-  {
-    if ( pParty->armageddon_timer > 417 )
-    {
-      pParty->armageddon_timer = 0;
-    }
-    else
-    {
-      pParty->sRotationY = (stru_5C6E00->uIntegerDoublePi - 1) & (pParty->sRotationY + rand() % 16 - 8);
-      v1 = rand();
-      v2 = 128;
-      v3 = pParty->sRotationX + v1 % 16 - 8;
-      pParty->sRotationX = v3;
-      if ( v3 > 128 || (v2 = -128, v3 < -128) )
-        pParty->sRotationX = v2;
-      pParty->uFlags |= 2u;
-      pParty->armageddon_timer -= pMiscTimer->uTimeElapsed;
-      v4 = pParty->field_16140 + 50;
-      if ( pParty->armageddon_timer <= 0 )
-      {
-        pParty->armageddon_timer = 0;
-        v84 = 0;
-        if ( (signed int)uNumActors > 0 )
-        {
-          v5 = pActors;//[0].sCurrentHP;
-          do
-          {
-            if ( v5->CanAct() )
-            {
-              v6 = stru_50C198.CalcMagicalDamageToActor(v5, 5, v4);
-              v7 = v5->sCurrentHP - v6;
-              v5->sCurrentHP = v7;
-              if ( v6 )
-              {
-                if ( v7 >= 0 )
-                {
-                  Actor::_4030AD(v84, 4, 0);
-                }
-                else
-                {
-                  Actor::Die(v84);
-                  if ( v5->pMonsterInfo.uExp )
-                    GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp);
-                }
-              }
-            }
-            ++v84;
-            ++v5;
-          }
-          while ( (signed int)v84 < (signed int)uNumActors );
-        }
-        v8 = &pPlayers[1];
-        do
-        {
-          pPlayer = *v8;
-          if ( !(*v8)->pConditions[14] && !pPlayer->pConditions[15] && !pPlayer->pConditions[16] )
-            pPlayer->ReceiveDamage(v4, 5);
-          ++v8;
-        }
-        while ( (signed int)v8 <= (signed int)&pPlayers[4] );
-        //v0 = 0;
-      }
-      if (pTurnEngine->field_1C)
-        --pTurnEngine->field_1C;
-    }
-  }
-
-  if (pParty->bTurnBasedModeOn)
-  {
-    pTurnEngine->_405E14();
-    return;
-  }
-
-
-  //uActorID = v0;
-  for (uint i = 0; i < uNumActors; ++i)
-  {
-    auto actor = pActors + i;
-    //LODWORD(v80) = (int)(char *)pActors + 176; // uAIState
-    //do
-    //{
-      //pActor = (Actor *)(LODWORD(v80) - 176);
-      //v11 = *(unsigned int *)LODWORD(v80);
-      //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;
-
-    if (!actor->sCurrentHP && actor->uAIState != Dying)
-      Actor::Die(i);
-
-    //v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1;
-    //v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1;
-      //v12 = 0;
-      //v13 = 0;
-      //v14 = (SpellBuff *)(LODWORD(v80) + 36);
-    for (uint j = 0; j < 22; ++j)
-    {
-      if (j != 10)
-        actor->pActorBuffs[j]._4585CA(pParty->uTimePlayed);
-    }
-      /*do
-      {
-        if ( v13 != 10 )
-        {
-          v14->_4585CA(pParty->uTimePlayed);
-          v12 = 0;
-        }
-        ++v13;
-        ++v14;
-      }
-      while ( v13 < 22 );*/
-    if (!actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime)
-        //&& 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;
-
-    if (actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime ||
-        actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime)
-      continue;
-
-      //v15 = pMiscTimer->uTimeElapsed;
-      //v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime;
-      //v17 = pActor->uCurrentActionTime;
-      //v18 = pActor->pMonsterInfo.uRecoveryTime;
-    if (actor->pMonsterInfo.uRecoveryTime)
-    {
-      if (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;
-
-      //v19 = actor->uAIState;
-    if (actor->uAIState == Dying)
-        actor->uAIState = Dead;
-    else
-    {
-      if (actor->uAIState != Summoned)
-      {
-        Actor::AI_StandOrBored(i, OBJECT_Player, 256, nullptr);
-        continue;
-      }
-      actor->uAIState = Standing;
-    }
-
-    actor->uCurrentActionTime = 0;
-    actor->uCurrentActionLength = 0;
-    actor->UpdateAnimation();
-//LABEL_78:
-      //++uActorID;
-      //LODWORD(v80) += 836;
-    //}
-    //while ( (signed int)uActorID < (signed int)uNumActors );
-  }
-
-
-  v78 = 0;
-  int actor_id = -1;
-  if ( ai_arrays_size > 0 )
-  {
-    while ( 1 )
-    {
-      actor_id = ai_near_actors_ids[v78];
-      assert(actor_id < uNumActors);
-
-      //v20 = &ai_near_actors_targets_pid[actor_id];
-      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;
-      else
-        v80 = 1.0;
-      v22 = v21->uAIState;
-      if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned)
-        goto LABEL_254;
-      if ( !v21->sCurrentHP )
-        Actor::Die(actor_id);
-      if ( (signed __int64)v21->pActorBuffs[3].uExpireTime <= 0 )
-      {
-        v84 = 0;
-        v23 = 1;
-      }
-      else
-      {
-        v23 = 1;
-        v84 = 1;
-      }
-      if ( (signed __int64)v21->pActorBuffs[1].uExpireTime <= 0 )
-        v82 = 0;
-      else
-        v82 = v23;
-      if ( (signed __int64)v21->pActorBuffs[2].uExpireTime <= 0 )
-        v81 = 0;
-      else
-        v81 = v23;
-      v24 = 0;
-      v25 = 0;
-      v26 = v21->pActorBuffs;
-      do
-      {
-        if ( v25 != 10 )
-        {
-          v26->_4585CA(pParty->uTimePlayed);
-          v24 = 0;
-        }
-        ++v25;
-        ++v26;
-      }
-      while ( v25 < 22 );
-      if ( v84 != v24
-        && SHIDWORD(v21->pActorBuffs[3].uExpireTime) <= (signed int)v24
-        && (SHIDWORD(v21->pActorBuffs[3].uExpireTime) < (signed int)v24
-         || LODWORD(v21->pActorBuffs[3].uExpireTime) <= v24) )
-        v21->uActorHeight = pMonsterList->pMonsters[v21->pMonsterInfo.uID - 1].uMonsterHeight;
-      if ( v82 != v24 )
-      {
-        v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
-        if ( SHIDWORD(v21->pActorBuffs[1].uExpireTime) <= (signed int)v24 )
-        {
-          if ( SHIDWORD(v21->pActorBuffs[1].uExpireTime) < (signed int)v24
-            || LODWORD(v21->pActorBuffs[1].uExpireTime) <= v24 )
-            v21->pMonsterInfo.uHostilityType = pMonsterStats->pInfos[v21->pMonsterInfo.uID].uHostilityType;
-        }
-      }
-      if ( v81 != v24
-        && SHIDWORD(v21->pActorBuffs[2].uExpireTime) <= (signed int)v24
-        && (SHIDWORD(v21->pActorBuffs[2].uExpireTime) < (signed int)v24
-         || LODWORD(v21->pActorBuffs[2].uExpireTime) <= v24) )
-      {
-        v21->uAIState = Removed;
-        goto LABEL_254;
-      }
-      if ( v21->pActorBuffs[5].uExpireTime || v21->pActorBuffs[6].uExpireTime )
-        goto LABEL_254;
-      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 )
-      {
-        if ( 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;
-          goto LABEL_152;
-        }
-      }
-      if ( (signed int)v21->uCurrentActionTime < v21->uCurrentActionLength )
-        goto LABEL_254;
-      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);
-        goto LABEL_152;
-      }
-      if ( v21->uAIState == 3 )
-      {
-        v34 = v21->pMonsterInfo.uMissleAttack1Type;
-        v66 = 0;
-        goto LABEL_149;
-      }
-      if ( v21->uAIState == 12 )
-      {
-        v34 = v21->pMonsterInfo.uMissleAttack2Type;
-        v66 = 1;
-LABEL_149:
-        v32 = actor_id;
-        Actor::_404874(actor_id, &pDir, v34, v66);
-        goto LABEL_152;
-      }
-      v32 = actor_id;
-      if ( v21->uAIState == 13 )
-        break;
-      if ( v21->uAIState == 18 )
-      {
-        v65 = v21->pMonsterInfo.uSpellSkillAndMastery2;
-        v60 = 3;
-        v33 = v21->pMonsterInfo.uSpell2ID;
-LABEL_146:
-        Actor::_404AC7(actor_id, &pDir, v33, v60, v65);
-      }
-LABEL_152:
-      v36 = v75.uDistance;
-      if ( v21->pMonsterInfo.uHostilityType )
-        goto LABEL_165;
-      if ( v76 == 3 )
-      {
-        v36 = v75.uDistance;
-        v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (v21->pMonsterInfo.uID - 1) / 3]
-                               + (pActors[a2 >> 3].pMonsterInfo.uID - 1) / 3);
-      }
-      else
-      {
-        v37 = 4;
-      }
-      if ( v37 == 1 )
-        goto LABEL_257;
-      if ( v37 == 2 )
-      {
-        v39 = __OFSUB__(v36, 1024);
-        v38 = ((v36 - 1024) & 0x80000000u) != 0;
-      }
-      else
-      {
-        if ( v37 == 3 )
-        {
-          v39 = __OFSUB__(v36, 2560);
-          v38 = ((v36 - 2560) & 0x80000000u) != 0;
-        }
-        else
-        {
-          if ( v37 != 4 )
-            goto LABEL_165;
-          v39 = __OFSUB__(v36, 5120);
-          v38 = ((v36 - 5120) & 0x80000000u) != 0;
-        }
-      }
-      if ( v38 ^ v39 )
-LABEL_257:
-      v21->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
-LABEL_165:
-      if ( (signed __int64)v21->pActorBuffs[4].uExpireTime > 0 )
-      {
-        v40 = a2;
-        v41 = v32;
-        if ( (signed int)v36 >= 10240 )
-        {
-          v68 = 0;
-          v61 = 1024;
-          goto LABEL_253;
-        }
-        v67 = &pDir;
-        goto LABEL_182;
-      }
-      if ( v21->pMonsterInfo.uHostilityType != 4 || !a2 )
-        goto LABEL_241;
-      if ( !(v21->uAttributes & 0x020000) || v21->pMonsterInfo.uAIType == 1 )
-      {
-        if ( v21->pMonsterInfo.uAIType == 1 )
-        {
-          v67 = &pDir;
-          if ( v21->pMonsterInfo.uMovementType != 5 )
-            goto LABEL_181;
-          Actor::AI_Stand(
-            v32,
-            a2,
-            (signed __int64)((double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333),
-            &pDir);
-        }
-        else
-        {
-          if ( v21->pMonsterInfo.uAIType == 2 )
-          {
-            v84 = v21->sCurrentHP;
-            v42 = (double)(signed int)v84;
-            v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.2;
-          }
-          else
-          {
-            if ( v21->pMonsterInfo.uAIType != 3 )
-              goto LABEL_185;
-            v84 = v21->sCurrentHP;
-            v42 = (double)(signed int)v84;
-            v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.1;
-          }
-          if ( v43 > v42 && (signed int)v36 < 10240 )
-          {
-            v67 = &pDir;
-LABEL_181:
-            v40 = a2;
-            v41 = v32;
-LABEL_182:
-            Actor::_402968(v41, v40, 0, v67);
-            goto LABEL_254;
-          }
-        }
-      }
-LABEL_185:
-      v81 = v36 - v21->uActorRadius;
-      if ( v76 == 3 )
-        v81 -= pActors[a2 >> 3].uActorRadius;
-      if ( 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 )
-        goto LABEL_241;
-      v45 = stru_50C198.special_ability_use_check(v21, v32);
-      if ( !v45 )
-      {
-        if ( v21->pMonsterInfo.uMissleAttack1Type )
-        {
-          if ( v84 )
-          {
-            Actor::_403476(v32, a2, &pDir);
-            goto LABEL_254;
-          }
-LABEL_223:
-          if ( v82 )
-            goto LABEL_217;
-          v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-          //UNDEF(v53);
-          v69 = &pDir;
-          if ( !(v54 | v55) )
-            goto LABEL_219;
-LABEL_225:
-          Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
-          goto LABEL_254;
-        }
-        v56 = v80 * 307.2;
-        if ( (double)v81 >= v56 )
-        {
-          if ( v81 >= 1024 )
-          {
-            if ( v82 )
-              goto LABEL_217;
-            v71 = &pDir;
-            v63 = 0;
-            goto LABEL_240;
-          }
-          goto LABEL_235;
-        }
-        goto LABEL_227;
-      }
-      if ( v45 != 1 )
-      {
-        if ( v45 > 1 && v45 <= 3 )
-        {
-          if ( v45 == 2 )
-            v46 = v21->pMonsterInfo.uSpell1ID;
-          else
-            v46 = v21->pMonsterInfo.uSpell2ID;
-          if ( v46 )
-          {
-            if ( v84 )
-            {
-              if ( v45 == 2 )
-                Actor::_403854(v32, a2, &pDir);
-              else
-                Actor::_403A60(v32, a2, &pDir);
-              goto LABEL_254;
-            }
-            if ( v80 * 307.2 > (double)v81 || v82 )
-            {
-LABEL_217:
-              v69 = &pDir;
-LABEL_218:
-              v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-LABEL_219:
-              v51 = a2;
-              v64 = (signed __int64)v47;
-              v52 = v32;
-LABEL_247:
-              Actor::AI_Stand(v52, v51, v64, v69);
-              goto LABEL_254;
-            }
-            v69 = &pDir;
-            v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
-            goto LABEL_225;
-          }
-          v48 = v80 * 307.2;
-          if ( (double)v81 >= v48 )
-          {
-            if ( v81 >= 1024 )
-            {
-              v50 = v82 == 0;
-LABEL_215:
-              if ( !v50 )
-                goto LABEL_217;
-              v71 = &pDir;
-              v63 = 256;
-LABEL_240:
-              Actor::_402686(v32, a2, v63, v71);
-              goto LABEL_254;
-            }
-            if ( v82 )
-              goto LABEL_217;
-            v70 = (signed __int64)v48;
-            v62 = &pDir;
-            v59 = 0;
-            goto LABEL_237;
-          }
-          v49 = v84 == 0;
-          goto LABEL_209;
-        }
-LABEL_241:
-        if ( !v21->pMonsterInfo.uMovementType )
-        {
-          v68 = 0;
-          v61 = 1024;
-LABEL_252:
-          v41 = v32;
-          v40 = 4;
-LABEL_253:
-          Actor::_4032B2(v41, v40, v61, v68);
-          goto LABEL_254;
-        }
-        if ( v21->pMonsterInfo.uMovementType == 1 )
-        {
-          v68 = 0;
-          v61 = 2560;
-          goto LABEL_252;
-        }
-        if ( v21->pMonsterInfo.uMovementType == 2 )
-        {
-          v68 = 0;
-          v61 = 5120;
-          goto LABEL_252;
-        }
-        if ( v21->pMonsterInfo.uMovementType == 4 )
-        {
-          v68 = 0;
-          v61 = 10240;
-          goto LABEL_252;
-        }
-        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;
-          goto LABEL_247;
-        }
-        goto LABEL_254;
-      }
-      if ( !v21->pMonsterInfo.uMissleAttack2Type )
-      {
-        v56 = v80 * 307.2;
-        if ( (double)v81 >= v56 )
-        {
-          if ( v81 >= 1024 )
-          {
-            v50 = v82 == 0;
-            goto LABEL_215;
-          }
-LABEL_235:
-          if ( v82 )
-            goto LABEL_217;
-          v70 = (signed __int64)v56;
-          v62 = &pDir;
-          v59 = 0;
-LABEL_237:
-          Actor::_40281C(v32, a2, v59, v62, v70);
-          goto LABEL_254;
-        }
-LABEL_227:
-        v49 = v84 == 0;
-LABEL_209:
-        v69 = &pDir;
-        if ( v49 )
-          goto LABEL_218;
-        Actor::_403C6C(v32, a2, &pDir);
-        goto LABEL_254;
-      }
-      if ( !v84 )
-        goto LABEL_223;
-      Actor::_40368B(v32, a2, &pDir);
-LABEL_254:
-      ++v78;
-      if ( v78 >= ai_arrays_size )
-        return;
-    }
-    v65 = v21->pMonsterInfo.uSpellSkillAndMastery1;
-    v60 = 2;
-    v33 = v21->pMonsterInfo.uSpell1ID;
-    goto LABEL_146;
-  }
+void __cdecl UpdateActorAI()
+{
+	//unsigned int v0; // esi@4
+	int v1; // eax@7
+	int v2; // ecx@7
+	int v3; // eax@7
+	signed int v4; // edi@10
+	Actor *v5; // esi@12
+	signed int v6; // eax@14
+	__int16 v7; // cx@14
+	Player **v8; // esi@20
+	Player *pPlayer; // ecx@21
+	//Actor *pActor; // esi@34
+	//__int16 v11; // ax@34
+	//unsigned int v12; // eax@47
+	//signed int v13; // edi@47
+	//SpellBuff *v14; // ebx@47
+	//unsigned int v15; // edi@67
+	//char *v16; // eax@67
+	//unsigned int v17; // edx@67
+	//unsigned int v18; // ecx@67
+	//unsigned __int16 v19; // ax@72
+	//int *v20; // esi@80
+	Actor *v21; // ebx@80
+	unsigned __int16 v22; // ax@86
+	//signed int v23; // eax@94
+	//unsigned int v24; // eax@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
+	AIDirection *v30; // eax@129
+	unsigned __int16 v31; // ax@132
+	unsigned int v32; // esi@142
+	int v33; // eax@144
+	int v34; // eax@147
+	char v35; // al@150
+	unsigned int v36; // edi@152
+	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
+	double v42; // st7@176
+	double v43; // st6@176
+	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
+	__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
+	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
+	int v70; // [sp-10h] [bp-C0h]@213
+	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
+	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
+	//unsigned int uActorID; // [sp+A4h] [bp-Ch]@32
+	unsigned int v84; // [sp+A8h] [bp-8h]@11
+	signed int a2; // [sp+ACh] [bp-4h]@83
+	
+	if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
+	MakeActorAIList_ODM();
+	else
+	MakeActorAIList_BLV();
+	
+	//v0 = 0;
+	if ( uCurrentlyLoadedLevelType != LEVEL_Indoor && pParty->armageddon_timer > 0 )
+	{
+		if ( pParty->armageddon_timer > 417 )
+		{
+			pParty->armageddon_timer = 0;
+		}
+		else
+		{
+			pParty->sRotationY = (stru_5C6E00->uIntegerDoublePi - 1) & (pParty->sRotationY + rand() % 16 - 8);
+			v1 = rand();
+			v2 = 128;
+			v3 = pParty->sRotationX + v1 % 16 - 8;
+			pParty->sRotationX = v3;
+			if ( v3 > 128 || (v2 = -128, v3 < -128) )
+			pParty->sRotationX = v2;
+			pParty->uFlags |= 2u;
+			pParty->armageddon_timer -= pMiscTimer->uTimeElapsed;
+			v4 = pParty->field_16140 + 50;
+			if ( pParty->armageddon_timer <= 0 )
+			{
+				pParty->armageddon_timer = 0;
+				v84 = 0;
+				if ( (signed int)uNumActors > 0 )
+				{
+					v5 = pActors;//[0].sCurrentHP;
+					do
+					{
+						if ( v5->CanAct() )
+						{
+							v6 = stru_50C198.CalcMagicalDamageToActor(v5, 5, v4);
+							v7 = v5->sCurrentHP - v6;
+							v5->sCurrentHP = v7;
+							if ( v6 )
+							{
+								if ( v7 >= 0 )
+								{
+									Actor::_4030AD(v84, 4, 0);
+								}
+								else
+								{
+									Actor::Die(v84);
+									if ( v5->pMonsterInfo.uExp )
+									GivePartyExp(pMonsterStats->pInfos[v5->pMonsterInfo.uID].uExp);
+								}
+							}
+						}
+						++v84;
+						++v5;
+					}
+					while ( (signed int)v84 < (signed int)uNumActors );
+				}
+				v8 = &pPlayers[1];
+				do
+				{
+					pPlayer = *v8;
+					if ( !(*v8)->pConditions[14] && !pPlayer->pConditions[15] && !pPlayer->pConditions[16] )
+					pPlayer->ReceiveDamage(v4, 5);
+					++v8;
+				}
+				while ( (signed int)v8 <= (signed int)&pPlayers[4] );
+				//v0 = 0;
+			}
+			if (pTurnEngine->field_1C)
+			--pTurnEngine->field_1C;
+		}
+	}
+	
+	if (pParty->bTurnBasedModeOn)
+	{
+		pTurnEngine->_405E14();
+		return;
+	}
+	
+	
+	//uActorID = v0;
+	for (uint i = 0; i < uNumActors; ++i)
+	{
+		auto actor = pActors + i;
+		//LODWORD(v80) = (int)(char *)pActors + 176; // uAIState
+		//do
+		//{
+			//pActor = (Actor *)(LODWORD(v80) - 176);
+			//v11 = *(unsigned int *)LODWORD(v80);
+			//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;
+			
+			if (!actor->sCurrentHP && actor->uAIState != Dying)
+			Actor::Die(i);
+			
+			//v84 = *(_QWORD *)(LODWORD(v80) + 84) <= 0i64 ? 0 : 1;
+			//v82 = *(_QWORD *)(LODWORD(v80) + 52) <= 0i64 ? 0 : 1;
+			//v12 = 0;
+			//v13 = 0;
+			//v14 = (SpellBuff *)(LODWORD(v80) + 36);
+			for (uint j = 0; j < 22; ++j)
+			{
+				if (j != 10)
+				actor->pActorBuffs[j]._4585CA(pParty->uTimePlayed);
+			}
+			/*do
+			{
+				if ( v13 != 10 )
+				{
+					v14->_4585CA(pParty->uTimePlayed);
+					v12 = 0;
+				}
+				++v13;
+				++v14;
+			}
+			while ( v13 < 22 );*/
+			if (!actor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime)
+			//&& 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;
+			
+			if (actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime ||
+			actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime)
+			continue;
+			
+			//v15 = pMiscTimer->uTimeElapsed;
+			//v16 = (char *)&pActor->pMonsterInfo.uRecoveryTime;
+			//v17 = pActor->uCurrentActionTime;
+			//v18 = pActor->pMonsterInfo.uRecoveryTime;
+			if (actor->pMonsterInfo.uRecoveryTime)
+			{
+				if (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;
+			
+			//v19 = actor->uAIState;
+			if (actor->uAIState == Dying)
+			actor->uAIState = Dead;
+			else
+			{
+				if (actor->uAIState != Summoned)
+				{
+					Actor::AI_StandOrBored(i, OBJECT_Player, 256, nullptr);
+					continue;
+				}
+				actor->uAIState = Standing;
+			}
+			
+			actor->uCurrentActionTime = 0;
+			actor->uCurrentActionLength = 0;
+			actor->UpdateAnimation();
+			//LABEL_78:
+			//++uActorID;
+			//LODWORD(v80) += 836;
+		//}
+		//while ( (signed int)uActorID < (signed int)uNumActors );
+	}
+	
+	
+	v78 = 0;
+	int actor_id = -1;
+	if ( ai_arrays_size > 0 )
+	{
+		//while ( 1 )
+		for(v78 = 0; v78 < ai_arrays_size; ++v78)
+		{
+			actor_id = ai_near_actors_ids[v78];
+			assert(actor_id < uNumActors);
+			
+			//v20 = &ai_near_actors_targets_pid[actor_id];
+			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;
+			else
+			v80 = 1.0;
+			v22 = v21->uAIState;
+			if ( v22 == Dying || v22 == Dead || v22 == Removed || v22 == Disabled || v22 == Summoned)
+			{
+				continue;
+			}
+			else
+			{
+				if ( !v21->sCurrentHP )
+				Actor::Die(actor_id);
+				v25 = 0;
+				v26 = v21->pActorBuffs;
+				do
+				{
+					if ( v25 != 10 )
+					{
+						v26->_4585CA(pParty->uTimePlayed);
+						//v24 = 0;
+					}
+					++v25;
+					++v26;
+				}
+				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) )
+				v21->uActorHeight = pMonsterList->pMonsters[v21->pMonsterInfo.uID - 1].uMonsterHeight;
+				if ( (signed __int64)v21->pActorBuffs[1].uExpireTime > 0 )
+				{
+					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 )
+				{
+					continue;
+				}
+				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 ( (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);
+							}
+						}
+					}
+				}
+			}
+			v36 = v75.uDistance;
+			if ( !v21->pMonsterInfo.uHostilityType )
+			{
+				if ( v76 == 3 )
+				{
+					v36 = v75.uDistance;
+					v37 = (unsigned __int8)*(&byte_5C8D1A[89 * (v21->pMonsterInfo.uID - 1) / 3]
+					+ (pActors[a2 >> 3].pMonsterInfo.uID - 1) / 3);
+				}
+				else
+				{
+					v37 = 4;
+				}
+				if ( v37 == 2 )
+				{
+					v39 = __OFSUB__(v36, 1024);
+					v38 = ((v36 - 1024) & 0x80000000u) != 0;
+				}
+				else if ( v37 == 3 )
+				{
+					v39 = __OFSUB__(v36, 2560);
+					v38 = ((v36 - 2560) & 0x80000000u) != 0;
+				}
+				else if ( v37 == 4 )
+				{
+					v39 = __OFSUB__(v36, 5120);
+					v38 = ((v36 - 5120) & 0x80000000u) != 0;
+				}
+				if ( v37 >= 1 && v37 <= 4 && v38 ^ v39 || v37 == 1 )
+				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;
+				}
+				v67 = &pDir;
+				Actor::_402968(v41, v40, 0, v67);
+				continue;
+			}
+			if ( v21->pMonsterInfo.uHostilityType == 4 && a2 )
+			{
+				if ( !(v21->uAttributes & 0x020000) || v21->pMonsterInfo.uAIType == 1 )
+				{
+					if ( v21->pMonsterInfo.uAIType == 1 )
+					{
+						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);
+					}
+					else
+					{
+						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;
+							v43 = (double)(signed int)v21->pMonsterInfo.uHP * 0.1;
+						}
+						if ( v21->pMonsterInfo.uAIType == 2 || v21->pMonsterInfo.uAIType == 3 )
+						if ( v43 > v42 && (signed int)v36 < 10240 )
+						{
+							v67 = &pDir;
+							v40 = a2;
+							v41 = v32;
+							Actor::_402968(v41, v40, 0, v67);
+							continue;
+						}
+					}
+				}
+				v81 = v36 - v21->uActorRadius;
+				if ( v76 == 3 )
+				v81 -= pActors[a2 >> 3].uActorRadius;
+				if ( 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 )
+					{
+						if ( v21->pMonsterInfo.uMissleAttack1Type )
+						{
+							if ( v84 )
+							{
+								Actor::_403476(v32, a2, &pDir);
+								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;
+							}
+							v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+							//UNDEF(v53);
+							v69 = &pDir;
+							if ( !(v54 | v55) )
+							{
+								v51 = a2;
+								v64 = (signed __int64)v47;
+								v52 = v32;
+								Actor::AI_Stand(v52, v51, v64, v69);
+								continue;
+							}
+							Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
+							continue;
+						}
+						v56 = v80 * 307.2;
+						if ( (double)v81 >= v56 )
+						{
+							if ( v81 >= 1024 )
+							{
+								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;
+								}
+								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;
+							}
+							v70 = (signed __int64)v56;
+							v62 = &pDir;
+							v59 = 0;
+							Actor::_40281C(v32, a2, v59, v62, v70);
+							continue;
+						}
+						v49 = v84 == 0;
+						v69 = &pDir;
+						if ( v49 )
+						{
+							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 ( v45 != 1 )
+					{
+						if ( v45 > 1 && v45 <= 3 )
+						{
+							if ( v45 == 2 )
+							v46 = v21->pMonsterInfo.uSpell1ID;
+							else
+							v46 = v21->pMonsterInfo.uSpell2ID;
+							if ( v46 )
+							{
+								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;
+								v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+								Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
+								continue;
+							}
+							v48 = v80 * 307.2;
+							if ( (double)v81 >= v48 )
+							{
+								if ( v81 >= 1024 )
+								{
+									v50 = v82 == 0;
+									if ( !v50 )
+									{
+										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;
+									}
+									v71 = &pDir;
+									v63 = 256;
+									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;
+								}
+								v70 = (signed __int64)v48;
+								v62 = &pDir;
+								v59 = 0;
+								Actor::_40281C(v32, a2, v59, v62, v70);
+								continue;
+							}
+							v49 = v84 == 0;
+							v69 = &pDir;
+							if ( v49 )
+							{
+								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 ( v21->pMonsterInfo.uHostilityType != 4 || !a2 || v81 >= 5120 || v45 != 1 )
+			{
+				if ( !v21->pMonsterInfo.uMovementType )
+				{
+					v68 = 0;
+					v61 = 1024;
+					v41 = v32;
+					v40 = 4;
+					Actor::_4032B2(v41, v40, v61, v68);
+					continue;
+					
+				}
+				if ( v21->pMonsterInfo.uMovementType == 1 )
+				{
+					v68 = 0;
+					v61 = 2560;
+					v41 = v32;
+					v40 = 4;
+					Actor::_4032B2(v41, v40, v61, v68);
+					continue;
+				}
+				if ( v21->pMonsterInfo.uMovementType == 2 )
+				{
+					v68 = 0;
+					v61 = 5120;
+					v41 = v32;
+					v40 = 4;
+					Actor::_4032B2(v41, v40, v61, v68);
+					continue;
+				}
+				if ( v21->pMonsterInfo.uMovementType == 4 )
+				{
+					v68 = 0;
+					v61 = 10240;
+					v41 = v32;
+					v40 = 4;
+					Actor::_4032B2(v41, v40, v61, v68);
+					continue;
+				}
+				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;
+				
+			}
+			if ( !v21->pMonsterInfo.uMissleAttack2Type )
+			{
+				v56 = v80 * 307.2;
+				if ( (double)v81 >= v56 )
+				{
+					if ( v81 >= 1024 )
+					{
+						v50 = v82 == 0;
+						if ( !v50 )
+						{
+							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;
+						}
+						v71 = &pDir;
+						v63 = 256;
+						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;
+					}
+					v70 = (signed __int64)v56;
+					v62 = &pDir;
+					v59 = 0;
+					Actor::_40281C(v32, a2, v59, v62, v70);
+					continue;
+					
+				}
+				v49 = v84 == 0;
+				v69 = &pDir;
+				if ( v49 )
+				{
+					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;
+				}
+				v47 = (double)(signed int)v21->pMonsterInfo.uRecoveryTime * 2.133333333333333;
+				//UNDEF(v53);
+				v69 = &pDir;
+				if ( !(v54 | v55) )
+				{
+					v51 = a2;
+					v64 = (signed __int64)v47;
+					v52 = v32;
+					Actor::AI_Stand(v52, v51, v64, v69);
+					continue;
+				}
+				Actor::_402AD7(v32, a2, v32, (signed __int64)v47, v69);
+				continue;
+			}
+			Actor::_40368B(v32, a2, &pDir);
+		}
+	}
 }
 
 //----- (0040261D) --------------------------------------------------------
@@ -15978,6 +16107,7 @@
   {
     do
     {
+      __debugbreak();
       *(&v31.uDistance + v18) = pParty->pPlayers[*(&v1->field_0 + 4 * (*(&a3.uDistance + v18) + 2)) >> 3].GetAttackRecoveryTime(
                                   v2);
       ++v18;