|
Re: Уроки скриптологии
Несколько обработчиков состояний для некоторых типов монстров.
// ************************************ // Обработчик состояния отдыха дракона // ************************************
// Инициализация состояния func void ZS_MM_Rtn_DragonRest() * { * *// установить время реакции на восприятия 1 сек * *Npc_SetPercTime(self,1); * *// приоритет на питание * *self.aivar[AIV_MM_PRIORITY] = PRIO_EAT; * *// если дракон не тестовый (строки программы, отмеченные в конце //*** можно удалить) * *if(Hlp_GetInstanceID(self) != Hlp_GetInstanceID(Dragon_Testmodell)) //*** * *{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //*** * * * *// разрешить нормальный набор восприятий * * * *Perception_Set_Monster_Rtn(); * * * *// разрешить восприятие ГГ * * * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player); * *}; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *//*** * *// разрешить восприятие разговора * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *// установить режим передвижения шагом * *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"); * *} * *else // иначе * *{ * * * *// выравнивание в точке * * * *AI_AlignToWP(self); * *}; * *// сброс счетчика цикла регенерации * *self.aivar[AIV_TAPOSITION] = 0; };
// Цикл состояния func int ZS_MM_Rtn_DragonRest_Loop() { * *// если время отдыха истекло и время не контролируется программой поведения монстра * *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.guild == GIL_DRAGON) * *{ * * * *// счетчик цикла регенерации ++ * * * *self.aivar[AIV_TAPOSITION] += 1; * * * *// если жизнь дракона < максимальной и прошло не менее 2 сек * * * *if(self.attribute[ATR_HITPOINTS] < self.attribute[ATR_HITPOINTS_MAX]) && (self.aivar[AIV_TAPOSITION] >= 2) * * * *{ * * * * * *// жизнь дракона ++ * * * * * *self.attribute[ATR_HITPOINTS] += 1; * * * * * *// сброс счетчика цикла регенерации * * * * * *self.aivar[AIV_TAPOSITION] = 0; * * * *}; * *}; * *// с вероятностью 0,005 менять анимацию монстра * *if(Hlp_Random(1000) <= 5) * *{ * * * *var int randomMove; * * * *randomMove = Hlp_Random(3); * * * *AI_StandUp(self); * * * *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_DragonRest_End() { * *// анимация выхода из отдыха * *AI_PlayAni(self,"T_REST_2_STAND"); };
... еще файл
// ******************************************* // Обработчик состояния когда овца идет за ГГ // *******************************************
// Инициализация состояния func void ZS_MM_Rtn_Follow_Sheep() { * *// установить время реакции на восприятия 1 сек * *Npc_SetPercTime(self,1); * *// разрешить восприятие ГГ * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player); * *// разрешить восприятие разговора * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *// разрешить восприятие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); };
// Цикл состояния func int ZS_MM_Rtn_Follow_Sheep_Loop() { * *// если НПС член партии ГГ * *if(self.aivar[AIV_PARTYMEMBER] == TRUE) * *{ * * * *// если расстояние между НПС и ГГ > 5 метров * * * *if(Npc_GetDistToNpc(self,hero) > 500) * * * *{ * * * * * *// если НПС не плывет * * * * * *if(!C_BodyStateContains(self,BS_SWIM)) * * * * * *{ * * * * * * * * *// НПС переходит на бег * * * * * * * *AI_SetWalkmode(self,NPC_RUN); * * * * * *}; * * * * * *// НПС движется к ГГ * * * * * *AI_GotoNpc(self,hero); * * * *} * * * *else // иначе * * * *{ * * * * * *// НПС поворачивается к ГГ * * * * * *AI_TurnToNpc(self,hero); * * * * * *// установить для НПС ближайшую свободную точку * * * * * *self.wp = Npc_GetNearestWP(self); * * * *}; * *} * *else // иначе * *{ * * * *// анимация * * * *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_Follow_Sheep_End() { };
// ************************************************** ** // Обработчик состояния когда овца идет за Бальтасаром // ************************************************** **
// Инициализация состояния func void ZS_MM_Rtn_Follow_Sheep_Balthasar() { * *// установить время реакции на восприятия 1 сек * *Npc_SetPercTime(self,1); * *// разрешить восприятие ГГ * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player); };
// Цикл состояния func int ZS_MM_Rtn_Follow_Sheep_Balthasar_Loop() { * *// если расстояние между Бальтасаром и точкой "NW_BIGMILL_FARM3_BALTHASAR" > 5 м * *if(Npc_GetDistToWP(Balthasar,"NW_BIGMILL_FARM3_BA LTHASAR") > 500) * *{ * * * *// если расстояние между НПС и Бальтасаром > 5 метров * * * *if(Npc_GetDistToNpc(self,Balthasar) > 500) * * * *{ * * * * * *// если НПС не плывет * * * * * *if(!C_BodyStateContains(self,BS_SWIM)) * * * * * *{ * * * * * * * * *// НПС переходит на бег * * * * * * * *AI_SetWalkmode(self,NPC_RUN); * * * * * *}; * * * * * *// НПС движется к Бальтасару * * * * * *AI_GotoNpc(self,Balthasar); * * * *} * * * *else // иначе * * * *{ * * * * * *// НПС поворачивается к Бальтасару * * * * * *AI_TurnToNpc(self,Balthasar); * * * * * *// установить для НПС ближайшую свободную точку * * * * * *self.WP = Npc_GetNearestWP(self); * * * *}; * *} * *else // иначе (когда пришли) * *{ * * * *// переход НПС в состояние брожения около точки "NW_BIGMILL_FARM3_BALTHASAR" * * * *AI_StartState(self,ZS_MM_Rtn_Roam,1,"NW_BIGMILL_F ARM3_BALTHASAR" ); * *}; * *return LOOP_CONTINUE; };
// Завершение состояния func void ZS_MM_Rtn_Follow_Sheep_Balthasar_End () { };
... и еще файл
// **************************************** // Обработчик поведения вызванного монстра // ****************************************
// Локальное восприятие разговора с ГГ func void B_SummonedAssessTalk() { * *// вызванный монстр умирает (жизнь = 0) * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-self.attribute[ATR_HITPOINTS_MAX]) ; };
// Инициализация состояния func void ZS_MM_Rtn_Summoned() { * *// установить время реакции на восприятия 1 сек * *Npc_SetPercTime(self,1); * *// разрешить восприятие ГГ * *Npc_PercEnable(self,PERC_ASSESSPLAYER,B_MM_Assess Player); * *// разрешить восприятие врага * *Npc_PercEnable(self,PERC_ASSESSENEMY,B_MM_AssessE nemy); * *// разрешить восприятие магии * *Npc_PercEnable(self,PERC_ASSESSMAGIC,B_AssessMagi c); * *// разрешить восприятие повреждения * *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_MM_Assess Damage); * *// разрешить восприятие сражения двух других НПС * *Npc_PercEnable(self,PERC_ASSESSFIGHTSOUND,B_MM_As sessOthersDamage); * *// если вызванный НПС Огонек * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Wisp_Detector)) * *{ * * * *// разрешить восприятие разговора * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessTalk) ; * *} * *else // иначе (если монстр) * *{ * * * *// разрешить локальное восприятие разговора * * * *Npc_PercEnable(self,PERC_ASSESSTALK,B_SummonedAss essTalk); * *}; * *// установить дружеское отношение к ГГ * *B_SetAttitude(self,ATT_FRIENDLY); * *// НПС член партии ГГ * *self.aivar[AIV_PARTYMEMBER] = TRUE; * *// НПС встает * *AI_StandUp(self); * *// режим передвижения - бег * *AI_SetWalkmode(self,NPC_RUN); };
// Цикл состояния func int ZS_MM_Rtn_Summoned_Loop() { * *// Выполнение Огоньком заданий * *B_MM_WispDetect(); * *// если расстояние между НПС и ГГ > 5 метров * *if(Npc_GetDistToNpc (self, hero) > 500) * *{ * * * *// НПС бежит к ГГ * * * *AI_GotoNpc(self,hero); * *} * *else //иначе * *{ * * * *// если прошла секунда * * * *if(Npc_GetStateTime(self) >= 1) * * * *{ * * * * * *// если НПС не видит ГГ * * * * * *if(!Npc_CanSeeNpc(self,hero)) * * * * * *{ * * * * * * * *// НПС поворачивается к ГГ * * * * * * * *AI_TurnToNpc(self,hero); * * * * * *}; * * * * * *// увеличение времени вызова монстра * * * * * *self.aivar[AIV_SummonTime] = (self.aivar[AIV_SummonTime] + Npc_GetStateTime(self)); * * * * * *// если время вызова монстра превысило время жизни * * * * * *if(self.aivar[AIV_SummonTime] >= MONSTER_SUMMON_TIME) * * * * * *{ * * * * * * * *// вызванный монстр умирает (жизнь = 0) * * * * * * * *Npc_ChangeAttribute(self,ATR_HITPOINTS,-self.attribute[ATR_HITPOINTS_MAX]) ; * * * * * *}; * * * * * *// сброс времени состояния * * * * * *Npc_SetStateTime (self, 0); * * * *}; * *}; * *// установить для НПС ближайшую свободную точку * *self.wp = Npc_GetNearestWP(self); * *return LOOP_CONTINUE; };
// Завершение состояния func void ZS_MM_Rtn_Summoned_End() { };
|