Показать сообщение отдельно
Старый 14.04.2005, 10:00   #143
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию 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;
};

Ответить с цитированием