|
Re: Уроки скриптологии
// ************************************************** ********** // Обработчик состояния реакции НПС на повреждение // ------------------------------------------------------------ // self - НПС, получивший повреждение, other - агрессор // ************************************************** **********
// Инициализация состояния func void ZS_ReactToDamage() { * * *// разрешить НПС нормальный набор восприятий * *Perception_Set_Normal(); * *// НПС смотрит на агрессора * *B_LookAtNpc(self,other); * *// НПС выбирает оружие для поражения агрессора * *B_SelectWeapon(self,other); * *// НПС поворачивается к агрессору * *B_TurnToNpc(self,other); * *// НПС говорит агрессору (SVM фраза "Парень, никогда так больше не делай!") * *B_Say (self, other, "$WHATAREYOUDOING"); * *// очистка счетчика секунд * *self.aivar[AIV_StateTime] = 0; };
// Цикл состояния func int ZS_ReactToDamage_Loop() { * *// если прошла одна секунда * *if(Npc_GetStateTime(self) > self.aivar[AIV_StateTime]) * *{ * * * *// если НПС не видит агрессора * * * *if(!Npc_CanSeeNpc(self,other)) * * * *{ * * * * * * *// НПС поворачивается к агрессору * * * * * *AI_TurnToNpc(self,other); * * * *}; * * * *// счетчик секунд ++ * * * *self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1; * *}; * *// если прошло более 10 секунд * *if(Npc_GetStateTime (self) > 10) * *{ * * * *return LOOP_END; * *} * *else // [Примечание: else можно убрать, просто - return LOOP_CONTINUE;] * *{ * * * *return LOOP_CONTINUE; * *}; };
// Завершения состояния func void ZS_ReactToDamage_End() { * *// НПС убирает оружие * *AI_RemoveWeapon(self); * *// перестает смотреть на агрессора * *B_StopLookAt(self); };
... и еще один файл
// ******************************************** // Обработчик состояния реакции НПС на оружие // -------------------------------------------- // self - реагирующий НПС, other - агрессор // ********************************************
// Инициализация состояния func void ZS_ReactToWeapon() { * * *// разрешить НПС минимальный набор восприятий * *Perception_Set_Minimal(); * *// разрешить НПС восприятие сражения двух других НПС * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFightSound); * *// реакция НПС на врага агрессора * *if(B_AssessEnemy()) * *{ * * * *return; * *}; * *// НПС встает * *AI_StandUp(self); * *// смотрит на агрессора * *B_LookAtNpc(self,other); * *// выбирает оружие * *B_SelectWeapon(self,other); * *// поворачивается к агрессору * *B_TurnToNpc(self,other); * *// если НПС выиграл последнее сражение с ГГ и была причина сражения с ГГ и агрессор ГГ * *if(self.aivar[AIV_LastFightAgainstPlayer] == FIGHT_WON) && (self.aivar[AIV_LastPlayerAR] != AR_NONE) && (Npc_IsPlayer(other)) * *{ * * * *// НПС говорит ГГ (SVM фраза "Хочешь еще получить?") * * * *B_Say(self,other,"$LOOKINGFORTROUBLEAGAIN"); * *} * *// иначе, если комментария обнаженного оружия не было * *else if(Player_DrawWeaponComment == FALSE) * *{ * * * *// если агрессор хочет применить магию * * * *if(Npc_IsInFightMode(other,FMODE_MAGIC)) * * * *{ * * * * * *// НПС говорит агрессору (SVM фраза "Перестань колдовать!") * * * * * *B_Say(self,other,"$STOPMAGIC"); * * * *} * * * *else // иначе * * * *{ * * * * * *// НПС говорит агрессору (SVM фраза "Убери оружие!") * * * * * *B_Say(self,other,"$WEAPONDOWN"); * * * *}; * * * *// установка флага состоявшегося комментария * * * *Player_DrawWeaponComment = TRUE; * *}; * *// НПС посылает предупреждение агрессору * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,self,oth er); * *// сброс флага второго предупреждения * *self.aivar[AIV_TAPOSITION] = FALSE; * *// сброс счетчика времени * *self.aivar[AIV_StateTime] = 0; };
// Цикл состояния func int ZS_ReactToWeapon_Loop() { * * *// если расстояние между НПС и агрессором > дистанции действия восприятия * *if(Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT) * *{ * * * *// очистка очереди AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// НПС убирает оружие * * * *AI_RemoveWeapon(self); * * * *// перестает смотреть на агрессора * * * *B_StopLookAt(self); * * * *return LOOP_END; * *}; * *// если агрессор убрал оружие * *if(Npc_IsInFightMode(other,FMODE_NONE)) * *{ * * * *// очистка очереди AI состояний НПС * * * *Npc_ClearAIQueue(self); * * * *// НПС говорит агрессору (SVM фраза "Умный малый!") * * * *B_Say(self,other,"$WISEMOVE"); * * * *// НПС убирает оружие * * * *AI_RemoveWeapon(self); * * * *// перестает смотреть на агрессора * * * *B_StopLookAt (self); * * * *return LOOP_END; * *}; * *// если прошла одна секунда * *if(Npc_GetStateTime(self) > self.aivar[AIV_StateTime]) * *{ * * * *// если НПС не видит агрессора * * * *if(!Npc_CanSeeNpc(self,other)) * * * *{ * * * * * * *// НПС поворачивается к агрессору * * * * * *B_TurnToNpc(self,other); * * * *}; * * * *// счетчик времени ++ * * * *self.aivar[AIV_StateTime] = self.aivar[AIV_StateTime] + 1; * *}; * *// если второго предупреждения не было и время в состоянии > 5 сек * *if(self.aivar[AIV_TAPOSITION] == FALSE) && (Npc_GetStateTime(self) > 5) * *{ * * * * *// если агрессор хочет применить магию * * * *if(Npc_IsInFightMode(other,FMODE_MAGIC)) * * * *{ * * * * * *// НПС говорит агрессору (SVM фраза "Убери свою магию! Ты что, оглох!?") * * * * * *B_Say(self,other,"$ISAIDSTOPMAGIC"); * * * *} * * * *else * * * *{ * * * * * *// НПС говорит агрессору (SVM фраза "Да убери же чертово оружие!") * * * * * *B_Say(self,other,"$ISAIDWEAPONDOWN"); * * * *}; * * * *// установить флаг второго предупреждения * * * *self.aivar[AIV_TAPOSITION] = TRUE; * *}; * *// если время в состоянии > 10 сек * *if(Npc_GetStateTime(self) > 10) * * * * * * * * * * * * * * * * * * * * * *{ * * * *// НПС атакует агрессора * * * *B_Attack(self,other,AR_ReactToWeapon,0); * *}; * * *return LOOP_CONTINUE; };
// Завершение состояния func void ZS_ReactToWeapon_End() { * * *// НПС перестает смотреть на агрессора * *B_StopLookAt(self); * *// НПС переходит в заключительную фазу состояния наблюдения за ГГ * *AI_StartState(self,ZS_ObservePlayer,1,""); };
|