|
Re: Уроки скриптологии
// **************** // Чтение книг // ****************
// Функция инициализации состояния func void ZS_Read_Bookstand() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Read_Bookstand_Loop() { * *// если действие с МОВом не прерываемо и подставка с кникой имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BOOK")) * *{ * * * *// читать книгу * * * *AI_UseMob(self,"BOOK",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Read_Bookstand_End() { * *// прекратить чтение * *AI_UseMob(self,"BOOK",-1); };
... ещё файл
// **************** // Ремонт хижины // ****************
// Функция инициализации состояния func void ZS_Repair_Hut() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Repair_Hut_Loop() { * *// если действие с МОВом не прерываемо и хижина имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"REPAIR")) * *{ * * * *// ремонт * * * *AI_UseMob(self,"REPAIR",1); * *}; * *// если прошло > 5 сек и и действие прерываемо * *if(Npc_GetStateTime(self) > 5) && (C_BodyStateContains(self,BS_MOBINTERACT_INTERRUPT )) * *{ * * * *var int zufall; * * * *zufall = Hlp_Random(100); * * * *// с вероятностью 0.5 * * * *if(zufall < 50) * * * *{ * * * * * *// изменение анимации * * * * * *AI_PlayAniBS(self,"T_REPAIR_RANDOM_1",BS_MOBINTER ACT_INTERRUPT); * * * *}; * * * *// сброс времени состояния * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Repair_Hut_End() { * *// прекратить ремонт * *AI_UseMob(self,"REPAIR",-1); };
... ещё файл
// ************************ // Барбекю из Падальщика // ************************
// Функция инициализации состояния func void ZS_Roast_Scavenger() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Roast_Scavenger_Loop() { * *// если действие с МОВом не прерываемо и вертел имеется * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BARBQ")) * *{ * * * *// жарим мясо * * * *AI_UseMob(self,"BARBQ",1); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Roast_Scavenger_End() { * *// прекратить жарку * *AI_UseMob(self,"BARBQ",-1); };
... ещё файл
// ************************************ // НПС бежит на охраняемую точку // ************************************
// Функция инициализации состояния func void ZS_RunToWP() { * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения бегом * *AI_SetWalkmode(self,NPC_RUN); * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; * *// выравнивание * *AI_AlignToWP(self); * *// встать в положение охраны * *AI_PlayAni(self,"T_STAND_2_HGUARD"); };
// Функция цикла состояния func int ZS_RunToWP_Loop() { * * *// если время состояния > 5 сек * *if(Npc_GetStateTime(self) > 5) * *{ * * * *var int random; * * * *random = Hlp_Random(2); * * * *// с вероятностью 0.5 * * * *if(random == 0) * * * *{ * * * * * *// осмотр окрестностей * * * * * *AI_PlayAni(self,"T_HGUARD_LOOKAROUND"); * * * *}; * * * *// сброс времени состояния * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; }; * * // Функция завершения состояния func int ZS_RunToWP_End() { * };
... ещё файл
// **************************** // Распиловка древесины // ****************************
// Функция инициализации состояния func void ZS_Saw() { * *// установить нормальный набор восприятий * *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); * *}; };
// Функция цикла состояния func int ZS_Saw_Loop() { * *// если действие с МОВом не прерываемо и козлы с кряжем имеются * *if(!C_BodyStateContains(self,BS_MOBINTERACT_INTER RUPT)) && (Wld_IsMobAvailable(self,"BAUMSAEGE")) * *{ * * * *// пилим кряж * * * *AI_UseMob(self,"BAUMSAEGE",1); * *}; * *// если прошло > 15 сек и и действие прерываемо * *if(Npc_GetStateTime(self) > 15) && (C_BodyStateContains(self,BS_MOBINTERACT_INTERRUPT )) * *{ * * * *// сброс времени состояния * * * *Npc_SetStateTime(self,0); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Saw_End() { * *// прекратить пиление * *AI_UseMob(self,"BAUMSAEGE",-1); };
... ещё файл
// *********************** // Мини диалог между НПС // *********************** // other - ближайший НПС
const int SmallTalkFreq = 4; * *// периодичность разговора в сек
// Функция инициализации состояния func void ZS_Smalltalk() { * *// установить нормальный набор восприятий * *Perception_Set_Normal(); * *// перевод НПС в исходное состояние * *B_ResetAll(self); * *// установить режим передвижения шагом * *AI_SetWalkmode(self,NPC_WALK); * *// если расстояние между НПС и его вайпоинтом > дистанции выполнения функций * *if(Npc_GetDistToWP(self,self.wp) > TA_DIST_SELFWP_MAX) * *{ * * * *// движение на свой вайпоинт * * * *AI_GotoWP(self,self.wp); * *}; };
// Функция цикла состояния func int ZS_Smalltalk_Loop() { * *// если НПС на фрипоинте * *if(Npc_IsOnFP(self,"SMALLTALK")) * *{ * * * * *// если время состояния >= периодичности разговора * 2 * * * *if(Npc_GetStateTime(self) >= (SmallTalkFreq * 2)) * * * *{ * * * * * *// НПС разрешено воспринимать все объекты в зоне действия восприятия * * * * * *Npc_PerceiveAll(self); * * * * * *// если собеседник найден (другой НПС, находящийся в состоянии мини диалога (инициализация other)) * * * * * *if(Wld_DetectNpc(self,-1,ZS_Smalltalk,-1)) * * * * * *{ * * * * * * * *// если расстояние между НПС < дистанции начала диалога * * * * * * * *if(Npc_GetDistToNpc(self,other) < PERC_DIST_DIALOG) * * * * * * * *{ * * * * * * * * * *// установить собеседнику время диалога * * * * * * * * * *Npc_SetStateTime(other,SmallTalkFreq); * * * * * * * * * *// НПС поворачивается к собеседнику * * * * * * * * * *B_TurnToNpc(self,other); * * * * * * * * * *// сам диалог * * * * * * * * * *B_Say_Smalltalk(); * * * * * * * *}; * * * * * *}; * * * * * *// сброс времени состояния * * * * * *Npc_SetStateTime(self,0); * * * *}; * *} * *// если фрипоинт существует и свободен * *else if(Wld_IsFPAvailable(self,"SMALLTALK")) * *{ * * * *// идти на фрипоинт * * * *AI_GotoFP(self,"SMALLTALK"); * * * *// встать * * * *AI_StandUp(self); * * * *// выравняться * * * *AI_AlignToFP(self); * *}; * *return LOOP_CONTINUE; };
// Функция завершения состояния func void ZS_Smalltalk_End() { };
|