changeset 2188:0ae56373cc35

CastSpell continue
author Ritor1
date Tue, 28 Jan 2014 22:41:49 +0600
parents 9856c2f8f918
children 0e2bee275f60 4842f58715ea
files CastSpellInfo.cpp stru6.cpp
diffstat 2 files changed, 201 insertions(+), 230 deletions(-) [+]
line wrap: on
line diff
--- a/CastSpellInfo.cpp	Tue Jan 28 17:25:58 2014 +0600
+++ b/CastSpellInfo.cpp	Tue Jan 28 22:41:49 2014 +0600
@@ -2864,7 +2864,6 @@
       }
       case SPELL_LIGHT_PRISMATIC_LIGHT://Свет призмы
       {
-        //v67 = 2;
         if ( uCurrentlyLoadedLevelType == LEVEL_Outdoor)
         {
           ShowStatusBarString(pGlobalTXT_LocalizationStrings[497], 2);  // Can't cast Prismatic Light outdoors!
@@ -2874,7 +2873,7 @@
         }
         if ( !pPlayer->CanCastSpell(uRequiredMana) )
           break;
-        v531 = pRenderer->_46А6АС_GetActorsInViewport(4096);
+        int mon_num = pRenderer->_46А6АС_GetActorsInViewport(4096);
         ++pSpellSprite.uType;
         v694.x = 0;
         v694.y = 0;
@@ -2891,233 +2890,205 @@
         pSpellSprite.uFacing = 0;
         pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
         pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
-        a2 = 0;
-			if ( (signed int)v531 > 0 )
-			{
-				do
-				{
-					v533 = _50BF30_actors_in_viewport_ids[a2];
-					pSpellSprite.vPosition.x = pActors[v533].vPosition.x;
-					pSpellSprite.vPosition.y = pActors[v533].vPosition.y;
-					pSpellSprite.vPosition.z = pActors[v533].vPosition.z - (unsigned int)(signed __int64)((double)pActors[v533].uActorHeight * -0.8);
-					pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[a2]);
-					v535 = pSpellSprite.Create(0, 0, 0, 0);
-					v536 = a2;
-					DamageMonsterFromParty(PID(OBJECT_Item, v535), _50BF30_actors_in_viewport_ids[a2], &v694);
-					a2 = v536 + 1;
-				}
-				while ( v536 + 1 < (signed int)v531 );
-			}
-			v537 = pGame->GetStru6();
-			pGame->GetStru6()->_4A8BFC();
-			LODWORD(v727) = 1;
-			break;
-		}
-		case SPELL_LIGHT_DAY_OF_PROTECTION:
-		{
-			switch (skill_level)
-			{
-				case 1: LODWORD(v733) = 14400 * spell_level; amount = 4 * spell_level; break;
-				case 2: LODWORD(v733) = 14400 * spell_level; amount = 4 * spell_level; break;
-				case 3: LODWORD(v733) = 14400 * spell_level; amount = 4 * spell_level; break;
-				case 4: LODWORD(v733) = 18000 * spell_level; amount = 5 * spell_level; break;
-				default:
-				assert(false);
-			}
-			v730 = LODWORD(v733);
-			if ( !pPlayer->CanCastSpell(uRequiredMana) )
-				break;
-
-			pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
-			pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
-			pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
-			pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
-
-			v732 = v730 << 7;
-			v549 = (double)(v730 << 7) * 0.033333335;
-			*((float *)&v733 + 1) = v549;
-			v712 = (signed __int64)v549;
-			pParty->pPartyBuffs[PARTY_BUFF_RESIST_BODY].Apply(pParty->uTimePlayed + (signed __int64)v549, skill_level, amount, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_RESIST_MIND].Apply(pParty->uTimePlayed + v712, skill_level, amount, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_RESIST_FIRE].Apply(pParty->uTimePlayed + v712, skill_level, amount, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_RESIST_WATER].Apply(pParty->uTimePlayed + v712, skill_level, amount, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_RESIST_AIR].Apply(pParty->uTimePlayed + v712, skill_level, amount, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_RESIST_EARTH].Apply(pParty->uTimePlayed + v712, skill_level, amount, 0, 0);
-			v550 = spell_level + 5;
-			pParty->pPartyBuffs[PARTY_BUFF_FEATHER_FALL].Apply(
-				(signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733 + 1)),
-				skill_level,
-				v550, 0, 0);
-
-			pParty->pPartyBuffs[PARTY_BUFF_WIZARD_EYE].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733 + 1)), skill_level, v550, 0, 0);
-			LODWORD(v727) = 1;
-			break;
-		}
-		case SPELL_LIGHT_HOUR_OF_POWER:
-		{
-			switch (skill_level)
-			{
-				case 1: LODWORD(v733) = 4; amount = 4; break;
-				case 2: LODWORD(v733) = 4; amount = 4; break;
-				case 3: LODWORD(v733) = 12; amount = 12; break;
-				case 4: LODWORD(v733) = 20; amount = 15; break;
-				default:
-				assert(false);
-			}
-			if ( !pPlayer->CanCastSpell(uRequiredMana) )
-				break;
-			y = (char *)(60 * (spell_level * LODWORD(v733) + 60));
-			v732 = (300 * amount * spell_level + 60) << 7;
-			v730 = spell_level + 5;
-			int _v726 = 0;
-			v553 = pParty->pPlayers.data();//[0].pConditions[1];
-			*((float *)&v733) = (double)v732 * 0.033333335;
-			do
-			{
-				pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
-				pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
-				pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
-				pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
-
-				//((SpellBuff *)(v553 + 6056))->Apply(
-				v553->pPlayerBuffs[4].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), skill_level, v730, 0, 0);
-				if ( *(_QWORD *)v553 )
-					_v726 = 1;
-				++v553;
-			}
-			while ( v553 <= &pParty->pPlayers[3] );
-			v562 = skill_level;
-			pParty->pPartyBuffs[PARTY_BUFF_HEROISM].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), skill_level, v730, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_SHIELD].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), v562, 0, 0, 0);
-			pParty->pPartyBuffs[PARTY_BUFF_STONE_SKIN].Apply((signed __int64)((double)(signed __int64)pParty->uTimePlayed + *((float *)&v733)), v562, v730, 0, 0);
-			if (!_v726)
-			{
-				pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply((signed __int64)((double)(signed int)((int)y << 7) * 0.033333335 + (double)(signed __int64)pParty->uTimePlayed), v562, v730, 0, 0);
-			}
-			LODWORD(v727) = 1;
-			break;
-		}
-		case SPELL_LIGHT_DIVINE_INTERVENTION://Божественное вмешательство
-		{
-			amount = 3;
-			if ( pPlayer->uNumDivineInterventionCastsThisDay >= 3 )
-			{
-				ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
-				pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
-				pCastSpell->uSpellID = 0;
-				continue;
-			}
-			if ( !pPlayer->CanCastSpell(uRequiredMana) )
-				break;
-			for ( uint pl_id = 0; pl_id < 4; pl_id++ )
-			{
-				for ( v563 = 0; v563 <= 19; v563++)
-				{
-				  LODWORD(pPlayers[pl_id]->pConditions[v563]) = 0;
-				  HIDWORD(pPlayers[pl_id]->pConditions[v563]) = 0;
-				}
-				pPlayers[pl_id]->sHealth = pPlayers[pl_id]->GetMaxHealth();
-				pPlayers[pl_id]->sMana = pPlayers[pl_id]->GetMaxMana();
-				pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
-			}
-			if ( pPlayer->sAgeModifier + 10 >= 120 )
-				pPlayer->sAgeModifier = 120;
-			else
-				pPlayer->sAgeModifier = pPlayer->sAgeModifier + 10;
-			sRecoveryTime += -5 * spell_level;
-			++pPlayer->uNumDivineInterventionCastsThisDay;
-			LODWORD(v727) = 1;
-			break;
-		}
-		case SPELL_DARK_REANIMATE:
-		{
-			switch (skill_level)
-			{
-				case 1: amount = 2 * spell_level; break;
-				case 2: amount = 3 * spell_level; break;
-				case 3: amount = 4 * spell_level; break;
-				case 4: amount = 5 * spell_level; break;
-				default:
-				assert(false);
-			}
-			if ( !pPlayer->CanCastSpell(uRequiredMana) )
-				break;
-			v576 = pCastSpell->spell_target_pid;
-			if (!v576)
-			{
-				v585 = (char *)&pParty->pPlayers[pCastSpell->uPlayerID_2];
-				pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
-				if ( *((_QWORD *)v585 + 14) )
-				{
-				((Player *)v585)->SetCondition(0x11u, 1);
-				v587 = ((Player *)v585)->GetSexByVoice();
-				ReloadPlayerPortraits(pCastSpell->uPlayerID_2, (v587 != 0) + 23);
-				*((_QWORD *)v585 + 17) = pParty->uTimePlayed;
-				}
-				break;
-			}
-			v577 = (Player *)(PID_ID(v576));
-			//v726 = v577;
-			if ( v577 == (Player *)-1 )
-			{
-				ShowStatusBarString(pGlobalTXT_LocalizationStrings[496], 2);  // No valid target exists!
-				pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
-				pCastSpell->uSpellID = 0;
-				continue;
-			}
-			v578 = (int)&pActors[(int)v577];
-			v721 = v578;
-			if ( *(short *)(v578 + 40) > 0 || (v579 = *(short *)(v578 + 176), v579 != 5) && v579 != 4 )
-			{
-				ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
-				pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
-				pCastSpell->uSpellID = 0;
-				continue;
-			}
-			++pSpellSprite.uType;
-			pSpellSprite.stru_24.Reset();
-			pSpellSprite.spell_id = pCastSpell->uSpellID;
-			pSpellSprite.spell_level = spell_level;
-			pSpellSprite.spell_skill = skill_level;
-			pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
-			pSpellSprite.uAttributes = 0;
-			pSpellSprite.uSectorID = 0;
-			pSpellSprite.uSpriteFrameID = 0;
-			pSpellSprite.field_60_distance_related_prolly_lod = 0;
-			v581 = v721;
-			pSpellSprite.uFacing = 0;
-			pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
-			pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
-			pSpellSprite.vPosition.x = *(short *)(v721 + 142);
-			pSpellSprite.vPosition.y = *(short *)(v721 + 144);
-			v732 = *(short *)(v721 + 138);
-			pSpellSprite.vPosition.z = *(short *)(v721 + 146) - (unsigned int)(signed __int64)((double)v732 * -0.8);
-			pSpellSprite.spell_target_pid = PID(OBJECT_Actor, (int)v577);
-			pSpellSprite.Create(0, 0, 0, 0);
-			if ( *(char *)(v581 + 52) > amount )
-				break;
-			Actor::Resurrect((unsigned int)v577);
-			*(char *)(v581 + 61) = 0;
-			*(char *)(v581 + 53) = 0;
-			*(char *)(v581 + 54) = 0;
-			*(char *)(v581 + 55) = 0;
-			*(char *)(v581 + 56) = 0;
-			*(char *)(v581 + 57) = 0;
-			*(int *)(v581 + 712) = 9999;
-			*(char *)(v581 + 38) &= 0xF7u;
-			*(int *)(v581 + 708) = 0;
-			((SpellBuff *)(v581 + 356))->Reset();
-			((SpellBuff *)(v581 + 228))->Reset();
-			((SpellBuff *)(v581 + 404))->Reset();
-			if ( *(short *)(v581 + 40) > 10 * amount )
-				*(short *)(v581 + 40) = 10 * amount;
-			LODWORD(v727) = 1;
-			break;
-		}
-		case SPELL_DARK_VAMPIRIC_WEAPON:
-		{
-			amount = 16;
-			if ( skill_level == 4 )
+        for ( uint mon_id = 0; mon_id < mon_num; mon_id++ )
+        {
+          pSpellSprite.vPosition.x = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.x;
+          pSpellSprite.vPosition.y = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.y;
+          pSpellSprite.vPosition.z = pActors[_50BF30_actors_in_viewport_ids[mon_id]].vPosition.z -
+                (unsigned int)(signed __int64)((double)pActors[_50BF30_actors_in_viewport_ids[mon_id]].uActorHeight * -0.8);
+          pSpellSprite.spell_target_pid = PID(OBJECT_Actor, _50BF30_actors_in_viewport_ids[mon_id]);
+          DamageMonsterFromParty(PID(OBJECT_Item, pSpellSprite.Create(0, 0, 0, 0)), _50BF30_actors_in_viewport_ids[mon_id], &v694);
+        }
+        //v537 = pGame->GetStru6();
+        pGame->GetStru6()->_4A8BFC();
+        LODWORD(v727) = 1;
+        break;
+      }
+      case SPELL_LIGHT_DAY_OF_PROTECTION://День защиты
+      {
+        switch (skill_level)
+        {
+          case 1: duration = 14400 * spell_level; amount = 4 * spell_level; break;
+          case 2: duration = 14400 * spell_level; amount = 4 * spell_level; break;
+          case 3: duration = 14400 * spell_level; amount = 4 * spell_level; break;
+          case 4: duration = 18000 * spell_level; amount = 5 * spell_level; break;
+          default:
+            assert(false);
+        }
+        if ( !pPlayer->CanCastSpell(uRequiredMana) )
+          break;
+        pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
+        pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
+        pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
+        pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
+        pParty->pPartyBuffs[PARTY_BUFF_RESIST_BODY].Apply(pParty->uTimePlayed + 
+                           (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_RESIST_MIND].Apply(pParty->uTimePlayed + 
+                           (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_RESIST_FIRE].Apply(pParty->uTimePlayed + 
+                           (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_RESIST_WATER].Apply(pParty->uTimePlayed + 
+                           (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_RESIST_AIR].Apply(pParty->uTimePlayed + 
+                           (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_RESIST_EARTH].Apply(pParty->uTimePlayed + 
+                           (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, amount, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_FEATHER_FALL].Apply(pParty->uTimePlayed + 
+                  (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_WIZARD_EYE].Apply(pParty->uTimePlayed +
+                  (signed __int64)((double)(duration << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
+        LODWORD(v727) = 1;
+        break;
+      }
+      case SPELL_LIGHT_HOUR_OF_POWER: //Час могущества
+      {
+        switch (skill_level)
+        {
+          case 1: duration = 4; amount = 4; break;
+          case 2: duration = 4; amount = 4; break;
+          case 3: duration = 12; amount = 12; break;
+          case 4: duration = 20; amount = 15; break;
+          default:
+            assert(false);
+        }
+        if ( !pPlayer->CanCastSpell(uRequiredMana) )
+          break;
+        bool player_weak = false;
+        for ( uint pl_id = 0; pl_id < 4; pl_id++ )
+        {
+          pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 0);
+          pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 1);
+          pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 2);
+          pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, 3);
+          pParty->pPlayers[pl_id].pPlayerBuffs[PLAYER_BUFF_BLESS].Apply(pParty->uTimePlayed + 
+            (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
+          if ( pParty->pPlayers[pl_id].pConditions[Condition_Weak] )
+            player_weak = true;
+        }
+        pParty->pPartyBuffs[PARTY_BUFF_HEROISM].Apply(pParty->uTimePlayed +
+          (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_SHIELD].Apply(pParty->uTimePlayed + 
+          (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, 0, 0, 0);
+        pParty->pPartyBuffs[PARTY_BUFF_STONE_SKIN].Apply(pParty->uTimePlayed + 
+          (signed __int64)((double)((300 * amount * spell_level + 60) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
+        if ( !player_weak )
+          pParty->pPartyBuffs[PARTY_BUFF_HASTE].Apply(pParty->uTimePlayed + 
+            (signed __int64)((double)((60 * (spell_level * duration + 60)) << 7) * 0.033333335), skill_level, spell_level + 5, 0, 0);
+        LODWORD(v727) = 1;
+        break;
+      }
+      case SPELL_LIGHT_DIVINE_INTERVENTION://Божественное вмешательство
+      {
+        //amount = 3;
+        if ( pPlayer->uNumDivineInterventionCastsThisDay >= 3 )
+        {
+          ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
+          pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
+          pCastSpell->uSpellID = 0;
+          continue;
+        }
+        if ( !pPlayer->CanCastSpell(uRequiredMana) )
+          break;
+        for ( uint pl_id = 0; pl_id < 4; pl_id++ )
+        {
+          for ( uint buff_id = 0; buff_id <= 19; buff_id++ )
+            pParty->pPlayers[pl_id].pConditions[buff_id] = 0;
+          pParty->pPlayers[pl_id].sHealth = pParty->pPlayers[pl_id].GetMaxHealth();
+          pParty->pPlayers[pl_id].sMana = pParty->pPlayers[pl_id].GetMaxMana();
+          pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pl_id);
+        }
+        if ( pPlayer->sAgeModifier + 10 >= 120 )
+          pPlayer->sAgeModifier = 120;
+        else
+          pPlayer->sAgeModifier = pPlayer->sAgeModifier + 10;
+        sRecoveryTime += -5 * spell_level;
+        ++pPlayer->uNumDivineInterventionCastsThisDay;
+        LODWORD(v727) = 1;
+        break;
+      }
+      case SPELL_DARK_REANIMATE: //Реанимация
+      {
+        switch (skill_level)
+        {
+          case 1: amount = 2 * spell_level; break;
+          case 2: amount = 3 * spell_level; break;
+          case 3: amount = 4 * spell_level; break;
+          case 4: amount = 5 * spell_level; break;
+          default:
+            assert(false);
+        }
+        if ( !pPlayer->CanCastSpell(uRequiredMana) )
+          break;
+        if (!pCastSpell->spell_target_pid)
+        {
+          pGame->GetStru6()->SetPlayerBuffAnim(pCastSpell->uSpellID, pCastSpell->uPlayerID_2);
+          if ( pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Dead] )
+          {
+            pParty->pPlayers[pCastSpell->uPlayerID_2].SetCondition(Condition_Zombie, 1);
+            ReloadPlayerPortraits(pCastSpell->uPlayerID_2, (pParty->pPlayers[pCastSpell->uPlayerID_2].GetSexByVoice() != 0) + 23);
+            pParty->pPlayers[pCastSpell->uPlayerID_2].pConditions[Condition_Zombie] = pParty->uTimePlayed;
+          }
+          break;
+        }
+        mon_id = PID_ID(pCastSpell->spell_target_pid);
+        if ( mon_id == -1 )
+        {
+          ShowStatusBarString(pGlobalTXT_LocalizationStrings[496], 2);  // No valid target exists!
+          pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
+          pCastSpell->uSpellID = 0;
+          continue;
+        }
+        if ( pActors[mon_id].sCurrentHP > 0 
+         ||  pActors[mon_id].uAIState != Dead && pActors[mon_id].uAIState != Dying )
+        {
+          ShowStatusBarString(pGlobalTXT_LocalizationStrings[428], 2); // Spell failed
+          pAudioPlayer->PlaySound(SOUND_PlayerCantCastSpell, 0, 0, -1, 0, 0, 0, 0);
+          pCastSpell->uSpellID = 0;
+          continue;
+        }
+        ++pSpellSprite.uType;
+        pSpellSprite.stru_24.Reset();
+        pSpellSprite.spell_id = pCastSpell->uSpellID;
+        pSpellSprite.spell_level = spell_level;
+        pSpellSprite.spell_skill = skill_level;
+        pSpellSprite.uObjectDescID = pObjectList->ObjectIDByItemID(pSpellSprite.uType);
+        pSpellSprite.uAttributes = 0;
+        pSpellSprite.uSectorID = 0;
+        pSpellSprite.uSpriteFrameID = 0;
+        pSpellSprite.field_60_distance_related_prolly_lod = 0;
+        pSpellSprite.uFacing = 0;
+        pSpellSprite.spell_caster_pid = PID(OBJECT_Player, pCastSpell->uPlayerID);
+        pSpellSprite.uSoundID = LOWORD(pCastSpell->sound_id);
+        pSpellSprite.vPosition.x = pActors[mon_id].vPosition.x;
+        pSpellSprite.vPosition.y = pActors[mon_id].vPosition.y;
+        pSpellSprite.vPosition.z = pActors[mon_id].vPosition.z -
+                                (unsigned int)(signed __int64)((double)pActors[mon_id].uActorHeight * -0.8);
+        pSpellSprite.spell_target_pid = PID(OBJECT_Actor, mon_id);
+        pSpellSprite.Create(0, 0, 0, 0);
+        if ( pActors[mon_id].pMonsterInfo.uLevel > amount )
+          break;
+        Actor::Resurrect(mon_id);
+        pActors[mon_id].pMonsterInfo.uHostilityType = (MonsterInfo::HostilityRadius)0;
+        pActors[mon_id].pMonsterInfo.uTreasureDropChance = 0;
+        pActors[mon_id].pMonsterInfo.uTreasureDiceRolls = 0;
+        pActors[mon_id].pMonsterInfo.uTreasureDiceSides = 0;
+        pActors[mon_id].pMonsterInfo.uTreasureLevel = 0;
+        pActors[mon_id].pMonsterInfo.uTreasureType = 0;
+        pActors[mon_id].uAlly = 9999;
+        pActors[mon_id].uAttributes &= 0xF70000;
+        pActors[mon_id].uGroup = 0;
+        pActors[mon_id].pActorBuffs[ACTOR_BUFF_BERSERK].Reset();
+        pActors[mon_id].pActorBuffs[ACTOR_BUFF_CHARM].Reset();
+        pActors[mon_id].pActorBuffs[ACTOR_BUFF_ENSLAVED].Reset();
+        if ( pActors[mon_id].sCurrentHP > 10 * amount )
+          pActors[mon_id].sCurrentHP = 10 * amount;
+        LODWORD(v727) = 1;
+        break;
+      }
+      case SPELL_DARK_VAMPIRIC_WEAPON:// Оружие-вампир
+      {
+        amount = 16;
+        if ( skill_level == 4 )
 			{
 				LODWORD(v733) = 0;
 			}
--- a/stru6.cpp	Tue Jan 28 17:25:58 2014 +0600
+++ b/stru6.cpp	Tue Jan 28 22:41:49 2014 +0600
@@ -1422,7 +1422,7 @@
 }
 
 //----- (004A8BFC) --------------------------------------------------------
-int stru6::_4A8BFC()
+int stru6::_4A8BFC() //for SPELL_LIGHT_PRISMATIC_LIGHT
 {
   uAnimLength = 8 * pSpriteFrameTable->pSpriteSFrames[pSpriteFrameTable->FastFindSprite("spell84")].uAnimLength;
   return uAnimLength;