Показать сообщение отдельно
Старый 25.04.2005, 16:44   #152
Vam

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

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

// *********************************
// Обработчик следования НПС за ГГ
// *********************************

// Функция локального восприятия НПС на ГГ
func void B_AssessFollowPlayer()
{
* *// если НПС Диего в Минентале
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))
* *{ *
* * * *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен (НПС движется)
* * * *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE)
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// НПС встает (ждет действий ГГ)
* * * * * *AI_StandUp(self);
* * * * * *// установить флаг (НПС остановился)
* * * * * *self.aivar[AIV_TAPOSITION] = TRUE;
* * * *}
* * * *// если Диего слишком далеко и флаг сброшен
* * * *else if(C_DiegoTooFar(0)) && (self.aivar[AIV_TAPOSITION] == FALSE)
* * * *{
* * * * * *// очистить очередь AI состояний Диего
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// Диего встает (ждет действий ГГ)
* * * * * *AI_StandUp(self);
* * * * * *// установить флаг
* * * * * *self.aivar[AIV_TAPOSITION] = TRUE;
* * * * * *// если расстояние между Диего и ГГ > дистанции начала разговора
* * * * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* * * * * *{
* * * * * * * *// Диего говорит ГГ (SVM фраза) "Подожди!" (Примечание: правильней other заменить на hero)
* * * * * * * *B_Say(self,other,"$SC_HEYWAITASECOND");
* * * * * *};
* * * *}
* * * *else // иначе
* * * *{ *
* * * * * *// обычная реакция НПС на ГГ
* * * * * *B_AssessPlayer();
* * * *};
* * * *return;
* *};
* *// расстояние между НПС и ГГ < дистанции следования и флаг сброшен
* *if(Npc_GetDistToNpc(self,hero) < self.aivar[AIV_FollowDist]) && (self.aivar[AIV_TAPOSITION] == FALSE)
* *{
* * * *// очистить очередь AI состояний НПС
* * * *Npc_ClearAIQueue(self);
* * * *// НПС встает (ждет действий ГГ)
* * * *AI_StandUp(self);
* * * *// установить флаг
* * * *self.aivar[AIV_TAPOSITION] = TRUE;
* *}
* *else
* *{ *
* * * *// обычная реакция НПС на ГГ
* * * *B_AssessPlayer();
* *};
};

// Функция локального восприятия НПС на звук сражения
func void B_AssessFollowFightSound()
{
* *// если other (нападающий) есть ГГ или victim (жертва) есть ГГ или
* *if(Npc_IsPlayer(other)) ¦¦ (Npc_IsPlayer(victim))
* *¦¦ (other.aivar[AIV_PARTYMEMBER] == TRUE) * * * * * // other - член партии ГГ
* *¦¦ (victim.aivar[AIV_PARTYMEMBER] == TRUE) * * * * *// или victim - член партии ГГ
* *{
* * * *// обычная реакция НПС на звук сражения
* * * *B_AssessFightSound();
* *};
};

// Данная функция не используется и может быть удалена.
func void B_MoveFollowNpc()
{
};

// Функция инициализации состояния
func void ZS_Follow_Player()
{
* *// разрешить НПС все чувства
* *self.senses = SENSE_SEE|SENSE_HEAR|SENSE_SMELL;
* *// установить дальность чувств 20 метров
* *self.senses_range = 2000; * * *
* *// установить время реакции на восприятия 0.3 сек
* *Npc_SetPercTime(self,0.3);
* *// разрешить минимальный набор восприятий
* *Perception_Set_Minimal();
* *// установить локальное восприятие НПС на ГГ
* *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessFol lowPlayer);
* *// разрешить восприятие врага
* *Npc_PercEnable(self,PERC_ASSESSENEMY,B_AssessEnem y);
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие перемещения МОВа
* *Npc_PercEnable(self,PERC_MOVEMOB,B_MoveMob);
* *// установить локальное восприятие звуков сражения
* *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_Asses sFollowFightSound);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// НПС встает
* *AI_StandUp(self);
* *// установить режим передвижения бегом
* *AI_SetWalkmode(self,NPC_RUN);
* *// если дистанция между НПС не задана
* *if(self.aivar[AIV_FollowDist] == 0)
* *{
* * * *// задать дистанцию 5м
* * * *self.aivar[AIV_FollowDist] = 500;
* *};
};

