Показать сообщение отдельно
Старый 26.04.2005, 17:36   #153
Vam

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

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

// **********************************
// Охрана Святого молота Гарвигом
// **********************************

// Функция инициализации состояния
func void ZS_Guard_Hammer()
{ *
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Guard_Hammer_loop()
{
* *// если НПС находится на фрипоинте охраны
* *if(Npc_IsOnFP(self,"STAND"))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"STAND"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"STAND");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выровняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *};
* *// если флаг сброшен
* *if(self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// анимация перехода в режим охраны
* * * *AI_PlayAni(self,"T_STAND_2_HGUARD");
* * * *// установить флаг охраны
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *}; *
* *// если НПС имеет Святой молот и расстояние до места хранения молота < 5м
* *if(Npc_HasItems(self,Holy_Hammer_MIS) == 1) && (Npc_GetDistToWP(self,"NW_MONASTERY_SANCTUM_01") <= 500)
* *{
* * * *// изъять из инвентаря НПС Святой молот
* * * *Npc_RemoveInvItems(self,Holy_Hammer_MIS,1);
* * * *// положить молот в точку хранения
* * * *Wld_InsertItem(Holy_Hammer_MIS,"FP_HAMMER");
* *};
* *// если прошло > 5 сек и НПС находится в режиме охраны
* *if((Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS))
* *{
* * * *var int random;
* * * *random = Hlp_Random(10);
* * * *// с вероятностью 0.1
* * * *if(random == 0)
* * * *{
* * * * * *// осмотреть окрестности
* * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND");
* * * *};
* * * *// сброс времени цикла
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Guard_Hammer_end()
{
* *// анимация перехода из состояния охраны в стоячее
* *AI_PlayAni(self,"T_HGUARD_2_STAND");
}; *

... ещё файл

// ************************
// Охрана прохода НПС
// ************************

// Функция инициализации состояния
func void ZS_Guard_Passage()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll (self);
* *// установить время реакции на восприятия 0.1 сек
* *Npc_SetPercTime(self,0.1);
* *// НПС встает
* *AI_StandUp(self); * * * * * * *
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// движение на свой вайпоинт
* *AI_GotoWP(self,self.wp);
* *// если расстояние между НПС и ГГ > дистанции диалога
* *if(Npc_GetDistToNpc(self,hero) > PERC_DIST_DIALOG)
* *{
* * * *// выровняться
* * * *AI_AlignToWP(self);
* *};
};

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

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

... ещё файл

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

// Функция локального восприятия НПС на ГГ
func void B_AssessGuidePlayer()
{
* *// если расстояние между НПС и ГГ > 8м
* *if(Npc_GetDistToNpc(self,hero) > 800)
* *{
* * * *// если расстояние от НПС до его вайпоинта < расстояния от ГГ до этого же вайпоинта
* * * *if(Npc_GetDistToWP(self,self.wp) < Npc_GetDistToWP(hero,self.wp))
* * * *{
* * * * * *// очистить очередь AI состояний НПС
* * * * * *Npc_ClearAIQueue(self);
* * * * * *// НПС встает
* * * * * *AI_StandUp(self);
* * * * * *// НПС поворачивается к ГГ
* * * * * *B_TurnToNpc(self,hero);
* * * *};
* * * *// если расстояние между НПС и ГГ > 12м и враги у НПС есть и отношения между НПС и ГГ враждебные
* * * *if(Npc_GetDistToNpc(self,hero) > 1200) && (self.aivar[AIV_EnemyOverride] == TRUE) && (Npc_GetAttitude(self,hero) == ATT_HOSTILE)
* * * *{
* * * * * *// сброс флага врагов (врагов и НПС нет)
* * * * * *self.aivar[AIV_EnemyOverride] = FALSE;
* * * *};
* *}
* *else
* *{
* * * *// обычная реакция НПС на ГГ
* * * *B_AssessPlayer();
* *};
};

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

// Функция инициализации состояния
func void ZS_Guide_Player()
{
* *// разрешить минимальный набор восприятий
* *Perception_Set_Minimal();
* *// перевод НПС в исходное состояние
* *B_ResetAll (self);
* *// разрешить НПС все чувства
* *self.senses = SENSE_SEE ¦ SENSE_HEAR ¦ SENSE_SMELL;
* *// установить дальность чувств 20 метров
* *self.senses_range = 2000;
* *// установить время реакции НПС на восприятия 1 сек
* *Npc_SetPercTime(self,1);
* *// установить локальное восприятие НПС на ГГ
* *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_AssessGui dePlayer);
* *// разрешить восприятие врага
* *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 sGuideFightSound);
};

// Функция цикла состояния
func int ZS_Guide_Player_Loop()
{ *
* *// если расстояние между НПС и ГГ > 8м и расстояние от НПС до его вайпоинта < расстояния от ГГ до этого же вайпоинта
* *if(Npc_GetDistToNpc(self,hero) > 800) && (Npc_GetDistToWP(self,self.wp) < Npc_GetDistToWP(hero,self.wp))
* *{
* * * *// локальная реакция НПС на ГГ
* * * *B_AssessGuidePlayer();
* *}
* *// если расстояние между НПС и его вайпоинтом > 3м
* *else if(Npc_GetDistToWP(self,self.wp) > 300)
* *{
* * * *// если НПС не плывет
* * * *if(!C_BodyStateContains(self,BS_SWIM))
* * * *{
* * * * * *// установить режим передвижения бегом
* * * * * *AI_SetWalkmode(self,NPC_RUN);
* * * *};
* * * *// движение НПС на вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *}
* *else
* *{
* * * *// НПС поворачивается к ГГ
* * * *B_TurnToNpc(self,hero);
* *};
* *return LOOP_CONTINUE;
};
* *
// Функция завершения состояния
func int ZS_Guide_Player_End()
{ *
};

... ещё файл

// *****************************
// НПС справляет малую нужду
// *****************************

// Функция инициализации состояния
func void ZS_Pee()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
* *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// сброс флага цикла
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Функция цикла состояния
func int ZS_Pee_loop()
{
* *// если НПС на нужном фрипоинте
* *if(Npc_IsOnFP(self,"PEE"))
* *{
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// если НПС шел на фрипоинт
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK)
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *};
* *}
* *// если фрипоинт существует и свободен
* *else if(Wld_IsFPAvailable(self,"PEE"))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"PEE");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// установить флаг перемещения
* * * *self.aivar[AIV_TAPOSITION] = NOTINPOS_WALK;
* *}
* *else // фрипоинт занят
* *{
* * * *// выровняться на вайпоинте
* * * *AI_AlignToWP(self);
* * * *// если НПС шел в точку
* * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS_WALK )
* * * *{
* * * * * *// сброс флага
* * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS;
* * * *}; *
* *};
* *// если флаг сброшен и НПС на нужном фрипоинте
* *if((self.aivar[AIV_TAPOSITION] == NOTINPOS) && (Npc_IsOnFP(self,"PEE")))
* *{
* * * *// выровняться
* * * *AI_AlignToFP(self);
* * * *// встать
* * * *AI_StandUp(self);
* * * *// анимация мочеиспускания
* * * *AI_PlayAni(self,"T_STAND_2_PEE");
* * * *// установить флаг выполнения нужной функции
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Pee_end()
{
* *// прекратить мочеиспускание
* *AI_PlayAni(self,"T_PEE_2_STAND");
};


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