changeset 1340:22cb507446a4

turnengine refactoring continue
author Gloval
date Sat, 06 Jul 2013 00:29:29 +0400
parents 8bfdc44cebfd
children 67e47fc3133d 47975067d6a8
files Actor.cpp CastSpellInfo.cpp Indoor.cpp Mouse.cpp Overlays.cpp Party.cpp Player.cpp Spells.cpp Spells.h TurnEngine.cpp TurnEngine.h UI/UiGame.cpp Viewport.cpp mm7_3.cpp mm7_4.cpp mm7_5.cpp mm7_6.cpp
diffstat 17 files changed, 183 insertions(+), 300 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Actor.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -4188,7 +4188,7 @@
 			for (uint j = 0; j < 22; ++j)
 			{
 				if (j != 10)
-				pActor->pActorBuffs[j]._4585CA(pParty->uTimePlayed);
+				pActor->pActorBuffs[j].IsBuffExpiredToTime(pParty->uTimePlayed);
 			}
 			/*do
 			{
@@ -4287,7 +4287,7 @@
 			{
 				if ( i != 10 )
 				{
-					pActor->pActorBuffs[i]._4585CA(pParty->uTimePlayed);
+					pActor->pActorBuffs[i].IsBuffExpiredToTime(pParty->uTimePlayed);
 				}
 			}
 			if ( (signed __int64)pActor->pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime < 0 )
--- a/CastSpellInfo.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/CastSpellInfo.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -4165,7 +4165,7 @@
   //  || (result = pTurnEngine->field_4, pTurnEngine->field_4 != 1) && pTurnEngine->field_4 != 3 )
   if (pParty->bTurnBasedModeOn)
   {
-    if (pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 3)
+    if (pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 3)
       return;
   }
 
--- a/Indoor.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Indoor.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -3893,7 +3893,7 @@
           v6 *= 2;
           v61 = v6;
         }
-        if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 1 )
+        if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 1 )
           v6 = (signed __int64)((double)v61 * flt_6BE3AC_debug_recmod1_x_1_6);
         if ( v6 > 1000 )
           v6 = 1000;
@@ -4196,7 +4196,7 @@
               Actor::AI_FaceObject(v63, v36, v22, (AIDirection *)v22);
               goto LABEL_119;
             }
-            if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->field_4 == 2 || pTurnEngine->field_4 == 3) )
+            if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->turn_stage == 2 || pTurnEngine->turn_stage == 3) )
               goto LABEL_119;
             if ( v0->pMonsterInfo.uHostilityType )
             {
@@ -4224,7 +4224,7 @@
         }
         else
         {
-          if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->field_4 == 2 || pTurnEngine->field_4 == 3) )
+          if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->turn_stage == 2 || pTurnEngine->turn_stage == 3) )
             goto LABEL_123;
           if ( !v0->pMonsterInfo.uHostilityType || v56 != v22 )
           {
--- a/Mouse.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Mouse.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -630,7 +630,7 @@
 
     if ( pParty->bTurnBasedModeOn == 1 )
     {
-      if ( pTurnEngine->field_4 == 3 )
+      if ( pTurnEngine->turn_stage == 3 )
         pTurnEngine->field_18 |= TE_FLAG_8;
     }
   }
--- a/Overlays.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Overlays.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -110,14 +110,14 @@
   if ( pCurrentScreen != SCREEN_GAME || !pParty->bTurnBasedModeOn)
     return;
 
-  if ( pTurnEngine->field_4 == 3 )
+  if ( pTurnEngine->turn_stage == 3 )
   {
     v6 = pEventTimer->uStartTime;
     v5 = pIconIDs_Turn[5 - pTurnEngine->uActionPointsLeft / 26];
   }
   else
   {
-    if ( pTurnEngine->field_4 == 1 )
+    if ( pTurnEngine->turn_stage == 1 )
     {
       v6 = dword_50C994;
       v3 = pIconsFrameTable;
@@ -127,7 +127,7 @@
         v5 = uIconID_TurnHour;
       goto LABEL_12;
     }
-    if ( pTurnEngine->field_4 != 2 )
+    if ( pTurnEngine->turn_stage != 2 )
     {
       v4 = this;
       goto LABEL_14;
--- a/Party.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Party.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -164,7 +164,7 @@
   v12 = 0;
   if ( pParty->bTurnBasedModeOn == 1 )
   {
-    if ( pTurnEngine->field_4 != 2 || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) != OBJECT_Player)
+    if ( pTurnEngine->turn_stage != 2 || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) != OBJECT_Player)
       return 0;
     v2 = PID_ID(pTurnEngine->pQueue[0].uPackedID);
     return v2 + 1;
--- a/Player.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Player.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -6518,7 +6518,7 @@
     thisb = this;
     v3 = &pParty->pPlayers[player_num-1];
     v73 = 1;
-    if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 3) )
+    if ( pParty->bTurnBasedModeOn == 1 && (pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 3) )
         return;
     if ( pItemsTable->pItems[pParty->pPickedItem.uItemID].uEquipType == EQUIP_REAGENT )
         {
--- a/Spells.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Spells.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -256,9 +256,9 @@
 }
 
 //----- (004585CA) --------------------------------------------------------
-signed int SpellBuff::_4585CA(__int64 a2)
-{
-  if (uExpireTime && uExpireTime < a2)
+bool SpellBuff::IsBuffExpiredToTime( __int64 time_end )
+    {
+  if (uExpireTime && (uExpireTime < time_end))
   {
     uExpireTime = 0;
     uPower = 0;
@@ -270,9 +270,9 @@
 }
 
 //----- (004584E0) --------------------------------------------------------
-bool SpellBuff::Apply(unsigned __int64 uExpireTime, unsigned __int16 uSkillLevel, unsigned __int16 uPower, int uOverlayID, unsigned __int8 caster)
-{
-  if (this->uExpireTime && uExpireTime < this->uExpireTime)
+bool SpellBuff::Apply( signed __int64 uExpireTime, unsigned __int16 uSkillLevel, unsigned __int16 uPower, int uOverlayID, unsigned __int8 caster )
+    {
+  if (this->uExpireTime && (uExpireTime < this->uExpireTime))
     return false;
 
   this->uSkill = uSkillLevel;
--- a/Spells.h	Fri Jul 05 17:37:30 2013 +0600
+++ b/Spells.h	Sat Jul 06 00:29:29 2013 +0400
@@ -155,12 +155,12 @@
     uFlags = 0;
   }
 
-  bool Apply(unsigned __int64 uExpireTime, unsigned __int16 uSkillLevel, unsigned __int16 uPower, int uOverlayID, unsigned __int8 caster);
+  bool Apply(signed __int64 uExpireTime, unsigned __int16 uSkillLevel, unsigned __int16 uPower, int uOverlayID, unsigned __int8 caster);
   void Reset();
-  signed int _4585CA(__int64 a2);
+  bool IsBuffExpiredToTime(__int64 time_end);
   bool NotExpired();
 
-  unsigned __int64 uExpireTime;
+  signed __int64 uExpireTime;
   unsigned __int16 uPower;
   unsigned __int16 uSkill;
   unsigned __int16 uOverlayID;
--- a/TurnEngine.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/TurnEngine.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -111,7 +111,7 @@
     {
     if ( pParty->bTurnBasedModeOn == 1 )
         {
-        if ( pTurnEngine->field_4 == 2 )
+        if ( pTurnEngine->turn_stage == 2 )
             _406457(0);
         }
     }
@@ -174,7 +174,7 @@
     this->field_10 = 100;
     this->field_0 = 0;
     this->field_8 = 64;
-    this->field_4 = 1;
+    this->turn_stage = 1;
     this->uActorQueueSize = 0;
 
     for ( v3 = 0; v3 < 4 ; ++v3 )
@@ -285,7 +285,7 @@
     int objID; // esi@13
     int i; 
 
-    this->field_4 = 0;
+    this->turn_stage = 0;
 
     for( i=0; i<uActorQueueSize; ++i) 
         { 
@@ -327,161 +327,104 @@
 //----- (00405E14) --------------------------------------------------------
 void stru262_TurnBased::_405E14()
     {
-    stru262_TurnBased *v1; // esi@1
-    int v2; // ecx@1
-    SpellBuff *v3; // edi@2
-    Actor *v4; // ebx@3
-    signed int v5; // edx@20
     AIDirection *v6; // esi@21
     int v7; // eax@21
-    int v8; // eax@21
-    int v9; // eax@22
-    int v10; // eax@23
-    int v11; // eax@37
-    int v12; // eax@44
     AIDirection a3; // [sp+4h] [bp-68h]@21
     AIDirection v14; // [sp+20h] [bp-4Ch]@21
     AIDirection v15; // [sp+3Ch] [bp-30h]@21
-    Actor *v16; // [sp+58h] [bp-14h]@2
-    int v17; // [sp+5Ch] [bp-10h]@6
-    stru262_TurnBased *v18; // [sp+60h] [bp-Ch]@1
-    int v19; // [sp+64h] [bp-8h]@8
-    unsigned int v20; // [sp+68h] [bp-4h]@1
+    Actor *curr_actor; // [sp+58h] [bp-14h]@2
+    int target_pid; // [sp+5Ch] [bp-10h]@6
+    int shrinked;
+    int i,j;
 
-    v1 = this;
-    v2 = 0;
-    v18 = v1;
-    v20 = 0;
-    if ( (signed int)uNumActors > 0 )
+    for (i =0; i<uNumActors; ++i )
         {
-        //v3 = pActors;//[0].pActorBuffs;
-        v16 = pActors.data();//[0].pActorBuffs;
-        v3 = v16->pActorBuffs;
-        do
+        curr_actor=&pActors[i];
+        shrinked=pActors[i].pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime > 0;
+        for (j =0; j<22; ++j) //check expired spell Buffs
+            {
+            if(j != 10)
+                pActors[i].pActorBuffs[j].IsBuffExpiredToTime(pParty->uTimePlayed);
+            }
+        if (shrinked && pActors[i].pActorBuffs[ACTOR_BUFF_SHRINK].uExpireTime <=0) //buff 3 expired
             {
-            v4 = v16;
-            if ( SHIDWORD(v3[3].uExpireTime) < v2 || SHIDWORD(v3[3].uExpireTime) <= v2 && LODWORD(v3[3].uExpireTime) <= v2 )
-                v17 = v2;
-            else
-                v17 = 1;
-            v19 = v2;
-            do
+            pActors[i].uActorHeight = pMonsterList->pMonsters[pActors[i].pMonsterInfo.uID - 1].uMonsterHeight;
+            }
+        if(!(curr_actor->uAttributes&0x80)&&
+              (!curr_actor->pActorBuffs[ACTOR_BUFF_STONED].uExpireTime)&&
+              (!curr_actor->pActorBuffs[ACTOR_BUFF_PARALYZED].uExpireTime)) 
+            {
+            curr_actor->uCurrentActionTime += pMiscTimer->uTimeElapsed;
+            if (curr_actor->uCurrentActionTime>=curr_actor->uCurrentActionLength)
                 {
-                if ( v19 != 10 )
+                target_pid = ai_near_actors_targets_pid[i];
+                v6 = Actor::GetDirectionInfo(PID(OBJECT_Actor,i), target_pid, &a3, 0);  
+                memcpy(&v15, v6, sizeof(AIDirection));   
+                memcpy(&v14, &v15, sizeof(AIDirection));
+                v7 = curr_actor->uAIState;
+                if(v7==Dying)
                     {
-                    v3->_4585CA(pParty->uTimePlayed);
-                    v2 = 0;
+                    curr_actor->uCurrentActionTime = 0;
+                    curr_actor->uCurrentActionLength = 0;
+                    curr_actor->uAIState = Dead;
+                    curr_actor->UpdateAnimation();
                     }
-                ++v19;
-                ++v3;
-                }
-                while ( v19 < 22 );
-                if ( v17 != 0
-                    && SHIDWORD(v4->pActorBuffs[3].uExpireTime) <= 0
-                    && (SHIDWORD(v4->pActorBuffs[3].uExpireTime) < 0 || LODWORD(v4->pActorBuffs[3].uExpireTime) <= 0) )
-                    v4->uActorHeight = pMonsterList->pMonsters[v4->pMonsterInfo.uID - 1].uMonsterHeight;
-                if ( !(v4->uAttributes & 0x80) )
+                else  if ( (v7 > Removed)&&(v7 < Disabled))
                     {
-                    if ( !v4->pActorBuffs[5].uExpireTime )
-                        {
-                        if ( !v4->pActorBuffs[6].uExpireTime )
-                            {
-                            v5 = v4->uCurrentActionLength;
-                            v4->uCurrentActionTime += pMiscTimer->uTimeElapsed;
-                            if ( (signed int)v4->uCurrentActionTime >= v5 )
-                                {
-                                v17 = ai_near_actors_targets_pid[v20];
-                                v6 = Actor::GetDirectionInfo(PID(OBJECT_Actor,v20), v17, &a3, 0);
-                                v7 = v4->uAIState;
-                                memcpy(&v15, v6, sizeof(v15));
-                                v8 = v7 - 4;
-                                memcpy(&v14, &v15, sizeof(v14));
-                                if ( v8 )
-                                    {
-                                    v9 = v8 - 1;
-                                    if ( v9 )
-                                        {
-                                        v10 = v9 - 6;
-                                        if ( v10 )
-                                            {
-                                            if ( v10 != 8 )
-                                                Actor::AI_StandOrBored(v20, v17, 32, &v14);
-                                            }
-                                        }
-                                    }
-                                else
-                                    {
-                                    v4->uCurrentActionTime = 0;
-                                    v4->uCurrentActionLength = 0;
-                                    v4->uAIState = Dead;
-                                    v4->UpdateAnimation();
-                                    }
-                                v1 = v18;
-                                v2 = 0;
-                                }
-                            }
-                        }
+                     Actor::AI_StandOrBored(i, target_pid, 32, &v14);
                     }
-                ++v20;
-                v3 = v16[1].pActorBuffs;
-                ++v16;
+                }
+            }
+        }
+    
+    if ( turn_stage == 1 )
+        {
+        if ( field_8 == 64 )
+            {
+            _406A63();
             }
-            while ( (signed int)v20 < (signed int)uNumActors );
+        else  if ( field_8 > 0 )
+                {
+                _406B9F();
+                }
+        else
+                {
+                _406AFE();
+                field_10 = 100;
+                }
+        field_8 -= pEventTimer->uTimeElapsed;
+
         }
-    if ( v1->field_4 == 1 )
+    else if ( turn_stage == 2 )
         {
-        v12 = v1->field_8;
-        if ( v12 == 64 )
+        if ( !(field_18 & TE_FLAG_1) )
             {
-            v1->_406A63();
+            if ( field_10 == 100 )
+                {
+                StartTurn();
+                _40652A();
+                }
+            if ( field_10 > 0 || pQueue[0].field_4 <= 0 )
+                {
+                _4065B0();
+                _40652A();
+                }
+            }
+        else
+            NextTurn();
+
+        }
+    else if ( turn_stage == 3 )
+        {
+        if ( uActionPointsLeft <= 0 || field_18 & TE_FLAG_8 )
+            {
+            field_18 &= ~TE_FLAG_8;
+            turn_stage = 1;
+            field_8 = 64;
             }
         else
             {
-            if ( v12 > 0 )
-                {
-                v1->_406B9F();
-                }
-            else
-                {
-                v1->_406AFE();
-                v1->field_10 = 100;
-                }
-            }
-        v1->field_8 -= pEventTimer->uTimeElapsed;
-        return;
-        }
-    if ( v1->field_4 == 2 )
-        {
-        if ( !(v1->field_18 & TE_FLAG_1) )
-            {
-            v11 = v1->field_10;
-            if ( v11 == 100 )
-                {
-                v1->StartTurn();
-LABEL_39:
-                v1->_40652A();
-                return;
-                }
-            if ( v11 > 0 || v1->pQueue[0].field_4 <= 0 )
-                {
-                v1->_4065B0();
-                goto LABEL_39;
-                }
-            }
-        v1->NextTurn();
-        return;
-        }
-    if ( v1->field_4 == 3 )
-        {
-        if ( v1->uActionPointsLeft <= 0 || v1->field_18 & TE_FLAG_8 )
-            {
-            v1->field_18 &= ~TE_FLAG_8;
-            v1->field_4 = 1;
-            v1->field_8 = 64;
-            }
-        else
-            {
-            v1->_406FA8();
+            _406FA8();
             }
         }
     }
@@ -747,7 +690,7 @@
                 }
                 while ( v8 < v1->uActorQueueSize );
             }
-        v1->field_4 = 3;
+        v1->turn_stage = 3;
         pParty->uTimePlayed += __PAIR__(v3, 213);
         _494035_timed_effects__water_walking_damage__etc();
         v1->uActionPointsLeft = 130;
@@ -844,7 +787,7 @@
     }
 
 //----- (00406457) --------------------------------------------------------
-int stru262_TurnBased::_406457(int a2)
+void stru262_TurnBased::_406457( int a2 )
     {
     stru262_TurnBased *v2; // esi@1
     signed int v3; // eax@1
@@ -855,16 +798,13 @@
     int v8; // edx@13
     int v9; // ecx@14
     char v10; // zf@15
+    int i;
 
-    v2 = this;
-    v3 = *(&this->field_0 + 4 * (a2 + 2));
-    if ( (*((char *)&this->field_0 + 16 * PID_TYPE(a2 + 2))) == OBJECT_Player)
+    if (  PID_TYPE(pQueue[a2].uPackedID) == OBJECT_Player)
         {
-        v4 = PID_ID(v3);
-        v5 = (char *)&pParty->pTurnBasedPlayerRecoveryTimes[PID_ID(v3)];
-        v6 = *(int *)v5;
-        if ( *(int *)v5 )
-            *(int *)v5 = 0;
+        v4 = PID_ID(pQueue[a2].uPackedID);
+        if ( pParty->pTurnBasedPlayerRecoveryTimes[v4] )
+            pParty->pTurnBasedPlayerRecoveryTimes[v4] = 0;
         else
             v6 = pPlayers[v4 + 1]->GetAttackRecoveryTime(0);
         if ( v6 < 30 )
@@ -872,44 +812,34 @@
         }
     else
         {
-        v6 = pMonsterStats->pInfos[pActors[PID_ID(v3)].pMonsterInfo.uID].uRecoveryTime;
+        v6 = pMonsterStats->pInfos[pActors[PID_ID(pQueue[a2].uPackedID)].pMonsterInfo.uID].uRecoveryTime;
         }
-    v2->pQueue[a2].field_4 = v6;
-    v2->SortTurnQueue();
-    if (PID_TYPE(v2->pQueue[0].uPackedID) == OBJECT_Player)
-        uActiveCharacter = PID_ID(v2->pQueue[0].uPackedID) + 1;
+
+    pQueue[a2].field_4 = v6;
+    SortTurnQueue();
+    if (PID_TYPE(pQueue[0].uPackedID) == OBJECT_Player)
+        uActiveCharacter = PID_ID(pQueue[0].uPackedID) + 1;
     else
         uActiveCharacter = 0;
-    result = (int)&v2->pQueue[0].field_4;
     viewparams->bRedrawGameUI = 1;
-    while ( *(int *)result > 0 )
+    if (pQueue[0].field_4 > 0)
         {
-        if ( v2->field_10 <= 0 )
-            break;
-        v8 = 0;
-        if ( v2->uActorQueueSize > 0 )
+        while(field_10 > 0)
             {
-            v9 = (int)&v2->pQueue[0].field_4;
-            do
+            for (i=0; i<uActorQueueSize; ++i)
                 {
-                v10 = (*(int *)v9)-- == 1;
-                if ( v10 )
-                    *(int *)(v9 + 4) = 0;
-                ++v8;
-                v9 += 16;
+                --pQueue[i].field_4;
+                if (pQueue[i].field_4==0)
+                    pQueue[i].uActionLength=0;
                 }
-                while ( v8 < v2->uActorQueueSize );
+            --field_10;
             }
-        --v2->field_10;
-        if ( v2->field_10 <= 0 )
-            break;
         }
-    return result;
     }
 
 //----- (0040652A) --------------------------------------------------------
 void stru262_TurnBased::_40652A()
-{
+    {
     int i;
     int monster_ai_state;
     Actor *monster; // eax@5
@@ -929,11 +859,10 @@
                 pQueue[i].field_4 == pMonsterStats->pInfos[monster->pMonsterInfo.uID].uRecoveryTime;
                 if (monster->pActorBuffs[7].uExpireTime > 0)
                     pQueue[i].field_4*=2;
-
                 }
             }
         }
-}
+    }
 
 //----- (004065B0) --------------------------------------------------------
 void stru262_TurnBased::_4065B0()
@@ -1270,92 +1199,50 @@
 //----- (00406A63) --------------------------------------------------------
 void stru262_TurnBased::_406A63()
     {
-    stru262_TurnBased *v1; // ebx@1
-    int v2; // esi@1
-    unsigned __int8 v3; // zf@1
-    unsigned __int8 v4; // sf@1
-    signed int v5; // ecx@4
+  
     AIDirection a3; // [sp+8h] [bp-44h]@5
     AIDirection v7; // [sp+24h] [bp-28h]@5
-    unsigned int v8; // [sp+40h] [bp-Ch]@5
-    signed int a2; // [sp+44h] [bp-8h]@1
-    TurnBased_QueueElem *v10; // [sp+48h] [bp-4h]@2
+    unsigned int target_pid; // [sp+40h] [bp-Ch]@5
+    int i;
 
-    v1 = this;
-    v2 = 0;
     this->field_8 = 64;
     dword_50C994 = 0;
     uActiveCharacter = 0;
-    v3 = this->uActorQueueSize == 0;
-    v4 = this->uActorQueueSize < 0;
-    a2 = 0;
-    if ( !(v4 | v3) )
+    for (i=0; i<uActorQueueSize; ++i )
         {
-        v10 = this->pQueue;
-        while ( 1 )
+        if (PID_TYPE(pQueue[i].uPackedID) == OBJECT_Actor)
             {
-            v5 = v10->uPackedID;
-            if (PID_TYPE(v10->uPackedID) == OBJECT_Actor)
-                {
-                v8 = ai_near_actors_targets_pid[PID_ID(v5)];
-                memcpy(&v7, Actor::GetDirectionInfo(v5, v8, &a3, 0), sizeof(v7));
-                if ( !v1->ActorTurn(a2) )
-                    Actor::AI_Stand(PID_ID(v10->uPackedID), v8, 32, &v7);
-                }
-            ++a2;
-            ++v10;
-            if ( a2 >= v1->uActorQueueSize )
-                break;
-            v2 = 0;
+            target_pid = ai_near_actors_targets_pid[PID_ID(pQueue[i].uPackedID)];
+            memcpy(&v7, Actor::GetDirectionInfo(pQueue[i].uPackedID, target_pid, &a3, 0), sizeof(AIDirection));
+            if ( !ActorTurn(i) )
+                Actor::AI_Stand(PID_ID(pQueue[i].uPackedID), target_pid, 32, &v7);
             }
-        }
+        }   
     }
 // 50C994: using guessed type int dword_50C994;
 
 //----- (00406AFE) --------------------------------------------------------
 void stru262_TurnBased::_406AFE()
     {
-    stru262_TurnBased *v1; // edi@1
-    TurnBased_QueueElem *v2; // ebx@2
-    int v3; // esi@4
-    int v4; // ecx@5
     AIDirection a3; // [sp+4h] [bp-48h]@5
-    AIDirection v6; // [sp+20h] [bp-2Ch]@5
-    stru262_TurnBased *v7; // [sp+3Ch] [bp-10h]@1
-    unsigned int v8; // [sp+40h] [bp-Ch]@4
-    unsigned int v9; // [sp+44h] [bp-8h]@5
-    int v10; // [sp+48h] [bp-4h]@1
+    AIDirection v7; // [sp+20h] [bp-2Ch]@5
+    unsigned int target_pid; 
+    int i;
 
-    v10 = 0;
-    v1 = this;
-    v7 = this;
-    if ( this->uActorQueueSize > 0 )
+    for (i=0; i<uActorQueueSize; ++i )
         {
-        v2 = this->pQueue;
-        do
+        if (PID_TYPE(pQueue[i].uPackedID) == OBJECT_Actor)
             {
-            if (PID_TYPE(v2->uPackedID) == OBJECT_Actor)
-                {
-                v3 = PID_ID(v2->uPackedID);
-                v8 = v3;
-                if ( pActors[v3].CanAct() )
-                    {
-                    v4 = v2->uPackedID;
-                    v9 = ai_near_actors_targets_pid[v3];
-                    memcpy(&v6, Actor::GetDirectionInfo(v4, v9, &a3, 0), sizeof(v6));
-                    Actor::AI_Stand(v8, v9, 32, &v6);
-                    v2->field_C = 0;
-                    v2->uActionLength = 0;
-                    v1 = v7;
-                    }
-                }
-            ++v10;
-            ++v2;
+            target_pid = ai_near_actors_targets_pid[PID_ID(pQueue[i].uPackedID)];
+            memcpy(&v7, Actor::GetDirectionInfo(pQueue[i].uPackedID, target_pid, &a3, 0), sizeof(AIDirection));
+            Actor::AI_Stand(PID_ID(pQueue[i].uPackedID), target_pid, 32, &v7);
+            pQueue[i].field_C = 0;
+            pQueue[i].uActionLength = 0;
             }
-            while ( v10 < v1->uActorQueueSize );
-        }
-    v1->field_4 = 2;
-    v1->field_8 = 100;
+        }   
+    turn_stage = 2;
+    field_8 = 100;
+
     }
 
 //----- (00406B9F) --------------------------------------------------------
@@ -1460,10 +1347,6 @@
     TurnBased_QueueElem *v17; // eax@25
     double v18; // st7@33
     double v19; // st6@33
-    int v21; // [sp-8h] [bp-5Ch]@23
-    int v22; // [sp-8h] [bp-5Ch]@26
-    AIDirection *v23; // [sp-4h] [bp-58h]@23
-    int v24; // [sp-4h] [bp-58h]@26
     AIDirection a3; // [sp+Ch] [bp-48h]@10
     AIDirection pDir; // [sp+28h] [bp-2Ch]@10
     int v27; // [sp+44h] [bp-10h]@33
@@ -1692,20 +1575,20 @@
                 uActorID = v4;
                 v5 = &pActors[v4];
                 v6 = v5->uAIState;
-                if ( v6 != 5 )
+                if ( v6 != 5 ) // Dead 
                     {
-                    if ( v6 != 11 )
+                    if ( v6 != 11 )// Removed
                         {
-                        if ( v6 != 19 )
+                        if ( v6 != 19 ) //Disabled 
                             {
-                            if ( v6 != 17 )
+                            if ( v6 != 17 ) //Summoned
                                 {
                                 v7 = (unsigned int *)&ai_near_actors_targets_pid[v4];
                                 a2 = *v7;
                                 v8 = a2;
                                 Actor::_SelectTarget(v4, (int *)v7, true);
-                                memcpy(&v11, Actor::GetDirectionInfo(*(int *)((char *)&v3->uPackedID + v18), v8, &a3, 0), sizeof(v11));
-                                memcpy(&a4, &v11, sizeof(a4));
+                                memcpy(&v11, Actor::GetDirectionInfo(*(int *)((char *)&v3->uPackedID + v18), v8, &a3, 0), sizeof(AIDirection));
+                                memcpy(&a4, &v11, sizeof(AIDirection));
                                 v5->uCurrentActionTime += pMiscTimer->uTimeElapsed;
                                 if ( (signed int)v5->uCurrentActionTime >= v5->uCurrentActionLength )
                                     {
--- a/TurnEngine.h	Fri Jul 05 17:37:30 2013 +0600
+++ b/TurnEngine.h	Sat Jul 06 00:29:29 2013 +0400
@@ -35,7 +35,7 @@
   inline stru262_TurnBased()
   {
     field_0 = 0;
-    field_4 = 0;
+    turn_stage = 0;
     field_8 = 0;
     uActorQueueSize = 0;
     field_10 = 0;
@@ -52,7 +52,7 @@
   __int16 StartTurn();
   void NextTurn();
   int _4063A1();
-  int _406457(int a2);
+  void _406457(int a2);
   void _40652A();
   void _4065B0();
   void _406648(unsigned int a2);
@@ -65,7 +65,7 @@
 
 
   int field_0;
-  int field_4;
+  int turn_stage;
   int field_8;
   int uActorQueueSize; //c
   int field_10;
--- a/UI/UiGame.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/UI/UiGame.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -2289,7 +2289,7 @@
         }
     if ( pParty->bTurnBasedModeOn == 1 )
         {
-        if ( pTurnEngine->field_4 != 1 )
+        if ( pTurnEngine->turn_stage != 1 )
             {
             if (PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player)
                 {
--- a/Viewport.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/Viewport.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -467,7 +467,7 @@
         pMessageQueue_50CBD0->AddMessage(UIMSG_StartNPCDialogue, v18, 0);
         return;
       }
-      if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 )
+      if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3 )
       {
         pTurnEngine->field_18 |= TE_FLAG_8;
         return;
@@ -476,7 +476,7 @@
     }
     else
     {
-      if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 )
+      if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3 )
       {
         pParty->uFlags |= PARTY_FLAGS_1_FALLING;
         return;
--- a/mm7_3.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/mm7_3.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -997,7 +997,7 @@
         v8 *= 2;
         v73 = v8;
       }
-      if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 1 )
+      if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 1 )
         v8 = (signed __int64)((double)v73 * flt_6BE3AC_debug_recmod1_x_1_6);
       if ( v8 > 1000 )
         v8 = 1000;
@@ -1176,7 +1176,7 @@
       switch ( PID_TYPE(v38) )
       {
         case OBJECT_Actor:
-          if ( pTurnEngine->field_4 != 2 && pTurnEngine->field_4 != 3 || pParty->bTurnBasedModeOn != 1 )
+          if ( pTurnEngine->turn_stage != 2 && pTurnEngine->turn_stage != 3 || pParty->bTurnBasedModeOn != 1 )
           {
 			//if(pParty->bTurnBasedModeOn == 1)
 				//v34 = 0;
@@ -1874,7 +1874,7 @@
     stru_721530.field_24 = pParty->uFallSpeed;
     stru_721530.uSectorID = uSectorID;
     v38 = 0;
-    if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 )
+    if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3 )
       v38 = 13312;
     if ( stru_721530._47050A(v38) )
       break;
@@ -2778,7 +2778,7 @@
     stru_721530.field_24 = v121;
     v36 = 0;
     stru_721530.uSectorID = 0;
-    if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3 )
+    if ( pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3 )
       v36 = 13312;
     if ( stru_721530._47050A(v36) )
       break;
--- a/mm7_4.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/mm7_4.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -1875,7 +1875,7 @@
     v43 = (signed __int64)v21->pPlayerBuffs[7].uExpireTime > 0;
 
     for (uint k = 0; k < 24; ++k)
-      v21->pPlayerBuffs[k]._4585CA(pParty->uTimePlayed);
+      v21->pPlayerBuffs[k].IsBuffExpiredToTime(pParty->uTimePlayed);
 
     if ( v43 && (signed __int64)v21->pPlayerBuffs[7].uExpireTime <= 0 )
       v21->SetCondition(1u, 0);
@@ -1886,7 +1886,7 @@
 
   for (uint i = 0; i < 20; ++i)
   {
-    if (pParty->pPartyBuffs[i]._4585CA(pParty->uTimePlayed) == 1)
+    if (pParty->pPartyBuffs[i].IsBuffExpiredToTime(pParty->uTimePlayed) == 1)
       viewparams->bRedrawGameUI = 1;
   }
 
--- a/mm7_5.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/mm7_5.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -2427,7 +2427,7 @@
               Actor::StealFrom(uMessageParam);
             continue;
           }
-          if ( pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 3 )
+          if ( pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 3 )
             continue;
           if ( !(pTurnEngine->field_18 & TE_FLAG_2) )
           {
@@ -2446,7 +2446,7 @@
             _42ECB5_PlayerAttacksActor();
             continue;
           }
-          if ( pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 3 )
+          if ( pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 3 )
             continue;
           if ( !(pTurnEngine->field_18 & TE_FLAG_2) )
             _42ECB5_PlayerAttacksActor();
@@ -2720,7 +2720,7 @@
           pAudioPlayer->PlaySound((SoundID)v127, 0, 0, -1, 0, 0, 0, 0);
           continue;
         case UIMSG_OpenSpellbookPage:
-          if ( pTurnEngine->field_4 == 3 || !uActiveCharacter || uMessageParam == pPlayers[uActiveCharacter]->lastOpenedSpellbookPage )
+          if ( pTurnEngine->turn_stage == 3 || !uActiveCharacter || uMessageParam == pPlayers[uActiveCharacter]->lastOpenedSpellbookPage )
             continue;
           sub_41140B();
           pPlayers[uActiveCharacter]->lastOpenedSpellbookPage = uMessageParam;
@@ -2730,7 +2730,7 @@
           continue;
         case UIMSG_SelectSpell:
         {
-          if (pTurnEngine->field_4 == 3)
+          if (pTurnEngine->turn_stage == 3)
             continue;
           if (!uActiveCharacter)
             continue;
@@ -2768,17 +2768,17 @@
         continue;
 
         case UIMSG_CastSpellFromBook:
-          if ( pTurnEngine->field_4 != 3 )
+          if ( pTurnEngine->turn_stage != 3 )
             _42777D_CastSpell_UseWand_ShootArrow(uMessageParam, v199, 0, 0, 0);
         continue;
 
         case UIMSG_SpellScrollUse:
 			__debugbreak();
-          if ( pTurnEngine->field_4 != 3 )
+          if ( pTurnEngine->turn_stage != 3 )
             _42777D_CastSpell_UseWand_ShootArrow(uMessageParam, v199, 133, 1, 0);
           continue;
         case UIMSG_SpellBookWindow:
-          if ( pTurnEngine->field_4 == 3 )
+          if ( pTurnEngine->turn_stage == 3 )
             continue;
           if ( bUnderwater == 1 )
           {
--- a/mm7_6.cpp	Fri Jul 05 17:37:30 2013 +0600
+++ b/mm7_6.cpp	Sat Jul 06 00:29:29 2013 +0400
@@ -2919,7 +2919,7 @@
               pPartyActionQueue->Add(partyAction);
               break;
             }
-            if (pTurnEngine->field_4 != 1 && pTurnEngine->field_4 != 2 && pTurnEngine->uActionPointsLeft > 0 )
+            if (pTurnEngine->turn_stage != 1 && pTurnEngine->turn_stage != 2 && pTurnEngine->uActionPointsLeft > 0 )
             {
               pTurnEngine->uActionPointsLeft -= 26;
               if ( pParty->uFlags2 & PARTY_FLAGS_2_RUNNING)
@@ -2942,7 +2942,7 @@
               pPartyActionQueue->Add(partyAction);
               break;
             }
-            if ( pTurnEngine->field_4 != 1 && pTurnEngine->field_4 != 2 && pTurnEngine->uActionPointsLeft > 0 )
+            if ( pTurnEngine->turn_stage != 1 && pTurnEngine->turn_stage != 2 && pTurnEngine->uActionPointsLeft > 0 )
             {
               pTurnEngine->uActionPointsLeft -= 26;
               if ( pParty->uFlags2 & 2 )
@@ -2962,7 +2962,7 @@
               pPartyActionQueue->Add(partyAction);
               break;
             }
-            if ( pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 2 || pTurnEngine->uActionPointsLeft <= 0 )
+            if ( pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 2 || pTurnEngine->uActionPointsLeft <= 0 )
               break;
             pTurnEngine->uActionPointsLeft -= 26;
             partyAction = PARTY_StrafeLeft;
@@ -2977,7 +2977,7 @@
               pPartyActionQueue->Add(partyAction);
               break;
             }
-            if ( pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 2 || pTurnEngine->uActionPointsLeft <= 0 )
+            if ( pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 2 || pTurnEngine->uActionPointsLeft <= 0 )
               break;
             pTurnEngine->uActionPointsLeft -= 26;
             partyAction = PARTY_StrafeRight;
@@ -2990,7 +2990,7 @@
             {
               if (pParty->bTurnBasedModeOn)
               {
-                if ( pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 2 || pTurnEngine->uActionPointsLeft <= 0 )
+                if ( pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 2 || pTurnEngine->uActionPointsLeft <= 0 )
                   break;
                 pTurnEngine->uActionPointsLeft -= 26;
               }
@@ -3016,7 +3016,7 @@
             {
               if (pParty->bTurnBasedModeOn)
               {
-                if ( pTurnEngine->field_4 == 1 || pTurnEngine->field_4 == 2 || pTurnEngine->uActionPointsLeft <= 0 )
+                if ( pTurnEngine->turn_stage == 1 || pTurnEngine->turn_stage == 2 || pTurnEngine->uActionPointsLeft <= 0 )
                   break;
                 pTurnEngine->uActionPointsLeft -= 26;
               }
@@ -3051,7 +3051,7 @@
           case INPUT_Pass:
             if ( pCurrentScreen )
               break;
-            if (pParty->bTurnBasedModeOn && pTurnEngine->field_4 == 3)
+            if (pParty->bTurnBasedModeOn && pTurnEngine->turn_stage == 3)
             {
               pTurnEngine->field_18 |= TE_FLAG_8;
               break;
@@ -3073,7 +3073,7 @@
             {
               if (pParty->bTurnBasedModeOn)
               {
-                if (pTurnEngine->field_4 == 3 || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player)
+                if (pTurnEngine->turn_stage == 3 || PID_TYPE(pTurnEngine->pQueue[0].uPackedID) == OBJECT_Player)
                 {
                   pParty->bTurnBasedModeOn = 0;
                   pTurnEngine->End(true);
@@ -3089,7 +3089,7 @@
           case INPUT_CastReady:
             if (pCurrentScreen != SCREEN_GAME)
               break;
-            if (pParty->bTurnBasedModeOn && pTurnEngine->field_4 == 3)
+            if (pParty->bTurnBasedModeOn && pTurnEngine->turn_stage == 3)
             {
               pTurnEngine->field_18 |= TE_FLAG_8;
               break;
@@ -3118,7 +3118,7 @@
           case INPUT_Attack:
             if (pCurrentScreen != SCREEN_GAME)
               break;
-            if (pParty->bTurnBasedModeOn == 1 && pTurnEngine->field_4 == 3)
+            if (pParty->bTurnBasedModeOn == 1 && pTurnEngine->turn_stage == 3)
             {
               pTurnEngine->field_18 |= TE_FLAG_8;
               break;