|
Re: Уроки скриптологии
11. Функции распорядка дня монстров.
Как таковой (по сравнению с людьми) распорядок дня у монстров отсутствует, есть функция планировщика суточного цикла монстров ZS_MM_AllScheduler, которая вызывает обработчики конкретных состояний. Все файлы обработчиков суточных состояний монстров расположены в директории ..\AI\Monster\RTN_Monster
// ************************************** // Планировщик суточного цикла монстров // **************************************
func void ZS_MM_AllScheduler() { * * *// установить приоритет на питание вместо атаки * * *self.aivar[AIV_MM_PRIORITY] = PRIO_EAT; * * *// если НПС Каменный страж и Равен убит * * *if(self.guild == GIL_STONEGUARDIAN) && (RavenIsDead == TRUE) * * *{ * * * * * * * * *// убить Каменного стража * * * * * *B_KillNpc(self); * * *}; * * *// если наступило время сна монстра или время контролируется программой поведения монстра * * *if(Wld_IsTime(self.aivar[AIV_MM_SleepStart],00,self.aivar[AIV_MM_SleepEnd] ,00) ¦¦ (self.aivar[AIV_MM_SleepStart] == OnlyRoutine)) * * *{ * * * * * *// перейти в состояние сна (обратить внимание на параметр stateBehaviour = 1, переход в состояние сна возможен только после полного завершения текущего состояния) * * * * * *AI_StartState(self,ZS_MM_Rtn_Sleep,1,""); * * *} * * *// иначе, если наступило время отдыха монстра или время контролируется программой поведения монстра * * *else if(Wld_IsTime(self.aivar[AIV_MM_RestStart],00,self.aivar[AIV_MM_RestEnd],00) ¦¦ (self.aivar[AIV_MM_RestStart] == OnlyRoutine)) * * *{ * * * * * *// перейти в состояние отдыха * * * * * *AI_StartState(self,ZS_MM_Rtn_Rest,1,""); * * *} * * *// иначе, если наступило время брожения монстра или время контролируется программой поведения монстра * * *else if(Wld_IsTime(self.aivar[AIV_MM_RoamStart],00,self.aivar[AIV_MM_RoamEnd],00) ¦¦ (self.aivar[AIV_MM_RoamStart] == OnlyRoutine)) * * *{ * * * * * *// перейти в состояние брожения * * * * * *AI_StartState(self,ZS_MM_Rtn_Roam,1,""); * * *} * * *// иначе, если наступило время кормежки монстра или время контролируется программой поведения монстра * * *else if(Wld_IsTime(self.aivar[AIV_MM_EatGroundStart],00,self.aivar[AIV_MM_EatGroundEnd],00) ¦¦ (self.aivar[AIV_MM_EatGroundStart] == OnlyRoutine)) * * *{ * * * * * *// перейти в состояние кормежки * * * * * *AI_StartState(self,ZS_MM_Rtn_EatGround,1,""); * * *} * * *// иначе, если наступило время резвости монстра или время контролируется программой поведения монстра * * *else if(Wld_IsTime(self.aivar[AIV_MM_WuselStart],00,self.aivar[AIV_MM_WuselEnd],00) ¦¦ (self.aivar[AIV_MM_WuselStart] == OnlyRoutine)) * * *{ * * * * * *// перейти в состояние резвости * * * * * *AI_StartState(self,ZS_MM_Rtn_Wusel,1,""); * * *} * * *// иначе, если наступило время посидеть орку или время контролируется программой поведения монстра * * *else if(Wld_IsTime(self.aivar[AIV_MM_OrcSitStart],00,self.aivar[AIV_MM_OrcSitEnd],00) ¦¦ (self.aivar[AIV_MM_OrcSitStart] == OnlyRoutine)) * * *{ * * * * * *// перейти орку в сидячее состояние * * * * * *AI_StartState(self,ZS_MM_Rtn_OrcSit,1,""); * * *} * * *else // иначе (по умолчанию) * * *{ * * * * * *// перейти в состояние отдыха * * * * * *AI_StartState(self,ZS_MM_Rtn_Rest,1,""); * * *}; };
... еще один файл
// ********************************* // Обработчик состояния сна монстра // *********************************
// Функция обработки локального восприятия тихих звуков во время сна func void B_MM_AssessQuietSound_Sleep() { * * *// если спящий монстр услышал врага * * *if(Wld_GetGuildAttitude(self.guild,other.guild) == ATT_HOSTILE) * * *{ * * * * * *// реакция монстра на врага * * * * * *B_MM_AssessEnemy(); * * *}; };
// Инициализация состояния сна func void ZS_MM_Rtn_Sleep() { * * *// разрешить восприятие магии * * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * * *// разрешить восприятие повреждения * * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage); ** * * * * * * * *// разрешить восприятие повреждения, нанесенного другому НПС * * *Npc_PercEnable(self,PERC_ASSESSOTHERSDAMAGE,B_MM_ AssessOthersDamage); ** * * * * *// разрешить восприятие смерти * * *Npc_PercEnable(self,PERC_ASSESSMURDER,B_MM_Assess OthersDamage); * * *// разрешить восприятие предупреждения * * *Npc_PercEnable(self,PERC_ASSESSWARN,B_MM_AssessWa rn); * * *// разрешить восприятие тихих звуков (шаги, звон падающего предмета) * * *Npc_PercEnable(self,PERC_ASSESSQUIETSOUND,B_MM_As sessQuietSound_Sleep); * * *// установить режим передвижения шагом * * *AI_SetWalkmode ** * *(self, NPC_WALK); * * *B_MM_DeSynchronize(); * * *// если монстр не находится в заданной точке * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) * * *{ * * * * * *// монстр идет в заданную точку * * * * * *AI_GotoWP(self,self.WP); * * *}; * * *// если есть свободная точка с именем "FP_ROAM" * * *if(Wld_IsFPAvailable(self,"FP_ROAM")) * * *{ * * * * * *// монстр идет в эту точку * * * * * *AI_GotoFP(self,"FP_ROAM"); * * *}; * * *// анимация "T_PERCEPTION" * * *AI_PlayAni(self,"T_PERCEPTION"); * * *// анимация перехода ко сну * * *AI_PlayAniBS(self,"T_STAND_2_SLEEP",BS_LIE); };
// Цикл состояния сна func int ZS_MM_Rtn_Sleep_loop() { * * *// если время сна истекло или время не контролируется программой поведения монстра * * *if((!Wld_IsTime(self.aivar[AIV_MM_SleepStart],00,self.aivar[AIV_MM_SleepEnd],00)) && (self.aivar[AIV_MM_SleepStart] != OnlyRoutine)) * * *{ * * * * * *// переход в планировщик суточного цикла * * * * * *AI_StartState(self,ZS_MM_AllScheduler,1,""); * * * * * *return LOOP_END; * * *}; * * *return LOOP_CONTINUE; };
// Завершение состояния сна func void ZS_MM_Rtn_Sleep_end() { * * *// анимация пробуждения * * *AI_PlayAniBS(self,"T_SLEEP_2_STAND",BS_STAND); };
... и еще файл
// ************************************* // Обработчик состояния отдыха монстров // *************************************
// Инициализация состояния отдыха func void ZS_MM_Rtn_Rest() { * * *// разрешить нормальный набор восприятий * * *Perception_Set_Monster_Rtn(); * * *// режим пережвижения шагом * * *AI_SetWalkmode(self,NPC_WALK); * * *B_MM_DeSynchronize(); * * *// если монстр не находится в заданной точке * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) * * *{ * * * * * *// монстр идет в заданную точку * * * * * *AI_GotoWP(self,self.WP); * * *}; * * *// сброс флага достижения точки отдыха * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; };
// Цикл состояния отдыха func int ZS_MM_Rtn_Rest_Loop() { * * *// если НПС Каменный страж и Равен убит * * *if(self.guild == GIL_STONEGUARDIAN) && (RavenIsDead == TRUE) * * *{ * * * * * * * * *// убить Каменного стража * * * * * *B_KillNpc(self); * * *}; * * *// если время отдыха истекло или время не контролируется программой поведения монстра * * *if((!Wld_IsTime(self.aivar[AIV_MM_RestStart],00,self.aivar[AIV_MM_RestEnd] ,00)) && (self.aivar[AIV_MM_RestStart] != OnlyRoutine)) * * *{ * * * * * *// переход в планировщик суточного цикла * * * * * *AI_StartState(self,ZS_MM_AllScheduler,1,""); * * * * * *return LOOP_END; * * *}; * * *// если точка отдыха не достигнута * * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * * *{ * * *// если есть свободная точка с именем "FP_ROAM" * * * * * *if(Wld_IsFPAvailable(self,"FP_ROAM")) * * * * * *{ * * * * * * * * *// монстр идет в эту точку * * * * * * * * *AI_GotoFP(self,"FP_ROAM"); * * * * * *}; * * * * * *// если монстр дошел до точки * * * * * *if(Npc_IsOnFP(self,"FP_ROAM")) * * * * * *{ * * * * * * * * *// установить флаг достижения точки отдыха * * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * * *}; * * *} * * *else // иначе (монстр находится в точке отдыха) * * *{ * * * * * *// с вероятностью 0,005 менять анимацию монстра * * * * * *if(Hlp_Random(1000) <= 5) * * * * * *{ * * * * * * * * *var int randomMove; * * * * * * * * *randomMove = Hlp_Random(3); * * * * * * * * *if(randomMove == 0) { AI_PlayAni(self,"R_ROAM1"); }; * * * * * * * * *if(randomMove == 1) { AI_PlayAni(self,"R_ROAM2"); }; * * * * * * * * *if(randomMove == 2) { AI_PlayAni(self,"R_ROAM3"); }; * * * * * *}; * * *}; * * *return LOOP_CONTINUE; };
// Завершение состояния отдыха func void ZS_MM_Rtn_Rest_End() { };
|