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

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

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

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