changeset 2330:5133eea7a4ca

Merge
author Grumpy7
date Tue, 01 Apr 2014 23:44:27 +0200
parents 4791895e4396 (diff) 846e28e41fb4 (current diff)
children 9551756f46c4
files
diffstat 1 files changed, 292 insertions(+), 664 deletions(-) [+]
line wrap: on
line diff
--- a/Spells.cpp	Fri Mar 28 12:32:18 2014 +0600
+++ b/Spells.cpp	Tue Apr 01 23:44:27 2014 +0200
@@ -355,729 +355,357 @@
 void __fastcall EventCastSpell(int uSpellID, int uSkillLevel, int uSkill, int fromx, int fromy, int fromz, int tox, int toy, int toz)//sub_448DF8
 {
   int v9; // esi@1
-  double v10; // st7@4
-  double v11; // st6@4
-  double v12; // st5@4
+  signed __int64 v10; // st7@4
+  signed __int64 v11; // st6@4
+  signed __int64 v12; // st5@4
   double v13; // st7@6
   int v14; // ST44_4@7
-  signed int v15; // ebx@9
-  signed int v16; // edx@15
-  char *v17; // ecx@16
-  unsigned __int16 v18; // ax@20
-  char *v19; // ecx@31
-  int v20; // edx@35
-  signed int v21; // edx@37
-  char *v22; // ecx@38
-  unsigned __int16 v23; // ax@41
+  uint skillMasteryPlusOne; // ebx@9
+  uint v16; // edx@15
   int i; // esi@42
-  signed int v25; // edx@55
-  char *v26; // ecx@56
-  unsigned __int16 v27; // ax@59
   int j; // esi@60
-  signed int v29; // edx@66
-  char *v30; // ecx@67
-  unsigned __int16 v31; // ax@70
-  //Player *v32; // eax@80
-  //unsigned __int16 v33; // si@85
-  int v34; // eax@96
-  int v35; // eax@97
   unsigned __int64 v36; // qax@99
   SpellBuff *v37; // ecx@99
   int v38; // esi@103
   signed __int64 v39; // qax@105
-  int v40; // ebx@108
-  int v41; // ebx@109
   int v42; // esi@111
   int v43; // ebx@111
-  int v44; // eax@117
-  //unsigned __int16 v45; // si@137
-  unsigned __int16 v46; // [sp-8h] [bp-BCh]@99
   int v47; // [sp-4h] [bp-B8h]@35
-  unsigned __int16 v48; // [sp-4h] [bp-B8h]@99
   int v49; // [sp+0h] [bp-B4h]@35
-  int v50; // [sp+0h] [bp-B4h]@99
-  int v51; // [sp+4h] [bp-B0h]@35
-  unsigned __int8 v52; // [sp+4h] [bp-B0h]@99
-  float v53; // [sp+14h] [bp-A0h]@4
-  float v54; // [sp+18h] [bp-9Ch]@4
   int v55; // [sp+28h] [bp-8Ch]@7
   unsigned int yaw; // [sp+30h] [bp-84h]@7
   int pitch; // [sp+34h] [bp-80h]@7
-  //SpriteObject a1; // [sp+38h] [bp-7Ch]@12
-  int v59; // [sp+A8h] [bp-Ch]@1
   int v60; // [sp+ACh] [bp-8h]@1
-  //int spellnum_; // [sp+B0h] [bp-4h]@1
-  //signed int levela; // [sp+BCh] [bp+8h]@80
   int a6_4; // [sp+C8h] [bp+14h]@117
-  float a7a; // [sp+CCh] [bp+18h]@6
-  signed int a7b; // [sp+CCh] [bp+18h]@12
   int a7c; // [sp+CCh] [bp+18h]@29
   int a7d; // [sp+CCh] [bp+18h]@55
-  float a8a; // [sp+D0h] [bp+1Ch]@6
+  signed __int64 xSquared; // [sp+D0h] [bp+1Ch]@6
   int a8b; // [sp+D0h] [bp+1Ch]@37
   int a8c; // [sp+D0h] [bp+1Ch]@55
-  float toza; // [sp+D4h] [bp+20h]@6
+  signed __int64 ySquared; // [sp+D4h] [bp+20h]@6
 
   v9 = 0;
-  v59 = uSkillLevel + 1;
+  skillMasteryPlusOne = uSkillLevel + 1;
   //spellnum_ = uSpellID;
   v60 = 0;
   if ( tox || toy || toz )
   {
-    v10 = (double)tox - (double)fromx;
-    v53 = v10;
-    v11 = (double)toy - (double)fromy;
-    v54 = v11;
-    v12 = (double)toz;
+    v10 = tox - fromx;
+    v11 = toy - fromy;
+    v12 = toz - fromz;
   }
   else
   {
-    v10 = (double)pParty->vPosition.x - (double)fromx;
-    v53 = v10;
-    v11 = (double)pParty->vPosition.y - (double)fromy;
-    v54 = v11;
-    v12 = (double)(pParty->vPosition.z + pParty->sEyelevel);
+    v10 = pParty->vPosition.x - fromx;
+    v11 = pParty->vPosition.y - fromy;
+    v12 = (pParty->vPosition.z + pParty->sEyelevel) - fromz;
   }
-  a7a = v12 - (double)fromz;
-  toza = v11 * v11;
-  a8a = v10 * v10;
-  v13 = sqrt(a7a * a7a + a8a + toza);
+  v13 = sqrt(v10 * v10 + v11 * v11 + v12 * v12);
   if ( v13 <= 1.0 )
   {
-    LOBYTE(v55) = 1;
+    v55 = 1;
     yaw = 0;
     pitch = 0;
   }
   else
   {
-    v55 = (signed __int64)v13;
-    v14 = (signed __int64)sqrt(a8a + toza);
-    yaw = stru_5C6E00->Atan2((signed __int64)v53, (signed __int64)v54);
-    pitch = stru_5C6E00->Atan2(v14, (signed __int64)a7a);
+    v55 = (int)v13;
+    ySquared = v11 * v11;
+    xSquared = v10 * v10;
+    v14 = (int)sqrt(xSquared + ySquared);
+    yaw = stru_5C6E00->Atan2((int)v10, (int)v11);
+    pitch = stru_5C6E00->Atan2(v14, (int)v12);
   }
-  v15 = v59;
-  if ( v59 <= 0 || v59 > 4 )
-    v15 = 1;
-  a7b = v15;
+  Assert(skillMasteryPlusOne > 0 && skillMasteryPlusOne <= 4, "Invalid mastery level");
 
   SpriteObject a1; // [sp+38h] [bp-7Ch]@12
   //SpriteObject::SpriteObject(&a1);
 
-  a1.uType = stru_4E3ACC[uSpellID].uType;
-  if ( uSpellID > 58 )
-  {
-    if ( uSpellID == SPELL_BODY_PROTECTION_FROM_BODY )
-      goto LABEL_117;
-    if ( uSpellID != SPELL_LIGHT_DAY_OF_THE_GODS )
-      return;
-    v40 = v15 - 2;
-    if ( v40 )
-    {
-      v41 = v40 - 1;
-      if ( !v41 )
-      {
-        v42 = 14400 * uSkill;
-        v43 = 4 * uSkill + 10;
-        pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 0);
-        pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 1u);
-        pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 2u);
-        pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 3u);
-        v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
-        v37 = &pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS];
-        v36 = pParty->uTimePlayed + v39;
-        v37->Apply(v36, a7b, v43, 0, 0);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
-      }
-      if ( v41 == 1 )
-      {
-        v42 = 18000 * uSkill;
-        v43 = 5 * uSkill + 10;
-       pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 0);
-       pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 1u);
-       pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 2u);
-       pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 3u);
-       v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
-       v37 = &pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS];
-       v36 = pParty->uTimePlayed + v39;
-       v37->Apply(v36, a7b, v43, 0, 0);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
-      }
-    }
-    v42 = 10800 * uSkill;
-    v43 = 3 * uSkill + 10;
-    pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 0);
-    pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 1u);
-    pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 2u);
-    pGame->pStru6Instance->SetPlayerBuffAnim(0x53u, 3u);
-    v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
-    v37 = &pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS];
-    v36 = pParty->uTimePlayed + v39;
-    v37->Apply(v36, a7b, v43, 0, 0);
-    pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-    return;
-  }
-  if ( uSpellID != 58 )
+  switch ( uSpellID )
   {
-    switch ( uSpellID )
-    {
-      case SPELL_FIRE_FIRE_BOLT:
-      case SPELL_FIRE_FIREBALL:
-      case SPELL_AIR_LIGHNING_BOLT:
-      case SPELL_WATER_ICE_BOLT:
-      case SPELL_WATER_ACID_BURST:
-      case SPELL_WATER_ICE_BLAST:
-      case SPELL_EARTH_BLADES:
-      case SPELL_EARTH_ROCK_BLAST:
-        a1.stru_24.Reset();
-        v16 = 0;
-        a1.spell_id = uSpellID;
-        a1.spell_level = uSkill;
-        a1.spell_skill = v15;
-        if ( (signed int)pObjectList->uNumObjects <= 0 )
+    case SPELL_FIRE_FIRE_BOLT:
+    case SPELL_FIRE_FIREBALL:
+    case SPELL_AIR_LIGHNING_BOLT:
+    case SPELL_WATER_ICE_BOLT:
+    case SPELL_WATER_ACID_BURST:
+    case SPELL_WATER_ICE_BLAST:
+    case SPELL_EARTH_BLADES:
+    case SPELL_EARTH_ROCK_BLAST:
+    case SPELL_WATER_POISON_SPRAY:
+    case SPELL_AIR_SPARKS:
+    case SPELL_EARTH_DEATH_BLOSSOM:
+      a1.uType = stru_4E3ACC[uSpellID].uType;
+      a1.stru_24.Reset();
+      a1.spell_id = uSpellID;
+      a1.spell_level = uSkill;
+      a1.spell_skill = skillMasteryPlusOne;
+      v16 = 0;
+      while (v16 < pObjectList->uNumObjects)
+      {
+        if ( a1.uType == pObjectList->pObjects[v16].uObjectID)
         {
-          //v18 = 0;
-          a1.uObjectDescID = 0;
-          *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-          a1.vPosition.x = fromx;
-          a1.uAttributes = 16;
-          a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-          a1.field_60_distance_related_prolly_lod = v55;
-          //v20 = yaw;
-          a1.uSpriteFrameID = 0;
-          a1.spell_caster_pid = 8000 | OBJECT_Item;
-          a1.spell_target_pid = 0;
-          a1.uFacing = yaw;
-          a1.uSoundID = 0;
-          v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-          a1.Create(yaw, pitch, v49, 0);
-          pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-          return;
+          break;
         }
-        v17 = (char *)&pObjectList->pObjects->uObjectID;
-        while ( (short)a1.uType != *(short *)v17 )
-        {
-          ++v16;
-          v17 += 56;
-          if ( v16 >= (signed int)pObjectList->uNumObjects )
-          {
-            //v18 = 0;
-            a1.uObjectDescID = 0;
-            *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-            a1.vPosition.x = fromx;
-            a1.uAttributes = 16;
-            a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-            a1.field_60_distance_related_prolly_lod = v55;
-            //v20 = yaw;
-            a1.uSpriteFrameID = 0;
-            a1.spell_caster_pid = 8000 | OBJECT_Item;
-            a1.spell_target_pid = 0;
-            a1.uFacing = yaw;
-            a1.uSoundID = 0;
-            v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-            a1.Create(yaw, pitch, v49, 0);
-            pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-            return;
-          }
-        }
-        v18 = v16;
-        a1.uObjectDescID = v18;
-        *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-        a1.vPosition.x = fromx;
-        a1.uAttributes = 16;
-        a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-        a1.field_60_distance_related_prolly_lod = v55;
-        //v20 = yaw;
-        a1.uSpriteFrameID = 0;
-        a1.spell_caster_pid = 8000 | OBJECT_Item;
-        a1.spell_target_pid = 0;
-        a1.uFacing = yaw;
-        a1.uSoundID = 0;
+        v16++;
+      }
+      a1.uObjectDescID = v16;
+      a1.vPosition.x = fromx;
+      a1.vPosition.y = fromy;
+      a1.vPosition.z = fromz;
+      a1.uAttributes = 16;
+      a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
+      a1.field_60_distance_related_prolly_lod = v55;
+      a1.uSpriteFrameID = 0;
+      a1.spell_caster_pid = 8000 | OBJECT_Item;
+      a1.uSoundID = 0;
+      break;
+  }
+
+  switch ( uSpellID )
+  {
+    case SPELL_FIRE_FIRE_BOLT:
+    case SPELL_FIRE_FIREBALL:
+    case SPELL_AIR_LIGHNING_BOLT:
+    case SPELL_WATER_ICE_BOLT:
+    case SPELL_WATER_ACID_BURST:
+    case SPELL_WATER_ICE_BLAST:
+    case SPELL_EARTH_BLADES:
+    case SPELL_EARTH_ROCK_BLAST:
+      //v20 = yaw;
+      a1.spell_target_pid = 0;
+      a1.uFacing = yaw;
+      a1.uSoundID = 0;
+      v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
+      a1.Create(yaw, pitch, v49, 0);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    case SPELL_WATER_POISON_SPRAY:
+      switch ( skillMasteryPlusOne )
+      {
+        case 1:
+          v60 = 1;
+          break;
+        case 2:
+          v60 = 3;
+          break;
+        case 3:
+          v60 = 5;
+          break;
+        case 4:
+          v60 = 7;
+          break;
+      }
+      a1.spell_target_pid = 0;
+      a1.uFacing = yaw;
+      if ( v60 == 1 )
+      {
         v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
         a1.Create(yaw, pitch, v49, 0);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
-      case SPELL_WATER_POISON_SPRAY:
-        switch ( v15 )
-        {
-          case 1:
-            v60 = 1;
-            break;
-          case 2:
-            v60 = 3;
-            break;
-          case 3:
-            v60 = 5;
-            break;
-          case 4:
-            v60 = 7;
-            break;
-        }
+      }
+      else
+      {
         a7c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
-        if ( v60 != 1 )
-        {
-          a8b = a7c / (v60 - 1);
-          a1.stru_24.Reset();
-          v21 = 0;
-          a1.spell_id = uSpellID;
-          a1.spell_level = uSkill;
-          a1.spell_skill = v15;
-          if ( (signed int)pObjectList->uNumObjects <= 0 )
-            v23 = 0;
-          else
-          {
-            v22 = (char *)&pObjectList->pObjects->uObjectID;
-            while ( (short)a1.uType != *(short *)v22 )
-            {
-              ++v21;
-              v22 += 56;
-              if ( v21 >= (signed int)pObjectList->uNumObjects )
-              {
-                v23 = 0;
-                a1.uObjectDescID = v23;
-                *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-                a1.vPosition.x = fromx;
-                a1.uAttributes = 16;
-                a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-                a1.field_60_distance_related_prolly_lod = v55;
-                a1.uSpriteFrameID = 0;
-                a1.spell_caster_pid = 8000 | OBJECT_Item;
-                a1.spell_target_pid = 4;
-                a1.uSoundID = 0;
-                for ( i = a7c / -2; i <= a7c / 2; i += a8b )
-                {
-                  a1.uFacing = i + yaw;
-                  a1.Create((signed __int16)(i + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
-                }
-                pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-                return;
-              }
-            }
-            v23 = v21;
-          }
-          a1.uObjectDescID = v23;
-          *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-          a1.vPosition.x = fromx;
-          a1.uAttributes = 16;
-          a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-          a1.field_60_distance_related_prolly_lod = v55;
-          a1.uSpriteFrameID = 0;
-          a1.spell_caster_pid = 8000 | OBJECT_Item;
-          a1.spell_target_pid = 4;
-          a1.uSoundID = 0;
-          for ( i = a7c / -2; i <= a7c / 2; i += a8b )
-          {
-            a1.uFacing = i + yaw;
-            a1.Create((signed __int16)(i + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
-          }
-          pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-          return;
-        }
-        a1.stru_24.Reset();
-        a1.spell_id = uSpellID;
-        a1.spell_level = uSkill;
-        a1.spell_skill = v15;
-        if ( (signed int)pObjectList->uNumObjects <= 0 )
-        {
-          //v18 = 0;
-          a1.uObjectDescID = 0;
-          *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-          a1.vPosition.x = fromx;
-          a1.uAttributes = 16;
-          a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-          a1.field_60_distance_related_prolly_lod = v55;
-          //v20 = yaw;
-          a1.uSpriteFrameID = 0;
-          a1.spell_caster_pid = 8000 | OBJECT_Item;
-          a1.spell_target_pid = 0;
-          a1.uFacing = yaw;
-          a1.uSoundID = 0;
-          //v51 = 0;
-          v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-          //v47 = pitch;
-          a1.Create(yaw, pitch, v49, 0);
-          pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-          return;
-        }
-        //v19 = (char *)&pObjectList->pObjects->uObjectID;
-        for ( v16 = 0; v16 < (signed int)pObjectList->uNumObjects; ++v16 )
+        a8b = a7c / (v60 - 1);
+        for ( i = a7c / -2; i <= a7c / 2; i += a8b )
         {
-          if ( (short)a1.uType == pObjectList->pObjects[v16].uObjectID )
-          {
-            //v18 = v16;
-            a1.uObjectDescID = v16;
-            *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-            a1.vPosition.x = fromx;
-            a1.uAttributes = 16;
-            a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-            a1.field_60_distance_related_prolly_lod = v55;
-            //v20 = yaw;
-            a1.uSpriteFrameID = 0;
-            a1.spell_caster_pid = 8000 | OBJECT_Item;
-            a1.spell_target_pid = 0;
-            a1.uFacing = yaw;
-            a1.uSoundID = 0;
-            //v51 = 0;
-            v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-            //v47 = pitch;
-            a1.Create(yaw, pitch, v49, 0);
-            pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-            return;
-          }
-          //v19 += 56;
-        }
-        //v18 = 0;
-        a1.uObjectDescID = 0;
-        *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-        a1.vPosition.x = fromx;
-        a1.uAttributes = 16;
-        a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-        a1.field_60_distance_related_prolly_lod = v55;
-        //v20 = yaw;
-        a1.uSpriteFrameID = 0;
-        a1.spell_caster_pid = 8000 | OBJECT_Item;
-        a1.spell_target_pid = 0;
-        a1.uFacing = yaw;
-        a1.uSoundID = 0;
-        //v51 = 0;
-        v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-        //v47 = pitch;
-        a1.Create(yaw, pitch, v49, 0);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
-      case SPELL_AIR_SPARKS:
-        switch ( v15 )
-        {
-          case 1:
-            v60 = 3;
-            break;
-          case 2:
-            v60 = 5;
-            break;
-          case 3:
-            v60 = 7;
-            break;
-          case 4:
-            v60 = 9;
-            break;
-        }
-        a7d = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
-        a8c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v60 - 1);
-        a1.stru_24.Reset();
-        v25 = 0;
-        a1.spell_id = uSpellID;
-        a1.spell_level = uSkill;
-        a1.spell_skill = v15;
-        if ( (signed int)pObjectList->uNumObjects <= 0 )
-        {
-          //v27 = 0;
-          a1.uObjectDescID = 0;
-          *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-          a1.vPosition.x = fromx;
-          a1.uAttributes = 16;
-          a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-          a1.field_60_distance_related_prolly_lod = v55;
-          a1.uSpriteFrameID = 0;
-          a1.spell_caster_pid = 8000 | OBJECT_Item;
-          a1.spell_target_pid = 4;
-          a1.uSoundID = 0;
-          for ( j = a7d / -2; j <= a7d / 2; j += a8c )
-          {
-            a1.uFacing = j + yaw;
-            a1.Create((signed __int16)(j + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
-          }
-          pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-          return;
-        }
-        v26 = (char *)&pObjectList->pObjects->uObjectID;
-        while ( (short)a1.uType != *(short *)v26 )
-        {
-          ++v25;
-          v26 += 56;
-          if ( v25 >= (signed int)pObjectList->uNumObjects )
-          {
-            v27 = 0;
-            a1.uObjectDescID = v27;
-            *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-            a1.vPosition.x = fromx;
-            a1.uAttributes = 16;
-            a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-            a1.field_60_distance_related_prolly_lod = v55;
-            a1.uSpriteFrameID = 0;
-            a1.spell_caster_pid = 8000 | OBJECT_Item;
-            a1.spell_target_pid = 4;
-            a1.uSoundID = 0;
-            for ( j = a7d / -2; j <= a7d / 2; j += a8c )
-            {
-              a1.uFacing = j + yaw;
-              a1.Create((signed __int16)(j + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
-            }
-            pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-            return;
-          }
-        }
-        v27 = v25;
-        a1.uObjectDescID = v27;
-        *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-        a1.vPosition.x = fromx;
-        a1.uAttributes = 16;
-        a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-        a1.field_60_distance_related_prolly_lod = v55;
-        a1.uSpriteFrameID = 0;
-        a1.spell_caster_pid = 8000 | OBJECT_Item;
-        a1.spell_target_pid = 4;
-        a1.uSoundID = 0;
-        for ( j = a7d / -2; j <= a7d / 2; j += a8c )
-        {
-          a1.uFacing = j + yaw;
-          a1.Create((signed __int16)(j + (short)yaw), pitch,
-            pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
+          a1.uFacing = i + yaw;
+          a1.Create((signed __int16)(i + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
         }
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
-      case SPELL_EARTH_DEATH_BLOSSOM:
-        if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
-          return;
-        a1.stru_24.Reset();
-        v29 = 0;
-        a1.spell_id = uSpellID;
-        a1.spell_level = uSkill;
-        a1.spell_skill = v15;
-        if ( (signed int)pObjectList->uNumObjects <= 0 )
-        {
-          //v31 = 0;
-          a1.uObjectDescID = 0;
-          *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-          a1.vPosition.x = fromx;
-          a1.uAttributes = 16;
-          a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-          a1.field_60_distance_related_prolly_lod = v55;
-          a1.uSpriteFrameID = 0;
-          a1.spell_caster_pid = 8000 | OBJECT_Item;
-          a1.spell_target_pid = 4;
-          a1.uSoundID = 0;
-          //v51 = 0;
-          v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-          //v20 = yaw;
-          v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
-          a1.Create(yaw, v47, v49, 0);
-          pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-          return;
-        }
-        v30 = (char *)&pObjectList->pObjects->uObjectID;
-        break;
-
-      case SPELL_FIRE_HASTE:
-        if ( v15 > 0 )
-        {
-          if ( v15 <= 2 )
-            v9 = 60 * (uSkill + 60);
-          else if ( v15 == 3 )
-            v9 = 180 * (uSkill + 20);
-          else if ( v15 == 4 )
-            v9 = 240 * (uSkill + 15);
-        }
-        //levela = 1;
-        //v32 = pParty->pPlayers;//[0].pConditions[1];
-        //do
-        for (uint i = 0; i < 4; ++i)
-          if (pParty->pPlayers[i].IsWeak())
-            return;
-		//while ( v32 <= &pParty->pPlayers[3] );
-        //if ( !levela )
-        //  return;
-        pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 * 128) * 0.033333335),
-          v15, 0, 0, 0);
-        //v33 = spellnum_;
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);//звук алтаря
-        return;
-      case SPELL_AIR_SHIELD:
-      case SPELL_EARTH_STONESKIN:
-      case SPELL_SPIRIT_HEROISM:
-        switch ( v15 )
-        {
-          case 1:
-          case 2:
-            v9 = 300 * (uSkill + 12);
-            break;
-          case 3:
-            v9 = 900 * (uSkill + 4);
-            break;
-          case 4:
-            v9 = 3600 * (uSkill + 1);
-            break;
-        }
-        switch ( uSpellID )
-        {
-          case 17:
-            v60 = 0;
-            uSkill = 14;
-            break;
-          case 38:
-            v35 = uSkill + 5;
-            uSkill = 15;
-            v60 = v35;
-            break;
-          case 51:
-            v34 = uSkill + 5;
-            uSkill = 9;
-            v60 = v34;
-            break;
-        }
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
-        //v52 = 0;
-        //v50 = 0;
-        //v48 = v60;
-        //v46 = v15;
-        v36 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 << 7) * 0.033333335);
-        //v37 = &pParty->pPartyBuffs[uSkill];
-        pParty->pPartyBuffs[uSkill].Apply(v36, v15, v60, 0, 0);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      }
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    case SPELL_AIR_SPARKS:
+      switch ( skillMasteryPlusOne )
+      {
+        case 1:
+          v60 = 3;
+          break;
+        case 2:
+          v60 = 5;
+          break;
+        case 3:
+          v60 = 7;
+          break;
+        case 4:
+          v60 = 9;
+          break;
+      }
+      a7d = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
+      a8c = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v60 - 1);
+      a1.spell_target_pid = 4;
+      for ( j = a7d / -2; j <= a7d / 2; j += a8c )
+      {
+        a1.uFacing = j + yaw;
+        a1.Create((signed __int16)(j + (short)yaw), pitch, pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed, 0);
+      }
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    case SPELL_EARTH_DEATH_BLOSSOM:
+      if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
         return;
-      case SPELL_FIRE_IMMOLATION:
-        if ( v15 == 2 || v15 == 3 || v15 != 4 )
-          v38 = 60 * uSkill;
-        else
-          v38 = 600 * uSkill;
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
-        pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
-        v52 = 0;
-        v50 = 0;
-        v48 = uSkill;
-        v46 = v15;
-        v39 = (signed __int64)((double)(v38 << 7) * 0.033333335);
-        v37 = &pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION];
-        v36 = pParty->uTimePlayed + v39;
-        v37->Apply(v36, v46, v48, v50, v52);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
-      case SPELL_FIRE_PROTECTION_FROM_FIRE:
-      case SPELL_AIR_PROTECTION_FROM_AIR:
-      case SPELL_WATER_PROTECTION_FROM_WATER:
-      case SPELL_EARTH_PROTECTION_FROM_EARTH:
-        goto LABEL_117;
-      default:
-        return;
-    }
-    while ( (short)a1.uType != *(short *)v30 )
-    {
-      ++v29;
-      v30 += 56;
-      if ( v29 >= (signed int)pObjectList->uNumObjects )
+      a1.spell_target_pid = 4;
+      v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
+      v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
+      a1.Create(yaw, v47, v49, 0);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+
+    case SPELL_FIRE_HASTE:
+      if ( skillMasteryPlusOne > 0 )
       {
-        //v31 = 0;
-        a1.uObjectDescID = 0;
-        *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-        a1.vPosition.x = fromx;
-        a1.uAttributes = 16;
-        a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-        a1.field_60_distance_related_prolly_lod = v55;
-        a1.uSpriteFrameID = 0;
-        a1.spell_caster_pid = 8000 | OBJECT_Item;
-        a1.spell_target_pid = 4;
-        a1.uSoundID = 0;
-        //v51 = 0;
-        v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-        //v20 = yaw;
-        v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
-        a1.Create(yaw, v47, v49, 0);
-        pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-        return;
+        if ( skillMasteryPlusOne <= 2 )
+          v9 = 60 * (uSkill + 60);
+        else if ( skillMasteryPlusOne == 3 )
+          v9 = 180 * (uSkill + 20);
+        else if ( skillMasteryPlusOne == 4 )
+          v9 = 240 * (uSkill + 15);
+      }
+      for (uint i = 0; i < 4; ++i)
+        if (pParty->pPlayers[i].IsWeak())
+          return;
+      pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 * 128) * 0.033333335), skillMasteryPlusOne, 0, 0, 0);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);//звук алтаря
+      return;
+    case SPELL_AIR_SHIELD:
+    case SPELL_EARTH_STONESKIN:
+    case SPELL_SPIRIT_HEROISM:
+      switch ( skillMasteryPlusOne )
+      {
+        case 1:
+        case 2:
+          v9 = 300 * (uSkill + 12);
+          break;
+        case 3:
+          v9 = 900 * (uSkill + 4);
+          break;
+        case 4:
+          v9 = 3600 * (uSkill + 1);
+          break;
+      }
+      switch ( uSpellID )
+      {
+        case SPELL_AIR_SHIELD:
+          v60 = 0;
+          uSkill = 14;
+          break;
+        case SPELL_EARTH_STONESKIN:
+          v60 = uSkill + 5;
+          uSkill = 15;
+          break;
+        case SPELL_SPIRIT_HEROISM:
+          v60 = uSkill + 5;
+          uSkill = 9;
+          break;
       }
