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

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

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

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