|
Re: Уроки скриптологии
// ************************************************** ********* // Обработчик состояния наблюдения за сражением // ----------------------------------------------------------- // self - НПС наблюдатель, other - агрессор, victim - жертва // ************************************************** *********
// Функция реакции НПС наблюдателя когда другой НПС получает повреждение func void B_CheerFight() { * *// если время нахождения наблюдателя в этом состоянии <= 2 сек * *if(Npc_GetStateTime(self) <= 2) * * * * * * * *{ * * * *return; * *}; * *// если агрессор монстр или жертва монстр * *if((other.guild > GIL_SEPERATOR_HUM) ¦¦ (victim.guild > GIL_SEPERATOR_HUM)) * *{ * * * *return; * *}; * *// сброс времени нахождения в состоянии * *Npc_SetStateTime(self,0); * *// если наблюдатель имеет дело с "крутым парнем" * *if(C_NpcIsToughGuy(self)) * *{ * * * *var int zufall; * * * *// случайное число * * * *zufall = Hlp_Random(3); * * * *// если наблюдатель друг жертвы и наблюдатель не друг агрессору * * * *if(Npc_GetAttitude(self,victim) == ATT_FRIENDLY) && (Npc_GetAttitude(self,other) != ATT_FRIENDLY) * * * *{ * * * * * *// наблюдатель говорит сам себе (SVM фраза) * * * * * *if(zufall == 0) { B_Say_Overlay(self,self,"$OOH01"); }; // "Смотри, не делай так!" * * * * * *if(zufall == 1) { B_Say_Overlay(self,self,"$OOH02"); }; // "Вот тогда ты еще успеешь это сделать!" * * * * * *if(zufall == 2) { B_Say_Overlay(self,self,"$OOH03"); }; // "Ох! Это же больно!" * * * * * *// проиграть анимацию * * * * * *AI_PlayAni(self,"T_WATCHFIGHT_OHNO"); * * * *} * * * *else // иначе * * * *{ * * * * * *// наблюдатель говорит сам себе (SVM фраза) * * * * * *if(zufall == 0) { B_Say_Overlay(self,self,"$CHEERFRIEND01"); }; // "Да, это хорошо!" * * * * * *if(zufall == 1) { B_Say_Overlay(self,self,"$CHEERFRIEND02"); }; // "Ну, сделай уже!" * * * * * *if(zufall == 2) { B_Say_Overlay(self,self,"$CHEERFRIEND03"); }; // "Все просто здорово!" * * * * * *// проиграть анимацию * * * * * *AI_PlayAni(self,"T_WATCHFIGHT_YEAH"); * * * *}; * *}; };
// Функция реакции НПС наблюдателя когда другой НПС падает безсознания func void B_AssessDefeat() { * *// очистка очереди AI состояний наблюдателя * *Npc_ClearAIQueue(self); * *// если наблюдатель имеет дело с "крутым парнем" или (агрессор ГГ и наблюдатель друг ГГ) * *if(C_NpcIsToughGuy(self)) ¦¦ (Npc_IsPlayer(other) && (self.npctype == NPCTYPE_FRIEND)) * *{ * * * *// если наблюдатель друг ГГ * * * *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY) * * * *{ * * * * * *// наблюдатель говорит ГГ (SVM фраза "Ну и показал же ты ему!") * * * * * *B_Say(self,other,"$GOODVICTORY"); * * * *} * * * *else // иначе * * * *{ * * * * * *// наблюдатель говорит ГГ (SVM фраза "Неплохо...") * * * * * *B_Say(self,other,"$NOTBAD"); * * * *}; * *} * *else // иначе * *{ * * * *// если у жертвы не было причины сражаться * * * *if(victim.aivar[AIV_ATTACKREASON] != AR_NONE) * * * *{ * * * * * *// наблюдатель говорит агрессору (SVM фраза "Боже мой! Какая жестокость...") * * * * * *B_Say(self,other,"$OHMYGODHESDOWN"); * * * * * *// наблюдатель запоминает новость, что агрессор сражался с НПС жертвой * * * * * *B_MemorizePlayerCrime(self,other,CRIME_ATTACK); * * * *} * * * *else // иначе * * * *{ * * * * * *// наблюдатель говорит агрессору (SVM фраза "Неплохо...") * * * * * *B_Say(self,other,"$NOTBAD"); * * * *}; * *}; };
// Инициализация состояния наблюдения за сражением func void ZS_WatchFight () { * *// разрешить наблюдателю локальное восприятие бессознательного состояния НПС * *Npc_PercEnable(self,PERC_ASSESSDEFEAT,B_AssessDef eat); * *// разрешить наблюдателю локальное восприятие если НПС получил повреждение * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_Che erFight); * *// разрешить минимальный набор восприятий * *Perception_Set_Minimal(); * *// наблюдатель встает * *AI_StandUp(self); * *// поворачивается к жертве * *B_TurnToNpc(self,victim); * *// прячет оружие * *AI_RemoveWeapon(self); * * * * * * *// если (расстояние между наблюдателем и агрессором или наблюдателем и жертвой < дистанции действия восприятия) * *if((Npc_GetDistToNpc(self,other) < PERC_DIST_INTERMEDIAT) ¦¦ (Npc_GetDistToNpc(self,victim) < PERC_DIST_INTERMEDIAT)) * *// и агрессор и жертва не безсознания * *&& (!Npc_IsInState(other,ZS_Unconscious)) && (!Npc_IsInState(victim,ZS_Unconscious)) * *// и агрессор и жертва люди * *&& ((other.guild < GIL_SEPERATOR_HUM) && (victim.guild < GIL_SEPERATOR_HUM)) * *{ * * * *// если наблюдатель имеет дело с "крутым парнем"" * * * *if(C_NpcIsToughGuy(self)) * * * *{ * * * * * *// наблюдатель говорит агрессору (SVM фраза "Ух ты, это же битва!") * * * * * *B_Say(self,other,"$THERESAFIGHT"); * * * *} * * * *else // иначе * * * *{ * * * * * *// наблюдатель говорит агрессору (SVM фраза "Боже мой, вот это битва!") * * * * * *B_Say(self,other,"$OHMYGODITSAFIGHT"); * * * *}; * *}; * *// сброс флага выхода из цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * *// очистить счетчик времени * *self.aivar[AIV_StateTime] = 0; };
// Цикл состояния наблюдения за сражением func int ZS_WatchFight_Loop() { * *// если расстояние между наблюдателем и агрессором и наблюдателем и жертвой > дистанции наблюдения сражения * *if(Npc_GetDistToNpc(self,other) > WATCHFIGHT_DIST_MAX) && (Npc_GetDistToNpc(self,victim) > WATCHFIGHT_DIST_MAX) * *{ * * * *// очистка очереди AI состояний наблюдателя * * * *Npc_ClearAIQueue(self); * * * *return LOOP_END; * *}; * *// если (агрессор не атакует или не реагирует на повреждение) * *if(!(Npc_IsInState(other,ZS_Attack) ¦¦ Npc_IsInState(other,ZS_ReactToDamage))) * *// и (жертва не атакует или не реагирует на повреждение) * *&& (!(Npc_IsInState(victim,ZS_Attack) ¦¦ Npc_IsInState(victim,ZS_ReactToDamage))) * *// и время в состоянии > 0 * *&& (Npc_GetStateTime(self) > 0) * *{ * * * *// если агрессор или жертва безсознания * * * *if(Npc_IsInState(other,ZS_Unconscious)) ¦¦ (Npc_IsInState(victim,ZS_Unconscious)) * * * *// или агрессор или жертва мертвы * * * *¦¦ (Npc_IsInState(other,ZS_Dead)) ¦¦ (Npc_IsInState(victim,ZS_Dead)) * * * *{ * * * * * *// если флаг выхода из цикла сброшен * * * * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * * * * * *{ * * * * * * * *// установить флаг * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * * * * *return LOOP_CONTINUE; * * * * * *} * * * * * *else // иначе, флаг выхода из цикла установлен * * * * * *{ * * * * * * * *// очистка очереди AI состояний наблюдателя * * * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// выход из цикла выполняется после второго прохода, если кто-либо из сражающихся мертв или безсознания (чтобы сработало соответствующее восприятие) * * * * * * * *return LOOP_END; * * * * * *}; * * * *} * * * *else * * * *{ * * * * * * * * *// очистка очереди AI состояний наблюдателя * * * * * *Npc_ClearAIQueue(self); * * * * * *return LOOP_END; * * * *}; * *}; * *// если наблюдатель имеет дело с "крутым парнем" * *if(C_NpcIsToughGuy(self)) * *{ * * * *// анимация удалена!!! * * * *//AI_PlayAni(self,"T_STAND_2_WATCHFIGHT"); * *}; * *// если расстояние между наблюдателем и агрессором или наблюдателем и жертвой <= мин. дистанции наблюдения сражения * *if(Npc_GetDistToNpc(self,other) *<= WATCHFIGHT_DIST_MIN) ¦¦ (Npc_GetDistToNpc(self,victim) <= WATCHFIGHT_DIST_MIN) * *{ * * * *// очистка очереди AI состояний наблюдателя * * * *Npc_ClearAIQueue(self); * * * *// если расстояние между наблюдателем и агрессором <= расстояния между наблюдателем и жертвой * * * *if(Npc_GetDistToNpc(self,other) <= Npc_GetDistToNpc(self,victim)) * * * *{ * * * * * *// наблюдатель поворачивается к жертве * * * * * *B_TurnToNpc(self,victim); * * * *} * * * *else // иначе * * * *{ * * * * * *// наблюдатель поворачивается к агрессору * * * * * *B_TurnToNpc(self,other); * * * *}; * * * *// наблюдатель делает шаг назад * * * *AI_Dodge(self); * *} * *else // иначе (расстояние нормальное для наблюдения) * *{ * * * *// если прошла секунда * * * *if(Npc_GetStateTime(self) != self.aivar[AIV_StateTime]) * * * *{ * * * * * *// если если расстояние между наблюдателем и агрессором <= расстояния между наблюдателем и жертвой * * * * * *if(Npc_GetDistToNpc(self,other) <= Npc_GetDistToNpc(self,victim)) * * * * * *{ * * * * * * * *// наблюдатель поворачивается к агрессору * * * * * * * *B_TurnToNpc(self,other); * * * * * *} * * * * * *else // иначе * * * * * *{ * * * * * * * *// наблюдатель поворачивается к жертве * * * * * * * *B_TurnToNpc(self,victim); * * * * * *}; * * * * * *// запись в счетчик текущего времени цикла * * * * * *self.aivar[AIV_StateTime] = Npc_GetStateTime(self); * * * *}; * *}; * *return LOOP_CONTINUE; };
// Завершение состояния func void ZS_WatchFight_End() { * *// анимация удалена!!! * *//AI_PlayAni(self,"T_WATCHFIGHT_2_STAND"); };
|