-    }
-    v31 = v29;
-    a1.uObjectDescID = v31;
-    *(_QWORD *)&a1.vPosition.y = __PAIR__(fromz, fromy);
-    a1.vPosition.x = fromx;
-    a1.uAttributes = 16;
-    a1.uSectorID = pIndoor->GetSector(fromx, fromy, fromz);
-    a1.field_60_distance_related_prolly_lod = v55;
-    a1.uSpriteFrameID = 0;
-    a1.spell_caster_pid = 8000 | OBJECT_Item;
-    a1.spell_target_pid = 4;
-    a1.uSoundID = 0;
-    //v51 = 0;
-    v49 = pObjectList->pObjects[(signed __int16)a1.uObjectDescID].uSpeed;
-    //v20 = yaw;
-    v47 = (signed int)stru_5C6E00->uIntegerHalfPi / 2;
-    a1.Create(yaw, v47, v49, 0);
-    pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
-    return;
-  }
-LABEL_117:
-  v44 = uSkill;
-  a6_4 = 3600 * uSkill;
-  if ( v15 == 1 )
-  {
-    v60 = v44;
-    goto LABEL_125;
-  }
-  if ( v15 == 2 )
-  {
-    v44 = 2 * uSkill;
-    v60 = v44;
-    goto LABEL_125;
-  }
-  if ( v15 == 3 )
-  {
-    v44 = 3 * uSkill;
-    v60 = v44;
-    goto LABEL_125;
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+      v36 = pParty->uTimePlayed + (signed int)(signed __int64)((double)(v9 << 7) * 0.033333335);
+      pParty->pPartyBuffs[uSkill].Apply(v36, skillMasteryPlusOne, v60, 0, 0);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    case SPELL_FIRE_IMMOLATION:
+      if (skillMasteryPlusOne == 4)
+        v38 = 600 * uSkill;
+      else
+        v38 = 60 * uSkill;
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+      v39 = (signed __int64)((double)(v38 << 7) * 0.033333335);
+      v36 = pParty->uTimePlayed + v39;
+      pParty->pPartyBuffs[PARTY_BUFF_IMMOLATION].Apply(v36, skillMasteryPlusOne, uSkill, 0, 0);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    case SPELL_FIRE_PROTECTION_FROM_FIRE:
+    case SPELL_AIR_PROTECTION_FROM_AIR:
+    case SPELL_WATER_PROTECTION_FROM_WATER:
+    case SPELL_EARTH_PROTECTION_FROM_EARTH:
+    case SPELL_MIND_PROTECTION_FROM_MIND:
+    case SPELL_BODY_PROTECTION_FROM_BODY:
+      a6_4 = 3600 * uSkill;
+      switch (skillMasteryPlusOne)
+      {
+      case 1:
+        v60 = uSkill;
+        break;
+      case 2:
+        v60 = 2 * uSkill;
+        break;
+      case 3:
+        v60 = 3 * uSkill;
+        break;
+      case 4:
+        v60 = 4 * uSkill;
+        break;
+      }
+      switch ( uSpellID )
+      {
+      case SPELL_FIRE_PROTECTION_FROM_FIRE:
+        uSkill = PARTY_BUFF_RESIST_FIRE;
+        break;
+      case SPELL_AIR_PROTECTION_FROM_AIR:
+        uSkill = PARTY_BUFF_RESIST_AIR;
+        break;
+      case SPELL_WATER_PROTECTION_FROM_WATER:
+        uSkill = PARTY_BUFF_RESIST_WATER;
+        break;
+      case SPELL_EARTH_PROTECTION_FROM_EARTH:
+        uSkill = PARTY_BUFF_RESIST_EARTH;
+        break;
+      case SPELL_MIND_PROTECTION_FROM_MIND:
+        uSkill = PARTY_BUFF_RESIST_MIND;
+        break;
+      case SPELL_BODY_PROTECTION_FROM_BODY:
+        uSkill = PARTY_BUFF_RESIST_BODY;
+        break;
+      }
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+      pParty->pPartyBuffs[uSkill].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)a6_4 * 4.2666669), skillMasteryPlusOne, v60, 0, 0);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    case SPELL_LIGHT_DAY_OF_THE_GODS :
+      switch (skillMasteryPlusOne)
+      {
+      case 2:
+        v42 = 10800 * uSkill;
+        v43 = 3 * uSkill + 10;
+        break;
+      case 3:
+        v42 = 18000 * uSkill;
+        v43 = 5 * uSkill + 10;
+        break;
+      case 4:
+        v42 = 14400 * uSkill;
+        v43 = 4 * uSkill + 10;
+        break;
+      }
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
+      pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
+      v39 = (signed __int64)((double)(v42 << 7) * 0.033333335);
+      v36 = pParty->uTimePlayed + v39;
+      pParty->pPartyBuffs[PARTY_BUFF_DAY_OF_GODS].Apply(v36, skillMasteryPlusOne, v43, 0, 0);
+      pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
+      return;
+    default:
+      return;
   }
