changeset 2492:85a12b497698

BelongsToSupertype() clear
author Ritor1
date Mon, 15 Sep 2014 17:30:19 +0600
parents 0a0c6d75aabe
children bd4ada7615ce
files Actor.cpp Actor.h Build/Visual Studio 2010/World of Might and Magic.vcxproj Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters CastSpellInfo.cpp Monsters.cpp Party.cpp Player.cpp SpriteObject.cpp TileTable.cpp UI/UiGame.cpp Viewport.cpp Vis.cpp
diffstat 13 files changed, 209 insertions(+), 295 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/Actor.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -1860,40 +1860,36 @@
 //----- (004030AD) --------------------------------------------------------
 void Actor::AI_Stun(unsigned int uActorID, signed int edx0, int stunRegardlessOfState)
 {
-  Actor *v4; // ebx@1
   __int16 v7; // ax@16
   AIDirection a3; // [sp+Ch] [bp-40h]@16
-  AIDirection* v10; // [sp+28h] [bp-24h]@16
-
-  v4 = &pActors[uActorID];
-  if ( v4->uAIState == Fleeing )
-    BYTE2(v4->uAttributes) |= 2u;
-  if ( v4->pMonsterInfo.uHostilityType != 4 )
+
+  if ( pActors[uActorID].uAIState == Fleeing )
+    pActors[uActorID].uAttributes |= 0x20000;
+  if ( pActors[uActorID].pMonsterInfo.uHostilityType != 4 )
   {
-    v4->uAttributes &= 0xFFFFFFFBu;
-    v4->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
+    pActors[uActorID].uAttributes &= 0xFFFFFFFB;
+    pActors[uActorID].pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Long;
   }
-  if ( v4->pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 )
-    v4->pActorBuffs[ACTOR_BUFF_CHARM].Reset();
-  if ( v4->pActorBuffs[ACTOR_BUFF_AFRAID].uExpireTime > 0 )
-    v4->pActorBuffs[ACTOR_BUFF_AFRAID].Reset();
-  if ( stunRegardlessOfState
-    || (v4->uAIState != Stunned
-    && v4->uAIState != AttackingRanged1
-    && v4->uAIState != AttackingRanged2
-    && v4->uAIState != AttackingRanged3
-    && v4->uAIState != AttackingRanged4
-    && v4->uAIState != AttackingMelee))
+  if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_CHARM].uExpireTime > 0 )
+    pActors[uActorID].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
+  if ( pActors[uActorID].pActorBuffs[ACTOR_BUFF_AFRAID].uExpireTime > 0 )
+    pActors[uActorID].pActorBuffs[ACTOR_BUFF_AFRAID].Reset();
+  if ( stunRegardlessOfState || (pActors[uActorID].uAIState != Stunned
+    && pActors[uActorID].uAIState != AttackingRanged1
+    && pActors[uActorID].uAIState != AttackingRanged2
+    && pActors[uActorID].uAIState != AttackingRanged3
+    && pActors[uActorID].uAIState != AttackingRanged4
+    && pActors[uActorID].uAIState != AttackingMelee))
   {
     Actor::GetDirectionInfo(PID(OBJECT_Actor,uActorID), edx0, &a3, 0);
-    v10 = &a3;
-    v4->uYawAngle = LOWORD(v10->uYawAngle);
-    v7 = pSpriteFrameTable->pSpriteSFrames[v4->pSpriteIDs[ANIM_GotHit]].uAnimLength;
-    v4->uCurrentActionTime = 0;
-    v4->uAIState = Stunned;
-    v4->uCurrentActionLength = 8 * v7;
-    Actor::PlaySound(uActorID, 2u);
-    v4->UpdateAnimation();
+    //v10 = &a3;
+    pActors[uActorID].uYawAngle = LOWORD(a3.uYawAngle);
+    v7 = pSpriteFrameTable->pSpriteSFrames[pActors[uActorID].pSpriteIDs[ANIM_GotHit]].uAnimLength;
+    pActors[uActorID].uCurrentActionTime = 0;
+    pActors[uActorID].uAIState = Stunned;
+    pActors[uActorID].uCurrentActionLength = 8 * v7;
+    Actor::PlaySound(uActorID, 2);
+    pActors[uActorID].UpdateAnimation();
   }
 }
 
@@ -2460,7 +2456,7 @@
 
     case AttackingMelee:
       uCurrentActionAnimation = ANIM_AtkMelee;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case AttackingRanged1:
@@ -2468,36 +2464,36 @@
     case AttackingRanged3:
     case AttackingRanged4:
       uCurrentActionAnimation = ANIM_AtkRanged;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case Dying:
     case Resurrected:
       uCurrentActionAnimation = ANIM_Dying;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case Pursuing:
     case Fleeing:
       uCurrentActionAnimation = ANIM_Walking;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case Stunned:
       uCurrentActionAnimation = ANIM_GotHit;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case Fidgeting:
       uCurrentActionAnimation = ANIM_Bored;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case Standing:
     case Interacting:
     case Summoned:
       uCurrentActionAnimation = ANIM_Standing;
-      uAttributes |= 0x200000u;
+      uAttributes |= 0x200000;
     break;
 
     case Dead:
@@ -2676,9 +2672,9 @@
   int summonMonsterBaseType; // esi@1
   int v5; // edx@2
   int v7; // edi@10
