Witam,
Chciałem sobie stworzyć czar z zupełnie nowym efektem, tzn czasowym zwiększeniem pancerza. Powiem więcej, udało mi się 

 Czar zrobiłem na podstawie czaru leczenia, z wykorzystaniem LeGo, ale to w zasadzie bez znaczenia. Chodzi o to, że o ile mi wiadomo, normalnie nowy czar robi się tworząc nowy plik Spell_MojCzar.d w folderze Spells (oczywiście pomijam tu inne kwestie typu stworzenie runy, dodanie czaru do pliku Text.d , Spell_ProcessMana.d, itp.) W moim przypadku jednak czar wtedy w ogóle nie działa, tzn nie mam żadnego błędu podczas włączania gry, ale w grze, gdy przywołam runę i użyję czaru, to odgrywa się animacja, jednak czar nie zabiera mi many i nie ma żadnego efektu. 
Problem obszedłem w ten sposób, że zamiast tworzyć nowy plik z czarem, dodałem czar do pliku Spell_Heal_Alle.d. Tam wygląda to w ten sposób, że jest jakby jedna instancja czaru leczenia dla wszystkich zaklęć, a pod nią są funkcje dla poszczególnych czarów leczenia, np lekkiego, średniego, itd. Gdy dodam mój czar (który ma de facto inne działanie - czasowo zwiększa odporność na obrażenia) jako funkcję tego głównego czaru leczenia, wtedy wszystko działa. Jednak gdy tworzę go jako oddzielny czar, czy to w nowym pliku, czy nawet w Spell_Heal_Alle, to wtedy jest tak, jak mówiłem - nie ma efektu w grze. 
Tak wygląda skrypt mojego czaru w pliku Spell_Heal_Alle. Mój czar jest w ostatnim "ifie".
Spoiler
func void Spell_Cast_Heal()
{
	if ( Npc_GetActiveSpell(self) == SPL_LightHeal		)	
	{	
		if (Npc_GetActiveSpellIsScroll(self))
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
		}
		else
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_LightHeal;
		};
		Npc_ChangeAttribute	(self,ATR_HITPOINTS, +SPL_Heal_LightHeal);
		return;
	};
	
	if ( Npc_GetActiveSpell(self) == SPL_MediumHeal		)	
	{	
		if (Npc_GetActiveSpellIsScroll(self))
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
		}
		else
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_MediumHeal;		
		};
		Npc_ChangeAttribute	(self,ATR_HITPOINTS, +SPL_Heal_MediumHeal);
		return;
	};
	
	if ( Npc_GetActiveSpell(self) == SPL_FullHeal		)	
	{	
		if (Npc_GetActiveSpellIsScroll(self))
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
		}
		else
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_FullHeal;
		};
		Npc_ChangeAttribute	(self,ATR_HITPOINTS, + SPL_Heal_FullHeal);
		return;
	};
	
	if ( Npc_GetActiveSpell(self) == SPL_ImproveArmour		)	
	{	
		if (Npc_GetActiveSpellIsScroll(self))
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
		}
		else
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_ImproveArmour;		
		};
		B_RaiseProtection	(self, PROT_BLUNT, SPL_Improve_ImproveArmour);
		MyTimerApply();
		return;
	};
	
	self.aivar[AIV_SelectSpell] += 1;
};
Tutaj z kolei jest mój czar jako nowy plik, czyli to co nie działa (oczywiście gdy próbuje używać tego pliku, to Spell_Heal_Alle przywracam do oryginalnej wersji):
Spoiler
// ****************
// Alle Improve Spells
// ****************
const int SPL_Cost_ImproveArmour	= 5;
const int SPL_Improve_ImproveArmour	= 8;
const int time = 0;
const int stop = 0;
INSTANCE Spell_ImproveArmour (C_Spell_Proto)
{
	time_per_mana			= 0;
	spelltype 				= SPELL_NEUTRAL;
	targetCollectAlgo		= TARGET_COLLECT_CASTER;
	canTurnDuringInvest		= 0;
};
func void MyTimer()//Funkcja timera
{
 	time = time + 1;//stała czasu równa się stała czasu dodać 1 i tak co sekundę
  	print(IntToString(time));// to tylko taki print, do niczego nie potrzebny, do testów ale zostawiam go tak w razie "W"
			if(time == 5)// tu zaś znaczy że jeśli upłynie 5 sekund 
			{
				print("Powinno być prot + 5");
				B_RaiseProtection	(hero, PROT_BLUNT, 5);
				time = 0;
			};
};
func void MyTimerApply()//funkcja dzięki której wywołamy cały ten timer.
{
	FF_ApplyOnceExt (MyTimer, 1000, 5);//FF_AppluOnceExt(funkcja którą chcesz wywołać, co ile ma się wywołać w tym przypadku co jedną sekundę, no i ile razy ma się wywołać zawsze daj tyle ile dajesz w if time
};
// ------ SPL_ImproveArmour -------
func int Spell_Logic_ImproveArmour (var int manaInvested)
{	
	if (Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))
	{
		return SPL_SENDCAST;
	}
	else if (self.attribute[ATR_MANA] >= SPL_Cost_ImproveArmour)
	{	
		return SPL_SENDCAST;
	}
	else //nicht genug Mana
	{
		return SPL_SENDSTOP;
	};
};
func void Spell_Cast_ImproveArmour()
{	
		if (Npc_GetActiveSpellIsScroll(self))
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_Scroll;
		}
		else
		{
			self.attribute[ATR_MANA] = self.attribute[ATR_MANA] - SPL_Cost_ImproveArmour;		
		};
		B_RaiseProtection	(self, PROT_BLUNT, SPL_Improve_ImproveArmour);
		MyTimerApply();
		return;
	
	self.aivar[AIV_SelectSpell] += 1;
};
Aha, ta funkcja timera jest na razie testowa, nie jest więc dopracowana i nie ma dokładnie takiego efektu, jak mam w planach, ale to nieistotne ;)
Teoretycznie nie jest to jakiś ogromny problem, bo ostatecznie wszystko w grze działa, jednak mam zamiar dodawać inne czary i po prostu będę miał straszny bałagan w plikach, jeśli wszystko będę musiał dodawać do już istniejących, zamiast tworzyć nowe pliki z konkretnymi czarami. Poza tym jestem po prostu bardzo ciekaw, co robię źle 
