Показать сообщение отдельно
Старый 23.04.2005, 10:35   #150
Vam

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

По умолчанию 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);
* *};
};

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