|
Re: Уроки скриптологии
19. Обработчики состояний функций распорядка дня для людей.
Все обработчики расположены в директории ..\AI\Human\TA_Human
// ****************************************** // Объявления Герольда // ------------------------------------------ // self - герольд, hero - ГГ // ******************************************
// Функция инициализации состояния func void ZS_Announce_Herold() { * * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// разрешить восприятие тихих звуков (шаги, звон падающего предмета) * *Npc_PercDisable(self,PERC_ASSESSQUIETSOUND); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * * * * *// движение на свой вайпоинт * *AI_GotoWP(self,self.wp); * *// выравнивание на вайпоинте * *AI_AlignToWP(self); * *// сброс флага цикла * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Функция цикла состояния func int ZS_Announce_Herold_loop() { * *// если время цикла > 70 сек и ГГ ни с кем не разговаривает * *if(Npc_GetStateTime(self) >= 70) && (hero.aivar[AIV_INVINCIBLE] == FALSE) * *{ * * * *// анимация перехода в состояние чтения * * * *AI_PlayAni(self,"T_HGUARD_2_STAND"); * * * *// сброс флага * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * *// зачитывание приказов * * * *B_Announce_Herold(); * * * *// сброс времени цикла * * * *Npc_SetStateTime(self, 0); * *}; * *// если флаг сброшен * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// анимация перехода в обычное состояние * * * *AI_PlayAni (self,"T_STAND_2_HGUARD"); * * * *// установка флага * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Announce_Herold_end() { }; *
... ещё файл
// *************************************** // Обработчик поведения бандита // ***************************************
// Функция инициализации состояния func void ZS_Bandit() { * * *// установить нормальный набор восприятий * *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_Bandit_loop() { * *// если флаг сброшен * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// если бандит не у костра и костер имеется (Примечание: "костер" это ближайший свободный фрипоинт с именем FP_CAMPFIRE_xx, в дальнейшем буду использовать только сокращенное описание) * * * *if(!Npc_IsOnFP(self,"CAMPFIRE")) && (Wld_IsFPAvailable(self,"CAMPFIRE")) * * * *{ * * * * * *// бандит идет к костру * * * * * *AI_GotoFP(self,"CAMPFIRE"); * * * * * *// выравнивается * * * * * *AI_AlignToFP(self); * * * * * *// садится * * * * * *AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SIT); * * * *} * * * *// если бандит не на своем месте и место имеется (свободно) * * * *else if(!Npc_IsOnFP(self,"STAND")) && (Wld_IsFPAvailable(self,"STAND")) * * * *{ * * * * * *// бандит идет к месту * * * * * *AI_GotoFP(self,"STAND"); * * * * * *// выравнивается * * * * * *AI_AlignToFP(self); * * * * * *// охраняет * * * * * *AI_PlayAni(self,"T_STAND_2_HGUARD"); * * * *} * * * *else // иначе * * * *{ * * * * * *// выравнивается * * * * * *AI_AlignToWP(self); * * * * * *// охраняет * * * * * *AI_PlayAni(self,"T_STAND_2_HGUARD"); * * * *}; * * * *// установка флага * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * * * * *// если прошло 5 сек и флаг установлен и бандит не сидит * *if(Npc_GetStateTime(self) > 5) && (self.aivar[AIV_TAPOSITION] == ISINPOS) && (!C_BodyStateContains(self,BS_SIT)) * *{ * * * *var int random; * * * *random = Hlp_Random(3); * * * *// с вероятностью 0.33 * * * *if(random == 0) * * * *{ * * * * * *// анимация осмотра * * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime (self, 0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Bandit_end() { * *// если бандит сидит * *if(C_BodyStateContains(self,BS_SIT)) * *{ * * * *// встает * * * *AI_PlayAniBS(self,"T_SIT_2_STAND",BS_STAND); * *} * *else // иначе * *{ * * * *// просто стоит * * * *AI_PlayAni(self,"T_HGUARD_2_STAND"); * *}; };
... ещё файл
// ************************************ // Обработчик ритуала в Круге солнца // ************************************
// Функция инициализации состояния func void ZS_Circle() * { * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить время реакции на восприятия 0.3 сек * *Npc_SetPercTime(self,0.3); * *// НПС встает * *AI_StandUp(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// движение в Круг солнца * *AI_GotoWP(self,self.wp); * *// выравнивание * *AI_AlignToWP(self); };
// Функция цикла состояния func int ZS_Circle_Loop () { * *var int randy; * *var int randyKDW; * *var int randyKDW_Lightstar; * *// если НПС черный маг * *if(self.guild == GIL_DMT) * *{ * * * *randy = Hlp_Random(3000); * * * *// случайное время * * * *if(Npc_GetStateTime(self) > randy) * * * *{ * * * * * *// анимация "Дрожь земли" * * * * * *Wld_PlayEffect("FX_EarthQuake",self,self,0,0,0,FA LSE); * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * * * *// анимация красного экрана * * * * * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE); * * * * * *// упражнение в магии * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5"); * * * * * *}; * * *} * *// если НПС маг воды * *else if(self.guild == GIL_KDW) * *{ * * * *randyKDW = Hlp_Random(2500); * * * *randyKDW_Lightstar= Hlp_Random(2); * * * *// случайное время * * * * *if(Npc_GetStateTime(self) > randyKDW) * * * *{ * * * * * *// выравнивание * * * * * *AI_AlignToWP(self); * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * * * *// анимация "Дрожь земли" * * * * * *Wld_PlayEffect("FX_EarthQuake",self,self,0,0,0,FA LSE ); * * * * * *// упражнение в магии * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5"); * * * * * *// далее какие-то эффекты, кто знает, что делают маги воды в Круге солнца, может написать * * * * * *Wld_PlayEffect("spellFX_RingRitual2",ItMi_AmbossE ffekt_Addon,ItM i_AmbossEffekt_Addon,0,0,0,FALSE); * * * * * *if(randyKDW_Lightstar == 0) * * * * * *{ * * * * * * * *Wld_PlayEffect("spellFX_RingRitual1",ItMi_AmbossE ffekt_Addon,ItM i_AmbossEffekt_Addon,0,0,0,FALSE); * * * * * *} * * * * * *else if(randyKDW_Lightstar == 1) * * * * * *{ * * * * * * * *Wld_PlayEffect("spellFX_LIGHTSTAR_RingRitual",ItM i_AmbossEffekt_ Addon,ItMi_AmbossEffekt_Addon,0,0,0,FALSE); * * * * * *}; * * * *}; * *} * *// если квест по восстановлению Глаза Инноса не завершен * *else if(MIS_RitualInnosEyeRepair != LOG_SUCCESS) * *{ * * * *randy = Hlp_Random(1000); * * * *// случайное время * * * * *if(Npc_GetStateTime(self) > randy) * * * *{ * * * * * *// сброс времени цикла * * * * * *Npc_SetStateTime(self,0); * * * * * *// анимация "Дрожь земли" * * * * * *Wld_PlayEffect("FX_EarthQuake",self,self,0,0,0,FA LSE); * * * * * *// упражнение в магии * * * * * *AI_PlayAni(self,"T_PRACTICEMAGIC5"); * * * * * *// если НПС Ксардас * * * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Xardas)) * * * * * *{ * * * * * * * *// анимация фиолетового экрана * * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_VIOLET",self,s elf,0,0,0,FALSE ); * * * * * *} * * * * * *// если НПС Пирокар * * * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Pyrokar)) * * * * * *{ * * * * * * * *// анимация красного экрана * * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_RED",self,self ,0,0,0,FALSE); * * * * * *} * * * * * *else // иначе Ватрас * * * * * *{ * * * * * * * *// анимация голубого экрана * * * * * * * *Wld_PlayEffect("spellFX_INCOVATION_BLUE",self,sel f,0,0,0,FALSE); * * * * * *}; * * * *}; * * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Circle_End() { };
... ещё файл
// *************************************** // Обработчик концерта InExtremo в аддоне // ***************************************
// Функция инициализации состояния func void ZS_Concert() { * * *// установить нормальный набор восприятий * *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_Concert_Loop () { * *// если флаг сброшен * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// если НПС "Yellow Pfeiffer" * * * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1394_Addon_InExtremo_YellowP feiffer)) * * * *{ * * * * * *// использует Желтую волынку * * * * * *AI_UseItemToState(self,ItMi_IEDudelGelb,1); * * * *} * * * *// если НПС "Dr. Pymonte" * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1390_Addon_InExtremo_DrPymon te)) * * * *{ * * * * * *// использует Арфу * * * * * *AI_UseItemToState(self,ItMi_IEHarfe,1); * * * *} * * * *// если НПС "The Flail" * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1391_Addon_InExtremo_TheFlai l)) * * * *{ * * * * * *// использует Drum * * * * * *AI_UseItemToState(self,ItMi_iedrum,1); * * * *} * * * *// если НПС "Thomas the forger" * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1392_Addon_InExtremo_ThomasT heForger)) * * * *{ * * * * * *// использует Виолончель * * * * * *AI_UseItemToState(self,ItMi_IECello,1); * * * *} * * * *// если НПС "Unicorn" * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1393_Addon_InExtremo_Unicorn )) * * * *{ * * * * * *// использует Лютню * * * * * *AI_UseItemToState(self,ItMi_IELaute,1); * * * *} * * * *// если НПС "Lutter" * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1395_Addon_InExtremo_Lutter) ) * * * *{ * * * * * *// использует Drumscheit * * * * * *AI_UseItemToState(self,ItMi_IEDrumscheit,1); * * * *} * * * *// если НПС "Flex" * * * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1396_Addon_InExtremo_Flex)) * * * *{ * * * * * *// использует Голубую волынку * * * * * *AI_UseItemToState(self,ItMi_IEDudelBlau,1); * * * *} * * * *else * * * *{ * * * * * * // Танцы пиратов? * * * *}; * * * *// установка флага * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Concert_End() { * *// шестерка музыкантов, кроме Flexа, убирают свои инструменты * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1394_Addon_InExtremo_YellowP feiffer)) * *{ * * * *AI_UseItemToState(self,ItMi_IEDudelGelb,-1); * *} * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1390_Addon_InExtremo_DrPymon te)) * *{ * * * *AI_UseItemToState(self,ItMi_IEHarfe,-1); * *} * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1391_Addon_InExtremo_TheFlai l)) * *{ * * * *AI_UseItemToState(self,ItMi_iedrum,-1); * *} * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1392_Addon_InExtremo_ThomasT heForger)) * *{ * * * *AI_UseItemToState(self,ItMi_IECello,-1); * *} * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1393_Addon_InExtremo_Unicorn )) * *{ * * * *AI_UseItemToState(self,ItMi_IELaute,-1); * *} * *else if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(PIR_1395_Addon_InExtremo_Lutter) ) * *{ * * * *AI_UseItemToState(self,ItMi_IEDrumscheit,-1); * *}; };
|