|
Re: Уроки скриптологии
// ************************************* // Обработчик состояния заклинания Рой // *************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Функция реакции на локальное восприятие магии func void B_RestartSwarm() { * *// если последнее примененное заклинание Рой * *if(Npc_GetLastHitSpellID(self) == SPL_Swarm) * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * *}; };
// Закончить действие заклинания func void B_StopSwarm() { * * *// возвратить общую функцию состояния реакции на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если жертва человек * *if (self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// реакция НПС на повреждение * * * *B_AssessDamage(); * *} * *else * *{ * * * *// установить временно враждебное отношение НПС к ГГ * * * *Npc_SetTempAttitude(self,ATT_HOSTILE); * *}; };
// Инициализация состояния func void ZS_Swarm() { * *// установить локальное восприятие на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSwa rm); * *// остановить проигрывание файла анимации заклинания * *Npc_StopAni(self,"S_SWARM_VICTIM"); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если состояние тела НПС не прерываемо * *if(!C_BodyStateContains(self,BS_UNCONSCIOUS)) * *{ * * * *// анимация перехода в бессознательное состояние * * * *AI_PlayAniBS(self,"T_STAND_2_SWARM_VICTIM",BS_UNC ONSCIOUS); * *}; * *// сброс времени цикла * *self.aivar[AIV_SwarmStateTime] = 0; };
// Функция цикла состояния func int ZS_Swarm_Loop () { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_TIME_Swarm) * *{ * * * *// остановить действие заклинания * * * *B_StopSwarm(); * * * *return LOOP_END; * *}; * *// если прошла 1 сек * *if(Npc_GetStateTime(self) != self.aivar[AIV_SwarmStateTime]) * *{ * * * *// если жертва находится в состоянии 2 сек * * * *if(Npc_GetStateTime(self) == 2) * * * *{ * * * * * * *// жертва говорит агрессору (SVM фраза) "Ах, черт!" * * * * * *B_Say(self,other,"$RunAway"); * * * *} * * * *// через 6 сек * * * *else if(Npc_GetStateTime(self) == 6) * * * *{ * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!" * * * * * *B_Say(self,other,"$Aargh_2"); * * * *} * * * *// через 7 сек * * * *else if(Npc_GetStateTime(self) == 7) * * * *{ * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!" * * * * * *B_Say (self,other,"$Aargh_3"); * * * *} * * * *// через 8 сек * * * *else if(Npc_GetStateTime(self) == 8 ) * * * *{ * * * * * *// жертва говорит агрессору (SVM фраза) "Ууух!" * * * * * *B_Say(self,other,"$Aargh_1"); * * * *}; * * * *// установить счетчик цикла на текущее время * * * *self.aivar[AIV_SwarmStateTime] = Npc_GetStateTime(self); * * * *// если жизнь жертвы > ущерба от заклинания * * * *if(self.attribute[ATR_HITPOINTS] > SPL_Swarm_DAMAGE) * * * *{ * * * * * *// нанести жертве урон * * * * * *B_MagicHurtNpc(other,self,SPL_Swarm_DAMAGE); * * * *} * * * *else * * * *{ * * * * * *// убить жертву * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Swarm_End() { };
... ещё файл
// ****************************************** // Обработчик состояния заклинания Смерч // ******************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Функция реакции на локальное восприятие магии func void B_RestartWhirlwind() { * *// если последнее примененное заклинание Смерч * *if(Npc_GetLastHitSpellID(self) == SPL_Whirlwind) * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * *}; };
// Закончить действие заклинания func void B_StopWhirlwind() { * * *// возвратить общую функцию состояния реакции на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// реакция НПС на повреждение * * * *B_AssessDamage(); * *} * *else * *{ * * * *// установить временно враждебное отношение НПС к ГГ * * * *Npc_SetTempAttitude(self,ATT_HOSTILE); * *}; };
// Инициализация состояния func void ZS_Whirlwind() { * *// установить локальное восприятие на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartWhi rlwind); * *// остановить проигрывание файла анимации заклинания * *Npc_StopAni(self,"S_WHIRLWIND_VICTIM"); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если состояние тела НПС не прерываемо * *if(!C_BodyStateContains(self, BS_UNCONSCIOUS)) * *{ * * * *// анимация перехода в бессознательное состояние * * * *AI_PlayAniBS(self,"T_STAND_2_WHIRLWIND_VICTIM",BS _UNCONSCIOUS); * *}; * *// сброс счетчика цикла * *self.aivar[AIV_WhirlwindStateTime] = 0; };
// Функция цикла состояния func int ZS_Whirlwind_Loop () { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_TIME_WHIRLWIND) * *{ * * * *// остановить действие заклинания * * * *B_StopWhirlwind(); * * * *return LOOP_END; * *}; * *// если прошла 1 сек * *if(Npc_GetStateTime(self) != self.aivar[AIV_WhirlwindStateTime]) * *{ * * * *// установить счетчик цикла на текущее время * * * *self.aivar[AIV_WhirlwindStateTime] = Npc_GetStateTime(self); * * * *// если жизнь жертвы > ущерба от заклинания * * * *if(self.attribute[ATR_HITPOINTS] > SPL_Whirlwind_DAMAGE) * * * *{ * * * * * *// нанести жертве урон * * * * * *B_MagicHurtNpc(other,self,SPL_Whirlwind_DAMAGE); * * * *} * * * *else * * * *{ * * * * * *// убить жертву * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Whirlwind_End() { };
... ещё файл
// ************************************************** ********* // Обработчик состояния Удар молнии // ----------------------------------------------------------- // В это состояние НПС переводится экзешником, а не скриптами // ************************************************** *********
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Закончить действие заклинания func void B_StopZapped() { * * *// возвратить общую функцию состояния реакции на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// реакция НПС на повреждение * * * *B_AssessDamage(); * * * *// продолжить распорядок дня НПС (т.к. не было принудительного перевода НПС в это состояние из скриптов и завершение этого состояния выполняется не из цикла состояния) * * * *AI_ContinueRoutine(self); * *} * *else * *{ * * * *// установить временно враждебное отношение НПС к ГГ * * * *Npc_SetTempAttitude(self,ATT_HOSTILE); * * * *// продолжить распорядок дня НПС * * * *AI_ContinueRoutine(self); * *}; };
// Инициализация состояния func void ZS_Zapped() { * *// установить восприятие прекращения действия магии * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopZa pped); * *// если состояние тела НПС не прерываемо * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE)) * *{ * * * *// НПС встает * * * *AI_StandUp(self); * *} * *else * *{ * * * *// НПС быстро встает * * * *AI_StandUpQuick(self); * *}; * *// если жертва человек * *if(self.guild < GIL_SEPERATOR_HUM) * *{ * * * *// включить анимацию действия заклинания * * * *AI_PlayAni(self,"T_STAND_2_LIGHTNING_VICTIM"); * *}; * };
// Функция цикла состояния func int ZS_Zapped_Loop() { * * *// если прошла 1 секунда * *if(Npc_GetStateTime(self) >= 1) * *{ * * * *// сбросить время состояния * * * *Npc_SetStateTime(self,0); * * * *// нанести жертве секундный урон * * * *B_MagicHurtNpc(other,self,SPL_ZAPPED_DAMAGE_PER_S EC); * * * *// если жизнь жертвы кончилась * * * *if(self.attribute[ATR_HITPOINTS] <= 0) * * * *{ * * * * * *// очистить очередь AI состояний НПС * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// НПС встает * * * * * *AI_StandUp(self); * * * * * *return LOOP_END; * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Zapped_End() { };
|