-  if ( v15 == 4 )
-  {
-    v44 = 4 * uSkill;
-    v60 = v44;
-    goto LABEL_125;
-  }
-LABEL_125:
-  switch ( uSpellID )
-  {
-    case 3:
-      uSkill = 6;
-      break;
-    case 14:
-      uSkill = 0;
-      break;
-    case 25:
-      uSkill = 17;
-      break;
-    case 36:
-      uSkill = 4;
-      break;
-    case 58:
-      uSkill = 12;
-      break;
-    case 69:
-      uSkill = 1;
-      break;
-  }
-  //v45 = spellnum_;
-  pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 0);
-  pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 1);
-  pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 2);
-  pGame->pStru6Instance->SetPlayerBuffAnim(uSpellID, 3);
-  pParty->pPartyBuffs[uSkill].Apply(pParty->uTimePlayed + (signed int)(signed __int64)((double)a6_4 * 4.2666669), v15, v60, 0, 0);
-  //levela = 1;
-//LABEL_138:
-  //if ( levela )
-//LABEL_139:
-    pAudioPlayer->PlaySound((SoundID)word_4EE088_sound_ids[uSpellID], 0, 0, fromx, fromy, 0, 0, 0);
 }
 //----- (00427769) --------------------------------------------------------
 bool sub_427769_isSpellQuickCastableOnShiftClick(unsigned int uSpellID)
 {
-  return ( pSpellDatas[uSpellID].stats & 0xC );
+  return ( pSpellDatas[uSpellID].stats & 0xC ) != 0;
 }
 //----- (0043AFE3) --------------------------------------------------------
 int _43AFE3_calc_spell_damage(int spellId, int spellLevel, signed int skillMastery, int currentHp)