-  Actor *v8; // esi@10
+  Actor *actor; // esi@10
   MonsterInfo *v9; // ebx@10
-  MonsterDesc *v10; // edi@10
+  //MonsterDesc *v10; // edi@10
   int v13; // ebx@10
   int v15; // edi@10
   int v17; // ebx@10
@@ -2694,7 +2690,7 @@
     actorSector = pIndoor->GetSector(this->vPosition.x, this->vPosition.y, this->vPosition.z);
 
   v19 = this->uAlly;
-  if ( !v19 )
+  if ( !this->uAlly )
   {
     monsterId = this->pMonsterInfo.uID - 1;
     v19 = (uint)(monsterId * 0.33333334);
@@ -2704,7 +2700,7 @@
   v15 = fixpoint_mul(stru_5C6E00->Cos(v13), v27) + this->vPosition.x;
   v17 = fixpoint_mul(stru_5C6E00->Sin(v13), v27) + this->vPosition.y;
 
-  if (uCurrentlyLoadedLevelType != LEVEL_Outdoor)
+  if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
   {
     result = pIndoor->GetSector(v15, v17, this->vPosition.z);
     if (result != actorSector)
@@ -2720,7 +2716,7 @@
   summonMonsterBaseType = this->pMonsterInfo.field_3C_some_special_attack;
   if ( extraSummonLevel )
   {
-    if ( extraSummonLevel >= 1u && extraSummonLevel <= 3u )
+    if ( extraSummonLevel >= 1 && extraSummonLevel <= 3 )
       summonMonsterBaseType = summonMonsterBaseType + extraSummonLevel - 1;
   }
   else
@@ -2732,42 +2728,43 @@
       summonMonsterBaseType += 1;
   }
   v7 = summonMonsterBaseType - 1;
-  v8 = &pActors[uNumActors];
+  actor = &pActors[uNumActors];
   v9 = &pMonsterStats->pInfos[v7 + 1];
   pActors[uNumActors].Reset();
-  v10 = &pMonsterList->pMonsters[v7];
-  strcpy(v8->pActorName, v9->pName);
-  v8->sCurrentHP = LOWORD(v9->uHP);
-  memcpy(&v8->pMonsterInfo, v9, sizeof(v8->pMonsterInfo));
-  v8->word_000086_some_monster_id = summonMonsterBaseType;
-  v8->uActorRadius = v10->uMonsterRadius;
-  v8->uActorHeight = v10->uMonsterHeight;
-  v8->pMonsterInfo.uTreasureDiceRolls = 0;
-  v8->pMonsterInfo.uTreasureType = 0;
-  v8->pMonsterInfo.uExp = 0;
-  v8->uMovementSpeed = v10->uMovementSpeed;
-  v8->vInitialPosition.z = this->vPosition.z;
-  v8->vPosition.z = this->vPosition.z;
-  v8->vInitialPosition.x = v15;
-  v8->vPosition.x = v15;
-  v8->vInitialPosition.y = v17;
-  v8->vPosition.y = v17;
-  v8->uTetherDistance = 256;
-  v8->uSectorID = actorSector;
-  v8->PrepareSprites(0);
-  v8->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
-  v8->uAlly = v19;
-  v8->uCurrentActionTime = 0;
-  v8->uGroup = this->uGroup;
-  v8->uAIState = Summoned;
-  v8->uCurrentActionLength = 256;
-  v8->UpdateAnimation();
+  strcpy(actor->pActorName, v9->pName);
+  actor->sCurrentHP = LOWORD(v9->uHP);
+  memcpy(&actor->pMonsterInfo, v9, sizeof(actor->pMonsterInfo));
+  actor->word_000086_some_monster_id = summonMonsterBaseType;
+  actor->uActorRadius = pMonsterList->pMonsters[v7].uMonsterRadius;
+  actor->uActorHeight = pMonsterList->pMonsters[v7].uMonsterHeight;
+  actor->pMonsterInfo.uTreasureDiceRolls = 0;
+  actor->pMonsterInfo.uTreasureType = 0;
+  actor->pMonsterInfo.uExp = 0;
+  actor->uMovementSpeed = pMonsterList->pMonsters[v7].uMovementSpeed;
+
+  actor->vInitialPosition.x = v15;
+  actor->vInitialPosition.y = v17;
+  actor->vInitialPosition.z = this->vPosition.z;
+  actor->vPosition.x = v15;
+  actor->vPosition.y = v17;
+  actor->vPosition.z = this->vPosition.z;
+
+  actor->uTetherDistance = 256;
+  actor->uSectorID = actorSector;
+  actor->PrepareSprites(0);
+  actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
+  actor->uAlly = v19;
+  actor->uCurrentActionTime = 0;
+  actor->uGroup = this->uGroup;
+  actor->uAIState = Summoned;
+  actor->uCurrentActionLength = 256;
+  actor->UpdateAnimation();
 
   ++uNumActors;
   ++this->pMonsterInfo.uSpecialAbilityDamageDiceBonus;
   if ( this->uAttributes & 0x80000 )
-    v8->uAttributes |= 0x80000;
-  v8->uSummonerID = PID(OBJECT_Actor,summonerId);
+    actor->uAttributes |= 0x80000;
+  actor->uSummonerID = PID(OBJECT_Actor,summonerId);
 
 }
 // 46DF1A: using guessed type int __fastcall 46DF1A_collide_against_actor(int, int);
