Показать сообщение отдельно
Старый 01.05.2005, 21:56   #158
Vam

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

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

// *****************
// Сидеть на скамье
// *****************

// Функция инициализации состояния
func void ZS_Sit_Bench()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// если НПС не сидит
* *if(!C_BodyStateContains(self,BS_SIT))
* *{
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode(self,NPC_WALK); * * *
* * * *// если НПС расположен не на своем вайпоинте
* * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* * * *{
* * * * * *// движение на свой вайпоинт
* * * * * *AI_GotoWP(self,self.wp);
* * * *};
* *}; *
};

// Функция цикла состояния
func int ZS_Sit_Bench_Loop()
{
* *// если НПС не сидит и скамья имеется
* *if(!C_BodyStateContains(self,BS_SIT)) && (Wld_IsMobAvailable(self,"BENCH"))
* *{
* * * *// сесть на скамью
* * * *AI_UseMob(self,"BENCH",1);
* *};
* *// есил НПС сидит и прошло > 5 сек
* *if(C_BodyStateContains(self,BS_SIT)) && (Npc_GetStateTime(self) > 5)
* *{
* * * *var int random;
* * * *random = Hlp_Random(8 );
* * * *// случайная анимация движений на скамье
* * * *if(random <= 0) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_1",BS_SIT); };
* * * *if(random <= 1) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_2",BS_SIT); };
* * * *if(random <= 2) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_3",BS_SIT); };
* * * *if(random <= 3) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_4",BS_SIT); };
* * * *// сброс времени состояния
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Sit_Bench_End()
{
* *// НПС встает со скамьи
* *AI_UseMob(self,"BENCH",-1);
};

... ещё файл

// *******************
// Сидеть у костра
// *******************

// Функция инициализации состояния
func void ZS_Sit_Campfire()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// если НПС не сидит * *
* *if(!C_BodyStateContains(self,BS_SIT))
* *{
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode(self,NPC_WALK);
* * * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций
* * * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX)
* * * *{
* * * * * *// движение на свой вайпоинт
* * * * * *AI_GotoWP(self,self.wp);
* * * *};
* *};
};

// Функция цикла состояния
func int ZS_Sit_Campfire_loop()
{
* *// если НПС на фрипоинте и не сидит
* *if((Npc_IsOnFP(self,"CAMPFIRE")) && (!C_BodyStateContains(self,BS_SIT)))
* *{ *
* * * *// выравнивание
* * * *AI_AlignToFP(self);
* * * *// НПС садиться
* * * *AI_PlayAniBS(self,"T_STAND_2_SIT",BS_SIT);
* *}
* *// если фрипоинт существует, свободен и НПС не сидит
* *else if((Wld_IsFPAvailable(self,"CAMPFIRE")) && (!C_BodyStateContains(self,BS_SIT)))
* *{
* * * *// идти на фрипоинт
* * * *AI_GotoFP(self,"CAMPFIRE");
* * * *// встать
* * * *AI_StandUp(self);
* * * *// выровняться
* * * *AI_AlignToFP(self);
* *}; *
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Sit_Campfire_end()
{
* *// НПС встает
* *AI_PlayAniBS(self,"T_SIT_2_STAND",BS_STAND); * *
};

... ещё файл

// *****************
// Сидеть на стуле
// *****************
// Примечание: полностью аналогична функции "Сидеть на скамье", только используется другой МОВ

func void ZS_Sit_Chair()
{
* *Perception_Set_Normal();
* *B_ResetAll(self);
* *if(!C_BodyStateContains(self,BS_SIT))
* *{
* * * *AI_SetWalkmode(self,NPC_WALK); * * *
* * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* * * *{
* * * * * *AI_GotoWP(self,self.wp);
* * * *};
* *}; *
};

func int ZS_Sit_Chair_Loop()
{
* *if(!C_BodyStateContains(self,BS_SIT)) && (Wld_IsMobAvailable(self,"CHAIR"))
* *{
* * * *AI_UseMob(self,"CHAIR",1);
* *};
* *if(C_BodyStateContains(self,BS_SIT)) && (Npc_GetStateTime(self) > 5)
* *{
* * * *var int random;
* * * *random = Hlp_Random(10);
* * * *if(random <= 0) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_1",BS_SIT); };
* * * *if(random <= 1) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_2",BS_SIT); };
* * * *if(random <= 2) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_3",BS_SIT); };
* * * *if(random <= 3) { AI_PlayAniBS(self,"R_CHAIR_RANDOM_4",BS_SIT); };
* * * *Npc_SetStateTime(self,0);
* *};
* *return LOOP_CONTINUE;
};

func void ZS_Sit_Chair_End()
{
* *AI_UseMob(self,"CHAIR",-1);
};

... ещё файл

// *************************
// Сидеть на троне
// *************************

// Функция инициализации состояния
func void ZS_Sit_Throne()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// если НПС не сидит
* *if(!C_BodyStateContains(self,BS_SIT))
* *{
* * * *// установить режим передвижения шагом
* * * *AI_SetWalkmode(self,NPC_WALK); * * *
* * * *// если НПС расположен не на своем вайпоинте
* * * *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* * * *{
* * * * * *// движение на свой вайпоинт
* * * * * *AI_GotoWP(self, self.wp);
* * * *};
* *};
};

