Показать сообщение отдельно
Старый 18.02.2005, 09:54   #105
Vam

AGFC
Гость
 
Сообщений: n/a

По умолчанию Re: Уроки скриптологии

// ************************************************** *****
// Состояние защиты своего помещения
// ************************************************** *****
// Здесь: self - НПС хозяин помещения, other - "незванный гость" (ГГ)
// ************************************************** *****

// Функция обработки восприятия разговора (вызывается когда ГГ обращается к НПС хозяину)
func void B_ClearRoomTalk()
{
* *// если НПС хочет напасть на "гостя"
* *if(C_WantToAttackRoomIntruder(self))
* *{
* * * *// НПС предупреждает "гостя" (SVM фраза "Пошел вон!")
* * * *B_Say(self,other,"$GETOUTOFHERE");
* *}
* *else
* *{
* * * *// НПС спрашивает "гостя" (SVM фраза "Что ты тут ищешь!?")
* * * *B_Say(self,other,"$WHYAREYOUINHERE");
* *};
};

// Функция обработки восприятия выхода ГГ из помещения
// Возвращает TRUE если ГГ покинул помещение, иначе - FALSE
func int B_ExitIfRoomLeft()
{
* *var int portalguild;
* *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)
* *portalguild = Wld_GetPlayerPortalGuild();
* *// если ГГ покинул помещение или помещение публичное
* *if(!C_NpcIsBotheredByPlayerRoomGuild(self)) ¦¦ (portalguild == GIL_PUBLIC)
* *{
* * * *// очистка очереди AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// НПС встает
* * * *AI_StandUp(self);
* * * *// НПС перестает смотреть на ГГ
* * * *B_StopLookAt(self);
* * * *// если НПС хочет напасть на "гостя"
* * * *if(C_WantToAttackRoomIntruder(self))
* * * *{
* * * * * *// НПС говорит "гостю" (SVM фраза "Да, иди прочь!")
* * * * * *B_Say(self,other,"$YESGOOUTOFHERE");
* * * *}
* * * *else
* * * *{
* * * * * *// НПС говорит "гостю" (SVM фраза "Умный малый!")
* * * * * *B_Say(self,other,"$WISEMOVE");
* * * *};
* * * *// НПС продолжает выполнение распорядка дня
* * * *AI_ContinueRoutine(self);
* * * *return TRUE;
* *};
* *return FALSE;
};

// Инициализация состояния защиты помещения
func void ZS_ClearRoom()
{ *
* *// установить минимальный набор восприятий НПС
* *Perception_Set_Minimal();
* *// заменить восприятие входа в помещение на восприятие выхода "гостя" из помещения
* *Npc_PercEnable(self,PERC_ASSESSENTERROOM,B_ExitIf RoomLeft);
* *// включить восприятие на перемещение МОВа
* *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
* *// заменить восприятие разговора НПС
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_ClearRoomTa lk);
* *// НПС встает
* *AI_StandUp(self);
* *// НПС смотрит на "гостя"
* *B_LookAtNpc(self,other);
* *// НПС бежит к "гостю"
* *AI_SetWalkmode(self,NPC_RUN);
* *// если НПС находится вне помещения
* *if(!Npc_IsInPlayersRoom(self)) *
* *{
* * * *// НПС бежит в точку, ближайшую к ГГ
* * * *AI_GotoWP(self,Npc_GetNearestWP(other));
* *};
* *// установка признака входа в цикл
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла защиты помещения
func int ZS_ClearRoom_Loop()
{
* *// если осуществен первый вход в цикл
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// НПС поворачивается к "гостю"
* * * *B_TurnToNpc(self,other);
* * * *// если НПС хочет напасть на "гостя"
* * * *if(C_WantToAttackRoomIntruder(self))
* * * *{
* * * * * *// НПС выбирает соответствующее "гостю" оружие
* * * * * *B_SelectWeapon(self,other);
* * * * * *// НПС предупреждает "гостя" (SVM фраза "Пошел вон!")
* * * * * *B_Say(self,other,"$GETOUTOFHERE");
* * * *}
* * * *else
* * * *{
* * * * * *// если НПС не является другом "гостя"
* * * * * *if(Npc_GetAttitude(other,self) != ATT_FRIENDLY)
* * * * * *{
* * * * * * * *// НПС спрашивает "гостя" (SVM фраза "Что ты тут ищешь!?")
* * * * * * * *B_Say(self,other,"$WHYAREYOUINHERE");
* * * * * *};
* * * *};
* * * *// сброс времени нахождения НПС в этом состоянии
* * * *Npc_SetStateTime(self, 0);
* * * *// закрытие первого входа в цикл
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// если ГГ покинул помещение
* *if(B_ExitIfRoomLeft())
* *{
* * * *return LOOP_END;
* *};
* *// если НПС хочет напасть на "гостя"
* *if(C_WantToAttackRoomIntruder(self))
* *{
* * * *// если с момента входа в помещение прошло > 5 сек
* * * *if(Npc_GetStateTime(self) > 5)
* * * *{
* * * * * *// НПС атакует "гостя"
* * * * * *B_Attack(self,other,AR_ClearRoom,0);
* * * * * *return LOOP_END;
* * * *};
* *}
* *else // НПС не хочет нападать (повторяется каждые две секунды)
* *{
* * * *// если с момента входа в помещение прошло >= 2 сек
* * * *if(Npc_GetStateTime(self) >= 2)
* * * *{
* * * * * *// если НПС не видит "гостя" по прямой
* * * * * *if(!Npc_CanSeeNpcFreeLOS(self,other)) *
* * * * * *{
* * * * * * * *// НПС бежит в точку, ближайшую к ГГ
* * * * * * * *AI_GotoWP(self,Npc_GetNearestWP(other));
* * * * * * * *// НПС поворачивается к "гостю"
* * * * * * * *B_TurnToNpc(self,other);
* * * * * *}
* * * * * *// иначе, если НПС вообще не видит "гостя"
* * * * * *else if(!Npc_CanSeeNpc(self,other))
* * * * * *{ *
* * * * * * * *// НПС поворачивается в направлении "гостя"
* * * * * * * *B_TurnToNpc(self,other);
* * * * * *};
* * * * * *// сброс времени состояния
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция выхода из состояния защиты помещения
func void ZS_ClearRoom_End()
{
* *// НПС перестает смотреть на "гостя"
* *B_StopLookAt (self);
};

Ответить с цитированием