@@ -3113,11 +3110,9 @@
 		if (pActor->pActorBuffs[ACTOR_BUFF_AFRAID].uExpireTime > 0)
 		{
 			if ( (signed int)v36 >= 10240 )
-				Actor::AI_RandomMove(actor_id, target_pid, 1024, 0);
+              Actor::AI_RandomMove(actor_id, target_pid, 1024, 0);
 			else
-			{
-				Actor::AI_Flee(actor_id, target_pid, 0, pDir);
-			}
+              Actor::AI_Flee(actor_id, target_pid, 0, pDir);
 			continue;
 		}
 
@@ -3340,105 +3335,99 @@
 //----- (00408B54) --------------------------------------------------------
 unsigned int Actor::SearchActorByID(unsigned int *pTotalActors, unsigned int a2)
 {
-  int v4; // eax@1
-  unsigned int v5; // ebx@1
-
-  v4 = GetAlertStatus();
+  //int v4; // eax@1
+  unsigned int result; // ebx@1
+
+  //v4 = GetAlertStatus();
   *pTotalActors = 0;
+  result = 0;
   if ( (pActors[a2].uAttributes & 0x100000) == GetAlertStatus() )
   {
     *pTotalActors = 1;
     if ( pActors[a2].IsNotAlive() == 1 )
-      v5 = 1;
+      result = 1;
   }
-  return v5;
+  return result;
 }
 //----- (00408AE7) --------------------------------------------------------
 unsigned int Actor::SearchActorByGroup(unsigned int *pTotalActors, unsigned int uGroup)
 {
-  int v8; // [sp+Ch] [bp-8h]@1
-  unsigned int v9; // [sp+10h] [bp-4h]@1
-  Actor* v4;
-
-  v8 = GetAlertStatus();
+  unsigned int result; // [sp+10h] [bp-4h]@1
+
+  int v8 = GetAlertStatus();
   *pTotalActors = 0;
-  v9 = 0;
+  result = 0;
   for ( uint i = 0; i < uNumActors; i++)
   {
-    v4 = &pActors[i];
-    if ( (v4->uAttributes & 0x100000) == v8 && v4->uGroup == uGroup)
+    if ( (pActors[i].uAttributes & 0x100000) == v8 && pActors[i].uGroup == uGroup)
     {
       ++*pTotalActors;
-      if ( v4->IsNotAlive() == 1 )
-        ++v9;
+      if ( pActors[i].IsNotAlive() == 1 )
+        ++result;
     }
   }
-  return v9;
+  return result;
 }
 //----- (00408A7E) --------------------------------------------------------
 unsigned int Actor::SearchActorByMonsterID(unsigned int *pTotalActors, int uMonsterID)
 {
-  Actor *v4; // edi@2
   int v8; // [sp+Ch] [bp-8h]@1
-  unsigned int v9; // [sp+10h] [bp-4h]@1
+  unsigned int result; // [sp+10h] [bp-4h]@1
 
   v8 = GetAlertStatus();
   *pTotalActors = 0;
-  v9 = 0;
+  result = 0;
   for ( uint i = 0; i < uNumActors; i++)
   {
-    v4 = &pActors[i];
-    if ( (v4->uAttributes & 0x100000) == v8 && v4->pMonsterInfo.field_33 == uMonsterID)
+    if ( (pActors[i].uAttributes & 0x100000) == v8 && pActors[i].pMonsterInfo.field_33 == uMonsterID)
     {
       ++*pTotalActors;
-      if ( v4->IsNotAlive() == 1 )
-        ++v9;
+      if ( pActors[i].IsNotAlive() == 1 )
+        ++result;
     }
   }
-  return v9;
+  return result;
 }
 //----- (00408A27) --------------------------------------------------------
 unsigned int Actor::SearchAliveActors(unsigned int *pTotalActors)
 {
   int v2; // eax@1
-  unsigned int v3; // ebp@1
-  Actor *v5; // edi@2
+  unsigned int result; // ebp@1
 
   v2 = GetAlertStatus();
-  v3 = 0;
+  result = 0;
   *pTotalActors = 0;
   for ( uint i = 0; i < uNumActors; i++)
   {
-    v5 = &pActors[i];
-    if ( (v5->uAttributes & 0x100000) == v2 )
+    if ( (pActors[i].uAttributes & 0x100000) == v2 )
     {
       ++*pTotalActors;
-      if ( v5->IsNotAlive() == 1 )
-        ++v3;
+      if ( pActors[i].IsNotAlive() == 1 )
+        ++result;
     }
   }
-  return v3;
+  return result;
 }
 //----- (00408768) --------------------------------------------------------
 void Actor::InitializeActors()
 {
-  signed int v5; // [sp+Ch] [bp-10h]@1
-  signed int v6; // [sp+10h] [bp-Ch]@1
-  signed int v7; // [sp+14h] [bp-8h]@1
-  signed int v8; // [sp+18h] [bp-4h]@1
-
-  v8 = 0;
-  v6 = 0;
-  v7 = 0;
-  v5 = 0;
-  if ( !_stricmp(pCurrentMapName, "d25.blv") )
-    v8 = 1;
-  if ( !_stricmp(pCurrentMapName, "d26.blv") )
-    v6 = 1;
+  bool evil; // [sp+Ch] [bp-10h]@1
+  bool bPit; // [sp+10h] [bp-Ch]@1
+  bool good; // [sp+14h] [bp-8h]@1
+  bool bCelestia; // [sp+18h] [bp-4h]@1
+
+  bCelestia = false;
+  bPit = false;
+  good = false;
+  evil = false;
+  if ( !_stricmp(pCurrentMapName, "d25.blv") )//the Celestia
+    bCelestia = true;
+  if ( !_stricmp(pCurrentMapName, "d26.blv") )//the Pit
+    bPit = true;
   if (pParty->IsPartyGood())
-    v7 = 1;
+    good = true;
   if (pParty->IsPartyEvil())
-    v5 = 1;
+    evil = true;
 
   Log::Warning(L"%S %S %u", __FILE__, __FUNCTION__, __LINE__); // ai_near_actors_targets_pid[i] for AI_Stand seems always 0;  original code behaviour is identical
   for (uint i = 0; i < uNumActors; ++i)
@@ -3459,8 +3448,8 @@
 
     actor->pMonsterInfo.uHostilityType = MonsterInfo::Hostility_Friendly;
 
-    if (!v8 || v7)
-      if (!v6 || v5)
+    if (!bCelestia || good)
+      if (!bPit || evil)
         if (actor->IsPeasant())
           actor->uAttributes &= 0xF70000;
 
@@ -3513,7 +3502,7 @@
 
   pMonster->uAttributes |= 0xC000;
   if ( pMonster->uAIState == Fleeing )
-    pMonster->uAttributes |= 0x20000u;
+    pMonster->uAttributes |= 0x20000;
   bool hit_will_stun = false,
        hit_will_paralyze = false;
   if ( !projectileSprite )
@@ -4112,12 +4101,6 @@
   int for_x; // ebx@5
   int for_y; // [sp+Ch] [bp-10h]@5
   int for_z; // [sp+10h] [bp-Ch]@5
-//  int v3; // eax@5
-//  int v4; // ebx@5
-//  unsigned int v5; // ecx@5
-//  int v6; // edx@6
-//  unsigned int v7; // edx@8
-//  unsigned int v8; // edx@10
 
 
   distance = 5120;
@@ -4167,7 +4150,7 @@
   {
     for (uchar i = 0; i < this->pMonsterInfo.uTreasureDiceRolls; i++ )
         v14 += rand() % this->pMonsterInfo.uTreasureDiceSides + 1;
-    if ( v14 != 0 )
+    if ( v14 )
       {
         pParty->PartyFindsGold(v14, 0);
         viewparams->bRedrawGameUI = 1;
@@ -4239,7 +4222,7 @@
         sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[490], v14, v11);
       else
         sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[471], v11);
-      ShowStatusBarString(pTmpBuf2.data(), 2u);
+      ShowStatusBarString(pTmpBuf2.data(), 2);
       if ( !pParty->AddItemToParty(&Dst) )
         pParty->SetHoldingItem(&Dst);
       itemFound = true;
@@ -4281,7 +4264,7 @@
     }
     this->ActorHasItems[1].Reset();
   }
