|
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, то переход в новое состояние выполнится только после полного завершения текущего состояния.
|