// Функция цикла состояния
func int ZS_Follow_Player_Loop()
{
* *// расстояние между НПС и ГГ > дистанции следования
* *if(Npc_GetDistToNpc(self,hero) > self.aivar[AIV_FollowDist])
* *{
* * * *// если НПС Диего в Минентале
* * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(DiegoOW))
* * * *{
* * * * * *// если Диего слишком далеко
* * * * * *if(C_DiegoTooFar(0))
* * * * * *{
* * * * * * * *// если прошло > 1 сек
* * * * * * * *if(Npc_GetStateTime(self) > 1)
* * * * * * * *{
* * * * * * * * * *// Диего поворачивается к ГГ
* * * * * * * * * *B_TurnToNpc(self,hero);
* * * * * * * * * *// сброс времени цикла
* * * * * * * * * *Npc_SetStateTime(self,0);
* * * * * * * *};
* * * * * * * *return LOOP_CONTINUE;
* * * * * *};
* * * *};
* * * *// если НПС не плывет
* * * *if(!C_BodyStateContains(self,BS_SWIM))
* * * *{ *
* * * * * *// установить режим передвижения бегом
* * * * * *AI_SetWalkmode(self,NPC_RUN);
* * * *};
* * * *// НПС движется к ГГ
* * * *AI_GotoNpc(self,hero);
* * * *// сброс флага (НПС в движении)
* * * *self.aivar[AIV_TAPOSITION] = FALSE;
* *}
* *else // расстояние < дистанции следования
* *{
* * * *// если прошло > 1 сек
* * * *if(Npc_GetStateTime(self) > 1)
* * * *{
* * * * * *// НПС поворачивается к ГГ
* * * * * *B_TurnToNpc(self,hero);
* * * * * *// сброс времени цикла
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Follow_Player_End()
{
};

... ещё файл

// **********************************
// Обработчик поведения призраков
// **********************************

// Функция инициализации состояния
func void ZS_Ghost()
{
* *var C_NPC Quarho;
* *// получить ссылку на Куарходрона
* *Quarho = Hlp_GetNpc(NONE_ADDON_111_Quarhodron);
* *// если НПС Куарходрон
* *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Quarho))
* *{
* * * *// если информация о "Камерах Аданоса" не известна
* * * *if(Ghost_SCKnowsHow2GetInAdanosTempel == FALSE)
* * * *{ *
* * * * * *// разрешить восприятие разговора
* * * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* * * *}; *
* *}
* *else
* *{
* * * *// разрешить восприятие разговора
* * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *}; *
* *// разрешить восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить время реакции на восприятия 0.1 сек
* *Npc_SetPercTime(self,0.1);
* *// НПС встает
* *AI_StandUp(self); * * * * * * *
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// движение на свой вайпоинт
* *AI_GotoWP(self, self.wp);
* *// выравнивание
* *AI_AlignToWP(self);
};

// Функция цикла состояния
func int ZS_Ghost_Loop()
{
* *// если прошло >= 5 сек
* *if(Npc_GetStateTime(self) >= 5)
* *{
* * * *// если расстояние между НПС и ГГ > дистанции начала диалога
* * * *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* * * *{
* * * * * *// выравнивание
* * * * * *AI_AlignToWP(self);
* * * * * *// сброс времени состояния
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* * * *// удалить призрака
* * * *B_RemoveGhost();
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Ghost_End()
{
};

// ******************************
// Обработчик поведения Радемеса
// ******************************

// Функция инициализации состояния
func void ZS_GhostWusel()
{
* *// разрешить восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ;
* *// разрешить восприятие повреждения
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// НПС встает
* *AI_StandUp(self); *
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если НПС расположен не на своем вайпоинте
* *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.WP);
* *};
* *// движение на свободный фрипоинт
* *AI_GotoFP(self,"FP_ROAM");
};

// Функция цикла состояния (Радемес бродит по фрипоинтам)
func int ZS_GhostWusel_Loop()
{
* *// если прошло >= 3 сек
* *if(Npc_GetStateTime(self) >= 3)
* *{
* * * *// если Радемес находится на фрипоинте
* * * *if(Npc_IsOnFP(self,"FP_ROAM"))
* * * *{
* * * * * *// если есть свободный следующий фрипоинт
* * * * * *if(Wld_IsNextFPAvailable(self,"FP_ROAM"))
* * * * * *{
* * * * * * * *// очистка очереди AI ссостояний НПС
* * * * * * * *Npc_ClearAIQueue(self);
* * * * * * * *// переход на следующий фрипоинт
* * * * * * * *AI_GotoNextFP(self,"FP_ROAM");
* * * * * *};
* * * *}
* * * *else // не на фрипоинте
* * * *{
* * * * * *// если НПС не передвигается
* * * * * *if(!C_BodyStateContains(self,BS_WALK)) && (!C_BodyStateContains(self,BS_RUN))
* * * * * *{
* * * * * * * *// перейти на фрипоинт
* * * * * * * *AI_GotoFP(self,"FP_ROAM");
* * * * * *};
* * * *};
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_GhostWusel_End()
{
};

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