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

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

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

// ************************************************** ****
// Функция реакции монстров на предупреждение
// ------------------------------------------------------
// Предупреждение посылается только скриптами (вызов функции Npc_SendPassivePerc), ядром не испоьзуется
// ************************************************** ****

func void B_MM_AssessWarn()
{
* *// self - наблюдатель, other - агрессор, victim - жертва
* *// если наблюдатель орк
* *if(self.guild > GIL_SEPERATOR_ORC)
* *{
* * * *// если наблюдатель находится в состоянии атаки
* * * *if(Npc_IsInState(self,ZS_MM_Attack))
* * * *{
* * * * * *return;
* * * *};
* * * *// если гильдия наблюдателя дружественна гильдии агрессора
* * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY)
* * * *{
* * * * * *// очистка очереди AI команд наблюдателя
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// установка жертвы в качестве цели наблюдателю
* * * * * *Npc_SetTarget(self,victim);
* * * * * *// очистка восприятий наблюдателя
* * * * * *B_ClearPerceptions(self);
* * * * * *// наблюдатель атакует жертву
* * * * * *AI_StartState(self,ZS_MM_Attack,0,"");
* * * * * *return;
* * * *};
* * * *return;
* *};
* *// если агрессор человек
* *if(other.guild < GIL_SEPERATOR_HUM)
* *{
* * * *return;
* *};
* *// если расстояние по высоте между наблюдателем и агрессором > дистанции реагирования по высоте
* *if(Npc_GetHeightToNpc(self,other) > PERC_DIST_HEIGHT)
* *{
* * * *return;
* *};
* *// если наблюдатель находится в состоянии атаки
* *if(Npc_IsInState(self,ZS_MM_Attack))
* *{
* * * *// если наблюдателя устраивает добыча в виде агрессора и приоритет наблюдателя "пожирание падали"
* * * *if(C_PredatorFoundPrey(self,other)) && (self.aivar[AIV_MM_PRIORITY] == PRIO_EAT)
* * * *{
* * * * * *// очистка очереди AI команд наблюдателя
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// установка агрессора в качестве цели наблюдателю
* * * * * *Npc_SetTarget(self,other);
* * * *}
* * * *else // иначе цель не меняется
* * * *{
* * * * * *// возврат цели для наблюдателя (последняя бывшая цель)
* * * * * *other = Hlp_GetNpc(self.aivar[AIV_LASTTARGET]);
* * * *};
* * * *return;
* *};
* *// если гильдии наблюдателя и агрессора одинаковы и наблюдатель охотится стаей
* *if(self.guild == other.guild) && (self.aivar[AIV_MM_Packhunter] == TRUE)
* *{
* * * *// если наблюдатель волк и жертва волк и жертва ГГ (превращенный в волка)
* * * *if(self.guild == GIL_WOLF) && (victim.guild == GIL_WOLF) && Npc_IsPlayer(victim)
* * * *{
* * * * * *return;
* * * *};
* * * *// если агрессор находится в состоянии атаки
* * * *if(Npc_IsInState(other,ZS_MM_Attack))
* * * *{
* * * * * *Npc_ClearAIQueue(self);
* * * * * *Npc_SetTarget(self,victim);
* * * * * *B_ClearPerceptions(self);
* * * * * *// наблюдатель атакует жертву
* * * * * *AI_StartState(self,ZS_MM_Attack,0,"");
* * * * * *return;
* * * *};
* * * *// если агрессор находится в состоянии угрозы врагу
* * * *if(Npc_IsInState(other,ZS_MM_ThreatenEnemy))
* * * *{
* * * * * *// агрессор бежит
* * * * * *AI_SetWalkmode(self,NPC_RUN);
* * * * * *// к жертве
* * * * * *AI_GotoNpc(self,victim);
* * * * * *return;
* * * *};
* *};
* *return;
};


... и еще одна функция

// ************************************************** ******
// Функция реакции монстров на ГГ
// --------------------------------------------------------
// Вызывается ядром системы в качестве реакции на активное восприятие PERC_ASSESSPLAYER
// Используется только конкретными монстрами
// ************************************************** ******

func void B_MM_AssessPlayer()
{
* *// other - ГГ, self - монстр
* *// если ГГ в состоянии диалога
* *if(other.aivar[AIV_INVINCIBLE] == TRUE)
* *{
* * * *return;
* *};
* *// если ГГ мертв, безсознания и т.д. (обездвижен)
* *if(C_NpcIsDown(other))
* *{
* * * *return;
* *};
* *// подготовка разговора ГГ с драконами
* *B_AssignDragonTalk(self);
* *// если расстояние между ГГ и монстром < 7м и монстр имеет важную информацию
* *if(Npc_GetDistToNpc(self,other) <= 700) && (Npc_CheckInfo(self,1))
* *{
* * * *// если монстр дракон или (монстр не дракон и расстояние между монстром и ГГ <= дистанции начала диалога)
* * * *if(self.guild == GIL_DRAGON) ¦¦ ((self.guild != GIL_DRAGON) && (Npc_GetDistToNpc(self,other) <= PERC_DIST_DIALOG))
* * * *{
* * * * * *// если ГГ не падает и не плывет и не ныряет
* * * * * *if(!C_BodyStateContains(other,BS_FALL)) && (!C_BodyStateContains(other,BS_SWIM)) && (!C_BodyStateContains(other,BS_DIVE))
* * * * * *{
* * * * * * * *// у монстра устанавливается флаг начала разговора
* * * * * * * *self.aivar[AIV_NpcStartedTalk] = TRUE;
* * * * * * * *// реакция ГГ на предлагаемый разговор
* * * * * * * *B_AssessTalk();
* * * * * * * *return;
* * * * * *};
* * * *};
* *};
* *// если монстр член партии ГГ
* *if(self.aivar[AIV_PARTYMEMBER] == TRUE)
* *{
* * * *// если расстояние между ГГ и монстром < 5м и монстр не стоит
* * * *if(Npc_GetDistToNpc(self,hero) < 500) && (!C_BodyStateContains(self,BS_STAND))
* * * *{
* * * * * *// очистка очереди AI состояний монстра
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// монстр останавливается
* * * * * *AI_StandUp(self);
* * * * * *// и поворачивается к ГГ
* * * * * *AI_TurnToNpc(self,hero);
* * * *};
* *};
};


Все файлы активных и пассивных восприятий монстров находятся в директории ..\AI\Monster\B_Monster\ и имеют имена эквивалентные функциям восприятий.
Ответить с цитированием