|
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); };
|