Показать сообщение отдельно
Старый 02.03.2005, 09:30   #118
Vam

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

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

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