|
Re: Уроки скриптологии
Прочие заклинания.
// **************** // Заклинание Сон // **************** // self - кастующий НПС // other - НПС цель
const int SPL_Cost_Sleep * *= 30; * // стоимость маны * const int SPL_TIME_Sleep * *= 30; * // время сна в сек
// Инициализация заклинания instance Spell_Sleep(C_Spell_Proto) { * *time_per_mana * * * * * = 0; * *spelltype * * * * * * * = SPELL_NEUTRAL; * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS; };
// Функция инвестирования маны func int Spell_Logic_Sleep(var int manaInvested) { * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны * *if((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))) * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Sleep) * *{ * * * *// если свиток * * * *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_Sleep; * * * *}; * * * *// если цель не плывет и не ныряет и не обездвижена и * * * *if (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) && (!C_NpcIsDown(other)) * * * *&& (other.guild < GIL_SEPERATOR_HUM) * * * *// человек * * * *&& (other.flags != NPC_FLAG_IMMORTAL) * * * // и уязвима * * * *&& (Npc_GetDistToNpc(self,other) <= 1000) * // и расстояние между кастующим и целью < 10м * * * *&& (other.guild != GIL_KDF) * * * * * * * * // и цель не Маг огня * * * *&& (other.guild != GIL_DMT) * * * * * * * * // и не Черный маг * * * *&& (other.guild != GIL_PAL) * * * * * * * * // и не Паладин * * * *{ * * * * * *// очистить очередь AI состояний цели * * * * * *Npc_ClearAIQueue(other); * * * * * *// очистить восприятия цели * * * * * *B_ClearPerceptions(other); * * * * * *// перевести цель в состояние Магического сна * * * * * *AI_StartState(other,ZS_MagicSleep,0,""); * * * *}; * * * *return SPL_SENDCAST; * *} * *else * *{ * * * *return SPL_SENDSTOP; * *}; };
// Вызов заклинания func void Spell_Cast_Sleep() { * *// изменить случайное число выбора заклинаний * *self.aivar[AIV_SelectSpell] += 1; };
...ещё файл
// ***************************** // Заклинание Уменьшить монстра // *****************************
const int SPL_Cost_Shrink * = 300; // стоимость маны
// Инициализация заклинания INSTANCE Spell_Shrink(C_Spell_Proto) { * *time_per_mana * * * * * = 0; * *spelltype * * * * * * * = SPELL_NEUTRAL; * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS; * *targetCollectRange * * *= 1000; };
// Функция инвестирования маны (аналогична ранее рассмотренным) func int Spell_Logic_Shrink(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_Shrink) * *{ * * * *return SPL_SENDCAST; * *} * *else * *{ * * * *return SPL_SENDSTOP; * *}; };
// Вызов заклинания func void Spell_Cast_Shrink() { * *// если свиток * *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_Shrink; * *}; * *// если цель уязвима и не обездвижена и монстр и не уменьшена * *if(other.flags != NPC_FLAG_IMMORTAL) && (!C_NpcIsUndead(other)) && (other.guild > GIL_SEPERATOR_HUM) && (other.aivar[AIV_MM_ShrinkState] == 0) * *{ * * * *// очистить очередь AI состояний цели * * * *Npc_ClearAIQueue(other); * * * *// очистить восприятия цели * * * *B_ClearPerceptions(other); * * * *// перевести цель в состояние уменьшения * * * *AI_StartState(other,ZS_MagicShrink,0,""); * *}; * *// изменить случайное число выбора заклинаний * *self.aivar[AIV_SelectSpell] += 1; };
...ещё файл
// ******************* // Заклинание Раздуть // *******************
const int SPL_Cost_Inflate * * *= 10; * // стоимость маны const int SPL_Inflate_Damage * *= 5; * *// ущерб от заклинания const int SPL_TIME_Inflate * * *= 19; * // время действия 19 сек
// Инициализация заклинания instance Spell_Inflate(C_Spell_Proto) { * *time_per_mana * * * * * = 0; * *targetCollectAlgo * * * = TARGET_COLLECT_FOCUS; };
// Функция инвестирования маны func int Spell_Logic_Inflate(var int manaInvested) { * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны * *if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))) * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Inflate) * *{ * * * *// если свиток * * * *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_Inflate; * * * *}; * * * *// если цель не плывет и не ныряет и не обездвижена и * * * *if(!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE)) && (!C_NpcIsDown(other)) * * * *&& (other.guild < GIL_SEPERATOR_HUM) * * * *// человек * * * *&& (other.flags != NPC_FLAG_IMMORTAL) * * * // и уязвима * * * *&& (Npc_GetDistToNpc(self,other) <= 1000) * // и расстояние между кастующим и целью < 10м * * * *&& (other.guild != GIL_KDF) * * * * * * * * // и цель не Маг огня * * * *&& (other.guild != GIL_DMT) * * * * * * * * // и не Черный маг * * * *&& (other.guild != GIL_PAL) * * * * * * * * // и не Паладин * * * *{ * * * * * *// очистить очередь AI состояний цели * * * * * *Npc_ClearAIQueue(other); * * * * * *// очистить восприятия цели * * * * * *B_ClearPerceptions(other); * * * * * *// перевести цель в состояние Раздутия * * * * * *AI_StartState(other,ZS_Inflate,0,""); * * * *}; * * * *return SPL_SENDCAST; * *} * *else * *{ * * * *return SPL_SENDSTOP; * *}; };
// Вызов заклинания func void Spell_Cast_Inflate() { * *// изменить случайное число выбора заклинаний * *self.aivar[AIV_SelectSpell] += 1; };
...ещё файл
// ****************** // Заклинание Страх // ******************
const int SPL_Cost_Fear * * = 50; * // стоимость маны const int SPL_TIME_Fear * * = 5; * *// время действия 5 сек
// Инициализация заклинания INSTANCE Spell_Fear(C_Spell_Proto) { * *time_per_mana * * * * * = 0; * *damage_per_level * * * *= 0; * *targetCollectAlgo * * * = TARGET_COLLECT_NONE; };
// Функция инвестирования маны (аналогична рассмотренным) func int Spell_Logic_Fear(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_Fear) * *{ * * * * *return SPL_SENDCAST; * *} * *else * *{ * * * *return SPL_SENDSTOP; * *}; };
// Вызов заклинания func void Spell_Cast_Fear() { * *// если цель не Дракон * *if(other.guild != GIL_DRAGON) * *{ * * * *// перевести всех НПС, находящихся на расстоянии 10м от кастующего, в состояние страха * * * *AI_SetNpcsToState(self,ZS_MagicFlee,1000); * *}; * *// израсходовать ману (аналогично рассмотренным заклинаниям) * *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_Fear; * *}; * *self.aivar[AIV_SelectSpell] += 1; };
...ещё файл
// ****************** // Заклинание Забыть // ******************
const int SPL_Cost_Charm * * * *= 50; * // стоимость маны const int SPL_Damage_Charm * * *= 0; * *// причиняемый ущерб
// Инициализация заклинания INSTANCE Spell_Charm(C_Spell_Proto) { * *time_per_mana * * * * * = 0; * *spelltype * * * * * * * = SPELL_NEUTRAL; * *damage_per_level * * * *= SPL_Damage_Charm; * *damageType * * * * * * *= DAM_MAGIC; };
// Функция инвестирования маны func int Spell_Logic_Charm(var int manaInvested) { * *// если заклинание свиток и маны достаточно для свитка или маны достаточно для руны * *if ((Npc_GetActiveSpellIsScroll(self) && (self.attribute[ATR_MANA] >= SPL_Cost_Scroll))) * *¦¦ (self.attribute[ATR_MANA] >= SPL_Cost_Charm) * *{ * * * *// если НПС цель видел криминал ГГ и квест Игназа в стадии выполнения * * * *if(other.aivar[AIV_NpcSawPlayerCommit] != CRIME_NONE) && (MIS_Ignaz_Charm == LOG_RUNNING) * * * *{ * * * * * *// тест заклинания проведен * * * * * *Charm_Test = TRUE; * * * *}; * * * *// удалить криминал ГГ для соответствующей локации * * * *B_DeletePetzCrime(other); * * * *// очистить что цель видела криминал * * * *other.aivar[AIV_NpcSawPlayerCommit] = CRIME_NONE; * * * *// последнего сражения с ГГ не было * * * *other.aivar[AIV_LastFightAgainstPlayer] = FIGHT_NONE; * * * *// если гильдии цели и кастующего не враги * * * *if(Wld_GetGuildAttitude(other.guild,self.guild) != ATT_HOSTILE) * * * *{ * * * * * * *// если отношение цели и кастующего враждебно * * * * * *if(Npc_GetAttitude(other,self) == ATT_HOSTILE) * * * * * *{ * * * * * * * *// установить отношение цели к кастующему равное отношению их гильдий * * * * * * * *Npc_SetTempAttitude(other,Wld_GetGuildAttitude(ot her.guild,self.guild));
* * * * * *}; * * * *}; * * * *return SPL_SENDCAST; * *} * *else * *{ * * * *return SPL_SENDSTOP; * *}; };
// Вызов заклинания (идентичен ранее рассмотренным) func void Spell_Cast_Charm() { * *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_Charm; * *}; * *self.aivar[AIV_SelectSpell] += 1; };
|