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

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

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

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