// Функция цикла состояния
func int ZS_Sit_Throne_Loop()
{
* *// если НПС не сидит и трон имеется
* *if(!C_BodyStateContains(self, BS_SIT)) && (Wld_IsMobAvailable(self,"THRONE"))
* *{
* * * *// сесть на трон
* * * *AI_UseMob(self,"THRONE",1);
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Sit_Throne_End()
{
* *// встать с трона
* *AI_UseMob(self,"THRONE",-1);
};

... ещё файл

// *****************
// Спать на кровати
// *****************

// Функция инициализации состояния (идти к кровати)
func void ZS_GotoBed()
{
* *// установить нормальный набор восприятий
* *Perception_Set_Normal();
* *// перевод НПС в исходное состояние
* *B_ResetAll(self);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *// если НПС расположен не на своем вайпоинте
* *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* *{
* * * *// движение на свой вайпоинт
* * * *AI_GotoWP(self,self.wp);
* *};
* *// переход с состояние спать
* *AI_StartState(self,ZS_Sleep,0,"");
};

// Локальное восприятие разговора
func void B_AssessSleepTalk()
{
* *// если НПС лежит
* *if(C_BodyStateContains(self,BS_LIE))
* *{
* * * *// прекратить лежать
* * * *AI_UseMob(self,"BEDHIGH",-1);
* *};
* *// перейти в состояние наблюдения за ГГ
* *AI_StartState(self,ZS_ObservePlayer,0,"");
};

// Функция инициализации состояния
func void ZS_Sleep()
{
* *// разрешить восприятие тихих звуков
* *Npc_PercEnable(self,PERC_ASSESSQUIETSOUND,B_Asses sQuietSound);
* *// разрешить восприятие повреждений
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *// локальное восприятие разговора
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessSleep Talk);
* *// установить режим передвижения шагом
* *AI_SetWalkmode(self,NPC_WALK);
};
* * * *
// Функция цикла состояния
func int ZS_Sleep_Loop() * *
{
* *// если НПС не лежит
* *if(!C_BodyStateContains(self,BS_LIE))
* *{
* * * *// если кровать имеется и свободна
* * * *if(Wld_IsMobAvailable(self,"BEDHIGH"))
* * * *{
* * * * * *// лечь спать
* * * * * *AI_UseMob(self,"BEDHIGH",1);
* * * *}
* * * *else
* * * *{
* * * * * *// если комментария, что ГГ лежит на чужой кровати не было и ГГ лежит и расстояние между НПС и ГГ <= 5 м
* * * * * *if(Player_GetOutOfMyBedComment == FALSE) && (C_BodyStateContains(hero,BS_LIE)) && (Npc_GetDistToNpc(self,hero) <= 500)
* * * * * *{
* * * * * * * *// НПС поворачивается к ГГ
* * * * * * * *B_TurnToNpc(self,hero);
* * * * * * * *// произносит ГГ SVM фразу "Вон с моей кровати!"
* * * * * * * *B_Say(self,other,"$GETOUTOFMYBED");
* * * * * * * *// установить флаг состоявшегося комментария
* * * * * * * *Player_GetOutOfMyBedComment = TRUE;
* * * * * *};
* * * *};
* *};
* *return LOOP_CONTINUE;
};

// Функция завершения состояния
func void ZS_Sleep_End()
{
* *// если НПС находится в помещении вместе с ГГ
* *if(!Npc_IsInPlayersRoom(self))
* *{
* * * *// НПС зевает
* * * *B_Say(self,self,"$AWAKE");
* *};
* *// встает с кровати
* *AI_UseMob(self,"BEDHIGH",-1);
};

... ещё файл

// ******************************
// Очень крепко спать на кровати
// ******************************
// Примечание: от предыдущего обработчика отличается только тем, что у НПС закрыто восприятие тихих звуков.
// В скриптах не используется, может быть удален с коррекцией файла TA.d

func void ZS_GotoBed_Deep()
{
* *Perception_Set_Normal();
* *B_ResetAll(self);
* *AI_SetWalkmode(self,NPC_WALK); * * *
* *if(Hlp_StrCmp(Npc_GetNearestWP(self),self.wp) == FALSE)
* *{
* * * *AI_GotoWP(self,self.wp);
* *};
* *AI_StartState(self,ZS_Sleep_Deep,0,"");
};

func void ZS_Sleep_Deep()
{
* *Npc_PercEnable(self,PERC_ASSESSDAMAGE,B_AssessDam age);
* *Npc_PercEnable(self,PERC_ASSESSTALK,B_AssessSleep Talk);
* *AI_SetWalkmode(self,NPC_WALK);
};
* * * *
func int ZS_Sleep_Deep_Loop() *
{
* *if(!C_BodyStateContains(self,BS_LIE))
* *{
* * * *if(Wld_IsMobAvailable(self,"BEDHIGH"))
* * * *{
* * * * * *AI_UseMob(self,"BEDHIGH",1);
* * * *}
* * * *else
* * * *{
* * * * * *if(Player_GetOutOfMyBedComment == FALSE) && (C_BodyStateContains(hero,BS_LIE)) && (Npc_GetDistToNpc(self,hero) <= 500)
* * * * * *{
* * * * * * * *B_TurnToNpc(self,hero);
* * * * * * * *B_Say(self,other,"$GETOUTOFMYBED");
* * * * * * * *Player_GetOutOfMyBedComment = TRUE;
* * * * * *};
* * * *};
* *};
* *return LOOP_CONTINUE;
};

func void ZS_Sleep_Deep_End()
{
* *if(!Npc_IsInPlayersRoom(self))
* *{
* * * *B_Say(self,self,"$AWAKE");
* *};
* *AI_UseMob(self,"BEDHIGH",-1);
};

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