changeset 1705:a395359afc8f

MonsterPopup
author Ritor1
date Mon, 23 Sep 2013 17:33:12 +0600
parents cc1d68c17e19
children be43171d7bc6 5863074ed9ba
files Actor.h Indoor.cpp UI/UIPopup.cpp stru6.cpp
diffstat 4 files changed, 290 insertions(+), 359 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.h	Mon Sep 23 09:34:23 2013 +0600
+++ b/Actor.h	Mon Sep 23 17:33:12 2013 +0600
@@ -39,10 +39,26 @@
 /*  361 */
 enum ACTOR_BUFF_INDEX
 {
-  ACTOR_BUFF_CHARM = 1,  // an assumption
-  ACTOR_BUFF_SHRINK = 3, // an assumption
+  ACTOR_BUFF_CHARM = 1,
+  ACTOR_BUFF_SUMMONED = 2,
+  ACTOR_BUFF_SHRINK = 3,
+  ACTOR_BUFF_AFRAID = 4,
   ACTOR_BUFF_STONED = 5,
-  ACTOR_BUFF_PARALYZED = 6
+  ACTOR_BUFF_PARALYZED = 6,
+
+  ACTOR_BUFF_BERSERK = 8,
+
+  ACTOR_BUFF_FATE = 10,
+  ACTOR_BUFF_ENSLAVED = 11,
+  ACTOR_BUFF_DAY_OF_PROTECTION = 12,
+  ACTOR_BUFF_HOUR_OF_POWER = 13,
+  ACTOR_BUFF_SHIELD = 14,
+  ACTOR_BUFF_STONESKIN = 15,
+  ACTOR_BUFF_BLESS = 16,
+  ACTOR_BUFF_HEROISM = 17,
+  ACTOR_BUFF_HASTE = 18,
+  ACTOR_BUFF_PAIN_REFLECTION = 19,
+  ACTOR_BUFF_PAIN_HAMMERHANDS = 20,
 };
 
 
--- a/Indoor.cpp	Mon Sep 23 09:34:23 2013 +0600
+++ b/Indoor.cpp	Mon Sep 23 17:33:12 2013 +0600
@@ -5396,7 +5396,7 @@
   int v_4c; // [sp+8Ch] [bp+10h]@141
   int v_8; // [sp+90h] [bp+14h]@53
 
-  __debugbreak();
+  //__debugbreak();
 
   v4 = stru_5C6E00->Atan2(v.x - x, v.y - z);
   v114 = 0;