-  if ( !itemFound || rand() % 100 < 90 )
+  if ( !itemFound || rand() % 100 < 90 )//for repeatedly get gold and item
     this->Remove();
 }
 
@@ -4609,18 +4592,13 @@
 void Actor::MakeActorAIList_ODM()
 {
   int v1; // eax@4
-//  int v2; // ebx@4
-//  unsigned int v3; // ecx@4
-//  int v4; // edx@5
-//  int v5; // edx@7
-//  unsigned int v6; // edx@9
   unsigned int v7; // ST20_4@10
-  int v9; // edi@10
+  int distance; // edi@10
   int v10; // ebx@14
   int v21; // [sp+Ch] [bp-14h]@4
   int v22; // [sp+10h] [bp-10h]@4
 
-  pParty->uFlags &= 0xFFFFFFCFu;
+  pParty->uFlags &= 0xFFFFFFCF;
 
   ai_arrays_size = 0;
   for (uint i = 0; i < uNumActors; ++i)
@@ -4637,35 +4615,30 @@
     v22 = abs(pParty->vPosition.z - actor->vPosition.z);
     v21 = abs(pParty->vPosition.y - actor->vPosition.y);
     v1 = abs(pParty->vPosition.x - actor->vPosition.x);
-      v7 = int_get_vector_length(v22, v21, v1);
-	  //v8 = actor->uActorRadius;
-      v9 = v7 - actor->uActorRadius;
-      //v23 = v7 - v8;
-      if ( v9 < 0 )
-      {
-        v9 = 0;
-        //v23 = 0;
-      }
-
-      if (v9 < 5632)
+    v7 = int_get_vector_length(v22, v21, v1);
+    distance = v7 - actor->uActorRadius;
+    if ( distance < 0 )
+      distance = 0;
+
+    if (distance < 5632)
+    {
+      v10 = actor->uAttributes & 0xFEFFFFFF;
+      actor->uAttributes = v10;
+      if ( v10 & 0x80000 || actor->GetActorsRelation(0) )
       {
-        v10 = actor->uAttributes & 0xFEFFFFFF;
-        actor->uAttributes = v10;
-        if ( v10 & 0x80000 || actor->GetActorsRelation(0) )
-        {
-          //v11 = (pParty->uFlags & 0x10) == 0;
-          actor->uAttributes = v10 | 0x1000000;
-          if (v9 < 5120 )
-            pParty->SetYellowAlert();
-          if (v9 < 307)
-            pParty->SetRedAlert();
-        }
-		actor->uAttributes |= 0x00004000;
-        ai_near_actors_distances[ai_arrays_size] = v9;
-        ai_near_actors_ids[ai_arrays_size++] = i;
+        //v11 = (pParty->uFlags & 0x10) == 0;
+        actor->uAttributes = v10 | ACTOR_HOSTILE;
+        if (distance < 5120 )
+          pParty->SetYellowAlert();
+        if (distance < 307)
+          pParty->SetRedAlert();
       }
-      else
-		  actor->uAttributes &= 0xFFFFBFFF;
+	  actor->uAttributes |= 0x4000;
+      ai_near_actors_distances[ai_arrays_size] = distance;
+      ai_near_actors_ids[ai_arrays_size++] = i;
+    }
+    else
+	  actor->uAttributes &= 0xFFFFBFFF;
   }
 
   /*
@@ -4728,7 +4701,7 @@
 int  Actor::MakeActorAIList_BLV()
 {
   int v1; // eax@4
-  int v9; // edi@10
+  int distance; // edi@10
   int v13; // edx@24
   int v15; // ebx@26
   unsigned int v17; // esi@27
@@ -4744,7 +4717,7 @@
   uint v45; // [sp+20h] [bp-4h]@1
 
   //  __debugbreak(); // refactor for blv ai
-  pParty->uFlags &= 0xFFFFFFCFu;
+  pParty->uFlags &= 0xFFFFFFCF;
   v37 = pIndoor->GetSector(pParty->vPosition.x, pParty->vPosition.y, pParty->vPosition.z);
   v45 = 0;
   for ( uint i = 0; i < (signed int)uNumActors; ++i )
@@ -4759,21 +4732,21 @@
     v38 = abs(pParty->vPosition.y - pActors[i].vPosition.y);
     v39 = abs(pParty->vPosition.z - pActors[i].vPosition.z);
 
-    v9 = int_get_vector_length(v39, v38, v1) - pActors[i].uActorRadius;
-    if ( v9 < 0 )
-      v9 = 0;
-    if ( v9 < 10240 )
+    distance = int_get_vector_length(v39, v38, v1) - pActors[i].uActorRadius;
+    if ( distance < 0 )
+      distance = 0;
+    if ( distance < 10240 )
     {
       pActors[i].uAttributes &= 0xFEFFFFFF;
       if ( pActors[i].uAttributes & 0x80000 || pActors[i].GetActorsRelation(0) )
       {
-        pActors[i].uAttributes |= 0x1000000;
-        if ( !(pParty->uFlags & 0x10) && (double)v9 < 307.2 )
-          pParty->uFlags |= 0x10;
-        if ( !(pParty->uFlags & 0x20) && v9 < 5120 )
-          pParty->uFlags |= 0x20;
+        pActors[i].uAttributes |= ACTOR_HOSTILE;
+        if ( !(pParty->uFlags & 0x10) && (double)distance < 307.2 )
+          pParty->SetRedAlert();
+        if ( !(pParty->uFlags & 0x20) && distance < 5120 )
+          pParty->SetYellowAlert();
       }
-      ai_near_actors_distances[v45] = v9;
+      ai_near_actors_distances[v45] = distance;
       ai_near_actors_ids[v45] = i;
 	  v45++;
     }
--- a/Actor.h	Fri Sep 12 18:05:26 2014 +0600
+++ b/Actor.h	Mon Sep 15 17:30:19 2014 +0600
@@ -119,7 +119,22 @@
   ANIM_Dead = 0x6,
   ANIM_Bored = 0x7,
 };
+#pragma pack(pop)
 
+#define ACTOR_UNKNOW              0x80
+#define ACTOR_UNKNOW1             0x400
+#define ACTOR_UNKNOW2             0x4000
+#define ACTOR_UNKNOW3             0x8000
+#define ACTOR_UNKNOW4             0x20000
+#define ACTOR_UNKNOW5             0x40000
+#define ACTOR_UNKNOW6             0x80000
+#define ACTOR_UNKNOW7             0x100000
+#define ACTOR_UNKNOW8             0x200000
+#define ACTOR_UNKNOW9             0x400000
+#define ACTOR_UNKNOW10            0x800000
+#define ACTOR_HOSTILE             0x1000000
+
+#pragma pack(push, 1)
 
 
 
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj	Fri Sep 12 18:05:26 2014 +0600
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj	Mon Sep 15 17:30:19 2014 +0600
@@ -275,7 +275,6 @@
     <ClInclude Include="..\..\IconFrameTable.h" />
     <ClInclude Include="..\..\Indoor.h" />
     <ClInclude Include="..\..\IndoorCameraD3D.h" />
-    <ClInclude Include="..\..\Indoor_stuff.h" />
     <ClInclude Include="..\..\IRender.h" />
     <ClInclude Include="..\..\Items.h" />
     <ClInclude Include="..\..\Keyboard.h" />
--- a/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters	Fri Sep 12 18:05:26 2014 +0600
+++ b/Build/Visual Studio 2010/World of Might and Magic.vcxproj.filters	Mon Sep 15 17:30:19 2014 +0600
@@ -1272,7 +1272,6 @@
     <ClInclude Include="..\..\stru10.h">
       <Filter>Engine\Graphics</Filter>
     </ClInclude>
-    <ClInclude Include="..\..\Indoor_stuff.h" />
     <ClInclude Include="..\..\mm7_unsorted_subs.h" />
     <ClInclude Include="..\..\Outdoor_stuff.h" />
   </ItemGroup>
--- a/CastSpellInfo.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/CastSpellInfo.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -3296,37 +3296,13 @@
 //----- (0042777D) --------------------------------------------------------
 void _42777D_CastSpell_UseWand_ShootArrow(int a1, unsigned int uPlayerID, unsigned int a4, __int16 a5, int a6)
 {
-  //bool result; // eax@2
-  //__int16 v6; // bx@4
-  //Player *v7; // eax@4
-  //char v8; // zf@12
   unsigned __int16 v9; // cx@16
   unsigned int v10; // eax@18
   unsigned __int8 v11; // sf@18
   unsigned __int8 v12; // of@18
   unsigned __int16 v13; // cx@21
   unsigned int v14; // eax@23
-  //stru277 *v15; // esi@27
-  //stru277 *v16; // eax@28
-  //GUIWindow *v17; // eax@43
-  //GUIWindow *v18; // [sp-30h] [bp-48h]@44
-  //unsigned int v19; // [sp-2Ch] [bp-44h]@44
-  //unsigned int v20; // [sp-28h] [bp-40h]@44
-  //unsigned int v21; // [sp-24h] [bp-3Ch]@44
-  //unsigned int v22; // [sp-20h] [bp-38h]@44
-  //int v23; // [sp-1Ch] [bp-34h]@44
-  //int v24; // [sp-18h] [bp-30h]@44
-  //unsigned int v25; // [sp-14h] [bp-2Ch]@43
-  //unsigned int v26; // [sp-10h] [bp-28h]@43
-  //unsigned __int8 v27; // [sp-Ch] [bp-24h]@43
-  //char *v28; // [sp-8h] [bp-20h]@43
-  //Texture *v29; // [sp-4h] [bp-1Ch]@43
-  //__int16 a3a; // [sp+10h] [bp-8h]@1
-  //__int16 a2a; // [sp+14h] [bp-4h]@1
 
-  //a3a = uPlayerID;
-  //a2a = a1;
-  
   //if ( pParty->bTurnBasedModeOn != 1
   //  || (result = pTurnEngine->field_4, pTurnEngine->field_4 != 1) && pTurnEngine->field_4 != 3 )
   if (pParty->bTurnBasedModeOn)
--- a/Monsters.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/Monsters.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -1199,83 +1199,47 @@
 //----- (00438BDF) --------------------------------------------------------
 bool MonsterStats::BelongsToSupertype(unsigned int uMonsterInfoID, enum MONSTER_SUPERTYPE eSupertype)
 {
-  unsigned __int8 v2; // zf@15
-  char v3; // sf@15
-  unsigned __int8 v4; // of@15
-  bool result; // eax@33
-
   switch ( eSupertype )
   {
     case MONSTER_SUPERTYPE_UNDEAD:
-      if ( (signed int)uMonsterInfoID >= MONSTER_GHOST_1 && (signed int)uMonsterInfoID <= MONSTER_GHOST_3
-        || (signed int)uMonsterInfoID >= MONSTER_LICH_1 && (signed int)uMonsterInfoID <= MONSTER_LICH_3
-        || (signed int)uMonsterInfoID >= MONSTER_SKELETON_1 && (signed int)uMonsterInfoID <= MONSTER_SKELETON_3
-        || (signed int)uMonsterInfoID >= MONSTER_VAMPIRE_1 && (signed int)uMonsterInfoID <= MONSTER_VAMPIRE_3
-        || (signed int)uMonsterInfoID >= MONSTER_WIGHT_1 && (signed int)uMonsterInfoID <= MONSTER_WIGHT_3
-        || (signed int)uMonsterInfoID >= MONSTER_ZOMBIE_1 && (signed int)uMonsterInfoID <= MONSTER_ZOMBIE_3 )
-        goto ret_true;
-      if ( (signed int)uMonsterInfoID < MONSTER_GHOUL_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_GHOUL_3);
-      v2 = uMonsterInfoID == MONSTER_GHOUL_3;
-      v3 = ((uMonsterInfoID - MONSTER_GHOUL_3) & 0x80000000u) != 0;
-      goto false_if_outside;
+      if ( (signed int)uMonsterInfoID >= MONSTER_GHOST_1 && (signed int)uMonsterInfoID <= MONSTER_GHOST_3       //70<=id<=72
+        || (signed int)uMonsterInfoID >= MONSTER_LICH_1 && (signed int)uMonsterInfoID <= MONSTER_LICH_3         //91-93
+        || (signed int)uMonsterInfoID >= MONSTER_SKELETON_1 && (signed int)uMonsterInfoID <= MONSTER_SKELETON_3 //199-201
+        || (signed int)uMonsterInfoID >= MONSTER_VAMPIRE_1 && (signed int)uMonsterInfoID <= MONSTER_VAMPIRE_3   //217-219
+        || (signed int)uMonsterInfoID >= MONSTER_WIGHT_1 && (signed int)uMonsterInfoID <= MONSTER_WIGHT_3       //223-225
+        || (signed int)uMonsterInfoID >= MONSTER_ZOMBIE_1 && (signed int)uMonsterInfoID <= MONSTER_ZOMBIE_3     //229-231
+		|| (signed int)uMonsterInfoID >= MONSTER_GHOUL_1 && (signed int)uMonsterInfoID <= MONSTER_GHOUL_3)      //256-258
+        return true;
+      return false;
     case MONSTER_SUPERTYPE_KREEGAN:
-      if ( (signed int)uMonsterInfoID < MONSTER_DEVIL_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_DEVIL_3);
-      v2 = uMonsterInfoID == MONSTER_DEVIL_3;
-      v3 = ((uMonsterInfoID - MONSTER_DEVIL_3) & 0x80000000u) != 0;
-      goto false_if_outside;
+      if ( (signed int)uMonsterInfoID >= MONSTER_DEVIL_1 && (signed int)uMonsterInfoID <= MONSTER_DEVIL_3 )//22-24
+        return true;
+      return false;
     case MONSTER_SUPERTYPE_ELF:
-      if ( (signed int)uMonsterInfoID >= MONSTER_PEASANT_ELF_FEMALE_1_1
-        && (signed int)uMonsterInfoID <= MONSTER_PEASANT_ELF_MALE_3_3
-        || (signed int)uMonsterInfoID >= MONSTER_ELF_ARCHER_1 && (signed int)uMonsterInfoID <= MONSTER_ELF_ARCHER_3 )
-        goto ret_true;
-      if ( (signed int)uMonsterInfoID < MONSTER_ELF_SPEARMAN_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_ELF_SPEARMAN_3);
-      v2 = uMonsterInfoID == MONSTER_ELF_SPEARMAN_3;
-      v3 = ((uMonsterInfoID - MONSTER_ELF_SPEARMAN_3) & 0x80000000u) != 0;
-      goto false_if_outside;
+      if ( (signed int)uMonsterInfoID >= MONSTER_PEASANT_ELF_FEMALE_1_1 && (signed int)uMonsterInfoID <= MONSTER_PEASANT_ELF_MALE_3_3//133 - 150
+        || (signed int)uMonsterInfoID >= MONSTER_ELF_ARCHER_1 && (signed int)uMonsterInfoID <= MONSTER_ELF_ARCHER_3//49-51 
+		||  (signed int)uMonsterInfoID >= MONSTER_ELF_SPEARMAN_1 && (signed int)uMonsterInfoID <= MONSTER_ELF_SPEARMAN_3)//52-54
+        return true;
+      return false;
     case MONSTER_SUPERTYPE_DRAGON:
-      if ( (signed int)uMonsterInfoID < MONSTER_DRAGON_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_DRAGON_3);
-      v2 = uMonsterInfoID == MONSTER_DRAGON_3;
-      v3 = ((uMonsterInfoID - MONSTER_DRAGON_3) & 0x80000000u) != 0;
-      goto false_if_outside;
+      if ( (signed int)uMonsterInfoID >= MONSTER_DRAGON_1 && (signed int)uMonsterInfoID <= MONSTER_DRAGON_3 )//25-27
+        return true;
+      return false;
     case MONSTER_SUPERTYPE_WATER_ELEMENTAL:
-      if ( (signed int)uMonsterInfoID < MONSTER_ELEMENTAL_WATER_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_ELEMENTAL_WATER_3);
-      v2 = uMonsterInfoID == MONSTER_ELEMENTAL_WATER_3;
-      v3 = ((uMonsterInfoID - MONSTER_ELEMENTAL_WATER_3) & 0x80000000u) != 0;
-      goto false_if_outside;
+      if ( (signed int)uMonsterInfoID >= MONSTER_ELEMENTAL_WATER_1 && (signed int)uMonsterInfoID <= MONSTER_ELEMENTAL_WATER_3)//46-48
+        return true;
+      return false;
     case MONSTER_SUPERTYPE_TREANT:
-      if ( (signed int)uMonsterInfoID < MONSTER_TREANT_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_TREANT_3);
-      v2 = uMonsterInfoID == MONSTER_TREANT_3;
-      v3 = ((uMonsterInfoID - MONSTER_TREANT_3) & 0x80000000u) != 0;
-      goto false_if_outside;
+      if ( (signed int)uMonsterInfoID >= MONSTER_TREANT_1 && (signed int)uMonsterInfoID <= MONSTER_TREANT_3 )//253-255
+        return true;
+      return false;
     case MONSTER_SUPERTYPE_TITAN:
-      if ( (signed int)uMonsterInfoID < MONSTER_TITAN_1 )
-        goto ret_false;
-      v4 = __OFSUB__(uMonsterInfoID, (int)MONSTER_TITAN_3);
-      v2 = uMonsterInfoID == MONSTER_TITAN_3;
-      v3 = ((uMonsterInfoID - MONSTER_TITAN_3) & 0x80000000u) != 0;
-false_if_outside:
-      if ( !((unsigned __int8)(v3 ^ v4) | v2) )
-        goto ret_false;
-ret_true:
-      result = 1;
-      break;
+      if ( (signed int)uMonsterInfoID >= MONSTER_TITAN_1 && (signed int)uMonsterInfoID <= MONSTER_TITAN_3 )//211-213
+        return true;
+      return false;
     default:
-ret_false:
-      result = 0;
-      break;
+      return false;
   }
-  return result;
+  return false;
 }
 
--- a/Party.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/Party.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -1217,7 +1217,7 @@
 //----- (00449B57) --------------------------------------------------------
 bool _449B57_test_bit(unsigned __int8 *a1, __int16 a2)
 {
-	return (a1[(a2 - 1) >> 3] & (0x80u >> (a2 - 1) % 8)) != 0;
+	return (a1[(a2 - 1) >> 3] & (0x80 >> (a2 - 1) % 8)) != 0;
 }
 
 //----- (00449B7E) --------------------------------------------------------
--- a/Player.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/Player.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -2005,7 +2005,7 @@
   {
     return 0;
   }
-  if ( !(BYTE2(actroPtr->uAttributes) & 0x80) )
+  if ( !(actroPtr->uAttributes & 0x800000) )
     actroPtr->SetRandomGoldIfTheresNoItem();
   unsigned __int16 v6 = this->pActiveSkills[PLAYER_SKILL_STEALING];
   v7 = v6 & 0x3F;
@@ -2014,7 +2014,7 @@
   int v29 = StealingRandomBonuses[rand() % 5];
   fineIfFailed = actroPtr->pMonsterInfo.uLevel + 100 * (_steal_perm + reputation);
   currMaxItemValue = v29 + v7 * v30;
-  if ( rand() % 100 < 5 || fineIfFailed > currMaxItemValue || BYTE2(actroPtr->uAttributes) & 8 )
+  if ( rand() % 100 < 5 || fineIfFailed > currMaxItemValue || actroPtr->uAttributes & 0x80000 )
   {
     Actor::AggroSurroundingPeasants(uActorID, 1);
     sprintfex(pTmpBuf2.data(), pGlobalTXT_LocalizationStrings[376], this->pName);//"%s was caught stealing!"
--- a/SpriteObject.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/SpriteObject.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -1740,9 +1740,7 @@
 				 {
 					 v150 = 2;
 					 if (v152 == 2)
-					 {
-						 v150 = 3;
-					 }
+					   v150 = 3;
 					 else
 					 {
 						 if (v152 >= 3)
--- a/TileTable.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/TileTable.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -521,18 +521,16 @@
               else
               {
                 v75 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
-                *(char *)v75 |= 4u;
+                *(char *)v75 |= 4;
               }
             }
             else
-            {
-              HIBYTE(v2->pTiles[v2->sNumTiles].uAttributes) |= 1u;
-            }
+              HIBYTE(v2->pTiles[v2->sNumTiles].uAttributes) |= 1;
           }
           else
           {
             v74 = (int)&v2->pTiles[v2->sNumTiles].uAttributes;
-            *(char *)v74 |= 2u;
+            *(char *)v74 |= 2;
           }
         }
         else
--- a/UI/UiGame.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/UI/UiGame.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -1172,8 +1172,6 @@
   unsigned int pX; // [sp+D4h] [bp-Ch]@1
   unsigned int pY; // [sp+D8h] [bp-8h]@1
 
-  int interaction_distance_limit = 512;
-
   pMouse->uPointingObjectID = 0;
   pMouse->GetClickPos(&pX, &pY);
   if ( pX < 0 || pX > window->GetWidth() - 1 || pY < 0 || pY > window->GetHeight() - 1 )
@@ -1973,7 +1971,7 @@
         //  && pPoint_Y >= pRenderer->raster_clip_y && pPoint_Y <= pRenderer->raster_clip_w )
         {
           pColor = ui_game_minimap_actor_friendly_color;
-          if ( pActors[i].uAttributes & 0x1000000 )
+          if ( pActors[i].uAttributes & ACTOR_HOSTILE )
             pColor = ui_game_minimap_actor_hostile_color;
           if ( pActors[i].uAIState == Dead)
             pColor = ui_game_minimap_actor_corpse_color;
--- a/Viewport.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/Viewport.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -357,7 +357,7 @@
     //a2.y = v16;
     if ( pActors[mon_id].uAIState == Dead )
     {
-      if ( (unsigned int)v0 < 0x2000000 )
+      if ( (unsigned int)v0 < 0x2000000 )//distance limit for loot monster
       {
         pActors[mon_id].LootActor();
         return;
--- a/Vis.cpp	Fri Sep 12 18:05:26 2014 +0600
+++ b/Vis.cpp	Mon Sep 15 17:30:19 2014 +0600
@@ -277,13 +277,10 @@
 {
   int v5; // eax@1
   signed int pFaceID; // edi@2
-//  int v8; // ecx@7
   int v9; // eax@7
   unsigned int *pNumPointers; // eax@7
-//  unsigned int v11; // ecx@7
   Vis_ObjectInfo *v12; // edi@7
   RenderVertexSoft a1; // [sp+Ch] [bp-44h]@1
-  BLVFace *pFace; // [sp+3Ch] [bp-14h]@7
   void *v15; // [sp+40h] [bp-10h]@7
   int v17; // [sp+48h] [bp-8h]@1
 
@@ -308,12 +305,9 @@
               LOWORD(v9) = 0;
               v15 = (void *)((PID(OBJECT_BModel,pFaceID)) + v9);
               pNumPointers = &list->uNumPointers;
-              //v16 = 2;
-              //v11 = list->uNumPointers;
-              pFace = &pIndoor->pFaces[pFaceID];
               v12 = &list->object_pool[list->uNumPointers];
               v12->object = &pIndoor->pFaces[pFaceID];
-              v12 = (Vis_ObjectInfo *)((char *)v12 + 4);
+              v12 = (Vis_ObjectInfo *) &v12->sZValue;
               v12->object = v15;
               v12->sZValue = 2;
               ++*pNumPointers;