Показать сообщение отдельно
Старый 09.02.2005, 10:25   #95
Vam

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

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

// ************************************************** ******************************
// Функция реакции людей на вход НПС в помещение
// ----------------------------------------
// Возвращает TRUE при реакции на вошедшего или FALSE, когда на вошедшего не реагируют
// ************************************************** ******************************

func int B_AssessEnterRoom()
{
* *// other - вошедший, self - свидетель
* *var int portalguild;
* *// получить номер гильдии, которой принадлежит помещение (-1 помещение никому не принадлежит)
* *portalguild = Wld_GetPlayerPortalGuild();
* *// если вошедший ГГ и комментарий входа уже был и помещение принадлежит какой-либо гильдии и помещение не публичное
* *if(Npc_IsPlayer(other)) && (Player_LeftRoomComment == TRUE) && (portalguild > GIL_NONE) && (portalguild != GIL_PUBLIC)
* *{
* * * *// сброс комментария входа
* * * *Player_LeftRoomComment = FALSE;
* *};
* *// если расстояние между вошедшим и свидетелем > 10м
* *if(Npc_GetDistToNpc(self,other) > 1000)
* *{
* * * *return FALSE;
* *};
* *// если свидетель и вошедший (ГГ) находятся не в одном помещении и свидетель находится не снаружи помещения
* *if(!Npc_IsInPlayersRoom(self)) && (!(Npc_GetPortalGuild(self) < GIL_NONE))
* *{
* * * *return FALSE;
* *};
* *// если свидетель находится в состоянии атаки
* *if(Npc_IsInState(self,ZS_Attack))
* *{
* * * *return FALSE;
* *};
* *// если свидетель является охранником ворот
* *if(C_NpcIsGateGuard(self))
* *{
* * * *return FALSE;
* *};
* *// если вошедший не ГГ
* *if(!Npc_IsPlayer(other))
* *{
* * * *return FALSE;
* *};
* *// если свидетель друг ГГ
* *if(self.npctype == NPCTYPE_FRIEND)
* *{
* * * *return FALSE;
* *};
* *// если отношения между свидетелем и ГГ дружеские
* *if(Npc_GetAttitude(self,other) == ATT_FRIENDLY)
* *{
* * * *return FALSE;
* *};
* *// если ГГ крадется или ГГ стоит
* *if(C_BodyStateContains(other,BS_SNEAK)) ¦¦ (C_BodyStateContains(other,BS_STAND))
* *{
* * * *// если свидетель не видит ГГ и свидетель не наблюдает за ГГ
* * * *if(!Npc_CanSeeNpc(self,other)) && (!Npc_IsInState(self,ZS_ObservePlayer))
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если свидетель не принадлежит к гильдии
* *if(self.guild == GIL_NONE)
* *{
* * * *return FALSE;
* *};
* *// если свидетель и ГГ находятся не в одном помещениии и свидетель спит
* *if(!Npc_IsInPlayersRoom(self)) && (Npc_IsInState(self,ZS_Sleep))
* *{
* * * *return FALSE;
* *};
* *// если помещение публично и свидетель находится в одном помещении с ГГ
* *if(portalguild == GIL_PUBLIC) && (Npc_IsInPlayersRoom(self))
* *{
* * * *// если свидетель наблюдает за ГГ
* * * *if(Npc_IsInState(self,ZS_ObservePlayer))
* * * *{
* * * * * *return FALSE;
* * * *};
* * * *// если свидетель лежит
* * * *if(C_BodyStateContains(self,BS_LIE))
* * * *{
* * * * * *// свидетель встает (Примечание: мне непонятно как он это делает)
* * * * * *B_MM_DeSynchronize();
* * * *};
* * * *// если свидетель
* * * *if(Npc_IsInState(self,ZS_Potion_Alchemy)) * * * // занимается алхимией
* * * *¦¦ (Npc_IsInState(self,ZS_Read_Bookstand)) * * *// или читает книгу
* * * *¦¦ (Npc_IsInState(self,ZS_Sit_Bench)) * * * * * // или сидит на скамье
* * * *¦¦ (Npc_IsInState(self,ZS_Sit_Campfire)) * * * *// или сидит у костра
* * * *¦¦ (Npc_IsInState(self,ZS_Sit_Chair)) * * * * * // или сидит на стуле
* * * *¦¦ (Npc_IsInState(self,ZS_Sit_Throne)) * * * * *// или сидит на троне
* * * *¦¦ (Npc_IsInState(self,ZS_Sleep)) * * * * * * * // или спит
* * * *¦¦ (Npc_IsInState(self,ZS_Smalltalk)) * * * * * // или ведет светскую беседу
* * * *¦¦ (Npc_IsInState(self,ZS_Smoke_Joint)) * * * * // или курит
* * * *¦¦ (Npc_IsInState(self,ZS_Stand_ArmsCrossed)) * // или стоит со скрещенными руками
* * * *¦¦ (Npc_IsInState(self,ZS_Stand_Drinking)) * * *// или пьет
* * * *¦¦ (Npc_IsInState(self,ZS_Stand_Eating)) * * * *// или ест
* * * *¦¦ (Npc_IsInState(self,ZS_Stand_Guarding)) * * *// или охраняет
* * * *¦¦ (Npc_IsInState(self,ZS_Stand_WP)) * * * * * *// или стоит на вайпоинте
* * * *{
* * * * * *// очистка очереди состояний свидетеля
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// очистка восприятий свидетеля
* * * * * *B_ClearPerceptions(self);
* * * * * *// если свидетель сидит
* * * * * *if(C_BodyStateContains(self,BS_SIT))
* * * * * *{
* * * * * * * *// перевод свидетеля в состояние наблюдения за ГГ
* * * * * * * *AI_StartState(self,ZS_ObservePlayer,0,"");
* * * * * *}
* * * * * *else
* * * * * *{
* * * * * * * *// перевод свидетеля в состояние наблюдения за ГГ (выполняется только функция конца состояния)
* * * * * * * *AI_StartState(self,ZS_ObservePlayer,1,"");
* * * * * *};
* * * * * *return TRUE;
* * * *}
* * * *else
* * * *{
* * * * * *return FALSE;
* * * *};
* *};
* *// если ГГ находится в частном помещении
* *if(C_NpcIsBotheredByPlayerRoomGuild(self))
* *{
* * * *Npc_ClearAIQueue(self);
* * * *B_ClearPerceptions(self);
* * * *// перевод свидетеля в состояние "защиты помещения"
* * * *AI_StartState(self,ZS_ClearRoom,1,"");
* * * *return TRUE;
* *};
* *return FALSE;
};

// ************************************************** ***********
// Функция реакции людей на вход НПС в помещение
// ------------------------------------------------
// Вызывается как реакция на пассивное восприятие PERC_ASSESSENTERROOM
// ************************************************** ***********

func void B_AssessPortalCollision()
{
* *// other - вошедший, self - свидетель
* *var int formerportalguild;
* *// получить номер гильдии, которой принадлежит помещение в котором прежде находился ГГ (-1 помещение никому не принадлежит)
* *formerportalguild = Wld_GetFormerPlayerPortalGuild();
* *// если есть реакция на вошедшего в помещение
* *if(B_AssessEnterRoom())
* *{
* * * *return;
* *};
* *// если свидетель не видит вошедшего и (вошедший крадется или вошедший стоит)
* *if(!Npc_CanSeeNpc(self,other)) && (C_BodyStateContains(other,BS_SNEAK) ¦¦ C_BodyStateContains(other,BS_STAND))
* *{
* * * *return;
* *};
* *// свидетелю разрешено воспринимать все объекты в зоне действия восприятия
* *Npc_PerceiveAll(self);
* *// если свидетель находит другого НПС в состоянии "защиты помещения"
* *if(Wld_DetectNpcEx(self,-1,ZS_ClearRoom,-1,FALSE))
* *{
* * * *return;
* *};
* *// если покинутое ГГ помещение принадлежит гильдии свидетеля или свидетель друг гильдии, которой принадлежит помещение
* *if(self.guild == formerportalguild) ¦¦ (Wld_GetGuildAttitude(self.guild,formerportalguild ) == ATT_FRIENDLY)
* *{
* * * *// если отношения между гильдиями ГГ и свидетеля дружеские или (вошедший ГГ и друг свидетеля)
* * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY) ¦¦ (Npc_IsPlayer(other) && (self.npctype == NPCTYPE_FRIEND))
* * * *{
* * * * * *return;
* * * *};
* * * *// если свидетель не принадлежит к гильдии
* * * *if(self.guild == GIL_NONE)
* * * *{
* * * * * *return;
* * * *};
* * * *// если (помещение принадлежит милиции или ополчению) и свидетель является другом этих гильдии
* * * *if((formerportalguild == GIL_MIL) ¦¦ (formerportalguild == GIL_SLD)) && (Wld_GetGuildAttitude(self.guild,formerportalguild ) == ATT_FRIENDLY)
* * * *{
* * * * * *// свидетель атакует ГГ
* * * * * *B_Attack(self,other,AR_LeftPortalRoom,0);
* * * * * *return;
* * * *}
* * * *else // иначе
* * * *{
* * * * * *// свидетель наблюдает за помещением
* * * * * *self.aivar[AIV_SeenLeftRoom] = TRUE;
* * * * * *// очистка очереди состояний свидетеля
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// очистка восприятий свидетеля
* * * * * *B_ClearPerceptions(self);
* * * * * *// перевод свидетеля в состояние наблюдения за ГГ
* * * * * *AI_StartState(self,ZS_ObservePlayer,0,"");
* * * * * *return;
* * * *};
* *};
};

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