--- a/UI/UIPopup.cpp	Mon Sep 23 09:34:23 2013 +0600
+++ b/UI/UIPopup.cpp	Mon Sep 23 17:33:12 2013 +0600
@@ -107,22 +107,22 @@
 //----- (0041D895) --------------------------------------------------------
 void GameUI_DrawItemInfo( struct ItemGen* inspect_item )
 {
-    unsigned int v2; // eax@3
-    const char *v28; // edi@69
-    int v34; // esi@81
-    char *pText; // [sp-14h] [bp-28Ch]@110
-    char out_text[300]; // [sp+8h] [bp-270h]@40
-    char v65[120]; // [sp+134h] [bp-144h]@92
-    stru351_summoned_item v67;
-    int v77; // [sp+200h] [bp-78h]@12
-    int v78; // [sp+204h] [bp-74h]@5
-    GUIWindow iteminfo_window; // [sp+208h] [bp-70h]@2
-    POINT a2; // [sp+25Ch] [bp-1Ch]@2
-    int v81; // [sp+264h] [bp-14h]@5
-    PlayerSpeech v83; // [sp+26Ch] [bp-Ch]@18
-    char* v84;
-    int v85;
-    char *Str; // [sp+270h] [bp-8h]@65
+  unsigned int v2; // eax@3
+  const char *v28; // edi@69
+  int v34; // esi@81
+  char *pText; // [sp-14h] [bp-28Ch]@110
+  char out_text[300]; // [sp+8h] [bp-270h]@40
+  char v65[120]; // [sp+134h] [bp-144h]@92
+  stru351_summoned_item v67;
+  int v77; // [sp+200h] [bp-78h]@12
+  int v78; // [sp+204h] [bp-74h]@5
+  GUIWindow iteminfo_window; // [sp+208h] [bp-70h]@2
+  POINT a2; // [sp+25Ch] [bp-1Ch]@2
+  int v81; // [sp+264h] [bp-14h]@5
+  PlayerSpeech v83; // [sp+26Ch] [bp-Ch]@18
+  char* v84;
+  int v85;
+  char *Str; // [sp+270h] [bp-8h]@65
 
   if (!inspect_item->uItemID)
     return;
@@ -153,7 +153,6 @@
   //try to identify
     if (!inspect_item->IsIdentified())
     {
-      //v11 = inspect_item;
       if ( pPlayers[uActiveCharacter]->CanIdentify(inspect_item) == 1 )
         inspect_item->SetIdentified();
       v83 = SPEECH_9;
@@ -332,7 +331,6 @@
   pRenderer->SetTextureClipRect(iteminfo_window.uFrameX + 12, iteminfo_window.uFrameY + 12,
          iteminfo_window.uFrameX + iteminfo_window.uFrameWidth - 12, iteminfo_window.uFrameY + iteminfo_window.uFrameHeight - 12);
   iteminfo_window.uFrameWidth -= 12;
-  //v32 = pIcons_LOD->LoadTexturePtr(pItemsTable->pItems[inspect_item->uItemID].pIconName, TEXTURE_16BIT_PALETTE)->uTextureHeight;
   iteminfo_window.uFrameHeight -= 12;
   iteminfo_window.uFrameZ = iteminfo_window.uFrameX + iteminfo_window.uFrameWidth - 1;
   iteminfo_window.uFrameW = iteminfo_window.uFrameY + iteminfo_window.uFrameHeight - 1;
@@ -447,53 +445,28 @@
   int v43; // eax@62
   int v44; // eax@63
   signed int v45; // edi@65
-  int v50; // edi@90
-  SpellBuff *v51; // eax@91
-  char *v52; // ecx@98
-  char *v53; // ecx@101
-  char *v54; // ST0C_4@118
-  unsigned int v55; // eax@118
-  GUIFont *v56; // edi@124
-  unsigned __int8 v57; // al@128
-  int v58; // eax@132
-  Actor *v59; // ecx@133
-  unsigned __int8 v60; // dl@138
-  char *v62; // eax@147
-  int v63; // eax@152
-  int v65; // eax@155
-  const char *v67; // [sp-10h] [bp-1FCh]@125
-  const char *v68; // [sp-10h] [bp-1FCh]@142
-  char *v70; // [sp-Ch] [bp-1F8h]@125
-  char *v71; // [sp-Ch] [bp-1F8h]@142
-  char *v72; // [sp-8h] [bp-1F4h]@54
+  int pTextHeight; // edi@90
   int v73; // [sp-8h] [bp-1F4h]@79
-  int v75; // [sp-8h] [bp-1F4h]@125
-  int v76; // [sp-8h] [bp-1F4h]@142
-  size_t v77; // [sp-4h] [bp-1F0h]@54
-  unsigned int v79; // [sp-4h] [bp-1F0h]@125
-  char *v80; // [sp-4h] [bp-1F0h]@142
-  char *v81; // [sp-4h] [bp-1F0h]@148
   DDBLTFX Dst; // [sp+Ch] [bp-1E0h]@18
   DDSURFACEDESC2 pDesc; // [sp+70h] [bp-17Ch]@18
   RECT v84; // [sp+ECh] [bp-100h]@26
-  char *v85[10]; // [sp+FCh] [bp-F0h]@145
-  char *v95[11]; // [sp+124h] [bp-C8h]@127
+  char *string_name[10]; // [sp+FCh] [bp-F0h]@145
+  char *content[11]; // [sp+124h] [bp-C8h]@127
   RenderBillboardTransform_local0 v106; // [sp+150h] [bp-9Ch]@3
   unsigned int v107; // [sp+1A0h] [bp-4Ch]@18
   unsigned __int16 *v108; // [sp+1A4h] [bp-48h]@34
   unsigned int v109; // [sp+1A8h] [bp-44h]@32
   LPVOID v110; // [sp+1ACh] [bp-40h]@28
-  int v112; // [sp+1B4h] [bp-38h]@3
-  int v222; // [sp+1B8h] [bp-34h]@18
-  unsigned __int8 v114; // [sp+1BFh] [bp-2Dh]@133
   int v115; // [sp+1C0h] [bp-2Ch]@3
-  unsigned int v116; // [sp+1C4h] [bp-28h]@18
-  int i; // [sp+1C8h] [bp-24h]@18
-  int v119; // [sp+1D0h] [bp-1Ch]@18
-  SpellBuff *v120; // [sp+1D4h] [bp-18h]@18
-  int v124; // [sp+1E4h] [bp-8h]@18
+  bool normal_level; // [sp+1D0h] [bp-1Ch]@18
+  bool expert_level; // [sp+1C4h] [bp-28h]@18
+  bool master_level; // [sp+1C8h] [bp-24h]@18
+  bool grandmaster_level; // [sp+1B4h] [bp-38h]@3
+  char *pText; // [sp+1D4h] [bp-18h]@18
+  int pTextColorID; // [sp+1E4h] [bp-8h]@18
   int a4; // [sp+1E8h] [bp-4h]@18
 
+  bool monster_full_informations = true;
   static Actor pMonsterInfoUI_Doll;
   /*if ( !(bMonsterInfoUI_bDollInitialized & 1) )
   {
@@ -563,7 +536,7 @@
     pDesc.dwSize = 124;
     pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].pTextureSurface->GetSurfaceDesc(&pDesc);
     v107 = 0;
-    i = 0;
+    uint i = 0;
     int dst_x = v106.uScreenSpaceX + pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uAreaX - pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uBufferWidth / 2;
     int dst_y = v106.uScreenSpaceY + pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uAreaY - pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uBufferHeight;
     uint dst_z = v106.uScreenSpaceX + pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uAreaX + pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uAreaWidth + pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uBufferWidth / 2 - pSprites_LOD->pHardwareSprites[v10->pHwSpriteIDs[0]].uBufferWidth;
@@ -600,7 +573,6 @@
       {
         v20 = (char *)dst_y;
         v110 = pDesc.lpSurface;
-        //a2 = dst_y;
         if (dst_y < dst_w)
         {
           v21 = dst_x;
@@ -672,58 +644,53 @@
     if ( v10->pHwSpriteIDs[0] >= 0 )
       pSprites_LOD->pSpriteHeaders[v10->pHwSpriteIDs[0]].DrawSprite_sw(&v106, 0);
   }
-
+//name and profession
   if ( pActors[uActorID].sNPC_ID )
   {
     if (GetNPCData(pActors[uActorID].sNPC_ID)->uProfession)
       sprintfex(pTmpBuf.data(), pGlobalTXT_LocalizationStrings[429], GetNPCData(pActors[uActorID].sNPC_ID)->pName, aNPCProfessionNames[GetNPCData(pActors[uActorID].sNPC_ID)->uProfession]); // "%s the %s"   /   ^Pi[%s] %s
     else
-    {
-      v77 = 2000;
-      v72 = GetNPCData(pActors[uActorID].sNPC_ID)->pName;
-    }
+      strncpy(pTmpBuf.data(), GetNPCData(pActors[uActorID].sNPC_ID)->pName, 2000);
   }
   else
   {
-    v77 = 2000;
     if ( pActors[uActorID].dword_000334_unique_name )
-      v72 = pMonsterStats->pPlaceStrings[pActors[uActorID].dword_000334_unique_name];
+      strncpy(pTmpBuf.data(), pMonsterStats->pPlaceStrings[pActors[uActorID].dword_000334_unique_name], 2000);
     else
-      v72 = pMonsterStats->pInfos[pActors[uActorID].pMonsterInfo.uID].pName;
+      strncpy(pTmpBuf.data(), pMonsterStats->pInfos[pActors[uActorID].pMonsterInfo.uID].pName, 2000);
   }
-  if(!pActors[uActorID].sNPC_ID || (pActors[uActorID].sNPC_ID && !GetNPCData(pActors[uActorID].sNPC_ID)->uProfession))
-    strncpy(pTmpBuf.data(), v72, v77);
   window->DrawTitleText(pFontComic, 0, 0xCu, TargetColor(0xFFu, 0xFFu, 0x9Bu), pTmpBuf.data(), 3);
+  //health bar
   Actor::DrawHealthBar(&pActors[uActorID], window);
-  v119 = 0;
+
+  normal_level = 0;
+  expert_level = 0;
+  master_level = 0;
+  grandmaster_level = 0;
   pMonsterInfoUI_Doll.uCurrentActionTime += pMiscTimer->uTimeElapsed;
   v115 = 0;
-  v116 = 0;
-  i = 0;
-  v112 = 0;
   if ( !uActiveCharacter )
     v45 = 1;
   else
   {
-    LOBYTE(v40) = pPlayers[uActiveCharacter]->GetActualSkillLevel(PLAYER_SKILL_MONSTER_ID);
-    v120 = v40;
-    if ( !v40 )
+    int i = pPlayers[uActiveCharacter]->GetActualSkillLevel(PLAYER_SKILL_MONSTER_ID);
+    if ( !i )
       v45 = 1;
     else
     {
-      v41 = (unsigned __int8)v40 & 0x3F;
-      v42 = SkillToMastery((unsigned __int16)v40) - 1;
-      if ( !v42 )
+      v41 = (unsigned __int8)i & 0x3F;
+      v42 = SkillToMastery(i) - 1;
+      if ( !v42 )//not master
       {
         if ( v41 + 10 >= pActors[uActorID].pMonsterInfo.uLevel )
         {
           v45 = 1;
-          v119 = 1;
+          normal_level = 1;
         }
         else
           v45 = 1;
       }
-      else
+      else//he is master
       {
         v43 = v42 - 1;
         if ( !v43 )
@@ -731,8 +698,8 @@
           if ( 2 * v41 + 10 >= pActors[uActorID].pMonsterInfo.uLevel )
           {
             v45 = 1;
-            v119 = 1;
-            v116 = 1;
+            normal_level = 1;
+            expert_level = 1;
           }
           else
             v45 = 1;
@@ -745,9 +712,9 @@
             if ( 3 * v41 + 10 >= pActors[uActorID].pMonsterInfo.uLevel )
             {
               v45 = 1;
-              v119 = 1;
-              v116 = 1;
-              i = 1;
+              normal_level = 1;
+              expert_level = 1;
+              master_level = 1;
             }
             else
               v45 = 1;
@@ -759,10 +726,10 @@
             else
             {
               v45 = 1;
-              v119 = 1;
-              v116 = 1;
-              i = 1;
-              v112 = 1;
+              normal_level = 1;
+              expert_level = 1;
+              master_level = 1;
+              grandmaster_level = 1;
             }
           }
         }
@@ -770,9 +737,9 @@
     }
     if ( pActors[uActorID].uAIState != Dead
       && pActors[uActorID].uAIState != Dying
-      && !dword_507BF0_is_there_popup_onscreen && v120 )
+      && !dword_507BF0_is_there_popup_onscreen && i )
     {
-      if ( v119 | v116 | i | (unsigned int)v112 )
+      if ( normal_level | expert_level | master_level | grandmaster_level )
       {
         if ( pActors[uActorID].pMonsterInfo.uLevel >= pPlayers[uActiveCharacter]->uLevel - 5 )
           v73 = SPEECH_105;
@@ -785,193 +752,164 @@
     }
   }
 
-  for (uint i = 0; i < 4; ++i)
+  if ( (signed int)SkillToMastery(pParty->pPlayers[uActiveCharacter].GetActualSkillLevel(PLAYER_SKILL_MONSTER_ID)) >= 3 )
+    v115 = v45;
+
+  if ( monster_full_informations == true )
   {
-    v120 = (SpellBuff *)138;
-    do
-    {
-      if ( (signed int)SkillToMastery(pParty->pPlayers[i].GetActualSkillLevel(PLAYER_SKILL_MONSTER_ID)) >= 3 )
-        v115 = v45;
-      v120 = (SpellBuff *)((char *)v120 - 1);
-    }
-    while ( v120 );
+    normal_level = 1;//
+    expert_level = 1;//
+    master_level = 1;//
+    grandmaster_level = 1;//
+    v115 = 1;
   }
 
-  window->DrawText(pFontSmallnum, 12, 196, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[631], 0, 0, 0);
+  window->DrawText(pFontSmallnum, 12, 196, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[631], 0, 0, 0);//Effects
   if ( !v115 )
-    window->DrawText(pFontSmallnum, 28, LOBYTE(pFontSmallnum->uFontHeight) + 193, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[630], 0, 0, 0);
+    window->DrawText(pFontSmallnum, 28, LOBYTE(pFontSmallnum->uFontHeight) + 193, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[630], 0, 0, 0);//?
   else
   {
-	  a4 = 0;
-	  v51 = &pActors[uActorID].pActorBuffs[1];
-	  v222 = 0;
-	  v120 = &pActors[uActorID].pActorBuffs[1];
-	  do
-	  {
-		if ( (signed __int64)v51->uExpireTime > 0 )
-		{
-		  switch ( (int)v51 )
-		  {
-			case 0u:
-			  v124 = 60;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[591];
-			  break;
-			case 1u:
-			  v124 = 82;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[649];
-			  break;
-			case 2u:
-			  v124 = 92;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[592];
-			  break;
-			case 3u:
-			  v124 = 63;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[4];
-			  break;
-			case 4u:
-			  v52 = pGlobalTXT_LocalizationStrings[220];
-			  a4 = (int)v52;
-			  v124 = 81;
-			  break;
-			case 5u:
-			  v52 = pGlobalTXT_LocalizationStrings[162];
-			  a4 = (int)v52;
-			  v124 = 81;
-			  break;
-			case 6u:
-			  v53 = pGlobalTXT_LocalizationStrings[593];
-			  v124 = 35;
-			  a4 = (int)v53;
-			  break;
-			case 8u:
-			  v53 = pGlobalTXT_LocalizationStrings[608];
-			  v124 = 62;
-			  a4 = (int)v53;
-			  break;
-			case 7u:
-			case 9u:
-			  a4 = 0;
-			  v124 = 0;
-			  ++v51;
-			  v222 = v222 + 1;
-			  v120 = v51;
-			  __debugbreak(); // fix condition
-			  continue;
-			case 0xAu:
-			  v124 = 47;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[221];
-			  break;
-			case 0xBu:
-			  v124 = 66;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[607];
-			  break;
-			case 0xCu:
-			  v124 = 85;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[610];
-			  break;
-			case 0xDu:
-			  v124 = 86;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[609];
-			  break;
-			case 0xEu:
-			  v124 = 17;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[279];
-			  break;
-			case 0xFu:
-			  v124 = 38;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[442];
-			  break;
-			case 0x10u:
-			  v124 = 46;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[443];
-			  break;
-			case 0x11u:
-			  v124 = 51;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[440];
-			  break;
-			case 0x12u:
-			  v124 = 5;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[441];
-			  break;
-			case 0x13u:
-			  v124 = 95;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[229];
-			  break;
-			case 0x14u:
-			  v124 = 73;
-			  a4 = (int)pGlobalTXT_LocalizationStrings[228];
-			  break;
-			default:
-			  a4 = 0;
-			  break;
-		  }
-		  if ( a4 )
-		  {
-			v54 = (char *)a4;
-			v55 = GetSpellColor(v124);
-			window->DrawText(pFontSmallnum, 28, LOBYTE(pFontSmallnum->uFontHeight) + 193, v55, v54, 0, 0, 0);
-			v50 = (LOBYTE(pFontSmallnum->uFontHeight) + 193) + *(char *)((int)pFontSmallnum + 5) - 3;
-			v51 = v120;
-		  }
-		}
+    pText = "";
+    pTextHeight = LOBYTE(pFontSmallnum->uFontHeight) + 193;
+    for ( uint i = 1; i <= 21; ++i )
+    {
+      if ( pActors[uActorID].pActorBuffs[i].uExpireTime > 0 )
+      {
+        switch ( i - 1 )
+        {
+          case 0:
+            pTextColorID = 60;
+            pText = pGlobalTXT_LocalizationStrings[591];//Charmed
+            break;
+          case 1:
+            pTextColorID = 82;
+            pText = pGlobalTXT_LocalizationStrings[649];//Summoned
+            break;
+          case 2:
+            pTextColorID = 92;
+            pText = pGlobalTXT_LocalizationStrings[592];//Shrunk
+            break;
+          case 3:
+            pTextColorID = 63;
+            pText = pGlobalTXT_LocalizationStrings[4];//Afraid
+            break;
+          case 4:
+            pText = pGlobalTXT_LocalizationStrings[220];//Stoned
+            pTextColorID = 81;
+            break;
+          case 5:
+            pText = pGlobalTXT_LocalizationStrings[162];//Paralyzed
+            pTextColorID = 81;
+            break;
+          case 6:
+            pText = pGlobalTXT_LocalizationStrings[593];//Slowed
+            pTextColorID = 35;
+            break;
+          case 8:
+            pText = pGlobalTXT_LocalizationStrings[608];//Berserk
+            pTextColorID = 62;
+            break;
+          case 7:
+          case 9:
+            pText = "";
+            pTextColorID = 0;
+            continue;
+          case 10:
+            pTextColorID = 47;
+            pText = pGlobalTXT_LocalizationStrings[221];//Fate
+            break;
+          case 11:
+            pTextColorID = 66;
+            pText = pGlobalTXT_LocalizationStrings[607];//Enslaved
+            break;
+          case 12:
+            pTextColorID = 85;
+            pText = pGlobalTXT_LocalizationStrings[610];//Day of Protection
+            break;
+          case 13:
+            pTextColorID = 86;
+            pText = pGlobalTXT_LocalizationStrings[609];//Hour of Power
+            break;
+          case 14:
+            pTextColorID = 17;
+            pText = pGlobalTXT_LocalizationStrings[279];//Shield
+            break;
+          case 15:
+            pTextColorID = 38;
+            pText = pGlobalTXT_LocalizationStrings[442];//Stoneskin
+            break;
+          case 16:
+            pTextColorID = 46;
+            pText = pGlobalTXT_LocalizationStrings[443];//Bless
+            break;
+          case 17:
+            pTextColorID = 51;
+            pText = pGlobalTXT_LocalizationStrings[440];//Heroism
+            break;
+          case 18:
+            pTextColorID = 5;
+            pText = pGlobalTXT_LocalizationStrings[441];//Haste
+            break;
+          case 19:
+            pTextColorID = 95;
+            pText = pGlobalTXT_LocalizationStrings[229];//Pain Reflection
+            break;
+          case 20:
+            pTextColorID = 73;
+            pText = pGlobalTXT_LocalizationStrings[228];//Hammerhands
+            break;
+          default:
+            pText = "";
+            break;
+        }
+        if ( pText != "" )
+        {
+          window->DrawText(pFontSmallnum, 28, pTextHeight, GetSpellColor(pTextColorID), pText, 0, 0, 0);
+          pTextHeight = pTextHeight + *(char *)((int)pFontSmallnum + 5) - 3;
+        }
+      }
+    }
+    if ( pText == "" )
+      window->DrawText(pFontSmallnum, 28, pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[153], 0, 0, 0);//Νες
+  }
 
-		++v51;
-		v222 = v222 + 1;
-		v120 = v51;
-
-		__debugbreak(); // fix condition
-	  }
-	  //while ( (signed int)((char *)&v222->lpVtbl + 1) < 22 );
-	  while (true);
-
-	  if ( !a4 )
-		window->DrawText(pFontSmallnum, 28, v50, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[153], 0, 0, 0);
-  }
-  v56 = pFontSmallnum;
-  a4 = v106.uViewportY;
-  if ( v119 )
+  if ( normal_level )
   {
     sprintf(pTmpBuf.data(), "%s\f%05u\t100%d\n", pGlobalTXT_LocalizationStrings[108], 0, pActors[uActorID].pMonsterInfo.uHP);
-    window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-    a4 = a4 + LOBYTE(v56->uFontHeight) - 3;
-    v79 = pActors[uActorID].pMonsterInfo.uAC;
-    v75 = 0;
-    v70 = pGlobalTXT_LocalizationStrings[12];
-    v67 = "%s\f%05u\t100%d\n";
+    window->DrawText(pFontSmallnum, 150, (int)v106.uViewportY, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+    pTextHeight = v106.uViewportY + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+    sprintf(pTmpBuf.data(), "%s\f%05u\t100%d\n", pGlobalTXT_LocalizationStrings[12], 0, pActors[uActorID].pMonsterInfo.uAC);//Armor Class
   }
   else
   {
-    sprintf(pTmpBuf.data(), "%s\f%05u\t100%s\n", pGlobalTXT_LocalizationStrings[108], 0, pGlobalTXT_LocalizationStrings[630]);
-    window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-    v79 = (unsigned int)pGlobalTXT_LocalizationStrings[630];
-    v75 = 0;
-    v70 = pGlobalTXT_LocalizationStrings[12];
-    a4 = a4 + LOBYTE(v56->uFontHeight) - 3;
-    v67 = "%s\f%05u\t100%s\n";
+    sprintf(pTmpBuf.data(), "%s\f%05u\t100%s\n", pGlobalTXT_LocalizationStrings[108], 0, pGlobalTXT_LocalizationStrings[630]);//?
+    window->DrawText(pFontSmallnum, 150, (int)v106.uViewportY, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+    pTextHeight = v106.uViewportY + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+    sprintf(pTmpBuf.data(), "%s\f%05u\t100%s\n", pGlobalTXT_LocalizationStrings[12], 0, (unsigned int)pGlobalTXT_LocalizationStrings[630]);//?
   }
-  sprintf(pTmpBuf.data(), v67, v70, v75, v79);
-  window->DrawText(v56, 150, a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-  a4 = a4 + LOBYTE(v56->uFontHeight) - 6 + LOBYTE(v56->uFontHeight);
-  v95[0] = pGlobalTXT_LocalizationStrings[87];
-  v95[1] = pGlobalTXT_LocalizationStrings[6];
-  v95[2] = pGlobalTXT_LocalizationStrings[240];
-  v95[3] = pGlobalTXT_LocalizationStrings[70];
-  v95[4] = pGlobalTXT_LocalizationStrings[624];
-  v95[5] = pGlobalTXT_LocalizationStrings[138];
-  v95[6] = pGlobalTXT_LocalizationStrings[214];
-  v95[7] = pGlobalTXT_LocalizationStrings[142];
-  v95[8] = pGlobalTXT_LocalizationStrings[29];
-  v95[9] = pGlobalTXT_LocalizationStrings[133];
-  v95[10] = pGlobalTXT_LocalizationStrings[54];
-  if ( v116 )
+  window->DrawText(pFontSmallnum, 150, pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+  pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 6 + LOBYTE(pFontSmallnum->uFontHeight);
+
+  content[0] = pGlobalTXT_LocalizationStrings[87];
+  content[1] = pGlobalTXT_LocalizationStrings[6];
+  content[2] = pGlobalTXT_LocalizationStrings[240];
+  content[3] = pGlobalTXT_LocalizationStrings[70];
+  content[4] = pGlobalTXT_LocalizationStrings[624];
+  content[5] = pGlobalTXT_LocalizationStrings[138];
+  content[6] = pGlobalTXT_LocalizationStrings[214];
+  content[7] = pGlobalTXT_LocalizationStrings[142];
+  content[8] = pGlobalTXT_LocalizationStrings[29];
+  content[9] = pGlobalTXT_LocalizationStrings[133];
+  content[10] = pGlobalTXT_LocalizationStrings[54];
+
+  if ( expert_level )
   {
-    sprintf(pTmpBuf.data(), "%s\f%05u\t080%s\n", pGlobalTXT_LocalizationStrings[18], 0, v95[pActors[uActorID].pMonsterInfo.uAttack1Type]);
-    window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-    a4 = a4 + LOBYTE(v56->uFontHeight) - 3;
-    v57 = pActors[uActorID].pMonsterInfo.uAttack1DamageBonus;
-    if ( v57 )
+    sprintf(pTmpBuf.data(), "%s\f%05u\t080%s\n", pGlobalTXT_LocalizationStrings[18], 0, content[pActors[uActorID].pMonsterInfo.uAttack1Type]);//Attack
+    window->DrawText(pFontSmallnum, 150, (int)pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+    pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+    if ( pActors[uActorID].pMonsterInfo.uAttack1DamageBonus )
       sprintf(pTmpBuf.data(), "%s\f%05u\t080%dd%d+%d\n", pGlobalTXT_LocalizationStrings[53],
-        0, pActors[uActorID].pMonsterInfo.uAttack1DamageDiceRolls, pActors[uActorID].pMonsterInfo.uAttack1DamageDiceSides, v57);
+        0, pActors[uActorID].pMonsterInfo.uAttack1DamageDiceRolls, pActors[uActorID].pMonsterInfo.uAttack1DamageDiceSides, pActors[uActorID].pMonsterInfo.uAttack1DamageBonus);
     else
       sprintf(pTmpBuf.data(), "%s\f%05u\t080%dd%d\n", pGlobalTXT_LocalizationStrings[53],
         0, pActors[uActorID].pMonsterInfo.uAttack1DamageDiceRolls, pActors[uActorID].pMonsterInfo.uAttack1DamageDiceSides);
@@ -979,124 +917,101 @@
   else
   {
     sprintf(pTmpBuf.data(), "%s\f%05u\t080%s\n", pGlobalTXT_LocalizationStrings[18], 0, pGlobalTXT_LocalizationStrings[630]);
-    window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-    a4 = a4 + LOBYTE(v56->uFontHeight) - 3;
+    window->DrawText(pFontSmallnum, 150, (int)pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+    pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
     sprintf(pTmpBuf.data(), "%s\f%05u\t080%s\n", pGlobalTXT_LocalizationStrings[53], 0, pGlobalTXT_LocalizationStrings[630]);
   }
-  window->DrawText(v56, 150, a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-  v58 = LOBYTE(v56->uFontHeight);
-  a4 = a4 + v58 - 6 + v58;
-  if ( !i )
+  window->DrawText(pFontSmallnum, 150, pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+  pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 6 + LOBYTE(pFontSmallnum->uFontHeight);
+
+  if ( !master_level )
   {
-    v80 = pGlobalTXT_LocalizationStrings[630];
-    v76 = 0;
-    v71 = pGlobalTXT_LocalizationStrings[628];
-    v68 = "%s\f%05u\t080%s\n";
-    sprintf(pTmpBuf.data(), v68, v71, v76, v80);
-    window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-    v58 = LOBYTE(v56->uFontHeight);
-    a4 = a4 + v58 - 3;
+    sprintf(pTmpBuf.data(), "%s\f%05u\t080%s\n", pGlobalTXT_LocalizationStrings[628], 0, pGlobalTXT_LocalizationStrings[630]);//"Spell" "?"
+    window->DrawText(pFontSmallnum, 150, (int)pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+    pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
   }
   else
   {
-	  v120 = (SpellBuff *)pGlobalTXT_LocalizationStrings[628];
-	  v59 = &pActors[uActorID];
-	  v114 = pActors[uActorID].pMonsterInfo.uSpell1ID;
-	  if ( v114 && pActors[uActorID].pMonsterInfo.uSpell2ID )
-		v120 = (SpellBuff *)pGlobalTXT_LocalizationStrings[629];
-	  if ( v114 )
-	  {
-		sprintf(pTmpBuf.data(), "%s\f%05u\t060%s\n", v120, 0, pSpellStats->pInfos[v114].pShortName);
-		window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-		v58 = LOBYTE(v56->uFontHeight);
-		a4 = a4 + v58 - 3;
-		v59 = &pActors[uActorID];
-	  }
-	  v60 = v59->pMonsterInfo.uSpell2ID;
-	  if ( v60 )
-	  {
-		sprintf(pTmpBuf.data(), "\f%05u\t060%s\n", 0, pSpellStats->pInfos[v60].pShortName);
-		window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-		v58 = LOBYTE(v56->uFontHeight);
-		a4 = a4 + v58 - 3;
-		v59 = &pActors[uActorID];
-	  }
-	  if ( !v59->pMonsterInfo.uSpell1ID && !v59->pMonsterInfo.uSpell2ID )
-	  {
-		v80 = pGlobalTXT_LocalizationStrings[153];
-		v76 = 0;
-		v71 = pGlobalTXT_LocalizationStrings[628];
-		v68 = "%s\f%05u\t060%s\n";
-		sprintf(pTmpBuf.data(), v68, v71, v76, v80);
-		window->DrawText(v56, 150, (int)a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-		v58 = LOBYTE(v56->uFontHeight);
-		a4 = a4 + v58 - 3;
-	  }
+    pText = pGlobalTXT_LocalizationStrings[628];//Spell
+    if ( pActors[uActorID].pMonsterInfo.uSpell1ID && pActors[uActorID].pMonsterInfo.uSpell2ID )
+      pText = pGlobalTXT_LocalizationStrings[629];//Spells
+    if ( pActors[uActorID].pMonsterInfo.uSpell1ID )
+    {
+      sprintf(pTmpBuf.data(), "%s\f%05u\t070%s\n", pText, 0, pSpellStats->pInfos[pActors[uActorID].pMonsterInfo.uSpell1ID].pShortName);
+      window->DrawText(pFontSmallnum, 150, (int)pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+      pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+    }
+    if ( pActors[uActorID].pMonsterInfo.uSpell2ID )
+    {
+      sprintf(pTmpBuf.data(), "\f%05u\t070%s\n", 0, pSpellStats->pInfos[pActors[uActorID].pMonsterInfo.uSpell2ID].pShortName);
+      window->DrawText(pFontSmallnum, 150, (int)pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+      pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+    }
+    if ( !pActors[uActorID].pMonsterInfo.uSpell1ID && !pActors[uActorID].pMonsterInfo.uSpell2ID )
+    {
+      sprintf(pTmpBuf.data(), "%s\f%05u\t070%s\n", pGlobalTXT_LocalizationStrings[628], 0, pGlobalTXT_LocalizationStrings[153]);
+      window->DrawText(pFontSmallnum, 150, (int)pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+      pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+    }
   }
-  a4 = a4 + v58 - 3;
-  window->DrawText(v56, 150, a4, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[626], 0, 0, 0);
-  a4 = a4 + LOBYTE(v56->uFontHeight) - 3;
-  v85[0] = pGlobalTXT_LocalizationStrings[87];
-  v85[1] = pGlobalTXT_LocalizationStrings[6];
-  v85[2] = pGlobalTXT_LocalizationStrings[240];
-  v85[3] = pGlobalTXT_LocalizationStrings[70];
-  v85[4] = pGlobalTXT_LocalizationStrings[142];
-  v85[5] = pGlobalTXT_LocalizationStrings[214];
-  v85[6] = pGlobalTXT_LocalizationStrings[29];
-  v85[7] = pGlobalTXT_LocalizationStrings[133];
-  v85[8] = pGlobalTXT_LocalizationStrings[54];
-  v85[9] = pGlobalTXT_LocalizationStrings[624];
-  v95[1] = (char *)pActors[uActorID].pMonsterInfo.uResFire;
-  v95[2] = (char *)pActors[uActorID].pMonsterInfo.uResAir;
-  v95[3] = (char *)pActors[uActorID].pMonsterInfo.uResWater;
-  v95[4] = (char *)pActors[uActorID].pMonsterInfo.uResEarth;
-  v95[5] = (char *)pActors[uActorID].pMonsterInfo.uResMind;
-  v95[6] = (char *)pActors[uActorID].pMonsterInfo.uResSpirit;
-  v95[7] = (char *)pActors[uActorID].pMonsterInfo.uResBody;
-  v95[8] = (char *)pActors[uActorID].pMonsterInfo.uResLight;
-  v95[9] = (char *)pActors[uActorID].pMonsterInfo.uResPhysical;
-  v95[10] = (char *)pActors[uActorID].pMonsterInfo.uResDark;
-  if ( v112 )
+  pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+  window->DrawText(pFontSmallnum, 150, pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pGlobalTXT_LocalizationStrings[626], 0, 0, 0);//Immune
+  pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
+
+  string_name[0] = pGlobalTXT_LocalizationStrings[87];//Fire
+  string_name[1] = pGlobalTXT_LocalizationStrings[6];//Air
+  string_name[2] = pGlobalTXT_LocalizationStrings[240];
+  string_name[3] = pGlobalTXT_LocalizationStrings[70];
+  string_name[4] = pGlobalTXT_LocalizationStrings[142];
+  string_name[5] = pGlobalTXT_LocalizationStrings[214];
+  string_name[6] = pGlobalTXT_LocalizationStrings[29];
+  string_name[7] = pGlobalTXT_LocalizationStrings[133];
+  string_name[8] = pGlobalTXT_LocalizationStrings[54];
+  string_name[9] = pGlobalTXT_LocalizationStrings[624];
+
+  content[0] = (char *)pActors[uActorID].pMonsterInfo.uResFire;
+  content[1] = (char *)pActors[uActorID].pMonsterInfo.uResAir;
+  content[2] = (char *)pActors[uActorID].pMonsterInfo.uResWater;
+  content[3] = (char *)pActors[uActorID].pMonsterInfo.uResEarth;
+  content[4] = (char *)pActors[uActorID].pMonsterInfo.uResMind;
+  content[5] = (char *)pActors[uActorID].pMonsterInfo.uResSpirit;
+  content[6] = (char *)pActors[uActorID].pMonsterInfo.uResBody;
+  content[7] = (char *)pActors[uActorID].pMonsterInfo.uResLight;
+  content[8] = (char *)pActors[uActorID].pMonsterInfo.uResPhysical;
+  content[9] = (char *)pActors[uActorID].pMonsterInfo.uResDark;
+
+  if ( grandmaster_level )
   {
-    v124 = 0;
-    do
+    for ( uint i = 0; i < 10; i++ )
     {
-      v62 = v95[v124+1];
-      if ( v62 == (char *)200 )
+      if ( content[i] == (char *)200 )
       {
-        v81 = pGlobalTXT_LocalizationStrings[625];
+        pText = pGlobalTXT_LocalizationStrings[625];//Immune
       }
       else
       {
-        if ( v62 )
-          v81 = pGlobalTXT_LocalizationStrings[627];
+        if ( content[i] )
+          pText = pGlobalTXT_LocalizationStrings[627];//Resistant
         else
-          v81 = pGlobalTXT_LocalizationStrings[153];
+          pText = pGlobalTXT_LocalizationStrings[153];//None
       }
-      sprintf(pTmpBuf.data(), "%s\f%05u\t070%s\n", v85[v124], 0, v81);
-      window->DrawText(v56, 170, a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-      v63 = LOBYTE(v56->uFontHeight);
-      v124 += 4;
-      a4 = a4 + v63 - 3;
+      sprintf(pTmpBuf.data(), "%s\f%05u\t070%s\n", string_name[i], 0, pText);
+      window->DrawText(pFontSmallnum, 170, pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+      pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
     }
-    while ( v124 < 40 );
   }
   else
   {
-    i = 0;
-    do
+    for ( uint i = 0; i < 10; ++i )
     {
-      sprintf(pTmpBuf.data(), "%s\f%05u\t070%s\n", v85[i], 0, pGlobalTXT_LocalizationStrings[630]); // "?"
-      window->DrawText(v56, 170, a4, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
-      v65 = LOBYTE(v56->uFontHeight);
-      ++i;
-      a4 = a4 + v65 - 3;
+      sprintf(pTmpBuf.data(), "%s\f%05u\t070%s\n", string_name[i], 0, pGlobalTXT_LocalizationStrings[630]); // "?"
+      window->DrawText(pFontSmallnum, 170, pTextHeight, TargetColor(0xE1u, 255, 0x9Bu), pTmpBuf.data(), 0, 0, 0);
+      pTextHeight = pTextHeight + LOBYTE(pFontSmallnum->uFontHeight) - 3;
     }
-    while ( i < 10 );
   }
   if ( (signed __int64)pParty->pPartyBuffs[PARTY_BUFF_DETECT_LIFE].uExpireTime > 0 )
   {
-    sprintf(pTmpBuf.data(), "%s: %d", pGlobalTXT_LocalizationStrings[650], pActors[uActorID].sCurrentHP);
+    sprintf(pTmpBuf.data(), "%s: %d", pGlobalTXT_LocalizationStrings[650], pActors[uActorID].sCurrentHP);//Current Hit Points
     pFontSmallnum->GetLineWidth(pTmpBuf.data());
     window->DrawTitleText(pFontSmallnum, 0, window->uFrameHeight - LOBYTE(pFontSmallnum->uFontHeight) - 12, 0, pTmpBuf.data(), 3);
   }
--- a/stru6.cpp	Mon Sep 23 09:34:23 2013 +0600
+++ b/stru6.cpp	Mon Sep 23 17:33:12 2013 +0600
@@ -918,7 +918,7 @@
 
   if ( result < 545 )
   {
-    __debugbreak(); // find out what kind of spells are these
+    //__debugbreak(); // find out what kind of spells are these
 					// when summoned light elemental attacks
 	//cast spell from trees in Avlee
       result -= 500;