- Регистрация
- 26 Мар 2004
- Сообщения
- 2.003
- Благодарности
- 971
- Баллы
- 295
- Первое сообщение
- #1
хотелось бы отразить возможность увеличения урона от заклинаний непосредственно в Spell_Logic.
возьмём в качестве примера Spell_Firebolt. у подобных заклинаний используется один уровень заклинания, но совершенного ничего не мешает увеличить кол-во уровней, уменьшив при этом урон за уровень.
переходим непосредственно к Spell_Logic
1. сделаем проверку на то есть ли мана на каст. если маны не хватает, то выходим. в моём примере проверка делается один раз при (manaInvested == 0)
2. в данном примере что бы заклинание наносило 25 ущерба надо использовать 5ый уровень заклинания. Этот уровень я задаю как "базовый", а далее начинаю начислять "бонусные" уровни. "Уровни" я записываю в аивер НПС. Подсчёт "уровней" я делаю на "старте" в Spell_Logic пока (manaInvested == 0).
код выше можно вынести в отдельную функцию что бы использовать в разных спелл_логик. в приведённом выше примере есть различные проверки по всему что пришло в голову. после каждой положительной проверки уровень заклинания "поднимался" всё выше и выше, то есть получался "бонус". а там где есть бонусы там могут быть и штрафы ;-) а значит эти условия можно сделать более проработанными и начислять как бонусы так и штрафы. При этом всё таки кол-во уровней должно быть осмысленное и не уходить в бесконечность. Например если "базовый" уровень 5, то максимально возможный лучшей сделать 10. Если уровней будет много(например 100), то каст заклинание может занять значительное время.
upd доп информация по проверкам в посте #2 Готика ½ - Spell_Logic - увеличения урона заклинаний
3. Переходим к непосредственному повышению уровня: определяем текущий уровень заклинания и если он ниже необходимого, то повышаем уровень.
4. обнуляем аивер и отнимает ману движком.
5. сам каст
в функции каста делается запись в аивер НПС AIV_SelectSpell. В оригинальных скриптах это делается для врагов, что бы они при необходимости могли поменять заклинание. Огненную стрелу использует только герой. тем не менее я на всякий случай оставляю данный счётчик. Ввиду того что ману я отнимаю движком, скриптовое отнимание маны убрано из Spell_Cast_***. Подробнее про то как и зачем отнимать ману движком я написал в посте #5 Готика ½ - Spell_Logic - увеличения урона заклинаний
возьмём в качестве примера Spell_Firebolt. у подобных заклинаний используется один уровень заклинания, но совершенного ничего не мешает увеличить кол-во уровней, уменьшив при этом урон за уровень.
Daedalus:
const int SPL_Cost_Firebolt = 5;
const int SPL_Damage_Firebolt = 5; // MDK 25
instance Spell_Firebolt (C_Spell_Proto)
{
time_per_mana = 0;
damage_per_level = SPL_Damage_Firebolt;
damageType = DAM_MAGIC;
};
Daedalus:
func int Spell_Logic_Firebolt (var int manaInvested)
{
var C_Item itm; // для будущих проверок
var C_NPC her; her = Hlp_GetNpc(PC_Hero); // ссылка на инстанцию героя
1. сделаем проверку на то есть ли мана на каст. если маны не хватает, то выходим. в моём примере проверка делается один раз при (manaInvested == 0)
Daedalus:
var int SPL_Cost_mana;
if (manaInvested == 0)
{
SPL_Cost_mana = SPL_Cost_Firebolt; // необходимо маны для руны
if (Npc_GetActiveSpellIsScroll(self)) { SPL_Cost_mana = SPL_Cost_Scroll; }; // необходимо маны для свитка
if (self.attribute[ATR_MANA] < SPL_Cost_mana) { return SPL_SENDSTOP; };
};
2. в данном примере что бы заклинание наносило 25 ущерба надо использовать 5ый уровень заклинания. Этот уровень я задаю как "базовый", а далее начинаю начислять "бонусные" уровни. "Уровни" я записываю в аивер НПС. Подсчёт "уровней" я делаю на "старте" в Spell_Logic пока (manaInvested == 0).
Daedalus:
if (manaInvested == 0)
{
self.aivar[AIV_SpellLevel] = 5;
//
// Бонусы
//
var C_NPC her; her = Hlp_GetNpc(PC_Hero);
if (self.guild == GIL_KDF)
{
self.aivar[AIV_SpellLevel] += 1;
if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
&& (heroGIL_KDF2 == TRUE)
{
self.aivar[AIV_SpellLevel] += 1;
};
};
var C_Item itm; itm = Npc_GetEquippedMeleeWeapon(self);
if (Hlp_IsItem(itm, ITMW_ADDON_STAB01) == TRUE)
{
self.aivar[AIV_SpellLevel] += 1;
}
else if (Hlp_IsItem(itm, ITMW_ADDON_STAB04) == TRUE)
{
self.aivar[AIV_SpellLevel] += 2;
};
if (Npc_HasEquippedArmor(self) == TRUE)
{
itm = Npc_GetEquippedArmor(self);
if (Hlp_IsItem(itm, ITAR_KDF_L) == TRUE)
{
self.aivar[AIV_SpellLevel] += 1;
}
else if (Hlp_IsItem(itm, ITAR_KDF_H) == TRUE)
{
self.aivar[AIV_SpellLevel] += 2;
};
if (KDF01_Equipped == TRUE)
&& (KDFArmor_Equipped == TRUE)
{
self.aivar[AIV_SpellLevel] += 1;
};
};
if (Hlp_GetInstanceID(self)==Hlp_GetInstanceID(her))
{
if (PLAYER_TALENT_RUNES [SPL_Firebolt] == true) { self.aivar[AIV_SpellLevel] += 1; };
if (PLAYER_TALENT_RUNES [SPL_InstantFireball] == true) { self.aivar[AIV_SpellLevel] += 1; };
if (PLAYER_TALENT_RUNES [SPL_Firestorm] == true) { self.aivar[AIV_SpellLevel] += 1; };
if (PLAYER_TALENT_RUNES [SPL_ChargeFireball] == true) { self.aivar[AIV_SpellLevel] += 1; };
if (PLAYER_TALENT_RUNES [SPL_Pyrokinesis] == true) { self.aivar[AIV_SpellLevel] += 1; };
if (PLAYER_TALENT_RUNES [SPL_Firerain] == true) { self.aivar[AIV_SpellLevel] += 1; };
};
};
upd доп информация по проверкам в посте #2 Готика ½ - Spell_Logic - увеличения урона заклинаний
3. Переходим к непосредственному повышению уровня: определяем текущий уровень заклинания и если он ниже необходимого, то повышаем уровень.
Daedalus:
var int SpellLevel; SpellLevel = Npc_GetActiveSpellLevel(self);
//Hlp_PrintConsole(Str_Format("Spell_Logic_Firebolt[%s %i] // manainvested =%i, Spell Lvl = %i", self.name, self.id,manaInvested, SpellLevel));
if (SpellLevel < self.aivar[AIV_SpellLevel])
{
return SPL_NEXTLEVEL;
};
4. обнуляем аивер и отнимает ману движком.
Daedalus:
if (self.aivar[AIV_SpellLevel] != 0)
{
self.aivar[AIV_SpellLevel] = 0;
return SPL_FORCEINVEST + Spl_Cost_Mana; // отнимает ману. устанавливаем новое значение manainvested.
};
5. сам каст
Daedalus:
return SPL_SENDCAST;
};
в функции каста делается запись в аивер НПС AIV_SelectSpell. В оригинальных скриптах это делается для врагов, что бы они при необходимости могли поменять заклинание. Огненную стрелу использует только герой. тем не менее я на всякий случай оставляю данный счётчик. Ввиду того что ману я отнимаю движком, скриптовое отнимание маны убрано из Spell_Cast_***. Подробнее про то как и зачем отнимать ману движком я написал в посте #5 Готика ½ - Spell_Logic - увеличения урона заклинаний
Daedalus:
func void Spell_Cast_Firebolt()
{
self.aivar[AIV_SelectSpell] += 1; // счётчик для НПС (не герой)
};
Вложения
Последнее редактирование модератором: