|
Re: Уроки скриптологии
// ************************************** // Обработчик состояния Магический сон // **************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Локальное восприятие повреждения (окончание действия заклинания) func int B_StopMagicSleep() { * *// запретить восприятие повреждений * *Npc_PercDisable(self,PERC_ASSESSDAMAGE); * *// жертва говорит агрессору (SVM фраза) "(сам с собою, просыпаясь) Что это было!?" (Примечание: Ошибка слово $WHATWASSTHAT надо заменить на $WHATWASTHAT, а то фраза не будет сказана) * *B_Say_Overlay(self,other,"$WHATWASSTHAT"); * *// анимация перехода в нормальное состояние * *AI_PlayAni(self,"T_VICTIM_SLE_2_STAND"); }; * * *
// Локальное восприятие разговора func void B_AssessMagicSleepTalk() { * *// жертва говорит агрессору (SVM фраза) "(просыпаясь) Черт, что случилось?" * *B_Say(self,other,"$YOUDISTURBEDMYSLUMBER"); * *// жертва переходит в состояние наблюдения за ГГ * *AI_StartState(self,ZS_ObservePlayer,1,""); };
// Инициализация состояния func void ZS_MagicSleep() { * *// установить локальное восприятие повреждения * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_StopMagic Sleep); * *// разрешить восприятие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// установить локальное восприятие разговора * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessMagic SleepTalk); * *// Сбросить статус предупреждений охраной * *self.aivar[AIV_Guardpassage_Status] = GP_NONE; * *// сбросить счетчик отказа от диалога * *Npc_SetRefuseTalk(self,0); * *// установить временное отношение между жертвой и ГГ равное постоянному * *Npc_SetTempAttitude(self,Npc_GetPermAttitude(self ,hero)); * *// НПС и ГГ перестают смотреть друг на друга * *B_StopLookAt(self); * *// НПС прекращает на что-либо указывать * *AI_StopPointAt(self); * *// если состояние тела НПС не прерываемо * *if(!Npc_HasBodyFlag(self,BS_FLAG_INTERRUPTABLE)) * *{ * * * *// НПС встает * * * *AI_StandUp(self); * *} * *else * *{ * * * *// НПС быстро встает * * * *AI_StandUpQuick(self); * *}; * *// проигрывается анимация перехода в Магический сон * *AI_PlayAniBS(self,"T_STAND_2_VICTIM_SLE",BS_LIE ); };
// Функция цикла состояния func int ZS_MagicSleep_Loop() { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_Time_Sleep) * *{ * * * *// очистить очередь AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// закончить действие обработчика * * * *B_StopMagicSleep(); * * * *return LOOP_END; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_MagicSleep_End() { };
... ещё файл
// ************************************************** ********* // Обработчик состояния Большой огненной бури // ----------------------------------------------------------- // В это состояние НПС переводится экзешником, а не скриптами // ************************************************** *********
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Закончить действие заклинания func void B_StopPyro() { * * *// возвратить общую функцию состояния реакции на магию * *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_Pyro() { * *// установить восприятие прекращения действия магии * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopPy ro); * *// если состояние тела НПС не прерываемо * *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_Pyro_Loop() { * * *// если прошла 1 секунда * *if(Npc_GetStateTime(self) >= 1) * *{ * * * *// сбросить время состояния * * * *Npc_SetStateTime(self,0); * * * *// нанести жертве секундный урон * * * *B_MagicHurtNpc(other,self,SPL_PYRO_DAMAGE_PER_SEC ); * * * *// если жизнь жертвы кончилась * * * *if(self.attribute[ATR_HITPOINTS] <= 0) * * * *{ * * * * * *// очистить очередь AI состояний НПС * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// НПС встает * * * * * *AI_StandUp(self); * * * * * *return LOOP_END; * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Pyro_End() { };
... ещё файл
// ************************************************ // Обработчик состояния реакции на Шаровую молнию // ************************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
// Закончить действие заклинания func void B_StopShortZapped() { * * *// возвратить общую функцию состояния реакции на магию * *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_ShortZapped() { * *// установить восприятие прекращения действия магии * *Npc_PercEnable(self,PERC_ASSESSSTOPMAGIC,B_StopSh ortZapped); * *// если состояние тела НПС не прерываемо * *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_ShortZapped_Loop() { * * *// если время в состоянии > времени действия заклинания * *if(Npc_GetStateTime(self) > SPL_TIME_SHORTZAPPED) * * *{ * * * *// закончить действие обработчика * * * *B_StopShortZapped(); * * * *return LOOP_END; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_ShortZapped_End() { };
... ещё файл
// ************************************* // Обработчик состояния Украсть энергию // *************************************
// ---------------------------------------------------- // self - жертва заклинания // other - кастующий НПС (агрессор) // ----------------------------------------------------
var int Temp_SuckEnergy_DistToPlayer; * // расстояние между жертвой и ГГ
// Функция реакции на локальное восприятие магии (заклинания) func void B_RestartSuckEnergy() { * *// если последнее примененное заклинание Украсть энергию * *if(Npc_GetLastHitSpellID(self) == SPL_SuckEnergy) * *{ * * * *// сбросить время нахождения НПС в этом состоянии * * * *Npc_SetStateTime(self,0); * * * *// анимация состояния * * * *AI_PlayAni(self,"T_STAND_2_SUCKENERGY_VICTIM"); * *}; };
// Закончить действие заклинания func void B_StopSuckEnergy() { * * *// возвратить общую функцию состояния реакции на магию * *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_SuckEnergy() { * *// установить локальное восприятие на магию * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_RestartSuc kEnergy); * *// остановить проигрывание файла анимации заклинания * *Npc_StopAni(self, "S_SUCKENERGY_VICTIM"); * * *// очистить очередь AI состояний НПС * *Npc_ClearAIQueue(self); * *// НПС встает * *AI_StandUp(self); * *// сброс времени цикла * *self.aivar[AIV_SuckEnergyStateTime] = 1; * *// запомнить расстояние между жертвой и ГГ * *Temp_SuckEnergy_DistToPlayer = Npc_GetDistToPlayer(self); };
// Функция цикла состояния func int ZS_SuckEnergy_Loop() { * * *// если время в состоянии > времени действия заклинания или расстояние между ГГ и жертвой увеличилось на более 10м * *if(Npc_GetStateTime(self) > SPL_TIME_SuckEnergy) ¦¦ (Temp_SuckEnergy_DistToPlayer >= Npc_GetDistToPlayer(self) + 100) * *{ * * * *// остановить действие заклинания * * * *B_StopSuckEnergy(); * * * *return LOOP_END; * *}; * *// если текущее время состояния не равно времени цикла * *if(Npc_GetStateTime(self) != self.aivar[AIV_SuckEnergyStateTime]) * *{ * * * *// если первая фаза состояния * * * *if(Npc_GetStateTime(self) == 0) * * * * *{ * * * * * *// если состояние тела НПС не прерываемо * * * * * *if(!C_BodyStateContains(self, BS_UNCONSCIOUS)) * * * * * *{ * * * * * * * *// анимация перехода в бессознательное состояние * * * * * * * *AI_PlayAniBS(self,"T_STAND_2_SUCKENERGY_VICTIM",B S_UNCONSCIOUS); * * * * * *}; * * * * * *// эффект высасывания энергии * * * * * *Wld_PlayEffect("spellFX_SuckEnergy_BloodFly",self ,hero,0,0,0,FAL SE); * * * *}; * * * *// обновить время цикла * * * *self.aivar[AIV_SuckEnergyStateTime] = Npc_GetStateTime(self); * * * *// если жизнь жертвы > ущерба от заклинания * * * *if(self.attribute[ATR_HITPOINTS] > SPL_SuckEnergy_DAMAGE) * * * *{ * * * * * *// нанести жертве урон * * * * * *B_MagicHurtNpc(other,self,SPL_SuckEnergy_DAMAGE); * * * * * *// добавить украденную жизнь агрессору * * * * * *Npc_ChangeAttribute(other,ATR_HITPOINTS,SPL_SuckE nergy_DAMAGE); * * * *} * * * *else * * * *{ * * * * * *// убить жертву * * * * * *B_MagicHurtNpc(other,self,self.attribute[ATR_HITPOINTS] - 1); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_SuckEnergy_End() { };
|