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
