|
Re: Уроки скриптологии
18. Разные AI функции.
// *********************************************** // Функция обновления снаряжения при респавне НПС // ----------------------------------------------- // Вызывается только экзешником // ***********************************************
// ----------------------------------------------- // self - возрождаемый НПС // -----------------------------------------------
func void B_RefreshAtInsert() { * *// если НПС мертв * *if(self.attribute[ATR_HITPOINTS] <= 0) * *{ * * * *return; * *}; * *var C_NPC her; * *// получить ссылку на ГГ * *her = Hlp_GetNpc(PC_Hero); * *// если НПС человек и НПС не ГГ * *if(self.guild < GIL_SEPERATOR_HUM) && (Hlp_GetInstanceID(self) != Hlp_GetInstanceID(her)) * *{ * * * *// установить текущую жизнь равной максимальной * * * *self.attribute[ATR_HITPOINTS] = self.attribute[ATR_HITPOINTS_MAX]; * * * *// если НПС не имеет никакого оружия * * * *if(Npc_HasEquippedWeapon(self) == FALSE) * * * *{ * * * * * *// если НПС милиционер * * * * * *if(self.guild == GIL_MIL) * * * * * * *{ * * * * * * * *// создать в инвентаре Тяжелую палку * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1); * * * * * *}; * * * * * *// если НПС паладин * * * * * *if(self.guild == GIL_PAL) * * * * * * *{ * * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1); * * * * * *}; * * * * * *// если НПС наемник * * * * * *if(self.guild == GIL_SLD) * * * * * * *{ * * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1); * * * * * *}; * * * * * *// если НПС крестьянин * * * * * *if(self.guild == GIL_BAU) * * * * * *{ * * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1); * * * * * *}; * * * * * *// если НПС маг послушник * * * * * *if(self.guild == GIL_NOV) * * * * * *{ * * * * * * * * *CreateInvItems(self,ItMw_1h_Bau_Mace,1); * * * * * *}; * * * *}; * *}; };
Эта функция расположена в директории ..\AI\AI_Intern в одноименном файле. ------------------------------------------------------------
// ************************************************** ********* // Функция реплик НПС при обыскивании тел, когда нечего взять // ----------------------------------------------------------- // Вызывается только экзешником // ************************************************** *********
// ----------------------------------------------- // self - обыскивающий НПС // -----------------------------------------------
func void PLAYER_PLUNDER_IS_EMPTY() { * *var int rnd; * *rnd = Hlp_Random(100); * *// с вероятностью 0.4 * *if(rnd <= 40) * *{ * * * * *// напечатать текст по цетру экрана "здесь ничего нет..." * * * *Print(PRINT_NOTHINGTOGET); * * * *// произносится SVM фраза "Здесь нечего унести ..." * * * *B_Say_Overlay(self,self,"$NOTHINGTOGET"); * * *} * *// с вероятностью 0.4 * *else if(rnd <= 80) * *{ * * * * *// напечатать текст по цетру экрана "Нечего унести..." * * * *Print(PRINT_NOTHINGTOGET02); * * * *// произносится SVM фраза "нечего унести ..." * * * *B_Say_Overlay(self,self,"$NOTHINGTOGET02"); * *} * *// с вероятностью 0.2 * *else if(rnd <= 99) * *{ * * * * *// напечатать текст по цетру экрана "Нечего грабить..." * * * *Print(PRINT_NOTHINGTOGET03); * * * *// произносится SVM фраза "нечего украсть ..." * * * *B_Say_Overlay(self,self,"$NOTHINGTOGET03"); * *}; };
Эта функция расположена в директории ..\AI\AI_Intern в одноименном файле. ------------------------------------------------------------
//************************************************** ************ ***** // Функция обновления доспехов НПС // ------------------------------------------------------------------- // Вызывается только экзешником (пока пуста) // ************************************************** *****************
func void B_RefreshArmor() { };
Эта функция расположена в директории ..\AI\Human в одноименном файле. ------------------------------------------------------------
B_ функции монстров расположены в директории ..\AI\Monster\B_Monster
// *********************************** // Функция задержки реакции монстров // ***********************************
func void B_MM_DeSynchronize() { * *var int msec; * *msec = Hlp_Random(1000); * *// случайная задержка от 0 до 1 сек * *AI_Waitms(self,msec); };
... ещё файл
// ******************************************* // Выполнение Огоньком заданий // *******************************************
// ---------------------------------------------------- // self - Огонек // item - предмет // ----------------------------------------------------
// Реакция Огонька на найденный предмет func void B_GetWispDetectedItem() { * *// если предмет не существует * *if(!Hlp_IsValidItem(item)) * *{ * * * *return; * *}; * *// если расстояние между Огоньком и предметом > 5м * *if(Npc_GetHeightToItem(self,item) > 500) * *{ * * * *return; * *}; * *var int randy; * *randy = Hlp_Random(100); * *// Огонек движется к предмету * *AI_GotoItem(self,item); * *// если расстояние между Огоньком и предметом < 1м и вероятность <= 0.01 * *if(Npc_GetDistToItem(self,item) < 1000) && (randy <= 1) * *{ * * * *// проигрывается анимация выкапывания предмета * * * *Wld_PlayEffect("spellFX_ItemAusbuddeln",item,item ,0,0,0,FALSE ); * *}; };
// Поиск Огоньком предметов //---------------------------------------------------------------- // Возвращаемое значение: что нашел Огонек (в принципе не нужно) func int B_WispDetectedItem() { * * *// если Огонек ничего не ищет * *if(WispSearching == WispSearch_Follow) * *{ * *} * *else // иначе (режим поиска) * *{ * * * *var int WispSearchFlags; * * * *// флаг поиска * * * *WispSearchFlags = 0; * * * *// если Огонек обучен искать оружие ближнего радиуса поражения и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_NF] == TRUE) * * * *// (режим поиска - искать всё или оружие ближнего радиуса поражения) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_NF))) * * * *{ * * * * * *// установить соответствующий флаг * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_NF; * * * *}; * * * *// если Огонек обучен искать оружие дальнего радиуса поражения и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_FF] == TRUE) * * * *// (режим поиска - искать всё или оружие дальнего радиуса поражения) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_FF))) * * * *{ * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_FF ¦ ITEM_KAT_MUN; * * * *}; * * * *// если Огонек обучен искать деньги, ключи, предметы обихода и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_NONE] == TRUE) * * * *// (режим поиска - искать всё или указанные вещи) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_NONE))) * * * *{ * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_NONE ¦ ITEM_KAT_KEYS ¦ ITEM_KAT_LIGHT ¦ ITEM_KAT_ARMOR; * * * *}; * * * *// если Огонек обучен искать руны и свитки и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_RUNE] == TRUE) * * * *// (режим поиска - искать всё или указанные вещи) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_RUNE))) * * * *{ * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_RUNE ¦ ITEM_KAT_DOCS; * * * *}; * * * *// если Огонек обучен искать кольца и амулеты и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_MAGIC] == TRUE) * * * *// (режим поиска - искать всё или указанные вещи) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_MAGIC))) * * * *{ * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_MAGIC; * * * *}; * * * *// если Огонек обучен искать пропитание и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_FOOD] == TRUE) * * * *// (режим поиска - искать всё или указанные вещи) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_FOOD))) * * * *{ * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_FOOD; * * * *}; * * * *// если Огонек обучен искать напитки и * * * *if ((PLAYER_TALENT_WISPDETECTOR[WISPSKILL_POTIONS] == TRUE) * * * *// (режим поиска - искать всё или указанные вещи) * * * *&& ((WispSearching == WispSearch_ALL) ¦¦ (WispSearching == WispSearch_POTIONS))) * * * *{ * * * * * *WispSearchFlags = WispSearchFlags ¦ ITEM_KAT_POTIONS; * * * *}; * * * *// если Огонек способен что-то найти * * * *if(WispSearchFlags != 0) * * * *{ * * * * * *// если найден предмет с указанными флагами * * * * * *if(Wld_DetectItem(self,WispSearchFlags)) * * * * * *{ * * * * * * * *// реакция Огонька на найденный предмет * * * * * * * *B_GetWispDetectedItem(); * * * * * *}; * * * *}; * * * *return WispSearchFlags; * *}; * *return 0; };
// Выполнение Огоньком заданий func int B_MM_WispDetect() { * *// если self (вызванный монстр) есть Огонек * *if(Hlp_GetInstanceID(self) == Hlp_GetInstanceID(Wisp_Detector)) * *{ * * * *// разрешить Огоньку воспринимать все объекты в зоне действия восприятия * * * *Npc_PerceiveAll(self); * * * *// если найден другой Огонек (other инициализирован Огоньком) * * * *if(Wld_DetectNpc(self,Wisp_Detector,NOFUNC,-1) * * * *{ * * * * * *// удалить Огонек * * * * * *B_RemoveNpc(self); * * * *}; * * * *// если расстояние между Огоньком и ГГ меньше 20м и установлен флаг близости * * * *if(Npc_GetDistToNpc(self,hero) < 2000) && (self.aivar[AIV_TAPOSITION] == ISINPOS) * * * *{ * * * * * *// сброс времени жизни монстра * * * * * *self.aivar[AIV_SummonTime] = 0; * * * * * *// выполнение поиска Огоньком * * * * * *B_WispDetectedItem(); * * * * * *return LOOP_END; * * * *} * * * *else * * * *{ * * * * * *// если расстояние между Огоньком и ГГ меньше 5м * * * * * *if(Npc_GetDistToNpc(self,hero) < 500) * * * * * *{ * * * * * * * *// установить флаг близости * * * * * * * *self.aivar[AIV_TAPOSITION] = ISINPOS; * * * * * *} * * * * * *else * * * * * *{ * * * * * * * *// установить флаг удаленности * * * * * * * *self.aivar[AIV_TAPOSITION] = NOTINPOS; * * * * * * * *// очистка очереди AI состояний Огонька * * * * * * * *Npc_ClearAIQueue(self); * * * * * * * *// Огонек движется к ГГ * * * * * * * *AI_GotoNpc(self,hero); * * * * * *}; * * * * * *return LOOP_END; * * * *}; * *}; * *return LOOP_CONTINUE; };
|