|
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"); };
|