|
Re: Уроки скриптологии
// ************************************** // Обработчик состояния брожения монстра // **************************************
// Инициализация состояния func void ZS_MM_Rtn_Roam() { * *// разрешить нормальный набор восприятий * *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_Roam_loop() { * *// если время брожения истекло и время не контролируется программой поведения монстра * *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_AllScheduler,1,""); * * * *return LOOP_END; * *}; * *// фаза передвижения завершена * *if (self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *var int wanderTime; * * * *// время стояния * * * *wanderTime = Hlp_Random(5); * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * * * *// установить флаг стояния * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * *}; * *// если время стояния закончилось * *if(Npc_GetStateTime(self) > wanderTime) * *{ * * * *// если есть свободная точка "FP_ROAM" * * * *if(Wld_IsNextFPAvailable(self,"FP_ROAM")) * * * *{ * * * * * *// монстр идет в эту мочку * * * * * *AI_GotoNextFP(self,"FP_ROAM"); * * * *}; * * * *// сброс флага стояния * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * *} * *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_Roam_end() { };
... еще файл
// ************************************** // Обработчик состояния кормежки монстра // **************************************
// Инициализация состояния кормежки func void ZS_MM_Rtn_EatGround() { * *// разрешить нормальный набор восприятий * *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); * *}; * *// если есть свободная точка с именем "FP_ROAM" * *if(Wld_IsFPAvailable(self,"FP_ROAM")) * * *{ * * * *// монстр идет в эту точку * * * *AI_GotoFP(self,"FP_ROAM"); * *}; * *// анимация перехода в состояние кормежки * *AI_PlayAni(self,"T_STAND_2_EAT"); * *// анимация кормежки * *Mdl_ApplyRandomAni(self,"S_EAT","R_ROAM1"); * *Mdl_ApplyRandomAni(self,"S_EAT","R_ROAM2"); * *Mdl_ApplyRandomAni(self,"S_EAT","R_ROAM3"); * *Mdl_ApplyRandomAniFreq(self,"S_EAT",8.0); };
// Цткл состояния кормежки func int ZS_MM_Rtn_EatGround_Loop() { * *// если время кормежки истекло и время не контролируется программой поведения монстра * *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_AllScheduler,1,""); * * * *return LOOP_END; * *}; * *return LOOP_CONTINUE; };
// Завершение состояния кормежки func void ZS_MM_Rtn_EatGround_End() { * *// анимация выхода из состояния кормежки * *AI_PlayAni(self,"T_EAT_2_STAND"); };
... еще файл
// ************************************** // Обработчик состояния резвости монстра // **************************************
// Инициализация состояния резвости func void ZS_MM_Rtn_Wusel() { * *// разрешить нормальный набор восприятий * *Perception_Set_Monster_Rtn(); * *// режим пережвижения бегом * *AI_SetWalkmode(self,NPC_RUN); * *// если монстр не находится в заданной точке * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE) * *{ * * * *// монстр бежит в заданную точку * * * *AI_GotoWP(self,self.WP); * *}; * *// монстр бежит на свободную точку "FP_ROAM" * *AI_GotoFP(self,"FP_ROAM"); };
// Цикл состояния резвости func int ZS_MM_Rtn_Wusel_loop() { * *// если время резвости истекло и время не контролируется программой поведения монстра * *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_AllScheduler,1,""); * * * *return LOOP_END; * *}; * *// если монстр находится в этом состоянии >= 1 сек * *if(Npc_GetStateTime (self) >= 1) * *{ * * * *// если монстр находится в точке "FP_ROAM" * * * *if(Npc_IsOnFP(self,"FP_ROAM")) * * * *{ * * * * * *// поиск следующей свободной точки * * * * * *if(Wld_IsNextFPAvailable(self,"FP_ROAM")) * * * * * *{ * * * * * * * *// очистка очереди AI состояний монстра * * * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// переход на новую свободную точку * * * * * * * *AI_GotoNextFP(self,"FP_ROAM"); * * * * * *}; * * * *} * * * *else // если не дошел до точки * * * *{ * * * * * *// если монстр не идет и не бежит * * * * * *if(!C_BodyStateContains(self,BS_WALK)) && (!C_BodyStateContains(self,BS_RUN)) * * * * * *{ * * * * * * * *// переход в свободную точку * * * * * * * *AI_GotoFP(self,"FP_ROAM"); * * * * * *}; * * * *}; * * * *// сброс времени цикла * * * *Npc_SetStateTime(self,0); * * * *// здесь лишний (можно удалить) * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * *}; * * *return LOOP_CONTINUE; };
// Завершение состояния резвости func void ZS_MM_Rtn_Wusel_end() { };
... и еще файл
// ************************************ // Обработчик сидячего состояния орков // ************************************
// Инициализация состояния func void ZS_MM_Rtn_OrcSit() { * *// разрешить нормальный набор восприятий * *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_OrcSit_loop() { * *// если время сидения истекло и время не контролируется программой поведения монстра * *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_AllScheduler,1,""); * * * *return LOOP_END; * *}; * *// если точка сидения не достигнута * *if(self.aivar[AIV_TAPOSITION] == NOTINPOS) * *{ * * * *// если есть свободная точка "FP_CAMPFIRE" * * * *if(Wld_IsFPAvailable(self,"FP_CAMPFIRE")) * * * *{ * * * * * *// монстр идет в эту точку * * * * * *AI_GotoFP(self,"FP_CAMPFIRE"); * * * *}; * * * *// если монстр находится в точке "FP_CAMPFIRE" * * * *if(Npc_IsOnFP(self,"FP_CAMPFIRE")) * * * *{ * * * * * *// анимация сидящего орка * * * * * *AI_PlayAniBS(self,"T_STAND_2_GUARDSLEEP",BS_SIT); * * * * * *// установка флага достижения точки * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * *}; * *} * *else // лишнее, можно удалить! * *{ * *}; * *return LOOP_CONTINUE; };
// Завершение состояния func void ZS_MM_Rtn_OrcSit_end() { * *// анимация выхода из сидячего положения * *AI_PlayAniBS(self,"T_GUARDSLEEP_2_STAND",BS_STAND ); };
|