Показать сообщение отдельно
Старый 28.02.2005, 12:19   #115
Vam

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

По умолчанию Re: Уроки скриптологии

// *************************************************
// Обработчик состояния когда монстр поедает добычу
// -------------------------------------------------
// self - НПС монстр, other - добыча (труп)
// *************************************************

// Инициализация состояния
func void ZS_MM_EatBody()
{
* *// установка времени реакции на восприятия 1 сек
* *Npc_SetPercTime(self,1);
* *// разрешить восприятие магии
* *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);
* *// монстр идет к телу
* *AI_GotoNpc(self,other);
* *// монстр поворачивается к добыче
* *AI_TurnToNpc(self,other);
* *// проигрывается анимация поедания
* *AI_PlayAni(self,"T_STAND_2_EAT");
* *// установить приоритет на поедание
* *self.aivar[AIV_MM_PRIORITY] = PRIO_EAT;
* *// ссылка на последнее съеденное тело
* *self.aivar[AIV_LASTBODY] = Hlp_GetInstanceID(other);
* *// сброс флага восприятия врага
* *self.aivar[AIV_TAPOSITION] = NOTINPOS;
};

// Цикл состояния
func int ZS_MM_EatBody_loop()
{
* *// если восприятие врага выключено
* *if (self.aivar[AIV_TAPOSITION] == NOTINPOS)
* *{
* * * *// разрешить восприятие врага
* * * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_MM_AssessE nemy);
* * * *// установить флаг разрешения восприятия
* * * *self.aivar[AIV_TAPOSITION] = ISINPOS;
* *};
* *// если добыча съедена
* *if(!Hlp_IsValidNpc(other))
* *{
* * * *// очистка очереди AI состояний монстра
* * * *Npc_ClearAIQueue(self);
* * * *return LOOP_END;
* *};
* *return LOOP_CONTINUE;
};

// Завершение состояния
func void ZS_MM_EatBody_end()
{
* *// прекратить анимацию поедания
* *AI_PlayAni(self,"T_EAT_2_STAND");
};

... еще один файл

//************************************************** **
// Обработчик состояния когда монстр убегает от врага
//----------------------------------------------------
// self - монстр, other - враг
//************************************************** **

// Инициализация состояния
func void ZS_MM_Flee()
{
* *// разрешить восприятие магии
* *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *
* *// инициализировать переменную other врагом
* *B_ValidateOther();
* *// монстр встает
* *AI_StandUp(self);
* *// монстр переходит в режим бега
* *AI_SetWalkmode(self,NPC_RUN);
* *// монстру посылается предупреждение от врага
* *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);
* *// рассинхронизация [Примечание: мне непонятно зачем?]
* *B_MM_DeSynchronize();
};

// Цикл состояния
func int ZS_MM_Flee_Loop()
{
* *// обновить ссылку на врага
* *Npc_GetTarget(self);
* *// если расстояние между монстром и врагом < 20 метров
* *if(Npc_GetDistToNpc(self,other) < 2000)
* *{ *
* * * *// если прошла одна секунда
* * * *if(Npc_GetStateTime(self) > 0)
* * * *{
* * * * * *// враг посылает монстру предупреждение
* * * * * *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);
* * * * * *// сброс времени состояния
* * * * * *Npc_SetStateTime(self,0);
* * * *};
* * * *// монстр убегает от врага
* * * *AI_Flee(self);
* * * *return LOOP_CONTINUE;
* *}
* *else
* *{ *
* * * *// очистка очереди AI состояний монстра
* * * *Npc_ClearAIQueue(self);
* * * *return LOOP_END; * * * * * * * * * * * * * * * * * * * * * * * * * *
* *};
};

// Завершение состояния
func void ZS_MM_Flee_End()
{
};

... и еще файл
// ********************************************
// Обработчик состояния охоты монстра
// --------------------------------------------
// self - монстр, other - жертва
// ********************************************

// Инициализация состояния охоты
func void ZS_MM_Hunt()
{
* *// разрешить базовые восприятия монстров
* *Perception_Set_Monster_Rtn();
* *// монстр встает
* *AI_StandUp(self);
* *// поворачивается к жертве
* *AI_TurnToNpc(self,other);
* *// переходит на шаг
* *AI_SetWalkmode(self,NPC_WALK);
* *// идет к жертве
* *AI_GotoNpc(self,other);
};

// Цикл состояния
func int ZS_MM_Hunt_Loop()
{
* *return LOOP_END;
};

// Завершение состояния
func void ZS_MM_Hunt_End()
{
};

... и еще файл
// **************************************************
// Обработчик состояния когда монстр угрожает врагу
// --------------------------------------------------
// self - монстр, other - враг
// **************************************************

// Инициализация состояния угрозы
func void ZS_MM_ThreatenEnemy()
{
* *// установка времени реакции на восприятия 2 сек
* *Npc_SetPercTime(self,2);
* *// разрешить восприятие мертвого тела
* *Npc_PercEnable(self,PERC_ASSESSBODY,B_MM_AssessBo dy);
* *// разрешить восприятие магии
* *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);
* *// монстр встает
* *AI_StandUp(self);
* *// враг посылает монстру предупреждение
* *Npc_SendPassivePerc(self,PERC_ASSESSWARN,other,se lf);
};

// Цикл состояния угрозы
func int ZS_MM_ThreatenEnemy_loop()
{
* *// если расстояние между монстром и врагом > дистанции действия активных восприятий
* *if(Npc_GetDistToNpc(self,other) > PERC_DIST_MONSTER_ACTIVE_MAX)
* *{
* * * *// очистка очереди AI состояний монстра
* * * *Npc_ClearAIQueue(self);
* * * *return LOOP_END;
* *};
* *// если расстояние между монстром и врагом <= дистанции начала атаки
* *if(Npc_GetDistToNpc(self,other) <= FIGHT_DIST_MONSTER_ATTACKRANGE)
* *{
* * * *// очистка очереди AI состояний монстра
* * * *Npc_ClearAIQueue(self);
* * * *// установка цели для монстра
* * * *Npc_SetTarget(self, other);
* * * *// переход в состояние атаки
* * * *AI_StartState(self,ZS_MM_Attack,0,"");
* * * *return LOOP_END;
* *};
* *// если время в состоянии >= времени угрозы
* *if(Npc_GetStateTime(self) >= MONSTER_THREATEN_TIME)
* *{ *
* * * *Npc_ClearAIQueue(self);
* * * *Npc_SetTarget(self,other);
* * * *// переход в состояние атаки
* * * *AI_StartState(self,ZS_MM_Attack,0,"");
* * * *return LOOP_END;
* *};
* *// монстр поворачивается к врагу
* *AI_TurnToNpc(self,other);
* *// играется анимация угрозы
* *AI_PlayAni(self,"T_WARN");
* *return LOOP_CONTINUE;
}; *

// Завершение состояния угрозы
func void ZS_MM_ThreatenEnemy_end()
{
};



Добавление от 02/28/05, в 11:39:03

Системная функция AI_StartState может управлять последовательностью выполнения фаз состояний, за это отвечает параметр stateBehaviour, если он = 0, то сразу выполняется переход в указанное состояние, если он = 1, то переход в новое состояние выполнится только после полного завершения текущего состояния.
Ответить с цитированием