|
Re: Уроки скриптологии
// ******************************************* // Обработчик состояния наблюдения НПС за ГГ // ------------------------------------------- // self - наблюдающий НПС, other - ГГ // *******************************************
// Инициализация наблюдения func void ZS_ObservePlayer() { * * *// установить НПС нормальный набор восприятий * *Perception_Set_Normal(); * *// если НПС не сидит * *if(!C_BodystateContains(self,BS_SIT)) * *{ * * * *// НПС останавливается * * * *AI_StandUp(self); * * * *// НПС смотрит на ГГ * * * *B_LookAtNpc(self,other); * * * *// НПС поворачивается к ГГ * * * *B_TurnToNpc(self,other); * *} * *else // иначе (если НПС сидит) * *{ * * * *// НПС смотрит на ГГ * * * *B_LookAtNpc(self,other); * *}; * *// если в предудущем состоянии НПС спал * *if(Npc_WasInState(self,ZS_Sleep)) * *{ * * * *// НПС спрашивает ГГ (SVM фраза "Что случилось?") * * * *B_Say(self,other,"$YOUDISTURBEDMYSLUMBER"); * *}; * *// если НПС наблюдает за своим помещением и other есть ГГ * *if(self.aivar[AIV_SeenLeftRoom] == TRUE) && (Npc_IsPlayer(other)) * *{ * * * *// сброс наблюдения за своим помещением * * * *self.aivar[AIV_SeenLeftRoom] = FALSE; * * * *// если комментария входа в чужое помещение не было * * * *if(Player_LeftRoomComment == FALSE) * * * *{ * * * * * *// НПС говорит ГГ (SVM фраза "Чего ты там ищешь?") * * * * * *B_Say(self,other,"$WHATDIDYOUDOINTHERE"); * * * * * *// установка флага состоявшегося комментария * * * * * *Player_LeftRoomComment = TRUE; * * * *}; * *}; * *// установить время нахождения НПС в этом состоянии (1 или 2 сек) * *self.aivar[AIV_StateTime] = (Hlp_Random(2) + 1); };
// Цикл состояния наблюдения func int ZS_ObservePlayer_Loop () { * *// если ГГ крадется и комментария подкрадывания не было * *if(C_BodyStateContains(other,BS_SNEAK)) && (Player_SneakerComment == FALSE) * *{ * * * * *// установка флага состоявшегося комментария * * * *Player_SneakerComment = TRUE; * * * *// НПС показывает на ГГ * * * *AI_PointAtNpc(self,other); * * * *// НПС говорит ГГ (SVM фраза "Эй, ты! Что ты там шастаешь?") * * * *B_Say(self,other,"$WHATSTHISSUPPOSEDTOBE"); * * * *// НПС перестает указывать на ГГ * * * *AI_StopPointAt(self); * * * *// НПС посылает ГГ предупреждение * * * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,self,oth er); * *}; * *// если время нахождения в состоянии > 1 или 2 сек * *if(Npc_GetStateTime(self) > self.aivar[AIV_StateTime]) * *{ * * * *// если НПС не сидит * * * *if(!C_BodystateContains(self,BS_SIT)) * * * *{ * * * * * *// НПС поворачивается к ГГ * * * * * *B_TurnToNpc(self,other); * * * *}; * * * *// установить время нахождения НПС в этом состоянии (1 или 2 сек) * * * *self.aivar[AIV_StateTime] = (Hlp_Random(2) + 1); * * * *// сброс времени состояния * * * *Npc_SetStateTime(self,0); * *}; * *// если расстояние между НПС и ГГ > дальности действия восприятия * *if(Npc_GetDistToNpc(self,other) > PERC_DIST_INTERMEDIAT) * *{ * * * *// очистка очереди состояний НПС * * * *Npc_ClearAIQueue(self); * * * *return LOOP_END; * *} * *else // [Прим. else здесь лишнее, можно просто: return LOOP_CONTINUE;] * *{ * * * *return LOOP_CONTINUE; * *}; };
// Выход из состояния наблюдения func void ZS_ObservePlayer_End () { * *// НПС перестает смотреть на ГГ * *B_StopLookAt(self); };
|